From f189a5e8f36dc5f1a459a2b5aeaf916476891e71 Mon Sep 17 00:00:00 2001 From: sujith-rek Date: Wed, 14 Jun 2023 10:24:24 +0530 Subject: [PATCH 1/3] feat: custom output size for brython element --- runestone/activecode/activecode.py | 11 +++++++++-- runestone/activecode/js/acfactory.js | 1 + runestone/activecode/js/activecode.js | 1 + runestone/activecode/js/activecode_brython.js | 8 +++++++- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/runestone/activecode/activecode.py b/runestone/activecode/activecode.py index e5432ac2c..4504cf7b0 100644 --- a/runestone/activecode/activecode.py +++ b/runestone/activecode/activecode.py @@ -71,7 +71,7 @@ def setup(app): %(hidecode)s %(include)s %(timelimit)s %(coach)s %(codelens)s %(enabledownload)s %(chatcodes)s %(optional)s data-audio='%(ctext)s' %(sourcefile)s %(datafile)s %(stdin)s %(tie)s %(dburl)s %(nopair)s %(cargs)s %(largs)s %(rargs)s %(iargs)s %(gradebutton)s %(caption)s %(hidehistory)s %(wasmuri)s - %(showlastsql)s %(python3_interpreter)s style="visibility: hidden;"> + %(showlastsql)s %(python3_interpreter)s %(output_height)s style="visibility: hidden;"> %(initialcode)s @@ -163,6 +163,7 @@ class ActiveCode(RunestoneIdDirective): :dburl: url to load database for sql mode :showlastsql: -- Only show the last sql result in output :python3_interpreter: brython (uses brython as interpreter of python3) + :output_height: 200px If this is a homework problem instead of an example in the text then the assignment text should go here. The assignment text ends with @@ -218,7 +219,8 @@ class ActiveCode(RunestoneIdDirective): "nopair": directives.flag, "dburl": directives.unchanged, "showlastsql": directives.flag, - "python3_interpreter": directives.unchanged + "python3_interpreter": directives.unchanged, + "output_height": directives.unchanged, } ) @@ -273,6 +275,11 @@ def run(self): else: self.options["python3_interpreter"] = "" + if ("output_height" in self.options) : + self.options["output_height"] = "data-output_height='%s'" % self.options["output_height"] + else: + self.options["output_height"] = "" + if "caption" not in self.options: self.options["caption"] = "" else: diff --git a/runestone/activecode/js/acfactory.js b/runestone/activecode/js/acfactory.js index 0911fe7e2..5af4ba451 100644 --- a/runestone/activecode/js/acfactory.js +++ b/runestone/activecode/js/acfactory.js @@ -34,6 +34,7 @@ export default class ACFactory { } var text_area = $(opts.orig).find("textarea")[0] var python3_interpreter = $(text_area).attr("data-python3_interpreter"); + var output_height = $(text_area).attr("data-output_height"); if (opts.timed == true) { if(python3_interpreter==="brython"){ return new TimedBrythonActiveCode(opts); diff --git a/runestone/activecode/js/activecode.js b/runestone/activecode/js/activecode.js index 1f04c3eb8..33d8ba5d8 100755 --- a/runestone/activecode/js/activecode.js +++ b/runestone/activecode/js/activecode.js @@ -67,6 +67,7 @@ export class ActiveCode extends RunestoneBase { this.tie = $(orig).data("tie"); this.dburl = $(orig).data("dburl"); this.python3_interpreter = $(orig).data("python3_interpreter"); + this.output_height = $(orig).data("output_height"); this.runButton = null; this.enabledownload = $(orig).data("enabledownload"); this.downloadButton = null; diff --git a/runestone/activecode/js/activecode_brython.js b/runestone/activecode/js/activecode_brython.js index 6e4a4a57c..7c2a40cbe 100644 --- a/runestone/activecode/js/activecode_brython.js +++ b/runestone/activecode/js/activecode_brython.js @@ -5,6 +5,7 @@ export default class BrythonActiveCode extends ActiveCode { super(opts); opts.alignVertical = true; this.python3_interpreter = $(orig).data("python3_interpreter"); + this.output_height = $(orig).data("output_height"); $(this.runButton).text("Render"); this.editor.setValue(this.code); } @@ -119,11 +120,16 @@ document <= html.SCRIPT("let container = document.querySelector('.container-pre' } else { $(outDiv).addClass("col-md-5"); } + + if (this.output_height == undefined) { + this.output_height = "400px"; + } + this.outDiv = outDiv; this.output = document.createElement("iframe"); $(this.output).css("background-color", "white"); $(this.output).css("position", "relative"); - $(this.output).css("height", "400px"); + $(this.output).css("height", $(this.output_height)); $(this.output).css("width", "100%"); outDiv.appendChild(this.output); this.outerDiv.appendChild(outDiv); From 990de66a9ec22c06ca16ce98eef6d4d6d09dc8d4 Mon Sep 17 00:00:00 2001 From: sujith-rek Date: Wed, 14 Jun 2023 10:25:03 +0530 Subject: [PATCH 2/3] feat: custom output size build --- ...e_-runestone_activecode_js_acfactory_js.bundle.js | 12 ++++++++++-- runestone/dist/runtime.bundle.js | 4 ++-- runestone/dist/webpack_static_imports.json | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js b/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js index e9c1d2c6d..97c36ead2 100644 --- a/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js +++ b/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js @@ -375,6 +375,7 @@ class ACFactory { } var text_area = $(opts.orig).find("textarea")[0] var python3_interpreter = $(text_area).attr("data-python3_interpreter"); + var output_height = $(text_area).attr("data-output_height"); if (opts.timed == true) { if(python3_interpreter==="brython"){ return new _timed_activecode__WEBPACK_IMPORTED_MODULE_6__.TimedBrythonActiveCode(opts); @@ -965,6 +966,7 @@ class ActiveCode extends _common_js_runestonebase_js__WEBPACK_IMPORTED_MODULE_0_ this.tie = $(orig).data("tie"); this.dburl = $(orig).data("dburl"); this.python3_interpreter = $(orig).data("python3_interpreter"); + this.output_height = $(orig).data("output_height"); this.runButton = null; this.enabledownload = $(orig).data("enabledownload"); this.downloadButton = null; @@ -2359,6 +2361,7 @@ class BrythonActiveCode extends _activecode_js__WEBPACK_IMPORTED_MODULE_0__.Acti super(opts); opts.alignVertical = true; this.python3_interpreter = $(orig).data("python3_interpreter"); + this.output_height = $(orig).data("output_height"); $(this.runButton).text("Render"); this.editor.setValue(this.code); } @@ -2473,11 +2476,16 @@ document <= html.SCRIPT("let container = document.querySelector('.container-pre' } else { $(outDiv).addClass("col-md-5"); } + + if (this.output_height == undefined) { + this.output_height = "400px"; + } + this.outDiv = outDiv; this.output = document.createElement("iframe"); $(this.output).css("background-color", "white"); $(this.output).css("position", "relative"); - $(this.output).css("height", "400px"); + $(this.output).css("height", $(this.output_height)); $(this.output).css("width", "100%"); outDiv.appendChild(this.output); this.outerDiv.appendChild(outDiv); @@ -6034,4 +6042,4 @@ jQuery.fn.removeHighlight = function() { /***/ }) }]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvY3NzL2FjdGl2ZWNvZGUuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvL2hvbWUvcmVrL1J1bmVzdG9uZUNvbXBvbmVudHMvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGV8c3luY3wvXlxcLlxcLy4qJC8iLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2Nzcy9hY3RpdmVjb2RlLmNzcz8xZDExIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY2ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGUtaTE4bi5lbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS1pMThuLnB0LWJyLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlLWkxOG4uc3ItQ3lybC5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZV9icnl0aG9uLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlX2h0bWwuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfanMuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfc3FsLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hdWRpb3RvdXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2V4dHJhY3RVbml0UmVzdWx0cy5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvbGl2ZWNvZGUuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL21kNS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0LXN0ZGxpYi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0Lm1pbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvdGltZWRfYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnkuaGlnaGxpZ2h0LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8Y3J5cHRvIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8ZnMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy9pZ25vcmVkfC9ob21lL3Jlay9SdW5lc3RvbmVDb21wb25lbnRzL25vZGVfbW9kdWxlcy9zcWwuanMvZGlzdHxwYXRoIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfGZzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfG5vZGUtZmV0Y2giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUM0SDtBQUM3QjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0EsMERBQTBELG9CQUFvQix3QkFBd0IsdUJBQXVCLG1CQUFtQixvQkFBb0IsNkJBQTZCLHNDQUFzQywyQ0FBMkMsOENBQThDLDBCQUEwQiwrQkFBK0Isa0NBQWtDLDBCQUEwQixrQkFBa0IsR0FBRyxzQkFBc0Isb0JBQW9CLHlCQUF5QixhQUFhLGNBQWMsa0JBQWtCLGtCQUFrQix1QkFBdUIsR0FBRywwQkFBMEIsb0JBQW9CLHlCQUF5QixtQkFBbUIsa0JBQWtCLDJDQUEyQyxrQkFBa0IsbUJBQW1CLEdBQUcsaUJBQWlCLHlCQUF5QixHQUFHLGFBQWEsdUJBQXVCLDRCQUE0Qix5QkFBeUIsaUJBQWlCLG1CQUFtQixpQkFBaUIsZ0JBQWdCLEdBQUcsaUJBQWlCLHlCQUF5Qix5QkFBeUIsd0JBQXdCLHVCQUF1QixrQkFBa0IsR0FBRyxzQ0FBc0MsdUJBQXVCLHdCQUF3Qix5QkFBeUIseUJBQXlCLEdBQUcsMkJBQTJCLHdCQUF3QixHQUFHLGdCQUFnQixvQkFBb0IsdUJBQXVCLGdDQUFnQyxHQUFHLGtCQUFrQixrQ0FBa0MsR0FBRyxpQkFBaUIseUJBQXlCLHdCQUF3QixHQUFHLHNCQUFzQiwwQkFBMEIsR0FBRyxrQkFBa0IsMkNBQTJDLHlCQUF5Qix3QkFBd0Isa0JBQWtCLEdBQUcsaUJBQWlCLGdDQUFnQyx5QkFBeUIsc0JBQXNCLHdCQUF3QixxQkFBcUIsR0FBRyx3QkFBd0IsOEJBQThCLEdBQUcsOEJBQThCLGlDQUFpQyxHQUFHLG9CQUFvQixpQ0FBaUMsR0FBRyxrQkFBa0IsMkJBQTJCLEdB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7Ozs7O0FDOU5EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdKQUF3SjtBQUN4SjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7QUNySEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEhBQThIO0FBQzlIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7OztBQ3JIRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFZ0Q7QUFDdEI7QUFDTjtBQUNHO0FBQ0U7QUFDRjtBQUNNO0FBQ047QUFDWTtBQUNaO0FBQ2M7QUFDZDtBQUNJO0FBQ0U7QUFDVDtBQUNNO0FBQ2Q7QUFDRztBQUM1QjtBQUMrQjtBQUMvQjtBQUNBLG1CQUFtQixnREFBSzs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNPLHlCQUF5QixnRUFBYTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsV0FBVztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0IsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxxQkFBcUIsaURBQVU7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLGFBQWE7QUFDYixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsOENBQThDLEVBQUU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtEQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLG1CQUFtQjtBQUNqRSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixXQUFXO0FBQ3hDO0FBQ0E7QUFDQSx3QkFBd0IsV0FBVztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxPQUFPLEtBQUssUUFBUSxNQUFNLE1BQU07QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLEdBQUcsS0FBSyxRQUFRLE1BQU0sTUFBTTtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixXQUFXO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkdBQTJHO0FBQzNHO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixPQUFPLEdBQUcsUUFBUTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxrRkFBa0YsWUFBWTtBQUM5RjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSxt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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixhQUFhO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVCQUF1QixtQkFBbUI7QUFDMUM7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sNkVBQTZFLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLGdTQUFnUyxNQUFNLEtBQUssTUFBTSx3TEFBd0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTTtBQUNwOUIscUJBQXFCLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLHVFQUF1RSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0saUNBQWlDLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxpSUFBaUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTTtBQUN4akMsNHFEQUE0cUQsTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUss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QUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEJBQTRCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7Ozs7Ozs7OztBQ3BEQSxlOzs7Ozs7Ozs7O0FDQUEsZTs7Ozs7Ozs7OztBQ0FBLGU7Ozs7Ozs7Ozs7QUNBQSxlOzs7Ozs7Ozs7O0FDQUEsZSIsImZpbGUiOiJub2RlX21vZHVsZXNfbW9tZW50X2xvY2FsZV9zeW5jX3JlY3Vyc2l2ZV8tcnVuZXN0b25lX2FjdGl2ZWNvZGVfanNfYWNmYWN0b3J5X2pzLmJ1bmRsZS5qcz92PTUzYTE5MTE5ZjBjNjgzZWM5ZWRkIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIubW9kYWwtcHJvZmlsZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIG1pbi1oZWlnaHQ6IDMwMHB4O1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICB3aWR0aDogNzAwcHg7XFxuICAgIHBhZGRpbmc6IDI1cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7XFxuICAgIGJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIC1tb3otYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgYmFja2dyb3VuZDogI2YyZjJmMjtcXG4gICAgei1pbmRleDogNTA7XFxufVxcblxcbi5tb2RhbC1saWdodHNvdXQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIHotaW5kZXg6IDI1O1xcbiAgICBiYWNrZ3JvdW5kOiAjMDAwO1xcbn1cXG5cXG4ubW9kYWwtY2xvc2UtcHJvZmlsZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaGVpZ2h0OiA0M3B4O1xcbiAgICB3aWR0aDogNDNweDtcXG4gICAgLypiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2Nsb3NlLnBuZycpOyAqL1xcbiAgICB0b3A6IDFweDtcXG4gICAgcmlnaHQ6IDAuNXB4O1xcbn1cXG5cXG4uYWNfYWN0aW9ucyB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuLmFjX3NlcCB7XFxuICAgIGJhY2tncm91bmQ6ICMwMDA7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgbWFyZ2luOiAtMTVweCAxMHB4O1xcbiAgICB3aWR0aDogMXB4O1xcbiAgICBoZWlnaHQ6IDM1cHg7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJvcmRlcjogMDtcXG59XFxuXFxuLmFjX3NlY3Rpb24ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1heC13aWR0aDogODAwcHg7XFxuICAgIGNsZWFyOiBib3RoO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiA+ICo6bm90KC5hY19zZWN0aW9uKSB7XFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLmFjX3NlY3Rpb24gLmNsZWFyZml4IHtcXG4gICAgcG9zaXRpb246IGluaXRpYWw7XFxufVxcblxcbi5hY19vdXRwdXQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBtYXgtd2lkdGg6IDQ1MHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbn1cXG4uYWNfb3V0cHV0IHByZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTtcXG59XFxuXFxuLmFjX2NhcHRpb24ge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG5cXG4uYWNfY2FwdGlvbl90ZXh0IHtcXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG59XFxuXFxuLmFjX3F1ZXN0aW9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyNCwgMjM2LCAyMTcpO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XFxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xcbiAgICBtYXJnaW46IDVweDtcXG59XFxuXFxuLmFjdGl2ZV9vdXQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkY2RjO1xcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxuICAgIG1pbi13aWR0aDogMjBlbTtcXG4gICAgbWF4LWhlaWdodDogMzAwcHg7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG4udmlzaWJsZS1hYy1jYW52YXMge1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCBibGFjaztcXG59XFxuXFxuLmFjX3NlY3Rpb24gPiAuY29sLW1kLTEyIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5mdWxsX3dpZHRoIG9sIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hYy1kaXNhYmxlZCB7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG5cXG4uYWMtZmVlZGJhY2sge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcXG4gICAgcGFkZGluZzogM3B4O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JleTtcXG4gICAgcGFkZGluZzogMTBweDtcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdF9zdWNjZXNzIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiBncmVlbjtcXG4gICAgYm9yZGVyOiAwcHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0X2ZhaWx1cmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgY29sb3I6IHJlZDtcXG4gICAgYm9yZGVyOiAwcHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2Nzcy9hY3RpdmVjb2RlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGFBQWE7SUFDYixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLCtCQUErQjtJQUMvQixvQ0FBb0M7SUFDcEMsdUNBQXVDO0lBQ3ZDLG1CQUFtQjtJQUNuQix3QkFBd0I7SUFDeEIsMkJBQTJCO0lBQzNCLG1CQUFtQjtJQUNuQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLE1BQU07SUFDTixPQUFPO0lBQ1AsV0FBVztJQUNYLFdBQVc7SUFDWCxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixXQUFXO0lBQ1gsdUNBQXVDO0lBQ3ZDLFFBQVE7SUFDUixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFlBQVk7SUFDWixVQUFVO0lBQ1YsU0FBUztBQUNiOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIseUJBQXlCO0FBQzdCO0FBQ0E7SUFDSSwyQkFBMkI7QUFDL0I7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsV0FBVztBQUNmOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSx1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSx1QkFBdUI7SUFDdkIsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLDJCQUEyQjtJQUMzQixhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLDZCQUE2QjtJQUM3QixZQUFZO0lBQ1osV0FBVztJQUNYLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLDZCQUE2QjtJQUM3QixVQUFVO0lBQ1YsV0FBVztJQUNYLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLDBCQUEwQjtBQUM5QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIubW9kYWwtcHJvZmlsZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIG1pbi1oZWlnaHQ6IDMwMHB4O1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICB3aWR0aDogNzAwcHg7XFxuICAgIHBhZGRpbmc6IDI1cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7XFxuICAgIGJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIC1tb3otYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgYmFja2dyb3VuZDogI2YyZjJmMjtcXG4gICAgei1pbmRleDogNTA7XFxufVxcblxcbi5tb2RhbC1saWdodHNvdXQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIHotaW5kZXg6IDI1O1xcbiAgICBiYWNrZ3JvdW5kOiAjMDAwO1xcbn1cXG5cXG4ubW9kYWwtY2xvc2UtcHJvZmlsZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaGVpZ2h0OiA0M3B4O1xcbiAgICB3aWR0aDogNDNweDtcXG4gICAgLypiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2Nsb3NlLnBuZycpOyAqL1xcbiAgICB0b3A6IDFweDtcXG4gICAgcmlnaHQ6IDAuNXB4O1xcbn1cXG5cXG4uYWNfYWN0aW9ucyB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuLmFjX3NlcCB7XFxuICAgIGJhY2tncm91bmQ6ICMwMDA7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgbWFyZ2luOiAtMTVweCAxMHB4O1xcbiAgICB3aWR0aDogMXB4O1xcbiAgICBoZWlnaHQ6IDM1cHg7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJvcmRlcjogMDtcXG59XFxuXFxuLmFjX3NlY3Rpb24ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1heC13aWR0aDogODAwcHg7XFxuICAgIGNsZWFyOiBib3RoO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiA+ICo6bm90KC5hY19zZWN0aW9uKSB7XFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLmFjX3NlY3Rpb24gLmNsZWFyZml4IHtcXG4gICAgcG9zaXRpb246IGluaXRpYWw7XFxufVxcblxcbi5hY19vdXRwdXQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBtYXgtd2lkdGg6IDQ1MHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbn1cXG4uYWNfb3V0cHV0IHByZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTtcXG59XFxuXFxuLmFjX2NhcHRpb24ge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG5cXG4uYWNfY2FwdGlvbl90ZXh0IHtcXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG59XFxuXFxuLmFjX3F1ZXN0aW9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyNCwgMjM2LCAyMTcpO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XFxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xcbiAgICBtYXJnaW46IDVweDtcXG59XFxuXFxuLmFjdGl2ZV9vdXQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkY2RjO1xcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxuICAgIG1pbi13aWR0aDogMjBlbTtcXG4gICAgbWF4LWhlaWdodDogMzAwcHg7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG4udmlzaWJsZS1hYy1jYW52YXMge1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCBibGFjaztcXG59XFxuXFxuLmFjX3NlY3Rpb24gPiAuY29sLW1kLTEyIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5mdWxsX3dpZHRoIG9sIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hYy1kaXNhYmxlZCB7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG5cXG4uYWMtZmVlZGJhY2sge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcXG4gICAgcGFkZGluZzogM3B4O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JleTtcXG4gICAgcGFkZGluZzogMTBweDtcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdF9zdWNjZXNzIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiBncmVlbjtcXG4gICAgYm9yZGVyOiAwcHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0X2ZhaWx1cmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgY29sb3I6IHJlZDtcXG4gICAgYm9yZGVyOiAwcHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vYWZcIjogNDI3ODYsXG5cdFwiLi9hZi5qc1wiOiA0Mjc4Nixcblx0XCIuL2FyXCI6IDMwODY3LFxuXHRcIi4vYXItZHpcIjogMTQxMzAsXG5cdFwiLi9hci1kei5qc1wiOiAxNDEzMCxcblx0XCIuL2FyLWt3XCI6IDk2MTM1LFxuXHRcIi4vYXIta3cuanNcIjogOTYxMzUsXG5cdFwiLi9hci1seVwiOiA1NjQ0MCxcblx0XCIuL2FyLWx5LmpzXCI6IDU2NDQwLFxuXHRcIi4vYXItbWFcIjogNDc3MDIsXG5cdFwiLi9hci1tYS5qc1wiOiA0NzcwMixcblx0XCIuL2FyLXNhXCI6IDE2MDQwLFxuXHRcIi4vYXItc2EuanNcIjogMTYwNDAsXG5cdFwiLi9hci10blwiOiAzNzEwMCxcblx0XCIuL2FyLXRuLmpzXCI6IDM3MTAwLFxuXHRcIi4vYXIuanNcIjogMzA4NjcsXG5cdFwiLi9helwiOiAzMTA4Myxcblx0XCIuL2F6LmpzXCI6IDMxMDgzLFxuXHRcIi4vYmVcIjogOTgwOCxcblx0XCIuL2JlLmpzXCI6IDk4MDgsXG5cdFwiLi9iZ1wiOiA2ODMzOCxcblx0XCIuL2JnLmpzXCI6IDY4MzM4LFxuXHRcIi4vYm1cIjogNjc0MzgsXG5cdFwiLi9ibS5qc1wiOiA2NzQzOCxcblx0XCIuL2JuXCI6IDg5MDUsXG5cdFwiLi9ibi5qc1wiOiA4OTA1LFxuXHRcIi4vYm9cIjogMTE1NjAsXG5cdFwiLi9iby5qc1wiOiAxMTU2MCxcblx0XCIuL2JyXCI6IDEyNzgsXG5cdFwiLi9ici5qc1wiOiAxMjc4LFxuXHRcIi4vYnNcIjogODA2MjIsXG5cdFwiLi9icy5qc1wiOiA4MDYyMixcblx0XCIuL2NhXCI6IDI0NjgsXG5cdFwiLi9jYS5qc1wiOiAyNDY4LFxuXHRcIi4vY3NcIjogNTgyMixcblx0XCIuL2NzLmpzXCI6IDU4MjIsXG5cdFwiLi9jdlwiOiA1MDg3Nyxcblx0XCIuL2N2LmpzXCI6IDUwODc3LFxuXHRcIi4vY3lcIjogNDczNzMsXG5cdFwiLi9jeS5qc1wiOiA0NzM3Myxcblx0XCIuL2RhXCI6IDI0NzgwLFxuXHRcIi4vZGEuanNcIjogMjQ3ODAsXG5cdFwiLi9kZVwiOiA1OTc0MCxcblx0XCIuL2RlLWF0XCI6IDYwMjE3LFxuXHRcIi4vZGUtYXQuanNcIjogNjAyMTcsXG5cdFwiLi9kZS1jaFwiOiA2MDg5NCxcblx0XCIuL2RlLWNoLmpzXCI6IDYwODk0LFxuXHRcIi4vZGUuanNcIjogNTk3NDAsXG5cdFwiLi9kdlwiOiA1MzAwLFxuXHRcIi4vZHYuanNcIjogNTMwMCxcblx0XCIuL2VsXCI6IDUwODM3LFxuXHRcIi4vZWwuanNcIjogNTA4MzcsXG5cdFwiLi9lbi1hdVwiOiA3ODM0OCxcblx0XCIuL2VuLWF1LmpzXCI6IDc4MzQ4LFxuXHRcIi4vZW4tY2FcIjogNzc5MjUsXG5cdFwiLi9lbi1jYS5qc1wiOiA3NzkyNSxcblx0XCIuL2VuLWdiXCI6IDIyMjQzLFxuXHRcIi4vZW4tZ2IuanNcIjogMjIyNDMsXG5cdFwiLi9lbi1pZVwiOiA0NjQzNixcblx0XCIuL2VuLWllLmpzXCI6IDQ2NDM2LFxuXHRcIi4vZW4tbnpcIjogNzYzMTksXG5cdFwiLi9lbi1uei5qc1wiOiA3NjMxOSxcblx0XCIuL2VvXCI6IDkyOTE1LFxuXHRcIi4vZW8uanNcIjogOTI5MTUsXG5cdFwiLi9lc1wiOiA1NTY1NSxcblx0XCIuL2VzLWRvXCI6IDU1MjUxLFxuXHRcIi4vZXMtZG8uanNcIjogNTUyNTEsXG5cdFwiLi9lcy11c1wiOiA3MTE0Nixcblx0XCIuL2VzLXVzLmpzXCI6IDcxMTQ2LFxuXHRcIi4vZXMuanNcIjogNTU2NTUsXG5cdFwiLi9ldFwiOiA1NjAzLFxuXHRcIi4vZXQuanNcIjogNTYwMyxcblx0XCIuL2V1XCI6IDc3NzYzLFxuXHRcIi4vZXUuanNcIjogNzc3NjMsXG5cdFwiLi9mYVwiOiA3Njk1OSxcblx0XCIuL2ZhLmpzXCI6IDc2OTU5LFxuXHRcIi4vZmlcIjogMTE4OTcsXG5cdFwiLi9maS5qc1wiOiAxMTg5Nyxcblx0XCIuL2ZvXCI6IDk0Njk0LFxuXHRcIi4vZm8uanNcIjogOTQ2OTQsXG5cdFwiLi9mclwiOiA5NDQ3MCxcblx0XCIuL2ZyLWNhXCI6IDYzMDQ5LFxuXHRcIi4vZnItY2EuanNcIjogNjMwNDksXG5cdFwiLi9mci1jaFwiOiA1MjMzMCxcblx0XCIuL2ZyLWNoLmpzXCI6IDUyMzMwLFxuXHRcIi4vZnIuanNcIjogOTQ0NzAsXG5cdFwiLi9meVwiOiA1MDQ0LFxuXHRcIi4vZnkuanNcIjogNTA0NCxcblx0XCIuL2dkXCI6IDIxMDEsXG5cdFwiLi9nZC5qc1wiOiAyMTAxLFxuXHRcIi4vZ2xcIjogMzg3OTQsXG5cdFwiLi9nbC5qc1wiOiAzODc5NCxcblx0XCIuL2dvbS1sYXRuXCI6IDIzMTY4LFxuXHRcIi4vZ29tLWxhdG4uanNcIjogMjMxNjgsXG5cdFwiLi9ndVwiOiA5NTM0OSxcblx0XCIuL2d1LmpzXCI6IDk1MzQ5LFxuXHRcIi4vaGVcIjogMjQyMDYsXG5cdFwiLi9oZS5qc1wiOiAyNDIwNixcblx0XCIuL2hpXCI6IDMwMDk0LFxuXHRcIi4vaGkuanNcIjogMzAwOTQsXG5cdFwiLi9oclwiOiAzMDMxNixcblx0XCIuL2hyLmpzXCI6IDMwMzE2LFxuXHRcIi4vaHVcIjogMjIxMzgsXG5cdFwiLi9odS5qc1wiOiAyMjEzOCxcblx0XCIuL2h5LWFtXCI6IDExNDIzLFxuXHRcIi4vaHktYW0uanNcIjogMTE0MjMsXG5cdFwiLi9pZFwiOiAyOTIxOCxcblx0XCIuL2lkLmpzXCI6IDI5MjE4LFxuXHRcIi4vaXNcIjogOTAxMzUsXG5cdFwiLi9pcy5qc1wiOiA5MDEzNSxcblx0XCIuL2l0XCI6IDkwNjI2LFxuXHRcIi4vaXQuanNcIjogOTA2MjYsXG5cdFwiLi9qYVwiOiAzOTE4Myxcblx0XCIuL2phLmpzXCI6IDM5MTgzLFxuXHRcIi4vanZcIjogMjQyODYsXG5cdFwiLi9qdi5qc1wiOiAyNDI4Nixcblx0XCIuL2thXCI6IDQwNDE1LFxuXHRcIi4va2EuanNcIjogNDA0MTUsXG5cdFwiLi9ra1wiOiA0Nzc3Mixcblx0XCIuL2trLmpzXCI6IDQ3NzcyLFxuXHRcIi4va21cIjogMTg3NTgsXG5cdFwiLi9rbS5qc1wiOiAxODc1OCxcblx0XCIuL2tuXCI6IDc5MjgyLFxuXHRcIi4va24uanNcIjogNzkyODIsXG5cdFwiLi9rb1wiOiAzMzczMCxcblx0XCIuL2tvLmpzXCI6IDMzNzMwLFxuXHRcIi4va3lcIjogMzMyOTEsXG5cdFwiLi9reS5qc1wiOiAzMzI5MSxcblx0XCIuL2xiXCI6IDM2ODQxLFxuXHRcIi4vbGIuanNcIjogMzY4NDEsXG5cdFwiLi9sb1wiOiA1NTQ2Nixcblx0XCIuL2xvLmpzXCI6IDU1NDY2LFxuXHRcIi4vbHRcIjogNTcwMTAsXG5cdFwiLi9sdC5qc1wiOiA1NzAxMCxcblx0XCIuL2x2XCI6IDM3NTk1LFxuXHRcIi4vbHYuanNcIjogMzc1OTUsXG5cdFwiLi9tZVwiOiAzOTg2MSxcblx0XCIuL21lLmpzXCI6IDM5ODYxLFxuXHRcIi4vbWlcIjogMzU0OTMsXG5cdFwiLi9taS5qc1wiOiAzNTQ5Myxcblx0XCIuL21rXCI6IDk1OTY2LFxuXHRcIi4vbWsuanNcIjogOTU5NjYsXG5cdFwiLi9tbFwiOiA4NzM0MSxcblx0XCIuL21sLmpzXCI6IDg3MzQxLFxuXHRcIi4vbXJcIjogMTAzNzAsXG5cdFwiLi9tci5qc1wiOiAxMDM3MCxcblx0XCIuL21zXCI6IDk4NDcsXG5cdFwiLi9tcy1teVwiOiA0MTIzNyxcblx0XCIuL21zLW15LmpzXCI6IDQxMjM3LFxuXHRcIi4vbXMuanNcIjogOTg0Nyxcblx0XCIuL210XCI6IDcyMTI2LFxuXHRcIi4vbXQuanNcIjogNzIxMjYsXG5cdFwiLi9teVwiOiA1NjE2NSxcblx0XCIuL215LmpzXCI6IDU2MTY1LFxuXHRcIi4vbmJcIjogNjQ5MjQsXG5cdFwiLi9uYi5qc1wiOiA2NDkyNCxcblx0XCIuL25lXCI6IDE2NzQ0LFxuXHRcIi4vbmUuanNcIjogMTY3NDQsXG5cdFwiLi9ubFwiOiA5MzkwMSxcblx0XCIuL25sLWJlXCI6IDU5ODE0LFxuXHRcIi4vbmwtYmUuanNcIjogNTk4MTQsXG5cdFwiLi9ubC5qc1wiOiA5MzkwMSxcblx0XCIuL25uXCI6IDgzODc3LFxuXHRcIi4vbm4uanNcIjogODM4NzcsXG5cdFwiLi9wYS1pblwiOiAxNTg1OCxcblx0XCIuL3BhLWluLmpzXCI6IDE1ODU4LFxuXHRcIi4vcGxcIjogNjQ0OTUsXG5cdFwiLi9wbC5qc1wiOiA2NDQ5NSxcblx0XCIuL3B0XCI6IDg5NTIwLFxuXHRcIi4vcHQtYnJcIjogNTc5NzEsXG5cdFwiLi9wdC1ici5qc1wiOiA1Nzk3MSxcblx0XCIuL3B0LmpzXCI6IDg5NTIwLFxuXHRcIi4vcm9cIjogOTY0NTksXG5cdFwiLi9yby5qc1wiOiA5NjQ1OSxcblx0XCIuL3J1XCI6IDIxNzkzLFxuXHRcIi4vcnUuanNcIjogMjE3OTMsXG5cdFwiLi9zZFwiOiA0MDk1MCxcblx0XCIuL3NkLmpzXCI6IDQwOTUwLFxuXHRcIi4vc2VcIjogMTA0OTAsXG5cdFwiLi9zZS5qc1wiOiAxMDQ5MCxcblx0XCIuL3NpXCI6IDkwMTI0LFxuXHRcIi4vc2kuanNcIjogOTAxMjQsXG5cdFwiLi9za1wiOiA2NDI0OSxcblx0XCIuL3NrLmpzXCI6IDY0MjQ5LFxuXHRcIi4vc2xcIjogMTQ5ODUsXG5cdFwiLi9zbC5qc1wiOiAxNDk4NSxcblx0XCIuL3NxXCI6IDUxMTA0LFxuXHRcIi4vc3EuanNcIjogNTExMDQsXG5cdFwiLi9zclwiOiA0OTEzMSxcblx0XCIuL3NyLWN5cmxcIjogMTM3MDksXG5cdFwiLi9zci1jeXJsLmpzXCI6IDEzNzA5LFxuXHRcIi4vc3IuanNcIjogNDkxMzEsXG5cdFwiLi9zc1wiOiA4NTg5Myxcblx0XCIuL3NzLmpzXCI6IDg1ODkzLFxuXHRcIi4vc3ZcIjogOTg3NjAsXG5cdFwiLi9zdi5qc1wiOiA5ODc2MCxcblx0XCIuL3N3XCI6IDkxMTcyLFxuXHRcIi4vc3cuanNcIjogOTExNzIsXG5cdFwiLi90YVwiOiAyNzMzMyxcblx0XCIuL3RhLmpzXCI6IDI3MzMzLFxuXHRcIi4vdGVcIjogMjMxMTAsXG5cdFwiLi90ZS5qc1wiOiAyMzExMCxcblx0XCIuL3RldFwiOiA1MjA5NSxcblx0XCIuL3RldC5qc1wiOiA1MjA5NSxcblx0XCIuL3RoXCI6IDkwNDEsXG5cdFwiLi90aC5qc1wiOiA5MDQxLFxuXHRcIi4vdGwtcGhcIjogNzU3NjgsXG5cdFwiLi90bC1waC5qc1wiOiA3NTc2OCxcblx0XCIuL3RsaFwiOiA4OTQ0NCxcblx0XCIuL3RsaC5qc1wiOiA4OTQ0NCxcblx0XCIuL3RyXCI6IDcyMzk3LFxuXHRcIi4vdHIuanNcIjogNzIzOTcsXG5cdFwiLi90emxcIjogMjgyNTQsXG5cdFwiLi90emwuanNcIjogMjgyNTQsXG5cdFwiLi90em1cIjogNTExMDYsXG5cdFwiLi90em0tbGF0blwiOiAzMDY5OSxcblx0XCIuL3R6bS1sYXRuLmpzXCI6IDMwNjk5LFxuXHRcIi4vdHptLmpzXCI6IDUxMTA2LFxuXHRcIi4vdWtcIjogNjc2OTEsXG5cdFwiLi91ay5qc1wiOiA2NzY5MSxcblx0XCIuL3VyXCI6IDEzNzk1LFxuXHRcIi4vdXIuanNcIjogMTM3OTUsXG5cdFwiLi91elwiOiA2NzkxLFxuXHRcIi4vdXotbGF0blwiOiA2MDU4OCxcblx0XCIuL3V6LWxhdG4uanNcIjogNjA1ODgsXG5cdFwiLi91ei5qc1wiOiA2NzkxLFxuXHRcIi4vdmlcIjogNjU2NjYsXG5cdFwiLi92aS5qc1wiOiA2NTY2Nixcblx0XCIuL3gtcHNldWRvXCI6IDE0Mzc4LFxuXHRcIi4veC1wc2V1ZG8uanNcIjogMTQzNzgsXG5cdFwiLi95b1wiOiA3NTgwNSxcblx0XCIuL3lvLmpzXCI6IDc1ODA1LFxuXHRcIi4vemgtY25cIjogODM4MzksXG5cdFwiLi96aC1jbi5qc1wiOiA4MzgzOSxcblx0XCIuL3poLWhrXCI6IDU1NzI2LFxuXHRcIi4vemgtaGsuanNcIjogNTU3MjYsXG5cdFwiLi96aC10d1wiOiA3NDE1Mixcblx0XCIuL3poLXR3LmpzXCI6IDc0MTUyXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gNDY3MDA7IiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9hY3RpdmVjb2RlLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XG5pbXBvcnQgSlNBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfanMuanNcIjtcbmltcG9ydCBIVE1MQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2h0bWwuanNcIjtcbmltcG9ydCBTUUxBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfc3FsLmpzXCI7XG5pbXBvcnQgQnJ5dGhvbkFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9icnl0aG9uLmpzXCI7XG5pbXBvcnQgTGl2ZUNvZGUgZnJvbSBcIi4vbGl2ZWNvZGUuanNcIjtcbmltcG9ydCB7XG4gICAgVGltZWRBY3RpdmVDb2RlLFxuICAgIFRpbWVkTGl2ZUNvZGUsXG4gICAgVGltZWRKU0FjdGl2ZUNvZGUsXG4gICAgVGltZWRIVE1MQWN0aXZlQ29kZSxcbiAgICBUaW1lZFNRTEFjdGl2ZUNvZGUsXG4gICAgVGltZWRCcnl0aG9uQWN0aXZlQ29kZSxcbn0gZnJvbSBcIi4vdGltZWRfYWN0aXZlY29kZVwiO1xuaW1wb3J0IFwiLi4vLi4vY29tbW9uL2pzL2pxdWVyeS5oaWdobGlnaHQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQUNGYWN0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5mb28gPSBcImJhclwiO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlQWN0aXZlQ29kZShvcmlnLCBsYW5nLCBhZGRvcHRzKSB7XG4gICAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICAgICAgb3JpZzogb3JpZyxcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcbiAgICAgICAgICAgIHB5dGhvbjM6IGVCb29rQ29uZmlnLnB5dGhvbjMsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChhZGRvcHRzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBhdHRybmFtZSBpbiBhZGRvcHRzKSB7XG4gICAgICAgICAgICAgICAgb3B0c1thdHRybmFtZV0gPSBhZGRvcHRzW2F0dHJuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGFuZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYW5nID0gJChvcHRzLm9yaWcpLmZpbmQoXCJbZGF0YS1sYW5nXVwiKS5kYXRhKFwibGFuZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGV4dF9hcmVhID0gJChvcHRzLm9yaWcpLmZpbmQoXCJ0ZXh0YXJlYVwiKVswXVxuICAgICAgICB2YXIgcHl0aG9uM19pbnRlcnByZXRlciA9ICQodGV4dF9hcmVhKS5hdHRyKFwiZGF0YS1weXRob24zX2ludGVycHJldGVyXCIpO1xuICAgICAgICBpZiAob3B0cy50aW1lZCA9PSB0cnVlKSB7XG4gICAgICAgICAgICBpZihweXRob24zX2ludGVycHJldGVyPT09XCJicnl0aG9uXCIpe1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRCcnl0aG9uQWN0aXZlQ29kZShvcHRzKTsgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYW5nID09PSBcInB5dGhvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIGxhbmcgPT09IFwiamF2YVwiIHx8XG4gICAgICAgICAgICAgICAgbGFuZyA9PT0gXCJjcHBcIiB8fFxuICAgICAgICAgICAgICAgIGxhbmcgPT09IFwiY1wiIHx8XG4gICAgICAgICAgICAgICAgbGFuZyA9PT0gXCJweXRob24zXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRMaXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJqYXZhc2NyaXB0XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkSlNBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcImh0bWxtaXhlZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEhUTUxBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcInNxbFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZFNRTEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKChsYW5nID09PVwicHl0aG9uM1wiKSAmJiAocHl0aG9uM19pbnRlcnByZXRlciA9PT0gXCJicnl0aG9uXCIpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJyeXRob25BY3RpdmVDb2RlKG9wdHMpOyAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGFuZyA9PT0gXCJqYXZhc2NyaXB0XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpTQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJodG1sbWl4ZWRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSFRNTEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwic3FsXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNRTEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIFtcImphdmFcIiwgXCJjcHBcIiwgXCJjXCIsIFwicHl0aG9uM1wiLCBcInB5dGhvbjJcIiwgXCJvY3RhdmVcIl0uaW5kZXhPZihcbiAgICAgICAgICAgICAgICAgICAgbGFuZ1xuICAgICAgICAgICAgICAgICkgPiAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBpcyBweXRob25cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSB3ZWIycHkgY29udHJvbGxlcihzKVxuICAgIHN0YXRpYyBhZGRBY3RpdmVDb2RlVG9EaXYob3V0ZXJkaXZpZCwgYWNkaXZpZCwgc2lkLCBpbml0aWFsY29kZSwgbGFuZ3VhZ2UpIHtcbiAgICAgICAgdmFyIHRoZXByZSwgbmV3YWM7XG4gICAgICAgIHZhciBhY2RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjZGl2aWQpO1xuICAgICAgICAkKGFjZGl2KS5lbXB0eSgpO1xuICAgICAgICB0aGVwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgICAgIHRoZXByZVtcImRhdGEtY29tcG9uZW50XCJdID0gXCJhY3RpdmVjb2RlXCI7XG4gICAgICAgIHRoZXByZS5pZCA9IG91dGVyZGl2aWQ7XG4gICAgICAgICQodGhlcHJlKS5kYXRhKFwibGFuZ1wiLCBsYW5ndWFnZSk7XG4gICAgICAgICQoYWNkaXYpLmFwcGVuZCh0aGVwcmUpO1xuICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgIG9yaWc6IHRoZXByZSxcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICB2YXIgYWRkb3B0cyA9IHtcbiAgICAgICAgICAgIHNpZDogc2lkLFxuICAgICAgICAgICAgZ3JhZGVyYWN0aXZlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAobGFuZ3VhZ2UgPT09IFwiaHRtbG1peGVkXCIpIHtcbiAgICAgICAgICAgIGFkZG9wdHNbXCJ2ZXJ0aWNhbFwiXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbmV3YWMgPSBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZSh0aGVwcmUsIGxhbmd1YWdlLCBhZGRvcHRzKTtcbiAgICAgICAgdmFyIHNhdmVkaXYgPSBuZXdhYy5kaXZpZDtcbiAgICAgICAgbmV3YWMuZGl2aWQgPSBzYXZlZGl2O1xuICAgICAgICBuZXdhYy5lZGl0b3Iuc2V0U2l6ZSg1MDAsIDMwMCk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbmV3YWMuZWRpdG9yLnJlZnJlc2goKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUFjdGl2ZUNvZGVGcm9tT3B0cyhvcHRzKSB7XG4gICAgICAgIHJldHVybiBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZShvcHRzLm9yaWcsIG9wdHMubGFuZywgb3B0cyk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVTY3JhdGNoQWN0aXZlY29kZSgpIHtcbiAgICAgICAgLyogc2V0IHVwIHRoZSBzY3JhdGNoIEFjdGl2ZWNvZGUgZWRpdG9yIGluIHRoZSBzZWFyY2ggbWVudSAqL1xuICAgICAgICAvLyB1c2UgdGhlIFVSTCB0byBhc3NpZ24gYSBkaXZpZCAtIGVhY2ggcGFnZSBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBBY3RpdmVjb2RlIGJsb2NrIGlkLlxuICAgICAgICAvLyBSZW1vdmUgZXZlcnl0aGluZyBmcm9tIHRoZSBVUkwgYnV0IHRoZSBjb3Vyc2UgYW5kIHBhZ2UgbmFtZVxuICAgICAgICAvLyB0b2RvOiAgdGhpcyBjb3VsZCBwcm9iYWJseSBiZSBlbGltaW5hdGVkIGFuZCBzaW1wbHkgbW92ZWQgdG8gdGhlIHRlbXBsYXRlIGZpbGVcblxuICAgICAgICBpZiAoZUJvb2tDb25maWcuZW5hYmxlU2NyYXRjaEFDID09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgICAgdmFyIGRpdmlkID0gZUJvb2tDb25maWcuY291cnNlICsgXCJfc2NyYXRjaF9hY1wiO1xuICAgICAgICBkaXZpZCA9IGRpdmlkLnJlcGxhY2UoL1sjLl0vZywgXCJcIik7IC8vIGluIGNhc2UgYm9vayB0aXRsZSBoYXMgY2hhcmFjdGVycyB0aGF0IHdpbGwgbWVzcyB1cCBvdXIgc2VsZWN0b3JzXG4gICAgICAgIGVCb29rQ29uZmlnLnNjcmF0Y2hEaXYgPSBkaXZpZDtcbiAgICAgICAgbGV0IHN0ZGluID0gXCJcIjtcbiAgICAgICAgdmFyIGxhbmcgPSBlQm9va0NvbmZpZy5hY0RlZmF1bHRMYW5ndWFnZVxuICAgICAgICAgICAgPyBlQm9va0NvbmZpZy5hY0RlZmF1bHRMYW5ndWFnZVxuICAgICAgICAgICAgOiBcInB5dGhvblwiO1xuICAgICAgICBpZiAobGFuZyA9PT0gXCJqYXZhXCIgfHwgbGFuZyA9PT0gXCJjcHBcIiB8fCBsYW5nID09PSBcInB5dGhvbjNcIikge1xuICAgICAgICAgICAgc3RkaW4gPSBgZGF0YS1zdGRpbj1cInRleHQgZm9yIHN0ZGluXCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdlbmVyYXRlIHRoZSBIVE1MXG4gICAgICAgIHZhciBodG1sID0gYDxkaXYgaWQ9XCJhY19tb2RhbF8ke2RpdmlkfVwiIGNsYXNzPVwibW9kYWwgZmFkZVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIHNjcmF0Y2gtYWMtbW9kYWxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+U2NyYXRjaCBBY3RpdmVDb2RlPC9oND5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1jb21wb25lbnQ9XCJhY3RpdmVjb2RlXCIgaWQ9JHtkaXZpZH0+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPSR7ZGl2aWR9X3F1ZXN0aW9uIGNsYXNzPVwiYWNfcXVlc3Rpb25cIj48cD5Vc2UgdGhpcyBhcmVhIGZvciB3cml0aW5nIGNvZGUgb3IgdGFraW5nIG5vdGVzLjwvcD48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBkYXRhLWNvZGVsZW5zPVwidHJ1ZVwiIGRhdGEtbGFuZz1cIiR7bGFuZ31cIiAke3N0ZGlufT5cblxuXG5cblxuICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgdmFyIGVsID0gJChodG1sKTtcbiAgICAgICAgJChcImJvZHlcIikuYXBwZW5kKGVsKTtcbiAgICAgICAgZWwub24oXCJzaG93bi5icy5tb2RhbCBzaG93LmJzLm1vZGFsXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVsLmZpbmQoXCIuQ29kZU1pcnJvclwiKS5lYWNoKGZ1bmN0aW9uIChpLCBlKSB7XG4gICAgICAgICAgICAgICAgZS5Db2RlTWlycm9yLnJlZnJlc2goKTtcbiAgICAgICAgICAgICAgICBlLkNvZGVNaXJyb3IuZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHRvZ2dsZVNjcmF0Y2hBY3RpdmVjb2RlKCkge1xuICAgICAgICB2YXIgZGl2aWQgPSBcImFjX21vZGFsX1wiICsgZUJvb2tDb25maWcuc2NyYXRjaERpdjtcbiAgICAgICAgdmFyIGRpdiA9ICQoXCIjXCIgKyBkaXZpZCk7XG4gICAgICAgICQoYCMke2VCb29rQ29uZmlnLnNjcmF0Y2hEaXZ9YCkucmVtb3ZlQ2xhc3MoXCJhY19zZWN0aW9uXCIpO1xuICAgICAgICBkaXYubW9kYWwoXCJ0b2dnbGVcIik7XG4gICAgfVxufVxuXG4vL1xuLy8gUGFnZSBJbml0aWFsaXphdGlvblxuLy9cblxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgQUNGYWN0b3J5LmNyZWF0ZVNjcmF0Y2hBY3RpdmVjb2RlKCk7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1hY3RpdmVjb2RlXVwiKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCQodGhpcykuY2xvc2VzdChcIltkYXRhLWNvbXBvbmVudD10aW1lZEFzc2Vzc21lbnRdXCIpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgZXhpc3RzIHdpdGhpbiBhIHRpbWVkIGNvbXBvbmVudCwgZG9uJ3QgcmVuZGVyIGl0IGhlcmVcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmVkTGlzdFt0aGlzLmlkXSA9IEFDRmFjdG9yeS5jcmVhdGVBY3RpdmVDb2RlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoXCJ0ZXh0YXJlYVwiKS5kYXRhKFwibGFuZ1wiKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcmVuZGVyaW5nIEFjdGl2ZWNvZGUgUHJvYmxlbSAke3RoaXMuaWR9XG4gICAgICAgICAgICAgICAgRGV0YWlsczogJHtlcnJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAobG9nZ2Vkb3V0KSB7XG4gICAgICAgIGZvciAobGV0IGsgaW4gd2luZG93LmVkTGlzdCkge1xuICAgICAgICAgICAgd2luZG93LmVkTGlzdFtrXS5kaXNhYmxlU2F2ZUxvYWQoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGsgaW4gd2luZG93LmVkTGlzdCkge1xuICAgICAgICAgICAgd2luZG93LmVkTGlzdFtrXS5lbmFibGVTYXZlTG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbmlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID0ge307XG59XG5cbndpbmRvdy5jb21wb25lbnRfZmFjdG9yeS5hY3RpdmVjb2RlID0gQUNGYWN0b3J5LmNyZWF0ZUFjdGl2ZUNvZGVGcm9tT3B0cztcblxuLy8gVGhpcyBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gZXhwb3NlIHRoaXMgb3V0c2lkZSB0aGUgbW9kdWxlLlxud2luZG93LkFDRmFjdG9yeSA9IEFDRmFjdG9yeTtcblxuLy8gVGhpcyBzZWVtcyBhIGJpdCBoYWNreSBhbmQgcG9zc2libHkgYnJpdHRsZSwgYnV0IGl0cyBoYXJkIHRvIGtub3cgaG93IGxvbmcgaXQgd2lsbCB0YWtlIHRvXG4vLyBmaWd1cmUgb3V0IHRoZSBsb2dpbi9sb2dvdXQgc3RhdHVzIG9mIHRoZSB1c2VyLiAgU29tZXRpbWVzIGl0cyBpbW1lZGlhdGUsIGFuZCBzb21ldGltZXMgaXRzXG4vLyBsb25nLiAgU28gdG8gYmUgc2FmZSB3ZSdsbCBkbyBpdCBib3RoIHdheXMuLlxudmFyIGxvZ2dlZG91dDtcbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9nb3V0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICBsb2dnZWRvdXQgPSB0cnVlO1xufSk7XG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ291dFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yIChsZXQgayBpbiB3aW5kb3cuZWRMaXN0KSB7XG4gICAgICAgIGlmICh3aW5kb3cuZWRMaXN0Lmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICB3aW5kb3cuZWRMaXN0W2tdLmRpc2FibGVTYXZlTG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG4iLCIkLmkxOG4oKS5sb2FkKHtcbiAgICBlbjoge1xuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkX2hpc3Rvcnk6IFwiTG9hZCBIaXN0b3J5XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F1ZGlvX3RvdXI6IFwiQXVkaW8gVG91clwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkZWRfY29kZTogXCJMb2FkZWQgeW91ciBzYXZlZCBjb2RlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19zYXZlZF9jb2RlOiBcIk5vIHNhdmVkIGNvZGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3J1bl9jb2RlOiBcIlJ1blwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2ZlZWRiYWNrOiBcIlNob3cgRmVlZGJhY2tcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlOiBcIlNob3cgQ29kZVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGU6IFwiSGlkZSBDb2RlXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZWxlbnM6IFwiU2hvdyBDb2RlTGVuc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zOiBcIlNob3cgaW4gQ29kZUxlbnNcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlbGVuczogXCJIaWRlIENvZGVsZW5zXCIsXG5cbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGFyc2VfZXJyb3I6XG4gICAgICAgICAgICBcIkEgcGFyc2UgZXJyb3IgbWVhbnMgdGhhdCBQeXRob24gZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgc3ludGF4IG9uIHRoZSBsaW5lIHRoZSBlcnJvciBtZXNzYWdlIHBvaW50cyBvdXQuIENvbW1vbiBleGFtcGxlcyBhcmUgZm9yZ2V0dGluZyBjb21tYXMgYmV0ZXdlZW4gYXJndW1lbnRzIG9yIGZvcmdldHRpbmcgYSA6IG9uIGEgZm9yIHN0YXRlbWVudFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXJzZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRvIGZpeCBhIHBhcnNlIGVycm9yIHlvdSBqdXN0IG5lZWQgdG8gbG9vayBjYXJlZnVsbHkgYXQgdGhlIGxpbmUgd2l0aCB0aGUgZXJyb3IgYW5kIHBvc3NpYmx5IHRoZSBsaW5lIGJlZm9yZSBpdC4gIE1ha2Ugc3VyZSBpdCBjb25mb3JtcyB0byBhbGwgb2YgUHl0aG9uJ3MgcnVsZXMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3I6XG4gICAgICAgICAgICBcIlR5cGUgZXJyb3JzIG1vc3Qgb2Z0ZW4gb2NjdXIgd2hlbiBhbiBleHByZXNzaW9uIHRyaWVzIHRvIGNvbWJpbmUgdHdvIG9iamVjdHMgd2l0aCB0eXBlcyB0aGF0IHNob3VsZCBub3QgYmUgY29tYmluZWQuICBMaWtlIHJhaXNpbmcgYSBzdHJpbmcgdG8gYSBwb3dlclwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVG8gZml4IGEgdHlwZSBlcnJvciB5b3Ugd2lsbCBtb3N0IGxpa2VseSBuZWVkIHRvIHRyYWNlIHRocm91Z2ggeW91ciBjb2RlIGFuZCBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBoYXZlIHRoZSB0eXBlcyB5b3UgZXhwZWN0IHRoZW0gdG8gaGF2ZS4gIEl0IG1heSBiZSBoZWxwZnVsIHRvIHByaW50IG91dCBlYWNoIHZhcmlhYmxlIGFsb25nIHRoZSB3YXkgdG8gYmUgc3VyZSBpdHMgdmFsdWUgaXMgd2hhdCB5b3UgdGhpbmsgaXQgc2hvdWxkIGJlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yOlxuICAgICAgICAgICAgXCJBIG5hbWUgZXJyb3IgYWxtb3N0IGFsd2F5cyBtZWFucyB0aGF0IHlvdSBoYXZlIHVzZWQgYSB2YXJpYWJsZSBiZWZvcmUgaXQgaGFzIGEgdmFsdWUuICBPZnRlbiB0aGlzIG1heSBiZSBhIHNpbXBsZSB0eXBvLCBzbyBjaGVjayB0aGUgc3BlbGxpbmcgY2FyZWZ1bGx5LlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBhc3NpZ25tZW50IHN0YXRlbWVudHMgYW5kIHlvdXIgZnVuY3Rpb24gY2FsbHMsIHRoaXMgaXMgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIGZvciBhIE5hbWVFcnJvciB0byBiZSBmb3VuZC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3I6XG4gICAgICAgICAgICBcIkEgVmFsdWVFcnJvciBtb3N0IG9mdGVuIG9jY3VycyB3aGVuIHlvdSBwYXNzIGEgcGFyYW1ldGVyIHRvIGEgZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBpcyBleHBlY3Rpbmcgb25lIHR5cGUgYW5kIHlvdSBwYXNzIGFub3RoZXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVGhlIGVycm9yIG1lc3NhZ2UgZ2l2ZXMgeW91IGEgcHJldHR5IGdvb2QgaGludCBhYm91dCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYXMgd2VsbCBhcyB0aGUgdmFsdWUgdGhhdCBpcyBpbmNvcnJlY3QuIExvb2sgYXQgdGhlIGVycm9yIG1lc3NhZ2UgY2xvc2VseSBhbmQgdGhlbiB0cmFjZSBiYWNrIHRvIHRoZSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBwcm9ibGVtYXRpYyB2YWx1ZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIGVycm9yIG1lc3NhZ2UgaXMgdGVsbGluZyB5b3UgdGhhdCB0aGUgb2JqZWN0IG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgZG90LCBkb2VzIG5vdCBoYXZlIHRoZSBhdHRyaWJ1dGUgb3IgbWV0aG9kIG9uIHRoZSByaWdodCBoYW5kIHNpZGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRoZSBtb3N0IGNvbW1vbiB2YXJpYW50IG9mIHRoaXMgbWVzc2FnZSBpcyB0aGF0IHRoZSBvYmplY3QgdW5kZWZpbmVkIGRvZXMgbm90IGhhdmUgYXR0cmlidXRlIFguICBUaGlzIHRlbGxzIHlvdSB0aGF0IHRoZSBvYmplY3Qgb24gdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBkb3QgaXMgbm90IHdoYXQgeW91IHRoaW5rLiBUcmFjZSB0aGUgdmFyaWFibGUgYmFjayBhbmQgcHJpbnQgaXQgb3V0IGluIHZhcmlvdXMgcGxhY2VzIHVudGlsIHlvdSBkaXNjb3ZlciB3aGVyZSBpdCBiZWNvbWVzIHVuZGVmaW5lZC4gIE90aGVyd2lzZSBjaGVjayB0aGUgYXR0cmlidXRlIG9uIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIGRvdCBmb3IgYSB0eXBvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcjpcbiAgICAgICAgICAgIFwiTW9zdCBvZiB0aGUgdGltZSB0aGlzIGVycm9yIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGZvcmdvdHRlbiBhIHJpZ2h0IHBhcmVudGhlc2lzIG9yIGhhdmUgZm9yZ290dGVuIHRvIGNsb3NlIGEgcGFpciBvZiBxdW90ZXMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgZWFjaCBsaW5lIG9mIHlvdXIgcHJvZ3JhbSBhbmQgbWFrZSBzdXJlIHRoYXQgeW91ciBwYXJlbnRoZXNpcyBhcmUgYmFsYW5jZWQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3I6XG4gICAgICAgICAgICBcIllvdXIgcHJvZ3JhbSBpcyBydW5uaW5nIHRvbyBsb25nLiAgTW9zdCBwcm9ncmFtcyBpbiB0aGlzIGJvb2sgc2hvdWxkIHJ1biBpbiBsZXNzIHRoYW4gMTAgc2Vjb25kcyBlYXNpbHkuIFRoaXMgcHJvYmFibHkgaW5kaWNhdGVzIHlvdXIgcHJvZ3JhbSBpcyBpbiBhbiBpbmZpbml0ZSBsb29wLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQWRkIHNvbWUgcHJpbnQgc3RhdGVtZW50cyB0byBmaWd1cmUgb3V0IGlmIHlvdXIgcHJvZ3JhbSBpcyBpbiBhbiBpbmZpbnRlIGxvb3AuICBJZiBpdCBpcyBub3QgeW91IGNhbiBpbmNyZWFzZSB0aGUgcnVuIHRpbWUgd2l0aCBzeXMuc2V0RXhlY3V0aW9uTGltaXQobXNlY3MpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3I6XG4gICAgICAgICAgICBcIllvdXIgcHJvZ3JhbSBpcyBydW5uaW5nIGZvciB0b28gbG9uZy4gIE1vc3QgcHJvZ3JhbXMgaW4gdGhpcyBib29rIHNob3VsZCBydW4gaW4gbGVzcyB0aGFuIDMwIHNlY29uZHMgZWFzaWx5LiBUaGlzIHByb2JhYmx5IGluZGljYXRlcyB5b3VyIHByb2dyYW0gaXMgaW4gYW4gaW5maW5pdGUgbG9vcC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkFkZCBzb21lIHByaW50IHN0YXRlbWVudHMgdG8gZmlndXJlIG91dCBpZiB5b3VyIHByb2dyYW0gaXMgaW4gYW4gaW5maW50ZSBsb29wLiAgSWYgaXQgaXMgbm90IHlvdSBjYW4gaW5jcmVhc2UgdGhlIHJ1biB0aW1lIHdpdGggc3lzLnNldEV4ZWN1dGlvbkxpbWl0KG1zZWNzKVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgbWVzc2FnZSBpbmRpY2F0ZXMgdGhhdCBQeXRob24gY2FuJ3QgZmlndXJlIG91dCB0aGUgc3ludGF4IG9mIGEgcGFydGljdWxhciBzdGF0ZW1lbnQuICBTb21lIGV4YW1wbGVzIGFyZSBhc3NpZ25pbmcgdG8gYSBsaXRlcmFsLCBvciBhIGZ1bmN0aW9uIGNhbGxcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgeW91ciBhc3NpZ25tZW50IHN0YXRlbWVudHMgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgYXNzaWdubWVudCBpcyBhIHZhcmlhYmxlLCBub3QgYSBsaXRlcmFsIG9yIGEgZnVuY3Rpb24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBtZXNzYWdlIGluZGljYXRlcyB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGFjY2VzcyBhbiBlbGVtZW50IG9mIGEgZGljdGlvbmFyeSwgYnV0IHRoZSBkaWN0aW9uYXJ5IGRvZXMgbm90IGhhdmUgdGhhdCB0aGUga2V5IHlvdSBhcmUgdXNpbmcuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIllvdSBtYXkgaGF2ZSBhIHR5cG8gaW4gdGhlIG5hbWUgb2YgeW91ciBrZXkuICBJdCBpcyBhbHNvIGdvb2QgcHJhY3RpY2UgdG8gY2hlY2sgaWYgdGhlIGtleSBleGlzdHMgdXNpbmcgYSBzdGF0ZW1lbnQgbGlrZSBpZiBrZXkgaW4gbXlkaWN0LiAgWW91IGNhbiBhbHNvIHVzZSBteWRpY3QuZ2V0KGtleSxkZWZhdWx0dmFsdWUpIHNvIHRoYXQgaWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIGRpY3Rpb25hcnkgeW91IGdldCB0aGUgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkIG9mIGFuIGVycm9yLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBtZXNzYWdlIG1lYW5zIHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gaW5kZXggcGFzdCB0aGUgZW5kIG9mIGEgc3RyaW5nIG9yIGEgbGlzdC4gIEZvciBleGFtcGxlIGlmIHlvdXIgbGlzdCBoYXMgMyB0aGluZ3MgaW4gaXQgYW5kIHlvdSB0cnkgdG8gYWNjZXNzIHRoZSBpdGVtIGF0IHBvc2l0aW9uIDMgb3IgbW9yZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJSZW1lbWJlciB0aGF0IHRoZSBmaXJzdCBpdGVtIGluIGEgbGlzdCBvciBzdHJpbmcgaXMgYXQgaW5kZXggcG9zaXRpb24gMCwgcXVpdGUgb2Z0ZW4gdGhpcyBtZXNzYWdlIGNvbWVzIGFib3V0IGJlY2F1c2UgeW91IGFyZSBvZmYgYnkgb25lLiAgUmVtZW1iZXIgaW4gYSBsaXN0IG9mIGxlbmd0aCAzIHRoZSBsYXN0IGxlZ2FsIGluZGV4IGlzIDJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yOiBcIlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV91cmlfZXJyb3JfZml4OiBcIlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgZXJyb3IgbWVzc2FnZSBpbmRpY2F0ZXMgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBpbXBvcnQgYSBtb2R1bGUgdGhhdCBkb2VzIG5vdCBleGlzdFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJPbmUgcHJvYmxlbSBtYXkgc2ltcGx5IGJlIHRoYXQgeW91IGhhdmUgYSB0eXBvLiAgSXQgbWF5IGFsc28gYmUgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBpbXBvcnQgYSBtb2R1bGUgdGhhdCBleGlzdHMgaW4gJ3JlYWwnIFB5dGhvbiwgYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoaXMgYm9vay4gIElmIHRoaXMgaXMgdGhlIGNhc2UsIHBsZWFzZSBzdWJtaXQgYSBmZWF0dXJlIHJlcXVlc3QgdG8gaGF2ZSB0aGUgbW9kdWxlIGFkZGVkLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgaXMgbW9zdCBsaWtlbHkgYW4gaW50ZXJuYWwgZXJyb3IsIHBhcnRpY3VsYXJseSBpZiB0aGUgbWVzc2FnZSByZWZlcmVuY2VzIHRoZSBjb25zb2xlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUcnkgcmVmcmVzaGluZyB0aGUgd2VicGFnZSwgYW5kIGlmIHRoZSBlcnJvciBjb250aW51ZXMsIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgYWxvbmcgd2l0aCB5b3VyIGNvZGVcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyB0ZWxscyB5b3UgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBkaXZpZGUgYnkgMC4gVHlwaWNhbGx5IHRoaXMgaXMgYmVjYXVzZSB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGluIHRoZSBkZW5vbWluYXRvciBvZiBhIGRpdmlzaW9uIGV4cHJlc3Npb24gaGFzIHRoZSB2YWx1ZSAwXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJZb3UgbWF5IG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IGRpdmlkaW5nIGJ5IDAgd2l0aCBhbiBpZiBzdGF0bWVudCwgb3IgeW91IG1heSBuZWVkIHRvIHJleGFtaW5lIHlvdXIgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGxlZ2FsIHZhbHVlcyBvZiB2YXJpYWJsZXMsIGl0IGNvdWxkIGJlIGFuIGVhcmxpZXIgc3RhdG1lbnQgdGhhdCBpcyB1bmV4cGVjdGVkbHkgYXNzaWduaW5nIGEgdmFsdWUgb2YgemVybyB0byB0aGUgdmFyaWFibGUgaW4gcXVlc3Rpb24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIG1lc3NhZ2UgYWxtb3N0IGFsd2F5cyBzaG93cyB1cCBpbiB0aGUgZm9ybSBvZiBNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUaGlzIGFsd2F5cyBvY2N1cnMgd2hlbiBhIGZ1bmN0aW9uIGNhbGxzIGl0c2VsZi4gIEl0cyBwcmV0dHkgbGlrZWx5IHRoYXQgeW91IGFyZSBub3QgZG9pbmcgdGhpcyBvbiBwdXJwb3NlLiBFeGNlcHQgaW4gdGhlIGNoYXB0ZXIgb24gcmVjdXJzaW9uLiAgSWYgeW91IGFyZSBpbiB0aGF0IGNoYXB0ZXIgdGhlbiBpdHMgbGlrZWx5IHlvdSBoYXZlbid0IGlkZW50aWZpZWQgYSBnb29kIGJhc2UgY2FzZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3I6XG4gICAgICAgICAgICBcIkFuIEludGVybmFsIGVycm9yIG1heSBtZWFuIHRoYXQgeW91J3ZlIHRyaWdnZXJlZCBhIGJ1ZyBpbiBvdXIgUHl0aG9uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUmVwb3J0IHRoaXMgZXJyb3IsIGFsb25nIHdpdGggeW91ciBjb2RlIGFzIGEgYnVnLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBlcnJvciBvY2N1cnMgd2hlbiB5b3UgaGF2ZSBub3QgaW5kZW50ZWQgeW91ciBjb2RlIHByb3Blcmx5LiAgVGhpcyBpcyBtb3N0IGxpa2VseSB0byBoYXBwZW4gYXMgcGFydCBvZiBhbiBpZiwgZm9yLCB3aGlsZSBvciBkZWYgc3RhdGVtZW50LlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZWNrIHlvdXIgaWYsIGRlZiwgZm9yLCBhbmQgd2hpbGUgc3RhdGVtZW50cyB0byBiZSBzdXJlIHRoZSBsaW5lcyBhcmUgcHJvcGVybHkgaW5kZW50ZWQgYmVuZWF0aCB0aGVtLiAgQW5vdGhlciBzb3VyY2Ugb2YgdGhpcyBlcnJvciBjb21lcyBmcm9tIGNvcHlpbmcgYW5kIHBhc3RpbmcgY29kZSB3aGVyZSB5b3UgaGF2ZSBhY2NpZGVudGFsbHkgbGVmdCBzb21lIGJpdHMgb2YgY29kZSBseWluZyBhcm91bmQgdGhhdCBkb24ndCBiZWxvbmcgdGhlcmUgYW55bW9yZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIGVycm9yIG9jY3VycyB3aGVuIHlvdSB0cnkgdG8gdXNlIGEgYnVpbHRpbiBmdW5jdGlvbiBvZiBQeXRob24gdGhhdCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgaW4gdGhpcyBpbi1icm93c2VyIHZlcnNpb24gb2YgUHl0aG9uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJGb3Igbm93IHRoZSBvbmx5IHdheSB0byBmaXggdGhpcyBpcyB0byBub3QgdXNlIHRoZSBmdW5jdGlvbi4gIFRoZXJlIG1heSBiZSB3b3JrYXJvdW5kcy4gIElmIHlvdSByZWFsbHkgbmVlZCB0aGlzIGJ1aWx0aW4gZnVuY3Rpb24gdGhlbiBmaWxlIGEgYnVnIHJlcG9ydCBhbmQgdGVsbCB1cyBob3cgeW91IGFyZSB0cnlpbmcgdG8gdXNlIHRoZSBmdW5jdGlvbi5cIixcblxuICAgICAgICBtc2dfYWN0aXZlY29kZV9maWxlX25vdF9mb3VuZDogXCJGaWxlIG5vdCBmb3VuZDogJyQxJ1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19maWxlX29yX2RpcjpcbiAgICAgICAgICAgIFwiW0Vycm5vIDJdIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3Rvcnk6ICckMSdcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3RhcnRpbmc6IFwiQ2xpY2sgdGhlIHBsYXkgYnV0dG9uIHRvIGJlZ2luIHRoZSAkMVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5aW5nOiBcIlBsYXlpbmcgdGhlICQxXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRpbmdfYXVkaW86XG4gICAgICAgICAgICBcIkxvYWRpbmcgYXVkaW8uICBQbGVhc2Ugd2FpdC4gICBJZiB0aGUgdG91ciBkb2Vzbid0IHN0YXJ0IHNvb24gY2xpY2sgb24gdGhlIGxlZnRtb3N0IGNvbnRyb2wgYnV0dG9uIChQbGF5IGZpcnN0IGF1ZGlvIGluIHRvdXIpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhdXNlX2N1cnJlbnRfYXVkaW86IFwiUGF1c2UgY3VycmVudCBhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXVzZV9hdWRpbzogXCJQYXVzZSBhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5X3BhdXNlZF9hdWRpbzogXCJQbGF5IHBhdXNlZCBhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb19wYXVzZWQ6XG4gICAgICAgICAgICBcIlRoZSAkMSBoYXMgYmVlbiBwYXVzZWQuIENsaWNrIG9uIHRoZSBwbGF5IGJ1dHRvbiB0byByZXN1bWUgdGhlIHRvdXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2lucHV0X3ByZzogXCJJbnB1dCBmb3IgUHJvZ3JhbVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV93ZXJlX2NvbXBpbGluZ19lcnI6XG4gICAgICAgICAgICBcIlRoZXJlIHdlcmUgZXJyb3JzIGNvbXBpbGluZyB5b3VyIGNvZGUuIFNlZSBiZWxvdy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9leGM6IFwiVGltZSBMaW1pdCBFeGNlZWRlZCBvbiB5b3VyIHByb2dyYW1cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2VydmVyX2VycjogXCJBIHNlcnZlciBlcnJvciBvY2N1cnJlZDogJDEgJDJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmc6XG4gICAgICAgICAgICBcIkNvbXBpbGluZyBhbmQgUnVubmluZyB5b3VyIENvZGUgTm93Li4uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NlcnZlcl9jb21tX2VycjogXCJFcnJvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHNlcnZlci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2F2ZV9ydW46IFwiU2F2ZSAmIFJ1blwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZW5kZXI6IFwiU2F2ZSAmIFJlbmRlclwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3I6XG4gICAgICAgICAgICBcIkFuIGFzc2VydGlvbiBlcnJvciBoYXBwZW5zIHdoZW4gcHl0aG9uIGVuY291bnRlcnMgYW4gYXNzZXJ0aW9uIHN0YXRlbWVudC4gIFB5dGhvbiBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gdG8gdGhlIHJpZ2h0IG9mIHRoZSB3b3JkIGFzc2VydDsgaWYgdGhhdCBleHByZXNzaW9uIGlzIFRydWUgZXZlcnl0aGluZyBpcyBmaW5lIGFuZCB0aGUgcHJvZ3JhbSBjb250aW51ZXMuICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBGYWxzZSBQeXRob24gcmFpc2VzIGFuIGVycm9yIGFuZCBzdG9wcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgdGhlIGV4cHJlc3Npb24gdG8gdGhlIHJpZ2h0IG9mIGFzc2VydC4gIFRoZSBleHByZXNzaW9uIGlzIEZhbHNlIGFuZCB5b3Ugd2lsbCBuZWVkIHRvIGRldGVybWluZSB3aHkgdGhhdCBpcy4gIFlvdSBtYXkgd2FudCB0byBzaW1wbHkgcHJpbnQgb3V0IHRoZSBpbmRpdmlkdWFsIHBhcnRzIG9mIHRoZSBleHByZXNzaW9uIHRvIHVuZGVyc3RhbmQgd2h5IGl0IGlzIGV2YWx1YXRpbmcgdG8gRmFsc2UuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfZGI6IFwiTG9hZGluZyBEQi4uLlwiLFxuICAgIH0sXG59KTtcbiIsIiQuaTE4bigpLmxvYWQoe1xuICAgIFwicHQtYnJcIjoge1xuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkX2hpc3Rvcnk6IFwiQ2FycmVnYXIgaGlzdMOzcmljb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyOiBcIlRvdXIgZGUgw6F1ZGlvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRlZF9jb2RlOiBcIkPDs2RpZ28gc2Fsdm8gY2FycmVnYWRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19zYXZlZF9jb2RlOiBcIk7Do28gaMOhIGPDs2RpZ28gc2Fsdm8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3J1bl9jb2RlOiBcIkV4ZWN1dGFyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfZmVlZGJhY2s6IFwiRXhpYmlyIEZlZWRiYWNrc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGU6IFwiTW9zdHJhciBDw7NkaWdvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZTogXCJPY3VsdGFyIEPDs2RpZ29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlbGVuczogXCJNb3N0cmFyIENvZGVMZW5zXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnM6IFwiTW9zdHJhciBlbSBDb2RlTGVuc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zOiBcIk9jdWx0YXIgQ29kZWxlbnNcIixcblxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXJzZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBkZSBQYXJzZSBzaWduaWZpY2EgcXVlIFB5dGhvbiBuw6NvIGVudGVuZGUgYSBzaW50YXhlIGRhIGxpbmhhIHF1ZSBhIG1lbnNhZ2VtIGRlIGVycm8gYXBvbnRhLiBFeGVtcGxvcyBjb211bnMgc8OjbyBlc3F1ZWNlciB2w61yZ3VsYXMgZW50cmUgYXJndW1lbnRvcyBvdSBlc3F1ZWNlciAnOicgZW0gdW0gY29tYW5kbyBmb3IuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhcnNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUGFyYSBjb3JyaWdpciB1bSBlcnJvIGRlIFBhcnNlLCB2b2PDqiBzw7MgcHJlY2lzYSBvbGhhciBjdWlkYWRvc2FtZW50ZSBhIGxpbmhhIGNvbSBvIGVycm8gZSBwb3NzaXZlbG1lbnRlIGEgbGluaGEgYW50ZXMgZGVsYS4gVGVuaGEgY2VydGV6YSBxdWUgZXN0w6NvIGRlIGFjb3JkbyBjb20gdG9kYXMgYXMgcmVncmFzIGRlIFB5dGhvbi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcjpcbiAgICAgICAgICAgIFwiRXJyb3MgZGUgdGlwYWdlbSBvY29ycmVtIG1haXMgZnJlcXVlbnRlbWVudGUgcXVhbmRvIHVtYSBleHByZXNzw6NvIHRlbnRhIGNvbWJpbmFyIGRvaXMgb2JqZXRvcyBjb20gdGlwb3MgcXVlIG7Do28gZGV2ZXJpYW0gc2VyIGNvbWJpbmFkb3MuIENvbW8gZWxldmFyIHVtYSBTdHJpbmcgYSB1bWEgcG90w6puY2lhLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUGFyYSBjb3JyaWdpciB1bSBlcnJvIGRlIHRpcGFnZW0gdm9jw6ogcHJvdmF2ZWxtZW50ZSBwcmVjaXNhcsOhIHBlcmNvcnJlciBzZXUgY8OzZGlnbyBlIHRlciBjZXJ0ZXphIGRlIHF1ZSBhcyB2YXJpw6F2ZWlzIHBvc3N1ZW0gb3MgdGlwb3MgcXVlIHZvY8OqIGVzcGVyYSBxdWUgZWxhcyB0ZW5oYW0uIFBvZGUgc2VyIMO6dGlsIGltcHJpbWlyIGNhZGEgdmFyacOhdmVsIGFvIGxvbmdvIGRvIGNhbWluaG8gcGFyYSBjaGVjYXIgc2UgZWxhcyBwb3NzdWVtIG8gdmFsb3IgcXVlIHZvY8OqIGFjaGEgcXVlIGRldmVyaWFtIHRlci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBkZSBub21lIHF1YXNlIHNlbXByZSBzaWduaWZpY2EgcXVlIHZvY8OqIHVzb3UgdW1hIHZhcmnDoXZlbCBhbnRlcyBkZWxhIHRlciB1bSB2YWxvci4gRnJlcXVlbnRlbWVudGUgaXNzbyBwb2RlIHNlciB1bSBlcnJvIGRlIGRpZ2l0YcOnw6NvLCBlbnTDo28gY2hlcXVlIGEgb3J0b2dyYWZpYSBjdWlkYWRvc2FtZW50ZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBvIGxhZG8gZGlyZWl0byBkYXMgYXRyaWJ1acOnw7VlcyBlIHN1YXMgY2hhbWFkYXMgZGUgZnVuw6fDtWVzLCBzw6NvIG9zIGx1Z2FyZXMgbWFpcyBwcm92w6F2ZWlzIGRlIGVuY29udHJhciB1bSBlcnJvIGRlIG5vbWUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yOlxuICAgICAgICAgICAgXCJVbSBlcnJvIGRlIHZhbG9yIG9jb3JyZSBtYWlzIGZyZXF1ZW50ZW1lbnRlIHF1YW5kbyB1bWEgZnVuw6fDo28gZXN0w6EgZXNwZXJhbmRvIHVtIHRpcG8gbWFzIHZvY8OqIHBhc3NhIHVtIHBhcsOibWV0cm8gZGUgb3V0cm8gdGlwby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJBIG1lbnNhZ2VtIGRlIGVycm8gdGUgZMOhIHVtYSBib2EgZGljYSBzb2JyZSBvIG5vbWUgZGEgZnVuw6fDo28gZSBvIHZhbG9yIGluY29ycmV0by4gTGVpYSBhdGVudGFtZW50ZSBhIG1lbnNhZ2VtIGRlIGVycm8gZSB2b2x0ZSDDoCB2YXJpw6F2ZWwgcXVlIGNvbnTDqW0gbyB2YWxvciBwcm9ibGVtw6F0aWNvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3I6XG4gICAgICAgICAgICBcIkVzc2EgbWVuc2FnZW0gZGUgZXJybyBlc3TDoSB0ZSBkaXplbmRvIHF1ZSBvIG9iamV0byBkbyBsYWRvIGVzcXVlcmRvIGRvIHBvbnRvIG7Do28gdGVtIG8gYXRyaWJ1dG8gb3UgbcOpdG9kbyBkbyBzZXUgbGFkbyBkaXJlaXRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJBIHZhcmlhbnRlIG1haXMgY29tdW0gZGVzc2EgbWVuc2FnZW0gw6kgcXVlIG8gb2JqZXRvIGluZGVmaW5pZG8gbsOjbyB0ZW0gbyBhdHJpYnV0byBYLiBJc3NvIGRpeiBxdWUgbyBvYmpldG8gZG8gbGFkbyBlc3F1ZXJkbyBkbyBwb250byBuw6NvIMOpIG8gcXVlIHZvY8OqIHBlbnNhLiBSYXN0cmVpZSBlc3NhIHZhcmnDoXZlbCBlIGltcHJpbWEtYSBlbSB2w6FyaW9zIGx1Z2FyZXMgYXTDqSBkZXNjb2JyaXIgb25kZSBlbGEgc2UgdG9ybmEgaW5kZWZpbmlkYS4gQ2FzbyBjb250csOhcmlvLCBjaGVxdWUgc2UgaMOhIGVycm8gZGUgZGlnaXRhw6fDo28gbm8gYXRyaWJ1dG8gZG8gbGFkbyBkaXJlaXRvIGRvIHBvbnRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcjpcbiAgICAgICAgICAgIFwiTmEgbWFpb3JpYSBkYXMgdmV6ZXMgZXN0ZSBlcnJvIGluZGljYSBxdWUgdm9jw6ogZXNxdWVjZXUgZGUgZmVjaGFyIHVtIHBhcsOqbnRlc2VzIG91IGFzcGFzLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBjYWRhIGxpbmhhIGRvIHNldSBwcm9ncmFtYSBlIGNlcnRpZmlxdWUtc2UgZGUgcXVlIHRvZG9zIG9zIHBhcsOqbnRlc2VzIGVzdMOjbyBmZWNoYWRvcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcjpcbiAgICAgICAgICAgIFwiU2V1IHByb2dyYW1hIGVzdMOhIGRlbW9yYW5kbyBtdWl0by4gT3MgcHJvZ3JhbWFzIGRlc3RlIGxpdnJvIGRldmVyaWFtIHJvZGFyIGVtIG1lbm9zIGRlIDEwIHNlZ3VuZG9zLiBJc3NvIHByb3ZhdmVsbWVudGUgaW5kaWNhIHF1ZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkltcHJpbWEgbWVuc2FnZW5zIGVtIGFsZ3VtYXMgbGluaGFzIHBhcmEgZGVzY29icmlyIHNlIHNldSBwcm9ncmFtYSBlc3TDoSBlbSB1bSBsb29wIGluZmluaXRvLiBDYXNvIG7Do28gZXN0ZWphLCB2b2PDqiBwb2RlIGF1bWVudGFyIG8gdGVtcG8gbGltaXRlIGRlIGV4ZWN1w6fDo28gY29tIG8gY29tYW5kbyBzeXMuc2V0RXhlY3V0aW9uTGltaXQobXMpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3I6XG4gICAgICAgICAgICBcIlNldSBwcm9ncmFtYSBlc3TDoSBkZW1vcmFuZG8gbXVpdG8uIE9zIHByb2dyYW1hcyBkZXN0ZSBsaXZybyBkZXZlcmlhbSByb2RhciBlbSBtZW5vcyBkZSAzMCBzZWd1bmRvcy4gSXNzbyBwcm92YXZlbG1lbnRlIGluZGljYSBxdWUgc2V1IHByb2dyYW1hIGVzdMOhIGVtIHVtIGxvb3AgaW5maW5pdG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJJbXByaW1hIG1lbnNhZ2VucyBlbSBhbGd1bWFzIGxpbmhhcyBwYXJhIGRlc2NvYnJpciBzZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by4gQ2FzbyBuw6NvIGVzdGVqYSwgdm9jw6ogcG9kZSBhdW1lbnRhciBvIHRlbXBvIGxpbWl0ZSBkZSBleGVjdcOnw6NvIGNvbSBvIGNvbWFuZG8gc3lzLnNldEV4ZWN1dGlvbkxpbWl0KG1zKVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGEgbWVuc2FnZW0gaW5kaWNhIHF1ZSBQeXRob24gbsOjbyBlbnRlbmRldSBhIHNpbnRheGUgZGUgdW0gY29tYW5kby4gQWxndW5zIGV4ZW1wbG9zIHPDo28gYXRyaWJ1acOnw6NvIGRlIHVtIGxpdGVyYWwsIG91IHVtYSBjaGFtYWRhIGRlIGZ1bsOnw6NvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBhcyBhdHJpYnVpw6fDtWVzIGRlIHNldSBwcm9ncmFtYSBlIGNlcnRpZmlxdWUtc2UgZGUgcXVlIG8gbGFkbyBlc3F1ZXJkbyDDqSB1bWEgdmFyacOhdmVsLCBlIG7Do28gdW0gbGl0ZXJhbCBvdSBmdW7Dp8Ojby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIGluZGljYSBxdWUgdm9jw6ogZXN0w6EgdGVudGFuZG8gYWNlc3NhciB1bSBlbGVtZW50byBjdWphIGNoYXZlIG7Do28gZXhpc3RlIG5vIGRpY2lvbsOhcmlvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJWb2PDqiBwb2RlIHRlciB1bSBlcnJvIGRlIGRpZ2l0YcOnw6NvIG5vIG5vbWUgZGEgc3VhIGNoYXZlLiDDiSB1bWEgYm9hIHByw6F0aWNhIGNoZWNhciBzZSBhIGNoYXZlIGV4aXN0ZSB1c2FuZG8gdW0gY29tYW5kbyAnaWYgKGNoYXZlKSBpbiBtZXVfZGljaW9uYXJpbycuIFZvY8OqIHRhbWLDqW0gcG9kZSB1c2FyIG8gY29tYW5kbyAnbWV1X2RpY2lvbmFyaW8uZ2V0KGNoYXZlLCB2YWxvclBhZHLDo28pJyBwYXJhIG9idGVyIG8gdmFsb3IgcGFkcsOjbyBhbyBpbnbDqXMgZGUgdW0gZXJybyBjYXNvIGEgY2hhdmUgbsOjbyBleGlzdGEuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yOlxuICAgICAgICAgICAgXCJWb2PDqiBlc3TDoSB0ZW50YW5kbyBhY2Vzc2FyIHVtIMOtbmRpY2UgYWzDqW0gZG8gZmluYWwgZGUgdW1hIHN0cmluZyBvdSBsaXN0YS4gUG9yIGV4ZW1wbG8sIHNlIHN1YSBsaXN0YSBwb3NzdWkgMyBlbGVtZW50b3MgbmVsYSBlIHZvY8OqIHRlbnRhIGFjZXNzYXIgbyBpdGVtIG5hIHBvc2nDp8OjbyAzIG91IG1haXMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiTGVtYnJlLXNlIHF1ZSBvIHByaW1laXJvIGVsZW1lbnRvIGRlIHVtYSBsaXN0YSBvdSBzdHJpbmcgZXN0w6Egbm8gw61uZGljZSAwLCBub3JtYWxtZW50ZSBlc3RhIG1lbnNhZ2VtIMOpIGV4aWJpZGEgcG9ycXVlIHZvY8OqIGVycm91IG8gw61uZGljZSBwb3IgMS4gRW0gdW1hIGxpc3RhIGRlIHRhbWFuaG8gMywgbyDDumx0aW1vIMOtbmRpY2UgdsOhbGlkbyDDqSAyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcjogXCJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yX2ZpeDogXCJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIGluZGljYSBxdWUgdm9jw6ogZXN0w6EgdGVudGFuZG8gaW1wb3J0YXIgdW0gbcOzZHVsbyBxdWUgbsOjbyBleGlzdGVcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVW0gcHJvYmxlbWEgcG9kZSBzZXIgYXBlbmFzIHVtIGVycm8gZGUgZGlnaXRhw6fDo28uIFRhbWLDqW0gcG9kZSBzZXIgcXVlIHZvY8OqIGVzdMOhIHRlbnRhbmRvIGltcG9ydGFyIHVtIG3Ds2R1bG8gcXVlIGV4aXN0ZSBlbSBQeXRob24gJ3JlYWwnLCBtYXMgbsOjbyBleGlzdGUgbmVzdGUgbGl2cm8uIFNlIGVzdGUgw6kgbyBjYXNvLCBwb3IgZmF2b3IgZW52aWUgdW0gcGVkaWRvIHBhcmEgdGVyIGVzc2UgbcOzZHVsbyBhZGljaW9uYWRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3I6XG4gICAgICAgICAgICBcIklzc28gcGFyZWNlIHNlciB1bSBlcnJvIGludGVybm8sIGVzcGVjaWFsbWVudGUgc2UgYSBtZW5zYWdlbSBmYXogcmVmZXLDqm5jaWEgYW8gY29uc29sZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVGVudGUgYXR1YWxpemFyIGEgcMOhZ2luYS4gU2UgbyBlcnJvIHBlcnNpc3RpciwgZW52aWUgdW0gcmVsYXTDs3JpbyBkZSBidWcganVudG8gY29tIHNldSBjw7NkaWdvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3I6XG4gICAgICAgICAgICBcIklzc28gZGl6IHF1ZSB2b2PDqiBlc3TDoSB0ZW50YW5kbyBkaXZpZGlyIHBvciAwLiBOb3JtYWxtZW50ZSDDqSBwb3JxdWUgbyB2YWxvciBkYSB2YXJpw6F2ZWwgbm8gZGVub21pbmFkb3IgZGUgdW1hIGRpdmlzw6NvIHRlbSBvIHZhbG9yIDBcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlZvY8OqIHBvZGUgcHJvdGVnZXIgY29udHJhIGRpdmlkaXIgcG9yIDAgY29tIHVtIGNvbWFuZG8gJ2lmJywgb3Ugdm9jw6ogcG9kZSBwcmVjaXNhciByZWF2YWxpYXIgc3VhcyBzdXBvc2nDp8O1ZXMgc29icmUgb3MgdmFsb3JlcyBkYXMgdmFyacOhdmVpcywgcG9pcyB1bSBjb21hbmRvIGFudGVyaW9yIHBvZGUgdGVyIGluZXNwZXJhZGFtZW50ZSBhdHJpYnXDrWRvIG8gdmFsb3IgMCBhIGVzc2EgdmFyacOhdmVsLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0YSBtZW5zYWdlbSBxdWFzZSBzZW1wcmUgYXBhcmVjZSBuYSBmb3JtYSBkZSAnVGFtYW5obyBtw6F4aW1vIGRhIHBpbGhhIGRlIGNoYW1hZGFzIGV4Y2VkaWRvJy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJJc3NvIHNlbXByZSBvY29ycmUgcXVhbmRvIHVtYSBmdW7Dp8OjbyBjaGFtYSBlbGEgbWVzbWEuIFByb3ZhdmVsbWVudGUgdm9jw6ogbsOjbyBlc3TDoSBmYXplbmRvIGlzc28gZGUgcHJvcMOzc2l0bywgZXhjZXRvIG5vIGNhcMOtdHVsbyBzb2JyZSByZWN1cnPDo28uIFNlIHZvY8OqIGVzdMOhIG5lc3NlIGNhcMOtdHVsbywgZW50w6NvIHByb3ZhdmVsbWVudGUgYWluZGEgbsOjbyBpZGVudGlmaWNvdSB1bSBib20gY2FzbyBiYXNlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBpbnRlcm5vIHBvZGUgc2lnbmlmaWNhciBxdWUgdm9jw6ogZGVzZW5jYWRlb3UgdW0gYnVnIG5vIG5vc3NvIFB5dGhvblwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlJlcG9ydGUgZXN0ZSBlcnJvIGNvbW8gdW0gYnVnLCBqdW50YW1lbnRlIGNvbSBzZXUgY8OzZGlnb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0ZSBlcnJvIG9jb3JyZSBxdWFuZG8gdm9jw6ogbsOjbyBpbmRlbnRvdSBzZXUgY8OzZGlnbyBkZXZpZGFtZW50ZS4gSXNzbyDDqSBtYWlzIHByb3bDoXZlbCBkZSBvY29ycmVyIGNvbW8gcGFydGUgZGUgdW0gY29tYW5kbyBpZiwgZm9yLCB3aGlsZSBvdSBkZWYuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlcXVlIHNldXMgY29tYW5kb3MgaWYsIGRlZiwgZm9yIGUgd2hpbGUgcGFyYSB0ZXIgY2VydGV6YSBkZSBxdWUgYXMgbGluaGFzIGVzdMOjbyBkZXZpZGFtZW50ZSBpbmRlbnRhZGFzIGFiYWl4byBkZWxhcy4gT3V0cmEgZm9udGUgZGVzdGUgZXJybyDDqSBjb3BpYXIgZSBjb2xhciBjw7NkaWdvIGVtIHF1ZSB2b2PDqiBhY2lkZW50YWxtZW50ZSBkZWl4b3UgcmVzdG9zIGRlIGPDs2RpZ28gcXVlIG7Do28gcGVydGVuY2VtIG1haXMgYWxpLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGUgZXJybyBvY29ycmUgcXVhbmRvIHZvY8OqIHRlbnRhIHVzYXIgdW1hIGZ1bsOnw6NvIGVtYnV0aWRhIGRlIFB5dGhvbiBxdWUgbsOjbyBmb2kgaW1wbGVtZW50YWRhIG5lc3RhIHZlcnPDo28gYnJvd3NlciBkZSBQeXRob24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlBvciBlbnF1YW50byBhIMO6bmljYSBtYW5laXJhIGRlIGNvbnNlcnRhciBpc3NvIMOpIG7Do28gdXNhbmRvIGEgZnVuw6fDo28uIFBvZGVtIGhhdmVyIHNvbHXDp8O1ZXMgYWx0ZXJuYXRpdmFzLiBTZSB2b2PDqiByZWFsbWVudGUgcHJlY2lzYSBkZXN0YSBmdW7Dp8OjbyBlbWJ1dGlkYSwgZW52aWUtbm9zIHVtIHJlbGF0w7NyaW8gZGUgYnVnIGUgZGlnYWMgb21vIGVzdMOhIHRlbnRhbmRvIHVzYXIgYSBmdW7Dp8Ojby5cIixcblxuICAgICAgICBtc2dfYWN0aXZlY29kZV9maWxlX25vdF9mb3VuZDogXCJBcnF1aXZvIG7Do28gZW5jb250cmFkbzogJyQxJ1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19maWxlX29yX2RpcjpcbiAgICAgICAgICAgIFwiW0Vycm8gbsK6IDJdIEFycXVpdm8gb3UgZGlyZXTDs3JpbyBpbmV4aXN0ZW50ZTogJyQxJ1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zdGFydGluZzogXCJDbGlxdWUgbm8gYm90w6NvIGRlIGV4ZWN1w6fDo28gcGFyYSBjb21lw6dhciAkMVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5aW5nOiBcIkV4ZWN1dGFuZG8gJDFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGluZ19hdWRpbzpcbiAgICAgICAgICAgIFwiQ2FycmVnYW5kbyDDoXVkaW8uIFBvciBmYXZvciwgZXNwZXJlLiBTZSBvIHRvdXIgbsOjbyBjb21lw6dhciBsb2dvLCBjbGlxdWUgZW0gJ1N0b3AgVG91cicgZSB0ZW50ZSBub3ZhbWVudGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhdXNlX2N1cnJlbnRfYXVkaW86IFwiUGF1c2FyIMOhdWRpbyBhdHVhbFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXVzZV9hdWRpbzogXCJQYXVzYXIgw6F1ZGlvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvOiBcIlJlcHJvZHV6aXIgw6F1ZGlvIHBhdXNhZG9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fcGF1c2VkOlxuICAgICAgICAgICAgXCIkMSBmb2kgcGF1c2Fkby4gQ2xpcXVlIG5vIGJvdMOjbyBkZSBleGVjdcOnw6NvIHBhcmEgcmV0b21hciBvIHRvdXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2lucHV0X3ByZzogXCJFbnRyYWRhIHBhcmEgbyBwcm9ncmFtYVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV93ZXJlX2NvbXBpbGluZ19lcnI6XG4gICAgICAgICAgICBcIkhvdXZlcmFtIGVycm9zIGFvIGNvbXBpbGFyIHNldSBjw7NkaWdvLiBWZWphIGFiYWl4by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9leGM6IFwiTGltaXRlIGRlIHRlbXBvIGV4Y2VkaWRvIG5vIHNldSBwcm9ncmFtYVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfZXJyOiBcIlVtIGVycm8gZGUgc2Vydmlkb3Igb2NvcnJldTogJDEgJDJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmc6XG4gICAgICAgICAgICBcIkNvbXBpbGFuZG8gZSBleGVjdXRhbmRvIHNldSBjw7NkaWdvLi4uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NlcnZlcl9jb21tX2VycjogXCJFcnJvIGFvIGNvbXVuaWNhciBjb20gbyBzZXJ2aWRvci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2F2ZV9ydW46IFwiU2FsdmFyICYgRXhlY3V0YXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVuZGVyOiBcIlNhbHZhciAmIFJlbmRlcml6YXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJVbSBlcnJvIGRlIGFzc2Vyw6fDo28gb2NvcnJlIHF1YW5kbyBweXRob24gZW5jb250cmEgdW0gY29tYW5kbyAnYXNzZXJ0Jy4gUHl0aG9uIGF2YWxpYSBhIGV4cHJlc3PDo28gZG8gbGFkbyBkaXJlaXRvOyBzZSDDqSB2ZXJkYWRlaXJhLCBvIHByb2dyYW1hIGNvbnRpbnVhIG5vcm1hbG1lbnRlLiBTZSDDqSBmYWxzYSwgcHl0aG9uIGdlcmEgdW0gZXJybyBlIHBhcmEgYSBleGVjdcOnw6NvLlwiICxcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlcXVlIGEgZXhwcmVzc8OjbyBkbyBsYWRvIGRpcmVpdG8gZGUgJ2Fzc2VydCcuIEVzc2EgZXhwcmVzc8OjbyDDqSBmYWxzYSBlIMOpIHByZWNpc28gdmVyaWZpY2FyIG8gbW90aXZvLiBWb2PDqiBwb2RlIHF1ZXJlciBpbXByaW1pciBjYWRhIHBhcnRlIGRhIGV4cHJlc3PDo28gZSBlbnRlbmRlciBwb3JxdWUgw6kgZmFsc2EuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfZGI6IFwiQ2FycmVnYW5kbyBiYW5jbyBkZSBkYWRvcy4uLlwiLFxuICAgIH0sXG59KTtcbiIsIiQuaTE4bigpLmxvYWQoe1xuICAgIFwic3ItQ3lybFwiOiB7XG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfaGlzdG9yeTogXCLQo9GH0LjRgtCw0Zgg0LjRgdGC0L7RgNC40ZjRg1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyOiBcItCQ0YPQtNC40L4g0YLRg9GA0LBcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGVkX2NvZGU6IFwi0JLQsNGIINC40LfQstC+0YDQvdC4INC60L7QtCDRmNC1INGD0YfQuNGC0LDQvS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fc2F2ZWRfY29kZTogXCLQndC1INC/0L7RgdGC0L7RmNC4INGB0L3QuNC80ZnQtdC9INC60L7QtC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcnVuX2NvZGU6IFwi0J/QvtC60YDQtdC90Lgg0L/RgNC+0LPRgNCw0LxcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19mZWVkYmFjazogXCLQn9GA0LjQutCw0LbQuCDRgNC10LfRg9C70YLQsNGCXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZTogXCLQn9GA0LjQutCw0LbQuCDQutC+0LRcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlOiBcItCX0LDRgtCy0L7RgNC4INC60L7QtFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVsZW5zOiBcItCa0L7RgNCw0Log0L/QviDQutC+0YDQsNC6XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnM6IFwi0JrQvtGA0LDQuiDQv9C+INC60L7RgNCw0LpcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlbGVuczogXCLQl9Cw0YLQstC+0YDQuCDQutC+0YDQsNC6INC/0L4g0LrQvtGA0LDQulwiLFxuXG4gICAgICAgIG1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yOlxuICAgICAgICAgICAgXCLQodC40L3RgtCw0LrRgdC90LAg0LPRgNC10YjQutCwIChwYXJzZSBlcnJvcikg0LfQvdCw0YfQuCDQtNCwINCf0LDRmNGC0L7QvSDQvdC1INGA0LDQt9GD0LzQtSDRgdC40L3RgtCw0LrRgdGDINGDINC70LjQvdC40ZjQuCDQutC+0LPQsCDQvdCwINC60L7RmNGDINC/0L7RgNGD0LrQsCDQviDQs9GA0LXRiNGG0Lgg0YPQutCw0LfRg9GY0LUuINCi0LjQv9C40YfQvdC4INC/0YDQuNC80LXRgNC4INC+0LLQsNC60LLQtSDQs9GA0LXRiNC60LUg0YHRgyDQt9Cw0LHQvtGA0LDQstC70ZjQtdC90LAg0LTQstC+0YLQsNGH0LrQsCDQutC+0LQgJ2lmJyDQuNC70LggJ2Zvcicg0LjRgdC60LDQt9CwINC40LvQuCDQt9Cw0LHQvtGA0LDQstGZ0LXQvdCwINC30LDQv9C10YLQsCDQuNC30LzQtdGS0YMg0LDRgNCz0YPQvNC10L3QsNGC0LAg0LrQvtC0INC/0L7Qt9C40LLQsCDRhNGD0L3QutGG0LjRmNC1XCIsXG4gICAgICAgIG1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwi0JTQsCDQsdC40YHRgtC1INC40YHQv9GA0LDQstC40LvQuCDRgdC40L3RgtCw0LrRgdC90YMg0LPRgNC10YjQutGDINGC0YDQtdCx0LAg0L/QsNC20ZrQuNCy0L4g0LTQsCDQv9C+0LPQu9C10LTQsNGC0LUg0LvQuNC90LjRmNGDINC40LfQstC+0YDQvdC+0LMg0LrQvtC00LAg0L3QsCDQutC+0ZjRgyDRg9C60LDQt9GD0ZjQtSDQv9C+0YDRg9Cz0LAg0L4g0LPRgNC10YjRhtC4INC4INC80L7QttC00LAg0L/RgNC10YLRhdC+0LTQvdGDINC70LjQvdC40L3RgyDQuNC30LLQvtGA0L3QvtCzINC60L7QtNCwLiDQn9GA0L7QstC10YDQuNGC0LUg0LTQsCDQu9C4INGB0YMg0L/QvtGI0YLQvtCy0LDQvdCwINGB0LLQsCDRgdC40L3RgtCw0LrRgdC90LAg0L/RgNCw0LLQuNC70LAg0J/QsNGY0YLQvtC90LAuXCIsXG4gICAgfSxcbn0pO1xuIiwiLyoqXG4gKlxuICogQ3JlYXRlZCBieSBibWlsbGVyIG9uIDMvMTkvMTUuXG4gKi9cbi8qIERlZmluZSBnbG9iYWwgdmFyaWFibGVzIGZvciBFU0xpbnQgKi9cbi8qIGdsb2JhbCBTayAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XG5pbXBvcnQgQXVkaW9Ub3VyIGZyb20gXCIuL2F1ZGlvdG91ci5qc1wiO1xuaW1wb3J0IFwiLi9hY3RpdmVjb2RlLWkxOG4uZW4uanNcIjtcbmltcG9ydCBcIi4vYWN0aXZlY29kZS1pMThuLnB0LWJyLmpzXCI7XG5pbXBvcnQgXCIuL2FjdGl2ZWNvZGUtaTE4bi5zci1DeXJsLmpzXCI7XG5pbXBvcnQgQ29kZU1pcnJvciBmcm9tIFwiY29kZW1pcnJvclwiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL3B5dGhvbi9weXRob24uanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9jc3MvY3NzLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvaHRtbG1peGVkL2h0bWxtaXhlZC5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL3htbC94bWwuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvY2xpa2UvY2xpa2UuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9vY3RhdmUvb2N0YXZlLmpzXCI7XG5pbXBvcnQgXCIuLy4uL2Nzcy9hY3RpdmVjb2RlLmNzc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9saWIvY29kZW1pcnJvci5jc3NcIjtcbmltcG9ydCBcIi4vc2t1bHB0Lm1pbi5qc1wiO1xuaW1wb3J0IFwiLi9za3VscHQtc3RkbGliLmpzXCI7XG4vLyBVc2VkIGJ5IFNrdWxwdC5cbmltcG9ydCBlbWJlZCBmcm9tIFwidmVnYS1lbWJlZFwiO1xuLy8gQWRhcHQgZm9yIHVzZSBvdXRzaWRlIHdlYnBhY2sgLS0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtZW1iZWQuXG53aW5kb3cudmVnYUVtYmVkID0gZW1iZWQ7XG5cbnZhciBpc01vdXNlRG93biA9IGZhbHNlO1xuZG9jdW1lbnQub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgaXNNb3VzZURvd24gPSB0cnVlO1xufTtcblxuZG9jdW1lbnQub25tb3VzZXVwID0gZnVuY3Rpb24gKCkge1xuICAgIGlzTW91c2VEb3duID0gZmFsc2U7XG59O1xud2luZG93LmVkTGlzdCA9IHt9O1xuXG52YXIgc29ja2V0LCBjb25uZWN0aW9uLCBkb2M7XG52YXIgY2hhdGNvZGVzU2VydmVyID0gXCJjaGF0LmNvZGVzXCI7XG5cbi8vIHNlcGFyYXRlIGludG8gY29uc3RydWN0b3IgYW5kIGluaXRcbmV4cG9ydCBjbGFzcyBBY3RpdmVDb2RlIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdmFyIHN1ZmZTdGFydDtcbiAgICAgICAgdmFyIG9yaWcgPSAkKG9wdHMub3JpZykuZmluZChcInRleHRhcmVhXCIpWzBdO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IG9wdHMub3JpZztcbiAgICAgICAgdGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcyA9IG9wdHMudXNlUnVuZXN0b25lU2VydmljZXM7XG4gICAgICAgIHRoaXMucHl0aG9uMyA9IG9wdHMucHl0aG9uMztcbiAgICAgICAgdGhpcy5hbGlnblZlcnRpY2FsID0gb3B0cy52ZXJ0aWNhbDtcbiAgICAgICAgdGhpcy5vcmlnRWxlbSA9IG9yaWc7XG4gICAgICAgIHRoaXMub3JpZ1RleHQgPSB0aGlzLm9yaWdFbGVtLnRleHRDb250ZW50O1xuICAgICAgICB0aGlzLmRpdmlkID0gb3B0cy5vcmlnLmlkO1xuICAgICAgICB0aGlzLmNvZGUgPSAkKG9yaWcpLnRleHQoKSB8fCBcIlxcblxcblxcblxcblxcblwiO1xuICAgICAgICB0aGlzLmxhbmd1YWdlID0gJChvcmlnKS5kYXRhKFwibGFuZ1wiKTtcbiAgICAgICAgdGhpcy50aW1lbGltaXQgPSAkKG9yaWcpLmRhdGEoXCJ0aW1lbGltaXRcIik7XG4gICAgICAgIHRoaXMuaW5jbHVkZXMgPSAkKG9yaWcpLmRhdGEoXCJpbmNsdWRlXCIpO1xuICAgICAgICB0aGlzLmhpZGVjb2RlID0gJChvcmlnKS5kYXRhKFwiaGlkZWNvZGVcIik7XG4gICAgICAgIHRoaXMuY2hhdGNvZGVzID0gJChvcmlnKS5kYXRhKFwiY2hhdGNvZGVzXCIpO1xuICAgICAgICB0aGlzLmhpZGVoaXN0b3J5ID0gJChvcmlnKS5kYXRhKFwiaGlkZWhpc3RvcnlcIik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSAkKG9wdHMub3JpZykuZmluZChgIyR7dGhpcy5kaXZpZH1fcXVlc3Rpb25gKVswXTtcbiAgICAgICAgdGhpcy50aWUgPSAkKG9yaWcpLmRhdGEoXCJ0aWVcIik7XG4gICAgICAgIHRoaXMuZGJ1cmwgPSAkKG9yaWcpLmRhdGEoXCJkYnVybFwiKTtcbiAgICAgICAgdGhpcy5weXRob24zX2ludGVycHJldGVyID0gJChvcmlnKS5kYXRhKFwicHl0aG9uM19pbnRlcnByZXRlclwiKTtcbiAgICAgICAgdGhpcy5ydW5CdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLmVuYWJsZWRvd25sb2FkID0gJChvcmlnKS5kYXRhKFwiZW5hYmxlZG93bmxvYWRcIik7XG4gICAgICAgIHRoaXMuZG93bmxvYWRCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5zYXZlQnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2FkQnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5vdXRlckRpdiA9IG51bGw7XG4gICAgICAgIHRoaXMucGFydG5lciA9IFwiXCI7XG4gICAgICAgIHRoaXMubG9nUmVzdWx0cyA9IHRydWU7XG4gICAgICAgIGlmICghZUJvb2tDb25maWcuYWxsb3dfcGFpcnMgfHwgJChvcmlnKS5kYXRhKFwibm9wYWlyXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZVBhcnRuZXIgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUGFydG5lciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRwdXQgPSBudWxsOyAvLyBjcmVhdGUgcHJlIGZvciBvdXRwdXRcbiAgICAgICAgdGhpcy5ncmFwaGljcyA9IG51bGw7IC8vIGNyZWF0ZSBkaXYgZm9yIHR1cnRsZSBncmFwaGljc1xuICAgICAgICB0aGlzLmNvZGVjb2FjaCA9IG51bGw7XG4gICAgICAgIHRoaXMuY29kZWxlbnMgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbnRyb2xEaXYgPSBudWxsO1xuICAgICAgICB0aGlzLmhpc3RvcnlTY3J1YmJlciA9IG51bGw7XG4gICAgICAgIHRoaXMudGltZXN0YW1wcyA9IFtcIk9yaWdpbmFsXCJdO1xuICAgICAgICB0aGlzLmF1dG9ydW4gPSAkKG9yaWcpLmRhdGEoXCJhdXRvcnVuXCIpO1xuICAgICAgICBpZiAodGhpcy5jaGF0Y29kZXMgJiYgZUJvb2tDb25maWcuZW5hYmxlX2NoYXRjb2Rlcykge1xuICAgICAgICAgICAgaWYgKCFzb2NrZXQpIHtcbiAgICAgICAgICAgICAgICBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KFwid3NzOi8vXCIgKyBjaGF0Y29kZXNTZXJ2ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IG5ldyB3aW5kb3cuc2hhcmVkYi5Db25uZWN0aW9uKHNvY2tldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgICAgIGRvYyA9IGNvbm5lY3Rpb24uZ2V0KFwiY2hhdGNvZGVzXCIsIFwiY2hhbm5lbHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ3JhZGVyYWN0aXZlIHx8IHRoaXMuaXNUaW1lZCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlY29kZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmluY2x1ZGVzKSB7XG4gICAgICAgICAgICB0aGlzLmluY2x1ZGVzID0gdGhpcy5pbmNsdWRlcy5zcGxpdCgvXFxzKy8pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcmVmaXhFbmQgPSB0aGlzLmNvZGUuaW5kZXhPZihcIl5eXl5cIik7XG4gICAgICAgIGlmIChwcmVmaXhFbmQgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5wcmVmaXggPSB0aGlzLmNvZGUuc3Vic3RyaW5nKDAsIHByZWZpeEVuZCk7XG4gICAgICAgICAgICB0aGlzLmNvZGUgPSB0aGlzLmNvZGUuc3Vic3RyaW5nKHByZWZpeEVuZCArIDUpO1xuICAgICAgICB9XG4gICAgICAgIHN1ZmZTdGFydCA9IHRoaXMuY29kZS5pbmRleE9mKFwiPT09PVwiKTtcbiAgICAgICAgaWYgKHN1ZmZTdGFydCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnN1ZmZpeCA9IHRoaXMuY29kZS5zdWJzdHJpbmcoc3VmZlN0YXJ0ICsgNSk7XG4gICAgICAgICAgICB0aGlzLmNvZGUgPSB0aGlzLmNvZGUuc3Vic3RyaW5nKDAsIHN1ZmZTdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaXN0b3J5ID0gW3RoaXMuY29kZV07XG4gICAgICAgIHRoaXMuY3JlYXRlRWRpdG9yKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlT3V0cHV0KCk7XG4gICAgICAgIHRoaXMuY3JlYXRlQ29udHJvbHMoKTtcbiAgICAgICAgaWYgKCQob3JpZykuZGF0YShcImNhcHRpb25cIikpIHtcbiAgICAgICAgICAgIHRoaXMuY2FwdGlvbiA9ICQob3JpZykuZGF0YShcImNhcHRpb25cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhcHRpb24gPSBcIkFjdGl2ZUNvZGVcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZENhcHRpb24oXCJydW5lc3RvbmVcIik7XG4gICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgMTAwMFxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5hdXRvcnVuKSB7XG4gICAgICAgICAgICAvLyBTaW11bGF0ZSBwcmVzc2luZyB0aGUgcnVuIGJ1dHRvbiwgc2luY2UgdGhpcyB3aWxsIGFsc28gcHJldmVudCB0aGUgdXNlciBmcm9tIGNsaWNraW5nIGl0IHVudGlsIHRoZSBpbml0aWFsIHJ1biBpcyBjb21wbGV0ZSwgYW5kIGFsc28gaGVscCB0aGUgdXNlciB1bmRlcnN0YW5kIHdoeSB0aGV5J3JlIHdhaXRpbmcuXG4gICAgICAgICAgICAkKGRvY3VtZW50KS5yZWFkeSh0aGlzLnJ1bkJ1dHRvbkhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRpY2F0ZV9jb21wb25lbnRfcmVhZHkoKTtcbiAgICB9XG5cbiAgICBjcmVhdGVFZGl0b3IoaW5kZXgpIHtcbiAgICAgICAgdGhpcy5vdXRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciBsaW5rZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgbGlua2Rpdi5pZCA9IHRoaXMuZGl2aWQucmVwbGFjZSgvXy9nLCBcIi1cIikudG9Mb3dlckNhc2UoKTsgLy8gOnJlZjogY2hhbmdlcyBfIHRvIC0gc28gYWRkIHRoaXMgYXMgYSB0YXJnZXRcbiAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5hZGRDbGFzcyhcImFjX3NlY3Rpb24gYWxlcnQgYWxlcnQtd2FybmluZ1wiKTtcbiAgICAgICAgdmFyIGNvZGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNvZGVEaXYpLmFkZENsYXNzKFwiYWNfY29kZV9kaXYgY29sLW1kLTEyXCIpO1xuICAgICAgICB0aGlzLmNvZGVEaXYgPSBjb2RlRGl2O1xuICAgICAgICB0aGlzLm91dGVyRGl2LmxhbmcgPSB0aGlzLmxhbmd1YWdlO1xuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMub3V0ZXJEaXYpO1xuICAgICAgICBpZiAobGlua2Rpdi5pZCAhPT0gdGhpcy5kaXZpZCkge1xuICAgICAgICAgICAgLy8gRG9uJ3Qgd2FudCB0aGUgJ2V4dHJhJyB0YXJnZXQgaWYgdGhleSBtYXRjaC5cbiAgICAgICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQobGlua2Rpdik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjb2RlRGl2KTtcbiAgICAgICAgdmFyIGVkbW9kZSA9IHRoaXMub3V0ZXJEaXYubGFuZztcbiAgICAgICAgaWYgKGVkbW9kZSA9PT0gXCJzcWxcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJ0ZXh0L3gtc3FsXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcImphdmFcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJ0ZXh0L3gtamF2YVwiO1xuICAgICAgICB9IGVsc2UgaWYgKGVkbW9kZSA9PT0gXCJjcHBcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJ0ZXh0L3gtYysrc3JjXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcImNcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJ0ZXh0L3gtY3NyY1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGVkbW9kZSA9PT0gXCJweXRob24zXCIpIHtcbiAgICAgICAgICAgIGVkbW9kZSA9IFwicHl0aG9uXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcIm9jdGF2ZVwiIHx8IGVkbW9kZSA9PT0gXCJNQVRMQUJcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJ0ZXh0L3gtb2N0YXZlXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmRpdmlkKSAhPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZGl2aWQpO1xuXG4gICAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY29kZSxcbiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxuICAgICAgICAgICAgbW9kZTogZWRtb2RlLFxuICAgICAgICAgICAgaW5kZW50VW5pdDogNCxcbiAgICAgICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsXG4gICAgICAgICAgICBhdXRvTWF0Y2hQYXJlbnM6IHRydWUsXG4gICAgICAgICAgICBleHRyYUtleXM6IHtcbiAgICAgICAgICAgICAgICBUYWI6IFwiaW5kZW50TW9yZVwiLFxuICAgICAgICAgICAgICAgIFwiU2hpZnQtVGFiXCI6IFwiaW5kZW50TGVzc1wiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvcihjb2RlRGl2LG9wdHMgKTtcbiAgICAgICAgXG4gICAgICAgIC8vIE1ha2UgdGhlIGVkaXRvciByZXNpemFibGVcbiAgICAgICAgJChlZGl0b3IuZ2V0V3JhcHBlckVsZW1lbnQoKSkucmVzaXphYmxlKHtcbiAgICAgICAgICAgIHJlc2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGVkaXRvci5zZXRTaXplKCQodGhpcykud2lkdGgoKSwgJCh0aGlzKS5oZWlnaHQoKSk7XG4gICAgICAgICAgICAgICAgZWRpdG9yLnJlZnJlc2goKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnaXZlIHRoZSB1c2VyIGEgdmlzdWFsIGN1ZSB0aGF0IHRoZXkgaGF2ZSBjaGFuZ2VkIGJ1dCBub3Qgc2F2ZWRcbiAgICAgICAgZWRpdG9yLm9uKFxuICAgICAgICAgICAgXCJjaGFuZ2VcIixcbiAgICAgICAgICAgIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmFjRWRpdEV2ZW50ID09IGZhbHNlIHx8XG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5hY0VkaXRFdmVudCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBldmVudHMgY2FuIGNvbWUgYmVmb3JlIGFueSByZWFsIGNoYW5nZXMgZm9yIHZhcmlvdXMgcmVhc29ucywgc29tZSB1bmtub3duXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYXZvaWRzIHVubmVjY3NhcnkgbG9nIGV2ZW50cyBhbmQgdXBkYXRlcyB0byB0aGUgYWN0aXZpdHkgY291bnRlclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcmlnVGV4dCA9PT0gZWRpdG9yLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAkKGVkaXRvci5nZXRXcmFwcGVyRWxlbWVudCgpKS5jc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci10b3BcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiMnB4IHNvbGlkICNiNDMyMzJcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAkKGVkaXRvci5nZXRXcmFwcGVyRWxlbWVudCgpKS5jc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci1ib3R0b21cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiMnB4IHNvbGlkICNiNDMyMzJcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQW5zd2VyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogXCJhY3RpdmVjb2RlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Q6IFwiZWRpdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWRpdG9yLmFjRWRpdEV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApOyAvLyB1c2UgYmluZCB0byBwcmVzZXJ2ZSAqdGhpcyogaW5zaWRlIHRoZSBvbiBoYW5kbGVyLlxuICAgICAgICAvL1NvbHZpbmcgS2V5Ym9hcmQgVHJhcCBvZiBBY3RpdmVDb2RlOiBJZiB1c2VyIHVzZSB0YWIgZm9yIG5hdmlnYXRpb24gb3V0c2lkZSBvZiBBY3RpdmVDb2RlLCB0aGVuIGNoYW5nZSB0YWIgYmVoYXZpb3IgaW4gQWN0aXZlQ29kZSB0byBlbmFibGUgdGFiIHVzZXIgdG8gdGFiIG91dCBvZiB0aGUgdGV4dGFyZWFcbiAgICAgICAgJCh3aW5kb3cpLmtleWRvd24oZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHZhciBjb2RlID0gZS5rZXlDb2RlID8gZS5rZXlDb2RlIDogZS53aGljaDtcbiAgICAgICAgICAgIGlmIChjb2RlID09IDkgJiYgJChcInRleHRhcmVhOmZvY3VzXCIpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGVkaXRvci5zZXRPcHRpb24oXCJleHRyYUtleXNcIiwge1xuICAgICAgICAgICAgICAgICAgICBUYWI6IGZ1bmN0aW9uIChjbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZXN0KFwiLnRhYi1jb250ZW50XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHRTaWJsaW5nLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFwiU2hpZnQtVGFiXCI6IGZ1bmN0aW9uIChjbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZXN0KFwiLnRhYi1jb250ZW50XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByZXZpb3VzU2libGluZy5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7XG4gICAgICAgIGlmICh0aGlzLmhpZGVjb2RlKSB7XG4gICAgICAgICAgICAkKHRoaXMuY29kZURpdikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBydW5CdXR0b25IYW5kbGVyKCkge1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBydW4gYnV0dG9uIHVudGlsIHRoZSBydW4gaXMgZmluaXNoZWQuICAgIFxuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1blByb2coKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYHRoZXJlIHdhcyBhbiBlcnJvciAke2V9IHJ1bm5pbmcgdGhlIGNvZGVgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sb2dSZXN1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0N1cnJlbnRBbnN3ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlckZlZWRiYWNrKCk7XG4gICAgICAgIC8vIFRoZSBydW4gaXMgZmluaXNoZWQ7IHJlLWVuYWJsZSB0aGUgYnV0dG9uLlxuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNyZWF0ZUNvbnRyb2xzKCkge1xuICAgICAgICB2YXIgY3RybERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciBidXR0O1xuICAgICAgICAkKGN0cmxEaXYpLmFkZENsYXNzKFwiYWNfYWN0aW9uc1wiKTtcbiAgICAgICAgJChjdHJsRGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgLy8gUnVuXG4gICAgICAgIGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcnVuX2NvZGVcIikpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIGJ0bi1zdWNjZXNzIHJ1bi1idXR0b25cIik7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgIHRoaXMucnVuQnV0dG9uID0gYnV0dDtcbiAgICAgICAgY29uc29sZS5sb2coXCJhZGRpbmcgY2xpY2sgZnVuY3Rpb24gZm9yIHJ1blwiKTtcbiAgICAgICAgdGhpcy5ydW5CdXR0b24ub25jbGljayA9IHRoaXMucnVuQnV0dG9uSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuXG4gICAgICAgIHRoaXMuYWRkUmVzZXRCdXR0b24oY3RybERpdik7XG5cbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlZG93bmxvYWQgfHwgZUJvb2tDb25maWcuZG93bmxvYWRzRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5hZGREb3dubG9hZEJ1dHRvbihjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaGlkZWNvZGUgJiYgIXRoaXMuaGlkZWhpc3RvcnkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSGlzdG9yeUJ1dHRvbihjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiZ3JhZGVidXR0b25cIikgJiYgIXRoaXMuZ3JhZGVyYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEZlZWRiYWNrQnV0dG9uKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNob3cvSGlkZSBDb2RlXG4gICAgICAgIGlmICh0aGlzLmhpZGVjb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUhpZGVTaG93KGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvZGVMZW5zXG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJjb2RlbGVuc1wiKSAmJiAhdGhpcy5ncmFkZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlQ29kZUxlbnMoY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXVkaW8gVG91clxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiYXVkaW9cIikpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlQXVkaW9Ub3VycyhjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZUJvb2tDb25maWcuaXNJbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUluc3RydWN0b3JTaGFyaW5nKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVBhcnRuZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBQYXJ0bmVyKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNoYXRjb2RlcyAmJiBlQm9va0NvbmZpZy5lbmFibGVfY2hhdGNvZGVzKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUNoYXRDb2RlcyhjdHJsRGl2KTtcbiAgICAgICAgfVxuXG4gICAgICAgICQodGhpcy5vdXRlckRpdikucHJlcGVuZChjdHJsRGl2KTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24pIHtcbiAgICAgICAgICAgIGlmICgkKHRoaXMucXVlc3Rpb24pLmh0bWwoKS5tYXRjaCgvXlxccyskLykpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMucXVlc3Rpb24pLnJlbW92ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLnByZXBlbmQodGhpcy5xdWVzdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sRGl2ID0gY3RybERpdjtcbiAgICB9XG5cbiAgICBhZGRGZWVkYmFja0J1dHRvbihjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2ZlZWRiYWNrXCIpKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgIHRoaXMuZ3JhZGVCdXR0b24gPSBidXR0O1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMuY3JlYXRlR3JhZGVTdW1tYXJ5LmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGFkZEhpc3RvcnlCdXR0b24oY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9sb2FkX2hpc3RvcnlcIikpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICB0aGlzLmhpc3RCdXR0b24gPSBidXR0O1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyLmJpbmQodGhpcykpO1xuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkRG93bmxvYWRCdXR0b24oY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkudGV4dChcIkRvd25sb2FkXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIHNhdmUtYnV0dG9uXCIpO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICB0aGlzLmRvd25sb2FkQnV0dG9uID0gYnV0dDtcbiAgICAgICAgJChidXR0KS5jbGljayh0aGlzLmRvd25sb2FkRmlsZS5iaW5kKHRoaXMsIHRoaXMubGFuZ3VhZ2UpKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICB9XG5cbiAgICBhZGRSZXNldEJ1dHRvbihjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KFwiUmVzZXRcIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgIHRoaXMucmVzZXRCdXR0b24gPSBidXR0O1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMucmVzZXRDb2RlLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGVuYWJsZUhpZGVTaG93KGN0cmxEaXYpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVcIikpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5zaG93SGlkZUJ1dHQgPSBidXR0O1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICQodGhpcy5jb2RlRGl2KS50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaXN0b3J5U2NydWJiZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEhpc3RvcnlTY3J1YmJlcih0cnVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyLnBhcmVudEVsZW1lbnQpLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5zaG93SGlkZUJ1dHQpLnRleHQoKSA9PVxuICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnNob3dIaWRlQnV0dCkudGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZVwiKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5zaG93SGlkZUJ1dHQpLnRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVcIilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZW5hYmxlQ29kZUxlbnMoY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJhY19vcHQgYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlbGVuc1wiKSk7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICB0aGlzLmNsQnV0dG9uID0gYnV0dDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgJChidXR0KS5jbGljayh0aGlzLnNob3dDb2RlbGVucy5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBlbmFibGVBdWRpb1RvdXJzKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2F1ZGlvX3RvdXJcIikpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgdGhpcy5hdEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgICQoYnV0dCkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbmV3IEF1ZGlvVG91cihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlLFxuICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJhdWRpb1wiKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBlbmFibGVJbnN0cnVjdG9yU2hhcmluZyhjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBidG4taW5mb1wiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KFwiU2hhcmUgQ29kZVwiKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgIHRoaXMuc2hhcmVCdXR0ID0gYnV0dDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgJChidXR0KS5jbGljayhcbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFjb25maXJtKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJZb3UgYXJlIGFib3V0IHRvIHNoYXJlIHRoaXMgY29kZSB3aXRoIEFMTCBvZiB5b3VyIHN0dWRlbnRzLiAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlP1wiXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGl2aWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IHRoaXMuZWRpdG9yLmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIGxhbmc6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KFxuICAgICAgICAgICAgICAgICAgICBlQm9va0NvbmZpZy5hamF4VVJMICsgXCJicm9hZGNhc3RfY29kZS5qc29uXCIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGxldCBwb3N0X3Byb21pc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdHVzID0gYXdhaXQgcG9zdF9wcm9taXNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLm1lc3MgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KGBTaGFyZWQgQ29kZSB3aXRoICR7c3RhdHVzLnNoYXJlX2NvdW50fSBzdHVkZW50c2ApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KFwiU2hhcmluZyBGYWlsZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dXBQYXJ0bmVyKGN0cmxEaXYpIHtcbiAgICAgICAgdmFyIGNoZWNrUGFydG5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgY2hlY2tQYXJ0bmVyLnR5cGUgPSBcImNoZWNrYm94XCI7XG4gICAgICAgIGNoZWNrUGFydG5lci5pZCA9IGAke3RoaXMuZGl2aWR9X3BhcnRgO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGNoZWNrUGFydG5lcik7XG4gICAgICAgIHZhciBwbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XG4gICAgICAgIHBsYWJlbC5mb3IgPSBgJHt0aGlzLmRpdmlkfV9wYXJ0YDtcbiAgICAgICAgJChwbGFiZWwpLnRleHQoXCJQYWlyP1wiKTtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChwbGFiZWwpO1xuICAgICAgICAkKGNoZWNrUGFydG5lcikuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFydG5lcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRuZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgJChwYXJ0bmVyVGV4dEJveCkuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRuZXIgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyVGV4dEJveC52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICQocGxhYmVsKS50ZXh0KFwiUGFpcj9cIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZEFncmVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJ0bmVyQWdyZWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGlkQWdyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZEFncmVlID0gY29uZmlybShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlBhaXIgUHJvZ3JhbW1pbmcgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBjb25zZW50IG9mIHlvdXIgaW5zdHJ1Y3Rvci5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiWW91ciBwYXJ0bmVyIG11c3QgYmUgYSByZWdpc3RlcmVkIG1lbWJlciBvZiB0aGUgY2xhc3MgYW5kIGhhdmUgYWdyZWVkIHRvIHBhaXIgd2l0aCB5b3UuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkJ5IGNsaWNraW5nIE9LIHlvdSBjZXJ0aWZ5IHRoYXQgYm90aCBvZiB0aGVzZSBjb25kaXRpb25zIGhhdmUgYmVlbiBtZXQuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlkQWdyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInBhcnRuZXJBZ3JlZVwiLCBcInRydWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRuZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAkKHBsYWJlbCkudGV4dChcIndpdGg6IFwiKTtcbiAgICAgICAgICAgICAgICAgICAgJChwYXJ0bmVyVGV4dEJveCkuc2hvdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICB2YXIgcGFydG5lclRleHRCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgIHBhcnRuZXJUZXh0Qm94LnR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChwYXJ0bmVyVGV4dEJveCk7XG4gICAgICAgICQocGFydG5lclRleHRCb3gpLmhpZGUoKTtcbiAgICAgICAgJChwYXJ0bmVyVGV4dEJveCkuY2hhbmdlKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFydG5lciA9IHBhcnRuZXJUZXh0Qm94LnZhbHVlO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBwcm9iYWJseSBvYnNvbGV0ZS4gIE5vdCBzdXJlIGlmIGFueW9uZSBhdCBNaWNoaWdhbiB3aWxsIGNvbWUgYmFja1xuICAgIC8vIHRvIHdvcmtpbmcgb24gdGhpcyBhZ2Fpbi5cbiAgICBlbmFibGVDaGF0Q29kZXMoY3RybERpdikge1xuICAgICAgICB2YXIgY2hhdEJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciBjaGFubmVscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICB2YXIgdG9waWMgPSB3aW5kb3cubG9jYXRpb24uaG9zdCArIFwiLVwiICsgdGhpcy5kaXZpZDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChjaGF0QmFyKTtcbiAgICAgICAgJChjaGF0QmFyKS50ZXh0KFwiQ2hhdDogXCIpO1xuICAgICAgICAkKGNoYXRCYXIpLmFwcGVuZChjaGFubmVscyk7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJhY19vcHQgYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoXCJDcmVhdGUgQ2hhbm5lbFwiKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInRhcmdldFwiLCBcIl9ibGFua1wiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFxuICAgICAgICAgICAgXCJocmVmXCIsXG4gICAgICAgICAgICBcImh0dHA6Ly9cIiArXG4gICAgICAgICAgICAgICAgY2hhdGNvZGVzU2VydmVyICtcbiAgICAgICAgICAgICAgICBcIi9uZXc/XCIgK1xuICAgICAgICAgICAgICAgICQucGFyYW0oe1xuICAgICAgICAgICAgICAgICAgICB0b3BpYzogd2luZG93LmxvY2F0aW9uLmhvc3QgKyBcIi1cIiArIHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IHRoaXMuZWRpdG9yLmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIGxhbmc6IFwiUHl0aG9uXCIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jaGF0QnV0dG9uID0gYnV0dDtcbiAgICAgICAgY2hhdEJhci5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgdmFyIHVwZGF0ZUNoYXRDb2Rlc0NoYW5uZWxzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBkb2MuZGF0YTtcbiAgICAgICAgICAgIHZhciBpID0gMTtcbiAgICAgICAgICAgICQoY2hhbm5lbHMpLmh0bWwoXCJcIik7XG4gICAgICAgICAgICBkYXRhW1wiY2hhbm5lbHNcIl0uZm9yRWFjaChmdW5jdGlvbiAoY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIGlmICghY2hhbm5lbC5hcmNoaXZlZCAmJiB0b3BpYyA9PT0gY2hhbm5lbC50b3BpYykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGluayA9ICQoXCI8YSAvPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhyZWYgPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJodHRwOi8vXCIgKyBjaGF0Y29kZXNTZXJ2ZXIgKyBcIi9cIiArIGNoYW5uZWwuY2hhbm5lbE5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGxpbmsuYXR0cih7XG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmOiBocmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgbGluay50ZXh0KFwiIFwiICsgY2hhbm5lbC5jaGFubmVsTmFtZSArIFwiKFwiICsgaSArIFwiKSBcIik7XG4gICAgICAgICAgICAgICAgICAgICQoY2hhbm5lbHMpLmFwcGVuZChsaW5rKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAkKGNoYW5uZWxzKS50ZXh0KFwiKG5vIGFjdGl2ZSBjb252ZXJzdGF0aW9ucyBvbiB0aGlzIHByb2JsZW0pXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBkb2Muc3Vic2NyaWJlKHVwZGF0ZUNoYXRDb2Rlc0NoYW5uZWxzKTtcbiAgICAgICAgZG9jLm9uKFwib3BcIiwgdXBkYXRlQ2hhdENvZGVzQ2hhbm5lbHMpO1xuICAgIH1cblxuICAgIGVuYWJsZVNhdmVMb2FkKCkge1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3NhdmVfcnVuXCIpKTtcbiAgICB9XG5cbiAgICAvLyBBY3RpdmVjb2RlIC0tIElmIHRoZSBjb2RlIGhhcyBub3QgY2hhbmdlZCB3cnQgdGhlIHNjcnViYmVyIHBvc2l0aW9uIHZhbHVlIHRoZW4gZG9uJ3Qgc2F2ZSB0aGUgY29kZSBvciByZXBvc2l0aW9uIHRoZSBzY3J1YmJlclxuICAgIC8vICAtLSBzdGlsbCBjYWxsIHJ1bmxvZywgYnV0IGFkZCBhIHBhcmFtZXRlciB0byBub3Qgc2F2ZSB0aGUgY29kZVxuICAgIC8vIGFkZCBhbiBpbml0aWFsIGxvYWQgaGlzdG9yeSBidXR0b25cbiAgICAvLyBpZiB0aGVyZSBpcyBubyBlZGl0IHRoZW4gdGhlcmUgaXMgbm8gYXBwZW5kICAgdG9fc2F2ZSAoVHJ1ZS9GYWxzZSlcbiAgICBhc3luYyBhZGRIaXN0b3J5U2NydWJiZXIocG9zX2xhc3QpIHtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB2YXIgcmVxRGF0YSA9IHtcbiAgICAgICAgICAgIGFjaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnNpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXFEYXRhW1wic2lkXCJdID0gdGhpcy5zaWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coXCJiZWZvcmUgZ2V0IGhpc3RcIik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGVCb29rQ29uZmlnLnByYWN0aWNlX21vZGUgfHxcbiAgICAgICAgICAgICh0aGlzLmlzVGltZWQgJiYgIXRoaXMuYXNzZXNzbWVudFRha2VuKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGltZWQgYW5kIGFscmVhZHkgdGFrZW4gd2Ugc2hvdWxkIHJlc3RvcmUgaGlzdG9yeSBpbmZvXG4gICAgICAgICAgICB0aGlzLnJlbmRlclNjcnViYmVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcImdldGhpc3QuanNvblwiLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcURhdGEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGlzdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlzdG9yeSA9IHRoaXMuaGlzdG9yeS5jb25jYXQoZGF0YS5oaXN0b3J5KTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdCBpbiBkYXRhLnRpbWVzdGFtcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXN0YW1wcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKGRhdGEudGltZXN0YW1wc1t0XSkudG9Mb2NhbGVTdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInVuYWJsZSB0byBmZXRjaCBoaXN0b3J5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZW5kZXJTY3J1YmJlcihwb3NfbGFzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwic3VjY2Vzc1wiO1xuICAgIH1cblxuICAgIHJlbmRlclNjcnViYmVyKHBvc19sYXN0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwibWFraW5nIGEgbmV3IHNjcnViYmVyXCIpO1xuICAgICAgICB2YXIgc2NydWJiZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKHNjcnViYmVyRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwiaW5saW5lLWJsb2NrXCIpO1xuICAgICAgICAkKHNjcnViYmVyRGl2KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoc2NydWJiZXJEaXYpLmNzcyhcIm1hcmdpbi1yaWdodFwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoc2NydWJiZXJEaXYpLmNzcyh7XG4gICAgICAgICAgICBcIm1pbi13aWR0aFwiOiBcIjIwMHB4XCIsXG4gICAgICAgICAgICBcIm1heC13aWR0aFwiOiBcIjMwMHB4XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgc2NydWJiZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnRpbWVzdGFtcFAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgdGhpcy5zbGlkZWl0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodGhpcy5oaXN0b3J5WyQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpXSk7XG4gICAgICAgICAgICB2YXIgY3VyVmFsID0gdGhpcy50aW1lc3RhbXBzWyQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpXTtcbiAgICAgICAgICAgIGxldCBwb3MgPSAkKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgIGxldCBvdXRPZiA9IHRoaXMuaGlzdG9yeS5sZW5ndGg7XG4gICAgICAgICAgICAkKHRoaXMudGltZXN0YW1wUCkudGV4dChgJHtjdXJWYWx9IC0gJHtwb3MgKyAxfSBvZiAke291dE9mfWApO1xuICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiBcImFjdGl2ZWNvZGVcIixcbiAgICAgICAgICAgICAgICBhY3Q6IFwic2xpZGU6XCIgKyBjdXJWYWwsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgICQoc2NydWJiZXIpLnNsaWRlcih7XG4gICAgICAgICAgICBtYXg6IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICB9KTtcbiAgICAgICAgJChzY3J1YmJlcikuY3NzKFwibWFyZ2luXCIsIFwiMTBweFwiKTtcbiAgICAgICAgJChzY3J1YmJlcikub24oXCJzbGlkZVwiLCB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKSk7XG4gICAgICAgICQoc2NydWJiZXIpLm9uKFwic2xpZGVjaGFuZ2VcIiwgdGhpcy5zbGlkZWl0LmJpbmQodGhpcykpO1xuICAgICAgICBzY3J1YmJlckRpdi5hcHBlbmRDaGlsZChzY3J1YmJlcik7XG4gICAgICAgIHNjcnViYmVyRGl2LmFwcGVuZENoaWxkKHRoaXMudGltZXN0YW1wUCk7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZGVhZGxpbmUgc2V0IHRoZW4gcG9zaXRpb24gdGhlIHNjcnViYmVyIGF0IHRoZSBsYXN0IHN1Ym1pc3Npb25cbiAgICAgICAgLy8gcHJpb3IgdG8gdGhlIGRlYWRsaW5lXG4gICAgICAgIGlmICh0aGlzLmRlYWRsaW5lKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgd2hpbGUgKGkgPCB0aGlzLmhpc3RvcnkubGVuZ3RoICYmICFkb25lKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ldyBEYXRlKHRoaXMudGltZXN0YW1wc1tpXSkgPiB0aGlzLmRlYWRsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpID0gaSAtIDE7XG4gICAgICAgICAgICBzY3J1YmJlci52YWx1ZSA9IE1hdGgubWF4KGksIDApO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodGhpcy5oaXN0b3J5W3NjcnViYmVyLnZhbHVlXSk7XG4gICAgICAgICAgICAkKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiLCBzY3J1YmJlci52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9zX2xhc3QpIHtcbiAgICAgICAgICAgIHNjcnViYmVyLnZhbHVlID0gdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmhpc3Rvcnlbc2NydWJiZXIudmFsdWVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjcnViYmVyLnZhbHVlID0gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcG9zID0gJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIik7XG4gICAgICAgIGxldCBvdXRPZiA9IHRoaXMuaGlzdG9yeS5sZW5ndGg7XG4gICAgICAgIGxldCB0cyA9IHRoaXMudGltZXN0YW1wc1skKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKV07XG4gICAgICAgICQodGhpcy50aW1lc3RhbXBQKS50ZXh0KGAke3RzfSAtICR7cG9zICsgMX0gb2YgJHtvdXRPZn1gKTtcbiAgICAgICAgJCh0aGlzLmhpc3RCdXR0b24pLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLmhpc3RCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLmhpc3RvcnlTY3J1YmJlciA9IHNjcnViYmVyO1xuICAgICAgICAkKHNjcnViYmVyRGl2KS5pbnNlcnRBZnRlcih0aGlzLnJ1bkJ1dHRvbik7XG4gICAgfSAvLyBlbmQgZGVmaW5pdGlvbiBvZiBoZWxwZXJcblxuICAgIGNyZWF0ZU91dHB1dCgpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgcGFyZW50IGRpdiB3aXRoIHR3byBlbGVtZW50czogIHByZSBmb3Igc3RhbmRhcmQgb3V0cHV0IGFuZCBhIGRpdlxuICAgICAgICAvLyB0byBob2xkIHR1cnRsZSBncmFwaGljcyBvdXRwdXQuICBXZSB1c2UgYSBkaXYgaW4gY2FzZSB0aGUgdHVydGxlIGNoYW5nZXMgZnJvbVxuICAgICAgICAvLyB1c2luZyBhIGNhbnZhcyB0byB1c2luZyBzb21lIG90aGVyIGVsZW1lbnQgbGlrZSBzdmcgaW4gdGhlIGZ1dHVyZS5cbiAgICAgICAgdmFyIG91dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImFjX291dHB1dCBjb2wtbWQtMTJcIik7XG4gICAgICAgIHRoaXMub3V0RGl2ID0gb3V0RGl2O1xuICAgICAgICB0aGlzLm91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgIHRoaXMub3V0cHV0LmlkID0gdGhpcy5kaXZpZCArIFwiX3N0ZG91dFwiO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpO1xuICAgICAgICB0aGlzLmdyYXBoaWNzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5ncmFwaGljcy5pZCA9IHRoaXMuZGl2aWQgKyBcIl9ncmFwaGljc1wiO1xuICAgICAgICAkKHRoaXMuZ3JhcGhpY3MpLmFkZENsYXNzKFwiYWMtY2FudmFzXCIpO1xuICAgICAgICAvLyBUaGlzIGJpdCBvZiBtYWdpYyBhZGRzIGFuIGV2ZW50IHdoaWNoIHdhaXRzIGZvciBhIGNhbnZhcyBjaGlsZCB0byBiZSBjcmVhdGVkIG9uIG91clxuICAgICAgICAvLyBuZXdseSBjcmVhdGVkIGRpdi4gIFdoZW4gYSBjYW52YXMgY2hpbGQgaXMgYWRkZWQgd2UgYWRkIGEgbmV3IGNsYXNzIHNvIHRoYXQgdGhlIHZpc2libGVcbiAgICAgICAgLy8gY2FudmFzIGNhbiBiZSBzdHlsZWQgaW4gQ1NTLiAgV2hpY2ggYSB0aGUgbW9tZW50IG1lYW5zIGp1c3QgYWRkaW5nIGEgYm9yZGVyLlxuICAgICAgICAkKHRoaXMuZ3JhcGhpY3MpLm9uKFxuICAgICAgICAgICAgXCJET01Ob2RlSW5zZXJ0ZWRcIixcbiAgICAgICAgICAgIFwiY2FudmFzXCIsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmdyYXBoaWNzKS5hZGRDbGFzcyhcInZpc2libGUtYWMtY2FudmFzXCIpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIHZhciBjbGVhckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoY2xlYXJEaXYpLmNzcyhcImNsZWFyXCIsIFwiYm90aFwiKTsgLy8gbmVlZGVkIHRvIG1ha2UgcGFyZW50IGRpdiByZXNpemUgcHJvcGVybHlcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjbGVhckRpdik7XG4gICAgICAgIG91dERpdi5hcHBlbmRDaGlsZCh0aGlzLm91dHB1dCk7XG4gICAgICAgIG91dERpdi5hcHBlbmRDaGlsZCh0aGlzLmdyYXBoaWNzKTtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChvdXREaXYpO1xuICAgICAgICB2YXIgbGVuc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGxlbnNEaXYuaWQgPSBgJHt0aGlzLmRpdmlkfV9jb2RlbGVuc2A7XG4gICAgICAgICQobGVuc0RpdikuYWRkQ2xhc3MoXCJjb2wtbWQtMTJcIik7XG4gICAgICAgICQobGVuc0RpdikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XG4gICAgICAgIHRoaXMuY29kZWxlbnMgPSBsZW5zRGl2O1xuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGxlbnNEaXYpO1xuICAgICAgICB2YXIgY29hY2hEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNvYWNoRGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgJChjb2FjaERpdikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XG4gICAgICAgIHRoaXMuY29kZWNvYWNoID0gY29hY2hEaXY7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY29hY2hEaXYpO1xuICAgICAgICBjbGVhckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoY2xlYXJEaXYpLmNzcyhcImNsZWFyXCIsIFwiYm90aFwiKTsgLy8gbmVlZGVkIHRvIG1ha2UgcGFyZW50IGRpdiByZXNpemUgcHJvcGVybHlcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjbGVhckRpdik7XG4gICAgfVxuXG4gICAgZGlzYWJsZVNhdmVMb2FkKCkge1xuICAgICAgICAkKHRoaXMuc2F2ZUJ1dHRvbikuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnNhdmVCdXR0b24pLmF0dHIoXCJ0aXRsZVwiLCBcIkxvZ2luIHRvIHNhdmUgeW91ciBjb2RlXCIpO1xuICAgICAgICAkKHRoaXMubG9hZEJ1dHRvbikuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLmxvYWRCdXR0b24pLmF0dHIoXCJ0aXRsZVwiLCBcIkxvZ2luIHRvIGxvYWQgeW91ciBjb2RlXCIpO1xuICAgIH1cblxuICAgIGRvd25sb2FkRmlsZShsYW5nKSB7XG4gICAgICAgIHZhciBmbmIgPSB0aGlzLmRpdmlkO1xuICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciBmaWxlTmFtZSA9XG4gICAgICAgICAgICBmbmIgK1xuICAgICAgICAgICAgXCJfXCIgK1xuICAgICAgICAgICAgZFxuICAgICAgICAgICAgICAgIC50b0pTT04oKVxuICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgMTApIC8vIHJldmVyc2UgZGF0ZSBmb3JtYXRcbiAgICAgICAgICAgICAgICAuc3BsaXQoXCItXCIpXG4gICAgICAgICAgICAgICAgLmpvaW4oXCJcIikgK1xuICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgbGFuZ3VhZ2VFeHRlbnNpb25zW2xhbmddO1xuICAgICAgICB2YXIgY29kZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7XG4gICAgICAgIGlmIChcIkJsb2JcIiBpbiB3aW5kb3cpIHtcbiAgICAgICAgICAgIHZhciB0ZXh0VG9Xcml0ZSA9IGNvZGUucmVwbGFjZSgvXFxuL2csIFwiXFxyXFxuXCIpO1xuICAgICAgICAgICAgdmFyIHRleHRGaWxlQXNCbG9iID0gbmV3IEJsb2IoW3RleHRUb1dyaXRlXSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dC9wbGFpblwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoXCJtc1NhdmVPck9wZW5CbG9iXCIgaW4gbmF2aWdhdG9yKSB7XG4gICAgICAgICAgICAgICAgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IodGV4dEZpbGVBc0Jsb2IsIGZpbGVOYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGRvd25sb2FkTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5kb3dubG9hZCA9IGZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5pbm5lckhUTUwgPSBcIkRvd25sb2FkIEZpbGVcIjtcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuaHJlZiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHRleHRGaWxlQXNCbG9iKTtcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG93bmxvYWRMaW5rKTtcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFsZXJ0KFwiWW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIEhUTUw1IEJsb2IuXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDb2RlKCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmRpdmlkKTtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZUdyYWRlU3VtbWFyeSgpIHtcbiAgICAgICAgLy8gZ2V0IGdyYWRlIGFuZCBjb21tZW50cyBmb3IgdGhpcyBhc3NpZ25tZW50XG4gICAgICAgIC8vIGdldCBzdW1tYXJ5IG9mIGFsbCBncmFkZXMgZm9yIHRoaXMgc3R1ZGVudFxuICAgICAgICAvLyBkaXNwbGF5IGdyYWRlcyBpbiBtb2RhbCB3aW5kb3dcbiAgICAgICAgdmFyIGRhdGEgPSB7XG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgIH07XG4gICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoZUJvb2tDb25maWcuYWpheFVSTCArIFwiZ2V0YXNzaWdubWVudGdyYWRlXCIsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgbGV0IHJlcG9ydCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgdmFyIGJvZHk7XG4gICAgICAgIC8vIGNoZWNrIGZvciByZXBvcnRbJ21lc3NhZ2UnXVxuICAgICAgICBpZiAocmVwb3J0KSB7XG4gICAgICAgICAgICBpZiAocmVwb3J0W1widmVyc2lvblwiXSA9PSAyKSB7XG4gICAgICAgICAgICAgICAgLy8gbmV3IHZlcnNpb247IHdvdWxkIGJlIGJldHRlciB0byBlbWJlZCB0aGlzIGluIEhUTUwgZm9yIHRoZSBhY3RpdmVjb2RlXG4gICAgICAgICAgICAgICAgYm9keSA9XG4gICAgICAgICAgICAgICAgICAgIFwiPGg0PkdyYWRlIFJlcG9ydDwvaDQ+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIjxwPlRoaXMgcXVlc3Rpb246IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiZ3JhZGVcIl07XG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydFtcInJlbGVhc2VkXCJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gXCIgb3V0IG9mIFwiICsgcmVwb3J0W1wibWF4XCJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBib2R5ICs9IFwiPC9wPiA8cD5cIjtcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0W1wicmVsZWFzZWRcIl0gPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBcIlByZWxpbWluYXJ5IENvbW1lbnRzOiBcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm9keSArPSByZXBvcnRbXCJjb21tZW50XCJdICsgXCI8L3A+XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJvZHkgPVxuICAgICAgICAgICAgICAgICAgICBcIjxoND5HcmFkZSBSZXBvcnQ8L2g0PlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCI8cD5UaGlzIGFzc2lnbm1lbnQ6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiZ3JhZGVcIl0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+XCIgK1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJjb21tZW50XCJdICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L3A+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIjxwPk51bWJlciBvZiBncmFkZWQgYXNzaWdubWVudHM6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiY291bnRcIl0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+QXZlcmFnZSBzY29yZTogXCIgK1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJhdmdcIl0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvcD5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJvZHkgPSBcIjxoND5UaGUgc2VydmVyIGRpZCBub3QgcmV0dXJuIGFueSBncmFkZSBpbmZvcm1hdGlvbjwvaDQ+XCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGh0bWwgPSBgPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgY29tcGFyZS1tb2RhbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+QXNzaWdubWVudCBGZWVkYmFjazwvaDQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7Ym9keX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB2YXIgZWwgPSAkKGh0bWwpO1xuICAgICAgICBlbC5tb2RhbCgpO1xuXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICBhc3luYyBzaG93Q29kZWxlbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICAgIHRoaXMuY2xCdXR0b24uaW5uZXJUZXh0ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlbGVuc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbCA9IHRoaXMuY29kZWxlbnMuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGNsKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnJlbW92ZUNoaWxkKGNsKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29kZSA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKGZhbHNlKTtcbiAgICAgICAgdmFyIG15VmFycyA9IHt9O1xuICAgICAgICBteVZhcnMuY29kZSA9IGNvZGU7XG4gICAgICAgIG15VmFycy5vcmlnaW4gPSBcIm9wdC1mcm9udGVuZC5qc1wiO1xuICAgICAgICBteVZhcnMuY3VtdWxhdGl2ZSA9IGZhbHNlO1xuICAgICAgICBteVZhcnMuaGVhcFByaW1pdGl2ZXMgPSBmYWxzZTtcbiAgICAgICAgbXlWYXJzLmRyYXdQYXJlbnRQb2ludGVycyA9IGZhbHNlO1xuICAgICAgICBteVZhcnMudGV4dFJlZmVyZW5jZXMgPSBmYWxzZTtcbiAgICAgICAgbXlWYXJzLnNob3dPbmx5T3V0cHV0cyA9IGZhbHNlO1xuICAgICAgICBteVZhcnMucmF3SW5wdXRMc3RKU09OID0gSlNPTi5zdHJpbmdpZnkoW10pO1xuICAgICAgICBpZiAodGhpcy5sYW5ndWFnZSA9PSBcInB5dGhvblwiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5weXRob24zKSB7XG4gICAgICAgICAgICAgICAgbXlWYXJzLnB5ID0gMztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbXlWYXJzLnB5ID0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhbmdhdWdlID09IFwiamF2YXNjcmlwdFwiKSB7XG4gICAgICAgICAgICBteVZhcnMucHkgPSBcImpzXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBteVZhcnMucHkgPSB0aGlzLmxhbmd1YWdlO1xuICAgICAgICB9XG4gICAgICAgIG15VmFycy5jdXJJbnN0ciA9IDA7XG4gICAgICAgIG15VmFycy5jb2RlRGl2V2lkdGggPSAzNTA7XG4gICAgICAgIG15VmFycy5jb2RlRGl2SGVpZ2h0ID0gNDAwO1xuICAgICAgICB2YXIgc3JjVVJMID0gXCJodHRwczovL3B5dGhvbnR1dG9yLmNvbS9pZnJhbWUtZW1iZWQuaHRtbFwiO1xuICAgICAgICB2YXIgc3JjVmFycyA9ICQucGFyYW0obXlWYXJzKTtcbiAgICAgICAgdmFyIGVtYmVkVXJsU3RyID0gYCR7c3JjVVJMfSMke3NyY1ZhcnN9YDtcbiAgICAgICAgdmFyIG15SWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwiaWRcIiwgdGhpcy5kaXZpZCArIFwiX2NvZGVsZW5zXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBcIjgwMFwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIFwiNTAwXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImRpc3BsYXk6YmxvY2tcIik7XG4gICAgICAgIG15SWZyYW1lLnN0eWxlLmJhY2tncm91bmQgPSBcIiNmZmZcIjtcbiAgICAgICAgLy9teUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIixzcmNVUkwpXG4gICAgICAgIG15SWZyYW1lLnNyYyA9IGVtYmVkVXJsU3RyO1xuICAgICAgICB0aGlzLmNvZGVsZW5zLmFwcGVuZENoaWxkKG15SWZyYW1lKTtcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiY29kZWxlbnNcIixcbiAgICAgICAgICAgIGFjdDogXCJ2aWV3XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyA8aWZyYW1lIGlkPVwiJShkaXZpZClzX2NvZGVsZW5zXCIgd2lkdGg9XCI4MDBcIiBoZWlnaHQ9XCI1MDBcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2tcInNyYz1cIiNcIj5cbiAgICAvLyA8L2lmcmFtZT5cbiAgICBzaG93Q29kZUNvYWNoKCkge1xuICAgICAgICB2YXIgbXlJZnJhbWU7XG4gICAgICAgIHZhciBzcmNVUkw7XG4gICAgICAgIHZhciBjbDtcbiAgICAgICAgdmFyIGRpdl9pZCA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIGlmICh0aGlzLmNvZGVjb2FjaCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb2RlY29hY2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGhpcy5jb2RlY29hY2guc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgfVxuICAgICAgICBjbCA9IHRoaXMuY29kZWNvYWNoLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChjbCkge1xuICAgICAgICAgICAgdGhpcy5jb2RlY29hY2gucmVtb3ZlQ2hpbGQoY2wpO1xuICAgICAgICB9XG4gICAgICAgIHNyY1VSTCA9IGVCb29rQ29uZmlnLmFwcCArIFwiL2FkbWluL2RpZmZ2aWV3ZXI/ZGl2aWQ9XCIgKyBkaXZfaWQ7XG4gICAgICAgIG15SWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwiaWRcIiwgZGl2X2lkICsgXCJfY29hY2hcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiODAwcHhcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjUwMHB4XCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImRpc3BsYXk6YmxvY2tcIik7XG4gICAgICAgIG15SWZyYW1lLnN0eWxlLmJhY2tncm91bmQgPSBcIiNmZmZcIjtcbiAgICAgICAgbXlJZnJhbWUuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcbiAgICAgICAgbXlJZnJhbWUuc3JjID0gc3JjVVJMO1xuICAgICAgICB0aGlzLmNvZGVjb2FjaC5hcHBlbmRDaGlsZChteUlmcmFtZSk7XG4gICAgICAgICQodGhpcy5jb2RlY29hY2gpLnNob3coKTtcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiY29hY2hcIixcbiAgICAgICAgICAgIGFjdDogXCJ2aWV3XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRvZ2dsZUVkaXRvclZpc2liaWxpdHkoKSB7fVxuXG4gICAgYWRkRXJyb3JNZXNzYWdlKGVycikge1xuICAgICAgICAvLyBBZGQgdGhlIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgdGhpcy5lcnJMYXN0UnVuID0gdHJ1ZTtcbiAgICAgICAgdmFyIGVyckhlYWQgPSAkKFwiPGgzPlwiKS5odG1sKFwiRXJyb3JcIik7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lciA9IHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5jbGFzc05hbWUgPSBcImVycm9yIGFsZXJ0IGFsZXJ0LWRhbmdlclwiO1xuICAgICAgICB0aGlzLmVDb250YWluZXIuaWQgPSB0aGlzLmRpdmlkICsgXCJfZXJyaW5mb1wiO1xuICAgICAgICB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoZXJySGVhZFswXSk7XG4gICAgICAgIHZhciBlcnJUZXh0ID0gdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKVxuICAgICAgICApO1xuICAgICAgICAvLyBCdXQsIGFkanVzdCB0aGUgbGluZSBudW1iZXJzLiAgSWYgdGhlIGxpbmUgbnVtYmVyIGlzIDw9IHByZXRleHRMaW5lcyB0aGVuIGl0IGlzIGluIGluY2x1ZGVkIGNvZGVcbiAgICAgICAgLy8gaWYgaXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgaW5jbHVkZWQgbGluZXMgYnV0IGxlc3MgdGhhbiB0aGUgcHJldGV4dCArIGN1cnJlbnQgZWRpdG9yIHRoZW4gaXQgaXMgaW4gdGhlIHN0dWRlbnQgY29kZS5cbiAgICAgICAgLy8gYWRqdXN0IHRoZSBsaW5lIG51bWJlciB3ZSBkaXNwbGF5IGJ5IGVsaW1pbmF0aW5nIHRoZSBwcmUtaW5jbHVkZWQgY29kZS5cbiAgICAgICAgaWYgKGVyci50cmFjZWJhY2subGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIHZhciBlcnJvckxpbmUgPSBlcnIudHJhY2ViYWNrWzBdLmxpbmVubztcbiAgICAgICAgICAgIGlmIChlcnJvckxpbmUgPD0gdGhpcy5wcmV0ZXh0TGluZXMpIHtcbiAgICAgICAgICAgICAgICBlcnJUZXh0LmlubmVySFRNTCA9XG4gICAgICAgICAgICAgICAgICAgIFwiQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGhpZGRlbiwgaW5jbHVkZWQgY29kZS4gU29ycnkgd2UgY2FuJ3QgZ2l2ZSB5b3UgYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3JMaW5lID4gdGhpcy5wcm9nTGluZXMgKyB0aGlzLnByZXRleHRMaW5lcykge1xuICAgICAgICAgICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gYEFuIGVycm9yIG9jY3VycmVkIGFmdGVyIHRoZSBlbmQgb2YgeW91ciBjb2RlLlxuT25lIHBvc3NpYmxlIHJlYXNvbiBpcyB0aGF0IHlvdSBoYXZlIGFuIHVuY2xvc2VkIHBhcmVudGhlc2lzIG9yIHN0cmluZy5cbkFub3RoZXIgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgaGlkZGVuIHRlc3QgY29kZS5cbllldCBhbm90aGVyIGlzIHRoYXQgdGhlcmUgaXMgYW4gaW50ZXJuYWwgZXJyb3IuICBUaGUgaW50ZXJuYWwgZXJyb3IgbWVzc2FnZSBpczogJHtlcnIubWVzc2FnZX1gO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldGV4dExpbmVzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBlcnIudHJhY2ViYWNrWzBdLmxpbmVubyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIudHJhY2ViYWNrWzBdLmxpbmVubyAtIHRoaXMucHJldGV4dExpbmVzICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVyclN0cmluZyA9IGVyci50b1N0cmluZygpO1xuICAgICAgICB2YXIgdG8gPSBlcnJTdHJpbmcuaW5kZXhPZihcIjpcIik7XG4gICAgICAgIHZhciBlcnJOYW1lID0gZXJyU3RyaW5nLnN1YnN0cmluZygwLCB0byk7XG4gICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gZXJyU3RyaW5nO1xuICAgICAgICAkKHRoaXMuZUNvbnRhaW5lcikuYXBwZW5kKFwiPGgzPkRlc2NyaXB0aW9uPC9oMz5cIik7XG4gICAgICAgIHZhciBlcnJEZXNjID0gdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpKTtcbiAgICAgICAgZXJyRGVzYy5pbm5lckhUTUwgPSBlcnJvclRleHRbZXJyTmFtZV07XG4gICAgICAgICQodGhpcy5lQ29udGFpbmVyKS5hcHBlbmQoXCI8aDM+VG8gRml4PC9oMz5cIik7XG4gICAgICAgIHZhciBlcnJGaXggPSB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIikpO1xuICAgICAgICBlcnJGaXguaW5uZXJIVE1MID0gZXJyb3JUZXh0W2Vyck5hbWUgKyBcIkZpeFwiXTtcbiAgICAgICAgdmFyIG1vcmVJbmZvID0gXCIuLi9FcnJvckhlbHAvXCIgKyBlcnJOYW1lLnRvTG93ZXJDYXNlKCkgKyBcIi5odG1sXCI7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJSdW50aW1lIEVycm9yOiBcIiArIGVyci50b1N0cmluZygpKTtcbiAgICB9XG4gICAgc2V0VGltZUxpbWl0KHRpbWVyKSB7XG4gICAgICAgIHZhciB0aW1lbGltaXQgPSB0aGlzLnRpbWVsaW1pdDtcbiAgICAgICAgaWYgKHRpbWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRpbWVsaW1pdCA9IHRpbWVyO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBleGVjTGltaXQgaW4gbWlsbGlzZWNvbmRzICAtLSBmb3Igc3R1ZGVudCBwcm9qZWN0cyBzZXQgdGhpcyB0b1xuICAgICAgICAvLyAyNSBzZWNvbmRzIC0tIGp1c3QgbGVzcyB0aGFuIENocm9tZSdzIG93biB0aW1lci5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jb2RlLmluZGV4T2YoXCJvbnRpbWVyXCIpID4gLTEgfHxcbiAgICAgICAgICAgIHRoaXMuY29kZS5pbmRleE9mKFwib25jbGlja1wiKSA+IC0xIHx8XG4gICAgICAgICAgICB0aGlzLmNvZGUuaW5kZXhPZihcIm9ua2V5XCIpID4gLTEgfHxcbiAgICAgICAgICAgIHRoaXMuY29kZS5pbmRleE9mKFwic2V0RGVsYXlcIikgPiAtMVxuICAgICAgICApIHtcbiAgICAgICAgICAgIFNrLmV4ZWNMaW1pdCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGltZWxpbWl0ID09PSBcIm9mZlwiKSB7XG4gICAgICAgICAgICAgICAgU2suZXhlY0xpbWl0ID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZWxpbWl0KSB7XG4gICAgICAgICAgICAgICAgU2suZXhlY0xpbWl0ID0gdGltZWxpbWl0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBTay5leGVjTGltaXQgPSAyNTAwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBidWlsdGluUmVhZCh4KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIFNrLmJ1aWx0aW5GaWxlcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBTay5idWlsdGluRmlsZXNbXCJmaWxlc1wiXVt4XSA9PT0gdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ZpbGVfbm90X2ZvdW5kXCIsIHgpO1xuICAgICAgICByZXR1cm4gU2suYnVpbHRpbkZpbGVzW1wiZmlsZXNcIl1beF07XG4gICAgfVxuICAgIGZpbGVSZWFkZXIoZGl2aWQpIHtcbiAgICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZpZCk7XG4gICAgICAgIGxldCBkYXRhID0gXCJcIjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGlmIChlbGVtID09IG51bGwgJiYgU2suYnVpbHRpbkZpbGVzLmZpbGVzLmhhc093blByb3BlcnR5KGRpdmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIFNrLmJ1aWx0aW5GaWxlc1tcImZpbGVzXCJdW2RpdmlkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRyeSByZW1vdGUgZmlsZSB1bmxlc3MgaXQgZW5kcyB3aXRoIC5qcyBvciAucHkgLS0gb3RoZXJ3aXNlIHdlJ2xsIGFzayB0aGUgc2VydmVyIGZvciBhbGxcbiAgICAgICAgICAgIC8vIGtpbmRzIG9mIG1vZHVsZXMgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIGltcG9ydFxuICAgICAgICAgICAgaWYgKCEoZGl2aWQuZW5kc1dpdGgoXCIuanNcIikgfHwgZGl2aWQuZW5kc1dpdGgoXCIucHlcIikpKSB7XG4gICAgICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGAvcnVuZXN0b25lL2FqYXgvZ2V0X2RhdGFmaWxlP2NvdXJzZV9pZD0ke2VCb29rQ29uZmlnLmNvdXJzZX0mYWNpZD0ke2RpdmlkfWAsXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKGRhdGEpLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0gPT0gbnVsbCAmJiByZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTay5idWlsdGluLklPRXJyb3IoXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbm9fZmlsZV9vcl9kaXJcIiwgZGl2aWQpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInRleHRhcmVhXCIpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZWxlbS52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGVsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIG91dHB1dGZ1bih0ZXh0KSB7XG4gICAgICAgIC8vIGJubSBweXRob24gM1xuICAgICAgICB2YXIgcHlTdHIgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIltcIiArIHguam9pbihcIiwgXCIpICsgXCJdXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgeCA9IHRleHQ7XG4gICAgICAgIGlmICghdGhpcy5weXRob24zKSB7XG4gICAgICAgICAgICBpZiAoeC5jaGFyQXQoMCkgPT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICB4ID0geC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgeCA9IFwiW1wiICsgeCArIFwiXVwiO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4bCA9IGV2YWwoeCk7XG4gICAgICAgICAgICAgICAgICAgIHhsID0geGwubWFwKHB5U3RyKTtcbiAgICAgICAgICAgICAgICAgICAgeCA9IHhsLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwidmlzaWJsZVwiKTtcbiAgICAgICAgdGV4dCA9IHg7XG4gICAgICAgIHRleHQgPSB0ZXh0XG4gICAgICAgICAgICAucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCBcIjxici8+XCIpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMub3V0cHV0KS5hcHBlbmQodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmaWxld3JpdGVyKGZvYmosIGJ5dGVzKSB7XG4gICAgICAgIGxldCBmaWxlY29tcG9uZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9iai5uYW1lKTtcbiAgICAgICAgaWYgKCFmaWxlY29tcG9uZW50KSB7XG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICQoY29udGFpbmVyKS5hZGRDbGFzcyhcInJ1bmVzdG9uZVwiKTtcbiAgICAgICAgICAgIGxldCB0YWIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgJCh0YWIpLmFkZENsYXNzKFwiZGF0YWZpbGVfY2FwdGlvblwiKTtcbiAgICAgICAgICAgIHRhYi5pbm5lckhUTUwgPSBgRGF0YSBmaWxlOiA8Y29kZT4ke2ZvYmoubmFtZX08L2NvZGU+YDtcbiAgICAgICAgICAgIGZpbGVjb21wb25lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgICAgICAgICBmaWxlY29tcG9uZW50LnJvd3MgPSAxMDtcbiAgICAgICAgICAgIGZpbGVjb21wb25lbnQuY29scyA9IDUwO1xuICAgICAgICAgICAgZmlsZWNvbXBvbmVudC5pZCA9IGZvYmoubmFtZTtcbiAgICAgICAgICAgICQoZmlsZWNvbXBvbmVudCkuY3NzKFwibWFyZ2luLWJvdHRvbVwiLCBcIjVweFwiKTtcbiAgICAgICAgICAgICQoZmlsZWNvbXBvbmVudCkuYWRkQ2xhc3MoXCJhY19vdXRwdXRcIik7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFiKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmaWxlY29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb2JqLnBvcyQgPT0gMCkge1xuICAgICAgICAgICAgICAgICQoZmlsZWNvbXBvbmVudCkudmFsKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBjdXJyZW50ID0gJChmaWxlY29tcG9uZW50KS52YWwoKTtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQgKyBieXRlcy52O1xuICAgICAgICAkKGZpbGVjb21wb25lbnQpLnZhbChjdXJyZW50KTtcbiAgICAgICAgJChmaWxlY29tcG9uZW50KS5jc3MoXCJkaXNwbGF5XCIsIFwiYmxvY2tcIik7XG4gICAgICAgIGZvYmoucG9zJCA9IGN1cnJlbnQubGVuZ3RoO1xuICAgICAgICByZXR1cm4gY3VycmVudC5sZW5ndGg7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0SW5jbHVkZWRDb2RlKGRpdmlkKSB7XG4gICAgICAgIGlmICh3aW5kb3cuZWRMaXN0W2RpdmlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5lZExpc3RbZGl2aWRdLmVkaXRvci5nZXRWYWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcbiAgICAgICAgICAgICAgICBgL3J1bmVzdG9uZS9hamF4L2dldF9kYXRhZmlsZT9jb3Vyc2VfaWQ9JHtlQm9va0NvbmZpZy5jb3Vyc2V9JmFjaWQ9JHtkaXZpZH1gLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgd3Jlc3VsdCA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgbGV0IG9iaiA9IGF3YWl0IHdyZXN1bHQuanNvbigpO1xuICAgICAgICAgICAgcmV0dXJuIG9iai5kYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgYnVpbGRQcm9nKHVzZVN1ZmZpeCkge1xuICAgICAgICAvLyBhc3NlbWJsZSBjb2RlIGZyb20gcHJlZml4LCBzdWZmaXgsIGFuZCBlZGl0b3IgZm9yIHJ1bm5pbmcuXG4gICAgICAgIHZhciBwcmV0ZXh0O1xuICAgICAgICB2YXIgcHJvZyA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCkgKyBcIlxcblwiO1xuICAgICAgICBpZiAodGhpcy5wcmVmaXgpIHtcbiAgICAgICAgICAgIHByb2cgPSB0aGlzLnByZWZpeCArIHByb2c7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV0ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5wcmV0ZXh0TGluZXMgPSAwO1xuICAgICAgICB0aGlzLnByb2dMaW5lcyA9IHByb2cubWF0Y2goL1xcbi9nKS5sZW5ndGggKyAxO1xuICAgICAgICBpZiAodGhpcy5pbmNsdWRlcykge1xuICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBpbmNsdWRlcywgaW4tb3JkZXIgcHJlcGVuZGluZyB0byBwcm9nXG4gICAgICAgICAgICBwcmV0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGhpcy5pbmNsdWRlcy5sZW5ndGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGxldCBpQ29kZSA9IGF3YWl0IHRoaXMuZ2V0SW5jbHVkZWRDb2RlKHRoaXMuaW5jbHVkZXNbeF0pO1xuICAgICAgICAgICAgICAgIHByZXRleHQgPSBwcmV0ZXh0ICsgaUNvZGUgKyBcIlxcblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcmV0ZXh0ID0gcHJldGV4dDtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXRleHRMaW5lcyA9ICh0aGlzLnByZXRleHQubWF0Y2goL1xcbi9nKSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9nID0gcHJldGV4dCArIHByb2c7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZVN1ZmZpeCAmJiB0aGlzLnN1ZmZpeCkge1xuICAgICAgICAgICAgcHJvZyA9IHByb2cgKyB0aGlzLnN1ZmZpeDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb2cpO1xuICAgIH1cblxuICAgIGFzeW5jIG1hbmFnZV9zY3J1YmJlcihzYXZlQ29kZSkge1xuICAgICAgICBpZiAodGhpcy5oaXN0b3J5U2NydWJiZXIgPT09IG51bGwgJiYgIXRoaXMuYXV0b3J1bikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRIaXN0b3J5U2NydWJiZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnlTY3J1YmJlciAmJlxuICAgICAgICAgICAgdGhpcy5oaXN0b3J5WyQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpXSAhPVxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLmdldFZhbHVlKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBzYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2godGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICB0aGlzLnRpbWVzdGFtcHMucHVzaChuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKCkpO1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFxuICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJtYXhcIixcbiAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcbiAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgIFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVpdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2F2ZUNvZGUgPSBcIkZhbHNlXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yeVNjcnViYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHNhdmVDb2RlID0gXCJGYWxzZVwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYXZlQ29kZTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1blByb2coKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYGVycm9yIHJ1bm5pbmcgY29kZSAke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dDdXJyZW50QW5zd2VyKCkge1xuICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuZWRpdG9yLmdldFZhbHVlKCksXG4gICAgICAgICAgICBsYW5nOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgZXJyaW5mbzogdGhpcy5lcnJpbmZvLFxuICAgICAgICAgICAgdG9fc2F2ZTogdGhpcy5zYXZlQ29kZSxcbiAgICAgICAgICAgIHByZWZpeDogdGhpcy5wcmV0ZXh0LFxuICAgICAgICAgICAgc3VmZml4OiB0aGlzLnN1ZmZpeCxcbiAgICAgICAgICAgIHBhcnRuZXI6IHRoaXMucGFydG5lcixcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZGl2aWQsIGRhdGFbJ2NvZGUnXSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmxvZ1J1bkV2ZW50KGRhdGEpOyAvLyBMb2cgdGhlIHJ1biBldmVudFxuICAgICAgICAvLyBJZiB1bml0IHRlc3RzIHdlcmUgcnVuIHRoZXJlIHdpbGwgYmUgYSB1bml0X3Jlc3VsdHNcbiAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgYWN0OiB0aGlzLnVuaXRfcmVzdWx0cyxcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwidW5pdHRlc3RcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XG4gICAgICAgIC8vIFRoZSBweXRob24gdW5pdCB0ZXN0IGNvZGUgYnVpbGRzIHRoZSB0YWJsZSBhcyBpdCBpcyBydW5uaW5nIHRoZSB0ZXN0c1xuICAgICAgICAvLyBJbiBcIm5vcm1hbFwiIHVzYWdlIHRoaXMgaXMgZGlzcGxheWVkIGltbWVkaWF0ZWx5LlxuICAgICAgICAvLyBIb3dldmVyIGluIGV4YW0gbW9kZSB3ZSBtYWtlIGEgZGl2IHdoaWNoIGlzIG9mZnNjcmVlblxuICAgICAgICBpZiAodGhpcy51bml0X3Jlc3VsdHNfZGl2aWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnVuaXRfcmVzdWx0c19kaXZpZC5pbmRleE9mKFwiX29mZnNjcmVlbl9cIikgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHVyRGl2aWQgPSBgJHt0aGlzLmRpdmlkfV9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzYDtcbiAgICAgICAgICAgICAgICBsZXQgdW5pdEZlZWRiYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodXJEaXZpZCk7XG4gICAgICAgICAgICAgICAgbGV0IHRtcCA9IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodW5pdEZlZWRiYWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfWApLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdG1wID0gJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfWApWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQodG1wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJCh0bXApLnNob3coKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHVyRGl2aWQgPSB0aGlzLmRpdmlkICsgXCJfdW5pdF9yZXN1bHRzXCI7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLmZpbmQoYCMke3VyRGl2aWR9YCkubGVuZ3RoID09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfV9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGggPT0gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJSZXN1bHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodXJEaXZpZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQodXJSZXN1bHRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBydW5Qcm9nIGhhcyBzZXZlcmFsIGFzeW5jIGVsZW1lbnRzIHRvIGl0LlxuICAgICAqIDEuIFNrdWxwdCBydW5zIHRoZSBweXRob24gcHJvZ3JhbSBhc3luY2hyb25vdXNseVxuICAgICAqIDIuIFRoZSBoaXN0b3J5IGlzIHJlc3RvcmVkIGFzeW5jaHJvbm91c2x5XG4gICAgICogMy4gTG9nZ2luZyBpcyBhc3luY2hyb25vdXNcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNrdWxwdCBQcm9taXNlIGFuZCBzbyB0aGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgd2hlbiBza3VscHQgaXMgZmluaXNoZWQuXG4gICAgICogd2hlbiBmaW5pc2hlZCB0aGlzLnVuaXRfcmVzdWx0cyB3aWxsIGNvbnRhaW4gdGhlIHJlc3VsdHMgb2YgYW55IHVuaXQgdGVzdHMgdGhhdCBoYXZlIGJlZW4gcnVuLlxuICAgICAqIFRoZSB0YWJsZSBvZiByZXN1bHRzIGlzIGNvbnN0cnVjdGVkIGFuZCBhZGRlZCB0byB0aGUgRE9NIGJ5IHRoZSBweXRob24gdW5pdHRlc3QuZ3VpIG1vZHVsZSBpbiBza3VscHQuXG4gICAgICpcbiAgICAgKi9cbiAgICBhc3luYyBydW5Qcm9nKG5vVUksIGxvZ1Jlc3VsdHMpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJzdGFydGluZyBydW5Qcm9nXCIpO1xuICAgICAgICBpZiAodHlwZW9mIGxvZ1Jlc3VsdHMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nUmVzdWx0cyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSBsb2dSZXN1bHRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygbm9VSSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIG5vVUkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvZyA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKHRydWUpO1xuICAgICAgICB0aGlzLnNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQoXCJcIik7XG4gICAgICAgIHdoaWxlICgkKGAjJHt0aGlzLmRpdmlkfV9lcnJpbmZvYCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZpZH1fZXJyaW5mb2ApLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vJCh0aGlzLmVDb250YWluZXIpLnJlbW92ZSgpO1xuICAgICAgICBpZiAodGhpcy5jb2RlbGVucykge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2xCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuY2xCdXR0b24uaW5uZXJUZXh0ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBTay5jb25maWd1cmUoe1xuICAgICAgICAgICAgb3V0cHV0OiB0aGlzLm91dHB1dGZ1bi5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcmVhZDogdGhpcy5maWxlUmVhZGVyLFxuICAgICAgICAgICAgZmlsZXdyaXRlOiB0aGlzLmZpbGV3cml0ZXIuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIF9fZnV0dXJlX186IFNrLnB5dGhvbjMsXG4gICAgICAgICAgICBub25yZWFkb3BlbjogdHJ1ZSxcbiAgICAgICAgICAgIC8vICAgICAgICBweXRob24zOiB0aGlzLnB5dGhvbjMsXG4gICAgICAgICAgICBpbWFnZVByb3h5OiBcImh0dHA6Ly9pbWFnZS5ydW5lc3RvbmUuYWNhZGVteTo4MDgwLzMyMHhcIixcbiAgICAgICAgICAgIGlucHV0ZnVuVGFrZXNQcm9tcHQ6IHRydWUsXG4gICAgICAgICAgICBqc29ucFNpdGVzOiBbXCJodHRwczovL2l0dW5lcy5hcHBsZS5jb21cIl0sXG4gICAgICAgIH0pO1xuICAgICAgICBTay5kaXZpZCA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIFNrLmxvZ1Jlc3VsdHMgPSBsb2dSZXN1bHRzO1xuXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZGl2aWQsdGhpcy5jb2RlKTtcblxuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUgJiYgdGhpcy5vdXRlckRpdi5jbG9zZXN0KFwiLmxvYWRpbmdcIikpIHtcbiAgICAgICAgICAgIFNrLmdyYWRlQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5jbG9zZXN0KFwiLmxvYWRpbmdcIikuaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTay5ncmFkZUNvbnRhaW5lciA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRUaW1lTGltaXQoKTtcbiAgICAgICAgKFNrLlR1cnRsZUdyYXBoaWNzIHx8IChTay5UdXJ0bGVHcmFwaGljcyA9IHt9KSkudGFyZ2V0ID0gdGhpcy5ncmFwaGljcztcbiAgICAgICAgU2suY2FudmFzID0gdGhpcy5ncmFwaGljcy5pZDsgLy90b2RvOiBnZXQgcmlkIG9mIHRoaXMgaGVyZSBhbmQgaW4gaW1hZ2VcbiAgICAgICAgaWYgKCFub1VJKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIodGhpcy5zYXZlQ29kZSk7XG4gICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9mZihcInNsaWRlY2hhbmdlXCIpO1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwiZGlzYWJsZVwiKTtcbiAgICAgICAgICAgICQodGhpcy5vdXREaXYpLnNob3coe1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA3MDAsXG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IFNrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2suaW1wb3J0TWFpbldpdGhCb2R5KFwiPHN0ZGluPlwiLCBmYWxzZSwgcHJvZywgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghbm9VSSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikub24oXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXCJlbmFibGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVyckxhc3RSdW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IFwic3VjY2Vzc1wiO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmICghbm9VSSkge1xuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9uKFxuICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXCJlbmFibGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVycmluZm8gPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuYWRkRXJyb3JNZXNzYWdlKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5hbGxWaXN1YWxpemVycyAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgJC5lYWNoKHdpbmRvdy5hbGxWaXN1YWxpemVycywgZnVuY3Rpb24gKGksIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5yZWRyYXdDb25uZWN0b3JzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNhYmxlSW50ZXJhY3Rpb24oKSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmhpZGUoKTtcbiAgICAgICAgJCh0aGlzLmNvZGVEaXYpLmFkZENsYXNzKFwiYWMtZGlzYWJsZWRcIik7XG4gICAgfVxufVxuXG52YXIgbGFuZ3VhZ2VFeHRlbnNpb25zID0ge1xuICAgIHB5dGhvbjogXCJweVwiLFxuICAgIGh0bWw6IFwiaHRtbFwiLFxuICAgIGphdmFzY3JpcHQ6IFwianNcIixcbiAgICBqYXZhOiBcImphdmFcIixcbiAgICBweXRob24yOiBcInB5XCIsXG4gICAgcHl0aG9uMzogXCJweVwiLFxuICAgIGNwcDogXCJjcHBcIixcbiAgICBjOiBcImNcIixcbiAgICBzcWw6IFwic3FsXCIsXG4gICAgb2N0YXZlOiBcIm1cIixcbn07XG5cbnZhciBlcnJvclRleHQgPSB7fTtcblxuZXJyb3JUZXh0LlBhcnNlRXJyb3IgPSAkLmkxOG4oXCJtc2dfc2N0aXZlY29kZV9wYXJzZV9lcnJvclwiKTtcbmVycm9yVGV4dC5QYXJzZUVycm9yRml4ID0gJC5pMThuKFwibXNnX3NjdGl2ZWNvZGVfcGFyc2VfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlR5cGVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3JcIik7XG5lcnJvclRleHQuVHlwZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuTmFtZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvclwiKTtcbmVycm9yVGV4dC5OYW1lRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5WYWx1ZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3JcIik7XG5lcnJvclRleHQuVmFsdWVFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5BdHRyaWJ1dGVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvclwiKTtcbmVycm9yVGV4dC5BdHRyaWJ1dGVFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuVG9rZW5FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlRva2VuRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuVGltZUxpbWl0RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yXCIpO1xuZXJyb3JUZXh0LlRpbWVMaW1pdEVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuU3ludGF4RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3JcIik7XG5lcnJvclRleHQuU3ludGF4RXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkluZGV4RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvclwiKTtcbmVycm9yVGV4dC5JbmRleEVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlVSSUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlVSSUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5JbXBvcnRFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvclwiKTtcbmVycm9yVGV4dC5JbXBvcnRFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuUmVmZXJlbmNlRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3JcIik7XG5lcnJvclRleHQuUmVmZXJlbmNlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0Llplcm9EaXZpc2lvbkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvclwiKTtcbmVycm9yVGV4dC5aZXJvRGl2aXNpb25FcnJvckZpeCA9ICQuaTE4bihcbiAgICBcIm1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3JfZml4XCJcbik7XG5lcnJvclRleHQuUmFuZ2VFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlJhbmdlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuSW50ZXJuYWxFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkludGVybmFsRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuSW5kZW50YXRpb25FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkluZGVudGF0aW9uRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuTm90SW1wbGVtZW50ZWRFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvclwiKTtcbmVycm9yVGV4dC5Ob3RJbXBsZW1lbnRlZEVycm9yRml4ID0gJC5pMThuKFxuICAgIFwibXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yX2ZpeFwiXG4pO1xuZXJyb3JUZXh0LktleUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yXCIpO1xuZXJyb3JUZXh0LktleUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5Bc3NlcnRpb25FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvclwiKTtcbmVycm9yVGV4dC5Bc3NlcnRpb25FcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvcl9maXhcIik7XG5cblN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbCA9IGZ1bmN0aW9uICh0YXJnZXQsIHJlcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuc3BsaXQodGFyZ2V0KS5qb2luKHJlcGxhY2VtZW50KTtcbn07XG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcnl0aG9uQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIG9wdHMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHRoaXMucHl0aG9uM19pbnRlcnByZXRlciA9ICQob3JpZykuZGF0YShcInB5dGhvbjNfaW50ZXJwcmV0ZXJcIik7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoXCJSZW5kZXJcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuY29kZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgbGV0IHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBhd2FpdCB0aGlzLm1hbmFnZV9zY3J1YmJlcihzYXZlQ29kZSk7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQoXCJcIik7XG4gICAgICAgIGlmICghdGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICAgICAgICAkKHRoaXMuY29kZURpdikuc3dpdGNoQ2xhc3MoXCJjb2wtbWQtMTJcIiwgXCJjb2wtbWQtNlwiLCB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICBwcm9nID0gYFxuICAgICAgICA8aHRtbD5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2JyeXRob25AMy45LjUvYnJ5dGhvbi5taW4uanNcIj48L3NjcmlwdD5cbiAgICAgICAgICAgIDxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vYnJ5dGhvbkAzLjkuNS9icnl0aG9uX3N0ZGxpYi5taW4uanNcIj48L3NjcmlwdD5cbiAgICAgICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaGlnaGxpZ2h0LmpzLzExLjAuMS9zdHlsZXMvZGVmYXVsdC5taW4uY3NzXCI+XG4gICAgICAgICAgICA8c2NyaXB0IHNyYz1cIi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2hpZ2hsaWdodC5qcy8xMS4wLjEvaGlnaGxpZ2h0Lm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgICAgICAgICAgPHN0eWxlPlxuICAgICAgICAgICAgICAgIGh0bWwsIGJvZHl7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogbWF4LWNvbnRlbnQ7IHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAuY29udGFpbmVyLXByZXtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7IGZvbnQtc2l6ZTogMTNweDsgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDM7IGJvcmRlcjogMXB4IHNvbGlkICNjY2M7IGJvcmRlci1yYWRpdXM6IDRweDsgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7IGJvdHRvbTogMHB4OyB3aWR0aDogOTQlOyBtYXgtd2lkdGg6IDk2JTsgbWF4LWhlaWdodDogMjAwcHg7IG92ZXJmbG93OiBhdXRvOyBjbGVhcjogYm90aDsgcmVzaXplOiBib3RoOyB0cmFuc2Zvcm06IHNjYWxlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJlIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHN0aWNreTsgcGFkZGluZzogMTJweDsgdHJhbnNmb3JtOiBzY2FsZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvZGV7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7IGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3N0eWxlPlxuICAgICAgICA8L2hlYWQ+XG4gICAgICAgIDxib2R5IG9ubG9hZD0nYnJ5dGhvbigpJz5cbiAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0ndGV4dC9weXRob24nPlxuaW1wb3J0IHN5c1xuZnJvbSBicm93c2VyIGltcG9ydCBkb2N1bWVudCwgaHRtbFxuaW1wb3J0IHRyYWNlYmFja1xucHJlRWxlbSA9IGh0bWwuUFJFKClcbmxvZ2dlciA9IGh0bWwuQ09ERSgpXG5jb250YWluZXIgPSBodG1sLkRJVigpXG5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImNvbnRhaW5lci1wcmVcIilcbnByZUVsZW0gPD0gbG9nZ2VyXG5jb250YWluZXIgPD0gcHJlRWxlbVxuY2xhc3MgTmV3T3V0OlxuICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKTpcbiAgICAgICAgbG9nZ2VyLmlubmVySFRNTCArPSBzdHIoZGF0YSlcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIlxuc3lzLnN0ZGVyciA9IHN5cy5zdGRvdXQgPSBOZXdPdXQoKVxuZGVmIG15X2V4ZWMoY29kZSk6XG4gICAgdHJ5OlxuICAgICAgICBleGVjKGNvZGUsIGxvY2FscygpKVxuICAgICAgICBvdXRfaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRcIilcbiAgICAgICAgb3V0X2hlYWRlci5pbm5lckhUTUwgPSBcIk91dHB1dFwiXG4gICAgICAgIG91dF9oZWFkZXIuc3R5bGUuZm9udCA9IFwiMjRweCAnQXJpYWwnXCJcbiAgICAgICAgbG9nZ2VyLmNsYXNzTGlzdC5hZGQoXCJwbGFpbnRleHRcIilcbiAgICAgICAgcHJlRWxlbS5wcmVwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSlcbiAgICAgICAgcHJlRWxlbS5wcmVwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSlcbiAgICAgICAgcHJlRWxlbS5wcmVwZW5kKG91dF9oZWFkZXIpXG4gICAgICAgIGRvY3VtZW50IDw9IGNvbnRhaW5lclxuICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlcnI6XG4gICAgICAgIGVycm9yX2NsYXNzID0gZXJyLl9fY2xhc3NfXy5fX25hbWVfX1xuICAgICAgICBkZXRhaWwgPSBlcnIuYXJnc1swXVxuICAgICAgICBsaW5lX251bWJlciA9IGZcImF0IGxpbmUge2Vyci5saW5lbm99XCJcbiAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiBhcyBlcnI6XG4gICAgICAgIGVycm9yX2NsYXNzID0gZXJyLl9fY2xhc3NfXy5fX25hbWVfX1xuICAgICAgICBkZXRhaWwgPSBlcnIuYXJnc1swXVxuICAgICAgICBjbCwgZXhjLCB0YiA9IHN5cy5leGNfaW5mbygpXG4gICAgICAgICMgV2hlbiBlcnJvcnMgZG9uJ3Qgc3BlY2lmeSBhIGxpbmVcbiAgICAgICAgdHJ5OlxuICAgICAgICAgICAgbGluZV9udW1iZXIgPSBmXCJhdCBsaW5lIHt0cmFjZWJhY2suZXh0cmFjdF90Yih0YilbLTFdWzFdfVwiXG4gICAgICAgIGV4Y2VwdDpcbiAgICAgICAgICAgIGxpbmVfbnVtYmVyID0gXCJcIlxuICAgIGVsc2U6XG4gICAgICAgIHJldHVyblxuICAgIFxuICAgICMgVGhpcyBpcyBvbmx5IGRvbmUgaWYgYW4gRXhjZXB0aW9uIHdhcyBjYXRjaGVkXG4gICAgcmVzdWx0ID0gZlwiJ3tlcnJvcl9jbGFzc30nOiB7ZGV0YWlsfSB7bGluZV9udW1iZXJ9XCJcbiAgICBwcmludChyZXN1bHQpXG4gICAgIyBTdHlsaW5nIHRoZSBwcmUgZWxlbWVudCBmb3IgZXJyb3JcbiAgICBlcnJvcl9oZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDNcIilcbiAgICBlcnJvcl9oZWFkZXIuaW5uZXJIVE1MID0gXCJFcnJvclwiXG4gICAgZXJyb3JfaGVhZGVyLnN0eWxlLmZvbnQgPSBcIjI0cHggJ0FyaWFsJ1wiXG4gICAgcHJlRWxlbS5wcmVwZW5kKGVycm9yX2hlYWRlcilcbiAgICBjb250YWluZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCIjZjJkZWRlXCJcbiAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyID0gXCIxcHggc29saWQgI2ViY2NkMVwiXG4gICAgbG9nZ2VyLmNsYXNzTGlzdC5hZGQoXCJwbGFpbnRleHRcIilcbiAgICBkb2N1bWVudCA8PSBjb250YWluZXJcbm15X3Byb2cgPSAke0pTT04uc3RyaW5naWZ5KHByb2cpfVxubXlfZXhlYyhteV9wcm9nKVxuZG9jdW1lbnQgPD0gaHRtbC5TQ1JJUFQoXCJobGpzLmhpZ2hsaWdodEFsbCgpO1wiKVxuZG9jdW1lbnQgPD0gaHRtbC5TQ1JJUFQoXCJsZXQgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRhaW5lci1wcmUnKTsgbGV0IGhlaWdodCA9IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7IGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ0JvdHRvbSA9IFN0cmluZyhoZWlnaHQpKydweCc7XCIpXG4gICAgICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgPC9ib2R5PlxuICAgICAgICA8L2h0bWw+XG4gICAgICAgIGA7XG4gICAgICAgIHRoaXMub3V0cHV0LnNyY2RvYyA9IHByb2c7XG4gICAgfVxuXG4gICAgY3JlYXRlT3V0cHV0KCkge1xuICAgICAgICB0aGlzLmFsaWduVmVydGljYWwgPSB0cnVlO1xuICAgICAgICB2YXIgb3V0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiYWNfb3V0cHV0XCIpO1xuICAgICAgICBpZiAodGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtMTJcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtNVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dERpdiA9IG91dERpdjtcbiAgICAgICAgdGhpcy5vdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIFwid2hpdGVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInBvc2l0aW9uXCIsIFwicmVsYXRpdmVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImhlaWdodFwiLCBcIjQwMHB4XCIpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ3aWR0aFwiLCBcIjEwMCVcIik7XG4gICAgICAgIG91dERpdi5hcHBlbmRDaGlsZCh0aGlzLm91dHB1dCk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQob3V0RGl2KTtcbiAgICAgICAgdmFyIGNsZWFyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjbGVhckRpdikuY3NzKFwiY2xlYXJcIiwgXCJib3RoXCIpOyAvLyBuZWVkZWQgdG8gbWFrZSBwYXJlbnQgZGl2IHJlc2l6ZSBwcm9wZXJseVxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNsZWFyRGl2KTtcbiAgICB9XG4gICAgZW5hYmxlU2F2ZUxvYWQoKSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmVuZGVyXCIpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIVE1MQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIG9wdHMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHRoaXMuY29kZSA9ICQoXCI8dGV4dGFyZWEgLz5cIikuaHRtbCh0aGlzLm9yaWdFbGVtLmlubmVySFRNTCkudGV4dCgpO1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KFwiUmVuZGVyXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmNvZGUpO1xuICAgIH1cblxuICAgIGFzeW5jIHJ1blByb2coKSB7XG4gICAgICAgIHZhciBwcm9nID0gYXdhaXQgdGhpcy5idWlsZFByb2codHJ1ZSk7XG4gICAgICAgIGxldCBzYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICBpZiAoIXRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgICAgJCh0aGlzLmNvZGVEaXYpLnN3aXRjaENsYXNzKFwiY29sLW1kLTEyXCIsIFwiY29sLW1kLTZcIiwge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dERpdikuc2hvdyh7IGR1cmF0aW9uOiA3MDAsIHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgcHJvZyA9XG4gICAgICAgICAgICBcIjxzY3JpcHQgdHlwZT10ZXh0L2phdmFzY3JpcHQ+d2luZG93Lm9uZXJyb3IgPSBmdW5jdGlvbihtc2csdXJsLGxpbmUpIHthbGVydChtc2crJyBvbiBsaW5lOiAnK2xpbmUpO307PC9zY3JpcHQ+XCIgK1xuICAgICAgICAgICAgcHJvZztcbiAgICAgICAgdGhpcy5vdXRwdXQuc3JjZG9jID0gcHJvZztcbiAgICB9XG5cbiAgICBjcmVhdGVPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHZhciBvdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJhY19vdXRwdXRcIik7XG4gICAgICAgIGlmICh0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC01XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0RGl2ID0gb3V0RGl2O1xuICAgICAgICB0aGlzLm91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJ3aGl0ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwiaGVpZ2h0XCIsIFwiNDAwcHhcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcIndpZHRoXCIsIFwiMTAwJVwiKTtcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMub3V0cHV0KTtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChvdXREaXYpO1xuICAgICAgICB2YXIgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgIH1cbiAgICBlbmFibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZW5kZXJcIikpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpTQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgfVxuICAgIG91dHB1dGZ1bihhKSB7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xuICAgICAgICB2YXIgc3RyID0gXCJbXCI7XG4gICAgICAgIGlmICh0eXBlb2YgYSA9PSBcIm9iamVjdFwiICYmIGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhW2ldID09IFwib2JqZWN0XCIgJiYgYVtpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IChpID09IDAgPyBcIlwiIDogXCIgXCIpICsgXCJbXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYVtpXS5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbaV1bal0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqID09IGFbaV0ubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiXVwiICsgKGkgPT0gYS5sZW5ndGggLSAxID8gXCJdXCIgOiBcIixcIikgKyBcIlxcblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCIsIFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Ugc3RyICs9IGFbaV0gKyAoaSA9PSBhLmxlbmd0aCAtIDEgPyBcIl1cIiA6IFwiLCBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0ciA9IEpTT04uc3RyaW5naWZ5KGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHN0ciA9IGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgdmFyIHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHZhciB3cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIF90aGlzLm91dHB1dC5pbm5lckhUTUwgKz0gX3RoaXMub3V0cHV0ZnVuKHN0cik7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB3cml0ZWxuID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgaWYgKCFzdHIpIHN0ciA9IFwiXCI7XG4gICAgICAgICAgICBfdGhpcy5vdXRwdXQuaW5uZXJIVE1MICs9IF90aGlzLm91dHB1dGZ1bihzdHIpICsgXCI8YnIgLz5cIjtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcbiAgICAgICAgJCh0aGlzLmVDb250YWluZXIpLnJlbW92ZSgpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXZhbChwcm9nKTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IFwic3VjY2Vzc1wiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yTWVzc2FnZShlKTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRFcnJvck1lc3NhZ2UoZXJyKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgZXJyb3IgbWVzc2FnZVxuICAgICAgICB0aGlzLmVyckxhc3RSdW4gPSB0cnVlO1xuICAgICAgICB2YXIgZXJySGVhZCA9ICQoXCI8aDM+XCIpLmh0bWwoXCJFcnJvclwiKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZXJyb3IgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5pZCA9IHRoaXMuZGl2aWQgKyBcIl9lcnJpbmZvXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChlcnJIZWFkWzBdKTtcbiAgICAgICAgdmFyIGVyclRleHQgPSB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpXG4gICAgICAgICk7XG4gICAgICAgIHZhciBlcnJTdHJpbmcgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPSBlcnJTdHJpbmc7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUnVudGltZSBFcnJvcjogXCIgKyBlcnIudG9TdHJpbmcoKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcbmltcG9ydCBIYW5kc29udGFibGUgZnJvbSBcImhhbmRzb250YWJsZVwiO1xuaW1wb3J0ICdoYW5kc29udGFibGUvZGlzdC9oYW5kc29udGFibGUuZnVsbC5jc3MnO1xuaW1wb3J0IGluaXRTcWxKcyBmcm9tIFwic3FsLmpzL2Rpc3Qvc3FsLXdhc20uanNcIjtcblxudmFyIGFsbERidXJscyA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTUUxBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgLy8gIGZucHJlZml4IHNldHMgdGhlIHBhdGggdG8gbG9hZCB0aGUgc3FsLXdhc20ud2FzbSBmaWxlXG4gICAgICAgIHZhciBib29rcHJlZml4O1xuICAgICAgICB2YXIgZm5wcmVmaXg7XG4gICAgICAgIGlmIChlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcykge1xuICAgICAgICAgICAgYm9va3ByZWZpeCA9IGAke2VCb29rQ29uZmlnLmFwcH0vYm9va3MvcHVibGlzaGVkLyR7ZUJvb2tDb25maWcuYmFzZWNvdXJzZX1gO1xuICAgICAgICAgICAgZm5wcmVmaXggPSBib29rcHJlZml4ICsgXCIvX3N0YXRpY1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYm9va3ByZWZpeCA9IFwiXCI7XG4gICAgICAgICAgICBmbnByZWZpeCA9IFwiL19zdGF0aWNcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIGxvY2F0ZUZpbGU6IChmaWxlbmFtZSkgPT4gYCR7Zm5wcmVmaXh9LyR7ZmlsZW5hbWV9YCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zaG93TGFzdCA9ICQodGhpcy5vcmlnRWxlbSkuZGF0YShcInNob3dsYXN0c3FsXCIpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGluaXRTcWxKcyh0aGlzLmNvbmZpZykudGhlbihmdW5jdGlvbiAoU1FMKSB7XG4gICAgICAgICAgICAvLyBzZXQgdXAgY2FsbCB0byBsb2FkIGRhdGFiYXNlIGFzeW5jaHJvbm91c2x5IGlmIGdpdmVuXG4gICAgICAgICAgICBpZiAoc2VsZi5kYnVybCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLmRidXJsLnN0YXJ0c1dpdGgoXCIvX3N0YXRpY1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmRidXJsID0gYCR7Ym9va3ByZWZpeH0ke3NlbGYuZGJ1cmx9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgbGV0IGJ1dHRvblRleHQgPSAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9sb2FkX2RiXCIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIShzZWxmLmRidXJsIGluIGFsbERidXJscykpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImxvYWRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHhXYWl0Rm9yOiBqUXVlcnkuRGVmZXJyZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnN0YXR1cyA9PSBcImxvYWRpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnhXYWl0Rm9yLmRvbmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0uZGJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYiA9IG5ldyBTUUwuRGF0YWJhc2UoYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLmRiKTtcbiAgICAgICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL2xlcm9jaGEvY2hpbm9vay1kYXRhYmFzZS9yYXcvbWFzdGVyL0NoaW5vb2tEYXRhYmFzZS9EYXRhU291cmNlcy9DaGlub29rX1NxbGl0ZS5zcWxpdGVcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBzZWxmLmRidXJsLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdUludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKHVJbnQ4QXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5kYiA9IHVJbnQ4QXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5zdGF0dXMgPSBcInJlYWR5XCI7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS54V2FpdEZvci5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRzIGlzIG5vdyBbe2NvbHVtbnM6Wydjb2wxJywnY29sMicsLi4uXSwgdmFsdWVzOltbZmlyc3Qgcm93XSwgW3NlY29uZCByb3ddLCAuLi5dfV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBydW5Qcm9nKG5vVUksIGxvZ1Jlc3VsdHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2dSZXN1bHRzID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gbG9nUmVzdWx0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5vVUkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBub1VJID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgYW55IG9sZCByZXN1bHRzXG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgbGV0IGRpdmlkID0gdGhpcy5kaXZpZCArIFwiX3NxbF9vdXRcIjtcbiAgICAgICAgbGV0IHJlc3BEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZpZCk7XG4gICAgICAgIGlmIChyZXNwRGl2KSB7XG4gICAgICAgICAgICByZXNwRGl2LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQocmVzcERpdik7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcIlwiKTtcbiAgICAgICAgLy8gUnVuIHRoaXMgcXVlcnlcbiAgICAgICAgbGV0IHF1ZXJ5ID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpOyAvLyBmYWxzZSAtLT4gRG8gbm90IGluY2x1ZGUgc3VmZml4XG4gICAgICAgIGlmICghdGhpcy5kYikge1xuICAgICAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcbiAgICAgICAgICAgICAgICBgRXJyb3I6IERhdGFiYXNlIG5vdCBpbml0aWFsaXplZCEgREJVUkw6ICR7dGhpcy5kYnVybH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGl0ID0gdGhpcy5kYi5pdGVyYXRlU3RhdGVtZW50cyhxdWVyeSk7XG4gICAgICAgIHRoaXMucmVzdWx0cyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIGl0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbHVtbnMgPSBzdGF0ZW1lbnQuZ2V0Q29sdW1uTmFtZXMoKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRhdGEhIHByb2JhYmx5IGEgU0VMRUNUXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGF0ZW1lbnQuc3RlcCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goc3RhdGVtZW50LmdldCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd2NvdW50OiBkYXRhLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5zcWwgPSBzdGF0ZW1lbnQuZ2V0Tm9ybWFsaXplZFNRTCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJlZml4ID0gbnNxbC5zdWJzdHIoMCwgNikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LnN0ZXAoKTsgLy8gZXhlY3V0ZSB0aGUgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVjdCBJTlNFUlQvVVBEQVRFL0RFTEVURSB0byBnaXZlIGZyaWVuZGx5IGZlZWRiYWNrXG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIHJvd3MgbW9kaWZpZWQgLSB1bmZvcnR1bmF0ZWx5LCB0aGlzIHdvbid0IGNhdGNoIHN1Y2ggcXVlcmllc1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IHVzZSBDVEVzLiAgVGhlcmUgc2VlbXMgdG8gYmUgbm8gcmVsaWFibGUgd2F5IG9mIGtub3dpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhIFNRTGl0ZSBxdWVyeSBhY3R1YWxseSBtb2RpZmllZCBkYXRhLlxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPT09IFwiaW5zZXJ0XCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9PT0gXCJ1cGRhdGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID09PSBcImRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBwcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Y291bnQ6IHRoaXMuZGIuZ2V0Um93c01vZGlmaWVkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHsgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHN0YXR1czogXCJmYWlsdXJlXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHNxbDogaXQuZ2V0UmVtYWluaW5nU1FMKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcImZhaWx1cmVcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIk5vIHF1ZXJpZXMgc3VibWl0dGVkLlwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHRoaXMuc2F2ZUNvZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVpdCkge1xuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9uKFxuICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImVuYWJsZVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byB1cGRhdGUgc2NydWJiZXIgJHtlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHJlc3BEaXYuaWQgPSBkaXZpZDtcbiAgICAgICAgdGhpcy5vdXREaXYuYXBwZW5kQ2hpbGQocmVzcERpdik7XG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coKTtcbiAgICAgICAgLy8gU29tZXRpbWVzIHdlIGRvbid0IHdhbnQgdG8gc2hvdyBhIGJ1bmNoIG9mIGludGVybWVkaWF0ZSByZXN1bHRzXG4gICAgICAgIC8vIGxpa2Ugd2hlbiB3ZSBhcmUgaW5jbHVkaW5nIGEgYnVuY2ggb2YgcHJldmlvdXMgc3RhdGVtZW50cyBmcm9tXG4gICAgICAgIC8vIG90aGVyIGFjdGl2ZWNvZGVzIEluIHRoYXQgY2FzZSB0aGUgc2hvd2xhc3RzcWwgZmxhZyBjYW4gYmUgc2V0XG4gICAgICAgIC8vIHNvIHdlIG9ubHkgc2hvdyB0aGUgbGFzdCByZXN1bHRcbiAgICAgICAgbGV0IHJlc3VsdEFycmF5ID0gdGhpcy5yZXN1bHRzO1xuICAgICAgICBpZiAodGhpcy5zaG93TGFzdCkge1xuICAgICAgICAgICAgcmVzdWx0QXJyYXkgPSB0aGlzLnJlc3VsdHMuc2xpY2UoLTEpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHIgb2YgcmVzdWx0QXJyYXkpIHtcbiAgICAgICAgICAgIGxldCBzZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHNlY3Rpb24uc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0XCIpO1xuICAgICAgICAgICAgcmVzcERpdi5hcHBlbmRDaGlsZChzZWN0aW9uKTtcbiAgICAgICAgICAgIGlmIChyLnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoci5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWJsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQodGFibGVEaXYpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF4SGVpZ2h0ID0gMzUwO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0QXJyYXkubGVuZ3RoID4gMSkgbWF4SGVpZ2h0ID0gMjAwOyAvLyBtYXggaGVpZ2h0IHNtYWxsZXIgaWYgbG90cyBvZiByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRhYmxlKHIsIHRhYmxlRGl2LCBtYXhIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBybXNnID0gci5yb3djb3VudCAhPT0gMSA/IFwiIHJvd3MgXCIgOiBcIiByb3cgXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2cgPSBcIlwiICsgci5yb3djb3VudCArIHJtc2cgKyBcInJldHVybmVkXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyLnJvd2NvdW50ID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBtc2cgKyBcIiAob25seSBmaXJzdCAxMDAgcm93cyBkaXNwbGF5ZWQpXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbXNnID0gbXNnICsgXCIuXCI7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnJvd2NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlQm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wID0gci5vcGVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIG9wID0gb3AgKyAob3AuY2hhckF0KG9wLmxlbmd0aCAtIDEpID09PSBcImVcIiA/IFwiZC5cIiA6IFwiZWQuXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm1zZyA9IHIucm93Y291bnQgIT09IDEgPyBcIiByb3dzIFwiIDogXCIgcm93IFwiO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnRleHRDb250ZW50ID0gXCJcIiArIHIucm93Y291bnQgKyBybXNnICsgb3A7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnRleHRDb250ZW50ID0gXCJPcGVyYXRpb24gc3VjY2VlZGVkLlwiO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiYWNfc3FsX3Jlc3VsdF9zdWNjZXNzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSByLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRfZmFpbHVyZVwiKTtcbiAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm93IGhhbmRsZSBhdXRvZ3JhZGluZ1xuICAgICAgICBpZiAodGhpcy5zdWZmaXgpIHtcbiAgICAgICAgICAgIHRoaXMudGVzdFJlc3VsdCA9IHRoaXMuYXV0b2dyYWRlKFxuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0c1t0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcImRvbmVcIik7XG4gICAgfVxuXG4gICAgbG9nQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgdGhpcy5sb2dSdW5FdmVudCh7XG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgbGFuZzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgICAgIGVycmluZm86IHRoaXMucmVzdWx0c1t0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMV0uc3RhdHVzLFxuICAgICAgICAgICAgdG9fc2F2ZTogdGhpcy5zYXZlQ29kZSxcbiAgICAgICAgICAgIHByZWZpeDogdGhpcy5wcmV0ZXh0LFxuICAgICAgICAgICAgc3VmZml4OiB0aGlzLnN1ZmZpeCxcbiAgICAgICAgICAgIHBhcnRuZXI6IHRoaXMucGFydG5lcixcbiAgICAgICAgfSk7IC8vIExvZyB0aGUgcnVuIGV2ZW50XG5cbiAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwidW5pdHRlc3RcIixcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgY291cnNlOiBlQm9va0NvbmZpZy5jb3Vyc2UsXG4gICAgICAgICAgICAgICAgYWN0OiB0aGlzLnVuaXRfcmVzdWx0cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQodGhpcy50ZXN0UmVzdWx0KTtcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXV0b2dyYWRlKHJlc3VsdF90YWJsZSkge1xuICAgICAgICB2YXIgdGVzdHMgPSB0aGlzLnN1ZmZpeC5zcGxpdCgvXFxuLyk7XG4gICAgICAgIHRoaXMucGFzc2VkID0gMDtcbiAgICAgICAgdGhpcy5mYWlsZWQgPSAwO1xuICAgICAgICAvLyBUZXN0cyBzaG91bGQgYmUgb2YgdGhlIGZvcm1cbiAgICAgICAgLy8gYXNzZXJ0IHJvdyxjb2wgb3BlciB2YWx1ZSBmb3IgZXhhbXBsZVxuICAgICAgICAvLyBhc3NlcnQgNCw0ID09IDNcbiAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIHRlc3RzID0gdGVzdHMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gcy5pbmRleE9mKFwiYXNzZXJ0XCIpID4gLTE7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCB0ZXN0IG9mIHRlc3RzKSB7XG4gICAgICAgICAgICBsZXQgd2xpc3QgPSB0ZXN0LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICB3bGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgbGV0IGxvYyA9IHdsaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgb3BlciA9IHdsaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSB3bGlzdC5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGxldCBbcm93LCBjb2xdID0gbG9jLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnRlc3RPbmVBc3NlcnQoXG4gICAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICAgIGNvbCxcbiAgICAgICAgICAgICAgICBvcGVyLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkLFxuICAgICAgICAgICAgICAgIHJlc3VsdF90YWJsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwY3QgPSAoMTAwICogdGhpcy5wYXNzZWQpIC8gKHRoaXMucGFzc2VkICsgdGhpcy5mYWlsZWQpO1xuICAgICAgICBwY3QgPSBwY3QudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogMiB9KTtcbiAgICAgICAgcmVzdWx0ICs9IGBZb3UgcGFzc2VkICR7dGhpcy5wYXNzZWR9IG91dCBvZiAke1xuICAgICAgICAgICAgdGhpcy5wYXNzZWQgKyB0aGlzLmZhaWxlZFxuICAgICAgICB9IHRlc3RzIGZvciAke3BjdH0lYDtcbiAgICAgICAgdGhpcy51bml0X3Jlc3VsdHMgPSBgcGVyY2VudDoke3BjdH06cGFzc2VkOiR7dGhpcy5wYXNzZWR9OmZhaWxlZDoke3RoaXMuZmFpbGVkfWA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRlc3RPbmVBc3NlcnQocm93LCBjb2wsIG9wZXIsIGV4cGVjdGVkLCByZXN1bHRfdGFibGUpIHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHJvdyBhbmQgY29sIGFyZSBpbiBib3VuZHNcbiAgICAgICAgbGV0IGFjdHVhbDtcbiAgICAgICAgbGV0IG91dHB1dCA9IFwiXCI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhY3R1YWwgPSByZXN1bHRfdGFibGUudmFsdWVzW3Jvd11bY29sXTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgb3V0cHV0ID0gYEZhaWxlZCBOb3QgZW5vdWdoIGRhdGEgdG8gY2hlY2sgcm93ICR7cm93fSBvciBjb2x1bW4gJHtjb2x9YDtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlcmF0b3JzID0ge1xuICAgICAgICAgICAgXCI9PVwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID09IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiIT1cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSAhPSBvcGVyYW5kMjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIj5cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSA+IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiPFwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID4gb3BlcmFuZDI7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmVzID0gb3BlcmF0b3JzW29wZXJdKGFjdHVhbCwgZXhwZWN0ZWQpO1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgUGFzczogJHthY3R1YWx9ICR7b3Blcn0gJHtleHBlY3RlZH0gaW4gcm93ICR7cm93fSBjb2x1bW4gJHtyZXN1bHRfdGFibGUuY29sdW1uc1tjb2xdfWA7XG4gICAgICAgICAgICB0aGlzLnBhc3NlZCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0ID0gYEZhaWxlZCAke2FjdHVhbH0gJHtvcGVyfSAke2V4cGVjdGVkfSBpbiByb3cgJHtyb3d9IGNvbHVtbiAke3Jlc3VsdF90YWJsZS5jb2x1bW5zW2NvbF19YDtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhYmxlKHRhYmxlRGF0YSwgY29udGFpbmVyLCBtYXhIZWlnaHQpIHtcbiAgICBsZXQgZGF0YSA9IHRhYmxlRGF0YS52YWx1ZXM7XG4gICAgbGV0IHRyaW1Sb3dzID0gdW5kZWZpbmVkO1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBrbHVkZ2U6IG5vIGNvbHVtbiBoZWFkZXJzIHdpbGwgc2hvdyB1cCB1bmxlc3Mgd2UgZG8gdGhpc1xuICAgICAgICBkYXRhID0gW3RhYmxlRGF0YS5jb2x1bW5zLm1hcCgoZSkgPT4gbnVsbCldO1xuICAgICAgICB0cmltUm93cyA9IFswXTtcbiAgICB9XG5cbiAgICB2YXIgaG90ID0gbmV3IEhhbmRzb250YWJsZShjb250YWluZXIsIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgdHJpbVJvd3M6IHRyaW1Sb3dzLFxuICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgIGhlaWdodDogbWF4SGVpZ2h0LFxuICAgICAgICBhdXRvUm93U2l6ZTogdHJ1ZSxcbiAgICAgICAgYXV0b0NvbHVtblNpemU6IHsgdXNlSGVhZGVyczogdHJ1ZSB9LFxuICAgICAgICByb3dIZWFkZXJzOiBmYWxzZSxcbiAgICAgICAgY29sSGVhZGVyczogdGFibGVEYXRhLmNvbHVtbnMsXG4gICAgICAgIGVkaXRvcjogZmFsc2UsXG4gICAgICAgIG1heFJvd3M6IDEwMCxcbiAgICAgICAgZmlsdGVyczogZmFsc2UsXG4gICAgICAgIGRyb3Bkb3duTWVudTogZmFsc2UsXG4gICAgICAgIGxpY2Vuc2VLZXk6IFwibm9uLWNvbW1lcmNpYWwtYW5kLWV2YWx1YXRpb25cIixcbiAgICB9KTtcblxuICAgIC8vIGNhbGN1bGF0ZSBhY3R1YWwgaGVpZ2h0IGFuZCByZXNpemVcbiAgICBsZXQgYWN0dWFsSGVpZ2h0ID0gNDA7IC8vIGhlYWRlciBoZWlnaHQgKyBzbWFsbCBtYXJnaW5cbiAgICBpZiAodGFibGVEYXRhLnZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYWN0dWFsSGVpZ2h0ID0gYWN0dWFsSGVpZ2h0ICsgaG90LmdldFJvd0hlaWdodChpKTtcbiAgICAgICAgICAgIGlmIChhY3R1YWxIZWlnaHQgPiBtYXhIZWlnaHQpIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG90LnVwZGF0ZVNldHRpbmdzKHsgaGVpZ2h0OiBhY3R1YWxIZWlnaHQgfSk7XG5cbiAgICByZXR1cm4gaG90O1xufVxuIiwiaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XG5cbi8vIGZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIGF1ZGlvIHRvdXJzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdWRpb1RvdXIgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihkaXZpZCwgY29kZSwgYm51bSwgYXVkaW9fdGV4dCkge1xuICAgICAgICAvLyBCdWcgRml4OiBJZiBhIGNsYXNzIGV4dGVuZHMgYW5vdGhlciBjbGFzcywgdGhpcyBpcyB1bmRlZmluZWQgVU5USUwgc3VwZXIgaXMgY2FsbGVkXG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYXVkaW9fdG91ciA9IG51bGw7XG4gICAgICAgIHRoaXMuYXVkaW9fY29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMud2luZG93Y29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBudWxsO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy50b3VyQnV0dG9ucyA9IFtdO1xuICAgICAgICB0aGlzLmVsZW0gPSBudWxsOyAvLyBjdXJyZW50IGF1ZGlvIGVsZW1lbnQgcGxheWluZ1xuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IG51bGw7IC8vIGN1cnJlbnQgaW5kZXhcbiAgICAgICAgdGhpcy5sZW4gPSBudWxsOyAvLyBjdXJyZW50IGxlbmd0aCBvZiBhdWRpbyBmaWxlcyBmb3IgdG91clxuICAgICAgICB0aGlzLmJ1dHRvbkNvdW50ID0gbnVsbDsgLy8gbnVtYmVyIG9mIGF1ZGlvIHRvdXIgYnV0dG9uc1xuICAgICAgICB0aGlzLmFuYW1lID0gbnVsbDsgLy8gdGhlIGF1ZGlvIGZpbGUgbmFtZVxuICAgICAgICB0aGlzLmFoYXNoID0gbnVsbDsgLy8gaGFzaCBvZiB0aGUgYXVkaW8gZmlsZSBuYW1lIHRvIHRoZSBsaW5lcyB0byBoaWdobGlnaHRcbiAgICAgICAgdGhpcy50aGVEaXZpZCA9IG51bGw7IC8vIGRpdiBpZFxuICAgICAgICB0aGlzLmFmaWxlID0gbnVsbDsgLy8gZmlsZSBuYW1lIGZvciBhdWRpb1xuICAgICAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTsgLy8gZmxhZyB0byBzYXkgaWYgcGxheWluZyBvciBub3RcbiAgICAgICAgdGhpcy50b3VyTmFtZSA9IFwiXCI7XG4gICAgICAgIC8vIFJlcGxhY2luZyBoYXMgYmVlbiBkb25lIGhlcmUgdG8gbWFrZSBzdXJlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgY29kZSBhcmUgZGlzcGxheWVkIGNvcnJlY3RseVxuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKmRvdWJsZXEqXCIsICdcIicpO1xuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKnNpbmdsZXEqXCIsIFwiJ1wiKTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZUFsbChcIipvcGVuKlwiLCBcIihcIik7XG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2VBbGwoXCIqY2xvc2UqXCIsIFwiKVwiKTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZUFsbChcIipubGluZSpcIiwgXCI8YnIvPlwiKTtcbiAgICAgICAgdmFyIGNvZGVBcnJheSA9IGNvZGUuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIHZhciBhdWRpb19oYXNoID0gW107XG4gICAgICAgIHZhciBidmFsID0gW107XG4gICAgICAgIHZhciBhdHlwZSA9IGF1ZGlvX3RleHQucmVwbGFjZUFsbChcIipkb3VibGVxKlwiLCAnXCInKTtcbiAgICAgICAgdmFyIGF1ZGlvX3R5cGUgPSBhdHlwZS5zcGxpdChcIiphdHlwZSpcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXVkaW9fdHlwZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGF1ZGlvX2hhc2hbaV0gPSBhdWRpb190eXBlW2ldO1xuICAgICAgICAgICAgdmFyIGF3b3JkID0gYXVkaW9fdHlwZVtpXS5zcGxpdChcIjtcIik7XG4gICAgICAgICAgICBidmFsLnB1c2goYXdvcmRbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmaXJzdCA9XG4gICAgICAgICAgICBcIjxwcmU+PGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgXCJfbDEnPlwiICtcbiAgICAgICAgICAgIFwiMS4gICBcIiArXG4gICAgICAgICAgICBjb2RlQXJyYXlbMF0gK1xuICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgdmFyIG51bV9saW5lcyA9IGNvZGVBcnJheS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbnVtX2xpbmVzOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpIDwgOSkge1xuICAgICAgICAgICAgICAgIGZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgK1xuICAgICAgICAgICAgICAgICAgICBcIjxkaXYgaWQ9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgICAgICAgICBcIl9sXCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCInPlwiICtcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwiLiAgIFwiICtcbiAgICAgICAgICAgICAgICAgICAgY29kZUFycmF5W2ldICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDk5KSB7XG4gICAgICAgICAgICAgICAgZmlyc3QgPVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCArXG4gICAgICAgICAgICAgICAgICAgIFwiPGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgICAgICAgICBkaXZpZCArXG4gICAgICAgICAgICAgICAgICAgIFwiX2xcIiArXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICBcIic+XCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCIuICBcIiArXG4gICAgICAgICAgICAgICAgICAgIGNvZGVBcnJheVtpXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgK1xuICAgICAgICAgICAgICAgICAgICBcIjxkaXYgaWQ9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgICAgICAgICBcIl9sXCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCInPlwiICtcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwiLiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGNvZGVBcnJheVtpXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3QgPSBmaXJzdCArIFwiPC9wcmU+XCI7XG4gICAgICAgIC8vbGF5aW5nIG91dCB0aGUgSFRNTCBjb250ZW50XG4gICAgICAgIHZhciBiY291bnQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF1ZGlvX3R5cGUubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbmV3QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgICAgIG5ld0J1dHRvbi5jbGFzc05hbWUgPSBcImJ0biBidG4tc3VjY2Vzc1wiO1xuICAgICAgICAgICAgbmV3QnV0dG9uLmlubmVySFRNTCA9IGJ2YWxbaV0ucmVwbGFjZSgvXFxcIi9nLCBcIlwiKTtcbiAgICAgICAgICAgIHRoaXMudG91ckJ1dHRvbnMucHVzaChuZXdCdXR0b24pO1xuICAgICAgICAgICAgYmNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdWRpb190b3VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5hdWRpb190b3VyLmFsaWduID0gXCJjZW50ZXJcIjtcbiAgICAgICAgdGhpcy5hdWRpb19jb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgIHRoaXMud2luZG93Y29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMud2luZG93Y29kZS5hbGlnbiA9IFwibGVmdFwiO1xuICAgICAgICAkKHRoaXMud2luZG93Y29kZSkuaHRtbChmaXJzdCk7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5jbGFzc05hbWUgPVxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLWZhc3QtYmFja3dhcmRcIjtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tc3RlcC1iYWNrd2FyZFwiO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9IFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1wYXVzZVwiO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uY2xhc3NOYW1lID1cbiAgICAgICAgICAgIFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1zdGVwLWZvcndhcmRcIjtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tZmFzdC1mb3J3YXJkXCI7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0OiAyMnB4OyB3aWR0aDogMjVweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tcmlnaHQ6MnB4O1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0OiAyMnB4OyB3aWR0aDogMjVweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tcmlnaHQ6MnB4O1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubGFzdF9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBcImhlaWdodDogMjJweDsgd2lkdGg6IDI1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXJpZ2h0OjJweDtcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLm5hbWUgPSBcImZpcnN0X2F1ZGlvXCI7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby5uYW1lID0gXCJwcmV2X2F1ZGlvXCI7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8ubmFtZSA9IFwicGF1c2VfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLm5hbWUgPSBcIm5leHRfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLm5hbWUgPSBcImxhc3RfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby50aXRsZSA9IFwiUGxheSBmaXJzdCBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby50aXRsZSA9IFwiUGxheSBwcmV2aW91cyBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSBcIlBhdXNlIGN1cnJlbnQgYXVkaW9cIjtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnRpdGxlID0gXCJQbGF5IG5leHQgYXVkaW8gaW4gdG91clwiO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8udGl0bGUgPSBcIlBsYXkgbGFzdCBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIlBsYXkgZmlyc3QgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiLFxuICAgICAgICAgICAgXCJQbGF5IHByZXZpb3VzIGF1ZGlvIGluIHRvdXJcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQYXVzZSBhdWRpb1wiKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQbGF5IG5leHQgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQbGF5IGxhc3QgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuc3RhdHVzLmNsYXNzTmFtZSA9IFwiYWxlcnQgYWxlcnQtaW5mb1wiO1xuICAgICAgICB0aGlzLnN0YXR1cy5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImRpc3BsYXk6IG5vbmU7XCIpO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5zdG9wX2J1dHRvbi5jbGFzc05hbWUgPSBcImJ0biBidG4tZGVmYXVsdFwiO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uLmlubmVySFRNTCA9IFwiU3RvcCB0b3VyXCI7XG4gICAgICAgICQodGhpcy5hdWRpb190b3VyKS5hcHBlbmQoXG4gICAgICAgICAgICB0aGlzLmF1ZGlvX2NvZGUsXG4gICAgICAgICAgICB0aGlzLndpbmRvd2NvZGUsXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIiksXG4gICAgICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpbyxcbiAgICAgICAgICAgIHRoaXMubmV4dF9hdWRpbyxcbiAgICAgICAgICAgIHRoaXMubGFzdF9hdWRpbyxcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSxcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzLFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpLFxuICAgICAgICAgICAgdGhpcy50b3VyQnV0dG9ucyxcbiAgICAgICAgICAgIHRoaXMuc3RvcF9idXR0b25cbiAgICAgICAgKTtcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX2NvZGVfZGl2XCIpLmFwcGVuZCh0aGlzLmF1ZGlvX3RvdXIpO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuYWNfY29kZV9kaXZcIikuY3NzKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuQ29kZU1pcnJvci5jbS1zLWRlZmF1bHQudWktcmVzaXphYmxlXCIpLmhpZGUoKTtcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX29wdC5idG4uYnRuLWRlZmF1bHQ6bGFzdC1jaGlsZFwiKS5oaWRlKCk7XG4gICAgICAgICQodGhpcy5zdG9wX2J1dHRvbikuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW0ucGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgICAgICBhY3Q6IFwiY2xvc2VXaW5kb3dcIixcbiAgICAgICAgICAgICAgICAgICAgZGl2X2lkOiBkaXZpZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAkKHRoaXMuYXVkaW9fdG91cikucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAgICAgXCIjXCIgKyBkaXZpZCArIFwiIC5Db2RlTWlycm9yLmNtLXMtZGVmYXVsdC51aS1yZXNpemFibGVcIlxuICAgICAgICAgICAgICAgICkuc2hvdygpO1xuICAgICAgICAgICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19vcHQuYnRuLmJ0bi1kZWZhdWx0Omxhc3QtY2hpbGRcIikuc2hvdygpO1xuICAgICAgICAgICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19jb2RlX2RpdlwiKS5jc3MoXCJ3aWR0aFwiLCBcIlwiKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMF0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFswXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMV0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFsxXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMl0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFsyXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbM10pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFszXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbNF0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFs0XSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdEF1ZGlvKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjbGljayB0byBnbyB0byB0aGUgbmV4dCBhdWRpb1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2QXVkaW8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIHBhdXNlIG9yIHBsYXkgdGhlIGF1ZGlvXG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZUFuZFBsYXlBdWRpbyhkaXZpZCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjbGljayB0byBnbyB0byB0aGUgbmV4dCBhdWRpb1xuICAgICAgICAkKHRoaXMubmV4dF9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0QXVkaW8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RBdWRpbygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIC8vIG1ha2UgdGhlIGltYWdlIGJ1dHRvbnMgbG9vayBkaXNhYmxlZFxuICAgICAgICAkKHRoaXMuZmlyc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICB9XG4gICAgdG91cihkaXZpZCwgYXVkaW9fdHlwZSwgYmNvdW50KSB7XG4gICAgICAgIC8vIHNldCBnbG9iYWxzXG4gICAgICAgIHRoaXMuYnV0dG9uQ291bnQgPSBiY291bnQ7XG4gICAgICAgIHRoaXMudGhlRGl2aWQgPSBkaXZpZDtcbiAgICAgICAgdGhpcy5zdGF0dXMuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi10b3A6IDdweDsgbWFyZ2luLWJvdHRvbTogM3B4O1wiXG4gICAgICAgICk7XG4gICAgICAgIC8vIGVuYWJsZSBwcmV2LCBwYXVzZS9wbGF5IGFuZCBuZXh0IGJ1dHRvbnMgYW5kIG1ha2UgdmlzaWJsZVxuICAgICAgICAkKHRoaXMuZmlyc3RfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgLy8gZGlzYWJsZSB0b3VyIGJ1dHRvbnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiY291bnQ7IGkrKylcbiAgICAgICAgICAgICQodGhpcy50b3VyQnV0dG9uc1tpXSkuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgIHZhciBhdHlwZSA9IGF1ZGlvX3R5cGUuc3BsaXQoXCI7XCIpO1xuICAgICAgICB2YXIgbmFtZSA9IGF0eXBlWzBdLnJlcGxhY2VBbGwoJ1wiJywgXCIgXCIpO1xuICAgICAgICB0aGlzLnRvdXJOYW1lID0gbmFtZTtcbiAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zdGFydGluZ1wiLCBuYW1lKSk7XG4gICAgICAgIC8vbG9nIHRvdXIgdHlwZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7IGV2ZW50OiBcIkF1ZGlvXCIsIGFjdDogbmFtZSwgZGl2X2lkOiBkaXZpZCB9KTtcbiAgICAgICAgdmFyIG1heCA9IGF0eXBlLmxlbmd0aDtcbiAgICAgICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgICAgIHRoaXMuYWhhc2ggPSBbXTtcbiAgICAgICAgdGhpcy5hbmFtZSA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbWF4IC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGVtcCA9IGF0eXBlW2ldLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgIHZhciB0ZW1wX2xpbmUgPSB0ZW1wWzBdO1xuICAgICAgICAgICAgdmFyIHRlbXBfYW5hbWUgPSB0ZW1wWzFdO1xuICAgICAgICAgICAgdmFyIGFrZXkgPSB0ZW1wX2FuYW1lLnN1YnN0cmluZygxLCB0ZW1wX2FuYW1lLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgbG51bXMgPSB0ZW1wX2xpbmUuc3Vic3RyaW5nKDEsIHRlbXBfbGluZS5sZW5ndGgpO1xuICAgICAgICAgICAgLy9hbGVydChcImFrZXk6XCIrYWtleStcImxudW06XCIrbG51bXMpO1xuICAgICAgICAgICAgLy8gc3RyKz1cIjxhdWRpbyBpZD1cIitha2V5K1wiIHByZWxvYWQ9J2F1dG8nPjxzb3VyY2Ugc3JjPSdodHRwOi8vaWNlLXdlYi5jYy5nYXRlY2guZWR1L2NlMjEvYXVkaW8vXCIrXG4gICAgICAgICAgICAvLyBha2V5K1wiLm1wMycgdHlwZT0nYXVkaW8vbXBlZyc+PHNvdXJjZSBzcmM9J2h0dHA6Ly9pY2Utd2ViLmNjLmdhdGVjaC5lZHUvY2UyMS9hdWRpby9cIitha2V5K1xuICAgICAgICAgICAgLy8gXCIub2dnJyB0eXBlPSdhdWRpby9vZ2cnPllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhdWRpbyB0YWc8L2F1ZGlvPlwiO1xuICAgICAgICAgICAgLy92YXIgZGlyID1cbiAgICAgICAgICAgIC8vICAgIFwiaHR0cDovL21lZGlhLmludGVyYWN0aXZlcHl0aG9uLm9yZy9cIiArXG4gICAgICAgICAgICAvLyAgICBlQm9va0NvbmZpZy5iYXNlY291cnNlLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICAgICAgLy8gICAgXCIvYXVkaW8vXCI7XG4gICAgICAgICAgICB2YXIgZGlyID0gXCIuLi9fc3RhdGljL2F1ZGlvL1wiXG4gICAgICAgICAgICBzdHIgKz0gXCI8YXVkaW8gaWQ9XCIgKyBha2V5ICsgXCIgcHJlbG9hZD0nYXV0bycgPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLndhdicgdHlwZT0nYXVkaW8vd2F2Jz5cIjtcbiAgICAgICAgICAgIHN0ciArPSBcIjxzb3VyY2Ugc3JjPSdcIiArIGRpciArIGFrZXkgKyBcIi5tcDMnIHR5cGU9J2F1ZGlvL21wZWcnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLndhdicgdHlwZT0nYXVkaW8vd2F2Jz5cIjtcbiAgICAgICAgICAgIHN0ciArPSBcIjxzb3VyY2Ugc3JjPSdcIiArIGRpciArIGFrZXkgKyBcIi5tcDMnIHR5cGU9J2F1ZGlvL21wZWcnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPGJyIC8+WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGF1ZGlvIHRhZzwvYXVkaW8+XCI7XG4gICAgICAgICAgICB0aGlzLmFoYXNoW2FrZXldID0gbG51bXM7XG4gICAgICAgICAgICB0aGlzLmFuYW1lLnB1c2goYWtleSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLmF1ZGlvX2NvZGUpLmh0bWwoc3RyKTtcbiAgICAgICAgdGhpcy5sZW4gPSB0aGlzLmFuYW1lLmxlbmd0aDsgLy8gc2V0IHRoZSBudW1iZXIgb2YgYXVkaW8gZmlsZSBpbiB0aGUgdG91clxuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgfVxuICAgIGhhbmRsZVBsYXlpbmcoKSB7XG4gICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpO1xuICAgICAgICAvLyB1bmJpbmQgY3VycmVudCBlbmRlZFxuICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkudW5iaW5kKFwiZW5kZWRcIik7XG4gICAgICAgIC8vIHVuaGlnaGxpZ2h0IHRoZSBwcmV2IGxpbmVzXG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRMaW5lcyhcbiAgICAgICAgICAgIHRoaXMudGhlRGl2aWQsXG4gICAgICAgICAgICB0aGlzLmFoYXNoW3RoaXMuYW5hbWVbdGhpcy5jdXJySW5kZXhdXVxuICAgICAgICApO1xuICAgIH1cbiAgICBmaXJzdEF1ZGlvKCkge1xuICAgICAgICAvLyBpZiBhdWRpbyBpcyB0aGlzLnBsYXlpbmcgaGFuZGxlIGl0XG4gICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgIGFjdDogXCJmaXJzdFwiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gbW92ZSB0byB0aGUgZmlyc3QgYXVkaW9cbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSAwO1xuICAgICAgICAvLyBzdGFydCBhdCB0aGUgZmlyc3QgYXVkaW9cbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICB9XG4gICAgcHJldkF1ZGlvKCkge1xuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIGF1ZGlvXG4gICAgICAgIGlmICh0aGlzLmN1cnJJbmRleCA+IDApIHtcbiAgICAgICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgICAgICBhY3Q6IFwicHJldlwiLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbW92ZSB0byBwcmV2aW91cyB0byB0aGUgY3VycmVudCAoYnV0IHRoZSBjdXJyZW50IGluZGV4IGhhcyBtb3ZlZCB0byB0aGUgbmV4dClcbiAgICAgICAgICAgIHRoaXMuY3VyckluZGV4ID0gdGhpcy5jdXJySW5kZXggLSAxO1xuICAgICAgICAgICAgLy8gc3RhcnQgYXQgdGhlIHByZXYgYXVkaW9cbiAgICAgICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dEF1ZGlvKCkge1xuICAgICAgICAvLyBpZiBhdWRpbyBpcyB0aGlzLnBsYXlpbmcgaGFuZGxlIGl0XG4gICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgIGFjdDogXCJuZXh0XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMudGhlRGl2aWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpZiBub3QgYXQgdGhlIGVuZFxuICAgICAgICBpZiAodGhpcy5jdXJySW5kZXggPCB0aGlzLmxlbiAtIDEpIHtcbiAgICAgICAgICAgIC8vIHN0YXJ0IGF0IHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICAgICB0aGlzLmN1cnJJbmRleCA9IHRoaXMuY3VyckluZGV4ICsgMTtcbiAgICAgICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJySW5kZXggPT0gdGhpcy5sZW4gLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVRvdXJFbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsYXN0QXVkaW8oKSB7XG4gICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgdGhpcy5oYW5kbGVQbGF5aW5nKCk7XG4gICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgYWN0OiBcImxhc3RcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG1vdmUgdG8gdGhlIGxhc3QgYXVkaW9cbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSB0aGlzLmxlbiAtIDE7XG4gICAgICAgIC8vIHN0YXJ0IGF0IGxhc3RcbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICB9XG4gICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIGN1cnJlbnQgaW5kZXhcbiAgICBwbGF5Q3VyckluZGV4QXVkaW8oKSB7XG4gICAgICAgIC8vIHNldCB0aGlzLnBsYXlpbmcgdG8gZmFsc2VcbiAgICAgICAgdGhpcy5wbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIC8vIHBsYXkgdGhlIGN1cnJlbnQgYXVkaW8gYW5kIGhpZ2hsaWdodCB0aGUgbGluZXNcbiAgICAgICAgdGhpcy5wbGF5YXVkaW8odGhpcy5jdXJySW5kZXgsIHRoaXMuYW5hbWUsIHRoaXMudGhlRGl2aWQsIHRoaXMuYWhhc2gpO1xuICAgIH1cbiAgICAvLyBoYW5kbGUgdGhlIGVuZCBvZiB0aGUgdG91clxuICAgIGhhbmRsZVRvdXJFbmQoKSB7XG4gICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoXCJUaGUgXCIgKyB0aGlzLnRvdXJOYW1lICsgXCIgaGFzIGVuZGVkLlwiKTtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5jbGFzc05hbWUgPSBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tcGF1c2VcIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby50aXRsZSA9IFwiUGF1c2UgYXVkaW9cIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiUGF1c2UgYXVkaW9cIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAvLyBlbmFibGUgdGhlIHRvdXIgYnV0dG9uc1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuYnV0dG9uQ291bnQ7IGorKylcbiAgICAgICAgICAgICQodGhpcy50b3VyQnV0dG9uc1tqXSkucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgIH1cbiAgICAvLyBvbmx5IGNhbGwgdGhpcyBvbmUgYWZ0ZXIgdGhlIGZpcnN0IHRpbWVcbiAgICBvdXRlckF1ZGlvKCkge1xuICAgICAgICAvLyB1bmJpbmQgZW5kZWRcbiAgICAgICAgJChcIiNcIiArIHRoaXMuYWZpbGUpLnVuYmluZChcImVuZGVkXCIpO1xuICAgICAgICAvLyBzZXQgdGhpcy5wbGF5aW5nIHRvIGZhbHNlXG4gICAgICAgIHRoaXMucGxheWluZyA9IGZhbHNlO1xuICAgICAgICAvLyB1bmhpZ2hsaWdodCBwcmV2aW91cyBsaW5lcyBmcm9tIHRoZSBsYXN0IGF1ZGlvXG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRMaW5lcyhcbiAgICAgICAgICAgIHRoaXMudGhlRGl2aWQsXG4gICAgICAgICAgICB0aGlzLmFoYXNoW3RoaXMuYW5hbWVbdGhpcy5jdXJySW5kZXhdXVxuICAgICAgICApO1xuICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHRoaXMuY3VyckluZGV4IHRvIHBvaW50IHRvIHRoZSBuZXh0IG9uZVxuICAgICAgICB0aGlzLmN1cnJJbmRleCsrO1xuICAgICAgICAvLyBpZiB0aGUgZW5kIG9mIHRoZSB0b3VyIHJlc2V0IHRoZSBidXR0b25zXG4gICAgICAgIGlmICh0aGlzLmN1cnJJbmRleCA9PSB0aGlzLmxlbikge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVUb3VyRW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBub3QgZG9uZSB5ZXQgc28gcGxheSB0aGUgbmV4dCBhdWRpb1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBsYXkgdGhlIGF1ZGlvIGF0IHRoZSBjdXJyZW50IGluZGV4XG4gICAgICAgICAgICB0aGlzLnBsYXlDdXJySW5kZXhBdWRpbygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHBsYXkgdGhlIGF1ZGlvIG5vdyB0aGF0IGl0IGlzIHJlYWR5XG4gICAgcGxheVdoZW5SZWFkeShhZmlsZSwgZGl2aWQsIGFoYXNoKSB7XG4gICAgICAgIC8vIHVuYmluZCBjdXJyZW50XG4gICAgICAgICQoXCIjXCIgKyBhZmlsZSkudW5iaW5kKFwiY2FucGxheXRocm91Z2hcIik7XG4gICAgICAgIHRoaXMuZWxlbS5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgIHRoaXMucGxheWluZyA9IHRydWU7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJpbiBwbGF5V2hlblJlYWR5IFwiICsgZWxlbS5kdXJhdGlvbik7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGFoYXNoW2FmaWxlXSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID09PVxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlpbmdcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKFwiI1wiICsgYWZpbGUpLmJpbmQoXG4gICAgICAgICAgICAgICAgXCJlbmRlZFwiLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRlckF1ZGlvKCk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5lbGVtLnBsYXkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQoXCIjXCIgKyBhZmlsZSkuYmluZChcbiAgICAgICAgICAgICAgICBcImVuZGVkXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGVyQXVkaW8oKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBpIGFuZCBzZXQgdGhlIGR1cmF0aW9uIGFuZCBoaWdobGlnaHQgdGhlIGxpbmVzXG4gICAgcGxheWF1ZGlvKGksIGFuYW1lLCBkaXZpZCwgYWhhc2gpIHtcbiAgICAgICAgdGhpcy5hZmlsZSA9IGFuYW1lW2ldO1xuICAgICAgICB0aGlzLmVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmFmaWxlKTtcbiAgICAgICAgLy8gaWYgdGhpcyBpc24ndCByZWFkeSB0byBwbGF5IHlldCAtIG5vIGR1cmF0aW9uIHlldCB0aGVuIHdhaXRcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImluIHBsYXlhdWRpbyBcIiArIGVsZW0uZHVyYXRpb24pO1xuICAgICAgICBpZiAoaXNOYU4odGhpcy5lbGVtLmR1cmF0aW9uKSB8fCB0aGlzLmVsZW0uZHVyYXRpb24gPT0gMCkge1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBzdGF0dXNcbiAgICAgICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbG9hZGluZ19hdWRpb1wiKSk7XG4gICAgICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkuYmluZChcbiAgICAgICAgICAgICAgICBcImNhbnBsYXl0aHJvdWdoXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlXaGVuUmVhZHkodGhpcy5hZmlsZSwgZGl2aWQsIGFoYXNoKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IGlzIHJlYWR5IHNvIHBsYXkgaXRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlXaGVuUmVhZHkodGhpcy5hZmlsZSwgZGl2aWQsIGFoYXNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBwYXVzZSBpZiB0aGlzLnBsYXlpbmcgYW5kIHBsYXkgaWYgcGF1c2VkXG4gICAgcGF1c2VBbmRQbGF5QXVkaW8oZGl2aWQpIHtcbiAgICAgICAgdmFyIGJ0biA9IHRoaXMucGF1c2VfYXVkaW87XG4gICAgICAgIC8vIGlmIHBhdXNlZCBhbmQgY2xpY2tlZCB0aGVuIGNvbnRpbnVlIGZyb20gY3VycmVudFxuICAgICAgICBpZiAodGhpcy5lbGVtLnBhdXNlZCkge1xuICAgICAgICAgICAgLy8gY2FsY3VhbHRlIHRoZSB0aW1lIGxlZnQgdG8gcGxheSBpbiBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gKHRoaXMuZWxlbS5kdXJhdGlvbiAtIHRoaXMuZWxlbS5jdXJyZW50VGltZSkgKiAxMDAwO1xuICAgICAgICAgICAgdGhpcy5lbGVtLnBsYXkoKTsgLy8gc3RhcnQgdGhlIGF1ZGlvIGZyb20gY3VycmVudCBzcG90XG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCI7XG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnRpdGxlID0gJC5pMThuKFxuICAgICAgICAgICAgICAgIFwibXNnX2FjdGl2ZWNvZGVfcGF1c2VfY3VycmVudF9hdWRpb1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGF1c2VfYXVkaW9cIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlpbmdcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJwbGF5XCIsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYXVkaW8gd2FzIHRoaXMucGxheWluZyBwYXVzZSBpdFxuICAgICAgICBlbHNlIGlmICh0aGlzLnBsYXlpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpOyAvLyBwYXVzZSB0aGUgYXVkaW9cbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID0gXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBsYXlcIjtcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9wbGF5X3BhdXNlZF9hdWRpb1wiKTtcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiLFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbChcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hdWRpb19wYXVzZWRcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJwYXVzZVwiLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHByb2Nlc3MgdGhlIGxpbmVzXG4gICAgcHJvY2Vzc0xpbmVzKGRpdmlkLCBsbnVtLCBjb2xvcikge1xuICAgICAgICB2YXIgY29tbWEgPSBsbnVtLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgaWYgKGNvbW1hLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEJhY2tncm91bmRGb3JMaW5lcyhkaXZpZCwgY29tbWFbaV0sIGNvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZEZvckxpbmVzKGRpdmlkLCBsbnVtLCBjb2xvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gdW5oaWdobGlnaHQgdGhlIGxpbmVzIC0gc2V0IHRoZSBiYWNrZ3JvdW5kIGJhY2sgdG8gdHJhbnNwYXJlbnRcbiAgICB1bmhpZ2hsaWdodExpbmVzKGRpdmlkLCBsbnVtKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpbmVzKGRpdmlkLCBsbnVtLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIH1cbiAgICAvLyBoaWdobGlnaHQgdGhlIGxpbmVzIC0gc2V0IHRoZSBiYWNrZ3JvdW5kIHRvIGEgeWVsbG93IGNvbG9yXG4gICAgaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGxudW0pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGluZXMoZGl2aWQsIGxudW0sIFwiI2ZmZmY5OVwiKTtcbiAgICB9XG4gICAgLy8gc2V0IHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBwYXNzZWQgY29sb3JcbiAgICBzZXRCYWNrZ3JvdW5kRm9yTGluZXMoZGl2aWQsIGxudW0sIGNvbG9yKSB7XG4gICAgICAgIHZhciBoeXBoZW4gPSBsbnVtLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgdmFyIHN0cjtcbiAgICAgICAgLy8gaWYgYSByYW5nZSBvZiBsaW5lc1xuICAgICAgICBpZiAoaHlwaGVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHBhcnNlSW50KGh5cGhlblswXSk7XG4gICAgICAgICAgICB2YXIgZW5kID0gcGFyc2VJbnQoaHlwaGVuWzFdKSArIDE7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gc3RhcnQ7IGsgPCBlbmQ7IGsrKykge1xuICAgICAgICAgICAgICAgIC8vYWxlcnQoayk7XG4gICAgICAgICAgICAgICAgc3RyID0gXCIjXCIgKyBkaXZpZCArIFwiX2xcIiArIGs7XG4gICAgICAgICAgICAgICAgaWYgKCQoc3RyKS50ZXh0KCkgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAkKHN0cikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBjb2xvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vJChzdHIpLmVmZmVjdChcImhpZ2hsaWdodFwiLHt9LChkdXIqMTAwMCkrNDUwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL2FsZXJ0KGxudW0pO1xuICAgICAgICAgICAgc3RyID0gXCIjXCIgKyBkaXZpZCArIFwiX2xcIiArIGxudW07XG4gICAgICAgICAgICAkKHN0cikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBjb2xvcik7XG4gICAgICAgICAgICAvLyQoc3RyKS5lZmZlY3QoXCJoaWdobGlnaHRcIix7fSwoZHVyKjEwMDApKzQ1MDApO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIHRlc3RTdHJpbmcgPSBgU3RhcnRpbmcgVGVzdHNcbkV4cGVjdGVkOiBBbnN3ZXIgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBBbnN3ZXIgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgbWV0aG9kIHByaW50QW5zd2VyKCkgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiA2IGxpbmUocykgb2YgdGV4dCAgICAgICAgQWN0dWFsOiAwIGxpbmUocykgb2YgdGV4dCAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgbWFpbiBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IGZhbHNlXG5IZWxsbyBXb3JsZFxuRXhwZWN0ZWQ6IFN0cmluZyBTdHJpbmcgICAgICAgICAgICBBY3R1YWw6IFN0cmluZyBTdHJpbmcgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBJbnN0YW5jZSBWYXJpYWJsZSBUeXBlKHMpICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRXhwZWN0ZWQ6IFF1ZXN0aW9uICAgICAgICAgICAgICAgICBBY3R1YWw6IFF1ZXN0aW9uICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBtZXRob2QgcHJpbnRRdWVzdGlvbigpICAgICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRGVidWdnaW5nIG91dHB1dFxuTW9yZSBkZWJ1ZyBvdXRwdXRcbkV4cGVjdGVkOiAyIFByaXZhdGUgICAgICAgICAgICAgICAgQWN0dWFsOiAyIFByaXZhdGUgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgUHJpdmF0ZSBJbnN0YW5jZSBWYXJpYWJsZShzKSAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiBwYXNzICAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBwYXNzICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiBmYWlsICAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBmYWlsICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkVuZGluZyBUZXN0c1xuWW91IGdvdCA2IG91dCBvZiA3IGNvcnJlY3QuIDg1LjcxJWA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpVbml0VGVzdFBhcnNlciB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0LCBwYXJlbnRJZCkge1xuICAgICAgICBsZXQgcGF0dCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICBcIkV4cGVjdGVkOlxcXFxzKyguKj8pQWN0dWFsOlxcXFxzKyguKj8pTWVzc2FnZTpcXFxccysoLio/KVBhc3NlZDpcXFxccysodHJ1ZXxmYWxzZSlcIixcbiAgICAgICAgICAgIFwiZ1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudGV4dFJlc3VsdHMgPSBcIlwiO1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IG91dHB1dC5tYXRjaEFsbChwYXR0KTtcbiAgICAgICAgbGV0IHBhcmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHBhcmVudC5jbGFzc0xpc3QuYWRkKFwidW5pdHRlc3QtcmVzdWx0c1wiKTtcbiAgICAgICAgbGV0IHRibCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiKTtcbiAgICAgICAgdGJsLmNsYXNzTGlzdC5hZGQoXCJhYy1mZWVkYmFja1wiKTtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHRibCk7XG4gICAgICAgIHBhcmVudC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBgJHtwYXJlbnRJZH1fdW5pdF9yZXN1bHRzYCk7XG4gICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0clwiKTtcbiAgICAgICAgdHIuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICc8dGggY2xhc3M9XCJhYy1mZWVkYmFja1wiPlJlc3VsdDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5FeHBlY3RlZDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5BY3R1YWw8L3RoPjx0aCBjbGFzcz1cImFjLWZlZWRiYWNrXCI+Tm90ZXM8L3RoPic7XG4gICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XG4gICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyXCIpO1xuICAgICAgICAgICAgbGV0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRkXCIpO1xuICAgICAgICAgICAgdGQuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xuICAgICAgICAgICAgaWYgKG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdID09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgdGQuaW5uZXJIVE1MID0gXCJQYXNzXCI7XG4gICAgICAgICAgICAgICAgdGQuc3R5bGUgPVxuICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3I6IHJnYigxMzEsIDIxMSwgMTMwKTsgdGV4dC1hbGlnbjogY2VudGVyO1wiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZC5pbm5lckhUTUwgPSBcIkZhaWxcIjtcbiAgICAgICAgICAgICAgICB0ZC5zdHlsZSA9XG4gICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyMiwgMTQyLCAxNTApOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZCk7XG4gICAgICAgICAgICB0YmwuYXBwZW5kQ2hpbGQodHIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGRcIik7XG4gICAgICAgICAgICAgICAgdGQuaW5uZXJIVE1MID0gbWF0Y2hbaV07XG4gICAgICAgICAgICAgICAgdGQuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xuICAgICAgICAgICAgICAgIHRyLmFwcGVuZENoaWxkKHRkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XG4gICAgICAgICAgICB0aGlzLnRhYmxlID0gcGFyZW50O1xuICAgICAgICAgICAgdGhpcy50ZXh0UmVzdWx0cyArPSBtYXRjaFswXSArIFwiXFxuXCI7XG4gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShtYXRjaFswXSwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hdGNoID0gb3V0cHV0Lm1hdGNoKFxuICAgICAgICAgICAgL1lvdSBnb3RcXHMrKFxcZCspIG91dCBvZiAoXFxkKykgY29ycmVjdC5cXHMrKFxcZCtcXC5cXGQrKSUvXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UobWF0Y2hbMF0sIFwiXCIpO1xuICAgICAgICAgICAgbGV0IHBjdFN0cmluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgcGN0U3RyaW5nLmlubmVySFRNTCA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgdGhpcy5wY3RTdHJpbmcgPSBwY3RTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLnBjdCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgdGhpcy5wYXNzZWQgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkID0gbWF0Y2hbMl0gLSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShcIlN0YXJ0aW5nIFRlc3RzXCIsIFwiXCIpO1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShcIkVuZGluZyBUZXN0c1wiLCBcIlwiKTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIik7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKC8oPGJyPikrL2csIFwiPGJyPlwiKTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2VBbGwoXCImbHQ7aW1nXCIsIFwiPGltZ1wiKTtcbiAgICAgICAgdGhpcy5zdGRvdXQgPSBvdXRwdXQ7XG4gICAgfVxufVxuXG4vLyBsZXQgeCA9IG5ldyBSZXN1bHRzVG9UYWJsZSh0ZXN0U3RyaW5nKTtcbi8vIGNvbnNvbGUubG9nKHguc3Rkb3V0KTtcbi8vIGNvbnNvbGUubG9nKHgudGFibGUpO1xuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcbmltcG9ydCBNRDUgZnJvbSBcIi4vbWQ1LmpzXCI7XG5pbXBvcnQgSlVuaXRUZXN0UGFyc2VyIGZyb20gXCIuL2V4dHJhY3RVbml0UmVzdWx0cy5qc1wiO1xuaW1wb3J0IFwiLi4vLi4vY29kZWxlbnMvanMvcHl0dXRvci1lbWJlZC5idW5kbGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHZhciBvcmlnID0gJChvcHRzLm9yaWcpLmZpbmQoXCJ0ZXh0YXJlYVwiKVswXTtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuc3RkaW4gPSAkKG9yaWcpLmRhdGEoXCJzdGRpblwiKTtcbiAgICAgICAgdGhpcy5kYXRhZmlsZSA9ICQob3JpZykuZGF0YShcImRhdGFmaWxlXCIpO1xuICAgICAgICB0aGlzLnNvdXJjZWZpbGUgPSAkKG9yaWcpLmRhdGEoXCJzb3VyY2VmaWxlXCIpO1xuICAgICAgICB0aGlzLmNvbXBpbGVhcmdzID0gdW5lc2NhcGVIdG1sKCQob3JpZykuZGF0YShcImNvbXBpbGVhcmdzXCIpKTtcbiAgICAgICAgdGhpcy5saW5rYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJsaW5rYXJnc1wiKSk7XG4gICAgICAgIHRoaXMucnVuYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJydW5hcmdzXCIpKTtcbiAgICAgICAgdGhpcy5pbnRlcnByZXRlcmFyZ3MgPSB1bmVzY2FwZUh0bWwoJChvcmlnKS5kYXRhKFwiaW50ZXJwcmV0ZXJhcmdzXCIpKTtcbiAgICAgICAgdGhpcy5BUElfS0VZID0gXCI2NzAzM3BWN2VVVXZxbzA3T0pESVY4VVowNDlhTEVLMVwiO1xuICAgICAgICB0aGlzLlVTRV9BUElfS0VZID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5KT0JFX1NFUlZFUiA9IGVCb29rQ29uZmlnLmpvYmVob3N0IHx8IGVCb29rQ29uZmlnLmhvc3Q7XG4gICAgICAgIHRoaXMucmVzb3VyY2UgPSBlQm9va0NvbmZpZy5wcm94eXVyaV9ydW5zIHx8IFwiL3J1bmVzdG9uZS9wcm94eS9qb2JlUnVuXCI7XG4gICAgICAgIHRoaXMuam9iZVB1dEZpbGVzID1cbiAgICAgICAgICAgIGVCb29rQ29uZmlnLnByb3h5dXJpX2ZpbGVzIHx8IFwiL3J1bmVzdG9uZS9wcm94eS9qb2JlUHVzaEZpbGUvXCI7XG4gICAgICAgIHRoaXMuam9iZUNoZWNrRmlsZXMgPVxuICAgICAgICAgICAgZUJvb2tDb25maWcucHJveHl1cmlfZmlsZXMgfHwgXCIvcnVuZXN0b25lL3Byb3h5L2pvYmVDaGVja0ZpbGUvXCI7XG4gICAgICAgIC8vIFRPRE86ICBzaG91bGQgYWRkIGEgcHJvcGVyIHB1dC9jaGVjayBpbiBwYXZlbWVudC50bXBsIGFzIHRoaXMgaXMgbWlzbGVhZGluZyBhbmQgd2lsbCBicmVhayBvbiBydW5lc3RvbmVcbiAgICAgICAgdGhpcy5kaXYyaWQgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMuc3RkaW4pIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5wdXRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVFcnJvck91dHB1dCgpO1xuICAgIH1cbiAgICBvdXRwdXRmdW4oYSkge31cbiAgICBjcmVhdGVJbnB1dEVsZW1lbnQoKSB7XG4gICAgICAgIHZhciBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgbGFiZWwuZm9yID0gdGhpcy5kaXZpZCArIFwiX3N0ZGluXCI7XG4gICAgICAgICQobGFiZWwpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5wdXRfcHJnXCIpKTtcbiAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBpbnB1dC5pZCA9IHRoaXMuZGl2aWQgKyBcIl9zdGRpblwiO1xuICAgICAgICBpbnB1dC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGlucHV0LnNpemUgPSBcIjM1XCI7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5zdGRpbjtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsYWJlbCk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuICAgICAgICB0aGlzLnN0ZGluX2VsID0gaW5wdXQ7XG4gICAgfVxuICAgIGNyZWF0ZUVycm9yT3V0cHV0KCkge31cblxuICAgIC8qICBNYWluIHJ1blByb2cgbWV0aG9kIGZvciBsaXZlY29kZVxuICAgICAqXG4gICAgICovXG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5TZXR1cCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VG9Kb2JlKCk7XG4gICAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgJC5pMThuKGBTZXJ2ZXIgRXJyb3I6ICR7cmVzLnN0YXR1c1RleHR9YClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJmYWlsXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcnVuUmVzdWx0cyA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NKb2JlUmVzcG9uc2UocnVuUmVzdWx0cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfY29tbV9lcnJcIikgKyBlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gYGZhaWw6ICR7ZX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcInN1Y2Nlc3NcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90ZTpcbiAgICAgKiBJbiBvcmRlciB0byBjaGVjayBmb3Igc3VwcGxlbWVudGFsIGZpbGVzIGluIGphdmEgYW5kIGRlYWwgd2l0aCBhc3luY2hyb25pY2l0eVxuICAgICAqIEkgc3BsaXQgdGhlIG9yaWdpbmFsIHJ1blByb2cgaW50byB0d28gZnVuY3Rpb25zOiBydW5Qcm9nIGFuZCBydW5Qcm9nX2NhbGxiYWNrXG4gICAgICovXG4gICAgYXN5bmMgcnVuU2V0dXAoKSB7XG4gICAgICAgIHZhciBzdGRpbjtcbiAgICAgICAgdmFyIHNvdXJjZTtcbiAgICAgICAgdmFyIHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHZhciBzZmlsZW1hcCA9IHtcbiAgICAgICAgICAgIGphdmE6IFwiXCIsXG4gICAgICAgICAgICBjcHA6IFwidGVzdC5jcHBcIixcbiAgICAgICAgICAgIGM6IFwidGVzdC5jXCIsXG4gICAgICAgICAgICBweXRob24zOiBcInRlc3QucHlcIixcbiAgICAgICAgICAgIHB5dGhvbjI6IFwidGVzdC5weVwiLFxuICAgICAgICAgICAgb2N0YXZlOiBcIm9jdGF0ZXN0Lm1cIixcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHNvdXJjZWZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIHRlc3Rkcml2ZXJuYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIGZpbGVfY2hlY2twO1xuXG4gICAgICAgIC8vIGV4dHJhY3QgdGhlIGNsYXNzIG5hbWVzIHNvIGZpbGVzIGNhbiBiZSBuYW1lZCBwcm9wZXJseVxuICAgICAgICBpZiAodGhpcy5zdWZmaXggJiYgdGhpcy5sYW5ndWFnZSA9PSBcImphdmFcIikge1xuICAgICAgICAgICAgbGV0IGNsYXNzTWF0Y2ggPSBuZXcgUmVnRXhwKC9wdWJsaWMgY2xhc3NcXHMrKFxcdyspW1xccyt7XS8pO1xuICAgICAgICAgICAgc291cmNlID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpO1xuICAgICAgICAgICAgbGV0IG0gPSBzb3VyY2UubWF0Y2goY2xhc3NNYXRjaCk7XG4gICAgICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZWZpbGVuYW1lID0gbVsxXSArIFwiLmphdmFcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSB1bml0IHRlc3QgY29kZVxuICAgICAgICAgICAgbSA9IHRoaXMuc3VmZml4Lm1hdGNoKGNsYXNzTWF0Y2gpO1xuICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICB0ZXN0ZHJpdmVybmFtZSA9IG1bMV0gKyBcIi5qYXZhXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YSBpcyBjb252ZXJ0aWJsZSB0byBCYXNlNjQuIElmIG5vdCB0aGVuIGVycm9yIG91dCBub3dcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGJ0b2Eoc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYWxlcnQoXG4gICAgICAgICAgICAgICAgXCJFcnJvcjogQmFkIENoYXJhY3RlcnMgaW4gdGhlIGFjdGl2ZWNvZGUgd2luZG93LiBMaWtlbHkgYSBxdW90ZSBjaGFyYWN0ZXIgdGhhdCBoYXMgYmVlbiBjb3B5L3Bhc3RlZC4g8J+ZgVwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcblxuICAgICAgICAvLyBhc3NlbWJsZSBwYXJhbWV0ZXJzIGZvciBKT0JFXG4gICAgICAgIHZhciBwYXJhbWxpc3QgPSBbXG4gICAgICAgICAgICBcImNvbXBpbGVhcmdzXCIsXG4gICAgICAgICAgICBcImxpbmthcmdzXCIsXG4gICAgICAgICAgICBcInJ1bmFyZ3NcIixcbiAgICAgICAgICAgIFwiaW50ZXJwcmV0ZXJhcmdzXCIsXG4gICAgICAgICAgICBcIm1lbW9yeWxpbWl0XCIsXG4gICAgICAgIF07XG4gICAgICAgIHZhciBwYXJhbW9iaiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBwYXJhbSBvZiBwYXJhbWxpc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW3BhcmFtXSkge1xuICAgICAgICAgICAgICAgIHBhcmFtb2JqW3BhcmFtXSA9IGV2YWwodGhpc1twYXJhbV0pOyAvLyBuZWVkcyBhIGxpc3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sYW5ndWFnZSA9PT0gXCJvY3RhdmVcIikge1xuICAgICAgICAgICAgcGFyYW1vYmoubWVtb3J5bGltaXQgPSAyMDAwMDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGRpbikge1xuICAgICAgICAgICAgc3RkaW4gPSAkKHRoaXMuc3RkaW5fZWwpLnZhbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VmaWxlKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZWZpbGUgPSBzZmlsZW1hcFt0aGlzLmxhbmd1YWdlXTtcbiAgICAgICAgfVxuXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmdcIikpO1xuICAgICAgICB2YXIgZmlsZXMgPSBbXTtcbiAgICAgICAgdmFyIGNvbnRlbnQsIGJhc2U2NDtcbiAgICAgICAgaWYgKHRoaXMuZGF0YWZpbGUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgaWRzID0gdGhpcy5kYXRhZmlsZS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBmaWxlTmFtZSA9IGlkc1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLmxhc3RJbmRleE9mKFwiLlwiKSArIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlID09PSBudWxsIHx8IGZpbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5vIGZpbGUgd2l0aCBnaXZlbiBpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGZpbGUgaXMgaW4gZGJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IHRoaXMuZmlsZVJlYWRlcihmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGZpbGUudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1heSBiZSB1bmRlZmluZWQgYXQgdGhpcyBwb2ludCBpZiBmaWxlIGlzIGFuIGltYWdlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09PSBcImphclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzID0gZmlsZXMuY29uY2F0KHRoaXMucGFyc2VKYXZhQ2xhc3Nlcyhjb250ZW50KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChbXCJqcGdcIiwgXCJwbmdcIiwgXCJnaWZcIl0uaW5kZXhPZihmaWxlRXh0ZW5zaW9uKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS50b0RhdGFVUkwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBmaWxlLnRvRGF0YVVSTChcImltYWdlL1wiICsgZmlsZUV4dGVuc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gYmFzZTY0LnN1YnN0cmluZyhiYXNlNjQuaW5kZXhPZihcIixcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gZmlsZS5zcmMuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnNyYy5pbmRleE9mKFwiLFwiKSArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKHsgbmFtZTogZmlsZU5hbWUsIGNvbnRlbnQ6IGJhc2U2NCB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBubyBjbGFzc05hbWUgb3IgdW4gcmVjb2duaXplZCBjbGFzc05hbWUgaXQgaXMgdHJlYXRlZCBhcyBhbiBpbmRpdmlkdWFsIGZpbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBhbnkgdHlwZSBvZiBmaWxlLCAudHh0LCAuamF2YSwgLmNzdiwgZXRjXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBmaWxlTmFtZSwgY29udGVudDogY29udGVudCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgYXJlIHJ1bm5pbmcgdW5pdCB0ZXN0cyB3ZSBuZWVkIHRvIHN1YnN0aXR1dGUgdGhlIHRlc3QgZHJpdmVyIGZvciB0aGUgc3R1ZGVudFxuICAgICAgICAvLyBjb2RlIGFuZCBzZW5kIHRoZSBzdHVkZW50IGNvZGUgYXMgYSBmaWxlLiAgV2UnbGwgZG8gdGhhdCBoZXJlLlxuICAgICAgICB0aGlzLmp1bml0RHJpdmVyQ29kZSA9IGBcbiAgICAgICAgaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuSlVuaXRDb3JlO1xuICAgICAgICBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SZXN1bHQ7XG4gICAgICAgIGltcG9ydCBvcmcuanVuaXQucnVubmVyLm5vdGlmaWNhdGlvbi5GYWlsdXJlO1xuXG4gICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0UnVubmVyIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBDb2RlVGVzdEhlbHBlci5yZXNldEZpbmFsUmVzdWx0cygpO1xuICAgICAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBKVW5pdENvcmUucnVuQ2xhc3Nlcygke3Rlc3Rkcml2ZXJuYW1lLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIFwiLmphdmFcIixcbiAgICAgICAgICAgICAgICAgICAgXCIuY2xhc3NcIlxuICAgICAgICAgICAgICAgICl9KTtcbiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQ29kZVRlc3RIZWxwZXIuZ2V0RmluYWxSZXN1bHRzKCkpO1xuXG4gICAgICAgICAgICAgICAgaW50IHRvdGFsID0gcmVzdWx0LmdldFJ1bkNvdW50KCk7XG4gICAgICAgICAgICAgICAgaW50IGZhaWxzID0gcmVzdWx0LmdldEZhaWx1cmVDb3VudCgpO1xuICAgICAgICAgICAgICAgIGludCBjb3JyICA9IHRvdGFsIC0gZmFpbHM7XG4gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiWW91IGdvdCBcIiArIGNvcnIgKyBcIiBvdXQgb2YgXCIgKyB0b3RhbCArIFwiIGNvcnJlY3QuIFwiICsgU3RyaW5nLmZvcm1hdChcIiUuMmZcIiwgKDEwMC4wICogY29yciAvIHRvdGFsKSkgKyBcIiVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgaWYgKHRoaXMuc3VmZml4ICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJqYXZhXCIpIHtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBzb3VyY2VmaWxlbmFtZSwgY29udGVudDogc291cmNlIH0pO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IG5hbWU6IHRlc3Rkcml2ZXJuYW1lLCBjb250ZW50OiB0aGlzLnN1ZmZpeCB9KTtcbiAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMuanVuaXREcml2ZXJDb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmFtb2JqLmNvbXBpbGVhcmdzKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1vYmouY29tcGlsZWFyZ3MucHVzaChzb3VyY2VmaWxlbmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmFtb2JqLmNvbXBpbGVhcmdzID0gW3NvdXJjZWZpbGVuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcnVuc3BlYyA9IHtcbiAgICAgICAgICAgIGxhbmd1YWdlX2lkOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgc291cmNlY29kZTogc291cmNlLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1vYmosXG4gICAgICAgICAgICBzb3VyY2VmaWxlbmFtZTogdGhpcy5zb3VyY2VmaWxlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzdGRpbikge1xuICAgICAgICAgICAgcnVuc3BlYy5pbnB1dCA9IHN0ZGluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuanNvbl9ydW5zcGVjID0gSlNPTi5zdHJpbmdpZnkoeyBydW5fc3BlYzogcnVuc3BlYyB9KTtcbiAgICAgICAgICAgIGZpbGVfY2hlY2twID0gUHJvbWlzZS5yZXNvbHZlKFwicmVhZHlcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW5zcGVjW1wiZmlsZV9saXN0XCJdID0gW107XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSBmaWxlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBmaWxlQ29udGVudCA9IGZpbGVzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuZGl2MmlkW2ZpbGVOYW1lXSA9XG4gICAgICAgICAgICAgICAgICAgIFwicnVuZXN0b25lXCIgKyBNRDUoZmlsZU5hbWUgKyBmaWxlQ29udGVudCk7XG4gICAgICAgICAgICAgICAgcnVuc3BlY1tcImZpbGVfbGlzdFwiXS5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuZGl2MmlkW2ZpbGVOYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY2hlY2tGaWxlKGZpbGVzW2ldLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmpzb25fcnVuc3BlYyA9IEpTT04uc3RyaW5naWZ5KHsgcnVuX3NwZWM6IHJ1bnNwZWMgfSk7XG4gICAgICAgICAgICB0aGlzLmRpdjJpZCA9IGluc3RhbmNlLmRpdjJpZDtcbiAgICAgICAgICAgIGZpbGVfY2hlY2twID0gUHJvbWlzZS5hbGwocHJvbWlzZXMpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yOiBcIiArIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZV9jaGVja3A7XG4gICAgfVxuXG4gICAgLyogU3VibWl0IHRoZSBhc3NlbWJsZWQgam9iIHRvIHRoZSBKT0JFIHNlcnZlciBhbmQgYXdhaXQgdGhlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKi9cbiAgICBhc3luYyBzdWJtaXRUb0pvYmUoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5qc29uX3J1bnNwZWM7XG4gICAgICAgIGxldCBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHRoaXMucmVzb3VyY2U7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICAkKHRoaXMuZXJyRGl2KS5yZW1vdmUoKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICBcIkNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICBcIlgtQVBJLUtFWVwiOiB0aGlzLkFQSV9LRVksXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGhvc3QsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmZXRjaChyZXF1ZXN0KTtcblxuICAgICAgICAvLy8kKFwiI1wiICsgZGl2aWQgKyBcIl9lcnJpbmZvXCIpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHByb2Nlc3NKb2JlUmVzcG9uc2UocmVzdWx0KSB7XG4gICAgICAgIHZhciBsb2dyZXN1bHQ7XG4gICAgICAgIHZhciBvZGl2ID0gdGhpcy5vdXRwdXQ7XG4gICAgICAgIHRoaXMucGFyc2VkT3V0cHV0ID0ge307XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgaWYgKHJlc3VsdC5vdXRjb21lID09PSAxNSkge1xuICAgICAgICAgICAgbG9ncmVzdWx0ID0gXCJzdWNjZXNzXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dyZXN1bHQgPSByZXN1bHQub3V0Y29tZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVycmluZm8gPSBsb2dyZXN1bHQ7XG4gICAgICAgIHN3aXRjaCAocmVzdWx0Lm91dGNvbWUpIHtcbiAgICAgICAgICAgIGNhc2UgMTU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZE91dHB1dCA9IG5ldyBKVW5pdFRlc3RQYXJzZXIoXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGRvdXQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGl2aWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbCh0aGlzLnBhcnNlZE91dHB1dC5zdGRvdXQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJzZWRPdXRwdXQucGN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkT3V0cHV0LnBjdCA9IHRoaXMucGFyc2VkT3V0cHV0LnBhc3NlZCA9IHRoaXMucGFyc2VkT3V0cHV0LmZhaWxlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bml0X3Jlc3VsdHMgPSBgcGVyY2VudDoke3RoaXMucGFyc2VkT3V0cHV0LnBjdH06cGFzc2VkOiR7dGhpcy5wYXJzZWRPdXRwdXQucGFzc2VkfTpmYWlsZWQ6JHt0aGlzLnBhcnNlZE91dHB1dC5mYWlsZWR9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIDExOiAvLyBjb21waWxlciBlcnJvclxuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV93ZXJlX2NvbXBpbGluZ19lcnJcIikpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShyZXN1bHQuY21waW5mbyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEyOiAvLyBydW4gdGltZSBlcnJvclxuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbChyZXN1bHQuc3Rkb3V0LnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIikpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShyZXN1bHQuc3RkZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEzOiAvLyB0aW1lIGxpbWl0XG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHJlc3VsdC5zdGRvdXQucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2V4Y1wiKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICQob2RpdikuaHRtbChyZXN1bHQuc3RkZXJyLnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3NlcnZlcl9lcnJcIilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdG9kbzogaGFuZGxlIHNlcnZlciBidXN5IGFuZCB0aW1lb3V0IGVycm9ycyB0b29cbiAgICB9XG5cbiAgICByZW5kZXJGZWVkYmFjaygpIHtcbiAgICAgICAgbGV0IHJkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHt0aGlzLmRpdmlkfV91bml0X3Jlc3VsdHNgKTtcbiAgICAgICAgaWYgKHJkaXYpIHtcbiAgICAgICAgICAgIHJkaXYucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFyc2VkT3V0cHV0ICYmIHRoaXMucGFyc2VkT3V0cHV0LnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLm91dERpdi5hcHBlbmRDaGlsZCh0aGlzLnBhcnNlZE91dHB1dC50YWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3RoaXMuZGl2aWR9X3VuaXRfcmVzdWx0c2ApO1xuICAgICAgICBpZiAocmRpdikge1xuICAgICAgICAgICAgcmRpdi5hcHBlbmRDaGlsZCh0aGlzLnBhcnNlZE91dHB1dC5wY3RTdHJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkSm9iZUVycm9yTWVzc2FnZShlcnIpIHtcbiAgICAgICAgdmFyIGVyckhlYWQgPSAkKFwiPGgzPlwiKS5odG1sKFwiRXJyb3JcIik7XG4gICAgICAgIHZhciBlQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lcnJEaXYgPSBlQ29udGFpbmVyO1xuICAgICAgICBlQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZXJyb3IgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7XG4gICAgICAgIGVDb250YWluZXIuaWQgPSB0aGlzLmRpdmlkICsgXCJfZXJyaW5mb1wiO1xuICAgICAgICBlQ29udGFpbmVyLmFwcGVuZENoaWxkKGVyckhlYWRbMF0pO1xuICAgICAgICB2YXIgZXJyVGV4dCA9IGVDb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKSk7XG4gICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gZXJyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIGZpbGUgaXMgb24gc2VydmVyXG4gICAgICogUGxhY2VzIGl0IG9uIHNlcnZlciBpZiBpdCBpcyBub3Qgb24gc2VydmVyXG4gICAgICogQHBhcmFtICB7b2JqZWN0e25hbWUsIGNvbnRlbnRzfX0gZmlsZSAgICBGaWxlIHRvIHBsYWNlIG9uIHNlcnZlclxuICAgICAqIEBwYXJhbSAge2Z1bmN0aW9ufSByZXNvbHZlIHByb21pc2UgcmVzb2x2ZSBmdW5jdGlvblxuICAgICAqIEBwYXJhbSAge2Z1bmN0aW9ufSByZWplY3QgIHByb21pc2UgcmVqZWN0IGZ1bmN0aW9uXG4gICAgICovXG4gICAgY2hlY2tGaWxlKGZpbGUsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZmlsZV9pZCA9IHRoaXMuZGl2MmlkW2ZpbGUubmFtZV07XG4gICAgICAgIHZhciByZXNvdXJjZSA9IHRoaXMuam9iZUNoZWNrRmlsZXMgKyBmaWxlX2lkO1xuICAgICAgICB2YXIgaG9zdCA9IHRoaXMuSk9CRV9TRVJWRVIgKyByZXNvdXJjZTtcbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkhFQURcIiwgaG9zdCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC10eXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIiwgXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQVBJLUtFWVwiLCB0aGlzLkFQSV9LRVkpO1xuICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXJyb3Igc2VuZGluZyBmaWxlXCIgKyB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoeGhyLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNhc2UgMjA4OlxuICAgICAgICAgICAgICAgIGNhc2UgNDA0OlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZpbGUgbm90IG9uIFNlcnZlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoRGF0YUZpbGUoZmlsZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDA6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQmFkIFJlcXVlc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGaWxlIGFscmVhZHkgb24gU2VydmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGxhY2VzIGEgZmlsZSBvbiBhIHNlcnZlclxuICAgICAqL1xuICAgIHB1c2hEYXRhRmlsZShmaWxlLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lO1xuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmluZGV4T2YoXCIuXCIpICsgMSk7XG4gICAgICAgIHZhciBmaWxlX2lkID0gdGhpcy5kaXYyaWRbZmlsZU5hbWVdO1xuICAgICAgICB2YXIgY29udGVudHMgPSBmaWxlLmNvbnRlbnQ7XG4gICAgICAgIC8vIEZpbGUgdHlwZXMgYmVpbmcgdXBsb2FkZWQgdGhhdCBjb21lIGluIGFscmVhZHkgaW4gYmFzZTY0IGZvcm1hdFxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IFtcImphclwiLCBcInppcFwiLCBcInBuZ1wiLCBcImpwZ1wiLCBcImpwZWdcIl07XG4gICAgICAgIHZhciBjb250ZW50c2I2NDtcbiAgICAgICAgaWYgKGV4dGVuc2lvbnMuaW5kZXhPZihleHRlbnNpb24pID09PSAtMSkge1xuICAgICAgICAgICAgY29udGVudHNiNjQgPSBidG9hKGNvbnRlbnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnRzYjY0ID0gY29udGVudHM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnN0cmluZ2lmeSh7IGZpbGVfY29udGVudHM6IGNvbnRlbnRzYjY0IH0pO1xuICAgICAgICB2YXIgcmVzb3VyY2UgPSB0aGlzLmpvYmVQdXRGaWxlcyArIGZpbGVfaWQ7XG4gICAgICAgIHZhciBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHJlc291cmNlO1xuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiUFVUXCIsIGhvc3QsIHRydWUpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQWNjZXB0XCIsIFwidGV4dC9wbGFpblwiKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLUFQSS1LRVlcIiwgdGhpcy5BUElfS0VZKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoeGhyLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZvcmJpZGRlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDAwOlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkJhZCBSZXF1ZXN0XCIpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDQ6XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJzdWNjZXNzZnVsbHkgc2VudCBmaWxlIFwiICsgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJGaWxlIFwiICsgZmlsZU5hbWUgK1wiLCBcIiArIGZpbGVfaWQgK1wiIHBsYWNlZCBvbiBzZXJ2ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVycm9yIHNlbmRpbmcgZmlsZVwiICsgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLnNlbmQoZGF0YSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvd0NvZGVsZW5zKCkge1xuICAgICAgICBsZXQgY2xNZXNzID0gXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgY2xNZXNzID0gXCJCdWlsZGluZyB5b3VyIHZpc3VhbGl6YXRpb25cIjtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuaW5uZXJIVE1MID0gY2xNZXNzO1xuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnNcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsID0gdGhpcy5jb2RlbGVucy5maXJzdENoaWxkO1xuICAgICAgICBpZiAoY2wpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMucmVtb3ZlQ2hpbGQoY2wpO1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5pbm5lckhUTUwgPSBjbE1lc3M7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGUgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7XG4gICAgICAgIGlmIChjb2RlLm1hdGNoKC9TeXN0ZW0uZXhpdC8pKSB7XG4gICAgICAgICAgICBhbGVydChcbiAgICAgICAgICAgICAgICBcIlNvcnJ5Li4uIFN5c3RlbS5leGl0IGJyZWFrcyB0aGUgdmlzdWFsaXplciB0ZW1wb3JhcmlseSByZW1vdmluZ1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZSgvU3lzdGVtLmV4aXRcXChcXGQrXFwpOy8sIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBteVZhcnMgPSB7fTtcbiAgICAgICAgbXlWYXJzLmNvZGUgPSBjb2RlO1xuICAgICAgICBteVZhcnMubGFuZyA9IHRoaXMubGFuZ3VhZ2U7XG4gICAgICAgIGlmICh0aGlzLnN0ZGluKSB7XG4gICAgICAgICAgICBteVZhcnMuc3RkaW4gPSAkKHRoaXMuc3RkaW5fZWwpLnZhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0YXJnZXREaXYgPSB0aGlzLmNvZGVsZW5zLmlkO1xuXG4gICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoXCIvcnVuZXN0b25lL3Byb3h5L3B5dHV0b3JfdHJhY2VcIiwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG15VmFycyksXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBsZXQgdmlzID0gYWRkVmlzdWFsaXplclRvUGFnZShkYXRhLCB0YXJnZXREaXYsIHtcbiAgICAgICAgICAgICAgICBzdGFydGluZ0luc3RydWN0aW9uOiAwLFxuICAgICAgICAgICAgICAgIGVkaXRDb2RlQmFzZVVSTDogbnVsbCxcbiAgICAgICAgICAgICAgICBoaWRlQ29kZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFuZzogbXlWYXJzLmxhbmcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxldCB0YXJnZXREaXZFcnJvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldERpdik7XG4gICAgICAgICAgICB0YXJnZXREaXZFcnJvci5pbm5lckhUTUwgPVxuICAgICAgICAgICAgICAgIFwiU29ycnksIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIHlvdXIgdmlzdWFsaXphdGlvbi5cIjtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2V0IFRyYWNlIEZhaWxlZCAtLSBcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJjb2RlbGVuc1wiLFxuICAgICAgICAgICAgYWN0OiBcInZpZXdcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VwZXJhdGVzIHRleHQgaW50byBtdWx0aXBsZSAuamF2YSBmaWxlc1xuICAgICAqIEBwYXJhbSAge1N0cmluZ30gdGV4dCBTdHJpbmcgd2l0aCBtdWxpcGxlIGphdmEgY2xhc3NlcyBuZWVkZWQgdG8gYmUgc2VwZXJhdGVkXG4gICAgICogQHJldHVybiB7YXJyYXkgb2Ygb2JqZWN0c30gIC5uYW1lIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBqYXZhIGZpbGUgd2l0aCAuamF2YSBleHRlbnNpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAuY29udGVudCBnaXZlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVcbiAgICAgKi9cbiAgICBwYXJzZUphdmFDbGFzc2VzKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xuICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHN0YWNrID0gMDtcbiAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICB2YXIgY2xhc3NlcyA9IFtdO1xuICAgICAgICB2YXIgaW1wb3J0SW5kZXggPSAwO1xuICAgICAgICB2YXIgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hhciA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09IFwiXFxuXCIgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5jaGFyQXQoaSkgPT0gXCIqXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGV4dC5jaGFyQXQoaSkgIT09IFwiKlwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5jaGFyQXQoaSArIDEpICE9PSBcIi9cIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKyAxIDwgdGV4dC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09ICdcIicgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRleHQuY2hhckF0KGkpICE9PSBcIidcIiAmJiBpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcENvdW50ID0gMTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBDb3VudCA+IDAgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQuY2hhckF0KGkpID09PSBcIilcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50LS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQgJiYgdGV4dC5jaGFyQXQoaSkgPT09IFwie1wiKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT09IFwie1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YWNrKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCJ9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2stLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm91bmQgJiYgc3RhY2sgPT09IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSBpICsgMTtcbiAgICAgICAgICAgICAgICB2YXIgd29yZHMgPSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zLCBzdGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdyA9IDA7IHcgPCB3b3Jkcy5sZW5ndGg7IHcrKykge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB3b3Jkc1t3XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRzW3ddID09PSBcImV4dGVuZHNcIiB8fCB3b3Jkc1t3XSA9PT0gXCJpbXBsZW1lbnRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHdvcmRzW3cgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHcgPSB3b3Jkcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRyaW0oKSArIFwiLmphdmFcIjtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQuc3Vic3RyaW5nKGltcG9ydEluZGV4LCBlbmRJbmRleCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpbXBvcnRJbmRleCA9IGVuZEluZGV4O1xuICAgICAgICAgICAgICAgIGVuZE9mTGFzdENvbW1lbnRCZWZvcmVDbGFzc0JlZ2lucyA9IGVuZEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGFzc2VzO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVuZXNjYXBlSHRtbChzYWZlKSB7XG4gICAgaWYgKHNhZmUpIHtcbiAgICAgICAgcmV0dXJuIHNhZmVcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mYW1wOy9nLCBcIiZcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mbHQ7L2csIFwiPFwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyZndDsvZywgXCI+XCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvJnF1b3Q7L2csICdcIicpXG4gICAgICAgICAgICAucmVwbGFjZSgvJiN4Mjc7L2csIFwiJ1wiKTtcbiAgICB9XG59XG4iLCIvKipcbiAqXG4gKiAgTUQ1IChNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0pXG4gKiAgaHR0cDovL3d3dy53ZWJ0b29sa2l0LmluZm8vXG4gKlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNRDUoc3RyaW5nKSB7XG4gICAgZnVuY3Rpb24gUm90YXRlTGVmdChsVmFsdWUsIGlTaGlmdEJpdHMpIHtcbiAgICAgICAgcmV0dXJuIChsVmFsdWUgPDwgaVNoaWZ0Qml0cykgfCAobFZhbHVlID4+PiAoMzIgLSBpU2hpZnRCaXRzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQWRkVW5zaWduZWQobFgsIGxZKSB7XG4gICAgICAgIHZhciBsWDQsIGxZNCwgbFg4LCBsWTgsIGxSZXN1bHQ7XG4gICAgICAgIGxYOCA9IGxYICYgMHg4MDAwMDAwMDtcbiAgICAgICAgbFk4ID0gbFkgJiAweDgwMDAwMDAwO1xuICAgICAgICBsWDQgPSBsWCAmIDB4NDAwMDAwMDA7XG4gICAgICAgIGxZNCA9IGxZICYgMHg0MDAwMDAwMDtcbiAgICAgICAgbFJlc3VsdCA9IChsWCAmIDB4M2ZmZmZmZmYpICsgKGxZICYgMHgzZmZmZmZmZik7XG4gICAgICAgIGlmIChsWDQgJiBsWTQpIHtcbiAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gMHg4MDAwMDAwMCBeIGxYOCBeIGxZODtcbiAgICAgICAgfVxuICAgICAgICBpZiAobFg0IHwgbFk0KSB7XG4gICAgICAgICAgICBpZiAobFJlc3VsdCAmIDB4NDAwMDAwMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbFJlc3VsdCBeIDB4YzAwMDAwMDAgXiBsWDggXiBsWTg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gMHg0MDAwMDAwMCBeIGxYOCBeIGxZODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gbFg4IF4gbFk4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRih4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiAoeCAmIHkpIHwgKH54ICYgeik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRyh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiB+eik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSCh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSSh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiB5IF4gKHggfCB+eik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRkYoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEYoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gR0coYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEcoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSEgoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEgoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSUkoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEkoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ29udmVydFRvV29yZEFycmF5KHN0cmluZykge1xuICAgICAgICB2YXIgbFdvcmRDb3VudDtcbiAgICAgICAgdmFyIGxNZXNzYWdlTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgdmFyIGxOdW1iZXJPZldvcmRzX3RlbXAxID0gbE1lc3NhZ2VMZW5ndGggKyA4O1xuICAgICAgICB2YXIgbE51bWJlck9mV29yZHNfdGVtcDIgPVxuICAgICAgICAgICAgKGxOdW1iZXJPZldvcmRzX3RlbXAxIC0gKGxOdW1iZXJPZldvcmRzX3RlbXAxICUgNjQpKSAvIDY0O1xuICAgICAgICB2YXIgbE51bWJlck9mV29yZHMgPSAobE51bWJlck9mV29yZHNfdGVtcDIgKyAxKSAqIDE2O1xuICAgICAgICB2YXIgbFdvcmRBcnJheSA9IEFycmF5KGxOdW1iZXJPZldvcmRzIC0gMSk7XG4gICAgICAgIHZhciBsQnl0ZVBvc2l0aW9uID0gMDtcbiAgICAgICAgdmFyIGxCeXRlQ291bnQgPSAwO1xuICAgICAgICB3aGlsZSAobEJ5dGVDb3VudCA8IGxNZXNzYWdlTGVuZ3RoKSB7XG4gICAgICAgICAgICBsV29yZENvdW50ID0gKGxCeXRlQ291bnQgLSAobEJ5dGVDb3VudCAlIDQpKSAvIDQ7XG4gICAgICAgICAgICBsQnl0ZVBvc2l0aW9uID0gKGxCeXRlQ291bnQgJSA0KSAqIDg7XG4gICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdID1cbiAgICAgICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdIHxcbiAgICAgICAgICAgICAgICAoc3RyaW5nLmNoYXJDb2RlQXQobEJ5dGVDb3VudCkgPDwgbEJ5dGVQb3NpdGlvbik7XG4gICAgICAgICAgICBsQnl0ZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgbFdvcmRDb3VudCA9IChsQnl0ZUNvdW50IC0gKGxCeXRlQ291bnQgJSA0KSkgLyA0O1xuICAgICAgICBsQnl0ZVBvc2l0aW9uID0gKGxCeXRlQ291bnQgJSA0KSAqIDg7XG4gICAgICAgIGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gPVxuICAgICAgICAgICAgbFdvcmRBcnJheVtsV29yZENvdW50XSB8ICgweDgwIDw8IGxCeXRlUG9zaXRpb24pO1xuICAgICAgICBsV29yZEFycmF5W2xOdW1iZXJPZldvcmRzIC0gMl0gPSBsTWVzc2FnZUxlbmd0aCA8PCAzO1xuICAgICAgICBsV29yZEFycmF5W2xOdW1iZXJPZldvcmRzIC0gMV0gPSBsTWVzc2FnZUxlbmd0aCA+Pj4gMjk7XG4gICAgICAgIHJldHVybiBsV29yZEFycmF5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFdvcmRUb0hleChsVmFsdWUpIHtcbiAgICAgICAgdmFyIFdvcmRUb0hleFZhbHVlID0gXCJcIixcbiAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAgPSBcIlwiLFxuICAgICAgICAgICAgbEJ5dGUsXG4gICAgICAgICAgICBsQ291bnQ7XG4gICAgICAgIGZvciAobENvdW50ID0gMDsgbENvdW50IDw9IDM7IGxDb3VudCsrKSB7XG4gICAgICAgICAgICBsQnl0ZSA9IChsVmFsdWUgPj4+IChsQ291bnQgKiA4KSkgJiAyNTU7XG4gICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZV90ZW1wID0gXCIwXCIgKyBsQnl0ZS50b1N0cmluZygxNik7XG4gICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZSA9XG4gICAgICAgICAgICAgICAgV29yZFRvSGV4VmFsdWUgK1xuICAgICAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAuc3Vic3RyKFdvcmRUb0hleFZhbHVlX3RlbXAubGVuZ3RoIC0gMiwgMik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdvcmRUb0hleFZhbHVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFV0ZjhFbmNvZGUoc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXHJcXG4vZywgXCJcXG5cIik7XG4gICAgICAgIHZhciB1dGZ0ZXh0ID0gXCJcIjtcblxuICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHN0cmluZy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChuKTtcblxuICAgICAgICAgICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPiAxMjcgJiYgYyA8IDIwNDgpIHtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgPj4gNikgfCAxOTIpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiAxMikgfCAyMjQpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgPj4gNikgJiA2MykgfCAxMjgpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXRmdGV4dDtcbiAgICB9XG5cbiAgICB2YXIgeCA9IEFycmF5KCk7XG4gICAgdmFyIGssIEFBLCBCQiwgQ0MsIERELCBhLCBiLCBjLCBkO1xuICAgIHZhciBTMTEgPSA3LFxuICAgICAgICBTMTIgPSAxMixcbiAgICAgICAgUzEzID0gMTcsXG4gICAgICAgIFMxNCA9IDIyO1xuICAgIHZhciBTMjEgPSA1LFxuICAgICAgICBTMjIgPSA5LFxuICAgICAgICBTMjMgPSAxNCxcbiAgICAgICAgUzI0ID0gMjA7XG4gICAgdmFyIFMzMSA9IDQsXG4gICAgICAgIFMzMiA9IDExLFxuICAgICAgICBTMzMgPSAxNixcbiAgICAgICAgUzM0ID0gMjM7XG4gICAgdmFyIFM0MSA9IDYsXG4gICAgICAgIFM0MiA9IDEwLFxuICAgICAgICBTNDMgPSAxNSxcbiAgICAgICAgUzQ0ID0gMjE7XG5cbiAgICBzdHJpbmcgPSBVdGY4RW5jb2RlKHN0cmluZyk7XG5cbiAgICB4ID0gQ29udmVydFRvV29yZEFycmF5KHN0cmluZyk7XG5cbiAgICBhID0gMHg2NzQ1MjMwMTtcbiAgICBiID0gMHhlZmNkYWI4OTtcbiAgICBjID0gMHg5OGJhZGNmZTtcbiAgICBkID0gMHgxMDMyNTQ3NjtcblxuICAgIGZvciAoayA9IDA7IGsgPCB4Lmxlbmd0aDsgayArPSAxNikge1xuICAgICAgICBBQSA9IGE7XG4gICAgICAgIEJCID0gYjtcbiAgICAgICAgQ0MgPSBjO1xuICAgICAgICBERCA9IGQ7XG4gICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCB4W2sgKyAwXSwgUzExLCAweGQ3NmFhNDc4KTtcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDFdLCBTMTIsIDB4ZThjN2I3NTYpO1xuICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgeFtrICsgMl0sIFMxMywgMHgyNDIwNzBkYik7XG4gICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCB4W2sgKyAzXSwgUzE0LCAweGMxYmRjZWVlKTtcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDRdLCBTMTEsIDB4ZjU3YzBmYWYpO1xuICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgNV0sIFMxMiwgMHg0Nzg3YzYyYSk7XG4gICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCB4W2sgKyA2XSwgUzEzLCAweGE4MzA0NjEzKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDddLCBTMTQsIDB4ZmQ0Njk1MDEpO1xuICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgeFtrICsgOF0sIFMxMSwgMHg2OTgwOThkOCk7XG4gICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCB4W2sgKyA5XSwgUzEyLCAweDhiNDRmN2FmKTtcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDEwXSwgUzEzLCAweGZmZmY1YmIxKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDExXSwgUzE0LCAweDg5NWNkN2JlKTtcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDEyXSwgUzExLCAweDZiOTAxMTIyKTtcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDEzXSwgUzEyLCAweGZkOTg3MTkzKTtcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDE0XSwgUzEzLCAweGE2Nzk0MzhlKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDE1XSwgUzE0LCAweDQ5YjQwODIxKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDFdLCBTMjEsIDB4ZjYxZTI1NjIpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgNl0sIFMyMiwgMHhjMDQwYjM0MCk7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAxMV0sIFMyMywgMHgyNjVlNWE1MSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyAwXSwgUzI0LCAweGU5YjZjN2FhKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDVdLCBTMjEsIDB4ZDYyZjEwNWQpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMTBdLCBTMjIsIDB4MjQ0MTQ1Myk7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAxNV0sIFMyMywgMHhkOGExZTY4MSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyA0XSwgUzI0LCAweGU3ZDNmYmM4KTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDldLCBTMjEsIDB4MjFlMWNkZTYpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMTRdLCBTMjIsIDB4YzMzNzA3ZDYpO1xuICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgeFtrICsgM10sIFMyMywgMHhmNGQ1MGQ4Nyk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyA4XSwgUzI0LCAweDQ1NWExNGVkKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDEzXSwgUzIxLCAweGE5ZTNlOTA1KTtcbiAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIHhbayArIDJdLCBTMjIsIDB4ZmNlZmEzZjgpO1xuICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgeFtrICsgN10sIFMyMywgMHg2NzZmMDJkOSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyAxMl0sIFMyNCwgMHg4ZDJhNGM4YSk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyA1XSwgUzMxLCAweGZmZmEzOTQyKTtcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDhdLCBTMzIsIDB4ODc3MWY2ODEpO1xuICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgeFtrICsgMTFdLCBTMzMsIDB4NmQ5ZDYxMjIpO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMTRdLCBTMzQsIDB4ZmRlNTM4MGMpO1xuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgMV0sIFMzMSwgMHhhNGJlZWE0NCk7XG4gICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCB4W2sgKyA0XSwgUzMyLCAweDRiZGVjZmE5KTtcbiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIHhbayArIDddLCBTMzMsIDB4ZjZiYjRiNjApO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMTBdLCBTMzQsIDB4YmViZmJjNzApO1xuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgMTNdLCBTMzEsIDB4Mjg5YjdlYzYpO1xuICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgeFtrICsgMF0sIFMzMiwgMHhlYWExMjdmYSk7XG4gICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyAzXSwgUzMzLCAweGQ0ZWYzMDg1KTtcbiAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIHhbayArIDZdLCBTMzQsIDB4NDg4MWQwNSk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyA5XSwgUzMxLCAweGQ5ZDRkMDM5KTtcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDEyXSwgUzMyLCAweGU2ZGI5OWU1KTtcbiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIHhbayArIDE1XSwgUzMzLCAweDFmYTI3Y2Y4KTtcbiAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIHhbayArIDJdLCBTMzQsIDB4YzRhYzU2NjUpO1xuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgMF0sIFM0MSwgMHhmNDI5MjI0NCk7XG4gICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCB4W2sgKyA3XSwgUzQyLCAweDQzMmFmZjk3KTtcbiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIHhbayArIDE0XSwgUzQzLCAweGFiOTQyM2E3KTtcbiAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDVdLCBTNDQsIDB4ZmM5M2EwMzkpO1xuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgMTJdLCBTNDEsIDB4NjU1YjU5YzMpO1xuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgM10sIFM0MiwgMHg4ZjBjY2M5Mik7XG4gICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyAxMF0sIFM0MywgMHhmZmVmZjQ3ZCk7XG4gICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCB4W2sgKyAxXSwgUzQ0LCAweDg1ODQ1ZGQxKTtcbiAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIHhbayArIDhdLCBTNDEsIDB4NmZhODdlNGYpO1xuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgMTVdLCBTNDIsIDB4ZmUyY2U2ZTApO1xuICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgeFtrICsgNl0sIFM0MywgMHhhMzAxNDMxNCk7XG4gICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCB4W2sgKyAxM10sIFM0NCwgMHg0ZTA4MTFhMSk7XG4gICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyA0XSwgUzQxLCAweGY3NTM3ZTgyKTtcbiAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIHhbayArIDExXSwgUzQyLCAweGJkM2FmMjM1KTtcbiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIHhbayArIDJdLCBTNDMsIDB4MmFkN2QyYmIpO1xuICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgeFtrICsgOV0sIFM0NCwgMHhlYjg2ZDM5MSk7XG4gICAgICAgIGEgPSBBZGRVbnNpZ25lZChhLCBBQSk7XG4gICAgICAgIGIgPSBBZGRVbnNpZ25lZChiLCBCQik7XG4gICAgICAgIGMgPSBBZGRVbnNpZ25lZChjLCBDQyk7XG4gICAgICAgIGQgPSBBZGRVbnNpZ25lZChkLCBERCk7XG4gICAgfVxuXG4gICAgdmFyIHRlbXAgPSBXb3JkVG9IZXgoYSkgKyBXb3JkVG9IZXgoYikgKyBXb3JkVG9IZXgoYykgKyBXb3JkVG9IZXgoZCk7XG5cbiAgICByZXR1cm4gdGVtcC50b0xvd2VyQ2FzZSgpO1xufVxuIiwiU2suYnVpbHRpbkZpbGVzPXtcImZpbGVzXCI6e1wic3JjL2J1aWx0aW4vc3lzLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYixhPU1hdGgucG93LGM9e30sZD1bXSxlPVNrLmdldFN5c0FyZ3YoKTtmb3IoYj0wO2I8ZS5sZW5ndGg7KytiKWQucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZVtiXSkpO3JldHVybiBjLmFyZ3Y9bmV3IFNrLmJ1aWx0aW5zLmxpc3QoZCksYy5jb3B5cmlnaHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJDb3B5cmlnaHQgMjAwOS0yMDEwIFNjb3R0IEdyYWhhbS5cXFxcbkFsbCBSaWdodHMgUmVzZXJ2ZWQuXFxcXG5cXFwiKSxTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGMudmVyc2lvbj1cXFwiMy43KGlzaCkgW1NrdWxwdF1cXFwiLGMudmVyc2lvbl9pbmZvPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKDMpLG5ldyBTay5idWlsdGluLmludF8oNyldKSk6KGMudmVyc2lvbj1cXFwiMi43KGlzaCkgW1NrdWxwdF1cXFwiLGMudmVyc2lvbl9pbmZvPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKDIpLG5ldyBTay5idWlsdGluLmludF8oNyldKSksYy5tYXhpbnQ9bmV3IFNrLmJ1aWx0aW4uaW50XyhhKDIsNTMpLTEpLGMubWF4c2l6ZT1uZXcgU2suYnVpbHRpbi5pbnRfKGEoMiw1MyktMSksYy5tb2R1bGVzPVNrLnN5c21vZHVsZXMsYy5wYXRoPVNrLnJlYWxzeXNwYXRoLGMuZ2V0RXhlY3V0aW9uTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBudWxsPT09U2suZXhlY0xpbWl0P1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmV4ZWNMaW1pdCl9KSxjLnNldEV4ZWN1dGlvbkxpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYobnVsbD09PVNrLmV4ZWNMaW1pdCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJFeGVjdXRpb24gbGltaXRpbmcgaXMgbm90IGVuYWJsZWRcXFwiKTt2b2lkIDAhPT1hJiYoU2suZXhlY0xpbWl0PVNrLmJ1aWx0aW4uYXNudW0kKGEpKX0pLGMucmVzZXRUaW1lb3V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5leGVjU3RhcnQ9bmV3IERhdGV9KSxjLmdldFlpZWxkTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBudWxsPT09U2sueWllbGRMaW1pdD9Tay5idWlsdGluLm5vbmUubm9uZSQ6bmV3IFNrLmJ1aWx0aW4uaW50XyhTay55aWVsZExpbWl0KX0pLGMuc2V0WWllbGRMaW1pdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2lmKG51bGw9PT1Tay55aWVsZExpbWl0KXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIllpZWxkaW5nIGlzIG5vdCBlbmFibGVkXFxcIik7dm9pZCAwIT09YSYmKFNrLnlpZWxkTGltaXQ9U2suYnVpbHRpbi5hc251bSQoYSkpfSksYy5kZWJ1Zz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuX19zdGRvdXRfXz1uZXcgU2suYnVpbHRpbi5maWxlKG5ldyBTay5idWlsdGluLnN0cihcXFwiL2Rldi9zdGRvdXRcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIndcXFwiKSksYy5fX3N0ZGluX189bmV3IFNrLmJ1aWx0aW4uZmlsZShuZXcgU2suYnVpbHRpbi5zdHIoXFxcIi9kZXYvc3RkaW5cXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcInJcXFwiKSksYy5zdGRvdXQ9Yy5fX3N0ZG91dF9fLGMuc3RkaW49Yy5fX3N0ZGluX18sY307XCIsXCJzcmMvYnVpbHRpbi90aGlzLnB5XCI6XCJzID0gXFxcIlxcXCJcXFwiR3VyIE1yYSBicyBDbGd1YmEsIG9sIEd2eiBDcmdyZWZcXG5cXG5Pcm5oZ3ZzaHkgdmYgb3JnZ3JlIGd1bmEgaHR5bC5cXG5Sa2N5dnB2ZyB2ZiBvcmdncmUgZ3VuYSB2emN5dnB2Zy5cXG5GdnpjeXIgdmYgb3JnZ3JlIGd1bmEgcGJ6Y3lyay5cXG5QYnpjeXJrIHZmIG9yZ2dyZSBndW5hIHBiemN5dnBuZ3JxLlxcblN5bmcgdmYgb3JnZ3JlIGd1bmEgYXJmZ3JxLlxcbkZjbmVmciB2ZiBvcmdncmUgZ3VuYSBxcmFmci5cXG5Fcm5xbm92eXZnbCBwYmhhZ2YuXFxuRmNycHZueSBwbmZyZiBuZXJhJ2cgZmNycHZueSByYWJodHUgZ2Igb2VybnggZ3VyIGVoeXJmLlxcbk55Z3ViaHR1IGNlbnBndnBueXZnbCBvcm5nZiBjaGV2Z2wuXFxuUmVlYmVmIGZ1Ymh5cSBhcmlyZSBjbmZmIGZ2eXJhZ3lsLlxcbkhheXJmZiBya2N5dnB2Z3lsIGZ2eXJhcHJxLlxcblZhIGd1ciBzbnByIGJzIG56b3Z0aHZnbCwgZXJzaGZyIGd1ciBncnpjZ25ndmJhIGdiIHRocmZmLlxcbkd1cmVyIGZ1Ymh5cSBvciBiYXItLSBuYXEgY2Vyc3Jlbm95bCBiYXlsIGJhciAtLWJvaXZiaGYgam5sIGdiIHFiIHZnLlxcbk55Z3ViaHR1IGd1bmcgam5sIHpubCBhYmcgb3IgYm9pdmJoZiBuZyBzdmVmZyBoYXlyZmYgbGJoJ2VyIFFoZ3B1LlxcbkFiaiB2ZiBvcmdncmUgZ3VuYSBhcmlyZS5cXG5OeWd1Ymh0dSBhcmlyZSB2ZiBic2dyYSBvcmdncmUgZ3VuYSAqZXZ0dWcqIGFiai5cXG5WcyBndXIgdnpjeXJ6cmFnbmd2YmEgdmYgdW5lcSBnYiBya2N5bnZhLCB2ZydmIG4gb25xIHZxcm4uXFxuVnMgZ3VyIHZ6Y3lyenJhZ25ndmJhIHZmIHJuZmwgZ2IgcmtjeW52YSwgdmcgem5sIG9yIG4gdGJicSB2cXJuLlxcbkFuenJmY25wcmYgbmVyIGJhciB1YmF4dmF0IHRlcm5nIHZxcm4gLS0geXJnJ2YgcWIgemJlciBicyBndWJmciFcXFwiXFxcIlxcXCJcXG5cXG5kID0ge31cXG5mb3IgYyBpbiAoNjUsIDk3KTpcXG4gICAgZm9yIGkgaW4gcmFuZ2UoMjYpOlxcbiAgICAgICAgZFtjaHIoaStjKV0gPSBjaHIoKGkrMTMpICUgMjYgKyBjKVxcblxcbnByaW50KFxcXCJcXFwiLmpvaW4oW2QuZ2V0KGMsIGMpIGZvciBjIGluIHNdKSlcXG5cIixcInNyYy9saWIvQmFzZUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkJhc2VIVFRQU2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvQmFzdGlvbi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQmFzdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0NHSUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNHSUhUVFBTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Db25maWdQYXJzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNvbmZpZ1BhcnNlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0Nvb2tpZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQ29va2llIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvRG9jWE1MUlBDU2VydmVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJEb2NYTUxSUENTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9IVE1MUGFyc2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJIVE1MUGFyc2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvTWltZVdyaXRlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiTWltZVdyaXRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1F1ZXVlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJRdWV1ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1NpbXBsZUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNpbXBsZUhUVFBTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9TaW1wbGVYTUxSUENTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNpbXBsZVhNTFJQQ1NlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1NvY2tldFNlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU29ja2V0U2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvU3RyaW5nSU8ucHlcIjpcInJcXFwiXFxcIlxcXCJGaWxlLWxpa2Ugb2JqZWN0cyB0aGF0IHJlYWQgZnJvbSBvciB3cml0ZSB0byBhIHN0cmluZyBidWZmZXIuXFxuXFxuVGhpcyBpbXBsZW1lbnRzIChuZWFybHkpIGFsbCBzdGRpbyBtZXRob2RzLlxcblxcbmYgPSBTdHJpbmdJTygpICAgICAgIyByZWFkeSBmb3Igd3JpdGluZ1xcbmYgPSBTdHJpbmdJTyhidWYpICAgIyByZWFkeSBmb3IgcmVhZGluZ1xcbmYuY2xvc2UoKSAgICAgICAgICAgIyBleHBsaWNpdGx5IHJlbGVhc2UgcmVzb3VyY2VzIGhlbGRcXG5mbGFnID0gZi5pc2F0dHkoKSAgICMgYWx3YXlzIGZhbHNlXFxucG9zID0gZi50ZWxsKCkgICAgICAjIGdldCBjdXJyZW50IHBvc2l0aW9uXFxuZi5zZWVrKHBvcykgICAgICAgICAjIHNldCBjdXJyZW50IHBvc2l0aW9uXFxuZi5zZWVrKHBvcywgbW9kZSkgICAjIG1vZGUgMDogYWJzb2x1dGU7IDE6IHJlbGF0aXZlOyAyOiByZWxhdGl2ZSB0byBFT0ZcXG5idWYgPSBmLnJlYWQoKSAgICAgICMgcmVhZCB1bnRpbCBFT0ZcXG5idWYgPSBmLnJlYWQobikgICAgICMgcmVhZCB1cCB0byBuIGJ5dGVzXFxuYnVmID0gZi5yZWFkbGluZSgpICAjIHJlYWQgdW50aWwgZW5kIG9mIGxpbmUgKCdcXFxcbicpIG9yIEVPRlxcbmxpc3QgPSBmLnJlYWRsaW5lcygpIyBsaXN0IG9mIGYucmVhZGxpbmUoKSByZXN1bHRzIHVudGlsIEVPRlxcbmYudHJ1bmNhdGUoW3NpemVdKSAgIyB0cnVuY2F0ZSBmaWxlIGF0IHRvIGF0IG1vc3Qgc2l6ZSAoZGVmYXVsdDogY3VycmVudCBwb3MpXFxuZi53cml0ZShidWYpICAgICAgICAjIHdyaXRlIGF0IGN1cnJlbnQgcG9zaXRpb25cXG5mLndyaXRlbGluZXMobGlzdCkgICMgZm9yIGxpbmUgaW4gbGlzdDogZi53cml0ZShsaW5lKVxcbmYuZ2V0dmFsdWUoKSAgICAgICAgIyByZXR1cm4gd2hvbGUgZmlsZSdzIGNvbnRlbnRzIGFzIGEgc3RyaW5nXFxuXFxuTm90ZXM6XFxuLSBVc2luZyBhIHJlYWwgZmlsZSBpcyBvZnRlbiBmYXN0ZXIgKGJ1dCBsZXNzIGNvbnZlbmllbnQpLlxcbi0gVGhlcmUncyBhbHNvIGEgbXVjaCBmYXN0ZXIgaW1wbGVtZW50YXRpb24gaW4gQywgY2FsbGVkIGNTdHJpbmdJTywgYnV0XFxuICBpdCdzIG5vdCBzdWJjbGFzc2FibGUuXFxuLSBmaWxlbm8oKSBpcyBsZWZ0IHVuaW1wbGVtZW50ZWQgc28gdGhhdCBjb2RlIHdoaWNoIHVzZXMgaXQgdHJpZ2dlcnNcXG4gIGFuIGV4Y2VwdGlvbiBlYXJseS5cXG4tIFNlZWtpbmcgZmFyIGJleW9uZCBFT0YgYW5kIHRoZW4gd3JpdGluZyB3aWxsIGluc2VydCByZWFsIG51bGxcXG4gIGJ5dGVzIHRoYXQgb2NjdXB5IHNwYWNlIGluIHRoZSBidWZmZXIuXFxuLSBUaGVyZSdzIGEgc2ltcGxlIHRlc3Qgc2V0IChzZWUgZW5kIG9mIHRoaXMgZmlsZSkuXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFtcXFwiU3RyaW5nSU9cXFwiXVxcblxcbmRlZiBfY29tcGxhaW5faWZjbG9zZWQoY2xvc2VkKTpcXG4gICAgaWYgY2xvc2VkOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVxcXCIpXFxuXFxuY2xhc3MgU3RyaW5nSU86XFxuICAgIFxcXCJcXFwiXFxcImNsYXNzIFN0cmluZ0lPKFtidWZmZXJdKVxcblxcbiAgICBXaGVuIGEgU3RyaW5nSU8gb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IGNhbiBiZSBpbml0aWFsaXplZCB0byBhbiBleGlzdGluZ1xcbiAgICBzdHJpbmcgYnkgcGFzc2luZyB0aGUgc3RyaW5nIHRvIHRoZSBjb25zdHJ1Y3Rvci4gSWYgbm8gc3RyaW5nIGlzIGdpdmVuLFxcbiAgICB0aGUgU3RyaW5nSU8gd2lsbCBzdGFydCBlbXB0eS5cXG5cXG4gICAgVGhlIFN0cmluZ0lPIG9iamVjdCBjYW4gYWNjZXB0IGVpdGhlciBVbmljb2RlIG9yIDgtYml0IHN0cmluZ3MsIGJ1dFxcbiAgICBtaXhpbmcgdGhlIHR3byBtYXkgdGFrZSBzb21lIGNhcmUuIElmIGJvdGggYXJlIHVzZWQsIDgtYml0IHN0cmluZ3MgdGhhdFxcbiAgICBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgNy1iaXQgQVNDSUkgKHRoYXQgdXNlIHRoZSA4dGggYml0KSB3aWxsIGNhdXNlXFxuICAgIGEgVW5pY29kZUVycm9yIHRvIGJlIHJhaXNlZCB3aGVuIGdldHZhbHVlKCkgaXMgY2FsbGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1ZiA9ICcnKTpcXG4gICAgICAgICMgRm9yY2Ugc2VsZi5idWYgdG8gYmUgYSBzdHJpbmcgb3IgdW5pY29kZVxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVmLCBzdHIpOlxcbiAgICAgICAgICAgIGJ1ZiA9IHN0cihidWYpXFxuICAgICAgICBzZWxmLmJ1ZiA9IGJ1ZlxcbiAgICAgICAgc2VsZi5sZW4gPSBsZW4oYnVmKVxcbiAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIHNlbGYucG9zID0gMFxcbiAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZVxcbiAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSAwXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBuZXh0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQSBmaWxlIG9iamVjdCBpcyBpdHMgb3duIGl0ZXJhdG9yLCBmb3IgZXhhbXBsZSBpdGVyKGYpIHJldHVybnMgZlxcbiAgICAgICAgKHVubGVzcyBmIGlzIGNsb3NlZCkuIFdoZW4gYSBmaWxlIGlzIHVzZWQgYXMgYW4gaXRlcmF0b3IsIHR5cGljYWxseVxcbiAgICAgICAgaW4gYSBmb3IgbG9vcCAoZm9yIGV4YW1wbGUsIGZvciBsaW5lIGluIGY6IHByaW50IGxpbmUpLCB0aGUgbmV4dCgpXFxuICAgICAgICBtZXRob2QgaXMgY2FsbGVkIHJlcGVhdGVkbHkuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5leHQgaW5wdXQgbGluZSxcXG4gICAgICAgIG9yIHJhaXNlcyBTdG9wSXRlcmF0aW9uIHdoZW4gRU9GIGlzIGhpdC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgciA9IHNlbGYucmVhZGxpbmUoKVxcbiAgICAgICAgaWYgbm90IHI6XFxuICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvblxcbiAgICAgICAgcmV0dXJuIHJcXG5cXG4gICAgZGVmIGNsb3NlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRnJlZSB0aGUgbWVtb3J5IGJ1ZmZlci5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOlxcbiAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZVxcbiAgICAgICAgICAgIHNlbGYuYnVmID0gTm9uZVxcbiAgICAgICAgICAgIHNlbGYucG9zID0gTm9uZVxcblxcbiAgICBkZWYgaXNhdHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJucyBGYWxzZSBiZWNhdXNlIFN0cmluZ0lPIG9iamVjdHMgYXJlIG5vdCBjb25uZWN0ZWQgdG8gYVxcbiAgICAgICAgdHR5LWxpa2UgZGV2aWNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIHNlZWsoc2VsZiwgcG9zLCBtb2RlID0gMCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIGZpbGUncyBjdXJyZW50IHBvc2l0aW9uLlxcblxcbiAgICAgICAgVGhlIG1vZGUgYXJndW1lbnQgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIDAgKGFic29sdXRlIGZpbGVcXG4gICAgICAgIHBvc2l0aW9uaW5nKTsgb3RoZXIgdmFsdWVzIGFyZSAxIChzZWVrIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50XFxuICAgICAgICBwb3NpdGlvbikgYW5kIDIgKHNlZWsgcmVsYXRpdmUgdG8gdGhlIGZpbGUncyBlbmQpLlxcblxcbiAgICAgICAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIGlmIG1vZGUgPT0gMTpcXG4gICAgICAgICAgICBwb3MgKz0gc2VsZi5wb3NcXG4gICAgICAgIGVsaWYgbW9kZSA9PSAyOlxcbiAgICAgICAgICAgIHBvcyArPSBzZWxmLmxlblxcbiAgICAgICAgc2VsZi5wb3MgPSBtYXgoMCwgcG9zKVxcblxcbiAgICBkZWYgdGVsbChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgZmlsZSdzIGN1cnJlbnQgcG9zaXRpb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICByZXR1cm4gc2VsZi5wb3NcXG5cXG4gICAgZGVmIHJlYWQoc2VsZiwgbiA9IC0xKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlYWQgYXQgbW9zdCBzaXplIGJ5dGVzIGZyb20gdGhlIGZpbGVcXG4gICAgICAgIChsZXNzIGlmIHRoZSByZWFkIGhpdHMgRU9GIGJlZm9yZSBvYnRhaW5pbmcgc2l6ZSBieXRlcykuXFxuXFxuICAgICAgICBJZiB0aGUgc2l6ZSBhcmd1bWVudCBpcyBuZWdhdGl2ZSBvciBvbWl0dGVkLCByZWFkIGFsbCBkYXRhIHVudGlsIEVPRlxcbiAgICAgICAgaXMgcmVhY2hlZC4gVGhlIGJ5dGVzIGFyZSByZXR1cm5lZCBhcyBhIHN0cmluZyBvYmplY3QuIEFuIGVtcHR5XFxuICAgICAgICBzdHJpbmcgaXMgcmV0dXJuZWQgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgaW1tZWRpYXRlbHkuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdClcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgaWYgbiBpcyBOb25lIG9yIG4gPCAwOlxcbiAgICAgICAgICAgIG5ld3BvcyA9IHNlbGYubGVuXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld3BvcyA9IG1pbihzZWxmLnBvcytuLCBzZWxmLmxlbilcXG4gICAgICAgIHIgPSBzZWxmLmJ1ZltzZWxmLnBvczpuZXdwb3NdXFxuICAgICAgICBzZWxmLnBvcyA9IG5ld3Bvc1xcbiAgICAgICAgcmV0dXJuIHJcXG5cXG4gICAgZGVmIHJlYWRsaW5lKHNlbGYsIGxlbmd0aD1Ob25lKTpcXG4gICAgICAgIHJcXFwiXFxcIlxcXCJSZWFkIG9uZSBlbnRpcmUgbGluZSBmcm9tIHRoZSBmaWxlLlxcblxcbiAgICAgICAgQSB0cmFpbGluZyBuZXdsaW5lIGNoYXJhY3RlciBpcyBrZXB0IGluIHRoZSBzdHJpbmcgKGJ1dCBtYXkgYmUgYWJzZW50XFxuICAgICAgICB3aGVuIGEgZmlsZSBlbmRzIHdpdGggYW4gaW5jb21wbGV0ZSBsaW5lKS4gSWYgdGhlIHNpemUgYXJndW1lbnQgaXNcXG4gICAgICAgIHByZXNlbnQgYW5kIG5vbi1uZWdhdGl2ZSwgaXQgaXMgYSBtYXhpbXVtIGJ5dGUgY291bnQgKGluY2x1ZGluZyB0aGVcXG4gICAgICAgIHRyYWlsaW5nIG5ld2xpbmUpIGFuZCBhbiBpbmNvbXBsZXRlIGxpbmUgbWF5IGJlIHJldHVybmVkLlxcblxcbiAgICAgICAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIG9ubHkgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgaW1tZWRpYXRlbHkuXFxuXFxuICAgICAgICBOb3RlOiBVbmxpa2Ugc3RkaW8ncyBmZ2V0cygpLCB0aGUgcmV0dXJuZWQgc3RyaW5nIGNvbnRhaW5zIG51bGxcXG4gICAgICAgIGNoYXJhY3RlcnMgKCdcXFxcMCcpIGlmIHRoZXkgb2NjdXJyZWQgaW4gdGhlIGlucHV0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIGkgPSBzZWxmLmJ1Zi5maW5kKCdcXFxcbicsIHNlbGYucG9zKVxcbiAgICAgICAgaWYgaSA8IDA6XFxuICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5sZW5cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbmV3cG9zID0gaSsxXFxuICAgICAgICBpZiBsZW5ndGggaXMgbm90IE5vbmUgYW5kIGxlbmd0aCA+PSAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYucG9zICsgbGVuZ3RoIDwgbmV3cG9zOlxcbiAgICAgICAgICAgICAgICBuZXdwb3MgPSBzZWxmLnBvcyArIGxlbmd0aFxcbiAgICAgICAgciA9IHNlbGYuYnVmW3NlbGYucG9zOm5ld3Bvc11cXG4gICAgICAgIHNlbGYucG9zID0gbmV3cG9zXFxuICAgICAgICByZXR1cm4gclxcblxcbiAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemVoaW50ID0gMCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZWFkIHVudGlsIEVPRiB1c2luZyByZWFkbGluZSgpIGFuZCByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlXFxuICAgICAgICBsaW5lcyB0aHVzIHJlYWQuXFxuXFxuICAgICAgICBJZiB0aGUgb3B0aW9uYWwgc2l6ZWhpbnQgYXJndW1lbnQgaXMgcHJlc2VudCwgaW5zdGVhZCBvZiByZWFkaW5nIHVwXFxuICAgICAgICB0byBFT0YsIHdob2xlIGxpbmVzIHRvdGFsbGluZyBhcHByb3hpbWF0ZWx5IHNpemVoaW50IGJ5dGVzIChvciBtb3JlXFxuICAgICAgICB0byBhY2NvbW1vZGF0ZSBhIGZpbmFsIHdob2xlIGxpbmUpLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB0b3RhbCA9IDBcXG4gICAgICAgIGxpbmVzID0gW11cXG4gICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKClcXG4gICAgICAgIHdoaWxlIGxpbmU6XFxuICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpXFxuICAgICAgICAgICAgdG90YWwgKz0gbGVuKGxpbmUpXFxuICAgICAgICAgICAgaWYgMCA8IHNpemVoaW50IDw9IHRvdGFsOlxcbiAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKClcXG4gICAgICAgIHJldHVybiBsaW5lc1xcblxcbiAgICBkZWYgdHJ1bmNhdGUoc2VsZiwgc2l6ZT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRydW5jYXRlIHRoZSBmaWxlJ3Mgc2l6ZS5cXG5cXG4gICAgICAgIElmIHRoZSBvcHRpb25hbCBzaXplIGFyZ3VtZW50IGlzIHByZXNlbnQsIHRoZSBmaWxlIGlzIHRydW5jYXRlZCB0b1xcbiAgICAgICAgKGF0IG1vc3QpIHRoYXQgc2l6ZS4gVGhlIHNpemUgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uXFxuICAgICAgICBUaGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkIHVubGVzcyB0aGUgcG9zaXRpb25cXG4gICAgICAgIGlzIGJleW9uZCB0aGUgbmV3IGZpbGUgc2l6ZS5cXG5cXG4gICAgICAgIElmIHRoZSBzcGVjaWZpZWQgc2l6ZSBleGNlZWRzIHRoZSBmaWxlJ3MgY3VycmVudCBzaXplLCB0aGVcXG4gICAgICAgIGZpbGUgcmVtYWlucyB1bmNoYW5nZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNpemUgaXMgTm9uZTpcXG4gICAgICAgICAgICBzaXplID0gc2VsZi5wb3NcXG4gICAgICAgIGVsaWYgc2l6ZSA8IDA6XFxuICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigyMiwgXFxcIk5lZ2F0aXZlIHNpemUgbm90IGFsbG93ZWRcXFwiKVxcbiAgICAgICAgZWxpZiBzaXplIDwgc2VsZi5wb3M6XFxuICAgICAgICAgICAgc2VsZi5wb3MgPSBzaXplXFxuICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuZ2V0dmFsdWUoKVs6c2l6ZV1cXG4gICAgICAgIHNlbGYubGVuID0gc2l6ZVxcblxcbiAgICBkZWYgd3JpdGUoc2VsZiwgcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJXcml0ZSBhIHN0cmluZyB0byB0aGUgZmlsZS5cXG5cXG4gICAgICAgIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgaWYgbm90IHM6IHJldHVyblxcbiAgICAgICAgIyBGb3JjZSBzIHRvIGJlIGEgc3RyaW5nIG9yIHVuaWNvZGVcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHN0cik6XFxuICAgICAgICAgICAgcyA9IHN0cihzKVxcbiAgICAgICAgc3BvcyA9IHNlbGYucG9zXFxuICAgICAgICBzbGVuID0gc2VsZi5sZW5cXG4gICAgICAgIGlmIHNwb3MgPT0gc2xlbjpcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKHMpXFxuICAgICAgICAgICAgc2VsZi5sZW4gPSBzZWxmLnBvcyA9IHNwb3MgKyBsZW4ocylcXG4gICAgICAgICAgICByZXR1cm5cXG4gICAgICAgIGlmIHNwb3MgPiBzbGVuOlxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQoJ1xcXFwwJyooc3BvcyAtIHNsZW4pKVxcbiAgICAgICAgICAgIHNsZW4gPSBzcG9zXFxuICAgICAgICBuZXdwb3MgPSBzcG9zICsgbGVuKHMpXFxuICAgICAgICBpZiBzcG9zIDwgc2xlbjpcXG4gICAgICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KVxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtzZWxmLmJ1Zls6c3Bvc10sIHMsIHNlbGYuYnVmW25ld3BvczpdXVxcbiAgICAgICAgICAgIHNlbGYuYnVmID0gJydcXG4gICAgICAgICAgICBpZiBuZXdwb3MgPiBzbGVuOlxcbiAgICAgICAgICAgICAgICBzbGVuID0gbmV3cG9zXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQocylcXG4gICAgICAgICAgICBzbGVuID0gbmV3cG9zXFxuICAgICAgICBzZWxmLmxlbiA9IHNsZW5cXG4gICAgICAgIHNlbGYucG9zID0gbmV3cG9zXFxuXFxuICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGl0ZXJhYmxlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIldyaXRlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB0byB0aGUgZmlsZS4gVGhlIHNlcXVlbmNlIGNhbiBiZSBhbnlcXG4gICAgICAgIGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgc3RyaW5ncywgdHlwaWNhbGx5IGEgbGlzdCBvZiBzdHJpbmdzLiBUaGVyZVxcbiAgICAgICAgaXMgbm8gcmV0dXJuIHZhbHVlLlxcblxcbiAgICAgICAgKFRoZSBuYW1lIGlzIGludGVuZGVkIHRvIG1hdGNoIHJlYWRsaW5lcygpOyB3cml0ZWxpbmVzKCkgZG9lcyBub3QgYWRkXFxuICAgICAgICBsaW5lIHNlcGFyYXRvcnMuKVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGVcXG4gICAgICAgIGZvciBsaW5lIGluIGl0ZXJhYmxlOlxcbiAgICAgICAgICAgIHdyaXRlKGxpbmUpXFxuXFxuICAgIGRlZiBmbHVzaChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZsdXNoIHRoZSBpbnRlcm5hbCBidWZmZXJcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcblxcbiAgICBkZWYgZ2V0dmFsdWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIFJldHJpZXZlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIFxcXCJmaWxlXFxcIiBhdCBhbnkgdGltZSBiZWZvcmVcXG4gICAgICAgIHRoZSBTdHJpbmdJTyBvYmplY3QncyBjbG9zZSgpIG1ldGhvZCBpcyBjYWxsZWQuXFxuXFxuICAgICAgICBUaGUgU3RyaW5nSU8gb2JqZWN0IGNhbiBhY2NlcHQgZWl0aGVyIFVuaWNvZGUgb3IgOC1iaXQgc3RyaW5ncyxcXG4gICAgICAgIGJ1dCBtaXhpbmcgdGhlIHR3byBtYXkgdGFrZSBzb21lIGNhcmUuIElmIGJvdGggYXJlIHVzZWQsIDgtYml0XFxuICAgICAgICBzdHJpbmdzIHRoYXQgY2Fubm90IGJlIGludGVycHJldGVkIGFzIDctYml0IEFTQ0lJICh0aGF0IHVzZSB0aGVcXG4gICAgICAgIDh0aCBiaXQpIHdpbGwgY2F1c2UgYSBVbmljb2RlRXJyb3IgdG8gYmUgcmFpc2VkIHdoZW4gZ2V0dmFsdWUoKVxcbiAgICAgICAgaXMgY2FsbGVkLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIHJldHVybiBzZWxmLmJ1ZlxcblwiLFwic3JjL2xpYi9Vc2VyRGljdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiVXNlckRpY3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Vc2VyTGlzdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiVXNlckxpc3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Vc2VyU3RyaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJVc2VyU3RyaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX0xXUENvb2tpZUphci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX0xXUENvb2tpZUphciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19Nb3ppbGxhQ29va2llSmFyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfTW96aWxsYUNvb2tpZUphciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19fZnV0dXJlX18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9fZnV0dXJlX18gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fX3BoZWxsb19fLmZvby5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX19waGVsbG9fXy5mb28gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fYWJjb2xsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfYWJjb2xsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX3N0cnB0aW1lLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfc3RycHRpbWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fdGhyZWFkaW5nX2xvY2FsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfdGhyZWFkaW5nX2xvY2FsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYWJjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhYmMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9haWZjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhaWZjIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYWx0YWlyL19faW5pdF9fLnB5XCI6XCJpbXBvcnQgcmFuZG9tXFxuXFxudHJ5OlxcbiAgICBmcm9tIHZlZ2FfY2FsbGVyIGltcG9ydCByZW5kZXJfZ3JhcGhcXG5leGNlcHQ6XFxuICAgIHByaW50KFxcXCJNb2NrIHJlbmRlclxcXCIpXFxuXFxuICAgIGRlZiByZW5kZXJfZ3JhcGgoanMpOlxcbiAgICAgICAgcHJpbnQoanMpXFxuXFxuXFxuY2xhc3MgQ2hhcnQ6XFxuICAgICMgVE9ETyBhbGxvdyBkYXRhIHRvIGJlIHNwZWNpZmllZCBhcyBhIFVSTCB0byBhIENTViBvciBEQiBvciBqc29uXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCB0aXRsZT1Ob25lKTpcXG4gICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZVxcbiAgICAgICAgc2VsZi5kYXRhX2lkID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwMDAwLCA1MDAwMDAwKVxcbiAgICAgICAgc2VsZi5kc25hbWUgPSBcXFwiZGF0YS17fVxcXCIuZm9ybWF0KHNlbGYuZGF0YV9pZClcXG4gICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6XFxuICAgICAgICAgICAgc2VsZi5kYXRhID0gRGF0YSgqKmRhdGEpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGFcXG5cXG4gICAgICAgIHNlbGYuanNvbiA9IHt9XFxuICAgICAgICBzZWxmLmpzb25bXFxcIiRzY2hlbWFcXFwiXSA9IFxcXCJodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3NjaGVtYS92ZWdhLWxpdGUvdjIuNS5qc29uXFxcIlxcbiAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhXFxcIl0gPSB7fVxcbiAgICAgICAgaWYgc2VsZi50aXRsZTpcXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcInRpdGxlXFxcIl0gPSBzZWxmLnRpdGxlXFxuXFxuICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFcXFwiXSA9IHtcXFwidmFsdWVzXFxcIjogc2VsZi5kYXRhLnZhbHN9XFxuICAgICAgICBzZWxmLmlzX2NvbXBvc2l0ZSA9IEZhbHNlXFxuXFxuICAgICMgbWFyayBjYW4gYmUgYSBzaW1wbGUgc3RyaW5nIG9yIGEgZGljdGlvbmFyeVxcbiAgICAjIFxcXCJtYXJrXFxcIjoge1xcXCJjb2xvclxcXCI6IFxcXCJncmVlblxcXCIsIFxcXCJvcGFjaXR5XFxcIjogMC4yLCBcXFwidHlwZVxcXCI6IFxcXCJyZWN0XFxcIn1cXG5cXG4gICAgZGVmIG1hcmtfanNvbihzZWxmLCBtYXJrX3R5cGUsICoqa3dhcmdzKTpcXG4gICAgICAgIGlmIGt3YXJnczpcXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXSA9IHt9XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1bXFxcInR5cGVcXFwiXSA9IG1hcmtfdHlwZVxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdLnVwZGF0ZShrd2FyZ3MpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdID0gbWFya190eXBlXFxuXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgbWFya19iYXIoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJiYXJcXFwiLCAqKmt3YXJncylcXG5cXG4gICAgZGVmIG1hcmtfcG9pbnQoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJwb2ludFxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19saW5lKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwibGluZVxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19yZWN0KHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwicmVjdFxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19hcmVhKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwiYXJlYVxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya190aWNrKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwidGlja1xcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgZW5jb2RlKHNlbGYsIHg9XFxcIlxcXCIsIHk9XFxcIlxcXCIsIGNvbG9yPVxcXCJcXFwiLCBzaXplPVxcXCJcXFwiLCB0b29sdGlwPVxcXCJcXFwiKTpcXG4gICAgICAgIHNlbGYuZW5jb2RpbmcgPSB7fVxcbiAgICAgICAgaWYgeDpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHgsIEF4aXMpOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ4XFxcIl0gPSB4LnRvSnNvbigpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwieFxcXCJdID0gQXhpcyh4KS50b0pzb24oKVxcbiAgICAgICAgaWYgeTpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHksIEF4aXMpOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ5XFxcIl0gPSB5LnRvSnNvbigpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwieVxcXCJdID0gQXhpcyh5KS50b0pzb24oKVxcblxcbiAgICAgICAgIyBcXFwiY29sb3JcXFwiOiB7XFxcInR5cGVcXFwiOiBcXFwibm9taW5hbFxcXCIsIFxcXCJmaWVsZFxcXCI6IFxcXCJzcGVjaWVzXFxcIn1cXG4gICAgICAgIGlmIGNvbG9yOlxcbiAgICAgICAgICAgIGZpZWxkLCB0cCA9IF9nZXRfbmFtZV90eXBlKGNvbG9yKVxcbiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcImNvbG9yXFxcIl0gPSBkaWN0KHR5cGU9dHAsIGZpZWxkPWZpZWxkKVxcblxcbiAgICAgICAgIyBcXFwic2l6ZVxcXCI6IHtcXFwidHlwZVxcXCI6IFxcXCJxdWFudGl0YXRpdmVcXFwiLCBcXFwiZmllbGRcXFwiOiBcXFwiQWNjZWxlcmF0aW9uXFxcIn1cXG4gICAgICAgIGlmIHNpemU6XFxuICAgICAgICAgICAgZmllbGQsIHRwID0gX2dldF9uYW1lX3R5cGUoc2l6ZSlcXG4gICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJzaXplXFxcIl0gPSBkaWN0KHR5cGU9dHAsIGZpZWxkPWZpZWxkKVxcblxcbiAgICAgICAgaWYgdG9vbHRpcDpcXG4gICAgICAgICAgICBmaWVsZCwgdHAgPSBfZ2V0X25hbWVfdHlwZSh0b29sdGlwKVxcbiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInRvb2x0aXBcXFwiXSA9IGRpY3QodHlwZT10cCwgZmllbGQ9ZmllbGQpXFxuXFxuICAgICAgICBzZWxmLmpzb25bXFxcImVuY29kaW5nXFxcIl0gPSBzZWxmLmVuY29kaW5nXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgaW50ZXJhY3RpdmUoc2VsZik6XFxuICAgICAgICBpY29uZmlnID0ge1xcbiAgICAgICAgICAgIFxcXCJzZWxlY3RvcjAwMlxcXCI6IHtcXG4gICAgICAgICAgICAgICAgXFxcInR5cGVcXFwiOiBcXFwiaW50ZXJ2YWxcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiYmluZFxcXCI6IFxcXCJzY2FsZXNcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiZW5jb2RpbmdzXFxcIjogW1xcXCJ4XFxcIiwgXFxcInlcXFwiXSxcXG4gICAgICAgICAgICAgICAgXFxcIm9uXFxcIjogXFxcIlttb3VzZWRvd24sIHdpbmRvdzptb3VzZXVwXSA+IHdpbmRvdzptb3VzZW1vdmUhXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcInRyYW5zbGF0ZVxcXCI6IFxcXCJbbW91c2Vkb3duLCB3aW5kb3c6bW91c2V1cF0gPiB3aW5kb3c6bW91c2Vtb3ZlIVxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJ6b29tXFxcIjogXFxcIndoZWVsIVxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJtYXJrXFxcIjoge1xcXCJmaWxsXFxcIjogXFxcIiMzMzNcXFwiLCBcXFwiZmlsbE9wYWNpdHlcXFwiOiAwLjEyNSwgXFxcInN0cm9rZVxcXCI6IFxcXCJ3aGl0ZVxcXCJ9LFxcbiAgICAgICAgICAgICAgICBcXFwicmVzb2x2ZVxcXCI6IFxcXCJnbG9iYWxcXFwiLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHNlbGYuanNvbltcXFwic2VsZWN0aW9uXFxcIl0gPSBpY29uZmlnXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgZGlzcGxheShzZWxmKTpcXG4gICAgICAgIHJlbmRlcl9ncmFwaChzZWxmLmpzb24pXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmFkZF9sYXllcihvdGhlciwgXFxcImxheWVyXFxcIilcXG5cXG4gICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuYWRkX2xheWVyKG90aGVyLCBcXFwidmNvbmNhdFxcXCIpXFxuXFxuICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuYWRkX2xheWVyKG90aGVyLCBcXFwiaGNvbmNhdFxcXCIpXFxuXFxuICAgIGRlZiBhZGRfbGF5ZXIoc2VsZiwgb3RoZXIsIGxuYW1lKTpcXG4gICAgICAgICMgbXVsdGxlIGxheWVycyBhcmUgYWRkZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgbmV3IGVsZW1lbnQgdG8gdGhlXFxuICAgICAgICAjIGV4aXN0aW5nIGxheWVyLiAgSWYgdGhlIGxheWVyIGRvZXMgbm90IGV4aXN0IHRoZW4gaW5pdGlhbGl6ZVxcbiAgICAgICAgIyBpdCBmcm9tIHNlbGYuXFxuICAgICAgICBpZiBsbmFtZSBub3QgaW4gc2VsZi5qc29uOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltsbmFtZV0gPSBbXVxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwiZGF0YXNldHNcXFwiXSA9IHt9XFxuICAgICAgICAgICAgdGVtcCA9IHt9XFxuICAgICAgICAgICAgdGVtcFtcXFwiZGF0YVxcXCJdID0ge1xcXCJuYW1lXFxcIjogc2VsZi5kc25hbWV9XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhc2V0c1xcXCJdW3NlbGYuZHNuYW1lXSA9IHNlbGYuanNvbltcXFwiZGF0YVxcXCJdW1xcXCJ2YWx1ZXNcXFwiXVxcbiAgICAgICAgICAgIGRlbCBzZWxmLmpzb25bXFxcImRhdGFcXFwiXVxcbiAgICAgICAgICAgIHRlbXBbXFxcImVuY29kaW5nXFxcIl0gPSBzZWxmLmpzb25bXFxcImVuY29kaW5nXFxcIl1cXG4gICAgICAgICAgICBkZWwgc2VsZi5qc29uW1xcXCJlbmNvZGluZ1xcXCJdXFxuICAgICAgICAgICAgdGVtcFtcXFwibWFya1xcXCJdID0gc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgICAgICBkZWwgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgICAgICBzZWxmLmpzb25bbG5hbWVdLmFwcGVuZCh0ZW1wKVxcbiAgICAgICAgdGVtcCA9IHt9XFxuICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFzZXRzXFxcIl1bb3RoZXIuZHNuYW1lXSA9IG90aGVyLmpzb25bXFxcImRhdGFcXFwiXVtcXFwidmFsdWVzXFxcIl1cXG4gICAgICAgIHRlbXBbXFxcImRhdGFcXFwiXSA9IHtcXFwibmFtZVxcXCI6IG90aGVyLmRzbmFtZX1cXG4gICAgICAgIHRlbXBbXFxcImVuY29kaW5nXFxcIl0gPSBvdGhlci5qc29uW1xcXCJlbmNvZGluZ1xcXCJdXFxuICAgICAgICB0ZW1wW1xcXCJtYXJrXFxcIl0gPSBvdGhlci5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgIHNlbGYuanNvbltsbmFtZV0uYXBwZW5kKHRlbXApXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcblxcbiMgICBcXFwiZGF0YXNldHNcXFwiOiB7XFxuIyAgICAgXFxcImRhdGEtZTU2ZTQzMzU0ZDliOGYyYWIwZDFlOTBjZjI3Y2Q0N2ZcXFwiOiBbXFxuIyAgICAgICB7XFxcImFcXFwiOiA0LCBcXFwiYlxcXCI6IDEsIFxcXCJjXFxcIjogXFxcInJcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDUsIFxcXCJiXFxcIjogMiwgXFxcImNcXFwiOiBcXFwiZ1xcXCJ9LFxcbiMgICAgICAge1xcXCJhXFxcIjogNiwgXFxcImJcXFwiOiAzLCBcXFwiY1xcXCI6IFxcXCJiXFxcIn1cXG4jICAgICBdLFxcbiMgICAgIFxcXCJkYXRhLWE0YzMwNDdhMTViZjkzODBjMmU2MTVjZjg3NjQ4MzY5XFxcIjogW1xcbiMgICAgICAge1xcXCJhXFxcIjogMSwgXFxcImJcXFwiOiA0LCBcXFwiY1xcXCI6IFxcXCJyXFxcIn0sXFxuIyAgICAgICB7XFxcImFcXFwiOiAyLCBcXFwiYlxcXCI6IDUsIFxcXCJjXFxcIjogXFxcImdcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDMsIFxcXCJiXFxcIjogNiwgXFxcImNcXFwiOiBcXFwiYlxcXCJ9XFxuIyAgICAgXVxcbiMgICB9XFxuXFxuIyBUT0RPOiAgYWRkIGEgcmVjdCBtYXJrIHR5cGUgZm9yIGEgaGVhdCBtYXBcXG5cXG5cXG5kZWYgX2dldF9uYW1lX3R5cGUobmFtZSk6XFxuICAgIHR5cGVkID0ge1xcXCJRXFxcIjogXFxcInF1YW50aXRhdGl2ZVxcXCIsIFxcXCJPXFxcIjogXFxcIm9yZGluYWxcXFwiLCBcXFwiTlxcXCI6IFxcXCJub21pbmFsXFxcIiwgXFxcIlRcXFwiOiBcXFwidGVtcG9yYWxcXFwifVxcbiAgICBudCA9IG5hbWUuc3BsaXQoXFxcIjpcXFwiKVxcbiAgICB0c3RyaW5nID0gXFxcInF1YW50aXRhdGl2ZVxcXCJcXG4gICAgaWYgbGVuKG50KSA9PSAyOlxcbiAgICAgICAgdHN0cmluZyA9IHR5cGVkW250WzFdXVxcbiAgICByZXR1cm4gbnRbMF0sIHRzdHJpbmdcXG5cXG5cXG5jbGFzcyBBeGlzOlxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgYmluPUZhbHNlKTpcXG4gICAgICAgIHNlbGYuYWdncmVnYXRlID0gTm9uZVxcbiAgICAgICAgc2VsZi5uYW1lLCBzZWxmLnR5cGUgPSBfZ2V0X25hbWVfdHlwZShuYW1lKVxcbiAgICAgICAgaWYgXFxcIigpXFxcIiBpbiBzZWxmLm5hbWU6ICAjIGFnZ3JlZ2F0ZSBmdW5jdGlvblxcbiAgICAgICAgICAgIHNlbGYuYWdncmVnYXRlID0gc2VsZi5uYW1lLnJlcGxhY2UoXFxcIigpXFxcIiwgXFxcIlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZVxcbiAgICAgICAgc2VsZi5iaW4gPSBiaW5cXG5cXG4gICAgZGVmIHRvSnNvbihzZWxmKTpcXG4gICAgICAgIGpzb24gPSB7fVxcbiAgICAgICAgaWYgc2VsZi5uYW1lOlxcbiAgICAgICAgICAgIGpzb25bXFxcImZpZWxkXFxcIl0gPSBzZWxmLm5hbWVcXG4gICAgICAgIGlmIHNlbGYudHlwZTpcXG4gICAgICAgICAgICBqc29uW1xcXCJ0eXBlXFxcIl0gPSBzZWxmLnR5cGVcXG4gICAgICAgIGlmIHNlbGYuYmluOlxcbiAgICAgICAgICAgIGpzb25bXFxcImJpblxcXCJdID0gVHJ1ZVxcbiAgICAgICAgaWYgc2VsZi5hZ2dyZWdhdGU6XFxuICAgICAgICAgICAganNvbltcXFwiYWdncmVnYXRlXFxcIl0gPSBzZWxmLmFnZ3JlZ2F0ZVxcblxcbiAgICAgICAgcmV0dXJuIGpzb25cXG5cXG5cXG5jbGFzcyBYKEF4aXMpOlxcbiAgICBwYXNzXFxuXFxuXFxuY2xhc3MgWShBeGlzKTpcXG4gICAgcGFzc1xcblxcblxcbmNsYXNzIERhdGE6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlucHV0IGNhbiBiZSB0aGUgZm9ybSBvZiBhIHNlcmllcyBvZiBrZXl3b3JkIGFyZ3Mgd2hlcmVcXG4gICAgICAgIHRoZSBrZXl3b3JkIGlzIHRoZSBjb2x1bW4gbmFtZSwgb3IgYSBzaW5nbGUga2V5d29yZCBkYXRhXFxuICAgICAgICB0aGF0IGlzIGEgbGlzdCBvZiBqc29uIHN0eWxlIHJlY29yZHMgYXMgcm93cy5cXG4gICAgICAgIGNvdWxkIGFsc28gYWNjZXB0IGEgY3N2IGZpbGU/IG9yIGtleXdvcmRzIGNvbHVtbnMgYW5kIHJvd3NcXG4gICAgICAgIFRoaXMgYWNjZXB0cyBhIGxvdCBtb3JlIG9wdGlvbnMgdGhhdCBcXFwicmVhbCBhbHRhaXJcXFwiIHRvIG1ha2UgaXQgZWFzaWVyXFxuICAgICAgICB0byB3b3JrIHdpdGggbm9uLURhdGFGcmFtZSBkYXRhIHNldHMuICBJbnRlcm5hbGx5OlxcbiAgICAgICAgc2VsZi5rZXlzIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGNvbHVtbiBuYW1lc1xcbiAgICAgICAgc2VsZi52YWxzIGlzIGEgbGlzdCBvZiBkaWN0aW9uYXJpZXMgb2YgdGhlIGZvcm0gW3tjb2wxOnZhbDEsIGNvbDI6dmFsMiwgLi4uIGNvbG46dmFsbn0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbDE6dmFsMywgY29sMjp2YWw0LCAuLi4gY29sbjp2YWxufSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sMTp2YWw1LCBjb2wyOnZhbDYsIC4uLiBjb2xuOnZhbG59XVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIHRvZG86IGFjY2VwdCBhIFVSTCBhcyB0aGUgYXJndW1lbnQgdG8gcmVhZCBhIENTViBvciBKU09OIGZpbGVcXG4gICAgICAgIGlmIGxlbihrd2FyZ3MpID09IDEgYW5kIFxcXCJkYXRhXFxcIiBpbiBrd2FyZ3M6XFxuICAgICAgICAgICAgc2VsZi5kYXRhID0ga3dhcmdzW1xcXCJkYXRhXFxcIl1cXG4gICAgICAgICAgICBzZWxmLmtleXMgPSBzZWxmLmRhdGFbMF0ua2V5cygpXFxuICAgICAgICAgICAgc2VsZi52YWxzID0gc2VsZi5kYXRhXFxuICAgICAgICBlbGlmIGxlbihrd2FyZ3MpID09IDIgYW5kIChcXFwiY29sdW1uc1xcXCIgaW4ga3dhcmdzKSBhbmQgKFxcXCJyb3dzXFxcIiBpbiBrd2FyZ3MpOlxcbiAgICAgICAgICAgIHNlbGYua2V5cyA9IGt3YXJnc1tcXFwiY29sdW1uc1xcXCJdXFxuICAgICAgICAgICAgc2VsZi52YWxzID0gW11cXG4gICAgICAgICAgICBmb3IgciBpbiBrd2FyZ3NbXFxcInJvd3NcXFwiXTpcXG4gICAgICAgICAgICAgICAgc2VsZi52YWxzLmFwcGVuZChkaWN0KHppcChzZWxmLmtleXMsIHIpKSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAga2V5cyA9IGt3YXJncy5rZXlzKClcXG4gICAgICAgICAgICB2YWxzID0gW11cXG4gICAgICAgICAgICBwcmltYXJ5X2tleSA9IGxpc3Qoa2V5cylbMF1cXG4gICAgICAgICAgICBmb3IgaXggaW4gcmFuZ2UobGVuKGt3YXJnc1twcmltYXJ5X2tleV0pKTpcXG4gICAgICAgICAgICAgICAgZCA9IHt9XFxuICAgICAgICAgICAgICAgIGZvciBrZXkgaW4ga2V5czpcXG4gICAgICAgICAgICAgICAgICAgIGRba2V5XSA9IGt3YXJnc1trZXldW2l4XVxcbiAgICAgICAgICAgICAgICB2YWxzLmFwcGVuZChkKVxcbiAgICAgICAgICAgIHNlbGYudmFscyA9IHZhbHNcXG4gICAgICAgICAgICBzZWxmLmtleXMgPSBrZXlzXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgIyBoZWFkZXIgPSBcXFwiXFxcXHRcXFwiLmpvaW4oc2VsZi5rZXlzKSArIFxcXCJcXFxcblxcXCJcXG4gICAgICAgIGhlYWRlciA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5czpcXG4gICAgICAgICAgICBoZWFkZXIgKz0ga2V5LmNlbnRlcigxMCkgKyBcXFwiIFxcXCJcXG4gICAgICAgIGhlYWRlciArPSBcXFwiXFxcXG5cXFwiXFxuICAgICAgICB0ZW1wbGF0ZSA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5czpcXG4gICAgICAgICAgICB0ZW1wbGF0ZSArPSBcXFwie1xcXCIgKyBrZXkgKyBcXFwiOiA8MTB9IFxcXCJcXG4gICAgICAgIHRlbXBsYXRlICs9IFxcXCJcXFxcblxcXCJcXG4gICAgICAgIHJlcyA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Igcm93IGluIHNlbGYudmFsczpcXG4gICAgICAgICAgICByZXMgKz0gdGVtcGxhdGUuZm9ybWF0KCoqcm93KVxcblxcbiAgICAgICAgcmV0dXJuIGhlYWRlciArIHJlc1xcblxcblxcbmlmIF9fbmFtZV9fID09IFxcXCJfX21haW5fX1xcXCI6XFxuICAgIGQgPSBEYXRhKGE9WzMsIDQsIDVdLCBiPVsxLCAyLCAzXSwgYz1bXFxcInJcXFwiLCBcXFwiZ1xcXCIsIFxcXCJiXFxcIl0pXFxuICAgIHByaW50KGQpXFxuICAgIHByaW50KFxcbiAgICAgICAgdHlwZShcXG4gICAgICAgICAgICBDaGFydCh7XFxcImFcXFwiOiBsaXN0KFxcXCJhYmNcXFwiKSwgXFxcImJcXFwiOiBbMSwgMiwgM119KS5tYXJrX2JhcigpLmVuY29kZSh4PVxcXCJhOk5cXFwiLCB5PVxcXCJiXFxcIilcXG4gICAgICAgIClcXG4gICAgKVxcbiAgICBhYSA9IChcXG4gICAgICAgIENoYXJ0KERhdGEoYT1bMywgNCwgNV0sIGI9WzEsIDIsIDNdLCBjPVtcXFwiclxcXCIsIFxcXCJnXFxcIiwgXFxcImJcXFwiXSkpXFxuICAgICAgICAubWFya19wb2ludChjb2xvcj1cXFwicmVkXFxcIilcXG4gICAgICAgIC5lbmNvZGUoeD1cXFwiYlxcXCIsIHk9XFxcImFcXFwiLCBjb2xvcj1cXFwiYzpPXFxcIilcXG4gICAgKVxcbiAgICBwcmludChcXFwiYWEgPSBcXFwiLCBhYSlcXG4gICAgYWEuZGlzcGxheSgpXFxuXFxuICAgIGJiID0gKFxcbiAgICAgICAgQ2hhcnQoRGF0YShhPVsxLCAyLCAzXSwgYj1bNCwgNSwgNl0sIGM9W1xcXCJyXFxcIiwgXFxcImdcXFwiLCBcXFwiYlxcXCJdKSlcXG4gICAgICAgIC5tYXJrX2xpbmUoKVxcbiAgICAgICAgLmVuY29kZSh4PVxcXCJiXFxcIiwgeT1cXFwiYVxcXCIsIGNvbG9yPVxcXCJjOk9cXFwiKVxcbiAgICApXFxuICAgIHByaW50KFxcXCJiYiA9IFxcXCIsIGJiKVxcbiAgICBiYi5kaXNwbGF5KClcXG4gICAgcHJpbnQoXFxcImFhK2JiXFxcIiwgKGFhICsgYmIpLmRpc3BsYXkoKSlcXG4gICAgIyBDaGFydChEYXRhKGE9WzEsMiwzLDIsMiw0LDUsNSw2LDcsOCw4LDgsOCw4LDksMCwwXSkpLm1hcmtfYmFyKCkuZW5jb2RlKEF4aXMoJ2E6UScsIGJpbj1UcnVlKSx5PSdjb3VudCgpJylcXG5cXG5cXG4jIHRvZG86IHNlZSBpZiBJIGNhbiB3b3JrIHdpdGggdGhlIHJlcHIgb2YgYW4gb2JqZWN0IHRvIGdldCB0aGUgYmVoYXZpb3IgdGhhdCBhbHRhaXIgZ2V0cyBpbiBub3RlYm9va3NcXG4jIHRvZG86IGltcGxlbWVudCBhIEJpbiBvYmplY3QgdG8gc3BlY2lmaXkgbWF4Ymluc1xcblwiLFwic3JjL2xpYi9hbHRhaXIvdmVnYV9jYWxsZXIuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX2ZpbGVfXzpcXFwiL3NyYy9saWIvdmVnYV9jYWxsZXIuanNcXFwiLF9fcGFja2FnZV9fOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCxyZW5kZXJfZ3JhcGg6bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzKFxcXCJyZW5kZXJfZ3JhcGhcXFwiLGFyZ3VtZW50cywxLDEpO2xldCBiPVxcXCIjXFxcIitTay5kaXZpZCtcXFwiX2dyYXBoaWNzXFxcIjt0cnl7dmVnYUVtYmVkKGIsU2suZmZpLnJlbWFwVG9KcyhhKSx7YWN0aW9uczohMH0pfWNhdGNoKGEpe3Rocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcXFwiRXJyb3IgaW4gZ3JhcGggc3BlY2lmaWNhdGlvbiB1bmFibGUgdG8gcmVuZGVyIHRoZSBncmFwaFxcXFxuXFxcIithLm1lc3NhZ2UpfX0pfTtyZXR1cm4gYX07XCIsXCJzcmMvbGliL2FudGlncmF2aXR5LnB5XCI6XCJpbXBvcnQgd2ViYnJvd3NlclxcblxcbndlYmJyb3dzZXIub3BlbihcXFwiaHR0cHM6Ly94a2NkLmNvbS8zNTMvXFxcIilcXG5cIixcInNyYy9saWIvYW55ZGJtLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhbnlkYm0gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hcnJheS5qc1wiOlwiJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fSxiPVtcXFwiY1xcXCIsXFxcImJcXFwiLFxcXCJCXFxcIixcXFwidVxcXCIsXFxcImhcXFwiLFxcXCJIXFxcIixcXFwiaVxcXCIsXFxcIklcXFwiLFxcXCJsXFxcIixcXFwiTFxcXCIsXFxcImZcXFwiLFxcXCJkXFxcIl07cmV0dXJuIGEuX19uYW1lX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhcnJheVxcXCIpLGEuYXJyYXk9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYyl7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLC0xPT1iLmluZGV4T2YoU2suZmZpLnJlbWFwVG9KcyhjKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIHR5cGVjb2RlIChtdXN0IGJlIGMsIGIsIEIsIHUsIGgsIEgsIGksIEksIGwsIEwsIGYgb3IgZClcXFwiKTtpZihkJiYhU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlXFxcIik7aWYoYS4kZC5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihcXFwidHlwZWNvZGVcXFwiKSxjKSxhLiRkLm1wJGFzc19zdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJfX21vZHVsZV9fXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhcnJheVxcXCIpKSxhLnR5cGVjb2RlPWMsdm9pZCAwPT09ZClhLmludGVybmFsSXRlcmFibGU9bmV3IFNrLmJ1aWx0aW4ubGlzdDtlbHNlIGlmKGQgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3QpYS5pbnRlcm5hbEl0ZXJhYmxlPWQ7ZWxzZSBmb3IoYS5pbnRlcm5hbEl0ZXJhYmxlPW5ldyBTay5idWlsdGluLmxpc3QsaXRlcj1Tay5hYnN0ci5pdGVyKGQpLGl0ZW09aXRlci50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWl0ZW07aXRlbT1pdGVyLnRwJGl0ZXJuZXh0KCkpU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuaW50ZXJuYWxJdGVyYWJsZS5hcHBlbmQsW2EuaW50ZXJuYWxJdGVyYWJsZSxpdGVtXSl9KSxjLl9fcmVwcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9U2suZmZpLnJlbWFwVG9KcyhhLnR5cGVjb2RlKSxjPVxcXCJcXFwiO3JldHVybiBTay5mZmkucmVtYXBUb0pzKGEuaW50ZXJuYWxJdGVyYWJsZSkubGVuZ3RoJiYoXFxcImNcXFwiPT1Tay5mZmkucmVtYXBUb0pzKGEudHlwZWNvZGUpP2M9XFxcIiwgJ1xcXCIrU2suZmZpLnJlbWFwVG9KcyhhLmludGVybmFsSXRlcmFibGUpLmpvaW4oXFxcIlxcXCIpK1xcXCInXFxcIjpjPVxcXCIsIFxcXCIrU2suZmZpLnJlbWFwVG9KcyhTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLl9fcmVwcl9fLFthLmludGVybmFsSXRlcmFibGVdKSkpLG5ldyBTay5idWlsdGluLnN0cihcXFwiYXJyYXkoJ1xcXCIrYitcXFwiJ1xcXCIrYytcXFwiKVxcXCIpfSksYy5fX3N0cl9fPWMuX19yZXByX18sYy5fX2dldGF0dHJpYnV0ZV9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS50cCRnZXRhdHRyKGIpfSksYy5hcHBlbmQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLmFwcGVuZCxbYS5pbnRlcm5hbEl0ZXJhYmxlLGJdKSxTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLmV4dGVuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSwhU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlXFxcIik7Zm9yKGl0ZXI9U2suYWJzdHIuaXRlcihiKSxpdGVtPWl0ZXIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1pdGVtO2l0ZW09aXRlci50cCRpdGVybmV4dCgpKVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmludGVybmFsSXRlcmFibGUuYXBwZW5kLFthLmludGVybmFsSXRlcmFibGUsaXRlbV0pfSl9LFxcXCJhcnJheVxcXCIsW10pLGF9O1wiLFwic3JjL2xpYi9hc3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFzdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FzeW5jaGF0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhc3luY2hhdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FzeW5jb3JlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhc3luY29yZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2F0ZXhpdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYXRleGl0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYXVkaW9kZXYucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImF1ZGlvZGV2IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmFzZTY0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJiYXNlNjQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9iZGIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImJkYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2JpbmhleC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYmluaGV4IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmlzZWN0LnB5XCI6XCJcXFwiXFxcIlxcXCJCaXNlY3Rpb24gYWxnb3JpdGhtcy5cXFwiXFxcIlxcXCJcXG5cXG5kZWYgaW5zb3J0X3JpZ2h0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxcblxcbiAgICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSByaWdodCBvZiB0aGUgcmlnaHRtb3N0IHguXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgeCA8IGFbbWlkXTogaGkgPSBtaWRcXG4gICAgICAgIGVsc2U6IGxvID0gbWlkKzFcXG4gICAgYS5pbnNlcnQobG8sIHgpXFxuXFxuZGVmIGJpc2VjdF9yaWdodChhLCB4LCBsbz0wLCBoaT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0byBpbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIFRoZSByZXR1cm4gdmFsdWUgaSBpcyBzdWNoIHRoYXQgYWxsIGUgaW4gYVs6aV0gaGF2ZSBlIDw9IHgsIGFuZCBhbGwgZSBpblxcbiAgICBhW2k6XSBoYXZlIGUgPiB4LiAgU28gaWYgeCBhbHJlYWR5IGFwcGVhcnMgaW4gdGhlIGxpc3QsIGEuaW5zZXJ0KHgpIHdpbGxcXG4gICAgaW5zZXJ0IGp1c3QgYWZ0ZXIgdGhlIHJpZ2h0bW9zdCB4IGFscmVhZHkgdGhlcmUuXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgeCA8IGFbbWlkXTogaGkgPSBtaWRcXG4gICAgICAgIGVsc2U6IGxvID0gbWlkKzFcXG4gICAgcmV0dXJuIGxvXFxuXFxuZGVmIGluc29ydF9sZWZ0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxcblxcbiAgICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSBsZWZ0IG9mIHRoZSBsZWZ0bW9zdCB4LlxcblxcbiAgICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBsZW4oYSkpIGJvdW5kIHRoZVxcbiAgICBzbGljZSBvZiBhIHRvIGJlIHNlYXJjaGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgaWYgbG8gPCAwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKVxcbiAgICBpZiBoaSBpcyBOb25lOlxcbiAgICAgICAgaGkgPSBsZW4oYSlcXG4gICAgd2hpbGUgbG8gPCBoaTpcXG4gICAgICAgIG1pZCA9IChsbytoaSkvLzJcXG4gICAgICAgIGlmIGFbbWlkXSA8IHg6IGxvID0gbWlkKzFcXG4gICAgICAgIGVsc2U6IGhpID0gbWlkXFxuICAgIGEuaW5zZXJ0KGxvLCB4KVxcblxcblxcbmRlZiBiaXNlY3RfbGVmdChhLCB4LCBsbz0wLCBoaT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0byBpbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIFRoZSByZXR1cm4gdmFsdWUgaSBpcyBzdWNoIHRoYXQgYWxsIGUgaW4gYVs6aV0gaGF2ZSBlIDwgeCwgYW5kIGFsbCBlIGluXFxuICAgIGFbaTpdIGhhdmUgZSA+PSB4LiAgU28gaWYgeCBhbHJlYWR5IGFwcGVhcnMgaW4gdGhlIGxpc3QsIGEuaW5zZXJ0KHgpIHdpbGxcXG4gICAgaW5zZXJ0IGp1c3QgYmVmb3JlIHRoZSBsZWZ0bW9zdCB4IGFscmVhZHkgdGhlcmUuXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgYVttaWRdIDwgeDogbG8gPSBtaWQrMVxcbiAgICAgICAgZWxzZTogaGkgPSBtaWRcXG4gICAgcmV0dXJuIGxvXFxuXFxuIyBPdmVyd3JpdGUgYWJvdmUgZGVmaW5pdGlvbnMgd2l0aCBhIGZhc3QgQyBpbXBsZW1lbnRhdGlvblxcbnRyeTpcXG4gICAgZnJvbSBfYmlzZWN0IGltcG9ydCAqXFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxuXFxuIyBDcmVhdGUgYWxpYXNlc1xcbmJpc2VjdCA9IGJpc2VjdF9yaWdodFxcbmluc29ydCA9IGluc29ydF9yaWdodFxcblwiLFwic3JjL2xpYi9ic2RkYi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYnNkZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jUHJvZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY1Byb2ZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jYWxlbmRhci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY2FsZW5kYXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jZ2kucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNnaSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NnaXRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjZ2l0YiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NodW5rLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjaHVuayBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NtZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY21kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29kZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29kZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvZGVjcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29kZWNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29kZW9wLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb2Rlb3AgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb2xsZWN0aW9ucy5qc1wiOlwiZnVuY3Rpb24gJGJ1aWx0aW5tb2R1bGUoKXtjb25zdCBhPXt9O3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRNb2R1bGUoXFxcImtleXdvcmRcXFwiLCExLCEwKSxiPT4oYS5faXNrZXl3b3JkPWIuJGQuaXNrZXl3b3JkLFNrLmltcG9ydE1vZHVsZShcXFwiaXRlcnRvb2xzXFxcIiwhMSwhMCkpLGI9PihhLl9jaGFpbj1iLiRkLmNoYWluLGEuX3N0YXJtYXA9Yi4kZC5zdGFybWFwLGEuX3JlcGVhdD1iLiRkLnJlcGVhdCxTay5pbXBvcnRNb2R1bGUoXFxcIm9wZXJhdG9yXFxcIiwhMSwhMCkpLGI9PnthLl9pdGVtZ2V0dGVyPWIuJGQuaXRlbWdldHRlcn0sKCk9PmNvbGxlY3Rpb25zX21vZChhKSl9ZnVuY3Rpb24gY29sbGVjdGlvbnNfbW9kKGEpe2Z1bmN0aW9uIGNvdW50ZXJOdW1iZXJTbG90KGIpe3JldHVybiBmdW5jdGlvbihjKXtpZih2b2lkIDAhPT1jJiYhKGMgaW5zdGFuY2VvZiBhLkNvdW50ZXIpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBkPW5ldyBhLkNvdW50ZXI7cmV0dXJuIGIuY2FsbCh0aGlzLGQsYyksZH19ZnVuY3Rpb24gY291bnRlcklucGxhY2VTbG90KGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKCEoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJDb3VudGVyIFxcXCIrYStcXFwiPSBcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1xcXCIgaXMgbm90IHN1cHBvcnRlZFxcXCIpO3JldHVybiBiLmNhbGwodGhpcyxjKSx0aGlzLmtlZXAkcG9zaXRpdmUoKX19ZnVuY3Rpb24gbmFtZWR0dXBsZShiLGMsZCxsLG0pe2Z1bmN0aW9uIF9tYWtlKGEsYil7cmV0dXJuIGEucHJvdG90eXBlLnRwJG5ldyhTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShiKSl9ZnVuY3Rpb24gX2FzZGljdChhKXtjb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YS5fZmllbGRzLnYubGVuZ3RoO2MrKyliLnB1c2goYS5fZmllbGRzLnZbY10pLGIucHVzaChhLnZbY10pO3JldHVybiBuZXcgU2suYnVpbHRpbi5kaWN0KGIpfWZ1bmN0aW9uIF9yZXBsYWNlKGEsYil7YT1uZXcgU2suYnVpbHRpbi5kaWN0KGEpO2NvbnN0IGM9YS50cCRnZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihcXFwicG9wXFxcIikpLGQ9U2suYWJzdHIuZ2F0dHIoYixuZXcgU2suYnVpbHRpbi5zdHIoXFxcIl9tYWtlXFxcIikpLGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5LGY9ZShkLFtlKFNrLmJ1aWx0aW4ubWFwXyxbYyxyLGJdKV0pO2lmKGEuc3EkbGVuZ3RoKCkpe2NvbnN0IGI9YS5zayRhc2FycmF5KCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiR290IHVuZXhwZWN0ZCBmaWVsZCBuYW1lczogW1xcXCIrYi5tYXAoYT0+XFxcIidcXFwiK2EuJGpzc3RyKCkrXFxcIidcXFwiKStcXFwiXVxcXCIpfXJldHVybiBmfWlmKGI9Yi50cCRzdHIoKSxTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuX2lza2V5d29yZCxbYl0pKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW5ub3QgYmUgYSBrZXl3b3JkOiAnXFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGIpK1xcXCInXFxcIik7Y29uc3Qgbj1iLiRqc3N0cigpO2lmKGUudGVzdChuKXx8IWcudGVzdChuKXx8IW4pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgbXVzdCBiZSB2YWxpZCBpZGVudGlmaWVyczogJ1xcXCIrbitcXFwiJ1xcXCIpO2xldCBvLHA7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSlvPWMuJGpzc3RyKCkucmVwbGFjZShoLFxcXCIgXFxcIikuc3BsaXQoaiksMT09by5sZW5ndGgmJlxcXCJcXFwiPT09b1swXSYmKG89W10pLHA9by5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKTtlbHNle289W10scD1bXTtmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxiPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9YS50cCRpdGVybmV4dCgpKWI9Yi50cCRzdHIoKSxwLnB1c2goYiksby5wdXNoKGIuJGpzc3RyKCkpfWxldCBxPW5ldyBTZXQ7aWYoU2subWlzY2V2YWwuaXNUcnVlKGQpKWZvcihpPTA7aTxvLmxlbmd0aDtpKyspKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5faXNrZXl3b3JkLFtwW2ldXSkpfHxmLnRlc3Qob1tpXSl8fCFnLnRlc3Qob1tpXSl8fCFvW2ldfHxxLmhhcyhvW2ldKSkmJihvW2ldPVxcXCJfXFxcIitpLHBbaV09bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJfXFxcIitpKSkscS5hZGQob1tpXSk7ZWxzZSBmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXtpZihTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuX2lza2V5d29yZCxbcFtpXV0pKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW5ub3QgYmUgYSBrZXl3b3JkOiAnXFxcIitvW2ldK1xcXCInXFxcIik7ZWxzZSBpZihmLnRlc3Qob1tpXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiRmllbGQgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZTogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO2Vsc2UgaWYoIWcudGVzdChvW2ldKXx8IW9baV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgbXVzdCBiZSB2YWxpZCBpZGVudGlmaWVyczogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO2Vsc2UgaWYocS5oYXMob1tpXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiRW5jb3VudGVyZWQgZHVwbGljYXRlIGZpZWxkIG5hbWU6ICdcXFwiK29baV0rXFxcIidcXFwiKTtxLmFkZChvW2ldKX1jb25zdCByPW5ldyBTay5idWlsdGluLnR1cGxlKHApLHM9W107bGV0IHQ9W107aWYoIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGwpKXtpZih0PVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGwpLHQubGVuZ3RoPm8ubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiR290IG1vcmUgZGVmYXVsdCB2YWx1ZXMgdGhhbiBmaWVsZCBuYW1lc1xcXCIpO2ZvcihsZXQgYT0wLGI9cC5sZW5ndGgtdC5sZW5ndGg7YjxwLmxlbmd0aDthKyssYisrKXMucHVzaChwW2JdKSxzLnB1c2godFthXSl9Y29uc3QgdT1uZXcgU2suYnVpbHRpbi5kaWN0KHMpO19tYWtlLmNvX3Zhcm5hbWVzPVtcXFwiX2Nsc1xcXCIsXFxcIml0ZXJhYmxlXFxcIl0sX2FzZGljdC5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiXSxfcmVwbGFjZS5jb19rd2FyZ3M9MSxfcmVwbGFjZS5jb192YXJuYW1lcz1bXFxcIl9zZWxmXFxcIl07Y29uc3Qgdj17fTtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl2W3BbZV0uJG1hbmdsZWRdPW5ldyBTay5idWlsdGluLnByb3BlcnR5KG5ldyBhLl9pdGVtZ2V0dGVyKFtuZXcgU2suYnVpbHRpbi5pbnRfKGUpXSksdm9pZCAwLHZvaWQgMCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFsaWFzIGZvciBmaWVsZCBudW1iZXIgXFxcIitlKSk7cmV0dXJuIFNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3Mobix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gTmFtZWRUdXBsZSgpe30sYmFzZTpTay5idWlsdGluLnR1cGxlLHNsb3RzOnt0cCRkb2M6bitcXFwiKFxcXCIrby5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIix0cCRuZXcoYSxiKXthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJfX25ld19fXFxcIixvLGEsYix0KTtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBTay5idWlsdGluLnR1cGxlLmNhbGwoYyxhKSxjfSwkcigpe2NvbnN0IGE9dGhpcy52Lm1hcCgoYSxiKT0+b1tiXStcXFwiPVxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYS5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIil9fSxwcm90bzpPYmplY3QuYXNzaWduKHtfX21vZHVsZV9fOlNrLmJ1aWx0aW4uY2hlY2tOb25lKG0pP1NrLmdsb2JhbHMuX19uYW1lX186bSxfX3Nsb3RzX186bmV3IFNrLmJ1aWx0aW4udHVwbGUsX2ZpZWxkczpyLF9maWVsZF9kZWZhdWx0czp1LF9tYWtlOm5ldyBTay5idWlsdGluLmNsYXNzbWV0aG9kKG5ldyBTay5idWlsdGluLmZ1bmMoX21ha2UpKSxfYXNkaWN0Om5ldyBTay5idWlsdGluLmZ1bmMoX2FzZGljdCksX3JlcGxhY2U6bmV3IFNrLmJ1aWx0aW4uZnVuYyhfcmVwbGFjZSl9LHYpfSl9YS5fX2FsbF9fPW5ldyBTay5idWlsdGluLmxpc3QoW1xcXCJkZXF1ZVxcXCIsXFxcImRlZmF1bHRkaWN0XFxcIixcXFwibmFtZWR0dXBsZVxcXCIsXFxcIkNvdW50ZXJcXFwiLFxcXCJPcmRlcmVkRGljdFxcXCJdLm1hcChhPT5uZXcgU2suYnVpbHRpbi5zdHIoYSkpKSxhLmRlZmF1bHRkaWN0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZGVmYXVsdGRpY3QoYSxiKXt0aGlzLmRlZmF1bHRfZmFjdG9yeT1hLFNrLmJ1aWx0aW4uZGljdC5jYWxsKHRoaXMsYil9LGJhc2U6U2suYnVpbHRpbi5kaWN0LG1ldGhvZHM6e2NvcHk6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9fSxfX2NvcHlfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH19LF9fbWlzc2luZ19fOnskbWV0aChhKXtpZihTay5idWlsdGluLmNoZWNrTm9uZSh0aGlzLmRlZmF1bHRfZmFjdG9yeSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7ZWxzZXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmRlZmF1bHRfZmFjdG9yeSxbXSk7cmV0dXJuIHRoaXMubXAkYXNzX3N1YnNjcmlwdChhLGIpLGJ9fSwkZmxhZ3M6e09uZUFyZzohMH19fSxnZXRzZXRzOntkZWZhdWx0X2ZhY3Rvcnk6eyRnZXQoKXtyZXR1cm4gdGhpcy5kZWZhdWx0X2ZhY3Rvcnl9LCRzZXQoYSl7YT1hfHxTay5idWlsdGluLm5vbmUubm9uZSQsdGhpcy5kZWZhdWx0X2ZhY3Rvcnk9YX19fSxzbG90czp7dHAkZG9jOlxcXCJkZWZhdWx0ZGljdChkZWZhdWx0X2ZhY3RvcnlbLCAuLi5dKSAtLT4gZGljdCB3aXRoIGRlZmF1bHQgZmFjdG9yeVxcXFxuXFxcXG5UaGUgZGVmYXVsdCBmYWN0b3J5IGlzIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cyB0byBwcm9kdWNlXFxcXG5hIG5ldyB2YWx1ZSB3aGVuIGEga2V5IGlzIG5vdCBwcmVzZW50LCBpbiBfX2dldGl0ZW1fXyBvbmx5LlxcXFxuQSBkZWZhdWx0ZGljdCBjb21wYXJlcyBlcXVhbCB0byBhIGRpY3Qgd2l0aCB0aGUgc2FtZSBpdGVtcy5cXFxcbkFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGlmIHRoZXkgd2VyZVxcXFxucGFzc2VkIHRvIHRoZSBkaWN0IGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcga2V5d29yZCBhcmd1bWVudHMuXFxcXG5cXFwiLHRwJGluaXQoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTtpZih2b2lkIDA9PT1jKXRoaXMuZGVmYXVsdF9mYWN0b3J5PVNrLmJ1aWx0aW4ubm9uZS5ub25lJDtlbHNlIGlmKCFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYykmJiFTay5idWlsdGluLmNoZWNrTm9uZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGVcXFwiKTtlbHNlIHRoaXMuZGVmYXVsdF9mYWN0b3J5PWM7cmV0dXJuIFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkaW5pdC5jYWxsKHRoaXMsYSxiKX0sJHIoKXtjb25zdCBhPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5kZWZhdWx0X2ZhY3RvcnkpLGI9U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS4kci5jYWxsKHRoaXMpLnY7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiZGVmYXVsdGRpY3QoXFxcIithK1xcXCIsIFxcXCIrYitcXFwiKVxcXCIpfX0scHJvdG86eyRjb3B5KCl7Y29uc3QgYj1bXTtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKHRoaXMpLGE9PntiLnB1c2goYSksYi5wdXNoKHRoaXMubXAkc3Vic2NyaXB0KGEpKX0pLG5ldyBhLmRlZmF1bHRkaWN0KHRoaXMuZGVmYXVsdF9mYWN0b3J5LGIpfX19KSxhLkNvdW50ZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiQ291bnRlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIENvdW50ZXIoKXt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3QsU2suYnVpbHRpbi5kaWN0LmFwcGx5KHRoaXMpfSxiYXNlOlNrLmJ1aWx0aW4uZGljdCxtZXRob2RzOntlbGVtZW50czp7JGZsYWdzOntOb0FyZ3M6ITB9LCRtZXRoKCl7Y29uc3QgYj1hLl9jaGFpbi50cCRnZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihcXFwiZnJvbV9pdGVyYWJsZVxcXCIpKSxjPWEuX3N0YXJtYXAsZD1hLl9yZXBlYXQsZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXk7cmV0dXJuIGUoYixbZShjLFtkLGUodGhpcy50cCRnZXRhdHRyKHRoaXMuc3RyJGl0ZW1zKSldKV0pfX0sbW9zdF9jb21tb246eyRmbGFnczp7TmFtZWRBcmdzOltcXFwiblxcXCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSRdfSwkbWV0aChhKXtsZW5ndGg9dGhpcy5zcSRsZW5ndGgoKSxTay5idWlsdGluLmNoZWNrTm9uZShhKT9hPWxlbmd0aDooYT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhKSxhPWE+bGVuZ3RoP2xlbmd0aDowPmE/MDphKTtjb25zdCBiPXRoaXMuJGl0ZW1zKCkuc29ydCgoYyxhKT0+U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbMV0sYVsxXSxcXFwiTHRcXFwiKT8xOlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjWzFdLGFbMV0sXFxcIkd0XFxcIik/LTE6MCk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYi5zbGljZSgwLGEpLm1hcChhPT5uZXcgU2suYnVpbHRpbi50dXBsZShhKSkpfX0sdXBkYXRlOnskZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkbWV0aChhLGIpe3JldHVybiBTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcInVwZGF0ZVxcXCIsYSwwLDEpLHRoaXMuY291bnRlciR1cGRhdGUoYSxiKX19LHN1YnRyYWN0OnskZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkbWV0aChhLGIpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwic3VidHJhY3RcXFwiLGEsMCwxKTtjb25zdCBjPWFbMF07aWYodm9pZCAwIT09YylpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KWZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoYik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AoYSxjLm1wJHN1YnNjcmlwdChiKSxcXFwiU3ViXFxcIikpfWVsc2UgZm9yKGl0ZXI9U2suYWJzdHIuaXRlcihjKSxrPWl0ZXIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1rO2s9aXRlci50cCRpdGVybmV4dCgpKXtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGspO3RoaXMubXAkYXNzX3N1YnNjcmlwdChrLFNrLmFic3RyLm51bWJlckJpbk9wKGEsdGhpcy4kb25lLFxcXCJTdWJcXFwiKSl9Yj1ifHxbXTtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrPTIpe2NvbnN0IGE9bmV3IFNrLmJ1aWx0aW4uc3RyKGJbY10pLGQ9dGhpcy5tcCRzdWJzY3JpcHQoYSk7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsU2suYWJzdHIubnVtYmVyQmluT3AoZCxiW2MrMV0sXFxcIlN1YlxcXCIpKX1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19taXNzaW5nX186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHplcm99LCRmbGFnczp7T25lQXJnOiEwfX0sY29weTp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuQ291bnRlcixbdGhpc10pfSwkZmxhZ3M6e05vQXJnczohMH19fSxnZXRzZXRzOntfX2RpY3RfXzpTay5nZW5lcmljLmdldFNldERpY3R9LHNsb3RzOnt0cCRkb2M6XFxcIkRpY3Qgc3ViY2xhc3MgZm9yIGNvdW50aW5nIGhhc2hhYmxlIGl0ZW1zLiAgU29tZXRpbWVzIGNhbGxlZCBhIGJhZ1xcXFxuICAgIG9yIG11bHRpc2V0LiAgRWxlbWVudHMgYXJlIHN0b3JlZCBhcyBkaWN0aW9uYXJ5IGtleXMgYW5kIHRoZWlyIGNvdW50c1xcXFxuICAgIGFyZSBzdG9yZWQgYXMgZGljdGlvbmFyeSB2YWx1ZXMuXFxcXG5cXFxcbiAgICA+Pj4gYyA9IENvdW50ZXIoJ2FiY2RlYWJjZGFiY2FiYScpICAjIGNvdW50IGVsZW1lbnRzIGZyb20gYSBzdHJpbmdcXFxcblxcXFxuICAgID4+PiBjLm1vc3RfY29tbW9uKDMpICAgICAgICAgICAgICAgICMgdGhyZWUgbW9zdCBjb21tb24gZWxlbWVudHNcXFxcbiAgICBbKCdhJywgNSksICgnYicsIDQpLCAoJ2MnLCAzKV1cXFxcbiAgICA+Pj4gc29ydGVkKGMpICAgICAgICAgICAgICAgICAgICAgICAjIGxpc3QgYWxsIHVuaXF1ZSBlbGVtZW50c1xcXFxuICAgIFsnYScsICdiJywgJ2MnLCAnZCcsICdlJ11cXFxcbiAgICA+Pj4gJycuam9pbihzb3J0ZWQoYy5lbGVtZW50cygpKSkgICAjIGxpc3QgZWxlbWVudHMgd2l0aCByZXBldGl0aW9uc1xcXFxuICAgICdhYWFhYWJiYmJjY2NkZGUnXFxcXG4gICAgPj4+IHN1bShjLnZhbHVlcygpKSAgICAgICAgICAgICAgICAgIyB0b3RhbCBvZiBhbGwgY291bnRzXFxcXG4gICAgMTVcXFxcblxcXFxuICAgID4+PiBjWydhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgY291bnQgb2YgbGV0dGVyICdhJ1xcXFxuICAgIDVcXFxcbiAgICA+Pj4gZm9yIGVsZW0gaW4gJ3NoYXphbSc6ICAgICAgICAgICAjIHVwZGF0ZSBjb3VudHMgZnJvbSBhbiBpdGVyYWJsZVxcXFxuICAgIC4uLiAgICAgY1tlbGVtXSArPSAxICAgICAgICAgICAgICAgICMgYnkgYWRkaW5nIDEgdG8gZWFjaCBlbGVtZW50J3MgY291bnRcXFxcbiAgICA+Pj4gY1snYSddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgc2V2ZW4gJ2EnXFxcXG4gICAgN1xcXFxuICAgID4+PiBkZWwgY1snYiddICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGFsbCAnYidcXFxcbiAgICA+Pj4gY1snYiddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgemVybyAnYidcXFxcbiAgICAwXFxcXG5cXFxcbiAgICA+Pj4gZCA9IENvdW50ZXIoJ3NpbXNhbGFiaW0nKSAgICAgICAjIG1ha2UgYW5vdGhlciBjb3VudGVyXFxcXG4gICAgPj4+IGMudXBkYXRlKGQpICAgICAgICAgICAgICAgICAgICAgIyBhZGQgaW4gdGhlIHNlY29uZCBjb3VudGVyXFxcXG4gICAgPj4+IGNbJ2EnXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3cgdGhlcmUgYXJlIG5pbmUgJ2EnXFxcXG4gICAgOVxcXFxuXFxcXG4gICAgPj4+IGMuY2xlYXIoKSAgICAgICAgICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgY291bnRlclxcXFxuICAgID4+PiBjXFxcXG4gICAgQ291bnRlcigpXFxcXG5cXFxcbiAgICBOb3RlOiAgSWYgYSBjb3VudCBpcyBzZXQgdG8gemVybyBvciByZWR1Y2VkIHRvIHplcm8sIGl0IHdpbGwgcmVtYWluXFxcXG4gICAgaW4gdGhlIGNvdW50ZXIgdW50aWwgdGhlIGVudHJ5IGlzIGRlbGV0ZWQgb3IgdGhlIGNvdW50ZXIgaXMgY2xlYXJlZDpcXFxcblxcXFxuICAgID4+PiBjID0gQ291bnRlcignYWFhYmJjJylcXFxcbiAgICA+Pj4gY1snYiddIC09IDIgICAgICAgICAgICAgICAgICAgICAjIHJlZHVjZSB0aGUgY291bnQgb2YgJ2InIGJ5IHR3b1xcXFxuICAgID4+PiBjLm1vc3RfY29tbW9uKCkgICAgICAgICAgICAgICAgICMgJ2InIGlzIHN0aWxsIGluLCBidXQgaXRzIGNvdW50IGlzIHplcm9cXFxcbiAgICBbKCdhJywgMyksICgnYycsIDEpLCAoJ2InLCAwKV1cXFxcblxcXFxuXFxcIix0cCRpbml0KGEsYil7cmV0dXJuIFNrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLnRwanNfbmFtZSxhLDAsMSksdGhpcy5jb3VudGVyJHVwZGF0ZShhLGIpfSwkcigpe2NvbnN0IGE9MDx0aGlzLnNpemU/U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS4kci5jYWxsKHRoaXMpLnY6XFxcIlxcXCI7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYStcXFwiKVxcXCIpfSx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLG1wJGFzc19zdWJzY3JpcHQoYSxiKXtyZXR1cm4gdm9pZCAwPT09Yj90aGlzLm1wJGxvb2t1cChhKSYmU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5tcCRhc3Nfc3Vic2NyaXB0LmNhbGwodGhpcyxhLGIpOlNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUubXAkYXNzX3N1YnNjcmlwdC5jYWxsKHRoaXMsYSxiKX0sdHAkYXNfbnVtYmVyOiEwLG5iJHBvc2l0aXZlOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsYyl9KX0pLG5iJG5lZ2F0aXZlOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiTHRcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy4kemVybyxjLFxcXCJTdWJcXFwiKSl9KX0pLG5iJHN1YnRyYWN0OmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEsYil7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYyxkXSk9Pntjb25zdCBlPVNrLmFic3RyLm51bWJlckJpbk9wKGQsYi5tcCRzdWJzY3JpcHQoYyksXFxcIlN1YlxcXCIpO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChlLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGUpfSksYi4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pnt2b2lkIDA9PT10aGlzLm1wJGxvb2t1cChiKSYmU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiTHRcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy4kemVybyxjLFxcXCJTdWJcXFwiKSl9KX0pLG5iJGFkZDpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1Tay5hYnN0ci5udW1iZXJCaW5PcChkLGIubXAkc3Vic2NyaXB0KGMpLFxcXCJBZGRcXFwiKTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZSx0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYyxlKX0pLGIuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57dm9pZCAwPT09dGhpcy5tcCRsb29rdXAoYikmJlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChiLGMpfSl9KSxuYiRpbnBsYWNlX2FkZDpjb3VudGVySW5wbGFjZVNsb3QoXFxcIitcXFwiLGZ1bmN0aW9uKGEpe2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57Y29uc3QgYz1Tay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AodGhpcy5tcCRzdWJzY3JpcHQoYSksYixcXFwiQWRkXFxcIik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsYyl9KX0pLG5iJGlucGxhY2Vfc3VidHJhY3Q6Y291bnRlcklucGxhY2VTbG90KFxcXCItXFxcIixmdW5jdGlvbihhKXthLiRpdGVtcygpLmZvckVhY2goKFthLGJdKT0+e2NvbnN0IGM9U2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKHRoaXMubXAkc3Vic2NyaXB0KGEpLGIsXFxcIlN1YlxcXCIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChhLGMpfSl9KSxuYiRvcjpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1iLm1wJHN1YnNjcmlwdChjKSxmPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGUsXFxcIkx0XFxcIik/ZTpkO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGYpfSksYi4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pnt2b2lkIDA9PT10aGlzLm1wJGxvb2t1cChiKSYmU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsYyl9KX0pLG5iJGFuZDpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1iLm1wJHN1YnNjcmlwdChjKSxmPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGUsXFxcIkx0XFxcIik/ZDplO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGYpfSl9KSxuYiRpbnBsYWNlX2FuZDpjb3VudGVySW5wbGFjZVNsb3QoXFxcIiZcXFwiLGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57Y29uc3QgZD1hLm1wJHN1YnNjcmlwdChiKTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZCxjLFxcXCJMdFxcXCIpJiZ0aGlzLm1wJGFzc19zdWJzY3JpcHQoYixkKX0pfSksbmIkaW5wbGFjZV9vcjpjb3VudGVySW5wbGFjZVNsb3QoXFxcInxcXFwiLGZ1bmN0aW9uKGEpe2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsdGhpcy5tcCRzdWJzY3JpcHQoYSksXFxcIkd0XFxcIikmJnRoaXMubXAkYXNzX3N1YnNjcmlwdChhLGIpfSl9KSxuYiRyZWZsZWN0ZWRfYW5kOm51bGwsbmIkcmVmbGVjdGVkX29yOm51bGwsbmIkcmVmbGVjdGVkX2FkZDpudWxsLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpudWxsfSxwcm90bzp7a2VlcCRwb3NpdGl2ZSgpe3JldHVybiB0aGlzLiRpdGVtcygpLmZvckVhY2goKFthLGJdKT0+e1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLHRoaXMuJHplcm8sXFxcIkx0RVxcXCIpJiZ0aGlzLm1wJGFzc19zdWJzY3JpcHQoYSl9KSx0aGlzfSwkemVybzpuZXcgU2suYnVpbHRpbi5pbnRfKDApLCRvbmU6bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxzdHIkaXRlbXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpdGVtc1xcXCIpLGNvdW50ZXIkdXBkYXRlKGEsYil7Y29uc3QgYz1hWzBdO2lmKHZvaWQgMCE9PWMpaWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGMpKWZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoYik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AoYSx0aGlzLiRvbmUsXFxcIkFkZFxcXCIpKX1lbHNlIGlmKCF0aGlzLnNxJGxlbmd0aCgpKXRoaXMudXBkYXRlJGNvbW1vbihhLHZvaWQgMCxcXFwidXBkYXRlXFxcIik7ZWxzZSBmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxiPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9YS50cCRpdGVybmV4dCgpKXtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChiLFNrLmFic3RyLm51bWJlckJpbk9wKGEsYy5tcCRzdWJzY3JpcHQoYiksXFxcIkFkZFxcXCIpKX1pZihiJiZiLmxlbmd0aClpZighdGhpcy5zcSRsZW5ndGgoKSl0aGlzLnVwZGF0ZSRjb21tb24oW10sYixcXFwidXBkYXRlXFxcIik7ZWxzZSBmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErPTIpe2NvbnN0IGM9bmV3IFNrLmJ1aWx0aW4uc3RyKGJbYV0pLGQ9dGhpcy5tcCRzdWJzY3JpcHQoYyk7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGMsU2suYWJzdHIubnVtYmVyQmluT3AoZCxiW2ErMV0sXFxcIkFkZFxcXCIpKX1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfX0sY2xhc3NtZXRob2RzOntmcm9ta2V5czp7JG1ldGg6ZnVuY3Rpb24gZnJvbWtleXMoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJDb3VudGVyLmZyb21rZXlzKCkgaXMgdW5kZWZpbmVkLiAgVXNlIENvdW50ZXIoaXRlcmFibGUpIGluc3RlYWQuXFxcIil9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn19fX0pO2NvbnN0IGI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJvZGljdF9pdGVyYXRvclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIG9kaWN0X2l0ZXJfKGEpe3RoaXMuJGluZGV4PTAsdGhpcy4kc2VxPWEuc2skYXNhcnJheSgpLHRoaXMuJG9yaWc9YX0saXRlcm5leHQ6U2suZ2VuZXJpYy5pdGVyTmV4dFdpdGhBcnJheUNoZWNrU2l6ZSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO2EuT3JkZXJlZERpY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiT3JkZXJlZERpY3RcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBPcmRlcmVkRGljdCgpe3JldHVybiB0aGlzLm9yZGVyZWRrZXlzPVtdLFNrLmJ1aWx0aW4uZGljdC5jYWxsKHRoaXMpLHRoaXN9LGJhc2U6U2suYnVpbHRpbi5kaWN0LHNsb3RzOnt0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGluaXQoYSxiKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcIk9yZGVyZWREaWN0XFxcIixhLDAsMSksYS51bnNoaWZ0KHRoaXMpLHJlcz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy51cGRhdGUsYSxiKX0sdHAkZG9jOlxcXCJEaWN0aW9uYXJ5IHRoYXQgcmVtZW1iZXJzIGluc2VydGlvbiBvcmRlclxcXCIsJHIoKXtsZXQgYSxiO2NvbnN0IGM9W107Zm9yKGxldCBiPXRoaXMudHAkaXRlcigpLGQ9Yi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1iLnRwJGl0ZXJuZXh0KCkpYT10aGlzLm1wJHN1YnNjcmlwdChkKSx2b2lkIDA9PT1hJiYoYT1udWxsKSxjLnB1c2goXFxcIihcXFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoZCkrXFxcIiwgXFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1xcXCIpXFxcIik7cmV0dXJuIGI9Yy5qb2luKFxcXCIsIFxcXCIpLDA8Yy5sZW5ndGgmJihiPVxcXCJbXFxcIitiK1xcXCJdXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJPcmRlcmVkRGljdChcXFwiK2IrXFxcIilcXFwiKX0sdHAkcmljaGNvbXBhcmUoYixjKXtpZihcXFwiRXFcXFwiIT1jJiZcXFwiTmVcXFwiIT1jKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBkPVxcXCJFcVxcXCI9PWM7aWYoIShiIGluc3RhbmNlb2YgYS5PcmRlcmVkRGljdCkpcmV0dXJuIFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkcmljaGNvbXBhcmUuY2FsbCh0aGlzLGIsYyk7Y29uc3QgZT10aGlzLnNpemUsZj1iLnNpemU7aWYoZSE9PWYpcmV0dXJuIWQ7Zm9yKGxldCBhPXRoaXMudHAkaXRlcigpLGU9Yi50cCRpdGVyKCksZj1hLnRwJGl0ZXJuZXh0KCksZz1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWEudHAkaXRlcm5leHQoKSxnPWUudHAkaXRlcm5leHQoKSl7aWYoIVNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZixnLFxcXCJFcVxcXCIpKSlyZXR1cm4hZDtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGYpLGM9Yi5tcCRzdWJzY3JpcHQoZyk7aWYoIVNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjLFxcXCJFcVxcXCIpKSlyZXR1cm4hZH1yZXR1cm4gZH0sbXAkYXNzX3N1YnNjcmlwdChhLGIpe2lmKHZvaWQgMD09PWIpe2NvbnN0IGI9dGhpcy5wb3AkaXRlbShhKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpfWVsc2UgdGhpcy5zZXQkaXRlbShhLGIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfX0sbWV0aG9kczp7cG9wOnskZmxhZ3M6e05hbWVkQXJnczpbXFxcImtleVxcXCIsXFxcImRlZmF1bHRcXFwiXSxEZWZhdWx0czpbbnVsbF19LCRtZXRoKGEsYil7cmV0dXJuIG51bGw9PT1iP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnBvcCxbdGhpcyxhXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUucG9wLFt0aGlzLGEsYl0pfX0scG9waXRlbTp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJsYXN0XFxcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4uYm9vbC50cnVlJF19LCRtZXRoKGEpe2xldCBiLGM7aWYoIXRoaXMub3JkZXJlZGtleXMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKFxcXCJkaWN0aW9uYXJ5IGlzIGVtcHR5XFxcIik7cmV0dXJuIGI9dGhpcy5vcmRlcmVka2V5c1swXSxTay5taXNjZXZhbC5pc1RydWUoYSkmJihiPXRoaXMub3JkZXJlZGtleXNbdGhpcy5vcmRlcmVka2V5cy5sZW5ndGgtMV0pLGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucG9wLFt0aGlzLGJdKSxuZXcgU2suYnVpbHRpbi50dXBsZShbYixjXSl9fSxtb3ZlX3RvX2VuZDp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJrZXlcXFwiLFxcXCJsYXN0XFxcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4uYm9vbC50cnVlJF19LCRtZXRoKGEsYil7bGV0IGMsZD0tMTtmb3IobGV0IGU9MDtlPHRoaXMub3JkZXJlZGtleXMubGVuZ3RoO2UrKylpZihjPXRoaXMub3JkZXJlZGtleXNbZV0sYz09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkVxXFxcIikpe2Q9ZTticmVha31pZigtMSE9PWQpdGhpcy5vcmRlcmVka2V5cy5zcGxpY2UoZCwxKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO3JldHVybiBTay5taXNjZXZhbC5pc1RydWUoYik/dGhpcy5vcmRlcmVka2V5cy5wdXNoKGEpOnRoaXMub3JkZXJlZGtleXMudW5zaGlmdChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9fX0scHJvdG86e3NrJGFzYXJyYXkoKXtyZXR1cm4gdGhpcy5vcmRlcmVka2V5cy5zbGljZSgwKX0sc2V0JGl0ZW0oYSxiKXtjb25zdCBjPXRoaXMub3JkZXJlZGtleXMuaW5kZXhPZihhKTstMT09YyYmdGhpcy5vcmRlcmVka2V5cy5wdXNoKGEpLFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUuc2V0JGl0ZW0uY2FsbCh0aGlzLGEsYil9LHBvcCRpdGVtKGEpe3ZhciBiPXRoaXMub3JkZXJlZGtleXMuaW5kZXhPZihhKTtpZigtMSE9YilyZXR1cm4gdGhpcy5vcmRlcmVka2V5cy5zcGxpY2UoYiwxKSxTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnBvcCRpdGVtLmNhbGwodGhpcyxhKX19fSksYS5kZXF1ZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJjb2xsZWN0aW9ucy5kZXF1ZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGRlcXVlKGEsYixjLGQsZSl7dGhpcy5oZWFkPWN8fDAsdGhpcy50YWlsPWR8fDAsdGhpcy5tYXNrPWV8fDEsdGhpcy5tYXhsZW49Yix0aGlzLnY9YXx8WywsXX0sc2xvdHM6e3RwJGRvYzpcXFwiZGVxdWUoW2l0ZXJhYmxlWywgbWF4bGVuXV0pIC0tPiBkZXF1ZSBvYmplY3RcXFxcblxcXFxuQSBsaXN0LWxpa2Ugc2VxdWVuY2Ugb3B0aW1pemVkIGZvciBkYXRhIGFjY2Vzc2VzIG5lYXIgaXRzIGVuZHBvaW50cy5cXFwiLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYil7aWYoW2l0ZXJhYmxlLG1heGxlbl09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImRlcXVlXFxcIixbXFxcIml0ZXJhYmxlXFxcIixcXFwibWF4bGVuXFxcIl0sYSxiKSx2b2lkIDAhPT1tYXhsZW4mJiFTay5idWlsdGluLmNoZWNrTm9uZShtYXhsZW4pKWlmKG1heGxlbj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQobWF4bGVuLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixcXFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFxcXCIpLDA+bWF4bGVuKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1heGxlbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2Vsc2UgdGhpcy5tYXhsZW49bWF4bGVuO3RoaXMuJGNsZWFyKCksdm9pZCAwIT09aXRlcmFibGUmJnRoaXMuJGV4dGVuZChpdGVyYWJsZSl9LHRwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJHJpY2hjb21wYXJlKGIsYyl7dmFyIGQ9TWF0aC5tYXg7aWYodGhpcz09PWImJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYykpcmV0dXJuITA7aWYoIShiIGluc3RhbmNlb2YgYS5kZXF1ZSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGU9YixmPXRoaXMudjtiPWIudjtjb25zdCBnPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrLGg9ZS50YWlsLWUuaGVhZCZlLm1hc2s7bGV0IGosbD1kKGcsaCk7aWYoZz09PWgpZm9yKGw9MDtsPGcmJmw8aCYmKGo9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGZbdGhpcy5oZWFkK2wmdGhpcy5tYXNrXSxiW2UuaGVhZCtsJmUubWFza10sXFxcIkVxXFxcIiksISFqKTsrK2wpO2lmKGw+PWd8fGw+PWgpc3dpdGNoKGMpe2Nhc2VcXFwiTHRcXFwiOnJldHVybiBnPGg7Y2FzZVxcXCJMdEVcXFwiOnJldHVybiBnPD1oO2Nhc2VcXFwiRXFcXFwiOnJldHVybiBnPT09aDtjYXNlXFxcIk5vdEVxXFxcIjpyZXR1cm4gZyE9PWg7Y2FzZVxcXCJHdFxcXCI6cmV0dXJuIGc+aDtjYXNlXFxcIkd0RVxcXCI6cmV0dXJuIGc+PWg7fXJldHVyblxcXCJFcVxcXCIhPT1jJiYoXFxcIk5vdEVxXFxcIj09PWN8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmW3RoaXMuaGVhZCtsJnRoaXMubWFza10sYltlLmhlYWQrbCZlLm1hc2tdLGMpKX0sdHAkaXRlcigpe3JldHVybiBuZXcgYyh0aGlzKX0sJHIoKXtjb25zdCBhPVtdLGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYodGhpcy4kZW50ZXJlZF9yZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlsuLi5dXFxcIik7dGhpcy4kZW50ZXJlZF9yZXByPSEwO2ZvcihsZXQgYz0wO2M8YjtjKyspYS5wdXNoKFNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy52W3RoaXMuaGVhZCtjJnRoaXMubWFza10pKTtjb25zdCBjPVNrLmFic3RyLnR5cGVOYW1lKHRoaXMpO3JldHVybiB2b2lkIDA9PT10aGlzLm1heGxlbj8odGhpcy4kZW50ZXJlZF9yZXByPXZvaWQgMCxuZXcgU2suYnVpbHRpbi5zdHIoYytcXFwiKFtcXFwiK2EuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXFxcIiwgXFxcIikrXFxcIl0pXFxcIikpOm5ldyBTay5idWlsdGluLnN0cihjK1xcXCIoW1xcXCIrYS5maWx0ZXIoQm9vbGVhbikuam9pbihcXFwiLCBcXFwiKStcXFwiXSwgbWF4bGVuPVxcXCIrdGhpcy5tYXhsZW4rXFxcIilcXFwiKX0sdHAkYXNfbnVtYmVyOiEwLG5iJGJvb2woKXtyZXR1cm4gMCE9KHRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrKX0sdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCxzcSRjb250YWlucyhhKXtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJFcVxcXCIpKXJldHVybiEwO3JldHVybiExfSxzcSRjb25jYXQoYil7aWYoIShiIGluc3RhbmNlb2YgYS5kZXF1ZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJjYW4gb25seSBjb25jYXRlbmF0ZSBkZXF1ZSAobm90ICdcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1xcXCInKSB0byBkZXF1ZVxcXCIpO2NvbnN0IGM9dGhpcy4kY29weSgpO2ZvcihsZXQgYT1iLnRwJGl0ZXIoKSxkPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1kO2Q9YS50cCRpdGVybmV4dCgpKWMuJHB1c2goZCk7cmV0dXJuIGN9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFza30sc3EkcmVwZWF0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSxcXFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICd7dHAkbmFtZX0nXFxcIik7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzayxjPXRoaXMuJGNvcHkoKTtsZXQgZDswPj1hJiZjLiRjbGVhcigpO2ZvcihsZXQgZT0xO2U8YTtlKyspZm9yKGxldCBhPTA7YTxiO2ErKylkPXRoaXMuaGVhZCthJnRoaXMubWFzayxjLiRwdXNoKHRoaXMudltkXSk7cmV0dXJuIGN9LG1wJHN1YnNjcmlwdChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYoYT49Ynx8YTwtYil0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2VcXFwiKTtjb25zdCBjPSgwPD1hP3RoaXMuaGVhZDp0aGlzLnRhaWwpK2EmdGhpcy5tYXNrO3JldHVybiB0aGlzLnZbY119LG1wJGFzc19zdWJzY3JpcHQoYSxiKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpO2NvbnN0IGM9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYoYT49Y3x8YTwtYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2VcXFwiKTt2b2lkIDA9PT1iP3RoaXMuZGVsJGl0ZW0oYSk6dGhpcy5zZXQkaXRlbShhLGIpfSxuYiRpbnBsYWNlX2FkZChhKXtmb3IodGhpcy5tYXhsZW49dm9pZCAwLGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2goaSk7cmV0dXJuIHRoaXN9LG5iJGlucGxhY2VfbXVsdGlwbHkoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IsXFxcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAne3RwJG5hbWV9J1xcXCIpLDA+PWEmJnRoaXMuJGNsZWFyKCk7Y29uc3QgYj10aGlzLiRjb3B5KCksYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztmb3IobGV0IGQ9MTtkPGE7ZCsrKWZvcihsZXQgYT0wO2E8YzthKyspe2NvbnN0IGM9dGhpcy5oZWFkK2EmdGhpcy5tYXNrO2IuJHB1c2godGhpcy52W2NdKX1yZXR1cm4gdGhpcy52PWIudix0aGlzLmhlYWQ9Yi5oZWFkLHRoaXMudGFpbD1iLnRhaWwsdGhpcy5tYXNrPWIubWFzayx0aGlzfX0sbWV0aG9kczp7YXBwZW5kOnskbWV0aChhKXtyZXR1cm4gdGhpcy4kcHVzaChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkFkZCBhbiBlbGVtZW50IHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZS5cXFwifSxhcHBlbmRsZWZ0OnskbWV0aChhKXtyZXR1cm4gdGhpcy4kcHVzaExlZnQoYSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJBZGQgYW4gZWxlbWVudCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZS5cXFwifSxjbGVhcjp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY2xlYXIoKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgZGVxdWUuXFxcIn0sX19jb3B5X186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgZGVxdWUuXFxcIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS5cXFwifSxjb3VudDp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztsZXQgYz0wO2ZvcihsZXQgZD0wO2Q8YjtkKyspU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMudlt0aGlzLmhlYWQrZCZ0aGlzLm1hc2tdLGEsXFxcIkVxXFxcIikmJmMrKztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5jb3VudCh2YWx1ZSkgLT4gaW50ZWdlciAtLSByZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHZhbHVlXFxcIn0sZXh0ZW5kOnskbWV0aChhKXtyZXR1cm4gdGhpcy4kZXh0ZW5kKGEpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRXh0ZW5kIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZSB3aXRoIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlXFxcIn0sZXh0ZW5kbGVmdDp7JG1ldGgoYSl7Zm9yKGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2hMZWZ0KGkpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkV4dGVuZCB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZSB3aXRoIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlXFxcIn0saW5kZXg6eyRtZXRoKGEsYixjKXtjb25zdCBkPXRoaXMuJGluZGV4KGEsYixjKTtpZih2b2lkIDAhPT1kKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGQpO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcXFwiIGlzIG5vdCBpbiBkZXF1ZVxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5pbmRleCh2YWx1ZSwgW3N0YXJ0LCBbc3RvcF1dKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZS5cXFxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cXFwifSxpbnNlcnQ6eyRtZXRoKGEsYil7YT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhLFxcXCJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3Qge3RwJG5hbWV9XFxcIik7Y29uc3QgYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztpZih2b2lkIDAhPT10aGlzLm1heGxlbiYmYz49dGhpcy5tYXhsZW4pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwiZGVxdWUgYWxyZWFkeSBhdCBpdHMgbWF4aW11bSBzaXplXFxcIik7YT5jJiYoYT1jKSxhPD0tYyYmKGE9MCk7Y29uc3QgZD0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzaztsZXQgZT10aGlzLnRhaWw7Zm9yKHRoaXMudGFpbD10aGlzLnRhaWwrMSZ0aGlzLm1hc2s7ZSE9PWQ7KXtjb25zdCBhPWUtMSZ0aGlzLm1hc2s7dGhpcy52W2VdPXRoaXMudlthXSxlPWF9cmV0dXJuIHRoaXMudltkXT1iLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5pbnNlcnQoaW5kZXgsIG9iamVjdCkgLS0gaW5zZXJ0IG9iamVjdCBiZWZvcmUgaW5kZXhcXFwifSxwb3A6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHBvcCgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZW1vdmUgYW5kIHJldHVybiB0aGUgcmlnaHRtb3N0IGVsZW1lbnQuXFxcIn0scG9wbGVmdDp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kcG9wTGVmdCgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZW1vdmUgYW5kIHJldHVybiB0aGUgbGVmdG1vc3QgZWxlbWVudC5cXFwifSxyZW1vdmU6eyRtZXRoKGEpe2NvbnN0IGI9dGhpcy4kaW5kZXgoYSk7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXFxcIiBpcyBub3QgaW4gZGVxdWVcXFwiKTtjb25zdCBjPXRoaXMuaGVhZCtiJnRoaXMubWFzaztmb3IobGV0IGI9YztiIT09dGhpcy50YWlsOyl7Y29uc3QgYT1iKzEmdGhpcy5tYXNrO3RoaXMudltiXT10aGlzLnZbYV0sYj1hfXRoaXMudGFpbD10aGlzLnRhaWwtMSZ0aGlzLm1hc2s7dmFyIGQ9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7ZDx0aGlzLm1hc2s+Pj4xJiZ0aGlzLiRyZXNpemUoZCx0aGlzLnYubGVuZ3RoPj4+MSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkQucmVtb3ZlKHZhbHVlKSAtLSByZW1vdmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB2YWx1ZS5cXFwifSxfX3JldmVyc2VkX186eyRtZXRoKCl7cmV0dXJuIG5ldyBkKHRoaXMpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELl9fcmV2ZXJzZWRfXygpIC0tIHJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWVcXFwifSxyZXZlcnNlOnskbWV0aCgpe2NvbnN0IGM9dGhpcy5oZWFkLGQ9dGhpcy50YWlsLGU9dGhpcy5tYXNrLGY9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7Zm9yKGxldCBnPTA7Zzx+fihmLzIpO2crKyl7Y29uc3QgZj1kLWctMSZlLGE9YytnJmUsYj10aGlzLnZbZl07dGhpcy52W2ZdPXRoaXMudlthXSx0aGlzLnZbYV09Yn1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELnJldmVyc2UoKSAtLSByZXZlcnNlICpJTiBQTEFDRSpcXFwifSxyb3RhdGU6eyRtZXRoKGEpe2E9dm9pZCAwPT09YT8xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Y29uc3QgYz10aGlzLmhlYWQsZD10aGlzLnRhaWw7aWYoMD09PWF8fGM9PT1kKXJldHVybiB0aGlzO2lmKHRoaXMuaGVhZD1jLWEmdGhpcy5tYXNrLHRoaXMudGFpbD1kLWEmdGhpcy5tYXNrLDA8YSlmb3IobGV0IGU9MTtlPD1hO2UrKyl7Y29uc3QgZj1jLWUmdGhpcy5tYXNrLGE9ZC1lJnRoaXMubWFzazt0aGlzLnZbZl09dGhpcy52W2FdLHRoaXMudlthXT12b2lkIDB9ZWxzZSBmb3IobGV0IGU9MDtlPmE7ZS0tKXtjb25zdCBmPWQtZSZ0aGlzLm1hc2ssYT1jLWUmdGhpcy5tYXNrO3RoaXMudltmXT10aGlzLnZbYV0sdGhpcy52W2FdPXZvaWQgMH1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUm90YXRlIHRoZSBkZXF1ZSBuIHN0ZXBzIHRvIHRoZSByaWdodCAoZGVmYXVsdCBuPTEpLiAgSWYgbiBpcyBuZWdhdGl2ZSwgcm90YXRlcyBsZWZ0LlxcXCJ9fSxnZXRzZXRzOnttYXhsZW46eyRnZXQoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5tYXhsZW4/U2suYnVpbHRpbi5ub25lLm5vbmUkOm5ldyBTay5idWlsdGluLmludF8odGhpcy5tYXhsZW4pfSwkZG9jOlxcXCJtYXhpbXVtIHNpemUgb2YgYSBkZXF1ZSBvciBOb25lIGlmIHVuYm91bmRlZFxcXCJ9fSxwcm90bzp7JGNsZWFyKCl7dGhpcy5oZWFkPTAsdGhpcy50YWlsPTAsdGhpcy5tYXNrPTEsdGhpcy52PVssLF19LCRjb3B5KCl7cmV0dXJuIG5ldyBhLmRlcXVlKHRoaXMudi5zbGljZSgwKSx0aGlzLm1heGxlbix0aGlzLmhlYWQsdGhpcy50YWlsLHRoaXMubWFzayl9LCRleHRlbmQoYSl7Zm9yKGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2goaSl9LHNldCRpdGVtKGEsYil7Y29uc3QgYz0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzazt0aGlzLnZbY109Yn0sZGVsJGl0ZW0oYSl7Y29uc3QgYj0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzaztmb3IobGV0IGM9YjtjIT09dGhpcy50YWlsOyl7Y29uc3QgYT1jKzEmdGhpcy5tYXNrO3RoaXMudltjXT10aGlzLnZbYV0sYz1hfWNvbnN0IGM9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7dGhpcy50YWlsPXRoaXMudGFpbC0xJnRoaXMubWFzayxjPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShjLHRoaXMudi5sZW5ndGg+Pj4xKX0sJHB1c2goYSl7dGhpcy52W3RoaXMudGFpbF09YSx0aGlzLnRhaWw9dGhpcy50YWlsKzEmdGhpcy5tYXNrLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSk7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gdm9pZCAwIT09dGhpcy5tYXhsZW4mJmI+dGhpcy5tYXhsZW4mJnRoaXMuJHBvcExlZnQoKSx0aGlzfSwkcHVzaExlZnQoYSl7dGhpcy5oZWFkPXRoaXMuaGVhZC0xJnRoaXMubWFzayx0aGlzLnZbdGhpcy5oZWFkXT1hLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSk7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gdm9pZCAwIT09dGhpcy5tYXhsZW4mJmI+dGhpcy5tYXhsZW4mJnRoaXMuJHBvcCgpLHRoaXN9LCRwb3AoKXtpZih0aGlzLmhlYWQ9PT10aGlzLnRhaWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwicG9wIGZyb20gYW4gZW1wdHkgZGVxdWVcXFwiKTt0aGlzLnRhaWw9dGhpcy50YWlsLTEmdGhpcy5tYXNrO2NvbnN0IGE9dGhpcy52W3RoaXMudGFpbF07dGhpcy52W3RoaXMudGFpbF09dm9pZCAwO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7cmV0dXJuIGI8dGhpcy5tYXNrPj4+MSYmdGhpcy4kcmVzaXplKGIsdGhpcy52Lmxlbmd0aD4+PjEpLGF9LCRwb3BMZWZ0KCl7aWYodGhpcy5oZWFkPT09dGhpcy50YWlsKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXFxcInBvcCBmcm9tIGFuIGVtcHR5IGRlcXVlXFxcIik7Y29uc3QgYT10aGlzLnZbdGhpcy5oZWFkXTt0aGlzLnZbdGhpcy5oZWFkXT12b2lkIDAsdGhpcy5oZWFkPXRoaXMuaGVhZCsxJnRoaXMubWFzaztjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO3JldHVybiBiPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShiLHRoaXMudi5sZW5ndGg+Pj4xKSxhfSwkcmVzaXplKGEsYil7Y29uc3QgYz10aGlzLmhlYWQsZD10aGlzLm1hc2s7aWYodGhpcy5oZWFkPTAsdGhpcy50YWlsPWEsdGhpcy5tYXNrPWItMSwwPT09YylyZXR1cm4gdm9pZCh0aGlzLnYubGVuZ3RoPWIpO2NvbnN0IGU9QXJyYXkoYik7Zm9yKGxldCBmPTA7ZjxhO2YrKyllW2ZdPXRoaXMudltjK2YmZF07dGhpcy52PWV9LCRpbmRleChhLGIsYyl7Y29uc3QgZD10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztiPXZvaWQgMD09PWI/MDpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKSxjPWM9PT12b2lkIDA/ZDpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhjKTtjb25zdCBlPXRoaXMuaGVhZCxmPXRoaXMubWFzayxnPXRoaXMudixoPTA8PWI/YjpiPC1kPzA6ZCtiO2M9MDw9Yz9jOmM8LWQ/MDpkK2M7Zm9yKGxldCBkPWg7ZDxjO2QrKylpZihnW2UrZCZmXT09PWEpcmV0dXJuIGR9LHNrJGFzYXJyYXkoKXtjb25zdCBhPVtdLGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7Zm9yKGxldCBjPTA7YzxiOysrYyl7Y29uc3QgYj10aGlzLmhlYWQrYyZ0aGlzLm1hc2s7YS5wdXNoKHRoaXMudltiXSl9cmV0dXJuIGF9fX0pO2NvbnN0IGM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJfY29sbGVjdGlvbnMuX2RlcXVlX2l0ZXJhdG9yXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gX2RlcXVlX2l0ZXJhdG9yKGEpe3RoaXMuJGluZGV4PTAsdGhpcy5kcT1hLnYsdGhpcy4kbGVuZ3RoPWEudGFpbC1hLmhlYWQmYS5tYXNrLHRoaXMuJGhlYWQ9YS5oZWFkLHRoaXMuJHRhaWw9YS50YWlsLHRoaXMuJG1hc2s9YS5tYXNrfSxpdGVybmV4dCgpe2lmKCEodGhpcy4kaW5kZXg+PXRoaXMuJGxlbmd0aCkpe2NvbnN0IGE9KDA8PXRoaXMuJGluZGV4P3RoaXMuJGhlYWQ6dGhpcy4kdGFpbCkrdGhpcy4kaW5kZXgmdGhpcy4kbWFzaztyZXR1cm4gdGhpcy4kaW5kZXgrKyx0aGlzLmRxW2FdfX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOnskbWV0aDpmdW5jdGlvbiBfX2xlbmd0aF9oaW50X18oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRsZW5ndGgtdGhpcy4kaW5kZXgpfSwkZmxhZ3M6e05vQXJnczohMH19fX0pLGQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJfY29sbGVjdGlvbnMuX2RlcXVlX3JldmVyc2VfaXRlcmF0b3JcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBfZGVxdWVfcmV2ZXJzZV9pdGVyYXRvcihhKXt0aGlzLiRpbmRleD0oYS50YWlsLWEuaGVhZCZhLm1hc2spLTEsdGhpcy5kcT1hLnYsdGhpcy4kaGVhZD1hLmhlYWQsdGhpcy4kbWFzaz1hLm1hc2t9LGl0ZXJuZXh0KCl7aWYoISgwPnRoaXMuJGluZGV4KSl7Y29uc3QgYT10aGlzLiRoZWFkK3RoaXMuJGluZGV4JnRoaXMuJG1hc2s7cmV0dXJuIHRoaXMuJGluZGV4LS0sdGhpcy5kcVthXX19LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZn19KSxlPW5ldyBSZWdFeHAoL15bMC05XS4qLyksZj1uZXcgUmVnRXhwKC9eWzAtOV9dLiovKSxnPW5ldyBSZWdFeHAoL15cXFxcdyokLyksaD0vLC9nLGo9L1xcXFxzKy87cmV0dXJuIG5hbWVkdHVwbGUuY29fYXJnY291bnQ9MixuYW1lZHR1cGxlLmNvX2t3b25seWFyZ2NvdW50PTMsbmFtZWR0dXBsZS4ka3dkZWZzPVtTay5idWlsdGluLmJvb2wuZmFsc2UkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdLG5hbWVkdHVwbGUuY29fdmFybmFtZXM9W1xcXCJ0eXBlbmFtZVxcXCIsXFxcImZpZWxkX25hbWVzXFxcIixcXFwicmVuYW1lXFxcIixcXFwiZGVmYXVsdHNcXFwiLFxcXCJtb2R1bGVcXFwiXSxhLm5hbWVkdHVwbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhuYW1lZHR1cGxlKSxhfVwiLFwic3JjL2xpYi9jb2xvcnN5cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29sb3JzeXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb21tYW5kcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29tbWFuZHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb21waWxlYWxsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21waWxlYWxsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29tcGlsZXIvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbXBpbGVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29uZmlnL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb25maWcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb250ZXh0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb250ZXh0bGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29va2llbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb29raWVsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb3B5LnB5XCI6XCJcXFwiXFxcIlxcXCJcXG5UaGlzIGZpbGUgd2FzIG1vZGlmaWVkIGZyb20gQ1B5dGhvbi5cXG5Db3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsXFxuMjAxMSwgMjAxMiwgMjAxMywgMjAxNCwgMjAxNSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjsgQWxsIFJpZ2h0cyBSZXNlcnZlZFxcblxcXCJcXFwiXFxcIlxcbmltcG9ydCB0eXBlc1xcbmNsYXNzIEVycm9yKEV4Y2VwdGlvbik6XFxuICAgIHBhc3NcXG5lcnJvciA9IEVycm9yIFxcbmNsYXNzIF9FbXB0eUNsYXNzOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBsb25nXFxuZXhjZXB0IE5hbWVFcnJvcjpcXG4gICAgbG9uZyA9IGludFxcblxcbmRlZiBjb3B5KHgpOlxcbiAgICBjbHMgPSB0eXBlKHgpXFxuICAgIGlmIGNhbGxhYmxlKHgpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgY29waWVyID0gZ2V0YXR0cihjbHMsIFxcXCJfX2NvcHlfX1xcXCIsIE5vbmUpXFxuICAgIGlmIGNvcGllcjpcXG4gICAgICAgIHJldHVybiBjb3BpZXIoeClcXG4gICAgaWYgY2xzIGluICh0eXBlKE5vbmUpLCBpbnQsIGZsb2F0LCBib29sLCBzdHIsIHR1cGxlLCB0eXBlLCBmcm96ZW5zZXQsIGxvbmcpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgaWYgKGNscyA9PSBsaXN0KSBvciAoY2xzID09IGRpY3QpIG9yIChjbHMgPT0gc2V0KSBvciAoY2xzID09IHNsaWNlKTpcXG4gICAgICAgIHJldHVybiBjbHMoeClcXG4gICAgdHJ5OlxcbiAgICAgICAgZ2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX2dldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgc2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX3NldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgaW5pdGFyZ3MgPSBnZXRhdHRyKHgsIFxcXCJfX2dldGluaXRhcmdzX19cXFwiLCBOb25lKVxcbiAgICBleGNlcHQ6XFxuICAgICAgICByZWR1Y3RvciA9IEZhbHNlXFxuICAgIGlmIGdldHN0YXRlIG9yIHNldHN0YXRlIG9yIGluaXRhcmdzOlxcbiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU2t1bHB0IGRvZXMgbm90IHlldCBzdXBwb3J0IGNvcHlpbmcgd2l0aCB1c2VyLWRlZmluZWQgX19nZXRzdGF0ZV9fLCBfX3NldHN0YXRlX18gb3IgX19nZXRpbml0YXJnc19fKClcXFwiKVxcbiAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgXFxcIl9fcmVkdWNlX2V4X19cXFwiLCBOb25lKVxcbiAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgIHJ2ID0gcmVkdWN0b3IoNClcXG4gICAgZWxzZTpcXG4gICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfX1xcXCIsIE5vbmUpXFxuICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICBydiA9IHJlZHVjdG9yKClcXG4gICAgICAgIGVsaWYgc3RyKGNscylbMTo2XSA9PSBcXFwiY2xhc3NcXFwiOlxcbiAgICAgICAgICAgIGNvcGllciA9IF9jb3B5X2luc3RcXG4gICAgICAgICAgICByZXR1cm4gY29waWVyKHgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEVycm9yKFxcXCJ1bihzaGFsbG93KWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzXFxcIiAlIGNscylcXG4gICAgaWYgaXNpbnN0YW5jZShydiwgc3RyKTpcXG4gICAgICAgIHJldHVybiB4XFxuICAgIHJldHVybiBfcmVjb25zdHJ1Y3QoeCwgcnYsIDApXFxuXFxuZGVmIF9jb3B5X2luc3QoeCk6XFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fY29weV9fJyk6XFxuICAgICAgICByZXR1cm4geC5fX2NvcHlfXygpXFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0aW5pdGFyZ3NfXycpOlxcbiAgICAgICAgYXJncyA9IHguX19nZXRpbml0YXJnc19fKClcXG4gICAgICAgIHkgPSB4Ll9fY2xhc3NfXygqYXJncylcXG4gICAgZWxzZTpcXG4gICAgICAgIHkgPSBfRW1wdHlDbGFzcygpXFxuICAgICAgICB5Ll9fY2xhc3NfXyA9IHguX19jbGFzc19fXFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0c3RhdGVfXycpOlxcbiAgICAgICAgc3RhdGUgPSB4Ll9fZ2V0c3RhdGVfXygpXFxuICAgIGVsc2U6XFxuICAgICAgICBzdGF0ZSA9IHguX19kaWN0X19cXG4gICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6XFxuICAgICAgICB5Ll9fc2V0c3RhdGVfXyhzdGF0ZSlcXG4gICAgZWxzZTpcXG4gICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKVxcbiAgICByZXR1cm4geVxcblxcbmQgPSBfZGVlcGNvcHlfZGlzcGF0Y2ggPSB7fVxcblxcbmRlZiBkZWVwY29weSh4LCBtZW1vPU5vbmUsIF9uaWw9W10pOlxcbiAgICBcXFwiXFxcIlxcXCJEZWVwIGNvcHkgb3BlcmF0aW9uIG9uIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy5cXG4gICAgU2VlIHRoZSBtb2R1bGUncyBfX2RvY19fIHN0cmluZyBmb3IgbW9yZSBpbmZvLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgaWYgbWVtbyBpcyBOb25lOlxcbiAgICAgICAgbWVtbyA9IHt9XFxuICAgIGlkeCA9IGlkKHgpXFxuICAgIHkgPSBtZW1vLmdldChpZHgsIF9uaWwpXFxuICAgIGlmIHkgaXMgbm90IF9uaWw6XFxuICAgICAgICByZXR1cm4geVxcbiAgICBjbHMgPSB0eXBlKHgpXFxuICAgIHRyeTpcXG4gICAgICAgIGdldHN0YXRlID0gZ2V0YXR0cih4LCBcXFwiX19nZXRzdGF0ZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIHNldHN0YXRlID0gZ2V0YXR0cih4LCBcXFwiX19zZXRzdGF0ZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIGluaXRhcmdzID0gZ2V0YXR0cih4LCBcXFwiX19nZXRpbml0YXJnc19fXFxcIiwgTm9uZSlcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmVkdWN0b3IgPSBGYWxzZVxcbiAgICBpZiBnZXRzdGF0ZSBvciBzZXRzdGF0ZSBvciBpbml0YXJnczpcXG4gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNrdWxwdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBjb3B5aW5nIHdpdGggdXNlci1kZWZpbmVkIF9fZ2V0c3RhdGVfXywgX19zZXRzdGF0ZV9fIG9yIF9fZ2V0aW5pdGFyZ3NfXygpXFxcIilcXG4gICAgY29waWVyID0gX2RlZXBjb3B5X2Rpc3BhdGNoLmdldChjbHMpXFxuICAgIGlmIGNvcGllcjpcXG4gICAgICAgIHkgPSBjb3BpZXIoeCwgbWVtbylcXG4gICAgZWxpZiBzdHIoY2xzKVsxOjZdID09IFxcXCJjbGFzc1xcXCI6XFxuICAgICAgICBjb3BpZXIgPSBfZGVlcGNvcHlfZGlzcGF0Y2hbXFxcIkluc3RhbmNlVHlwZVxcXCJdXFxuICAgICAgICB5ID0gY29waWVyKHgsIG1lbW8pXFxuICAgIGVsc2U6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgaXNzYyA9IGlzc3ViY2xhc3MoY2xzLCB0eXBlKVxcbiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogIyBjbHMgaXMgbm90IGEgY2xhc3MgKG9sZCBCb29zdDsgc2VlIFNGICM1MDIwODUpXFxuICAgICAgICAgICAgaXNzYyA9IDBcXG4gICAgICAgIGlmIGlzc2M6XFxuICAgICAgICAgICAgeSA9IF9kZWVwY29weV9hdG9taWMoeCwgbWVtbylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgY29waWVyID0gZ2V0YXR0cih4LCBcXFwiX19kZWVwY29weV9fXFxcIiwgTm9uZSlcXG4gICAgICAgICAgICBpZiBjb3BpZXI6XFxuICAgICAgICAgICAgICAgIHkgPSBjb3BpZXIobWVtbylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgXFxcIl9fcmVkdWNlX2V4X19cXFwiLCBOb25lKVxcbiAgICAgICAgICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICAgICAgICAgIHJ2ID0gcmVkdWN0b3IoMilcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfX1xcXCIsIE5vbmUpXFxuICAgICAgICAgICAgICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICAgICAgICAgICAgICBydiA9IHJlZHVjdG9yKClcXG4gICAgICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1bihkZWVwKWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzXFxcIiAlIGNscylcXG4gICAgICAgICAgICAgICAgeSA9IF9yZWNvbnN0cnVjdCh4LCBydiwgMSwgbWVtbylcXG4gICAgbWVtb1tpZHhdID0geVxcbiAgICBfa2VlcF9hbGl2ZSh4LCBtZW1vKSAjIE1ha2Ugc3VyZSB4IGxpdmVzIGF0IGxlYXN0IGFzIGxvbmcgYXMgZFxcbiAgICByZXR1cm4geVxcblxcbmRlZiBfZGVlcGNvcHlfYXRvbWljKHgsIG1lbW8pOlxcbiAgICByZXR1cm4geFxcbmRbdHlwZShOb25lKV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW3R5cGUoRWxsaXBzaXMpXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW3R5cGUoTm90SW1wbGVtZW50ZWQpXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2ludF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtmbG9hdF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtib29sXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2NvbXBsZXhdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZFtieXRlc10gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtzdHJdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgdHJ5OlxcbiMgZFt0eXBlcy5Db2RlVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuIyAgIHBhc3NcXG5kW3R5cGVdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZFt0eXBlcy5CdWlsdGluRnVuY3Rpb25UeXBlXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW3R5cGVzLkZ1bmN0aW9uVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW3dlYWtyZWYucmVmXSA9IF9kZWVwY29weV9hdG9taWNcXG5cXG5kZWYgX2RlZXBjb3B5X2xpc3QoeCwgbWVtbyk6XFxuICAgIHkgPSBbXVxcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgZm9yIGEgaW4geDpcXG4gICAgICAgIHkuYXBwZW5kKGRlZXBjb3B5KGEsIG1lbW8pKVxcbiAgICByZXR1cm4geVxcbmRbbGlzdF0gPSBfZGVlcGNvcHlfbGlzdFxcblxcbmRlZiBfZGVlcGNvcHlfc2V0KHgsIG1lbW8pOlxcbiAgICByZXN1bHQgPSBzZXQoW10pICAjIG1ha2UgZW1wdHkgc2V0XFxuICAgIG1lbW9baWQoeCldID0gcmVzdWx0ICAjIHJlZ2lzdGVyIHRoaXMgc2V0IGluIHRoZSBtZW1vIGZvciBsb29wIGNoZWNraW5nXFxuICAgIGZvciBhIGluIHg6ICAgIyBnbyB0aHJvdWdoIGVsZW1lbnRzIG9mIHNldFxcbiAgICAgICAgcmVzdWx0LmFkZChkZWVwY29weShhLCBtZW1vKSkgICMgYWRkIHRoZSBjb3BpZWQgZWxlbWVudHMgaW50byB0aGUgbmV3IHNldFxcbiAgICByZXR1cm4gcmVzdWx0ICMgcmV0dXJuIHRoZSBuZXcgc2V0XFxuZFtzZXRdID0gX2RlZXBjb3B5X3NldFxcblxcbmRlZiBfZGVlcGNvcHlfZnJvemVuc2V0KHgsIG1lbW8pOlxcbiAgICByZXN1bHQgPSBmcm96ZW5zZXQoX2RlZXBjb3B5X3NldCh4LG1lbW8pKSBcXG4gICAgbWVtb1tpZCh4KV0gPSByZXN1bHQgXFxuICAgIHJldHVybiByZXN1bHRcXG5kW2Zyb3plbnNldF0gPSBfZGVlcGNvcHlfZnJvemVuc2V0XFxuXFxuZGVmIF9kZWVwY29weV90dXBsZSh4LCBtZW1vKTpcXG4gICAgeSA9IFtkZWVwY29weShhLCBtZW1vKSBmb3IgYSBpbiB4XVxcbiAgICAjIFdlJ3JlIG5vdCBnb2luZyB0byBwdXQgdGhlIHR1cGxlIGluIHRoZSBtZW1vLCBidXQgaXQncyBzdGlsbCBpbXBvcnRhbnQgd2VcXG4gICAgIyBjaGVjayBmb3IgaXQsIGluIGNhc2UgdGhlIHR1cGxlIGNvbnRhaW5zIHJlY3Vyc2l2ZSBtdXRhYmxlIHN0cnVjdHVyZXMuXFxuICAgIHRyeTpcXG4gICAgICAgIHJldHVybiBtZW1vW2lkKHgpXVxcbiAgICBleGNlcHQgS2V5RXJyb3I6XFxuICAgICAgICBwYXNzXFxuICAgIGZvciBrLCBqIGluIHppcCh4LCB5KTpcXG4gICAgICAgIGlmIGsgaXMgbm90IGo6XFxuICAgICAgICAgICAgeSA9IHR1cGxlKHkpXFxuICAgICAgICAgICAgYnJlYWtcXG4gICAgZWxzZTpcXG4gICAgICAgIHkgPSB4XFxuICAgIHJldHVybiB5XFxuZFt0dXBsZV0gPSBfZGVlcGNvcHlfdHVwbGVcXG5cXG5kZWYgX2RlZXBjb3B5X2RpY3QoeCwgbWVtbyk6XFxuICAgIHkgPSB7fVxcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgZm9yIGtleSwgdmFsdWUgaW4geC5pdGVtcygpOlxcbiAgICAgICAgeVtkZWVwY29weShrZXksIG1lbW8pXSA9IGRlZXBjb3B5KHZhbHVlLCBtZW1vKVxcbiAgICByZXR1cm4geVxcbmRbZGljdF0gPSBfZGVlcGNvcHlfZGljdFxcblxcbiMgZGVmIF9kZWVwY29weV9tZXRob2QoeCwgbWVtbyk6ICMgQ29weSBpbnN0YW5jZSBtZXRob2RzXFxuIyAgICAgeSA9IHR5cGUoeCkoeC5pbV9mdW5jLCBkZWVwY29weSh4LmltX3NlbGYsIG1lbW8pLCB4LmltX2NsYXNzKTtcXG4jICAgICByZXR1cm4geVxcbmRbdHlwZXMuTWV0aG9kVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuXFxuZGVmIF9kZWVwY29weV9pbnN0KHgsIG1lbW8pOlxcbiAgICBpZiBoYXNhdHRyKHgsICdfX2RlZXBjb3B5X18nKTpcXG4gICAgICAgICByZXR1cm4geC5fX2RlZXBjb3B5X18obWVtbylcXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRpbml0YXJnc19fJyk6XFxuICAgICAgICBhcmdzID0geC5fX2dldGluaXRhcmdzX18oKVxcbiAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pXFxuICAgICAgICB5ID0geC5fX2NsYXNzX18oKmFyZ3MpXFxuICAgIGVsc2U6XFxuICAgICAgICB5ID0gX0VtcHR5Q2xhc3MoKVxcbiAgICAgICAgeS5fX2NsYXNzX18gPSB4Ll9fY2xhc3NfX1xcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRzdGF0ZV9fJyk6XFxuICAgICAgICBzdGF0ZSA9IHguX19nZXRzdGF0ZV9fKClcXG4gICAgZWxzZTpcXG4gICAgICAgIHN0YXRlID0geC5fX2RpY3RfX1xcbiAgICBzdGF0ZSA9IGRlZXBjb3B5KHN0YXRlLCBtZW1vKVxcbiAgICBpZiBoYXNhdHRyKHksICdfX3NldHN0YXRlX18nKTpcXG4gICAgICAgIHkuX19zZXRzdGF0ZV9fKHN0YXRlKVxcbiAgICBlbHNlOlxcbiAgICAgICAgeS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpXFxuICAgICAgICByZXR1cm4geVxcbmRbXFxcIkluc3RhbmNlVHlwZVxcXCJdID0gX2RlZXBjb3B5X2luc3RcXG5cXG5kZWYgX2tlZXBfYWxpdmUoeCwgbWVtbyk6XFxuICAgIFxcXCJcXFwiXFxcIktlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgeCBpbiB0aGUgbWVtby5cXG4gICAgQmVjYXVzZSB3ZSByZW1lbWJlciBvYmplY3RzIGJ5IHRoZWlyIGlkLCB3ZSBoYXZlXFxuICAgIHRvIGFzc3VyZSB0aGF0IHBvc3NpYmx5IHRlbXBvcmFyeSBvYmplY3RzIGFyZSBrZXB0XFxuICAgIGFsaXZlIGJ5IHJlZmVyZW5jaW5nIHRoZW0uXFxuICAgIFdlIHN0b3JlIGEgcmVmZXJlbmNlIGF0IHRoZSBpZCBvZiB0aGUgbWVtbywgd2hpY2ggc2hvdWxkXFxuICAgIG5vcm1hbGx5IG5vdCBiZSB1c2VkIHVubGVzcyBzb21lb25lIHRyaWVzIHRvIGRlZXBjb3B5XFxuICAgIHRoZSBtZW1vIGl0c2VsZi4uLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdHJ5OlxcbiAgICAgICAgbWVtb1tpZChtZW1vKV0uYXBwZW5kKHgpXFxuICAgIGV4Y2VwdCBLZXlFcnJvcjpcXG4gICAgICAgICMgYWhhLCB0aGlzIGlzIHRoZSBmaXJzdCBvbmUgOi0pXFxuICAgICAgICBtZW1vW2lkKG1lbW8pXT1beF1cXG5cXG5kZWYgX3JlY29uc3RydWN0KHgsIGluZm8sIGRlZXAsIG1lbW89Tm9uZSk6XFxuICAgIGlmIGlzaW5zdGFuY2UoaW5mbywgc3RyKTpcXG4gICAgICAgIHJldHVybiB4XFxuICAgIGFzc2VydCBpc2luc3RhbmNlKGluZm8sIHR1cGxlKVxcbiAgICBpZiBtZW1vIGlzIE5vbmU6XFxuICAgICAgICBtZW1vID0ge31cXG4gICAgbiA9IGxlbihpbmZvKVxcbiAgICBhc3NlcnQgbiBpbiAoMiwgMywgNCwgNSlcXG4gICAgY2FsbGFibGUsIGFyZ3MgPSBpbmZvWzoyXVxcbiAgICBpZiBuID4gMjpcXG4gICAgICAgIHN0YXRlID0gaW5mb1syXVxcbiAgICBlbHNlOlxcbiAgICAgICAgc3RhdGUgPSBOb25lXFxuICAgIGlmIG4gPiAzOlxcbiAgICAgICAgbGlzdGl0ZXIgPSBpbmZvWzNdXFxuICAgIGVsc2U6XFxuICAgICAgICBsaXN0aXRlciA9IE5vbmVcXG4gICAgaWYgbiA+IDQ6XFxuICAgICAgICBkaWN0aXRlciA9IGluZm9bNF1cXG4gICAgZWxzZTpcXG4gICAgICAgIGRpY3RpdGVyID0gTm9uZVxcbiAgICBpZiBkZWVwOlxcbiAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pXFxuICAgIHkgPSBjYWxsYWJsZSgqYXJncylcXG4gICAgbWVtb1tpZCh4KV0gPSB5XFxuXFxuICAgIGlmIHN0YXRlIGlzIG5vdCBOb25lOlxcbiAgICAgICAgaWYgZGVlcDpcXG4gICAgICAgICAgICBzdGF0ZSA9IGRlZXBjb3B5KHN0YXRlLCBtZW1vKVxcbiAgICAgICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6XFxuICAgICAgICAgICAgeS5fX3NldHN0YXRlX18oc3RhdGUpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RhdGUsIHR1cGxlKSBhbmQgbGVuKHN0YXRlKSA9PSAyOlxcbiAgICAgICAgICAgICAgICBzdGF0ZSwgc2xvdHN0YXRlID0gc3RhdGVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzbG90c3RhdGUgPSBOb25lXFxuICAgICAgICAgICAgaWYgc3RhdGUgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKVxcbiAgICAgICAgICAgIGlmIHNsb3RzdGF0ZSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2xvdHN0YXRlLml0ZW1zKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHksIGtleSwgdmFsdWUpXFxuXFxuICAgIGlmIGxpc3RpdGVyIGlzIG5vdCBOb25lOlxcbiAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdGl0ZXI6XFxuICAgICAgICAgICAgaWYgZGVlcDpcXG4gICAgICAgICAgICAgICAgaXRlbSA9IGRlZXBjb3B5KGl0ZW0sIG1lbW8pXFxuICAgICAgICAgICAgeS5hcHBlbmQoaXRlbSlcXG4gICAgaWYgZGljdGl0ZXIgaXMgbm90IE5vbmU6XFxuICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aXRlcjpcXG4gICAgICAgICAgICBpZiBkZWVwOlxcbiAgICAgICAgICAgICAgICBrZXkgPSBkZWVwY29weShrZXksIG1lbW8pXFxuICAgICAgICAgICAgICAgIHZhbHVlID0gZGVlcGNvcHkodmFsdWUsIG1lbW8pXFxuICAgICAgICAgICAgeVtrZXldID0gdmFsdWVcXG4gICAgcmV0dXJuIHlcXG5cXG5kZWwgZFxcblxcbmRlbCB0eXBlc1xcblxcbiMgSGVscGVyIGZvciBpbnN0YW5jZSBjcmVhdGlvbiB3aXRob3V0IGNhbGxpbmcgX19pbml0X19cXG5jbGFzcyBfRW1wdHlDbGFzczpcXG4gICAgcGFzc1wiLFwic3JjL2xpYi9jb3B5X3JlZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29weV9yZWcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jc3YucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNzdiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2N0eXBlcy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY3R5cGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWNob2xpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2N1cnNlcy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY3Vyc2VzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGF0ZXRpbWUucHlcIjpcIlxcXCJcXFwiXFxcIkNvbmNyZXRlIGRhdGUvdGltZSBhbmQgcmVsYXRlZCB0eXBlcyAtLSBwcm90b3R5cGUgaW1wbGVtZW50ZWQgaW4gUHl0aG9uLlxcblxcblNlZSBodHRwOi8vd3d3LnpvcGUub3JnL01lbWJlcnMvZmRyYWtlL0RhdGVUaW1lV2lraS9Gcm9udFBhZ2VcXG5cXG5TZWUgYWxzbyBodHRwOi8vZGlyLnlhaG9vLmNvbS9SZWZlcmVuY2UvY2FsZW5kYXJzL1xcblxcbkZvciBhIHByaW1lciBvbiBEU1QsIGluY2x1ZGluZyBtYW55IGN1cnJlbnQgRFNUIHJ1bGVzLCBzZWVcXG5odHRwOi8vd2ViZXhoaWJpdHMub3JnL2RheWxpZ2h0c2F2aW5nL1xcblxcbkZvciBtb3JlIGFib3V0IERTVCB0aGFuIHlvdSBldmVyIHdhbnRlZCB0byBrbm93LCBzZWVcXG5mdHA6Ly9lbHNpZS5uY2kubmloLmdvdi9wdWIvXFxuXFxuU291cmNlcyBmb3IgdGltZSB6b25lIGFuZCBEU1QgZGF0YTogaHR0cDovL3d3dy50d2luc3VuLmNvbS90ei90ei1saW5rLmh0bVxcblxcblRoaXMgd2FzIG9yaWdpbmFsbHkgY29waWVkIGZyb20gdGhlIHNhbmRib3ggb2YgdGhlIENQeXRob24gQ1ZTIHJlcG9zaXRvcnkuXFxuVGhhbmtzIHRvIFRpbSBQZXRlcnMgZm9yIHN1Z2dlc3RpbmcgdXNpbmcgaXQuXFxuXFxuVGhpcyB3YXMgdGhlbiBjb3BpZWQgZnJvbSBQeVB5IHY1LjEuMCBpbnRvIFNrdWxwdCBieSBNZXJlZHlkZCBMdWZmLCByZW1vdmluZ1xcbidmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uJyAoYW5kIHJlcGxhY2luZyBkaXZpc2lvbiBvcGVyYXRvcnMgYWNjb3JkaW5nbHkpXFxuYW5kIHBpY2tsZSBzdXBwb3J0ICh3aGljaCByZXF1aXJlcyAnc3RydWN0Jywgd2hpY2ggU2t1bHB0IGRvZXMgbm90IGN1cnJlbnRseVxcblthcyBvZiAzMS84LzIwMTZdIGhhdmUpXFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IHRpbWUgYXMgX3RpbWVcXG5pbXBvcnQgbWF0aCBhcyBfbWF0aFxcblxcbiMgUHl0aG9uIDItdnMtMyBjb21wYXQgaGFja1xcbmltcG9ydCBzeXNcXG51bmljb2RlID0gdW5pY29kZSBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsKSBlbHNlIHN0clxcblxcbl9TRU5USU5FTCA9IG9iamVjdCgpXFxuXFxuZGVmIF9jbXAoeCwgeSk6XFxuICAgIHJldHVybiAwIGlmIHggPT0geSBlbHNlIDEgaWYgeCA+IHkgZWxzZSAtMVxcblxcbmRlZiBfcm91bmQoeCk6XFxuICAgIHJldHVybiBpbnQoX21hdGguZmxvb3IoeCArIDAuNSkgaWYgeCA+PSAwLjAgZWxzZSBfbWF0aC5jZWlsKHggLSAwLjUpKVxcblxcbk1JTllFQVIgPSAxXFxuTUFYWUVBUiA9IDk5OTlcXG5fTUlOWUVBUkZNVCA9IDE5MDBcXG5cXG5fTUFYX0RFTFRBX0RBWVMgPSA5OTk5OTk5OTlcXG5cXG4jIFV0aWxpdHkgZnVuY3Rpb25zLCBhZGFwdGVkIGZyb20gUHl0aG9uJ3MgRGVtby9jbGFzc2VzL0RhdGVzLnB5LCB3aGljaFxcbiMgYWxzbyBhc3N1bWVzIHRoZSBjdXJyZW50IEdyZWdvcmlhbiBjYWxlbmRhciBpbmRlZmluaXRlbHkgZXh0ZW5kZWQgaW5cXG4jIGJvdGggZGlyZWN0aW9ucy4gIERpZmZlcmVuY2U6ICBEYXRlcy5weSBjYWxscyBKYW51YXJ5IDEgb2YgeWVhciAwIGRheVxcbiMgbnVtYmVyIDEuICBUaGUgY29kZSBoZXJlIGNhbGxzIEphbnVhcnkgMSBvZiB5ZWFyIDEgZGF5IG51bWJlciAxLiAgVGhpcyBpc1xcbiMgdG8gbWF0Y2ggdGhlIGRlZmluaXRpb24gb2YgdGhlIFxcXCJwcm9sZXB0aWMgR3JlZ29yaWFuXFxcIiBjYWxlbmRhciBpbiBEZXJzaG93aXR6XFxuIyBhbmQgUmVpbmdvbGQncyBcXFwiQ2FsZW5kcmljYWwgQ2FsY3VsYXRpb25zXFxcIiwgd2hlcmUgaXQncyB0aGUgYmFzZSBjYWxlbmRhclxcbiMgZm9yIGFsbCBjb21wdXRhdGlvbnMuICBTZWUgdGhlIGJvb2sgZm9yIGFsZ29yaXRobXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlblxcbiMgcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFscyBhbmQgbWFueSBvdGhlciBjYWxlbmRhciBzeXN0ZW1zLlxcblxcbl9EQVlTX0lOX01PTlRIID0gWy0xLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXVxcblxcbl9EQVlTX0JFRk9SRV9NT05USCA9IFstMV1cXG5kYm0gPSAwXFxuZm9yIGRpbSBpbiBfREFZU19JTl9NT05USFsxOl06XFxuICAgIF9EQVlTX0JFRk9SRV9NT05USC5hcHBlbmQoZGJtKVxcbiAgICBkYm0gKz0gZGltXFxuZGVsIGRibSwgZGltXFxuXFxuZGVmIF9pc19sZWFwKHllYXIpOlxcbiAgICBcXFwieWVhciAtPiAxIGlmIGxlYXAgeWVhciwgZWxzZSAwLlxcXCJcXG4gICAgcmV0dXJuIHllYXIgJSA0ID09IDAgYW5kICh5ZWFyICUgMTAwICE9IDAgb3IgeWVhciAlIDQwMCA9PSAwKVxcblxcbmRlZiBfZGF5c19iZWZvcmVfeWVhcih5ZWFyKTpcXG4gICAgXFxcInllYXIgLT4gbnVtYmVyIG9mIGRheXMgYmVmb3JlIEphbnVhcnkgMXN0IG9mIHllYXIuXFxcIlxcbiAgICB5ID0geWVhciAtIDFcXG4gICAgcmV0dXJuIHkqMzY1ICsgeS8vNCAtIHkvLzEwMCArIHkvLzQwMFxcblxcbmRlZiBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aCk6XFxuICAgIFxcXCJ5ZWFyLCBtb250aCAtPiBudW1iZXIgb2YgZGF5cyBpbiB0aGF0IG1vbnRoIGluIHRoYXQgeWVhci5cXFwiXFxuICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyLCBtb250aFxcbiAgICBpZiBtb250aCA9PSAyIGFuZCBfaXNfbGVhcCh5ZWFyKTpcXG4gICAgICAgIHJldHVybiAyOVxcbiAgICByZXR1cm4gX0RBWVNfSU5fTU9OVEhbbW9udGhdXFxuXFxuZGVmIF9kYXlzX2JlZm9yZV9tb250aCh5ZWFyLCBtb250aCk6XFxuICAgIFxcXCJ5ZWFyLCBtb250aCAtPiBudW1iZXIgb2YgZGF5cyBpbiB5ZWFyIHByZWNlZGluZyBmaXJzdCBkYXkgb2YgbW9udGguXFxcIlxcbiAgICBhc3NlcnQgMSA8PSBtb250aCA8PSAxMiwgJ21vbnRoIG11c3QgYmUgaW4gMS4uMTInXFxuICAgIHJldHVybiBfREFZU19CRUZPUkVfTU9OVEhbbW9udGhdICsgKG1vbnRoID4gMiBhbmQgX2lzX2xlYXAoeWVhcikpXFxuXFxuZGVmIF95bWQyb3JkKHllYXIsIG1vbnRoLCBkYXkpOlxcbiAgICBcXFwieWVhciwgbW9udGgsIGRheSAtPiBvcmRpbmFsLCBjb25zaWRlcmluZyAwMS1KYW4tMDAwMSBhcyBkYXkgMS5cXFwiXFxuICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyLCAnbW9udGggbXVzdCBiZSBpbiAxLi4xMidcXG4gICAgZGltID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgIGFzc2VydCAxIDw9IGRheSA8PSBkaW0sICgnZGF5IG11c3QgYmUgaW4gMS4uJWQnICUgZGltKVxcbiAgICByZXR1cm4gKF9kYXlzX2JlZm9yZV95ZWFyKHllYXIpICtcXG4gICAgICAgICAgICBfZGF5c19iZWZvcmVfbW9udGgoeWVhciwgbW9udGgpICtcXG4gICAgICAgICAgICBkYXkpXFxuXFxuX0RJNDAwWSA9IF9kYXlzX2JlZm9yZV95ZWFyKDQwMSkgICAgIyBudW1iZXIgb2YgZGF5cyBpbiA0MDAgeWVhcnNcXG5fREkxMDBZID0gX2RheXNfYmVmb3JlX3llYXIoMTAxKSAgICAjICAgIFxcXCIgICAgXFxcIiAgIFxcXCIgICBcXFwiIDEwMCAgIFxcXCJcXG5fREk0WSAgID0gX2RheXNfYmVmb3JlX3llYXIoNSkgICAgICAjICAgIFxcXCIgICAgXFxcIiAgIFxcXCIgICBcXFwiICAgNCAgIFxcXCJcXG5cXG4jIEEgNC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZCBnZXQgZnJvbSBwYXN0aW5nXFxuIyB0b2dldGhlciA0IHNpbmdsZSB5ZWFycy5cXG5hc3NlcnQgX0RJNFkgPT0gNCAqIDM2NSArIDFcXG5cXG4jIFNpbWlsYXJseSwgYSA0MDAteWVhciBjeWNsZSBoYXMgYW4gZXh0cmEgbGVhcCBkYXkgb3ZlciB3aGF0IHdlJ2QgZ2V0IGZyb21cXG4jIHBhc3RpbmcgdG9nZXRoZXIgNCAxMDAteWVhciBjeWNsZXMuXFxuYXNzZXJ0IF9ESTQwMFkgPT0gNCAqIF9ESTEwMFkgKyAxXFxuXFxuIyBPVE9ILCBhIDEwMC15ZWFyIGN5Y2xlIGhhcyBvbmUgZmV3ZXIgbGVhcCBkYXkgdGhhbiB3ZSdkIGdldCBmcm9tXFxuIyBwYXN0aW5nIHRvZ2V0aGVyIDI1IDQteWVhciBjeWNsZXMuXFxuYXNzZXJ0IF9ESTEwMFkgPT0gMjUgKiBfREk0WSAtIDFcXG5cXG5fVVNfUEVSX1VTID0gMVxcbl9VU19QRVJfTVMgPSAxMDAwXFxuX1VTX1BFUl9TRUNPTkQgPSAxMDAwMDAwXFxuX1VTX1BFUl9NSU5VVEUgPSA2MDAwMDAwMFxcbl9TRUNPTkRTX1BFUl9EQVkgPSAyNCAqIDM2MDBcXG5fVVNfUEVSX0hPVVIgPSAzNjAwMDAwMDAwXFxuX1VTX1BFUl9EQVkgPSA4NjQwMDAwMDAwMFxcbl9VU19QRVJfV0VFSyA9IDYwNDgwMDAwMDAwMFxcblxcbmRlZiBfb3JkMnltZChuKTpcXG4gICAgXFxcIm9yZGluYWwgLT4gKHllYXIsIG1vbnRoLCBkYXkpLCBjb25zaWRlcmluZyAwMS1KYW4tMDAwMSBhcyBkYXkgMS5cXFwiXFxuXFxuICAgICMgbiBpcyBhIDEtYmFzZWQgaW5kZXgsIHN0YXJ0aW5nIGF0IDEtSmFuLTEuICBUaGUgcGF0dGVybiBvZiBsZWFwIHllYXJzXFxuICAgICMgcmVwZWF0cyBleGFjdGx5IGV2ZXJ5IDQwMCB5ZWFycy4gIFRoZSBiYXNpYyBzdHJhdGVneSBpcyB0byBmaW5kIHRoZVxcbiAgICAjIGNsb3Nlc3QgNDAwLXllYXIgYm91bmRhcnkgYXQgb3IgYmVmb3JlIG4sIHRoZW4gd29yayB3aXRoIHRoZSBvZmZzZXRcXG4gICAgIyBmcm9tIHRoYXQgYm91bmRhcnkgdG8gbi4gIExpZmUgaXMgbXVjaCBjbGVhcmVyIGlmIHdlIHN1YnRyYWN0IDEgZnJvbVxcbiAgICAjIG4gZmlyc3QgLS0gdGhlbiB0aGUgdmFsdWVzIG9mIG4gYXQgNDAwLXllYXIgYm91bmRhcmllcyBhcmUgZXhhY3RseVxcbiAgICAjIHRob3NlIGRpdmlzaWJsZSBieSBfREk0MDBZOlxcbiAgICAjXFxuICAgICMgICAgIEQgIE0gICBZICAgICAgICAgICAgbiAgICAgICAgICAgICAgbi0xXFxuICAgICMgICAgIC0tIC0tLSAtLS0tICAgICAgICAtLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tXFxuICAgICMgICAgIDMxIERlYyAtNDAwICAgICAgICAtX0RJNDAwWSAgICAgICAtX0RJNDAwWSAtMVxcbiAgICAjICAgICAgMSBKYW4gLTM5OSAgICAgICAgIC1fREk0MDBZICsxICAgLV9ESTQwMFkgICAgICA0MDAteWVhciBib3VuZGFyeVxcbiAgICAjICAgICAuLi5cXG4gICAgIyAgICAgMzAgRGVjICAwMDAgICAgICAgIC0xICAgICAgICAgICAgIC0yXFxuICAgICMgICAgIDMxIERlYyAgMDAwICAgICAgICAgMCAgICAgICAgICAgICAtMVxcbiAgICAjICAgICAgMSBKYW4gIDAwMSAgICAgICAgIDEgICAgICAgICAgICAgIDAgICAgICAgICAgICA0MDAteWVhciBib3VuZGFyeVxcbiAgICAjICAgICAgMiBKYW4gIDAwMSAgICAgICAgIDIgICAgICAgICAgICAgIDFcXG4gICAgIyAgICAgIDMgSmFuICAwMDEgICAgICAgICAzICAgICAgICAgICAgICAyXFxuICAgICMgICAgIC4uLlxcbiAgICAjICAgICAzMSBEZWMgIDQwMCAgICAgICAgIF9ESTQwMFkgICAgICAgIF9ESTQwMFkgLTFcXG4gICAgIyAgICAgIDEgSmFuICA0MDEgICAgICAgICBfREk0MDBZICsxICAgICBfREk0MDBZICAgICAgNDAwLXllYXIgYm91bmRhcnlcXG4gICAgbiAtPSAxXFxuICAgIG40MDAsIG4gPSBkaXZtb2QobiwgX0RJNDAwWSlcXG4gICAgeWVhciA9IG40MDAgKiA0MDAgKyAxICAgIyAuLi4sIC0zOTksIDEsIDQwMSwgLi4uXFxuXFxuICAgICMgTm93IG4gaXMgdGhlIChub24tbmVnYXRpdmUpIG9mZnNldCwgaW4gZGF5cywgZnJvbSBKYW51YXJ5IDEgb2YgeWVhciwgdG9cXG4gICAgIyB0aGUgZGVzaXJlZCBkYXRlLiAgTm93IGNvbXB1dGUgaG93IG1hbnkgMTAwLXllYXIgY3ljbGVzIHByZWNlZGUgbi5cXG4gICAgIyBOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgbjEwMCB0byBlcXVhbCA0ISAgSW4gdGhhdCBjYXNlIDQgZnVsbFxcbiAgICAjIDEwMC15ZWFyIGN5Y2xlcyBwcmVjZWRlIHRoZSBkZXNpcmVkIGRheSwgd2hpY2ggaW1wbGllcyB0aGUgZGVzaXJlZFxcbiAgICAjIGRheSBpcyBEZWNlbWJlciAzMSBhdCB0aGUgZW5kIG9mIGEgNDAwLXllYXIgY3ljbGUuXFxuICAgIG4xMDAsIG4gPSBkaXZtb2QobiwgX0RJMTAwWSlcXG5cXG4gICAgIyBOb3cgY29tcHV0ZSBob3cgbWFueSA0LXllYXIgY3ljbGVzIHByZWNlZGUgaXQuXFxuICAgIG40LCBuID0gZGl2bW9kKG4sIF9ESTRZKVxcblxcbiAgICAjIEFuZCBub3cgaG93IG1hbnkgc2luZ2xlIHllYXJzLiAgQWdhaW4gbjEgY2FuIGJlIDQsIGFuZCBhZ2FpbiBtZWFuaW5nXFxuICAgICMgdGhhdCB0aGUgZGVzaXJlZCBkYXkgaXMgRGVjZW1iZXIgMzEgYXQgdGhlIGVuZCBvZiB0aGUgNC15ZWFyIGN5Y2xlLlxcbiAgICBuMSwgbiA9IGRpdm1vZChuLCAzNjUpXFxuXFxuICAgIHllYXIgKz0gbjEwMCAqIDEwMCArIG40ICogNCArIG4xXFxuICAgIGlmIG4xID09IDQgb3IgbjEwMCA9PSA0OlxcbiAgICAgICAgYXNzZXJ0IG4gPT0gMFxcbiAgICAgICAgcmV0dXJuIHllYXItMSwgMTIsIDMxXFxuXFxuICAgICMgTm93IHRoZSB5ZWFyIGlzIGNvcnJlY3QsIGFuZCBuIGlzIHRoZSBvZmZzZXQgZnJvbSBKYW51YXJ5IDEuICBXZSBmaW5kXFxuICAgICMgdGhlIG1vbnRoIHZpYSBhbiBlc3RpbWF0ZSB0aGF0J3MgZWl0aGVyIGV4YWN0IG9yIG9uZSB0b28gbGFyZ2UuXFxuICAgIGxlYXB5ZWFyID0gbjEgPT0gMyBhbmQgKG40ICE9IDI0IG9yIG4xMDAgPT0gMylcXG4gICAgYXNzZXJ0IGxlYXB5ZWFyID09IF9pc19sZWFwKHllYXIpXFxuICAgIG1vbnRoID0gKG4gKyA1MCkgPj4gNVxcbiAgICBwcmVjZWRpbmcgPSBfREFZU19CRUZPUkVfTU9OVEhbbW9udGhdICsgKG1vbnRoID4gMiBhbmQgbGVhcHllYXIpXFxuICAgIGlmIHByZWNlZGluZyA+IG46ICAjIGVzdGltYXRlIGlzIHRvbyBsYXJnZVxcbiAgICAgICAgbW9udGggLT0gMVxcbiAgICAgICAgcHJlY2VkaW5nIC09IF9EQVlTX0lOX01PTlRIW21vbnRoXSArIChtb250aCA9PSAyIGFuZCBsZWFweWVhcilcXG4gICAgbiAtPSBwcmVjZWRpbmdcXG4gICAgYXNzZXJ0IDAgPD0gbiA8IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcblxcbiAgICAjIE5vdyB0aGUgeWVhciBhbmQgbW9udGggYXJlIGNvcnJlY3QsIGFuZCBuIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGVcXG4gICAgIyBzdGFydCBvZiB0aGF0IG1vbnRoOiAgd2UncmUgZG9uZSFcXG4gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBuKzFcXG5cXG4jIE1vbnRoIGFuZCBkYXkgbmFtZXMuICBGb3IgbG9jYWxpemVkIHZlcnNpb25zLCBzZWUgdGhlIGNhbGVuZGFyIG1vZHVsZS5cXG5fTU9OVEhOQU1FUyA9IFtOb25lLCBcXFwiSmFuXFxcIiwgXFxcIkZlYlxcXCIsIFxcXCJNYXJcXFwiLCBcXFwiQXByXFxcIiwgXFxcIk1heVxcXCIsIFxcXCJKdW5cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgIFxcXCJKdWxcXFwiLCBcXFwiQXVnXFxcIiwgXFxcIlNlcFxcXCIsIFxcXCJPY3RcXFwiLCBcXFwiTm92XFxcIiwgXFxcIkRlY1xcXCJdXFxuX0RBWU5BTUVTID0gW05vbmUsIFxcXCJNb25cXFwiLCBcXFwiVHVlXFxcIiwgXFxcIldlZFxcXCIsIFxcXCJUaHVcXFwiLCBcXFwiRnJpXFxcIiwgXFxcIlNhdFxcXCIsIFxcXCJTdW5cXFwiXVxcblxcblxcbmRlZiBfYnVpbGRfc3RydWN0X3RpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgZHN0ZmxhZyk6XFxuICAgIHdkYXkgPSAoX3ltZDJvcmQoeSwgbSwgZCkgKyA2KSAlIDdcXG4gICAgZG51bSA9IF9kYXlzX2JlZm9yZV9tb250aCh5LCBtKSArIGRcXG4gICAgcmV0dXJuIF90aW1lLnN0cnVjdF90aW1lKCh5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZGF5LCBkbnVtLCBkc3RmbGFnKSlcXG5cXG5kZWYgX2Zvcm1hdF90aW1lKGhoLCBtbSwgc3MsIHVzKTpcXG4gICAgIyBTa2lwIHRyYWlsaW5nIG1pY3Jvc2Vjb25kcyB3aGVuIHVzPT0wLlxcbiAgICByZXN1bHQgPSBcXFwiJTAyZDolMDJkOiUwMmRcXFwiICUgKGhoLCBtbSwgc3MpXFxuICAgIGlmIHVzOlxcbiAgICAgICAgcmVzdWx0ICs9IFxcXCIuJTA2ZFxcXCIgJSB1c1xcbiAgICByZXR1cm4gcmVzdWx0XFxuXFxuIyBDb3JyZWN0bHkgc3Vic3RpdHV0ZSBmb3IgJXogYW5kICVaIGVzY2FwZXMgaW4gc3RyZnRpbWUgZm9ybWF0cy5cXG5kZWYgX3dyYXBfc3RyZnRpbWUob2JqZWN0LCBmb3JtYXQsIHRpbWV0dXBsZSk6XFxuICAgIHllYXIgPSB0aW1ldHVwbGVbMF1cXG4gICAgaWYgeWVhciA8IF9NSU5ZRUFSRk1UOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwieWVhcj0lZCBpcyBiZWZvcmUgJWQ7IHRoZSBkYXRldGltZSBzdHJmdGltZSgpIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm1ldGhvZHMgcmVxdWlyZSB5ZWFyID49ICVkXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICh5ZWFyLCBfTUlOWUVBUkZNVCwgX01JTllFQVJGTVQpKVxcbiAgICAjIERvbid0IGNhbGwgdXRjb2Zmc2V0KCkgb3IgdHpuYW1lKCkgdW5sZXNzIGFjdHVhbGx5IG5lZWRlZC5cXG4gICAgZnJlcGxhY2UgPSBOb25lICAjIHRoZSBzdHJpbmcgdG8gdXNlIGZvciAlZlxcbiAgICB6cmVwbGFjZSA9IE5vbmUgICMgdGhlIHN0cmluZyB0byB1c2UgZm9yICV6XFxuICAgIFpyZXBsYWNlID0gTm9uZSAgIyB0aGUgc3RyaW5nIHRvIHVzZSBmb3IgJVpcXG5cXG4gICAgIyBTY2FuIGZvcm1hdCBmb3IgJXogYW5kICVaIGVzY2FwZXMsIHJlcGxhY2luZyBhcyBuZWVkZWQuXFxuICAgIG5ld2Zvcm1hdCA9IFtdXFxuICAgIHB1c2ggPSBuZXdmb3JtYXQuYXBwZW5kXFxuICAgIGksIG4gPSAwLCBsZW4oZm9ybWF0KVxcbiAgICB3aGlsZSBpIDwgbjpcXG4gICAgICAgIGNoID0gZm9ybWF0W2ldXFxuICAgICAgICBpICs9IDFcXG4gICAgICAgIGlmIGNoID09ICclJzpcXG4gICAgICAgICAgICBpZiBpIDwgbjpcXG4gICAgICAgICAgICAgICAgY2ggPSBmb3JtYXRbaV1cXG4gICAgICAgICAgICAgICAgaSArPSAxXFxuICAgICAgICAgICAgICAgIGlmIGNoID09ICdmJzpcXG4gICAgICAgICAgICAgICAgICAgIGlmIGZyZXBsYWNlIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgZnJlcGxhY2UgPSAnJTA2ZCcgJSBnZXRhdHRyKG9iamVjdCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pY3Jvc2Vjb25kJywgMClcXG4gICAgICAgICAgICAgICAgICAgIG5ld2Zvcm1hdC5hcHBlbmQoZnJlcGxhY2UpXFxuICAgICAgICAgICAgICAgIGVsaWYgY2ggPT0gJ3onOlxcbiAgICAgICAgICAgICAgICAgICAgaWYgenJlcGxhY2UgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICB6cmVwbGFjZSA9IFxcXCJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsIFxcXCJfdXRjb2Zmc2V0XFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9iamVjdC5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICcrJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2Zmc2V0IDwgMDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICctJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwgbSA9IGRpdm1vZChvZmZzZXQsIDYwKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenJlcGxhY2UgPSAnJWMlMDJkJTAyZCcgJSAoc2lnbiwgaCwgbSlcXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAnJScgbm90IGluIHpyZXBsYWNlXFxuICAgICAgICAgICAgICAgICAgICBuZXdmb3JtYXQuYXBwZW5kKHpyZXBsYWNlKVxcbiAgICAgICAgICAgICAgICBlbGlmIGNoID09ICdaJzpcXG4gICAgICAgICAgICAgICAgICAgIGlmIFpyZXBsYWNlIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgWnJlcGxhY2UgPSBcXFwiXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCBcXFwidHpuYW1lXFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBvYmplY3QudHpuYW1lKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcyBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RyZnRpbWUgaXMgZ29pbmcgdG8gaGF2ZSBhdCB0aGlzOiBlc2NhcGUgJVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWnJlcGxhY2UgPSBzLnJlcGxhY2UoJyUnLCAnJSUnKVxcbiAgICAgICAgICAgICAgICAgICAgbmV3Zm9ybWF0LmFwcGVuZChacmVwbGFjZSlcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHB1c2goJyUnKVxcbiAgICAgICAgICAgICAgICAgICAgcHVzaChjaClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBwdXNoKCclJylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcHVzaChjaClcXG4gICAgbmV3Zm9ybWF0ID0gXFxcIlxcXCIuam9pbihuZXdmb3JtYXQpXFxuICAgIHJldHVybiBfdGltZS5zdHJmdGltZShuZXdmb3JtYXQsIHRpbWV0dXBsZSlcXG5cXG4jIEp1c3QgcmFpc2UgVHlwZUVycm9yIGlmIHRoZSBhcmcgaXNuJ3QgTm9uZSBvciBhIHN0cmluZy5cXG5kZWYgX2NoZWNrX3R6bmFtZShuYW1lKTpcXG4gICAgaWYgbmFtZSBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UobmFtZSwgc3RyKTpcXG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwidHppbmZvLnR6bmFtZSgpIG11c3QgcmV0dXJuIE5vbmUgb3Igc3RyaW5nLCBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm5vdCAnJXMnXFxcIiAlIHR5cGUobmFtZSkpXFxuXFxuIyBuYW1lIGlzIHRoZSBvZmZzZXQtcHJvZHVjaW5nIG1ldGhvZCwgXFxcInV0Y29mZnNldFxcXCIgb3IgXFxcImRzdFxcXCIuXFxuIyBvZmZzZXQgaXMgd2hhdCBpdCByZXR1cm5lZC5cXG4jIElmIG9mZnNldCBpc24ndCBOb25lIG9yIHRpbWVkZWx0YSwgcmFpc2VzIFR5cGVFcnJvci5cXG4jIElmIG9mZnNldCBpcyBOb25lLCByZXR1cm5zIE5vbmUuXFxuIyBFbHNlIG9mZnNldCBpcyBjaGVja2VkIGZvciBiZWluZyBpbiByYW5nZSwgYW5kIGEgd2hvbGUgIyBvZiBtaW51dGVzLlxcbiMgSWYgaXQgaXMsIGl0cyBpbnRlZ2VyIHZhbHVlIGlzIHJldHVybmVkLiAgRWxzZSBWYWx1ZUVycm9yIGlzIHJhaXNlZC5cXG5kZWYgX2NoZWNrX3V0Y19vZmZzZXQobmFtZSwgb2Zmc2V0KTpcXG4gICAgYXNzZXJ0IG5hbWUgaW4gKFxcXCJ1dGNvZmZzZXRcXFwiLCBcXFwiZHN0XFxcIilcXG4gICAgaWYgb2Zmc2V0IGlzIE5vbmU6XFxuICAgICAgICByZXR1cm5cXG4gICAgaWYgbm90IGlzaW5zdGFuY2Uob2Zmc2V0LCB0aW1lZGVsdGEpOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBOb25lIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwib3IgdGltZWRlbHRhLCBub3QgJyVzJ1xcXCIgJSAobmFtZSwgdHlwZShvZmZzZXQpKSlcXG4gICAgZGF5cyA9IG9mZnNldC5kYXlzXFxuICAgIGlmIGRheXMgPCAtMSBvciBkYXlzID4gMDpcXG4gICAgICAgIG9mZnNldCA9IDE0NDAgICMgdHJpZ2dlciBvdXQtb2YtcmFuZ2VcXG4gICAgZWxzZTpcXG4gICAgICAgIHNlY29uZHMgPSBkYXlzICogODY0MDAgKyBvZmZzZXQuc2Vjb25kc1xcbiAgICAgICAgbWludXRlcywgc2Vjb25kcyA9IGRpdm1vZChzZWNvbmRzLCA2MClcXG4gICAgICAgIGlmIHNlY29uZHMgb3Igb2Zmc2V0Lm1pY3Jvc2Vjb25kczpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBhIHdob2xlIG51bWJlciBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwib2YgbWludXRlc1xcXCIgJSBuYW1lKVxcbiAgICAgICAgb2Zmc2V0ID0gbWludXRlc1xcbiAgICBpZiBub3QgLTE0NDAgPCBvZmZzZXQgPCAxNDQwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiJXMoKT0lZCwgbXVzdCBiZSBpbiAtMTQzOS4uMTQzOVxcXCIgJSAobmFtZSwgb2Zmc2V0KSlcXG4gICAgcmV0dXJuIG9mZnNldFxcblxcbmRlZiBfY2hlY2tfaW50X2ZpZWxkKHZhbHVlKTpcXG4gICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgaW50KTpcXG4gICAgICAgIHJldHVybiBpbnQodmFsdWUpXFxuICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBmbG9hdCk6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5fX2ludF9fKClcXG4gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjpcXG4gICAgICAgICAgICBwYXNzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGludCk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpbnQodmFsdWUpXFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdfX2ludF9fIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGludGVnZXInKVxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkJylcXG4gICAgcmFpc2UgVHlwZUVycm9yKCdpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQnKVxcblxcbmRlZiBfY2hlY2tfZGF0ZV9maWVsZHMoeWVhciwgbW9udGgsIGRheSk6XFxuICAgIHllYXIgPSBfY2hlY2tfaW50X2ZpZWxkKHllYXIpXFxuICAgIG1vbnRoID0gX2NoZWNrX2ludF9maWVsZChtb250aClcXG4gICAgZGF5ID0gX2NoZWNrX2ludF9maWVsZChkYXkpXFxuICAgIGlmIG5vdCBNSU5ZRUFSIDw9IHllYXIgPD0gTUFYWUVBUjpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3llYXIgbXVzdCBiZSBpbiAlZC4uJWQnICUgKE1JTllFQVIsIE1BWFlFQVIpLCB5ZWFyKVxcbiAgICBpZiBub3QgMSA8PSBtb250aCA8PSAxMjpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21vbnRoIG11c3QgYmUgaW4gMS4uMTInLCBtb250aClcXG4gICAgZGltID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgIGlmIG5vdCAxIDw9IGRheSA8PSBkaW06XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdkYXkgbXVzdCBiZSBpbiAxLi4lZCcgJSBkaW0sIGRheSlcXG4gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBkYXlcXG5cXG5kZWYgX2NoZWNrX3RpbWVfZmllbGRzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCk6XFxuICAgIGhvdXIgPSBfY2hlY2tfaW50X2ZpZWxkKGhvdXIpXFxuICAgIG1pbnV0ZSA9IF9jaGVja19pbnRfZmllbGQobWludXRlKVxcbiAgICBzZWNvbmQgPSBfY2hlY2tfaW50X2ZpZWxkKHNlY29uZClcXG4gICAgbWljcm9zZWNvbmQgPSBfY2hlY2tfaW50X2ZpZWxkKG1pY3Jvc2Vjb25kKVxcbiAgICBpZiBub3QgMCA8PSBob3VyIDw9IDIzOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaG91ciBtdXN0IGJlIGluIDAuLjIzJywgaG91cilcXG4gICAgaWYgbm90IDAgPD0gbWludXRlIDw9IDU5OlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbWludXRlIG11c3QgYmUgaW4gMC4uNTknLCBtaW51dGUpXFxuICAgIGlmIG5vdCAwIDw9IHNlY29uZCA8PSA1OTpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3NlY29uZCBtdXN0IGJlIGluIDAuLjU5Jywgc2Vjb25kKVxcbiAgICBpZiBub3QgMCA8PSBtaWNyb3NlY29uZCA8PSA5OTk5OTk6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdtaWNyb3NlY29uZCBtdXN0IGJlIGluIDAuLjk5OTk5OScsIG1pY3Jvc2Vjb25kKVxcbiAgICByZXR1cm4gaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kXFxuXFxuZGVmIF9jaGVja190emluZm9fYXJnKHR6KTpcXG4gICAgaWYgdHogaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKHR6LCB0emluZm8pOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0emluZm8gYXJndW1lbnQgbXVzdCBiZSBOb25lIG9yIG9mIGEgdHppbmZvIHN1YmNsYXNzXFxcIilcXG5cXG5cXG4jIE5vdGVzIG9uIGNvbXBhcmlzb246ICBJbiBnZW5lcmFsLCBkYXRldGltZSBtb2R1bGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgcmFpc2VcXG4jIFR5cGVFcnJvciB3aGVuIHRoZXkgZG9uJ3Qga25vdyBob3cgdG8gZG8gYSBjb21wYXJpc29uIHRoZW1zZWxmLiAgSWYgdGhleVxcbiMgcmV0dXJuZWQgTm90SW1wbGVtZW50ZWQgaW5zdGVhZCwgY29tcGFyaXNvbiBjb3VsZCAoc2lsZW50bHkpIGZhbGwgYmFjayB0b1xcbiMgdGhlIGRlZmF1bHQgY29tcGFyZS1vYmplY3RzLWJ5LWNvbXBhcmluZy10aGVpci1tZW1vcnktYWRkcmVzc2VzIHN0cmF0ZWd5LFxcbiMgYW5kIHRoYXQncyBub3QgaGVscGZ1bC4gIFRoZXJlIGFyZSB0d28gZXhjZXB0aW9uczpcXG4jXFxuIyAxLiBGb3IgZGF0ZSBhbmQgZGF0ZXRpbWUsIGlmIHRoZSBvdGhlciBvYmplY3QgaGFzIGEgXFxcInRpbWV0dXBsZVxcXCIgYXR0cixcXG4jICAgIE5vdEltcGxlbWVudGVkIGlzIHJldHVybmVkLiAgVGhpcyBpcyBhIGhvb2sgdG8gYWxsb3cgb3RoZXIga2luZHMgb2ZcXG4jICAgIGRhdGV0aW1lLWxpa2Ugb2JqZWN0cyBhIGNoYW5jZSB0byBpbnRlcmNlcHQgdGhlIGNvbXBhcmlzb24uXFxuI1xcbiMgMi4gRWxzZSBfX2VxX18gYW5kIF9fbmVfXyByZXR1cm4gRmFsc2UgYW5kIFRydWUsIHJlc3BlY3RpdmVseS4gIFRoaXMgaXNcXG4jICAgIHNvIG9wZXJ0YWlvbnMgbGlrZVxcbiNcXG4jICAgICAgICB4ID09IHlcXG4jICAgICAgICB4ICE9IHlcXG4jICAgICAgICB4IGluIHNlcXVlbmNlXFxuIyAgICAgICAgeCBub3QgaW4gc2VxdWVuY2VcXG4jICAgICAgICBkaWN0W3hdID0geVxcbiNcXG4jICAgIGRvbid0IHJhaXNlIGFubm95aW5nIFR5cGVFcnJvcnMganVzdCBiZWNhdXNlIGEgZGF0ZXRpbWUgb2JqZWN0XFxuIyAgICBpcyBwYXJ0IG9mIGEgaGV0ZXJvZ2VuZW91cyBjb2xsZWN0aW9uLiAgSWYgdGhlcmUncyBubyBrbm93biB3YXkgdG9cXG4jICAgIGNvbXBhcmUgWCB0byBhIGRhdGV0aW1lLCBzYXlpbmcgdGhleSdyZSBub3QgZXF1YWwgaXMgcmVhc29uYWJsZS5cXG5cXG5kZWYgX2NtcGVycm9yKHgsIHkpOlxcbiAgICByYWlzZSBUeXBlRXJyb3IoXFxcImNhbid0IGNvbXBhcmUgJyVzJyB0byAnJXMnXFxcIiAlIChcXG4gICAgICAgICAgICAgICAgICAgIHR5cGUoeCkuX19uYW1lX18sIHR5cGUoeSkuX19uYW1lX18pKVxcblxcbmRlZiBfbm9ybWFsaXplX3BhaXIoaGksIGxvLCBmYWN0b3IpOlxcbiAgICBpZiBub3QgMCA8PSBsbyA8PSBmYWN0b3ItMTpcXG4gICAgICAgIGluYywgbG8gPSBkaXZtb2QobG8sIGZhY3RvcilcXG4gICAgICAgIGhpICs9IGluY1xcbiAgICByZXR1cm4gaGksIGxvXFxuXFxuZGVmIF9ub3JtYWxpemVfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIGlnbm9yZV9vdmVyZmxvdz1GYWxzZSk6XFxuICAgICMgTm9ybWFsaXplIGFsbCB0aGUgaW5wdXRzLCBhbmQgc3RvcmUgdGhlIG5vcm1hbGl6ZWQgdmFsdWVzLlxcbiAgICBzcywgdXMgPSBfbm9ybWFsaXplX3BhaXIoc3MsIHVzLCAxMDAwMDAwKVxcbiAgICBtbSwgc3MgPSBfbm9ybWFsaXplX3BhaXIobW0sIHNzLCA2MClcXG4gICAgaGgsIG1tID0gX25vcm1hbGl6ZV9wYWlyKGhoLCBtbSwgNjApXFxuICAgIGQsIGhoID0gX25vcm1hbGl6ZV9wYWlyKGQsIGhoLCAyNClcXG4gICAgeSwgbSwgZCA9IF9ub3JtYWxpemVfZGF0ZSh5LCBtLCBkLCBpZ25vcmVfb3ZlcmZsb3cpXFxuICAgIHJldHVybiB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1c1xcblxcbmRlZiBfbm9ybWFsaXplX2RhdGUoeWVhciwgbW9udGgsIGRheSwgaWdub3JlX292ZXJmbG93PUZhbHNlKTpcXG4gICAgIyBUaGF0IHdhcyBlYXN5LiAgTm93IGl0IGdldHMgbXVkZHk6ICB0aGUgcHJvcGVyIHJhbmdlIGZvciBkYXlcXG4gICAgIyBjYW4ndCBiZSBkZXRlcm1pbmVkIHdpdGhvdXQga25vd2luZyB0aGUgY29ycmVjdCBtb250aCBhbmQgeWVhcixcXG4gICAgIyBidXQgaWYgZGF5IGlzLCBlLmcuLCBwbHVzIG9yIG1pbnVzIGEgbWlsbGlvbiwgdGhlIGN1cnJlbnQgbW9udGhcXG4gICAgIyBhbmQgeWVhciB2YWx1ZXMgbWFrZSBubyBzZW5zZSAoYW5kIG1heSBhbHNvIGJlIG91dCBvZiBib3VuZHNcXG4gICAgIyB0aGVtc2VsdmVzKS5cXG4gICAgIyBTYXlpbmcgMTIgbW9udGhzID09IDEgeWVhciBzaG91bGQgYmUgbm9uLWNvbnRyb3ZlcnNpYWwuXFxuICAgIGlmIG5vdCAxIDw9IG1vbnRoIDw9IDEyOlxcbiAgICAgICAgeWVhciwgbW9udGggPSBfbm9ybWFsaXplX3BhaXIoeWVhciwgbW9udGgtMSwgMTIpXFxuICAgICAgICBtb250aCArPSAxXFxuICAgICAgICBhc3NlcnQgMSA8PSBtb250aCA8PSAxMlxcblxcbiAgICAjIE5vdyBvbmx5IGRheSBjYW4gYmUgb3V0IG9mIGJvdW5kcyAoeWVhciBtYXkgYWxzbyBiZSBvdXQgb2YgYm91bmRzXFxuICAgICMgZm9yIGEgZGF0ZXRpbWUgb2JqZWN0LCBidXQgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGF0IGhlcmUpLlxcbiAgICAjIElmIGRheSBpcyBvdXQgb2YgYm91bmRzLCB3aGF0IHRvIGRvIGlzIGFyZ3VhYmxlLCBidXQgYXQgbGVhc3QgdGhlXFxuICAgICMgbWV0aG9kIGhlcmUgaXMgcHJpbmNpcGxlZCBhbmQgZXhwbGFpbmFibGUuXFxuICAgIGRpbSA9IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcbiAgICBpZiBub3QgMSA8PSBkYXkgPD0gZGltOlxcbiAgICAgICAgIyBNb3ZlIGRheS0xIGRheXMgZnJvbSB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoLiAgRmlyc3QgdHJ5IHRvXFxuICAgICAgICAjIGdldCBvZmYgY2hlYXAgaWYgd2UncmUgb25seSBvbmUgZGF5IG91dCBvZiByYW5nZSAoYWRqdXN0bWVudHNcXG4gICAgICAgICMgZm9yIHRpbWV6b25lIGFsb25lIGNhbid0IGJlIHdvcnNlIHRoYW4gdGhhdCkuXFxuICAgICAgICBpZiBkYXkgPT0gMDogICAgIyBtb3ZlIGJhY2sgYSBkYXlcXG4gICAgICAgICAgICBtb250aCAtPSAxXFxuICAgICAgICAgICAgaWYgbW9udGggPiAwOlxcbiAgICAgICAgICAgICAgICBkYXkgPSBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0geWVhci0xLCAxMiwgMzFcXG4gICAgICAgIGVsaWYgZGF5ID09IGRpbSArIDE6ICAgICMgbW92ZSBmb3J3YXJkIGEgZGF5XFxuICAgICAgICAgICAgbW9udGggKz0gMVxcbiAgICAgICAgICAgIGRheSA9IDFcXG4gICAgICAgICAgICBpZiBtb250aCA+IDEyOlxcbiAgICAgICAgICAgICAgICBtb250aCA9IDFcXG4gICAgICAgICAgICAgICAgeWVhciArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG9yZGluYWwgPSBfeW1kMm9yZCh5ZWFyLCBtb250aCwgMSkgKyAoZGF5IC0gMSlcXG4gICAgICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gX29yZDJ5bWQob3JkaW5hbClcXG5cXG4gICAgaWYgbm90IGlnbm9yZV9vdmVyZmxvdyBhbmQgbm90IE1JTllFQVIgPD0geWVhciA8PSBNQVhZRUFSOlxcbiAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcihcXFwiZGF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2VcXFwiKVxcbiAgICByZXR1cm4geWVhciwgbW9udGgsIGRheVxcblxcbmRlZiBfYWNjdW0odGFnLCBzb2ZhciwgbnVtLCBmYWN0b3IsIGxlZnRvdmVyKTpcXG4gICAgaWYgaXNpbnN0YW5jZShudW0sIGludCk6XFxuICAgICAgICBwcm9kID0gbnVtICogZmFjdG9yXFxuICAgICAgICByc3VtID0gc29mYXIgKyBwcm9kXFxuICAgICAgICByZXR1cm4gcnN1bSwgbGVmdG92ZXJcXG4gICAgaWYgaXNpbnN0YW5jZShudW0sIGZsb2F0KTpcXG4gICAgICAgIGZyYWNwYXJ0LCBpbnRwYXJ0ID0gX21hdGgubW9kZihudW0pXFxuICAgICAgICBwcm9kID0gaW50KGludHBhcnQpICogZmFjdG9yXFxuICAgICAgICByc3VtID0gc29mYXIgKyBwcm9kXFxuICAgICAgICBpZiBmcmFjcGFydCA9PSAwLjA6XFxuICAgICAgICAgICAgcmV0dXJuIHJzdW0sIGxlZnRvdmVyXFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShmYWN0b3IsIGludClcXG4gICAgICAgIGZyYWNwYXJ0LCBpbnRwYXJ0ID0gX21hdGgubW9kZihmYWN0b3IgKiBmcmFjcGFydClcXG4gICAgICAgIHJzdW0gKz0gaW50KGludHBhcnQpXFxuICAgICAgICByZXR1cm4gcnN1bSwgbGVmdG92ZXIgKyBmcmFjcGFydFxcbiAgICByYWlzZSBUeXBlRXJyb3IoXFxcInVuc3VwcG9ydGVkIHR5cGUgZm9yIHRpbWVkZWx0YSAlcyBjb21wb25lbnQ6ICVzXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAodGFnLCB0eXBlKG51bSkpKVxcblxcbmNsYXNzIHRpbWVkZWx0YShvYmplY3QpOlxcbiAgICBcXFwiXFxcIlxcXCJSZXByZXNlbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgb2JqZWN0cy5cXG5cXG4gICAgU3VwcG9ydGVkIG9wZXJhdG9yczpcXG5cXG4gICAgLSBhZGQsIHN1YnRyYWN0IHRpbWVkZWx0YVxcbiAgICAtIHVuYXJ5IHBsdXMsIG1pbnVzLCBhYnNcXG4gICAgLSBjb21wYXJlIHRvIHRpbWVkZWx0YVxcbiAgICAtIG11bHRpcGx5LCBkaXZpZGUgYnkgaW50L2xvbmdcXG5cXG4gICAgSW4gYWRkaXRpb24sIGRhdGV0aW1lIHN1cHBvcnRzIHN1YnRyYWN0aW9uIG9mIHR3byBkYXRldGltZSBvYmplY3RzXFxuICAgIHJldHVybmluZyBhIHRpbWVkZWx0YSwgYW5kIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uIG9mIGEgZGF0ZXRpbWVcXG4gICAgYW5kIGEgdGltZWRlbHRhIGdpdmluZyBhIGRhdGV0aW1lLlxcblxcbiAgICBSZXByZXNlbnRhdGlvbjogKGRheXMsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcykuICBXaHk/ICBCZWNhdXNlIElcXG4gICAgZmVsdCBsaWtlIGl0LlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gJ19kYXlzJywgJ19zZWNvbmRzJywgJ19taWNyb3NlY29uZHMnLCAnX2hhc2hjb2RlJ1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIGRheXM9X1NFTlRJTkVMLCBzZWNvbmRzPV9TRU5USU5FTCwgbWljcm9zZWNvbmRzPV9TRU5USU5FTCxcXG4gICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzPV9TRU5USU5FTCwgbWludXRlcz1fU0VOVElORUwsIGhvdXJzPV9TRU5USU5FTCwgd2Vla3M9X1NFTlRJTkVMKTpcXG4gICAgICAgIHggPSAwXFxuICAgICAgICBsZWZ0b3ZlciA9IDAuMFxcbiAgICAgICAgaWYgbWljcm9zZWNvbmRzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcIm1pY3Jvc2Vjb25kc1xcXCIsIHgsIG1pY3Jvc2Vjb25kcywgX1VTX1BFUl9VUywgbGVmdG92ZXIpXFxuICAgICAgICBpZiBtaWxsaXNlY29uZHMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwibWlsbGlzZWNvbmRzXFxcIiwgeCwgbWlsbGlzZWNvbmRzLCBfVVNfUEVSX01TLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIHNlY29uZHMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwic2Vjb25kc1xcXCIsIHgsIHNlY29uZHMsIF9VU19QRVJfU0VDT05ELCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIG1pbnV0ZXMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwibWludXRlc1xcXCIsIHgsIG1pbnV0ZXMsIF9VU19QRVJfTUlOVVRFLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIGhvdXJzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcImhvdXJzXFxcIiwgeCwgaG91cnMsIF9VU19QRVJfSE9VUiwgbGVmdG92ZXIpXFxuICAgICAgICBpZiBkYXlzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcImRheXNcXFwiLCB4LCBkYXlzLCBfVVNfUEVSX0RBWSwgbGVmdG92ZXIpXFxuICAgICAgICBpZiB3ZWVrcyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJ3ZWVrc1xcXCIsIHgsIHdlZWtzLCBfVVNfUEVSX1dFRUssIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgbGVmdG92ZXIgIT0gMC4wOlxcbiAgICAgICAgICAgIHggKz0gX3JvdW5kKGxlZnRvdmVyKVxcbiAgICAgICAgcmV0dXJuIGNscy5fZnJvbV9taWNyb3NlY29uZHMoeClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBfZnJvbV9taWNyb3NlY29uZHMoY2xzLCB1cyk6XFxuICAgICAgICBzLCB1cyA9IGRpdm1vZCh1cywgX1VTX1BFUl9TRUNPTkQpXFxuICAgICAgICBkLCBzID0gZGl2bW9kKHMsIF9TRUNPTkRTX1BFUl9EQVkpXFxuICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGUoZCwgcywgdXMsIEZhbHNlKVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIF9jcmVhdGUoY2xzLCBkLCBzLCB1cywgbm9ybWFsaXplKTpcXG4gICAgICAgIGlmIG5vcm1hbGl6ZTpcXG4gICAgICAgICAgICBzLCB1cyA9IF9ub3JtYWxpemVfcGFpcihzLCB1cywgMTAwMDAwMClcXG4gICAgICAgICAgICBkLCBzID0gX25vcm1hbGl6ZV9wYWlyKGQsIHMsIDI0KjM2MDApXFxuXFxuICAgICAgICBpZiBub3QgLV9NQVhfREVMVEFfREFZUyA8PSBkIDw9IF9NQVhfREVMVEFfREFZUzpcXG4gICAgICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKFxcXCJkYXlzPSVkOyBtdXN0IGhhdmUgbWFnbml0dWRlIDw9ICVkXFxcIiAlIChkLCBfTUFYX0RFTFRBX0RBWVMpKVxcblxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX2RheXMgPSBkXFxuICAgICAgICBzZWxmLl9zZWNvbmRzID0gc1xcbiAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzID0gdXNcXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBfdG9fbWljcm9zZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuICgoc2VsZi5fZGF5cyAqIF9TRUNPTkRTX1BFUl9EQVkgKyBzZWxmLl9zZWNvbmRzKSAqIF9VU19QRVJfU0VDT05EICtcXG4gICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzKVxcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyB0aW1lZGVsdGEgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fbWljcm9zZWNvbmRzOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwiJXMoJWQsICVkLCAlZClcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMpXFxuICAgICAgICBpZiBzZWxmLl9zZWNvbmRzOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwiJXMoJWQsICVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcylcXG4gICAgICAgIHJldHVybiBcXFwiJXMoJWQpXFxcIiAlIChtb2R1bGUgKyBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fZGF5cylcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBtbSwgc3MgPSBkaXZtb2Qoc2VsZi5fc2Vjb25kcywgNjApXFxuICAgICAgICBoaCwgbW0gPSBkaXZtb2QobW0sIDYwKVxcbiAgICAgICAgcyA9IFxcXCIlZDolMDJkOiUwMmRcXFwiICUgKGhoLCBtbSwgc3MpXFxuICAgICAgICBpZiBzZWxmLl9kYXlzOlxcbiAgICAgICAgICAgIGRlZiBwbHVyYWwobik6XFxuICAgICAgICAgICAgICAgIHJldHVybiBuLCBhYnMobikgIT0gMSBhbmQgXFxcInNcXFwiIG9yIFxcXCJcXFwiXFxuICAgICAgICAgICAgcyA9IChcXFwiJWQgZGF5JXMsIFxcXCIgJSBwbHVyYWwoc2VsZi5fZGF5cykpICsgc1xcbiAgICAgICAgaWYgc2VsZi5fbWljcm9zZWNvbmRzOlxcbiAgICAgICAgICAgIHMgPSBzICsgXFxcIi4lMDZkXFxcIiAlIHNlbGYuX21pY3Jvc2Vjb25kc1xcbiAgICAgICAgcmV0dXJuIHNcXG5cXG4gICAgZGVmIHRvdGFsX3NlY29uZHMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUb3RhbCBzZWNvbmRzIGluIHRoZSBkdXJhdGlvbi5cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl90b19taWNyb3NlY29uZHMoKSAvIDEwLjAqKjZcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgZGF5cyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImRheXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kYXlzXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgc2Vjb25kcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcInNlY29uZHNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zZWNvbmRzXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWljcm9zZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWljcm9zZWNvbmRzXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWljcm9zZWNvbmRzXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAgICAgIyBvdXIgX19jbGFzc19fIGhlcmUsIGJ1dCBuZWVkIGEgcmVhbCB0aW1lZGVsdGFcXG4gICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoc2VsZi5fZGF5cyArIG90aGVyLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzICsgb3RoZXIuX3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcyArIG90aGVyLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpXFxuICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICAjIGZvciBDUHl0aG9uIGNvbXBhdGliaWxpdHksIHdlIGNhbm5vdCB1c2VcXG4gICAgICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZShzZWxmLl9kYXlzIC0gb3RoZXIuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgLSBvdGhlci5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzIC0gb3RoZXIuX21pY3Jvc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBkZWYgX19uZWdfXyhzZWxmKTpcXG4gICAgICAgICMgZm9yIENQeXRob24gY29tcGF0aWJpbGl0eSwgd2UgY2Fubm90IHVzZVxcbiAgICAgICAgIyBvdXIgX19jbGFzc19fIGhlcmUsIGJ1dCBuZWVkIGEgcmVhbCB0aW1lZGVsdGFcXG4gICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZSgtc2VsZi5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5fbWljcm9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpXFxuXFxuICAgIGRlZiBfX3Bvc19fKHNlbGYpOlxcbiAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fY3JlYXRlKHNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UpXFxuXFxuICAgIGRlZiBfX2Fic19fKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5fZGF5cyA8IDA6XFxuICAgICAgICAgICAgcmV0dXJuIC1zZWxmXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBfX211bF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBpbnQpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgdXNlYyA9IHNlbGYuX3RvX21pY3Jvc2Vjb25kcygpXFxuICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9mcm9tX21pY3Jvc2Vjb25kcyh1c2VjICogb3RoZXIpXFxuXFxuICAgIF9fcm11bF9fID0gX19tdWxfX1xcblxcbiAgICBkZWYgX19kaXZfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgaW50KTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIHVzZWMgPSBzZWxmLl90b19taWNyb3NlY29uZHMoKVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fZnJvbV9taWNyb3NlY29uZHModXNlYyAvLyBvdGhlcilcXG5cXG4gICAgX19mbG9vcmRpdl9fID0gX19kaXZfX1xcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIHRpbWVkZWx0YSBvYmplY3RzIHdpdGggb3RoZXIuXFxuXFxuICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA9PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPD0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX2NtcChzZWxmLCBvdGhlcik6XFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKVxcbiAgICAgICAgcmV0dXJuIF9jbXAoc2VsZi5fZ2V0c3RhdGUoKSwgb3RoZXIuX2dldHN0YXRlKCkpXFxuXFxuICAgIGRlZiBfX2hhc2hfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX2hhc2hjb2RlID09IC0xOlxcbiAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiAoc2VsZi5fZGF5cyAhPSAwIG9yXFxuICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgIT0gMCBvclxcbiAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMgIT0gMClcXG5cXG50aW1lZGVsdGEubWluID0gdGltZWRlbHRhKC1fTUFYX0RFTFRBX0RBWVMpXFxudGltZWRlbHRhLm1heCA9IHRpbWVkZWx0YShfTUFYX0RFTFRBX0RBWVMsIDI0KjM2MDAtMSwgMTAwMDAwMC0xKVxcbnRpbWVkZWx0YS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKVxcblxcbmNsYXNzIGRhdGUob2JqZWN0KTpcXG4gICAgXFxcIlxcXCJcXFwiQ29uY3JldGUgZGF0ZSB0eXBlLlxcblxcbiAgICBDb25zdHJ1Y3RvcnM6XFxuXFxuICAgIF9fbmV3X18oKVxcbiAgICBmcm9tdGltZXN0YW1wKClcXG4gICAgdG9kYXkoKVxcbiAgICBmcm9tb3JkaW5hbCgpXFxuXFxuICAgIE9wZXJhdG9yczpcXG5cXG4gICAgX19yZXByX18sIF9fc3RyX19cXG4gICAgX19jbXBfXywgX19oYXNoX19cXG4gICAgX19hZGRfXywgX19yYWRkX18sIF9fc3ViX18gKGFkZC9yYWRkIG9ubHkgd2l0aCB0aW1lZGVsdGEgYXJnKVxcblxcbiAgICBNZXRob2RzOlxcblxcbiAgICB0aW1ldHVwbGUoKVxcbiAgICB0b29yZGluYWwoKVxcbiAgICB3ZWVrZGF5KClcXG4gICAgaXNvd2Vla2RheSgpLCBpc29jYWxlbmRhcigpLCBpc29mb3JtYXQoKVxcbiAgICBjdGltZSgpXFxuICAgIHN0cmZ0aW1lKClcXG5cXG4gICAgUHJvcGVydGllcyAocmVhZG9ubHkpOlxcbiAgICB5ZWFyLCBtb250aCwgZGF5XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAnX3llYXInLCAnX21vbnRoJywgJ19kYXknLCAnX2hhc2hjb2RlJ1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIHllYXIsIG1vbnRoPU5vbmUsIGRheT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnN0cnVjdG9yLlxcblxcbiAgICAgICAgQXJndW1lbnRzOlxcblxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSAocmVxdWlyZWQsIGJhc2UgMSlcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KVxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX3llYXIgPSB5ZWFyXFxuICAgICAgICBzZWxmLl9tb250aCA9IG1vbnRoXFxuICAgICAgICBzZWxmLl9kYXkgPSBkYXlcXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICMgQWRkaXRpb25hbCBjb25zdHJ1Y3RvcnNcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBmcm9tdGltZXN0YW1wKGNscywgdCk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgZGF0ZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS5cXFwiXFxuICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZWVrZGF5LCBqZGF5LCBkc3QgPSBfdGltZS5sb2NhbHRpbWUodClcXG4gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiB0b2RheShjbHMpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGUgZnJvbSB0aW1lLnRpbWUoKS5cXFwiXFxuICAgICAgICB0ID0gX3RpbWUudGltZSgpXFxuICAgICAgICByZXR1cm4gY2xzLmZyb210aW1lc3RhbXAodClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBmcm9tb3JkaW5hbChjbHMsIG4pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29udHJ1Y3QgYSBkYXRlIGZyb20gYSBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwuXFxuXFxuICAgICAgICBKYW51YXJ5IDEgb2YgeWVhciAxIGlzIGRheSAxLiAgT25seSB0aGUgeWVhciwgbW9udGggYW5kIGRheSBhcmVcXG4gICAgICAgIG5vbi16ZXJvIGluIHRoZSByZXN1bHQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHksIG0sIGQgPSBfb3JkMnltZChuKVxcbiAgICAgICAgcmV0dXJuIGNscyh5LCBtLCBkKVxcblxcbiAgICAjIENvbnZlcnNpb25zIHRvIHN0cmluZ1xcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb252ZXJ0IHRvIGZvcm1hbCBzdHJpbmcsIGZvciByZXByKCkuXFxuXFxuICAgICAgICA+Pj4gZHQgPSBkYXRldGltZSgyMDEwLCAxLCAxKVxcbiAgICAgICAgPj4+IHJlcHIoZHQpXFxuICAgICAgICAnZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgMSwgMSwgMCwgMCknXFxuXFxuICAgICAgICA+Pj4gZHQgPSBkYXRldGltZSgyMDEwLCAxLCAxLCB0emluZm89dGltZXpvbmUudXRjKVxcbiAgICAgICAgPj4+IHJlcHIoZHQpXFxuICAgICAgICAnZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgMSwgMSwgMCwgMCwgdHppbmZvPWRhdGV0aW1lLnRpbWV6b25lLnV0YyknXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIG1vZHVsZSA9IFxcXCJkYXRldGltZS5cXFwiIGlmIHNlbGYuX19jbGFzc19fIGlzIGRhdGUgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCIlcyglZCwgJWQsICVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl95ZWFyLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbW9udGgsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXkpXFxuXFxuICAgICMgWFhYIFRoZXNlIHNob3VsZG4ndCBkZXBlbmQgb24gdGltZS5sb2NhbHRpbWUoKSwgYmVjYXVzZSB0aGF0XFxuICAgICMgY2xpcHMgdGhlIHVzYWJsZSBkYXRlcyB0byBbMTk3MCAuLiAyMDM4KS4gIEF0IGxlYXN0IGN0aW1lKCkgaXNcXG4gICAgIyBlYXNpbHkgZG9uZSB3aXRob3V0IHVzaW5nIHN0cmZ0aW1lKCkgLS0gdGhhdCdzIGJldHRlciB0b28gYmVjYXVzZVxcbiAgICAjIHN0cmZ0aW1lKFxcXCIlY1xcXCIsIC4uLikgaXMgbG9jYWxlIHNwZWNpZmljLlxcblxcbiAgICBkZWYgY3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLlxcXCJcXG4gICAgICAgIHdlZWtkYXkgPSBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuICAgICAgICByZXR1cm4gXFxcIiVzICVzICUyZCAwMDowMDowMCAlMDRkXFxcIiAlIChcXG4gICAgICAgICAgICBfREFZTkFNRVNbd2Vla2RheV0sXFxuICAgICAgICAgICAgX01PTlRITkFNRVNbc2VsZi5fbW9udGhdLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSwgc2VsZi5feWVhcilcXG5cXG4gICAgZGVmIHN0cmZ0aW1lKHNlbGYsIGZvcm1hdCk6XFxuICAgICAgICBcXFwiRm9ybWF0IHVzaW5nIHN0cmZ0aW1lKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIF93cmFwX3N0cmZ0aW1lKHNlbGYsIGZvcm1hdCwgc2VsZi50aW1ldHVwbGUoKSlcXG5cXG4gICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm10KTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZtdCwgKHN0ciwgdW5pY29kZSkpOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIl9fZm9ybWF0X18gZXhwZWN0cyBzdHIgb3IgdW5pY29kZSwgbm90ICVzXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuX19jbGFzc19fLl9fbmFtZV9fKVxcbiAgICAgICAgaWYgbGVuKGZtdCkgIT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zdHJmdGltZShmbXQpXFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYpXFxuXFxuICAgIGRlZiBpc29mb3JtYXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGRhdGUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uXFxuXFxuICAgICAgICBUaGlzIGlzICdZWVlZLU1NLUREJy5cXG5cXG4gICAgICAgIFJlZmVyZW5jZXM6XFxuICAgICAgICAtIGh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWVcXG4gICAgICAgIC0gaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L2lzby10aW1lLmh0bWxcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCIlMDRkLSUwMmQtJTAyZFxcXCIgJSAoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG5cXG4gICAgX19zdHJfXyA9IGlzb2Zvcm1hdFxcblxcbiAgICAjIFJlYWQtb25seSBmaWVsZCBhY2Nlc3NvcnNcXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB5ZWFyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwieWVhciAoMS05OTk5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3llYXJcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtb250aChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1vbnRoICgxLTEyKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21vbnRoXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgZGF5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGF5ICgxLTMxKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2RheVxcblxcbiAgICAjIFN0YW5kYXJkIGNvbnZlcnNpb25zLCBfX2NtcF9fLCBfX2hhc2hfXyAoYW5kIGhlbHBlcnMpXFxuXFxuICAgIGRlZiB0aW1ldHVwbGUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGxvY2FsIHRpbWUgdHVwbGUgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIF9idWlsZF9zdHJ1Y3RfdGltZShzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAtMSlcXG5cXG4gICAgZGVmIHRvb3JkaW5hbChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwgZm9yIHRoZSB5ZWFyLCBtb250aCBhbmQgZGF5LlxcblxcbiAgICAgICAgSmFudWFyeSAxIG9mIHllYXIgMSBpcyBkYXkgMS4gIE9ubHkgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgdmFsdWVzXFxuICAgICAgICBjb250cmlidXRlIHRvIHRoZSByZXN1bHQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBfeW1kMm9yZChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5KVxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCB5ZWFyPU5vbmUsIG1vbnRoPU5vbmUsIGRheT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBhIG5ldyBkYXRlIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB5ZWFyIGlzIE5vbmU6XFxuICAgICAgICAgICAgeWVhciA9IHNlbGYuX3llYXJcXG4gICAgICAgIGlmIG1vbnRoIGlzIE5vbmU6XFxuICAgICAgICAgICAgbW9udGggPSBzZWxmLl9tb250aFxcbiAgICAgICAgaWYgZGF5IGlzIE5vbmU6XFxuICAgICAgICAgICAgZGF5ID0gc2VsZi5fZGF5XFxuICAgICAgICByZXR1cm4gZGF0ZSh5ZWFyLCBtb250aCwgZGF5KVxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIGRhdGUgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSAhPSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG5cXG4gICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID4gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpXFxuICAgICAgICB5LCBtLCBkID0gc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheVxcbiAgICAgICAgeTIsIG0yLCBkMiA9IG90aGVyLl95ZWFyLCBvdGhlci5fbW9udGgsIG90aGVyLl9kYXlcXG4gICAgICAgIHJldHVybiBfY21wKCh5LCBtLCBkKSwgKHkyLCBtMiwgZDIpKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBcXFwiSGFzaC5cXFwiXFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goc2VsZi5fZ2V0c3RhdGUoKSlcXG4gICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZVxcblxcbiAgICAjIENvbXB1dGF0aW9uc1xcblxcbiAgICBkZWYgX2FkZF90aW1lZGVsdGEoc2VsZiwgb3RoZXIsIGZhY3Rvcik6XFxuICAgICAgICB5LCBtLCBkID0gX25vcm1hbGl6ZV9kYXRlKFxcbiAgICAgICAgICAgIHNlbGYuX3llYXIsXFxuICAgICAgICAgICAgc2VsZi5fbW9udGgsXFxuICAgICAgICAgICAgc2VsZi5fZGF5ICsgb3RoZXIuZGF5cyAqIGZhY3RvcilcXG4gICAgICAgIHJldHVybiBkYXRlKHksIG0sIGQpXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJBZGQgYSBkYXRlIHRvIGEgdGltZWRlbHRhLlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZF90aW1lZGVsdGEob3RoZXIsIDEpXFxuICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgX19yYWRkX18gPSBfX2FkZF9fXFxuXFxuICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlN1YnRyYWN0IHR3byBkYXRlcywgb3IgYSBkYXRlIGFuZCBhIHRpbWVkZWx0YS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIGRheXMxID0gc2VsZi50b29yZGluYWwoKVxcbiAgICAgICAgICAgIGRheXMyID0gb3RoZXIudG9vcmRpbmFsKClcXG4gICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoZGF5czEgLSBkYXlzMiwgMCwgMCwgRmFsc2UpXFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAtMSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBkZWYgd2Vla2RheShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gZGF5IG9mIHRoZSB3ZWVrLCB3aGVyZSBNb25kYXkgPT0gMCAuLi4gU3VuZGF5ID09IDYuXFxcIlxcbiAgICAgICAgcmV0dXJuIChzZWxmLnRvb3JkaW5hbCgpICsgNikgJSA3XFxuXFxuICAgICMgRGF5LW9mLXRoZS13ZWVrIGFuZCB3ZWVrLW9mLXRoZS15ZWFyLCBhY2NvcmRpbmcgdG8gSVNPXFxuXFxuICAgIGRlZiBpc293ZWVrZGF5KHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBkYXkgb2YgdGhlIHdlZWssIHdoZXJlIE1vbmRheSA9PSAxIC4uLiBTdW5kYXkgPT0gNy5cXFwiXFxuICAgICAgICAjIDEtSmFuLTAwMDEgaXMgYSBNb25kYXlcXG4gICAgICAgIHJldHVybiBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuXFxuICAgIGRlZiBpc29jYWxlbmRhcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyBJU08geWVhciwgd2VlayBudW1iZXIsIGFuZCB3ZWVrZGF5LlxcblxcbiAgICAgICAgVGhlIGZpcnN0IElTTyB3ZWVrIG9mIHRoZSB5ZWFyIGlzIHRoZSAoTW9uLVN1bikgd2Vla1xcbiAgICAgICAgY29udGFpbmluZyB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5OyBldmVyeXRoaW5nIGVsc2UgZGVyaXZlc1xcbiAgICAgICAgZnJvbSB0aGF0LlxcblxcbiAgICAgICAgVGhlIGZpcnN0IHdlZWsgaXMgMTsgTW9uZGF5IGlzIDEgLi4uIFN1bmRheSBpcyA3LlxcblxcbiAgICAgICAgSVNPIGNhbGVuZGFyIGFsZ29yaXRobSB0YWtlbiBmcm9tXFxuICAgICAgICBodHRwOi8vd3d3LnBoeXMudXUubmwvfnZnZW50L2NhbGVuZGFyL2lzb2NhbGVuZGFyLmh0bVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB5ZWFyID0gc2VsZi5feWVhclxcbiAgICAgICAgd2VlazFtb25kYXkgPSBfaXNvd2VlazFtb25kYXkoeWVhcilcXG4gICAgICAgIHRvZGF5ID0gX3ltZDJvcmQoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG4gICAgICAgICMgSW50ZXJuYWxseSwgd2VlayBhbmQgZGF5IGhhdmUgb3JpZ2luIDBcXG4gICAgICAgIHdlZWssIGRheSA9IGRpdm1vZCh0b2RheSAtIHdlZWsxbW9uZGF5LCA3KVxcbiAgICAgICAgaWYgd2VlayA8IDA6XFxuICAgICAgICAgICAgeWVhciAtPSAxXFxuICAgICAgICAgICAgd2VlazFtb25kYXkgPSBfaXNvd2VlazFtb25kYXkoeWVhcilcXG4gICAgICAgICAgICB3ZWVrLCBkYXkgPSBkaXZtb2QodG9kYXkgLSB3ZWVrMW1vbmRheSwgNylcXG4gICAgICAgIGVsaWYgd2VlayA+PSA1MjpcXG4gICAgICAgICAgICBpZiB0b2RheSA+PSBfaXNvd2VlazFtb25kYXkoeWVhcisxKTpcXG4gICAgICAgICAgICAgICAgeWVhciArPSAxXFxuICAgICAgICAgICAgICAgIHdlZWsgPSAwXFxuICAgICAgICByZXR1cm4geWVhciwgd2VlaysxLCBkYXkrMVxcblxcbl9kYXRlX2NsYXNzID0gZGF0ZSAgIyBzbyBmdW5jdGlvbnMgdy8gYXJncyBuYW1lZCBcXFwiZGF0ZVxcXCIgY2FuIGdldCBhdCB0aGUgY2xhc3NcXG5cXG5kYXRlLm1pbiA9IGRhdGUoMSwgMSwgMSlcXG5kYXRlLm1heCA9IGRhdGUoOTk5OSwgMTIsIDMxKVxcbmRhdGUucmVzb2x1dGlvbiA9IHRpbWVkZWx0YShkYXlzPTEpXFxuXFxuY2xhc3MgdHppbmZvKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRpbWUgem9uZSBpbmZvIGNsYXNzZXMuXFxuXFxuICAgIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGUgbmFtZSgpLCB1dGNvZmZzZXQoKSBhbmQgZHN0KCkgbWV0aG9kcy5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIF9fc2xvdHNfXyA9ICgpXFxuXFxuICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcImRhdGV0aW1lIC0+IHN0cmluZyBuYW1lIG9mIHRpbWUgem9uZS5cXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSB0em5hbWUoKVxcXCIpXFxuXFxuICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcImRhdGV0aW1lIC0+IG1pbnV0ZXMgZWFzdCBvZiBVVEMgKG5lZ2F0aXZlIGZvciB3ZXN0IG9mIFVUQylcXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSB1dGNvZmZzZXQoKVxcXCIpXFxuXFxuICAgIGRlZiBkc3Qoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGF0ZXRpbWUgLT4gRFNUIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDLlxcblxcbiAgICAgICAgUmV0dXJuIDAgaWYgRFNUIG5vdCBpbiBlZmZlY3QuICB1dGNvZmZzZXQoKSBtdXN0IGluY2x1ZGUgdGhlIERTVFxcbiAgICAgICAgb2Zmc2V0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSBkc3QoKVxcXCIpXFxuXFxuICAgIGRlZiBmcm9tdXRjKHNlbGYsIGR0KTpcXG4gICAgICAgIFxcXCJkYXRldGltZSBpbiBVVEMgLT4gZGF0ZXRpbWUgaW4gbG9jYWwgdGltZS5cXFwiXFxuXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkdCwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiZnJvbXV0YygpIHJlcXVpcmVzIGEgZGF0ZXRpbWUgYXJndW1lbnRcXFwiKVxcbiAgICAgICAgaWYgZHQudHppbmZvIGlzIG5vdCBzZWxmOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImR0LnR6aW5mbyBpcyBub3Qgc2VsZlxcXCIpXFxuXFxuICAgICAgICBkdG9mZiA9IGR0LnV0Y29mZnNldCgpXFxuICAgICAgICBpZiBkdG9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImZyb211dGMoKSByZXF1aXJlcyBhIG5vbi1Ob25lIHV0Y29mZnNldCgpIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJyZXN1bHRcXFwiKVxcblxcbiAgICAgICAgIyBTZWUgdGhlIGxvbmcgY29tbWVudCBibG9jayBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgYW5cXG4gICAgICAgICMgZXhwbGFuYXRpb24gb2YgdGhpcyBhbGdvcml0aG0uXFxuICAgICAgICBkdGRzdCA9IGR0LmRzdCgpXFxuICAgICAgICBpZiBkdGRzdCBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImZyb211dGMoKSByZXF1aXJlcyBhIG5vbi1Ob25lIGRzdCgpIHJlc3VsdFxcXCIpXFxuICAgICAgICBkZWx0YSA9IGR0b2ZmIC0gZHRkc3RcXG4gICAgICAgIGlmIGRlbHRhOlxcbiAgICAgICAgICAgIGR0ID0gZHQgKyBkZWx0YVxcbiAgICAgICAgICAgIGR0ZHN0ID0gZHQuZHN0KClcXG4gICAgICAgICAgICBpZiBkdGRzdCBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJmcm9tdXRjKCk6IGR0LmRzdCBnYXZlIGluY29uc2lzdGVudCBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInJlc3VsdHM7IGNhbm5vdCBjb252ZXJ0XFxcIilcXG4gICAgICAgIGlmIGR0ZHN0OlxcbiAgICAgICAgICAgIHJldHVybiBkdCArIGR0ZHN0XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBkdFxcblxcbl90emluZm9fY2xhc3MgPSB0emluZm9cXG5cXG5jbGFzcyB0aW1lKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIlRpbWUgd2l0aCB0aW1lIHpvbmUuXFxuXFxuICAgIENvbnN0cnVjdG9yczpcXG5cXG4gICAgX19uZXdfXygpXFxuXFxuICAgIE9wZXJhdG9yczpcXG5cXG4gICAgX19yZXByX18sIF9fc3RyX19cXG4gICAgX19jbXBfXywgX19oYXNoX19cXG5cXG4gICAgTWV0aG9kczpcXG5cXG4gICAgc3RyZnRpbWUoKVxcbiAgICBpc29mb3JtYXQoKVxcbiAgICB1dGNvZmZzZXQoKVxcbiAgICB0em5hbWUoKVxcbiAgICBkc3QoKVxcblxcbiAgICBQcm9wZXJ0aWVzIChyZWFkb25seSk6XFxuICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgdHppbmZvXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAnX2hvdXInLCAnX21pbnV0ZScsICdfc2Vjb25kJywgJ19taWNyb3NlY29uZCcsICdfdHppbmZvJywgJ19oYXNoY29kZSdcXG5cXG4gICAgZGVmIF9fbmV3X18oY2xzLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29uc3RydWN0b3IuXFxuXFxuICAgICAgICBBcmd1bWVudHM6XFxuXFxuICAgICAgICBob3VyLCBtaW51dGUgKHJlcXVpcmVkKVxcbiAgICAgICAgc2Vjb25kLCBtaWNyb3NlY29uZCAoZGVmYXVsdCB0byB6ZXJvKVxcbiAgICAgICAgdHppbmZvIChkZWZhdWx0IHRvIE5vbmUpXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCA9IF9jaGVja190aW1lX2ZpZWxkcyhcXG4gICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQpXFxuICAgICAgICBfY2hlY2tfdHppbmZvX2FyZyh0emluZm8pXFxuICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKVxcbiAgICAgICAgc2VsZi5faG91ciA9IGhvdXJcXG4gICAgICAgIHNlbGYuX21pbnV0ZSA9IG1pbnV0ZVxcbiAgICAgICAgc2VsZi5fc2Vjb25kID0gc2Vjb25kXFxuICAgICAgICBzZWxmLl9taWNyb3NlY29uZCA9IG1pY3Jvc2Vjb25kXFxuICAgICAgICBzZWxmLl90emluZm8gPSB0emluZm9cXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICMgUmVhZC1vbmx5IGZpZWxkIGFjY2Vzc29yc1xcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIGhvdXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJob3VyICgwLTIzKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hvdXJcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtaW51dGUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaW51dGUgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWludXRlXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgc2Vjb25kKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwic2Vjb25kICgwLTU5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NlY29uZFxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pY3Jvc2Vjb25kKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWljcm9zZWNvbmQgKDAtOTk5OTk5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21pY3Jvc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgdHppbmZvKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwidGltZXpvbmUgaW5mbyBvYmplY3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl90emluZm9cXG5cXG4gICAgIyBTdGFuZGFyZCBjb252ZXJzaW9ucywgX19oYXNoX18gKGFuZCBoZWxwZXJzKVxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIHRpbWUgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpXFxuICAgICAgICBteXR6ID0gc2VsZi5fdHppbmZvXFxuICAgICAgICBvdHR6ID0gb3RoZXIuX3R6aW5mb1xcbiAgICAgICAgbXlvZmYgPSBvdG9mZiA9IE5vbmVcXG5cXG4gICAgICAgIGlmIG15dHogaXMgb3R0ejpcXG4gICAgICAgICAgICBiYXNlX2NvbXBhcmUgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG15b2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICBvdG9mZiA9IG90aGVyLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IG15b2ZmID09IG90b2ZmXFxuXFxuICAgICAgICBpZiBiYXNlX2NvbXBhcmU6XFxuICAgICAgICAgICAgcmV0dXJuIF9jbXAoKHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyLl9ob3VyLCBvdGhlci5fbWludXRlLCBvdGhlci5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5fbWljcm9zZWNvbmQpKVxcbiAgICAgICAgaWYgbXlvZmYgaXMgTm9uZSBvciBvdG9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kIG9mZnNldC1hd2FyZSB0aW1lc1xcXCIpXFxuICAgICAgICBteWhobW0gPSBzZWxmLl9ob3VyICogNjAgKyBzZWxmLl9taW51dGUgLSBteW9mZlxcbiAgICAgICAgb3RoaG1tID0gb3RoZXIuX2hvdXIgKiA2MCArIG90aGVyLl9taW51dGUgLSBvdG9mZlxcbiAgICAgICAgcmV0dXJuIF9jbXAoKG15aGhtbSwgc2VsZi5fc2Vjb25kLCBzZWxmLl9taWNyb3NlY29uZCksXFxuICAgICAgICAgICAgICAgICAgICAob3RoaG1tLCBvdGhlci5fc2Vjb25kLCBvdGhlci5fbWljcm9zZWNvbmQpKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJIYXNoLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5faGFzaGNvZGUgPT0gLTE6XFxuICAgICAgICAgICAgdHpvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGlmIG5vdCB0em9mZjogICMgemVybyBvciBOb25lXFxuICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpWzBdKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGgsIG0gPSBkaXZtb2Qoc2VsZi5ob3VyICogNjAgKyBzZWxmLm1pbnV0ZSAtIHR6b2ZmLCA2MClcXG4gICAgICAgICAgICAgICAgaWYgMCA8PSBoIDwgMjQ6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2godGltZShoLCBtLCBzZWxmLnNlY29uZCwgc2VsZi5taWNyb3NlY29uZCkpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goKGgsIG0sIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKSlcXG4gICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZVxcblxcbiAgICAjIENvbnZlcnNpb24gdG8gc3RyaW5nXFxuXFxuICAgIGRlZiBfdHpzdHIoc2VsZiwgc2VwPVxcXCI6XFxcIik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gZm9ybWF0dGVkIHRpbWV6b25lIG9mZnNldCAoK3h4Onh4KSBvciBOb25lLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgb2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG9mZiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBpZiBvZmYgPCAwOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIi1cXFwiXFxuICAgICAgICAgICAgICAgIG9mZiA9IC1vZmZcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIitcXFwiXFxuICAgICAgICAgICAgaGgsIG1tID0gZGl2bW9kKG9mZiwgNjApXFxuICAgICAgICAgICAgYXNzZXJ0IDAgPD0gaGggPCAyNFxcbiAgICAgICAgICAgIG9mZiA9IFxcXCIlcyUwMmQlcyUwMmRcXFwiICUgKHNpZ24sIGhoLCBzZXAsIG1tKVxcbiAgICAgICAgcmV0dXJuIG9mZlxcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb252ZXJ0IHRvIGZvcm1hbCBzdHJpbmcsIGZvciByZXByKCkuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9taWNyb3NlY29uZCAhPSAwOlxcbiAgICAgICAgICAgIHMgPSBcXFwiLCAlZCwgJWRcXFwiICUgKHNlbGYuX3NlY29uZCwgc2VsZi5fbWljcm9zZWNvbmQpXFxuICAgICAgICBlbGlmIHNlbGYuX3NlY29uZCAhPSAwOlxcbiAgICAgICAgICAgIHMgPSBcXFwiLCAlZFxcXCIgJSBzZWxmLl9zZWNvbmRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcyA9IFxcXCJcXFwiXFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyB0aW1lIGVsc2UgXFxcIlxcXCJcXG4gICAgICAgIHM9IFxcXCIlcyglZCwgJWQlcylcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzKVxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGFzc2VydCBzWy0xOl0gPT0gXFxcIilcXFwiXFxuICAgICAgICAgICAgcyA9IHNbOi0xXSArIFxcXCIsIHR6aW5mbz0lclxcXCIgJSBzZWxmLl90emluZm8gKyBcXFwiKVxcXCJcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBpc29mb3JtYXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uXFxuXFxuICAgICAgICBUaGlzIGlzICdISDpNTTpTUy5tbW1tbW0reno6enonLCBvciAnSEg6TU06U1Mreno6enonIGlmXFxuICAgICAgICBzZWxmLm1pY3Jvc2Vjb25kID09IDAuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHMgPSBfZm9ybWF0X3RpbWUoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKVxcbiAgICAgICAgdHogPSBzZWxmLl90enN0cigpXFxuICAgICAgICBpZiB0ejpcXG4gICAgICAgICAgICBzICs9IHR6XFxuICAgICAgICByZXR1cm4gc1xcblxcbiAgICBfX3N0cl9fID0gaXNvZm9ybWF0XFxuXFxuICAgIGRlZiBzdHJmdGltZShzZWxmLCBmb3JtYXQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRm9ybWF0IHVzaW5nIHN0cmZ0aW1lKCkuICBUaGUgZGF0ZSBwYXJ0IG9mIHRoZSB0aW1lc3RhbXAgcGFzc2VkXFxuICAgICAgICB0byB1bmRlcmx5aW5nIHN0cmZ0aW1lIHNob3VsZCBub3QgYmUgdXNlZC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBUaGUgeWVhciBtdXN0IGJlID49IF9NSU5ZRUFSRk1UIGVsc2UgUHl0aG9uJ3Mgc3RyZnRpbWUgaW1wbGVtZW50YXRpb25cXG4gICAgICAgICMgY2FuIHJhaXNlIGEgYm9ndXMgZXhjZXB0aW9uLlxcbiAgICAgICAgdGltZXR1cGxlID0gKDE5MDAsIDEsIDEsXFxuICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgMCwgMSwgLTEpXFxuICAgICAgICByZXR1cm4gX3dyYXBfc3RyZnRpbWUoc2VsZiwgZm9ybWF0LCB0aW1ldHVwbGUpXFxuXFxuICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZtdCk6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmbXQsIChzdHIsIHVuaWNvZGUpKTpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJfX2Zvcm1hdF9fIGV4cGVjdHMgc3RyIG9yIHVuaWNvZGUsIG5vdCAlc1xcXCIgJVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10Ll9fY2xhc3NfXy5fX25hbWVfXylcXG4gICAgICAgIGlmIGxlbihmbXQpICE9IDA6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RyZnRpbWUoZm10KVxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmKVxcblxcbiAgICAjIFRpbWV6b25lIGZ1bmN0aW9uc1xcblxcbiAgICBkZWYgdXRjb2Zmc2V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgd2VzdCBvZlxcbiAgICAgICAgVVRDKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YS5fY3JlYXRlKDAsIG9mZnNldCAqIDYwLCAwLCBUcnVlKVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIFJldHVybiBhbiBpbnRlZ2VyIChvciBOb25lKSBpbnN0ZWFkIG9mIGEgdGltZWRlbHRhIChvciBOb25lKS5cXG4gICAgZGVmIF91dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLnV0Y29mZnNldChOb25lKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcInV0Y29mZnNldFxcXCIsIG9mZnNldClcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgZGVmIHR6bmFtZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZXpvbmUgbmFtZS5cXG5cXG4gICAgICAgIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyAxMDAlIGluZm9ybWF0aW9uYWwgLS0gdGhlcmUncyBubyByZXF1aXJlbWVudCB0aGF0XFxuICAgICAgICBpdCBtZWFuIGFueXRoaW5nIGluIHBhcnRpY3VsYXIuIEZvciBleGFtcGxlLCBcXFwiR01UXFxcIiwgXFxcIlVUQ1xcXCIsIFxcXCItNTAwXFxcIixcXG4gICAgICAgIFxcXCItNTowMFxcXCIsIFxcXCJFRFRcXFwiLCBcXFwiVVMvRWFzdGVyblxcXCIsIFxcXCJBbWVyaWNhL05ldyBZb3JrXFxcIiBhcmUgYWxsIHZhbGlkIHJlcGxpZXMuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBuYW1lID0gc2VsZi5fdHppbmZvLnR6bmFtZShOb25lKVxcbiAgICAgICAgX2NoZWNrX3R6bmFtZShuYW1lKVxcbiAgICAgICAgcmV0dXJuIG5hbWVcXG5cXG4gICAgZGVmIGRzdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiAwIGlmIERTVCBpcyBub3QgaW4gZWZmZWN0LCBvciB0aGUgRFNUIG9mZnNldCAoaW4gbWludXRlc1xcbiAgICAgICAgZWFzdHdhcmQpIGlmIERTVCBpcyBpbiBlZmZlY3QuXFxuXFxuICAgICAgICBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsOyB0aGUgRFNUIG9mZnNldCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvXFxuICAgICAgICB0aGUgVVRDIG9mZnNldCByZXR1cm5lZCBieSB1dGNvZmZzZXQoKSBpZiBhcHBsaWNhYmxlLCBzbyB0aGVyZSdzIG5vXFxuICAgICAgICBuZWVkIHRvIGNvbnN1bHQgZHN0KCkgdW5sZXNzIHlvdSdyZSBpbnRlcmVzdGVkIGluIGRpc3BsYXlpbmcgdGhlIERTVFxcbiAgICAgICAgaW5mby5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3QoTm9uZSlcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX2RzdChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8uZHN0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwiZHN0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCBob3VyPU5vbmUsIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSxcXG4gICAgICAgICAgICAgICAgdHppbmZvPVRydWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgbmV3IHRpbWUgd2l0aCBuZXcgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkcy5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGhvdXIgaXMgTm9uZTpcXG4gICAgICAgICAgICBob3VyID0gc2VsZi5ob3VyXFxuICAgICAgICBpZiBtaW51dGUgaXMgTm9uZTpcXG4gICAgICAgICAgICBtaW51dGUgPSBzZWxmLm1pbnV0ZVxcbiAgICAgICAgaWYgc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgc2Vjb25kID0gc2VsZi5zZWNvbmRcXG4gICAgICAgIGlmIG1pY3Jvc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWljcm9zZWNvbmQgPSBzZWxmLm1pY3Jvc2Vjb25kXFxuICAgICAgICBpZiB0emluZm8gaXMgVHJ1ZTpcXG4gICAgICAgICAgICB0emluZm8gPSBzZWxmLnR6aW5mb1xcbiAgICAgICAgcmV0dXJuIHRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCB0emluZm8pXFxuXFxuICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuc2Vjb25kIG9yIHNlbGYubWljcm9zZWNvbmQ6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3V0Y29mZnNldCgpIG9yIDBcXG4gICAgICAgIHJldHVybiBzZWxmLmhvdXIgKiA2MCArIHNlbGYubWludXRlICE9IG9mZnNldFxcblxcbl90aW1lX2NsYXNzID0gdGltZSAgIyBzbyBmdW5jdGlvbnMgdy8gYXJncyBuYW1lZCBcXFwidGltZVxcXCIgY2FuIGdldCBhdCB0aGUgY2xhc3NcXG5cXG50aW1lLm1pbiA9IHRpbWUoMCwgMCwgMClcXG50aW1lLm1heCA9IHRpbWUoMjMsIDU5LCA1OSwgOTk5OTk5KVxcbnRpbWUucmVzb2x1dGlvbiA9IHRpbWVkZWx0YShtaWNyb3NlY29uZHM9MSlcXG5cXG5jbGFzcyBkYXRldGltZShkYXRlKTpcXG4gICAgXFxcIlxcXCJcXFwiZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheVssIGhvdXJbLCBtaW51dGVbLCBzZWNvbmRbLCBtaWNyb3NlY29uZFssdHppbmZvXV1dXV0pXFxuXFxuICAgIFRoZSB5ZWFyLCBtb250aCBhbmQgZGF5IGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQuIHR6aW5mbyBtYXkgYmUgTm9uZSwgb3IgYW5cXG4gICAgaW5zdGFuY2Ugb2YgYSB0emluZm8gc3ViY2xhc3MuIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIG1heSBiZSBpbnRzIG9yIGxvbmdzLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gZGF0ZS5fX3Nsb3RzX18gKyB0aW1lLl9fc2xvdHNfX1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIHllYXIsIG1vbnRoPU5vbmUsIGRheT1Ob25lLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCxcXG4gICAgICAgICAgICAgICAgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUpOlxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KVxcbiAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kID0gX2NoZWNrX3RpbWVfZmllbGRzKFxcbiAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZClcXG4gICAgICAgIF9jaGVja190emluZm9fYXJnKHR6aW5mbylcXG4gICAgICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpXFxuICAgICAgICBzZWxmLl95ZWFyID0geWVhclxcbiAgICAgICAgc2VsZi5fbW9udGggPSBtb250aFxcbiAgICAgICAgc2VsZi5fZGF5ID0gZGF5XFxuICAgICAgICBzZWxmLl9ob3VyID0gaG91clxcbiAgICAgICAgc2VsZi5fbWludXRlID0gbWludXRlXFxuICAgICAgICBzZWxmLl9zZWNvbmQgPSBzZWNvbmRcXG4gICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kID0gbWljcm9zZWNvbmRcXG4gICAgICAgIHNlbGYuX3R6aW5mbyA9IHR6aW5mb1xcbiAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgaG91cihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImhvdXIgKDAtMjMpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faG91clxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pbnV0ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1pbnV0ZSAoMC01OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9taW51dGVcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBzZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJzZWNvbmQgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWljcm9zZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaWNyb3NlY29uZCAoMC05OTk5OTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWljcm9zZWNvbmRcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB0emluZm8oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ0aW1lem9uZSBpbmZvIG9iamVjdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3R6aW5mb1xcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIGZyb210aW1lc3RhbXAoY2xzLCB0aW1lc3RhbXAsIHR6PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29uc3RydWN0IGEgZGF0ZXRpbWUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAobGlrZSB0aW1lLnRpbWUoKSkuXFxuXFxuICAgICAgICBBIHRpbWV6b25lIGluZm8gb2JqZWN0IG1heSBiZSBwYXNzZWQgaW4gYXMgd2VsbC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NoZWNrX3R6aW5mb19hcmcodHopXFxuICAgICAgICBjb252ZXJ0ZXIgPSBfdGltZS5sb2NhbHRpbWUgaWYgdHogaXMgTm9uZSBlbHNlIF90aW1lLmdtdGltZVxcbiAgICAgICAgc2VsZiA9IGNscy5fZnJvbV90aW1lc3RhbXAoY29udmVydGVyLCB0aW1lc3RhbXAsIHR6KVxcbiAgICAgICAgaWYgdHogaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgc2VsZiA9IHR6LmZyb211dGMoc2VsZilcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgdXRjZnJvbXRpbWVzdGFtcChjbHMsIHQpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIFVUQyBkYXRldGltZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS5cXFwiXFxuICAgICAgICByZXR1cm4gY2xzLl9mcm9tX3RpbWVzdGFtcChfdGltZS5nbXRpbWUsIHQsIE5vbmUpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgX2Zyb21fdGltZXN0YW1wKGNscywgY29udmVydGVyLCB0aW1lc3RhbXAsIHR6aW5mbyk6XFxuICAgICAgICB0X2Z1bGwgPSB0aW1lc3RhbXBcXG4gICAgICAgIHRpbWVzdGFtcCA9IGludChfbWF0aC5mbG9vcih0aW1lc3RhbXApKVxcbiAgICAgICAgZnJhYyA9IHRfZnVsbCAtIHRpbWVzdGFtcFxcbiAgICAgICAgdXMgPSBfcm91bmQoZnJhYyAqIDFlNilcXG5cXG4gICAgICAgICMgSWYgdGltZXN0YW1wIGlzIGxlc3MgdGhhbiBvbmUgbWljcm9zZWNvbmQgc21hbGxlciB0aGFuIGFcXG4gICAgICAgICMgZnVsbCBzZWNvbmQsIHVzIGNhbiBiZSByb3VuZGVkIHVwIHRvIDEwMDAwMDAuICBJbiB0aGlzIGNhc2UsXFxuICAgICAgICAjIHJvbGwgb3ZlciB0byBzZWNvbmRzLCBvdGhlcndpc2UsIFZhbHVlRXJyb3IgaXMgcmFpc2VkXFxuICAgICAgICAjIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cXG4gICAgICAgIGlmIHVzID09IDEwMDAwMDA6XFxuICAgICAgICAgICAgdGltZXN0YW1wICs9IDFcXG4gICAgICAgICAgICB1cyA9IDBcXG4gICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MsIHdlZWtkYXksIGpkYXksIGRzdCA9IGNvbnZlcnRlcih0aW1lc3RhbXApXFxuICAgICAgICBzcyA9IG1pbihzcywgNTkpICAgICMgY2xhbXAgb3V0IGxlYXAgc2Vjb25kcyBpZiB0aGUgcGxhdGZvcm0gaGFzIHRoZW1cXG4gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbylcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBub3coY2xzLCB0ej1Ob25lKTpcXG4gICAgICAgIFxcXCJDb25zdHJ1Y3QgYSBkYXRldGltZSBmcm9tIHRpbWUudGltZSgpIGFuZCBvcHRpb25hbCB0aW1lIHpvbmUgaW5mby5cXFwiXFxuICAgICAgICB0ID0gX3RpbWUudGltZSgpXFxuICAgICAgICByZXR1cm4gY2xzLmZyb210aW1lc3RhbXAodCwgdHopXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgdXRjbm93KGNscyk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgVVRDIGRhdGV0aW1lIGZyb20gdGltZS50aW1lKCkuXFxcIlxcbiAgICAgICAgdCA9IF90aW1lLnRpbWUoKVxcbiAgICAgICAgcmV0dXJuIGNscy51dGNmcm9tdGltZXN0YW1wKHQpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgY29tYmluZShjbHMsIGRhdGUsIHRpbWUpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGV0aW1lIGZyb20gYSBnaXZlbiBkYXRlIGFuZCBhIGdpdmVuIHRpbWUuXFxcIlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0ZSwgX2RhdGVfY2xhc3MpOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiZGF0ZSBhcmd1bWVudCBtdXN0IGJlIGEgZGF0ZSBpbnN0YW5jZVxcXCIpXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0aW1lLCBfdGltZV9jbGFzcyk6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0aW1lIGFyZ3VtZW50IG11c3QgYmUgYSB0aW1lIGluc3RhbmNlXFxcIilcXG4gICAgICAgIHJldHVybiBjbHMoZGF0ZS55ZWFyLCBkYXRlLm1vbnRoLCBkYXRlLmRheSxcXG4gICAgICAgICAgICAgICAgICAgdGltZS5ob3VyLCB0aW1lLm1pbnV0ZSwgdGltZS5zZWNvbmQsIHRpbWUubWljcm9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgIHRpbWUudHppbmZvKVxcblxcbiAgICBkZWYgdGltZXR1cGxlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBsb2NhbCB0aW1lIHR1cGxlIGNvbXBhdGlibGUgd2l0aCB0aW1lLmxvY2FsdGltZSgpLlxcXCJcXG4gICAgICAgIGRzdCA9IHNlbGYuX2RzdCgpXFxuICAgICAgICBpZiBkc3QgaXMgTm9uZTpcXG4gICAgICAgICAgICBkc3QgPSAtMVxcbiAgICAgICAgZWxpZiBkc3Q6XFxuICAgICAgICAgICAgZHN0ID0gMVxcbiAgICAgICAgcmV0dXJuIF9idWlsZF9zdHJ1Y3RfdGltZShzZWxmLnllYXIsIHNlbGYubW9udGgsIHNlbGYuZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvdXIsIHNlbGYubWludXRlLCBzZWxmLnNlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0KVxcblxcbiAgICBkZWYgdXRjdGltZXR1cGxlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBVVEMgdGltZSB0dXBsZSBjb21wYXRpYmxlIHdpdGggdGltZS5nbXRpbWUoKS5cXFwiXFxuICAgICAgICB5LCBtLCBkID0gc2VsZi55ZWFyLCBzZWxmLm1vbnRoLCBzZWxmLmRheVxcbiAgICAgICAgaGgsIG1tLCBzcyA9IHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgb2Zmc2V0OiAgIyBuZWl0aGVyIE5vbmUgbm9yIDBcXG4gICAgICAgICAgICBtbSAtPSBvZmZzZXRcXG4gICAgICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCBfID0gX25vcm1hbGl6ZV9kYXRldGltZShcXG4gICAgICAgICAgICAgICAgeSwgbSwgZCwgaGgsIG1tLCBzcywgMCwgaWdub3JlX292ZXJmbG93PVRydWUpXFxuICAgICAgICByZXR1cm4gX2J1aWxkX3N0cnVjdF90aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIDApXFxuXFxuICAgIGRlZiBkYXRlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgZGF0ZSBwYXJ0LlxcXCJcXG4gICAgICAgIHJldHVybiBkYXRlKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXkpXFxuXFxuICAgIGRlZiB0aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgdGltZSBwYXJ0LCB3aXRoIHR6aW5mbyBOb25lLlxcXCJcXG4gICAgICAgIHJldHVybiB0aW1lKHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKVxcblxcbiAgICBkZWYgdGltZXR6KHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgdGltZSBwYXJ0LCB3aXRoIHNhbWUgdHppbmZvLlxcXCJcXG4gICAgICAgIHJldHVybiB0aW1lKHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHppbmZvKVxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCB5ZWFyPU5vbmUsIG1vbnRoPU5vbmUsIGRheT1Ob25lLCBob3VyPU5vbmUsXFxuICAgICAgICAgICAgICAgIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSwgdHppbmZvPVRydWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgbmV3IGRhdGV0aW1lIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB5ZWFyIGlzIE5vbmU6XFxuICAgICAgICAgICAgeWVhciA9IHNlbGYueWVhclxcbiAgICAgICAgaWYgbW9udGggaXMgTm9uZTpcXG4gICAgICAgICAgICBtb250aCA9IHNlbGYubW9udGhcXG4gICAgICAgIGlmIGRheSBpcyBOb25lOlxcbiAgICAgICAgICAgIGRheSA9IHNlbGYuZGF5XFxuICAgICAgICBpZiBob3VyIGlzIE5vbmU6XFxuICAgICAgICAgICAgaG91ciA9IHNlbGYuaG91clxcbiAgICAgICAgaWYgbWludXRlIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWludXRlID0gc2VsZi5taW51dGVcXG4gICAgICAgIGlmIHNlY29uZCBpcyBOb25lOlxcbiAgICAgICAgICAgIHNlY29uZCA9IHNlbGYuc2Vjb25kXFxuICAgICAgICBpZiBtaWNyb3NlY29uZCBpcyBOb25lOlxcbiAgICAgICAgICAgIG1pY3Jvc2Vjb25kID0gc2VsZi5taWNyb3NlY29uZFxcbiAgICAgICAgaWYgdHppbmZvIGlzIFRydWU6XFxuICAgICAgICAgICAgdHppbmZvID0gc2VsZi50emluZm9cXG4gICAgICAgIHJldHVybiBkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKVxcblxcbiAgICBkZWYgYXN0aW1lem9uZShzZWxmLCB0eik6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0eiwgdHppbmZvKTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcInR6IGFyZ3VtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgdHppbmZvXFxcIilcXG5cXG4gICAgICAgIG15dHogPSBzZWxmLnR6aW5mb1xcbiAgICAgICAgaWYgbXl0eiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImFzdGltZXpvbmUoKSByZXF1aXJlcyBhbiBhd2FyZSBkYXRldGltZVxcXCIpXFxuXFxuICAgICAgICBpZiB0eiBpcyBteXR6OlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICAgICAjIENvbnZlcnQgc2VsZiB0byBVVEMsIGFuZCBhdHRhY2ggdGhlIG5ldyB0aW1lIHpvbmUgb2JqZWN0LlxcbiAgICAgICAgbXlvZmZzZXQgPSBzZWxmLnV0Y29mZnNldCgpXFxuICAgICAgICBpZiBteW9mZnNldCBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImFzdGltZXpvbmUoKSByZXF1aXJlcyBhbiBhd2FyZSBkYXRldGltZVxcXCIpXFxuICAgICAgICB1dGMgPSAoc2VsZiAtIG15b2Zmc2V0KS5yZXBsYWNlKHR6aW5mbz10eilcXG5cXG4gICAgICAgICMgQ29udmVydCBmcm9tIFVUQyB0byB0eidzIGxvY2FsIHRpbWUuXFxuICAgICAgICByZXR1cm4gdHouZnJvbXV0Yyh1dGMpXFxuXFxuICAgICMgV2F5cyB0byBwcm9kdWNlIGEgc3RyaW5nLlxcblxcbiAgICBkZWYgY3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLlxcXCJcXG4gICAgICAgIHdlZWtkYXkgPSBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuICAgICAgICByZXR1cm4gXFxcIiVzICVzICUyZCAlMDJkOiUwMmQ6JTAyZCAlMDRkXFxcIiAlIChcXG4gICAgICAgICAgICBfREFZTkFNRVNbd2Vla2RheV0sXFxuICAgICAgICAgICAgX01PTlRITkFNRVNbc2VsZi5fbW9udGhdLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSxcXG4gICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICBzZWxmLl95ZWFyKVxcblxcbiAgICBkZWYgaXNvZm9ybWF0KHNlbGYsIHNlcD0nVCcpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gSVNPLlxcblxcbiAgICAgICAgVGhpcyBpcyAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0nLCBvciAnWVlZWS1NTS1ERCBISDpNTTpTUycgaWZcXG4gICAgICAgIHNlbGYubWljcm9zZWNvbmQgPT0gMC5cXG5cXG4gICAgICAgIElmIHNlbGYudHppbmZvIGlzIG5vdCBOb25lLCB0aGUgVVRDIG9mZnNldCBpcyBhbHNvIGF0dGFjaGVkLCBnaXZpbmdcXG4gICAgICAgICdZWVlZLU1NLUREIEhIOk1NOlNTLm1tbW1tbStISDpNTScgb3IgJ1lZWVktTU0tREQgSEg6TU06U1MrSEg6TU0nLlxcblxcbiAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQgc2VwIHNwZWNpZmllcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gZGF0ZSBhbmRcXG4gICAgICAgIHRpbWUsIGRlZmF1bHQgJ1QnLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBzID0gKFxcXCIlMDRkLSUwMmQtJTAyZCVjXFxcIiAlIChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LCBzZXApICtcXG4gICAgICAgICAgICAgX2Zvcm1hdF90aW1lKHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpKVxcbiAgICAgICAgb2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG9mZiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBpZiBvZmYgPCAwOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIi1cXFwiXFxuICAgICAgICAgICAgICAgIG9mZiA9IC1vZmZcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIitcXFwiXFxuICAgICAgICAgICAgaGgsIG1tID0gZGl2bW9kKG9mZiwgNjApXFxuICAgICAgICAgICAgcyArPSBcXFwiJXMlMDJkOiUwMmRcXFwiICUgKHNpZ24sIGhoLCBtbSlcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBfX3JlcHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnZlcnQgdG8gZm9ybWFsIHN0cmluZywgZm9yIHJlcHIoKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIEwgPSBbc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSwgICMgVGhlc2UgYXJlIG5ldmVyIHplcm9cXG4gICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsIHNlbGYuX21pY3Jvc2Vjb25kXVxcbiAgICAgICAgaWYgTFstMV0gPT0gMDpcXG4gICAgICAgICAgICBkZWwgTFstMV1cXG4gICAgICAgIGlmIExbLTFdID09IDA6XFxuICAgICAgICAgICAgZGVsIExbLTFdXFxuICAgICAgICBzID0gXFxcIiwgXFxcIi5qb2luKG1hcChzdHIsIEwpKVxcbiAgICAgICAgbW9kdWxlID0gXFxcImRhdGV0aW1lLlxcXCIgaWYgc2VsZi5fX2NsYXNzX18gaXMgZGF0ZXRpbWUgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgcyA9IFxcXCIlcyglcylcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzKVxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGFzc2VydCBzWy0xOl0gPT0gXFxcIilcXFwiXFxuICAgICAgICAgICAgcyA9IHNbOi0xXSArIFxcXCIsIHR6aW5mbz0lclxcXCIgJSBzZWxmLl90emluZm8gKyBcXFwiKVxcXCJcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIkNvbnZlcnQgdG8gc3RyaW5nLCBmb3Igc3RyKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXNvZm9ybWF0KHNlcD0nICcpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgc3RycHRpbWUoY2xzLCBkYXRlX3N0cmluZywgZm9ybWF0KTpcXG4gICAgICAgICdzdHJpbmcsIGZvcm1hdCAtPiBuZXcgZGF0ZXRpbWUgcGFyc2VkIGZyb20gYSBzdHJpbmcgKGxpa2UgdGltZS5zdHJwdGltZSgpKS4nXFxuICAgICAgICBmcm9tIF9zdHJwdGltZSBpbXBvcnQgX3N0cnB0aW1lXFxuICAgICAgICAjIF9zdHJwdGltZS5fc3RycHRpbWUgcmV0dXJucyBhIHR3by1lbGVtZW50IHR1cGxlLiAgVGhlIGZpcnN0XFxuICAgICAgICAjIGVsZW1lbnQgaXMgYSB0aW1lLnN0cnVjdF90aW1lIG9iamVjdC4gIFRoZSBzZWNvbmQgaXMgdGhlXFxuICAgICAgICAjIG1pY3Jvc2Vjb25kcyAod2hpY2ggYXJlIG5vdCBkZWZpbmVkIGZvciB0aW1lLnN0cnVjdF90aW1lKS5cXG4gICAgICAgIHN0cnVjdCwgbWljcm9zID0gX3N0cnB0aW1lKGRhdGVfc3RyaW5nLCBmb3JtYXQpXFxuICAgICAgICByZXR1cm4gY2xzKCooc3RydWN0WzA6Nl0gKyAobWljcm9zLCkpKVxcblxcbiAgICBkZWYgdXRjb2Zmc2V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgd2VzdCBvZlxcbiAgICAgICAgVVRDKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YS5fY3JlYXRlKDAsIG9mZnNldCAqIDYwLCAwLCBUcnVlKVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIFJldHVybiBhbiBpbnRlZ2VyIChvciBOb25lKSBpbnN0ZWFkIG9mIGEgdGltZWRlbHRhIChvciBOb25lKS5cXG4gICAgZGVmIF91dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLnV0Y29mZnNldChzZWxmKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcInV0Y29mZnNldFxcXCIsIG9mZnNldClcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgZGVmIHR6bmFtZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZXpvbmUgbmFtZS5cXG5cXG4gICAgICAgIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyAxMDAlIGluZm9ybWF0aW9uYWwgLS0gdGhlcmUncyBubyByZXF1aXJlbWVudCB0aGF0XFxuICAgICAgICBpdCBtZWFuIGFueXRoaW5nIGluIHBhcnRpY3VsYXIuIEZvciBleGFtcGxlLCBcXFwiR01UXFxcIiwgXFxcIlVUQ1xcXCIsIFxcXCItNTAwXFxcIixcXG4gICAgICAgIFxcXCItNTowMFxcXCIsIFxcXCJFRFRcXFwiLCBcXFwiVVMvRWFzdGVyblxcXCIsIFxcXCJBbWVyaWNhL05ldyBZb3JrXFxcIiBhcmUgYWxsIHZhbGlkIHJlcGxpZXMuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBuYW1lID0gc2VsZi5fdHppbmZvLnR6bmFtZShzZWxmKVxcbiAgICAgICAgX2NoZWNrX3R6bmFtZShuYW1lKVxcbiAgICAgICAgcmV0dXJuIG5hbWVcXG5cXG4gICAgZGVmIGRzdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiAwIGlmIERTVCBpcyBub3QgaW4gZWZmZWN0LCBvciB0aGUgRFNUIG9mZnNldCAoaW4gbWludXRlc1xcbiAgICAgICAgZWFzdHdhcmQpIGlmIERTVCBpcyBpbiBlZmZlY3QuXFxuXFxuICAgICAgICBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsOyB0aGUgRFNUIG9mZnNldCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvXFxuICAgICAgICB0aGUgVVRDIG9mZnNldCByZXR1cm5lZCBieSB1dGNvZmZzZXQoKSBpZiBhcHBsaWNhYmxlLCBzbyB0aGVyZSdzIG5vXFxuICAgICAgICBuZWVkIHRvIGNvbnN1bHQgZHN0KCkgdW5sZXNzIHlvdSdyZSBpbnRlcmVzdGVkIGluIGRpc3BsYXlpbmcgdGhlIERTVFxcbiAgICAgICAgaW5mby5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3Qoc2VsZilcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX2RzdChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8uZHN0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwiZHN0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIGRhdGV0aW1lIG9iamVjdHMgd2l0aCBvdGhlci5cXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPT0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpICE9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuXFxuICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPCAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID49IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfY21wKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSlcXG4gICAgICAgIG15dHogPSBzZWxmLl90emluZm9cXG4gICAgICAgIG90dHogPSBvdGhlci5fdHppbmZvXFxuICAgICAgICBteW9mZiA9IG90b2ZmID0gTm9uZVxcblxcbiAgICAgICAgaWYgbXl0eiBpcyBvdHR6OlxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgbXl0eiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgbXlvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGlmIG90dHogaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgIG90b2ZmID0gb3RoZXIuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgYmFzZV9jb21wYXJlID0gbXlvZmYgPT0gb3RvZmZcXG5cXG4gICAgICAgIGlmIGJhc2VfY29tcGFyZTpcXG4gICAgICAgICAgICByZXR1cm4gX2NtcCgoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIuX3llYXIsIG90aGVyLl9tb250aCwgb3RoZXIuX2RheSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuX2hvdXIsIG90aGVyLl9taW51dGUsIG90aGVyLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLl9taWNyb3NlY29uZCkpXFxuICAgICAgICBpZiBteW9mZiBpcyBOb25lIG9yIG90b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBjb21wYXJlIG9mZnNldC1uYWl2ZSBhbmQgb2Zmc2V0LWF3YXJlIGRhdGV0aW1lc1xcXCIpXFxuICAgICAgICAjIFhYWCBXaGF0IGZvbGxvd3MgY291bGQgYmUgZG9uZSBtb3JlIGVmZmljaWVudGx5Li4uXFxuICAgICAgICBkaWZmID0gc2VsZiAtIG90aGVyICAgICAjIHRoaXMgd2lsbCB0YWtlIG9mZnNldHMgaW50byBhY2NvdW50XFxuICAgICAgICBpZiBkaWZmLmRheXMgPCAwOlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgcmV0dXJuIGRpZmYgYW5kIDEgb3IgMFxcblxcbiAgICBkZWYgX2FkZF90aW1lZGVsdGEoc2VsZiwgb3RoZXIsIGZhY3Rvcik6XFxuICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cyA9IF9ub3JtYWxpemVfZGF0ZXRpbWUoXFxuICAgICAgICAgICAgc2VsZi5feWVhcixcXG4gICAgICAgICAgICBzZWxmLl9tb250aCxcXG4gICAgICAgICAgICBzZWxmLl9kYXkgKyBvdGhlci5kYXlzICogZmFjdG9yLFxcbiAgICAgICAgICAgIHNlbGYuX2hvdXIsXFxuICAgICAgICAgICAgc2VsZi5fbWludXRlLFxcbiAgICAgICAgICAgIHNlbGYuX3NlY29uZCArIG90aGVyLnNlY29uZHMgKiBmYWN0b3IsXFxuICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgKyBvdGhlci5taWNyb3NlY29uZHMgKiBmYWN0b3IpXFxuICAgICAgICByZXR1cm4gZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbz1zZWxmLl90emluZm8pXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJBZGQgYSBkYXRldGltZSBhbmQgYSB0aW1lZGVsdGEuXFxcIlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICByZXR1cm4gc2VsZi5fYWRkX3RpbWVkZWx0YShvdGhlciwgMSlcXG5cXG4gICAgX19yYWRkX18gPSBfX2FkZF9fXFxuXFxuICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJTdWJ0cmFjdCB0d28gZGF0ZXRpbWVzLCBvciBhIGRhdGV0aW1lIGFuZCBhIHRpbWVkZWx0YS5cXFwiXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAtMSlcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgICAgIGRlbHRhX2QgPSBzZWxmLnRvb3JkaW5hbCgpIC0gb3RoZXIudG9vcmRpbmFsKClcXG4gICAgICAgIGRlbHRhX3MgPSAoc2VsZi5faG91ciAtIG90aGVyLl9ob3VyKSAqIDM2MDAgKyBcXFxcXFxuICAgICAgICAgICAgICAgICAgKHNlbGYuX21pbnV0ZSAtIG90aGVyLl9taW51dGUpICogNjAgKyBcXFxcXFxuICAgICAgICAgICAgICAgICAgKHNlbGYuX3NlY29uZCAtIG90aGVyLl9zZWNvbmQpXFxuICAgICAgICBkZWx0YV91cyA9IHNlbGYuX21pY3Jvc2Vjb25kIC0gb3RoZXIuX21pY3Jvc2Vjb25kXFxuICAgICAgICBiYXNlID0gdGltZWRlbHRhLl9jcmVhdGUoZGVsdGFfZCwgZGVsdGFfcywgZGVsdGFfdXMsIFRydWUpXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgb3RoZXIuX3R6aW5mbzpcXG4gICAgICAgICAgICByZXR1cm4gYmFzZVxcbiAgICAgICAgbXlvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgb3RvZmYgPSBvdGhlci5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG15b2ZmID09IG90b2ZmOlxcbiAgICAgICAgICAgIHJldHVybiBiYXNlXFxuICAgICAgICBpZiBteW9mZiBpcyBOb25lIG9yIG90b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBzdWJ0cmFjdCBvZmZzZXQtbmFpdmUgYW5kIG9mZnNldC1hd2FyZSBkYXRldGltZXNcXFwiKVxcbiAgICAgICAgcmV0dXJuIGJhc2UgKyB0aW1lZGVsdGEobWludXRlcyA9IG90b2ZmLW15b2ZmKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICB0em9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgaWYgdHpvZmYgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKHNlbGYuX2dldHN0YXRlKClbMF0pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgZGF5cyA9IF95bWQyb3JkKHNlbGYueWVhciwgc2VsZi5tb250aCwgc2VsZi5kYXkpXFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPSBzZWxmLmhvdXIgKiAzNjAwICsgKHNlbGYubWludXRlIC0gdHpvZmYpICogNjAgKyBzZWxmLnNlY29uZFxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2godGltZWRlbHRhKGRheXMsIHNlY29uZHMsIHNlbGYubWljcm9zZWNvbmQpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuXFxuXFxuZGF0ZXRpbWUubWluID0gZGF0ZXRpbWUoMSwgMSwgMSlcXG5kYXRldGltZS5tYXggPSBkYXRldGltZSg5OTk5LCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTk5OSlcXG5kYXRldGltZS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKVxcblxcblxcbmRlZiBfaXNvd2VlazFtb25kYXkoeWVhcik6XFxuICAgICMgSGVscGVyIHRvIGNhbGN1bGF0ZSB0aGUgZGF5IG51bWJlciBvZiB0aGUgTW9uZGF5IHN0YXJ0aW5nIHdlZWsgMVxcbiAgICAjIFhYWCBUaGlzIGNvdWxkIGJlIGRvbmUgbW9yZSBlZmZpY2llbnRseVxcbiAgICBUSFVSU0RBWSA9IDNcXG4gICAgZmlyc3RkYXkgPSBfeW1kMm9yZCh5ZWFyLCAxLCAxKVxcbiAgICBmaXJzdHdlZWtkYXkgPSAoZmlyc3RkYXkgKyA2KSAlIDcgICMgU2VlIHdlZWtkYXkoKSBhYm92ZVxcbiAgICB3ZWVrMW1vbmRheSA9IGZpcnN0ZGF5IC0gZmlyc3R3ZWVrZGF5XFxuICAgIGlmIGZpcnN0d2Vla2RheSA+IFRIVVJTREFZOlxcbiAgICAgICAgd2VlazFtb25kYXkgKz0gN1xcbiAgICByZXR1cm4gd2VlazFtb25kYXlcXG5cXG5cXFwiXFxcIlxcXCJcXG5Tb21lIHRpbWUgem9uZSBhbGdlYnJhLiAgRm9yIGEgZGF0ZXRpbWUgeCwgbGV0XFxuICAgIHgubiA9IHggc3RyaXBwZWQgb2YgaXRzIHRpbWV6b25lIC0tIGl0cyBuYWl2ZSB0aW1lLlxcbiAgICB4Lm8gPSB4LnV0Y29mZnNldCgpLCBhbmQgYXNzdW1pbmcgdGhhdCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvclxcbiAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICB4LmQgPSB4LmRzdCgpLCBhbmQgYXNzdW1pbmcgdGhhdCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvclxcbiAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICB4LnMgPSB4J3Mgc3RhbmRhcmQgb2Zmc2V0LCB4Lm8gLSB4LmRcXG5cXG5Ob3cgc29tZSBkZXJpdmVkIHJ1bGVzLCB3aGVyZSBrIGlzIGEgZHVyYXRpb24gKHRpbWVkZWx0YSkuXFxuXFxuMS4geC5vID0geC5zICsgeC5kXFxuICAgVGhpcyBmb2xsb3dzIGZyb20gdGhlIGRlZmluaXRpb24gb2YgeC5zLlxcblxcbjIuIElmIHggYW5kIHkgaGF2ZSB0aGUgc2FtZSB0emluZm8gbWVtYmVyLCB4LnMgPSB5LnMuXFxuICAgVGhpcyBpcyBhY3R1YWxseSBhIHJlcXVpcmVtZW50LCBhbiBhc3N1bXB0aW9uIHdlIG5lZWQgdG8gbWFrZSBhYm91dFxcbiAgIHNhbmUgdHppbmZvIGNsYXNzZXMuXFxuXFxuMy4gVGhlIG5haXZlIFVUQyB0aW1lIGNvcnJlc3BvbmRpbmcgdG8geCBpcyB4Lm4gLSB4Lm8uXFxuICAgVGhpcyBpcyBhZ2FpbiBhIHJlcXVpcmVtZW50IGZvciBhIHNhbmUgdHppbmZvIGNsYXNzLlxcblxcbjQuICh4K2spLnMgPSB4LnNcXG4gICBUaGlzIGZvbGxvd3MgZnJvbSAjMiwgYW5kIHRoYXQgZGF0aW1ldGltZXR6K3RpbWVkZWx0YSBwcmVzZXJ2ZXMgdHppbmZvLlxcblxcbjUuICh4K2spLm4gPSB4Lm4gKyBrXFxuICAgQWdhaW4gZm9sbG93cyBmcm9tIGhvdyBhcml0aG1ldGljIGlzIGRlZmluZWQuXFxuXFxuTm93IHdlIGNhbiBleHBsYWluIHR6LmZyb211dGMoeCkuICBMZXQncyBhc3N1bWUgaXQncyBhbiBpbnRlcmVzdGluZyBjYXNlXFxuKG1lYW5pbmcgdGhhdCB0aGUgdmFyaW91cyB0emluZm8gbWV0aG9kcyBleGlzdCwgYW5kIGRvbid0IGJsb3cgdXAgb3IgcmV0dXJuXFxuTm9uZSB3aGVuIGNhbGxlZCkuXFxuXFxuVGhlIGZ1bmN0aW9uIHdhbnRzIHRvIHJldHVybiBhIGRhdGV0aW1lIHkgd2l0aCB0aW1lem9uZSB0eiwgZXF1aXZhbGVudCB0byB4LlxcbnggaXMgYWxyZWFkeSBpbiBVVEMuXFxuXFxuQnkgIzMsIHdlIHdhbnRcXG5cXG4gICAgeS5uIC0geS5vID0geC5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV1cXG5cXG5UaGUgYWxnb3JpdGhtIHN0YXJ0cyBieSBhdHRhY2hpbmcgdHogdG8geC5uLCBhbmQgY2FsbGluZyB0aGF0IHkuICBTb1xcbngubiA9IHkubiBhdCB0aGUgc3RhcnQuICBUaGVuIGl0IHdhbnRzIHRvIGFkZCBhIGR1cmF0aW9uIGsgdG8geSwgc28gdGhhdCBbMV1cXG5iZWNvbWVzIHRydWU7IGluIGVmZmVjdCwgd2Ugd2FudCB0byBzb2x2ZSBbMl0gZm9yIGs6XFxuXFxuICAgKHkraykubiAtICh5K2spLm8gPSB4Lm4gICAgICAgICAgICAgICAgICAgICAgWzJdXFxuXFxuQnkgIzEsIHRoaXMgaXMgdGhlIHNhbWUgYXNcXG5cXG4gICAoeStrKS5uIC0gKCh5K2spLnMgKyAoeStrKS5kKSA9IHgubiAgICAgICAgICBbM11cXG5cXG5CeSAjNSwgKHkraykubiA9IHkubiArIGssIHdoaWNoIGVxdWFscyB4Lm4gKyBrIGJlY2F1c2UgeC5uPXkubiBhdCB0aGUgc3RhcnQuXFxuU3Vic3RpdHV0aW5nIHRoYXQgaW50byBbM10sXFxuXFxuICAgeC5uICsgayAtICh5K2spLnMgLSAoeStrKS5kID0geC5uOyB0aGUgeC5uIHRlcm1zIGNhbmNlbCwgbGVhdmluZ1xcbiAgIGsgLSAoeStrKS5zIC0gKHkraykuZCA9IDA7IHJlYXJyYW5naW5nLFxcbiAgIGsgPSAoeStrKS5zIC0gKHkraykuZDsgYnkgIzQsICh5K2spLnMgPT0geS5zLCBzb1xcbiAgIGsgPSB5LnMgLSAoeStrKS5kXFxuXFxuT24gdGhlIFJIUywgKHkraykuZCBjYW4ndCBiZSBjb21wdXRlZCBkaXJlY3RseSwgYnV0IHkucyBjYW4gYmUsIGFuZCB3ZVxcbmFwcHJveGltYXRlIGsgYnkgaWdub3JpbmcgdGhlICh5K2spLmQgdGVybSBhdCBmaXJzdC4gIE5vdGUgdGhhdCBrIGNhbid0IGJlXFxudmVyeSBsYXJnZSwgc2luY2UgYWxsIG9mZnNldC1yZXR1cm5pbmcgbWV0aG9kcyByZXR1cm4gYSBkdXJhdGlvbiBvZiBtYWduaXR1ZGVcXG5sZXNzIHRoYW4gMjQgaG91cnMuICBGb3IgdGhhdCByZWFzb24sIGlmIHkgaXMgZmlybWx5IGluIHN0ZCB0aW1lLCAoeStrKS5kIG11c3RcXG5iZSAwLCBzbyBpZ25vcmluZyBpdCBoYXMgbm8gY29uc2VxdWVuY2UgdGhlbi5cXG5cXG5JbiBhbnkgY2FzZSwgdGhlIG5ldyB2YWx1ZSBpc1xcblxcbiAgICB6ID0geSArIHkucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0XVxcblxcbkl0J3MgaGVscGZ1bCB0byBzdGVwIGJhY2sgYXQgbG9vayBhdCBbNF0gZnJvbSBhIGhpZ2hlciBsZXZlbDogIGl0J3Mgc2ltcGx5XFxubWFwcGluZyBmcm9tIFVUQyB0byB0eidzIHN0YW5kYXJkIHRpbWUuXFxuXFxuQXQgdGhpcyBwb2ludCwgaWZcXG5cXG4gICAgei5uIC0gei5vID0geC5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNV1cXG5cXG53ZSBoYXZlIGFuIGVxdWl2YWxlbnQgdGltZSwgYW5kIGFyZSBhbG1vc3QgZG9uZS4gIFRoZSBpbnNlY3VyaXR5IGhlcmUgaXNcXG5hdCB0aGUgc3RhcnQgb2YgZGF5bGlnaHQgdGltZS4gIFBpY3R1cmUgVVMgRWFzdGVybiBmb3IgY29uY3JldGVuZXNzLiAgVGhlIHdhbGxcXG50aW1lIGp1bXBzIGZyb20gMTo1OSB0byAzOjAwLCBhbmQgd2FsbCBob3VycyBvZiB0aGUgZm9ybSAyOk1NIGRvbid0IG1ha2UgZ29vZFxcbnNlbnNlIHRoZW4uICBUaGUgZG9jcyBhc2sgdGhhdCBhbiBFYXN0ZXJuIHR6aW5mbyBjbGFzcyBjb25zaWRlciBzdWNoIGEgdGltZSB0b1xcbmJlIEVEVCAoYmVjYXVzZSBpdCdzIFxcXCJhZnRlciAyXFxcIiksIHdoaWNoIGlzIGEgcmVkdW5kYW50IHNwZWxsaW5nIG9mIDE6TU0gRVNUXFxub24gdGhlIGRheSBEU1Qgc3RhcnRzLiAgV2Ugd2FudCB0byByZXR1cm4gdGhlIDE6TU0gRVNUIHNwZWxsaW5nIGJlY2F1c2UgdGhhdCdzXFxudGhlIG9ubHkgc3BlbGxpbmcgdGhhdCBtYWtlcyBzZW5zZSBvbiB0aGUgbG9jYWwgd2FsbCBjbG9jay5cXG5cXG5JbiBmYWN0LCBpZiBbNV0gaG9sZHMgYXQgdGhpcyBwb2ludCwgd2UgZG8gaGF2ZSB0aGUgc3RhbmRhcmQtdGltZSBzcGVsbGluZyxcXG5idXQgdGhhdCB0YWtlcyBhIGJpdCBvZiBwcm9vZi4gIFdlIGZpcnN0IHByb3ZlIGEgc3Ryb25nZXIgcmVzdWx0LiAgV2hhdCdzIHRoZVxcbmRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgTEhTIGFuZCBSSFMgb2YgWzVdPyAgTGV0XFxuXFxuICAgIGRpZmYgPSB4Lm4gLSAoei5uIC0gei5vKSAgICAgICAgICAgICAgICAgICAgWzZdXFxuXFxuTm93XFxuICAgIHoubiA9ICAgICAgICAgICAgICAgICAgICAgICBieSBbNF1cXG4gICAgKHkgKyB5LnMpLm4gPSAgICAgICAgICAgICAgIGJ5ICM1XFxuICAgIHkubiArIHkucyA9ICAgICAgICAgICAgICAgICBzaW5jZSB5Lm4gPSB4Lm5cXG4gICAgeC5uICsgeS5zID0gICAgICAgICAgICAgICAgIHNpbmNlIHogYW5kIHkgYXJlIGhhdmUgdGhlIHNhbWUgdHppbmZvIG1lbWJlcixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LnMgPSB6LnMgYnkgIzJcXG4gICAgeC5uICsgei5zXFxuXFxuUGx1Z2dpbmcgdGhhdCBiYWNrIGludG8gWzZdIGdpdmVzXFxuXFxuICAgIGRpZmYgPVxcbiAgICB4Lm4gLSAoKHgubiArIHoucykgLSB6Lm8pID0gICAgIGV4cGFuZGluZ1xcbiAgICB4Lm4gLSB4Lm4gLSB6LnMgKyB6Lm8gPSAgICAgICAgIGNhbmNlbGxpbmdcXG4gICAgLSB6LnMgKyB6Lm8gPSAgICAgICAgICAgICAgICAgICBieSAjMlxcbiAgICB6LmRcXG5cXG5TbyBkaWZmID0gei5kLlxcblxcbklmIFs1XSBpcyB0cnVlIG5vdywgZGlmZiA9IDAsIHNvIHouZCA9IDAgdG9vLCBhbmQgd2UgaGF2ZSB0aGUgc3RhbmRhcmQtdGltZVxcbnNwZWxsaW5nIHdlIHdhbnRlZCBpbiB0aGUgZW5kY2FzZSBkZXNjcmliZWQgYWJvdmUuICBXZSdyZSBkb25lLiAgQ29udHJhcmlseSxcXG5pZiB6LmQgPSAwLCB0aGVuIHdlIGhhdmUgYSBVVEMgZXF1aXZhbGVudCwgYW5kIGFyZSBhbHNvIGRvbmUuXFxuXFxuSWYgWzVdIGlzIG5vdCB0cnVlIG5vdywgZGlmZiA9IHouZCAhPSAwLCBhbmQgei5kIGlzIHRoZSBvZmZzZXQgd2UgbmVlZCB0b1xcbmFkZCB0byB6IChpbiBlZmZlY3QsIHogaXMgaW4gdHoncyBzdGFuZGFyZCB0aW1lLCBhbmQgd2UgbmVlZCB0byBzaGlmdCB0aGVcXG5sb2NhbCBjbG9jayBpbnRvIHR6J3MgZGF5bGlnaHQgdGltZSkuXFxuXFxuTGV0XFxuXFxuICAgIHonID0geiArIHouZCA9IHogKyBkaWZmICAgICAgICAgICAgICAgICAgICAgWzddXFxuXFxuYW5kIHdlIGNhbiBhZ2FpbiBhc2sgd2hldGhlclxcblxcbiAgICB6Jy5uIC0geicubyA9IHgubiAgICAgICAgICAgICAgICAgICAgICAgICAgIFs4XVxcblxcbklmIHNvLCB3ZSdyZSBkb25lLiAgSWYgbm90LCB0aGUgdHppbmZvIGNsYXNzIGlzIGluc2FuZSwgYWNjb3JkaW5nIHRvIHRoZVxcbmFzc3VtcHRpb25zIHdlJ3ZlIG1hZGUuICBUaGlzIGFsc28gcmVxdWlyZXMgYSBiaXQgb2YgcHJvb2YuICBBcyBiZWZvcmUsIGxldCdzXFxuY29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBMSFMgYW5kIFJIUyBvZiBbOF0gKGFuZCBza2lwcGluZyBzb21lIG9mXFxudGhlIGp1c3RpZmljYXRpb25zIGZvciB0aGUga2luZHMgb2Ygc3Vic3RpdHV0aW9ucyB3ZSd2ZSBkb25lIHNldmVyYWwgdGltZXNcXG5hbHJlYWR5KTpcXG5cXG4gICAgZGlmZicgPSB4Lm4gLSAoeicubiAtIHonLm8pID0gICAgICAgICAgIHJlcGxhY2luZyB6Jy5uIHZpYSBbN11cXG4gICAgICAgICAgICB4Lm4gIC0gKHoubiArIGRpZmYgLSB6Jy5vKSA9ICAgIHJlcGxhY2luZyBkaWZmIHZpYSBbNl1cXG4gICAgICAgICAgICB4Lm4gLSAoei5uICsgeC5uIC0gKHoubiAtIHoubykgLSB6Jy5vKSA9XFxuICAgICAgICAgICAgeC5uIC0gei5uIC0geC5uICsgei5uIC0gei5vICsgeicubyA9ICAgIGNhbmNlbCB4Lm5cXG4gICAgICAgICAgICAtIHoubiArIHoubiAtIHoubyArIHonLm8gPSAgICAgICAgICAgICAgY2FuY2VsIHoublxcbiAgICAgICAgICAgIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICAgICAgICAgICMxIHR3aWNlXFxuICAgICAgICAgICAgLXoucyAtIHouZCArIHonLnMgKyB6Jy5kID0gICAgICAgICAgeiBhbmQgeicgaGF2ZSBzYW1lIHR6aW5mb1xcbiAgICAgICAgICAgIHonLmQgLSB6LmRcXG5cXG5TbyB6JyBpcyBVVEMtZXF1aXZhbGVudCB0byB4IGlmZiB6Jy5kID0gei5kIGF0IHRoaXMgcG9pbnQuICBJZiB0aGV5IGFyZSBlcXVhbCxcXG53ZSd2ZSBmb3VuZCB0aGUgVVRDLWVxdWl2YWxlbnQgc28gYXJlIGRvbmUuICBJbiBmYWN0LCB3ZSBzdG9wIHdpdGggWzddIGFuZFxcbnJldHVybiB6Jywgbm90IGJvdGhlcmluZyB0byBjb21wdXRlIHonLmQuXFxuXFxuSG93IGNvdWxkIHouZCBhbmQgeidkIGRpZmZlcj8gIHonID0geiArIHouZCBbN10sIHNvIG1lcmVseSBtb3ZpbmcgeicgYnlcXG5hIGRzdCgpIG9mZnNldCwgYW5kIHN0YXJ0aW5nICpmcm9tKiBhIHRpbWUgYWxyZWFkeSBpbiBEU1QgKHdlIGtub3cgei5kICE9IDApLFxcbndvdWxkIGhhdmUgdG8gY2hhbmdlIHRoZSByZXN1bHQgZHN0KCkgcmV0dXJuczogIHdlIHN0YXJ0IGluIERTVCwgYW5kIG1vdmluZ1xcbmEgbGl0dGxlIGZ1cnRoZXIgaW50byBpdCB0YWtlcyB1cyBvdXQgb2YgRFNULlxcblxcblRoZXJlIGlzbid0IGEgc2FuZSBjYXNlIHdoZXJlIHRoaXMgY2FuIGhhcHBlbi4gIFRoZSBjbG9zZXN0IGl0IGdldHMgaXMgYXRcXG50aGUgZW5kIG9mIERTVCwgd2hlcmUgdGhlcmUncyBhbiBob3VyIGluIFVUQyB3aXRoIG5vIHNwZWxsaW5nIGluIGEgaHlicmlkXFxudHppbmZvIGNsYXNzLiAgSW4gVVMgRWFzdGVybiwgdGhhdCdzIDU6TU0gVVRDID0gMDpNTSBFU1QgPSAxOk1NIEVEVC4gIER1cmluZ1xcbnRoYXQgaG91ciwgb24gYW4gRWFzdGVybiBjbG9jayAxOk1NIGlzIHRha2VuIGFzIGJlaW5nIGluIHN0YW5kYXJkIHRpbWUgKDY6TU1cXG5VVEMpIGJlY2F1c2UgdGhlIGRvY3MgaW5zaXN0IG9uIHRoYXQsIGJ1dCAwOk1NIGlzIHRha2VuIGFzIGJlaW5nIGluIGRheWxpZ2h0XFxudGltZSAoNDpNTSBVVEMpLiAgVGhlcmUgaXMgbm8gbG9jYWwgdGltZSBtYXBwaW5nIHRvIDU6TU0gVVRDLiAgVGhlIGxvY2FsXFxuY2xvY2sganVtcHMgZnJvbSAxOjU5IGJhY2sgdG8gMTowMCBhZ2FpbiwgYW5kIHJlcGVhdHMgdGhlIDE6TU0gaG91ciBpblxcbnN0YW5kYXJkIHRpbWUuICBTaW5jZSB0aGF0J3Mgd2hhdCB0aGUgbG9jYWwgY2xvY2sgKmRvZXMqLCB3ZSB3YW50IHRvIG1hcCBib3RoXFxuVVRDIGhvdXJzIDU6TU0gYW5kIDY6TU0gdG8gMTpNTSBFYXN0ZXJuLiAgVGhlIHJlc3VsdCBpcyBhbWJpZ3VvdXNcXG5pbiBsb2NhbCB0aW1lLCBidXQgc28gaXQgZ29lcyAtLSBpdCdzIHRoZSB3YXkgdGhlIGxvY2FsIGNsb2NrIHdvcmtzLlxcblxcbldoZW4geCA9IDU6TU0gVVRDIGlzIHRoZSBpbnB1dCB0byB0aGlzIGFsZ29yaXRobSwgeC5vPTAsIHkubz0tNSBhbmQgeS5kPTAsXFxuc28gej0wOk1NLiAgei5kPTYwIChtaW51dGVzKSB0aGVuLCBzbyBbNV0gZG9lc24ndCBob2xkIGFuZCB3ZSBrZWVwIGdvaW5nLlxcbnonID0geiArIHouZCA9IDE6TU0gdGhlbiwgYW5kIHonLmQ9MCwgYW5kIHonLmQgLSB6LmQgPSAtNjAgIT0gMCBzbyBbOF1cXG4oY29ycmVjdGx5KSBjb25jbHVkZXMgdGhhdCB6JyBpcyBub3QgVVRDLWVxdWl2YWxlbnQgdG8geC5cXG5cXG5CZWNhdXNlIHdlIGtub3cgei5kIHNhaWQgeiB3YXMgaW4gZGF5bGlnaHQgdGltZSAoZWxzZSBbNV0gd291bGQgaGF2ZSBoZWxkIGFuZFxcbndlIHdvdWxkIGhhdmUgc3RvcHBlZCB0aGVuKSwgYW5kIHdlIGtub3cgei5kICE9IHonLmQgKGVsc2UgWzhdIHdvdWxkIGhhdmUgaGVsZFxcbmFuZCB3ZSBoYXZlIHN0b3BwZWQgdGhlbiksIGFuZCB0aGVyZSBhcmUgb25seSAyIHBvc3NpYmxlIHZhbHVlcyBkc3QoKSBjYW5cXG5yZXR1cm4gaW4gRWFzdGVybiwgaXQgZm9sbG93cyB0aGF0IHonLmQgbXVzdCBiZSAwICh3aGljaCBpdCBpcyBpbiB0aGUgZXhhbXBsZSxcXG5idXQgdGhlIHJlYXNvbmluZyBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgZXhhbXBsZSAtLSBpdCBkZXBlbmRzIG9uIHRoZXJlIGJlaW5nXFxudHdvIHBvc3NpYmxlIGRzdCgpIG91dGNvbWVzLCBvbmUgemVybyBhbmQgdGhlIG90aGVyIG5vbi16ZXJvKS4gIFRoZXJlZm9yZVxcbnonIG11c3QgYmUgaW4gc3RhbmRhcmQgdGltZSwgYW5kIGlzIHRoZSBzcGVsbGluZyB3ZSB3YW50IGluIHRoaXMgY2FzZS5cXG5cXG5Ob3RlIGFnYWluIHRoYXQgeicgaXMgbm90IFVUQy1lcXVpdmFsZW50IGFzIGZhciBhcyB0aGUgaHlicmlkIHR6aW5mbyBjbGFzcyBpc1xcbmNvbmNlcm5lZCAoYmVjYXVzZSBpdCB0YWtlcyB6JyBhcyBiZWluZyBpbiBzdGFuZGFyZCB0aW1lIHJhdGhlciB0aGFuIHRoZVxcbmRheWxpZ2h0IHRpbWUgd2UgaW50ZW5kIGhlcmUpLCBidXQgcmV0dXJuaW5nIGl0IGdpdmVzIHRoZSByZWFsLWxpZmUgXFxcImxvY2FsXFxuY2xvY2sgcmVwZWF0cyBhbiBob3VyXFxcIiBiZWhhdmlvciB3aGVuIG1hcHBpbmcgdGhlIFxcXCJ1bnNwZWxsYWJsZVxcXCIgVVRDIGhvdXIgaW50b1xcbnR6LlxcblxcbldoZW4gdGhlIGlucHV0IGlzIDY6TU0sIHo9MTpNTSBhbmQgei5kPTAsIGFuZCB3ZSBzdG9wIGF0IG9uY2UsIGFnYWluIHdpdGhcXG50aGUgMTpNTSBzdGFuZGFyZCB0aW1lIHNwZWxsaW5nIHdlIHdhbnQuXFxuXFxuU28gaG93IGNhbiB0aGlzIGJyZWFrPyAgT25lIG9mIHRoZSBhc3N1bXB0aW9ucyBtdXN0IGJlIHZpb2xhdGVkLiAgVHdvXFxucG9zc2liaWxpdGllczpcXG5cXG4xKSBbMl0gZWZmZWN0aXZlbHkgc2F5cyB0aGF0IHkucyBpcyBpbnZhcmlhbnQgYWNyb3NzIGFsbCB5IGJlbG9uZyB0byBhIGdpdmVuXFxuICAgdGltZSB6b25lLiAgVGhpcyBpc24ndCB0cnVlIGlmLCBmb3IgcG9saXRpY2FsIHJlYXNvbnMgb3IgY29udGluZW50YWwgZHJpZnQsXFxuICAgYSByZWdpb24gZGVjaWRlcyB0byBjaGFuZ2UgaXRzIGJhc2Ugb2Zmc2V0IGZyb20gVVRDLlxcblxcbjIpIFRoZXJlIG1heSBiZSB2ZXJzaW9ucyBvZiBcXFwiZG91YmxlIGRheWxpZ2h0XFxcIiB0aW1lIHdoZXJlIHRoZSB0YWlsIGVuZCBvZlxcbiAgIHRoZSBhbmFseXNpcyBnaXZlcyB1cCBhIHN0ZXAgdG9vIGVhcmx5LiAgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgdGhhdFxcbiAgIGVub3VnaCB0byBzYXkuXFxuXFxuSW4gYW55IGNhc2UsIGl0J3MgY2xlYXIgdGhhdCB0aGUgZGVmYXVsdCBmcm9tdXRjKCkgaXMgc3Ryb25nIGVub3VnaCB0byBoYW5kbGVcXG5cXFwiYWxtb3N0IGFsbFxcXCIgdGltZSB6b25lczogIHNvIGxvbmcgYXMgdGhlIHN0YW5kYXJkIG9mZnNldCBpcyBpbnZhcmlhbnQsIGl0XFxuZG9lc24ndCBtYXR0ZXIgaWYgZGF5bGlnaHQgdGltZSB0cmFuc2l0aW9uIHBvaW50cyBjaGFuZ2UgZnJvbSB5ZWFyIHRvIHllYXIsIG9yXFxuaWYgZGF5bGlnaHQgdGltZSBpcyBza2lwcGVkIGluIHNvbWUgeWVhcnM7IGl0IGRvZXNuJ3QgbWF0dGVyIGhvdyBsYXJnZSBvclxcbnNtYWxsIGRzdCgpIG1heSBnZXQgd2l0aGluIGl0cyBib3VuZHM7IGFuZCBpdCBkb2Vzbid0IGV2ZW4gbWF0dGVyIGlmIHNvbWVcXG5wZXJ2ZXJzZSB0aW1lIHpvbmUgcmV0dXJucyBhIG5lZ2F0aXZlIGRzdCgpKS4gIFNvIGEgYnJlYWtpbmcgY2FzZSBtdXN0IGJlXFxucHJldHR5IGJpemFycmUsIGFuZCBhIHR6aW5mbyBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgZnJvbXV0YygpIGlmIGl0IGlzLlxcblxcXCJcXFwiXFxcIlxcblwiLFwic3JjL2xpYi9kYmhhc2gucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRiaGFzaCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RlY2ltYWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRlY2ltYWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaWZmbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkaWZmbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlyY2FjaGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpcmNhY2hlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaXN0dXRpbHMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpc3R1dGlscyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Rpc3R1dGlscy9jb21tYW5kL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21tYW5kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZXN0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RvY3Rlc3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRvY3Rlc3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kb2N1bWVudC5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGEsYj17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJkb2N1bWVudFxcXCIpfTtyZXR1cm4gYi5nZXRFbGVtZW50QnlJZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEudik7cmV0dXJuIGM/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY10pOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIuY3JlYXRlRWxlbWVudD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYS52KTtpZihjKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjXSl9KSxiLmdldEVsZW1lbnRzQnlUYWdOYW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGEudiksZD1bXSxlPWMubGVuZ3RoLTE7MDw9ZTtlLS0pZC5wdXNoKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NbZV1dKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoZCl9KSxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5nZXRFbGVtZW50c0J5TmFtZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5xdWVyeVNlbGVjdG9yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhLnYpO3JldHVybiBjP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NdKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxiLnF1ZXJ5U2VsZWN0b3JBbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5nZXRDdXJyZW50RWRpdG9yVmFsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKHZvaWQgMCE9PVNrLmRpdmlkJiZ2b2lkIDAhPT13aW5kb3cuZWRMaXN0KXtpZihTay5ncmFkZUNvbnRhaW5lciE9U2suZGl2aWQpe3ZhciBhPVNrLmdyYWRlQ29udGFpbmVyK1xcXCIgXFxcIitTay5kaXZpZDtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHdpbmRvdy5lZExpc3RbYV0uZWRpdG9yLmdldFZhbHVlKCkpfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIod2luZG93LmVkTGlzdFtTay5kaXZpZF0uZWRpdG9yLmdldFZhbHVlKCkpfXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJDYW4ndCBmaW5kIGVkaXRvciBmb3IgdGhpcyBkaXZcXFwiKX0pLGIuY3VycmVudERpdj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09U2suZGl2aWQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5kaXZpZCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXFxcIlRoZXJlIGlzIG5vIHZhbHVlIHNldCBmb3IgZGl2aWRcXFwiKX0pLGIuY3VycmVudENvdXJzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09ZUJvb2tDb25maWcpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlQm9va0NvbmZpZy5jb3Vyc2UpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJUaGVyZSBpcyBubyBjb3Vyc2VcXFwiKX0pLGIuY3VycmVudEdyYWRpbmdDb250YWluZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKHZvaWQgMCE9PVNrLmdyYWRlQ29udGFpbmVyKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suZ3JhZGVDb250YWluZXIpO2lmKG51bGwhPVNrLmRpdmlkKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suZGl2aWQpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJUaGVyZSBpcyBubyB2YWx1ZSBzZXQgZm9yIGdyYWRpbmdcXFwiKX0pLGE9ZnVuY3Rpb24oYSxjKXtjLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9YixhLmlubmVySFRNTD1iLmlubmVySFRNTCxhLmlubmVyVGV4dD1iLmlubmVyVGV4dCx2b2lkIDAhPT1iLnZhbHVlJiYoYS52YWx1ZT1iLnZhbHVlLFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcInZhbHVlXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKGEudmFsdWUpKSksdm9pZCAwIT09Yi5jaGVja2VkJiYoYS5jaGVja2VkPWIuY2hlY2tlZCxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJjaGVja2VkXFxcIiksU2suYnVpbHRpbi5ib29sKGEuY2hlY2tlZCkpKSxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lckhUTUxcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYS5pbm5lckhUTUwpKSxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lclRleHRcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYS5pbm5lclRleHQpKX0pLGMudHAkZ2V0YXR0cj1Tay5nZW5lcmljLmdldEF0dHIsYy5fX3NldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImlubmVySFRNTFxcXCI9PT1iJiYoYS5pbm5lckhUTUw9YyxhLnYuaW5uZXJIVE1MPWMudixTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lckhUTUxcXFwiKSxjKSksXFxcImlubmVyVGV4dFxcXCI9PT1iJiYoYS5pbm5lclRleHQ9YyxhLnYuaW5uZXJUZXh0PWMudixTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lclRleHRcXFwiKSxjKSl9KSxjLmFwcGVuZENoaWxkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYuYXBwZW5kQ2hpbGQoYi52KX0pLGMucmVtb3ZlQ2hpbGQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5yZW1vdmVDaGlsZChiLnYpfSksYy5jbG9zZXN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgZD1hLnYuY2xvc2VzdChjLnYpO3JldHVybiBkP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2RdKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLmdldENTUz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhLnYuc3R5bGVbYi52XSl9KSxjLnNldENTUz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLnYuc3R5bGVbYi52XT1jLnZ9KSxjLmdldEF0dHJpYnV0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LmdldEF0dHJpYnV0ZShiLnYpO3JldHVybiBjP25ldyBTay5idWlsdGluLnN0cihjKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLnNldEF0dHJpYnV0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLnYuc2V0QXR0cmlidXRlKGIudixjLnYpfSksYy5nZXRQcm9wZXJ0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52W2Iudl07cmV0dXJuIGM/bmV3IFNrLmJ1aWx0aW4uc3RyKGMpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuX19zdHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBjb25zb2xlLmxvZyhhLnYudGFnTmFtZSksbmV3IFNrLmJ1aWx0aW4uc3RyKGEudi50YWdOYW1lKX0pLGMuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIltET00gRWxlbWVudF1cXFwiKX0pfSxiLkVsZW1lbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhiLGEsXFxcIkVsZW1lbnRcXFwiLFtdKSxifTtcIixcInNyYy9saWIvZHVtYmRibS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZHVtYmRibSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2R1bW15X3RocmVhZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZHVtbXlfdGhyZWFkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZHVtbXlfdGhyZWFkaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1teV90aHJlYWRpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbWFpbC9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZW1haWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbWFpbC9taW1lL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1lIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZW1haWwvdGVzdC9kYXRhL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkYXRhIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZW5jb2RpbmdzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJlbmNvZGluZ3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9maWxlY21wLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmaWxlY21wIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZmlsZWlucHV0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmaWxlaW5wdXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mbm1hdGNoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmbm1hdGNoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZm9ybWF0dGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmb3JtYXR0ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mcGZvcm1hdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnBmb3JtYXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mcmFjdGlvbnMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZyYWN0aW9ucyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Z0cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnRwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZnVuY3Rvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmdW5jdG9vbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZW5lcmljcGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2VuZXJpY3BhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZXRvcHQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdldG9wdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2dldHBhc3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdldHBhc3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZXR0ZXh0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJnZXR0ZXh0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZ2xvYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2xvYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2d6aXAucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImd6aXAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9oYXNobGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJoYXNobGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaGVhcHEucHlcIjpcIlxcXCJcXFwiXFxcIkhlYXAgcXVldWUgYWxnb3JpdGhtIChhLmsuYS4gcHJpb3JpdHkgcXVldWUpLlxcblxcbkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXFxuYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxcbm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZ1xcbnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxcblxcblVzYWdlOlxcblxcbmhlYXAgPSBbXSAgICAgICAgICAgICMgY3JlYXRlcyBhbiBlbXB0eSBoZWFwXFxuaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcFxcbml0ZW0gPSBoZWFwcG9wKGhlYXApICMgcG9wcyB0aGUgc21hbGxlc3QgaXRlbSBmcm9tIHRoZSBoZWFwXFxuaXRlbSA9IGhlYXBbMF0gICAgICAgIyBzbWFsbGVzdCBpdGVtIG9uIHRoZSBoZWFwIHdpdGhvdXQgcG9wcGluZyBpdFxcbmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWVcXG5pdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkgIyBwb3BzIGFuZCByZXR1cm5zIHNtYWxsZXN0IGl0ZW0sIGFuZCBhZGRzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmV3IGl0ZW07IHRoZSBoZWFwIHNpemUgaXMgdW5jaGFuZ2VkXFxuXFxuT3VyIEFQSSBkaWZmZXJzIGZyb20gdGV4dGJvb2sgaGVhcCBhbGdvcml0aG1zIGFzIGZvbGxvd3M6XFxuXFxuLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZVxcbiAgaW5kZXggZm9yIGEgbm9kZSBhbmQgdGhlIGluZGV4ZXMgZm9yIGl0cyBjaGlsZHJlbiBzbGlnaHRseSBsZXNzXFxuICBvYnZpb3VzLCBidXQgaXMgbW9yZSBzdWl0YWJsZSBzaW5jZSBQeXRob24gdXNlcyAwLWJhc2VkIGluZGV4aW5nLlxcblxcbi0gT3VyIGhlYXBwb3AoKSBtZXRob2QgcmV0dXJucyB0aGUgc21hbGxlc3QgaXRlbSwgbm90IHRoZSBsYXJnZXN0LlxcblxcblRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0XFxud2l0aG91dCBzdXJwcmlzZXM6IGhlYXBbMF0gaXMgdGhlIHNtYWxsZXN0IGl0ZW0sIGFuZCBoZWFwLnNvcnQoKVxcbm1haW50YWlucyB0aGUgaGVhcCBpbnZhcmlhbnQhXFxuXFxcIlxcXCJcXFwiXFxuXFxuIyBPcmlnaW5hbCBjb2RlIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycyBhbmQgUmF5bW9uZCBIZXR0aW5nZXJcXG5cXG5fX2Fib3V0X18gPSBcXFwiXFxcIlxcXCJIZWFwIHF1ZXVlc1xcblxcbltleHBsYW5hdGlvbiBieSBGcmFuw6dvaXMgUGluYXJkXVxcblxcbkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXFxuYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxcbm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZ1xcbnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxcblxcblRoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5XFxucmVwcmVzZW50YXRpb24gZm9yIGEgdG91cm5hbWVudC4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSBgaycsIG5vdCBhW2tdOlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMFxcblxcbiAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXFxuXFxuICAgICAgICAgIDMgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICA2XFxuXFxuICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNFxcblxcbiAgICAxNSAxNiAgIDE3IDE4ICAgMTkgMjAgICAyMSAyMiAgIDIzIDI0ICAgMjUgMjYgICAyNyAyOCAgIDI5IDMwXFxuXFxuXFxuSW4gdGhlIHRyZWUgYWJvdmUsIGVhY2ggY2VsbCBgaycgaXMgdG9wcGluZyBgMiprKzEnIGFuZCBgMiprKzInLiAgSW5cXG5hIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyXFxub3ZlciB0aGUgdHdvIGNlbGxzIGl0IHRvcHMsIGFuZCB3ZSBjYW4gdHJhY2UgdGhlIHdpbm5lciBkb3duIHRoZSB0cmVlXFxudG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9uc1xcbm9mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLlxcblRvIGJlIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgd2hlbiBhIHdpbm5lciBpcyBwcm9tb3RlZCwgd2UgdHJ5IHRvXFxucmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lc1xcbnRoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsXFxuYnV0IHRoZSB0b3AgY2VsbCBcXFwid2luc1xcXCIgb3ZlciB0aGUgdHdvIHRvcHBlZCBjZWxscy5cXG5cXG5JZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5XFxudGhlIG92ZXJhbGwgd2lubmVyLiAgVGhlIHNpbXBsZXN0IGFsZ29yaXRobWljIHdheSB0byByZW1vdmUgaXQgYW5kXFxuZmluZCB0aGUgXFxcIm5leHRcXFwiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZVxcbmRpYWdyYW0gYWJvdmUpIGludG8gdGhlIDAgcG9zaXRpb24sIGFuZCB0aGVuIHBlcmNvbGF0ZSB0aGlzIG5ldyAwIGRvd25cXG50aGUgdHJlZSwgZXhjaGFuZ2luZyB2YWx1ZXMsIHVudGlsIHRoZSBpbnZhcmlhbnQgaXMgcmUtZXN0YWJsaXNoZWQuXFxuVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuXFxuQnkgaXRlcmF0aW5nIG92ZXIgYWxsIGl0ZW1zLCB5b3UgZ2V0IGFuIE8obiBsbiBuKSBzb3J0LlxcblxcbkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ld1xcbml0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmVcXG5ub3QgXFxcImJldHRlclxcXCIgdGhhbiB0aGUgbGFzdCAwJ3RoIGVsZW1lbnQgeW91IGV4dHJhY3RlZC4gIFRoaXMgaXNcXG5lc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGxcXG5pbmNvbWluZyBldmVudHMsIGFuZCB0aGUgXFxcIndpblxcXCIgY29uZGl0aW9uIG1lYW5zIHRoZSBzbWFsbGVzdCBzY2hlZHVsZWRcXG50aW1lLiAgV2hlbiBhbiBldmVudCBzY2hlZHVsZSBvdGhlciBldmVudHMgZm9yIGV4ZWN1dGlvbiwgdGhleSBhcmVcXG5zY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhXFxuaGVhcCBpcyBhIGdvb2Qgc3RydWN0dXJlIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyAodGhpcyBpcyB3aGF0IElcXG51c2VkIGZvciBteSBNSURJIHNlcXVlbmNlciA6LSkuXFxuXFxuVmFyaW91cyBzdHJ1Y3R1cmVzIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyBoYXZlIGJlZW4gZXh0ZW5zaXZlbHlcXG5zdHVkaWVkLCBhbmQgaGVhcHMgYXJlIGdvb2QgZm9yIHRoaXMsIGFzIHRoZXkgYXJlIHJlYXNvbmFibHkgc3BlZWR5LFxcbnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnRcXG50aGFuIHRoZSBhdmVyYWdlIGNhc2UuICBIb3dldmVyLCB0aGVyZSBhcmUgb3RoZXIgcmVwcmVzZW50YXRpb25zIHdoaWNoXFxuYXJlIG1vcmUgZWZmaWNpZW50IG92ZXJhbGwsIHlldCB0aGUgd29yc3QgY2FzZXMgbWlnaHQgYmUgdGVycmlibGUuXFxuXFxuSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGxcXG5rbm93IHRoYXQgYSBiaWcgc29ydCBpbXBsaWVzIHByb2R1Y2luZyBcXFwicnVuc1xcXCIgKHdoaWNoIGFyZSBwcmUtc29ydGVkXFxuc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLFxcbmZvbGxvd2VkIGJ5IGEgbWVyZ2luZyBwYXNzZXMgZm9yIHRoZXNlIHJ1bnMsIHdoaWNoIG1lcmdpbmcgaXMgb2Z0ZW5cXG52ZXJ5IGNsZXZlcmx5IG9yZ2FuaXNlZFsxXS4gIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlIGluaXRpYWxcXG5zb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheVxcbnRvIHRoYXQuICBJZiwgdXNpbmcgYWxsIHRoZSBtZW1vcnkgYXZhaWxhYmxlIHRvIGhvbGQgYSB0b3VybmFtZW50LCB5b3VcXG5yZXBsYWNlIGFuZCBwZXJjb2xhdGUgaXRlbXMgdGhhdCBoYXBwZW4gdG8gZml0IHRoZSBjdXJyZW50IHJ1biwgeW91J2xsXFxucHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsXFxuYW5kIG11Y2ggYmV0dGVyIGZvciBpbnB1dCBmdXp6aWx5IG9yZGVyZWQuXFxuXFxuTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2hcXG5tYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSBcXFwid2luc1xcXCIgb3ZlclxcbnRoZSBsYXN0IG91dHB1dCB2YWx1ZSksIGl0IGNhbm5vdCBmaXQgaW4gdGhlIGhlYXAsIHNvIHRoZSBzaXplIG9mIHRoZVxcbmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHlcXG5mb3IgcHJvZ3Jlc3NpdmVseSBidWlsZGluZyBhIHNlY29uZCBoZWFwLCB3aGljaCBncm93cyBhdCBleGFjdGx5IHRoZVxcbnNhbWUgcmF0ZSB0aGUgZmlyc3QgaGVhcCBpcyBtZWx0aW5nLiAgV2hlbiB0aGUgZmlyc3QgaGVhcCBjb21wbGV0ZWx5XFxudmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGVcXG5lZmZlY3RpdmUhXFxuXFxuSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluXFxuYSBmZXcgYXBwbGljYXRpb25zLCBhbmQgSSB0aGluayBpdCBpcyBnb29kIHRvIGtlZXAgYSBgaGVhcCcgbW9kdWxlXFxuYXJvdW5kLiA6LSlcXG5cXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblsxXSBUaGUgZGlzayBiYWxhbmNpbmcgYWxnb3JpdGhtcyB3aGljaCBhcmUgY3VycmVudCwgbm93YWRheXMsIGFyZVxcbm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmdcXG5jYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWdcXG50YXBlIGRyaXZlcywgdGhlIHN0b3J5IHdhcyBxdWl0ZSBkaWZmZXJlbnQsIGFuZCBvbmUgaGFkIHRvIGJlIHZlcnlcXG5jbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGVcXG5tb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0XFxuXFxcInByb2dyZXNzaW5nXFxcIiB0aGUgbWVyZ2UpLiAgU29tZSB0YXBlcyB3ZXJlIGV2ZW4gYWJsZSB0byByZWFkXFxuYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS5cXG5CZWxpZXZlIG1lLCByZWFsIGdvb2QgdGFwZSBzb3J0cyB3ZXJlIHF1aXRlIHNwZWN0YWN1bGFyIHRvIHdhdGNoIVxcbkZyb20gYWxsIHRpbWVzLCBzb3J0aW5nIGhhcyBhbHdheXMgYmVlbiBhIEdyZWF0IEFydCEgOi0pXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFsnaGVhcHB1c2gnLCAnaGVhcHBvcCcsICdoZWFwaWZ5JywgJ2hlYXByZXBsYWNlJyxcXG4gICAgICAgICAgICdubGFyZ2VzdCcsICduc21hbGxlc3QnLCAnaGVhcHB1c2hwb3AnXVxcblxcbmRlZiBoZWFwcHVzaChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxcXCJcXFwiXFxcIlxcbiAgICBoZWFwLmFwcGVuZChpdGVtKVxcbiAgICBfc2lmdGRvd24oaGVhcCwgMCwgbGVuKGhlYXApLTEpXFxuXFxuZGVmIGhlYXBwb3AoaGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC5cXFwiXFxcIlxcXCJcXG4gICAgbGFzdGVsdCA9IGhlYXAucG9wKCkgICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5XFxuICAgIGlmIGhlYXA6XFxuICAgICAgICByZXR1cm5pdGVtID0gaGVhcFswXVxcbiAgICAgICAgaGVhcFswXSA9IGxhc3RlbHRcXG4gICAgICAgIF9zaWZ0dXAoaGVhcCwgMClcXG4gICAgICAgIHJldHVybiByZXR1cm5pdGVtXFxuICAgIHJldHVybiBsYXN0ZWx0XFxuXFxuZGVmIGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pOlxcbiAgICBcXFwiXFxcIlxcXCJQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uXFxuXFxuICAgIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBoZWFwcG9wKCkgZm9sbG93ZWQgYnkgaGVhcHB1c2goKSwgYW5kIGNhbiBiZVxcbiAgICBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgYSBmaXhlZC1zaXplIGhlYXAuICBOb3RlIHRoYXQgdGhlIHZhbHVlXFxuICAgIHJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZlxcbiAgICB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OlxcblxcbiAgICAgICAgaWYgaXRlbSA+IGhlYXBbMF06XFxuICAgICAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaGVhcFswXSA9IGl0ZW1cXG4gICAgX3NpZnR1cChoZWFwLCAwKVxcbiAgICByZXR1cm4gcmV0dXJuaXRlbVxcblxcbmRlZiBoZWFwcHVzaHBvcChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiRmFzdCB2ZXJzaW9uIG9mIGEgaGVhcHB1c2ggZm9sbG93ZWQgYnkgYSBoZWFwcG9wLlxcXCJcXFwiXFxcIlxcbiAgICBpZiBoZWFwIGFuZCBoZWFwWzBdIDwgaXRlbTpcXG4gICAgICAgIGl0ZW0sIGhlYXBbMF0gPSBoZWFwWzBdLCBpdGVtXFxuICAgICAgICBfc2lmdHVwKGhlYXAsIDApXFxuICAgIHJldHVybiBpdGVtXFxuXFxuZGVmIGhlYXBpZnkoeCk6XFxuICAgIFxcXCJcXFwiXFxcIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oeCkpIHRpbWUuXFxcIlxcXCJcXFwiXFxuICAgIG4gPSBsZW4oeClcXG4gICAgIyBUcmFuc2Zvcm0gYm90dG9tLXVwLiAgVGhlIGxhcmdlc3QgaW5kZXggdGhlcmUncyBhbnkgcG9pbnQgdG8gbG9va2luZyBhdFxcbiAgICAjIGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdCBoYXZlIDIqaSArIDEgPCBuLFxcbiAgICAjIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzICgyKmotMSkvMiA9IGotMS8yIHNvXFxuICAgICMgai0xIGlzIHRoZSBsYXJnZXN0LCB3aGljaCBpcyBuLy8yIC0gMS4gIElmIG4gaXMgb2RkID0gMipqKzEsIHRoaXMgaXNcXG4gICAgIyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LCBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS5cXG4gICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2Uobi8vMikpOlxcbiAgICAgICAgX3NpZnR1cCh4LCBpKVxcblxcbmRlZiBfaGVhcHBvcF9tYXgoaGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIk1heGhlYXAgdmVyc2lvbiBvZiBhIGhlYXBwb3AuXFxcIlxcXCJcXFwiXFxuICAgIGxhc3RlbHQgPSBoZWFwLnBvcCgpICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eVxcbiAgICBpZiBoZWFwOlxcbiAgICAgICAgcmV0dXJuaXRlbSA9IGhlYXBbMF1cXG4gICAgICAgIGhlYXBbMF0gPSBsYXN0ZWx0XFxuICAgICAgICBfc2lmdHVwX21heChoZWFwLCAwKVxcbiAgICAgICAgcmV0dXJuIHJldHVybml0ZW1cXG4gICAgcmV0dXJuIGxhc3RlbHRcXG5cXG5kZWYgX2hlYXByZXBsYWNlX21heChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiTWF4aGVhcCB2ZXJzaW9uIG9mIGEgaGVhcHBvcCBmb2xsb3dlZCBieSBhIGhlYXBwdXNoLlxcXCJcXFwiXFxcIlxcbiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaGVhcFswXSA9IGl0ZW1cXG4gICAgX3NpZnR1cF9tYXgoaGVhcCwgMClcXG4gICAgcmV0dXJuIHJldHVybml0ZW1cXG5cXG5kZWYgX2hlYXBpZnlfbWF4KHgpOlxcbiAgICBcXFwiXFxcIlxcXCJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgbWF4aGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKHgpKSB0aW1lLlxcXCJcXFwiXFxcIlxcbiAgICBuID0gbGVuKHgpXFxuICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKG4vLzIpKTpcXG4gICAgICAgIF9zaWZ0dXBfbWF4KHgsIGkpXFxuXFxuIyAnaGVhcCcgaXMgYSBoZWFwIGF0IGFsbCBpbmRpY2VzID49IHN0YXJ0cG9zLCBleGNlcHQgcG9zc2libHkgZm9yIHBvcy4gIHBvc1xcbiMgaXMgdGhlIGluZGV4IG9mIGEgbGVhZiB3aXRoIGEgcG9zc2libHkgb3V0LW9mLW9yZGVyIHZhbHVlLiAgUmVzdG9yZSB0aGVcXG4jIGhlYXAgaW52YXJpYW50LlxcbmRlZiBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcyk6XFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZyBhIHBsYWNlXFxuICAgICMgbmV3aXRlbSBmaXRzLlxcbiAgICB3aGlsZSBwb3MgPiBzdGFydHBvczpcXG4gICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxXFxuICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc11cXG4gICAgICAgIGlmIG5ld2l0ZW0gPCBwYXJlbnQ6XFxuICAgICAgICAgICAgaGVhcFtwb3NdID0gcGFyZW50XFxuICAgICAgICAgICAgcG9zID0gcGFyZW50cG9zXFxuICAgICAgICAgICAgY29udGludWVcXG4gICAgICAgIGJyZWFrXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG5cXG4jIFRoZSBjaGlsZCBpbmRpY2VzIG9mIGhlYXAgaW5kZXggcG9zIGFyZSBhbHJlYWR5IGhlYXBzLCBhbmQgd2Ugd2FudCB0byBtYWtlXFxuIyBhIGhlYXAgYXQgaW5kZXggcG9zIHRvby4gIFdlIGRvIHRoaXMgYnkgYnViYmxpbmcgdGhlIHNtYWxsZXIgY2hpbGQgb2ZcXG4jIHBvcyB1cCAoYW5kIHNvIG9uIHdpdGggdGhhdCBjaGlsZCdzIGNoaWxkcmVuLCBldGMpIHVudGlsIGhpdHRpbmcgYSBsZWFmLFxcbiMgdGhlbiB1c2luZyBfc2lmdGRvd24gdG8gbW92ZSB0aGUgb2RkYmFsbCBvcmlnaW5hbGx5IGF0IGluZGV4IHBvcyBpbnRvIHBsYWNlLlxcbiNcXG4jIFdlICpjb3VsZCogYnJlYWsgb3V0IG9mIHRoZSBsb29wIGFzIHNvb24gYXMgd2UgZmluZCBhIHBvcyB3aGVyZSBuZXdpdGVtIDw9XFxuIyBib3RoIGl0cyBjaGlsZHJlbiwgYnV0IHR1cm5zIG91dCB0aGF0J3Mgbm90IGEgZ29vZCBpZGVhLCBhbmQgZGVzcGl0ZSB0aGF0XFxuIyBtYW55IGJvb2tzIHdyaXRlIHRoZSBhbGdvcml0aG0gdGhhdCB3YXkuICBEdXJpbmcgYSBoZWFwIHBvcCwgdGhlIGxhc3QgYXJyYXlcXG4jIGVsZW1lbnQgaXMgc2lmdGVkIGluLCBhbmQgdGhhdCB0ZW5kcyB0byBiZSBsYXJnZSwgc28gdGhhdCBjb21wYXJpbmcgaXRcXG4jIGFnYWluc3QgdmFsdWVzIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgdXN1YWxseSBkb2Vzbid0IHBheSAoPSB1c3VhbGx5IGRvZXNuJ3RcXG4jIGdldCB1cyBvdXQgb2YgdGhlIGxvb3AgZWFybHkpLiAgU2VlIEtudXRoLCBWb2x1bWUgMywgd2hlcmUgdGhpcyBpc1xcbiMgZXhwbGFpbmVkIGFuZCBxdWFudGlmaWVkIGluIGFuIGV4ZXJjaXNlLlxcbiNcXG4jIEN1dHRpbmcgdGhlICMgb2YgY29tcGFyaXNvbnMgaXMgaW1wb3J0YW50LCBzaW5jZSB0aGVzZSByb3V0aW5lcyBoYXZlIG5vXFxuIyB3YXkgdG8gZXh0cmFjdCBcXFwidGhlIHByaW9yaXR5XFxcIiBmcm9tIGFuIGFycmF5IGVsZW1lbnQsIHNvIHRoYXQgaW50ZWxsaWdlbmNlXFxuIyBpcyBsaWtlbHkgdG8gYmUgaGlkaW5nIGluIGN1c3RvbSBjb21wYXJpc29uIG1ldGhvZHMsIG9yIGluIGFycmF5IGVsZW1lbnRzXFxuIyBzdG9yaW5nIChwcmlvcml0eSwgcmVjb3JkKSB0dXBsZXMuICBDb21wYXJpc29ucyBhcmUgdGh1cyBwb3RlbnRpYWxseVxcbiMgZXhwZW5zaXZlLlxcbiNcXG4jIE9uIHJhbmRvbSBhcnJheXMgb2YgbGVuZ3RoIDEwMDAsIG1ha2luZyB0aGlzIGNoYW5nZSBjdXQgdGhlIG51bWJlciBvZlxcbiMgY29tcGFyaXNvbnMgbWFkZSBieSBoZWFwaWZ5KCkgYSBsaXR0bGUsIGFuZCB0aG9zZSBtYWRlIGJ5IGV4aGF1c3RpdmVcXG4jIGhlYXBwb3AoKSBhIGxvdCwgaW4gYWNjb3JkIHdpdGggdGhlb3J5LiAgSGVyZSBhcmUgdHlwaWNhbCByZXN1bHRzIGZyb20gM1xcbiMgcnVucyAoMyBqdXN0IHRvIGRlbW9uc3RyYXRlIGhvdyBzbWFsbCB0aGUgdmFyaWFuY2UgaXMpOlxcbiNcXG4jIENvbXBhcmVzIG5lZWRlZCBieSBoZWFwaWZ5ICAgICBDb21wYXJlcyBuZWVkZWQgYnkgMTAwMCBoZWFwcG9wc1xcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuIyAxODM3IGN1dCB0byAxNjYzICAgICAgICAgICAgICAgMTQ5OTYgY3V0IHRvIDg2ODBcXG4jIDE4NTUgY3V0IHRvIDE2NTkgICAgICAgICAgICAgICAxNDk2NiBjdXQgdG8gODY3OFxcbiMgMTg0NyBjdXQgdG8gMTY2MCAgICAgICAgICAgICAgIDE1MDI0IGN1dCB0byA4NzAzXFxuI1xcbiMgQnVpbGRpbmcgdGhlIGhlYXAgYnkgdXNpbmcgaGVhcHB1c2goKSAxMDAwIHRpbWVzIGluc3RlYWQgcmVxdWlyZWRcXG4jIDIxOTgsIDIxNDgsIGFuZCAyMjE5IGNvbXBhcmVzOiAgaGVhcGlmeSgpIGlzIG1vcmUgZWZmaWNpZW50LCB3aGVuXFxuIyB5b3UgY2FuIHVzZSBpdC5cXG4jXFxuIyBUaGUgdG90YWwgY29tcGFyZXMgbmVlZGVkIGJ5IGxpc3Quc29ydCgpIG9uIHRoZSBzYW1lIGxpc3RzIHdlcmUgODYyNyxcXG4jIDg2MjcsIGFuZCA4NjMyICh0aGlzIHNob3VsZCBiZSBjb21wYXJlZCB0byB0aGUgc3VtIG9mIGhlYXBpZnkoKSBhbmRcXG4jIGhlYXBwb3AoKSBjb21wYXJlcyk6ICBsaXN0LnNvcnQoKSBpcyAodW5zdXJwcmlzaW5nbHkhKSBtb3JlIGVmZmljaWVudFxcbiMgZm9yIHNvcnRpbmcuXFxuXFxuZGVmIF9zaWZ0dXAoaGVhcCwgcG9zKTpcXG4gICAgZW5kcG9zID0gbGVuKGhlYXApXFxuICAgIHN0YXJ0cG9zID0gcG9zXFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuXFxuICAgIGNoaWxkcG9zID0gMipwb3MgKyAxICAgICMgbGVmdG1vc3QgY2hpbGQgcG9zaXRpb25cXG4gICAgd2hpbGUgY2hpbGRwb3MgPCBlbmRwb3M6XFxuICAgICAgICAjIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLlxcbiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDFcXG4gICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgaGVhcFtjaGlsZHBvc10gPCBoZWFwW3JpZ2h0cG9zXTpcXG4gICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zXFxuICAgICAgICAjIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuXFxuICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXVxcbiAgICAgICAgcG9zID0gY2hpbGRwb3NcXG4gICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxXFxuICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwXFxuICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG4gICAgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpXFxuXFxuZGVmIF9zaWZ0ZG93bl9tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcyk6XFxuICAgICdNYXhoZWFwIHZhcmlhbnQgb2YgX3NpZnRkb3duJ1xcbiAgICBuZXdpdGVtID0gaGVhcFtwb3NdXFxuICAgICMgRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcgYSBwbGFjZVxcbiAgICAjIG5ld2l0ZW0gZml0cy5cXG4gICAgd2hpbGUgcG9zID4gc3RhcnRwb3M6XFxuICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMVxcbiAgICAgICAgcGFyZW50ID0gaGVhcFtwYXJlbnRwb3NdXFxuICAgICAgICBpZiBwYXJlbnQgPCBuZXdpdGVtOlxcbiAgICAgICAgICAgIGhlYXBbcG9zXSA9IHBhcmVudFxcbiAgICAgICAgICAgIHBvcyA9IHBhcmVudHBvc1xcbiAgICAgICAgICAgIGNvbnRpbnVlXFxuICAgICAgICBicmVha1xcbiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtXFxuXFxuZGVmIF9zaWZ0dXBfbWF4KGhlYXAsIHBvcyk6XFxuICAgICdNYXhoZWFwIHZhcmlhbnQgb2YgX3NpZnR1cCdcXG4gICAgZW5kcG9zID0gbGVuKGhlYXApXFxuICAgIHN0YXJ0cG9zID0gcG9zXFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBCdWJibGUgdXAgdGhlIGxhcmdlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi5cXG4gICAgY2hpbGRwb3MgPSAyKnBvcyArIDEgICAgIyBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvblxcbiAgICB3aGlsZSBjaGlsZHBvcyA8IGVuZHBvczpcXG4gICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIGxhcmdlciBjaGlsZC5cXG4gICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxXFxuICAgICAgICBpZiByaWdodHBvcyA8IGVuZHBvcyBhbmQgbm90IGhlYXBbcmlnaHRwb3NdIDwgaGVhcFtjaGlsZHBvc106XFxuICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvc1xcbiAgICAgICAgIyBNb3ZlIHRoZSBsYXJnZXIgY2hpbGQgdXAuXFxuICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXVxcbiAgICAgICAgcG9zID0gY2hpbGRwb3NcXG4gICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxXFxuICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwXFxuICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG4gICAgX3NpZnRkb3duX21heChoZWFwLCBzdGFydHBvcywgcG9zKVxcblxcblxcbiMgQWxnb3JpdGhtIG5vdGVzIGZvciBubGFyZ2VzdCgpIGFuZCBuc21hbGxlc3QoKVxcbiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbiNcXG4jIE1ha2UgYSBzaW5nbGUgcGFzcyBvdmVyIHRoZSBkYXRhIHdoaWxlIGtlZXBpbmcgdGhlIGsgbW9zdCBleHRyZW1lIHZhbHVlc1xcbiMgaW4gYSBoZWFwLiAgTWVtb3J5IGNvbnN1bXB0aW9uIGlzIGxpbWl0ZWQgdG8ga2VlcGluZyBrIHZhbHVlcyBpbiBhIGxpc3QuXFxuI1xcbiMgTWVhc3VyZWQgcGVyZm9ybWFuY2UgZm9yIHJhbmRvbSBpbnB1dHM6XFxuI1xcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBjb21wYXJpc29uc1xcbiMgICAgbiBpbnB1dHMgICAgIGstZXh0cmVtZSB2YWx1ZXMgIChhdmVyYWdlIG9mIDUgdHJpYWxzKSAgICUgbW9yZSB0aGFuIG1pbigpXFxuIyAtLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS1cXG4jICAgICAgMSwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAgIDMsMzE3ICAgICAgICAgICAgICAgMjMxLjclXFxuIyAgICAgMTAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgICAgIDE0LDA0NiAgICAgICAgICAgICAgICA0MC41JVxcbiMgICAgMTAwLDAwMCAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgIDEwNSw3NDkgICAgICAgICAgICAgICAgIDUuNyVcXG4jICAxLDAwMCwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgMSwwMDcsNzUxICAgICAgICAgICAgICAgICAwLjglXFxuIyAxMCwwMDAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgMTAsMDA5LDQwMSAgICAgICAgICAgICAgICAgMC4xJVxcbiNcXG4jIFRoZW9yZXRpY2FsIG51bWJlciBvZiBjb21wYXJpc29ucyBmb3IgayBzbWFsbGVzdCBvZiBuIHJhbmRvbSBpbnB1dHM6XFxuI1xcbiMgU3RlcCAgIENvbXBhcmlzb25zICAgICAgICAgICAgICAgICAgQWN0aW9uXFxuIyAtLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4jICAxICAgICAxLjY2ICogayAgICAgICAgICAgICAgICAgICAgIGhlYXBpZnkgdGhlIGZpcnN0IGstaW5wdXRzXFxuIyAgMiAgICAgbiAtIGsgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlIHJlbWFpbmluZyBlbGVtZW50cyB0byB0b3Agb2YgaGVhcFxcbiMgIDMgICAgIGsgKiAoMSArIGxnMihrKSkgKiBsbihuL2spICAgcmVwbGFjZSB0aGUgdG9wbW9zdCB2YWx1ZSBvbiB0aGUgaGVhcFxcbiMgIDQgICAgIGsgKiBsZzIoaykgLSAoay8yKSAgICAgICAgICAgZmluYWwgc29ydCBvZiB0aGUgayBtb3N0IGV4dHJlbWUgdmFsdWVzXFxuI1xcbiMgQ29tYmluaW5nIGFuZCBzaW1wbGlmeWluZyBmb3IgYSByb3VnaCBlc3RpbWF0ZSBnaXZlczpcXG4jXFxuIyAgICAgICAgY29tcGFyaXNvbnMgPSBuICsgayAqIChsb2coaywgMikgKiBsb2cobi9rKSArIGxvZyhrLCAyKSArIGxvZyhuL2spKVxcbiNcXG4jIENvbXB1dGluZyB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIGZvciBzdGVwIDM6XFxuIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgKiBGb3IgdGhlIGktdGggbmV3IHZhbHVlIGZyb20gdGhlIGl0ZXJhYmxlLCB0aGUgcHJvYmFiaWxpdHkgb2YgYmVpbmcgaW4gdGhlXFxuIyAgIGsgbW9zdCBleHRyZW1lIHZhbHVlcyBpcyBrL2kuICBGb3IgZXhhbXBsZSwgdGhlIHByb2JhYmlsaXR5IG9mIHRoZSAxMDFzdFxcbiMgICB2YWx1ZSBzZWVuIGJlaW5nIGluIHRoZSAxMDAgbW9zdCBleHRyZW1lIHZhbHVlcyBpcyAxMDAvMTAxLlxcbiMgKiBJZiB0aGUgdmFsdWUgaXMgYSBuZXcgZXh0cmVtZSB2YWx1ZSwgdGhlIGNvc3Qgb2YgaW5zZXJ0aW5nIGl0IGludG8gdGhlXFxuIyAgIGhlYXAgaXMgMSArIGxvZyhrLCAyKS5cXG4jICogVGhlIHByb2JhYmlsaXR5IHRpbWVzIHRoZSBjb3N0IGdpdmVzOlxcbiMgICAgICAgICAgICAoay9pKSAqICgxICsgbG9nKGssIDIpKVxcbiMgKiBTdW1taW5nIGFjcm9zcyB0aGUgcmVtYWluaW5nIG4tayBlbGVtZW50cyBnaXZlczpcXG4jICAgICAgICAgICAgc3VtKChrL2kpICogKDEgKyBsb2coaywgMikpIGZvciBpIGluIHJhbmdlKGsrMSwgbisxKSlcXG4jICogVGhpcyByZWR1Y2VzIHRvOlxcbiMgICAgICAgICAgICAoSChuKSAtIEgoaykpICogayAqICgxICsgbG9nKGssIDIpKVxcbiMgKiBXaGVyZSBIKG4pIGlzIHRoZSBuLXRoIGhhcm1vbmljIG51bWJlciBlc3RpbWF0ZWQgYnk6XFxuIyAgICAgICAgICAgIGdhbW1hID0gMC41NzcyMTU2NjQ5XFxuIyAgICAgICAgICAgIEgobikgPSBsb2cobiwgZSkgKyBnYW1tYSArIDEgLyAoMiAqIG4pXFxuIyAgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFybW9uaWNfc2VyaWVzXyhtYXRoZW1hdGljcykjUmF0ZV9vZl9kaXZlcmdlbmNlXFxuIyAqIFN1YnN0aXR1dGluZyB0aGUgSChuKSBmb3JtdWxhOlxcbiMgICAgICAgICAgICBjb21wYXJpc29ucyA9IGsgKiAoMSArIGxvZyhrLCAyKSkgKiAobG9nKG4vaywgZSkgKyAoMS9uIC0gMS9rKSAvIDIpXFxuI1xcbiMgV29yc3QtY2FzZSBmb3Igc3RlcCAzOlxcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgSW4gdGhlIHdvcnN0IGNhc2UsIHRoZSBpbnB1dCBkYXRhIGlzIHJldmVyc2VkIHNvcnRlZCBzbyB0aGF0IGV2ZXJ5IG5ldyBlbGVtZW50XFxuIyBtdXN0IGJlIGluc2VydGVkIGluIHRoZSBoZWFwOlxcbiNcXG4jICAgICAgICAgICAgIGNvbXBhcmlzb25zID0gMS42NiAqIGsgKyBsb2coaywgMikgKiAobiAtIGspXFxuI1xcbiMgQWx0ZXJuYXRpdmUgQWxnb3JpdGhtc1xcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgT3RoZXIgYWxnb3JpdGhtcyB3ZXJlIG5vdCB1c2VkIGJlY2F1c2UgdGhleTpcXG4jIDEpIFRvb2sgbXVjaCBtb3JlIGF1eGlsaWFyeSBtZW1vcnksXFxuIyAyKSBNYWRlIG11bHRpcGxlIHBhc3NlcyBvdmVyIHRoZSBkYXRhLlxcbiMgMykgTWFkZSBtb3JlIGNvbXBhcmlzb25zIGluIGNvbW1vbiBjYXNlcyAoc21hbGwgaywgbGFyZ2Ugbiwgc2VtaS1yYW5kb20gaW5wdXQpLlxcbiMgU2VlIHRoZSBtb3JlIGRldGFpbGVkIGNvbXBhcmlzb24gb2YgYXBwcm9hY2ggYXQ6XFxuIyBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy81Nzc1NzMtY29tcGFyZS1hbGdvcml0aG1zLWZvci1oZWFwcXNtYWxsZXN0XFxuXFxuZGVmIG5zbWFsbGVzdChuLCBpdGVyYWJsZSwga2V5PU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cXG5cXG4gICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSlbOm5dXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICAjIFNob3J0LWN1dCBmb3Igbj09MSBpcyB0byB1c2UgbWluKClcXG4gICAgaWYgbiA9PSAxOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgc2VudGluZWwgPSBvYmplY3QoKVxcbiAgICAgICAgcmVzdWx0ID0gbWluKGl0LCBkZWZhdWx0PXNlbnRpbmVsLCBrZXk9a2V5KVxcbiAgICAgICAgcmV0dXJuIFtdIGlmIHJlc3VsdCBpcyBzZW50aW5lbCBlbHNlIFtyZXN1bHRdXFxuXFxuICAgICMgV2hlbiBuPj1zaXplLCBpdCdzIGZhc3RlciB0byB1c2Ugc29ydGVkKClcXG4gICAgdHJ5OlxcbiAgICAgICAgc2l6ZSA9IGxlbihpdGVyYWJsZSlcXG4gICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKTpcXG4gICAgICAgIHBhc3NcXG4gICAgZWxzZTpcXG4gICAgICAgIGlmIG4gPj0gc2l6ZTpcXG4gICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl1cXG5cXG4gICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uXFxuICAgIGlmIGtleSBpcyBOb25lOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgIyBwdXQgdGhlIHJhbmdlKG4pIGZpcnN0IHNvIHRoYXQgemlwKCkgZG9lc24ndFxcbiAgICAgICAgIyBjb25zdW1lIG9uZSB0b28gbWFueSBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYXRvclxcbiAgICAgICAgcmVzdWx0ID0gWyhlbGVtLCBpKSBmb3IgaSwgZWxlbSBpbiB6aXAocmFuZ2UobiksIGl0KV1cXG4gICAgICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICAgICAgX2hlYXBpZnlfbWF4KHJlc3VsdClcXG4gICAgICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICAgICAgb3JkZXIgPSBuXFxuICAgICAgICBfaGVhcHJlcGxhY2UgPSBfaGVhcHJlcGxhY2VfbWF4XFxuICAgICAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgICAgICBpZiBlbGVtIDwgdG9wOlxcbiAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoZWxlbSwgb3JkZXIpKVxcbiAgICAgICAgICAgICAgICB0b3AsIF9vcmRlciA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgICAgICBvcmRlciArPSAxXFxuICAgICAgICByZXN1bHQuc29ydCgpXFxuICAgICAgICByZXR1cm4gW2VsZW0gZm9yIChlbGVtLCBvcmRlcikgaW4gcmVzdWx0XVxcblxcbiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2RcXG4gICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICByZXN1bHQgPSBbKGtleShlbGVtKSwgaSwgZWxlbSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKG4pLCBpdCldXFxuICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgIF9oZWFwaWZ5X21heChyZXN1bHQpXFxuICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICBvcmRlciA9IG5cXG4gICAgX2hlYXByZXBsYWNlID0gX2hlYXByZXBsYWNlX21heFxcbiAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgIGsgPSBrZXkoZWxlbSlcXG4gICAgICAgIGlmIGsgPCB0b3A6XFxuICAgICAgICAgICAgX2hlYXByZXBsYWNlKHJlc3VsdCwgKGssIG9yZGVyLCBlbGVtKSlcXG4gICAgICAgICAgICB0b3AsIF9vcmRlciwgX2VsZW0gPSByZXN1bHRbMF1cXG4gICAgICAgICAgICBvcmRlciArPSAxXFxuICAgIHJlc3VsdC5zb3J0KClcXG4gICAgcmV0dXJuIFtlbGVtIGZvciAoaywgb3JkZXIsIGVsZW0pIGluIHJlc3VsdF1cXG5cXG5kZWYgbmxhcmdlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cXG5cXG4gICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl1cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtYXgoKVxcbiAgICBpZiBuID09IDE6XFxuICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgICAgICBzZW50aW5lbCA9IG9iamVjdCgpXFxuICAgICAgICByZXN1bHQgPSBtYXgoaXQsIGRlZmF1bHQ9c2VudGluZWwsIGtleT1rZXkpXFxuICAgICAgICByZXR1cm4gW10gaWYgcmVzdWx0IGlzIHNlbnRpbmVsIGVsc2UgW3Jlc3VsdF1cXG5cXG4gICAgIyBXaGVuIG4+PXNpemUsIGl0J3MgZmFzdGVyIHRvIHVzZSBzb3J0ZWQoKVxcbiAgICB0cnk6XFxuICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKVxcbiAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOlxcbiAgICAgICAgcGFzc1xcbiAgICBlbHNlOlxcbiAgICAgICAgaWYgbiA+PSBzaXplOlxcbiAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXksIHJldmVyc2U9VHJ1ZSlbOm5dXFxuXFxuICAgICMgV2hlbiBrZXkgaXMgbm9uZSwgdXNlIHNpbXBsZXIgZGVjb3JhdGlvblxcbiAgICBpZiBrZXkgaXMgTm9uZTpcXG4gICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSlcXG4gICAgICAgIHJlc3VsdCA9IFsoZWxlbSwgaSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKDAsIC1uLCAtMSksIGl0KV1cXG4gICAgICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICAgICAgaGVhcGlmeShyZXN1bHQpXFxuICAgICAgICB0b3AgPSByZXN1bHRbMF1bMF1cXG4gICAgICAgIG9yZGVyID0gLW5cXG4gICAgICAgIF9oZWFwcmVwbGFjZSA9IGhlYXByZXBsYWNlXFxuICAgICAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgICAgICBpZiB0b3AgPCBlbGVtOlxcbiAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoZWxlbSwgb3JkZXIpKVxcbiAgICAgICAgICAgICAgICB0b3AsIF9vcmRlciA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgICAgICBvcmRlciAtPSAxXFxuICAgICAgICByZXN1bHQuc29ydChyZXZlcnNlPVRydWUpXFxuICAgICAgICByZXR1cm4gW2VsZW0gZm9yIChlbGVtLCBvcmRlcikgaW4gcmVzdWx0XVxcblxcbiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2RcXG4gICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICByZXN1bHQgPSBbKGtleShlbGVtKSwgaSwgZWxlbSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKDAsIC1uLCAtMSksIGl0KV1cXG4gICAgaWYgbm90IHJlc3VsdDpcXG4gICAgICAgIHJldHVybiByZXN1bHRcXG4gICAgaGVhcGlmeShyZXN1bHQpXFxuICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICBvcmRlciA9IC1uXFxuICAgIF9oZWFwcmVwbGFjZSA9IGhlYXByZXBsYWNlXFxuICAgIGZvciBlbGVtIGluIGl0OlxcbiAgICAgICAgayA9IGtleShlbGVtKVxcbiAgICAgICAgaWYgdG9wIDwgazpcXG4gICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoaywgb3JkZXIsIGVsZW0pKVxcbiAgICAgICAgICAgIHRvcCwgX29yZGVyLCBfZWxlbSA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgIG9yZGVyIC09IDFcXG4gICAgcmVzdWx0LnNvcnQocmV2ZXJzZT1UcnVlKVxcbiAgICByZXR1cm4gW2VsZW0gZm9yIChrLCBvcmRlciwgZWxlbSkgaW4gcmVzdWx0XVxcblxcbiMgSWYgYXZhaWxhYmxlLCB1c2UgQyBpbXBsZW1lbnRhdGlvblxcbnRyeTpcXG4gICAgZnJvbSBfaGVhcHEgaW1wb3J0ICpcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG50cnk6XFxuICAgIGZyb20gX2hlYXBxIGltcG9ydCBfaGVhcHJlcGxhY2VfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgX2hlYXBpZnlfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgX2hlYXBwb3BfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxuXFxuXFxuaWYgX19uYW1lX18gPT0gXFxcIl9fbWFpbl9fXFxcIjpcXG5cXG4gICAgaW1wb3J0IGRvY3Rlc3QgIyBwcmFnbWE6IG5vIGNvdmVyXFxuICAgIHByaW50KGRvY3Rlc3QudGVzdG1vZCgpKSAjIHByYWdtYTogbm8gY292ZXJcXG5cIixcInNyYy9saWIvaG1hYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaG1hYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2hvdHNob3QvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImhvdHNob3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9odG1sZW50aXR5ZGVmcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaHRtbGVudGl0eWRlZnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9odG1sbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJodG1sbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaHR0cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaHR0cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2lkbGVsaWIvSWNvbnMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkljb25zIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaWRsZWxpYi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaWRsZWxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2lob29rcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaWhvb2tzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW1hZ2UuanNcIjpcInZhciBJbWFnZU1vZCwkYnVpbHRpbm1vZHVsZTtJbWFnZU1vZHx8KEltYWdlTW9kPXt9LEltYWdlTW9kLmNhbnZhc0xpYj1bXSksJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZyxoPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcImltYWdlXFxcIil9O3JldHVybiBoLkltYWdlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxmdW5jdGlvbihhLGIpe3ZhciBjPU1hdGguZmxvb3I7ZT1mdW5jdGlvbihhKXthLndpZHRoPWEuaW1hZ2Uud2lkdGgsYS5oZWlnaHQ9YS5pbWFnZS5oZWlnaHQsYS5kZWxheT0wLGEudXBkYXRlQ291bnQ9MCxhLnVwZGF0ZUludGVydmFsPTEsYS5sYXN0eD0wLGEubGFzdHk9MCxhLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJjYW52YXNcXFwiKSxhLmNhbnZhcy5oZWlnaHQ9YS5oZWlnaHQsYS5jYW52YXMud2lkdGg9YS53aWR0aCxhLmN0eD1hLmNhbnZhcy5nZXRDb250ZXh0KFxcXCIyZFxcXCIpLGEuY3R4LmRyYXdJbWFnZShhLmltYWdlLDAsMCksYS5pbWFnZWRhdGE9YS5jdHguZ2V0SW1hZ2VEYXRhKDAsMCxhLndpZHRoLGEuaGVpZ2h0KX0sYi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKTt0cnl7YS5pbWFnZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChTay5mZmkucmVtYXBUb0pzKGIpKSxlKGEpfWNhdGNoKGIpe2EuaW1hZ2U9bnVsbH1pZihudWxsPT1hLmltYWdlKXJldHVybiBjPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uLGMucmVzdW1lPWZ1bmN0aW9uKCl7aWYoYy5kYXRhLmVycm9yKXRocm93IG5ldyBTay5idWlsdGluLklPRXJyb3IoYy5kYXRhLmVycm9yLm1lc3NhZ2UpfSxjLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6bmV3IFByb21pc2UoZnVuY3Rpb24oYyxkKXt2YXIgZj1uZXcgSW1hZ2U7Zi5jcm9zc09yaWdpbj1cXFwiXFxcIixmLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKEVycm9yKFxcXCJGYWlsZWQgdG8gbG9hZCBVUkw6IFxcXCIrZi5zcmMpKX0sZi5vbmxvYWQ9ZnVuY3Rpb24oKXthLmltYWdlPXRoaXMsZShhKSxjKCl9LGYuc3JjPWcoYil9KX0sY30pLGc9ZnVuY3Rpb24oYSl7bGV0IGI9U2suZmZpLnJlbWFwVG9KcyhhKTt0cnl7bGV0IGE9U2sucmVhZChiKSxjPWIuc3Vic3RyaW5nKGIubGFzdEluZGV4T2YoXFxcIi5cXFwiKSsxKTtyZXR1cm5gZGF0YTppbWFnZS8ke2N9O2Jhc2U2NCwgJHthfWB9Y2F0Y2goYSl7Y29uc29sZS5sb2coYCR7Yn0gaXMgbm90IGluIHRoZSBkYXRhYmFzZSAke2F9YCl9dmFyIGMsZCxlPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBTay5pbWFnZVByb3h5P1NrLmltYWdlUHJveHk6ZnVuY3Rpb24oYSl7cmV0dXJuIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiYVxcXCIpLGMuaHJlZj1kLHdpbmRvdy5sb2NhdGlvbi5ob3N0PT09Yy5ob3N0P2E6U2suaW1hZ2VQcm94eStcXFwiL1xcXCIrYX07cmV0dXJuIGQ9U2suZmZpLnJlbWFwVG9KcyhhKSxkPWUoZCksZH0sZj1mdW5jdGlvbihhLGIsYyl7aWYoMD5ifHwwPmN8fGI+PWEud2lkdGh8fGM+PWEuaGVpZ2h0KXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlBpeGVsIGluZGV4IG91dCBvZiByYW5nZS5cXFwiKX07dmFyIGk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldGRlbGF5XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksYS5kZWxheT1Tay5mZmkucmVtYXBUb0pzKGIpLGQ9U2suYnVpbHRpbi5hc251bSQoYyksYS51cGRhdGVJbnRlcnZhbD1kP2Q6MX07Yi5zZXRfZGVsYXk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKSxiLnNldERlbGF5PW5ldyBTay5idWlsdGluLmZ1bmMoaSk7dmFyIGo9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXTtmb3IoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cGl4ZWxzXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksYj0wO2I8YS5pbWFnZS5oZWlnaHQqYS5pbWFnZS53aWR0aDtiKyspZFtiXT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5nZXRQaXhlbCxbYSxiJWEuaW1hZ2Uud2lkdGgsYyhiL2EuaW1hZ2Uud2lkdGgpXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGQpfTtiLmdldF9waXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhqKSxiLmdldFBpeGVscz1uZXcgU2suYnVpbHRpbi5mdW5jKGopLGIuZ2V0RGF0YT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxnLGgsaixrLGw9W107Zm9yKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldERhdGFcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxiPTA7YjxhLmltYWdlLmhlaWdodCphLmltYWdlLndpZHRoO2IrKylkPWIlYS5pbWFnZS53aWR0aCxlPWMoYi9hLmltYWdlLndpZHRoKSxmKGEsZCxlKSxrPTQqZSphLndpZHRoKzQqZCxnPWEuaW1hZ2VkYXRhLmRhdGFba10saD1hLmltYWdlZGF0YS5kYXRhW2srMV0saj1hLmltYWdlZGF0YS5kYXRhW2srMl0sbFtiXT1uZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50XyhnKSxuZXcgU2suYnVpbHRpbi5pbnRfKGgpLG5ldyBTay5idWlsdGluLmludF8oaildKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChsKX0pO3ZhciBrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGcsaTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cGl4ZWxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMywzKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGM9U2suYnVpbHRpbi5hc251bSQoYyksZihhLGIsYyksaT00KmMqYS53aWR0aCs0KmIsZD1hLmltYWdlZGF0YS5kYXRhW2ldLGc9YS5pbWFnZWRhdGEuZGF0YVtpKzFdLGU9YS5pbWFnZWRhdGEuZGF0YVtpKzJdLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShoLlBpeGVsLFtkLGcsZSxiLGNdKX07Yi5nZXRfcGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKSxiLmdldFBpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMoayksZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247cmV0dXJuIGQucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sZC5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGQpe3ZhciBlPU1hdGgubWF4LGY9TWF0aC5hYnMsZz1NYXRoLm1pbjthLnVwZGF0ZUNvdW50KyssMD09YS51cGRhdGVDb3VudCVhLnVwZGF0ZUludGVydmFsPyhhLmxhc3R4K2EudXBkYXRlSW50ZXJ2YWw+PWEud2lkdGg/YS5sYXN0Q3R4LnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxhLmxhc3RVbHgsYS5sYXN0VWx5LDAsYS5sYXN0eSxhLndpZHRoLDIpOmEubGFzdHkrYS51cGRhdGVJbnRlcnZhbD49YS5oZWlnaHQ/YS5sYXN0Q3R4LnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxhLmxhc3RVbHgsYS5sYXN0VWx5LGEubGFzdHgsMCwyLGEuaGVpZ2h0KTphLmxhc3RDdHgucHV0SW1hZ2VEYXRhKGEuaW1hZ2VkYXRhLGEubGFzdFVseCxhLmxhc3RVbHksZyhiLGEubGFzdHgpLGcoYyxhLmxhc3R5KSxlKGYoYi1hLmxhc3R4KSwxKSxlKGYoYy1hLmxhc3R5KSwxKSksYS5sYXN0eD1iLGEubGFzdHk9YywwPGEuZGVsYXk/d2luZG93LnNldFRpbWVvdXQoZCxhLmRlbGF5KTpkKCkpOmQoKX0pfSxkfTt2YXIgbD1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZztyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0cGl4ZWxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsNCw0KSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGM9U2suYnVpbHRpbi5hc251bSQoYyksZihhLGIsYyksZz00KmMqYS53aWR0aCs0KmIsYS5pbWFnZWRhdGEuZGF0YVtnXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRSZWQsW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzFdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldEdyZWVuLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZysyXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRCbHVlLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZyszXT0yNTUsZChhLGIsYyl9O2Iuc2V0X3BpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobCksYi5zZXRQaXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKGwpO3ZhciBtPWZ1bmN0aW9uKGEsYixlKXt2YXIgZyxoLGk7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHBpeGVsYXRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMywzKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGc9YiVhLmltYWdlLndpZHRoLGg9YyhiL2EuaW1hZ2Uud2lkdGgpLGYoYSxnLGgpLGk9NCpoKmEud2lkdGgrNCpnLGEuaW1hZ2VkYXRhLmRhdGFbaV09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0UmVkLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbaSsxXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRHcmVlbixbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2krMl09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0Qmx1ZSxbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2krM109MjU1LGQoYSxnLGgpfTtiLnNldF9waXhlbF9hdD1uZXcgU2suYnVpbHRpbi5mdW5jKG0pLGIuc2V0UGl4ZWxBdD1uZXcgU2suYnVpbHRpbi5mdW5jKG0pO3ZhciBuPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxnO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ1cGRhdGVwaXhlbFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGM9U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuZ2V0WCxbYl0pKSxlPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldFksW2JdKSksZihhLGMsZSksZz00KmUqYS53aWR0aCs0KmMsYS5pbWFnZWRhdGEuZGF0YVtnXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRSZWQsW2JdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzFdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldEdyZWVuLFtiXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZysyXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRCbHVlLFtiXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZyszXT0yNTUsZChhLGMsZSl9O2IudXBkYXRlX3BpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobiksYi51cGRhdGVQaXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKG4pO3ZhciBvPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRoZWlnaHRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxuZXcgU2suYnVpbHRpbi5pbnRfKGEuaGVpZ2h0KX07Yi5nZXRfaGVpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMobyksYi5nZXRIZWlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhvKTt2YXIgcD1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0d2lkdGhcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxuZXcgU2suYnVpbHRpbi5pbnRfKGEud2lkdGgpfTtiLmdldF93aWR0aD1uZXcgU2suYnVpbHRpbi5mdW5jKHApLGIuZ2V0V2lkdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhwKSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJoZWlnaHRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLndpZHRoKTp2b2lkIDB9KSxiLl9fc2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtpZihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImhlaWdodFxcXCI9PT1ifHxcXFwid2lkdGhcXFwiPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIkNhbm5vdCBjaGFuZ2UgaGVpZ2h0IG9yIHdpZHRoIHRoZXkgY2FuIG9ubHkgYmUgc2V0IG9uIGNyZWF0aW9uXFxcIik7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIlVua25vd24gYXR0cmlidXRlOiBcXFwiK2IpfSksYi5kcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImRyYXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KSxlPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uLGUucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sZS5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3ZhciBmLGc7Yj1Tay5idWlsdGluLmFzbnVtJChiKSxjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksZj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRXaW4sW2JdKSxnPWYuZ2V0Q29udGV4dChcXFwiMmRcXFwiKSx2b2lkIDA9PT1jJiYoYz0wLGQ9MCksYS5sYXN0VWx4PWMsYS5sYXN0VWx5PWQsYS5sYXN0Q3R4PWcsZy5wdXRJbWFnZURhdGEoYS5pbWFnZWRhdGEsYyxkKSwwPGEuZGVsYXk/d2luZG93LnNldFRpbWVvdXQoZSxhLmRlbGF5KTp3aW5kb3cuc2V0VGltZW91dChlLDIwMCl9KX0sZX0pfSxcXFwiSW1hZ2VcXFwiLFtdKSxjPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwzLDMpLGEud2lkdGg9U2suYnVpbHRpbi5hc251bSQoYiksYS5oZWlnaHQ9U2suYnVpbHRpbi5hc251bSQoYyksYS5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIiksYS5jdHg9YS5jYW52YXMuZ2V0Q29udGV4dChcXFwiMmRcXFwiKSxhLmNhbnZhcy5oZWlnaHQ9YS5oZWlnaHQsYS5jYW52YXMud2lkdGg9YS53aWR0aCxhLmltYWdlZGF0YT1hLmN0eC5nZXRJbWFnZURhdGEoMCwwLGEud2lkdGgsYS5oZWlnaHQpfSl9LGguRW1wdHlJbWFnZT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGgsYyxcXFwiRW1wdHlJbWFnZVxcXCIsW2guSW1hZ2VdKSxiPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkLGUsYixmKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCw0LDYpLGEucmVkPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGEuZ3JlZW49U2suYnVpbHRpbi5hc251bSQoZCksYS5ibHVlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGEueD1Tay5idWlsdGluLmFzbnVtJChiKSxhLnk9U2suYnVpbHRpbi5hc251bSQoZil9KTt2YXIgYz1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cmVkXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLnJlZCl9O2IuZ2V0X3JlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGMpLGIuZ2V0UmVkPW5ldyBTay5idWlsdGluLmZ1bmMoYyk7dmFyIGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldGdyZWVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLmdyZWVuKX07Yi5nZXRfZ3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhkKSxiLmdldEdyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZCk7dmFyIGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldGJsdWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLmFzc2skKGEuYmx1ZSl9O2IuZ2V0X2JsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKSxiLmdldEJsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKTt2YXIgZj1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0eFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4uYXNzayQoYS54KX07Yi5nZXRfeD1uZXcgU2suYnVpbHRpbi5mdW5jKGYpLGIuZ2V0WD1uZXcgU2suYnVpbHRpbi5mdW5jKGYpO3ZhciBnPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXR5XFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLnkpfTtiLmdldF95PW5ldyBTay5idWlsdGluLmZ1bmMoZyksYi5nZXRZPW5ldyBTay5idWlsdGluLmZ1bmMoZyk7dmFyIGg9ZnVuY3Rpb24oYSxiKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRyZWRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLnJlZD1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfcmVkPW5ldyBTay5idWlsdGluLmZ1bmMoaCksYi5zZXRSZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhoKTt2YXIgaT1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldGdyZWVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS5ncmVlbj1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfZ3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKSxiLnNldEdyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoaSk7dmFyIGo9ZnVuY3Rpb24oYSxjKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRibHVlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS5ibHVlPVNrLmJ1aWx0aW4uYXNudW0kKGMpfTtiLnNldF9ibHVlPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5zZXRCbHVlPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwicmVkXFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoYS5yZWQpOlxcXCJncmVlblxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS5ncmVlbik6XFxcImJsdWVcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEuYmx1ZSk6dm9pZCAwfSksYi5fX3NldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtiPVNrLmZmaS5yZW1hcFRvSnMoYiksKFxcXCJyZWRcXFwiPT09Ynx8XFxcImdyZWVuXFxcIj09PWJ8fFxcXCJibHVlXFxcIj09PWIpJiYoYVtiXT1Tay5idWlsdGluLmFzbnVtJChjKSl9KTt2YXIgaz1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHhcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLng9U2suYnVpbHRpbi5hc251bSQoYil9O2Iuc2V0X3g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKSxiLnNldFg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKTt2YXIgbD1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHlcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLnk9U2suYnVpbHRpbi5hc251bSQoYil9O2Iuc2V0X3k9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKSxiLnNldFk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKSxiLl9fZ2V0aXRlbV9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5idWlsdGluLmFzbnVtJChiKSwwPT09Yik/YS5yZWQ6MT09Yj9hLmdyZWVuOjI9PWI/YS5ibHVlOnZvaWQgMH0pLGIuX19zdHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5mZmkucmVtYXBUb1B5KFxcXCJbXFxcIithLnJlZCtcXFwiLFxcXCIrYS5ncmVlbitcXFwiLFxcXCIrYS5ibHVlK1xcXCJdXFxcIil9KSxiLmdldENvbG9yVHVwbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe30pLGIuc2V0UmFuZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2EubWF4PVNrLmJ1aWx0aW4uYXNudW0kKGIpfSl9LGguUGl4ZWw9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhoLGIsXFxcIlBpeGVsXFxcIixbXSksYT1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMyksZD1JbWFnZU1vZC5jYW52YXNMaWJbU2suY2FudmFzXSx2b2lkIDA9PT1kPyhlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU2suY2FudmFzKSxhLnRoZVNjcmVlbj1lLGYuYXBwZW5kQ2hpbGQoZSksSW1hZ2VNb2QuY2FudmFzTGliW1NrLmNhbnZhc109ZSxJbWFnZU1vZC5jYW52YXNMaWJbU2suY2FudmFzXT1hLnRoZVNjcmVlbik6KGEudGhlU2NyZWVuPWQsYS50aGVTY3JlZW4uaGVpZ2h0PWEudGhlU2NyZWVuLmhlaWdodCksdm9pZCAwPT09Yj8oU2suYXZhaWxhYmxlSGVpZ2h0JiYoYS50aGVTY3JlZW4uaGVpZ2h0PVNrLmF2YWlsYWJsZUhlaWdodCksU2suYXZhaWxhYmxlV2lkdGgmJihhLnRoZVNjcmVlbi53aWR0aD1Tay5hdmFpbGFibGVXaWR0aCkpOihhLnRoZVNjcmVlbi5oZWlnaHQ9Yy52LGEudGhlU2NyZWVuLndpZHRoPWIudiksYS50aGVTY3JlZW4uc3R5bGUuZGlzcGxheT1cXFwiYmxvY2tcXFwifSksYi5nZXRXaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gYS50aGVTY3JlZW59KSxiLmV4aXRvbmNsaWNrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS50aGVTY3JlZW4uaWQ7YS50aGVTY3JlZW4ub25jbGljaz1mdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpLnN0eWxlLmRpc3BsYXk9XFxcIm5vbmVcXFwiLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpLm9uY2xpY2s9bnVsbCxkZWxldGUgSW1hZ2VNb2QuY2FudmFzTGliW2JdfX0pfSxoLkltYWdlV2luPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxhLFxcXCJJbWFnZVdpblxcXCIsW10pLGh9O1wiLFwic3JjL2xpYi9pbWFwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbWFwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW1naGRyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbWdoZHIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pbXB1dGlsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbXB1dGlsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW8ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImlvIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaXRlcnRvb2xzLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjb21iaW5hdGlvbnNOZXcoYSxiLGMpe2xldCBkLGU7W2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoYS50cCRuYW1lLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJyXFxcIl0sYixjLFtdKTtjb25zdCBmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGQpO2lmKGU9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGUsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSwwPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2lmKHRoaXM9PT1hKXJldHVybiBuZXcgYS5jb25zdHJ1Y3RvcihmLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb25zdHJ1Y3Rvci5jYWxsKGIsZixlKSxifX12YXIgYT17fTtyZXR1cm4gYS5hY2N1bXVsYXRlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmFjY3VtdWxhdGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBhY2N1bXVsYXRlKGEsYixjKXt0aGlzLml0ZXI9YSx0aGlzLmZ1bmM9Yix0aGlzLnRvdGFsPWMsdGhpcy50cCRpdGVybmV4dD0oKT0+KHRoaXMudG90YWw9U2suYnVpbHRpbi5jaGVja05vbmUodGhpcy50b3RhbCk/dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk6dGhpcy50b3RhbCx0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LHRoaXMudG90YWwpfSxpdGVybmV4dCgpe2xldCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMCE9PWEpcmV0dXJuIHRoaXMudG90YWw9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMuZnVuYyxbdGhpcy50b3RhbCxhXSksdGhpcy50b3RhbH0sc2xvdHM6e3RwJGRvYzpcXFwiYWNjdW11bGF0ZShpdGVyYWJsZVssIGZ1bmMsIGluaXRpYWxdKSAtLT4gYWNjdW11bGF0ZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHNlcmllcyBvZiBhY2N1bXVsYXRlZCBzdW1zIChvciBvdGhlciBiaW5hcnkgZnVuY3Rpb24gcmVzdWx0cykuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImFjY3VtdWxhdGVcXFwiLGIsMCwyKTtsZXRbZCxlLGZdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJhY2N1bXVsYXRlXFxcIixbXFxcIml0ZXJhYmxlXFxcIixcXFwiZnVuY1xcXCIsXFxcImluaXRpYWxcXFwiXSxiLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtpZihkPVNrLmFic3RyLml0ZXIoZCksZT1Tay5idWlsdGluLmNoZWNrTm9uZShlKT9uZXcgU2suYnVpbHRpbi5mdW5jKChjLGEpPT5Tay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkFkZFxcXCIpKTplLHRoaXM9PT1hLmFjY3VtdWxhdGUucHJvdG90eXBlKXJldHVybiBuZXcgYS5hY2N1bXVsYXRlKGQsZSxmKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuYWNjdW11bGF0ZS5jYWxsKGIsZCxlLGYpLGJ9fX19KSxhLmNoYWluPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNoYWluXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY2hhaW4oYSl7dGhpcy5pdGVyYWJsZXM9YSx0aGlzLmN1cnJlbnRfaXQ9bnVsbCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT4odGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCx0aGlzLmN1cnJlbnRfaXQ9dGhpcy5pdGVyYWJsZXMudHAkaXRlcm5leHQoKSx2b2lkIDA9PT10aGlzLmN1cnJlbnRfaXQpP3ZvaWQodGhpcy50cCRpdGVybmV4dD0oKT0+dm9pZCAwKToodGhpcy5jdXJyZW50X2l0PVNrLmFic3RyLml0ZXIodGhpcy5jdXJyZW50X2l0KSx0aGlzLnRwJGl0ZXJuZXh0KCkpfSxpdGVybmV4dCgpe2ZvcihsZXQgYTt2b2lkIDA9PT1hOylpZihhPXRoaXMuY3VycmVudF9pdC50cCRpdGVybmV4dCgpLHZvaWQgMD09PWEpe2lmKHRoaXMuY3VycmVudF9pdD10aGlzLml0ZXJhYmxlcy50cCRpdGVybmV4dCgpLHZvaWQgMD09PXRoaXMuY3VycmVudF9pdClyZXR1cm4gdm9pZCh0aGlzLnRwJGl0ZXJuZXh0PSgpPT52b2lkIDApO3RoaXMuY3VycmVudF9pdD1Tay5hYnN0ci5pdGVyKHRoaXMuY3VycmVudF9pdCl9ZWxzZSByZXR1cm4gYX0sc2xvdHM6e3RwJGRvYzpcXFwiY2hhaW4oKml0ZXJhYmxlcykgLS0+IGNoYWluIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSBjaGFpbiBvYmplY3Qgd2hvc2UgLl9fbmV4dF9fKCkgbWV0aG9kIHJldHVybnMgZWxlbWVudHMgZnJvbSB0aGVcXFxcbmZpcnN0IGl0ZXJhYmxlIHVudGlsIGl0IGlzIGV4aGF1c3RlZCwgdGhlbiBlbGVtZW50cyBmcm9tIHRoZSBuZXh0XFxcXG5pdGVyYWJsZSwgdW50aWwgYWxsIG9mIHRoZSBpdGVyYWJsZXMgYXJlIGV4aGF1c3RlZC5cXFwiLHRwJG5ldyhiLGMpe2lmKFNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImNoYWluXFxcIixjKSxiPW5ldyBTay5idWlsdGluLnR1cGxlKGIuc2xpY2UoMCkpLnRwJGl0ZXIoKSx0aGlzPT09YS5jaGFpbi5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmNoYWluKGIpO2Vsc2V7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jaGFpbi5jYWxsKGMsYiksY319fSxjbGFzc21ldGhvZHM6e2Zyb21faXRlcmFibGU6eyRtZXRoKGIpe2NvbnN0IGM9U2suYWJzdHIuaXRlcihiKTtyZXR1cm4gbmV3IGEuY2hhaW4oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlxcXCJjaGFpbi5mcm9tX2l0ZXJhYmxlKGl0ZXJhYmxlKSAtLT4gY2hhaW4gb2JqZWN0XFxcXG5cXFxcbkFsdGVybmF0ZSBjaGFpbigpIGNvbnN0cnVjdG9yIHRha2luZyBhIHNpbmdsZSBpdGVyYWJsZSBhcmd1bWVudFxcXFxudGhhdCBldmFsdWF0ZXMgbGF6aWx5LlxcXCIsJHRleHRzaWc6bnVsbH19fSksYS5jb21iaW5hdGlvbnM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY29tYmluYXRpb25zXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY29tYmluYXRpb25zKGEsYil7dGhpcy5wb29sPWEsdGhpcy5yPWIsdGhpcy5pbmRpY2VzPUFycmF5KGIpLmZpbGwoKS5tYXAoKGEsYik9PmIpLHRoaXMubj1hLmxlbmd0aCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYoISh0aGlzLnI+dGhpcy5uKSlyZXR1cm4gdGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCxuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnBvb2wuc2xpY2UoMCx0aGlzLnIpKX19LGl0ZXJuZXh0KCl7bGV0IGEsYj0hMTtmb3IoYT10aGlzLnItMTswPD1hO2EtLSlpZih0aGlzLmluZGljZXNbYV0hPWErdGhpcy5uLXRoaXMucil7Yj0hMDticmVha31pZighYilyZXR1cm4gdm9pZCh0aGlzLnI9MCk7dGhpcy5pbmRpY2VzW2FdKys7Zm9yKGxldCBiPWErMTtiPHRoaXMucjtiKyspdGhpcy5pbmRpY2VzW2JdPXRoaXMuaW5kaWNlc1tiLTFdKzE7Y29uc3QgYz10aGlzLmluZGljZXMubWFwKGE9PnRoaXMucG9vbFthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGMpfSxzbG90czp7dHAkZG9jOlxcXCJjb21iaW5hdGlvbnMoaXRlcmFibGUsIHIpIC0tPiBjb21iaW5hdGlvbnMgb2JqZWN0XFxcXG5cXFxcblJldHVybiBzdWNjZXNzaXZlIHItbGVuZ3RoIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUuXFxcXG5cXFxcbmNvbWJpbmF0aW9ucyhyYW5nZSg0KSwgMykgLS0+ICgwLDEsMiksICgwLDEsMyksICgwLDIsMyksICgxLDIsMylcXFwiLHRwJG5ldyhiLGMpe3JldHVybiBjb21iaW5hdGlvbnNOZXcuY2FsbCh0aGlzLGEuY29tYmluYXRpb25zLnByb3RvdHlwZSxiLGMpfX19KSxhLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoYSxiKXt0aGlzLnBvb2w9YSx0aGlzLnI9Yix0aGlzLmluZGljZXM9QXJyYXkoYikuZmlsbCgwKSx0aGlzLm49YS5sZW5ndGgsdGhpcy50cCRpdGVybmV4dD0oKT0+e2lmKCF0aGlzLnJ8fHRoaXMubil7dGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dDtjb25zdCBhPXRoaXMuaW5kaWNlcy5tYXAoYT0+dGhpcy5wb29sW2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9fX0saXRlcm5leHQoKXtsZXQgYSxiPSExO2ZvcihhPXRoaXMuci0xOzA8PWE7YS0tKWlmKHRoaXMuaW5kaWNlc1thXSE9dGhpcy5uLTEpe2I9ITA7YnJlYWt9aWYoIWIpcmV0dXJuIHZvaWQodGhpcy5yPTApO2NvbnN0IGM9dGhpcy5pbmRpY2VzW2FdKzE7Zm9yKGxldCBiPWE7Yjx0aGlzLnI7YisrKXRoaXMuaW5kaWNlc1tiXT1jO2NvbnN0IGQ9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShkKX0sc2xvdHM6e3RwJGRvYzpcXFwiY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoaXRlcmFibGUsIHIpIC0tPiBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudCBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHN1Y2Nlc3NpdmUgci1sZW5ndGggY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIGluIHRoZSBpdGVyYWJsZVxcXFxuYWxsb3dpbmcgaW5kaXZpZHVhbCBlbGVtZW50cyB0byBoYXZlIHN1Y2Nlc3NpdmUgcmVwZWF0cy5cXFxcbmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KCdBQkMnLCAyKSAtLT4gQUEgQUIgQUMgQkIgQkMgQ0NcXFwiLHRwJG5ldyhiLGMpe3JldHVybiBjb21iaW5hdGlvbnNOZXcuY2FsbCh0aGlzLGEuY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQucHJvdG90eXBlLGIsYyl9fX0pLGEuY29tcHJlc3M9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY29tcHJlc3NcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjb21wcmVzcyhhLGIpe3RoaXMuZGF0YT1hLHRoaXMuc2VsZWN0b3JzPWJ9LGl0ZXJuZXh0KCl7bGV0IGE9dGhpcy5kYXRhLnRwJGl0ZXJuZXh0KCksYj10aGlzLnNlbGVjdG9ycy50cCRpdGVybmV4dCgpO2Zvcig7dm9pZCAwIT09YSYmdm9pZCAwIT09Yjspe2lmKFNrLm1pc2NldmFsLmlzVHJ1ZShiKSlyZXR1cm4gYTthPXRoaXMuZGF0YS50cCRpdGVybmV4dCgpLGI9dGhpcy5zZWxlY3RvcnMudHAkaXRlcm5leHQoKX19LHNsb3RzOnt0cCRkb2M6XFxcImNvbXByZXNzKGRhdGEsIHNlbGVjdG9ycykgLS0+IGl0ZXJhdG9yIG92ZXIgc2VsZWN0ZWQgZGF0YVxcXFxuXFxcXG5SZXR1cm4gZGF0YSBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRydWUgc2VsZWN0b3IgZWxlbWVudHMuXFxcXG5Gb3JtcyBhIHNob3J0ZXIgaXRlcmF0b3IgZnJvbSBzZWxlY3RlZCBkYXRhIGVsZW1lbnRzIHVzaW5nIHRoZVxcXFxuc2VsZWN0b3JzIHRvIGNob29zZSB0aGUgZGF0YSBlbGVtZW50cy5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImNvbXByZXNzXFxcIixbXFxcImRhdGFcXFwiLFxcXCJzZWxlY3RvcnNcXFwiXSxiLGMsW10pLGQ9U2suYWJzdHIuaXRlcihkKSxlPVNrLmFic3RyLml0ZXIoZSksdGhpcz09PWEuY291bnQucHJvdG90eXBlKXJldHVybiBuZXcgYS5jb21wcmVzcyhkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb21wcmVzcy5jYWxsKGIsZCxlKSxifX19fSksYS5jb3VudD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jb3VudFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGNvdW50KGEsYil7dGhpcy5zdGFydD1hLHRoaXMuc3RlcD1ifSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy5zdGFydDtyZXR1cm4gdGhpcy5zdGFydD1Tay5hYnN0ci5udW1iZXJCaW5PcCh0aGlzLnN0YXJ0LHRoaXMuc3RlcCxcXFwiQWRkXFxcIiksYX0sc2xvdHM6e3RwJGRvYzpcXFwiY291bnQoc3RhcnQ9MCwgc3RlcD0xKSAtLT4gY291bnQgb2JqZWN0XFxcXG5cXFxcblJldHVybiBhIGNvdW50IG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBjb25zZWN1dGl2ZSB2YWx1ZXMuXFxcXG5FcXVpdmFsZW50IHRvOlxcXFxuXFxcXG4gICAgZGVmIGNvdW50KGZpcnN0dmFsPTAsIHN0ZXA9MSk6XFxcXG4gICAgICAgIHggPSBmaXJzdHZhbFxcXFxuICAgICAgICB3aGlsZSAxOlxcXFxuICAgICAgICAgICAgeWllbGQgeFxcXFxuICAgICAgICAgICAgeCArPSBzdGVwXFxcXG5cXFwiLHRwJG5ldyhiLGMpe2NvbnN0W2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImNvdW50XFxcIixbXFxcInN0YXJ0XFxcIixcXFwic3RlcFxcXCJdLGIsYyxbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDEpXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZCkmJiFTay5idWlsdGluLmNoZWNrQ29tcGxleChkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImEgbnVtYmVyIGlzIHJlcXVpcmVkXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZSkmJiFTay5idWlsdGluLmNoZWNrQ29tcGxleChlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImEgbnVtYmVyIGlzIHJlcXVpcmVkXFxcIik7aWYodGhpcz09PWEuY291bnQucHJvdG90eXBlKXJldHVybiBuZXcgYS5jb3VudChkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb3VudC5jYWxsKGIsZCxlKSxifX0sJHIoKXtjb25zdCBhPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5zdGFydCk7bGV0IGI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0ZXApO3JldHVybiBiPVxcXCIxXFxcIj09PWI/XFxcIlxcXCI6XFxcIiwgXFxcIitiLG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYStiK1xcXCIpXFxcIil9fX0pLGEuY3ljbGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY3ljbGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjeWNsZShhKXt0aGlzLml0ZXI9YSx0aGlzLnNhdmVkPVtdLHRoaXMuY29uc3VtZWQ9ITEsdGhpcy5pPTAsdGhpcy5sZW5ndGh9LGl0ZXJuZXh0KCl7bGV0IGE7aWYoIXRoaXMuY29uc3VtZWQpe2lmKGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwIT09YSlyZXR1cm4gdGhpcy5zYXZlZC5wdXNoKGEpLGE7aWYodGhpcy5jb25zdW1lZD0hMCx0aGlzLmxlbmd0aD10aGlzLnNhdmVkLmxlbmd0aCwhdGhpcy5sZW5ndGgpcmV0dXJufXJldHVybiBhPXRoaXMuc2F2ZWRbdGhpcy5pXSx0aGlzLmk9KHRoaXMuaSsxKSV0aGlzLmxlbmd0aCxhfSxzbG90czp7dHAkZG9jOlxcXCJjeWNsZShpdGVyYWJsZSkgLS0+IGN5Y2xlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUgdW50aWwgaXQgaXMgZXhoYXVzdGVkLlxcXFxuVGhlbiByZXBlYXQgdGhlIHNlcXVlbmNlIGluZGVmaW5pdGVseS5cXFwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKFxcXCJjeWNsZVxcXCIsYixjKTtjb25zdCBkPVNrLmFic3RyLml0ZXIoYlswXSk7aWYodGhpcz09PWEuY3ljbGUucHJvdG90eXBlKXJldHVybiBuZXcgYS5jeWNsZShkKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuY3ljbGUuY2FsbChiLGQpLGJ9fX19KSxhLmRyb3B3aGlsZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5kcm9wd2hpbGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBkcm9wd2hpbGUoYSxiKXt0aGlzLnByZWRpY2F0ZT1hLHRoaXMuaXRlcj1iLHRoaXMucGFzc2VkfSxpdGVybmV4dCgpe2xldCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2Zvcig7dm9pZCAwPT09dGhpcy5wYXNzZWQmJnZvaWQgMCE9PWE7KXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnByZWRpY2F0ZSxbYV0pO2lmKCFTay5taXNjZXZhbC5pc1RydWUoYikpcmV0dXJuIHRoaXMucGFzc2VkPSEwLGE7YT10aGlzLml0ZXIudHAkaXRlcm5leHQoKX1yZXR1cm4gYX0sc2xvdHM6e3RwJGRvYzpcXFwiZHJvcHdoaWxlKHByZWRpY2F0ZSwgaXRlcmFibGUpIC0tPiBkcm9wd2hpbGUgb2JqZWN0XFxcXG5cXFxcbkRyb3AgaXRlbXMgZnJvbSB0aGUgaXRlcmFibGUgd2hpbGUgcHJlZGljYXRlKGl0ZW0pIGlzIHRydWUuXFxcXG5BZnRlcndhcmRzLCByZXR1cm4gZXZlcnkgZWxlbWVudCB1bnRpbCB0aGUgaXRlcmFibGUgaXMgZXhoYXVzdGVkLlxcXCIsdHAkbmV3KGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiZHJvcHdoaWxlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImRyb3B3aGlsZVxcXCIsYiwyLDIpO2NvbnN0IGQ9YlswXSxlPVNrLmFic3RyLml0ZXIoYlsxXSk7aWYodGhpcz09PWEuZHJvcHdoaWxlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZHJvcHdoaWxlKGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmRyb3B3aGlsZS5jYWxsKGIsZCxlKSxifX19fSksYS5maWx0ZXJmYWxzZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5maWx0ZXJmYWxzZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGZpbHRlcmZhbHNlKGEsYil7dGhpcy5wcmVkaWNhdGU9YSx0aGlzLml0ZXI9Yn0saXRlcm5leHQoKXtsZXQgYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKTtpZih2b2lkIDAhPT1hKXtmb3IobGV0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSk7U2subWlzY2V2YWwuaXNUcnVlKGIpOyl7aWYoYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKSx2b2lkIDA9PT1hKXJldHVybjtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnByZWRpY2F0ZSxbYV0pfXJldHVybiBhfX0sc2xvdHM6e3RwJGRvYzpcXFwiZmlsdGVyZmFsc2UoZnVuY3Rpb24gb3IgTm9uZSwgc2VxdWVuY2UpIC0tPiBmaWx0ZXJmYWxzZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHRob3NlIGl0ZW1zIG9mIHNlcXVlbmNlIGZvciB3aGljaCBmdW5jdGlvbihpdGVtKSBpcyBmYWxzZS5cXFxcbklmIGZ1bmN0aW9uIGlzIE5vbmUsIHJldHVybiB0aGUgaXRlbXMgdGhhdCBhcmUgZmFsc2UuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJmaWx0ZXJmYWxzZVxcXCIsYyksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJmaWx0ZXJmYWxzZVxcXCIsYiwyLDIpO2NvbnN0IGQ9U2suYnVpbHRpbi5jaGVja05vbmUoYlswXSk/U2suYnVpbHRpbi5ib29sOmJbMF0sZT1Tay5hYnN0ci5pdGVyKGJbMV0pO2lmKHRoaXM9PT1hLmZpbHRlcmZhbHNlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZmlsdGVyZmFsc2UoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuZmlsdGVyZmFsc2UuY2FsbChiLGQsZSksYn19fX0pLGEuX2dyb3VwZXI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuX2dyb3VwZXJcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBfZ3JvdXBlcihhKXt0aGlzLmdyb3VwYnk9YSx0aGlzLnRndGtleT1hLnRndGtleSx0aGlzLmlkPWEuaWR9LGl0ZXJuZXh0KCl7Y29uc3QgYT1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5ncm91cGJ5LmN1cnJrZXksdGhpcy50Z3RrZXksXFxcIkVxXFxcIik7aWYodGhpcy5ncm91cGJ5LmlkPT09dGhpcy5pZCYmYSl7bGV0IGE9dGhpcy5ncm91cGJ5LmN1cnJ2YWw7cmV0dXJuIHRoaXMuZ3JvdXBieS5jdXJydmFsPXRoaXMuZ3JvdXBieS5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwIT09dGhpcy5ncm91cGJ5LmN1cnJ2YWwmJih0aGlzLmdyb3VwYnkuY3VycmtleT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5ncm91cGJ5LmtleWYsW3RoaXMuZ3JvdXBieS5jdXJydmFsXSkpLGF9fX0pLGEuZ3JvdXBieT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5ncm91cGJ5XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZ3JvdXBieShhLGIpe3RoaXMuaXRlcj1hLHRoaXMua2V5Zj1iLHRoaXMuY3VycnZhbCx0aGlzLmN1cnJrZXk9dGhpcy50Z3RrZXk9bmV3IFNrLmJ1aWx0aW4ub2JqZWN0LHRoaXMuaWR9LGl0ZXJuZXh0KCl7dGhpcy5pZD17fTtmb3IobGV0IGE9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuY3VycmtleSx0aGlzLnRndGtleSxcXFwiRXFcXFwiKTthOyl7aWYodGhpcy5jdXJydmFsPXRoaXMuaXRlci50cCRpdGVybmV4dCgpLHZvaWQgMD09PXRoaXMuY3VycnZhbClyZXR1cm47dGhpcy5jdXJya2V5PVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmtleWYsW3RoaXMuY3VycnZhbF0pLGE9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuY3VycmtleSx0aGlzLnRndGtleSxcXFwiRXFcXFwiKX10aGlzLnRndGtleT10aGlzLmN1cnJrZXk7Y29uc3QgYj1uZXcgYS5fZ3JvdXBlcih0aGlzKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXMuY3VycmtleSxiXSl9LHNsb3RzOnt0cCRkb2M6XFxcImdyb3VwYnkoaXRlcmFibGUsIGtleT1Ob25lKSAtPiBtYWtlIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBjb25zZWN1dGl2ZVxcXFxua2V5cyBhbmQgZ3JvdXBzIGZyb20gdGhlIGl0ZXJhYmxlLiAgSWYgdGhlIGtleSBmdW5jdGlvbiBpcyBub3Qgc3BlY2lmaWVkIG9yXFxcXG5pcyBOb25lLCB0aGUgZWxlbWVudCBpdHNlbGYgaXMgdXNlZCBmb3IgZ3JvdXBpbmcuXFxcXG5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImdyb3VwYnlcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJrZXlcXFwiXSxiLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pLGQ9U2suYWJzdHIuaXRlcihkKSxlPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGUpP25ldyBTay5idWlsdGluLmZ1bmMoYT0+YSk6ZSx0aGlzPT09YS5ncm91cGJ5LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZ3JvdXBieShkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5ncm91cGJ5LmNhbGwoYixkLGUpLGJ9fX19KSxhLmlzbGljZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5pc2xpY2VcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBpc2xpY2UoYSxiLGMsZCl7dGhpcy5pdGVyPWEsdGhpcy5wcmV2aXQ9Yix0aGlzLnN0b3A9Yyx0aGlzLnN0ZXA9ZCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYodGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCx0aGlzLnByZXZpdD49dGhpcy5zdG9wKXtmb3IobGV0IGE9MDthPHRoaXMuc3RvcDthKyspdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJufWZvcihsZXQgYT0wO2E8dGhpcy5wcmV2aXQ7YSsrKXRoaXMuaXRlci50cCRpdGVybmV4dCgpO3JldHVybiB0aGlzLml0ZXIudHAkaXRlcm5leHQoKX19LGl0ZXJuZXh0KCl7aWYodGhpcy5wcmV2aXQrdGhpcy5zdGVwPj10aGlzLnN0b3Ape2ZvcihsZXQgYT10aGlzLnByZXZpdCsxO2E8dGhpcy5zdG9wO2ErKyl0aGlzLnByZXZpdCs9dGhpcy5zdGVwLHRoaXMuaXRlci50cCRpdGVybmV4dCgpO3JldHVybn1mb3IobGV0IGE9dGhpcy5wcmV2aXQrMTthPHRoaXMucHJldml0K3RoaXMuc3RlcDthKyspdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJuIHRoaXMucHJldml0Kz10aGlzLnN0ZXAsdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCl9LHNsb3RzOnt0cCRkb2M6XFxcImlzbGljZShpdGVyYWJsZSwgc3RvcCkgLS0+IGlzbGljZSBvYmplY3RcXFxcbmlzbGljZShpdGVyYWJsZSwgc3RhcnQsIHN0b3BbLCBzdGVwXSkgLS0+IGlzbGljZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGFuIGl0ZXJhdG9yIHdob3NlIG5leHQoKSBtZXRob2QgcmV0dXJucyBzZWxlY3RlZCB2YWx1ZXMgZnJvbSBhblxcXFxuaXRlcmFibGUuICBJZiBzdGFydCBpcyBzcGVjaWZpZWQsIHdpbGwgc2tpcCBhbGwgcHJlY2VkaW5nIGVsZW1lbnRzO1xcXFxub3RoZXJ3aXNlLCBzdGFydCBkZWZhdWx0cyB0byB6ZXJvLiAgU3RlcCBkZWZhdWx0cyB0byBvbmUuICBJZlxcXFxuc3BlY2lmaWVkIGFzIGFub3RoZXIgdmFsdWUsIHN0ZXAgZGV0ZXJtaW5lcyBob3cgbWFueSB2YWx1ZXMgYXJlIFxcXFxuc2tpcHBlZCBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMuICBXb3JrcyBsaWtlIGEgc2xpY2UoKSBvbiBhIGxpc3RcXFxcbmJ1dCByZXR1cm5zIGFuIGl0ZXJhdG9yLlxcXCIsdHAkbmV3KGIsYyl7dmFyIGQ9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiaXNsaWNlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImlzbGljZVxcXCIsYiwyLDQpO2NvbnN0IGU9U2suYWJzdHIuaXRlcihiWzBdKTtsZXQgZj1iWzFdLGc9YlsyXSxoPWJbM107aWYodm9pZCAwPT09Zz8oZz1mLGY9U2suYnVpbHRpbi5ub25lLm5vbmUkLGg9U2suYnVpbHRpbi5ub25lLm5vbmUkKTp2b2lkIDA9PT1oJiYoaD1Tay5idWlsdGluLm5vbmUubm9uZSQpLCEoU2suYnVpbHRpbi5jaGVja05vbmUoZyl8fFNrLm1pc2NldmFsLmlzSW5kZXgoZykpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0b3AgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuXFxcIik7ZWxzZSBpZihnPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGcpP2Q6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGcpLDA+Z3x8Zz5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0b3AgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuXFxcIik7aWYoIShTay5idWlsdGluLmNoZWNrTm9uZShmKXx8U2subWlzY2V2YWwuaXNJbmRleChmKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtlbHNlIGlmKGY9U2suYnVpbHRpbi5jaGVja05vbmUoZik/MDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZiksMD5mfHxmPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtpZighKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGgpfHxTay5taXNjZXZhbC5pc0luZGV4KGgpKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTdGVwIGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciBOb25lXFxcIik7ZWxzZSBpZihoPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGgpPzE6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGgpLDA+PWh8fGg+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTdGVwIGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciBOb25lLlxcXCIpO2lmKHRoaXM9PT1hLmlzbGljZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmlzbGljZShlLGYsZyxoKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuaXNsaWNlLmNhbGwoYixlLGYsZyxoKSxifX19fSksYS5wZXJtdXRhdGlvbnM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMucGVybXV0YXRpb25zXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcGVybXV0YXRpb25zKGEsYil7dGhpcy5wb29sPWEsdGhpcy5yPWI7Y29uc3QgYz1hLmxlbmd0aDt0aGlzLmluZGljZXM9QXJyYXkoYykuZmlsbCgpLm1hcCgoYSxiKT0+YiksdGhpcy5jeWNsZXM9QXJyYXkoYikuZmlsbCgpLm1hcCgoYSxiKT0+Yy1iKSx0aGlzLm49Yyx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYoISh0aGlzLnI+dGhpcy5uKSlyZXR1cm4gdGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCxuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnBvb2wuc2xpY2UoMCx0aGlzLnIpKX19LGl0ZXJuZXh0KCl7Zm9yKGxldCBhPXRoaXMuci0xOzA8PWE7YS0tKWlmKHRoaXMuY3ljbGVzW2FdLS0sMD09dGhpcy5jeWNsZXNbYV0pdGhpcy5pbmRpY2VzLnB1c2godGhpcy5pbmRpY2VzLnNwbGljZShhLDEpWzBdKSx0aGlzLmN5Y2xlc1thXT10aGlzLm4tYTtlbHNle2o9dGhpcy5jeWNsZXNbYV0sW3RoaXMuaW5kaWNlc1thXSx0aGlzLmluZGljZXNbdGhpcy5uLWpdXT1bdGhpcy5pbmRpY2VzW3RoaXMubi1qXSx0aGlzLmluZGljZXNbYV1dO2NvbnN0IGI9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pLnNsaWNlKDAsdGhpcy5yKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYil9dGhpcy5yPTB9LHNsb3RzOnt0cCRkb2M6XFxcInBlcm11dGF0aW9ucyhpdGVyYWJsZVssIHJdKSAtLT4gcGVybXV0YXRpb25zIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSByLWxlbmd0aCBwZXJtdXRhdGlvbnMgb2YgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlLlxcXFxuXFxcXG5wZXJtdXRhdGlvbnMocmFuZ2UoMyksIDIpIC0tPiAoMCwxKSwgKDAsMiksICgxLDApLCAoMSwyKSwgKDIsMCksICgyLDEpXFxcIix0cCRuZXcoYixjKXtsZXQgZCxlO1tkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJwZXJtdXRhdGlvbnNcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJyXFxcIl0sYixjLFtTay5idWlsdGluLm5vbmUubm9uZSRdKTtjb25zdCBmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGQpO2lmKGU9U2suYnVpbHRpbi5jaGVja05vbmUoZSk/Zi5sZW5ndGg6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGUsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSwwPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2lmKHRoaXM9PT1hLnBlcm11dGF0aW9ucy5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnBlcm11dGF0aW9ucyhmLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5wZXJtdXRhdGlvbnMuY2FsbChiLGYsZSksYn19fX0pLGEucHJvZHVjdD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5wcm9kdWN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcHJvZHVjdChhKXt0aGlzLnBvb2xzPWEsdGhpcy5uPWEubGVuZ3RoLHRoaXMuaW5kaWNlcz1BcnJheShhLmxlbmd0aCkuZmlsbCgwKSx0aGlzLnBvb2xfc2l6ZXM9YS5tYXAoYT0+YS5sZW5ndGgpLHRoaXMudHAkaXRlcm5leHQ9KCk9Pnt0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0O2NvbnN0IGE9dGhpcy5pbmRpY2VzLm1hcCgoYSxiKT0+dGhpcy5wb29sc1tiXVt0aGlzLmluZGljZXNbYl1dKTtyZXR1cm4gYS5zb21lKGE9PnZvaWQgMD09PWEpP3ZvaWQodGhpcy5uPTApOm5ldyBTay5idWlsdGluLnR1cGxlKGEpfX0saXRlcm5leHQoKXtmb3IobGV0IGE9dGhpcy5uLTE7MDw9YSYmYTx0aGlzLm47KXRoaXMuaW5kaWNlc1thXSsrLHRoaXMuaW5kaWNlc1thXT49dGhpcy5wb29sX3NpemVzW2FdPyh0aGlzLmluZGljZXNbYV09LTEsYS0tKTphKys7aWYoIXRoaXMubnx8dGhpcy5pbmRpY2VzLmV2ZXJ5KGE9Pi0xPT09YSkpcmV0dXJuIHZvaWQodGhpcy5uPTApO2Vsc2V7Y29uc3QgYT10aGlzLmluZGljZXMubWFwKChhLGIpPT50aGlzLnBvb2xzW2JdW3RoaXMuaW5kaWNlc1tiXV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShhKX19LHNsb3RzOnt0cCRkb2M6XFxcInByb2R1Y3QoKml0ZXJhYmxlcywgcmVwZWF0PTEpIC0tPiBwcm9kdWN0IG9iamVjdFxcXFxuXFxcXG5DYXJ0ZXNpYW4gcHJvZHVjdCBvZiBpbnB1dCBpdGVyYWJsZXMuICBFcXVpdmFsZW50IHRvIG5lc3RlZCBmb3ItbG9vcHMuXFxcXG5cXFxcbkZvciBleGFtcGxlLCBwcm9kdWN0KEEsIEIpIHJldHVybnMgdGhlIHNhbWUgYXM6ICAoKHgseSkgZm9yIHggaW4gQSBmb3IgeSBpbiBCKS5cXFxcblRoZSBsZWZ0bW9zdCBpdGVyYXRvcnMgYXJlIGluIHRoZSBvdXRlcm1vc3QgZm9yLWxvb3AsIHNvIHRoZSBvdXRwdXQgdHVwbGVzXFxcXG5jeWNsZSBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIGFuIG9kb21ldGVyICh3aXRoIHRoZSByaWdodG1vc3QgZWxlbWVudCBjaGFuZ2luZ1xcXFxub24gZXZlcnkgaXRlcmF0aW9uKS5cXFxcblxcXFxuVG8gY29tcHV0ZSB0aGUgcHJvZHVjdCBvZiBhbiBpdGVyYWJsZSB3aXRoIGl0c2VsZiwgc3BlY2lmeSB0aGUgbnVtYmVyXFxcXG5vZiByZXBldGl0aW9ucyB3aXRoIHRoZSBvcHRpb25hbCByZXBlYXQga2V5d29yZCBhcmd1bWVudC4gRm9yIGV4YW1wbGUsXFxcXG5wcm9kdWN0KEEsIHJlcGVhdD00KSBtZWFucyB0aGUgc2FtZSBhcyBwcm9kdWN0KEEsIEEsIEEsIEEpLlxcXFxuXFxcXG5wcm9kdWN0KCdhYicsIHJhbmdlKDMpKSAtLT4gKCdhJywwKSAoJ2EnLDEpICgnYScsMikgKCdiJywwKSAoJ2InLDEpICgnYicsMilcXFxcbnByb2R1Y3QoKDAsMSksICgwLDEpLCAoMCwxKSkgLS0+ICgwLDAsMCkgKDAsMCwxKSAoMCwxLDApICgwLDEsMSkgKDEsMCwwKSAuLi5cXFwiLHRwJG5ldyhiLGMpe2xldFtkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwicHJvZHVjdFxcXCIsW1xcXCJyZXBlYXRcXFwiXSxbXSxjLFtuZXcgU2suYnVpbHRpbi5pbnRfKDEpXSk7aWYoZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJGbG93RXJyb3IpLDA+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJyZXBlYXQgYXJndW1lbnQgY2Fubm90IGJlIG5lZ2F0aXZlXFxcIik7Y29uc3QgZT1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErKyllLnB1c2goU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYlthXSkpO2NvbnN0IGY9W10uY29uY2F0KC4uLkFycmF5KGQpLmZpbGwoZSkpO2lmKHRoaXM9PT1hLnByb2R1Y3QucHJvdG90eXBlKXJldHVybiBuZXcgYS5wcm9kdWN0KGYpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5wcm9kdWN0LmNhbGwoYixmKSxifX19fSksYS5yZXBlYXQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMucmVwZWF0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcmVwZWF0KGEsYil7dGhpcy5vYmplY3Q9YSx0aGlzLnRpbWVzPWIsdm9pZCAwPT09YiYmKHRoaXMudHAkaXRlcm5leHQ9KCk9PnRoaXMub2JqZWN0KX0saXRlcm5leHQoKXtyZXR1cm4gMDx0aGlzLnRpbWVzLS0/dGhpcy5vYmplY3Q6dm9pZCAwfSxzbG90czp7dHAkZG9jOlxcXCJyZXBlYXQob2JqZWN0IFssdGltZXNdKSAtPiBjcmVhdGUgYW4gaXRlcmF0b3Igd2hpY2ggcmV0dXJucyB0aGUgb2JqZWN0XFxcXG5mb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMuICBJZiBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBvYmplY3RcXFxcbmVuZGxlc3NseS5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcInJlcGVhdFxcXCIsW1xcXCJvYmplY3RcXFwiLFxcXCJ0aW1lc1xcXCJdLGIsYyxbbnVsbF0pLGU9bnVsbD09PWU/dm9pZCAwOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChlLFNrLmJ1aWx0aW4uT3ZlckZsb3dFcnJvciksdGhpcz09PWEucmVwZWF0LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEucmVwZWF0KGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnJlcGVhdC5jYWxsKGIsZCxlKSxifX0sJHIoKXtyZXR1cm4gb2JqZWN0X3JlcHI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLm9iamVjdCksdGltZXNfcmVwcj12b2lkIDA9PT10aGlzLnRpbWVzP1xcXCJcXFwiOlxcXCIsIFxcXCIrKDA8PXRoaXMudGltZXM/dGhpcy50aW1lczowKSxuZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXFxcIihcXFwiK29iamVjdF9yZXByK3RpbWVzX3JlcHIrXFxcIilcXFwiKX19LG1ldGhvZHM6e19fbGVuZ2h0X2hpbnRfXzp7JG1ldGgoKXtpZih2b2lkIDA9PT10aGlzLnRpbWVzKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibGVuKCkgb2YgdW5zaXplZCBvYmplY3RcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnRpbWVzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGx9fX0pLGEuc3Rhcm1hcD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5zdGFybWFwXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gc3Rhcm1hcChhLGIpe3RoaXMuZnVuYz1hLHRoaXMuaXRlcj1ifSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwPT09YSlyZXR1cm47Y29uc3QgYj1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSxjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmZ1bmMsYik7cmV0dXJuIGN9LHNsb3RzOnt0cCRuZXcoYixjKXtsZXQgZCxlO2lmKFtkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJzdGFybWFwXFxcIixbXFxcImZ1bmNcXFwiLFxcXCJpdGVyYWJsZVxcXCJdLGIsYyxbXSksZT1Tay5hYnN0ci5pdGVyKGUpLGQ9U2suYnVpbHRpbi5jaGVja05vbmUoZCk/U2suYnVpbHRpbi5ib29sOmQsdGhpcz09PWEuc3Rhcm1hcC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnN0YXJtYXAoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuc3Rhcm1hcC5jYWxsKGIsZCxlKSxifX19fSksYS50YWtld2hpbGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMudGFrZXdoaWxlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gdGFrZXdoaWxlKGEsYil7dGhpcy5wcmVkaWNhdGU9YSx0aGlzLml0ZXI9Yn0saXRlcm5leHQoKXtjb25zdCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMCE9PWEpe2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSk7aWYoU2subWlzY2V2YWwuaXNUcnVlKGIpKXJldHVybiBhO3RoaXMudHAkaXRlcm5leHQ9KCk9PnZvaWQgMH19LHNsb3RzOnt0cCRkb2M6XFxcInRha2V3aGlsZShwcmVkaWNhdGUsIGl0ZXJhYmxlKSAtLT4gdGFrZXdoaWxlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSBlbnRyaWVzIGZyb20gYW4gaXRlcmFibGUgYXMgbG9uZyBhcyB0aGUgXFxcXG5wcmVkaWNhdGUgZXZhbHVhdGVzIHRvIHRydWUgZm9yIGVhY2ggZW50cnkuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJ0YWtld2hpbGVcXFwiLGMpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwidGFrZXdoaWxlXFxcIixiLDIsMik7Y29uc3QgZD1iWzBdLGU9U2suYWJzdHIuaXRlcihiWzFdKTtpZih0aGlzPT09YS50YWtld2hpbGUucHJvdG90eXBlKXJldHVybiBuZXcgYS50YWtld2hpbGUoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEudGFrZXdoaWxlLmNhbGwoYixkLGUpLGJ9fX19KSxhLnRlZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9KSxhLnppcF9sb25nZXN0PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLnppcF9sb25nZXN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gemlwX2xvbmdlc3QoYSxiKXt0aGlzLml0ZXJzPWEsdGhpcy5maWxsdmFsdWU9Yix0aGlzLmFjdGl2ZT10aGlzLml0ZXJzLmxlbmd0aH0saXRlcm5leHQoKXtpZighdGhpcy5hY3RpdmUpcmV0dXJuO2xldCBiO2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDx0aGlzLml0ZXJzLmxlbmd0aDtkKyspe2lmKGI9dGhpcy5pdGVyc1tkXS50cCRpdGVybmV4dCgpLHZvaWQgMD09PWIpe2lmKHRoaXMuYWN0aXZlLS0sIXRoaXMuYWN0aXZlKXJldHVybjt0aGlzLml0ZXJzW2RdPW5ldyBhLnJlcGVhdCh0aGlzLmZpbGx2YWx1ZSksYj10aGlzLmZpbGx2YWx1ZX1jLnB1c2goYil9cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGMpfSxzbG90czp7dHAkZG9jOlxcXCJ6aXBfbG9uZ2VzdChpdGVyMSBbLGl0ZXIyIFsuLi5dXSwgW2ZpbGx2YWx1ZT1Ob25lXSkgLS0+IHppcF9sb25nZXN0IG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSB6aXBfbG9uZ2VzdCBvYmplY3Qgd2hvc2UgLl9fbmV4dF9fKCkgbWV0aG9kIHJldHVybnMgYSB0dXBsZSB3aGVyZVxcXFxudGhlIGktdGggZWxlbWVudCBjb21lcyBmcm9tIHRoZSBpLXRoIGl0ZXJhYmxlIGFyZ3VtZW50LiAgVGhlIC5fX25leHRfXygpXFxcXG5tZXRob2QgY29udGludWVzIHVudGlsIHRoZSBsb25nZXN0IGl0ZXJhYmxlIGluIHRoZSBhcmd1bWVudCBzZXF1ZW5jZVxcXFxuaXMgZXhoYXVzdGVkIGFuZCB0aGVuIGl0IHJhaXNlcyBTdG9wSXRlcmF0aW9uLiAgV2hlbiB0aGUgc2hvcnRlciBpdGVyYWJsZXNcXFxcbmFyZSBleGhhdXN0ZWQsIHRoZSBmaWxsdmFsdWUgaXMgc3Vic3RpdHV0ZWQgaW4gdGhlaXIgcGxhY2UuICBUaGUgZmlsbHZhbHVlXFxcXG5kZWZhdWx0cyB0byBOb25lIG9yIGNhbiBiZSBzcGVjaWZpZWQgYnkgYSBrZXl3b3JkIGFyZ3VtZW50LlxcXFxuXFxcIix0cCRuZXcoYixjKXtjb25zdFtkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiemlwX2xvbmdlc3RcXFwiLFtcXFwiZmlsbHZhbHVlXFxcIl0sW10sYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkXSksZT1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErKyllLnB1c2goU2suYWJzdHIuaXRlcihiW2FdKSk7aWYodGhpcz09PWEuemlwX2xvbmdlc3QucHJvdG90eXBlKXJldHVybiBuZXcgYS56aXBfbG9uZ2VzdChlLGQpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS56aXBfbG9uZ2VzdC5jYWxsKGIsZSxkKSxifX19fSksYS5fX2RvY19fPW5ldyBTay5idWlsdGluLnN0cihcXFwiQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHB5dGhvbiBpdGVydG9vbHMgbW9kdWxlIGluIFNrdWxwdFxcXCIpLGEuX19wYWNrYWdlX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKSxhfTtcIixcInNyYy9saWIvanNvbi9fX2luaXRfXy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7XFxcInVzZSBzdHJpY3RcXFwiO3ZhciBhPXt9LGI9ZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5weUNoZWNrQXJncyhcXFwiZHVtcHNcXFwiLGFyZ3VtZW50cywxLDEvMCwhMCwhMSk7dmFyIGIsYyxkLGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGY9bmV3IFNrLmJ1aWx0aW5zLmRpY3QoYSksZz0hMTtyZXR1cm4gYj17YXNjaWk6ITAsc2VwYXJhdG9yczp7aXRlbV9zZXBhcmF0b3I6XFxcIiwgXFxcIixrZXlfc2VwYXJhdG9yOlxcXCI6IFxcXCJ9fSxmPVNrLmZmaS5yZW1hcFRvSnMoZiksYz1Tay5mZmkucmVtYXBUb0pzKGVbMF0pLFxcXCJib29sZWFuXFxcIj09dHlwZW9mIGYuZW5zdXJlX2FzY2lpJiYhMT09PWYuZW5zdXJlX2FzY2lpJiYoYi5hc2NpaT0hMSksXFxcImJvb2xlYW5cXFwiPT10eXBlb2YgZi5zb3J0X2tleXMmJmYuc29ydF9rZXlzJiYoZz0hMCksZ3x8KGIuY21wPWZ1bmN0aW9uKCl7cmV0dXJuIDB9KSxcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYuc2VwYXJhdG9ycyYmMj09Zi5zZXBhcmF0b3JzLmxlbmd0aCYmKGIuc2VwYXJhdG9ycy5pdGVtX3NlcGFyYXRvcj1mLnNlcGFyYXRvcnNbMF0sYi5zZXBhcmF0b3JzLmtleV9zZXBhcmF0b3I9Zi5zZXBhcmF0b3JzWzFdKSxmLmluZGVudCYmKGIuc3BhY2U9Zi5pbmRlbnQpLGYuZGVmYXVsdCxkPXN0cmluZ2lmeShjLGIpLG5ldyBTay5idWlsdGluLnN0cihkKX07Yi5jb19rd2FyZ3M9ITAsYS5kdW1wcz1uZXcgU2suYnVpbHRpbi5mdW5jKGIpO3ZhciBjPWZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcImxvYWRzXFxcIixhcmd1bWVudHMsMSwxLzAsITAsITEpO3ZhciBiLGMsZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZT1uZXcgU2suYnVpbHRpbnMuZGljdChhKTtyZXR1cm4gZT1Tay5mZmkucmVtYXBUb0pzKGUpLGI9ZFswXS52LGM9SlNPTi5wYXJzZShiKSxTay5mZmkucmVtYXBUb1B5KGMpfTtyZXR1cm4gYy5jb19rd2FyZ3M9ITAsYS5sb2Fkcz1uZXcgU2suYnVpbHRpbi5mdW5jKGMpLGF9OyhmdW5jdGlvbigpe2Z1bmN0aW9uIHIoYixkLGUpe2Z1bmN0aW9uIG8oaCxpKXtpZighZFtoXSl7aWYoIWJbaF0pe3ZhciBmPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFpJiZmKXJldHVybiBmKGgsITApO2lmKGcpcmV0dXJuIGcoaCwhMCk7dmFyIGM9bmV3IEVycm9yKFxcXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1xcXCIraCtcXFwiJ1xcXCIpO3Rocm93IGMuY29kZT1cXFwiTU9EVUxFX05PVF9GT1VORFxcXCIsY312YXIgYT1kW2hdPXtleHBvcnRzOnt9fTtiW2hdWzBdLmNhbGwoYS5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbaF1bMV1bYV07cmV0dXJuIG8oY3x8YSl9LGEsYS5leHBvcnRzLHIsYixkLGUpfXJldHVybiBkW2hdLmV4cG9ydHN9Zm9yKHZhciBnPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPGUubGVuZ3RoO2ErKylvKGVbYV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24oYSxiKXt2YXIgYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIEpTT04/YShcXFwianNvbmlmeVxcXCIpOkpTT047Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7Ynx8KGI9e30pLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiJiYoYj17Y21wOmJ9KTt2YXIgZj1iLmNtcCYmZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihlLGEpe3ZhciBiPXtrZXk6ZSx2YWx1ZTpkW2VdfSxmPXtrZXk6YSx2YWx1ZTpkW2FdfTtyZXR1cm4gYyhiLGYpfX19KGIuY21wKTtyZXR1cm4gZnVuY3Rpb24gc3RyaW5naWZ5KGEpe2lmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYXx8bnVsbD09PWEpcmV0dXJuIGMuc3RyaW5naWZ5KGEpO2lmKGQoYSkpe2Zvcih2YXIgYj1bXSxnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKHN0cmluZ2lmeShhW2ddKSk7cmV0dXJuXFxcIltcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIn1mb3IodmFyIGgsaj1lKGEpLnNvcnQoZiYmZihhKSksYj1bXSxnPTA7ZzxqLmxlbmd0aDtnKyspaD1qW2ddLGIucHVzaChzdHJpbmdpZnkoaCkrXFxcIjpcXFwiK3N0cmluZ2lmeShhW2hdKSk7cmV0dXJuXFxcIntcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIn0oYSl9O3ZhciBkPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVyblxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT17fS50b1N0cmluZy5jYWxsKGEpfSxlPU9iamVjdC5rZXlzfHxmdW5jdGlvbihhKXt2YXIgYj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5fHxmdW5jdGlvbigpe3JldHVybiEwfSxjPVtdO2Zvcih2YXIgZCBpbiBhKWIuY2FsbChhLGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9fSx7anNvbmlmeToyfV0sMjpbZnVuY3Rpb24oYSxiLGMpe2MucGFyc2U9YShcXFwiLi9saWIvcGFyc2VcXFwiKSxjLnN0cmluZ2lmeT1hKFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiKX0se1xcXCIuL2xpYi9wYXJzZVxcXCI6MyxcXFwiLi9saWIvc3RyaW5naWZ5XFxcIjo0fV0sMzpbZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGYsZyxoPXsnXFxcIic6XFxcIlxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXCIsXFxcIi9cXFwiOlxcXCIvXFxcIixiOlxcXCJcXFxcYlxcXCIsZjpcXFwiXFxcXGZcXFwiLG46XFxcIlxcXFxuXFxcIixyOlxcXCJcXFxcclxcXCIsdDpcXFwiXFxcXHRcXFwifSxqPWZ1bmN0aW9uKGEpe3Rocm93e25hbWU6XFxcIlN5bnRheEVycm9yXFxcIixtZXNzYWdlOmEsYXQ6ZCx0ZXh0OmZ9fSxrPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIT09ZSYmaihcXFwiRXhwZWN0ZWQgJ1xcXCIrYStcXFwiJyBpbnN0ZWFkIG9mICdcXFwiK2UrXFxcIidcXFwiKSxlPWYuY2hhckF0KGQpLGQrPTEsZX0sbD1mdW5jdGlvbigpe3ZhciBhLGI9XFxcIlxcXCI7Zm9yKFxcXCItXFxcIj09PWUmJihiPVxcXCItXFxcIixrKFxcXCItXFxcIikpO1xcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lLGsoKTtpZihcXFwiLlxcXCI9PT1lKWZvcihiKz1cXFwiLlxcXCI7aygpJiZcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZTtpZihcXFwiZVxcXCI9PT1lfHxcXFwiRVxcXCI9PT1lKWZvcihiKz1lLGsoKSwoXFxcIi1cXFwiPT09ZXx8XFxcIitcXFwiPT09ZSkmJihiKz1lLGsoKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO3JldHVybiBhPStiLGlzRmluaXRlKGEpP2E6dm9pZCBqKFxcXCJCYWQgbnVtYmVyXFxcIil9LG09ZnVuY3Rpb24oKXt2YXIgYixjLGQsYT1TdHJpbmcuZnJvbUNoYXJDb2RlLGY9XFxcIlxcXCI7aWYoXFxcIlxcXFxcXFwiXFxcIj09PWUpZm9yKDtrKCk7KXtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlyZXR1cm4gaygpLGY7aWYoXFxcIlxcXFxcXFxcXFxcIiE9PWUpZis9ZTtlbHNlIGlmKGsoKSxcXFwidVxcXCI9PT1lKXtmb3IoZD0wLGM9MDs0PmMmJihiPXBhcnNlSW50KGsoKSwxNiksISFpc0Zpbml0ZShiKSk7Yys9MSlkPTE2KmQrYjtmKz1hKGQpfWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBoW2VdKWYrPWhbZV07ZWxzZSBicmVha31qKFxcXCJCYWQgc3RyaW5nXFxcIil9LG49ZnVuY3Rpb24oKXtmb3IoO2UmJlxcXCIgXFxcIj49ZTspaygpfSxvPWZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2VcXFwidFxcXCI6cmV0dXJuIGsoXFxcInRcXFwiKSxrKFxcXCJyXFxcIiksayhcXFwidVxcXCIpLGsoXFxcImVcXFwiKSwhMDtjYXNlXFxcImZcXFwiOnJldHVybiBrKFxcXCJmXFxcIiksayhcXFwiYVxcXCIpLGsoXFxcImxcXFwiKSxrKFxcXCJzXFxcIiksayhcXFwiZVxcXCIpLCExO2Nhc2VcXFwiblxcXCI6cmV0dXJuIGsoXFxcIm5cXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwibFxcXCIpLGsoXFxcImxcXFwiKSxudWxsO31qKFxcXCJVbmV4cGVjdGVkICdcXFwiK2UrXFxcIidcXFwiKX0scD1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKFxcXCJbXFxcIj09PWUpe2lmKGsoXFxcIltcXFwiKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7Zm9yKDtlOyl7aWYoYS5wdXNoKGcoKSksbigpLFxcXCJdXFxcIj09PWUpcmV0dXJuIGsoXFxcIl1cXFwiKSxhO2soXFxcIixcXFwiKSxuKCl9fWooXFxcIkJhZCBhcnJheVxcXCIpfSxxPWZ1bmN0aW9uKCl7dmFyIGEsYj17fTtpZihcXFwie1xcXCI9PT1lKXtpZihrKFxcXCJ7XFxcIiksbigpLFxcXCJ9XFxcIj09PWUpcmV0dXJuIGsoXFxcIn1cXFwiKSxiO2Zvcig7ZTspe2lmKGE9bSgpLG4oKSxrKFxcXCI6XFxcIiksT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYixhKSYmaihcXFwiRHVwbGljYXRlIGtleSBcXFxcXFxcIlxcXCIrYStcXFwiXFxcXFxcXCJcXFwiKSxiW2FdPWcoKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIG9iamVjdFxcXCIpfTtnPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKSxcXFwie1xcXCI9PT1lP3EoKTpcXFwiW1xcXCI9PT1lP3AoKTpcXFwiXFxcXFxcXCJcXFwiPT09ZT9tKCk6XFxcIi1cXFwiPT09ZT9sKCk6XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU/bCgpOm8oKX0sYi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM7cmV0dXJuIGY9YSxkPTAsZT1cXFwiIFxcXCIsYz1nKCksbigpLGUmJmooXFxcIlN5bnRheCBlcnJvclxcXCIpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiP2Z1bmN0aW9uIHdhbGsoYSxjKXt2YXIgZCxlLGY9YVtjXTtpZihmJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYpZm9yKGQgaW4gZilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZixkKSYmKGU9d2FsayhmLGQpLHZvaWQgMD09PWU/ZGVsZXRlIGZbZF06ZltkXT1lKTtyZXR1cm4gYi5jYWxsKGEsYyxmKX0oe1xcXCJcXFwiOmN9LFxcXCJcXFwiKTpjfX0se31dLDQ6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gcXVvdGUoYSl7cmV0dXJuIGYubGFzdEluZGV4PTAsZi50ZXN0KGEpP1xcXCJcXFxcXFxcIlxcXCIrYS5yZXBsYWNlKGYsZnVuY3Rpb24oYil7dmFyIGE9Z1tiXTtyZXR1cm5cXFwic3RyaW5nXFxcIj09dHlwZW9mIGE/YTpcXFwiXFxcXFxcXFx1XFxcIisoXFxcIjAwMDBcXFwiK2IuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KX0pK1xcXCJcXFxcXFxcIlxcXCI6XFxcIlxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCJ9ZnVuY3Rpb24gc3RyKGEsYil7dmFyIGYsZyxoLGosbCxtPWMsbj1iW2FdO3N3aXRjaChuJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIG4mJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBuLnRvSlNPTiYmKG49bi50b0pTT04oYSkpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlJiYobj1lLmNhbGwoYixhLG4pKSx0eXBlb2Ygbil7Y2FzZVxcXCJzdHJpbmdcXFwiOnJldHVybiBxdW90ZShuKTtjYXNlXFxcIm51bWJlclxcXCI6cmV0dXJuIGlzRmluaXRlKG4pP24rXFxcIlxcXCI6XFxcIm51bGxcXFwiO2Nhc2VcXFwiYm9vbGVhblxcXCI6Y2FzZVxcXCJudWxsXFxcIjpyZXR1cm4gbitcXFwiXFxcIjtjYXNlXFxcIm9iamVjdFxcXCI6aWYoIW4pcmV0dXJuXFxcIm51bGxcXFwiO2lmKGMrPWQsbD1bXSxcXFwiW29iamVjdCBBcnJheV1cXFwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKSl7Zm9yKGo9bi5sZW5ndGgsZj0wO2Y8ajtmKz0xKWxbZl09c3RyKGYsbil8fFxcXCJudWxsXFxcIjtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcIltdXFxcIjpjP1xcXCJbXFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwiXVxcXCI6XFxcIltcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIixjPW0saH1pZihlJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGUpZm9yKGo9ZS5sZW5ndGgsZj0wO2Y8ajtmKz0xKWc9ZVtmXSxcXFwic3RyaW5nXFxcIj09dHlwZW9mIGcmJihoPXN0cihnLG4pLGgmJmwucHVzaChxdW90ZShnKSsoYz9cXFwiOiBcXFwiOlxcXCI6XFxcIikraCkpO2Vsc2UgZm9yKGcgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixnKSYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7cmV0dXJuIGg9MD09PWwubGVuZ3RoP1xcXCJ7fVxcXCI6Yz9cXFwie1xcXFxuXFxcIitjK2wuam9pbihcXFwiLFxcXFxuXFxcIitjKStcXFwiXFxcXG5cXFwiK20rXFxcIn1cXFwiOlxcXCJ7XFxcIitsLmpvaW4oXFxcIixcXFwiKStcXFwifVxcXCIsYz1tLGg7fX12YXIgYyxkLGUsZj0vW1xcXFxcXFxcXFxcXFxcXCJcXFxceDAwLVxcXFx4MWZcXFxceDdmLVxcXFx4OWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl0vZyxnPXtcXFwiXFxiXFxcIjpcXFwiXFxcXFxcXFxiXFxcIixcXFwiXFx0XFxcIjpcXFwiXFxcXFxcXFx0XFxcIixcXFwiXFxcXG5cXFwiOlxcXCJcXFxcXFxcXG5cXFwiLFxcXCJcXGZcXFwiOlxcXCJcXFxcXFxcXGZcXFwiLFxcXCJcXFxcclxcXCI6XFxcIlxcXFxcXFxcclxcXCIsJ1xcXCInOlxcXCJcXFxcXFxcXFxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIn07Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixmKXt2YXIgZztpZihjPVxcXCJcXFwiLGQ9XFxcIlxcXCIsXFxcIm51bWJlclxcXCI9PXR5cGVvZiBmKWZvcihnPTA7ZzxmO2crPTEpZCs9XFxcIiBcXFwiO2Vsc2VcXFwic3RyaW5nXFxcIj09dHlwZW9mIGYmJihkPWYpO2lmKGU9YixiJiZcXFwiZnVuY3Rpb25cXFwiIT10eXBlb2YgYiYmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYnx8XFxcIm51bWJlclxcXCIhPXR5cGVvZiBiLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKFxcXCJKU09OLnN0cmluZ2lmeVxcXCIpO3JldHVybiBzdHIoXFxcIlxcXCIse1xcXCJcXFwiOmF9KX19LHt9XSw1OltmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCl7dGhyb3cgbmV3IEVycm9yKFxcXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBydW5UaW1lb3V0KGEpe2lmKGM9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGEsMCk7aWYoKGM9PT1kZWZhdWx0U2V0VGltb3V0fHwhYykmJnNldFRpbWVvdXQpcmV0dXJuIGM9c2V0VGltZW91dCxzZXRUaW1lb3V0KGEsMCk7dHJ5e3JldHVybiBjKGEsMCl9Y2F0Y2goYil7dHJ5e3JldHVybiBjLmNhbGwobnVsbCxhLDApfWNhdGNoKGIpe3JldHVybiBjLmNhbGwodGhpcyxhLDApfX19ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KGEpe2lmKGQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigoZD09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFkKSYmY2xlYXJUaW1lb3V0KXJldHVybiBkPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBkKGEpfWNhdGNoKGIpe3RyeXtyZXR1cm4gZC5jYWxsKG51bGwsYSl9Y2F0Y2goYil7cmV0dXJuIGQuY2FsbCh0aGlzLGEpfX19ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7aCYmZiYmKGg9ITEsZi5sZW5ndGg/Zz1mLmNvbmNhdChnKTppPS0xLGcubGVuZ3RoJiZkcmFpblF1ZXVlKCkpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighaCl7dmFyIGE9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2g9ITA7Zm9yKHZhciBiPWcubGVuZ3RoO2I7KXtmb3IoZj1nLGc9W107KytpPGI7KWYmJmZbaV0ucnVuKCk7aT0tMSxiPWcubGVuZ3RofWY9bnVsbCxoPSExLHJ1bkNsZWFyVGltZW91dChhKX19ZnVuY3Rpb24gSXRlbShhLGIpe3RoaXMuZnVuPWEsdGhpcy5hcnJheT1ifWZ1bmN0aW9uIG5vb3AoKXt9dmFyIGMsZCxlPWIuZXhwb3J0cz17fTsoZnVuY3Rpb24oKXt0cnl7Yz1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmRlZmF1bHRTZXRUaW1vdXR9Y2F0Y2goYSl7Yz1kZWZhdWx0U2V0VGltb3V0fXRyeXtkPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2goYSl7ZD1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0pKCk7dmFyIGYsZz1bXSxoPSExLGk9LTE7ZS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgYj1BcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKDE8YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWJbYy0xXT1hcmd1bWVudHNbY107Zy5wdXNoKG5ldyBJdGVtKGEsYikpLDEhPT1nLmxlbmd0aHx8aHx8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZS50aXRsZT1cXFwiYnJvd3NlclxcXCIsZS5icm93c2VyPSEwLGUuZW52PXt9LGUuYXJndj1bXSxlLnZlcnNpb249XFxcIlxcXCIsZS52ZXJzaW9ucz17fSxlLm9uPW5vb3AsZS5hZGRMaXN0ZW5lcj1ub29wLGUub25jZT1ub29wLGUub2ZmPW5vb3AsZS5yZW1vdmVMaXN0ZW5lcj1ub29wLGUucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3AsZS5lbWl0PW5vb3AsZS5wcmVwZW5kTGlzdGVuZXI9bm9vcCxlLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcCxlLmxpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybltdfSxlLmJpbmRpbmc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXFxcIil9LGUuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuXFxcIi9cXFwifSxlLmNoZGlyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFxcXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0se31dLDY6W2Z1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKGMpe3ZhciBkPWEoXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCIpO2MuYnJvd3Nlcj93aW5kb3cuc3RyaW5naWZ5PWQ6Yi5leHBvcnRzPWR9KS5jYWxsKHRoaXMsYShcXFwiX3Byb2Nlc3NcXFwiKSl9LHtfcHJvY2Vzczo1LFxcXCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcXFwiOjF9XX0se30sWzZdKTtcIixcInNyYy9saWIvanNvbi9zdHJpbmdpZnkuanNcIjpcIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoYixkLGUpe2Z1bmN0aW9uIG8oaCxpKXtpZighZFtoXSl7aWYoIWJbaF0pe3ZhciBmPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFpJiZmKXJldHVybiBmKGgsITApO2lmKGcpcmV0dXJuIGcoaCwhMCk7dmFyIGM9bmV3IEVycm9yKFxcXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1xcXCIraCtcXFwiJ1xcXCIpO3Rocm93IGMuY29kZT1cXFwiTU9EVUxFX05PVF9GT1VORFxcXCIsY312YXIgYT1kW2hdPXtleHBvcnRzOnt9fTtiW2hdWzBdLmNhbGwoYS5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbaF1bMV1bYV07cmV0dXJuIG8oY3x8YSl9LGEsYS5leHBvcnRzLHIsYixkLGUpfXJldHVybiBkW2hdLmV4cG9ydHN9Zm9yKHZhciBnPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPGUubGVuZ3RoO2ErKylvKGVbYV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24oYSxiKXt2YXIgYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIEpTT04/YShcXFwianNvbmlmeVxcXCIpOkpTT047Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7Ynx8KGI9e30pLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiJiYoYj17Y21wOmJ9KTt2YXIgZj1iLmNtcCYmZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihlLGEpe3ZhciBiPXtrZXk6ZSx2YWx1ZTpkW2VdfSxmPXtrZXk6YSx2YWx1ZTpkW2FdfTtyZXR1cm4gYyhiLGYpfX19KGIuY21wKTtyZXR1cm4gZnVuY3Rpb24gc3RyaW5naWZ5KGEpe2lmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYXx8bnVsbD09PWEpcmV0dXJuIGMuc3RyaW5naWZ5KGEpO2lmKGQoYSkpe2Zvcih2YXIgYj1bXSxnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKHN0cmluZ2lmeShhW2ddKSk7cmV0dXJuXFxcIltcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIn1mb3IodmFyIGgsaj1lKGEpLnNvcnQoZiYmZihhKSksYj1bXSxnPTA7ZzxqLmxlbmd0aDtnKyspaD1qW2ddLGIucHVzaChzdHJpbmdpZnkoaCkrXFxcIjpcXFwiK3N0cmluZ2lmeShhW2hdKSk7cmV0dXJuXFxcIntcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIn0oYSl9O3ZhciBkPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVyblxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT17fS50b1N0cmluZy5jYWxsKGEpfSxlPU9iamVjdC5rZXlzfHxmdW5jdGlvbihhKXt2YXIgYj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5fHxmdW5jdGlvbigpe3JldHVybiEwfSxjPVtdO2Zvcih2YXIgZCBpbiBhKWIuY2FsbChhLGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9fSx7anNvbmlmeToyfV0sMjpbZnVuY3Rpb24oYSxiLGMpe2MucGFyc2U9YShcXFwiLi9saWIvcGFyc2VcXFwiKSxjLnN0cmluZ2lmeT1hKFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiKX0se1xcXCIuL2xpYi9wYXJzZVxcXCI6MyxcXFwiLi9saWIvc3RyaW5naWZ5XFxcIjo0fV0sMzpbZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGYsZyxoPXsnXFxcIic6XFxcIlxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXCIsXFxcIi9cXFwiOlxcXCIvXFxcIixiOlxcXCJcXFxcYlxcXCIsZjpcXFwiXFxcXGZcXFwiLG46XFxcIlxcXFxuXFxcIixyOlxcXCJcXFxcclxcXCIsdDpcXFwiXFxcXHRcXFwifSxqPWZ1bmN0aW9uKGEpe3Rocm93e25hbWU6XFxcIlN5bnRheEVycm9yXFxcIixtZXNzYWdlOmEsYXQ6ZCx0ZXh0OmZ9fSxrPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIT09ZSYmaihcXFwiRXhwZWN0ZWQgJ1xcXCIrYStcXFwiJyBpbnN0ZWFkIG9mICdcXFwiK2UrXFxcIidcXFwiKSxlPWYuY2hhckF0KGQpLGQrPTEsZX0sbD1mdW5jdGlvbigpe3ZhciBhLGI9XFxcIlxcXCI7Zm9yKFxcXCItXFxcIj09PWUmJihiPVxcXCItXFxcIixrKFxcXCItXFxcIikpO1xcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lLGsoKTtpZihcXFwiLlxcXCI9PT1lKWZvcihiKz1cXFwiLlxcXCI7aygpJiZcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZTtpZihcXFwiZVxcXCI9PT1lfHxcXFwiRVxcXCI9PT1lKWZvcihiKz1lLGsoKSwoXFxcIi1cXFwiPT09ZXx8XFxcIitcXFwiPT09ZSkmJihiKz1lLGsoKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO3JldHVybiBhPStiLGlzRmluaXRlKGEpP2E6dm9pZCBqKFxcXCJCYWQgbnVtYmVyXFxcIil9LG09ZnVuY3Rpb24oKXt2YXIgYixjLGQsYT1TdHJpbmcuZnJvbUNoYXJDb2RlLGY9XFxcIlxcXCI7aWYoXFxcIlxcXFxcXFwiXFxcIj09PWUpZm9yKDtrKCk7KXtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlyZXR1cm4gaygpLGY7aWYoXFxcIlxcXFxcXFxcXFxcIiE9PWUpZis9ZTtlbHNlIGlmKGsoKSxcXFwidVxcXCI9PT1lKXtmb3IoZD0wLGM9MDs0PmMmJihiPXBhcnNlSW50KGsoKSwxNiksISFpc0Zpbml0ZShiKSk7Yys9MSlkPTE2KmQrYjtmKz1hKGQpfWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBoW2VdKWYrPWhbZV07ZWxzZSBicmVha31qKFxcXCJCYWQgc3RyaW5nXFxcIil9LG49ZnVuY3Rpb24oKXtmb3IoO2UmJlxcXCIgXFxcIj49ZTspaygpfSxvPWZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2VcXFwidFxcXCI6cmV0dXJuIGsoXFxcInRcXFwiKSxrKFxcXCJyXFxcIiksayhcXFwidVxcXCIpLGsoXFxcImVcXFwiKSwhMDtjYXNlXFxcImZcXFwiOnJldHVybiBrKFxcXCJmXFxcIiksayhcXFwiYVxcXCIpLGsoXFxcImxcXFwiKSxrKFxcXCJzXFxcIiksayhcXFwiZVxcXCIpLCExO2Nhc2VcXFwiblxcXCI6cmV0dXJuIGsoXFxcIm5cXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwibFxcXCIpLGsoXFxcImxcXFwiKSxudWxsO31qKFxcXCJVbmV4cGVjdGVkICdcXFwiK2UrXFxcIidcXFwiKX0scD1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKFxcXCJbXFxcIj09PWUpe2lmKGsoXFxcIltcXFwiKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7Zm9yKDtlOyl7aWYoYS5wdXNoKGcoKSksbigpLFxcXCJdXFxcIj09PWUpcmV0dXJuIGsoXFxcIl1cXFwiKSxhO2soXFxcIixcXFwiKSxuKCl9fWooXFxcIkJhZCBhcnJheVxcXCIpfSxxPWZ1bmN0aW9uKCl7dmFyIGEsYj17fTtpZihcXFwie1xcXCI9PT1lKXtpZihrKFxcXCJ7XFxcIiksbigpLFxcXCJ9XFxcIj09PWUpcmV0dXJuIGsoXFxcIn1cXFwiKSxiO2Zvcig7ZTspe2lmKGE9bSgpLG4oKSxrKFxcXCI6XFxcIiksT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYixhKSYmaihcXFwiRHVwbGljYXRlIGtleSBcXFxcXFxcIlxcXCIrYStcXFwiXFxcXFxcXCJcXFwiKSxiW2FdPWcoKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIG9iamVjdFxcXCIpfTtnPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKSxcXFwie1xcXCI9PT1lP3EoKTpcXFwiW1xcXCI9PT1lP3AoKTpcXFwiXFxcXFxcXCJcXFwiPT09ZT9tKCk6XFxcIi1cXFwiPT09ZT9sKCk6XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU/bCgpOm8oKX0sYi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM7cmV0dXJuIGY9YSxkPTAsZT1cXFwiIFxcXCIsYz1nKCksbigpLGUmJmooXFxcIlN5bnRheCBlcnJvclxcXCIpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiP2Z1bmN0aW9uIHdhbGsoYSxjKXt2YXIgZCxlLGY9YVtjXTtpZihmJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYpZm9yKGQgaW4gZilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZixkKSYmKGU9d2FsayhmLGQpLHZvaWQgMD09PWU/ZGVsZXRlIGZbZF06ZltkXT1lKTtyZXR1cm4gYi5jYWxsKGEsYyxmKX0oe1xcXCJcXFwiOmN9LFxcXCJcXFwiKTpjfX0se31dLDQ6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gcXVvdGUoYSl7cmV0dXJuIGYubGFzdEluZGV4PTAsZi50ZXN0KGEpP1xcXCJcXFxcXFxcIlxcXCIrYS5yZXBsYWNlKGYsZnVuY3Rpb24oYil7dmFyIGE9Z1tiXTtyZXR1cm5cXFwic3RyaW5nXFxcIj09dHlwZW9mIGE/YTpcXFwiXFxcXFxcXFx1XFxcIisoXFxcIjAwMDBcXFwiK2IuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KX0pK1xcXCJcXFxcXFxcIlxcXCI6XFxcIlxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCJ9ZnVuY3Rpb24gc3RyKGEsYil7dmFyIGYsZyxoLGosbCxtPWMsbj1iW2FdO3N3aXRjaChuJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIG4mJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBuLnRvSlNPTiYmKG49bi50b0pTT04oYSkpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlJiYobj1lLmNhbGwoYixhLG4pKSx0eXBlb2Ygbil7Y2FzZVxcXCJzdHJpbmdcXFwiOnJldHVybiBxdW90ZShuKTtjYXNlXFxcIm51bWJlclxcXCI6cmV0dXJuIGlzRmluaXRlKG4pP24rXFxcIlxcXCI6XFxcIm51bGxcXFwiO2Nhc2VcXFwiYm9vbGVhblxcXCI6Y2FzZVxcXCJudWxsXFxcIjpyZXR1cm4gbitcXFwiXFxcIjtjYXNlXFxcIm9iamVjdFxcXCI6aWYoIW4pcmV0dXJuXFxcIm51bGxcXFwiO2lmKGMrPWQsbD1bXSxcXFwiW29iamVjdCBBcnJheV1cXFwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKSl7Zm9yKGo9bi5sZW5ndGgsZj0wO2Y8ajtmKz0xKWxbZl09c3RyKGYsbil8fFxcXCJudWxsXFxcIjtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcIltdXFxcIjpjP1xcXCJbXFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwiXVxcXCI6XFxcIltcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIixjPW0saH1pZihlJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGUpZm9yKGo9ZS5sZW5ndGgsZj0wO2Y8ajtmKz0xKWc9ZVtmXSxcXFwic3RyaW5nXFxcIj09dHlwZW9mIGcmJihoPXN0cihnLG4pLGgmJmwucHVzaChxdW90ZShnKSsoYz9cXFwiOiBcXFwiOlxcXCI6XFxcIikraCkpO2Vsc2UgZm9yKGcgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixnKSYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7cmV0dXJuIGg9MD09PWwubGVuZ3RoP1xcXCJ7fVxcXCI6Yz9cXFwie1xcXFxuXFxcIitjK2wuam9pbihcXFwiLFxcXFxuXFxcIitjKStcXFwiXFxcXG5cXFwiK20rXFxcIn1cXFwiOlxcXCJ7XFxcIitsLmpvaW4oXFxcIixcXFwiKStcXFwifVxcXCIsYz1tLGg7fX12YXIgYyxkLGUsZj0vW1xcXFxcXFxcXFxcXFxcXCJcXFxceDAwLVxcXFx4MWZcXFxceDdmLVxcXFx4OWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl0vZyxnPXtcXFwiXFxiXFxcIjpcXFwiXFxcXFxcXFxiXFxcIixcXFwiXFx0XFxcIjpcXFwiXFxcXFxcXFx0XFxcIixcXFwiXFxcXG5cXFwiOlxcXCJcXFxcXFxcXG5cXFwiLFxcXCJcXGZcXFwiOlxcXCJcXFxcXFxcXGZcXFwiLFxcXCJcXFxcclxcXCI6XFxcIlxcXFxcXFxcclxcXCIsJ1xcXCInOlxcXCJcXFxcXFxcXFxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIn07Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixmKXt2YXIgZztpZihjPVxcXCJcXFwiLGQ9XFxcIlxcXCIsXFxcIm51bWJlclxcXCI9PXR5cGVvZiBmKWZvcihnPTA7ZzxmO2crPTEpZCs9XFxcIiBcXFwiO2Vsc2VcXFwic3RyaW5nXFxcIj09dHlwZW9mIGYmJihkPWYpO2lmKGU9YixiJiZcXFwiZnVuY3Rpb25cXFwiIT10eXBlb2YgYiYmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYnx8XFxcIm51bWJlclxcXCIhPXR5cGVvZiBiLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKFxcXCJKU09OLnN0cmluZ2lmeVxcXCIpO3JldHVybiBzdHIoXFxcIlxcXCIse1xcXCJcXFwiOmF9KX19LHt9XSw1OltmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCl7dGhyb3cgbmV3IEVycm9yKFxcXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBydW5UaW1lb3V0KGEpe2lmKGM9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGEsMCk7aWYoKGM9PT1kZWZhdWx0U2V0VGltb3V0fHwhYykmJnNldFRpbWVvdXQpcmV0dXJuIGM9c2V0VGltZW91dCxzZXRUaW1lb3V0KGEsMCk7dHJ5e3JldHVybiBjKGEsMCl9Y2F0Y2goYil7dHJ5e3JldHVybiBjLmNhbGwobnVsbCxhLDApfWNhdGNoKGIpe3JldHVybiBjLmNhbGwodGhpcyxhLDApfX19ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KGEpe2lmKGQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigoZD09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFkKSYmY2xlYXJUaW1lb3V0KXJldHVybiBkPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBkKGEpfWNhdGNoKGIpe3RyeXtyZXR1cm4gZC5jYWxsKG51bGwsYSl9Y2F0Y2goYil7cmV0dXJuIGQuY2FsbCh0aGlzLGEpfX19ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7aCYmZiYmKGg9ITEsZi5sZW5ndGg/Zz1mLmNvbmNhdChnKTppPS0xLGcubGVuZ3RoJiZkcmFpblF1ZXVlKCkpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighaCl7dmFyIGE9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2g9ITA7Zm9yKHZhciBiPWcubGVuZ3RoO2I7KXtmb3IoZj1nLGc9W107KytpPGI7KWYmJmZbaV0ucnVuKCk7aT0tMSxiPWcubGVuZ3RofWY9bnVsbCxoPSExLHJ1bkNsZWFyVGltZW91dChhKX19ZnVuY3Rpb24gSXRlbShhLGIpe3RoaXMuZnVuPWEsdGhpcy5hcnJheT1ifWZ1bmN0aW9uIG5vb3AoKXt9dmFyIGMsZCxlPWIuZXhwb3J0cz17fTsoZnVuY3Rpb24oKXt0cnl7Yz1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmRlZmF1bHRTZXRUaW1vdXR9Y2F0Y2goYSl7Yz1kZWZhdWx0U2V0VGltb3V0fXRyeXtkPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2goYSl7ZD1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0pKCk7dmFyIGYsZz1bXSxoPSExLGk9LTE7ZS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgYj1BcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKDE8YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWJbYy0xXT1hcmd1bWVudHNbY107Zy5wdXNoKG5ldyBJdGVtKGEsYikpLDEhPT1nLmxlbmd0aHx8aHx8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZS50aXRsZT1cXFwiYnJvd3NlclxcXCIsZS5icm93c2VyPSEwLGUuZW52PXt9LGUuYXJndj1bXSxlLnZlcnNpb249XFxcIlxcXCIsZS52ZXJzaW9ucz17fSxlLm9uPW5vb3AsZS5hZGRMaXN0ZW5lcj1ub29wLGUub25jZT1ub29wLGUub2ZmPW5vb3AsZS5yZW1vdmVMaXN0ZW5lcj1ub29wLGUucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3AsZS5lbWl0PW5vb3AsZS5wcmVwZW5kTGlzdGVuZXI9bm9vcCxlLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcCxlLmxpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybltdfSxlLmJpbmRpbmc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXFxcIil9LGUuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuXFxcIi9cXFwifSxlLmNoZGlyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFxcXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0se31dLDY6W2Z1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKGMpe3ZhciBkPWEoXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCIpO2MuYnJvd3Nlcj93aW5kb3cuc3RyaW5naWZ5PWQ6Yi5leHBvcnRzPWR9KS5jYWxsKHRoaXMsYShcXFwiX3Byb2Nlc3NcXFwiKSl9LHtfcHJvY2Vzczo1LFxcXCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcXFwiOjF9XX0se30sWzZdKTtcIixcInNyYy9saWIvanNvbi90ZXN0cy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVzdHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9rZXl3b3JkLnB5XCI6XCJcXG5fX2FsbF9fID0gW1xcXCJpc2tleXdvcmRcXFwiLCBcXFwia3dsaXN0XFxcIl1cXG5cXG5rd2xpc3QgPSBbXFxuIy0tc3RhcnQga2V5d29yZHMtLVxcbiAgICAgICAgJ2FuZCcsXFxuICAgICAgICAnYXMnLFxcbiAgICAgICAgJ2Fzc2VydCcsXFxuICAgICAgICAnYnJlYWsnLFxcbiAgICAgICAgJ2NsYXNzJyxcXG4gICAgICAgICdjb250aW51ZScsXFxuICAgICAgICAnZGVmJyxcXG4gICAgICAgICdkZWwnLFxcbiAgICAgICAgJ2VsaWYnLFxcbiAgICAgICAgJ2Vsc2UnLFxcbiAgICAgICAgJ2V4Y2VwdCcsXFxuICAgICAgICAnZXhlYycsXFxuICAgICAgICAnZmluYWxseScsXFxuICAgICAgICAnZm9yJyxcXG4gICAgICAgICdmcm9tJyxcXG4gICAgICAgICdnbG9iYWwnLFxcbiAgICAgICAgJ2lmJyxcXG4gICAgICAgICdpbXBvcnQnLFxcbiAgICAgICAgJ2luJyxcXG4gICAgICAgICdpcycsXFxuICAgICAgICAnbGFtYmRhJyxcXG4gICAgICAgICdub3QnLFxcbiAgICAgICAgJ29yJyxcXG4gICAgICAgICdwYXNzJyxcXG4gICAgICAgICdwcmludCcsXFxuICAgICAgICAncmFpc2UnLFxcbiAgICAgICAgJ3JldHVybicsXFxuICAgICAgICAndHJ5JyxcXG4gICAgICAgICd3aGlsZScsXFxuICAgICAgICAnd2l0aCcsXFxuICAgICAgICAneWllbGQnLFxcbiMtLWVuZCBrZXl3b3Jkcy0tXFxuICAgICAgICBdXFxuXFxuaXNrZXl3b3JkID0gZnJvemVuc2V0KGt3bGlzdCkuX19jb250YWluc19fXFxuXFxuXCIsXCJzcmMvbGliL2xpYi1keW5sb2FkL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsaWItZHlubG9hZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYi10ay9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGliLXRrIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGliMnRvMyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYjJ0bzMvZml4ZXMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZpeGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy9wZ2VuMi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGdlbjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9saWIydG8zL3Rlc3RzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZXN0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpbmVjYWNoZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGluZWNhY2hlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbG9jYWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsb2NhbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9sb2dnaW5nL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsb2dnaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFjcGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFjcGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21hY3VybDJwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWN1cmwycGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21haWxib3gucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1haWxib3ggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tYWlsY2FwLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWlsY2FwIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFya3VwYmFzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFya3VwYmFzZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21hdGguanNcIjpcImNvbnN0ICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5QSSxiPU1hdGguc3FydCxjPU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLGQ9TWF0aC5FLGU9TWF0aC5sb2csZj1NYXRoLmV4cCxnPU1hdGgucG93LGg9TWF0aC5sb2cyLGk9TnVtYmVyLmlzRmluaXRlLGo9TWF0aC5mbG9vcixrPU1hdGguYWJzO2NvbnN0IGw9e3BpOm5ldyBTay5idWlsdGluLmZsb2F0XyhhKSxlOm5ldyBTay5idWlsdGluLmZsb2F0XyhkKSx0YXU6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDIqYSksbmFuOm5ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pLGluZjpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMS8wKX0sbj1mdW5jdGlvbihhKXtyZXR1cm4gYT1hPzA+YT8tMToxOjA+MS9hPy0xOjEsYX0sbz0xODtyZXR1cm4gU2suYWJzdHIuc2V0VXBNb2R1bGVNZXRob2RzKFxcXCJtYXRoXFxcIixsLHthY29zOnskbWV0aDpmdW5jdGlvbiBhY29zKGEpe3ZhciBiPU1hdGguYWNvcztyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhcmMgY29zaW5lIChtZWFzdXJlZCBpbiByYWRpYW5zKSBvZiB4LlxcXCJ9LGFjb3NoOnskbWV0aDpmdW5jdGlvbiBhY29zaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGM9YStiKGEqYS0xKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUoYykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zaW5lIG9mIHguXFxcIn0sYXNpbjp7JG1ldGg6ZnVuY3Rpb24gYXNpbihhKXt2YXIgYj1NYXRoLmFzaW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIHNpbmUgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguXFxcIn0sYXNpbmg6eyRtZXRoOmZ1bmN0aW9uIGFzaW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYz1hK2IoYSphKzEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZShjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGludmVyc2UgaHlwZXJib2xpYyBzaW5lIG9mIHguXFxcIn0sYXRhbjp7JG1ldGg6ZnVuY3Rpb24gYXRhbihhKXt2YXIgYj1NYXRoLmF0YW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIHRhbmdlbnQgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguXFxcIn0sYXRhbjI6eyRtZXRoOmZ1bmN0aW9uIGF0YW4yKGEsYil7dmFyIGM9TWF0aC5hdGFuMjtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMoU2suYnVpbHRpbi5hc251bSQoYSksU2suYnVpbHRpbi5hc251bSQoYikpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHksIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGFyYyB0YW5nZW50IChtZWFzdXJlZCBpbiByYWRpYW5zKSBvZiB5L3guXFxcXG5cXFxcblVubGlrZSBhdGFuKHkveCksIHRoZSBzaWducyBvZiBib3RoIHggYW5kIHkgYXJlIGNvbnNpZGVyZWQuXFxcIn0sYXRhbmg6eyRtZXRoOmZ1bmN0aW9uIGF0YW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYj0oMSthKS8oMS1hKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUoYikvMil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGludmVyc2UgaHlwZXJib2xpYyB0YW5nZW50IG9mIHguXFxcIn0sY2VpbDp7JG1ldGg6ZnVuY3Rpb24gY2VpbChhKXt2YXIgYj1NYXRoLmNlaWw7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiXFxcIixcXFwicmVhbCBudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIFNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnQ/bmV3IFNrLmJ1aWx0aW4uaW50XyhiKGMpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGNlaWxpbmcgb2YgeCBhcyBhbiBJbnRlZ3JhbC5cXFxcblxcXFxuVGhpcyBpcyB0aGUgc21hbGxlc3QgaW50ZWdlciA+PSB4LlxcXCJ9LGNvcHlzaWduOnskbWV0aDpmdW5jdGlvbiBjb3B5c2lnbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInlcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYiksZD1Tay5idWlsdGluLmFzbnVtJChhKSxlPW4oZCksZj1uKGMpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCooZSpmKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGEgZmxvYXQgd2l0aCB0aGUgbWFnbml0dWRlIChhYnNvbHV0ZSB2YWx1ZSkgb2YgeCBidXQgdGhlIHNpZ24gb2YgeS5cXFxcblxcXFxuT24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBzaWduZWQgemVyb3MsIGNvcHlzaWduKDEuMCwgLTAuMClcXFxcbnJldHVybnMgLTEuMC5cXFxcblxcXCJ9LGNvczp7JG1ldGg6ZnVuY3Rpb24gY29zKGEpe3ZhciBiPU1hdGguY29zO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGNvc2luZSBvZiB4IChtZWFzdXJlZCBpbiByYWRpYW5zKS5cXFwifSxjb3NoOnskbWV0aDpmdW5jdGlvbiBjb3NoKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYj1nKGQsYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygoYisxL2IpLzIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBoeXBlcmJvbGljIGNvc2luZSBvZiB4LlxcXCJ9LGRlZ3JlZXM6eyRtZXRoOmZ1bmN0aW9uIGRlZ3JlZXMoYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtjb25zdCBjPTE4MC9hKlNrLmJ1aWx0aW4uYXNudW0kKGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJDb252ZXJ0IGFuZ2xlIHggZnJvbSByYWRpYW5zIHRvIGRlZ3JlZXMuXFxcIn0sZXJmOnskbWV0aDpmdW5jdGlvbiBlcmYoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmVyZigpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJFcnJvciBmdW5jdGlvbiBhdCB4LlxcXCJ9LGVyZmM6eyRtZXRoOmZ1bmN0aW9uIGVyZmMoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmVyZmMoKSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiQ29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbiBhdCB4LlxcXCJ9LGV4cDp7JG1ldGg6ZnVuY3Rpb24gZXhwKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBiPWEudjtpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGImJihiPWEubmIkZmxvYXQoKS52KSxiPT0xLzB8fGI9PS1JbmZpbml0eXx8aXNOYU4oYikpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhmKGIpKTtjb25zdCBjPWYoYik7aWYoIWlzRmluaXRlKGMpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXFxcIm1hdGggcmFuZ2UgZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiB4LlxcXCJ9LGV4cG0xOnskbWV0aDpmdW5jdGlvbiBleHBtMShhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKC43PmsoYikpe2NvbnN0IGE9ZihiKTtpZigxPT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYik7ZWxzZXtjb25zdCBjPShhLTEpKmIvZShhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfX1lbHNle2NvbnN0IGE9ZihiKS0xO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSl9fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGV4cCh4KS0xLlxcXFxuXFxcXG5UaGlzIGZ1bmN0aW9uIGF2b2lkcyB0aGUgbG9zcyBvZiBwcmVjaXNpb24gaW52b2x2ZWQgaW4gdGhlIGRpcmVjdCBldmFsdWF0aW9uIG9mIGV4cCh4KS0xIGZvciBzbWFsbCB4LlxcXCJ9LGZhYnM6eyRtZXRoOmZ1bmN0aW9uIGZhYnMoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9YS52O3JldHVybiBKU0JJLl9faXNCaWdJbnQoYikmJihiPWEubmIkZmxvYXQoKS52KSxiPWsoYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZmxvYXQgeC5cXFwifSxmYWN0b3JpYWw6eyRtZXRoOmZ1bmN0aW9uIGZhY3RvcmlhbChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYj1Tay5idWlsdGluLmFzbnVtJChhKTtpZihhPWooYiksYSE9Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJmYWN0b3JpYWwoKSBvbmx5IGFjY2VwdHMgaW50ZWdyYWwgdmFsdWVzXFxcIik7aWYoMD5hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImZhY3RvcmlhbCgpIG5vdCBkZWZpbmVkIGZvciBuZWdhdGl2ZSBudW1iZXJzXFxcIik7bGV0IGM9MTtmb3IobGV0IGI9MjtiPD1hJiZiPD1vO2IrKyljKj1iO2lmKGE8PW8pcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyk7Yz1KU0JJLkJpZ0ludChjKTtmb3IobGV0IGI9MTk7Yjw9YTtiKyspYz1KU0JJLm11bHRpcGx5KGMsSlNCSS5CaWdJbnQoYikpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiRmluZCB4IS5cXFxcblxcXFxuUmFpc2UgYSBWYWx1ZUVycm9yIGlmIHggaXMgbmVnYXRpdmUgb3Igbm9uLWludGVncmFsLlxcXCJ9LGZsb29yOnskbWV0aDpmdW5jdGlvbiBmbG9vcihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suX19mdXR1cmVfXy5jZWlsX2Zsb29yX2ludD9uZXcgU2suYnVpbHRpbi5pbnRfKGooU2suYnVpbHRpbi5hc251bSQoYSkpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oaihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBmbG9vciBvZiB4IGFzIGFuIEludGVncmFsLlxcXFxuXFxcXG5UaGlzIGlzIHRoZSBsYXJnZXN0IGludGVnZXIgPD0geC5cXFwifSxmbW9kOnskbWV0aDpmdW5jdGlvbiBmbW9kKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7bGV0IGM9YS52LGQ9Yi52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgYyYmKGM9YS5uYiRmbG9hdCgpLnYpLFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZCYmKGQ9Yi5uYiRmbG9hdCgpLnYpLChkPT0xLzB8fGQ9PS1JbmZpbml0eSkmJmlzRmluaXRlKGMpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyk7Y29uc3QgZT1jJWQ7aWYoaXNOYU4oZSkmJiFpc05hTihjKSYmIWlzTmFOKGQpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhlKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gZm1vZCh4LCB5KSwgYWNjb3JkaW5nIHRvIHBsYXRmb3JtIEMuXFxcXG5cXFxcbnggJSB5IG1heSBkaWZmZXIuXFxcIn0sZnJleHA6eyRtZXRoOmZ1bmN0aW9uIGZyZXhwKGEpe3ZhciBiPU1hdGgubWF4O1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYSksZD1bYywwXTtpZigwIT09YyYmaShjKSl7Y29uc3QgYT1rKGMpO2xldCBlPWIoLTEwMjMsaihoKGEpKSsxKSxmPWEqZygyLC1lKTtmb3IoOy41PmY7KWYqPTIsZS0tO2Zvcig7MTw9ZjspZio9LjUsZSsrOzA+YyYmKGY9LWYpLGRbMF09ZixkWzFdPWV9cmV0dXJuIGRbMF09bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGRbMF0pLGRbMV09bmV3IFNrLmJ1aWx0aW4uaW50XyhkWzFdKSxuZXcgU2suYnVpbHRpbi50dXBsZShkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgbWFudGlzc2EgYW5kIGV4cG9uZW50IG9mIHgsIGFzIHBhaXIgKG0sIGUpLlxcXFxuXFxcXG5tIGlzIGEgZmxvYXQgYW5kIGUgaXMgYW4gaW50LCBzdWNoIHRoYXQgeCA9IG0gKiAyLioqZS5cXFxcbklmIHggaXMgMCwgbSBhbmQgZSBhcmUgYm90aCAwLiAgRWxzZSAwLjUgPD0gYWJzKG0pIDwgMS4wLlxcXCJ9LGZzdW06eyRtZXRoOmZ1bmN0aW9uIGZzdW0oYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIidcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1xcXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcXFwiKTtsZXQgYj1bXTthPVNrLmFic3RyLml0ZXIoYSk7bGV0IGMsZCxlO2ZvcihsZXQgZj1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWEudHAkaXRlcm5leHQoKSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiXFxcIixcXFwicmVhbCBudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZikpLGM9MDtsZXQgYT1mLnY7XFxcIm51bWJlclxcXCIhPXR5cGVvZiBhJiYoYT1mLm5iJGZsb2F0KCkudiksZj1hO2ZvcihsZXQgYSxnPTAsaD1iLmxlbmd0aDtnPGg7ZysrKXtpZihhPWJbZ10sayhmKTxrKGEpKXtsZXQgYj1mO2Y9YSxhPWJ9ZD1mK2EsZT1hLShkLWYpLGUmJihiW2NdPWUsYysrKSxmPWR9Yj1iLnNsaWNlKDAsYykuY29uY2F0KFtmXSl9Y29uc3QgZj1iLnJlZHVjZShmdW5jdGlvbihjLGEpe3JldHVybiBjK2F9LDApO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHNlcSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBhbiBhY2N1cmF0ZSBmbG9hdGluZyBwb2ludCBzdW0gb2YgdmFsdWVzIGluIHRoZSBpdGVyYWJsZSBzZXEuXFxcXG5cXFxcbkFzc3VtZXMgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy5cXFwifSxnYW1tYTp7JG1ldGg6ZnVuY3Rpb24gZ2FtbWEoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmdhbW1hKCkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkdhbW1hIGZ1bmN0aW9uIGF0IHguXFxcIn0sZ2NkOnskbWV0aDpmdW5jdGlvbiBnY2QoYyxhKXtmdW5jdGlvbiBfZ2NkKGMsYSl7cmV0dXJuIDA9PWE/YzpfZ2NkKGEsYyVhKX1mdW5jdGlvbiBfYmlnZ2NkKGMsYSl7cmV0dXJuIEpTQkkuZXF1YWwoYSxKU0JJLl9fWkVSTyk/YzpfYmlnZ2NkKGEsSlNCSS5yZW1haW5kZXIoYyxhKSl9U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYVxcXCIsXFxcImludGVnZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQoYykpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImJcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGEpKTtsZXQgYixkPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGU9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuXFxcIm51bWJlclxcXCI9PXR5cGVvZiBkJiZcXFwibnVtYmVyXFxcIj09dHlwZW9mIGU/KGQ9ayhkKSxlPWsoZSksYj1fZ2NkKGQsZSksYj0wPmI/LWI6YixuZXcgU2suYnVpbHRpbi5pbnRfKGIpKTooZD1KU0JJLkJpZ0ludChkKSxlPUpTQkkuQmlnSW50KGUpLGI9X2JpZ2djZChkLGUpLEpTQkkubGVzc1RoYW4oYixKU0JJLl9fWkVSTykmJihiPUpTQkkubXVsdGlwbHkoYixKU0JJLkJpZ0ludCgtMSkpKSxuZXcgU2suYnVpbHRpbi5pbnRfKGIudG9TdHJpbmcoKSkpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgeSwgLylcXFwiLCRkb2M6XFxcImdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHggYW5kIHlcXFwifSxoeXBvdDp7JG1ldGg6ZnVuY3Rpb24gaHlwb3QoYSxjKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihjKSksYT1Tay5idWlsdGluLmFzbnVtJChhKSxjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKGEqYStjKmMpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSwgc3FydCh4KnggKyB5KnkpLlxcXCJ9LGlzY2xvc2U6eyRtZXRoOmZ1bmN0aW9uIGlzY2xvc2UoYyxkKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImlzY2xvc2VcXFwiLGMsMiwyKSxyZWxfYWJzX3ZhbHM9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImlzY2xvc2VcXFwiLFtcXFwicmVsX3RvbFxcXCIsXFxcImFic190b2xcXFwiXSxbXSxkLFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oMWUtOSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApXSk7Y29uc3QgZT1jWzBdLGE9Y1sxXSxiPXJlbF9hYnNfdmFsc1swXSxmPXJlbF9hYnNfdmFsc1sxXTtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJhXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGUpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJiXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyZWxfdG9sXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJhYnNfdG9sXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGYpKTtjb25zdCBnPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGg9U2suYnVpbHRpbi5hc251bSQoYSksaT1Tay5idWlsdGluLmFzbnVtJChiKSxqPVNrLmJ1aWx0aW4uYXNudW0kKGYpO2lmKDA+aXx8MD5qKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcInRvbGVyYW5jZXMgbXVzdCBiZSBub24tbmVnYXRpdmVcXFwiKTtpZihnPT1oKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7aWYoZz09MS8wfHxnPT0tSW5maW5pdHl8fGg9PTEvMHx8aD09LUluZmluaXR5KXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2NvbnN0IGw9ayhoLWcpLG09bDw9ayhpKmgpfHxsPD1rKGkqZyl8fGw8PWo7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wobSl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgLywgYSwgYiwgKiwgcmVsX3RvbD0xZS0wOSwgYWJzX3RvbD0wLjApXFxcIiwkZG9jOlxcXCJEZXRlcm1pbmUgd2hldGhlciB0d28gZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUgY2xvc2UgaW4gdmFsdWUuXFxcXG5cXFxcbiAgcmVsX3RvbFxcXFxuICAgIG1heGltdW0gZGlmZmVyZW5jZSBmb3IgYmVpbmcgY29uc2lkZXJlZCBcXFxcXFxcImNsb3NlXFxcXFxcXCIsIHJlbGF0aXZlIHRvIHRoZVxcXFxuICAgIG1hZ25pdHVkZSBvZiB0aGUgaW5wdXQgdmFsdWVzXFxcXG4gIGFic190b2xcXFxcbiAgICBtYXhpbXVtIGRpZmZlcmVuY2UgZm9yIGJlaW5nIGNvbnNpZGVyZWQgXFxcXFxcXCJjbG9zZVxcXFxcXFwiLCByZWdhcmRsZXNzIG9mIHRoZVxcXFxuICAgIG1hZ25pdHVkZSBvZiB0aGUgaW5wdXQgdmFsdWVzXFxcXG5cXFxcblJldHVybiBUcnVlIGlmIGEgaXMgY2xvc2UgaW4gdmFsdWUgdG8gYiwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFxcblxcXFxuRm9yIHRoZSB2YWx1ZXMgdG8gYmUgY29uc2lkZXJlZCBjbG9zZSwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtXFxcXG5tdXN0IGJlIHNtYWxsZXIgdGhhbiBhdCBsZWFzdCBvbmUgb2YgdGhlIHRvbGVyYW5jZXMuXFxcXG5cXFxcbi1pbmYsIGluZiBhbmQgTmFOIGJlaGF2ZSBzaW1pbGFybHkgdG8gdGhlIElFRUUgNzU0IFN0YW5kYXJkLiAgVGhhdFxcXFxuaXMsIE5hTiBpcyBub3QgY2xvc2UgdG8gYW55dGhpbmcsIGV2ZW4gaXRzZWxmLiAgaW5mIGFuZCAtaW5mIGFyZVxcXFxub25seSBjbG9zZSB0byB0aGVtc2VsdmVzLlxcXCJ9LGlzZmluaXRlOnskbWV0aDpmdW5jdGlvbiBpc2Zpbml0ZShhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO3JldHVybiBTay5idWlsdGluLmNoZWNrSW50KGEpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDppc0Zpbml0ZShiKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBUcnVlIGlmIHggaXMgbmVpdGhlciBhbiBpbmZpbml0eSBub3IgYSBOYU4sIGFuZCBGYWxzZSBvdGhlcndpc2UuXFxcIn0saXNpbmY6eyRtZXRoOmZ1bmN0aW9uIGlzaW5mKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSk/U2suYnVpbHRpbi5ib29sLmZhbHNlJDppc0Zpbml0ZShiKXx8aXNOYU4oYik/U2suYnVpbHRpbi5ib29sLmZhbHNlJDpTay5idWlsdGluLmJvb2wudHJ1ZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiB4IGlzIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW5maW5pdHksIGFuZCBGYWxzZSBvdGhlcndpc2UuXFxcIn0saXNuYW46eyRtZXRoOmZ1bmN0aW9uIGlzbmFuKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIGlzTmFOKGIpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIFRydWUgaWYgeCBpcyBhIE5hTiAobm90IGEgbnVtYmVyKSwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFwifSxsZGV4cDp7JG1ldGg6ZnVuY3Rpb24gbGRleHAoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJpXFxcIixcXFwiaW50ZWdlclxcXCIsU2suYnVpbHRpbi5jaGVja0ludChiKSk7bGV0IGM9YS52O1xcXCJudW1iZXJcXFwiIT10eXBlb2YgYyYmKGM9YS5uYiRmbG9hdCgpLnYpO2NvbnN0IGQ9U2suYnVpbHRpbi5hc251bSQoYik7aWYoYz09MS8wfHxjPT0tSW5maW5pdHl8fDA9PWN8fGlzTmFOKGMpKXJldHVybiBhO2NvbnN0IGU9YypnKDIsZCk7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXFxcIm1hdGggcmFuZ2UgZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgaSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB4ICogKDIqKmkpLlxcXFxuXFxcXG5UaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBpbnZlcnNlIG9mIGZyZXhwKCkuXFxcIn0sbGdhbW1hOnskbWV0aDpmdW5jdGlvbiBsZ2FtbWEoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmxnYW1tYSgpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJOYXR1cmFsIGxvZ2FyaXRobSBvZiBhYnNvbHV0ZSB2YWx1ZSBvZiBHYW1tYSBmdW5jdGlvbiBhdCB4LlxcXCJ9LGxvZzp7JG1ldGg6ZnVuY3Rpb24gbG9nKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGYsZyxoPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtpZih2b2lkIDA9PT1iP2Y9ZDooU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYmFzZVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksZj1Tay5idWlsdGluLmFzbnVtJChiKSksMD49Zil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxoPGMpZz1lKGgpL2UoZik7ZWxzZXtoPW5ldyBTay5idWlsdGluLnN0cihhKS4kanNzdHIoKTtjb25zdCBiPWgubGVuZ3RoLGM9cGFyc2VGbG9hdChcXFwiMC5cXFwiK2gpO2c9KGIqZSgxMCkrZShjKSkvZShmKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGcpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwibG9nKHgsIFtiYXNlPWVdKVxcXFxuUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgeCB0byB0aGUgZ2l2ZW4gYmFzZS5cXFxcblxcXFxuSWYgdGhlIGJhc2Ugbm90IHNwZWNpZmllZCwgcmV0dXJucyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gKGJhc2UgZSkgb2YgeC5cXFwifSxsb2cxMDp7JG1ldGg6ZnVuY3Rpb24gbG9nMTAoYSl7dmFyIGI9TWF0aC5sb2cxMDtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgZCxlPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxlPGMpZD1iKGUpO2Vsc2V7ZT1uZXcgU2suYnVpbHRpbi5zdHIoYSkuJGpzc3RyKCk7Y29uc3QgYz1lLmxlbmd0aCxmPXBhcnNlRmxvYXQoXFxcIjAuXFxcIitlKTtkPWMrYihmKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBiYXNlIDEwIGxvZ2FyaXRobSBvZiB4LlxcXCJ9LGxvZzFwOnskbWV0aDpmdW5jdGlvbiBsb2cxcChhKXt2YXIgYj1OdW1iZXIuRVBTSUxPTjtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYz1hLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBjJiYoYz1hLm5iJGZsb2F0KCkudiksLTE+PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNle2lmKDA9PWMpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKTtpZihrKGMpPGIvMilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpO2lmKC0uNTw9YyYmMT49Yyl7Y29uc3QgYT0xK2MsYj1lKGEpLShhLTEtYykvYTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpfWVsc2V7Y29uc3QgYT1lKDErYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX19fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiAxK3ggKGJhc2UgZSkuXFxcXG5cXFxcblRoZSByZXN1bHQgaXMgY29tcHV0ZWQgaW4gYSB3YXkgd2hpY2ggaXMgYWNjdXJhdGUgZm9yIHggbmVhciB6ZXJvLlxcXCJ9LGxvZzI6eyRtZXRoOmZ1bmN0aW9uIGxvZzIoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGIsZD1Tay5idWlsdGluLmFzbnVtJChhKTtpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8ZDxjKWI9aChkKTtlbHNle2Q9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpLiRqc3N0cigpO2NvbnN0IGM9ZC5sZW5ndGgsZT1wYXJzZUZsb2F0KFxcXCIwLlxcXCIrZCk7Yj1jKmgoMTApK2goZSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYmFzZSAyIGxvZ2FyaXRobSBvZiB4LlxcXCJ9LG1vZGY6eyRtZXRoOmZ1bmN0aW9uIG1vZGYoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoIWlzRmluaXRlKGIpKXtpZihiPT0xLzApcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oMCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpXSk7aWYoYj09LUluZmluaXR5KXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0wKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYildKTtpZihpc05hTihiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhiKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYildKX1jb25zdCBjPW4oYik7Yj1rKGIpO2NvbnN0IGU9YypqKGIpLGY9YyooYi1qKGIpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhmKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSldKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgZnJhY3Rpb25hbCBhbmQgaW50ZWdlciBwYXJ0cyBvZiB4LlxcXFxuXFxcXG5Cb3RoIHJlc3VsdHMgY2FycnkgdGhlIHNpZ24gb2YgeCBhbmQgYXJlIGZsb2F0cy5cXFwifSxwb3c6eyRtZXRoOmZ1bmN0aW9uIHBvdyhhLGIpe3ZhciBjPU51bWJlci5pc0ludGVnZXI7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7bGV0IGQ9YS52LGU9Yi52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZCYmKGQ9YS5uYiRmbG9hdCgpLnYpLFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZSYmKGU9Yi5uYiRmbG9hdCgpLnYpLDA9PWQmJjA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2V7aWYoMT09ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDEpO2lmKGkoZCkmJmkoZSkmJjA+ZCYmIWMoZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNlIGlmKC0xPT1kJiYoZT09LUluZmluaXR5fHxlPT0xLzApKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oMSl9Y29uc3QgZj1nKGQsZSk7aWYoIWkoZCl8fCFpKGUpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZik7aWYoZj09MS8wfHxmPT0tSW5maW5pdHkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcXFwibWF0aCByYW5nZSBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHgqKnkgKHggdG8gdGhlIHBvd2VyIG9mIHkpLlxcXCJ9LHJhZGlhbnM6eyRtZXRoOmZ1bmN0aW9uIHJhZGlhbnMoYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZGVnXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtjb25zdCBjPWEvMTgwKlNrLmJ1aWx0aW4uYXNudW0kKGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJDb252ZXJ0IGFuZ2xlIHggZnJvbSBkZWdyZWVzIHRvIHJhZGlhbnMuXFxcIn0scmVtYWluZGVyOnskbWV0aDpmdW5jdGlvbiByZW1haW5kZXIoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtsZXQgZD1hLnYsZT1iLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBkJiYoZD1hLm5iJGZsb2F0KCkudiksXFxcIm51bWJlclxcXCIhPXR5cGVvZiBlJiYoZT1iLm5iJGZsb2F0KCkudiksaXNGaW5pdGUoZCkmJmlzRmluaXRlKGUpKXtsZXQgYSxiLGYsYyxnO2lmKDA9PWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtpZihhPWsoZCksYj1rKGUpLGM9YSViLGY9Yi1jLGM8ZilnPWM7ZWxzZSBpZihjPmYpZz0tZjtlbHNle2lmKGMhPWYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3I7Zz1jLTIqKC41KihhLWMpJWIpfXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8obihkKSpnKX1pZihpc05hTihkKSlyZXR1cm4gYTtpZihpc05hTihlKSlyZXR1cm4gYjtpZihkPT0xLzB8fGQ9PS1JbmZpbml0eSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2lmKGUhPTEvMCYmZSE9LUluZmluaXR5KXRocm93IG5ldyBTay5idWlsdGluLkFzc2VydGlvbkVycm9yO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiRGlmZmVyZW5jZSBiZXR3ZWVuIHggYW5kIHRoZSBjbG9zZXN0IGludGVnZXIgbXVsdGlwbGUgb2YgeS5cXFxcblxcXFxuUmV0dXJuIHggLSBuKnkgd2hlcmUgbip5IGlzIHRoZSBjbG9zZXN0IGludGVnZXIgbXVsdGlwbGUgb2YgeS5cXFxcbkluIHRoZSBjYXNlIHdoZXJlIHggaXMgZXhhY3RseSBoYWxmd2F5IGJldHdlZW4gdHdvIG11bHRpcGxlcyBvZlxcXFxueSwgdGhlIG5lYXJlc3QgZXZlbiB2YWx1ZSBvZiBuIGlzIHVzZWQuIFRoZSByZXN1bHQgaXMgYWx3YXlzIGV4YWN0LlxcXCJ9LHNpbjp7JG1ldGg6ZnVuY3Rpb24gc2luKGEpe3ZhciBiPU1hdGguc2luO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIHNpbmUgb2YgeCAobWVhc3VyZWQgaW4gcmFkaWFucykuXFxcIn0sc2luaDp7JG1ldGg6ZnVuY3Rpb24gc2luaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGI9ZyhkLGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oKGItMS9iKS8yKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaHlwZXJib2xpYyBzaW5lIG9mIHguXFxcIn0sc3FydDp7JG1ldGg6ZnVuY3Rpb24gc3FydChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBjPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIHguXFxcIn0sdGFuOnskbWV0aDpmdW5jdGlvbiB0YW4oYSl7dmFyIGI9TWF0aC50YW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgdGFuZ2VudCBvZiB4IChtZWFzdXJlZCBpbiByYWRpYW5zKS5cXFwifSx0YW5oOnskbWV0aDpmdW5jdGlvbiB0YW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoMD09PWIpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKTtjb25zdCBjPWcoZCxiKSxlPTEvYztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKChjLWUpLzIvKChjK2UpLzIpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIHguXFxcIn0sdHJ1bmM6eyRtZXRoOmZ1bmN0aW9uIHRydW5jKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLmNoZWNrSW50KGEpP2E6bmV3IFNrLmJ1aWx0aW4uaW50XygwfFNrLmJ1aWx0aW4uYXNudW0kKGEpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlRydW5jYXRlcyB0aGUgUmVhbCB4IHRvIHRoZSBuZWFyZXN0IEludGVncmFsIHRvd2FyZCAwLlxcXFxuXFxcXG5Vc2VzIHRoZSBfX3RydW5jX18gbWFnaWMgbWV0aG9kLlxcXCJ9fSksbH07XCIsXCJzcmMvbGliL21kNS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWQ1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWhsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1obGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWltZXRvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1ldG9vbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9taW1ldHlwZXMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1pbWV0eXBlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21pbWlmeS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWltaWZ5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbW9kdWxlZmluZGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtb2R1bGVmaW5kZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tdWx0aWZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm11bHRpZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211bHRpcHJvY2Vzc2luZy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibXVsdGlwcm9jZXNzaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbXVsdGlwcm9jZXNzaW5nL2R1bW15L19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1teSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211dGV4LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtdXRleCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL25ldHJjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJuZXRyYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL25ldy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibmV3IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbm50cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibm50cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL250cGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibnRwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbnR1cmwycGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibnR1cmwycGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL251bWJlcnMucHlcIjpcIk51bWJlciA9IChpbnQsIGZsb2F0LCBjb21wbGV4KVxcbkludGVncmFsID0gaW50XFxuQ29tcGxleCA9IGNvbXBsZXhcXG5cIixcInNyYy9saWIvb3Bjb2RlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvcGNvZGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vcGVyYXRvci5qc1wiOlwiZnVuY3Rpb24gJGJ1aWx0aW5tb2R1bGUoKXtyZXR1cm4gb3BlcmF0b3I9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwib3BlcmF0b3JcXFwiKSxfX2RvY19fOm5ldyBTay5idWlsdGluLnN0cihcXFwiT3BlcmF0b3IgaW50ZXJmYWNlLlxcXFxuXFxcXG5UaGlzIG1vZHVsZSBleHBvcnRzIGEgc2V0IG9mIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBqYXZhc2NyaXB0IGNvcnJlc3BvbmRpbmdcXFxcbnRvIHRoZSBpbnRyaW5zaWMgb3BlcmF0b3JzIG9mIFB5dGhvbi4gIEZvciBleGFtcGxlLCBvcGVyYXRvci5hZGQoeCwgeSlcXFxcbmlzIGVxdWl2YWxlbnQgdG8gdGhlIGV4cHJlc3Npb24geCt5LiAgVGhlIGZ1bmN0aW9uIG5hbWVzIGFyZSB0aG9zZVxcXFxudXNlZCBmb3Igc3BlY2lhbCBtZXRob2RzOyB2YXJpYW50cyB3aXRob3V0IGxlYWRpbmcgYW5kIHRyYWlsaW5nXFxcXG4nX18nIGFyZSBhbHNvIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZS5cXFwiKSxfX2FsbF9fOm5ldyBTay5idWlsdGluLmxpc3QoW1xcXCJhYnNcXFwiLFxcXCJhZGRcXFwiLFxcXCJhbmRfXFxcIixcXFwiYXR0cmdldHRlclxcXCIsXFxcImNvbmNhdFxcXCIsXFxcImNvbnRhaW5zXFxcIixcXFwiY291bnRPZlxcXCIsXFxcImRlbGl0ZW1cXFwiLFxcXCJlcVxcXCIsXFxcImZsb29yZGl2XFxcIixcXFwiZ2VcXFwiLFxcXCJnZXRpdGVtXFxcIixcXFwiZ3RcXFwiLFxcXCJpYWRkXFxcIixcXFwiaWFuZFxcXCIsXFxcImljb25jYXRcXFwiLFxcXCJpZmxvb3JkaXZcXFwiLFxcXCJpbHNoaWZ0XFxcIixcXFwiaW1hdG11bFxcXCIsXFxcImltb2RcXFwiLFxcXCJpbXVsXFxcIixcXFwiaW5kZXhcXFwiLFxcXCJpbmRleE9mXFxcIixcXFwiaW52XFxcIixcXFwiaW52ZXJ0XFxcIixcXFwiaW9yXFxcIixcXFwiaXBvd1xcXCIsXFxcImlyc2hpZnRcXFwiLFxcXCJpc19cXFwiLFxcXCJpc19ub3RcXFwiLFxcXCJpc3ViXFxcIixcXFwiaXRlbWdldHRlclxcXCIsXFxcIml0cnVlZGl2XFxcIixcXFwiaXhvclxcXCIsXFxcImxlXFxcIixcXFwibGVuZ3RoX2hpbnRcXFwiLFxcXCJsc2hpZnRcXFwiLFxcXCJsdFxcXCIsXFxcIm1hdG11bFxcXCIsXFxcIm1ldGhvZGNhbGxlclxcXCIsXFxcIm1vZFxcXCIsXFxcIm11bFxcXCIsXFxcIm5lXFxcIixcXFwibmVnXFxcIixcXFwibm90X1xcXCIsXFxcIm9yX1xcXCIsXFxcInBvc1xcXCIsXFxcInBvd1xcXCIsXFxcInJzaGlmdFxcXCIsXFxcInNldGl0ZW1cXFwiLFxcXCJzdWJcXFwiLFxcXCJ0cnVlZGl2XFxcIixcXFwidHJ1dGhcXFwiLFxcXCJ4b3JcXFwiXS5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSl9LG9wZXJhdG9yLml0ZW1nZXR0ZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwib3BlcmF0b3IuaXRlbWdldHRlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGl0ZW1nZXR0ZXIoYSl7dGhpcy5pdGVtcz1hLHRoaXMub25laXRlbT0xPT09YS5sZW5ndGgsdGhpcy5pdGVtPWFbMF0sdGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGEsYil7cmV0dXJuIFNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIml0ZW1nZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXRlbWdldHRlclxcXCIsYSwxKSxuZXcgb3BlcmF0b3IuaXRlbWdldHRlcihhKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIml0ZW1nZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXRlbWdldHRlclxcXCIsYSwxLDEpO2NvbnN0IGM9YVswXTtyZXR1cm4gdGhpcy5vbmVpdGVtP1NrLmFic3RyLm9iamVjdEdldEl0ZW0oYyx0aGlzLml0ZW0sITApOm5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMuaXRlbXMubWFwKGE9PlNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxhKSkpfSx0cCRkb2M6XFxcIlJldHVybiBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGZldGNoZXMgdGhlIGdpdmVuIGl0ZW0ocykgZnJvbSBpdHMgb3BlcmFuZC5cXFxcbiAgICAgICAgICAgIEFmdGVyIGYgPSBpdGVtZ2V0dGVyKDIpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgclsyXS5cXFxcbiAgICAgICAgICAgIEFmdGVyIGcgPSBpdGVtZ2V0dGVyKDIsIDUsIDMpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHJbMl0sIHJbNV0sIHJbM10pXFxcIiwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudHAkbmFtZStcXFwiKC4uLilcXFwiKTt0aGlzLmluJHJlcHI9ITA7Y29uc3QgYT10aGlzLnRwJG5hbWUrXFxcIihcXFwiK3RoaXMuaXRlbXMubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiO3JldHVybiB0aGlzLmluJHJlcHI9ITEsYX19fSksb3BlcmF0b3IuYXR0cmdldHRlcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJvcGVyYXRvci5hdHRyZ2V0dGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gYXR0cmdldHRlcihhKXt0aGlzLmF0dHJzPWEsdGhpcy5vbmVhdHRyPTE9PT1hLmxlbmd0aCx0aGlzLmF0dHI9YVswXSx0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJhdHRyZ2V0dGVyXFxcIixiKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImF0dHJnZXR0ZXJcXFwiLGEsMSk7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgYj1hW2RdO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2Iudi5pbmNsdWRlcyhcXFwiLlxcXCIpP2MucHVzaChiLiRqc3N0cigpLnNwbGl0KFxcXCIuXFxcIikubWFwKGE9Pm5ldyBTay5idWlsdGluLnN0cihhKSkpOmMucHVzaChbYl0pfXJldHVybiBuZXcgb3BlcmF0b3IuYXR0cmdldHRlcihjKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImF0dHJnZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiYXR0cmdldHRlclxcXCIsYSwxLDEpO2NvbnN0IGM9YVswXTtpZih0aGlzLm9uZWF0dHIpcmV0dXJuIHRoaXMuYXR0ci5yZWR1Y2UoKGEsYik9PlNrLmFic3RyLmdhdHRyKGEsYiksYyk7Y29uc3QgZD10aGlzLmF0dHJzLm1hcChhPT5hLnJlZHVjZSgoYSxiKT0+U2suYWJzdHIuZ2F0dHIoYSxiKSxjKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGQpfSx0cCRkb2M6XFxcImF0dHJnZXR0ZXIoYXR0ciwgLi4uKSAtLT4gYXR0cmdldHRlciBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgZmV0Y2hlcyB0aGUgZ2l2ZW4gYXR0cmlidXRlKHMpIGZyb20gaXRzIG9wZXJhbmQuXFxcXG5BZnRlciBmID0gYXR0cmdldHRlcignbmFtZScpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgci5uYW1lLlxcXFxuQWZ0ZXIgZyA9IGF0dHJnZXR0ZXIoJ25hbWUnLCAnZGF0ZScpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHIubmFtZSwgci5kYXRlKS5cXFxcbkFmdGVyIGggPSBhdHRyZ2V0dGVyKCduYW1lLmZpcnN0JywgJ25hbWUubGFzdCcpLCB0aGUgY2FsbCBoKHIpIHJldHVybnNcXFxcbihyLm5hbWUuZmlyc3QsIHIubmFtZS5sYXN0KS5cXFwiLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy50cCRuYW1lK1xcXCIoLi4uKVxcXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudHAkbmFtZStcXFwiKFxcXCIrdGhpcy5pdGVtcy5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSkuam9pbihcXFwiLCBcXFwiKStcXFwiKVxcXCI7cmV0dXJuIHRoaXMuaW4kcmVwcj0hMSxhfX19KSxvcGVyYXRvci5tZXRob2RjYWxsZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwib3BlcmF0b3IubWV0aG9kY2FsbGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gbWV0aG9kY2FsbGVyKGEsYixjKXt0aGlzLiRuYW1lPWEsdGhpcy5hcmdzPWIsdGhpcy5rd2FyZ3M9Y3x8W10sdGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJtZXRob2RjYWxsZXJcXFwiLGEsMSk7Y29uc3QgYz1hWzBdO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO3JldHVybiBuZXcgb3BlcmF0b3IubWV0aG9kY2FsbGVyKGMsYS5zbGljZSgxKSxiKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIm1ldGhvZGNhbGxlclxcXCIsYiksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJtZXRob2RjYWxsZXJcXFwiLGEsMSwxKTtjb25zdCBjPWFbMF07cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLmdhdHRyKGMsdGhpcy4kbmFtZSwhMCksYT0+U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsdGhpcy5hcmdzLHRoaXMua3dhcmdzKSl9LHRwJGRvYzpcXFwibWV0aG9kY2FsbGVyKG5hbWUsIC4uLikgLS0+IG1ldGhvZGNhbGxlciBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgY2FsbHMgdGhlIGdpdmVuIG1ldGhvZCBvbiBpdHMgb3BlcmFuZC5cXFxcbkFmdGVyIGYgPSBtZXRob2RjYWxsZXIoJ25hbWUnKSwgdGhlIGNhbGwgZihyKSByZXR1cm5zIHIubmFtZSgpLlxcXFxuQWZ0ZXIgZyA9IG1ldGhvZGNhbGxlcignbmFtZScsICdkYXRlJywgZm9vPTEpLCB0aGUgY2FsbCBnKHIpIHJldHVybnNcXFxcbnIubmFtZSgnZGF0ZScsIGZvbz0xKS5cXFwiLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy50cCRuYW1lK1xcXCIoLi4uKVxcXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT1bU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLiRuYW1lKSwuLi50aGlzLmFyZ3MubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpXTtmb3IobGV0IGI9MDtiPHRoaXMua3dhcmdzLmxlbmd0aDtiKz0yKWEucHVzaCh0aGlzLmt3YXJnc1tiXStcXFwiPVxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLmt3YXJnc1tiKzFdKSk7cmV0dXJuIGE9dGhpcy50cCRuYW1lK1xcXCIoXFxcIithLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiLHRoaXMuaW4kcmVwcj0hMSxhfX19KSxTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXFxcIm9wZXJhdG9yXFxcIixvcGVyYXRvcix7bHQ6eyRtZXRoOmZ1bmN0aW9uIGx0KGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJMdFxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPCBiLlxcXCJ9LGxlOnskbWV0aDpmdW5jdGlvbiBsZShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiTHRFXFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA8PSBiLlxcXCJ9LGVxOnskbWV0aDpmdW5jdGlvbiBlcShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiRXFcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID09IGIuXFxcIn0sbmU6eyRtZXRoOmZ1bmN0aW9uIG5lKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJOb3RFcVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgIT0gYi5cXFwifSxnZTp7JG1ldGg6ZnVuY3Rpb24gZ2UoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkd0RVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPj0gYi5cXFwifSxndDp7JG1ldGg6ZnVuY3Rpb24gZ3QoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkd0XFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+IGIuXFxcIn0sbm90Xzp7JG1ldGg6ZnVuY3Rpb24gbm90XyhhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyVW5hcnlPcChhLFxcXCJOb3RcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgbm90IGEuXFxcIn0sdHJ1dGg6eyRtZXRoOmZ1bmN0aW9uIHRydXRoKGEpe3JldHVybiBTay5idWlsdGluLmJvb2woYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiBhIGlzIHRydWUsIEZhbHNlIG90aGVyd2lzZS5cXFwifSxpc186eyRtZXRoOmZ1bmN0aW9uIGlzXyhjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiSXNcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIGlzIGIuXFxcIn0saXNfbm90OnskbWV0aDpmdW5jdGlvbiBpc19ub3QoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIklzTm90XFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSBpcyBub3QgYi5cXFwifSxhYnM6eyRtZXRoOmZ1bmN0aW9uIGFicyhhKXtyZXR1cm4gU2suYnVpbHRpbi5hYnMoYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGFicyhhKS5cXFwifSxhZGQ6eyRtZXRoOmZ1bmN0aW9uIGFkZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkFkZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArIGIuXFxcIn0sYW5kXzp7JG1ldGg6ZnVuY3Rpb24gYW5kXyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkJpdEFuZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAmIGIuXFxcIn0sZmxvb3JkaXY6eyRtZXRoOmZ1bmN0aW9uIGZsb29yZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiRmxvb3JEaXZcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLy8gYi5cXFwifSxpbmRleDp7JG1ldGg6ZnVuY3Rpb24gaW5kZXgoYil7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oU2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYikpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhLl9faW5kZXhfXygpXFxcIn0saW52OnskbWV0aDpmdW5jdGlvbiBpbnYoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiSW52ZXJ0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIH5hLlxcXCJ9LGludmVydDp7JG1ldGg6ZnVuY3Rpb24gaW52ZXJ0KGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIkludmVydFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgfmEuXFxcIn0sbHNoaWZ0OnskbWV0aDpmdW5jdGlvbiBsc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJMU2hpZnRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPDwgYi5cXFwifSxtb2Q6eyRtZXRoOmZ1bmN0aW9uIG1vZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIk1vZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAlIGIuXFxcIn0sbXVsOnskbWV0aDpmdW5jdGlvbiBtdWwoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICogYi5cXFwifSxtYXRtdWw6eyRtZXRoOmZ1bmN0aW9uIG1hdG11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIk1hdE11bHRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgQCBiLlxcXCJ9LG5lZzp7JG1ldGg6ZnVuY3Rpb24gbmVnKGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIlVTdWJcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgLWEuXFxcIn0sb3JfOnskbWV0aDpmdW5jdGlvbiBvcl8oYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJCaXRPclxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSB8IGIuXFxcIn0scG9zOnskbWV0aDpmdW5jdGlvbiBwb3MoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiVUFkZFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyArYS5cXFwifSxwb3c6eyRtZXRoOmZ1bmN0aW9uIHBvdyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIlBvd1xcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAqKiBiLlxcXCJ9LHJzaGlmdDp7JG1ldGg6ZnVuY3Rpb24gcnNoaWZ0KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiUlNoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID4+IGIuXFxcIn0sc3ViOnskbWV0aDpmdW5jdGlvbiBzdWIoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJTdWJcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLSBiLlxcXCJ9LHRydWVkaXY6eyRtZXRoOmZ1bmN0aW9uIGRpdihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvIGIuXFxcIn0seG9yOnskbWV0aDpmdW5jdGlvbiB4b3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJCaXRYb3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgXiBiLlxcXCJ9LGNvbmNhdDp7JG1ldGg6ZnVuY3Rpb24gY29uY2F0KGMsYSl7cmV0dXJuIFNrLmFic3RyLnNlcXVlbmNlQ29uY2F0KGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICsgYiwgZm9yIGEgYW5kIGIgc2VxdWVuY2VzLlxcXCJ9LGNvbnRhaW5zOnskbWV0aDpmdW5jdGlvbiBjb250YWlucyhjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGIgaW4gYSAobm90ZSByZXZlcnNlZCBvcGVyYW5kcykuXFxcIn0sY291bnRPZjp7JG1ldGg6ZnVuY3Rpb24gY291bnRPZihjLGEpe3JldHVybiBTay5hYnN0ci5zZXF1ZW5jZUdldENvdW50T2YoYyxhKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBiIG9jY3VycyBpbiBhLlxcXCJ9LGRlbGl0ZW06eyRtZXRoOmZ1bmN0aW9uIGRlbGl0ZW0oYyxhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIub2JqZWN0RGVsSXRlbShjLGEsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgZGVsIGFbYl0uXFxcIn0sZ2V0aXRlbTp7JG1ldGg6ZnVuY3Rpb24gZ2V0aXRlbShjLGEpe3JldHVybiBTay5hYnN0ci5vYmplY3RHZXRJdGVtKGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhW2JdLlxcXCJ9LGluZGV4T2Y6eyRtZXRoOmZ1bmN0aW9uIGluZGV4T2YoYyxhKXtyZXR1cm4gU2suYWJzdHIuc2VxdWVuY2VHZXRJbmRleE9mKGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBvZiBiIGluIGEuXFxcIn0sc2V0aXRlbTp7JG1ldGg6ZnVuY3Rpb24gc2V0aXRlbShkLGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLm9iamVjdFNldEl0ZW0oZCxhLGIsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MyxNYXhBcmdzOjN9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgYywgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYVtiXSA9IGMuXFxcIn0sbGVuZ3RoX2hpbnQ6eyRtZXRoOmZ1bmN0aW9uIGxlbmd0aF9oaW50KGEsYil7aWYodm9pZCAwPT09YiliPW5ldyBTay5idWlsdGluLmludF8oMCk7ZWxzZSBpZighU2suYnVpbHRpbi5jaGVja0ludChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIidcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1xcXCInIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlclxcXCIpO3RyeXtyZXR1cm4gU2suYnVpbHRpbi5sZW4oYSl9Y2F0Y2goYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5UeXBlRXJyb3IpKXRocm93IGF9Y29uc3QgYz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGxlbmd0aF9oaW50KTtpZih2b2lkIDAhPT1jKXtjb25zdCBhPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtpZihhPT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpcmV0dXJuIGI7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnRlZ2VyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiX19sZW5ndGhfaGludF9fIG11c3QgYmUgYW4gaW50ZWdlciwgbm90IFxcXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2Vsc2UgaWYoYS5uYiRpc25lZ2F0aXZlKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJfX2xlbmd0aF9oaW50X18oKSBzaG91bGQgcmV0dXJuID49IDBcXFwiKTtyZXR1cm4gYX1yZXR1cm4gYn0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIG9iaiwgZGVmYXVsdD0wLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gb2JqLlxcXFxuXFxcXG5UaGlzIGlzIHVzZWZ1bCBmb3IgcHJlc2l6aW5nIGNvbnRhaW5lcnMgd2hlbiBidWlsZGluZyBmcm9tIGFuIGl0ZXJhYmxlLlxcXFxuXFxcXG5JZiB0aGUgb2JqZWN0IHN1cHBvcnRzIGxlbigpLCB0aGUgcmVzdWx0IHdpbGwgYmUgZXhhY3QuXFxcXG5PdGhlcndpc2UsIGl0IG1heSBvdmVyLSBvciB1bmRlci1lc3RpbWF0ZSBieSBhbiBhcmJpdHJhcnkgYW1vdW50LlxcXFxuVGhlIHJlc3VsdCB3aWxsIGJlIGFuIGludGVnZXIgPj0gMC5cXFwifSxpYWRkOnskbWV0aDpmdW5jdGlvbiBpYWRkKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkFkZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArPSBiLlxcXCJ9LGlhbmQ6eyRtZXRoOmZ1bmN0aW9uIGlhbmQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0QW5kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICY9IGIuXFxcIn0saWNvbmNhdDp7JG1ldGg6ZnVuY3Rpb24gaWNvbmNhdChjLGEpe2lmKHZvaWQgMCE9PWMuc3EkaW5wbGFjZV9jb25jYXQpcmV0dXJuIGMuc3EkaW5wbGFjZV9jb25jYXQoYSk7aWYodm9pZCAwIT09Yy5zcSRjb25jYXQpcmV0dXJuIGMuc3EkY29uY2F0KGEpO2lmKCFTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYyl8fCFTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGMpK1xcXCIgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZFxcXCIpO3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJBZGRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKz0gYiwgZm9yIGEgYW5kIGIgc2VxdWVuY2VzLlxcXCJ9LGlmbG9vcmRpdjp7JG1ldGg6ZnVuY3Rpb24gaWZsb29yZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkZsb29yRGl2XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC8vPSBiLlxcXCJ9LGlsc2hpZnQ6eyRtZXRoOmZ1bmN0aW9uIGlsc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTFNoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIDw8PSBiLlxcXCJ9LGltb2Q6eyRtZXRoOmZ1bmN0aW9uIGltb2QoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTW9kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICU9IGIuXFxcIn0saW11bDp7JG1ldGg6ZnVuY3Rpb24gaW11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICo9IGIuXFxcIn0saW1hdG11bDp7JG1ldGg6ZnVuY3Rpb24gaW1hdG11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJNYXRNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIEA9IGIuXFxcIn0saW9yOnskbWV0aDpmdW5jdGlvbiBpb3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0T3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgfD0gYi5cXFwifSxpcG93OnskbWV0aDpmdW5jdGlvbiBpcG93KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIlBvd1xcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAqKj0gYi5cXFwifSxpcnNoaWZ0OnskbWV0aDpmdW5jdGlvbiBpcnNoaWZ0KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkxSaGlmdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+Pj0gYi5cXFwifSxpc3ViOnskbWV0aDpmdW5jdGlvbiBpc3ViKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIlN1YlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAtPSBiLlxcXCJ9LGl0cnVlZGl2OnskbWV0aDpmdW5jdGlvbiBpZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvPSBiLlxcXCJ9LGl4b3I6eyRtZXRoOmZ1bmN0aW9uIGl4b3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0WG9yXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIF49IGIuXFxcIn19KSxPYmplY3QuYXNzaWduKG9wZXJhdG9yLHtfX2Fic19fOm9wZXJhdG9yLmFicyxfX2FkZF9fOm9wZXJhdG9yLmFkZCxfX2FuZF9fOm9wZXJhdG9yLmFuZCxfX2NvbmNhdF9fOm9wZXJhdG9yLmNvbmNhdCxfX2NvbnRhaW5zX186b3BlcmF0b3IuY29udGFpbnMsX19kZWxpdGVtX186b3BlcmF0b3IuZGVsaXRlbSxfX2VxX186b3BlcmF0b3IuZXEsX19mbG9vcmRpdl9fOm9wZXJhdG9yLmZsb29yZGl2LF9fZ2VfXzpvcGVyYXRvci5nZSxfX2dldGl0ZW1fXzpvcGVyYXRvci5nZXRpdGVtLF9fZ3RfXzpvcGVyYXRvci5ndCxfX2lhZGRfXzpvcGVyYXRvci5pYWRkLF9faWFuZF9fOm9wZXJhdG9yLmlhbmQsX19pY29uY2F0X186b3BlcmF0b3IuaWNvbmNhdCxfX2lmbG9vcmRpdl9fOm9wZXJhdG9yLmlmbG9vcmRpdixfX2lsc2hpZnRfXzpvcGVyYXRvci5pbHNoaWZ0LF9faW1hdG11bF9fOm9wZXJhdG9yLmltYXRtdWwsX19pbW9kX186b3BlcmF0b3IuaW1vZCxfX2ltdWxfXzpvcGVyYXRvci5pbXVsLF9faW5kZXhfXzpvcGVyYXRvci5pbmRleCxfX2ludl9fOm9wZXJhdG9yLmludixfX2ludmVydF9fOm9wZXJhdG9yLmludmVydCxfX2lvcl9fOm9wZXJhdG9yLmlvcixfX2lwb3dfXzpvcGVyYXRvci5pcG93LF9faXJzaGlmdF9fOm9wZXJhdG9yLmlyc2hpZnQsX19pc3ViX186b3BlcmF0b3IuaXN1YixfX2l0cnVlZGl2X186b3BlcmF0b3IuaXRydWVkaXYsX19peG9yX186b3BlcmF0b3IuaXhvcixfX2xlX186b3BlcmF0b3IubGUsX19sc2hpZnRfXzpvcGVyYXRvci5sc2hpZnQsX19sdF9fOm9wZXJhdG9yLmx0LF9fbWF0bXVsX186b3BlcmF0b3IubWF0bXVsLF9fbW9kX186b3BlcmF0b3IubW9kLF9fbXVsX186b3BlcmF0b3IubXVsLF9fbmVfXzpvcGVyYXRvci5uZSxfX25lZ19fOm9wZXJhdG9yLm5lZyxfX25vdF9fOm9wZXJhdG9yLm5vdCxfX29yX186b3BlcmF0b3Iub3IsX19wb3NfXzpvcGVyYXRvci5wb3MsX19wb3dfXzpvcGVyYXRvci5wb3csX19yc2hpZnRfXzpvcGVyYXRvci5yc2hpZnQsX19zZXRpdGVtX186b3BlcmF0b3Iuc2V0aXRlbSxfX3N1Yl9fOm9wZXJhdG9yLnN1YixfX3RydWVkaXZfXzpvcGVyYXRvci50cnVlZGl2LF9feG9yX186b3BlcmF0b3IueG9yLF9hYnM6U2suYnVpbHRpbnMuYWJzLGRpdjpvcGVyYXRvci50cnVlZGl2LF9fZGl2X186b3BlcmF0b3IudHJ1ZWRpdn0pLG9wZXJhdG9yfVwiLFwic3JjL2xpYi9vcHRwYXJzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwib3B0cGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwib3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vczJlbXhwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvczJlbXhwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9waWNrbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBpY2tsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BpY2tsZXRvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwaWNrbGV0b29scyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BpcGVzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwaXBlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BrZ3V0aWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBrZ3V0aWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wbGF0Zm9ybS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e30sYj1cXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHdpbmRvdyYmXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cubmF2aWdhdG9yO3JldHVybiBhLnB5dGhvbl9pbXBsZW1lbnRhdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInB5dGhvbl9pbXBsZW1lbnRhdGlvblxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnN0cihcXFwiU2t1bHB0XFxcIil9KSxhLm5vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJub2RlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKX0pLGEudmVyc2lvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInZlcnNpb25cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSksYS5weXRob25fdmVyc2lvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInB5dGhvbl92ZXJzaW9uXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1Tay5fX2Z1dHVyZV9fLnB5dGhvbl92ZXJzaW9uP1xcXCIzLjIuMFxcXCI6XFxcIjIuNy4wXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLnN5c3RlbT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInN5c3RlbVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLGE9Yj93aW5kb3cubmF2aWdhdG9yLmFwcENvZGVOYW1lOlxcXCJcXFwiLG5ldyBTay5idWlsdGluLnN0cihhKX0pLGEubWFjaGluZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1hY2hpbmVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxhPWI/d2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybTpcXFwiXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLnJlbGVhc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJyZWxlYXNlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1iP3dpbmRvdy5uYXZpZ2F0b3IuYXBwVmVyc2lvbjpcXFwiXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLmFyY2hpdGVjdHVyZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImFyY2hpdGVjdHVyZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoXFxcIjY0Yml0XFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKV0pfSksYS5wcm9jZXNzb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJwcm9jZXNzb3JcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSksYX07XCIsXCJzcmMvbGliL3BsYXRmb3JtLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwbGF0Zm9ybSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BsaXN0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwbGlzdGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BvcGVuMi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9wZW4yIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcG9wbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwb3BsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wb3NpeGZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBvc2l4ZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Bvc2l4cGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9zaXhwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHByaW50LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwcHJpbnQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wcm9jZXNzaW5nLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaCxhPU1hdGguUEksaj17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJwcm9jZXNzaW5nXFxcIil9LGs9W10sbD0hMCxtPW51bGw7cmV0dXJuIGoucHJvY2Vzc2luZz1udWxsLGoucD1udWxsLGouWD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouRz1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouQj1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouQT1uZXcgU2suYnVpbHRpbi5pbnRfKDYpLGouVT1uZXcgU2suYnVpbHRpbi5pbnRfKDcpLGouVj1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouTlg9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLk5ZPW5ldyBTay5idWlsdGluLmludF8oMTApLGouTlo9bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksai5FREdFPW5ldyBTay5idWlsdGluLmludF8oMTIpLGouU1I9bmV3IFNrLmJ1aWx0aW4uaW50XygxMyksai5TRz1uZXcgU2suYnVpbHRpbi5pbnRfKDE0KSxqLlNCPW5ldyBTay5idWlsdGluLmludF8oMTUpLGouU0E9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5TVz1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLlRYPW5ldyBTay5idWlsdGluLmludF8oMTgpLGouVFk9bmV3IFNrLmJ1aWx0aW4uaW50XygxOSksai5UWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlZYPW5ldyBTay5idWlsdGluLmludF8oMjEpLGouVlk9bmV3IFNrLmJ1aWx0aW4uaW50XygyMiksai5WWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIzKSxqLlZXPW5ldyBTay5idWlsdGluLmludF8oMjQpLGouQVI9bmV3IFNrLmJ1aWx0aW4uaW50XygyNSksai5BRz1uZXcgU2suYnVpbHRpbi5pbnRfKDI2KSxqLkFCPW5ldyBTay5idWlsdGluLmludF8oMjcpLGouRFI9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkRHPW5ldyBTay5idWlsdGluLmludF8oNCksai5EQj1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouREE9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2KSxqLlNQUj1uZXcgU2suYnVpbHRpbi5pbnRfKDI4KSxqLlNQRz1uZXcgU2suYnVpbHRpbi5pbnRfKDI5KSxqLlNQQj1uZXcgU2suYnVpbHRpbi5pbnRfKDMwKSxqLlNISU5FPW5ldyBTay5idWlsdGluLmludF8oMzEpLGouRVI9bmV3IFNrLmJ1aWx0aW4uaW50XygzMiksai5FRz1uZXcgU2suYnVpbHRpbi5pbnRfKDMzKSxqLkVCPW5ldyBTay5idWlsdGluLmludF8oMzQpLGouQkVFTl9MSVQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNSksai5WRVJURVhfRklFTERfQ09VTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNiksai5DRU5URVI9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLlJBRElVUz1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQ09STkVSUz1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouQ09STkVSPW5ldyBTay5idWlsdGluLmludF8oMCksai5ESUFNRVRFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQkFTRUxJTkU9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLlRPUD1uZXcgU2suYnVpbHRpbi5pbnRfKDEwMSksai5CT1RUT009bmV3IFNrLmJ1aWx0aW4uaW50XygxMDIpLGouTk9STUFMPW5ldyBTay5idWlsdGluLmludF8oMSksai5OT1JNQUxJWkVEPW5ldyBTay5idWlsdGluLmludF8oMSksai5JTUFHRT1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouTU9ERUw9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLlNIQVBFPW5ldyBTay5idWlsdGluLmludF8oNSksai5BTUJJRU5UPW5ldyBTay5idWlsdGluLmludF8oMCksai5ESVJFQ1RJT05BTD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouU1BPVD1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouUkdCPW5ldyBTay5idWlsdGluLmludF8oMSksai5BUkdCPW5ldyBTay5idWlsdGluLmludF8oMiksai5IU0I9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkFMUEhBPW5ldyBTay5idWlsdGluLmludF8oNCksai5DTVlLPW5ldyBTay5idWlsdGluLmludF8oNSksai5USUZGPW5ldyBTay5idWlsdGluLmludF8oMCksai5UQVJHQT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouSlBFRz1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouR0lGPW5ldyBTay5idWlsdGluLmludF8oMyksai5NSVRFUj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIm1pdGVyXFxcIiksai5CRVZFTD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImJldmVsXFxcIiksai5ST1VORD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcInJvdW5kXFxcIiksai5TUVVBUkU9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJidXR0XFxcIiksai5QUk9KRUNUPW5ldyBTay5idWlsdGluLnN0cihcXFwic3F1YXJlXFxcIiksai5QMkQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkpBVkEyRD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouV0VCR0w9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlAzRD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouT1BFTkdMPW5ldyBTay5idWlsdGluLmludF8oMiksai5QREY9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkRYRj1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouT1RIRVI9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLldJTkRPV1M9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLk1BWE9TWD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouTElOVVg9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkVQU0lMT049bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDFlLTQpLGouTUFYX0ZMT0FUPW5ldyBTay5idWlsdGluLmZsb2F0XygzNDAyODIzNWUzMSksai5NSU5fRkxPQVQ9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0zNDAyODIzNWUzMSksai5NQVhfSU5UPW5ldyBTay5idWlsdGluLmludF8oMjE0NzQ4MzY0Nyksai5NSU5fSU5UPW5ldyBTay5idWlsdGluLmludF8oLTIxNDc0ODM2NDgpLGouSEFMRl9QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS8yKSxqLlRISVJEX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XyhhLzMpLGouUEk9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpLGouVFdPX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XygyKmEpLGouVEFVPW5ldyBTay5idWlsdGluLmZsb2F0XygyKmEpLGouUVVBUlRFUl9QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS80KSxqLkRFR19UT19SQUQ9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvMTgwKSxqLlJBRF9UT19ERUc9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDE4MC9hKSxqLldISVRFU1BBQ0U9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIgXFxcXHRcXFxcblxcXFxyXFxcXGZcXFxceEEwXFxcIiksai5QT0lOVD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUE9JTlRTPW5ldyBTay5idWlsdGluLmludF8oMiksai5MSU5FPW5ldyBTay5idWlsdGluLmludF8oNCksai5MSU5FUz1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouVFJJQU5HTEU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg4KSxqLlRSSUFOR0xFUz1uZXcgU2suYnVpbHRpbi5pbnRfKDkpLGouVFJJQU5HTEVfRkFOPW5ldyBTay5idWlsdGluLmludF8oMTEpLGouVFJJQU5HTEVfU1RSSVA9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5RVUFEPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouUVVBRFM9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5RVUFEX1NUUklQPW5ldyBTay5idWlsdGluLmludF8oMTcpLGouUE9MWUdPTj1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlBBVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygyMSksai5SRUNUPW5ldyBTay5idWlsdGluLmludF8oMzApLGouRUxMSVBTRT1uZXcgU2suYnVpbHRpbi5pbnRfKDMxKSxqLkFSQz1uZXcgU2suYnVpbHRpbi5pbnRfKDMyKSxqLlNQSEVSRT1uZXcgU2suYnVpbHRpbi5pbnRfKDQwKSxqLkJPWD1uZXcgU2suYnVpbHRpbi5pbnRfKDQxKSxqLkdST1VQPW5ldyBTay5idWlsdGluLmludF8oMCksai5QUklNSVRJVkU9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkdFT01FVFJZPW5ldyBTay5idWlsdGluLmludF8oMyksai5WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkJFWklFUl9WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkNVUlZFX1ZFUlRFWD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQlJFQUs9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkNMT1NFU0hBUEU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLlJFUExBQ0U9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkJMRU5EPW5ldyBTay5idWlsdGluLmludF8oMSksai5BREQ9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlNVQlRSQUNUPW5ldyBTay5idWlsdGluLmludF8oNCksai5MSUdIVEVTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouREFSS0VTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLkRJRkZFUkVOQ0U9bmV3IFNrLmJ1aWx0aW4uaW50XygzMiksai5FWENMVVNJT049bmV3IFNrLmJ1aWx0aW4uaW50Xyg2NCksai5NVUxUSVBMWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyOCksai5TQ1JFRU49bmV3IFNrLmJ1aWx0aW4uaW50XygyNTYpLGouT1ZFUkxBWT1uZXcgU2suYnVpbHRpbi5pbnRfKDUxMiksai5IQVJEX0xJR0hUPW5ldyBTay5idWlsdGluLmludF8oMTAyNCksai5TT0ZUX0xJR0hUPW5ldyBTay5idWlsdGluLmludF8oMjA0OCksai5ET0RHRT1uZXcgU2suYnVpbHRpbi5pbnRfKDQwOTYpLGouQlVSTj1uZXcgU2suYnVpbHRpbi5pbnRfKDgxOTIpLGouQUxQSEFfTUFTSz1uZXcgU2suYnVpbHRpbi5pbnRfKDQyNzgxOTAwODApLGouUkVEX01BU0s9bmV3IFNrLmJ1aWx0aW4uaW50XygxNjcxMTY4MCksai5HUkVFTl9NQVNLPW5ldyBTay5idWlsdGluLmludF8oNjUyODApLGouQkxVRV9NQVNLPW5ldyBTay5idWlsdGluLmludF8oMjU1KSxqLkNVU1RPTT1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouT1JUSE9HUkFQSElDPW5ldyBTay5idWlsdGluLmludF8oMiksai5QRVJTUEVDVElWRT1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQVJST1c9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJkZWZhdWx0XFxcIiksai5DUk9TUz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImNyb3NzaGFpclxcXCIpLGouSEFORD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcInBvaW50ZXJcXFwiKSxqLk1PVkU9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJtb3ZlXFxcIiksai5URVhUPW5ldyBTay5idWlsdGluLnN0cihcXFwidGV4dFxcXCIpLGouV0FJVD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIndhaXRcXFwiKSxqLk5PQ1VSU09SPVNrLmJ1aWx0aW4uYXNzayQoXFxcInVybCgnZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBUC8vL3dBQUFDSDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUNSQUVBT3c9PScpLCBhdXRvXFxcIiksai5ESVNBQkxFX09QRU5HTF8yWF9TTU9PVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkVOQUJMRV9PUEVOR0xfMlhfU01PT1RIPW5ldyBTay5idWlsdGluLmludF8oLTEpLGouRU5BQkxFX09QRU5HTF80WF9TTU9PVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkVOQUJMRV9OQVRJVkVfRk9OVFM9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkRJU0FCTEVfREVQVEhfVEVTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouRU5BQkxFX0RFUFRIX1RFU1Q9bmV3IFNrLmJ1aWx0aW4uaW50XygtNCksai5FTkFCTEVfREVQVEhfU09SVD1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouRElTQUJMRV9ERVBUSF9TT1JUPW5ldyBTay5idWlsdGluLmludF8oLTUpLGouRElTQUJMRV9PUEVOR0xfRVJST1JfUkVQT1JUPW5ldyBTay5idWlsdGluLmludF8oNiksai5FTkFCTEVfT1BFTkdMX0VSUk9SX1JFUE9SVD1uZXcgU2suYnVpbHRpbi5pbnRfKC02KSxqLkVOQUJMRV9BQ0NVUkFURV9URVhUVVJFUz1uZXcgU2suYnVpbHRpbi5pbnRfKDcpLGouRElTQUJMRV9BQ0NVUkFURV9URVhUVVJFUz1uZXcgU2suYnVpbHRpbi5pbnRfKC03KSxqLkhJTlRfQ09VTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5PUEVOPW5ldyBTay5idWlsdGluLmludF8oMSksai5DTE9TRT1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQkxVUj1uZXcgU2suYnVpbHRpbi5pbnRfKDExKSxqLkdSQVk9bmV3IFNrLmJ1aWx0aW4uaW50XygxMiksai5JTlZFUlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMyksai5PUEFRVUU9bmV3IFNrLmJ1aWx0aW4uaW50XygxNCksai5QT1NURVJJWkU9bmV3IFNrLmJ1aWx0aW4uaW50XygxNSksai5USFJFU0hPTEQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5FUk9ERT1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLkRJTEFURT1uZXcgU2suYnVpbHRpbi5pbnRfKDE4KSxqLkJBQ0tTUEFDRT1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouVEFCPW5ldyBTay5idWlsdGluLmludF8oOSksai5FTlRFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDEwKSxqLlJFVFVSTj1uZXcgU2suYnVpbHRpbi5pbnRfKDEzKSxqLkVTQz1uZXcgU2suYnVpbHRpbi5pbnRfKDI3KSxqLkRFTEVURT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyNyksai5DT0RFRD1uZXcgU2suYnVpbHRpbi5pbnRfKDY1NTM1KSxqLlNISUZUPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouQ09OVFJPTD1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLkFMVD1uZXcgU2suYnVpbHRpbi5pbnRfKDE4KSxqLkNBUFNMSz1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlBHVVA9bmV3IFNrLmJ1aWx0aW4uaW50XygzMyksai5QR0ROPW5ldyBTay5idWlsdGluLmludF8oMzQpLGouRU5EPW5ldyBTay5idWlsdGluLmludF8oMzUpLGouSE9NRT1uZXcgU2suYnVpbHRpbi5pbnRfKDM2KSxqLkxFRlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNyksai5VUD1uZXcgU2suYnVpbHRpbi5pbnRfKDM4KSxqLlJJR0hUPW5ldyBTay5idWlsdGluLmludF8oMzkpLGouRE9XTj1uZXcgU2suYnVpbHRpbi5pbnRfKDQwKSxqLkYxPW5ldyBTay5idWlsdGluLmludF8oMTEyKSxqLkYyPW5ldyBTay5idWlsdGluLmludF8oMTEzKSxqLkYzPW5ldyBTay5idWlsdGluLmludF8oMTE0KSxqLkY0PW5ldyBTay5idWlsdGluLmludF8oMTE1KSxqLkY1PW5ldyBTay5idWlsdGluLmludF8oMTE2KSxqLkY2PW5ldyBTay5idWlsdGluLmludF8oMTE3KSxqLkY3PW5ldyBTay5idWlsdGluLmludF8oMTE4KSxqLkY4PW5ldyBTay5idWlsdGluLmludF8oMTE5KSxqLkY5PW5ldyBTay5idWlsdGluLmludF8oMTIwKSxqLkYxMD1uZXcgU2suYnVpbHRpbi5pbnRfKDEyMSksai5GMTE9bmV3IFNrLmJ1aWx0aW4uaW50XygxMjIpLGouRjEyPW5ldyBTay5idWlsdGluLmludF8oMTIzKSxqLk5VTUxLPW5ldyBTay5idWlsdGluLmludF8oMTQ0KSxqLk1FVEE9bmV3IFNrLmJ1aWx0aW4uaW50XygxNTcpLGouSU5TRVJUPW5ldyBTay5idWlsdGluLmludF8oMTU1KSxqLlNJTkNPU19MRU5HVEg9bmV3IFNrLmJ1aWx0aW4uaW50Xyg3MjApLGouUFJFQ0lTSU9OQj1uZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxqLlBSRUNJU0lPTkY9bmV3IFNrLmJ1aWx0aW4uaW50XygzMjc2OCksai5QUkVDX01BWFZBTD1uZXcgU2suYnVpbHRpbi5pbnRfKDMyNzY3KSxqLlBSRUNfQUxQSEFfU0hJRlQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLlBSRUNfUkVEX1NISUZUPW5ldyBTay5idWlsdGluLmludF8oMSksai5OT1JNQUxfTU9ERV9BVVRPPW5ldyBTay5idWlsdGluLmludF8oMCksai5OT1JNQUxfTU9ERV9TSEFQRT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouTk9STUFMX01PREVfVkVSVEVYPW5ldyBTay5idWlsdGluLmludF8oMiksai5NQVhfTElHSFRTPW5ldyBTay5idWlsdGluLmludF8oOCksai5saW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmxpbmUoYS52LGIudixjLnYsZC52KX0pLGouZWxsaXBzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2oucHJvY2Vzc2luZy5lbGxpcHNlKGEudixiLnYsYy52LGQudil9KSxqLnRleHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLnRleHQoYS52LGIudixjLnYpfSksai5wb2ludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7ai5wcm9jZXNzaW5nLnBvaW50KGEudixiLnYpfSksai5hcmM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmFyYyhhLnYsYi52LGMudixkLnYsZS52LGYudil9KSxqLnF1YWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe2oucHJvY2Vzc2luZy5xdWFkKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpfSksai5yZWN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGU/ai5wcm9jZXNzaW5nLnJlY3QoYS52LGIudixjLnYsZC52KTpqLnByb2Nlc3NpbmcucmVjdChhLnYsYi52LGMudixkLnYsZS52KX0pLGoudHJpYW5nbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLnRyaWFuZ2xlKGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGouYmV6aWVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksayxsLG0pe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaT9qLnByb2Nlc3NpbmcuYmV6aWVyKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5iZXppZXIoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52LGwudixtLnYpfSksai5hbHBoYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYsYy52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYsYy52LGQudikpfSksai5hbWJpZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuYW1iaWVudChhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcuYW1iaWVudChhLnYsYy52KTpqLnByb2Nlc3NpbmcuYW1iaWVudChhLnYsYy52LGQudil9KSxqLmFtYmllbnRMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy5hbWJpZW50TGlnaHQoYS52LGIudixjLnYsZC52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGY/ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudixkLnYsZS52KTpqLnByb2Nlc3NpbmcuYW1iaWVudExpZ2h0KGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGouYmVnaW5DYW1lcmE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5iZWdpbkNhbWVyYSgpfSksai5iZWdpblNoYXBlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhJiYoYT1qLlBPTFlHT04pLGoucHJvY2Vzc2luZy5iZWdpblNoYXBlKGEudil9KSxqLmJlemllckRldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2E9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhPzIwOmEudixqLnByb2Nlc3NpbmcuYmV6aWVyRGV0YWlsKGEpfSksai5iZXppZXJQb2ludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGUsYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmJlemllclBvaW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5iZXppZXJUYW5nZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuYmV6aWVyVGFuZ2VudChlLnYsYS52LGIudixjLnYsZC52KX0pLGouYmV6aWVyVmVydGV4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZz9qLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGg/ai5wcm9jZXNzaW5nLmJlemllclZlcnRleChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaT9qLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5iZXppZXJWZXJ0ZXgoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYpfSksai5ibGVuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGspe290aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxvdGhlciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfP2oucHJvY2Vzc2luZy5ibGVuZChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudik6ai5wcm9jZXNzaW5nLmJsZW5kKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudil9KSxqLmJsZW5kQ29sb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsZCl7dmFyIGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouY29sb3IsW25ldyBTay5idWlsdGluLmludF8oMCksbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApXSk7cmV0dXJuIGUudj1qLnByb2Nlc3NpbmcuYmxlbmRDb2xvcihhLnYsYi52LGQudiksZX0pLGouYnJpZ2h0bmVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5icmlnaHRuZXNzKGEudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmJyaWdodG5lc3MoYS52LGMudikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuYnJpZ2h0bmVzcyhhLnYsYy52LGQudikpfSksai5jYW1lcmE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP2oucHJvY2Vzc2luZy5jYW1lcmEoKTpqLnByb2Nlc3NpbmcuY2FtZXJhKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KX0pLGouY29uc3RyYWluPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmNvbnN0cmFpbihhLnYsYi52LGMudikpfSksai5jb3B5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe290aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxvdGhlciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfP2oucHJvY2Vzc2luZy5jb3B5KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5jb3B5KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KX0pLGouY3JlYXRlRm9udD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBGb250KTtyZXR1cm4gZS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuY3JlYXRlRm9udChhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmNyZWF0ZUZvbnQoYS52LGIudixjLnYpOmoucHJvY2Vzc2luZy5jcmVhdGVGb250KGEudixiLnYsYy52LGQudiksZX0pLGouY3JlYXRlR3JhcGhpY3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QR3JhcGhpY3MpO3JldHVybiBlLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5jcmVhdGVHcmFwaGljcyhhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLmNyZWF0ZUdyYXBoaWNzKGEudixiLnYsYy52LGQudiksZX0pLGouY3JlYXRlSW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7dmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEltYWdlKTtyZXR1cm4gZC52PWoucHJvY2Vzc2luZy5jcmVhdGVJbWFnZShhLnYsYi52LGMudiksZH0pLGouY3Vyc29yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcuY3Vyc29yKCk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5jdXJzb3IoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmN1cnNvcihhLnYsYi52KTpqLnByb2Nlc3NpbmcuY3Vyc29yKGEudixiLnYsYy52KX0pLGouY3VydmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxrLGwsbSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBpP2oucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGs/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGw/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBtP2oucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudixrLnYsbC52KTpqLnByb2Nlc3NpbmcuY3VydmUoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52LGwudixtLnYpfSksai5jdXJ2ZURldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5jdXJ2ZURldGFpbChhLnYpfSksai5jdXJ2ZVBvaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuY3VydmVQb2ludChlLnYsYS52LGIudixjLnYsZC52KX0pLGouY3VydmVUYW5nZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuY3VydmVUYW5nZW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5jdXJ2ZVRpZ2h0bmVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5jdXJ2ZVRpZ2h0bmVzcyhhLnYpfSksai5jdXJ2ZVZlcnRleD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmN1cnZlVmVydGV4KGEudixiLnYpOmoucHJvY2Vzc2luZy5jdXJ2ZVZlcnRleChhLnYsYi52LGMudil9KSxqLmRheT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmRheSgpKX0pLGouZGVncmVlcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRlZ3JlZXMoYS52KSl9KSxqLmRpcmVjdGlvbmFsTGlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmRpcmVjdGlvbmFsTGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5kaXN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRpc3QoYS52LGIudixjLnYsZC52KSk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBmP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuZGlzdChhLnYsYi52LGMudixkLnYsZS52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5kaXN0KGEudixiLnYsYy52LGQudixlLnYsZi52KSl9KSxqLmVtaXNzaXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcuZW1pc3NpdmUoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmVtaXNzaXZlKGEudixiLnYpOmoucHJvY2Vzc2luZy5lbWlzc2l2ZShhLnYsYi52LGMudil9KSxqLmVuZENhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLmVuZENhbWVyYSgpfSksai5lbmRTaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcuZW5kU2hhcGUoKTpqLnByb2Nlc3NpbmcuZW5kU2hhcGUoYS52KX0pLGouZmlsdGVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLmZpbHRlcihhLnYpOmoucHJvY2Vzc2luZy5maWx0ZXIoYS52LGIudil9KSxqLmZydXN0dW09bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmZydXN0dW0oYSxiLGMsZCxlLGYpfSksai5oaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmhpbnQoYSl9KSxqLmhvdXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ob3VyKCkpfSksai5odWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5odWUoYS52KSl9KSxqLmltYWdlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5pbWFnZU1vZGUoYS52KX0pLGoubGVycD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5sZXJwKGEudixiLnYsYy52KSl9KSxqLmxlcnBDb2xvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5jb2xvcixbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCldKTtyZXR1cm4gZS52PWoucHJvY2Vzc2luZy5sZXJwQ29sb3IoYS52LGIudixkLnYpLGV9KSxqLmxpZ2h0RmFsbG9mZj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3NpbmcubGlnaHRGYWxsb2ZmKGEudixiLnYsYy52KX0pLGoubGlnaHRzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcubGlnaHRzKCl9KSxqLmxpZ2h0U3BlY3VsYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLmxpZ2h0U3BlY3VsYXIoYS52LGIudixjLnYpfSksai5sb2FkQnl0ZXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChqLnByb2Nlc3NpbmcubG9hZEJ5dGVzKGEudikpfSksai5sb2FkRm9udD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBGb250KTtyZXR1cm4gYi52PWoucHJvY2Vzc2luZy5sb2FkRm9udChhLnYpLGJ9KSxqLmxvYWRTaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBTaGFwZVNWRyxbbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJzdHJpbmdcXFwiKSxhXSk7cmV0dXJuIGJ9KSxqLmxvYWRTdHJpbmdzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3Qoai5wcm9jZXNzaW5nLmxvYWRTdHJpbmdzKGEudikpfSksai5tYWc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihkLGEsYil7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubWFnKGQudixhLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1hZyhkLnYsYS52LGIudikpfSksai5tYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1hcChhLnYsYi52LGMudixkLnYsZS52KSl9KSxqLm1pbGxpcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1pbGxpcygpKX0pLGoubWludXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcubWludXRlKCkpfSksai5tb2RlbFg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubW9kZWxYKGEudixiLnYsYy52KSl9KSxqLm1vZGVsWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5tb2RlbFkoYS52LGIudixjLnYpKX0pLGoubW9kZWxaPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1vZGVsWihhLnYsYi52LGMudikpfSksai5tb250aD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1vbnRoKCkpfSksai5ub0N1cnNvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vQ3Vyc29yKCl9KSxqLm5vaXNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudixiLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudixiLnYsYy52KSl9KSxqLm5vaXNlRGV0YWlsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtqLnByb2Nlc3Npbmcubm9pc2VEZXRhaWwoYS52LGIudil9KSxqLm5vaXNlU2VlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlU2VlZChhLnYpKX0pLGoubm9MaWdodHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub0xpZ2h0cygpfSksai5ub3JtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vcm0oYS52LGIudixjLnYpKX0pLGoubm9ybWFsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2oucHJvY2Vzc2luZy5ub3JtYWwoYS52LGIudixjLnYpfSksai5ub1RpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub1RpbnQoKX0pLGoub3J0aG89bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLm9ydGhvKGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGoucGVyc3BlY3RpdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKCk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcucGVyc3BlY3RpdmUoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKGEudixiLnYsYy52LGQudil9KSxqLnBvaW50TGlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLnBvaW50TGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5wcmludENhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnByaW50Q2FtZXJhKCl9KSxqLnByaW50bG49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcucHJpbnRsbihhLnYpfSksai5wcmludFByb2plY3Rpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5wcmludFByb2plY3Rpb24oKX0pLGoucmFkaWFucz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhZGlhbnMoYS52KSl9KSxqLnJhbmRvbVNlZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb21TZWVkKGEudikpfSksai5yYW5kb209bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhbmRvbSgpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb20oYS52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb20oYS52LGIudikpfSksai5yZXF1ZXN0SW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBJbWFnZSk7cmV0dXJuIGMudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnJlcXVlc3RJbWFnZShhLnYpOmoucHJvY2Vzc2luZy5yZXF1ZXN0SW1hZ2UoYS52LGIudiksY30pLGouc2F0dXJhdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNhdHVyYXRpb24oYS52KSl9KSxqLnNhdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc2F2ZShhLnYpfSksai5zYXZlRnJhbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLnNhdmVGcmFtZSgpOmoucHJvY2Vzc2luZy5zYXZlRnJhbWUoYS52KX0pLGouc2F2ZVN0cmluZ3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2oucHJvY2Vzc2luZy5zYXZlU3RyaW5ncyhhLnYsYi52KX0pLGouc2NyZWVuWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zY3JlZW5YKGEudixiLnYsYy52KSl9KSxqLnNjcmVlblk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcuc2NyZWVuWShhLnYsYi52LGMudikpfSksai5zY3JlZW5aPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNjcmVlblooYS52LGIudixjLnYpKX0pLGouc2Vjb25kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3Npbmcuc2Vjb25kKCkpfSksai5zaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5zaGFwZShhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3Npbmcuc2hhcGUoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudixkLnYpOmoucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudixkLnYsZS52KX0pLGouc2hhcGVNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnNoYXBlTW9kZShhLnYpfSksai5zaGluaW5lc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc2hpbmluZXNzKGEudil9KSxqLnNwZWN1bGFyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3Npbmcuc3BlY3VsYXIoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnNwZWN1bGFyKGEudixiLnYpOmoucHJvY2Vzc2luZy5zcGVjdWxhcihhLnYsYi52LGMudil9KSxqLnNwb3RMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7ai5wcm9jZXNzaW5nLnNwb3RMaWdodChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KX0pLGouc3E9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zcShhKSl9KSxqLnN0YXR1cz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zdGF0dXMoYS52KX0pLGoudGV4dEFsaWduPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnRleHRBbGlnbihhLnYpOmoucHJvY2Vzc2luZy50ZXh0QWxpZ24oYS52LGIudil9KSxqLnRleHRBc2NlbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnRleHRBc2NlbnQoKSl9KSxqLnRleHREZXNjZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy50ZXh0RGVzY2VudCgpKX0pLGoudGV4dEZvbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcudGV4dEZvbnQoYS52KTpqLnByb2Nlc3NpbmcudGV4dEZvbnQoYS52LGIudil9KSxqLnRleHRMZWFkaW5nPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRMZWFkaW5nKGEudil9KSxqLnRleHRNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRNb2RlKGEudil9KSxqLnRleHRTaXplPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRTaXplKGEudil9KSxqLnRleHR1cmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcudGV4dHVyZShhLnYpfSksai50ZXh0dXJlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy50ZXh0dXJlTW9kZShhLnYpfSksai50ZXh0V2lkdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy50ZXh0V2lkdGgoYS52KSl9KSxqLnRpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnRpbnQoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnRpbnQoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy50aW50KGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcudGludChhLnYsYi52LGMudixkLnYpfSksai51cGRhdGVQaXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy51cGRhdGVQaXhlbHMoKX0pLGoudmVydGV4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy52ZXJ0ZXgoYS52LGIudixjLnYsZC52KTpqLnByb2Nlc3NpbmcudmVydGV4KGEudixiLnYsYy52LGQudixlLnYpfSksai55ZWFyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcueWVhcigpKX0pLGouYm94PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmJveChhLnYpfSksai5zcGhlcmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3BoZXJlKGEudil9KSxqLnNwaGVyZURldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5zcGhlcmVEZXRhaWwoYS52KTpqLnByb2Nlc3Npbmcuc3BoZXJlRGV0YWlsKGEudixiLnYpfSksai5iYWNrZ3JvdW5kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe1xcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksai5wcm9jZXNzaW5nLmJhY2tncm91bmQoYS52LGMsZCl9KSxqLmZpbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxqLnByb2Nlc3NpbmcuZmlsbChhLnYsYyxkLGUpfSksai5zdHJva2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxqLnByb2Nlc3Npbmcuc3Ryb2tlKGEudixjLGQsZSl9KSxqLm5vU3Ryb2tlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3Npbmcubm9TdHJva2UoKX0pLGouY29sb3JNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtiPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj8yNTU6Yi52LFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBlJiYoZT1lLnYpLGoucHJvY2Vzc2luZy5jb2xvck1vZGUoYS52LGIsYyxkLGUpfSksai5ub0ZpbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub0ZpbGwoKX0pLGoubG9vcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYobnVsbD09PWoucHJvY2Vzc2luZyl0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcImxvb3AoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJ1bigpXFxcIik7bD0hMCxqLnByb2Nlc3NpbmcubG9vcCgpfSksai5ub0xvb3A9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKG51bGw9PT1qLnByb2Nlc3NpbmcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uRXhjZXB0aW9uKFxcXCJub0xvb3AoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJ1bigpXFxcIik7bD0hMSxqLnByb2Nlc3Npbmcubm9Mb29wKCl9KSxqLmZyYW1lUmF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5mcmFtZVJhdGUoYS52KX0pLGoud2lkdGg9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLmhlaWdodD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGoucmVuZGVyTW9kZT1qLlAyRCxqLnNpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjJiYoYz1qLlAyRCksai5wcm9jZXNzaW5nLnNpemUoYS52LGIudixjLnYpLGoud2lkdGg9bmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3Npbmcud2lkdGgpLGouaGVpZ2h0PW5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmhlaWdodCksai5yZW5kZXJNb2RlPWN9KSxqLmV4aXRwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcuZXhpdCgpfSksai5tb3VzZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5tb3VzZVgpfSksai5tb3VzZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5tb3VzZVkpfSksai5wbW91c2VYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucG1vdXNlWCl9KSxqLnBtb3VzZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5wbW91c2VZKX0pLGoucmVjdE1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcucmVjdE1vZGUoYS52KX0pLGouc3Ryb2tlV2VpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnN0cm9rZVdlaWdodChhLnYpfSksai5zbW9vdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5zbW9vdGgoKX0pLGoubm9TbW9vdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub1Ntb290aCgpfSksai5lbGxpcHNlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5lbGxpcHNlTW9kZShhLnYpfSksai5zdHJva2VDYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3Ryb2tlQ2FwKGEudil9KSxqLnN0cm9rZUpvaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3Ryb2tlSm9pbihhLnYpfSksai5yb3RhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlKGEudil9KSxqLnJvdGF0ZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlWChhLnYpfSksai5yb3RhdGVZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnJvdGF0ZVkoYS52KX0pLGoucm90YXRlWj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5yb3RhdGVaKGEudil9KSxqLnNjYWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiPzE6Yi52LGM9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjPzE6Yy52LGoucHJvY2Vzc2luZy5zY2FsZShhLnYsYixjKX0pLGoudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiPzE6Yi52LGM9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjPzE6Yy52LGoucHJvY2Vzc2luZy50cmFuc2xhdGUoYS52LGIsYyl9KSxqLnBvcE1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnBvcE1hdHJpeCgpfSksai5wdXNoTWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcucHVzaE1hdHJpeCgpfSksai5hcHBseU1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGEsYj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCwxNik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYlthXT8wOmJbYV0udjtqLnByb2Nlc3NpbmcuYXBwbHlNYXRyaXguYXBwbHkoai5wcm9jZXNzaW5nLGIpfSksai5yZXNldE1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnJlc2V0TWF0cml4KCl9KSxqLnByaW50TWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShqLnByb2Nlc3NpbmcucHJpbnRNYXRyaXgoKSl9KSxqLnJ1bj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU2suY2FudmFzKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoXFxcIlByb2Nlc3NpbmcgbW9kdWxlOiBDYW52YXMgZWxlbWVudCBub3Qgc3BlY2lmaWVkXFxcIik7aWYod2luZG93LlByb2Nlc3NpbmcubG9nZ2VyPXtsb2c6ZnVuY3Rpb24oYSl7U2subWlzY2V2YWwucHJpbnRfKGEpfX0sbT13aW5kb3cuUHJvY2Vzc2luZy5nZXRJbnN0YW5jZUJ5SWQoU2suY2FudmFzKSxtJiZtLmV4aXQoKSxqLnA9bmV3IHdpbmRvdy5Qcm9jZXNzaW5nKGEsZnVuY3Rpb24gc2tldGNoUHJvYyhhKXtqLnByb2Nlc3Npbmc9YSxhLmRyYXc9ZnVuY3Rpb24oKXt2YXIgYj0hMTtmb3IodmFyIGMgaW4gaykwPT09a1tjXS53aWR0aCYmKGI9ITApO2lmKCEwPT1iKXJldHVybiEwPT09bD92b2lkIDA6dm9pZCBhLmxvb3AoKTtpZighMT09PWwmJmEubm9Mb29wKCksai5mcmFtZUNvdW50PWEuZnJhbWVDb3VudCxTay5nbG9iYWxzLmRyYXcpdHJ5e1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5nbG9iYWxzLmRyYXcpfWNhdGNoKGEpe1NrLnVuY2F1Z2h0RXhjZXB0aW9uKGEpfX07dmFyIGI9W1xcXCJzZXR1cFxcXCIsXFxcIm1vdXNlTW92ZWRcXFwiLFxcXCJtb3VzZUNsaWNrZWRcXFwiLFxcXCJtb3VzZURyYWdnZWRcXFwiLFxcXCJtb3VzZU1vdmVkXFxcIixcXFwibW91c2VPdXRcXFwiLFxcXCJtb3VzZU92ZXJcXFwiLFxcXCJtb3VzZVByZXNzZWRcXFwiLFxcXCJtb3VzZVJlbGVhc2VkXFxcIixcXFwia2V5UHJlc3NlZFxcXCIsXFxcImtleVJlbGVhc2VkXFxcIixcXFwia2V5VHlwZWRcXFwiXTtmb3IodmFyIGMgaW4gYilTay5nbG9iYWxzW2JbY11dJiYoYVtiW2NdXT1uZXcgRnVuY3Rpb24oXFxcInRyeSB7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmdsb2JhbHNbJ1xcXCIrYltjXStcXFwiJ10pO30gY2F0Y2goZSkge1NrLnVuY2F1Z2h0RXhjZXB0aW9uKGUpO31cXFwiKSl9KSwwPT09ai53aWR0aC52JiYwPT09ai5oZWlnaHQudil7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLnNpemUsW25ldyBTay5idWlsdGluLmludF8oYiksbmV3IFNrLmJ1aWx0aW4uaW50XyhjKSxqLnJlbmRlck1vZGVdKX19KSxnPWZ1bmN0aW9uKGEsYil7Yi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwieFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5tb3VzZVgpOlxcXCJ5XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcubW91c2VZKTpcXFwicHhcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5wbW91c2VYKTpcXFwicHlcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5wbW91c2VZKTpcXFwicHJlc3NlZFxcXCI9PT1iP25ldyBTay5idWlsdGluLmJvb2woai5wcm9jZXNzaW5nLl9fbW91c2VQcmVzc2VkKTpcXFwiYnV0dG9uXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcubW91c2VCdXR0b24pOnZvaWQgMH0pfSxqLk1vdXNlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixnLFxcXCJNb3VzZVxcXCIsW10pLGoubW91c2U9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouTW91c2UpLGY9ZnVuY3Rpb24oYSxiKXtiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJrZXlcXFwiPT09Yik/bmV3IFNrLmJ1aWx0aW4uc3RyKGoucHJvY2Vzc2luZy5rZXkudG9TdHJpbmcoKSk6XFxcImtleUNvZGVcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5rZXlDb2RlKTpcXFwia2V5UHJlc3NlZFxcXCI9PT1iP25ldyBTay5idWlsdGluLnN0cihqLnByb2Nlc3Npbmcua2V5UHJlc3NlZCk6dm9pZCAwfSl9LGouS2V5Ym9hcmQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGYsXFxcIktleWJvYXJkXFxcIixbXSksai5rZXlib2FyZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5LZXlib2FyZCksZT1mdW5jdGlvbihhLGIpe2IuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImZyYW1lQ291bnRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcuZnJhbWVDb3VudCk6XFxcImZyYW1lUmF0ZVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmZyYW1lUmF0ZSk6XFxcImhlaWdodFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3Npbmcud2lkdGgpOlxcXCJvbmxpbmVcXFwiPT09Yj9uZXcgU2suYnVpbHRpbi5ib29sKGoucHJvY2Vzc2luZy5vbmxpbmUpOlxcXCJmb2N1c2VkXFxcIj09PWI/bmV3IFNrLmJ1aWx0aW4uYm9vbChqLnByb2Nlc3NpbmcuZm9jdXNlZCk6dm9pZCAwfSl9LGouRW52aXJvbm1lbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGUsXFxcIkVudmlyb25tZW50XFxcIixbXSksai5lbnZpcm9ubWVudD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5FbnZpcm9ubWVudCksZD1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnBpeGVscz1udWxsfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwiaGVpZ2h0XFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3Npbmcud2lkdGgpOihcXFwicGl4ZWxzXFxcIj09PWImJm51bGw9PWEucGl4ZWxzJiYoYS5waXhlbHM9bmV3IFNrLmJ1aWx0aW4ubGlzdChqLnByb2Nlc3NpbmcucGl4ZWxzLnRvQXJyYXkoKSkpLGEucGl4ZWxzKX0pfSxqLlNjcmVlbj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZCxcXFwiU2NyZWVuXFxcIixbXSksai5zY3JlZW49U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouU2NyZWVuKSxqLmxvYWRQaXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5sb2FkUGl4ZWxzKCl9KSxjPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBjJiYoYz1jLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZCYmKGQ9ZC52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGUmJihlPWUudiksYS52PWoucHJvY2Vzc2luZy5jb2xvcihiLnYsYyxkLGUpfSl9LGouY29sb3I9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGMsXFxcImNvbG9yXFxcIixbXSksai5yZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucmVkKGEudikpfSksai5ncmVlbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ncmVlbihhLnYpKX0pLGouYmx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ibHVlKGEudikpfSksYj1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUEltYWdlOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYsYy52LGQudil9KSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJ3aWR0aFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LndpZHRoKTpcXFwiaGVpZ2h0XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYuaGVpZ2h0KTp2b2lkIDB9KX0sai5sb2FkSW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1qLnByb2Nlc3NpbmcubG9hZEltYWdlKGEudik7ay5wdXNoKGIpO3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBJbWFnZSk7cmV0dXJuIGMudj1iLGN9KSxqLmltYWdlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmltYWdlKGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcuaW1hZ2UoYS52LGIudixjLnYsZC52LGUudil9KSxqLmdldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9ai5wcm9jZXNzaW5nLmdldChhLnYsYi52KTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouY29sb3IsW25ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLnJlZChjKSksbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuZ3JlZW4oYykpLG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmJsdWUoYykpXSl9KSxqLnNldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3Npbmcuc2V0KGEudixiLnYsYy52KX0pLGg9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3I6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcihiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudixkLnYpfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwieFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGEudi54KTpcXFwieVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LnkpOlxcXCJ6XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYueik6dm9pZCAwfSksYi5nZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYi52PWEudi5nZXQoKSxifSksYi5zZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/YS52LnNldChiLnYsYy52KTphLnYuc2V0KGIudixjLnYsZC52KX0pLGIubWFnPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYXNzayQoYS52Lm1hZygpKX0pLGIuYWRkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYy52PWEudi5hZGQoYi52KSxjfSksYi5zdWI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LnN1YihiLnYpLGN9KSxiLm11bHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52Lm11bHQoYi52KSxjfSksYi5kaXY9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LmRpdihiLnYpLGN9KSxiLmRpc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5idWlsdGluLmFzc2skKGEudi5kaXN0KGIudikpfSksYi5kb3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/U2suYnVpbHRpbi5hc3NrJChhLnYuZG90KGIudikpOlNrLmJ1aWx0aW4uYXNzayQoYS52LmRvdChiLnYsYy52LGQudikpfSksYi5jcm9zcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGMudj1hLnYuY3Jvc3MoYi52KSxjfSksYi5ub3JtYWxpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYubm9ybWFsaXplKCl9KSxiLmxpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYubGltaXQoYi52KX0pLGIuYW5nbGVCZXR3ZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChhLnYuYW5nbGVCZXR3ZWVuKGIudikpfSksYi5hcnJheT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEudi5hcnJheSgpKX0pfSxmb250Q2xhc3M9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUEZvbnQ6bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudil9KSxiLmxpc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYubGlzdCgpKX0pfSxncmFwaGljc0NsYXNzPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudik6bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudixjLnYsZC52KX0pLGIuYmVnaW5EcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmJlZ2luRHJhdygpfSksYi5lbmREcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmVuZERyYXcoKX0pfSxzaGFwZUNsYXNzPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bnVsbDpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52LGMudik6bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52LGMudixkLnYpfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwid2lkdGhcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLnYud2lkdGgpOlxcXCJoZWlnaHRcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEudi5oZWlnaHQpOnZvaWQgMH0pLGIuaXNWaXNpYmxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYS52LmlzVmlzaWJsZSgpKX0pLGIuc2V0VmlzaWJsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnNldFZpc2libGUoYi52KX0pLGIuZGlzYWJsZVN0eWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmRpc2FibGVTdHlsZSgpfSksYi5lbmFibGVTdHlsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5lbmFibGVTdHlsZSgpfSksYi5nZXRDaGlsZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LmdldENoaWxkKGIudik7aWYobnVsbCE9Yyl7dmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFNoYXBlU1ZHKTtyZXR1cm4gZC52PWMsZH1yZXR1cm4gbnVsbH0pLGIudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2Eudi50cmFuc2xhdGUoYi52LGMudik6YS52LnRyYW5zbGF0ZShiLnYsYy52LGQudil9KSxiLnJvdGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnJvdGF0ZShiLnYpfSksYi5yb3RhdGVYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYucm90YXRlWChiLnYpfSksYi5yb3RhdGVZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LnJvdGF0ZVkoYW5nbGUudil9KSxiLnJvdGF0ZVo9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYucm90YXRlWihhbmdsZS52KX0pLGIuc2NhbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/YS52LnNjYWxlKGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2Eudi5zY2FsZShiLnYsYy52KTphLnYuc2NhbGUoYi52LGMudixkLnYpfSl9LGouUEZvbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGZvbnRDbGFzcyxcXFwiUEZvbnRcXFwiLFtdKSxqLlBHcmFwaGljcz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZ3JhcGhpY3NDbGFzcyxcXFwiUEdyYXBoaWNzXFxcIixbXSksai5QU2hhcGVTVkc9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLHNoYXBlQ2xhc3MsXFxcIlBTaGFwZVNWR1xcXCIsW10pLGouUFZlY3Rvcj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosaCxcXFwiUFZlY3RvclxcXCIsW10pLGouUEltYWdlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixiLFxcXCJQSW1hZ2VcXFwiLFtdKSxqfTtcIixcInNyYy9saWIvcHJvZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHJvZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BzdGF0cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHN0YXRzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHR5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwdHkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weV9jb21waWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweV9jb21waWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHljbGJyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweWNsYnIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weWRvYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHlkb2MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weWRvY190b3BpY3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInB5ZG9jX3RvcGljcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL19faW5pdF9fLnB5XCI6XCJcIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvX19pbml0X18ucHlcIjpcIlxcbiNfX2FsbF9fID0gW1xcXCJzdGFja1xcXCJdXFxuXFxuXFxuZnJvbSAuc3RhY2sgaW1wb3J0IFN0YWNrXFxuZnJvbSAucXVldWUgaW1wb3J0IFF1ZXVlXFxuZnJvbSAuZGVxdWUgaW1wb3J0IERlcXVlXFxuXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2Jhc2ljL2RlcXVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuI1xcbiMgZGVxdWUucHlcXG5cXG5cXG5jbGFzcyBEZXF1ZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIGFkZEZyb250KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGFkZFJlYXIoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmluc2VydCgwLCBpdGVtKVxcblxcbiAgICBkZWYgcmVtb3ZlRnJvbnQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlUmVhcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgwKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvcXVldWUucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jXFxuIyBxdWV1ZS5weVxcblxcblxcbmNsYXNzIFF1ZXVlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzRW1wdHkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcyA9PSBbXVxcblxcbiAgICBkZWYgZW5xdWV1ZShzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiBkZXF1ZXVlKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2Jhc2ljL3N0YWNrLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuI1xcbiMgc3RhY2sucHlcXG5cXG5cXG5jbGFzcyBTdGFjazpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIHB1c2goc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgcG9wKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHBlZWsoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtc1tsZW4oc2VsZi5pdGVtcykgLSAxXVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvZ3JhcGhzL19faW5pdF9fLnB5XCI6XCJcXG5cXG5mcm9tIC5hZGpHcmFwaCBpbXBvcnQgR3JhcGhcXG5mcm9tIC5hZGpHcmFwaCBpbXBvcnQgVmVydGV4XFxuZnJvbSAucHJpb3JpdHlRdWV1ZSBpbXBvcnQgUHJpb3JpdHlRdWV1ZVxcblwiLFwic3JjL2xpYi9weXRob25kcy9ncmFwaHMvYWRqR3JhcGgucHlcIjpcIiNcXG4jICBhZGpHcmFwaFxcbiNcXG4jICBDcmVhdGVkIGJ5IEJyYWQgTWlsbGVyIG9uIDIwMDUtMDItMjQuXFxuIyAgQ29weXJpZ2h0IChjKSAyMDA1IEJyYWQgTWlsbGVyLCBEYXZpZCBSYW51bSwgTHV0aGVyIENvbGxlZ2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXFxuI1xcblxcbmltcG9ydCBzeXNcXG5pbXBvcnQgb3NcXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG5jbGFzcyBHcmFwaDpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi52ZXJ0aWNlcyA9IHt9XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gMFxcbiAgICAgICAgXFxuICAgIGRlZiBhZGRWZXJ0ZXgoc2VsZixrZXkpOlxcbiAgICAgICAgc2VsZi5udW1WZXJ0aWNlcyA9IHNlbGYubnVtVmVydGljZXMgKyAxXFxuICAgICAgICBuZXdWZXJ0ZXggPSBWZXJ0ZXgoa2V5KVxcbiAgICAgICAgc2VsZi52ZXJ0aWNlc1trZXldID0gbmV3VmVydGV4XFxuICAgICAgICByZXR1cm4gbmV3VmVydGV4XFxuICAgIFxcbiAgICBkZWYgZ2V0VmVydGV4KHNlbGYsbik6XFxuICAgICAgICBpZiBuIGluIHNlbGYudmVydGljZXM6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYudmVydGljZXNbbl1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLG4pOlxcbiAgICAgICAgcmV0dXJuIG4gaW4gc2VsZi52ZXJ0aWNlc1xcbiAgICBcXG4gICAgZGVmIGFkZEVkZ2Uoc2VsZixmLHQsY29zdD0wKTpcXG4gICAgICAgICAgICBpZiBmIG5vdCBpbiBzZWxmLnZlcnRpY2VzOlxcbiAgICAgICAgICAgICAgICBudiA9IHNlbGYuYWRkVmVydGV4KGYpXFxuICAgICAgICAgICAgaWYgdCBub3QgaW4gc2VsZi52ZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFkZFZlcnRleCh0KVxcbiAgICAgICAgICAgIHNlbGYudmVydGljZXNbZl0uYWRkTmVpZ2hib3Ioc2VsZi52ZXJ0aWNlc1t0XSxjb3N0KVxcbiAgICBcXG4gICAgZGVmIGdldFZlcnRpY2VzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi52ZXJ0aWNlcy5rZXlzKCkpXFxuICAgICAgICBcXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi52ZXJ0aWNlcy52YWx1ZXMoKSlcXG4gICAgICAgICAgICAgICAgXFxuY2xhc3MgVmVydGV4OlxcbiAgICBkZWYgX19pbml0X18oc2VsZixudW0pOlxcbiAgICAgICAgc2VsZi5pZCA9IG51bVxcbiAgICAgICAgc2VsZi5jb25uZWN0ZWRUbyA9IHt9XFxuICAgICAgICBzZWxmLmNvbG9yID0gJ3doaXRlJ1xcbiAgICAgICAgc2VsZi5kaXN0ID0gc3lzLm1heHNpemVcXG4gICAgICAgIHNlbGYucHJlZCA9IE5vbmVcXG4gICAgICAgIHNlbGYuZGlzYyA9IDBcXG4gICAgICAgIHNlbGYuZmluID0gMFxcblxcbiAgICAjIGRlZiBfX2x0X18oc2VsZixvKTpcXG4gICAgIyAgICAgcmV0dXJuIHNlbGYuaWQgPCBvLmlkXFxuICAgIFxcbiAgICBkZWYgYWRkTmVpZ2hib3Ioc2VsZixuYnIsd2VpZ2h0PTApOlxcbiAgICAgICAgc2VsZi5jb25uZWN0ZWRUb1tuYnJdID0gd2VpZ2h0XFxuICAgICAgICBcXG4gICAgZGVmIHNldENvbG9yKHNlbGYsY29sb3IpOlxcbiAgICAgICAgc2VsZi5jb2xvciA9IGNvbG9yXFxuICAgICAgICBcXG4gICAgZGVmIHNldERpc3RhbmNlKHNlbGYsZCk6XFxuICAgICAgICBzZWxmLmRpc3QgPSBkXFxuXFxuICAgIGRlZiBzZXRQcmVkKHNlbGYscCk6XFxuICAgICAgICBzZWxmLnByZWQgPSBwXFxuXFxuICAgIGRlZiBzZXREaXNjb3Zlcnkoc2VsZixkdGltZSk6XFxuICAgICAgICBzZWxmLmRpc2MgPSBkdGltZVxcbiAgICAgICAgXFxuICAgIGRlZiBzZXRGaW5pc2goc2VsZixmdGltZSk6XFxuICAgICAgICBzZWxmLmZpbiA9IGZ0aW1lXFxuICAgICAgICBcXG4gICAgZGVmIGdldEZpbmlzaChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmZpblxcbiAgICAgICAgXFxuICAgIGRlZiBnZXREaXNjb3Zlcnkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5kaXNjXFxuICAgICAgICBcXG4gICAgZGVmIGdldFByZWQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wcmVkXFxuICAgICAgICBcXG4gICAgZGVmIGdldERpc3RhbmNlKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGlzdFxcbiAgICAgICAgXFxuICAgIGRlZiBnZXRDb2xvcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbG9yXFxuICAgIFxcbiAgICBkZWYgZ2V0Q29ubmVjdGlvbnMoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0ZWRUby5rZXlzKClcXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0V2VpZ2h0KHNlbGYsbmJyKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3RlZFRvW25icl1cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLmlkKSArIFxcXCI6Y29sb3IgXFxcIiArIHNlbGYuY29sb3IgKyBcXFwiOmRpc2MgXFxcIiArIHN0cihzZWxmLmRpc2MpICsgXFxcIjpmaW4gXFxcIiArIHN0cihzZWxmLmZpbikgKyBcXFwiOmRpc3QgXFxcIiArIHN0cihzZWxmLmRpc3QpICsgXFxcIjpwcmVkIFxcXFxuXFxcXHRbXFxcIiArIHN0cihzZWxmLnByZWQpKyBcXFwiXVxcXFxuXFxcIlxcbiAgICBcXG4gICAgZGVmIGdldElkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaWRcXG5cXG5jbGFzcyBhZGpHcmFwaFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKTpcXG4gICAgZGVmIHNldFVwKHNlbGYpOlxcbiAgICAgICAgc2VsZi50R3JhcGggPSBHcmFwaCgpXFxuICAgICAgICBcXG4gICAgZGVmIHRlc3RNYWtlR3JhcGgoc2VsZik6XFxuICAgICAgICBnRmlsZSA9IG9wZW4oXFxcInRlc3QuZGF0XFxcIilcXG4gICAgICAgIGZvciBsaW5lIGluIGdGaWxlOlxcbiAgICAgICAgICAgIGZWZXJ0ZXgsIHRWZXJ0ZXggPSBsaW5lLnNwbGl0KCd8JylcXG4gICAgICAgICAgICBmVmVydGV4ID0gaW50KGZWZXJ0ZXgpXFxuICAgICAgICAgICAgdFZlcnRleCA9IGludCh0VmVydGV4KVxcbiAgICAgICAgICAgIHNlbGYudEdyYXBoLmFkZEVkZ2UoZlZlcnRleCx0VmVydGV4KVxcbiAgICAgICAgZm9yIGkgaW4gc2VsZi50R3JhcGg6XFxuICAgICAgICAgICAgYWRqID0gaS5nZXRBZGooKVxcbiAgICAgICAgICAgIGZvciBrIGluIGFkajpcXG4gICAgICAgICAgICAgICAgcHJpbnQoaSwgaylcXG5cXG4gICAgICAgIFxcbmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6XFxuICAgIHVuaXR0ZXN0Lm1haW4oKVxcbiAgICAgICAgICAgICAgXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2dyYXBocy9wcmlvcml0eVF1ZXVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuIyBcXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG4jIHRoaXMgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IGhlYXAgdGFrZXMga2V5IHZhbHVlIHBhaXJzLFxcbiMgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUga2V5cyBhcmUgYWxsIGNvbXBhcmFibGVcXG5cXG5jbGFzcyBQcmlvcml0eVF1ZXVlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmhlYXBBcnJheSA9IFsoMCwwKV1cXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSAwXFxuXFxuICAgIGRlZiBidWlsZEhlYXAoc2VsZixhbGlzdCk6XFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gbGVuKGFsaXN0KVxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXkgPSBbKDAsMCldXFxuICAgICAgICBmb3IgaSBpbiBhbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmhlYXBBcnJheS5hcHBlbmQoaSlcXG4gICAgICAgIGkgPSBsZW4oYWxpc3QpIC8vIDIgICAgICAgICAgICBcXG4gICAgICAgIHdoaWxlIChpID4gMCk6XFxuICAgICAgICAgICAgc2VsZi5wZXJjRG93bihpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgcGVyY0Rvd24oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi5jdXJyZW50U2l6ZTpcXG4gICAgICAgICAgICBtYyA9IHNlbGYubWluQ2hpbGQoaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBBcnJheVtpXVswXSA+IHNlbGYuaGVhcEFycmF5W21jXVswXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwQXJyYXlbaV1cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbaV0gPSBzZWxmLmhlYXBBcnJheVttY11cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbbWNdID0gdG1wXFxuICAgICAgICAgICAgaSA9IG1jXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgbWluQ2hpbGQoc2VsZixpKTpcXG4gICAgICAgIGlmIGkqMiA+IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgcmV0dXJuIC0xXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGkqMiArIDEgPiBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSoyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5oZWFwQXJyYXlbaSoyXVswXSA8IHNlbGYuaGVhcEFycmF5W2kqMisxXVswXTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjIrMVxcblxcbiAgICBkZWYgcGVyY1VwKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2ldWzBdIDwgc2VsZi5oZWFwQXJyYXlbaS8vMl1bMF06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwQXJyYXlbaS8vMl1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBBcnJheVtpLy8yXSA9IHNlbGYuaGVhcEFycmF5W2ldXFxuICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbaV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaS8vMlxcbiBcXG4gICAgZGVmIGFkZChzZWxmLGspOlxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXkuYXBwZW5kKGspXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSArIDFcXG4gICAgICAgIHNlbGYucGVyY1VwKHNlbGYuY3VycmVudFNpemUpXFxuXFxuICAgIGRlZiBkZWxNaW4oc2VsZik6XFxuICAgICAgICByZXR2YWwgPSBzZWxmLmhlYXBBcnJheVsxXVsxXVxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXlbMV0gPSBzZWxmLmhlYXBBcnJheVtzZWxmLmN1cnJlbnRTaXplXVxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IHNlbGYuY3VycmVudFNpemUgLSAxXFxuICAgICAgICBzZWxmLmhlYXBBcnJheS5wb3AoKVxcbiAgICAgICAgc2VsZi5wZXJjRG93bigxKVxcbiAgICAgICAgcmV0dXJuIHJldHZhbFxcbiAgICAgICAgXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5jdXJyZW50U2l6ZSA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgZGVjcmVhc2VLZXkoc2VsZix2YWwsYW10KTpcXG4gICAgICAgICMgdGhpcyBpcyBhIGxpdHRsZSB3aWVyZCwgYnV0IHdlIG5lZWQgdG8gZmluZCB0aGUgaGVhcCB0aGluZyB0byBkZWNyZWFzZSBieVxcbiAgICAgICAgIyBsb29raW5nIGF0IGl0cyB2YWx1ZVxcbiAgICAgICAgZG9uZSA9IEZhbHNlXFxuICAgICAgICBpID0gMVxcbiAgICAgICAgbXlLZXkgPSAwXFxuICAgICAgICB3aGlsZSBub3QgZG9uZSBhbmQgaSA8PSBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2ldWzFdID09IHZhbDpcXG4gICAgICAgICAgICAgICAgZG9uZSA9IFRydWVcXG4gICAgICAgICAgICAgICAgbXlLZXkgPSBpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaSA9IGkgKyAxXFxuICAgICAgICBpZiBteUtleSA+IDA6XFxuICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbbXlLZXldID0gKGFtdCxzZWxmLmhlYXBBcnJheVtteUtleV1bMV0pXFxuICAgICAgICAgICAgc2VsZi5wZXJjVXAobXlLZXkpXFxuICAgICAgICAgICAgXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZix2dHgpOlxcbiAgICAgICAgZm9yIHBhaXIgaW4gc2VsZi5oZWFwQXJyYXk6XFxuICAgICAgICAgICAgaWYgcGFpclsxXSA9PSB2dHg6XFxuICAgICAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICByZXR1cm4gRmFsc2VcXG4gICAgICAgIFxcbmNsYXNzIFRlc3RCaW5IZWFwKHVuaXR0ZXN0LlRlc3RDYXNlKTpcXG4gICAgZGVmIHNldFVwKHNlbGYpOlxcbiAgICAgICAgc2VsZi50aGVIZWFwID0gUHJpb3JpdHlRdWV1ZSgpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCgyLCd4JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCgzLCd5JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg1LCd6JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg2LCdhJykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg0LCdkJykpXFxuXFxuXFxuICAgIGRlZiB0ZXN0SW5zZXJ0KHNlbGYpOlxcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5jdXJyZW50U2l6ZSA9PSA1XFxuXFxuICAgIGRlZiB0ZXN0RGVsbWluKHNlbGYpOlxcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5kZWxNaW4oKSA9PSAneCdcXG4gICAgICAgIGFzc2VydCBzZWxmLnRoZUhlYXAuZGVsTWluKCkgPT0gJ3knXFxuICAgIFxcbiAgICBkZWYgdGVzdERlY0tleShzZWxmKTpcXG4gICAgICAgIHNlbGYudGhlSGVhcC5kZWNyZWFzZUtleSgnZCcsMSlcXG4gICAgICAgIGFzc2VydCBzZWxmLnRoZUhlYXAuZGVsTWluKCkgPT0gJ2QnXFxuICAgICAgICBcXG5pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOlxcbiAgICB1bml0dGVzdC5tYWluKClcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvX19pbml0X18ucHlcIjpcIlxcbmZyb20gLmJpbmFyeVRyZWUgaW1wb3J0IEJpbmFyeVRyZWVcXG5mcm9tIC5iYWxhbmNlIGltcG9ydCBBVkxUcmVlXFxuZnJvbSAuYnN0IGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlXFxuZnJvbSAuYmluaGVhcCBpbXBvcnQgQmluSGVhcFxcblxcblxcblwiLFwic3JjL2xpYi9weXRob25kcy90cmVlcy9iYWxhbmNlLnB5XCI6XCIjIS9iaW4vZW52IHB5dGhvbjMuMVxcbiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG4jIFxcblxcbmZyb20gLmJzdCBpbXBvcnQgQmluYXJ5U2VhcmNoVHJlZSwgVHJlZU5vZGVcXG5cXG5jbGFzcyBBVkxUcmVlKEJpbmFyeVNlYXJjaFRyZWUpOlxcbiAgICAnJydcXG4gICAgQXV0aG9yOiAgQnJhZCBNaWxsZXJcXG4gICAgRGF0ZTogIDEvMTUvMjAwNVxcbiAgICBEZXNjcmlwdGlvbjogIEltbGVtZW50IGEgYmluYXJ5IHNlYXJjaCB0cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VcXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbnM6ICBcXG4gICAgICAgICAgICAgICAgICBfX2NvbnRhaW5zX18oeSkgPD09PiB5IGluIHhcXG4gICAgICAgICAgICAgICAgICBfX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV1cXG4gICAgICAgICAgICAgICAgICBfX2luaXRfXygpXFxuICAgICAgICAgICAgICAgICAgX19sZW5fXygpIDw9PT4gbGVuKHgpXFxuICAgICAgICAgICAgICAgICAgX19zZXRpdGVtX18oayx2KSA8PT0+IHhba10gPSB2XFxuICAgICAgICAgICAgICAgICAgY2xlYXIoKVxcbiAgICAgICAgICAgICAgICAgIGdldChrKVxcbiAgICAgICAgICAgICAgICAgIGhhc19rZXkoaylcXG4gICAgICAgICAgICAgICAgICBpdGVtcygpIFxcbiAgICAgICAgICAgICAgICAgIGtleXMoKSBcXG4gICAgICAgICAgICAgICAgICB2YWx1ZXMoKVxcbiAgICAgICAgICAgICAgICAgIHB1dChrLHYpXFxuICAgICcnJ1xcblxcblxcbiAgICBkZWYgX3B1dChzZWxmLGtleSx2YWwsY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudE5vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LHZhbCxjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQmFsYW5jZShjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQmFsYW5jZShjdXJyZW50Tm9kZS5yaWdodENoaWxkKSAgICAgICAgICAgICAgICBcXG5cXG4gICAgZGVmIHVwZGF0ZUJhbGFuY2Uoc2VsZixub2RlKTpcXG4gICAgICAgIGlmIG5vZGUuYmFsYW5jZUZhY3RvciA+IDEgb3Igbm9kZS5iYWxhbmNlRmFjdG9yIDwgLTE6XFxuICAgICAgICAgICAgc2VsZi5yZWJhbGFuY2Uobm9kZSlcXG4gICAgICAgICAgICByZXR1cm5cXG4gICAgICAgIGlmIG5vZGUucGFyZW50ICE9IE5vbmU6XFxuICAgICAgICAgICAgaWYgbm9kZS5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlRmFjdG9yICs9IDFcXG4gICAgICAgICAgICBlbGlmIG5vZGUuaXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LmJhbGFuY2VGYWN0b3IgLT0gMVxcblxcbiAgICAgICAgICAgIGlmIG5vZGUucGFyZW50LmJhbGFuY2VGYWN0b3IgIT0gMDpcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVCYWxhbmNlKG5vZGUucGFyZW50KVxcblxcbiAgICBkZWYgcmViYWxhbmNlKHNlbGYsbm9kZSk6XFxuICAgICAgICBpZiBub2RlLmJhbGFuY2VGYWN0b3IgPCAwOlxcbiAgICAgICAgICAgIGlmIG5vZGUucmlnaHRDaGlsZC5iYWxhbmNlRmFjdG9yID4gMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBMUiBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZVJpZ2h0KG5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVMZWZ0KG5vZGUpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgIyBzaW5nbGUgbGVmdFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUxlZnQobm9kZSlcXG4gICAgICAgIGVsaWYgbm9kZS5iYWxhbmNlRmFjdG9yID4gMDpcXG4gICAgICAgICAgICBpZiBub2RlLmxlZnRDaGlsZC5iYWxhbmNlRmFjdG9yIDwgMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBSTCBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUxlZnQobm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlUmlnaHQobm9kZSlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAjIHNpbmdsZSByaWdodFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZVJpZ2h0KG5vZGUpXFxuXFxuICAgIGRlZiByb3RhdGVMZWZ0KHNlbGYscm90Um9vdCk6XFxuICAgICAgICBuZXdSb290ID0gcm90Um9vdC5yaWdodENoaWxkXFxuICAgICAgICByb3RSb290LnJpZ2h0Q2hpbGQgPSBuZXdSb290LmxlZnRDaGlsZFxcbiAgICAgICAgaWYgbmV3Um9vdC5sZWZ0Q2hpbGQgIT0gTm9uZTpcXG4gICAgICAgICAgICBuZXdSb290LmxlZnRDaGlsZC5wYXJlbnQgPSByb3RSb290XFxuICAgICAgICBuZXdSb290LnBhcmVudCA9IHJvdFJvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RSb290LmlzUm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IG5ld1Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90Um9vdC5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5sZWZ0Q2hpbGQgPSBuZXdSb290XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90Um9vdC5wYXJlbnQucmlnaHRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgIG5ld1Jvb3QubGVmdENoaWxkID0gcm90Um9vdFxcbiAgICAgICAgcm90Um9vdC5wYXJlbnQgPSBuZXdSb290XFxuICAgICAgICByb3RSb290LmJhbGFuY2VGYWN0b3IgPSByb3RSb290LmJhbGFuY2VGYWN0b3IgKyAxIC0gbWluKG5ld1Jvb3QuYmFsYW5jZUZhY3RvciwgMClcXG4gICAgICAgIG5ld1Jvb3QuYmFsYW5jZUZhY3RvciA9IG5ld1Jvb3QuYmFsYW5jZUZhY3RvciArIDEgKyBtYXgocm90Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcblxcblxcbiAgICBkZWYgcm90YXRlUmlnaHQoc2VsZixyb3RSb290KTpcXG4gICAgICAgIG5ld1Jvb3QgPSByb3RSb290LmxlZnRDaGlsZFxcbiAgICAgICAgcm90Um9vdC5sZWZ0Q2hpbGQgPSBuZXdSb290LnJpZ2h0Q2hpbGRcXG4gICAgICAgIGlmIG5ld1Jvb3QucmlnaHRDaGlsZCAhPSBOb25lOlxcbiAgICAgICAgICAgIG5ld1Jvb3QucmlnaHRDaGlsZC5wYXJlbnQgPSByb3RSb290XFxuICAgICAgICBuZXdSb290LnBhcmVudCA9IHJvdFJvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RSb290LmlzUm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IG5ld1Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90Um9vdC5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgcm90Um9vdC5wYXJlbnQucmlnaHRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5sZWZ0Q2hpbGQgPSBuZXdSb290XFxuICAgICAgICBuZXdSb290LnJpZ2h0Q2hpbGQgPSByb3RSb290XFxuICAgICAgICByb3RSb290LnBhcmVudCA9IG5ld1Jvb3RcXG4gICAgICAgIHJvdFJvb3QuYmFsYW5jZUZhY3RvciA9IHJvdFJvb3QuYmFsYW5jZUZhY3RvciAtIDEgLSBtYXgobmV3Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcbiAgICAgICAgbmV3Um9vdC5iYWxhbmNlRmFjdG9yID0gbmV3Um9vdC5iYWxhbmNlRmFjdG9yIC0gMSArIG1pbihyb3RSb290LmJhbGFuY2VGYWN0b3IsIDApXFxuICAgICAgICBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvYmluYXJ5VHJlZS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNVxcbiMgXFxuXFxuY2xhc3MgQmluYXJ5VHJlZTpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIEEgcmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIEJpbmFyeSBUcmVlXFxuICAgIFVzaW5nIGxpbmtzIGFuZCBOb2RlcyBhcHByb2FjaC5cXG4gICAgXFxcIlxcXCJcXFwiICAgIFxcbiAgICBkZWYgX19pbml0X18oc2VsZixyb290T2JqKTpcXG4gICAgICAgIHNlbGYua2V5ID0gcm9vdE9ialxcbiAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBOb25lXFxuICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQgPSBOb25lXFxuXFxuICAgIGRlZiBpbnNlcnRMZWZ0KHNlbGYsbmV3Tm9kZSk6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZCA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICB0ID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgICAgIHQubGVmdCA9IHNlbGYubGVmdENoaWxkXFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSB0XFxuICAgIFxcbiAgICBkZWYgaW5zZXJ0UmlnaHQoc2VsZixuZXdOb2RlKTpcXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZCA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZCA9IEJpbmFyeVRyZWUobmV3Tm9kZSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgdCA9IEJpbmFyeVRyZWUobmV3Tm9kZSlcXG4gICAgICAgICAgICB0LnJpZ2h0ID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkID0gdFxcblxcbiAgICBkZWYgaXNMZWFmKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuICgobm90IHNlbGYubGVmdENoaWxkKSBhbmQgKG5vdCBzZWxmLnJpZ2h0Q2hpbGQpKVxcblxcbiAgICBkZWYgZ2V0UmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGRcXG5cXG4gICAgZGVmIGdldExlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmxlZnRDaGlsZFxcblxcbiAgICBkZWYgc2V0Um9vdFZhbChzZWxmLG9iaik6XFxuICAgICAgICBzZWxmLmtleSA9IG9ialxcblxcbiAgICBkZWYgZ2V0Um9vdFZhbChzZWxmLCk6XFxuICAgICAgICByZXR1cm4gc2VsZi5rZXlcXG5cXG4gICAgZGVmIGlub3JkZXIoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5pbm9yZGVyKClcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5pbm9yZGVyKClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnBvc3RvcmRlcigpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnBvc3RvcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLmtleSlcXG5cXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgcHJpbnQoc2VsZi5rZXkpXFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5wcmVvcmRlcigpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnByZW9yZGVyKClcXG5cXG4gICAgZGVmIHByaW50ZXhwKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgcHJpbnQoJygnKVxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnByaW50ZXhwKClcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wcmludGV4cCgpXFxuICAgICAgICAgICAgcHJpbnQoJyknKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyZXZhbChzZWxmKTpcXG4gICAgICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICAgICAgcmVzMSA9IE5vbmVcXG4gICAgICAgIHJlczIgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICByZXMxID0gc2VsZi5sZWZ0Q2hpbGQucG9zdG9yZGVyZXZhbCgpICAjLy8gXFxcXGxhYmVse3BlbGVmdH1cXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICByZXMyID0gc2VsZi5yaWdodENoaWxkLnBvc3RvcmRlcmV2YWwoKSAjLy8gXFxcXGxhYmVse3BlcmlnaHR9XFxuICAgICAgICBpZiByZXMxIGFuZCByZXMyOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyc1tzZWxmLmtleV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYua2V5XFxuXFxuZGVmIGlub3JkZXIodHJlZSk6XFxuICAgIGlmIHRyZWUgIT0gTm9uZTpcXG4gICAgICAgIGlub3JkZXIodHJlZS5nZXRMZWZ0Q2hpbGQoKSlcXG4gICAgICAgIHByaW50KHRyZWUuZ2V0Um9vdFZhbCgpKVxcbiAgICAgICAgaW5vcmRlcih0cmVlLmdldFJpZ2h0Q2hpbGQoKSlcXG5cXG5kZWYgcHJpbnRleHAodHJlZSk6XFxuICAgIGlmIHRyZWUubGVmdENoaWxkOlxcbiAgICAgICAgcHJpbnQoJygnKVxcbiAgICAgICAgcHJpbnRleHAodHJlZS5nZXRMZWZ0Q2hpbGQoKSlcXG4gICAgcHJpbnQodHJlZS5nZXRSb290VmFsKCkpXFxuICAgIGlmIHRyZWUucmlnaHRDaGlsZDpcXG4gICAgICAgIHByaW50ZXhwKHRyZWUuZ2V0UmlnaHRDaGlsZCgpKVxcbiAgICAgICAgcHJpbnQoJyknKSBcXG5cXG5kZWYgcHJpbnRleHAodHJlZSk6XFxuICAgIHNWYWwgPSBcXFwiXFxcIlxcbiAgICBpZiB0cmVlOlxcbiAgICAgICAgc1ZhbCA9ICcoJyArIHByaW50ZXhwKHRyZWUuZ2V0TGVmdENoaWxkKCkpXFxuICAgICAgICBzVmFsID0gc1ZhbCArIHN0cih0cmVlLmdldFJvb3RWYWwoKSlcXG4gICAgICAgIHNWYWwgPSBzVmFsICsgcHJpbnRleHAodHJlZS5nZXRSaWdodENoaWxkKCkpICsgJyknXFxuICAgIHJldHVybiBzVmFsXFxuXFxuZGVmIHBvc3RvcmRlcmV2YWwodHJlZSk6XFxuICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICByZXMxID0gTm9uZVxcbiAgICByZXMyID0gTm9uZVxcbiAgICBpZiB0cmVlOlxcbiAgICAgICAgcmVzMSA9IHBvc3RvcmRlcmV2YWwodHJlZS5nZXRMZWZ0Q2hpbGQoKSkgICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgcmVzMiA9IHBvc3RvcmRlcmV2YWwodHJlZS5nZXRSaWdodENoaWxkKCkpICMvLyBcXFxcbGFiZWx7cGVyaWdodH1cXG4gICAgICAgIGlmIHJlczEgYW5kIHJlczI6XFxuICAgICAgICAgICAgcmV0dXJuIG9wZXJzW3RyZWUuZ2V0Um9vdFZhbCgpXShyZXMxLHJlczIpICMvLyBcXFxcbGFiZWx7cGVldmFsfVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gdHJlZS5nZXRSb290VmFsKClcXG5cXG5kZWYgaGVpZ2h0KHRyZWUpOlxcbiAgICBpZiB0cmVlID09IE5vbmU6XFxuICAgICAgICByZXR1cm4gLTFcXG4gICAgZWxzZTpcXG4gICAgICAgIHJldHVybiAxICsgbWF4KGhlaWdodCh0cmVlLmxlZnRDaGlsZCksaGVpZ2h0KHRyZWUucmlnaHRDaGlsZCkpXFxuXFxuIyB0ID0gQmluYXJ5VHJlZSg3KVxcbiMgdC5pbnNlcnRMZWZ0KDMpXFxuIyB0Lmluc2VydFJpZ2h0KDkpXFxuIyBpbm9yZGVyKHQpXFxuIyBpbXBvcnQgb3BlcmF0b3JcXG4jIHggPSBCaW5hcnlUcmVlKCcqJylcXG4jIHguaW5zZXJ0TGVmdCgnKycpXFxuIyBsID0geC5nZXRMZWZ0Q2hpbGQoKVxcbiMgbC5pbnNlcnRMZWZ0KDQpXFxuIyBsLmluc2VydFJpZ2h0KDUpXFxuIyB4Lmluc2VydFJpZ2h0KDcpXFxuIyBwcmludChwcmludGV4cCh4KSlcXG4jIHByaW50KHBvc3RvcmRlcmV2YWwoeCkpXFxuIyBwcmludChoZWlnaHQoeCkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JpbmhlYXAucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jIFxcblxcbiMgdGhpcyBoZWFwIHRha2VzIGtleSB2YWx1ZSBwYWlycywgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUga2V5cyBhcmUgaW50ZWdlcnNcXG5jbGFzcyBCaW5IZWFwOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmhlYXBMaXN0ID0gWzBdXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gMFxcblxcblxcbiAgICBkZWYgYnVpbGRIZWFwKHNlbGYsYWxpc3QpOlxcbiAgICAgICAgaSA9IGxlbihhbGlzdCkgLy8gMlxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IGxlbihhbGlzdClcXG4gICAgICAgIHNlbGYuaGVhcExpc3QgPSBbMF0gKyBhbGlzdFs6XVxcbiAgICAgICAgcHJpbnQobGVuKHNlbGYuaGVhcExpc3QpLCBpKVxcbiAgICAgICAgd2hpbGUgKGkgPiAwKTpcXG4gICAgICAgICAgICBwcmludChzZWxmLmhlYXBMaXN0LCBpKVxcbiAgICAgICAgICAgIHNlbGYucGVyY0Rvd24oaSlcXG4gICAgICAgICAgICBpID0gaSAtIDFcXG4gICAgICAgIHByaW50KHNlbGYuaGVhcExpc3QsaSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgZGVmIHBlcmNEb3duKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSAoaSAqIDIpIDw9IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgbWMgPSBzZWxmLm1pbkNoaWxkKGkpXFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwTGlzdFtpXSA+IHNlbGYuaGVhcExpc3RbbWNdOlxcbiAgICAgICAgICAgICAgICB0bXAgPSBzZWxmLmhlYXBMaXN0W2ldXFxuICAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbaV0gPSBzZWxmLmhlYXBMaXN0W21jXVxcbiAgICAgICAgICAgICAgICBzZWxmLmhlYXBMaXN0W21jXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBtY1xcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIG1pbkNoaWxkKHNlbGYsaSk6XFxuICAgICAgICBpZiBpICogMiArIDEgPiBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIHJldHVybiBpICogMlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBMaXN0W2kgKiAyXSA8IHNlbGYuaGVhcExpc3RbaSAqIDIgKyAxXTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKiAyICsgMVxcblxcbiAgICBkZWYgcGVyY1VwKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcExpc3RbaV0gPCBzZWxmLmhlYXBMaXN0W2kvLzJdOlxcbiAgICAgICAgICAgICAgIHRtcCA9IHNlbGYuaGVhcExpc3RbaSAvLyAyXVxcbiAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbaSAvLyAyXSA9IHNlbGYuaGVhcExpc3RbaV1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBMaXN0W2ldID0gdG1wXFxuICAgICAgICAgICAgaSA9IGkgLy8gMlxcbiBcXG4gICAgZGVmIGluc2VydChzZWxmLGspOlxcbiAgICAgICAgc2VsZi5oZWFwTGlzdC5hcHBlbmQoaylcXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBzZWxmLmN1cnJlbnRTaXplICsgMVxcbiAgICAgICAgc2VsZi5wZXJjVXAoc2VsZi5jdXJyZW50U2l6ZSlcXG5cXG4gICAgZGVmIGRlbE1pbihzZWxmKTpcXG4gICAgICAgIHJldHZhbCA9IHNlbGYuaGVhcExpc3RbMV1cXG4gICAgICAgIHNlbGYuaGVhcExpc3RbMV0gPSBzZWxmLmhlYXBMaXN0W3NlbGYuY3VycmVudFNpemVdXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSAtIDFcXG4gICAgICAgIHNlbGYuaGVhcExpc3QucG9wKClcXG4gICAgICAgIHNlbGYucGVyY0Rvd24oMSlcXG4gICAgICAgIHJldHVybiByZXR2YWxcXG4gICAgICAgIFxcbiAgICBkZWYgaXNFbXB0eShzZWxmKTpcXG4gICAgICAgIGlmIGN1cnJlbnRTaXplID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JzdC5weVwiOlwiIyEvYmluL2VudiBweXRob24zLjFcXG4jIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1LCAyMDEwXFxuIyBcXG5cXG5jbGFzcyBCaW5hcnlTZWFyY2hUcmVlOlxcbiAgICAnJydcXG4gICAgQXV0aG9yOiAgQnJhZCBNaWxsZXJcXG4gICAgRGF0ZTogIDEvMTUvMjAwNVxcbiAgICBEZXNjcmlwdGlvbjogIEltbGVtZW50IGEgYmluYXJ5IHNlYXJjaCB0cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VcXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbnM6ICBcXG4gICAgICAgICAgICAgICAgICBfX2NvbnRhaW5zX18oeSkgPD09PiB5IGluIHhcXG4gICAgICAgICAgICAgICAgICBfX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV1cXG4gICAgICAgICAgICAgICAgICBfX2luaXRfXygpXFxuICAgICAgICAgICAgICAgICAgX19sZW5fXygpIDw9PT4gbGVuKHgpXFxuICAgICAgICAgICAgICAgICAgX19zZXRpdGVtX18oayx2KSA8PT0+IHhba10gPSB2XFxuICAgICAgICAgICAgICAgICAgY2xlYXIoKVxcbiAgICAgICAgICAgICAgICAgIGdldChrKVxcbiAgICAgICAgICAgICAgICAgIGl0ZW1zKCkgXFxuICAgICAgICAgICAgICAgICAga2V5cygpIFxcbiAgICAgICAgICAgICAgICAgIHZhbHVlcygpXFxuICAgICAgICAgICAgICAgICAgcHV0KGssdilcXG4gICAgICAgICAgICAgICAgICBpblxcbiAgICAgICAgICAgICAgICAgIGRlbCA8PT0+IFxcbiAgICAnJydcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5yb290ID0gTm9uZVxcbiAgICAgICAgc2VsZi5zaXplID0gMFxcbiAgICBcXG4gICAgZGVmIHB1dChzZWxmLGtleSx2YWwpOlxcbiAgICAgICAgaWYgc2VsZi5yb290OlxcbiAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLHNlbGYucm9vdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5yb290ID0gVHJlZU5vZGUoa2V5LHZhbClcXG4gICAgICAgIHNlbGYuc2l6ZSA9IHNlbGYuc2l6ZSArIDFcXG5cXG4gICAgZGVmIF9wdXQoc2VsZixrZXksdmFsLGN1cnJlbnROb2RlKTpcXG4gICAgICAgIGlmIGtleSA8IGN1cnJlbnROb2RlLmtleTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZCA9IFRyZWVOb2RlKGtleSx2YWwscGFyZW50PWN1cnJlbnROb2RlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZCA9IFRyZWVOb2RlKGtleSx2YWwscGFyZW50PWN1cnJlbnROb2RlKVxcbiAgICAgICAgICAgIFxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZixrLHYpOlxcbiAgICAgICAgc2VsZi5wdXQoayx2KVxcblxcbiAgICBkZWYgZ2V0KHNlbGYsa2V5KTpcXG4gICAgICAgIGlmIHNlbGYucm9vdDpcXG4gICAgICAgICAgICByZXMgPSBzZWxmLl9nZXQoa2V5LHNlbGYucm9vdClcXG4gICAgICAgICAgICBpZiByZXM6XFxuICAgICAgICAgICAgICAgIHJldHVybiByZXMucGF5bG9hZFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBcXG4gICAgZGVmIF9nZXQoc2VsZixrZXksY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYgbm90IGN1cnJlbnROb2RlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbGlmIGN1cnJlbnROb2RlLmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlXFxuICAgICAgICBlbGlmIGtleSA8IGN1cnJlbnROb2RlLmtleTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KGtleSxjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgXFxuICAgICAgICBcXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsa2V5KTpcXG4gICAgICAgIHJlcyA9IHNlbGYuZ2V0KGtleSlcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICByZXR1cm4gcmVzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG4gICAgICAgICAgICBcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGtleSk6XFxuICAgICAgICBpZiBzZWxmLl9nZXQoa2V5LHNlbGYucm9vdCk6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuICAgICAgICBcXG4gICAgZGVmIGxlbmd0aChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnNpemVcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5zaXplXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJvb3QuX19pdGVyX18oKVxcbiAgICBcXG4gICAgZGVmIGRlbGV0ZShzZWxmLGtleSk6XFxuICAgICAgICBpZiBzZWxmLnNpemUgPiAxOlxcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZSA9IHNlbGYuX2dldChrZXksc2VsZi5yb290KVxcbiAgICAgICAgICAgIGlmIG5vZGVUb1JlbW92ZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5yZW1vdmUobm9kZVRvUmVtb3ZlKVxcbiAgICAgICAgICAgICAgICBzZWxmLnNpemUgPSBzZWxmLnNpemUtMVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG4gICAgICAgIGVsaWYgc2VsZi5zaXplID09IDEgYW5kIHNlbGYucm9vdC5rZXkgPT0ga2V5OlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IE5vbmVcXG4gICAgICAgICAgICBzZWxmLnNpemUgPSBzZWxmLnNpemUgLSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG5cXG4gICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsa2V5KTpcXG4gICAgICAgIHNlbGYuZGVsZXRlKGtleSlcXG4gICAgXFxuICAgIGRlZiByZW1vdmUoc2VsZixjdXJyZW50Tm9kZSk6XFxuICAgICAgICBpZiBjdXJyZW50Tm9kZS5pc0xlYWYoKTogI2xlYWZcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZSA9PSBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5yaWdodENoaWxkID0gTm9uZVxcbiAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5oYXNCb3RoQ2hpbGRyZW4oKTogI2ludGVyaW9yXFxuICAgICAgICAgICAgc3VjYyA9IGN1cnJlbnROb2RlLmZpbmRTdWNjZXNzb3IoKVxcbiAgICAgICAgICAgIHN1Y2Muc3BsaWNlT3V0KClcXG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5rZXkgPSBzdWNjLmtleVxcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnBheWxvYWQgPSBzdWNjLnBheWxvYWRcXG4gICAgICAgIGVsc2U6ICMgdGhpcyBub2RlIGhhcyBvbmUgY2hpbGRcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5sZWZ0Q2hpbGQgPSBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5yaWdodENoaWxkID0gY3VycmVudE5vZGUubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yZXBsYWNlTm9kZURhdGEoY3VycmVudE5vZGUubGVmdENoaWxkLmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQucGF5bG9hZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQubGVmdENoaWxkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5yaWdodENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnBhcmVudCA9IGN1cnJlbnROb2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LmxlZnRDaGlsZCA9IGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQucGFyZW50ID0gY3VycmVudE5vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQucmlnaHRDaGlsZCA9IGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJlcGxhY2VOb2RlRGF0YShjdXJyZW50Tm9kZS5yaWdodENoaWxkLmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnBheWxvYWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5sZWZ0Q2hpbGQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5yaWdodENoaWxkKVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIHNlbGYuX2lub3JkZXIoc2VsZi5yb290KVxcblxcbiAgICBkZWYgX2lub3JkZXIoc2VsZix0cmVlKTpcXG4gICAgICAgIGlmIHRyZWUgIT0gTm9uZTpcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVyKHRyZWUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5KVxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5yaWdodENoaWxkKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHNlbGYucm9vdClcXG5cXG4gICAgZGVmIF9wb3N0b3JkZXIoc2VsZiwgdHJlZSk6XFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlcih0cmVlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5KSAgICAgICAgICAgIFxcblxcbiAgICBkZWYgcHJlb3JkZXIoc2VsZik6XFxuICAgICAgICBzZWxmLl9wcmVvcmRlcihzZWxmLHNlbGYucm9vdClcXG5cXG4gICAgZGVmIF9wcmVvcmRlcihzZWxmLHRyZWUpOlxcbiAgICAgICAgaWYgdHJlZTpcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSkgICAgICAgICAgICBcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLmxlZnRDaGlsZClcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLnJpZ2h0Q2hpbGQpXFxuXFxuICAgICAgICAgICAgICAgIFxcbmNsYXNzIFRyZWVOb2RlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZixrZXksdmFsLGxlZnQ9Tm9uZSxyaWdodD1Ob25lLHBhcmVudD1Ob25lKTpcXG4gICAgICAgIHNlbGYua2V5ID0ga2V5XFxuICAgICAgICBzZWxmLnBheWxvYWQgPSB2YWxcXG4gICAgICAgIHNlbGYubGVmdENoaWxkID0gbGVmdFxcbiAgICAgICAgc2VsZi5yaWdodENoaWxkID0gcmlnaHRcXG4gICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50XFxuICAgICAgICBzZWxmLmJhbGFuY2VGYWN0b3IgPSAwXFxuICAgICAgICBcXG4gICAgZGVmIGhhc0xlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmxlZnRDaGlsZFxcblxcbiAgICBkZWYgaGFzUmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGRcXG4gICAgXFxuICAgIGRlZiBpc0xlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhcmVudCBhbmQgc2VsZi5wYXJlbnQubGVmdENoaWxkID09IHNlbGZcXG5cXG4gICAgZGVmIGlzUmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhcmVudCBhbmQgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9PSBzZWxmXFxuXFxuICAgIGRlZiBpc1Jvb3Qoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IHNlbGYucGFyZW50XFxuXFxuICAgIGRlZiBpc0xlYWYoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IChzZWxmLnJpZ2h0Q2hpbGQgb3Igc2VsZi5sZWZ0Q2hpbGQpXFxuXFxuICAgIGRlZiBoYXNBbnlDaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGQgb3Igc2VsZi5sZWZ0Q2hpbGRcXG5cXG4gICAgZGVmIGhhc0JvdGhDaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGQgYW5kIHNlbGYubGVmdENoaWxkXFxuICAgIFxcbiAgICBkZWYgcmVwbGFjZU5vZGVEYXRhKHNlbGYsa2V5LHZhbHVlLGxjLHJjKTpcXG4gICAgICAgIHNlbGYua2V5ID0ga2V5XFxuICAgICAgICBzZWxmLnBheWxvYWQgPSB2YWx1ZVxcbiAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBsY1xcbiAgICAgICAgc2VsZi5yaWdodENoaWxkID0gcmNcXG4gICAgICAgIGlmIHNlbGYuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQucGFyZW50ID0gc2VsZlxcbiAgICAgICAgaWYgc2VsZi5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnBhcmVudCA9IHNlbGZcXG4gICAgICAgIFxcbiAgICBkZWYgZmluZFN1Y2Nlc3NvcihzZWxmKTpcXG4gICAgICAgIHN1Y2MgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICBzdWNjID0gc2VsZi5yaWdodENoaWxkLmZpbmRNaW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLnBhcmVudDpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc3VjYyA9IHNlbGYucGFyZW50XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgICAgICAgICAgc3VjYyA9IHNlbGYucGFyZW50LmZpbmRTdWNjZXNzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IHNlbGZcXG4gICAgICAgIHJldHVybiBzdWNjXFxuXFxuXFxuICAgIGRlZiBzcGxpY2VPdXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmlzTGVhZigpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQubGVmdENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJpZ2h0Q2hpbGQgPSBOb25lXFxuICAgICAgICBlbGlmIHNlbGYuaGFzQW55Q2hpbGRyZW4oKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5sZWZ0Q2hpbGQgPSBzZWxmLmxlZnRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IHNlbGYubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnBhcmVudCA9IHNlbGYucGFyZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQubGVmdENoaWxkID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wYXJlbnQgPSBzZWxmLnBhcmVudFxcblxcbiAgICBkZWYgZmluZE1pbihzZWxmKTpcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmXFxuICAgICAgICB3aGlsZSBjdXJyZW50Lmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmxlZnRDaGlsZFxcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVGhlIHN0YW5kYXJkIGlub3JkZXIgdHJhdmVyc2FsIG9mIGEgYmluYXJ5IHRyZWUuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcbiAgICAgICAgICAgIHlpZWxkIHNlbGYua2V5XFxuICAgICAgICAgICAgaWYgc2VsZi5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1cXG5cXG4gICAgICAgICAgICBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5cXG5mcm9tIHB5dGhvbmRzMy5iYXNpYyBpbXBvcnQgU3RhY2ssIFF1ZXVlLCBEZXF1ZVxcbmZyb20gcHl0aG9uZHMzLmdyYXBocyBpbXBvcnQgR3JhcGgsIFZlcnRleFxcbmZyb20gcHl0aG9uZHMzLnNlYXJjaGluZyBpbXBvcnQgSGFzaFRhYmxlXFxuZnJvbSBweXRob25kczMudHJlZXMgaW1wb3J0IChcXG4gICAgQmluYXJ5VHJlZSxcXG4gICAgQVZMVHJlZSxcXG4gICAgQmluYXJ5U2VhcmNoVHJlZSxcXG4gICAgQmluYXJ5SGVhcCxcXG4gICAgUHJpb3JpdHlRdWV1ZSxcXG4pXFxuXFxuX19hbGxfXyA9IFtcXG4gICAgXFxcIlN0YWNrXFxcIixcXG4gICAgXFxcIlF1ZXVlXFxcIixcXG4gICAgXFxcIkRlcXVlXFxcIixcXG4gICAgXFxcIkdyYXBoXFxcIixcXG4gICAgXFxcIlZlcnRleFxcXCIsXFxuICAgIFxcXCJIYXNoVGFibGVcXFwiLFxcbiAgICBcXFwiQmluYXJ5VHJlZVxcXCIsXFxuICAgIFxcXCJBVkxUcmVlXFxcIixcXG4gICAgXFxcIkJpbmFyeVNlYXJjaFRyZWVcXFwiLFxcbiAgICBcXFwiQmluYXJ5SGVhcFxcXCIsXFxuICAgIFxcXCJCaW5hcnlUcmVlXFxcIixcXG4gICAgXFxcIlByaW9yaXR5UXVldWVcXFwiLFxcbl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLmJhc2ljIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5zdGFjayBpbXBvcnQgU3RhY2tcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5xdWV1ZSBpbXBvcnQgUXVldWVcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5kZXF1ZSBpbXBvcnQgRGVxdWVcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5saW5rZWRfbGlzdCBpbXBvcnQgT3JkZXJlZExpc3RcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5saW5rZWRfbGlzdCBpbXBvcnQgVW5vcmRlcmVkTGlzdFxcblxcbl9fYWxsX18gPSBbXFxcIlN0YWNrXFxcIiwgXFxcIlF1ZXVlXFxcIiwgXFxcIkRlcXVlXFxcIiwgXFxcIk9yZGVyZWRMaXN0XFxcIiwgXFxcIlVub3JkZXJlZExpc3RcXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvZGVxdWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgRGVxdWU6XFxuICAgIFxcXCJcXFwiXFxcIlF1ZXVlIGltcGxlbWVudGF0aW9uIGFzIGEgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBkZXF1ZSBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX2l0ZW1zKVxcblxcbiAgICBkZWYgYWRkX2Zyb250KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIGZyb250IG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBhZGRfcmVhcihzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSByZWFyIG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiByZW1vdmVfZnJvbnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBmcm9udCBvZiB0aGUgZGVxdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlX3JlYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSByZWFyIG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgwKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL2xpbmtlZF9saXN0LnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIExpbmtlZExpc3ROb2RlOlxcbiAgICBcXFwiXFxcIlxcXCJBIG5vZGUgb2YgYSBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZV9kYXRhKTpcXG4gICAgICAgIHNlbGYuX2RhdGEgPSBub2RlX2RhdGFcXG4gICAgICAgIHNlbGYuX25leHQgPSBOb25lXFxuXFxuICAgIGRlZiBnZXRfZGF0YShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBub2RlIGRhdGFcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kYXRhXFxuXFxuICAgIGRlZiBzZXRfZGF0YShzZWxmLCBub2RlX2RhdGEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5vZGUgZGF0YVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fZGF0YSA9IG5vZGVfZGF0YVxcblxcbiAgICBkYXRhID0gcHJvcGVydHkoZ2V0X2RhdGEsIHNldF9kYXRhKVxcblxcbiAgICBkZWYgZ2V0X25leHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbmV4dCBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbmV4dFxcblxcbiAgICBkZWYgc2V0X25leHQoc2VsZiwgbm9kZV9uZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBuZXh0IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX25leHQgPSBub2RlX25leHRcXG5cXG4gICAgbmV4dCA9IHByb3BlcnR5KGdldF9uZXh0LCBzZXRfbmV4dClcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTdHJpbmdcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzdHIoc2VsZi5fZGF0YSlcXG5cXG5cXG5jbGFzcyBMaW5rZWRMaXN0OlxcbiAgICBcXFwiXFxcIlxcXCJMaW5rZWQgTGlzdCBjbGFzcyBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhZCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX2NvdW50ID0gMFxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJcyB0aGUgbGlzdCBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hlYWQgaXMgTm9uZVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgdGhlIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb3VudFxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgdGhlIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb3VudFxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkxpc3QgYXMgYSBzdHJpbmdcXFwiXFxcIlxcXCJcXG4gICAgICAgIGxpc3Rfc3RyID0gXFxcIltcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZi5faGVhZFxcblxcbiAgICAgICAgd2hpbGUgY3VycmVudDpcXG4gICAgICAgICAgICBsaXN0X3N0ciArPSBzdHIoY3VycmVudClcXG4gICAgICAgICAgICBpZiBjdXJyZW50Lm5leHQ6XFxuICAgICAgICAgICAgICAgIGxpc3Rfc3RyICs9IFxcXCIsIFxcXCJcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XFxuICAgICAgICBsaXN0X3N0ciArPSBcXFwiXVxcXCJcXG4gICAgICAgIHJldHVybiBsaXN0X3N0clxcblxcbiAgICBkZWYgYWRkKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhc3NcXG5cXG4gICAgZGVmIHNlYXJjaChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZWFyY2ggZm9yIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhc3NcXG5cXG5cXG5jbGFzcyBVbm9yZGVyZWRMaXN0KExpbmtlZExpc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJVbm9yZGVyZWQgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGFuIHVub3JkZXJlZCBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgTGlua2VkTGlzdC5fX2luaXRfXyhzZWxmKVxcblxcbiAgICBkZWYgYWRkKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBuZXdfbm9kZSA9IExpbmtlZExpc3ROb2RlKHZhbHVlKVxcbiAgICAgICAgbmV3X25vZGUuc2V0X25leHQoc2VsZi5faGVhZClcXG4gICAgICAgIHNlbGYuX2hlYWQgPSBuZXdfbm9kZVxcbiAgICAgICAgc2VsZi5fY291bnQgPSBzZWxmLl9jb3VudCArIDFcXG5cXG4gICAgZGVmIHJlbW92ZShzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG4gICAgICAgIHByZXYgPSBOb25lXFxuXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnQuZGF0YSA9PSB2YWx1ZTpcXG4gICAgICAgICAgICAgICAgaWYgcHJldiBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGVhZCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gY3VycmVudC5uZXh0XFxuICAgICAgICAgICAgICAgIHNlbGYuX2NvdW50ID0gc2VsZi5fY291bnQgLSAxXFxuICAgICAgICAgICAgICAgIHJldHVyblxcbiAgICAgICAgICAgIHByZXYgPSBjdXJyZW50XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwie30gaXMgbm90IGluIHRoZSBsaXN0XFxcIi5mb3JtYXQodmFsdWUpKVxcblxcbiAgICBkZWYgc2VhcmNoKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNlYXJjaCBmb3IgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQ6XFxuICAgICAgICAgICAgaWYgY3VycmVudC5kYXRhID09IHZhbHVlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcXG4gICAgICAgIHJldHVybiBGYWxzZVxcblxcblxcbmNsYXNzIE9yZGVyZWRMaXN0KExpbmtlZExpc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJPcmRlcmVkIGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhbiBPcmRlcmVkIGxpbmtlZCBsaXN0XFxcIlxcXCJcXFwiXFxuICAgICAgICBMaW5rZWRMaXN0Ll9faW5pdF9fKHNlbGYpXFxuXFxuICAgIGRlZiBhZGQoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmLl9oZWFkXFxuICAgICAgICBwcmV2ID0gTm9uZVxcbiAgICAgICAgbmV3X25vZGUgPSBMaW5rZWRMaXN0Tm9kZSh2YWx1ZSlcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQgYW5kIGN1cnJlbnQuZGF0YSA8IHZhbHVlOlxcbiAgICAgICAgICAgIHByZXYgPSBjdXJyZW50XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcblxcbiAgICAgICAgaWYgcHJldiBpcyBOb25lOlxcbiAgICAgICAgICAgIG5ld19ub2RlLm5leHQgPSBzZWxmLl9oZWFkXFxuICAgICAgICAgICAgc2VsZi5faGVhZCA9IG5ld19ub2RlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld19ub2RlLm5leHQgPSBjdXJyZW50XFxuICAgICAgICAgICAgcHJldi5uZXh0ID0gbmV3X25vZGVcXG4gICAgICAgIHNlbGYuX2NvdW50ID0gc2VsZi5fY291bnQgKyAxXFxuXFxuICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgICMgVGhpcyBpcyBhbiBleGVyY2lzZVxcbiAgICAgICAgcGFzc1xcblxcbiAgICBkZWYgc2VhcmNoKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNlYXJjaCBmb3IgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBUaGlzIGlzIGFuIGV4ZXJjaXNlXFxuICAgICAgICBwYXNzXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9iYXNpYy9xdWV1ZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBRdWV1ZTpcXG4gICAgXFxcIlxcXCJcXFwiUXVldWUgaW1wbGVtZW50YXRpb24gYXMgYSBsaXN0XFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgcXVldWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faXRlbXMpXFxuXFxuICAgIGRlZiBlbnF1ZXVlKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcy5pbnNlcnQoMCwgaXRlbSlcXG5cXG4gICAgZGVmIGRlcXVldWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBxdWV1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2l0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvc3RhY2sucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgU3RhY2s6XFxuICAgIFxcXCJcXFwiXFxcIlN0YWNrIGltcGxlbWVudGF0aW9uIGFzIGEgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBzdGFjayBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX2l0ZW1zKVxcblxcbiAgICBkZWYgcHVzaChzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBwb3Aoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBwZWVrKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSB2YWx1ZSBvZiB0aGUgdG9wIGl0ZW0gaW4gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faXRlbXNbLTFdXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2l0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvZ3JhcGhzL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLmdyYXBocyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuZ3JhcGhzLmFkamFjZW5jeV9ncmFwaCBpbXBvcnQgR3JhcGhcXG5mcm9tIHB5dGhvbmRzMy5ncmFwaHMuYWRqYWNlbmN5X2dyYXBoIGltcG9ydCBWZXJ0ZXhcXG5cXG5fX2FsbF9fID0gW1xcXCJHcmFwaFxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9ncmFwaHMvYWRqYWNlbmN5X2dyYXBoLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmltcG9ydCBoZWFwcVxcbmltcG9ydCBzeXNcXG5cXG5cXG5jbGFzcyBWZXJ0ZXg6XFxuICAgIFxcXCJcXFwiXFxcIkdyYXBoIHZlcnRleCBjbGFzc1xcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgdmVydGV4XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYuX25laWdoYm9ycyA9IHt9XFxuICAgICAgICBzZWxmLl9jb2xvciA9IFxcXCJ3aGl0ZVxcXCJcXG4gICAgICAgIHNlbGYuX2Rpc3RhbmNlID0gc3lzLm1heHNpemVcXG4gICAgICAgIHNlbGYuX3ByZXZpb3VzID0gTm9uZVxcbiAgICAgICAgc2VsZi5fZGlzY292ZXJ5X3RpbWUgPSAwXFxuICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUgPSAwXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTGVzcyB0aGFuIG9wZXJhdG9yIHJlcXVpcmVkIGZvciBoZWFwaWZ5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5rZXkgPCBvdGhlci5rZXlcXG5cXG4gICAgZGVmIGdldF9rZXkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdmVydGV4IGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBrZXkgPSBwcm9wZXJ0eShnZXRfa2V5KVxcblxcbiAgICBkZWYgZ2V0X25laWdoYm9yKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgZGlzdGFuY2UgKGVkZ2Ugd2VpZ2h0KSB0byBhbiBhZGphY2VudCBub2RlIChuZWlnaGJvcilcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9uZWlnaGJvcnMuZ2V0KG90aGVyLCBOb25lKVxcblxcbiAgICBkZWYgc2V0X25laWdoYm9yKHNlbGYsIG90aGVyLCB3ZWlnaHQ9MCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIGRpc3RhbmNlIChhZGQgYW4gZWRnZSkgdG8gYW4gYWRqYWNlbnQgbm9kZSAobmVpZ2hib3IpXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9uZWlnaGJvcnNbb3RoZXJdID0gd2VpZ2h0XFxuXFxuICAgIGRlZiBnZXRfbmVpZ2hib3JzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGFsbCBhZGphY2VudCBub2RlcyAobmVpZ2hib3JzKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX25laWdoYm9ycy5rZXlzKClcXG5cXG4gICAgZGVmIGdldF9jb2xvcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB2ZXJ0ZXggY29sb3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb2xvclxcblxcbiAgICBkZWYgc2V0X2NvbG9yKHNlbGYsIGNvbG9yKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB2ZXJ0ZXggY29sb3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NvbG9yID0gY29sb3JcXG5cXG4gICAgY29sb3IgPSBwcm9wZXJ0eShnZXRfY29sb3IsIHNldF9jb2xvcilcXG5cXG4gICAgZGVmIGdldF9kaXN0YW5jZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBkaXN0YW5jZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3RhbmNlXFxuXFxuICAgIGRlZiBzZXRfZGlzdGFuY2Uoc2VsZiwgZGlzdGFuY2UpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IGRpc3RhbmNlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9kaXN0YW5jZSA9IGRpc3RhbmNlXFxuXFxuICAgIGRpc3RhbmNlID0gcHJvcGVydHkoZ2V0X2Rpc3RhbmNlLCBzZXRfZGlzdGFuY2UpXFxuXFxuICAgIGRlZiBnZXRfcHJldmlvdXMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgcHJldmlvdXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9wcmV2aW91c1xcblxcbiAgICBkZWYgc2V0X3ByZXZpb3VzKHNlbGYsIHByZXZpb3VzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBwcmV2aW91c1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcHJldmlvdXMgPSBwcmV2aW91c1xcblxcbiAgICBwcmV2aW91cyA9IHByb3BlcnR5KGdldF9wcmV2aW91cywgc2V0X3ByZXZpb3VzKVxcblxcbiAgICBkZWYgZ2V0X2Rpc2NvdmVyeV90aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGRpc2NvdmVyeSB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZGlzY292ZXJ5X3RpbWVcXG5cXG4gICAgZGVmIHNldF9kaXNjb3ZlcnlfdGltZShzZWxmLCBkaXNjb3ZlcnlfdGltZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgZGlzY292ZXJ5IHRpbWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Rpc2NvdmVyeV90aW1lID0gZGlzY292ZXJ5X3RpbWVcXG5cXG4gICAgZGlzY292ZXJ5X3RpbWUgPSBwcm9wZXJ0eShnZXRfZGlzY292ZXJ5X3RpbWUsIHNldF9kaXNjb3ZlcnlfdGltZSlcXG5cXG4gICAgZGVmIGdldF9jbG9zaW5nX3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgY2xvc2luZyB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2xvc2luZ190aW1lXFxuXFxuICAgIGRlZiBzZXRfY2xvc2luZ190aW1lKHNlbGYsIGNsb3NpbmdfdGltZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgY2xvc2luZyB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUgPSBjbG9zaW5nX3RpbWVcXG5cXG4gICAgY2xvc2luZ190aW1lID0gcHJvcGVydHkoZ2V0X2Nsb3NpbmdfdGltZSwgc2V0X2Nsb3NpbmdfdGltZSlcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gXFxcIns6Xjh9fHs6Xjh9fHs6Xjh9fHs6Xjh9fHs6Xjh9fCB7fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgIHNlbGYuX2tleSxcXG4gICAgICAgICAgICBzZWxmLl9jb2xvcixcXG4gICAgICAgICAgICBzZWxmLl9kaXN0YW5jZSxcXG4gICAgICAgICAgICBzZWxmLl9kaXNjb3ZlcnlfdGltZSxcXG4gICAgICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUsXFxuICAgICAgICAgICAgc2VsZi5fcHJldmlvdXMsXFxuICAgICAgICApXFxuXFxuXFxuY2xhc3MgR3JhcGg6XFxuICAgIFxcXCJcXFwiXFxcIkdyYXBoIGFzIGFuIGFkamFjZW5jeSBtYXRyaXhcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fdmVydGljZXMgPSB7fVxcbiAgICAgICAgc2VsZi5fZWRnZXMgPSB7fVxcbiAgICAgICAgc2VsZi5fdGltZSA9IDBcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSXRlcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3ZlcnRpY2VzLnZhbHVlcygpKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdyYXBoJ3Mgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl92ZXJ0aWNlcylcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHcmFwaCdzIHNpemVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5fdmVydGljZXMpXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImluIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3ZlcnRpY2VzXFxuXFxuICAgIGRlZiBnZXRfdmVydGV4KHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSB2ZXJ0ZXggaW4gdGhlIGdyYXBoIG5hbWVkIHZlcnRfa2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fdmVydGljZXMuZ2V0KGtleSwgTm9uZSlcXG5cXG4gICAgZGVmIHNldF92ZXJ0ZXgoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpbnN0YW5jZSBvZiBWZXJ0ZXggdG8gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl92ZXJ0aWNlc1trZXldID0gVmVydGV4KGtleSlcXG5cXG4gICAgZGVmIGFkZF9lZGdlKHNlbGYsIGZyb21fdmVydGV4LCB0b192ZXJ0ZXgsIHdlaWdodD0wKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIHdlaWdodGVkIGFuZCBkaXJlY3RlZCBlZGdlIHRvIHRoZSBncmFwaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgZnJvbV92ZXJ0ZXggbm90IGluIHNlbGYuX3ZlcnRpY2VzOlxcbiAgICAgICAgICAgIHNlbGYuc2V0X3ZlcnRleChmcm9tX3ZlcnRleClcXG4gICAgICAgIGlmIHRvX3ZlcnRleCBub3QgaW4gc2VsZi5fdmVydGljZXM6XFxuICAgICAgICAgICAgc2VsZi5zZXRfdmVydGV4KHRvX3ZlcnRleClcXG4gICAgICAgIHNlbGYuX3ZlcnRpY2VzW2Zyb21fdmVydGV4XS5zZXRfbmVpZ2hib3Ioc2VsZi5fdmVydGljZXNbdG9fdmVydGV4XSwgd2VpZ2h0KVxcbiAgICAgICAgc2VsZi5fZWRnZXNbKGZyb21fdmVydGV4LCB0b192ZXJ0ZXgpXSA9IHdlaWdodFxcblxcbiAgICBkZWYgZ2V0X3ZlcnRpY2VzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCB2ZXJ0aWNlcyBpbiB0aGUgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl92ZXJ0aWNlcy5rZXlzKClcXG5cXG4gICAgZGVmIGdldF9lZGdlcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbGlzdCBvZiBhbGwgZWRnZXMgaW4gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZWRnZXMua2V5cygpXFxuXFxuICAgIGRlZiByZXNldF9kaXN0YW5jZXMoc2VsZiwgZGVmYXVsdF9kaXN0YW5jZT1zeXMubWF4c2l6ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXNldCBkaXN0YW5jZXMgdG8gdGVzdCBEaWprc3RyYSdzXFxcIlxcXCJcXFwiXFxuICAgICAgICBmb3IgdmVydGV4IGluIHNlbGY6XFxuICAgICAgICAgICAgdmVydGV4LmRpc3RhbmNlID0gZGVmYXVsdF9kaXN0YW5jZVxcblxcbiAgICBkZWYgYmZzKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkJyZWFkdGggRmlyc3QgU2VhcmNoXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydC5kaXN0YW5jZSA9IDBcXG4gICAgICAgIHN0YXJ0LnByZXZpb3VzID0gTm9uZVxcbiAgICAgICAgdmVydF9xdWV1ZSA9IFtzdGFydF1cXG4gICAgICAgIHdoaWxlIHZlcnRfcXVldWU6XFxuICAgICAgICAgICAgY3VycmVudF92ZXJ0ID0gdmVydF9xdWV1ZS5wb3AoMClcXG4gICAgICAgICAgICBmb3IgbmVpZ2ggaW4gY3VycmVudF92ZXJ0LmdldF9uZWlnaGJvcnMoKTpcXG4gICAgICAgICAgICAgICAgaWYgbmVpZ2guY29sb3IgPT0gXFxcIndoaXRlXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgIG5laWdoLmNvbG9yID0gXFxcImdyYXlcXFwiXFxuICAgICAgICAgICAgICAgICAgICBuZWlnaC5kaXN0YW5jZSA9IGN1cnJlbnRfdmVydC5kaXN0YW5jZSArIDFcXG4gICAgICAgICAgICAgICAgICAgIG5laWdoLnByZXZpb3VzID0gY3VycmVudF92ZXJ0XFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0X3F1ZXVlLmFwcGVuZChuZWlnaClcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnQuY29sb3IgPSBcXFwiYmxhY2tcXFwiXFxuXFxuICAgIGRlZiBkZnMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJEZXB0aCBGaXJzdCBzZWFyY2hcXFwiXFxcIlxcXCJcXG4gICAgICAgIGZvciB2ZXJ0ZXggaW4gc2VsZjpcXG4gICAgICAgICAgICBpZiB2ZXJ0ZXguY29sb3IgPT0gXFxcIndoaXRlXFxcIjpcXG4gICAgICAgICAgICAgICAgc2VsZi5kZnNfdmlzaXQodmVydGV4KVxcblxcbiAgICBkZWYgZGZzX3Zpc2l0KHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkRGUyBoZWxwZXIgZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmNvbG9yID0gXFxcImdyYXlcXFwiXFxuICAgICAgICBzZWxmLl90aW1lID0gc2VsZi5fdGltZSArIDFcXG4gICAgICAgIHN0YXJ0LmRpc2NvdmVyeV90aW1lID0gc2VsZi5fdGltZVxcbiAgICAgICAgZm9yIG5leHRfdmVydGV4IGluIHN0YXJ0LmdldF9uZWlnaGJvcnMoKTpcXG4gICAgICAgICAgICBpZiBuZXh0X3ZlcnRleC5jb2xvciA9PSBcXFwid2hpdGVcXFwiOlxcbiAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5zZXRfcHJldmlvdXMoc3RhcnQpXFxuICAgICAgICAgICAgICAgIHNlbGYuZGZzX3Zpc2l0KG5leHRfdmVydGV4KVxcbiAgICAgICAgc3RhcnQuY29sb3IgPSBcXFwiYmxhY2tcXFwiXFxuICAgICAgICBzZWxmLl90aW1lID0gc2VsZi5fdGltZSArIDFcXG4gICAgICAgIHN0YXJ0LmNsb3NpbmdfdGltZSA9IHNlbGYuX3RpbWVcXG5cXG4gICAgZGVmIHRyYXZlcnNlKHNlbGYsIHNyYywgZHN0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRyYXZlcnNlIGEgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhdGggPSBbXVxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuZ2V0X3ZlcnRleChkc3QpXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIHBhdGguYXBwZW5kKGN1cnJlbnQpXFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucHJldmlvdXNcXG4gICAgICAgIHByaW50KFxcbiAgICAgICAgICAgIFxcXCJQYXRoIGZyb20ge30gdG8ge30gKHt9KToge31cXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KHNyYykua2V5LFxcbiAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZHN0KS5rZXksXFxuICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChkc3QpLmRpc3RhbmNlLFxcbiAgICAgICAgICAgICAgICBcXFwiIFxcXCIuam9pbih2ZXJ0ZXgua2V5IGZvciB2ZXJ0ZXggaW4gcmV2ZXJzZWQocGF0aCkpLFxcbiAgICAgICAgICAgIClcXG4gICAgICAgIClcXG5cXG4gICAgZGVmIGRpamtzdHJhKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkRpamtzdHJhJ3Mgc2hvcnRlc3QgcGF0aCBhbGdvcml0aG1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgbm90X3lldF92aXNpdGVkID0gW1tzdGFydC5kaXN0YW5jZSwgc3RhcnRdXVxcbiAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfeWV0X3Zpc2l0ZWQpXFxuICAgICAgICB3aGlsZSBub3RfeWV0X3Zpc2l0ZWQ6XFxuICAgICAgICAgICAgY3VycmVudF92ZXJ0ZXggPSBoZWFwcS5oZWFwcG9wKG5vdF95ZXRfdmlzaXRlZClbMV1cXG4gICAgICAgICAgICBmb3IgbmV4dF92ZXJ0ZXggaW4gY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgICAgICBuZXdfZGlzdGFuY2UgPSBjdXJyZW50X3ZlcnRleC5kaXN0YW5jZSArIGN1cnJlbnRfdmVydGV4LmdldF9uZWlnaGJvcihcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4XFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgaWYgbmV3X2Rpc3RhbmNlIDwgbmV4dF92ZXJ0ZXguZGlzdGFuY2U6XFxuICAgICAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5kaXN0YW5jZSA9IG5ld19kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXgucHJldmlvdXMgPSBjdXJyZW50X3ZlcnRleFxcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBGYWxzZVxcbiAgICAgICAgICAgICAgICAgICAgZm9yIHZlcnRleCBpbiBub3RfeWV0X3Zpc2l0ZWQ6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmVydGV4WzFdLmtleSA9PSBuZXh0X3ZlcnRleC5rZXk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleFswXSA9IG5leHRfdmVydGV4LmRpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBxLmhlYXBpZnkobm90X3lldF92aXNpdGVkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWVcXG4gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmb3VuZDpcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFwcS5oZWFwcHVzaChcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90X3lldF92aXNpdGVkLCBbbmV4dF92ZXJ0ZXguZGlzdGFuY2UsIG5leHRfdmVydGV4XVxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcXG5cXG4gICAgZGVmIGJlbGxtYW5fZm9yZChzZWxmLCBzdGFydCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJCZWxsbWFuLUZvcmQgc2hvcnRlc3QgcGF0aCBhbGdvcml0aG1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgZm9yIF8gaW4gcmFuZ2UobGVuKHNlbGYuX3ZlcnRpY2VzKSk6XFxuICAgICAgICAgICAgZm9yIGVkZ2UgaW4gc2VsZi5fZWRnZXM6XFxuICAgICAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKS5kaXN0YW5jZSArIHNlbGYuX2VkZ2VzW2VkZ2VdXFxuICAgICAgICAgICAgICAgICAgICA8IHNlbGYuZ2V0X3ZlcnRleChlZGdlWzFdKS5kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMV0pLmRpc3RhbmNlID0gKFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKS5kaXN0YW5jZSArIHNlbGYuX2VkZ2VzW2VkZ2VdXFxuICAgICAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkucHJldmlvdXMgPSBzZWxmLmdldF92ZXJ0ZXgoZWRnZVswXSlcXG4gICAgICAgIGZvciBlZGdlIGluIHNlbGYuX2VkZ2VzOlxcbiAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMF0pLmRpc3RhbmNlICsgc2VsZi5fZWRnZXNbZWRnZV1cXG4gICAgICAgICAgICAgICAgPCBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkuZGlzdGFuY2VcXG4gICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJHcmFwaCBjb250YWlucyBhIG5lZ2F0aXZlLXdlaWdodCBjeWNsZVxcXCIpXFxuXFxuICAgIGRlZiBwcmltKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByaW0ncyBzcGFubmluZyB0cmVlIGFsZ29yaXRobVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnQuZGlzdGFuY2UgPSAwXFxuICAgICAgICBub3RfaW5fYV90cmVlID0gW1t2ZXJ0ZXguZGlzdGFuY2UsIHZlcnRleF0gZm9yIHZlcnRleCBpbiBzZWxmXVxcbiAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfaW5fYV90cmVlKVxcbiAgICAgICAgd2hpbGUgbm90X2luX2FfdHJlZTpcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnRleCA9IGhlYXBxLmhlYXBwb3Aobm90X2luX2FfdHJlZSlbMV1cXG4gICAgICAgICAgICBmb3IgbmV4dF92ZXJ0ZXggaW4gY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgICAgICBuZXdfZGlzdGFuY2UgPSBjdXJyZW50X3ZlcnRleC5nZXRfbmVpZ2hib3IobmV4dF92ZXJ0ZXgpXFxuICAgICAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgICAgIGFueShpdGVtWzFdID09IG5leHRfdmVydGV4IGZvciBpdGVtIGluIG5vdF9pbl9hX3RyZWUpXFxuICAgICAgICAgICAgICAgICAgICBhbmQgbmV3X2Rpc3RhbmNlIDwgbmV4dF92ZXJ0ZXguZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgKTpcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LnByZXZpb3VzID0gY3VycmVudF92ZXJ0ZXhcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LmRpc3RhbmNlID0gbmV3X2Rpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBub3RfaW5fYV90cmVlOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0ZW1bMV0gPT0gbmV4dF92ZXJ0ZXg6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bMF0gPSBuZXdfZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfaW5fYV90cmVlKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcblwiLFwic3JjL2xpYi9weXRob25kczMvaW50cm8vX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuaW50cm8gaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLmludHJvLm9vcCBpbXBvcnQgRnJhY3Rpb25cXG5cXG5fX2FsbF9fID0gW1xcXCJGcmFjdGlvblxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9pbnRyby9vb3AucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuZGVmIGdjZChudW1iZXIxLCBudW1iZXIyKTpcXG4gICAgXFxcIlxcXCJcXFwiSGVscGVyIGZ1bmN0aW9uIHRvIHNpbXBsaWZ5IGZyYWN0aW9uc1xcXCJcXFwiXFxcIlxcbiAgICBpZiBub3QgaXNpbnN0YW5jZShudW1iZXIxLCBpbnQpIG9yIG5vdCBpc2luc3RhbmNlKG51bWJlcjIsIGludCk6XFxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcIk51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgbXVzdCBiZSBpbnRlZ2Vyc1xcXCIpXFxuICAgIHdoaWxlIG51bWJlcjEgJSBudW1iZXIyOlxcbiAgICAgICAgbnVtYmVyMSwgbnVtYmVyMiA9IG51bWJlcjIsIG51bWJlcjEgJSBudW1iZXIyXFxuICAgIHJldHVybiBudW1iZXIyXFxuXFxuXFxuY2xhc3MgRnJhY3Rpb246XFxuICAgIFxcXCJcXFwiXFxcIkZyYWN0aW9uIGNsYXNzXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuZXdfbnVtZXIsIG5ld19kZW5vbSk6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgY29tbW9uID0gZ2NkKG5ld19udW1lciwgbmV3X2Rlbm9tKVxcbiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjpcXG4gICAgICAgICAgICByYWlzZVxcbiAgICAgICAgc2VsZi5fbnVtZXIgPSBuZXdfbnVtZXIgLy8gY29tbW9uXFxuICAgICAgICBzZWxmLl9kZW5vbSA9IG5ld19kZW5vbSAvLyBjb21tb25cXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBudW1lcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBudW1lcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9udW1lclxcblxcbiAgICBAbnVtZXIuc2V0dGVyXFxuICAgIGRlZiBzZXRfbnVtZXIoc2VsZiwgbmV3X251bWVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBudW1lcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX251bWVyID0gbmV3X251bWVyXFxuXFxuICAgIGRlZiBnZXRfZGVub20oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgZGVuaW1pbmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kZW5vbVxcblxcbiAgICBkZWYgc2V0X2Rlbm9tKHNlbGYsIG5ld19kZW5vbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgZGVuaW1pbmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Rlbm9tID0gbmV3X2Rlbm9tXFxuXFxuICAgICMgQW5vdGhlciB3YXkgdG8gY3JlYXRlIGFuIGF0dHJpYnV0ZVxcbiAgICBkZW5vbSA9IHByb3BlcnR5KGdldF9kZW5vbSwgc2V0X2Rlbm9tKVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgc3RyaW5nIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9udW1lciA+IHNlbGYuX2Rlbm9tOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwie30ge30ve31cXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgc2VsZi5fbnVtZXIgLy8gc2VsZi5fZGVub20sIHNlbGYuX251bWVyICUgc2VsZi5fZGVub20sIHNlbGYuX2Rlbm9tXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgcmV0dXJuIFxcXCJ7fS97fVxcXCIuZm9ybWF0KHNlbGYuX251bWVyLCBzZWxmLl9kZW5vbSlcXG5cXG4gICAgZGVmIF9fcmVwcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRnJhY3Rpb24gcmVwcmVzZW50YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBcXFwiRnJhY3Rpb24oe30sIHt9KVxcXCIuZm9ybWF0KHNlbGYuX251bWVyLCBzZWxmLl9kZW5vbSlcXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJFcXVhbGl0eSBjb21wYXJpc29uXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbnVtZXIgKiBvdGhlci5kZW5vbSA9PSBvdGhlci5udW1lciAqIHNlbGYuX2Rlbm9tXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCB0d28gZnJhY3Rpb25zXFxcIlxcXCJcXFwiXFxuICAgICAgICBuZXdfbnVtZXIgPSBzZWxmLl9udW1lciAqIG90aGVyLmRlbm9tICsgc2VsZi5fZGVub20gKiBvdGhlci5udW1lclxcbiAgICAgICAgbmV3X2Rlbm9tID0gc2VsZi5fZGVub20gKiBvdGhlci5kZW5vbVxcbiAgICAgICAgcmV0dXJuIEZyYWN0aW9uKG5ld19udW1lciwgbmV3X2Rlbm9tKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvc2VhcmNoaW5nL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLnNlYXJjaCBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuc2VhcmNoaW5nLmhhc2hfdGFibGUgaW1wb3J0IEhhc2hUYWJsZVxcblxcbl9fYWxsX18gPSBbXFxcIkhhc2hUYWJsZVxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zZWFyY2hpbmcvaGFzaF90YWJsZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBIYXNoVGFibGU6XFxuICAgIFxcXCJcXFwiXFxcIkhhc2ggVGFibGUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemU9MTYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGEgaGFzaCB0YWJsZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IHNpemVcXG4gICAgICAgIHNlbGYuX3Nsb3RzID0gW05vbmVdICogc2VsZi5fc2l6ZVxcbiAgICAgICAgc2VsZi5fZGF0YSA9IFtOb25lXSAqIHNlbGYuX3NpemVcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNYWdpYyBfX2dldF9fXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5nZXQoa2V5KVxcblxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBkYXRhKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2ljIF9fc2V0X19cXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYucHV0KGtleSwgZGF0YSlcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNYWdpYyBfX2xlbl9fXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZSAtIHNlbGYuX3Nsb3RzLmNvdW50KE5vbmUpXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2luIGluXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3Nsb3RzXFxuXFxuICAgIGRlZiBfaGFzaF9mdW5jdGlvbihzZWxmLCBrZXksIHNpemUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2ltcGxlIGhhc2ggZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBrZXkgJSBzaXplXFxuXFxuICAgIGRlZiBfcmVoYXNoKHNlbGYsIG9sZF9oYXNoLCBzaXplLCBzdGVwPTEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2ltcGxlIHJlaGFzaCBmdW5jdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIChvbGRfaGFzaCArIHN0ZXApICUgc2l6ZVxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgdGFibGUgaXMgZW1wdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplID09IHNlbGYuX3Nsb3RzLmNvdW50KE5vbmUpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdGFibGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplIC0gc2VsZi5fc2xvdHMuY291bnQoTm9uZSlcXG5cXG4gICAgZGVmIHB1dChzZWxmLCBrZXksIGRhdGEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICBoYXNoX3ZhbHVlID0gc2VsZi5faGFzaF9mdW5jdGlvbihrZXksIGxlbihzZWxmLl9zbG90cykpXFxuXFxuICAgICAgICBpZiBzZWxmLl9zbG90c1toYXNoX3ZhbHVlXSBpcyBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuX3Nsb3RzW2hhc2hfdmFsdWVdID0ga2V5XFxuICAgICAgICAgICAgc2VsZi5fZGF0YVtoYXNoX3ZhbHVlXSA9IGRhdGFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5fc2xvdHNbaGFzaF92YWx1ZV0gPT0ga2V5OlxcbiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW2hhc2hfdmFsdWVdID0gZGF0YSAgIyByZXBsYWNlXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaiA9IDBcXG4gICAgICAgICAgICAgICAgbmV4dF9zbG90ID0gc2VsZi5fcmVoYXNoKGhhc2hfdmFsdWUsIGxlbihzZWxmLl9zbG90cyksIGopXFxuICAgICAgICAgICAgICAgIHdoaWxlIChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3Nsb3RzW25leHRfc2xvdF0gaXMgbm90IE5vbmVcXG4gICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdICE9IGtleVxcbiAgICAgICAgICAgICAgICAgICAgYW5kIGogPCBzZWxmLl9zaXplXFxuICAgICAgICAgICAgICAgICk6XFxuICAgICAgICAgICAgICAgICAgICBqID0gaiArIDFcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfc2xvdCA9IHNlbGYuX3JlaGFzaChoYXNoX3ZhbHVlLCBsZW4oc2VsZi5fc2xvdHMpLCBqKVxcblxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdID0ga2V5XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW25leHRfc2xvdF0gPSBkYXRhXFxuICAgICAgICAgICAgICAgIGVsaWYgaiA9PSBzZWxmLl9zaXplOlxcbiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKFxcXCJIYXNoIFRhYmxlIGlzIGZ1bGxcXFwiKVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YVtuZXh0X3Nsb3RdID0gZGF0YSAgIyByZXBsYWNlXFxuXFxuICAgIGRlZiBnZXQoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBhbiBpdGVtIGZyb20gdGhlIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydF9zbG90ID0gc2VsZi5faGFzaF9mdW5jdGlvbihrZXksIGxlbihzZWxmLl9zbG90cykpXFxuICAgICAgICBwb3NpdGlvbiA9IHN0YXJ0X3Nsb3RcXG4gICAgICAgIGogPSAwXFxuXFxuICAgICAgICB3aGlsZSBzZWxmLl9zbG90c1twb3NpdGlvbl0gaXMgbm90IE5vbmUgYW5kIGogPCBzZWxmLl9zaXplOlxcbiAgICAgICAgICAgIGlmIHNlbGYuX3Nsb3RzW3Bvc2l0aW9uXSA9PSBrZXk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYXRhW3Bvc2l0aW9uXVxcbiAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgIHBvc2l0aW9uID0gc2VsZi5fcmVoYXNoKHN0YXJ0X3Nsb3QsIGxlbihzZWxmLl9zbG90cyksIGopXFxuXFxuICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwie30gaXMgbm90IGluIHRoZSB0YWJsZVxcXCIuZm9ybWF0KGtleSkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zb3J0aW5nL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLnNvcnRpbmcgaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBidWJibGVfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBzZWxlY3Rfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBpbnNlcnRfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBzaGVsbF9zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IG1lcmdlX3NvcnRcXG5mcm9tIHB5dGhvbmRzMy5zb3J0aW5nLnNvcnRpbmdfYWxnb3JpdGhtcyBpbXBvcnQgcXVpY2tfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBoZWFwX3NvcnRcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3NvcnRpbmcvc29ydGluZ19hbGdvcml0aG1zLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmltcG9ydCBoZWFwcVxcblxcblxcbmRlZiBidWJibGVfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJCdWJibGUgc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSBpbiByYW5nZShsZW4obHN0KSAtIDEsIDAsIC0xKTpcXG4gICAgICAgIGV4Y2hhbmdlcyA9IEZhbHNlXFxuICAgICAgICBmb3IgaiBpbiByYW5nZShpKTpcXG4gICAgICAgICAgICBpZiBsc3Rbal0gPiBsc3RbaiArIDFdOlxcbiAgICAgICAgICAgICAgICBleGNoYW5nZXMgPSBUcnVlXFxuICAgICAgICAgICAgICAgIGxzdFtqXSwgbHN0W2ogKyAxXSA9IGxzdFtqICsgMV0sIGxzdFtqXVxcbiAgICAgICAgaWYgbm90IGV4Y2hhbmdlczpcXG4gICAgICAgICAgICBicmVha1xcblxcblxcbmRlZiBzZWxlY3Rfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJTZWxlY3Rpb24gc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUobHN0KTpcXG4gICAgICAgIG1pbl9pZHggPSBsZW4obHN0KSAtIDFcXG4gICAgICAgIGZvciBqIGluIHJhbmdlKGksIGxlbihsc3QpKTpcXG4gICAgICAgICAgICBpZiBsc3Rbal0gPCBsc3RbbWluX2lkeF06XFxuICAgICAgICAgICAgICAgIG1pbl9pZHggPSBqXFxuICAgICAgICBpZiBtaW5faWR4ICE9IGk6XFxuICAgICAgICAgICAgbHN0W21pbl9pZHhdLCBsc3RbaV0gPSBsc3RbaV0sIGxzdFttaW5faWR4XVxcblxcblxcbmRlZiBpbnNlcnRfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnRpb24gc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obHN0KSk6XFxuICAgICAgICBjdXJfdmFsID0gbHN0W2ldXFxuICAgICAgICBjdXJfcG9zID0gaVxcblxcbiAgICAgICAgd2hpbGUgY3VyX3BvcyA+IDAgYW5kIGxzdFtjdXJfcG9zIC0gMV0gPiBjdXJfdmFsOlxcbiAgICAgICAgICAgIGxzdFtjdXJfcG9zXSA9IGxzdFtjdXJfcG9zIC0gMV1cXG4gICAgICAgICAgICBjdXJfcG9zID0gY3VyX3BvcyAtIDFcXG4gICAgICAgIGxzdFtjdXJfcG9zXSA9IGN1cl92YWxcXG5cXG5cXG5kZWYgc2hlbGxfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJTaGVsbCBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIHN1Ymxpc3RfY291bnQgPSBsZW4obHN0KSAvLyAzXFxuICAgIHdoaWxlIHN1Ymxpc3RfY291bnQgPiAwOlxcbiAgICAgICAgZm9yIHBvc19zdGFydCBpbiByYW5nZShzdWJsaXN0X2NvdW50KTpcXG4gICAgICAgICAgICBfZ2FwX2luc2VydF9zb3J0KGxzdCwgcG9zX3N0YXJ0LCBzdWJsaXN0X2NvdW50KVxcbiAgICAgICAgc3VibGlzdF9jb3VudCA9IHN1Ymxpc3RfY291bnQgLy8gMlxcblxcblxcbmRlZiBfZ2FwX2luc2VydF9zb3J0KGxzdCwgc3RhcnQsIGdhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlNoZWxsIHNvcnQgaGVscGVyIGZ1bmN0aW9uXFxcIlxcXCJcXFwiXFxuICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0ICsgZ2FwLCBsZW4obHN0KSwgZ2FwKTpcXG4gICAgICAgIGN1cl92YWwgPSBsc3RbaV1cXG4gICAgICAgIGN1cl9wb3MgPSBpXFxuICAgICAgICB3aGlsZSBjdXJfcG9zID49IGdhcCBhbmQgbHN0W2N1cl9wb3MgLSBnYXBdID4gY3VyX3ZhbDpcXG4gICAgICAgICAgICBsc3RbY3VyX3Bvc10gPSBsc3RbY3VyX3BvcyAtIGdhcF1cXG4gICAgICAgICAgICBjdXJfcG9zID0gY3VyX3BvcyAtIGdhcFxcbiAgICAgICAgbHN0W2N1cl9wb3NdID0gY3VyX3ZhbFxcblxcblxcbmRlZiBtZXJnZV9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIk1lcmdlIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgaWYgbGVuKGxzdCkgPiAxOlxcbiAgICAgICAgbWlkID0gbGVuKGxzdCkgLy8gMlxcbiAgICAgICAgbGVmdF9oYWxmID0gbHN0WzptaWRdXFxuICAgICAgICByaWdodF9oYWxmID0gbHN0W21pZDpdXFxuXFxuICAgICAgICBtZXJnZV9zb3J0KGxlZnRfaGFsZilcXG4gICAgICAgIG1lcmdlX3NvcnQocmlnaHRfaGFsZilcXG5cXG4gICAgICAgIGksIGosIGsgPSAwLCAwLCAwXFxuICAgICAgICB3aGlsZSBpIDwgbGVuKGxlZnRfaGFsZikgYW5kIGogPCBsZW4ocmlnaHRfaGFsZik6XFxuICAgICAgICAgICAgaWYgbGVmdF9oYWxmW2ldIDw9IHJpZ2h0X2hhbGZbal06XFxuICAgICAgICAgICAgICAgIGxzdFtrXSA9IGxlZnRfaGFsZltpXVxcbiAgICAgICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBsc3Rba10gPSByaWdodF9oYWxmW2pdXFxuICAgICAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgIGsgPSBrICsgMVxcblxcbiAgICAgICAgd2hpbGUgaSA8IGxlbihsZWZ0X2hhbGYpOlxcbiAgICAgICAgICAgIGxzdFtrXSA9IGxlZnRfaGFsZltpXVxcbiAgICAgICAgICAgIGkgPSBpICsgMVxcbiAgICAgICAgICAgIGsgPSBrICsgMVxcblxcbiAgICAgICAgd2hpbGUgaiA8IGxlbihyaWdodF9oYWxmKTpcXG4gICAgICAgICAgICBsc3Rba10gPSByaWdodF9oYWxmW2pdXFxuICAgICAgICAgICAgaiA9IGogKyAxXFxuICAgICAgICAgICAgayA9IGsgKyAxXFxuXFxuXFxuZGVmIHF1aWNrX3NvcnQobHN0KTpcXG4gICAgXFxcIlxcXCJcXFwiUXVpY2sgc29ydFxcXCJcXFwiXFxcIlxcbiAgICBfcXVpY2tfc29ydF9oZWxwKGxzdCwgMCwgbGVuKGxzdCkgLSAxKVxcblxcblxcbmRlZiBfcXVpY2tfc29ydF9oZWxwKGxzdCwgbWFya19sLCBtYXJrX3IpOlxcbiAgICBcXFwiXFxcIlxcXCJRdWljayBzb3J0IGhlbHBlclxcXCJcXFwiXFxcIlxcbiAgICBpZiBtYXJrX2wgPCBtYXJrX3I6XFxuICAgICAgICBzcGxpdCA9IF9xdWlja19zb3J0X3BhcnQobHN0LCBtYXJrX2wsIG1hcmtfcilcXG4gICAgICAgIF9xdWlja19zb3J0X2hlbHAobHN0LCBtYXJrX2wsIHNwbGl0IC0gMSlcXG4gICAgICAgIF9xdWlja19zb3J0X2hlbHAobHN0LCBzcGxpdCArIDEsIG1hcmtfcilcXG5cXG5cXG5kZWYgX3F1aWNrX3NvcnRfcGFydChsc3QsIG1hcmtfbCwgbWFya19yKTpcXG4gICAgXFxcIlxcXCJcXFwiUXVpY2sgc29ydCBwYXJ0aXRpb25cXFwiXFxcIlxcXCJcXG4gICAgcGl2b3RfdmFsID0gbHN0W21hcmtfbF1cXG4gICAgbWFya19sX2N1ciA9IG1hcmtfbCArIDFcXG4gICAgbWFya19yX2N1ciA9IG1hcmtfclxcbiAgICBkb25lID0gRmFsc2VcXG5cXG4gICAgd2hpbGUgbm90IGRvbmU6XFxuICAgICAgICB3aGlsZSBtYXJrX2xfY3VyIDw9IG1hcmtfcl9jdXIgYW5kIGxzdFttYXJrX2xfY3VyXSA8PSBwaXZvdF92YWw6XFxuICAgICAgICAgICAgbWFya19sX2N1ciA9IG1hcmtfbF9jdXIgKyAxXFxuICAgICAgICB3aGlsZSBtYXJrX2xfY3VyIDw9IG1hcmtfcl9jdXIgYW5kIGxzdFttYXJrX3JfY3VyXSA+PSBwaXZvdF92YWw6XFxuICAgICAgICAgICAgbWFya19yX2N1ciA9IG1hcmtfcl9jdXIgLSAxXFxuICAgICAgICBpZiBtYXJrX3JfY3VyIDwgbWFya19sX2N1cjpcXG4gICAgICAgICAgICBkb25lID0gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBsc3RbbWFya19sX2N1cl0sIGxzdFttYXJrX3JfY3VyXSA9IGxzdFttYXJrX3JfY3VyXSwgbHN0W21hcmtfbF9jdXJdXFxuICAgIGxzdFttYXJrX2xdLCBsc3RbbWFya19yX2N1cl0gPSBsc3RbbWFya19yX2N1cl0sIGxzdFttYXJrX2xdXFxuXFxuICAgIHJldHVybiBtYXJrX3JfY3VyXFxuXFxuXFxuZGVmIGhlYXBfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJIZWFwIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgcmVzID0gW11cXG4gICAgaGVhcHEuaGVhcGlmeShsc3QpXFxuICAgIHdoaWxlIGxzdDpcXG4gICAgICAgIHJlcy5hcHBlbmQoaGVhcHEuaGVhcHBvcChsc3QpKVxcbiAgICBmb3IgaSBpbiByZXM6XFxuICAgICAgICBsc3QuYXBwZW5kKGkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9fX2luaXRfXy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbnB5dGhvbmRzMy50cmVlcyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMudHJlZXMuYXZsX3RyZWUgaW1wb3J0IEFWTFRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfc2VhcmNoX3RyZWUgaW1wb3J0IEJpbmFyeVNlYXJjaFRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfaGVhcCBpbXBvcnQgQmluYXJ5SGVhcFxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV90cmVlIGltcG9ydCBCaW5hcnlUcmVlXFxuZnJvbSBweXRob25kczMudHJlZXMucHJpb3JpdHlfcXVldWUgaW1wb3J0IFByaW9yaXR5UXVldWVcXG5cXG5fX2FsbF9fID0gW1xcXCJCaW5hcnlUcmVlXFxcIiwgXFxcIkJpbmFyeUhlYXBcXFwiLCBcXFwiQmluYXJ5U2VhcmNoVHJlZVxcXCIsIFxcXCJBVkxUcmVlXFxcIiwgXFxcIlByaW9yaXR5UXVldWVcXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYXZsX3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3NlYXJjaF90cmVlIGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3NlYXJjaF90cmVlIGltcG9ydCBCaW5hcnlUcmVlTm9kZVxcblxcblxcbmNsYXNzIEFWTFRyZWVOb2RlKEJpbmFyeVRyZWVOb2RlKTpcXG4gICAgXFxcIlxcXCJcXFwiQVZMIFRyZWUgTm9kZVxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5LCB2YWwsIGJhbGFuY2VfZmFjdG9yLCBsZWZ0PU5vbmUsIHJpZ2h0PU5vbmUsIHBhcmVudD1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhbiBBVkwgdHJlZSBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBCaW5hcnlUcmVlTm9kZS5fX2luaXRfXyhzZWxmLCBrZXksIHZhbCwgbGVmdCwgcmlnaHQsIHBhcmVudClcXG4gICAgICAgIHNlbGYuX2JhbGFuY2VfZmFjdG9yID0gYmFsYW5jZV9mYWN0b3JcXG5cXG4gICAgZGVmIGdldF9iYWxhbmNlX2ZhY3RvcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgbm9kZSBiYWxhbmNlIGZhY3RvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2JhbGFuY2VfZmFjdG9yXFxuXFxuICAgIGRlZiBzZXRfYmFsYW5jZV9mYWN0b3Ioc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHRoZSBub2RlIGJhbGFuY2UgZmFjdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9iYWxhbmNlX2ZhY3RvciA9IHZhbHVlXFxuXFxuICAgIGJhbGFuY2VfZmFjdG9yID0gcHJvcGVydHkoZ2V0X2JhbGFuY2VfZmFjdG9yLCBzZXRfYmFsYW5jZV9mYWN0b3IpXFxuXFxuXFxuY2xhc3MgQVZMVHJlZShCaW5hcnlTZWFyY2hUcmVlKTpcXG4gICAgXFxcIlxcXCJcXFwiQVZMIHRyZWUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGEgbmV3IEFWTCB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBCaW5hcnlTZWFyY2hUcmVlLl9faW5pdF9fKHNlbGYpXFxuXFxuICAgIGRlZiBwdXQoc2VsZiwga2V5LCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3Jvb3Q6XFxuICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIHNlbGYuX3Jvb3QpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBBVkxUcmVlTm9kZShrZXksIHZhbHVlLCAwKVxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgKyAxXFxuXFxuICAgIGRlZiBfcHV0KHNlbGYsIGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYSBuZXcgbm9kZSB0byB0aGUgdHJlZSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudF9ub2RlLmtleTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuZ2V0X2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0ID0gQVZMVHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCAwLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYmFsYW5jZShjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmdldF9jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodCA9IEFWTFRyZWVOb2RlKFxcbiAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSwgMCwgcGFyZW50PWN1cnJlbnRfbm9kZVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2JhbGFuY2UoY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgdXBkYXRlX2JhbGFuY2Uoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJVcGRhdGUgdGhlIHRyZWUgYmFsYW5jZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlX2ZhY3RvciA+IDEgb3Igbm9kZS5iYWxhbmNlX2ZhY3RvciA8IC0xOlxcbiAgICAgICAgICAgIHNlbGYucmViYWxhbmNlKG5vZGUpXFxuICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICBpZiBub2RlLnBhcmVudDpcXG4gICAgICAgICAgICBpZiBub2RlLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQuYmFsYW5jZV9mYWN0b3IgKz0gMVxcbiAgICAgICAgICAgIGVsaWYgbm9kZS5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlX2ZhY3RvciAtPSAxXFxuXFxuICAgICAgICAgICAgaWYgbm9kZS5wYXJlbnQuYmFsYW5jZV9mYWN0b3IgIT0gMDpcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYmFsYW5jZShub2RlLnBhcmVudClcXG5cXG4gICAgZGVmIHJlYmFsYW5jZShzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlYmFsYW5jZSB0aGUgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlX2ZhY3RvciA8IDA6XFxuICAgICAgICAgICAgaWYgbm9kZS5jaGlsZF9yaWdodC5iYWxhbmNlX2ZhY3RvciA+IDA6XFxuICAgICAgICAgICAgICAgICMgRG8gYW4gTFIgUm90YXRpb25cXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfcmlnaHQobm9kZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfbGVmdChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIGxlZnRcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfbGVmdChub2RlKVxcbiAgICAgICAgZWxpZiBub2RlLmJhbGFuY2VfZmFjdG9yID4gMDpcXG4gICAgICAgICAgICBpZiBub2RlLmNoaWxkX2xlZnQuYmFsYW5jZV9mYWN0b3IgPCAwOlxcbiAgICAgICAgICAgICAgICAjIERvIGFuIFJMIFJvdGF0aW9uXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX2xlZnQobm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9yaWdodChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIHJpZ2h0XFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX3JpZ2h0KG5vZGUpXFxuXFxuICAgIGRlZiByb3RhdGVfbGVmdChzZWxmLCByb3RhdGlvbl9yb290KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkxlZnQgcm90YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19yb290ID0gcm90YXRpb25fcm9vdC5jaGlsZF9yaWdodFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5jaGlsZF9yaWdodCA9IG5ld19yb290LmNoaWxkX2xlZnRcXG4gICAgICAgIGlmIG5ld19yb290LmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgbmV3X3Jvb3QuY2hpbGRfbGVmdC5wYXJlbnQgPSByb3RhdGlvbl9yb290XFxuICAgICAgICBuZXdfcm9vdC5wYXJlbnQgPSByb3RhdGlvbl9yb290LnBhcmVudFxcbiAgICAgICAgaWYgcm90YXRpb25fcm9vdC5pc19yb290KCk6XFxuICAgICAgICAgICAgc2VsZi5fcm9vdCA9IG5ld19yb290XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9sZWZ0ID0gbmV3X3Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9yaWdodCA9IG5ld19yb290XFxuICAgICAgICBuZXdfcm9vdC5jaGlsZF9sZWZ0ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQgPSBuZXdfcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciA9IChcXG4gICAgICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yICsgMSAtIG1pbihuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciwgMClcXG4gICAgICAgIClcXG4gICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yICsgMSArIG1heChyb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcblxcbiAgICBkZWYgcm90YXRlX3JpZ2h0KHNlbGYsIHJvdGF0aW9uX3Jvb3QpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmlnaHQgcm90YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19yb290ID0gcm90YXRpb25fcm9vdC5jaGlsZF9sZWZ0XFxuICAgICAgICByb3RhdGlvbl9yb290LmNoaWxkX2xlZnQgPSBuZXdfcm9vdC5jaGlsZF9yaWdodFxcbiAgICAgICAgaWYgbmV3X3Jvb3QuY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgbmV3X3Jvb3QuY2hpbGRfcmlnaHQucGFyZW50ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgbmV3X3Jvb3QucGFyZW50ID0gcm90YXRpb25fcm9vdC5wYXJlbnRcXG4gICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfcm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBuZXdfcm9vdFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiByb3RhdGlvbl9yb290LmlzX2NoaWxkX3JpZ2h0KCk6XFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50LmNoaWxkX3JpZ2h0ID0gbmV3X3Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9sZWZ0ID0gbmV3X3Jvb3RcXG4gICAgICAgIG5ld19yb290LmNoaWxkX3JpZ2h0ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQgPSBuZXdfcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciA9IChcXG4gICAgICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yIC0gMSAtIG1heChuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciwgMClcXG4gICAgICAgIClcXG4gICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yIC0gMSArIG1pbihyb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYmluYXJ5X2hlYXAucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgQmluYXJ5SGVhcDpcXG4gICAgXFxcIlxcXCJcXFwiTWluaW1hbCBCaW5hcnkgSGVhcFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBoZWFwXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9oZWFwID0gW11cXG5cXG4gICAgZGVmIF9wZXJjX3VwKHNlbGYsIGN1cl9pZHgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTW92ZSBhIG5vZGUgdXBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHdoaWxlIChjdXJfaWR4IC0gMSkgLy8gMiA+PSAwOlxcbiAgICAgICAgICAgIHBhcmVudF9pZHggPSAoY3VyX2lkeCAtIDEpIC8vIDJcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2N1cl9pZHhdIDwgc2VsZi5faGVhcFtwYXJlbnRfaWR4XTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGVhcFtjdXJfaWR4XSwgc2VsZi5faGVhcFtwYXJlbnRfaWR4XSA9IChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbcGFyZW50X2lkeF0sXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgY3VyX2lkeCA9IHBhcmVudF9pZHhcXG5cXG4gICAgZGVmIF9wZXJjX2Rvd24oc2VsZiwgY3VyX2lkeCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNb3ZlIGEgbm9kZSBkb3duXFxcIlxcXCJcXFwiXFxuICAgICAgICB3aGlsZSAyICogY3VyX2lkeCArIDEgPCBsZW4oc2VsZi5faGVhcCk6XFxuICAgICAgICAgICAgbWluX2NoaWxkX2lkeCA9IHNlbGYuX2dldF9taW5fY2hpbGQoY3VyX2lkeClcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2N1cl9pZHhdID4gc2VsZi5faGVhcFttaW5fY2hpbGRfaWR4XTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGVhcFtjdXJfaWR4XSwgc2VsZi5faGVhcFttaW5fY2hpbGRfaWR4XSA9IChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbbWluX2NoaWxkX2lkeF0sXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICAgICAgY3VyX2lkeCA9IG1pbl9jaGlsZF9pZHhcXG5cXG4gICAgZGVmIF9nZXRfbWluX2NoaWxkKHNlbGYsIHBhcmVudF9pZHgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGEgc21hbGxlciBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgMiAqIHBhcmVudF9pZHggKyAyID4gbGVuKHNlbGYuX2hlYXApIC0gMTpcXG4gICAgICAgICAgICByZXR1cm4gMiAqIHBhcmVudF9pZHggKyAxXFxuICAgICAgICBpZiBzZWxmLl9oZWFwWzIgKiBwYXJlbnRfaWR4ICsgMV0gPCBzZWxmLl9oZWFwWzIgKiBwYXJlbnRfaWR4ICsgMl06XFxuICAgICAgICAgICAgcmV0dXJuIDIgKiBwYXJlbnRfaWR4ICsgMVxcbiAgICAgICAgcmV0dXJuIDIgKiBwYXJlbnRfaWR4ICsgMlxcblxcbiAgICBkZWYgaGVhcGlmeShzZWxmLCBub3RfYV9oZWFwLCBzaG93X2RldGFpbHM9RmFsc2UpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQnVpbGQgYSBoZWFwIGZyb20gYW55IGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXAgPSBub3RfYV9oZWFwWzpdXFxuICAgICAgICBjdXJfaWR4ID0gbGVuKHNlbGYuX2hlYXApIC8vIDIgLSAxXFxuICAgICAgICB3aGlsZSBjdXJfaWR4ID49IDA6XFxuICAgICAgICAgICAgc2VsZi5fcGVyY19kb3duKGN1cl9pZHgpXFxuICAgICAgICAgICAgY3VyX2lkeCA9IGN1cl9pZHggLSAxXFxuICAgICAgICAgICAgaWYgc2hvd19kZXRhaWxzOlxcbiAgICAgICAgICAgICAgICBwcmludChzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgaW5zZXJ0KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IGl0ZW1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXAuYXBwZW5kKGl0ZW0pXFxuICAgICAgICBzZWxmLl9wZXJjX3VwKGxlbihzZWxmLl9oZWFwKSAtIDEpXFxuXFxuICAgIGRlZiBkZWxldGUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhcFswXSwgc2VsZi5faGVhcFstMV0gPSBzZWxmLl9oZWFwWy0xXSwgc2VsZi5faGVhcFswXVxcbiAgICAgICAgcmVzdWx0ID0gc2VsZi5faGVhcC5wb3AoKVxcbiAgICAgICAgc2VsZi5fcGVyY19kb3duKDApXFxuICAgICAgICByZXR1cm4gcmVzdWx0XFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBoZWFwIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faGVhcClcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgaGVhcCBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2hlYXApXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSGVhcCBhcyBhIHN0cmluZ1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiX19jb250YWluc19faW4gbWV0aG9kIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gaXRlbSBpbiBzZWxmLl9oZWFwXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9iaW5hcnlfc2VhcmNoX3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgQmluYXJ5VHJlZU5vZGU6XFxuICAgIFxcXCJcXFwiXFxcIkJpbmFyeSBUcmVlIE5vZGUgY2xhc3NcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgdmFsdWUsIGxlZnQ9Tm9uZSwgcmlnaHQ9Tm9uZSwgcGFyZW50PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIG5ldyBUcmVlIE5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZVxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IGxlZnRcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gcmlnaHRcXG4gICAgICAgIHNlbGYuX3BhcmVudCA9IHBhcmVudFxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX2xlZnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIG5vZGUncyBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfbGVmdFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX2xlZnQoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBc3NpZ24gdGhlIG5vZGUncyBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9sZWZ0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX2xlZnQsIHNldF9jaGlsZF9sZWZ0KVxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX3JpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBub2RlJ3MgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9yaWdodFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX3JpZ2h0KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQXNzaWduIHRoZSBub2RlJ3MgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9yaWdodCA9IHByb3BlcnR5KGdldF9jaGlsZF9yaWdodCwgc2V0X2NoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgZ2V0X3BhcmVudChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbm9kZSdzIHBhcmVudFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgc2V0X3BhcmVudChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFzc2lnbiB0aGUgbm9kZSdzIHBhcmVudFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcGFyZW50ID0gbm9kZVxcblxcbiAgICBwYXJlbnQgPSBwcm9wZXJ0eShnZXRfcGFyZW50LCBzZXRfcGFyZW50KVxcblxcbiAgICBkZWYgaXNfY2hpbGRfbGVmdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgbGVmdCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudCBhbmQgc2VsZi5fcGFyZW50LmNoaWxkX2xlZnQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNfY2hpbGRfcmlnaHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgbm9kZSBpcyBhIHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNfcm9vdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgdHJlZSByb290XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgaXNfbGVhZihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgbGVhZlxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZi5fY2hpbGRfcmlnaHQgb3Igc2VsZi5fY2hpbGRfbGVmdClcXG5cXG4gICAgZGVmIGhhc19hX2NoaWxkKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaGFzIGFueSBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkX3JpZ2h0IG9yIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIGhhc19jaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGhhcyBib3RoIGNoaWxkcmVuXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHQgYW5kIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIGdldF9rZXkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbm9kZSBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9rZXlcXG5cXG4gICAgZGVmIHNldF9rZXkoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBub2RlIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuXFxuICAgIGtleSA9IHByb3BlcnR5KGdldF9rZXksIHNldF9rZXkpXFxuXFxuICAgIGRlZiBnZXRfdmFsdWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbm9kZSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlXFxuXFxuICAgIGRlZiBzZXRfdmFsdWUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5vZGUgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWVcXG5cXG4gICAgdmFsdWUgPSBwcm9wZXJ0eShnZXRfdmFsdWUsIHNldF92YWx1ZSlcXG5cXG4gICAgZGVmIHJlcGxhY2VfcGF5bG9hZChzZWxmLCBrZXksIHZhbHVlLCBsZWZ0LCByaWdodCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGFuZ2Ugbm9kZSBwYXlsb2FkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWVcXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBsZWZ0XFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IHJpZ2h0XFxuICAgICAgICBpZiBzZWxmLmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wYXJlbnQgPSBzZWxmXFxuICAgICAgICBpZiBzZWxmLmNoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBhcmVudCA9IHNlbGZcXG5cXG4gICAgZGVmIGZpbmRfc3VjY2Vzc29yKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgbm9kZSdzIHN1Y2Nlc3NvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3VjY2Vzc29yID0gTm9uZVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc3VjY2Vzc29yID0gc2VsZi5fY2hpbGRfcmlnaHQuZmluZF9taW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9wYXJlbnQ6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc29yID0gc2VsZi5fcGFyZW50XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPSBOb25lXFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzb3IgPSBzZWxmLl9wYXJlbnQuZmluZF9zdWNjZXNzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID0gc2VsZlxcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NvclxcblxcbiAgICBkZWYgZmluZF9taW4oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBzbWFsbGVzdCBub2RlIGluIHRoZSByaWdodCBzdWJ0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZlxcbiAgICAgICAgd2hpbGUgY3VycmVudC5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkX2xlZnRcXG4gICAgICAgIHJldHVybiBjdXJyZW50XFxuXFxuICAgIGRlZiBzcGxpY2Vfb3V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU3BsaWNlIG91dFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5pc19sZWFmKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IE5vbmVcXG4gICAgICAgIGVsaWYgc2VsZi5oYXNfYV9jaGlsZCgpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfbGVmdCA9IHNlbGYuX2NoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IHNlbGYuX2NoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wYXJlbnQgPSBzZWxmLl9wYXJlbnRcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID0gc2VsZi5fY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0XFxuICAgICAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBhcmVudCA9IHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUaGUgc3RhbmRhcmQgaW5vcmRlciB0cmF2ZXJzYWwgb2YgYSBiaW5hcnkgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZjpcXG4gICAgICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcbiAgICAgICAgICAgIHlpZWxkIHNlbGYuX2tleVxcbiAgICAgICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1cXG5cXG5cXG5jbGFzcyBCaW5hcnlTZWFyY2hUcmVlOlxcbiAgICBcXFwiXFxcIlxcXCJCaW5hcnkgc2VhcmNoIHRyZWUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcm9vdCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX3NpemUgPSAwXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVHJlZSBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRyZWUgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NpemVcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSXRlcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9yb290Ll9faXRlcl9fKClcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJbXSBnZXR0ZXIgb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJlc3VsdCA9IHNlbGYuZ2V0KGtleSlcXG4gICAgICAgIGlmIHJlc3VsdDpcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwiRXJyb3IsIGtleSBub3QgaW4gdHJlZVxcXCIpXFxuXFxuICAgIGRlZiBnZXRfcm9vdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0cmVlIHJvb3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9yb290XFxuXFxuICAgIGRlZiBzZXRfcm9vdChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB0cmVlIHJvb3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3Jvb3QgPSBub2RlXFxuXFxuICAgIHJvb3QgPSBwcm9wZXJ0eShnZXRfcm9vdCwgc2V0X3Jvb3QpXFxuXFxuICAgIGRlZiBnZXQoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHJpZXZlIGEgdmFsdWUgYnkgdGhlIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fcm9vdDpcXG4gICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9nZXQoa2V5LCBzZWxmLl9yb290KVxcbiAgICAgICAgICAgIGlmIHJlc3VsdDpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZVxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuXFxuICAgIGRlZiBfZ2V0KHNlbGYsIGtleSwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHJpZXZlIGEgdmFsdWUgYnkgdGhlIGtleSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IGN1cnJlbnRfbm9kZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgaWYgY3VycmVudF9ub2RlLmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRfbm9kZVxcbiAgICAgICAgZWxpZiBrZXkgPCBjdXJyZW50X25vZGUua2V5OlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LCBjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldChrZXksIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiW10gc2V0dGVyIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLnB1dChrZXksIHZhbHVlKVxcblxcbiAgICBkZWYgcHV0KHNlbGYsIGtleSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBzZWxmLl9yb290KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLl9yb290ID0gQmluYXJ5VHJlZU5vZGUoa2V5LCB2YWx1ZSlcXG4gICAgICAgIHNlbGYuX3NpemUgPSBzZWxmLl9zaXplICsgMVxcblxcbiAgICBkZWYgX3B1dChzZWxmLCBrZXksIHZhbHVlLCBjdXJyZW50X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIG5ldyBub2RlIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBrZXkgPCBjdXJyZW50X25vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQgPSBCaW5hcnlUcmVlTm9kZShcXG4gICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIHBhcmVudD1jdXJyZW50X25vZGVcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0ID0gQmluYXJ5VHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiaW4gb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBib29sKHNlbGYuX2dldChrZXksIHNlbGYuX3Jvb3QpKVxcblxcbiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImRlbCBvcGVyYXRvciBvdmVycmlkZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5kZWxldGUoa2V5KVxcblxcbiAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIGJ5IGl0cyBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3NpemUgPiAxOlxcbiAgICAgICAgICAgIG5vZGVfdG9fcmVtb3ZlID0gc2VsZi5fZ2V0KGtleSwgc2VsZi5fcm9vdClcXG4gICAgICAgICAgICBpZiBub2RlX3RvX3JlbW92ZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fZGVsZXRlKG5vZGVfdG9fcmVtb3ZlKVxcbiAgICAgICAgICAgICAgICBzZWxmLl9zaXplID0gc2VsZi5fc2l6ZSAtIDFcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwiRXJyb3IsIGtleSBub3QgaW4gdHJlZVxcXCIpXFxuICAgICAgICBlbGlmIHNlbGYuX3NpemUgPT0gMSBhbmQgc2VsZi5fcm9vdC5rZXkgPT0ga2V5OlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBOb25lXFxuICAgICAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgLSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKFxcXCJFcnJvciwga2V5IG5vdCBpbiB0cmVlXFxcIilcXG5cXG4gICAgZGVmIF9kZWxldGUoc2VsZiwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhIG5vZGUgYnkgaXRzIGtleSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgY3VycmVudF9ub2RlLmlzX2xlYWYoKTogICMgcmVtb3ZpbmcgYSBsZWFmXFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlID09IGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0ID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBOb25lXFxuICAgICAgICBlbGlmIGN1cnJlbnRfbm9kZS5oYXNfY2hpbGRyZW4oKTogICMgcmVtb3ZpbmcgYSBub2RlIHdpdGggdHdvIGNoaWxkcmVuXFxuICAgICAgICAgICAgc3VjY2Vzc29yID0gY3VycmVudF9ub2RlLmZpbmRfc3VjY2Vzc29yKClcXG4gICAgICAgICAgICBzdWNjZXNzb3Iuc3BsaWNlX291dCgpXFxuICAgICAgICAgICAgY3VycmVudF9ub2RlLmtleSA9IHN1Y2Nlc3Nvci5rZXlcXG4gICAgICAgICAgICBjdXJyZW50X25vZGUudmFsdWUgPSBzdWNjZXNzb3IudmFsdWVcXG4gICAgICAgIGVsc2U6ICAjIHJlbW92aW5nIGEgbm9kZSB3aXRoIG9uZSBjaGlsZFxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5nZXRfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQucGFyZW50ID0gY3VycmVudF9ub2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0ID0gY3VycmVudF9ub2RlLmNoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfcmlnaHQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBjdXJyZW50X25vZGUuY2hpbGRfbGVmdFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnJlcGxhY2VfcGF5bG9hZChcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5rZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQudmFsdWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQuY2hpbGRfbGVmdCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5jaGlsZF9yaWdodCxcXG4gICAgICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfbGVmdCA9IGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodFxcbiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnRfbm9kZS5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5yZXBsYWNlX3BheWxvYWQoXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQudmFsdWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmNoaWxkX2xlZnQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmNoaWxkX3JpZ2h0LFxcbiAgICAgICAgICAgICAgICAgICAgKVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pbm9yZGVyKHNlbGYuX3Jvb3QpXFxuXFxuICAgIGRlZiBfaW5vcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluLW9yZGVyIHRyZWUgdHJhdmVyc2FsIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3Qtb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3Bvc3RvcmRlcihzZWxmLl9yb290KVxcblxcbiAgICBkZWYgX3Bvc3RvcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3Qtb3JkZXIgdHJlZSB0cmF2ZXJzYWwgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHRyZWU6XFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZXIodHJlZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSwgZW5kPVxcXCIgXFxcIilcXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9wcmVvcmRlcihzZWxmLl9yb290KVxcblxcbiAgICBkZWYgX3ByZW9yZGVyKHNlbGYsIHRyZWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVyKHRyZWUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgY2xlYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYWxsIG5vZGVzXFxcIlxcXCJcXFwiXFxuICAgICAgICB3aGlsZSBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHNlbGYuZGVsZXRlKHNlbGYuX3Jvb3Qua2V5KVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYmluYXJ5X3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IG9wZXJhdG9yXFxuXFxuXFxuY2xhc3MgQmluYXJ5VHJlZTpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIEEgcmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIEJpbmFyeSBUcmVlXFxuICAgIFVzaW5nIGxpbmtzIGFuZCBOb2RlcyBhcHByb2FjaC5cXG5cXG4gICAgTW9kaWZpZWQgdG8gYWxsb3cgZm9yIHRyZWVzIHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gb3RoZXIgdHJlZXNcXG4gICAgcmF0aGVyIHRoYW4gYWx3YXlzIGNyZWF0aW5nIGEgbmV3IHRyZWUgaW4gdGhlIGluc2VydF9mZWZ0IG9yIGluc2VydF9yaWdodFxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gTm9uZVxcblxcbiAgICBkZWYgZ2V0X3Jvb3RfdmFsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHJvb3Qga2V5IHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fa2V5XFxuXFxuICAgIGRlZiBzZXRfcm9vdF92YWwoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCByb290IGtleSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuXFxuICAgIHJvb3QgPSBwcm9wZXJ0eShnZXRfcm9vdF92YWwsIHNldF9yb290X3ZhbClcXG5cXG4gICAgZGVmIGdldF9jaGlsZF9sZWZ0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGxlZnQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9sZWZ0XFxuXFxuICAgIGRlZiBzZXRfY2hpbGRfbGVmdChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9sZWZ0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX2xlZnQsIHNldF9jaGlsZF9sZWZ0KVxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX3JpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHRcXG5cXG4gICAgZGVmIHNldF9jaGlsZF9yaWdodChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCByaWdodCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSBub2RlXFxuXFxuICAgIGNoaWxkX3JpZ2h0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX3JpZ2h0LCBzZXRfY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBpc19sZWFmKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgYSBub2RlIGlzIGxlYWZcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiAobm90IHNlbGYuX2NoaWxkX2xlZnQpIGFuZCAobm90IHNlbGYuX2NoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgaW5zZXJ0X2xlZnQoc2VsZiwgbmV3X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSW5zZXJ0IGxlZnQgc3VidHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShuZXdfbm9kZSwgQmluYXJ5VHJlZSk6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUgPSBuZXdfbm9kZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IEJpbmFyeVRyZWUobmV3X25vZGUpXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlLnNldF9jaGlsZF9sZWZ0KHNlbGYuX2NoaWxkX2xlZnQpXFxuXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbmV3X3N1YnRyZWVcXG5cXG4gICAgZGVmIGluc2VydF9yaWdodChzZWxmLCBuZXdfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbnNlcnQgcmlnaHQgc3VidHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShuZXdfbm9kZSwgQmluYXJ5VHJlZSk6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUgPSBuZXdfbm9kZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IEJpbmFyeVRyZWUobmV3X25vZGUpXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZS5zZXRfY2hpbGRfcmlnaHQoc2VsZi5fY2hpbGRfcmlnaHQpXFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IG5ld19zdWJ0cmVlXFxuXFxuICAgIGRlZiBwcmVvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByZS1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcHJpbnQoc2VsZi5fa2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnByZW9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnByZW9yZGVyKClcXG5cXG4gICAgZGVmIGlub3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbi1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0Lmlub3JkZXIoKVxcbiAgICAgICAgcHJpbnQoc2VsZi5fa2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQuaW5vcmRlcigpXFxuXFxuICAgIGRlZiBwb3N0b3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQb3N0LW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQucG9zdG9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBvc3RvcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuXFxuICAgIGRlZiBwcmludF9leHAoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQcmludCBhbiBleHByZXNzaW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHByaW50KFxcXCIoXFxcIiwgZW5kPVxcXCIgXFxcIilcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnByaW50X2V4cCgpXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9yaWdodC5wcmludF9leHAoKVxcbiAgICAgICAgICAgIHByaW50KFxcXCIpXFxcIiwgZW5kPVxcXCIgXFxcIilcXG5cXG4gICAgZGVmIHBvc3RvcmRlcl9ldmFsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUG9zdG9yZGVyIGV2YWx1YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG9wZXJhdGlvbnMgPSB7XFxuICAgICAgICAgICAgXFxcIitcXFwiOiBvcGVyYXRvci5hZGQsXFxuICAgICAgICAgICAgXFxcIi1cXFwiOiBvcGVyYXRvci5zdWIsXFxuICAgICAgICAgICAgXFxcIipcXFwiOiBvcGVyYXRvci5tdWwsXFxuICAgICAgICAgICAgXFxcIi9cXFwiOiBvcGVyYXRvci50cnVlZGl2LFxcbiAgICAgICAgfVxcbiAgICAgICAgcmVzdWx0XzEgPSBOb25lXFxuICAgICAgICByZXN1bHRfMiA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgcmVzdWx0XzEgPSBzZWxmLl9jaGlsZF9sZWZ0LnBvc3RvcmRlcl9ldmFsKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHJlc3VsdF8yID0gc2VsZi5fY2hpbGRfcmlnaHQucG9zdG9yZGVyX2V2YWwoKVxcbiAgICAgICAgaWYgcmVzdWx0XzEgYW5kIHJlc3VsdF8yOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25zW3NlbGYuX2tleV0ocmVzdWx0XzEsIHJlc3VsdF8yKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBkZWYgaGVpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSGVpZ2h0IG9mIGEgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IHNlbGYuX2tleTpcXG4gICAgICAgICAgICByZXR1cm4gLTFcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgaGVpZ2h0X2xlZnQgPSBzZWxmLl9jaGlsZF9sZWZ0LmhlaWdodCgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGhlaWdodF9sZWZ0ID0gLTFcXG5cXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIGhlaWdodF9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0LmhlaWdodCgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGhlaWdodF9yaWdodCA9IC0xXFxuXFxuICAgICAgICByZXR1cm4gMSArIG1heChoZWlnaHRfbGVmdCwgaGVpZ2h0X3JpZ2h0KVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgYSB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5zaXplKClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb3VudCBub2RlcyBpbiBhIHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIG5vdCBzZWxmLl9rZXk6XFxuICAgICAgICAgICAgcmV0dXJuIDBcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgY2hpbGRyZW5fbGVmdCA9IHNlbGYuX2NoaWxkX2xlZnQuc2l6ZSgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNoaWxkcmVuX2xlZnQgPSAwXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBjaGlsZHJlbl9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0LnNpemUoKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBjaGlsZHJlbl9yaWdodCA9IDBcXG5cXG4gICAgICAgIHJldHVybiAxICsgY2hpbGRyZW5fbGVmdCArIGNoaWxkcmVuX3JpZ2h0XFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9wcmlvcml0eV9xdWV1ZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfaGVhcCBpbXBvcnQgQmluYXJ5SGVhcFxcblxcblxcbmNsYXNzIFByaW9yaXR5UXVldWUoQmluYXJ5SGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBoZWFwIHRha2VzIChrZXksIHZhbHVlKSBwYWlycyB3aGVyZSBrZXkgc2lnbmlmaWVzIHByaW9yaXR5XFxuICAgIFdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGtleXMgYXJlIGFsbCBjb21wYXJhYmxlLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIGNoYW5nZV9wcmlvcml0eShzZWxmLCBuZXdfcHJpb3JpdHksIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoYW5nZSB0aGUgcHJpb3JpdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIGtleV90b19tb3ZlID0gMFxcbiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuX2hlYXApKTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2ldWzFdID09IHZhbHVlOlxcbiAgICAgICAgICAgICAgICBrZXlfdG9fbW92ZSA9IGlcXG4gICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgIGlmIGtleV90b19tb3ZlID4gLTE6XFxuICAgICAgICAgICAgc2VsZi5faGVhcFtrZXlfdG9fbW92ZV0gPSAobmV3X3ByaW9yaXR5LCBzZWxmLl9oZWFwW2tleV90b19tb3ZlXVsxXSlcXG4gICAgICAgICAgICBzZWxmLl9wZXJjX3VwKGtleV90b19tb3ZlKVxcblwiLFwic3JjL2xpYi9weXRob25lZC9fX2luaXRfXy5weVwiOlwiXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvX19pbml0X18ucHlcIjpcIlxcblxcblxcbmZyb20gLmF2bCBpbXBvcnQgQXJib2xBVkxcXG5mcm9tIC5hYmIgaW1wb3J0IEFyYm9sQmluYXJpb0J1c3F1ZWRhXFxuZnJvbSAubW9udGljdWxvQmluYXJpbyBpbXBvcnQgTW9udGljdWxvQmluYXJpb1xcblxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9hcmJvbGVzL2FiYi5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiNcXG4jYWJiLnB5XFxuXFxuY2xhc3MgQXJib2xCaW5hcmlvQnVzcXVlZGE6XFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYucmFpeiA9IE5vbmVcXG4gICAgICAgIHNlbGYudGFtYW5vID0gMFxcblxcbiAgICBkZWYgYWdyZWdhcihzZWxmLGNsYXZlLHZhbG9yKTpcXG4gICAgICAgIGlmIHNlbGYucmFpejpcXG4gICAgICAgICAgICBzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLHNlbGYucmFpeilcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5yYWl6ID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yKVxcbiAgICAgICAgc2VsZi50YW1hbm8gPSBzZWxmLnRhbWFubyArIDFcXG5cXG4gICAgZGVmIF9hZ3JlZ2FyKHNlbGYsY2xhdmUsdmFsb3Isbm9kb0FjdHVhbCk6XFxuICAgICAgICBpZiBjbGF2ZSA8IG5vZG9BY3R1YWwuY2xhdmU6XFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgc2VsZi5fYWdyZWdhcihjbGF2ZSx2YWxvcixub2RvQWN0dWFsLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICAgICBzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvRGVyZWNobyA9IE5vZG9BcmJvbChjbGF2ZSx2YWxvcixwYWRyZT1ub2RvQWN0dWFsKVxcbiBcXG4gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsYyx2KTpcXG4gICAgICAgIHNlbGYuYWdyZWdhcihjLHYpXFxuXFxuICAgIGRlZiBvYnRlbmVyKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgaWYgc2VsZi5yYWl6OlxcbiAgICAgICAgICAgIHJlcyA9IHNlbGYuX29idGVuZXIoY2xhdmUsc2VsZi5yYWl6KVxcbiAgICAgICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5jYXJnYVV0aWxcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcblxcbiAgICBkZWYgX29idGVuZXIoc2VsZixjbGF2ZSxub2RvQWN0dWFsKTpcXG4gICAgXFx0aWYgbm90IG5vZG9BY3R1YWw6XFxuICAgIFxcdCAgICByZXR1cm4gTm9uZVxcbiAgICBcXHRlbGlmIG5vZG9BY3R1YWwuY2xhdmUgPT0gY2xhdmU6XFxuICAgIFxcdCAgICByZXR1cm4gbm9kb0FjdHVhbFxcbiAgICBcXHRlbGlmIGNsYXZlIDwgbm9kb0FjdHVhbC5jbGF2ZTpcXG4gICAgXFx0ICAgIHJldHVybiBzZWxmLl9vYnRlbmVyKGNsYXZlLG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkbylcXG4gICAgXFx0ZWxzZTpcXG4gICAgXFx0ICAgIHJldHVybiBzZWxmLl9vYnRlbmVyKGNsYXZlLG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pICAgICAgICBcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgcmVzID0gc2VsZi5vYnRlbmVyKGNsYXZlKSBcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICByZXR1cm4gcmVzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwgbGEgY2xhdmUgbm8gZXN0w6EgZW4gZWwgw6FyYm9sJylcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGNsYXZlKTpcXG4gICAgXFx0aWYgc2VsZi5fb2J0ZW5lcihjbGF2ZSxzZWxmLnJhaXopOlxcbiAgICBcXHQgICAgcmV0dXJuIFRydWVcXG4gICAgXFx0ZWxzZTpcXG4gICAgXFx0ICAgIHJldHVybiBGYWxzZVxcbiAgICAgICBcXG4gICAgZGVmIGxvbmdpdHVkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYudGFtYW5vXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYudGFtYW5vXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJhaXouX19pdGVyX18oKVxcblxcbiAgICBkZWYgZWxpbWluYXIoc2VsZixjbGF2ZSk6XFxuICAgICAgICBpZiBzZWxmLnRhbWFubyA+IDE6XFxuICAgICAgICAgICBub2RvQUVsaW1pbmFyID0gc2VsZi5fb2J0ZW5lcihjbGF2ZSxzZWxmLnJhaXopXFxuICAgIFxcdCAgIGlmIG5vZG9BRWxpbWluYXI6XFxuICAgIFxcdCAgICAgICBzZWxmLnJlbW92ZXIobm9kb0FFbGltaW5hcilcXG4gICAgXFx0ICAgICAgIHNlbGYudGFtYW5vID0gc2VsZi50YW1hbm8tMVxcbiAgICBcXHQgICBlbHNlOlxcbiAgICBcXHQgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBsYSBjbGF2ZSBubyBlc3TDoSBlbiBlbCDDoXJib2wnKVxcbiAgICAgICAgZWxpZiBzZWxmLnRhbWFubyA9PSAxIGFuZCBzZWxmLnJhaXouY2xhdmUgPT0gY2xhdmU6XFxuICAgIFxcdCAgICBzZWxmLnJhaXogPSBOb25lXFxuICAgIFxcdCAgICBzZWxmLnRhbWFubyA9IHNlbGYudGFtYW5vIC0gMVxcbiAgICAgICAgZWxzZTpcXG4gICAgXFx0ICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwgbGEgY2xhdmUgbm8gZXN0w6EgZW4gZWwgw6FyYm9sJylcXG5cXG4gICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgc2VsZi5lbGltaW5hcihjbGF2ZSlcXG5cXG4gICAgZGVmIHJlbW92ZXIoc2VsZixub2RvQWN0dWFsKTpcXG4gICAgICAgIGlmIG5vZG9BY3R1YWwuZXNIb2phKCk6ICNob2phXFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbCA9PSBub2RvQWN0dWFsLnBhZHJlLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbyA9IE5vbmVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gTm9uZVxcbiAgICAgICAgZWxpZiBub2RvQWN0dWFsLnRpZW5lQW1ib3NIaWpvcygpOiAjaW50ZXJpb3JcXG4gICAgICAgICAgICBzdWMgPSBub2RvQWN0dWFsLmVuY29udHJhclN1Y2Vzb3IoKVxcbiAgICAgICAgICAgIHN1Yy5lbXBhbG1hcigpXFxuICAgICAgICAgICAgbm9kb0FjdHVhbC5jbGF2ZSA9IHN1Yy5jbGF2ZVxcbiAgICAgICAgICAgIG5vZG9BY3R1YWwuY2FyZ2FVdGlsID0gc3VjLmNhcmdhVXRpbFxcblxcbiAgICAgICAgZWxzZTogIyBlc3RlIG5vZG8gdGllbmUgdW4gKDEpIGhpam9cXG4gICAgICAgICAgICBpZiBub2RvQWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICBpZiBub2RvQWN0dWFsLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLnBhZHJlID0gbm9kb0FjdHVhbC5wYWRyZVxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5wYWRyZS5oaWpvSXpxdWllcmRvID0gbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgICAgIGVsaWYgbm9kb0FjdHVhbC5lc0hpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnJlZW1wbGF6YXJEYXRvRGVOb2RvKG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5jbGF2ZSwgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmNhcmdhVXRpbCwgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmhpam9JenF1aWVyZG8sIG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5oaWpvRGVyZWNobylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBub2RvQWN0dWFsLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5wYWRyZSA9IG5vZG9BY3R1YWwucGFkcmVcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbyA9IG5vZG9BY3R1YWwuaGlqb0RlcmVjaG9cXG4gICAgICAgICAgICAgICAgZWxpZiBub2RvQWN0dWFsLmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gbm9kb0FjdHVhbC5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5yZWVtcGxhemFyRGF0b0RlTm9kbyhub2RvQWN0dWFsLmhpam9EZXJlY2hvLmNsYXZlLCBub2RvQWN0dWFsLmhpam9EZXJlY2hvLmNhcmdhVXRpbCwgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5oaWpvSXpxdWllcmRvLCBub2RvQWN0dWFsLmhpam9EZXJlY2hvLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgaW5vcmRlbihzZWxmKTpcXG4gICAgICAgIHNlbGYuX2lub3JkZW4oc2VsZi5yYWl6KVxcblxcbiAgICBkZWYgX2lub3JkZW4oc2VsZixhcmJvbCk6XFxuICAgICAgICBpZiBhcmJvbCAhPSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZW4oYXJib2wuaGlqb0l6cXVpZXJkbylcXG4gICAgICAgICAgICBwcmludChhcmJvbC5jbGF2ZSlcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVuKGFyYm9sLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgcG9zdG9yZGVuKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcG9zdG9yZGVuKHNlbGYucmFpeilcXG5cXG4gICAgZGVmIF9wb3N0b3JkZW4oc2VsZiwgYXJib2wpOlxcbiAgICAgICAgaWYgYXJib2w6XFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVuKGFyYm9sLmhpam9EZXJlY2hvKVxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlbihhcmJvbC5oaWpvSXpxdWllcmRvKVxcbiAgICAgICAgICAgIHByaW50KGFyYm9sLmNsYXZlKSAgICAgICAgICAgIFxcblxcbiAgICBkZWYgcHJlb3JkZW4oc2VsZik6XFxuICAgICAgICBzZWxmLl9wcmVvcmRlbihzZWxmLHNlbGYucmFpeilcXG5cXG4gICAgZGVmIF9wcmVvcmRlbihzZWxmLGFyYm9sKTpcXG4gICAgICAgIGlmIGFyYm9sOlxcbiAgICAgICAgICAgIHByaW50KGFyYm9sLmNsYXZlKSAgICAgICAgICAgIFxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVuKGFyYm9sLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgc2VsZi5fcHJlb3JkZW4oYXJib2wuaGlqb0RlcmVjaG8pXFxuXFxuXFxuY2xhc3MgTm9kb0FyYm9sOlxcbiAgIGRlZiBfX2luaXRfXyhzZWxmLGNsYXZlLHZhbG9yLGl6cXVpZXJkbz1Ob25lLGRlcmVjaG89Tm9uZSxwYWRyZT1Ob25lKTpcXG4gICAgICAgIHNlbGYuY2xhdmUgPSBjbGF2ZVxcbiAgICAgICAgc2VsZi5jYXJnYVV0aWwgPSB2YWxvclxcbiAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gaXpxdWllcmRvXFxuICAgICAgICBzZWxmLmhpam9EZXJlY2hvID0gZGVyZWNob1xcbiAgICAgICAgc2VsZi5wYWRyZSA9IHBhZHJlXFxuICAgICAgICBzZWxmLmZhY3RvckVxdWlsaWJyaW8gPSAwXFxuXFxuICAgIGRlZiB0aWVuZUhpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgICAgIFxcbiAgICBkZWYgdGllbmVIaWpvRGVyZWNobyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvXFxuXFxuICAgIGRlZiBlc0hpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wYWRyZSBhbmQgc2VsZi5wYWRyZS5oaWpvSXpxdWllcmRvID09IHNlbGZcXG4gICAgXFxuICAgIGRlZiBlc0hpam9EZXJlY2hvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucGFkcmUgYW5kIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPT0gc2VsZlxcblxcbiAgICBkZWYgZXNSYWl6KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnBhZHJlXFxuXFxuICAgIGRlZiBlc0hvamEoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IChzZWxmLmhpam9EZXJlY2hvIG9yIHNlbGYuaGlqb0l6cXVpZXJkbylcXG5cXG4gICAgZGVmIHRpZW5lQWxndW5IaWpvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaGlqb0RlcmVjaG8gb3Igc2VsZi5oaWpvSXpxdWllcmRvXFxuXFxuICAgIGRlZiB0aWVuZUFtYm9zSGlqb3Moc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvRGVyZWNobyBhbmQgc2VsZi5oaWpvSXpxdWllcmRvXFxuXFxuICAgIGRlZiByZWVtcGxhemFyRGF0b0RlTm9kbyhzZWxmLGNsYXZlLHZhbG9yLGhpenEsaGRlcik6XFxuICAgICAgICBzZWxmLmNsYXZlID0gY2xhdmVcXG4gICAgICAgIHNlbGYuY2FyZ2FVdGlsID0gdmFsb3JcXG4gICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IGhpenFcXG4gICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBoZGVyXFxuICAgICAgICBpZiBzZWxmLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5wYWRyZSA9IHNlbGZcXG4gICAgICAgIGlmIHNlbGYudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8ucGFkcmUgPSBzZWxmICAgIFxcblxcbiAgICBkZWYgZW5jb250cmFyU3VjZXNvcihzZWxmKTpcXG4gICAgICAgIHN1YyA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgIHN1YyA9IHNlbGYuaGlqb0RlcmVjaG8uZW5jb250cmFyTWluKClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5wYWRyZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIHN1YyA9IHNlbGYucGFkcmVcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgICAgICAgICAgICAgICAgICBzdWMgPSBzZWxmLnBhZHJlLmVuY29udHJhclN1Y2Vzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IHNlbGZcXG4gICAgICAgIHJldHVybiBzdWNcXG5cXG4gICAgZGVmIGVtcGFsbWFyKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5lc0hvamEoKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IE5vbmVcXG4gICAgICAgIGVsaWYgc2VsZi50aWVuZUFsZ3VuSGlqbygpOlxcbiAgICAgICAgICAgIGlmIHNlbGYudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLnBhZHJlID0gc2VsZi5wYWRyZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9EZXJlY2hvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9EZXJlY2hvID0gc2VsZi5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnBhZHJlID0gc2VsZi5wYWRyZVxcblxcbiAgICBkZWYgZW5jb250cmFyTWluKHNlbGYpOlxcbiAgICAgICAgYWN0dWFsID0gc2VsZlxcbiAgICAgICAgd2hpbGUgYWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgIGFjdHVhbCA9IGFjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICByZXR1cm4gYWN0dWFsXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGY6XFxuICAgIFxcdCAgICBpZiBzZWxmLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICBcXHQgICAgICAgIGZvciBlbGVtIGluIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgXFx0XFx0ICAgIHlpZWxkIGVsZW1cXG4gICAgICAgICAgICB5aWVsZCBzZWxmLmNsYXZlXFxuICAgIFxcdCAgICBpZiBzZWxmLnRpZW5lSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgXFx0XFx0ICAgIHlpZWxkIGVsZW1cXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9hcmJvbEJpbmFyaW8ucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jIFxcbiNhcmJvbEJpbmFyaW8ucHlcXG5cXG5jbGFzcyBBcmJvbEJpbmFyaW86XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLG9iamV0b1JhaXopOlxcbiAgICAgICAgc2VsZi5jbGF2ZSA9IG9iamV0b1JhaXpcXG4gICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IE5vbmVcXG4gICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgIFxcbiAgICBkZWYgaW5zZXJ0YXJJenF1aWVyZG8oc2VsZixudWV2b05vZG8pOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvID09IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgIGVsc2U6ICBcXG4gICAgICAgICAgICB0ID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgICAgICB0Lmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8gPSB0XFxuXFxuICAgIGRlZiBpbnNlcnRhckRlcmVjaG8oc2VsZixudWV2b05vZG8pOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobyA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBBcmJvbEJpbmFyaW8obnVldm9Ob2RvKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICB0ID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgICAgICB0Lmhpam9EZXJlY2hvID0gc2VsZi5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSB0XFxuXFxuICAgIGRlZiBlc0hvamEoc2VsZik6XFxuICAgICAgICByZXR1cm4gKChub3Qgc2VsZi5oaWpvSXpxdWllcmRvKSBhbmQgKG5vdCBzZWxmLmhpam9EZXJlY2hvKSlcXG5cXG4gICAgZGVmIG9idGVuZXJIaWpvRGVyZWNobyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lckhpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgIFxcbiAgICBkZWYgYXNpZ25hclZhbG9yUmFpeihzZWxmLG9iaik6XFxuICAgICAgICBzZWxmLmNsYXZlID0gb2JqXFxuXFxuICAgIGRlZiBvYnRlbmVyVmFsb3JSYWl6KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY2xhdmVcXG5cXG4gICAgZGVmIGlub3JkZW4oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLmlub3JkZW4oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5pbm9yZGVuKClcXG5cXG4gICAgZGVmIHBvc3RvcmRlbihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucG9zdG9yZGVuKClcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5wb3N0b3JkZW4oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG5cXG4gICAgZGVmIHByZW9yZGVuKHNlbGYpOlxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucHJlb3JkZW4oKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnByZW9yZGVuKClcXG5cXG4gICAgZGVmIGltcHJpbWlyRXhwcmVzaW9uKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgICAgIHByaW50KCcoJywgZW5kPScgJylcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8uaW1wcmltaXJFeHByZXNpb24oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSwgZW5kPScgJylcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5pbXByaW1pckV4cHJlc2lvbigpXFxuICAgICAgICAgICAgcHJpbnQoJyknLCBlbmQ9JyAnKVxcblxcbiAgICBkZWYgZXZhbFBvc3RvcmRlbihzZWxmKTpcXG4gICAgICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICAgICAgcmVzMSA9IE5vbmVcXG4gICAgICAgIHJlczIgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgcmVzMSA9IHNlbGYuaGlqb0l6cXVpZXJkby5ldmFsUG9zdG9yZGVuKCkgICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICByZXMyID0gc2VsZi5oaWpvRGVyZWNoby5ldmFsUG9zdG9yZGVuKCkgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcnNbc2VsZi5jbGF2ZV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2xhdmVcXG5cXG5kZWYgaW5vcmRlbihhcmJvbCk6XFxuICAgIGlmIGFyYm9sICE9IE5vbmU6XFxuICAgICAgICBpbm9yZGVuKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpXFxuICAgICAgICBwcmludChhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCkpXFxuICAgICAgICBpbm9yZGVuKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKVxcblxcbmRlZiBpbXByaW1pckV4cHJlc2lvbihhcmJvbCk6XFxuICAgIGlmIGFyYm9sLmhpam9JenF1aWVyZG86XFxuICAgICAgICBwcmludCgnKCcsIGVuZD0nICcpXFxuICAgICAgICBpbXByaW1pckV4cHJlc2lvbihhcmJvbC5vYnRlbmVySGlqb0l6cXVpZXJkbygpKVxcbiAgICBwcmludChhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCksIGVuZD0nICcpXFxuICAgIGlmIGFyYm9sLmhpam9EZXJlY2hvOlxcbiAgICAgICAgaW1wcmltaXJFeHByZXNpb24oYXJib2wub2J0ZW5lckhpam9EZXJlY2hvKCkpXFxuICAgICAgICBwcmludCgnKScsIGVuZD0nICcpIFxcblxcbmRlZiBpbXByaW1pckV4cHJlc2lvbihhcmJvbCk6XFxuICB2YWxvckNhZGVuYSA9IFxcXCJcXFwiXFxuICBpZiBhcmJvbDpcXG4gICAgICB2YWxvckNhZGVuYSA9ICcoJyArIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpXFxuICAgICAgdmFsb3JDYWRlbmEgPSB2YWxvckNhZGVuYSArIHN0cihhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCkpXFxuICAgICAgdmFsb3JDYWRlbmEgPSB2YWxvckNhZGVuYSArIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKSsnKSdcXG4gIHJldHVybiB2YWxvckNhZGVuYVxcblxcbmRlZiBldmFsUG9zdG9yZGVuKGFyYm9sKTpcXG4gICAgb3BlcmFkb3JlcyA9IHsnKyc6b3BlcmF0b3IuYWRkLCAnLSc6b3BlcmF0b3Iuc3ViLCAnKic6b3BlcmF0b3IubXVsLCAnLyc6b3BlcmF0b3IudHJ1ZWRpdn1cXG4gICAgcmVzMSA9IE5vbmVcXG4gICAgcmVzMiA9IE5vbmVcXG4gICAgaWYgYXJib2w6XFxuICAgICAgICByZXMxID0gZXZhbFBvc3RvcmRlbihhcmJvbC5vYnRlbmVySGlqb0l6cXVpZXJkbygpKSAjLy8gXFxcXGxhYmVse3BlbGVmdH1cXG4gICAgICAgIHJlczIgPSBldmFsUG9zdG9yZGVuKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKSAgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcmFkb3Jlc1thcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCldKHJlczEscmVzMikgIy8vIFxcXFxsYWJlbHtwZWV2YWx9XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KClcXG5cXG5kZWYgYWx0dXJhKGFyYm9sKTpcXG4gICAgaWYgYXJib2wgPT0gTm9uZTpcXG4gICAgICAgIHJldHVybiAtMVxcbiAgICBlbHNlOlxcbiAgICAgICAgcmV0dXJuIDEgKyBtYXgoYWx0dXJhKGFyYm9sLmhpam9JenF1aWVyZG8pLGFsdHVyYShhcmJvbC5oaWpvRGVyZWNobykpXFxuXFxudCA9IEFyYm9sQmluYXJpbyg3KVxcbnQuaW5zZXJ0YXJJenF1aWVyZG8oMylcXG50Lmluc2VydGFyRGVyZWNobyg5KVxcbmlub3JkZW4odClcXG5pbXBvcnQgb3BlcmF0b3JcXG54ID0gQXJib2xCaW5hcmlvKCcqJylcXG54Lmluc2VydGFySXpxdWllcmRvKCcrJylcXG5sID0geC5vYnRlbmVySGlqb0l6cXVpZXJkbygpXFxubC5pbnNlcnRhckl6cXVpZXJkbyg0KVxcbmwuaW5zZXJ0YXJEZXJlY2hvKDUpXFxueC5pbnNlcnRhckRlcmVjaG8oNylcXG5wcmludChpbXByaW1pckV4cHJlc2lvbih4KSlcXG5wcmludChldmFsUG9zdG9yZGVuKHgpKVxcbnByaW50KGFsdHVyYSh4KSlcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9hdmwucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2F2bC5weVxcblxcbmZyb20gLmFiYiBpbXBvcnQgQXJib2xCaW5hcmlvQnVzcXVlZGEsIE5vZG9BcmJvbFxcblxcbmNsYXNzIEFyYm9sQVZMKEFyYm9sQmluYXJpb0J1c3F1ZWRhKTpcXG5cXG4gICAgZGVmIF9hZ3JlZ2FyKHNlbGYsY2xhdmUsdmFsb3Isbm9kb0FjdHVhbCk6XFxuICAgIFxcdGlmIGNsYXZlIDwgbm9kb0FjdHVhbC5jbGF2ZTpcXG4gICAgXFx0ICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdFxcdHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICBcXHQgICAgZWxzZTpcXG4gICAgXFx0XFx0bm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuICAgIFxcdFxcdHNlbGYuYWN0dWFsaXphckVxdWlsaWJyaW8obm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9EZXJlY2hvKCk6XFxuICAgIFxcdFxcdHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvRGVyZWNobylcXG4gICAgXFx0ICAgIGVsc2U6XFxuICAgIFxcdFxcdG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8gPSBOb2RvQXJib2woY2xhdmUsdmFsb3IscGFkcmU9bm9kb0FjdHVhbClcXG4gICAgXFx0XFx0c2VsZi5hY3R1YWxpemFyRXF1aWxpYnJpbyhub2RvQWN0dWFsLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgYWN0dWFsaXphckVxdWlsaWJyaW8oc2VsZixub2RvKTpcXG4gICAgXFx0aWYgbm9kby5mYWN0b3JFcXVpbGlicmlvID4gMSBvciBub2RvLmZhY3RvckVxdWlsaWJyaW8gPCAtMTpcXG4gICAgXFx0ICAgIHNlbGYucmVlcXVpbGlicmFyKG5vZG8pICAgIFxcbiAgICBcXHQgICAgcmV0dXJuXFxuICAgIFxcdGlmIG5vZG8ucGFkcmUgIT0gTm9uZTpcXG4gICAgXFx0ICAgIGlmIG5vZG8uZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdFxcdCAgICBub2RvLnBhZHJlLmZhY3RvckVxdWlsaWJyaW8gKz0gMVxcbiAgICBcXHQgICAgZWxpZiBub2RvLmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgXFx0XFx0ICAgIG5vZG8ucGFkcmUuZmFjdG9yRXF1aWxpYnJpbyAtPSAxXFxuXFxuICAgIFxcdCAgICBpZiBub2RvLnBhZHJlLmZhY3RvckVxdWlsaWJyaW8gIT0gMDpcXG4gICAgXFx0XFx0ICAgIHNlbGYuYWN0dWFsaXphckVxdWlsaWJyaW8obm9kby5wYWRyZSlcXG5cXG4gICAgZGVmIHJlZXF1aWxpYnJhcihzZWxmLG5vZG8pOlxcbiAgICAgICAgaWYgbm9kby5mYWN0b3JFcXVpbGlicmlvIDwgMDpcXG5cXHQgICAgaWYgbm9kby5oaWpvRGVyZWNoby5mYWN0b3JFcXVpbGlicmlvID4gMDpcXG5cXHQgICAgICAgIHNlbGYucm90YXJEZXJlY2hhKG5vZG8uaGlqb0RlcmVjaG8pXFxuXFx0ICAgICAgICBzZWxmLnJvdGFySXpxdWllcmRhKG5vZG8pXFxuXFx0ICAgIGVsc2U6XFxuXFx0ICAgICAgICBzZWxmLnJvdGFySXpxdWllcmRhKG5vZG8pXFxuICAgICAgICBlbGlmIG5vZG8uZmFjdG9yRXF1aWxpYnJpbyA+IDA6XFxuXFx0ICAgIGlmIG5vZG8uaGlqb0l6cXVpZXJkby5mYWN0b3JFcXVpbGlicmlvIDwgMDpcXG5cXHQgICAgICAgIHNlbGYucm90YXJJenF1aWVyZGEobm9kby5oaWpvSXpxdWllcmRvKVxcblxcdCAgICAgICAgc2VsZi5yb3RhckRlcmVjaGEobm9kbylcXG5cXHQgICAgIGVsc2U6XFxuXFx0ICAgICAgICBzZWxmLnJvdGFyRGVyZWNoYShub2RvKVxcbiAgICAgICAgICAgXFxuICAgIGRlZiByb3Rhckl6cXVpZXJkYShzZWxmLHJvdFJhaXopOlxcbiAgICBcXHRudWV2YVJhaXogPSByb3RSYWl6Lmhpam9EZXJlY2hvXFxuICAgIFxcdHJvdFJhaXouaGlqb0RlcmVjaG8gPSBudWV2YVJhaXouaGlqb0l6cXVpZXJkb1xcbiAgICBcXHRpZiBudWV2YVJhaXouaGlqb0l6cXVpZXJkbyAhPSBOb25lOlxcbiAgICBcXHQgICAgbnVldmFSYWl6Lmhpam9JenF1aWVyZG8ucGFkcmUgPSByb3RSYWl6XFxuICAgIFxcdG51ZXZhUmFpei5wYWRyZSA9IHJvdFJhaXoucGFkcmVcXG4gICAgXFx0aWYgcm90UmFpei5lc1JhaXooKTpcXG4gICAgXFx0ICAgIHNlbGYucmFpeiA9IG51ZXZhUmFpelxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgaWYgcm90UmFpei5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgXFx0ICAgICAgICByb3RSYWl6LnBhZHJlLmhpam9JenF1aWVyZG8gPSBudWV2YVJhaXpcXG4gICAgXFx0ICAgIGVsc2U6XFxuICAgIFxcdCAgICBcXHRyb3RSYWl6LnBhZHJlLmhpam9EZXJlY2hvID0gbnVldmFSYWl6XFxuICAgIFxcdG51ZXZhUmFpei5oaWpvSXpxdWllcmRvID0gcm90UmFpelxcbiAgICBcXHRyb3RSYWl6LnBhZHJlID0gbnVldmFSYWl6XFxuICAgIFxcdHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyA9IHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyArIDEgLSBtaW4obnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8sIDApXFxuICAgIFxcdG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvID0gbnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gKyAxICsgbWF4KHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbywgMClcXG5cXG4gICAgZGVmIHJvdGFyRGVyZWNoYShzZWxmLHJvdFJhaXopOlxcbiAgICAgICAgbnVldmFSYWl6ID0gcm90UmFpei5oaWpvSXpxdWllcmRvXFxuICAgICAgICByb3RSYWl6Lmhpam9JenF1aWVyZG8gPSBudWV2YVJhaXouaGlqb0RlcmVjaG9cXG4gICAgICAgIGlmIG51ZXZhUmFpei5oaWpvRGVyZWNobyAhPSBOb25lOlxcbiAgICAgICAgICAgIG51ZXZhUmFpei5oaWpvRGVyZWNoby5wYWRyZSA9IHJvdFJhaXpcXG4gICAgICAgIG51ZXZhUmFpei5wYWRyZSA9IHJvdFJhaXoucGFkcmVcXG4gICAgICAgIGlmIHJvdFJhaXouZXNSYWl6KCk6XFxuICAgICAgICAgICAgc2VsZi5yYWl6ID0gbnVldmFSYWl6XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdFJhaXouZXNIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICByb3RSYWl6LnBhZHJlLmhpam9EZXJlY2hvID0gbnVldmFSYWl6XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90UmFpei5wYWRyZS5oaWpvSXpxdWllcmRvID0gbnVldmFSYWl6XFxuICAgICAgICBudWV2YVJhaXouaGlqb0RlcmVjaG8gPSByb3RSYWl6XFxuICAgICAgICByb3RSYWl6LnBhZHJlID0gbnVldmFSYWl6XFxuICAgICAgICByb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSByb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8gLSAxIC0gbWF4KG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKVxcbiAgICAgICAgbnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSBudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbyAtIDEgKyBtaW4ocm90UmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKSAgXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvbW9udGljdWxvQmluYXJpby5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI21vbnRpY3Vsb0JpbmFyaW8ucHlcXG5cXG5jbGFzcyBNb250aWN1bG9CaW5hcmlvOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvID0gWzBdXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IDBcXG5cXG4gICAgZGVmIGNvbnN0cnVpck1vbnRpY3VsbyhzZWxmLHVuYUxpc3RhKTpcXG4gICAgICAgIGkgPSBsZW4odW5hTGlzdGEpIC8vIDJcXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gbGVuKHVuYUxpc3RhKVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3VsbyA9IFswXSArIHVuYUxpc3RhWzpdXFxuICAgICAgICBwcmludChsZW4oc2VsZi5saXN0YU1vbnRpY3VsbyksIGkpXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHByaW50KHNlbGYubGlzdGFNb250aWN1bG8sIGkpXFxuICAgICAgICAgICAgc2VsZi5pbmZpbHRBYmFqbyhpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgcHJpbnQoc2VsZi5saXN0YU1vbnRpY3VsbyxpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaW5maWx0QWJham8oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgaG0gPSBzZWxmLmhpam9NaW4oaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmxpc3RhTW9udGljdWxvW2ldID4gc2VsZi5saXN0YU1vbnRpY3Vsb1tobV06XFxuICAgICAgICAgICAgICAgIHRtcCA9IHNlbGYubGlzdGFNb250aWN1bG9baV1cXG4gICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA9IHNlbGYubGlzdGFNb250aWN1bG9baG1dXFxuICAgICAgICAgICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9baG1dID0gdG1wXFxuICAgICAgICAgICAgaSA9IGhtXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaGlqb01pbihzZWxmLGkpOlxcbiAgICAgICAgaWYgaSAqIDIgKyAxID4gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYubGlzdGFNb250aWN1bG9baSAqIDJdIDwgc2VsZi5saXN0YU1vbnRpY3Vsb1tpICogMiArIDFdOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDIgKyAxXFxuXFxuICAgIGRlZiBpbmZpbHRBcnJpYmEoc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIGkgLy8gMiA+IDA6XFxuICAgICAgICAgICAgaWYgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA8IHNlbGYubGlzdGFNb250aWN1bG9baS8vMl06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tpIC8vIDJdXFxuICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tpIC8vIDJdID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tpXVxcbiAgICAgICAgICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9baV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaSAvLyAyXFxuIFxcbiAgICBkZWYgaW5zZXJ0YXIoc2VsZixrKTpcXG4gICAgICAgIHNlbGYubGlzdGFNb250aWN1bG8uYXBwZW5kKGspXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsICsgMVxcbiAgICAgICAgc2VsZi5pbmZpbHRBcnJpYmEoc2VsZi50YW1hbm9BY3R1YWwpXFxuXFxuICAgIGRlZiBlbGltaW5hck1pbihzZWxmKTpcXG4gICAgICAgIHZhbG9yU2FjYWRvID0gc2VsZi5saXN0YU1vbnRpY3Vsb1sxXVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1sxXSA9IHNlbGYubGlzdGFNb250aWN1bG9bc2VsZi50YW1hbm9BY3R1YWxdXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsIC0gMVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsby5wb3AoKVxcbiAgICAgICAgc2VsZi5pbmZpbHRBYmFqbygxKVxcbiAgICAgICAgcmV0dXJuIHZhbG9yU2FjYWRvXFxuICAgICAgICBcXG4gICAgZGVmIGVzdGFWYWNpbyhzZWxmKTpcXG4gICAgICAgIGlmIHRhbWFub0FjdHVhbCA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblwiLFwic3JjL2xpYi9weXRob25lZC9iYXNpY2FzL19faW5pdF9fLnB5XCI6XCJcXG4jX19hbGxfXyA9IFtcXFwicGlsYVxcXCJdXFxuXFxuXFxuZnJvbSAucGlsYSBpbXBvcnQgUGlsYVxcbmZyb20gLmNvbGEgaW1wb3J0IENvbGFcXG5mcm9tIC5jb2xhZG9ibGUgaW1wb3J0IENvbGFEb2JsZVxcblxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9iYXNpY2FzL2NvbGEucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2NvbGEucHlcXG5cXG5jbGFzcyBDb2xhOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBhZ3JlZ2FyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5pbnNlcnQoMCxpdGVtKVxcblxcbiAgICBkZWYgYXZhbnphcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvY29sYWRvYmxlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jY29sYWRvYmxlLnB5XFxuXFxuY2xhc3MgQ29sYURvYmxlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBhZ3JlZ2FyRnJlbnRlKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGFncmVnYXJGaW5hbChzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsaXRlbSlcXG5cXG4gICAgZGVmIHJlbW92ZXJGcmVudGUoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlckZpbmFsKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKDApXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvcGlsYS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI3BpbGEucHlcXG5cXG5jbGFzcyBQaWxhOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBpbmNsdWlyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGV4dHJhZXIoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgaW5zcGVjY2lvbmFyKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXNbbGVuKHNlbGYuaXRlbXMpLTFdXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2dyYWZvcy9fX2luaXRfXy5weVwiOlwiXFxuXFxuZnJvbSAuZ3JhZm9BZHkgaW1wb3J0IEdyYWZvXFxuZnJvbSAuZ3JhZm9BZHkgaW1wb3J0IFZlcnRpY2VcXG5mcm9tIC5jb2xhUHJpb3JpZGFkIGltcG9ydCBDb2xhUHJpb3JpZGFkXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2dyYWZvcy9jb2xhUHJpb3JpZGFkLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jY29sYVByaW9yaWRhZC5weVxcblxcbmNsYXNzIENvbGFQcmlvcmlkYWQ6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3VsbyA9IFsoMCwwKV1cXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gMFxcblxcbiAgICBkZWYgY29uc3RydWlyTW9udGljdWxvKHNlbGYsdW5hTGlzdGEpOlxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBsZW4odW5hTGlzdGEpXFxuICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8gPSBbKDAsMCldXFxuICAgICAgICBmb3IgaSBpbiB1bmFMaXN0YTpcXG4gICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8uYXBwZW5kKGkpXFxuICAgICAgICBpID0gbGVuKHVuYUxpc3RhKSAvLyAyICAgICAgICAgICAgXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHNlbGYuaW5maWx0QWJham8oaSlcXG4gICAgICAgICAgICBpID0gaSAtIDFcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgZGVmIGluZmlsdEFiYWpvKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSAoaSAqIDIpIDw9IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIGhtID0gc2VsZi5oaWpvTWluKGkpXFxuICAgICAgICAgICAgaWYgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldWzBdID4gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2htXVswXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpXSA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tobV1cXG4gICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2htXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBobVxcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIGhpam9NaW4oc2VsZixpKTpcXG4gICAgICAgIGlmIGkqMiA+IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBpKjIgKyAxID4gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baSoyXVswXSA8IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpKjIrMV1bMF06XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSoyXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSoyKzFcXG5cXG4gICAgZGVmIGluZmlsdEFycmliYShzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgaSAvLyAyID4gMDpcXG4gICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1bMF0gPCBzZWxmLmFycmVnbG9Nb250aWN1bG9baS8vMl1bMF06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kvLzJdXFxuICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kvLzJdID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldID0gdG1wXFxuICAgICAgICAgICAgaSA9IGkvLzJcXG4gXFxuICAgIGRlZiBpbnNlcnRhcihzZWxmLGspOlxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvLmFwcGVuZChrKVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBzZWxmLnRhbWFub0FjdHVhbCArIDFcXG4gICAgICAgIHNlbGYuaW5maWx0QXJyaWJhKHNlbGYudGFtYW5vQWN0dWFsKVxcblxcbiAgICBkZWYgZWxpbWluYXJNaW4oc2VsZik6XFxuICAgICAgICB2YWxvclNhY2FkbyA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1sxXVsxXVxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvWzFdID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW3NlbGYudGFtYW5vQWN0dWFsXVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBzZWxmLnRhbWFub0FjdHVhbCAtIDFcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsby5wb3AoKVxcbiAgICAgICAgc2VsZi5pbmZpbHRBYmFqbygxKVxcbiAgICAgICAgcmV0dXJuIHZhbG9yU2FjYWRvXFxuICAgICAgICBcXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYudGFtYW5vQWN0dWFsID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBkZWNyZW1lbnRhckNsYXZlKHNlbGYsdmFsb3IsbnVldm8pOlxcbiAgICAgICAgaGVjaG8gPSBGYWxzZVxcbiAgICAgICAgaSA9IDFcXG4gICAgICAgIG1pQ2xhdmUgPSAwXFxuICAgICAgICB3aGlsZSBub3QgaGVjaG8gYW5kIGkgPD0gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgaWYgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldWzFdID09IHZhbG9yOlxcbiAgICAgICAgICAgICAgICBoZWNobyA9IFRydWVcXG4gICAgICAgICAgICAgICAgbWlDbGF2ZSA9IGlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgIGlmIG1pQ2xhdmUgPiAwOlxcbiAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1ttaUNsYXZlXSA9IChudWV2byxzZWxmLmFycmVnbG9Nb250aWN1bG9bbWlDbGF2ZV1bMV0pXFxuICAgICAgICAgICAgc2VsZi5pbmZpbHRBcnJpYmEobWlDbGF2ZSlcXG4gICAgICAgICAgICBcXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLHZlcnRpY2UpOlxcbiAgICAgICAgZm9yIHBhcmVqYSBpbiBzZWxmLmFycmVnbG9Nb250aWN1bG86XFxuICAgICAgICAgICAgaWYgcGFyZWphWzFdID09IHZlcnRpY2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICByZXR1cm4gRmFsc2UgICAgIFxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9ncmFmb3MvZ3JhZm9BZHkucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2dyYWZvQWR5LnB5XFxuXFxuXFxuaW1wb3J0IHN5c1xcblxcbmNsYXNzIEdyYWZvOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmxpc3RhVmVydGljZXMgPSB7fVxcbiAgICAgICAgc2VsZi5udW1WZXJ0aWNlcyA9IDBcXG4gICAgICAgIFxcbiAgICBkZWYgYWdyZWdhclZlcnRpY2Uoc2VsZixjbGF2ZSk6XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gc2VsZi5udW1WZXJ0aWNlcyArIDFcXG4gICAgICAgIG51ZXZvVmVydGljZSA9IFZlcnRpY2UoY2xhdmUpXFxuICAgICAgICBzZWxmLmxpc3RhVmVydGljZXNbY2xhdmVdID0gbnVldm9WZXJ0aWNlXFxuICAgICAgICByZXR1cm4gbnVldm9WZXJ0aWNlXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lclZlcnRpY2Uoc2VsZixuKTpcXG4gICAgICAgIGlmIG4gaW4gc2VsZi5saXN0YVZlcnRpY2VzOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmxpc3RhVmVydGljZXNbbl1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLG4pOlxcbiAgICAgICAgcmV0dXJuIG4gaW4gc2VsZi5saXN0YVZlcnRpY2VzXFxuICAgIFxcbiAgICBkZWYgYWdyZWdhckFyaXN0YShzZWxmLGRlLGEsY29zdG89MCk6XFxuICAgICAgICAgICAgaWYgZGUgbm90IGluIHNlbGYubGlzdGFWZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFncmVnYXJWZXJ0aWNlKGRlKVxcbiAgICAgICAgICAgIGlmIGEgbm90IGluIHNlbGYubGlzdGFWZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFncmVnYXJWZXJ0aWNlKGEpXFxuICAgICAgICAgICAgc2VsZi5saXN0YVZlcnRpY2VzW2RlXS5hZ3JlZ2FyVmVjaW5vKHNlbGYubGlzdGFWZXJ0aWNlc1thXSxjb3N0bylcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVyVmVydGljZXMoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGlzdChzZWxmLmxpc3RhVmVydGljZXMua2V5cygpKVxcbiAgICAgICAgXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBpdGVyKHNlbGYubGlzdGFWZXJ0aWNlcy52YWx1ZXMoKSlcXG4gICAgICAgICAgICAgICAgXFxuY2xhc3MgVmVydGljZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgc2VsZi5pZCA9IGNsYXZlXFxuICAgICAgICBzZWxmLmNvbmVjdGFkb0EgPSB7fVxcbiAgICAgICAgc2VsZi5jb2xvciA9ICdibGFuY28nXFxuICAgICAgICBzZWxmLmRpc3QgPSBzeXMubWF4c2l6ZVxcbiAgICAgICAgc2VsZi5wcmVkZWNlc29yID0gTm9uZVxcbiAgICAgICAgc2VsZi5kZXNjID0gMFxcbiAgICAgICAgc2VsZi5maW4gPSAwXFxuXFxuICAgICMgZGVmIF9fbHRfXyhzZWxmLG8pOlxcbiAgICAjICAgICByZXR1cm4gc2VsZi5pZCA8IG8uaWRcXG4gICAgXFxuICAgIGRlZiAgYWdyZWdhclZlY2lubyhzZWxmLHZlY2lubyxwb25kZXJhY2lvbj0wKTpcXG4gICAgICAgIHNlbGYuY29uZWN0YWRvQVt2ZWNpbm9dID0gcG9uZGVyYWNpb25cXG4gICAgICAgIFxcbiAgICBkZWYgYXNpZ25hckNvbG9yKHNlbGYsY29sb3IpOlxcbiAgICAgICAgc2VsZi5jb2xvciA9IGNvbG9yXFxuICAgICAgICBcXG4gICAgZGVmIGFzaWduYXJEaXN0YW5jaWEoc2VsZixkKTpcXG4gICAgICAgIHNlbGYuZGlzdCA9IGRcXG5cXG4gICAgZGVmIGFzaWduYXJQcmVkZWNlc29yKHNlbGYscCk6XFxuICAgICAgICBzZWxmLnByZWRlY2Vzb3IgPSBwXFxuXFxuICAgIGRlZiBhc2lnbmFyRGVzY3VicmltaWVudG8oc2VsZix0aWVtcG9EZXNjdWJyaW1pZW50byk6XFxuICAgICAgICBzZWxmLmRlc2MgPSB0aWVtcG9EZXNjdWJyaW1pZW50b1xcbiAgICAgICAgXFxuICAgIGRlZiBhc2lnbmFyRmluYWxpemFjaW9uKHNlbGYsdGllbXBvRmluYWxpemFjaW9uKTpcXG4gICAgICAgIHNlbGYuZmluID0gdGllbXBvRmluYWxpemFjaW9uXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJGaW5hbGl6YWNpb24oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5maW5cXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckRlc2N1YnJpbWllbnRvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGVzY1xcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyUHJlZGVjZXNvcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnByZWRlY2Vzb3JcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckRpc3RhbmNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmRpc3RcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckNvbG9yKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29sb3JcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVyQ29uZXhpb25lcyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbmVjdGFkb0Eua2V5cygpXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJQb25kZXJhY2lvbihzZWxmLHZlY2lubyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb25lY3RhZG9BW3ZlY2lub11cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLmlkKSArIFxcXCI6Y29sb3IgXFxcIiArIHNlbGYuY29sb3IgKyBcXFwiOmRlc2MgXFxcIiArIHN0cihzZWxmLmRlc2MpICsgXFxcIjpmaW4gXFxcIiArIHN0cihzZWxmLmZpbikgKyBcXFwiOmRpc3RhbmNpYSBcXFwiICsgc3RyKHNlbGYuZGlzdCkgKyBcXFwiOnByZWRlY2Vzb3IgXFxcXG5cXFxcdFtcXFwiICsgc3RyKHNlbGYucHJlZGVjZXNvcikrIFxcXCJdXFxcXG5cXFwiXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lcklkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaWRcXG5cIixcInNyYy9saWIvcXVvcHJpLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJxdW9wcmkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yYW5kb20uanNcIjpcInZhciBNZXJzZW5uZVR3aXN0ZXI9ZnVuY3Rpb24oYSl7YT09bnVsbCYmKGE9bmV3IERhdGUoKS5nZXRUaW1lKCkpLHRoaXMuTj02MjQsdGhpcy5NPTM5Nyx0aGlzLk1BVFJJWF9BPTI1Njc0ODM2MTUsdGhpcy5VUFBFUl9NQVNLPTIxNDc0ODM2NDgsdGhpcy5MT1dFUl9NQVNLPTIxNDc0ODM2NDcsdGhpcy5tdD1BcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHRoaXMuaW5pdF9nZW5yYW5kKGEpfTtNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmluaXRfZ2VucmFuZD1mdW5jdGlvbihhKXtmb3IodGhpcy5tdFswXT1hPj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgYT10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oMTgxMjQzMzI1MyooKDQyOTQ5MDE3NjAmYSk+Pj4xNik8PDE2KSsxODEyNDMzMjUzKig2NTUzNSZhKSt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5pbml0X2J5X2FycmF5PWZ1bmN0aW9uKGEsYil7dmFyIGQsZSxmO2Zvcih0aGlzLmluaXRfZ2VucmFuZCgxOTY1MDIxOCksZD0xLGU9MCxmPXRoaXMuTj5iP3RoaXMuTjpiO2Y7Zi0tKXt2YXIgZz10aGlzLm10W2QtMV1edGhpcy5tdFtkLTFdPj4+MzA7dGhpcy5tdFtkXT0odGhpcy5tdFtkXV4oMTY2NDUyNSooKDQyOTQ5MDE3NjAmZyk+Pj4xNik8PDE2KSsxNjY0NTI1Kig2NTUzNSZnKSkrYVtlXStlLHRoaXMubXRbZF0+Pj49MCxkKyssZSsrLGQ+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sZD0xKSxlPj1iJiYoZT0wKX1mb3IoZj10aGlzLk4tMTtmO2YtLSl7dmFyIGc9dGhpcy5tdFtkLTFdXnRoaXMubXRbZC0xXT4+PjMwO3RoaXMubXRbZF09KHRoaXMubXRbZF1eKDE1NjYwODM5NDEqKCg0Mjk0OTAxNzYwJmcpPj4+MTYpPDwxNikrMTU2NjA4Mzk0MSooNjU1MzUmZykpLWQsdGhpcy5tdFtkXT4+Pj0wLGQrKyxkPj10aGlzLk4mJih0aGlzLm10WzBdPXRoaXMubXRbdGhpcy5OLTFdLGQ9MSl9dGhpcy5tdFswXT0yMTQ3NDgzNjQ4fSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmdlbnJhbmRfaW50MzI9ZnVuY3Rpb24oKXt2YXIgYSxiPVswLHRoaXMuTUFUUklYX0FdO2lmKHRoaXMubXRpPj10aGlzLk4pe3ZhciBkO2Zvcih0aGlzLm10aT09dGhpcy5OKzEmJnRoaXMuaW5pdF9nZW5yYW5kKDU0ODkpLGQ9MDtkPHRoaXMuTi10aGlzLk07ZCsrKWE9dGhpcy5tdFtkXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtkKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W2RdPXRoaXMubXRbZCt0aGlzLk1dXmE+Pj4xXmJbMSZhXTtmb3IoO2Q8dGhpcy5OLTE7ZCsrKWE9dGhpcy5tdFtkXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtkKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W2RdPXRoaXMubXRbZCsodGhpcy5NLXRoaXMuTildXmE+Pj4xXmJbMSZhXTthPXRoaXMubXRbdGhpcy5OLTFdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10WzBdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RoaXMuTi0xXT10aGlzLm10W3RoaXMuTS0xXV5hPj4+MV5iWzEmYV0sdGhpcy5tdGk9MH1yZXR1cm4gYT10aGlzLm10W3RoaXMubXRpKytdLGFePWE+Pj4xMSxhXj0yNjM2OTI4NjQwJmE8PDcsYV49NDAyMjczMDc1MiZhPDwxNSxhXj1hPj4+MTgsYT4+PjB9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9pbnQzMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlbnJhbmRfaW50MzIoKT4+PjF9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZWFsMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlbnJhbmRfaW50MzIoKSooMS80Mjk0OTY3Mjk1KX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5yYW5kb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZW5yYW5kX2ludDMyKCkqKDEvNDI5NDk2NzI5Nil9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZWFsMz1mdW5jdGlvbigpe3JldHVybih0aGlzLmdlbnJhbmRfaW50MzIoKSsuNSkqKDEvNDI5NDk2NzI5Nil9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZXM1Mz1mdW5jdGlvbigpe3ZhciBkPXRoaXMuZ2VucmFuZF9pbnQzMigpPj4+NSxhPXRoaXMuZ2VucmFuZF9pbnQzMigpPj4+NjtyZXR1cm4oNjcxMDg4NjQqZCthKSooMS85MDA3MTk5MjU0NzQwOTkyKX07dmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5sb2csYj1NYXRoLnNxcnQsZD17fSxlPW5ldyBNZXJzZW5uZVR3aXN0ZXIsZj12b2lkIDA7ZC5zZWVkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNlZWRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGU9MDxhcmd1bWVudHMubGVuZ3RoP25ldyBNZXJzZW5uZVR3aXN0ZXIoYSk6bmV3IE1lcnNlbm5lVHdpc3RlcixTay5idWlsdGluLm5vbmUubm9uZSR9KSxkLnJhbmRvbT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJhbmRvbVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLmZsb2F0XyhlLmdlbnJhbmRfcmVzNTMoKSl9KTt2YXIgZz1mdW5jdGlvbihhKXtyZXR1cm4gMHxhfSxoPWZ1bmN0aW9uKGEsYixkKXt2YXIgZixoLGk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgZmlyc3QgYXJndW1lbnQgZm9yIHJhbmRyYW5nZSgpXFxcIik7aWYodm9pZCAwPT09YilyZXR1cm4gaT1nKGUuZ2VucmFuZF9yZXM1MygpKmEpLG5ldyBTay5idWlsdGluLmludF8oaSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgc3RvcCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZih2b2lkIDA9PT1kJiYoZD0xKSxmPWItYSwxPT1kJiYwPGYpcmV0dXJuIGk9YStnKGUuZ2VucmFuZF9yZXM1MygpKmYpLG5ldyBTay5idWlsdGluLmludF8oaSk7aWYoMT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKCkgKFxcXCIrYStcXFwiLCBcXFwiK2IrXFxcIiwgXFxcIitmK1xcXCIpXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgc3RlcCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZigwPGQpaD1nKChmK2QtMSkvZCk7ZWxzZSBpZigwPmQpaD1nKChmK2QrMSkvZCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJ6ZXJvIHN0ZXAgZm9yIHJhbmRyYW5nZSgpXFxcIik7aWYoMD49aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKClcXFwiKTtyZXR1cm4gaT1hK2QqZyhlLmdlbnJhbmRfcmVzNTMoKSpoKSxuZXcgU2suYnVpbHRpbi5pbnRfKGkpfTtkLnJhbmRpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihkLGUpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJyYW5kaW50XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksZD1Tay5idWlsdGluLmFzbnVtJChkKSxlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGgoZCxlKzEpfSksZC5yYW5kcmFuZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsZCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJhbmRyYW5nZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDMpLGE9U2suYnVpbHRpbi5hc251bSQoYSksYj1Tay5idWlsdGluLmFzbnVtJChiKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGgoYSxiLGQpfSksZC51bmlmb3JtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZCxmKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ1bmlmb3JtXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksZD1Tay5idWlsdGluLmFzbnVtJChkKSxmPVNrLmJ1aWx0aW4uYXNudW0kKGYpO3ZhciBnPWUuZ2VucmFuZF9yZXM1MygpO3JldHVybiBjPWQrZyooZi1kKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9KSxkLnRyaWFuZ3VsYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGQsZil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwidHJpYW5ndWxhclxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImxvd1xcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiaGlnaFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihkKSk7dmFyIGcsaCxpO3JldHVybiBhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksYT5kJiYoaT1hLGE9ZCxkPWkpLHZvaWQgMD09PWZ8fGY9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/Zj0oZC1hKS8yOihTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJtb2RlXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGYpKSxmPVNrLmJ1aWx0aW4uYXNudW0kKGYpKSxnPWUuZ2VucmFuZF9yZXM1MygpLGg9ZzwoZi1hKS8oZC1hKT9hK2IoZyooZC1hKSooZi1hKSk6ZC1iKCgxLWcpKihkLWEpKihkLWYpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oaCl9KTt2YXIgaT1mdW5jdGlvbihkLGcpe3ZhciBrLGwsbSxuLG8saD1NYXRoLnNpbixpPU1hdGguY29zLGo9TWF0aC5QSTtyZXR1cm4gdm9pZCAwPT09Zj8oaz1lLmdlbnJhbmRfcmVzNTMoKSxsPWUuZ2VucmFuZF9yZXM1MygpLG09YigtMiphKGspKSxuPTIqaipsLG89bSppKG4pLGY9bSpoKG4pKToobz1mLGY9dm9pZCAwKSxkK2cqb307cmV0dXJuIGQuZ2F1c3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnYXVzc1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcIm11XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzaWdtYVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksYT1Tay5idWlsdGluLmFzbnVtJChhKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLG5ldyBTay5idWlsdGluLmZsb2F0XyhpKGEsYikpfSksZC5ub3JtYWx2YXJpYXRlPWQuZ2F1c3MsZC5sb2dub3JtdmFyaWF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGQ9TWF0aC5leHA7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImxvZ25vcm12YXJpYXRlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwibXVcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInNpZ21hXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGI9U2suYnVpbHRpbi5hc251bSQoYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQoaShhLGIpKSl9KSxkLmV4cG92YXJpYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZXhwb3ZhcmlhdGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJsYW1iZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksYj1Tay5idWlsdGluLmFzbnVtJChiKTt2YXIgZD1lLmdlbnJhbmRfcmVzNTMoKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC1hKGQpL2IpfSksZC5jaG9pY2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJjaG9pY2VcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzZXFcXFwiLFxcXCJzZXF1ZW5jZVxcXCIsU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpKSx2b2lkIDAhPT1hLnNxJGxlbmd0aCl7dmFyIGI9bmV3IFNrLmJ1aWx0aW4uaW50XyhnKGUuZ2VucmFuZF9yZXM1MygpKmEuc3EkbGVuZ3RoKCkpKTtyZXR1cm4gYS5tcCRzdWJzY3JpcHQoYil9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaGFzIG5vIGxlbmd0aFxcXCIpfSksZC5zaHVmZmxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2h1ZmZsZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJzZXF1ZW5jZVxcXCIsU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpKSxhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5saXN0KXtjb25zdCBoPWEudjtmb3IodmFyIGI9aC5sZW5ndGgtMTswPGI7Yi09MSl7dmFyIGQ9ZyhlLmdlbnJhbmRfcmVzNTMoKSooYisxKSksZj1oW2RdO2hbZF09aFtiXSxoW2JdPWZ9fWVsc2UgaWYodm9pZCAwPT09YS5zcSRsZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaGFzIG5vIGxlbmd0aFxcXCIpO2Vsc2UgaWYodm9pZCAwIT09YS5tcCRhc3Nfc3Vic2NyaXB0KWZvcih2YXIgZCxiPWEuc3EkbGVuZ3RoKCktMTswPGI7Yi09MSl7ZD1uZXcgU2suYnVpbHRpbi5pbnRfKGcoZS5nZW5yYW5kX3JlczUzKCkqKGIrMSkpKSxiPW5ldyBTay5idWlsdGluLmludF8oYik7dmFyIGY9YS5tcCRzdWJzY3JpcHQoZCk7YS5tcCRhc3Nfc3Vic2NyaXB0KGQsYS5tcCRzdWJzY3JpcHQoYikpLGEubXAkYXNzX3N1YnNjcmlwdChiLGYpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaXMgaW1tdXRhYmxlXFxcIik7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGQuc2FtcGxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgZixnLGgsbCxtLGQ9TWF0aC5mbG9vcjtmb3IoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2FtcGxlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicG9wdWxhdGlvblxcXCIsXFxcIml0ZXJhYmxlXFxcIixTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImtcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGIpKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLG09W10saD1Tay5hYnN0ci5pdGVyKGEpLChmPTAsbD1oLnRwJGl0ZXJuZXh0KCkpO3ZvaWQgMCE9PWw7ZisrLGw9aC50cCRpdGVybmV4dCgpKWc9ZChlLmdlbnJhbmRfcmVzNTMoKSooZisxKSksZjxiPyhnPGYmJihtW2ZdPW1bZ10pLG1bZ109bCk6ZzxiJiYobVtnXT1sKTtpZihmPGIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwic2FtcGxlIGxhcmdlciB0aGFuIHBvcHVsYXRpb25cXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChtKX0pLGR9O1wiLFwic3JjL2xpYi9yZS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKG5hbWUpe3ZhciB2YWxpZEdyb3Vwcyxjb252ZXJ0LGdldEZsYWdzLF9zcGxpdCxfZmluZGFsbCxtYXRjaG9iaixfc2VhcmNoLF9tYXRjaCxyZWdleG9iaixtb2Q9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwicmVcXFwiKX07cmV0dXJuIG1vZC5JPTIsbW9kLklHTk9SRUNBU0U9Mixtb2QuTT04LG1vZC5NVUxUSUxJTkU9OCx2YWxpZEdyb3Vwcz1bXFxcIig/OlxcXCIsXFxcIig/PVxcXCIsXFxcIig/IVxcXCJdLGNvbnZlcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkO2lmKGM9YS5tYXRjaCgvXFxcXChcXFxcPy4vZyksYylmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWlmKC0xPT12YWxpZEdyb3Vwcy5pbmRleE9mKGNbZF0pKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkRpc2FsbG93ZWQgZ3JvdXAgaW4gcGF0dGVybjogJ1xcXCIrY1tkXStcXFwiJ1xcXCIpO3JldHVybiBiPWEucmVwbGFjZShcXFwiL1xcXFxcXFxcL2dcXFwiLFxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIiksYj1hLnJlcGxhY2UoLyhbXlxcXFxcXFxcXSl7LCg/IVteXFxcXFtdKlxcXFxdKS9nLFxcXCIkMXswLFxcXCIpLGJ9LGdldEZsYWdzPWZ1bmN0aW9uKGEpe3ZhciBiPVxcXCJnXFxcIjtyZXR1cm4oYSZtb2QuSUdOT1JFQ0FTRSk9PW1vZC5JR05PUkVDQVNFJiYoYis9XFxcImlcXFwiKSwoYSZtb2QuTVVMVElMSU5FKT09bW9kLk1VTFRJTElORSYmKGIrPVxcXCJtXFxcIiksYn0sX3NwbGl0PWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksaixrLGwsbTtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzcGxpdFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwicGF0dGVybiBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzdHJpbmcgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWF4c3BsaXQgbXVzdCBiZSBhIG51bWJlclxcXCIpO2lmKHZvaWQgMD09PWQmJihkPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO2ZvcihjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGU9U2suZmZpLnVud3JhcG8oYSksZj1Tay5mZmkudW53cmFwbyhiKSxlPWNvbnZlcnQoZSksZz1udWxsIT09ZS5tYXRjaCgvXlxcXFwoLipcXFxcKSQvKSxoPWdldEZsYWdzKGQpLGk9bmV3IFJlZ0V4cChlLGgpLGo9W10sayxsPTAsbT0wO251bGwhPShrPWkuZXhlYyhmKSkmJmsuaW5kZXghPT1pLmxhc3RJbmRleCYmKGoucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZi5zdWJzdHJpbmcobCxrLmluZGV4KSkpLGcmJmoucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoa1swXSkpLGw9aS5sYXN0SW5kZXgsbSs9MSwhKGMmJm0+PWMpKTspO3JldHVybiBqLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGYuc3Vic3RyaW5nKGwpKSksbmV3IFNrLmJ1aWx0aW4ubGlzdChqKX0sX3NwbGl0LmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcIm1heHNwbGl0XFxcIixcXFwiZmxhZ3NcXFwiXSxfc3BsaXQuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCldLG1vZC5zcGxpdD1uZXcgU2suYnVpbHRpbi5mdW5jKF9zcGxpdCksX2ZpbmRhbGw9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsajtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJmaW5kYWxsXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7aWYoZD1Tay5mZmkudW53cmFwbyhhKSxlPVNrLmZmaS51bndyYXBvKGIpLGQ9Y29udmVydChkKSxmPWdldEZsYWdzKGMpLGc9bmV3IFJlZ0V4cChkLGYpLGQubWF0Y2goL1xcXFwkLykpe3ZhciBrPW5ldyBSZWdFeHAoL1xcXFxuJC8pO2UubWF0Y2goaykmJihlPWUuc2xpY2UoMCwtMSkpfWZvcihoPVtdLGo7bnVsbCE9KGo9Zy5leGVjKGUpKTspe2lmKDI+ai5sZW5ndGgpaC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihqWzBdKSk7ZWxzZSBpZigyPT1qLmxlbmd0aCloLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGpbMV0pKTtlbHNle2Zvcih2YXIgbD1bXSxtPTE7bTxqLmxlbmd0aDttKyspbC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihqW21dKSk7aC5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKGwpKX1qLmluZGV4PT09Zy5sYXN0SW5kZXgmJihnLmxhc3RJbmRleCs9MSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoaCl9LF9maW5kYWxsLmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcImZsYWdzXFxcIl0sX2ZpbmRhbGwuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2QuZmluZGFsbD1uZXcgU2suYnVpbHRpbi5mdW5jKF9maW5kYWxsKSxtYXRjaG9iaj1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYS50aGVtYXRjaD1iLGEucmU9YyxhLnN0cmluZz1kLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIuZ3JvdXBzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS50aGVtYXRjaC52LnNsaWNlKDEpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShiKX0pLGIuZ3JvdXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKGI9dm9pZCAwPT09Yj8wOlNrLmJ1aWx0aW4uYXNudW0kKGIpLGI+PWEudGhlbWF0Y2gudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwiSW5kZXggb3V0IG9mIHJhbmdlOiBcXFwiK2IpO3JldHVybiBhLnRoZW1hdGNoLnZbYl19KX0sbW9kLk1hdGNoT2JqZWN0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MobW9kLG1hdGNob2JqLFxcXCJNYXRjaE9iamVjdFxcXCIsW10pLG1vZC5fZmluZHJlPWZ1bmN0aW9uKHJlcyxzdHJpbmcpe3Jlcz1yZXMucmVwbGFjZSgvKFteXFxcXFxcXFxdKXssKD8hW15cXFxcW10qXFxcXF0pL2csXFxcIiQxezAsXFxcIik7dmFyIG1hdGNoZXMsc2l0ZW0scmV0dmFsLHJlPWV2YWwocmVzKSxwYXR0PS9cXFxcbiQvLHN0cj1Tay5mZmkucmVtYXBUb0pzKHN0cmluZyk7aWYobWF0Y2hlcz1zdHIubWF0Y2gocGF0dCk/c3RyLnNsaWNlKDAsLTEpLm1hdGNoKHJlKTpzdHIubWF0Y2gocmUpLHJldHZhbD1uZXcgU2suYnVpbHRpbi5saXN0LG51bGw9PW1hdGNoZXMpcmV0dXJuIHJldHZhbDtmb3IodmFyIGk9MDtpPG1hdGNoZXMubGVuZ3RoOysraSlzaXRlbT1uZXcgU2suYnVpbHRpbi5zdHIobWF0Y2hlc1tpXSkscmV0dmFsLnYucHVzaChzaXRlbSk7cmV0dXJuIHJldHZhbH0sX3NlYXJjaD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZWFyY2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic3RyaW5nIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz0wKSwhU2suYnVpbHRpbi5jaGVja051bWJlcihjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZsYWdzIG11c3QgYmUgYSBudW1iZXJcXFwiKTtyZXR1cm4oZT1cXFwiL1xcXCIrYS52LnJlcGxhY2UoL1xcXFwvL2csXFxcIlxcXFxcXFxcL1xcXCIpK1xcXCIvXFxcIixsc3Q9bW9kLl9maW5kcmUoZSxiKSwxPmxzdC52Lmxlbmd0aCk/U2suYnVpbHRpbi5ub25lLm5vbmUkOihkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuTWF0Y2hPYmplY3QsW2xzdCxhLGJdKSxkKX0sX3NlYXJjaC5jb192YXJuYW1lcz1bXFxcInBhdHRlcm5cXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJmbGFnc1xcXCJdLF9zZWFyY2guJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2Quc2VhcmNoPW5ldyBTay5idWlsdGluLmZ1bmMoX3NlYXJjaCksX21hdGNoPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1hdGNoXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7cmV0dXJuKHBhdD1Tay5mZmkucmVtYXBUb0pzKGEpLGU9XFxcIi9eXFxcIitwYXQucmVwbGFjZSgvXFxcXC8vZyxcXFwiXFxcXFxcXFwvXFxcIikrXFxcIi9cXFwiLGxzdD1tb2QuX2ZpbmRyZShlLGIpLDE+U2suZmZpLnJlbWFwVG9Kcyhsc3QpLmxlbmd0aCk/U2suYnVpbHRpbi5ub25lLm5vbmUkOihkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuTWF0Y2hPYmplY3QsW2xzdCxhLGJdKSxkKX0sX21hdGNoLmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcImZsYWdzXFxcIl0sX21hdGNoLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0sbW9kLm1hdGNoPW5ldyBTay5idWlsdGluLmZ1bmMoX21hdGNoKSxyZWdleG9iaj1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaDtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlPWIsYS5mbGFncz12b2lkIDA9PT1jPzA6YyxTay5idWlsdGluLm5vbmUubm9uZSR9KSxoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9XFxcInJlLmNvbXBpbGUoJ1xcXCIrU2suZmZpLnJlbWFwVG9KcyhhLnJlKStcXFwiJylcXFwiO3JldHVybiBTay5mZmkucmVtYXBUb1B5KGIuc3Vic3RyaW5nKDAsMjEyKSl9KSxiLl9fc3RyX189aCxiLl9fcmVwcl9fPWgsYz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9U2suZmZpLnJlbWFwVG9KcyhhKSxlPW51bGw9PWI/MDpTay5mZmkucmVtYXBUb0pzKGIpLGY9bnVsbD09Yz9kLmxlbmd0aDpTay5mZmkucmVtYXBUb0pzKGMpO3JldHVyblxcXCJeXFxcIj09ZSYmKGU9ZC5pbmRleE9mKFxcXCJcXFxcblxcXCIpKzEpLG51bGw9PT1mJiYoZj1kLmxlbmd0aCksU2suZmZpLnJlbWFwVG9QeShkLnN1YnN0cmluZyhlLGYpKX0sZD1mdW5jdGlvbihhLGIsZCxlKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZWFyY2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KTt2YXIgZj1jKGIsZCxlKTtyZXR1cm4gX3NlYXJjaChhLnJlLGYsYS5mbGFncyl9LGQuY29fdmFybmFtZXM9W1xcXCJzZWxmXFxcIixcXFwic3RyaW5nXFxcIixcXFwicG9zXFxcIixcXFwiZW5kcG9zXFxcIl0sZC4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCksU2suYnVpbHRpbi5ub25lLm5vbmUkXSxiLnNlYXJjaD1uZXcgU2suYnVpbHRpbi5mdW5jKGQpLGU9ZnVuY3Rpb24oYSxiLGQsZSl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibWF0Y2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KTt2YXIgZj1jKGIsZCxlKTtyZXR1cm4gX21hdGNoKGEucmUsZixhLmZsYWdzKX0sZS5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJwb3NcXFwiLFxcXCJlbmRwb3NcXFwiXSxlLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdLGIubWF0Y2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKSxmPWZ1bmN0aW9uKGEsYixjKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzcGxpdFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrSW50KGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWF4c3BsaXQgbXVzdCBiZSBhbiBpbnRlZ2VyXFxcIik7cmV0dXJuIF9zcGxpdChhLnJlLGIsYyxhLmZsYWdzKX0sZi5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJtYXhzcGxpdFxcXCJdLGYuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxiLnNwbGl0PW5ldyBTay5idWlsdGluLmZ1bmMoZiksZz1mdW5jdGlvbihhLGIsZCxlKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJmaW5kYWxsXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCk7dmFyIGY9YyhiLGQsZSk7cmV0dXJuIF9maW5kYWxsKGEucmUsZixhLmZsYWdzKX0sZy5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJwb3NcXFwiLFxcXCJlbmRwb3NcXFwiXSxnLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdLGIuZmluZGFsbD1uZXcgU2suYnVpbHRpbi5mdW5jKGcpfSxtb2QuUmVnZXhPYmplY3Q9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhtb2QscmVnZXhvYmosXFxcIlJlZ2V4T2JqZWN0XFxcIixbXSksbW9kLmNvbXBpbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImNvbXBpbGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWImJihiPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO3JldHVybiBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuUmVnZXhPYmplY3QsW2EsYl0pLGN9KSxtb2QucHVyZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe30pLG1vZH07XCIsXCJzcmMvbGliL3JlcHIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJlcHIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yZXF1ZXN0cy5weVwiOlwiIyBtb3N0IHJlc3RyaWN0ZWQgdmVyc2lvblxcblxcXCJcXFwiXFxcIlxcblRoaXMgc29sdXRpb24gd29ya3MgaW4gcnVuZXN0b25lIC0gaG93ZXZlciBpdCBpcyBtdWNoIG1vcmUgbGltaXRlZC5cXG5BbiBlcnJvciBkb2VzIG5vdCBvY2N1ciBpbiB0aGUgc2FtZSB3YXkgaW4gdGhlIHRleHRib29rIGFzIGl0IGRvZXNcXG5mb3IgdGhlIGNvbW1hbmQgbGluZS4gU2luY2UgSFRUUEVycm9yIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGluXFxuUnVuZXN0b25lLCBJIGhhZCB0byBjaGFuZ2UgdGhlIGV4Y2VwdGlvbi5cXG5EZWNvZGUgYW5kIEVuY29kZSBhcmUgbm90IGF2YWlsYWJsZSBpbiBSdW5lc3RvbmUsIHNvIHRoZXJlIG1pZ2h0IGJlXFxuaXNzdWVzIHdpdGggcmVwb25zZXMuXFxuRG9lcyBub3QgdXNlIHRoZSBzdGF0dXMgYXR0cmlidXRlIGZvciB1cmxvcGVuLCB3b3VsZCBiZSBuaWNlIHRvIGhhdmVcXG50aGF0IGJhY2suXFxuRG9lcyBub3Qgd29yayBvbiByZWd1bGFyIHdlYiBwYWdlcyAobGlrZSBnb29nbGUgb3IgdGhlIG1pY2hpZ2FuIGRhaWx5KSBiZWNhdXNlIG9mIGNyb3NzLXNpdGUgc2NyaXB0aW5nIGxpbWl0cy5cXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuXFxuaW1wb3J0IGpzb25cXG5cXG5jbGFzcyBSZXNwb25zZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEsIHVybCk6XFxuICAgICAgICBzZWxmLnRleHQgPSBkYXRhXFxuICAgICAgICBzZWxmLnVybCA9IHVybFxcblxcbiAgICBkZWYganNvbihzZWxmKTpcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhzZWxmLnRleHQpXFxuICAgICAgICBleGNlcHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHtcXFwiZXJyb3JcXFwiOiBcXFwiUmVzcG9uc2Ugbm90IGludGVycHJldGFibGUgYXMganNvbi4gVHJ5IHByaW50aW5nIHRoZSAudGV4dCBhdHRyaWJ1dGVcXFwifVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBcXFwiPEEgUmVzcG9uc2Ugb2JqZWN0IGZvciB0aGUgZm9sbG93aW5nIHJlcXVlc3Q6IHt9PlxcXCIuZm9ybWF0KHNlbGYudXJsKVxcblxcblxcbnVybF9zdWJzID0ge1xcXCIgXFxcIjogXFxcIitcXFwiLFxcbiAgICAgICAgICAgIFxcXCIhXFxcIjogXFxcIiUyMVxcXCIsXFxuICAgICAgICAgICAgJ1xcXCInOiBcXFwiJTIyXFxcIixcXG4gICAgICAgICAgICBcXFwiI1xcXCI6IFxcXCIlMjNcXFwiLFxcbiAgICAgICAgICAgIFxcXCIkXFxcIjogXFxcIiUyNFxcXCIsXFxuICAgICAgICAgICAgXFxcIidcXFwiOiBcXFwiJTI3XFxcIixcXG4gICAgICAgICAgICBcXFwiKFxcXCI6IFxcXCIlMjhcXFwiLFxcbiAgICAgICAgICAgIFxcXCIpXFxcIjogXFxcIiUyOVxcXCIsXFxuICAgICAgICAgICAgXFxcIipcXFwiOiBcXFwiJTJBXFxcIixcXG4gICAgICAgICAgICBcXFwiK1xcXCI6IFxcXCIlMkJcXFwiLFxcbiAgICAgICAgICAgIFxcXCIsXFxcIjogXFxcIiUyQ1xcXCIsXFxuICAgICAgICAgICAgXFxcIi9cXFwiOiBcXFwiJTJGXFxcIixcXG4gICAgICAgICAgICBcXFwiOlxcXCI6IFxcXCIlM0FcXFwiLFxcbiAgICAgICAgICAgIFxcXCI7XFxcIjogXFxcIiUzQlxcXCIsXFxuICAgICAgICAgICAgXFxcIj1cXFwiOiBcXFwiJTNEXFxcIixcXG4gICAgICAgICAgICBcXFwiP1xcXCI6IFxcXCIlM0ZcXFwiLFxcbiAgICAgICAgICAgIFxcXCJAXFxcIjogXFxcIiU0MFxcXCIsXFxuICAgICAgICAgICAgXFxcIltcXFwiOiBcXFwiJTVCXFxcIixcXG4gICAgICAgICAgICBcXFwiXVxcXCI6IFxcXCIlNURcXFwiLFxcbiAgICAgICAgICAgIH1cXG5cXG5kZWYgX3N1YnN0KHMsIHN1YnN0aXR1dGlvbnM9dXJsX3N1YnMpOlxcbiAgICByZXMgPSBcXFwiXFxcIlxcbiAgICBmb3IgYyBpbiBzdHIocyk6XFxuICAgICAgICBpZiBjIGluIHN1YnN0aXR1dGlvbnM6XFxuICAgICAgICAgICAgcmVzICs9IHN1YnN0aXR1dGlvbnNbY11cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmVzICs9IGNcXG4gICAgcmV0dXJuIHJlc1xcblxcblxcbmRlZiByZXF1ZXN0VVJMKGJhc2V1cmwsIHBhcmFtcz17fSk6XFxuICAgIHRyeTpcXG4gICAgICAgIGlmIGxlbihwYXJhbXMpID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIGJhc2V1cmxcXG4gICAgICAgIGNvbXBsZXRlX3VybCA9IGJhc2V1cmwgKyBcXFwiP1xcXCJcXG4gICAgICAgIHBhaXJzID0gW1xcXCJ7fT17fVxcXCIuZm9ybWF0KF9zdWJzdChrKSwgX3N1YnN0KHBhcmFtc1trXSkpIGZvciBrIGluIHBhcmFtc11cXG4gICAgICAgIGNvbXBsZXRlX3VybCArPSBcXFwiJlxcXCIuam9pbihwYWlycylcXG4gICAgICAgIHJldHVybiBjb21wbGV0ZV91cmxcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG5kZWYgZ2V0KGJhc2V1cmwsIHBhcmFtcz17fSk6XFxuICAgIGZ1bGxfdXJsID0gcmVxdWVzdFVSTChiYXNldXJsLCBwYXJhbXMpXFxuICAgIGlmIG5vdCBmdWxsX3VybDpcXG4gICAgICAgIHRleHRfZGF0YSA9IFxcXCI8aHRtbD48Ym9keT48aDE+aW52YWxpZCByZXF1ZXN0PC9oMT48L2JvZHk+PC9odG1sPlxcXCJcXG4gICAgICAgIGZ1bGxfdXJsID0gXFxcIkNvdWxkbuKAmXQgZ2VuZXJhdGUgYSB2YWxpZCBVUkxcXFwiXFxuICAgIGVsc2U6XFxuICAgICAgICBkYXRhID0gdXJsb3BlbihmdWxsX3VybClcXG4gICAgICAgIHRleHRfZGF0YSA9IGRhdGEucmVhZCgpLnN0cmlwKClcXG4gICAgICAgIGlmIGxlbih0ZXh0X2RhdGEpID09IDA6XFxuICAgICAgICAgICAgdGV4dF9kYXRhID0gXFxcIkZhaWxlZCB0byByZXRyaWV2ZSB0aGF0IFVSTFxcXCJcXG4gICAgcmV0dXJuIFJlc3BvbnNlKHRleHRfZGF0YSwgZnVsbF91cmwpXCIsXCJzcmMvbGliL3JlcXVlc3RzX3dpdGhfY2FjaGluZy5weVwiOlwiaW1wb3J0IHJlcXVlc3RzXFxuaW1wb3J0IGpzb25cXG5cXG5QRVJNQU5FTlRfQ0FDSEVfRk5BTUUgPSBcXFwicGVybWFuZW50X2NhY2hlLnR4dFxcXCJcXG5URU1QX0NBQ0hFX0ZOQU1FID0gXFxcInRoaXNfcGFnZV9jYWNoZS50eHRcXFwiXFxuXFxuZGVmIF93cml0ZV90b19maWxlKGNhY2hlLCBmbmFtZSk6XFxuICAgIHdpdGggb3BlbihmbmFtZSwgJ3cnKSBhcyBvdXRmaWxlOlxcbiAgICAgICAgb3V0ZmlsZS53cml0ZShqc29uLmR1bXBzKGNhY2hlLCBpbmRlbnQ9MikpXFxuXFxuZGVmIF9yZWFkX2Zyb21fZmlsZShmbmFtZSk6XFxuICAgIHRyeTpcXG4gICAgICAgIHdpdGggb3BlbihmbmFtZSwgJ3InKSBhcyBpbmZpbGU6XFxuICAgICAgICAgICAgcmVzID0gaW5maWxlLnJlYWQoKVxcbiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJlcylcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmV0dXJuIHt9XFxuXFxuZGVmIGFkZF90b19jYWNoZShjYWNoZV9maWxlLCBjYWNoZV9rZXksIGNhY2hlX3ZhbHVlKTpcXG4gICAgdGVtcF9jYWNoZSA9IF9yZWFkX2Zyb21fZmlsZShjYWNoZV9maWxlKVxcbiAgICB0ZW1wX2NhY2hlW2NhY2hlX2tleV0gPSBjYWNoZV92YWx1ZVxcbiAgICBfd3JpdGVfdG9fZmlsZSh0ZW1wX2NhY2hlLCBjYWNoZV9maWxlKVxcblxcbmRlZiBjbGVhcl9jYWNoZShjYWNoZV9maWxlPVRFTVBfQ0FDSEVfRk5BTUUpOlxcbiAgICBfd3JpdGVfdG9fZmlsZSh7fSwgY2FjaGVfZmlsZSlcXG5cXG5kZWYgbWFrZV9jYWNoZV9rZXkoYmFzZXVybCwgcGFyYW1zX2QsIHByaXZhdGVfa2V5cz1bXFxcImFwaV9rZXlcXFwiLCBcXFwiYXBpa2V5XFxcIl0pOlxcbiAgICBcXFwiXFxcIlxcXCJNYWtlcyBhIGxvbmcgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcXVlcnkuXFxuICAgIEFscGhhYmV0aXplIHRoZSBrZXlzIGZyb20gdGhlIHBhcmFtcyBkaWN0aW9uYXJ5IHNvIHdlIGdldCB0aGUgc2FtZSBvcmRlciBlYWNoIHRpbWUuXFxuICAgIE9taXQga2V5cyB3aXRoIHByaXZhdGUgaW5mby5cXFwiXFxcIlxcXCJcXG4gICAgYWxwaGFiZXRpemVkX2tleXMgPSBzb3J0ZWQocGFyYW1zX2Qua2V5cygpKVxcbiAgICByZXMgPSBbXVxcbiAgICBmb3IgayBpbiBhbHBoYWJldGl6ZWRfa2V5czpcXG4gICAgICAgIGlmIGsgbm90IGluIHByaXZhdGVfa2V5czpcXG4gICAgICAgICAgICByZXMuYXBwZW5kKFxcXCJ7fS17fVxcXCIuZm9ybWF0KGssIHBhcmFtc19kW2tdKSlcXG4gICAgcmV0dXJuIGJhc2V1cmwgKyBcXFwiX1xcXCIuam9pbihyZXMpXFxuXFxuZGVmIGdldChiYXNldXJsLCBwYXJhbXM9e30sIHByaXZhdGVfa2V5c190b19pZ25vcmU9W1xcXCJhcGlfa2V5XFxcIiwgXFxcImFwaWtleVxcXCJdLCBwZXJtYW5lbnRfY2FjaGVfZmlsZT1QRVJNQU5FTlRfQ0FDSEVfRk5BTUUsIHRlbXBfY2FjaGVfZmlsZT1URU1QX0NBQ0hFX0ZOQU1FKTpcXG4gICAgZnVsbF91cmwgPSByZXF1ZXN0cy5yZXF1ZXN0VVJMKGJhc2V1cmwsIHBhcmFtcylcXG4gICAgY2FjaGVfa2V5ID0gbWFrZV9jYWNoZV9rZXkoYmFzZXVybCwgcGFyYW1zLCBwcml2YXRlX2tleXNfdG9faWdub3JlKVxcbiAgICAjIExvYWQgdGhlIHBlcm1hbmVudCBhbmQgcGFnZS1zcGVjaWZpYyBjYWNoZXMgZnJvbSBmaWxlc1xcbiAgICBwZXJtYW5lbnRfY2FjaGUgPSBfcmVhZF9mcm9tX2ZpbGUocGVybWFuZW50X2NhY2hlX2ZpbGUpXFxuICAgIHRlbXBfY2FjaGUgPSBfcmVhZF9mcm9tX2ZpbGUodGVtcF9jYWNoZV9maWxlKVxcbiAgICBpZiBjYWNoZV9rZXkgaW4gdGVtcF9jYWNoZTpcXG4gICAgICAgIHByaW50KFxcXCJmb3VuZCBpbiBwYWdlLXNwZWNpZmljIGNhY2hlXFxcIilcXG4gICAgICAgICMgbWFrZSBhIFJlc3BvbnNlIG9iamVjdCBjb250YWluaW5nIHRleHQgZnJvbSB0aGUgY2hhbmdlLCBhbmQgdGhlIGZ1bGxfdXJsIHRoYXQgd291bGQgaGF2ZSBiZWVuIGZldGNoZWRcXG4gICAgICAgIHJldHVybiByZXF1ZXN0cy5SZXNwb25zZSh0ZW1wX2NhY2hlW2NhY2hlX2tleV0sIGZ1bGxfdXJsKVxcbiAgICBlbGlmIGNhY2hlX2tleSBpbiBwZXJtYW5lbnRfY2FjaGU6XFxuICAgICAgICBwcmludChcXFwiZm91bmQgaW4gcGVybWFuZW50X2NhY2hlXFxcIilcXG4gICAgICAgICMgbWFrZSBhIFJlc3BvbnNlIG9iamVjdCBjb250YWluaW5nIHRleHQgZnJvbSB0aGUgY2hhbmdlLCBhbmQgdGhlIGZ1bGxfdXJsIHRoYXQgd291bGQgaGF2ZSBiZWVuIGZldGNoZWRcXG4gICAgICAgIHJldHVybiByZXF1ZXN0cy5SZXNwb25zZShwZXJtYW5lbnRfY2FjaGVbY2FjaGVfa2V5XSwgZnVsbF91cmwpXFxuICAgIGVsc2U6XFxuICAgICAgICBwcmludChcXFwibmV3OyBhZGRpbmcgdG8gY2FjaGVcXFwiKVxcbiAgICAgICAgIyBhY3R1YWxseSByZXF1ZXN0IGl0XFxuICAgICAgICByZXNwID0gcmVxdWVzdHMuZ2V0KGJhc2V1cmwsIHBhcmFtcylcXG4gICAgICAgICMgc2F2ZSBpdFxcbiAgICAgICAgYWRkX3RvX2NhY2hlKHRlbXBfY2FjaGVfZmlsZSwgY2FjaGVfa2V5LCByZXNwLnRleHQpXFxuICAgICAgICByZXR1cm4gcmVzcFwiLFwic3JjL2xpYi9yZXhlYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicmV4ZWMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yZmM4MjIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJmYzgyMiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JsY29tcGxldGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJybGNvbXBsZXRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JvYm90cGFyc2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJyb2JvdHBhcnNlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3J1bnB5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJydW5weSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NjaGVkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzY2hlZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NldHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNldHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zZ21sbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzZ21sbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2hhLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaGEgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zaGVsdmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNoZWx2ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NobGV4LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaGxleCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NodXRpbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2h1dGlsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2lnbmFsLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17U0lHX0RGTDpuZXcgU2suYnVpbHRpbi5pbnRfKDApLFNJR19JR046bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxDVFJMX0NfRVZFTlQ6bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxDVFJMX0JSRUFLX0VWRU5UOm5ldyBTay5idWlsdGluLmludF8oMCksTlNJRzpuZXcgU2suYnVpbHRpbi5pbnRfKDIzKSxTSUdIVVA6bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxTSUdOSU5UOm5ldyBTay5idWlsdGluLmludF8oMiksU0lHSUxMOm5ldyBTay5idWlsdGluLmludF8oNCksU0lHRlBFOm5ldyBTay5idWlsdGluLmludF8oOCksU0lHS0lMTDpuZXcgU2suYnVpbHRpbi5pbnRfKDkpLFNJR1NFR1Y6bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksU0lHVEVSTTpuZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxTSUdCUkVBSzpuZXcgU2suYnVpbHRpbi5pbnRfKDIxKSxTSUdBQlJUOm5ldyBTay5idWlsdGluLmludF8oMjIpLHBhdXNlOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJwYXVzZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApO3ZhciBhPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO3JldHVybiBhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LGEuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTpuZXcgUHJvbWlzZShmdW5jdGlvbihhKXtpZihudWxsIT1Tay5zaWduYWxzJiZTay5zaWduYWxzLmFkZEV2ZW50TGlzdGVuZXIpe2Z1bmN0aW9uIGhhbmRsZVNpZ25hbCgpe1NrLnNpZ25hbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVTaWduYWwpLGEoKX1Tay5zaWduYWxzLmFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlU2lnbmFsKX1lbHNlIGNvbnNvbGUud2FybihcXFwic2lnbmFsLnBhdXNlKCkgbm90IHN1cHBvcnRlZFxcXCIpLFNrLm1pc2NldmFsLnByaW50XyhcXFwic2lnbmFsLnBhdXNlKCkgbm90IHN1cHBvcnRlZFxcXCIpLGEoKX0pfSxhfSksc2lnbmFsOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaWduYWwuc2lnbmFsIGlzIG5vdCBzdXBwb3J0ZWQuXFxcIil9KX07cmV0dXJuIGF9O1wiLFwic3JjL2xpYi9zaXRlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaXRlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc210cGQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNtdHBkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc210cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic210cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NuZGhkci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic25kaGRyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc29ja2V0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzb2NrZXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcWxpdGUzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcWxpdGUzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3JlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmVfY29tcGlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3JlX2NvbXBpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmVfY29uc3RhbnRzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmVfY29uc3RhbnRzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3JlX3BhcnNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmVfcGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zc2wucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNzbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0YXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0YXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdGF0aXN0aWNzLnB5XCI6XCJcXFwiXFxcIlxcXCJcXG5CYXNpYyBzdGF0aXN0aWNzIG1vZHVsZS5cXG5cXG5UaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIGNhbGN1bGF0aW5nIHN0YXRpc3RpY3Mgb2YgZGF0YSwgaW5jbHVkaW5nXFxuYXZlcmFnZXMsIHZhcmlhbmNlLCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uLlxcblxcbkNhbGN1bGF0aW5nIGF2ZXJhZ2VzXFxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbkZ1bmN0aW9uICAgICAgICAgICAgRGVzY3JpcHRpb25cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbm1lYW4gICAgICAgICAgICAgICAgQXJpdGhtZXRpYyBtZWFuIChhdmVyYWdlKSBvZiBkYXRhLlxcbmhhcm1vbmljX21lYW4gICAgICAgSGFybW9uaWMgbWVhbiBvZiBkYXRhLlxcbm1lZGlhbiAgICAgICAgICAgICAgTWVkaWFuIChtaWRkbGUgdmFsdWUpIG9mIGRhdGEuXFxubWVkaWFuX2xvdyAgICAgICAgICBMb3cgbWVkaWFuIG9mIGRhdGEuXFxubWVkaWFuX2hpZ2ggICAgICAgICBIaWdoIG1lZGlhbiBvZiBkYXRhLlxcbm1lZGlhbl9ncm91cGVkICAgICAgTWVkaWFuLCBvciA1MHRoIHBlcmNlbnRpbGUsIG9mIGdyb3VwZWQgZGF0YS5cXG5tb2RlICAgICAgICAgICAgICAgIE1vZGUgKG1vc3QgY29tbW9uIHZhbHVlKSBvZiBkYXRhLlxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuXFxuQ2FsY3VsYXRlIHRoZSBhcml0aG1ldGljIG1lYW4gKFxcXCJ0aGUgYXZlcmFnZVxcXCIpIG9mIGRhdGE6XFxuXFxuPj4+IG1lYW4oWy0xLjAsIDIuNSwgMy4yNSwgNS43NV0pXFxuMi42MjVcXG5cXG5cXG5DYWxjdWxhdGUgdGhlIHN0YW5kYXJkIG1lZGlhbiBvZiBkaXNjcmV0ZSBkYXRhOlxcblxcbj4+PiBtZWRpYW4oWzIsIDMsIDQsIDVdKVxcbjMuNVxcblxcblxcbkNhbGN1bGF0ZSB0aGUgbWVkaWFuLCBvciA1MHRoIHBlcmNlbnRpbGUsIG9mIGRhdGEgZ3JvdXBlZCBpbnRvIGNsYXNzIGludGVydmFsc1xcbmNlbnRyZWQgb24gdGhlIGRhdGEgdmFsdWVzIHByb3ZpZGVkLiBFLmcuIGlmIHlvdXIgZGF0YSBwb2ludHMgYXJlIHJvdW5kZWQgdG9cXG50aGUgbmVhcmVzdCB3aG9sZSBudW1iZXI6XFxuXFxuPj4+IG1lZGlhbl9ncm91cGVkKFsyLCAyLCAzLCAzLCAzLCA0XSkgICNkb2N0ZXN0OiArRUxMSVBTSVNcXG4yLjgzMzMzMzMzMzMuLi5cXG5cXG5UaGlzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBpbiB0aGlzIHdheTogeW91IGhhdmUgdHdvIGRhdGEgcG9pbnRzIGluIHRoZSBjbGFzc1xcbmludGVydmFsIDEuNS0yLjUsIHRocmVlIGRhdGEgcG9pbnRzIGluIHRoZSBjbGFzcyBpbnRlcnZhbCAyLjUtMy41LCBhbmQgb25lIGluXFxudGhlIGNsYXNzIGludGVydmFsIDMuNS00LjUuIFRoZSBtZWRpYW4gb2YgdGhlc2UgZGF0YSBwb2ludHMgaXMgMi44MzMzLi4uXFxuXFxuXFxuQ2FsY3VsYXRpbmcgdmFyaWFiaWxpdHkgb3Igc3ByZWFkXFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5GdW5jdGlvbiAgICAgICAgICAgIERlc2NyaXB0aW9uXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5wdmFyaWFuY2UgICAgICAgICAgIFBvcHVsYXRpb24gdmFyaWFuY2Ugb2YgZGF0YS5cXG52YXJpYW5jZSAgICAgICAgICAgIFNhbXBsZSB2YXJpYW5jZSBvZiBkYXRhLlxcbnBzdGRldiAgICAgICAgICAgICAgUG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZGF0YS5cXG5zdGRldiAgICAgICAgICAgICAgIFNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZGF0YS5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcblxcbkNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHNhbXBsZSBkYXRhOlxcblxcbj4+PiBzdGRldihbMi41LCAzLjI1LCA1LjUsIDExLjI1LCAxMS43NV0pICAjZG9jdGVzdDogK0VMTElQU0lTXFxuNC4zODk2MTg0MzQ0NC4uLlxcblxcbklmIHlvdSBoYXZlIHByZXZpb3VzbHkgY2FsY3VsYXRlZCB0aGUgbWVhbiwgeW91IGNhbiBwYXNzIGl0IGFzIHRoZSBvcHRpb25hbFxcbnNlY29uZCBhcmd1bWVudCB0byB0aGUgZm91ciBcXFwic3ByZWFkXFxcIiBmdW5jdGlvbnMgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdDpcXG5cXG4+Pj4gZGF0YSA9IFsxLCAyLCAyLCA0LCA0LCA0LCA1LCA2XVxcbj4+PiBtdSA9IG1lYW4oZGF0YSlcXG4+Pj4gcHZhcmlhbmNlKGRhdGEsIG11KVxcbjIuNVxcblxcblxcbkV4Y2VwdGlvbnNcXG4tLS0tLS0tLS0tXFxuXFxuQSBzaW5nbGUgZXhjZXB0aW9uIGlzIGRlZmluZWQ6IFN0YXRpc3RpY3NFcnJvciBpcyBhIHN1YmNsYXNzIG9mIFZhbHVlRXJyb3IuXFxuXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFsgJ1N0YXRpc3RpY3NFcnJvcicsXFxuICAgICAgICAgICAgJ3BzdGRldicsICdwdmFyaWFuY2UnLCAnc3RkZXYnLCAndmFyaWFuY2UnLFxcbiAgICAgICAgICAgICdtZWRpYW4nLCAgJ21lZGlhbl9sb3cnLCAnbWVkaWFuX2hpZ2gnLCAnbWVkaWFuX2dyb3VwZWQnLFxcbiAgICAgICAgICAgICdtZWFuJywgJ21vZGUnLCAnaGFybW9uaWNfbWVhbicsXFxuICAgICAgICAgIF1cXG5cXG5mcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDb3VudGVyXFxuZnJvbSBtYXRoIGltcG9ydCBzcXJ0XFxuXFxuZGVmIG1lYW4oZGF0YSk6XFxuICAgIHJldHVybiBzdW0oZGF0YSkgLyBsZW4oZGF0YSlcXG5cXG5kZWYgaGFybW9uaWNfbWVhbihkYXRhKTpcXG4gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvclxcblxcblxcbmRlZiBtZWRpYW4oZGF0YSk6XFxuICAgIF9kYXRhID0gc29ydGVkKGRhdGEpXFxuICAgIGwgPSBsZW4oX2RhdGEpXFxuICAgIGlmIGwgJSAyID09IDA6XFxuICAgICAgICBfbWVkaWFuID0gKF9kYXRhW2wvLzJdICsgX2RhdGFbbC8vMi0xXSkgLyAyXFxuICAgIGVsc2U6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgcmV0dXJuIF9tZWRpYW5cXG5cXG5kZWYgbWVkaWFuX2xvdyhkYXRhKTpcXG4gICAgX2RhdGEgPSBzb3J0ZWQoZGF0YSlcXG4gICAgbCA9IGxlbihfZGF0YSlcXG4gICAgaWYgbCAlIDIgPT0gMDpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yLTFdXFxuICAgIGVsc2U6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgcmV0dXJuIF9tZWRpYW5cXG5cXG5cXG5kZWYgbWVkaWFuX2hpZ2goZGF0YSk6XFxuICAgIF9kYXRhID0gc29ydGVkKGRhdGEpXFxuICAgIGwgPSBsZW4oX2RhdGEpXFxuICAgIGlmIGwgJSAyID09IDA6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgZWxzZTpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yXVxcbiAgICByZXR1cm4gX21lZGlhblxcblxcblxcbmRlZiBtZWRpYW5fZ3JvdXBlZChkYXRhKTpcXG4gICAgcmV0dXJuIG1lZGlhbihkYXRhKVxcblxcbmRlZiBtb2RlKGRhdGEpOlxcbiAgICBjb3VudGVyID0gQ291bnRlcihkYXRhKVxcbiAgICBtYXhfY291bnQgPSBtYXgoY291bnRlci52YWx1ZXMoKSlcXG4gICAgX21vZGUgPSBbayBmb3Igayx2IGluIGNvdW50ZXIuaXRlbXMoKSBpZiB2ID09IG1heF9jb3VudF1cXG4gICAgaWYgbGVuKF9tb2RlKSA+IDE6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJObyBVbmlxdWUgTW9kZSwgZm91bmQge30gZXF1YWxseSBjb21tb24gdmFsdWVzXFxcIi5mb3JtYXQobGVuKF9tb2RlKSkpXFxuICAgIGVsc2U6XFxuICAgICAgICByZXR1cm4gX21vZGVbMF1cXG5cXG5cXG5kZWYgdmFyaWFuY2UoZGF0YSk6XFxuICAgIGF2ZXJhZ2U9bWVhbihkYXRhKVxcbiAgICBfdmFyaWFuY2U9MFxcbiAgICBmb3IgZCBpbiBkYXRhOlxcbiAgICAgICAgX3ZhcmlhbmNlICs9ICgoYXZlcmFnZS1kKSoqMilcXG4gICAgICAgIGZpbmFsX3ZhcmlhbmNlPV92YXJpYW5jZS9sZW4oZGF0YSlcXG4gICAgcmV0dXJuIGZpbmFsX3ZhcmlhbmNlXFxuXFxuZGVmIHB2YXJpYW5jZShkYXRhKTpcXG4gICAgYXZlcmFnZT1tZWFuKGRhdGEpXFxuICAgIF92YXJpYW5jZT0wXFxuICAgIGZvciBkIGluIGRhdGE6XFxuICAgICAgICBfdmFyaWFuY2UgKz0gKChhdmVyYWdlLWQpKioyKVxcbiAgICAgICAgZmluYWxfdmFyaWFuY2U9X3ZhcmlhbmNlL2xlbihkYXRhKVxcbiAgICByZXR1cm4gZmluYWxfdmFyaWFuY2VcXG5cXG5kZWYgdmFyaWFuY2UoZGF0YSk6XFxuICAgIGF2ZXJhZ2U9bWVhbihkYXRhKVxcbiAgICBfdmFyaWFuY2U9MFxcbiAgICBmb3IgZCBpbiBkYXRhOlxcbiAgICAgICAgX3ZhcmlhbmNlICs9ICgoYXZlcmFnZS1kKSoqMilcXG4gICAgICAgIGZpbmFsX3ZhcmlhbmNlPV92YXJpYW5jZS8obGVuKGRhdGEpIC0xKVxcbiAgICByZXR1cm4gZmluYWxfdmFyaWFuY2VcXG5cXG5kZWYgcHN0ZGV2KGRhdGEpOlxcbiAgICByZXR1cm4gc3FydChwdmFyaWFuY2UoZGF0YSkpXFxuXFxuZGVmIHN0ZGV2KGRhdGEpOlxcbiAgICByZXR1cm4gc3FydCh2YXJpYW5jZShkYXRhKSlcXG5cXG5cIixcInNyYy9saWIvc3RhdHZmcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RhdHZmcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0cmluZy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e307cmV0dXJuIGEuYXNjaWlfbG93ZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcXFwiKSxhLmFzY2lpX3VwcGVyY2FzZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXFxcIiksYS5hc2NpaV9sZXR0ZXJzPW5ldyBTay5idWlsdGluLnN0cihhLmFzY2lpX2xvd2VyY2FzZS52K2EuYXNjaWlfdXBwZXJjYXNlLnYpLGEubG93ZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcXFwiKSxhLnVwcGVyY2FzZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXFxcIiksYS5sZXR0ZXJzPW5ldyBTay5idWlsdGluLnN0cihhLmxvd2VyY2FzZS52K2EudXBwZXJjYXNlLnYpLGEuZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1Njc4OVxcXCIpLGEuaGV4ZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRlxcXCIpLGEub2N0ZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1NjdcXFwiKSxhLnB1bmN0dWF0aW9uPW5ldyBTay5idWlsdGluLnN0cihcXFwiIVxcXFxcXFwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxcXFxcXFxdXl9ge3x9flxcXCIpLGEud2hpdGVzcGFjZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXFx0XFxcXG5cXFxceDBCXFxcXGZcXFxcciBcXFwiKSxhLnByaW50YWJsZT1uZXcgU2suYnVpbHRpbi5zdHIoYS5kaWdpdHMudithLmxldHRlcnMudithLnB1bmN0dWF0aW9uLnYrXFxcIiBcXFxcdFxcXFxuXFxcXHJcXFxceDBCXFxcXGZcXFwiKSxhLnNwbGl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oLi4uYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLnN0ci5wcm90b3R5cGUuc3BsaXQsYSl9KSxhLmNhcGl0YWxpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5jYXBpdGFsaXplLFthXSl9KSxhLmpvaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiB2b2lkIDA9PT1iJiYoYj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiBcXFwiKSksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5qb2luLFtiLGFdKX0pLGEuY2Fwd29yZHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImNhcHdvcmRzXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMiksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiBcXFwiKSksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzZXAgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2Zvcih2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5zcGxpdCxbYixjXSkudixlPVtdLGY9MDtmPGQubGVuZ3RoO2YrKyl7dmFyIGc9ZFtmXSxoPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmNhcGl0YWxpemUsW2ddKTtlLnB1c2goaCl9cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmpvaW4sW25ldyBTay5idWlsdGluLmxpc3QoZSksY10pfSksYX07XCIsXCJzcmMvbGliL3N0cmluZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RyaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RyaW5nb2xkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJpbmdvbGQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdHJpbmdwcmVwLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJpbmdwcmVwIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RydWN0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJ1Y3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdWJwcm9jZXNzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdWJwcm9jZXNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3VuYXUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN1bmF1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3VuYXVkaW8ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN1bmF1ZGlvIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3ltYm9sLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzeW1ib2wgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zeW10YWJsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3ltdGFibGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90YWJuYW5ueS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGFibmFubnkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90YXJmaWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0YXJmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGVsbmV0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZWxuZXRsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZW1wZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVtcGZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZXN0L19faW5pdF9fLnB5XCI6XCJfX2F1dGhvcl9fID0gJ2JtaWxsZXInXFxuXFxuZGVmIHRlc3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBwbGFjZXM9NSk6XFxuICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsaW50KTpcXG4gICAgICAgIGlmIGFjdHVhbCA9PSBleHBlY3RlZDpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgZWxpZiBpc2luc3RhbmNlKGV4cGVjdGVkLGZsb2F0KTpcXG4gICAgICAgIGlmIGFicyhhY3R1YWwtZXhwZWN0ZWQpIDwgMTAqKigtcGxhY2VzKTpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgZWxzZTpcXG4gICAgICAgIGlmIGFjdHVhbCA9PSBleHBlY3RlZDpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgcHJpbnQoJ1Rlc3QgRmFpbGVkOiBleHBlY3RlZCAnICsgc3RyKGV4cGVjdGVkKSArICcgYnV0IGdvdCAnICsgc3RyKGFjdHVhbCkpXFxuICAgIHJldHVybiBGYWxzZVxcblxcbmRlZiB0ZXN0Tm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCk6XFxuICAgIHBhc3NcXG5cXG5cIixcInNyYy9saWIvdGVzdC9iYWRfZ2V0YXR0ci5weVwiOlwieCA9IDFcXG5cXG5fX2dldGF0dHJfXyA9IFxcXCJTdXJwcmlzZSFcXFwiXFxuX19kaXJfXyA9IFxcXCJTdXJwcmlzZSBhZ2FpbiFcXFwiXFxuXCIsXCJzcmMvbGliL3Rlc3QvYmFkX2dldGF0dHIyLnB5XCI6XCJkZWYgX19nZXRhdHRyX18oKTpcXG4gICAgXFxcIkJhZCBvbmVcXFwiXFxuXFxueCA9IDFcXG5cXG5kZWYgX19kaXJfXyhiYWRfc2lnKTpcXG4gICAgcmV0dXJuIFtdXFxuXCIsXCJzcmMvbGliL3Rlc3QvYmFkX2dldGF0dHIzLnB5XCI6XCJkZWYgX19nZXRhdHRyX18obmFtZSk6XFxuICAgIGdsb2JhbCBfX2dldGF0dHJfX1xcbiAgICBpZiBuYW1lICE9ICdkZWxnZXRhdHRyJzpcXG4gICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yXFxuICAgIGRlbCBfX2dldGF0dHJfX1xcbiAgICByYWlzZSBBdHRyaWJ1dGVFcnJvclxcblwiLFwic3JjL2xpYi90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGVjaW1hbHRlc3RkYXRhIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGVzdC9nb29kX2dldGF0dHIucHlcIjpcInggPSAxXFxuXFxuZGVmIF9fZGlyX18oKTpcXG4gICAgcmV0dXJuIFsnYScsICdiJywgJ2MnXVxcblxcbmRlZiBfX2dldGF0dHJfXyhuYW1lKTpcXG4gICAgaWYgbmFtZSA9PSBcXFwieW9sb1xcXCI6XFxuICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihcXFwiRGVwcmVjYXRlZCwgdXNlIHdoYXRldmVyIGluc3RlYWRcXFwiKVxcbiAgICByZXR1cm4gZlxcXCJUaGVyZSBpcyB7bmFtZX1cXFwiXFxuXFxueSA9IDJcXG5cIixcInNyYy9saWIvdGVzdC90ZXN0X3N1cHBvcnQucHlcIjpcIlxcXCJcXFwiXFxcIlN1cHBvcnRpbmcgZGVmaW5pdGlvbnMgZm9yIHRoZSBQeXRob24gcmVncmVzc2lvbiB0ZXN0cy5cXFwiXFxcIlxcXCJcXG5cXG5pZiBfX25hbWVfXyAhPSAndGVzdC50ZXN0X3N1cHBvcnQnOlxcbiAgICByYWlzZSBJbXBvcnRFcnJvcigndGVzdF9zdXBwb3J0IG11c3QgYmUgaW1wb3J0ZWQgZnJvbSB0aGUgdGVzdCBwYWNrYWdlJylcXG5cXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG5cXG4jIGRlZiBydW5fdW5pdHRlc3QoKmNsYXNzZXMpOlxcbiMgICAgIFxcXCJcXFwiXFxcIlJ1biB0ZXN0cyBmcm9tIHVuaXR0ZXN0LlRlc3RDYXNlLWRlcml2ZWQgY2xhc3Nlcy5cXFwiXFxcIlxcXCJcXG4jICAgICB2YWxpZF90eXBlcyA9ICh1bml0dGVzdC5UZXN0U3VpdGUsIHVuaXR0ZXN0LlRlc3RDYXNlKVxcbiMgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKClcXG4jICAgICBmb3IgY2xzIGluIGNsYXNzZXM6XFxuIyAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2xzLCBzdHIpOlxcbiMgICAgICAgICAgICAgaWYgY2xzIGluIHN5cy5tb2R1bGVzOlxcbiMgICAgICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QuZmluZFRlc3RDYXNlcyhzeXMubW9kdWxlc1tjbHNdKSlcXG4jICAgICAgICAgICAgIGVsc2U6XFxuIyAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwic3RyIGFyZ3VtZW50cyBtdXN0IGJlIGtleXMgaW4gc3lzLm1vZHVsZXNcXFwiKVxcbiMgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoY2xzLCB2YWxpZF90eXBlcyk6XFxuIyAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KGNscylcXG4jICAgICAgICAgZWxzZTpcXG4jICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKGNscykpXFxuIyAgICAgX3J1bl9zdWl0ZShzdWl0ZSlcXG5cXG5kZWYgcnVuX3VuaXR0ZXN0KCpjbGFzc2VzKTpcXG4gICAgXFxcIlxcXCJcXFwiUnVuIHRlc3RzIGZyb20gdW5pdHRlc3QuVGVzdENhc2UtZGVyaXZlZCBjbGFzc2VzLlxcXCJcXFwiXFxcIlxcbiAgICBmb3IgY2xzIGluIGNsYXNzZXM6XFxuICAgICAgICBwcmludCBjbHNcXG4gICAgICAgIGlmIGlzc3ViY2xhc3MoY2xzLCB1bml0dGVzdC5UZXN0Q2FzZSk6XFxuICAgICAgICAgICAgY2xzKCkubWFpbigpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHByaW50IFxcXCJEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBcXFwiLCBjbHNcXG5cIixcInNyYy9saWIvdGV4dHdyYXAucHlcIjpcIlxcXCJcXFwiXFxcIlRleHQgd3JhcHBpbmcgYW5kIGZpbGxpbmcuXFxuXFxcIlxcXCJcXFwiXFxuXFxuIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBHcmVnb3J5IFAuIFdhcmQuXFxuIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uXFxuIyBXcml0dGVuIGJ5IEdyZWcgV2FyZCA8Z3dhcmRAcHl0aG9uLm5ldD5cXG5cXG5pbXBvcnQgcmUsIHN0cmluZ1xcblxcbl9fYWxsX18gPSBbJ1RleHRXcmFwcGVyJywgJ3dyYXAnLCAnZmlsbCcsICdkZWRlbnQnLCAnaW5kZW50JywgJ3Nob3J0ZW4nXVxcblxcbiMgSGFyZGNvZGUgdGhlIHJlY29nbml6ZWQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHRoZSBVUy1BU0NJSVxcbiMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLiAgVGhlIG1haW4gcmVhc29uIGZvciBkb2luZyB0aGlzIGlzIHRoYXRcXG4jIHNvbWUgVW5pY29kZSBzcGFjZXMgKGxpa2UgXFxcXHUwMGEwKSBhcmUgbm9uLWJyZWFraW5nIHdoaXRlc3BhY2VzLlxcbl93aGl0ZXNwYWNlID0gJ1xcXFx0XFxcXG5cXFxceDBiXFxcXHgwY1xcXFxyICdcXG5cXG5jbGFzcyBUZXh0V3JhcHBlcjpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIE9iamVjdCBmb3Igd3JhcHBpbmcvZmlsbGluZyB0ZXh0LiAgVGhlIHB1YmxpYyBpbnRlcmZhY2UgY29uc2lzdHMgb2ZcXG4gICAgdGhlIHdyYXAoKSBhbmQgZmlsbCgpIG1ldGhvZHM7IHRoZSBvdGhlciBtZXRob2RzIGFyZSBqdXN0IHRoZXJlIGZvclxcbiAgICBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIGluIG9yZGVyIHRvIHR3ZWFrIHRoZSBkZWZhdWx0IGJlaGF2aW91ci5cXG4gICAgSWYgeW91IHdhbnQgdG8gY29tcGxldGVseSByZXBsYWNlIHRoZSBtYWluIHdyYXBwaW5nIGFsZ29yaXRobSxcXG4gICAgeW91J2xsIHByb2JhYmx5IGhhdmUgdG8gb3ZlcnJpZGUgX3dyYXBfY2h1bmtzKCkuXFxuICAgIFNldmVyYWwgaW5zdGFuY2UgYXR0cmlidXRlcyBjb250cm9sIHZhcmlvdXMgYXNwZWN0cyBvZiB3cmFwcGluZzpcXG4gICAgICB3aWR0aCAoZGVmYXVsdDogNzApXFxuICAgICAgICB0aGUgbWF4aW11bSB3aWR0aCBvZiB3cmFwcGVkIGxpbmVzICh1bmxlc3MgYnJlYWtfbG9uZ193b3Jkc1xcbiAgICAgICAgaXMgZmFsc2UpXFxuICAgICAgaW5pdGlhbF9pbmRlbnQgKGRlZmF1bHQ6IFxcXCJcXFwiKVxcbiAgICAgICAgc3RyaW5nIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIGZpcnN0IGxpbmUgb2Ygd3JhcHBlZFxcbiAgICAgICAgb3V0cHV0LiAgQ291bnRzIHRvd2FyZHMgdGhlIGxpbmUncyB3aWR0aC5cXG4gICAgICBzdWJzZXF1ZW50X2luZGVudCAoZGVmYXVsdDogXFxcIlxcXCIpXFxuICAgICAgICBzdHJpbmcgdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byBhbGwgbGluZXMgc2F2ZSB0aGUgZmlyc3RcXG4gICAgICAgIG9mIHdyYXBwZWQgb3V0cHV0OyBhbHNvIGNvdW50cyB0b3dhcmRzIGVhY2ggbGluZSdzIHdpZHRoLlxcbiAgICAgIGV4cGFuZF90YWJzIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgRXhwYW5kIHRhYnMgaW4gaW5wdXQgdGV4dCB0byBzcGFjZXMgYmVmb3JlIGZ1cnRoZXIgcHJvY2Vzc2luZy5cXG4gICAgICAgIEVhY2ggdGFiIHdpbGwgYmVjb21lIDAgLi4gJ3RhYnNpemUnIHNwYWNlcywgZGVwZW5kaW5nIG9uIGl0cyBwb3NpdGlvblxcbiAgICAgICAgaW4gaXRzIGxpbmUuICBJZiBmYWxzZSwgZWFjaCB0YWIgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIuXFxuICAgICAgdGFic2l6ZSAoZGVmYXVsdDogOClcXG4gICAgICAgIEV4cGFuZCB0YWJzIGluIGlucHV0IHRleHQgdG8gMCAuLiAndGFic2l6ZScgc3BhY2VzLCB1bmxlc3NcXG4gICAgICAgICdleHBhbmRfdGFicycgaXMgZmFsc2UuXFxuICAgICAgcmVwbGFjZV93aGl0ZXNwYWNlIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgUmVwbGFjZSBhbGwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dCB0ZXh0IGJ5IHNwYWNlc1xcbiAgICAgICAgYWZ0ZXIgdGFiIGV4cGFuc2lvbi4gIE5vdGUgdGhhdCBpZiBleHBhbmRfdGFicyBpcyBmYWxzZSBhbmRcXG4gICAgICAgIHJlcGxhY2Vfd2hpdGVzcGFjZSBpcyB0cnVlLCBldmVyeSB0YWIgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYVxcbiAgICAgICAgc2luZ2xlIHNwYWNlIVxcbiAgICAgIGZpeF9zZW50ZW5jZV9lbmRpbmdzIChkZWZhdWx0OiBmYWxzZSlcXG4gICAgICAgIEVuc3VyZSB0aGF0IHNlbnRlbmNlLWVuZGluZyBwdW5jdHVhdGlvbiBpcyBhbHdheXMgZm9sbG93ZWRcXG4gICAgICAgIGJ5IHR3byBzcGFjZXMuICBPZmYgYnkgZGVmYXVsdCBiZWNhdXNlIHRoZSBhbGdvcml0aG0gaXNcXG4gICAgICAgICh1bmF2b2lkYWJseSkgaW1wZXJmZWN0LlxcbiAgICAgIGJyZWFrX2xvbmdfd29yZHMgKGRlZmF1bHQ6IHRydWUpXFxuICAgICAgICBCcmVhayB3b3JkcyBsb25nZXIgdGhhbiAnd2lkdGgnLiAgSWYgZmFsc2UsIHRob3NlIHdvcmRzIHdpbGwgbm90XFxuICAgICAgICBiZSBicm9rZW4sIGFuZCBzb21lIGxpbmVzIG1pZ2h0IGJlIGxvbmdlciB0aGFuICd3aWR0aCcuXFxuICAgICAgYnJlYWtfb25faHlwaGVucyAoZGVmYXVsdDogdHJ1ZSlcXG4gICAgICAgIEFsbG93IGJyZWFraW5nIGh5cGhlbmF0ZWQgd29yZHMuIElmIHRydWUsIHdyYXBwaW5nIHdpbGwgb2NjdXJcXG4gICAgICAgIHByZWZlcmFibHkgb24gd2hpdGVzcGFjZXMgYW5kIHJpZ2h0IGFmdGVyIGh5cGhlbnMgcGFydCBvZlxcbiAgICAgICAgY29tcG91bmQgd29yZHMuXFxuICAgICAgZHJvcF93aGl0ZXNwYWNlIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgRHJvcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gbGluZXMuXFxuICAgICAgbWF4X2xpbmVzIChkZWZhdWx0OiBOb25lKVxcbiAgICAgICAgVHJ1bmNhdGUgd3JhcHBlZCBsaW5lcy5cXG4gICAgICBwbGFjZWhvbGRlciAoZGVmYXVsdDogJyBbLi4uXScpXFxuICAgICAgICBBcHBlbmQgdG8gdGhlIGxhc3QgbGluZSBvZiB0cnVuY2F0ZWQgdGV4dC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIHVuaWNvZGVfd2hpdGVzcGFjZV90cmFucyA9IHt9XFxuICAgICMgdXNwYWNlID0gb3JkKCcgJylcXG4gICAgdXNwYWNlID0gJyAnXFxuICAgIGZvciB4IGluIF93aGl0ZXNwYWNlOlxcbiAgICAgICAgIyB1bmljb2RlX3doaXRlc3BhY2VfdHJhbnNbb3JkKHgpXSA9IHVzcGFjZVxcbiAgICAgICAgdW5pY29kZV93aGl0ZXNwYWNlX3RyYW5zW3hdID0gdXNwYWNlXFxuXFxuICAgICMgVGhpcyBmdW5reSBsaXR0bGUgcmVnZXggaXMganVzdCB0aGUgdHJpY2sgZm9yIHNwbGl0dGluZ1xcbiAgICAjIHRleHQgdXAgaW50byB3b3JkLXdyYXBwYWJsZSBjaHVua3MuICBFLmcuXFxuICAgICMgICBcXFwiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hXFxcIlxcbiAgICAjIHNwbGl0cyBpbnRvXFxuICAgICMgICBIZWxsby8gL3RoZXJlLyAvLS0vIC95b3UvIC9nb29mLS9iYWxsLC8gL3VzZS8gL3RoZS8gLy1iLyAvb3B0aW9uIVxcbiAgICAjIChhZnRlciBzdHJpcHBpbmcgb3V0IGVtcHR5IHN0cmluZ3MpLlxcbiAgICB3b3Jkc2VwX3JlID0gcmUuY29tcGlsZShcXG4gICAgICAgIHInKFxcXFxzK3wnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IHdoaXRlc3BhY2VcXG4gICAgICAgIHInW15cXFxcc1xcXFx3XSpcXFxcdytbXjAtOVxcXFxXXS0oPz1cXFxcdytbXjAtOVxcXFxXXSkpJykgICMgaHlwaGVuYXRlZCB3b3Jkc1xcbiAgICBlbV9kYXNoID0gcmUuY29tcGlsZShyJyhcXFxccyt8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFueSB3aGl0ZXNwYWNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHInW15cXFxcc1xcXFx3XSpcXFxcdytbXjAtOVxcXFxXXS0oPz1cXFxcdytbXjAtOVxcXFxXXSl8JyAgICMgaHlwaGVuYXRlZCB3b3Jkc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICByJyg/IV4pLXsyLH0oPz1cXFxcdykpJykgICAgICAgICAgICAgICAgICAgICAjIGVtLWRhc2hcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgICMgVGhpcyBsZXNzIGZ1bmt5IGxpdHRsZSByZWdleCBqdXN0IHNwbGl0IG9uIHJlY29nbml6ZWQgc3BhY2VzLiBFLmcuXFxuICAgICMgICBcXFwiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hXFxcIlxcbiAgICAjIHNwbGl0cyBpbnRvXFxuICAgICMgICBIZWxsby8gL3RoZXJlLyAvLS0vIC95b3UvIC9nb29mLWJhbGwsLyAvdXNlLyAvdGhlLyAvLWIvIC9vcHRpb24hL1xcbiAgICB3b3Jkc2VwX3NpbXBsZV9yZSA9IHJlLmNvbXBpbGUocicoXFxcXHMrKScpXFxuXFxuXFxuICAgICMgWFhYIHRoaXMgaXMgbm90IGxvY2FsZS0gb3IgY2hhcnNldC1hd2FyZSAtLSBzdHJpbmcubG93ZXJjYXNlXFxuICAgICMgaXMgVVMtQVNDSUkgb25seSAoYW5kIHRoZXJlZm9yZSBFbmdsaXNoLW9ubHkpXFxuICAgIHNlbnRlbmNlX2VuZF9yZSA9IHJlLmNvbXBpbGUocidbYS16XScgICAgICAgICAgICAgIyBsb3dlcmNhc2UgbGV0dGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidbXFxcXC5cXFxcIVxcXFw/XScgICAgICAgICAgIyBzZW50ZW5jZS1lbmRpbmcgcHVuY3QuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidbXFxcXFxcXCJcXFxcJ10/JyAgICAgICAgICAgIyBvcHRpb25hbCBlbmQtb2YtcXVvdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1xcXFxaJykgICAgICAgICAgICAgICAjIGVuZCBvZiBjaHVua1xcbiAgICBzZW50ZW5jZV9lbmRfcmUgPSByJ1thLXpdW1xcXFwuXFxcXCFcXFxcP11bXFxcXFxcXCJcXFxcJ10/J1xcblxcbiAgICBkZWYgX19pbml0X18oc2VsZixcXG4gICAgICAgICAgICAgICAgIHdpZHRoPTcwLFxcbiAgICAgICAgICAgICAgICAgaW5pdGlhbF9pbmRlbnQ9XFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50X2luZGVudD1cXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgIGV4cGFuZF90YWJzPVRydWUsXFxuICAgICAgICAgICAgICAgICByZXBsYWNlX3doaXRlc3BhY2U9VHJ1ZSxcXG4gICAgICAgICAgICAgICAgIGZpeF9zZW50ZW5jZV9lbmRpbmdzPUZhbHNlLFxcbiAgICAgICAgICAgICAgICAgYnJlYWtfbG9uZ193b3Jkcz1UcnVlLFxcbiAgICAgICAgICAgICAgICAgZHJvcF93aGl0ZXNwYWNlPVRydWUsXFxuICAgICAgICAgICAgICAgICBicmVha19vbl9oeXBoZW5zPVRydWUsXFxuICAgICAgICAgICAgICAgICB0YWJzaXplPTgsXFxuICAgICAgICAgICAgICAgICBtYXhfbGluZXM9Tm9uZSxcXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPScgWy4uLl0nKTpcXG4gICAgICAgIHNlbGYud2lkdGggPSB3aWR0aFxcbiAgICAgICAgc2VsZi5pbml0aWFsX2luZGVudCA9IGluaXRpYWxfaW5kZW50XFxuICAgICAgICBzZWxmLnN1YnNlcXVlbnRfaW5kZW50ID0gc3Vic2VxdWVudF9pbmRlbnRcXG4gICAgICAgIHNlbGYuZXhwYW5kX3RhYnMgPSBleHBhbmRfdGFic1xcbiAgICAgICAgc2VsZi5yZXBsYWNlX3doaXRlc3BhY2UgPSByZXBsYWNlX3doaXRlc3BhY2VcXG4gICAgICAgIHNlbGYuZml4X3NlbnRlbmNlX2VuZGluZ3MgPSBmaXhfc2VudGVuY2VfZW5kaW5nc1xcbiAgICAgICAgc2VsZi5icmVha19sb25nX3dvcmRzID0gYnJlYWtfbG9uZ193b3Jkc1xcbiAgICAgICAgc2VsZi5kcm9wX3doaXRlc3BhY2UgPSBkcm9wX3doaXRlc3BhY2VcXG4gICAgICAgIHNlbGYuYnJlYWtfb25faHlwaGVucyA9IGJyZWFrX29uX2h5cGhlbnNcXG4gICAgICAgIHNlbGYudGFic2l6ZSA9IHRhYnNpemVcXG4gICAgICAgIHNlbGYubWF4X2xpbmVzID0gbWF4X2xpbmVzXFxuICAgICAgICBzZWxmLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXJcXG5cXG5cXG4gICAgIyAtLSBQcml2YXRlIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gICAgIyAocG9zc2libHkgdXNlZnVsIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlKVxcblxcbiAgICBkZWYgX211bmdlX3doaXRlc3BhY2Uoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfbXVuZ2Vfd2hpdGVzcGFjZSh0ZXh0IDogc3RyaW5nKSAtPiBzdHJpbmdcXG4gICAgICAgIE11bmdlIHdoaXRlc3BhY2UgaW4gdGV4dDogZXhwYW5kIHRhYnMgYW5kIGNvbnZlcnQgYWxsIG90aGVyXFxuICAgICAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gc3BhY2VzLiAgRWcuIFxcXCIgZm9vXFxcXFxcXFx0YmFyXFxcXFxcXFxuXFxcXFxcXFxuYmF6XFxcIlxcbiAgICAgICAgYmVjb21lcyBcXFwiIGZvbyAgICBiYXIgIGJhelxcXCIuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuZXhwYW5kX3RhYnM6XFxuICAgICAgICAgICAgdGV4dCA9IHRleHQuZXhwYW5kdGFicyhzZWxmLnRhYnNpemUpXFxuICAgICAgICBpZiBzZWxmLnJlcGxhY2Vfd2hpdGVzcGFjZTpcXG4gICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gc2VsZi51bmljb2RlX3doaXRlc3BhY2VfdHJhbnMuaXRlbXMoKTpcXG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShrZXksIHZhbClcXG4gICAgICAgIHJldHVybiB0ZXh0XFxuXFxuXFxuICAgIGRlZiBfc3BsaXQoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfc3BsaXQodGV4dCA6IHN0cmluZykgLT4gW3N0cmluZ11cXG4gICAgICAgIFNwbGl0IHRoZSB0ZXh0IHRvIHdyYXAgaW50byBpbmRpdmlzaWJsZSBjaHVua3MuICBDaHVua3MgYXJlXFxuICAgICAgICBub3QgcXVpdGUgdGhlIHNhbWUgYXMgd29yZHM7IHNlZSBfd3JhcF9jaHVua3MoKSBmb3IgZnVsbFxcbiAgICAgICAgZGV0YWlscy4gIEFzIGFuIGV4YW1wbGUsIHRoZSB0ZXh0XFxuICAgICAgICAgIExvb2ssIGdvb2YtYmFsbCAtLSB1c2UgdGhlIC1iIG9wdGlvbiFcXG4gICAgICAgIGJyZWFrcyBpbnRvIHRoZSBmb2xsb3dpbmcgY2h1bmtzOlxcbiAgICAgICAgICAnTG9vaywnLCAnICcsICdnb29mLScsICdiYWxsJywgJyAnLCAnLS0nLCAnICcsXFxuICAgICAgICAgICd1c2UnLCAnICcsICd0aGUnLCAnICcsICctYicsICcgJywgJ29wdGlvbiEnXFxuICAgICAgICBpZiBicmVha19vbl9oeXBoZW5zIGlzIFRydWUsIG9yIGluOlxcbiAgICAgICAgICAnTG9vaywnLCAnICcsICdnb29mLWJhbGwnLCAnICcsICctLScsICcgJyxcXG4gICAgICAgICAgJ3VzZScsICcgJywgJ3RoZScsICcgJywgJy1iJywgJyAnLCBvcHRpb24hJ1xcbiAgICAgICAgb3RoZXJ3aXNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLmJyZWFrX29uX2h5cGhlbnMgaXMgVHJ1ZTpcXG4gICAgICAgICAgICBjaHVua3MgPSBzZWxmLndvcmRzZXBfcmUuc3BsaXQodGV4dClcXG4gICAgICAgICAgICBpZiBcXFwiLS1cXFwiIGluIHRleHQ6XFxuICAgICAgICAgICAgICAgIGNodW5rcyA9IFtpdGVtIFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3VibGlzdCBpbiBbc2VsZi5lbV9kYXNoLnNwbGl0KGNodW5rKSBmb3IgY2h1bmsgaW4gY2h1bmtzXSBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHN1Ymxpc3RdXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNodW5rcyA9IHNlbGYud29yZHNlcF9zaW1wbGVfcmUuc3BsaXQodGV4dClcXG4gICAgICAgIGNodW5rcyA9IFtjIGZvciBjIGluIGNodW5rcyBpZiBjXVxcbiAgICAgICAgcmV0dXJuIGNodW5rc1xcblxcbiAgICBkZWYgX2ZpeF9zZW50ZW5jZV9lbmRpbmdzKHNlbGYsIGNodW5rcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfZml4X3NlbnRlbmNlX2VuZGluZ3MoY2h1bmtzIDogW3N0cmluZ10pXFxuICAgICAgICBDb3JyZWN0IGZvciBzZW50ZW5jZSBlbmRpbmdzIGJ1cmllZCBpbiAnY2h1bmtzJy4gIEVnLiB3aGVuIHRoZVxcbiAgICAgICAgb3JpZ2luYWwgdGV4dCBjb250YWlucyBcXFwiLi4uIGZvby5cXFxcXFxcXG5CYXIgLi4uXFxcIiwgbXVuZ2Vfd2hpdGVzcGFjZSgpXFxuICAgICAgICBhbmQgc3BsaXQoKSB3aWxsIGNvbnZlcnQgdGhhdCB0byBbLi4uLCBcXFwiZm9vLlxcXCIsIFxcXCIgXFxcIiwgXFxcIkJhclxcXCIsIC4uLl1cXG4gICAgICAgIHdoaWNoIGhhcyBvbmUgdG9vIGZldyBzcGFjZXM7IHRoaXMgbWV0aG9kIHNpbXBseSBjaGFuZ2VzIHRoZSBvbmVcXG4gICAgICAgIHNwYWNlIHRvIHR3by5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaSA9IDBcXG4gICAgICAgICMgcGF0c2VhcmNoID0gc2VsZi5zZW50ZW5jZV9lbmRfcmUuc2VhcmNoXFxuICAgICAgICB3aGlsZSBpIDwgbGVuKGNodW5rcyktMTpcXG4gICAgICAgICAgICBpZiBjaHVua3NbaSsxXSA9PSBcXFwiIFxcXCIgYW5kIHJlLnNlYXJjaChzZWxmLnNlbnRlbmNlX2VuZF9yZSwgY2h1bmtzW2ldKSBhbmQgY2h1bmtzW2ldWy0xXSBpbiBcXFwiLiE/XFxcXFxcXCJcXFxcJ1xcXCI6XFxuICAgICAgICAgICAgICAgIGNodW5rc1tpKzFdID0gXFxcIiAgXFxcIlxcbiAgICAgICAgICAgICAgICBpICs9IDJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpICs9IDFcXG5cXG4gICAgZGVmIF9oYW5kbGVfbG9uZ193b3JkKHNlbGYsIHJldmVyc2VkX2NodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdpZHRoKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl9oYW5kbGVfbG9uZ193b3JkKGNodW5rcyA6IFtzdHJpbmddLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2xpbmUgOiBbc3RyaW5nXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gOiBpbnQsIHdpZHRoIDogaW50KVxcbiAgICAgICAgSGFuZGxlIGEgY2h1bmsgb2YgdGV4dCAobW9zdCBsaWtlbHkgYSB3b3JkLCBub3Qgd2hpdGVzcGFjZSkgdGhhdFxcbiAgICAgICAgaXMgdG9vIGxvbmcgdG8gZml0IGluIGFueSBsaW5lLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIEZpZ3VyZSBvdXQgd2hlbiBpbmRlbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCB3aWR0aCwgYW5kIG1ha2VcXG4gICAgICAgICMgc3VyZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGlzIHN0cmlwcGVkIG9mZiBvbiBldmVyeSBwYXNzXFxuICAgICAgICBpZiB3aWR0aCA8IDE6XFxuICAgICAgICAgICAgc3BhY2VfbGVmdCA9IDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc3BhY2VfbGVmdCA9IHdpZHRoIC0gY3VyX2xlblxcblxcbiAgICAgICAgIyBJZiB3ZSdyZSBhbGxvd2VkIHRvIGJyZWFrIGxvbmcgd29yZHMsIHRoZW4gZG8gc286IHB1dCBhcyBtdWNoXFxuICAgICAgICAjIG9mIHRoZSBuZXh0IGNodW5rIG9udG8gdGhlIGN1cnJlbnQgbGluZSBhcyB3aWxsIGZpdC5cXG4gICAgICAgIGlmIHNlbGYuYnJlYWtfbG9uZ193b3JkczpcXG4gICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQocmV2ZXJzZWRfY2h1bmtzWy0xXVs6c3BhY2VfbGVmdF0pXFxuICAgICAgICAgICAgcmV2ZXJzZWRfY2h1bmtzWy0xXSA9IHJldmVyc2VkX2NodW5rc1stMV1bc3BhY2VfbGVmdDpdXFxuXFxuICAgICAgICAjIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgbG9uZyB3b3JkIGludGFjdC4gIE9ubHkgYWRkXFxuICAgICAgICAjIGl0IHRvIHRoZSBjdXJyZW50IGxpbmUgaWYgdGhlcmUncyBub3RoaW5nIGFscmVhZHkgdGhlcmUgLS1cXG4gICAgICAgICMgdGhhdCBtaW5pbWl6ZXMgaG93IG11Y2ggd2UgdmlvbGF0ZSB0aGUgd2lkdGggY29uc3RyYWludC5cXG4gICAgICAgIGVsaWYgbm90IGN1cl9saW5lOlxcbiAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChyZXZlcnNlZF9jaHVua3MucG9wKCkpXFxuXFxuICAgICAgICAjIElmIHdlJ3JlIG5vdCBhbGxvd2VkIHRvIGJyZWFrIGxvbmcgd29yZHMsIGFuZCB0aGVyZSdzIGFscmVhZHlcXG4gICAgICAgICMgdGV4dCBvbiB0aGUgY3VycmVudCBsaW5lLCBkbyBub3RoaW5nLiAgTmV4dCB0aW1lIHRocm91Z2ggdGhlXFxuICAgICAgICAjIG1haW4gbG9vcCBvZiBfd3JhcF9jaHVua3MoKSwgd2UnbGwgd2luZCB1cCBoZXJlIGFnYWluLCBidXRcXG4gICAgICAgICMgY3VyX2xlbiB3aWxsIGJlIHplcm8sIHNvIHRoZSBuZXh0IGxpbmUgd2lsbCBiZSBlbnRpcmVseVxcbiAgICAgICAgIyBkZXZvdGVkIHRvIHRoZSBsb25nIHdvcmQgdGhhdCB3ZSBjYW4ndCBoYW5kbGUgcmlnaHQgbm93LlxcblxcbiAgICBkZWYgX3dyYXBfY2h1bmtzKHNlbGYsIGNodW5rcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfd3JhcF9jaHVua3MoY2h1bmtzIDogW3N0cmluZ10pIC0+IFtzdHJpbmddXFxuICAgICAgICBXcmFwIGEgc2VxdWVuY2Ugb2YgdGV4dCBjaHVua3MgYW5kIHJldHVybiBhIGxpc3Qgb2YgbGluZXMgb2ZcXG4gICAgICAgIGxlbmd0aCAnc2VsZi53aWR0aCcgb3IgbGVzcy4gIChJZiAnYnJlYWtfbG9uZ193b3JkcycgaXMgZmFsc2UsXFxuICAgICAgICBzb21lIGxpbmVzIG1heSBiZSBsb25nZXIgdGhhbiB0aGlzLikgIENodW5rcyBjb3JyZXNwb25kIHJvdWdobHlcXG4gICAgICAgIHRvIHdvcmRzIGFuZCB0aGUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZW06IGVhY2ggY2h1bmsgaXNcXG4gICAgICAgIGluZGl2aXNpYmxlIChtb2R1bG8gJ2JyZWFrX2xvbmdfd29yZHMnKSwgYnV0IGEgbGluZSBicmVhayBjYW5cXG4gICAgICAgIGNvbWUgYmV0d2VlbiBhbnkgdHdvIGNodW5rcy4gIENodW5rcyBzaG91bGQgbm90IGhhdmUgaW50ZXJuYWxcXG4gICAgICAgIHdoaXRlc3BhY2U7IGllLiBhIGNodW5rIGlzIGVpdGhlciBhbGwgd2hpdGVzcGFjZSBvciBhIFxcXCJ3b3JkXFxcIi5cXG4gICAgICAgIFdoaXRlc3BhY2UgY2h1bmtzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZlxcbiAgICAgICAgbGluZXMsIGJ1dCBhcGFydCBmcm9tIHRoYXQgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGxpbmVzID0gW11cXG4gICAgICAgIGlmIHNlbGYud2lkdGggPD0gMDpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJpbnZhbGlkIHdpZHRoICVyIChtdXN0IGJlID4gMClcXFwiICUgc2VsZi53aWR0aClcXG4gICAgICAgIGlmIHNlbGYubWF4X2xpbmVzIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGlmIHNlbGYubWF4X2xpbmVzID4gMTpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5zdWJzZXF1ZW50X2luZGVudFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5pdGlhbF9pbmRlbnRcXG4gICAgICAgICAgICBpZiBsZW4oaW5kZW50KSArIGxlbihzZWxmLnBsYWNlaG9sZGVyLmxzdHJpcCgpKSA+IHNlbGYud2lkdGg6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcInBsYWNlaG9sZGVyIHRvbyBsYXJnZSBmb3IgbWF4IHdpZHRoXFxcIilcXG5cXG4gICAgICAgICMgQXJyYW5nZSBpbiByZXZlcnNlIG9yZGVyIHNvIGl0ZW1zIGNhbiBiZSBlZmZpY2llbnRseSBwb3BwZWRcXG4gICAgICAgICMgZnJvbSBhIHN0YWNrIG9mIGNodWNrcy5cXG4gICAgICAgIGNodW5rcy5yZXZlcnNlKClcXG5cXG4gICAgICAgIHdoaWxlIGNodW5rczpcXG5cXG4gICAgICAgICAgICAjIFN0YXJ0IHRoZSBsaXN0IG9mIGNodW5rcyB0aGF0IHdpbGwgbWFrZSB1cCB0aGUgY3VycmVudCBsaW5lLlxcbiAgICAgICAgICAgICMgY3VyX2xlbiBpcyBqdXN0IHRoZSBsZW5ndGggb2YgYWxsIHRoZSBjaHVua3MgaW4gY3VyX2xpbmUuXFxuICAgICAgICAgICAgY3VyX2xpbmUgPSBbXVxcbiAgICAgICAgICAgIGN1cl9sZW4gPSAwXFxuXFxuICAgICAgICAgICAgIyBGaWd1cmUgb3V0IHdoaWNoIHN0YXRpYyBzdHJpbmcgd2lsbCBwcmVmaXggdGhpcyBsaW5lLlxcbiAgICAgICAgICAgIGlmIGxpbmVzOlxcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLnN1YnNlcXVlbnRfaW5kZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbml0aWFsX2luZGVudFxcblxcbiAgICAgICAgICAgICMgTWF4aW11bSB3aWR0aCBmb3IgdGhpcyBsaW5lLlxcbiAgICAgICAgICAgIHdpZHRoID0gc2VsZi53aWR0aCAtIGxlbihpbmRlbnQpXFxuXFxuICAgICAgICAgICAgIyBGaXJzdCBjaHVuayBvbiBsaW5lIGlzIHdoaXRlc3BhY2UgLS0gZHJvcCBpdCwgdW5sZXNzIHRoaXNcXG4gICAgICAgICAgICAjIGlzIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgdGV4dCAoaWUuIG5vIGxpbmVzIHN0YXJ0ZWQgeWV0KS5cXG4gICAgICAgICAgICBpZiBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmQgY2h1bmtzWy0xXS5zdHJpcCgpID09ICcnIGFuZCBsaW5lczpcXG4gICAgICAgICAgICAgICAgZGVsIGNodW5rc1stMV1cXG5cXG4gICAgICAgICAgICB3aGlsZSBjaHVua3M6XFxuICAgICAgICAgICAgICAgIGwgPSBsZW4oY2h1bmtzWy0xXSlcXG5cXG4gICAgICAgICAgICAgICAgIyBDYW4gYXQgbGVhc3Qgc3F1ZWV6ZSB0aGlzIGNodW5rIG9udG8gdGhlIGN1cnJlbnQgbGluZS5cXG4gICAgICAgICAgICAgICAgaWYgY3VyX2xlbiArIGwgPD0gd2lkdGg6XFxuICAgICAgICAgICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQoY2h1bmtzLnBvcCgpKVxcbiAgICAgICAgICAgICAgICAgICAgY3VyX2xlbiArPSBsXFxuXFxuICAgICAgICAgICAgICAgICMgTm9wZSwgdGhpcyBsaW5lIGlzIGZ1bGwuXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBicmVha1xcblxcbiAgICAgICAgICAgICMgVGhlIGN1cnJlbnQgbGluZSBpcyBmdWxsLCBhbmQgdGhlIG5leHQgY2h1bmsgaXMgdG9vIGJpZyB0b1xcbiAgICAgICAgICAgICMgZml0IG9uICphbnkqIGxpbmUgKG5vdCBqdXN0IHRoaXMgb25lKS5cXG4gICAgICAgICAgICBpZiBjaHVua3MgYW5kIGxlbihjaHVua3NbLTFdKSA+IHdpZHRoOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVfbG9uZ193b3JkKGNodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdpZHRoKVxcbiAgICAgICAgICAgICAgICBjdXJfbGVuID0gc3VtKG1hcChsZW4sIGN1cl9saW5lKSlcXG5cXG4gICAgICAgICAgICAjIElmIHRoZSBsYXN0IGNodW5rIG9uIHRoaXMgbGluZSBpcyBhbGwgd2hpdGVzcGFjZSwgZHJvcCBpdC5cXG4gICAgICAgICAgICBpZiBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmQgY3VyX2xpbmUgYW5kIGN1cl9saW5lWy0xXS5zdHJpcCgpID09ICcnOlxcbiAgICAgICAgICAgICAgICBjdXJfbGVuIC09IGxlbihjdXJfbGluZVstMV0pXFxuICAgICAgICAgICAgICAgIGRlbCBjdXJfbGluZVstMV1cXG5cXG4gICAgICAgICAgICBpZiBjdXJfbGluZTpcXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYubWF4X2xpbmVzIGlzIE5vbmUgb3JcXG4gICAgICAgICAgICAgICAgICAgIGxlbihsaW5lcykgKyAxIDwgc2VsZi5tYXhfbGluZXMgb3JcXG4gICAgICAgICAgICAgICAgICAgIChub3QgY2h1bmtzIG9yXFxuICAgICAgICAgICAgICAgICAgICAgc2VsZi5kcm9wX3doaXRlc3BhY2UgYW5kXFxuICAgICAgICAgICAgICAgICAgICAgbGVuKGNodW5rcykgPT0gMSBhbmRcXG4gICAgICAgICAgICAgICAgICAgICBub3QgY2h1bmtzWzBdLnN0cmlwKCkpIGFuZCBjdXJfbGVuIDw9IHdpZHRoKTpcXG4gICAgICAgICAgICAgICAgICAgICMgQ29udmVydCBjdXJyZW50IGxpbmUgYmFjayB0byBhIHN0cmluZyBhbmQgc3RvcmUgaXQgaW5cXG4gICAgICAgICAgICAgICAgICAgICMgbGlzdCBvZiBhbGwgbGluZXMgKHJldHVybiB2YWx1ZSkuXFxuICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoaW5kZW50ICsgJycuam9pbihjdXJfbGluZSkpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICB3aGlsZSBjdXJfbGluZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyX2xpbmVbLTFdLnN0cmlwKCkgYW5kXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gKyBsZW4oc2VsZi5wbGFjZWhvbGRlcikgPD0gd2lkdGgpOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQoc2VsZi5wbGFjZWhvbGRlcilcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGluZGVudCArICcnLmpvaW4oY3VyX2xpbmUpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gLT0gbGVuKGN1cl9saW5lWy0xXSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWwgY3VyX2xpbmVbLTFdXFxuICAgICAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVzOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2xpbmUgPSBsaW5lc1stMV0ucnN0cmlwKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbihwcmV2X2xpbmUpICsgbGVuKHNlbGYucGxhY2Vob2xkZXIpIDw9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aWR0aCk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1stMV0gPSBwcmV2X2xpbmUgKyBzZWxmLnBsYWNlaG9sZGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChpbmRlbnQgKyBzZWxmLnBsYWNlaG9sZGVyLmxzdHJpcCgpKVxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG5cXG4gICAgICAgIHJldHVybiBsaW5lc1xcblxcbiAgICBkZWYgX3NwbGl0X2NodW5rcyhzZWxmLCB0ZXh0KTpcXG4gICAgICAgIHRleHQgPSBzZWxmLl9tdW5nZV93aGl0ZXNwYWNlKHRleHQpXFxuICAgICAgICByZXR1cm4gc2VsZi5fc3BsaXQodGV4dClcXG5cXG4gICAgIyAtLSBQdWJsaWMgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG4gICAgZGVmIHdyYXAoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ3cmFwKHRleHQgOiBzdHJpbmcpIC0+IFtzdHJpbmddXFxuICAgICAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgc28gaXQgZml0cyBpbiBsaW5lcyBvZlxcbiAgICAgICAgbm8gbW9yZSB0aGFuICdzZWxmLndpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB3cmFwcGVkXFxuICAgICAgICBsaW5lcy4gIFRhYnMgaW4gJ3RleHQnIGFyZSBleHBhbmRlZCB3aXRoIHN0cmluZy5leHBhbmR0YWJzKCksXFxuICAgICAgICBhbmQgYWxsIG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmUpIGFyZVxcbiAgICAgICAgY29udmVydGVkIHRvIHNwYWNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBjaHVua3MgPSBzZWxmLl9zcGxpdF9jaHVua3ModGV4dClcXG4gICAgICAgIGlmIHNlbGYuZml4X3NlbnRlbmNlX2VuZGluZ3M6XFxuICAgICAgICAgICAgc2VsZi5fZml4X3NlbnRlbmNlX2VuZGluZ3MoY2h1bmtzKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3dyYXBfY2h1bmtzKGNodW5rcylcXG5cXG4gICAgZGVmIGZpbGwoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJmaWxsKHRleHQgOiBzdHJpbmcpIC0+IHN0cmluZ1xcbiAgICAgICAgUmVmb3JtYXQgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gJ3RleHQnIHRvIGZpdCBpbiBsaW5lcyBvZiBub1xcbiAgICAgICAgbW9yZSB0aGFuICdzZWxmLndpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbmV3IHN0cmluZ1xcbiAgICAgICAgY29udGFpbmluZyB0aGUgZW50aXJlIHdyYXBwZWQgcGFyYWdyYXBoLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gXFxcIlxcXFxuXFxcIi5qb2luKHNlbGYud3JhcCh0ZXh0KSlcXG5cXG5cXG4jIC0tIENvbnZlbmllbmNlIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG5kZWYgd3JhcCh0ZXh0LCB3aWR0aD03MCwgKiprd2FyZ3MpOlxcbiAgICBcXFwiXFxcIlxcXCJXcmFwIGEgc2luZ2xlIHBhcmFncmFwaCBvZiB0ZXh0LCByZXR1cm5pbmcgYSBsaXN0IG9mIHdyYXBwZWQgbGluZXMuXFxuICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyBzbyBpdCBmaXRzIGluIGxpbmVzIG9mIG5vXFxuICAgIG1vcmUgdGhhbiAnd2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBsaXN0IG9mIHdyYXBwZWQgbGluZXMuICBCeVxcbiAgICBkZWZhdWx0LCB0YWJzIGluICd0ZXh0JyBhcmUgZXhwYW5kZWQgd2l0aCBzdHJpbmcuZXhwYW5kdGFicygpLCBhbmRcXG4gICAgYWxsIG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmUpIGFyZSBjb252ZXJ0ZWQgdG9cXG4gICAgc3BhY2UuICBTZWUgVGV4dFdyYXBwZXIgY2xhc3MgZm9yIGF2YWlsYWJsZSBrZXl3b3JkIGFyZ3MgdG8gY3VzdG9taXplXFxuICAgIHdyYXBwaW5nIGJlaGF2aW91ci5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIHcgPSBUZXh0V3JhcHBlcih3aWR0aD13aWR0aCwgKiprd2FyZ3MpXFxuICAgIHJldHVybiB3LndyYXAodGV4dClcXG5cXG5kZWYgZmlsbCh0ZXh0LCB3aWR0aD03MCwgKiprd2FyZ3MpOlxcbiAgICBcXFwiXFxcIlxcXCJGaWxsIGEgc2luZ2xlIHBhcmFncmFwaCBvZiB0ZXh0LCByZXR1cm5pbmcgYSBuZXcgc3RyaW5nLlxcbiAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgdG8gZml0IGluIGxpbmVzIG9mIG5vIG1vcmVcXG4gICAgdGhhbiAnd2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBuZXcgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVudGlyZVxcbiAgICB3cmFwcGVkIHBhcmFncmFwaC4gIEFzIHdpdGggd3JhcCgpLCB0YWJzIGFyZSBleHBhbmRlZCBhbmQgb3RoZXJcXG4gICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byBzcGFjZS4gIFNlZSBUZXh0V3JhcHBlciBjbGFzcyBmb3JcXG4gICAgYXZhaWxhYmxlIGtleXdvcmQgYXJncyB0byBjdXN0b21pemUgd3JhcHBpbmcgYmVoYXZpb3VyLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdyA9IFRleHRXcmFwcGVyKHdpZHRoPXdpZHRoLCAqKmt3YXJncylcXG4gICAgcmV0dXJuIHcuZmlsbCh0ZXh0KVxcblxcbmRlZiBzaG9ydGVuKHRleHQsIHdpZHRoLCAqKmt3YXJncyk6XFxuICAgIFxcXCJcXFwiXFxcIkNvbGxhcHNlIGFuZCB0cnVuY2F0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBmaXQgaW4gdGhlIGdpdmVuIHdpZHRoLlxcbiAgICBUaGUgdGV4dCBmaXJzdCBoYXMgaXRzIHdoaXRlc3BhY2UgY29sbGFwc2VkLiAgSWYgaXQgdGhlbiBmaXRzIGluXFxuICAgIHRoZSAqd2lkdGgqLCBpdCBpcyByZXR1cm5lZCBhcyBpcy4gIE90aGVyd2lzZSwgYXMgbWFueSB3b3Jkc1xcbiAgICBhcyBwb3NzaWJsZSBhcmUgam9pbmVkIGFuZCB0aGVuIHRoZSBwbGFjZWhvbGRlciBpcyBhcHBlbmRlZDo6XFxuICAgICAgICA+Pj4gdGV4dHdyYXAuc2hvcnRlbihcXFwiSGVsbG8gIHdvcmxkIVxcXCIsIHdpZHRoPTEyKVxcbiAgICAgICAgJ0hlbGxvIHdvcmxkISdcXG4gICAgICAgID4+PiB0ZXh0d3JhcC5zaG9ydGVuKFxcXCJIZWxsbyAgd29ybGQhXFxcIiwgd2lkdGg9MTEpXFxuICAgICAgICAnSGVsbG8gWy4uLl0nXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICB3ID0gVGV4dFdyYXBwZXIod2lkdGg9d2lkdGgsIG1heF9saW5lcz0xLCAqKmt3YXJncylcXG4gICAgcmV0dXJuIHcuZmlsbCgnICcuam9pbih0ZXh0LnN0cmlwKCkuc3BsaXQoKSkpXFxuXFxuXFxuIyAtLSBMb29zZWx5IHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuIyBfd2hpdGVzcGFjZV9vbmx5X3JlID0gcmUuY29tcGlsZSgnXlsgXFxcXHRdKyQnLCByZS5NVUxUSUxJTkUpXFxuIyBfbGVhZGluZ193aGl0ZXNwYWNlX3JlID0gcmUuY29tcGlsZSgnKF5bIFxcXFx0XSopKD86W14gXFxcXHRcXFxcbl0pJywgcmUuTVVMVElMSU5FKVxcblxcbmRlZiBkZWRlbnQodGV4dCk6XFxuICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbnkgY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGV2ZXJ5IGxpbmUgaW4gYHRleHRgLlxcbiAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgdHJpcGxlLXF1b3RlZCBzdHJpbmdzIGxpbmUgdXAgd2l0aCB0aGUgbGVmdFxcbiAgICBlZGdlIG9mIHRoZSBkaXNwbGF5LCB3aGlsZSBzdGlsbCBwcmVzZW50aW5nIHRoZW0gaW4gdGhlIHNvdXJjZSBjb2RlXFxuICAgIGluIGluZGVudGVkIGZvcm0uXFxuICAgIE5vdGUgdGhhdCB0YWJzIGFuZCBzcGFjZXMgYXJlIGJvdGggdHJlYXRlZCBhcyB3aGl0ZXNwYWNlLCBidXQgdGhleVxcbiAgICBhcmUgbm90IGVxdWFsOiB0aGUgbGluZXMgXFxcIiAgaGVsbG9cXFwiIGFuZCBcXFwiXFxcXFxcXFx0aGVsbG9cXFwiIGFyZVxcbiAgICBjb25zaWRlcmVkIHRvIGhhdmUgbm8gY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZS5cXG4gICAgRW50aXJlbHkgYmxhbmsgbGluZXMgYXJlIG5vcm1hbGl6ZWQgdG8gYSBuZXdsaW5lIGNoYXJhY3Rlci5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgICMgTG9vayBmb3IgdGhlIGxvbmdlc3QgbGVhZGluZyBzdHJpbmcgb2Ygc3BhY2VzIGFuZCB0YWJzIGNvbW1vbiB0b1xcbiAgICAjIGFsbCBsaW5lcy5cXG4gICAgbWFyZ2luID0gTm9uZVxcblxcbiAgICBpbmRlbnRzID0gcmUuZmluZGFsbChyJyheWyBcXFxcdF0qKSg/OlteIFxcXFx0XFxcXG5dKScsdGV4dCwgcmUuTVVMVElMSU5FKVxcbiAgICBmb3IgaW5kZW50IGluIGluZGVudHM6XFxuICAgICAgICBpZiBtYXJnaW4gaXMgTm9uZTpcXG4gICAgICAgICAgICBtYXJnaW4gPSBpbmRlbnRcXG5cXG4gICAgICAgICMgQ3VycmVudCBsaW5lIG1vcmUgZGVlcGx5IGluZGVudGVkIHRoYW4gcHJldmlvdXMgd2lubmVyOlxcbiAgICAgICAgIyBubyBjaGFuZ2UgKHByZXZpb3VzIHdpbm5lciBpcyBzdGlsbCBvbiB0b3ApLlxcbiAgICAgICAgZWxpZiBpbmRlbnQuc3RhcnRzd2l0aChtYXJnaW4pOlxcbiAgICAgICAgICAgIHBhc3NcXG5cXG4gICAgICAgICMgQ3VycmVudCBsaW5lIGNvbnNpc3RlbnQgd2l0aCBhbmQgbm8gZGVlcGVyIHRoYW4gcHJldmlvdXMgd2lubmVyOlxcbiAgICAgICAgIyBpdCdzIHRoZSBuZXcgd2lubmVyLlxcbiAgICAgICAgZWxpZiBtYXJnaW4uc3RhcnRzd2l0aChpbmRlbnQpOlxcbiAgICAgICAgICAgIG1hcmdpbiA9IGluZGVudFxcblxcbiAgICAgICAgIyBGaW5kIHRoZSBsYXJnZXN0IGNvbW1vbiB3aGl0ZXNwYWNlIGJldHdlZW4gY3VycmVudCBsaW5lIGFuZCBwcmV2aW91c1xcbiAgICAgICAgIyB3aW5uZXIuXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGZvciBpLCAoeCwgeSkgaW4gZW51bWVyYXRlKHppcChtYXJnaW4sIGluZGVudCkpOlxcbiAgICAgICAgICAgICAgICBpZiB4ICE9IHk6XFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW5bOmldXFxuICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAjIHNhbml0eSBjaGVjayAodGVzdGluZy9kZWJ1Z2dpbmcgb25seSlcXG4gICAgaWYgMCBhbmQgbWFyZ2luOlxcbiAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdChcXFwiXFxcXG5cXFwiKTpcXG4gICAgICAgICAgICBhc3NlcnQgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKG1hcmdpbiksIFxcXFxcXG4gICAgICAgICAgICAgICAgICAgXFxcImxpbmUgPSAlciwgbWFyZ2luID0gJXJcXFwiICUgKGxpbmUsIG1hcmdpbilcXG5cXG4gICAgaWYgbWFyZ2luOlxcbiAgICAgICAgbGluZXMgPSBbbGluZVtsZW4obWFyZ2luKTpdIFxcbiAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpXFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBsaW5lLnN0cmlwKCkgXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHRleHQuc3BsaXQoXFxcIlxcXFxuXFxcIildXFxuICAgICAgICB0ZXh0ID0gXFxcIlxcXFxuXFxcIi5qb2luKGxpbmVzKVxcbiAgICByZXR1cm4gdGV4dFxcblxcblxcbmRlZiBpbmRlbnQodGV4dCwgcHJlZml4LCBwcmVkaWNhdGU9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIkFkZHMgJ3ByZWZpeCcgdG8gdGhlIGJlZ2lubmluZyBvZiBzZWxlY3RlZCBsaW5lcyBpbiAndGV4dCcuXFxuICAgIElmICdwcmVkaWNhdGUnIGlzIHByb3ZpZGVkLCAncHJlZml4JyB3aWxsIG9ubHkgYmUgYWRkZWQgdG8gdGhlIGxpbmVzXFxuICAgIHdoZXJlICdwcmVkaWNhdGUobGluZSknIGlzIFRydWUuIElmICdwcmVkaWNhdGUnIGlzIG5vdCBwcm92aWRlZCxcXG4gICAgaXQgd2lsbCBkZWZhdWx0IHRvIGFkZGluZyAncHJlZml4JyB0byBhbGwgbm9uLWVtcHR5IGxpbmVzIHRoYXQgZG8gbm90XFxuICAgIGNvbnNpc3Qgc29sZWx5IG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycy5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIGlmIHByZWRpY2F0ZSBpcyBOb25lOlxcbiAgICAgICAgZGVmIHByZWRpY2F0ZShsaW5lKTpcXG4gICAgICAgICAgICByZXR1cm4gbGluZS5zdHJpcCgpXFxuXFxuICAgIGRlZiBwcmVmaXhlZF9saW5lcygpOlxcbiAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdGxpbmVzKFRydWUpOlxcbiAgICAgICAgICAgIHlpZWxkIChwcmVmaXggKyBsaW5lIGlmIHByZWRpY2F0ZShsaW5lKSBlbHNlIGxpbmUpXFxuICAgIHJldHVybiAnJy5qb2luKHByZWZpeGVkX2xpbmVzKCkpXFxuXFxuXFxuaWYgX19uYW1lX18gPT0gXFxcIl9fbWFpbl9fXFxcIjpcXG4gICAgI3ByaW50IGRlZGVudChcXFwiXFxcXHRmb29cXFxcblxcXFx0YmFyXFxcIilcXG4gICAgI3ByaW50IGRlZGVudChcXFwiICBcXFxcdGhlbGxvIHRoZXJlXFxcXG4gIFxcXFx0ICBob3cgYXJlIHlvdT9cXFwiKVxcbiAgICBwcmludChkZWRlbnQoXFxcIkhlbGxvIHRoZXJlLlxcXFxuICBUaGlzIGlzIGluZGVudGVkLlxcXCIpKVwiLFwic3JjL2xpYi90aGlzLnB5XCI6XCJcXG5wcmludChcXFwiXFxcIlxcXCJcXG5UaGUgWmVuIG9mIFB5dGhvbiwgYnkgVGltIFBldGVyc1xcblxcbkJlYXV0aWZ1bCBpcyBiZXR0ZXIgdGhhbiB1Z2x5LlxcbkV4cGxpY2l0IGlzIGJldHRlciB0aGFuIGltcGxpY2l0LlxcblNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LlxcbkNvbXBsZXggaXMgYmV0dGVyIHRoYW4gY29tcGxpY2F0ZWQuXFxuRmxhdCBpcyBiZXR0ZXIgdGhhbiBuZXN0ZWQuXFxuU3BhcnNlIGlzIGJldHRlciB0aGFuIGRlbnNlLlxcblJlYWRhYmlsaXR5IGNvdW50cy5cXG5TcGVjaWFsIGNhc2VzIGFyZW4ndCBzcGVjaWFsIGVub3VnaCB0byBicmVhayB0aGUgcnVsZXMuXFxuQWx0aG91Z2ggcHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS5cXG5FcnJvcnMgc2hvdWxkIG5ldmVyIHBhc3Mgc2lsZW50bHkuXFxuVW5sZXNzIGV4cGxpY2l0bHkgc2lsZW5jZWQuXFxuSW4gdGhlIGZhY2Ugb2YgYW1iaWd1aXR5LCByZWZ1c2UgdGhlIHRlbXB0YXRpb24gdG8gZ3Vlc3MuXFxuVGhlcmUgc2hvdWxkIGJlIG9uZS0tIGFuZCBwcmVmZXJhYmx5IG9ubHkgb25lIC0tb2J2aW91cyB3YXkgdG8gZG8gaXQuXFxuQWx0aG91Z2ggdGhhdCB3YXkgbWF5IG5vdCBiZSBvYnZpb3VzIGF0IGZpcnN0IHVubGVzcyB5b3UncmUgRHV0Y2guXFxuTm93IGlzIGJldHRlciB0aGFuIG5ldmVyLlxcbkFsdGhvdWdoIG5ldmVyIGlzIG9mdGVuIGJldHRlciB0aGFuICpyaWdodCogbm93LlxcbklmIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBoYXJkIHRvIGV4cGxhaW4sIGl0J3MgYSBiYWQgaWRlYS5cXG5JZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgZWFzeSB0byBleHBsYWluLCBpdCBtYXkgYmUgYSBnb29kIGlkZWEuXFxuTmFtZXNwYWNlcyBhcmUgb25lIGhvbmtpbmcgZ3JlYXQgaWRlYSAtLSBsZXQncyBkbyBtb3JlIG9mIHRob3NlIVxcblxcXCJcXFwiXFxcIlxcbilcXG5cIixcInNyYy9saWIvdGhyZWFkaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0aHJlYWRpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90aW1lLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjaGVja19zdHJ1Y3RfdGltZShhKXtpZighKGEgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIlJlcXVpcmVkIGFyZ3VtZW50ICdzdHJ1Y3RfdGltZScgbXVzdCBiZSBvZiB0eXBlOiAnc3RydWN0X3RpbWUnXFxcIik7dmFyIGMsZD1hLnYubGVuZ3RoLGU9YS52O2ZvcihjPTA7YzxkOysrYylpZighU2suYnVpbHRpbi5jaGVja0ludChlW2NdKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cnVjdF90aW1lIG1heSBvbmx5IGNvbnRhaW4gaW50ZWdlcnNcXFwiKTtyZXR1cm4hMH1mdW5jdGlvbiBwYWRMZWZ0KGEsYixkKXt2YXIgYz1hLnRvU3RyaW5nKCk7cmV0dXJuIEFycmF5KGItYy5sZW5ndGgrMSkuam9pbihkfHxcXFwiIFxcXCIpK2N9ZnVuY3Rpb24gaXNMZWFwWWVhcihhKXtyZXR1cm4gMD09KDMmYSkmJigwIT1hJTEwMHx8MD09YSU0MDApfWZ1bmN0aW9uIGdldERheU9mWWVhcihhLGIpe2I9Ynx8ITE7dmFyIGM9Yj9hLmdldFVUQ01vbnRoKCk6YS5nZXRNb250aCgpLGQ9Yj9hLmdldFVUQ0RhdGUoKTphLmdldERhdGUoKSxlPVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdW2NdK2Q7cmV0dXJuIDE8YyYmaXNMZWFwWWVhcihiP2EuZ2V0VVRDRnVsbFllYXIoKTphLmdldEZ1bGxZZWFyKCkpJiZlKyssZX1mdW5jdGlvbiBzdGRUaW1lem9uZU9mZnNldCgpe3ZhciBhPU1hdGgubWF4LGI9bmV3IERhdGUoMjAwMiwwLDEpLGM9bmV3IERhdGUoMjAwMiw2LDEpO3JldHVybiBhKGIuZ2V0VGltZXpvbmVPZmZzZXQoKSxjLmdldFRpbWV6b25lT2Zmc2V0KCkpfWZ1bmN0aW9uIGRzdChhKXtyZXR1cm4gYS5nZXRUaW1lem9uZU9mZnNldCgpPHN0ZFRpbWV6b25lT2Zmc2V0KCl9ZnVuY3Rpb24gdGltZVpvbmVOYW1lKGEpe3ZhciBiLGM9L1xcXFwoKC4qKVxcXFwpLy5leGVjKGEudG9TdHJpbmcoKSk7aWYobnVsbCE9dGhpcy5uYXZpZ2F0b3ImJihiPXRoaXMubmF2aWdhdG9yLnVzZXJMYW5ndWFnZXx8dGhpcy5uYXZpZ2F0b3IubGFuZ3VhZ2UpLGMmJjE8Yy5sZW5ndGgpcmV0dXJuIGNbMV07aWYodm9pZCAwPT09YilyZXR1cm4gbnVsbDt0cnl7dmFyIGQ9YS50b0xvY2FsZVN0cmluZyhiLHt0aW1lWm9uZU5hbWU6XFxcInNob3J0XFxcIn0pO3JldHVybiBjPWQuc3BsaXQoXFxcIiBcXFwiKSxjW2MubGVuZ3RoLTFdfWNhdGNoKGEpe3JldHVybiBudWxsfX1mdW5jdGlvbiBkYXRlX3RvX3N0cnVjdF90aW1lKGEsYyl7cmV0dXJuIGM9Y3x8ITEsbmV3IGIoW1NrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ0Z1bGxZZWFyKCk6YS5nZXRGdWxsWWVhcigpKSxTay5idWlsdGluLmFzc2skKChjP2EuZ2V0VVRDTW9udGgoKTphLmdldE1vbnRoKCkpKzEpLFNrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ0RhdGUoKTphLmdldERhdGUoKSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDSG91cnMoKTphLmdldEhvdXJzKCkpLFNrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ01pbnV0ZXMoKTphLmdldE1pbnV0ZXMoKSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDU2Vjb25kcygpOmEuZ2V0U2Vjb25kcygpKSxTay5idWlsdGluLmFzc2skKCgoYz9hLmdldFVUQ0RheSgpOmEuZ2V0RGF5KCkpKzYpJTcpLFNrLmJ1aWx0aW4uYXNzayQoZ2V0RGF5T2ZZZWFyKGEsYykpLFNrLmJ1aWx0aW4uYXNzayQoYz8wOmRzdChhKT8xOjApXSl9ZnVuY3Rpb24gZnJvbV9zZWNvbmRzKGEsYil7dmFyIGM9bmV3IERhdGU7aWYoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwic2Vjc1xcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7dmFyIGQ9U2suYnVpbHRpbi5hc251bSQoYSk7Yy5zZXRUaW1lKDFlMypkKX1yZXR1cm4gZGF0ZV90b19zdHJ1Y3RfdGltZShjLGIpfWZ1bmN0aW9uIGFzY3RpbWVfZihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJhc2N0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksIWF8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpP2E9ZnJvbV9zZWNvbmRzKCk6IShhIGluc3RhbmNlb2YgYikmJihhPW5ldyBiKGEpKSxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSYmOT09YS52Lmxlbmd0aCl7dmFyIGU9W2RbU2suYnVpbHRpbi5hc251bSQoYS52WzZdKV0sY1tTay5idWlsdGluLmFzbnVtJChhLnZbMV0pLTFdLHBhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzJdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKSxwYWRMZWZ0KFNrLmJ1aWx0aW4uYXNudW0kKGEudlszXSkudG9TdHJpbmcoKSwyLFxcXCIwXFxcIikrXFxcIjpcXFwiK3BhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzRdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKStcXFwiOlxcXCIrcGFkTGVmdChTay5idWlsdGluLmFzbnVtJChhLnZbNV0pLnRvU3RyaW5nKCksMixcXFwiMFxcXCIpLHBhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzBdKS50b1N0cmluZygpLDQsXFxcIjBcXFwiKV07cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlLmpvaW4oXFxcIiBcXFwiKSl9fWZ1bmN0aW9uIG1rdGltZV9mKGEpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1rdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlJiY5PT1hLnYubGVuZ3RoKXt2YXIgYj1uZXcgRGF0ZShTay5idWlsdGluLmFzbnVtJChhLnZbMF0pLFNrLmJ1aWx0aW4uYXNudW0kKGEudlsxXSktMSxTay5idWlsdGluLmFzbnVtJChhLnZbMl0pLFNrLmJ1aWx0aW4uYXNudW0kKGEudlszXSksU2suYnVpbHRpbi5hc251bSQoYS52WzRdKSxTay5idWlsdGluLmFzbnVtJChhLnZbNV0pKTtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChiLmdldFRpbWUoKS8xZTMsdm9pZCAwKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm1rdGltZSgpIHJlcXVpcmVzIGEgc3RydWN0X3RpbWUgb3IgOS10dXBsZVxcXCIpfXZhciBhPXtfX3BhY2thZ2VfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSxiPVNrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXEoXFxcInRpbWVcXFwiLFxcXCJzdHJ1Y3RfdGltZVxcXCIse3RtX3llYXI6XFxcInllYXIsIGZvciBleGFtcGxlLCAxOTkzXFxcIix0bV9tb246XFxcIm1vbnRoIG9mIHllYXIsIHJhbmdlIFsxLCAxMl1cXFwiLHRtX21kYXk6XFxcImRheSBvZiBtb250aCwgcmFuZ2UgWzEsIDMxXVxcXCIsdG1faG91cjpcXFwiaG91cnMsIHJhbmdlIFswLCAyM11cXFwiLHRtX21pbjpcXFwibWludXRlcywgcmFuZ2UgWzAsIDU5XVxcXCIsdG1fc2VjOlxcXCJzZWNvbmRzLCByYW5nZSBbMCwgNjFdXFxcIix0bV93ZGF5OlxcXCJkYXkgb2Ygd2VlaywgcmFuZ2UgWzAsIDZdLCBNb25kYXkgaXMgMFxcXCIsdG1feWRheTpcXFwiZGF5IG9mIHllYXIsIHJhbmdlIFsxLCAzNjZdXFxcIix0bV9pc2RzdDpcXFwiMSBpZiBzdW1tZXIgdGltZSBpcyBpbiBlZmZlY3QsIDAgaWYgbm90LCBhbmQgLTEgaWYgdW5rbm93blxcXCJ9KTthLnN0cnVjdF90aW1lPWIsYS50aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCk7dmFyIGE9RGF0ZS5ub3coKTtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZSYmdGhpcy5wZXJmb3JtYW5jZS5ub3cmJihhKz1wZXJmb3JtYW5jZS5ub3coKSUxKSxTay5idWlsdGluLmFzc2skKGEvMWUzLHZvaWQgMCl9KSxhLnNsZWVwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNsZWVwXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZGVsYXlcXFwiLFxcXCJmbG9hdFxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb24obmV3IFByb21pc2UoZnVuY3Rpb24oYil7U2suc2V0VGltZW91dChmdW5jdGlvbigpe2IoU2suYnVpbHRpbi5ub25lLm5vbmUkKX0sMWUzKlNrLmZmaS5yZW1hcFRvSnMoYSkpfSkpfSksYS5sb2NhbHRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibG9jYWx0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksZnJvbV9zZWNvbmRzKGEsITEpfSksYS5nbXRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ210aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksZnJvbV9zZWNvbmRzKGEsITApfSk7dmFyIGM9W1xcXCJKYW5cXFwiLFxcXCJGZWJcXFwiLFxcXCJNYXJcXFwiLFxcXCJBcHJcXFwiLFxcXCJNYXlcXFwiLFxcXCJKdW5cXFwiLFxcXCJKdWxcXFwiLFxcXCJBdWdcXFwiLFxcXCJTZXBcXFwiLFxcXCJPY3RcXFwiLFxcXCJOb3ZcXFwiLFxcXCJEZWNcXFwiXSxkPVtcXFwiTW9uXFxcIixcXFwiVHVlXFxcIixcXFwiV2VkXFxcIixcXFwiVGh1XFxcIixcXFwiRnJpXFxcIixcXFwiU2F0XFxcIixcXFwiU3VuXFxcIl07cmV0dXJuIGEuYXNjdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGFzY3RpbWVfZiksYS5jdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJjdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLGFzY3RpbWVfZihmcm9tX3NlY29uZHMoYSkpfSksYS5ta3RpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhta3RpbWVfZiksYS50aW1lem9uZT1uZXcgU2suYnVpbHRpbi5pbnRfKDYwKnN0ZFRpbWV6b25lT2Zmc2V0KCkpLGEuYWx0em9uZT1uZXcgU2suYnVpbHRpbi5pbnRfKDYwKmZ1bmN0aW9uIGFsdFRpbWV6b25lT2Zmc2V0KCl7dmFyIGE9TWF0aC5taW4sYj1uZXcgRGF0ZSgyMDAyLDAsMSksYz1uZXcgRGF0ZSgyMDAyLDYsMSk7cmV0dXJuIGEoYi5nZXRUaW1lem9uZU9mZnNldCgpLGMuZ2V0VGltZXpvbmVPZmZzZXQoKSl9KCkpLGEuZGF5bGlnaHQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyhkc3QobmV3IERhdGUpPzE6MCksYS50em5hbWU9bmV3IFNrLmJ1aWx0aW4udHVwbGUoZnVuY3Rpb24gdGltZVpvbmVOYW1lcygpe3ZhciBhPW5ldyBEYXRlKDIwMDIsMCwxKSxiPW5ldyBEYXRlKDIwMDIsNiwxKTtyZXR1cm4gZHN0KGEpP1tuZXcgU2suYnVpbHRpbi5zdHIodGltZVpvbmVOYW1lKGIpKSxuZXcgU2suYnVpbHRpbi5zdHIodGltZVpvbmVOYW1lKGEpKV06W25ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYSkpLG5ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYikpXX0oKSksYS5hY2NlcHQyZHllYXI9U2suYnVpbHRpbi5hc3NrJCgxKSxhLmNsb2NrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiBhPXRoaXMucGVyZm9ybWFuY2UmJnRoaXMucGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlLm5vdygpLzFlMzpuZXcgRGF0ZSgpLmdldFRpbWUoKS8xZTMsbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfSksYS5zdHJmdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIHN0cmZ0aW1lX2YoYSxjKXt2YXIgZDtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzdHJmdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDIpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZm9ybWF0IG11c3QgYmUgYSBzdHJpbmdcXFwiKTtyZXR1cm4gYz8hKGMgaW5zdGFuY2VvZiBiKSYmKGM9bmV3IGIoYykpOmM9ZnJvbV9zZWNvbmRzKCksY2hlY2tfc3RydWN0X3RpbWUoYyksZD1Tay5mZmkucmVtYXBUb0pzKGEpLFNrLmZmaS5yZW1hcFRvUHkoc3RyZnRpbWUoZCxuZXcgRGF0ZSgxZTMqbWt0aW1lX2YoYykudikpKX0pLGEudHpzZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiB0enNldF9mKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGltZS50enNldCgpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcXFwiKX0pLGEuc3RycHRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBzdHJwdGltZV9mKGEsYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic3RycHRpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzdHJpbmdcXFwiLFxcXCJzdHJpbmdcXFwiLFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpLHZvaWQgMD09PWI/Yj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiVhICViICVkICVIOiVNOiVTICVZXFxcIik6U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZm9ybWF0XFxcIixcXFwic3RyaW5nXFxcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKTtsZXQgYz1kYXRlX3RvX3N0cnVjdF90aW1lKHN0cnB0aW1lKFNrLmZmaS5yZW1hcFRvSnMoYSksU2suZmZpLnJlbWFwVG9KcyhiKSwhMCkpO3JldHVybiBjLnZbOF09bmV3IFNrLmJ1aWx0aW4uaW50XygtMSksY30pLGF9O1wiLFwic3JjL2xpYi90aW1laXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRpbWVpdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RvYWlmZi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidG9haWZmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdG9rZW4uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX2ZpbGVfXzpcXFwiL3NyYy9saWIvdG9rZW4ucHlcXFwifTtjb25zdCBiPVtdO2Zvcih0b2tlbiBpbiBTay50b2tlbi50b2tfbmFtZSl7Y29uc3QgYz1Tay50b2tlbi50b2tfbmFtZVt0b2tlbl0uc2xpY2UoMiksZD1wYXJzZUludCh0b2tlbiwxMCk7Yi5wdXNoKFNrLmZmaS5yZW1hcFRvUHkoZCkpLGIucHVzaChTay5mZmkucmVtYXBUb1B5KGMpKSxhW2NdPVNrLmZmaS5yZW1hcFRvUHkoZCl9cmV0dXJuIGEudG9rX25hbWU9bmV3IFNrLmJ1aWx0aW4uZGljdChiKSxhLklTVEVSTUlOQUw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiSVNURVJNSU5BTFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLnRva2VuLklTVEVSTUlOQUwoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhLklTTk9OVEVSTUlOQUw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiSVNOT05URVJNSU5BTFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLnRva2VuLklTTk9OVEVSTUlOQUwoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhLklTRU9GPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIklTRU9GXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2sudG9rZW4uSVNFT0YoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhfTtcIixcInNyYy9saWIvdG9rZW5pemUuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt0b2tlbml6ZTpuZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInRva2VuaXplXFxcIiwxLDEpLFNrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbihhKTtjb25zdCBiPVtdO3JldHVybiBTay5fdG9rZW5pemUoXFxcIjxzdGRpbj5cXFwiLGZ1bmN0aW9uIGpzUmVhZGxpbmUoKXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhKTtyZXR1cm4gU2suZmZpLnJlbWFwVG9KcyhiKX0sXFxcIlVURi04XFxcIixmdW5jdGlvbiByZWNlaXZlVG9rZW4oYSl7Yi5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKFtTay5mZmkucmVtYXBUb1B5KGEudHlwZSksU2suZmZpLnJlbWFwVG9QeShhLnN0cmluZyksbmV3IFNrLmJ1aWx0aW4udHVwbGUoW1NrLmZmaS5yZW1hcFRvUHkoYS5zdGFydFswXSksU2suZmZpLnJlbWFwVG9QeShhLnN0YXJ0WzFdKV0pLG5ldyBTay5idWlsdGluLnR1cGxlKFtTay5mZmkucmVtYXBUb1B5KGEuZW5kWzBdKSxTay5mZmkucmVtYXBUb1B5KGEuZW5kWzFdKV0pLFNrLmZmaS5yZW1hcFRvUHkoYS5saW5lKV0pKX0pLG5ldyBTay5idWlsdGluLmxpc3QoYil9KX07cmV0dXJuIGF9O1wiLFwic3JjL2xpYi90cmFjZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHJhY2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90cmFjZWJhY2sucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRyYWNlYmFjayBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3R0eS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHR5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdHVydGxlLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtcXFwidXNlIHN0cmljdFxcXCI7dmFyIGU9ZnVuY3Rpb24gZ2V0Q29uZmlndXJlZFRhcmdldCgpe3ZhciBlLHQ7Zm9yKGU9U2suVHVydGxlR3JhcGhpY3MmJlNrLlR1cnRsZUdyYXBoaWNzLnRhcmdldHx8XFxcInR1cnRsZVxcXCIsdD1cXFwic3RyaW5nXFxcIj09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ZTt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTtyZXR1cm4gdH0oKTtyZXR1cm4gZS50dXJ0bGVJbnN0YW5jZT9lLnR1cnRsZUluc3RhbmNlLnJlc2V0KCk6ZS50dXJ0bGVJbnN0YW5jZT1mdW5jdGlvbiBnZW5lcmF0ZVR1cnRsZU1vZHVsZShlKXt2YXIgdD1NYXRoLnJvdW5kLHI9TWF0aC5tYXgsbj1NYXRoLnNxcnQsYT1NYXRoLm1pbixzPU1hdGguYWJzLG89TWF0aC5QSSxkPU1hdGguYXRhbjIsXz1NYXRoLnNpbixjPU1hdGguY29zO2Z1bmN0aW9uIGdldEFzc2V0KGUpe3ZhciB0PWcuYXNzZXRzLHI9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHQ/dChlKTp0W2VdO3JldHVyblxcXCJzdHJpbmdcXFwiPT10eXBlb2Ygcj9uZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe3ZhciBhPW5ldyBJbWFnZTthLm9ubG9hZD1mdW5jdGlvbigpe2cuYXNzZXRzW2VdPXRoaXMsdChhKX0sYS5vbmVycm9yPWZ1bmN0aW9uKCl7bihuZXcgRXJyb3IoXFxcIk1pc3NpbmcgYXNzZXQ6IFxcXCIrcikpfSxhLnNyYz1yfSk6bmV3IEluc3RhbnRQcm9taXNlKHZvaWQgMCxyKX1mdW5jdGlvbiBJbnN0YW50UHJvbWlzZShlLHQpe3RoaXMubGFzdFJlc3VsdD10LHRoaXMubGFzdEVycm9yPWV9ZnVuY3Rpb24gRnJhbWVNYW5hZ2VyKCl7dGhpcy5yZXNldCgpfWZ1bmN0aW9uIGdldEZyYW1lTWFuYWdlcigpe3JldHVybiBBfHwoQT1uZXcgRnJhbWVNYW5hZ2VyKSxBfWZ1bmN0aW9uIE1vdXNlSGFuZGxlcigpe3ZhciB0PXRoaXM7Zm9yKHZhciByIGluIHRoaXMuX3RhcmdldD1nZXRUYXJnZXQoKSx0aGlzLl9tYW5hZ2Vycz17fSx0aGlzLl9oYW5kbGVycz17bW91c2Vkb3duOmZ1bmN0aW9uKHIpe3Qub25FdmVudChcXFwibW91c2Vkb3duXFxcIixyKX0sbW91c2V1cDpmdW5jdGlvbihyKXt0Lm9uRXZlbnQoXFxcIm1vdXNldXBcXFwiLHIpfSxtb3VzZW1vdmU6ZnVuY3Rpb24ocil7dC5vbkV2ZW50KFxcXCJtb3VzZW1vdmVcXFwiLHIpfX0sdGhpcy5faGFuZGxlcnMpdGhpcy5fdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIocix0aGlzLl9oYW5kbGVyc1tyXSl9ZnVuY3Rpb24gRXZlbnRNYW5hZ2VyKGUsdCl7dGhpcy5fdHlwZT1lLHRoaXMuX3RhcmdldD10LHRoaXMuX2hhbmRsZXJzPXZvaWQgMCxnZXRNb3VzZUhhbmRsZXIoKS5hZGRNYW5hZ2VyKGUsdGhpcyl9ZnVuY3Rpb24gVHVydGxlKGUpe2lmKGdldEZyYW1lTWFuYWdlcigpLmFkZFR1cnRsZSh0aGlzKSx0aGlzLl9zY3JlZW49Z2V0U2NyZWVuKCksdGhpcy5fbWFuYWdlcnM9e30sdGhpcy5fc2hhcGU9ZS52LCF2Lmhhc093blByb3BlcnR5KHRoaXMuX3NoYXBlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTaGFwZTonXFxcIit0aGlzLl9zaGFwZStcXFwiJyBub3QgaW4gZGVmYXVsdCBzaGFwZSwgcGxlYXNlIGNoZWNrIHNoYXBlIGFnYWluIVxcXCIpO3RoaXMucmVzZXQoKX1mdW5jdGlvbiBTY3JlZW4oKXt2YXIgZSx0O3RoaXMuX2ZyYW1lcz0xLHRoaXMuX2RlbGF5PXZvaWQgMCx0aGlzLl9iZ2NvbG9yPVxcXCJub25lXFxcIix0aGlzLl9tb2RlPVxcXCJzdGFuZGFyZFxcXCIsdGhpcy5fbWFuYWdlcnM9e30sdGhpcy5fa2V5TG9nZ2VyPXt9LGU9KGcud29ybGRXaWR0aHx8Zy53aWR0aHx8Z2V0V2lkdGgoKSkvMix0PShnLndvcmxkSGVpZ2h0fHxnLmhlaWdodHx8Z2V0SGVpZ2h0KCkpLzIsdGhpcy5zZXRVcFdvcmxkKC1lLC10LGUsdCl9ZnVuY3Rpb24gZW5zdXJlQW5vbnltb3VzKCl7cmV0dXJuIGZ8fChmPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh5LlR1cnRsZSkpLGYuaW5zdGFuY2V9ZnVuY3Rpb24gZ2V0VGFyZ2V0KCl7cmV0dXJuIGV9ZnVuY3Rpb24gZ2V0U2NyZWVuKCl7cmV0dXJuIHB8fChwPW5ldyBTY3JlZW4pLHB9ZnVuY3Rpb24gZ2V0TW91c2VIYW5kbGVyKCl7cmV0dXJuIGh8fChoPW5ldyBNb3VzZUhhbmRsZXIpLGh9ZnVuY3Rpb24gZ2V0V2lkdGgoKXtyZXR1cm4gMHwocCYmcC5fd2lkdGh8fGcud2lkdGh8fGdldFRhcmdldCgpLmNsaWVudFdpZHRofHxULndpZHRoKX1mdW5jdGlvbiBnZXRIZWlnaHQoKXtyZXR1cm4gMHwocCYmcC5faGVpZ2h0fHxnLmhlaWdodHx8Z2V0VGFyZ2V0KCkuY2xpZW50SGVpZ2h0fHxULmhlaWdodCl9ZnVuY3Rpb24gY3JlYXRlTGF5ZXIoZSx0KXt2YXIgcixuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGE9Z2V0V2lkdGgoKSxzPWdldEhlaWdodCgpLGw9Z2V0VGFyZ2V0KCkuZmlyc3RDaGlsZD8tcytcXFwicHhcXFwiOlxcXCIwXFxcIjtyZXR1cm4gbi53aWR0aD1hLG4uaGVpZ2h0PXMsbi5zdHlsZS5wb3NpdGlvbj1cXFwicmVsYXRpdmVcXFwiLG4uc3R5bGUuZGlzcGxheT1cXFwiYmxvY2tcXFwiLG4uc3R5bGUuc2V0UHJvcGVydHkoXFxcIm1hcmdpbi10b3BcXFwiLGwpLG4uc3R5bGUuc2V0UHJvcGVydHkoXFxcInotaW5kZXhcXFwiLGUpLHQmJihuLnN0eWxlLmRpc3BsYXk9XFxcIm5vbmVcXFwiKSxnZXRUYXJnZXQoKS5hcHBlbmRDaGlsZChuKSxyPW4uZ2V0Q29udGV4dChcXFwiMmRcXFwiKSxyLmxpbmVDYXA9XFxcInJvdW5kXFxcIixyLmxpbmVKb2luPVxcXCJyb3VuZFxcXCIsYXBwbHlXb3JsZChnZXRTY3JlZW4oKSxyKSxyfWZ1bmN0aW9uIGNhbmNlbEFuaW1hdGlvbkZyYW1lKCl7dSYmKCh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSkodSksdT12b2lkIDApLG0mJih3aW5kb3cuY2xlYXJUaW1lb3V0KG0pLG09dm9pZCAwKX1mdW5jdGlvbiBhcHBseVdvcmxkKGUsdCl7dmFyIHI9ZS5sbHgsbj1lLmxseSxhPWUudXJ4LHM9ZS51cnksbD1lLnhTY2FsZSxpPWUueVNjYWxlO3QmJihjbGVhckxheWVyKHQpLHQucmVzdG9yZSgpLHQuc2F2ZSgpLHQuc2NhbGUoMS9sLDEvaSksdC50cmFuc2xhdGUoLXIsLXMpKX1mdW5jdGlvbiBwdXNoVW5kbyhlKXt2YXIgdCxyLG47aWYoZy5hbGxvd1VuZG8mJmUuX2J1ZmZlclNpemUpe2ZvcihlLl91bmRvQnVmZmVyfHwoZS5fdW5kb0J1ZmZlcj1bXSk7ZS5fdW5kb0J1ZmZlci5sZW5ndGg+ZS5fYnVmZmVyU2l6ZTspZS5fdW5kb0J1ZmZlci5zaGlmdCgpO2ZvcihyPXt9LHQ9W1xcXCJ4XFxcIixcXFwieVxcXCIsXFxcImFuZ2xlXFxcIixcXFwicmFkaWFuc1xcXCIsXFxcImNvbG9yXFxcIixcXFwiZmlsbFxcXCIsXFxcImRvd25cXFwiLFxcXCJmaWxsaW5nXFxcIixcXFwic2hvd25cXFwiLFxcXCJzaGFwZVxcXCIsXFxcInNpemVcXFwiXSxuPTA7bjx0Lmxlbmd0aDtuKyspclt0W25dXT1lW1xcXCJfXFxcIit0W25dXTtyZXR1cm4gZS5fdW5kb0J1ZmZlci5wdXNoKHIpLGUuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7ci5maWxsQnVmZmVyPXRoaXMuZmlsbEJ1ZmZlcj90aGlzLmZpbGxCdWZmZXIuc2xpY2UoKTp2b2lkIDAsZS5fcGFwZXImJmUuX3BhcGVyLmNhbnZhcyYmKHIuaW1hZ2U9ZS5fcGFwZXIuY2FudmFzLnRvRGF0YVVSTCgpKX0sITEpfX1mdW5jdGlvbiBwb3BVbmRvKGUpe3ZhciB0O2lmKGUuX2J1ZmZlclNpemUmJmUuX3VuZG9CdWZmZXImJih0PWUuX3VuZG9CdWZmZXIucG9wKCksISF0KSl7Zm9yKHZhciByIGluIHQpXFxcImltYWdlXFxcIiE9ciYmXFxcImZpbGxCdWZmZXJcXFwiIT09ciYmKGVbXFxcIl9cXFwiK3JdPXRbcl0pO3JldHVybiBlLmFkZFVwZGF0ZShmdW5jdGlvbigpe3ZhciBlO3QuaW1hZ2UmJihMLnNyYz10LmltYWdlLGU9TCksY2xlYXJMYXllcih0aGlzLmNvbnRleHQoKSwhMSxMKSxkZWxldGUgdC5pbWFnZX0sITAsdCl9fWZ1bmN0aW9uIHJlbW92ZUxheWVyKGUpe2UmJmUuY2FudmFzJiZlLmNhbnZhcy5wYXJlbnROb2RlJiZlLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUuY2FudmFzKX1mdW5jdGlvbiBjbGVhckxheWVyKGUsdCxyKXtlJiYoZS5zYXZlKCksZS5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLHQ/KGUuZmlsbFN0eWxlPXQsZS5maWxsUmVjdCgwLDAsZS5jYW52YXMud2lkdGgsZS5jYW52YXMuaGVpZ2h0KSk6ZS5jbGVhclJlY3QoMCwwLGUuY2FudmFzLndpZHRoLGUuY2FudmFzLmhlaWdodCksciYmZS5kcmF3SW1hZ2UociwwLDApLGUucmVzdG9yZSgpKX1mdW5jdGlvbiBkcmF3VHVydGxlKGUsdCl7dmFyIHIsbixhLHM9dltlLnNoYXBlXSxsPWdldFNjcmVlbigpLHU9Z2V0V2lkdGgoKSxtPWdldEhlaWdodCgpLHA9bC54U2NhbGUsZz1sLnlTY2FsZTtpZih0KXtpZihyPWMoZS5yYWRpYW5zKS9wLG49XyhlLnJhZGlhbnMpL2csYT1kKG4sciktby8yLHQuc2F2ZSgpLHQudHJhbnNsYXRlKGUueCxlLnkpLHQuc2NhbGUocCxnKSxzLm5vZGVOYW1lKXt2YXIgZj1zLm5hdHVyYWxXaWR0aCxoPXMubmF0dXJhbEhlaWdodDt0LmRyYXdJbWFnZShzLDAsMCxmLGgsLWYvMiwtaC8yLGYsaCl9ZWxzZXt0LnJvdGF0ZShhKSx0LmJlZ2luUGF0aCgpLHQubGluZVdpZHRoPTEsdC5zdHJva2VTdHlsZT1lLmNvbG9yLHQuZmlsbFN0eWxlPWUuZmlsbCx0Lm1vdmVUbygtc1swXVswXSxzWzBdWzFdKTtmb3IodmFyICQ9MTskPHMubGVuZ3RoOyQrKyl0LmxpbmVUbygtc1skXVswXSxzWyRdWzFdKTt0LmNsb3NlUGF0aCgpLHQuZmlsbCgpLHQuc3Ryb2tlKCl9dC5yZXN0b3JlKCl9fWZ1bmN0aW9uIGRyYXdEb3QoZSx0KXt2YXIgcj10aGlzLmNvbnRleHQoKSxuPWdldFNjcmVlbigpLGw9bi54U2NhbGUsaT1uLnlTY2FsZTtyJiYoci5iZWdpblBhdGgoKSxyLm1vdmVUbyh0aGlzLngsdGhpcy55KSxlKj1hKHMobCkscyhpKSksci5hcmModGhpcy54LHRoaXMueSxlLzIsMCxUdXJ0bGUuUkFESUFOUyksci5jbG9zZVBhdGgoKSxyLmZpbGxTdHlsZT10fHx0aGlzLmNvbG9yLHIuZmlsbCgpKX1mdW5jdGlvbiBtZWFzdXJlVGV4dChlLHQpe3JldHVybiB0JiYoUy5mb250PXQpLFMubWVhc3VyZVRleHQoZSkud2lkdGh9ZnVuY3Rpb24gZHJhd1RleHQoZSx0LHIpe3ZhciBuPXRoaXMuY29udGV4dCgpO24mJihuLnNhdmUoKSxyJiYobi5mb250PXIpLHQmJnQubWF0Y2goL14obGVmdHxyaWdodHxjZW50ZXIpJC8pJiYobi50ZXh0QWxpZ249dCksbi5zY2FsZSgxLC0xKSxuLmZpbGxTdHlsZT10aGlzLmZpbGwsbi5maWxsVGV4dChlLHRoaXMueCwtdGhpcy55KSxuLnJlc3RvcmUoKSl9ZnVuY3Rpb24gZHJhd0xpbmUoZSx0KXt2YXIgcj10aGlzLmNvbnRleHQoKTtyJiYodCYmKHIuYmVnaW5QYXRoKCksci5tb3ZlVG8odGhpcy54LHRoaXMueSkpLHIubGluZVdpZHRoPXRoaXMuc2l6ZSpnZXRTY3JlZW4oKS5saW5lU2NhbGUsci5zdHJva2VTdHlsZT10aGlzLmNvbG9yLHIubGluZVRvKGUueCxlLnkpLHIuc3Ryb2tlKCkpfWZ1bmN0aW9uIGRyYXdGaWxsKCl7dmFyIGUsdD10aGlzLmNvbnRleHQoKSxyPXRoaXMuZmlsbEJ1ZmZlcjtpZih0JiZyJiZyLmxlbmd0aCl7Zm9yKHQuc2F2ZSgpLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oclswXS54LHJbMF0ueSksZT0xO2U8ci5sZW5ndGg7ZSsrKXQubGluZVRvKHJbZV0ueCxyW2VdLnkpO2Zvcih0LmNsb3NlUGF0aCgpLHQuZmlsbFN0eWxlPXRoaXMuZmlsbCx0LmZpbGwoKSxlPTE7ZTxyLmxlbmd0aDtlKyspcltlXS5zdHJva2UmJih0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHJbZS0xXS54LHJbZS0xXS55KSx0LmxpbmVXaWR0aD1yW2VdLnNpemUqZ2V0U2NyZWVuKCkubGluZVNjYWxlLHQuc3Ryb2tlU3R5bGU9cltlXS5jb2xvcix0LmxpbmVUbyhyW2VdLngscltlXS55KSx0LnN0cm9rZSgpKTt0LnJlc3RvcmUoKX19ZnVuY3Rpb24gcGFydGlhbFRyYW5zbGF0ZShlLHQscixuLGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFkZFVwZGF0ZShmdW5jdGlvbihlKXt0aGlzLmRvd24mJmRyYXdMaW5lLmNhbGwodGhpcyxlLG4pfSxhLHt4OnQseTpyfSxuKX19ZnVuY3Rpb24gdHJhbnNsYXRlKGUsYSxsLG8sZCxfLGMpe3ZhciB1LG09ZS5fY29tcHV0ZWRfc3BlZWQscD1nZXRTY3JlZW4oKSxnPXMocC54U2NhbGUpLGY9cyhwLnlTY2FsZSksaD1hLCQ9bCx3PW4obypvKmcrZCpkKmYpLGI9bT90KHIoMSx3L20pKToxLHY9Z2V0RnJhbWVNYW5hZ2VyKCkud2lsbFJlbmRlck5leHQoKT9Qcm9taXNlLnJlc29sdmUoKTpuZXcgSW5zdGFudFByb21pc2U7Zm9yKGUuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7dGhpcy5maWxsaW5nJiZ0aGlzLmZpbGxCdWZmZXIucHVzaCh7eDp0aGlzLngseTp0aGlzLnksc3Ryb2tlOnRoaXMuZG93bixjb2xvcjp0aGlzLmNvbG9yLHNpemU6dGhpcy5zaXplfSl9LCExKSx1PTA7dTxiO3UrKyloPWErby9iKih1KzEpLCQ9bCtkL2IqKHUrMSksdj12LnRoZW4ocGFydGlhbFRyYW5zbGF0ZShlLGgsJCxfLG18fCFjKSksXz0hMTtyZXR1cm4gdi50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuW2ErbyxsK2RdfSl9ZnVuY3Rpb24gcGFydGlhbFJvdGF0ZShlLHQscixuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGRVcGRhdGUodm9pZCAwLG4se2FuZ2xlOnQscmFkaWFuczpyfSl9fWZ1bmN0aW9uIHJvdGF0ZShlLG4sYSxsKXt2YXIgbyxkPWUuX2NvbXB1dGVkX3NwZWVkLF89MzYwKihhL2UuX2Z1bGxDaXJjbGUpLGM9ZD90KHIoMSxzKF8pL2QpKToxLHU9e30sbT1nZXRGcmFtZU1hbmFnZXIoKS53aWxsUmVuZGVyTmV4dCgpP1Byb21pc2UucmVzb2x2ZSgpOm5ldyBJbnN0YW50UHJvbWlzZTtmb3Iobz0wO288YztvKyspY2FsY3VsYXRlSGVhZGluZyhlLG4rYS9jKihvKzEpLHUpLG09bS50aGVuKHBhcnRpYWxSb3RhdGUoZSx1LmFuZ2xlLHUucmFkaWFucyxkfHwhbCkpO3JldHVybiBtLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY2FsY3VsYXRlSGVhZGluZyhlLG4rYSl9KX1mdW5jdGlvbiBnZXRDb29yZGluYXRlcyhlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD1lJiYoZS55fHxlLl95fHxlWzFdKXx8MCxlPWUmJihlLnh8fGUuX3h8fGVbMF0pfHwwKSx7eDplLHk6dH19ZnVuY3Rpb24gaGV4VG9SR0IoZSl7dmFyIHQscixuO3JldHVybih0PS9ecmdiYT9cXFxcKChcXFxcZCspLChcXFxcZCspLChcXFxcZCspKD86LChbLlxcXFxkXSspKT9cXFxcKSQvLmV4ZWMoZSkpPyhuPVtwYXJzZUludCh0WzFdKSxwYXJzZUludCh0WzJdKSxwYXJzZUludCh0WzNdKV0sdFs0XSYmbi5wdXNoKHBhcnNlRmxvYXQodFs0XSkpKTovXiM/W2EtZlxcXFxkXXszfXxbYS1mXFxcXGRdezZ9JC9pLmV4ZWMoZSk/KDQ9PT1lLmxlbmd0aCYmKGU9ZS5yZXBsYWNlKC9eIz8oW2EtZlxcXFxkXSkoW2EtZlxcXFxkXSkoW2EtZlxcXFxkXSkkL2ksZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHQrdCtyK3IrbitufSkpLHI9L14jPyhbYS1mXFxcXGRdezJ9KShbYS1mXFxcXGRdezJ9KShbYS1mXFxcXGRdezJ9KSQvaS5leGVjKGUpLG49W3BhcnNlSW50KHJbMV0sMTYpLHBhcnNlSW50KHJbMl0sMTYpLHBhcnNlSW50KHJbM10sMTYpXSk6bj1lLG59ZnVuY3Rpb24gY3JlYXRlQ29sb3IoZSx0LG4scyxsKXt2YXIgbztpZih2b2lkIDAhPT1uJiYodD1bdCxuLHMsbF0pLHQuY29uc3RydWN0b3I9PT1BcnJheSYmdC5sZW5ndGgpe2lmKDI1NT09PWUpe2ZvcihvPTA7Mz5vO28rKylpZihcXFwibnVtYmVyXFxcIj09dHlwZW9mIHRbb10pdFtvXT1yKDAsYSgyNTUscGFyc2VJbnQodFtvXSkpKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImJhZCBjb2xvciBzZXF1ZW5jZVxcXCIpO31lbHNlIGZvcihvPTA7Mz5vO28rKylpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIHRbb10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIGNvbG9yIHNlcXVlbmNlXFxcIik7ZWxzZSBpZigxPj10W29dKXRbb109cigwLGEoMjU1LHBhcnNlSW50KDI1NSp0W29dKSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIGNvbG9yIHNlcXVlbmNlXFxcIik7XFxcIm51bWJlclxcXCI9PXR5cGVvZiB0W29dPyh0WzNdPXIoMCxhKDEsdFtvXSkpLHQ9XFxcInJnYmEoXFxcIit0LmpvaW4oXFxcIixcXFwiKStcXFwiKVxcXCIpOnQ9XFxcInJnYihcXFwiK3Quc2xpY2UoMCwzKS5qb2luKFxcXCIsXFxcIikrXFxcIilcXFwifWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiB0JiYhdC5tYXRjaCgvXFxcXHMqdXJsXFxcXHMqXFxcXCgvaSkpdD10LnJlcGxhY2UoL1xcXFxzKy9nLFxcXCJcXFwiKTtlbHNlIHJldHVyblxcXCJibGFja1xcXCI7cmV0dXJuIHR9ZnVuY3Rpb24gY2FsY3VsYXRlSGVhZGluZyhlLHQscil7dmFyIG49ZS5fYW5nbGV8fDAsYT1lLl9yYWRpYW5zfHwwO3JldHVybiByfHwocj17fSksXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYoZS5faXNSYWRpYW5zP249YT10JVR1cnRsZS5SQURJQU5TOmUuX2Z1bGxDaXJjbGU/KG49dCVlLl9mdWxsQ2lyY2xlLGE9bi9lLl9mdWxsQ2lyY2xlKlR1cnRsZS5SQURJQU5TKTpuPWE9MCwwPm4mJihuKz1lLl9mdWxsQ2lyY2xlLGErPVR1cnRsZS5SQURJQU5TKSksci5hbmdsZT1uLHIucmFkaWFucz1hLHJ9ZnVuY3Rpb24gcHl0aG9uVG9KYXZhc2NyaXB0RnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLG49ci5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoZSl9KTtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHQmJm4udW5zaGlmdCh0KSxTay5taXNjZXZhbC5hcHBseUFzeW5jKHZvaWQgMCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLG4pLmNhdGNoKFNrLnVuY2F1Z2h0RXhjZXB0aW9uKX19ZnVuY3Rpb24gYWRkTW9kdWxlTWV0aG9kKGUsdCxyLG4pe3ZhciBhLHM9ci5yZXBsYWNlKC9eXFxcXCQvLFxcXCJcXFwiKSxsPXMucmVwbGFjZSgvX1xcXFwkW2Etel0rXFxcXCQkL2ksXFxcIlxcXCIpLG89ZS5wcm90b3R5cGVbcl0ubGVuZ3RoLGQ9ZS5wcm90b3R5cGVbcl0ubWluQXJncyxfPWUucHJvdG90eXBlW3JdLmNvX3Zhcm5hbWVzfHxbXSxjPWUucHJvdG90eXBlW3JdLnJldHVyblR5cGUsdT1lLnByb3RvdHlwZVtyXS5pc1NrO3ZvaWQgMD09PWQmJihkPW8pLGE9ZnVuY3Rpb24oKXt2YXIgZSx0LGEscyxfLG09QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLHA9bj9uKCk6bS5zaGlmdCgpLmluc3RhbmNlO2lmKG0ubGVuZ3RoPGR8fG0ubGVuZ3RoPm8pdGhyb3cgXz1kPT09bz9cXFwiZXhhY3RseSBcXFwiK286XFxcImJldHdlZW4gXFxcIitkK1xcXCIgYW5kIFxcXCIrbyxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IobCtcXFwiKCkgdGFrZXMgXFxcIitfK1xcXCIgcG9zaXRpb25hbCBhcmd1bWVudChzKSAoXFxcIittLmxlbmd0aCtcXFwiIGdpdmVuKVxcXCIpO2ZvcihlPW0ubGVuZ3RoOzA8PS0tZTspdm9pZCAwIT09bVtlXSYmKG1bZV09bVtlXWluc3RhbmNlb2YgU2suYnVpbHRpbi5mdW5jP3B5dGhvblRvSmF2YXNjcmlwdEZ1bmN0aW9uKG1bZV0pOm1bZV1pbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kP3B5dGhvblRvSmF2YXNjcmlwdEZ1bmN0aW9uKG1bZV0uaW1fZnVuYyxtW2VdLmltX3NlbGYpOm1bZV0mJm1bZV0uJGQgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QmJm1bZV0uaW5zdGFuY2U/bVtlXS5pbnN0YW5jZTpTay5mZmkucmVtYXBUb0pzKG1bZV0pKTt2YXIgZz1tLnNsaWNlKDApO2ZvcihtPVtdLGU9Zy5sZW5ndGg7MDw9ZTstLWUpbnVsbCE9PWdbZV0mJihtW2VdPWdbZV0pO3RyeXt0PXBbcl0uYXBwbHkocCxtKX1jYXRjaCh0KXt0aHJvdyB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiYod2luZG93LmNvbnNvbGUubG9nKFxcXCJ3cmFwcGVkIG1ldGhvZCBmYWlsZWRcXFwiKSx3aW5kb3cuY29uc29sZS5sb2codC5zdGFjaykpLHR9cmV0dXJuIHQgaW5zdGFuY2VvZiBJbnN0YW50UHJvbWlzZSYmKHQ9dC5sYXN0UmVzdWx0KSx0IGluc3RhbmNlb2YgUHJvbWlzZT8odD10LmNhdGNoKGZ1bmN0aW9uKHQpe3Rocm93IHdpbmRvdyYmd2luZG93LmNvbnNvbGUmJih3aW5kb3cuY29uc29sZS5sb2coXFxcInByb21pc2UgZmFpbGVkXFxcIiksd2luZG93LmNvbnNvbGUubG9nKHQuc3RhY2spKSx0fSksYT1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbixhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1zP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpTay5mZmkucmVtYXBUb1B5KHMpfSxhLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6dC50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBzPWUsZX0pfSxhKTp2b2lkIDA9PT10P1NrLmJ1aWx0aW4ubm9uZS5ub25lJDp1P3Q6XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGM/Yyh0KTpTay5mZmkucmVtYXBUb1B5KHQpfSxhLmNvX25hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKGwpLGEuY29fdmFybmFtZXM9Xy5zbGljZSgpLGEuJGRlZmF1bHRzPVtdO2Zvcih2YXIgbT1kO208Xy5sZW5ndGg7bSsrKWEuJGRlZmF1bHRzLnB1c2goU2suYnVpbHRpbi5ub25lLm5vbmUkKTtufHxhLmNvX3Zhcm5hbWVzLnVuc2hpZnQoXFxcInNlbGZcXFwiKSx0W3NdPW5ldyBTay5idWlsdGluLmZ1bmMoYSl9ZnVuY3Rpb24gaW5pdFR1cnRsZShlLHQpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMsMiwzLCExLCExKSxlLmluc3RhbmNlPW5ldyBUdXJ0bGUodCksZS5pbnN0YW5jZS5za0luc3RhbmNlPWV9ZnVuY3Rpb24gZm9jdXNUdXJ0bGUoZSl7cmV0dXJuIHZvaWQgMCE9PWUmJih3PSEhZSx3P2dldFRhcmdldCgpLmZvY3VzKCk6Z2V0VGFyZ2V0KCkuYmx1cigpKSx3fWZ1bmN0aW9uIHJlc2V0VHVydGxlKCl7Zm9yKGNhbmNlbEFuaW1hdGlvbkZyYW1lKCksZ2V0U2NyZWVuKCkucmVzZXQoKSxnZXRGcmFtZU1hbmFnZXIoKS5yZXNldCgpO2UuZmlyc3RDaGlsZDspZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO2gmJmgucmVzZXQoKSwkPTAscD12b2lkIDAsZj12b2lkIDAsaD12b2lkIDAsaz0wfWZ1bmN0aW9uIHN0b3BUdXJ0bGUoKXtjYW5jZWxBbmltYXRpb25GcmFtZSgpLGgmJmgucmVzZXQoKSwkPTAscD12b2lkIDAsZj12b2lkIDAsaD12b2lkIDAsaz0wfXZhciB1LG0scCxnLGYsaCx5PXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcInR1cnRsZVxcXCIpfSwkPTAsdz0hMCxiPTFlMy8zMCx2PXt9LGs9MCx4PXt9LFQ9e3RhcmdldDpcXFwidHVydGxlXFxcIix3aWR0aDo0MDAsaGVpZ2h0OjQwMCx3b3JsZFdpZHRoOjAsd29ybGRIZWlnaHQ6MCxhbmltYXRlOiEwLGJ1ZmZlclNpemU6MCxhbGxvd1VuZG86ITAsYXNzZXRzOnt9fTtlLmhhc0F0dHJpYnV0ZShcXFwidGFiaW5kZXhcXFwiKXx8ZS5zZXRBdHRyaWJ1dGUoXFxcInRhYmluZGV4XFxcIiwwKSx4LkZMT0FUPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSl9LHguQ09MT1I9ZnVuY3Rpb24oZSl7aWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZSk7Zm9yKHZhciB0PTA7Mz50O3QrKyllW3RdPVNrLmJ1aWx0aW4uYXNzayQoZVt0XSk7cmV0dXJuIDQ9PT1lLmxlbmd0aCYmKGVbM109bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGVbM10pKSxuZXcgU2suYnVpbHRpbi50dXBsZShlKX0seC5UVVJUTEVfTElTVD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10scj0wO3I8ZS5sZW5ndGg7cisrKXQucHVzaChlW3JdLnNrSW5zdGFuY2UpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZSh0KX0sdi5hcnJvdz1bWy0xMCwwXSxbMTAsMF0sWzAsMTBdXSx2LnNxdWFyZT1bWzEwLC0xMF0sWzEwLDEwXSxbLTEwLDEwXSxbLTEwLC0xMF1dLHYudHJpYW5nbGU9W1sxMCwtNS43N10sWzAsMTEuNTVdLFstMTAsLTUuNzddXSx2LmNsYXNzaWM9W1swLDBdLFstNSwtOV0sWzAsLTddLFs1LC05XV0sdi50dXJ0bGU9W1swLDE2XSxbLTIsMTRdLFstMSwxMF0sWy00LDddLFstNyw5XSxbLTksOF0sWy02LDVdLFstNywxXSxbLTUsLTNdLFstOCwtNl0sWy02LC04XSxbLTQsLTVdLFswLC03XSxbNCwtNV0sWzYsLThdLFs4LC02XSxbNSwtM10sWzcsMV0sWzYsNV0sWzksOF0sWzcsOV0sWzQsN10sWzEsMTBdLFsyLDE0XV0sdi5jaXJjbGU9W1sxMCwwXSxbOS41MSwzLjA5XSxbOC4wOSw1Ljg4XSxbNS44OCw4LjA5XSxbMy4wOSw5LjUxXSxbMCwxMF0sWy0zLjA5LDkuNTFdLFstNS44OCw4LjA5XSxbLTguMDksNS44OF0sWy05LjUxLDMuMDldLFstMTAsMF0sWy05LjUxLC0zLjA5XSxbLTguMDksLTUuODhdLFstNS44OCwtOC4wOV0sWy0zLjA5LC05LjUxXSxbLTAsLTEwXSxbMy4wOSwtOS41MV0sWzUuODgsLTguMDldLFs4LjA5LC01Ljg4XSxbOS41MSwtMy4wOV1dLGc9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gU2suVHVydGxlR3JhcGhpY3N8fChTay5UdXJ0bGVHcmFwaGljcz17fSksVClTay5UdXJ0bGVHcmFwaGljcy5oYXNPd25Qcm9wZXJ0eShlKXx8KFNrLlR1cnRsZUdyYXBoaWNzW2VdPVRbZV0pO3JldHVybiBTay5UdXJ0bGVHcmFwaGljc30oKSxJbnN0YW50UHJvbWlzZS5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihlKXtpZih0aGlzLmxhc3RFcnJvcilyZXR1cm4gdGhpczt0cnl7dGhpcy5sYXN0UmVzdWx0PWUodGhpcy5sYXN0UmVzdWx0KX1jYXRjaCh0KXt0aGlzLmxhc3RSZXN1bHQ9dm9pZCAwLHRoaXMubGFzdEVycm9yPXR9cmV0dXJuIHRoaXMubGFzdFJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2U/dGhpcy5sYXN0UmVzdWx0OnRoaXN9LEluc3RhbnRQcm9taXNlLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihlKXtpZih0aGlzLmxhc3RFcnJvcil0cnl7dGhpcy5sYXN0UmVzdWx0PWUodGhpcy5sYXN0RXJyb3IpLHRoaXMubGFzdEVycm9yPXZvaWQgMH1jYXRjaCh0KXt0aGlzLmxhc3RSZXN1bHQ9dm9pZCAwLHRoaXMubGFzdEVycm9yPXR9cmV0dXJuIHRoaXMubGFzdFJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2U/dGhpcy5sYXN0UmVzdWx0OnRoaXN9O3ZhciBBOyhmdW5jdGlvbihlKXtmdW5jdGlvbiBhbmltYXRpb25GcmFtZShlKXtyZXR1cm4gZy5hbmltYXRlPyFlJiZ0P3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG09d2luZG93LnNldFRpbWVvdXQodCxlfHxiKSxtfTpmdW5jdGlvbihlKXtlKCl9fXZhciB0OyhmdW5jdGlvbihlKXtlJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gdT1lKHQpfSl9KSh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSxlLndpbGxSZW5kZXJOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fYnVmZmVyJiZ0aGlzLl9mcmFtZUNvdW50KzE9PT10aGlzLmZyYW1lQnVmZmVyKCkpfSxlLnR1cnRsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHVydGxlc30sZS5hZGRUdXJ0bGU9ZnVuY3Rpb24oZSl7dGhpcy5fdHVydGxlcy5wdXNoKGUpfSxlLnJlc2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5fdHVydGxlcylmb3IodmFyIGU9dGhpcy5fdHVydGxlcy5sZW5ndGg7MDw9LS1lOyl0aGlzLl90dXJ0bGVzW2VdLnJlc2V0KCk7dGhpcy5fdHVydGxlcz1bXSx0aGlzLl9mcmFtZXM9W10sdGhpcy5fZnJhbWVDb3VudD0wLHRoaXMuX2J1ZmZlcj0xLHRoaXMuX3JhdGU9MCx0aGlzLl9hbmltYXRpb25GcmFtZT1hbmltYXRpb25GcmFtZSgpfSxlLmFkZEZyYW1lPWZ1bmN0aW9uKGUsdCl7dmFyIHI9ITE7cmV0dXJuIHQmJih0aGlzLl9mcmFtZUNvdW50Kz0xKSx0aGlzLmZyYW1lcygpLnB1c2goZSkscj0hZy5hbmltYXRlfHx0aGlzLl9idWZmZXImJnRoaXMuX2ZyYW1lQ291bnQ9PT10aGlzLmZyYW1lQnVmZmVyKCkscj90aGlzLnVwZGF0ZSgpOm5ldyBJbnN0YW50UHJvbWlzZX0sZS5mcmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJhbWVzfSxlLmZyYW1lQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVyblxcXCJudW1iZXJcXFwiPT10eXBlb2YgZSYmKHRoaXMuX2J1ZmZlcj0wfGUsZSYmZTw9dGhpcy5fZnJhbWVDb3VudCk/dGhpcy51cGRhdGUoKTp0aGlzLl9idWZmZXJ9LGUucmVmcmVzaEludGVydmFsPWZ1bmN0aW9uKGUpe3JldHVyblxcXCJudW1iZXJcXFwiPT10eXBlb2YgZSYmKHRoaXMuX3JhdGU9MHxlLHRoaXMuX2FuaW1hdGlvbkZyYW1lPWFuaW1hdGlvbkZyYW1lKGUpKSx0aGlzLl9yYXRlfSxlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mcmFtZXMmJnRoaXMuX2ZyYW1lcy5sZW5ndGg/dGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKTpuZXcgSW5zdGFudFByb21pc2V9LGUucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKCl7dmFyIGUsdCxyPXRoaXMuX2ZyYW1lcyxuPXRoaXMuX2FuaW1hdGlvbkZyYW1lLGE9dGhpcy5fdHVydGxlcyxzPWdldFNjcmVlbigpLnNwcml0ZUxheWVyKCk7cmV0dXJuIHRoaXMuX2ZyYW1lcz1bXSx0aGlzLl9mcmFtZUNvdW50PTAsbmV3IFByb21pc2UoZnVuY3Rpb24obCl7bihmdW5jdGlvbiBwYWludCgpe2Zvcih0PTA7dDxyLmxlbmd0aDt0Kyspclt0XSYmclt0XSgpO2ZvcihjbGVhckxheWVyKHMpLHQ9MDt0PGEubGVuZ3RoO3QrKyllPWFbdF0sZS5nZXRTdGF0ZSgpLnNob3duJiZkcmF3VHVydGxlKGUuZ2V0U3RhdGUoKSxzKTtsKCl9KX0pfX0pKEZyYW1lTWFuYWdlci5wcm90b3R5cGUpLGZ1bmN0aW9uKGUpe2Uub25FdmVudD1mdW5jdGlvbih0LHIpe2Z1bmN0aW9uIGNvbXB1dGVDb29yZGluYXRlcygpe2lmKCFfKXt2YXIgdD1nZXRTY3JlZW4oKSxsPXQuc3ByaXRlTGF5ZXIoKS5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZT0wfHIuY2xpZW50WC1sLmxlZnQsbj0wfHIuY2xpZW50WS1sLnRvcCxhPWUqdC54U2NhbGUrdC5sbHgscz1uKnQueVNjYWxlK3QudXJ5LF89ITB9fXZhciBlLG4sYSxzLGwsbz10aGlzLl9tYW5hZ2Vyc1t0XSxkPXRoaXMuX21hbmFnZXJzLm1vdXNlbW92ZSxfPSExO2lmKChcXFwibW91c2Vkb3duXFxcIj09PXR8fFxcXCJtb3VzZXVwXFxcIj09PXQpJiZkJiZkLmxlbmd0aClmb3IoY29tcHV0ZUNvb3JkaW5hdGVzKCksbD1kLmxlbmd0aDswPD0tLWw7KWRbbF0udGVzdChlLG4sYSxzKSYmZFtsXS5jYW5Nb3ZlKFxcXCJtb3VzZWRvd25cXFwiPT09dCk7aWYobyYmby5sZW5ndGgpZm9yKGNvbXB1dGVDb29yZGluYXRlcygpLGw9by5sZW5ndGg7MDw9LS1sOylcXFwibW91c2Vtb3ZlXFxcIj09PXQmJm9bbF0uY2FuTW92ZSgpJiZvW2xdLnRlc3QoZSxuLGEscyk/b1tsXS50cmlnZ2VyKFthLHNdKTpcXFwibW91c2Vkb3duXFxcIj09PXQmJm9bbF0udGVzdChlLG4sYSxzKSYmb1tsXS50cmlnZ2VyKFthLHNdKX0sZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuX21hbmFnZXJzPXt9fSxlLmFkZE1hbmFnZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl9tYW5hZ2Vyc1tlXXx8KHRoaXMuX21hbmFnZXJzW2VdPVtdKSx0aGlzLl9tYW5hZ2Vyc1tlXS5wdXNoKHQpfX0oTW91c2VIYW5kbGVyLnByb3RvdHlwZSksZnVuY3Rpb24oZSl7ZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuX2hhbmRsZXJzPXZvaWQgMH0sZS5jYW5Nb3ZlPWZ1bmN0aW9uKGUpe3JldHVybiEhKHRoaXMuX3RhcmdldCYmdGhpcy5fdGFyZ2V0LmhpdFRlc3QpJiYodm9pZCAwIT09ZSYmKHRoaXMuX3RhcmdldC5oaXRUZXN0LmhpdD1lKSx0aGlzLl90YXJnZXQuaGl0VGVzdC5oaXQpfSxlLnRlc3Q9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHRoaXMuX3RhcmdldCYmdGhpcy5fdGFyZ2V0LmhpdFRlc3Q/dGhpcy5fdGFyZ2V0LmhpdFRlc3QoZSx0LHIsbik6ISF0aGlzLl90YXJnZXR9LGUudHJpZ2dlcj1mdW5jdGlvbihlKXt2YXIgdCxyPXRoaXMuX2hhbmRsZXJzO2lmKHImJnIubGVuZ3RoKWZvcih0PTA7dDxyLmxlbmd0aDt0Kyspclt0XS5hcHBseSh7fSxlKX0sZS5hZGRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5faGFuZGxlcnM7aWYoIXQmJnImJnIubGVuZ3RoKWZvcig7ci5zaGlmdCgpOyk7cmV0dXJuXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGU/dm9pZCghciYmKHI9dGhpcy5faGFuZGxlcnM9W10pLHIucHVzaChlKSk6dm9pZChyJiYhci5sZW5ndGgmJnRoaXMucmVzZXQoKSl9fShFdmVudE1hbmFnZXIucHJvdG90eXBlKSxUdXJ0bGUuUkFESUFOUz0yKm8sZnVuY3Rpb24oZSl7ZnVuY3Rpb24gY2lyY2xlUm90YXRlKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGRVcGRhdGUodm9pZCAwLCExLHthbmdsZTp0LHJhZGlhbnM6cn0pfX1mdW5jdGlvbiBjaXJjbGVTZWdtZW50KGUsdCxyLG4sYSxzKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS50cmFuc2xhdGUodCxyLG4sYSxzLCEwKX19ZS5oaXRUZXN0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0U2NyZWVuKCkuaGl0VGVzdExheWVyKCk7Y2xlYXJMYXllcihyKSxkcmF3VHVydGxlKHRoaXMuZ2V0U3RhdGUoKSxyKTt2YXIgbj1yLmdldEltYWdlRGF0YShlLHQsMSwxKS5kYXRhO3JldHVybiBuWzNdfHxuWzBdfHxuWzFdfHxuWzJdfSxlLmFkZFVwZGF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpcyxhPXRoaXMuZ2V0U3RhdGUoKSxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyxyPzI6Myk7cmV0dXJuIGdldEZyYW1lTWFuYWdlcigpLmFkZEZyYW1lKGZ1bmN0aW9uKCl7aWYoZSYmZS5hcHBseShhLHMpLHIpZm9yKHZhciB0IGluIHIpYVt0XT1yW3RdfSx0KX0sZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX3N0YXRlfHwodGhpcy5fc3RhdGU9e3g6dGhpcy5feCx5OnRoaXMuX3ksYW5nbGU6dGhpcy5fYW5nbGUscmFkaWFuczp0aGlzLl9yYWRpYW5zLHNoYXBlOnRoaXMuX3NoYXBlLGNvbG9yOnRoaXMuX2NvbG9yLGZpbGw6dGhpcy5fZmlsbCxmaWxsaW5nOnRoaXMuX2ZpbGxpbmcsc2l6ZTp0aGlzLl9zaXplLHNwZWVkOnRoaXMuX2NvbXB1dGVkX3NwZWVkLGRvd246dGhpcy5fZG93bixzaG93bjp0aGlzLl9zaG93bixjb2xvck1vZGU6dGhpcy5fY29sb3JNb2RlLGNvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRQYXBlcigpfX0pLHRoaXMuX3N0YXRlfSxlLnRyYW5zbGF0ZT1mdW5jdGlvbihlLHQscixuLGEscyl7dmFyIGw9dGhpcztyZXR1cm4gdHJhbnNsYXRlKHRoaXMsZSx0LHIsbixhLHMpLnRoZW4oZnVuY3Rpb24oZSl7bC5feD1lWzBdLGwuX3k9ZVsxXX0pfSxlLnJvdGF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpcztyZXR1cm4gcm90YXRlKHRoaXMsZSx0LHIpLnRoZW4oZnVuY3Rpb24oZSl7bi5fYW5nbGU9ZS5hbmdsZSxuLl9yYWRpYW5zPWUucmFkaWFuc30pfSxlLnF1ZXVlTW92ZUJ5PWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBhPWMocikqbixzPV8ocikqbjtyZXR1cm4gdGhpcy50cmFuc2xhdGUoZSx0LGEscywhMCl9LGUucXVldWVUdXJuVG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCU9dGhpcy5fZnVsbENpcmNsZSwwPnQmJih0Kz10aGlzLl9mdWxsQ2lyY2xlKSx0aGlzLnJvdGF0ZShlLHQtZSl9LGUuZ2V0TWFuYWdlcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbWFuYWdlcnNbZV18fCh0aGlzLl9tYW5hZ2Vyc1tlXT1uZXcgRXZlbnRNYW5hZ2VyKGUsdGhpcykpLHRoaXMuX21hbmFnZXJzW2VdfSxlLmdldFBhcGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcGVyfHwodGhpcy5fcGFwZXI9Y3JlYXRlTGF5ZXIoMikpfSxlLnJlc2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fcmFkaWFucz0wLHRoaXMuX2FuZ2xlPTAsdGhpcy5fc2hvd249ITAsdGhpcy5fZG93bj0hMCx0aGlzLl9jb2xvcj1cXFwiYmxhY2tcXFwiLHRoaXMuX2ZpbGw9XFxcImJsYWNrXFxcIix0aGlzLl9zaXplPTEsdGhpcy5fZmlsbGluZz0hMSx0aGlzLl91bmRvQnVmZmVyPVtdLHRoaXMuX3NwZWVkPTMsdGhpcy5fY29tcHV0ZWRfc3BlZWQ9NSx0aGlzLl9jb2xvck1vZGU9MSx0aGlzLl9zdGF0ZT12b2lkIDAsdGhpcy5fbWFuYWdlcnMpdGhpcy5fbWFuYWdlcnNbZV0ucmVzZXQoKTt0aGlzLl9pc1JhZGlhbnM9ITEsdGhpcy5fZnVsbENpcmNsZT0zNjAsdGhpcy5fYnVmZmVyU2l6ZT1cXFwibnVtYmVyXFxcIj09dHlwZW9mIGcuYnVmZmVyU2l6ZT9nLmJ1ZmZlclNpemU6MCxyZW1vdmVMYXllcih0aGlzLl9wYXBlciksdGhpcy5fcGFwZXI9dm9pZCAwfSxlLiRkZWdyZWVzPWZ1bmN0aW9uKGUpe3JldHVybiBlPVxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT9zKGUpOjM2MCx0aGlzLl9pc1JhZGlhbnM9ITEsdGhpcy5fYW5nbGU9ZSYmdGhpcy5fZnVsbENpcmNsZT90aGlzLl9hbmdsZS90aGlzLl9mdWxsQ2lyY2xlKmU6dGhpcy5fcmFkaWFucz0wLHRoaXMuX2Z1bGxDaXJjbGU9ZSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse2FuZ2xlOnRoaXMuX2FuZ2xlLHJhZGlhbnM6dGhpcy5fcmFkaWFuc30pfSxlLiRkZWdyZWVzLm1pbkFyZ3M9MCxlLiRkZWdyZWVzLmNvX3Zhcm5hbWVzPVtcXFwiZnVsbGNpcmNsZVxcXCJdLGUuJGRlZ3JlZXMucmV0dXJuVHlwZT14LkZMT0FULGUuJHJhZGlhbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNSYWRpYW5zfHwodGhpcy5faXNSYWRpYW5zPSEwLHRoaXMuX2FuZ2xlPXRoaXMuX3JhZGlhbnMsdGhpcy5fZnVsbENpcmNsZT1UdXJ0bGUuUkFESUFOUyksdGhpcy5fYW5nbGV9LGUuJHJhZGlhbnMucmV0dXJuVHlwZT14LkZMT0FULGUuJHBvc2l0aW9uPWUuJHBvcz1mdW5jdGlvbigpe3JldHVyblt0aGlzLiR4Y29yKCksdGhpcy4keWNvcigpXX0sZS4kcG9zaXRpb24ucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhlWzBdKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZVsxXSldKX0sZS4kdG93YXJkcz1mdW5jdGlvbihlLHQpe3ZhciByPWdldENvb3JkaW5hdGVzKGUsdCksbj1vK2QodGhpcy5feS1yLnksdGhpcy5feC1yLngpLGE9bioodGhpcy5fZnVsbENpcmNsZS9UdXJ0bGUuUkFESUFOUyk7cmV0dXJuIGF9LGUuJHRvd2FyZHMuY29fdmFybmFtZXM9W1xcXCJ4XFxcIixcXFwieVxcXCJdLGUuJHRvd2FyZHMubWluQXJncz0xLGUuJHRvd2FyZHMucmV0dXJuVHlwZT14LkZMT0FULGUuJGRpc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0Q29vcmRpbmF0ZXMoZSx0KSxhPXIueC10aGlzLl94LHM9ci55LXRoaXMuX3k7cmV0dXJuIG4oYSphK3Mqcyl9LGUuJGRpc3RhbmNlLmNvX3Zhcm5hbWVzPVtcXFwieFxcXCIsXFxcInlcXFwiXSxlLiRkaXN0YW5jZS5taW5BcmdzPTEsZS4kZGlzdGFuY2UucmV0dXJuVHlwZT14LkZMT0FULGUuJGhlYWRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtMTM+cyh0aGlzLl9hbmdsZSk/MDp0aGlzLl9hbmdsZX0sZS4kaGVhZGluZy5yZXR1cm5UeXBlPXguRkxPQVQsZS4keGNvcj1mdW5jdGlvbigpe3JldHVybiAxZS0xMz5zKHRoaXMuX3gpPzA6dGhpcy5feH0sZS4keGNvci5yZXR1cm5UeXBlPXguRkxPQVQsZS4keWNvcj1mdW5jdGlvbigpe3JldHVybiAxZS0xMz5zKHRoaXMuX3kpPzA6dGhpcy5feX0sZS4keWNvci5yZXR1cm5UeXBlPXguRkxPQVQsZS4kZm9yd2FyZD1lLiRmZD1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5xdWV1ZU1vdmVCeSh0aGlzLl94LHRoaXMuX3ksdGhpcy5fcmFkaWFucyxlKX0sZS4kZm9yd2FyZC5jb192YXJuYW1lcz1lLiRmZC5jb192YXJuYW1lcz1bXFxcImRpc3RhbmNlXFxcIl0sZS4kdW5kbz1mdW5jdGlvbigpe3BvcFVuZG8odGhpcyl9LGUuJHVuZG9idWZmZXJlbnRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VuZG9CdWZmZXIubGVuZ3RofSxlLiRzZXR1bmRvYnVmZmVyPWZ1bmN0aW9uKGUpe3RoaXMuX2J1ZmZlclNpemU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBlP2EocyhlKSwxZTMpOjB9LGUuJHNldHVuZG9idWZmZXIuY29fdmFybmFtZXM9W1xcXCJzaXplXFxcIl0sZS4kYmFja3dhcmQ9ZS4kYmFjaz1lLiRiaz1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5xdWV1ZU1vdmVCeSh0aGlzLl94LHRoaXMuX3ksdGhpcy5fcmFkaWFucywtZSl9LGUuJGJhY2t3YXJkLmNvX3Zhcm5hbWVzPWUuJGJhY2suY29fdmFybmFtZXM9ZS4kYmsuY29fdmFybmFtZXM9W1xcXCJkaXN0YW5jZVxcXCJdLGUuJGdvdG9fJHJ3JD1lLiRzZXRwb3M9ZS4kc2V0cG9zaXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgcj1nZXRDb29yZGluYXRlcyhlLHQpO3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksci54LXRoaXMuX3gsci55LXRoaXMuX3ksITApfSxlLiRnb3RvXyRydyQuY29fdmFybmFtZXM9ZS4kc2V0cG9zLmNvX3Zhcm5hbWVzPWUuJHNldHBvc2l0aW9uLmNvX3Zhcm5hbWVzPVtcXFwieFxcXCIsXFxcInlcXFwiXSxlLiRnb3RvXyRydyQubWluQXJncz1lLiRzZXRwb3MubWluQXJncz1lLiRzZXRwb3NpdGlvbi5taW5BcmdzPTEsZS4kc2V0eD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50cmFuc2xhdGUodGhpcy5feCx0aGlzLl95LGUtdGhpcy5feCwwLCEwKX0sZS4kc2V0eC5jb192YXJuYW1lcz1bXFxcInhcXFwiXSxlLiRzZXR5PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksMCxlLXRoaXMuX3ksITApfSxlLiRzZXR5LmNvX3Zhcm5hbWVzPVtcXFwieVxcXCJdLGUuJGhvbWU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5fYW5nbGU7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLGUudHJhbnNsYXRlKHRoaXMuX3gsdGhpcy5feSwtdGhpcy5feCwtdGhpcy5feSwhMCkudGhlbihmdW5jdGlvbigpe3JldHVybiBlLnF1ZXVlVHVyblRvKHQsMCl9KS50aGVuKGZ1bmN0aW9uKCl7fSl9LGUuJHJpZ2h0PWUuJHJ0PWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnJvdGF0ZSh0aGlzLl9hbmdsZSwtZSl9LGUuJHJpZ2h0LmNvX3Zhcm5hbWVzPWUuJHJ0LmNvX3Zhcm5hbWVzPVtcXFwiYW5nbGVcXFwiXSxlLiRsZWZ0PWUuJGx0PWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnJvdGF0ZSh0aGlzLl9hbmdsZSxlKX0sZS4kbGVmdC5jb192YXJuYW1lcz1lLiRsdC5jb192YXJuYW1lcz1bXFxcImFuZ2xlXFxcIl0sZS4kc2V0aGVhZGluZz1lLiRzZXRoPWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnF1ZXVlVHVyblRvKHRoaXMuX2FuZ2xlLGUpfSxlLiRzZXRoZWFkaW5nLmNvX3Zhcm5hbWVzPWUuJHNldGguY29fdmFybmFtZXM9W1xcXCJhbmdsZVxcXCJdLGUuJGNpcmNsZT1mdW5jdGlvbihlLHQscil7dmFyIG4sZCx1LG0scCxnLGYsaCwkLGI9dGhpcyx2PXRoaXMuX3gsaz10aGlzLl95LFQ9dGhpcy5fYW5nbGUsQT17fSxMPTEvZ2V0U2NyZWVuKCkubGluZVNjYWxlLFM9ITA7Zm9yKHB1c2hVbmRvKHRoaXMpLHZvaWQgMD09PXQmJih0PWIuX2Z1bGxDaXJjbGUpLHZvaWQgMD09PXImJihkPXModCkvYi5fZnVsbENpcmNsZSxyPTErKDB8YSgxMStzKGUqTCkvNiw1OSkqZCkpLHU9dC9yLG09LjUqdSxwPTIqZSpfKHUqby9iLl9mdWxsQ2lyY2xlKSwwPmU/KHA9LXAsdT0tdSxtPS1tLG49VC10KTpuPVQrdCwkPWdldEZyYW1lTWFuYWdlcigpLndpbGxSZW5kZXJOZXh0KCk/UHJvbWlzZS5yZXNvbHZlKCk6bmV3IEluc3RhbnRQcm9taXNlLFQrPW0sZz0wO2c8cjtnKyspY2FsY3VsYXRlSGVhZGluZyhiLFQrdSpnLEEpLGY9YyhBLnJhZGlhbnMpKnAsaD1fKEEucmFkaWFucykqcCwkPSQudGhlbihjaXJjbGVSb3RhdGUoYixBLmFuZ2xlLEEucmFkaWFucykpLnRoZW4oY2lyY2xlU2VnbWVudChiLHYsayxmLGgsUykpLHYrPWYsays9aCxTPSExO3JldHVybiAkPSQudGhlbihmdW5jdGlvbigpe3JldHVybiBjYWxjdWxhdGVIZWFkaW5nKGIsbixBKSxiLl9hbmdsZT1BLmFuZ2xlLGIuX3JhZGlhbnM9QS5yYWRpYW5zLGIuYWRkVXBkYXRlKHZvaWQgMCwhMCxBKX0pLCR9LGUuJGNpcmNsZS5jb192YXJuYW1lcz1bXFxcInJhZGl1c1xcXCIsXFxcImV4dGVudFxcXCIsXFxcInN0ZXBzXFxcIl0sZS4kY2lyY2xlLm1pbkFyZ3M9MSxlLiRwZW51cD1lLiR1cD1lLiRwdT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3duPSExLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7ZG93bjohMX0pfSxlLiRwZW5kb3duPWUuJGRvd249ZS4kcGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG93bj0hMCx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse2Rvd246ITB9KX0sZS4kaXNkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd259LGUuJHNwZWVkPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuX3NwZWVkOih0aGlzLl9zcGVlZD1yKDAsYSgxZTMsZSkpLHRoaXMuX2NvbXB1dGVkX3NwZWVkPXIoMCwyKmUtMSksdGhpcy5hZGRVcGRhdGUodm9pZCAwLCExLHtzcGVlZDp0aGlzLl9jb21wdXRlZF9zcGVlZH0pKX0sZS4kc3BlZWQubWluQXJncz0wLGUuJHNwZWVkLmNvX3Zhcm5hbWVzPVtcXFwic3BlZWRcXFwiXSxlLiRwZW5jb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9oZXhUb1JHQih0aGlzLl9jb2xvcik6KHRoaXMuX2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlLHQscixuKSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se2NvbG9yOnRoaXMuX2NvbG9yfSkpfSxlLiRwZW5jb2xvci5jb192YXJuYW1lcz1bXFxcInJcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRwZW5jb2xvci5taW5BcmdzPTAsZS4kcGVuY29sb3IucmV0dXJuVHlwZT14LkNPTE9SLGUuJGZpbGxjb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9oZXhUb1JHQih0aGlzLl9maWxsKToodGhpcy5fZmlsbD1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtmaWxsOnRoaXMuX2ZpbGx9KSl9LGUuJGZpbGxjb2xvci5jb192YXJuYW1lcz1bXFxcInJcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRmaWxsY29sb3IubWluQXJncz0wLGUuJGZpbGxjb2xvci5yZXR1cm5UeXBlPXguQ09MT1IsZS4kY29sb3I9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHZvaWQgMD09PWU/W3RoaXMuJHBlbmNvbG9yKCksdGhpcy4kZmlsbGNvbG9yKCldOih2b2lkIDA9PT10fHx2b2lkIDAhPT1yPyh0aGlzLl9jb2xvcj1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdGhpcy5fZmlsbD10aGlzLl9jb2xvcik6KHRoaXMuX2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlKSx0aGlzLl9maWxsPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSx0KSksdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtjb2xvcjp0aGlzLl9jb2xvcixmaWxsOnRoaXMuX2ZpbGx9KSl9LGUuJGNvbG9yLm1pbkFyZ3M9MCxlLiRjb2xvci5jb192YXJuYW1lcz1bXFxcImNvbG9yXFxcIixcXFwiZmlsbFxcXCIsXFxcImJcXFwiLFxcXCJhXFxcIl0sZS4kY29sb3IucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3guQ09MT1IoZVswXSkseC5DT0xPUihlWzFdKV0pfSxlLiRmaWxsPWZ1bmN0aW9uKGUpe3RoaXM7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5fZmlsbGluZzooZT0hIWUsZT09PXRoaXMuX2ZpbGxpbmcpP3ZvaWQgMDoodGhpcy5fZmlsbGluZz1lLGU/KHB1c2hVbmRvKHRoaXMpLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7ZmlsbGluZzohMCxmaWxsQnVmZmVyOlt7eDp0aGlzLl94LHk6dGhpcy5feX1dfSkpOihwdXNoVW5kbyh0aGlzKSx0aGlzLmFkZFVwZGF0ZShmdW5jdGlvbigpe3RoaXMuZmlsbEJ1ZmZlci5wdXNoKHRoaXMpLGRyYXdGaWxsLmNhbGwodGhpcyl9LCEwLHtmaWxsaW5nOiExLGZpbGxCdWZmZXI6dm9pZCAwfSkpKX0sZS4kZmlsbC5jb192YXJuYW1lcz1bXFxcImZsYWdcXFwiXSxlLiRmaWxsLm1pbkFyZ3M9MCxlLiRiZWdpbl9maWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZpbGwoITApfSxlLiRlbmRfZmlsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRmaWxsKCExKX0sZS4kc3RhbXA9ZnVuY3Rpb24oKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5hZGRVcGRhdGUoZnVuY3Rpb24oKXtkcmF3VHVydGxlKHRoaXMsdGhpcy5jb250ZXh0KCkpfSwhMCl9LGUuJGRvdD1mdW5jdGlvbihlLHQsbixsLGkpe3JldHVybiBwdXNoVW5kbyh0aGlzKSxlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBlP3IoMSwwfHMoZSkpOnIodGhpcy5fc2l6ZSs0LDIqdGhpcy5fc2l6ZSksdD12b2lkIDA9PT10P3RoaXMuX2NvbG9yOmNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSx0LG4sbCxpKSx0aGlzLmFkZFVwZGF0ZShkcmF3RG90LCEwLHZvaWQgMCxlLHQpfSxlLiRkb3QuY29fdmFybmFtZXM9W1xcXCJzaXplXFxcIixcXFwiY29sb3JcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiR3cml0ZT1mdW5jdGlvbihlLHQscixuKXt2YXIgYSxzLGwsaSxvLGQ9dGhpcztyZXR1cm4gcHVzaFVuZG8odGhpcyksZSs9XFxcIlxcXCIsbiYmbi5jb25zdHJ1Y3Rvcj09PUFycmF5JiYocz1cXFwic3RyaW5nXFxcIj09dHlwZW9mIG5bMF0/blswXTpcXFwiQXJpYWxcXFwiLGw9KG5bMV18fFxcXCIxMnB0XFxcIikrXFxcIlxcXCIsaT1cXFwic3RyaW5nXFxcIj09dHlwZW9mIG5bMl0/blsyXTpcXFwibm9ybWFsXFxcIiwvXlxcXFxkKyQvLnRlc3QobCkmJihsKz1cXFwicHRcXFwiKSxuPVtpLGwsc10uam9pbihcXFwiIFxcXCIpKSxyfHwocj1cXFwibGVmdFxcXCIpLGE9dGhpcy5hZGRVcGRhdGUoZHJhd1RleHQsITAsdm9pZCAwLGUscixuKSx0JiYoXFxcImxlZnRcXFwiPT09cnx8XFxcImNlbnRlclxcXCI9PT1yKSYmKG89bWVhc3VyZVRleHQoZSxuKSxcXFwiY2VudGVyXFxcIj09PXImJihvLz0yKSxhPWEudGhlbihmdW5jdGlvbigpe3ZhciBlPWQuZ2V0U3RhdGUoKTtyZXR1cm4gZC50cmFuc2xhdGUoZS54LGUueSxvLDAsITApfSkpLGF9LGUuJHdyaXRlLmNvX3Zhcm5hbWVzPVtcXFwibWVzc2FnZVxcXCIsXFxcIm1vdmVcXFwiLFxcXCJhbGlnblxcXCIsXFxcImZvbnRcXFwiXSxlLiR3cml0ZS5taW5BcmdzPTEsZS4kcGVuc2l6ZT1lLiR3aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9zaXplOih0aGlzLl9zaXplPWUsdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtzaXplOmV9KSl9LGUuJHBlbnNpemUubWluQXJncz1lLiR3aWR0aC5taW5BcmdzPTAsZS4kcGVuc2l6ZS5jb192YXJuYW1lcz1lLiR3aWR0aC5jb192YXJuYW1lcz1bXFxcIndpZHRoXFxcIl0sZS4kc2hvd3R1cnRsZT1lLiRzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93bj0hMCx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITAse3Nob3duOiEwfSl9LGUuJGhpZGV0dXJ0bGU9ZS4kaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd249ITEsdGhpcy5hZGRVcGRhdGUodm9pZCAwLCEwLHtzaG93bjohMX0pfSxlLiRpc3Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd259LGUuJHNoYXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZ2W2VdPyh0aGlzLl9zaGFwZT1lLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7c2hhcGU6ZX0pKTp0aGlzLl9zaGFwZX0sZS4kc2hhcGUubWluQXJncz0wLGUuJHNoYXBlLmNvX3Zhcm5hbWVzPVtcXFwibmFtZVxcXCJdLGUuJGNvbG9ybW9kZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9jb2xvck1vZGU6KHRoaXMuX2NvbG9yTW9kZT0yNTU9PT1lPzI1NToxLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7Y29sb3JNb2RlOnRoaXMuX2NvbG9yTW9kZX0pKX0sZS4kY29sb3Jtb2RlLm1pbkFyZ3M9MCxlLiRjb2xvcm1vZGUuY29fdmFybmFtZXM9W1xcXCJjbW9kZVxcXCJdLGUuJGNvbG9ybW9kZS5yZXR1cm5UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiAyNTU9PT1lP25ldyBTay5idWlsdGluLmludF8oMjU1KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMSl9LGUuJHdpbmRvd193aWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JlZW4uJHdpbmRvd193aWR0aCgpfSxlLiR3aW5kb3dfaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kd2luZG93X2hlaWdodCgpfSxlLiR0cmFjZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR0cmFjZXIoZSx0KX0sZS4kdHJhY2VyLm1pbkFyZ3M9MCxlLiR0cmFjZXIuY29fdmFybmFtZXM9W1xcXCJuXFxcIixcXFwiZGVsYXlcXFwiXSxlLiR1cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR1cGRhdGUoKX0sZS4kZGVsYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kZGVsYXkoZSl9LGUuJGRlbGF5Lm1pbkFyZ3M9MCxlLiRkZWxheS5jb192YXJuYW1lcz1bXFxcImRlbGF5XFxcIl0sZS4kcmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXNldCgpLHRoaXMuJGNsZWFyKCl9LGUuJG1haW5sb29wPWUuJGRvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiRtYWlubG9vcCgpfSxlLiRjbGVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZFVwZGF0ZShmdW5jdGlvbigpe2NsZWFyTGF5ZXIodGhpcy5jb250ZXh0KCkpfSwhMCl9LGUuJGRvdC5taW5BcmdzPTAsZS4kb25jbGljaz1mdW5jdGlvbihlLHQscil7dGhpcy5nZXRNYW5hZ2VyKFxcXCJtb3VzZWRvd25cXFwiKS5hZGRIYW5kbGVyKGUscil9LGUuJG9uY2xpY2subWluQXJncz0xLGUuJG9uY2xpY2suY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXSxlLiRvbnJlbGVhc2U9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2V1cFxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25yZWxlYXNlLm1pbkFyZ3M9MSxlLiRvbnJlbGVhc2UuY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXSxlLiRvbmRyYWc9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2Vtb3ZlXFxcIikuYWRkSGFuZGxlcihlLHIpfSxlLiRvbmRyYWcubWluQXJncz0xLGUuJG9uZHJhZy5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJGdldHNjcmVlbj1mdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoeS5TY3JlZW4pfSxlLiRnZXRzY3JlZW4uaXNTaz0hMCxlLiRjbG9uZT1mdW5jdGlvbigpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh5LlR1cnRsZSk7cmV0dXJuIGUuaW5zdGFuY2UuX3g9dGhpcy5feCxlLmluc3RhbmNlLl95PXRoaXMuX3ksZS5pbnN0YW5jZS5fYW5nbGU9dGhpcy5fYW5nbGUsZS5pbnN0YW5jZS5fcmFkaWFucz10aGlzLl9yYWRpYW5zLGUuaW5zdGFuY2UuX3NoYXBlPXRoaXMuX3NoYXBlLGUuaW5zdGFuY2UuX2NvbG9yPXRoaXMuX2NvbG9yLGUuaW5zdGFuY2UuX2ZpbGw9dGhpcy5fZmlsbCxlLmluc3RhbmNlLl9maWxsaW5nPXRoaXMuX2ZpbGxpbmcsZS5pbnN0YW5jZS5fc2l6ZT10aGlzLl9zaXplLGUuaW5zdGFuY2UuX2NvbXB1dGVkX3NwZWVkPXRoaXMuX2NvbXB1dGVkX3NwZWVkLGUuaW5zdGFuY2UuX2Rvd249dGhpcy5fZG93bixlLmluc3RhbmNlLl9zaG93bj10aGlzLl9zaG93bixlLmluc3RhbmNlLl9jb2xvck1vZGU9dGhpcy5fY29sb3JNb2RlLGUuaW5zdGFuY2UuX2lzUmFkaWFucz10aGlzLl9pc1JhZGlhbnMsZS5pbnN0YW5jZS5fZnVsbENpcmNsZT10aGlzLl9mdWxsQ2lyY2xlLGUuaW5zdGFuY2UuX2J1ZmZlclNpemU9dGhpcy5fYnVmZmVyU2l6ZSxlLmluc3RhbmNlLl91bmRvQnVmZmVyPXRoaXMuX3VuZG9CdWZmZXIsZS5fY2xvbmVkRnJvbT10aGlzLGV9LGUuJGNsb25lLnJldHVyblR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGUuJGdldHR1cnRsZT1lLiRnZXRwZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5za0luc3RhbmNlfSxlLiRnZXR0dXJ0bGUuaXNTaz0hMH0oVHVydGxlLnByb3RvdHlwZSksZnVuY3Rpb24oZSl7ZS5zcHJpdGVMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcHJpdGVzfHwodGhpcy5fc3ByaXRlcz1jcmVhdGVMYXllcigzKSl9LGUuYmdMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNrZ3JvdW5kfHwodGhpcy5fYmFja2dyb3VuZD1jcmVhdGVMYXllcigxKSl9LGUuaGl0VGVzdExheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hpdFRlc3R8fCh0aGlzLl9oaXRUZXN0PWNyZWF0ZUxheWVyKDAsITApKX0sZS5nZXRNYW5hZ2VyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9tYW5hZ2Vyc1tlXXx8KHRoaXMuX21hbmFnZXJzW2VdPW5ldyBFdmVudE1hbmFnZXIoZSx0aGlzKSksdGhpcy5fbWFuYWdlcnNbZV19LGUucmVzZXQ9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5fa2V5TGlzdGVuZXJzPXZvaWQgMCx0aGlzLl9rZXlMb2dnZXIpd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fa2V5TG9nZ2VyW2VdKSx3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2tleUxvZ2dlcltlXSksZGVsZXRlIHRoaXMuX2tleUxvZ2dlcltlXTtmb3IoZSBpbiB0aGlzLl9rZXlEb3duTGlzdGVuZXImJihnZXRUYXJnZXQoKS5yZW1vdmVFdmVudExpc3RlbmVyKFxcXCJrZXlkb3duXFxcIix0aGlzLl9rZXlEb3duTGlzdGVuZXIpLHRoaXMuX2tleURvd25MaXN0ZW5lcj12b2lkIDApLHRoaXMuX2tleVVwTGlzdGVuZXImJihnZXRUYXJnZXQoKS5yZW1vdmVFdmVudExpc3RlbmVyKFxcXCJrZXl1cFxcXCIsdGhpcy5fa2V5VXBMaXN0ZW5lciksdGhpcy5fa2V5VXBMaXN0ZW5lcj12b2lkIDApLHRoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9dm9pZCAwKSx0aGlzLl9tYW5hZ2Vycyl0aGlzLl9tYW5hZ2Vyc1tlXS5yZXNldCgpO3RoaXMuX21vZGU9XFxcInN0YW5kYXJkXFxcIixyZW1vdmVMYXllcih0aGlzLl9zcHJpdGVzKSx0aGlzLl9zcHJpdGVzPXZvaWQgMCxyZW1vdmVMYXllcih0aGlzLl9iYWNrZ3JvdW5kKSx0aGlzLl9iYWNrZ3JvdW5kPXZvaWQgMH0sZS5zZXRVcFdvcmxkPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBsPXRoaXM7bC5sbHg9ZSxsLmxseT10LGwudXJ4PXIsbC51cnk9bixsLnhTY2FsZT0oci1lKS9nZXRXaWR0aCgpLGwueVNjYWxlPS0xKihuLXQpL2dldEhlaWdodCgpLGwubGluZVNjYWxlPWEocyhsLnhTY2FsZSkscyhsLnlTY2FsZSkpfSxlLiRzZXR1cD1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gaXNOYU4ocGFyc2VGbG9hdChlKSkmJihlPWdldFdpZHRoKCkpLGlzTmFOKHBhcnNlRmxvYXQodCkpJiYodD1nZXRIZWlnaHQoKSksMT49ZSYmKGU9Z2V0V2lkdGgoKSplKSwxPj10JiYodD1nZXRIZWlnaHQoKSp0KSx0aGlzLl93aWR0aD1lLHRoaXMuX2hlaWdodD10LHRoaXMuX3hPZmZzZXQ9dm9pZCAwPT09cnx8aXNOYU4ocGFyc2VJbnQocikpPzA6cGFyc2VJbnQociksdGhpcy5feU9mZnNldD12b2lkIDA9PT1ufHxpc05hTihwYXJzZUludChuKSk/MDpwYXJzZUludChuKSxcXFwid29ybGRcXFwiPT09dGhpcy5fbW9kZT90aGlzLl9zZXR3b3JsZGNvb3JkaW5hdGVzKHRoaXMubGx4LHRoaXMubGx5LHRoaXMudXJ4LHRoaXMudXJ5KTp0aGlzLl9zZXR3b3JsZGNvb3JkaW5hdGVzKC1lLzIsLXQvMixlLzIsdC8yKX0sZS4kc2V0dXAubWluQXJncz0wLGUuJHNldHVwLmNvX3Zhcm5hbWVzPVtcXFwid2lkdGhcXFwiLFxcXCJoZWlnaHRcXFwiLFxcXCJzdGFydHhcXFwiLFxcXCJzdGFydHlcXFwiXSxlLiRyZWdpc3Rlcl9zaGFwZT1lLiRhZGRzaGFwZT1mdW5jdGlvbihlLHQpe3JldHVybiB0P3ZvaWQodltlXT10KTpnZXRBc3NldChlKS50aGVuKGZ1bmN0aW9uKHQpe3ZbZV09dH0pfSxlLiRyZWdpc3Rlcl9zaGFwZS5taW5BcmdzPTEsZS4kZ2V0c2hhcGVzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHYpfSxlLiR0cmFjZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwIT09ZXx8dm9pZCAwIT09dD8oXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYodGhpcy5fZGVsYXk9dCxnZXRGcmFtZU1hbmFnZXIoKS5yZWZyZXNoSW50ZXJ2YWwodCkpLFxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT8odGhpcy5fZnJhbWVzPWUsZ2V0RnJhbWVNYW5hZ2VyKCkuZnJhbWVCdWZmZXIoZSkpOnZvaWQgMCk6dGhpcy5fZnJhbWVzfSxlLiR0cmFjZXIuY29fdmFybmFtZXM9W1xcXCJmcmFtZXNcXFwiLFxcXCJkZWxheVxcXCJdLGUuJHRyYWNlci5taW5BcmdzPTAsZS4kZGVsYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dm9pZCAwPT09dGhpcy5fZGVsYXk/Yjp0aGlzLl9kZWxheTp0aGlzLiR0cmFjZXIodm9pZCAwLGUpfSxlLiRkZWxheS5jb192YXJuYW1lcz1bXFxcImRlbGF5XFxcIl0sZS5fc2V0d29ybGRjb29yZGluYXRlcz1mdW5jdGlvbihlLHQscixuKXt2YXIgYT10aGlzLHM9Z2V0RnJhbWVNYW5hZ2VyKCkudHVydGxlcygpO3JldHVybiB0aGlzLnNldFVwV29ybGQoZSx0LHIsbiksdGhpcy5fc3ByaXRlcyYmYXBwbHlXb3JsZCh0aGlzLHRoaXMuX3Nwcml0ZXMpLHRoaXMuX2JhY2tncm91bmQmJmFwcGx5V29ybGQodGhpcyx0aGlzLl9iYWNrZ3JvdW5kKSx0aGlzLiRjbGVhcigpfSxlLiRzZXR3b3JsZGNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB0aGlzLl9tb2RlPVxcXCJ3b3JsZFxcXCIsdGhpcy5fc2V0d29ybGRjb29yZGluYXRlcyhlLHQscixuKX0sZS4kc2V0d29ybGRjb29yZGluYXRlcy5jb192YXJuYW1lcz1bXFxcImxseFxcXCIsXFxcImxseVxcXCIsXFxcInVyeFxcXCIsXFxcInVyeVxcXCJdLGUubWluQXJncz00LGUuJGNsZWFyPWUuJGNsZWFyc2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzZXQoKSx0aGlzLiRyZXNldCgpfSxlLiR1cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkudXBkYXRlKCl9LGUuJHJlc2V0PWUuJHJlc2V0c2NyZWVuPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWdldEZyYW1lTWFuYWdlcigpLnR1cnRsZXMoKTtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkuYWRkRnJhbWUoZnVuY3Rpb24oKXthcHBseVdvcmxkKGUsZS5fc3ByaXRlcyksYXBwbHlXb3JsZChlLGUuX2JhY2tncm91bmQpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXRbcl0ucmVzZXQoKSxhcHBseVdvcmxkKGUsdFtyXS5fcGFwZXIpfSwhMCl9LGUuJHdpbmRvd193aWR0aD1mdW5jdGlvbigpe3JldHVybiBnZXRXaWR0aCgpfSxlLiR3aW5kb3dfaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIGdldEhlaWdodCgpfSxlLiRkZWxheS5taW5BcmdzPTAsZS4kdHVydGxlcz1mdW5jdGlvbigpe3JldHVybiBnZXRGcmFtZU1hbmFnZXIoKS50dXJ0bGVzKCl9LGUuJHR1cnRsZXMucmV0dXJuVHlwZT14LlRVUlRMRV9MSVNULGUuJGJncGljPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBlPyh0PXRoaXMsZ2V0QXNzZXQoZSkudGhlbihmdW5jdGlvbihlKXtjbGVhckxheWVyKHQuYmdMYXllcigpLHZvaWQgMCxlKX0pKTp0aGlzLl9iZ3BpY30sZS4kYmdwaWMubWluQXJncz0wLGUuJGJncGljLmNvX3Zhcm5hbWVzPVtcXFwibmFtZVxcXCJdLGUuJGJnY29sb3I9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHZvaWQgMD09PWU/aGV4VG9SR0IodGhpcy5fYmdjb2xvcik6KHRoaXMuX2JnY29sb3I9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLGUsdCxyLG4pLHZvaWQgY2xlYXJMYXllcih0aGlzLmJnTGF5ZXIoKSx0aGlzLl9iZ2NvbG9yKSl9LGUuJGJnY29sb3IubWluQXJncz0wLGUuJGJnY29sb3IuY29fdmFybmFtZXM9W1xcXCJjb2xvclxcXCIsXFxcImdcXFwiLFxcXCJiXFxcIixcXFwiYVxcXCJdLGUuJGJnY29sb3IucmV0dXJuVHlwZT14LkNPTE9SLGUuJG1haW5sb29wPWUuJGRvbmU9ZnVuY3Rpb24oKXt9LGUuJGJ5ZT1mdW5jdGlvbigpe3JldHVybiBTay5UdXJ0bGVHcmFwaGljcy5yZXNldCgpfSxlLiRleGl0b25jbGljaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9leGl0T25DbGljaz0hMCx0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZnVuY3Rpb24oKXtyZXNldFR1cnRsZSgpfSwhMSl9LGUuJG9uY2xpY2s9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuX2V4aXRPbkNsaWNrfHx0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25jbGljay5taW5BcmdzPTEsZS4kb25jbGljay5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdO3ZhciB0PXs4Oi9eYmFjayhzcGFjZSk/JC9pLDk6L150YWIkL2ksMTM6L14oZW50ZXJ8cmV0dXJuKSQvaSwxNjovXnNoaWZ0JC9pLDE3Oi9eKGN0cmx8Y29udHJvbCkkL2ksMTg6L15hbHQkL2ksMjc6L15lc2MoYXBlKT8kL2ksMzI6L15zcGFjZSQvaSwzMzovXnBhZ2VbXFxcXHNcXFxcLV0/dXAkL2ksMzQ6L15wYWdlW1xcXFxzXFxcXC1dP2Rvd24kL2ksMzU6L15lbmQkL2ksMzY6L15ob21lJC9pLDM3Oi9ebGVmdChbXFxcXHNcXFxcLV0/YXJyb3cpPyQvaSwzODovXnVwKFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDM5Oi9ecmlnaHQoW1xcXFxzXFxcXC1dP2Fycm93KT8kL2ksNDA6L15kb3duKFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDQ1Oi9eaW5zZXJ0JC9pLDQ2Oi9eZGVsKGV0ZSk/JC9pfTtlLl9jcmVhdGVLZXlSZXBlYXRlcj1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXM7ci5fa2V5TG9nZ2VyW3RdPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5fa2V5TGlzdGVuZXJzW2VdKCksci5fa2V5TG9nZ2VyW3RdPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3IuX2tleUxpc3RlbmVyc1tlXSgpfSw1MCl9LDMzMyl9LGUuX2NyZWF0ZUtleURvd25MaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciByPXRoaXM7dGhpcy5fa2V5RG93bkxpc3RlbmVyfHwodGhpcy5fa2V5RG93bkxpc3RlbmVyPWZ1bmN0aW9uKG4pe3ZhciBlPVN0cmluZy5mcm9tQ2hhckNvZGU7aWYoZm9jdXNUdXJ0bGUoKSl7dmFyIGEscyxsPW4uY2hhckNvZGV8fG4ua2V5Q29kZSxpPWUobCkudG9Mb3dlckNhc2UoKTtpZighci5fa2V5TG9nZ2VyW2xdKWZvcihhIGluIHIuX2tleUxpc3RlbmVycylpZihzPTE8YS5sZW5ndGgmJnRbbF0mJnRbbF0udGVzdChhKSxhPT09aXx8cyl7ci5fa2V5TGlzdGVuZXJzW2FdKCksci5fY3JlYXRlS2V5UmVwZWF0ZXIoYSxsKSxuLnByZXZlbnREZWZhdWx0KCk7YnJlYWt9fX0sZ2V0VGFyZ2V0KCkuYWRkRXZlbnRMaXN0ZW5lcihcXFwia2V5ZG93blxcXCIsdGhpcy5fa2V5RG93bkxpc3RlbmVyKSl9LGUuX2NyZWF0ZUtleVVwTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2tleVVwTGlzdGVuZXJ8fCh0aGlzLl9rZXlVcExpc3RlbmVyPWZ1bmN0aW9uKHIpe3ZhciBlPXQuX2tleUxvZ2dlcltyLmNoYXJDb2RlfHxyLmtleUNvZGVdO3ZvaWQgMCE9PWUmJihyLnByZXZlbnREZWZhdWx0KCksd2luZG93LmNsZWFySW50ZXJ2YWwoZSksd2luZG93LmNsZWFyVGltZW91dChlKSxkZWxldGUgdC5fa2V5TG9nZ2VyW3IuY2hhckNvZGV8fHIua2V5Q29kZV0pfSxnZXRUYXJnZXQoKS5hZGRFdmVudExpc3RlbmVyKFxcXCJrZXl1cFxcXCIsdGhpcy5fa2V5VXBMaXN0ZW5lcikpfSxlLiRsaXN0ZW49ZnVuY3Rpb24oKXt0aGlzLl9jcmVhdGVLZXlVcExpc3RlbmVyKCksdGhpcy5fY3JlYXRlS2V5RG93bkxpc3RlbmVyKCl9LGUuJG9ua2V5PWZ1bmN0aW9uKGUsdCl7aWYoXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHQpe3ZhciByPWU7ZT10LHQ9cn10PSh0K1xcXCJcXFwiKS50b0xvd2VyQ2FzZSgpLGUmJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlPyghdGhpcy5fa2V5TGlzdGVuZXJzJiYodGhpcy5fa2V5TGlzdGVuZXJzPXt9KSx0aGlzLl9rZXlMaXN0ZW5lcnNbdF09ZSk6ZGVsZXRlIHRoaXMuX2tleUxpc3RlbmVyc1t0XX0sZS4kb25rZXkubWluQXJncz0yLGUuJG9ua2V5LmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwia2V5VmFsdWVcXFwiXSxlLiRvbnNjcmVlbmNsaWNrPWZ1bmN0aW9uKGUsdCxyKXt0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25zY3JlZW5jbGljay5taW5BcmdzPTEsZS4kb25zY3JlZW5jbGljay5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJG9udGltZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPXZvaWQgMCksZSYmXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYodGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQoZSxyKDAsMHx0KSkpfSxlLiRvbnRpbWVyLm1pbkFyZ3M9MCxlLiRvbnRpbWVyLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiaW50ZXJ2YWxcXFwiXX0oU2NyZWVuLnByb3RvdHlwZSk7dmFyIEw9bmV3IEltYWdlLFM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIikuZ2V0Q29udGV4dChcXFwiMmRcXFwiKTtmb3IodmFyIEMgaW4gaW5pdFR1cnRsZS5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzaGFwZVxcXCJdLGluaXRUdXJ0bGUuY29fbmFtZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIlR1cnRsZVxcXCIpLGluaXRUdXJ0bGUuY29fYXJnY291bnQ9Mixpbml0VHVydGxlLiRkZWZhdWx0cz1bU2suYnVpbHRpbi5ub25lLm5vbmUkLG5ldyBTay5idWlsdGluLnN0cihcXFwiY2xhc3NpY1xcXCIpXSxUdXJ0bGUucHJvdG90eXBlKS9eXFxcXCRbYS16X10rLy50ZXN0KEMpJiZhZGRNb2R1bGVNZXRob2QoVHVydGxlLHksQyxlbnN1cmVBbm9ueW1vdXMpO3JldHVybiBhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiRtYWlubG9vcFxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiRkb25lXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJGJ5ZVxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR0cmFjZXJcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkdXBkYXRlXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJGRlbGF5XFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJHdpbmRvd193aWR0aFxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR3aW5kb3dfaGVpZ2h0XFxcIixnZXRTY3JlZW4pLHkuVHVydGxlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoeSxmdW5jdGlvbiBUdXJ0bGVXcmFwcGVyKGUsdCl7Zm9yKHZhciByIGluIHQuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhpbml0VHVydGxlKSxUdXJ0bGUucHJvdG90eXBlKS9eXFxcXCRbYS16X10rLy50ZXN0KHIpJiZhZGRNb2R1bGVNZXRob2QoVHVydGxlLHQscil9LFxcXCJUdXJ0bGVcXFwiLFtdKSx5LlNjcmVlbj1Tay5taXNjZXZhbC5idWlsZENsYXNzKHksZnVuY3Rpb24gU2NyZWVuV3JhcHBlcihlLHQpe2Zvcih2YXIgciBpbiB0Ll9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSl7ZS5pbnN0YW5jZT1nZXRTY3JlZW4oKX0pLFNjcmVlbi5wcm90b3R5cGUpL15cXFxcJFthLXpfXSsvLnRlc3QocikmJmFkZE1vZHVsZU1ldGhvZChTY3JlZW4sdCxyKX0sXFxcIlNjcmVlblxcXCIsW10pLHtza01vZHVsZTp5LHJlc2V0OnJlc2V0VHVydGxlLHN0b3A6c3RvcFR1cnRsZSxmb2N1czpmb2N1c1R1cnRsZSxUdXJ0bGU6VHVydGxlLFNjcmVlbjpTY3JlZW59fShlKSxTay5UdXJ0bGVHcmFwaGljcy5tb2R1bGU9ZS50dXJ0bGVJbnN0YW5jZS5za01vZHVsZSxTay5UdXJ0bGVHcmFwaGljcy5yZXNldD1lLnR1cnRsZUluc3RhbmNlLnJlc2V0LFNrLlR1cnRsZUdyYXBoaWNzLnN0b3A9ZS50dXJ0bGVJbnN0YW5jZS5zdG9wLFNrLlR1cnRsZUdyYXBoaWNzLmZvY3VzPWUudHVydGxlSW5zdGFuY2UuZm9jdXMsU2suVHVydGxlR3JhcGhpY3MucmF3PXtUdXJ0bGU6ZS50dXJ0bGVJbnN0YW5jZS5UdXJ0bGUsU2NyZWVuOmUudHVydGxlSW5zdGFuY2UuU2NyZWVufSxlLnR1cnRsZUluc3RhbmNlLnNrTW9kdWxlfTtcIixcInNyYy9saWIvdHlwZXMucHlcIjpcIlxcXCJcXFwiXFxcIlxcblRoaXMgZmlsZSB3YXMgbW9kaWZpZWQgZnJvbSBDUHl0aG9uLlxcbkNvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCxcXG4yMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBBbGwgUmlnaHRzIFJlc2VydmVkXFxuXFxcIlxcXCJcXFwiXFxuXFxcIlxcXCJcXFwiRGVmaW5lIG5hbWVzIGZvciBhbGwgdHlwZSBzeW1ib2xzIGtub3duIGluIHRoZSBzdGFuZGFyZCBpbnRlcnByZXRlci5cXG5UeXBlcyB0aGF0IGFyZSBwYXJ0IG9mIG9wdGlvbmFsIG1vZHVsZXMgKGUuZy4gYXJyYXkpIGFyZSBub3QgbGlzdGVkLlxcblxcXCJcXFwiXFxcIlxcbmltcG9ydCBzeXNcXG5cXG4jIEl0ZXJhdG9ycyBpbiBQeXRob24gYXJlbid0IGEgbWF0dGVyIG9mIHR5cGUgYnV0IG9mIHByb3RvY29sLiAgQSBsYXJnZVxcbiMgYW5kIGNoYW5naW5nIG51bWJlciBvZiBidWlsdGluIHR5cGVzIGltcGxlbWVudCAqc29tZSogZmxhdm9yIG9mXFxuIyBpdGVyYXRvci4gIERvbid0IGNoZWNrIHRoZSB0eXBlISAgVXNlIGhhc2F0dHIgdG8gY2hlY2sgZm9yIGJvdGhcXG4jIFxcXCJfX2l0ZXJfX1xcXCIgYW5kIFxcXCJuZXh0XFxcIiBhdHRyaWJ1dGVzIGluc3RlYWQuXFxuTWFwcGluZ1Byb3h5VHlwZSA9IHR5cGUodHlwZS5fX2RpY3RfXylcXG5XcmFwcGVyRGVzY3JpcHRvclR5cGUgPSB0eXBlKG9iamVjdC5fX2luaXRfXylcXG5NZXRob2RXcmFwcGVyVHlwZSA9IHR5cGUob2JqZWN0KCkuX19zdHJfXylcXG5NZXRob2REZXNjcmlwdG9yVHlwZSA9IHR5cGUoc3RyLmpvaW4pXFxuQ2xhc3NNZXRob2REZXNjcmlwdG9yVHlwZSA9IHR5cGUoZGljdC5fX2RpY3RfX1snZnJvbWtleXMnXSlcXG5cXG5Ob25lVHlwZSA9IHR5cGUoTm9uZSlcXG5UeXBlVHlwZSA9IHR5cGVcXG5PYmplY3RUeXBlID0gb2JqZWN0XFxuSW50VHlwZSA9IGludFxcbnRyeTpcXG4gICAgTG9uZ1R5cGUgPSBsb25nXFxuZXhjZXB0OiBwYXNzXFxuRmxvYXRUeXBlID0gZmxvYXRcXG5Cb29sZWFuVHlwZSA9IGJvb2xcXG50cnk6XFxuICAgIENvbXBsZXhUeXBlID0gY29tcGxleFxcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIHBhc3NcXG5TdHJpbmdUeXBlID0gc3RyXFxuXFxuIyBTdHJpbmdUeXBlcyBpcyBhbHJlYWR5IG91dGRhdGVkLiAgSW5zdGVhZCBvZiB3cml0aW5nIFxcXCJ0eXBlKHgpIGluXFxuIyB0eXBlcy5TdHJpbmdUeXBlc1xcXCIsIHlvdSBzaG91bGQgdXNlIFxcXCJpc2luc3RhbmNlKHgsIGJhc2VzdHJpbmcpXFxcIi4gIEJ1dFxcbiMgd2Uga2VlcCBhcm91bmQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi4yLlxcbnRyeTpcXG4gICAgVW5pY29kZVR5cGUgPSB1bmljb2RlXFxuICAgIFN0cmluZ1R5cGVzID0gKFN0cmluZ1R5cGUsIFVuaWNvZGVUeXBlKVxcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIFN0cmluZ1R5cGVzID0gKFN0cmluZ1R5cGUsKVxcblxcbkJ1ZmZlclR5cGUgPSBidWZmZXJcXG5cXG5UdXBsZVR5cGUgPSB0dXBsZVxcbkxpc3RUeXBlID0gbGlzdFxcbkRpY3RUeXBlID0gRGljdGlvbmFyeVR5cGUgPSBkaWN0XFxuXFxuZGVmIF9mKCk6IHBhc3NcXG5GdW5jdGlvblR5cGUgPSB0eXBlKF9mKVxcbkxhbWJkYVR5cGUgPSB0eXBlKGxhbWJkYTogTm9uZSkgICAgICAgICAjIFNhbWUgYXMgRnVuY3Rpb25UeXBlXFxuI0NvZGVUeXBlID0gdHlwZShfZi5mdW5jX2NvZGUpXFxuXFxuZGVmIF9nKCk6XFxuICAgIHlpZWxkIDFcXG5HZW5lcmF0b3JUeXBlID0gdHlwZShfZygpKVxcblxcbmNsYXNzIF9DOlxcbiAgICBkZWYgX20oc2VsZik6IHBhc3NcXG5DbGFzc1R5cGUgPSB0eXBlKF9DKVxcblVuYm91bmRNZXRob2RUeXBlID0gdHlwZShfQy5fbSkgICAgICAgICAjIFNhbWUgYXMgTWV0aG9kVHlwZVxcbl94ID0gX0MoKVxcbkluc3RhbmNlVHlwZSA9IHR5cGUoX3gpXFxuTWV0aG9kVHlwZSA9IHR5cGUoX3guX20pXFxuQnVpbHRpbkZ1bmN0aW9uVHlwZSA9IHR5cGUobGVuKVxcbkJ1aWx0aW5NZXRob2RUeXBlID0gdHlwZShbXS5hcHBlbmQpICAgICAjIFNhbWUgYXMgQnVpbHRpbkZ1bmN0aW9uVHlwZVxcblxcbk1vZHVsZVR5cGUgPSB0eXBlKHN5cylcXG5GaWxlVHlwZSA9IGZpbGVcXG50cnk6XFxuICAgIFhSYW5nZVR5cGUgPSB4cmFuZ2VcXG5leGNlcHQgTmFtZUVycm9yOlxcbiAgICBwYXNzXFxuXFxuIyB0cnk6XFxuIyAgICAgcmFpc2UgVHlwZUVycm9yXFxuIyBleGNlcHQgVHlwZUVycm9yOlxcbiMgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbMl1cXG4jICAgICBUcmFjZWJhY2tUeXBlID0gdHlwZSh0YilcXG4jICAgICBGcmFtZVR5cGUgPSB0eXBlKHRiLnRiX2ZyYW1lKVxcbiMgICAgIGRlbCB0YlxcblxcblNsaWNlVHlwZSA9IHNsaWNlXFxuIyBFbGxpcHNpc1R5cGUgPSB0eXBlKEVsbGlwc2lzKVxcblxcbiMgRGljdFByb3h5VHlwZSA9IHR5cGUoVHlwZVR5cGUuX19kaWN0X18pXFxuTm90SW1wbGVtZW50ZWRUeXBlID0gdHlwZShOb3RJbXBsZW1lbnRlZClcXG5cXG4jIEZvciBKeXRob24sIHRoZSBmb2xsb3dpbmcgdHdvIHR5cGVzIGFyZSBpZGVudGljYWxcXG4jIEdldFNldERlc2NyaXB0b3JUeXBlID0gdHlwZShGdW5jdGlvblR5cGUuZnVuY19jb2RlKVxcbiMgTWVtYmVyRGVzY3JpcHRvclR5cGUgPSB0eXBlKEZ1bmN0aW9uVHlwZS5mdW5jX2dsb2JhbHMpXFxuXFxuZGVsIHN5cywgX2YsIF9nLCBfQywgX3ggICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBmb3IgZXhwb3J0XFxuX19hbGxfXyA9IGxpc3QobiBmb3IgbiBpbiBnbG9iYWxzKCkgaWYgbls6MV0gIT0gJ18nKVxcblwiLFwic3JjL2xpYi91bml0dGVzdC9fX2luaXRfXy5weVwiOlwiX19hdXRob3JfXyA9ICdibWlsbGVyJ1xcbicnJ1xcblRoaXMgaXMgdGhlIHN0YXJ0IG9mIHNvbWV0aGluZyB0aGF0IGJlaGF2ZXMgbGlrZVxcbnRoZSB1bml0dGVzdCBtb2R1bGUgZnJvbSBjcHl0aG9uLlxcblxcbicnJ1xcbmltcG9ydCByZVxcblxcbmNsYXNzIF9Bc3NlcnRSYWlzZXNDb250ZXh0KG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIkEgY29udGV4dCBtYW5hZ2VyIHVzZWQgdG8gaW1wbGVtZW50IFRlc3RDYXNlLmFzc2VydFJhaXNlcyogbWV0aG9kcy5cXFwiXFxcIlxcXCJcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkLCB0ZXN0X2Nhc2UpOlxcbiAgICAgICAgc2VsZi50ZXN0X2Nhc2UgPSB0ZXN0X2Nhc2VcXG4gICAgICAgIHNlbGYuZXhwZWN0ZWQgPSBleHBlY3RlZFxcbiAgICAgICAgc2VsZi5leGNlcHRpb24gPSBOb25lXFxuXFxuICAgIGRlZiBfaXNfc3VidHlwZShzZWxmLCBleHBlY3RlZCwgYmFzZXR5cGUpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCwgdHVwbGUpOlxcbiAgICAgICAgICAgIHJldHVybiBhbGwoc2VsZi5faXNfc3VidHlwZShlLCBiYXNldHlwZSkgZm9yIGUgaW4gZXhwZWN0ZWQpXFxuICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShleHBlY3RlZCwgdHlwZSkgYW5kIGlzc3ViY2xhc3MoZXhwZWN0ZWQsIGJhc2V0eXBlKVxcblxcbiAgICBkZWYgaGFuZGxlKHNlbGYsIGFyZ3MsIGt3YXJncyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIElmIGFyZ3MgaXMgZW1wdHksIGFzc2VydFJhaXNlcyBpcyBiZWluZyB1c2VkIGFzIGFcXG4gICAgICAgIGNvbnRleHQgbWFuYWdlciwgc28gcmV0dXJuIHNlbGYuXFxuICAgICAgICBJZiBhcmdzIGlzIG5vdCBlbXB0eSwgY2FsbCBhIGNhbGxhYmxlIHBhc3NpbmcgcG9zaXRpb25hbCBhbmQga2V5d29yZFxcbiAgICAgICAgYXJndW1lbnRzLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgaWYgbm90IHNlbGYuX2lzX3N1YnR5cGUoc2VsZi5leHBlY3RlZCwgQmFzZUV4Y2VwdGlvbik6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignYXNzZXJ0UmFpc2VzKCkgYXJnIDEgbXVzdCBiZSBhbiBleGNlcHRpb24gdHlwZSBvciB0dXBsZSBvZiBleGNlcHRpb24gdHlwZXMnKVxcbiAgICAgICAgICAgIGlmIG5vdCBhcmdzOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICAgICAgICAgIGNhbGxhYmxlX29iaiA9IGFyZ3NbMF1cXG4gICAgICAgICAgICBhcmdzID0gYXJnc1sxOl1cXG4gICAgICAgICAgICB3aXRoIHNlbGY6XFxuICAgICAgICAgICAgICAgIGNhbGxhYmxlX29iaigqYXJncywgKiprd2FyZ3MpIFxcblxcbiAgICAgICAgZmluYWxseTpcXG4gICAgICAgICAgICAjIGJwby0yMzg5MDogbWFudWFsbHkgYnJlYWsgYSByZWZlcmVuY2UgY3ljbGVcXG4gICAgICAgICAgICBzZWxmID0gTm9uZVxcblxcbiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRiKTpcXG4gICAgICAgIHJlcyA9IFRydWVcXG4gICAgICAgIGZlZWRiYWNrID0gXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuZXhjZXB0aW9uID0gZXhjX3ZhbHVlXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgYWN0X2V4YyA9IGV4Y190eXBlLl9fbmFtZV9fXFxuICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuICAgICAgICAgICAgYWN0X2V4YyA9IHN0cihleGNfdHlwZSlcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBleHBfZXhjID0gc2VsZi5leHBlY3RlZC5fX25hbWVfX1xcbiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOlxcbiAgICAgICAgICAgIGV4cF9leGMgPSBzdHIoc2VsZi5leHBlY3RlZClcXG5cXG4gICAgICAgIGlmIGV4Y190eXBlIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmVzID0gRmFsc2VcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJ7fSBub3QgcmFpc2VkXFxcIi5mb3JtYXQoZXhwX2V4YylcXG4gICAgICAgIGVsaWYgbm90IGlzc3ViY2xhc3MoZXhjX3R5cGUsIHNlbGYuZXhwZWN0ZWQpOlxcbiAgICAgICAgICAgIHJlcyA9IEZhbHNlXFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQge30gYnV0IGdvdCB7fVxcXCIuZm9ybWF0KGV4cF9leGMsIGFjdF9leGMpXFxuXFxuICAgICAgICBzZWxmLnRlc3RfY2FzZS5hcHBlbmRSZXN1bHQocmVzLCBhY3RfZXhjLCBleHBfZXhjLCBmZWVkYmFjaylcXG4gICAgICAgIHJldHVybiBUcnVlXFxuXFxuXFxuY2xhc3MgVGVzdENhc2Uob2JqZWN0KTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5udW1QYXNzZWQgPSAwXFxuICAgICAgICBzZWxmLm51bUZhaWxlZCA9IDBcXG4gICAgICAgIHNlbGYuYXNzZXJ0UGFzc2VkID0gMFxcbiAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgPSAwXFxuICAgICAgICBzZWxmLnZlcmJvc2l0eSA9IDFcXG4gICAgICAgIHNlbGYudGxpc3QgPSBbXVxcbiAgICAgICAgdGVzdE5hbWVzID0ge31cXG4gICAgICAgIGZvciBuYW1lIGluIGRpcihzZWxmKTpcXG4gICAgICAgICAgICBpZiBuYW1lWzo0XSA9PSAndGVzdCcgYW5kIG5hbWUgbm90IGluIHRlc3ROYW1lczpcXG4gICAgICAgICAgICAgICAgc2VsZi50bGlzdC5hcHBlbmQoZ2V0YXR0cihzZWxmLG5hbWUpKVxcbiAgICAgICAgICAgICAgICB0ZXN0TmFtZXNbbmFtZV09VHJ1ZVxcblxcbiAgICBkZWYgc2V0VXAoc2VsZik6XFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiB0ZWFyRG93bihzZWxmKTpcXG4gICAgICAgIHBhc3NcXG4gICAgXFxuICAgIGRlZiBjbGVhbk5hbWUoc2VsZixmdW5jTmFtZSk6XFxuICAgICAgICByZXR1cm4gZnVuY05hbWUuX19mdW5jX18uX19uYW1lX19cXG5cXG4gICAgZGVmIG1haW4oc2VsZik6XFxuXFxuICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLnRsaXN0OlxcbiAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zaXR5ID4gMTpcXG4gICAgICAgICAgICAgICAgcHJpbnQoJ1J1bm5pbmcgJXMnICUgc2VsZi5jbGVhbk5hbWUoZnVuYykpXFxuICAgICAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgICAgICBzZWxmLnNldFVwKClcXG4gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRQYXNzZWQgPSAwXFxuICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkID0gMFxcbiAgICAgICAgICAgICAgICBmdW5jKClcXG4gICAgICAgICAgICAgICAgc2VsZi50ZWFyRG93bigpXFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuYXNzZXJ0RmFpbGVkID09IDA6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm51bVBhc3NlZCArPSAxXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuICAgICAgICAgICAgICAgICAgICBwcmludCgnVGVzdHMgZmFpbGVkIGluICVzICcgJSBzZWxmLmNsZWFuTmFtZShmdW5jKSlcXG4gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6XFxuICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkICs9IDFcXG4gICAgICAgICAgICAgICAgc2VsZi5udW1GYWlsZWQgKz0gMVxcbiAgICAgICAgICAgICAgICBwcmludCgnVGVzdCB0aHJldyBleGNlcHRpb24gaW4gJXMgKCVzKScgJSAoc2VsZi5jbGVhbk5hbWUoZnVuYyksIGUpKVxcbiAgICAgICAgc2VsZi5zaG93U3VtbWFyeSgpXFxuXFxuICAgIGRlZiBhc3NlcnRFcXVhbChzZWxmLCBhY3R1YWwsIGV4cGVjdGVkLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhY3R1YWw9PWV4cGVjdGVkXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBlcXVhbCAlc1xcXCIgJSAoc3RyKGFjdHVhbCksc3RyKGV4cGVjdGVkKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYWN0dWFsICxleHBlY3RlZCwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RFcXVhbChzZWxmLCBhY3R1YWwsIGV4cGVjdGVkLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhY3R1YWwgIT0gZXhwZWN0ZWRcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBlcXVhbCAlc1xcXCIgJSAoc3RyKGFjdHVhbCksc3RyKGV4cGVjdGVkKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYWN0dWFsLCBleHBlY3RlZCwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRUcnVlKHNlbGYseCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYm9vbCh4KSBpcyBUcnVlXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBUcnVlXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIFRydWUsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0RmFsc2Uoc2VsZix4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBub3QgYm9vbCh4KVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgRmFsc2VcXFwiICUgKHN0cih4KSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgeCwgRmFsc2UsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXMoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgaXMgYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgdGhlIHNhbWUgb2JqZWN0IGFzICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm90KHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIGlzIG5vdCBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgdGhlIHNhbWUgb2JqZWN0IGFzICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm9uZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IHggaXMgTm9uZVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgTm9uZVxcXCIgJSAoc3RyKHgpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCB4LCBOb25lLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm90Tm9uZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IHggaXMgbm90IE5vbmVcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBiZSBOb25lXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIE5vbmUsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SW4oc2VsZiwgYSwgYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSBpbiBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBpbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RJbihzZWxmLCBhLCBiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIG5vdCBpbiBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgaW4gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXNJbnN0YW5jZShzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gaXNpbnN0YW5jZShhLGIpXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBhbiBpbnN0YW5jZSBvZiAlc1xcXCIgJSAoc3RyKGEpLCBzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0Tm90SXNJbnN0YW5jZShzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gbm90IGlzaW5zdGFuY2UoYSxiKVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gbm90IGJlIGFuIGluc3RhbmNlIG9mICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydFJlZ2V4KHNlbGYsIHRleHQsIGV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGYWlsIHRoZSB0ZXN0IHVubGVzcyB0aGUgdGV4dCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkX3JlZ2V4LCAoc3RyLCApKTogI2J5dGVzXFxuICAgICAgICAgICAgYXNzZXJ0IGV4cGVjdGVkX3JlZ2V4LCBcXFwiZXhwZWN0ZWRfcmVnZXggbXVzdCBub3QgYmUgZW1wdHkuXFxcIlxcbiAgICAgICAgICAgIGV4cGVjdGVkX3JlZ2V4ID0gcmUuY29tcGlsZShleHBlY3RlZF9yZWdleClcXG4gICAgICAgIGlmIG5vdCBleHBlY3RlZF9yZWdleC5zZWFyY2godGV4dCk6XFxuICAgICAgICAgICAgcmVzID0gRmFsc2VcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJSZWdleCBkaWRuJ3QgbWF0Y2g6ICVyIG5vdCBmb3VuZCBpbiAlclxcXCIgJSAoXFxuICAgICAgICAgICAgICAgIHJlcHIoZXhwZWN0ZWRfcmVnZXgpLCB0ZXh0KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXMgPSBUcnVlXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHRleHQsIGV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdFJlZ2V4KHNlbGYsIHRleHQsIHVuZXhwZWN0ZWRfcmVnZXgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZhaWwgdGhlIHRlc3QgaWYgdGhlIHRleHQgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZSh1bmV4cGVjdGVkX3JlZ2V4LCAoc3RyLCApKTogIyBieXRlc1xcbiAgICAgICAgICAgIHVuZXhwZWN0ZWRfcmVnZXggPSByZS5jb21waWxlKHVuZXhwZWN0ZWRfcmVnZXgpXFxuICAgICAgICBtYXRjaCA9IHVuZXhwZWN0ZWRfcmVnZXguc2VhcmNoKHRleHQpXFxuICAgICAgICBpZiBtYXRjaDpcXG4gICAgICAgICAgICBmZWVkYmFjayA9ICdSZWdleCBtYXRjaGVkOiAlciBtYXRjaGVzICVyIGluICVyJyAlIChcXG4gICAgICAgICAgICAgICAgdGV4dFttYXRjaC5zdGFydCgpIDogbWF0Y2guZW5kKCldLFxcbiAgICAgICAgICAgICAgICByZXByKHVuZXhwZWN0ZWRfcmVnZXgpLFxcbiAgICAgICAgICAgICAgICB0ZXh0KVxcbiAgICAgICAgICAgICMgX2Zvcm1hdE1lc3NhZ2UgZW5zdXJlcyB0aGUgbG9uZ01lc3NhZ2Ugb3B0aW9uIGlzIHJlc3BlY3RlZFxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQobm90IGJvb2wobWF0Y2gpLCB0ZXh0LCB1bmV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIsIHBsYWNlcz03LCBmZWVkYmFjaz1cXFwiXFxcIiwgZGVsdGE9Tm9uZSk6XFxuXFxuICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICByZXMgPSBhYnMoYS1iKSA8PSBkZWx0YVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBwbGFjZXMgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgcGxhY2VzID0gN1xcbiAgICAgICAgICAgIHJlcyA9IHJvdW5kKGEtYiwgcGxhY2VzKSA9PSAwXFxuICAgICAgICBcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGVxdWFsICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIsIHBsYWNlcz03LCBmZWVkYmFjaz1cXFwiXFxcIiwgZGVsdGE9Tm9uZSk6XFxuXFxuICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICByZXMgPSBub3QgKGEgPT0gYikgYW5kIGFicyhhIC0gYikgPiBkZWx0YVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBwbGFjZXMgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgcGxhY2VzID0gN1xcblxcbiAgICAgICAgICAgIHJlcyA9IHJvdW5kKGEtYiwgcGxhY2VzKSAhPSAwXFxuXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgZXF1YWwgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0R3JlYXRlcihzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA+IGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIGdyZWF0ZXIgdGhhbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRHcmVhdGVyRXF1YWwoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgPj0gYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgPj0gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0TGVzcyhzZWxmLCBhLCBiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIDwgYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgbGVzcyB0aGFuICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydExlc3NFcXVhbChzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA8PSBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSA8PSAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhcHBlbmRSZXN1bHQoc2VsZixyZXMsYWN0dWFsLGV4cGVjdGVkLGZlZWRiYWNrKTpcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICBtc2cgPSAnUGFzcydcXG4gICAgICAgICAgICBzZWxmLmFzc2VydFBhc3NlZCArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG1zZyA9ICdGYWlsOiAnICsgIGZlZWRiYWNrXFxuICAgICAgICAgICAgcHJpbnQobXNnKVxcbiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkICs9IDFcXG5cXG4gICAgZGVmIGFzc2VydFJhaXNlcyhzZWxmLCBleHBlY3RlZF9leGNlcHRpb24sICphcmdzLCAqKmt3YXJncyk6XFxuICAgICAgICBjb250ZXh0ID0gX0Fzc2VydFJhaXNlc0NvbnRleHQoZXhwZWN0ZWRfZXhjZXB0aW9uLCBzZWxmKVxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmhhbmRsZShhcmdzLCBrd2FyZ3MpXFxuICAgICAgICBmaW5hbGx5OlxcbiAgICAgICAgICAgICMgYnBvLTIzODkwOiBtYW51YWxseSBicmVhayBhIHJlZmVyZW5jZSBjeWNsZVxcbiAgICAgICAgICAgIGNvbnRleHQgPSBOb25lXFxuXFxuICAgIGRlZiBmYWlsKHNlbGYsIG1zZz1Ob25lKTpcXG4gICAgICAgIGlmIG1zZyBpcyBOb25lOlxcbiAgICAgICAgICAgIG1zZyA9ICdGYWlsJ1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBtc2cgPSAnRmFpbDogJyArIG1zZ1xcbiAgICAgICAgcHJpbnQobXNnKVxcbiAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgKz0gMVxcblxcbiAgICBkZWYgc2hvd1N1bW1hcnkoc2VsZik6XFxuICAgICAgICBwY3QgPSBzZWxmLm51bVBhc3NlZCAvIChzZWxmLm51bVBhc3NlZCtzZWxmLm51bUZhaWxlZCkgKiAxMDBcXG4gICAgICAgIHByaW50KFxcXCJSYW4gJWQgdGVzdHMsIHBhc3NlZDogJWQgZmFpbGVkOiAlZFxcXFxuXFxcIiAlIChzZWxmLm51bVBhc3NlZCtzZWxmLm51bUZhaWxlZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubnVtUGFzc2VkLCBzZWxmLm51bUZhaWxlZCkpXFxuXFxuXFxuXFxuZGVmIG1haW4odmVyYm9zaXR5PTEpOlxcbiAgICBnbG9iID0gZ2xvYmFscygpICMgZ2xvYmFscygpIHN0aWxsIG5lZWRzIHdvcmtcXG4gICAgZm9yIG5hbWUgaW4gZ2xvYjpcXG4gICAgICAgIGlmIHR5cGUoZ2xvYltuYW1lXSkgPT0gdHlwZSBhbmQgaXNzdWJjbGFzcyhnbG9iW25hbWVdLCBUZXN0Q2FzZSk6XFxuICAgICAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgICAgICB0YyA9IGdsb2JbbmFtZV0oKVxcbiAgICAgICAgICAgICAgICB0Yy52ZXJib3NpdHkgPSB2ZXJib3NpdHlcXG4gICAgICAgICAgICAgICAgdGMubWFpbigpXFxuICAgICAgICAgICAgZXhjZXB0OlxcbiAgICAgICAgICAgICAgICBwcmludChcXFwiVW5jYXVnaHQgRXJyb3IgaW46IFxcXCIsIG5hbWUpXFxuXCIsXCJzcmMvbGliL3VuaXR0ZXN0L2d1aS5weVwiOlwiaW1wb3J0IGRvY3VtZW50XFxuZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2VcXG5mcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuXFxuZnJvbSB0aW1lIGltcG9ydCBzbGVlcFxcblxcblxcbmNsYXNzIFRlc3RDYXNlR3VpKFRlc3RDYXNlKTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgVGVzdENhc2UuX19pbml0X18oc2VsZilcXG4gICAgICAgIHNlbGYuY2xvc2VzdERpdiA9IGRvY3VtZW50LmN1cnJlbnREaXYoKVxcbiAgICAgICAgc2VsZi5kaXZpZCA9IGRvY3VtZW50LmN1cnJlbnRHcmFkaW5nQ29udGFpbmVyKClcXG4gICAgICAgIHNlbGYubXlkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxmLmRpdmlkKVxcbiAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXYgdGhlbiBjcmVhdGUgYSBkdW1teSB0byBhdm9pZCBlcnJvcnMgd2hlbiBydW5uaW5nXFxuICAgICAgICAjIGdyYWRpbmcgXFxcIm9mZiBzY3JlZW5cXFwiXFxuICAgICAgICBpZiBzZWxmLm15ZGl2IGlzIE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5teWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImRpdlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5teWRpdi5zZXRBdHRyaWJ1dGUoXFxcImlkXFxcIiwgc2VsZi5kaXZpZCArIFxcXCJfb2Zmc2NyZWVuX3VuaXRfcmVzdWx0c1xcXCIpXFxuICAgICAgICAgICAgc2VsZi5teWRpdi5zZXRDU1MoXFxcImRpc3BsYXlcXFwiLCBcXFwibm9uZVxcXCIpXFxuICAgICAgICAgICAgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFxcXCJib2R5XFxcIilbMF1cXG4gICAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKHNlbGYubXlkaXYpXFxuICAgICAgICAgICAgc2VsZi51bml0X3Jlc3VsdHNfZGl2aWQgPSBzZWxmLmRpdmlkICsgXFxcIl9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzXFxcIlxcblxcbiAgICAgICAgcmVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIilcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICBzZWxmLnJlc2RpdiA9IHJlc1xcbiAgICAgICAgICAgIHJlcy5pbm5lckhUTUwgPSBcXFwiXFxcIlxcbiAgICAgICAgICAgIHNlbGYudW5pdF9yZXN1bHRzX2RpdmlkID0gc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLnJlc2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImRpdlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0QXR0cmlidXRlKFxcXCJpZFxcXCIsIHNlbGYuZGl2aWQgKyBcXFwiX3VuaXRfcmVzdWx0c1xcXCIpXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJ1bml0dGVzdC1yZXN1bHRzXFxcIilcXG4gICAgICAgICAgICBzZWxmLm15ZGl2LmFwcGVuZENoaWxkKHNlbGYucmVzZGl2KVxcbiAgICAgICAgICAgIHNlbGYudW5pdF9yZXN1bHRzX2RpdmlkID0gc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIlxcblxcbiAgICBkZWYgbWFpbihzZWxmKTpcXG4gICAgICAgIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0YWJsZVxcXCIpXFxuICAgICAgICBzZWxmLnJlc1RhYmxlID0gdFxcbiAgICAgICAgeCA9IHNlbGYucmVzZGl2LmNsb3Nlc3QoXFxcIi50aW1lZENvbXBvbmVudFxcXCIpXFxuICAgICAgICBpZiB4OlxcbiAgICAgICAgICAgIHNlbGYuaXNfdGltZWQgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuaXNfdGltZWQgPSBGYWxzZVxcbiAgICAgICAgc2VsZi5yZXNkaXYuYXBwZW5kQ2hpbGQoc2VsZi5yZXNUYWJsZSlcXG4gICAgICAgIGlmIHNlbGYuaXNfdGltZWQ6XFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0Q1NTKFxcXCJkaXNwbGF5XFxcIiwgXFxcIm5vbmVcXFwiKVxcblxcbiAgICAgICAgaGVhZGVycyA9IFtcXFwiUmVzdWx0XFxcIiwgXFxcIkFjdHVhbCBWYWx1ZVxcXCIsIFxcXCJFeHBlY3RlZCBWYWx1ZVxcXCIsIFxcXCJOb3Rlc1xcXCJdXFxuICAgICAgICByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0clxcXCIpXFxuICAgICAgICBmb3IgaXRlbSBpbiBoZWFkZXJzOlxcbiAgICAgICAgICAgIGhlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0aFxcXCIpXFxuICAgICAgICAgICAgaGVhZC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBoZWFkLmlubmVySFRNTCA9IGl0ZW1cXG4gICAgICAgICAgICBoZWFkLnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChoZWFkKVxcbiAgICAgICAgc2VsZi5yZXNUYWJsZS5hcHBlbmRDaGlsZChyb3cpXFxuXFxuICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLnRsaXN0OlxcbiAgICAgICAgICAgIHRyeTpcXG4gICAgICAgICAgICAgICAgc2VsZi5zZXRVcCgpXFxuICAgICAgICAgICAgICAgIGZ1bmMoKVxcbiAgICAgICAgICAgICAgICBzZWxmLnRlYXJEb3duKClcXG4gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6XFxuICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KFxcXCJFcnJvclxcXCIsIE5vbmUsIE5vbmUsIHN0cihlKS5zcGxpdChcXFwib24gbGluZVxcXCIpWzBdKVxcbiAgICAgICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuICAgICAgICBzZWxmLnNob3dTdW1tYXJ5KClcXG5cXG4gICAgZGVmIGdldE91dHB1dChzZWxmKTpcXG4gICAgICAgIHNsZWVwKDAuMilcXG4gICAgICAgICMgc2VsZi5kaXZpZCB3aWxsIGJlIHRoZSBncmFkaW5nV3JhcHBlciB3aGVuIGluIGdyYWRpbmcgbW9kZVxcbiAgICAgICAgaWYgc2VsZi5jbG9zZXN0RGl2ICE9IHNlbGYuZGl2aWQ6XFxuICAgICAgICAgICAgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXG4gICAgICAgICAgICAgICAgXFxcIiN7fSAje31fc3Rkb3V0XFxcIi5mb3JtYXQoc2VsZi5kaXZpZCwgc2VsZi5jbG9zZXN0RGl2KVxcbiAgICAgICAgICAgIClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgb3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5kaXZpZCArIFxcXCJfc3Rkb3V0XFxcIilcXG4gICAgICAgIHJldHVybiBvdXRwdXQuaW5uZXJUZXh0XFxuXFxuICAgIGRlZiBnZXRFZGl0b3JUZXh0KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEN1cnJlbnRFZGl0b3JWYWx1ZSgpXFxuXFxuICAgIGRlZiBhcHBlbmRSZXN1bHQoc2VsZiwgcmVzLCBhY3R1YWwsIGV4cGVjdGVkLCBwYXJhbSk6XFxuICAgICAgICB0cmltQWN0dWFsID0gRmFsc2VcXG4gICAgICAgIGlmIGxlbihzdHIoYWN0dWFsKSkgPiAxNTpcXG4gICAgICAgICAgICB0cmltQWN0dWFsID0gVHJ1ZVxcbiAgICAgICAgICAgIGFjdHVhbFR5cGUgPSB0eXBlKGFjdHVhbClcXG4gICAgICAgIHRyaW1FeHBlY3RlZCA9IEZhbHNlXFxuICAgICAgICBpZiBsZW4oc3RyKGV4cGVjdGVkKSkgPiAxNTpcXG4gICAgICAgICAgICB0cmltRXhwZWN0ZWQgPSBUcnVlXFxuICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID0gdHlwZShleHBlY3RlZClcXG4gICAgICAgIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRyXFxcIilcXG4gICAgICAgIGVyciA9IEZhbHNlXFxuICAgICAgICBpZiByZXMgPT0gXFxcIkVycm9yXFxcIjpcXG4gICAgICAgICAgICBlcnIgPSBUcnVlXFxuICAgICAgICAgICAgbXNnID0gXFxcIkVycm9yOiAlc1xcXCIgJSBwYXJhbVxcbiAgICAgICAgICAgIGVycm9yRGF0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgICAgICBlcnJvckRhdGEuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuICAgICAgICAgICAgZXJyb3JEYXRhLmlubmVySFRNTCA9IFxcXCJFUlJPUlxcXCJcXG4gICAgICAgICAgICBlcnJvckRhdGEuc2V0Q1NTKFxcXCJiYWNrZ3JvdW5kLWNvbG9yXFxcIiwgXFxcIiNkZThlOTZcXFwiKVxcbiAgICAgICAgICAgIGVycm9yRGF0YS5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoZXJyb3JEYXRhKVxcbiAgICAgICAgZWxpZiByZXM6XFxuICAgICAgICAgICAgcGFzc2VkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgICAgIHBhc3NlZC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBwYXNzZWQuaW5uZXJIVE1MID0gXFxcIlBhc3NcXFwiXFxuICAgICAgICAgICAgcGFzc2VkLnNldENTUyhcXFwiYmFja2dyb3VuZC1jb2xvclxcXCIsIFxcXCIjODNkMzgyXFxcIilcXG4gICAgICAgICAgICBwYXNzZWQuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKHBhc3NlZClcXG4gICAgICAgICAgICBzZWxmLm51bVBhc3NlZCArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGZhaWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICAgICAgZmFpbC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBmYWlsLmlubmVySFRNTCA9IFxcXCJGYWlsXFxcIlxcbiAgICAgICAgICAgIGZhaWwuc2V0Q1NTKFxcXCJiYWNrZ3JvdW5kLWNvbG9yXFxcIiwgXFxcIiNkZThlOTZcXFwiKVxcbiAgICAgICAgICAgIGZhaWwuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGZhaWwpXFxuICAgICAgICAgICAgc2VsZi5udW1GYWlsZWQgKz0gMVxcblxcbiAgICAgICAgYWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgYWN0LnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcbiAgICAgICAgaWYgdHJpbUFjdHVhbDpcXG4gICAgICAgICAgICBhY3RIVE1MID0gc3RyKGFjdHVhbClbOjVdICsgXFxcIi4uLlxcXCIgKyBzdHIoYWN0dWFsKVstNTpdXFxuICAgICAgICAgICAgaWYgYWN0dWFsVHlwZSA9PSBzdHI6XFxuICAgICAgICAgICAgICAgIGFjdEhUTUwgPSByZXByKGFjdEhUTUwpXFxuICAgICAgICAgICAgYWN0LmlubmVySFRNTCA9IGFjdEhUTUxcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgYWN0LmlubmVySFRNTCA9IHJlcHIoYWN0dWFsKVxcbiAgICAgICAgYWN0LnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKGFjdClcXG5cXG4gICAgICAgIGV4cGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgIGV4cGVjdC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG5cXG4gICAgICAgIGlmIHRyaW1FeHBlY3RlZDpcXG4gICAgICAgICAgICBleHBlY3RlZEhUTUwgPSBzdHIoZXhwZWN0ZWQpWzo1XSArIFxcXCIuLi5cXFwiICsgc3RyKGV4cGVjdGVkKVstNTpdXFxuICAgICAgICAgICAgaWYgZXhwZWN0ZWRUeXBlID09IHN0cjpcXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRIVE1MID0gcmVwcihleHBlY3RlZEhUTUwpXFxuICAgICAgICAgICAgZXhwZWN0LmlubmVySFRNTCA9IGV4cGVjdGVkSFRNTFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBleHBlY3QuaW5uZXJIVE1MID0gcmVwcihleHBlY3RlZClcXG4gICAgICAgIGV4cGVjdC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChleHBlY3QpXFxuICAgICAgICBpbnAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICBpbnAuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuXFxuICAgICAgICBpZiBlcnI6XFxuICAgICAgICAgICAgaW5wLmlubmVySFRNTCA9IG1zZ1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpbnAuaW5uZXJIVE1MID0gcGFyYW1cXG4gICAgICAgIGlucC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChpbnApXFxuXFxuICAgICAgICBpZiB0cmltQWN0dWFsIG9yIHRyaW1FeHBlY3RlZDpcXG4gICAgICAgICAgICBleHBhbmRidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJidXR0b25cXFwiKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5pbm5lckhUTUwgPSBcXFwiRXhwYW5kIERpZmZlcmVuY2VzXFxcIlxcbiAgICAgICAgICAgIGV4cGFuZG1zZyA9IFxcXCJBY3R1YWw6IFxcXCIgKyBzdHIoYWN0dWFsKSArIFxcXCJcXFxcbkV4cGVjdGVkOiBcXFwiICsgc3RyKGV4cGVjdGVkKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcInZhbHVlXFxcIiwgZXhwYW5kbXNnKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcInR5cGVcXFwiLCBcXFwiYnV0dG9uXFxcIilcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uc2V0QXR0cmlidXRlKFxcXCJvbmNsaWNrXFxcIiwgXFxcImFsZXJ0KHRoaXMudmFsdWUpXFxcIilcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJidG4gYnRuLWluZm9cXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChleHBhbmRidXR0b24pXFxuXFxuICAgICAgICBzZWxmLnJlc1RhYmxlLmFwcGVuZENoaWxkKHJvdylcXG5cXG4gICAgZGVmIHNob3dTdW1tYXJ5KHNlbGYpOlxcbiAgICAgICAgcGN0ID0gZmxvYXQoc2VsZi5udW1QYXNzZWQpIC8gKHNlbGYubnVtUGFzc2VkICsgc2VsZi5udW1GYWlsZWQpICogMTAwXFxuICAgICAgICBwY3Rjb3JyZWN0ID0gKFxcbiAgICAgICAgICAgIFxcXCJwZXJjZW50OlxcXCJcXG4gICAgICAgICAgICArIHN0cihwY3QpXFxuICAgICAgICAgICAgKyBcXFwiOnBhc3NlZDpcXFwiXFxuICAgICAgICAgICAgKyBzdHIoc2VsZi5udW1QYXNzZWQpXFxuICAgICAgICAgICAgKyBcXFwiOmZhaWxlZDpcXFwiXFxuICAgICAgICAgICAgKyBzdHIoc2VsZi5udW1GYWlsZWQpXFxuICAgICAgICApXFxuICAgICAgICBwVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwicFxcXCIpXFxuICAgICAgICBpZiBub3Qgc2VsZi5pc190aW1lZDpcXG4gICAgICAgICAgICBwVGFnLmlubmVySFRNTCA9IFxcXCJZb3UgcGFzc2VkOiBcXFwiICsgc3RyKHBjdCkgKyBcXFwiJSBvZiB0aGUgdGVzdHNcXFwiXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuYXBwZW5kQ2hpbGQocFRhZylcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBqc2V2YWwoXFxcIndpbmRvdy5lZExpc3RbJ3t9J10ucGN0X2NvcnJlY3QgPSB7fVxcXCIuZm9ybWF0KHNlbGYuY2xvc2VzdERpdiwgcGN0KSlcXG4gICAgICAgICAgICBqc2V2YWwoXFxuICAgICAgICAgICAgICAgIFxcXCJ3aW5kb3cuZWRMaXN0Wyd7fSddLnVuaXRfcmVzdWx0cyA9ICd7fSdcXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VzdERpdiwgcGN0Y29ycmVjdFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgICAgIGpzZXZhbChcXG4gICAgICAgICAgICAgICAgXFxcIndpbmRvdy5lZExpc3RbJ3t9J10udW5pdF9yZXN1bHRzX2RpdmlkID0gJ3t9J1xcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZXN0RGl2LCBzZWxmLm15ZGl2LmdldEF0dHJpYnV0ZShcXFwiaWRcXFwiKVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcblxcbiAgICAgICAgZXhjZXB0OlxcbiAgICAgICAgICAgIHByaW50KFxcbiAgICAgICAgICAgICAgICBcXFwiZmFpbGVkIHRvIGZpbmQgb2JqZWN0IHRvIHJlY29yZCB1bml0dGVzdCByZXN1bHRzISB7fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICAgICAgcGN0Y29ycmVjdFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcblwiLFwic3JjL2xpYi91cmxsaWIvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3JldHVybnt9fTtcIixcInNyYy9saWIvdXJsbGliL3JlcXVlc3QvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9O2EuUmVzcG9uc2U9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS5kYXRhJD1iLnJlc3BvbnNlVGV4dCxhLmxpbmVMaXN0PWEuZGF0YSQuc3BsaXQoXFxcIlxcXFxuXFxcIiksYS5saW5lTGlzdD1hLmxpbmVMaXN0LnNsaWNlKDAsLTEpO2Zvcih2YXIgYz0wO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWEubGluZUxpc3RbY10rPVxcXCJcXFxcblxcXCI7YS5jdXJyZW50TGluZT0wLGEucG9zJD0wfSksYi5fX3N0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShcXFwiPFJlc3BvbnNlPlxcXCIpfSksYi5fX2l0ZXJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWEubGluZUxpc3Q7cmV0dXJuIFNrLmJ1aWx0aW4ubWFrZUdlbmVyYXRvcihmdW5jdGlvbigpe3JldHVybiB0aGlzLiRpbmRleD49dGhpcy4kbGluZXMubGVuZ3RoP3ZvaWQgMDpuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kbGluZXNbdGhpcy4kaW5kZXgrK10pfSx7JG9iajphLCRpbmRleDowLCRsaW5lczpifSl9KSxiLnJlYWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKGEuY2xvc2VkKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGVcXFwiKTt2YXIgYz1hLmRhdGEkLmxlbmd0aDt2b2lkIDA9PT1iJiYoYj1jKTt2YXIgZD1uZXcgU2suYnVpbHRpbi5zdHIoYS5kYXRhJC5zdWJzdHIoYS5wb3MkLGIpKTtyZXR1cm4gYS5wb3MkKz1iLGEucG9zJD49YyYmKGEucG9zJD1jKSxkfSksYi5yZWFkbGluZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVxcXCJcXFwiO3JldHVybiBhLmN1cnJlbnRMaW5lPGEubGluZUxpc3QubGVuZ3RoJiYoYj1hLmxpbmVMaXN0W2EuY3VycmVudExpbmVdLGEuY3VycmVudExpbmUrKyksbmV3IFNrLmJ1aWx0aW4uc3RyKGIpfSksYi5yZWFkbGluZXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz1hLmN1cnJlbnRMaW5lO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYS5saW5lTGlzdFtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSl9LFxcXCJSZXNwb25zZVxcXCIsW10pO3ZhciBiPWZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFTay5qc29ucFNpdGVzKXJldHVybiExO2ZvcihiPTA7YjxTay5qc29ucFNpdGVzLmxlbmd0aDtiKyspaWYoYS5zdGFydHNXaXRoKFNrLmpzb25wU2l0ZXNbYl0pKXJldHVybiEwO3JldHVybiExfTtyZXR1cm4gYS51cmxvcGVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYyxkKXt2YXIgZT1iKGMudik/bmV3IFByb21pc2UoZnVuY3Rpb24oYixkKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJzY3JpcHRcXFwiKTtlLnNyYz1jLnYrXFxcIiZjYWxsYmFjaz1Tay5qc29ucGNhbGxiYWNrXFxcIixlLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKFxcXCJBbiBlcnJvciBvY2N1cmVkIGdldHRpbmcgdGhlIGRhdGFcXFwiKX0sU2suanNvbnBjYWxsYmFjaz1mdW5jdGlvbihjKXt2YXIgZD17cmVzcG9uc2VUZXh0OkpTT04uc3RyaW5naWZ5KGMpfTtiKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlJlc3BvbnNlLFtkXSkpfTt0cnl7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX1jYXRjaChhKXtjb25zb2xlLmxvZyhcXFwiY2F1Z2h0IGVycm9yIGluIHVybG9wZW5cXFwiK2EpfX0pOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGIpe3ZhciBlPW5ldyBYTUxIdHRwUmVxdWVzdDtlLmFkZEV2ZW50TGlzdGVuZXIoXFxcImxvYWRlbmRcXFwiLGZ1bmN0aW9uKCl7YihTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5SZXNwb25zZSxbZV0pKX0pLGQ/KGUub3BlbihcXFwiUE9TVFxcXCIsYy52KSxlLnNldFJlcXVlc3RIZWFkZXIoXFxcIkNvbnRlbnQtdHlwZVxcXCIsXFxcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxcXCIpLGUuc2VuZChkLnYpKTooZS5vcGVuKFxcXCJHRVRcXFwiLGMudiksZS5zZW5kKG51bGwpKX0pO3ZhciBmPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO3JldHVybiBmLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiByZXNvbHV0aW9ufSxmLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6ZS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiByZXNvbHV0aW9uPWEsYX0sZnVuY3Rpb24oYSl7cmV0dXJuIHJlc29sdXRpb249XFxcIlxcXCIsYX0pfSxmfSksYX07XCIsXCJzcmMvbGliL3VybGxpYjIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInVybGxpYjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91cmxwYXJzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXJscGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91c2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ1c2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdXUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInV1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdXVpZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXVpZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dhcm5pbmdzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3YXJuaW5ncyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dhdmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndhdmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93ZWFrcmVmLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3ZWFrcmVmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2ViYnJvd3Nlci5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb3Blbl90YWIoYSl7cmV0dXJuKFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInVybFxcXCIsXFxcInN0cmluZ1xcXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSksIWIpP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6KGE9YS4kanNzdHIoKSx3aW5kb3cub3BlbihhLFxcXCJfYmxhbmtcXFwiKSxTay5idWlsdGluLmJvb2wudHJ1ZSQpfXZhciBhPXt9LGI9XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cmJlxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2Ygd2luZG93Lm5hdmlnYXRvcjtyZXR1cm4gYS5fX25hbWVfXz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIndlYmJyb3dzZXJcXFwiKSxhLm9wZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuXFxcIixhcmd1bWVudHMubGVuZ3RoKzEsMSwzKSxvcGVuX3RhYihhKX0pLGEub3Blbl9uZXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuX25ldyhhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxvcGVuX3RhYihhKX0pLGEub3Blbl9uZXdfdGFiPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXdfdGFiKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuX25ld190YWJcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxvcGVuX3RhYihhKX0pLGEuRGVmYXVsdEJyb3dzZXI9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uIGRmbGJyb3dzZXIoYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gX19pbml0X18oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSksYi5vcGVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3BlbihhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCksb3Blbl90YWIoYil9KSxiLm9wZW5fbmV3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXcoYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxvcGVuX3RhYihiKX0pLGIub3Blbl9uZXdfdGFiPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXdfdGFiKGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5fbmV3X3RhYlxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLG9wZW5fdGFiKGIpfSl9LFxcXCJEZWZhdWx0QnJvd3NlclxcXCIsW10pLGEuZ2V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldFxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLkRlZmF1bHRCcm93c2VyLFtdKX0pLGF9O1wiLFwic3JjL2xpYi93ZWJicm93c2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3ZWJicm93c2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2ViZ2wvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIndlYmdsXFxcIil9LGM9ZnVuY3Rpb24oYSl7cmV0dXJuXFxcIjx0YWJsZSBzdHlsZT1cXFxcXFxcImJhY2tncm91bmQtY29sb3I6ICM4Q0U7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XFxcXFxcXCI+PHRyPjx0ZCBhbGlnbj1cXFxcXFxcImNlbnRlclxcXFxcXFwiPjxkaXYgc3R5bGU9XFxcXFxcXCJkaXNwbGF5OiB0YWJsZS1jZWxsOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXFxcXFwiPjxkaXYgc3R5bGU9XFxcXFxcXCJcXFxcXFxcIj5cXFwiK2ErXFxcIjwvZGl2PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPlxcXCJ9LGQ9XFxcIlRoaXMgcGFnZSByZXF1aXJlcyBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBXZWJHTC48YnIvPjxhIGhyZWY9XFxcXFxcXCJodHRwOi8vZ2V0LndlYmdsLm9yZ1xcXFxcXFwiPkNsaWNrIGhlcmUgdG8gdXBncmFkZSB5b3VyIGJyb3dzZXIuPC9hPlxcXCIsZT1mdW5jdGlvbihhKXtmb3IodmFyIGI9W1xcXCJ3ZWJnbFxcXCIsXFxcImV4cGVyaW1lbnRhbC13ZWJnbFxcXCIsXFxcIndlYmtpdC0zZFxcXCIsXFxcIm1vei13ZWJnbFxcXCJdLGM9bnVsbCxkPTA7ZDxiLmxlbmd0aDsrK2Qpe3RyeXtjPWEuZ2V0Q29udGV4dChiW2RdKX1jYXRjaChhKXt9aWYoYylicmVha31pZihjKXtmdW5jdGlvbiByZXR1cm5GYWxzZSgpe3JldHVybiExfWEub25zZWxlY3RzdGFydD1yZXR1cm5GYWxzZSxhLm9ubW91c2Vkb3duPXJldHVybkZhbHNlfXJldHVybiBjfSxmPWZ1bmN0aW9uKGEsZil7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7aWYoZnx8KGY9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZShcXFwiY2FudmFzXFxcIilbMF0pLCFmKXJldHVybiB2b2lkKGcuaW5uZXJIVE1MPWMoZCkpO3ZhciBoPWUoZik7aWYoIWgpe3ZhciBpPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhcXFxcdytcXFxcLy4qPyApL2cpLGo9e307dHJ5e2Zvcih2YXIgaz0wO2s8aS5sZW5ndGg7KytrKXtmb3IodmFyIGw9aVtrXS5tYXRjaCgvKFxcXFx3KykvZyksbT1bXSxuPTE7bjxsLmxlbmd0aDsrK24pbS5wdXNoKHBhcnNlSW50KGxbbl0pKTtqW2xbMF1dPW19fWNhdGNoKGEpe31nLmlubmVySFRNTD1qLkNocm9tZSYmKDc8ai5DaHJvbWVbMF18fDc9PWouQ2hyb21lWzBdJiYwPGouQ2hyb21lWzFdfHw3PT1qLkNocm9tZVswXSYmMD09ai5DaHJvbWVbMV0mJjUyMTw9ai5DaHJvbWVbMl0pP2MoXFxcIkl0IGRvZXNuJ3QgYXBwZWFyIHlvdXIgY29tcHV0ZXIgY2FuIHN1cHBvcnQgV2ViR0wuPGJyLz48YSBocmVmPVxcXFxcXFwiaHR0cDovL2dldC53ZWJnbC5vcmdcXFxcXFxcIj5DbGljayBoZXJlIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvYT5cXFwiKTpjKGQpfXJldHVybiBofTtyZXR1cm4gYS5Db250ZXh0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIudiksZD1mKGIudixjKTtpZighZCl0aHJvdyBuZXcgRXJyb3IoXFxcIllvdXIgYnJvd3NlciBkb2VzIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBXZWJHTC5cXFwiKTtmb3IodmFyIGUgaW4gYS5nbD1kLGQuX19wcm90b19fKWlmKFxcXCJudW1iZXJcXFwiPT10eXBlb2YgZC5fX3Byb3RvX19bZV0pU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihlKSxkLl9fcHJvdG9fX1tlXSk7ZWxzZSBpZihcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZC5fX3Byb3RvX19bZV0pc3dpdGNoKGUpe2Nhc2VcXFwiYnVmZmVyRGF0YVxcXCI6YnJlYWs7Y2FzZVxcXCJjbGVhckNvbG9yXFxcIjpicmVhaztjYXNlXFxcImRyYXdBcnJheXNcXFwiOmJyZWFrO2Nhc2VcXFwiZ2V0QXR0cmliTG9jYXRpb25cXFwiOmJyZWFrO2Nhc2VcXFwiZ2V0VW5pZm9ybUxvY2F0aW9uXFxcIjpicmVhaztjYXNlXFxcInNoYWRlclNvdXJjZVxcXCI6YnJlYWs7Y2FzZVxcXCJ1bmlmb3JtTWF0cml4NGZ2XFxcIjpicmVhaztjYXNlXFxcInZlcnRleEF0dHJpYlBvaW50ZXJcXFwiOmJyZWFrO2Nhc2VcXFwidmlld3BvcnRcXFwiOmJyZWFrO2RlZmF1bHQ6KGZ1bmN0aW9uKGIpe1NrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoZSksbmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhPWQuX19wcm90b19fW2JdO3JldHVybiBhLmFwcGx5KGQsYXJndW1lbnRzKX0pKX0pKGUpO31kLmNsZWFyQ29sb3IoMTAwLzI1NSwxNDkvMjU1LDIzNy8yNTUsMSksZC5jbGVhcihkLkNPTE9SX0JVRkZFUl9CSVQpfSksYi50cCRnZXRhdHRyPVNrLmdlbmVyaWMuZ2V0QXR0cixiLmJ1ZmZlckRhdGE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLmdsLmJ1ZmZlckRhdGEoYixjLnYsZCl9KSxiLmNsZWFyQ29sb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe2EuZ2wuY2xlYXJDb2xvcihTay5idWlsdGluLmFzbnVtJChiKSxTay5idWlsdGluLmFzbnVtJChjKSxTay5idWlsdGluLmFzbnVtJChkKSxTay5idWlsdGluLmFzbnVtJChlKSl9KSxiLmdldEF0dHJpYkxvY2F0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmdsLmdldEF0dHJpYkxvY2F0aW9uKGIsYy52KX0pLGIuZ2V0VW5pZm9ybUxvY2F0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihiLGMudil9KSxiLnNoYWRlclNvdXJjZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLmdsLnNoYWRlclNvdXJjZShiLGMudil9KSxiLmRyYXdBcnJheXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLmdsLmRyYXdBcnJheXMoU2suYnVpbHRpbi5hc251bSQoYiksU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCkpfSksYi52ZXJ0ZXhBdHRyaWJQb2ludGVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7YS5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGIsU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCksZSxTay5idWlsdGluLmFzbnVtJChmKSxTay5idWlsdGluLmFzbnVtJChnKSl9KSxiLnZpZXdwb3J0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXthLmdsLnZpZXdwb3J0KFNrLmJ1aWx0aW4uYXNudW0kKGIpLFNrLmJ1aWx0aW4uYXNudW0kKGMpLFNrLmJ1aWx0aW4uYXNudW0kKGQpLFNrLmJ1aWx0aW4uYXNudW0kKGUpKX0pLGIudW5pZm9ybU1hdHJpeDRmdj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EuZ2wudW5pZm9ybU1hdHJpeDRmdihTay5idWlsdGluLmFzbnVtJChiKSxjLGQudil9KSxiLnNldERyYXdGdW5jPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgRGF0ZSgpLmdldFRpbWUoKSxkPXNldEludGVydmFsKGZ1bmN0aW9uKCl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW2EsbmV3IERhdGUoKS5nZXRUaW1lKCktY10pfSwxZTMvNjApfSl9LFxcXCJDb250ZXh0XFxcIixbXSksYS5GbG9hdDMyQXJyYXk9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52PVxcXCJudW1iZXJcXFwiPT10eXBlb2YgYj9uZXcgRmxvYXQzMkFycmF5KGIpOm5ldyBGbG9hdDMyQXJyYXkoU2suZmZpLnJlbWFwVG9KcyhiKSl9KSxiLl9fcmVwcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEudi5sZW5ndGg7KytjKWIucHVzaChhLnZbY10pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIltcXFwiK2Iuam9pbihcXFwiLCBcXFwiKStcXFwiXVxcXCIpfSl9LFxcXCJGbG9hdDMyQXJyYXlcXFwiLFtdKSxhLk1hdHJpeDR4ND1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9bmV3IEZsb2F0MzJBcnJheShTay5mZmkucmVtYXBUb0pzKGIpKX0pLGIuaWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnY7YlswXT0xLGJbMV09MCxiWzJdPTAsYlszXT0wLGJbNF09MCxiWzVdPTEsYls2XT0wLGJbN109MCxiWzhdPTAsYls5XT0wLGJbMTBdPTEsYlsxMV09MCxiWzEyXT0wLGJbMTNdPTAsYlsxNF09MCxiWzE1XT0xfSksYi5wZXJzcGVjdGl2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyxkLGUsZyl7dmFyIGg9TWF0aC50YW4saT1NYXRoLlBJLGo9aCguNSppLS41KihTay5idWlsdGluLmFzbnVtJChjKSppLzE4MCkpLGw9U2suYnVpbHRpbi5hc251bSQoZCksYT1Tay5idWlsdGluLmFzbnVtJChlKSxuPVNrLmJ1aWx0aW4uYXNudW0kKGcpLGY9MS8oYS1uKSxrPWIudjtrWzBdPWovbCxrWzFdPTAsa1syXT0wLGtbM109MCxrWzRdPTAsa1s1XT1qLGtbNl09MCxrWzddPTAsa1s4XT0wLGtbOV09MCxrWzEwXT0oYStuKSpmLGtbMTFdPS0xLGtbMTJdPTAsa1sxM109MCxrWzE0XT0yKihhKm4qZiksa1sxNV09MH0pLGIudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnYsZD1Tay5mZmkucmVtYXBUb0pzKGIpO2NbMF09MSxjWzFdPTAsY1syXT0wLGNbM109MCxjWzRdPTAsY1s1XT0xLGNbNl09MCxjWzddPTAsY1s4XT0wLGNbOV09MCxjWzEwXT0xLGNbMTFdPTAsY1sxMl09ZFswXSxjWzEzXT1kWzFdLGNbMTRdPWRbMl0sY1sxNV09MX0pLGIuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS52Lmxlbmd0aDsrK2MpYi5wdXNoKGEudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiW1xcXCIrYi5qb2luKFxcXCIsIFxcXCIpK1xcXCJdXFxcIil9KX0sXFxcIk1hdHJpeDR4NFxcXCIsW10pLGF9O1wiLFwic3JjL2xpYi93ZWJnbC9tYXRoLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fTtyZXR1cm4gYS5NYXQ0ND1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYixjKXt2YXIgZD1NYXRoLnNxcnQ7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLmxvYWRJZGVudGl0eSxbYV0pLGEuc3RhY2s9W119KSxjLnB1c2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnN0YWNrLnB1c2goYS5lbGVtZW50cy5zbGljZSgwKSl9KSxjLnBvcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuZWxlbWVudHM9YS5zdGFjay5wb3AoKX0pLGMubG9hZElkZW50aXR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV19KSxjLnRyYW5zZm9ybTM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe3ZhciBkPWIuZWxlbWVudHM7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlZlYzMsW2RbMF0qYy54K2RbNF0qYy55K2RbOF0qYy56LGRbMV0qYy54K2RbNV0qYy55K2RbOV0qYy56LGRbMl0qYy54K2RbNl0qYy55K2RbMTBdKmMuel0pfSksYy5zY2FsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmVsZW1lbnRzWzBdKj1iLGEuZWxlbWVudHNbMV0qPWIsYS5lbGVtZW50c1syXSo9YixhLmVsZW1lbnRzWzNdKj1iLGEuZWxlbWVudHNbNF0qPWMsYS5lbGVtZW50c1s1XSo9YyxhLmVsZW1lbnRzWzZdKj1jLGEuZWxlbWVudHNbN10qPWMsYS5lbGVtZW50c1s4XSo9ZCxhLmVsZW1lbnRzWzldKj1kLGEuZWxlbWVudHNbMTBdKj1kLGEuZWxlbWVudHNbMTFdKj1kLGF9KSxjLnRyYW5zbGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmVsZW1lbnRzWzEyXSs9YS5lbGVtZW50c1swXSpiK2EuZWxlbWVudHNbNF0qYythLmVsZW1lbnRzWzhdKmQsYS5lbGVtZW50c1sxM10rPWEuZWxlbWVudHNbMV0qYithLmVsZW1lbnRzWzVdKmMrYS5lbGVtZW50c1s5XSpkLGEuZWxlbWVudHNbMTRdKz1hLmVsZW1lbnRzWzJdKmIrYS5lbGVtZW50c1s2XSpjK2EuZWxlbWVudHNbMTBdKmQsYS5lbGVtZW50c1sxNV0rPWEuZWxlbWVudHNbM10qYithLmVsZW1lbnRzWzddKmMrYS5lbGVtZW50c1sxMV0qZCxhfSksYy5yb3RhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZSxmLGcpe3ZhciBoPU1hdGguY29zLGk9TWF0aC5zaW4saj1NYXRoLlBJLGs9ZChlKmUrZipmK2cqZyksbD1pKGMqai8xODApLG09aChjKmovMTgwKTtpZigwPGspe3ZhciBuLG8scCxxLHIscyx0LHUsdix3LEE7ZS89ayxmLz1rLGcvPWssbj1lKmUsbz1mKmYscD1nKmcscT1lKmYscj1mKmcscz1nKmUsdD1lKmwsdT1mKmwsdj1nKmwsdz0xLW0sQT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5NYXQ0NCksQS5lbGVtZW50c1swXT13Km4rbSxBLmVsZW1lbnRzWzFdPXcqcS12LEEuZWxlbWVudHNbMl09dypzK3UsQS5lbGVtZW50c1szXT0wLEEuZWxlbWVudHNbNF09dypxK3YsQS5lbGVtZW50c1s1XT13Km8rbSxBLmVsZW1lbnRzWzZdPXcqci10LEEuZWxlbWVudHNbN109MCxBLmVsZW1lbnRzWzhdPXcqcy11LEEuZWxlbWVudHNbOV09dypyK3QsQS5lbGVtZW50c1sxMF09dypwK20sQS5lbGVtZW50c1sxMV09MCxBLmVsZW1lbnRzWzEyXT0wLEEuZWxlbWVudHNbMTNdPTAsQS5lbGVtZW50c1sxNF09MCxBLmVsZW1lbnRzWzE1XT0xLEE9QS5tdWx0aXBseShiKSxiLmVsZW1lbnRzPUEuZWxlbWVudHN9cmV0dXJuIGJ9KSxjLm11bHRpcGx5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXtmb3IodmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuTWF0NDQpLGU9MDs0PmU7ZSsrKWQuZWxlbWVudHNbNCplKzBdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMF0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s0XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzhdK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTJdLGQuZWxlbWVudHNbNCplKzFdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMV0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s1XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzldK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTNdLGQuZWxlbWVudHNbNCplKzJdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMl0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s2XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzEwXStiLmVsZW1lbnRzWzQqZSszXSpjLmVsZW1lbnRzWzE0XSxkLmVsZW1lbnRzWzQqZSszXT1iLmVsZW1lbnRzWzQqZSswXSpjLmVsZW1lbnRzWzNdK2IuZWxlbWVudHNbNCplKzFdKmMuZWxlbWVudHNbN10rYi5lbGVtZW50c1s0KmUrMl0qYy5lbGVtZW50c1sxMV0rYi5lbGVtZW50c1s0KmUrM10qYy5lbGVtZW50c1sxNV07cmV0dXJuIGIuZWxlbWVudHM9ZC5lbGVtZW50cyxifSksYy5sb29rQXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZSxmLGcsaCxpLGosayxsKXt2YXIgbT1bYy1nLGUtaCxmLWldLG49ZChtWzBdKm1bMF0rbVsxXSptWzFdK21bMl0qbVsyXSk7biYmKG1bMF0vPW4sbVsxXS89bixtWzJdLz1uKTt2YXIgbz1baixrLGxdLHA9W107cFswXT1vWzFdKm1bMl0tb1syXSptWzFdLHBbMV09LW9bMF0qbVsyXStvWzJdKm1bMF0scFsyXT1vWzBdKm1bMV0tb1sxXSptWzBdLG9bMF09bVsxXSpwWzJdLW1bMl0qcFsxXSxvWzFdPS1tWzBdKnBbMl0rbVsyXSpwWzBdLG9bMl09bVswXSpwWzFdLW1bMV0qcFswXSxuPWQocFswXSpwWzBdK3BbMV0qcFsxXStwWzJdKnBbMl0pLG4mJihwWzBdLz1uLHBbMV0vPW4scFsyXS89biksbj1kKG9bMF0qb1swXStvWzFdKm9bMV0rb1syXSpvWzJdKSxuJiYob1swXS89bixvWzFdLz1uLG9bMl0vPW4pO3ZhciBxPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLk1hdDQ0KTtyZXR1cm4gcS5lbGVtZW50c1swXT1wWzBdLHEuZWxlbWVudHNbNF09cFsxXSxxLmVsZW1lbnRzWzhdPXBbMl0scS5lbGVtZW50c1sxMl09MCxxLmVsZW1lbnRzWzFdPW9bMF0scS5lbGVtZW50c1s1XT1vWzFdLHEuZWxlbWVudHNbOV09b1syXSxxLmVsZW1lbnRzWzEzXT0wLHEuZWxlbWVudHNbMl09bVswXSxxLmVsZW1lbnRzWzZdPW1bMV0scS5lbGVtZW50c1sxMF09bVsyXSxxLmVsZW1lbnRzWzE0XT0wLHEuZWxlbWVudHNbM109MCxxLmVsZW1lbnRzWzddPTAscS5lbGVtZW50c1sxMV09MCxxLmVsZW1lbnRzWzE1XT0xLHE9cS5tdWx0aXBseShiKSxiLmVsZW1lbnRzPXEuZWxlbWVudHMsYi50cmFuc2xhdGUoLWMsLWUsLWYpLGJ9KX0sXFxcIk1hdDQ0XFxcIixbXSksYS5NYXQzMz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIubG9hZElkZW50aXR5LFthXSl9KSxiLmxvYWRJZGVudGl0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXX0pfSxcXFwiTWF0MzNcXFwiLFtdKSxhLlZlYzM9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGIsYyl7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EueD1iLGEueT1jLGEuej1kfSksYy5fX3N1Yl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuVmVjMyxbYi54LWMueCxiLnktYy55LGIuei1jLnpdKX0pfSxcXFwiVmVjM1xcXCIsW10pLGEuY3Jvc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe3JldHVybiBTay5hc3NlcnRzLmFzc2VydChiIGluc3RhbmNlb2YgYS5WZWMzJiZjIGluc3RhbmNlb2YgYS5WZWMzKSxTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5WZWMzLFtiLnkqYy56LWIueipjLnksYi56KmMueC1iLngqYy56LGIueCpjLnktYi55KmMueF0pfSksYX07XCIsXCJzcmMvbGliL3dlYmdsL21hdHJpeDQuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPU1hdGguUEksYj17fSxjPW5ldyBGbG9hdDMyQXJyYXkoMyksZD1uZXcgRmxvYXQzMkFycmF5KDMpLGU9bmV3IEZsb2F0MzJBcnJheSgzKSxmPW5ldyBGbG9hdDMyQXJyYXkoNCksZz1uZXcgRmxvYXQzMkFycmF5KDQpLGg9bmV3IEZsb2F0MzJBcnJheSg0KSxpPW5ldyBGbG9hdDMyQXJyYXkoMTYpLGo9bmV3IEZsb2F0MzJBcnJheSgxNiksaz1uZXcgRmxvYXQzMkFycmF5KDE2KSxsPWZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBhPU1hdGguc3FydCxkPTAsZT1jLmxlbmd0aCxmPTA7ZjxlOysrZilkKz1jW2ZdKmNbZl07aWYoZD1hKGQpLDFlLTU8ZClmb3IodmFyIGY9MDtmPGU7KytmKWJbZl09Y1tmXS9kO2Vsc2UgZm9yKHZhciBmPTA7ZjxlOysrZiliW2ZdPTA7cmV0dXJuIGJ9LG09ZnVuY3Rpb24oYyxkLGEpe3JldHVybiBjWzBdPWRbMV0qYVsyXS1kWzJdKmFbMV0sY1sxXT1kWzJdKmFbMF0tZFswXSphWzJdLGNbMl09ZFswXSphWzFdLWRbMV0qYVswXSxjfSxuPWZ1bmN0aW9uKGMsZCxhKXtmb3IodmFyIGI9ZC5sZW5ndGgsZT0wO2U8YjsrK2UpY1tlXT1kW2VdLWFbZV07cmV0dXJuIGN9LG89ZnVuY3Rpb24oYyxhKXtyZXR1cm4gY1swXSphWzBdK2NbMV0qYVsxXStjWzJdKmFbMl19O3JldHVybiBiLmxvb2tBdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixmLGcpe3ZhciBoPWMsaT1kLGo9bChoLG4oaCxiLnYsZi52KSksaz1sKGksbShpLGcudixqKSkscD1tKGUsaixrKSxxPWEudjtyZXR1cm4gcVswXT1rWzBdLHFbMV09cFswXSxxWzJdPWpbMF0scVszXT0wLHFbNF09a1sxXSxxWzVdPXBbMV0scVs2XT1qWzFdLHFbN109MCxxWzhdPWtbMl0scVs5XT1wWzJdLHFbMTBdPWpbMl0scVsxMV09MCxxWzEyXT0tbyhrLGIudikscVsxM109LW8ocCxiLnYpLHFbMTRdPS1vKGosYi52KSxxWzE1XT0xLGF9KSxiLnBlcnNwZWN0aXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjLGQsZSxnKXt2YXIgaD1NYXRoLnRhbixpPWgoLjUqYS0uNSooYyphLzE4MCkpLGY9MS8oZS1nKSxqPWIudjtyZXR1cm4galswXT1pL2QsalsxXT0wLGpbMl09MCxqWzNdPTAsals0XT0wLGpbNV09aSxqWzZdPTAsals3XT0wLGpbOF09MCxqWzldPTAsalsxMF09KGUrZykqZixqWzExXT0tMSxqWzEyXT0wLGpbMTNdPTAsalsxNF09MiooZSpnKmYpLGpbMTVdPTAsYn0pLGIucm90YXRpb25ZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixkKXt2YXIgZT1NYXRoLnNpbixmPU1hdGguY29zLGc9Yi52LGg9ZihkKmEvMTgwKSxjPWUoZCphLzE4MCk7cmV0dXJuIGdbMF09aCxnWzFdPTAsZ1syXT0tYyxnWzNdPTAsZ1s0XT0wLGdbNV09MSxnWzZdPTAsZ1s3XT0wLGdbOF09YyxnWzldPTAsZ1sxMF09aCxnWzExXT0wLGdbMTJdPTAsZ1sxM109MCxnWzE0XT0wLGdbMTVdPTEsYn0pLGIuaWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnY7cmV0dXJuIGJbMF09MSxiWzFdPTAsYlsyXT0wLGJbM109MCxiWzRdPTAsYls1XT0xLGJbNl09MCxiWzddPTAsYls4XT0wLGJbOV09MCxiWzEwXT0xLGJbMTFdPTAsYlsxMl09MCxiWzEzXT0wLGJbMTRdPTAsYlsxNV09MSxhfSksYi5tdWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihjLGQsZSl7dmFyIGY9Yy52LGc9ZC52LGE9ZS52LGI9Z1swXSxoPWdbMV0saT1nWzJdLGo9Z1szXSxrPWdbNF0sbD1nWzVdLG09Z1s2XSxuPWdbN10sbz1nWzhdLHA9Z1s5XSxxPWdbMTBdLHI9Z1sxMV0scz1nWzEyXSx0PWdbMTNdLHU9Z1sxNF0sdj1nWzE1XSx3PWFbMF0seD1hWzFdLHk9YVsyXSx6PWFbM10sQT1hWzRdLEI9YVs1XSxDPWFbNl0sRD1hWzddLEU9YVs4XSxGPWFbOV0sRz1hWzEwXSxIPWFbMTFdLEk9YVsxMl0sSj1hWzEzXSxLPWFbMTRdLEw9YVsxNV07cmV0dXJuIGZbMF09Yip3K2gqQStpKkUraipJLGZbMV09Yip4K2gqQitpKkYraipKLGZbMl09Yip5K2gqQytpKkcraipLLGZbM109Yip6K2gqRCtpKkgraipMLGZbNF09ayp3K2wqQSttKkUrbipJLGZbNV09ayp4K2wqQittKkYrbipKLGZbNl09ayp5K2wqQyttKkcrbipLLGZbN109ayp6K2wqRCttKkgrbipMLGZbOF09byp3K3AqQStxKkUrcipJLGZbOV09byp4K3AqQitxKkYrcipKLGZbMTBdPW8qeStwKkMrcSpHK3IqSyxmWzExXT1vKnorcCpEK3EqSCtyKkwsZlsxMl09cyp3K3QqQSt1KkUrdipJLGZbMTNdPXMqeCt0KkIrdSpGK3YqSixmWzE0XT1zKnkrdCpDK3UqRyt2KkssZlsxNV09cyp6K3QqRCt1KkgrdipMLGN9KSxiLmludmVydD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LGU9Yi52LGY9ZVswXSxnPWVbMV0saD1lWzJdLGk9ZVszXSxqPWVbNF0saz1lWzVdLGw9ZVs2XSxtPWVbN10sbj1lWzhdLG89ZVs5XSxwPWVbMTBdLHE9ZVsxMV0scj1lWzEyXSxzPWVbMTNdLHQ9ZVsxNF0sdT1lWzE1XSx2PXAqdSx3PXQqcSx4PWwqdSx5PXQqbSx6PWwqcSxBPXAqbSxCPWgqdSxDPXQqaSxEPWgqcSxFPXAqaSxGPWgqbSxHPWwqaSxIPW4qcyxJPXIqbyxKPWoqcyxLPXIqayxMPWoqbyxNPW4qayxOPWYqcyxPPXIqZyxQPWYqbyxRPW4qZyxSPWYqayxTPWoqZyxUPXYqayt5Km8reipzLSh3KmsreCpvK0EqcyksVT13KmcrQipvK0Uqcy0odipnK0MqbytEKnMpLFY9eCpnK0MqaytGKnMtKHkqZytCKmsrRypzKSxXPUEqZytEKmsrRypvLSh6KmcrRSprK0YqbyksWD0xLyhmKlQraipVK24qVityKlcpO3JldHVybiBjWzBdPVgqVCxjWzFdPVgqVSxjWzJdPVgqVixjWzNdPVgqVyxjWzRdPVgqKHcqait4Km4rQSpyLSh2KmoreSpuK3oqcikpLGNbNV09WCoodipmK0MqbitEKnItKHcqZitCKm4rRSpyKSksY1s2XT1YKih5KmYrQipqK0cqci0oeCpmK0MqaitGKnIpKSxjWzddPVgqKHoqZitFKmorRipuLShBKmYrRCpqK0cqbikpLGNbOF09WCooSCptK0sqcStMKnUtKEkqbStKKnErTSp1KSksY1s5XT1YKihJKmkrTipxK1EqdS0oSCppK08qcStQKnUpKSxjWzEwXT1YKihKKmkrTyptK1IqdS0oSyppK04qbStTKnUpKSxjWzExXT1YKihNKmkrUCptK1MqcS0oTCppK1EqbStSKnEpKSxjWzEyXT1YKihKKnArTSp0K0kqbC0oTCp0K0gqbCtLKnApKSxjWzEzXT1YKihQKnQrSCpoK08qcC0oTipwK1EqdCtJKmgpKSxjWzE0XT1YKihOKmwrUyp0K0sqaC0oUip0K0oqaCtPKmwpKSxjWzE1XT1YKihSKnArTCpoK1EqbC0oUCpsK1MqcCtNKmgpKSxhfSksYi50cmFuc3Bvc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hLnYsZD1iLnYsZT0wOzQ+ZTsrK2UpZm9yKHZhciBmPTA7ND5mOysrZiljWzQqZStmXT1kWzQqZitlXTtyZXR1cm4gY30pLGJ9O1wiLFwic3JjL2xpYi93ZWJnbC9tb2RlbHMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbihhKXt2YXIgYz17fSxkPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9Y3x8Z2wuQVJSQVlfQlVGRkVSLGU9Z2wuY3JlYXRlQnVmZmVyKCk7aWYodGhpcy50YXJnZXQ9ZCx0aGlzLmJ1Zj1lLHRoaXMuc2V0KGEpLHRoaXMubnVtQ29tcG9uZW50c189YS5udW1Db21wb25lbnRzLHRoaXMubnVtRWxlbWVudHNfPWEubnVtRWxlbWVudHMsdGhpcy50b3RhbENvbXBvbmVudHNfPXRoaXMubnVtQ29tcG9uZW50c18qdGhpcy5udW1FbGVtZW50c18sYS5idWZmZXIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpdGhpcy50eXBlXz1nbC5GTE9BVDtlbHNlIGlmKGEuYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSl0aGlzLnR5cGVfPWdsLlVOU0lHTkVEX0JZVEU7ZWxzZSBpZihhLmJ1ZmZlciBpbnN0YW5jZW9mIEludDhBcnJheSl0aGlzLnR5cGVfPWdsLl9CWVRFO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBVaW50MTZBcnJheSl0aGlzLnR5cGVfPWdsLlVOU0lHTkVEX1NIT1JUO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBJbnQxNkFycmF5KXRoaXMudHlwZV89Z2wuU0hPUlQ7ZWxzZSB0aHJvd1xcXCJ1bmhhbmRsZWQgdHlwZTpcXFwiK3R5cGVvZiBhLmJ1ZmZlcn07cmV0dXJuIGQucHJvdG90eXBlLnNldD1mdW5jdGlvbihhKXtnbC5iaW5kQnVmZmVyKHRoaXMudGFyZ2V0LHRoaXMuYnVmKSxnbC5idWZmZXJEYXRhKHRoaXMudGFyZ2V0LGEuYnVmZmVyLGdsLlNUQVRJQ19EUkFXKX0sZC5wcm90b3R5cGUudHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGVffSxkLnByb3RvdHlwZS5udW1Db21wb25lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtQ29tcG9uZW50c199LGQucHJvdG90eXBlLm51bUVsZW1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtRWxlbWVudHNffSxkLnByb3RvdHlwZS50b3RhbENvbXBvbmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b3RhbENvbXBvbmVudHNffSxkLnByb3RvdHlwZS5idWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWZ9LGQucHJvdG90eXBlLnN0cmlkZT1mdW5jdGlvbigpe3JldHVybiAwfSxkLnByb3RvdHlwZS5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sYy5Nb2RlbD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGMsZnVuY3Rpb24oYyxlKXtlLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYyxlLGYsZyl7Yy5idWZmZXJzPXt9O3ZhciBoPWZ1bmN0aW9uKGEsZSl7dmFyIGY9XFxcImluZGljZXNcXFwiPT1hP2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSOmdsLkFSUkFZX0JVRkZFUjtiPWMuYnVmZmVyc1thXSxiP2Iuc2V0KGUpOmI9bmV3IGQoZSxmKSxjLmJ1ZmZlcnNbYV09Yn07Zm9yKGEgaW4gZiloKGEsZlthXSk7dmFyIGk9e30saj0wO2Zvcih2YXIgayBpbiBnKWlba109aisrO2MubW9kZT1nbC5UUklBTkdMRVMsYy50ZXh0dXJlcz1nLnYsYy50ZXh0dXJlVW5pdHM9aSxjLnNoYWRlcj1lfSksZS5kcmF3UHJlcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5zaGFkZXIsZT1hLmJ1ZmZlcnMsZj1hLnRleHR1cmVzO2Zvcih2YXIgZyBpbiBjPVNrLmZmaS5yZW1hcFRvSnMoYyksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQudXNlLFtkXSksZSl7dmFyIGg9ZVtnXTtpZihcXFwiaW5kaWNlc1xcXCI9PWcpZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUixoLmJ1ZmZlcigpKTtlbHNle3ZhciBpPWQuYXR0cmliW2ddO2kmJmkoaCl9fWZvcih2YXIgaiBpbiBmKXt2YXIgaz1hLnRleHR1cmVVbml0c1tqXTtkLnNldFVuaWZvcm0kaW1wbChkLHRleHR1ZXIsayksZltqXS5iaW5kVG9Vbml0KGspfWZvcih2YXIgbCBpbiBjKWQuc2V0VW5pZm9ybSRpbXBsKGQsbCxjW2xdKX0pLGUuZHJhdz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1hLnNoYWRlcjtmb3IodW5pZm9ybSBpbiBjPVNrLmZmaS5yZW1hcFRvSnMoYyksYyllLnNldFVuaWZvcm0kaW1wbChlLHVuaWZvcm0sY1t1bmlmb3JtXSk7aWYoZClmb3IodmFyIGYgaW4gZCl7dmFyIGc9YS50ZXh0dXJlVW5pdHNbZl07ZS5zZXRVbmlmb3JtJGltcGwoZSxmLGcpLGRbZl0uYmluZFRvVW5pdChnKX12YXIgaD1hLmJ1ZmZlcnM7Z2wuZHJhd0VsZW1lbnRzKGEubW9kZSxoLmluZGljZXMudG90YWxDb21wb25lbnRzKCksZ2wuVU5TSUdORURfU0hPUlQsMCl9KX0sXFxcIk1vZGVsXFxcIixbXSksY307XCIsXCJzcmMvbGliL3dlYmdsL3ByaW1pdGl2ZXMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9LGI9ZnVuY3Rpb24oYSxiLGMpe2M9Y3x8XFxcIkZsb2F0MzJBcnJheVxcXCI7dmFyIGQ9d2luZG93W2NdO2IubGVuZ3RoPyh0aGlzLmJ1ZmZlcj1uZXcgZChiKSxiPXRoaXMuYnVmZmVyLmxlbmd0aC9hLHRoaXMuY3Vyc29yPWIpOih0aGlzLmJ1ZmZlcj1uZXcgZChhKmIpLHRoaXMuY3Vyc29yPTApLHRoaXMubnVtQ29tcG9uZW50cz1hLHRoaXMubnVtRWxlbWVudHM9Yix0aGlzLnR5cGU9Y307cmV0dXJuIGIucHJvdG90eXBlLnN0cmlkZT1mdW5jdGlvbigpe3JldHVybiAwfSxiLnByb3RvdHlwZS5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sYi5wcm90b3R5cGUuZ2V0RWxlbWVudD1mdW5jdGlvbihhKXtmb3IodmFyIGI9YSp0aGlzLm51bUNvbXBvbmVudHMsYz1bXSxkPTA7ZDx0aGlzLm51bUNvbXBvbmVudHM7KytkKWMucHVzaCh0aGlzLmJ1ZmZlcltiK2RdKTtyZXR1cm4gY30sYi5wcm90b3R5cGUuc2V0RWxlbWVudD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hKnRoaXMubnVtQ29tcG9uZW50cyxkPTA7ZDx0aGlzLm51bUNvbXBvbmVudHM7KytkKXRoaXMuYnVmZmVyW2MrZF09YltkXX0sYi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgYih0aGlzLm51bUNvbXBvbmVudHMsdGhpcy5udW1FbGVtZW50cyx0aGlzLnR5cGUpO3JldHVybiBhLnB1c2hBcnJheSh0aGlzKSxhfSxiLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXMuc2V0RWxlbWVudCh0aGlzLmN1cnNvcisrLGEpfSxiLnByb3RvdHlwZS5wdXNoQXJyYXk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7YjxhLm51bUVsZW1lbnRzOysrYil0aGlzLnB1c2goYS5nZXRFbGVtZW50KGIpKX0sYi5wcm90b3R5cGUucHVzaEFycmF5V2l0aE9mZnNldD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTA7ZDxhLm51bUVsZW1lbnRzOysrZCl7Yz1hLmdldEVsZW1lbnQoZCk7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDsrK2UpY1tlXSs9YltlXTt0aGlzLnB1c2goYyl9fSxiLnByb3RvdHlwZS5jb21wdXRlRXh0ZW50cz1mdW5jdGlvbigpe2Zvcih2YXIgYT1NYXRoLm1heCxiPU1hdGgubWluLGMsZD10aGlzLm51bUVsZW1lbnRzLGU9dGhpcy5udW1Db21wb25lbnRzLGY9dGhpcy5nZXRFbGVtZW50KDApLGc9dGhpcy5nZXRFbGVtZW50KDApLGg9MTtoPGQ7KytoKXtjPXRoaXMuZ2V0RWxlbWVudChoKTtmb3IodmFyIGk9MDtpPGU7KytpKWZbaV09YihmW2ldLGNbaV0pLGdbaV09YShnW2ldLGNbaV0pfXJldHVybnttaW46ZixtYXg6Z319LGEuY3JlYXRlQ3ViZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPVtbMyw3LDUsMV0sWzAsNCw2LDJdLFs2LDcsMywyXSxbMCwxLDUsNF0sWzUsNyw2LDRdLFsyLDMsMSwwXV0sZT1hLzIsZz1bWy1lLC1lLC1lXSxbK2UsLWUsLWVdLFstZSwrZSwtZV0sWytlLCtlLC1lXSxbLWUsLWUsK2VdLFsrZSwtZSwrZV0sWy1lLCtlLCtlXSxbK2UsK2UsK2VdXSxoPVtbMSwwLDBdLFstMSwwLDBdLFswLDEsMF0sWzAsLTEsMF0sWzAsMCwxXSxbMCwwLC0xXV0saT1bWzAsMF0sWzEsMF0sWzEsMV0sWzAsMV1dLGo9MjQsaz1uZXcgYigzLGopLGw9bmV3IGIoMyxqKSxtPW5ldyBiKDIsaiksbj1uZXcgYigzLDEyLFxcXCJVaW50MTZBcnJheVxcXCIpLG89MDs2Pm87KytvKXtjPWRbb107Zm9yKHZhciBwPTA7ND5wOysrcCl7dmFyIHE9Z1tjW3BdXSxyPWhbb10scz1pW3BdO2sucHVzaChxKSxsLnB1c2gociksbS5wdXNoKHMpfXZhciB0PTQqbztuLnB1c2goW3QrMCx0KzEsdCsyXSksbi5wdXNoKFt0KzAsdCsyLHQrM10pfXJldHVybntwb3NpdGlvbjprLG5vcm1hbDpsLHRleENvb3JkOm0saW5kaWNlczpufX0pLGF9O1wiLFwic3JjL2xpYi93aGljaGRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3aGljaGRiIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd3NnaXJlZi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwid3NnaXJlZiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3hkcmxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieGRybGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ4bWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvZG9tL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkb20gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvZXRyZWUvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImV0cmVlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL3BhcnNlcnMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBhcnNlcnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvc2F4L19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzYXggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWxsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInhtbGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbHJwY2xpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieG1scnBjbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvemlwZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiemlwZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCJ9fSIsIihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0Jzt2YXIgJGpzY29tcD0kanNjb21wfHx7fTskanNjb21wLnNjb3BlPXt9OyRqc2NvbXAuQVNTVU1FX0VTNT0hMTskanNjb21wLkFTU1VNRV9OT19OQVRJVkVfTUFQPSExOyRqc2NvbXAuQVNTVU1FX05PX05BVElWRV9TRVQ9ITE7JGpzY29tcC5TSU1QTEVfRlJPVU5EX1BPTFlGSUxMPSExOyRqc2NvbXAuZGVmaW5lUHJvcGVydHk9JGpzY29tcC5BU1NVTUVfRVM1fHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24obSxxLGEpe20hPUFycmF5LnByb3RvdHlwZSYmbSE9T2JqZWN0LnByb3RvdHlwZSYmKG1bcV09YS52YWx1ZSl9OyRqc2NvbXAuZ2V0R2xvYmFsPWZ1bmN0aW9uKG0pe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdz09PW0/bTpcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOm19OyRqc2NvbXAuZ2xvYmFsPSRqc2NvbXAuZ2V0R2xvYmFsKHRoaXMpO1xuJGpzY29tcC5wb2x5ZmlsbD1mdW5jdGlvbihtLHEsYSxjKXtpZihxKXthPSRqc2NvbXAuZ2xvYmFsO209bS5zcGxpdChcIi5cIik7Zm9yKGM9MDtjPG0ubGVuZ3RoLTE7YysrKXt2YXIgYj1tW2NdO2IgaW4gYXx8KGFbYl09e30pO2E9YVtiXX1tPW1bbS5sZW5ndGgtMV07Yz1hW21dO3E9cShjKTtxIT1jJiZudWxsIT1xJiYkanNjb21wLmRlZmluZVByb3BlcnR5KGEsbSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnF9KX19OyRqc2NvbXAucG9seWZpbGwoXCJBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0sYSl7dmFyIGM9dGhpcztjIGluc3RhbmNlb2YgU3RyaW5nJiYoYz1TdHJpbmcoYykpO3ZhciBiPWMubGVuZ3RoO2E9YXx8MDtmb3IoMD5hJiYoYT1NYXRoLm1heChhK2IsMCkpO2E8YjthKyspe3ZhciBlPWNbYV07aWYoZT09PW18fE9iamVjdC5pcyhlLG0pKXJldHVybiEwfXJldHVybiExfX0sXCJlczdcIixcImVzM1wiKTtcbiRqc2NvbXAub3ducz1mdW5jdGlvbihtLHEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxxKX07JGpzY29tcC5wb2x5ZmlsbChcIk9iamVjdC5lbnRyaWVzXCIsZnVuY3Rpb24obSl7cmV0dXJuIG0/bTpmdW5jdGlvbihtKXt2YXIgYT1bXSxjO2ZvcihjIGluIG0pJGpzY29tcC5vd25zKG0sYykmJmEucHVzaChbYyxtW2NdXSk7cmV0dXJuIGF9fSxcImVzOFwiLFwiZXMzXCIpO1xuJGpzY29tcC5jaGVja1N0cmluZ0FyZ3M9ZnVuY3Rpb24obSxxLGEpe2lmKG51bGw9PW0pdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSAndGhpcycgdmFsdWUgZm9yIFN0cmluZy5wcm90b3R5cGUuXCIrYStcIiBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZFwiKTtpZihxIGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoXCJGaXJzdCBhcmd1bWVudCB0byBTdHJpbmcucHJvdG90eXBlLlwiK2ErXCIgbXVzdCBub3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb25cIik7cmV0dXJuIG0rXCJcIn07JGpzY29tcC5zdHJpbmdQYWRkaW5nPWZ1bmN0aW9uKG0scSl7bT12b2lkIDAhPT1tP1N0cmluZyhtKTpcIiBcIjtyZXR1cm4gMDxxJiZtP20ucmVwZWF0KE1hdGguY2VpbChxL20ubGVuZ3RoKSkuc3Vic3RyaW5nKDAscSk6XCJcIn07XG4kanNjb21wLnBvbHlmaWxsKFwiU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydFwiLGZ1bmN0aW9uKG0pe3JldHVybiBtP206ZnVuY3Rpb24obSxhKXt2YXIgYz0kanNjb21wLmNoZWNrU3RyaW5nQXJncyh0aGlzLG51bGwsXCJwYWRTdGFydFwiKTtyZXR1cm4gJGpzY29tcC5zdHJpbmdQYWRkaW5nKGEsbS1jLmxlbmd0aCkrY319LFwiZXM4XCIsXCJlczNcIik7JGpzY29tcC5wb2x5ZmlsbChcIk9iamVjdC52YWx1ZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0pe3ZhciBhPVtdLGM7Zm9yKGMgaW4gbSkkanNjb21wLm93bnMobSxjKSYmYS5wdXNoKG1bY10pO3JldHVybiBhfX0sXCJlczhcIixcImVzM1wiKTskanNjb21wLmFycmF5SXRlcmF0b3JJbXBsPWZ1bmN0aW9uKG0pe3ZhciBxPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHE8bS5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6bVtxKytdfTp7ZG9uZTohMH19fTskanNjb21wLmFycmF5SXRlcmF0b3I9ZnVuY3Rpb24obSl7cmV0dXJue25leHQ6JGpzY29tcC5hcnJheUl0ZXJhdG9ySW1wbChtKX19O1xuJGpzY29tcC5TWU1CT0xfUFJFRklYPVwianNjb21wX3N5bWJvbF9cIjskanNjb21wLmluaXRTeW1ib2w9ZnVuY3Rpb24oKXskanNjb21wLmluaXRTeW1ib2w9ZnVuY3Rpb24oKXt9OyRqc2NvbXAuZ2xvYmFsLlN5bWJvbHx8KCRqc2NvbXAuZ2xvYmFsLlN5bWJvbD0kanNjb21wLlN5bWJvbCl9OyRqc2NvbXAuU3ltYm9sQ2xhc3M9ZnVuY3Rpb24obSxxKXt0aGlzLiRqc2NvbXAkc3ltYm9sJGlkXz1tOyRqc2NvbXAuZGVmaW5lUHJvcGVydHkodGhpcyxcImRlc2NyaXB0aW9uXCIse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpxfSl9OyRqc2NvbXAuU3ltYm9sQ2xhc3MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGpzY29tcCRzeW1ib2wkaWRffTtcbiRqc2NvbXAuU3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbShhKXtpZih0aGlzIGluc3RhbmNlb2YgbSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yXCIpO3JldHVybiBuZXcgJGpzY29tcC5TeW1ib2xDbGFzcygkanNjb21wLlNZTUJPTF9QUkVGSVgrKGF8fFwiXCIpK1wiX1wiK3ErKyxhKX12YXIgcT0wO3JldHVybiBtfSgpO1xuJGpzY29tcC5pbml0U3ltYm9sSXRlcmF0b3I9ZnVuY3Rpb24oKXskanNjb21wLmluaXRTeW1ib2woKTt2YXIgbT0kanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3I7bXx8KG09JGpzY29tcC5nbG9iYWwuU3ltYm9sLml0ZXJhdG9yPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbChcIlN5bWJvbC5pdGVyYXRvclwiKSk7XCJmdW5jdGlvblwiIT10eXBlb2YgQXJyYXkucHJvdG90eXBlW21dJiYkanNjb21wLmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSxtLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gJGpzY29tcC5pdGVyYXRvclByb3RvdHlwZSgkanNjb21wLmFycmF5SXRlcmF0b3JJbXBsKHRoaXMpKX19KTskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcj1mdW5jdGlvbigpe319O1xuJGpzY29tcC5pbml0U3ltYm9sQXN5bmNJdGVyYXRvcj1mdW5jdGlvbigpeyRqc2NvbXAuaW5pdFN5bWJvbCgpO3ZhciBtPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5hc3luY0l0ZXJhdG9yO218fChtPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5hc3luY0l0ZXJhdG9yPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbChcIlN5bWJvbC5hc3luY0l0ZXJhdG9yXCIpKTskanNjb21wLmluaXRTeW1ib2xBc3luY0l0ZXJhdG9yPWZ1bmN0aW9uKCl7fX07JGpzY29tcC5pdGVyYXRvclByb3RvdHlwZT1mdW5jdGlvbihtKXskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcigpO209e25leHQ6bX07bVskanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3JldHVybiBtfTtcbiRqc2NvbXAuaXRlcmF0b3JGcm9tQXJyYXk9ZnVuY3Rpb24obSxxKXskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcigpO20gaW5zdGFuY2VvZiBTdHJpbmcmJihtKz1cIlwiKTt2YXIgYT0wLGM9e25leHQ6ZnVuY3Rpb24oKXtpZihhPG0ubGVuZ3RoKXt2YXIgYj1hKys7cmV0dXJue3ZhbHVlOnEoYixtW2JdKSxkb25lOiExfX1jLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fTtyZXR1cm4gYy5uZXh0KCl9fTtjW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gY307cmV0dXJuIGN9OyRqc2NvbXAucG9seWZpbGwoXCJBcnJheS5wcm90b3R5cGUudmFsdWVzXCIsZnVuY3Rpb24obSl7cmV0dXJuIG0/bTpmdW5jdGlvbigpe3JldHVybiAkanNjb21wLml0ZXJhdG9yRnJvbUFycmF5KHRoaXMsZnVuY3Rpb24obSxhKXtyZXR1cm4gYX0pfX0sXCJlczhcIixcImVzM1wiKTtcbihmdW5jdGlvbihtKXtmdW5jdGlvbiBxKGMpe2lmKGFbY10pcmV0dXJuIGFbY10uZXhwb3J0czt2YXIgYj1hW2NdPXtpOmMsbDohMSxleHBvcnRzOnt9fTttW2NdLmNhbGwoYi5leHBvcnRzLGIsYi5leHBvcnRzLHEpO2IubD0hMDtyZXR1cm4gYi5leHBvcnRzfXZhciBhPXt9O3EubT1tO3EuYz1hO3EuZD1mdW5jdGlvbihhLGIsZSl7cS5vKGEsYil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2VudW1lcmFibGU6ITAsZ2V0OmV9KX07cS5yPWZ1bmN0aW9uKGEpe1widW5kZWZpbmVkXCIhPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfTtxLnQ9ZnVuY3Rpb24oYSxiKXtiJjEmJihhPXEoYSkpO2lmKGImOHx8YiY0JiZcIm9iamVjdFwiPT09dHlwZW9mIGEmJmEmJmEuX19lc01vZHVsZSlyZXR1cm4gYTtcbnZhciBjPU9iamVjdC5jcmVhdGUobnVsbCk7cS5yKGMpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmF9KTtpZihiJjImJlwic3RyaW5nXCIhPXR5cGVvZiBhKWZvcih2YXIgZiBpbiBhKXEuZChjLGYsZnVuY3Rpb24oYil7cmV0dXJuIGFbYl19LmJpbmQobnVsbCxmKSk7cmV0dXJuIGN9O3Eubj1mdW5jdGlvbihhKXt2YXIgYj1hJiZhLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gYVtcImRlZmF1bHRcIl19OmZ1bmN0aW9uKCl7cmV0dXJuIGF9O3EuZChiLFwiYVwiLGIpO3JldHVybiBifTtxLm89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYil9O3EucD1cIlwiO3JldHVybiBxKHEucz0xKX0pKFtmdW5jdGlvbihtLHEpe3E9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7cT1xfHwobmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikpKCl9Y2F0Y2goYSl7XCJvYmplY3RcIj09PVxudHlwZW9mIHdpbmRvdyYmKHE9d2luZG93KX1tLmV4cG9ydHM9cX0sZnVuY3Rpb24obSxxLGEpe2EoMik7U2suZ2xvYmFsLnN0cmZ0aW1lPWEoMyk7U2suZ2xvYmFsLnN0cnB0aW1lPWEoNCk7YSg1KTthKDcpO2EoOSk7YSgxMCk7YSgxMSk7YSgxMik7YSgxMyk7YSgxNCk7YSgxNSk7YSgxNik7YSgxNyk7YSgxOCk7W1NrLmJ1aWx0aW4ub2JqZWN0LFNrLmJ1aWx0aW4udHlwZV0uZm9yRWFjaChhPT57U2suYWJzdHIuc2V0VXBTbG90cyhhKTtTay5hYnN0ci5zZXRVcE1ldGhvZHMoYSk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGEpfSk7YSgxOSk7YSgyMCk7YSgyMSk7W1NrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW4ubm9uZSxTay5idWlsdGluLk5vdEltcGxlbWVudGVkLFNrLmJ1aWx0aW4ub2JqZWN0XS5mb3JFYWNoKGE9PnthPWEucHJvdG90eXBlO2EuX19kb2NfXz1hLmhhc093blByb3BlcnR5KFwidHAkZG9jXCIpP25ldyBTay5idWlsdGluLnN0cihhLnRwJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfSk7XG5hKDIyKTthKDIzKTthKDI0KTthKDI1KTthKDI2KTthKDI3KTthKDI4KTthKDI5KTthKDMxKTthKDMyKTthKDMzKTthKDM0KTthKDM1KTthKDM2KTthKDM3KTthKDM4KTthKDM5KTthKDQwKTthKDQxKTthKDQyKTthKDQzKTthKDQ0KTthKDQ1KTthKDQ2KTthKDQ3KTthKDQ4KTthKDQ5KTthKDUwKTthKDUxKTthKDUyKTthKDUzKTthKDU0KTthKDU1KTthKDU2KTthKDU3KTthKDU4KTthKDU5KTthKDYwKTthKDYxKTthKDYyKTthKDYzKTthKDY0KTthKDY1KX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhKXt2YXIgYj17YnVpbGQ6e2dpdGhhc2g6XCIzNDg0N2VjNzVjZTIxMjc0MTM5MzgyNzI1ODA2NTAxMDA0NjMyODE5XCIsZGF0ZTpcIjIwMjEtMDYtMDdUMTU6NDY6MDAuODA0WlwifX07Yi5nbG9iYWw9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBhP2E6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBzZWxmP3NlbGY6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3c/d2luZG93Ont9O2IuZXhwb3J0U3ltYm9sPVxuZnVuY3Rpb24oYSxjKXthPWEuc3BsaXQoXCIuXCIpO3ZhciBlPWIuZ2xvYmFsLGY7Zm9yKGY9MDtmPGEubGVuZ3RoLTE7ZisrKXt2YXIgZD1hW2ZdO2U9ZS5oYXNPd25Qcm9wZXJ0eShkKT9lW2RdOmVbZF09e319XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjJiYoZD1hW2ZdLGVbZF09Yyl9O2IuaXNBcnJheUxpa2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBBcnJheXx8YSYmYS5sZW5ndGgmJlwibnVtYmVyXCI9PXR5cGVvZiBhLmxlbmd0aD8hMDohMX07Yi5qc19iZWF1dGlmeT1mdW5jdGlvbihhKXtyZXR1cm4gYX07Yi5leHBvcnRTeW1ib2woXCJTa1wiLGIpO2IuZXhwb3J0U3ltYm9sKFwiU2suZ2xvYmFsXCIsYi5nbG9iYWwpO2IuZXhwb3J0U3ltYm9sKFwiU2suYnVpbGRcIixiLmJ1aWxkKTtiLmV4cG9ydFN5bWJvbChcIlNrLmV4cG9ydFN5bWJvbFwiLGIuZXhwb3J0U3ltYm9sKTtiLmV4cG9ydFN5bWJvbChcIlNrLmlzQXJyYXlMaWtlXCIsYi5pc0FycmF5TGlrZSk7Yi5leHBvcnRTeW1ib2woXCJTay5qc19iZWF1dGlmeVwiLFxuYi5qc19iZWF1dGlmeSl9KS5jYWxsKHRoaXMsYSgwKSl9LGZ1bmN0aW9uKG0scSl7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShrLG4sQSl7ZnVuY3Rpb24gcChhLGQsayxnKXtmb3IodmFyIHk9XCJcIixuPW51bGwsdj0hMSxMPWEubGVuZ3RoLEc9ITEsRT0wO0U8TDtFKyspe3ZhciBBPWEuY2hhckNvZGVBdChFKTtpZighMD09PXYpaWYoNDU9PT1BKW49XCJcIjtlbHNlIGlmKDk1PT09QSluPVwiIFwiO2Vsc2UgaWYoNDg9PT1BKW49XCIwXCI7ZWxzZSBpZig1OD09PUEpRyYmaChcIltXQVJOSU5HXSBkZXRlY3RlZCB1c2Ugb2YgdW5zdXBwb3J0ZWQgJTo6IG9yICU6OjogbW9kaWZpZXJzIHRvIHN0cmZ0aW1lXCIpLEc9ITA7ZWxzZXtzd2l0Y2goQSl7Y2FzZSAzNzp5Kz1cIiVcIjticmVhaztjYXNlIDY1OnkrPWsuZGF5c1tkLmdldERheSgpXTticmVhaztjYXNlIDY2OnkrPWsubW9udGhzW2QuZ2V0TW9udGgoKV07YnJlYWs7Y2FzZSA2Nzp5Kz1jKE1hdGguZmxvb3IoZC5nZXRGdWxsWWVhcigpLzEwMCksbik7XG5icmVhaztjYXNlIDY4OnkrPXAoay5mb3JtYXRzLkQsZCxrLGcpO2JyZWFrO2Nhc2UgNzA6eSs9cChrLmZvcm1hdHMuRixkLGssZyk7YnJlYWs7Y2FzZSA3Mjp5Kz1jKGQuZ2V0SG91cnMoKSxuKTticmVhaztjYXNlIDczOnkrPWMoZShkLmdldEhvdXJzKCkpLG4pO2JyZWFrO2Nhc2UgNzY6eSs9YihNYXRoLmZsb29yKGclMUUzKSk7YnJlYWs7Y2FzZSA3Nzp5Kz1jKGQuZ2V0TWludXRlcygpLG4pO2JyZWFrO2Nhc2UgODA6eSs9MTI+ZC5nZXRIb3VycygpP2suYW06ay5wbTticmVhaztjYXNlIDgyOnkrPXAoay5mb3JtYXRzLlIsZCxrLGcpO2JyZWFrO2Nhc2UgODM6eSs9YyhkLmdldFNlY29uZHMoKSxuKTticmVhaztjYXNlIDg0OnkrPXAoay5mb3JtYXRzLlQsZCxrLGcpO2JyZWFrO2Nhc2UgODU6eSs9YyhmKGQsXCJzdW5kYXlcIiksbik7YnJlYWs7Y2FzZSA4Nzp5Kz1jKGYoZCxcIm1vbmRheVwiKSxuKTticmVhaztjYXNlIDg4OnkrPXAoay5mb3JtYXRzLlgsZCxrLGcpO2JyZWFrO2Nhc2UgODk6eSs9XG5kLmdldEZ1bGxZZWFyKCk7YnJlYWs7Y2FzZSA5MDpEJiYwPT09Qj95Kz1cIkdNVFwiOihuPWQudG9TdHJpbmcoKS5tYXRjaCgvXFwoKFtcXHdcXHNdKylcXCkvKSx5Kz1uJiZuWzFdfHxcIlwiKTticmVhaztjYXNlIDk3OnkrPWsuc2hvcnREYXlzW2QuZ2V0RGF5KCldO2JyZWFrO2Nhc2UgOTg6eSs9ay5zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldO2JyZWFrO2Nhc2UgOTk6eSs9cChrLmZvcm1hdHMuYyxkLGssZyk7YnJlYWs7Y2FzZSAxMDA6eSs9YyhkLmdldERhdGUoKSxuKTticmVhaztjYXNlIDEwMTp5Kz1jKGQuZ2V0RGF0ZSgpLG51bGw9PW4/XCIgXCI6bik7YnJlYWs7Y2FzZSAxMDQ6eSs9ay5zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldO2JyZWFrO2Nhc2UgMTA2Om49bmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLDAsMSk7bj1NYXRoLmNlaWwoKGQuZ2V0VGltZSgpLW4uZ2V0VGltZSgpKS84NjRFNSk7eSs9YihuKTticmVhaztjYXNlIDEwNzp5Kz1jKGQuZ2V0SG91cnMoKSxudWxsPT1uP1wiIFwiOm4pO1xuYnJlYWs7Y2FzZSAxMDg6eSs9YyhlKGQuZ2V0SG91cnMoKSksbnVsbD09bj9cIiBcIjpuKTticmVhaztjYXNlIDEwOTp5Kz1jKGQuZ2V0TW9udGgoKSsxLG4pO2JyZWFrO2Nhc2UgMTEwOnkrPVwiXFxuXCI7YnJlYWs7Y2FzZSAxMTE6bj1kLmdldERhdGUoKTt5PWsub3JkaW5hbFN1ZmZpeGVzP3krKFN0cmluZyhuKSsoay5vcmRpbmFsU3VmZml4ZXNbbi0xXXx8bChuKSkpOnkrKFN0cmluZyhuKStsKG4pKTticmVhaztjYXNlIDExMjp5Kz0xMj5kLmdldEhvdXJzKCk/ay5BTTprLlBNO2JyZWFrO2Nhc2UgMTE0OnkrPXAoay5mb3JtYXRzLnIsZCxrLGcpO2JyZWFrO2Nhc2UgMTE1OnkrPU1hdGguZmxvb3IoZy8xRTMpO2JyZWFrO2Nhc2UgMTE2OnkrPVwiXFx0XCI7YnJlYWs7Y2FzZSAxMTc6bj1kLmdldERheSgpO3krPTA9PT1uPzc6bjticmVhaztjYXNlIDExODp5Kz1wKGsuZm9ybWF0cy52LGQsayxnKTticmVhaztjYXNlIDExOTp5Kz1kLmdldERheSgpO2JyZWFrO2Nhc2UgMTIwOnkrPXAoay5mb3JtYXRzLngsXG5kLGssZyk7YnJlYWs7Y2FzZSAxMjE6eSs9KFwiXCIrZC5nZXRGdWxsWWVhcigpKS5zbGljZSgyKTticmVhaztjYXNlIDEyMjpEJiYwPT09Qj95Kz1HP1wiKzAwOjAwXCI6XCIrMDAwMFwiOihuPTAhPT1CP0IvNkU0Oi1kLmdldFRpbWV6b25lT2Zmc2V0KCksdj1HP1wiOlwiOlwiXCIsQT1NYXRoLmFicyhuJTYwKSx5Kz0oMD5uP1wiLVwiOlwiK1wiKStjKE1hdGguZmxvb3IoTWF0aC5hYnMobi82MCkpKSt2K2MoQSkpO2JyZWFrO2RlZmF1bHQ6diYmKHkrPVwiJVwiKSx5Kz1hW0VdfW49bnVsbDt2PSExfWVsc2UgMzc9PT1BP3Y9ITA6eSs9YVtFXX1yZXR1cm4geX12YXIgdj1rfHxnLEI9bnx8MCxEPUF8fCExLEU9MCx1LG09ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgZD1iLmdldFRpbWUoKTtpZihEKXt2YXIgYz02RTQqKGIuZ2V0VGltZXpvbmVPZmZzZXQoKXx8MCk7Yj1uZXcgRGF0ZShkK2MrQik7NkU0KihiLmdldFRpbWV6b25lT2Zmc2V0KCl8fDApIT09YyYmKGI9NkU0KihiLmdldFRpbWV6b25lT2Zmc2V0KCl8fFxuMCksYj1uZXcgRGF0ZShkK2IrQikpfX1lbHNlIGQ9RGF0ZS5ub3coKSxkPkU/KEU9ZCx1PW5ldyBEYXRlKEUpLGQ9RSxEJiYodT1uZXcgRGF0ZShFKzZFNCoodS5nZXRUaW1lem9uZU9mZnNldCgpfHwwKStCKSkpOmQ9RSxiPXU7cmV0dXJuIHAoYSxiLHYsZCl9O20ubG9jYWxpemU9ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBhKGJ8fHYsQixEKX07bS5sb2NhbGl6ZUJ5SWRlbnRpZmllcj1mdW5jdGlvbihhKXt2YXIgYj1kW2FdO3JldHVybiBiP20ubG9jYWxpemUoYik6KGgoJ1tXQVJOSU5HXSBObyBsb2NhbGUgZm91bmQgd2l0aCBpZGVudGlmaWVyIFwiJythKydcIi4nKSxtKX07bS50aW1lem9uZT1mdW5jdGlvbihiKXt2YXIgZD1CLGM9RCxlPXR5cGVvZiBiO2lmKFwibnVtYmVyXCI9PT1lfHxcInN0cmluZ1wiPT09ZSljPSEwLFwic3RyaW5nXCI9PT1lPyhkPVwiLVwiPT09YlswXT8tMToxLGU9cGFyc2VJbnQoYi5zbGljZSgxLDMpLDEwKSxiPXBhcnNlSW50KGIuc2xpY2UoMyw1KSwxMCksZD1kKig2MCpcbmUrYikqNkU0KTpcIm51bWJlclwiPT09ZSYmKGQ9NkU0KmIpO3JldHVybiBuZXcgYSh2LGQsYyl9O20udXRjPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBhKHYsQiwhMCl9O3JldHVybiBtfWZ1bmN0aW9uIGMoYSxiKXtpZihcIlwiPT09Ynx8OTxhKXJldHVybiBhO251bGw9PWImJihiPVwiMFwiKTtyZXR1cm4gYithfWZ1bmN0aW9uIGIoYSl7cmV0dXJuIDk5PGE/YTo5PGE/XCIwXCIrYTpcIjAwXCIrYX1mdW5jdGlvbiBlKGEpe3JldHVybiAwPT09YT8xMjoxMjxhP2EtMTI6YX1mdW5jdGlvbiBmKGEsYil7Yj1ifHxcInN1bmRheVwiO3ZhciBkPWEuZ2V0RGF5KCk7XCJtb25kYXlcIj09PWImJigwPT09ZD9kPTY6ZC0tKTtiPURhdGUuVVRDKGEuZ2V0RnVsbFllYXIoKSwwLDEpO2E9RGF0ZS5VVEMoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSxhLmdldERhdGUoKSk7cmV0dXJuIE1hdGguZmxvb3IoKE1hdGguZmxvb3IoKGEtYikvODY0RTUpKzctZCkvNyl9ZnVuY3Rpb24gbChhKXt2YXIgYj1hJTEwO2ElPTEwMDtcbmlmKDExPD1hJiYxMz49YXx8MD09PWJ8fDQ8PWIpcmV0dXJuXCJ0aFwiO3N3aXRjaChiKXtjYXNlIDE6cmV0dXJuXCJzdFwiO2Nhc2UgMjpyZXR1cm5cIm5kXCI7Y2FzZSAzOnJldHVyblwicmRcIn19ZnVuY3Rpb24gaChhKXtcInVuZGVmaW5lZFwiIT09dHlwZW9mIGNvbnNvbGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKGEpfXZhciBkPXtkZV9ERTp7ZGF5czpcIlNvbm50YWcgTW9udGFnIERpZW5zdGFnIE1pdHR3b2NoIERvbm5lcnN0YWcgRnJlaXRhZyBTYW1zdGFnXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlNvIE1vIERpIE1pIERvIEZyIFNhXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhciBGZWJydWFyIE1cXHUwMGU0cnogQXByaWwgTWFpIEp1bmkgSnVsaSBBdWd1c3QgU2VwdGVtYmVyIE9rdG9iZXIgTm92ZW1iZXIgRGV6ZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1cXHUwMGU0ciBBcHIgTWFpIEp1biBKdWwgQXVnIFNlcCBPa3QgTm92IERlelwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQuJW0uJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LGVuX0NBOntkYXlzOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlY1wiLnNwbGl0KFwiIFwiKSxvcmRpbmFsU3VmZml4ZXM6XCJzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdFwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJXJcIix4OlwiJURcIn19LGVuX1VTOntkYXlzOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlY1wiLnNwbGl0KFwiIFwiKSxvcmRpbmFsU3VmZml4ZXM6XCJzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdFwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJW0vJWQvJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJXJcIix4OlwiJURcIn19LGVzX01YOntkYXlzOlwiZG9taW5nbyBsdW5lcyBtYXJ0ZXMgbWlcXHUwMGU5cmNvbGVzIGp1ZXZlcyB2aWVybmVzIHNcXHUwMGUxYmFkb1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJkb20gbHVuIG1hciBtaVxcdTAwZTkganVlIHZpZSBzXFx1MDBlMWJcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiZW5lcm87ZmVicmVybzttYXJ6bzthYnJpbDttYXlvO2p1bmlvO2p1bGlvO2Fnb3N0bztzZXB0aWVtYnJlO29jdHVicmU7bm92aWVtYnJlOyBkaWNpZW1icmVcIi5zcGxpdChcIjtcIiksc2hvcnRNb250aHM6XCJlbmUgZmViIG1hciBhYnIgbWF5IGp1biBqdWwgYWdvIHNlcCBvY3Qgbm92IGRpY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLFxuYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LGZyX0ZSOntkYXlzOlwiZGltYW5jaGUgbHVuZGkgbWFyZGkgbWVyY3JlZGkgamV1ZGkgdmVuZHJlZGkgc2FtZWRpXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcImRpbS4gbHVuLiBtYXIuIG1lci4gamV1LiB2ZW4uIHNhbS5cIi5zcGxpdChcIiBcIiksbW9udGhzOlwiamFudmllciBmXFx1MDBlOXZyaWVyIG1hcnMgYXZyaWwgbWFpIGp1aW4ganVpbGxldCBhb1xcdTAwZmJ0IHNlcHRlbWJyZSBvY3RvYnJlIG5vdmVtYnJlIGRcXHUwMGU5Y2VtYnJlXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiamFudi4gZlxcdTAwZTl2ci4gbWFycyBhdnJpbCBtYWkganVpbiBqdWlsLiBhb1xcdTAwZmJ0IHNlcHQuIG9jdC4gbm92LiBkXFx1MDBlOWMuXCIuc3BsaXQoXCIgXCIpLEFNOlwiQU1cIixcblBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0saXRfSVQ6e2RheXM6XCJkb21lbmljYSBsdW5lZFxcdTAwZWMgbWFydGVkXFx1MDBlYyBtZXJjb2xlZFxcdTAwZWMgZ2lvdmVkXFx1MDBlYyB2ZW5lcmRcXHUwMGVjIHNhYmF0b1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJkb20gbHVuIG1hciBtZXIgZ2lvIHZlbiBzYWJcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiZ2VubmFpbyBmZWJicmFpbyBtYXJ6byBhcHJpbGUgbWFnZ2lvIGdpdWdubyBsdWdsaW8gYWdvc3RvIHNldHRlbWJyZSBvdHRvYnJlIG5vdmVtYnJlIGRpY2VtYnJlXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwicHIgbWFnIGdpdSBsdWcgYWdvIHNldCBvdHQgbm92IGRpY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixcbnBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LG5sX05MOntkYXlzOlwiem9uZGFnIG1hYW5kYWcgZGluc2RhZyB3b2Vuc2RhZyBkb25kZXJkYWcgdnJpamRhZyB6YXRlcmRhZ1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJ6byBtYSBkaSB3byBkbyB2ciB6YVwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW51YXJpIGZlYnJ1YXJpIG1hYXJ0IGFwcmlsIG1laSBqdW5pIGp1bGkgYXVndXN0dXMgc2VwdGVtYmVyIG9rdG9iZXIgbm92ZW1iZXIgZGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJqYW4gZmViIG1ydCBhcHIgbWVpIGp1biBqdWwgYXVnIHNlcCBva3Qgbm92IGRlY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsXG5EOlwiJWQtJW0tJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LHB0X0JSOntkYXlzOlwiZG9taW5nbyBzZWd1bmRhIHRlclxcdTAwZTdhIHF1YXJ0YSBxdWludGEgc2V4dGEgc1xcdTAwZTFiYWRvXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIkRvbSBTZWcgVGVyIFF1YSBRdWkgU2V4IFNcXHUwMGUxYlwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW5laXJvIGZldmVyZWlybyBtYXJcXHUwMGU3byBhYnJpbCBtYWlvIGp1bmhvIGp1bGhvIGFnb3N0byBzZXRlbWJybyBvdXR1YnJvIG5vdmVtYnJvIGRlemVtYnJvXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiSmFuIEZldiBNYXIgQWJyIE1haSBKdW4gSnVsIEFnbyBTZXQgT3V0IE5vdiBEZXpcIi5zcGxpdChcIiBcIiksQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC0lbS0lWVwiLEY6XCIlWS0lbS0lZFwiLFxuUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSxydV9SVTp7ZGF5czpcIlxcdTA0MTJcXHUwNDNlXFx1MDQ0MVxcdTA0M2FcXHUwNDQwXFx1MDQzNVxcdTA0NDFcXHUwNDM1XFx1MDQzZFxcdTA0NGNcXHUwNDM1IFxcdTA0MWZcXHUwNDNlXFx1MDQzZFxcdTA0MzVcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDRjXFx1MDQzZFxcdTA0MzhcXHUwNDNhIFxcdTA0MTJcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNkXFx1MDQzOFxcdTA0M2EgXFx1MDQyMVxcdTA0NDBcXHUwNDM1XFx1MDQzNFxcdTA0MzAgXFx1MDQyN1xcdTA0MzVcXHUwNDQyXFx1MDQzMlxcdTA0MzVcXHUwNDQwXFx1MDQzMyBcXHUwNDFmXFx1MDQ0ZlxcdTA0NDJcXHUwNDNkXFx1MDQzOFxcdTA0NDZcXHUwNDMwIFxcdTA0MjFcXHUwNDQzXFx1MDQzMVxcdTA0MzFcXHUwNDNlXFx1MDQ0MlxcdTA0MzBcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiXFx1MDQxMlxcdTA0NDEgXFx1MDQxZlxcdTA0M2QgXFx1MDQxMlxcdTA0NDIgXFx1MDQyMVxcdTA0NDAgXFx1MDQyN1xcdTA0NDIgXFx1MDQxZlxcdTA0NDIgXFx1MDQyMVxcdTA0MzFcIi5zcGxpdChcIiBcIiksXG5tb250aHM6XCJcXHUwNDJmXFx1MDQzZFxcdTA0MzJcXHUwNDMwXFx1MDQ0MFxcdTA0NGMgXFx1MDQyNFxcdTA0MzVcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDNiXFx1MDQ0YyBcXHUwNDFjXFx1MDQzMFxcdTA0NDBcXHUwNDQyIFxcdTA0MTBcXHUwNDNmXFx1MDQ0MFxcdTA0MzVcXHUwNDNiXFx1MDQ0YyBcXHUwNDFjXFx1MDQzMFxcdTA0MzkgXFx1MDQxOFxcdTA0NGVcXHUwNDNkXFx1MDQ0YyBcXHUwNDE4XFx1MDQ0ZVxcdTA0M2JcXHUwNDRjIFxcdTA0MTBcXHUwNDMyXFx1MDQzM1xcdTA0NDNcXHUwNDQxXFx1MDQ0MiBcXHUwNDIxXFx1MDQzNVxcdTA0M2RcXHUwNDQyXFx1MDQ0ZlxcdTA0MzFcXHUwNDQwXFx1MDQ0YyBcXHUwNDFlXFx1MDQzYVxcdTA0NDJcXHUwNDRmXFx1MDQzMVxcdTA0NDBcXHUwNDRjIFxcdTA0MWRcXHUwNDNlXFx1MDQ0ZlxcdTA0MzFcXHUwNDQwXFx1MDQ0YyBcXHUwNDE0XFx1MDQzNVxcdTA0M2FcXHUwNDMwXFx1MDQzMVxcdTA0NDBcXHUwNDRjXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiXFx1MDQ0ZlxcdTA0M2RcXHUwNDMyIFxcdTA0NDRcXHUwNDM1XFx1MDQzMiBcXHUwNDNjXFx1MDQzMFxcdTA0NDAgXFx1MDQzMFxcdTA0M2ZcXHUwNDQwIFxcdTA0M2NcXHUwNDMwXFx1MDQzOSBcXHUwNDM4XFx1MDQ0ZVxcdTA0M2QgXFx1MDQzOFxcdTA0NGVcXHUwNDNiIFxcdTA0MzBcXHUwNDMyXFx1MDQzMyBcXHUwNDQxXFx1MDQzNVxcdTA0M2QgXFx1MDQzZVxcdTA0M2FcXHUwNDQyIFxcdTA0M2RcXHUwNDNlXFx1MDQ0ZiBcXHUwNDM0XFx1MDQzNVxcdTA0M2FcIi5zcGxpdChcIiBcIiksXG5BTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYXCIsRDpcIiVkLiVtLiV5XCIsRjpcIiVZLSVtLSVkXCIsUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSx0cl9UUjp7ZGF5czpcIlBhemFyIFBhemFydGVzaSBTYWxcXHUwMTMxIFxcdTAwYzdhclxcdTAxNWZhbWJhIFBlclxcdTAxNWZlbWJlIEN1bWEgQ3VtYXJ0ZXNpXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlBheiBQenQgU2FsIFxcdTAwYzdyXFx1MDE1ZiBQclxcdTAxNWYgQ3VtIEN0c1wiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJPY2FrIFxcdTAxNWV1YmF0IE1hcnQgTmlzYW4gTWF5XFx1MDEzMXMgSGF6aXJhbiBUZW1tdXogQVxcdTAxMWZ1c3RvcyBFeWxcXHUwMGZjbCBFa2ltIEthc1xcdTAxMzFtIEFyYWxcXHUwMTMxa1wiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIk9jYSBcXHUwMTVldWIgTWFyIE5pcyBNYXkgSGF6IFRlbSBBXFx1MDExZnUgRXlsIEVraSBLYXMgQXJhXCIuc3BsaXQoXCIgXCIpLFxuQU06XCJcXHUwMGQ2XFx1MDBkNlwiLFBNOlwiXFx1MDBkNlNcIixhbTpcIlxcdTAwZDZcXHUwMGQ2XCIscG06XCJcXHUwMGQ2U1wiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC0lbS0lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0semhfQ046e2RheXM6XCJcXHU2NjFmXFx1NjcxZlxcdTY1ZTUgXFx1NjYxZlxcdTY3MWZcXHU0ZTAwIFxcdTY2MWZcXHU2NzFmXFx1NGU4YyBcXHU2NjFmXFx1NjcxZlxcdTRlMDkgXFx1NjYxZlxcdTY3MWZcXHU1NmRiIFxcdTY2MWZcXHU2NzFmXFx1NGU5NCBcXHU2NjFmXFx1NjcxZlxcdTUxNmRcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiXFx1NjVlNVxcdTRlMDBcXHU0ZThjXFx1NGUwOVxcdTU2ZGJcXHU0ZTk0XFx1NTE2ZFwiLnNwbGl0KFwiXCIpLG1vbnRoczpcIlxcdTRlMDBcXHU2NzA4XFx1NGVmZCBcXHU0ZThjXFx1NjcwOFxcdTRlZmQgXFx1NGUwOVxcdTY3MDhcXHU0ZWZkIFxcdTU2ZGJcXHU2NzA4XFx1NGVmZCBcXHU0ZTk0XFx1NjcwOFxcdTRlZmQgXFx1NTE2ZFxcdTY3MDhcXHU0ZWZkIFxcdTRlMDNcXHU2NzA4XFx1NGVmZCBcXHU1MTZiXFx1NjcwOFxcdTRlZmQgXFx1NGU1ZFxcdTY3MDhcXHU0ZWZkIFxcdTUzNDFcXHU2NzA4XFx1NGVmZCBcXHU1MzQxXFx1NGUwMFxcdTY3MDhcXHU0ZWZkIFxcdTUzNDFcXHU0ZThjXFx1NjcwOFxcdTRlZmRcIi5zcGxpdChcIiBcIiksXG5zaG9ydE1vbnRoczpcIlxcdTRlMDBcXHU2NzA4IFxcdTRlOGNcXHU2NzA4IFxcdTRlMDlcXHU2NzA4IFxcdTU2ZGJcXHU2NzA4IFxcdTRlOTRcXHU2NzA4IFxcdTUxNmRcXHU2NzA4IFxcdTRlMDNcXHU2NzA4IFxcdTUxNmJcXHU2NzA4IFxcdTRlNWRcXHU2NzA4IFxcdTUzNDFcXHU2NzA4IFxcdTUzNDFcXHU0ZTAwXFx1NjcwOCBcXHU1MzQxXFx1NGU4Y1xcdTY3MDhcIi5zcGxpdChcIiBcIiksQU06XCJcXHU0ZTBhXFx1NTM0OFwiLFBNOlwiXFx1NGUwYlxcdTUzNDhcIixhbTpcIlxcdTRlMGFcXHU1MzQ4XCIscG06XCJcXHU0ZTBiXFx1NTM0OFwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlclwiLHg6XCIlRFwifX19LGc9ZC5lbl9VUyxuPW5ldyBhKGcsMCwhMSk7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtKXZhciBrPW0uZXhwb3J0cz1uO2Vsc2Ugaz1mdW5jdGlvbigpe3JldHVybiB0aGlzfHwoMCxldmFsKShcInRoaXNcIil9KCksXG5rLnN0cmZ0aW1lPW47XCJmdW5jdGlvblwiIT09dHlwZW9mIERhdGUubm93JiYoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KX0pKCl9LGZ1bmN0aW9uKG0scSxhKXsoZnVuY3Rpb24oKXt2YXIgYT1mdW5jdGlvbihiLGMsZil7cmV0dXJuIGEucGFyc2UoYixjLGYpfTthLnZlcnNpb249XCIwLjAuMVwiOyhtLmV4cG9ydHM9YSkuc3RycHRpbWU9YTthLmxvY2FsZT17YTpcIlN1biBNb24gVHVlIFdlZCBUaHUgRnJpIFNhdFwiLnNwbGl0KFwiIFwiKSxBOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksYjpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLEI6XCJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyXCIuc3BsaXQoXCIgXCIpLGY6XCJKYW4uIEZlYi4gTWFyLiBBcHIuIE1heSBKdW4uIEp1bC4gQXVnLiBTZXAuIE9jdC4gTm92LiBEZWMuXCIuc3BsaXQoXCIgXCIpLFxuYzpcIiVZLSVtLSVkICVIOiVNOiVTXCIsUDpbXCJhbVwiLFwicG1cIl0scjpcIiVJOiVNOiVTICVwXCIseDpcIiVtLyVkLyV5XCIsWDpcIiVIOiVNOiVTXCIsZGF5OltcIlllc3RlcmRheVwiLFwiVG9kYXlcIixcIlRvbW9ycm93XCJdLGJnOlwiSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWNcIi5zcGxpdChcIiBcIiksQmc6XCJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyXCIuc3BsaXQoXCIgXCIpLGZnOlwiSmFuLiBGZWIuIE1hci4gQXByLiBNYXkgSnVuLiBKdWwuIEF1Zy4gU2VwLiBPY3QuIE5vdi4gRGVjLlwiLnNwbGl0KFwiIFwiKSxEYXRlX2RCWV95ZWFyX2luX0hNOlwiJSNCICUtZCwgJVkgYXQgJS1IOiVNXCIsRGF0ZV9kQllfeWVhcjpcIiUjQiAlLWQsICVZXCIsRGF0ZV9kQlk6XCIlI0IgJS1kLCAlWVwiLERhdGVfQWRCWTpcIiVBLCAlI0IgJS1kLCAlWVwiLERhdGVfZEJBOlwiJSNCICUtZCwgJUFcIixcbkRhdGVfZGZfaW5fSE06XCIlI2YsICUtZCBhdCAlLUg6JU1cIixEYXRlX2RmWTpcIiUtZCAlI2YgJVlcIixEYXRlX2RCX2luX0hNOlwiJSNCICUtZCBhdCAlLUg6JU1cIixEYXRlX2RmOlwiJS1kICUjZlwifTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGMsZSxmLGgsbCl7Yz1TdHJpbmcoYyk7ZT1TdHJpbmcoZSk7Yz1jLnJlcGxhY2UoL15bI18wXFxeXFwtIX5dKy8sXCJcIik7Zj1kW2NdO2lmKCFmKXJldHVybiBhO3ZhciBrPSExOy0xPT09ZS5pbmRleE9mKFwiIVwiKSYmMT09PWMubGVuZ3RoJiYoLTE8ZS5pbmRleE9mKFwiflwiKXx8LTE8XCJiQmZcIi5pbmRleE9mKGMpJiYvJVswXFwtX10/ZFtcXHNdKyQvLnRlc3QobC5zdWJzdHIoMCxoKSkpJiYoaz0hMCk7aWYoKFwiSVwiPT09Y3x8XCJsXCI9PT1jKSYmIS8lW3BQXS8udGVzdChsKSl0aHJvdyBFcnJvcihcIlVuZGVmaW5lZCBBTS9QTVwiKTtzd2l0Y2godHlwZW9mIGYpe2Nhc2UgXCJmdW5jdGlvblwiOnJldHVybiBmKCk7Y2FzZSBcInN0cmluZ1wiOnJldHVybiBmO2Nhc2UgXCJvYmplY3RcIjpyZXR1cm4gYi5tYWtlLnB1c2goW2YubWFrZSxcbmUsa10pLFwiKFwiK2YucmVnK1wiKVwiO2RlZmF1bHQ6cmV0dXJuIGF9fWZ1bmN0aW9uIGMoYSxiKXthPVN0cmluZyhhKTtiPVN0cmluZyhiKTtyZXR1cm4tMSE9PWIuaW5kZXhPZihcIiNcIik/YS5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyKDEpOi0xIT09Yi5pbmRleE9mKFwiXlwiKT9hLnN1YnN0cigwLDEpK2Euc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk6YX12YXIgbD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMubGVuZ3RoLGQ9MDtkPGI7KXtpZihhPT10aGlzW2RdKXJldHVybiBkO2QrK31yZXR1cm4tMX0saD1hLmxvY2FsZSxkPXtcIiVcIjpcIlxcXFwlXCIsYTpcIlxcXFxTK1wiLEE6XCJcXFxcUytcIixiOntyZWc6XCJcXFxcUytcIixtYWtlOmZ1bmN0aW9uKGEsYixkLGUpe2I9bC5jYWxsKGU/aC5iZzpoLmIsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LGg6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxcbmIsZCxlKXtiPWwuY2FsbChlP2guYmc6aC5iLGMoYixkKSk7aWYoLTE9PT1iKXJldHVybiExO2Euc2V0VVRDTW9udGgoYik7cmV0dXJuITB9fSxCOntyZWc6XCJcXFxcUytcIixtYWtlOmZ1bmN0aW9uKGEsYixkLGUpe2I9bC5jYWxsKGU/aC5CZzpoLkIsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LGY6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiLGQsZSl7Yj1sLmNhbGwoZT9oLmZnOmguZixjKGIsZCkpO2lmKC0xPT09YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGIpO3JldHVybiEwfX0sZzp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw5OTxiKXJldHVybiExO2IrPTEwMCpwYXJzZUludCgobmV3IERhdGUpLmdldFVUQ0Z1bGxZZWFyKCkvMTAwLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sRzp7cmVnOlwiXFxcXGR7NH1cIixtYWtlOmZ1bmN0aW9uKGEsXG5iKXtiPXBhcnNlSW50KGIsMTApO2Euc2V0VVRDRnVsbFllYXIoYik7cmV0dXJuITB9fSxkOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDMxPGIpcmV0dXJuITE7YS5zZXRVVENEYXRlKGIpO3JldHVybiEwfX0sZTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMT5ifHwzMTxiKXJldHVybiExO2Euc2V0VVRDRGF0ZShiKTtyZXR1cm4hMH19LEg6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDA+Ynx8MjM8YilyZXR1cm4hMTthLnNldFVUQ0hvdXJzKGIpO3JldHVybiEwfX0sSTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMT5ifHwxMjxiKXJldHVybiExO2Euc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpK2IpO3JldHVybiEwfX0sbTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsXG5tYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENNb250aChiLTEpO3JldHVybiEwfX0sTTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw1OTxiKXJldHVybiExO2Euc2V0VVRDTWludXRlcyhiKTtyZXR1cm4hMH19LG46XCJcXFxcblwiLHA6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWwuY2FsbChoLlAsYi50b0xvd2VyQ2FzZSgpKTtpZigtMT09PWIpcmV0dXJuITE7MT09PWImJmEuc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpKzEyKTtyZXR1cm4hMH19LFA6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWwuY2FsbChoLlAsYi50b0xvd2VyQ2FzZSgpKTtpZigtMT09PWIpcmV0dXJuITE7MT09PWImJmEuc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpKzEyKTtyZXR1cm4hMH19LFM6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxcbmIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw2MDxiKXJldHVybiExO2Euc2V0VVRDU2Vjb25kcyhiKTtyZXR1cm4hMH19LHQ6XCJcXFxcdFwiLHU6XCJcXFxcZFwiLFU6XCJbXFxcXGRcXFxcc10/XFxcXGRcIix3OlwiXFxcXGRcIixXOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIseTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw5OTxiKXJldHVybiExO2IrPTEwMCpwYXJzZUludCgobmV3IERhdGUpLmdldFVUQ0Z1bGxZZWFyKCkvMTAwLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sWTp7cmVnOlwiXFxcXGR7NH1cIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sejp7cmVnOlwiWytcXFxcLV1cXFxcZHs0fVwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWIubWF0Y2goL14oWytcXC1dKShcXGR7Mn0pKFxcZHsyfSkkLyk7aWYoIWIpcmV0dXJuITE7dmFyIGQ9NkU0Kig2MCpwYXJzZUludChiWzJdLDEwKStcbnBhcnNlSW50KGJbM10sMTApKTtcIitcIj09PWJbMV0mJihkPS1kKTthLnNldFRpbWUoYS5nZXRUaW1lKCkrZCk7cmV0dXJuITB9fSxsOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrYik7cmV0dXJuITB9fSxzOntyZWc6XCJcXFxcZCtcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTthLnNldFRpbWUoMUUzKmIpO3JldHVybiEwfX0sYzpoLmMscjpoLnIsUjpcIiVIOiVNXCIsVDpcIiVIOiVNOiVTXCIseDpoLngsWDpoLlgsRDpcIiVtLyVkLyV5XCIsRjpcIiVZLSVtLSVkXCIsRGF0ZV9pc286XCIlWS0lbS0lZFQlSDolTTolU1wiLERhdGVfZEJZX3llYXJfaW5fSE06aC5EYXRlX2RCWV95ZWFyX2luX0hNLERhdGVfZEJZX3llYXI6aC5EYXRlX2RCWV95ZWFyLERhdGVfZEJZOmguRGF0ZV9kQlksRGF0ZV9kQkE6aC5EYXRlX2RCQSxEYXRlX0FkQlk6aC5EYXRlX0FkQlksXG5EYXRlX2RmX2luX0hNOmguRGF0ZV9kZl9pbl9ITSxEYXRlX2RmWTpoLkRhdGVfZGZZLERhdGVfZEJfaW5fSE06aC5EYXRlX2RCX2luX0hNLERhdGVfZG1ZX19kb3Q6XCIlZC4lbS4lWVwiLERhdGVfZGY6aC5EYXRlX2RmLERhdGVfRlQ6XCIlRiAlVFwiLERhdGVfZG1ZX19taW51czpcIiVkLSVtLSVZXCJ9O2EucGFyc2U9ZnVuY3Rpb24oYSxkLGMpe2E9U3RyaW5nKGEpO2Q9U3RyaW5nKGQpO2Zvcih2YXIgZT01Oy8lKERhdGVfW2EtekEtWjAtOV9dK3xbY0RGclJUeFhdKS9nLnRlc3QoZCkmJmU7KWQ9ZC5yZXBsYWNlKC8lKERhdGVfW2EtekEtWjAtOV9dK3xbY0RGclJUeFhdKS8sYiksZS0tO2IubWFrZT1bXTtkPWQucmVwbGFjZSgvJSgoWyNcXF4hfl17MCwyfSlbYUFiQmZoXXwoWzBcXC1fXT8pW2RlZ0hJbU1TVld5bF18W0ducFB0dVV3WXpacyVdKS9nLGIpO2E9YS5tYXRjaChuZXcgUmVnRXhwKGQpKTtpZighYXx8IWIubWFrZS5sZW5ndGgpcmV0dXJuIG51bGw7ZD1uZXcgRGF0ZShEYXRlLlVUQygwLFxuMCkpO2U9MDtmb3IodmFyIGs9Yi5tYWtlLmxlbmd0aDtlPGs7ZSsrKXt2YXIgZj1iLm1ha2VbZV07aWYoIWZbMF0oZCxhW2UrMV0sZlsxXSxmWzJdKSlyZXR1cm4gbnVsbH1jJiZkLnNldFRpbWUoZC5nZXRUaW1lKCkrNkU0KmQuZ2V0VGltZXpvbmVPZmZzZXQoKSk7cmV0dXJuIGR9fSkoYSl9KSgpfSxmdW5jdGlvbihtLHEsYSl7bT1hKDYpO2NvbnN0IGM9U2suZ2xvYmFsLkpTQkk9dm9pZCAwIT09U2suZ2xvYmFsLkJpZ0ludD97fTptO2lmKHZvaWQgMD09PVNrLmdsb2JhbC5CaWdJbnQpe2NvbnN0IGE9Yy5fX2lzQmlnSW50O2MuX19pc0JpZ0ludD1hP2I9Pm51bGwhPT1iJiZhKGIpOmE9PmEgaW5zdGFuY2VvZiBjO2MucG93ZXJtb2Q9KGEsYixsKT0+e2NvbnN0IGU9Yy5CaWdJbnQoMSk7bGV0IGQ9ZTtmb3IoYj1jLmdyZWF0ZXJUaGFuKGIsYy5fX1pFUk8pP2I6Yy51bmFyeU1pbnVzKGIpO2MuZ3JlYXRlclRoYW4oYixjLl9fWkVSTyk7KWMuYml0d2lzZUFuZChiLGUpJiYoZD1jLnJlbWFpbmRlcihjLm11bHRpcGx5KGQsXG5hKSxsKSksYj1jLnNpZ25lZFJpZ2h0U2hpZnQoYixlKSxhPWMucmVtYWluZGVyKGMubXVsdGlwbHkoYSxhKSxsKTtyZXR1cm4gZH19ZWxzZSBPYmplY3QuYXNzaWduKGMse0JpZ0ludDpTay5nbG9iYWwuQmlnSW50LHRvTnVtYmVyOmE9Pk51bWJlcihhKSx0b1N0cmluZzphPT5hLnRvU3RyaW5nKCksX19pc0JpZ0ludDphPT5cImJpZ2ludFwiPT09dHlwZW9mIGEsdW5hcnlNaW51czphPT4tYSxiaXR3aXNlTm90OmE9Pn5hLGJpdHdpc2VBbmQ6KGEsYyk9PmEmYyxiaXR3aXNlT3I6KGEsYyk9PmF8YyxiaXR3aXNlWG9yOihhLGMpPT5hXmMsZXhwb25lbnRpYXRlOihhLGUpPT57Y29uc3QgYj1jLkJpZ0ludCgxKTtsZXQgbD1iO2ZvcihlPWU+Yy5fX1pFUk8/ZTotZTtlPmMuX19aRVJPOyllJmImJihsKj1hKSxlPj49YixhKj1hO3JldHVybiBsfSxwb3dlcm1vZDooYSxlLGYpPT57Y29uc3QgYj1jLkJpZ0ludCgxKTtsZXQgaD1iO2ZvcihlPWU+Yy5fX1pFUk8/ZTotZTtlPmMuX19aRVJPOyllJlxuYiYmKGg9aCphJWYpLGU+Pj1iLGE9YSphJWY7cmV0dXJuIGh9LG11bHRpcGx5OihhLGMpPT5hKmMsZGl2aWRlOihhLGMpPT5hL2MscmVtYWluZGVyOihhLGMpPT5hJWMsYWRkOihhLGMpPT5hK2Msc3VidHJhY3Q6KGEsYyk9PmEtYyxsZWZ0U2hpZnQ6KGEsYyk9PmE8PGMsc2lnbmVkUmlnaHRTaGlmdDooYSxjKT0+YT4+Yyx1bnNpZ25lZFJpZ2h0U2hpZnQ6KGEsYyk9PmE+Pj5jLGxlc3NUaGFuOihhLGMpPT5hPGMsbGVzc1RoYW5PckVxdWFsOihhLGMpPT5hPD1jLGdyZWF0ZXJUaGFuOihhLGMpPT5hPmMsZ3JlYXRlclRoYW5PckVxdWFsOihhLGMpPT5hPj1jLGVxdWFsOihhLGMpPT5hPT09Yyxub3RFcXVhbDooYSxjKT0+YSE9PWN9KTtjLl9fWkVSTz1jLkJpZ0ludCgwKTtjLl9fTUFYX1NBRkU9Yy5CaWdJbnQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO2MuX19NSU5fU0FGRT1jLkJpZ0ludCgtTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO2MubnVtYmVySWZTYWZlPWE9PmMubGVzc1RoYW4oYSxcbmMuX19NQVhfU0FGRSkmJmMuZ3JlYXRlclRoYW4oYSxjLl9fTUlOX1NBRkUpP2MudG9OdW1iZXIoYSk6YX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhLGIpe20uZXhwb3J0cz1iKCl9KSh0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7cmV0dXJuIGE9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYX06ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmYS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmYSE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgYX0sYShiKX1mdW5jdGlvbiBiKGEsYil7Zm9yKHZhciBkLGM9MDtjPGIubGVuZ3RoO2MrKylkPWJbY10sZC5lbnVtZXJhYmxlPWQuZW51bWVyYWJsZXx8ITEsZC5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gZCYmKGQud3JpdGFibGU9XG4hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZC5rZXksZCl9ZnVuY3Rpb24gZShhLGQsYyl7cmV0dXJuIGQmJmIoYS5wcm90b3R5cGUsZCksYyYmYihhLGMpLGF9ZnVuY3Rpb24gZihhLGIpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGImJm51bGwhPT1iKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGImJmIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6YSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7YiYmaChhLGIpfWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGw9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihhKX0sbChhKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGg9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbihhLFxuYil7cmV0dXJuIGEuX19wcm90b19fPWIsYX0saChhLGIpfWZ1bmN0aW9uIGQoKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKEQpe3JldHVybiExfX1mdW5jdGlvbiBnKCl7cmV0dXJuIGc9ZCgpP1JlZmxlY3QuY29uc3RydWN0OmZ1bmN0aW9uKGEsYixkKXt2YXIgYz1bbnVsbF07Yy5wdXNoLmFwcGx5KGMsYik7YT1uZXcgKEZ1bmN0aW9uLmJpbmQuYXBwbHkoYSxjKSk7cmV0dXJuIGQmJmgoYSxkLnByb3RvdHlwZSksYX0sZy5hcHBseShudWxsLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbihhKXt2YXIgYj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBNYXA/bmV3IE1hcDp2b2lkIDA7XG5yZXR1cm4gbj1mdW5jdGlvbihhKXtmdW5jdGlvbiBkKCl7cmV0dXJuIGcoYSxhcmd1bWVudHMsbCh0aGlzKS5jb25zdHJ1Y3Rvcil9aWYobnVsbD09PWF8fC0xPT09RnVuY3Rpb24udG9TdHJpbmcuY2FsbChhKS5pbmRleE9mKFwiW25hdGl2ZSBjb2RlXVwiKSlyZXR1cm4gYTtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgYil7aWYoYi5oYXMoYSkpcmV0dXJuIGIuZ2V0KGEpO2Iuc2V0KGEsZCl9cmV0dXJuIGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpkLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGgoZCxhKX0sbihhKX1mdW5jdGlvbiBrKGEpe3ZhciBiPWQoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1sKGEpO2lmKGIpe3ZhciBjPVxubCh0aGlzKS5jb25zdHJ1Y3RvcjtkPVJlZmxlY3QuY29uc3RydWN0KGQsYXJndW1lbnRzLGMpfWVsc2UgZD1kLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighZHx8XCJvYmplY3RcIiE9dHlwZW9mIGQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGQpe2lmKHZvaWQgMD09PXRoaXMpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO2Q9dGhpc31yZXR1cm4gZH19ZnVuY3Rpb24gcChhLGIpe2lmKGEpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhKXJldHVybiB1KGEsYik7dmFyIGQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpLnNsaWNlKDgsLTEpO3JldHVyblwiT2JqZWN0XCI9PT1kJiZhLmNvbnN0cnVjdG9yJiYoZD1hLmNvbnN0cnVjdG9yLm5hbWUpLFwiTWFwXCI9PT1kfHxcIlNldFwiPT09ZD9BcnJheS5mcm9tKGEpOlwiQXJndW1lbnRzXCI9PT1kfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChkKT9cbnUoYSxiKTp2b2lkIDB9fWZ1bmN0aW9uIHUoYSxiKXsobnVsbD09Ynx8Yj5hLmxlbmd0aCkmJihiPWEubGVuZ3RoKTtmb3IodmFyIGQ9MCxjPUFycmF5KGIpO2Q8YjtkKyspY1tkXT1hW2RdO3JldHVybiBjfWZ1bmN0aW9uIEEoYSxiKXt2YXIgZDtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHxudWxsPT1hW1N5bWJvbC5pdGVyYXRvcl0pe2lmKEFycmF5LmlzQXJyYXkoYSl8fChkPXAoYSkpfHxiJiZhJiZcIm51bWJlclwiPT10eXBlb2YgYS5sZW5ndGgpe2QmJihhPWQpO3ZhciBjPTA7Yj1mdW5jdGlvbigpe307cmV0dXJue3M6YixuOmZ1bmN0aW9uKCl7cmV0dXJuIGM+PWEubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTphW2MrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGE7fSxmOmJ9fXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn12YXIgZSxrPSEwLGY9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtkPWFbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uKCl7dmFyIGE9ZC5uZXh0KCk7cmV0dXJuIGs9YS5kb25lLGF9LGU6ZnVuY3Rpb24oYSl7Zj0hMDtlPWF9LGY6ZnVuY3Rpb24oKXt0cnl7a3x8bnVsbD09ZC5yZXR1cm58fGQucmV0dXJuKCl9ZmluYWxseXtpZihmKXRocm93IGU7fX19fXZhciB0PU1hdGguaW11bCx2PU1hdGguY2x6MzIsQj1mdW5jdGlvbihiKXtmdW5jdGlvbiBkKGEsYil7dmFyIGM7aWYoISh0aGlzIGluc3RhbmNlb2YgZCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtpZihhPmQuX19rTWF4TGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiTWF4aW11bSBCaWdJbnQgc2l6ZSBleGNlZWRlZFwiKTtyZXR1cm4gYz1oLmNhbGwodGhpcyxhKSxjLnNpZ249YixjfXZhciBjPU1hdGguYWJzLGc9TWF0aC5tYXg7ZihkLGIpO3ZhciBoPWsoZCk7XG5yZXR1cm4gZShkLFt7a2V5OlwidG9EZWJ1Z1N0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGEsYj1bXCJCaWdJbnRbXCJdLGQ9QSh0aGlzKTt0cnl7Zm9yKGQucygpOyEoYT1kLm4oKSkuZG9uZTspe3ZhciBjPWEudmFsdWU7Yi5wdXNoKChjPyhjPj4+MCkudG9TdHJpbmcoMTYpOmMpK1wiLCBcIil9fWNhdGNoKFApe2QuZShQKX1maW5hbGx5e2QuZigpfXJldHVybiBiLnB1c2goXCJdXCIpLGIuam9pbihcIlwiKX19LHtrZXk6XCJ0b1N0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjEwO2lmKDI+YXx8MzY8YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInRvU3RyaW5nKCkgcmFkaXggYXJndW1lbnQgbXVzdCBiZSBiZXR3ZWVuIDIgYW5kIDM2XCIpO3JldHVybiAwPT09dGhpcy5sZW5ndGg/XCIwXCI6MD09KGEmYS0xKT9kLl9fdG9TdHJpbmdCYXNlUG93ZXJPZlR3byh0aGlzLGEpOmQuX190b1N0cmluZ0dlbmVyaWModGhpcyxcbmEsITEpfX0se2tleTpcIl9fY29weVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBkKHRoaXMubGVuZ3RoLHRoaXMuc2lnbiksYj0wO2I8dGhpcy5sZW5ndGg7YisrKWFbYl09dGhpc1tiXTtyZXR1cm4gYX19LHtrZXk6XCJfX3RyaW1cIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmxlbmd0aCxiPXRoaXNbYS0xXTswPT09YjspYS0tLGI9dGhpc1thLTFdLHRoaXMucG9wKCk7cmV0dXJuIDA9PT1hJiYodGhpcy5zaWduPSExKSx0aGlzfX0se2tleTpcIl9faW5pdGlhbGl6ZURpZ2l0c1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLmxlbmd0aDthKyspdGhpc1thXT0wfX0se2tleTpcIl9fY2x6bXNkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZC5fX2NsejMyKHRoaXNbdGhpcy5sZW5ndGgtMV0pfX0se2tleTpcIl9faW5wbGFjZU11bHRpcGx5QWRkXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe2M+dGhpcy5sZW5ndGgmJihjPXRoaXMubGVuZ3RoKTt2YXIgZT1cbjY1NTM1JmE7YT4+Pj0xNjt2YXIgaz0wLGY9NjU1MzUmYjtiPj4+PTE2O2Zvcih2YXIgZz0wO2c8YztnKyspe3ZhciBoPXRoaXMuX19kaWdpdChnKSxwPTY1NTM1JmgsbD1oPj4+MTY7aD1kLl9faW11bChwLGUpO3A9ZC5fX2ltdWwocCxhKTt2YXIgdj1kLl9faW11bChsLGUpO2w9ZC5fX2ltdWwobCxhKTt2YXIgeT1mKyg2NTUzNSZoKTtoPWIraysoeT4+PjE2KSsoaD4+PjE2KSsoNjU1MzUmcCkrKDY1NTM1JnYpO2Y9KHA+Pj4xNikrKHY+Pj4xNikrKDY1NTM1JmwpKyhoPj4+MTYpO2s9Zj4+PjE2O2YmPTY1NTM1O2I9bD4+PjE2O3RoaXMuX19zZXREaWdpdChnLDY1NTM1Jnl8aDw8MTYpfWlmKDAhPT1rfHwwIT09Znx8MCE9PWIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7fX0se2tleTpcIl9faW5wbGFjZUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXtmb3IodmFyIGMsZT0wLGs9MDtrPGQ7aysrKWM9dGhpcy5fX2hhbGZEaWdpdChiK2spK2EuX19oYWxmRGlnaXQoaykrXG5lLGU9Yz4+PjE2LHRoaXMuX19zZXRIYWxmRGlnaXQoYitrLGMpO3JldHVybiBlfX0se2tleTpcIl9faW5wbGFjZVN1YlwiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0wO2lmKDEmYil7Yj4+PTE7Zm9yKHZhciBlPXRoaXMuX19kaWdpdChiKSxrPTY1NTM1JmUsZj0wO2Y8ZC0xPj4+MTtmKyspe3ZhciBnPWEuX19kaWdpdChmKTtlPShlPj4+MTYpLSg2NTUzNSZnKS1jO2M9MSZlPj4+MTY7dGhpcy5fX3NldERpZ2l0KGIrZixlPDwxNnw2NTUzNSZrKTtlPXRoaXMuX19kaWdpdChiK2YrMSk7az0oNjU1MzUmZSktKGc+Pj4xNiktYztjPTEmaz4+PjE2fWc9YS5fX2RpZ2l0KGYpO3ZhciBoPShlPj4+MTYpLSg2NTUzNSZnKS1jO2M9MSZoPj4+MTY7dGhpcy5fX3NldERpZ2l0KGIrZixoPDwxNnw2NTUzNSZrKTtpZihiK2YrMT49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvdXQgb2YgYm91bmRzXCIpOzA9PSgxJmQpJiYoZT10aGlzLl9fZGlnaXQoYitmKzEpLGs9KDY1NTM1JlxuZSktKGc+Pj4xNiktYyxjPTEmaz4+PjE2LHRoaXMuX19zZXREaWdpdChiK2EubGVuZ3RoLDQyOTQ5MDE3NjAmZXw2NTUzNSZrKSl9ZWxzZXtiPj49MTtmb3Ioaz0wO2s8YS5sZW5ndGgtMTtrKyspZT10aGlzLl9fZGlnaXQoYitrKSxnPWEuX19kaWdpdChrKSxmPSg2NTUzNSZlKS0oNjU1MzUmZyktYyxjPTEmZj4+PjE2LGU9KGU+Pj4xNiktKGc+Pj4xNiktYyxjPTEmZT4+PjE2LHRoaXMuX19zZXREaWdpdChiK2ssZTw8MTZ8NjU1MzUmZik7Zj10aGlzLl9fZGlnaXQoYitrKTthPWEuX19kaWdpdChrKTtlPSg2NTUzNSZmKS0oNjU1MzUmYSktYztjPTEmZT4+PjE2O2c9MDswPT0oMSZkKSYmKGc9KGY+Pj4xNiktKGE+Pj4xNiktYyxjPTEmZz4+PjE2KTt0aGlzLl9fc2V0RGlnaXQoYitrLGc8PDE2fDY1NTM1JmUpfXJldHVybiBjfX0se2tleTpcIl9faW5wbGFjZVJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhKXtpZigwIT09YSl7Zm9yKHZhciBiLGQ9dGhpcy5fX2RpZ2l0KDApPj4+YSxcbmM9dGhpcy5sZW5ndGgtMSxlPTA7ZTxjO2UrKyliPXRoaXMuX19kaWdpdChlKzEpLHRoaXMuX19zZXREaWdpdChlLGI8PDMyLWF8ZCksZD1iPj4+YTt0aGlzLl9fc2V0RGlnaXQoYyxkKX19fSx7a2V5OlwiX19kaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW2FdfX0se2tleTpcIl9fdW5zaWduZWREaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW2FdPj4+MH19LHtrZXk6XCJfX3NldERpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt0aGlzW2FdPTB8Yn19LHtrZXk6XCJfX3NldERpZ2l0R3Jvd1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dGhpc1thXT0wfGJ9fSx7a2V5OlwiX19oYWxmRGlnaXRMZW5ndGhcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGVuZ3RoO3JldHVybiA2NTUzNT49dGhpcy5fX3Vuc2lnbmVkRGlnaXQoYS0xKT8yKmEtMToyKmF9fSx7a2V5OlwiX19oYWxmRGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gNjU1MzUmdGhpc1thPj4+MV0+Pj5cbigoMSZhKTw8NCl9fSx7a2V5OlwiX19zZXRIYWxmRGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPWE+Pj4xLGM9dGhpcy5fX2RpZ2l0KGQpO3RoaXMuX19zZXREaWdpdChkLDEmYT82NTUzNSZjfGI8PDE2OjQyOTQ5MDE3NjAmY3w2NTUzNSZiKX19XSxbe2tleTpcIkJpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGIpe3ZhciBjPU1hdGguZmxvb3IsZT1OdW1iZXIuaXNGaW5pdGU7aWYoXCJudW1iZXJcIj09dHlwZW9mIGIpe2lmKDA9PT1iKXJldHVybiBkLl9femVybygpO2lmKCgwfGIpPT09YilyZXR1cm4gMD5iP2QuX19vbmVEaWdpdCgtYiwhMCk6ZC5fX29uZURpZ2l0KGIsITEpO2lmKCFlKGIpfHxjKGIpIT09Yil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBudW1iZXIgXCIrYitcIiBjYW5ub3QgYmUgY29udmVydGVkIHRvIEJpZ0ludCBiZWNhdXNlIGl0IGlzIG5vdCBhbiBpbnRlZ2VyXCIpO3JldHVybiBkLl9fZnJvbURvdWJsZShiKX1pZihcInN0cmluZ1wiPT10eXBlb2YgYil7Yz1kLl9fZnJvbVN0cmluZyhiKTtcbmlmKG51bGw9PT1jKXRocm93IG5ldyBTeW50YXhFcnJvcihcIkNhbm5vdCBjb252ZXJ0IFwiK2IrXCIgdG8gYSBCaWdJbnRcIik7cmV0dXJuIGN9aWYoXCJib29sZWFuXCI9PXR5cGVvZiBiKXJldHVybiEwPT09Yj9kLl9fb25lRGlnaXQoMSwhMSk6ZC5fX3plcm8oKTtpZihcIm9iamVjdFwiPT09YShiKSl7aWYoYi5jb25zdHJ1Y3Rvcj09PWQpcmV0dXJuIGI7Yj1kLl9fdG9QcmltaXRpdmUoYik7cmV0dXJuIGQuQmlnSW50KGIpfXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBcIitiK1wiIHRvIGEgQmlnSW50XCIpO319LHtrZXk6XCJ0b051bWJlclwiLHZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA9PT1iKXJldHVybiAwO2lmKDE9PT1iKXt2YXIgYz1hLl9fdW5zaWduZWREaWdpdCgwKTtyZXR1cm4gYS5zaWduPy1jOmN9dmFyIGU9YS5fX2RpZ2l0KGItMSksaz1kLl9fY2x6MzIoZSk7Yz0zMipiLWs7aWYoMTAyNDxjKXJldHVybiBhLnNpZ24/LUluZmluaXR5OjEvMDstLWM7XG52YXIgZj1iLTEsZz1rKzE7az0oMzI9PT1nPzA6ZTw8Zyk+Pj4xMjt2YXIgaD1nLTEyO2I9MTI8PWc/MDplPDwyMCtnO2c9MjArZzswPGgmJjA8ZiYmKGYtLSxlPWEuX19kaWdpdChmKSxrfD1lPj4+MzItaCxiPWU8PGgsZz1oKTswPGcmJjA8ZiYmKGYtLSxlPWEuX19kaWdpdChmKSxifD1lPj4+MzItZyxnLT0zMik7ZT1kLl9fZGVjaWRlUm91bmRpbmcoYSxnLGYsZSk7aWYoKDE9PT1lfHwwPT09ZSYmMT09KDEmYikpJiYoYj1iKzE+Pj4wLDA9PT1iJiYoaysrLDAhPWs+Pj4yMCYmKGs9MCxjKyssMTAyMzxjKSkpKXJldHVybiBhLnNpZ24/LUluZmluaXR5OjEvMDthPWEuc2lnbj8tMjE0NzQ4MzY0ODowO3JldHVybiBjPWMrMTAyMzw8MjAsZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT1hfGN8ayxkLl9fa0JpdENvbnZlcnNpb25JbnRzWzBdPWIsZC5fX2tCaXRDb252ZXJzaW9uRG91YmxlWzBdfX0se2tleTpcInVuYXJ5TWludXNcIix2YWx1ZTpmdW5jdGlvbihhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGE7XG52YXIgYj1hLl9fY29weSgpO3JldHVybiBiLnNpZ249IWEuc2lnbixifX0se2tleTpcImJpdHdpc2VOb3RcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5zaWduP2QuX19hYnNvbHV0ZVN1Yk9uZShhKS5fX3RyaW0oKTpkLl9fYWJzb2x1dGVBZGRPbmUoYSwhMCl9fSx7a2V5OlwiZXhwb25lbnRpYXRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihiLnNpZ24pdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJFeHBvbmVudCBtdXN0IGJlIHBvc2l0aXZlXCIpO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gZC5fX29uZURpZ2l0KDEsITEpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtpZigxPT09YS5sZW5ndGgmJjE9PT1hLl9fZGlnaXQoMCkpcmV0dXJuIGEuc2lnbiYmMD09KDEmYi5fX2RpZ2l0KDApKT9kLnVuYXJ5TWludXMoYSk6YTtpZigxPGIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQmlnSW50IHRvbyBiaWdcIik7Yj1iLl9fdW5zaWduZWREaWdpdCgwKTtpZigxPT09YilyZXR1cm4gYTtpZihiPj1cbmQuX19rTWF4TGVuZ3RoQml0cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO2lmKDE9PT1hLmxlbmd0aCYmMj09PWEuX19kaWdpdCgwKSl7dmFyIGM9MSsoYj4+PjUpO2E9bmV3IGQoYyxhLnNpZ24mJjAhPSgxJmIpKTthLl9faW5pdGlhbGl6ZURpZ2l0cygpO3JldHVybiBhLl9fc2V0RGlnaXQoYy0xLDE8PCgzMSZiKSksYX1jPW51bGw7dmFyIGU9YTswIT0oMSZiKSYmKGM9YSk7Zm9yKGI+Pj0xOzAhPT1iO2I+Pj0xKWU9ZC5tdWx0aXBseShlLGUpLDAhPSgxJmIpJiYobnVsbD09PWM/Yz1lOmM9ZC5tdWx0aXBseShjLGUpKTtyZXR1cm4gY319LHtrZXk6XCJtdWx0aXBseVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYjt2YXIgYz1hLmxlbmd0aCtiLmxlbmd0aDszMjw9YS5fX2Nsem1zZCgpK2IuX19jbHptc2QoKSYmYy0tO2M9bmV3IGQoYyxhLnNpZ24hPT1iLnNpZ24pO2MuX19pbml0aWFsaXplRGlnaXRzKCk7XG5mb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkLl9fbXVsdGlwbHlBY2N1bXVsYXRlKGIsYS5fX2RpZ2l0KGUpLGMsZSk7cmV0dXJuIGMuX190cmltKCl9fSx7a2V5OlwiZGl2aWRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEaXZpc2lvbiBieSB6ZXJvXCIpO2lmKDA+ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpKXJldHVybiBkLl9femVybygpO3ZhciBjPWEuc2lnbiE9PWIuc2lnbixlPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iLmxlbmd0aCYmNjU1MzU+PWUpe2lmKDE9PT1lKXJldHVybiBjPT09YS5zaWduP2E6ZC51bmFyeU1pbnVzKGEpO2E9ZC5fX2Fic29sdXRlRGl2U21hbGwoYSxlLG51bGwpfWVsc2UgYT1kLl9fYWJzb2x1dGVEaXZMYXJnZShhLGIsITAsITEpO3JldHVybiBhLnNpZ249YyxhLl9fdHJpbSgpfX0se2tleTpcInJlbWFpbmRlclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiRGl2aXNpb24gYnkgemVyb1wiKTtcbmlmKDA+ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpKXJldHVybiBhO3ZhciBjPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iLmxlbmd0aCYmNjU1MzU+PWMpe2lmKDE9PT1jKXJldHVybiBkLl9femVybygpO2I9ZC5fX2Fic29sdXRlTW9kU21hbGwoYSxjKTtyZXR1cm4gMD09PWI/ZC5fX3plcm8oKTpkLl9fb25lRGlnaXQoYixhLnNpZ24pfWI9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxiLCExLCEwKTtyZXR1cm4gYi5zaWduPWEuc2lnbixiLl9fdHJpbSgpfX0se2tleTpcImFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zaWduO3JldHVybiBjPT09Yi5zaWduP2QuX19hYnNvbHV0ZUFkZChhLGIsYyk6MDw9ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpP2QuX19hYnNvbHV0ZVN1YihhLGIsYyk6ZC5fX2Fic29sdXRlU3ViKGIsYSwhYyl9fSx7a2V5Olwic3VidHJhY3RcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc2lnbjtyZXR1cm4gYz09PWIuc2lnbj8wPD1kLl9fYWJzb2x1dGVDb21wYXJlKGEsXG5iKT9kLl9fYWJzb2x1dGVTdWIoYSxiLGMpOmQuX19hYnNvbHV0ZVN1YihiLGEsIWMpOmQuX19hYnNvbHV0ZUFkZChhLGIsYyl9fSx7a2V5OlwibGVmdFNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09PWIubGVuZ3RofHwwPT09YS5sZW5ndGg/YTpiLnNpZ24/ZC5fX3JpZ2h0U2hpZnRCeUFic29sdXRlKGEsYik6ZC5fX2xlZnRTaGlmdEJ5QWJzb2x1dGUoYSxiKX19LHtrZXk6XCJzaWduZWRSaWdodFNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09PWIubGVuZ3RofHwwPT09YS5sZW5ndGg/YTpiLnNpZ24/ZC5fX2xlZnRTaGlmdEJ5QWJzb2x1dGUoYSxiKTpkLl9fcmlnaHRTaGlmdEJ5QWJzb2x1dGUoYSxiKX19LHtrZXk6XCJ1bnNpZ25lZFJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJCaWdJbnRzIGhhdmUgbm8gdW5zaWduZWQgcmlnaHQgc2hpZnQ7IHVzZSA+PiBpbnN0ZWFkXCIpO319LHtrZXk6XCJsZXNzVGhhblwiLFxudmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD5kLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwibGVzc1RoYW5PckVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD49ZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpfX0se2tleTpcImdyZWF0ZXJUaGFuXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDxkLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwiZ3JlYXRlclRoYW5PckVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDw9ZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpfX0se2tleTpcImVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihhLnNpZ24hPT1iLnNpZ258fGEubGVuZ3RoIT09Yi5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspaWYoYS5fX2RpZ2l0KGQpIT09Yi5fX2RpZ2l0KGQpKXJldHVybiExO3JldHVybiEwfX0se2tleTpcIm5vdEVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZC5lcXVhbChhLFxuYil9fSx7a2V5OlwiYml0d2lzZUFuZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoIWEuc2lnbiYmIWIuc2lnbilyZXR1cm4gZC5fX2Fic29sdXRlQW5kKGEsYikuX190cmltKCk7aWYoYS5zaWduJiZiLnNpZ24pe3ZhciBjPWcoYS5sZW5ndGgsYi5sZW5ndGgpKzE7YT1kLl9fYWJzb2x1dGVTdWJPbmUoYSxjKTtiPWQuX19hYnNvbHV0ZVN1Yk9uZShiKTtyZXR1cm4gYT1kLl9fYWJzb2x1dGVPcihhLGIsYSksZC5fX2Fic29sdXRlQWRkT25lKGEsITAsYSkuX190cmltKCl9YS5zaWduJiYoYj1bYixhXSxhPWJbMF0sYj1iWzFdKTtyZXR1cm4gZC5fX2Fic29sdXRlQW5kTm90KGEsZC5fX2Fic29sdXRlU3ViT25lKGIpKS5fX3RyaW0oKX19LHtrZXk6XCJiaXR3aXNlWG9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZighYS5zaWduJiYhYi5zaWduKXJldHVybiBkLl9fYWJzb2x1dGVYb3IoYSxiKS5fX3RyaW0oKTtpZihhLnNpZ24mJmIuc2lnbil7dmFyIGM9ZyhhLmxlbmd0aCxiLmxlbmd0aCk7YT1cbmQuX19hYnNvbHV0ZVN1Yk9uZShhLGMpO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIpO3JldHVybiBkLl9fYWJzb2x1dGVYb3IoYSxiLGEpLl9fdHJpbSgpfWM9ZyhhLmxlbmd0aCxiLmxlbmd0aCkrMTthLnNpZ24mJihiPVtiLGFdLGE9YlswXSxiPWJbMV0pO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIsYyk7cmV0dXJuIGI9ZC5fX2Fic29sdXRlWG9yKGIsYSxiKSxkLl9fYWJzb2x1dGVBZGRPbmUoYiwhMCxiKS5fX3RyaW0oKX19LHtrZXk6XCJiaXR3aXNlT3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWcoYS5sZW5ndGgsYi5sZW5ndGgpO2lmKCFhLnNpZ24mJiFiLnNpZ24pcmV0dXJuIGQuX19hYnNvbHV0ZU9yKGEsYikuX190cmltKCk7aWYoYS5zaWduJiZiLnNpZ24pcmV0dXJuIGE9ZC5fX2Fic29sdXRlU3ViT25lKGEsYyksYj1kLl9fYWJzb2x1dGVTdWJPbmUoYiksYT1kLl9fYWJzb2x1dGVBbmQoYSxiLGEpLGQuX19hYnNvbHV0ZUFkZE9uZShhLCEwLGEpLl9fdHJpbSgpO2Euc2lnbiYmXG4oYj1bYixhXSxhPWJbMF0sYj1iWzFdKTtiPWQuX19hYnNvbHV0ZVN1Yk9uZShiLGMpO3JldHVybiBiPWQuX19hYnNvbHV0ZUFuZE5vdChiLGEsYiksZC5fX2Fic29sdXRlQWRkT25lKGIsITAsYikuX190cmltKCl9fSx7a2V5OlwiYXNJbnROXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGI7aWYoMD09PWEpcmV0dXJuIGQuX196ZXJvKCk7aWYoYT49ZC5fX2tNYXhMZW5ndGhCaXRzKXJldHVybiBiO3ZhciBjPWErMzE+Pj41O2lmKGIubGVuZ3RoPGMpcmV0dXJuIGI7dmFyIGU9Yi5fX3Vuc2lnbmVkRGlnaXQoYy0xKSxrPTE8PCgzMSZhLTEpO2lmKGIubGVuZ3RoPT09YyYmZTxrKXJldHVybiBiO2lmKChlJmspIT09aylyZXR1cm4gZC5fX3RydW5jYXRlVG9OQml0cyhhLGIpO2lmKCFiLnNpZ24pcmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMCk7aWYoMD09KGUmay0xKSl7Zm9yKHZhciBmPWMtMjswPD1mO2YtLSlpZigwIT09XG5iLl9fZGlnaXQoZikpcmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMSk7cmV0dXJuIGIubGVuZ3RoPT09YyYmZT09PWs/YjpkLl9fdHJ1bmNhdGVUb05CaXRzKGEsYil9cmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMSl9fSx7a2V5OlwiYXNVaW50TlwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXJldHVybiBiO2lmKDA9PT1hKXJldHVybiBkLl9femVybygpO2lmKGIuc2lnbil7aWYoYT5kLl9fa01heExlbmd0aEJpdHMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCaWdJbnQgdG9vIGJpZ1wiKTtyZXR1cm4gZC5fX3RydW5jYXRlQW5kU3ViRnJvbVBvd2VyT2ZUd28oYSxiLCExKX1pZihhPj1kLl9fa01heExlbmd0aEJpdHMpcmV0dXJuIGI7dmFyIGM9YSszMT4+PjU7aWYoYi5sZW5ndGg8YylyZXR1cm4gYjt2YXIgZT0zMSZhO3JldHVybiBiLmxlbmd0aCE9Y3x8MCE9PWUmJjAhPWIuX19kaWdpdChjLTEpPj4+XG5lP2QuX190cnVuY2F0ZVRvTkJpdHMoYSxiKTpifX0se2tleTpcIkFERFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoYT1kLl9fdG9QcmltaXRpdmUoYSksYj1kLl9fdG9QcmltaXRpdmUoYiksXCJzdHJpbmdcIj09dHlwZW9mIGEpcmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIGImJihiPWIudG9TdHJpbmcoKSksYStiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBiKXJldHVybiBhLnRvU3RyaW5nKCkrYjtpZihhPWQuX190b051bWVyaWMoYSksYj1kLl9fdG9OdW1lcmljKGIpLGQuX19pc0JpZ0ludChhKSYmZC5fX2lzQmlnSW50KGIpKXJldHVybiBkLmFkZChhLGIpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBhJiZcIm51bWJlclwiPT10eXBlb2YgYilyZXR1cm4gYStiO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgbWl4IEJpZ0ludCBhbmQgb3RoZXIgdHlwZXMsIHVzZSBleHBsaWNpdCBjb252ZXJzaW9uc1wiKTt9fSx7a2V5OlwiTFRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBkLl9fY29tcGFyZShhLGIsXG4wKX19LHtrZXk6XCJMRVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwxKX19LHtrZXk6XCJHVFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwyKX19LHtrZXk6XCJHRVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwzKX19LHtrZXk6XCJFUVwiLHZhbHVlOmZ1bmN0aW9uKGIsYyl7Zm9yKDs7KXtpZihkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuX19pc0JpZ0ludChjKT9kLmVxdWFsKGIsYyk6ZC5FUShjLGIpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBiKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuIGQuX19lcXVhbFRvTnVtYmVyKGMsYik7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGI9PWM7Yz1kLl9fdG9QcmltaXRpdmUoYyl9ZWxzZSBpZihcInN0cmluZ1wiPT10eXBlb2YgYil7aWYoZC5fX2lzQmlnSW50KGMpKXJldHVybiBiPWQuX19mcm9tU3RyaW5nKGIpLG51bGwhPT1iJiZkLmVxdWFsKGIsYyk7XG5pZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwiYm9vbGVhblwiPT10eXBlb2YgYil7aWYoZC5fX2lzQmlnSW50KGMpKXJldHVybiBkLl9fZXF1YWxUb051bWJlcihjLCtiKTtpZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwic3ltYm9sXCI9PT1hKGIpKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuITE7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGI9PWM7Yz1kLl9fdG9QcmltaXRpdmUoYyl9ZWxzZSBpZihcIm9iamVjdFwiPT09YShiKSl7aWYoXCJvYmplY3RcIj09PWEoYykmJmMuY29uc3RydWN0b3IhPT1kKXJldHVybiBiPT1jO2I9ZC5fX3RvUHJpbWl0aXZlKGIpfWVsc2UgcmV0dXJuIGI9PWN9fX0se2tleTpcIk5FXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZC5FUShhLGIpfX0se2tleTpcIl9femVyb1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBkKDAsITEpfX0sXG57a2V5OlwiX19vbmVEaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7Yj1uZXcgZCgxLGIpO3JldHVybiBiLl9fc2V0RGlnaXQoMCxhKSxifX0se2tleTpcIl9fZGVjaWRlUm91bmRpbmdcIix2YWx1ZTpmdW5jdGlvbihhLGIsZCxjKXtpZigwPGIpcmV0dXJuLTE7aWYoMD5iKWI9LWItMTtlbHNle2lmKDA9PT1kKXJldHVybi0xO2QtLTtjPWEuX19kaWdpdChkKTtiPTMxfWI9MTw8YjtpZigwPT0oYyZiKSlyZXR1cm4tMTtpZigtLWIsMCE9KGMmYikpcmV0dXJuIDE7Zm9yKDswPGQ7KWlmKGQtLSwwIT09YS5fX2RpZ2l0KGQpKXJldHVybiAxO3JldHVybiAwfX0se2tleTpcIl9fZnJvbURvdWJsZVwiLHZhbHVlOmZ1bmN0aW9uKGEpe2QuX19rQml0Q29udmVyc2lvbkRvdWJsZVswXT1hO3ZhciBiPSgyMDQ3JmQuX19rQml0Q29udmVyc2lvbkludHNbMV0+Pj4yMCktMTAyMzt2YXIgYz0oYj4+PjUpKzE7YT1uZXcgZChjLDA+YSk7dmFyIGU9MTA0ODU3NSZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdfDEwNDg1NzYsXG5rPWQuX19rQml0Q29udmVyc2lvbkludHNbMF07YiY9MzE7aWYoMjA+Yil7dmFyIGY9MjAtYjt2YXIgZz1mKzMyO2I9ZT4+PmY7ZT1lPDwzMi1mfGs+Pj5mO2s8PD0zMi1mfWVsc2UgMjA9PT1iPyhnPTMyLGI9ZSxlPWspOihmPWItMjAsZz0zMi1mLGI9ZTw8ZnxrPj4+MzItZixlPWs8PGYpO2EuX19zZXREaWdpdChjLTEsYik7Zm9yKGMtPTI7MDw9YztjLS0pMDxnPyhnLT0zMixiPWUsZT1rKTpiPTAsYS5fX3NldERpZ2l0KGMsYik7cmV0dXJuIGEuX190cmltKCl9fSx7a2V5OlwiX19pc1doaXRlc3BhY2VcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4hISgxMz49YSYmOTw9YSl8fCgxNTk+PWE/MzI9PWE6MTMxMDcxPj1hPzE2MD09YXx8NTc2MD09YToxOTY2MDc+PWE/KGEmPTEzMTA3MSwxMD49YXx8NDA9PWF8fDQxPT1hfHw0Nz09YXx8OTU9PWF8fDQwOTY9PWEpOjY1Mjc5PT1hKX19LHtrZXk6XCJfX2Zyb21TdHJpbmdcIix2YWx1ZTpmdW5jdGlvbihhKXt2YXIgYj0xPGFyZ3VtZW50cy5sZW5ndGgmJlxudm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLGM9MCxlPWEubGVuZ3RoLGs9MDtpZihrPT09ZSlyZXR1cm4gZC5fX3plcm8oKTtmb3IodmFyIGY9YS5jaGFyQ29kZUF0KGspO2QuX19pc1doaXRlc3BhY2UoZik7KXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2Y9YS5jaGFyQ29kZUF0KGspfWlmKDQzPT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKTtjPTF9ZWxzZSBpZig0NT09PWYpe2lmKCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayk7Yz0tMX1pZigwPT09Yil7aWYoYj0xMCw0OD09PWYpe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7aWYoZj1hLmNoYXJDb2RlQXQoayksODg9PT1mfHwxMjA9PT1mKXtpZihiPTE2LCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9ZWxzZSBpZig3OT09PWZ8fDExMT09PWYpe2lmKGI9OCwrK2s9PT1lKXJldHVybiBudWxsO2Y9YS5jaGFyQ29kZUF0KGspfWVsc2UgaWYoNjY9PT1cbmZ8fDk4PT09Zil7aWYoYj0yLCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9fX1lbHNlIGlmKDE2PT09YiYmNDg9PT1mKXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2lmKGY9YS5jaGFyQ29kZUF0KGspLDg4PT09Znx8MTIwPT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKX19Zm9yKDs0OD09PWY7KXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2Y9YS5jaGFyQ29kZUF0KGspfXZhciBnPWUtayxoPWQuX19rTWF4Qml0c1BlckNoYXJbYl0scD1kLl9fa0JpdHNQZXJDaGFyVGFibGVNdWx0aXBsaWVyLTE7aWYoZz4xMDczNzQxODI0L2gpcmV0dXJuIG51bGw7Zz1uZXcgZCgoaCpnK3A+Pj5kLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdCkrMzE+Pj41LCExKTt2YXIgbD0xMD5iP2I6MTAsdj0xMDxiP2ItMTA6MDtpZigwPT0oYiZiLTEpKXtoPj49ZC5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQ7dmFyIEI9W10sbj1bXSxBPVxuITE7ZG97Zm9yKHZhciBELHU9cD0wOzspe2lmKGYtNDg+Pj4wPGwpRD1mLTQ4O2Vsc2UgaWYoKDMyfGYpLTk3Pj4+MDx2KUQ9KDMyfGYpLTg3O2Vsc2V7QT0hMDticmVha31pZih1Kz1oLHA9cDw8aHxELCsraz09PWUpe0E9ITA7YnJlYWt9aWYoZj1hLmNoYXJDb2RlQXQoayksMzI8dStoKWJyZWFrfUIucHVzaChwKTtuLnB1c2godSl9d2hpbGUoIUEpO2QuX19maWxsRnJvbVBhcnRzKGcsQixuKX1lbHNle2cuX19pbml0aWFsaXplRGlnaXRzKCk7Qj0hMTtuPTA7ZG97QT0wO2ZvcihEPTE7Oyl7aWYoZi00OD4+PjA8bClwPWYtNDg7ZWxzZSBpZigoMzJ8ZiktOTc+Pj4wPHYpcD0oMzJ8ZiktODc7ZWxzZXtCPSEwO2JyZWFrfXU9RCpiO2lmKDQyOTQ5NjcyOTU8dSlicmVhaztpZihEPXUsQT1BKmIrcCxuKyssKytrPT09ZSl7Qj0hMDticmVha31mPWEuY2hhckNvZGVBdChrKX1wPTMyKmQuX19rQml0c1BlckNoYXJUYWJsZU11bHRpcGxpZXItMTtnLl9faW5wbGFjZU11bHRpcGx5QWRkKEQsXG5BLGgqbitwPj4+ZC5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQrNSl9d2hpbGUoIUIpfWlmKGshPT1lKXtpZighZC5fX2lzV2hpdGVzcGFjZShmKSlyZXR1cm4gbnVsbDtmb3IoaysrO2s8ZTtrKyspaWYoZj1hLmNoYXJDb2RlQXQoayksIWQuX19pc1doaXRlc3BhY2UoZikpcmV0dXJuIG51bGx9cmV0dXJuIDAhPT1jJiYxMCE9PWI/bnVsbDooZy5zaWduPS0xPT09YyxnLl9fdHJpbSgpKX19LHtrZXk6XCJfX2ZpbGxGcm9tUGFydHNcIix2YWx1ZTpmdW5jdGlvbihhLGIsZCl7Zm9yKHZhciBjPTAsZT0wLGs9MCxmPWIubGVuZ3RoLTE7MDw9ZjtmLS0pe3ZhciBnPWJbZl0saD1kW2ZdO2V8PWc8PGs7ays9aDszMj09PWs/KGEuX19zZXREaWdpdChjKyssZSksaz0wLGU9MCk6MzI8ayYmKGEuX19zZXREaWdpdChjKyssZSksay09MzIsZT1nPj4+aC1rKX1pZigwIT09ZSl7aWYoYz49YS5sZW5ndGgpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7YS5fX3NldERpZ2l0KGMrKyxlKX1mb3IoO2M8XG5hLmxlbmd0aDtjKyspYS5fX3NldERpZ2l0KGMsMCl9fSx7a2V5OlwiX190b1N0cmluZ0Jhc2VQb3dlck9mVHdvXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxlPWItMTtlPSg4NSZlPj4+MSkrKDg1JmUpO2U9KDUxJmU+Pj4yKSsoNTEmZSk7ZT0oMTUmZT4+PjQpKygxNSZlKTstLWI7dmFyIGs9YS5fX2RpZ2l0KGMtMSksZj1kLl9fY2x6MzIoayksZz0wfCgzMipjLWYrZS0xKS9lO2lmKGEuc2lnbiYmZysrLDI2ODQzNTQ1NjxnKXRocm93IEVycm9yKFwic3RyaW5nIHRvbyBsb25nXCIpO2Y9QXJyYXkoZyk7LS1nO2Zvcih2YXIgaD0wLHA9MCxsPTA7bDxjLTE7bCsrKXt2YXIgdj1hLl9fZGlnaXQobCk7aD0oaHx2PDxwKSZiO2ZbZy0tXT1kLl9fa0NvbnZlcnNpb25DaGFyc1toXTtwPWUtcDtoPXY+Pj5wO2ZvcihwPTMyLXA7cD49ZTspZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2gmYl0saD4+Pj1lLHAtPWV9ZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzWyhofGs8PFxucCkmYl07Zm9yKGg9az4+PmUtcDswIT09aDspZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2gmYl0saD4+Pj1lO2lmKGEuc2lnbiYmKGZbZy0tXT1cIi1cIiksLTEhPT1nKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiBmLmpvaW4oXCJcIil9fSx7a2V5OlwiX190b1N0cmluZ0dlbmVyaWNcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGU9YS5sZW5ndGg7aWYoMD09PWUpcmV0dXJuXCJcIjtpZigxPT09ZSlyZXR1cm4gYj1hLl9fdW5zaWduZWREaWdpdCgwKS50b1N0cmluZyhiKSwhMT09PWMmJmEuc2lnbiYmKGI9XCItXCIrYiksYjt2YXIgaz0zMiplLWQuX19jbHozMihhLl9fZGlnaXQoZS0xKSk7ZT1kLl9fa01heEJpdHNQZXJDaGFyW2JdLTE7ayo9ZC5fX2tCaXRzUGVyQ2hhclRhYmxlTXVsdGlwbGllcjtlPSgwfChrKyhlLTEpKS9lKSsxPj4xO2s9ZC5leHBvbmVudGlhdGUoZC5fX29uZURpZ2l0KGIsITEpLGQuX19vbmVEaWdpdChlLCExKSk7dmFyIGY9ay5fX3Vuc2lnbmVkRGlnaXQoMCk7XG5pZigxPT09ay5sZW5ndGgmJjY1NTM1Pj1mKXtrPW5ldyBkKGEubGVuZ3RoLCExKTtrLl9faW5pdGlhbGl6ZURpZ2l0cygpO3ZhciBnPTA7Zm9yKHZhciBoPTIqYS5sZW5ndGgtMTswPD1oO2gtLSlnPWc8PDE2fGEuX19oYWxmRGlnaXQoaCksay5fX3NldEhhbGZEaWdpdChoLDB8Zy9mKSxnPTB8ZyVmO2Y9Zy50b1N0cmluZyhiKX1lbHNlIGY9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxrLCEwLCEwKSxrPWYucXVvdGllbnQsZj1mLnJlbWFpbmRlci5fX3RyaW0oKSxmPWQuX190b1N0cmluZ0dlbmVyaWMoZixiLCEwKTtrLl9fdHJpbSgpO2ZvcihiPWQuX190b1N0cmluZ0dlbmVyaWMoayxiLCEwKTtmLmxlbmd0aDxlOylmPVwiMFwiK2Y7cmV0dXJuITE9PT1jJiZhLnNpZ24mJihiPVwiLVwiK2IpLGIrZn19LHtrZXk6XCJfX3VuZXF1YWxTaWduXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/LTE6MX19LHtrZXk6XCJfX2Fic29sdXRlR3JlYXRlclwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhP1xuLTE6MX19LHtrZXk6XCJfX2Fic29sdXRlTGVzc1wiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhPzE6LTF9fSx7a2V5OlwiX19jb21wYXJlVG9CaWdJbnRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc2lnbjtpZihjIT09Yi5zaWduKXJldHVybiBkLl9fdW5lcXVhbFNpZ24oYyk7YT1kLl9fYWJzb2x1dGVDb21wYXJlKGEsYik7cmV0dXJuIDA8YT9kLl9fYWJzb2x1dGVHcmVhdGVyKGMpOjA+YT9kLl9fYWJzb2x1dGVMZXNzKGMpOjB9fSx7a2V5OlwiX19jb21wYXJlVG9OdW1iZXJcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKDF8Yil7dmFyIGU9YS5zaWduLGs9MD5iO2lmKGUhPT1rKXJldHVybiBkLl9fdW5lcXVhbFNpZ24oZSk7aWYoMD09PWEubGVuZ3RoKXtpZihrKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiAwPT09Yj8wOi0xfWlmKDE8YS5sZW5ndGgpcmV0dXJuIGQuX19hYnNvbHV0ZUdyZWF0ZXIoZSk7Yj1jKGIpO2E9YS5fX3Vuc2lnbmVkRGlnaXQoMCk7XG5yZXR1cm4gYT5iP2QuX19hYnNvbHV0ZUdyZWF0ZXIoZSk6YTxiP2QuX19hYnNvbHV0ZUxlc3MoZSk6MH1yZXR1cm4gZC5fX2NvbXBhcmVUb0RvdWJsZShhLGIpfX0se2tleTpcIl9fY29tcGFyZVRvRG91YmxlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihiIT09YilyZXR1cm4gYjtpZihiPT09MS8wKXJldHVybi0xO2lmKC1JbmZpbml0eT09PWIpcmV0dXJuIDE7dmFyIGM9YS5zaWduO2lmKGMhPT0wPmIpcmV0dXJuIGQuX191bmVxdWFsU2lnbihjKTtpZigwPT09Yil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Zzogc2hvdWxkIGJlIGhhbmRsZWQgZWxzZXdoZXJlXCIpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4tMTtkLl9fa0JpdENvbnZlcnNpb25Eb3VibGVbMF09YjtiPTIwNDcmZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT4+PjIwO2lmKDIwNDc9PWIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWc6IGhhbmRsZWQgZWxzZXdoZXJlXCIpO3ZhciBlPWItMTAyMztpZigwPmUpcmV0dXJuIGQuX19hYnNvbHV0ZUdyZWF0ZXIoYyk7XG5iPWEubGVuZ3RoO3ZhciBrPWEuX19kaWdpdChiLTEpLGY9ZC5fX2NsejMyKGspLGc9MzIqYi1mO2UrPTE7aWYoZzxlKXJldHVybiBkLl9fYWJzb2x1dGVMZXNzKGMpO2lmKGc+ZSlyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtlPTEwNDg1NzZ8MTA0ODU3NSZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdO3ZhciBoPWQuX19rQml0Q29udmVyc2lvbkludHNbMF07Zj0zMS1mO2lmKGYhPT0oZy0xKSUzMSl0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtpZigyMD5mKXt2YXIgcD0yMC1mO2Y9cCszMjtnPWU+Pj5wO2U9ZTw8MzItcHxoPj4+cDtoPDw9MzItcH1lbHNlIDIwPT09Zj8oZj0zMixnPWUsZT1oKToocD1mLTIwLGY9MzItcCxnPWU8PHB8aD4+PjMyLXAsZT1oPDxwKTtpZihrPj4+PTAsZz4+Pj0wLGs+ZylyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtpZihrPGcpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyk7Zm9yKGItPTI7MDw9YjtiLS0pezA8Zj8oZi09XG4zMixnPWU+Pj4wLGU9aCxoPTApOmc9MDtrPWEuX191bnNpZ25lZERpZ2l0KGIpO2lmKGs+ZylyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtpZihrPGcpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyl9aWYoMCE9PWV8fDAhPT1oKXtpZigwPT09Zil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gZC5fX2Fic29sdXRlTGVzcyhjKX1yZXR1cm4gMH19LHtrZXk6XCJfX2VxdWFsVG9OdW1iZXJcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBifDA9PT1iPzA9PT1iPzA9PT1hLmxlbmd0aDoxPT09YS5sZW5ndGgmJmEuc2lnbj09PTA+YiYmYS5fX3Vuc2lnbmVkRGlnaXQoMCk9PT1jKGIpOjA9PT1kLl9fY29tcGFyZVRvRG91YmxlKGEsYil9fSx7a2V5OlwiX19jb21wYXJpc29uUmVzdWx0VG9Cb29sXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYil7Y2FzZSAwOnJldHVybiAwPmE7Y2FzZSAxOnJldHVybiAwPj1hO2Nhc2UgMjpyZXR1cm4gMDxhO2Nhc2UgMzpyZXR1cm4gMDw9XG5hfXRocm93IEVycm9yKFwidW5yZWFjaGFibGVcIik7fX0se2tleTpcIl9fY29tcGFyZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtpZihhPWQuX190b1ByaW1pdGl2ZShhKSxiPWQuX190b1ByaW1pdGl2ZShiKSxcInN0cmluZ1wiPT10eXBlb2YgYSYmXCJzdHJpbmdcIj09dHlwZW9mIGIpc3dpdGNoKGMpe2Nhc2UgMDpyZXR1cm4gYTxiO2Nhc2UgMTpyZXR1cm4gYTw9YjtjYXNlIDI6cmV0dXJuIGE+YjtjYXNlIDM6cmV0dXJuIGE+PWJ9aWYoZC5fX2lzQmlnSW50KGEpJiZcInN0cmluZ1wiPT10eXBlb2YgYilyZXR1cm4gYj1kLl9fZnJvbVN0cmluZyhiKSxudWxsIT09YiYmZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpLGMpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhJiZkLl9faXNCaWdJbnQoYikpcmV0dXJuIGE9ZC5fX2Zyb21TdHJpbmcoYSksbnVsbCE9PWEmJmQuX19jb21wYXJpc29uUmVzdWx0VG9Cb29sKGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKSxjKTtcbmlmKGE9ZC5fX3RvTnVtZXJpYyhhKSxiPWQuX190b051bWVyaWMoYiksZC5fX2lzQmlnSW50KGEpKXtpZihkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuX19jb21wYXJpc29uUmVzdWx0VG9Cb29sKGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKSxjKTtpZihcIm51bWJlclwiIT10eXBlb2YgYil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb051bWJlcihhLGIpLGMpfWlmKFwibnVtYmVyXCIhPXR5cGVvZiBhKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO2lmKGQuX19pc0JpZ0ludChiKSlyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb051bWJlcihiLGEpLDJeYyk7aWYoXCJudW1iZXJcIiE9dHlwZW9mIGIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7cmV0dXJuIDA9PT1jP2E8YjoxPT09Yz9hPD1iOjI9PT1jP2E+YjozPT09Yz9hPj1iOlxudm9pZCAwfX0se2tleTpcIl9fYWJzb2x1dGVBZGRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7aWYoYS5sZW5ndGg8Yi5sZW5ndGgpcmV0dXJuIGQuX19hYnNvbHV0ZUFkZChiLGEsYyk7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYS5zaWduPT09Yz9hOmQudW5hcnlNaW51cyhhKTt2YXIgZT1hLmxlbmd0aDsoMD09PWEuX19jbHptc2QoKXx8Yi5sZW5ndGg9PT1hLmxlbmd0aCYmMD09PWIuX19jbHptc2QoKSkmJmUrKztjPW5ldyBkKGUsYyk7Zm9yKHZhciBrPWU9MDtrPGIubGVuZ3RoO2srKyl7dmFyIGY9Yi5fX2RpZ2l0KGspLGc9YS5fX2RpZ2l0KGspLGg9KDY1NTM1JmcpKyg2NTUzNSZmKStlO2Y9KGc+Pj4xNikrKGY+Pj4xNikrKGg+Pj4xNik7ZT1mPj4+MTY7Yy5fX3NldERpZ2l0KGssNjU1MzUmaHxmPDwxNil9Zm9yKDtrPGEubGVuZ3RoO2srKyloPWEuX19kaWdpdChrKSxiPSg2NTUzNSZoKStlLGg9KGg+Pj4xNikrKGI+Pj4xNiksZT1oPj4+XG4xNixjLl9fc2V0RGlnaXQoayw2NTUzNSZifGg8PDE2KTtyZXR1cm4gazxjLmxlbmd0aCYmYy5fX3NldERpZ2l0KGssZSksYy5fX3RyaW0oKX19LHtrZXk6XCJfX2Fic29sdXRlU3ViXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGEuc2lnbj09PWM/YTpkLnVuYXJ5TWludXMoYSk7Yz1uZXcgZChhLmxlbmd0aCxjKTtmb3IodmFyIGU9MCxrPTA7azxiLmxlbmd0aDtrKyspe3ZhciBmPWEuX19kaWdpdChrKSxnPWIuX19kaWdpdChrKSxoPSg2NTUzNSZmKS0oNjU1MzUmZyktZTtlPTEmaD4+PjE2O2Y9KGY+Pj4xNiktKGc+Pj4xNiktZTtlPTEmZj4+PjE2O2MuX19zZXREaWdpdChrLDY1NTM1Jmh8Zjw8MTYpfWZvcig7azxhLmxlbmd0aDtrKyspaD1hLl9fZGlnaXQoayksYj0oNjU1MzUmaCktZSxlPTEmYj4+PjE2LGg9KGg+Pj4xNiktZSxlPTEmaD4+PjE2LGMuX19zZXREaWdpdChrLDY1NTM1JmJ8aDw8MTYpO1xucmV0dXJuIGMuX190cmltKCl9fSx7a2V5OlwiX19hYnNvbHV0ZUFkZE9uZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aDtudWxsPT09Yz9jPW5ldyBkKGUsYik6Yy5zaWduPWI7Zm9yKHZhciBrLGY9ITAsZz0wO2c8ZTtnKyspe2lmKGs9YS5fX2RpZ2l0KGcpLGYpZj0tMT09PWssaz0wfGsrMTtjLl9fc2V0RGlnaXQoZyxrKX1yZXR1cm4gZiYmYy5fX3NldERpZ2l0R3JvdyhlLDEpLGN9fSx7a2V5OlwiX19hYnNvbHV0ZVN1Yk9uZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGg7Yj1ifHxjO2Zvcih2YXIgZSxrPW5ldyBkKGIsITEpLGY9ITAsZz0wO2c8YztnKyspe2lmKGU9YS5fX2RpZ2l0KGcpLGYpZj0wPT09ZSxlPTB8ZS0xO2suX19zZXREaWdpdChnLGUpfWlmKGYpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7Zm9yKGE9YzthPFxuYjthKyspay5fX3NldERpZ2l0KGEsMCk7cmV0dXJuIGt9fSx7a2V5OlwiX19hYnNvbHV0ZUFuZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aCxrPWIubGVuZ3RoLGY9aztlPGsmJihmPWUsZT1hLGE9YixiPWUpO2U9ZjtudWxsPT09Yz9jPW5ldyBkKGUsITEpOmU9Yy5sZW5ndGg7Zm9yKGs9MDtrPGY7aysrKWMuX19zZXREaWdpdChrLGEuX19kaWdpdChrKSZiLl9fZGlnaXQoaykpO2Zvcig7azxlO2srKyljLl9fc2V0RGlnaXQoaywwKTtyZXR1cm4gY319LHtrZXk6XCJfX2Fic29sdXRlQW5kTm90XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2U8ayYmKGY9ZSk7az1lO251bGw9PT1jP2M9bmV3IGQoaywhMSk6XG5rPWMubGVuZ3RoO2Zvcih2YXIgZz0wO2c8ZjtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpJn5iLl9fZGlnaXQoZykpO2Zvcig7ZzxlO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZykpO2Zvcig7ZzxrO2crKyljLl9fc2V0RGlnaXQoZywwKTtyZXR1cm4gY319LHtrZXk6XCJfX2Fic29sdXRlT3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLGU9YS5sZW5ndGgsaz1iLmxlbmd0aCxmPWs7aWYoZTxrKXtmPWU7dmFyIGc9YTthPWI7ZT1rO2I9Z31rPWU7bnVsbD09PWM/Yz1uZXcgZChrLCExKTprPWMubGVuZ3RoO2ZvcihnPTA7ZzxmO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZyl8Yi5fX2RpZ2l0KGcpKTtmb3IoO2c8ZTtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpKTtmb3IoO2c8aztnKyspYy5fX3NldERpZ2l0KGcsMCk7cmV0dXJuIGN9fSxcbntrZXk6XCJfX2Fic29sdXRlWG9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2lmKGU8ayl7Zj1lO3ZhciBnPWE7YT1iO2U9aztiPWd9az1lO251bGw9PT1jP2M9bmV3IGQoaywhMSk6az1jLmxlbmd0aDtmb3IoZz0wO2c8ZjtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpXmIuX19kaWdpdChnKSk7Zm9yKDtnPGU7ZysrKWMuX19zZXREaWdpdChnLGEuX19kaWdpdChnKSk7Zm9yKDtnPGs7ZysrKWMuX19zZXREaWdpdChnLDApO3JldHVybiBjfX0se2tleTpcIl9fYWJzb2x1dGVDb21wYXJlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmxlbmd0aC1iLmxlbmd0aDtpZigwIT1kKXJldHVybiBkO2ZvcihkPWEubGVuZ3RoLTE7MDw9ZCYmYS5fX2RpZ2l0KGQpPT09Yi5fX2RpZ2l0KGQpOylkLS07cmV0dXJuIDA+ZD8wOmEuX191bnNpZ25lZERpZ2l0KGQpPlxuYi5fX3Vuc2lnbmVkRGlnaXQoZCk/MTotMX19LHtrZXk6XCJfX211bHRpcGx5QWNjdW11bGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjLGUpe2lmKDAhPT1iKXtmb3IodmFyIGs9NjU1MzUmYixmPWI+Pj4xNixnPWI9MCxoPTAscD0wO3A8YS5sZW5ndGg7cCsrLGUrKyl7dmFyIGw9Yy5fX2RpZ2l0KGUpLHY9NjU1MzUmbDtsPj4+PTE2O3ZhciBCPWEuX19kaWdpdChwKSxuPTY1NTM1JkIsQT1CPj4+MTY7Qj1kLl9faW11bChuLGspO249ZC5fX2ltdWwobixmKTt2YXIgRD1kLl9faW11bChBLGspO0E9ZC5fX2ltdWwoQSxmKTt2Kz1nKyg2NTUzNSZCKTtsKz1oK2IrKHY+Pj4xNikrKEI+Pj4xNikrKDY1NTM1Jm4pKyg2NTUzNSZEKTtiPWw+Pj4xNjtnPShuPj4+MTYpKyhEPj4+MTYpKyg2NTUzNSZBKStiO2I9Zz4+PjE2O2cmPTY1NTM1O2g9QT4+PjE2O2w9NjU1MzUmdnxsPDwxNjtjLl9fc2V0RGlnaXQoZSxsKX1mb3IoOzAhPT1ifHwwIT09Z3x8MCE9PWg7ZSsrKWs9Yy5fX2RpZ2l0KGUpLGE9XG4oNjU1MzUmaykrZyxrPShrPj4+MTYpKyhhPj4+MTYpK2grYixoPWc9MCxiPWs+Pj4xNixrPTY1NTM1JmF8azw8MTYsYy5fX3NldERpZ2l0KGUsayl9fX0se2tleTpcIl9faW50ZXJuYWxNdWx0aXBseUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjLGUsayl7Zm9yKHZhciBmPTAsZz0wO2c8ZTtnKyspe3ZhciBoPWEuX19kaWdpdChnKSxwPWQuX19pbXVsKDY1NTM1JmgsYiksbD0oNjU1MzUmcCkrZitjO2M9bD4+PjE2O2Y9ZC5fX2ltdWwoaD4+PjE2LGIpO3A9KDY1NTM1JmYpKyhwPj4+MTYpK2M7Yz1wPj4+MTY7Zj4+Pj0xNjtrLl9fc2V0RGlnaXQoZyxwPDwxNnw2NTUzNSZsKX1pZihrLmxlbmd0aD5lKWZvcihrLl9fc2V0RGlnaXQoZSsrLGMrZik7ZTxrLmxlbmd0aDspay5fX3NldERpZ2l0KGUrKywwKTtlbHNlIGlmKDAhPT1jK2YpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7fX0se2tleTpcIl9fYWJzb2x1dGVEaXZTbWFsbFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtudWxsPT09XG5jJiYoYz1uZXcgZChhLmxlbmd0aCwhMSkpO2Zvcih2YXIgZT0wLGs9MiphLmxlbmd0aC0xOzA8PWs7ay09Mil7ZT0oZTw8MTZ8YS5fX2hhbGZEaWdpdChrKSk+Pj4wO3ZhciBmPTB8ZS9iO2U9MHxlJWI7ZT0oZTw8MTZ8YS5fX2hhbGZEaWdpdChrLTEpKT4+PjA7dmFyIGc9MHxlL2I7ZT0wfGUlYjtjLl9fc2V0RGlnaXQoaz4+PjEsZjw8MTZ8Zyl9cmV0dXJuIGN9fSx7a2V5OlwiX19hYnNvbHV0ZU1vZFNtYWxsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wO2Zvcih2YXIgYz0yKmEubGVuZ3RoLTE7MDw9YztjLS0pZD0oZDw8MTZ8YS5fX2hhbGZEaWdpdChjKSk+Pj4wLGQ9MHxkJWI7cmV0dXJuIGR9fSx7a2V5OlwiX19hYnNvbHV0ZURpdkxhcmdlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGs9Yi5fX2hhbGZEaWdpdExlbmd0aCgpLGY9Yi5sZW5ndGgsZz1hLl9faGFsZkRpZ2l0TGVuZ3RoKCktayxoPW51bGw7YyYmKGg9bmV3IGQoZysyPj4+MSwhMSksaC5fX2luaXRpYWxpemVEaWdpdHMoKSk7XG52YXIgcD1uZXcgZChrKzI+Pj4xLCExKTtwLl9faW5pdGlhbGl6ZURpZ2l0cygpO3ZhciBsPWQuX19jbHoxNihiLl9faGFsZkRpZ2l0KGstMSkpOzA8bCYmKGI9ZC5fX3NwZWNpYWxMZWZ0U2hpZnQoYixsLDApKTthPWQuX19zcGVjaWFsTGVmdFNoaWZ0KGEsbCwxKTtmb3IodmFyIHY9Yi5fX2hhbGZEaWdpdChrLTEpLEI9MDswPD1nO2ctLSl7dmFyIG49NjU1MzUsQT1hLl9faGFsZkRpZ2l0KGcrayk7aWYoQSE9PXYpe0E9KEE8PDE2fGEuX19oYWxmRGlnaXQoZytrLTEpKT4+PjA7bj0wfEEvdjtBPTB8QSV2O2Zvcih2YXIgRD1iLl9faGFsZkRpZ2l0KGstMiksdT1hLl9faGFsZkRpZ2l0KGcray0yKTtkLl9faW11bChuLEQpPj4+MD4oQTw8MTZ8dSk+Pj4wJiYobi0tLEErPXYsISg2NTUzNTxBKSk7KTt9ZC5fX2ludGVybmFsTXVsdGlwbHlBZGQoYixuLDAsZixwKTtBPWEuX19pbnBsYWNlU3ViKHAsZyxrKzEpOzAhPT1BJiYoQT1hLl9faW5wbGFjZUFkZChiLGcsayksYS5fX3NldEhhbGZEaWdpdChnK1xuayxhLl9faGFsZkRpZ2l0KGcraykrQSksbi0tKTtjJiYoMSZnP0I9bjw8MTY6aC5fX3NldERpZ2l0KGc+Pj4xLEJ8bikpfXJldHVybiBlPyhhLl9faW5wbGFjZVJpZ2h0U2hpZnQobCksYz97cXVvdGllbnQ6aCxyZW1haW5kZXI6YX06YSk6Yz9oOnZvaWQgMH19LHtrZXk6XCJfX2NsejE2XCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGQuX19jbHozMihhKS0xNn19LHtrZXk6XCJfX3NwZWNpYWxMZWZ0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGU9YS5sZW5ndGgsaz1uZXcgZChlK2MsITEpO2lmKDA9PT1iKXtmb3IoYj0wO2I8ZTtiKyspay5fX3NldERpZ2l0KGIsYS5fX2RpZ2l0KGIpKTtyZXR1cm4gMDxjJiZrLl9fc2V0RGlnaXQoZSwwKSxrfWZvcih2YXIgZixnPTAsaD0wO2g8ZTtoKyspZj1hLl9fZGlnaXQoaCksay5fX3NldERpZ2l0KGgsZjw8YnxnKSxnPWY+Pj4zMi1iO3JldHVybiAwPGMmJmsuX19zZXREaWdpdChlLGcpLGt9fSx7a2V5OlwiX19sZWZ0U2hpZnRCeUFic29sdXRlXCIsXG52YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWQuX190b1NoaWZ0QW1vdW50KGIpO2lmKDA+Yyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO2I9Yz4+PjU7dmFyIGU9MzEmYyxrPWEubGVuZ3RoLGY9MCE9PWUmJjAhPWEuX19kaWdpdChrLTEpPj4+MzItZSxnPWsrYisoZj8xOjApO2M9bmV3IGQoZyxhLnNpZ24pO2lmKDA9PT1lKXtmb3IoZT0wO2U8YjtlKyspYy5fX3NldERpZ2l0KGUsMCk7Zm9yKDtlPGc7ZSsrKWMuX19zZXREaWdpdChlLGEuX19kaWdpdChlLWIpKX1lbHNle2Zvcih2YXIgaD1nPTA7aDxiO2grKyljLl9fc2V0RGlnaXQoaCwwKTtmb3IodmFyIHA9MDtwPGs7cCsrKWg9YS5fX2RpZ2l0KHApLGMuX19zZXREaWdpdChwK2IsaDw8ZXxnKSxnPWg+Pj4zMi1lO2lmKGYpYy5fX3NldERpZ2l0KGsrYixnKTtlbHNlIGlmKDAhPT1nKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO31yZXR1cm4gYy5fX3RyaW0oKX19LHtrZXk6XCJfX3JpZ2h0U2hpZnRCeUFic29sdXRlXCIsXG52YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGU9YS5zaWduLGs9ZC5fX3RvU2hpZnRBbW91bnQoYik7aWYoMD5rKXJldHVybiBkLl9fcmlnaHRTaGlmdEJ5TWF4aW11bShlKTtiPWs+Pj41O3ZhciBmPTMxJmssZz1jLWI7aWYoMD49ZylyZXR1cm4gZC5fX3JpZ2h0U2hpZnRCeU1heGltdW0oZSk7az0hMTtpZihlKWlmKDAhPShhLl9fZGlnaXQoYikmKDE8PGYpLTEpKWs9ITA7ZWxzZSBmb3IodmFyIGg9MDtoPGI7aCsrKWlmKDAhPT1hLl9fZGlnaXQoaCkpe2s9ITA7YnJlYWt9ayYmMD09PWYmJjA9PX5hLl9fZGlnaXQoYy0xKSYmZysrO2U9bmV3IGQoZyxlKTtpZigwPT09Zilmb3IoZj1iO2Y8YztmKyspZS5fX3NldERpZ2l0KGYtYixhLl9fZGlnaXQoZikpO2Vsc2V7Zz1hLl9fZGlnaXQoYik+Pj5mO2g9Yy1iLTE7Zm9yKHZhciBwPTA7cDxoO3ArKyljPWEuX19kaWdpdChwK2IrMSksZS5fX3NldERpZ2l0KHAsYzw8MzItZnxnKSxnPWM+Pj5mO2UuX19zZXREaWdpdChoLGcpfXJldHVybiBrJiZcbihlPWQuX19hYnNvbHV0ZUFkZE9uZShlLCEwLGUpKSxlLl9fdHJpbSgpfX0se2tleTpcIl9fcmlnaHRTaGlmdEJ5TWF4aW11bVwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhP2QuX19vbmVEaWdpdCgxLCEwKTpkLl9femVybygpfX0se2tleTpcIl9fdG9TaGlmdEFtb3VudFwiLHZhbHVlOmZ1bmN0aW9uKGEpe2lmKDE8YS5sZW5ndGgpcmV0dXJuLTE7YT1hLl9fdW5zaWduZWREaWdpdCgwKTtyZXR1cm4gYT5kLl9fa01heExlbmd0aEJpdHM/LTE6YX19LHtrZXk6XCJfX3RvUHJpbWl0aXZlXCIsdmFsdWU6ZnVuY3Rpb24oYil7dmFyIGM9MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOlwiZGVmYXVsdFwiO2lmKFwib2JqZWN0XCIhPT1hKGIpfHxiLmNvbnN0cnVjdG9yPT09ZClyZXR1cm4gYjt2YXIgZT1iW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYoZSl7Yz1lKGMpO2lmKFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufWlmKGM9Yi52YWx1ZU9mKWlmKGM9Yy5jYWxsKGIpLFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO2lmKGM9Yi50b1N0cmluZylpZihjPWMuY2FsbChiKSxcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYzt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTt9fSx7a2V5OlwiX190b051bWVyaWNcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gZC5fX2lzQmlnSW50KGEpP2E6K2F9fSx7a2V5OlwiX19pc0JpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGIpe3JldHVyblwib2JqZWN0XCI9PT1hKGIpJiZiLmNvbnN0cnVjdG9yPT09ZH19LHtrZXk6XCJfX3RydW5jYXRlVG9OQml0c1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YSszMT4+PjUsZT1uZXcgZChjLGIuc2lnbik7LS1jO2Zvcih2YXIgaz0wO2s8YztrKyspZS5fX3NldERpZ2l0KGssYi5fX2RpZ2l0KGspKTtiPWIuX19kaWdpdChjKTswIT0oMzEmYSkmJihhPTMyLSgzMSZhKSxiPWI8PGE+Pj5cbmEpO3JldHVybiBlLl9fc2V0RGlnaXQoYyxiKSxlLl9fdHJpbSgpfX0se2tleTpcIl9fdHJ1bmNhdGVBbmRTdWJGcm9tUG93ZXJPZlR3b1wiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT1NYXRoLm1pbixrPWErMzE+Pj41O2M9bmV3IGQoayxjKTt2YXIgZj0wOy0tazt2YXIgZz0wO2ZvcihlPWUoayxiLmxlbmd0aCk7ZjxlO2YrKyl7dmFyIGg9Yi5fX2RpZ2l0KGYpLHA9LSg2NTUzNSZoKS1nO2c9MSZwPj4+MTY7aD0tKGg+Pj4xNiktZztnPTEmaD4+PjE2O2MuX19zZXREaWdpdChmLDY1NTM1JnB8aDw8MTYpfWZvcig7ZjxrO2YrKyljLl9fc2V0RGlnaXQoZiwwfC1nKTtiPWs8Yi5sZW5ndGg/Yi5fX2RpZ2l0KGspOjA7YSY9MzE7MD09PWE/KGc9LSg2NTUzNSZiKS1nLGc9NjU1MzUmZ3wtKGI+Pj4xNiktKDEmZz4+PjE2KTw8MTYpOihhPTMyLWEsYj1iPDxhPj4+YSxhPTE8PDMyLWEsZz0oNjU1MzUmYSktKDY1NTM1JmIpLWcsZz0oNjU1MzUmZ3woYT4+PjE2KS0oYj4+PjE2KS0oMSZnPj4+XG4xNik8PDE2KSZhLTEpO3JldHVybiBjLl9fc2V0RGlnaXQoayxnKSxjLl9fdHJpbSgpfX0se2tleTpcIl9fZGlnaXRQb3dcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD0xOzA8YjspMSZiJiYoZCo9YSksYj4+Pj0xLGEqPWE7cmV0dXJuIGR9fV0pLGR9KG4oQXJyYXkpKTtyZXR1cm4gQi5fX2tNYXhMZW5ndGg9MzM1NTQ0MzIsQi5fX2tNYXhMZW5ndGhCaXRzPUIuX19rTWF4TGVuZ3RoPDw1LEIuX19rTWF4Qml0c1BlckNoYXI9WzAsMCwzMiw1MSw2NCw3NSw4Myw5MCw5NiwxMDIsMTA3LDExMSwxMTUsMTE5LDEyMiwxMjYsMTI4LDEzMSwxMzQsMTM2LDEzOSwxNDEsMTQzLDE0NSwxNDcsMTQ5LDE1MSwxNTMsMTU0LDE1NiwxNTgsMTU5LDE2MCwxNjIsMTYzLDE2NSwxNjZdLEIuX19rQml0c1BlckNoYXJUYWJsZVNoaWZ0PTUsQi5fX2tCaXRzUGVyQ2hhclRhYmxlTXVsdGlwbGllcj0xPDxCLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdCxCLl9fa0NvbnZlcnNpb25DaGFycz1cIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiLnNwbGl0KFwiXCIpLFxuQi5fX2tCaXRDb252ZXJzaW9uQnVmZmVyPW5ldyBBcnJheUJ1ZmZlcig4KSxCLl9fa0JpdENvbnZlcnNpb25Eb3VibGU9bmV3IEZsb2F0NjRBcnJheShCLl9fa0JpdENvbnZlcnNpb25CdWZmZXIpLEIuX19rQml0Q29udmVyc2lvbkludHM9bmV3IEludDMyQXJyYXkoQi5fX2tCaXRDb252ZXJzaW9uQnVmZmVyKSxCLl9fY2x6MzI9dnx8ZnVuY3Rpb24oYSl7dmFyIGI9TWF0aC5MTjIsZD1NYXRoLmxvZztyZXR1cm4gMD09PWE/MzI6MHwzMS0oMHxkKGE+Pj4wKS9iKX0sQi5fX2ltdWw9dHx8ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMHxhKmJ9LEJ9KX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhLGIpeyhmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoYSl7ZGVsZXRlIHRbYV19ZnVuY3Rpb24gZihhKXtpZih2KXNldFRpbWVvdXQoZiwwLGEpO2Vsc2V7dmFyIGI9dFthXTtpZihiKXt2PSEwO3RyeXt2YXIgZD1iLmNhbGxiYWNrLGs9Yi5hcmdzO3N3aXRjaChrLmxlbmd0aCl7Y2FzZSAwOmQoKTtcbmJyZWFrO2Nhc2UgMTpkKGtbMF0pO2JyZWFrO2Nhc2UgMjpkKGtbMF0sa1sxXSk7YnJlYWs7Y2FzZSAzOmQoa1swXSxrWzFdLGtbMl0pO2JyZWFrO2RlZmF1bHQ6ZC5hcHBseShjLGspfX1maW5hbGx5e2UoYSksdj0hMX19fX1mdW5jdGlvbiBkKCl7RD1mdW5jdGlvbihhKXtiLm5leHRUaWNrKGZ1bmN0aW9uKCl7ZihhKX0pfX1mdW5jdGlvbiBnKCl7aWYoYS5wb3N0TWVzc2FnZSYmIWEuaW1wb3J0U2NyaXB0cyl7dmFyIGI9ITAsZD1hLm9ubWVzc2FnZTthLm9ubWVzc2FnZT1mdW5jdGlvbigpe2I9ITF9O2EucG9zdE1lc3NhZ2UoXCJcIixcIipcIik7YS5vbm1lc3NhZ2U9ZDtyZXR1cm4gYn19ZnVuY3Rpb24gbigpe3ZhciBiPVwic2V0SW1tZWRpYXRlJFwiK01hdGgucmFuZG9tKCkrXCIkXCIsZD1mdW5jdGlvbihkKXtkLnNvdXJjZT09PWEmJlwic3RyaW5nXCI9PT10eXBlb2YgZC5kYXRhJiYwPT09ZC5kYXRhLmluZGV4T2YoYikmJmYoK2QuZGF0YS5zbGljZShiLmxlbmd0aCkpfTthLmFkZEV2ZW50TGlzdGVuZXI/XG5hLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsZCwhMSk6YS5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLGQpO0Q9ZnVuY3Rpb24oZCl7YS5wb3N0TWVzc2FnZShiK2QsXCIqXCIpfX1mdW5jdGlvbiBrKCl7dmFyIGE9bmV3IE1lc3NhZ2VDaGFubmVsO2EucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKGEpe2YoYS5kYXRhKX07RD1mdW5jdGlvbihiKXthLnBvcnQyLnBvc3RNZXNzYWdlKGIpfX1mdW5jdGlvbiBwKCl7dmFyIGE9Qi5kb2N1bWVudEVsZW1lbnQ7RD1mdW5jdGlvbihiKXt2YXIgZD1CLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtmKGIpO2Qub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7YS5yZW1vdmVDaGlsZChkKTtkPW51bGx9O2EuYXBwZW5kQ2hpbGQoZCl9fWZ1bmN0aW9uIHUoKXtEPWZ1bmN0aW9uKGEpe3NldFRpbWVvdXQoZiwwLGEpfX1pZighYS5zZXRJbW1lZGlhdGUpe3ZhciBBPTEsdD17fSx2PSExLEI9YS5kb2N1bWVudCxcbkQsRT1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtFPUUmJkUuc2V0VGltZW91dD9FOmE7XCJbb2JqZWN0IHByb2Nlc3NdXCI9PT17fS50b1N0cmluZy5jYWxsKGEucHJvY2Vzcyk/ZCgpOmcoKT9uKCk6YS5NZXNzYWdlQ2hhbm5lbD9rKCk6QiYmXCJvbnJlYWR5c3RhdGVjaGFuZ2VcImluIEIuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKT9wKCk6dSgpO0Uuc2V0SW1tZWRpYXRlPWZ1bmN0aW9uKGEpe1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBhJiYoYT1uZXcgRnVuY3Rpb24oXCJcIithKSk7Zm9yKHZhciBiPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWJbZF09YXJndW1lbnRzW2QrMV07dFtBXT17Y2FsbGJhY2s6YSxhcmdzOmJ9O0QoQSk7cmV0dXJuIEErK307RS5jbGVhckltbWVkaWF0ZT1lfX0pKFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygc2VsZj9cInVuZGVmaW5lZFwiPT09dHlwZW9mIGE/dGhpczphOnNlbGYpfSkuY2FsbCh0aGlzLFxuYSgwKSxhKDgpKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKCl7dGhyb3cgRXJyb3IoXCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpO31mdW5jdGlvbiBjKCl7dGhyb3cgRXJyb3IoXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIik7fWZ1bmN0aW9uIGIoYil7aWYoZz09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoYiwwKTtpZigoZz09PWF8fCFnKSYmc2V0VGltZW91dClyZXR1cm4gZz1zZXRUaW1lb3V0LHNldFRpbWVvdXQoYiwwKTt0cnl7cmV0dXJuIGcoYiwwKX1jYXRjaCh2KXt0cnl7cmV0dXJuIGcuY2FsbChudWxsLGIsMCl9Y2F0Y2goQil7cmV0dXJuIGcuY2FsbCh0aGlzLGIsMCl9fX1mdW5jdGlvbiBlKGEpe2lmKG49PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigobj09PWN8fCFuKSYmY2xlYXJUaW1lb3V0KXJldHVybiBuPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBuKGEpfWNhdGNoKHYpe3RyeXtyZXR1cm4gbi5jYWxsKG51bGwsXG5hKX1jYXRjaChCKXtyZXR1cm4gbi5jYWxsKHRoaXMsYSl9fX1mdW5jdGlvbiBmKCl7cCYmdSYmKHA9ITEsdS5sZW5ndGg/az11LmNvbmNhdChrKTpBPS0xLGsubGVuZ3RoJiZsKCkpfWZ1bmN0aW9uIGwoKXtpZighcCl7dmFyIGE9YihmKTtwPSEwO2Zvcih2YXIgZD1rLmxlbmd0aDtkOyl7dT1rO2ZvcihrPVtdOysrQTxkOyl1JiZ1W0FdLnJ1bigpO0E9LTE7ZD1rLmxlbmd0aH11PW51bGw7cD0hMTtlKGEpfX1mdW5jdGlvbiBoKGEsYil7dGhpcy5mdW49YTt0aGlzLmFycmF5PWJ9ZnVuY3Rpb24gZCgpe31tPW0uZXhwb3J0cz17fTt0cnl7dmFyIGc9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDphfWNhdGNoKHQpe2c9YX10cnl7dmFyIG49XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6Y31jYXRjaCh0KXtuPWN9dmFyIGs9W10scD0hMSx1LEE9LTE7bS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgZD1BcnJheShhcmd1bWVudHMubGVuZ3RoLVxuMSk7aWYoMTxhcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspZFtjLTFdPWFyZ3VtZW50c1tjXTtrLnB1c2gobmV3IGgoYSxkKSk7MSE9PWsubGVuZ3RofHxwfHxiKGwpfTtoLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTttLnRpdGxlPVwiYnJvd3NlclwiO20uYnJvd3Nlcj0hMDttLmVudj17fTttLmFyZ3Y9W107bS52ZXJzaW9uPVwiXCI7bS52ZXJzaW9ucz17fTttLm9uPWQ7bS5hZGRMaXN0ZW5lcj1kO20ub25jZT1kO20ub2ZmPWQ7bS5yZW1vdmVMaXN0ZW5lcj1kO20ucmVtb3ZlQWxsTGlzdGVuZXJzPWQ7bS5lbWl0PWQ7bS5wcmVwZW5kTGlzdGVuZXI9ZDttLnByZXBlbmRPbmNlTGlzdGVuZXI9ZDttLmxpc3RlbmVycz1mdW5jdGlvbihhKXtyZXR1cm5bXX07bS5iaW5kaW5nPWZ1bmN0aW9uKGEpe3Rocm93IEVycm9yKFwicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcIik7fTttLmN3ZD1cbmZ1bmN0aW9uKCl7cmV0dXJuXCIvXCJ9O20uY2hkaXI9ZnVuY3Rpb24oYSl7dGhyb3cgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIik7fTttLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbihtLHEpe1NrLmFzc2VydHM9e307U2suYXNzZXJ0cy5hc3NlcnQ9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYX07U2suZXhwb3J0U3ltYm9sKFwiU2suYXNzZXJ0cy5hc3NlcnRcIixTay5hc3NlcnRzLmFzc2VydCk7U2suYXNzZXJ0cy5mYWlsPWZ1bmN0aW9uKGEpe307U2suZXhwb3J0U3ltYm9sKFwiU2suYXNzZXJ0cy5mYWlsXCIsU2suYXNzZXJ0cy5mYWlsKX0sZnVuY3Rpb24obSxxKXtTay5ib29sX2NoZWNrPWZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwPT09YXx8bnVsbD09PWF8fFwiYm9vbGVhblwiIT09dHlwZW9mIGEpdGhyb3cgRXJyb3IoXCJtdXN0IHNwZWNpZnkgXCIrYytcIiBhbmQgaXQgbXVzdCBiZSBhIGJvb2xlYW5cIik7fTtTay5weXRob24yPXtwcmludF9mdW5jdGlvbjohMSxcbmRpdmlzaW9uOiExLGFic29sdXRlX2ltcG9ydDpudWxsLHVuaWNvZGVfbGl0ZXJhbHM6ITEscHl0aG9uMzohMSxjbGFzc19yZXByOiExLGluaGVyaXRfZnJvbV9vYmplY3Q6ITEsc3VwZXJfYXJnczohMSxvY3RhbF9udW1iZXJfbGl0ZXJhbDohMSxiYW5rZXJzX3JvdW5kaW5nOiExLHB5dGhvbl92ZXJzaW9uOiExLGR1bmRlcl9yb3VuZDohMSxleGNlcHRpb25zOiExLG5vX2xvbmdfdHlwZTohMSxjZWlsX2Zsb29yX2ludDohMSxzaWxlbnRfb2N0YWxfbGl0ZXJhbDohMH07U2sucHl0aG9uMz17cHJpbnRfZnVuY3Rpb246ITAsZGl2aXNpb246ITAsYWJzb2x1dGVfaW1wb3J0Om51bGwsdW5pY29kZV9saXRlcmFsczohMCxweXRob24zOiEwLGNsYXNzX3JlcHI6ITAsaW5oZXJpdF9mcm9tX29iamVjdDohMCxzdXBlcl9hcmdzOiEwLG9jdGFsX251bWJlcl9saXRlcmFsOiEwLGJhbmtlcnNfcm91bmRpbmc6ITAscHl0aG9uX3ZlcnNpb246ITAsZHVuZGVyX3JvdW5kOiEwLGV4Y2VwdGlvbnM6ITAsXG5ub19sb25nX3R5cGU6ITAsY2VpbF9mbG9vcl9pbnQ6ITAsc2lsZW50X29jdGFsX2xpdGVyYWw6ITF9O1NrLmNvbmZpZ3VyZT1mdW5jdGlvbihhKXtTay5vdXRwdXQ9YS5vdXRwdXR8fFNrLm91dHB1dDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sub3V0cHV0KTtTay5maWxld3JpdGVyPWEuZmlsZXdyaXRlcnx8U2suZmlsZXdyaXRlcjtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlcik7U2suZGVidWdvdXQ9YS5kZWJ1Z291dHx8U2suZGVidWdvdXQ7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmRlYnVnb3V0KTtTay51bmNhdWdodEV4Y2VwdGlvbj1hLnVuY2F1Z2h0RXhjZXB0aW9ufHxTay51bmNhdWdodEV4Y2VwdGlvbjtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sudW5jYXVnaHRFeGNlcHRpb24pO1NrLnJlYWQ9YS5yZWFkfHxTay5yZWFkO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PVxudHlwZW9mIFNrLnJlYWQpO1NrLm5vbnJlYWRvcGVuPWEubm9ucmVhZG9wZW58fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLm5vbnJlYWRvcGVuKTtTay5maWxlb3Blbj1hLmZpbGVvcGVufHx2b2lkIDA7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmZpbGVvcGVufHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIFNrLmZpbGVvcGVuKTtTay5maWxld3JpdGU9YS5maWxld3JpdGV8fHZvaWQgMDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlfHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIFNrLmZpbGV3cml0ZSk7U2sudGltZW91dE1zZz1hLnRpbWVvdXRNc2d8fFNrLnRpbWVvdXRNc2c7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLnRpbWVvdXRNc2cpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRpbWVvdXRNc2dcIixTay50aW1lb3V0TXNnKTtTay5zeXNhcmd2PWEuc3lzYXJndnx8XG5Tay5zeXNhcmd2O1NrLmFzc2VydHMuYXNzZXJ0KFNrLmlzQXJyYXlMaWtlKFNrLnN5c2FyZ3YpKTtTay5fX2Z1dHVyZV9fPWEuX19mdXR1cmVfX3x8U2sucHl0aG9uMztTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb24sXCJTay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5kaXZpc2lvbixcIlNrLl9fZnV0dXJlX18uZGl2aXNpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnVuaWNvZGVfbGl0ZXJhbHMsXCJTay5fX2Z1dHVyZV9fLnVuaWNvZGVfbGl0ZXJhbHNcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmNsYXNzX3JlcHIsXCJTay5fX2Z1dHVyZV9fLmNsYXNzX3JlcHJcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmluaGVyaXRfZnJvbV9vYmplY3QsXCJTay5fX2Z1dHVyZV9fLmluaGVyaXRfZnJvbV9vYmplY3RcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnN1cGVyX2FyZ3MsXG5cIlNrLl9fZnV0dXJlX18uc3VwZXJfYXJnc1wiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18ub2N0YWxfbnVtYmVyX2xpdGVyYWwsXCJTay5fX2Z1dHVyZV9fLm9jdGFsX251bWJlcl9saXRlcmFsXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nLFwiU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5weXRob25fdmVyc2lvbixcIlNrLl9fZnV0dXJlX18ucHl0aG9uX3ZlcnNpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmR1bmRlcl9yb3VuZCxcIlNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5leGNlcHRpb25zLFwiU2suX19mdXR1cmVfXy5leGNlcHRpb25zXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5ub19sb25nX3R5cGUsXCJTay5fX2Z1dHVyZV9fLm5vX2xvbmdfdHlwZVwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnQsXG5cIlNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnRcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsLFwiU2suX19mdXR1cmVfXy5zaWxlbnRfb2N0YWxfbGl0ZXJhbFwiKTtTay5pbWFnZVByb3h5PWEuaW1hZ2VQcm94eXx8XCJodHRwOi8vbG9jYWxob3N0OjgwODAvMzIweFwiO1NrLmFzc2VydHMuYXNzZXJ0KFwic3RyaW5nXCI9PT10eXBlb2YgU2suaW1hZ2VQcm94eXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmltYWdlUHJveHkpO1NrLmlucHV0ZnVuPWEuaW5wdXRmdW58fFNrLmlucHV0ZnVuO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5pbnB1dGZ1bik7U2suaW5wdXRmdW5UYWtlc1Byb21wdD1hLmlucHV0ZnVuVGFrZXNQcm9tcHR8fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLmlucHV0ZnVuVGFrZXNQcm9tcHQpO1NrLnJldGFpbkdsb2JhbHM9YS5yZXRhaW5nbG9iYWxzfHxhLnJldGFpbkdsb2JhbHN8fFxuITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2sucmV0YWluR2xvYmFscyk7U2suZGVidWdnaW5nPWEuZGVidWdnaW5nfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5kZWJ1Z2dpbmcpO1NrLmtpbGxhYmxlV2hpbGU9YS5raWxsYWJsZVdoaWxlfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5raWxsYWJsZVdoaWxlKTtTay5raWxsYWJsZUZvcj1hLmtpbGxhYmxlRm9yfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5raWxsYWJsZUZvcik7U2suc2lnbmFscz1hLnNpZ25hbHM7U2suc2lnbmFscz0hMD09PVNrLnNpZ25hbHM/e2xpc3RlbmVyczpbXSxhZGRFdmVudExpc3RlbmVyKGEpe1NrLnNpZ25hbHMubGlzdGVuZXJzLnB1c2goYSl9LHJlbW92ZUV2ZW50TGlzdGVuZXIoYSl7YT1Tay5zaWduYWxzLmxpc3RlbmVycy5pbmRleE9mKGEpOzA8PWEmJlNrLnNpZ25hbHMubGlzdGVuZXJzLnNwbGljZShhLFxuMSl9LHNpZ25hbChhLGIpe2Zvcih2YXIgYz0wO2M8U2suc2lnbmFscy5saXN0ZW5lcnMubGVuZ3RoO2MrKylTay5zaWduYWxzLmxpc3RlbmVyc1tjXS5jYWxsKG51bGwsYSxiKX19Om51bGw7U2suYXNzZXJ0cy5hc3NlcnQoXCJvYmplY3RcIj09PXR5cGVvZiBTay5zaWduYWxzKTtTay5icmVha3BvaW50cz1hLmJyZWFrcG9pbnRzfHxmdW5jdGlvbigpe3JldHVybiEwfTtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suYnJlYWtwb2ludHMpO1NrLnNldFRpbWVvdXQ9YS5zZXRUaW1lb3V0O3ZvaWQgMD09PVNrLnNldFRpbWVvdXQmJihTay5zZXRUaW1lb3V0PVwiZnVuY3Rpb25cIj09PXR5cGVvZiBzZXRUaW1lb3V0P2Z1bmN0aW9uKGEsYil7c2V0VGltZW91dChhLGIpfTpmdW5jdGlvbihhLGIpe2EoKX0pO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5zZXRUaW1lb3V0KTtcImV4ZWNMaW1pdFwiaW4gYSYmKFNrLmV4ZWNMaW1pdD1hLmV4ZWNMaW1pdCk7XG5cInlpZWxkTGltaXRcImluIGEmJihTay55aWVsZExpbWl0PWEueWllbGRMaW1pdCk7YS5zeXNwYXRoJiYoU2suc3lzcGF0aD1hLnN5c3BhdGgsU2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoU2suc3lzcGF0aCkpLFNrLnJlYWxzeXNwYXRoPXZvaWQgMCxTay5zeXNtb2R1bGVzPW5ldyBTay5idWlsdGluLmRpY3QoW10pKTtTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExO1NrLnN3aXRjaF92ZXJzaW9uKFNrLl9fZnV0dXJlX18ucHl0aG9uMyk7U2suYnVpbHRpbi5zdHIuJG5leHQ9U2suX19mdXR1cmVfXy5weXRob24zP25ldyBTay5idWlsdGluLnN0cihcIl9fbmV4dF9fXCIpOm5ldyBTay5idWlsdGluLnN0cihcIm5leHRcIik7U2suc2V0dXBPcGVyYXRvcnMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay5zZXR1cER1bmRlck1ldGhvZHMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay5zZXR1cE9iamVjdHMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay50b2tlbi5zZXR1cFRva2VucyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpfTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmNvbmZpZ3VyZVwiLFNrLmNvbmZpZ3VyZSk7U2sudW5jYXVnaHRFeGNlcHRpb249ZnVuY3Rpb24oYSl7dGhyb3cgYTt9O1NrLnVuY2F1Z2h0RXhjZXB0aW9uPWZ1bmN0aW9uKGEpe3Rocm93IGE7fTtTay5leHBvcnRTeW1ib2woXCJTay51bmNhdWdodEV4Y2VwdGlvblwiLFNrLnVuY2F1Z2h0RXhjZXB0aW9uKTtTay50aW1lb3V0TXNnPWZ1bmN0aW9uKCl7cmV0dXJuXCJQcm9ncmFtIGV4Y2VlZGVkIHJ1biB0aW1lIGxpbWl0LlwifTtTay5leHBvcnRTeW1ib2woXCJTay50aW1lb3V0TXNnXCIsU2sudGltZW91dE1zZyk7U2suZXhlY0xpbWl0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtTay55aWVsZExpbWl0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtTay5vdXRwdXQ9ZnVuY3Rpb24oYSl7fTtTay5yZWFkPWZ1bmN0aW9uKGEpe2lmKHZvaWQgMD09PVNrLmJ1aWx0aW5GaWxlcyl0aHJvd1wic2t1bHB0LXN0ZGxpYi5qcyBoYXMgbm90IGJlZW4gbG9hZGVkXCI7aWYodm9pZCAwPT09XG5Tay5idWlsdGluRmlsZXMuZmlsZXNbYV0pdGhyb3dcIkZpbGUgbm90IGZvdW5kOiAnXCIrYStcIidcIjtyZXR1cm4gU2suYnVpbHRpbkZpbGVzLmZpbGVzW2FdfTtTay5zeXNhcmd2PVtdO1NrLmdldFN5c0FyZ3Y9ZnVuY3Rpb24oKXtyZXR1cm4gU2suc3lzYXJndn07U2suZXhwb3J0U3ltYm9sKFwiU2suZ2V0U3lzQXJndlwiLFNrLmdldFN5c0FyZ3YpO1NrLnN5c3BhdGg9W107U2suaW5Ccm93c2VyPXZvaWQgMCE9PVNrLmdsb2JhbC5kb2N1bWVudDtTay5kZWJ1Z291dD1mdW5jdGlvbihhKXt9OyhmdW5jdGlvbigpe3ZvaWQgMCE9PVNrLmdsb2JhbC53cml0ZT8oU2sub3V0cHV0PVNrLmdsb2JhbC53cml0ZSxTay5maWxld3JpdGVyPVNrLmdsb2JhbC53cml0ZSk6dm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUmJnZvaWQgMCE9PVNrLmdsb2JhbC5jb25zb2xlLmxvZz8oU2sub3V0cHV0PWZ1bmN0aW9uKGEpe1NrLmdsb2JhbC5jb25zb2xlLmxvZyhhKX0sU2suZmlsZXdyaXRlcj1Tay5vdXRwdXQpOlxudm9pZCAwIT09U2suZ2xvYmFsLnByaW50JiYoU2sub3V0cHV0PVNrLmdsb2JhbC5wcmludCxTay5maWxld3JpdGVyPVNrLm91dHB1dCk7dm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUmJnZvaWQgMCE9PVNrLmdsb2JhbC5jb25zb2xlLmxvZz9Tay5kZWJ1Z291dD1mdW5jdGlvbihhKXtTay5nbG9iYWwuY29uc29sZS5sb2coYSl9OnZvaWQgMCE9PVNrLmdsb2JhbC5wcmludCYmKFNrLmRlYnVnb3V0PVNrLmdsb2JhbC5wcmludCl9KSgpO1NrLmlucHV0ZnVuPWZ1bmN0aW9uKGEpe3JldHVybiB3aW5kb3cucHJvbXB0KGEpfTtTay5zZXR1cF9tZXRob2RfbWFwcGluZ3M9ZnVuY3Rpb24oKXt9O1NrLnNldHVwRGljdEl0ZXJhdG9ycz1mdW5jdGlvbihhKXt9O1NrLnN3aXRjaF92ZXJzaW9uPWZ1bmN0aW9uKGEpe2NvbnN0IGM9e2Zsb2F0Xzp7bWV0aG9kX25hbWVzOltcIl9fcm91bmRfX1wiXSwyOlshMV0sMzpbITBdfSxpbnRfOnttZXRob2RfbmFtZXM6W1wiX19yb3VuZF9fXCJdLDI6WyExXSwzOlshMF19LFxubGlzdDp7bWV0aG9kX25hbWVzOltcImNsZWFyXCIsXCJjb3B5XCIsXCJzb3J0XCJdLDI6WyExLCExLCEwXSwzOlshMCwhMCwhMF19LGRpY3Q6e21ldGhvZF9uYW1lczpbXCJoYXNfa2V5XCIsXCJrZXlzXCIsXCJpdGVtc1wiLFwidmFsdWVzXCJdLDI6WyEwLCEwLCEwLCEwXSwzOlshMSwhMCwhMCwhMF19fTtmb3IobGV0IGwgaW4gYyl7Y29uc3QgaD1Tay5idWlsdGluW2xdLGQ9Y1tsXS5tZXRob2RfbmFtZXM7dmFyIGI9Y1tsXVszXTtpZihhJiZ2b2lkIDA9PT1oLnB5MyRtZXRob2RzKWJyZWFrO2Vsc2UgaWYodm9pZCAwPT09aC5weTMkbWV0aG9kcyl7aC5weTMkbWV0aG9kcz17fTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9ZFtlXTtiW2VdJiYoaC5weTMkbWV0aG9kc1tmXT1oLnByb3RvdHlwZVtmXS5kJGRlZil9fWE/ZT1oLnB5MyRtZXRob2RzOihiPWNbbF1bMl0sZT1oLnB5MiRtZXRob2RzKTtmb3IoZj0wO2Y8ZC5sZW5ndGg7ZisrKXtjb25zdCBhPWRbZl07ZGVsZXRlIGgucHJvdG90eXBlW2FdO1xuYltmXSYmKGgucHJvdG90eXBlW2FdPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKGgsZVthXSkpfX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLl9fZnV0dXJlX19cIixTay5fX2Z1dHVyZV9fKTtTay5leHBvcnRTeW1ib2woXCJTay5pbnB1dGZ1blwiLFNrLmlucHV0ZnVuKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZVthLiRtYW5nbGVkXX1mdW5jdGlvbiBjKGEpe2E9YS4kbWFuZ2xlZDtjb25zdCBiPXRoaXMucHJvdG90eXBlLnRwJG1ybztmb3IobGV0IGQ9MDtkPGIubGVuZ3RoOysrZCl7Y29uc3QgYz1iW2RdLnByb3RvdHlwZTtpZihjLmhhc093blByb3BlcnR5KGEpKXJldHVybiBjW2FdfX1mdW5jdGlvbiBiKGIsZixoLGspe2NvbnN0IGQ9ZShoKSxnPWYucHJvdG90eXBlO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoYixmLGQsayk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZyx7c2skcHJvdG90eXBpY2FsOnt2YWx1ZTohMCx3cml0YWJsZTohMH0sXG50cCRiYXNlczp7dmFsdWU6aCx3cml0YWJsZTohMH0sdHAkbXJvOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxocCR0eXBlOnt2YWx1ZTohMCx3cml0YWJsZTohMH19KTtnLnRwJG1ybz1mLiRidWlsZE1STygpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGYseyR0eXBlTG9va3VwOnt2YWx1ZTpnLnNrJHByb3RvdHlwaWNhbD9hOmMsd3JpdGFibGU6ITB9LHNrJGtsYXNzOnt2YWx1ZTohMCx3cml0YWJsZTohMH19KX1mdW5jdGlvbiBlKGEpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuIHZvaWQgMD09PWEuc2ska2xhc3M/YTpiKGEucHJvdG90eXBlLnRwJGJhc2UpfTA9PT1hLmxlbmd0aCYmYS5wdXNoKFNrLmJ1aWx0aW4ub2JqZWN0KTtsZXQgZCxjLGUsZjtmb3IobGV0IGs9MDtrPGEubGVuZ3RoO2srKyl7Zj1hW2tdO2lmKCFTay5idWlsdGluLmNoZWNrQ2xhc3MoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFzZXMgbXVzdCBiZSAndHlwZScgb2JqZWN0c1wiKTtpZighMT09PVxuZi5zayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3MpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSAnXCIrZi5wcm90b3R5cGUudHAkbmFtZStcIicgaXMgbm90IGFuIGFjY2VwdGFibGUgYmFzZSB0eXBlXCIpO2U9YihmKTtpZih2b2lkIDA9PT1jKWM9ZSxkPWY7ZWxzZSBpZighYy4kaXNTdWJUeXBlKGUpKWlmKGUuJGlzU3ViVHlwZShjKSljPWUsZD1mO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibXVsdGlwbGUgYmFzZXMgaGF2ZSBpbnN0YW5jZSBsYXlvdXQgY29uZmxpY3RzXCIpO31yZXR1cm4gZH1mdW5jdGlvbiBmKGEpe2Zvcig7bnVsbCE9PWEucHJvdG90eXBlLnRwJGJhc2U7KXtpZih2b2lkIDA9PT1hLnNrJGtsYXNzJiZhLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcIl9fZGljdF9fXCIpKXJldHVybiBhPWEucHJvdG90eXBlLl9fZGljdF9fLFNrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3IoYSk/YTp2b2lkIDA7YT1hLnByb3RvdHlwZS50cCRiYXNlfX1cbmZ1bmN0aW9uIGwoYSxiLGMpe2lmKHZvaWQgMD09PWEuc2ska2xhc3MpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3Qgc2V0IFwiK2EucHJvdG90eXBlLnRwJG5hbWUrXCIuXCIrYy4kanNzdHIoKSk7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBkZWxldGUgXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIi5cIitjLiRqc3N0cigpKTt9dm9pZCAwPT09U2suYnVpbHRpbiYmKFNrLmJ1aWx0aW49e30pO1NrLmJ1aWx0aW4udHlwZT1mdW5jdGlvbihhKXt0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi50eXBlJiZTay5hc3NlcnRzLmZhaWwoXCJjYWxsaW5nIG5ldyBTay5idWlsdGluLnR5cGUgaXMgbm90IHNhZmVcIik7cmV0dXJuIGEub2IkdHlwZX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2suYnVpbHRpbi50eXBlLnByb3RvdHlwZSx7Y2FsbDp7dmFsdWU6RnVuY3Rpb24ucHJvdG90eXBlLmNhbGx9LGFwcGx5Ont2YWx1ZTpGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHl9LFxudHAkc2xvdHM6e3ZhbHVlOnt0cCRkb2M6XCJ0eXBlKG9iamVjdF9vcl9uYW1lLCBiYXNlcywgZGljdClcXG50eXBlKG9iamVjdCkgLT4gdGhlIG9iamVjdCdzIHR5cGVcXG50eXBlKG5hbWUsIGJhc2VzLCBkaWN0KSAtPiBhIG5ldyB0eXBlXCIsdHAkY2FsbDpmdW5jdGlvbihhLGIpe2lmKHRoaXM9PT1Tay5idWlsdGluLnR5cGUpe2lmKDE9PT1hLmxlbmd0aCYmKHZvaWQgMD09PWJ8fCFiLmxlbmd0aCkpcmV0dXJuIGFbMF0ub2IkdHlwZTtpZigzIT09YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIHRha2VzIDEgb3IgMyBhcmd1bWVudHNcIik7fWxldCBkPXRoaXMucHJvdG90eXBlLnRwJG5ldyhhLGIpO2lmKGQuJGlzU3VzcGVuc2lvbilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCxjPT57ZD1jO2lmKGQub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMpKXJldHVybiBkLnRwJGluaXQoYSxiKX0sKCk9PmQpO2lmKGQub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMpKXtjb25zdCBjPVxuZC50cCRpbml0KGEsYik7cmV0dXJuIHZvaWQgMCE9PWMmJmMuJGlzU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5jaGFpbihjLCgpPT5kKTpkfXJldHVybiBkfSx0cCRuZXc6ZnVuY3Rpb24oYSxjKXtpZigzIT09YS5sZW5ndGgpe2lmKDE9PT1hLmxlbmd0aCYmKHZvaWQgMD09PWN8fCFjLmxlbmd0aCkpcmV0dXJuIGFbMF0ub2IkdHlwZTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgdGFrZXMgMSBvciAzIGFyZ3VtZW50c1wiKTt9bGV0IGQ7Yz1hWzBdO2Q9YVsxXTthPWFbMl07aWYoXCJkaWN0XCIhPT1hLnRwJG5hbWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIGFyZ3VtZW50IDMgbXVzdCBiZSBkaWN0LCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR5cGUoKSBhcmd1bWVudCAxIG11c3QgYmUgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpO1xuYz1jLiRqc3N0cigpO2lmKFwidHVwbGVcIiE9PWQudHAkbmFtZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgYXJndW1lbnQgMiBtdXN0IGJlIHR1cGxlLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoZCkpO2Q9ZC5zayRhc2FycmF5KCk7Y29uc3QgZT1mdW5jdGlvbigpe3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdH07YihjLGUsZCx0aGlzLmNvbnN0cnVjdG9yKTtTay5nbG9iYWxzJiYoZS5wcm90b3R5cGUuX19tb2R1bGVfXz1Tay5nbG9iYWxzLl9fbmFtZV9fKTtlLnByb3RvdHlwZS5fX2RvY19fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDt2b2lkIDA9PT1lLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkaWN0KSYmKGUucHJvdG90eXBlLl9fZGljdF9fPW5ldyBTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yKGUsaCkpO2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57ZS5wcm90b3R5cGVbYS4kbWFuZ2xlZF09Yn0pO2UucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwiX19uZXdfX1wiKSYmXG4oYT1lLnByb3RvdHlwZS5fX25ld19fLGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZ1bmMmJihlLnByb3RvdHlwZS5fX25ld19fPW5ldyBTay5idWlsdGluLnN0YXRpY21ldGhvZChhKSkpO2UuJGFsbG9jYXRlU2xvdHMoKTtyZXR1cm4gZX0sdHAkZ2V0YXR0cjpmdW5jdGlvbihhLGIpe3ZhciBkPXRoaXMub2IkdHlwZTtjb25zdCBjPWQuJHR5cGVMb29rdXAoYSk7bGV0IGU7aWYodm9pZCAwIT09YyYmKGU9Yy50cCRkZXNjcl9nZXQsdm9pZCAwIT09ZSYmdm9pZCAwIT09Yy50cCRkZXNjcl9zZXQpKXJldHVybiBiPWUuY2FsbChjLHRoaXMsZCxiKTthPXRoaXMuJHR5cGVMb29rdXAoYSk7aWYodm9pZCAwIT09YSlyZXR1cm4gZD1hLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1kP2I9ZC5jYWxsKGEsbnVsbCx0aGlzLGIpOmE7aWYodm9pZCAwIT09ZSlyZXR1cm4gYj1lLmNhbGwoYyx0aGlzLGQsYik7aWYodm9pZCAwIT09YylyZXR1cm4gY30sdHAkc2V0YXR0cjpmdW5jdGlvbihhLGIsYyl7aWYoIXRoaXMuc2ska2xhc3Mpe2lmKHZvaWQgMCE9PVxuYil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBzZXQgYXR0cmlidXRlcyBvZiBidWlsdC1pbi9leHRlbnNpb24gdHlwZSAnXCIrdGhpcy5wcm90b3R5cGUudHAkbmFtZStcIidcIik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZXMgb24gdHlwZSBvYmplY3QgJ1wiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInXCIpO31jb25zdCBkPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1kKXtjb25zdCBhPWQudHAkZGVzY3Jfc2V0O2lmKGEpcmV0dXJuIGEuY2FsbChkLHRoaXMsYixjKX1jPWEuJG1hbmdsZWQ7aWYodm9pZCAwPT09YilpZihiPXRoaXMucHJvdG90eXBlLGIuaGFzT3duUHJvcGVydHkoYykpZGVsZXRlIGJbY10sYT1Tay5kdW5kZXJUb1NrdWxwdFtjXSx2b2lkIDAhPT1hJiYoZGVsZXRlIHRoaXMucHJvdG90eXBlW2FdLGIuc2skcHJvdG90eXBpY2FsfHx0aGlzLiRhbGxvY2F0ZUdldHRlclNsb3QoYykpO1xuZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcInR5cGUgb2JqZWN0ICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJyBoYXMgbm8gYXR0cmlidXRlICdcIithLiRqc3N0cigpK1wiJ1wiKTtlbHNlIHRoaXMucHJvdG90eXBlW2NdPWIsYyBpbiBTay5kdW5kZXJUb1NrdWxwdCYmdGhpcy4kYWxsb2NhdGVTbG90KGMsYil9LCRyOmZ1bmN0aW9uKCl7bGV0IGE9dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXyxiPVwiXCIsYz1cImNsYXNzXCI7YSYmU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKT9iPWEuditcIi5cIjphPW51bGw7YXx8dGhpcy5zayRrbGFzc3x8U2suX19mdXR1cmVfXy5jbGFzc19yZXByfHwoYz1cInR5cGVcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIitjK1wiICdcIitiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInPlwiKX19LHdyaXRhYmxlOiEwfSx0cCRtZXRob2RzOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSx0cCRnZXRzZXRzOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxcbnNrJHR5cGU6e3ZhbHVlOiEwfSwkaXNTdWJUeXBlOnt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcz09PWF8fHRoaXMucHJvdG90eXBlIGluc3RhbmNlb2YgYXx8IXRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbCYmdGhpcy5wcm90b3R5cGUudHAkbXJvLmluY2x1ZGVzKGEpfX0sJGFsbG9jYXRlU2xvdDp7dmFsdWU6ZnVuY3Rpb24oYSxiKXthPVNrLnNsb3RzW2FdO2NvbnN0IGM9YS4kc2xvdF9uYW1lLGQ9dGhpcy5wcm90b3R5cGU7ZC5oYXNPd25Qcm9wZXJ0eShjKSYmZGVsZXRlIGRbY107ZFtjXT1hLiRzbG90X2Z1bmMoYil9fSwkYWxsb2NhdGVTbG90czp7dmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMucHJvdG90eXBlO3RoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbD9PYmplY3Qua2V5cyhhKS5mb3JFYWNoKGI9PntiIGluIFNrLnNsb3RzJiZ0aGlzLiRhbGxvY2F0ZVNsb3QoYixhW2JdKX0pOk9iamVjdC5rZXlzKFNrLnNsb3RzKS5mb3JFYWNoKGI9PnthLmhhc093blByb3BlcnR5KGIpP1xudGhpcy4kYWxsb2NhdGVTbG90KGIsYVtiXSk6dGhpcy4kYWxsb2NhdGVHZXR0ZXJTbG90KGIpfSl9fSwkYWxsb2NhdGVHZXR0ZXJTbG90Ont2YWx1ZTpmdW5jdGlvbihhKXtjb25zdCBiPVNrLnNsb3RzW2FdLiRzbG90X25hbWUsYz10aGlzLnByb3RvdHlwZTtjLmhhc093blByb3BlcnR5KGIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxiLHtjb25maWd1cmFibGU6ITAsZ2V0KCl7Y29uc3QgYT1jLnRwJG1ybztmb3IobGV0IGM9MTtjPGEubGVuZ3RoO2MrKyl7Y29uc3QgZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFbY10ucHJvdG90eXBlLGIpO2lmKHZvaWQgMCE9PWQmJmQudmFsdWUpcmV0dXJuIGQudmFsdWV9fX0pfX0sJHR5cGVMb29rdXA6e3ZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZS5zayRwcm90b3R5cGljYWw/dGhpcy5wcm90b3R5cGVbYS4kbWFuZ2xlZF06Yy5jYWxsKHRoaXMsYSl9LHdyaXRhYmxlOiEwfSwkbXJvTWVyZ2U6e3ZhbHVlOmZ1bmN0aW9uKGEpe3RoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbD1cbiEwO2xldCBiO2NvbnN0IGM9W107Zm9yKDs7KXtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKXt2YXIgZD1hW2JdO2lmKDAhPT1kLmxlbmd0aClicmVha31pZihiPT09YS5sZW5ndGgpcmV0dXJuIGM7dmFyIGU9W107Zm9yKGI9MDtiPGEubGVuZ3RoOysrYilpZihkPWFbYl0sMCE9PWQubGVuZ3RoKXtjb25zdCBiPWRbMF07ZD0wO2E6Zm9yKDtkPGEubGVuZ3RoOysrZCl7Y29uc3QgYz1hW2RdO2ZvcihsZXQgYT0xO2E8Yy5sZW5ndGg7KythKWlmKGNbYV09PT1iKWJyZWFrIGF9ZD09PWEubGVuZ3RoJiZlLnB1c2goYil9aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkluY29uc2lzdGVudCBwcmVjZWRlbmNlcyBpbiB0eXBlIGhpZXJhcmNoeVwiKTtlPWVbMF07Yy5sZW5ndGgmJnRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGNbYy5sZW5ndGgtMV0ucHJvdG90eXBlKSE9PWUucHJvdG90eXBlJiYodGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsPVxuITEpO2MucHVzaChlKTtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWQ9YVtiXSwwPGQubGVuZ3RoJiZkWzBdPT09ZSYmZC5zcGxpY2UoMCwxKX19fSwkYnVpbGRNUk86e3ZhbHVlOmZ1bmN0aW9uKCl7Y29uc3QgYT1bW3RoaXNdXSxiPXRoaXMucHJvdG90eXBlLnRwJGJhc2VzO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7KytjKWEucHVzaChbLi4uYltjXS5wcm90b3R5cGUudHAkbXJvXSk7Yz1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoOysrYSljLnB1c2goYlthXSk7YS5wdXNoKGMpO3JldHVybiB0aGlzLiRtcm9NZXJnZShhKX19LHNrJGF0dHJFcnJvcjp7dmFsdWUoKXtyZXR1cm5cInR5cGUgb2JqZWN0ICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJ1wifSx3cml0YWJsZTohMH19KTtTay5idWlsdGluLnR5cGUucHJvdG90eXBlLnRwJGdldHNldHM9e19fYmFzZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvdG90eXBlLnRwJGJhc2V8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LF9fYmFzZXNfXzp7JGdldCgpe3ZvaWQgMD09PVxudGhpcy5zayR0dXBsZV9iYXNlcyYmKHRoaXMuc2skdHVwbGVfYmFzZXM9bmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy5wcm90b3R5cGUudHAkYmFzZXMpKTtyZXR1cm4gdGhpcy5zayR0dXBsZV9iYXNlc319LF9fbXJvX186eyRnZXQoKXt2b2lkIDA9PT10aGlzLnNrJHR1cGxlX21ybyYmKHRoaXMuc2skdHVwbGVfbXJvPW5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMucHJvdG90eXBlLnRwJG1ybykpO3JldHVybiB0aGlzLnNrJHR1cGxlX21yb319LF9fZGljdF9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLm1hcHBpbmdwcm94eSh0aGlzLnByb3RvdHlwZSl9fSxfX2RvY19fOnskZ2V0KCl7Y29uc3QgYT10aGlzLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkb2MpO3JldHVybiBhP3ZvaWQgMCE9PWEudHAkZGVzY3JfZ2V0P3RoaXM9PT1Tay5idWlsdGluLnR5cGU/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMucHJvdG90eXBlLnRwJGRvYyk6YS50cCRkZXNjcl9nZXQobnVsbCxcbnRoaXMpOnRoaXMucHJvdG90eXBlLl9fZG9jX186U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkc2V0KGEpe2wodGhpcyxhLFNrLmJ1aWx0aW4uc3RyLiRkb2MpO3RoaXMucHJvdG90eXBlLl9fZG9jX189YX19LF9fbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnByb3RvdHlwZS50cCRuYW1lKX0sJHNldChhKXtsKHRoaXMsYSxTay5idWlsdGluLnN0ci4kbmFtZSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgYXNzaWduIHN0cmluZyB0byBcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiLl9fbmFtZV9fLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt0aGlzLnByb3RvdHlwZS50cCRuYW1lPWEuJGpzc3RyKCl9fSxfX21vZHVsZV9fOnskZ2V0KCl7bGV0IGE9dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXztyZXR1cm4gYSYmYS5vYiR0eXBlIT09U2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcj9cbmE6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiYnVpbHRpbnNcIil9LCRzZXQoYSl7bCh0aGlzLGEsU2suYnVpbHRpbi5zdHIuJG1vZHVsZSk7dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXz1hfX19O1NrLmJ1aWx0aW4udHlwZS5wcm90b3R5cGUudHAkbWV0aG9kcz17bXJvOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMuJGJ1aWxkTVJPKCkpfSwkZmxhZ3M6e05vQXJnczohMH19LF9fZGlyX186eyRtZXRoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXthIGluIFNrLnJlc2VydmVkV29yZHNffHwoYT1Tay51bmZpeFJlc2VydmVkKGEpLC0xIT09YS5pbmRleE9mKFwiJFwiKXx8Yi5oYXMoYSl8fChiLmFkZChhKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSkpfWNvbnN0IGI9bmV3IFNldCxjPVtdO2lmKHRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbClmb3IodmFyIGUgaW4gdGhpcy5wcm90b3R5cGUpYShlKTtlbHNle2U9dGhpcy5wcm90b3R5cGUudHAkbXJvO2ZvcihsZXQgYj1cbjA7YjxlLmxlbmd0aDtiKyspe2NvbnN0IGM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZVtiXS5wcm90b3R5cGUpO2ZvcihsZXQgYj0wO2I8Yy5sZW5ndGg7YisrKWEoY1tiXSl9fXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlNwZWNpYWxpemVkIF9fZGlyX18gaW1wbGVtZW50YXRpb24gZm9yIHR5cGVzLlwifX07Y29uc3QgaD17JGdldCgpe2NvbnN0IGE9Zih0aGlzLm9iJHR5cGUpO3JldHVybiB2b2lkIDAhPT1hP2EudHAkZGVzY3JfZ2V0KHRoaXMsdGhpcy5vYiR0eXBlKTpTay5nZW5lcmljLmdldFNldERpY3QuJGdldC5jYWxsKHRoaXMpfSwkc2V0KGEpe2NvbnN0IGI9Zih0aGlzLm9iJHR5cGUpO3JldHVybiB2b2lkIDAhPT1iP2IudHAkZGVzY3Jfc2V0KHRoaXMsYSk6U2suZ2VuZXJpYy5nZXRTZXREaWN0LiRzZXQuY2FsbCh0aGlzLGEpfSwkZG9jOlwiZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKVwiLFxuJG5hbWU6XCJfX2RpY3RfX1wifX0sZnVuY3Rpb24obSxxKXtTay5nZW5lcmljPXt9O1NrLmdlbmVyaWMuZ2V0QXR0cj1mdW5jdGlvbihhLGMpe2xldCBiO2NvbnN0IGU9dGhpcy5vYiR0eXBlLGY9ZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1mJiYoYj1mLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1iJiZ2b2lkIDAhPT1mLnRwJGRlc2NyX3NldCkpcmV0dXJuIGIuY2FsbChmLHRoaXMsZSxjKTtjb25zdCBsPXRoaXMuJGQ7aWYodm9pZCAwIT09bCYmKGE9bC5xdWljayRsb29rdXAoYSksdm9pZCAwIT09YSkpcmV0dXJuIGE7aWYodm9pZCAwIT09YilyZXR1cm4gYi5jYWxsKGYsdGhpcyxlLGMpO2lmKHZvaWQgMCE9PWYpcmV0dXJuIGZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmdlbmVyaWMuZ2V0QXR0clwiLFNrLmdlbmVyaWMuZ2V0QXR0cik7U2suZ2VuZXJpYy5zZXRBdHRyPWZ1bmN0aW9uKGEsYyxiKXt2YXIgZT10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoYSk7aWYodm9pZCAwIT09ZSYmbnVsbCE9PVxuZSl7Y29uc3QgYT1lLnRwJGRlc2NyX3NldDtpZihhKXJldHVybiBhLmNhbGwoZSx0aGlzLGMsYil9Yj10aGlzLiRkO2lmKHZvaWQgMCE9PWIpaWYoYi5tcCRhc3Nfc3Vic2NyaXB0KXtpZih2b2lkIDAhPT1jKXJldHVybiBiLm1wJGFzc19zdWJzY3JpcHQoYSxjKTt0cnl7cmV0dXJuIGIubXAkYXNzX3N1YnNjcmlwdChhKX1jYXRjaChmKXtpZihmIGluc3RhbmNlb2YgU2suYnVpbHRpbi5LZXlFcnJvcil0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIicgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2EuJGpzc3RyKCkrXCInXCIpO3Rocm93IGY7fX1lbHNlIGlmKFwib2JqZWN0XCI9PT10eXBlb2YgYil7ZT1hLiRtYW5nbGVkO2lmKHZvaWQgMCE9PWMpe2JbZV09YztyZXR1cm59aWYodm9pZCAwIT09YltlXSl7ZGVsZXRlIGJbZV07cmV0dXJufX10aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcih0aGlzLnNrJGF0dHJFcnJvcigpK1xuXCIgaGFzIG5vIGF0dHJpYnV0ZSAnXCIrYS4kanNzdHIoKStcIidcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5nZW5lcmljLnNldEF0dHJcIixTay5nZW5lcmljLnNldEF0dHIpO1NrLmdlbmVyaWMubmV3PWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjLGIpe2lmKHRoaXMuY29uc3RydWN0b3I9PT1hKXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcjtjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2EuY2FsbChjKTtyZXR1cm4gY319O1NrLmdlbmVyaWMubmV3TWV0aG9kRGVmPXskbWV0aChhLGMpe2NvbnN0IGI9dGhpcy5wcm90b3R5cGU7aWYoMT5hLmxlbmd0aCl0aHJvdyBhPWIudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIi5fX25ld19fKCk6IG5vdCBlbm91Z2ggYXJndW1lbnRzXCIpO3ZhciBlPWEuc2hpZnQoKTtpZih2b2lkIDA9PT1lLnNrJHR5cGUpdGhyb3cgYT1iLnRwJG5hbWUsbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCJfX25ld19fKFgpOiBYIGlzIG5vdCBhIHR5cGUgb2JqZWN0IChcIitcblNrLmFic3RyLnR5cGVOYW1lKGUpK1wiKVwiKTtpZighZS4kaXNTdWJUeXBlKHRoaXMpKXRocm93IGE9Yi50cCRuYW1lLGU9ZS5wcm90b3R5cGUudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIi5fX25ld19fKFwiK2UrXCIpOiBcIitlK1wiIGlzIG5vdCBhIHN1YnR5cGUgb2YgXCIrYSk7Y29uc3QgZj1lLnByb3RvdHlwZS5zayRzdGF0aWNOZXcucHJvdG90eXBlO2lmKGYudHAkbmV3IT09Yi50cCRuZXcpdGhyb3cgYT1iLnRwJG5hbWUsZT1lLnByb3RvdHlwZS50cCRuYW1lLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiLl9fbmV3X18oXCIrZStcIikgaXMgbm90IHNhZmUsIHVzZSBcIitmLnRwJG5hbWUrXCIuX19uZXdfXygpXCIpO3JldHVybiBiLnRwJG5ldy5jYWxsKGUucHJvdG90eXBlLGEsYyl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCR0eXBlLCAqYXJncywgKiprd2FyZ3MpXCIsJG5hbWU6XCJfX25ld19fXCJ9O1NrLmdlbmVyaWMuc2VsZkl0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307XG5Tay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplPWZ1bmN0aW9uKCl7aWYodGhpcy4kc2VxLmxlbmd0aCE9PXRoaXMuJG9yaWcuZ2V0JHNpemUoKSl7Y29uc3QgYT10aGlzLnRwJG5hbWUuc3BsaXQoXCJfXCIpWzBdO3Rocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihhK1wiIGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uXCIpO31pZighKHRoaXMuJGluZGV4Pj10aGlzLiRzZXEubGVuZ3RoKSlyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfTtTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5PWZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLiRzZXFbdGhpcy4kaW5kZXgrK107dm9pZCAwPT09YSYmKHRoaXMudHAkaXRlcm5leHQ9KCk9Pnt9KTtyZXR1cm4gYX07U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZj17JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRzZXEubGVuZ3RoLXRoaXMuJGluZGV4KX0sXG4kZmxhZ3M6e05vQXJnczohMH19O1NrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmPXskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJGluZGV4KX0sJGZsYWdzOntOb0FyZ3M6ITB9fTtTay5nZW5lcmljLmdldFNldERpY3Q9eyRnZXQoKXtyZXR1cm4gdGhpcy4kZH0sJHNldChhKXtpZih2b2lkIDA9PT1hKXRoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdDtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpdGhpcy4kZD1hO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19kaWN0X18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0aW9uYXJ5LCBub3QgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO30sJGRvYzpcImRpY3Rpb25hcnkgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgZGVmaW5lZClcIiwkbmFtZTpcIl9fZGljdF9fXCJ9O1NrLmdlbmVyaWMuc2VxQ29tcGFyZT1mdW5jdGlvbihhLFxuYyl7aWYodGhpcz09PWEmJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYykpcmV0dXJuITA7aWYoIShhIGluc3RhbmNlb2YgdGhpcy5zayRidWlsdGluQmFzZSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGI9dGhpcy52O2E9YS52O2xldCBlO2lmKGIubGVuZ3RoIT09YS5sZW5ndGgmJihcIkVxXCI9PT1jfHxcIk5vdEVxXCI9PT1jKSlyZXR1cm5cIkVxXCI9PT1jPyExOiEwO2ZvcihlPTA7ZTxiLmxlbmd0aCYmZTxhLmxlbmd0aCYmKGJbZV09PT1hW2VdfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYltlXSxhW2VdLFwiRXFcIikpOysrZSk7Y29uc3QgZj1iLmxlbmd0aCxsPWEubGVuZ3RoO2lmKGU+PWZ8fGU+PWwpc3dpdGNoKGMpe2Nhc2UgXCJMdFwiOnJldHVybiBmPGw7Y2FzZSBcIkx0RVwiOnJldHVybiBmPD1sO2Nhc2UgXCJFcVwiOnJldHVybiBmPT09bDtjYXNlIFwiTm90RXFcIjpyZXR1cm4gZiE9PWw7Y2FzZSBcIkd0XCI6cmV0dXJuIGY+XG5sO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZj49bDtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbCgpfXJldHVyblwiRXFcIj09PWM/ITE6XCJOb3RFcVwiPT09Yz8hMDpTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYltlXSxhW2VdLGMpfX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXtjPWMubGVuZ3RoO3ZvaWQgMD09PWUmJihlPUluZmluaXR5KTtmJiYtLWM7bCYmLS1jO2lmKGM8Ynx8Yz5lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYj09PWU/YStcIigpIHRha2VzIGV4YWN0bHkgXCIrYitcIiBhcmd1bWVudHNcIjpjPGI/YStcIigpIHRha2VzIGF0IGxlYXN0IFwiK2IrXCIgYXJndW1lbnRzXCI6MDxiP2ErXCIoKSB0YWtlcyBhdCBtb3N0IFwiK2UrXCIgYXJndW1lbnRzXCI6YStcIigpIHRha2VzIG5vIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2MrXCIgZ2l2ZW4pXCIpKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NcIixTay5idWlsdGluLnB5Q2hlY2tBcmdzKTtcblNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW49ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe3ZvaWQgMD09PWUmJihlPUluZmluaXR5KTtmJiYtLWM7bCYmLS1jO2lmKGM8Ynx8Yz5lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYj09PWU/YStcIigpIHRha2VzIGV4YWN0bHkgXCIrYitcIiBhcmd1bWVudHNcIjpjPGI/YStcIigpIHRha2VzIGF0IGxlYXN0IFwiK2IrXCIgYXJndW1lbnRzXCI6YStcIigpIHRha2VzIGF0IG1vc3QgXCIrZStcIiBhcmd1bWVudHNcIikrKFwiIChcIitjK1wiIGdpdmVuKVwiKSk7fTtTay5idWlsdGluLnB5Q2hlY2tUeXBlPWZ1bmN0aW9uKGEsYyxiKXtpZighYil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIiBtdXN0IGJlIGEgXCIrYyk7fTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLnB5Q2hlY2tUeXBlXCIsU2suYnVpbHRpbi5weUNoZWNrVHlwZSk7U2suYnVpbHRpbi5jaGVja1NlcXVlbmNlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdH07XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrU2VxdWVuY2VcIixTay5idWlsdGluLmNoZWNrU2VxdWVuY2UpO1NrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZT1mdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT8hMTphLnRwJGl0ZXI/dm9pZCAwIT09YS50cCRpdGVyKCkudHAkaXRlcm5leHQ6dm9pZCAwIT09YS5tcCRzdWJzY3JpcHR9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZVwiLFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZSk7U2suYnVpbHRpbi5jaGVja0NhbGxhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLnRwJGNhbGx9O1NrLmJ1aWx0aW4uY2hlY2tOdW1iZXI9ZnVuY3Rpb24oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZ307U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja051bWJlclwiLFxuU2suYnVpbHRpbi5jaGVja051bWJlcik7U2suYnVpbHRpbi5jaGVja0NvbXBsZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmNvbXBsZXh9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4XCIsU2suYnVpbHRpbi5jaGVja0NvbXBsZXgpO1NrLmJ1aWx0aW4uY2hlY2tJbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fFwibnVtYmVyXCI9PT10eXBlb2YgYSYmTnVtYmVyLmlzSW50ZWdlcihhKX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0ludFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQpO1NrLmJ1aWx0aW4uY2hlY2tGbG9hdD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRffTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRmxvYXRcIixTay5idWlsdGluLmNoZWNrRmxvYXQpO1NrLmJ1aWx0aW4uY2hlY2tTdHJpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zdHJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tTdHJpbmdcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKTtTay5idWlsdGluLmNoZWNrQnl0ZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzfTtTay5idWlsdGluLmNoZWNrQ2xhc3M9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR5cGV9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tDbGFzc1wiLFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyk7U2suYnVpbHRpbi5jaGVja0Jvb2w9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJvb2x9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tCb29sXCIsU2suYnVpbHRpbi5jaGVja0Jvb2wpO1NrLmJ1aWx0aW4uY2hlY2tOb25lPWZ1bmN0aW9uKGEpe3JldHVybiBhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrTm9uZVwiLFxuU2suYnVpbHRpbi5jaGVja05vbmUpO1NrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmdm9pZCAwIT09YS50cCRjYWxsfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRnVuY3Rpb25cIixTay5idWlsdGluLmNoZWNrRnVuY3Rpb24pO1NrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3I9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJnZvaWQgMCE9PWEudHAkZGVzY3Jfc2V0fTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRGF0YURlc2NyXCIsU2suYnVpbHRpbi5jaGVja0RhdGFEZXNjcik7U2suYnVpbHRpbi5jaGVja0FueVNldD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2V0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mcm96ZW5zZXR9O1NrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tYXBwaW5ncHJveHl8fFxubnVsbCE9YSYmdm9pZCAwIT09YS5tcCRzdWJzY3JpcHQmJnZvaWQgMCE9PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyl9fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiKXtzd2l0Y2goYil7Y2FzZSBcIkFkZFwiOnJldHVybiBhLm5iJGFkZDtjYXNlIFwiU3ViXCI6cmV0dXJuIGEubmIkc3VidHJhY3Q7Y2FzZSBcIk11bHRcIjpyZXR1cm4gYS5uYiRtdWx0aXBseTtjYXNlIFwiTWF0TXVsdFwiOmlmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gYS5uYiRtYXRyaXhfbXVsdGlwbHk7Y2FzZSBcIkRpdlwiOnJldHVybiBhLm5iJGRpdmlkZTtjYXNlIFwiRmxvb3JEaXZcIjpyZXR1cm4gYS5uYiRmbG9vcl9kaXZpZGU7Y2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJHJlbWFpbmRlcjtjYXNlIFwiRGl2TW9kXCI6cmV0dXJuIGEubmIkZGl2bW9kO2Nhc2UgXCJQb3dcIjpyZXR1cm4gYS5uYiRwb3dlcjtjYXNlIFwiTFNoaWZ0XCI6cmV0dXJuIGEubmIkbHNoaWZ0O2Nhc2UgXCJSU2hpZnRcIjpyZXR1cm4gYS5uYiRyc2hpZnQ7XG5jYXNlIFwiQml0QW5kXCI6cmV0dXJuIGEubmIkYW5kO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiR4b3I7Y2FzZSBcIkJpdE9yXCI6cmV0dXJuIGEubmIkb3J9fWZ1bmN0aW9uIGMoYSxiKXtzd2l0Y2goYil7Y2FzZSBcIkFkZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9hZGQ7Y2FzZSBcIlN1YlwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9zdWJ0cmFjdDtjYXNlIFwiTXVsdFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9tdWx0aXBseTtjYXNlIFwiTWF0TXVsdFwiOmlmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5O2Nhc2UgXCJEaXZcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfZGl2aWRlO2Nhc2UgXCJGbG9vckRpdlwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGU7Y2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9yZW1haW5kZXI7Y2FzZSBcIkRpdk1vZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9kaXZtb2Q7Y2FzZSBcIlBvd1wiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9wb3dlcjtcbmNhc2UgXCJMU2hpZnRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfbHNoaWZ0O2Nhc2UgXCJSU2hpZnRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfcnNoaWZ0O2Nhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfYW5kO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfeG9yO2Nhc2UgXCJCaXRPclwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9vcn19ZnVuY3Rpb24gYihhLGIpe3N3aXRjaChiKXtjYXNlIFwiQWRkXCI6cmV0dXJuIGEubmIkaW5wbGFjZV9hZGQ7Y2FzZSBcIlN1YlwiOnJldHVybiBhLm5iJGlucGxhY2Vfc3VidHJhY3Q7Y2FzZSBcIk11bHRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX211bHRpcGx5O2Nhc2UgXCJNYXRNdWx0XCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBhLm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5O2Nhc2UgXCJEaXZcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2RpdmlkZTtjYXNlIFwiRmxvb3JEaXZcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2Zsb29yX2RpdmlkZTtcbmNhc2UgXCJNb2RcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3JlbWFpbmRlcjtjYXNlIFwiUG93XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9wb3dlcjtjYXNlIFwiTFNoaWZ0XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9sc2hpZnQ7Y2FzZSBcIlJTaGlmdFwiOnJldHVybiBhLm5iJGlucGxhY2VfcnNoaWZ0O2Nhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2FuZDtjYXNlIFwiQml0T3JcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX29yO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3hvcn19ZnVuY3Rpb24gZShiLGQsZSl7dmFyIGs9ZC5jb25zdHJ1Y3RvcixmPWIuY29uc3RydWN0b3I7aWYoaz1rIT09ZiYmdm9pZCAwPT09ay5zayRiYXNlQ2xhc3MmJmQgaW5zdGFuY2VvZiBmKWlmKGY9YyhkLGUpLHZvaWQgMCE9PWYmJmYhPT1jKGIsZSkmJihmPWYuY2FsbChkLGIpLGYhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpcmV0dXJuIGY7Zj1hKGIsZSk7aWYodm9pZCAwIT09XG5mJiYoZj1mLmNhbGwoYixkKSxmIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpfHwhayYmKGY9YyhkLGUpLHZvaWQgMCE9PWYmJihmPWYuY2FsbChkLGIpLGYhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpKXJldHVybiBmfWZ1bmN0aW9uIGYoYSl7bi5mb3JFYWNoKChbYixjXSk9PnthW2NdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRwJHJpY2hjb21wYXJlKGEsYil9fSl9ZnVuY3Rpb24gbChhKXtjb25zdCBiPVNrLnJlZmxlY3RlZE51bWJlclNsb3RzO09iamVjdC5rZXlzKGIpLmZvckVhY2goYz0+e2lmKHZvaWQgMCE9PWFbY10pe2NvbnN0IGQ9YltjXSxlPWQucmVmbGVjdGVkLGY9YVtlXTt2b2lkIDAhPT1mP251bGw9PT1mJiZkZWxldGUgYVtlXTphW2VdPWQuc2xvdHx8YVtjXX19KX1mdW5jdGlvbiBoKGEpe2NvbnN0IGI9U2suc2VxdWVuY2VBbmRNYXBwaW5nU2xvdHM7T2JqZWN0LmtleXMoYikuZm9yRWFjaChjPT5cbnt2b2lkIDAhPT1hW2NdJiZiW2NdLmZvckVhY2goYj0+e2FbYl09YVtjXX0pfSl9U2suYWJzdHI9e307U2suYWJzdHIudHlwZU5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJnZvaWQgMCE9PWEudHAkbmFtZT9hLnRwJG5hbWU6XCI8aW52YWxpZCB0eXBlPlwifTtjb25zdCBkPXtBZGQ6XCIrXCIsU3ViOlwiLVwiLE11bHQ6XCIqXCIsTWF0TXVsdDpcIkBcIixEaXY6XCIvXCIsRmxvb3JEaXY6XCIvL1wiLE1vZDpcIiVcIixEaXZNb2Q6XCJkaXZtb2QoKVwiLFBvdzpcIioqIG9yIHBvdygpXCIsTFNoaWZ0OlwiPDxcIixSU2hpZnQ6XCI+PlwiLEJpdEFuZDpcIiZcIixCaXRYb3I6XCJeXCIsQml0T3I6XCJ8XCJ9LGc9e1VBZGQ6XCIrXCIsVVN1YjpcIi1cIixJbnZlcnQ6XCJ+XCJ9O1NrLmFic3RyLm51bWJlckJpbk9wPWZ1bmN0aW9uKGEsYixjKXt2YXIgZjtpZighKGY9ZShhLGIsYykpKXRocm93IGE9U2suYWJzdHIudHlwZU5hbWUoYSksYj1Tay5hYnN0ci50eXBlTmFtZShiKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIFwiK1xuZFtjXStcIjogJ1wiK2ErXCInIGFuZCAnXCIrYitcIidcIik7cmV0dXJuIGZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm51bWJlckJpbk9wXCIsU2suYWJzdHIubnVtYmVyQmluT3ApO1NrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcD1mdW5jdGlvbihhLGMsZil7YTp7dmFyIGs9YihhLGYpO2lmKHZvaWQgMCE9PWsmJihrPWsuY2FsbChhLGMpLGshPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpYnJlYWsgYTtrPWUoYSxjLGYpfWlmKCFrKXRocm93IGE9U2suYWJzdHIudHlwZU5hbWUoYSksYz1Tay5hYnN0ci50eXBlTmFtZShjKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIFwiK2RbZl0rXCI9OiAnXCIrYStcIicgYW5kICdcIitjK1wiJ1wiKTtyZXR1cm4ga307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wXCIsU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKTtTay5hYnN0ci5udW1iZXJVbmFyeU9wPVxuZnVuY3Rpb24oYSxiKXtpZihcIk5vdFwiPT09YilyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEpP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6U2suYnVpbHRpbi5ib29sLnRydWUkO2I6e3N3aXRjaChiKXtjYXNlIFwiVVN1YlwiOnZhciBjPWEubmIkbmVnYXRpdmU7YnJlYWsgYjtjYXNlIFwiVUFkZFwiOmM9YS5uYiRwb3NpdGl2ZTticmVhayBiO2Nhc2UgXCJJbnZlcnRcIjpjPWEubmIkaW52ZXJ0O2JyZWFrIGJ9Yz12b2lkIDB9Yz12b2lkIDAhPT1jP2MuY2FsbChhKTp2b2lkIDA7aWYoIWMpdGhyb3cgYT1Tay5hYnN0ci50eXBlTmFtZShhKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSBcIitnW2JdK1wiOiAnXCIrYStcIidcIik7cmV0dXJuIGN9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm51bWJlclVuYXJ5T3BcIixTay5hYnN0ci5udW1iZXJVbmFyeU9wKTtTay5hYnN0ci5maXhTZXFJbmRleF89ZnVuY3Rpb24oYSxiKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO1xuMD5iJiZhLnNxJGxlbmd0aCYmKGIrPWEuc3EkbGVuZ3RoKCkpO3JldHVybiBifTtTay5hYnN0ci5zZXF1ZW5jZUNvbnRhaW5zPWZ1bmN0aW9uKGEsYixjKXtpZihhLnNxJGNvbnRhaW5zKXJldHVybiBhLnNxJGNvbnRhaW5zKGIsYyk7YT1Tay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxiLFwiRXFcIik/bmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTohMX0sITEpO3JldHVybiBjP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpfTtTay5hYnN0ci5zZXF1ZW5jZUNvbmNhdD1mdW5jdGlvbihhLGIpe2lmKGEuc3EkY29uY2F0KXJldHVybiBhLnNxJGNvbmNhdChiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBjYW4ndCBiZSBjb25jYXRlbmF0ZWRcIik7fTtTay5hYnN0ci5zZXF1ZW5jZUdldEluZGV4T2Y9XG5mdW5jdGlvbihhLGIpe2lmKGEuaW5kZXgpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmluZGV4LFthLGJdKTtsZXQgYz0wO2ZvcihsZXQgZD1Tay5hYnN0ci5pdGVyKGEpLGU9ZC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWU7ZT1kLnRwJGl0ZXJuZXh0KCkpe2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLGUsXCJFcVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKTtjKz0xfXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzZXF1ZW5jZS5pbmRleCh4KTogeCBub3QgaW4gc2VxdWVuY2VcIik7fTtTay5hYnN0ci5zZXF1ZW5jZUdldENvdW50T2Y9ZnVuY3Rpb24oYSxiKXtpZihhLmNvdW50KXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5jb3VudCxbYSxiXSk7bGV0IGM9MDtmb3IobGV0IGQ9U2suYWJzdHIuaXRlcihhKSxlPWQudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1lO2U9ZC50cCRpdGVybmV4dCgpKVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLFxuZSxcIkVxXCIpJiYoYys9MSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyl9O1NrLmFic3RyLnNlcXVlbmNlR2V0SXRlbT1mdW5jdGlvbihhLGIsYyl7XCJudW1iZXJcIj09PXR5cGVvZiBiJiYoYj1uZXcgU2suYnVpbHRpbi5pbnRfKGIpKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShhLGIsYyl9O1NrLmFic3RyLnNlcXVlbmNlU2V0SXRlbT1mdW5jdGlvbihhLGIsYyxkKXtcIm51bWJlclwiPT09dHlwZW9mIGImJihiPW5ldyBTay5idWlsdGluLmludF8oYikpO3JldHVybiBTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsYixjLGQpfTtTay5hYnN0ci5zZXF1ZW5jZURlbEl0ZW09ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBTay5hYnN0ci5vYmplY3REZWxJdGVtKGEsYixjKX07U2suYWJzdHIuc2VxdWVuY2VHZXRTbGljZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5zbGljZShiLGMpKX07U2suYWJzdHIuc2VxdWVuY2VEZWxTbGljZT1cbmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0RGVsSXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGIsYykpfTtTay5hYnN0ci5zZXF1ZW5jZVNldFNsaWNlPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsbmV3IFNrLmJ1aWx0aW4uc2xpY2UoYixjKSl9O1NrLmFic3RyLnNlcXVlbmNlVW5wYWNrPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IHVucGFjayBub24taXRlcmFibGUgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgb2JqZWN0XCIpO2NvbnN0IGU9U2suYWJzdHIuaXRlcihhKSxmPVtdO2xldCBrPTAsZzswPGImJihnPVNrLm1pc2NldmFsLml0ZXJGb3IoZSxhPT57Zi5wdXNoKGEpO2lmKCsraz09PWIpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVha30pKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZyxcbigpPT57aWYoZi5sZW5ndGg8Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibm90IGVub3VnaCB2YWx1ZXMgdG8gdW5wYWNrIChleHBlY3RlZCBhdCBsZWFzdCBcIitjK1wiLCBnb3QgXCIrZi5sZW5ndGgrXCIpXCIpO2lmKCFkKXJldHVybiBTay5taXNjZXZhbC5jaGFpbihlLnRwJGl0ZXJuZXh0KCEwKSxhPT57aWYodm9pZCAwIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwidG9vIG1hbnkgdmFsdWVzIHRvIHVucGFjayAoZXhwZWN0ZWQgXCIrYitcIilcIik7cmV0dXJuIGZ9KTtjb25zdCBhPVtdO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKGUsYj0+e2EucHVzaChiKX0pLCgpPT57Y29uc3QgZD1hLmxlbmd0aCtiLWM7aWYoMD5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJub3QgZW5vdWdoIHZhbHVlcyB0byB1bnBhY2sgKGV4cGVjdGVkIGF0IGxlYXN0IFwiK2MrXCIsIGdvdCBcIisoYytkKStcIilcIik7Zi5wdXNoKG5ldyBTay5idWlsdGluLmxpc3QoYS5zbGljZSgwLFxuZCkpKTtmLnB1c2goLi4uYS5zbGljZShkKSk7cmV0dXJuIGZ9KX0pfTtTay5hYnN0ci5tYXBwaW5nVW5wYWNrSW50b0tleXdvcmRBcnJheT1mdW5jdGlvbihhLGIsYyl7aWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCliLiRpdGVtcygpLmZvckVhY2goKFtiLGRdKT0+e2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYy4kcXVhbG5hbWU/Yy4kcXVhbG5hbWUrXCIoKSBcIjpcIlwiKStcImtleXdvcmRzIG11c3QgYmUgc3RyaW5nc1wiKTthLnB1c2goYi52KTthLnB1c2goZCl9KTtlbHNle3ZhciBkPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYixTay5idWlsdGluLnN0ci4ka2V5cyk7aWYodm9pZCAwPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJPYmplY3QgaXMgbm90IGEgbWFwcGluZ1wiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQpLGQ9PlNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihkKSxcbmQ9PntpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoKGMuJHF1YWxuYW1lP2MuJHF1YWxuYW1lK1wiKCkgXCI6XCJcIikrXCJrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3NcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIubXAkc3Vic2NyaXB0KGQsITApLGI9PnthLnB1c2goZC52KTthLnB1c2goYil9KX0pKX19O1NrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzPWZ1bmN0aW9uKGEsYixjLGQsZSl7ZD1kfHxbXTt2YXIgZj1jLmxlbmd0aCtkLmxlbmd0aC8yO2lmKGY+Yi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBleHBlY3RlZCBhdCBtb3N0IFwiK2IubGVuZ3RoK1wiIGFyZ3VtZW50cyAoXCIrZitcIiBnaXZlbilcIik7aWYoZC5sZW5ndGh8fHZvaWQgMCE9PWUpe2lmKGY9PT1iLmxlbmd0aCYmIWQubGVuZ3RoKXJldHVybiBjO2lmKDA9PT1mJiZiLmxlbmd0aD09PShlJiZlLmxlbmd0aCkpcmV0dXJuIGV9ZWxzZSByZXR1cm4gYztcbmM9Yy5zbGljZSgwKTtmb3IoZj0wO2Y8ZC5sZW5ndGg7Zis9Mil7Y29uc3QgZT1kW2ZdLGs9ZFtmKzFdLGc9Yi5pbmRleE9mKGUpO2lmKDA8PWcpe2lmKHZvaWQgMCE9PWNbZ10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBhcmd1bWVudCAnXCIrZStcIidcIik7Y1tnXT1rfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdcIitlK1wiJ1wiKTt9aWYoZSl7ZD1iLmxlbmd0aDtmb3IoZj1kLTE7MDw9ZjtmLS0pdm9pZCAwPT09Y1tmXSYmKGNbZl09ZVtlLmxlbmd0aC0xLShkLTEtZildKTtiPWIuZmlsdGVyKChhLGIpPT52b2lkIDA9PT1jW2JdKTtpZihiLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIG1pc3NpbmcgXCIrYi5sZW5ndGgrXCIgcmVxdWlyZWQgcG9zaXRpb25hbCBhcmd1bWVudHM6IFwiK2Iuam9pbihcIiwgXCIpKTtcbn1yZXR1cm4gY307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3NcIixTay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyk7U2suYWJzdHIuY2hlY2tOb0t3YXJncz1mdW5jdGlvbihhLGIpe2lmKGImJmIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja05vS3dhcmdzXCIsU2suYWJzdHIuY2hlY2tOb0t3YXJncyk7U2suYWJzdHIuY2hlY2tOb0FyZ3M9ZnVuY3Rpb24oYSxiLGMpe2lmKGI9Yi5sZW5ndGgrKGM/Yy5sZW5ndGg6MCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSB0YWtlcyBubyBhcmd1bWVudHMgKFwiK2IrXCIgZ2l2ZW4pXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY2hlY2tOb0FyZ3NcIixTay5hYnN0ci5jaGVja05vQXJncyk7U2suYWJzdHIuY2hlY2tPbmVBcmc9XG5mdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhhLGMpO2lmKDEhPT1iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50IChcIitiLmxlbmd0aCtcIiBnaXZlbilcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja09uZUFyZ1wiLFNrLmFic3RyLmNoZWNrT25lQXJnKTtTay5hYnN0ci5jaGVja0FyZ3NMZW49ZnVuY3Rpb24oYSxiLGMsZCl7Yj1iLmxlbmd0aDt2b2lkIDA9PT1kJiYoZD1JbmZpbml0eSk7aWYoYjxjfHxiPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChjPT09ZD9hK1wiKCkgdGFrZXMgZXhhY3RseSBcIitjK1wiIGFyZ3VtZW50c1wiOmI8Yz9hK1wiKCkgdGFrZXMgYXQgbGVhc3QgXCIrYytcIiBhcmd1bWVudHNcIjphK1wiKCkgdGFrZXMgYXQgbW9zdCBcIitkK1wiIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2IrXCIgZ2l2ZW4pXCIpKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmNoZWNrQXJnc0xlblwiLFxuU2suYWJzdHIuY2hlY2tBcmdzTGVuKTtTay5hYnN0ci5vYmplY3RGb3JtYXQ9ZnVuY3Rpb24oYSxiKXthPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kZm9ybWF0KTtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19mb3JtYXRfXyBtdXN0IHJldHVybiBhIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpKTtyZXR1cm4gYn07U2suYWJzdHIub2JqZWN0SGFzaD1mdW5jdGlvbihhKXtjb25zdCBiPWEudHAkaGFzaDtpZih2b2lkIDAhPT1iKXtpZihTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bmhhc2hhYmxlIHR5cGU6ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7cmV0dXJuIGEudHAkaGFzaCgpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIEphdmFzY3JpcHQgdHlwZVwiKTtcbn07U2suYWJzdHIub2JqZWN0QWRkPWZ1bmN0aW9uKGEsYil7aWYoYS5uYiRhZGQpcmV0dXJuIGEubmIkYWRkKGIpO2E9U2suYWJzdHIudHlwZU5hbWUoYSk7Yj1Tay5hYnN0ci50eXBlTmFtZShiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICs6ICdcIithK1wiJyBhbmQgJ1wiK2IrXCInXCIpO307U2suYWJzdHIub2JqZWN0TmVnYXRpdmU9ZnVuY3Rpb24oYSl7aWYoYS5uYiRuZWdhdGl2ZSlyZXR1cm4gYS5uYiRuZWdhdGl2ZSgpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IC06ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fTtTay5hYnN0ci5vYmplY3RQb3NpdGl2ZT1mdW5jdGlvbihhKXtpZihhLm5iJHBvc2l0aXZlKXJldHVybiBhLm5iJHBvc2l0aXZlKCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgKzogJ1wiK1xuU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO307U2suYWJzdHIub2JqZWN0RGVsSXRlbT1mdW5jdGlvbihhLGIsYyl7aWYoYS5tcCRhc3Nfc3Vic2NyaXB0KXJldHVybiBhLm1wJGFzc19zdWJzY3JpcHQoYix2b2lkIDAsYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIub2JqZWN0RGVsSXRlbVwiLFNrLmFic3RyLm9iamVjdERlbEl0ZW0pO1NrLmFic3RyLm9iamVjdEdldEl0ZW09ZnVuY3Rpb24oYSxiLGMpe2lmKGEubXAkc3Vic2NyaXB0KXJldHVybiBhLm1wJHN1YnNjcmlwdChiLGMpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGluZ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm9iamVjdEdldEl0ZW1cIixcblNrLmFic3RyLm9iamVjdEdldEl0ZW0pO1NrLmFic3RyLm9iamVjdFNldEl0ZW09ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYS5tcCRhc3Nfc3Vic2NyaXB0KXJldHVybiBhLm1wJGFzc19zdWJzY3JpcHQoYixjLGQpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnRcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5vYmplY3RTZXRJdGVtXCIsU2suYWJzdHIub2JqZWN0U2V0SXRlbSk7U2suYWJzdHIuZ2F0dHI9ZnVuY3Rpb24oYSxiLGMpe2M9YS50cCRnZXRhdHRyKGIsYyk7aWYodm9pZCAwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihhLnNrJGF0dHJFcnJvcigpK1wiIGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2IuJGpzc3RyKCkrXCInXCIpO3JldHVybiBjLiRpc1N1c3BlbnNpb24/U2subWlzY2V2YWwuY2hhaW4oYyxmdW5jdGlvbihjKXtpZih2b2lkIDA9PT1cbmMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoYS5zayRhdHRyRXJyb3IoKStcIiBoYXMgbm8gYXR0cmlidXRlICdcIitiLiRqc3N0cigpK1wiJ1wiKTtyZXR1cm4gY30pOmN9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmdhdHRyXCIsU2suYWJzdHIuZ2F0dHIpO1NrLmFic3RyLnNhdHRyPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLnRwJHNldGF0dHIoYixjLGQpfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5zYXR0clwiLFNrLmFic3RyLnNhdHRyKTtTay5hYnN0ci5pdGVybmV4dD1mdW5jdGlvbihhLGIpe3JldHVybiBhLnRwJGl0ZXJuZXh0KGIpfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5pdGVybmV4dFwiLFNrLmFic3RyLml0ZXJuZXh0KTtTay5hYnN0ci5pdGVyPWZ1bmN0aW9uKGEpe2lmKGEudHAkaXRlcil7YT1hLnRwJGl0ZXIoKTtpZihhLnRwJGl0ZXJuZXh0KXJldHVybiBhO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIml0ZXIoKSByZXR1cm5lZCBub24taXRlcmF0b3Igb2YgdHlwZSAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fWlmKGEubXAkc3Vic2NyaXB0KXJldHVybiBuZXcgU2suYnVpbHRpbi5zZXFfaXRlcl8oYSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuaXRlclwiLFNrLmFic3RyLml0ZXIpO1NrLmFic3RyLmxvb2t1cFNwZWNpYWw9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm9iJHR5cGU7aWYodm9pZCAwPT09YylTay5hc3NlcnRzLmZhaWwoXCJqYXZhc2NyaXB0IG9iamVjdCBzZW50IHRvIGxvb2t1cFNwZWNpYWxcIik7ZWxzZSBpZihiPWMuJHR5cGVMb29rdXAoYiksdm9pZCAwIT09YilyZXR1cm4gdm9pZCAwIT09Yi50cCRkZXNjcl9nZXQmJihiPWIudHAkZGVzY3JfZ2V0KGEsYykpLGJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmxvb2t1cFNwZWNpYWxcIixTay5hYnN0ci5sb29rdXBTcGVjaWFsKTtcblNrLmFic3RyLnR5cGVMb29rdXA9ZnVuY3Rpb24oYSxiKXtiPWEuJHR5cGVMb29rdXAoYik7cmV0dXJuIHZvaWQgMCE9PWImJmIudHAkZGVzY3JfZ2V0P2IudHAkZGVzY3JfZ2V0KG51bGwsYSk6Yn07U2suYWJzdHIubWFya1VuaGFzaGFibGU9ZnVuY3Rpb24oYSl7YT1hLnByb3RvdHlwZTthLl9faGFzaF9fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDthLnRwJGhhc2g9U2suYnVpbHRpbi5ub25lLm5vbmUkfTtTay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlPWZ1bmN0aW9uKGEsYixjLGQpe2Q9ZHx8U2suYnVpbHRpbi50eXBlO2M9dm9pZCAwPT09Yz9Tay5idWlsdGluLm9iamVjdDpjO2NvbnN0IGU9bnVsbCE9PWM/Yy5wcm90b3R5cGU6bnVsbDtPYmplY3Quc2V0UHJvdG90eXBlT2YoYixkLnByb3RvdHlwZSk7T2JqZWN0LnNldFByb3RvdHlwZU9mKGIucHJvdG90eXBlLGUpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGIucHJvdG90eXBlLHtzayRvYmplY3Q6e3ZhbHVlOmIsd3JpdGFibGU6ITB9LFxub2IkdHlwZTp7dmFsdWU6Yix3cml0YWJsZTohMH0sdHAkbmFtZTp7dmFsdWU6YSx3cml0YWJsZTohMH0sdHAkYmFzZTp7dmFsdWU6Yyx3cml0YWJsZTohMH19KX07U2suYWJzdHIuc2V0VXBCdWlsdGluTXJvPWZ1bmN0aW9uKGEpe2xldCBiPWEucHJvdG90eXBlLnRwJGJhc2U7Y29uc3QgYz1udWxsPT09Yj9bXTpbYl07aWYoYj09PVNrLmJ1aWx0aW4ub2JqZWN0fHxudWxsPT09YilPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxcInNrJGJhc2VDbGFzc1wiLHt2YWx1ZTohMCx3cml0YWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLnByb3RvdHlwZSxcInNrJGJ1aWx0aW5CYXNlXCIse3ZhbHVlOmEsd3JpdGFibGU6ITB9KTtjb25zdCBkPVthXTtmb3IoO251bGwhPT1iOylkLnB1c2goYiksYj1iLnByb3RvdHlwZS50cCRiYXNlO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEucHJvdG90eXBlLHtzayRwcm90b3R5cGljYWw6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfSx0cCRiYXNlczp7dmFsdWU6YyxcbndyaXRhYmxlOiEwfSx0cCRtcm86e3ZhbHVlOmQsd3JpdGFibGU6ITB9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCIkdHlwZUxvb2t1cFwiLHt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wcm90b3R5cGVbYS4kbWFuZ2xlZF19LHdyaXRhYmxlOiEwfSl9O1NrLmFic3RyLnNldFVwR2V0U2V0cz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4uZ2V0c2V0X2Rlc2NyaXB0b3Ipe3ZhciBjPWEucHJvdG90eXBlO2I9Ynx8Yy50cCRnZXRzZXRzfHx7fTtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbYixkXSk9PntkLiRuYW1lPWI7Y1tiXT1uZXcgU2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcihhLGQpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsXCJ0cCRnZXRzZXRzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O1NrLmFic3RyLnNldFVwTWV0aG9kcz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3Ipe3ZhciBjPVxuYS5wcm90b3R5cGU7Yj1ifHxjLnRwJG1ldGhvZHN8fHt9O09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtiLGRdKT0+e2QuJG5hbWU9YjtjW2JdPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKGEsZCl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxcInRwJG1ldGhvZHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07U2suYWJzdHIuc2V0VXBDbGFzc01ldGhvZHM9ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDAhPT1Tay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3Ipe3ZhciBjPWEucHJvdG90eXBlO2I9Ynx8Yy50cCRjbGFzc21ldGhvZHN8fHt9O09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtiLGRdKT0+e2QuJG5hbWU9YjtjW2JdPW5ldyBTay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3IoYSxkKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwidHAkY2xhc3NtZXRob2RzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O2NvbnN0IG49T2JqZWN0LmVudHJpZXMoe0VxOlwib2IkZXFcIixcbk5vdEVxOlwib2IkbmVcIixHdDpcIm9iJGd0XCIsR3RFOlwib2IkZ2VcIixMdDpcIm9iJGx0XCIsTHRFOlwib2IkbGVcIn0pO1NrLmFic3RyLnNldFVwU2xvdHM9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIsYyl7ZVtiXT1uZXcgU2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3IoYSxTay5zbG90c1tiXSxjKX1mdW5jdGlvbiBkKGEsYil7XCJzdHJpbmdcIj09PXR5cGVvZiBhP2MoYSxiKTphLmZvckVhY2goYT0+e2MoYSxiKX0pfWlmKHZvaWQgMCE9PVNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXt2YXIgZT1hLnByb3RvdHlwZTtiPWJ8fGUudHAkc2xvdHN8fHt9O2IudHAkbmV3PT09U2suZ2VuZXJpYy5uZXcmJihiLnRwJG5ldz1Tay5nZW5lcmljLm5ldyhhKSk7Yi50cCRyaWNoY29tcGFyZSYmZihiKTtiLnRwJGFzX251bWJlciYmbChiKTtiLnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmcmJmgoYik7T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2EsYl0pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXG5hLHt2YWx1ZTpiLHdyaXRhYmxlOiEwfSl9KTtiLnRwJG5ldyYmKGUuX19uZXdfXz1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoU2suZ2VuZXJpYy5uZXdNZXRob2REZWYsYSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzayRzdGF0aWNOZXdcIix7dmFsdWU6YSx3cml0YWJsZTohMH0pKTtTay5zdWJTbG90cy5tYWluX3Nsb3RzLmZvckVhY2goKFthLGNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTt2YXIgZz1iLnRwJGhhc2g7dm9pZCAwIT09ZyYmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnP2MoXCJfX2hhc2hfX1wiLGcpOmc9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/ZS5fX2hhc2hfXz1nOlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgdHAkaGFzaFwiKSk7Yi50cCRhc19udW1iZXImJlNrLnN1YlNsb3RzLm51bWJlcl9zbG90cy5mb3JFYWNoKChbYSxjXSk9PnthPWJbYV07dm9pZCAwIT09YSYmZChjLGEpfSk7Yi50cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nJiZTay5zdWJTbG90cy5zZXF1ZW5jZV9hbmRfbWFwcGluZ19zbG90cy5mb3JFYWNoKChbYSxcbmNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInRwJHNsb3RzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O1NrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3M9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O1NrLmFzc2VydHMuYXNzZXJ0KGIuaGFzT3duUHJvcGVydHkoXCJjb25zdHJ1Y3RvclwiKSxcIkEgY29uc3RydWN0b3IgaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSBuYXRpdmUgY2xhc3NcIik7bGV0IGM9Yi5jb25zdHJ1Y3RvcjtpZihhLmluY2x1ZGVzKFwiLlwiKSl7dmFyIGQ9YS5zcGxpdChcIi5cIik7YT1kLnBvcCgpO2Q9ZC5qb2luKFwiLlwiKX1Tay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlKGEsYyxiLmJhc2UsYi5tZXRhKTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm8oYyk7Y29uc3QgZT1jLnByb3RvdHlwZTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLHt0cCRzbG90czp7dmFsdWU6Yi5zbG90cyx3cml0YWJsZTohMH0sdHAkZ2V0c2V0czp7dmFsdWU6Yi5nZXRzZXRzLFxud3JpdGFibGU6ITB9LHRwJG1ldGhvZHM6e3ZhbHVlOmIubWV0aG9kcyx3cml0YWJsZTohMH0sdHAkY2xhc3NtZXRob2RzOnt2YWx1ZTpiLmNsYXNzbWV0aG9kcyx3cml0YWJsZTohMH19KTtTay5hYnN0ci5zZXRVcFNsb3RzKGMsYi5zbG90c3x8e30pO1NrLmFic3RyLnNldFVwTWV0aG9kcyhjLGIubWV0aG9kcyk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGMsYi5nZXRzZXRzKTtTay5hYnN0ci5zZXRVcENsYXNzTWV0aG9kcyhjLGIuY2xhc3NtZXRob2RzKTt2b2lkIDAhPT1kJiYoZS5fX21vZHVsZV9fPW5ldyBTay5idWlsdGluLnN0cihkKSk7T2JqZWN0LmVudHJpZXMoYi5wcm90b3x8e30pLmZvckVhY2goKFthLGJdKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLGEse3ZhbHVlOmIsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohKGEuaW5jbHVkZXMoXCIkXCIpfHxhIGluIE9iamVjdC5wcm90b3R5cGUpfSl9KTtPYmplY3QuZW50cmllcyhiLmZsYWdzfHx7fSkuZm9yRWFjaCgoW2EsYl0pPT5cbntPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxhLHt2YWx1ZTpiLHdyaXRhYmxlOiEwfSl9KTt2b2lkIDAhPT1Tay5idWlsdGluLnN0ciYmZS5oYXNPd25Qcm9wZXJ0eShcInRwJGRvY1wiKSYmIWUuaGFzT3duUHJvcGVydHkoXCJfX2RvY19fXCIpJiYoYT1lLnRwJGRvY3x8bnVsbCxlLl9fZG9jX189XCJzdHJpbmdcIj09PXR5cGVvZiBhP25ldyBTay5idWlsdGluLnN0cihhKTpTay5idWlsdGluLm5vbmUubm9uZSQpO3JldHVybiBjfTtTay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3M9ZnVuY3Rpb24oYSxiKXtTay5hc3NlcnRzLmFzc2VydChiLmhhc093blByb3BlcnR5KFwiY29uc3RydWN0b3JcIiksXCJtdXN0IHByb3ZpZGUgYSBjb25zdHJ1Y3RvclwiKTtiLnNsb3RzPWIuc2xvdHN8fHt9O2Iuc2xvdHMudHAkaXRlcj1Tay5nZW5lcmljLnNlbGZJdGVyO2Iuc2xvdHMudHAkaXRlcm5leHQ9Yi5zbG90cy50cCRpdGVybmV4dHx8Yi5pdGVybmV4dDtiLnNsb3RzLnRwJGdldGF0dHI9Yi5zbG90cy50cCRnZXRhdHRyfHxcblNrLmdlbmVyaWMuZ2V0QXR0cjthPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoYSxiKTtTay5hYnN0ci5idWlsdCRpdGVyYXRvcnMucHVzaChhKTtyZXR1cm4gYX07U2suYWJzdHIuYnVpbHQkaXRlcmF0b3JzPVtdO1NrLmFic3RyLnNldFVwTW9kdWxlTWV0aG9kcz1mdW5jdGlvbihhLGIsYyl7T2JqZWN0LmVudHJpZXMoYykuZm9yRWFjaCgoW2MsZF0pPT57ZC4kbmFtZT1kLiRuYW1lfHxjO2JbY109bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKGQsbnVsbCxhKX0pfTtTay5hYnN0ci5zdXBlckNvbnN0cnVjdG9yPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7YS5wcm90b3R5cGUudHAkYmFzZS5hcHBseShiLGQpfX0sZnVuY3Rpb24obSxxKXtjb25zdCBhPW5ldyBNYXA7U2suYnVpbHRpbi5vYmplY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIm9iamVjdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5vYmplY3QsXCJiYWQgY2FsbCB0byBvYmplY3QsIHVzZSAnbmV3J1wiKX0sYmFzZTpudWxsLHNsb3RzOnt0cCRuZXcoYSxiKXtpZihhLmxlbmd0aHx8YiYmYi5sZW5ndGgpe2lmKHRoaXMudHAkbmV3IT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJG5ldyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvYmplY3QuX19uZXdfXygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgdHlwZSB0byBpbnN0YW50aWF0ZSlcIik7aWYodGhpcy50cCRpbml0PT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJGluaXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKCkgdGFrZXMgbm8gYXJndW1lbnRzXCIpO31yZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3J9LHRwJGluaXQoYSxiKXtpZihhLmxlbmd0aHx8YiYmYi5sZW5ndGgpe2lmKHRoaXMudHAkaW5pdCE9PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRpbml0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9iamVjdC5fX2luaXRfXygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSlcIik7XG5pZih0aGlzLnRwJG5ldz09PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRuZXcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiLl9faW5pdF9fKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSBpbnN0YW5jZSB0byBpbml0aWFsaXplKVwiKTt9fSx0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRzZXRhdHRyOlNrLmdlbmVyaWMuc2V0QXR0ciwkcigpe2NvbnN0IGE9U2suYWJzdHIubG9va3VwU3BlY2lhbCh0aGlzLFNrLmJ1aWx0aW4uc3RyLiRtb2R1bGUpO2xldCBiPVwiXCI7YSYmU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSYmKGI9YS52K1wiLlwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPFwiK2IrU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIgb2JqZWN0PlwiKX0sdHAkc3RyKCl7cmV0dXJuIHRoaXMuJHIoKX0sdHAkaGFzaCgpe2xldCBjPWEuZ2V0KHRoaXMpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7XG5jPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUi1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUi8yKTthLnNldCh0aGlzLGMpO3JldHVybiBjfSx0cCRyaWNoY29tcGFyZShhLGIpe3N3aXRjaChiKXtjYXNlIFwiRXFcIjphPXRoaXM9PT1hfHxTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDticmVhaztjYXNlIFwiTm90RXFcIjphPXRoaXMudHAkcmljaGNvbXBhcmUoYSxcIkVxXCIpO2EhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCYmKGE9IVNrLm1pc2NldmFsLmlzVHJ1ZShhKSk7YnJlYWs7ZGVmYXVsdDphPVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfXJldHVybiBhfSx0cCRkb2M6XCJUaGUgbW9zdCBiYXNlIHR5cGVcIn0sZ2V0c2V0czp7X19jbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMub2IkdHlwZX0sJHNldChhKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGRlbGV0ZSBfX2NsYXNzX18gYXR0cmlidXRlXCIpO1xuaWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2NsYXNzX18gbXVzdCBiZSBzZXQgdG8gYSBjbGFzcywgbm90ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0XCIpO2NvbnN0IGI9dGhpcy5vYiR0eXBlO2lmKCEoYi4kaXNTdWJUeXBlKFNrLmJ1aWx0aW4ubW9kdWxlKSYmYS4kaXNTdWJUeXBlKFNrLmJ1aWx0aW4ubW9kdWxlKXx8dm9pZCAwIT09Yi5zayRrbGFzcyYmdm9pZCAwIT09YS5zayRrbGFzcykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiIF9fY2xhc3NfXyBhc3NpZ25tZW50IG9ubHkgc3VwcG9ydGVkIGZvciBoZWFwIHR5cGVzIG9yIE1vZHVsZVR5cGUgc3ViY2xhc3Nlc1wiKTtpZihhLnByb3RvdHlwZS5zayRidWlsdGluQmFzZSE9PXRoaXMuc2skYnVpbHRpbkJhc2UpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19jbGFzc19fIGFzc2lnbm1lbnQ6ICdcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcblwiJyBvYmplY3QgbGF5b3V0IGRpZmZlcnMgZnJvbSAnXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIidcIik7T2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsYS5wcm90b3R5cGUpfSwkZG9jOlwidGhlIG9iamVjdCdzIGNsYXNzXCJ9fSxtZXRob2RzOntfX2Rpcl9fOnskbWV0aDpmdW5jdGlvbigpe2xldCBhPVtdO2lmKHRoaXMuJGQpaWYodGhpcy4kZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdClhPXRoaXMuJGQuc2skYXNhcnJheSgpO2Vsc2UgZm9yKHZhciBiIGluIHRoaXMuJGQpYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cihiKSk7Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi50eXBlLnByb3RvdHlwZS5fX2Rpcl9fLFt0aGlzLm9iJHR5cGVdKTthLnB1c2goLi4uYi52KTtiLnY9YTtyZXR1cm4gYn0sJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJEZWZhdWx0IGRpcigpIGltcGxlbWVudGF0aW9uLlwifSxfX2Zvcm1hdF9fOnskbWV0aChhKXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtpZihhPVxuU2suZmZpLnJlbWFwVG9KcyhhKSxcIlwiIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiZm9ybWF0IHNwZWMgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9ZWxzZXtpZihTay5fX2Z1dHVyZV9fLmV4Y2VwdGlvbnMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZm9ybWF0KCkgYXJndW1lbnQgMiBtdXN0IGJlIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQgZXhwZWN0cyBhcmcgMiB0byBiZSBzdHJpbmcgb3IgdW5pY29kZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9cmV0dXJuIHRoaXMudHAkc3RyKCl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiRGVmYXVsdCBvYmplY3QgZm9ybWF0dGVyLlwifX0scHJvdG86e3ZhbHVlT2Y6T2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHAkc3RyKCkudn0saGFzT3duUHJvcGVydHk6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbmhwJHR5cGU6dm9pZCAwLHNrJGF0dHJFcnJvcigpe3JldHVyblwiJ1wiK3RoaXMudHAkbmFtZStcIicgb2JqZWN0XCJ9fX0pO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoXCJ0eXBlXCIsU2suYnVpbHRpbi50eXBlLFNrLmJ1aWx0aW4ub2JqZWN0KTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm8oU2suYnVpbHRpbi50eXBlKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjKXtTay5hYnN0ci5jaGVja05vQXJncyh0aGlzLiRuYW1lLGIsYyk7YT10aGlzLmNhbGwoYSk7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gYyhhLGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy4kbmFtZSxiLGMpO2E9dGhpcy5jYWxsKGEsYlswXSk7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gYihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLFxuYiwxLDIpO2E9dGhpcy5jYWxsKGEsLi4uYik7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gZShhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGIsMiwyKTt0aGlzLmNhbGwoYSxiWzBdLGJbMV0pO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9ZnVuY3Rpb24gZihhLGIsZCl7YT1jLmNhbGwodGhpcyxhLGIsZCk7cmV0dXJuIGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD9hOm5ldyBTay5idWlsdGluLmJvb2woYSl9ZnVuY3Rpb24gbChhLGIpe3JldHVybiBmdW5jdGlvbihjLGQsZSl7Yz1hLmNhbGwodGhpcyxjLGQsZSk7cmV0dXJuIGIoYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgYj1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYixcbltdKX19ZnVuY3Rpb24gZChhLGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGY9ZS50cCRkZXNjcl9nZXQ/ZS50cCRkZXNjcl9nZXQodGhpcyk6ZTtmPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShmLFtdKTtpZighYihmKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIiBzaG91bGQgcmV0dXJuIFwiK2MrXCIgKHJldHVybmVkIFwiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiKVwiKTtyZXR1cm4gdm9pZCAwIT09ZD9kKGYpOmZ9fX1mdW5jdGlvbiBnKGEpe3JldHVybiBmdW5jdGlvbihiKXtjb25zdCBjPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtiXSl9fWZ1bmN0aW9uIG4oYSxiKXtsZXQgYz10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoU2suYnVpbHRpbi5zdHIuJGdldGF0dHJpYnV0ZSk7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXJldHVybiBjLmQkd3JhcHBlZC5jYWxsKHRoaXMsXG5hLGIpO2MudHAkZGVzY3JfZ2V0JiYoYz1jLnRwJGRlc2NyX2dldCh0aGlzKSk7Y29uc3QgZD1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW2FdKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KTtyZXR1cm4gYj9kOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhkKX1mdW5jdGlvbiBrKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGZ1bmN0aW9uKGQsZSxmKXtsZXQgZzt2b2lkIDA9PT1lPyhnPWIsYz1udWxsKTpnPWE7bGV0IGg9dGhpcy5vYiR0eXBlLiR0eXBlTG9va3VwKG5ldyBTay5idWlsdGluLnN0cihnKSk7aWYoaCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXJldHVybiBoLmQkd3JhcHBlZC5jYWxsKHRoaXMsZCxlKTtoLnRwJGRlc2NyX2dldCYmKGg9aC50cCRkZXNjcl9nZXQodGhpcykpO1xuaWYodm9pZCAwIT09aClkPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShoLHZvaWQgMD09PWU/W2RdOltkLGVdKTtlbHNle2lmKGMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBvYmplY3QgXCIrYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoZyk7fXJldHVybiBmP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX19ZnVuY3Rpb24gcChhLGIpe2xldCBjPWEub2IkdHlwZTtmb3IoO2MmJnZvaWQgMCE9PWMuc2ska2xhc3M7KWM9Yy5wcm90b3R5cGUudHAkYmFzZTtpZihjJiZjLnByb3RvdHlwZS50cCRzZXRhdHRyIT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBhcHBseSB0aGlzIFwiK2IuJG5hbWUrXCIgdG8gXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgb2JqZWN0XCIpO31Tay5zbG90cz1PYmplY3QuY3JlYXRlKG51bGwpO1xubT1Tay5zbG90cztTay5zbG90cy5fX2luaXRfXz17JG5hbWU6XCJfX2luaXRfX1wiLCRzbG90X25hbWU6XCJ0cCRpbml0XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7Yj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxiLGMpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGE9PntpZighU2suYnVpbHRpbi5jaGVja05vbmUoYSkmJnZvaWQgMCE9PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19pbml0X18oKSBzaG91bGQgcmV0dXJuIE5vbmUsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSl9fSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7dGhpcy5jYWxsKGEsYixjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKmFyZ3MsICoqa3dhcmdzKVwiLCRmbGFnczp7RmFzdENhbGw6ITB9LCRkb2M6XCJJbml0aWFsaXplIHNlbGYuICBTZWUgaGVscCh0eXBlKHNlbGYpKSBmb3IgYWNjdXJhdGUgc2lnbmF0dXJlLlwifTtcbm0uX19uZXdfXz17JG5hbWU6XCJfX25ld19fXCIsJHNsb3RfbmFtZTpcInRwJG5ld1wiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7Y29uc3QgYj1mdW5jdGlvbihiLGMpe2xldCBkPWE7YS50cCRkZXNjcl9nZXQmJihkPWEudHAkZGVzY3JfZ2V0KG51bGwsdGhpcy5jb25zdHJ1Y3RvcikpO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxbdGhpcy5jb25zdHJ1Y3RvciwuLi5iXSxjKX07Yi5zayRzdGF0aWNfbmV3PSExO3JldHVybiBifSwkd3JhcHBlcjpudWxsLCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqYXJncywgKiprd2FyZ3MpXCIsJGZsYWdzOntGYXN0Q2FsbDohMH0sJGRvYzpcIkNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IG9iamVjdC5cIn07bS5fX2NhbGxfXz17JG5hbWU6XCJfX2NhbGxfX1wiLCRzbG90X25hbWU6XCJ0cCRjYWxsXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOlxuYTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsYixjKX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXthPWEudHAkY2FsbChiLGMpO3JldHVybiB2b2lkIDA9PT1hP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDphfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKmFyZ3MsICoqa3dhcmdzKVwiLCRmbGFnczp7RmFzdENhbGw6ITB9LCRkb2M6XCJDYWxsIHNlbGYgYXMgYSBmdW5jdGlvbi5cIn07bS5fX3JlcHJfXz17JG5hbWU6XCJfX3JlcHJfX1wiLCRzbG90X25hbWU6XCIkclwiLCRzbG90X2Z1bmM6ZChcIl9fcmVwcl9fXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyxcInN0clwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHJlcHIoc2VsZikuXCJ9O20uX19zdHJfXz17JG5hbWU6XCJfX3N0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHN0clwiLCRzbG90X2Z1bmM6ZChcIl9fc3RyX19cIixTay5idWlsdGluLmNoZWNrU3RyaW5nLFxuXCJzdHJcIiksJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlJldHVybiBzdHIoc2VsZikuXCJ9O3ZhciB1PWQoXCJfX2hhc2hfX1wiLFNrLmJ1aWx0aW4uY2hlY2tJbnQsXCJpbnRcIixhPT5cIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnY6YS50cCRoYXNoKCkpO20uX19oYXNoX189eyRuYW1lOlwiX19oYXNoX19cIiwkc2xvdF9uYW1lOlwidHAkaGFzaFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/U2suYnVpbHRpbi5ub25lLm5vbmUkOnUoYSl9LCR3cmFwcGVyOmwoYSxhPT5uZXcgU2suYnVpbHRpbi5pbnRfKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlJldHVybiBoYXNoKHNlbGYpLlwifTttLl9fZ2V0YXR0cmlidXRlX189eyRuYW1lOlwiX19nZXRhdHRyaWJ1dGVfX1wiLCRzbG90X25hbWU6XCJ0cCRnZXRhdHRyXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYSxcbmIpe2xldCBjPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChTay5idWlsdGluLnN0ci4kZ2V0YXR0cik7aWYodm9pZCAwPT09YylyZXR1cm4gbi5jYWxsKHRoaXMsYSxiKTtjb25zdCBkPVNrLm1pc2NldmFsLmNoYWluKG4uY2FsbCh0aGlzLGEsYiksYj0+U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PntpZih2b2lkIDAhPT1iKXJldHVybiBiO2MudHAkZGVzY3JfZ2V0JiYoYz1jLnRwJGRlc2NyX2dldCh0aGlzKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFthXSl9LGZ1bmN0aW9uKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSkpO3JldHVybiBiP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKHRoaXMuJG5hbWUsYixjKTtiPWJbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShiKStcIidcIik7Yz10aGlzLmNhbGwoYSxiKTtpZih2b2lkIDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGhhcyBubyBhdHRyaWJ1dGUgXCIrYi4kanNzdHIoKSk7cmV0dXJuIGN9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGdldGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19nZXRhdHRyX189eyRuYW1lOlwiX19nZXRhdHRyX19cIiwkc2xvdF9uYW1lOlwidHAkZ2V0YXR0clwiLCRzbG90X2Z1bmM6bS5fX2dldGF0dHJpYnV0ZV9fLiRzbG90X2Z1bmMsJHdyYXBwZXI6bnVsbCwkdGV4dHNpZzpcIigkc2VsZiwgbmFtZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBnZXRhdHRyKHNlbGYsIG5hbWUpLlwifTttLl9fc2V0YXR0cl9fPXskbmFtZTpcIl9fc2V0YXR0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHNldGF0dHJcIiwkc2xvdF9mdW5jOmsoXCJfX3NldGF0dHJfX1wiLFxuXCJfX2RlbGF0dHJfX1wiKSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGIsMiwyKTtwKGEsdGhpcyk7dGhpcy5jYWxsKGEsYlswXSxiWzFdKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkdGV4dHNpZzpcIigkc2VsZiwgbmFtZSwgdmFsdWUsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkZG9jOlwiSW1wbGVtZW50IHNldGF0dHIoc2VsZiwgbmFtZSwgdmFsdWUpLlwifTttLl9fZGVsYXR0cl9fPXskbmFtZTpcIl9fZGVsYXR0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHNldGF0dHJcIiwkc2xvdF9mdW5jOm0uX19zZXRhdHRyX18uJHNsb3RfZnVuYywkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy4kbmFtZSxiLGMpO3AoYSx0aGlzKTt0aGlzLmNhbGwoYSxiWzBdKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbiR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IGRlbGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19nZXRfXz17JG5hbWU6XCJfX2dldF9fXCIsJHNsb3RfbmFtZTpcInRwJGRlc2NyX2dldFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtudWxsPT09YiYmKGI9U2suYnVpbHRpbi5ub25lLm5vbmUkKTtudWxsPT1jJiYoYz1Tay5idWlsdGluLm5vbmUubm9uZSQpO2NvbnN0IGU9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShlLFtiLGNdKTtyZXR1cm4gZD9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuJG5hbWUsXG5iLDEsMik7Yz1iWzBdO2I9YlsxXTtjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYz1udWxsKTtiPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYj1udWxsKTtpZihudWxsPT09YiYmbnVsbD09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19nZXRfXyhOb25lLCBOb25lKSBpcyBpbnZhbGlkXCIpO3JldHVybiB0aGlzLmNhbGwoYSxjLGIpfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5zdGFuY2UsIG93bmVyLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJGRvYzpcIlJldHVybiBhbiBhdHRyaWJ1dGUgb2YgaW5zdGFuY2UsIHdoaWNoIGlzIG9mIHR5cGUgb3duZXIuXCJ9O20uX19zZXRfXz17JG5hbWU6XCJfX3NldF9fXCIsJHNsb3RfbmFtZTpcInRwJGRlc2NyX3NldFwiLCRzbG90X2Z1bmM6ayhcIl9fc2V0X19cIixcIl9fZGVsZXRlX19cIiksJHdyYXBwZXI6ZSwkdGV4dHNpZzpcIigkc2VsZiwgaW5zdGFuY2UsIHZhbHVlLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sXG4kZG9jOlwiU2V0IGFuIGF0dHJpYnV0ZSBvZiBpbnN0YW5jZSB0byB2YWx1ZS5cIn07bS5fX2RlbGV0ZV9fPXskbmFtZTpcIl9fZGVsZXRlX19cIiwkc2xvdF9uYW1lOlwidHAkZGVzY3Jfc2V0XCIsJHNsb3RfZnVuYzptLl9fc2V0X18uJHNsb3RfZnVuYywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCBpbnN0YW5jZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkRlbGV0ZSBhbiBhdHRyaWJ1dGUgb2YgaW5zdGFuY2UuXCJ9O20uX19lcV9fPXskbmFtZTpcIl9fZXFfX1wiLCRzbG90X25hbWU6XCJvYiRlcVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPT12YWx1ZS5cIn07bS5fX2dlX189eyRuYW1lOlwiX19nZV9fXCIsJHNsb3RfbmFtZTpcIm9iJGdlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSxcbiRkb2M6XCJSZXR1cm4gc2VsZj49dmFsdWUuXCJ9O20uX19ndF9fPXskbmFtZTpcIl9fZ3RfX1wiLCRzbG90X25hbWU6XCJvYiRndFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPnZhbHVlLlwifTttLl9fbGVfXz17JG5hbWU6XCJfX2xlX19cIiwkc2xvdF9uYW1lOlwib2IkbGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6ZiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZjw9dmFsdWUuXCJ9O20uX19sdF9fPXskbmFtZTpcIl9fbHRfX1wiLCRzbG90X25hbWU6XCJvYiRsdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPHZhbHVlLlwifTttLl9fbmVfXz17JG5hbWU6XCJfX25lX19cIiwkc2xvdF9uYW1lOlwib2IkbmVcIixcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmIT12YWx1ZS5cIn07bS5fX2l0ZXJfXz17JG5hbWU6XCJfX2l0ZXJfX1wiLCRzbG90X25hbWU6XCJ0cCRpdGVyXCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJJbXBsZW1lbnQgaXRlcihzZWxmKS5cIn07bS5fX25leHRfXz17JG5hbWU6XCJfX25leHRfX1wiLCRzbG90X25hbWU6XCJ0cCRpdGVybmV4dFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YSxkPVNrLm1pc2NldmFsLnRyeUNhdGNoKCgpPT5Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbikpdGhyb3cgYTtcbn0pO3JldHVybiBiP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuJG5hbWUsYixjKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYS50cCRpdGVybmV4dCghMCksYT0+e2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbjtyZXR1cm4gYX0pfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIkltcGxlbWVudCBuZXh0KHNlbGYpLlwifTttLl9fbGVuX189eyRuYW1lOlwiX19sZW5fX1wiLCRzbG90X25hbWU6XCJzcSRsZW5ndGhcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtjb25zdCBjPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7aWYoYilyZXR1cm4gYj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbXSksU2subWlzY2V2YWwuY2hhaW4oYixcbmE9PlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpKTtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtyZXR1cm4gU2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYil9fSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gbGVuKHNlbGYpLlwifTttLl9fY29udGFpbnNfXz17JG5hbWU6XCJfX2NvbnRhaW5zX19cIiwkc2xvdF9uYW1lOlwic3EkY29udGFpbnNcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtiXSk7Yj1Tay5taXNjZXZhbC5jaGFpbihiLGE9PlNrLm1pc2NldmFsLmlzVHJ1ZShhKSk7cmV0dXJuIGIuJGlzU3VzcGVuc2lvbj9jP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpOlxuYn19LCR3cmFwcGVyOmwoYyxhPT5uZXcgU2suYnVpbHRpbi5ib29sKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGtleSBpbiBzZWxmLlwifTttLl9fZ2V0aXRlbV9fPXskbmFtZTpcIl9fZ2V0aXRlbV9fXCIsJHNsb3RfbmFtZTpcIm1wJHN1YnNjcmlwdFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO2I9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW2JdKTtyZXR1cm4gYz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX19LCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmW2tleV0uXCJ9O20uX19zZXRpdGVtX189eyRuYW1lOlwiX19zZXRpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkYXNzX3N1YnNjcmlwdFwiLFxuJHNsb3RfZnVuYzprKFwiX19zZXRpdGVtX19cIixcIl9fZGVsaXRlbV9fXCIsXCJkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudFwiKSwkd3JhcHBlcjplLCR0ZXh0c2lnOlwiKCRzZWxmLCBrZXksIHZhbHVlLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJGRvYzpcIlNldCBzZWxmW2tleV0gdG8gdmFsdWUuXCJ9O20uX19kZWxpdGVtX189eyRuYW1lOlwiX19kZWxpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkYXNzX3N1YnNjcmlwdFwiLCRzbG90X2Z1bmM6bS5fX3NldGl0ZW1fXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkRlbGV0ZSBzZWxmW2tleV0uXCJ9O20uX19hZGRfXz17JG5hbWU6XCJfX2FkZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFkZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmK3ZhbHVlLlwifTtcbm0uX19yYWRkX189eyRuYW1lOlwiX19yYWRkX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2FkZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZStzZWxmLlwifTttLl9faWFkZF9fPXskbmFtZTpcIl9faWFkZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfYWRkXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYrPXZhbHVlLlwifTttLl9fc3ViX189eyRuYW1lOlwiX19zdWJfX1wiLCRzbG90X25hbWU6XCJuYiRzdWJ0cmFjdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmLXZhbHVlLlwifTttLl9fcnN1Yl9fPXskbmFtZTpcIl9fcnN1Yl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9zdWJ0cmFjdFwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlLXNlbGYuXCJ9O20uX19pbXVsX189eyRuYW1lOlwiX19pbXVsX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmKj12YWx1ZS5cIn07bS5fX211bF9fPXskbmFtZTpcIl9fbXVsX19cIiwkc2xvdF9uYW1lOlwibmIkbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZip2YWx1ZS5cIn07bS5fX3JtdWxfXz17JG5hbWU6XCJfX3JtdWxfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YyxcbiR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSpzZWxmLlwifTttLl9faXN1Yl9fPXskbmFtZTpcIl9faXN1Yl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2Vfc3VidHJhY3RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi09dmFsdWUuXCJ9O20uX19tb2RfXz17JG5hbWU6XCJfX21vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlbWFpbmRlclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmJXZhbHVlLlwifTttLl9fcm1vZF9fPXskbmFtZTpcIl9fcm1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9yZW1haW5kZXJcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsXG4kZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSVzZWxmLlwifTttLl9faW1vZF9fPXskbmFtZTpcIl9faW1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfcmVtYWluZGVyXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHZhbHVlJT1zZWxmLlwifTttLl9fZGl2bW9kX189eyRuYW1lOlwiX19kaXZtb2RfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZtb2RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gZGl2bW9kKHNlbGYsIHZhbHVlKS5cIn07bS5fX3JkaXZtb2RfXz17JG5hbWU6XCJfX3JkaXZtb2RfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfZGl2bW9kXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSxcbiRkb2M6XCJSZXR1cm4gZGl2bW9kKHZhbHVlLCBzZWxmKVwifTttLl9fcG9zX189eyRuYW1lOlwiX19wb3NfX1wiLCRzbG90X25hbWU6XCJuYiRwb3NpdGl2ZVwiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiK3NlbGZcIn07bS5fX25lZ19fPXskbmFtZTpcIl9fbmVnX19cIiwkc2xvdF9uYW1lOlwibmIkbmVnYXRpdmVcIiwkc2xvdF9mdW5jOmgsJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIi1zZWxmXCJ9O20uX19hYnNfXz17JG5hbWU6XCJfX2Fic19fXCIsJHNsb3RfbmFtZTpcIm5iJGFic1wiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiYWJzKHNlbGYpXCJ9O20uX19ib29sX189eyRuYW1lOlwiX19ib29sX19cIiwkc2xvdF9uYW1lOlwibmIkYm9vbFwiLCRzbG90X2Z1bmM6ZChcIl9fYm9vbF9fXCIsXG5Tay5idWlsdGluLmNoZWNrQm9vbCxcImJvb2xcIixhPT4wIT09YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uYm9vbChhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJzZWxmICE9IDBcIn07bS5fX2ludmVydF9fPXskbmFtZTpcIl9faW52ZXJ0X19cIiwkc2xvdF9uYW1lOlwibmIkaW52ZXJ0XCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJ+c2VsZlwifTttLl9fbHNoaWZ0X189eyRuYW1lOlwiX19sc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRsc2hpZnRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZjw8dmFsdWUuXCJ9O20uX19ybHNoaWZ0X189eyRuYW1lOlwiX19ybHNoaWZ0X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2xzaGlmdFwiLCRzbG90X2Z1bmM6ZyxcbiR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlPDxzZWxmLlwifTttLl9fcnNoaWZ0X189eyRuYW1lOlwiX19yc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRyc2hpZnRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZj4+dmFsdWUuXCJ9O20uX19ycnNoaWZ0X189eyRuYW1lOlwiX19ycnNoaWZ0X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3JzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZT4+c2VsZi5cIn07bS5fX2lsc2hpZnRfXz17JG5hbWU6XCJfX2lsc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX2xzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLFxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGY8PD12YWx1ZS5cIn07bS5fX2lyc2hpZnRfXz17JG5hbWU6XCJfX2lyc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX3JzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmPT4+dmFsdWUuXCJ9O20uX19hbmRfXz17JG5hbWU6XCJfX2FuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmJnZhbHVlLlwifTttLl9fcmFuZF9fPXskbmFtZTpcIl9fcmFuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmVsY3RlZF9hbmRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsXG4kZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSZzZWxmLlwifTttLl9faWFuZF9fPXskbmFtZTpcIl9faWFuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmJj12YWx1ZS5cIn07bS5fX3hvcl9fPXskbmFtZTpcIl9feG9yX19cIiwkc2xvdF9uYW1lOlwibmIkeG9yXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZedmFsdWUuXCJ9O20uX19yeG9yX189eyRuYW1lOlwiX19yeG9yX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3hvclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZV5zZWxmLlwifTtcbm0uX19peG9yX189eyRuYW1lOlwiX19peG9yX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV94b3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZl49dmFsdWUuXCJ9O20uX19vcl9fPXskbmFtZTpcIl9fb3JfX1wiLCRzbG90X25hbWU6XCJuYiRvclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmfHZhbHVlLlwifTttLl9fcm9yX189eyRuYW1lOlwiX19yb3JfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfb3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWV8c2VsZi5cIn07bS5fX2lvcl9fPXskbmFtZTpcIl9faW9yX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9vclwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGZ8PXZhbHVlLlwifTttLl9faW50X189eyRuYW1lOlwiX19pbnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnRcIiwkc2xvdF9mdW5jOmQoXCJfX2ludF9fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiaW50KHNlbGYpXCJ9O20uX19mbG9hdF9fPXskbmFtZTpcIl9fZmxvYXRfX1wiLCRzbG90X25hbWU6XCJuYiRmbG9hdFwiLCRzbG90X2Z1bmM6ZChcIl9fZmxvYXRfX1wiLFNrLmJ1aWx0aW4uY2hlY2tGbG9hdCxcImZsb2F0XCIpLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJmbG9hdChzZWxmKVwifTttLl9fZmxvb3JkaXZfXz17JG5hbWU6XCJfX2Zsb29yZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkZmxvb3JfZGl2aWRlXCIsXG4kc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZi8vdmFsdWUuXCJ9O20uX19yZmxvb3JkaXZfXz17JG5hbWU6XCJfX3JmbG9vcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWUvL3NlbGYuXCJ9O20uX19pZmxvb3JkaXZfXz17JG5hbWU6XCJfX2lmbG9vcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfZmxvb3JfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYvLz12YWx1ZS5cIn07bS5fX3RydWVkaXZfXz17JG5hbWU6XCJfX3RydWVkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZpZGVcIixcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmL3ZhbHVlLlwifTttLl9fcnRydWVkaXZfXz17JG5hbWU6XCJfX3J0cnVlZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZS9zZWxmLlwifTttLl9faXRydWVkaXZfXz17JG5hbWU6XCJfX2l0cnVlZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi89dmFsdWUuXCJ9O20uX19pbmRleF9fPXskbmFtZTpcIl9faW5kZXhfX1wiLCRzbG90X25hbWU6XCJuYiRpbmRleFwiLCRzbG90X2Z1bmM6ZChcIl9faW5kZXhfX1wiLFxuU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiLGE9PmEudiksJHdyYXBwZXI6bChhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYgY29udmVydGVkIHRvIGFuIGludGVnZXIsIGlmIHNlbGYgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBpbmRleCBpbnRvIGEgbGlzdC5cIn07bS5fX3Bvd19fPXskbmFtZTpcIl9fcG93X19cIiwkc2xvdF9uYW1lOlwibmIkcG93ZXJcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtyZXR1cm4gdm9pZCAwPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShkLFtiXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQsW2IsY10pfX0sJHdyYXBwZXI6YiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIG1vZD1Ob25lLCAvKVwiLCRmbGFnczp7TWluQXJnczoxLFxuTWF4QXJnczoyfSwkZG9jOlwiUmV0dXJuIHBvdyhzZWxmLCB2YWx1ZSwgbW9kKS5cIn07bS5fX3Jwb3dfXz17JG5hbWU6XCJfX3Jwb3dfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIiwkc2xvdF9mdW5jOm0uX19wb3dfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmIsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBtb2Q9Tm9uZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCRkb2M6XCJSZXR1cm4gcG93KHZhbHVlLCBzZWxmLCBtb2QpLlwifTttLl9faXBvd19fPXskbmFtZTpcIl9faXBvd19fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfcG93ZXJcIiwkc2xvdF9mdW5jOm0uX19wb3dfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmIsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBtb2Q9Tm9uZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCRkb2M6XCJJbXBsZW1lbnQgKio9XCJ9O20uX19tYXRtdWxfXz17JG5hbWU6XCJfX21hdG11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJG1hdHJpeF9tdWx0aXBseVwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZAdmFsdWUuXCJ9O20uX19ybWF0bXVsX189eyRuYW1lOlwiX19ybWF0bXVsX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX21hdHJpeF9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZUBzZWxmLlwifTttLl9faW1hdG11bF9fPXskbmFtZTpcIl9faW1hdG11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGZAPXZhbHVlLlwifTttLl9fbG9uZ19fPXskbmFtZTpcIl9fbG9uZ19fXCIsJHNsb3RfbmFtZTpcIm5iJGxvbmdcIixcbiRzbG90X2Z1bmM6ZChcIl9fbG9uZ19fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiaW50KHNlbGYpXCJ9O3ZhciBBLHQ9e25leHQ6eyRuYW1lOlwibmV4dFwiLCRzbG90X25hbWU6XCJ0cCRpdGVybmV4dFwiLCRzbG90X2Z1bmM6bS5fX25leHRfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOm0uX19uZXh0X18uJHdyYXBwZXIsJHRleHRzaWc6bS5fX25leHRfXy4kdGV4dHNpZywkZmxhZ3M6bS5fX25leHRfXy4kZmxhZ3N9LF9fbm9uemVyb19fOnskbmFtZTpcIl9fbm9uemVyb19fXCIsJHNsb3RfbmFtZTpcIm5iJGJvb2xcIiwkc2xvdF9mdW5jOmQoXCJfX25vbnplcm9fX1wiLFNrLmJ1aWx0aW4uY2hlY2tJbnQsXCJpbnRcIixhPT4wIT09YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uYm9vbChhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJ4Ll9fbm9uemVyb19fKCkgPD09PiB4ICE9IDBcIn0sXG5fX2Rpdl9fOnskbmFtZTpcIl9fZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIG90aGVyLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcInguX19kaXZfXyh5KSA8PT0+IHgveVwifSxfX3JkaXZfXzp7JG5hbWU6XCJfX3JkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIG90aGVyLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcInguX19yZGl2X18oeSkgPD09PiB4L3lcIn0sX19pZGl2X186eyRuYW1lOlwiX19pZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgb3RoZXIvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiaW1wbGVtZW50IHNlbGYgLz0gb3RoZXJcIn19O1NrLnN1YlNsb3RzPXttYWluX3Nsb3RzOk9iamVjdC5lbnRyaWVzKHt0cCRpbml0OlwiX19pbml0X19cIixcbnRwJGNhbGw6XCJfX2NhbGxfX1wiLCRyOlwiX19yZXByX19cIix0cCRzdHI6XCJfX3N0cl9fXCIsdHAkZ2V0YXR0cjpcIl9fZ2V0YXR0cmlidXRlX19cIix0cCRzZXRhdHRyOltcIl9fc2V0YXR0cl9fXCIsXCJfX2RlbGF0dHJfX1wiXSxvYiRlcTpcIl9fZXFfX1wiLG9iJG5lOlwiX19uZV9fXCIsb2IkbHQ6XCJfX2x0X19cIixvYiRsZTpcIl9fbGVfX1wiLG9iJGd0OlwiX19ndF9fXCIsb2IkZ2U6XCJfX2dlX19cIix0cCRkZXNjcl9nZXQ6XCJfX2dldF9fXCIsdHAkZGVzY3Jfc2V0OltcIl9fc2V0X19cIixcIl9fZGVsZXRlX19cIl0sdHAkaXRlcjpcIl9faXRlcl9fXCIsdHAkaXRlcm5leHQ6XCJfX25leHRfX1wifSksbnVtYmVyX3Nsb3RzOk9iamVjdC5lbnRyaWVzKHtuYiRhYnM6XCJfX2Fic19fXCIsbmIkbmVnYXRpdmU6XCJfX25lZ19fXCIsbmIkcG9zaXRpdmU6XCJfX3Bvc19fXCIsbmIkaW50OlwiX19pbnRfX1wiLG5iJGxvbmc6XCJfX2xvbmdfX1wiLG5iJGZsb2F0OlwiX19mbG9hdF9fXCIsbmIkYWRkOlwiX19hZGRfX1wiLG5iJHJlZmxlY3RlZF9hZGQ6XCJfX3JhZGRfX1wiLFxubmIkaW5wbGFjZV9hZGQ6XCJfX2lhZGRfX1wiLG5iJHN1YnRyYWN0OlwiX19zdWJfX1wiLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpcIl9fcnN1Yl9fXCIsbmIkaW5wbGFjZV9zdWJ0cmFjdDpcIl9faXN1Yl9fXCIsbmIkbXVsdGlwbHk6XCJfX211bF9fXCIsbmIkcmVmbGVjdGVkX211bHRpcGx5OlwiX19ybXVsX19cIixuYiRpbnBsYWNlX211bHRpcGx5OlwiX19pbXVsX19cIixuYiRmbG9vcl9kaXZpZGU6XCJfX2Zsb29yZGl2X19cIixuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlOlwiX19yZmxvb3JkaXZfX1wiLG5iJGlucGxhY2VfZmxvb3JfZGl2aWRlOlwiX19pZmxvb3JkaXZfX1wiLG5iJGludmVydDpcIl9faW52ZXJ0X19cIixuYiRyZW1haW5kZXI6XCJfX21vZF9fXCIsbmIkcmVmbGVjdGVkX3JlbWFpbmRlcjpcIl9fcm1vZF9fXCIsbmIkaW5wbGFjZV9yZW1haW5kZXI6XCJfX2ltb2RfX1wiLG5iJGRpdm1vZDpcIl9fZGl2bW9kX19cIixuYiRyZWZsZWN0ZWRfZGl2bW9kOlwiX19yZGl2bW9kX19cIixuYiRwb3dlcjpcIl9fcG93X19cIixuYiRyZWZsZWN0ZWRfcG93ZXI6XCJfX3Jwb3dfX1wiLFxubmIkaW5wbGFjZV9wb3dlcjpcIl9faXBvd19fXCIsbmIkZGl2aWRlOlwiX190cnVlZGl2X19cIixuYiRyZWZsZWN0ZWRfZGl2aWRlOlwiX19ydHJ1ZWRpdl9fXCIsbmIkaW5wbGFjZV9kaXZpZGU6XCJfX2l0cnVlZGl2X19cIixuYiRib29sOlwiX19ib29sX19cIixuYiRhbmQ6XCJfX2FuZF9fXCIsbmIkcmVmbGVjdGVkX2FuZDpcIl9fcmFuZF9fXCIsbmIkaW5wbGFjZV9hbmQ6XCJfX2lhbmRfX1wiLG5iJG9yOlwiX19vcl9fXCIsbmIkcmVmbGVjdGVkX29yOlwiX19yb3JfX1wiLG5iJGlucGxhY2Vfb3I6XCJfX2lvcl9fXCIsbmIkeG9yOlwiX194b3JfX1wiLG5iJHJlZmxlY3RlZF94b3I6XCJfX3J4b3JfX1wiLG5iJGlucGxhY2VfeG9yOlwiX19peG9yX19cIixuYiRsc2hpZnQ6XCJfX2xzaGlmdF9fXCIsbmIkcmVmbGVjdGVkX2xzaGlmdDpcIl9fcmxzaGlmdF9fXCIsbmIkcnNoaWZ0OlwiX19yc2hpZnRfX1wiLG5iJHJlZmxlY3RlZF9yc2hpZnQ6XCJfX3Jyc2hpZnRfX1wiLG5iJGlucGxhY2VfbHNoaWZ0OlwiX19pbHNoaWZ0X19cIixuYiRpbnBsYWNlX3JzaGlmdDpcIl9faXJzaGlmdF9fXCIsXG5uYiRtYXRyaXhfbXVsdGlwbHk6XCJfX21hdG11bF9fXCIsbmIkcmVmbGVjdGVkX21hdHJpeF9tdWx0aXBseTpcIl9fcm1hdG11bF9fXCIsbmIkaW5wbGFjZV9tYXRyaXhfbXVsdGlwbHk6XCJfX2ltYXRtdWxfX1wifSksc2VxdWVuY2VfYW5kX21hcHBpbmdfc2xvdHM6T2JqZWN0LmVudHJpZXMoe3NxJGxlbmd0aDpcIl9fbGVuX19cIixzcSRjb250YWluczpcIl9fY29udGFpbnNfX1wiLG1wJHN1YnNjcmlwdDpcIl9fZ2V0aXRlbV9fXCIsbXAkYXNzX3N1YnNjcmlwdDpbXCJfX3NldGl0ZW1fX1wiLFwiX19kZWxpdGVtX19cIl0sbmIkYWRkOlwiX19hZGRfX1wiLG5iJG11bHRpcGx5OlwiX19tdWxfX1wiLG5iJHJlZmxlY3RlZF9tdWx0aXBseTpcIl9fcm11bF9fXCIsbmIkaW5wbGFjZV9hZGQ6XCJfX2lhZGRfX1wiLG5iJGlucGxhY2VfbXVsdGlwbHk6XCJfX2ltdWxfX1wifSl9O1NrLnJlZmxlY3RlZE51bWJlclNsb3RzPXtuYiRhZGQ6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9hZGRcIn0sbmIkc3VidHJhY3Q6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9zdWJ0cmFjdFwiLFxuc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRzdWJ0cmFjdCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJG11bHRpcGx5OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIn0sbmIkZGl2aWRlOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRkaXZpZGUodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRmbG9vcl9kaXZpZGU6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGZsb29yX2RpdmlkZSh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LFxubmIkcmVtYWluZGVyOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcmVtYWluZGVyXCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRyZW1haW5kZXIodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRkaXZtb2Q6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9kaXZtb2RcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGRpdm1vZCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJHBvd2VyOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIixzbG90OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkcG93ZXIodGhpcyxiKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJGFuZDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2FuZFwifSxcbm5iJG9yOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfb3JcIn0sbmIkeG9yOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfeG9yXCJ9LG5iJGxzaGlmdDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2xzaGlmdFwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkbHNoaWZ0KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkcnNoaWZ0OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcnNoaWZ0XCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRyc2hpZnQodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRtYXRyaXhfbXVsdGlwbHk6e3JlZmxlY3RlZDpcIm5iJHJlZmxleHRlZF9tYXRyaXhfbXVsdGlwbHlcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9cbmEubmIkbWF0cml4X211bHRpcGx5KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX19O1NrLnNlcXVlbmNlQW5kTWFwcGluZ1Nsb3RzPXtzcSRjb25jYXQ6W1wibmIkYWRkXCJdLHNxJHJlcGVhdDpbXCJuYiRtdWx0aXBseVwiLFwibmIkcmVmbGVjdGVkX211bHRpcGx5XCJdLG1wJGxlbmd0aDpbXCJzcSRsZW5ndGhcIl0sc3EkaW5wbGFjZV9yZXBlYXQ6W1wibmIkaW5wbGFjZV9tdWx0aXBseVwiXSxzcSRpbnBsYWNlX2NvbmNhdDpbXCJuYiRpbnBsYWNlX2FkZFwiXX07U2suZHVuZGVyVG9Ta3VscHQ9e19fcmVwcl9fOlwiJHJcIixfX3N0cl9fOlwidHAkc3RyXCIsX19pbml0X186XCJ0cCRpbml0XCIsX19uZXdfXzpcInRwJG5ld1wiLF9faGFzaF9fOlwidHAkaGFzaFwiLF9fY2FsbF9fOlwidHAkY2FsbFwiLF9faXRlcl9fOlwidHAkaXRlclwiLF9fbmV4dF9fOlwidHAkaXRlcm5leHRcIixfX2VxX186XCJvYiRlcVwiLF9fbmVfXzpcIm9iJG5lXCIsX19sdF9fOlwib2IkbHRcIixfX2xlX186XCJvYiRsZVwiLFxuX19ndF9fOlwib2IkZ3RcIixfX2dlX186XCJvYiRnZVwiLF9fYWJzX186XCJuYiRhYnNcIixfX25lZ19fOlwibmIkbmVnYXRpdmVcIixfX3Bvc19fOlwibmIkcG9zaXRpdmVcIixfX2ludF9fOlwibmIkaW50XCIsX19mbG9hdF9fOlwibmIkZmxvYXRcIixfX2FkZF9fOlwibmIkYWRkXCIsX19yYWRkX186XCJuYiRyZWZsZWN0ZWRfYWRkXCIsX19pYWRkX186XCJuYiRpbnBsYWNlX2FkZFwiLF9fc3ViX186XCJuYiRzdWJ0cmFjdFwiLF9fcnN1Yl9fOlwibmIkcmVmbGVjdGVkX3N1YnRyYWN0XCIsX19pc3ViX186XCJuYiRpbnBsYWNlX3N1YnRyYWN0XCIsX19tdWxfXzpcIm5iJG11bHRpcGx5XCIsX19ybXVsX186XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIixfX2ltdWxfXzpcIm5iJGlucGxhY2VfbXVsdGlwbHlcIixfX3RydWVkaXZfXzpcIm5iJGRpdmlkZVwiLF9fcnRydWVkaXZfXzpcIm5iJHJlZmxlY3RlZF9kaXZpZGVcIixfX2l0cnVlZGl2X186XCJuYiRpbnBsYWNlX2RpdmlkZVwiLF9fZmxvb3JkaXZfXzpcIm5iJGZsb29yX2RpdmlkZVwiLF9fcmZsb29yZGl2X186XCJuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlXCIsXG5fX2lmbG9vcmRpdl9fOlwibmIkaW5wbGFjZV9mbG9vcl9kaXZpZGVcIixfX2ludmVydF9fOlwibmIkaW52ZXJ0XCIsX19tb2RfXzpcIm5iJHJlbWFpbmRlclwiLF9fcm1vZF9fOlwibmIkcmVmbGVjdGVkX3JlbWFpbmRlclwiLF9faW1vZF9fOlwibmIkaW5wbGFjZV9yZW1haW5kZXJcIixfX2Rpdm1vZF9fOlwibmIkZGl2bW9kXCIsX19yZGl2bW9kX186XCJuYiRyZWZsZWN0ZWRfZGl2bW9kXCIsX19wb3dfXzpcIm5iJHBvd2VyXCIsX19ycG93X186XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIixfX2lwb3dfXzpcIm5iJGlucGxhY2VfcG93ZXJcIixfX2Jvb2xfXzpcIm5iJGJvb2xcIixfX2xvbmdfXzpcIm5iJGxvbmdcIixfX2xzaGlmdF9fOlwibmIkbHNoaWZ0XCIsX19ybHNoaWZ0X186XCJuYiRyZWZsZWN0ZWRfbHNoaWZ0XCIsX19pbHNoaWZ0X186XCJuYiRpbnBsYWNlX2xzaGlmdFwiLF9fcnNoaWZ0X186XCJuYiRyc2hpZnRcIixfX3Jyc2hpZnRfXzpcIm5iJHJlZmxlY3RlZF9yc2hpZnRcIixfX2lyc2hpZnRfXzpcIm5iJGlucGxhY2VfcnNoaWZ0XCIsXG5fX2FuZF9fOlwibmIkYW5kXCIsX19yYW5kX186XCJuYiRyZWZsZWN0ZWRfYW5kXCIsX19pYW5kX186XCJuYiRpbnBsYWNlX2FuZFwiLF9fb3JfXzpcIm5iJG9yXCIsX19yb3JfXzpcIm5iJHJlZmxlY3RlZF9vclwiLF9faW9yX186XCJuYiRpbnBsYWNlX29yXCIsX194b3JfXzpcIm5iJHhvclwiLF9fcnhvcl9fOlwibmIkcmVmbGVjdGVkX3hvclwiLF9faXhvcl9fOlwibmIkaW5wbGFjZV94b3JcIixfX21hdG11bF9fOlwibmIkbWF0cml4X211bHRpcGx5XCIsX19ybWF0bXVsX186XCJuYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5XCIsX19pbWF0bXVsX186XCJuYiRpbnBsYWNlX21hdHJpeF9tdWx0aXBseVwiLF9fZ2V0X186XCJ0cCRkZXNjcl9nZXRcIixfX3NldF9fOlwidHAkZGVzY3Jfc2V0XCIsX19kZWxldGVfXzpcInRwJGRlc2NyX3NldFwiLF9fZ2V0YXR0cmlidXRlX186XCJ0cCRnZXRhdHRyXCIsX19nZXRhdHRyX186XCJ0cCRnZXRhdHRyXCIsX19zZXRhdHRyX186XCJ0cCRzZXRhdHRyXCIsX19kZWxhdHRyX186XCJ0cCRzZXRhdHRyXCIsX19sZW5fXzpcInNxJGxlbmd0aFwiLFxuX19jb250YWluc19fOlwic3EkY29udGFpbnNcIixfX2dldGl0ZW1fXzpcIm1wJHN1YnNjcmlwdFwiLF9fc2V0aXRlbV9fOlwibXAkYXNzX3N1YnNjcmlwdFwiLF9fZGVsaXRlbV9fOlwibXAkYXNzX3N1YnNjcmlwdFwifTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cER1bmRlck1ldGhvZHNcIixTay5zZXR1cER1bmRlck1ldGhvZHMpO1NrLnNldHVwRHVuZGVyTWV0aG9kcz1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYixjKXtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgZT1hW2RdLnByb3RvdHlwZTtlLmhhc093blByb3BlcnR5KGMpfHwoZVtjXT1lW2JdLGRlbGV0ZSBlW2JdKX19dmFyIGM9U2suc2xvdHM7aWYoIWF8fHZvaWQgMCE9PUEpe3ZhciBkPVNrLmFic3RyLmJ1aWx0JGl0ZXJhdG9ycyxlPVtTay5idWlsdGluLmludF8sU2suYnVpbHRpbi5sbmcsU2suYnVpbHRpbi5mbG9hdF8sU2suYnVpbHRpbi5jb21wbGV4XSxmPVNrLnN1YlNsb3RzLm51bWJlcl9zbG90cyxnPVNrLnN1YlNsb3RzLm1haW5fc2xvdHMsXG5oPWcuZmluZEluZGV4KGE9PlwidHAkaXRlcm5leHRcIj09PWFbMF0pLGs9Zi5maW5kSW5kZXgoYT0+XCJuYiRib29sXCI9PT1hWzBdKSxsPVNrLmR1bmRlclRvU2t1bHB0O2lmKGEpe2wuX19ib29sX189XCJuYiRib29sXCI7bC5fX25leHRfXz1cInRwJGl0ZXJuZXh0XCI7ZGVsZXRlIGwuX19ub256ZXJvX187ZGVsZXRlIGwuX19kaXZfXztkZWxldGUgbC5fX3JkaXZfXztkZWxldGUgbC5fX2lkaXZfXztkZWxldGUgbC5uZXh0O2ZvcihsZXQgYSBpbiBBKWNbYV09QVthXTtmb3IobGV0IGEgaW4gdClkZWxldGUgY1thXTtmb3IoYT0wO2E8ZS5sZW5ndGg7YSsrKWM9ZVthXS5wcm90b3R5cGUsZGVsZXRlIGMuX19kaXZfXyxkZWxldGUgYy5fX3JkaXZfXztnW2hdWzFdPVwiX19uZXh0X19cIjtmW2tdWzFdPVwiX19ib29sX19cIjtiKGQsXCJuZXh0XCIsXCJfX25leHRfX1wiKTtiKGUsXCJfX2Jvb2xfX1wiLFwiX19ub256ZXJvX19cIil9ZWxzZXt2b2lkIDA9PT1BJiYoYy5weTMkc2xvdHM9e19fbmV4dF9fOmMuX19uZXh0X199LFxuQT1jLnB5MyRzbG90cyk7bC5uZXh0PVwidHAkaXRlcm5leHRcIjtsLl9fbm9uemVyb19fPVwibmIkYm9vbFwiO2wuX19kaXZfXz1cIm5iJGRpdmlkZVwiO2wuX19yZGl2X189XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCI7bC5fX2lkaXZfXz1cIm5iJGlucGxhY2VfZGl2aWRlXCI7ZGVsZXRlIGwuX19ib29sX187ZGVsZXRlIGwuX19uZXh0X187Zm9yKGxldCBhIGluIHQpY1thXT10W2FdO2ZvcihsZXQgYSBpbiBBKWRlbGV0ZSBjW2FdO2dbaF1bMV09XCJuZXh0XCI7ZltrXVsxXT1cIl9fbm9uemVyb19fXCI7YihkLFwiX19uZXh0X19cIixcIm5leHRcIik7YihlLFwiX19ub256ZXJvX19cIixcIl9fYm9vbF9fXCIpO2ZvcihkPTA7ZDxlLmxlbmd0aDtkKyspZj1lW2RdLGc9Zi5wcm90b3R5cGUsZy5oYXNPd25Qcm9wZXJ0eShcIl9fZGl2X19cIil8fChnLl9fZGl2X189bmV3IFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKGYsdC5fX2Rpdl9fLGcubmIkZGl2aWRlKSxnLl9fcmRpdl9fPW5ldyBTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcihmLFxudC5fX3JkaXZfXyxTay5yZWZsZWN0ZWROdW1iZXJTbG90cy5uYiRkaXZpZGUuc2xvdCkpfX19fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxoLGQpe3JldHVybiBTay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKGEse2NvbnN0cnVjdG9yOmQuY29uc3RydWN0b3Isc2xvdHM6T2JqZWN0LmFzc2lnbih7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsJHI6ZX0sZC5zbG90cyksZ2V0c2V0czpPYmplY3QuYXNzaWduKGQuZ2V0c2V0c3x8e30sZikscHJvdG86T2JqZWN0LmFzc2lnbihkLnByb3RvfHx7fSx7ZCRyZXByX25hbWU6aHx8YSxkJGNoZWNrOmMsZCRzZXRfY2hlY2s6Yn0pLGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9ZnVuY3Rpb24gYyhhKXtpZihudWxsPT1hKXJldHVybiB0aGlzO2lmKCFhLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXG5cIicgcmVxdWlyZXMgYSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBidXQgcmVjZWl2ZWQgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdFwiKTt9ZnVuY3Rpb24gYihhKXtpZighYS5vYiR0eXBlLiRpc1N1YlR5cGUodGhpcy5kJHR5cGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyByZXF1aXJlcyBhICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IGJ1dCByZWNlaXZlZCBhICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0XCIpO31mdW5jdGlvbiBlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIit0aGlzLmQkcmVwcl9uYW1lK1wiICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzPlwiKX1jb25zdCBmPXtfX2RvY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCRkZWYuJGRvYz9cbm5ldyBTay5idWlsdGluLnN0cih0aGlzLmQkZGVmLiRkb2MpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LF9fb2JqY2xhc3NfXzp7JGdldCgpe3JldHVybiB0aGlzLmQkdHlwZX19LF9fbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLmQkbmFtZSl9fX07bT17X190ZXh0X3NpZ25hdHVyZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCRkZWYuJHRleHRzaWc/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuZCRkZWYuJHRleHRzaWcpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fTtTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yPWEoXCJnZXRzZXRfZGVzY3JpcHRvclwiLHZvaWQgMCx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiKXt0aGlzLmQkZGVmPWI7dGhpcy4kZ2V0PWIuJGdldDt0aGlzLiRzZXQ9Yi4kc2V0O3RoaXMuZCR0eXBlPWE7dGhpcy5kJG5hbWU9Yi4kbmFtZX0sc2xvdHM6e3RwJGRlc2NyX2dldChhLGIpe2lmKGI9dGhpcy5kJGNoZWNrKGEpKXJldHVybiBiO1xuaWYodm9pZCAwIT09dGhpcy4kZ2V0KXJldHVybiB0aGlzLiRnZXQuY2FsbChhKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcImdldHNldF9kZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzIGlzIG5vdCByZWFkYWJsZVwiKTt9LHRwJGRlc2NyX3NldChhLGIpe3RoaXMuZCRzZXRfY2hlY2soYSk7aWYodm9pZCAwIT09dGhpcy4kc2V0KXJldHVybiB0aGlzLiRzZXQuY2FsbChhLGIpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiYXR0cmlidXRlICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzIGlzIHJlYWRvbmx5XCIpO319fSk7U2suYnVpbHRpbi5tZXRob2RfZGVzY3JpcHRvcj1hKFwibWV0aG9kX2Rlc2NyaXB0b3JcIixcIm1ldGhvZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMuZCRkZWY9XG5iO3RoaXMuJG1ldGg9Yi4kbWV0aDt0aGlzLmQkdHlwZT1hO3RoaXMuZCRuYW1lPWIuJG5hbWV8fFwiPG5hdGl2ZSBKUz5cIjt0aGlzLiRmbGFncz1hPWIuJGZsYWdzfHx7fTthLkZhc3RDYWxsJiZhLk5vS3dhcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RGYXN0Q2FsbE5vS3dhcmdzOmEuRmFzdENhbGw/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZEZhc3RDYWxsOmEuTm9BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsTm9BcmdzOmEuT25lQXJnP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsT25lQXJnOmEuTmFtZWRBcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsTmFtZWRBcmdzOnZvaWQgMCE9PWEuTWluQXJncz90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aG9kQ2FsbE1pbkFyZ3M6KHRoaXMuZnVuY19jb2RlPWIuJG1ldGgsdGhpcy50cCRjYWxsPXRoaXMuJGRlZmF1bHRDYWxsLHRoaXMuJG1lbW9pc2VGbGFncz1Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRtZW1vaXNlRmxhZ3MsXG50aGlzLiRyZXNvbHZlQXJncz1Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRyZXNvbHZlQXJncyl9LHNsb3RzOnt0cCRjYWxsKGEsYil7cmV0dXJuIHRoaXMudHAkY2FsbChhLGIpfSx0cCRkZXNjcl9nZXQoYSxiKXtsZXQgYztyZXR1cm4oYz10aGlzLmQkY2hlY2soYSkpP2M6bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHRoaXMuZCRkZWYsYSl9fSxnZXRzZXRzOm0scHJvdG86eyRtZXRob2RGYXN0Q2FsbChhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7cmV0dXJuIHRoaXMuJG1ldGguY2FsbChjLGEsYil9LCRtZXRob2RGYXN0Q2FsbE5vS3dhcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuZCRuYW1lLGIpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYyxhKX0sJG1ldGhvZENhbGxOb0FyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuZCRuYW1lLFxuYSxiKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMpfSwkbWV0aG9kQ2FsbE9uZUFyZyhhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy5kJG5hbWUsYSxiKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMsYVswXSl9LCRtZXRob2RDYWxsTmFtZWRBcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKHRoaXMuZCRuYW1lLHRoaXMuJGZsYWdzLk5hbWVkQXJncyxhLGIsdGhpcy4kZmxhZ3MuRGVmYXVsdHMpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYywuLi5hKX0sJG1ldGhvZENhbGxNaW5BcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuZCRuYW1lLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLmQkbmFtZSxhLHRoaXMuJGZsYWdzLk1pbkFyZ3MsXG50aGlzLiRmbGFncy5NYXhBcmdzKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMsLi4uYSl9LCRkZWZhdWx0Q2FsbChhLGIpe3RoaXMubSRjaGVja3NlbGYoYVswXSk7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsYSxiKX0sbSRjaGVja3NlbGYoYSl7aWYodm9pZCAwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcIik7dGhpcy5kJGNoZWNrKGEpfX19KTtTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcj1hKFwid3JhcHBlcl9kZXNjcmlwdG9yXCIsXCJzbG90IHdyYXBwZXJcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZCRkZWY9Yjt0aGlzLmQkdHlwZT1hO3RoaXMuZCRuYW1lPWMuJG5hbWU9Yi4kbmFtZTt0aGlzLmQkd3JhcHBlZD1jfSxzbG90czp7dHAkZGVzY3JfZ2V0KGEsXG5iKXtsZXQgYztyZXR1cm4oYz10aGlzLmQkY2hlY2soYSkpP2M6bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXIodGhpcyxhKX0sdHAkY2FsbChhLGIpe2lmKDE+YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50XCIpO2NvbnN0IGM9YS5zaGlmdCgpO2lmKCFjLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJ1wiKTtyZXR1cm4gdGhpcy5yYXckY2FsbChjLGEsYil9fSxwcm90bzp7cmF3JGNhbGwoYSxiLGMpe3RoaXMuZCR3cmFwcGVkLiRuYW1lPVxudGhpcy5kJG5hbWU7cmV0dXJuIHRoaXMuZCRkZWYuJHdyYXBwZXIuY2FsbCh0aGlzLmQkd3JhcHBlZCxhLGIsYyl9fX0pO1NrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXI9YShcIm1ldGhvZF93cmFwcGVyXCIsdm9pZCAwLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMubSRkZXNjcj1hO3RoaXMubSRzZWxmPWI7dGhpcy5kJGRlZj1hLmQkZGVmO3RoaXMuZCRuYW1lPWEuZCRuYW1lO3RoaXMuZCR0eXBlPWEuZCR0eXBlfSxzbG90czp7dHAkY2FsbChhLGIpe3JldHVybiB0aGlzLm0kZGVzY3IucmF3JGNhbGwodGhpcy5tJHNlbGYsYSxiKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtpZihcIkVxXCIhPT1iJiZcIk5vdEVxXCIhPT1ifHwhKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLm1ldGhvZF93cmFwcGVyKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7YT10aGlzLm0kc2VsZj09PWEubSRzZWxmJiZ0aGlzLm0kZGVzY3I9PT1hLm0kZGVzY3I7cmV0dXJuXCJFcVwiPT09XG5iP2E6IWF9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxtZXRob2Qtd3JhcHBlciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMubSRzZWxmKStcIiBvYmplY3Q+XCIpfX0sZ2V0c2V0czp7X19zZWxmX186eyRnZXQoKXtyZXR1cm4gdGhpcy5tJHNlbGZ9fX19KTtTay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3I9YShcImNsYXNzbWV0aG9kX2Rlc2NyaXB0b3JcIixcIm1ldGhvZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMuZCRkZWY9Yjt0aGlzLiRtZXRoPWIuJG1ldGg7dGhpcy5kJHR5cGU9YTt0aGlzLmQkbmFtZT1iLiRuYW1lfHxcIjxuYXRpdmUgSlM+XCJ9LHNsb3RzOnt0cCRjYWxsKGEsYil7aWYoMT5hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcIik7XG5jb25zdCBjPWEuc2hpZnQoKTtyZXR1cm4gdGhpcy50cCRkZXNjcl9nZXQobnVsbCxjKS50cCRjYWxsKGEsYil9LHRwJGRlc2NyX2dldChhLGIsYyl7aWYodm9pZCAwPT09YilpZihudWxsIT09YSliPWJ8fGEub2IkdHlwZTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBmb3IgdHlwZSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG5lZWRzIGFuIG9iamVjdCBvciBhIHR5cGVcIik7aWYoYi5vYiR0eXBlIT09U2suYnVpbHRpbi50eXBlKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBmb3IgdHlwZSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG5lZWRzIGEgdHlwZSBub3QgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXCInIGFzIGFyZyAyXCIpO2lmKCFiLiRpc1N1YlR5cGUodGhpcy5kJHR5cGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK1xudGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1wiJyBvYmplY3RcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnNrX21ldGhvZCh0aGlzLmQkZGVmLGIpfX0sZ2V0c2V0czptfSk7W1NrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IsU2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcixTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcixTay5idWlsdGluLm1ldGhvZF93cmFwcGVyLFNrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcl0uZm9yRWFjaChhPT57U2suYWJzdHIuc2V0VXBTbG90cyhhKTtTay5hYnN0ci5zZXRVcE1ldGhvZHMoYSk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGEpfSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5za19tZXRob2Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImJ1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIpe3RoaXMuJG1ldGg9YS4kbWV0aC5iaW5kKGMpO3RoaXMuJGRvYz1hLiRkb2M7dGhpcy4kc2VsZj1jfHxudWxsO3RoaXMuJG1vZHVsZT1iP25ldyBTay5idWlsdGluLnN0cihiKTpudWxsO3RoaXMuJG5hbWU9YS4kbmFtZXx8YS4kbWV0aC5uYW1lfHxcIjxuYXRpdmUgSlM+XCI7dGhpcy5tJGRlZj1hO3RoaXMuJHRleHRzaWc9YS4kdGV4dHNpZzt0aGlzLiRmbGFncz1hPWEuJGZsYWdzfHx7fTthLkZhc3RDYWxsJiZhLk5vS3dhcmdzP3RoaXMudHAkY2FsbD10aGlzLiRmYXN0Q2FsbE5vS3dhcmdzOmEuRmFzdENhbGw/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGg6YS5Ob0FyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxOb0FyZ3M6YS5PbmVBcmc/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxPbmVBcmc6YS5OYW1lZEFyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxOYW1lZEFyZ3M6dm9pZCAwIT09YS5NaW5BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRjYWxsTWluQXJnczpcbih0aGlzLmZ1bmNfY29kZT10aGlzLiRtZXRoLHRoaXMudHAkY2FsbD10aGlzLiRkZWZhdWx0Q2FsbE1ldGhvZCl9LHByb3RvOnskZmFzdENhbGxOb0t3YXJncyhhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy4kbmFtZSxjKTtyZXR1cm4gdGhpcy4kbWV0aChhKX0sJGNhbGxOb0FyZ3MoYSxjKXtTay5hYnN0ci5jaGVja05vQXJncyh0aGlzLiRuYW1lLGEsYyk7cmV0dXJuIHRoaXMuJG1ldGgoKX0sJGNhbGxPbmVBcmcoYSxjKXtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLiRuYW1lLGEsYyk7cmV0dXJuIHRoaXMuJG1ldGgoYVswXSl9LCRjYWxsTmFtZWRBcmdzKGEsYyl7YT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyh0aGlzLiRuYW1lLHRoaXMuJGZsYWdzLk5hbWVkQXJncyxhLGMsdGhpcy4kZmxhZ3MuRGVmYXVsdHMpO3JldHVybiB0aGlzLiRtZXRoKC4uLmEpfSwkY2FsbE1pbkFyZ3MoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7XG5Tay5hYnN0ci5jaGVja0FyZ3NMZW4odGhpcy4kbmFtZSxhLHRoaXMuJGZsYWdzLk1pbkFyZ3MsdGhpcy4kZmxhZ3MuTWF4QXJncyk7cmV0dXJuIHRoaXMuJG1ldGgoLi4uYSl9LCRkZWZhdWx0Q2FsbE1ldGhvZChhLGMpe3JldHVybiBudWxsIT09dGhpcy4kc2VsZj9Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLnRwJGNhbGwuY2FsbCh0aGlzLFt0aGlzLiRzZWxmLC4uLmFdLGMpOlNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsYSxjKX0sJG1lbW9pc2VGbGFncygpe3JldHVybiBTay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRtZW1vaXNlRmxhZ3MuY2FsbCh0aGlzKX0sJHJlc29sdmVBcmdzKCl7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUuJHJlc29sdmVBcmdzLmNhbGwodGhpcyl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsJHIoKXtyZXR1cm4gbnVsbD09PVxudGhpcy4kc2VsZj9uZXcgU2suYnVpbHRpbi5zdHIoXCI8YnVpbHQtaW4gZnVuY3Rpb24gXCIrdGhpcy4kbmFtZStcIj5cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGJ1aWx0LWluIG1ldGhvZCBcIit0aGlzLiRuYW1lK1wiIG9mIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMuJHNlbGYpK1wiIG9iamVjdD5cIil9LHRwJGNhbGwoYSxjKXtyZXR1cm4gdGhpcy50cCRjYWxsKGEsYyl9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoXCJFcVwiIT09YyYmXCJOb3RFcVwiIT09Y3x8IShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5za19tZXRob2QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPXRoaXMuJHNlbGY9PT1hLiRzZWxmJiZ0aGlzLm0kZGVmLiRtZXRoPT09YS5tJGRlZi4kbWV0aDtyZXR1cm5cIkVxXCI9PT1jP2E6IWF9fSxnZXRzZXRzOntfX21vZHVsZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJG1vZHVsZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkc2V0KGEpe3RoaXMuJG1vZHVsZT1cbmE9YXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLiRkb2M/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJG5hbWUpfX0sX190ZXh0X3NpZ25hdHVyZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLiR0ZXh0c2lnKX19LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJHNlbGZ8fFNrLnN5c01vZHVsZXMubXAkbG9va3VwKHRoaXMuJG1vZHVsZSl8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubm9uZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm9uZVR5cGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxzbG90czp7dHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3MoXCJOb25lVHlwZVwiLFxuYSxjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJOb25lXCIpfSx0cCRhc19udW1iZXI6ITAsbmIkYm9vbCgpe3JldHVybiExfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLm5vbmUubm9uZSQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLm5vbmUucHJvdG90eXBlLHt2Ont2YWx1ZTpudWxsLGVudW1lcmFibGU6ITB9fSk7U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm90SW1wbGVtZW50ZWRUeXBlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfSxzbG90czp7JHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiTm90SW1wbGVtZW50ZWRcIil9LHRwJG5ldyhhLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKFwiTm90SW1wbGVtZW50ZWRUeXBlXCIsXG5hLGMpO3JldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLk5vdEltcGxlbWVudGVkLnByb3RvdHlwZSx7djp7dmFsdWU6bnVsbCxlbnVtZXJhYmxlOiEwfX0pfSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9L14oPzooLik/KFs8Pj1cXF5dKSk/KFtcXCtcXC1cXHNdKT8oIyk/KDApPyhcXGQrKT8oLCk/KD86XFwuKFxcZCspKT8oW2JjZGVFZkZnR25vc3hYJV0pPyQvO1NrLmZvcm1hdHRpbmc9e307bGV0IGM9ZnVuY3Rpb24oYSxiLGMsZSl7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBiKTtpZihhWzZdKXt2YXIgZD1wYXJzZUludChhWzZdLDEwKTtlPWFbMl18fChhWzVdP1wiPVwiOmU/XCI+XCI6XCI8XCIpO2xldCBmPWQtKGIubGVuZ3RoKyhjP2MubGVuZ3RoOjApKTtcbmlmKDA+PWYpcmV0dXJuIGI7ZD0oYVsxXXx8KGFbNV0/XCIwXCI6XCIgXCIpKS5yZXBlYXQoZik7c3dpdGNoKGUpe2Nhc2UgXCI9XCI6aWYoXCJzXCI9PT1hWzldKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCInPScgYWxpZ25tZW50IG5vdCBhbGxvd2VkIGluIHN0cmluZyBmb3JtYXQgc3BlY2lmaWVyXCIpO3JldHVybiBjK2QrYjtjYXNlIFwiPlwiOnJldHVybiBkK2MrYjtjYXNlIFwiPFwiOnJldHVybiBjK2IrZDtjYXNlIFwiXlwiOnJldHVybiBhPU1hdGguZmxvb3IoZi8yKSxkLnN1YnN0cmluZygwLGEpK2MrYitkLnN1YnN0cmluZyhhKX19cmV0dXJuIGMrYn0sYj1mdW5jdGlvbihhLGIpe3JldHVybiBiP1wiLVwiOlwiK1wiPT09YVszXT9cIitcIjpcIiBcIj09PWFbM10/XCIgXCI6XCJcIn0sZT1mdW5jdGlvbihhLGUsZCl7U2suYXNzZXJ0cy5hc3NlcnQoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8ZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKTtpZihhWzhdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJQcmVjaXNpb24gbm90IGFsbG93ZWQgaW4gaW50ZWdlciBmb3JtYXRcIik7XG5sZXQgZj1lLnN0ciQoZCwhMSk7ZT1lLm5iJGlzbmVnYXRpdmUoKTtlPWIoYSxlKTthWzRdJiYoMTY9PT1kP2UrPVwiMHhcIjo4PT09ZD9lKz1cIjBvXCI6Mj09PWQmJihlKz1cIjBiXCIpKTtcIlhcIj09PWFbOV0mJihmPWYudG9VcHBlckNhc2UoKSk7XCJuXCI9PT1hWzldP2Y9KCtmKS50b0xvY2FsZVN0cmluZygpOmFbN10mJihkPWYudG9TdHJpbmcoKS5zcGxpdChcIi5cIiksZFswXT1kWzBdLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csXCIsXCIpLGY9ZC5qb2luKFwiLlwiKSk7cmV0dXJuIGMoYSxmLGUsITApfSxmPWZ1bmN0aW9uKGYsaCxkKXtpZighaClyZXR1cm4gZi5zdHIkKDEwLCEwKTtoPWgubWF0Y2goYSk7aWYoIWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkludmFsaWQgZm9ybWF0IHNwZWNpZmllclwiKTt2YXIgZz1oWzldO2d8fChnPWQ/XCJnXCI6XCJkXCIpO2lmKC0xPT0oZD9cImZGZUVnRyVcIjpcImJjZG94WG5mRmVFZ0clXCIpLmluZGV4T2YoZykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gZm9ybWF0IGNvZGUgJ1wiK1xuaFs5XStcIicgZm9yIG9iamVjdCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShmKStcIidcIik7c3dpdGNoKGcpe2Nhc2UgXCJkXCI6Y2FzZSBcIm5cIjpyZXR1cm4gZShoLGYsMTApO2Nhc2UgXCJ4XCI6Y2FzZSBcIlhcIjpyZXR1cm4gZShoLGYsMTYpO2Nhc2UgXCJvXCI6cmV0dXJuIGUoaCxmLDgpO2Nhc2UgXCJiXCI6cmV0dXJuIGUoaCxmLDIpO2Nhc2UgXCJjXCI6aWYoaFszXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiU2lnbiBub3QgYWxsb3dlZCB3aXRoIGludGVnZXIgZm9ybWF0IHNwZWNpZmllciAnYydcIik7aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gbm90IGFsbG93ZWQgd2l0aCBpbnRlZ2VyIGZvcm1hdCBzcGVjaWZpZXIgJ2MnXCIpO2lmKGhbN10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5ICcsJyB3aXRoICdjJ1wiKTtpZihoWzhdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSAnLCcgd2l0aCAnYydcIik7XG5yZXR1cm4gYyhoLFN0cmluZy5mcm9tQ29kZVBvaW50KFNrLmJ1aWx0aW4uYXNudW0kKGYpKSxcIlwiLCEwKTtjYXNlIFwiZlwiOmNhc2UgXCJGXCI6Y2FzZSBcImVcIjpjYXNlIFwiRVwiOmNhc2UgXCJnXCI6Y2FzZSBcIkdcIjp7aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIGluIGZsb2F0IGZvcm1hdCBzcGVjaWZpZXJcIik7ZD1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIGQmJihkPU51bWJlcihkKSk7aWYoSW5maW5pdHk9PT1kKXJldHVybiBjKGgsXCJpbmZcIixcIlwiLCEwKTtpZigtSW5maW5pdHk9PT1kKXJldHVybiBjKGgsXCJpbmZcIixcIi1cIiwhMCk7aWYoaXNOYU4oZCkpcmV0dXJuIGMoaCxcIm5hblwiLFwiXCIsITApO2Y9ITE7MD5kJiYoZD0tZCxmPSEwKTt2YXIgbD1bXCJ0b0V4cG9uZW50aWFsXCIsXCJ0b0ZpeGVkXCIsXCJ0b1ByZWNpc2lvblwiXVtcImVmZ1wiLmluZGV4T2YoZy50b0xvd2VyQ2FzZSgpKV07bGV0IGE9aFs4XT9cbnBhcnNlSW50KGhbOF0sMTApOjY7ZD1kW2xdKGEpOy0xIT09XCJFRkdcIi5pbmRleE9mKGcpJiYoZD1kLnRvVXBwZXJDYXNlKCkpO2lmKFwiZ1wiPT09Zy50b0xvd2VyQ2FzZSgpfHwhaFs5XSl7aWYobD1kLm1hdGNoKC9cXC4oXFxkKlsxLTldKT8oMCspJC8pKXtsZXQgWyxhLGJdPWw7ZD1kLnNsaWNlKDAsYT8tYi5sZW5ndGg6LShiLmxlbmd0aCsxKSl9LTEhPWQuaW5kZXhPZihcIi5cIil8fGhbOV18fChkKz1cIi4wXCIpfVwiZVwiPT09Zy50b0xvd2VyQ2FzZSgpJiYoZD1kLnJlcGxhY2UoL14oWy0rXT9bMC05XSpcXC4/WzAtOV0rW2VFXVstK10/KShbMC05XSk/JC8sXCIkMTAkMlwiKSk7aFs3XSYmKGc9ZC50b1N0cmluZygpLnNwbGl0KFwiLlwiKSxnWzBdPWdbMF0ucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZyxcIixcIiksZD1nLmpvaW4oXCIuXCIpKTtyZXR1cm4gYyhoLGQsYihoLGYpLCEwKX1jYXNlIFwiJVwiOmlmKGhbNF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkFsdGVybmF0ZSBmb3JtICgjKSBub3QgYWxsb3dlZCB3aXRoIGZvcm1hdCBzcGVjaWZpZXIgJyUnXCIpO1xuZj1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIGYmJihmPU51bWJlcihmKSk7aWYoSW5maW5pdHk9PT1mKXJldHVybiBjKGgsXCJpbmYlXCIsXCJcIiwhMCk7aWYoLUluZmluaXR5PT09ZilyZXR1cm4gYyhoLFwiaW5mJVwiLFwiLVwiLCEwKTtpZihpc05hTihmKSlyZXR1cm4gYyhoLFwibmFuJVwiLFwiXCIsITApO2c9ITE7MD5mJiYoZj0tZixnPSEwKTtkPWhbOF0/cGFyc2VJbnQoaFs4XSwxMCk6NjtmPSgxMDAqZikudG9GaXhlZChkKStcIiVcIjtyZXR1cm4gYyhoLGYsYihoLGcpLCEwKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJVbmtub3duIGZvcm1hdCBjb2RlICdcIitoWzldK1wiJ1wiKTt9fTtTay5mb3JtYXR0aW5nLm1rTnVtYmVyX19mb3JtYXRfXz1hPT5mdW5jdGlvbihiKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQoKSBhcmd1bWVudCAyIG11c3QgYmUgc3RyLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShiKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihmKHRoaXMsYi4kanNzdHIoKSxhKSl9O1NrLmZvcm1hdHRpbmcuZm9ybWF0PWZ1bmN0aW9uKGEsYil7Yj1ifHxbXTtjb25zdCBjPXt9O2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9MiljW2JbYV1dPWJbYSsxXTtmb3IobGV0IGIgaW4gYSljW2JdPWFbYl07bGV0IGU9MDthPXRoaXMudi5yZXBsYWNlKC97KCgoPzpcXGQrKXwoPzpcXHcrKSk/KCg/OlxcLihcXHcrKSl8KD86XFxbKCg/OlxcZCspfCg/OlxcdyspKVxcXSk/KSk/KD86IShbcnNdKSk/KD86OihbXn1dKikpP30vZyxmdW5jdGlvbihhLGIsZCxmLGcsaCxsLEIsRCxtKXtsZXQgaztpZih2b2lkIDAhPT1oJiZcIlwiIT09aClhPWNbZF0saz1hLmNvbnN0cnVjdG9yPT09QXJyYXk/YVtoXTovXlxcZCskLy50ZXN0KGgpP1NrLmFic3RyLm9iamVjdEdldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5pbnRfKHBhcnNlSW50KGgsMTApKSwhMSk6U2suYWJzdHIub2JqZWN0R2V0SXRlbShhLFxubmV3IFNrLmJ1aWx0aW4uc3RyKGgpLCExKSxlKys7ZWxzZSBpZih2b2lkIDAhPT1nJiZcIlwiIT09ZylrPVNrLmFic3RyLmdhdHRyKGNbZHx8ZSsrXSxuZXcgU2suYnVpbHRpbi5zdHIoZykpO2Vsc2UgaWYodm9pZCAwIT09ZCYmXCJcIiE9PWQpaz1jW2RdO2Vsc2UgaWYodm9pZCAwPT09Ynx8XCJcIj09PWIpaz1jW2VdLGUrKztlbHNlIGlmKGIgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGIgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0X3x8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nfHwvXlxcZCskLy50ZXN0KGIpKWs9Y1tiXSxlKys7aWYoXCJzXCI9PT1sKWs9bmV3IFNrLmJ1aWx0aW4uc3RyKGspO2Vsc2UgaWYoXCJyXCI9PT1sKWs9U2suYnVpbHRpbi5yZXByKGspO2Vsc2UgaWYoXCJcIiE9PWwmJnZvaWQgMCE9PWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gY29udmVyc2lvbiBzcGVjaWZpZXIgXCIrbCk7cmV0dXJuIFNrLmFic3RyLm9iamVjdEZvcm1hdChrLFxubmV3IFNrLmJ1aWx0aW4uc3RyKEIpKS4kanNzdHIoKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9O1NrLmZvcm1hdHRpbmcuZm9ybWF0U3RyaW5nPWZ1bmN0aW9uKGIpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZvcm1hdCgpIGFyZ3VtZW50IDIgbXVzdCBiZSBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShiKSk7Yj1iLiRqc3N0cigpLm1hdGNoKGEpO2lmKGJbOV0mJlwic1wiIT09Yls5XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiVW5rbm93biBmb3JtYXQgY29kZSAnXCIrYls5XStcIicgZm9yIG9iamVjdCBvZiB0eXBlICdzdHInXCIpO2lmKGJbM10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlNpZ24gbm90IGFsbG93ZWQgaW4gc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJcIik7aWYoYls0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIHdpdGggc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJcIik7XG5pZihiWzddKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSAnLCcgd2l0aCAncydcIik7bGV0IGU9dGhpcy52O2JbOF0mJihlPWUuc3Vic3RyaW5nKDAsYls4XSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyhiLGUsXCJcIiwhMSkpfX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2xldCBiO2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspYj1hLmNoYXJBdChkKSxrLnRlc3QoYik/Yy5wdXNoKGIpOlwiXFxcXDAwMFwiPT09Yj9jLnB1c2goXCJcXFxcMDAwXCIpOmMucHVzaChcIlxcXFxcIitiKTtyZXR1cm4gYy5qb2luKFwiXCIpfWZ1bmN0aW9uIGMoYSxiLGMpe2I9U2suYnVpbHRpbi5jaGVja05vbmUoYik/bnVsbDphLmdldCR0Z3QoYik7aWYobnVsbCE9PWImJiFiLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZW1wdHkgc2VwYXJhdG9yXCIpO2E9YS52O3ZhciBkPTA7aWYobnVsbD09PWIpe3ZhciBlPS9bXFxzXFx4YTBdKy9nO1xuZD1hLmxlbmd0aDthPWEucmVwbGFjZSh1LFwiXCIpO2QtPWEubGVuZ3RofWVsc2UgZT1iLnJlcGxhY2UocCxcIlxcXFwkMVwiKSxlPW5ldyBSZWdFeHAoZSxcImdcIik7Y29uc3QgZj1bXTtsZXQgZz0wLGs9MCxoO2ZvcihjPTA+Yz9JbmZpbml0eTpjO251bGwhPShoPWUuZXhlYyhhKSkmJms8YyYmaC5pbmRleCE9PWUubGFzdEluZGV4OylmLnB1c2goZytkKSxmLnB1c2goaC5pbmRleCtkKSxnPWUubGFzdEluZGV4LGsrPTE7aWYobnVsbCE9PWJ8fGEubGVuZ3RoLWcpZi5wdXNoKGcrZCksZi5wdXNoKGEubGVuZ3RoK2QpO3JldHVybiBmfWZ1bmN0aW9uIGIoYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7aWYodm9pZCAwPT09ZHx8U2suYnVpbHRpbi5jaGVja05vbmUoZCkpZD1iO2Vsc2UgaWYoZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKWQ9YShkLnYpLGQ9bmV3IFJlZ0V4cChjKGQpLFwiZ1wiKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInN0cmlwIGFyZyBtdXN0IGJlIE5vbmUgb3Igc3RyXCIpO1xucmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYucmVwbGFjZShkLFwiXCIpKX19ZnVuY3Rpb24gZShhKXtyZXR1cm4gZnVuY3Rpb24oYil7Yj10aGlzLmdldCR0Z3QoYik7Y29uc3QgYz10aGlzLnY7bGV0IGQ7aWYoYSl7aWYoZD1jLmxhc3RJbmRleE9mKGIpLDA+ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihcIlwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXCJcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKGMpXSl9ZWxzZSBpZihkPWMuaW5kZXhPZihiKSwwPmQpcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoYyksbmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpLG5ldyBTay5idWlsdGluLnN0cihcIlwiKV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uc3RyKGMuc3Vic3RyaW5nKDAsZCkpLG5ldyBTay5idWlsdGluLnN0cihiKSxuZXcgU2suYnVpbHRpbi5zdHIoYy5zdWJzdHJpbmcoZCtiLmxlbmd0aCkpXSl9fVxuZnVuY3Rpb24gZihhLGIpe3JldHVybiBmdW5jdGlvbihjLGQpe2M9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGMsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZih2b2lkIDA9PT1kKWQ9XCIgXCI7ZWxzZSBpZihkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHImJjE9PT1kLnNxJGxlbmd0aCgpKWQ9ZC52O2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidGhlIGZpbGwgY2hhcmFjdGVyIG11c3QgYmUgYSBzdHIgb2YgbGVuZ3RoIDFcIik7Y29uc3QgZT10aGlzLnNxJGxlbmd0aCgpO2xldCBmO2lmKGU+PWMpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYpO2lmKGIpcmV0dXJuIGY9ZC5yZXBlYXQoTWF0aC5mbG9vcigoYy1lKS8yKSksZj1mK3RoaXMuditmLChjLWUpJTImJihmKz1kKSxuZXcgU2suYnVpbHRpbi5zdHIoZik7Zj1kLnJlcGVhdChjLWUpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYT9mK3RoaXMudjp0aGlzLnYrZil9fWZ1bmN0aW9uIGwoYSxcbmIsYyl7KHtzdGFydDpiLGVuZDpjfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydChhLGIsYykpO2lmKGEuJGhhc0FzdHJhbENvZGVQb2ludHMoKSl7Y29uc3QgZD1hLmNvZGVwb2ludHNbYl07Yj12b2lkIDA9PT1kP2IrYS52Lmxlbmd0aC1hLmNvZGVwb2ludHMubGVuZ3RoOmQ7Yz1hLmNvZGVwb2ludHNbY107Yz12b2lkIDA9PT1jP2Eudi5sZW5ndGg6Y31yZXR1cm57c3RhcnQ6YixlbmQ6Y319ZnVuY3Rpb24gaChhKXtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpOyh7c3RhcnQ6YyxlbmQ6ZH09bCh0aGlzLGMsZCkpO2lmKGQ8YylyZXR1cm4tMTtkLT1iLmxlbmd0aDtiPWE/dGhpcy52Lmxhc3RJbmRleE9mKGIsZCk6dGhpcy52LmluZGV4T2YoYixjKTtiPWI+PWMmJmI8PWQ/YjotMTtpZih0aGlzLmNvZGVwb2ludHMpe2Q9dGhpcy5zcSRsZW5ndGgoKTtjPS0xO2ZvcihsZXQgYT0wO2E8ZDthKyspYj09dGhpcy5jb2RlcG9pbnRzW2FdJiYoYz1hKX1lbHNlIGM9XG5iO3JldHVybiBjfX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cnx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiIGZpcnN0IGFyZyBtdXN0IGJlIHN0ciBvciBhIHR1cGxlIG9mIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTsoe3N0YXJ0OmQsZW5kOmV9PWwodGhpcyxkLGUpKTtpZihkPmUpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7ZD10aGlzLnYuc2xpY2UoZCxlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7Zm9yKGxldCBlPVNrLmFic3RyLml0ZXIoYyksZj1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWUudHAkaXRlcm5leHQoKSl7aWYoIShmIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR1cGxlIGZvciBcIithK1wiIG11c3Qgb25seSBjb250YWluIHN0ciwgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoZikpO2lmKGIoZCxmLnYpKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSR9cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYihkLGMudikpfX12YXIgZz0vXlswLTkhI19dLyxuPU9iamVjdC5jcmVhdGUobnVsbCk7U2suYnVpbHRpbi5zdHI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInN0clwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIsXCJiYWQgY2FsbCB0byBzdHIgLSB1c2UgJ25ldydcIik7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhKWlmKHZvaWQgMD09PWEpYT1cIlwiO2Vsc2UgaWYobnVsbD09PWEpYT1cIk5vbmVcIjtlbHNle2lmKHZvaWQgMCE9PWEudHAkc3RyKXJldHVybiBhLnRwJHN0cigpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSlhPU51bWJlci5pc0Zpbml0ZShhKT9TdHJpbmcoYSk6U3RyaW5nKGEpLnJlcGxhY2UoXCJJbmZpbml0eVwiLFxuXCJpbmZcIikucmVwbGFjZShcIk5hTlwiLFwibmFuXCIpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgb2JqZWN0IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyB0byBzdHJcIik7fXZhciBiPW5bYV07aWYodm9pZCAwIT09YilyZXR1cm4gYjtuW2FdPXRoaXM7Yj12b2lkIDA9PT10W2FdP2E6YStcIl8kcnckXCI7dGhpcy4kbWFuZ2xlZD1iO3RoaXMuJHNhdmVkS2V5SGFzaD1hLnJlcGxhY2UoZyxcIiEkJlwiKTt0aGlzLnY9YX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkZG9jOlwic3RyKG9iamVjdD0nJykgLT4gc3RyXFxuc3RyKGJ5dGVzX29yX2J1ZmZlclssIGVuY29kaW5nWywgZXJyb3JzXV0pIC0+IHN0clxcblxcbkNyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IGZyb20gdGhlIGdpdmVuIG9iamVjdC4gSWYgZW5jb2Rpbmcgb3JcXG5lcnJvcnMgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBvYmplY3QgbXVzdCBleHBvc2UgYSBkYXRhIGJ1ZmZlclxcbnRoYXQgd2lsbCBiZSBkZWNvZGVkIHVzaW5nIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgZXJyb3IgaGFuZGxlci5cXG5PdGhlcndpc2UsIHJldHVybnMgdGhlIHJlc3VsdCBvZiBvYmplY3QuX19zdHJfXygpIChpZiBkZWZpbmVkKVxcbm9yIHJlcHIob2JqZWN0KS5cXG5lbmNvZGluZyBkZWZhdWx0cyB0byBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkuXFxuZXJyb3JzIGRlZmF1bHRzIHRvICdzdHJpY3QnLlwiLFxudHAkbmV3KGEsYil7Yj1ifHxbXTtpZih0aGlzIT09U2suYnVpbHRpbi5zdHIucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGIpO2lmKDE+PWEubGVuZ3RoJiYhYi5sZW5ndGgpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhWzBdKTtpZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2NvbnN0IFtjLGQsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJzdHJcIixbXCJvYmplY3RcIixcImVuY29kaW5nXCIsXCJlcnJvcnNcIl0sYSxiKTtpZih2b2lkIDA9PT1jfHx2b2lkIDA9PT1kJiZ2b2lkIDA9PT1lKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyk7U2suYnVpbHRpbi5ieXRlcy5jaGVjayRlbmNvZGVBcmdzKFwic3RyXCIsZCxlKTtpZighU2suYnVpbHRpbi5jaGVja0J5dGVzKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlY29kaW5nIHRvIHN0cjogbmVlZCBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCBcIitTay5hYnN0ci50eXBlTmFtZShjKStcIiBmb3VuZFwiKTtcbnJldHVybiBTay5idWlsdGluLmJ5dGVzLiRkZWNvZGUuY2FsbChjLGQsZSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3RyIHRha2VzIGF0IG1vc3Qgb25lIGFyZ3VtZW50IChcIisoYS5sZW5ndGgrYi5sZW5ndGgpK1wiIGdpdmVuKVwiKTt9LCRyKCl7bGV0IGE9XCInXCI7LTEhPT10aGlzLnYuaW5kZXhPZihcIidcIikmJi0xPT09dGhpcy52LmluZGV4T2YoJ1wiJykmJihhPSdcIicpO2NvbnN0IGI9dGhpcy52Lmxlbmd0aDtsZXQgYz1hO2ZvcihsZXQgZj0wO2Y8YjtmKyspe3ZhciBkPXRoaXMudi5jaGFyQXQoZik7dmFyIGU9dGhpcy52LmNoYXJDb2RlQXQoZik7ZD09PWF8fFwiXFxcXFwiPT09ZD9jKz1cIlxcXFxcIitkOlwiXFx0XCI9PT1kP2MrPVwiXFxcXHRcIjpcIlxcblwiPT09ZD9jKz1cIlxcXFxuXCI6XCJcXHJcIj09PWQ/Yys9XCJcXFxcclwiOigyNTU8ZSYmNTUyOTY+ZXx8NTczNDQ8PWUpJiYhU2suX19mdXR1cmVfXy5weXRob24zP2MrPVwiXFxcXHVcIisoXCIwMDBcIitlLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOjU1Mjk2PD1lJiZcbiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGQ9dGhpcy52LmNvZGVQb2ludEF0KGYpLGYrKyxkPWQudG9TdHJpbmcoMTYpLGU9XCIwMDAwMDAwXCIrZC50b1N0cmluZygxNiksYz00PGQubGVuZ3RoP2MrKFwiXFxcXFVcIitlLnNsaWNlKC04KSk6YysoXCJcXFxcdVwiK2Uuc2xpY2UoLTQpKSk6MjU1PGUmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yys9XCJcXFxcdWZmZmRcIjpcIiBcIj5kfHwxMjc8PWUmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGQ9ZC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSwyPmQubGVuZ3RoJiYoZD1cIjBcIitkKSxjKz1cIlxcXFx4XCIrZCk6Yys9ZH1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMrYSl9LHRwJHN0cigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5zdHI/dGhpczpuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52KX0sdHAkaXRlcigpe3JldHVybiBuZXcgQSh0aGlzKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO1xuc3dpdGNoKGIpe2Nhc2UgXCJMdFwiOnJldHVybiB0aGlzLnY8YS52O2Nhc2UgXCJMdEVcIjpyZXR1cm4gdGhpcy52PD1hLnY7Y2FzZSBcIkVxXCI6cmV0dXJuIHRoaXMudj09PWEudjtjYXNlIFwiTm90RXFcIjpyZXR1cm4gdGhpcy52IT09YS52O2Nhc2UgXCJHdFwiOnJldHVybiB0aGlzLnY+YS52O2Nhc2UgXCJHdEVcIjpyZXR1cm4gdGhpcy52Pj1hLnZ9fSxtcCRzdWJzY3JpcHQoYSl7bGV0IGI7aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9dGhpcy5zcSRsZW5ndGgoKTswPmEmJihhKz1iKTtpZigwPmF8fGE+PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcInN0cmluZyBpbmRleCBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIHRoaXMuY29kZXBvaW50cz9uZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cmluZyh0aGlzLmNvZGVwb2ludHNbYV0sdGhpcy5jb2RlcG9pbnRzW2ErMV0pKTpcbm5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuY2hhckF0KGEpKX1pZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7bGV0IGM9XCJcIjtiPXRoaXMuc3EkbGVuZ3RoKCk7dGhpcy5jb2RlcG9pbnRzP2Euc3NzaXRlciQoYixhPT57Yys9dGhpcy52LnN1YnN0cmluZyh0aGlzLmNvZGVwb2ludHNbYV0sdGhpcy5jb2RlcG9pbnRzW2ErMV0pfSk6YS5zc3NpdGVyJChiLGE9PntjKz10aGlzLnYuY2hhckF0KGEpfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihjKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHJpbmcgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMuJGhhc0FzdHJhbENvZGVQb2ludHMoKT90aGlzLmNvZGVwb2ludHMubGVuZ3RoOnRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNvbmNhdGVuYXRlICdzdHInIGFuZCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0c1wiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudithLnYpfSxzcSRyZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKGEqdGhpcy52Lmxlbmd0aD5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUil0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yO2xldCBiPVwiXCI7Zm9yKGxldCBjPTA7YzxhO2MrKyliKz10aGlzLnY7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0sc3EkY29udGFpbnMoYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKSk7cmV0dXJuLTEhPT10aGlzLnYuaW5kZXhPZihhLnYpfSx0cCRhc19udW1iZXI6ITAsbmIkcmVtYWluZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2NvbnN0IGM9dGhpcy5zayRidWlsdGluQmFzZTthLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi50dXBsZXx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdHx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5fHwoYT1uZXcgU2suYnVpbHRpbi50dXBsZShbYV0pKTt2YXIgZD0wO3ZhciBlPXRoaXMuJGpzc3RyKCkucmVwbGFjZSgvJShcXChbYS16QS1aMC05XStcXCkpPyhbIzAgK1xcLV0rKT8oXFwqfFswLTldKyk/KFxcLihcXCp8WzAtOV0rKSk/W2hsTF0/KFtkaW91eFhlRWZGZ0djcnNiJV0pL2csZnVuY3Rpb24oZSxmLGcsayxoLGwscCl7dmFyIG4sQixBLHYsTDtrPVNrLmJ1aWx0aW4uYXNudW0kKGspO2g9U2suYnVpbHRpbi5hc251bSQoaCk7dm9pZCAwIT09ZiYmXCJcIiE9PWZ8fFwiJVwiPT1wfHwobj1cbmQrKyk7XCJcIj09PWgmJihoPXZvaWQgMCk7dmFyIHQ9Qj1BPXY9TD0hMTtnJiYoLTEhPT1nLmluZGV4T2YoXCItXCIpP3Y9ITA6LTEhPT1nLmluZGV4T2YoXCIwXCIpJiYoTD0hMCksLTEhPT1nLmluZGV4T2YoXCIrXCIpP0I9ITA6LTEhPT1nLmluZGV4T2YoXCIgXCIpJiYoQT0hMCksdD0tMSE9PWcuaW5kZXhPZihcIiNcIikpO2gmJihoPXBhcnNlSW50KGguc3Vic3RyKDEpLDEwKSk7Zz1mdW5jdGlvbihhLGIpe3ZhciBjO2I9U2suYnVpbHRpbi5hc251bSQoYik7dmFyIGQ9ITE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXswPmEmJihhPS1hLGQ9ITApO3ZhciBlPWEudG9TdHJpbmcoYil9ZWxzZSBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/KGU9YS5zdHIkKGIsITEpLDI8ZS5sZW5ndGgmJlwiLjBcIj09PWUuc3Vic3RyKC0yKSYmKGU9ZS5zdWJzdHIoMCxlLmxlbmd0aC0yKSksZD1hLm5iJGlzbmVnYXRpdmUoKSk6YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xz8oZT1hLnN0ciQoYiwhMSksZD1cbmEubmIkaXNuZWdhdGl2ZSgpKTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmcmJihlPWEuc3RyJChiLCExKSxkPWEubmIkaXNuZWdhdGl2ZSgpKTtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1lLFwidW5oYW5kbGVkIG51bWJlciBmb3JtYXRcIik7YT0hMTtpZihoKWZvcihjPWUubGVuZ3RoO2M8aDsrK2MpZT1cIjBcIitlLGE9ITA7Yz1cIlwiO2Q/Yz1cIi1cIjpCP2M9XCIrXCIrYzpBJiYoYz1cIiBcIitjKTt0JiYoMTY9PT1iP2MrPVwiMHhcIjo4IT09Ynx8YXx8XCIwXCI9PT1lfHwoYys9XCIwXCIpKTtyZXR1cm5bYyxlXX07ZT1mdW5jdGlvbihhKXt2YXIgYj1hWzBdO2E9YVsxXTtpZihrKXtrPXBhcnNlSW50KGssMTApO3ZhciBjPWEubGVuZ3RoK2IubGVuZ3RoO2lmKEwpZm9yKDtjPGs7KytjKWE9XCIwXCIrYTtlbHNlIGlmKHYpe2Zvcig7YzxrOysrYylhKz1cIiBcIjtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJihhKz1iLGI9XCJcIil9ZWxzZSBmb3IoO2M8azsrK2MpYj1cIiBcIitifXJldHVybiBiK2F9O2lmKGEuY29uc3RydWN0b3I9PT1cblNrLmJ1aWx0aW4udHVwbGUpZj1hLnZbbl07ZWxzZSBpZih2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdCYmdm9pZCAwIT09ZilmPWYuc3Vic3RyaW5nKDEsZi5sZW5ndGgtMSksZj1hLm1wJHN1YnNjcmlwdChuZXcgYyhmKSk7ZWxzZSBpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5kaWN0fHxhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5saXN0KWY9YTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEudHAkbmFtZStcIiBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICdtcCRzdWJzY3JpcHQnXCIpO2lmKFwiZFwiPT09cHx8XCJpXCI9PT1wKXt2YXIgdT1nKGYsMTApO2lmKHZvaWQgMD09PXVbMV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJVwiK3ArXCIgZm9ybWF0OiBhIG51bWJlciBpcyByZXF1aXJlZCwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGYpKTtwPXVbMV07dVsxXT0tMSE9PXAuaW5kZXhPZihcIi5cIik/cGFyc2VJbnQocCwxMCkudG9TdHJpbmcoKTpcbnA7cmV0dXJuIGUodSl9aWYoXCJvXCI9PT1wKXJldHVybiBlKGcoZiw4KSk7aWYoXCJ4XCI9PT1wKXJldHVybiBlKGcoZiwxNikpO2lmKFwiWFwiPT09cClyZXR1cm4gZShnKGYsMTYpKS50b1VwcGVyQ2FzZSgpO2lmKFwiZlwiPT09cHx8XCJGXCI9PT1wfHxcImVcIj09PXB8fFwiRVwiPT09cHx8XCJnXCI9PT1wfHxcIkdcIj09PXApe3U9U2suYnVpbHRpbi5hc251bSQoZik7XCJzdHJpbmdcIj09PXR5cGVvZiB1JiYodT1OdW1iZXIodSkpO2lmKEluZmluaXR5PT09dSlyZXR1cm5cImluZlwiO2lmKC1JbmZpbml0eT09PXUpcmV0dXJuXCItaW5mXCI7aWYoaXNOYU4odSkpcmV0dXJuXCJuYW5cIjtuPVtcInRvRXhwb25lbnRpYWxcIixcInRvRml4ZWRcIixcInRvUHJlY2lzaW9uXCJdW1wiZWZnXCIuaW5kZXhPZihwLnRvTG93ZXJDYXNlKCkpXTtpZih2b2lkIDA9PT1ofHxcIlwiPT09aClpZihcImVcIj09PXB8fFwiRVwiPT09cCloPTY7ZWxzZSBpZihcImZcIj09PXB8fFwiRlwiPT09cCloPVNrLl9fZnV0dXJlX18ucHl0aG9uMz82Ojc7bj11W25dKGgpO1NrLmJ1aWx0aW4uY2hlY2tGbG9hdChmKSYmXG4wPT09dSYmLUluZmluaXR5PT09MS91JiYobj1cIi1cIituKTtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJig3PD1uLmxlbmd0aCYmXCIwLjAwMDBcIj09bi5zbGljZSgwLDYpJiYoYj1wYXJzZUZsb2F0KG4pLG49Yi50b0V4cG9uZW50aWFsKCkpLFwiLVwiPT1uLmNoYXJBdChuLmxlbmd0aC0yKSYmKG49bi5zbGljZSgwLG4ubGVuZ3RoLTEpK1wiMFwiK24uY2hhckF0KG4ubGVuZ3RoLTEpKSk7LTEhPT1cIkVGR1wiLmluZGV4T2YocCkmJihuPW4udG9VcHBlckNhc2UoKSk7cmV0dXJuIGUoW1wiXCIsbl0pfWlmKFwiY1wiPT09cCl7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBmKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGYpO2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0XylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShmLnYpO2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShmLnN0ciQoMTAsXG4hMSlbMF0pO2lmKGYuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnN0cilyZXR1cm4gZi52LnN1YnN0cigwLDEpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcIik7fWlmKFwiclwiPT09cClyZXR1cm4gcD1Tay5idWlsdGluLnJlcHIoZiksaD9wLnYuc3Vic3RyKDAsaCk6cC52O2lmKFwic1wiPT09cCYmYz09PVNrLmJ1aWx0aW4uc3RyKXtwPW5ldyBTay5idWlsdGluLnN0cihmKTtwPXAuJGpzc3RyKCk7aWYoaClyZXR1cm4gcC5zdWJzdHIoMCxoKTtrJiYocD1lKFtcIiBcIixwXSkpO3JldHVybiBwfWlmKFwiYlwiPT09cHx8XCJzXCI9PT1wKXtpZihjPT09U2suYnVpbHRpbi5zdHIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgJ2InXCIpO2lmKCEoZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpJiZ2b2lkIDA9PT0odT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGYsU2suYnVpbHRpbi5zdHIuJGJ5dGVzKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJWIgcmVxdWlyZXMgYSBieXRlcy1saWtlIG9iamVjdCwgb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBfX2J5dGVzX18sIG5vdCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShmKStcIidcIik7dm9pZCAwIT09dSYmKGY9bmV3IFNrLmJ1aWx0aW4uYnl0ZXMoZikpO3A9Zi4kanNzdHIoKTtpZihoKXJldHVybiBwLnN1YnN0cigwLGgpO2smJihwPWUoW1wiIFwiLHBdKSk7cmV0dXJuIHB9aWYoXCIlXCI9PT1wKXJldHVyblwiJVwifSk7cmV0dXJuIG5ldyBjKGUpfX0scHJvdG86e3RvU3RyaW5nKCl7cmV0dXJuIHRoaXMudn0sJHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS50cCRuZXcoYSxiKTtjLiRtYW5nbGVkPWEuJG1hbmdsZWQ7Yy4kc2F2ZWRLZXlIYXNoPWEuJHNhdmVkS2V5SGFzaDtjLnY9YS52O3JldHVybiBjfSwkanNzdHIoKXtyZXR1cm4gdGhpcy52fSwkaGFzQXN0cmFsQ29kZVBvaW50cygpe2lmKG51bGw9PT10aGlzLmNvZGVwb2ludHMpcmV0dXJuITE7aWYodm9pZCAwIT09dGhpcy5jb2RlcG9pbnRzKXJldHVybiEwO2Zvcih2YXIgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspe2xldCBiPVxudGhpcy52LmNoYXJDb2RlQXQoYSk7aWYoNTUyOTY8PWImJjU3MzQ0PmIpe3RoaXMuY29kZXBvaW50cz1bXTtmb3IoYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspdGhpcy5jb2RlcG9pbnRzLnB1c2goYSksYj10aGlzLnYuY2hhckNvZGVBdChhKSw1NTI5Njw9YiYmNTYzMjA+YiYmYSsrO3JldHVybiEwfX10aGlzLmNvZGVwb2ludHM9bnVsbDtyZXR1cm4hMX0sc2skYXNhcnJheSgpe2NvbnN0IGE9W107aWYodGhpcy4kaGFzQXN0cmFsQ29kZVBvaW50cygpKXt2YXIgYj10aGlzLmNvZGVwb2ludHM7Zm9yKGxldCBjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyaW5nKGJbY10sYltjKzFdKSkpfWVsc2UgZm9yKGI9MDtiPHRoaXMudi5sZW5ndGg7YisrKWEucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52W2JdKSk7cmV0dXJuIGF9LGZpbmQkbGVmdDpoKCExKSxmaW5kJHJpZ2h0OmgoITApLGdldCR0Z3QoYSl7aWYoYSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0cilyZXR1cm4gYS52O3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgc3RyIGluc3RhbmNlIGlzIHJlcXVpcmVkIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO319LG1ldGhvZHM6e2VuY29kZTp7JG1ldGg6ZnVuY3Rpb24oYSxiKXsoe2VuY29kaW5nOmEsZXJyb3JzOmJ9PVNrLmJ1aWx0aW4uYnl0ZXMuY2hlY2skZW5jb2RlQXJncyhcImVuY29kZVwiLGEsYikpO2E9U2suYnVpbHRpbi5ieXRlcy5zdHIkZW5jb2RlKHRoaXMsYSxiKTtyZXR1cm4gU2suX19mdXR1cmVfXy5weXRob24zP2E6bmV3IFNrLmJ1aWx0aW4uc3RyKGEuJGpzc3RyKCkpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJlbmNvZGluZ1wiLFwiZXJyb3JzXCJdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSdzdHJpY3QnKVwiLCRkb2M6XCJFbmNvZGUgdGhlIHN0cmluZyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgZW5jb2RpbmcuXFxuXFxuICBlbmNvZGluZ1xcbiAgICBUaGUgZW5jb2RpbmcgaW4gd2hpY2ggdG8gZW5jb2RlIHRoZSBzdHJpbmcuXFxuICBlcnJvcnNcXG4gICAgVGhlIGVycm9yIGhhbmRsaW5nIHNjaGVtZSB0byB1c2UgZm9yIGVuY29kaW5nIGVycm9ycy5cXG4gICAgVGhlIGRlZmF1bHQgaXMgJ3N0cmljdCcgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZSBhXFxuICAgIFVuaWNvZGVFbmNvZGVFcnJvci4gIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgJ2lnbm9yZScsICdyZXBsYWNlJyBhbmRcXG4gICAgJ3htbGNoYXJyZWZyZXBsYWNlJyBhcyB3ZWxsIGFzIGFueSBvdGhlciBuYW1lIHJlZ2lzdGVyZWQgd2l0aFxcbiAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IgdGhhdCBjYW4gaGFuZGxlIFVuaWNvZGVFbmNvZGVFcnJvcnMuXCJ9LFxucmVwbGFjZTp7JG1ldGgoYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpO2M9dGhpcy5nZXQkdGd0KGMpO2Q9dm9pZCAwPT09ZD8tMTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9bmV3IFJlZ0V4cChhKGIpLFwiZ1wiKTtpZigwPmQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYucmVwbGFjZShiLGMpKTtsZXQgZT0wO2I9dGhpcy52LnJlcGxhY2UoYixhPT5lKys8ZD9jOmEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIG9sZCwgbmV3LCBjb3VudD0tMSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgb2xkIHJlcGxhY2VkIGJ5IG5ldy5cXG5cXG4gIGNvdW50XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIHRvIHJlcGxhY2UuXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMuXFxuXFxuSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGNvdW50IGlzIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBjb3VudCBvY2N1cnJlbmNlcyBhcmVcXG5yZXBsYWNlZC5cIn0sXG5zcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT1jKHRoaXMsYSxiKTtiPVtdO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cmluZyhhW2NdLGFbKytjXSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wic2VwXCIsXCJtYXhzcGxpdFwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLC0xXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcIiwkZG9jOlwiUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgc2VwIGFzIHRoZSBkZWxpbWl0ZXIgc3RyaW5nLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBzdHJpbmcuXFxuICAgIE5vbmUgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBzcGxpdCBhY2NvcmRpbmcgdG8gYW55IHdoaXRlc3BhY2UsXFxuICAgIGFuZCBkaXNjYXJkIGVtcHR5IHN0cmluZ3MgZnJvbSB0aGUgcmVzdWx0LlxcbiAgbWF4c3BsaXRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygc3BsaXRzIHRvIGRvLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIG5vIGxpbWl0LlwifSxcbnJzcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT1jKHRoaXMsYSwtMSk7dmFyIGQ9MD5iPzA6MiooYS5sZW5ndGgvMi1iKTtiPVtdO2ZvcigwPj1kP2Q9MDpiLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zbGljZSgwLGFbZC0xXSkpKTtkPGEubGVuZ3RoO2QrKyliLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zdWJzdHJpbmcoYVtkXSxhWysrZF0pKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9LCRmbGFnczp7TmFtZWRBcmdzOltcInNlcFwiLFwibWF4c3BsaXRcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4ubm9uZS5ub25lJCwtMV19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyIHN0cmluZy5cXG5cXG4gIHNlcFxcbiAgICBUaGUgZGVsaW1pdGVyIGFjY29yZGluZyB3aGljaCB0byBzcGxpdCB0aGUgc3RyaW5nLlxcbiAgICBOb25lICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgc3BsaXQgYWNjb3JkaW5nIHRvIGFueSB3aGl0ZXNwYWNlLFxcbiAgICBhbmQgZGlzY2FyZCBlbXB0eSBzdHJpbmdzIGZyb20gdGhlIHJlc3VsdC5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cXG5cXG5TcGxpdHMgYXJlIGRvbmUgc3RhcnRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGFuZCB3b3JraW5nIHRvIHRoZSBmcm9udC5cIn0sXG5qb2luOnskbWV0aChhKXtjb25zdCBiPVtdO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzZXF1ZW5jZSBpdGVtIFwiK2IubGVuZ3RoK1wiOiBleHBlY3RlZCBzdHIsIFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGZvdW5kXCIpO2IucHVzaChhLnYpfSksKCk9Pm5ldyBTay5idWlsdGluLnN0cihiLmpvaW4odGhpcy52KSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJDb25jYXRlbmF0ZSBhbnkgbnVtYmVyIG9mIHN0cmluZ3MuXFxuXFxuVGhlIHN0cmluZyB3aG9zZSBtZXRob2QgaXMgY2FsbGVkIGlzIGluc2VydGVkIGluIGJldHdlZW4gZWFjaCBnaXZlbiBzdHJpbmcuXFxuVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBhcyBhIG5ldyBzdHJpbmcuXFxuXFxuRXhhbXBsZTogJy4nLmpvaW4oWydhYicsICdwcScsICdycyddKSAtPiAnYWIucHEucnMnXCJ9LFxuY2FwaXRhbGl6ZTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0aGlzLnYuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY2FwaXRhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLlxcblxcbk1vcmUgc3BlY2lmaWNhbGx5LCBtYWtlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaGF2ZSB1cHBlciBjYXNlIGFuZCB0aGUgcmVzdCBsb3dlclxcbmNhc2UuXCJ9LHRpdGxlOnskbWV0aDpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy52LnJlcGxhY2UoL1thLXpdW2Etel0qL2dpLGE9PmFbMF0udG9VcHBlckNhc2UoKSthLnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGVyZSBlYWNoIHdvcmQgaXMgdGl0bGVjYXNlZC5cXG5cXG5Nb3JlIHNwZWNpZmljYWxseSwgd29yZHMgc3RhcnQgd2l0aCB1cHBlcmNhc2VkIGNoYXJhY3RlcnMgYW5kIGFsbCByZW1haW5pbmdcXG5jYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXIgY2FzZS5cIn0sXG5jZW50ZXI6eyRtZXRoOmYoITEsITApLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJHNlbGYsIHdpZHRoLCBmaWxsY2hhcj0nICcsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNlbnRlcmVkIHN0cmluZyBvZiBsZW5ndGggd2lkdGguXFxuXFxuUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuXCJ9LGNvdW50OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmdldCR0Z3QoYSk7KHtzdGFydDpiLGVuZDpjfT1sKHRoaXMsYixjKSk7aWYoYzxiKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKDApO2E9YS5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZyxcIlxcXFwkJlwiKTthPW5ldyBSZWdFeHAoYSxcImdcIik7cmV0dXJuKGI9dGhpcy52LnNsaWNlKGIsYykubWF0Y2goYSkpP25ldyBTay5idWlsdGluLmludF8oYi5sZW5ndGgpOm5ldyBTay5idWlsdGluLmludF8oMCl9LCRmbGFnczp7TWluQXJnczoxLFxuTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgc3ViIGluXFxuc3RyaW5nIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZVxcbmludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlwifSxleHBhbmR0YWJzOnskbWV0aDpmdW5jdGlvbihhKXtpZihTay5idWlsdGluLmNoZWNrSW50KGEpKWE9U2suYnVpbHRpbi5hc251bSQoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkLCBnb3QgdHlwZVwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTtjb25zdCBiPUFycmF5KGErMSkuam9pbihcIiBcIiksYz10aGlzLnYucmVwbGFjZSgvKFteXFxyXFxuXFx0XSopXFx0L2csKGMsZCk9PmQrYi5zbGljZShkLmxlbmd0aCVhKSk7XG5yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJ0YWJzaXplXCJdLERlZmF1bHRzOls4XX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIHRhYnNpemU9OClcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIGV4cGFuZGVkIHVzaW5nIHNwYWNlcy5cXG5cXG5JZiB0YWJzaXplIGlzIG5vdCBnaXZlbiwgYSB0YWIgc2l6ZSBvZiA4IGNoYXJhY3RlcnMgaXMgYXNzdW1lZC5cIn0sZmluZDp7JG1ldGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRsZWZ0KGEsYixjKSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIFMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCxcXG5zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gU1tzdGFydDplbmRdLiAgT3B0aW9uYWxcXG5hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXFxuXFxuUmV0dXJuIC0xIG9uIGZhaWx1cmUuXCJ9LFxucGFydGl0aW9uOnskbWV0aDplKCExKSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHNlcCwgLylcIiwkZG9jOlwiUGFydGl0aW9uIHRoZSBzdHJpbmcgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3IgaW4gdGhlIHN0cmluZy4gIElmIHRoZSBzZXBhcmF0b3IgaXMgZm91bmQsXFxucmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxcbml0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBzdHJpbmdcXG5hbmQgdHdvIGVtcHR5IHN0cmluZ3MuXCJ9LGluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkbGVmdChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzdHJpbmcgbm90IGZvdW5kXCIpO1xucmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBTIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsIFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLlwifSxsanVzdDp7JG1ldGg6ZighMSwhMSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIGZpbGxjaGFyPScgJywgLylcIiwkZG9jOlwiUmV0dXJuIGEgbGVmdC1qdXN0aWZpZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sXG5sb3dlcjp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b0xvd2VyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIGxvd2VyY2FzZS5cIn0sbHN0cmlwOnskbWV0aDpiKC9eXFxzKy9nLGE9PlwiXltcIithK1wiXStcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuXFxuXFxuSWYgY2hhcnMgaXMgZ2l2ZW4gYW5kIG5vdCBOb25lLCByZW1vdmUgY2hhcmFjdGVycyBpbiBjaGFycyBpbnN0ZWFkLlwifSxyZmluZDp7JG1ldGgoYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRyaWdodChhLGIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LFxuJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0scmluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkcmlnaHQoYSxiLGMpO2lmKC0xPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwic3Vic3RyaW5nIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLlwifSxcbnJqdXN0OnskbWV0aDpmKCEwLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCB3aWR0aCwgZmlsbGNoYXI9JyAnLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSByaWdodC1qdXN0aWZpZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0scnN0cmlwOnskbWV0aDpiKC9cXHMrJC9nLGE9PlwiW1wiK2ErXCJdKyRcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZSByZW1vdmVkLlxcblxcbklmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC5cIn0scnBhcnRpdGlvbjp7JG1ldGg6ZSghMCksJGZsYWdzOntPbmVBcmc6ITB9LFxuJHRleHRzaWc6XCIoJHNlbGYsIHNlcCwgLylcIiwkZG9jOlwiUGFydGl0aW9uIHRoZSBzdHJpbmcgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3IgaW4gdGhlIHN0cmluZywgc3RhcnRpbmcgYXQgdGhlIGVuZC4gSWZcXG50aGUgc2VwYXJhdG9yIGlzIGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGVcXG5zZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuXFxuXFxuSWYgdGhlIHNlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3NcXG5hbmQgdGhlIG9yaWdpbmFsIHN0cmluZy5cIn0sc3BsaXRsaW5lczp7JG1ldGg6ZnVuY3Rpb24oYSl7YT1Tay5taXNjZXZhbC5pc1RydWUoYSk7Y29uc3QgYj10aGlzLnYsYz1bXSxkPWIubGVuZ3RoO3ZhciBlPVxuMDtmb3IobGV0IGc9MDtnPGQ7ZysrKXt2YXIgZj1iLmNoYXJBdChnKTtpZihcIlxcblwiPT09Yi5jaGFyQXQoZysxKSYmXCJcXHJcIj09PWYpZj1nKzIsZT1iLnNsaWNlKGUsZiksYXx8KGU9ZS5yZXBsYWNlKC8oXFxyfFxcbikvZyxcIlwiKSksYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlKSksZT1mO2Vsc2UgaWYoXCJcXG5cIj09PWYmJlwiXFxyXCIhPT1iLmNoYXJBdChnLTEpfHxcIlxcclwiPT09ZilmPWcrMSxlPWIuc2xpY2UoZSxmKSxhfHwoZT1lLnJlcGxhY2UoLyhcXHJ8XFxuKS9nLFwiXCIpKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGUpKSxlPWZ9ZTxkJiYoZT1iLnNsaWNlKGUsZCksYXx8KGU9ZS5yZXBsYWNlKC8oXFxyfFxcbikvZyxcIlwiKSksYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlKSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJrZWVwZW5kc1wiXSxEZWZhdWx0czpbITFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywga2VlcGVuZHM9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBzdHJpbmcsIGJyZWFraW5nIGF0IGxpbmUgYm91bmRhcmllcy5cXG5cXG5MaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHMgaXMgZ2l2ZW4gYW5kXFxudHJ1ZS5cIn0sXG5zdHJpcDp7JG1ldGg6YigvXlxccyt8XFxzKyQvZyxhPT5cIl5bXCIrYStcIl0rfFtcIithK1wiXSskXCIpLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGNoYXJzPU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVtb3ZlLlxcblxcbklmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC5cIn0sc3dhcGNhc2U6eyRtZXRoKCl7Y29uc3QgYT10aGlzLnYucmVwbGFjZSgvW2Etel0vZ2ksYT0+e2NvbnN0IGI9YS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09YT9hLnRvVXBwZXJDYXNlKCk6Yn0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiQ29udmVydCB1cHBlcmNhc2UgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIHRvIHVwcGVyY2FzZS5cIn0sXG51cHBlcjp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b1VwcGVyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIHVwcGVyY2FzZS5cIn0sc3RhcnRzd2l0aDp7JG1ldGg6ZChcInN0YXJ0c3dpdGhcIiwoYSxiKT0+MD09PWEuaW5kZXhPZihiKSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIFMgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cXG5XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IFMgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXFxuV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi5cXG5wcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdHJpbmdzIHRvIHRyeS5cIn0sXG5lbmRzd2l0aDp7JG1ldGg6ZChcImVuZHN3aXRoXCIsKGEsYik9Pi0xIT09YS5pbmRleE9mKGIsYS5sZW5ndGgtYi5sZW5ndGgpKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlMuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIFMgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXFxuV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBTIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxcbldpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBTIGF0IHRoYXQgcG9zaXRpb24uXFxuc3VmZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2Ygc3RyaW5ncyB0byB0cnkuXCJ9LGlzYXNjaWk6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15bXFx4MDAtXFx4N0ZdKiQvLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIixcbiRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBBU0NJSSwgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkFTQ0lJIGNoYXJhY3RlcnMgaGF2ZSBjb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UgVSswMDAwLVUrMDA3Ri5cXG5FbXB0eSBzdHJpbmcgaXMgQVNDSUkgdG9vLlwifSxpc2xvd2VyOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJi9bYS16XS8udGVzdCh0aGlzLnYpJiYhL1tBLVpdLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBsb3dlcmNhc2Ugc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgbG93ZXJjYXNlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZSBhbmRcXG50aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LFxuaXN1cHBlcjp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1thLXpdLy50ZXN0KHRoaXMudikmJi9bQS1aXS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGFuIHVwcGVyY2FzZSBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyB1cHBlcmNhc2UgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgdXBwZXJjYXNlIGFuZFxcbnRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0saXN0aXRsZTp7JG1ldGg6ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMudjtsZXQgYj0hMSxjPSExLGQ7Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aDtlKyspaWYoZD1hLmNoYXJBdChlKSwhL1thLXpdLy50ZXN0KGQpJiYvW0EtWl0vLnRlc3QoZCkpe2lmKGMpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7XG5iPWM9ITB9ZWxzZSBpZigvW2Etel0vLnRlc3QoZCkmJiEvW0EtWl0vLnRlc3QoZCkpe2lmKCFjKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2I9ITB9ZWxzZSBjPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZS1jYXNlZCBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5JbiBhIHRpdGxlLWNhc2VkIHN0cmluZywgdXBwZXItIGFuZCB0aXRsZS1jYXNlIGNoYXJhY3RlcnMgbWF5IG9ubHlcXG5mb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuXCJ9LGlzc3BhY2U6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15cXHMrJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB3aGl0ZXNwYWNlIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkEgc3RyaW5nIGlzIHdoaXRlc3BhY2UgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgd2hpdGVzcGFjZSBhbmQgdGhlcmVcXG5pcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LGlzZGlnaXQ6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15cXGQrJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgZGlnaXQgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgYSBkaWdpdCBzdHJpbmcgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGlnaXRzIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXG5pc251bWVyaWM6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wodGhpcy52Lmxlbmd0aCYmIS9bXjAtOV0vLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIG51bWVyaWMgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgbnVtZXJpYyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBudW1lcmljIGFuZCB0aGVyZSBpcyBhdFxcbmxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0saXNhbHBoYTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1teYS16QS1aXS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGFuIGFscGhhYmV0aWMgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgYWxwaGFiZXRpYyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXG5pc2FsbnVtOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJiEvW15hLXpBLVowLTldLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYW4gYWxwaGEtbnVtZXJpYyBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBhbHBoYS1udW1lcmljIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhLW51bWVyaWMgYW5kXFxudGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSx6ZmlsbDp7JG1ldGg6ZnVuY3Rpb24oYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2xldCBiPVwiXCI7YS09dGhpcy52Lmxlbmd0aDtjb25zdCBjPVwiK1wiPT09dGhpcy52WzBdfHxcIi1cIj09PXRoaXMudlswXT8xOjA7XG5mb3IobGV0IGM9MDtjPGE7YysrKWIrPVwiMFwiO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cigwLGMpK2IrdGhpcy52LnN1YnN0cihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIC8pXCIsJGRvYzpcIlBhZCBhIG51bWVyaWMgc3RyaW5nIHdpdGggemVyb3Mgb24gdGhlIGxlZnQsIHRvIGZpbGwgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gd2lkdGguXFxuXFxuVGhlIHN0cmluZyBpcyBuZXZlciB0cnVuY2F0ZWQuXCJ9LGZvcm1hdDp7JG1ldGg6U2suZm9ybWF0dGluZy5mb3JtYXQsJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5mb3JtYXQoKmFyZ3MsICoqa3dhcmdzKSAtPiBzdHJcXG5cXG5SZXR1cm4gYSBmb3JtYXR0ZWQgdmVyc2lvbiBvZiBTLCB1c2luZyBzdWJzdGl0dXRpb25zIGZyb20gYXJncyBhbmQga3dhcmdzLlxcblRoZSBzdWJzdGl0dXRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGJyYWNlcyAoJ3snIGFuZCAnfScpLlwifSxcbl9fZm9ybWF0X186eyRtZXRoOlNrLmZvcm1hdHRpbmcuZm9ybWF0U3RyaW5nLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgZm9ybWF0X3NwZWMsIC8pXCIsJGRvYzpcIlJldHVybiBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgYXMgZGVzY3JpYmVkIGJ5IGZvcm1hdF9zcGVjLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOm51bGx9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uc3RyXCIsU2suYnVpbHRpbi5zdHIpO3ZhciBrPS9eW0EtWmEtejAtOV0rJC8scD0vKFsuKis/PXxcXFxcXFwvKClcXFtcXF1cXHtcXH1eJF0pL2csdT0vXltcXHNcXHhhMF0rLztTay5idWlsdGluLnN0ci4kcHkyZGVjb2RlPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKFNrLmJ1aWx0aW4uc3RyLHskbmFtZTpcImRlY29kZVwiLFxuJG1ldGgoYSxiKXtjb25zdCBjPW5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7cmV0dXJuIFNrLmJ1aWx0aW4uYnl0ZXMuJGRlY29kZS5jYWxsKGMsYSxiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wiZW5jb2RpbmdcIixcImVycm9yc1wiXX19KTt2YXIgQT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJzdHJfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDthLiRoYXNBc3RyYWxDb2RlUG9pbnRzKCk/KHRoaXMuJHNlcT1hLmNvZGVwb2ludHMsdGhpcy50cCRpdGVybmV4dD0oKT0+e2NvbnN0IGI9dGhpcy4kc2VxW3RoaXMuJGluZGV4XTtpZih2b2lkIDAhPT1iKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYS52LnN1YnN0cmluZyhiLHRoaXMuJHNlcVsrK3RoaXMuJGluZGV4XSkpfSk6KHRoaXMuJHNlcT1hLnYsdGhpcy50cCRpdGVybmV4dD0oKT0+e2NvbnN0IGE9dGhpcy4kc2VxW3RoaXMuJGluZGV4KytdO2lmKHZvaWQgMCE9PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX0pfSxcbml0ZXJuZXh0KCl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoKX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSksdD17YWJzdHJhY3Q6ITAsYXM6ITAsYm9vbGVhbjohMCxicmVhazohMCxieXRlOiEwLGNhc2U6ITAsY2F0Y2g6ITAsY2hhcjohMCxjbGFzczohMCxjb250aW51ZTohMCxjb25zdDohMCxkZWJ1Z2dlcjohMCxkZWZhdWx0OiEwLGRlbGV0ZTohMCxkbzohMCxkb3VibGU6ITAsZWxzZTohMCxlbnVtOiEwLGV4cG9ydDohMCxleHRlbmRzOiEwLGZhbHNlOiEwLGZpbmFsOiEwLGZpbmFsbHk6ITAsZmxvYXQ6ITAsZm9yOiEwLGZ1bmN0aW9uOiEwLGdvdG86ITAsaWY6ITAsaW1wbGVtZW50czohMCxpbXBvcnQ6ITAsaW46ITAsaW5zdGFuY2VvZjohMCxpbnQ6ITAsaW50ZXJmYWNlOiEwLGlzOiEwLGxvbmc6ITAsbmFtZXNwYWNlOiEwLFxubmF0aXZlOiEwLG5ldzohMCxudWxsOiEwLHBhY2thZ2U6ITAscHJpdmF0ZTohMCxwcm90ZWN0ZWQ6ITAscHVibGljOiEwLHJldHVybjohMCxzaG9ydDohMCxzdGF0aWM6ITAsc3VwZXI6ITAsc3dpdGNoOiEwLHN5bmNocm9uaXplZDohMCx0aGlzOiEwLHRocm93OiEwLHRocm93czohMCx0cmFuc2llbnQ6ITAsdHJ1ZTohMCx0cnk6ITAsdHlwZW9mOiEwLHVzZTohMCx2YXI6ITAsdm9pZDohMCx2b2xhdGlsZTohMCx3aGlsZTohMCx3aXRoOiEwLGNvbnN0cnVjdG9yOiEwLF9fZGVmaW5lR2V0dGVyX186ITAsX19kZWZpbmVTZXR0ZXJfXzohMCxhcHBseTohMCxhcmd1bWVudHM6ITAsY2FsbDohMCxjYWxsZXI6ITAsZXZhbDohMCxoYXNPd25Qcm9wZXJ0eTohMCxpc1Byb3RvdHlwZU9mOiEwLF9fbG9va3VwR2V0dGVyX186ITAsX19sb29rdXBTZXR0ZXJfXzohMCxfX25vU3VjaE1ldGhvZF9fOiEwLHByb3BlcnR5SXNFbnVtZXJhYmxlOiEwLHByb3RvdHlwZTohMCx0b1NvdXJjZTohMCx0b0xvY2FsZVN0cmluZzohMCxcbnRvU3RyaW5nOiEwLHVud2F0Y2g6ITAsdmFsdWVPZjohMCx3YXRjaDohMCxsZW5ndGg6ITAsbmFtZTohMH07U2suYnVpbHRpbi5zdHIucmVzZXJ2ZWRXb3Jkc189dH0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZ1bmM9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImZ1bmN0aW9uXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmZ1bmMsXCJidWlsdGluIGZ1bmMgc2hvdWxkIGJlIGNhbGxlZCBhcyBhIGNsYXNzIHdpdGggYG5ld2BcIik7dGhpcy5mdW5jX2NvZGU9YTt0aGlzLmZ1bmNfZ2xvYmFscz1jfHxudWxsO3RoaXMuJG5hbWU9YS5jb19uYW1lJiZhLmNvX25hbWUudnx8YS5uYW1lfHxcIjxuYXRpdmUgSlM+XCI7dGhpcy4kZD1Tay5idWlsdGluLmRpY3Q/bmV3IFNrLmJ1aWx0aW4uZGljdDp2b2lkIDA7dGhpcy4kZG9jPWEuJGRvYzt0aGlzLiRtb2R1bGU9U2suZ2xvYmFscyYmU2suZ2xvYmFscy5fX25hbWVfX3x8XG5Tay5idWlsdGluLm5vbmUubm9uZSQ7dGhpcy4kcXVhbG5hbWU9YS5jb19xdWFsbmFtZSYmYS5jb19xdWFsbmFtZS52fHx0aGlzLiRuYW1lO2lmKHZvaWQgMCE9PWUpZm9yKGxldCBhIGluIGUpYlthXT1lW2FdO3RoaXMuZnVuY19jbG9zdXJlPWI7dGhpcy4kbWVtb2lzZUZsYWdzKCk7dGhpcy5tZW1vaXNlZD1hLmNvX2Zhc3RjYWxsfHxudWxsO3RoaXMudHAkY2FsbD1hLmNvX2Zhc3RjYWxsP2EuYmluZCh0aGlzKTpTay5idWlsdGluLmZ1bmMucHJvdG90eXBlLnRwJGNhbGwuYmluZCh0aGlzKX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRlc2NyX2dldChhLGMpe3JldHVybiBudWxsPT09YT90aGlzOm5ldyBTay5idWlsdGluLm1ldGhvZCh0aGlzLGEpfSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8ZnVuY3Rpb24gXCIrdGhpcy4kcXVhbG5hbWUrXCI+XCIpfSx0cCRjYWxsKGEsYyl7dGhpcy5tZW1vaXNlZHx8KHRoaXMuJG1lbW9pc2VGbGFncygpLFxudGhpcy5tZW1vaXNlZD0hMCk7aWYodm9pZCAwPT09dGhpcy5jb19hcmdjb3VudCYmdm9pZCAwPT09dGhpcy5jb192YXJuYW1lcyYmIXRoaXMuY29fa3dhcmdzJiYhdGhpcy5mdW5jX2Nsb3N1cmUpe2lmKGMmJjAhPT1jLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzXCIpO3JldHVybiB0aGlzLmZ1bmNfY29kZS5hcHBseSh0aGlzLmZ1bmNfZ2xvYmFscyxhKX1hPXRoaXMuJHJlc29sdmVBcmdzKGEsYyk7dGhpcy5mdW5jX2Nsb3N1cmUmJmEucHVzaCh0aGlzLmZ1bmNfY2xvc3VyZSk7cmV0dXJuIHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGEpfX0sZ2V0c2V0czp7X19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJG5hbWUpfSwkc2V0KGEpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdFwiKTtcbnRoaXMuJG5hbWU9YS4kanNzdHIoKX19LF9fcXVhbG5hbWVfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kcXVhbG5hbWUpfSwkc2V0KGEpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fcXVhbG5hbWVfXyBtdXN0IGJlIHNldCB0byBhIHN0cmluZyBvYmplY3RcIik7dGhpcy4kcXVhbG5hbWU9YS4kanNzdHIoKX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdCxfX2RlZmF1bHRzX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy4kZGVmYXVsdHMpfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kZG9jKX19fSxwcm90bzp7JG1lbW9pc2VGbGFncygpe3RoaXMuY29fdmFybmFtZXM9dGhpcy5mdW5jX2NvZGUuY29fdmFybmFtZXM7dGhpcy5jb19hcmdjb3VudD10aGlzLmZ1bmNfY29kZS5jb19hcmdjb3VudDt2b2lkIDA9PT1cbnRoaXMuY29fYXJnY291bnQmJnRoaXMuY29fdmFybmFtZXMmJih0aGlzLmNvX2FyZ2NvdW50PXRoaXMuY29fYXJnY291bnQ9dGhpcy5jb192YXJuYW1lcy5sZW5ndGgpO3RoaXMuY29fa3dvbmx5YXJnY291bnQ9dGhpcy5mdW5jX2NvZGUuY29fa3dvbmx5YXJnY291bnR8fDA7dGhpcy5jb192YXJhcmdzPXRoaXMuZnVuY19jb2RlLmNvX3ZhcmFyZ3M7dGhpcy5jb19rd2FyZ3M9dGhpcy5mdW5jX2NvZGUuY29fa3dhcmdzO3RoaXMuJGRlZmF1bHRzPXRoaXMuZnVuY19jb2RlLiRkZWZhdWx0c3x8W107dGhpcy4ka3dkZWZzPXRoaXMuZnVuY19jb2RlLiRrd2RlZnN8fFtdfSwkcmVzb2x2ZUFyZ3M6ZnVuY3Rpb24oYSxjKXt2YXIgYj10aGlzLmNvX2FyZ2NvdW50O3ZvaWQgMD09PWImJihiPXRoaXMuY29fdmFybmFtZXM/dGhpcy5jb192YXJuYW1lcy5sZW5ndGg6YS5sZW5ndGgpO3ZhciBlPXRoaXMuY29fdmFybmFtZXN8fFtdLGY9dGhpcy5jb19rd29ubHlhcmdjb3VudHx8MDtsZXQgbD1iK1xuZjtpZighKDAhPT1mfHx0aGlzLmNvX2t3YXJnc3x8YyYmMCE9PWMubGVuZ3RofHx0aGlzLmNvX3ZhcmFyZ3MpKXtpZihhLmxlbmd0aD09YilyZXR1cm4gYTtpZigwPT09YS5sZW5ndGgmJnRoaXMuJGRlZmF1bHRzJiZ0aGlzLiRkZWZhdWx0cy5sZW5ndGg9PT1iKXtmb3IoZT0wO2UhPXRoaXMuJGRlZmF1bHRzLmxlbmd0aDtlKyspYVtlXT10aGlzLiRkZWZhdWx0c1tlXTtyZXR1cm4gYX19bGV0IGg7dGhpcy5jb19rd2FyZ3MmJihoPVtdKTt2YXIgZD1hLmxlbmd0aDtsZXQgZz1hLmxlbmd0aDw9Yj9hOmEuc2xpY2UoMCxiKTtpZih0aGlzLmNvX3ZhcmFyZ3MpYT1hLmxlbmd0aD5nLmxlbmd0aD9hLnNsaWNlKGcubGVuZ3RoKTpbXSxnW2xdPW5ldyBTay5idWlsdGluLnR1cGxlKGEpO2Vsc2UgaWYoZD5iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgdGFrZXMgXCIrYitcIiBwb3NpdGlvbmFsIGFyZ3VtZW50XCIrKDE9PWI/XCJcIjpcInNcIikrXCIgYnV0IFwiK2QrKDE9PVxuZD9cIiB3YXMgXCI6XCIgd2VyZSBcIikrXCIgZ2l2ZW5cIik7aWYoYyl7aWYodGhpcy5mdW5jX2NvZGUubm9fa3cpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50c1wiKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSs9Mil7ZD1jW2FdO3ZhciBuPWNbYSsxXSxrPWUuaW5kZXhPZihkKTtpZigwPD1rKXtpZih2b2lkIDAhPT1nW2tdKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3IgYXJndW1lbnQgJ1wiK2QrXCInXCIpO2dba109bn1lbHNlIGlmKGgpaC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihkKSxuKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnXCIrZCtcIidcIik7fX1jPXRoaXMuJGRlZmF1bHRzfHxbXTthPTA7ZD1bXTtuPSExO2ZvcihrPWItYy5sZW5ndGg7YTxcbms7YSsrKXZvaWQgMD09PWdbYV0mJihkLnB1c2goZVthXSksdm9pZCAwPT09ZVthXSYmKG49ITApKTtpZigwIT1kLmxlbmd0aCYmKHRoaXMuY29fYXJnY291bnR8fHRoaXMuY29fdmFybmFtZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgbWlzc2luZyBcIitkLmxlbmd0aCtcIiByZXF1aXJlZCBhcmd1bWVudFwiKygxPT1kLmxlbmd0aD9cIlwiOlwic1wiKSsobj9cIlwiOlwiOiBcIitkLmpvaW4oXCIsIFwiKSkpO2Zvcig7YTxiO2ErKyl2b2lkIDA9PT1nW2FdJiYoZ1thXT1jW2Eta10pO2lmKDA8Zil7Zj1bXTtjPXRoaXMuJGt3ZGVmcztmb3IoYT1iO2E8bDthKyspdm9pZCAwPT09Z1thXSYmKHZvaWQgMCE9PWNbYS1iXT9nW2FdPWNbYS1iXTpmLnB1c2goZVthXSkpO2lmKDAhPT1mLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIG1pc3NpbmcgXCIrZi5sZW5ndGgrXCIgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudFwiKygxPT1cbmYubGVuZ3RoP1wiXCI6XCJzXCIpK1wiOiBcIitmLmpvaW4oXCIsIFwiKSk7fWlmKHRoaXMuZnVuY19jbG9zdXJlJiZlKWZvcihiPWcubGVuZ3RoO2I8ZS5sZW5ndGg7YisrKWcucHVzaCh2b2lkIDApO2gmJmcudW5zaGlmdChoKTtyZXR1cm4gZ319fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5hc251bSQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWF8fG51bGw9PT1hfHxcIm51bWJlclwiPT09dHlwZW9mIGE/YTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfP1wibnVtYmVyXCI9PT10eXBlb2YgYS52P2EudjphLnYudG9TdHJpbmcoKTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/YS52OmE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bnVsbDphfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmFzbnVtJFwiLFNrLmJ1aWx0aW4uYXNudW0kKTtTay5idWlsdGluLmFzc2skPWZ1bmN0aW9uKGEpe3JldHVybiAwPT09YSUxP25ldyBTay5idWlsdGluLmludF8oYSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uYXNzayRcIixTay5idWlsdGluLmFzc2skKTtTay5idWlsdGluLmFzbnVtJG5vZmxvYXQ9ZnVuY3Rpb24oYSl7aWYodm9pZCAwPT09YXx8bnVsbD09PWEpcmV0dXJuIGE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWE9YS50b1N0cmluZygpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XylhPWEudi50b1N0cmluZygpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKWE9YS52LnRvU3RyaW5nKCk7ZWxzZXtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXJldHVybiBudWxsO3JldHVybn1pZigwPmEuaW5kZXhPZihcIi5cIikmJjA+YS5pbmRleE9mKFwiZVwiKSYmMD5hLmluZGV4T2YoXCJFXCIpKXJldHVybiBhO3ZhciBiPTA7aWYoMDw9YS5pbmRleE9mKFwiZVwiKSl7dmFyIGM9YS5zdWJzdHIoMCxhLmluZGV4T2YoXCJlXCIpKTtiPWEuc3Vic3RyKGEuaW5kZXhPZihcImVcIikrMSl9ZWxzZSAwPD1hLmluZGV4T2YoXCJFXCIpP1xuKGM9YS5zdWJzdHIoMCxhLmluZGV4T2YoXCJlXCIpKSxiPWEuc3Vic3RyKGEuaW5kZXhPZihcIkVcIikrMSkpOmM9YTtiPXBhcnNlSW50KGIsMTApO2E9Yy5pbmRleE9mKFwiLlwiKTtpZigwPmEpe2lmKDA8PWIpe2Zvcig7MDxiLS07KWMrPVwiMFwiO3JldHVybiBjfXJldHVybiBjLmxlbmd0aD4tYj9jLnN1YnN0cigwLGMubGVuZ3RoK2IpOjB9Yz0wPT09YT9jLnN1YnN0cigxKTphPGMubGVuZ3RoP2Muc3Vic3RyKDAsYSkrYy5zdWJzdHIoYSsxKTpjLnN1YnN0cigwLGEpO2ZvcihhKz1iO2E+Yy5sZW5ndGg7KWMrPVwiMFwiO3JldHVybiBjPTA+PWE/MDpjLnN1YnN0cigwLGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmFzbnVtJG5vZmxvYXRcIixTay5idWlsdGluLmFzbnVtJG5vZmxvYXQpO1NrLmJ1aWx0aW4ucm91bmQ9ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7aWYoIVNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kKXtpZighU2suYnVpbHRpbi5jaGVja051bWJlcihhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIGZsb2F0IGlzIHJlcXVpcmVkXCIpO1xuaWYoYS5yb3VuZCQpcmV0dXJuIGEucm91bmQkKGMpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJ19fZmxvYXRfXydcIik7fWlmKHZvaWQgMCE9PWMmJiFTay5idWlsdGluLmNoZWNrTm9uZShjKSYmIVNrLm1pc2NldmFsLmlzSW5kZXgoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4XCIpO2E9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRyb3VuZCk7aWYodm9pZCAwIT09YSlyZXR1cm4gdm9pZCAwIT09Yz9Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbY10pOlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtdKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIGZsb2F0IGlzIHJlcXVpcmVkXCIpO307U2suYnVpbHRpbi5sZW49XG5mdW5jdGlvbihhKXtpZihhLnNxJGxlbmd0aClhPWEuc3EkbGVuZ3RoKCEwKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9iamVjdCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgaGFzIG5vIGxlbigpXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpfTtTay5idWlsdGluLm1pbj1mdW5jdGlvbihhLGMpe2xldCBiO2NvbnN0IGU9YS5sZW5ndGg7aWYoIWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibWluIGV4cGVjdGVkIDEgYXJndW1lbnQsIGdvdCAwXCIpO2NvbnN0IFtoLGRdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwibWluXCIsW1wiZGVmYXVsdFwiLFwia2V5XCJdLFtdLGMsW251bGwsU2suYnVpbHRpbi5ub25lLm5vbmUkXSk7aWYoMTxlJiZudWxsIT09aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSBhIGRlZmF1bHQgZm9yIG1pbigpIHdpdGggbXVsdGlwbGUgcG9zaXRpb25hbCBhcmd1bWVudHNcIik7XG5iPTE9PWU/U2suYWJzdHIuaXRlcihhWzBdKTpTay5hYnN0ci5pdGVyKG5ldyBTay5idWlsdGluLnR1cGxlKGEpKTtpZighU2suYnVpbHRpbi5jaGVja05vbmUoZCkmJiFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2xldCBnO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLnRwJGl0ZXJuZXh0KCEwKSxhPT57Zz1hO2lmKHZvaWQgMCE9PWcpcmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpP1NrLm1pc2NldmFsLml0ZXJGb3IoYixhPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsZyxcIkx0XCIpJiYoZz1hKX0pOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtnXSksYT0+U2subWlzY2V2YWwuaXRlckZvcihiLGI9PlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFxuW2JdKSxjPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcIkx0XCIpJiYoZz1iLGE9Yyl9KSkpfSwoKT0+e2lmKHZvaWQgMD09PWcpe2lmKG51bGw9PT1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJtaW4oKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2VcIik7Zz1ofXJldHVybiBnfSl9O1NrLmJ1aWx0aW4ubWF4PWZ1bmN0aW9uKGEsYyl7bGV0IGI7Y29uc3QgZT1hLmxlbmd0aDtpZighZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtYXggZXhwZWN0ZWQgMSBhcmd1bWVudCwgZ290IDBcIik7Y29uc3QgW2gsZF09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJtaW5cIixbXCJkZWZhdWx0XCIsXCJrZXlcIl0sW10sYyxbbnVsbCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtpZigxPGUmJm51bGwhPT1oKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGEgZGVmYXVsdCBmb3IgbWF4KCkgd2l0aCBtdWx0aXBsZSBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKTtcbmI9MT09PWU/U2suYWJzdHIuaXRlcihhWzBdKTpTay5hYnN0ci5pdGVyKG5ldyBTay5idWlsdGluLnR1cGxlKGEpKTtpZighU2suYnVpbHRpbi5jaGVja05vbmUoZCkmJiFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2xldCBnO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLnRwJGl0ZXJuZXh0KCEwKSxhPT57Zz1hO2lmKHZvaWQgMCE9PWcpcmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpP1NrLm1pc2NldmFsLml0ZXJGb3IoYixhPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsZyxcIkd0XCIpJiYoZz1hKX0pOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtnXSksYT0+U2subWlzY2V2YWwuaXRlckZvcihiLGI9PlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFxuW2JdKSxjPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcIkd0XCIpJiYoZz1iLGE9Yyl9KSkpfSwoKT0+e2lmKHZvaWQgMD09PWcpe2lmKG51bGw9PT1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJtaW4oKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2VcIik7Zz1ofXJldHVybiBnfSl9O1NrLmJ1aWx0aW4ubWluLmNvX2Zhc3RjYWxsPVNrLmJ1aWx0aW4ubWF4LmNvX2Zhc3RjYWxsPTE7U2suYnVpbHRpbi5hbnk9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxmdW5jdGlvbihhKXtpZihTay5taXNjZXZhbC5pc1RydWUoYSkpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhTay5idWlsdGluLmJvb2wudHJ1ZSQpfSksYT0+YXx8U2suYnVpbHRpbi5ib29sLmZhbHNlJCl9O1NrLmJ1aWx0aW4uYWxsPWZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksXG5mdW5jdGlvbihhKXtpZighU2subWlzY2V2YWwuaXNUcnVlKGEpKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoU2suYnVpbHRpbi5ib29sLmZhbHNlJCl9KSxhPT5hfHxTay5idWlsdGluLmJvb2wudHJ1ZSQpfTtTay5idWlsdGluLnN1bT1mdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihkLGE9PntpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5pbnRfKWc9Zy5uYiRhZGQoYSk7ZWxzZXtpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGc9Zy5uYiRmbG9hdCgpLm5iJGFkZChhKSxuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJmbG9hdFwiKTtnPVNrLmFic3RyLm51bWJlckJpbk9wKGcsYSxcIkFkZFwiKTtyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKFwic2xvd1wiKX19KX1mdW5jdGlvbiBlKCl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoZCxhPT57aWYoYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uZmxvYXRffHxcbmEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmludF8pZz1nLm5iJGFkZChhKTtlbHNlIHJldHVybiBnPVNrLmFic3RyLm51bWJlckJpbk9wKGcsYSxcIkFkZFwiKSxuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJzbG93XCIpfSl9ZnVuY3Rpb24gaCgpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKGQsYT0+e2c9U2suYWJzdHIubnVtYmVyQmluT3AoZyxhLFwiQWRkXCIpfSl9Y29uc3QgZD1Tay5hYnN0ci5pdGVyKGEpO2lmKHZvaWQgMD09PWMpdmFyIGc9bmV3IFNrLmJ1aWx0aW4uaW50XygwKTtlbHNle2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3VtKCkgY2FuJ3Qgc3VtIHN0cmluZ3MgW3VzZSAnJy5qb2luKHNlcSkgaW5zdGVhZF1cIik7Zz1jfWE9dm9pZCAwPT09Y3x8Yy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50Xz9iKCk6Yy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uZmxvYXRfP1wiZmxvYXRcIjpcInNsb3dcIjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxcbmE9PlwiZmxvYXRcIj09PWE/ZSgpOmEsYT0+e2lmKFwic2xvd1wiPT09YSlyZXR1cm4gaCgpfSwoKT0+Zyl9O1NrLmJ1aWx0aW4uemlwPWZ1bmN0aW9uKCl7dmFyIGEsYztpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChbXSk7dmFyIGY9W107Zm9yKGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWlmKFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhcmd1bWVudHNbY10pKWYucHVzaChTay5hYnN0ci5pdGVyKGFyZ3VtZW50c1tjXSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXJndW1lbnQgXCIrYytcIiBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uXCIpO3ZhciBsPVtdO2ZvcihhPSExOyFhOyl7dmFyIGg9W107Zm9yKGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXt2YXIgZD1mW2NdLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwPT09ZCl7YT0hMDticmVha31oLnB1c2goZCl9YXx8bC5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKGgpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChsKX07XG5Tay5idWlsdGluLmFicz1mdW5jdGlvbihhKXtpZihhLm5iJGFicylyZXR1cm4gYS5uYiRhYnMoKTt0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgYWJzKCk6ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fTtTay5idWlsdGluLmZhYnM9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYWJzKGEpfTtTay5idWlsdGluLm9yZD1mdW5jdGlvbihhKXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtpZigxIT09YS52Lmxlbmd0aCYmMSE9PWEuc3EkbGVuZ3RoKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib3JkKCkgZXhwZWN0ZWQgYSBjaGFyYWN0ZXIsIGJ1dCBzdHJpbmcgb2YgbGVuZ3RoIFwiK2Eudi5sZW5ndGgrXCIgZm91bmRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYS52LmNvZGVQb2ludEF0KDApKX1pZihTay5idWlsdGluLmNoZWNrQnl0ZXMoYSkpe2lmKDEhPT1hLnNxJGxlbmd0aCgpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9yZCgpIGV4cGVjdGVkIGEgY2hhcmFjdGVyLCBidXQgc3RyaW5nIG9mIGxlbmd0aCBcIitcbmEudi5sZW5ndGgrXCIgZm91bmRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYS52WzBdKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvcmQoKSBleHBlY3RlZCBhIHN0cmluZyBvZiBsZW5ndGggMSwgYnV0IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGZvdW5kXCIpO307U2suYnVpbHRpbi5jaHI9ZnVuY3Rpb24oYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTthPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMyl7aWYoMD5hfHwxMTE0MTEyPD1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjaHIoKSBhcmcgbm90IGluIHJhbmdlKDB4MTEwMDAwKVwiKTt9ZWxzZSBpZigwPmF8fDI1Njw9YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY2hyKCkgYXJnIG5vdCBpbiByYW5nZSgyNTYpXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU3RyaW5nLmZyb21Db2RlUG9pbnQoYSkpfTtcblNrLmJ1aWx0aW4udW5pY2hyPWZ1bmN0aW9uKGEpe2lmKCFTay5idWlsdGluLmNoZWNrSW50KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcIik7YT1Tay5idWlsdGluLmFzbnVtJChhKTt0cnl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTdHJpbmcuZnJvbUNvZGVQb2ludChhKSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihlLm1lc3NhZ2UpO3Rocm93IGU7fX07U2suYnVpbHRpbi5pbnQyc3RyXz1mdW5jdGlvbihhLGMsZil7bGV0IGI7YS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8KGE9YS5uYiRpbmRleCgpKTtiPWEudjtsZXQgZT1iLnRvU3RyaW5nKGMpO2U9YS5uYiRpc25lZ2F0aXZlKCk/XCItXCIrZitlLnNsaWNlKDEpOmYrZTsyIT09YyYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMyYmXG4oYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nfHxKU0JJLl9faXNCaWdJbnQoYikpJiYoZSs9XCJMXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZSl9O1NrLmJ1aWx0aW4uaGV4PWZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImhleCgpIGFyZ3VtZW50IGNhbid0IGJlIGNvbnZlcnRlZCB0byBoZXhcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50MnN0cl8oYSwxNixcIjB4XCIpfTtTay5idWlsdGluLm9jdD1mdW5jdGlvbihhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvY3QoKSBhcmd1bWVudCBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaGV4XCIpO3JldHVybiBTay5fX2Z1dHVyZV9fLm9jdGFsX251bWJlcl9saXRlcmFsP1NrLmJ1aWx0aW4uaW50MnN0cl8oYSw4LFwiMG9cIik6U2suYnVpbHRpbi5pbnQyc3RyXyhhLDgsXCIwXCIpfTtTay5idWlsdGluLmJpbj1cbmZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGNhbid0IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4XCIpO3JldHVybiBTay5idWlsdGluLmludDJzdHJfKGEsMixcIjBiXCIpfTtTay5idWlsdGluLmRpcj1mdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKXJldHVybiBhPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kZGlyKSxTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYSxbXSksYT0+U2suYnVpbHRpbi5zb3J0ZWQoYSkpO3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJza3VscHQgZG9lcyBub3QgeWV0IHN1cHBvcnQgZGlyIHdpdGggbm8gYXJnc1wiKTt9O1NrLmJ1aWx0aW4ucmVwcj1mdW5jdGlvbihhKXtyZXR1cm4gYS4kcigpfTtTay5idWlsdGluLmFzY2lpPVxuZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEuJHIoKSxhPT57bGV0IGIsYztmb3IoYz0wO2M8YS52Lmxlbmd0aDtjKyspaWYoMTI3PD1hLnYuY2hhckNvZGVBdChjKSl7Yj1hLnYuc3Vic3RyKDAsYyk7YnJlYWt9aWYoIWIpcmV0dXJuIGE7Zm9yKDtjPGEudi5sZW5ndGg7YysrKXt2YXIgZT1hLnYuY2hhckF0KGMpLGQ9YS52LmNoYXJDb2RlQXQoYyk7MTI3PGQmJjI1NT49ZD8oZT1kLnRvU3RyaW5nKDE2KSwyPmUubGVuZ3RoJiYoZT1cIjBcIitlKSxiKz1cIlxcXFx4XCIrZSk6MTI3PGQmJjU1Mjk2PmR8fDU3MzQ0PD1kP2IrPVwiXFxcXHVcIisoXCIwMDBcIitkLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOjU1Mjk2PD1kPyhlPWEudi5jb2RlUG9pbnRBdChjKSxjKyssZT1lLnRvU3RyaW5nKDE2KSxkPVwiMDAwMDAwMFwiK2UudG9TdHJpbmcoMTYpLGI9NDxlLmxlbmd0aD9iKyhcIlxcXFxVXCIrZC5zbGljZSgtOCkpOmIrKFwiXFxcXHVcIitkLnNsaWNlKC00KSkpOmIrPWV9cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0pfTtcblNrLmJ1aWx0aW4ub3Blbj1mdW5jdGlvbihhLGMsZil7dm9pZCAwPT09YyYmKGM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiclwiKSk7aWYoL1xcKy8udGVzdChjLnYpKXRocm93XCJ0b2RvOyBoYXZlbid0IGltcGxlbWVudGVkIHJlYWQvd3JpdGUgbW9kZVwiO2lmKChcIndcIj09PWMudnx8XCJ3YlwiPT09Yy52fHxcImFcIj09PWMudnx8XCJhYlwiPT09Yy52KSYmIVNrLm5vbnJlYWRvcGVuKXRocm93XCJ0b2RvOyBoYXZlbid0IGltcGxlbWVudGVkIG5vbi1yZWFkIG9wZW5zXCI7cmV0dXJuIG5ldyBTay5idWlsdGluLmZpbGUoYSxjLGYpfTtTay5idWlsdGluLmlzaW5zdGFuY2U9ZnVuY3Rpb24oYSxjKXtpZighKFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhjKXx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzaW5zdGFuY2UoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3MsIHR5cGUsIG9yIHR1cGxlIG9mIGNsYXNzZXMgYW5kIHR5cGVzXCIpO3ZhciBiPWEub2IkdHlwZTtcbmlmKGI9PT1jKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7aWYoIShjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpe2lmKGIuJGlzU3ViVHlwZShjKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO2E9YS50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRjbGFzcyk7cmV0dXJuIGEhPWImJlNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSYmYS4kaXNTdWJUeXBlKGMpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfWZvcihiPTA7YjxjLnYubGVuZ3RoOysrYilpZihTay5taXNjZXZhbC5pc1RydWUoU2suYnVpbHRpbi5pc2luc3RhbmNlKGEsYy52W2JdKSkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJH07U2suYnVpbHRpbi5oYXNoPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmFic3RyLm9iamVjdEhhc2goYSkpfTtTay5idWlsdGluLmdldGF0dHI9ZnVuY3Rpb24oYSxcbmMsZil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmdcIik7Y29uc3QgYj1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+YS50cCRnZXRhdHRyKGMsITApLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKSl0aHJvdyBhO30pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGI9PntpZih2b2lkIDA9PT1iKXtpZih2b2lkIDAhPT1mKXJldHVybiBmO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEuc2skYXR0ckVycm9yKCkrXCIgaGFzIG5vIGF0dHJpYnV0ZSBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGMpKTt9cmV0dXJuIGJ9KX07U2suYnVpbHRpbi5zZXRhdHRyPWZ1bmN0aW9uKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZ1wiKTtcbnJldHVybiBTay5taXNjZXZhbC5jaGFpbihhLnRwJHNldGF0dHIoYyxmLCEwKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX07U2suYnVpbHRpbi5yYXdfaW5wdXQ9ZnVuY3Rpb24oYSl7dmFyIGI9YT9hOlwiXCI7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcInN5c1wiLCExLCEwKSxmdW5jdGlvbihhKXtyZXR1cm4gU2suaW5wdXRmdW5UYWtlc1Byb21wdD9Tay5idWlsdGluLmZpbGUuJHJlYWRsaW5lKGEuJGQuc3RkaW4sbnVsbCxiKTpTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEuJGQuc3Rkb3V0LndyaXRlLFthLiRkLnN0ZG91dCxuZXcgU2suYnVpbHRpbi5zdHIoYildKX0sZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEuJGQuc3RkaW4ucmVhZGxpbmUsW2EuJGQuc3RkaW5dKX0pfSl9O1NrLmJ1aWx0aW4uaW5wdXQ9XG5Tay5idWlsdGluLnJhd19pbnB1dDtTay5idWlsdGluLmpzZXZhbD1mdW5jdGlvbihhKXthPVNrLmdsb2JhbC5ldmFsKFNrLmZmaS5yZW1hcFRvSnMoYSkpO3JldHVybiBTay5mZmkucmVtYXBUb1B5KGEpfTtTay5idWlsdGluLmpzbWlsbGlzPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKFwianNtaWxsaXMgaXMgZGVwcmVjYXRlZFwiKTtyZXR1cm4obmV3IERhdGUpLnZhbHVlT2YoKX07U2suYnVpbHRpbi5ldmFsXz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJldmFsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLm1hcD1mdW5jdGlvbihhLGMpe3ZhciBiPVtdLGUsaDtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFwibWFwXCIsYXJndW1lbnRzLmxlbmd0aCwyKTtpZigyPGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBkPVtdO3ZhciBnPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpLnNsaWNlKDEpO2ZvcihoPVxuMDtoPGcubGVuZ3RoO2grKyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShnW2hdKSl7dmFyIG49cGFyc2VJbnQoaCwxMCkrMjt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhcmd1bWVudCBcIituK1wiIHRvIG1hcCgpIG11c3Qgc3VwcG9ydCBpdGVyYXRpb25cIik7fWdbaF09U2suYWJzdHIuaXRlcihnW2hdKX1mb3IoOzspe3ZhciBrPVtdO2ZvcihoPWU9MDtoPGcubGVuZ3RoO2grKyluPWdbaF0udHAkaXRlcm5leHQoKSx2b2lkIDA9PT1uPyhrLnB1c2goU2suYnVpbHRpbi5ub25lLm5vbmUkKSxlKyspOmsucHVzaChuKTtpZihlIT09Zy5sZW5ndGgpZC5wdXNoKGspO2Vsc2UgYnJlYWt9Yz1uZXcgU2suYnVpbHRpbi5saXN0KGQpfWlmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYyksXG5mdW5jdGlvbihjKXtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKWMgaW5zdGFuY2VvZiBBcnJheSYmKGM9bmV3IFNrLmJ1aWx0aW4udHVwbGUoYykpLGIucHVzaChjKTtlbHNlIHJldHVybiBjIGluc3RhbmNlb2YgQXJyYXl8fChjPVtjXSksU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsYyksZnVuY3Rpb24oYSl7Yi5wdXNoKGEpfSl9KSxmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSl9O1NrLmJ1aWx0aW4ucmVkdWNlPWZ1bmN0aW9uKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShjKStcIicgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZVwiKTtjPVNrLmFic3RyLml0ZXIoYyk7aWYodm9pZCAwPT09ZiYmKGY9Yy50cCRpdGVybmV4dCgpLHZvaWQgMD09PWYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInJlZHVjZSgpIG9mIGVtcHR5IHNlcXVlbmNlIHdpdGggbm8gaW5pdGlhbCB2YWx1ZVwiKTtcbnZhciBiPWY7Zm9yKGY9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWY7Zj1jLnRwJGl0ZXJuZXh0KCkpYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYixmXSk7cmV0dXJuIGJ9O1NrLmJ1aWx0aW4uc29ydGVkPWZ1bmN0aW9uKGEsYyxmLGwpe2E9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSwhMCk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsYT0+e2E9bmV3IFNrLmJ1aWx0aW4ubGlzdChhKTthLmxpc3Qkc29ydChjLGYsbCk7cmV0dXJuIGF9KX07U2suYnVpbHRpbi5maWx0ZXI9ZnVuY3Rpb24oYSxjKXt2YXIgYjtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFwiZmlsdGVyXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpO2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO3ZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuW119O1xudmFyIGg9ZnVuY3Rpb24oYSxiKXthLnB1c2goYik7cmV0dXJuIGF9O3ZhciBkPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEpfTtjLm9iJHR5cGU9PT1Tay5idWlsdGluLnN0cj8oZT1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJcIil9LGg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zcSRjb25jYXQoYil9LGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9KTpjLm9iJHR5cGU9PT1Tay5idWlsdGluLnR1cGxlJiYoZD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9KTt2YXIgZz1lKCk7dmFyIG49U2suYWJzdHIuaXRlcihjKTtmb3IoYj1uLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPW4udHAkaXRlcm5leHQoKSllPWE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bmV3IFNrLmJ1aWx0aW4uYm9vbChiKTpTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYl0pLFNrLm1pc2NldmFsLmlzVHJ1ZShlKSYmKGc9aChnLGIpKTtcbnJldHVybiBkKGcpfTtTay5idWlsdGluLmhhc2F0dHI9ZnVuY3Rpb24oYSxjKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJoYXNhdHRyKCk6IGF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nXCIpO2NvbnN0IGI9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PmEudHAkZ2V0YXR0cihjLCEwKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYixhPT52b2lkIDA9PT1hP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6U2suYnVpbHRpbi5ib29sLnRydWUkKX07U2suYnVpbHRpbi5wb3c9ZnVuY3Rpb24oYSxjLGYpe2lmKHZvaWQgMD09PWZ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpKXJldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLGMsXCJQb3dcIik7aWYoIShTay5idWlsdGluLmNoZWNrSW50KGEpJiZTay5idWlsdGluLmNoZWNrSW50KGMpJiZcblNrLmJ1aWx0aW4uY2hlY2tJbnQoZikpKXtpZihTay5idWlsdGluLmNoZWNrRmxvYXQoYSl8fFNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4KGEpKXJldHVybiBhLm5iJHBvd2VyKGMsZik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAqKiBvciBwb3coKTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJywgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJywgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiJ1wiKTt9cmV0dXJuIGEubmIkcG93ZXIoYyxmKX07U2suYnVpbHRpbi5xdWl0PWZ1bmN0aW9uKGEpe2E9KG5ldyBTay5idWlsdGluLnN0cihhKSkudjt0aHJvdyBuZXcgU2suYnVpbHRpbi5TeXN0ZW1FeGl0KGEpO307U2suYnVpbHRpbi5pc3N1YmNsYXNzPWZ1bmN0aW9uKGEsYyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpc3N1YmNsYXNzKCkgYXJnIDEgbXVzdCBiZSBhIGNsYXNzXCIpO1xudmFyIGI9U2suYnVpbHRpbi5jaGVja0NsYXNzKGMpO2lmKCEoYnx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzc3ViY2xhc3MoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3Mgb3IgdHVwbGUgb2YgY2xhc3Nlc1wiKTtpZihiKXJldHVybiBhLiRpc1N1YlR5cGUoYyk/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Zm9yKGI9MDtiPGMudi5sZW5ndGg7KytiKWlmKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzc3ViY2xhc3MoYSxjLnZbYl0pKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO3JldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkfTtTay5idWlsdGluLmdsb2JhbHM9ZnVuY3Rpb24oKXt2YXIgYSxjPW5ldyBTay5idWlsdGluLmRpY3QoW10pO2ZvcihhIGluIFNrLmdsb2JhbHMpe3ZhciBmPVNrLnVuZml4UmVzZXJ2ZWQoYSk7Yy5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihmKSxcblNrLmdsb2JhbHNbYV0pfXJldHVybiBjfTtTay5idWlsdGluLmRpdm1vZD1mdW5jdGlvbihhLGMpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLGMsXCJEaXZNb2RcIil9O1NrLmJ1aWx0aW4uZm9ybWF0PWZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5zdHIuJGVtcHR5c3RyKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0Rm9ybWF0KGEsYyl9O2NvbnN0IGE9bmV3IE1hcDtsZXQgYz0wO1NrLmJ1aWx0aW4uaWQ9ZnVuY3Rpb24oYil7Y29uc3QgZT1hLmdldChiKTtpZih2b2lkIDAhPT1lKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGUpO2Euc2V0KGIsYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYysrKX07U2suYnVpbHRpbi5ieXRlYXJyYXk9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiYnl0ZWFycmF5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmNhbGxhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYSk/XG5Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH07U2suYnVpbHRpbi5kZWxhdHRyPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIFNrLmJ1aWx0aW4uc2V0YXR0cihhLGMsdm9pZCAwKX07U2suYnVpbHRpbi5leGVjZmlsZT1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJleGVjZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5oZWxwPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImhlbHAgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uaXRlcj1mdW5jdGlvbihhLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Tay5hYnN0ci5pdGVyKGEpOlNrLmFic3RyLml0ZXIobmV3IFNrLmJ1aWx0aW4uY2FsbGFibGVfaXRlcl8oYSxjKSl9O1NrLmJ1aWx0aW4ubG9jYWxzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImxvY2FscyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtTay5idWlsdGluLm1lbW9yeXZpZXc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwibWVtb3J5dmlldyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5uZXh0Xz1mdW5jdGlvbihhLGMpe2lmKCFhLnRwJGl0ZXJuZXh0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGlzIG5vdCBhbiBpdGVyYXRvclwiKTthPWEudHAkaXRlcm5leHQoKTtpZih2b2lkIDA9PT1hKXtpZihjKXJldHVybiBjO3Rocm93IG5ldyBTay5idWlsdGluLlN0b3BJdGVyYXRpb247fXJldHVybiBhfTtTay5idWlsdGluLnJlbG9hZD1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJyZWxvYWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4udmFycz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJ2YXJzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1NrLmJ1aWx0aW4uYXBwbHlfPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImFwcGx5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmJ1ZmZlcj1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJidWZmZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uY29lcmNlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImNvZXJjZSBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5pbnRlcm49ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiaW50ZXJuIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkJhc2VFeGNlcHRpb25cIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uLFwiYmFkIGNhbGwgdG8gZXhjZXB0aW9uIGNvbnN0cnVjdG9yLCB1c2UgJ25ldydcIik7bGV0IGM9YVswXTtcInN0cmluZ1wiPT09dHlwZW9mIGMmJihjPW5ldyBTay5idWlsdGluLnN0cihjKSk7dGhpcy5hcmdzPW5ldyBTay5idWlsdGluLnR1cGxlKGM/W2NdOltdKTt0aGlzLnRyYWNlYmFjaz1bXTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3Q7Mzw9YS5sZW5ndGgmJnRoaXMudHJhY2ViYWNrLnB1c2goe2xpbmVubzphWzJdLGZpbGVuYW1lOmFbMV18fFwiPHVua25vd24+XCJ9KX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRvYzpcIkNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9uc1wiLHRwJG5ldyhhLGMpe3RoaXMuaHAkdHlwZT8oYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcixTay5idWlsdGluLkJhc2VFeGNlcHRpb24uY2FsbChjKSk6XG5jPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2MuYXJncz1uZXcgU2suYnVpbHRpbi50dXBsZShhLnNsaWNlKCkpO3JldHVybiBjfSx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhTay5hYnN0ci50eXBlTmFtZSh0aGlzKSxjKX0sJHIoKXtsZXQgYT10aGlzLnRwJG5hbWU7YSs9XCIoXCIrdGhpcy5hcmdzLnYubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpLmpvaW4oXCIsIFwiKStcIilcIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSx0cCRzdHIoKXtyZXR1cm4gMT49dGhpcy5hcmdzLnYubGVuZ3RoP25ldyBTay5idWlsdGluLnN0cih0aGlzLmFyZ3MudlswXSk6dGhpcy5hcmdzLiRyKCl9fSxnZXRzZXRzOnthcmdzOnskZ2V0KCl7cmV0dXJuIHRoaXMuYXJnc319LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH0scHJvdG86e3RvU3RyaW5nKCl7bGV0IGE9dGhpcy50cCRuYW1lO2ErPVwiOiBcIit0aGlzLnRwJHN0cigpLnY7cmV0dXJuIGE9MCE9PXRoaXMudHJhY2ViYWNrLmxlbmd0aD9cbmErKFwiIG9uIGxpbmUgXCIrdGhpcy50cmFjZWJhY2tbMF0ubGluZW5vKTphK1wiIGF0IDx1bmtub3duPlwifX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkJhc2VFeGNlcHRpb25cIixTay5idWlsdGluLkJhc2VFeGNlcHRpb24pO1NrLmJ1aWx0aW4uRXhjZXB0aW9uPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJFeGNlcHRpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5CYXNlRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5FeGNlcHRpb25cIixTay5idWlsdGluLkV4Y2VwdGlvbik7U2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiQXNzZXJ0aW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvclwiLFNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3IpO1NrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkF0dHJpYnV0ZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLkltcG9ydEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJbXBvcnRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5JbmRlbnRhdGlvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJbmRlbnRhdGlvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsXG5hKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uSW5kZXhFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiSW5kZXhFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5Mb29rdXBFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTG9va3VwRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uS2V5RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIktleUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uTG9va3VwRXJyb3IuYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkxvb2t1cEVycm9yfSk7U2suYnVpbHRpbi5OYW1lRXJyb3I9XG5Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTmFtZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlVuYm91bmRMb2NhbEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJVbmJvdW5kTG9jYWxFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJPdmVyZmxvd0Vycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlN5bnRheEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJTeW50YXhFcnJvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlJ1bnRpbWVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiUnVudGltZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlJ1bnRpbWVFcnJvclwiLFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKTtTay5idWlsdGluLlN1c3BlbnNpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3VzcGVuc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN1c3BlbnNpb25FcnJvclwiLFxuU2suYnVpbHRpbi5TdXNwZW5zaW9uRXJyb3IpO1NrLmJ1aWx0aW4uU3lzdGVtRXhpdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3lzdGVtRXhpdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkJhc2VFeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN5c3RlbUV4aXRcIixTay5idWlsdGluLlN5c3RlbUV4aXQpO1NrLmJ1aWx0aW4uVHlwZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJUeXBlRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uVHlwZUVycm9yXCIsU2suYnVpbHRpbi5UeXBlRXJyb3IpO1NrLmJ1aWx0aW4uVmFsdWVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVmFsdWVFcnJvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlZhbHVlRXJyb3JcIixTay5idWlsdGluLlZhbHVlRXJyb3IpO1NrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlplcm9EaXZpc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlRpbWVMaW1pdEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJUaW1lTGltaXRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5UaW1lTGltaXRFcnJvclwiLFxuU2suYnVpbHRpbi5UaW1lTGltaXRFcnJvcik7U2suYnVpbHRpbi5JT0Vycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJT0Vycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLklPRXJyb3JcIixTay5idWlsdGluLklPRXJyb3IpO1NrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm90SW1wbGVtZW50ZWRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yXCIsU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKTtTay5idWlsdGluLk5lZ2F0aXZlUG93ZXJFcnJvcj1cblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOZWdhdGl2ZVBvd2VyRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uTmVnYXRpdmVQb3dlckVycm9yXCIsU2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3IpO1NrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiRXh0ZXJuYWxFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXt0aGlzLm5hdGl2ZUVycm9yPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcodGhpcy5uYXRpdmVFcnJvcikmJihhWzBdPXRoaXMubmF0aXZlRXJyb3IudG9TdHJpbmcoKSxhWzBdLnN0YXJ0c1dpdGgoXCJSYW5nZUVycm9yOiBNYXhpbXVtIGNhbGxcIikpKXJldHVybiBhWzBdPVwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIixcbm5ldyBTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yKC4uLmEpO1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkV4dGVybmFsRXJyb3JcIixTay5idWlsdGluLkV4dGVybmFsRXJyb3IpO1NrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlJlY3Vyc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uUnVudGltZUVycm9yLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yXCIsU2suYnVpbHRpbi5SZWN1cnNpb25FcnJvcik7U2suYnVpbHRpbi5PcGVyYXRpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiT3BlcmF0aW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxcbmEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5PcGVyYXRpb25FcnJvclwiLFNrLmJ1aWx0aW4uT3BlcmF0aW9uRXJyb3IpO1NrLmJ1aWx0aW4uU3lzdGVtRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN5c3RlbUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN5c3RlbUVycm9yXCIsU2suYnVpbHRpbi5TeXN0ZW1FcnJvcik7U2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlVuaWNvZGVEZWNvZGVFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3JcIixcblNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKTtTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVW5pY29kZUVuY29kZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvclwiLFNrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yKTtTay5idWlsdGluLlN0b3BJdGVyYXRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN0b3BJdGVyYXRpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvblwiLFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbik7XG5Tay5idWlsdGluLmdldEV4Y0luZm89ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFthLm9iJHR5cGV8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxhLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pfX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLm1ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwibWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kLFwiYmFkIGNhbGwgdG8gbWV0aG9kIGNvbnN0cnVjdG9yLCB1c2UgJ25ldydcIik7dGhpcy5pbV9mdW5jPWE7dGhpcy5pbV9zZWxmPWM7dGhpcy5pbV9jYWxsPWEudHAkY2FsbH0sc2xvdHM6eyRyKCl7bGV0IGE9dGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJHF1YWxuYW1lKXx8dGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJG5hbWUpO2E9YSYmYS52fHxcIj9cIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGJvdW5kIG1ldGhvZCBcIitcbmErXCIgb2YgXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLmltX3NlbGYpK1wiPlwiKX0sdHAkaGFzaCgpe2NvbnN0IGE9U2suYWJzdHIub2JqZWN0SGFzaCh0aGlzLmltX3NlbGYpLGM9U2suYWJzdHIub2JqZWN0SGFzaCh0aGlzLmltX2Z1bmMpO3JldHVybiBhK2N9LHRwJGNhbGwoYSxjKXt2YXIgYj10aGlzLmltX2NhbGw7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy5pbV9mdW5jKStcIicgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZVwiKTthPVt0aGlzLmltX3NlbGYsLi4uYV07cmV0dXJuIGIuY2FsbCh0aGlzLmltX2Z1bmMsYSxjKX0sdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcIm1ldGhvZFwiLGEsMiwyKTtjPWFbMF07YT1hWzFdO2lmKCFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZVwiKTtcbmlmKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlbGYgbXVzdCBub3QgYmUgTm9uZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubWV0aG9kKGMsYSl9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoXCJFcVwiIT1jJiZcIk5vdEVxXCIhPWN8fCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7bGV0IGI7dHJ5e2I9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuaW1fc2VsZixhLmltX3NlbGYsXCJFcVwiLCExKSYmdGhpcy5pbV9mdW5jPT1hLmltX2Z1bmN9Y2F0Y2goZSl7Yj0hMX1yZXR1cm5cIkVxXCI9PWM/YjohYn0sdHAkZGVzY3JfZ2V0KGEsYyl7cmV0dXJuIHRoaXN9LHRwJGdldGF0dHIoYSxjKXtjb25zdCBiPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwodGhpcyxhKTtyZXR1cm4gdm9pZCAwIT09Yj9iOnRoaXMuaW1fZnVuYy50cCRnZXRhdHRyKGEsXG5jKX19LGdldHNldHM6e19fZnVuY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuaW1fZnVuY319LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuaW1fc2VsZn19LF9fZG9jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGRvYyl9fX0sZmxhZ3M6e3NrJHN1aXRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhKXtpZihudWxsIT09YSYmdm9pZCAwIT09YSl7aWYoYS5uYiRpbmRleClyZXR1cm4gYS5uYiRpbmRleCgpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSYmTnVtYmVyLmlzSW50ZWdlcihhKSlyZXR1cm4gYX19ZnVuY3Rpb24gYyhiLGMpe2NvbnN0IGU9YShiKTtpZih2b2lkIDAhPT1lKXJldHVybiBlO2M9KGN8fFwiJ3t0cCRuYW1lfScgb2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyXCIpLnJlcGxhY2UoXCJ7dHAkbmFtZX1cIixTay5hYnN0ci50eXBlTmFtZShiKSk7XG50aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYyk7fVNrLm1pc2NldmFsPXt9O1NrLm1pc2NldmFsLlN1c3BlbnNpb249ZnVuY3Rpb24oYSxjLGYpe3RoaXMuJGlzU3VzcGVuc2lvbj0hMDt2b2lkIDAhPT1hJiZ2b2lkIDAhPT1jJiYodGhpcy5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYShjLnJlc3VtZSgpKX0pO3RoaXMuY2hpbGQ9Yzt0aGlzLm9wdGlvbmFsPXZvaWQgMCE9PWMmJmMub3B0aW9uYWw7dGhpcy5kYXRhPXZvaWQgMD09PWYmJnZvaWQgMCE9PWM/Yy5kYXRhOmZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLlN1c3BlbnNpb25cIixTay5taXNjZXZhbC5TdXNwZW5zaW9uKTtTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3c9ZnVuY3Rpb24oYSxjKXtmb3IoO2EgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uOyl7aWYoIWEub3B0aW9uYWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yKGN8fFwiQ2Fubm90IGNhbGwgYSBmdW5jdGlvbiB0aGF0IGJsb2NrcyBvciBzdXNwZW5kcyBoZXJlXCIpO1xuYT1hLnJlc3VtZSgpfXJldHVybiBhfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3dcIixTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3cpO1NrLm1pc2NldmFsLmlzSW5kZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hJiYodm9pZCAwIT09YS5uYiRpbmRleHx8XCJudW1iZXJcIj09PXR5cGVvZiBhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuaXNJbmRleFwiLFNrLm1pc2NldmFsLmlzSW5kZXgpO1NrLm1pc2NldmFsLmFzSW5kZXg9YTtTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQ9ZnVuY3Rpb24oYSxlLGYpe2Y9YyhhLGYpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZilyZXR1cm4gZjtpZihudWxsPT1lKXJldHVybiBKU0JJLmxlc3NUaGFuKGYsSlNCSS5fX1pFUk8pPy1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUjpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbnRocm93IG5ldyBlKFwiY2Fubm90IGZpdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIGludG8gYW4gaW5kZXgtc2l6ZWQgaW50ZWdlclwiKTt9O1NrLm1pc2NldmFsLmFzSW5kZXhPclRocm93PWM7U2subWlzY2V2YWwuYXBwbHlTbGljZT1mdW5jdGlvbihhLGMsZixsKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGMsZixudWxsKSxsKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlTbGljZVwiLFNrLm1pc2NldmFsLmFwcGx5U2xpY2UpO1NrLm1pc2NldmFsLmFzc2lnblNsaWNlPWZ1bmN0aW9uKGEsYyxmLGwsaCl7Yz1uZXcgU2suYnVpbHRpbi5zbGljZShjLGYpO3JldHVybiBudWxsPT09bD9Tay5hYnN0ci5vYmplY3REZWxJdGVtKGEsYyk6U2suYWJzdHIub2JqZWN0U2V0SXRlbShhLGMsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXNzaWduU2xpY2VcIixTay5taXNjZXZhbC5hc3NpZ25TbGljZSk7XG5Tay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHM9ZnVuY3Rpb24oYSl7dmFyIGI7aWYoMSE9YS5sZW5ndGgpcmV0dXJuIGE7dmFyIGM9YVswXTtjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zZXQ/Yz1jLnRwJGl0ZXIoKS4kb2JqOmMgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QmJihjPVNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUua2V5cy5mdW5jX2NvZGUoYykpO2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3R8fGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKXJldHVybiBjLnY7aWYoU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXthPVtdO2M9U2suYWJzdHIuaXRlcihjKTtmb3IoYj1jLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWMudHAkaXRlcm5leHQoKSlhLnB1c2goYik7cmV0dXJuIGF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXJyYXlGcm9tQXJndW1lbnRzXCIsXG5Tay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHMpO1NrLm1pc2NldmFsLml0ZXJhdG9yPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIml0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy50cCRpdGVybmV4dD1jP2E6ZnVuY3Rpb24oYil7bGV0IGM9YSgpO3JldHVybiBifHwhYy4kaXNTdXNwZW5zaW9uP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfX0saXRlcm5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoYSl9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2subWlzY2V2YWwuc3dhcHBlZE9wXz17RXE6XCJFcVwiLE5vdEVxOlwiTm90RXFcIixMdDpcIkd0XCIsTHRFOlwiR3RFXCIsR3Q6XCJMdFwiLEd0RTpcIkx0RVwifTtTay5taXNjZXZhbC5vcFN5bWJvbHM9e0VxOlwiPT1cIixOb3RFcTpcIiE9XCIsTHQ6XCI8XCIsTHRFOlwiPD1cIixHdDpcIj5cIixHdEU6XCI+PVwiLElzOlwiaXNcIixJc05vdDpcImlzIG5vdFwiLFxuSW5fOlwiaW5cIixOb3RJbjpcIm5vdCBpblwifTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2w9ZnVuY3Rpb24oYSxjLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQoYS5zayRvYmplY3QmJmMuc2skb2JqZWN0LFwiSlMgb2JqZWN0IHBhc3NlZCB0byByaWNoQ29tcGFyZUJvb2xcIik7dmFyIGI7dmFyIGQ9YS5vYiR0eXBlO3ZhciBlPWMub2IkdHlwZSxuPWUhPT1kJiZ2b2lkIDA9PT1lLnNrJGJhc2VDbGFzcyYmZS4kaXNTdWJUeXBlKGQpO2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJmQhPT1lJiYoXCJHdEVcIj09PWZ8fFwiR3RcIj09PWZ8fFwiTHRFXCI9PT1mfHxcIkx0XCI9PT1mKSl7dmFyIGs9W1NrLmJ1aWx0aW4uZmxvYXRfLFNrLmJ1aWx0aW4uaW50XyxTay5idWlsdGluLmxuZyxTay5idWlsdGluLmJvb2xdLHA9W1NrLmJ1aWx0aW4uZGljdCxTay5idWlsdGluLmVudW1lcmF0ZSxTay5idWlsdGluLmZpbHRlcl8sU2suYnVpbHRpbi5saXN0LFNrLmJ1aWx0aW4ubWFwXyxTay5idWlsdGluLnN0cixTay5idWlsdGluLnR1cGxlLFxuU2suYnVpbHRpbi56aXBfXTtjb25zdCBiPWsuaW5kZXhPZihkKSxnPXAuaW5kZXhPZihkKTtrPWsuaW5kZXhPZihlKTtwPXAuaW5kZXhPZihlKTtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXN3aXRjaChmKXtjYXNlIFwiTHRcIjpyZXR1cm4hMDtjYXNlIFwiTHRFXCI6cmV0dXJuITA7Y2FzZSBcIkd0XCI6cmV0dXJuITE7Y2FzZSBcIkd0RVwiOnJldHVybiExfWlmKGM9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiExO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMTtjYXNlIFwiR3RcIjpyZXR1cm4hMDtjYXNlIFwiR3RFXCI6cmV0dXJuITB9aWYoLTEhPT1iJiYtMSE9PXApc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiEwO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMDtjYXNlIFwiR3RcIjpyZXR1cm4hMTtjYXNlIFwiR3RFXCI6cmV0dXJuITF9aWYoLTEhPT1nJiYtMSE9PWspc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiExO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMTtjYXNlIFwiR3RcIjpyZXR1cm4hMDtcbmNhc2UgXCJHdEVcIjpyZXR1cm4hMH1pZigtMSE9PWcmJi0xIT09cClzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuIGc8cDtjYXNlIFwiTHRFXCI6cmV0dXJuIGc8PXA7Y2FzZSBcIkd0XCI6cmV0dXJuIGc+cDtjYXNlIFwiR3RFXCI6cmV0dXJuIGc+PXB9fWlmKFwiSXNcIj09PWYpe2lmKGQ9PT1lKXtpZihhPT09YylyZXR1cm4hMDtpZihkPT09U2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGEudj09PWMudjtpZihkPT09U2suYnVpbHRpbi5pbnRfKXJldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYS52JiZcIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnY9PT1jLnY6SlNCSS5lcXVhbChKU0JJLkJpZ0ludChhLnYpLEpTQkkuQmlnSW50KGMudikpfXJldHVybiExfWlmKFwiSXNOb3RcIj09PWYpcmV0dXJuIGQhPT1lPyEwOmQ9PT1Tay5idWlsdGluLmZsb2F0Xz9hLnYhPT1jLnY6ZD09PVNrLmJ1aWx0aW4uaW50Xz9cIm51bWJlclwiPT09dHlwZW9mIGEudiYmXCJudW1iZXJcIj09PXR5cGVvZiBhLnY/YS52IT09Yy52OkpTQkkubm90RXF1YWwoSlNCSS5CaWdJbnQoYS52KSxcbkpTQkkuQmlnSW50KGMudikpOmEhPT1jO2lmKFwiSW5cIj09PWYpcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLnNlcXVlbmNlQ29udGFpbnMoYyxhLGwpLFNrLm1pc2NldmFsLmlzVHJ1ZSk7aWYoXCJOb3RJblwiPT09ZilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEsbCksZnVuY3Rpb24oYSl7cmV0dXJuIVNrLm1pc2NldmFsLmlzVHJ1ZShhKX0pO2U9e0VxOlwib2IkZXFcIixOb3RFcTpcIm9iJG5lXCIsR3Q6XCJvYiRndFwiLEd0RTpcIm9iJGdlXCIsTHQ6XCJvYiRsdFwiLEx0RTpcIm9iJGxlXCJ9O2Q9ZVtmXTtpZihuJiYobD1lW1NrLm1pc2NldmFsLnN3YXBwZWRPcF9bZl1dLGNbbF0hPT1hW2xdJiYoYj1jW2xdKGEpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXx8KGI9YVtkXShjKSkhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJHx8IW4mJihsPWVbU2subWlzY2V2YWwuc3dhcHBlZE9wX1tmXV0sXG4oYj1jW2xdKGEpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSlyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGIpO2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2lmKG49U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRjbXApKXRyeXtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShuLFtjXSk7aWYoU2suYnVpbHRpbi5jaGVja051bWJlcihiKSl7Yj1Tay5idWlsdGluLmFzbnVtJChiKTtpZihcIkVxXCI9PT1mKXJldHVybiAwPT09YjtpZihcIk5vdEVxXCI9PT1mKXJldHVybiAwIT09YjtpZihcIkx0XCI9PT1mKXJldHVybiAwPmI7aWYoXCJHdFwiPT09ZilyZXR1cm4gMDxiO2lmKFwiTHRFXCI9PT1mKXJldHVybiAwPj1iO2lmKFwiR3RFXCI9PT1mKXJldHVybiAwPD1ifWlmKGIhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTtcbn1jYXRjaCh1KXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTt9aWYobj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGMsU2suYnVpbHRpbi5zdHIuJGNtcCkpdHJ5e2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG4sW2FdKTtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO2lmKFwiRXFcIj09PWYpcmV0dXJuIDA9PT1iO2lmKFwiTm90RXFcIj09PWYpcmV0dXJuIDAhPT1iO2lmKFwiTHRcIj09PWYpcmV0dXJuIDA8YjtpZihcIkd0XCI9PT1mKXJldHVybiAwPmI7aWYoXCJMdEVcIj09PWYpcmV0dXJuIDA8PWI7aWYoXCJHdEVcIj09PWYpcmV0dXJuIDA+PWJ9aWYoYiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50XCIpO31jYXRjaCh1KXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTtcbn1pZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiZjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXtpZihcIkVxXCI9PT1mKXJldHVybiBhLnY9PT1jLnY7aWYoXCJOb3RFcVwiPT09ZilyZXR1cm4gYS52IT09Yy52O2lmKFwiR3RcIj09PWYpcmV0dXJuIGEudj5jLnY7aWYoXCJHdEVcIj09PWYpcmV0dXJuIGEudj49Yy52O2lmKFwiTHRcIj09PWYpcmV0dXJuIGEudjxjLnY7aWYoXCJMdEVcIj09PWYpcmV0dXJuIGEudjw9Yy52fX1pZihcIkVxXCI9PT1mKXJldHVybiBhPT09YztpZihcIk5vdEVxXCI9PT1mKXJldHVybiBhIT09YzthPVNrLmFic3RyLnR5cGVOYW1lKGEpO2M9U2suYWJzdHIudHlwZU5hbWUoYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLm1pc2NldmFsLm9wU3ltYm9sc1tmXStcIicgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnXCIrYStcIicgYW5kICdcIitjK1wiJ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbFwiLFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCk7XG5Tay5taXNjZXZhbC5vYmplY3RSZXByPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJ0cnlpbmcgdG8gcmVwciB1bmRlZmluZWRcIik7aWYobnVsbCE9PWEmJmEuJHIpcmV0dXJuIGEuJHIoKS52O3RyeXtyZXR1cm4obmV3IFNrLmJ1aWx0aW4uc3RyKGEpKS52fWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBTay5idWlsdGluLlR5cGVFcnJvcilyZXR1cm5cIjx1bmtub3duPlwiO3Rocm93IGU7fX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwub2JqZWN0UmVwclwiLFNrLm1pc2NldmFsLm9iamVjdFJlcHIpO1NrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHk9ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgXCJMdEVcIjpjYXNlIFwiRXFcIjpjYXNlIFwiR3RFXCI6cmV0dXJuITB9cmV0dXJuITF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHlcIixTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5KTtTay5taXNjZXZhbC5pc1RydWU9ZnVuY3Rpb24oYSl7cmV0dXJuITA9PT1cbmF8fGE9PT1Tay5idWlsdGluLmJvb2wudHJ1ZSQ/ITA6ITE9PT1hfHxhPT09U2suYnVpbHRpbi5ib29sLmZhbHNlJHx8bnVsbD09PWF8fHZvaWQgMD09PWE/ITE6YS5uYiRib29sP2EubmIkYm9vbCgpOmEuc3EkbGVuZ3RoPzAhPT1hLnNxJGxlbmd0aCgpOiEhYX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuaXNUcnVlXCIsU2subWlzY2V2YWwuaXNUcnVlKTtTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExO1NrLm1pc2NldmFsLnByaW50Xz1mdW5jdGlvbihhKXtTay5taXNjZXZhbC5zb2Z0c3BhY2VfJiYoXCJcXG5cIiE9PWEmJlNrLm91dHB1dChcIiBcIiksU2subWlzY2V2YWwuc29mdHNwYWNlXz0hMSk7dmFyIGI9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRNb2R1bGUoXCJzeXNcIiwhMSwhMCksZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5KGEuJGQuc3Rkb3V0LndyaXRlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLFthLiRkLnN0ZG91dCxcbmJdKX0sZnVuY3Rpb24oKXt2YXIgYTsoYT0wPT09Yi52Lmxlbmd0aCl8fChhPWIudltiLnYubGVuZ3RoLTFdLGE9IShcIlxcblwiPT09YXx8XCJcXHRcIj09PWF8fFwiXFxyXCI9PT1hKSk7aWYoYXx8XCIgXCI9PT1iLnZbYi52Lmxlbmd0aC0xXSlTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSEwfSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnByaW50X1wiLFNrLm1pc2NldmFsLnByaW50Xyk7U2subWlzY2V2YWwubG9hZG5hbWU9ZnVuY3Rpb24oYSxjKXtjPWNbYV07aWYodm9pZCAwIT09YylyZXR1cm4gYztjPVNrLmJ1aWx0aW5zW2FdO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTmFtZUVycm9yKFwibmFtZSAnXCIrU2sudW5maXhSZXNlcnZlZChhKStcIicgaXMgbm90IGRlZmluZWRcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5sb2FkbmFtZVwiLFNrLm1pc2NldmFsLmxvYWRuYW1lKTtTay5taXNjZXZhbC5jYWxsPWZ1bmN0aW9uKGEsYyxmLGwsaCl7aD1cbkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyw0KTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHkoYSxjLGYsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbFwiLFNrLm1pc2NldmFsLmNhbGwpO1NrLm1pc2NldmFsLmNhbGxBc3luYz1mdW5jdGlvbihhLGMsZixsLGgsZCl7ZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsNSk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5QXN5bmMoYSxjLGYsbCxoLGQpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsQXN5bmNcIixTay5taXNjZXZhbC5jYWxsQXN5bmMpO1NrLm1pc2NldmFsLmNhbGxPclN1c3BlbmQ9ZnVuY3Rpb24oYSxjLGYsbCxoKXtoPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyw0KTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYSxjLGYsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZFwiLFxuU2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZCk7U2subWlzY2V2YWwuY2FsbHNpbT1mdW5jdGlvbihhLGMpe2M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGMpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltXCIsU2subWlzY2V2YWwuY2FsbHNpbSk7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5PWZ1bmN0aW9uKGEsYyxmKXtjPWN8fFtdO3JldHVybiBTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsYyxmKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheVwiLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSk7U2subWlzY2V2YWwuY2FsbHNpbUFzeW5jPWZ1bmN0aW9uKGEsYyxmKXtmPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyxcbjIpO3JldHVybiBTay5taXNjZXZhbC5hcHBseUFzeW5jKGEsYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCxmKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbHNpbUFzeW5jXCIsU2subWlzY2V2YWwuY2FsbHNpbUFzeW5jKTtTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kPWZ1bmN0aW9uKGEsYyl7Yz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAsYyl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRcIixTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kKTtTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXk9ZnVuY3Rpb24oYSxjLGYpe2M9Y3x8W107cmV0dXJuIHZvaWQgMCE9PWEmJmEudHAkY2FsbD9hLnRwJGNhbGwoYyxmKTpTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChhLHZvaWQgMCx2b2lkIDAsZixcbmMpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXlcIixTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkpO1NrLm1pc2NldmFsLmFwcGx5PWZ1bmN0aW9uKGEsYyxmLGwsaCl7YT1Tay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChhLGMsZixsLGgpO3JldHVybiBhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYSk6YX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlcIixTay5taXNjZXZhbC5hcHBseSk7U2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2U9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYixlKXt0cnl7KGZ1bmN0aW9uIGcoYSl7dHJ5e2Zvcih2YXIgZD1mdW5jdGlvbigpe3RyeXtnKGEucmVzdW1lKCkpfWNhdGNoKHQpe2UodCl9fSxmPWZ1bmN0aW9uKGIpe3RyeXthLmRhdGEucmVzdWx0PWIsXG5kKCl9Y2F0Y2godil7ZSh2KX19LHA9ZnVuY3Rpb24oYil7dHJ5e2EuZGF0YS5lcnJvcj1iLGQoKX1jYXRjaCh2KXtlKHYpfX07YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb247KXt2YXIgbD1jJiYoY1thLmRhdGEudHlwZV18fGNbXCIqXCJdKTtpZihsKXt2YXIgQT1sKGEpO2lmKEEpe0EudGhlbihnLGUpO3JldHVybn19aWYoXCJTay5wcm9taXNlXCI9PWEuZGF0YS50eXBlKXthLmRhdGEucHJvbWlzZS50aGVuKGYscCk7cmV0dXJufWlmKFwiU2sueWllbGRcIj09YS5kYXRhLnR5cGUpe1NrLmdsb2JhbC5zZXRJbW1lZGlhdGUoZCk7cmV0dXJufWlmKFwiU2suZGVsYXlcIj09YS5kYXRhLnR5cGUpe1NrLmdsb2JhbC5zZXRJbW1lZGlhdGUoZCk7cmV0dXJufWlmKGEub3B0aW9uYWwpYT1hLnJlc3VtZSgpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yKFwiVW5oYW5kbGVkIG5vbi1vcHRpb25hbCBzdXNwZW5zaW9uIG9mIHR5cGUgJ1wiK2EuZGF0YS50eXBlK1wiJ1wiKTtcbn1iKGEpfWNhdGNoKHQpe2UodCl9fSkoYSgpKX1jYXRjaChoKXtlKGgpfX0pfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hc3luY1RvUHJvbWlzZVwiLFNrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlKTtTay5taXNjZXZhbC5hcHBseUFzeW5jPWZ1bmN0aW9uKGEsYyxmLGwsaCxkKXtyZXR1cm4gU2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2UoZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYyxmLGwsaCxkKX0sYSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmFwcGx5QXN5bmNcIixTay5taXNjZXZhbC5hcHBseUFzeW5jKTtTay5taXNjZXZhbC5jaGFpbj1mdW5jdGlvbihhLGMpe2Zvcih2YXIgYj0xLGU9YSxoLGQ7Oyl7aWYoYj09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZTtpZihlJiZlLiRpc1N1c3BlbnNpb24pYnJlYWs7ZT1hcmd1bWVudHNbYl0oZSk7YisrfWQ9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC1iKTtmb3IoaD0wO2g8YXJndW1lbnRzLmxlbmd0aC1cbmI7aCsrKWRbaF09YXJndW1lbnRzW2IraF07aD0wO3JldHVybiBmdW5jdGlvbiBrKGEpe2Zvcig7aDxkLmxlbmd0aDspe2lmKGEgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uKXJldHVybiBuZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbihrLGEpO2E9ZFtoXShhKTtoKyt9cmV0dXJuIGF9KGUpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jaGFpblwiLFNrLm1pc2NldmFsLmNoYWluKTtTay5taXNjZXZhbC50cnlDYXRjaD1mdW5jdGlvbihhLGMpe3RyeXt2YXIgYj1hKCl9Y2F0Y2gobCl7cmV0dXJuIGMobCl9cmV0dXJuIGIgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uPyhhPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKHZvaWQgMCxiKSxhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC50cnlDYXRjaChiLnJlc3VtZSxjKX0sYSk6Yn07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwudHJ5Q2F0Y2hcIixTay5taXNjZXZhbC50cnlDYXRjaCk7XG5Tay5taXNjZXZhbC5pdGVyRm9yPWZ1bmN0aW9uKGEsYyxmKXt2YXIgYj1mLGU9ZnVuY3Rpb24oYyl7Yj1jO3JldHVybiBjIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWs/YzphLnRwJGl0ZXJuZXh0KCEwKX07cmV0dXJuIGZ1bmN0aW9uIG4oYSl7Zm9yKDt2b2lkIDAhPT1hOyl7aWYoYSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKG4sYSk7aWYoYT09PVNrLm1pc2NldmFsLkJyZWFrfHxhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWspcmV0dXJuIGEuYnJWYWx1ZTthPVNrLm1pc2NldmFsLmNoYWluKGMoYSxiKSxlKX1yZXR1cm4gYn0oYS50cCRpdGVybmV4dCghMCkpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5pdGVyRm9yXCIsU2subWlzY2V2YWwuaXRlckZvcik7U2subWlzY2V2YWwuaXRlckFycmF5PWZ1bmN0aW9uKGEsYyxmKXtTay5hc3NlcnRzLmFzc2VydChBcnJheS5pc0FycmF5KGEpLFxuXCJpdGVyQXJncyByZXF1aXJlcyBhbiBhcnJheVwiKTtsZXQgYj0wO3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKHt0cCRpdGVybmV4dDooKT0+YVtiKytdfSxjLGYpfTtTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZT1mdW5jdGlvbihhLGMpe2lmKHZvaWQgMD09PWEpcmV0dXJuW107aWYodm9pZCAwPT09YS5ocCR0eXBlJiZ2b2lkIDAhPT1hLnNrJGFzYXJyYXkpcmV0dXJuIGEuc2skYXNhcnJheSgpO2NvbnN0IGI9W107YT1Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2IucHVzaChhKX0pLCgpPT5iKTtyZXR1cm4gYz9hOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhhKX07U2subWlzY2V2YWwuQnJlYWs9ZnVuY3Rpb24oYSl7aWYoISh0aGlzIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWspKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoYSk7dGhpcy5iclZhbHVlPWF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLkJyZWFrXCIsXG5Tay5taXNjZXZhbC5CcmVhayk7U2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQ9ZnVuY3Rpb24oYSxjLGYsbCxoKXt2YXIgYjtpZihudWxsPT1hfHxhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZVwiKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSYmdm9pZCAwPT09YS50cCRjYWxsJiYoYT1uZXcgU2suYnVpbHRpbi5mdW5jKGEpKTt2YXIgZT1hLnRwJGNhbGw7aWYodm9pZCAwIT09ZSl7aWYoZilmb3IoZj1mLnRwJGl0ZXIoKSxiPWYudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9Zi50cCRpdGVybmV4dCgpKWgucHVzaChiKTtpZihjKWZvcihmPVNrLmFic3RyLml0ZXIoYyksYj1mLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWYudHAkaXRlcm5leHQoKSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiRnVuY3Rpb24ga2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzXCIpO1xubC5wdXNoKGIudik7bC5wdXNoKFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxiLCExKSl9cmV0dXJuIGUuY2FsbChhLGgsbCxjKX1lPWEuX19jYWxsX187aWYodm9pZCAwIT09ZSlyZXR1cm4gaC51bnNoaWZ0KGEpLFNrLm1pc2NldmFsLmFwcGx5KGUsYyxmLGwsaCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmRcIixTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZCk7U2subWlzY2V2YWwucHJvbWlzZVRvU3VzcGVuc2lvbj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbjtiLnJlc3VtZT1mdW5jdGlvbigpe2lmKGIuZGF0YS5lcnJvcil0aHJvdyBiLmRhdGEuZXJyb3I7cmV0dXJuIGIuZGF0YS5yZXN1bHR9O2IuZGF0YT17dHlwZTpcIlNrLnByb21pc2VcIixwcm9taXNlOmF9O3JldHVybiBifTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb25cIixTay5taXNjZXZhbC5wcm9taXNlVG9TdXNwZW5zaW9uKTtTay5taXNjZXZhbC5idWlsZENsYXNzPWZ1bmN0aW9uKGEsYyxmLGwsaCl7dmFyIGI9U2suYnVpbHRpbi50eXBlLGU9e307YyhhLGUsdm9pZCAwPT09aD97fTpoKTthLl9fbmFtZV9fJiYoZS5fX21vZHVsZV9fPWEuX19uYW1lX18pO2E9bmV3IFNrLmJ1aWx0aW4uc3RyKGYpO2w9bmV3IFNrLmJ1aWx0aW4udHVwbGUobCk7Yz1bXTtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYoYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihuKSksYy5wdXNoKGVbbl0pKTtjPW5ldyBTay5idWlsdGluLmRpY3QoYyk7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLFthLGwsY10pfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5idWlsZENsYXNzXCIsU2subWlzY2V2YWwuYnVpbGRDbGFzcyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5jYWxsYWJsZV9pdGVyXz1cblNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImNhbGxhYmxlX2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpdGVyKHYsIHcpOiB2IG11c3QgYmUgY2FsbGFibGVcIik7dGhpcy4kY2FsbGFibGU9YTt0aGlzLiRzZW50aW5lbD1jO3RoaXMuJGZsYWc9ITF9LGl0ZXJuZXh0KGEpe2lmKCEwIT09dGhpcy4kZmxhZyl7aWYoYSlyZXR1cm4gYT1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkodGhpcy4kY2FsbGFibGUsW10pLFNrLm1pc2NldmFsLmNoYWluKGEsYT0+e2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLHRoaXMuJHNlbnRpbmVsLFwiRXFcIiwhMCkpdGhpcy4kZmxhZz0hMDtlbHNlIHJldHVybiBhfSk7YT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy4kY2FsbGFibGUsW10pO2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLFxudGhpcy4kc2VudGluZWwsXCJFcVwiLCExKSl0aGlzLiRmbGFnPSEwO2Vsc2UgcmV0dXJuIGF9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uc2VxX2l0ZXJfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIml0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWF9LGl0ZXJuZXh0KGEpe2xldCBjO2M9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PnRoaXMuJHNlcS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpbmRleCsrKSxhKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5JbmRleEVycm9yfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uKSl0aHJvdyBhO30pO3JldHVybiBhP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186eyRmbGFnczp7Tm9BcmdzOiEwfSxcbiRtZXRoKCl7aWYodGhpcy4kc2VxLnNxJGxlbmd0aClyZXR1cm4gdGhpcy4kc2VxLnNxJGxlbmd0aCgpLXRoaXMuJGluZGV4O3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJsZW4gaXMgbm90IGltcGxlbWVudGVkIGZvciBcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzLiRzZXEpKTt9fX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNhbGxhYmxlX2l0ZXJfXCIsU2suYnVpbHRpbi5jYWxsYWJsZV9pdGVyXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5saXN0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJsaXN0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWE/YT1bXTpBcnJheS5pc0FycmF5KGEpfHwoYT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSk7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdCxcImJhZCBjYWxsIHRvIGxpc3QsIHVzZSAnbmV3JyB3aXRoIGFuIEFycmF5IG9mIHB5dGhvbiBvYmplY3RzXCIpO1xudGhpcy52PWE7dGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRkb2M6XCJCdWlsdC1pbiBtdXRhYmxlIHNlcXVlbmNlLlxcblxcbklmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyBlbXB0eSBsaXN0LlxcblRoZSBhcmd1bWVudCBtdXN0IGJlIGFuIGl0ZXJhYmxlIGlmIHNwZWNpZmllZC5cIix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJsaXN0XCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwibGlzdFwiLGEsMCwxKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYVswXSwhMCksYT0+e3RoaXMudj1hfSl9LCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJbLi4uXVwiKTtcbnRoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudi5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJbXCIrYS5qb2luKFwiLCBcIikrXCJdXCIpfSx0cCRyaWNoY29tcGFyZTpTay5nZW5lcmljLnNlcUNvbXBhcmUsdHAkaXRlcigpe3JldHVybiBuZXcgYSh0aGlzKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3QpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGNvbmNhdGVuYXRlIGxpc3QgdG8gbGlzdFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYuY29uY2F0KGEudikpfSxzcSRjb250YWlucyhhKXtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZihjPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsXG5hLFwiRXFcIikpcmV0dXJuITA7cmV0dXJuITF9LHNxJHJlcGVhdChhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoYSp0aGlzLnYubGVuZ3RoPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGE7YysrKWZvcihsZXQgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspYi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9LG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXJldHVybiBhPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvciksXG5hPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGluZGV4IG91dCBvZiByYW5nZVwiKSx0aGlzLnZbYV07aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2godGhpcy52W2FdKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIHNsaWNlcywgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9LG1wJGFzc19zdWJzY3JpcHQoYSxjKXt2b2lkIDA9PT1jP3RoaXMuZGVsJHN1YnNjcmlwdChhKTp0aGlzLmFzcyRzdWJzY3JpcHQoYSxjKX0sc3EkaW5wbGFjZV9jb25jYXQoYSl7cmV0dXJuIGE9PT10aGlzPyh0aGlzLnYucHVzaCguLi50aGlzLnYpLHRoaXMpOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy52LnB1c2goYSl9KSxcbigpPT50aGlzKX0sc3EkaW5wbGFjZV9yZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2NvbnN0IGI9dGhpcy52Lmxlbmd0aDtpZigwPj1hKXRoaXMudi5sZW5ndGg9MDtlbHNlIGlmKGEqYj5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUil0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yO2ZvcihsZXQgYz0xO2M8YTtjKyspZm9yKGxldCBhPTA7YTxiO2ErKyl0aGlzLnYucHVzaCh0aGlzLnZbYV0pO3JldHVybiB0aGlzfX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgYyh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgbGlzdC5cIn0sY2xlYXI6eyRtZXRoKCl7dGhpcy52Lmxlbmd0aD0wO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIGxpc3QuXCJ9LGNvcHk6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy52LnNsaWNlKDApKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGxpc3QuXCJ9LGFwcGVuZDp7JG1ldGgoYSl7dGhpcy52LnB1c2goYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBvYmplY3QsIC8pXCIsJGRvYzpcIkFwcGVuZCBvYmplY3QgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cIn0saW5zZXJ0OnskbWV0aChhLFxuYyl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpOyh7c3RhcnQ6YX09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxhKSk7dGhpcy52LnNwbGljZShhLDAsYyk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5kZXgsIG9iamVjdCwgLylcIiwkZG9jOlwiSW5zZXJ0IG9iamVjdCBiZWZvcmUgaW5kZXguXCJ9LGV4dGVuZDp7JG1ldGgoYSl7cmV0dXJuIGE9PT10aGlzPyh0aGlzLnYucHVzaCguLi50aGlzLnYpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCk6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9Pnt0aGlzLnYucHVzaChhKX0pLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJFeHRlbmQgbGlzdCBieSBhcHBlbmRpbmcgZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUuXCJ9LFxucG9wOnskbWV0aChhKXthPXZvaWQgMD09PWE/dGhpcy52Lmxlbmd0aC0xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT10aGlzLmxpc3QkaW5SYW5nZShhLFwicG9wIGluZGV4IG91dCBvZiByYW5nZVwiKTtjb25zdCBiPXRoaXMudlthXTt0aGlzLnYuc3BsaWNlKGEsMSk7cmV0dXJuIGJ9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGluZGV4PS0xLCAvKVwiLCRkb2M6XCJSZW1vdmUgYW5kIHJldHVybiBpdGVtIGF0IGluZGV4IChkZWZhdWx0IGxhc3QpLlxcblxcblJhaXNlcyBJbmRleEVycm9yIGlmIGxpc3QgaXMgZW1wdHkgb3IgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlwifSxyZW1vdmU6eyRtZXRoKGEpe2E9dGhpcy5saXN0JGluZGV4T2YoYSk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJsaXN0LnJlbW92ZSh4KTogeCBub3QgaW4gbGlzdFwiKTt0aGlzLnYuc3BsaWNlKGEsXG4xKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRkb2M6XCJSZW1vdmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB2YWx1ZS5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuXCJ9LHNvcnQ6eyRtZXRoKGEsYyl7aWYoYS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic29ydCgpIHRha2VzIG5vIHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpO2NvbnN0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwic29ydFwiLFtcImtleVwiLFwicmV2ZXJzZVwiXSxhLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLmJvb2wuZmFsc2UkXSk7cmV0dXJuIHRoaXMubGlzdCRzb3J0KHZvaWQgMCxiLGUpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKiwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpXCIsXG4kZG9jOlwiU3RhYmxlIHNvcnQgKklOIFBMQUNFKi5cIn0saW5kZXg6eyRtZXRoKGEsYyxmKXtpZih2b2lkIDAhPT1jJiYhU2subWlzY2V2YWwuaXNJbmRleChjKXx8dm9pZCAwIT09ZiYmIVNrLm1pc2NldmFsLmlzSW5kZXgoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKTtjPXRoaXMubGlzdCRpbmRleE9mKGEsYyxmKTtpZigtMT09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiIGlzIG5vdCBpbiBsaXN0XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgc3RhcnQ9MCwgc3RvcD1zeXMubWF4c2l6ZSwgLylcIiwkZG9jOlwiUmV0dXJuIGZpcnN0IGluZGV4IG9mIHZhbHVlLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cIn0sXG5jb3VudDp7JG1ldGgoYSl7bGV0IGI9MDtjb25zdCBjPXRoaXMudi5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxjO2UrKylpZih0aGlzLnZbZV09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W2VdLGEsXCJFcVwiKSliKz0xO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRkb2M6XCJSZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHZhbHVlLlwifSxyZXZlcnNlOnskbWV0aCgpe3RoaXMubGlzdCRyZXZlcnNlKCk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXZlcnNlICpJTiBQTEFDRSouXCJ9fSxwcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2xpY2UoMCl9LGxpc3Qkc29ydDpmdW5jdGlvbihhLGMsZil7Y29uc3QgYj1udWxsIT1jJiZjIT09U2suYnVpbHRpbi5ub25lLm5vbmUkO1xudmFyIGU9bnVsbCE9YSYmYSE9PVNrLmJ1aWx0aW4ubm9uZS5ub25lJDtsZXQgZDtpZih2b2lkIDA9PT1mKWQ9ITE7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrSW50KGYpKWQ9U2subWlzY2V2YWwuaXNUcnVlKGYpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTtmPW5ldyBTay5idWlsdGluLnRpbVNvcnQodGhpcyk7dGhpcy52PVtdO2NvbnN0IGc9bmV3IFNrLmJ1aWx0aW4uaW50XygwKTtpZihiKXtmLmx0PWU/ZnVuY3Rpb24oYixjKXtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiWzBdLGNbMF1dKTtyZXR1cm4gU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsZyxcIkx0XCIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYVswXSxiWzBdLFwiTHRcIil9O2ZvcihsZXQgYT0wO2E8Zi5saXN0bGVuZ3RoO2ErKyl7ZT1mLmxpc3QudlthXTtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFxuW2VdKTtmLmxpc3QudlthXT1bYixlXX19ZWxzZSBlJiYoZi5sdD1mdW5jdGlvbihiLGMpe2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW2IsY10pO3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYixnLFwiTHRcIil9KTtkJiZmLmxpc3QubGlzdCRyZXZlcnNlKCk7Zi5zb3J0KCk7ZCYmZi5saXN0Lmxpc3QkcmV2ZXJzZSgpO2lmKGIpZm9yKGM9MDtjPGYubGlzdGxlbmd0aDtjKyspZT1mLmxpc3QudltjXVsxXSxmLmxpc3QudltjXT1lO2M9MDx0aGlzLnNxJGxlbmd0aCgpO3RoaXMudj1mLmxpc3QudjtpZihjKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJsaXN0IG1vZGlmaWVkIGR1cmluZyBzb3J0XCIpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LGxpc3QkaW5SYW5nZShhLGMpezA+YSYmKGErPXRoaXMudi5sZW5ndGgpO2lmKDA8PWEmJmE8dGhpcy52Lmxlbmd0aClyZXR1cm4gYTt0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKGMpO1xufSxsaXN0JGluZGV4T2YoYSxjLGYpe2Zvcih7c3RhcnQ6YyxlbmQ6Zn09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxjLGYpO2M8ZiYmYzx0aGlzLnYubGVuZ3RoO2MrKylpZih0aGlzLnZbY109PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W2NdLGEsXCJFcVwiKSlyZXR1cm4gYztyZXR1cm4tMX0sbGlzdCRyZXZlcnNlKCl7dGhpcy52LnJldmVyc2UoKX0sYXNzJHN1YnNjcmlwdChhLGMpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhpcy5hc3MkaW5kZXgoYSxjKTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNsaWNlKXtjb25zdCB7c3RhcnQ6YixzdG9wOmUsc3RlcDpofT1hLnNsaWNlJGluZGljZXModGhpcy52Lmxlbmd0aCk7MT09PWg/dGhpcy5hc3Mkc2xpY2UoYixlLGMpOnRoaXMuYXNzJGV4dF9zbGljZShhLGMpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKSk7fSxhc3MkaW5kZXgoYSxjKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7YT10aGlzLmxpc3QkaW5SYW5nZShhLFwibGlzdCBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZVwiKTt0aGlzLnZbYV09Y30sYXNzJHNsaWNlKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGFzc2lnbiBhbiBpdGVyYWJsZVwiKTtmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGYpO3RoaXMudi5zcGxpY2UoYSxjLWEsLi4uZil9LGFzcyRleHRfc2xpY2UoYSxjKXtjb25zdCBiPVtdO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57Yi5wdXNoKGEpfSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtdXN0IGFzc2lnbiBpdGVyYWJsZSB0byBleHRlbmRlZCBzbGljZVwiKTtcbmE9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYyk7aWYoYi5sZW5ndGghPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiYXR0ZW1wdCB0byBhc3NpZ24gc2VxdWVuY2Ugb2Ygc2l6ZSBcIithLmxlbmd0aCtcIiB0byBleHRlbmRlZCBzbGljZSBvZiBzaXplIFwiK2IubGVuZ3RoKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMudi5zcGxpY2UoYltjXSwxLGFbY10pfSxkZWwkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhpcy5kZWwkaW5kZXgoYSk7ZWxzZSBpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7Y29uc3Qge3N0YXJ0OmIsc3RvcDpjLHN0ZXA6bH09YS5zbGljZSRpbmRpY2VzKHRoaXMudi5sZW5ndGgpOzE9PT1sP3RoaXMuZGVsJHNsaWNlKGIsYyk6dGhpcy5kZWwkZXh0X3NsaWNlKGEsMDxsPzE6MCl9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoYSkpO30sZGVsJGluZGV4KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKTthPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3RoaXMudi5zcGxpY2UoYSwxKX0sZGVsJHNsaWNlKGEsYyl7dGhpcy52LnNwbGljZShhLGMtYSl9LGRlbCRleHRfc2xpY2UoYSxjKXtsZXQgYj0wO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57dGhpcy52LnNwbGljZShhLWIsMSk7Yis9Y30pfX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmxpc3RcIixTay5idWlsdGluLmxpc3QpO1NrLmJ1aWx0aW4ubGlzdC5weTIkbWV0aG9kcz17c29ydDp7JG5hbWU6XCJzb3J0XCIsJG1ldGgoYSxjKXtjb25zdCBbYixlLGhdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwic29ydFwiLFtcImNtcFwiLFwia2V5XCIsXCJyZXZlcnNlXCJdLGEsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkLFxuU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSRdKTtyZXR1cm4gdGhpcy5saXN0JHNvcnQoYixlLGgpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgY21wPU5vbmUsIGtleT1Ob25lLCByZXZlcnNlPUZhbHNlKVwiLCRkb2M6XCJTdGFibGUgc29ydCAqSU4gUExBQ0UqLlwifX07dmFyIGE9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwibGlzdF9pdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO3RoaXMuJHNlcT1hLnZ9LGl0ZXJuZXh0OlNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXksbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSksYz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJsaXN0X3JldmVyc2VpdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD1cbmEudi5sZW5ndGgtMTt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy4kc2VxW3RoaXMuJGluZGV4LS1dO2lmKHZvaWQgMD09PWEpdGhpcy50cCRpdGVybmV4dD0oKT0+e307ZWxzZSByZXR1cm4gYX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEsYSl7ZnVuY3Rpb24gYyhhKXt2YXIgYj1hLnJlcGxhY2UoRixcIlwiKS5yZXBsYWNlKE0sXCJfXCIpLnRvTG93ZXJDYXNlKCk7Yj1FW2JdO3JldHVybiB2b2lkIDA9PT1iP2E6Yn1mdW5jdGlvbiBiKGEsYixjKXtpZih2b2lkIDA9PT1iKWI9XCJ1dGYtOFwiO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSliPWIuJGpzc3RyKCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGFyZ3VtZW50IFwiKyhcImJ5dGVzc3RyXCIuaW5jbHVkZXMoYSk/XG4yOjEpK1wiIG11c3QgYmUgc3RyIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShiKSk7aWYodm9pZCAwPT09YyljPVwic3RyaWN0XCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKWM9Yy4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgYXJndW1lbnQgXCIrKFwiYnl0ZXNzdHJcIi5pbmNsdWRlcyhhKT8zOjIpK1wiIG11c3QgYmUgc3RyIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShjKSk7cmV0dXJue2VuY29kaW5nOmIsZXJyb3JzOmN9fWZ1bmN0aW9uIGUoYSxiLGQpe2E9YS4kanNzdHIoKTtiPWMoYik7aWYoXCJzdHJpY3RcIiE9PWQmJlwiaWdub3JlXCIhPT1kJiZcInJlcGxhY2VcIiE9PWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIidcIitkK1wiJyBlcnJvciBoYW5kbGluZyBub3QgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XCIpO2lmKFwiYXNjaWlcIj09PWIpe2I9W107Zm9yKGUgaW4gYSl7Y29uc3QgYz1hLmNoYXJDb2RlQXQoZSk7XG5pZigxMjc8Yyl7aWYoXCJzdHJpY3RcIj09PWQpdGhyb3cgZD1mKGMpLG5ldyBTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcihcIidhc2NpaScgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlciAnXCIrZCtcIicgaW4gcG9zaXRpb24gXCIrZStcIjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KVwiKTtcInJlcGxhY2VcIj09PWQmJmIucHVzaCg2Myl9ZWxzZSBiLnB1c2goYyl9dmFyIGU9bmV3IFVpbnQ4QXJyYXkoYil9ZWxzZSBpZihcInV0Zi04XCI9PT1iKWU9Vi5lbmNvZGUoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5Mb29rdXBFcnJvcihcInVua25vd24gZW5jb2Rpbmc6IFwiK2IpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhlKX1mdW5jdGlvbiBmKGEpe3ZhciBiPTI2NT49YT9cIlxcXFx4XCI6XCJcXFxcdVwiO2E9YS50b1N0cmluZygxNik7Mz09PWEubGVuZ3RoJiYoYT1hLnNsaWNlKDEsMykpO3JldHVybiBhPTE9PT1hLmxlbmd0aD9iK1wiMFwiK2E6YithfWZ1bmN0aW9uIGwoYSxkKXsoe2VuY29kaW5nOmEsXG5lcnJvcnM6ZH09YihcImRlY29kZVwiLGEsZCkpO2E9YyhhKTtpZihcInN0cmljdFwiIT09ZCYmXCJpZ25vcmVcIiE9PWQmJlwicmVwbGFjZVwiIT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiJ1wiK2QrXCInIGVycm9yIGhhbmRsaW5nIG5vdCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcIik7aWYoXCJhc2NpaVwiPT09YSl7YT10aGlzLnY7dmFyIGU9XCJcIjtmb3IobGV0IGI9MDtiPGEubGVuZ3RoO2IrKyl7Y29uc3QgYz1hW2JdO2lmKDEyNzxjKXtpZihcInN0cmljdFwiPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IoXCInYXNjaWknIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4XCIrYy50b1N0cmluZygxNikrXCIgaW4gcG9zaXRpb24gXCIrYitcIjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KVwiKTtcInJlcGxhY2VcIj09PWQmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDY1NTMzKSl9ZWxzZSBlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMpfWE9ZX1lbHNlIGlmKFwidXRmLThcIj09PVxuYSlhOmlmKGE9dGhpcy52LGU9ZCxkPXkuZGVjb2RlKGEpLFwicmVwbGFjZVwiPT09ZSlhPWQ7ZWxzZXtpZihcInN0cmljdFwiPT09ZSl7ZT1kLmluZGV4T2YoXCJcXHVmZmZkXCIpO2lmKC0xPT09ZSl7YT1kO2JyZWFrIGF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKFwiJ3V0Zi04JyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweFwiK2FbZV0udG9TdHJpbmcoMTYpK1wiIGluIHBvc2l0aW9uIFwiK2UrXCI6IGludmFsaWQgc3RhcnQgYnl0ZVwiKTt9YT1kLnJlcGxhY2UoL1xcdWZmZmQvZyxcIlwiKX1lbHNlIHRocm93IG5ldyBTay5idWlsdGluLkxvb2t1cEVycm9yKFwidW5rbm93biBlbmNvZGluZzogXCIrYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzfHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXG5cIiBmaXJzdCBhcmcgbXVzdCBiZSBieXRlcyBvciBhIHR1cGxlIG9mIGJ5dGVzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpOyh7c3RhcnQ6ZCxlbmQ6ZX09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxkLGUpKTtpZihlPGQpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7ZD10aGlzLnYuc3ViYXJyYXkoZCxlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7Zm9yKGxldCBhPVNrLmFic3RyLml0ZXIoYyksZT1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZTtlPWEudHAkaXRlcm5leHQoKSlpZihlPXRoaXMuZ2V0JHJhdyhlKSxiKGQsZSkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJH1yZXR1cm4gYihkLGMudik/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtiPXRoaXMuZ2V0JHRndChiKTtcbih7c3RhcnQ6YyxlbmQ6ZH09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxjLGQpKTtyZXR1cm4gZDxjPy0xOlwibnVtYmVyXCI9PT10eXBlb2YgYj8oYj1hP3RoaXMudi5sYXN0SW5kZXhPZihiLGQtMSk6dGhpcy52LmluZGV4T2YoYixjKSxiPj1jJiZiPGQ/YjotMSk6YT90aGlzLmZpbmQkc3VicmlnaHQoYixjLGQpOnRoaXMuZmluZCRzdWJsZWZ0KGIsYyxkKX19ZnVuY3Rpb24gZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7Yj10aGlzLmdldCRyYXcoYik7bGV0IGM7aWYoYSl7aWYoYz10aGlzLmZpbmQkc3VicmlnaHQoYiwwLHRoaXMudi5sZW5ndGgpLDA+YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmJ5dGVzLG5ldyBTay5idWlsdGluLmJ5dGVzLHRoaXNdKX1lbHNlIGlmKGM9dGhpcy5maW5kJHN1YmxlZnQoYiwwLHRoaXMudi5sZW5ndGgpLDA+YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXMsbmV3IFNrLmJ1aWx0aW4uYnl0ZXMsXG5uZXcgU2suYnVpbHRpbi5ieXRlc10pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KDAsYykpLG5ldyBTay5idWlsdGluLmJ5dGVzKGIpLG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShjK2IubGVuZ3RoKSldKX19ZnVuY3Rpb24gbihhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD12b2lkIDA9PT1jfHxjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkP25ldyBVaW50OEFycmF5KFs5LDEwLDExLDEyLDEzLDMyLDEzM10pOnRoaXMuZ2V0JHJhdyhjKTtjPTA7dmFyIGU9dGhpcy52Lmxlbmd0aDtpZihhKWZvcig7YzxlJiZkLmluY2x1ZGVzKHRoaXMudltjXSk7KWMrKztpZihiKWZvcig7ZT5jJiZkLmluY2x1ZGVzKHRoaXMudltlLTFdKTspZS0tO2Q9bmV3IFVpbnQ4QXJyYXkoZS1jKTtmb3IoZT0wO2U8ZC5sZW5ndGg7ZSsrKWRbZV09dGhpcy52W2UrY107cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGQpfX1cbmZ1bmN0aW9uIGsoYSxiLGMpe3JldHVybiBmdW5jdGlvbihkLGUpe2lmKHZvaWQgMD09PWUpZT0zMjtlbHNlIGlmKGUgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzJiYxPT1lLnYubGVuZ3RoKWU9ZS52WzBdO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBhcmd1bWVudCAyIG11c3QgYmUgYSBieXRlIHN0cmluZyBvZiBsZW5ndGggMSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGUpKTtjb25zdCBmPXRoaXMudi5sZW5ndGg7ZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKGQ8PWYpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7Y29uc3QgZz1uZXcgVWludDhBcnJheShkKTtsZXQgayxoO2M/KGs9TWF0aC5mbG9vcigoZC1mKS8yKSxoPShkLWYpJTI/aysxOmspOmI/KGs9ZC1mLGg9MCk6KGs9MCxoPWQtZik7Zy5maWxsKGUsMCxrKTtmb3IobGV0IGE9MDthPGY7YSsrKWdbYStrXT10aGlzLnZbYV07XG5nLmZpbGwoZSxkLWgpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhnKX19ZnVuY3Rpb24gcChhKXtyZXR1cm4gOTw9YSYmMTM+PWF8fDMyPT09YX1mdW5jdGlvbiB1KGEpe3JldHVybiA5Nzw9YSYmMTIyPj1hfWZ1bmN0aW9uIEEoYSl7cmV0dXJuIDY1PD1hJiY5MD49YX1mdW5jdGlvbiB0KGEpe3JldHVybiA0ODw9YSYmNTc+PWF9ZnVuY3Rpb24gdihhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy52Lmxlbmd0aD9iP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkOnRoaXMudi5ldmVyeShiPT5hKGIpKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gQihhLGIpe3JldHVybiBmdW5jdGlvbigpe2xldCBjPSExO2ZvcihsZXQgZD0wO2Q8dGhpcy52Lmxlbmd0aDtkKyspe2lmKGIodGhpcy52W2RdKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDshYyYmYSh0aGlzLnZbZF0pJiZcbihjPSEwKX1yZXR1cm4gYz9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gRChhKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBiPW5ldyBVaW50OEFycmF5KHRoaXMudi5sZW5ndGgpO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspYltjXT1hKHRoaXMudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfX1hKDMwKTtjb25zdCBFPXt1dGY6XCJ1dGYtOFwiLHV0Zjg6XCJ1dGYtOFwiLHV0Zl84OlwidXRmLThcIixhc2NpaTpcImFzY2lpXCJ9O3ZhciBGPS9cXHMrL2csTT0vW18tXSsvZztjb25zdCBWPW5ldyBUZXh0RW5jb2Rlcix5PW5ldyBUZXh0RGVjb2RlcjtTay5idWlsdGluLmJ5dGVzPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJieXRlc1wiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYnl0ZXMgaXMgYSBjb25zdHJ1Y3RvciB1c2UgJ25ldydcIik7XG5pZih2b2lkIDA9PT1hKXRoaXMudj1uZXcgVWludDhBcnJheTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXRoaXMudj1hO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShhKSlTay5hc3NlcnRzLmFzc2VydChhLmV2ZXJ5KGE9PjA8PWEmJjI1NT49YSksXCJiYWQgaW50ZXJuYWwgY2FsbCB0byBieXRlcyB3aXRoIGFycmF5XCIpLHRoaXMudj1uZXcgVWludDhBcnJheShhKTtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSl7bGV0IGI7Y29uc3QgYz1uZXcgVWludDhBcnJheShhLmxlbmd0aCksZD1hLmxlbmd0aDtmb3IobGV0IGU9MDtlPGQ7ZSsrKXtiPWEuY2hhckNvZGVBdChlKTtpZigyNTU8Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IoXCJpbnZhbGlkIHN0cmluZyBhdCBpbmRleCBcIitlK1wiIChwb3NzaWJseSBjb250YWlucyBhIHVuaWNvZGUgY2hhcmFjdGVyKVwiKTtjW2VdPWJ9dGhpcy52PWN9ZWxzZSBpZihcIm51bWJlclwiPT09dHlwZW9mIGEpdGhpcy52PVxubmV3IFVpbnQ4QXJyYXkoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgYXJndW1lbnQgdG8gYnl0ZXMgY29uc3RydWN0b3JcIik7fSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkZG9jOlwiYnl0ZXMoaXRlcmFibGVfb2ZfaW50cykgLT4gYnl0ZXNcXG5ieXRlcyhzdHJpbmcsIGVuY29kaW5nWywgZXJyb3JzXSkgLT4gYnl0ZXNcXG5ieXRlcyhieXRlc19vcl9idWZmZXIpIC0+IGltbXV0YWJsZSBjb3B5IG9mIGJ5dGVzX29yX2J1ZmZlclxcbmJ5dGVzKGludCkgLT4gYnl0ZXMgb2JqZWN0IG9mIHNpemUgZ2l2ZW4gYnkgdGhlIHBhcmFtZXRlciBpbml0aWFsaXplZCB3aXRoIG51bGwgYnl0ZXNcXG5ieXRlcygpIC0+IGVtcHR5IGJ5dGVzIG9iamVjdFxcblxcbkNvbnN0cnVjdCBhbiBpbW11dGFibGUgYXJyYXkgb2YgYnl0ZXMgZnJvbTpcXG4gIC0gYW4gaXRlcmFibGUgeWllbGRpbmcgaW50ZWdlcnMgaW4gcmFuZ2UoMjU2KVxcbiAgLSBhIHRleHQgc3RyaW5nIGVuY29kZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZ1xcbiAgLSBhbnkgb2JqZWN0IGltcGxlbWVudGluZyB0aGUgYnVmZmVyIEFQSS5cXG4gIC0gYW4gaW50ZWdlclwiLFxudHAkbmV3KGEsYyl7aWYodGhpcyE9PVNrLmJ1aWx0aW4uYnl0ZXMucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGMpO2M9Y3x8W107aWYoMT49YS5sZW5ndGgmJjA9PT0rYy5sZW5ndGgpYT1hWzBdO2Vsc2V7W2EsZCxjXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImJ5dGVzXCIsW251bGwsXCJweVNvdXJjZVwiLFwiZXJyb3JzXCJdLGEsYyk7KHtlbmNvZGluZzpkLGVycm9yczpjfT1iKFwiYnl0ZXNcIixkLGMpKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJlbmNvZGluZyBvciBlcnJvcnMgd2l0aG91dCBhIHN0cmluZyBhcmd1bWVudFwiKTtyZXR1cm4gZShhLGQsYyl9aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXM7aWYodm9pZCAwIT09KGM9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRieXRlcykpKXt2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxcbltdKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCxhPT57aWYoIVNrLmJ1aWx0aW4uY2hlY2tCeXRlcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2J5dGVzX18gcmV0dXJuZWQgbm9uLWJ5dGVzICh0eXBlIFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiKVwiKTtyZXR1cm4gYX0pfWlmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2Q9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5lZ2F0aXZlIGNvdW50XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhkKX1pZihTay5idWlsdGluLmNoZWNrQnl0ZXMoYSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGEudik7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHJpbmcgYXJndW1lbnQgd2l0aG91dCBhbiBlbmNvZGluZ1wiKTtpZihTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpe2xldCBiPVxuW107ZD1Tay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpO2lmKDA+YXx8MjU1PGEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KVwiKTtiLnB1c2goYSl9KTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCwoKT0+bmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYikpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjb252ZXJ0ICdcIitTay5hYnN0ci50eXBlTmFtZShkKStcIicgb2JqZWN0IGludG8gYnl0ZXNcIik7fSwkcigpe2xldCBhLGI9XCInXCI7Y29uc3QgYz0tMSE9PXRoaXMudi5pbmRleE9mKDM0KTtsZXQgZD1cIlwiO2ZvcihsZXQgZT0wO2U8dGhpcy52Lmxlbmd0aDtlKyspaWYoYT10aGlzLnZbZV0sOT5hfHwxMDxhJiYxMz5hfHwxMzxhJiYzMj5hfHwxMjY8YSlkKz1mKGEpO2Vsc2UgaWYoOT09PWF8fDEwPT09YXx8MTM9PT1hfHwzOT09PVxuYXx8OTI9PT1hKXN3aXRjaChhKXtjYXNlIDk6ZCs9XCJcXFxcdFwiO2JyZWFrO2Nhc2UgMTA6ZCs9XCJcXFxcblwiO2JyZWFrO2Nhc2UgMTM6ZCs9XCJcXFxcclwiO2JyZWFrO2Nhc2UgMzk6Yz9kKz1cIlxcXFwnXCI6KGQrPVwiJ1wiLGI9J1wiJyk7YnJlYWs7Y2FzZSA5MjpkKz1cIlxcXFxcXFxcXCJ9ZWxzZSBkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJiXCIrYitkK2IpfSx0cCRzdHIoKXtyZXR1cm4gdGhpcy4kcigpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBHKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKHRoaXM9PT1hJiZTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5KGIpKXJldHVybiEwO2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBjPXRoaXMudjthPWEudjtpZihjLmxlbmd0aCE9PWEubGVuZ3RoJiYoXCJFcVwiPT09Ynx8XCJOb3RFcVwiPT09YikpcmV0dXJuXCJFcVwiPT09XG5iPyExOiEwO2xldCBkO2NvbnN0IGU9TWF0aC5taW4oYy5sZW5ndGgsYS5sZW5ndGgpO2ZvcihkPTA7ZDxlJiZjW2RdPT09YVtkXTtkKyspO3N3aXRjaChiKXtjYXNlIFwiTHRcIjpyZXR1cm4gZD09PWUmJmMubGVuZ3RoPGEubGVuZ3RofHxjW2RdPGFbZF07Y2FzZSBcIkx0RVwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg8PWEubGVuZ3RofHxjW2RdPD1hW2RdO2Nhc2UgXCJFcVwiOnJldHVybiBkPT09ZTtjYXNlIFwiTm90RXFcIjpyZXR1cm4gZDxlO2Nhc2UgXCJHdFwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg+YS5sZW5ndGh8fGNbZF0+YVtkXTtjYXNlIFwiR3RFXCI6cmV0dXJuIGQ9PT1lJiZjLmxlbmd0aD49YS5sZW5ndGh8fGNbZF0+PWFbZF19fSx0cCRoYXNoKCl7cmV0dXJuKG5ldyBTay5idWlsdGluLnN0cih0aGlzLiRqc3N0cigpKSkudHAkaGFzaCgpfSx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXtsZXQgYj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxcblNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7aWYodm9pZCAwIT09Yil7MD5iJiYoYj10aGlzLnYubGVuZ3RoK2IpO2lmKDA+Ynx8Yj49dGhpcy52Lmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFwiaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMudltiXSl9fWVsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2godGhpcy52W2FdKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhuZXcgVWludDhBcnJheShiKSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYnl0ZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb25jYXQgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIiB0byBieXRlc1wiKTtjb25zdCBiPW5ldyBVaW50OEFycmF5KHRoaXMudi5sZW5ndGgrYS52Lmxlbmd0aCk7bGV0IGM7Zm9yKGM9MDtjPHRoaXMudi5sZW5ndGg7YysrKWJbY109dGhpcy52W2NdO2ZvcihsZXQgZD0wO2Q8YS52Lmxlbmd0aDtkKyssYysrKWJbY109YS52W2RdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhiKX0sc3EkcmVwZWF0KGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtjb25zdCBiPWEqdGhpcy52Lmxlbmd0aDtpZihiPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7aWYoMD49XG5hKXJldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlczthPW5ldyBVaW50OEFycmF5KGIpO2xldCBjPTA7Zm9yKDtjPGI7KWZvcihsZXQgYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspYVtjKytdPXRoaXMudltiXTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYSl9LHNxJGNvbnRhaW5zKGEpe3JldHVybi0xIT09dGhpcy5maW5kJGxlZnQoYSl9LHRwJGFzX251bWJlcjohMCxuYiRyZW1haW5kZXI6U2suYnVpbHRpbi5zdHIucHJvdG90eXBlLm5iJHJlbWFpbmRlcn0scHJvdG86eyRqc3N0cigpe2xldCBhPVwiXCI7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMudltiXSk7cmV0dXJuIGF9LGdldCR0Z3QoYSl7aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpcmV0dXJuIGEudjthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXCJhcmd1bWVudCBzaG91bGQgYmUgaW50ZWdlciBvciBieXRlcy1saWtlIG9iamVjdCwgbm90IHt0cCRuYW1lfVwiKTtcbmlmKDA+YXx8MjU1PGEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KVwiKTtyZXR1cm4gYX0sZ2V0JHJhdyhhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcylyZXR1cm4gYS52O3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgYnl0ZXMtbGlrZSBvYmplY3QgaXMgcmVxdWlyZWQsIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO30sZ2V0JHNwbGl0QXJnczpmdW5jdGlvbihhLGIpe2I9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGIsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtiPTA+Yj9JbmZpbml0eTpiO2E9U2suYnVpbHRpbi5jaGVja05vbmUoYSk/bnVsbDp0aGlzLmdldCRyYXcoYSk7aWYobnVsbCE9PWEmJiFhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZW1wdHkgc2VwYXJhdG9yXCIpO3JldHVybntzZXA6YSxtYXhzcGxpdDpifX0sZmluZCRsZWZ0OmQoITEpLFxuZmluZCRyaWdodDpkKCEwKSxmaW5kJHN1YmxlZnQ6ZnVuY3Rpb24oYSxiLGMpe2M9Yy1hLmxlbmd0aCsxO2xldCBkPWI7Zm9yKDtkPGM7KXtpZihhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2QrYl0pKXJldHVybiBkO2QrK31yZXR1cm4tMX0sZmluZCRzdWJyaWdodChhLGIsYyl7bGV0IGQ9Yy1hLmxlbmd0aDtmb3IoO2Q+PWI7KXtpZihhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2QrYl0pKXJldHVybiBkO2QtLX1yZXR1cm4tMX0sJHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4uYnl0ZXMucHJvdG90eXBlLnRwJG5ldyhhLGIpO2Mudj1hLnY7cmV0dXJuIGN9LHNrJGFzYXJyYXkoKXtjb25zdCBhPVtdO3RoaXMudi5mb3JFYWNoKGI9PnthLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhiKSl9KTtyZXR1cm4gYX19LGZsYWdzOntzdHIkZW5jb2RlOmUsJGRlY29kZTpsLGNoZWNrJGVuY29kZUFyZ3M6Yn0sbWV0aG9kczp7X19nZXRuZXdhcmdzX186eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudikpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6bnVsbH0sY2FwaXRhbGl6ZTp7JG1ldGgoKXtjb25zdCBhPXRoaXMudi5sZW5ndGg7aWYoMD09PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7Y29uc3QgYj1uZXcgVWludDhBcnJheShhKTtsZXQgYz10aGlzLnZbMF07YlswXT11KGMpP2MtMzI6Yztmb3IobGV0IGQ9MTtkPGE7ZCsrKWM9dGhpcy52W2RdLGJbZF09QShjKT9jKzMyOmM7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5jYXBpdGFsaXplKCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdpdGggb25seSBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkIChBU0NJSSlcXG5hbmQgdGhlIHJlc3QgbG93ZXItY2FzZWQuXCJ9LGNlbnRlcjp7JG1ldGg6ayhcImNlbnRlclwiLCExLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiQi5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBCIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gIFBhZGRpbmcgaXNcXG5kb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuXCJ9LGNvdW50OnskbWV0aChhLGIsYyl7YT10aGlzLmdldCR0Z3QoYSk7KHtzdGFydDpiLGVuZDpjfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGIsYykpO2xldCBkPTA7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWZvcig7YjxjO2IrKyl0aGlzLnZbYl09PT1hJiZkKys7ZWxzZXtjPWMtYS5sZW5ndGgrMTtmb3IobGV0IGU9YjtlPGM7ZSsrKWEuZXZlcnkoKGEsYik9PmE9PT10aGlzLnZbZStiXSkmJihkKyssZSs9YS5sZW5ndGgtMSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZCl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2Ygc3Vic2VjdGlvbiBzdWIgaW5cXG5ieXRlcyBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWRcXG5hcyBpbiBzbGljZSBub3RhdGlvbi5cIn0sXG5kZWNvZGU6eyRtZXRoOmwsJGZsYWdzOntOYW1lZEFyZ3M6W1wiZW5jb2RpbmdcIixcImVycm9yc1wiXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0nc3RyaWN0JylcIiwkZG9jOlwiRGVjb2RlIHRoZSBieXRlcyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgZW5jb2RpbmcuXFxuXFxuICBlbmNvZGluZ1xcbiAgICBUaGUgZW5jb2Rpbmcgd2l0aCB3aGljaCB0byBkZWNvZGUgdGhlIGJ5dGVzLlxcbiAgZXJyb3JzXFxuICAgIFRoZSBlcnJvciBoYW5kbGluZyBzY2hlbWUgdG8gdXNlIGZvciB0aGUgaGFuZGxpbmcgb2YgZGVjb2RpbmcgZXJyb3JzLlxcbiAgICBUaGUgZGVmYXVsdCBpcyAnc3RyaWN0JyBtZWFuaW5nIHRoYXQgZGVjb2RpbmcgZXJyb3JzIHJhaXNlIGFcXG4gICAgVW5pY29kZURlY29kZUVycm9yLiBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlICdpZ25vcmUnIGFuZCAncmVwbGFjZSdcXG4gICAgYXMgd2VsbCBhcyBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHdpdGggY29kZWNzLnJlZ2lzdGVyX2Vycm9yIHRoYXRcXG4gICAgY2FuIGhhbmRsZSBVbmljb2RlRGVjb2RlRXJyb3JzLlwifSxcbmVuZHN3aXRoOnskbWV0aDpoKFwiZW5kc3dpdGhcIiwoYSxiKT0+e2NvbnN0IGM9YS5sZW5ndGgtYi5sZW5ndGg7cmV0dXJuIDA8PWMmJmIuZXZlcnkoKGIsZCk9PmI9PT1hW2MrZF0pfSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBCIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxcbldpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cXG5XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxcbnN1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS5cIn0sZXhwYW5kdGFiczp7JG1ldGgoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IsXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIChnb3QgdHlwZSB7dHAkbmFtfSlcIik7XG5jb25zdCBiPVtdO2xldCBjPTA7Zm9yKGxldCBlPTA7ZTx0aGlzLnYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy52W2VdOzk9PT1kPyhkPWEtYyVhLGIucHVzaCguLi5BcnJheShkKS5maWxsKDMyKSksYys9ZCk6MTA9PT1kfHwxMz09PWQ/KGIucHVzaChkKSxjPTApOihiLnB1c2goZCksYysrKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMobmV3IFVpbnQ4QXJyYXkoYikpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJ0YWJzaXplXCJdLERlZmF1bHRzOls4XX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5leHBhbmR0YWJzKHRhYnNpemU9OCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgZXhwYW5kZWQgdXNpbmcgc3BhY2VzLlxcbklmIHRhYnNpemUgaXMgbm90IGdpdmVuLCBhIHRhYiBzaXplIG9mIDggY2hhcmFjdGVycyBpcyBhc3N1bWVkLlwifSxmaW5kOnskbWV0aDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJGxlZnQoYSxcbmIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0saGV4OnskbWV0aCgpe2xldCBhPVwiXCI7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhKz10aGlzLnZbYl0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsXCIwXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmhleCgpIC0+IHN0cmluZ1xcblxcbkNyZWF0ZSBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBudW1iZXJzIGZyb20gYSBieXRlcyBvYmplY3QuXFxuRXhhbXBsZTogYidcXFxceGI5XFxcXHgwMVxcXFx4ZWYnLmhleCgpIC0+ICdiOTAxZWYnLlwifSxcbmluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkbGVmdChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzZWN0aW9uIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLlwifSxpc2FsbnVtOnskbWV0aDp2KGE9PnQoYSl8fFxudShhKXx8QShhKSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNhbG51bSgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBhbHBoYW51bWVyaWNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzYWxwaGE6eyRtZXRoOnYoYT0+NjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2FscGhhKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIGFscGhhYmV0aWNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzYXNjaWk6eyRtZXRoOnYoYT0+MDw9YSYmMTI3Pj1hLCEwKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2FzY2lpKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgaXMgZW1wdHkgb3IgYWxsIGNoYXJhY3RlcnMgaW4gQiBhcmUgQVNDSUksXFxuRmFsc2Ugb3RoZXJ3aXNlLlwifSxcbmlzZGlnaXQ6eyRtZXRoOnYodCksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNkaWdpdCgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBkaWdpdHNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzbG93ZXI6eyRtZXRoOkIodSxBKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2xvd2VyKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIEIgYXJlIGxvd2VyY2FzZSBhbmQgdGhlcmUgaXNcXG5hdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0saXNzcGFjZTp7JG1ldGg6dihwKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc3NwYWNlKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIHdoaXRlc3BhY2VcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LFxuaXN0aXRsZTp7JG1ldGg6ZnVuY3Rpb24oKXtsZXQgYT0hMSxiPSExO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspe2NvbnN0IGQ9dGhpcy52W2NdO2lmKEEoZCkpe2lmKGEpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Yj1hPSEwfWVsc2UgaWYodShkKSl7aWYoIWEpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Yj0hMH1lbHNlIGE9ITF9cmV0dXJuIGI/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzdGl0bGUoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgQiBpcyBhIHRpdGxlY2FzZWQgc3RyaW5nIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmVcXG5jaGFyYWN0ZXIgaW4gQiwgaS5lLiB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seSBmb2xsb3cgdW5jYXNlZFxcbmNoYXJhY3RlcnMgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIG9ubHkgY2FzZWQgb25lcy4gUmV0dXJuIEZhbHNlXFxub3RoZXJ3aXNlLlwifSxcbmlzdXBwZXI6eyRtZXRoOkIoQSx1KSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc3VwcGVyKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIEIgYXJlIHVwcGVyY2FzZSBhbmQgdGhlcmUgaXNcXG5hdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0sam9pbjp7JG1ldGgoYSl7Y29uc3QgYj1bXTtsZXQgYz0wO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcXVlbmNlIGl0ZW0gXCIrYytcIjogZXhwZWN0ZWQgYSBieXRlcy1saWtlIG9iamVjdCwgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgZm91bmRcIik7YysrO2IubGVuZ3RoJiZiLnB1c2goLi4udGhpcy52KTtiLnB1c2goLi4uYS52KX0pLFxuKCk9Pm5ldyBTay5idWlsdGluLmJ5dGVzKG5ldyBVaW50OEFycmF5KGIpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgaXRlcmFibGVfb2ZfYnl0ZXMsIC8pXCIsJGRvYzpcIkNvbmNhdGVuYXRlIGFueSBudW1iZXIgb2YgYnl0ZXMgb2JqZWN0cy5cXG5cXG5UaGUgYnl0ZXMgd2hvc2UgbWV0aG9kIGlzIGNhbGxlZCBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIGVhY2ggcGFpci5cXG5cXG5UaGUgcmVzdWx0IGlzIHJldHVybmVkIGFzIGEgbmV3IGJ5dGVzIG9iamVjdC5cXG5cXG5FeGFtcGxlOiBiJy4nLmpvaW4oW2InYWInLCBiJ3BxJywgYidycyddKSAtPiBiJ2FiLnBxLnJzJy5cIn0sbGp1c3Q6eyRtZXRoOmsoXCJsanVzdFwiLCExLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBCIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sXG5sb3dlcjp7JG1ldGg6RChhPT5BKGEpP2ErMzI6YSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIubG93ZXIoKSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gYSBjb3B5IG9mIEIgd2l0aCBhbGwgQVNDSUkgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlwifSxsc3RyaXA6eyRtZXRoOm4oITAsITEpLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGJ5dGVzPU5vbmUsIC8pXCIsJGRvYzpcIlN0cmlwIGxlYWRpbmcgYnl0ZXMgY29udGFpbmVkIGluIHRoZSBhcmd1bWVudC5cXG5cXG5JZiB0aGUgYXJndW1lbnQgaXMgb21pdHRlZCBvciBOb25lLCBzdHJpcCBsZWFkaW5nICBBU0NJSSB3aGl0ZXNwYWNlLlwifSxwYXJ0aXRpb246eyRtZXRoOmcoITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIGJ5dGVzIGludG8gdGhyZWUgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci5cXG5cXG5UaGlzIHdpbGwgc2VhcmNoIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiB0aGUgYnl0ZXMuIElmIHRoZSBzZXBhcmF0b3IgaXMgZm91bmQsXFxucmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxcbml0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBieXRlc1xcbm9iamVjdCBhbmQgdHdvIGVtcHR5IGJ5dGVzIG9iamVjdHMuXCJ9LFxucmVwbGFjZTp7JG1ldGgoYSxiLGMpe2E9dGhpcy5nZXQkcmF3KGEpO2I9dGhpcy5nZXQkcmF3KGIpO2M9dm9pZCAwPT09Yz8tMTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYyxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2M9MD5jP0luZmluaXR5OmM7Y29uc3QgZD1bXTtsZXQgZT0wO2Zvcih2YXIgZj0wO2Y8dGhpcy52Lmxlbmd0aCYmZTxjOyl7Y29uc3QgYz10aGlzLmZpbmQkc3VibGVmdChhLGYsdGhpcy52Lmxlbmd0aCk7aWYoLTE9PT1jKWJyZWFrO2Zvcig7ZjxjO2YrKylkLnB1c2godGhpcy52W2ZdKTtkLnB1c2goLi4uYik7Zj1jK2EubGVuZ3RoO2UrK31mb3IoZjtmPHRoaXMudi5sZW5ndGg7ZisrKWQucHVzaCh0aGlzLnZbZl0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhuZXcgVWludDhBcnJheShkKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIG9sZCwgbmV3LCBjb3VudD0tMSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgb2xkIHJlcGxhY2VkIGJ5IG5ldy5cXG5cXG4gIGNvdW50XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIHRvIHJlcGxhY2UuXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMuXFxuXFxuSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGNvdW50IGlzIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBjb3VudCBvY2N1cnJlbmNlcyBhcmVcXG5yZXBsYWNlZC5cIn0sXG5yZmluZDp7JG1ldGgoYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRyaWdodChhLGIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJldHVybiAtMSBvbiBmYWlsdXJlLlwifSxyaW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRyaWdodChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzZWN0aW9uIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sXG4kZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLlwifSxyanVzdDp7JG1ldGg6ayhcInJqdXN0XCIsITAsITEpLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIEIgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKVwifSxcbnJwYXJ0aXRpb246eyRtZXRoOmcoITApLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIGJ5dGVzIGludG8gdGhyZWUgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci5cXG5cXG5UaGlzIHdpbGwgc2VhcmNoIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiB0aGUgYnl0ZXMsIHN0YXJ0aW5nIGF0IHRoZSBlbmQuIElmXFxudGhlIHNlcGFyYXRvciBpcyBmb3VuZCwgcmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlXFxuc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHR3byBlbXB0eSBieXRlc1xcbm9iamVjdHMgYW5kIHRoZSBvcmlnaW5hbCBieXRlcyBvYmplY3QuXCJ9LHJzcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXsoe3NlcDphLFxubWF4c3BsaXQ6Yn09dGhpcy5nZXQkc3BsaXRBcmdzKGEsYikpO2NvbnN0IGM9W107bGV0IGQ9MCxlPXRoaXMudi5sZW5ndGg7aWYobnVsbCE9PWEpe2Zvcig7MDw9ZSYmZDxiOyl7Y29uc3QgYj10aGlzLmZpbmQkc3VicmlnaHQoYSwwLGUpO2lmKC0xPT09YilicmVhaztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGIrYS5sZW5ndGgsZSkpKTtlPWI7ZCsrfWMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxlKSkpfWVsc2V7Zm9yKGUtLTtkPGI7KXtmb3IoO3AodGhpcy52W2VdKTspZS0tO2lmKDA+ZSlicmVhazthPWUrMTtmb3IoZS0tOzA8PWUmJiFwKHRoaXMudltlXSk7KWUtLTtjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGUrMSxhKSkpO2QrK31pZigwPD1lKXtmb3IoO3AodGhpcy52W2VdKTspZS0tOzA8PWUmJmMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxcbmUrMSkpKX19cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYy5yZXZlcnNlKCkpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgYnl0ZXMsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBieXRlcy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IG9uIEFTQ0lJIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xcbiAgICAoc3BhY2UsIHRhYiwgcmV0dXJuLCBuZXdsaW5lLCBmb3JtZmVlZCwgdmVydGljYWwgdGFiKS5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cXG5cXG5TcGxpdHRpbmcgaXMgZG9uZSBzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBieXRlcyBhbmQgd29ya2luZyB0byB0aGUgZnJvbnQuXCJ9LFxucnN0cmlwOnskbWV0aDpuKCExLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBieXRlcz1Ob25lLCAvKVwiLCRkb2M6XCJTdHJpcCB0cmFpbGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LHNwbGl0OnskbWV0aDpmdW5jdGlvbihhLGIpeyh7c2VwOmEsbWF4c3BsaXQ6Yn09dGhpcy5nZXQkc3BsaXRBcmdzKGEsYikpO2NvbnN0IGM9W10sZD10aGlzLnYubGVuZ3RoO2xldCBlPTAsZj0wO2lmKG51bGwhPT1hKXtmb3IoO2Y8ZCYmZTxiOyl7Y29uc3QgYj10aGlzLmZpbmQkc3VibGVmdChhLGYsZCk7aWYoLTE9PT1iKWJyZWFrO2MucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoZixiKSkpO2Y9YithLmxlbmd0aDtlKyt9Yy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLFxuZCkpKX1lbHNle2Zvcig7ZTxiOyl7Zm9yKDtwKHRoaXMudltmXSk7KWYrKztpZihmPT09ZClicmVhazthPWY7Zm9yKGYrKztmPGQmJiFwKHRoaXMudltmXSk7KWYrKztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGEsZikpKTtlKyt9aWYoZjxkKXtmb3IoO3AodGhpcy52W2ZdKTspZisrO2Y8ZCYmYy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLGQpKSl9fXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgYnl0ZXMsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBieXRlcy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IG9uIEFTQ0lJIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xcbiAgICAoc3BhY2UsIHRhYiwgcmV0dXJuLCBuZXdsaW5lLCBmb3JtZmVlZCwgdmVydGljYWwgdGFiKS5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cIn0sXG5zcGxpdGxpbmVzOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmlzVHJ1ZShhKTtjb25zdCBiPVtdO2xldCBjPTA7bGV0IGQ9MDtjb25zdCBlPXRoaXMudi5sZW5ndGg7Zm9yKDtkPGU7KXt2YXIgZj10aGlzLnZbZF07aWYoMTM9PT1mKXtjb25zdCBlPTEwPT09dGhpcy52W2QrMV07Zj1hP2U/ZCsyOmQrMTpkO2IucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYyxmKSkpO2Q9Yz1lP2QrMjpkKzF9ZWxzZSAxMD09PWY/KGY9YT9kKzE6ZCxiLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGMsZikpKSxkPWM9ZCsxKTpkKyt9YzxlJiZiLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGMsZSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wia2VlcGVuZHNcIl0sRGVmYXVsdHM6WyExXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGtlZXBlbmRzPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgYnl0ZXMsIGJyZWFraW5nIGF0IGxpbmUgYm91bmRhcmllcy5cXG5cXG5MaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHMgaXMgZ2l2ZW4gYW5kXFxudHJ1ZS5cIn0sXG5zdGFydHN3aXRoOnskbWV0aDpoKFwic3RhcnRzd2l0aFwiLChhLGIpPT5iLmxlbmd0aDw9YS5sZW5ndGgmJmIuZXZlcnkoKGIsYyk9PmI9PT1hW2NdKSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cXG5XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXFxuV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cXG5wcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBieXRlcyB0byB0cnkuXCJ9LHN0cmlwOnskbWV0aDpuKCEwLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBieXRlcz1Ob25lLCAvKVwiLCRkb2M6XCJTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LFxuc3dhcGNhc2U6eyRtZXRoOkQoYT0+QShhKT9hKzMyOnUoYSk/YS0zMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5zd2FwY2FzZSgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIHVwcGVyY2FzZSBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZFxcbnRvIGxvd2VyY2FzZSBBU0NJSSBhbmQgdmljZSB2ZXJzYS5cIn0sdGl0bGU6eyRtZXRoKCl7Y29uc3QgYT10aGlzLnYubGVuZ3RoLGI9bmV3IFVpbnQ4QXJyYXkoYSk7bGV0IGM9ITE7Zm9yKGxldCBkPTA7ZDxhO2QrKyl7Y29uc3QgYT10aGlzLnZbZF07QShhKT8oYltkXT1jP2ErMzI6YSxjPSEwKTp1KGEpPyhiW2RdPWM/YTphLTMyLGM9ITApOihiW2RdPWEsYz0hMSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi50aXRsZSgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiBCLCBpLmUuIEFTQ0lJIHdvcmRzIHN0YXJ0IHdpdGggdXBwZXJjYXNlXFxuY2hhcmFjdGVycywgYWxsIHJlbWFpbmluZyBjYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXJjYXNlLlwifSxcbnVwcGVyOnskbWV0aDpEKGE9PnUoYSk/YS0zMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi51cHBlcigpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIGFsbCBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuXCJ9LHpmaWxsOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7Y29uc3QgYj1hLXRoaXMudi5sZW5ndGg7aWYoMD49YilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtjb25zdCBjPW5ldyBVaW50OEFycmF5KGEpO2xldCBkPTAsZTtpZig0Mz09PXRoaXMudlswXXx8NDU9PT10aGlzLnZbMF0pY1swXT10aGlzLnZbMF0sZCsrO2MuZmlsbCg0OCxkLGQrYik7ZT1kO2ZvcihkKz1iO2Q8YTtkKyssZSsrKWNbZF09dGhpcy52W2VdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiQi56ZmlsbCh3aWR0aCkgLT4gY29weSBvZiBCXFxuXFxuUGFkIGEgbnVtZXJpYyBzdHJpbmcgQiB3aXRoIHplcm9zIG9uIHRoZSBsZWZ0LCB0byBmaWxsIGEgZmllbGRcXG5vZiB0aGUgc3BlY2lmaWVkIHdpZHRoLiAgQiBpcyBuZXZlciB0cnVuY2F0ZWQuXCJ9fSxjbGFzc21ldGhvZHM6e2Zyb21oZXg6eyRtZXRoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYil7Zm9yKGxldCBjPWY7YzxiO2MrPTIpe2xldCBiPWEuc3Vic3RyKGMsMik7aWYoIWQudGVzdChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibm9uLWhleGFkZWNpbWFsIG51bWJlciBmb3VuZCBpbiBmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uIFwiKyhjKzEpKTtlLnB1c2gocGFyc2VJbnQoYiwxNikpfX1pZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmcm9taGV4KCkgYXJndW1lbnQgbXVzdCBiZSBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7XG5hPWEuJGpzc3RyKCk7Y29uc3QgYz0vXFxzKy9nLGQ9L15bYWJjZGVmQUJDREVGMDEyMzQ1Njc4OV17Mn0kLyxlPVtdO2xldCBmPTAsZztmb3IoO251bGwhPT0oZz1jLmV4ZWMoYSkpOyliKGcuaW5kZXgpLGY9Yy5sYXN0SW5kZXg7YihhLmxlbmd0aCk7cmV0dXJuIG5ldyB0aGlzKGUpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHR5cGUsIHN0cmluZywgLylcIiwkZG9jOlwiQ3JlYXRlIGEgYnl0ZXMgb2JqZWN0IGZyb20gYSBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgbnVtYmVycy5cXG5cXG5TcGFjZXMgYmV0d2VlbiB0d28gbnVtYmVycyBhcmUgYWNjZXB0ZWQuXFxuRXhhbXBsZTogYnl0ZXMuZnJvbWhleCgnQjkgMDFFRicpIC0+IGInXFxcXFxcXFx4YjlcXFxcXFxcXHgwMVxcXFxcXFxceGVmJy5cIn19fSk7dmFyIEc9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiYnl0ZXNfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe2NvbnN0IGE9XG50aGlzLiRzZXFbdGhpcy4kaW5kZXgrK107aWYodm9pZCAwIT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5ieXRlc1wiLFNrLmJ1aWx0aW4uYnl0ZXMpfSxmdW5jdGlvbihtLHEsYSl7KGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIGMoKXt9dmFyIGw9U3RyaW5nLmZyb21DaGFyQ29kZSxoPXt9LnRvU3RyaW5nLGQ9aC5jYWxsKGEuU2hhcmVkQXJyYXlCdWZmZXIpLGc9aCgpLG49YS5VaW50OEFycmF5LGs9bnx8QXJyYXkscD1uP0FycmF5QnVmZmVyOmssdT1wLmlzVmlld3x8ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwibGVuZ3RoXCJpbiBhfSxBPWguY2FsbChwLnByb3RvdHlwZSk7cD1jLnByb3RvdHlwZTtcbnZhciB0PWEuVGV4dEVuY29kZXIsbT1uZXcgKG4/VWludDE2QXJyYXk6aykoMzIpO2IucHJvdG90eXBlLmRlY29kZT1mdW5jdGlvbihhKXtpZighdShhKSl7dmFyIGI9aC5jYWxsKGEpO2lmKGIhPT1BJiZiIT09ZCYmYiE9PWcpdGhyb3cgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ2RlY29kZScgb24gJ1RleHREZWNvZGVyJzogVGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7YT1uP25ldyBrKGEpOmF8fFtdfWZvcih2YXIgYz1iPVwiXCIsZT0wLGY9YS5sZW5ndGh8MCxwPWYtMzJ8MCxCLHQsdj0wLHE9MCxQLFE9MCxVPS0xO2U8Zjspe2ZvcihCPWU8PXA/MzI6Zi1lfDA7UTxCO2U9ZSsxfDAsUT1RKzF8MCl7dD1hW2VdJjI1NTtzd2l0Y2godD4+NCl7Y2FzZSAxNTpQPWFbZT1lKzF8MF0mMjU1O2lmKDIhPT1QPj42fHwyNDc8dCl7ZT1lLTF8MDticmVha312PSh0JjcpPDw2fFAmNjM7cT01O3Q9MjU2O2Nhc2UgMTQ6UD1cbmFbZT1lKzF8MF0mMjU1LHY8PD02LHZ8PSh0JjE1KTw8NnxQJjYzLHE9Mj09PVA+PjY/cSs0fDA6MjQsdD10KzI1NiY3Njg7Y2FzZSAxMzpjYXNlIDEyOlA9YVtlPWUrMXwwXSYyNTUsdjw8PTYsdnw9KHQmMzEpPDw2fFAmNjMscT1xKzd8MCxlPGYmJjI9PT1QPj42JiZ2Pj5xJiYxMTE0MTEyPnY/KHQ9dix2PXYtNjU1MzZ8MCwwPD12JiYoVT0odj4+MTApKzU1Mjk2fDAsdD0odiYxMDIzKSs1NjMyMHwwLDMxPlE/KG1bUV09VSxRPVErMXwwLFU9LTEpOihQPVUsVT10LHQ9UCkpKToodD4+PTgsZT1lLXQtMXwwLHQ9NjU1MzMpLHY9cT0wLEI9ZTw9cD8zMjpmLWV8MDtkZWZhdWx0Om1bUV09dDtjb250aW51ZTtjYXNlIDExOmNhc2UgMTA6Y2FzZSA5OmNhc2UgODp9bVtRXT02NTUzM31jKz1sKG1bMF0sbVsxXSxtWzJdLG1bM10sbVs0XSxtWzVdLG1bNl0sbVs3XSxtWzhdLG1bOV0sbVsxMF0sbVsxMV0sbVsxMl0sbVsxM10sbVsxNF0sbVsxNV0sbVsxNl0sbVsxN10sbVsxOF0sbVsxOV0sbVsyMF0sXG5tWzIxXSxtWzIyXSxtWzIzXSxtWzI0XSxtWzI1XSxtWzI2XSxtWzI3XSxtWzI4XSxtWzI5XSxtWzMwXSxtWzMxXSk7MzI+USYmKGM9Yy5zbGljZSgwLFEtMzJ8MCkpO2lmKGU8Zil7aWYobVswXT1VLFE9flU+Pj4zMSxVPS0xLGMubGVuZ3RoPGIubGVuZ3RoKWNvbnRpbnVlfWVsc2UtMSE9PVUmJihjKz1sKFUpKTtiKz1jO2M9XCJcIn1yZXR1cm4gYn07cC5lbmNvZGU9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hP1wiXCI6XCJcIithO3ZhciBiPWEubGVuZ3RofDAsYz1uZXcgaygoYjw8MSkrOHwwKSxkLGU9MCxmPSFuO2ZvcihkPTA7ZDxiO2Q9ZCsxfDAsZT1lKzF8MCl7dmFyIGc9YS5jaGFyQ29kZUF0KGQpfDA7aWYoMTI3Pj1nKWNbZV09ZztlbHNle2lmKDIwNDc+PWcpY1tlXT0xOTJ8Zz4+NjtlbHNle2E6e2lmKDU1Mjk2PD1nKWlmKDU2MzE5Pj1nKXt2YXIgaD1hLmNoYXJDb2RlQXQoZD1kKzF8MCl8MDtpZig1NjMyMDw9aCYmNTczNDM+PWgpe2c9KGc8PDEwKStoLTU2NjEzODg4fDA7aWYoNjU1MzU8XG5nKXtjW2VdPTI0MHxnPj4xODtjW2U9ZSsxfDBdPTEyOHxnPj4xMiY2MztjW2U9ZSsxfDBdPTEyOHxnPj42JjYzO2NbZT1lKzF8MF09MTI4fGcmNjM7Y29udGludWV9YnJlYWsgYX1nPTY1NTMzfWVsc2UgNTczNDM+PWcmJihnPTY1NTMzKTshZiYmZDw8MTxlJiZkPDwxPChlLTd8MCkmJihmPSEwLGg9bmV3IGsoMypiKSxoLnNldChjKSxjPWgpfWNbZV09MjI0fGc+PjEyO2NbZT1lKzF8MF09MTI4fGc+PjYmNjN9Y1tlPWUrMXwwXT0xMjh8ZyY2M319cmV0dXJuIG4/Yy5zdWJhcnJheSgwLGUpOmMuc2xpY2UoMCxlKX07dHx8KGEuVGV4dERlY29kZXI9YixhLlRleHRFbmNvZGVyPWMpfSkoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGE/XCJ1bmRlZmluZWRcIj09dHlwZW9mIHNlbGY/dGhpczpzZWxmOmEpfSkuY2FsbCh0aGlzLGEoMCkpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4udHVwbGU9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInR1cGxlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PVxuYT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSxcImJhZCBjYWxsIHRvIHR1cGxlLCB1c2UgJ25ldycgd2l0aCBhbiBBcnJheSBvZiBweXRob24gb2JqZWN0c1wiKTt0aGlzLnY9YTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGRvYzpcIkJ1aWx0LWluIGltbXV0YWJsZSBzZXF1ZW5jZS5cXG5cXG5JZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIHJldHVybnMgYW4gZW1wdHkgdHVwbGUuXFxuSWYgaXRlcmFibGUgaXMgc3BlY2lmaWVkIHRoZSB0dXBsZSBpcyBpbml0aWFsaXplZCBmcm9tIGl0ZXJhYmxlJ3MgaXRlbXMuXFxuXFxuSWYgdGhlIGFyZ3VtZW50IGlzIGEgdHVwbGUsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgb2JqZWN0LlwiLFxuJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIiguLi4pXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT10aGlzLnYubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3RoaXMuaW4kcmVwcj0hMTthPWEuam9pbihcIiwgXCIpOzE9PT10aGlzLnYubGVuZ3RoJiYoYSs9XCIsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCIoXCIrYStcIilcIil9LHRwJG5ldyhhLGIpe2lmKHRoaXMhPT1Tay5idWlsdGluLnR1cGxlLnByb3RvdHlwZSlyZXR1cm4gdGhpcy4kc3VidHlwZV9uZXcoYSxiKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwidHVwbGVcIixiKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJ0dXBsZVwiLGEsMCwxKTthPWFbMF07cmV0dXJuIHZvaWQgMD09PWE/bmV3IFNrLmJ1aWx0aW4udHVwbGUoW10pOmEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnR1cGxlP2E6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSxcbiEwKSxhPT5uZXcgU2suYnVpbHRpbi50dXBsZShhKSl9LHRwJGhhc2goKXtsZXQgYSxiPTM0MzAwMDgsZT0xMDAwMDAzO2NvbnN0IGY9dGhpcy52Lmxlbmd0aDtmb3IobGV0IGM9MDtjPGY7KytjKXthPVNrLmFic3RyLm9iamVjdEhhc2godGhpcy52W2NdKTtpZigtMT09PWEpcmV0dXJuLTE7Yj0oYl5hKSplO2UrPTgyNTIwK2YrZn1iKz05NzUzMTstMT09PWImJihiPS0yKTtyZXR1cm4gYnwwfSx0cCRyaWNoY29tcGFyZTpTay5nZW5lcmljLnNlcUNvbXBhcmUsdHAkaXRlcigpe3JldHVybiBuZXcgYSh0aGlzKX0sbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpOzA+YSYmKGE9dGhpcy52Lmxlbmd0aCthKTtpZigwPmF8fGE+PXRoaXMudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcInR1cGxlIGluZGV4IG91dCBvZiByYW5nZVwiKTtyZXR1cm4gdGhpcy52W2FdfWlmKGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zbGljZSl7Y29uc3QgYj1bXTthLnNzc2l0ZXIkKHRoaXMudi5sZW5ndGgsYT0+e2IucHVzaCh0aGlzLnZbYV0pfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR1cGxlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy52Lmxlbmd0aH0sc3EkcmVwZWF0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigxPT09YSYmdGhpcy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4udHVwbGUpcmV0dXJuIHRoaXM7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGE7YysrKWZvcihsZXQgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspYi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfSxzcSRjb25jYXQoYSl7aWYoIShhIGluc3RhbmNlb2ZcblNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGNvbmNhdGVuYXRlIHR1cGxlIChub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJykgdG8gdHVwbGVcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMudi5jb25jYXQoYS52KSl9LHNxJGNvbnRhaW5zKGEpe2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKWlmKGM9PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFwiRXFcIikpcmV0dXJuITA7cmV0dXJuITF9fSxwcm90bzp7JHN1YnR5cGVfbmV3KGEsYil7Yj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4udHVwbGUucHJvdG90eXBlLnRwJG5ldyhhKTtiLnY9YS52O3JldHVybiBifSxzayRhc2FycmF5KCl7cmV0dXJuIHRoaXMudi5zbGljZSgwKX19LG1ldGhvZHM6e19fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnYuc2xpY2UoMCkpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOm51bGx9LGluZGV4OnskbWV0aChhLGIsZSl7aWYodm9pZCAwIT09YiYmIVNrLm1pc2NldmFsLmlzSW5kZXgoYil8fHZvaWQgMCE9PWUmJiFTay5taXNjZXZhbC5pc0luZGV4KGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik7KHtzdGFydDpiLGVuZDplfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGIsZSkpO2NvbnN0IGM9dGhpcy52O2Zvcig7YjxlO2IrKylpZihjW2JdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbYl0sYSxcIkVxXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJ0dXBsZS5pbmRleCh4KTogeCBub3QgaW4gdHVwbGVcIik7fSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LFxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBzdGFydD0wLCBzdG9wPXN5cy5tYXhzaXplLCAvKVwiLCRkb2M6XCJSZXR1cm4gZmlyc3QgaW5kZXggb2YgdmFsdWUuXFxuXFxuUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifSxjb3VudDp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLnYubGVuZ3RoLGM9dGhpcy52O2xldCBmPTA7Zm9yKGxldCBlPTA7ZTxiOysrZSlpZihjW2VdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbZV0sYSxcIkVxXCIpKWYrPTE7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGRvYzpcIlJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWUuXCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4udHVwbGVcIixTay5idWlsdGluLnR1cGxlKTt2YXIgYT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJ0dXBsZV9pdGVyYXRvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEuc2skYXNhcnJheSgpfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSl7bGV0IGI9YS4kc2F2ZWRLZXlIYXNoO3JldHVybiB2b2lkIDAhPT1iP2I6Yj1Tay5hYnN0ci5vYmplY3RIYXNoKGEpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnNldChTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSl9ZnVuY3Rpb24gYihhLGIpe2ZvcihsZXQgYz1Tay5hYnN0ci5pdGVyKGEpLGQ9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1jLnRwJGl0ZXJuZXh0KCkpaWYoIVNrLmFic3RyLnNlcXVlbmNlQ29udGFpbnMoYixcbmQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGUoYSxiLGQpe2NvbnN0IGU9e2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe2lmKDEhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjcmVhdGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBpbnN0YW5jZXNcIik7dGhpcy5kaWN0PWE7dGhpcy5pbiRyZXByPSExfX07ZS5zbG90cz1PYmplY3QuYXNzaWduKGIsaCk7ZS5tZXRob2RzPXtpc2Rpc2pvaW50OnskbWV0aChhKXtjb25zdCBiPWModGhpcyk7cmV0dXJuIGIuaXNkaXNqb2ludC4kbWV0aC5jYWxsKGIsYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgdmlldyBhbmQgdGhlIGdpdmVuIGl0ZXJhYmxlIGhhdmUgYSBudWxsIGludGVyc2VjdGlvbi5cIn0sX19yZXZlcnNlZF9fOnskbWV0aDpkLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Qga2V5cy5cIn19O1xuZS5mbGFncz17c2skYWNjZXB0YWJsZV9hc19iYXNlOiExfTtcImRpY3RfdmFsdWVzXCI9PT1hJiYoZGVsZXRlIGUuc2xvdHMudHAkYXNfbnVtYmVyLGRlbGV0ZSBlLnNsb3RzLnRwJHJpY2hjb21wYXJlKTtyZXR1cm4gU2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhhLGUpfWZ1bmN0aW9uIGYoYSxiLGMpe3JldHVybiBTay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoYSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRvcmlnPWE7dGhpcy50cCRpdGVybmV4dD0oKT0+e3RoaXMuJHNlcT1hLiRpdGVtcygpO3RoaXMuJHZlcnNpb249YS4kdmVyc2lvbjtjJiYodGhpcy4kc2VxPXRoaXMuJHNlcS5yZXZlcnNlKCkpO3RoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQ7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoKX19LGl0ZXJuZXh0OmIsbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LFxuZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX0scHJvdG86e25leHQkaXRlbTpsfX0pfWZ1bmN0aW9uIGwoKXtpZih0aGlzLiR2ZXJzaW9uIT09dGhpcy4kb3JpZy4kdmVyc2lvbil7aWYodGhpcy4kbGVuIT09dGhpcy4kb3JpZy5nZXQkc2l6ZSgpKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcImRpY3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb25cIik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKFwiZGljdGlvbmFyeSBrZXlzIGNoYW5nZWQgZHVyaW5nIGl0ZXJhdGlvblwiKTt9cmV0dXJuIHRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXX1Tay5idWlsdGluLmRpY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImRpY3RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9W10pO1NrLmFzc2VydHMuYXNzZXJ0KEFycmF5LmlzQXJyYXkoYSkmJjA9PT1hLmxlbmd0aCUyJiZ0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0LFxuXCJiYWQgY2FsbCB0byBkaWN0IGNvbnN0cnVjdG9yXCIpO3RoaXMuc2l6ZT0wO3RoaXMuZW50cmllcz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuYnVja2V0cz17fTtmb3IobGV0IGI9MDtiPGEubGVuZ3RoO2IrPTIpdGhpcy5zZXQkaXRlbShhW2JdLGFbYisxXSk7dGhpcy5pbiRyZXByPSExO3RoaXMuJHZlcnNpb249MH0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkYXNfbnVtYmVyOiEwLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJGRvYzpcImRpY3QoKSAtPiBuZXcgZW1wdHkgZGljdGlvbmFyeVxcbmRpY3QobWFwcGluZykgLT4gbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgZnJvbSBhIG1hcHBpbmcgb2JqZWN0J3NcXG4gICAgKGtleSwgdmFsdWUpIHBhaXJzXFxuZGljdChpdGVyYWJsZSkgLT4gbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgYXMgaWYgdmlhOlxcbiAgICBkID0ge31cXG4gICAgZm9yIGssIHYgaW4gaXRlcmFibGU6XFxuICAgICAgICBkW2tdID0gdlxcbmRpY3QoKiprd2FyZ3MpIC0+IG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIHdpdGggdGhlIG5hbWU9dmFsdWUgcGFpcnNcXG4gICAgaW4gdGhlIGtleXdvcmQgYXJndW1lbnQgbGlzdC4gIEZvciBleGFtcGxlOiAgZGljdChvbmU9MSwgdHdvPTIpXCIsXG4kcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiey4uLn1cIik7dGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy4kaXRlbXMoKS5tYXAoKFthLGJdKT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIjogXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihiKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJ7XCIrYS5qb2luKFwiLCBcIikrXCJ9XCIpfSx0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGIpe3JldHVybiB0aGlzLnVwZGF0ZSRjb21tb24oYSxiLFwiZGljdFwiKX0sdHAkaXRlcigpe3JldHVybiBuZXcgayh0aGlzKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtsZXQgYztpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpfHxcIkVxXCIhPT1iJiZcIk5vdEVxXCIhPT1iKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtpZihhPT09dGhpcyljPSEwO2Vsc2UgaWYodGhpcy5zaXplIT09XG5hLnNpemUpYz0hMTtlbHNle2xldCBiO2M9dGhpcy4kaXRlbXMoKS5ldmVyeSgoW2MsZF0pPT57Yj1hLm1wJGxvb2t1cChjKTtyZXR1cm4gdm9pZCAwIT09YiYmKGI9PT1kfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZCxiLFwiRXFcIikpfSl9cmV0dXJuXCJFcVwiPT09Yj9jOiFjfSxuYiRvcihhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBiPXRoaXMuZGljdCRjb3B5KCk7Yi5kaWN0JG1lcmdlKGEpO3JldHVybiBifSxuYiRyZWZsZWN0ZWRfb3IoYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7YT1hLmRpY3QkY29weSgpO2EuZGljdCRtZXJnZSh0aGlzKTtyZXR1cm4gYX0sbmIkaW5wbGFjZV9vcihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy51cGRhdGUkb25lYXJnKGEpLFxuKCk9PnRoaXMpfSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy5nZXQkc2l6ZSgpfSxzcSRjb250YWlucyhhKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5tcCRsb29rdXAoYSl9LG1wJHN1YnNjcmlwdChhLGIpe3ZhciBjPXRoaXMubXAkbG9va3VwKGEpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7Yz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKHRoaXMsU2suYnVpbHRpbi5zdHIuJG1pc3NpbmcpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGE9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW2FdKSxiP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sbXAkYXNzX3N1YnNjcmlwdChhLGIpe2lmKHZvaWQgMD09PWIpe2lmKHZvaWQgMD09PXRoaXMucG9wJGl0ZW0oYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7fWVsc2UgdGhpcy5zZXQkaXRlbShhLGIpfX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgQSh0aGlzKX0sXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBkaWN0IGtleXMuXCJ9LGdldDp7JG1ldGgoYSxiKXtyZXR1cm4gdGhpcy5tcCRsb29rdXAoYSl8fGJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgdmFsdWUgZm9yIGtleSBpZiBrZXkgaXMgaW4gdGhlIGRpY3Rpb25hcnksIGVsc2UgZGVmYXVsdC5cIn0sc2V0ZGVmYXVsdDp7JG1ldGgoYixjKXtsZXQgZDtjb25zdCBlPWEoYik7ZD1cInN0cmluZ1wiPT09dHlwZW9mIGU/dGhpcy5lbnRyaWVzW2VdOnRoaXMuZ2V0JGJ1Y2tldF9pdGVtKGIsZSk7aWYodm9pZCAwIT09ZClyZXR1cm4gZFsxXTtjPWN8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtcInN0cmluZ1wiPT09dHlwZW9mIGU/dGhpcy5lbnRyaWVzW2VdPVtiLGNdOlxudGhpcy5zZXQkYnVja2V0X2l0ZW0oYixjLGUpO3RoaXMuc2l6ZSsrO3RoaXMuJHZlcnNpb24rKztyZXR1cm4gY30sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUsIC8pXCIsJGRvYzpcIkluc2VydCBrZXkgd2l0aCBhIHZhbHVlIG9mIGRlZmF1bHQgaWYga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS5cXG5cXG5SZXR1cm4gdGhlIHZhbHVlIGZvciBrZXkgaWYga2V5IGlzIGluIHRoZSBkaWN0aW9uYXJ5LCBlbHNlIGRlZmF1bHQuXCJ9LHBvcDp7JG1ldGgoYSxiKXtjb25zdCBjPXRoaXMucG9wJGl0ZW0oYSk7aWYodm9pZCAwIT09YylyZXR1cm4gY1sxXTtpZih2b2lkIDAhPT1iKXJldHVybiBiO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS5cXG5JZiBrZXkgaXMgbm90IGZvdW5kLCBkIGlzIHJldHVybmVkIGlmIGdpdmVuLCBvdGhlcndpc2UgS2V5RXJyb3IgaXMgcmFpc2VkXCJ9LFxucG9waXRlbTp7JG1ldGgoKXtjb25zdCBhPXRoaXMuZ2V0JHNpemUoKTtpZigwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihcInBvcGl0ZW0oKTogZGljdGlvbmFyeSBpcyBlbXB0eVwiKTtjb25zdCBbYixjXT10aGlzLiRpdGVtcygpW2EtMV07dGhpcy5wb3AkaXRlbShiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2IsY10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5wb3BpdGVtKCkgLT4gKGssIHYpLCByZW1vdmUgYW5kIHJldHVybiBzb21lIChrZXksIHZhbHVlKSBwYWlyIGFzIGFcXG4yLXR1cGxlOyBidXQgcmFpc2UgS2V5RXJyb3IgaWYgRCBpcyBlbXB0eS5cIn0sa2V5czp7JG1ldGgoKXtyZXR1cm4gbmV3IGQodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmtleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBrZXlzXCJ9LGl0ZW1zOnskbWV0aCgpe3JldHVybiBuZXcgbih0aGlzKX0sXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5pdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zXCJ9LHZhbHVlczp7JG1ldGgoKXtyZXR1cm4gbmV3IGcodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn0sdXBkYXRlOnskbWV0aChhLGIpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZSRjb21tb24oYSxiLFwidXBkYXRlXCIpLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnVwZGF0ZShbRSwgXSoqRikgLT4gTm9uZS4gIFVwZGF0ZSBEIGZyb20gZGljdC9pdGVyYWJsZSBFIGFuZCBGLlxcbklmIEUgaXMgcHJlc2VudCBhbmQgaGFzIGEgLmtleXMoKSBtZXRob2QsIHRoZW4gZG9lczogIGZvciBrIGluIEU6IERba10gPSBFW2tdXFxuSWYgRSBpcyBwcmVzZW50IGFuZCBsYWNrcyBhIC5rZXlzKCkgbWV0aG9kLCB0aGVuIGRvZXM6ICBmb3IgaywgdiBpbiBFOiBEW2tdID0gdlxcbkluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiBmb3IgayBpbiBGOiAgRFtrXSA9IEZba11cIn0sXG5jbGVhcjp7JG1ldGgoKXt0aGlzLnNpemU9MDt0aGlzLiR2ZXJzaW9uKys7dGhpcy5lbnRyaWVzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5idWNrZXRzPXt9fSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5jbGVhcigpIC0+IE5vbmUuICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gRC5cIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gdGhpcy5kaWN0JGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIERcIn19LGNsYXNzbWV0aG9kczp7ZnJvbWtleXM6eyRtZXRoOmZ1bmN0aW9uKGEsYil7Yj1ifHxTay5idWlsdGluLm5vbmUubm9uZSQ7bGV0IGM9dGhpcz09PVNrLmJ1aWx0aW4uZGljdD9uZXcgdGhpczp0aGlzLnRwJGNhbGwoW10sW10pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGQ9PntjPWQ7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT5cbmMubXAkYXNzX3N1YnNjcmlwdChhLGIsITApKX0sKCk9PmMpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCR0eXBlLCBpdGVyYWJsZSwgdmFsdWU9Tm9uZSwgLylcIiwkZG9jOlwiQ3JlYXRlIGEgbmV3IGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gaXRlcmFibGUgYW5kIHZhbHVlcyBzZXQgdG8gdmFsdWUuXCJ9fSxwcm90bzp7cXVpY2skbG9va3VwOmZ1bmN0aW9uKGEpe2E9dGhpcy5lbnRyaWVzW2EuJHNhdmVkS2V5SGFzaF07aWYodm9pZCAwIT09YSlyZXR1cm4gYVsxXX0sbXAkbG9va3VwOmZ1bmN0aW9uKGIpe2NvbnN0IGM9YShiKTtiPVwic3RyaW5nXCI9PT10eXBlb2YgYz90aGlzLmVudHJpZXNbY106dGhpcy5nZXQkYnVja2V0X2l0ZW0oYixjKTtpZih2b2lkIDAhPT1iKXJldHVybiBiWzFdfSxnZXQkc2l6ZSgpe3JldHVybiB0aGlzLnNpemV9LHNrJGFzYXJyYXkoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmVudHJpZXMpLm1hcChhPT5hWzBdKX0sdXBkYXRlJGNvbW1vbjpmdW5jdGlvbihhLFxuYixjKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oYyxhLDAsMSk7YT1hWzBdO2xldCBkO3ZvaWQgMCE9PWEmJihkPXRoaXMudXBkYXRlJG9uZWFyZyhhKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGQsKCk9PntpZihiKWZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9Mil0aGlzLnNldCRpdGVtKG5ldyBTay5idWlsdGluLnN0cihiW2FdKSxiW2ErMV0pfSl9LHVwZGF0ZSRvbmVhcmcoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3R8fHZvaWQgMCE9PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyk/dGhpcy5kaWN0JG1lcmdlKGEpOnRoaXMuZGljdCRtZXJnZV9zZXEoYSl9LGRpY3QkY29weSgpe2NvbnN0IGE9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7YS5zaXplPXRoaXMuc2l6ZTt2YXIgYj1PYmplY3QuZW50cmllcyh0aGlzLmVudHJpZXMpO2Zvcih2YXIgYyBpbiBiKXt2YXIgZD1iW2NdWzFdO2EuZW50cmllc1tiW2NdWzBdXT1bZFswXSxcbmRbMV1dfWZvcihsZXQgZSBpbiB0aGlzLmJ1Y2tldHMpZm9yKGM9dGhpcy5idWNrZXRzW2VdLGEuYnVja2V0c1tlXT1iPVtdLGQ9MDtkPGMubGVuZ3RoO2QrKyliLnB1c2goYS5lbnRyaWVzW1wiI1wiK2UrXCJfXCIrZF0pO3JldHVybiBhfSwkaXRlbXMoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmVudHJpZXMpfSxzZXQkaXRlbTpmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YShiKTtsZXQgZTtcInN0cmluZ1wiPT09dHlwZW9mIGQ/KGU9dGhpcy5lbnRyaWVzW2RdLHZvaWQgMD09PWU/KHRoaXMuZW50cmllc1tkXT1bYixjXSx0aGlzLnNpemUrKyx0aGlzLiR2ZXJzaW9uKyspOmVbMV09Yyk6KGU9dGhpcy5nZXQkYnVja2V0X2l0ZW0oYixkKSx2b2lkIDA9PT1lPyh0aGlzLnNldCRidWNrZXRfaXRlbShiLGMsZCksdGhpcy5zaXplKyssdGhpcy4kdmVyc2lvbisrKTplWzFdPWMpfSxnZXQkYnVja2V0X2l0ZW06ZnVuY3Rpb24oYSxiKXtiPXRoaXMuYnVja2V0c1tiXTtpZih2b2lkIDAhPT1iKWZvcihsZXQgZD1cbjA7ZDxiLmxlbmd0aDtkKyspe3ZhciBjPWJbZF07aWYodm9pZCAwIT09YyYmKGNbMF09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjWzBdLFwiRXFcIikpKXJldHVybiBjfX0scG9wJGJ1Y2tldF9pdGVtOmZ1bmN0aW9uKGEsYil7Y29uc3QgYz10aGlzLmJ1Y2tldHNbYl07bGV0IGQ7aWYodm9pZCAwIT09Yylmb3IobGV0IGU9MDtlPGMubGVuZ3RoO2UrKylpZihkPWNbZV0sdm9pZCAwIT09ZCYmKGRbMF09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxkWzBdLFwiRXFcIikpKXJldHVybiBkZWxldGUgdGhpcy5lbnRyaWVzW1wiI1wiK2IrXCJfXCIrZV0sY1tlXT12b2lkIDAsYy5ldmVyeShhPT52b2lkIDA9PT1hKSYmZGVsZXRlIHRoaXMuYnVja2V0c1tiXSxkfSxzZXQkYnVja2V0X2l0ZW06ZnVuY3Rpb24oYSxiLGMpe2xldCBkPXRoaXMuYnVja2V0c1tjXTthPVthLGJdO3ZvaWQgMD09PWQ/KHRoaXMuYnVja2V0c1tjXT1bYV0sYz1cIiNcIitjK1wiXzBcIik6KGI9ZC5pbmRleE9mKHZvaWQgMCksXG4tMSE9PWI/KGM9XCIjXCIrYytcIl9cIitiLGRbYl09YSk6KGM9XCIjXCIrYytcIl9cIitkLmxlbmd0aCxkLnB1c2goYSkpKTt0aGlzLmVudHJpZXNbY109YX0scG9wJGl0ZW06ZnVuY3Rpb24oYil7Y29uc3QgYz1hKGIpO1wic3RyaW5nXCI9PT10eXBlb2YgYz8oYj10aGlzLmVudHJpZXNbY10sZGVsZXRlIHRoaXMuZW50cmllc1tjXSk6Yj10aGlzLnBvcCRidWNrZXRfaXRlbShiLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIHRoaXMuc2l6ZS0tLHRoaXMuJHZlcnNpb24rKyxifSxkaWN0JG1lcmdlOmZ1bmN0aW9uKGEpe2lmKGEudHAkaXRlcj09PVNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkaXRlcil7dmFyIGI9YS50cCRpdGVyKCk7Zm9yKGxldCBjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKXtjb25zdCBiPWEubXAkc3Vic2NyaXB0KGMpO3RoaXMuc2V0JGl0ZW0oYyxiKX19ZWxzZSByZXR1cm4gYj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGtleXMpLFxuU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGIsW10pLGI9PlNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihiKSxiPT5Tay5taXNjZXZhbC5jaGFpbihhLm1wJHN1YnNjcmlwdChiLCEwKSxhPT57dGhpcy5zZXQkaXRlbShiLGEpfSkpKX0sZGljdCRtZXJnZV9zZXE6ZnVuY3Rpb24oYSl7bGV0IGI9MDtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PntpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjb252ZXJ0IGRpY3Rpb25hcnkgdXBkYXRlIHNlcXVlbmNlIGVsZW1lbnQgI1wiK2IrXCIgdG8gYSBzZXF1ZW5jZVwiKTthPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpO2lmKDIhPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZGljdGlvbmFyeSB1cGRhdGUgc2VxdWVuY2UgZWxlbWVudCAjXCIrXG5iK1wiIGhhcyBsZW5ndGggXCIrYS5sZW5ndGgrXCI7IDIgaXMgcmVxdWlyZWRcIik7dGhpcy5zZXQkaXRlbShhWzBdLGFbMV0pO2IrK30pfX19KTtjb25zdCBoPXt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19udW1iZXI6ITAsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiLi4uXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZSh0aGlzKTthPWEubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3RoaXMuaW4kcmVwcj0hMTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKFtcIithLmpvaW4oXCIsIFwiKStcIl0pXCIpfSx0cCRyaWNoY29tcGFyZShhLGMpe2lmKCEoU2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8YSBpbnN0YW5jZW9mIGR8fFxuYSBpbnN0YW5jZW9mIG4pKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBlPXRoaXMuc3EkbGVuZ3RoKCksZj1hLnNxJGxlbmd0aCgpO3N3aXRjaChjKXtjYXNlIFwiTm90RXFcIjpjYXNlIFwiRXFcIjpsZXQgZDt0aGlzPT09YT9kPSEwOmU9PT1mJiYoZD1iKHRoaXMsYSkpO3JldHVyblwiTm90RXFcIj09PWM/IWQ6ZDtjYXNlIFwiTHRcIjpyZXR1cm4gZTxmJiZiKHRoaXMsYSk7Y2FzZSBcIkx0RVwiOnJldHVybiBlPD1mJiZiKHRoaXMsYSk7Y2FzZSBcIkd0XCI6cmV0dXJuIGU+ZiYmYihhLHRoaXMpO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZT49ZiYmYihhLHRoaXMpfX0sbmIkc3VidHJhY3QoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmRpZmZlcmVuY2UuJG1ldGguY2FsbChiLGEpfSxuYiRhbmQoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmludGVyc2VjdGlvbi4kbWV0aC5jYWxsKGIsYSl9LG5iJG9yKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi51bmlvbi4kbWV0aC5jYWxsKGIsXG5hKX0sbmIkeG9yKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi5zeW1tZXRyaWNfZGlmZmVyZW5jZS4kbWV0aC5jYWxsKGIsYSl9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmRpY3QuZ2V0JHNpemUoKX19O3ZhciBkPWUoXCJkaWN0X2tleXNcIix7c3EkY29udGFpbnMoYSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZGljdC5tcCRsb29rdXAoYSl9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGsodGhpcy5kaWN0KX19LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBKHRoaXMuZGljdCl9KSxnPWUoXCJkaWN0X3ZhbHVlc1wiLHt0cCRpdGVyKCl7cmV0dXJuIG5ldyB1KHRoaXMuZGljdCl9fSxmdW5jdGlvbigpe3JldHVybiBuZXcgdih0aGlzLmRpY3QpfSksbj1lKFwiZGljdF9pdGVtc1wiLHtzcSRjb250YWlucyhhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlJiYyPT09YS5zcSRsZW5ndGgoKSkpcmV0dXJuITE7dmFyIGI9YS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50XygwKSk7XG5hPWEubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLmludF8oMSkpO2I9dGhpcy5kaWN0Lm1wJGxvb2t1cChiKTtyZXR1cm4gdm9pZCAwPT09Yj8hMTpiPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsYSxcIkVxXCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBwKHRoaXMuZGljdCl9fSxmdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLmRpY3QpfSksaz1mKFwiZGljdF9rZXlpdGVyYXRvclwiLGZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLm5leHQkaXRlbSgpO3JldHVybiBhJiZhWzBdfSkscD1mKFwiZGljdF9pdGVtaXRlcmF0b3JcIixmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5uZXh0JGl0ZW0oKTtyZXR1cm4gYSYmbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2FbMF0sYVsxXV0pfSksdT1mKFwiZGljdF92YWx1ZWl0ZXJhdG9yXCIsZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMubmV4dCRpdGVtKCk7cmV0dXJuIGEmJmFbMV19KSxBPWYoXCJkaWN0X3JldmVyc2VrZXlpdGVyYXRvclwiLGsucHJvdG90eXBlLnRwJGl0ZXJuZXh0LFxuITApLHQ9ZihcImRpY3RfcmV2ZXJzZWl0ZW1pdGVyYXRvclwiLHAucHJvdG90eXBlLnRwJGl0ZXJuZXh0LCEwKSx2PWYoXCJkaWN0X3JldmVyc2V2YWx1ZWl0ZXJhdG9yXCIsdS5wcm90b3R5cGUudHAkaXRlcm5leHQsITApO1NrLmJ1aWx0aW4uZGljdC5weTIkbWV0aG9kcz17aGFzX2tleTp7JG5hbWU6XCJoYXNfa2V5XCIsJGZsYWdzOntPbmVBcmc6ITB9LCRtZXRoKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMuc3EkY29udGFpbnMoYSkpfSwkZG9jOlwiRC5oYXNfa2V5KGspIC0+IFRydWUgaWYgRCBoYXMgYSBrZXkgaywgZWxzZSBGYWxzZVwifSxrZXlzOnskbmFtZTpcImtleXNcIiwkbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMuc2skYXNhcnJheSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQua2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGtleXNcIn0saXRlbXM6eyRuYW1lOlwiaXRlbXNcIixcbiRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kaXRlbXMoKS5tYXAoKFthLGJdKT0+bmV3IFNrLmJ1aWx0aW4udHVwbGUoW2EsYl0pKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELml0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3MgaXRlbXNcIn0sdmFsdWVzOnskbmFtZTpcInZhbHVlc1wiLCRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kaXRlbXMoKS5tYXAoKFssYV0pPT5hKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn19fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhhLHtlbnRyaWVzOntnZXQ6KCk9Pntjb25zdCBhPU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2IsXG5jXSk9PntiPVNrLnVuZml4UmVzZXJ2ZWQoYik7Yi5pbmNsdWRlcyhcIiRcIil8fChiPW5ldyBTay5idWlsdGluLnN0cihiKSxhW2IuJHNhdmVkS2V5SGFzaF09W2IsY10pfSk7cmV0dXJuIGF9LGNvbmZpZ3VyYWJsZTohMH0sc2l6ZTp7Z2V0OigpPT5PYmplY3Qua2V5cyhiKS5tYXAoYT0+U2sudW5maXhSZXNlcnZlZChhKSkuZmlsdGVyKGE9PiFhLmluY2x1ZGVzKFwiJFwiKSkubGVuZ3RoLGNvbmZpZ3VyYWJsZTohMH19KX1Tay5idWlsdGluLm1hcHBpbmdwcm94eT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwibWFwcGluZ3Byb3h5XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGMpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSxcImJhZCBjYWxsIHRvIG1hcHBpbmcgcHJveHksIHVzZSAnbmV3J1wiKTt0aGlzLm1hcHBpbmc9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7dm9pZCAwIT09YyYmYSh0aGlzLm1hcHBpbmcsYyl9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cixcbnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1hcHBpbmdwcm94eVwiLGIpO1NrLmFic3RyLmNoZWNrT25lQXJnKFwibWFwcGluZ3Byb3h5XCIsYSxiKTthPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm1hcHBpbmdwcm94eSgpIGFyZ3VtZW50IG11c3QgYmUgYSBtYXBwaW5nLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2I9bmV3IFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5O2IubWFwcGluZz1hO3JldHVybiBifSx0cCRyaWNoY29tcGFyZShhLGIpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5tYXBwaW5nLGEsYil9LHRwJHN0cigpe3JldHVybiB0aGlzLm1hcHBpbmcudHAkc3RyKCl9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIm1hcHBpbmdwcm94eShcIitcblNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5tYXBwaW5nKStcIilcIil9LG1wJHN1YnNjcmlwdChhLGIpe3JldHVybiB0aGlzLm1hcHBpbmcubXAkc3Vic2NyaXB0KGEsYil9LHNxJGNvbnRhaW5zKGEpe3JldHVybiB0aGlzLm1hcHBpbmcuc3EkY29udGFpbnMoYSl9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLm1hcHBpbmcuc3EkbGVuZ3RoKCl9LHRwJGl0ZXIoKXtyZXR1cm4gdGhpcy5tYXBwaW5nLnRwJGl0ZXIoKX0sdHAkYXNfbnVtYmVyOiEwLG5iJG9yKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSYmKGE9YS5tYXBwaW5nKTtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy5tYXBwaW5nLGEsXCJCaXRPclwiKX0sbmIkcmVmbGVjdGVkX29yKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSYmKGE9YS5tYXBwaW5nKTtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYSx0aGlzLm1hcHBpbmcsXCJCaXRPclwiKX0sbmIkaW5wbGFjZV9vcihhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInfD0nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgXCIrXG5Tay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIjsgdXNlICd8JyBpbnN0ZWFkXCIpO319LG1ldGhvZHM6e2dldDp7JG1ldGgoYSxiKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGdldCksYSxiKX0sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5nZXQoa1ssZF0pIC0+IERba10gaWYgayBpbiBELCBlbHNlIGQuICBkIGRlZmF1bHRzIHRvIE5vbmUuXCJ9LGtleXM6eyRtZXRoKCl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLm1hcHBpbmcudHAkZ2V0YXR0cih0aGlzLnN0ciRrZXlzKSxbXSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmtleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBrZXlzXCJ9LGl0ZW1zOnskbWV0aCgpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5tYXBwaW5nLnRwJGdldGF0dHIodGhpcy5zdHIkaXRlbXMpLFxuW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5pdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zXCJ9LHZhbHVlczp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJHZhbHVlcyksW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC52YWx1ZXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGNvcHkpLFtdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIERcIn19LHByb3RvOntzdHIkZ2V0Om5ldyBTay5idWlsdGluLnN0cihcImdldFwiKSxcbnN0ciRjb3B5Om5ldyBTay5idWlsdGluLnN0cihcImNvcHlcIiksc3RyJGtleXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFwia2V5c1wiKSxzdHIkaXRlbXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiaXRlbXNcIiksc3RyJHZhbHVlczpuZXcgU2suYnVpbHRpbi5zdHIoXCJ2YWx1ZXNcIiksbXAkbG9va3VwKGEpe3JldHVybiB0aGlzLm1hcHBpbmcubXAkbG9va3VwKGEpfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnByb3BlcnR5PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJwcm9wZXJ0eVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYixlKXt0aGlzLnByb3AkZ2V0PWF8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3Akc2V0PWN8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3AkZGVsPWJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3AkZG9jPWV8fGEmJmEuJGRvY3x8U2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbnNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe2E9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJwcm9wZXJ0eVwiLFtcImZnZXRcIixcImZzZXRcIixcImZkZWxcIixcImRvY1wiXSxhLGMsQXJyYXkoNCkuZmlsbChTay5idWlsdGluLm5vbmUubm9uZSQpKTt0aGlzLnByb3AkZ2V0PWFbMF07dGhpcy5wcm9wJHNldD1hWzFdO3RoaXMucHJvcCRkZWw9YVsyXTtTay5idWlsdGluLmNoZWNrTm9uZShhWzNdKT9Tay5idWlsdGluLmNoZWNrTm9uZShhWzBdKXx8KHRoaXMucHJvcCRkb2M9YVswXS4kZG9jfHxhWzNdKTp0aGlzLnByb3AkZG9jPWFbM119LHRwJGRvYzpcIlByb3BlcnR5IGF0dHJpYnV0ZS5cXG5cXG4gIGZnZXRcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZ2V0dGluZyBhbiBhdHRyaWJ1dGUgdmFsdWVcXG4gIGZzZXRcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3Igc2V0dGluZyBhbiBhdHRyaWJ1dGUgdmFsdWVcXG4gIGZkZWxcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZGVsJ2luZyBhbiBhdHRyaWJ1dGVcXG4gIGRvY1xcbiAgICBkb2NzdHJpbmdcXG5cXG5UeXBpY2FsIHVzZSBpcyB0byBkZWZpbmUgYSBtYW5hZ2VkIGF0dHJpYnV0ZSB4OlxcblxcbmNsYXNzIEMob2JqZWN0KTpcXG4gICAgZGVmIGdldHgoc2VsZik6IHJldHVybiBzZWxmLl94XFxuICAgIGRlZiBzZXR4KHNlbGYsIHZhbHVlKTogc2VsZi5feCA9IHZhbHVlXFxuICAgIGRlZiBkZWx4KHNlbGYpOiBkZWwgc2VsZi5feFxcbiAgICB4ID0gcHJvcGVydHkoZ2V0eCwgc2V0eCwgZGVseCwgJ0knbSB0aGUgJ3gnIHByb3BlcnR5LicpXFxuXFxuRGVjb3JhdG9ycyBtYWtlIGRlZmluaW5nIG5ldyBwcm9wZXJ0aWVzIG9yIG1vZGlmeWluZyBleGlzdGluZyBvbmVzIGVhc3k6XFxuXFxuY2xhc3MgQyhvYmplY3QpOlxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHgoc2VsZik6XFxuICAgICAgICAnSSBhbSB0aGUgJ3gnIHByb3BlcnR5LidcXG4gICAgICAgIHJldHVybiBzZWxmLl94XFxuICAgIEB4LnNldHRlclxcbiAgICBkZWYgeChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBzZWxmLl94ID0gdmFsdWVcXG4gICAgQHguZGVsZXRlclxcbiAgICBkZWYgeChzZWxmKTpcXG4gICAgICAgIGRlbCBzZWxmLl94XCIsXG50cCRkZXNjcl9nZXQoYSxjKXtpZihudWxsPT09YSlyZXR1cm4gdGhpcztpZih2b2lkIDA9PT10aGlzLnByb3AkZ2V0KXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwidW5yZWFkYWJsZSBhdHRyaWJ1dGVcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLnByb3AkZ2V0LFthXSl9LHRwJGRlc2NyX3NldChhLGMpe2xldCBiO2I9bnVsbD09Yz90aGlzLnByb3AkZGVsOnRoaXMucHJvcCRzZXQ7aWYoU2suYnVpbHRpbi5jaGVja05vbmUoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCJjYW4ndCBcIisobnVsbD09Yz9cImRlbGV0ZVwiOlwic2V0XCIpK1wiIGF0dHJpYnV0ZVwiKTtpZighYi50cCRjYWxsKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShiKStcIicgaXMgbm90IGNhbGxhYmxlXCIpO3JldHVybiBudWxsPT1jP2IudHAkY2FsbChbYV0pOmIudHAkY2FsbChbYSxjXSl9fSxcbm1ldGhvZHM6e2dldHRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KGEsdGhpcy5wcm9wJHNldCx0aGlzLnByb3AkZGVsLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19LHNldHRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KHRoaXMucHJvcCRnZXQsYSx0aGlzLnByb3AkZGVsLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19LGRlbGV0ZXI6eyRtZXRoKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5wcm9wZXJ0eSh0aGlzLnByb3AkZ2V0LHRoaXMucHJvcCRzZXQsYSx0aGlzLnByb3AkZG9jKX0sJGZsYWdzOntPbmVBcmc6ITB9fX0sZ2V0c2V0czp7ZmdldDp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZ2V0fX0sZnNldDp7JGdldCgpe3JldHVybiB0aGlzLnByb3Akc2V0fX0sZmRlbDp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZGVsfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZG9jfSxcbiRzZXQoYSl7dGhpcy5wcm9wJGRvYz1hPWF8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fX0pO1NrLmJ1aWx0aW4uY2xhc3NtZXRob2Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImNsYXNzbWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuY20kY2FsbGFibGU9YTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3R9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJjbGFzc21ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcImNsYXNzbWV0aG9kXCIsYSwxLDEpO3RoaXMuY20kY2FsbGFibGU9YVswXX0sdHAkZG9jOlwiY2xhc3NtZXRob2QoZnVuY3Rpb24pIC0+IG1ldGhvZFxcblxcbkNvbnZlcnQgYSBmdW5jdGlvbiB0byBiZSBhIGNsYXNzIG1ldGhvZC5cXG5cXG5BIGNsYXNzIG1ldGhvZCByZWNlaXZlcyB0aGUgY2xhc3MgYXMgaW1wbGljaXQgZmlyc3QgYXJndW1lbnQsXFxuanVzdCBsaWtlIGFuIGluc3RhbmNlIG1ldGhvZCByZWNlaXZlcyB0aGUgaW5zdGFuY2UuXFxuVG8gZGVjbGFyZSBhIGNsYXNzIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206XFxuXFxuICBjbGFzcyBDOlxcbiAgICAgIEBjbGFzc21ldGhvZFxcbiAgICAgIGRlZiBmKGNscywgYXJnMSwgYXJnMiwgLi4uKTpcXG4gICAgICAgICAgLi4uXFxuXFxuSXQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgb24gdGhlIGNsYXNzIChlLmcuIEMuZigpKSBvciBvbiBhbiBpbnN0YW5jZVxcbihlLmcuIEMoKS5mKCkpLiAgVGhlIGluc3RhbmNlIGlzIGlnbm9yZWQgZXhjZXB0IGZvciBpdHMgY2xhc3MuXFxuSWYgYSBjbGFzcyBtZXRob2QgaXMgY2FsbGVkIGZvciBhIGRlcml2ZWQgY2xhc3MsIHRoZSBkZXJpdmVkIGNsYXNzXFxub2JqZWN0IGlzIHBhc3NlZCBhcyB0aGUgaW1wbGllZCBmaXJzdCBhcmd1bWVudC5cXG5cXG5DbGFzcyBtZXRob2RzIGFyZSBkaWZmZXJlbnQgdGhhbiBDKysgb3IgSmF2YSBzdGF0aWMgbWV0aG9kcy5cXG5JZiB5b3Ugd2FudCB0aG9zZSwgc2VlIHRoZSBzdGF0aWNtZXRob2QgYnVpbHRpbi5cIixcbnRwJGRlc2NyX2dldChhLGMpe2NvbnN0IGI9dGhpcy5jbSRjYWxsYWJsZTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInVuaW5pdGlhbGl6ZWQgY2xhc3NtZXRob2Qgb2JqZWN0XCIpO3ZvaWQgMD09PWMmJihjPWEub2IkdHlwZSk7cmV0dXJuKGE9Yi50cCRkZXNjcl9nZXQpP2EuY2FsbChiLGMpOm5ldyBTay5idWlsdGluLm1ldGhvZChiLGMpfX0sZ2V0c2V0czp7X19mdW5jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5jbSRjYWxsYWJsZX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH19KTtTay5idWlsdGluLnN0YXRpY21ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3RhdGljbWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuc20kY2FsbGFibGU9YTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3R9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsXG50cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInN0YXRpY21ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInN0YXRpY21ldGhvZFwiLGEsMSwxKTt0aGlzLnNtJGNhbGxhYmxlPWFbMF19LHRwJGRvYzpcInN0YXRpY21ldGhvZChmdW5jdGlvbikgLT4gbWV0aG9kXFxuXFxuQ29udmVydCBhIGZ1bmN0aW9uIHRvIGJlIGEgc3RhdGljIG1ldGhvZC5cXG5cXG5BIHN0YXRpYyBtZXRob2QgZG9lcyBub3QgcmVjZWl2ZSBhbiBpbXBsaWNpdCBmaXJzdCBhcmd1bWVudC5cXG5UbyBkZWNsYXJlIGEgc3RhdGljIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206XFxuXFxuICAgICBjbGFzcyBDOlxcbiAgICAgICAgIEBzdGF0aWNtZXRob2RcXG4gICAgICAgICBkZWYgZihhcmcxLCBhcmcyLCAuLi4pOlxcbiAgICAgICAgICAgICAuLi5cXG5cXG5JdCBjYW4gYmUgY2FsbGVkIGVpdGhlciBvbiB0aGUgY2xhc3MgKGUuZy4gQy5mKCkpIG9yIG9uIGFuIGluc3RhbmNlXFxuKGUuZy4gQygpLmYoKSkuICBUaGUgaW5zdGFuY2UgaXMgaWdub3JlZCBleGNlcHQgZm9yIGl0cyBjbGFzcy5cXG5cXG5TdGF0aWMgbWV0aG9kcyBpbiBQeXRob24gYXJlIHNpbWlsYXIgdG8gdGhvc2UgZm91bmQgaW4gSmF2YSBvciBDKysuXFxuRm9yIGEgbW9yZSBhZHZhbmNlZCBjb25jZXB0LCBzZWUgdGhlIGNsYXNzbWV0aG9kIGJ1aWx0aW4uXCIsXG50cCRkZXNjcl9nZXQoYSxjKXtpZih2b2lkIDA9PT10aGlzLnNtJGNhbGxhYmxlKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInVuaW5pdGlhbGl6ZWQgc3RhdGljbWV0aG9kIG9iamVjdFwiKTtyZXR1cm4gdGhpcy5zbSRjYWxsYWJsZX19LGdldHNldHM6e19fZnVuY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuc20kY2FsbGFibGV9fSxfX2RpY3RfXzpTay5nZW5lcmljLmdldFNldERpY3R9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKXtsZXQgZT10aGlzLnY7Yz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBlJiZcIm51bWJlclwiPT09dHlwZW9mIGMpe2NvbnN0IGI9YShlLGMpO2lmKGQoYikpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYil9ZT1uKGUpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKGUsYykpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19XG5mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gYShkLGMpO2Q9bihkKTtjPW4oYyk7cmV0dXJuIGIoZCxjKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGIoYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBjPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKGMpKTpuZXcgU2suYnVpbHRpbi5pbnRfKGIoYykpfX1mdW5jdGlvbiBlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy52KX1mdW5jdGlvbiBmKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZigwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7XG5pZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKGQsYykpO2Q9bihkKTtjPW4oYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oSlNCSS5udW1iZXJJZlNhZmUoYihkLGMpKSl9cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBsKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZigwPT09ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnYpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYyl7aWYoMD5jKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBzaGlmdCBjb3VudFwiKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGQpe2NvbnN0IGI9YShkLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYil9Yz1KU0JJLkJpZ0ludChjKX1lbHNlIGlmKEpTQkkubGVzc1RoYW4oSlNCSS5CaWdJbnQoMCkpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBzaGlmdCBjb3VudFwiKTtcbmQ9bihkKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKGQsYykpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKXt2YXIgZD10aGlzLnY7Yz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBkJiZcIm51bWJlclwiPT09dHlwZW9mIGMpcmV0dXJuIGQ9YShkLGMpLDA+ZCYmKGQrPTQyOTQ5NjcyOTYpLG5ldyBTay5idWlsdGluLmludF8oZCk7ZD1uKGQpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLm51bWJlcklmU2FmZShiKGQsYykpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGE8PU51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZhPj0tTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9ZnVuY3Rpb24gZyhhKXtyZXR1cm4gYTw9XG5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUiYmYT49LU51bWJlci5NQVhfU0FGRV9JTlRFR0VSPythOkpTQkkuQmlnSW50KGEpfWZ1bmN0aW9uIG4oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhP0pTQkkuQmlnSW50KGEpOmF9U2suYnVpbHRpbi5pbnRfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJpbnRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XyxcImJhZCBjYWxsIHRvIGludCB1c2UgJ25ldydcIik7bGV0IGI7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhfHxKU0JJLl9faXNCaWdJbnQoYSkpYj1hO2Vsc2UgaWYodm9pZCAwPT09YSliPTA7ZWxzZSBpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpYj1nKGEpO2Vsc2V7aWYoYS5uYiRpbnQpcmV0dXJuIGEubmIkaW50KCk7U2suYXNzZXJ0cy5mYWlsKFwiYmFkIGFyZ3VtZW50IHRvIGludCBjb25zdHJ1Y3RvclwiKX10aGlzLnY9Yn0sc2xvdHM6e3RwJGFzX251bWJlcjohMCxcbnRwJGRvYzpcImludCh4PTApIC0+IGludGVnZXJcXG5pbnQoeCwgYmFzZT0xMCkgLT4gaW50ZWdlclxcblxcbkNvbnZlcnQgYSBudW1iZXIgb3Igc3RyaW5nIHRvIGFuIGludGVnZXIsIG9yIHJldHVybiAwIGlmIG5vIGFyZ3VtZW50c1xcbmFyZSBnaXZlbi4gIElmIHggaXMgYSBudW1iZXIsIHJldHVybiB4Ll9faW50X18oKS4gIEZvciBmbG9hdGluZyBwb2ludFxcbm51bWJlcnMsIHRoaXMgdHJ1bmNhdGVzIHRvd2FyZHMgemVyby5cXG5cXG5JZiB4IGlzIG5vdCBhIG51bWJlciBvciBpZiBiYXNlIGlzIGdpdmVuLCB0aGVuIHggbXVzdCBiZSBhIHN0cmluZyxcXG5ieXRlcywgb3IgYnl0ZWFycmF5IGluc3RhbmNlIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyIGxpdGVyYWwgaW4gdGhlXFxuZ2l2ZW4gYmFzZS4gIFRoZSBsaXRlcmFsIGNhbiBiZSBwcmVjZWRlZCBieSAnKycgb3IgJy0nIGFuZCBiZSBzdXJyb3VuZGVkXFxuYnkgd2hpdGVzcGFjZS4gIFRoZSBiYXNlIGRlZmF1bHRzIHRvIDEwLiAgVmFsaWQgYmFzZXMgYXJlIDAgYW5kIDItMzYuXFxuQmFzZSAwIG1lYW5zIHRvIGludGVycHJldCB0aGUgYmFzZSBmcm9tIHRoZSBzdHJpbmcgYXMgYW4gaW50ZWdlciBsaXRlcmFsLlxcbj4+PiBpbnQoJzBiMTAwJywgYmFzZT0wKVxcbjRcIixcbiRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKSl9LHRwJGhhc2goKXtjb25zdCBhPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGE/YTpKU0JJLnRvTnVtYmVyKEpTQkkucmVtYWluZGVyKGEsSlNCSS5fX01BWF9TQUZFKSl9LHRwJG5ldyhhLGIpezE9PT1hLmxlbmd0aCsoYj9iLmxlbmd0aDowKT8oYj1hWzBdLGE9U2suYnVpbHRpbi5ub25lLm5vbmUkKTooYT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImludFwiLFtudWxsLFwiYmFzZVwiXSxhLGIsW25ldyBTay5idWlsdGluLmludF8oMCksU2suYnVpbHRpbi5ub25lLm5vbmUkXSksYj1hWzBdLGE9YVsxXSk7YT1hIT09U2suYnVpbHRpbi5ub25lLm5vbmUkP1NrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpOm51bGw7aWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKW51bGw9PT1hJiYoYT0xMCksYj1uZXcgU2suYnVpbHRpbi5pbnRfKFNrLnN0cjJudW1iZXIoYi52LFxuYSkpO2Vsc2V7aWYobnVsbCE9PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaW50KCkgY2FuJ3QgY29udmVydCBub24tc3RyaW5nIHdpdGggZXhwbGljaXQgYmFzZVwiKTtpZihiLm5iJGludCliPWIubmIkaW50KCk7ZWxzZSBpZihhPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYixTay5idWlsdGluLnN0ci4kdHJ1bmMpKXthPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtdKTtpZighU2suYnVpbHRpbi5jaGVja0ludChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoU2suYnVpbHRpbi5zdHIuJHRydW5jLiRqc3N0cigpK1wiIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSBcIitTay5hYnN0ci50eXBlTmFtZShiKStcIilcIik7Yj1uZXcgU2suYnVpbHRpbi5pbnRfKGEudil9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpbnQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBhIGJ5dGVzLWxpa2Ugb2JqZWN0IG9yIGEgbnVtYmVyLCBub3QgJ1wiK1xuU2suYWJzdHIudHlwZU5hbWUoYikrXCInXCIpO31pZih0aGlzPT09U2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZSlyZXR1cm4gYjthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2Eudj1iLnY7cmV0dXJuIGF9LHRwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLG9iJGVxOmMoKGEsYik9PmE9PWIsSlNCSS5lcXVhbCksb2IkbmU6YygoYSxiKT0+YSE9YixKU0JJLm5vdEVxdWFsKSxvYiRndDpjKChhLGIpPT5hPmIsSlNCSS5ncmVhdGVyVGhhbiksb2IkZ2U6YygoYSxiKT0+YT49YixKU0JJLmdyZWF0ZXJUaGFuT3JFcXVhbCksb2IkbHQ6YygoYSxiKT0+YTxiLEpTQkkubGVzc1RoYW4pLG9iJGxlOmMoKGEsYik9PmE8PWIsSlNCSS5sZXNzVGhhbk9yRXF1YWwpLG5iJGludDplLG5iJGluZGV4KCl7cmV0dXJuIHRoaXMudn0sbmIkZmxvYXQoKXt2YXIgYT10aGlzLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk7YT1wYXJzZUZsb2F0KEpTQkkudG9OdW1iZXIoYSkpO1xuaWYoSW5maW5pdHk9PT1hfHwtSW5maW5pdHk9PT1hKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX0sbmIkaXNuZWdhdGl2ZSgpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT8wPmE6SlNCSS5sZXNzVGhhbihhLEpTQkkuX19aRVJPKX0sbmIkaXNwb3NpdGl2ZSgpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT8wPmE6SlNCSS5ncmVhdGVyVGhhbk9yRXF1YWwoYSxKU0JJLl9fWkVSTyl9LG5iJGJvb2woKXtyZXR1cm4gMCE9PXRoaXMudn0sbmIkcG9zaXRpdmU6ZSxuYiRuZWdhdGl2ZTpiKGE9Pi1hLEpTQkkudW5hcnlNaW51cyksbmIkYWRkOmEoKGEsYik9PmErYiwoYSxiKT0+SlNCSS5udW1iZXJJZlNhZmUoSlNCSS5hZGQoYSxiKSkpLG5iJHN1YnRyYWN0OmEoKGEsYik9PmEtYiwoYSxiKT0+XG5KU0JJLm51bWJlcklmU2FmZShKU0JJLnN1YnRyYWN0KGEsYikpKSxuYiRtdWx0aXBseTphKChhLGIpPT5hKmIsSlNCSS5tdWx0aXBseSksbmIkZGl2aWRlKGEpe3JldHVybiBTay5fX2Z1dHVyZV9fLmRpdmlzaW9uP3RoaXMubmIkZmxvYXQoKS5uYiRkaXZpZGUoYSk6dGhpcy5uYiRmbG9vcl9kaXZpZGUoYSl9LG5iJGZsb29yX2RpdmlkZTpmKChhLGIpPT5NYXRoLmZsb29yKGEvYiksSlNCSS5kaXZpZGUpLG5iJHJlbWFpbmRlcjpmKChhLGIpPT5hLU1hdGguZmxvb3IoYS9iKSpiLEpTQkkucmVtYWluZGVyKSxuYiRkaXZtb2QoYSl7Y29uc3QgYj10aGlzLm5iJGZsb29yX2RpdmlkZShhKTthPXRoaXMubmIkcmVtYWluZGVyKGEpO3JldHVybiBiPT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR8fGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD9Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDpuZXcgU2suYnVpbHRpbi50dXBsZShbYixcbmFdKX0sbmIkYW5kOmgoKGEsYik9PmEmYixKU0JJLmJpdHdpc2VBbmQpLG5iJG9yOmgoKGEsYik9PmF8YixKU0JJLmJpdHdpc2VPciksbmIkeG9yOmgoKGEsYik9PmFeYixKU0JJLmJpdHdpc2VYb3IpLG5iJGFiczpiKE1hdGguYWJzLGE9PkpTQkkubGVzc1RoYW4oYSxKU0JJLl9fWkVSTyk/SlNCSS51bmFyeU1pbnVzKGEpOmEpLG5iJGxzaGlmdDpsKChhLGIpPT57aWYoNTM+YiYmKGE9MiphKnBbYl0sZChhKSkpcmV0dXJuIGF9LEpTQkkubGVmdFNoaWZ0KSxuYiRyc2hpZnQ6bCgoYSxiKT0+e2NvbnN0IGM9YT4+YjtyZXR1cm4gMDxhJiYwPmM/YyZNYXRoLnBvdygyLDMyLWIpLTE6Y30sKGEsYik9PkpTQkkubnVtYmVySWZTYWZlKEpTQkkuc2lnbmVkUmlnaHRTaGlmdChhLGIpKSksbmIkaW52ZXJ0OmIoYT0+fmEsSlNCSS5iaXR3aXNlTm90KSxuYiRwb3dlcihhLGIpe2xldCBjO3ZvaWQgMCE9PWImJlNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpJiYoYj12b2lkIDApO2lmKGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5pbnRfJiYodm9pZCAwPT09Ynx8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xykpe2xldCBlPXRoaXMudixmPWEudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGUmJlwibnVtYmVyXCI9PT10eXBlb2YgZil7Y29uc3QgYT1NYXRoLnBvdyhlLGYpO2lmKGQoYSkmJihjPTA+Zj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk6bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSx2b2lkIDA9PT1iKSlyZXR1cm4gY31pZih2b2lkIDAhPT1iKXtpZihhLm5iJGlzbmVnYXRpdmUoKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicG93KCkgMm5kIGFyZ3VtZW50IGNhbm5vdCBiZSBuZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWRcIik7aWYoMD09PWIudil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicG93KCkgM3JkIGFyZ3VtZW50IGNhbm5vdCBiZSAwXCIpO3JldHVybiB2b2lkIDAhPT1jP2MubmIkcmVtYWluZGVyKGIpOm5ldyBTay5idWlsdGluLmludF8oSlNCSS5wb3dlcm1vZChuKGUpLFxubihmKSxuKGIudikpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLmV4cG9uZW50aWF0ZShuKGUpLG4oZikpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9LG5iJGxvbmcoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHRoaXMudil9fSxnZXRzZXRzOntyZWFsOnskZ2V0OmUsJGRvYzpcInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifSxpbWFnOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oMCl9LCRkb2M6XCJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifX0sbWV0aG9kczp7Y29uanVnYXRlOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm5zIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgaW50LlwifSxiaXRfbGVuZ3RoOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmJ1aWx0aW4uYmluKHRoaXMpLnNxJGxlbmd0aCgpLVxuMil9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiTnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCBzZWxmIGluIGJpbmFyeS5cXG5cXG4+Pj4gYmluKDM3KVxcbicwYjEwMDEwMSdcXG4+Pj4gKDM3KS5iaXRfbGVuZ3RoKClcXG42XCJ9LHRvX2J5dGVzOnskbWV0aCgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFwiKTt9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBsZW5ndGgsIGJ5dGVvcmRlciwgKiwgc2lnbmVkPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYW4gYXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGFuIGludGVnZXIuXFxuXFxuICBsZW5ndGhcXG4gICAgTGVuZ3RoIG9mIGJ5dGVzIG9iamVjdCB0byB1c2UuICBBbiBPdmVyZmxvd0Vycm9yIGlzIHJhaXNlZCBpZiB0aGVcXG4gICAgaW50ZWdlciBpcyBub3QgcmVwcmVzZW50YWJsZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuXFxuICBieXRlb3JkZXJcXG4gICAgVGhlIGJ5dGUgb3JkZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIGludGVnZXIuICBJZiBieXRlb3JkZXIgaXMgJ2JpZycsXFxuICAgIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnl0ZSBhcnJheS4gIElmXFxuICAgIGJ5dGVvcmRlciBpcyAnbGl0dGxlJywgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBhdCB0aGUgZW5kIG9mIHRoZVxcbiAgICBieXRlIGFycmF5LiAgVG8gcmVxdWVzdCB0aGUgbmF0aXZlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3Qgc3lzdGVtLCB1c2VcXG4gICAgYHN5cy5ieXRlb3JkZXInIGFzIHRoZSBieXRlIG9yZGVyIHZhbHVlLlxcbiAgc2lnbmVkXFxuICAgIERldGVybWluZXMgd2hldGhlciB0d28ncyBjb21wbGVtZW50IGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBpbnRlZ2VyLlxcbiAgICBJZiBzaWduZWQgaXMgRmFsc2UgYW5kIGEgbmVnYXRpdmUgaW50ZWdlciBpcyBnaXZlbiwgYW4gT3ZlcmZsb3dFcnJvclxcbiAgICBpcyByYWlzZWQuXCJ9LFxuX190cnVuY19fOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJUcnVuY2F0aW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlwifSxfX2Zsb29yX186eyRtZXRoOmUsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkZsb29yaW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlwifSxfX2NlaWxfXzp7JG1ldGg6ZSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQ2VpbGluZyBvZiBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi5cIn0sX19yb3VuZF9fOnskbWV0aChhKXtyZXR1cm4gdGhpcy5yb3VuZCQoYSl9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUm91bmRpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuXFxuUm91bmRpbmcgd2l0aCBhbiBuZGlnaXRzIGFyZ3VtZW50IGFsc28gcmV0dXJucyBhbiBpbnRlZ2VyLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8odGhpcy52KV0pfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sX19mb3JtYXRfXzp7JG1ldGg6U2suZm9ybWF0dGluZy5ta051bWJlcl9fZm9ybWF0X18oITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgZm9ybWF0X3NwZWMsIC8pXCIsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9fSxwcm90bzp7c3RyJChhLGIpe2E9dm9pZCAwPT09YXx8MTA9PT1hP3RoaXMudi50b1N0cmluZygpOnRoaXMudi50b1N0cmluZyhhKTtifHx2b2lkIDA9PT1ifHxcIi1cIj09PWFbMF0mJihhPWEuc3Vic3RyaW5nKDEpKTtyZXR1cm4gYX0scm91bmQkKGEpe2E9dm9pZCAwPT09YT8wOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTt2YXIgYj10aGlzLnYsYz1NYXRoLnBvdygxMCwtYSk7aWYoMDxhKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYiYmU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nKXJldHVybiBhPVxuYi9jLGI9TWF0aC5yb3VuZChhKSxuZXcgU2suYnVpbHRpbi5pbnRfKCguNT09PSgwPGE/YTotYSklMT8wPT09YiUyP2I6Yi0xOmIpKmMpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhNYXRoLnJvdW5kKGIvYykqYyk7e2M9SlNCSS5CaWdJbnQoMTAqYyk7YT1KU0JJLkJpZ0ludCgxMCk7Yj1KU0JJLmRpdmlkZShiLGMpO2NvbnN0IGQ9SlNCSS5kaXZpZGUoYixhKSxlPUpTQkkuc3VidHJhY3QoYixKU0JJLm11bHRpcGx5KGEsZCkpOzU+SlNCSS50b051bWJlcihlKT9iPUpTQkkubXVsdGlwbHkoSlNCSS5tdWx0aXBseShkLGEpLGMpOkpTQkkubXVsdGlwbHkoSlNCSS5tdWx0aXBseShKU0JJLmFkZChkLEpTQkkuQmlnSW50KDEpLGEpLGMpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX19fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uaW50X1wiLFNrLmJ1aWx0aW4uaW50Xyk7Y29uc3Qgaz0vXyg/PVteX10pL2c7U2suc3RyMm51bWJlcj1cbmZ1bmN0aW9uKGEsYil7dmFyIGM9YSxlPSExLGY7YT1hLnJlcGxhY2UoL15cXHMrfFxccyskL2csXCJcIik7XCItXCI9PT1hLmNoYXJBdCgwKSYmKGU9ITAsYT1hLnN1YnN0cmluZygxKSk7XCIrXCI9PT1hLmNoYXJBdCgwKSYmKGE9YS5zdWJzdHJpbmcoMSkpO2lmKG51bGw9PT1ifHx2b2lkIDA9PT1iKWI9MTA7aWYoKDI+Ynx8MzY8YikmJjAhPT1iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnQoKSBiYXNlIG11c3QgYmUgPj0gMiBhbmQgPD0gMzZcIik7XCJzdHJpbmdcIj09PXR5cGVvZiBiJiYoYj1OdW1iZXIoYikpO2lmKFwiMHhcIj09PWEuc3Vic3RyaW5nKDAsMikudG9Mb3dlckNhc2UoKSlpZigxNj09PWJ8fDA9PT1iKWE9YS5zdWJzdHJpbmcoMiksYj0xNjtlbHNle2lmKDM0PmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBiXCI9PT1hLnN1YnN0cmluZygwLFxuMikudG9Mb3dlckNhc2UoKSlpZigyPT09Ynx8MD09PWIpYT1hLnN1YnN0cmluZygyKSxiPTI7ZWxzZXtpZigxMj5iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7fWVsc2UgaWYoXCIwb1wiPT09YS5zdWJzdHJpbmcoMCwyKS50b0xvd2VyQ2FzZSgpKWlmKDg9PT1ifHwwPT09YilhPWEuc3Vic3RyaW5nKDIpLGI9ODtlbHNle2lmKDI1PmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBcIj09PWEuY2hhckF0KDApKXtpZihcIjBcIj09PWEpcmV0dXJuIDA7aWYoOD09PWJ8fDA9PT1iKWI9OH0wPT09YiYmKGI9MTApO2lmKC0xIT09YS5pbmRleE9mKFwiX1wiKSl7aWYoLTEhPT1hLmluZGV4T2YoXCJfX1wiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrXG5iK1wiOiAnXCIrYytcIidcIik7YT0xMCE9PWI/YS5yZXBsYWNlKGssXCJcIik6YS5jaGFyQXQoMCkrYS5zdWJzdHJpbmcoMSkucmVwbGFjZShrLFwiXCIpfWlmKDA9PT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO2ZvcihmPTA7ZjxhLmxlbmd0aDtmKz0xKXt2YXIgZz1hLmNoYXJDb2RlQXQoZik7dmFyIGg9Yjs0ODw9ZyYmNTc+PWc/aD1nLTQ4OjY1PD1nJiY5MD49Zz9oPWctNjUrMTA6OTc8PWcmJjEyMj49ZyYmKGg9Zy05NysxMCk7aWYoaD49Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO31lJiYoYT1cIi1cIithKTtoPXBhcnNlSW50KGEsYik7aWYoZChoKSlyZXR1cm4gaDtjPSExO1wiLVwiPT09YVswXSYmKGM9ITAsYT1hLnN1YnN0cmluZygxKSk7Yj1KU0JJLkJpZ0ludChiKTtcbmU9SlNCSS5CaWdJbnQoMSk7Zj1KU0JJLkJpZ0ludCgwKTtmb3IoZz1hLmxlbmd0aC0xOzA8PWc7Zy0tKWg9YS5jaGFyQ29kZUF0KGcpLDQ4PD1oJiY1Nz49aD9oLT00ODo2NTw9aCYmOTA+PWg/aD1oLTY1KzEwOjk3PD1oJiYxMjI+PWgmJihoPWgtOTcrMTApLGg9SlNCSS5tdWx0aXBseShKU0JJLkJpZ0ludChoKSxlKSxmPUpTQkkuYWRkKGYsaCksZT1KU0JJLm11bHRpcGx5KGUsYik7YyYmKGY9SlNCSS5tdWx0aXBseShmLEpTQkkuQmlnSW50KC0xKSkpO3JldHVybiBhPWZ9O1NrLmJ1aWx0aW4uaW50Xy5weTIkbWV0aG9kcz17fTtTay5sb25nRnJvbVN0cj1mdW5jdGlvbihhLGIpe2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhnKGEpKTthPVNrLnN0cjJudW1iZXIoYSxiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5sb25nRnJvbVN0clwiLFNrLmxvbmdGcm9tU3RyKTtTay5idWlsdGluLmludF8ud2l0aGluVGhyZXNob2xkPVxuZDtTay5idWlsdGluLmludF8uc3RyaW5nVG9OdW1iZXJPckJpZz1nO2NvbnN0IHA9Wy41LDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI1Niw1MTIsMTAyNCwyMDQ4LDQwOTYsODE5MiwxNjM4NCwzMjc2OCw2NTUzNiwxMzEwNzIsMjYyMTQ0LDUyNDI4OCwxMDQ4NTc2LDIwOTcxNTIsNDE5NDMwNCw4Mzg4NjA4LDE2Nzc3MjE2LDMzNTU0NDMyLDY3MTA4ODY0LDEzNDIxNzcyOCwyNjg0MzU0NTYsNTM2ODcwOTEyLDEwNzM3NDE4MjQsMjE0NzQ4MzY0OCw0Mjk0OTY3Mjk2LDg1ODk5MzQ1OTIsMTcxNzk4NjkxODQsMzQzNTk3MzgzNjgsNjg3MTk0NzY3MzYsMTM3NDM4OTUzNDcyLDI3NDg3NzkwNjk0NCw1NDk3NTU4MTM4ODgsMTA5OTUxMTYyNzc3NiwyMTk5MDIzMjU1NTUyLDQzOTgwNDY1MTExMDQsODc5NjA5MzAyMjIwOCwxNzU5MjE4NjA0NDQxNiwzNTE4NDM3MjA4ODgzMiw3MDM2ODc0NDE3NzY2NCwweDgwMDAwMDAwMDAwMCwyODE0NzQ5NzY3MTA2NTYsNTYyOTQ5OTUzNDIxMzEyLDB4NDAwMDAwMDAwMDAwMCxcbjB4ODAwMDAwMDAwMDAwMCw0NTAzNTk5NjI3MzcwNDk2LDkwMDcxOTkyNTQ3NDA5OTJdO1NrLmJ1aWx0aW4ubG5nPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJsb25nXCIse2Jhc2U6U2suYnVpbHRpbi5pbnRfLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4uaW50Xy5jYWxsKHRoaXMsYSl9LHNsb3RzOnskcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvU3RyaW5nKCkrXCJMXCIpfSx0cCRhc19udW1iZXI6ITAsbmIkbmVnYXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHUubmIkbmVnYXRpdmUuY2FsbCh0aGlzKS52KX0sbmIkcG9zaXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHUubmIkcG9zaXRpdmUuY2FsbCh0aGlzKS52KX19fSk7Y29uc3QgdT1Tay5idWlsdGluLmludF8ucHJvdG90eXBlfSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9U2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZTtTay5idWlsdGluLmJvb2w9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImJvb2xcIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfSxiYXNlOlNrLmJ1aWx0aW4uaW50XyxzbG90czp7dHAkZG9jOlwiYm9vbCh4KSAtPiBib29sXFxuXFxuUmV0dXJucyBUcnVlIHdoZW4gdGhlIGFyZ3VtZW50IHggaXMgdHJ1ZSwgRmFsc2Ugb3RoZXJ3aXNlLlxcblRoZSBidWlsdGlucyBUcnVlIGFuZCBGYWxzZSBhcmUgdGhlIG9ubHkgdHdvIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYm9vbC5cXG5UaGUgY2xhc3MgYm9vbCBpcyBhIHN1YmNsYXNzIG9mIHRoZSBjbGFzcyBpbnQsIGFuZCBjYW5ub3QgYmUgc3ViY2xhc3NlZC5cIix0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwiYm9vbFwiLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcImJvb2xcIixhLDAsMSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYVswXSl9LCRyKCl7cmV0dXJuIHRoaXMudj90aGlzLnN0ciRUcnVlOlxudGhpcy5zdHIkRmFsc2V9LHRwJGFzX251bWJlcjohMCxuYiRhbmQoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudiZjLnYpOmEubmIkYW5kLmNhbGwodGhpcyxjKX0sbmIkb3IoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudnxjLnYpOmEubmIkb3IuY2FsbCh0aGlzLGMpfSxuYiR4b3IoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudl5jLnYpOmEubmIkeG9yLmNhbGwodGhpcyxjKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9LG1ldGhvZHM6e19fZm9ybWF0X186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHIoKX0sJGZsYWdzOntPbmVBcmc6ITB9fX0scHJvdG86e3N0ciRGYWxzZTpuZXcgU2suYnVpbHRpbi5zdHIoXCJGYWxzZVwiKSxzdHIkVHJ1ZTpuZXcgU2suYnVpbHRpbi5zdHIoXCJUcnVlXCIpfX0pO1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5ib29sXCIsU2suYnVpbHRpbi5ib29sKTtTay5idWlsdGluLmJvb2wudHJ1ZSQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLmJvb2wucHJvdG90eXBlLHt2Ont2YWx1ZToxLGVudW1lcmFibGU6ITB9fSk7U2suYnVpbHRpbi5ib29sLmZhbHNlJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4uYm9vbC5wcm90b3R5cGUse3Y6e3ZhbHVlOjAsZW51bWVyYWJsZTohMH19KX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnYpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9dGhpcy52O2I9Yi52O2lmKFwibnVtYmVyXCIhPT10eXBlb2YgYilpZihKU0JJLl9faXNCaWdJbnQoYikpe2lmKGI9cGFyc2VGbG9hdChKU0JJLnRvTnVtYmVyKGIpKSxJbmZpbml0eT09Ynx8LUluZmluaXR5PT1iKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7XG59ZWxzZSByZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7cmV0dXJuIGEoYyxiKX19ZnVuY3Rpb24gYihhKXtjb25zdCBiPWMoYSk7cmV0dXJuIGZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YyYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInBvdygpIDNyZCBhcmd1bWVudCBub3QgYWxsb3dlZCB1bmxlc3MgYWxsIGFyZ3VtZW50cyBhcmUgaW50ZWdlcnNcIik7cmV0dXJuIGIuY2FsbCh0aGlzLGEpfX1mdW5jdGlvbiBlKGEsYil7aWYoMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IoXCJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCIpO3JldHVybiBJbmZpbml0eT09PWE/SW5maW5pdHk9PT1ifHwtSW5maW5pdHk9PT1hP25ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pOjA+Yj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oLUluZmluaXR5KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oSW5maW5pdHkpOlxuLUluZmluaXR5PT09YT9JbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik6MD5iP25ldyBTay5idWlsdGluLmZsb2F0XyhJbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC1JbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvYil9ZnVuY3Rpb24gZihhLGIpe2lmKEluZmluaXR5PT09YXx8LUluZmluaXR5PT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik7aWYoMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IoXCJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCIpO3JldHVybiBJbmZpbml0eT09PWI/MD5hP25ldyBTay5idWlsdGluLmZsb2F0XygtMSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApOi1JbmZpbml0eT09PWI/MD5hfHwwIT09YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oMCk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0xKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oTWF0aC5mbG9vcihhL1xuYikpfWZ1bmN0aW9uIGwoYSxiKXtpZigwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7aWYoMD09PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygwKTtpZihJbmZpbml0eT09PWIpcmV0dXJuIEluZmluaXR5PT09YXx8LUluZmluaXR5PT09dGhpcy52P25ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pOjA8YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKEluZmluaXR5KTtsZXQgYz1hJWI7MD5hPzA8YiYmMD5jJiYoYys9Yik6MD5iJiYwIT09YyYmKGMrPWIpOzA9PT1jJiYoMD5iP2M9LTA6LUluZmluaXR5PT09SW5maW5pdHkvYyYmKGM9MCkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9ZnVuY3Rpb24gaChhLGIpe2lmKDA+YSYmMCE9PWIlMSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibmVnYXRpdmUgbnVtYmVyIGNhbm5vdCBiZSByYWlzZWQgdG8gYSBmcmFjdGlvbmFsIHBvd2VyXCIpO1xuaWYoMD09PWEmJjA+Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcIjAuMCBjYW5ub3QgYmUgcmFpc2VkIHRvIGEgbmVnYXRpdmUgcG93ZXJcIik7Y29uc3QgYz1NYXRoLnBvdyhhLGIpO2lmKEluZmluaXR5PT09TWF0aC5hYnMoYykmJkluZmluaXR5IT09TWF0aC5hYnMoYSkmJkluZmluaXR5IT09TWF0aC5hYnMoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcIk51bWVyaWNhbCByZXN1bHQgb3V0IG9mIHJhbmdlXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9Y29uc3QgZD1PYmplY3QuY3JlYXRlKG51bGwse0luZmluaXR5Ont2YWx1ZTozMTQxNTl9LFwiLUluZmluaXR5XCI6e3ZhbHVlOi0zMTQxNTl9LE5hTjp7dmFsdWU6MH19KTtTay5idWlsdGluLmZsb2F0Xz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZmxvYXRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfLFxuXCJiYWQgY2FsbCB0byBmbG9hdCB1c2UgJ25ldydcIik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXRoaXMudj1hO2Vsc2UgaWYodm9pZCAwPT09YSl0aGlzLnY9MDtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSl0aGlzLnY9cGFyc2VGbG9hdChhKTtlbHNle2lmKGEubmIkZmxvYXQpcmV0dXJuIGEubmIkZmxvYXQoKTtTay5hc3NlcnRzLmZhaWwoXCJiYWQgYXJndW1lbnQgdG8gZmxvYXQgY29uc3RydWN0b3JcIil9fSxzbG90czp7dHAkZ2V0dGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX251bWJlcjohMCx0cCRkb2M6XCJDb252ZXJ0IGEgc3RyaW5nIG9yIG51bWJlciB0byBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgaWYgcG9zc2libGUuXCIsdHAkaGFzaCgpe2NvbnN0IGE9dGhpcy52O2xldCBiPWRbYV07aWYodm9pZCAwIT09YilyZXR1cm4gYjtiPU51bWJlci5pc0ludGVnZXIoYSk/dGhpcy5uYiRpbnQoKS50cCRoYXNoKCk6TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSLVxuTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIvMik7cmV0dXJuIGRbdGhpcy52XT1ifSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy5zdHIkKDEwLCEwKSl9LHRwJG5ldyhhLGIpe2lmKGImJmIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZsb2F0KCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7aWYoYSYmMTxhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmbG9hdCBleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgXCIrYS5sZW5ndGgpO2E9YVswXTtpZih2b2lkIDA9PT1hKXZhciBjPW5ldyBTay5idWlsdGluLmZsb2F0XygwKTtlbHNlIGlmKGEubmIkZmxvYXQpYz1hLm5iJGZsb2F0KCk7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtjPWEudjthPWM7aWYoLTEhPT1jLmluZGV4T2YoXCJfXCIpKXtpZihnLnRlc3QoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byBmbG9hdDogJ1wiK1xuYytcIidcIik7YT1jLmNoYXJBdCgwKStjLnN1YnN0cmluZygxKS5yZXBsYWNlKG4sXCJcIil9aWYoYy5tYXRjaCgvXi1pbmYkL2kpKXZhciBkPS1JbmZpbml0eTtlbHNlIGMubWF0Y2goL15bK10/aW5mJC9pKT9kPUluZmluaXR5OmMubWF0Y2goL15bLStdP25hbiQvaSk/ZD1OYU46aXNOYU4oYSl8fChkPXBhcnNlRmxvYXQoYSksTnVtYmVyLmlzTmFOKGQpJiYoZD12b2lkIDApKTtpZih2b2lkIDA9PT1kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gZmxvYXQ6IFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIobmV3IFNrLmJ1aWx0aW4uc3RyKGMpKSk7Yz1uZXcgU2suYnVpbHRpbi5mbG9hdF8oZCl9aWYodm9pZCAwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmbG9hdCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBudW1iZXJcIik7aWYodGhpcz09PVNrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZSlyZXR1cm4gYztcbmQ9bmV3IHRoaXMuY29uc3RydWN0b3I7ZC52PWMudjtyZXR1cm4gZH0sbmIkaW50KCl7bGV0IGE9dGhpcy52O2E9MD5hP01hdGguY2VpbChhKTpNYXRoLmZsb29yKGEpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjYW5ub3QgY29udmVydCBmbG9hdCBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMpK1wiIHRvIGludGVnZXJcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50Xy53aXRoaW5UaHJlc2hvbGQoYSk/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKTpuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkuQmlnSW50KGEpKX0sbmIkZmxvYXQ6YSxuYiRsb25nKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxuZyh0aGlzLm5iJGludCgpLnYpfSxuYiRhZGQ6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGErYikpLG5iJHN1YnRyYWN0OmMoKGEsYik9Pm5ldyBTay5idWlsdGluLmZsb2F0XyhhLWIpKSxuYiRyZWZsZWN0ZWRfc3VidHJhY3Q6YygoYSxcbmIpPT5uZXcgU2suYnVpbHRpbi5mbG9hdF8oYi1hKSksbmIkbXVsdGlwbHk6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEqYikpLG5iJGRpdmlkZTpjKGUpLG5iJHJlZmxlY3RlZF9kaXZpZGU6YygoYSxiKT0+ZShiLGEpKSxuYiRmbG9vcl9kaXZpZGU6YyhmKSxuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlOmMoKGEsYik9PmYoYixhKSksbmIkcmVtYWluZGVyOmMobCksbmIkcmVmbGVjdGVkX3JlbWFpbmRlcjpjKChhLGIpPT5sKGIsYSkpLG5iJGRpdm1vZDpjKChhLGIpPT5uZXcgU2suYnVpbHRpbi50dXBsZShbZihhLGIpLGwoYSxiKV0pKSxuYiRyZWZsZWN0ZWRfZGl2bW9kOmMoKGEsYik9Pm5ldyBTay5idWlsdGluLnR1cGxlKFtmKGIsYSksbChiLGEpXSkpLG5iJHBvd2VyOmIoaCksbmIkcmVmbGVjdGVkX3Bvd2VyOmIoKGEsYik9PmgoYixhKSksbmIkYWJzKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhNYXRoLmFicyh0aGlzLnYpKX0sbmIkbmVnYXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC10aGlzLnYpfSxcbm5iJHBvc2l0aXZlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnYpfSxuYiRib29sKCl7cmV0dXJuIDAhPT10aGlzLnZ9LG5iJGlzbmVnYXRpdmUoKXtyZXR1cm4gMD50aGlzLnZ9LG5iJGlzcG9zaXRpdmUoKXtyZXR1cm4gMDw9dGhpcy52fSxvYiRlcTpjKChhLGIpPT5hPT1iKSxvYiRuZTpjKChhLGIpPT5hIT1iKSxvYiRndDpjKChhLGIpPT5hPmIpLG9iJGdlOmMoKGEsYik9PmE+PWIpLG9iJGx0OmMoKGEsYik9PmE8Yiksb2IkbGU6YygoYSxiKT0+YTw9Yil9LGdldHNldHM6e3JlYWw6eyRnZXQ6YSwkZG9jOlwidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyXCJ9LGltYWc6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApfSwkZG9jOlwidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn19LG1ldGhvZHM6e2Nvbmp1Z2F0ZTp7JG1ldGg6YSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGZsb2F0LlwifSxcbl9fdHJ1bmNfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy5uYiRpbnQoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIEludGVncmFsIGNsb3Nlc3QgdG8geCBiZXR3ZWVuIDAgYW5kIHguXCJ9LF9fcm91bmRfXzp7JG1ldGgoYSl7cmV0dXJuIHRoaXMucm91bmQkKGEpfSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuZGlnaXRzPU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgSW50ZWdyYWwgY2xvc2VzdCB0byB4LCByb3VuZGluZyBoYWxmIHRvd2FyZCBldmVuLlxcblxcbldoZW4gYW4gYXJndW1lbnQgaXMgcGFzc2VkLCB3b3JrIGxpa2UgYnVpbHQtaW4gcm91bmQoeCwgbmRpZ2l0cykuXCJ9LGlzX2ludGVnZXI6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woTnVtYmVyLmlzSW50ZWdlcih0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBmbG9hdCBpcyBhbiBpbnRlZ2VyLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXNdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6U2suYnVpbHRpbi5ub25lLm5vbmUkfSxfX2Zvcm1hdF9fOnskbWV0aDpTay5mb3JtYXR0aW5nLm1rTnVtYmVyX19mb3JtYXRfXyghMCksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBmb3JtYXRfc3BlYywgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fSk7Y29uc3QgZz0vX1tlRV18W2VFXV98XFwuX3xfXFwufFsrLV1ffF9fLyxuPS9fKD89W15fXSkvZztTay5idWlsdGluLmZsb2F0Xy5QeUZsb2F0X0NoZWNrPWZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hPyExOlNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSl8fFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8YS5vYiR0eXBlLiRpc1N1YlR5cGUoU2suYnVpbHRpbi5mbG9hdF8pP1xuITA6ITF9O1NrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZS50b0ZpeGVkPWZ1bmN0aW9uKGEpe2E9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIHRoaXMudi50b0ZpeGVkKGEpfTtTay5idWlsdGluLmZsb2F0Xy5wcm90b3R5cGUucm91bmQkPWZ1bmN0aW9uKGEpe3ZhciBiPVNrLmJ1aWx0aW4uYXNudW0kKHRoaXMpO3ZhciBjPXZvaWQgMD09PWE/MDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSk7aWYoU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nKXtiKj1NYXRoLnBvdygxMCxjKTt2YXIgZD1NYXRoLnJvdW5kKGIpO2M9KC41PT09KDA8Yj9iOi1iKSUxPzA9PT1kJTI/ZDpkLTE6ZCkvTWF0aC5wb3coMTAsYyk7cmV0dXJuIHZvaWQgMD09PWE/bmV3IFNrLmJ1aWx0aW4uaW50XyhjKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9YT1NYXRoLnBvdygxMCxjKTtjPU1hdGgucm91bmQoYiphKS9hO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9O1NrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZS5zdHIkPVxuZnVuY3Rpb24oYSxiKXtpZihpc05hTih0aGlzLnYpKXJldHVyblwibmFuXCI7dm9pZCAwPT09YiYmKGI9ITApO2lmKEluZmluaXR5PT10aGlzLnYpcmV0dXJuXCJpbmZcIjtpZigtSW5maW5pdHk9PXRoaXMudiYmYilyZXR1cm5cIi1pbmZcIjtpZigtSW5maW5pdHk9PXRoaXMudiYmIWIpcmV0dXJuXCJpbmZcIjtiPWI/dGhpcy52Ok1hdGguYWJzKHRoaXMudik7aWYodm9pZCAwPT09YXx8MTA9PT1hKXt2YXIgYz1Tay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yi50b1ByZWNpc2lvbigxNik6Yi50b1ByZWNpc2lvbigxMik7dmFyIGQ9Yy5pbmRleE9mKFwiLlwiKTthPWIudG9TdHJpbmcoKS5zbGljZSgwLGQpO2Q9Yi50b1N0cmluZygpLnNsaWNlKGQpO2EubWF0Y2goL14tPzAkLykmJmQuc2xpY2UoMSkubWF0Y2goL14wezQsfS8pJiYoYz0xMj5jLmxlbmd0aD9iLnRvRXhwb25lbnRpYWwoKTpiLnRvRXhwb25lbnRpYWwoMTEpKTtpZigwPmMuaW5kZXhPZihcImVcIikmJjA8PWMuaW5kZXhPZihcIi5cIikpe2Zvcig7XCIwXCI9PVxuYy5jaGFyQXQoYy5sZW5ndGgtMSk7KWM9Yy5zdWJzdHJpbmcoMCxjLmxlbmd0aC0xKTtcIi5cIj09Yy5jaGFyQXQoYy5sZW5ndGgtMSkmJihjKz1cIjBcIil9Yz1jLnJlcGxhY2UoL1xcLjArZS8sXCJlXCIsXCJpXCIpO2M9Yy5yZXBsYWNlKC8oZVstK10pKFsxLTldKSQvLFwiJDEwJDJcIik7Yz1jLnJlcGxhY2UoLzArKGUuKikvLFwiJDFcIil9ZWxzZSBjPWIudG9TdHJpbmcoYSk7MD09PXRoaXMudiYmLUluZmluaXR5PT09MS90aGlzLnYmJihjPVwiLVwiK2MpOzA+Yy5pbmRleE9mKFwiLlwiKSYmMD5jLmluZGV4T2YoXCJFXCIpJiYwPmMuaW5kZXhPZihcImVcIikmJihjKz1cIi4wXCIpO3JldHVybiBjfTtTay5idWlsdGluLmZsb2F0Xy5weTIkbWV0aG9kcz17fX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2xldCBiPWEudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGIpcmV0dXJuIGI7YS5uYiRmbG9hdCYmKGI9YS5uYiRmbG9hdCgpKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7XG5yZXR1cm4gYi52fWZ1bmN0aW9uIGMoYSxiLGMpe2lmKGM9PT1Tay5idWlsdGluLmNvbXBsZXgucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KGEsYik7Yz1uZXcgYy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmNvbXBsZXguY2FsbChjLGEsYik7cmV0dXJuIGN9ZnVuY3Rpb24gYihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtjb25zdCBkPXRoaXMucmVhbCxlPXRoaXMuaW1hZzt2YXIgZj1jLnJlYWw7Y29uc3QgZz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBmKWM9Yy5pbWFnO2Vsc2UgaWYoXCJudW1iZXJcIj09PXR5cGVvZiBnKWY9ZyxjPTA7ZWxzZSBpZihKU0JJLl9faXNCaWdJbnQoZykpe2lmKHZvaWQgMD09PWIpe2lmKGY9cGFyc2VGbG9hdChKU0JJLnRvTnVtYmVyKGcpKSxJbmZpbml0eT09Znx8LUluZmluaXR5PT1mKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7fWVsc2UgZj1cbmcudG9TdHJpbmcoKTtjPTB9ZWxzZSByZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7cmV0dXJuIGEoZCxlLGYsYyl9fWZ1bmN0aW9uIGUoYSxiLGMsZCl7dmFyIGU9TWF0aC5hYnMoYyk7Y29uc3QgZj1NYXRoLmFicyhkKTtpZihlPj1mKXtpZigwPT09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImNvbXBsZXggZGl2aXNpb24gYnkgemVyb1wiKTtlPWQvYztjKz1kKmU7ZD0oYStiKmUpL2M7YT0oYi1hKmUpL2N9ZWxzZSBmPj1lPyhlPWMvZCxjPWMqZStkLFNrLmFzc2VydHMuYXNzZXJ0KDAhPT1kKSxkPShhKmUrYikvYyxhPShiKmUtYSkvYyk6YT1kPU5hTjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleChkLGEpfWZ1bmN0aW9uIGYoYSxiLGMsZCl7aWYoMD09PWMmJjA9PT1kKXtkPTE7dmFyIGU9MH1lbHNlIGlmKDA9PT1hJiYwPT09Yil7aWYoMCE9PWR8fDA+Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImNvbXBsZXggZGl2aXNpb24gYnkgemVyb1wiKTtcbmU9ZD0wfWVsc2V7Y29uc3QgZj1NYXRoLmh5cG90KGEsYik7ZT1NYXRoLnBvdyhmLGMpO2E9TWF0aC5hdGFuMihiLGEpO2MqPWE7MCE9PWQmJihlLz1NYXRoLmV4cChhKmQpLGMrPWQqTWF0aC5sb2coZikpO2Q9ZSpNYXRoLmNvcyhjKTtlKj1NYXRoLnNpbihjKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleChkLGUpfWZ1bmN0aW9uIGwoYSxiLGMpe2xldCBkPTE7dmFyIGU9bmV3IFNrLmJ1aWx0aW4uY29tcGxleCgxLDApO2ZvcihhPW5ldyBTay5idWlsdGluLmNvbXBsZXgoYSxiKTswPGQmJmM+PWQ7KWMmZCYmKGU9bmV3IFNrLmJ1aWx0aW4uY29tcGxleChlLnJlYWwqYS5yZWFsLWUuaW1hZyphLmltYWcsZS5yZWFsKmEuaW1hZythLnJlYWwqZS5pbWFnKSksZDw8PTEsYT1uZXcgU2suYnVpbHRpbi5jb21wbGV4KGEucmVhbCphLnJlYWwtYS5pbWFnKmEuaW1hZywyKmEucmVhbCphLmltYWcpO3JldHVybiBlfWZ1bmN0aW9uIGgoYSxiLGMsZCxlKXtlPSExO3N3aXRjaChiKXtjYXNlIFwiZVwiOmNhc2UgXCJmXCI6Y2FzZSBcImdcIjpicmVhaztcbmNhc2UgXCJFXCI6ZT0hMDtiPVwiZVwiO2JyZWFrO2Nhc2UgXCJGXCI6ZT0hMDtiPVwiZlwiO2JyZWFrO2Nhc2UgXCJyXCI6aWYoMCE9PWMpdGhyb3cgRXJyb3IoXCJCYWQgaW50ZXJuYWxsIGNhbGxcIik7Yz0xNztiPVwiZ1wiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoXCJCYWQgaW50ZXJuYWxsIGNhbGxcIik7fWlmKGlzTmFOKGEpKWE9XCJuYW5cIjtlbHNlIGlmKEluZmluaXR5PT09YSlhPVwiaW5mXCI7ZWxzZSBpZigtSW5maW5pdHk9PT1hKWE9XCItaW5mXCI7ZWxzZXtkJmguUHlfRFRTRl9BRERfRE9UXzAmJihiPVwiZ1wiKTt2YXIgZj1cIiVcIisoZCZoLlB5X0RUU0ZfQUxUP1wiI1wiOlwiXCIpO251bGwhPWMmJihmPWYrXCIuXCIrYyk7Zj1uZXcgU2suYnVpbHRpbi5zdHIoZitiKTthPWYubmIkcmVtYWluZGVyKG5ldyBTay5idWlsdGluLmZsb2F0XyhhKSk7YT1hLnZ9ZCZoLlB5X0RUU0ZfU0lHTiYmXCItXCIhPT1hWzBdJiYoYT1cIitcIithKTtlJiYoYT1hLnRvVXBwZXJDYXNlKCkpO3JldHVybiBhfVNrLmJ1aWx0aW4uY29tcGxleD1cblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJjb21wbGV4XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uY29tcGxleCxcImJhZCBjYWxsIHRvIGNvbXBsZXggY29uc3RydWN0b3IsIHVzZSAnbmV3J1wiKTt0aGlzLnJlYWw9YTt0aGlzLmltYWc9Yn0sc2xvdHM6e3RwJGFzX251bWJlcjohMCx0cCRkb2M6XCJDcmVhdGUgYSBjb21wbGV4IG51bWJlciBmcm9tIGEgcmVhbCBwYXJ0IGFuZCBhbiBvcHRpb25hbCBpbWFnaW5hcnkgcGFydC5cXG5cXG5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gKHJlYWwgKyBpbWFnKjFqKSB3aGVyZSBpbWFnIGRlZmF1bHRzIHRvIDAuXCIsdHAkaGFzaCgpe3ZhciBhPShuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5yZWFsKSkudHAkaGFzaCgpO2E9MTAwMyoobmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMuaW1hZykpLnRwJGhhc2goKSthO3JldHVybiBTay5idWlsdGluLmludF8ud2l0aGluVGhyZXNob2xkKGEpP1xuYToobmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLkJpZ0ludChhKSkpLnRwJGhhc2goKX0sdHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGIsZSl7Yj1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImNvbXBsZXhcIixbXCJyZWFsXCIsXCJpbWFnXCJdLGIsZSxbbnVsbCxudWxsXSk7e3ZhciBmPWJbMV0sZztsZXQgaz1lPSExO3ZhciBoPWJbMF07aWYobnVsbCE9aCYmaC5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uY29tcGxleCYmbnVsbD09ZillPWg7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGgpKXtpZihudWxsIT1mKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBjYW4ndCB0YWtlIHNlY29uZCBhcmcgaWYgZmlyc3QgaXMgYSBzdHJpbmdcIik7ZT1Tay5idWlsdGluLmNvbXBsZXguY29tcGxleF9zdWJ0eXBlX2Zyb21fc3RyaW5nKGgsdGhpcyl9ZWxzZXtpZihudWxsIT1mJiZTay5idWlsdGluLmNoZWNrU3RyaW5nKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBzZWNvbmQgYXJnIGNhbid0IGJlIGEgc3RyaW5nXCIpO1xubnVsbD09aD9iPW51bGw6KGI9U2suYWJzdHIubG9va3VwU3BlY2lhbChoLFNrLmJ1aWx0aW4uc3RyLiRjb21wbGV4KSxiPXZvaWQgMCE9PWI/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW10pOm51bGwpO2lmKG51bGwhPWImJmIhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCl7aWYoIWQoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19jb21wbGV4X18gc2hvdWxkIHJldHVybiBhIGNvbXBsZXggb2JqZWN0XCIpO2g9Yn1pZihudWxsIT1oJiZ2b2lkIDA9PT1oLm5iJGZsb2F0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGgpK1wiJ1wiKTtpZihudWxsIT1mJiZ2b2lkIDA9PT1mLm5iJGZsb2F0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciwgbm90ICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGgpK1wiJ1wiKTtudWxsPT1oP2g9Yj0wOmQoaCk/KGI9aC5yZWFsLGg9aC5pbWFnLGU9ITApOihiPWEoaCksaD0wKTtudWxsPT1mP2Y9Zz0wOmQoZik/KGc9Zi5yZWFsLGY9Zi5pbWFnLGs9ITApOihnPWEoZiksZj0wKTshMD09PWsmJihiLT1mKTshMD09PWUmJihnKz1oKTtlPWMoYixnLHRoaXMpfX1yZXR1cm4gZX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihcIkVxXCIhPT1jJiZcIk5vdEVxXCIhPT1jKXtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpfHxkKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVyc1wiKTtyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9cmV0dXJuIGIoZnVuY3Rpb24oYSxiLGQsZSl7YT1hPT1kJiZiPT1lO3JldHVyblwiRXFcIj09PWM/YTohYX0sITApLmNhbGwodGhpcyxhKX0sJHIoKXt7dmFyIGEsXG5iO2xldCBlPWE9XCJcIjt2YXIgYz10aGlzLnJlYWw7dmFyIGQ9dGhpcy5pbWFnO2lmKGI9MD09PWMpYj0xPT0oYz8wPmM/LTE6MTowPjEvYz8tMToxKTtiPyhjPVwiXCIsYj1oKGQsXCJnXCIsbnVsbCwwLG51bGwpKTooYz1hPWgoYyxcImdcIixudWxsLDAsbnVsbCksYj1oKGQsXCJnXCIsbnVsbCxoLlB5X0RUU0ZfU0lHTixudWxsKSwwPT09ZCYmLUluZmluaXR5PT09MS9kJiZiJiZcIi1cIiE9PWJbMF0mJihiPVwiLVwiK2IpLGE9XCIoXCIsZT1cIilcIik7ZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJcIithK2MrYitcImpcIitlKX1yZXR1cm4gZH0sbmIkaW50KCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGludFwiKTt9LG5iJGxvbmcoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gbG9uZ1wiKTt9LG5iJGZsb2F0KCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGZsb2F0XCIpO1xufSxuYiRwb3NpdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KHRoaXMucmVhbCx0aGlzLmltYWcpfSxuYiRuZWdhdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KC10aGlzLnJlYWwsLXRoaXMuaW1hZyl9LG5iJGJvb2woKXtyZXR1cm4gdGhpcy5yZWFsfHx0aGlzLmltYWd9LG5iJGFkZDpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChhK2MsYitkKSksbmIkc3VidHJhY3Q6YigoYSxiLGMsZCk9Pm5ldyBTay5idWlsdGluLmNvbXBsZXgoYS1jLGItZCkpLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChjLWEsZC1iKSksbmIkbXVsdGlwbHk6YigoYSxiLGMsZCk9Pm5ldyBTay5idWlsdGluLmNvbXBsZXgoYyphLWQqYixhKmQrYipjKSksbmIkZGl2aWRlOmIoZSksbmIkcmVmbGVjdGVkX2RpdmlkZTpiKChhLGIsYyxkKT0+ZShjLGQsYSxiKSksbmIkZmxvb3JfZGl2aWRlKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb2YgY29tcGxleCBudW1iZXIuXCIpO1xufSxuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb2YgY29tcGxleCBudW1iZXIuXCIpO30sbmIkcmVtYWluZGVyKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG1vZCBjb21wbGV4IG51bWJlcnMuXCIpO30sbmIkcmVmbGVjdGVkX3JlbWFpbmRlcihhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtb2QgY29tcGxleCBudW1iZXJzLlwiKTt9LG5iJGRpdm1vZChhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCB0YWtlIGZsb29yIG9yIG1vZCBvZiBjb21wbGV4IG51bWJlci5cIik7fSxuYiRwb3dlcihhLGIpe2lmKG51bGwhPWImJiFTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCBtb2R1bG9cIik7cmV0dXJuIGsuY2FsbCh0aGlzLGEpfSxuYiRhYnMoKXt2YXIgYT1cbnRoaXMucmVhbDtjb25zdCBiPXRoaXMuaW1hZztpZighTnVtYmVyLmlzRmluaXRlKGEpfHwhTnVtYmVyLmlzRmluaXRlKGIpKXJldHVybiBJbmZpbml0eT09PWF8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKGEpKTpJbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKGIpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oTmFOKTthPU1hdGguaHlwb3QoYSxiKTtpZighTnVtYmVyLmlzRmluaXRlKGEpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJhYnNvbHV0ZSB2YWx1ZSB0b28gbGFyZ2VcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX19LGdldHNldHM6e3JlYWw6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMucmVhbCl9LCRkb2M6XCJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn0saW1hZzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5pbWFnKX0sXG4kZG9jOlwidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn19LG1ldGhvZHM6e2Nvbmp1Z2F0ZTp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleCh0aGlzLnJlYWwsLXRoaXMuaW1hZyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJjb21wbGV4LmNvbmp1Z2F0ZSgpIC0+IGNvbXBsZXhcXG5cXG5SZXR1cm4gdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGl0cyBhcmd1bWVudC4gKDMtNGopLmNvbmp1Z2F0ZSgpID09IDMrNGouXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMucmVhbCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMuaW1hZyldKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9LF9fZm9ybWF0X186eyRtZXRoKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIl9fZm9ybWF0X18gaXMgbm90IGltcGxlbWVudGVkIGZvciBjb21wbGV4IHR5cGUuXCIpO1xudGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19mb3JtYXRfXyByZXF1aXJlcyBzdHJcIik7fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiY29tcGxleC5fX2Zvcm1hdF9fKCkgLT4gc3RyXFxuXFxuQ29udmVydCB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gZm9ybWF0X3NwZWMuXCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY29tcGxleFwiLFNrLmJ1aWx0aW4uY29tcGxleCk7Y29uc3QgZD1Tay5idWlsdGluLmNoZWNrQ29tcGxleCxnPS9fW2VFXXxbZUVdX3xcXC5ffF9cXC58WystXV98X2p8al8vLG49L18oPz1bXl9dKS9nO1NrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmc9ZnVuY3Rpb24oYSxiKXtiPWJ8fFNrLmJ1aWx0aW4uY29tcGxleC5wcm90b3R5cGU7dmFyIGQ9MCxlPTAsZj0hMTtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKWE9U2suZmZpLnJlbWFwVG9KcyhhKTtlbHNlIGlmKFwic3RyaW5nXCIhPT1cbnR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoXCJwcm92aWRlZCB1bnN1cHBvcnRlZCBzdHJpbmctYWxpa2UgYXJndW1lbnRcIik7aWYoLTEhPT1hLmluZGV4T2YoXCJcXHgwMFwiKXx8MD09PWEubGVuZ3RofHxcIlwiPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCgpIGFyZyBpcyBhIG1hbGZvcm1lZCBzdHJpbmdcIik7dmFyIGg9MDthPWEucmVwbGFjZSgvaW5mfGluZmluaXR5L2dpLFwiSW5maW5pdHlcIik7Zm9yKGE9YS5yZXBsYWNlKC9uYW4vZ2ksXCJOYU5cIik7XCIgXCI9PT1hW2hdOyloKys7aWYoXCIoXCI9PT1hW2hdKWZvcihmPSEwLGgrKztcIiBcIj09PWFbaF07KWgrKztpZigtMSE9PWEuaW5kZXhPZihcIl9cIikpe2lmKGcudGVzdChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGNvbXBsZXg6ICdcIithK1wiJ1wiKTthPWEuY2hhckF0KDApK2Euc3Vic3RyaW5nKDEpLnJlcGxhY2UobixcIlwiKX12YXIgaz0vXig/OlsrLV0/KD86KD86KD86XFxkKlxcLlxcZCspfCg/OlxcZCtcXC4/KSkoPzpbZUVdWystXT9cXGQrKT98TmFOfEluZmluaXR5KSkvO1xudmFyIGw9YS5zdWJzdHIoaCk7dmFyIHA9bC5tYXRjaChrKTtpZihudWxsIT09cClpZihoKz1wWzBdLmxlbmd0aCxcImpcIj09PWFbaF18fFwiSlwiPT09YVtoXSllPXBhcnNlRmxvYXQocFswXSksaCsrO2Vsc2UgaWYoXCIrXCI9PT1hW2hdfHxcIi1cIj09PWFbaF0pe2Q9cGFyc2VGbG9hdChwWzBdKTtwPWEuc3Vic3RyKGgpLm1hdGNoKGspO251bGwhPT1wPyhlPXBhcnNlRmxvYXQocFswXSksaCs9cFswXS5sZW5ndGgpOihlPVwiK1wiPT09YVtoXT8xOi0xLGgrKyk7aWYoXCJqXCIhPT1hW2hdJiZcIkpcIiE9PWFbaF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtoKyt9ZWxzZSBkPXBhcnNlRmxvYXQocFswXSk7ZWxzZSBwPXA9bC5tYXRjaCgvXihbKy1dP1tqSl0pLyksbnVsbCE9PXAmJihlPTE9PT1wWzBdLmxlbmd0aD8xOlwiK1wiPT09cFswXVswXT8xOi0xLGgrPXBbMF0ubGVuZ3RoKTtmb3IoO1wiIFwiPT09YVtoXTspaCsrO2lmKGYpe2lmKFwiKVwiIT09XG5hW2hdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb21wbGV4KCkgYXJnIGlzIG1hbGZvcm1lZCBzdHJpbmdcIik7Zm9yKGgrKztcIiBcIj09PWFbaF07KWgrK31pZihhLmxlbmd0aCE9PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtyZXR1cm4gYyhkLGUsYil9O2NvbnN0IGs9YigoYSxiLGMsZCk9Pntjb25zdCBnPWN8MDtyZXR1cm4gMD09PWQmJmM9PT1nPygxMDA8Z3x8LTEwMD5nP2E9ZihhLGIsZywwKTowPGc/YT1sKGEsYixnKTooYT1sKGEsYiwtZyksYT1lKDEsMCxhLnJlYWwsYS5pbWFnKSksYSk6ZihhLGIsYyxkKX0pO2guUHlfRFRTRl9TSUdOPTE7aC5QeV9EVFNGX0FERF9ET1RfMD0yO2guUHlfRFRTRl9BTFQ9NDtoLlB5X0RUU1RfRklOSVRFPTA7aC5QeV9EVFNUX0lORklOSVRFPTE7aC5QeV9EVFNUX05BTj0yfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc2xpY2U9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInNsaWNlXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIpe3ZvaWQgMD09PWMmJnZvaWQgMD09PWImJihjPWEsYT1Tay5idWlsdGluLm5vbmUubm9uZSQpO3ZvaWQgMD09PWMmJihjPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7dm9pZCAwPT09YiYmKGI9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt0aGlzLnN0YXJ0PWE7dGhpcy5zdG9wPWM7dGhpcy5zdGVwPWJ9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRkb2M6XCJzbGljZShzdG9wKVxcbnNsaWNlKHN0YXJ0LCBzdG9wWywgc3RlcF0pXFxuXFxuQ3JlYXRlIGEgc2xpY2Ugb2JqZWN0LiAgVGhpcyBpcyB1c2VkIGZvciBleHRlbmRlZCBzbGljaW5nIChlLmcuIGFbMDoxMDoyXSkuXCIsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInNsaWNlXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic2xpY2VcIixhLDEsMyk7cmV0dXJuIG5ldyBTay5idWlsdGluLnNsaWNlKC4uLmEpfSxcbiRyKCl7Y29uc3QgYT1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuc3RhcnQpLGM9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0b3ApLGI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0ZXApO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJzbGljZShcIithK1wiLCBcIitjK1wiLCBcIitiK1wiKVwiKX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihhLm9iJHR5cGUhPT1Tay5idWlsdGluLnNsaWNlKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBiPW5ldyBTay5idWlsdGluLnR1cGxlKFt0aGlzLnN0YXJ0LHRoaXMuc3RvcCx0aGlzLnN0ZXBdKTthPW5ldyBTay5idWlsdGluLnR1cGxlKFthLnN0YXJ0LGEuc3RvcCxhLnN0ZXBdKTtyZXR1cm4gYi50cCRyaWNoY29tcGFyZShhLGMpfX0sZ2V0c2V0czp7c3RhcnQ6eyRnZXQoKXtyZXR1cm4gdGhpcy5zdGFydH19LHN0ZXA6eyRnZXQoKXtyZXR1cm4gdGhpcy5zdGVwfX0sc3RvcDp7JGdldCgpe3JldHVybiB0aGlzLnN0b3B9fX0sXG5tZXRob2RzOntpbmRpY2VzOnskbWV0aDpmdW5jdGlvbihhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoMD5hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxlbmd0aCBzaG91bGQgbm90IGJlIG5lZ2F0aXZlXCIpO2NvbnN0IHtzdGFydDpjLHN0b3A6YixzdGVwOmV9PXRoaXMuc2xpY2UkaW5kaWNlcyhhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8oYyksbmV3IFNrLmJ1aWx0aW4uaW50XyhiKSxuZXcgU2suYnVpbHRpbi5pbnRfKGUpXSl9LCRkb2M6XCJTLmluZGljZXMobGVuKSAtPiAoc3RhcnQsIHN0b3AsIHN0cmlkZSlcXG5cXG5Bc3N1bWluZyBhIHNlcXVlbmNlIG9mIGxlbmd0aCBsZW4sIGNhbGN1bGF0ZSB0aGUgc3RhcnQgYW5kIHN0b3BcXG5pbmRpY2VzLCBhbmQgdGhlIHN0cmlkZSBsZW5ndGggb2YgdGhlIGV4dGVuZGVkIHNsaWNlIGRlc2NyaWJlZCBieVxcblMuIE91dCBvZiBib3VuZHMgaW5kaWNlcyBhcmUgY2xpcHBlZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggdGhlXFxuaGFuZGxpbmcgb2Ygbm9ybWFsIHNsaWNlcy5cIixcbiR0ZXh0c2lnOm51bGwsJGZsYWdzOntPbmVBcmc6ITB9fX0scHJvdG86e3NsaWNlJGFzX2luZGljZXMoYSl7bGV0IGM7dmFyIGI9YT9hPT5Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxudWxsLFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIE5vbmUgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpOmE9PlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgTm9uZSBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik7aWYoU2suYnVpbHRpbi5jaGVja05vbmUodGhpcy5zdGVwKSljPTE7ZWxzZSBpZihjPWIodGhpcy5zdGVwKSwwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwic2xpY2Ugc3RlcCBjYW5ub3QgYmUgemVyb1wiKTthPVNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMuc3RhcnQpP251bGw6Yih0aGlzLnN0YXJ0KTtiPVNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMuc3RvcCk/bnVsbDpcbmIodGhpcy5zdG9wKTtyZXR1cm57c3RhcnQ6YSxzdG9wOmIsc3RlcDpjfX0sJHdydChhLGMsYixlLGYpe2Y9Zj9iPT5KU0JJLl9faXNCaWdJbnQoYik/SlNCSS5hZGQoYixKU0JJLkJpZ0ludChhKSk6YithOmI9PmIrYTswPGU/KG51bGw9PT1jP2M9MDowPmMmJihjPWYoYyksMD5jJiYoYz0wKSksbnVsbD09PWI/Yj1hOmI+YT9iPWE6MD5iJiYoYj1mKGIpKSk6KG51bGw9PT1jP2M9YS0xOmM+PWE/Yz1hLTE6MD5jJiYoYz1mKGMpKSxudWxsPT09Yj9iPS0xOjA+YiYmKGI9ZihiKSwwPmImJihiPS0xKSkpO3JldHVybntzdGFydDpjLHN0b3A6YixzdGVwOmV9fSxzbGljZSRpbmRpY2VzKGEsYyl7bGV0IHtzdGFydDpiLHN0b3A6ZSxzdGVwOmZ9PXRoaXMuc2xpY2UkYXNfaW5kaWNlcyghMCxjKTtyZXR1cm4gdGhpcy4kd3J0KGEsYixlLGYsYyl9LHNzc2l0ZXIkKGEsYyl7bGV0IHtzdGFydDpiLHN0b3A6ZSxzdGVwOmZ9PXRoaXMuc2xpY2UkaW5kaWNlcyhhLCEwKTtpZigwPGYpZm9yKGE9YjthPFxuZTthKz1mKWMoYSk7ZWxzZSBmb3IoYT1iO2E+ZTthKz1mKWMoYSl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0PWZ1bmN0aW9uKGEsYyxiKXthPWEuc3EkbGVuZ3RoKCk7dm9pZCAwPT09Y3x8U2suYnVpbHRpbi5jaGVja05vbmUoYyk/Yz0wOihjPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChjLG51bGwsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpLDA+YyYmKGMrPWEsMD5jJiYoYz0wKSkpO3ZvaWQgMD09PWJ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpP2I9YTooYj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYixudWxsLFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKSwwPmI/KGIrPWEsMD5iJiYoYj0wKSk6Yj5hJiYoYj1hKSk7cmV0dXJue3N0YXJ0OmMsZW5kOmJ9fX0sZnVuY3Rpb24obSxcbnEpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBTay5idWlsdGluLmNoZWNrQW55U2V0KGIpP2EuY2FsbCh0aGlzLGIpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBjKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLnNldCYmYS50cCRoYXNoPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYT1uZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQoU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSkpKTtyZXR1cm4gYX1tPXt9O1NrLmJ1aWx0aW4uc2V0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJzZXRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zZXQsXCJCYWQgY2FsbCB0byBzZXQgLSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIEFycmF5IGFuZCAnbmV3J1wiKTtcbmNvbnN0IGI9W107Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pLGIucHVzaCghMCk7dGhpcy52PW5ldyBTay5idWlsdGluLmRpY3QoYik7dGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfbnVtYmVyOiEwLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkZG9jOlwic2V0KCkgLT4gbmV3IGVtcHR5IHNldCBvYmplY3RcXG5zZXQoaXRlcmFibGUpIC0+IG5ldyBzZXQgb2JqZWN0XFxuXFxuQnVpbGQgYW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2YgdW5pcXVlIGVsZW1lbnRzLlwiLHRwJGluaXQoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic2V0XCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic2V0XCIsYSwwLDEpO3RoaXMuc2V0JGNsZWFyKCk7cmV0dXJuKGE9YVswXSkmJnRoaXMuc2V0JHVwZGF0ZShhKX0sdHAkbmV3OlNrLmdlbmVyaWMubmV3LFxuJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIiguLi4pXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMuc2skYXNhcnJheSgpLm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTt0aGlzLmluJHJlcHI9ITE7cmV0dXJuIFNrLl9fZnV0dXJlX18ucHl0aG9uMz8wPT09YS5sZW5ndGg/bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKClcIik6dGhpcy5vYiR0eXBlIT09U2suYnVpbHRpbi5zZXQ/bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKHtcIithLmpvaW4oXCIsIFwiKStcIn0pXCIpOm5ldyBTay5idWlsdGluLnN0cihcIntcIithLmpvaW4oXCIsIFwiKStcIn1cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKFtcIithLmpvaW4oXCIsIFwiKStcIl0pXCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLFxuYil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tBbnlTZXQoYSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO3N3aXRjaChiKXtjYXNlIFwiTm90RXFcIjpjYXNlIFwiRXFcIjpyZXR1cm4gYT10aGlzPT09YT8hMDp0aGlzLmdldCRzaXplKCkhPT1hLmdldCRzaXplKCk/ITE6U2subWlzY2V2YWwuaXNUcnVlKHRoaXMuc2V0JGlzc3Vic2V0KGEpKSxcIkVxXCI9PT1iP2E6IWE7Y2FzZSBcIkx0RVwiOnJldHVybiB0aGlzPT09YXx8U2subWlzY2V2YWwuaXNUcnVlKHRoaXMuc2V0JGlzc3Vic2V0KGEpKTtjYXNlIFwiR3RFXCI6cmV0dXJuIHRoaXM9PT1hfHxTay5taXNjZXZhbC5pc1RydWUoYS5zZXQkaXNzdWJzZXQodGhpcykpO2Nhc2UgXCJMdFwiOnJldHVybiB0aGlzLmdldCRzaXplKCk8YS5nZXQkc2l6ZSgpJiZTay5taXNjZXZhbC5pc1RydWUodGhpcy5zZXQkaXNzdWJzZXQoYSkpO2Nhc2UgXCJHdFwiOnJldHVybiB0aGlzLmdldCRzaXplKCk+YS5nZXQkc2l6ZSgpJiZTay5taXNjZXZhbC5pc1RydWUoYS5zZXQkaXNzdWJzZXQodGhpcykpfX0sXG5uYiRzdWJ0cmFjdDphKGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpZmZlcmVuY2UuJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkYW5kOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaW50ZXJzZWN0aW9uLiRtZXRoLmNhbGwodGhpcyxhKX0pLG5iJG9yOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudW5pb24uJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkeG9yOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3ltbWV0cmljX2RpZmZlcmVuY2UuJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkaW5wbGFjZV9zdWJ0cmFjdDphKGZ1bmN0aW9uKGEpe2E9PT10aGlzJiYoYT1hLnNldCRjb3B5KCkpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLmRpZmZlcmVuY2VfdXBkYXRlLiRtZXRoLmNhbGwodGhpcyxhKSwoKT0+dGhpcyl9KSxuYiRpbnBsYWNlX2FuZDphKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLmludGVyc2VjdGlvbl91cGRhdGUuJG1ldGguY2FsbCh0aGlzLFxuYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV9vcjphKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZS4kbWV0aC5jYWxsKHRoaXMsYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV94b3I6YShmdW5jdGlvbihhKXthPT09dGhpcyYmKGE9YS5zZXQkY29weSgpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUuJG1ldGguY2FsbCh0aGlzLGEpLCgpPT50aGlzKX0pLHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmdldCRzaXplKCl9LHNxJGNvbnRhaW5zKGEpe2E9YyhhKTtyZXR1cm4gdGhpcy52LnNxJGNvbnRhaW5zKGEpfX0sbWV0aG9kczp7YWRkOnskbWV0aChhKXt0aGlzLnNldCRhZGQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkFkZCBhbiBlbGVtZW50IHRvIGEgc2V0LlxcblxcblRoaXMgaGFzIG5vIGVmZmVjdCBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHByZXNlbnQuXCJ9LFxuY2xlYXI6eyRtZXRoKCl7dGhpcy5zZXQkY2xlYXIoKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgc2V0LlwifSxjb3B5OnskbWV0aCgpe3JldHVybiB0aGlzLnNldCRjb3B5KCl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBzZXQuXCJ9LGRpc2NhcmQ6eyRtZXRoKGEpe2E9YyhhKTt0aGlzLnNldCRkaXNjYXJkKGEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgc2V0IGlmIGl0IGlzIGEgbWVtYmVyLlxcblxcbklmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgZG8gbm90aGluZy5cIn0sZGlmZmVyZW5jZTp7JG1ldGgoLi4uYSl7Y29uc3QgYj10aGlzLnNldCRjb3B5KCk7XG5yZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KGEsYT0+Yi5zZXQkZGlmZmVyZW5jZV91cGRhdGUoYSkpLCgpPT5iKX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiB0aGUgZGlmZmVyZW5jZSBvZiB0d28gb3IgbW9yZSBzZXRzIGFzIGEgbmV3IHNldC5cXG5cXG4oaS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gdGhpcyBzZXQgYnV0IG5vdCB0aGUgb3RoZXJzLilcIn0sZGlmZmVyZW5jZV91cGRhdGU6eyRtZXRoKC4uLmEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT50aGlzLnNldCRkaWZmZXJlbmNlX3VwZGF0ZShhKSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7TWluQXJnczowfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYWxsIGVsZW1lbnRzIG9mIGFub3RoZXIgc2V0IGZyb20gdGhpcyBzZXQuXCJ9LGludGVyc2VjdGlvbjp7JG1ldGgoLi4uYSl7cmV0dXJuIHRoaXMuc2V0JGludGVyc2VjdGlvbl9tdWx0aSguLi5hKX0sXG4kZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBib3RoIHNldHMuKVwifSxpbnRlcnNlY3Rpb25fdXBkYXRlOnskbWV0aCguLi5hKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zZXQkaW50ZXJzZWN0aW9uX211bHRpKC4uLmEpLGE9Pnt0aGlzLnN3YXAkYm9kaWVzKGEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBpbnRlcnNlY3Rpb24gb2YgaXRzZWxmIGFuZCBhbm90aGVyLlwifSxpc2Rpc2pvaW50OnskbWV0aChhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PntpZih0aGlzLnNxJGNvbnRhaW5zKGEpKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoU2suYnVpbHRpbi5ib29sLmZhbHNlJCl9KSxcbmE9PmF8fFNrLmJ1aWx0aW4uYm9vbC50cnVlJCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0d28gc2V0cyBoYXZlIGEgbnVsbCBpbnRlcnNlY3Rpb24uXCJ9LGlzc3Vic2V0OnskbWV0aChhKXtTay5idWlsdGluLmNoZWNrQW55U2V0KGEpfHwoYT10aGlzLnNldCRtYWtlX2Jhc2V0eXBlKGEpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT50aGlzLnNldCRpc3N1YnNldChhKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXBvcnQgd2hldGhlciBhbm90aGVyIHNldCBjb250YWlucyB0aGlzIHNldC5cIn0saXNzdXBlcnNldDp7JG1ldGgoYSl7U2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8KGE9dGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsYT0+YS5zZXQkaXNzdWJzZXQodGhpcykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCxcbiRkb2M6XCJSZXBvcnQgd2hldGhlciB0aGlzIHNldCBjb250YWlucyBhbm90aGVyIHNldC5cIn0scG9wOnskbWV0aCgpe2lmKDA9PT10aGlzLmdldCRzaXplKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoXCJwb3AgZnJvbSBhbiBlbXB0eSBzZXRcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnYucG9waXRlbSxbdGhpcy52XSkudlswXX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSBzZXQgZWxlbWVudC5cXG5SYWlzZXMgS2V5RXJyb3IgaWYgdGhlIHNldCBpcyBlbXB0eS5cIn0scmVtb3ZlOnskbWV0aChhKXtjb25zdCBiPWMoYSk7aWYodGhpcy52Lm1wJGxvb2t1cChiKSlyZXR1cm4gdGhpcy52Lm1wJGFzc19zdWJzY3JpcHQoYiksU2suYnVpbHRpbi5ub25lLm5vbmUkO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIHNldDsgaXQgbXVzdCBiZSBhIG1lbWJlci5cXG5cXG5JZiB0aGUgZWxlbWVudCBpcyBub3QgYSBtZW1iZXIsIHJhaXNlIGEgS2V5RXJyb3IuXCJ9LHN5bW1ldHJpY19kaWZmZXJlbmNlOnskbWV0aChhKXtsZXQgYjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSxhPT57Yj1hO3JldHVybiBiLnNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUodGhpcyl9LCgpPT5iKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBleGFjdGx5IG9uZSBvZiB0aGUgc2V0cy4pXCJ9LHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZTp7JG1ldGgoYSl7U2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8KGE9dGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSk7XG5yZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT50aGlzLnNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUoYSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJVcGRhdGUgYSBzZXQgd2l0aCB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgaXRzZWxmIGFuZCBhbm90aGVyLlwifSx1bmlvbjp7JG1ldGgoLi4uYSl7Y29uc3QgYj10aGlzLnNldCRjb3B5KCk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLGE9PmIuc2V0JHVwZGF0ZShhKSksKCk9PmIpfSwkZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSB1bmlvbiBvZiBzZXRzIGFzIGEgbmV3IHNldC5cXG5cXG4oaS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gZWl0aGVyIHNldC4pXCJ9LHVwZGF0ZTp7JG1ldGgoLi4uYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLFxuYT0+dGhpcy5zZXQkdXBkYXRlKGEpKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSB1bmlvbiBvZiBpdHNlbGYgYW5kIG90aGVycy5cIn19LHByb3RvOk9iamVjdC5hc3NpZ24obSx7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2skYXNhcnJheSgpfSxnZXQkc2l6ZSgpe3JldHVybiB0aGlzLnYuc3EkbGVuZ3RoKCl9LHNldCRhZGQoYSl7dGhpcy52Lm1wJGFzc19zdWJzY3JpcHQoYSwhMCl9LHNldCRtYWtlX2Jhc2V0eXBlKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKSxhPT5uZXcgdGhpcy5zayRidWlsdGluQmFzZShhKSl9LHNldCRkaXNjYXJkKGEpe3JldHVybiB0aGlzLnYucG9wJGl0ZW0oYSl9LHNldCRjbGVhcigpe3RoaXMudj1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKX0sc2V0JGNvcHkoKXtjb25zdCBhPVxubmV3IHRoaXMuc2skYnVpbHRpbkJhc2U7YS52PXRoaXMudi5kaWN0JGNvcHkoKTtyZXR1cm4gYX0sc2V0JGRpZmZlcmVuY2VfdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc2V0JGRpc2NhcmQoYSl9KX0sc2V0JGludGVyc2VjdGlvbihhKXtjb25zdCBiPW5ldyB0aGlzLnNrJGJ1aWx0aW5CYXNlO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc3EkY29udGFpbnMoYSkmJmIuc2V0JGFkZChhKX0pLCgpPT5iKX0sc2V0JGludGVyc2VjdGlvbl9tdWx0aSguLi5hKXtpZighYS5sZW5ndGgpcmV0dXJuIHRoaXMuc2V0JGNvcHkoKTtsZXQgYj10aGlzO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT5Tay5taXNjZXZhbC5jaGFpbihiLnNldCRpbnRlcnNlY3Rpb24oYSksYT0+e2I9YX0pKSwoKT0+Yil9LFxuc2V0JGlzc3Vic2V0KGEpe2NvbnN0IGI9dGhpcy5nZXQkc2l6ZSgpLGM9YS5nZXQkc2l6ZSgpO2lmKGI+YylyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZighYS5zcSRjb250YWlucyhjKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkfSxzZXQkc3ltbWV0cmljX2RpZmZfdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3ZvaWQgMD09PXRoaXMuc2V0JGRpc2NhcmQoYSkmJnRoaXMuc2V0JGFkZChhKX0pfSxzZXQkdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc2V0JGFkZChhKX0pfSxzd2FwJGJvZGllcyhhKXt0aGlzLnY9YS52fX0pfSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5zZXRcIixcblNrLmJ1aWx0aW4uc2V0KTtxPVNrLmJ1aWx0aW4uc2V0LnByb3RvdHlwZTtTay5idWlsdGluLmZyb3plbnNldD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZnJvemVuc2V0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPVtdKTtTay5hc3NlcnRzLmFzc2VydChBcnJheS5pc0FycmF5KGEpJiZ0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mcm96ZW5zZXQsXCJiYWQgY2FsbCB0byBmcm96ZW4gc2V0IC0gbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBBcnJheSBhbmQgJ25ldydcIik7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSksYi5wdXNoKCEwKTt0aGlzLnY9bmV3IFNrLmJ1aWx0aW4uZGljdChiKTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19udW1iZXI6ITAsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRkb2M6XCJmcm96ZW5zZXQoKSAtPiBlbXB0eSBmcm96ZW5zZXQgb2JqZWN0XFxuZnJvemVuc2V0KGl0ZXJhYmxlKSAtPiBmcm96ZW5zZXQgb2JqZWN0XFxuXFxuQnVpbGQgYW4gaW1tdXRhYmxlIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIHVuaXF1ZSBlbGVtZW50cy5cIixcbnRwJGhhc2goKXtsZXQgYT0xOTI3ODY4MjM3O2NvbnN0IGI9dGhpcy5zayRhc2FycmF5KCk7YSo9Yi5sZW5ndGgrMTtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKyl7Y29uc3QgZT1Tay5hYnN0ci5vYmplY3RIYXNoKGJbY10pO2FePTM2NDQ3OTgxNjcqKGVeZTw8MTZeODk4Njk3NDcpfXJldHVybiA2OTA2OSphKzkwNzEzMzkyM30sdHAkbmV3KGEsYil7aWYodGhpcyE9PVNrLmJ1aWx0aW4uZnJvemVuc2V0LnByb3RvdHlwZSlyZXR1cm4gdGhpcy4kc3VidHlwZV9uZXcoYSxiKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwiZnJvemVuc2V0XCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwiZnJvemVuc2V0XCIsYSwwLDEpO2E9YVswXTtyZXR1cm4gdm9pZCAwIT09YSYmYS5vYiR0eXBlPT09U2suYnVpbHRpbi5mcm96ZW5zZXQ/YTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKSxhPT5hLmxlbmd0aD9uZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQoYSk6XG5Tay5idWlsdGluLmZyb3plbnNldC4kZW1wdHlzZXQpfSwkcjpxLiRyLHRwJGl0ZXI6cS50cCRpdGVyLHRwJHJpY2hjb21wYXJlOnEudHAkcmljaGNvbXBhcmUsbmIkc3VidHJhY3Q6cS5uYiRzdWJ0cmFjdCxuYiRhbmQ6cS5uYiRhbmQsbmIkb3I6cS5uYiRvcixuYiR4b3I6cS5uYiR4b3Isc3EkbGVuZ3RoOnEuc3EkbGVuZ3RoLHNxJGNvbnRhaW5zOnEuc3EkY29udGFpbnN9LG1ldGhvZHM6e2NvcHk6T2JqZWN0LmFzc2lnbih7fSxxLmNvcHkuZCRkZWYseyRtZXRoKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3I9PT10aGlzLnNrJGJ1aWx0aW5CYXNlP3RoaXM6bmV3IFNrLmJ1aWx0aW4uZnJvemVuc2V0KHRoaXMuc2skYXNhcnJheSgpKX19KSxkaWZmZXJlbmNlOnEuZGlmZmVyZW5jZS5kJGRlZixpbnRlcnNlY3Rpb246cS5pbnRlcnNlY3Rpb24uZCRkZWYsaXNkaXNqb2ludDpxLmlzZGlzam9pbnQuZCRkZWYsaXNzdWJzZXQ6cS5pc3N1YnNldC5kJGRlZixpc3N1cGVyc2V0OnEuaXNzdXBlcnNldC5kJGRlZixcbnN5bW1ldHJpY19kaWZmZXJlbmNlOnEuc3ltbWV0cmljX2RpZmZlcmVuY2UuZCRkZWYsdW5pb246cS51bmlvbi5kJGRlZn0scHJvdG86T2JqZWN0LmFzc2lnbih7JHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYnVpbHRpbi5mcm96ZW5zZXQucHJvdG90eXBlLnRwJG5ldyhhKSxhPT57Yy52PWEudjtyZXR1cm4gY30pfX0sbSl9KTtTay5idWlsdGluLmZyb3plbnNldC4kZW1wdHlzZXQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLmZyb3plbnNldC5wcm90b3R5cGUse3Y6e3ZhbHVlOm5ldyBTay5idWlsdGluLmRpY3QoW10pLGVudW1lcmFibGU6ITB9LGluJHJlcHI6e3ZhbHVlOiExLGVudW1lcmFibGU6ITB9fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5mcm96ZW5zZXRcIixTay5idWlsdGluLmZyb3plbnNldCk7dmFyIGI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwic2V0X2l0ZXJhdG9yXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS5zayRhc2FycmF5KCk7dGhpcy4kb3JpZz1hfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplLG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ucHJpbnQ9ZnVuY3Rpb24oYSxjKXtsZXQgW2IsZSxmXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcInByaW50XCIsW1wic2VwXCIsXCJlbmRcIixcImZpbGVcIixcImZsdXNoXCJdLFtdLGMpO2lmKHZvaWQgMD09PWJ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpKWI9XCIgXCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKWI9Yi4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGIpKTtpZih2b2lkIDA9PT1lfHxTay5idWlsdGluLmNoZWNrTm9uZShlKSllPVwiXFxuXCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGUpKWU9ZS4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImVuZCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShlKSk7bGV0IGw7aWYodm9pZCAwIT09ZiYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpJiYobD1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGYsU2suYnVpbHRpbi5zdHIuJHdyaXRlKSx2b2lkIDA9PT1sKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShmKStcIicgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3dyaXRlJ1wiKTtjb25zdCBoPW5ldyBTay5idWlsdGluLnN0cihhLm1hcChhPT4obmV3IFNrLmJ1aWx0aW4uc3RyKGEpKS50b1N0cmluZygpKS5qb2luKGIpK2UpO1xuaWYodm9pZCAwIT09bClTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkobCxbaF0pO2Vsc2UgcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcInN5c1wiLCExLCEwKSxhPT4obD1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEuJGQuc3Rkb3V0LFNrLmJ1aWx0aW4uc3RyLiR3cml0ZSkpJiZTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkobCxbaF0pKX07U2suYnVpbHRpbi5wcmludC5jb19mYXN0Y2FsbD0xfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubW9kdWxlPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJtb2R1bGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLiRkPXt9fSxzbG90czp7dHAkZG9jOlwiQ3JlYXRlIGEgbW9kdWxlIG9iamVjdC5cXG5cXG5UaGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nOyB0aGUgb3B0aW9uYWwgZG9jIGFyZ3VtZW50IGNhbiBoYXZlIGFueSB0eXBlLlwiLHRwJGdldGF0dHIoYSxjKXt2YXIgYj10aGlzLiRkW2EuJG1hbmdsZWRdO1xuaWYodm9pZCAwIT09YilyZXR1cm4gYjtiPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1iKXtjb25zdCBhPWIudHAkZGVzY3JfZ2V0O3JldHVybiBhP2EuY2FsbChiLHRoaXMsdGhpcy5vYiR0eXBlLGMpOmJ9Y29uc3QgZT10aGlzLiRkLl9fZ2V0YXR0cl9fO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGI9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShlLFthXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSksYz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sdHAkc2V0YXR0cjpTay5nZW5lcmljLnNldEF0dHIsdHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxjKXtjb25zdCBbYixlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcIm1vZHVsZVwiLFtcIm5hbWVcIixcImRvY1wiXSxhLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO1xuU2suYnVpbHRpbi5weUNoZWNrVHlwZShcIm1vZHVsZVwiLFwic3RyaW5nXCIsYik7dGhpcy5pbml0JGRpY3QoYixlKX0sJHIoKXtsZXQgYT10aGlzLmdldCRuYW1lKCk7aWYodm9pZCAwIT09YSl7dmFyIGM9dGhpcy5nZXQkbW9kX3JlcHJmKCk7aWYodm9pZCAwIT09YylyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW3RoaXNdKX1hPXZvaWQgMD09PWE/XCInPydcIjphO2M9dGhpcy5mcm9tJGZpbGUoKTtjPXZvaWQgMD09PWM/dGhpcy5lbXB0eV9vciRsb2FkZXIoKTpjO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8bW9kdWxlIFwiK2ErYytcIj5cIil9fSxnZXRzZXRzOntfX2RpY3RfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5tYXBwaW5ncHJveHkodGhpcy4kZCl9fX0sbWV0aG9kczp7X19kaXJfXzp7JG1ldGgoKXtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kZGljdCk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fZGljdF9fIGlzIG5vdCBhIGRpY3Rpb25hcnlcIik7XG5jb25zdCBjPWEubXAkbG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkaXIpO3JldHVybiB2b2lkIDAhPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFtdKTpuZXcgU2suYnVpbHRpbi5saXN0KFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJfX2Rpcl9fKCkgLT4gbGlzdFxcbnNwZWNpYWxpemVkIGRpcigpIGltcGxlbWVudGF0aW9uXCJ9fSxwcm90bzp7aW5pdCRkaWN0KGEsYyl7dGhpcy4kZC5fX25hbWVfXz1hO3RoaXMuJGQuX19kb2NfXz1jO3RoaXMuJGQuX19wYWNrYWdlX189U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMuJGQuX19zcGVjX189U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMuJGQuX19sb2FkZXJfXz1Tay5idWlsdGluLm5vbmUubm9uZSR9LHNrJGF0dHJFcnJvcigpe2NvbnN0IGE9dGhpcy5nZXQkbmFtZSgpO3JldHVybiB2b2lkIDA9PT1hP1wibW9kdWxlXCI6XCJtb2R1bGUgXCIrYX0sZ2V0JG5hbWUoKXtjb25zdCBhPVxudGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRuYW1lKTtyZXR1cm4gYSYmU2subWlzY2V2YWwub2JqZWN0UmVwcihhKX0sZnJvbSRmaWxlKCl7Y29uc3QgYT10aGlzLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGZpbGUpO3JldHVybiBhJiZcIiBmcm9tIFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYSl9LGVtcHR5X29yJGxvYWRlcigpe2lmKHRoaXMuJGpzJiZ0aGlzLiRqcy5pbmNsdWRlcyhcIiRidWlsdGlubW9kdWxlXCIpKXJldHVyblwiIChidWlsdC1pbilcIjtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbG9hZGVyKTtyZXR1cm4gdm9pZCAwPT09YXx8U2suYnVpbHRpbi5jaGVja05vbmUoYSk/XCJcIjpcIiAoXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIilcIn0sZ2V0JG1vZF9yZXByZigpe2NvbnN0IGE9dGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRsb2FkZXIpO3JldHVybiBhJiZhLnRwJGdldGF0dHIodGhpcy5zdHIkbW9kX3JlcHIpfSxcbnN0ciRtb2RfcmVwcjpuZXcgU2suYnVpbHRpbi5zdHIoXCJtb2R1bGVfcmVwclwiKX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLm1vZHVsZVwiLFNrLmJ1aWx0aW4ubW9kdWxlKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN0cnVjdHNlcV90eXBlcz17fTtTay5idWlsdGluLm1ha2Vfc3RydWN0c2VxPWZ1bmN0aW9uKGEsYyxiLGUpe2NvbnN0IGY9YStcIi5cIitjLGw9W107YT1bXTtmb3IobGV0IGMgaW4gYilsLnB1c2goYyksYS5wdXNoKGJbY10pO2I9e307Zm9yKGxldCBjPTA7YzxsLmxlbmd0aDtjKyspYltsW2NdXT17JGdldCgpe3JldHVybiB0aGlzLnZbY119LCRkb2M6YVtjXX07dmFyIGg9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhmLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgoQXJyYXkuaXNBcnJheShhKXx8dm9pZCAwPT09YSkmJnRoaXMgaW5zdGFuY2VvZiBoKTtTay5idWlsdGluLnR1cGxlLmNhbGwodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLnR1cGxlLFxuc2xvdHM6e3RwJG5ldyhhLGIpe1NrLmFic3RyLmNoZWNrT25lQXJnKGYsYSxiKTtiPVtdO2E9YVswXTtmb3IobGV0IGM9U2suYWJzdHIuaXRlcihhKSxkPWMudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1kO2Q9Yy50cCRpdGVybmV4dCgpKWIucHVzaChkKTtpZihiLmxlbmd0aCE9bC5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGYrXCIoKSB0YWtlcyBhIFwiK2wubGVuZ3RoK1wiLXNlcXVlbmNlIChcIitiLmxlbmd0aCtcIi1zZXF1ZW5jZSBnaXZlbilcIik7cmV0dXJuIG5ldyBoKGIpfSx0cCRkb2M6ZT9lOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCwkcigpe3ZhciBhO2lmKDA9PT10aGlzLnYubGVuZ3RoKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZitcIigpXCIpO3ZhciBiPVtdO2ZvcihhPTA7YTx0aGlzLnYubGVuZ3RoOysrYSliW2FdPWxbYV0rXCI9XCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnZbYV0pO2E9Yi5qb2luKFwiLCBcIik7MT09PXRoaXMudi5sZW5ndGgmJihhKz1cblwiLFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGYrXCIoXCIrYStcIilcIil9fSxtZXRob2RzOntfX3JlZHVjZV9fOnskbWV0aCgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJfX3JlZHVjZV9fIGlzIG5vdCBpbXBsZW1lbnRlZFwiKTt9LCRmbGFnczp7Tm9BcmdzOiEwfX19LGdldHNldHM6Yixwcm90bzp7bnVtX3NlcXVlbmNlX2ZpZWxkczpuZXcgU2suYnVpbHRpbi5pbnRfKGwubGVuZ3RoKX19KTtyZXR1cm4gaH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYWtlX3N0cnVjdHNlcVwiLFNrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXEpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZ2VuZXJhdG9yPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImdlbmVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYixlLGYpe3ZhciBsO2lmKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZ2VuZXJhdG9yKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFkIGludGVybmFsIGNhbGwgdG8gZ2VuZXJhdG9yLCB1c2UgJ25ldydcIik7XG50aGlzLmZ1bmNfY29kZT1hO3RoaXMuZnVuY19nbG9iYWxzPWN8fG51bGw7dGhpcy5naSRydW5uaW5nPSExO3RoaXMuZ2kkcmVzdW1lYXQ9MDt0aGlzLmdpJHNlbnR2YWx1ZT12b2lkIDA7dGhpcy5naSRsb2NhbHM9e307dGhpcy5naSRjZWxscz17fTtpZigwPGIubGVuZ3RoKWZvcihjPTA7YzxhLmNvX3Zhcm5hbWVzLmxlbmd0aDsrK2MpdGhpcy5naSRsb2NhbHNbYS5jb192YXJuYW1lc1tjXV09YltjXTtpZih2b2lkIDAhPT1mKWZvcihsIGluIGYpZVtsXT1mW2xdO3RoaXMuZnVuY19jbG9zdXJlPWV9fSxzbG90czp7JHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGdlbmVyYXRvciBvYmplY3QgXCIrdGhpcy5mdW5jX2NvZGUuY29fbmFtZS52K1wiPlwiKX19LGl0ZXJuZXh0KGEsYyl7dmFyIGI9dGhpczt0aGlzLmdpJHJ1bm5pbmc9ITA7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt0aGlzLmdpJHNlbnR2YWx1ZT1jO2M9W3RoaXNdO3RoaXMuZnVuY19jbG9zdXJlJiZcbmMucHVzaCh0aGlzLmZ1bmNfY2xvc3VyZSk7cmV0dXJuIGZ1bmN0aW9uIGwoYyl7aWYoYyBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pe2lmKGEpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKGwsYyk7Yz1Tay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9Yi5naSRydW5uaW5nPSExO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWMpO2lmKGMhPT1Tay5idWlsdGluLm5vbmUubm9uZSQpcmV0dXJuIGIuZ2kkcmVzdW1lYXQ9Y1swXSxjPWNbMV19KHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGMpKX0sbWV0aG9kczp7c2VuZDp7JG1ldGgoYSl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoITAsYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwic2VuZChhcmcpIC0+IHNlbmQgJ2FyZycgaW50byBnZW5lcmF0b3IsXFxucmV0dXJuIG5leHQgeWllbGRlZCB2YWx1ZSBvciByYWlzZSBTdG9wSXRlcmF0aW9uLlwifX19KTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZ2VuZXJhdG9yXCIsU2suYnVpbHRpbi5nZW5lcmF0b3IpO1NrLmJ1aWx0aW4ubWFrZUdlbmVyYXRvcj1mdW5jdGlvbihhLGMpe3ZhciBiLGU9bmV3IFNrLmJ1aWx0aW4uZ2VuZXJhdG9yKG51bGwsbnVsbCxudWxsKTtlLnRwJGl0ZXJuZXh0PWE7Zm9yKGIgaW4gYyljLmhhc093blByb3BlcnR5KGIpJiYoZVtiXT1jW2JdKTtyZXR1cm4gZX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yXCIsU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZpbGU9ZnVuY3Rpb24oYSxjLGIpe3ZhciBlO2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmlsZSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmZpbGUoYSxjLGIpO3RoaXMubW9kZT1jO3RoaXMubmFtZT1Tay5mZmkucmVtYXBUb0pzKGEpO3RoaXMuY2xvc2VkPSExO2lmKFwiL2Rldi9zdGRvdXRcIj09PXRoaXMubmFtZSl0aGlzLmRhdGEkPVxuU2suYnVpbHRpbi5ub25lLm5vbmUkLHRoaXMuZmlsZW5vPTE7ZWxzZSBpZihcIi9kZXYvc3RkaW5cIj09PXRoaXMubmFtZSl0aGlzLmZpbGVubz0wO2Vsc2UgaWYoXCIvZGV2L3N0ZGVyclwiPT09dGhpcy5uYW1lKXRoaXMuZmlsZW5vPTI7ZWxzZXtpZihcIndcIj09PVNrLmZmaS5yZW1hcFRvSnModGhpcy5tb2RlKSl0aGlzLmZpbGVubz1Tay5idWlsdGluLmZpbGUuY3VycmVudEZpbGVubysrO2Vsc2UgZm9yKGUgaW4gdGhpcy5maWxlbm89U2suaW5Ccm93c2VyPzEwOjExLHRoaXMuZGF0YSQ9U2sucmVhZChhLnYpLHRoaXMubGluZUxpc3Q9dGhpcy5kYXRhJC5zcGxpdChcIlxcblwiKSx0aGlzLmxpbmVMaXN0PXRoaXMubGluZUxpc3Quc2xpY2UoMCwtMSksdGhpcy5saW5lTGlzdCl0aGlzLmxpbmVMaXN0W2VdKz1cIlxcblwiO3RoaXMuY3VycmVudExpbmU9MH10aGlzLnBvcyQ9MDtTay5maWxlb3BlbiYmMTA8PXRoaXMuZmlsZW5vJiZTay5maWxlb3Blbih0aGlzKTtyZXR1cm4gdGhpc307U2suYnVpbHRpbi5maWxlLmN1cnJlbnRGaWxlbm89XG4xMjtTay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlKFwiZmlsZVwiLFNrLmJ1aWx0aW4uZmlsZSxTay5idWlsdGluLm9iamVjdCk7U2suYWJzdHIuc2V0VXBCdWlsdGluTXJvKFNrLmJ1aWx0aW4uZmlsZSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS4kcj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8XCIrKHRoaXMuY2xvc2VkP1wiY2xvc2VkXCI6XCJvcGVuXCIpK1wiZmlsZSAnXCIrdGhpcy5uYW1lK1wiJywgbW9kZSAnXCIrU2suZmZpLnJlbWFwVG9Kcyh0aGlzLm1vZGUpK1wiJz5cIil9O1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUudHAkaXRlcj1mdW5jdGlvbigpe3ZhciBhPXt0cCRpdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LCRvYmo6dGhpcywkaW5kZXg6dGhpcy5jdXJyZW50TGluZSwkbGluZXM6dGhpcy5saW5lTGlzdCx0cCRpdGVybmV4dDpmdW5jdGlvbigpe2lmKCEoYS4kaW5kZXg+PWEuJGxpbmVzLmxlbmd0aCkpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhLiRsaW5lc1thLiRpbmRleCsrXSl9fTtcbnJldHVybiBhfTtTay5hYnN0ci5zZXRVcFNsb3RzKFNrLmJ1aWx0aW4uZmlsZSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5fX2VudGVyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gYX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuX19leGl0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuY2xvc2UsW2FdKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuY2xvc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLmNsb3NlZD0hMDtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5mbHVzaD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe30pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuZmlsZW5vPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZmlsZW5vfSk7XG5Tay5idWlsdGluLmZpbGUucHJvdG90eXBlLmlzYXR0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiExfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5yZWFkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgYj1hLmRhdGEkLmxlbmd0aDtpZihhLmNsb3NlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVwiKTt2YXIgZT12b2lkIDA9PT1jP2I6U2suZmZpLnJlbWFwVG9KcyhjKTtlPW5ldyBTay5idWlsdGluLnN0cihhLmRhdGEkLnN1YnN0cihhLnBvcyQsZSkpO2EucG9zJD12b2lkIDA9PT1jP2I6YS5wb3MkK1NrLmZmaS5yZW1hcFRvSnMoYyk7YS5wb3MkPj1iJiYoYS5wb3MkPWIpO3JldHVybiBlfSk7U2suYnVpbHRpbi5maWxlLiRyZWFkbGluZT1mdW5jdGlvbihhLGMsYil7aWYoMD09PWEuZmlsZW5vKXthPVNrLmZmaS5yZW1hcFRvSnMoYik7YT1Tay5pbnB1dGZ1bihhP1xuYTpcIlwiKTtpZihhIGluc3RhbmNlb2YgUHJvbWlzZXx8YSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGEudGhlbil7dmFyIGU9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247ZS5yZXN1bWU9ZnVuY3Rpb24oKXtpZihlLmRhdGEuZXJyb3IpdGhyb3cgZS5kYXRhLmVycm9yO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZS5kYXRhLnJlc3VsdCl9O2UuZGF0YT17dHlwZTpcIlNrLnByb21pc2VcIixwcm9taXNlOmF9O3JldHVybiBlfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9Yz1cIlwiO2EuY3VycmVudExpbmU8YS5saW5lTGlzdC5sZW5ndGgmJihjPWEubGluZUxpc3RbYS5jdXJyZW50TGluZV0sYS5jdXJyZW50TGluZSsrKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpfTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLnJlYWRsaW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXtyZXR1cm4gU2suYnVpbHRpbi5maWxlLiRyZWFkbGluZShhLGMsdm9pZCAwKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUucmVhZGxpbmVzPVxubmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe2lmKDA9PT1hLmZpbGVubylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcInJlYWRsaW5lcyBpbnMndCBpbXBsZW1lbnRlZCBiZWNhdXNlIHRoZSB3ZWIgZG9lc24ndCBzdXBwb3J0IEN0cmwrRFwiKTt2YXIgYj1bXTtmb3IoYz1hLmN1cnJlbnRMaW5lO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYS5saW5lTGlzdFtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5zZWVrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGIpe2M9U2suZmZpLnJlbWFwVG9KcyhjKTt2b2lkIDA9PT1iJiYoYj0wKTswPT09Yj9hLnBvcyQ9YzoxPT1iP2EucG9zJD1hLmRhdGEkLmxlbmd0aCtjOjI9PWImJihhLnBvcyQ9YS5kYXRhJC5sZW5ndGgrYyk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pO1xuU2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS50ZWxsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoYS5wb3MkKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUudHJ1bmNhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuZmFpbCgpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS53cml0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7dmFyIGI9U2suZmZpLnJlbWFwVG9KcyhhLm1vZGUpO1NrLmZmaS5yZW1hcFRvSnMoYyk7aWYoXCJ3XCI9PT1ifHxcIndiXCI9PT1ifHxcImFcIj09PWJ8fFwiYWJcIj09PWIpaWYoU2suZmlsZXdyaXRlKXtpZihhLmNsb3NlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVwiKTsxPT09YS5maWxlbm8/U2sub3V0cHV0KFNrLmZmaS5yZW1hcFRvSnMoYykpOlNrLmZpbGV3cml0ZShhLGMpfWVsc2UgMT09PVxuYS5maWxlbm8/U2sub3V0cHV0KFNrLmZmaS5yZW1hcFRvSnMoYykpOlNrLmFzc2VydHMuZmFpbCgpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmZpbGVcIixTay5idWlsdGluLmZpbGUpfSxmdW5jdGlvbihtLHEpe1NrLmZmaT1Tay5mZml8fHt9O1NrLmZmaS5yZW1hcFRvUHk9ZnVuY3Rpb24oYSl7dmFyIGM7aWYobnVsbD09PWF8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYSlyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO2lmKGEub2IkdHlwZXx8YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIGE7aWYoXCJbb2JqZWN0IEFycmF5XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKXt2YXIgYj1bXTtmb3IoYz0wO2M8YS5sZW5ndGg7KytjKWIucHVzaChTay5mZmkucmVtYXBUb1B5KGFbY10pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX1pZihcIm9iamVjdFwiPT09dHlwZW9mIGEpe2I9XG5bXTtmb3IoYyBpbiBhKWIucHVzaChTay5mZmkucmVtYXBUb1B5KGMpKSxiLnB1c2goU2suZmZpLnJlbWFwVG9QeShhW2NdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmRpY3QoYil9aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLmFzc2skKGEpO2lmKFwiYm9vbGVhblwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYSk7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSQ7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZ1bmMoYSk7U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIHJlbWFwIHR5cGUgXCIrdHlwZW9mIGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkucmVtYXBUb1B5XCIsU2suZmZpLnJlbWFwVG9QeSk7U2suZmZpLnJlbWFwVG9Kcz1mdW5jdGlvbihhKXt2YXIgYyxcbmI7aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCl7dmFyIGU9e307YS4kaXRlbXMoKS5mb3JFYWNoKChbYSxjXSk9PntiPVNrLmZmaS5yZW1hcFRvSnMoYSk7ZVtiXT1Tay5mZmkucmVtYXBUb0pzKGMpfSk7cmV0dXJuIGV9aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdHx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpe2U9W107Zm9yKGM9MDtjPGEudi5sZW5ndGg7KytjKWUucHVzaChTay5mZmkucmVtYXBUb0pzKGEudltjXSkpO3JldHVybiBlfWlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJvb2wpcmV0dXJuIGEudj8hMDohMTtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU2suYnVpbHRpbi5hc251bSQoYSk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhfHxcImJvb2xlYW5cIj09PXR5cGVvZiBhfHxcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIGE7XG5pZih2b2lkIDAhPT1hKXJldHVybiBhLnZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5yZW1hcFRvSnNcIixTay5mZmkucmVtYXBUb0pzKTtTay5mZmkuY2FsbGJhY2s9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/YTpmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSl9fTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkuY2FsbGJhY2tcIixTay5mZmkuY2FsbGJhY2spO1NrLmZmaS5zdGR3cmFwPWZ1bmN0aW9uKGEsYyl7YT1uZXcgYTthLnY9YztyZXR1cm4gYX07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnN0ZHdyYXBcIixTay5mZmkuc3Rkd3JhcCk7U2suZmZpLmJhc2ljd3JhcD1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU2suYnVpbHRpbi5hc251bSQoYSk7XG5pZihcIm51bWJlclwiPT09dHlwZW9mIGF8fFwiYm9vbGVhblwiPT09dHlwZW9mIGEpcmV0dXJuIGE7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSk7U2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCB0eXBlIGZvciBiYXNpY3dyYXBcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5iYXNpY3dyYXBcIixTay5mZmkuYmFzaWN3cmFwKTtTay5mZmkudW53cmFwbz1mdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKXJldHVybiBhLnZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS51bndyYXBvXCIsU2suZmZpLnVud3JhcG8pO1NrLmZmaS51bndyYXBuPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YT9udWxsOmEudn07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnVud3JhcG5cIixTay5mZmkudW53cmFwbil9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsZSl7YT12b2lkIDA9PT1hP2E6U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSk7Yj12b2lkIDA9PT1cbmI/YjpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKTtlPXZvaWQgMD09PWU/ZTpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhlKTtpZih2b2lkIDA9PT1iJiZ2b2lkIDA9PT1lKWI9YSxhPTAsZT0xO2Vsc2UgaWYodm9pZCAwPT09ZSllPTE7ZWxzZSBpZigwPT09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicmFuZ2UoKSBzdGVwIGFyZ3VtZW50IG11c3Qgbm90IGJlIHplcm9cIik7Y29uc3QgZD1bXTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEmJlwibnVtYmVyXCI9PT10eXBlb2YgYiYmXCJudW1iZXJcIj09PXR5cGVvZiBlKWlmKDA8ZSlmb3IodmFyIGY9YTtmPGI7Zis9ZSlkLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhmKSk7ZWxzZSBmb3IoZj1hO2Y+YjtmKz1lKWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGYpKTtlbHNle2E9Zj1KU0JJLkJpZ0ludChhKTtlPUpTQkkuQmlnSW50KGUpO2I9SlNCSS5CaWdJbnQoYik7aWYoSlNCSS5ncmVhdGVyVGhhbihlLEpTQkkuX19aRVJPKSlmb3IoO0pTQkkubGVzc1RoYW4oZixcbmIpOylkLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhjKGYpKSksZj1KU0JJLmFkZChmLGUpO2Vsc2UgZm9yKDtKU0JJLmdyZWF0ZXJUaGFuKGYsYik7KWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGMoZikpKSxmPUpTQkkuYWRkKGYsZSk7YT1jKGEpO2U9YyhlKTtiPWMoYil9cmV0dXJuIG5ldyBTay5idWlsdGluLnJhbmdlXyhhLGIsZSxkKX1mdW5jdGlvbiBjKGEpe3JldHVybiBKU0JJLmxlc3NUaGFuKGEsSlNCSS5fX01BWF9TQUZFKSYmSlNCSS5ncmVhdGVyVGhhbihhLEpTQkkuX19NSU5fU0FGRSk/SlNCSS50b051bWJlcihhKTphfVNrLmJ1aWx0aW4ucmFuZ2VfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJyYW5nZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIsYyxkKXt0aGlzLnN0YXJ0PWE7dGhpcy5zdG9wPWI7dGhpcy5zdGVwPWM7dGhpcy52PWR9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLFxudHAkZG9jOlwicmFuZ2Uoc3RvcCkgLT4gcmFuZ2Ugb2JqZWN0XFxucmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSkgLT4gcmFuZ2Ugb2JqZWN0XFxuXFxuUmV0dXJuIGFuIG9iamVjdCB0aGF0IHByb2R1Y2VzIGEgc2VxdWVuY2Ugb2YgaW50ZWdlcnMgZnJvbSBzdGFydCAoaW5jbHVzaXZlKVxcbnRvIHN0b3AgKGV4Y2x1c2l2ZSkgYnkgc3RlcC4gIHJhbmdlKGksIGopIHByb2R1Y2VzIGksIGkrMSwgaSsyLCAuLi4sIGotMS5cXG5zdGFydCBkZWZhdWx0cyB0byAwLCBhbmQgc3RvcCBpcyBvbWl0dGVkISAgcmFuZ2UoNCkgcHJvZHVjZXMgMCwgMSwgMiwgMy5cXG5UaGVzZSBhcmUgZXhhY3RseSB0aGUgdmFsaWQgaW5kaWNlcyBmb3IgYSBsaXN0IG9mIDQgZWxlbWVudHMuXFxuV2hlbiBzdGVwIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCAob3IgZGVjcmVtZW50KS5cIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwicmFuZ2VcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJyYW5nZVwiLFxuYiwxLDMpO3JldHVybiBhKGJbMF0sYlsxXSxiWzJdKX0sJHIoKXtsZXQgYT1cInJhbmdlKFwiK3RoaXMuc3RhcnQrXCIsIFwiK3RoaXMuc3RvcDsxIT10aGlzLnN0ZXAmJihhKz1cIiwgXCIrdGhpcy5zdGVwKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGErXCIpXCIpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKFwiRXFcIiE9PWImJlwiTm90RXFcIiE9PWJ8fGEub2IkdHlwZSE9PVNrLmJ1aWx0aW4ucmFuZ2VfKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPW5ldyBTay5idWlsdGluLmxpc3QoYS52KTtyZXR1cm4obmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYpKS50cCRyaWNoY29tcGFyZShhLGIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfSxuYiRib29sKCl7cmV0dXJuIDAhPT10aGlzLnYubGVuZ3RofSxzcSRjb250YWlucyhhKXtjb25zdCBiPXRoaXMudjtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKylpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxcbmJbY10sXCJFcVwiKSlyZXR1cm4hMDtyZXR1cm4hMX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTswPmEmJihhPXRoaXMudi5sZW5ndGgrYSk7aWYoMD5hfHxhPj10aGlzLnYubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXCJyYW5nZSBvYmplY3QgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiB0aGlzLnZbYV19aWYoYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W10sYz10aGlzLnY7YS5zc3NpdGVyJChjLmxlbmd0aCxhPT57Yi5wdXNoKGNbYV0pfSk7bGV0IHtzdGFydDpkLHN0b3A6ZSxzdGVwOmZ9PWEuc2xpY2UkaW5kaWNlcyhjLmxlbmd0aCk7ZD1Tay5taXNjZXZhbC5hc0luZGV4KGNbZF0pfHx0aGlzLnN0YXJ0O2U9U2subWlzY2V2YWwuYXNJbmRleChjW2VdKXx8dGhpcy5zdG9wO2Y9XG5cIm51bWJlclwiPT09dHlwZW9mIHRoaXMuc3RlcD9mKnRoaXMuc3RlcDpKU0JJLm11bHRpcGx5KHRoaXMuc3RlcCxKU0JJLkJpZ0ludChmKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnJhbmdlXyhkLGUsZixiKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJyYW5nZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO319LGdldHNldHM6e3N0YXJ0OnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5zdGFydCl9fSxzdGVwOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5zdGVwKX19LHN0b3A6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnN0b3ApfX19LG1ldGhvZHM6e19fcmV2ZXJzZWRfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IGUodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yLlwifSxcbmNvdW50OnskbWV0aChhKXtsZXQgYj0wO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsdGhpcy52W2NdLFwiRXFcIikmJmIrKztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcInJhbmdlb2JqZWN0LmNvdW50KHZhbHVlKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWVcIn0saW5kZXg6eyRtZXRoKGEpe2ZvcihsZXQgYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspaWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsdGhpcy52W2JdLFwiRXFcIikpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiaXMgbm90IGluIHJhbmdlXCIpO30sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcInJhbmdlb2JqZWN0LmluZGV4KHZhbHVlLCBbc3RhcnQsIFtzdG9wXV0pIC0+IGludGVnZXIgLS0gcmV0dXJuIGluZGV4IG9mIHZhbHVlLlxcblJhaXNlIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifX0sXG5wcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2xpY2UoMCl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO3ZhciBiPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInJhbmdlX2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEudn0saXRlcm5leHQoKXtyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KSxlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInJhbmdlX3JldmVyc2VpdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRzZXE9YS52O3RoaXMuJGluZGV4PXRoaXMuJHNlcS5sZW5ndGgtMX0saXRlcm5leHQoKXtyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4LS1dfSxcbm1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLnJhbmdlPVNrLmJ1aWx0aW4ueHJhbmdlPWZ1bmN0aW9uKGIsYyxlKXtiPWEoYixjLGUpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIudil9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZW51bWVyYXRlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImVudW1lcmF0ZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZW51bWVyYXRlKSl0aHJvdyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdlbnVtZXJhdGUnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvclwiKTt0aGlzLiRpdGVyYWJsZT1hO3RoaXMuJGluZGV4PWM7cmV0dXJuIHRoaXN9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9U2subWlzY2V2YWwuY2hhaW4odGhpcy4kaXRlcmFibGUudHAkaXRlcm5leHQoYSksXG5hPT57aWYodm9pZCAwIT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8odGhpcy4kaW5kZXgrKyksYV0pfSk7cmV0dXJuIGE/YzpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9LHNsb3RzOnt0cCRkb2M6XCJSZXR1cm4gYW4gZW51bWVyYXRlIG9iamVjdC5cXG5cXG4gIGl0ZXJhYmxlXFxuICAgIGFuIG9iamVjdCBzdXBwb3J0aW5nIGl0ZXJhdGlvblxcblxcblRoZSBlbnVtZXJhdGUgb2JqZWN0IHlpZWxkcyBwYWlycyBjb250YWluaW5nIGEgY291bnQgKGZyb20gc3RhcnQsIHdoaWNoXFxuZGVmYXVsdHMgdG8gemVybykgYW5kIGEgdmFsdWUgeWllbGRlZCBieSB0aGUgaXRlcmFibGUgYXJndW1lbnQuXFxuXFxuZW51bWVyYXRlIGlzIHVzZWZ1bCBmb3Igb2J0YWluaW5nIGFuIGluZGV4ZWQgbGlzdDpcXG4gICAgKDAsIHNlcVswXSksICgxLCBzZXFbMV0pLCAoMiwgc2VxWzJdKSwgLi4uXCIsdHAkbmV3KGEsYyl7bGV0IFtiLFxuZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJlbnVtZXJhdGVcIixbXCJpdGVyYWJsZVwiLFwic3RhcnRcIl0sYSxjLFtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSk7Yj1Tay5hYnN0ci5pdGVyKGIpO2U9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coZSk7aWYodGhpcz09PVNrLmJ1aWx0aW4uZW51bWVyYXRlLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZW51bWVyYXRlKGIsZSk7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmVudW1lcmF0ZS5jYWxsKGEsYixlKTtyZXR1cm4gYX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5lbnVtZXJhdGVcIixTay5idWlsdGluLmVudW1lcmF0ZSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5maWx0ZXJfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImZpbHRlclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe3RoaXMuJGZ1bmM9YTt0aGlzLiRpdGVyYWJsZT1jfSxpdGVybmV4dChhKXtjb25zdCBjPVxuU2subWlzY2V2YWwuaXRlckZvcih0aGlzLiRpdGVyYWJsZSxhPT5Tay5taXNjZXZhbC5jaGFpbih0aGlzLmNoZWNrJGZpbHRlcihhKSxhPT5hP25ldyBTay5taXNjZXZhbC5CcmVhayhhKTp2b2lkIDApKTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX0sc2xvdHM6e3RwJGRvYzpcIlJldHVybiBhbiBpdGVyYXRvciB5aWVsZGluZyB0aG9zZSBpdGVtcyBvZiBpdGVyYWJsZSBmb3Igd2hpY2ggZnVuY3Rpb24oaXRlbSlcXG5pcyB0cnVlLiBJZiBmdW5jdGlvbiBpcyBOb25lLCByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIHRydWUuXCIsdHAkbmV3KGEsYyl7bGV0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiZmlsdGVyXCIsW1wicHJlZGljYXRlXCIsXCJpdGVyYWJsZVwiXSxhLGMsW10pO2I9U2suYnVpbHRpbi5jaGVja05vbmUoYik/bnVsbDpiO2U9U2suYWJzdHIuaXRlcihlKTtpZih0aGlzPT09U2suYnVpbHRpbi5maWx0ZXJfLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmlsdGVyXyhiLFxuZSk7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmZpbHRlcl8uY2FsbChhLGIsZSk7cmV0dXJuIGF9fSxwcm90bzp7Y2hlY2skZmlsdGVyKGEpe2xldCBjO2M9bnVsbD09PXRoaXMuJGZ1bmM/YTpTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkodGhpcy4kZnVuYyxbYV0pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGI9PlNrLm1pc2NldmFsLmlzVHJ1ZShiKT9hOnZvaWQgMCl9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZmlsdGVyX1wiLFNrLmJ1aWx0aW4uZmlsdGVyXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5tYXBfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIm1hcFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe3RoaXMuJGZ1bmM9YTt0aGlzLiRpdGVycz1jfSxpdGVybmV4dChhKXtjb25zdCBjPVtdLGI9U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KHRoaXMuJGl0ZXJzLGI9PlNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoYSksXG5hPT57aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTtjLnB1c2goYSl9KSksYT0+YT92b2lkIDA6U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KHRoaXMuJGZ1bmMsYykpO3JldHVybiBhP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfSxzbG90czp7dHAkZG9jOlwibWFwKGZ1bmMsICppdGVyYWJsZXMpIC0tXFx4M2UgbWFwIG9iamVjdFxcblxcbk1ha2UgYW4gaXRlcmF0b3IgdGhhdCBjb21wdXRlcyB0aGUgZnVuY3Rpb24gdXNpbmcgYXJndW1lbnRzIGZyb21cXG5lYWNoIG9mIHRoZSBpdGVyYWJsZXMuICBTdG9wcyB3aGVuIHRoZSBzaG9ydGVzdCBpdGVyYWJsZSBpcyBleGhhdXN0ZWQuXCIsdHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4ubWFwXy5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJtYXBcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJtYXBcIixhLDIpO2M9YVswXTtjb25zdCBiPVxuW107Zm9yKGxldCBjPTE7YzxhLmxlbmd0aDtjKyspYi5wdXNoKFNrLmFic3RyLml0ZXIoYVtjXSkpO2lmKHRoaXM9PT1Tay5idWlsdGluLm1hcF8ucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5tYXBfKGMsYik7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLm1hcF8uY2FsbChhLGMsYik7cmV0dXJuIGF9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ubWFwX1wiLFNrLmJ1aWx0aW4ubWFwXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5yZXZlcnNlZD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJyZXZlcnNlZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpZHg9YS5zcSRsZW5ndGgoKS0xO3RoaXMuJHNlcT1hO3JldHVybiB0aGlzfSxpdGVybmV4dChhKXtpZighKDA+dGhpcy4kaWR4KSl7dmFyIGM9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLmFic3RyLm9iamVjdEdldEl0ZW0odGhpcy4kc2VxLG5ldyBTay5idWlsdGluLmludF8odGhpcy4kaWR4LS0pLFxuYSksYT0+e2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkluZGV4RXJyb3IpdGhpcy4kaWR4PS0xO2Vsc2UgdGhyb3cgYTt9KTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX19LHNsb3RzOnt0cCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gc2VxdWVuY2UuXCIsdHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4ucmV2ZXJzZWQucHJvdG90eXBlJiZTay5hYnN0ci5jaGVja05vS3dhcmdzKFwicmV2ZXJzZWRcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJyZXZlcnNlZFwiLGEsMSwxKTthPWFbMF07Yz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJHJldmVyc2VkKTtpZih2b2lkIDAhPT1jKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYyxbXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZShhKXx8dm9pZCAwPT09U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFxuU2suYnVpbHRpbi5zdHIuJGxlbikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGEgc2VxdWVuY2VcIik7aWYodGhpcz09PVNrLmJ1aWx0aW4ucmV2ZXJzZWQucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5yZXZlcnNlZChhKTtjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4ucmV2ZXJzZWQuY2FsbChjLGEpO3JldHVybiBjfX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiAwPD10aGlzLiRpZHg/bmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpZHgpOm5ldyBTay5idWlsdGluLmludF8oMCl9LCRmbGFnczp7Tm9BcmdzOiEwfX19fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi56aXBfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInppcFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpdGVycz1hOzA9PT1hLmxlbmd0aCYmXG4odGhpcy50cCRpdGVybmV4dD0oKT0+e30pfSxpdGVybmV4dChhKXtjb25zdCBjPVtdLGI9U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KHRoaXMuJGl0ZXJzLGI9PlNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoYSksYT0+e2lmKHZvaWQgMD09PWEpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayghMCk7Yy5wdXNoKGEpfSkpLGE9PmE/dm9pZCAwOm5ldyBTay5idWlsdGluLnR1cGxlKGMpKTtyZXR1cm4gYT9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sc2xvdHM6e3RwJGRvYzpcInppcChpdGVyMSBbLGl0ZXIyIFsuLi5dXSkgLS1cXHgzZSB6aXAgb2JqZWN0XFxuXFxuUmV0dXJuIGEgemlwIG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBhIHR1cGxlIHdoZXJlXFxudGhlIGktdGggZWxlbWVudCBjb21lcyBmcm9tIHRoZSBpLXRoIGl0ZXJhYmxlIGFyZ3VtZW50LiAgVGhlIC5fX25leHRfXygpXFxubWV0aG9kIGNvbnRpbnVlcyB1bnRpbCB0aGUgc2hvcnRlc3QgaXRlcmFibGUgaW4gdGhlIGFyZ3VtZW50IHNlcXVlbmNlXFxuaXMgZXhoYXVzdGVkIGFuZCB0aGVuIGl0IHJhaXNlcyBTdG9wSXRlcmF0aW9uLlwiLFxudHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4uemlwXy5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJ6aXBcIixjKTtjPVtdO2ZvcihsZXQgYj0wO2I8YS5sZW5ndGg7YisrKXRyeXtjLnB1c2goU2suYWJzdHIuaXRlcihhW2JdKSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uVHlwZUVycm9yKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInppcCBhcmd1bWVudCAjXCIrKGIrMSkrXCIgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvblwiKTt0aHJvdyBlO31pZih0aGlzPT09U2suYnVpbHRpbi56aXBfLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uemlwXyhjKTthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4uemlwXy5jYWxsKGEsYyk7cmV0dXJuIGF9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uemlwX1wiLFNrLmJ1aWx0aW4uemlwXyl9LGZ1bmN0aW9uKG0scSl7dmFyIGE9e1RfRU5ETUFSS0VSOjAsVF9OQU1FOjEsXG5UX05VTUJFUjoyLFRfU1RSSU5HOjMsVF9ORVdMSU5FOjQsVF9JTkRFTlQ6NSxUX0RFREVOVDo2LFRfTFBBUjo3LFRfUlBBUjo4LFRfTFNRQjo5LFRfUlNRQjoxMCxUX0NPTE9OOjExLFRfQ09NTUE6MTIsVF9TRU1JOjEzLFRfUExVUzoxNCxUX01JTlVTOjE1LFRfU1RBUjoxNixUX1NMQVNIOjE3LFRfVkJBUjoxOCxUX0FNUEVSOjE5LFRfTEVTUzoyMCxUX0dSRUFURVI6MjEsVF9FUVVBTDoyMixUX0RPVDoyMyxUX1BFUkNFTlQ6MjQsVF9MQlJBQ0U6MjUsVF9SQlJBQ0U6MjYsVF9FUUVRVUFMOjI3LFRfTk9URVFVQUw6MjgsVF9MRVNTRVFVQUw6MjksVF9HUkVBVEVSRVFVQUw6MzAsVF9USUxERTozMSxUX0NJUkNVTUZMRVg6MzIsVF9MRUZUU0hJRlQ6MzMsVF9SSUdIVFNISUZUOjM0LFRfRE9VQkxFU1RBUjozNSxUX1BMVVNFUVVBTDozNixUX01JTkVRVUFMOjM3LFRfU1RBUkVRVUFMOjM4LFRfU0xBU0hFUVVBTDozOSxUX1BFUkNFTlRFUVVBTDo0MCxUX0FNUEVSRVFVQUw6NDEsVF9WQkFSRVFVQUw6NDIsXG5UX0NJUkNVTUZMRVhFUVVBTDo0MyxUX0xFRlRTSElGVEVRVUFMOjQ0LFRfUklHSFRTSElGVEVRVUFMOjQ1LFRfRE9VQkxFU1RBUkVRVUFMOjQ2LFRfRE9VQkxFU0xBU0g6NDcsVF9ET1VCTEVTTEFTSEVRVUFMOjQ4LFRfQVQ6NDksVF9BVEVRVUFMOjUwLFRfUkFSUk9XOjUxLFRfRUxMSVBTSVM6NTIsVF9PUDo1MyxUX0FXQUlUOjU0LFRfQVNZTkM6NTUsVF9FUlJPUlRPS0VOOjU2LFRfTlRfT0ZGU0VUOjI1NixUX05fVE9LRU5TOjYwLFRfQ09NTUVOVDo1NyxUX05MOjU4LFRfRU5DT0RJTkc6NTl9O209e1wiIT1cIjphLlRfTk9URVFVQUwsXCIlXCI6YS5UX1BFUkNFTlQsXCIlPVwiOmEuVF9QRVJDRU5URVFVQUwsXCImXCI6YS5UX0FNUEVSLFwiJj1cIjphLlRfQU1QRVJFUVVBTCxcIihcIjphLlRfTFBBUixcIilcIjphLlRfUlBBUixcIipcIjphLlRfU1RBUixcIioqXCI6YS5UX0RPVUJMRVNUQVIsXCIqKj1cIjphLlRfRE9VQkxFU1RBUkVRVUFMLFwiKj1cIjphLlRfU1RBUkVRVUFMLFwiK1wiOmEuVF9QTFVTLFwiKz1cIjphLlRfUExVU0VRVUFMLFxuXCIsXCI6YS5UX0NPTU1BLFwiLVwiOmEuVF9NSU5VUyxcIi09XCI6YS5UX01JTkVRVUFMLFwiLT5cIjphLlRfUkFSUk9XLFwiLlwiOmEuVF9ET1QsXCIuLi5cIjphLlRfRUxMSVBTSVMsXCIvXCI6YS5UX1NMQVNILFwiLy9cIjphLlRfRE9VQkxFU0xBU0gsXCIvLz1cIjphLlRfRE9VQkxFU0xBU0hFUVVBTCxcIi89XCI6YS5UX1NMQVNIRVFVQUwsXCI6XCI6YS5UX0NPTE9OLFwiO1wiOmEuVF9TRU1JLFwiPFwiOmEuVF9MRVNTLFwiPDxcIjphLlRfTEVGVFNISUZULFwiPDw9XCI6YS5UX0xFRlRTSElGVEVRVUFMLFwiPD1cIjphLlRfTEVTU0VRVUFMLFwiPVwiOmEuVF9FUVVBTCxcIj09XCI6YS5UX0VRRVFVQUwsXCI+XCI6YS5UX0dSRUFURVIsXCI+PVwiOmEuVF9HUkVBVEVSRVFVQUwsXCI+PlwiOmEuVF9SSUdIVFNISUZULFwiPj49XCI6YS5UX1JJR0hUU0hJRlRFUVVBTCxcIkBcIjphLlRfQVQsXCJAPVwiOmEuVF9BVEVRVUFMLFwiW1wiOmEuVF9MU1FCLFwiXVwiOmEuVF9SU1FCLFwiXlwiOmEuVF9DSVJDVU1GTEVYLFwiXj1cIjphLlRfQ0lSQ1VNRkxFWEVRVUFMLFwie1wiOmEuVF9MQlJBQ0UsXG5cInxcIjphLlRfVkJBUixcInw9XCI6YS5UX1ZCQVJFUVVBTCxcIn1cIjphLlRfUkJSQUNFLFwiflwiOmEuVF9USUxERX07dmFyIGM9e307KGZ1bmN0aW9uKCl7Zm9yKHZhciBiIGluIGEpY1thW2JdXT1ifSkoKTtbXCJ0b2tfbmFtZVwiLFwiSVNURVJNSU5BTFwiLFwiSVNOT05URVJNSU5BTFwiLFwiSVNFT0ZcIl0uY29uY2F0KE9iamVjdC5rZXlzKGMpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gY1thXX0pKTtTay50b2tlbj17fTtTay50b2tlbi50b2tlbnM9YTtTay50b2tlbi50b2tfbmFtZT1jO1NrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTPW07U2sudG9rZW4uSVNURVJNSU5BTD1mdW5jdGlvbihiKXtyZXR1cm4gYjxhLlRfTlRfT0ZGU0VUfTtTay50b2tlbi5JU05PTlRFUk1JTkFMPWZ1bmN0aW9uKGIpe3JldHVybiBiPj1hLlRfTlRfT0ZGU0VUfTtTay50b2tlbi5JU0VPRj1mdW5jdGlvbihiKXtyZXR1cm4gYj09YS5UX0VORE1BUktFUn07U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW5cIixTay50b2tlbik7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4udG9rZW5zXCIsXG5Tay50b2tlbi50b2tlbnMpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLnRva19uYW1lXCIsU2sudG9rZW4udG9rX25hbWUpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTXCIpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLklTVEVSTUlOQUxcIixTay50b2tlbi5JU1RFUk1JTkFMKTtTay5leHBvcnRTeW1ib2woXCJTay50b2tlbi5JU05PTlRFUk1JTkFMXCIsU2sudG9rZW4uSVNOT05URVJNSU5BTCk7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4uSVNFT0ZcIixTay50b2tlbi5JU0VPRil9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsYyxkLGUpe3RoaXMudHlwZT1hO3RoaXMuc3RyaW5nPWI7dGhpcy5zdGFydD1jO3RoaXMuZW5kPWQ7dGhpcy5saW5lPWV9ZnVuY3Rpb24gYyhhKXtyZXR1cm5cIihcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXCJ8XCIpK1wiKVwifWZ1bmN0aW9uIGIoYSl7cmV0dXJuIGMuYXBwbHkobnVsbCxhcmd1bWVudHMpK1xuXCI/XCJ9ZnVuY3Rpb24gZShhLGIpe2Zvcih2YXIgYz1hLmxlbmd0aDtjLS07KWlmKGFbY109PT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGYoKXtyZXR1cm5cIiBGUiBSRiBCciBCUiBGciByIEIgUiBiIGJSIGYgcmIgckIgRiBSZiBVIHJGIHUgUkIgYnIgZlIgZnIgcmYgUmJcIi5zcGxpdChcIiBcIil9ZnVuY3Rpb24gbChhKXthP2RlbGV0ZSBTay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFU1tcIjw+XCJdOlNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW1wiPD5cIl09U2sudG9rZW4udG9rZW5zLlRfTk9URVFVQUw7dD1PYmplY3Qua2V5cyhTay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFUykuc29ydCgpO3Y9Yy5hcHBseSh0aGlzLHQucmV2ZXJzZSgpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYSYmay50ZXN0KGEpP2EucmVwbGFjZShuLFwiXFxcXCQmXCIpOmF9KSk7Qj1jKFwiXFxcXHI/XFxcXG5cIix2KX12YXIgaD1Tay50b2tlbi50b2tlbnM7Y29uc3QgZD1Tay5idWlsdGluLlN5bnRheEVycm9yLGc9U2suYnVpbHRpbi5TeW50YXhFcnJvcjtcbmEucHJvdG90eXBlLmV4YWN0X3R5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlPT1oLlRfT1AmJnRoaXMuc3RyaW5nIGluIFNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTP1NrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW3RoaXMuc3RyaW5nXTp0aGlzLnR5cGV9O3ZhciBuPS9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxrPVJlZ0V4cChuLnNvdXJjZSk7Y29uc3QgcD1mdW5jdGlvbigpe3ZhciBhPWMoXCJbQS1aXVwiLFwiW2Etel1cIixcIltcXFxcdXsxMEI5OX0tXFxcXHV7MTBCOUN9XFxcXHV7MTEyQTl9XFxcXHV7MTE1REN9LVxcXFx1ezExNUREfVxcXFx1MDM0RlxcXFx1MTE1Ri1cXFxcdTExNjBcXFxcdTE3QjQtXFxcXHUxN0I1XFxcXHUyMDY1XFxcXHUzMTY0XFxcXHVGRkEwXFxcXHVGRkYwLVxcXFx1RkZGOFxcXFx1e0UwMDAwfVxcXFx1e0UwMDAyfS1cXFxcdXtFMDAxRn1cXFxcdXtFMDA4MH0tXFxcXHV7RTAwRkZ9XFxcXHV7RTAxRjB9LVxcXFx1e0UwRkZGfVxcXFx1ezExMkE5fVxcXFx1MDBEN11cIixcIltcXFxcdTAyQjAtXFxcXHUwMkMxXFxcXHUwMkM2LVxcXFx1MDJEMVxcXFx1MDJFMC1cXFxcdTAyRTRcXFxcdTAyRUNcXFxcdTAyRUVcXFxcdTAzNzRcXFxcdTAzN0FcXFxcdTA1NTlcXFxcdTA2RTUtXFxcXHUwNkU2XFxcXHUwN0Y0LVxcXFx1MDdGNVxcXFx1MDk3MVxcXFx1MUM3OC1cXFxcdTFDN0RcXFxcdTFEMkMtXFxcXHUxRDZBXFxcXHUxREZELVxcXFx1MURGRlxcXFx1MkUyRlxcXFx1MzBGQ1xcXFx1QTY3RlxcXFx1QTY5Qy1cXFxcdUE2OURcXFxcdUE3MTctXFxcXHVBNzFGXFxcXHVBNzg4XFxcXHVBN0Y4LVxcXFx1QTdGOVxcXFx1QUI1Qy1cXFxcdUFCNUZcXFxcdUZGNzBcXFxcdUZGOUUtXFxcXHVGRjlGXFxcXHV7MTZGOTN9LVxcXFx1ezE2RjlGfVxcXFx1MDJEMC1cXFxcdTAyRDFcXFxcdTA2NDBcXFxcdTA3RkFcXFxcdTBFNDZcXFxcdTBFQzZcXFxcdTE4NDNcXFxcdTFBQTdcXFxcdTFDN0JcXFxcdTMwMDVcXFxcdTMwMzEtXFxcXHUzMDM1XFxcXHUzMDlELVxcXFx1MzA5RVxcXFx1MzBGQy1cXFxcdTMwRkVcXFxcdUEwMTVcXFxcdUE2MENcXFxcdUE5Q0ZcXFxcdUE5RTZcXFxcdUFBNzBcXFxcdUFBRERcXFxcdUFBRjMtXFxcXHVBQUY0XFxcXHVGRjcwXFxcXHV7MTZCNDJ9LVxcXFx1ezE2QjQzfVxcXFx1ezE2RkUwfS1cXFxcdXsxNkZFMX1cXFxcdTAyQjAtXFxcXHUwMkI4XFxcXHUwMkMwLVxcXFx1MDJDMVxcXFx1MDJFMC1cXFxcdTAyRTRcXFxcdTAzN0FcXFxcdTFEMkMtXFxcXHUxRDZBXFxcXHUxRDc4XFxcXHUxRDlCLVxcXFx1MURCRlxcXFx1MjA3MVxcXFx1MjA3RlxcXFx1MjA5MC1cXFxcdTIwOUNcXFxcdTJDN0MtXFxcXHUyQzdEXFxcXHVBNjlDLVxcXFx1QTY5RFxcXFx1QTc3MFxcXFx1QTdGOC1cXFxcdUE3RjlcXFxcdUFCNUMtXFxcXHVBQjVGXFxcXHVGRjlFLVxcXFx1RkY5RlxcXFx1MDJCMlxcXFx1MUQ2MlxcXFx1MURBNFxcXFx1MURBOFxcXFx1MjA3MVxcXFx1MkM3Q1xcXFx1MkUxOC1cXFxcdTJFMTlcXFxcdTJFMkZdXCIsXG5cIltcXFxcdTIxMzUtXFxcXHUyMTM4XFxcXHV7MUVFMDB9LVxcXFx1ezFFRTAzfVxcXFx1ezFFRTA1fS1cXFxcdXsxRUUxRn1cXFxcdXsxRUUyMX0tXFxcXHV7MUVFMjJ9XFxcXHV7MUVFMjR9XFxcXHV7MUVFMjd9XFxcXHV7MUVFMjl9LVxcXFx1ezFFRTMyfVxcXFx1ezFFRTM0fS1cXFxcdXsxRUUzN31cXFxcdXsxRUUzOX1cXFxcdXsxRUUzQn1cXFxcdXsxRUU0Mn1cXFxcdXsxRUU0N31cXFxcdXsxRUU0OX1cXFxcdXsxRUU0Qn1cXFxcdXsxRUU0RH0tXFxcXHV7MUVFNEZ9XFxcXHV7MUVFNTF9LVxcXFx1ezFFRTUyfVxcXFx1ezFFRTU0fVxcXFx1ezFFRTU3fVxcXFx1ezFFRTU5fVxcXFx1ezFFRTVCfVxcXFx1ezFFRTVEfVxcXFx1ezFFRTVGfVxcXFx1ezFFRTYxfS1cXFxcdXsxRUU2Mn1cXFxcdXsxRUU2NH1cXFxcdXsxRUU2N30tXFxcXHV7MUVFNkF9XFxcXHV7MUVFNkN9LVxcXFx1ezFFRTcyfVxcXFx1ezFFRTc0fS1cXFxcdXsxRUU3N31cXFxcdXsxRUU3OX0tXFxcXHV7MUVFN0N9XFxcXHV7MUVFN0V9XFxcXHV7MUVFODB9LVxcXFx1ezFFRTg5fVxcXFx1ezFFRThCfS1cXFxcdXsxRUU5Qn1cXFxcdXsxRUVBMX0tXFxcXHV7MUVFQTN9XFxcXHV7MUVFQTV9LVxcXFx1ezFFRUE5fVxcXFx1ezFFRUFCfS1cXFxcdXsxRUVCQn1cXFxcdTMwMDZcXFxcdTM0MDAtXFxcXHU0REI1XFxcXHU0RTAwLVxcXFx1OUZFRlxcXFx1RjkwMC1cXFxcdUZBNkRcXFxcdUZBNzAtXFxcXHVGQUQ5XFxcXHV7MTcwMDB9LVxcXFx1ezE4N0YxfVxcXFx1ezE4ODAwfS1cXFxcdXsxOEFGMn1cXFxcdXsxQjE3MH0tXFxcXHV7MUIyRkJ9XFxcXHV7MjAwMDB9LVxcXFx1ezJBNkQ2fVxcXFx1ezJBNzAwfS1cXFxcdXsyQjczNH1cXFxcdXsyQjc0MH0tXFxcXHV7MkI4MUR9XFxcXHV7MkI4MjB9LVxcXFx1ezJDRUExfVxcXFx1ezJDRUIwfS1cXFxcdXsyRUJFMH1cXFxcdXsyRjgwMH0tXFxcXHV7MkZBMUR9XFxcXHVBQUMwXFxcXHVBQUMyXFxcXHVGRTIwLVxcXFx1RkUyRlxcXFx1ezEwRDIyfS1cXFxcdXsxMEQyM31cXFxcdXsxMTM1RH1cXFxcdTAwQUFcXFxcdTAwQkFcXFxcdTM0MDAtXFxcXHU0REI1XFxcXHU0RTAwLVxcXFx1OUZFRlxcXFx1RkEwRS1cXFxcdUZBMEZcXFxcdUZBMTFcXFxcdUZBMTMtXFxcXHVGQTE0XFxcXHVGQTFGXFxcXHVGQTIxXFxcXHVGQTIzLVxcXFx1RkEyNFxcXFx1RkEyNy1cXFxcdUZBMjlcXFxcdXsyMDAwMH0tXFxcXHV7MkE2RDZ9XFxcXHV7MkE3MDB9LVxcXFx1ezJCNzM0fVxcXFx1ezJCNzQwfS1cXFxcdXsyQjgxRH1cXFxcdXsyQjgyMH0tXFxcXHV7MkNFQTF9XFxcXHV7MkNFQjB9LVxcXFx1ezJFQkUwfVxcXFx1MTE1Ri1cXFxcdTExNjBcXFxcdTMxNjRcXFxcdUZGQTBcXFxcdTA2NzNcXFxcdTE3QTMtXFxcXHUxN0E0XFxcXHUwRTQwLVxcXFx1MEU0NFxcXFx1MEVDMC1cXFxcdTBFQzRcXFxcdTE5QjUtXFxcXHUxOUI3XFxcXHUxOUJBXFxcXHVBQUI1LVxcXFx1QUFCNlxcXFx1QUFCOVxcXFx1QUFCQi1cXFxcdUFBQkNdXCIsXG5cIltcXFxcdTMwMDdcXFxcdTMwMjEtXFxcXHUzMDI5XFxcXHUzMDM4LVxcXFx1MzAzQVxcXFx1MjE3MC1cXFxcdTIxN0ZcXFxcdTIxNjAtXFxcXHUyMTZGXVwiLFwiX1wiLFwiW1xcXFx1MTg4NS1cXFxcdTE4ODZcXFxcdTIxMThcXFxcdTIxMkVcXFxcdTMwOUItXFxcXHUzMDlDXVwiKSxiPWMoYSxcIltcXFxcdTEwNEEtXFxcXHUxMDRCXFxcXHUxMDJCLVxcXFx1MTAyQ1xcXFx1MTAyRC1cXFxcdTEwMzBcXFxcdTEwMzFcXFxcdTEwMzItXFxcXHUxMDM2XFxcXHUxMDM4XFxcXHUxMDNCLVxcXFx1MTAzQ1xcXFx1MTAzRC1cXFxcdTEwM0VcXFxcdTEwNTYtXFxcXHUxMDU3XFxcXHUxMDU4LVxcXFx1MTA1OVxcXFx1MTA1RS1cXFxcdTEwNjBcXFxcdTEwNjJcXFxcdTEwNjctXFxcXHUxMDY4XFxcXHUxMDcxLVxcXFx1MTA3NFxcXFx1MTA4MlxcXFx1MTA4My1cXFxcdTEwODRcXFxcdTEwODUtXFxcXHUxMDg2XFxcXHUxMDlDXFxcXHUxMDlEXFxcXHUxMDM3XFxcXHUxMDM5LVxcXFx1MTAzQVxcXFx1MTA4Ny1cXFxcdTEwOENcXFxcdTEwOERcXFxcdTEwOEZcXFxcdTEwOUEtXFxcXHUxMDlCXFxcXHVBOUU1XFxcXHVBQTdCXFxcXHVBQTdDXFxcXHVBQTdEXFxcXHVBOUU2XFxcXHVBQTcwXFxcXHUxMDRBLVxcXFx1MTA0Ql1cIixcIltcXFxcdTA5MDNcXFxcdTA5M0JcXFxcdTA5M0UtXFxcXHUwOTQwXFxcXHUwOTQ5LVxcXFx1MDk0Q1xcXFx1MDk0RS1cXFxcdTA5NEZcXFxcdTA5ODItXFxcXHUwOTgzXFxcXHUwOUJFLVxcXFx1MDlDMFxcXFx1MDlDNy1cXFxcdTA5QzhcXFxcdTA5Q0ItXFxcXHUwOUNDXFxcXHUwOUQ3XFxcXHUwQTAzXFxcXHUwQTNFLVxcXFx1MEE0MFxcXFx1MEE4M1xcXFx1MEFCRS1cXFxcdTBBQzBcXFxcdTBBQzlcXFxcdTBBQ0ItXFxcXHUwQUNDXFxcXHUwQjAyLVxcXFx1MEIwM1xcXFx1MEIzRVxcXFx1MEI0MFxcXFx1MEI0Ny1cXFxcdTBCNDhcXFxcdTBCNEItXFxcXHUwQjRDXFxcXHUwQjU3XFxcXHUwQkJFLVxcXFx1MEJCRlxcXFx1MEJDMS1cXFxcdTBCQzJcXFxcdTBCQzYtXFxcXHUwQkM4XFxcXHUwQkNBLVxcXFx1MEJDQ1xcXFx1MEJEN1xcXFx1MEMwMS1cXFxcdTBDMDNcXFxcdTBDNDEtXFxcXHUwQzQ0XFxcXHUwQzgyLVxcXFx1MEM4M1xcXFx1MENCRVxcXFx1MENDMC1cXFxcdTBDQzRcXFxcdTBDQzctXFxcXHUwQ0M4XFxcXHUwQ0NBLVxcXFx1MENDQlxcXFx1MENENS1cXFxcdTBDRDZcXFxcdTBEMDItXFxcXHUwRDAzXFxcXHUwRDNFLVxcXFx1MEQ0MFxcXFx1MEQ0Ni1cXFxcdTBENDhcXFxcdTBENEEtXFxcXHUwRDRDXFxcXHUwRDU3XFxcXHUwRDgyLVxcXFx1MEQ4M1xcXFx1MERDRi1cXFxcdTBERDFcXFxcdTBERDgtXFxcXHUwRERGXFxcXHUwREYyLVxcXFx1MERGM1xcXFx1MEY3RlxcXFx1MTAyQi1cXFxcdTEwMkNcXFxcdTEwMzFcXFxcdTEwMzhcXFxcdTEwM0ItXFxcXHUxMDNDXFxcXHUxMDU2LVxcXFx1MTA1N1xcXFx1MTA2MlxcXFx1MTA2Ny1cXFxcdTEwNjhcXFxcdTEwODMtXFxcXHUxMDg0XFxcXHUxMDlDXFxcXHUxN0I2XFxcXHUxN0JFLVxcXFx1MTdDNVxcXFx1MTdDNy1cXFxcdTE3QzhcXFxcdTE5MjMtXFxcXHUxOTI2XFxcXHUxOTI5LVxcXFx1MTkyQlxcXFx1MTkzMC1cXFxcdTE5MzFcXFxcdTE5MzMtXFxcXHUxOTM4XFxcXHUxQTE5LVxcXFx1MUExQVxcXFx1MUE1NVxcXFx1MUE1N1xcXFx1MUE2MVxcXFx1MUE2My1cXFxcdTFBNjRcXFxcdTFBNkQtXFxcXHUxQTcyXFxcXHUxQjA0XFxcXHUxQjM1XFxcXHUxQjNCXFxcXHUxQjNELVxcXFx1MUI0MVxcXFx1MUI0M1xcXFx1MUI4MlxcXFx1MUJBMVxcXFx1MUJBNi1cXFxcdTFCQTdcXFxcdTFCRTdcXFxcdTFCRUEtXFxcXHUxQkVDXFxcXHUxQkVFXFxcXHUxQzI0LVxcXFx1MUMyQlxcXFx1MUMzNC1cXFxcdTFDMzVcXFxcdTFDRjItXFxcXHUxQ0YzXFxcXHVBODIzLVxcXFx1QTgyNFxcXFx1QTgyN1xcXFx1QTg4MC1cXFxcdUE4ODFcXFxcdUE4QjQtXFxcXHVBOEMzXFxcXHVBOTUyXFxcXHVBOTgzXFxcXHVBOUI0LVxcXFx1QTlCNVxcXFx1QTlCQS1cXFxcdUE5QkJcXFxcdUE5QkQtXFxcXHVBOUJGXFxcXHVBQTJGLVxcXFx1QUEzMFxcXFx1QUEzMy1cXFxcdUFBMzRcXFxcdUFBNERcXFxcdUFBRUJcXFxcdUFBRUUtXFxcXHVBQUVGXFxcXHVBQUY1XFxcXHVBQkUzLVxcXFx1QUJFNFxcXFx1QUJFNi1cXFxcdUFCRTdcXFxcdUFCRTktXFxcXHVBQkVBXFxcXHV7MTEwMDB9XFxcXHV7MTEwMDJ9XFxcXHV7MTEwODJ9XFxcXHV7MTEwQjB9LVxcXFx1ezExMEIyfVxcXFx1ezExMEI3fS1cXFxcdXsxMTBCOH1cXFxcdXsxMTEyQ31cXFxcdXsxMTE0NX0tXFxcXHV7MTExNDZ9XFxcXHV7MTExODJ9XFxcXHV7MTExQjN9LVxcXFx1ezExMUI1fVxcXFx1ezExMUJGfVxcXFx1ezExMjJDfS1cXFxcdXsxMTIyRX1cXFxcdXsxMTIzMn0tXFxcXHV7MTEyMzN9XFxcXHV7MTEyRTB9LVxcXFx1ezExMkUyfVxcXFx1ezExMzAyfS1cXFxcdXsxMTMwM31cXFxcdXsxMTMzRX0tXFxcXHV7MTEzM0Z9XFxcXHV7MTEzNDF9LVxcXFx1ezExMzQ0fVxcXFx1ezExMzQ3fS1cXFxcdXsxMTM0OH1cXFxcdXsxMTM0Qn0tXFxcXHV7MTEzNEN9XFxcXHV7MTEzNTd9XFxcXHV7MTEzNjJ9LVxcXFx1ezExMzYzfVxcXFx1ezExNDM1fS1cXFxcdXsxMTQzN31cXFxcdXsxMTQ0MH0tXFxcXHV7MTE0NDF9XFxcXHV7MTE0NDV9XFxcXHV7MTE0QjB9LVxcXFx1ezExNEIyfVxcXFx1ezExNEI5fVxcXFx1ezExNEJCfS1cXFxcdXsxMTRCRX1cXFxcdXsxMTRDMX1cXFxcdXsxMTVBRn0tXFxcXHV7MTE1QjF9XFxcXHV7MTE1Qjh9LVxcXFx1ezExNUJCfVxcXFx1ezExNUJFfVxcXFx1ezExNjMwfS1cXFxcdXsxMTYzMn1cXFxcdXsxMTYzQn0tXFxcXHV7MTE2M0N9XFxcXHV7MTE2M0V9XFxcXHV7MTE2QUN9XFxcXHV7MTE2QUV9LVxcXFx1ezExNkFGfVxcXFx1ezExNzIwfS1cXFxcdXsxMTcyMX1cXFxcdXsxMTcyNn1cXFxcdXsxMTgyQ30tXFxcXHV7MTE4MkV9XFxcXHV7MTE4Mzh9XFxcXHV7MTFBMzl9XFxcXHV7MTFBNTd9LVxcXFx1ezExQTU4fVxcXFx1ezExQTk3fVxcXFx1ezExQzJGfVxcXFx1ezExQzNFfVxcXFx1ezExQ0E5fVxcXFx1ezExQ0IxfVxcXFx1ezExQ0I0fVxcXFx1ezExRDhBfS1cXFxcdXsxMUQ4RX1cXFxcdXsxMUQ5M30tXFxcXHV7MTFEOTR9XFxcXHV7MTFEOTZ9XFxcXHV7MTFFRjV9LVxcXFx1ezExRUY2fVxcXFx1ezE2RjUxfS1cXFxcdXsxNkY3RX1cXFxcdTBGM0UtXFxcXHUwRjNGXFxcXHUxMDg3LVxcXFx1MTA4Q1xcXFx1MTA4RlxcXFx1MTA5QS1cXFxcdTEwOUJcXFxcdTFCNDRcXFxcdTFCQUFcXFxcdTFDRTFcXFxcdTFDRjdcXFxcdTMwMkUtXFxcXHUzMDJGXFxcXHVBOTUzXFxcXHVBOUMwXFxcXHVBQTdCXFxcXHVBQTdEXFxcXHVBQkVDXFxcXHV7MTExQzB9XFxcXHV7MTEyMzV9XFxcXHV7MTEzNER9XFxcXHV7MTE2QjZ9XFxcXHV7MUQxNkR9LVxcXFx1ezFEMTcyfVxcXFx1MDlCRVxcXFx1MDlEN1xcXFx1MEIzRVxcXFx1MEI1N1xcXFx1MEJCRVxcXFx1MEJEN1xcXFx1MENDMlxcXFx1MENENS1cXFxcdTBDRDZcXFxcdTBEM0VcXFxcdTBENTdcXFxcdTBEQ0ZcXFxcdTBEREZcXFxcdTMwMkUtXFxcXHUzMDJGXFxcXHV7MTEzM0V9XFxcXHV7MTEzNTd9XFxcXHV7MTE0QjB9XFxcXHV7MTE0QkR9XFxcXHV7MTE1QUZ9XFxcXHV7MUQxNjV9XFxcXHV7MUQxNkV9LVxcXFx1ezFEMTcyfV1cIixcblwiW1xcXFx1ezFEN0NFfS1cXFxcdXsxRDdGRn1cXFxcdUZGMTAtXFxcXHVGRjE5XVwiLFwiXFxcXHUyMDQwXCIsXCJbXFxcXHUwMEI3XFxcXHUwMzg3XFxcXHUxMzY5LVxcXFx1MTM3MVxcXFx1MTlEQV1cIik7aWYoITE9PT1SZWdFeHAoKS51bmljb2RlKXJldHVybiBuZXcgUmVnRXhwKFwiXlwiK2ErXCIrXCIrYitcIiokXCIsXCJ1XCIpO2E9YyhcIltBLVpdXCIsXCJbYS16XVwiLFwiX1wiKTtiPWMoYSxcIlswLTldXCIpO3JldHVybiBuZXcgUmVnRXhwKFwiXlwiK2ErXCIrXCIrYitcIiokXCIpfSgpOyhmdW5jdGlvbihhKXtyZXR1cm4gYy5hcHBseShudWxsLGFyZ3VtZW50cykrXCIqXCJ9KShcIlxcXFxcXFxcXFxcXHI/XFxcXG5bIFxcXFxmXFxcXHRdKlwiKTtiKFwiI1teXFxcXHJcXFxcbl0qXCIpO209YyhcIlswLTldKD86Xz9bMC05XSkqXFxcXC4oPzpbMC05XSg/Ol8/WzAtOV0pKik/XCIsXCJcXFxcLlswLTldKD86Xz9bMC05XSkqXCIpK2IoXCJbZUVdWy0rXT9bMC05XSg/Ol8/WzAtOV0pKlwiKTt2YXIgdT1jKG0sXCJbMC05XSg/Ol8/WzAtOV0pKltlRV1bLStdP1swLTldKD86Xz9bMC05XSkqXCIpLEE9YyhcIlswLTldKD86Xz9bMC05XSkqW2pKXVwiLFxudStcIltqSl1cIik7bT1jLmFwcGx5KG51bGwsZigpKTtxPWMobStcIicnJ1wiLG0rJ1wiXCJcIicpO2MobStcIidbXlxcXFxuJ1xcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuJ1xcXFxcXFxcXSopKidcIixtKydcIlteXFxcXG5cIlxcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuXCJcXFxcXFxcXF0qKSpcIicpO3ZhciB0LHYsQjtsKCEwKTtTay50b2tlbi5zZXR1cFRva2Vucz1sO3ZhciBEPWMobStcIidbXlxcXFxuJ1xcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuJ1xcXFxcXFxcXSopKlwiK2MoXCInXCIsXCJcXFxcXFxcXFxcXFxyP1xcXFxuXCIpLG0rJ1wiW15cXFxcblwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXFxcXG5cIlxcXFxcXFxcXSopKicrYygnXCInLFwiXFxcXFxcXFxcXFxccj9cXFxcblwiKSksRT1jKFwiXFxcXFxcXFxcXFxccj9cXFxcbnwkXCIsXCIjW15cXFxcclxcXFxuXSpcIixxKSxGPXt9O209ZigpO2ZvcihsZXQgYSBvZiBtKUZbYStcIidcIl09XCJeW14nXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteJ1xcXFxcXFxcXSopKidcIixGW2ErJ1wiJ109J15bXlwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXCJcXFxcXFxcXF0qKSpcIicsRlthK1wiJycnXCJdPVwiXlteJ1xcXFxcXFxcXSooPzooPzpcXFxcXFxcXC58Jyg/IScnKSlbXidcXFxcXFxcXF0qKSonJydcIixcbkZbYSsnXCJcIlwiJ109J15bXlwiXFxcXFxcXFxdKig/Oig/OlxcXFxcXFxcLnxcIig/IVwiXCIpKVteXCJcXFxcXFxcXF0qKSpcIlwiXCInO2xldCBNPVtdLFY9W107Zm9yKGxldCBhIG9mIG0pTS5wdXNoKGErJ1wiJyksTS5wdXNoKGErXCInXCIpLFYucHVzaChhKydcIlwiXCInKSxWLnB1c2goYStcIicnJ1wiKTtTay5fdG9rZW5pemU9ZnVuY3Rpb24oYixmLGssbil7dmFyIGw9U2suX19mdXR1cmVfXy5weXRob24zP1wiXCI6XCIoPzpMPylcIjtsPWMoXCIwW3hYXSg/Ol8/WzAtOWEtZkEtRl0pK1wiK2wsXCIwW2JCXSg/Ol8/WzAxXSkrXCIrbCxTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsP1wiMChbb09dPykoPzpfP1swLTddKStcIitsOlwiMChbb09dKSg/Ol8/WzAtN10pK1wiK2wsXCIoPzowKD86Xz8wKSp8WzEtOV0oPzpfP1swLTldKSopXCIrbCk7bD1jKEEsdSxsKTtsPVwiWyBcXFxcZlxcXFx0XSpcIitjKEUsbCxCLEQsXCJcXFxcdytcIik7bD1uZXcgUmVnRXhwKGwpO3ZhciBtPTAsdD0wLHE9MCx2PVwiXCIseT0wLEc9bnVsbCxMPVswXSxILFQ9dm9pZCAwLFxuWD12b2lkIDAsSSxSO3ZvaWQgMCE9PWsmJihcInV0Zi04LXNpZ1wiPT1rJiYoaz1cInV0Zi04XCIpLG4obmV3IGEoaC5UX0VOQ09ESU5HLGssWzAsMF0sWzAsMF0sXCJcIikpKTtmb3IodmFyIEM9az1cIlwiOzspe3RyeXtrPUMsQz1mKCl9Y2F0Y2goTyl7Qz1cIlwifW0rPTE7dmFyIHc9MCxOPUMubGVuZ3RoO2lmKHYpe2lmKCFDKXRocm93IG5ldyBkKFwiRU9GIGluIG11bHRpLWxpbmUgc3RyaW5nXCIsYixYWzBdLFhbMV0pO1QubGFzdEluZGV4PTA7dmFyIHI9VC5leGVjKEMpO2lmKHIpdz1JPXJbMF0ubGVuZ3RoLG4obmV3IGEoaC5UX1NUUklORyx2K0Muc3Vic3RyaW5nKDAsSSksWCxbbSxJXSxHK0MpKSx2PVwiXCIseT0wLEc9bnVsbDtlbHNle3kmJlwiXFxcXFxcblwiIT09Qy5zdWJzdHJpbmcoQy5sZW5ndGgtMikmJlwiXFxcXFxcclxcblwiIT09Qy5zdWJzdHJpbmcoQy5sZW5ndGgtMyk/KG4obmV3IGEoaC5UX0VSUk9SVE9LRU4sditDLFgsW20sQy5sZW5ndGhdLEcpKSx2PVwiXCIsRz1udWxsKToodis9QyxHKz1DKTtjb250aW51ZX19ZWxzZSBpZigwIT1cbnR8fHEpe2lmKCFDKXRocm93IG5ldyBkKFwiRU9GIGluIG11bHRpLWxpbmUgc3RhdGVtZW50XCIsYixtLDApO3E9MH1lbHNle2lmKCFDKWJyZWFrO2ZvcihIPTA7dzxOOyl7aWYoXCIgXCI9PUNbd10pSCs9MTtlbHNlIGlmKFwiXFx0XCI9PUNbd10pSD04Kk1hdGguZmxvb3IoSC84KzEpO2Vsc2UgaWYoXCJcXGZcIj09Q1t3XSlIPTA7ZWxzZSBicmVhazt3Kz0xfWlmKHc9PU4pYnJlYWs7aWYoZShcIiNcXHJcXG5cIixDW3ddKSl7aWYoXCIjXCI9PUNbd10pe0g9Qy5zdWJzdHJpbmcodyk7Zm9yKE49SC5sZW5ndGg7MDxOJiYtMSE9PVwiXFxyXFxuXCIuaW5kZXhPZihILmNoYXJBdChOLTEpKTstLU4pO049SC5zdWJzdHJpbmcoMCxOKTtuKG5ldyBhKGguVF9DT01NRU5ULE4sW20sd10sW20sdytOLmxlbmd0aF0sQykpO3crPU4ubGVuZ3RofW4obmV3IGEoaC5UX05MLEMuc3Vic3RyaW5nKHcpLFttLHddLFttLEMubGVuZ3RoXSxDKSk7Y29udGludWV9SD5MW0wubGVuZ3RoLTFdJiYoTC5wdXNoKEgpLG4obmV3IGEoaC5UX0lOREVOVCxcbkMuc3Vic3RyaW5nKHcpLFttLDBdLFttLHddLEMpKSk7Zm9yKDtIPExbTC5sZW5ndGgtMV07KXtpZighZShMLEgpKXRocm93IG5ldyBnKFwidW5pbmRlbnQgZG9lcyBub3QgbWF0Y2ggYW55IG91dGVyIGluZGVudGF0aW9uIGxldmVsXCIsYixtLHcpO0w9TC5zbGljZSgwLC0xKTtuKG5ldyBhKGguVF9ERURFTlQsXCJcIixbbSx3XSxbbSx3XSxDKSl9fWZvcig7dzxOOyl7Zm9yKEg9Qy5jaGFyQXQodyk7XCIgXCI9PT1IfHxcIlxcZlwiPT09SHx8XCJcXHRcIj09PUg7KXcrPTEsSD1DLmNoYXJBdCh3KTtpZihSPWwuZXhlYyhDLnN1YnN0cmluZyh3KSkpe2lmKEg9dyxJPUgrUlsxXS5sZW5ndGgsUj1bbSxIXSxyPVttLEldLHc9SSxIIT1JKXtJPUMuc3Vic3RyaW5nKEgsSSk7dmFyIHo9Q1tIXTtpZihlKFwiMDEyMzQ1Njc4OVwiLHopfHxcIi5cIj09eiYmXCIuXCIhPUkmJlwiLi4uXCIhPUkpbihuZXcgYShoLlRfTlVNQkVSLEksUixyLEMpKTtlbHNlIGlmKGUoXCJcXHJcXG5cIix6KSkwPHQ/bihuZXcgYShoLlRfTkwsSSxSLHIsQykpOlxubihuZXcgYShoLlRfTkVXTElORSxJLFIscixDKSk7ZWxzZSBpZihcIiNcIj09eiluKG5ldyBhKGguVF9DT01NRU5ULEksUixyLEMpKTtlbHNlIGlmKGUoVixJKSlpZihUPVJlZ0V4cChGW0ldKSxyPVQuZXhlYyhDLnN1YnN0cmluZyh3KSkpdz1yWzBdLmxlbmd0aCt3LEk9Qy5zdWJzdHJpbmcoSCx3KSxuKG5ldyBhKGguVF9TVFJJTkcsSSxSLFttLHddLEMpKTtlbHNle1g9W20sSF07dj1DLnN1YnN0cmluZyhIKTtHPUM7YnJlYWt9ZWxzZSBpZihlKE0seil8fGUoTSxJLnN1YnN0cmluZygwLDIpKXx8ZShNLEkuc3Vic3RyaW5nKDAsMykpKWlmKFwiXFxuXCI9PUlbSS5sZW5ndGgtMV0pe1g9W20sSF07VD1SZWdFeHAoRlt6XXx8RltJWzFdXXx8RltJWzJdXSk7dj1DLnN1YnN0cmluZyhIKTt5PTE7Rz1DO2JyZWFrfWVsc2UgbihuZXcgYShoLlRfU1RSSU5HLEksUixyLEMpKTtlbHNlIEg9ei5ub3JtYWxpemUoXCJORktDXCIpLHAudGVzdChIKT9uKG5ldyBhKGguVF9OQU1FLEksUixyLEMpKTpcIlxcXFxcIj09XG56P3E9MTooZShcIihbe1wiLHopP3QrPTE6ZShcIildfVwiLHopJiYtLXQsbihuZXcgYShoLlRfT1AsSSxSLHIsQykpKX19ZWxzZSBuKG5ldyBhKGguVF9FUlJPUlRPS0VOLENbd10sW20sd10sW20sdysxXSxDKSksdys9MX19ayYmIWUoXCJcXHJcXG5cIixrW2subGVuZ3RoLTFdKSYmbihuZXcgYShoLlRfTkVXTElORSxcIlwiLFttLTEsay5sZW5ndGhdLFttLTEsay5sZW5ndGgrMV0sXCJcIikpO2Zvcih2YXIgWiBpbiBMLnNsaWNlKDEpKW4obmV3IGEoaC5UX0RFREVOVCxcIlwiLFttLDBdLFttLDBdLFwiXCIpKTtuKG5ldyBhKGguVF9FTkRNQVJLRVIsXCJcIixbbSwwXSxbbSwwXSxcIlwiKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLl90b2tlbml6ZVwiLFNrLl90b2tlbml6ZSl9LGZ1bmN0aW9uKG0scSl7U2suT3BNYXA9e1wiKFwiOlNrLnRva2VuLnRva2Vucy5UX0xQQVIsXCIpXCI6U2sudG9rZW4udG9rZW5zLlRfUlBBUixcIltcIjpTay50b2tlbi50b2tlbnMuVF9MU1FCLFwiXVwiOlNrLnRva2VuLnRva2Vucy5UX1JTUUIsXCI6XCI6U2sudG9rZW4udG9rZW5zLlRfQ09MT04sXG5cIixcIjpTay50b2tlbi50b2tlbnMuVF9DT01NQSxcIjtcIjpTay50b2tlbi50b2tlbnMuVF9TRU1JLFwiK1wiOlNrLnRva2VuLnRva2Vucy5UX1BMVVMsXCItXCI6U2sudG9rZW4udG9rZW5zLlRfTUlOVVMsXCIqXCI6U2sudG9rZW4udG9rZW5zLlRfU1RBUixcIi9cIjpTay50b2tlbi50b2tlbnMuVF9TTEFTSCxcInxcIjpTay50b2tlbi50b2tlbnMuVF9WQkFSLFwiJlwiOlNrLnRva2VuLnRva2Vucy5UX0FNUEVSLFwiPFwiOlNrLnRva2VuLnRva2Vucy5UX0xFU1MsXCI+XCI6U2sudG9rZW4udG9rZW5zLlRfR1JFQVRFUixcIj1cIjpTay50b2tlbi50b2tlbnMuVF9FUVVBTCxcIi5cIjpTay50b2tlbi50b2tlbnMuVF9ET1QsXCIlXCI6U2sudG9rZW4udG9rZW5zLlRfUEVSQ0VOVCxcImBcIjpTay50b2tlbi50b2tlbnMuVF9CQUNLUVVPVEUsXCJ7XCI6U2sudG9rZW4udG9rZW5zLlRfTEJSQUNFLFwifVwiOlNrLnRva2VuLnRva2Vucy5UX1JCUkFDRSxcIkBcIjpTay50b2tlbi50b2tlbnMuVF9BVCxcIkA9XCI6U2sudG9rZW4udG9rZW5zLlRfQVRFUVVBTCxcblwiPT1cIjpTay50b2tlbi50b2tlbnMuVF9FUUVRVUFMLFwiIT1cIjpTay50b2tlbi50b2tlbnMuVF9OT1RFUVVBTCxcIjw+XCI6U2sudG9rZW4udG9rZW5zLlRfTk9URVFVQUwsXCI8PVwiOlNrLnRva2VuLnRva2Vucy5UX0xFU1NFUVVBTCxcIj49XCI6U2sudG9rZW4udG9rZW5zLlRfR1JFQVRFUkVRVUFMLFwiflwiOlNrLnRva2VuLnRva2Vucy5UX1RJTERFLFwiXlwiOlNrLnRva2VuLnRva2Vucy5UX0NJUkNVTUZMRVgsXCI8PFwiOlNrLnRva2VuLnRva2Vucy5UX0xFRlRTSElGVCxcIj4+XCI6U2sudG9rZW4udG9rZW5zLlRfUklHSFRTSElGVCxcIioqXCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU1RBUixcIis9XCI6U2sudG9rZW4udG9rZW5zLlRfUExVU0VRVUFMLFwiLT1cIjpTay50b2tlbi50b2tlbnMuVF9NSU5FUVVBTCxcIio9XCI6U2sudG9rZW4udG9rZW5zLlRfU1RBUkVRVUFMLFwiLz1cIjpTay50b2tlbi50b2tlbnMuVF9TTEFTSEVRVUFMLFwiJT1cIjpTay50b2tlbi50b2tlbnMuVF9QRVJDRU5URVFVQUwsXCImPVwiOlNrLnRva2VuLnRva2Vucy5UX0FNUEVSRVFVQUwsXG5cInw9XCI6U2sudG9rZW4udG9rZW5zLlRfVkJBUkVRVUFMLFwiXj1cIjpTay50b2tlbi50b2tlbnMuVF9DSVJDVU1GTEVYRVFVQUwsXCI8PD1cIjpTay50b2tlbi50b2tlbnMuVF9MRUZUU0hJRlRFUVVBTCxcIj4+PVwiOlNrLnRva2VuLnRva2Vucy5UX1JJR0hUU0hJRlRFUVVBTCxcIioqPVwiOlNrLnRva2VuLnRva2Vucy5UX0RPVUJMRVNUQVJFUVVBTCxcIi8vXCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU0xBU0gsXCIvLz1cIjpTay50b2tlbi50b2tlbnMuVF9ET1VCTEVTTEFTSEVRVUFMLFwiLT5cIjpTay50b2tlbi50b2tlbnMuVF9SQVJST1csXCIuLi5cIjpTay50b2tlbi50b2tlbnMuVF9FTExJUFNJU307U2suUGFyc2VUYWJsZXM9e3N5bTp7YW5kX2V4cHI6MjU3LGFuZF90ZXN0OjI1OCxhbm5hc3NpZ246MjU5LGFyZ2xpc3Q6MjYwLGFyZ3VtZW50OjI2MSxhcml0aF9leHByOjI2Mixhc3NlcnRfc3RtdDoyNjMsYXN5bmNfZnVuY2RlZjoyNjQsYXN5bmNfc3RtdDoyNjUsYXRvbToyNjYsYXRvbV9leHByOjI2NyxcbmF1Z2Fzc2lnbjoyNjgsYnJlYWtfc3RtdDoyNjksY2xhc3NkZWY6MjcwLGNvbXBfZm9yOjI3MSxjb21wX2lmOjI3Mixjb21wX2l0ZXI6MjczLGNvbXBfb3A6Mjc0LGNvbXBhcmlzb246Mjc1LGNvbXBvdW5kX3N0bXQ6Mjc2LGNvbnRpbnVlX3N0bXQ6Mjc3LGRlYnVnZ2VyX3N0bXQ6Mjc4LGRlY29yYXRlZDoyNzksZGVjb3JhdG9yOjI4MCxkZWNvcmF0b3JzOjI4MSxkZWxfc3RtdDoyODIsZGljdG9yc2V0bWFrZXI6MjgzLGRvdHRlZF9hc19uYW1lOjI4NCxkb3R0ZWRfYXNfbmFtZXM6Mjg1LGRvdHRlZF9uYW1lOjI4NixlbmNvZGluZ19kZWNsOjI4NyxldmFsX2lucHV0OjI4OCxleGNlcHRfY2xhdXNlOjI4OSxleHByOjI5MCxleHByX3N0bXQ6MjkxLGV4cHJsaXN0OjI5MixmYWN0b3I6MjkzLGZpbGVfaW5wdXQ6Mjk0LGZsb3dfc3RtdDoyOTUsZm9yX3N0bXQ6Mjk2LGZ1bmNkZWY6Mjk3LGdsb2JhbF9zdG10OjI5OCxpZl9zdG10OjI5OSxpbXBvcnRfYXNfbmFtZTozMDAsaW1wb3J0X2FzX25hbWVzOjMwMSxcbmltcG9ydF9mcm9tOjMwMixpbXBvcnRfbmFtZTozMDMsaW1wb3J0X3N0bXQ6MzA0LGxhbWJkZWY6MzA1LGxhbWJkZWZfbm9jb25kOjMwNixub25sb2NhbF9zdG10OjMwNyxub3RfdGVzdDozMDgsb3JfdGVzdDozMDkscGFyYW1ldGVyczozMTAscGFzc19zdG10OjMxMSxwb3dlcjozMTIscHJpbnRfc3RtdDozMTMscmFpc2Vfc3RtdDozMTQscmV0dXJuX3N0bXQ6MzE1LHNoaWZ0X2V4cHI6MzE2LHNpbXBsZV9zdG10OjMxNyxzaW5nbGVfaW5wdXQ6MjU2LHNsaWNlb3A6MzE4LHNtYWxsX3N0bXQ6MzE5LHN0YXJfZXhwcjozMjAsc3RtdDozMjEsc3Vic2NyaXB0OjMyMixzdWJzY3JpcHRsaXN0OjMyMyxzdWl0ZTozMjQsdGVybTozMjUsdGVzdDozMjYsdGVzdF9ub2NvbmQ6MzI3LHRlc3RsaXN0OjMyOCx0ZXN0bGlzdF9jb21wOjMyOSx0ZXN0bGlzdF9zdGFyX2V4cHI6MzMwLHRmcGRlZjozMzEsdHJhaWxlcjozMzIsdHJ5X3N0bXQ6MzMzLHR5cGVkYXJnc2xpc3Q6MzM0LHZhcmFyZ3NsaXN0OjMzNSxcbnZmcGRlZjozMzYsd2hpbGVfc3RtdDozMzcsd2l0aF9pdGVtOjMzOCx3aXRoX3N0bXQ6MzM5LHhvcl9leHByOjM0MCx5aWVsZF9hcmc6MzQxLHlpZWxkX2V4cHI6MzQyLHlpZWxkX3N0bXQ6MzQzfSxudW1iZXIyc3ltYm9sOnsyNTY6XCJzaW5nbGVfaW5wdXRcIiwyNTc6XCJhbmRfZXhwclwiLDI1ODpcImFuZF90ZXN0XCIsMjU5OlwiYW5uYXNzaWduXCIsMjYwOlwiYXJnbGlzdFwiLDI2MTpcImFyZ3VtZW50XCIsMjYyOlwiYXJpdGhfZXhwclwiLDI2MzpcImFzc2VydF9zdG10XCIsMjY0OlwiYXN5bmNfZnVuY2RlZlwiLDI2NTpcImFzeW5jX3N0bXRcIiwyNjY6XCJhdG9tXCIsMjY3OlwiYXRvbV9leHByXCIsMjY4OlwiYXVnYXNzaWduXCIsMjY5OlwiYnJlYWtfc3RtdFwiLDI3MDpcImNsYXNzZGVmXCIsMjcxOlwiY29tcF9mb3JcIiwyNzI6XCJjb21wX2lmXCIsMjczOlwiY29tcF9pdGVyXCIsMjc0OlwiY29tcF9vcFwiLDI3NTpcImNvbXBhcmlzb25cIiwyNzY6XCJjb21wb3VuZF9zdG10XCIsMjc3OlwiY29udGludWVfc3RtdFwiLDI3ODpcImRlYnVnZ2VyX3N0bXRcIixcbjI3OTpcImRlY29yYXRlZFwiLDI4MDpcImRlY29yYXRvclwiLDI4MTpcImRlY29yYXRvcnNcIiwyODI6XCJkZWxfc3RtdFwiLDI4MzpcImRpY3RvcnNldG1ha2VyXCIsMjg0OlwiZG90dGVkX2FzX25hbWVcIiwyODU6XCJkb3R0ZWRfYXNfbmFtZXNcIiwyODY6XCJkb3R0ZWRfbmFtZVwiLDI4NzpcImVuY29kaW5nX2RlY2xcIiwyODg6XCJldmFsX2lucHV0XCIsMjg5OlwiZXhjZXB0X2NsYXVzZVwiLDI5MDpcImV4cHJcIiwyOTE6XCJleHByX3N0bXRcIiwyOTI6XCJleHBybGlzdFwiLDI5MzpcImZhY3RvclwiLDI5NDpcImZpbGVfaW5wdXRcIiwyOTU6XCJmbG93X3N0bXRcIiwyOTY6XCJmb3Jfc3RtdFwiLDI5NzpcImZ1bmNkZWZcIiwyOTg6XCJnbG9iYWxfc3RtdFwiLDI5OTpcImlmX3N0bXRcIiwzMDA6XCJpbXBvcnRfYXNfbmFtZVwiLDMwMTpcImltcG9ydF9hc19uYW1lc1wiLDMwMjpcImltcG9ydF9mcm9tXCIsMzAzOlwiaW1wb3J0X25hbWVcIiwzMDQ6XCJpbXBvcnRfc3RtdFwiLDMwNTpcImxhbWJkZWZcIiwzMDY6XCJsYW1iZGVmX25vY29uZFwiLDMwNzpcIm5vbmxvY2FsX3N0bXRcIixcbjMwODpcIm5vdF90ZXN0XCIsMzA5Olwib3JfdGVzdFwiLDMxMDpcInBhcmFtZXRlcnNcIiwzMTE6XCJwYXNzX3N0bXRcIiwzMTI6XCJwb3dlclwiLDMxMzpcInByaW50X3N0bXRcIiwzMTQ6XCJyYWlzZV9zdG10XCIsMzE1OlwicmV0dXJuX3N0bXRcIiwzMTY6XCJzaGlmdF9leHByXCIsMzE3Olwic2ltcGxlX3N0bXRcIiwzMTg6XCJzbGljZW9wXCIsMzE5Olwic21hbGxfc3RtdFwiLDMyMDpcInN0YXJfZXhwclwiLDMyMTpcInN0bXRcIiwzMjI6XCJzdWJzY3JpcHRcIiwzMjM6XCJzdWJzY3JpcHRsaXN0XCIsMzI0Olwic3VpdGVcIiwzMjU6XCJ0ZXJtXCIsMzI2OlwidGVzdFwiLDMyNzpcInRlc3Rfbm9jb25kXCIsMzI4OlwidGVzdGxpc3RcIiwzMjk6XCJ0ZXN0bGlzdF9jb21wXCIsMzMwOlwidGVzdGxpc3Rfc3Rhcl9leHByXCIsMzMxOlwidGZwZGVmXCIsMzMyOlwidHJhaWxlclwiLDMzMzpcInRyeV9zdG10XCIsMzM0OlwidHlwZWRhcmdzbGlzdFwiLDMzNTpcInZhcmFyZ3NsaXN0XCIsMzM2OlwidmZwZGVmXCIsMzM3Olwid2hpbGVfc3RtdFwiLDMzODpcIndpdGhfaXRlbVwiLDMzOTpcIndpdGhfc3RtdFwiLFxuMzQwOlwieG9yX2V4cHJcIiwzNDE6XCJ5aWVsZF9hcmdcIiwzNDI6XCJ5aWVsZF9leHByXCIsMzQzOlwieWllbGRfc3RtdFwifSxkZmFzOnsyNTY6W1tbWzEsMV0sWzIsMV0sWzMsMl1dLFtbMCwxXV0sW1syLDFdXV0sezI6MSw0OjEsNToxLDY6MSw3OjEsODoxLDk6MSwxMDoxLDExOjEsMTI6MSwxMzoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxfV0sMjU3OltbW1s0NCwxXV0sW1s0NSwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNTg6W1tbWzQ2LDFdXSxbWzQ3LDBdLFswLDFdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsXG4zNToxLDM4OjEsNDM6MX1dLDI1OTpbW1tbNDgsMV1dLFtbNDksMl1dLFtbNTAsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLHs0ODoxfV0sMjYwOltbW1s1MSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s1MSwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MSw1MzoxfV0sMjYxOltbW1s0OSwxXSxbMTUsMl0sWzUzLDJdXSxbWzUwLDJdLFs1NCwzXSxbMCwxXV0sW1s0OSwzXV0sW1swLDNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyNjI6W1tbWzU1LDFdXSxbWzMwLDBdLFs0MywwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNjM6W1tbWzI0LDFdXSxbWzQ5LFxuMl1dLFtbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLHsyNDoxfV0sMjY0OltbW1sxMCwxXV0sW1s1NiwyXV0sW1swLDJdXV0sezEwOjF9XSwyNjU6W1tbWzEwLDFdXSxbWzU3LDJdLFs1NiwyXSxbNTgsMl1dLFtbMCwyXV1dLHsxMDoxfV0sMjY2OltbW1s2LDFdLFsyNSwxXSxbMzMsMV0sWzksMV0sWzExLDFdLFsxMiwyXSxbMzUsM10sWzM4LDRdLFsxOSwxXSxbNyw1XV0sW1swLDFdXSxbWzU5LDFdLFs2MCw2XV0sW1s2MSwxXSxbNjIsN10sWzYzLDddXSxbWzY0LDFdLFs2Myw4XV0sW1s3LDVdLFswLDVdXSxbWzU5LDFdXSxbWzYxLDFdXSxbWzY0LDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDI1OjEsMzM6MSwzNToxLDM4OjF9XSwyNjc6W1tbWzI5LDFdLFs2NSwyXV0sW1s2NSwyXV0sW1s2NiwyXSxbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyNToxLDI5OjEsMzM6MSwzNToxLDM4OjF9XSwyNjg6W1tbWzY3LDFdLFs2OCwxXSxbNjksMV0sXG5bNzAsMV0sWzcxLDFdLFs3MiwxXSxbNzMsMV0sWzc0LDFdLFs3NSwxXSxbNzYsMV0sWzc3LDFdLFs3OCwxXSxbNzksMV1dLFtbMCwxXV1dLHs2NzoxLDY4OjEsNjk6MSw3MDoxLDcxOjEsNzI6MSw3MzoxLDc0OjEsNzU6MSw3NjoxLDc3OjEsNzg6MSw3OToxfV0sMjY5OltbW1szOSwxXV0sW1swLDFdXV0sezM5OjF9XSwyNzA6W1tbWzEzLDFdXSxbWzI1LDJdXSxbWzQ4LDNdLFszNSw0XV0sW1s4MCw1XV0sW1s2MSw2XSxbODEsN11dLFtbMCw1XV0sW1s0OCwzXV0sW1s2MSw2XV1dLHsxMzoxfV0sMjcxOltbW1sxMCwxXSxbMzQsMl1dLFtbMzQsMl1dLFtbODIsM11dLFtbODMsNF1dLFtbODQsNV1dLFtbODUsNl0sWzAsNV1dLFtbMCw2XV1dLHsxMDoxLDM0OjF9XSwyNzI6W1tbWzM3LDFdXSxbWzg2LDJdXSxbWzg1LDNdLFswLDJdXSxbWzAsM11dXSx7Mzc6MX1dLDI3MzpbW1tbODcsMV0sWzU0LDFdXSxbWzAsMV1dXSx7MTA6MSwzNDoxLDM3OjF9XSwyNzQ6W1tbWzg4LDFdLFs4OSwxXSxcbls4LDJdLFs5MCwxXSxbODgsMV0sWzgzLDFdLFs5MSwxXSxbOTIsM10sWzkzLDFdLFs5NCwxXV0sW1swLDFdXSxbWzgzLDFdXSxbWzgsMV0sWzAsM11dXSx7ODoxLDgzOjEsODg6MSw4OToxLDkwOjEsOTE6MSw5MjoxLDkzOjEsOTQ6MX1dLDI3NTpbW1tbOTUsMV1dLFtbOTYsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjc2OltbW1s5NywxXSxbOTgsMV0sWzU4LDFdLFs5OSwxXSxbNTcsMV0sWzEwMCwxXSxbNTYsMV0sWzEwMSwxXSxbMTAyLDFdXSxbWzAsMV1dXSx7NDoxLDEwOjEsMTM6MSwyMDoxLDIxOjEsMzQ6MSwzNzoxLDQxOjEsNDI6MX1dLDI3NzpbW1tbNDAsMV1dLFtbMCwxXV1dLHs0MDoxfV0sMjc4OltbW1sxNywxXV0sW1swLDFdXV0sezE3OjF9XSwyNzk6W1tbWzEwMywxXV0sW1s1NiwyXSxbMTA0LDJdLFs5OSwyXV0sW1swLDJdXV0sezQxOjF9XSwyODA6W1tbWzQxLDFdXSxcbltbMTA1LDJdXSxbWzIsNF0sWzM1LDNdXSxbWzYxLDVdLFs4MSw2XV0sW1swLDRdXSxbWzIsNF1dLFtbNjEsNV1dXSx7NDE6MX1dLDI4MTpbW1tbMTA2LDFdXSxbWzEwNiwxXSxbMCwxXV1dLHs0MToxfV0sMjgyOltbW1syNywxXV0sW1s4MiwyXV0sW1swLDJdXV0sezI3OjF9XSwyODM6W1tbWzQ5LDFdLFsxMDcsMl0sWzUzLDNdXSxbWzQ4LDRdLFs1NCw1XSxbNTIsNl0sWzAsMV1dLFtbNTQsNV0sWzUyLDZdLFswLDJdXSxbWzk1LDddXSxbWzQ5LDddXSxbWzAsNV1dLFtbNDksOF0sWzEwNyw4XSxbMCw2XV0sW1s1NCw1XSxbNTIsOV0sWzAsN11dLFtbNTIsNl0sWzAsOF1dLFtbNDksMTBdLFs1MywxMV0sWzAsOV1dLFtbNDgsMTJdXSxbWzk1LDEzXV0sW1s0OSwxM11dLFtbNTIsOV0sWzAsMTNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyODQ6W1tbWzEwNSwxXV0sW1sxMDgsXG4yXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sezI1OjF9XSwyODU6W1tbWzEwOSwxXV0sW1s1MiwwXSxbMCwxXV1dLHsyNToxfV0sMjg2OltbW1syNSwxXV0sW1sxMTAsMF0sWzAsMV1dXSx7MjU6MX1dLDI4NzpbW1tbMjUsMV1dLFtbMCwxXV1dLHsyNToxfV0sMjg4OltbW1sxMTEsMV1dLFtbMiwxXSxbMTEyLDJdXSxbWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjg5OltbW1sxMTMsMV1dLFtbNDksMl0sWzAsMV1dLFtbMTA4LDNdLFs1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sezExMzoxfV0sMjkwOltbW1sxMTQsMV1dLFtbMTE1LDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI5MTpbW1tbMTE2LDFdXSxbWzExNywyXSxbNTAsM10sWzExOCw0XSxbMCwxXV0sW1sxMTEsXG40XSxbNjIsNF1dLFtbMTE2LDVdLFs2Miw1XV0sW1swLDRdXSxbWzUwLDNdLFswLDVdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjkyOltbW1s5NSwxXSxbMTA3LDFdXSxbWzUyLDJdLFswLDFdXSxbWzk1LDFdLFsxMDcsMV0sWzAsMl1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTM6W1tbWzExOSwyXSxbMzAsMV0sWzIyLDFdLFs0MywxXV0sW1sxMjAsMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTQ6W1tbWzIsMF0sWzExMiwxXSxbMTIxLDBdXSxbWzAsMV1dXSx7MjoxLDQ6MSw1OjEsNjoxLDc6MSw4OjEsOToxLDEwOjEsMTE6MSwxMjoxLDEzOjEsMTQ6MSwxNToxLDE2OjEsXG4xNzoxLDE4OjEsMTk6MSwyMDoxLDIxOjEsMjI6MSwyMzoxLDI0OjEsMjU6MSwyNjoxLDI3OjEsMjg6MSwyOToxLDMwOjEsMzE6MSwzMjoxLDMzOjEsMzQ6MSwzNToxLDM2OjEsMzc6MSwzODoxLDM5OjEsNDA6MSw0MToxLDQyOjEsNDM6MSwxMTI6MX1dLDI5NTpbW1tbMTIyLDFdLFsxMjMsMV0sWzEyNCwxXSxbMTI1LDFdLFsxMjYsMV1dLFtbMCwxXV1dLHs1OjEsMjM6MSwzMToxLDM5OjEsNDA6MX1dLDI5NjpbW1tbMzQsMV1dLFtbODIsMl1dLFtbODMsM11dLFtbMTExLDRdXSxbWzQ4LDVdXSxbWzgwLDZdXSxbWzEyNyw3XSxbMCw2XV0sW1s0OCw4XV0sW1s4MCw5XV0sW1swLDldXV0sezM0OjF9XSwyOTc6W1tbWzQsMV1dLFtbMjUsMl1dLFtbMTI4LDNdXSxbWzQ4LDRdLFsxMjksNV1dLFtbODAsNl1dLFtbNDksN11dLFtbMCw2XV0sW1s0OCw0XV1dLHs0OjF9XSwyOTg6W1tbWzI2LDFdXSxbWzI1LDJdXSxbWzUyLDFdLFswLDJdXV0sezI2OjF9XSwyOTk6W1tbWzM3LDFdXSxbWzQ5LDJdXSxcbltbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFsxMzAsMV0sWzAsNF1dLFtbNDgsNl1dLFtbODAsN11dLFtbMCw3XV1dLHszNzoxfV0sMzAwOltbW1syNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLHsyNToxfV0sMzAxOltbW1sxMzEsMV1dLFtbNTIsMl0sWzAsMV1dLFtbMTMxLDFdLFswLDJdXV0sezI1OjF9XSwzMDI6W1tbWzM2LDFdXSxbWzEwNSwyXSxbMTksM10sWzExMCwzXV0sW1szMiw0XV0sW1sxMDUsMl0sWzE5LDNdLFszMiw0XSxbMTEwLDNdXSxbWzEzMiw1XSxbMTUsNV0sWzM1LDZdXSxbWzAsNV1dLFtbMTMyLDddXSxbWzYxLDVdXV0sezM2OjF9XSwzMDM6W1tbWzMyLDFdXSxbWzEzMywyXV0sW1swLDJdXV0sezMyOjF9XSwzMDQ6W1tbWzEzNCwxXSxbMTM1LDFdXSxbWzAsMV1dXSx7MzI6MSwzNjoxfV0sMzA1OltbW1sxNCwxXV0sW1s0OCwyXSxbMTM2LDNdXSxbWzQ5LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSx7MTQ6MX1dLDMwNjpbW1tbMTQsMV1dLFxuW1s0OCwyXSxbMTM2LDNdXSxbWzg2LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSx7MTQ6MX1dLDMwNzpbW1tbMTgsMV1dLFtbMjUsMl1dLFtbNTIsMV0sWzAsMl1dXSx7MTg6MX1dLDMwODpbW1tbOCwxXSxbMTM3LDJdXSxbWzQ2LDJdXSxbWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMwOTpbW1tbMTM4LDFdXSxbWzEzOSwwXSxbMCwxXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzEwOltbW1szNSwxXV0sW1s2MSwyXSxbMTQwLDNdXSxbWzAsMl1dLFtbNjEsMl1dXSx7MzU6MX1dLDMxMTpbW1tbMjgsMV1dLFtbMCwxXV1dLHsyODoxfV0sMzEyOltbW1sxNDEsMV1dLFtbNTMsMl0sWzAsMV1dLFtbMTIwLDNdXSxbWzAsM11dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjU6MSwyOToxLDMzOjEsXG4zNToxLDM4OjF9XSwzMTM6W1tbWzE2LDFdXSxbWzQ5LDJdLFsxNDIsM10sWzAsMV1dLFtbNTIsNF0sWzAsMl1dLFtbNDksNV1dLFtbNDksMl0sWzAsNF1dLFtbNTIsNl0sWzAsNV1dLFtbNDksN11dLFtbNTIsOF0sWzAsN11dLFtbNDksN10sWzAsOF1dXSx7MTY6MX1dLDMxNDpbW1tbNSwxXV0sW1s0OSwyXSxbMCwxXV0sW1szNiwzXSxbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbNTIsNV0sWzAsNF1dLFtbNDksNl1dLFtbMCw2XV1dLHs1OjF9XSwzMTU6W1tbWzIzLDFdXSxbWzExMSwyXSxbMCwxXV0sW1swLDJdXV0sezIzOjF9XSwzMTY6W1tbWzE0MywxXV0sW1sxNDQsMF0sWzE0MiwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMTc6W1tbWzE0NSwxXV0sW1syLDJdLFsxNDYsM11dLFtbMCwyXV0sW1sxNDUsMV0sWzIsMl1dXSx7NToxLDY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSxcbjE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMxODpbW1tbNDgsMV1dLFtbNDksMl0sWzAsMV1dLFtbMCwyXV1dLHs0ODoxfV0sMzE5OltbW1sxNDcsMV0sWzE0OCwxXSxbMTQ5LDFdLFsxNTAsMV0sWzE1MSwxXSxbMTUyLDFdLFsxNTMsMV0sWzE1NCwxXSxbMTU1LDFdLFsxNTYsMV1dLFtbMCwxXV1dLHs1OjEsNjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMyMDpbW1tbMTUsMV1dLFtbOTUsMl1dLFtbMCwyXV1dLHsxNToxfV0sMzIxOltbW1sxLDFdLFszLDFdXSxbWzAsMV1dXSx7NDoxLDU6MSw2OjEsNzoxLFxuODoxLDk6MSwxMDoxLDExOjEsMTI6MSwxMzoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxfV0sMzIyOltbW1s0OSwxXSxbNDgsMl1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM10sWzE1Nyw0XSxbMCwyXV0sW1sxNTcsNF0sWzAsM11dLFtbMCw0XV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNDg6MX1dLDMyMzpbW1tbMTU4LDFdXSxbWzUyLDJdLFswLDFdXSxbWzE1OCwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNDg6MX1dLDMyNDpbW1tbMSwxXSxbMiwyXV0sXG5bWzAsMV1dLFtbMTU5LDNdXSxbWzEyMSw0XV0sW1sxNjAsMV0sWzEyMSw0XV1dLHsyOjEsNToxLDY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE2OjEsMTc6MSwxODoxLDE5OjEsMjI6MSwyMzoxLDI0OjEsMjU6MSwyNjoxLDI3OjEsMjg6MSwyOToxLDMwOjEsMzE6MSwzMjoxLDMzOjEsMzU6MSwzNjoxLDM4OjEsMzk6MSw0MDoxLDQzOjF9XSwzMjU6W1tbWzEyMCwxXV0sW1sxNjEsMF0sWzE1LDBdLFsxNjIsMF0sWzQxLDBdLFsxNjMsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI2OltbW1s4NCwxXSxbMTY0LDJdXSxbWzM3LDNdLFswLDFdXSxbWzAsMl1dLFtbODQsNF1dLFtbMTI3LDVdXSxbWzQ5LDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMyNzpbW1tbMTY1LFxuMV0sWzg0LDFdXSxbWzAsMV1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI4OltbW1s0OSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMjk6W1tbWzQ5LDFdLFsxMDcsMV1dLFtbNTQsMl0sWzUyLDNdLFswLDFdXSxbWzAsMl1dLFtbNDksNF0sWzEwNyw0XSxbMCwzXV0sW1s1MiwzXSxbMCw0XV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzMDpbW1tbNDksMV0sWzEwNywxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMTA3LDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsXG4yMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMzE6W1tbWzI1LDFdXSxbWzQ4LDJdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSx7MjU6MX1dLDMzMjpbW1tbMzUsMV0sWzExMCwyXSxbMzgsM11dLFtbNjEsNF0sWzgxLDVdXSxbWzI1LDRdXSxbWzE2Niw2XV0sW1swLDRdXSxbWzYxLDRdXSxbWzY0LDRdXV0sezM1OjEsMzg6MSwxMTA6MX1dLDMzMzpbW1tbMjAsMV1dLFtbNDgsMl1dLFtbODAsM11dLFtbMTY3LDRdLFsxNjgsNV1dLFtbNDgsNl1dLFtbNDgsN11dLFtbODAsOF1dLFtbODAsOV1dLFtbMTY3LDRdLFsxMjcsMTBdLFsxNjgsNV0sWzAsOF1dLFtbMCw5XV0sW1s0OCwxMV1dLFtbODAsMTJdXSxbWzE2OCw1XSxbMCwxMl1dXSx7MjA6MX1dLDMzNDpbW1tbMTUsMV0sWzE2OSwyXSxbNTMsM11dLFtbMTY5LDRdLFs1Miw1XSxbMCwxXV0sW1s1MCw2XSxbNTIsN10sWzAsMl1dLFtbMTY5LDhdXSxbWzUyLDVdLFswLDRdXSxbWzE2OSw5XSxbNTMsM10sWzAsXG41XV0sW1s0OSwxMF1dLFtbMTUsMTFdLFsxNjksMl0sWzUzLDNdLFswLDddXSxbWzUyLDEyXSxbMCw4XV0sW1s1MCwxM10sWzUyLDVdLFswLDldXSxbWzUyLDddLFswLDEwXV0sW1sxNjksMTRdLFs1MiwxNV0sWzAsMTFdXSxbWzAsMTJdXSxbWzQ5LDRdXSxbWzUyLDE1XSxbMCwxNF1dLFtbMTY5LDE2XSxbNTMsM10sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSx7MTU6MSwyNToxLDUzOjF9XSwzMzU6W1tbWzE1LDFdLFs1MywyXSxbMTcwLDNdXSxbWzE3MCw1XSxbNTIsNF0sWzAsMV1dLFtbMTcwLDZdXSxbWzUwLDddLFs1Miw4XSxbMCwzXV0sW1s1MywyXSxbMTcwLDldLFswLDRdXSxbWzUyLDRdLFswLDVdXSxbWzUyLDEwXSxbMCw2XV0sW1s0OSwxMV1dLFtbMTUsMTJdLFs1MywyXSxbMTcwLDNdLFswLDhdXSxbWzUwLDEzXSxbNTIsNF0sWzAsOV1dLFtbMCwxMF1dLFtbNTIsOF0sWzAsMTFdXSxbWzUyLDE1XSxbMTcwLDE0XSxbMCwxMl1dLFtbNDksNV1dLFxuW1s1MiwxNV0sWzAsMTRdXSxbWzUzLDJdLFsxNzAsMTZdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sezE1OjEsMjU6MSw1MzoxfV0sMzM2OltbW1syNSwxXV0sW1swLDFdXV0sezI1OjF9XSwzMzc6W1tbWzIxLDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMCw0XV0sW1s0OCw2XV0sW1s4MCw3XV0sW1swLDddXV0sezIxOjF9XSwzMzg6W1tbWzQ5LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1s5NSwzXV0sW1swLDNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzOTpbW1tbNDIsMV1dLFtbMTcxLDJdXSxbWzQ4LDNdLFs1MiwxXV0sW1s4MCw0XV0sW1swLDRdXV0sezQyOjF9XSwzNDA6W1tbWzE3MiwxXV0sW1sxNzMsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLFxuMzU6MSwzODoxLDQzOjF9XSwzNDE6W1tbWzExMSwyXSxbMzYsMV1dLFtbNDksMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzNjoxLDM4OjEsNDM6MX1dLDM0MjpbW1tbMzEsMV1dLFtbMTc0LDJdLFswLDFdXSxbWzAsMl1dXSx7MzE6MX1dLDM0MzpbW1tbNjIsMV1dLFtbMCwxXV1dLHszMToxfV19LHN0YXRlczpbW1tbMSwxXSxbMiwxXSxbMywyXV0sW1swLDFdXSxbWzIsMV1dXSxbW1s0NCwxXV0sW1s0NSwwXSxbMCwxXV1dLFtbWzQ2LDFdXSxbWzQ3LDBdLFswLDFdXV0sW1tbNDgsMV1dLFtbNDksMl1dLFtbNTAsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLFtbWzUxLDFdXSxbWzUyLDJdLFswLDFdXSxbWzUxLDFdLFswLDJdXV0sW1tbNDksMV0sWzE1LDJdLFs1MywyXV0sW1s1MCwyXSxbNTQsM10sWzAsMV1dLFtbNDksM11dLFtbMCwzXV1dLFtbWzU1LDFdXSxbWzMwLDBdLFs0MywwXSxcblswLDFdXV0sW1tbMjQsMV1dLFtbNDksMl1dLFtbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLFtbWzEwLDFdXSxbWzU2LDJdXSxbWzAsMl1dXSxbW1sxMCwxXV0sW1s1NywyXSxbNTYsMl0sWzU4LDJdXSxbWzAsMl1dXSxbW1s2LDFdLFsyNSwxXSxbMzMsMV0sWzksMV0sWzExLDFdLFsxMiwyXSxbMzUsM10sWzM4LDRdLFsxOSwxXSxbNyw1XV0sW1swLDFdXSxbWzU5LDFdLFs2MCw2XV0sW1s2MSwxXSxbNjIsN10sWzYzLDddXSxbWzY0LDFdLFs2Myw4XV0sW1s3LDVdLFswLDVdXSxbWzU5LDFdXSxbWzYxLDFdXSxbWzY0LDFdXV0sW1tbMjksMV0sWzY1LDJdXSxbWzY1LDJdXSxbWzY2LDJdLFswLDJdXV0sW1tbNjcsMV0sWzY4LDFdLFs2OSwxXSxbNzAsMV0sWzcxLDFdLFs3MiwxXSxbNzMsMV0sWzc0LDFdLFs3NSwxXSxbNzYsMV0sWzc3LDFdLFs3OCwxXSxbNzksMV1dLFtbMCwxXV1dLFtbWzM5LDFdXSxbWzAsMV1dXSxbW1sxMywxXV0sW1syNSwyXV0sW1s0OCwzXSxbMzUsNF1dLFxuW1s4MCw1XV0sW1s2MSw2XSxbODEsN11dLFtbMCw1XV0sW1s0OCwzXV0sW1s2MSw2XV1dLFtbWzEwLDFdLFszNCwyXV0sW1szNCwyXV0sW1s4MiwzXV0sW1s4Myw0XV0sW1s4NCw1XV0sW1s4NSw2XSxbMCw1XV0sW1swLDZdXV0sW1tbMzcsMV1dLFtbODYsMl1dLFtbODUsM10sWzAsMl1dLFtbMCwzXV1dLFtbWzg3LDFdLFs1NCwxXV0sW1swLDFdXV0sW1tbODgsMV0sWzg5LDFdLFs4LDJdLFs5MCwxXSxbODgsMV0sWzgzLDFdLFs5MSwxXSxbOTIsM10sWzkzLDFdLFs5NCwxXV0sW1swLDFdXSxbWzgzLDFdXSxbWzgsMV0sWzAsM11dXSxbW1s5NSwxXV0sW1s5NiwwXSxbMCwxXV1dLFtbWzk3LDFdLFs5OCwxXSxbNTgsMV0sWzk5LDFdLFs1NywxXSxbMTAwLDFdLFs1NiwxXSxbMTAxLDFdLFsxMDIsMV1dLFtbMCwxXV1dLFtbWzQwLDFdXSxbWzAsMV1dXSxbW1sxNywxXV0sW1swLDFdXV0sW1tbMTAzLDFdXSxbWzU2LDJdLFsxMDQsMl0sWzk5LDJdXSxbWzAsMl1dXSxbW1s0MSwxXV0sW1sxMDUsXG4yXV0sW1syLDRdLFszNSwzXV0sW1s2MSw1XSxbODEsNl1dLFtbMCw0XV0sW1syLDRdXSxbWzYxLDVdXV0sW1tbMTA2LDFdXSxbWzEwNiwxXSxbMCwxXV1dLFtbWzI3LDFdXSxbWzgyLDJdXSxbWzAsMl1dXSxbW1s0OSwxXSxbMTA3LDJdLFs1MywzXV0sW1s0OCw0XSxbNTQsNV0sWzUyLDZdLFswLDFdXSxbWzU0LDVdLFs1Miw2XSxbMCwyXV0sW1s5NSw3XV0sW1s0OSw3XV0sW1swLDVdXSxbWzQ5LDhdLFsxMDcsOF0sWzAsNl1dLFtbNTQsNV0sWzUyLDldLFswLDddXSxbWzUyLDZdLFswLDhdXSxbWzQ5LDEwXSxbNTMsMTFdLFswLDldXSxbWzQ4LDEyXV0sW1s5NSwxM11dLFtbNDksMTNdXSxbWzUyLDldLFswLDEzXV1dLFtbWzEwNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLFtbWzEwOSwxXV0sW1s1MiwwXSxbMCwxXV1dLFtbWzI1LDFdXSxbWzExMCwwXSxbMCwxXV1dLFtbWzI1LDFdXSxbWzAsMV1dXSxbW1sxMTEsMV1dLFtbMiwxXSxbMTEyLDJdXSxbWzAsMl1dXSxcbltbWzExMywxXV0sW1s0OSwyXSxbMCwxXV0sW1sxMDgsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzAsNF1dXSxbW1sxMTQsMV1dLFtbMTE1LDBdLFswLDFdXV0sW1tbMTE2LDFdXSxbWzExNywyXSxbNTAsM10sWzExOCw0XSxbMCwxXV0sW1sxMTEsNF0sWzYyLDRdXSxbWzExNiw1XSxbNjIsNV1dLFtbMCw0XV0sW1s1MCwzXSxbMCw1XV1dLFtbWzk1LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbOTUsMV0sWzEwNywxXSxbMCwyXV1dLFtbWzExOSwyXSxbMzAsMV0sWzIyLDFdLFs0MywxXV0sW1sxMjAsMl1dLFtbMCwyXV1dLFtbWzIsMF0sWzExMiwxXSxbMTIxLDBdXSxbWzAsMV1dXSxbW1sxMjIsMV0sWzEyMywxXSxbMTI0LDFdLFsxMjUsMV0sWzEyNiwxXV0sW1swLDFdXV0sW1tbMzQsMV1dLFtbODIsMl1dLFtbODMsM11dLFtbMTExLDRdXSxbWzQ4LDVdXSxbWzgwLDZdXSxbWzEyNyw3XSxbMCw2XV0sW1s0OCw4XV0sW1s4MCw5XV0sW1swLDldXV0sW1tbNCwxXV0sW1syNSxcbjJdXSxbWzEyOCwzXV0sW1s0OCw0XSxbMTI5LDVdXSxbWzgwLDZdXSxbWzQ5LDddXSxbWzAsNl1dLFtbNDgsNF1dXSxbW1syNiwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLFtbWzM3LDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMTMwLDFdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSxbW1syNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLFtbWzEzMSwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxMzEsMV0sWzAsMl1dXSxbW1szNiwxXV0sW1sxMDUsMl0sWzE5LDNdLFsxMTAsM11dLFtbMzIsNF1dLFtbMTA1LDJdLFsxOSwzXSxbMzIsNF0sWzExMCwzXV0sW1sxMzIsNV0sWzE1LDVdLFszNSw2XV0sW1swLDVdXSxbWzEzMiw3XV0sW1s2MSw1XV1dLFtbWzMyLDFdXSxbWzEzMywyXV0sW1swLDJdXV0sW1tbMTM0LDFdLFsxMzUsMV1dLFtbMCwxXV1dLFtbWzE0LDFdXSxbWzQ4LDJdLFsxMzYsM11dLFtbNDksNF1dLFtbNDgsXG4yXV0sW1swLDRdXV0sW1tbMTQsMV1dLFtbNDgsMl0sWzEzNiwzXV0sW1s4Niw0XV0sW1s0OCwyXV0sW1swLDRdXV0sW1tbMTgsMV1dLFtbMjUsMl1dLFtbNTIsMV0sWzAsMl1dXSxbW1s4LDFdLFsxMzcsMl1dLFtbNDYsMl1dLFtbMCwyXV1dLFtbWzEzOCwxXV0sW1sxMzksMF0sWzAsMV1dXSxbW1szNSwxXV0sW1s2MSwyXSxbMTQwLDNdXSxbWzAsMl1dLFtbNjEsMl1dXSxbW1syOCwxXV0sW1swLDFdXV0sW1tbMTQxLDFdXSxbWzUzLDJdLFswLDFdXSxbWzEyMCwzXV0sW1swLDNdXV0sW1tbMTYsMV1dLFtbNDksMl0sWzE0MiwzXSxbMCwxXV0sW1s1Miw0XSxbMCwyXV0sW1s0OSw1XV0sW1s0OSwyXSxbMCw0XV0sW1s1Miw2XSxbMCw1XV0sW1s0OSw3XV0sW1s1Miw4XSxbMCw3XV0sW1s0OSw3XSxbMCw4XV1dLFtbWzUsMV1dLFtbNDksMl0sWzAsMV1dLFtbMzYsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzUyLDVdLFswLDRdXSxbWzQ5LDZdXSxbWzAsNl1dXSxbW1syMywxXV0sW1sxMTEsXG4yXSxbMCwxXV0sW1swLDJdXV0sW1tbMTQzLDFdXSxbWzE0NCwwXSxbMTQyLDBdLFswLDFdXV0sW1tbMTQ1LDFdXSxbWzIsMl0sWzE0NiwzXV0sW1swLDJdXSxbWzE0NSwxXSxbMiwyXV1dLFtbWzQ4LDFdXSxbWzQ5LDJdLFswLDFdXSxbWzAsMl1dXSxbW1sxNDcsMV0sWzE0OCwxXSxbMTQ5LDFdLFsxNTAsMV0sWzE1MSwxXSxbMTUyLDFdLFsxNTMsMV0sWzE1NCwxXSxbMTU1LDFdLFsxNTYsMV1dLFtbMCwxXV1dLFtbWzE1LDFdXSxbWzk1LDJdXSxbWzAsMl1dXSxbW1sxLDFdLFszLDFdXSxbWzAsMV1dXSxbW1s0OSwxXSxbNDgsMl1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM10sWzE1Nyw0XSxbMCwyXV0sW1sxNTcsNF0sWzAsM11dLFtbMCw0XV1dLFtbWzE1OCwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxNTgsMV0sWzAsMl1dXSxbW1sxLDFdLFsyLDJdXSxbWzAsMV1dLFtbMTU5LDNdXSxbWzEyMSw0XV0sW1sxNjAsMV0sWzEyMSw0XV1dLFtbWzEyMCwxXV0sW1sxNjEsMF0sWzE1LDBdLFsxNjIsXG4wXSxbNDEsMF0sWzE2MywwXSxbMCwxXV1dLFtbWzg0LDFdLFsxNjQsMl1dLFtbMzcsM10sWzAsMV1dLFtbMCwyXV0sW1s4NCw0XV0sW1sxMjcsNV1dLFtbNDksMl1dXSxbW1sxNjUsMV0sWzg0LDFdXSxbWzAsMV1dXSxbW1s0OSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMCwyXV1dLFtbWzQ5LDFdLFsxMDcsMV1dLFtbNTQsMl0sWzUyLDNdLFswLDFdXSxbWzAsMl1dLFtbNDksNF0sWzEwNyw0XSxbMCwzXV0sW1s1MiwzXSxbMCw0XV1dLFtbWzQ5LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbNDksMV0sWzEwNywxXSxbMCwyXV1dLFtbWzI1LDFdXSxbWzQ4LDJdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSxbW1szNSwxXSxbMTEwLDJdLFszOCwzXV0sW1s2MSw0XSxbODEsNV1dLFtbMjUsNF1dLFtbMTY2LDZdXSxbWzAsNF1dLFtbNjEsNF1dLFtbNjQsNF1dXSxbW1syMCwxXV0sW1s0OCwyXV0sW1s4MCwzXV0sW1sxNjcsNF0sWzE2OCw1XV0sW1s0OCw2XV0sW1s0OCw3XV0sXG5bWzgwLDhdXSxbWzgwLDldXSxbWzE2Nyw0XSxbMTI3LDEwXSxbMTY4LDVdLFswLDhdXSxbWzAsOV1dLFtbNDgsMTFdXSxbWzgwLDEyXV0sW1sxNjgsNV0sWzAsMTJdXV0sW1tbMTUsMV0sWzE2OSwyXSxbNTMsM11dLFtbMTY5LDRdLFs1Miw1XSxbMCwxXV0sW1s1MCw2XSxbNTIsN10sWzAsMl1dLFtbMTY5LDhdXSxbWzUyLDVdLFswLDRdXSxbWzE2OSw5XSxbNTMsM10sWzAsNV1dLFtbNDksMTBdXSxbWzE1LDExXSxbMTY5LDJdLFs1MywzXSxbMCw3XV0sW1s1MiwxMl0sWzAsOF1dLFtbNTAsMTNdLFs1Miw1XSxbMCw5XV0sW1s1Miw3XSxbMCwxMF1dLFtbMTY5LDE0XSxbNTIsMTVdLFswLDExXV0sW1swLDEyXV0sW1s0OSw0XV0sW1s1MiwxNV0sWzAsMTRdXSxbWzE2OSwxNl0sWzUzLDNdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sW1tbMTUsMV0sWzUzLDJdLFsxNzAsM11dLFtbMTcwLDVdLFs1Miw0XSxbMCwxXV0sW1sxNzAsNl1dLFtbNTAsN10sWzUyLFxuOF0sWzAsM11dLFtbNTMsMl0sWzE3MCw5XSxbMCw0XV0sW1s1Miw0XSxbMCw1XV0sW1s1MiwxMF0sWzAsNl1dLFtbNDksMTFdXSxbWzE1LDEyXSxbNTMsMl0sWzE3MCwzXSxbMCw4XV0sW1s1MCwxM10sWzUyLDRdLFswLDldXSxbWzAsMTBdXSxbWzUyLDhdLFswLDExXV0sW1s1MiwxNV0sWzE3MCwxNF0sWzAsMTJdXSxbWzQ5LDVdXSxbWzUyLDE1XSxbMCwxNF1dLFtbNTMsMl0sWzE3MCwxNl0sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSxbW1syNSwxXV0sW1swLDFdXV0sW1tbMjEsMV1dLFtbNDksMl1dLFtbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSxbW1s0OSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbOTUsM11dLFtbMCwzXV1dLFtbWzQyLDFdXSxbWzE3MSwyXV0sW1s0OCwzXSxbNTIsMV1dLFtbODAsNF1dLFtbMCw0XV1dLFtbWzE3MiwxXV0sW1sxNzMsMF0sWzAsMV1dXSxbW1sxMTEsMl0sXG5bMzYsMV1dLFtbNDksMl1dLFtbMCwyXV1dLFtbWzMxLDFdXSxbWzE3NCwyXSxbMCwxXV0sW1swLDJdXV0sW1tbNjIsMV1dLFtbMCwxXV1dXSxsYWJlbHM6W1swLFwiRU1QVFlcIl0sWzMxNyxudWxsXSxbNCxudWxsXSxbMjc2LG51bGxdLFsxLFwiZGVmXCJdLFsxLFwicmFpc2VcIl0sWzEsXCJUcnVlXCJdLFszLG51bGxdLFsxLFwibm90XCJdLFsxLFwibnVsbFwiXSxbNTUsbnVsbF0sWzIsbnVsbF0sWzI1LG51bGxdLFsxLFwiY2xhc3NcIl0sWzEsXCJsYW1iZGFcIl0sWzE2LG51bGxdLFsxLFwicHJpbnRcIl0sWzEsXCJkZWJ1Z2dlclwiXSxbMSxcIm5vbmxvY2FsXCJdLFs1MixudWxsXSxbMSxcInRyeVwiXSxbMSxcIndoaWxlXCJdLFszMSxudWxsXSxbMSxcInJldHVyblwiXSxbMSxcImFzc2VydFwiXSxbMSxudWxsXSxbMSxcImdsb2JhbFwiXSxbMSxcImRlbFwiXSxbMSxcInBhc3NcIl0sWzU0LG51bGxdLFsxNSxudWxsXSxbMSxcInlpZWxkXCJdLFsxLFwiaW1wb3J0XCJdLFsxLFwiRmFsc2VcIl0sWzEsXCJmb3JcIl0sWzcsbnVsbF0sWzEsXCJmcm9tXCJdLFsxLFxuXCJpZlwiXSxbOSxudWxsXSxbMSxcImJyZWFrXCJdLFsxLFwiY29udGludWVcIl0sWzQ5LG51bGxdLFsxLFwid2l0aFwiXSxbMTQsbnVsbF0sWzMxNixudWxsXSxbMTksbnVsbF0sWzMwOCxudWxsXSxbMSxcImFuZFwiXSxbMTEsbnVsbF0sWzMyNixudWxsXSxbMjIsbnVsbF0sWzI2MSxudWxsXSxbMTIsbnVsbF0sWzM1LG51bGxdLFsyNzEsbnVsbF0sWzMyNSxudWxsXSxbMjk3LG51bGxdLFszMzksbnVsbF0sWzI5NixudWxsXSxbMjYsbnVsbF0sWzI4MyxudWxsXSxbOCxudWxsXSxbMzQyLG51bGxdLFszMjksbnVsbF0sWzEwLG51bGxdLFsyNjYsbnVsbF0sWzMzMixudWxsXSxbNDUsbnVsbF0sWzM4LG51bGxdLFs0MCxudWxsXSxbNTAsbnVsbF0sWzQ2LG51bGxdLFs0MSxudWxsXSxbNDIsbnVsbF0sWzM2LG51bGxdLFs0MyxudWxsXSxbNDgsbnVsbF0sWzQ0LG51bGxdLFszNyxudWxsXSxbMzksbnVsbF0sWzMyNCxudWxsXSxbMjYwLG51bGxdLFsyOTIsbnVsbF0sWzEsXCJpblwiXSxbMzA5LG51bGxdLFsyNzMsXG5udWxsXSxbMzI3LG51bGxdLFsyNzIsbnVsbF0sWzI4LG51bGxdLFsyMSxudWxsXSxbMjcsbnVsbF0sWzI5LG51bGxdLFsxLFwiaXNcIl0sWzMwLG51bGxdLFsyMCxudWxsXSxbMjkwLG51bGxdLFsyNzQsbnVsbF0sWzMzMyxudWxsXSxbMjk5LG51bGxdLFsyNzAsbnVsbF0sWzMzNyxudWxsXSxbMjc5LG51bGxdLFsyNjUsbnVsbF0sWzI4MSxudWxsXSxbMjY0LG51bGxdLFsyODYsbnVsbF0sWzI4MCxudWxsXSxbMzIwLG51bGxdLFsxLFwiYXNcIl0sWzI4NCxudWxsXSxbMjMsbnVsbF0sWzMyOCxudWxsXSxbMCxudWxsXSxbMSxcImV4Y2VwdFwiXSxbMzQwLG51bGxdLFsxOCxudWxsXSxbMzMwLG51bGxdLFsyNjgsbnVsbF0sWzI1OSxudWxsXSxbMzEyLG51bGxdLFsyOTMsbnVsbF0sWzMyMSxudWxsXSxbMjY5LG51bGxdLFsyNzcsbnVsbF0sWzMxNCxudWxsXSxbMzE1LG51bGxdLFszNDMsbnVsbF0sWzEsXCJlbHNlXCJdLFszMTAsbnVsbF0sWzUxLG51bGxdLFsxLFwiZWxpZlwiXSxbMzAwLG51bGxdLFszMDEsXG5udWxsXSxbMjg1LG51bGxdLFszMDMsbnVsbF0sWzMwMixudWxsXSxbMzM1LG51bGxdLFsyNzUsbnVsbF0sWzI1OCxudWxsXSxbMSxcIm9yXCJdLFszMzQsbnVsbF0sWzI2NyxudWxsXSxbMzQsbnVsbF0sWzI2MixudWxsXSxbMzMsbnVsbF0sWzMxOSxudWxsXSxbMTMsbnVsbF0sWzI5NSxudWxsXSxbMjYzLG51bGxdLFsyOTEsbnVsbF0sWzMxMSxudWxsXSxbMzA3LG51bGxdLFszMTMsbnVsbF0sWzI4MixudWxsXSxbMjk4LG51bGxdLFszMDQsbnVsbF0sWzI3OCxudWxsXSxbMzE4LG51bGxdLFszMjIsbnVsbF0sWzUsbnVsbF0sWzYsbnVsbF0sWzQ3LG51bGxdLFsxNyxudWxsXSxbMjQsbnVsbF0sWzMwNSxudWxsXSxbMzA2LG51bGxdLFszMjMsbnVsbF0sWzI4OSxudWxsXSxbMSxcImZpbmFsbHlcIl0sWzMzMSxudWxsXSxbMzM2LG51bGxdLFszMzgsbnVsbF0sWzI1NyxudWxsXSxbMzIsbnVsbF0sWzM0MSxudWxsXV0sa2V5d29yZHM6e0ZhbHNlOjMzLFwibnVsbFwiOjksVHJ1ZTo2LGFuZDo0NyxcbmFzOjEwOCxhc3NlcnQ6MjQsXCJicmVha1wiOjM5LFwiY2xhc3NcIjoxMyxcImNvbnRpbnVlXCI6NDAsXCJkZWJ1Z2dlclwiOjE3LGRlZjo0LGRlbDoyNyxlbGlmOjEzMCxcImVsc2VcIjoxMjcsZXhjZXB0OjExMyxcImZpbmFsbHlcIjoxNjgsXCJmb3JcIjozNCxmcm9tOjM2LGdsb2JhbDoyNixcImlmXCI6MzcsXCJpbXBvcnRcIjozMixcImluXCI6ODMsaXM6OTIsbGFtYmRhOjE0LG5vbmxvY2FsOjE4LG5vdDo4LG9yOjEzOSxwYXNzOjI4LHByaW50OjE2LHJhaXNlOjUsXCJyZXR1cm5cIjoyMyxcInRyeVwiOjIwLFwid2hpbGVcIjoyMSxcIndpdGhcIjo0Mix5aWVsZDozMX0sdG9rZW5zOnswOjExMiwxOjI1LDI6MTEsMzo3LDQ6Miw1OjE1OSw2OjE2MCw3OjM1LDg6NjEsOTozOCwxMDo2NCwxMTo0OCwxMjo1MiwxMzoxNDYsMTQ6NDMsMTU6MzAsMTY6MTUsMTc6MTYyLDE4OjExNSwxOTo0NSwyMDo5NCwyMTo4OSwyMjo1MCwyMzoxMTAsMjQ6MTYzLDI1OjEyLDI2OjU5LDI3OjkwLDI4Ojg4LDI5OjkxLDMwOjkzLDMxOjIyLDMyOjE3MyxcbjMzOjE0NCwzNDoxNDIsMzU6NTMsMzY6NzQsMzc6NzgsMzg6NjgsMzk6NzksNDA6NjksNDE6NzIsNDI6NzMsNDM6NzUsNDQ6NzcsNDU6NjcsNDY6NzEsNDc6MTYxLDQ4Ojc2LDQ5OjQxLDUwOjcwLDUxOjEyOSw1MjoxOSw1NDoyOSw1NToxMH0sc3RhcnQ6MjU2fX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5maWxlbmFtZT1hO3RoaXMuZ3JhbW1hcj1jO3RoaXMucF9mbGFncz0wO3JldHVybiB0aGlzfWZ1bmN0aW9uIGMoYixjKXt2b2lkIDA9PT1jJiYoYz1cImZpbGVfaW5wdXRcIik7Yj1uZXcgYShiLFNrLlBhcnNlVGFibGVzKTtcImZpbGVfaW5wdXRcIj09PWM/Yi5zZXR1cChTay5QYXJzZVRhYmxlcy5zeW0uZmlsZV9pbnB1dCk6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIik7cmV0dXJuIGJ9YS5GVVRVUkVfUFJJTlRfRlVOQ1RJT049XCJwcmludF9mdW5jdGlvblwiO2EuRlVUVVJFX1VOSUNPREVfTElURVJBTFM9XCJ1bmljb2RlX2xpdGVyYWxzXCI7YS5GVVRVUkVfRElWSVNJT049XG5cImRpdmlzaW9uXCI7YS5GVVRVUkVfQUJTT0xVVEVfSU1QT1JUPVwiYWJzb2x1dGVfaW1wb3J0XCI7YS5GVVRVUkVfV0lUSF9TVEFURU1FTlQ9XCJ3aXRoX3N0YXRlbWVudFwiO2EuRlVUVVJFX05FU1RFRF9TQ09QRVM9XCJuZXN0ZWRfc2NvcGVzXCI7YS5GVVRVUkVfR0VORVJBVE9SUz1cImdlbmVyYXRvcnNcIjthLkNPX0ZVVFVSRV9QUklOVF9GVU5DVElPTj02NTUzNjthLkNPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTPTEzMTA3MjthLkNPX0ZVVFVSRV9ESVZJU09OPTgxOTI7YS5DT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUPTE2Mzg0O2EuQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UPTMyNzY4O2EucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKGEpe2E9YXx8dGhpcy5ncmFtbWFyLnN0YXJ0O3RoaXMuc3RhY2s9W3tkZmE6dGhpcy5ncmFtbWFyLmRmYXNbYV0sc3RhdGU6MCxub2RlOnt0eXBlOmEsdmFsdWU6bnVsbCxjb250ZXh0Om51bGwsY2hpbGRyZW46W119fV07dGhpcy51c2VkX25hbWVzPXt9fTthLnByb3RvdHlwZS5hZGR0b2tlbj1cbmZ1bmN0aW9uKGEsYyxmKXt2YXIgYixlPXRoaXMuY2xhc3NpZnkoYSxjLGYpO2E6Zm9yKDs7KXt2YXIgZD10aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdO3ZhciBnPWQuZGZhWzBdO3ZhciBuPWdbZC5zdGF0ZV07Zm9yKGI9MDtiPG4ubGVuZ3RoOysrYil7dmFyIGs9bltiXVswXTt2YXIgcD1uW2JdWzFdO3ZhciBtPXRoaXMuZ3JhbW1hci5sYWJlbHNba11bMF07aWYoZT09PWspe1NrLmFzc2VydHMuYXNzZXJ0KDI1Nj5tKTt0aGlzLnNoaWZ0KGEsYyxwLGYpO2ZvcihmPXA7MT09PWdbZl0ubGVuZ3RoJiYwPT09Z1tmXVswXVswXSYmZ1tmXVswXVsxXT09PWY7KXt0aGlzLnBvcCgpO2lmKDA9PT10aGlzLnN0YWNrLmxlbmd0aClyZXR1cm4hMDtkPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV07Zj1kLnN0YXRlO2c9ZC5kZmFbMF19cmV0dXJuITF9aWYoMjU2PD1tJiYoaz10aGlzLmdyYW1tYXIuZGZhc1ttXSxrPWtbMV0say5oYXNPd25Qcm9wZXJ0eShlKSkpe3RoaXMucHVzaChtLFxudGhpcy5ncmFtbWFyLmRmYXNbbV0scCxmKTtjb250aW51ZSBhfX1iOntnPVswLGQuc3RhdGVdO2ZvcihkPW4ubGVuZ3RoO2QtLTspaWYobltkXVswXT09PWdbMF0mJm5bZF1bMV09PT1nWzFdKXtuPSEwO2JyZWFrIGJ9bj0hMX1pZihuKXtpZih0aGlzLnBvcCgpLDA9PT10aGlzLnN0YWNrLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInRvbyBtdWNoIGlucHV0XCIsdGhpcy5maWxlbmFtZSk7fWVsc2UgdGhyb3cgYT1mWzBdWzBdLG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYmFkIGlucHV0XCIsdGhpcy5maWxlbmFtZSxhLGYpO319O2EucHJvdG90eXBlLmNsYXNzaWZ5PWZ1bmN0aW9uKGIsYyxmKXtpZihiPT09U2sudG9rZW4udG9rZW5zLlRfTkFNRSl7dGhpcy51c2VkX25hbWVzW2NdPSEwO3ZhciBlPXRoaXMuZ3JhbW1hci5rZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eShjKSYmdGhpcy5ncmFtbWFyLmtleXdvcmRzW2NdO1wicHJpbnRcIj09PWMmJih0aGlzLnBfZmxhZ3MmXG5hLkNPX0ZVVFVSRV9QUklOVF9GVU5DVElPTnx8ITA9PT1Tay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uKSYmKGU9ITEpO2lmKGUpcmV0dXJuIGV9ZT10aGlzLmdyYW1tYXIudG9rZW5zLmhhc093blByb3BlcnR5KGIpJiZ0aGlzLmdyYW1tYXIudG9rZW5zW2JdO2lmKCFlKXtjPVwiI1wiK2I7Zm9yKGxldCBhIGluIFNrLnRva2VuLnRva2VucylpZihTay50b2tlbi50b2tlbnNbYV09PWIpe2M9YTticmVha310aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImJhZCB0b2tlbiBcIitjLHRoaXMuZmlsZW5hbWUsZlswXVswXSxmKTt9cmV0dXJuIGV9O2EucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKGEsYyxmLGwpe3ZhciBiPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV0uZGZhLGQ9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlO2QuY2hpbGRyZW4ucHVzaCh7dHlwZTphLHZhbHVlOmMsbGluZW5vOmxbMF1bMF0sY29sX29mZnNldDpsWzBdWzFdLGNoaWxkcmVuOm51bGx9KTtcbnRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV09e2RmYTpiLHN0YXRlOmYsbm9kZTpkfX07YS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihhLGMsZixsKXthPXt0eXBlOmEsdmFsdWU6bnVsbCxsaW5lbm86bFswXVswXSxjb2xfb2Zmc2V0OmxbMF1bMV0sY2hpbGRyZW46W119O3RoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV09e2RmYTp0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLmRmYSxzdGF0ZTpmLG5vZGU6dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlfTt0aGlzLnN0YWNrLnB1c2goe2RmYTpjLHN0YXRlOjAsbm9kZTphfSl9O2EucHJvdG90eXBlLnBvcD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc3RhY2sucG9wKCkubm9kZTtpZihhKWlmKDAhPT10aGlzLnN0YWNrLmxlbmd0aCl7dmFyIGM9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlO2MuY2hpbGRyZW4ucHVzaChhKX1lbHNlIHRoaXMucm9vdG5vZGU9YSx0aGlzLnJvb3Rub2RlLnVzZWRfbmFtZXM9XG50aGlzLnVzZWRfbmFtZXN9O1NrLnBhcnNlPWZ1bmN0aW9uKGEsZSl7dmFyIGI9U2sudG9rZW4udG9rZW5zLlRfQ09NTUVOVCxsPVNrLnRva2VuLnRva2Vucy5UX05MLGg9U2sudG9rZW4udG9rZW5zLlRfT1AsZD1Tay50b2tlbi50b2tlbnMuVF9FTkRNQVJLRVIsZz1Tay50b2tlbi50b2tlbnMuVF9FTkNPRElORyxuPSExLGs9YyhhKTtTay5fdG9rZW5pemUoYSxmdW5jdGlvbihhKXt2YXIgYj1hLnNwbGl0KFwiXFxuXCIpLnJldmVyc2UoKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGErXCJcXG5cIn0pO3JldHVybiBmdW5jdGlvbigpe2lmKDA9PT1iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXCJFT0ZcIik7cmV0dXJuIGIucG9wKCl9fShlKSxcInV0Zi04XCIsZnVuY3Rpb24oYSl7dmFyIGM9bnVsbDthLnR5cGUhPT1iJiZhLnR5cGUhPT1sJiZhLnR5cGUhPT1nJiYoYS50eXBlPT09aCYmKGM9U2suT3BNYXBbYS5zdHJpbmddKSxrLmFkZHRva2VuKGN8fGEudHlwZSxhLnN0cmluZyxcblthLnN0YXJ0LGEuZW5kLGEubGluZV0pLGEudHlwZT09PWQmJihuPSEwKSl9KTtpZighbil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImluY29tcGxldGUgaW5wdXRcIix0aGlzLmZpbGVuYW1lKTtyZXR1cm57Y3N0Omsucm9vdG5vZGUsZmxhZ3M6ay5wX2ZsYWdzfX07U2sucGFyc2VUcmVlRHVtcD1mdW5jdGlvbihhLGMpe3ZhciBiO2M9Y3x8XCJcIjt2YXIgZT1cIlwiK2M7aWYoMjU2PD1hLnR5cGUpZm9yKGUrPVNrLlBhcnNlVGFibGVzLm51bWJlcjJzeW1ib2xbYS50eXBlXStcIlxcblwiLGI9MDtiPGEuY2hpbGRyZW4ubGVuZ3RoOysrYillKz1Tay5wYXJzZVRyZWVEdW1wKGEuY2hpbGRyZW5bYl0sYytcIiAgXCIpO2Vsc2UgZSs9U2sudG9rZW4udG9rX25hbWVbYS50eXBlXStcIjogXCIrKG5ldyBTay5idWlsdGluLnN0cihhLnZhbHVlKSkuJHIoKS52K1wiXFxuXCI7cmV0dXJuIGV9O1NrLmV4cG9ydFN5bWJvbChcIlNrLlBhcnNlclwiLGEpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnBhcnNlXCIsU2sucGFyc2UpO1xuU2suZXhwb3J0U3ltYm9sKFwiU2sucGFyc2VUcmVlRHVtcFwiLFNrLnBhcnNlVHJlZUR1bXApfSxmdW5jdGlvbihtLHEpe1NrLmFzdG5vZGVzPXt9O1NrLmFzdG5vZGVzLkxvYWQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlN0b3JlPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5EZWw9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkF1Z0xvYWQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkF1Z1N0b3JlPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5QYXJhbT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQW5kPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Pcj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQWRkPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5TdWI9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk11bHQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk1hdE11bHQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkRpdj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTW9kPWZ1bmN0aW9uKCl7fTtcblNrLmFzdG5vZGVzLlBvdz1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTFNoaWZ0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5SU2hpZnQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkJpdE9yPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5CaXRYb3I9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkJpdEFuZD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuRmxvb3JEaXY9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkludmVydD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5VQWRkPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5VU3ViPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5FcT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90RXE9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkx0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5MdEU9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkd0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5HdEU9XG5mdW5jdGlvbigpe307U2suYXN0bm9kZXMuSXM9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLklzTm90PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Jbj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90SW49ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk1vZHVsZT1mdW5jdGlvbihhLGMpe3RoaXMuYm9keT1hO3RoaXMuZG9jc3RyaW5nPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkludGVyYWN0aXZlPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHByZXNzaW9uPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdWl0ZT1mdW5jdGlvbihhKXt0aGlzLmJvZHk9YTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRnVuY3Rpb25EZWY9ZnVuY3Rpb24oYSxjLGIsZSxmLGwsaCxkKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09aCYmdm9pZCAwIT09aCk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWQmJnZvaWQgMCE9PVxuZCk7dGhpcy5uYW1lPWE7dGhpcy5hcmdzPWM7dGhpcy5ib2R5PWI7dGhpcy5kZWNvcmF0b3JfbGlzdD1lO3RoaXMucmV0dXJucz1mO3RoaXMuZG9jc3RyaW5nPWw7dGhpcy5saW5lbm89aDt0aGlzLmNvbF9vZmZzZXQ9ZDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZj1mdW5jdGlvbihhLGMsYixlLGYsbCxoLGQpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1oJiZ2b2lkIDAhPT1oKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZCYmdm9pZCAwIT09ZCk7dGhpcy5uYW1lPWE7dGhpcy5hcmdzPWM7dGhpcy5ib2R5PWI7dGhpcy5kZWNvcmF0b3JfbGlzdD1lO3RoaXMucmV0dXJucz1mO3RoaXMuZG9jc3RyaW5nPWw7dGhpcy5saW5lbm89aDt0aGlzLmNvbF9vZmZzZXQ9ZDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ2xhc3NEZWY9ZnVuY3Rpb24oYSxjLGIsZSxmLGwsaCxkKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09aCYmdm9pZCAwIT09aCk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZCYmdm9pZCAwIT09ZCk7dGhpcy5uYW1lPWE7dGhpcy5iYXNlcz1jO3RoaXMua2V5d29yZHM9Yjt0aGlzLmJvZHk9ZTt0aGlzLmRlY29yYXRvcl9saXN0PWY7dGhpcy5kb2NzdHJpbmc9bDt0aGlzLmxpbmVubz1oO3RoaXMuY29sX29mZnNldD1kO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5SZXR1cm49ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRlbGV0ZT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnRhcmdldHM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3NpZ249XG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMudGFyZ2V0cz1hO3RoaXMudmFsdWU9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5BdWdBc3NpZ249ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGFyZ2V0PWE7dGhpcy5vcD1jO3RoaXMudmFsdWU9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bbm5Bc3NpZ249ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy50YXJnZXQ9XG5hO3RoaXMuYW5ub3RhdGlvbj1jO3RoaXMudmFsdWU9Yjt0aGlzLnNpbXBsZT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PWw7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkZvcj1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLnRhcmdldD1hO3RoaXMuaXRlcj1jO3RoaXMuYm9keT1iO3RoaXMub3JlbHNlPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXN5bmNGb3I9ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy50YXJnZXQ9YTt0aGlzLml0ZXI9Yzt0aGlzLmJvZHk9Yjt0aGlzLm9yZWxzZT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PVxubDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuV2hpbGU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGVzdD1hO3RoaXMuYm9keT1jO3RoaXMub3JlbHNlPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSWY9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGVzdD1hO3RoaXMuYm9keT1jO3RoaXMub3JlbHNlPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuV2l0aD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZSYmdm9pZCAwIT09ZSk7dGhpcy5pdGVtcz1hO3RoaXMuYm9keT1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFzeW5jV2l0aD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuaXRlbXM9YTt0aGlzLmJvZHk9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5SYWlzZT1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLmV4Yz1hO3RoaXMuY2F1c2U9Yzt0aGlzLmluc3Q9Yjt0aGlzLnRiYWNrPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuVHJ5PVxuZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy5ib2R5PWE7dGhpcy5oYW5kbGVycz1jO3RoaXMub3JlbHNlPWI7dGhpcy5maW5hbGJvZHk9ZTt0aGlzLmxpbmVubz1mO3RoaXMuY29sX29mZnNldD1sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3NlcnQ9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLnRlc3Q9YTt0aGlzLm1zZz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkltcG9ydD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1cbmIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JbXBvcnRGcm9tPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLm1vZHVsZT1hO3RoaXMubmFtZXM9Yzt0aGlzLmxldmVsPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuR2xvYmFsPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Ob25sb2NhbD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuYyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHByPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5QYXNzPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWEmJnZvaWQgMCE9PWEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CcmVhaz1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1cbmEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Db250aW51ZT1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1hKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7dGhpcy5saW5lbm89YTt0aGlzLmNvbF9vZmZzZXQ9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuUHJpbnQ9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMuZGVzdD1hO3RoaXMudmFsdWVzPWM7dGhpcy5ubD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRlYnVnZ2VyPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuYSYmdm9pZCAwIT09YSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJvb2xPcD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMub3A9YTt0aGlzLnZhbHVlcz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJpbk9wPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLmxlZnQ9YTt0aGlzLm9wPWM7dGhpcy5yaWdodD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlVuYXJ5T3A9XG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMub3A9YTt0aGlzLm9wZXJhbmQ9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5MYW1iZGE9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmFyZ3M9YTt0aGlzLmJvZHk9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JZkV4cD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50ZXN0PWE7dGhpcy5ib2R5PWM7dGhpcy5vcmVsc2U9XG5iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRpY3Q9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmtleXM9YTt0aGlzLnZhbHVlcz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlNldD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLmVsdHM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5MaXN0Q29tcD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZSYmdm9pZCAwIT09ZSk7dGhpcy5lbHQ9YTt0aGlzLmdlbmVyYXRvcnM9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TZXRDb21wPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5lbHQ9YTt0aGlzLmdlbmVyYXRvcnM9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5EaWN0Q29tcD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5rZXk9YTt0aGlzLnZhbHVlPWM7dGhpcy5nZW5lcmF0b3JzPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwPVxuZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdD1hO3RoaXMuZ2VuZXJhdG9ycz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkF3YWl0PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5ZaWVsZD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9XG5iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5ZaWVsZEZyb209ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbXBhcmU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMubGVmdD1hO3RoaXMub3BzPWM7dGhpcy5jb21wYXJhdG9ycz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNhbGw9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJlxudm9pZCAwIT09Zik7dGhpcy5mdW5jPWE7dGhpcy5hcmdzPWM7dGhpcy5rZXl3b3Jkcz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk51bT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLm49YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy5zPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy52YWx1ZT1hO3RoaXMuY29udmVyc2lvbj1jO3RoaXMuZm9ybWF0X3NwZWM9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Kb2luZWRTdHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CeXRlcz1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ9XG5mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRWxsaXBzaXM9ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YSYmdm9pZCAwIT09YSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbnN0YW50PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5BdHRyaWJ1dGU9XG5mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy52YWx1ZT1hO3RoaXMuYXR0cj1jO3RoaXMuY3R4PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU3Vic2NyaXB0PWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnZhbHVlPWE7dGhpcy5zbGljZT1jO3RoaXMuY3R4PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU3RhcnJlZD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1xudGhpcy52YWx1ZT1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTmFtZT1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuaWQ9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkxpc3Q9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdHM9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlR1cGxlPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1cbmIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdHM9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlNsaWNlPWZ1bmN0aW9uKGEsYyxiKXt0aGlzLmxvd2VyPWE7dGhpcy51cHBlcj1jO3RoaXMuc3RlcD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHRTbGljZT1mdW5jdGlvbihhKXt0aGlzLmRpbXM9YTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSW5kZXg9ZnVuY3Rpb24oYSl7dGhpcy52YWx1ZT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uPWZ1bmN0aW9uKGEsYyxiLGUpe3RoaXMudGFyZ2V0PWE7dGhpcy5pdGVyPWM7dGhpcy5pZnM9Yjt0aGlzLmlzX2FzeW5jPWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXI9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09XG5lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50eXBlPWE7dGhpcy5uYW1lPWM7dGhpcy5ib2R5PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuYXJndW1lbnRzXz1mdW5jdGlvbihhLGMsYixlLGYsbCl7dGhpcy5hcmdzPWE7dGhpcy52YXJhcmc9Yzt0aGlzLmt3b25seWFyZ3M9Yjt0aGlzLmt3X2RlZmF1bHRzPWU7dGhpcy5rd2FyZz1mO3RoaXMuZGVmYXVsdHM9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuYXJnPWZ1bmN0aW9uIGEoYSxjKXt0aGlzLmFyZz1hO3RoaXMuYW5ub3RhdGlvbj1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5rZXl3b3JkPWZ1bmN0aW9uKGEsYyl7dGhpcy5hcmc9YTt0aGlzLnZhbHVlPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLmFsaWFzPWZ1bmN0aW9uKGEsYyl7dGhpcy5uYW1lPWE7dGhpcy5hc25hbWU9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMud2l0aGl0ZW09XG5mdW5jdGlvbihhLGMpe3RoaXMuY29udGV4dF9leHByPWE7dGhpcy5vcHRpb25hbF92YXJzPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk1vZHVsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJNb2R1bGVcIjtTay5hc3Rub2Rlcy5Nb2R1bGUucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuSW50ZXJhY3RpdmUucHJvdG90eXBlLl9hc3RuYW1lPVwiSW50ZXJhY3RpdmVcIjtTay5hc3Rub2Rlcy5JbnRlcmFjdGl2ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLkV4cHJlc3Npb24ucHJvdG90eXBlLl9hc3RuYW1lPVwiRXhwcmVzc2lvblwiO1NrLmFzdG5vZGVzLkV4cHJlc3Npb24ucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5TdWl0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XG5cIlN1aXRlXCI7U2suYXN0bm9kZXMuU3VpdGUucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJGdW5jdGlvbkRlZlwiO1NrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmLnByb3RvdHlwZS5fZmllbGRzPVtcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcImRlY29yYXRvcl9saXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVjb3JhdG9yX2xpc3R9LFwicmV0dXJuc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnJldHVybnN9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3luY0Z1bmN0aW9uRGVmXCI7U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZi5wcm90b3R5cGUuX2ZpZWxkcz1cbltcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcImRlY29yYXRvcl9saXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVjb3JhdG9yX2xpc3R9LFwicmV0dXJuc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnJldHVybnN9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuQ2xhc3NEZWYucHJvdG90eXBlLl9hc3RuYW1lPVwiQ2xhc3NEZWZcIjtTay5hc3Rub2Rlcy5DbGFzc0RlZi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0sXCJiYXNlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJhc2VzfSxcImtleXdvcmRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5d29yZHN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZGVjb3JhdG9yX2xpc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZWNvcmF0b3JfbGlzdH0sXG5cImRvY3N0cmluZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRvY3N0cmluZ31dO1NrLmFzdG5vZGVzLlJldHVybi5wcm90b3R5cGUuX2FzdG5hbWU9XCJSZXR1cm5cIjtTay5hc3Rub2Rlcy5SZXR1cm4ucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkRlbGV0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJEZWxldGVcIjtTay5hc3Rub2Rlcy5EZWxldGUucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldHN9XTtTay5hc3Rub2Rlcy5Bc3NpZ24ucHJvdG90eXBlLl9hc3RuYW1lPVwiQXNzaWduXCI7U2suYXN0bm9kZXMuQXNzaWduLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXRzfSxcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5BdWdBc3NpZ24ucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnQXNzaWduXCI7XG5Tay5hc3Rub2Rlcy5BdWdBc3NpZ24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkFubkFzc2lnbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBbm5Bc3NpZ25cIjtTay5hc3Rub2Rlcy5Bbm5Bc3NpZ24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcImFubm90YXRpb25cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hbm5vdGF0aW9ufSxcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwic2ltcGxlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2ltcGxlfV07U2suYXN0bm9kZXMuRm9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIkZvclwiO1NrLmFzdG5vZGVzLkZvci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFxuXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5Bc3luY0Zvci5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3luY0ZvclwiO1NrLmFzdG5vZGVzLkFzeW5jRm9yLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5XaGlsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJXaGlsZVwiO1NrLmFzdG5vZGVzLldoaWxlLnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50ZXN0fSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcIm9yZWxzZVwiLFxuZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuSWYucHJvdG90eXBlLl9hc3RuYW1lPVwiSWZcIjtTay5hc3Rub2Rlcy5JZi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0ZXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGVzdH0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5XaXRoLnByb3RvdHlwZS5fYXN0bmFtZT1cIldpdGhcIjtTay5hc3Rub2Rlcy5XaXRoLnByb3RvdHlwZS5fZmllbGRzPVtcIml0ZW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5Bc3luY1dpdGgucHJvdG90eXBlLl9hc3RuYW1lPVwiQXN5bmNXaXRoXCI7U2suYXN0bm9kZXMuQXN5bmNXaXRoLnByb3RvdHlwZS5fZmllbGRzPVtcIml0ZW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtcblNrLmFzdG5vZGVzLlJhaXNlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlJhaXNlXCI7U2suYXN0bm9kZXMuUmFpc2UucHJvdG90eXBlLl9maWVsZHM9W1wiZXhjXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZXhjfSxcImNhdXNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2F1c2V9LFwiaW5zdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmluc3R9LFwidGJhY2tcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YmFja31dO1NrLmFzdG5vZGVzLlRyeS5wcm90b3R5cGUuX2FzdG5hbWU9XCJUcnlcIjtTay5hc3Rub2Rlcy5UcnkucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiaGFuZGxlcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5oYW5kbGVyc30sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9LFwiZmluYWxib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZmluYWxib2R5fV07U2suYXN0bm9kZXMuQXNzZXJ0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkFzc2VydFwiO1xuU2suYXN0bm9kZXMuQXNzZXJ0LnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50ZXN0fSxcIm1zZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm1zZ31dO1NrLmFzdG5vZGVzLkltcG9ydC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbXBvcnRcIjtTay5hc3Rub2Rlcy5JbXBvcnQucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lc31dO1NrLmFzdG5vZGVzLkltcG9ydEZyb20ucHJvdG90eXBlLl9hc3RuYW1lPVwiSW1wb3J0RnJvbVwiO1NrLmFzdG5vZGVzLkltcG9ydEZyb20ucHJvdG90eXBlLl9maWVsZHM9W1wibW9kdWxlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubW9kdWxlfSxcIm5hbWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZXN9LFwibGV2ZWxcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sZXZlbH1dO1NrLmFzdG5vZGVzLkdsb2JhbC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHbG9iYWxcIjtTay5hc3Rub2Rlcy5HbG9iYWwucHJvdG90eXBlLl9maWVsZHM9XG5bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuTm9ubG9jYWwucHJvdG90eXBlLl9hc3RuYW1lPVwiTm9ubG9jYWxcIjtTay5hc3Rub2Rlcy5Ob25sb2NhbC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuRXhwci5wcm90b3R5cGUuX2FzdG5hbWU9XCJFeHByXCI7U2suYXN0bm9kZXMuRXhwci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuUGFzcy5wcm90b3R5cGUuX2FzdG5hbWU9XCJQYXNzXCI7U2suYXN0bm9kZXMuUGFzcy5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5CcmVhay5wcm90b3R5cGUuX2FzdG5hbWU9XCJCcmVha1wiO1NrLmFzdG5vZGVzLkJyZWFrLnByb3RvdHlwZS5fZmllbGRzPVtdO1NrLmFzdG5vZGVzLkNvbnRpbnVlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNvbnRpbnVlXCI7U2suYXN0bm9kZXMuQ29udGludWUucHJvdG90eXBlLl9maWVsZHM9XG5bXTtTay5hc3Rub2Rlcy5QcmludC5wcm90b3R5cGUuX2FzdG5hbWU9XCJQcmludFwiO1NrLmFzdG5vZGVzLlByaW50LnByb3RvdHlwZS5fZmllbGRzPVtcImRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZXN0fSxcInZhbHVlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlc30sXCJubFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5sfV07U2suYXN0bm9kZXMuRGVidWdnZXIucHJvdG90eXBlLl9hc3RuYW1lPVwiRGVidWdnZXJcIjtTay5hc3Rub2Rlcy5EZWJ1Z2dlci5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5Cb29sT3AucHJvdG90eXBlLl9hc3RuYW1lPVwiQm9vbE9wXCI7U2suYXN0bm9kZXMuQm9vbE9wLnByb3RvdHlwZS5fZmllbGRzPVtcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwidmFsdWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWVzfV07U2suYXN0bm9kZXMuQmluT3AucHJvdG90eXBlLl9hc3RuYW1lPVwiQmluT3BcIjtTay5hc3Rub2Rlcy5CaW5PcC5wcm90b3R5cGUuX2ZpZWxkcz1cbltcImxlZnRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sZWZ0fSxcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwicmlnaHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5yaWdodH1dO1NrLmFzdG5vZGVzLlVuYXJ5T3AucHJvdG90eXBlLl9hc3RuYW1lPVwiVW5hcnlPcFwiO1NrLmFzdG5vZGVzLlVuYXJ5T3AucHJvdG90eXBlLl9maWVsZHM9W1wib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJvcGVyYW5kXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3BlcmFuZH1dO1NrLmFzdG5vZGVzLkxhbWJkYS5wcm90b3R5cGUuX2FzdG5hbWU9XCJMYW1iZGFcIjtTay5hc3Rub2Rlcy5MYW1iZGEucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ3N9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5JZkV4cC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJZkV4cFwiO1NrLmFzdG5vZGVzLklmRXhwLnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixcbmZ1bmN0aW9uKGEpe3JldHVybiBhLnRlc3R9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwib3JlbHNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuRGljdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJEaWN0XCI7U2suYXN0bm9kZXMuRGljdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJrZXlzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5c30sXCJ2YWx1ZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZXN9XTtTay5hc3Rub2Rlcy5TZXQucHJvdG90eXBlLl9hc3RuYW1lPVwiU2V0XCI7U2suYXN0bm9kZXMuU2V0LnByb3RvdHlwZS5fZmllbGRzPVtcImVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHRzfV07U2suYXN0bm9kZXMuTGlzdENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiTGlzdENvbXBcIjtTay5hc3Rub2Rlcy5MaXN0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHR9LFwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtcblNrLmFzdG5vZGVzLlNldENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiU2V0Q29tcFwiO1NrLmFzdG5vZGVzLlNldENvbXAucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0fSxcImdlbmVyYXRvcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5nZW5lcmF0b3JzfV07U2suYXN0bm9kZXMuRGljdENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiRGljdENvbXBcIjtTay5hc3Rub2Rlcy5EaWN0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJrZXlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX0sXCJnZW5lcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2VuZXJhdG9yc31dO1NrLmFzdG5vZGVzLkdlbmVyYXRvckV4cC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHZW5lcmF0b3JFeHBcIjtTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHAucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0fSxcblwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtTay5hc3Rub2Rlcy5Bd2FpdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBd2FpdFwiO1NrLmFzdG5vZGVzLkF3YWl0LnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5ZaWVsZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJZaWVsZFwiO1NrLmFzdG5vZGVzLllpZWxkLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5ZaWVsZEZyb20ucHJvdG90eXBlLl9hc3RuYW1lPVwiWWllbGRGcm9tXCI7U2suYXN0bm9kZXMuWWllbGRGcm9tLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5Db21wYXJlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNvbXBhcmVcIjtTay5hc3Rub2Rlcy5Db21wYXJlLnByb3RvdHlwZS5fZmllbGRzPVxuW1wibGVmdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmxlZnR9LFwib3BzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3BzfSxcImNvbXBhcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29tcGFyYXRvcnN9XTtTay5hc3Rub2Rlcy5DYWxsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNhbGxcIjtTay5hc3Rub2Rlcy5DYWxsLnByb3RvdHlwZS5fZmllbGRzPVtcImZ1bmNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5mdW5jfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImtleXdvcmRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5d29yZHN9XTtTay5hc3Rub2Rlcy5OdW0ucHJvdG90eXBlLl9hc3RuYW1lPVwiTnVtXCI7U2suYXN0bm9kZXMuTnVtLnByb3RvdHlwZS5fZmllbGRzPVtcIm5cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ufV07U2suYXN0bm9kZXMuU3RyLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0clwiO1NrLmFzdG5vZGVzLlN0ci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc31dO1xuU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWUucHJvdG90eXBlLl9hc3RuYW1lPVwiRm9ybWF0dGVkVmFsdWVcIjtTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImNvbnZlcnNpb25cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jb252ZXJzaW9ufSxcImZvcm1hdF9zcGVjXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZm9ybWF0X3NwZWN9XTtTay5hc3Rub2Rlcy5Kb2luZWRTdHIucHJvdG90eXBlLl9hc3RuYW1lPVwiSm9pbmVkU3RyXCI7U2suYXN0bm9kZXMuSm9pbmVkU3RyLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlc31dO1NrLmFzdG5vZGVzLkJ5dGVzLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJ5dGVzXCI7U2suYXN0bm9kZXMuQnl0ZXMucHJvdG90eXBlLl9maWVsZHM9W1wic1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnN9XTtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQucHJvdG90eXBlLl9hc3RuYW1lPVxuXCJOYW1lQ29uc3RhbnRcIjtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkVsbGlwc2lzLnByb3RvdHlwZS5fYXN0bmFtZT1cIkVsbGlwc2lzXCI7U2suYXN0bm9kZXMuRWxsaXBzaXMucHJvdG90eXBlLl9maWVsZHM9W107U2suYXN0bm9kZXMuQ29uc3RhbnQucHJvdG90eXBlLl9hc3RuYW1lPVwiQ29uc3RhbnRcIjtTay5hc3Rub2Rlcy5Db25zdGFudC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQXR0cmlidXRlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkF0dHJpYnV0ZVwiO1NrLmFzdG5vZGVzLkF0dHJpYnV0ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImF0dHJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hdHRyfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1xuU2suYXN0bm9kZXMuU3Vic2NyaXB0LnByb3RvdHlwZS5fYXN0bmFtZT1cIlN1YnNjcmlwdFwiO1NrLmFzdG5vZGVzLlN1YnNjcmlwdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcInNsaWNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2xpY2V9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuU3RhcnJlZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJTdGFycmVkXCI7U2suYXN0bm9kZXMuU3RhcnJlZC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1NrLmFzdG5vZGVzLk5hbWUucHJvdG90eXBlLl9hc3RuYW1lPVwiTmFtZVwiO1NrLmFzdG5vZGVzLk5hbWUucHJvdG90eXBlLl9maWVsZHM9W1wiaWRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pZH0sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5MaXN0LnByb3RvdHlwZS5fYXN0bmFtZT1cblwiTGlzdFwiO1NrLmFzdG5vZGVzLkxpc3QucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmVsdHN9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuVHVwbGUucHJvdG90eXBlLl9hc3RuYW1lPVwiVHVwbGVcIjtTay5hc3Rub2Rlcy5UdXBsZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0c30sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5Mb2FkLnByb3RvdHlwZS5fYXN0bmFtZT1cIkxvYWRcIjtTay5hc3Rub2Rlcy5Mb2FkLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlN0b3JlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0b3JlXCI7U2suYXN0bm9kZXMuU3RvcmUucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuRGVsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkRlbFwiO1NrLmFzdG5vZGVzLkRlbC5wcm90b3R5cGUuX2lzZW51bT0hMDtcblNrLmFzdG5vZGVzLkF1Z0xvYWQucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnTG9hZFwiO1NrLmFzdG5vZGVzLkF1Z0xvYWQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQXVnU3RvcmUucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnU3RvcmVcIjtTay5hc3Rub2Rlcy5BdWdTdG9yZS5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5QYXJhbS5wcm90b3R5cGUuX2FzdG5hbWU9XCJQYXJhbVwiO1NrLmFzdG5vZGVzLlBhcmFtLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlNsaWNlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlNsaWNlXCI7U2suYXN0bm9kZXMuU2xpY2UucHJvdG90eXBlLl9maWVsZHM9W1wibG93ZXJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sb3dlcn0sXCJ1cHBlclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnVwcGVyfSxcInN0ZXBcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zdGVwfV07U2suYXN0bm9kZXMuRXh0U2xpY2UucHJvdG90eXBlLl9hc3RuYW1lPVwiRXh0U2xpY2VcIjtcblNrLmFzdG5vZGVzLkV4dFNsaWNlLnByb3RvdHlwZS5fZmllbGRzPVtcImRpbXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kaW1zfV07U2suYXN0bm9kZXMuSW5kZXgucHJvdG90eXBlLl9hc3RuYW1lPVwiSW5kZXhcIjtTay5hc3Rub2Rlcy5JbmRleC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQW5kLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFuZFwiO1NrLmFzdG5vZGVzLkFuZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Pci5wcm90b3R5cGUuX2FzdG5hbWU9XCJPclwiO1NrLmFzdG5vZGVzLk9yLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkFkZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBZGRcIjtTay5hc3Rub2Rlcy5BZGQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuU3ViLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN1YlwiO1NrLmFzdG5vZGVzLlN1Yi5wcm90b3R5cGUuX2lzZW51bT0hMDtcblNrLmFzdG5vZGVzLk11bHQucHJvdG90eXBlLl9hc3RuYW1lPVwiTXVsdFwiO1NrLmFzdG5vZGVzLk11bHQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTWF0TXVsdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNYXRNdWx0XCI7U2suYXN0bm9kZXMuTWF0TXVsdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5EaXYucHJvdG90eXBlLl9hc3RuYW1lPVwiRGl2XCI7U2suYXN0bm9kZXMuRGl2LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk1vZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNb2RcIjtTay5hc3Rub2Rlcy5Nb2QucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuUG93LnByb3RvdHlwZS5fYXN0bmFtZT1cIlBvd1wiO1NrLmFzdG5vZGVzLlBvdy5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MU2hpZnQucHJvdG90eXBlLl9hc3RuYW1lPVwiTFNoaWZ0XCI7U2suYXN0bm9kZXMuTFNoaWZ0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlJTaGlmdC5wcm90b3R5cGUuX2FzdG5hbWU9XG5cIlJTaGlmdFwiO1NrLmFzdG5vZGVzLlJTaGlmdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5CaXRPci5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaXRPclwiO1NrLmFzdG5vZGVzLkJpdE9yLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkJpdFhvci5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaXRYb3JcIjtTay5hc3Rub2Rlcy5CaXRYb3IucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQml0QW5kLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJpdEFuZFwiO1NrLmFzdG5vZGVzLkJpdEFuZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5GbG9vckRpdi5wcm90b3R5cGUuX2FzdG5hbWU9XCJGbG9vckRpdlwiO1NrLmFzdG5vZGVzLkZsb29yRGl2LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkludmVydC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbnZlcnRcIjtTay5hc3Rub2Rlcy5JbnZlcnQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTm90LnByb3RvdHlwZS5fYXN0bmFtZT1cblwiTm90XCI7U2suYXN0bm9kZXMuTm90LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlVBZGQucHJvdG90eXBlLl9hc3RuYW1lPVwiVUFkZFwiO1NrLmFzdG5vZGVzLlVBZGQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuVVN1Yi5wcm90b3R5cGUuX2FzdG5hbWU9XCJVU3ViXCI7U2suYXN0bm9kZXMuVVN1Yi5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5FcS5wcm90b3R5cGUuX2FzdG5hbWU9XCJFcVwiO1NrLmFzdG5vZGVzLkVxLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk5vdEVxLnByb3RvdHlwZS5fYXN0bmFtZT1cIk5vdEVxXCI7U2suYXN0bm9kZXMuTm90RXEucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTHQucHJvdG90eXBlLl9hc3RuYW1lPVwiTHRcIjtTay5hc3Rub2Rlcy5MdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MdEUucHJvdG90eXBlLl9hc3RuYW1lPVwiTHRFXCI7U2suYXN0bm9kZXMuTHRFLnByb3RvdHlwZS5faXNlbnVtPVxuITA7U2suYXN0bm9kZXMuR3QucHJvdG90eXBlLl9hc3RuYW1lPVwiR3RcIjtTay5hc3Rub2Rlcy5HdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5HdEUucHJvdG90eXBlLl9hc3RuYW1lPVwiR3RFXCI7U2suYXN0bm9kZXMuR3RFLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLklzLnByb3RvdHlwZS5fYXN0bmFtZT1cIklzXCI7U2suYXN0bm9kZXMuSXMucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuSXNOb3QucHJvdG90eXBlLl9hc3RuYW1lPVwiSXNOb3RcIjtTay5hc3Rub2Rlcy5Jc05vdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Jbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJJblwiO1NrLmFzdG5vZGVzLkluLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk5vdEluLnByb3RvdHlwZS5fYXN0bmFtZT1cIk5vdEluXCI7U2suYXN0bm9kZXMuTm90SW4ucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbi5wcm90b3R5cGUuX2FzdG5hbWU9XG5cImNvbXByZWhlbnNpb25cIjtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJpZnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pZnN9LFwiaXNfYXN5bmNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pc19hc3luY31dO1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIucHJvdG90eXBlLl9hc3RuYW1lPVwiRXhjZXB0SGFuZGxlclwiO1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIucHJvdG90eXBlLl9maWVsZHM9W1widHlwZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGV9LFwibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5hcmd1bWVudHNfLnByb3RvdHlwZS5fYXN0bmFtZT1cImFyZ3VtZW50c1wiO1NrLmFzdG5vZGVzLmFyZ3VtZW50c18ucHJvdG90eXBlLl9maWVsZHM9XG5bXCJhcmdzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnc30sXCJ2YXJhcmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YXJhcmd9LFwia3dvbmx5YXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3b25seWFyZ3N9LFwia3dfZGVmYXVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rd19kZWZhdWx0c30sXCJrd2FyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3YXJnfSxcImRlZmF1bHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVmYXVsdHN9XTtTay5hc3Rub2Rlcy5hcmcucHJvdG90eXBlLl9hc3RuYW1lPVwiYXJnXCI7U2suYXN0bm9kZXMuYXJnLnByb3RvdHlwZS5fZmllbGRzPVtcImFyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ30sXCJhbm5vdGF0aW9uXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYW5ub3RhdGlvbn1dO1NrLmFzdG5vZGVzLmtleXdvcmQucHJvdG90eXBlLl9hc3RuYW1lPVwia2V5d29yZFwiO1NrLmFzdG5vZGVzLmtleXdvcmQucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnfSxcblwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLmFsaWFzLnByb3RvdHlwZS5fYXN0bmFtZT1cImFsaWFzXCI7U2suYXN0bm9kZXMuYWxpYXMucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYXNuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXNuYW1lfV07U2suYXN0bm9kZXMud2l0aGl0ZW0ucHJvdG90eXBlLl9hc3RuYW1lPVwid2l0aGl0ZW1cIjtTay5hc3Rub2Rlcy53aXRoaXRlbS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJjb250ZXh0X2V4cHJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jb250ZXh0X2V4cHJ9LFwib3B0aW9uYWxfdmFyc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9wdGlvbmFsX3ZhcnN9XTtTay5leHBvcnRTeW1ib2woXCJTay5hc3Rub2Rlc1wiLFNrLmFzdG5vZGVzKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjKXt0aGlzLmNfZW5jb2Rpbmc9YTt0aGlzLmNfZmlsZW5hbWU9Yjt0aGlzLmNfZmxhZ3M9XG5jfHwwfWZ1bmN0aW9uIGMoYSl7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YSxcIm5vZGUgbXVzdCBiZSBkZWZpbmVkXCIpO3JldHVybiBudWxsPT09YS5jaGlsZHJlbj8wOmEuY2hpbGRyZW4ubGVuZ3RofWZ1bmN0aW9uIGIoYSxiKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwibm9kZSBtdXN0IGJlIGRlZmluZWRcIik7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YixcImluZGV4IG9mIGNoaWxkIG11c3QgYmUgc3BlY2lmaWVkXCIpO3JldHVybiBhLmNoaWxkcmVuW2JdfWZ1bmN0aW9uIGUoYSxiKXtTay5hc3NlcnRzLmFzc2VydChhLnR5cGU9PT1iLFwibm9kZSB3YXNuJ3QgZXhwZWN0ZWQgdHlwZVwiKX1mdW5jdGlvbiBmKGEsYixjKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLGEuY19maWxlbmFtZSxiLmxpbmVubyk7fWZ1bmN0aW9uIGwoYSl7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBhLFwiZXhwZWN0aW5nIHN0cmluZywgZ290IFwiK3R5cGVvZiBhKTtcbnJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9ZnVuY3Rpb24gaChhKXt2YXIgZCxlO3N3aXRjaChhLnR5cGUpe2Nhc2Ugci5zaW5nbGVfaW5wdXQ6aWYoYihhLDApLnR5cGU9PT16LlRfTkVXTElORSlicmVhaztlbHNlIHJldHVybiBoKGIoYSwwKSk7Y2FzZSByLmZpbGVfaW5wdXQ6Zm9yKGQ9ZT0wO2Q8YyhhKTsrK2Qpe3ZhciBmPWIoYSxkKTtmLnR5cGU9PT1yLnN0bXQmJihlKz1oKGYpKX1yZXR1cm4gZTtjYXNlIHIuc3RtdDpyZXR1cm4gaChiKGEsMCkpO2Nhc2Ugci5jb21wb3VuZF9zdG10OnJldHVybiAxO2Nhc2Ugci5zaW1wbGVfc3RtdDpyZXR1cm4gTWF0aC5mbG9vcihjKGEpLzIpO2Nhc2Ugci5zdWl0ZTppZigxPT09YyhhKSlyZXR1cm4gaChiKGEsMCkpO2U9MDtmb3IoZD0yO2Q8YyhhKS0xOysrZCllKz1oKGIoYSxkKSk7cmV0dXJuIGU7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJOb24tc3RhdGVtZW50IGZvdW5kXCIpfXJldHVybiAwfWZ1bmN0aW9uIGQoYSxiLGMsZCl7YyBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0ciYmKGM9Yy52KTtpZihcIk5vbmVcIj09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIE5vbmVcIixhLmNfZmlsZW5hbWUsZCk7aWYoXCJUcnVlXCI9PT1jfHxcIkZhbHNlXCI9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXNzaWdubWVudCB0byBUcnVlIG9yIEZhbHNlIGlzIGZvcmJpZGRlblwiLGEuY19maWxlbmFtZSxkKTt9ZnVuY3Rpb24gZyhhLGIsYyxlKXt2YXIgZjtTay5hc3NlcnRzLmFzc2VydChjIT09U2suYXN0bm9kZXMuQXVnU3RvcmUmJmMhPT1Tay5hc3Rub2Rlcy5BdWdMb2FkLFwiY29udGV4dCBub3QgQXVnU3RvcmUgb3IgQXVnTG9hZFwiKTt2YXIgaD1mPW51bGw7c3dpdGNoKGIuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOmNhc2UgU2suYXN0bm9kZXMuTmFtZTpjPT09U2suYXN0bm9kZXMuU3RvcmUmJmQoYSxlLGIuYXR0cixlLmxpbmVubyk7Yi5jdHg9YzticmVhaztcbmNhc2UgU2suYXN0bm9kZXMuU3RhcnJlZDpiLmN0eD1jO2coYSxiLnZhbHVlLGMsZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6Yi5jdHg9YzticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3Q6Yi5jdHg9YztmPWIuZWx0czticmVhaztjYXNlIFNrLmFzdG5vZGVzLlR1cGxlOmlmKDA9PT1iLmVsdHMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgYXNzaWduIHRvICgpXCIsYS5jX2ZpbGVuYW1lLGUubGluZW5vKTtiLmN0eD1jO2Y9Yi5lbHRzO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGFtYmRhOmg9XCJsYW1iZGFcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNhbGw6aD1cImZ1bmN0aW9uIGNhbGxcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDpjYXNlIFNrLmFzdG5vZGVzLkJpbk9wOmNhc2UgU2suYXN0bm9kZXMuVW5hcnlPcDpoPVwib3BlcmF0b3JcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDpoPVwiZ2VuZXJhdG9yIGV4cHJlc3Npb25cIjtcbmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6aD1cInlpZWxkIGV4cHJlc3Npb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOmg9XCJsaXN0IGNvbXByZWhlbnNpb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLlNldENvbXA6aD1cInNldCBjb21wcmVoZW5zaW9uXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0Q29tcDpoPVwiZGljdCBjb21wcmVoZW5zaW9uXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0OmNhc2UgU2suYXN0bm9kZXMuU2V0OmNhc2UgU2suYXN0bm9kZXMuTnVtOmNhc2UgU2suYXN0bm9kZXMuU3RyOmg9XCJsaXRlcmFsXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6aD1cIlRydWUsIEZhbHNlIG9yIE5vbmVcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNvbXBhcmU6aD1cImNvbXBhcmlzb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLlJlcHI6aD1cInJlcHJcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmRXhwOmg9XCJjb25kaXRpb25hbCBleHByZXNzaW9uXCI7XG5icmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBleHByZXNzaW9uIGluIGFzc2lnbm1lbnRcIil9aWYoaCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImNhbid0IFwiKyhjPT09U2suYXN0bm9kZXMuU3RvcmU/XCJhc3NpZ24gdG9cIjpcImRlbGV0ZVwiKStcIiBcIitoLGEuY19maWxlbmFtZSxlLmxpbmVubyk7aWYoZilmb3IoYj0wO2I8Zi5sZW5ndGg7KytiKWcoYSxmW2JdLGMsZSl9ZnVuY3Rpb24gbihhKXtpZih2b2lkIDA9PT1PW2EudHlwZV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIHN5bnRheFwiLGEudHlwZSxhLmxpbmVubyk7cmV0dXJuIE9bYS50eXBlXX1mdW5jdGlvbiBrKGEsYil7cmV0dXJuIGEudmFsdWU/bmV3IFNrLmJ1aWx0aW4uc3RyKGEudmFsdWUpOm5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBwKGEsZCl7ZShkLHIuY29tcF9vcCk7aWYoMT09PWMoZCkpc3dpdGNoKGQ9YihkLDApLGQudHlwZSl7Y2FzZSB6LlRfTEVTUzpyZXR1cm4gU2suYXN0bm9kZXMuTHQ7XG5jYXNlIHouVF9HUkVBVEVSOnJldHVybiBTay5hc3Rub2Rlcy5HdDtjYXNlIHouVF9FUUVRVUFMOnJldHVybiBTay5hc3Rub2Rlcy5FcTtjYXNlIHouVF9MRVNTRVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLkx0RTtjYXNlIHouVF9HUkVBVEVSRVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLkd0RTtjYXNlIHouVF9OT1RFUVVBTDpyZXR1cm4gU2suYXN0bm9kZXMuTm90RXE7Y2FzZSB6LlRfTkFNRTppZihcImluXCI9PT1kLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5JbjtpZihcImlzXCI9PT1kLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5Jc31lbHNlIGlmKDI9PT1jKGQpJiZiKGQsMCkudHlwZT09PXouVF9OQU1FKXtpZihcImluXCI9PT1iKGQsMSkudmFsdWUpcmV0dXJuIFNrLmFzdG5vZGVzLk5vdEluO2lmKFwiaXNcIj09PWIoZCwwKS52YWx1ZSlyZXR1cm4gU2suYXN0bm9kZXMuSXNOb3R9U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBjb21wX29wXCIpfWZ1bmN0aW9uIHUoYSxiKXthJiYoYS5saW5lbm89XG5iLmxpbmVubyxhLmNvbF9vZmZzZXQ9Yi5jb2xfb2Zmc2V0LGEuZW5kX2xpbmVubz1iLmVuZF9saW5lbm8sYS5lbmRfY29sX29mZnNldD1iLmVuZF9jb2xfb2Zmc2V0KTtyZXR1cm4gYX1mdW5jdGlvbiBBKGEsZCl7dmFyIGUsZj1bXTtTay5hc3NlcnRzLmFzc2VydChkLnR5cGU9PT1yLnRlc3RsaXN0fHxkLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcnx8ZC50eXBlPT09ci5saXN0bWFrZXJ8fGQudHlwZT09PXIudGVzdGxpc3RfY29tcHx8ZC50eXBlPT09ci50ZXN0bGlzdF9zYWZlfHxkLnR5cGU9PT1yLnRlc3RsaXN0MSxcIm5vZGUgdHlwZSBtdXN0IGJlIGxpc3RsaWtlXCIpO2ZvcihlPTA7ZTxjKGQpO2UrPTIpU2suYXNzZXJ0cy5hc3NlcnQoYihkLGUpLnR5cGU9PT1yLnRlc3R8fGIoZCxlKS50eXBlPT09ci5vbGRfdGVzdHx8YihkLGUpLnR5cGU9PT1yLnN0YXJfZXhwciksZltlLzJdPXcoYSxiKGQsZSkpO3JldHVybiBmfWZ1bmN0aW9uIHQoYSxkKXt2YXIgZjtlKGQsci5zdWl0ZSk7XG52YXIgZz1bXTt2YXIgaz0wO2lmKGIoZCwwKS50eXBlPT09ci5zaW1wbGVfc3RtdCl7ZD1iKGQsMCk7dmFyIHg9YyhkKS0xO2IoZCx4LTEpLnR5cGU9PT16LlRfU0VNSSYmLS14O2ZvcihmPTA7Zjx4O2YrPTIpZ1trKytdPU4oYSxiKGQsZikpfWVsc2UgZm9yKGY9MjtmPGMoZCktMTsrK2Ype3g9YihkLGYpO2UoeCxyLnN0bXQpO3ZhciBuPWgoeCk7aWYoMT09PW4pZ1trKytdPU4oYSx4KTtlbHNlIGZvcih4PWIoeCwwKSxlKHgsci5zaW1wbGVfc3RtdCksbj0wO248Yyh4KTtuKz0yKXtpZigwPT09YyhiKHgsbikpKXtTay5hc3NlcnRzLmFzc2VydChuKzE9PT1jKHgpKTticmVha31nW2srK109TihhLGIoeCxuKSl9fVNrLmFzc2VydHMuYXNzZXJ0KGs9PT1oKGQpKTtyZXR1cm4gZ31mdW5jdGlvbiB2KGEsZCxmKXt2YXIgaDtlKGQsci5leHBybGlzdCk7dmFyIGs9W107Zm9yKGg9MDtoPGMoZCk7aCs9Mil7dmFyIHg9dyhhLGIoZCxoKSk7a1toLzJdPXg7ZiYmZyhhLHgsZixiKGQsaCkpfXJldHVybiBrfVxuZnVuY3Rpb24gQihhLGQpe2E6Zm9yKDs7KXN3aXRjaChkLnR5cGUpe2Nhc2Ugci5pbXBvcnRfYXNfbmFtZTphPW51bGw7dmFyIGU9bChiKGQsMCkudmFsdWUpOzM9PT1jKGQpJiYoYT1iKGQsMikudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMoZSxudWxsPT1hP251bGw6bChhKSk7Y2FzZSByLmRvdHRlZF9hc19uYW1lOmlmKDE9PT1jKGQpKXtkPWIoZCwwKTtjb250aW51ZSBhfWVsc2UgcmV0dXJuIGE9QihhLGIoZCwwKSksU2suYXNzZXJ0cy5hc3NlcnQoIWEuYXNuYW1lKSxhLmFzbmFtZT1sKGIoZCwyKS52YWx1ZSksYTtjYXNlIHIuZG90dGVkX25hbWU6aWYoMT09PWMoZCkpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hbGlhcyhsKGIoZCwwKS52YWx1ZSksbnVsbCk7YT1cIlwiO2ZvcihlPTA7ZTxjKGQpO2UrPTIpYSs9YihkLGUpLnZhbHVlK1wiLlwiO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMobChhLnN1YnN0cigwLGEubGVuZ3RoLTEpKSxudWxsKTtjYXNlIHouVF9TVEFSOnJldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMobChcIipcIiksXG5udWxsKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwidW5leHBlY3RlZCBpbXBvcnQgbmFtZVwiLGEuY19maWxlbmFtZSxkLmxpbmVubyk7fX1mdW5jdGlvbiBEKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQoYi50eXBlPT1yLnRlc3RsaXN0X2NvbXB8fGIudHlwZT09ci5hcmd1bWVudCk7cmV0dXJuIGFhKGEsYiwwKX1mdW5jdGlvbiBFKGEsZCl7aWYoYihkLDApLnR5cGU9PT16LlRfTUlOVVMmJjI9PT1jKGQpKXt2YXIgZT1iKGQsMSk7aWYoZS50eXBlPT09ci5mYWN0b3ImJjE9PT1jKGUpJiYoZT1iKGUsMCksZS50eXBlPT09ci5wb3dlciYmMT09PWMoZSkpKXt2YXIgZj1iKGUsMCk7aWYoZi50eXBlPT09ci5hdG9tJiYoZT1iKGYsMCksZS50eXBlPT09ei5UX05VTUJFUikpcmV0dXJuIGUudmFsdWU9XCItXCIrZS52YWx1ZSxSKGEsZil9fWE9dyhhLGIoZCwxKSk7c3dpdGNoKGIoZCwwKS50eXBlKXtjYXNlIHouVF9QTFVTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5VQWRkLFxuYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX01JTlVTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5VU3ViLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHouVF9USUxERTpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlVuYXJ5T3AoU2suYXN0bm9kZXMuSW52ZXJ0LGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1Tay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgZmFjdG9yXCIpfWZ1bmN0aW9uIEYoYSxnLGgsayl7dmFyIHgsbixsO2UoZyxyLmFyZ2xpc3QpO2Zvcih4PWw9bj0wO3g8YyhnKTt4Kyspe3ZhciBwPWIoZyx4KTtwLnR5cGU9PXIuYXJndW1lbnQmJigxPT1jKHApP24rKzpiKHAsMSkudHlwZT09ci5jb21wX2Zvcj8obisrLGt8fGYoYSxwLFwiaW52YWxpZCBzeW50YXhcIiksMTxjKGcpJiZmKGEscCxcIkdlbmVyYXRvciBleHByZXNzaW9uIG11c3QgYmUgcGFyZW50aGVzaXplZFwiKSk6YihwLDApLnR5cGU9PXouVF9TVEFSP24rKzpsKyspfXZhciBTPVxuW107dmFyIG09W107Zm9yKHg9az1sPW49MDt4PGMoZyk7eCsrKWlmKHA9YihnLHgpLHAudHlwZT09ci5hcmd1bWVudCl7dmFyIEo9YihwLDApO2lmKDE9PWMocCkpe2wmJihrP2YoYSxKLFwicG9zaXRpb25hbCBhcmd1bWVudCBmb2xsb3dzIGtleXdvcmQgYXJndW1lbnQgdW5wYWNraW5nXCIpOmYoYSxKLFwicG9zaXRpb25hbCBhcmd1bWVudCBmb2xsb3dzIGtleXdvcmQgYXJndW1lbnRcIikpO3ZhciBLPXcoYSxKKTtpZighSylyZXR1cm4gbnVsbDtTW24rK109S31lbHNlIGlmKEoudHlwZT09ei5UX1NUQVIpe2lmKGspcmV0dXJuIGYoYSxKLFwiaXRlcmFibGUgYXJndW1lbnQgdW5wYWNraW5nIGZvbGxvd3Mga2V5d29yZCBhcmd1bWVudCB1bnBhY2tpbmdcIiksbnVsbDtLPXcoYSxiKHAsMSkpO2lmKCFLKXJldHVybiBudWxsO3A9bmV3IFNrLmFzdG5vZGVzLlN0YXJyZWQoSyxTay5hc3Rub2Rlcy5Mb2FkLEoubGluZW5vLEouY29sX29mZnNldCk7U1tuKytdPXB9ZWxzZSBpZihKLnR5cGU9PXouVF9ET1VCTEVTVEFSKXt4Kys7XG5LPXcoYSxiKHAsMSkpO2lmKCFLKXJldHVybiBudWxsO3A9bmV3IFNrLmFzdG5vZGVzLmtleXdvcmQobnVsbCxLKTttW2wrK109cDtrKyt9ZWxzZSBpZihiKHAsMSkudHlwZT09ci5jb21wX2Zvcil7Sz1EKGEscCk7aWYoIUspcmV0dXJuIG51bGw7U1tuKytdPUt9ZWxzZXt2YXIgdTtLPXcoYSxKKTtpZighSylyZXR1cm4gbnVsbDtpZihLLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuTGFtYmRhKXJldHVybiBmKGEsSixcImxhbWJkYSBjYW5ub3QgY29udGFpbiBhc3NpZ25tZW50XCIpLG51bGw7aWYoSy5jb25zdHJ1Y3RvciE9PVNrLmFzdG5vZGVzLk5hbWUpcmV0dXJuIGYoYSxKLFwia2V5d29yZCBjYW4ndCBiZSBhbiBleHByZXNzaW9uXCIpLG51bGw7aWYoZChhLEsuaWQscCwxKSlyZXR1cm4gbnVsbDt2YXIgQT1LLmlkO2Zvcih1PTA7dTxsO3UrKylpZigoSz1tW3VdLmFyZykmJks9PT1BKXJldHVybiBmKGEsSixcImtleXdvcmQgYXJndW1lbnQgcmVwZWF0ZWRcIiksbnVsbDtLPXcoYSxiKHAsXG4yKSk7aWYoIUspcmV0dXJuIG51bGw7cD1uZXcgU2suYXN0bm9kZXMua2V5d29yZChBLEspO21bbCsrXT1wfX1yZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNhbGwoaCxTLG0saC5saW5lbm8saC5jb2xfb2Zmc2V0KX1mdW5jdGlvbiBNKGEsZCxmKXtlKGQsci50cmFpbGVyKTtpZihiKGQsMCkudHlwZT09ei5UX0xQQVIpcmV0dXJuIDI9PWMoZCk/bmV3IFNrLmFzdG5vZGVzLkNhbGwoZixudWxsLG51bGwsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpGKGEsYihkLDEpLGYsITApO2lmKGIoZCwwKS50eXBlPT16LlRfRE9UKXt2YXIgZz1rKGIoZCwxKSk7cmV0dXJuIGc/bmV3IFNrLmFzdG5vZGVzLkF0dHJpYnV0ZShmLGcsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOm51bGx9ZShiKGQsMCksei5UX0xTUUIpO2UoYihkLDIpLHouVF9SU1FCKTtkPWIoZCwxKTtpZigxPT1jKGQpKXJldHVybihnPUkoYSxiKGQsMCkpKT9uZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsZyxcblNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpudWxsO3ZhciBoLG49MSx4PVtdO2ZvcihoPTA7aDxjKGQpO2grPTIpe2c9SShhLGIoZCxoKSk7aWYoIWcpcmV0dXJuIG51bGw7Zy5raW5kIT1aLkluZGV4X2tpbmQmJihuPTApO3hbaC8yXT1nfWlmKCFuKXJldHVybiBuZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsbmV3IFNrLmFzdG5vZGVzLkV4dFNsaWNlKHgpLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTthPVtdO2ZvcihoPTA7aDx4Lmxlbmd0aDsrK2gpZz14W2hdLFNrLmFzc2VydHMuYXNzZXJ0KGcua2luZD09Wi5JbmRleF9raW5kJiZnLnYuSW5kZXgudmFsdWUpLGFbaF09Zy52LkluZGV4LnZhbHVlO2c9bmV3IFNrLmFzdG5vZGVzLlR1cGxlKGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsbmV3IFNrLmFzdG5vZGVzLkluZGV4KGcpLFNrLmFzdG5vZGVzLkxvYWQsXG5kLmxpbmVubyxkLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIFYoYSxkKXtlKGQsci5mbG93X3N0bXQpO3ZhciBnPWIoZCwwKTtzd2l0Y2goZy50eXBlKXtjYXNlIHIuYnJlYWtfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkJyZWFrKGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7Y2FzZSByLmNvbnRpbnVlX3N0bXQ6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Db250aW51ZShkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO2Nhc2Ugci55aWVsZF9zdG10OnJldHVybihhPXcoYSxiKGcsMCkpKT9uZXcgU2suYXN0bm9kZXMuRXhwcihhLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6bnVsbDtjYXNlIHIucmV0dXJuX3N0bXQ6aWYoMT09YyhnKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlJldHVybihudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sXG5kLmVuZF9jb2xfb2Zmc2V0KTt2YXIgaD1XKGEsYihnLDEpKTtyZXR1cm4gaD9uZXcgU2suYXN0bm9kZXMuUmV0dXJuKGgsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpudWxsO2Nhc2Ugci5yYWlzZV9zdG10OmlmKDE9PWMoZykpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5SYWlzZShudWxsLG51bGwsbnVsbCxudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7aWYoMjw9YyhnKSl7dmFyIGs9bnVsbDtoPXcoYSxiKGcsMSkpO3ZhciBuPW51bGwseD1udWxsOzQ9PWMoZykmJlwiZnJvbVwiPT1iKGcsMikudmFsdWU/KFNrLl9fZnV0dXJlX18ucHl0aG9uM3x8ZihhLGIoZywyKSxcInJhaXNlIC4uLiBmcm9tIC4uLiBpcyBub3QgYXZhaWxhYmxlIGluIFB5dGhvbiAyXCIpLGs9dyhhLGIoZywzKSkpOjQ8PWMoZykmJlwiLFwiPT1iKGcsMikudmFsdWUmJihTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJmYoYSxcbmQsXCJPbGQgcmFpc2Ugc3ludGF4IGlzIG5vdCBhdmFpbGFibGUgaW4gUHl0aG9uIDNcIiksbj13KGEsYihnLDMpKSw2PT1jKGcpJiYoeD13KGEsYihnLDUpKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuUmFpc2UoaCxrLG4seCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpfWRlZmF1bHQ6cmV0dXJuIFNrLmFzc2VydHMuZmFpbChcInVuZXhwZWN0ZWQgZmxvd19zdG10OiBcIixnLnR5cGUpLG51bGx9fWZ1bmN0aW9uIHkoYSxlKXt2YXIgZj1udWxsO1NrLmFzc2VydHMuYXNzZXJ0KGUudHlwZT09PXIudGZwZGVmfHxlLnR5cGU9PT1yLnZmcGRlZik7dmFyIGc9YihlLDApO2QoYSxnLGcudmFsdWUsZy5saW5lbm8pO2c9bChnLnZhbHVlKTszPT1jKGUpJiZiKGUsMSkudHlwZT09PXouVF9DT0xPTiYmKGY9dyhhLGIoZSwyKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYXJnKGcsZixlLmxpbmVubyxlLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIEcoYSxcbmUsZyxoLGspe3ZhciBuPWcseD0wO2h8fGYoYSxiKGUsZyksXCJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqXCIpO2ZvcihTay5hc3NlcnRzLmFzc2VydChrKTtuPGMoZSk7KXt2YXIgcD1iKGUsbik7c3dpdGNoKHAudHlwZSl7Y2FzZSByLnZmcGRlZjpjYXNlIHIudGZwZGVmOm4rMTxjKGUpJiZiKGUsbisxKS50eXBlPT16LlRfRVFVQUw/KGtbeF09dyhhLGIoZSxuKzIpKSxuKz0yKTprW3hdPW51bGw7dmFyIG09Mz09YyhwKT93KGEsYihwLDIpKTpudWxsO3A9YihwLDApO2QoYSxwLHAudmFsdWUscC5saW5lbm8pO2c9bChwLnZhbHVlKTtoW3grK109bmV3IFNrLmFzdG5vZGVzLmFyZyhnLG0scC5saW5lbm8scC5jb2xfb2Zmc2V0KTtuKz0yO2JyZWFrO2Nhc2Ugei5UX0RPVUJMRVNUQVI6cmV0dXJuIG47ZGVmYXVsdDpmKGEscCxcInVuZXhwZWN0ZWQgbm9kZVwiKX19cmV0dXJuIG59ZnVuY3Rpb24gTChhLGQpe3ZhciBlLGYsZyxoPVtdLGs9W10sbj1bXSx4PVtdLGw9bnVsbCxcbnA9bnVsbDtpZihkLnR5cGU9PT1yLnBhcmFtZXRlcnMpe2lmKDI9PT1jKGQpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuYXJndW1lbnRzXyhbXSxudWxsLFtdLFtdLG51bGwsW10pO2Q9YihkLDEpfVNrLmFzc2VydHMuYXNzZXJ0KGQudHlwZT09PXIudmFyYXJnc2xpc3R8fGQudHlwZT09PXIudHlwZWRhcmdzbGlzdCk7Zm9yKGU9Zj1nPTA7ZzxjKGQpOyl7dmFyIG09YihkLGcpO3N3aXRjaChtLnR5cGUpe2Nhc2Ugci50ZnBkZWY6Y2FzZSByLnZmcGRlZjppZihnKzE8YyhkKSYmYihkLGcrMSkudHlwZT09ei5UX0VRVUFMKXtrW2YrK109dyhhLGIoZCxnKzIpKTtnKz0yO3ZhciBKPTF9ZWxzZSBpZihKKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibm9uLWRlZmF1bHQgYXJndW1lbnQgZm9sbG93cyBkZWZhdWx0IGFyZ3VtZW50XCIsYS5jX2ZpbGVuYW1lLGQubGluZW5vKTtoW2UrK109eShhLG0pO2crPTI7YnJlYWs7Y2FzZSB6LlRfU1RBUjppZihnKzE+PWMoZCl8fGcrMj09XG5jKGQpJiZiKGQsZysxKS50eXBlPT16LlRfQ09NTUEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqXCIsYS5jX2ZpbGVuYW1lLGQubGluZW5vKTttPWIoZCxnKzEpO20udHlwZT09ei5UX0NPTU1BPyhnKz0yLGc9RyhhLGQsZyxuLHgpKToobD15KGEsbSksZys9MyxnPGMoZCkmJihiKGQsZykudHlwZT09ci50ZnBkZWZ8fGIoZCxnKS50eXBlPT1yLnZmcGRlZikmJihnPUcoYSxkLGcsbix4KSkpO2JyZWFrO2Nhc2Ugei5UX0RPVUJMRVNUQVI6bT1iKGQsZysxKTtTay5hc3NlcnRzLmFzc2VydChtLnR5cGU9PXIudGZwZGVmfHxtLnR5cGU9PXIudmZwZGVmKTtwPXkoYSxtKTtnKz0zO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCBub2RlIGluIHZhcmFyZ3NsaXN0XCIpO3JldHVybn19cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hcmd1bWVudHNfKGgsbCxuLHgscCxrKX1mdW5jdGlvbiBUKGEsXG5nLGgsbil7dmFyIHg9bj9iKGcsMSk6ZyxsPW51bGwscD0xLG09bnVsbDtpZihuJiY1PmEuY19mZWF0dXJlX3ZlcnNpb24pcmV0dXJuIGYoYSx4LFwiQXN5bmMgZnVuY3Rpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBQeXRob24gMy41IGFuZCBncmVhdGVyXCIpLG51bGw7ZSh4LHIuZnVuY2RlZik7dmFyIFM9ayhiKHgscCkpO2lmKGQoYSxTLGIoeCxwKSwwKSlyZXR1cm4gbnVsbDt2YXIgSj1MKGEsYih4LHArMSkpO2lmKCFKKXJldHVybiBudWxsO2lmKGIoeCxwKzIpLnR5cGU9PXouVF9SQVJST1cpe2w9dyhhLGIoeCxwKzMpKTtpZighbClyZXR1cm4gbnVsbDtwKz0yfWlmKGIoeCxwKzMpLnR5cGU9PXouVF9UWVBFX0NPTU1FTlQpe209ei5UX05FV19UWVBFX0NPTU1FTlQoYih4LHArMykpO2lmKCFtKXJldHVybiBudWxsO3ArPTF9dmFyIEs9dChhLGIoeCxwKzMpKTtpZighSylyZXR1cm4gbnVsbDtpZigxPGMoYih4LHArMykpJiYocD1iKGIoeCxwKzMpLDEpLHAudHlwZT09ei5UX1RZUEVfQ09NTUVOVCkpe2lmKG51bGwhPVxubSlyZXR1cm4gZihhLHgsXCJDYW5ub3QgaGF2ZSB0d28gdHlwZSBjb21tZW50cyBvbiBkZWZcIiksbnVsbDttPXouVF9ORVdfVFlQRV9DT01NRU5UKHApO2lmKCFtKXJldHVybiBudWxsfXJldHVybiBuP25ldyBTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmKFMsSixLLGgsbCxtLGcubGluZW5vLGcuY29sX29mZnNldCx2b2lkIDAsdm9pZCAwKTpuZXcgU2suYXN0bm9kZXMuRnVuY3Rpb25EZWYoUyxKLEssaCxsLG0seC5saW5lbm8seC5jb2xfb2Zmc2V0LHZvaWQgMCx2b2lkIDApfWZ1bmN0aW9uIFAoYSxmLGcpe2UoZixyLmNsYXNzZGVmKTtpZig0PT1jKGYpKXt2YXIgaD10KGEsYihmLDMpKTt2YXIgbj1rKGIoZiwxKS52YWx1ZSk7ZChhLGIoZiwzKSxuLGYubGluZW5vKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNsYXNzRGVmKG4sW10sW10saCxnLG51bGwsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KX1pZihiKGYsMykudHlwZT09PXouVF9SUEFSKXJldHVybiBoPXQoYSxiKGYsNSkpLG49XG5rKGIoZiwxKS52YWx1ZSksZChhLGIoZiwzKSxuLGIoZiwzKS5saW5lbm8pLG5ldyBTay5hc3Rub2Rlcy5DbGFzc0RlZihuLFtdLFtdLGgsZyxudWxsLGYubGluZW5vLGYuY29sX29mZnNldCk7bj1rKGIoZiwxKSk7bj1uZXcgU2suYXN0bm9kZXMuTmFtZShuLFNrLmFzdG5vZGVzLkxvYWQsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTt2YXIgbD1GKGEsYihmLDMpLG4sITEpO2g9dChhLGIoZiw2KSk7bj1rKGIoZiwxKS52YWx1ZSk7ZChhLGIoZiwxKSxuLGIoZiwxKS5saW5lbm8pO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQ2xhc3NEZWYobixsLmFyZ3MsbC5rZXl3b3JkcyxoLGcsbnVsbCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIFEoYSxkKXtmdW5jdGlvbiBmKGEsZCl7Zm9yKGE9MDs7KXtlKGQsci5jb21wX2l0ZXIpO2lmKGIoZCwwKS50eXBlPT09ci5jb21wX2ZvcilyZXR1cm4gYTtkPWIoZCwwKTtlKGQsci5jb21wX2lmKTthKys7aWYoMj09PWMoZCkpcmV0dXJuIGE7ZD1cbmIoZCwyKX19dmFyIGc7dmFyIGg9ZnVuY3Rpb24oYSxkKXthPTA7YTpmb3IoOzspe2ErKztlKGQsci5jb21wX2Zvcik7aWYoNT09PWMoZCkpZD1iKGQsNCk7ZWxzZSByZXR1cm4gYTtiOmZvcig7Oyl7ZShkLHIuY29tcF9pdGVyKTtkPWIoZCwwKTtpZihkLnR5cGU9PT1yLmNvbXBfZm9yKWNvbnRpbnVlIGE7ZWxzZSBpZihkLnR5cGU9PT1yLmNvbXBfaWYpaWYoMz09PWMoZCkpe2Q9YihkLDIpO2NvbnRpbnVlIGJ9ZWxzZSByZXR1cm4gYTticmVha31icmVha31Tay5hc3NlcnRzLmZhaWwoXCJsb2dpYyBlcnJvciBpbiBjb3VudENvbXBGb3JzXCIpfShhLGQpO3ZhciBrPVtdO2ZvcihnPTA7ZzxoOysrZyl7ZShkLHIuY29tcF9mb3IpO3ZhciBuPWIoZCwxKTt2YXIgbD12KGEsbixTay5hc3Rub2Rlcy5TdG9yZSk7dmFyIHA9dyhhLGIoZCwzKSk7dmFyIHg9MT09PWMobik/bmV3IFNrLmFzdG5vZGVzLmNvbXByZWhlbnNpb24obFswXSxwLFtdKTpuZXcgU2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbihuZXcgU2suYXN0bm9kZXMuVHVwbGUobCxcblNrLmFzdG5vZGVzLlN0b3JlLGQubGluZW5vLGQuY29sX29mZnNldCkscCxbXSk7aWYoNT09PWMoZCkpe2Q9YihkLDQpO3ZhciBtPWYoYSxkKTtuPVtdO2ZvcihsPTA7bDxtOysrbCllKGQsci5jb21wX2l0ZXIpLGQ9YihkLDApLGUoZCxyLmNvbXBfaWYpLHA9dyhhLGIoZCwxKSksbltsXT1wLDM9PT1jKGQpJiYoZD1iKGQsMikpO2QudHlwZT09PXIuY29tcF9pdGVyJiYoZD1iKGQsMCkpO3guaWZzPW59a1tnXT14fXJldHVybiBrfWZ1bmN0aW9uIFUoYSxkKXt2YXIgZj1bXTthOnt2YXIgZz1kO3ZhciBoPTA7Yjpmb3IoOzspe3ZhciBrPTA7aCsrO2UoZyxyLmNvbXBfZm9yKTtiKGcsMCkudHlwZT09ei5UX0FTWU5DJiYoaz0xKTtpZihjKGcpPT01K2spZz1iKGcsNCtrKTtlbHNlIGJyZWFrIGE7Yzpmb3IoOzspe2UoZyxyLmNvbXBfaXRlcik7Zz1iKGcsMCk7aWYoZy50eXBlPT09ci5jb21wX2Zvciljb250aW51ZSBiO2Vsc2UgaWYoZy50eXBlPT09ci5jb21wX2lmKWlmKDM9PT1jKGcpKXtnPVxuYihnLDIpO2NvbnRpbnVlIGN9ZWxzZSBicmVhayBhO2JyZWFrfWJyZWFrfWg9dm9pZCAwfWZvcihnPTA7ZzxoO2crKyl7dmFyIG49MDtiKGQsMCkudHlwZT09ei5UX0FTWU5DJiYobj0xKTt2YXIgbD1iKGQsMStuKTt2YXIgcD12KGEsbCxTay5hc3Rub2Rlcy5TdG9yZSk7aWYoIXApcmV0dXJuIG51bGw7az13KGEsYihkLDMrbikpO2lmKCFrKXJldHVybiBudWxsO3ZhciB4PXBbMF07cD0xPT1jKGwpP25ldyBTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uKHgsayxudWxsLG4pOm5ldyBTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uKG5ldyBTay5hc3Rub2Rlcy5UdXBsZShwLFNrLmFzdG5vZGVzLlN0b3JlLHgubGluZW5vLHguY29sX29mZnNldCxsLmVuZF9saW5lbm8sbC5lbmRfY29sX29mZnNldCksayxudWxsLG4pO2lmKGMoZCk9PTUrbil7eD1bXTtkPWIoZCw0K24pO2E6Zm9yKGs9ZCxuPTA7Oyl7ZShrLHIuY29tcF9pdGVyKTtpZihiKGssMCkudHlwZT09ci5jb21wX2Zvcil7bD1uO2JyZWFrIGF9az1cbmIoaywwKTtlKGssci5jb21wX2lmKTtuKys7aWYoMj09YyhrKSl7bD1uO2JyZWFrIGF9az1iKGssMil9aWYoLTE9PWwpcmV0dXJuIG51bGw7Zm9yKG49MDtuPGw7bisrKXtlKGQsci5jb21wX2l0ZXIpO2Q9YihkLDApO2UoZCxyLmNvbXBfaWYpO2s9dyhhLGIoZCwxKSk7aWYoIWspcmV0dXJuIG51bGw7eFtuXT1rOzM9PWMoZCkmJihkPWIoZCwyKSl9ZC50eXBlPT1yLmNvbXBfaXRlciYmKGQ9YihkLDApKTtwLmlmcz14fWZbZ109cH1yZXR1cm4gZn1mdW5jdGlvbiBhYShhLGQsZSl7U2suYXNzZXJ0cy5hc3NlcnQoMTxjKGQpKTt2YXIgZz1iKGQsMCk7dmFyIGg9dyhhLGcpO2lmKGguY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXJldHVybiBmKGEsZyxcIml0ZXJhYmxlIHVucGFja2luZyBjYW5ub3QgYmUgdXNlZCBpbiBjb21wcmVoZW5zaW9uXCIpLG51bGw7YT1VKGEsYihkLDEpKTtyZXR1cm4gMD09ZT9uZXcgU2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwKGgsYSxkLmxpbmVubyxcbmQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6MT09ZT9uZXcgU2suYXN0bm9kZXMuTGlzdENvbXAoaCxhLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6Mj09ZT9uZXcgU2suYXN0bm9kZXMuU2V0Q29tcChoLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpudWxsfWZ1bmN0aW9uIGNhKGEsYyl7ZShjLHIuYXVnYXNzaWduKTtjPWIoYywwKTtzd2l0Y2goYy52YWx1ZS5jaGFyQXQoMCkpe2Nhc2UgXCIrXCI6cmV0dXJuIFNrLmFzdG5vZGVzLkFkZDtjYXNlIFwiLVwiOnJldHVybiBTay5hc3Rub2Rlcy5TdWI7Y2FzZSBcIi9cIjpyZXR1cm5cIi9cIj09PWMudmFsdWUuY2hhckF0KDEpP1NrLmFzdG5vZGVzLkZsb29yRGl2OlNrLmFzdG5vZGVzLkRpdjtjYXNlIFwiJVwiOnJldHVybiBTay5hc3Rub2Rlcy5Nb2Q7Y2FzZSBcIjxcIjpyZXR1cm4gU2suYXN0bm9kZXMuTFNoaWZ0O2Nhc2UgXCI+XCI6cmV0dXJuIFNrLmFzdG5vZGVzLlJTaGlmdDtcbmNhc2UgXCImXCI6cmV0dXJuIFNrLmFzdG5vZGVzLkJpdEFuZDtjYXNlIFwiXlwiOnJldHVybiBTay5hc3Rub2Rlcy5CaXRYb3I7Y2FzZSBcInxcIjpyZXR1cm4gU2suYXN0bm9kZXMuQml0T3I7Y2FzZSBcIipcIjpyZXR1cm5cIipcIj09PWMudmFsdWUuY2hhckF0KDEpP1NrLmFzdG5vZGVzLlBvdzpTay5hc3Rub2Rlcy5NdWx0O2Nhc2UgXCJAXCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBTay5hc3Rub2Rlcy5NYXRNdWx0O2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBhdWdhc3NpZ25cIil9fWZ1bmN0aW9uIFcoYSxkKXtTay5hc3NlcnRzLmFzc2VydCgwPGMoZCkpO2QudHlwZT09PXIudGVzdGxpc3RfY29tcD8xPGMoZCkmJlNrLmFzc2VydHMuYXNzZXJ0KGIoZCwxKS50eXBlIT09ci5jb21wX2Zvcik6U2suYXNzZXJ0cy5hc3NlcnQoZC50eXBlPT09ci50ZXN0bGlzdHx8ZC50eXBlPT09ci50ZXN0bGlzdF9zdGFyX2V4cHIpO3JldHVybiAxPT09YyhkKT93KGEsYihkLDApKTpuZXcgU2suYXN0bm9kZXMuVHVwbGUoQShhLFxuZCksU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIGRhKGEsZil7ZShmLHIuZXhwcl9zdG10KTtpZigxPT09YyhmKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkV4cHIoVyhhLGIoZiwwKSksZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtpZihiKGYsMSkudHlwZT09PXIuYXVnYXNzaWduKXt2YXIgaD1iKGYsMCk7dmFyIGs9VyhhLGgpO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO3N3aXRjaChrLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6dmFyIG49ay5pZDtkKGEsaCxuLGYubGluZW5vKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTpjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImF1Z21lbnRlZCBhc3NpZ25tZW50IHRvIGdlbmVyYXRvciBleHByZXNzaW9uIG5vdCBwb3NzaWJsZVwiLGEuY19maWxlbmFtZSxcbmYubGluZW5vKTtjYXNlIFNrLmFzdG5vZGVzLllpZWxkOnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXVnbWVudGVkIGFzc2lnbm1lbnQgdG8geWllbGQgZXhwcmVzc2lvbiBub3QgcG9zc2libGVcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbGxlZ2FsIGV4cHJlc3Npb24gZm9yIGF1Z21lbnRlZCBhc3NpZ25tZW50XCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTt9aD1iKGYsMik7bj1oLnR5cGU9PT1yLnRlc3RsaXN0P1coYSxoKTp3KGEsaCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5BdWdBc3NpZ24oayxjYShhLGIoZiwxKSksbixmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWlmKGIoZiwxKS50eXBlPT09ci5hbm5hc3NpZ24pe2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJBbm5vdGF0ZWQgYXNzaWdubWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIsXG5hLmNfZmlsZW5hbWUsZi5saW5lbm8pO2g9YihmLDApO3ZhciBsPWIoZiwxKTt2YXIgcD0xO2ZvcihrPWg7MT09YyhrKTspaz1iKGssMCk7MDxjKGspJiZiKGssMCkudHlwZT09ei5UX0xQQVImJihwPTApO2s9VyhhLGgpO3N3aXRjaChrLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6bj1rLmlkO2QoYSxoLG4sZi5saW5lbm8pO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOm49ay5hdHRyO2QoYSxoLG4sZi5saW5lbm8pO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OmcoYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm9ubHkgc2luZ2xlIHRhcmdldCAobm90IGxpc3QpIGNhbiBiZSBhbm5vdGF0ZWRcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO1xuY2FzZSBTay5hc3Rub2Rlcy5UdXBsZTp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm9ubHkgc2luZ2xlIHRhcmdldCAobm90IHR1cGxlKSBjYW4gYmUgYW5ub3RhdGVkXCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaWxsZWdhbCB0YXJnZXQgZm9yIGFubm90YXRpb25cIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO31rLmNvbnN0cnVjdG9yIT1Tay5hc3Rub2Rlcy5OYW1lJiYocD0wKTtoPWIobCwxKTtuPXcoYSxoKTtpZigyPT1jKGwpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQW5uQXNzaWduKGssbixudWxsLHAsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtoPWIobCwzKTthPXcoYSxoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkFubkFzc2lnbihrLG4sYSxwLGYubGluZW5vLGYuY29sX29mZnNldCl9ZShiKGYsMSksei5UX0VRVUFMKTtwPVtdO2ZvcihrPTA7azxjKGYpLTI7ays9Mil7aD1iKGYsayk7aWYoaC50eXBlPT09XG5yLnlpZWxkX2V4cHIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIHlpZWxkIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlXCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtoPVcoYSxoKTtnKGEsaCxTay5hc3Rub2Rlcy5TdG9yZSxiKGYsaykpO3Bbay8yXT1ofWg9YihmLGMoZiktMSk7YT1oLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcj9XKGEsaCk6dyhhLGgpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQXNzaWduKHAsYSxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIGVhKGEsYixjLGQsZSl7U2suYXNzZXJ0cy5hc3NlcnQoYz49Yik7U2suYXNzZXJ0cy5hc3NlcnQoXCJ7XCI9PWEuY2hhckF0KGItMSkpO1NrLmFzc2VydHMuYXNzZXJ0KFwifVwiPT1hLmNoYXJBdChjKXx8XCIhXCI9PWEuY2hhckF0KGMpfHxcIjpcIj09YS5jaGFyQXQoYykpO2E9YS5zdWJzdHJpbmcoYixjKTsvXlxccyokLy50ZXN0KGEpJiZmKGQsZSxcImYtc3RyaW5nOiBlbXB0eSBleHByZXNzaW9uIG5vdCBhbGxvd2VkXCIpO1xudHJ5e2xldCBiPVNrLnBhcnNlKFwiPGZzdHJpbmc+XCIsXCIoXCIrYStcIilcIik7dmFyIGc9U2suYXN0RnJvbVBhcnNlKGIuY3N0LFwiPGZzdHJpbmc+XCIsYi5mbGFncyl9Y2F0Y2goWSl7dGhyb3cgWS50cmFjZWJhY2smJlkudHJhY2ViYWNrWzBdJiYoZz1ZLnRyYWNlYmFja1swXSxnLmxpbmVubz0oZy5saW5lbm98fDEpLTErZS5saW5lbm8sZy5maWxlbmFtZT1kLmNfZmlsZW5hbWUpLFk7fVNrLmFzc2VydHMuYXNzZXJ0KDE9PWcuYm9keS5sZW5ndGgmJmcuYm9keVswXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLkV4cHIpO3JldHVybiBnLmJvZHlbMF0udmFsdWV9ZnVuY3Rpb24gSChhLGIsYyxkLGUsZyxoKXtTay5hc3NlcnRzLmFzc2VydChcIntcIj09YS5jaGFyQXQoYikpO2IrKzt2YXIgaz1iO2xldCBuPW51bGwsbD0wLHA9MCxtLHgsUz0oKT0+ZihnLGgsXCJmLXN0cmluZzogZXhwZWN0aW5nICd9J1wiKTtmb3IoU2suYXNzZXJ0cy5hc3NlcnQoYjw9Yyk7YjxjO2IrKyl7bGV0IGQ9YS5jaGFyQXQoYik7XG5cIlxcXFxcIj09ZCYmZihnLGgsXCJmLXN0cmluZyBleHByZXNzaW9uIHBhcnQgY2Fubm90IGluY2x1ZGUgYSBiYWNrc2xhc2hcIik7aWYobilkPT1uJiYoMz09bD9iKzI8YyYmYS5jaGFyQXQoYisxKT09ZCYmYS5jaGFyQXQoYisyKT09ZCYmKGIrPTIsbj1sPTApOmw9bj0wKTtlbHNlIGlmKFwiJ1wiPT1kfHwnXCInPT1kKWIrMjxjJiZhLmNoYXJBdChiKzEpPT1kJiZhLmNoYXJBdChiKzIpPT1kPyhsPTMsYis9Mik6bD0xLG49ZDtlbHNlIGlmKFwiW1wiPT1kfHxcIntcIj09ZHx8XCIoXCI9PWQpcCsrO2Vsc2UgaWYoMCE9cCYmKFwiXVwiPT1kfHxcIn1cIj09ZHx8XCIpXCI9PWQpKXAtLTtlbHNlIGlmKFwiI1wiPT1kKWYoZyxoLFwiZi1zdHJpbmcgZXhwcmVzc2lvbiBwYXJ0IGNhbm5vdCBpbmNsdWRlICcjJ1wiKTtlbHNlIGlmKCEoMCE9cHx8XCIhXCIhPWQmJlwiOlwiIT1kJiZcIn1cIiE9ZHx8XCIhXCI9PWQmJmIrMTxjJiZcIj1cIj09YS5jaGFyQXQoYisxKSkpYnJlYWt9biYmZihnLGgsXCJmLXN0cmluZzogdW50ZXJtaW5hdGVkIHN0cmluZ1wiKTtcbnAmJmYoZyxoLFwiZi1zdHJpbmc6IG1pc21hdGNoZWQgJygnLCAneycsIG9yICdbJ1wiKTtrPWVhKGEsayxiLGcsaCk7XCIhXCI9PWEuY2hhckF0KGIpJiYoYisrLGI+PWMmJlMoKSx4PWEuY2hhckF0KGIpLGIrKyxcInNcIiE9eCYmXCJyXCIhPXgmJlwiYVwiIT14JiZmKGcsaCxcImYtc3RyaW5nOiBpbnZhbGlkIGNvbnZlcnNpb24gY2hhcmFjdGVyOiBleHBlY3RlZCAncycsICdyJywgb3IgJ2EnXCIpKTtiPj1jJiZTKCk7XCI6XCI9PWEuY2hhckF0KGIpJiYoYisrLGI+PWMmJlMoKSxbbSxiXT1iYShhLGIsYyxkLGUrMSxnLGgpKTsoYj49Y3x8XCJ9XCIhPWEuY2hhckF0KGIpKSYmUygpO2IrKztyZXR1cm5bbmV3IFNrLmFzdG5vZGVzLkZvcm1hdHRlZFZhbHVlKGsseCxtLGgubGluZW5vLGguY29sX29mZnNldCksYl19ZnVuY3Rpb24gYmEoYSxiLGMsZCxlLGYsZyl7bGV0IGg9W10saz1hPT57aWYoLTEhPT1hLmluZGV4T2YoXCJ9XCIpKXtpZigvKF58W159XSl9KH19KSooJHxbXn1dKS8udGVzdChhKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJmLXN0cmluZzogc2luZ2xlICd9JyBpcyBub3QgYWxsb3dlZFwiLFxuZy5saW5lbm8sZy5jb2xfb2Zmc2V0KTthPWEucmVwbGFjZSgvfX0vZyxcIn1cIil9aC5wdXNoKG5ldyBTay5hc3Rub2Rlcy5TdHIobmV3IFNrLmJ1aWx0aW4uc3RyKGEpLGcubGluZW5vLGcuY29sX29mZnNldCxmLmVuZF9saW5lbm8sZy5lbmRfY29sX29mZnNldCkpfTtmb3IoO2I8Yzspe2xldCBuPWEuaW5kZXhPZihcIntcIixiKTtpZigwIT09ZSl7bGV0IGQ9YS5pbmRleE9mKFwifVwiLGIpOy0xIT09ZCYmKC0xPT09bj9jPWQ6bj5kJiYobj0tMSxjPWQpKX1pZigtMT09PW4pe2soYS5zdWJzdHJpbmcoYixjKSk7Yj1jO2JyZWFrfWVsc2UgaWYobisxPGMmJlwie1wiPT09YS5jaGFyQXQobisxKSlrKGEuc3Vic3RyaW5nKGIsbisxKSksYj1uKzI7ZWxzZXtrKGEuc3Vic3RyaW5nKGIsbikpO2I9bjtsZXQgW2wscF09SChhLG4sYyxkLGUsZixnKTtoLnB1c2gobCk7Yj1wfX1yZXR1cm5bbmV3IFNrLmFzdG5vZGVzLkpvaW5lZFN0cihoLGcubGluZW5vLGcuY29sX29mZnNldCksYl19ZnVuY3Rpb24gWChhLFxuYixjKXt2YXIgZD1iLmNoYXJBdChiLmxlbmd0aC0xKTtpZigtMSE9PWIuaW5kZXhPZihcIl9cIikpe2lmKGZhLnRlc3QoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIHN5bnRheFwiLGEuY19maWxlbmFtZSxjKTtpZihoYS50ZXN0KGIpKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBkZWNpbWFsIGxpdGVyYWxcIixhLmNfZmlsZW5hbWUsYyk7Yj1iLnJlcGxhY2UoaWEsXCJcIil9aWYoXCJqXCI9PT1kfHxcIkpcIj09PWQpcmV0dXJuIFNrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcoYik7aWYoXCJsXCI9PT1kfHxcIkxcIj09PWQpcmV0dXJuIFNrLmxvbmdGcm9tU3RyKGIuc3Vic3RyKDAsYi5sZW5ndGgtMSksMCk7aWYoLTEhPT1iLmluZGV4T2YoXCIuXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8ocGFyc2VGbG9hdChiKSk7Yz1iO2E9ITE7XCItXCI9PT1iLmNoYXJBdCgwKSYmKGM9Yi5zdWJzdHIoMSksYT1cbiEwKTtpZihcIjBcIiE9PWMuY2hhckF0KDApfHxcInhcIiE9PWMuY2hhckF0KDEpJiZcIlhcIiE9PWMuY2hhckF0KDEpKXtpZigtMSE9PWIuaW5kZXhPZihcImVcIil8fC0xIT09Yi5pbmRleE9mKFwiRVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHBhcnNlRmxvYXQoYikpO2lmKFwiMFwiIT09Yy5jaGFyQXQoMCl8fFwiYlwiIT09Yy5jaGFyQXQoMSkmJlwiQlwiIT09Yy5jaGFyQXQoMSkpaWYoXCIwXCI9PT1jLmNoYXJBdCgwKSlpZihcIjBcIj09PWMpYz0wO2Vsc2V7Yz1jLnN1YnN0cmluZygxKTtpZihcIm9cIj09PWMuY2hhckF0KDApfHxcIk9cIj09PWMuY2hhckF0KDApKWM9Yy5zdWJzdHJpbmcoMSk7Yz1wYXJzZUludChjLDgpfWVsc2UgYz1wYXJzZUludChjLDEwKTtlbHNlIGM9Yy5zdWJzdHJpbmcoMiksYz1wYXJzZUludChjLDIpfWVsc2UgYz1jLnN1YnN0cmluZygyKSxjPXBhcnNlSW50KGMsMTYpO3JldHVybiBjPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZNYXRoLmZsb29yKGMpPT09YyYmLTE9PT1iLmluZGV4T2YoXCJlXCIpJiZcbi0xPT09Yi5pbmRleE9mKFwiRVwiKT9Tay5sb25nRnJvbVN0cihiLDApOmE/bmV3IFNrLmJ1aWx0aW4uaW50XygtYyk6bmV3IFNrLmJ1aWx0aW4uaW50XyhjKX1mdW5jdGlvbiBJKGEsZCl7dmFyIGYsZztlKGQsci5zdWJzY3JpcHQpO3ZhciBoPWIoZCwwKTt2YXIgaz1mPWc9bnVsbDtpZihoLnR5cGU9PT16LlRfRE9UKXJldHVybiBuZXcgU2suYXN0bm9kZXMuRWxsaXBzaXM7aWYoMT09PWMoZCkmJmgudHlwZT09PXIudGVzdClyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkluZGV4KHcoYSxoKSk7aC50eXBlPT09ci50ZXN0JiYoZz13KGEsaCkpO2gudHlwZT09PXouVF9DT0xPTj8xPGMoZCkmJihoPWIoZCwxKSxoLnR5cGU9PT1yLnRlc3QmJihmPXcoYSxoKSkpOjI8YyhkKSYmKGg9YihkLDIpLGgudHlwZT09PXIudGVzdCYmKGY9dyhhLGgpKSk7aD1iKGQsYyhkKS0xKTtoLnR5cGU9PT1yLnNsaWNlb3AmJigxPT09YyhoKT8oaD1iKGgsMCksaz1uZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxcblNrLmFzdG5vZGVzLkxvYWQsaC5saW5lbm8saC5jb2xfb2Zmc2V0KSk6KGg9YihoLDEpLGgudHlwZT09PXIudGVzdCYmKGs9dyhhLGgpKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuU2xpY2UoZyxmLGspfWZ1bmN0aW9uIFIoYSxkKXt2YXIgZz1iKGQsMCk7c3dpdGNoKGcudHlwZSl7Y2FzZSB6LlRfTkFNRTp2YXIgaD1nLnZhbHVlO2lmKDQ8PWgubGVuZ3RoJiY1Pj1oLmxlbmd0aCl7aWYoXCJOb25lXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2lmKFwiVHJ1ZVwiPT09aClyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudChTay5idWlsdGluLmJvb2wudHJ1ZSQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtpZihcIkZhbHNlXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1hPVxuayhoLGEpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZShhLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtjYXNlIHouVF9TVFJJTkc6Zz1bXTtmb3IodmFyIG49MDtuPGMoZCk7KytuKXt2YXIgcD1iKGQsbikudmFsdWU7dmFyIG09YTt2YXIgeD1iKGQsbik7dmFyIHQ9cDt2YXIgcT10LmNoYXJBdCgwKTtmb3IodmFyIEo9ITEsdj1wPSExOzspe2lmKFwidVwiIT09cSYmXCJVXCIhPT1xKWlmKFwiclwiPT09cXx8XCJSXCI9PT1xKUo9ITA7ZWxzZSBpZihcImJcIj09PXF8fFwiQlwiPT09cSl2PSEwO2Vsc2UgaWYoXCJmXCI9PT1xfHxcIkZcIj09PXEpcD0hMDtlbHNlIGJyZWFrO3Q9dC5zdWJzdHIoMSk7cT10LmNoYXJBdCgwKX1Tay5hc3NlcnRzLmFzc2VydChcIidcIj09PXF8fCdcIic9PT1xJiZ0LmNoYXJBdCh0Lmxlbmd0aC0xKT09PXEpO3Q9dC5zdWJzdHIoMSx0Lmxlbmd0aC0yKTs0PD10Lmxlbmd0aCYmdC5jaGFyQXQoMCk9PT1xJiZcbnQuY2hhckF0KDEpPT09cSYmKFNrLmFzc2VydHMuYXNzZXJ0KHQuY2hhckF0KHQubGVuZ3RoLTEpPT09cSYmdC5jaGFyQXQodC5sZW5ndGgtMik9PT1xKSx0PXQuc3Vic3RyKDIsdC5sZW5ndGgtNCkpO2lmKEp8fC0xPT09dC5pbmRleE9mKFwiXFxcXFwiKSl7aWYodilmb3IocT0wO3E8dC5sZW5ndGg7cSsrKTEyNzx0LmNoYXJDb2RlQXQocSkmJmYobSx4LFwiYnl0ZXMgY2FuIG9ubHkgY29udGFpbiBBU0NJSSBsaXRlcmFsIGNoYXJhY3RlcnNcIik7bT1bbCh0KSxwLHZdfWVsc2V7Sj10O3ZhciBCPUoubGVuZ3RoLHk9XCJcIjtmb3IodD0wO3Q8QjsrK3QpcT1KLmNoYXJBdCh0KSxcIlxcXFxcIj09PXE/KCsrdCxxPUouY2hhckF0KHQpLFwiblwiPT09cT95Kz1cIlxcblwiOlwiXFxcXFwiPT09cT95Kz1cIlxcXFxcIjpcInRcIj09PXE/eSs9XCJcXHRcIjpcInJcIj09PXE/eSs9XCJcXHJcIjpcImJcIj09PXE/eSs9XCJcXGJcIjpcImZcIj09PXE/eSs9XCJcXGZcIjpcInZcIj09PXE/eSs9XCJcXHZcIjpcIjBcIj09PXE/eSs9XCJcXHgwMFwiOidcIic9PT1xP3krPSdcIic6XCInXCI9PT1xP1xueSs9XCInXCI6XCJcXG5cIiE9PXEmJihcInhcIj09PXE/KHQrMj49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXHhOTiBlc2NhcGVcIikseSs9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChKLnN1YnN0cih0KzEsMiksMTYpKSx0Kz0yKTp2fHxcInVcIiE9PXE/dnx8XCJVXCIhPT1xP3krPVwiXFxcXFwiK3E6KHQrOD49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXFVYWFhYWFhYWCBlc2NhcGVcIikseSs9U3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoSi5zdWJzdHIodCsxLDgpLDE2KSksdCs9OCk6KHQrND49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXHVYWFhYIGVzY2FwZVwiKSx5Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KEouc3Vic3RyKHQrMSw0KSwxNikpLHQrPTQpKSk6diYmMTI3PHEuY2hhckNvZGVBdCgwKT9mKG0seCxcImJ5dGVzIGNhbiBvbmx5IGNvbnRhaW4gQVNDSUkgbGl0ZXJhbCBjaGFyYWN0ZXJzXCIpOnkrPXE7bT15O209W2wobSkscCx2XX1wPW07bT1wWzBdO3g9cFsxXTtwPXBbMl07MCE9biYmXG5oIT09cCYmZihhLGQsXCJjYW5ub3QgbWl4IGJ5dGVzIGFuZCBub25ieXRlcyBsaXRlcmFsc1wiKTtoPXA7aWYoeCl7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImludmFsaWQgc3RyaW5nIChmLXN0cmluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDIpXCIsYS5jX2ZpbGVuYW1lLGIoZCxuKS5saW5lbm8pO3ZhciBGPW0uJGpzc3RyKCk7W0ZdPWJhKEYsMCxGLmxlbmd0aCwhMSwwLGEsYihkLG4pKTtnLnB1c2guYXBwbHkoZyxGLnZhbHVlcyk7Rj1udWxsfWVsc2UgRj9GLnM9Ri5zLnNxJGNvbmNhdChtKTooRj1uZXcgKGg/U2suYXN0bm9kZXMuQnl0ZXM6U2suYXN0bm9kZXMuU3RyKShtLGQubGluZW5vLGQuY29sX29mZnNldCxhLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCksZy5wdXNoKEYpKX1kPTE9PT1nLmxlbmd0aCYmZ1swXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0cj9nWzBdOm5ldyBTay5hc3Rub2Rlcy5Kb2luZWRTdHIoZyxcbmQubGluZW5vLGQuY29sX29mZnNldCxhLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7cmV0dXJuIGQ7Y2FzZSB6LlRfTlVNQkVSOnJldHVybiBuZXcgU2suYXN0bm9kZXMuTnVtKFgoYSxnLnZhbHVlLGQubGluZW5vKSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX0VMTElQU0lTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuRWxsaXBzaXMoZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtjYXNlIHouVF9MUEFSOnJldHVybiBnPWIoZCwxKSxnLnR5cGU9PXouVF9SUEFSP25ldyBTay5hc3Rub2Rlcy5UdXBsZShbXSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6Zy50eXBlPT1yLnlpZWxkX2V4cHI/dyhhLGcpOjE9PWMoZyk/VyhhLGcpOmIoZywxKS50eXBlPT1yLmNvbXBfZm9yP3UoRChhLGcpLGQpOnUoVyhhLGcpLGQpO2Nhc2Ugei5UX0xTUUI6Zz1cbmIoZCwxKTtpZihnLnR5cGU9PXouVF9SU1FCKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTGlzdChbXSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7ZShnLHIudGVzdGxpc3RfY29tcCk7aWYoMT09YyhnKXx8YihnLDEpLnR5cGU9PXouVF9DT01NQSlyZXR1cm4oYT1BKGEsZykpP25ldyBTay5hc3Rub2Rlcy5MaXN0KGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOm51bGw7aD1nO1NrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09ci50ZXN0bGlzdF9jb21wKTthPWFhKGEsaCwxKTtyZXR1cm4gdShhLGQpO2Nhc2Ugei5UX0xCUkFDRTpnPWIoZCwxKTtpZihnLnR5cGU9PXouVF9SQlJBQ0UpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5EaWN0KG51bGwsbnVsbCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO1xuaD1iKGcsMCkudHlwZT09ei5UX0RPVUJMRVNUQVI7aWYoMT09YyhnKXx8MTxjKGcpJiZiKGcsMSkudHlwZT09ei5UX0NPTU1BKXtoPWc7bj1bXTtTay5hc3NlcnRzLmFzc2VydChoLnR5cGU9PT1yLmRpY3RvcnNldG1ha2VyKTtmb3IoZz0wO2c8YyhoKTtnKz0yKUY9dyhhLGIoaCxnKSksbltnLzJdPUY7YT1uZXcgU2suYXN0bm9kZXMuU2V0KG4saC5saW5lbm8saC5jb2xfb2Zmc2V0KX1lbHNlIGlmKDE8YyhnKSYmYihnLDEpLnR5cGU9PXIuY29tcF9mb3IpaD1nLFNrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09PXIuZGljdG9yc2V0bWFrZXIpLFNrLmFzc2VydHMuYXNzZXJ0KDE8YyhoKSksZz13KGEsYihoLDApKSxhPVEoYSxiKGgsMSkpLGE9bmV3IFNrLmFzdG5vZGVzLlNldENvbXAoZyxhLGgubGluZW5vLGguY29sX29mZnNldCk7ZWxzZSBpZihjKGcpPjMtaCYmYihnLDMtaCkudHlwZT09ci5jb21wX2Zvcil7aWYoaClyZXR1cm4gZihhLGQsXCJkaWN0IHVucGFja2luZyBjYW5ub3QgYmUgdXNlZCBpbiBkaWN0IGNvbXByZWhlbnNpb25cIiksXG5udWxsO2g9ZztTay5hc3NlcnRzLmFzc2VydCgzPGMoaCkpO2UoYihoLDEpLHouVF9DT0xPTik7Zz13KGEsYihoLDApKTtuPXcoYSxiKGgsMikpO2E9UShhLGIoaCwzKSk7YT1uZXcgU2suYXN0bm9kZXMuRGljdENvbXAoZyxuLGEsaC5saW5lbm8saC5jb2xfb2Zmc2V0KX1lbHNle2g9ZztuPVtdO0Y9W107Zm9yKHA9Zz0wO3A8YyhoKTtwKyspbT1hLHg9aCx2PXAsYih4LHYpLnR5cGU9PXouVF9ET1VCTEVTVEFSPyhTay5hc3NlcnRzLmFzc2VydCgyPD1jKHgpLXYpLHA9dyhtLGIoeCx2KzEpKSxtPXtrZXk6bnVsbCx2YWx1ZTpwLGk6disyfSk6KFNrLmFzc2VydHMuYXNzZXJ0KDM8PWMoeCktdiksKHA9dyhtLGIoeCx2KSkpPyh0PXAsZShiKHgsdisxKSx6LlRfQ09MT04pLG09KHA9dyhtLGIoeCx2KzIpKSk/e2tleTp0LHZhbHVlOnAsaTp2KzN9OiExKTptPTApLHA9bS5pLG5bZ109bS5rZXksRltnXT1tLnZhbHVlLGcrKzthPW5ldyBTay5hc3Rub2Rlcy5EaWN0KG4sRixoLmxpbmVubyxcbmguY29sX29mZnNldCxoLmVuZF9saW5lbm8saC5lbmRfY29sX29mZnNldCl9cmV0dXJuIHUoYSxkKTtkZWZhdWx0OnJldHVybiBTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgYXRvbSBcIitnLnR5cGUpLG51bGx9fWZ1bmN0aW9uIEMoYSxkKXt2YXIgZyxmPTA7ZShkLHIuYXRvbV9leHByKTt2YXIgaD1jKGQpO2IoZCwwKS50eXBlPT09ei5UX0FXQUlUJiYoZj0xLFNrLmFzc2VydHMuYXNzZXJ0KDE8aCkpO3ZhciBrPVIoYSxiKGQsZikpO2lmKCFrKXJldHVybiBudWxsO2lmKDE9PT1oKXJldHVybiBrO2lmKGYmJjI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQXdhaXQoayxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2ZvcihnPWYrMTtnPGg7ZysrKXt2YXIgbj1iKGQsZyk7aWYobi50eXBlIT09ci50cmFpbGVyKWJyZWFrO249TShhLG4sayk7aWYoIW4pcmV0dXJuIG51bGw7bi5saW5lbm89ay5saW5lbm87bi5jb2xfb2Zmc2V0PWsuY29sX29mZnNldDtrPW59cmV0dXJuIGY/bmV3IFNrLmFzdG5vZGVzLkF3YWl0KGssXG5kLmxpbmUsZC5jb2xfb2Zmc2V0KTprfWZ1bmN0aW9uIHcoYSxkKXthOmZvcig7Oyl7c3dpdGNoKGQudHlwZSl7Y2FzZSByLnRlc3Q6Y2FzZSByLnRlc3Rfbm9jb25kOmlmKGIoZCwwKS50eXBlPT09ci5sYW1iZGVmfHxiKGQsMCkudHlwZT09PXIubGFtYmRlZl9ub2NvbmQpe3ZhciBnPWIoZCwwKTszPT09YyhnKT8oZD1uZXcgU2suYXN0bm9kZXMuYXJndW1lbnRzXyhbXSxudWxsLG51bGwsW10pLGE9dyhhLGIoZywyKSkpOihkPUwoYSxiKGcsMSkpLGE9dyhhLGIoZywzKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuTGFtYmRhKGQsYSxnLmxpbmVubyxnLmNvbF9vZmZzZXQpfWlmKDE8YyhkKSlyZXR1cm4gU2suYXNzZXJ0cy5hc3NlcnQoNT09PWMoZCkpLG5ldyBTay5hc3Rub2Rlcy5JZkV4cCh3KGEsYihkLDIpKSx3KGEsYihkLDApKSx3KGEsYihkLDQpKSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5vcl90ZXN0OmNhc2Ugci5hbmRfdGVzdDppZigxPT09YyhkKSl7ZD1iKGQsXG4wKTtjb250aW51ZSBhfXZhciBmPVtdO2ZvcihnPTA7ZzxjKGQpO2crPTIpZltnLzJdPXcoYSxiKGQsZykpO2lmKFwiYW5kXCI9PT1iKGQsMSkudmFsdWUpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Cb29sT3AoU2suYXN0bm9kZXMuQW5kLGYsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtTay5hc3NlcnRzLmFzc2VydChcIm9yXCI9PT1iKGQsMSkudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQm9vbE9wKFNrLmFzdG5vZGVzLk9yLGYsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIubm90X3Rlc3Q6aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9ZWxzZSByZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlVuYXJ5T3AoU2suYXN0bm9kZXMuTm90LHcoYSxiKGQsMSkpLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmNvbXBhcmlzb246aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9ZWxzZXt2YXIgaD1bXTtmPVtdO2ZvcihnPTE7ZzxjKGQpO2crPTIpaFsoZy0xKS8yXT1cbnAoYSxiKGQsZykpLGZbKGctMSkvMl09dyhhLGIoZCxnKzEpKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNvbXBhcmUodyhhLGIoZCwwKSksaCxmLGQubGluZW5vLGQuY29sX29mZnNldCl9Y2FzZSByLnN0YXJfZXhwcjpyZXR1cm4gZShkLHIuc3Rhcl9leHByKSxuZXcgU2suYXN0bm9kZXMuU3RhcnJlZCh3KGEsYihkLDEpKSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmV4cHI6Y2FzZSByLnhvcl9leHByOmNhc2Ugci5hbmRfZXhwcjpjYXNlIHIuc2hpZnRfZXhwcjpjYXNlIHIuYXJpdGhfZXhwcjpjYXNlIHIudGVybTppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX12YXIgaz1kLGw9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKHcoYSxiKGssMCkpLG4oYihrLDEpKSx3KGEsYihrLDIpKSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpLG09KGMoayktMSkvMjtmb3IoZD0xO2Q8bTsrK2QpZz1iKGssMipkKzEpLGY9bihnKSxoPXcoYSxiKGssMipkK1xuMikpLGw9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKGwsZixoLGcubGluZW5vLGcuY29sX29mZnNldCk7cmV0dXJuIGw7Y2FzZSByLnlpZWxkX2V4cHI6cmV0dXJuIGY9ITEsaD1udWxsLDE8YyhkKSYmKGc9YihkLDEpKSxnJiYoaD1iKGcsYyhnKS0xKSwyPT1jKGcpPyhmPSEwLGg9dyhhLGgpKTpoPVcoYSxoKSksZj9uZXcgU2suYXN0bm9kZXMuWWllbGRGcm9tKGgsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpuZXcgU2suYXN0bm9kZXMuWWllbGQoaCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5mYWN0b3I6aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9cmV0dXJuIEUoYSxkKTtjYXNlIHIucG93ZXI6cmV0dXJuIGc9ZCxlKGcsci5wb3dlciksZD1DKGEsYihnLDApKSwxIT09YyhnKSYmYihnLGMoZyktMSkudHlwZT09PXIuZmFjdG9yJiYoYT13KGEsYihnLGMoZyktMSkpLGQ9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKGQsU2suYXN0bm9kZXMuUG93LGEsZy5saW5lbm8sZy5jb2xfb2Zmc2V0KSksXG5kO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGV4cHJcIixcIm4udHlwZTogJWRcIixkLnR5cGUpfWJyZWFrfX1mdW5jdGlvbiBOKGEsZCl7ZC50eXBlPT09ci5zdG10JiYoU2suYXNzZXJ0cy5hc3NlcnQoMT09PWMoZCkpLGQ9YihkLDApKTtkLnR5cGU9PT1yLnNpbXBsZV9zdG10JiYoU2suYXNzZXJ0cy5hc3NlcnQoMT09PWgoZCkpLGQ9YihkLDApKTtpZihkLnR5cGU9PT1yLnNtYWxsX3N0bXQpc3dpdGNoKGQ9YihkLDApLGQudHlwZSl7Y2FzZSByLmV4cHJfc3RtdDpyZXR1cm4gZGEoYSxkKTtjYXNlIHIuZGVsX3N0bXQ6dmFyIGs9ZDtlKGssci5kZWxfc3RtdCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5EZWxldGUodihhLGIoaywxKSxTay5hc3Rub2Rlcy5EZWwpLGsubGluZW5vLGsuY29sX29mZnNldCk7Y2FzZSByLnBhc3Nfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlBhc3MoZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIuZmxvd19zdG10OnJldHVybiBWKGEsXG5kKTtjYXNlIHIuaW1wb3J0X3N0bXQ6dmFyIG49ZCxwO2UobixyLmltcG9ydF9zdG10KTt2YXIgbT1uLmxpbmVubztkPW4uY29sX29mZnNldDtuPWIobiwwKTtpZihuLnR5cGU9PT1yLmltcG9ydF9uYW1lKXtuPWIobiwxKTtlKG4sci5kb3R0ZWRfYXNfbmFtZXMpO3ZhciBxPVtdO2ZvcihwPTA7cDxjKG4pO3ArPTIpcVtwLzJdPUIoYSxiKG4scCkpO2E9bmV3IFNrLmFzdG5vZGVzLkltcG9ydChxLG0sZCl9ZWxzZSBpZihuLnR5cGU9PT1yLmltcG9ydF9mcm9tKXt2YXIgdT1udWxsO2s9MDtmb3IocT0xO3E8YyhuKTsrK3EpaWYoYihuLHEpLnR5cGU9PT1yLmRvdHRlZF9uYW1lKXt1PUIoYSxiKG4scSkpO3ErKzticmVha31lbHNlIGlmKGIobixxKS50eXBlPT09ei5UX0RPVClrKys7ZWxzZSBpZihiKG4scSkudHlwZT09PXouVF9FTExJUFNJUylrKz0zO2Vsc2UgYnJlYWs7KytxO3N3aXRjaChiKG4scSkudHlwZSl7Y2FzZSB6LlRfU1RBUjpuPWIobixxKTticmVhaztjYXNlIHouVF9MUEFSOm49XG5iKG4scSsxKTtjKG4pO2JyZWFrO2Nhc2Ugci5pbXBvcnRfYXNfbmFtZXM6bj1iKG4scSk7cT1jKG4pO2lmKDA9PT1xJTIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ0cmFpbGluZyBjb21tYSBub3QgYWxsb3dlZCB3aXRob3V0IHN1cnJvdW5kaW5nIHBhcmVudGhlc2VzXCIsYS5jX2ZpbGVuYW1lLG4ubGluZW5vKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiVW5leHBlY3RlZCBub2RlLXR5cGUgaW4gZnJvbS1pbXBvcnRcIixhLmNfZmlsZW5hbWUsbi5saW5lbm8pO31xPVtdO2lmKG4udHlwZT09PXouVF9TVEFSKXFbMF09QihhLG4pO2Vsc2UgZm9yKHA9MDtwPGMobik7cCs9MilxW3AvMl09QihhLGIobixwKSk7YT11P3UubmFtZS52OlwiXCI7YT1uZXcgU2suYXN0bm9kZXMuSW1wb3J0RnJvbShsKGEpLHEsayxtLGQpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ1bmtub3duIGltcG9ydCBzdGF0ZW1lbnRcIixcbmEuY19maWxlbmFtZSxuLmxpbmVubyk7cmV0dXJuIGE7Y2FzZSByLmdsb2JhbF9zdG10OmE9ZDtkPVtdO2UoYSxyLmdsb2JhbF9zdG10KTtmb3Ioaz0xO2s8YyhhKTtrKz0yKWRbKGstMSkvMl09bChiKGEsaykudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuR2xvYmFsKGQsYS5saW5lbm8sYS5jb2xfb2Zmc2V0KTtjYXNlIHIubm9ubG9jYWxfc3RtdDpmKGEsZCxcIk5vdCBpbXBsZW1lbnRlZDogbm9ubG9jYWxcIik7YnJlYWs7Y2FzZSByLmFzc2VydF9zdG10OnJldHVybiBrPWQsZShrLHIuYXNzZXJ0X3N0bXQpLDI9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLkFzc2VydCh3KGEsYihrLDEpKSxudWxsLGsubGluZW5vLGsuY29sX29mZnNldCk6ND09PWMoayk/YT1uZXcgU2suYXN0bm9kZXMuQXNzZXJ0KHcoYSxiKGssMSkpLHcoYSxiKGssMykpLGsubGluZW5vLGsuY29sX29mZnNldCk6KFNrLmFzc2VydHMuZmFpbChcImltcHJvcGVyIG51bWJlciBvZiBwYXJ0cyB0byBhc3NlcnQgc3RtdFwiKSxcbmE9dm9pZCAwKSxhO2Nhc2Ugci5wcmludF9zdG10Oms9ZDtTay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uJiZmKGEsayxcIk1pc3NpbmcgcGFyZW50aGVzZXMgaW4gY2FsbCB0byAncHJpbnQnXCIpO249MTttPW51bGw7ZShrLHIucHJpbnRfc3RtdCk7Mjw9YyhrKSYmYihrLDEpLnR5cGU9PT16LlRfUklHSFRTSElGVCYmKG09dyhhLGIoaywyKSksbj00KTtkPVtdO2Zvcih1PTA7bjxjKGspO24rPTIsKyt1KWRbdV09dyhhLGIoayxuKSk7YT1iKGssYyhrKS0xKS50eXBlPT09ei5UX0NPTU1BPyExOiEwO3JldHVybiBuZXcgU2suYXN0bm9kZXMuUHJpbnQobSxkLGEsay5saW5lbm8say5jb2xfb2Zmc2V0KTtjYXNlIHIuZGVidWdnZXJfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkRlYnVnZ2VyKGQubGluZW5vLGQuY29sX29mZnNldCk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgc21hbGxfc3RtdFwiKX1lbHNlIHN3aXRjaChrPWIoZCwwKSxlKGQsci5jb21wb3VuZF9zdG10KSxcbmsudHlwZSl7Y2FzZSByLmlmX3N0bXQ6ZShrLHIuaWZfc3RtdCk7aWYoND09PWMoaykpYT1uZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoaywxKSksdChhLGIoaywzKSksW10say5saW5lbm8say5jb2xfb2Zmc2V0KTtlbHNlIGlmKGQ9YihrLDQpLnZhbHVlLmNoYXJBdCgyKSxcInNcIj09PWQpYT1uZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoaywxKSksdChhLGIoaywzKSksdChhLGIoayw2KSksay5saW5lbm8say5jb2xfb2Zmc2V0KTtlbHNlIGlmKFwiaVwiPT09ZCl7bT1jKGspLTQ7bj0hMTtkPVtdO2IoayxtKzEpLnR5cGU9PT16LlRfTkFNRSYmXCJzXCI9PT1iKGssbSsxKS52YWx1ZS5jaGFyQXQoMikmJihuPSEwLG0tPTMpO20vPTQ7biYmKGQ9W25ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLGMoayktNikpLHQoYSxiKGssYyhrKS00KSksdChhLGIoayxjKGspLTEpKSxiKGssYyhrKS02KS5saW5lbm8sYihrLGMoayktNikuY29sX29mZnNldCldLG0tLSk7Zm9yKHU9MDt1PG07Kyt1KW49NSs0KlxuKG0tdS0xKSxkPVtuZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoayxuKSksdChhLGIoayxuKzIpKSxkLGIoayxuKS5saW5lbm8sYihrLG4pLmNvbF9vZmZzZXQpXTthPW5ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxkLGsubGluZW5vLGsuY29sX29mZnNldCl9ZWxzZSBTay5hc3NlcnRzLmZhaWwoXCJ1bmV4cGVjdGVkIHRva2VuIGluICdpZicgc3RhdGVtZW50XCIpLGE9dm9pZCAwO3JldHVybiBhO2Nhc2Ugci53aGlsZV9zdG10OnJldHVybiBlKGssci53aGlsZV9zdG10KSw0PT09YyhrKT9hPW5ldyBTay5hc3Rub2Rlcy5XaGlsZSh3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxbXSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpOjc9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLldoaWxlKHcoYSxiKGssMSkpLHQoYSxiKGssMykpLHQoYSxiKGssNikpLGsubGluZW5vLGsuY29sX29mZnNldCk6KFNrLmFzc2VydHMuZmFpbChcIndyb25nIG51bWJlciBvZiB0b2tlbnMgZm9yICd3aGlsZScgc3RtdFwiKSxcbmE9dm9pZCAwKSxhO2Nhc2Ugci5mb3Jfc3RtdDpyZXR1cm4gZD1bXSxlKGssci5mb3Jfc3RtdCksOT09PWMoaykmJihkPXQoYSxiKGssOCkpKSxuPWIoaywxKSxtPXYoYSxuLFNrLmFzdG5vZGVzLlN0b3JlKSxtPTE9PT1jKG4pP21bMF06bmV3IFNrLmFzdG5vZGVzLlR1cGxlKG0sU2suYXN0bm9kZXMuU3RvcmUsay5saW5lbm8say5jb2xfb2Zmc2V0KSxuZXcgU2suYXN0bm9kZXMuRm9yKG0sVyhhLGIoaywzKSksdChhLGIoayw1KSksZCxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Nhc2Ugci50cnlfc3RtdDpkPVtdO3A9YyhrKTttPShwLTMpLzM7dT1bXTtxPW51bGw7ZShrLHIudHJ5X3N0bXQpO249dChhLGIoaywyKSk7aWYoYihrLHAtMykudHlwZT09PXouVF9OQU1FKVwiZmluYWxseVwiPT09YihrLHAtMykudmFsdWU/KDk8PXAmJmIoayxwLTYpLnR5cGU9PT16LlRfTkFNRSYmKHU9dChhLGIoayxwLTQpKSxtLS0pLHE9dChhLGIoayxwLTEpKSk6dT10KGEsYihrLHAtMSkpLG0tLTtlbHNlIGlmKGIoayxcbnAtMykudHlwZSE9PXIuZXhjZXB0X2NsYXVzZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm1hbGZvcm1lZCAndHJ5JyBzdGF0ZW1lbnRcIixhLmNfZmlsZW5hbWUsay5saW5lbm8pO2lmKDA8bSlmb3IocD0wO3A8bTtwKyspe3ZhciBBPXA7dmFyIHg9YSx5PWIoaywzKzMqcCksRD1iKGssNSszKnApO2UoeSxyLmV4Y2VwdF9jbGF1c2UpO2UoRCxyLnN1aXRlKTtpZigxPT09Yyh5KSl2YXIgRT1uZXcgU2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlcihudWxsLG51bGwsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCk7ZWxzZSAyPT09Yyh5KT9FPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKHcoeCxiKHksMSkpLG51bGwsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCk6ND09PWMoeSk/KFNrLl9fZnV0dXJlX18ucHl0aG9uMyYmXCIsXCI9PWIoeSwyKS52YWx1ZSYmZih4LHksXCJPbGQtc3R5bGUgJ2V4Y2VwdCcgY2xhdXNlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gM1wiKSxcbncoeCxiKHksMSkpLEU9dyh4LGIoeSwzKSksZyh4LEUsU2suYXN0bm9kZXMuU3RvcmUsYih5LDMpKSxFPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKHcoeCxiKHksMSkpLEUsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCkpOihTay5hc3NlcnRzLmZhaWwoXCJ3cm9uZyBudW1iZXIgb2YgY2hpbGRyZW4gZm9yIGV4Y2VwdCBjbGF1c2VcIiksRT12b2lkIDApO2RbQV09RX1Tay5hc3NlcnRzLmFzc2VydCghIXF8fDAhPWQubGVuZ3RoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlRyeShuLGQsdSxxLGsubGluZW5vLGsuY29sX29mZnNldCk7Y2FzZSByLndpdGhfc3RtdDpkPVtdO2UoayxyLndpdGhfc3RtdCk7Zm9yKG09MTttPGMoayktMjttKz0yKW49dm9pZCAwLHE9YSxwPWIoayxtKSxlKHAsci53aXRoX2l0ZW0pLHU9dyhxLGIocCwwKSksMz09YyhwKSYmKG49dyhxLGIocCwyKSksZyhxLG4sU2suYXN0bm9kZXMuU3RvcmUscCkpLG49bmV3IFNrLmFzdG5vZGVzLndpdGhpdGVtKHUsXG5uKSxkWyhtLTEpLzJdPW47YT10KGEsYihrLGMoayktMSkpO2E9bmV3IFNrLmFzdG5vZGVzLldpdGgoZCxhLGsubGluZW5vLGsuY29sX29mZnNldCk7cmV0dXJuIGE7Y2FzZSByLmZ1bmNkZWY6cmV0dXJuIFQoYSxrLFtdLCExKTtjYXNlIHIuY2xhc3NkZWY6cmV0dXJuIFAoYSxrLFtdKTtjYXNlIHIuZGVjb3JhdGVkOm09bnVsbDtlKGssci5kZWNvcmF0ZWQpO249YihrLDApO2UobixyLmRlY29yYXRvcnMpO2Q9W107Zm9yKHU9MDt1PGMobik7Kyt1KXtxPWQ7cD11O0E9YTtFPWIobix1KTtlKEUsci5kZWNvcmF0b3IpO2UoYihFLDApLHouVF9BVCk7ZShiKEUsYyhFKS0xKSx6LlRfTkVXTElORSk7dmFyIEMsRz1iKEUsMSk7ZShHLHIuZG90dGVkX25hbWUpO3g9Ry5saW5lbm87eT1HLmNvbF9vZmZzZXQ7RD1sKGIoRywwKS52YWx1ZSk7dmFyIE09bmV3IFNrLmFzdG5vZGVzLk5hbWUoRCxTay5hc3Rub2Rlcy5Mb2FkLHgseSk7Zm9yKEM9MjtDPGMoRyk7Qys9MilEPWwoYihHLEMpLnZhbHVlKSxcbk09bmV3IFNrLmFzdG5vZGVzLkF0dHJpYnV0ZShNLEQsU2suYXN0bm9kZXMuTG9hZCx4LHkpO3g9TTtBPTM9PT1jKEUpP3g6NT09PWMoRSk/bmV3IFNrLmFzdG5vZGVzLkNhbGwoeCxbXSxbXSxudWxsLG51bGwsRS5saW5lbm8sRS5jb2xfb2Zmc2V0KTpGKEEsYihFLDMpLHgpO3FbcF09QX1Tay5hc3NlcnRzLmFzc2VydChiKGssMSkudHlwZT09ci5mdW5jZGVmfHxiKGssMSkudHlwZT09ci5hc3luY19mdW5jZGVmfHxiKGssMSkudHlwZT09ci5jbGFzc2RlZik7YihrLDEpLnR5cGU9PXIuZnVuY2RlZj8obT1iKGssMSksbT1UKGEsbSxkLCExKSk6YihrLDEpLnR5cGU9PXIuY2xhc3NkZWY/bT1QKGEsYihrLDEpLGQpOmIoaywxKS50eXBlPT1yLmFzeW5jX2Z1bmNkZWYmJihtPWIoaywxKSxlKG0sci5hc3luY19mdW5jZGVmKSxlKGIobSwwKSx6LlRfTkFNRSksU2suYXNzZXJ0cy5hc3NlcnQoKFwiYXN5bmNcIj09PWIobSwwKSkudmFsdWUpLGUoYihtLDEpLHIuZnVuY2RlZiksbT1UKGEsbSxkLFxuITApKTttJiYobS5saW5lbm89ay5saW5lbm8sbS5jb2xfb2Zmc2V0PWsuY29sX29mZnNldCk7cmV0dXJuIG07Y2FzZSByLmFzeW5jX3N0bXQ6ZihhLGssXCJOb3QgaW1wbGVtZW50ZWQ6IGFzeW5jXCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5hc3NlcnQoXCJ1bmhhbmRsZWQgY29tcG91bmRfc3RtdFwiKX19dmFyIHI9U2suUGFyc2VUYWJsZXMuc3ltLHo9U2sudG9rZW4udG9rZW5zLFo9e1NsaWNlX2tpbmQ6MSxFeHRTbGljZV9raW5kOjIsSW5kZXhfa2luZDozfSxPPXt9O09bei5UX1ZCQVJdPVNrLmFzdG5vZGVzLkJpdE9yO09bei5UX0NJUkNVTUZMRVhdPVNrLmFzdG5vZGVzLkJpdFhvcjtPW3ouVF9BTVBFUl09U2suYXN0bm9kZXMuQml0QW5kO09bei5UX0xFRlRTSElGVF09U2suYXN0bm9kZXMuTFNoaWZ0O09bei5UX1JJR0hUU0hJRlRdPVNrLmFzdG5vZGVzLlJTaGlmdDtPW3ouVF9QTFVTXT1Tay5hc3Rub2Rlcy5BZGQ7T1t6LlRfTUlOVVNdPVNrLmFzdG5vZGVzLlN1YjtPW3ouVF9TVEFSXT1cblNrLmFzdG5vZGVzLk11bHQ7T1t6LlRfU0xBU0hdPVNrLmFzdG5vZGVzLkRpdjtPW3ouVF9ET1VCTEVTTEFTSF09U2suYXN0bm9kZXMuRmxvb3JEaXY7T1t6LlRfUEVSQ0VOVF09U2suYXN0bm9kZXMuTW9kO1NrLnNldHVwT3BlcmF0b3JzPWZ1bmN0aW9uKGEpe2E/T1t6LlRfQVRdPVNrLmFzdG5vZGVzLk1hdE11bHQ6T1t6LlRfQVRdJiZkZWxldGUgT1t6LlRfQVRdfTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cE9wZXJhdG9yc1wiLFNrLnNldHVwT3BlcmF0b3JzKTtjb25zdCBmYT0vX1tlRV18W2VFXV98XFwuX3xqXy8saGE9L19cXC58WystXV98XjBfXFxEfF9qLyxpYT0vXyg/PVteX10pL2c7U2suYXN0RnJvbVBhcnNlPWZ1bmN0aW9uKGQsZyxmKXt2YXIgayxuPW5ldyBhKFwidXRmLThcIixnLGYpLHA9W10sbD0wO3N3aXRjaChkLnR5cGUpe2Nhc2Ugci5maWxlX2lucHV0OmZvcihrPTA7azxjKGQpLTE7KytrKXt2YXIgbT1iKGQsayk7aWYoZC50eXBlIT09ei5UX05FV0xJTkUpaWYoZShtLHIuc3RtdCksXG5mPWgobSksMT09PWYpcFtsKytdPU4obixtKTtlbHNlIGZvcihtPWIobSwwKSxlKG0sci5zaW1wbGVfc3RtdCksZz0wO2c8ZjsrK2cpcFtsKytdPU4obixiKG0sMipnKSl9cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Nb2R1bGUocCk7Y2FzZSByLmV2YWxfaW5wdXQ6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIik7Y2FzZSByLnNpbmdsZV9pbnB1dDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvO1wiKTtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInRvZG87XCIpfX07U2suYXN0RHVtcD1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXt2YXIgYixjPVwiXCI7Zm9yKGI9MDtiPGE7KytiKWMrPVwiIFwiO3JldHVybiBjfSxjPWZ1bmN0aW9uKGEsZCl7dmFyIGU7aWYobnVsbD09PWEpcmV0dXJuIGQrXCJOb25lXCI7aWYoYS5wcm90b3R5cGUmJnZvaWQgMCE9PWEucHJvdG90eXBlLl9hc3RuYW1lJiZhLnByb3RvdHlwZS5faXNlbnVtKXJldHVybiBkK2EucHJvdG90eXBlLl9hc3RuYW1lK1wiKClcIjtpZih2b2lkIDAhPT1cbmEuX2FzdG5hbWUpe3ZhciBnPWIoYS5fYXN0bmFtZS5sZW5ndGgrMSk7dmFyIGY9W107Zm9yKGU9MDtlPGEuX2ZpZWxkcy5sZW5ndGg7ZSs9Mil7dmFyIGg9YS5fZmllbGRzW2VdO3ZhciBrPWEuX2ZpZWxkc1tlKzFdKGEpO3ZhciBuPWIoaC5sZW5ndGgrMSk7Zi5wdXNoKFtoLGMoayxkK2crbildKX1rPVtdO2ZvcihlPTA7ZTxmLmxlbmd0aDsrK2Upbj1mW2VdLGsucHVzaChuWzBdK1wiPVwiK25bMV0ucmVwbGFjZSgvXlxccysvLFwiXCIpKTtlPWsuam9pbihcIixcXG5cIitkK2cpO3JldHVybiBkK2EuX2FzdG5hbWUrXCIoXCIrZStcIilcIn1pZihTay5pc0FycmF5TGlrZShhKSl7Zz1bXTtmb3IoZT0wO2U8YS5sZW5ndGg7KytlKWY9YVtlXSxnLnB1c2goYyhmLGQrXCIgXCIpKTthPWcuam9pbihcIixcXG5cIik7cmV0dXJuIGQrXCJbXCIrYS5yZXBsYWNlKC9eXFxzKy8sXCJcIikrXCJdXCJ9YT0hMD09PWE/XCJUcnVlXCI6ITE9PT1hP1wiRmFsc2VcIjphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmc/YS50cCRzdHIoKS52OmEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zdHI/YS4kcigpLnY6XCJcIithO3JldHVybiBkK2F9O3JldHVybiBjKGEsXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFzdEZyb21QYXJzZVwiLFNrLmFzdEZyb21QYXJzZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYXN0RHVtcFwiLFNrLmFzdER1bXApfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMuX19uYW1lPWE7dGhpcy5fX2ZsYWdzPWI7dGhpcy5fX3Njb3BlPWI+PjExJjc7dGhpcy5fX25hbWVzcGFjZXM9Y3x8W119ZnVuY3Rpb24gYyhhLGIsYyxlLGYpe3RoaXMuc3ltRmxhZ3M9e307dGhpcy5uYW1lPWI7dGhpcy52YXJuYW1lcz1bXTt0aGlzLmNoaWxkcmVuPVtdO3RoaXMuYmxvY2tUeXBlPWM7dGhpcy5yZXR1cm5zVmFsdWU9dGhpcy52YXJrZXl3b3Jkcz10aGlzLnZhcmFyZ3M9dGhpcy5nZW5lcmF0b3I9dGhpcy5jaGlsZEhhc0ZyZWU9dGhpcy5oYXNGcmVlPXRoaXMuaXNOZXN0ZWQ9ITE7dGhpcy5saW5lbm89Zjt0aGlzLnRhYmxlPWE7YS5jdXImJlxuKGEuY3VyLm5lc3RlZHx8XCJmdW5jdGlvblwiPT09YS5jdXIuYmxvY2tUeXBlKSYmKHRoaXMuaXNOZXN0ZWQ9ITApO2Uuc2NvcGVJZD1sKys7YS5zdHNzW2Uuc2NvcGVJZF09dGhpczt0aGlzLnN5bWJvbHM9e319ZnVuY3Rpb24gYihhKXt0aGlzLmZpbGVuYW1lPWE7dGhpcy50b3A9dGhpcy5jdXI9bnVsbDt0aGlzLnN0YWNrPVtdO3RoaXMuY3VyQ2xhc3M9dGhpcy5nbG9iYWw9bnVsbDt0aGlzLnRtcG5hbWU9MDt0aGlzLnN0c3M9e319ZnVuY3Rpb24gZShhLGIpe3ZhciBjO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYShiW2NdKX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjIGluIGIpYVtjXT1iW2NdfVNrLmV4cG9ydFN5bWJvbChcIlNrLlNZTVRBQl9DT05TVFNcIix7REVGX0dMT0JBTDoxLERFRl9MT0NBTDoyLERFRl9QQVJBTTo0LFVTRTo4LERFRl9TVEFSOjE2LERFRl9ET1VCTEVTVEFSOjMyLERFRl9JTlRVUExFOjY0LERFRl9GUkVFOjEyOCxERUZfRlJFRV9HTE9CQUw6MjU2LERFRl9GUkVFX0NMQVNTOjUxMixcbkRFRl9JTVBPUlQ6MTAyNCxERUZfQk9VTkQ6MTAzMCxTQ09QRV9PRkY6MTEsU0NPUEVfTUFTSzo3LExPQ0FMOjEsR0xPQkFMX0VYUExJQ0lUOjIsR0xPQkFMX0lNUExJQ0lUOjMsRlJFRTo0LENFTEw6NSxPUFRfSU1QT1JUX1NUQVI6MSxPUFRfRVhFQzoyLE9QVF9CQVJFX0VYRUM6NCxPUFRfVE9QTEVWRUw6OCxHRU5FUkFUT1I6MixHRU5FUkFUT1JfRVhQUkVTU0lPTjoyLE1vZHVsZUJsb2NrOlwibW9kdWxlXCIsRnVuY3Rpb25CbG9jazpcImZ1bmN0aW9uXCIsQ2xhc3NCbG9jazpcImNsYXNzXCJ9KTthLnByb3RvdHlwZS5nZXRfbmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZX07YS5wcm90b3R5cGUuaXNfcmVmZXJlbmNlZD1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMuX19mbGFncyY4KX07YS5wcm90b3R5cGUuaXNfcGFyYW1ldGVyPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjQpfTthLnByb3RvdHlwZS5pc19nbG9iYWw9ZnVuY3Rpb24oKXtyZXR1cm4gMz09PXRoaXMuX19zY29wZXx8XG4yPT10aGlzLl9fc2NvcGV9O2EucHJvdG90eXBlLmlzX2RlY2xhcmVkX2dsb2JhbD1mdW5jdGlvbigpe3JldHVybiAyPT10aGlzLl9fc2NvcGV9O2EucHJvdG90eXBlLmlzX2xvY2FsPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjEwMzApfTthLnByb3RvdHlwZS5pc19mcmVlPWZ1bmN0aW9uKCl7cmV0dXJuIDQ9PXRoaXMuX19zY29wZX07YS5wcm90b3R5cGUuaXNfaW1wb3J0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmMTAyNCl9O2EucHJvdG90eXBlLmlzX2Fzc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjIpfTthLnByb3RvdHlwZS5pc19uYW1lc3BhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX25hbWVzcGFjZXMmJjA8dGhpcy5fX25hbWVzcGFjZXMubGVuZ3RofTthLnByb3RvdHlwZS5nZXRfbmFtZXNwYWNlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZXNwYWNlc307dmFyIGw9MDtjLnByb3RvdHlwZS5nZXRfdHlwZT1cbmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmxvY2tUeXBlfTtjLnByb3RvdHlwZS5nZXRfbmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9O2MucHJvdG90eXBlLmdldF9saW5lbm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saW5lbm99O2MucHJvdG90eXBlLmlzX25lc3RlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmVzdGVkfTtjLnByb3RvdHlwZS5oYXNfY2hpbGRyZW49ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmNoaWxkcmVuLmxlbmd0aH07Yy5wcm90b3R5cGUuZ2V0X2lkZW50aWZpZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKCl7cmV0dXJuITB9KX07Yy5wcm90b3R5cGUubG9va3VwPWZ1bmN0aW9uKGIpe2lmKHRoaXMuc3ltYm9scy5oYXNPd25Qcm9wZXJ0eShiKSliPXRoaXMuc3ltYm9sc1tiXTtlbHNle3ZhciBjPXRoaXMuc3ltRmxhZ3NbYl07dmFyIGU9dGhpcy5fX2NoZWNrX2NoaWxkcmVuKGIpO2I9dGhpcy5zeW1ib2xzW2JdPVxubmV3IGEoYixjLGUpfXJldHVybiBifTtjLnByb3RvdHlwZS5fX2NoZWNrX2NoaWxkcmVuPWZ1bmN0aW9uKGEpe3ZhciBiLGM9W107Zm9yKGI9MDtiPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysrYil7dmFyIGU9dGhpcy5jaGlsZHJlbltiXTtlLm5hbWU9PT1hJiZjLnB1c2goZSl9cmV0dXJuIGN9O2MucHJvdG90eXBlLl9pZGVudHNNYXRjaGluZz1mdW5jdGlvbihhKXt2YXIgYixjPVtdO2ZvcihiIGluIHRoaXMuc3ltRmxhZ3MpdGhpcy5zeW1GbGFncy5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLnN5bUZsYWdzW2JdKSYmYy5wdXNoKGIpO2Muc29ydCgpO3JldHVybiBjfTtjLnByb3RvdHlwZS5nZXRfcGFyYW1ldGVycz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X3BhcmFtZXRlcnMgb25seSB2YWxpZCBmb3IgZnVuY3Rpb24gc2NvcGVzXCIpO3RoaXMuX2Z1bmNQYXJhbXN8fCh0aGlzLl9mdW5jUGFyYW1zPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe3JldHVybiBhJlxuNH0pKTtyZXR1cm4gdGhpcy5fZnVuY1BhcmFtc307Yy5wcm90b3R5cGUuZ2V0X2xvY2Fscz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X2xvY2FscyBvbmx5IHZhbGlkIGZvciBmdW5jdGlvbiBzY29wZXNcIik7dGhpcy5fZnVuY0xvY2Fsc3x8KHRoaXMuX2Z1bmNMb2NhbHM9dGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oYSl7cmV0dXJuIGEmMTAzMH0pKTtyZXR1cm4gdGhpcy5fZnVuY0xvY2Fsc307Yy5wcm90b3R5cGUuZ2V0X2dsb2JhbHM9ZnVuY3Rpb24oKXtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9nbG9iYWxzIG9ubHkgdmFsaWQgZm9yIGZ1bmN0aW9uIHNjb3Blc1wiKTt0aGlzLl9mdW5jR2xvYmFsc3x8KHRoaXMuX2Z1bmNHbG9iYWxzPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe2E9YT4+MTEmNztyZXR1cm4gMz09YXx8Mj09YX0pKTtyZXR1cm4gdGhpcy5fZnVuY0dsb2JhbHN9O1xuYy5wcm90b3R5cGUuZ2V0X2ZyZWVzPWZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT10aGlzLmdldF90eXBlKCksXCJnZXRfZnJlZXMgb25seSB2YWxpZCBmb3IgZnVuY3Rpb24gc2NvcGVzXCIpO3RoaXMuX2Z1bmNGcmVlc3x8KHRoaXMuX2Z1bmNGcmVlcz10aGlzLl9pZGVudHNNYXRjaGluZyhmdW5jdGlvbihhKXtyZXR1cm4gND09KGE+PjExJjcpfSkpO3JldHVybiB0aGlzLl9mdW5jRnJlZXN9O2MucHJvdG90eXBlLmdldF9tZXRob2RzPWZ1bmN0aW9uKCl7dmFyIGE7U2suYXNzZXJ0cy5hc3NlcnQoXCJjbGFzc1wiPT10aGlzLmdldF90eXBlKCksXCJnZXRfbWV0aG9kcyBvbmx5IHZhbGlkIGZvciBjbGFzcyBzY29wZXNcIik7aWYoIXRoaXMuX2NsYXNzTWV0aG9kcyl7dmFyIGI9W107Zm9yKGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysrYSliLnB1c2godGhpcy5jaGlsZHJlblthXS5uYW1lKTtiLnNvcnQoKTt0aGlzLl9jbGFzc01ldGhvZHM9Yn1yZXR1cm4gdGhpcy5fY2xhc3NNZXRob2RzfTtcbmMucHJvdG90eXBlLmdldFNjb3BlPWZ1bmN0aW9uKGEpe2E9dGhpcy5zeW1GbGFnc1thXTtyZXR1cm4gdm9pZCAwPT09YT8wOmE+PjExJjd9O2IucHJvdG90eXBlLmdldFN0c0ZvckFzdD1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLnNjb3BlSWQsXCJhc3Qgd2Fzbid0IGFkZGVkIHRvIHN0P1wiKTthPXRoaXMuc3Rzc1thLnNjb3BlSWRdO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJ1bmtub3duIHN5bSB0YWIgZW50cnlcIik7cmV0dXJuIGF9O2IucHJvdG90eXBlLlNFUVN0bXQ9ZnVuY3Rpb24oYSl7dmFyIGIsYztpZihudWxsIT09YSl7U2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoYSksXCJTRVE6IG5vZGVzIGlzbid0IGFycmF5PyBnb3QgXCIrYS50b1N0cmluZygpKTt2YXIgZT1hLmxlbmd0aDtmb3IoYz0wO2M8ZTsrK2MpKGI9YVtjXSkmJnRoaXMudmlzaXRTdG10KGIpfX07Yi5wcm90b3R5cGUuU0VRRXhwcj1mdW5jdGlvbihhKXt2YXIgYixcbmM7aWYobnVsbCE9PWEpe1NrLmFzc2VydHMuYXNzZXJ0KFNrLmlzQXJyYXlMaWtlKGEpLFwiU0VROiBub2RlcyBpc24ndCBhcnJheT8gZ290IFwiK2EudG9TdHJpbmcoKSk7dmFyIGU9YS5sZW5ndGg7Zm9yKGM9MDtjPGU7KytjKShiPWFbY10pJiZ0aGlzLnZpc2l0RXhwcihiKX19O2IucHJvdG90eXBlLmVudGVyQmxvY2s9ZnVuY3Rpb24oYSxiLGUsZil7YT1Tay5maXhSZXNlcnZlZChhKTt2YXIgZD1udWxsO3RoaXMuY3VyJiYoZD10aGlzLmN1cix0aGlzLnN0YWNrLnB1c2godGhpcy5jdXIpKTt0aGlzLmN1cj1uZXcgYyh0aGlzLGEsYixlLGYpO1widG9wXCI9PT1hJiYodGhpcy5nbG9iYWw9dGhpcy5jdXIuc3ltRmxhZ3MpO2QmJmQuY2hpbGRyZW4ucHVzaCh0aGlzLmN1cil9O2IucHJvdG90eXBlLmV4aXRCbG9jaz1mdW5jdGlvbigpe3RoaXMuY3VyPW51bGw7MDx0aGlzLnN0YWNrLmxlbmd0aCYmKHRoaXMuY3VyPXRoaXMuc3RhY2sucG9wKCkpfTtiLnByb3RvdHlwZS52aXNpdFBhcmFtcz1cbmZ1bmN0aW9uKGEsYil7dmFyIGM7Zm9yKGM9MDtjPGEubGVuZ3RoOysrYylpZihiPWFbY10sYi5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLmFyZyl0aGlzLmFkZERlZihiLmFyZyw0LGIubGluZW5vKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBleHByZXNzaW9uIGluIHBhcmFtZXRlciBsaXN0XCIsdGhpcy5maWxlbmFtZSk7fTtiLnByb3RvdHlwZS52aXNpdEFyZ3VtZW50cz1mdW5jdGlvbihhLGIpe2EuYXJncyYmdGhpcy52aXNpdFBhcmFtcyhhLmFyZ3MsITApO2Eua3dvbmx5YXJncyYmdGhpcy52aXNpdFBhcmFtcyhhLmt3b25seWFyZ3MsITApO2EudmFyYXJnJiYodGhpcy5hZGREZWYoYS52YXJhcmcuYXJnLDQsYiksdGhpcy5jdXIudmFyYXJncz0hMCk7YS5rd2FyZyYmKHRoaXMuYWRkRGVmKGEua3dhcmcuYXJnLDQsYiksdGhpcy5jdXIudmFya2V5d29yZHM9ITApfTtiLnByb3RvdHlwZS5uZXdUbXBuYW1lPWZ1bmN0aW9uKGEpe3RoaXMuYWRkRGVmKG5ldyBTay5idWlsdGluLnN0cihcIl9bXCIrXG4rK3RoaXMudG1wbmFtZStcIl1cIiksMixhKX07Yi5wcm90b3R5cGUuYWRkRGVmPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1Tay5tYW5nbGVOYW1lKHRoaXMuY3VyQ2xhc3MsYSkudjtkPVNrLmZpeFJlc2VydmVkKGQpO3ZhciBlPXRoaXMuY3VyLnN5bUZsYWdzW2RdO2lmKHZvaWQgMCE9PWUpe2lmKGImNCYmZSY0KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiZHVwbGljYXRlIGFyZ3VtZW50ICdcIithLnYrXCInIGluIGZ1bmN0aW9uIGRlZmluaXRpb25cIix0aGlzLmZpbGVuYW1lLGMpO2V8PWJ9ZWxzZSBlPWI7dGhpcy5jdXIuc3ltRmxhZ3NbZF09ZTtiJjQ/dGhpcy5jdXIudmFybmFtZXMucHVzaChkKTpiJjEmJihlPWIsYT10aGlzLmdsb2JhbFtkXSx2b2lkIDAhPT1hJiYoZXw9YSksdGhpcy5nbG9iYWxbZF09ZSl9O2IucHJvdG90eXBlLnZpc2l0U2xpY2U9ZnVuY3Rpb24oYSl7dmFyIGI7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuU2xpY2U6YS5sb3dlciYmXG50aGlzLnZpc2l0RXhwcihhLmxvd2VyKTthLnVwcGVyJiZ0aGlzLnZpc2l0RXhwcihhLnVwcGVyKTthLnN0ZXAmJnRoaXMudmlzaXRFeHByKGEuc3RlcCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5FeHRTbGljZTpmb3IoYj0wO2I8YS5kaW1zLmxlbmd0aDsrK2IpdGhpcy52aXNpdFNsaWNlKGEuZGltc1tiXSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5JbmRleDp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKX19O2IucHJvdG90eXBlLnZpc2l0U3RtdD1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwidmlzaXRTdG10IGNhbGxlZCB3aXRoIHVuZGVmaW5lZFwiKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZjp0aGlzLmFkZERlZihhLm5hbWUsMixhLmxpbmVubyk7YS5hcmdzLmRlZmF1bHRzJiZ0aGlzLlNFUUV4cHIoYS5hcmdzLmRlZmF1bHRzKTthLmRlY29yYXRvcl9saXN0JiZ0aGlzLlNFUUV4cHIoYS5kZWNvcmF0b3JfbGlzdCk7XG50aGlzLmVudGVyQmxvY2soYS5uYW1lLnYsXCJmdW5jdGlvblwiLGEsYS5saW5lbm8pO3RoaXMudmlzaXRBcmd1bWVudHMoYS5hcmdzLGEubGluZW5vKTt0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ2xhc3NEZWY6dGhpcy5hZGREZWYoYS5uYW1lLDIsYS5saW5lbm8pO3RoaXMuU0VRRXhwcihhLmJhc2VzKTthLmRlY29yYXRvcl9saXN0JiZ0aGlzLlNFUUV4cHIoYS5kZWNvcmF0b3JfbGlzdCk7dGhpcy5lbnRlckJsb2NrKGEubmFtZS52LFwiY2xhc3NcIixhLGEubGluZW5vKTt0aGlzLmN1ckNsYXNzPWEubmFtZTt0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmV0dXJuOmlmKGEudmFsdWUmJih0aGlzLnZpc2l0RXhwcihhLnZhbHVlKSx0aGlzLmN1ci5yZXR1cm5zVmFsdWU9ITAsdGhpcy5jdXIuZ2VuZXJhdG9yKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidyZXR1cm4nIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvclwiLFxudGhpcy5maWxlbmFtZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWxldGU6dGhpcy5TRVFFeHByKGEudGFyZ2V0cyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NpZ246dGhpcy5TRVFFeHByKGEudGFyZ2V0cyk7dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bbm5Bc3NpZ246aWYoYS50YXJnZXQuY29uc3RydWN0b3I9PVNrLmFzdG5vZGVzLk5hbWUpe3ZhciBjPWEudGFyZ2V0O3ZhciBmPVNrLm1hbmdsZU5hbWUodGhpcy5jdXJDbGFzcyxjLmlkKS52O2Y9U2suZml4UmVzZXJ2ZWQoZik7Yz10aGlzLmN1ci5zeW1GbGFnc1tmXTtpZihjJjIwNDkmJnRoaXMuZ2xvYmFsIT10aGlzLmN1ci5zeW1GbGFncyYmYS5zaW1wbGUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhbm5vdGF0ZWQgbmFtZSAnXCIrZitcIicgY2FuJ3QgYmUgZ2xvYmFsXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YS5zaW1wbGU/dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLFxuNDA5OCxhLmxpbmVubyk6YS52YWx1ZSYmdGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLDIsYS5saW5lbm8pfWVsc2UgdGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEuYW5ub3RhdGlvbik7YS52YWx1ZSYmdGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5BdWdBc3NpZ246dGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUHJpbnQ6YS5kZXN0JiZ0aGlzLnZpc2l0RXhwcihhLmRlc3QpO3RoaXMuU0VRRXhwcihhLnZhbHVlcyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3I6dGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEuaXRlcik7dGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5XaGlsZTp0aGlzLnZpc2l0RXhwcihhLnRlc3QpO1xudGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5JZjp0aGlzLnZpc2l0RXhwcihhLnRlc3QpO3RoaXMuU0VRU3RtdChhLmJvZHkpO2Eub3JlbHNlJiZ0aGlzLlNFUVN0bXQoYS5vcmVsc2UpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmFpc2U6YS5leGMmJih0aGlzLnZpc2l0RXhwcihhLmV4YyksYS5pbnN0JiYodGhpcy52aXNpdEV4cHIoYS5pbnN0KSxhLnRiYWNrJiZ0aGlzLnZpc2l0RXhwcihhLnRiYWNrKSksYS5jYXVzZSYmdGhpcy52aXNpdEV4cHIoYS5jYXVzZSkpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXNzZXJ0OnRoaXMudmlzaXRFeHByKGEudGVzdCk7YS5tc2cmJnRoaXMudmlzaXRFeHByKGEubXNnKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkltcG9ydDpjYXNlIFNrLmFzdG5vZGVzLkltcG9ydEZyb206dGhpcy52aXNpdEFsaWFzKGEubmFtZXMsYS5saW5lbm8pO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuR2xvYmFsOnZhciBrPVxuYS5uYW1lcy5sZW5ndGg7Zm9yKGI9MDtiPGs7KytiKXtmPVNrLm1hbmdsZU5hbWUodGhpcy5jdXJDbGFzcyxhLm5hbWVzW2JdKS52O2Y9U2suZml4UmVzZXJ2ZWQoZik7Yz10aGlzLmN1ci5zeW1GbGFnc1tmXTtpZihjJjEwKXtpZihjJjIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lICdcIitmK1wiJyBpcyBhc3NpZ25lZCB0byBiZWZvcmUgZ2xvYmFsIGRlY2xhcmF0aW9uXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lICdcIitmK1wiJyBpcyB1c2VkIHByaW9yIHRvIGdsb2JhbCBkZWNsYXJhdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO310aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoZiksMSxhLmxpbmVubyl9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5FeHByOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFzczpjYXNlIFNrLmFzdG5vZGVzLkJyZWFrOmNhc2UgU2suYXN0bm9kZXMuQ29udGludWU6Y2FzZSBTay5hc3Rub2Rlcy5EZWJ1Z2dlcjpicmVhaztcbmNhc2UgU2suYXN0bm9kZXMuV2l0aDplKHRoaXMudmlzaXRfd2l0aGl0ZW0uYmluZCh0aGlzKSxhLml0ZW1zKTtlKHRoaXMudmlzaXRTdG10LmJpbmQodGhpcyksYS5ib2R5KTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlRyeTp0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLnZpc2l0RXhjZXB0aGFuZGxlcnMoYS5oYW5kbGVycyk7dGhpcy5TRVFTdG10KGEub3JlbHNlKTt0aGlzLlNFUVN0bXQoYS5maW5hbGJvZHkpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiVW5oYW5kbGVkIHR5cGUgXCIrYS5jb25zdHJ1Y3Rvci5uYW1lK1wiIGluIHZpc2l0U3RtdFwiKX19O2IucHJvdG90eXBlLnZpc2l0X3dpdGhpdGVtPWZ1bmN0aW9uKGEpe3RoaXMudmlzaXRFeHByKGEuY29udGV4dF9leHByKTthLm9wdGlvbmFsX3ZhcnMmJnRoaXMudmlzaXRFeHByKGEub3B0aW9uYWxfdmFycyl9O2IucHJvdG90eXBlLnZpc2l0RXhwcj1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1cbmEsXCJ2aXNpdEV4cHIgY2FsbGVkIHdpdGggdW5kZWZpbmVkXCIpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDp0aGlzLlNFUUV4cHIoYS52YWx1ZXMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQmluT3A6dGhpcy52aXNpdEV4cHIoYS5sZWZ0KTt0aGlzLnZpc2l0RXhwcihhLnJpZ2h0KTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlVuYXJ5T3A6dGhpcy52aXNpdEV4cHIoYS5vcGVyYW5kKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxhbWJkYTp0aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoXCJsYW1iZGFcIiksMixhLmxpbmVubyk7YS5hcmdzLmRlZmF1bHRzJiZ0aGlzLlNFUUV4cHIoYS5hcmdzLmRlZmF1bHRzKTt0aGlzLmVudGVyQmxvY2soXCJsYW1iZGFcIixcImZ1bmN0aW9uXCIsYSxhLmxpbmVubyk7dGhpcy52aXNpdEFyZ3VtZW50cyhhLmFyZ3MsYS5saW5lbm8pO3RoaXMudmlzaXRFeHByKGEuYm9keSk7dGhpcy5leGl0QmxvY2soKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmRXhwOnRoaXMudmlzaXRFeHByKGEudGVzdCk7XG50aGlzLnZpc2l0RXhwcihhLmJvZHkpO3RoaXMudmlzaXRFeHByKGEub3JlbHNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3Q6dGhpcy5TRVFFeHByKGEua2V5cyk7dGhpcy5TRVFFeHByKGEudmFsdWVzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3RDb21wOmNhc2UgU2suYXN0bm9kZXMuU2V0Q29tcDp0aGlzLnZpc2l0Q29tcHJlaGVuc2lvbihhLmdlbmVyYXRvcnMsMCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0Q29tcDp0aGlzLm5ld1RtcG5hbWUoYS5saW5lbm8pO3RoaXMudmlzaXRFeHByKGEuZWx0KTt0aGlzLnZpc2l0Q29tcHJlaGVuc2lvbihhLmdlbmVyYXRvcnMsMCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA6dGhpcy52aXNpdEdlbmV4cChhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLllpZWxkOmEudmFsdWUmJnRoaXMudmlzaXRFeHByKGEudmFsdWUpO3RoaXMuY3VyLmdlbmVyYXRvcj0hMDtpZih0aGlzLmN1ci5yZXR1cm5zVmFsdWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCIncmV0dXJuJyB3aXRoIGFyZ3VtZW50IGluc2lkZSBnZW5lcmF0b3JcIixcbnRoaXMuZmlsZW5hbWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ29tcGFyZTp0aGlzLnZpc2l0RXhwcihhLmxlZnQpO3RoaXMuU0VRRXhwcihhLmNvbXBhcmF0b3JzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNhbGw6dGhpcy52aXNpdEV4cHIoYS5mdW5jKTtpZihhLmFyZ3MpZm9yKGxldCBiIG9mIGEuYXJncyliLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZD90aGlzLnZpc2l0RXhwcihiLnZhbHVlKTp0aGlzLnZpc2l0RXhwcihiKTtpZihhLmtleXdvcmRzKWZvcihsZXQgYiBvZiBhLmtleXdvcmRzKXRoaXMudmlzaXRFeHByKGIudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTnVtOmNhc2UgU2suYXN0bm9kZXMuU3RyOmNhc2UgU2suYXN0bm9kZXMuQnl0ZXM6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Kb2luZWRTdHI6Zm9yKGxldCBiIG9mIGEudmFsdWVzKXRoaXMudmlzaXRFeHByKGIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWU6dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7XG5hLmZvcm1hdF9zcGVjJiZ0aGlzLnZpc2l0RXhwcihhLmZvcm1hdF9zcGVjKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTt0aGlzLnZpc2l0U2xpY2UoYS5zbGljZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnRoaXMuYWRkRGVmKGEuaWQsYS5jdHg9PT1Tay5hc3Rub2Rlcy5Mb2FkPzg6MixhLmxpbmVubyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0OmNhc2UgU2suYXN0bm9kZXMuVHVwbGU6Y2FzZSBTay5hc3Rub2Rlcy5TZXQ6dGhpcy5TRVFFeHByKGEuZWx0cyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdGFycmVkOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiVW5oYW5kbGVkIHR5cGUgXCIrYS5jb25zdHJ1Y3Rvci5uYW1lK1xuXCIgaW4gdmlzaXRFeHByXCIpfX07Yi5wcm90b3R5cGUudmlzaXRDb21wcmVoZW5zaW9uPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1hLmxlbmd0aDtmb3IoYz1iO2M8ZDsrK2MpYj1hW2NdLHRoaXMudmlzaXRFeHByKGIudGFyZ2V0KSx0aGlzLnZpc2l0RXhwcihiLml0ZXIpLHRoaXMuU0VRRXhwcihiLmlmcyl9O2IucHJvdG90eXBlLnZpc2l0QWxpYXM9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2ZvcihkPTA7ZDxhLmxlbmd0aDsrK2Qpe3ZhciBlPWFbZF07dmFyIGY9Yz1udWxsPT09ZS5hc25hbWU/ZS5uYW1lLnY6ZS5hc25hbWUudjtlPWMuaW5kZXhPZihcIi5cIik7LTEhPT1lJiYoZj1jLnN1YnN0cigwLGUpKTtpZihcIipcIiE9PWMpdGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLDEwMjQsYik7ZWxzZSBpZihcIm1vZHVsZVwiIT09dGhpcy5jdXIuYmxvY2tUeXBlKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW1wb3J0ICogb25seSBhbGxvd2VkIGF0IG1vZHVsZSBsZXZlbFwiLFxudGhpcy5maWxlbmFtZSk7fX07Yi5wcm90b3R5cGUudmlzaXRHZW5leHA9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZW5lcmF0b3JzWzBdO3RoaXMudmlzaXRFeHByKGIuaXRlcik7dGhpcy5lbnRlckJsb2NrKFwiZ2VuZXhwclwiLFwiZnVuY3Rpb25cIixhLGEubGluZW5vKTt0aGlzLmN1ci5nZW5lcmF0b3I9ITA7dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKFwiLjBcIiksNCxhLmxpbmVubyk7dGhpcy52aXNpdEV4cHIoYi50YXJnZXQpO3RoaXMuU0VRRXhwcihiLmlmcyk7dGhpcy52aXNpdENvbXByZWhlbnNpb24oYS5nZW5lcmF0b3JzLDEpO3RoaXMudmlzaXRFeHByKGEuZWx0KTt0aGlzLmV4aXRCbG9jaygpfTtiLnByb3RvdHlwZS52aXNpdEV4Y2VwdGhhbmRsZXJzPWZ1bmN0aW9uKGEpe3ZhciBiLGM7Zm9yKGI9MDtjPWFbYl07KytiKWMudHlwZSYmdGhpcy52aXNpdEV4cHIoYy50eXBlKSxjLm5hbWUmJnRoaXMudmlzaXRFeHByKGMubmFtZSksdGhpcy5TRVFTdG10KGMuYm9keSl9O2IucHJvdG90eXBlLmFuYWx5emVCbG9jaz1cbmZ1bmN0aW9uKGEsYixjLGUpe3ZhciBkPXt9O3ZhciBnPXt9LGg9e30sbj17fSxsPXt9O1wiY2xhc3NcIj09YS5ibG9ja1R5cGUmJihmKGgsZSksYiYmZihuLGIpKTtmb3IocSBpbiBhLnN5bUZsYWdzKXt2YXIgbT1hLnN5bUZsYWdzW3FdO3RoaXMuYW5hbHl6ZU5hbWUoYSxnLHEsbSxiLGQsYyxlKX1cImNsYXNzXCIhPT1hLmJsb2NrVHlwZSYmKFwiZnVuY3Rpb25cIj09PWEuYmxvY2tUeXBlJiZmKG4sZCksYiYmZihuLGIpLGYoaCxlKSk7ZD17fTt2YXIgcT1hLmNoaWxkcmVuLmxlbmd0aDtmb3IobT0wO208cTsrK20paWYoZT1hLmNoaWxkcmVuW21dLHRoaXMuYW5hbHl6ZUNoaWxkQmxvY2soZSxuLGwsaCxkKSxlLmhhc0ZyZWV8fGUuY2hpbGRIYXNGcmVlKWEuY2hpbGRIYXNGcmVlPSEwO2YobCxkKTtcImZ1bmN0aW9uXCI9PT1hLmJsb2NrVHlwZSYmdGhpcy5hbmFseXplQ2VsbHMoZyxsKTtiPXRoaXMudXBkYXRlU3ltYm9scyhhLnN5bUZsYWdzLGcsYixsLFwiY2xhc3NcIj09PWEuYmxvY2tUeXBlKTtcbmEuaGFzRnJlZT1hLmhhc0ZyZWV8fGI7ZihjLGwpfTtiLnByb3RvdHlwZS5hbmFseXplQ2hpbGRCbG9jaz1mdW5jdGlvbihhLGIsYyxlLGspe3ZhciBkPXt9O2YoZCxiKTtiPXt9O2YoYixjKTtjPXt9O2YoYyxlKTt0aGlzLmFuYWx5emVCbG9jayhhLGQsYixjKTtmKGssYil9O2IucHJvdG90eXBlLmFuYWx5emVDZWxscz1mdW5jdGlvbihhLGIpe3ZhciBjO2ZvcihjIGluIGEpe3ZhciBkPWFbY107MT09PWQmJnZvaWQgMCE9PWJbY10mJihhW2NdPTUsZGVsZXRlIGJbY10pfX07Yi5wcm90b3R5cGUudXBkYXRlU3ltYm9scz1mdW5jdGlvbihhLGIsYyxlLGYpe3ZhciBkLGc9ITE7Zm9yKGQgaW4gYSl7dmFyIGs9YVtkXTt2YXIgaD1iW2RdO2t8PWg8PDExO2FbZF09a31mb3IoZCBpbiBlKWI9YVtkXSx2b2lkIDAhPT1iP2YmJmImMTAzMSYmKGJ8PTUxMixhW2RdPWIpOnZvaWQgMCE9PWNbZF0mJihhW2RdPTgxOTIsZz0hMCk7cmV0dXJuIGd9O2IucHJvdG90eXBlLmFuYWx5emVOYW1lPWZ1bmN0aW9uKGEsXG5iLGMsZSxmLHAsbCxtKXtpZihlJjEpe2lmKGUmNCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm5hbWUgJ1wiK2MrXCInIGlzIGxvY2FsIGFuZCBnbG9iYWxcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtiW2NdPTI7bVtjXT1udWxsO2YmJnZvaWQgMCE9PWZbY10mJmRlbGV0ZSBmW2NdfWVsc2UgZSYxMDMwPyhiW2NdPTEscFtjXT1udWxsLGRlbGV0ZSBtW2NdKTpmJiZ2b2lkIDAhPT1mW2NdPyhiW2NdPTQsYS5oYXNGcmVlPSEwLGxbY109bnVsbCk6KG0mJnZvaWQgMCE9PW1bY118fCFhLmlzTmVzdGVkfHwoYS5oYXNGcmVlPSEwKSxiW2NdPTMpfTtiLnByb3RvdHlwZS5hbmFseXplPWZ1bmN0aW9uKCl7dGhpcy5hbmFseXplQmxvY2sodGhpcy50b3AsbnVsbCx7fSx7fSl9O1NrLnN5bWJvbHRhYmxlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9bmV3IGIoYyk7ZC5lbnRlckJsb2NrKFwidG9wXCIsXCJtb2R1bGVcIixhLDApO2QudG9wPWQuY3VyO2ZvcihjPTA7YzxhLmJvZHkubGVuZ3RoOysrYylkLnZpc2l0U3RtdChhLmJvZHlbY10pO1xuZC5leGl0QmxvY2soKTtkLmFuYWx5emUoKTtyZXR1cm4gZH07U2suZHVtcFN5bXRhYj1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXtyZXR1cm4gYT9cIlRydWVcIjpcIkZhbHNlXCJ9LGM9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWMucHVzaCgobmV3IFNrLmJ1aWx0aW4uc3RyKGFbYl0pKS4kcigpLnYpO3JldHVyblwiW1wiK2Muam9pbihcIiwgXCIpK1wiXVwifSxlPWZ1bmN0aW9uKGEsZCl7dmFyIGYsZzt2b2lkIDA9PT1kJiYoZD1cIlwiKTt2YXIgaz1kK1wiU3ltX3R5cGU6IFwiK2EuZ2V0X3R5cGUoKStcIlxcblwiO2srPWQrXCJTeW1fbmFtZTogXCIrYS5nZXRfbmFtZSgpK1wiXFxuXCI7ays9ZCtcIlN5bV9saW5lbm86IFwiK2EuZ2V0X2xpbmVubygpK1wiXFxuXCI7ays9ZCtcIlN5bV9uZXN0ZWQ6IFwiK2IoYS5pc19uZXN0ZWQoKSkrXCJcXG5cIjtrKz1kK1wiU3ltX2hhc2NoaWxkcmVuOiBcIitiKGEuaGFzX2NoaWxkcmVuKCkpK1wiXFxuXCI7XCJjbGFzc1wiPT09YS5nZXRfdHlwZSgpP2srPWQrXG5cIkNsYXNzX21ldGhvZHM6IFwiK2MoYS5nZXRfbWV0aG9kcygpKStcIlxcblwiOlwiZnVuY3Rpb25cIj09PWEuZ2V0X3R5cGUoKSYmKGsrPWQrXCJGdW5jX3BhcmFtczogXCIrYyhhLmdldF9wYXJhbWV0ZXJzKCkpK1wiXFxuXCIsays9ZCtcIkZ1bmNfbG9jYWxzOiBcIitjKGEuZ2V0X2xvY2FscygpKStcIlxcblwiLGsrPWQrXCJGdW5jX2dsb2JhbHM6IFwiK2MoYS5nZXRfZ2xvYmFscygpKStcIlxcblwiLGsrPWQrXCJGdW5jX2ZyZWVzOiBcIitjKGEuZ2V0X2ZyZWVzKCkpK1wiXFxuXCIpO2srPWQrXCItLSBJZGVudGlmaWVycyAtLVxcblwiO3ZhciBoPWEuZ2V0X2lkZW50aWZpZXJzKCk7dmFyIG49aC5sZW5ndGg7Zm9yKGc9MDtnPG47KytnKXt2YXIgbD1hLmxvb2t1cChoW2ddKTtrKz1kK1wibmFtZTogXCIrbC5nZXRfbmFtZSgpK1wiXFxuXCI7ays9ZCtcIiAgaXNfcmVmZXJlbmNlZDogXCIrYihsLmlzX3JlZmVyZW5jZWQoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19pbXBvcnRlZDogXCIrYihsLmlzX2ltcG9ydGVkKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfcGFyYW1ldGVyOiBcIitcbmIobC5pc19wYXJhbWV0ZXIoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19nbG9iYWw6IFwiK2IobC5pc19nbG9iYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19kZWNsYXJlZF9nbG9iYWw6IFwiK2IobC5pc19kZWNsYXJlZF9nbG9iYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19sb2NhbDogXCIrYihsLmlzX2xvY2FsKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfZnJlZTogXCIrYihsLmlzX2ZyZWUoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19hc3NpZ25lZDogXCIrYihsLmlzX2Fzc2lnbmVkKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfbmFtZXNwYWNlOiBcIitiKGwuaXNfbmFtZXNwYWNlKCkpK1wiXFxuXCI7dmFyIG09bC5nZXRfbmFtZXNwYWNlcygpO3ZhciBwPW0ubGVuZ3RoO2srPWQrXCIgIG5hbWVzcGFjZXM6IFtcXG5cIjt2YXIgcT1bXTtmb3IoZj0wO2Y8cDsrK2YpbD1tW2ZdLHEucHVzaChlKGwsZCtcIiAgICBcIikpO2srPXEuam9pbihcIlxcblwiKTtrKz1kK1wiICBdXFxuXCJ9cmV0dXJuIGt9O3JldHVybiBlKGEudG9wLFwiXCIpfTtTay5leHBvcnRTeW1ib2woXCJTay5zeW1ib2x0YWJsZVwiLFxuU2suc3ltYm9sdGFibGUpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmR1bXBTeW10YWJcIixTay5kdW1wU3ltdGFiKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjLGUsZil7dGhpcy5maWxlbmFtZT1hO3RoaXMuc3Q9Yjt0aGlzLmZsYWdzPWM7dGhpcy5jYW5TdXNwZW5kPWU7dGhpcy5pbnRlcmFjdGl2ZT0hMTt0aGlzLm5lc3RsZXZlbD0wO3RoaXMudT1udWxsO3RoaXMuc3RhY2s9W107dGhpcy5yZXN1bHQ9W107dGhpcy5hbGxVbml0cz1bXTt0aGlzLnNvdXJjZT1mP2Yuc3BsaXQoXCJcXG5cIik6ITF9ZnVuY3Rpb24gYygpe3RoaXMubmFtZT10aGlzLnN0ZT1udWxsO3RoaXMuZG9lc1N1c3BlbmQ9dGhpcy5jYW5TdXNwZW5kPSExO3RoaXMucHJpdmF0ZV89bnVsbDt0aGlzLmxpbmVubz10aGlzLmZpcnN0bGluZW5vPTA7dGhpcy5saW5lbm9TZXQ9ITE7dGhpcy5sb2NhbG5hbWVzPVtdO3RoaXMubG9jYWx0ZW1wcz1bXTt0aGlzLnRlbXBzVG9TYXZlPVtdO3RoaXMuYmxvY2tudW09MDt0aGlzLmJsb2Nrcz1cbltdO3RoaXMuY3VyYmxvY2s9MDt0aGlzLmNvbnN0cz17fTt0aGlzLnNjb3BlbmFtZT1udWxsO3RoaXMuc3VmZml4Q29kZT10aGlzLnN3aXRjaENvZGU9dGhpcy52YXJEZWNsc0NvZGU9dGhpcy5wcmVmaXhDb2RlPVwiXCI7dGhpcy5icmVha0Jsb2Nrcz1bXTt0aGlzLmNvbnRpbnVlQmxvY2tzPVtdO3RoaXMuZXhjZXB0QmxvY2tzPVtdO3RoaXMuZmluYWxseUJsb2Nrcz1bXX1mdW5jdGlvbiBiKGEpe3JldHVybiB2b2lkIDA9PT1oW2FdP2E6YStcIl8kcnckXCJ9ZnVuY3Rpb24gZShhLGIpe3ZhciBjPWIudjtpZihudWxsPT09YXx8bnVsbD09PWN8fFwiX1wiIT09Yy5jaGFyQXQoMCl8fFwiX1wiIT09Yy5jaGFyQXQoMSl8fFwiX1wiPT09Yy5jaGFyQXQoYy5sZW5ndGgtMSkmJlwiX1wiPT09Yy5jaGFyQXQoYy5sZW5ndGgtMikpcmV0dXJuIGI7dmFyIGQ9YS52O2QucmVwbGFjZSgvXy9nLFwiXCIpO2lmKFwiXCI9PT1kKXJldHVybiBiO2Q9YS52O2QucmVwbGFjZSgvXl8qLyxcIlwiKTtyZXR1cm4gZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfXCIrXG5kK2MpfWZ1bmN0aW9uIGYoYSl7bGV0IGI9J1wiJztmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyl7bGV0IGQ9YS5jaGFyQ29kZUF0KGMpO2I9MTA9PWQ/YitcIlxcXFxuXCI6OTI9PWQ/YitcIlxcXFxcXFxcXCI6MzQ9PWR8fDMyPmR8fDEyNzw9ZCYmMjU2PmQ/YisoXCJcXFxceFwiKyhcIjBcIitkLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yKSk6MjU2PD1kP2IrKFwiXFxcXHVcIisoXCIwMDBcIitkLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC00KSk6YithLmNoYXJBdChjKX1yZXR1cm4gYisnXCInfXZhciBsO1NrLmdlbnN5bWNvdW50PTA7Yy5wcm90b3R5cGUuYWN0aXZhdGVTY29wZT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7bD1mdW5jdGlvbigpe3ZhciBiLGM9YS5ibG9ja3NbYS5jdXJibG9ja107aWYobnVsbD09PWMuX25leHQpZm9yKGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7KytiKWMucHVzaChhcmd1bWVudHNbYl0pfX07YS5wcm90b3R5cGUuZ2V0U291cmNlTGluZT1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnNvdXJjZSk7XG5yZXR1cm4gdGhpcy5zb3VyY2VbYS0xXX07YS5wcm90b3R5cGUuYW5ub3RhdGVTb3VyY2U9ZnVuY3Rpb24oYSl7dmFyIGI7aWYodGhpcy5zb3VyY2Upe3ZhciBjPWEubGluZW5vO3ZhciBkPWEuY29sX29mZnNldDtsKFwiXFxuLy9cXG4vLyBsaW5lIFwiLGMsXCI6XFxuLy8gXCIsdGhpcy5nZXRTb3VyY2VMaW5lKGMpLFwiXFxuLy8gXCIpO2ZvcihiPTA7YjxkOysrYilsKFwiIFwiKTtsKFwiXlxcbi8vXFxuXCIpO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEubGluZW5vJiZ2b2lkIDAhPT1hLmNvbF9vZmZzZXQpO2woXCIkY3VyckxpbmVObyA9IFwiLGMsXCI7XFxuJGN1cnJDb2xObyA9IFwiLGQsXCI7XFxuXFxuXCIpfX07YS5wcm90b3R5cGUuZ2Vuc3ltPWZ1bmN0aW9uKGEpe3JldHVybiBhPVwiJFwiKyhhfHxcIlwiKStTay5nZW5zeW1jb3VudCsrfTthLnByb3RvdHlwZS5uaWNlTmFtZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZW5zeW0oYS5yZXBsYWNlKFwiPFwiLFwiXCIpLnJlcGxhY2UoXCI+XCIsXCJcIikucmVwbGFjZShcIiBcIixcIl9cIikpfTtcbnZhciBoPVNrLmJ1aWx0aW4uc3RyLnJlc2VydmVkV29yZHNfO2EucHJvdG90eXBlLm1ha2VDb25zdGFudD1mdW5jdGlvbihhKXt2YXIgYixjPVwiXCI7Zm9yKGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7KytiKWMrPWFyZ3VtZW50c1tiXTtmb3IoZCBpbiB0aGlzLnUuY29uc3RzKWlmKHRoaXMudS5jb25zdHMuaGFzT3duUHJvcGVydHkoZCkmJihiPXRoaXMudS5jb25zdHNbZF0sYj09YykpcmV0dXJuIGQ7dmFyIGQ9dGhpcy51LnNjb3BlbmFtZStcIi5cIit0aGlzLmdlbnN5bShcImNvbnN0XCIpO3RoaXMudS5jb25zdHNbZF09YztyZXR1cm4gZH07YS5wcm90b3R5cGUuX2dyPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD10aGlzLmdlbnN5bShhKTt0aGlzLnUubG9jYWx0ZW1wcy5wdXNoKGQpO2woXCJ2YXIgXCIsZCxcIj1cIik7Zm9yKGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWwoYXJndW1lbnRzW2NdKTtsKFwiO1wiKTtyZXR1cm4gZH07YS5wcm90b3R5cGUub3V0cHV0SW50ZXJydXB0VGVzdD1mdW5jdGlvbigpe3ZhciBhPVxuXCJcIjtpZihudWxsIT09U2suZXhlY0xpbWl0fHxudWxsIT09U2sueWllbGRMaW1pdCYmdGhpcy51LmNhblN1c3BlbmQpYSs9XCJ2YXIgJGRhdGVOb3cgPSBEYXRlLm5vdygpO1wiLG51bGwhPT1Tay5leGVjTGltaXQmJihhKz1cImlmICgkZGF0ZU5vdyAtIFNrLmV4ZWNTdGFydCA+IFNrLmV4ZWNMaW1pdCkge3Rocm93IG5ldyBTay5idWlsdGluLlRpbWVMaW1pdEVycm9yKFNrLnRpbWVvdXRNc2coKSl9XCIpLG51bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGE9YStcImlmICgkZGF0ZU5vdyAtIFNrLmxhc3RZaWVsZCA+IFNrLnlpZWxkTGltaXQpIHtcIisoXCJ2YXIgJHN1c3AgPSAkc2F2ZVN1c3BlbnNpb24oe2RhdGE6IHt0eXBlOiAnU2sueWllbGQnfSwgcmVzdW1lOiBmdW5jdGlvbigpIHt9fSwgJ1wiK3RoaXMuZmlsZW5hbWUrXCInLCRjdXJyTGluZU5vLCRjdXJyQ29sTm8pO1wiKSxhKz1cIiRzdXNwLiRibGsgPSAkYmxrOyRzdXNwLm9wdGlvbmFsID0gdHJ1ZTtyZXR1cm4gJHN1c3A7fVwiLFxudGhpcy51LmRvZXNTdXNwZW5kPSEwKTtyZXR1cm4gYX07YS5wcm90b3R5cGUuX2p1bXBmYWxzZT1mdW5jdGlvbihhLGIpe2E9dGhpcy5fZ3IoXCJqZmFsc2VcIixcIihcIixhLFwiPT09ZmFsc2V8fCFTay5taXNjZXZhbC5pc1RydWUoXCIsYSxcIikpXCIpO2woXCJpZihcIixhLFwiKXsvKnRlc3QgZmFpbGVkICovJGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wdW5kZWY9ZnVuY3Rpb24oYSxiKXtsKFwiaWYoXCIsYSxcIj09PXVuZGVmaW5lZCl7JGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wbm90dW5kZWY9ZnVuY3Rpb24oYSxiKXtsKFwiaWYoXCIsYSxcIiE9PXVuZGVmaW5lZCl7JGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wdHJ1ZT1mdW5jdGlvbihhLGIpe2E9dGhpcy5fZ3IoXCJqdHJ1ZVwiLFwiKFwiLGEsXCI9PT10cnVlfHxTay5taXNjZXZhbC5pc1RydWUoXCIsYSxcIikpXCIpO2woXCJpZihcIixhLFwiKXsvKnRlc3QgcGFzc2VkICovJGJsaz1cIixcbmIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXA9ZnVuY3Rpb24oYSl7bnVsbD09PXRoaXMudS5ibG9ja3NbdGhpcy51LmN1cmJsb2NrXS5fbmV4dCYmKGwoXCIkYmxrPVwiLGEsXCI7XCIpLHRoaXMudS5ibG9ja3NbdGhpcy51LmN1cmJsb2NrXS5fbmV4dD1hKX07YS5wcm90b3R5cGUuX2NoZWNrU3VzcGVuc2lvbj1mdW5jdGlvbihhKXtpZih0aGlzLnUuY2FuU3VzcGVuZCl7dmFyIGI9dGhpcy5uZXdCbG9jayhcImZ1bmN0aW9uIHJldHVybiBvciByZXN1bWUgc3VzcGVuc2lvblwiKTt0aGlzLl9qdW1wKGIpO3RoaXMuc2V0QmxvY2soYik7YT1hfHx7bGluZW5vOlwiJGN1cnJMaW5lTm9cIixjb2xfb2Zmc2V0OlwiJGN1cnJDb2xOb1wifTtsKFwiaWYgKCRyZXQgJiYgJHJldC4kaXNTdXNwZW5zaW9uKSB7IHJldHVybiAkc2F2ZVN1c3BlbnNpb24oJHJldCwnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKTsgfVwiKTt0aGlzLnUuZG9lc1N1c3BlbmQ9ITA7XG50aGlzLnUudGVtcHNUb1NhdmU9dGhpcy51LnRlbXBzVG9TYXZlLmNvbmNhdCh0aGlzLnUubG9jYWx0ZW1wcyl9ZWxzZSBsKFwiaWYgKCRyZXQgJiYgJHJldC4kaXNTdXNwZW5zaW9uKSB7ICRyZXQgPSBTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coJHJldCk7IH1cIil9O2EucHJvdG90eXBlLmN1bnBhY2tzdGFyc3RvYXJyYXk9ZnVuY3Rpb24oYSxiKXtpZighYXx8MD09YS5sZW5ndGgpcmV0dXJuXCJbXVwiO2xldCBjPSExO2ZvcihsZXQgZCBvZiBhKXtpZihiJiZjKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiRXh0ZW5kZWQgYXJndW1lbnQgdW5wYWNraW5nIGlzIG5vdCBwZXJtaXR0ZWQgaW4gUHl0aG9uIDJcIik7ZC5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0YXJyZWQmJihjPSEwKX1pZihjKXtiPXRoaXMuX2dyKFwidW5wYWNrXCIsXCJbXVwiKTtmb3IobGV0IGMgb2YgYSljLmNvbnN0cnVjdG9yIT09U2suYXN0bm9kZXMuU3RhcnJlZD9sKGIsXG5cIi5wdXNoKFwiLHRoaXMudmV4cHIoYyksXCIpO1wiKToobChcIiRyZXQgPSBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoXCIsdGhpcy52ZXhwcihjLnZhbHVlKSxcIiksIGZ1bmN0aW9uKGUpIHsgXCIsYixcIi5wdXNoKGUpOyB9KTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCkpO3JldHVybiBifXJldHVyblwiW1wiK2EubWFwKGE9PnRoaXMudmV4cHIoYSkpLmpvaW4oXCIsXCIpK1wiXVwifTthLnByb3RvdHlwZS5jdHVwbGVsaXN0b3JzZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO1NrLmFzc2VydHMuYXNzZXJ0KFwidHVwbGVcIj09PWN8fFwibGlzdFwiPT09Y3x8XCJzZXRcIj09PWMpO3ZhciBlPSExO2ZvcihkPTA7ZDxhLmVsdHMubGVuZ3RoO2QrKylpZihhLmVsdHNbZF0uY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXtlPSEwO3ZhciBmPWQ7YnJlYWt9aWYoYS5jdHg9PT1Tay5hc3Rub2Rlcy5TdG9yZSl7aWYoZSl7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFzc2lnbm1lbnQgdW5wYWNraW5nIHdpdGggc3RhcnMgaXMgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMlwiLFxudGhpcy5maWxlbmFtZSxhLmxpbmVubyk7Zm9yKGQ9ZisxO2Q8YS5lbHRzLmxlbmd0aDtkKyspaWYoYS5lbHRzW2RdLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm11bHRpcGxlIHN0YXJyZWQgZXhwcmVzc2lvbnMgaW4gYXNzaWdubWVudFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO31jPWU/ZjphLmVsdHMubGVuZ3RoO2woXCIkcmV0ID0gU2suYWJzdHIuc2VxdWVuY2VVbnBhY2soXCIrYitcIixcIitjK1wiLFwiKyhlP2EuZWx0cy5sZW5ndGgtMTpjKStcIiwgXCIrZStcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbigpO2I9dGhpcy5fZ3IoXCJpdGVtc1wiLFwiJHJldFwiKTtmb3IoZD0wO2Q8YS5lbHRzLmxlbmd0aDsrK2QpZD09PWY/dGhpcy52ZXhwcihhLmVsdHNbZF0udmFsdWUsYitcIltcIitkK1wiXVwiKTp0aGlzLnZleHByKGEuZWx0c1tkXSxiK1wiW1wiK2QrXCJdXCIpfWVsc2UgaWYoYS5jdHg9PT1Tay5hc3Rub2Rlcy5Mb2FkfHxcInNldFwiPT09XG5jKXtpZihlKXtpZighU2suX19mdXR1cmVfXy5weXRob24zKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiTGlzdCBwYWNraW5nIHdpdGggc3RhcnMgaXMgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMlwiKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFwiLHRoaXMuY3VucGFja3N0YXJzdG9hcnJheShhLmVsdHMpLFwiKVwiKX1pZihcInR1cGxlXCI9PT1jKXtlPSEwO2I9W107Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7KytkKWY9dGhpcy52ZXhwcihhLmVsdHNbZF0pLGUmJi0xPT1mLmluZGV4T2YoXCIkY29uc3RcIikmJihlPSExKSxiLnB1c2goZik7aWYoZSlyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi50dXBsZShbXCIrYitcIl0pXCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDsrK2QpYltkXT10aGlzLl9ncihcImVsZW1cIixiW2RdKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFtcIixcbmIsXCJdKVwiKX1iPVtdO2ZvcihkPTA7ZDxhLmVsdHMubGVuZ3RoOysrZCliLnB1c2godGhpcy5fZ3IoXCJlbGVtXCIsdGhpcy52ZXhwcihhLmVsdHNbZF0pKSk7cmV0dXJuIHRoaXMuX2dyKFwibG9hZFwiK2MsXCJuZXcgU2suYnVpbHRpbnNbJ1wiLGMsXCInXShbXCIsYixcIl0pXCIpfX07YS5wcm90b3R5cGUuY2RpY3Q9ZnVuY3Rpb24oYSl7dmFyIGI7dmFyIGM9W107aWYobnVsbCE9PWEua2V5cylmb3IoU2suYXNzZXJ0cy5hc3NlcnQoYS52YWx1ZXMubGVuZ3RoPT09YS5rZXlzLmxlbmd0aCksYj0wO2I8YS52YWx1ZXMubGVuZ3RoOysrYil7dmFyIGQ9dGhpcy52ZXhwcihhLnZhbHVlc1tiXSk7Yy5wdXNoKHRoaXMudmV4cHIoYS5rZXlzW2JdKSk7Yy5wdXNoKGQpfXJldHVybiB0aGlzLl9ncihcImxvYWRkaWN0XCIsXCJuZXcgU2suYnVpbHRpbnNbJ2RpY3QnXShbXCIsYyxcIl0pXCIpfTthLnByb3RvdHlwZS5jbGlzdGNvbXA9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkxpc3RDb21wKTtcbnZhciBiPXRoaXMuX2dyKFwiX2NvbXByXCIsXCJuZXcgU2suYnVpbHRpbnNbJ2xpc3QnXShbXSlcIik7cmV0dXJuIHRoaXMuY2NvbXBnZW4oXCJsaXN0XCIsYixhLmdlbmVyYXRvcnMsMCxhLmVsdCxudWxsLGEpfTthLnByb3RvdHlwZS5jZGljdGNvbXA9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkRpY3RDb21wKTt2YXIgYj10aGlzLl9ncihcIl9kY29tcHJcIixcIm5ldyBTay5idWlsdGlucy5kaWN0KFtdKVwiKTtyZXR1cm4gdGhpcy5jY29tcGdlbihcImRpY3RcIixiLGEuZ2VuZXJhdG9ycywwLGEudmFsdWUsYS5rZXksYSl9O2EucHJvdG90eXBlLmNzZXRjb21wPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5TZXRDb21wKTt2YXIgYj10aGlzLl9ncihcIl9zZXRjb21wclwiLFwibmV3IFNrLmJ1aWx0aW5zLnNldChbXSlcIik7cmV0dXJuIHRoaXMuY2NvbXBnZW4oXCJzZXRcIixiLGEuZ2VuZXJhdG9ycywwLFxuYS5lbHQsbnVsbCxhKX07YS5wcm90b3R5cGUuY2NvbXBnZW49ZnVuY3Rpb24oYSxiLGMsZSxmLGgsbSl7dmFyIGQ9dGhpcy5uZXdCbG9jayhhK1wiIGNvbXAgc3RhcnRcIiksZz10aGlzLm5ld0Jsb2NrKGErXCIgY29tcCBza2lwXCIpLGs9dGhpcy5uZXdCbG9jayhhK1wiIGNvbXAgYW5jaG9yXCIpLG49Y1tlXSxwPXRoaXMudmV4cHIobi5pdGVyKTtwPXRoaXMuX2dyKFwiaXRlclwiLFwiU2suYWJzdHIuaXRlcihcIixwLFwiKVwiKTt2YXIgcTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCk7bChcIiRyZXQgPSBTay5hYnN0ci5pdGVybmV4dChcIixwLFwiLCB0cnVlKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKG0pO3A9dGhpcy5fZ3IoXCJuZXh0XCIsXCIkcmV0XCIpO3RoaXMuX2p1bXB1bmRlZihwLGspO3RoaXMudmV4cHIobi50YXJnZXQscCk7dmFyIHU9bi5pZnM/bi5pZnMubGVuZ3RoOjA7Zm9yKHE9MDtxPHU7KytxKXA9dGhpcy52ZXhwcihuLmlmc1txXSksdGhpcy5fanVtcGZhbHNlKHAsZCk7KytlPGMubGVuZ3RoJiZcbnRoaXMuY2NvbXBnZW4oYSxiLGMsZSxmLGgsbSk7ZT49Yy5sZW5ndGgmJihjPXRoaXMudmV4cHIoZiksXCJkaWN0XCI9PT1hPyhhPXRoaXMudmV4cHIoaCksbChiLFwiLm1wJGFzc19zdWJzY3JpcHQoXCIsYSxcIixcIixjLFwiKTtcIikpOlwibGlzdFwiPT09YT9sKGIsXCIudi5wdXNoKFwiLGMsXCIpO1wiKTpcInNldFwiPT09YSYmbChiLFwiLnYubXAkYXNzX3N1YnNjcmlwdChcIixjLFwiLCB0cnVlKTtcIiksdGhpcy5fanVtcChnKSx0aGlzLnNldEJsb2NrKGcpKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soayk7cmV0dXJuIGJ9O2EucHJvdG90eXBlLmN5aWVsZD1mdW5jdGlvbihhKXtpZih0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIid5aWVsZCcgb3V0c2lkZSBmdW5jdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO3ZhciBiPVwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7YS52YWx1ZSYmKGI9dGhpcy52ZXhwcihhLnZhbHVlKSk7XG5hPXRoaXMubmV3QmxvY2soXCJhZnRlciB5aWVsZFwiKTtsKFwicmV0dXJuIFsvKnJlc3VtZSovXCIsYSxcIiwvKnJldCovXCIsYixcIl07XCIpO3RoaXMuc2V0QmxvY2soYSk7cmV0dXJuXCIkZ2VuLmdpJHNlbnR2YWx1ZVwifTthLnByb3RvdHlwZS5jY29tcGFyZT1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhLm9wcy5sZW5ndGg9PT1hLmNvbXBhcmF0b3JzLmxlbmd0aCk7dmFyIGM9dGhpcy52ZXhwcihhLmxlZnQpO3ZhciBkPWEub3BzLmxlbmd0aDt2YXIgZT10aGlzLm5ld0Jsb2NrKFwiZG9uZVwiKTt2YXIgZj10aGlzLl9ncihcImNvbXBhcmVyZXNcIixcIm51bGxcIik7Zm9yKGI9MDtiPGQ7KytiKXt2YXIgaD10aGlzLnZleHByKGEuY29tcGFyYXRvcnNbYl0pO2woXCIkcmV0ID0gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChcIixjLFwiLFwiLGgsXCIsJ1wiLGEub3BzW2JdLnByb3RvdHlwZS5fYXN0bmFtZSxcIicsIHRydWUpKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO1xubChmLFwiPSRyZXQ7XCIpO3RoaXMuX2p1bXBmYWxzZShcIiRyZXRcIixlKTtjPWh9dGhpcy5fanVtcChlKTt0aGlzLnNldEJsb2NrKGUpO3JldHVybiBmfTthLnByb3RvdHlwZS5jY2FsbD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnZleHByKGEuZnVuYyk7bGV0IGM9dGhpcy5jdW5wYWNrc3RhcnN0b2FycmF5KGEuYXJncywhU2suX19mdXR1cmVfXy5weXRob24zKTt2YXIgZD1cInVuZGVmaW5lZFwiO2lmKGEua2V5d29yZHMmJjA8YS5rZXl3b3Jkcy5sZW5ndGgpe2xldCBjPSExO2Q9W107Zm9yKGxldCBiIG9mIGEua2V5d29yZHMpe2lmKGMmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQWR2YW5jZWQgdW5wYWNraW5nIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cyBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO2IuYXJnPyhkLnB1c2goXCInXCIrYi5hcmcuditcIidcIiksZC5wdXNoKHRoaXMudmV4cHIoYi52YWx1ZSkpKTpjPSEwfWQ9XCJbXCIrZC5qb2luKFwiLFwiKStcblwiXVwiO2lmKGMpe2Q9dGhpcy5fZ3IoXCJrZXl3b3JkQXJnc1wiLGQpO2ZvcihsZXQgYyBvZiBhLmtleXdvcmRzKWMuYXJnfHwobChcIiRyZXQgPSBTay5hYnN0ci5tYXBwaW5nVW5wYWNrSW50b0tleXdvcmRBcnJheShcIixkLFwiLFwiLHRoaXMudmV4cHIoYy52YWx1ZSksXCIsXCIsYixcIik7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpKX19U2suX19mdXR1cmVfXy5zdXBlcl9hcmdzJiZhLmZ1bmMuaWQmJlwic3VwZXJcIj09PWEuZnVuYy5pZC52JiZcIltdXCI9PT1jJiYobCgnaWYgKHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiIHx8IHNlbGYudG9TdHJpbmcoKS5pbmRleE9mKFwiV2luZG93XCIpID4gMCkgeyB0aHJvdyBuZXcgU2suYnVpbHRpbi5SdW50aW1lRXJyb3IoXCJzdXBlcigpOiBubyBhcmd1bWVudHNcIikgfTsnKSxjPVwiWyRnYmwuX19jbGFzc19fLHNlbGZdXCIpO2woXCIkcmV0ID0gKFwiLGIsXCIudHAkY2FsbCk/XCIsYixcIi50cCRjYWxsKFwiLGMsXCIsXCIsZCxcIikgOiBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChcIixcbmIsXCIsdW5kZWZpbmVkLHVuZGVmaW5lZCxcIixkLFwiLFwiLGMsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7cmV0dXJuIHRoaXMuX2dyKFwiY2FsbFwiLFwiJHJldFwiKX07YS5wcm90b3R5cGUuY3NsaWNlPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5TbGljZSk7aWYoU2suX19mdXR1cmVfXy5weXRob24zKXt2YXIgYj1hLmxvd2VyP3RoaXMudmV4cHIoYS5sb3dlcik6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjt2YXIgYz1hLnVwcGVyP3RoaXMudmV4cHIoYS51cHBlcik6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIn1lbHNlIGI9YS5sb3dlcj90aGlzLnZleHByKGEubG93ZXIpOmEuc3RlcD9cIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOlwibmV3IFNrLmJ1aWx0aW4uaW50XygwKVwiLGM9YS51cHBlcj90aGlzLnZleHByKGEudXBwZXIpOmEuc3RlcD9cIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOlwibmV3IFNrLmJ1aWx0aW4uaW50XygyMTQ3NDgzNjQ3KVwiO1xuYT1hLnN0ZXA/dGhpcy52ZXhwcihhLnN0ZXApOlwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7cmV0dXJuIHRoaXMuX2dyKFwic2xpY2VcIixcIm5ldyBTay5idWlsdGluc1snc2xpY2UnXShcIixiLFwiLFwiLGMsXCIsXCIsYSxcIilcIil9O2EucHJvdG90eXBlLmVzbGljZT1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgQXJyYXkpO3ZhciBjPVtdO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKHRoaXMudnNsaWNlc3ViKGFbYl0pKTtyZXR1cm4gdGhpcy5fZ3IoXCJleHRzbGljZVwiLFwibmV3IFNrLmJ1aWx0aW5zWyd0dXBsZSddKFtcIixjLFwiXSlcIil9O2EucHJvdG90eXBlLnZzbGljZXN1Yj1mdW5jdGlvbihhKXtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5JbmRleDp2YXIgYj10aGlzLnZleHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU2xpY2U6Yj10aGlzLmNzbGljZShhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkVsbGlwc2lzOlNrLmFzc2VydHMuZmFpbChcInRvZG8gY29tcGlsZS5qcyBFbGxpcHNpcztcIik7XG5icmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4dFNsaWNlOmI9dGhpcy5lc2xpY2UoYS5kaW1zKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgc3Vic2NyaXB0IGtpbmRcIil9cmV0dXJuIGJ9O2EucHJvdG90eXBlLnZzbGljZT1mdW5jdGlvbihhLGIsYyxlKXthPXRoaXMudnNsaWNlc3ViKGEpO3JldHVybiB0aGlzLmNoYW5kbGVzdWJzY3IoYixjLGEsZSl9O2EucHJvdG90eXBlLmNoYW5kbGVzdWJzY3I9ZnVuY3Rpb24oYSxiLGMsZSl7aWYoYT09PVNrLmFzdG5vZGVzLkxvYWR8fGE9PT1Tay5hc3Rub2Rlcy5BdWdMb2FkKXJldHVybiBsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdEdldEl0ZW0oXCIsYixcIixcIixjLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCksdGhpcy5fZ3IoXCJsc3Vic2NyXCIsXCIkcmV0XCIpO2E9PT1Tay5hc3Rub2Rlcy5TdG9yZXx8YT09PVNrLmFzdG5vZGVzLkF1Z1N0b3JlPyhsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdFNldEl0ZW0oXCIsXG5iLFwiLFwiLGMsXCIsXCIsZSxcIiwgdHJ1ZSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpKTphPT09U2suYXN0bm9kZXMuRGVsP2woXCJTay5hYnN0ci5vYmplY3REZWxJdGVtKFwiLGIsXCIsXCIsYyxcIik7XCIpOlNrLmFzc2VydHMuZmFpbChcImhhbmRsZXN1YnNjciBmYWlsXCIpfTthLnByb3RvdHlwZS5jYm9vbG9wPWZ1bmN0aW9uKGEpe3ZhciBiLGM7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkJvb2xPcCk7dmFyIGQ9YS5vcD09PVNrLmFzdG5vZGVzLkFuZD90aGlzLl9qdW1wZmFsc2U6dGhpcy5fanVtcHRydWU7dmFyIGU9dGhpcy5uZXdCbG9jayhcImVuZCBvZiBib29sb3BcIik7dmFyIGY9YS52YWx1ZXM7dmFyIGg9Zi5sZW5ndGg7Zm9yKGI9MDtiPGg7KytiKWE9dGhpcy52ZXhwcihmW2JdKSwwPT09YiYmKGM9dGhpcy5fZ3IoXCJib29sb3BzdWNjXCIsYSkpLGwoYyxcIj1cIixhLFwiO1wiKSxkLmNhbGwodGhpcyxhLGUpO3RoaXMuX2p1bXAoZSk7dGhpcy5zZXRCbG9jayhlKTtcbnJldHVybiBjfTthLnByb3RvdHlwZS5jam9pbmVkc3RyPWZ1bmN0aW9uKGEpe2xldCBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5Kb2luZWRTdHIpO2ZvcihsZXQgYyBvZiBhLnZhbHVlcylhPXRoaXMudmV4cHIoYyksYj9sKGIsXCI9XCIsYixcIi5zcSRjb25jYXQoXCIsYSxcIik7XCIpOmI9dGhpcy5fZ3IoXCJqb2luZWRzdHJcIixhKTtifHwoYj1cIlNrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0clwiKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY2Zvcm1hdHRlZHZhbHVlPWZ1bmN0aW9uKGEpe2xldCBiPXRoaXMudmV4cHIoYS52YWx1ZSk7c3dpdGNoKGEuY29udmVyc2lvbil7Y2FzZSBcInNcIjpiPXRoaXMuX2dyKFwidmFsdWVcIixcIm5ldyBTay5idWlsdGluLnN0cihcIixiLFwiKVwiKTticmVhaztjYXNlIFwiYVwiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwiU2suYnVpbHRpbi5hc2NpaShcIixiLFwiKVwiKTticmVhaztjYXNlIFwiclwiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwiU2suYnVpbHRpbi5yZXByKFwiLFxuYixcIilcIil9YT1hLmZvcm1hdF9zcGVjP3RoaXMudmV4cHIoYS5mb3JtYXRfc3BlYyk6XCJTay5idWlsdGluLnN0ci4kZW1wdHlzdHJcIjtyZXR1cm4gdGhpcy5fZ3IoXCJmb3JtYXR0ZWRcIixcIlNrLmFic3RyLm9iamVjdEZvcm1hdChcIitiK1wiLFwiK2ErXCIpXCIpfTthLnByb3RvdHlwZS52ZXhwcj1mdW5jdGlvbihhLGIsYyxrKXt2YXIgZDthLmxpbmVubz50aGlzLnUubGluZW5vJiYodGhpcy51LmxpbmVubz1hLmxpbmVubyx0aGlzLnUubGluZW5vU2V0PSExKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5Cb29sT3A6cmV0dXJuIHRoaXMuY2Jvb2xvcChhKTtjYXNlIFNrLmFzdG5vZGVzLkJpbk9wOnJldHVybiB0aGlzLl9ncihcImJpbm9wXCIsXCJTay5hYnN0ci5udW1iZXJCaW5PcChcIix0aGlzLnZleHByKGEubGVmdCksXCIsXCIsdGhpcy52ZXhwcihhLnJpZ2h0KSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtjYXNlIFNrLmFzdG5vZGVzLlVuYXJ5T3A6cmV0dXJuIHRoaXMuX2dyKFwidW5hcnlvcFwiLFxuXCJTay5hYnN0ci5udW1iZXJVbmFyeU9wKFwiLHRoaXMudmV4cHIoYS5vcGVyYW5kKSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtjYXNlIFNrLmFzdG5vZGVzLkxhbWJkYTpyZXR1cm4gdGhpcy5jbGFtYmRhKGEpO2Nhc2UgU2suYXN0bm9kZXMuSWZFeHA6cmV0dXJuIHRoaXMuY2lmZXhwKGEpO2Nhc2UgU2suYXN0bm9kZXMuRGljdDpyZXR1cm4gdGhpcy5jZGljdChhKTtjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOnJldHVybiB0aGlzLmNsaXN0Y29tcChhKTtjYXNlIFNrLmFzdG5vZGVzLkRpY3RDb21wOnJldHVybiB0aGlzLmNkaWN0Y29tcChhKTtjYXNlIFNrLmFzdG5vZGVzLlNldENvbXA6cmV0dXJuIHRoaXMuY3NldGNvbXAoYSk7Y2FzZSBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA6cmV0dXJuIHRoaXMuY2dlbmV4cChhKTtjYXNlIFNrLmFzdG5vZGVzLllpZWxkOnJldHVybiB0aGlzLmN5aWVsZChhKTtjYXNlIFNrLmFzdG5vZGVzLkNvbXBhcmU6cmV0dXJuIHRoaXMuY2NvbXBhcmUoYSk7XG5jYXNlIFNrLmFzdG5vZGVzLkNhbGw6cmV0dXJuIGI9dGhpcy5jY2FsbChhKSx0aGlzLmFubm90YXRlU291cmNlKGEpLGI7Y2FzZSBTay5hc3Rub2Rlcy5OdW06aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhLm4pcmV0dXJuIGEubjtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5sbmcoJ1wiK2Eubi52LnRvU3RyaW5nKCkrXCInKVwiKTtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pcmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhLm4udj90aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLmludF8oXCIrYS5uLnYrXCIpXCIpOnRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uaW50XygnXCIrYS5uLnYudG9TdHJpbmcoKStcIicpXCIpO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKXJldHVybiBhPTA9PT1hLm4udiYmLUluZmluaXR5PT09MS9hLm4udj9cIi0wXCI6YS5uLnYsdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5mbG9hdF8oXCIrXG5hK1wiKVwiKTtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmNvbXBsZXgpcmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uY29tcGxleChcIisoMD09PWEubi5yZWFsJiYtSW5maW5pdHk9PT0xL2Eubi5yZWFsP1wiLTBcIjphLm4ucmVhbCkrXCIsIFwiKygwPT09YS5uLmltYWcmJi1JbmZpbml0eT09PTEvYS5uLmltYWc/XCItMFwiOmEubi5pbWFnKStcIilcIik7U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIE51bSB0eXBlXCIpO2Nhc2UgU2suYXN0bm9kZXMuQnl0ZXM6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXtiPVtdO2E9YS5zLiRqc3N0cigpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGEuY2hhckNvZGVBdChjKSk7cmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uYnl0ZXMoW1wiLGIuam9pbihcIiwgXCIpLFwiXSlcIil9Y2FzZSBTay5hc3Rub2Rlcy5TdHI6cmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uc3RyKFwiLFxuZihhLnMuJGpzc3RyKCkpLFwiKVwiKTtjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTphLmN0eCE9PVNrLmFzdG5vZGVzLkF1Z0xvYWQmJmEuY3R4IT09U2suYXN0bm9kZXMuQXVnU3RvcmUmJihkPXRoaXMudmV4cHIoYS52YWx1ZSkpO2s9YS5hdHRyLiRyKCkudjtrPWsuc3Vic3RyaW5nKDEsay5sZW5ndGgtMSk7az1lKHRoaXMudS5wcml2YXRlXyxuZXcgU2suYnVpbHRpbi5zdHIoaykpLnY7az10aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLnN0cignXCIraytcIicpXCIpO3N3aXRjaChhLmN0eCl7Y2FzZSBTay5hc3Rub2Rlcy5BdWdMb2FkOnJldHVybiBsKFwiJHJldCA9IFwiLGMsXCIudHAkZ2V0YXR0cihcIixrLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpLGwoXCJcXG5pZiAoJHJldCA9PT0gdW5kZWZpbmVkKSB7XCIpLGwoXCJcXG50aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIixjLCcuc2skYXR0ckVycm9yKCkgKyBcIiBoYXMgbm8gYXR0cmlidXRlIFxcJ1wiICsgJyxcbmssJy4kanNzdHIoKSArIFwiXFwnXCIpOycpLGwoXCJcXG59O1wiKSx0aGlzLl9ncihcImxhdHRyXCIsXCIkcmV0XCIpO2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gbChcIiRyZXQgPSBcIixkLFwiLnRwJGdldGF0dHIoXCIsayxcIiwgdHJ1ZSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKSxsKFwiXFxuaWYgKCRyZXQgPT09IHVuZGVmaW5lZCkge1wiKSxsKFwiXFxudGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCIsZCwnLnNrJGF0dHJFcnJvcigpICsgXCIgaGFzIG5vIGF0dHJpYnV0ZSBcXCdcIiArICcsaywnLiRqc3N0cigpICsgXCJcXCdcIik7JyksbChcIlxcbn07XCIpLHRoaXMuX2dyKFwibGF0dHJcIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5BdWdTdG9yZTpsKFwiJHJldCA9IHVuZGVmaW5lZDtcIik7bChcImlmKFwiLGIsXCIhPT11bmRlZmluZWQpe1wiKTtsKFwiJHJldCA9IFwiLGMsXCIudHAkc2V0YXR0cihcIixrLFwiLFwiLGIsXCIsIHRydWUpO1wiKTtsKFwifVwiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YnJlYWs7XG5jYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoXCIkcmV0ID0gXCIsZCxcIi50cCRzZXRhdHRyKFwiLGssXCIsXCIsYixcIiwgdHJ1ZSk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiJHJldCA9IFwiLGQsXCIudHAkc2V0YXR0cihcIixrLFwiLCB1bmRlZmluZWQsIHRydWUpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIGF0dHJpYnV0ZSBleHByZXNzaW9uXCIpfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OnN3aXRjaChhLmN0eCl7Y2FzZSBTay5hc3Rub2Rlcy5BdWdMb2FkOnJldHVybiBsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdEdldEl0ZW0oXCIsYyxcIixcIixrLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpLHRoaXMuX2dyKFwiZ2l0ZW1cIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOmNhc2UgU2suYXN0bm9kZXMuU3RvcmU6Y2FzZSBTay5hc3Rub2Rlcy5EZWw6cmV0dXJuIHRoaXMudnNsaWNlKGEuc2xpY2UsXG5hLmN0eCx0aGlzLnZleHByKGEudmFsdWUpLGIpO2Nhc2UgU2suYXN0bm9kZXMuQXVnU3RvcmU6bChcIiRyZXQ9dW5kZWZpbmVkO1wiKTtsKFwiaWYoXCIsYixcIiE9PXVuZGVmaW5lZCl7XCIpO2woXCIkcmV0PVNrLmFic3RyLm9iamVjdFNldEl0ZW0oXCIsYyxcIixcIixrLFwiLFwiLGIsXCIsIHRydWUpXCIpO2woXCJ9XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgc3Vic2NyaXB0IGV4cHJlc3Npb25cIil9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnJldHVybiB0aGlzLm5hbWVvcChhLmlkLGEuY3R4LGIpO2Nhc2UgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50OmlmKGEuY3R4PT09U2suYXN0bm9kZXMuU3RvcmV8fGEuY3R4PT09U2suYXN0bm9kZXMuQXVnU3RvcmV8fGEuY3R4PT09U2suYXN0bm9kZXMuRGVsKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuIG5vdCBhc3NpZ24gdG8gYSBjb25zdGFudCBuYW1lXCIpO1xuc3dpdGNoKGEudmFsdWUpe2Nhc2UgU2suYnVpbHRpbi5ub25lLm5vbmUkOnJldHVyblwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7Y2FzZSBTay5idWlsdGluLmJvb2wudHJ1ZSQ6cmV0dXJuXCJTay5idWlsdGluLmJvb2wudHJ1ZSRcIjtjYXNlIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6cmV0dXJuXCJTay5idWlsdGluLmJvb2wuZmFsc2UkXCI7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIG5hbWVkIGNvbnN0YW50XCIpfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDpyZXR1cm4gdGhpcy5jdHVwbGVsaXN0b3JzZXQoYSxiLFwibGlzdFwiKTtjYXNlIFNrLmFzdG5vZGVzLlR1cGxlOnJldHVybiB0aGlzLmN0dXBsZWxpc3RvcnNldChhLGIsXCJ0dXBsZVwiKTtjYXNlIFNrLmFzdG5vZGVzLlNldDpyZXR1cm4gdGhpcy5jdHVwbGVsaXN0b3JzZXQoYSxiLFwic2V0XCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RhcnJlZDpzd2l0Y2goYS5jdHgpe2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJzdGFycmVkIGFzc2lnbm1lbnQgdGFyZ2V0IG11c3QgYmUgaW4gYSBsaXN0IG9yIHR1cGxlXCIsXG50aGlzLmZpbGVuYW1lLGEubGluZW5vKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgdXNlIHN0YXJyZWQgZXhwcmVzc2lvbiBoZXJlXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7fWNhc2UgU2suYXN0bm9kZXMuSm9pbmVkU3RyOnJldHVybiB0aGlzLmNqb2luZWRzdHIoYSk7Y2FzZSBTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZTpyZXR1cm4gdGhpcy5jZm9ybWF0dGVkdmFsdWUoYSk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBcIithLmNvbnN0cnVjdG9yLm5hbWUrXCIgdmV4cHJcIil9fTthLnByb3RvdHlwZS52c2VxZXhwcj1mdW5jdGlvbihhLGIpe3ZhciBjO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMD09PWJ8fGEubGVuZ3RoPT09Yi5sZW5ndGgpO3ZhciBkPVtdO2ZvcihjPTA7YzxhLmxlbmd0aDsrK2MpZC5wdXNoKHRoaXMudmV4cHIoYVtjXSx2b2lkIDA9PT1iP3ZvaWQgMDpiW2NdKSk7cmV0dXJuIGR9O2EucHJvdG90eXBlLmNhdWdhc3NpZ249XG5mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuQXVnQXNzaWduKTt2YXIgYj1hLnRhcmdldDtzd2l0Y2goYi5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5BdHRyaWJ1dGU6dmFyIGM9dGhpcy52ZXhwcihiLnZhbHVlKTtiPW5ldyBTay5hc3Rub2Rlcy5BdHRyaWJ1dGUoYi52YWx1ZSxiLmF0dHIsU2suYXN0bm9kZXMuQXVnTG9hZCxiLmxpbmVubyxiLmNvbF9vZmZzZXQpO3ZhciBkPXRoaXMudmV4cHIoYix2b2lkIDAsYyk7dmFyIGU9dGhpcy52ZXhwcihhLnZhbHVlKTthPXRoaXMuX2dyKFwiaW5wbGJpbm9wYXR0clwiLFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKFwiLGQsXCIsXCIsZSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtiLmN0eD1Tay5hc3Rub2Rlcy5BdWdTdG9yZTtyZXR1cm4gdGhpcy52ZXhwcihiLGEsYyk7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6Yz10aGlzLnZleHByKGIudmFsdWUpO3ZhciBmPVxudGhpcy52c2xpY2VzdWIoYi5zbGljZSk7Yj1uZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGIudmFsdWUsZixTay5hc3Rub2Rlcy5BdWdMb2FkLGIubGluZW5vLGIuY29sX29mZnNldCk7ZD10aGlzLnZleHByKGIsdm9pZCAwLGMsZik7ZT10aGlzLnZleHByKGEudmFsdWUpO2E9dGhpcy5fZ3IoXCJpbnBsYmlub3BzdWJzY3JcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixkLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIik7Yi5jdHg9U2suYXN0bm9kZXMuQXVnU3RvcmU7cmV0dXJuIHRoaXMudmV4cHIoYixhLGMsZik7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnJldHVybiBjPXRoaXMubmFtZW9wKGIuaWQsU2suYXN0bm9kZXMuTG9hZCksZT10aGlzLnZleHByKGEudmFsdWUpLGE9dGhpcy5fZ3IoXCJpbnBsYmlub3BcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixjLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIiksdGhpcy5uYW1lb3AoYi5pZCxcblNrLmFzdG5vZGVzLlN0b3JlLGEpO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gYXVnYXNzaWduXCIpfX07YS5wcm90b3R5cGUuZXhwckNvbnN0YW50PWZ1bmN0aW9uKGEpe3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk51bTpyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEubik/MTowO2Nhc2UgU2suYXN0bm9kZXMuU3RyOnJldHVybiBTay5taXNjZXZhbC5pc1RydWUoYS5zKT8xOjA7ZGVmYXVsdDpyZXR1cm4tMX19O2EucHJvdG90eXBlLm5ld0Jsb2NrPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudS5ibG9ja251bSsrO3RoaXMudS5ibG9ja3NbYl09W107dGhpcy51LmJsb2Nrc1tiXS5fbmFtZT1hfHxcIjx1bm5hbWVkPlwiO3RoaXMudS5ibG9ja3NbYl0uX25leHQ9bnVsbDtyZXR1cm4gYn07YS5wcm90b3R5cGUuc2V0QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5jdXJibG9jaz1cbmF9O2EucHJvdG90eXBlLnB1c2hCcmVha0Jsb2NrPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KDA8PWEmJmE8dGhpcy51LmJsb2NrbnVtKTt0aGlzLnUuYnJlYWtCbG9ja3MucHVzaChhKX07YS5wcm90b3R5cGUucG9wQnJlYWtCbG9jaz1mdW5jdGlvbigpe3RoaXMudS5icmVha0Jsb2Nrcy5wb3AoKX07YS5wcm90b3R5cGUucHVzaENvbnRpbnVlQmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5jb250aW51ZUJsb2Nrcy5wdXNoKGEpfTthLnByb3RvdHlwZS5wb3BDb250aW51ZUJsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmNvbnRpbnVlQmxvY2tzLnBvcCgpfTthLnByb3RvdHlwZS5wdXNoRXhjZXB0QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5leGNlcHRCbG9ja3MucHVzaChhKX07YS5wcm90b3R5cGUucG9wRXhjZXB0QmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnUuZXhjZXB0QmxvY2tzLnBvcCgpfTtcbmEucHJvdG90eXBlLnB1c2hGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg9PT10aGlzLnUuY29udGludWVCbG9ja3MubGVuZ3RoKTt0aGlzLnUuZmluYWxseUJsb2Nrcy5wdXNoKHtibGs6YSxicmVha0RlcHRoOnRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGh9KX07YS5wcm90b3R5cGUucG9wRmluYWxseUJsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmZpbmFsbHlCbG9ja3MucG9wKCl9O2EucHJvdG90eXBlLnBlZWtGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGg/dGhpcy51LmZpbmFsbHlCbG9ja3NbdGhpcy51LmZpbmFsbHlCbG9ja3MubGVuZ3RoLTFdOnZvaWQgMH07YS5wcm90b3R5cGUuc2V0dXBFeGNlcHQ9ZnVuY3Rpb24oYSl7bChcIiRleGMucHVzaChcIixhLFwiKTtcIil9O2EucHJvdG90eXBlLmVuZEV4Y2VwdD1cbmZ1bmN0aW9uKCl7bChcIiRleGMucG9wKCk7XCIpfTthLnByb3RvdHlwZS5vdXRwdXRMb2NhbHM9ZnVuY3Rpb24oYSl7dmFyIGIsYz17fTtmb3IoYj0wO2EuYXJnbmFtZXMmJmI8YS5hcmduYW1lcy5sZW5ndGg7KytiKWNbYS5hcmduYW1lc1tiXV09ITA7YS5sb2NhbG5hbWVzLnNvcnQoKTt2YXIgZD1bXTtmb3IoYj0wO2I8YS5sb2NhbG5hbWVzLmxlbmd0aDsrK2Ipe3ZhciBlPWEubG9jYWxuYW1lc1tiXTt2b2lkIDA9PT1jW2VdJiYoZC5wdXNoKGUpLGNbZV09ITApfXJldHVybiAwPGQubGVuZ3RoP1widmFyIFwiK2Quam9pbihcIixcIikrXCI7IC8qIGxvY2FscyAqL1wiOlwiXCJ9O2EucHJvdG90eXBlLm91dHB1dFN1c3BlbnNpb25IZWxwZXJzPWZ1bmN0aW9uKGEpe3ZhciBiLGM9W10sZD1hLmxvY2FsbmFtZXMuY29uY2F0KGEudGVtcHNUb1NhdmUpLGU9e30sZj1hLnN0ZS5ibG9ja1R5cGU9PT1Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2smJmEuc3RlLmNoaWxkSGFzRnJlZSxoPSgwPGQubGVuZ3RoP1xuXCJ2YXIgXCIrZC5qb2luKFwiLFwiKStcIjtcIjpcIlwiKStcInZhciAkd2FrZUZyb21TdXNwZW5zaW9uID0gZnVuY3Rpb24oKSB7dmFyIHN1c3AgPSBcIithLnNjb3BlbmFtZStcIi4kd2FraW5nU3VzcGVuc2lvbjsgXCIrYS5zY29wZW5hbWUrXCIuJHdha2luZ1N1c3BlbnNpb24gPSB1bmRlZmluZWQ7JGJsaz1zdXNwLiRibGs7ICRsb2M9c3VzcC4kbG9jOyAkZ2JsPXN1c3AuJGdibDsgJGV4Yz1zdXNwLiRleGM7ICRlcnI9c3VzcC4kZXJyOyAkcG9zdGZpbmFsbHk9c3VzcC4kcG9zdGZpbmFsbHk7JGN1cnJMaW5lTm89c3VzcC4kbGluZW5vOyAkY3VyckNvbE5vPXN1c3AuJGNvbG5vOyBTay5sYXN0WWllbGQ9RGF0ZS5ub3coKTtcIisoZj9cIiRjZWxsPXN1c3AuJGNlbGw7XCI6XCJcIik7Zm9yKGI9MDtiPGQubGVuZ3RoO2IrKyl7dmFyIGw9ZFtiXTt2b2lkIDA9PT1lW2xdJiYoaCs9bCtcIj1zdXNwLiR0bXBzLlwiK2wrXCI7XCIsZVtsXT0hMCl9aCs9XCJ0cnkgeyAkcmV0PXN1c3AuY2hpbGQucmVzdW1lKCk7IH0gY2F0Y2goZXJyKSB7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrXG50aGlzLmZpbGVuYW1lK1wiJ30pOyBpZigkZXhjLmxlbmd0aD4wKSB7ICRlcnI9ZXJyOyAkYmxrPSRleGMucG9wKCk7IH0gZWxzZSB7IHRocm93IGVycjsgfSB9fTtcIjtoKz1cInZhciAkc2F2ZVN1c3BlbnNpb24gPSBmdW5jdGlvbigkY2hpbGQsICRmaWxlbmFtZSwgJGxpbmVubywgJGNvbG5vKSB7dmFyIHN1c3AgPSBuZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbigpOyBzdXNwLmNoaWxkPSRjaGlsZDtzdXNwLnJlc3VtZT1mdW5jdGlvbigpe1wiK2Euc2NvcGVuYW1lK1wiLiR3YWtpbmdTdXNwZW5zaW9uPXN1c3A7IHJldHVybiBcIithLnNjb3BlbmFtZStcIihcIisoYS5zdGUuZ2VuZXJhdG9yP1wiJGdlblwiOlwiXCIpK1wiKTsgfTtzdXNwLmRhdGE9c3VzcC5jaGlsZC5kYXRhO3N1c3AuJGJsaz0kYmxrO3N1c3AuJGxvYz0kbG9jO3N1c3AuJGdibD0kZ2JsO3N1c3AuJGV4Yz0kZXhjO3N1c3AuJGVycj0kZXJyO3N1c3AuJHBvc3RmaW5hbGx5PSRwb3N0ZmluYWxseTtzdXNwLiRmaWxlbmFtZT0kZmlsZW5hbWU7c3VzcC4kbGluZW5vPSRsaW5lbm87c3VzcC4kY29sbm89JGNvbG5vO3N1c3Aub3B0aW9uYWw9c3VzcC5jaGlsZC5vcHRpb25hbDtcIitcbihmP1wic3VzcC4kY2VsbD0kY2VsbDtcIjpcIlwiKTtlPXt9O2ZvcihiPTA7YjxkLmxlbmd0aDtiKyspbD1kW2JdLHZvaWQgMD09PWVbbF0mJihjLnB1c2goJ1wiJytsKydcIjonK2wpLGVbbF09ITApO3JldHVybiBoKz1cInN1c3AuJHRtcHM9e1wiK2Muam9pbihcIixcIikrXCJ9O3JldHVybiBzdXNwO307XCJ9O2EucHJvdG90eXBlLm91dHB1dEFsbFVuaXRzPWZ1bmN0aW9uKCl7dmFyIGEsYixjPVwiXCI7Zm9yKGI9MDtiPHRoaXMuYWxsVW5pdHMubGVuZ3RoOysrYil7dmFyIGU9dGhpcy5hbGxVbml0c1tiXTtjKz1lLnByZWZpeENvZGU7Yys9dGhpcy5vdXRwdXRMb2NhbHMoZSk7ZS5kb2VzU3VzcGVuZCYmKGMrPXRoaXMub3V0cHV0U3VzcGVuc2lvbkhlbHBlcnMoZSkpO2MrPWUudmFyRGVjbHNDb2RlO2MrPWUuc3dpdGNoQ29kZTt2YXIgZj1lLmJsb2Nrczt2YXIgaD1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihhPTA7YTxmLmxlbmd0aDsrK2Epe3ZhciBsPWE7aWYoIShsIGluIGgpKWZvcig7OylpZihoW2xdPVxuITAsYys9XCJjYXNlIFwiK2wrXCI6IC8qIC0tLSBcIitmW2xdLl9uYW1lK1wiIC0tLSAqL1wiLGMrPWZbbF0uam9pbihcIlwiKSxudWxsIT09ZltsXS5fbmV4dClpZihmW2xdLl9uZXh0IGluIGgpe2MrPVwiLyoganVtcCAqLyBjb250aW51ZTtcIjticmVha31lbHNlIGMrPVwiLyogYWxsb3dpbmcgY2FzZSBmYWxsdGhyb3VnaCAqL1wiLGw9ZltsXS5fbmV4dDtlbHNle2MrPVwidGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3lzdGVtRXJyb3IoJ2ludGVybmFsIGVycm9yOiB1bnRlcm1pbmF0ZWQgYmxvY2snKTtcIjticmVha319Yys9ZS5zdWZmaXhDb2RlfXJldHVybiBjfTthLnByb3RvdHlwZS5jaWY9ZnVuY3Rpb24oYSl7dmFyIGI7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLklmKTt2YXIgYz10aGlzLmV4cHJDb25zdGFudChhLnRlc3QpO2lmKDA9PT1jKWEub3JlbHNlJiYwPGEub3JlbHNlLmxlbmd0aCYmdGhpcy52c2Vxc3RtdChhLm9yZWxzZSk7ZWxzZSBpZigxPT09Yyl0aGlzLnZzZXFzdG10KGEuYm9keSk7XG5lbHNle3ZhciBkPXRoaXMubmV3QmxvY2soXCJlbmQgb2YgaWZcIik7YS5vcmVsc2UmJjA8YS5vcmVsc2UubGVuZ3RoJiYoYj10aGlzLm5ld0Jsb2NrKFwibmV4dCBicmFuY2ggb2YgaWZcIikpO2M9dGhpcy52ZXhwcihhLnRlc3QpO2Eub3JlbHNlJiYwPGEub3JlbHNlLmxlbmd0aD8odGhpcy5fanVtcGZhbHNlKGMsYiksdGhpcy52c2Vxc3RtdChhLmJvZHkpLHRoaXMuX2p1bXAoZCksdGhpcy5zZXRCbG9jayhiKSx0aGlzLnZzZXFzdG10KGEub3JlbHNlKSk6KHRoaXMuX2p1bXBmYWxzZShjLGQpLHRoaXMudnNlcXN0bXQoYS5ib2R5KSk7dGhpcy5fanVtcChkKTt0aGlzLnNldEJsb2NrKGQpfX07YS5wcm90b3R5cGUuY3doaWxlPWZ1bmN0aW9uKGEpe2lmKDA9PT10aGlzLmV4cHJDb25zdGFudChhLnRlc3QpKWEub3JlbHNlJiZ0aGlzLnZzZXFzdG10KGEub3JlbHNlKTtlbHNle3ZhciBiPXRoaXMubmV3QmxvY2soXCJ3aGlsZSB0ZXN0XCIpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTtcbnZhciBjPXRoaXMubmV3QmxvY2soXCJhZnRlciB3aGlsZVwiKTt2YXIgZD0wPGEub3JlbHNlLmxlbmd0aD90aGlzLm5ld0Jsb2NrKFwid2hpbGUgb3JlbHNlXCIpOm51bGw7dmFyIGU9dGhpcy5uZXdCbG9jayhcIndoaWxlIGJvZHlcIik7dGhpcy5hbm5vdGF0ZVNvdXJjZShhKTt0aGlzLl9qdW1wZmFsc2UodGhpcy52ZXhwcihhLnRlc3QpLGQ/ZDpjKTt0aGlzLl9qdW1wKGUpO3RoaXMucHVzaEJyZWFrQmxvY2soYyk7dGhpcy5wdXNoQ29udGludWVCbG9jayhiKTt0aGlzLnNldEJsb2NrKGUpOyhTay5kZWJ1Z2dpbmd8fFNrLmtpbGxhYmxlV2hpbGUpJiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGU9dGhpcy5uZXdCbG9jayhcImRlYnVnIGJyZWFrcG9pbnQgZm9yIGxpbmUgXCIrYS5saW5lbm8pLGwoXCJpZiAoU2suYnJlYWtwb2ludHMoJ1wiK3RoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIikpIHtcIixcInZhciAkc3VzcCA9ICRzYXZlU3VzcGVuc2lvbih7ZGF0YToge3R5cGU6ICdTay5kZWxheSd9LCByZXN1bWU6IGZ1bmN0aW9uKCkge319LCAnXCIrXG50aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2UrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpLHRoaXMuX2p1bXAoZSksdGhpcy5zZXRCbG9jayhlKSx0aGlzLnUuZG9lc1N1c3BlbmQ9ITApO3RoaXMudnNlcXN0bXQoYS5ib2R5KTt0aGlzLl9qdW1wKGIpO3RoaXMucG9wQ29udGludWVCbG9jaygpO3RoaXMucG9wQnJlYWtCbG9jaygpOzA8YS5vcmVsc2UubGVuZ3RoJiYodGhpcy5zZXRCbG9jayhkKSx0aGlzLnZzZXFzdG10KGEub3JlbHNlKSx0aGlzLl9qdW1wKGMpKTt0aGlzLnNldEJsb2NrKGMpfX07YS5wcm90b3R5cGUuY2Zvcj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLm5ld0Jsb2NrKFwiZm9yIHN0YXJ0XCIpLGM9dGhpcy5uZXdCbG9jayhcImZvciBjbGVhbnVwXCIpLGQ9dGhpcy5uZXdCbG9jayhcImZvciBlbmRcIik7dGhpcy5wdXNoQnJlYWtCbG9jayhkKTt0aGlzLnB1c2hDb250aW51ZUJsb2NrKGIpO1xudmFyIGU9dGhpcy52ZXhwcihhLml0ZXIpO2lmKHRoaXMudS5zdGUuZ2VuZXJhdG9yKXt2YXIgZj1cIiRsb2MuXCIrdGhpcy5nZW5zeW0oXCJpdGVyXCIpO2woZixcIj1Tay5hYnN0ci5pdGVyKFwiLGUsXCIpO1wiKX1lbHNlIGY9dGhpcy5fZ3IoXCJpdGVyXCIsXCJTay5hYnN0ci5pdGVyKFwiLGUsXCIpXCIpLHRoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKGYpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLGYsdGhpcy51LmNhblN1c3BlbmQ/XCIsIHRydWVcIjpcIiwgZmFsc2VcIixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtmPXRoaXMuX2dyKFwibmV4dFwiLFwiJHJldFwiKTt0aGlzLl9qdW1wdW5kZWYoZixjKTt0aGlzLnZleHByKGEudGFyZ2V0LGYpOyhTay5kZWJ1Z2dpbmd8fFNrLmtpbGxhYmxlRm9yKSYmdGhpcy51LmNhblN1c3BlbmQmJihmPXRoaXMubmV3QmxvY2soXCJkZWJ1ZyBicmVha3BvaW50IGZvciBsaW5lIFwiK2EubGluZW5vKSxsKFwiaWYgKFNrLmJyZWFrcG9pbnRzKCdcIitcbnRoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIikpIHtcIixcInZhciAkc3VzcCA9ICRzYXZlU3VzcGVuc2lvbih7ZGF0YToge3R5cGU6ICdTay5kZWxheSd9LCByZXN1bWU6IGZ1bmN0aW9uKCkge319LCAnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKTtcIixcIiRzdXNwLiRibGsgPSBcIitmK1wiO1wiLFwiJHN1c3Aub3B0aW9uYWwgPSB0cnVlO1wiLFwicmV0dXJuICRzdXNwO1wiLFwifVwiKSx0aGlzLl9qdW1wKGYpLHRoaXMuc2V0QmxvY2soZiksdGhpcy51LmRvZXNTdXNwZW5kPSEwKTt0aGlzLnZzZXFzdG10KGEuYm9keSk7dGhpcy5fanVtcChiKTt0aGlzLnNldEJsb2NrKGMpO3RoaXMucG9wQ29udGludWVCbG9jaygpO3RoaXMucG9wQnJlYWtCbG9jaygpO3RoaXMudnNlcXN0bXQoYS5vcmVsc2UpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhkKX07YS5wcm90b3R5cGUuY3JhaXNlPWZ1bmN0aW9uKGEpe2lmKGEuZXhjKXt2YXIgYj1cbnRoaXMuX2dyKFwiZXhjXCIsdGhpcy52ZXhwcihhLmV4YykpLGM9dGhpcy5uZXdCbG9jayhcImV4Y2VwdGlvbiBub3cgaW5zdGFudGlhdGVkXCIpLGQ9dGhpcy5fZ3IoXCJpc2NsYXNzXCIsYitcIi5wcm90b3R5cGUgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb25cIik7dGhpcy5fanVtcGZhbHNlKGQsYyk7YS5pbnN0PyhkPXRoaXMuX2dyKFwiaW5zdFwiLHRoaXMudmV4cHIoYS5pbnN0KSksbChcImlmKCEoXCIsZCxcIiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKSB7XCIsZCxcIj0gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW1wiLGQsXCJdKTtcIixcIn1cIiksbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYixcIixcIixkLFwiLnYpO1wiKSk6bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kKFwiLGIsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7bChiLFwiPSRyZXQ7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTtsKFwiaWYgKFwiLGIsXG5cIiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikge3Rocm93IFwiLGIsXCI7fSBlbHNlIHt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoJ2V4Y2VwdGlvbnMgbXVzdCBkZXJpdmUgZnJvbSBCYXNlRXhjZXB0aW9uJyk7fTtcIil9ZWxzZSBsKFwidGhyb3cgJGVycjtcIil9O2EucHJvdG90eXBlLm91dHB1dEZpbmFsbHlDYXNjYWRlPWZ1bmN0aW9uKGEpe2lmKDA9PXRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aClsKFwiaWYoJHBvc3RmaW5hbGx5IT09dW5kZWZpbmVkKSB7IGlmICgkcG9zdGZpbmFsbHkucmV0dXJuaW5nKSB7IHJldHVybiAkcG9zdGZpbmFsbHkucmV0dXJuaW5nOyB9IGVsc2UgeyAkYmxrPSRwb3N0ZmluYWxseS5nb3RvQmxvY2s7ICRwb3N0ZmluYWxseT11bmRlZmluZWQ7IGNvbnRpbnVlOyB9IH1cIik7ZWxzZXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtsKFwiaWYoJHBvc3RmaW5hbGx5IT09dW5kZWZpbmVkKSB7XCIsXCJpZiAoJHBvc3RmaW5hbGx5LnJldHVybmluZ1wiLFxuYi5icmVha0RlcHRoPT1hLmJyZWFrRGVwdGg/XCJ8fCAkcG9zdGZpbmFsbHkuaXNCcmVha1wiOlwiXCIsXCIpIHtcIixcIiRibGs9XCIsYi5ibGssXCI7Y29udGludWU7XCIsXCJ9IGVsc2Uge1wiLFwiJGJsaz0kcG9zdGZpbmFsbHkuZ290b0Jsb2NrOyRwb3N0ZmluYWxseT11bmRlZmluZWQ7Y29udGludWU7XCIsXCJ9XCIsXCJ9XCIpfX07YS5wcm90b3R5cGUuY3RyeT1mdW5jdGlvbihhKXt2YXIgYixjPWEuaGFuZGxlcnMubGVuZ3RoO2lmKGEuZmluYWxib2R5KXt2YXIgZD10aGlzLm5ld0Jsb2NrKFwiZmluYWxib2R5XCIpO3ZhciBlPXRoaXMubmV3QmxvY2soXCJmaW5hbGV4aFwiKTt2YXIgZj10aGlzLl9ncihcImZpbmFsbHlfcmVyYWlzZVwiLFwidW5kZWZpbmVkXCIpO3RoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKGYpO3RoaXMucHVzaEZpbmFsbHlCbG9jayhkKTt2YXIgaD10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTt0aGlzLnNldHVwRXhjZXB0KGUpfXZhciBtPVtdO2ZvcihiPTA7YjxjOysrYiltLnB1c2godGhpcy5uZXdCbG9jayhcImV4Y2VwdF9cIitcbmIrXCJfXCIpKTt2YXIgcT10aGlzLm5ld0Jsb2NrKFwidW5oYW5kbGVkXCIpO3ZhciBCPXRoaXMubmV3QmxvY2soXCJvcmVsc2VcIik7dmFyIEQ9dGhpcy5uZXdCbG9jayhcImVuZFwiKTswIT1tLmxlbmd0aCYmdGhpcy5zZXR1cEV4Y2VwdChtWzBdKTt0aGlzLnZzZXFzdG10KGEuYm9keSk7MCE9bS5sZW5ndGgmJnRoaXMuZW5kRXhjZXB0KCk7dGhpcy5fanVtcChCKTtmb3IoYj0wO2I8YzsrK2Ipe3RoaXMuc2V0QmxvY2sobVtiXSk7dmFyIEU9YS5oYW5kbGVyc1tiXTtpZighRS50eXBlJiZiPGMtMSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImRlZmF1bHQgJ2V4Y2VwdDonIG11c3QgYmUgbGFzdFwiLHRoaXMuZmlsZW5hbWUsRS5saW5lbm8pO2lmKEUudHlwZSl7dmFyIEY9dGhpcy52ZXhwcihFLnR5cGUpO3ZhciBNPWI9PWMtMT9xOm1bYisxXTtGPXRoaXMuX2dyKFwiaW5zdGFuY2VcIixcIlNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzaW5zdGFuY2UoJGVyciwgXCIsRixcIikpXCIpO1xudGhpcy5fanVtcGZhbHNlKEYsTSl9RS5uYW1lJiZ0aGlzLnZleHByKEUubmFtZSxcIiRlcnJcIik7dGhpcy52c2Vxc3RtdChFLmJvZHkpO3RoaXMuX2p1bXAoRCl9dGhpcy5zZXRCbG9jayhxKTtsKFwidGhyb3cgJGVycjtcIik7dGhpcy5zZXRCbG9jayhCKTt0aGlzLnZzZXFzdG10KGEub3JlbHNlKTt0aGlzLl9qdW1wKEQpO3RoaXMuc2V0QmxvY2soRCk7YS5maW5hbGJvZHkmJih0aGlzLmVuZEV4Y2VwdCgpLHRoaXMuX2p1bXAoZCksdGhpcy5zZXRCbG9jayhlKSxsKGYsXCI9JGVycjtcIiksdGhpcy5fanVtcChkKSx0aGlzLnNldEJsb2NrKGQpLHRoaXMucG9wRmluYWxseUJsb2NrKCksdGhpcy52c2Vxc3RtdChhLmZpbmFsYm9keSksbChcImlmKFwiLGYsXCIhPT11bmRlZmluZWQpIHsgdGhyb3cgXCIsZixcIjt9XCIpLHRoaXMub3V0cHV0RmluYWxseUNhc2NhZGUoaCkpfTthLnByb3RvdHlwZS5jd2l0aD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMubmV3QmxvY2soXCJ3aXRoZXhoXCIpLGQ9dGhpcy5uZXdCbG9jayhcIndpdGh0aWR5dXBcIiksXG5lPXRoaXMubmV3QmxvY2soXCJ3aXRoY2FycnlvblwiKTt2YXIgZj10aGlzLl9ncihcIm1nclwiLHRoaXMudmV4cHIoYS5pdGVtc1tiXS5jb250ZXh0X2V4cHIpKTtsKFwiJHJldCA9IFNrLmFic3RyLmxvb2t1cFNwZWNpYWwoXCIsZixcIixTay5idWlsdGluLnN0ci4kZXhpdCk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt2YXIgZz10aGlzLl9ncihcImV4aXRcIixcIiRyZXRcIik7dGhpcy51LnRlbXBzVG9TYXZlLnB1c2goZyk7bChcIiRyZXQgPSBTay5hYnN0ci5sb29rdXBTcGVjaWFsKFwiLGYsXCIsU2suYnVpbHRpbi5zdHIuJGVudGVyKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2woXCIkcmV0ID0gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KCRyZXQpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7Zj10aGlzLl9ncihcInZhbHVlXCIsXCIkcmV0XCIpO3RoaXMucHVzaEZpbmFsbHlCbG9jayhkKTt2YXIgaD10aGlzLnUuZmluYWxseUJsb2Nrc1t0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGgtXG4xXTt0aGlzLnNldHVwRXhjZXB0KGMpO2EuaXRlbXNbYl0ub3B0aW9uYWxfdmFycyYmdGhpcy5uYW1lb3AoYS5pdGVtc1tiXS5vcHRpb25hbF92YXJzLmlkLFNrLmFzdG5vZGVzLlN0b3JlLGYpO2IrMTxhLml0ZW1zLmxlbmd0aD90aGlzLmN3aXRoKGEsYisxKTp0aGlzLnZzZXFzdG10KGEuYm9keSk7dGhpcy5lbmRFeGNlcHQoKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soYyk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChcIixnLFwiLHVuZGVmaW5lZCxTay5idWlsdGluLmdldEV4Y0luZm8oJGVyciksdW5kZWZpbmVkLFtdKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO3RoaXMuX2p1bXB0cnVlKFwiJHJldFwiLGUpO2woXCJ0aHJvdyAkZXJyO1wiKTt0aGlzLnNldEJsb2NrKGQpO3RoaXMucG9wRmluYWxseUJsb2NrKCk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsZyxcIixbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtcIik7XG50aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7dGhpcy5vdXRwdXRGaW5hbGx5Q2FzY2FkZShoKTt0aGlzLl9qdW1wKGUpO3RoaXMuc2V0QmxvY2soZSl9O2EucHJvdG90eXBlLmNhc3NlcnQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52ZXhwcihhLnRlc3QpLGM9dGhpcy5uZXdCbG9jayhcImVuZFwiKTt0aGlzLl9qdW1wdHJ1ZShiLGMpO2woXCJ0aHJvdyBuZXcgU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcihcIixhLm1zZz90aGlzLnZleHByKGEubXNnKTpcIlwiLFwiKTtcIik7dGhpcy5zZXRCbG9jayhjKX07YS5wcm90b3R5cGUuY2ltcG9ydGFzPWZ1bmN0aW9uKGEsYixjKXthPWEudjt2YXIgZD1hLmluZGV4T2YoXCIuXCIpLGU9YztpZigtMSE9PWQpZm9yKGE9YS5zdWJzdHIoZCsxKTstMSE9PWQ7KWQ9YS5pbmRleE9mKFwiLlwiKSxjPS0xIT09ZD9hLnN1YnN0cigwLGQpOmEsZT10aGlzLl9ncihcImxhdHRyXCIsXCJTay5hYnN0ci5nYXR0cihcIixlLFwiLCBuZXcgU2suYnVpbHRpbi5zdHIoJ1wiLGMsXCInKSlcIiksYT1cbmEuc3Vic3RyKGQrMSk7cmV0dXJuIHRoaXMubmFtZW9wKGIsU2suYXN0bm9kZXMuU3RvcmUsZSl9O2EucHJvdG90eXBlLmNpbXBvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz1hLm5hbWVzLmxlbmd0aDtmb3IoYj0wO2I8YzsrK2Ipe3ZhciBkPWEubmFtZXNbYl07bChcIiRyZXQgPSBTay5idWlsdGluLl9faW1wb3J0X18oXCIsZC5uYW1lLiRyKCkudixcIiwkZ2JsLCRsb2MsW10sXCIsU2suX19mdXR1cmVfXy5hYnNvbHV0ZV9pbXBvcnQ/MDotMSxcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt2YXIgZT10aGlzLl9ncihcIm1vZHVsZVwiLFwiJHJldFwiKTtpZihkLmFzbmFtZSl0aGlzLmNpbXBvcnRhcyhkLm5hbWUsZC5hc25hbWUsZSk7ZWxzZXt2YXIgZj1kLm5hbWU7ZD1mLnYuaW5kZXhPZihcIi5cIik7LTEhPT1kJiYoZj1uZXcgU2suYnVpbHRpbi5zdHIoZi52LnN1YnN0cigwLGQpKSk7dGhpcy5uYW1lb3AoZixTay5hc3Rub2Rlcy5TdG9yZSxlKX19fTthLnByb3RvdHlwZS5jZnJvbWltcG9ydD1cbmZ1bmN0aW9uKGEpe3ZhciBjLGQ9YS5uYW1lcy5sZW5ndGg7dmFyIGU9W107dmFyIGY9YS5sZXZlbDswIT1mfHxTay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydHx8KGY9LTEpO2ZvcihjPTA7YzxkOysrYyllW2NdPVwiJ1wiK2IoYS5uYW1lc1tjXS5uYW1lLnYpK1wiJ1wiO2woXCIkcmV0ID0gU2suYnVpbHRpbi5fX2ltcG9ydF9fKFwiLGEubW9kdWxlLiRyKCkudixcIiwkZ2JsLCRsb2MsW1wiLGUsXCJdLFwiLGYsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7Zj10aGlzLl9ncihcIm1vZHVsZVwiLFwiJHJldFwiKTtmb3IoYz0wO2M8ZDsrK2Mpe2U9YS5uYW1lc1tjXTt2YXIgaD1cIidcIitlLm5hbWUuditcIidcIjtpZigwPT09YyYmXCIqXCI9PT1lLm5hbWUudil7U2suYXNzZXJ0cy5hc3NlcnQoMT09PWQpO2woXCJTay5pbXBvcnRTdGFyKFwiLGYsXCIsJGxvYywgJGdibCk7XCIpO2JyZWFrfXZhciBtPXRoaXMuX2dyKFwiaXRlbVwiLFwiU2suYWJzdHIuZ2F0dHIoXCIsZixcIiwgbmV3IFNrLmJ1aWx0aW4uc3RyKFwiLGgsXG5cIiksIHVuZGVmaW5lZClcIik7aD1lLm5hbWU7ZS5hc25hbWUmJihoPWUuYXNuYW1lKTt0aGlzLm5hbWVvcChoLFNrLmFzdG5vZGVzLlN0b3JlLG0pfX07YS5wcm90b3R5cGUuYnVpbGRjb2Rlb2JqPWZ1bmN0aW9uKGEsYyxmLGssaCxtKXt2YXIgZD1bXSxnPVtdLG49W10scD1bXSxxPW51bGwsdT1udWxsO2YmJihnPXRoaXMudnNlcWV4cHIoZikpO2smJmsuZGVmYXVsdHMmJihuPXRoaXMudnNlcWV4cHIoay5kZWZhdWx0cykpO2smJmsua3dfZGVmYXVsdHMmJihwPWsua3dfZGVmYXVsdHMubWFwKGE9PmE/dGhpcy52ZXhwcihhKTpcInVuZGVmaW5lZFwiKSk7ayYmay52YXJhcmcmJihxPWsudmFyYXJnKTtrJiZrLmt3YXJnJiYodT1rLmt3YXJnKTtpZighU2suX19mdXR1cmVfXy5weXRob24zJiZrJiZrLmt3b25seWFyZ3MmJjAhPWsua3dvbmx5YXJncy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJLZXl3b3JkLW9ubHkgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO1xudmFyIEY9dGhpcy5lbnRlclNjb3BlKGMsYSxhLmxpbmVubyx0aGlzLmNhblN1c3BlbmQpO2Y9dGhpcy51LnN0ZS5nZW5lcmF0b3I7dmFyIE09dGhpcy51LnN0ZS5oYXNGcmVlO3ZhciBWPXRoaXMudS5zdGUuY2hpbGRIYXNGcmVlO3ZhciB5PXRoaXMubmV3QmxvY2soXCJjb2Rlb2JqIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK0YrXCI9KGZ1bmN0aW9uIFwiK3RoaXMubmljZU5hbWUoYy52KStcIiQoXCI7dmFyIEc9W107aWYoZil7aWYodSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLnYrXCIoKToga2V5d29yZCBhcmd1bWVudHMgaW4gZ2VuZXJhdG9ycyBub3Qgc3VwcG9ydGVkXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7aWYocSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLnYrXCIoKTogdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBnZW5lcmF0b3JzIG5vdCBzdXBwb3J0ZWRcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtHLnB1c2goXCIkZ2VuXCIpfWVsc2V7dSYmXG4oRy5wdXNoKFwiJGt3YVwiKSx0aGlzLnUudGVtcHNUb1NhdmUucHVzaChcIiRrd2FcIikpO2ZvcihhPTA7ayYmYTxrLmFyZ3MubGVuZ3RoOysrYSlHLnB1c2godGhpcy5uYW1lb3Aoay5hcmdzW2FdLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSkpO2ZvcihhPTA7ayYmay5rd29ubHlhcmdzJiZhPGsua3dvbmx5YXJncy5sZW5ndGg7KythKUcucHVzaCh0aGlzLm5hbWVvcChrLmt3b25seWFyZ3NbYV0uYXJnLFNrLmFzdG5vZGVzLlBhcmFtKSk7cSYmRy5wdXNoKHRoaXMubmFtZW9wKGsudmFyYXJnLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSkpfWxldCBMPSFmO00mJihMfHxHLnB1c2goXCIkZnJlZVwiKSx0aGlzLnUudGVtcHNUb1NhdmUucHVzaChcIiRmcmVlXCIpKTt0aGlzLnUucHJlZml4Q29kZT1MP3RoaXMudS5wcmVmaXhDb2RlK1wiJHBvc2FyZ3MsJGt3YXJnc1wiOnRoaXMudS5wcmVmaXhDb2RlK0cuam9pbihcIixcIik7dGhpcy51LnByZWZpeENvZGUrPVwiKXtcIjtmJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gZ2VuZXJhdG9yXFxuXCIpO1xuTSYmKHRoaXMudS5wcmVmaXhDb2RlKz1cIlxcbi8vIGhhcyBmcmVlXFxuXCIpO1YmJih0aGlzLnUucHJlZml4Q29kZSs9XCJcXG4vLyBoYXMgY2VsbFxcblwiKTtMJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gZmFzdCBjYWxsXFxuXCIpO3ZhciBUPVwie31cIjtmJiYoeT1cIiRnZW4uZ2kkcmVzdW1lYXRcIixUPVwiJGdlbi5naSRsb2NhbHNcIik7YT1cIiwkY2VsbD17fVwiO1YmJmYmJihhPVwiLCRjZWxsPSRnZW4uZ2kkY2VsbHNcIik7dGhpcy51LnZhckRlY2xzQ29kZSs9XCJ2YXIgJGJsaz1cIit5K1wiLCRleGM9W10sJGxvYz1cIitUK2ErXCIsJGdibD1cIisoTD9cInRoaXMgJiYgdGhpcy5mdW5jX2dsb2JhbHNcIjpcInRoaXNcIikrKEwmJk0/XCIsJGZyZWU9dGhpcyAmJiB0aGlzLmZ1bmNfY2xvc3VyZVwiOlwiXCIpK1wiLCRlcnI9dW5kZWZpbmVkLCRyZXQ9dW5kZWZpbmVkLCRwb3N0ZmluYWxseT11bmRlZmluZWQsJGN1cnJMaW5lTm89dW5kZWZpbmVkLCRjdXJyQ29sTm89dW5kZWZpbmVkO1wiO251bGwhPT1Tay5leGVjTGltaXQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cblwiaWYgKHR5cGVvZiBTay5leGVjU3RhcnQgPT09ICd1bmRlZmluZWQnKSB7U2suZXhlY1N0YXJ0ID0gRGF0ZS5ub3coKX1cIik7bnVsbCE9PVNrLnlpZWxkTGltaXQmJnRoaXMudS5jYW5TdXNwZW5kJiYodGhpcy51LnZhckRlY2xzQ29kZSs9XCJpZiAodHlwZW9mIFNrLmxhc3RZaWVsZCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5sYXN0WWllbGQgPSBEYXRlLm5vdygpfVwiKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmIChcIitGK1wiLiR3YWtpbmdTdXNwZW5zaW9uIT09dW5kZWZpbmVkKSB7ICR3YWtlRnJvbVN1c3BlbnNpb24oKTsgfSBlbHNlIHtcIjtpZihMKXt0aGlzLnUudmFyRGVjbHNDb2RlPXV8fHF8fGsmJmsua3dvbmx5YXJncyYmMCE9PWsua3dvbmx5YXJncy5sZW5ndGg/dGhpcy51LnZhckRlY2xzQ29kZStcIlxcbnZhciAkYXJncyA9IHRoaXMuJHJlc29sdmVBcmdzKCRwb3NhcmdzLCRrd2FyZ3MpXFxuXCI6dGhpcy51LnZhckRlY2xzQ29kZSsoXCJ2YXIgJGFyZ3MgPSAoKCEka3dhcmdzIHx8ICRrd2FyZ3MubGVuZ3RoPT09MCkgJiYgJHBvc2FyZ3MubGVuZ3RoPT09XCIrXG5HLmxlbmd0aCtcIikgPyAkcG9zYXJncyA6IHRoaXMuJHJlc29sdmVBcmdzKCRwb3NhcmdzLCRrd2FyZ3MpXCIpO2ZvcihhPTA7YTxHLmxlbmd0aDthKyspdGhpcy51LnZhckRlY2xzQ29kZSs9XCIsXCIrR1thXStcIj0kYXJnc1tcIithK1wiXVwiO3RoaXMudS52YXJEZWNsc0NvZGUrPVwiO1xcblwifWlmKGYmJjA8bi5sZW5ndGgpZm9yKHk9ay5hcmdzLmxlbmd0aC1uLmxlbmd0aCxhPTA7YTxuLmxlbmd0aDsrK2EpRz10aGlzLm5hbWVvcChrLmFyZ3NbYSt5XS5hcmcsU2suYXN0bm9kZXMuUGFyYW0pLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYoXCIrRytcIj09PXVuZGVmaW5lZClcIitHK1wiPVwiK0YrXCIuJGRlZmF1bHRzW1wiK2ErXCJdO1wiO2ZvcihhPTA7ayYmYTxrLmFyZ3MubGVuZ3RoOysrYSlHPWsuYXJnc1thXS5hcmcsdGhpcy5pc0NlbGwoRykmJihHPWIoZSh0aGlzLnUucHJpdmF0ZV8sRykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIitHK1wiPVwiK0crXCI7XCIpO2ZvcihhPTA7ayYmay5rd29ubHlhcmdzJiZcbmE8ay5rd29ubHlhcmdzLmxlbmd0aDsrK2EpRz1rLmt3b25seWFyZ3NbYV0uYXJnLHRoaXMuaXNDZWxsKEcpJiYoRz1iKGUodGhpcy51LnByaXZhdGVfLEcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrRytcIj1cIitHK1wiO1wiKTtxJiZ0aGlzLmlzQ2VsbChxLmFyZykmJihhPWIoZSh0aGlzLnUucHJpdmF0ZV8scS5hcmcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrYStcIj1cIithK1wiO1wiKTt1JiYodGhpcy51LmxvY2FsbmFtZXMucHVzaCh1LmFyZy52KSx0aGlzLnUudmFyRGVjbHNDb2RlKz11LmFyZy52K1wiPW5ldyBTay5idWlsdGluc1snZGljdCddKCRrd2EpO1wiLHRoaXMuaXNDZWxsKHUuYXJnKSYmKGE9YihlKHRoaXMudS5wcml2YXRlXyx1LmFyZykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIithK1wiPVwiK2ErXCI7XCIpKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cIn1cIjtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJm0mJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cblwiJGdibC5fX2NsYXNzX189JGdibC5cIittLnYrXCI7XCIpO3RoaXMudS5zd2l0Y2hDb2RlPVwid2hpbGUodHJ1ZSl7dHJ5e1wiO3RoaXMudS5zd2l0Y2hDb2RlKz10aGlzLm91dHB1dEludGVycnVwdFRlc3QoKTt0aGlzLnUuc3dpdGNoQ29kZSs9XCJzd2l0Y2goJGJsayl7XCI7dGhpcy51LnN1ZmZpeENvZGU9XCJ9IH1jYXRjaChlcnIpeyBpZiAoIShlcnIgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb24pKSB7IGVyciA9IG5ldyBTay5idWlsdGluLkV4dGVybmFsRXJyb3IoZXJyKTsgfSBlcnIudHJhY2ViYWNrLnB1c2goe2xpbmVubzogJGN1cnJMaW5lTm8sIGNvbG5vOiAkY3VyckNvbE5vLCBmaWxlbmFtZTogJ1wiK3RoaXMuZmlsZW5hbWUrXCInfSk7IGlmICgkZXhjLmxlbmd0aD4wKSB7ICRlcnIgPSBlcnI7ICRibGs9JGV4Yy5wb3AoKTsgY29udGludWU7IH0gZWxzZSB7IHRocm93IGVycjsgfX0gfX0pO1wiO2guY2FsbCh0aGlzLEYpO2lmKGspe2ZvcihsZXQgYSBvZiBrLmFyZ3MpZC5wdXNoKGEuYXJnLnYpO1xuZm9yKGxldCBhIG9mIGsua3dvbmx5YXJnc3x8W10pZC5wdXNoKGEuYXJnLnYpO3RoaXMudS5hcmduYW1lcz1kfXRoaXMuZXhpdFNjb3BlKCk7MDxuLmxlbmd0aCYmbChGLFwiLiRkZWZhdWx0cz1bXCIsbi5qb2luKFwiLFwiKSxcIl07XCIpO2smJmsua3dvbmx5YXJncyYmMDxrLmt3b25seWFyZ3MubGVuZ3RoJiYobChGLFwiLmNvX2FyZ2NvdW50PVwiLGsuYXJncy5sZW5ndGgsXCI7XCIpLGwoRixcIi5jb19rd29ubHlhcmdjb3VudD1cIixrLmt3b25seWFyZ3MubGVuZ3RoLFwiO1wiKSxsKEYsXCIuJGt3ZGVmcz1bXCIscC5qb2luKFwiLFwiKSxcIl07XCIpKTswPGQubGVuZ3RoP2woRixcIi5jb192YXJuYW1lcz1bJ1wiLGQuam9pbihcIicsJ1wiKSxcIiddO1wiKTpsKEYsXCIuY29fdmFybmFtZXM9W107XCIpO3UmJmwoRixcIi5jb19rd2FyZ3M9MTtcIik7cSYmbChGLFwiLmNvX3ZhcmFyZ3M9MTtcIik7Znx8bChGLFwiLmNvX2Zhc3RjYWxsPTE7XCIpO2g9XCJcIjtNJiYoaD1cIiwkY2VsbFwiLChtPXRoaXMudS5zdGUuaGFzRnJlZSkmJihoKz1cIiwkZnJlZVwiKSk7XG5pZihmKXJldHVybiBrJiYwPGsuYXJncy5sZW5ndGg/dGhpcy5fZ3IoXCJnZW5lclwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKChmdW5jdGlvbigpe3ZhciAkb3JpZ2FyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJcIixjLnYsJ1wiLGFyZ3VtZW50cy5sZW5ndGgsJyxrLmFyZ3MubGVuZ3RoLW4ubGVuZ3RoLFwiLFwiLGsuYXJncy5sZW5ndGgsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbnNbJ2dlbmVyYXRvciddKFwiLEYsXCIsJGdibCwkb3JpZ2FyZ3NcIixoLFwiKTt9KSlcIik6dGhpcy5fZ3IoXCJnZW5lclwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKChmdW5jdGlvbigpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIlwiLGMudixcIlxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApO3JldHVybiBuZXcgU2suYnVpbHRpbnNbJ2dlbmVyYXRvciddKFwiLEYsXCIsJGdibCxbXVwiLGgsXCIpO30pKVwiKTtpZigwPGcubGVuZ3RoKXtsKFwiJHJldCA9IG5ldyBTay5idWlsdGluc1snZnVuY3Rpb24nXShcIixcbkYsXCIsJGdibFwiLGgsXCIpO1wiKTtmb3IobGV0IGEgb2YgZy5yZXZlcnNlKCkpbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYSxcIixbJHJldF0pO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKTtyZXR1cm4gdGhpcy5fZ3IoXCJmdW5jb2JqXCIsXCIkcmV0XCIpfXJldHVybiB0aGlzLl9ncihcImZ1bmNvYmpcIixcIm5ldyBTay5idWlsdGluc1snZnVuY3Rpb24nXShcIixGLFwiLCRnYmxcIixoLFwiKVwiKX07YS5wcm90b3R5cGUuY2Z1bmN0aW9uPWZ1bmN0aW9uKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmKTtiPXRoaXMuYnVpbGRjb2Rlb2JqKGEsYS5uYW1lLGEuZGVjb3JhdG9yX2xpc3QsYS5hcmdzLGZ1bmN0aW9uKGIpe3RoaXMudnNlcXN0bXQoYS5ib2R5KTtsKFwicmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtcIil9LGIpO3RoaXMubmFtZW9wKGEubmFtZSxTay5hc3Rub2Rlcy5TdG9yZSxiKX07YS5wcm90b3R5cGUuY2xhbWJkYT1cbmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5MYW1iZGEpO3JldHVybiB0aGlzLmJ1aWxkY29kZW9iaihhLG5ldyBTay5idWlsdGluLnN0cihcIjxsYW1iZGE+XCIpLG51bGwsYS5hcmdzLGZ1bmN0aW9uKGIpe2I9dGhpcy52ZXhwcihhLmJvZHkpO2woXCJyZXR1cm4gXCIsYixcIjtcIil9KX07YS5wcm90b3R5cGUuY2lmZXhwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmV3QmxvY2soXCJuZXh0IG9mIGlmZXhwXCIpLGM9dGhpcy5uZXdCbG9jayhcImVuZCBvZiBpZmV4cFwiKSxkPXRoaXMuX2dyKFwicmVzXCIsXCJudWxsXCIpLGU9dGhpcy52ZXhwcihhLnRlc3QpO3RoaXMuX2p1bXBmYWxzZShlLGIpO2woZCxcIj1cIix0aGlzLnZleHByKGEuYm9keSksXCI7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhiKTtsKGQsXCI9XCIsdGhpcy52ZXhwcihhLm9yZWxzZSksXCI7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTtyZXR1cm4gZH07YS5wcm90b3R5cGUuY2dlbmV4cGdlbj1cbmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLm5ld0Jsb2NrKFwic3RhcnQgZm9yIFwiK2IpLGU9dGhpcy5uZXdCbG9jayhcInNraXAgZm9yIFwiK2IpO3RoaXMubmV3QmxvY2soXCJpZiBjbGVhbnVwIGZvciBcIitiKTt2YXIgZj10aGlzLm5ld0Jsb2NrKFwiZW5kIGZvciBcIitiKSxnPWFbYl07aWYoMD09PWIpdmFyIGg9XCIkbG9jLiRpdGVyMFwiO2Vsc2V7dmFyIG09dGhpcy52ZXhwcihnLml0ZXIpO2g9XCIkbG9jLlwiK3RoaXMuZ2Vuc3ltKFwiaXRlclwiKTtsKGgsXCI9XCIsXCJTay5hYnN0ci5pdGVyKFwiLG0sXCIpO1wiKX10aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCk7dGhpcy5hbm5vdGF0ZVNvdXJjZShjKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLGgsdGhpcy51LmNhblN1c3BlbmQ/XCIsIHRydWVcIjpcIiwgZmFsc2VcIixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihjKTttPXRoaXMuX2dyKFwibmV4dFwiLFwiJHJldFwiKTt0aGlzLl9qdW1wdW5kZWYobSxmKTt0aGlzLnZleHByKGcudGFyZ2V0LFxubSk7dmFyIG49Zy5pZnM/Zy5pZnMubGVuZ3RoOjA7Zm9yKGg9MDtoPG47KytoKXRoaXMuYW5ub3RhdGVTb3VyY2UoZy5pZnNbaF0pLG09dGhpcy52ZXhwcihnLmlmc1toXSksdGhpcy5fanVtcGZhbHNlKG0sZCk7KytiPGEubGVuZ3RoJiZ0aGlzLmNnZW5leHBnZW4oYSxiLGMpO2I+PWEubGVuZ3RoJiYodGhpcy5hbm5vdGF0ZVNvdXJjZShjKSxhPXRoaXMudmV4cHIoYyksbChcInJldHVybiBbXCIsZSxcIi8qcmVzdW1lKi8sXCIsYSxcIi8qcmV0Ki9dO1wiKSx0aGlzLnNldEJsb2NrKGUpKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZik7MT09PWImJmwoXCJyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO1wiKX07YS5wcm90b3R5cGUuY2dlbmV4cD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmJ1aWxkY29kZW9iaihhLG5ldyBTay5idWlsdGluLnN0cihcIjxnZW5leHByPlwiKSxudWxsLG51bGwsZnVuY3Rpb24oYil7dGhpcy5jZ2VuZXhwZ2VuKGEuZ2VuZXJhdG9ycywwLGEuZWx0KX0pO2I9dGhpcy5fZ3IoXCJnZW5lclwiLFxuXCJTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoXCIsYixcIik7XCIpO2woYixcIi5naSRsb2NhbHMuJGl0ZXIwPVNrLmFic3RyLml0ZXIoXCIsdGhpcy52ZXhwcihhLmdlbmVyYXRvcnNbMF0uaXRlciksXCIpO1wiKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY2NsYXNzPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5DbGFzc0RlZik7dmFyIGI9dGhpcy52c2VxZXhwcihhLmRlY29yYXRvcl9saXN0KTt2YXIgYz10aGlzLnZzZXFleHByKGEuYmFzZXMpO3ZhciBkPXRoaXMuZW50ZXJTY29wZShhLm5hbWUsYSxhLmxpbmVubyk7dmFyIGU9dGhpcy5uZXdCbG9jayhcImNsYXNzIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK2QrXCI9KGZ1bmN0aW9uICRcIithLm5hbWUuditcIiRjbGFzc19vdXRlcigkZ2xvYmFscywkbG9jYWxzLCRjZWxsKXt2YXIgJGdibD0kZ2xvYmFscywkbG9jPSRsb2NhbHM7JGZyZWU9JGdsb2JhbHM7XCI7dGhpcy51LnN3aXRjaENvZGUrPVxuXCIoZnVuY3Rpb24gJFwiK2EubmFtZS52K1wiJF9jbG9zdXJlKCRjZWxsKXtcIjt0aGlzLnUuc3dpdGNoQ29kZSs9XCJ2YXIgJGJsaz1cIitlK1wiLCRleGM9W10sJHJldD11bmRlZmluZWQsJHBvc3RmaW5hbGx5PXVuZGVmaW5lZCwkY3VyckxpbmVObz11bmRlZmluZWQsJGN1cnJDb2xObz11bmRlZmluZWQ7XCI7bnVsbCE9PVNrLmV4ZWNMaW1pdCYmKHRoaXMudS5zd2l0Y2hDb2RlKz1cImlmICh0eXBlb2YgU2suZXhlY1N0YXJ0ID09PSAndW5kZWZpbmVkJykge1NrLmV4ZWNTdGFydCA9IERhdGUubm93KCl9XCIpO251bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmKHRoaXMudS5zd2l0Y2hDb2RlKz1cImlmICh0eXBlb2YgU2subGFzdFlpZWxkID09PSAndW5kZWZpbmVkJykge1NrLmxhc3RZaWVsZCA9IERhdGUubm93KCl9XCIpO3RoaXMudS5zd2l0Y2hDb2RlKz1cIndoaWxlKHRydWUpe3RyeXtcIjt0aGlzLnUuc3dpdGNoQ29kZSs9dGhpcy5vdXRwdXRJbnRlcnJ1cHRUZXN0KCk7dGhpcy51LnN3aXRjaENvZGUrPVxuXCJzd2l0Y2goJGJsayl7XCI7dGhpcy51LnN1ZmZpeENvZGU9XCJ9fWNhdGNoKGVycil7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrdGhpcy5maWxlbmFtZStcIid9KTsgaWYgKCRleGMubGVuZ3RoPjApIHsgJGVyciA9IGVycjsgJGJsaz0kZXhjLnBvcCgpOyBjb250aW51ZTsgfSBlbHNlIHsgdGhyb3cgZXJyOyB9fX1cIjt0aGlzLnUuc3VmZml4Q29kZSs9XCJ9KS5jYWxsKG51bGwsICRjZWxsKTt9KTtcIjt0aGlzLnUucHJpdmF0ZV89YS5uYW1lO3RoaXMuY2JvZHkoYS5ib2R5LGEubmFtZSk7bChcInJldHVybjtcIik7dGhpcy5leGl0U2NvcGUoKTtsKFwiJHJldCA9IFNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoJGdibCxcIixkLFwiLFwiLGEubmFtZS4kcigpLnYsXG5cIixbXCIsYyxcIl0sICRjZWxsKTtcIik7Zm9yKGxldCBhIG9mIGIpbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYSxcIiwgWyRyZXRdKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCk7dGhpcy5uYW1lb3AoYS5uYW1lLFNrLmFzdG5vZGVzLlN0b3JlLFwiJHJldFwiKX07YS5wcm90b3R5cGUuY2NvbnRpbnVlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGVla0ZpbmFsbHlCbG9jaygpO2lmKDA9PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCInY29udGludWUnIG91dHNpZGUgbG9vcFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2E9dGhpcy51LmNvbnRpbnVlQmxvY2tzW3RoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgtMV07U2suYXNzZXJ0cy5hc3NlcnQodGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aD09PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgpO2ImJmIuYnJlYWtEZXB0aD09dGhpcy51LmNvbnRpbnVlQmxvY2tzLmxlbmd0aD9cbmwoXCIkcG9zdGZpbmFsbHk9e2lzQnJlYWs6dHJ1ZSxnb3RvQmxvY2s6XCIsYSxcIn07XCIpOnRoaXMuX2p1bXAoYSl9O2EucHJvdG90eXBlLmNicmVhaz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtpZigwPT09dGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidicmVhaycgb3V0c2lkZSBsb29wXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YT10aGlzLnUuYnJlYWtCbG9ja3NbdGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aC0xXTtiJiZiLmJyZWFrRGVwdGg9PXRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg/bChcIiRwb3N0ZmluYWxseT17aXNCcmVhazp0cnVlLGdvdG9CbG9jazpcIixhLFwifTtcIik6dGhpcy5fanVtcChhKX07YS5wcm90b3R5cGUudnN0bXQ9ZnVuY3Rpb24oYSxiKXt0aGlzLnUubGluZW5vPWEubGluZW5vO3RoaXMudS5saW5lbm9TZXQ9ITE7dGhpcy51LmxvY2FsdGVtcHM9W107aWYoU2suZGVidWdnaW5nJiZcbnRoaXMudS5jYW5TdXNwZW5kKXt2YXIgYz10aGlzLm5ld0Jsb2NrKFwiZGVidWcgYnJlYWtwb2ludCBmb3IgbGluZSBcIithLmxpbmVubyk7bChcImlmIChTay5icmVha3BvaW50cygnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKSkge1wiLFwidmFyICRzdXNwID0gJHNhdmVTdXNwZW5zaW9uKHtkYXRhOiB7dHlwZTogJ1NrLmRlYnVnJ30sIHJlc3VtZTogZnVuY3Rpb24oKSB7fX0sICdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2MrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTt0aGlzLnUuZG9lc1N1c3BlbmQ9ITB9dGhpcy5hbm5vdGF0ZVNvdXJjZShhKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZjp0aGlzLmNmdW5jdGlvbihhLGIpO1xuYnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5DbGFzc0RlZjp0aGlzLmNjbGFzcyhhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlJldHVybjppZih0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidyZXR1cm4nIG91dHNpZGUgZnVuY3Rpb25cIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtjPWEudmFsdWU/dGhpcy52ZXhwcihhLnZhbHVlKTpcIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOzA9PXRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aD9sKFwicmV0dXJuIFwiLGMsXCI7XCIpOihsKFwiJHBvc3RmaW5hbGx5PXtyZXR1cm5pbmc6XCIsYyxcIn07XCIpLHRoaXMuX2p1bXAodGhpcy5wZWVrRmluYWxseUJsb2NrKCkuYmxrKSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWxldGU6dGhpcy52c2VxZXhwcihhLnRhcmdldHMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXNzaWduOnZhciBkPWEudGFyZ2V0cy5sZW5ndGg7XG5jPXRoaXMudmV4cHIoYS52YWx1ZSk7Zm9yKGI9MDtiPGQ7KytiKXRoaXMudmV4cHIoYS50YXJnZXRzW2JdLGMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQW5uQXNzaWduOmM9dGhpcy52ZXhwcihhLnZhbHVlKTt0aGlzLnZleHByKGEudGFyZ2V0LGMpO3RoaXMudmV4cHIoYS5hbm5vdGF0aW9uKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF1Z0Fzc2lnbjpyZXR1cm4gdGhpcy5jYXVnYXNzaWduKGEpO2Nhc2UgU2suYXN0bm9kZXMuUHJpbnQ6dGhpcy5jcHJpbnQoYSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3I6cmV0dXJuIHRoaXMuY2ZvcihhKTtjYXNlIFNrLmFzdG5vZGVzLldoaWxlOnJldHVybiB0aGlzLmN3aGlsZShhKTtjYXNlIFNrLmFzdG5vZGVzLklmOnJldHVybiB0aGlzLmNpZihhKTtjYXNlIFNrLmFzdG5vZGVzLlJhaXNlOnJldHVybiB0aGlzLmNyYWlzZShhKTtjYXNlIFNrLmFzdG5vZGVzLlRyeTpyZXR1cm4gdGhpcy5jdHJ5KGEpO2Nhc2UgU2suYXN0bm9kZXMuV2l0aDpyZXR1cm4gdGhpcy5jd2l0aChhLFxuMCk7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NlcnQ6cmV0dXJuIHRoaXMuY2Fzc2VydChhKTtjYXNlIFNrLmFzdG5vZGVzLkltcG9ydDpyZXR1cm4gdGhpcy5jaW1wb3J0KGEpO2Nhc2UgU2suYXN0bm9kZXMuSW1wb3J0RnJvbTpyZXR1cm4gdGhpcy5jZnJvbWltcG9ydChhKTtjYXNlIFNrLmFzdG5vZGVzLkdsb2JhbDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4cHI6dGhpcy52ZXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhc3M6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5CcmVhazp0aGlzLmNicmVhayhhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNvbnRpbnVlOnRoaXMuY2NvbnRpbnVlKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVidWdnZXI6bChcImRlYnVnZ2VyO1wiKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlIGluIHZzdG10OiBcIitKU09OLnN0cmluZ2lmeShhKSl9fTthLnByb3RvdHlwZS52c2Vxc3RtdD1mdW5jdGlvbihhKXt2YXIgYjtcbmZvcihiPTA7YjxhLmxlbmd0aDsrK2IpdGhpcy52c3RtdChhW2JdKX07YS5wcm90b3R5cGUuaXNDZWxsPWZ1bmN0aW9uKGEpe2E9YihlKHRoaXMudS5wcml2YXRlXyxhKS52KTtyZXR1cm4gdGhpcy51LnN0ZS5nZXRTY29wZShhKT09PVNrLlNZTVRBQl9DT05TVFMuQ0VMTH07YS5wcm90b3R5cGUubmFtZW9wPWZ1bmN0aW9uKGEsYyxmKXtpZigoYz09PVNrLmFzdG5vZGVzLlN0b3JlfHxjPT09U2suYXN0bm9kZXMuQXVnU3RvcmV8fGM9PT1Tay5hc3Rub2Rlcy5EZWwpJiZcIl9fZGVidWdfX1wiPT09YS52KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuIG5vdCBhc3NpZ24gdG8gX19kZWJ1Z19fXCIsdGhpcy5maWxlbmFtZSx0aGlzLnUubGluZW5vKTtTay5hc3NlcnRzLmFzc2VydChcIk5vbmVcIiE9PWEudik7aWYoXCJOb3RJbXBsZW1lbnRlZFwiPT09YS52KXJldHVyblwiU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCRcIjt2YXIgZD1lKHRoaXMudS5wcml2YXRlXyxcbmEpLnY7ZD1iKGQpO3ZhciBnPTM7dmFyIGg9dGhpcy51LnN0ZS5nZXRTY29wZShkKTt2YXIgbT1udWxsO3N3aXRjaChoKXtjYXNlIFNrLlNZTVRBQl9DT05TVFMuRlJFRTptPVwiJGZyZWVcIjtnPTI7YnJlYWs7Y2FzZSBTay5TWU1UQUJfQ09OU1RTLkNFTEw6bT1cIiRjZWxsXCI7Zz0yO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5MT0NBTDp0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9ja3x8dGhpcy51LnN0ZS5nZW5lcmF0b3J8fChnPTApO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5HTE9CQUxfSU1QTElDSVQ6dGhpcy51LnN0ZS5ibG9ja1R5cGU9PT1Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2smJihnPTEpO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5HTE9CQUxfRVhQTElDSVQ6Zz0xfVNrLmFzc2VydHMuYXNzZXJ0KGh8fFwiX1wiPT09YS52LmNoYXJBdCgxKSk7YT1kO3RoaXMudS5zdGUuZ2VuZXJhdG9yfHx0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVxuU2suU1lNVEFCX0NPTlNUUy5GdW5jdGlvbkJsb2NrP2Q9XCIkbG9jLlwiK2Q6KDA9PT1nfHwzPT09ZykmJnRoaXMudS5sb2NhbG5hbWVzLnB1c2goZCk7c3dpdGNoKGcpe2Nhc2UgMDpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOmNhc2UgU2suYXN0bm9kZXMuUGFyYW06cmV0dXJuIGwoXCJpZiAoXCIsZCxcIiA9PT0gdW5kZWZpbmVkKSB7IHRocm93IG5ldyBTay5idWlsdGluLlVuYm91bmRMb2NhbEVycm9yKCdsb2NhbCB2YXJpYWJsZSBcXFxcJ1wiLGQsXCJcXFxcJyByZWZlcmVuY2VkIGJlZm9yZSBhc3NpZ25tZW50Jyk7IH1cXG5cIiksZDtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoZCxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlIFwiLGQsXCI7XCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkXCIpfWJyZWFrO2Nhc2UgMzpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOnJldHVybiB0aGlzLl9ncihcImxvYWRuYW1lXCIsZCxcblwiIT09dW5kZWZpbmVkP1wiLGQsXCI6U2subWlzY2V2YWwubG9hZG5hbWUoJ1wiLGEsXCInLCRnYmwpO1wiKTtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoZCxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlIFwiLGQsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFyYW06cmV0dXJuIGQ7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWRcIil9YnJlYWs7Y2FzZSAxOnN3aXRjaChjKXtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6cmV0dXJuIHRoaXMuX2dyKFwibG9hZGdibFwiLFwiU2subWlzY2V2YWwubG9hZG5hbWUoJ1wiLGEsXCInLCRnYmwpXCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChcIiRnYmwuXCIsYSxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlICRnYmwuXCIsYSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBpbiBuYW1lIG9wX2dsb2JhbFwiKX1icmVhaztjYXNlIDI6c3dpdGNoKGMpe2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gbStcblwiLlwiK2E7Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTpsKG0sXCIuXCIsYSxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhcmFtOnJldHVybiBhO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gbmFtZSBvcF9kZXJlZlwiKX1icmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlXCIpfX07YS5wcm90b3R5cGUuZW50ZXJTY29wZT1mdW5jdGlvbihhLGIsZSxmKXt2YXIgZD1uZXcgYztkLnN0ZT10aGlzLnN0LmdldFN0c0ZvckFzdChiKTtkLm5hbWU9YTtkLmZpcnN0bGluZW5vPWU7ZC5jYW5TdXNwZW5kPWZ8fCExO3RoaXMudSYmdGhpcy51LnByaXZhdGVfJiYoZC5wcml2YXRlXz10aGlzLnUucHJpdmF0ZV8pO3RoaXMuc3RhY2sucHVzaCh0aGlzLnUpO3RoaXMuYWxsVW5pdHMucHVzaChkKTthPXRoaXMuZ2Vuc3ltKFwic2NvcGVcIik7ZC5zY29wZW5hbWU9YTt0aGlzLnU9ZDt0aGlzLnUuYWN0aXZhdGVTY29wZSgpO3RoaXMubmVzdGxldmVsKys7XG5yZXR1cm4gYX07YS5wcm90b3R5cGUuZXhpdFNjb3BlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51O3RoaXMubmVzdGxldmVsLS07KHRoaXMudT0wPD10aGlzLnN0YWNrLmxlbmd0aC0xP3RoaXMuc3RhY2sucG9wKCk6bnVsbCkmJnRoaXMudS5hY3RpdmF0ZVNjb3BlKCk7aWYoXCI8bW9kdWxlPlwiIT09YS5uYW1lLnYpe3ZhciBiPWEubmFtZS4kcigpLnY7Yj1iLnN1YnN0cmluZygxLGIubGVuZ3RoLTEpO2woYS5zY29wZW5hbWUsXCIuY29fbmFtZT1uZXcgU2suYnVpbHRpbnNbJ3N0ciddKCdcIixiLFwiJyk7XCIpO3RoaXMuc3RhY2subGVuZ3RoJiZcImNsYXNzXCI9PXRoaXMudS5zdGUuYmxvY2tUeXBlJiZsKGEuc2NvcGVuYW1lLFwiLmNvX3F1YWxuYW1lPW5ldyBTay5idWlsdGluc1snc3RyJ10oJ1wiK3RoaXMudS5uYW1lLnYrXCIuXCIrYitcIicpO1wiKX1mb3IodmFyIGMgaW4gYS5jb25zdHMpYS5jb25zdHMuaGFzT3duUHJvcGVydHkoYykmJihhLnN1ZmZpeENvZGUrPWMrXCIgPSBcIithLmNvbnN0c1tjXStcIjtcIil9O1xuYS5wcm90b3R5cGUuY2JvZHk9ZnVuY3Rpb24oYSxiKXt2YXIgYztmb3IoYz0wO2M8YS5sZW5ndGg7KytjKXRoaXMudnN0bXQoYVtjXSxiKX07YS5wcm90b3R5cGUuY3ByaW50PWZ1bmN0aW9uKGEpe3ZhciBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5QcmludCk7YS5kZXN0JiZ0aGlzLnZleHByKGEuZGVzdCk7dmFyIGM9YS52YWx1ZXMubGVuZ3RoO2ZvcihiPTA7YjxjOysrYilsKFwiJHJldCA9IFNrLm1pc2NldmFsLnByaW50XyhcIixcIm5ldyBTay5idWlsdGluc1snc3RyJ10oXCIsdGhpcy52ZXhwcihhLnZhbHVlc1tiXSksXCIpLnYpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YS5ubCYmKGwoXCIkcmV0ID0gU2subWlzY2V2YWwucHJpbnRfKFwiLCdcIlxcXFxuXCIpOycpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKSl9O2EucHJvdG90eXBlLmNtb2Q9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lbnRlclNjb3BlKG5ldyBTay5idWlsdGluLnN0cihcIjxtb2R1bGU+XCIpLFxuYSwwLHRoaXMuY2FuU3VzcGVuZCksYz10aGlzLm5ld0Jsb2NrKFwibW9kdWxlIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK2IrXCI9KGZ1bmN0aW9uKCRmb3JjZWdibCl7XCI7dGhpcy51LnZhckRlY2xzQ29kZT1cInZhciAkZ2JsID0gJGZvcmNlZ2JsIHx8IHt9LCAkYmxrPVwiK2MrXCIsJGV4Yz1bXSwkbG9jPSRnYmwsJGNlbGw9e30sJGVycj11bmRlZmluZWQ7JGxvYy5fX2ZpbGVfXz1uZXcgU2suYnVpbHRpbnMuc3RyKCdcIit0aGlzLmZpbGVuYW1lK1wiJyk7dmFyICRyZXQ9dW5kZWZpbmVkLCRwb3N0ZmluYWxseT11bmRlZmluZWQsJGN1cnJMaW5lTm89dW5kZWZpbmVkLCRjdXJyQ29sTm89dW5kZWZpbmVkO1wiO251bGwhPT1Tay5leGVjTGltaXQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmICh0eXBlb2YgU2suZXhlY1N0YXJ0ID09PSAndW5kZWZpbmVkJykge1NrLmV4ZWNTdGFydCA9IERhdGUubm93KCl9XCIpO251bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmXG4odGhpcy51LnZhckRlY2xzQ29kZSs9XCJpZiAodHlwZW9mIFNrLmxhc3RZaWVsZCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5sYXN0WWllbGQgPSBEYXRlLm5vdygpfVwiKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmIChcIitiK1wiLiR3YWtpbmdTdXNwZW5zaW9uIT09dW5kZWZpbmVkKSB7ICR3YWtlRnJvbVN1c3BlbnNpb24oKTsgfWlmIChTay5yZXRhaW5HbG9iYWxzKSB7ICAgIGlmIChTay5nbG9iYWxzKSB7ICRnYmwgPSBTay5nbG9iYWxzOyBTay5nbG9iYWxzID0gJGdibDsgJGxvYyA9ICRnYmw7IH0gICAgaWYgKFNrLmdsb2JhbHMpIHsgJGdibCA9IFNrLmdsb2JhbHM7IFNrLmdsb2JhbHMgPSAkZ2JsOyAkbG9jID0gJGdibDsgJGxvYy5fX2ZpbGVfXz1uZXcgU2suYnVpbHRpbnMuc3RyKCdcIit0aGlzLmZpbGVuYW1lK1wiJyk7fSAgICBlbHNlIHsgU2suZ2xvYmFscyA9ICRnYmw7IH19IGVsc2UgeyBTay5nbG9iYWxzID0gJGdibDsgfVwiO3RoaXMudS5zd2l0Y2hDb2RlPVwid2hpbGUodHJ1ZSl7dHJ5e1wiO1xudGhpcy51LnN3aXRjaENvZGUrPXRoaXMub3V0cHV0SW50ZXJydXB0VGVzdCgpO3RoaXMudS5zd2l0Y2hDb2RlKz1cInN3aXRjaCgkYmxrKXtcIjt0aGlzLnUuc3VmZml4Q29kZT1cIn1cIjt0aGlzLnUuc3VmZml4Q29kZSs9XCJ9Y2F0Y2goZXJyKXsgaWYgKCEoZXJyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uKSkgeyBlcnIgPSBuZXcgU2suYnVpbHRpbi5FeHRlcm5hbEVycm9yKGVycik7IH0gZXJyLnRyYWNlYmFjay5wdXNoKHtsaW5lbm86ICRjdXJyTGluZU5vLCBjb2xubzogJGN1cnJDb2xObywgZmlsZW5hbWU6ICdcIit0aGlzLmZpbGVuYW1lK1wiJ30pOyBpZiAoJGV4Yy5sZW5ndGg+MCkgeyAkZXJyID0gZXJyOyAkYmxrPSRleGMucG9wKCk7IGNvbnRpbnVlOyB9IGVsc2UgeyB0aHJvdyBlcnI7IH19IH0gfSk7XCI7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuTW9kdWxlOnRoaXMuY2JvZHkoYS5ib2R5KTtsKFwicmV0dXJuICRsb2M7XCIpO2JyZWFrO1xuZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvOyB1bmhhbmRsZWQgY2FzZSBpbiBjb21waWxlck1vZFwiKX10aGlzLmV4aXRTY29wZSgpO3RoaXMucmVzdWx0LnB1c2godGhpcy5vdXRwdXRBbGxVbml0cygpKTtyZXR1cm4gYn07U2suY29tcGlsZT1mdW5jdGlvbihiLGMsZSxmKXtlPVNrLl9fZnV0dXJlX187U2suX19mdXR1cmVfXz1PYmplY3QuY3JlYXRlKFNrLl9fZnV0dXJlX18pO3ZhciBkPVNrLnBhcnNlKGMsYiksZz1Tay5hc3RGcm9tUGFyc2UoZC5jc3QsYyxkLmZsYWdzKTtkPWQuZmxhZ3M7dmFyIGg9U2suc3ltYm9sdGFibGUoZyxjKTtiPW5ldyBhKGMsaCxkLGYsYik7Yz1iLmNtb2QoZyk7U2suX19mdXR1cmVfXz1lO3JldHVybntmdW5jbmFtZTpcIiRjb21waWxlZG1vZFwiLGNvZGU6XCIkY29tcGlsZWRtb2QgPSBmdW5jdGlvbigpIHtcIitiLnJlc3VsdC5qb2luKFwiXCIpK1wiXFxucmV0dXJuIFwiK2MrXCI7fSgpO1wifX07U2suZXhwb3J0U3ltYm9sKFwiU2suY29tcGlsZVwiLFNrLmNvbXBpbGUpO1xuU2sucmVzZXRDb21waWxlcj1mdW5jdGlvbigpe1NrLmdlbnN5bWNvdW50PTB9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnJlc2V0Q29tcGlsZXJcIixTay5yZXNldENvbXBpbGVyKTtTay5maXhSZXNlcnZlZD1iO1NrLmV4cG9ydFN5bWJvbChcIlNrLmZpeFJlc2VydmVkXCIsU2suZml4UmVzZXJ2ZWQpO1NrLnVuZml4UmVzZXJ2ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvX1xcJHJ3XFwkJC8sXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnVuZml4UmVzZXJ2ZWRcIixTay51bmZpeFJlc2VydmVkKTtTay5tYW5nbGVOYW1lPWU7U2suZXhwb3J0U3ltYm9sKFwiU2subWFuZ2xlTmFtZVwiLFNrLm1hbmdsZU5hbWUpO1NrLnJlc2VydmVkV29yZHNfPWg7U2suZXhwb3J0U3ltYm9sKFwiU2sucmVzZXJ2ZWRXb3Jkc19cIixTay5yZXNlcnZlZFdvcmRzXyl9LGZ1bmN0aW9uKG0scSl7U2suc3lzbW9kdWxlcz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTtTay5yZWFsc3lzcGF0aD12b2lkIDA7U2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWU9XG5mdW5jdGlvbihhLGMsYil7dmFyIGU9YS5yZXBsYWNlKC9cXC4vZyxcIi9cIiksZj1mdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC50cnlDYXRjaChmdW5jdGlvbigpe3JldHVybiBTay5yZWFkKGEpfSxmdW5jdGlvbihhKXt9KSxmdW5jdGlvbihjKXtpZih2b2lkIDAhPT1jKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoe2ZpbGVuYW1lOmEsY29kZTpjLHBhY2thZ2VQYXRoOmJ9KX0pfTt2b2lkIDA9PT1iJiYoYj1Tay5yZWFsc3lzcGF0aCk7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoYi50cCRpdGVyKCksZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGYoYS52K1wiL1wiK2UrYywhMSksZnVuY3Rpb24oYil7cmV0dXJuIGI/YjpmKGEuditcIi9cIitlK1wiL19faW5pdF9fXCIrYyxhLnYrXCIvXCIrZSl9KX0pfTtTay5pbXBvcnRTZXRVcFBhdGg9ZnVuY3Rpb24oYSl7aWYoIVNrLnJlYWxzeXNwYXRoKXt2YXIgYz1bbmV3IFNrLmJ1aWx0aW4uc3RyKFwic3JjL2J1aWx0aW5cIiksXG5uZXcgU2suYnVpbHRpbi5zdHIoXCJzcmMvbGliXCIpLG5ldyBTay5idWlsdGluLnN0cihcIi5cIildO2ZvcihhPTA7YTxTay5zeXNwYXRoLmxlbmd0aDsrK2EpYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihTay5zeXNwYXRoW2FdKSk7U2sucmVhbHN5c3BhdGg9bmV3IFNrLmJ1aWx0aW4ubGlzdChjKX19O1NrLmltcG9ydE1vZHVsZUludGVybmFsXz1mdW5jdGlvbihhLGMsYixlLGYsbCxoKXt2YXIgZCxnLG0sayxwPW51bGwscT12b2lkIDAhPT1mP2YudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbmFtZSk6dm9pZCAwLEE9dm9pZCAwIT09cT9xLnYrXCIuXCI6XCJcIix0PXZvaWQgMCE9PWY/Zi50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRwYXRoKTp2b2lkIDA7U2suaW1wb3J0U2V0VXBQYXRoKGgpO2lmKGYmJiFxKXtpZihsKXJldHVybjt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHRvIGltcG9ydCByZWxhdGl2ZSB0byBpbnZhbGlkIHBhY2thZ2UgKG5vIG5hbWUpXCIpO1xufXZvaWQgMD09PWImJihiPUErYSk7dmFyIHY9YS5zcGxpdChcIi5cIik7aWYoMTx2Lmxlbmd0aCl7dmFyIEI9di5zbGljZSgwLHYubGVuZ3RoLTEpLmpvaW4oXCIuXCIpO3A9U2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKEIsYyx2b2lkIDAsdm9pZCAwLGYsbCxoKX12YXIgRD1Tay5taXNjZXZhbC5jaGFpbihwLGZ1bmN0aW9uKG4pe3A9bjtnPVNrLnN5c21vZHVsZXMucXVpY2skbG9va3VwKG5ldyBTay5idWlsdGluLnN0cihiKSk7cmV0dXJuIHZvaWQgMCE9PWc/cHx8ZzpTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXt2YXIgYj1hO2lmKDE8di5sZW5ndGgpe2lmKCFwKXJldHVybjttPVNrLnN5c21vZHVsZXMubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihBK0IpKTtiPXZbdi5sZW5ndGgtMV07dD1tLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJHBhdGgpfWs9bmV3IFNrLmJ1aWx0aW4ubW9kdWxlO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgZSl7ZD1hK1wiLnB5XCI7dmFyIGM9XG5Tay5jb21waWxlKGUsZCxcImV4ZWNcIixoKX1lbHNlIGM9U2subWlzY2V2YWwuY2hhaW4odm9pZCAwLGZ1bmN0aW9uKCl7aWYoU2sub25CZWZvcmVJbXBvcnQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5vbkJlZm9yZUltcG9ydClyZXR1cm4gU2sub25CZWZvcmVJbXBvcnQoYSl9LGZ1bmN0aW9uKGMpe2lmKCExPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihcIkltcG9ydGluZyBcIithK1wiIGlzIG5vdCBhbGxvd2VkXCIpO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihjKTtyZXR1cm4gU2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWUoYixcIi5qc1wiLHQpfSxmdW5jdGlvbihhKXtyZXR1cm4gYT97ZnVuY25hbWU6XCIkYnVpbHRpbm1vZHVsZVwiLGNvZGU6YS5jb2RlLGZpbGVuYW1lOmEuZmlsZW5hbWUscGFja2FnZVBhdGg6YS5wYWNrYWdlUGF0aH06U2subWlzY2V2YWwuY2hhaW4oU2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWUoYixcblwiLnB5XCIsdCksZnVuY3Rpb24oYil7aWYoYT1iKXJldHVybiBTay5jb21waWxlKGEuY29kZSxhLmZpbGVuYW1lLFwiZXhlY1wiLGgpfSxmdW5jdGlvbihiKXtpZihiKXJldHVybiBiLnBhY2thZ2VQYXRoPWEucGFja2FnZVBhdGgsYn0pfSk7cmV0dXJuIGN9LGZ1bmN0aW9uKGEpe2lmKGEpe1NrLnN5c21vZHVsZXMubXAkYXNzX3N1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5zdHIoYiksayk7dmFyIGU9ay4kanM9YS5jb2RlO251bGw9PWQmJihkPWEuZmlsZW5hbWUpO251bGwhPVNrLmRhdGVTZXQmJlNrLmRhdGVTZXR8fChlPVwiU2suZXhlY1N0YXJ0ID0gU2subGFzdFlpZWxkID0gbmV3IERhdGUoKTtcXG5cIithLmNvZGUsU2suZGF0ZVNldD0hMCk7aWYoYyl7dmFyIGY9ZnVuY3Rpb24oYSl7dmFyIGIsYz1Tay5qc19iZWF1dGlmeShhKS5zcGxpdChcIlxcblwiKTtmb3IoYj0xO2I8PWMubGVuZ3RoOysrYil7dmFyIGQ9KFwiXCIrYikubGVuZ3RoO2ZvcihhPVwiXCI7NT5kOysrZClhKz1cIiBcIjtjW2ItMV09XCIvKiBcIitcbmErYitcIiAqLyBcIitjW2ItMV19cmV0dXJuIGMuam9pbihcIlxcblwiKX07ZT1mKGUpO1NrLmRlYnVnb3V0KGUpfWUrPVwiXFxuXCIrYS5mdW5jbmFtZStcIjtcIjtlPVNrLmdsb2JhbC5ldmFsKGUpO2suJGQ9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihiKSxfX2RvY19fOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCxfX3BhY2thZ2VfXzphLnBhY2thZ2VQYXRoP25ldyBTay5idWlsdGluLnN0cihiKTpCP25ldyBTay5idWlsdGluLnN0cihBK0IpOnE/cTpTay5idWlsdGluLm5vbmUubm9uZSR9O2EucGFja2FnZVBhdGgmJihrLiRkLl9fcGF0aF9fPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoYS5wYWNrYWdlUGF0aCldKSk7cmV0dXJuIGUoay4kZCl9fSxmdW5jdGlvbihiKXt2YXIgYztpZih2b2lkIDA9PT1iKXtpZihsJiYhcClyZXR1cm47dGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW1wb3J0RXJyb3IoXCJObyBtb2R1bGUgbmFtZWQgXCIrYSk7fWlmKGIhPT1rLiRkKXtmb3IoYyBpbiBrLiRkKWJbY118fFxuKGJbY109ay4kZFtjXSk7ay4kZD1ifWlmKFNrLm9uQWZ0ZXJJbXBvcnQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5vbkFmdGVySW1wb3J0KXRyeXtTay5vbkFmdGVySW1wb3J0KGEpfWNhdGNoKFYpe31pZihwKXJldHVybiBtLnRwJHNldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKHZbdi5sZW5ndGgtMV0pLGspLHA7ZiYmZi50cCRzZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihhKSxrKTtyZXR1cm4ga30pfSk7cmV0dXJuIGg/RDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coRCl9O1NrLmltcG9ydE1vZHVsZT1mdW5jdGlvbihhLGMsYil7cmV0dXJuIFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLGMsdm9pZCAwLHZvaWQgMCx2b2lkIDAsITEsYil9O1NrLmltcG9ydE1haW49ZnVuY3Rpb24oYSxjLGIpe1NrLmRhdGVTZXQ9ITE7U2suZmlsZXNMb2FkZWQ9ITE7U2suc3lzbW9kdWxlcz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTtTay5yZWFsc3lzcGF0aD1cbnZvaWQgMDtTay5yZXNldENvbXBpbGVyKCk7cmV0dXJuIFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLGMsXCJfX21haW5fX1wiLHZvaWQgMCx2b2lkIDAsITEsYil9O1NrLmltcG9ydE1haW5XaXRoQm9keT1mdW5jdGlvbihhLGMsYixlKXtTay5kYXRlU2V0PSExO1NrLmZpbGVzTG9hZGVkPSExO1NrLnN5c21vZHVsZXM9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7U2sucmVhbHN5c3BhdGg9dm9pZCAwO1NrLnJlc2V0Q29tcGlsZXIoKTtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fbWFpbl9fXCIsYix2b2lkIDAsITEsZSl9O1NrLmltcG9ydEJ1aWx0aW5XaXRoQm9keT1mdW5jdGlvbihhLGMsYixlKXtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fYnVpbHRpbl9fLlwiK2EsYix2b2lkIDAsITEsZSl9O1NrLmJ1aWx0aW4uX19pbXBvcnRfXz1mdW5jdGlvbihhLGMsYixlLGYpe3ZhciBsPVNrLmdsb2JhbHMsaDt2b2lkIDA9PT1mJiYoZj1Tay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydD9cbjA6LTEpO2lmKDAhPT1mJiZjLl9fcGFja2FnZV9fJiZjLl9fcGFja2FnZV9fIT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXtpZigoaD1jLl9fcGFja2FnZV9fLnYpJiYwPGYpe2M9aC5zcGxpdChcIi5cIik7aWYoZi0xPj1jLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBiZXlvbmQgdG9wbGV2ZWwgcGFja2FnZVwiKTtjLmxlbmd0aC09Zi0xO2g9Yy5qb2luKFwiLlwiKX12YXIgZD1Tay5zeXNtb2R1bGVzLnF1aWNrJGxvb2t1cChuZXcgU2suYnVpbHRpbi5zdHIoaCkpfWlmKDA8ZiYmdm9pZCAwPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBpbiBub24tcGFja2FnZVwiKTthLnNwbGl0KFwiLlwiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odm9pZCAwLGZ1bmN0aW9uKCl7aWYoMCE9PWYmJnZvaWQgMCE9PWQpcmV0dXJuXCJcIj09PWE/ZDpTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSxcbnZvaWQgMCxoK1wiLlwiK2Esdm9pZCAwLGQsLTE9PWYsITApfSxmdW5jdGlvbihiKXtyZXR1cm4gdm9pZCAwPT09Yj8oaD1kPXZvaWQgMCxTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsITEsITApKTpifSxmdW5jdGlvbihiKXtpZihlJiYwIT09ZS5sZW5ndGgpe3ZhciBjO3ZhciBkPVNrLnN5c21vZHVsZXMubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cigoaHx8XCJcIikrKGgmJmE/XCIuXCI6XCJcIikrYSkpO2ZvcihiPTA7YjxlLmxlbmd0aDtiKyspe3ZhciBmPWVbYl07XCIqXCIhPWYmJnZvaWQgMD09PWQudHAkZ2V0YXR0cihuZXcgU2suYnVpbHRpbi5zdHIoZikpJiYoYz1Tay5taXNjZXZhbC5jaGFpbihjLFNrLmltcG9ydE1vZHVsZUludGVybmFsXy5iaW5kKG51bGwsZix2b2lkIDAsdm9pZCAwLHZvaWQgMCxkLCEwLCEwKSkpfXJldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoZCk7cmV0dXJuIGR9KX1yZXR1cm4gYn0sXG5mdW5jdGlvbihhKXtsIT09U2suZ2xvYmFscyYmKFNrLmdsb2JhbHM9bCk7cmV0dXJuIGF9KX07U2suaW1wb3J0U3Rhcj1mdW5jdGlvbihhLGMsYil7aWYoYj1hLnRwJGdldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19hbGxfX1wiKSkpZm9yKGxldCBlPVNrLmFic3RyLml0ZXIoYiksZj1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWUudHAkaXRlcm5leHQoKSljW2Yudl09U2suYWJzdHIuZ2F0dHIoYSxmKTtlbHNle2I9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYS4kZCk7Zm9yKGxldCBlIGluIGIpXCJfXCIhPWJbZV0uY2hhckF0KDApJiYoY1tiW2VdXT1hLiRkW2JbZV1dKX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydE1haW5cIixTay5pbXBvcnRNYWluKTtTay5leHBvcnRTeW1ib2woXCJTay5pbXBvcnRNYWluV2l0aEJvZHlcIixTay5pbXBvcnRNYWluV2l0aEJvZHkpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydEJ1aWx0aW5XaXRoQm9keVwiLFNrLmltcG9ydEJ1aWx0aW5XaXRoQm9keSk7XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLl9faW1wb3J0X19cIixTay5idWlsdGluLl9faW1wb3J0X18pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydFN0YXJcIixTay5pbXBvcnRTdGFyKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnRpbVNvcnQ9ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3Q9bmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYpO3RoaXMuTUlOX0dBTExPUD03O3RoaXMubGlzdGxlbmd0aD1jP2M6YS5zcSRsZW5ndGgoKX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5sdD1mdW5jdGlvbihhLGMpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjLFwiTHRcIil9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubGU9ZnVuY3Rpb24oYSxjKXtyZXR1cm4hdGhpcy5sdChjLGEpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLnNldGl0ZW09ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3QudlthXT1jfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLmJpbmFyeV9zb3J0PVxuZnVuY3Rpb24oYSxjKXt2YXIgYjtmb3IoYj1hLmJhc2UrYztiPGEuYmFzZSthLmxlbjtiKyspe3ZhciBlPWEuYmFzZTt2YXIgZj1iO2ZvcihjPWEuZ2V0aXRlbShmKTtlPGY7KXt2YXIgbD1lKyhmLWU+PjEpO3RoaXMubHQoYyxhLmdldGl0ZW0obCkpP2Y9bDplPWwrMX1Tay5hc3NlcnRzLmFzc2VydChlPT09Zik7Zm9yKGw9YjtsPmU7bC0tKWEuc2V0aXRlbShsLGEuZ2V0aXRlbShsLTEpKTthLnNldGl0ZW0oZSxjKX19O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUuY291bnRfcnVuPWZ1bmN0aW9uKGEpe3ZhciBjO2lmKDE+PWEubGVuKXt2YXIgYj1hLmxlbjt2YXIgZT0hMX1lbHNlIGlmKGI9Mix0aGlzLmx0KGEuZ2V0aXRlbShhLmJhc2UrMSksYS5nZXRpdGVtKGEuYmFzZSkpKWZvcihlPSEwLGM9YS5iYXNlKzI7YzxhLmJhc2UrYS5sZW47YysrKWlmKHRoaXMubHQoYS5nZXRpdGVtKGMpLGEuZ2V0aXRlbShjLTEpKSliKys7ZWxzZSBicmVhaztlbHNlIGZvcihlPSExLGM9YS5iYXNlK1xuMjtjPGEuYmFzZSthLmxlbiYmIXRoaXMubHQoYS5nZXRpdGVtKGMpLGEuZ2V0aXRlbShjLTEpKTtjKyspYisrO3JldHVybntydW46bmV3IFNrLmJ1aWx0aW4ubGlzdFNsaWNlKGEubGlzdCxhLmJhc2UsYiksZGVzY2VuZGluZzplfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKCl7dmFyIGEsYz1uZXcgU2suYnVpbHRpbi5saXN0U2xpY2UodGhpcy5saXN0LDAsdGhpcy5saXN0bGVuZ3RoKTtpZighKDI+Yy5sZW4pKXt0aGlzLm1lcmdlX2luaXQoKTtmb3IoYT10aGlzLm1lcmdlX2NvbXB1dGVfbWlucnVuKGMubGVuKTswPGMubGVuOyl7dmFyIGI9dGhpcy5jb3VudF9ydW4oYyk7Yi5kZXNjZW5kaW5nJiZiLnJ1bi5yZXZlcnNlKCk7aWYoYi5ydW4ubGVuPGEpe3ZhciBlPWIucnVuLmxlbjtiLnJ1bi5sZW49YTxjLmxlbj9hOmMubGVuO3RoaXMuYmluYXJ5X3NvcnQoYi5ydW4sZSl9Yy5hZHZhbmNlKGIucnVuLmxlbik7dGhpcy5wZW5kaW5nLnB1c2goYi5ydW4pO1xudGhpcy5tZXJnZV9jb2xsYXBzZSgpfVNrLmFzc2VydHMuYXNzZXJ0KGMuYmFzZT09dGhpcy5saXN0bGVuZ3RoKTt0aGlzLm1lcmdlX2ZvcmNlX2NvbGxhcHNlKCk7U2suYXNzZXJ0cy5hc3NlcnQoMT09dGhpcy5wZW5kaW5nLmxlbmd0aCk7U2suYXNzZXJ0cy5hc3NlcnQoMD09PXRoaXMucGVuZGluZ1swXS5iYXNlKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnBlbmRpbmdbMF0ubGVuPT10aGlzLmxpc3RsZW5ndGgpfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5nYWxsb3A9ZnVuY3Rpb24oYSxjLGIsZSl7dmFyIGY7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YiYmYjxjLmxlbik7dmFyIGw9dGhpcztlPWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbC5sZShhLGIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBsLmx0KGEsYil9O3ZhciBoPWMuYmFzZStiO3ZhciBkPTA7dmFyIGc9MTtpZihlKGMuZ2V0aXRlbShoKSxhKSl7Zm9yKGY9Yy5sZW4tYjtnPGY7KWlmKGUoYy5nZXRpdGVtKGgrZyksXG5hKSl7ZD1nO3RyeXtnPShnPDwxKSsxfWNhdGNoKG4pe2c9Zn19ZWxzZSBicmVhaztnPmYmJihnPWYpO2QrPWI7Zys9Yn1lbHNle2ZvcihmPWIrMTtnPGYmJiFlKGMuZ2V0aXRlbShoLWcpLGEpOyl7ZD1nO3RyeXtnPShnPDwxKSsxfWNhdGNoKG4pe2c9Zn19Zz5mJiYoZz1mKTtoPWItZDtkPWItZztnPWh9U2suYXNzZXJ0cy5hc3NlcnQoLTE8PWQ8Zzw9Yy5sZW4pO2ZvcihkKz0xO2Q8ZzspYj1kKyhnLWQ+PjEpLGUoYy5nZXRpdGVtKGMuYmFzZStiKSxhKT9kPWIrMTpnPWI7U2suYXNzZXJ0cy5hc3NlcnQoZD09Zyk7cmV0dXJuIGd9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfaW5pdD1mdW5jdGlvbigpe3RoaXMubWluX2dhbGxvcD10aGlzLk1JTl9HQUxMT1A7dGhpcy5wZW5kaW5nPVtdfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2xvPWZ1bmN0aW9uKGEsYyl7dmFyIGIsZSxmO1NrLmFzc2VydHMuYXNzZXJ0KDA8YS5sZW4mJjA8Yy5sZW4mJmEuYmFzZStcbmEubGVuPT1jLmJhc2UpO3ZhciBsPXRoaXMubWluX2dhbGxvcDt2YXIgaD1hLmJhc2U7YT1hLmNvcHlpdGVtcygpO3RyeXtpZih0aGlzLnNldGl0ZW0oaCxjLnBvcGxlZnQoKSksaCsrLDEhPWEubGVuJiYwIT09Yy5sZW4pZm9yKDs7KXtmb3IoZT1iPTA7OylpZih0aGlzLmx0KGMuZ2V0aXRlbShjLmJhc2UpLGEuZ2V0aXRlbShhLmJhc2UpKSl7dGhpcy5zZXRpdGVtKGgsYy5wb3BsZWZ0KCkpO2grKztpZigwPT09Yy5sZW4pcmV0dXJuO2UrKztiPTA7aWYoZT49bClicmVha31lbHNle3RoaXMuc2V0aXRlbShoLGEucG9wbGVmdCgpKTtoKys7aWYoMT09YS5sZW4pcmV0dXJuO2IrKztlPTA7aWYoYj49bClicmVha31mb3IobCs9MTs7KXt0aGlzLm1pbl9nYWxsb3A9bC09MTxsO2I9dGhpcy5nYWxsb3AoYy5nZXRpdGVtKGMuYmFzZSksYSwwLCEwKTtmb3IoZj1hLmJhc2U7ZjxhLmJhc2UrYjtmKyspdGhpcy5zZXRpdGVtKGgsYS5nZXRpdGVtKGYpKSxoKys7YS5hZHZhbmNlKGIpO2lmKDE+PVxuYS5sZW4pcmV0dXJuO3RoaXMuc2V0aXRlbShoLGMucG9wbGVmdCgpKTtoKys7aWYoMD09PWMubGVuKXJldHVybjtlPXRoaXMuZ2FsbG9wKGEuZ2V0aXRlbShhLmJhc2UpLGMsMCwhMSk7Zm9yKGY9Yy5iYXNlO2Y8Yy5iYXNlK2U7ZisrKXRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSksaCsrO2MuYWR2YW5jZShlKTtpZigwPT09Yy5sZW4pcmV0dXJuO3RoaXMuc2V0aXRlbShoLGEucG9wbGVmdCgpKTtoKys7aWYoMT09YS5sZW4pcmV0dXJuO2lmKGI8dGhpcy5NSU5fR0FMTE9QJiZlPHRoaXMuTUlOX0dBTExPUClicmVhaztsKys7dGhpcy5taW5fZ2FsbG9wPWx9fX1maW5hbGx5e1NrLmFzc2VydHMuYXNzZXJ0KDA8PWEubGVuJiYwPD1jLmxlbik7Zm9yKGY9Yy5iYXNlO2Y8Yy5iYXNlK2MubGVuO2YrKyl0aGlzLnNldGl0ZW0oaCxjLmdldGl0ZW0oZikpLGgrKztmb3IoZj1hLmJhc2U7ZjxhLmJhc2UrYS5sZW47ZisrKXRoaXMuc2V0aXRlbShoLGEuZ2V0aXRlbShmKSksaCsrfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5tZXJnZV9oaT1cbmZ1bmN0aW9uKGEsYyl7dmFyIGIsZSxmO1NrLmFzc2VydHMuYXNzZXJ0KDA8YS5sZW4mJjA8Yy5sZW4mJmEuYmFzZSthLmxlbj09Yy5iYXNlKTt2YXIgbD10aGlzLm1pbl9nYWxsb3A7dmFyIGg9Yy5iYXNlK2MubGVuO2M9Yy5jb3B5aXRlbXMoKTt0cnl7aWYoaC0tLHRoaXMuc2V0aXRlbShoLGEucG9wcmlnaHQoKSksMCE9PWEubGVuJiYxIT1jLmxlbilmb3IoOzspe2ZvcihlPWI9MDs7KXt2YXIgZD1hLmdldGl0ZW0oYS5iYXNlK2EubGVuLTEpO3ZhciBnPWMuZ2V0aXRlbShjLmJhc2UrYy5sZW4tMSk7aWYodGhpcy5sdChnLGQpKXtoLS07dGhpcy5zZXRpdGVtKGgsZCk7YS5sZW4tLTtpZigwPT09YS5sZW4pcmV0dXJuO2IrKztlPTA7aWYoYj49bClicmVha31lbHNle2gtLTt0aGlzLnNldGl0ZW0oaCxnKTtjLmxlbi0tO2lmKDE9PWMubGVuKXJldHVybjtlKys7Yj0wO2lmKGU+PWwpYnJlYWt9fWZvcihsKz0xOzspe3RoaXMubWluX2dhbGxvcD1sLT0xPGw7Zz1jLmdldGl0ZW0oYy5iYXNlK1xuYy5sZW4tMSk7dmFyIG09dGhpcy5nYWxsb3AoZyxhLGEubGVuLTEsITApO2I9YS5sZW4tbTtmb3IoZj1hLmJhc2UrYS5sZW4tMTtmPmEuYmFzZSttLTE7Zi0tKWgtLSx0aGlzLnNldGl0ZW0oaCxhLmdldGl0ZW0oZikpO2EubGVuLT1iO2lmKDA9PT1hLmxlbilyZXR1cm47aC0tO3RoaXMuc2V0aXRlbShoLGMucG9wcmlnaHQoKSk7aWYoMT09Yy5sZW4pcmV0dXJuO2Q9YS5nZXRpdGVtKGEuYmFzZSthLmxlbi0xKTttPXRoaXMuZ2FsbG9wKGQsYyxjLmxlbi0xLCExKTtlPWMubGVuLW07Zm9yKGY9Yy5iYXNlK2MubGVuLTE7Zj5jLmJhc2UrbS0xO2YtLSloLS0sdGhpcy5zZXRpdGVtKGgsYy5nZXRpdGVtKGYpKTtjLmxlbi09ZTtpZigxPj1jLmxlbilyZXR1cm47aC0tO3RoaXMuc2V0aXRlbShoLGEucG9wcmlnaHQoKSk7aWYoMD09PWEubGVuKXJldHVybjtpZihiPHRoaXMuTUlOX0dBTExPUCYmZTx0aGlzLk1JTl9HQUxMT1ApYnJlYWs7bCsrO3RoaXMubWluX2dhbGxvcD1sfX19ZmluYWxseXtTay5hc3NlcnRzLmFzc2VydCgwPD1cbmEubGVuJiYwPD1jLmxlbik7Zm9yKGY9YS5iYXNlK2EubGVuLTE7Zj5hLmJhc2UtMTtmLS0paC0tLHRoaXMuc2V0aXRlbShoLGEuZ2V0aXRlbShmKSk7Zm9yKGY9Yy5iYXNlK2MubGVuLTE7Zj5jLmJhc2UtMTtmLS0paC0tLHRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSl9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2F0PWZ1bmN0aW9uKGEpezA+YSYmKGE9dGhpcy5wZW5kaW5nLmxlbmd0aCthKTt2YXIgYz10aGlzLnBlbmRpbmdbYV07dmFyIGI9dGhpcy5wZW5kaW5nW2ErMV07U2suYXNzZXJ0cy5hc3NlcnQoMDxjLmxlbiYmMDxiLmxlbik7U2suYXNzZXJ0cy5hc3NlcnQoYy5iYXNlK2MubGVuPT1iLmJhc2UpO3RoaXMucGVuZGluZ1thXT1uZXcgU2suYnVpbHRpbi5saXN0U2xpY2UodGhpcy5saXN0LGMuYmFzZSxjLmxlbitiLmxlbik7dGhpcy5wZW5kaW5nLnNwbGljZShhKzEsMSk7YT10aGlzLmdhbGxvcChiLmdldGl0ZW0oYi5iYXNlKSxjLDAsITApO2MuYWR2YW5jZShhKTtcbjAhPT1jLmxlbiYmKGIubGVuPXRoaXMuZ2FsbG9wKGMuZ2V0aXRlbShjLmJhc2UrYy5sZW4tMSksYixiLmxlbi0xLCExKSwwIT09Yi5sZW4mJihjLmxlbjw9Yi5sZW4/dGhpcy5tZXJnZV9sbyhjLGIpOnRoaXMubWVyZ2VfaGkoYyxiKSkpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2NvbGxhcHNlPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucGVuZGluZzsxPGEubGVuZ3RoOylpZigzPD1hLmxlbmd0aCYmYVthLmxlbmd0aC0zXS5sZW48PWFbYS5sZW5ndGgtMl0ubGVuK2FbYS5sZW5ndGgtMV0ubGVuKWFbYS5sZW5ndGgtM10ubGVuPGFbYS5sZW5ndGgtMV0ubGVuP3RoaXMubWVyZ2VfYXQoLTMpOnRoaXMubWVyZ2VfYXQoLTIpO2Vsc2UgaWYoYVthLmxlbmd0aC0yXS5sZW48PWFbYS5sZW5ndGgtMV0ubGVuKXRoaXMubWVyZ2VfYXQoLTIpO2Vsc2UgYnJlYWt9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfZm9yY2VfY29sbGFwc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGE9XG50aGlzLnBlbmRpbmc7MTxhLmxlbmd0aDspMzw9YS5sZW5ndGgmJmFbYS5sZW5ndGgtM10ubGVuPGFbYS5sZW5ndGgtMV0ubGVuP3RoaXMubWVyZ2VfYXQoLTMpOnRoaXMubWVyZ2VfYXQoLTIpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2NvbXB1dGVfbWlucnVuPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzY0PD1hOyljfD1hJjEsYT4+PTE7cmV0dXJuIGErY307U2suYnVpbHRpbi5saXN0U2xpY2U9ZnVuY3Rpb24oYSxjLGIpe3RoaXMubGlzdD1hO3RoaXMuYmFzZT1jO3RoaXMubGVuPWJ9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5jb3B5aXRlbXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJhc2UsYz10aGlzLmJhc2UrdGhpcy5sZW47U2suYXNzZXJ0cy5hc3NlcnQoMDw9YTw9Yyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3RTbGljZShuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMubGlzdC52LnNsaWNlKGEsYykpLDAsdGhpcy5sZW4pfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUuYWR2YW5jZT1cbmZ1bmN0aW9uKGEpe3RoaXMuYmFzZSs9YTt0aGlzLmxlbi09YTtTay5hc3NlcnRzLmFzc2VydCh0aGlzLmJhc2U8PXRoaXMubGlzdC5zcSRsZW5ndGgoKSl9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5nZXRpdGVtPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxpc3QudlthXX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnNldGl0ZW09ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3QudlthXT1jfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUucG9wbGVmdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMubGlzdC52W3RoaXMuYmFzZV07dGhpcy5iYXNlKys7dGhpcy5sZW4tLTtyZXR1cm4gYX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnBvcHJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5sZW4tLTtyZXR1cm4gdGhpcy5saXN0LnZbdGhpcy5iYXNlK3RoaXMubGVuXX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGEsXG5jLGI9dGhpcy5saXN0LGU9dGhpcy5iYXNlLGY9ZSt0aGlzLmxlbi0xO2U8ZjspYT1iLnZbZl0sYz1iLnZbZV0sYi52W2VdPWEsYi52W2ZdPWMsZSsrLGYtLX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5saXN0U2xpY2VcIixTay5idWlsdGluLmxpc3RTbGljZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi50aW1Tb3J0XCIsU2suYnVpbHRpbi50aW1Tb3J0KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN1cGVyXz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3VwZXJcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdXBlcl8sXCJiYWQgY2FsbCB0byBzdXBlciwgdXNlICduZXcnXCIpO3RoaXMudHlwZT1hO3RoaXMub2JqPWM7aWYodm9pZCAwIT09YSYmIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtdXN0IGJlIHR5cGUsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpKTt0aGlzLm9ial90eXBlPXZvaWQgMCE9PXRoaXMub2JqP3RoaXMuJHN1cGVyY2hlY2soYSx0aGlzLm9iaik6bnVsbH0sc2xvdHM6e3RwJGRvYzpcInN1cGVyKCkgLT4gc2FtZSBhcyBzdXBlcihfX2NsYXNzX18sIDxmaXJzdCBhcmd1bWVudD4pXFxuc3VwZXIodHlwZSkgLT4gdW5ib3VuZCBzdXBlciBvYmplY3RcXG5zdXBlcih0eXBlLCBvYmopIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNpbnN0YW5jZShvYmosIHR5cGUpXFxuc3VwZXIodHlwZSwgdHlwZTIpIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNzdWJjbGFzcyh0eXBlMiwgdHlwZSlcXG5UeXBpY2FsIHVzZSB0byBjYWxsIGEgY29vcGVyYXRpdmUgc3VwZXJjbGFzcyBtZXRob2Q6XFxuY2xhc3MgQyhCKTpcXG4gICAgZGVmIG1ldGgoc2VsZiwgYXJnKTpcXG4gICAgICAgIHN1cGVyKCkubWV0aChhcmcpXFxuVGhpcyB3b3JrcyBmb3IgY2xhc3MgbWV0aG9kcyB0b286XFxuY2xhc3MgQyhCKTpcXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBjbWV0aChjbHMsIGFyZyk6XFxuICAgICAgICBzdXBlcigpLmNtZXRoKGFyZylcXG5cIixcbnRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInN1cGVyXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic3VwZXJcIixhLDEsMik7Yz1hWzBdO2E9YVsxXTtpZighU2suYnVpbHRpbi5jaGVja0NsYXNzKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm11c3QgYmUgdHlwZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTt0aGlzLm9iaj1hO3RoaXMudHlwZT1jO251bGwhPXRoaXMub2JqJiYodGhpcy5vYmpfdHlwZT10aGlzLiRzdXBlcmNoZWNrKGMsdGhpcy5vYmopKX0sJHIoKXtyZXR1cm4gdGhpcy5vYmo/bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPHN1cGVyOiA8Y2xhc3MgJ1wiK3RoaXMudHlwZS5wcm90b3R5cGUudHAkbmFtZStcIic+LCA8XCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy5vYmopK1wiIG9iamVjdD4+XCIpOm5ldyBTay5idWlsdGluLnN0cihcIjxzdXBlcjogPGNsYXNzICdcIit0aGlzLnR5cGUucHJvdG90eXBlLnRwJG5hbWUrXG5cIic+LCBOVUxMPlwiKX0sdHAkZ2V0YXR0cihhLGMpe2xldCBiPXRoaXMub2JqX3R5cGU7aWYobnVsbD09YilyZXR1cm4gU2suZ2VuZXJpYy5nZXRBdHRyLmNhbGwodGhpcyxhLGMpO3ZhciBlPWIucHJvdG90eXBlLnRwJG1ybztjb25zdCBmPWUubGVuZ3RoO2lmKGE9PT1Tay5idWlsdGluLnN0ci4kY2xhc3MpcmV0dXJuIFNrLmdlbmVyaWMuZ2V0QXR0ci5jYWxsKHRoaXMsYSxjKTtsZXQgbDtmb3IobD0wO2wrMTxmJiZ0aGlzLnR5cGUhPT1lW2xdO2wrKyk7bCsrO2lmKGw+PWYpcmV0dXJuIFNrLmdlbmVyaWMuZ2V0QXR0ci5jYWxsKHRoaXMsYSxjKTthPWEuJG1hbmdsZWQ7bGV0IGg7Zm9yKDtsPGY7KXtjPWVbbF0ucHJvdG90eXBlO2MuaGFzT3duUHJvcGVydHkoYSkmJihoPWNbYV0pO2lmKHZvaWQgMCE9PWgpcmV0dXJuIGU9aC50cCRkZXNjcl9nZXQsdm9pZCAwIT09ZSYmKGg9ZS5jYWxsKGgsdGhpcy5vYmo9PT1iP251bGw6dGhpcy5vYmosYikpLGg7bCsrfX0sdHAkZGVzY3JfZ2V0KGEsXG5jKXtpZihudWxsPT09YXx8bnVsbCE9dGhpcy5vYmopcmV0dXJuIHRoaXM7aWYodGhpcy5vYiR0eXBlIT09U2suYnVpbHRpbi5zdXBlcl8pcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLm9iJHR5cGUsW3RoaXMudHlwZSxhXSk7e2M9dGhpcy4kc3VwZXJjaGVjayh0aGlzLnR5cGUsYSk7Y29uc3QgYj1uZXcgU2suYnVpbHRpbi5zdXBlcl87Yi50eXBlPXRoaXMudHlwZTtiLm9iaj1hO2Iub2JqX3R5cGU9YztyZXR1cm4gYn19fSxnZXRzZXRzOntfX3RoaXNjbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMudHlwZX0sJGRvYzpcInRoZSBjbGFzcyBpbnZva2luZyBzdXBlcigpXCJ9LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMub2JqfHxTay5idWlsdGluLm5vbmUubm9uZSR9LCRkb2M6XCJ0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmVcIn0sX19zZWxmX2NsYXNzX186eyRnZXQoKXtyZXR1cm4gdGhpcy5vYmpfdHlwZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbiRkb2M6XCJ0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmVcIn19LHByb3RvOnskc3VwZXJjaGVjayhhLGMpe2lmKFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhjKSYmYy4kaXNTdWJUeXBlKGEpKXJldHVybiBjO2lmKGMub2IkdHlwZS4kaXNTdWJUeXBlKGEpKXJldHVybiBjLm9iJHR5cGU7e2NvbnN0IGI9Yy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRjbGFzcyk7aWYodm9pZCAwIT09YiYmYiE9PWMub2IkdHlwZSYmU2suYnVpbHRpbi5jaGVja0NsYXNzKGIpJiZiLiRpc1N1YlR5cGUoYSkpcmV0dXJuIGJ9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3VwZXIodHlwZSwgb2JqKTogb2JqIG11c3QgYmUgYW4gaW5zdGFuY2Ugb3Igc3VidHlwZSBvZiB0eXBlXCIpO319fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbnM9e3JvdW5kOm51bGwsbGVuOm51bGwsbWluOm51bGwsbWF4Om51bGwsc3VtOm51bGwsYWJzOm51bGwsZmFiczpudWxsLFxub3JkOm51bGwsY2hyOm51bGwsaGV4Om51bGwsb2N0Om51bGwsYmluOm51bGwsZGlyOm51bGwscmVwcjpudWxsLG9wZW46bnVsbCxpc2luc3RhbmNlOm51bGwsaGFzaDpudWxsLGdldGF0dHI6bnVsbCxoYXNhdHRyOm51bGwsaWQ6bnVsbCxyZWR1Y2U6bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLnJlZHVjZSksc29ydGVkOm51bGwsYW55Om51bGwsYWxsOm51bGwsZW51bWVyYXRlOlNrLmJ1aWx0aW4uZW51bWVyYXRlLGZpbHRlcjpTay5idWlsdGluLmZpbHRlcl8sbWFwOlNrLmJ1aWx0aW4ubWFwXyxyYW5nZTpTay5idWlsdGluLnJhbmdlXyxyZXZlcnNlZDpTay5idWlsdGluLnJldmVyc2VkLHppcDpTay5idWlsdGluLnppcF8sQmFzZUV4Y2VwdGlvbjpTay5idWlsdGluLkJhc2VFeGNlcHRpb24sQXR0cmlidXRlRXJyb3I6U2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcixWYWx1ZUVycm9yOlNrLmJ1aWx0aW4uVmFsdWVFcnJvcixFeGNlcHRpb246U2suYnVpbHRpbi5FeGNlcHRpb24sXG5aZXJvRGl2aXNpb25FcnJvcjpTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yLEFzc2VydGlvbkVycm9yOlNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3IsSW1wb3J0RXJyb3I6U2suYnVpbHRpbi5JbXBvcnRFcnJvcixJbmRlbnRhdGlvbkVycm9yOlNrLmJ1aWx0aW4uSW5kZW50YXRpb25FcnJvcixJbmRleEVycm9yOlNrLmJ1aWx0aW4uSW5kZXhFcnJvcixMb29rdXBFcnJvcjpTay5idWlsdGluLkxvb2t1cEVycm9yLEtleUVycm9yOlNrLmJ1aWx0aW4uS2V5RXJyb3IsVHlwZUVycm9yOlNrLmJ1aWx0aW4uVHlwZUVycm9yLFVuaWNvZGVEZWNvZGVFcnJvcjpTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcixVbmljb2RlRW5jb2RlRXJyb3I6U2suYnVpbHRpbi5Vbmljb2RlRW5jb2RlRXJyb3IsTmFtZUVycm9yOlNrLmJ1aWx0aW4uTmFtZUVycm9yLElPRXJyb3I6U2suYnVpbHRpbi5JT0Vycm9yLE5vdEltcGxlbWVudGVkRXJyb3I6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yLFxuU3lzdGVtRXhpdDpTay5idWlsdGluLlN5c3RlbUV4aXQsT3ZlcmZsb3dFcnJvcjpTay5idWlsdGluLk92ZXJmbG93RXJyb3IsT3BlcmF0aW9uRXJyb3I6U2suYnVpbHRpbi5PcGVyYXRpb25FcnJvcixOZWdhdGl2ZVBvd2VyRXJyb3I6U2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3IsUnVudGltZUVycm9yOlNrLmJ1aWx0aW4uUnVudGltZUVycm9yLFJlY3Vyc2lvbkVycm9yOlNrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3IsU3RvcEl0ZXJhdGlvbjpTay5idWlsdGluLlN0b3BJdGVyYXRpb24sU3ludGF4RXJyb3I6U2suYnVpbHRpbi5TeW50YXhFcnJvcixTeXN0ZW1FcnJvcjpTay5idWlsdGluLlN5c3RlbUVycm9yLGZsb2F0XyRydyQ6U2suYnVpbHRpbi5mbG9hdF8saW50XyRydyQ6U2suYnVpbHRpbi5pbnRfLGJvb2w6U2suYnVpbHRpbi5ib29sLGNvbXBsZXg6U2suYnVpbHRpbi5jb21wbGV4LGRpY3Q6U2suYnVpbHRpbi5kaWN0LGZpbGU6U2suYnVpbHRpbi5maWxlLGZyb3plbnNldDpTay5idWlsdGluLmZyb3plbnNldCxcblwiZnVuY3Rpb25cIjpTay5idWlsdGluLmZ1bmMsZ2VuZXJhdG9yOlNrLmJ1aWx0aW4uZ2VuZXJhdG9yLGxpc3Q6U2suYnVpbHRpbi5saXN0LGxvbmdfJHJ3JDpTay5idWlsdGluLmxuZyxtZXRob2Q6U2suYnVpbHRpbi5tZXRob2Qsb2JqZWN0OlNrLmJ1aWx0aW4ub2JqZWN0LHNsaWNlOlNrLmJ1aWx0aW4uc2xpY2Usc3RyOlNrLmJ1aWx0aW4uc3RyLHNldDpTay5idWlsdGluLnNldCx0dXBsZTpTay5idWlsdGluLnR1cGxlLHR5cGU6U2suYnVpbHRpbi50eXBlLGlucHV0Om51bGwscmF3X2lucHV0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5yYXdfaW5wdXQpLHNldGF0dHI6bnVsbCxqc2V2YWw6U2suYnVpbHRpbi5qc2V2YWwsanNtaWxsaXM6U2suYnVpbHRpbi5qc21pbGxpcyxxdWl0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5xdWl0KSxleGl0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5xdWl0KSxwcmludDpudWxsLGRpdm1vZDpudWxsLGZvcm1hdDpudWxsLFxuZ2xvYmFsczpudWxsLGlzc3ViY2xhc3M6bnVsbCxpdGVyOm51bGwsZXhlY2ZpbGU6U2suYnVpbHRpbi5leGVjZmlsZSxoZWxwOlNrLmJ1aWx0aW4uaGVscCxtZW1vcnl2aWV3OlNrLmJ1aWx0aW4ubWVtb3J5dmlldyxyZWxvYWQ6U2suYnVpbHRpbi5yZWxvYWQsc3VwZXJfJHJ3JDpTay5idWlsdGluLnN1cGVyXyx1bmljaHI6U2suYnVpbHRpbi51bmljaHIsdmFyczpTay5idWlsdGluLnZhcnMsYXBwbHlfJHJ3JDpTay5idWlsdGluLmFwcGx5XyxidWZmZXI6U2suYnVpbHRpbi5idWZmZXIsY29lcmNlOlNrLmJ1aWx0aW4uY29lcmNlLGludGVybjpTay5idWlsdGluLmludGVybixwcm9wZXJ0eTpTay5idWlsdGluLnByb3BlcnR5LGNsYXNzbWV0aG9kOlNrLmJ1aWx0aW4uY2xhc3NtZXRob2Qsc3RhdGljbWV0aG9kOlNrLmJ1aWx0aW4uc3RhdGljbWV0aG9kfTtTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXCJidWlsdGluc1wiLFNrLmJ1aWx0aW5zLHtfX2ltcG9ydF9fOnskbWV0aDpTay5idWlsdGluLl9faW1wb3J0X18sXG4kZmxhZ3M6e05hbWVkQXJnczpbXCJuYW1lXCIsXCJnbG9iYWxzXCIsXCJsb2NhbHNcIixcImZyb21saXN0XCIsXCJsZXZlbFwiXX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiX19pbXBvcnRfXyhuYW1lLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lLCBmcm9tbGlzdD0oKSwgbGV2ZWw9MCkgLT4gbW9kdWxlXFxuXFxuSW1wb3J0IGEgbW9kdWxlLiBCZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgZm9yIHVzZSBieSB0aGUgUHl0aG9uXFxuaW50ZXJwcmV0ZXIgYW5kIG5vdCBmb3IgZ2VuZXJhbCB1c2UsIGl0IGlzIGJldHRlciB0byB1c2VcXG5pbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIHRvIHByb2dyYW1tYXRpY2FsbHkgaW1wb3J0IGEgbW9kdWxlLlxcblxcblRoZSBnbG9iYWxzIGFyZ3VtZW50IGlzIG9ubHkgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQ7XFxudGhleSBhcmUgbm90IG1vZGlmaWVkLiAgVGhlIGxvY2FscyBhcmd1bWVudCBpcyB1bnVzZWQuICBUaGUgZnJvbWxpc3RcXG5zaG91bGQgYmUgYSBsaXN0IG9mIG5hbWVzIHRvIGVtdWxhdGUgYGBmcm9tIG5hbWUgaW1wb3J0IC4uLicnLCBvciBhblxcbmVtcHR5IGxpc3QgdG8gZW11bGF0ZSBgYGltcG9ydCBuYW1lJycuXFxuV2hlbiBpbXBvcnRpbmcgYSBtb2R1bGUgZnJvbSBhIHBhY2thZ2UsIG5vdGUgdGhhdCBfX2ltcG9ydF9fKCdBLkInLCAuLi4pXFxucmV0dXJucyBwYWNrYWdlIEEgd2hlbiBmcm9tbGlzdCBpcyBlbXB0eSwgYnV0IGl0cyBzdWJtb2R1bGUgQiB3aGVuXFxuZnJvbWxpc3QgaXMgbm90IGVtcHR5LiAgVGhlIGxldmVsIGFyZ3VtZW50IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG9cXG5wZXJmb3JtIGFic29sdXRlIG9yIHJlbGF0aXZlIGltcG9ydHM6IDAgaXMgYWJzb2x1dGUsIHdoaWxlIGEgcG9zaXRpdmUgbnVtYmVyXFxuaXMgdGhlIG51bWJlciBvZiBwYXJlbnQgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IG1vZHVsZS5cIn0sXG5hYnM6eyRtZXRoOlNrLmJ1aWx0aW4uYWJzLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCB4LCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC5cIn0sYWxsOnskbWV0aDpTay5idWlsdGluLmFsbCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIGJvb2woeCkgaXMgVHJ1ZSBmb3IgYWxsIHZhbHVlcyB4IGluIHRoZSBpdGVyYWJsZS5cXG5cXG5JZiB0aGUgaXRlcmFibGUgaXMgZW1wdHksIHJldHVybiBUcnVlLlwifSxhbnk6eyRtZXRoOlNrLmJ1aWx0aW4uYW55LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgYm9vbCh4KSBpcyBUcnVlIGZvciBhbnkgeCBpbiB0aGUgaXRlcmFibGUuXFxuXFxuSWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LCByZXR1cm4gRmFsc2UuXCJ9LFxuYXNjaWk6eyRtZXRoOlNrLmJ1aWx0aW4uYXNjaWksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIGFuIEFTQ0lJLW9ubHkgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LlxcblxcbkFzIHJlcHIoKSwgcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgYW5cXG5vYmplY3QsIGJ1dCBlc2NhcGUgdGhlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnlcXG5yZXByKCkgdXNpbmcgXFxcXFxcXFx4LCBcXFxcXFxcXHUgb3IgXFxcXFxcXFxVIGVzY2FwZXMuIFRoaXMgZ2VuZXJhdGVzIGEgc3RyaW5nIHNpbWlsYXJcXG50byB0aGF0IHJldHVybmVkIGJ5IHJlcHIoKSBpbiBQeXRob24gMi5cIn0sYmluOnskbWV0aDpTay5idWlsdGluLmJpbiwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyLlxcblxcbiAgID4+PiBiaW4oMjc5NjIwMilcXG4gICAnMGIxMDEwMTAxMDEwMTAxMDEwMTAxMDEwJ1wifSxcbmNhbGxhYmxlOnskbWV0aDpTay5idWlsdGluLmNhbGxhYmxlLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgaXMgY2FsbGFibGUgKGkuZS4sIHNvbWUga2luZCBvZiBmdW5jdGlvbikuXFxuXFxuTm90ZSB0aGF0IGNsYXNzZXMgYXJlIGNhbGxhYmxlLCBhcyBhcmUgaW5zdGFuY2VzIG9mIGNsYXNzZXMgd2l0aCBhXFxuX19jYWxsX18oKSBtZXRob2QuXCJ9LGNocjp7JG1ldGg6U2suYnVpbHRpbi5jaHIsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGksIC8pXCIsJGRvYzpcIlJldHVybiBhIFVuaWNvZGUgc3RyaW5nIG9mIG9uZSBjaGFyYWN0ZXIgd2l0aCBvcmRpbmFsIGk7IDAgPD0gaSA8PSAweDEwZmZmZi5cIn0sZGVsYXR0cjp7JG1ldGg6U2suYnVpbHRpbi5kZWxhdHRyLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCBuYW1lLCAvKVwiLFxuJGRvYzpcIkRlbGV0ZXMgdGhlIG5hbWVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBnaXZlbiBvYmplY3QuXFxuXFxuZGVsYXR0cih4LCAneScpIGlzIGVxdWl2YWxlbnQgdG8gYGBkZWwgeC55JydcIn0sZGlyOnskbWV0aDpTay5idWlsdGluLmRpciwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOm51bGwsJGRvYzpcImRpcihbb2JqZWN0XSkgLT4gbGlzdCBvZiBzdHJpbmdzXFxuXFxuSWYgY2FsbGVkIHdpdGhvdXQgYW4gYXJndW1lbnQsIHJldHVybiB0aGUgbmFtZXMgaW4gdGhlIGN1cnJlbnQgc2NvcGUuXFxuRWxzZSwgcmV0dXJuIGFuIGFscGhhYmV0aXplZCBsaXN0IG9mIG5hbWVzIGNvbXByaXNpbmcgKHNvbWUgb2YpIHRoZSBhdHRyaWJ1dGVzXFxub2YgdGhlIGdpdmVuIG9iamVjdCwgYW5kIG9mIGF0dHJpYnV0ZXMgcmVhY2hhYmxlIGZyb20gaXQuXFxuSWYgdGhlIG9iamVjdCBzdXBwbGllcyBhIG1ldGhvZCBuYW1lZCBfX2Rpcl9fLCBpdCB3aWxsIGJlIHVzZWQ7IG90aGVyd2lzZVxcbnRoZSBkZWZhdWx0IGRpcigpIGxvZ2ljIGlzIHVzZWQgYW5kIHJldHVybnM6XFxuICBmb3IgYSBtb2R1bGUgb2JqZWN0OiB0aGUgbW9kdWxlJ3MgYXR0cmlidXRlcy5cXG4gIGZvciBhIGNsYXNzIG9iamVjdDogIGl0cyBhdHRyaWJ1dGVzLCBhbmQgcmVjdXJzaXZlbHkgdGhlIGF0dHJpYnV0ZXNcXG4gICAgb2YgaXRzIGJhc2VzLlxcbiAgZm9yIGFueSBvdGhlciBvYmplY3Q6IGl0cyBhdHRyaWJ1dGVzLCBpdHMgY2xhc3MncyBhdHRyaWJ1dGVzLCBhbmRcXG4gICAgcmVjdXJzaXZlbHkgdGhlIGF0dHJpYnV0ZXMgb2YgaXRzIGNsYXNzJ3MgYmFzZSBjbGFzc2VzLlwifSxcbmRpdm1vZDp7JG1ldGg6U2suYnVpbHRpbi5kaXZtb2QsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCB4LCB5LCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIHR1cGxlICh4Ly95LCB4JXkpLiAgSW52YXJpYW50OiBkaXYqeSArIG1vZCA9PSB4LlwifSxldmFsXyRydyQ6eyRuYW1lOlwiZXZhbFwiLCRtZXRoOlNrLmJ1aWx0aW4uZXZhbF8sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBzb3VyY2UsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUsIC8pXCIsJGRvYzpcIkV2YWx1YXRlIHRoZSBnaXZlbiBzb3VyY2UgaW4gdGhlIGNvbnRleHQgb2YgZ2xvYmFscyBhbmQgbG9jYWxzLlxcblxcblRoZSBzb3VyY2UgbWF5IGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIFB5dGhvbiBleHByZXNzaW9uXFxub3IgYSBjb2RlIG9iamVjdCBhcyByZXR1cm5lZCBieSBjb21waWxlKCkuXFxuVGhlIGdsb2JhbHMgbXVzdCBiZSBhIGRpY3Rpb25hcnkgYW5kIGxvY2FscyBjYW4gYmUgYW55IG1hcHBpbmcsXFxuZGVmYXVsdGluZyB0byB0aGUgY3VycmVudCBnbG9iYWxzIGFuZCBsb2NhbHMuXFxuSWYgb25seSBnbG9iYWxzIGlzIGdpdmVuLCBsb2NhbHMgZGVmYXVsdHMgdG8gaXQuXCJ9LFxuZm9ybWF0OnskbWV0aDpTay5idWlsdGluLmZvcm1hdCwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHZhbHVlLCBmb3JtYXRfc3BlYz0nJywgLylcIiwkZG9jOlwiUmV0dXJuIHZhbHVlLl9fZm9ybWF0X18oZm9ybWF0X3NwZWMpXFxuXFxuZm9ybWF0X3NwZWMgZGVmYXVsdHMgdG8gdGhlIGVtcHR5IHN0cmluZy5cXG5TZWUgdGhlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2Ugc2VjdGlvbiBvZiBoZWxwKCdGT1JNQVRUSU5HJykgZm9yXFxuZGV0YWlscy5cIn0sZ2V0YXR0cjp7JG1ldGg6U2suYnVpbHRpbi5nZXRhdHRyLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiZ2V0YXR0cihvYmplY3QsIG5hbWVbLCBkZWZhdWx0XSkgLT4gdmFsdWVcXG5cXG5HZXQgYSBuYW1lZCBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3Q7IGdldGF0dHIoeCwgJ3knKSBpcyBlcXVpdmFsZW50IHRvIHgueS5cXG5XaGVuIGEgZGVmYXVsdCBhcmd1bWVudCBpcyBnaXZlbiwgaXQgaXMgcmV0dXJuZWQgd2hlbiB0aGUgYXR0cmlidXRlIGRvZXNuJ3RcXG5leGlzdDsgd2l0aG91dCBpdCwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbiB0aGF0IGNhc2UuXCJ9LFxuZ2xvYmFsczp7JG1ldGg6U2suYnVpbHRpbi5nbG9iYWxzLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgY3VycmVudCBzY29wZSdzIGdsb2JhbCB2YXJpYWJsZXMuXFxuXFxuTk9URTogVXBkYXRlcyB0byB0aGlzIGRpY3Rpb25hcnkgKndpbGwqIGFmZmVjdCBuYW1lIGxvb2t1cHMgaW4gdGhlIGN1cnJlbnRcXG5nbG9iYWwgc2NvcGUgYW5kIHZpY2UtdmVyc2EuXCJ9LGhhc2F0dHI6eyRtZXRoOlNrLmJ1aWx0aW4uaGFzYXR0ciwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgbmFtZSwgLylcIiwkZG9jOlwiUmV0dXJuIHdoZXRoZXIgdGhlIG9iamVjdCBoYXMgYW4gYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuXFxuXFxuVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcgZ2V0YXR0cihvYmosIG5hbWUpIGFuZCBjYXRjaGluZyBBdHRyaWJ1dGVFcnJvci5cIn0sXG5oYXNoOnskbWV0aDpTay5idWlsdGluLmhhc2gsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LlxcblxcblR3byBvYmplY3RzIHRoYXQgY29tcGFyZSBlcXVhbCBtdXN0IGFsc28gaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlLCBidXQgdGhlXFxucmV2ZXJzZSBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZS5cIn0saGV4OnskbWV0aDpTay5idWlsdGluLmhleCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IGhleCgxMjY0ODQzMClcXG4gICAnMHhjMGZmZWUnXCJ9LGlkOnskbWV0aDpTay5idWlsdGluLmlkLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgaWRlbnRpdHkgb2YgYW4gb2JqZWN0LlxcblxcblRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYW1vbmcgc2ltdWx0YW5lb3VzbHkgZXhpc3Rpbmcgb2JqZWN0cy5cXG4oQ1B5dGhvbiB1c2VzIHRoZSBvYmplY3QncyBtZW1vcnkgYWRkcmVzcy4pXCJ9LFxuaW5wdXQ6eyRtZXRoOlNrLmJ1aWx0aW4uaW5wdXQsJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBwcm9tcHQ9Tm9uZSwgLylcIiwkZG9jOlwiUmVhZCBhIHN0cmluZyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgVGhlIHRyYWlsaW5nIG5ld2xpbmUgaXMgc3RyaXBwZWQuXFxuXFxuVGhlIHByb21wdCBzdHJpbmcsIGlmIGdpdmVuLCBpcyBwcmludGVkIHRvIHN0YW5kYXJkIG91dHB1dCB3aXRob3V0IGFcXG50cmFpbGluZyBuZXdsaW5lIGJlZm9yZSByZWFkaW5nIGlucHV0LlxcblxcbklmIHRoZSB1c2VyIGhpdHMgRU9GICgqbml4OiBDdHJsLUQsIFdpbmRvd3M6IEN0cmwtWitSZXR1cm4pLCByYWlzZSBFT0ZFcnJvci5cXG5PbiAqbml4IHN5c3RlbXMsIHJlYWRsaW5lIGlzIHVzZWQgaWYgYXZhaWxhYmxlLlwifSxpc2luc3RhbmNlOnskbWV0aDpTay5idWlsdGluLmlzaW5zdGFuY2UsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIGNsYXNzX29yX3R1cGxlLCAvKVwiLFxuJGRvYzpcIlJldHVybiB3aGV0aGVyIGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIG9yIG9mIGEgc3ViY2xhc3MgdGhlcmVvZi5cXG5cXG5BIHR1cGxlLCBhcyBpbiBgYGlzaW5zdGFuY2UoeCwgKEEsIEIsIC4uLikpYGAsIG1heSBiZSBnaXZlbiBhcyB0aGUgdGFyZ2V0IHRvXFxuY2hlY2sgYWdhaW5zdC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgaXNpbnN0YW5jZSh4LCBBKSBvciBpc2luc3RhbmNlKHgsIEIpXFxub3IgLi4uYGAgZXRjLlwifSxpc3N1YmNsYXNzOnskbWV0aDpTay5idWlsdGluLmlzc3ViY2xhc3MsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBjbHMsIGNsYXNzX29yX3R1cGxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gd2hldGhlciAnY2xzJyBpcyBhIGRlcml2ZWQgZnJvbSBhbm90aGVyIGNsYXNzIG9yIGlzIHRoZSBzYW1lIGNsYXNzLlxcblxcbkEgdHVwbGUsIGFzIGluIGBgaXNzdWJjbGFzcyh4LCAoQSwgQiwgLi4uKSlgYCwgbWF5IGJlIGdpdmVuIGFzIHRoZSB0YXJnZXQgdG9cXG5jaGVjayBhZ2FpbnN0LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYGBpc3N1YmNsYXNzKHgsIEEpIG9yIGlzc3ViY2xhc3MoeCwgQilcXG5vciAuLi5gYCBldGMuXCJ9LFxuaXRlcjp7JG1ldGg6U2suYnVpbHRpbi5pdGVyLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUgLylcIiwkZG9jOlwiaXRlcihpdGVyYWJsZSkgLT4gaXRlcmF0b3JcXG5pdGVyKGNhbGxhYmxlLCBzZW50aW5lbCkgLT4gaXRlcmF0b3JcXG5cXG5HZXQgYW4gaXRlcmF0b3IgZnJvbSBhbiBvYmplY3QuICBJbiB0aGUgZmlyc3QgZm9ybSwgdGhlIGFyZ3VtZW50IG11c3RcXG5zdXBwbHkgaXRzIG93biBpdGVyYXRvciwgb3IgYmUgYSBzZXF1ZW5jZS5cXG5JbiB0aGUgc2Vjb25kIGZvcm0sIHRoZSBjYWxsYWJsZSBpcyBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyB0aGUgc2VudGluZWwuXCJ9LGxlbjp7JG1ldGg6U2suYnVpbHRpbi5sZW4sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBjb250YWluZXIuXCJ9LGxvY2Fsczp7JG1ldGg6U2suYnVpbHRpbi5sb2NhbHMsXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjdXJyZW50IHNjb3BlJ3MgbG9jYWwgdmFyaWFibGVzLlxcblxcbk5PVEU6IFdoZXRoZXIgb3Igbm90IHVwZGF0ZXMgdG8gdGhpcyBkaWN0aW9uYXJ5IHdpbGwgYWZmZWN0IG5hbWUgbG9va3VwcyBpblxcbnRoZSBsb2NhbCBzY29wZSBhbmQgdmljZS12ZXJzYSBpcyAqaW1wbGVtZW50YXRpb24gZGVwZW5kZW50KiBhbmQgbm90XFxuY292ZXJlZCBieSBhbnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZ3VhcmFudGVlcy5cIn0sbWF4OnskbWV0aDpTay5idWlsdGluLm1heCwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJtYXgoaXRlcmFibGUsICpbLCBkZWZhdWx0PW9iaiwga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcbm1heChhcmcxLCBhcmcyLCAqYXJncywgKlssIGtleT1mdW5jXSkgLT4gdmFsdWVcXG5cXG5XaXRoIGEgc2luZ2xlIGl0ZXJhYmxlIGFyZ3VtZW50LCByZXR1cm4gaXRzIGJpZ2dlc3QgaXRlbS4gVGhlXFxuZGVmYXVsdCBrZXl3b3JkLW9ubHkgYXJndW1lbnQgc3BlY2lmaWVzIGFuIG9iamVjdCB0byByZXR1cm4gaWZcXG50aGUgcHJvdmlkZWQgaXRlcmFibGUgaXMgZW1wdHkuXFxuV2l0aCB0d28gb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybiB0aGUgbGFyZ2VzdCBhcmd1bWVudC5cIn0sXG5taW46eyRtZXRoOlNrLmJ1aWx0aW4ubWluLCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIm1pbihpdGVyYWJsZSwgKlssIGRlZmF1bHQ9b2JqLCBrZXk9ZnVuY10pIC0+IHZhbHVlXFxubWluKGFyZzEsIGFyZzIsICphcmdzLCAqWywga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcblxcbldpdGggYSBzaW5nbGUgaXRlcmFibGUgYXJndW1lbnQsIHJldHVybiBpdHMgc21hbGxlc3QgaXRlbS4gVGhlXFxuZGVmYXVsdCBrZXl3b3JkLW9ubHkgYXJndW1lbnQgc3BlY2lmaWVzIGFuIG9iamVjdCB0byByZXR1cm4gaWZcXG50aGUgcHJvdmlkZWQgaXRlcmFibGUgaXMgZW1wdHkuXFxuV2l0aCB0d28gb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybiB0aGUgc21hbGxlc3QgYXJndW1lbnQuXCJ9LG5leHQ6eyRuYW1lOlwibmV4dFwiLCRtZXRoOlNrLmJ1aWx0aW4ubmV4dF8sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJuZXh0KGl0ZXJhdG9yWywgZGVmYXVsdF0pXFxuXFxuUmV0dXJuIHRoZSBuZXh0IGl0ZW0gZnJvbSB0aGUgaXRlcmF0b3IuIElmIGRlZmF1bHQgaXMgZ2l2ZW4gYW5kIHRoZSBpdGVyYXRvclxcbmlzIGV4aGF1c3RlZCwgaXQgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiByYWlzaW5nIFN0b3BJdGVyYXRpb24uXCJ9LFxub2N0OnskbWV0aDpTay5idWlsdGluLm9jdCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIG9jdGFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IG9jdCgzNDIzOTEpXFxuICAgJzBvMTIzNDU2NydcIn0sb3Blbjp7JG1ldGg6U2suYnVpbHRpbi5vcGVuLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwib3BlbihuYW1lWywgbW9kZVssIGJ1ZmZlcmluZ11dKSAtPiBmaWxlIG9iamVjdFxcblxcbk9wZW4gYSBmaWxlIHVzaW5nIHRoZSBmaWxlKCkgdHlwZSwgcmV0dXJucyBhIGZpbGUgb2JqZWN0LiAgVGhpcyBpcyB0aGVcXG5wcmVmZXJyZWQgd2F5IHRvIG9wZW4gYSBmaWxlLiAgU2VlIGZpbGUuX19kb2NfXyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi5cIn0sb3JkOnskbWV0aDpTay5idWlsdGluLm9yZCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgYywgLylcIixcbiRkb2M6XCJSZXR1cm4gdGhlIFVuaWNvZGUgY29kZSBwb2ludCBmb3IgYSBvbmUtY2hhcmFjdGVyIHN0cmluZy5cIn0scG93OnskbWV0aDpTay5idWlsdGluLnBvdywkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHgsIHksIHo9Tm9uZSwgLylcIiwkZG9jOlwiRXF1aXZhbGVudCB0byB4Kip5ICh3aXRoIHR3byBhcmd1bWVudHMpIG9yIHgqKnkgJSB6ICh3aXRoIHRocmVlIGFyZ3VtZW50cylcXG5cXG5Tb21lIHR5cGVzLCBzdWNoIGFzIGludHMsIGFyZSBhYmxlIHRvIHVzZSBhIG1vcmUgZWZmaWNpZW50IGFsZ29yaXRobSB3aGVuXFxuaW52b2tlZCB1c2luZyB0aGUgdGhyZWUgYXJndW1lbnQgZm9ybS5cIn0scHJpbnQ6eyRtZXRoOlNrLmJ1aWx0aW4ucHJpbnQsJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwicHJpbnQodmFsdWUsIC4uLiwgc2VwPScgJywgZW5kPSdcXFxcbicsIGZpbGU9c3lzLnN0ZG91dCwgZmx1c2g9RmFsc2UpXFxuXFxuUHJpbnRzIHRoZSB2YWx1ZXMgdG8gYSBzdHJlYW0sIG9yIHRvIHN5cy5zdGRvdXQgYnkgZGVmYXVsdC5cXG5PcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czpcXG5maWxlOiAgYSBmaWxlLWxpa2Ugb2JqZWN0IChzdHJlYW0pOyBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBzeXMuc3Rkb3V0LlxcbnNlcDogICBzdHJpbmcgaW5zZXJ0ZWQgYmV0d2VlbiB2YWx1ZXMsIGRlZmF1bHQgYSBzcGFjZS5cXG5lbmQ6ICAgc3RyaW5nIGFwcGVuZGVkIGFmdGVyIHRoZSBsYXN0IHZhbHVlLCBkZWZhdWx0IGEgbmV3bGluZS5cXG5mbHVzaDogd2hldGhlciB0byBmb3JjaWJseSBmbHVzaCB0aGUgc3RyZWFtLlwifSxcbnJlcHI6eyRtZXRoOlNrLmJ1aWx0aW4ucmVwciwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC5cXG5cXG5Gb3IgbWFueSBvYmplY3QgdHlwZXMsIGluY2x1ZGluZyBtb3N0IGJ1aWx0aW5zLCBldmFsKHJlcHIob2JqKSkgPT0gb2JqLlwifSxyb3VuZDp7JG1ldGg6U2suYnVpbHRpbi5yb3VuZCwkZmxhZ3M6e05hbWVkQXJnczpbXCJudW1iZXJcIixcIm5kaWdpdHNcIl19LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIC8sIG51bWJlciwgbmRpZ2l0cz1Ob25lKVwiLCRkb2M6XCJSb3VuZCBhIG51bWJlciB0byBhIGdpdmVuIHByZWNpc2lvbiBpbiBkZWNpbWFsIGRpZ2l0cy5cXG5cXG5UaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGludGVnZXIgaWYgbmRpZ2l0cyBpcyBvbWl0dGVkIG9yIE5vbmUuICBPdGhlcndpc2VcXG50aGUgcmV0dXJuIHZhbHVlIGhhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBudW1iZXIuICBuZGlnaXRzIG1heSBiZSBuZWdhdGl2ZS5cIn0sXG5zZXRhdHRyOnskbWV0aDpTay5idWlsdGluLnNldGF0dHIsJGZsYWdzOntNaW5BcmdzOjMsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIG5hbWUsIHZhbHVlLCAvKVwiLCRkb2M6XCJTZXRzIHRoZSBuYW1lZCBhdHRyaWJ1dGUgb24gdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLlxcblxcbnNldGF0dHIoeCwgJ3knLCB2KSBpcyBlcXVpdmFsZW50IHRvIGBgeC55ID0gdicnXCJ9LHNvcnRlZDp7JG1ldGg6U2suYnVpbHRpbi5zb3J0ZWQsJGZsYWdzOntOYW1lZEFyZ3M6W251bGwsXCJjbXBcIixcImtleVwiLFwicmV2ZXJzZVwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLmJvb2wuZmFsc2UkXX0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUsIC8sICosIGtleT1Ob25lLCByZXZlcnNlPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYSBuZXcgbGlzdCBjb250YWluaW5nIGFsbCBpdGVtcyBmcm9tIHRoZSBpdGVyYWJsZSBpbiBhc2NlbmRpbmcgb3JkZXIuXFxuXFxuQSBjdXN0b20ga2V5IGZ1bmN0aW9uIGNhbiBiZSBzdXBwbGllZCB0byBjdXN0b21pemUgdGhlIHNvcnQgb3JkZXIsIGFuZCB0aGVcXG5yZXZlcnNlIGZsYWcgY2FuIGJlIHNldCB0byByZXF1ZXN0IHRoZSByZXN1bHQgaW4gZGVzY2VuZGluZyBvcmRlci5cIn0sXG5zdW06eyRtZXRoOlNrLmJ1aWx0aW4uc3VtLCRmbGFnczp7TmFtZWRBcmdzOltudWxsLFwic3RhcnRcIl0sRGVmYXVsdHM6W25ldyBTay5idWlsdGluLmludF8oMCldfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLywgc3RhcnQ9MClcIiwkZG9jOlwiUmV0dXJuIHRoZSBzdW0gb2YgYSAnc3RhcnQnIHZhbHVlIChkZWZhdWx0OiAwKSBwbHVzIGFuIGl0ZXJhYmxlIG9mIG51bWJlcnNcXG5cXG5XaGVuIHRoZSBpdGVyYWJsZSBpcyBlbXB0eSwgcmV0dXJuIHRoZSBzdGFydCB2YWx1ZS5cXG5UaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHNwZWNpZmljYWxseSBmb3IgdXNlIHdpdGggbnVtZXJpYyB2YWx1ZXMgYW5kIG1heVxcbnJlamVjdCBub24tbnVtZXJpYyB0eXBlcy5cIn0sdmFyczp7JG1ldGg6U2suYnVpbHRpbi52YXJzLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlwidmFycyhbb2JqZWN0XSkgLT4gZGljdGlvbmFyeVxcblxcbldpdGhvdXQgYXJndW1lbnRzLCBlcXVpdmFsZW50IHRvIGxvY2FscygpLlxcbldpdGggYW4gYXJndW1lbnQsIGVxdWl2YWxlbnQgdG8gb2JqZWN0Ll9fZGljdF9fLlwifX0pO1xuU2suc2V0dXBPYmplY3RzPWZ1bmN0aW9uKGEpe2E/KFNrLmJ1aWx0aW5zLmZpbHRlcj1Tay5idWlsdGluLmZpbHRlcl8sU2suYnVpbHRpbnMubWFwPVNrLmJ1aWx0aW4ubWFwXyxTay5idWlsdGlucy56aXA9U2suYnVpbHRpbi56aXBfLFNrLmJ1aWx0aW5zLnJhbmdlPVNrLmJ1aWx0aW4ucmFuZ2VfLGRlbGV0ZSBTay5idWlsdGlucy54cmFuZ2UsZGVsZXRlIFNrLmJ1aWx0aW5zLlN0YW5kYXJkRXJyb3IsZGVsZXRlIFNrLmJ1aWx0aW5zLnVuaWNvZGUsZGVsZXRlIFNrLmJ1aWx0aW5zLmJhc2VzdHJpbmcsZGVsZXRlIFNrLmJ1aWx0aW5zLmxvbmdfJHJ3JCxTay5idWlsdGluLmludF8ucHJvdG90eXBlLiRyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKSl9LGRlbGV0ZSBTay5idWlsdGluLmludF8ucHJvdG90eXBlLnRwJHN0cixkZWxldGUgU2suYnVpbHRpbi5ib29sLnByb3RvdHlwZS50cCRzdHIsZGVsZXRlIFNrLmJ1aWx0aW5zLnJhd19pbnB1dCxcbmRlbGV0ZSBTay5idWlsdGluLnN0ci5wcm90b3R5cGUuZGVjb2RlLFNrLmJ1aWx0aW5zLmJ5dGVzPVNrLmJ1aWx0aW4uYnl0ZXMsU2suYnVpbHRpbnMuYXNjaWk9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLmFzY2lpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiBhbiBBU0NJSS1vbmx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC5cXG5cXG5BcyByZXByKCksIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGFuXFxub2JqZWN0LCBidXQgZXNjYXBlIHRoZSBub24tQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIHJldHVybmVkIGJ5XFxucmVwcigpIHVzaW5nIFxcXFxcXFxceCwgXFxcXFxcXFx1IG9yIFxcXFxcXFxcVSBlc2NhcGVzLiBUaGlzIGdlbmVyYXRlcyBhIHN0cmluZyBzaW1pbGFyXFxudG8gdGhhdCByZXR1cm5lZCBieSByZXByKCkgaW4gUHl0aG9uIDIuXCJ9LFxubnVsbCxcImJ1aWx0aW5zXCIpKTooU2suYnVpbHRpbnMucmFuZ2U9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLnJhbmdlLCRuYW1lOlwicmFuZ2VcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9fSx2b2lkIDAsXCJidWlsdGluc1wiKSxTay5idWlsdGlucy54cmFuZ2U9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLnhyYW5nZSwkbmFtZTpcInhyYW5nZVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M319LG51bGwsXCJidWlsdGluc1wiKSxTay5idWlsdGlucy5maWx0ZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLmZpbHRlciksU2suYnVpbHRpbnMubWFwPW5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5tYXApLFNrLmJ1aWx0aW5zLnppcD1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4uemlwKSxTay5idWlsdGlucy5TdGFuZGFyZEVycm9yPVNrLmJ1aWx0aW4uRXhjZXB0aW9uLFNrLmJ1aWx0aW5zLnVuaWNvZGU9XG5Tay5idWlsdGluLnN0cixTay5idWlsdGlucy5iYXNlc3RyaW5nPVNrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW5zLmxvbmdfJHJ3JD1Tay5idWlsdGluLmxuZyxTay5idWlsdGluLmludF8ucHJvdG90eXBlLiRyPWZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLnY7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhP25ldyBTay5idWlsdGluLnN0cihhLnRvU3RyaW5nKCkpOm5ldyBTay5idWlsdGluLnN0cihhLnRvU3RyaW5nKCkrXCJMXCIpfSxTay5idWlsdGluLmludF8ucHJvdG90eXBlLnRwJHN0cj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvU3RyaW5nKCkpfSxTay5idWlsdGluLmJvb2wucHJvdG90eXBlLnRwJHN0cj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyKCl9LFNrLmJ1aWx0aW5zLnJhd19pbnB1dD1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4ucmF3X2lucHV0KSxTay5idWlsdGluLnN0ci5wcm90b3R5cGUuZGVjb2RlPVNrLmJ1aWx0aW4uc3RyLiRweTJkZWNvZGUsXG5kZWxldGUgU2suYnVpbHRpbnMuYnl0ZXMsZGVsZXRlIFNrLmJ1aWx0aW5zLmFzY2lpKX07U2suZXhwb3J0U3ltYm9sKFwiU2suc2V0dXBPYmplY3RzXCIsU2suc2V0dXBPYmplY3RzKTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluc1wiLFNrLmJ1aWx0aW5zKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN0ci4kZW1wdHk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpO1NrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0cj1Tay5idWlsdGluLnN0ci4kZW1wdHk7U2suYnVpbHRpbi5zdHIuJHV0Zjg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwidXRmLThcIik7U2suYnVpbHRpbi5zdHIuJGFzY2lpPW5ldyBTay5idWlsdGluLnN0cihcImFzY2lpXCIpO1NrLmJ1aWx0aW4uc3RyLiRkZWZhdWx0X2ZhY3Rvcnk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiZGVmYXVsdF9mYWN0b3J5XCIpO1NrLmJ1aWx0aW4uc3RyLiRpbWFnPW5ldyBTay5idWlsdGluLnN0cihcImltYWdcIik7U2suYnVpbHRpbi5zdHIuJHJlYWw9bmV3IFNrLmJ1aWx0aW4uc3RyKFwicmVhbFwiKTtcblNrLmJ1aWx0aW4uc3RyLiRhYnM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19hYnNfX1wiKTtTay5idWlsdGluLnN0ci4kYnl0ZXM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19ieXRlc19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjYWxsPW5ldyBTay5idWlsdGluLnN0cihcIl9fY2FsbF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjbGFzcz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NsYXNzX19cIik7U2suYnVpbHRpbi5zdHIuJGNtcD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NtcF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjb21wbGV4PW5ldyBTay5idWlsdGluLnN0cihcIl9fY29tcGxleF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjb250YWlucz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NvbnRhaW5zX19cIik7U2suYnVpbHRpbi5zdHIuJGNvcHk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19jb3B5X19cIik7U2suYnVpbHRpbi5zdHIuJGRpY3Q9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19kaWN0X19cIik7U2suYnVpbHRpbi5zdHIuJGRpcj1cbm5ldyBTay5idWlsdGluLnN0cihcIl9fZGlyX19cIik7U2suYnVpbHRpbi5zdHIuJGRvYz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2RvY19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRlbnRlcj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2VudGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGVxPW5ldyBTay5idWlsdGluLnN0cihcIl9fZXFfX1wiKTtTay5idWlsdGluLnN0ci4kZXhpdD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2V4aXRfX1wiKTtTay5idWlsdGluLnN0ci4kaW5kZXg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pbmRleF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpbml0PW5ldyBTay5idWlsdGluLnN0cihcIl9faW5pdF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpbnRfPW5ldyBTay5idWlsdGluLnN0cihcIl9faW50X19cIik7U2suYnVpbHRpbi5zdHIuJGl0ZXI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pdGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGZpbGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19maWxlX19cIik7U2suYnVpbHRpbi5zdHIuJGZsb2F0Xz1cbm5ldyBTay5idWlsdGluLnN0cihcIl9fZmxvYXRfX1wiKTtTay5idWlsdGluLnN0ci4kZm9ybWF0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZm9ybWF0X19cIik7U2suYnVpbHRpbi5zdHIuJGdlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2VfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0YXR0cj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2dldGF0dHJfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0YXR0cmlidXRlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2V0YXR0cmlidXRlX19cIik7U2suYnVpbHRpbi5zdHIuJGdldGl0ZW09bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19nZXRpdGVtX19cIik7U2suYnVpbHRpbi5zdHIuJGd0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZ3RfX1wiKTtTay5idWlsdGluLnN0ci4ka2V5cz1uZXcgU2suYnVpbHRpbi5zdHIoXCJrZXlzXCIpO1NrLmJ1aWx0aW4uc3RyLiRsZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2xlX19cIik7U2suYnVpbHRpbi5zdHIuJGxlbj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2xlbl9fXCIpO1xuU2suYnVpbHRpbi5zdHIuJGxlbmd0aF9oaW50PW5ldyBTay5idWlsdGluLnN0cihcIl9fbGVuZ3RoX2hpbnRfX1wiKTtTay5idWlsdGluLnN0ci4kbG9hZGVyPW5ldyBTay5idWlsdGluLnN0cihcIl9fbG9hZGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGx0PW5ldyBTay5idWlsdGluLnN0cihcIl9fbHRfX1wiKTtTay5idWlsdGluLnN0ci4kbW9kdWxlPW5ldyBTay5idWlsdGluLnN0cihcIl9fbW9kdWxlX19cIik7U2suYnVpbHRpbi5zdHIuJG1pc3Npbmc9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19taXNzaW5nX19cIik7U2suYnVpbHRpbi5zdHIuJG5hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uYW1lX19cIik7U2suYnVpbHRpbi5zdHIuJG5lPW5ldyBTay5idWlsdGluLnN0cihcIl9fbmVfX1wiKTtTay5idWlsdGluLnN0ci4kbmV3PW5ldyBTay5idWlsdGluLnN0cihcIl9fbmV3X19cIik7U2suYnVpbHRpbi5zdHIuJG5leHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZXh0X19cIik7U2suYnVpbHRpbi5zdHIuJHBhdGg9XG5uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3BhdGhfX1wiKTtTay5idWlsdGluLnN0ci4kcXVhbG5hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19xdWFsbmFtZV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRyZXByPW5ldyBTay5idWlsdGluLnN0cihcIl9fcmVwcl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRyZXZlcnNlZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3JldmVyc2VkX19cIik7U2suYnVpbHRpbi5zdHIuJHJvdW5kPW5ldyBTay5idWlsdGluLnN0cihcIl9fcm91bmRfX1wiKTtTay5idWlsdGluLnN0ci4kc2V0YXR0cj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3NldGF0dHJfX1wiKTtTay5idWlsdGluLnN0ci4kc2V0aXRlbT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3NldGl0ZW1fX1wiKTtTay5idWlsdGluLnN0ci4kc3RyPW5ldyBTay5idWlsdGluLnN0cihcIl9fc3RyX19cIik7U2suYnVpbHRpbi5zdHIuJHRydW5jPW5ldyBTay5idWlsdGluLnN0cihcIl9fdHJ1bmNfX1wiKTtTay5idWlsdGluLnN0ci4kd3JpdGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwid3JpdGVcIik7XG5Tay5taXNjZXZhbC5vcDJtZXRob2RfPXtFcTpTay5idWlsdGluLnN0ci4kZXEsTm90RXE6U2suYnVpbHRpbi5zdHIuJG5lLEd0OlNrLmJ1aWx0aW4uc3RyLiRndCxHdEU6U2suYnVpbHRpbi5zdHIuJGdlLEx0OlNrLmJ1aWx0aW4uc3RyLiRsdCxMdEU6U2suYnVpbHRpbi5zdHIuJGxlfX1dKTt9KS5jYWxsKHRoaXMgfHwgd2luZG93KVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1za3VscHQubWluLmpzLm1hcCIsIi8qXG5UaGUgVGltZWRBY3RpdmVjb2RlIGNsYXNzZXMgYXJlIGEgZ3JlYXQgZXhhbXBsZSBvZiB3aGVyZSBtdWx0aXBsZSBpbmhlcml0YW5jZSB3b3VsZCBiZSB1c2VmdWxcbkJ1dCBzaW5jZSBKYXZhc2NyaXB0IGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugd2UgdXNlIHRoZSBtaXhpbiBwYXR0ZXJuLlxuXG4qL1xuaW1wb3J0IExpdmVDb2RlIGZyb20gXCIuL2xpdmVjb2RlXCI7XG5pbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZVwiO1xuaW1wb3J0IEpTQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2pzXCI7XG5pbXBvcnQgSFRNTEFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9odG1sXCI7XG5pbXBvcnQgU1FMQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX3NxbFwiO1xuaW1wb3J0IEJyeXRob25BY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfYnJ5dGhvbi5qc1wiO1xuXG52YXIgVGltZWRBY3RpdmVDb2RlTWl4aW4gPSB7XG4gICAgdGltZWRJbml0OiBhc3luYyBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICB0aGlzLmlzVGltZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmhpZGVCdXR0b25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKHRydWUpOyAvLyBwb3NpdGlvbiBsYXN0XG4gICAgICAgIHRoaXMubmVlZHNSZWluaXRpYWxpemF0aW9uID0gdHJ1ZTsgLy8gdGhlIHJ1biBidXR0b24gY2xpY2sgbGlzdGVuZXIgbmVlZHMgdG8gYmUgcmVpbml0aWFsaXplZFxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKFwidGltZWRDb21wb25lbnRcIik7XG4gICAgICAgIHdpbmRvdy5lZExpc3RbdGhpcy5kaXZpZF0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgaGlkZUJ1dHRvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ1dHRvbkxpc3QgPSBbXG4gICAgICAgICAgICB0aGlzLnNhdmVCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmxvYWRCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmdyYWRlQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5zaG93SGlkZUJ1dHQsXG4gICAgICAgICAgICB0aGlzLmNvYWNoQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5hdEJ1dHRvbixcbiAgICAgICAgXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmIGJ1dHRvbkxpc3RbaV0gIT09IG51bGwpXG4gICAgICAgICAgICAgICAgJChidXR0b25MaXN0W2ldKS5oaWRlKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gYmplIC0gbm90IG5lZWRlZCBhbnltb3JlXG4gICAgcmVuZGVyVGltZWRJY29uOiBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIC8vIHJlbmRlcnMgdGhlIGNsb2NrIGljb24gb24gdGltZWQgY29tcG9uZW50cy4gICAgVGhlIGNvbXBvbmVudCBwYXJhbWV0ZXJcbiAgICAgICAgLy8gaXMgdGhlIGVsZW1lbnQgdGhhdCB0aGUgaWNvbiBzaG91bGQgYmUgYXBwZW5kZWQgdG8uXG4gICAgICAgIHZhciB0aW1lSWNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciB0aW1lSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICQodGltZUljb24pLmF0dHIoe1xuICAgICAgICAgICAgc3JjOiBcIi4uL19zdGF0aWMvY2xvY2sucG5nXCIsXG4gICAgICAgICAgICBzdHlsZTogXCJ3aWR0aDoxNXB4O2hlaWdodDoxNXB4XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aW1lSWNvbkRpdi5jbGFzc05hbWUgPSBcInRpbWVUaXBcIjtcbiAgICAgICAgdGltZUljb25EaXYudGl0bGUgPSBcIlwiO1xuICAgICAgICB0aW1lSWNvbkRpdi5hcHBlbmRDaGlsZCh0aW1lSWNvbik7XG4gICAgICAgICQoY29tcG9uZW50KS5wcmVwZW5kKHRpbWVJY29uRGl2KTtcbiAgICB9LFxuXG4gICAgY2hlY2tDb3JyZWN0VGltZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gcGN0X2NvcnJlY3QgaXMgc2V0IGJ5IHRoZSB1bml0dGVzdC9ndWkucHkgbW9kdWxlIGluIHNrdWxwdC5cbiAgICAgICAgLy8gaXQgcmVsaWVzIG9uIGZpbmRpbmcgdGhpcyBvYmplY3QgaW4gdGhlIGVkTGlzdFxuICAgICAgICBpZiAodGhpcy5pc0Fuc3dlcmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wY3RfY29ycmVjdCA+PSAxMDAuMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlRcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiSVwiOyAvLyB3ZSBpZ25vcmUgdGhpcyBpbiB0aGUgZ3JhZGluZyBpZiBubyB1bml0dGVzdHNcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBoaWRlRmVlZGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICB9LFxuXG4gICAgcmVpbml0aWFsaXplTGlzdGVuZXJzOiBmdW5jdGlvbiAodGFrZW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlYXR0YWNoaW5nIHJ1bmJ1dHRvbmhhbmRsZXJcIik7XG4gICAgICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrID0gdGhpcy5ydW5CdXR0b25IYW5kZXIuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMuY29kZURpdikuc2hvdygpO1xuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAkKHRoaXMuY29kZURpdikucmVtb3ZlQ2xhc3MoXCJhYy1kaXNhYmxlZFwiKTtcbiAgICAgICAgdGhpcy5lZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICAkKHRoaXMuaGlzdEJ1dHRvbikuY2xpY2sodGhpcy5hZGRIaXN0b3J5U2NydWJiZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKHtcbiAgICAgICAgICAgICAgICBtYXg6IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBzbGlkZTogdGhpcy5zbGlkZWl0LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgY2hhbmdlOiB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWtlbikge1xuICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZpZH1fdW5pdF9yZXN1bHRzYCkuc2hvdygpO1xuICAgICAgICB9XG4gICAgfSxcbn07XG5cbmV4cG9ydCBjbGFzcyBUaW1lZExpdmVDb2RlIGV4dGVuZHMgTGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihUaW1lZExpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuXG5leHBvcnQgY2xhc3MgVGltZWRBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXRDb21wbGV0ZSA9IHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cblxuICAgIC8vIGZvciB0aW1lZCBleGFtcyB3ZSBuZWVkIHRvIGNhbGwgcnVuUHJvZyBhbmQgdGVsbCBpdCB0aGF0IHRoZXJlIGlzXG4gICAgLy8gbm8gR1VJIGZvciBzbGlkZXJzIG9yIG90aGVyIHRoaW5ncy5cbiAgICAvLyB0aGUgYW5zd2Vycy5cbiAgICBhc3luYyBjaGVja0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIGxldCBub1VJID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50aW1lZEluaXRDb21wbGV0ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNBbnN3ZXJlZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5Qcm9nKG5vVUksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihUaW1lZEFjdGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZEpTQWN0aXZlQ29kZSBleHRlbmRzIEpTQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZEpTQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcblxuZXhwb3J0IGNsYXNzIFRpbWVkSFRNTEFjdGl2ZUNvZGUgZXh0ZW5kcyBIVE1MQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZEhUTUxBY3RpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuXG5leHBvcnQgY2xhc3MgVGltZWRTUUxBY3RpdmVDb2RlIGV4dGVuZHMgU1FMQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZFNRTEFjdGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZEJyeXRob25BY3RpdmVDb2RlIGV4dGVuZHMgQnJ5dGhvbkFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cbn1cbk9iamVjdC5hc3NpZ24oVGltZWRCcnl0aG9uQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcbiIsIi8qXG5cbmhpZ2hsaWdodCB2NFxuXG5IaWdobGlnaHRzIGFyYml0cmFyeSB0ZXJtcy5cblxuPGh0dHA6Ly9qb2hhbm5idXJrYXJkLmRlL2Jsb2cvcHJvZ3JhbW1pbmcvamF2YXNjcmlwdC9oaWdobGlnaHQtamF2YXNjcmlwdC10ZXh0LWhpZ2xpZ2h0aW5nLWpxdWVyeS1wbHVnaW4uaHRtbD5cblxuTUlUIGxpY2Vuc2UuXG5cbkpvaGFubiBCdXJrYXJkXG48aHR0cDovL2pvaGFubmJ1cmthcmQuZGU+XG48bWFpbHRvOmpiQGVhaW8uY29tPlxuXG4qL1xuXG5qUXVlcnkuZm4uaGlnaGxpZ2h0ID0gZnVuY3Rpb24ocGF0KSB7XG4gZnVuY3Rpb24gaW5uZXJIaWdobGlnaHQobm9kZSwgcGF0KSB7XG4gIHZhciBza2lwID0gMDtcbiAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykge1xuICAgdmFyIHBvcyA9IG5vZGUuZGF0YS50b1VwcGVyQ2FzZSgpLmluZGV4T2YocGF0KTtcbiAgIGlmIChwb3MgPj0gMCkge1xuICAgIHZhciBzcGFubm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBzcGFubm9kZS5jbGFzc05hbWUgPSAnaGlnaGxpZ2h0JztcbiAgICB2YXIgbWlkZGxlYml0ID0gbm9kZS5zcGxpdFRleHQocG9zKTtcbiAgICB2YXIgZW5kYml0ID0gbWlkZGxlYml0LnNwbGl0VGV4dChwYXQubGVuZ3RoKTtcbiAgICB2YXIgbWlkZGxlY2xvbmUgPSBtaWRkbGViaXQuY2xvbmVOb2RlKHRydWUpO1xuICAgIHNwYW5ub2RlLmFwcGVuZENoaWxkKG1pZGRsZWNsb25lKTtcbiAgICBtaWRkbGViaXQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoc3Bhbm5vZGUsIG1pZGRsZWJpdCk7XG4gICAgc2tpcCA9IDE7XG4gICB9XG4gIH1cbiAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuY2hpbGROb2RlcyAmJiAhLyhzY3JpcHR8c3R5bGUpL2kudGVzdChub2RlLnRhZ05hbWUpKSB7XG4gICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgIGkgKz0gaW5uZXJIaWdobGlnaHQobm9kZS5jaGlsZE5vZGVzW2ldLCBwYXQpO1xuICAgfVxuICB9XG4gIHJldHVybiBza2lwO1xuIH1cbiByZXR1cm4gdGhpcy5sZW5ndGggJiYgcGF0ICYmIHBhdC5sZW5ndGggPyB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gIGlubmVySGlnaGxpZ2h0KHRoaXMsIHBhdC50b1VwcGVyQ2FzZSgpKTtcbiB9KSA6IHRoaXM7XG59O1xuXG5qUXVlcnkuZm4ucmVtb3ZlSGlnaGxpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gcmV0dXJuIHRoaXMuZmluZChcInNwYW4uaGlnaGxpZ2h0XCIpLmVhY2goZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkLm5vZGVOYW1lO1xuICB3aXRoICh0aGlzLnBhcmVudE5vZGUpIHtcbiAgIHJlcGxhY2VDaGlsZCh0aGlzLmZpcnN0Q2hpbGQsIHRoaXMpO1xuICAgbm9ybWFsaXplKCk7XG4gIH1cbiB9KS5lbmQoKTtcbn07XG4iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvY3NzL2FjdGl2ZWNvZGUuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvL2hvbWUvcmVrL1J1bmVzdG9uZUNvbXBvbmVudHMvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGV8c3luY3wvXlxcLlxcLy4qJC8iLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2Nzcy9hY3RpdmVjb2RlLmNzcz8xZDExIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY2ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGUtaTE4bi5lbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS1pMThuLnB0LWJyLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlLWkxOG4uc3ItQ3lybC5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZV9icnl0aG9uLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlX2h0bWwuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfanMuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfc3FsLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hdWRpb3RvdXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2V4dHJhY3RVbml0UmVzdWx0cy5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvbGl2ZWNvZGUuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL21kNS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0LXN0ZGxpYi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0Lm1pbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvdGltZWRfYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnkuaGlnaGxpZ2h0LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8Y3J5cHRvIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8ZnMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy9pZ25vcmVkfC9ob21lL3Jlay9SdW5lc3RvbmVDb21wb25lbnRzL25vZGVfbW9kdWxlcy9zcWwuanMvZGlzdHxwYXRoIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfGZzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfG5vZGUtZmV0Y2giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUM0SDtBQUM3QjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0EsMERBQTBELG9CQUFvQix3QkFBd0IsdUJBQXVCLG1CQUFtQixvQkFBb0IsNkJBQTZCLHNDQUFzQywyQ0FBMkMsOENBQThDLDBCQUEwQiwrQkFBK0Isa0NBQWtDLDBCQUEwQixrQkFBa0IsR0FBRyxzQkFBc0Isb0JBQW9CLHlCQUF5QixhQUFhLGNBQWMsa0JBQWtCLGtCQUFrQix1QkFBdUIsR0FBRywwQkFBMEIsb0JBQW9CLHlCQUF5QixtQkFBbUIsa0JBQWtCLDJDQUEyQyxrQkFBa0IsbUJBQW1CLEdBQUcsaUJBQWlCLHlCQUF5QixHQUFHLGFBQWEsdUJBQXVCLDRCQUE0Qix5QkFBeUIsaUJBQWlCLG1CQUFtQixpQkFBaUIsZ0JBQWdCLEdBQUcsaUJBQWlCLHlCQUF5Qix5QkFBeUIsd0JBQXdCLHVCQUF1QixrQkFBa0IsR0FBRyxzQ0FBc0MsdUJBQXVCLHdCQUF3Qix5QkFBeUIseUJBQXlCLEdBQUcsMkJBQTJCLHdCQUF3QixHQUFHLGdCQUFnQixvQkFBb0IsdUJBQXVCLGdDQUFnQyxHQUFHLGtCQUFrQixrQ0FBa0MsR0FBRyxpQkFBaUIseUJBQXlCLHdCQUF3QixHQUFHLHNCQUFzQiwwQkFBMEIsR0FBRyxrQkFBa0IsMkNBQTJDLHlCQUF5Qix3QkFBd0Isa0JBQWtCLEdBQUcsaUJBQWlCLGdDQUFnQyx5QkFBeUIsc0JBQXNCLHdCQUF3QixxQkFBcUIsR0FBRyx3QkFBd0IsOEJBQThCLEdBQUcsOEJBQThCLGlDQUFpQyxHQUFHLG9CQUFvQixpQ0FBaUMsR0FBRyxrQkFBa0IsMkJBQTJCLEdB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFFRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7QUMvTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0pBQXdKO0FBQ3hKO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7OztBQ3JIRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsT0FBTyxHQUFHLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esa0ZBQWtGLFlBQVk7QUFDOUY7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGFBQWE7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLG1CQUFtQjtBQUMxQzs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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TSxpQ0FBaUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLGlJQUFpSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNO0FBQ3hqQyw0cURBQTRxRCxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FB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QTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw0QkFBNEI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7Ozs7Ozs7Ozs7O0FDcERBLGU7Ozs7Ozs7Ozs7QUNBQSxlOzs7Ozs7Ozs7O0FDQUEsZTs7Ozs7Ozs7OztBQ0FBLGU7Ozs7Ozs7Ozs7QUNBQSxlIiwiZmlsZSI6Im5vZGVfbW9kdWxlc19tb21lbnRfbG9jYWxlX3N5bmNfcmVjdXJzaXZlXy1ydW5lc3RvbmVfYWN0aXZlY29kZV9qc19hY2ZhY3RvcnlfanMuYnVuZGxlLmpzP3Y9N2FlNTQwYjhkNDg2ODVmNDdhNzEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5tb2RhbC1wcm9maWxlIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgbWluLWhlaWdodDogMzAwcHg7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIHdpZHRoOiA3MDBweDtcXG4gICAgcGFkZGluZzogMjVweDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZjtcXG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgLW1vei1ib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICBiYWNrZ3JvdW5kOiAjZjJmMmYyO1xcbiAgICB6LWluZGV4OiA1MDtcXG59XFxuXFxuLm1vZGFsLWxpZ2h0c291dCB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICBsZWZ0OiAwO1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgei1pbmRleDogMjU7XFxuICAgIGJhY2tncm91bmQ6ICMwMDA7XFxufVxcblxcbi5tb2RhbC1jbG9zZS1wcm9maWxlIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBoZWlnaHQ6IDQzcHg7XFxuICAgIHdpZHRoOiA0M3B4O1xcbiAgICAvKmJhY2tncm91bmQtaW1hZ2U6IHVybCgnY2xvc2UucG5nJyk7ICovXFxuICAgIHRvcDogMXB4O1xcbiAgICByaWdodDogMC41cHg7XFxufVxcblxcbi5hY19hY3Rpb25zIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG4uYWNfc2VwIHtcXG4gICAgYmFja2dyb3VuZDogIzAwMDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBtYXJnaW46IC0xNXB4IDEwcHg7XFxuICAgIHdpZHRoOiAxcHg7XFxuICAgIGhlaWdodDogMzVweDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgYm9yZGVyOiAwO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWF4LXdpZHRoOiA4MDBweDtcXG4gICAgY2xlYXI6IGJvdGg7XFxufVxcblxcbi5hY19zZWN0aW9uID4gKjpub3QoLmFjX3NlY3Rpb24pIHtcXG4gICAgbWF4LXdpZHRoOiA1MDBwdDtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiAuY2xlYXJmaXgge1xcbiAgICBwb3NpdGlvbjogaW5pdGlhbDtcXG59XFxuXFxuLmFjX291dHB1dCB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIG1heC13aWR0aDogNDUwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxufVxcbi5hY19vdXRwdXQgcHJlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xcbn1cXG5cXG4uYWNfY2FwdGlvbiB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxufVxcblxcbi5hY19jYXB0aW9uX3RleHQge1xcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xcbn1cXG5cXG4uYWNfcXVlc3Rpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI0LCAyMzYsIDIxNyk7XFxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcXG4gICAgcGFkZGluZy10b3A6IDEwcHg7XFxuICAgIG1hcmdpbjogNXB4O1xcbn1cXG5cXG4uYWN0aXZlX291dCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkY2RjZGM7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgbWluLXdpZHRoOiAyMGVtO1xcbiAgICBtYXgtaGVpZ2h0OiAzMDBweDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxufVxcblxcbi52aXNpYmxlLWFjLWNhbnZhcyB7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkIGJsYWNrO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiA+IC5jb2wtbWQtMTIge1xcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG59XFxuXFxuLmZ1bGxfd2lkdGggb2wge1xcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG59XFxuXFxuLmFjLWRpc2FibGVkIHtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi5hYy1mZWVkYmFjayB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xcbiAgICBwYWRkaW5nOiAzcHg7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5O1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0X3N1Y2Nlc3Mge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgY29sb3I6IGdyZWVuO1xcbiAgICBib3JkZXI6IDBweDtcXG4gICAgcGFkZGluZzogMHB4O1xcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICBtaW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDtcXG59XFxuXFxuLmFjX3NxbF9yZXN1bHRfZmFpbHVyZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBjb2xvcjogcmVkO1xcbiAgICBib3JkZXI6IDBweDtcXG4gICAgcGFkZGluZzogMHB4O1xcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICBtaW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDtcXG59XFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvY3NzL2FjdGl2ZWNvZGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksYUFBYTtJQUNiLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsK0JBQStCO0lBQy9CLG9DQUFvQztJQUNwQyx1Q0FBdUM7SUFDdkMsbUJBQW1CO0lBQ25CLHdCQUF3QjtJQUN4QiwyQkFBMkI7SUFDM0IsbUJBQW1CO0lBQ25CLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsTUFBTTtJQUNOLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsWUFBWTtJQUNaLFdBQVc7SUFDWCx1Q0FBdUM7SUFDdkMsUUFBUTtJQUNSLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsWUFBWTtJQUNaLFVBQVU7SUFDVixTQUFTO0FBQ2I7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsV0FBVztBQUNmOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLGdCQUFnQjtJQUNoQix5QkFBeUI7QUFDN0I7QUFDQTtJQUNJLDJCQUEyQjtBQUMvQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxvQ0FBb0M7SUFDcEMsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsY0FBYztBQUNsQjs7QUFFQTtJQUNJLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLHVCQUF1QjtJQUN2QixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksMkJBQTJCO0lBQzNCLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksNkJBQTZCO0lBQzdCLFlBQVk7SUFDWixXQUFXO0lBQ1gsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksNkJBQTZCO0lBQzdCLFVBQVU7SUFDVixXQUFXO0lBQ1gsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsMEJBQTBCO0FBQzlCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5tb2RhbC1wcm9maWxlIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgbWluLWhlaWdodDogMzAwcHg7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIHdpZHRoOiA3MDBweDtcXG4gICAgcGFkZGluZzogMjVweDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZjtcXG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgLW1vei1ib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICBiYWNrZ3JvdW5kOiAjZjJmMmYyO1xcbiAgICB6LWluZGV4OiA1MDtcXG59XFxuXFxuLm1vZGFsLWxpZ2h0c291dCB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICBsZWZ0OiAwO1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgei1pbmRleDogMjU7XFxuICAgIGJhY2tncm91bmQ6ICMwMDA7XFxufVxcblxcbi5tb2RhbC1jbG9zZS1wcm9maWxlIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBoZWlnaHQ6IDQzcHg7XFxuICAgIHdpZHRoOiA0M3B4O1xcbiAgICAvKmJhY2tncm91bmQtaW1hZ2U6IHVybCgnY2xvc2UucG5nJyk7ICovXFxuICAgIHRvcDogMXB4O1xcbiAgICByaWdodDogMC41cHg7XFxufVxcblxcbi5hY19hY3Rpb25zIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG4uYWNfc2VwIHtcXG4gICAgYmFja2dyb3VuZDogIzAwMDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBtYXJnaW46IC0xNXB4IDEwcHg7XFxuICAgIHdpZHRoOiAxcHg7XFxuICAgIGhlaWdodDogMzVweDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgYm9yZGVyOiAwO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWF4LXdpZHRoOiA4MDBweDtcXG4gICAgY2xlYXI6IGJvdGg7XFxufVxcblxcbi5hY19zZWN0aW9uID4gKjpub3QoLmFjX3NlY3Rpb24pIHtcXG4gICAgbWF4LXdpZHRoOiA1MDBwdDtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiAuY2xlYXJmaXgge1xcbiAgICBwb3NpdGlvbjogaW5pdGlhbDtcXG59XFxuXFxuLmFjX291dHB1dCB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIG1heC13aWR0aDogNDUwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxufVxcbi5hY19vdXRwdXQgcHJlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xcbn1cXG5cXG4uYWNfY2FwdGlvbiB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxufVxcblxcbi5hY19jYXB0aW9uX3RleHQge1xcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xcbn1cXG5cXG4uYWNfcXVlc3Rpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI0LCAyMzYsIDIxNyk7XFxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcXG4gICAgcGFkZGluZy10b3A6IDEwcHg7XFxuICAgIG1hcmdpbjogNXB4O1xcbn1cXG5cXG4uYWN0aXZlX291dCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkY2RjZGM7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgbWluLXdpZHRoOiAyMGVtO1xcbiAgICBtYXgtaGVpZ2h0OiAzMDBweDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxufVxcblxcbi52aXNpYmxlLWFjLWNhbnZhcyB7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkIGJsYWNrO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiA+IC5jb2wtbWQtMTIge1xcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG59XFxuXFxuLmZ1bGxfd2lkdGggb2wge1xcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG59XFxuXFxuLmFjLWRpc2FibGVkIHtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi5hYy1mZWVkYmFjayB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xcbiAgICBwYWRkaW5nOiAzcHg7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5O1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0X3N1Y2Nlc3Mge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgY29sb3I6IGdyZWVuO1xcbiAgICBib3JkZXI6IDBweDtcXG4gICAgcGFkZGluZzogMHB4O1xcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICBtaW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDtcXG59XFxuXFxuLmFjX3NxbF9yZXN1bHRfZmFpbHVyZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBjb2xvcjogcmVkO1xcbiAgICBib3JkZXI6IDBweDtcXG4gICAgcGFkZGluZzogMHB4O1xcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICBtaW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9hZlwiOiA0Mjc4Nixcblx0XCIuL2FmLmpzXCI6IDQyNzg2LFxuXHRcIi4vYXJcIjogMzA4NjcsXG5cdFwiLi9hci1kelwiOiAxNDEzMCxcblx0XCIuL2FyLWR6LmpzXCI6IDE0MTMwLFxuXHRcIi4vYXIta3dcIjogOTYxMzUsXG5cdFwiLi9hci1rdy5qc1wiOiA5NjEzNSxcblx0XCIuL2FyLWx5XCI6IDU2NDQwLFxuXHRcIi4vYXItbHkuanNcIjogNTY0NDAsXG5cdFwiLi9hci1tYVwiOiA0NzcwMixcblx0XCIuL2FyLW1hLmpzXCI6IDQ3NzAyLFxuXHRcIi4vYXItc2FcIjogMTYwNDAsXG5cdFwiLi9hci1zYS5qc1wiOiAxNjA0MCxcblx0XCIuL2FyLXRuXCI6IDM3MTAwLFxuXHRcIi4vYXItdG4uanNcIjogMzcxMDAsXG5cdFwiLi9hci5qc1wiOiAzMDg2Nyxcblx0XCIuL2F6XCI6IDMxMDgzLFxuXHRcIi4vYXouanNcIjogMzEwODMsXG5cdFwiLi9iZVwiOiA5ODA4LFxuXHRcIi4vYmUuanNcIjogOTgwOCxcblx0XCIuL2JnXCI6IDY4MzM4LFxuXHRcIi4vYmcuanNcIjogNjgzMzgsXG5cdFwiLi9ibVwiOiA2NzQzOCxcblx0XCIuL2JtLmpzXCI6IDY3NDM4LFxuXHRcIi4vYm5cIjogODkwNSxcblx0XCIuL2JuLmpzXCI6IDg5MDUsXG5cdFwiLi9ib1wiOiAxMTU2MCxcblx0XCIuL2JvLmpzXCI6IDExNTYwLFxuXHRcIi4vYnJcIjogMTI3OCxcblx0XCIuL2JyLmpzXCI6IDEyNzgsXG5cdFwiLi9ic1wiOiA4MDYyMixcblx0XCIuL2JzLmpzXCI6IDgwNjIyLFxuXHRcIi4vY2FcIjogMjQ2OCxcblx0XCIuL2NhLmpzXCI6IDI0NjgsXG5cdFwiLi9jc1wiOiA1ODIyLFxuXHRcIi4vY3MuanNcIjogNTgyMixcblx0XCIuL2N2XCI6IDUwODc3LFxuXHRcIi4vY3YuanNcIjogNTA4NzcsXG5cdFwiLi9jeVwiOiA0NzM3Myxcblx0XCIuL2N5LmpzXCI6IDQ3MzczLFxuXHRcIi4vZGFcIjogMjQ3ODAsXG5cdFwiLi9kYS5qc1wiOiAyNDc4MCxcblx0XCIuL2RlXCI6IDU5NzQwLFxuXHRcIi4vZGUtYXRcIjogNjAyMTcsXG5cdFwiLi9kZS1hdC5qc1wiOiA2MDIxNyxcblx0XCIuL2RlLWNoXCI6IDYwODk0LFxuXHRcIi4vZGUtY2guanNcIjogNjA4OTQsXG5cdFwiLi9kZS5qc1wiOiA1OTc0MCxcblx0XCIuL2R2XCI6IDUzMDAsXG5cdFwiLi9kdi5qc1wiOiA1MzAwLFxuXHRcIi4vZWxcIjogNTA4MzcsXG5cdFwiLi9lbC5qc1wiOiA1MDgzNyxcblx0XCIuL2VuLWF1XCI6IDc4MzQ4LFxuXHRcIi4vZW4tYXUuanNcIjogNzgzNDgsXG5cdFwiLi9lbi1jYVwiOiA3NzkyNSxcblx0XCIuL2VuLWNhLmpzXCI6IDc3OTI1LFxuXHRcIi4vZW4tZ2JcIjogMjIyNDMsXG5cdFwiLi9lbi1nYi5qc1wiOiAyMjI0Myxcblx0XCIuL2VuLWllXCI6IDQ2NDM2LFxuXHRcIi4vZW4taWUuanNcIjogNDY0MzYsXG5cdFwiLi9lbi1uelwiOiA3NjMxOSxcblx0XCIuL2VuLW56LmpzXCI6IDc2MzE5LFxuXHRcIi4vZW9cIjogOTI5MTUsXG5cdFwiLi9lby5qc1wiOiA5MjkxNSxcblx0XCIuL2VzXCI6IDU1NjU1LFxuXHRcIi4vZXMtZG9cIjogNTUyNTEsXG5cdFwiLi9lcy1kby5qc1wiOiA1NTI1MSxcblx0XCIuL2VzLXVzXCI6IDcxMTQ2LFxuXHRcIi4vZXMtdXMuanNcIjogNzExNDYsXG5cdFwiLi9lcy5qc1wiOiA1NTY1NSxcblx0XCIuL2V0XCI6IDU2MDMsXG5cdFwiLi9ldC5qc1wiOiA1NjAzLFxuXHRcIi4vZXVcIjogNzc3NjMsXG5cdFwiLi9ldS5qc1wiOiA3Nzc2Myxcblx0XCIuL2ZhXCI6IDc2OTU5LFxuXHRcIi4vZmEuanNcIjogNzY5NTksXG5cdFwiLi9maVwiOiAxMTg5Nyxcblx0XCIuL2ZpLmpzXCI6IDExODk3LFxuXHRcIi4vZm9cIjogOTQ2OTQsXG5cdFwiLi9mby5qc1wiOiA5NDY5NCxcblx0XCIuL2ZyXCI6IDk0NDcwLFxuXHRcIi4vZnItY2FcIjogNjMwNDksXG5cdFwiLi9mci1jYS5qc1wiOiA2MzA0OSxcblx0XCIuL2ZyLWNoXCI6IDUyMzMwLFxuXHRcIi4vZnItY2guanNcIjogNTIzMzAsXG5cdFwiLi9mci5qc1wiOiA5NDQ3MCxcblx0XCIuL2Z5XCI6IDUwNDQsXG5cdFwiLi9meS5qc1wiOiA1MDQ0LFxuXHRcIi4vZ2RcIjogMjEwMSxcblx0XCIuL2dkLmpzXCI6IDIxMDEsXG5cdFwiLi9nbFwiOiAzODc5NCxcblx0XCIuL2dsLmpzXCI6IDM4Nzk0LFxuXHRcIi4vZ29tLWxhdG5cIjogMjMxNjgsXG5cdFwiLi9nb20tbGF0bi5qc1wiOiAyMzE2OCxcblx0XCIuL2d1XCI6IDk1MzQ5LFxuXHRcIi4vZ3UuanNcIjogOTUzNDksXG5cdFwiLi9oZVwiOiAyNDIwNixcblx0XCIuL2hlLmpzXCI6IDI0MjA2LFxuXHRcIi4vaGlcIjogMzAwOTQsXG5cdFwiLi9oaS5qc1wiOiAzMDA5NCxcblx0XCIuL2hyXCI6IDMwMzE2LFxuXHRcIi4vaHIuanNcIjogMzAzMTYsXG5cdFwiLi9odVwiOiAyMjEzOCxcblx0XCIuL2h1LmpzXCI6IDIyMTM4LFxuXHRcIi4vaHktYW1cIjogMTE0MjMsXG5cdFwiLi9oeS1hbS5qc1wiOiAxMTQyMyxcblx0XCIuL2lkXCI6IDI5MjE4LFxuXHRcIi4vaWQuanNcIjogMjkyMTgsXG5cdFwiLi9pc1wiOiA5MDEzNSxcblx0XCIuL2lzLmpzXCI6IDkwMTM1LFxuXHRcIi4vaXRcIjogOTA2MjYsXG5cdFwiLi9pdC5qc1wiOiA5MDYyNixcblx0XCIuL2phXCI6IDM5MTgzLFxuXHRcIi4vamEuanNcIjogMzkxODMsXG5cdFwiLi9qdlwiOiAyNDI4Nixcblx0XCIuL2p2LmpzXCI6IDI0Mjg2LFxuXHRcIi4va2FcIjogNDA0MTUsXG5cdFwiLi9rYS5qc1wiOiA0MDQxNSxcblx0XCIuL2trXCI6IDQ3NzcyLFxuXHRcIi4va2suanNcIjogNDc3NzIsXG5cdFwiLi9rbVwiOiAxODc1OCxcblx0XCIuL2ttLmpzXCI6IDE4NzU4LFxuXHRcIi4va25cIjogNzkyODIsXG5cdFwiLi9rbi5qc1wiOiA3OTI4Mixcblx0XCIuL2tvXCI6IDMzNzMwLFxuXHRcIi4va28uanNcIjogMzM3MzAsXG5cdFwiLi9reVwiOiAzMzI5MSxcblx0XCIuL2t5LmpzXCI6IDMzMjkxLFxuXHRcIi4vbGJcIjogMzY4NDEsXG5cdFwiLi9sYi5qc1wiOiAzNjg0MSxcblx0XCIuL2xvXCI6IDU1NDY2LFxuXHRcIi4vbG8uanNcIjogNTU0NjYsXG5cdFwiLi9sdFwiOiA1NzAxMCxcblx0XCIuL2x0LmpzXCI6IDU3MDEwLFxuXHRcIi4vbHZcIjogMzc1OTUsXG5cdFwiLi9sdi5qc1wiOiAzNzU5NSxcblx0XCIuL21lXCI6IDM5ODYxLFxuXHRcIi4vbWUuanNcIjogMzk4NjEsXG5cdFwiLi9taVwiOiAzNTQ5Myxcblx0XCIuL21pLmpzXCI6IDM1NDkzLFxuXHRcIi4vbWtcIjogOTU5NjYsXG5cdFwiLi9tay5qc1wiOiA5NTk2Nixcblx0XCIuL21sXCI6IDg3MzQxLFxuXHRcIi4vbWwuanNcIjogODczNDEsXG5cdFwiLi9tclwiOiAxMDM3MCxcblx0XCIuL21yLmpzXCI6IDEwMzcwLFxuXHRcIi4vbXNcIjogOTg0Nyxcblx0XCIuL21zLW15XCI6IDQxMjM3LFxuXHRcIi4vbXMtbXkuanNcIjogNDEyMzcsXG5cdFwiLi9tcy5qc1wiOiA5ODQ3LFxuXHRcIi4vbXRcIjogNzIxMjYsXG5cdFwiLi9tdC5qc1wiOiA3MjEyNixcblx0XCIuL215XCI6IDU2MTY1LFxuXHRcIi4vbXkuanNcIjogNTYxNjUsXG5cdFwiLi9uYlwiOiA2NDkyNCxcblx0XCIuL25iLmpzXCI6IDY0OTI0LFxuXHRcIi4vbmVcIjogMTY3NDQsXG5cdFwiLi9uZS5qc1wiOiAxNjc0NCxcblx0XCIuL25sXCI6IDkzOTAxLFxuXHRcIi4vbmwtYmVcIjogNTk4MTQsXG5cdFwiLi9ubC1iZS5qc1wiOiA1OTgxNCxcblx0XCIuL25sLmpzXCI6IDkzOTAxLFxuXHRcIi4vbm5cIjogODM4NzcsXG5cdFwiLi9ubi5qc1wiOiA4Mzg3Nyxcblx0XCIuL3BhLWluXCI6IDE1ODU4LFxuXHRcIi4vcGEtaW4uanNcIjogMTU4NTgsXG5cdFwiLi9wbFwiOiA2NDQ5NSxcblx0XCIuL3BsLmpzXCI6IDY0NDk1LFxuXHRcIi4vcHRcIjogODk1MjAsXG5cdFwiLi9wdC1iclwiOiA1Nzk3MSxcblx0XCIuL3B0LWJyLmpzXCI6IDU3OTcxLFxuXHRcIi4vcHQuanNcIjogODk1MjAsXG5cdFwiLi9yb1wiOiA5NjQ1OSxcblx0XCIuL3JvLmpzXCI6IDk2NDU5LFxuXHRcIi4vcnVcIjogMjE3OTMsXG5cdFwiLi9ydS5qc1wiOiAyMTc5Myxcblx0XCIuL3NkXCI6IDQwOTUwLFxuXHRcIi4vc2QuanNcIjogNDA5NTAsXG5cdFwiLi9zZVwiOiAxMDQ5MCxcblx0XCIuL3NlLmpzXCI6IDEwNDkwLFxuXHRcIi4vc2lcIjogOTAxMjQsXG5cdFwiLi9zaS5qc1wiOiA5MDEyNCxcblx0XCIuL3NrXCI6IDY0MjQ5LFxuXHRcIi4vc2suanNcIjogNjQyNDksXG5cdFwiLi9zbFwiOiAxNDk4NSxcblx0XCIuL3NsLmpzXCI6IDE0OTg1LFxuXHRcIi4vc3FcIjogNTExMDQsXG5cdFwiLi9zcS5qc1wiOiA1MTEwNCxcblx0XCIuL3NyXCI6IDQ5MTMxLFxuXHRcIi4vc3ItY3lybFwiOiAxMzcwOSxcblx0XCIuL3NyLWN5cmwuanNcIjogMTM3MDksXG5cdFwiLi9zci5qc1wiOiA0OTEzMSxcblx0XCIuL3NzXCI6IDg1ODkzLFxuXHRcIi4vc3MuanNcIjogODU4OTMsXG5cdFwiLi9zdlwiOiA5ODc2MCxcblx0XCIuL3N2LmpzXCI6IDk4NzYwLFxuXHRcIi4vc3dcIjogOTExNzIsXG5cdFwiLi9zdy5qc1wiOiA5MTE3Mixcblx0XCIuL3RhXCI6IDI3MzMzLFxuXHRcIi4vdGEuanNcIjogMjczMzMsXG5cdFwiLi90ZVwiOiAyMzExMCxcblx0XCIuL3RlLmpzXCI6IDIzMTEwLFxuXHRcIi4vdGV0XCI6IDUyMDk1LFxuXHRcIi4vdGV0LmpzXCI6IDUyMDk1LFxuXHRcIi4vdGhcIjogOTA0MSxcblx0XCIuL3RoLmpzXCI6IDkwNDEsXG5cdFwiLi90bC1waFwiOiA3NTc2OCxcblx0XCIuL3RsLXBoLmpzXCI6IDc1NzY4LFxuXHRcIi4vdGxoXCI6IDg5NDQ0LFxuXHRcIi4vdGxoLmpzXCI6IDg5NDQ0LFxuXHRcIi4vdHJcIjogNzIzOTcsXG5cdFwiLi90ci5qc1wiOiA3MjM5Nyxcblx0XCIuL3R6bFwiOiAyODI1NCxcblx0XCIuL3R6bC5qc1wiOiAyODI1NCxcblx0XCIuL3R6bVwiOiA1MTEwNixcblx0XCIuL3R6bS1sYXRuXCI6IDMwNjk5LFxuXHRcIi4vdHptLWxhdG4uanNcIjogMzA2OTksXG5cdFwiLi90em0uanNcIjogNTExMDYsXG5cdFwiLi91a1wiOiA2NzY5MSxcblx0XCIuL3VrLmpzXCI6IDY3NjkxLFxuXHRcIi4vdXJcIjogMTM3OTUsXG5cdFwiLi91ci5qc1wiOiAxMzc5NSxcblx0XCIuL3V6XCI6IDY3OTEsXG5cdFwiLi91ei1sYXRuXCI6IDYwNTg4LFxuXHRcIi4vdXotbGF0bi5qc1wiOiA2MDU4OCxcblx0XCIuL3V6LmpzXCI6IDY3OTEsXG5cdFwiLi92aVwiOiA2NTY2Nixcblx0XCIuL3ZpLmpzXCI6IDY1NjY2LFxuXHRcIi4veC1wc2V1ZG9cIjogMTQzNzgsXG5cdFwiLi94LXBzZXVkby5qc1wiOiAxNDM3OCxcblx0XCIuL3lvXCI6IDc1ODA1LFxuXHRcIi4veW8uanNcIjogNzU4MDUsXG5cdFwiLi96aC1jblwiOiA4MzgzOSxcblx0XCIuL3poLWNuLmpzXCI6IDgzODM5LFxuXHRcIi4vemgtaGtcIjogNTU3MjYsXG5cdFwiLi96aC1oay5qc1wiOiA1NTcyNixcblx0XCIuL3poLXR3XCI6IDc0MTUyLFxuXHRcIi4vemgtdHcuanNcIjogNzQxNTJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSA0NjcwMDsiLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2FjdGl2ZWNvZGUuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcbmltcG9ydCBKU0FjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9qcy5qc1wiO1xuaW1wb3J0IEhUTUxBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfaHRtbC5qc1wiO1xuaW1wb3J0IFNRTEFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9zcWwuanNcIjtcbmltcG9ydCBCcnl0aG9uQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2JyeXRob24uanNcIjtcbmltcG9ydCBMaXZlQ29kZSBmcm9tIFwiLi9saXZlY29kZS5qc1wiO1xuaW1wb3J0IHtcbiAgICBUaW1lZEFjdGl2ZUNvZGUsXG4gICAgVGltZWRMaXZlQ29kZSxcbiAgICBUaW1lZEpTQWN0aXZlQ29kZSxcbiAgICBUaW1lZEhUTUxBY3RpdmVDb2RlLFxuICAgIFRpbWVkU1FMQWN0aXZlQ29kZSxcbiAgICBUaW1lZEJyeXRob25BY3RpdmVDb2RlLFxufSBmcm9tIFwiLi90aW1lZF9hY3RpdmVjb2RlXCI7XG5pbXBvcnQgXCIuLi8uLi9jb21tb24vanMvanF1ZXJ5LmhpZ2hsaWdodC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBQ0ZhY3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmZvbyA9IFwiYmFyXCI7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVBY3RpdmVDb2RlKG9yaWcsIGxhbmcsIGFkZG9wdHMpIHtcbiAgICAgICAgdmFyIG9wdHMgPSB7XG4gICAgICAgICAgICBvcmlnOiBvcmlnLFxuICAgICAgICAgICAgdXNlUnVuZXN0b25lU2VydmljZXM6IGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzLFxuICAgICAgICAgICAgcHl0aG9uMzogZUJvb2tDb25maWcucHl0aG9uMyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGFkZG9wdHMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGF0dHJuYW1lIGluIGFkZG9wdHMpIHtcbiAgICAgICAgICAgICAgICBvcHRzW2F0dHJuYW1lXSA9IGFkZG9wdHNbYXR0cm5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsYW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhbmcgPSAkKG9wdHMub3JpZykuZmluZChcIltkYXRhLWxhbmddXCIpLmRhdGEoXCJsYW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0ZXh0X2FyZWEgPSAkKG9wdHMub3JpZykuZmluZChcInRleHRhcmVhXCIpWzBdXG4gICAgICAgIHZhciBweXRob24zX2ludGVycHJldGVyID0gJCh0ZXh0X2FyZWEpLmF0dHIoXCJkYXRhLXB5dGhvbjNfaW50ZXJwcmV0ZXJcIik7XG4gICAgICAgIHZhciBvdXRwdXRfaGVpZ2h0ID0gJCh0ZXh0X2FyZWEpLmF0dHIoXCJkYXRhLW91dHB1dF9oZWlnaHRcIik7XG4gICAgICAgIGlmIChvcHRzLnRpbWVkID09IHRydWUpIHtcbiAgICAgICAgICAgIGlmKHB5dGhvbjNfaW50ZXJwcmV0ZXI9PT1cImJyeXRob25cIil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEJyeXRob25BY3RpdmVDb2RlKG9wdHMpOyAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhbmcgPT09IFwicHl0aG9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgbGFuZyA9PT0gXCJqYXZhXCIgfHxcbiAgICAgICAgICAgICAgICBsYW5nID09PSBcImNwcFwiIHx8XG4gICAgICAgICAgICAgICAgbGFuZyA9PT0gXCJjXCIgfHxcbiAgICAgICAgICAgICAgICBsYW5nID09PSBcInB5dGhvbjNcIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZExpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcImphdmFzY3JpcHRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRKU0FjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwiaHRtbG1peGVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkSFRNTEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwic3FsXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkU1FMQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoKGxhbmcgPT09XCJweXRob24zXCIpICYmIChweXRob24zX2ludGVycHJldGVyID09PSBcImJyeXRob25cIikpe1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnJ5dGhvbkFjdGl2ZUNvZGUob3B0cyk7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsYW5nID09PSBcImphdmFzY3JpcHRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSlNBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcImh0bWxtaXhlZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIVE1MQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJzcWxcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU1FMQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgW1wiamF2YVwiLCBcImNwcFwiLCBcImNcIiwgXCJweXRob24zXCIsIFwicHl0aG9uMlwiLCBcIm9jdGF2ZVwiXS5pbmRleE9mKFxuICAgICAgICAgICAgICAgICAgICBsYW5nXG4gICAgICAgICAgICAgICAgKSA+IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGlzIHB5dGhvblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyB1c2VkIGJ5IHdlYjJweSBjb250cm9sbGVyKHMpXG4gICAgc3RhdGljIGFkZEFjdGl2ZUNvZGVUb0RpdihvdXRlcmRpdmlkLCBhY2RpdmlkLCBzaWQsIGluaXRpYWxjb2RlLCBsYW5ndWFnZSkge1xuICAgICAgICB2YXIgdGhlcHJlLCBuZXdhYztcbiAgICAgICAgdmFyIGFjZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWNkaXZpZCk7XG4gICAgICAgICQoYWNkaXYpLmVtcHR5KCk7XG4gICAgICAgIHRoZXByZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcbiAgICAgICAgdGhlcHJlW1wiZGF0YS1jb21wb25lbnRcIl0gPSBcImFjdGl2ZWNvZGVcIjtcbiAgICAgICAgdGhlcHJlLmlkID0gb3V0ZXJkaXZpZDtcbiAgICAgICAgJCh0aGVwcmUpLmRhdGEoXCJsYW5nXCIsIGxhbmd1YWdlKTtcbiAgICAgICAgJChhY2RpdikuYXBwZW5kKHRoZXByZSk7XG4gICAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICAgICAgb3JpZzogdGhlcHJlLFxuICAgICAgICAgICAgdXNlUnVuZXN0b25lU2VydmljZXM6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIHZhciBhZGRvcHRzID0ge1xuICAgICAgICAgICAgc2lkOiBzaWQsXG4gICAgICAgICAgICBncmFkZXJhY3RpdmU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChsYW5ndWFnZSA9PT0gXCJodG1sbWl4ZWRcIikge1xuICAgICAgICAgICAgYWRkb3B0c1tcInZlcnRpY2FsXCJdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBuZXdhYyA9IEFDRmFjdG9yeS5jcmVhdGVBY3RpdmVDb2RlKHRoZXByZSwgbGFuZ3VhZ2UsIGFkZG9wdHMpO1xuICAgICAgICB2YXIgc2F2ZWRpdiA9IG5ld2FjLmRpdmlkO1xuICAgICAgICBuZXdhYy5kaXZpZCA9IHNhdmVkaXY7XG4gICAgICAgIG5ld2FjLmVkaXRvci5zZXRTaXplKDUwMCwgMzAwKTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBuZXdhYy5lZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlQWN0aXZlQ29kZUZyb21PcHRzKG9wdHMpIHtcbiAgICAgICAgcmV0dXJuIEFDRmFjdG9yeS5jcmVhdGVBY3RpdmVDb2RlKG9wdHMub3JpZywgb3B0cy5sYW5nLCBvcHRzKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVNjcmF0Y2hBY3RpdmVjb2RlKCkge1xuICAgICAgICAvKiBzZXQgdXAgdGhlIHNjcmF0Y2ggQWN0aXZlY29kZSBlZGl0b3IgaW4gdGhlIHNlYXJjaCBtZW51ICovXG4gICAgICAgIC8vIHVzZSB0aGUgVVJMIHRvIGFzc2lnbiBhIGRpdmlkIC0gZWFjaCBwYWdlIHNob3VsZCBoYXZlIGEgdW5pcXVlIEFjdGl2ZWNvZGUgYmxvY2sgaWQuXG4gICAgICAgIC8vIFJlbW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIFVSTCBidXQgdGhlIGNvdXJzZSBhbmQgcGFnZSBuYW1lXG4gICAgICAgIC8vIHRvZG86ICB0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGVsaW1pbmF0ZWQgYW5kIHNpbXBseSBtb3ZlZCB0byB0aGUgdGVtcGxhdGUgZmlsZVxuXG4gICAgICAgIGlmIChlQm9va0NvbmZpZy5lbmFibGVTY3JhdGNoQUMgPT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICB2YXIgZGl2aWQgPSBlQm9va0NvbmZpZy5jb3Vyc2UgKyBcIl9zY3JhdGNoX2FjXCI7XG4gICAgICAgIGRpdmlkID0gZGl2aWQucmVwbGFjZSgvWyMuXS9nLCBcIlwiKTsgLy8gaW4gY2FzZSBib29rIHRpdGxlIGhhcyBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBtZXNzIHVwIG91ciBzZWxlY3RvcnNcbiAgICAgICAgZUJvb2tDb25maWcuc2NyYXRjaERpdiA9IGRpdmlkO1xuICAgICAgICBsZXQgc3RkaW4gPSBcIlwiO1xuICAgICAgICB2YXIgbGFuZyA9IGVCb29rQ29uZmlnLmFjRGVmYXVsdExhbmd1YWdlXG4gICAgICAgICAgICA/IGVCb29rQ29uZmlnLmFjRGVmYXVsdExhbmd1YWdlXG4gICAgICAgICAgICA6IFwicHl0aG9uXCI7XG4gICAgICAgIGlmIChsYW5nID09PSBcImphdmFcIiB8fCBsYW5nID09PSBcImNwcFwiIHx8IGxhbmcgPT09IFwicHl0aG9uM1wiKSB7XG4gICAgICAgICAgICBzdGRpbiA9IGBkYXRhLXN0ZGluPVwidGV4dCBmb3Igc3RkaW5cImA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIEhUTUxcbiAgICAgICAgdmFyIGh0bWwgPSBgPGRpdiBpZD1cImFjX21vZGFsXyR7ZGl2aWR9XCIgY2xhc3M9XCJtb2RhbCBmYWRlXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgc2NyYXRjaC1hYy1tb2RhbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5TY3JhdGNoIEFjdGl2ZUNvZGU8L2g0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWNvbXBvbmVudD1cImFjdGl2ZWNvZGVcIiBpZD0ke2RpdmlkfT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9JHtkaXZpZH1fcXVlc3Rpb24gY2xhc3M9XCJhY19xdWVzdGlvblwiPjxwPlVzZSB0aGlzIGFyZWEgZm9yIHdyaXRpbmcgY29kZSBvciB0YWtpbmcgbm90ZXMuPC9wPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGRhdGEtY29kZWxlbnM9XCJ0cnVlXCIgZGF0YS1sYW5nPVwiJHtsYW5nfVwiICR7c3RkaW59PlxuXG5cblxuXG4gICAgICAgICAgICAgICAgICA8L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB2YXIgZWwgPSAkKGh0bWwpO1xuICAgICAgICAkKFwiYm9keVwiKS5hcHBlbmQoZWwpO1xuICAgICAgICBlbC5vbihcInNob3duLmJzLm1vZGFsIHNob3cuYnMubW9kYWxcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZWwuZmluZChcIi5Db2RlTWlycm9yXCIpLmVhY2goZnVuY3Rpb24gKGksIGUpIHtcbiAgICAgICAgICAgICAgICBlLkNvZGVNaXJyb3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgIGUuQ29kZU1pcnJvci5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgdG9nZ2xlU2NyYXRjaEFjdGl2ZWNvZGUoKSB7XG4gICAgICAgIHZhciBkaXZpZCA9IFwiYWNfbW9kYWxfXCIgKyBlQm9va0NvbmZpZy5zY3JhdGNoRGl2O1xuICAgICAgICB2YXIgZGl2ID0gJChcIiNcIiArIGRpdmlkKTtcbiAgICAgICAgJChgIyR7ZUJvb2tDb25maWcuc2NyYXRjaERpdn1gKS5yZW1vdmVDbGFzcyhcImFjX3NlY3Rpb25cIik7XG4gICAgICAgIGRpdi5tb2RhbChcInRvZ2dsZVwiKTtcbiAgICB9XG59XG5cbi8vXG4vLyBQYWdlIEluaXRpYWxpemF0aW9uXG4vL1xuXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBBQ0ZhY3RvcnkuY3JlYXRlU2NyYXRjaEFjdGl2ZWNvZGUoKTtcbiAgICAkKFwiW2RhdGEtY29tcG9uZW50PWFjdGl2ZWNvZGVdXCIpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoJCh0aGlzKS5jbG9zZXN0KFwiW2RhdGEtY29tcG9uZW50PXRpbWVkQXNzZXNzbWVudF1cIikubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBleGlzdHMgd2l0aGluIGEgdGltZWQgY29tcG9uZW50LCBkb24ndCByZW5kZXIgaXQgaGVyZVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuZWRMaXN0W3RoaXMuaWRdID0gQUNGYWN0b3J5LmNyZWF0ZUFjdGl2ZUNvZGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZChcInRleHRhcmVhXCIpLmRhdGEoXCJsYW5nXCIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciByZW5kZXJpbmcgQWN0aXZlY29kZSBQcm9ibGVtICR7dGhpcy5pZH1cbiAgICAgICAgICAgICAgICBEZXRhaWxzOiAke2Vycn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChsb2dnZWRvdXQpIHtcbiAgICAgICAgZm9yIChsZXQgayBpbiB3aW5kb3cuZWRMaXN0KSB7XG4gICAgICAgICAgICB3aW5kb3cuZWRMaXN0W2tdLmRpc2FibGVTYXZlTG9hZCgpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgayBpbiB3aW5kb3cuZWRMaXN0KSB7XG4gICAgICAgICAgICB3aW5kb3cuZWRMaXN0W2tdLmVuYWJsZVNhdmVMb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcbn1cblxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5LmFjdGl2ZWNvZGUgPSBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZUZyb21PcHRzO1xuXG4vLyBUaGlzIGlzIHRoZSBlYXNpZXN0IHdheSB0byBleHBvc2UgdGhpcyBvdXRzaWRlIHRoZSBtb2R1bGUuXG53aW5kb3cuQUNGYWN0b3J5ID0gQUNGYWN0b3J5O1xuXG4vLyBUaGlzIHNlZW1zIGEgYml0IGhhY2t5IGFuZCBwb3NzaWJseSBicml0dGxlLCBidXQgaXRzIGhhcmQgdG8ga25vdyBob3cgbG9uZyBpdCB3aWxsIHRha2UgdG9cbi8vIGZpZ3VyZSBvdXQgdGhlIGxvZ2luL2xvZ291dCBzdGF0dXMgb2YgdGhlIHVzZXIuICBTb21ldGltZXMgaXRzIGltbWVkaWF0ZSwgYW5kIHNvbWV0aW1lcyBpdHNcbi8vIGxvbmcuICBTbyB0byBiZSBzYWZlIHdlJ2xsIGRvIGl0IGJvdGggd2F5cy4uXG52YXIgbG9nZ2Vkb3V0O1xuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dvdXRcIiwgZnVuY3Rpb24gKCkge1xuICAgIGxvZ2dlZG91dCA9IHRydWU7XG59KTtcbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9nb3V0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKGxldCBrIGluIHdpbmRvdy5lZExpc3QpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5lZExpc3QuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgIHdpbmRvdy5lZExpc3Rba10uZGlzYWJsZVNhdmVMb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsIiQuaTE4bigpLmxvYWQoe1xuICAgIGVuOiB7XG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfaGlzdG9yeTogXCJMb2FkIEhpc3RvcnlcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fdG91cjogXCJBdWRpbyBUb3VyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRlZF9jb2RlOiBcIkxvYWRlZCB5b3VyIHNhdmVkIGNvZGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vX3NhdmVkX2NvZGU6IFwiTm8gc2F2ZWQgY29kZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcnVuX2NvZGU6IFwiUnVuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfZmVlZGJhY2s6IFwiU2hvdyBGZWVkYmFja1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGU6IFwiU2hvdyBDb2RlXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZTogXCJIaWRlIENvZGVcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlbGVuczogXCJTaG93IENvZGVMZW5zXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnM6IFwiU2hvdyBpbiBDb2RlTGVuc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zOiBcIkhpZGUgQ29kZWxlbnNcIixcblxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXJzZV9lcnJvcjpcbiAgICAgICAgICAgIFwiQSBwYXJzZSBlcnJvciBtZWFucyB0aGF0IFB5dGhvbiBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSBzeW50YXggb24gdGhlIGxpbmUgdGhlIGVycm9yIG1lc3NhZ2UgcG9pbnRzIG91dC4gQ29tbW9uIGV4YW1wbGVzIGFyZSBmb3JnZXR0aW5nIGNvbW1hcyBiZXRld2VlbiBhcmd1bWVudHMgb3IgZm9yZ2V0dGluZyBhIDogb24gYSBmb3Igc3RhdGVtZW50XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhcnNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVG8gZml4IGEgcGFyc2UgZXJyb3IgeW91IGp1c3QgbmVlZCB0byBsb29rIGNhcmVmdWxseSBhdCB0aGUgbGluZSB3aXRoIHRoZSBlcnJvciBhbmQgcG9zc2libHkgdGhlIGxpbmUgYmVmb3JlIGl0LiAgTWFrZSBzdXJlIGl0IGNvbmZvcm1zIHRvIGFsbCBvZiBQeXRob24ncyBydWxlcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVHlwZSBlcnJvcnMgbW9zdCBvZnRlbiBvY2N1ciB3aGVuIGFuIGV4cHJlc3Npb24gdHJpZXMgdG8gY29tYmluZSB0d28gb2JqZWN0cyB3aXRoIHR5cGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBjb21iaW5lZC4gIExpa2UgcmFpc2luZyBhIHN0cmluZyB0byBhIHBvd2VyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUbyBmaXggYSB0eXBlIGVycm9yIHlvdSB3aWxsIG1vc3QgbGlrZWx5IG5lZWQgdG8gdHJhY2UgdGhyb3VnaCB5b3VyIGNvZGUgYW5kIG1ha2Ugc3VyZSB0aGUgdmFyaWFibGVzIGhhdmUgdGhlIHR5cGVzIHlvdSBleHBlY3QgdGhlbSB0byBoYXZlLiAgSXQgbWF5IGJlIGhlbHBmdWwgdG8gcHJpbnQgb3V0IGVhY2ggdmFyaWFibGUgYWxvbmcgdGhlIHdheSB0byBiZSBzdXJlIGl0cyB2YWx1ZSBpcyB3aGF0IHlvdSB0aGluayBpdCBzaG91bGQgYmUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3I6XG4gICAgICAgICAgICBcIkEgbmFtZSBlcnJvciBhbG1vc3QgYWx3YXlzIG1lYW5zIHRoYXQgeW91IGhhdmUgdXNlZCBhIHZhcmlhYmxlIGJlZm9yZSBpdCBoYXMgYSB2YWx1ZS4gIE9mdGVuIHRoaXMgbWF5IGJlIGEgc2ltcGxlIHR5cG8sIHNvIGNoZWNrIHRoZSBzcGVsbGluZyBjYXJlZnVsbHkuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVjayB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGFzc2lnbm1lbnQgc3RhdGVtZW50cyBhbmQgeW91ciBmdW5jdGlvbiBjYWxscywgdGhpcyBpcyB0aGUgbW9zdCBsaWtlbHkgcGxhY2UgZm9yIGEgTmFtZUVycm9yIHRvIGJlIGZvdW5kLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcjpcbiAgICAgICAgICAgIFwiQSBWYWx1ZUVycm9yIG1vc3Qgb2Z0ZW4gb2NjdXJzIHdoZW4geW91IHBhc3MgYSBwYXJhbWV0ZXIgdG8gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGlzIGV4cGVjdGluZyBvbmUgdHlwZSBhbmQgeW91IHBhc3MgYW5vdGhlci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUaGUgZXJyb3IgbWVzc2FnZSBnaXZlcyB5b3UgYSBwcmV0dHkgZ29vZCBoaW50IGFib3V0IHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBhcyB3ZWxsIGFzIHRoZSB2YWx1ZSB0aGF0IGlzIGluY29ycmVjdC4gTG9vayBhdCB0aGUgZXJyb3IgbWVzc2FnZSBjbG9zZWx5IGFuZCB0aGVuIHRyYWNlIGJhY2sgdG8gdGhlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHByb2JsZW1hdGljIHZhbHVlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgZXJyb3IgbWVzc2FnZSBpcyB0ZWxsaW5nIHlvdSB0aGF0IHRoZSBvYmplY3Qgb24gdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBkb3QsIGRvZXMgbm90IGhhdmUgdGhlIGF0dHJpYnV0ZSBvciBtZXRob2Qgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVGhlIG1vc3QgY29tbW9uIHZhcmlhbnQgb2YgdGhpcyBtZXNzYWdlIGlzIHRoYXQgdGhlIG9iamVjdCB1bmRlZmluZWQgZG9lcyBub3QgaGF2ZSBhdHRyaWJ1dGUgWC4gIFRoaXMgdGVsbHMgeW91IHRoYXQgdGhlIG9iamVjdCBvbiB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIGRvdCBpcyBub3Qgd2hhdCB5b3UgdGhpbmsuIFRyYWNlIHRoZSB2YXJpYWJsZSBiYWNrIGFuZCBwcmludCBpdCBvdXQgaW4gdmFyaW91cyBwbGFjZXMgdW50aWwgeW91IGRpc2NvdmVyIHdoZXJlIGl0IGJlY29tZXMgdW5kZWZpbmVkLiAgT3RoZXJ3aXNlIGNoZWNrIHRoZSBhdHRyaWJ1dGUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgZG90IGZvciBhIHR5cG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yOlxuICAgICAgICAgICAgXCJNb3N0IG9mIHRoZSB0aW1lIHRoaXMgZXJyb3IgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUgZm9yZ290dGVuIGEgcmlnaHQgcGFyZW50aGVzaXMgb3IgaGF2ZSBmb3Jnb3R0ZW4gdG8gY2xvc2UgYSBwYWlyIG9mIHF1b3Rlcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdG9rZW5fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVjayBlYWNoIGxpbmUgb2YgeW91ciBwcm9ncmFtIGFuZCBtYWtlIHN1cmUgdGhhdCB5b3VyIHBhcmVudGhlc2lzIGFyZSBiYWxhbmNlZC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcjpcbiAgICAgICAgICAgIFwiWW91ciBwcm9ncmFtIGlzIHJ1bm5pbmcgdG9vIGxvbmcuICBNb3N0IHByb2dyYW1zIGluIHRoaXMgYm9vayBzaG91bGQgcnVuIGluIGxlc3MgdGhhbiAxMCBzZWNvbmRzIGVhc2lseS4gVGhpcyBwcm9iYWJseSBpbmRpY2F0ZXMgeW91ciBwcm9ncmFtIGlzIGluIGFuIGluZmluaXRlIGxvb3AuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJBZGQgc29tZSBwcmludCBzdGF0ZW1lbnRzIHRvIGZpZ3VyZSBvdXQgaWYgeW91ciBwcm9ncmFtIGlzIGluIGFuIGluZmludGUgbG9vcC4gIElmIGl0IGlzIG5vdCB5b3UgY2FuIGluY3JlYXNlIHRoZSBydW4gdGltZSB3aXRoIHN5cy5zZXRFeGVjdXRpb25MaW1pdChtc2VjcylcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvcjpcbiAgICAgICAgICAgIFwiWW91ciBwcm9ncmFtIGlzIHJ1bm5pbmcgZm9yIHRvbyBsb25nLiAgTW9zdCBwcm9ncmFtcyBpbiB0aGlzIGJvb2sgc2hvdWxkIHJ1biBpbiBsZXNzIHRoYW4gMzAgc2Vjb25kcyBlYXNpbHkuIFRoaXMgcHJvYmFibHkgaW5kaWNhdGVzIHlvdXIgcHJvZ3JhbSBpcyBpbiBhbiBpbmZpbml0ZSBsb29wLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQWRkIHNvbWUgcHJpbnQgc3RhdGVtZW50cyB0byBmaWd1cmUgb3V0IGlmIHlvdXIgcHJvZ3JhbSBpcyBpbiBhbiBpbmZpbnRlIGxvb3AuICBJZiBpdCBpcyBub3QgeW91IGNhbiBpbmNyZWFzZSB0aGUgcnVuIHRpbWUgd2l0aCBzeXMuc2V0RXhlY3V0aW9uTGltaXQobXNlY3MpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBtZXNzYWdlIGluZGljYXRlcyB0aGF0IFB5dGhvbiBjYW4ndCBmaWd1cmUgb3V0IHRoZSBzeW50YXggb2YgYSBwYXJ0aWN1bGFyIHN0YXRlbWVudC4gIFNvbWUgZXhhbXBsZXMgYXJlIGFzc2lnbmluZyB0byBhIGxpdGVyYWwsIG9yIGEgZnVuY3Rpb24gY2FsbFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVjayB5b3VyIGFzc2lnbm1lbnQgc3RhdGVtZW50cyBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBhc3NpZ25tZW50IGlzIGEgdmFyaWFibGUsIG5vdCBhIGxpdGVyYWwgb3IgYSBmdW5jdGlvbi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIG1lc3NhZ2UgaW5kaWNhdGVzIHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gYWNjZXNzIGFuIGVsZW1lbnQgb2YgYSBkaWN0aW9uYXJ5LCBidXQgdGhlIGRpY3Rpb25hcnkgZG9lcyBub3QgaGF2ZSB0aGF0IHRoZSBrZXkgeW91IGFyZSB1c2luZy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiWW91IG1heSBoYXZlIGEgdHlwbyBpbiB0aGUgbmFtZSBvZiB5b3VyIGtleS4gIEl0IGlzIGFsc28gZ29vZCBwcmFjdGljZSB0byBjaGVjayBpZiB0aGUga2V5IGV4aXN0cyB1c2luZyBhIHN0YXRlbWVudCBsaWtlIGlmIGtleSBpbiBteWRpY3QuICBZb3UgY2FuIGFsc28gdXNlIG15ZGljdC5nZXQoa2V5LGRlZmF1bHR2YWx1ZSkgc28gdGhhdCBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeSB5b3UgZ2V0IHRoZSBkZWZhdWx0IHZhbHVlIGluc3RlYWQgb2YgYW4gZXJyb3IuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIG1lc3NhZ2UgbWVhbnMgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBpbmRleCBwYXN0IHRoZSBlbmQgb2YgYSBzdHJpbmcgb3IgYSBsaXN0LiAgRm9yIGV4YW1wbGUgaWYgeW91ciBsaXN0IGhhcyAzIHRoaW5ncyBpbiBpdCBhbmQgeW91IHRyeSB0byBhY2Nlc3MgdGhlIGl0ZW0gYXQgcG9zaXRpb24gMyBvciBtb3JlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlJlbWVtYmVyIHRoYXQgdGhlIGZpcnN0IGl0ZW0gaW4gYSBsaXN0IG9yIHN0cmluZyBpcyBhdCBpbmRleCBwb3NpdGlvbiAwLCBxdWl0ZSBvZnRlbiB0aGlzIG1lc3NhZ2UgY29tZXMgYWJvdXQgYmVjYXVzZSB5b3UgYXJlIG9mZiBieSBvbmUuICBSZW1lbWJlciBpbiBhIGxpc3Qgb2YgbGVuZ3RoIDMgdGhlIGxhc3QgbGVnYWwgaW5kZXggaXMgMlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV91cmlfZXJyb3I6IFwiXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcl9maXg6IFwiXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBlcnJvciBtZXNzYWdlIGluZGljYXRlcyB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGltcG9ydCBhIG1vZHVsZSB0aGF0IGRvZXMgbm90IGV4aXN0XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIk9uZSBwcm9ibGVtIG1heSBzaW1wbHkgYmUgdGhhdCB5b3UgaGF2ZSBhIHR5cG8uICBJdCBtYXkgYWxzbyBiZSB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGltcG9ydCBhIG1vZHVsZSB0aGF0IGV4aXN0cyBpbiAncmVhbCcgUHl0aG9uLCBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBib29rLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgcGxlYXNlIHN1Ym1pdCBhIGZlYXR1cmUgcmVxdWVzdCB0byBoYXZlIHRoZSBtb2R1bGUgYWRkZWQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBpcyBtb3N0IGxpa2VseSBhbiBpbnRlcm5hbCBlcnJvciwgcGFydGljdWxhcmx5IGlmIHRoZSBtZXNzYWdlIHJlZmVyZW5jZXMgdGhlIGNvbnNvbGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRyeSByZWZyZXNoaW5nIHRoZSB3ZWJwYWdlLCBhbmQgaWYgdGhlIGVycm9yIGNvbnRpbnVlcywgc3VibWl0IGEgYnVnIHJlcG9ydCBhbG9uZyB3aXRoIHlvdXIgY29kZVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIHRlbGxzIHlvdSB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGRpdmlkZSBieSAwLiBUeXBpY2FsbHkgdGhpcyBpcyBiZWNhdXNlIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgaW4gdGhlIGRlbm9taW5hdG9yIG9mIGEgZGl2aXNpb24gZXhwcmVzc2lvbiBoYXMgdGhlIHZhbHVlIDBcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIllvdSBtYXkgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QgZGl2aWRpbmcgYnkgMCB3aXRoIGFuIGlmIHN0YXRtZW50LCBvciB5b3UgbWF5IG5lZWQgdG8gcmV4YW1pbmUgeW91ciBhc3N1bXB0aW9ucyBhYm91dCB0aGUgbGVnYWwgdmFsdWVzIG9mIHZhcmlhYmxlcywgaXQgY291bGQgYmUgYW4gZWFybGllciBzdGF0bWVudCB0aGF0IGlzIHVuZXhwZWN0ZWRseSBhc3NpZ25pbmcgYSB2YWx1ZSBvZiB6ZXJvIHRvIHRoZSB2YXJpYWJsZSBpbiBxdWVzdGlvbi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgbWVzc2FnZSBhbG1vc3QgYWx3YXlzIHNob3dzIHVwIGluIHRoZSBmb3JtIG9mIE1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRoaXMgYWx3YXlzIG9jY3VycyB3aGVuIGEgZnVuY3Rpb24gY2FsbHMgaXRzZWxmLiAgSXRzIHByZXR0eSBsaWtlbHkgdGhhdCB5b3UgYXJlIG5vdCBkb2luZyB0aGlzIG9uIHB1cnBvc2UuIEV4Y2VwdCBpbiB0aGUgY2hhcHRlciBvbiByZWN1cnNpb24uICBJZiB5b3UgYXJlIGluIHRoYXQgY2hhcHRlciB0aGVuIGl0cyBsaWtlbHkgeW91IGhhdmVuJ3QgaWRlbnRpZmllZCBhIGdvb2QgYmFzZSBjYXNlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcjpcbiAgICAgICAgICAgIFwiQW4gSW50ZXJuYWwgZXJyb3IgbWF5IG1lYW4gdGhhdCB5b3UndmUgdHJpZ2dlcmVkIGEgYnVnIGluIG91ciBQeXRob25cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJSZXBvcnQgdGhpcyBlcnJvciwgYWxvbmcgd2l0aCB5b3VyIGNvZGUgYXMgYSBidWcuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIGVycm9yIG9jY3VycyB3aGVuIHlvdSBoYXZlIG5vdCBpbmRlbnRlZCB5b3VyIGNvZGUgcHJvcGVybHkuICBUaGlzIGlzIG1vc3QgbGlrZWx5IHRvIGhhcHBlbiBhcyBwYXJ0IG9mIGFuIGlmLCBmb3IsIHdoaWxlIG9yIGRlZiBzdGF0ZW1lbnQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgeW91ciBpZiwgZGVmLCBmb3IsIGFuZCB3aGlsZSBzdGF0ZW1lbnRzIHRvIGJlIHN1cmUgdGhlIGxpbmVzIGFyZSBwcm9wZXJseSBpbmRlbnRlZCBiZW5lYXRoIHRoZW0uICBBbm90aGVyIHNvdXJjZSBvZiB0aGlzIGVycm9yIGNvbWVzIGZyb20gY29weWluZyBhbmQgcGFzdGluZyBjb2RlIHdoZXJlIHlvdSBoYXZlIGFjY2lkZW50YWxseSBsZWZ0IHNvbWUgYml0cyBvZiBjb2RlIGx5aW5nIGFyb3VuZCB0aGF0IGRvbid0IGJlbG9uZyB0aGVyZSBhbnltb3JlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgZXJyb3Igb2NjdXJzIHdoZW4geW91IHRyeSB0byB1c2UgYSBidWlsdGluIGZ1bmN0aW9uIG9mIFB5dGhvbiB0aGF0IGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCBpbiB0aGlzIGluLWJyb3dzZXIgdmVyc2lvbiBvZiBQeXRob24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkZvciBub3cgdGhlIG9ubHkgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIG5vdCB1c2UgdGhlIGZ1bmN0aW9uLiAgVGhlcmUgbWF5IGJlIHdvcmthcm91bmRzLiAgSWYgeW91IHJlYWxseSBuZWVkIHRoaXMgYnVpbHRpbiBmdW5jdGlvbiB0aGVuIGZpbGUgYSBidWcgcmVwb3J0IGFuZCB0ZWxsIHVzIGhvdyB5b3UgYXJlIHRyeWluZyB0byB1c2UgdGhlIGZ1bmN0aW9uLlwiLFxuXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ZpbGVfbm90X2ZvdW5kOiBcIkZpbGUgbm90IGZvdW5kOiAnJDEnXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vX2ZpbGVfb3JfZGlyOlxuICAgICAgICAgICAgXCJbRXJybm8gMl0gTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeTogJyQxJ1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zdGFydGluZzogXCJDbGljayB0aGUgcGxheSBidXR0b24gdG8gYmVnaW4gdGhlICQxXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BsYXlpbmc6IFwiUGxheWluZyB0aGUgJDFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGluZ19hdWRpbzpcbiAgICAgICAgICAgIFwiTG9hZGluZyBhdWRpby4gIFBsZWFzZSB3YWl0LiAgIElmIHRoZSB0b3VyIGRvZXNuJ3Qgc3RhcnQgc29vbiBjbGljayBvbiB0aGUgbGVmdG1vc3QgY29udHJvbCBidXR0b24gKFBsYXkgZmlyc3QgYXVkaW8gaW4gdG91cilcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGF1c2VfY3VycmVudF9hdWRpbzogXCJQYXVzZSBjdXJyZW50IGF1ZGlvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhdXNlX2F1ZGlvOiBcIlBhdXNlIGF1ZGlvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvOiBcIlBsYXkgcGF1c2VkIGF1ZGlvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F1ZGlvX3BhdXNlZDpcbiAgICAgICAgICAgIFwiVGhlICQxIGhhcyBiZWVuIHBhdXNlZC4gQ2xpY2sgb24gdGhlIHBsYXkgYnV0dG9uIHRvIHJlc3VtZSB0aGUgdG91ci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5wdXRfcHJnOiBcIklucHV0IGZvciBQcm9ncmFtXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3dlcmVfY29tcGlsaW5nX2VycjpcbiAgICAgICAgICAgIFwiVGhlcmUgd2VyZSBlcnJvcnMgY29tcGlsaW5nIHlvdXIgY29kZS4gU2VlIGJlbG93LlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2V4YzogXCJUaW1lIExpbWl0IEV4Y2VlZGVkIG9uIHlvdXIgcHJvZ3JhbVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfZXJyOiBcIkEgc2VydmVyIGVycm9yIG9jY3VycmVkOiAkMSAkMlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9jb21waWxpbmdfcnVubmluZzpcbiAgICAgICAgICAgIFwiQ29tcGlsaW5nIGFuZCBSdW5uaW5nIHlvdXIgQ29kZSBOb3cuLi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2VydmVyX2NvbW1fZXJyOiBcIkVycm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgc2VydmVyLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zYXZlX3J1bjogXCJTYXZlICYgUnVuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlbmRlcjogXCJTYXZlICYgUmVuZGVyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiQW4gYXNzZXJ0aW9uIGVycm9yIGhhcHBlbnMgd2hlbiBweXRob24gZW5jb3VudGVycyBhbiBhc3NlcnRpb24gc3RhdGVtZW50LiAgUHl0aG9uIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiB0byB0aGUgcmlnaHQgb2YgdGhlIHdvcmQgYXNzZXJ0OyBpZiB0aGF0IGV4cHJlc3Npb24gaXMgVHJ1ZSBldmVyeXRoaW5nIGlzIGZpbmUgYW5kIHRoZSBwcm9ncmFtIGNvbnRpbnVlcy4gIElmIHRoZSBleHByZXNzaW9uIGlzIEZhbHNlIFB5dGhvbiByYWlzZXMgYW4gZXJyb3IgYW5kIHN0b3BzLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVjayB0aGUgZXhwcmVzc2lvbiB0byB0aGUgcmlnaHQgb2YgYXNzZXJ0LiAgVGhlIGV4cHJlc3Npb24gaXMgRmFsc2UgYW5kIHlvdSB3aWxsIG5lZWQgdG8gZGV0ZXJtaW5lIHdoeSB0aGF0IGlzLiAgWW91IG1heSB3YW50IHRvIHNpbXBseSBwcmludCBvdXQgdGhlIGluZGl2aWR1YWwgcGFydHMgb2YgdGhlIGV4cHJlc3Npb24gdG8gdW5kZXJzdGFuZCB3aHkgaXQgaXMgZXZhbHVhdGluZyB0byBGYWxzZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZF9kYjogXCJMb2FkaW5nIERCLi4uXCIsXG4gICAgfSxcbn0pO1xuIiwiJC5pMThuKCkubG9hZCh7XG4gICAgXCJwdC1iclwiOiB7XG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfaGlzdG9yeTogXCJDYXJyZWdhciBoaXN0w7NyaWNvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F1ZGlvX3RvdXI6IFwiVG91ciBkZSDDoXVkaW9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGVkX2NvZGU6IFwiQ8OzZGlnbyBzYWx2byBjYXJyZWdhZG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vX3NhdmVkX2NvZGU6IFwiTsOjbyBow6EgY8OzZGlnbyBzYWx2by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcnVuX2NvZGU6IFwiRXhlY3V0YXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19mZWVkYmFjazogXCJFeGliaXIgRmVlZGJhY2tzXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZTogXCJNb3N0cmFyIEPDs2RpZ29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlOiBcIk9jdWx0YXIgQ8OzZGlnb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVsZW5zOiBcIk1vc3RyYXIgQ29kZUxlbnNcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuczogXCJNb3N0cmFyIGVtIENvZGVMZW5zXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZWxlbnM6IFwiT2N1bHRhciBDb2RlbGVuc1wiLFxuXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhcnNlX2Vycm9yOlxuICAgICAgICAgICAgXCJVbSBlcnJvIGRlIFBhcnNlIHNpZ25pZmljYSBxdWUgUHl0aG9uIG7Do28gZW50ZW5kZSBhIHNpbnRheGUgZGEgbGluaGEgcXVlIGEgbWVuc2FnZW0gZGUgZXJybyBhcG9udGEuIEV4ZW1wbG9zIGNvbXVucyBzw6NvIGVzcXVlY2VyIHbDrXJndWxhcyBlbnRyZSBhcmd1bWVudG9zIG91IGVzcXVlY2VyICc6JyBlbSB1bSBjb21hbmRvIGZvci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGFyc2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJQYXJhIGNvcnJpZ2lyIHVtIGVycm8gZGUgUGFyc2UsIHZvY8OqIHPDsyBwcmVjaXNhIG9saGFyIGN1aWRhZG9zYW1lbnRlIGEgbGluaGEgY29tIG8gZXJybyBlIHBvc3NpdmVsbWVudGUgYSBsaW5oYSBhbnRlcyBkZWxhLiBUZW5oYSBjZXJ0ZXphIHF1ZSBlc3TDo28gZGUgYWNvcmRvIGNvbSB0b2RhcyBhcyByZWdyYXMgZGUgUHl0aG9uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yOlxuICAgICAgICAgICAgXCJFcnJvcyBkZSB0aXBhZ2VtIG9jb3JyZW0gbWFpcyBmcmVxdWVudGVtZW50ZSBxdWFuZG8gdW1hIGV4cHJlc3PDo28gdGVudGEgY29tYmluYXIgZG9pcyBvYmpldG9zIGNvbSB0aXBvcyBxdWUgbsOjbyBkZXZlcmlhbSBzZXIgY29tYmluYWRvcy4gQ29tbyBlbGV2YXIgdW1hIFN0cmluZyBhIHVtYSBwb3TDqm5jaWEuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJQYXJhIGNvcnJpZ2lyIHVtIGVycm8gZGUgdGlwYWdlbSB2b2PDqiBwcm92YXZlbG1lbnRlIHByZWNpc2Fyw6EgcGVyY29ycmVyIHNldSBjw7NkaWdvIGUgdGVyIGNlcnRlemEgZGUgcXVlIGFzIHZhcmnDoXZlaXMgcG9zc3VlbSBvcyB0aXBvcyBxdWUgdm9jw6ogZXNwZXJhIHF1ZSBlbGFzIHRlbmhhbS4gUG9kZSBzZXIgw7p0aWwgaW1wcmltaXIgY2FkYSB2YXJpw6F2ZWwgYW8gbG9uZ28gZG8gY2FtaW5obyBwYXJhIGNoZWNhciBzZSBlbGFzIHBvc3N1ZW0gbyB2YWxvciBxdWUgdm9jw6ogYWNoYSBxdWUgZGV2ZXJpYW0gdGVyLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yOlxuICAgICAgICAgICAgXCJVbSBlcnJvIGRlIG5vbWUgcXVhc2Ugc2VtcHJlIHNpZ25pZmljYSBxdWUgdm9jw6ogdXNvdSB1bWEgdmFyacOhdmVsIGFudGVzIGRlbGEgdGVyIHVtIHZhbG9yLiBGcmVxdWVudGVtZW50ZSBpc3NvIHBvZGUgc2VyIHVtIGVycm8gZGUgZGlnaXRhw6fDo28sIGVudMOjbyBjaGVxdWUgYSBvcnRvZ3JhZmlhIGN1aWRhZG9zYW1lbnRlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlcXVlIG8gbGFkbyBkaXJlaXRvIGRhcyBhdHJpYnVpw6fDtWVzIGUgc3VhcyBjaGFtYWRhcyBkZSBmdW7Dp8O1ZXMsIHPDo28gb3MgbHVnYXJlcyBtYWlzIHByb3bDoXZlaXMgZGUgZW5jb250cmFyIHVtIGVycm8gZGUgbm9tZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3I6XG4gICAgICAgICAgICBcIlVtIGVycm8gZGUgdmFsb3Igb2NvcnJlIG1haXMgZnJlcXVlbnRlbWVudGUgcXVhbmRvIHVtYSBmdW7Dp8OjbyBlc3TDoSBlc3BlcmFuZG8gdW0gdGlwbyBtYXMgdm9jw6ogcGFzc2EgdW0gcGFyw6JtZXRybyBkZSBvdXRybyB0aXBvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkEgbWVuc2FnZW0gZGUgZXJybyB0ZSBkw6EgdW1hIGJvYSBkaWNhIHNvYnJlIG8gbm9tZSBkYSBmdW7Dp8OjbyBlIG8gdmFsb3IgaW5jb3JyZXRvLiBMZWlhIGF0ZW50YW1lbnRlIGEgbWVuc2FnZW0gZGUgZXJybyBlIHZvbHRlIMOgIHZhcmnDoXZlbCBxdWUgY29udMOpbSBvIHZhbG9yIHByb2JsZW3DoXRpY28uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcjpcbiAgICAgICAgICAgIFwiRXNzYSBtZW5zYWdlbSBkZSBlcnJvIGVzdMOhIHRlIGRpemVuZG8gcXVlIG8gb2JqZXRvIGRvIGxhZG8gZXNxdWVyZG8gZG8gcG9udG8gbsOjbyB0ZW0gbyBhdHJpYnV0byBvdSBtw6l0b2RvIGRvIHNldSBsYWRvIGRpcmVpdG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkEgdmFyaWFudGUgbWFpcyBjb211bSBkZXNzYSBtZW5zYWdlbSDDqSBxdWUgbyBvYmpldG8gaW5kZWZpbmlkbyBuw6NvIHRlbSBvIGF0cmlidXRvIFguIElzc28gZGl6IHF1ZSBvIG9iamV0byBkbyBsYWRvIGVzcXVlcmRvIGRvIHBvbnRvIG7Do28gw6kgbyBxdWUgdm9jw6ogcGVuc2EuIFJhc3RyZWllIGVzc2EgdmFyacOhdmVsIGUgaW1wcmltYS1hIGVtIHbDoXJpb3MgbHVnYXJlcyBhdMOpIGRlc2NvYnJpciBvbmRlIGVsYSBzZSB0b3JuYSBpbmRlZmluaWRhLiBDYXNvIGNvbnRyw6FyaW8sIGNoZXF1ZSBzZSBow6EgZXJybyBkZSBkaWdpdGHDp8OjbyBubyBhdHJpYnV0byBkbyBsYWRvIGRpcmVpdG8gZG8gcG9udG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yOlxuICAgICAgICAgICAgXCJOYSBtYWlvcmlhIGRhcyB2ZXplcyBlc3RlIGVycm8gaW5kaWNhIHF1ZSB2b2PDqiBlc3F1ZWNldSBkZSBmZWNoYXIgdW0gcGFyw6pudGVzZXMgb3UgYXNwYXMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlcXVlIGNhZGEgbGluaGEgZG8gc2V1IHByb2dyYW1hIGUgY2VydGlmaXF1ZS1zZSBkZSBxdWUgdG9kb3Mgb3MgcGFyw6pudGVzZXMgZXN0w6NvIGZlY2hhZG9zLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yOlxuICAgICAgICAgICAgXCJTZXUgcHJvZ3JhbWEgZXN0w6EgZGVtb3JhbmRvIG11aXRvLiBPcyBwcm9ncmFtYXMgZGVzdGUgbGl2cm8gZGV2ZXJpYW0gcm9kYXIgZW0gbWVub3MgZGUgMTAgc2VndW5kb3MuIElzc28gcHJvdmF2ZWxtZW50ZSBpbmRpY2EgcXVlIHNldSBwcm9ncmFtYSBlc3TDoSBlbSB1bSBsb29wIGluZmluaXRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiSW1wcmltYSBtZW5zYWdlbnMgZW0gYWxndW1hcyBsaW5oYXMgcGFyYSBkZXNjb2JyaXIgc2Ugc2V1IHByb2dyYW1hIGVzdMOhIGVtIHVtIGxvb3AgaW5maW5pdG8uIENhc28gbsOjbyBlc3RlamEsIHZvY8OqIHBvZGUgYXVtZW50YXIgbyB0ZW1wbyBsaW1pdGUgZGUgZXhlY3XDp8OjbyBjb20gbyBjb21hbmRvIHN5cy5zZXRFeGVjdXRpb25MaW1pdChtcylcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvcjpcbiAgICAgICAgICAgIFwiU2V1IHByb2dyYW1hIGVzdMOhIGRlbW9yYW5kbyBtdWl0by4gT3MgcHJvZ3JhbWFzIGRlc3RlIGxpdnJvIGRldmVyaWFtIHJvZGFyIGVtIG1lbm9zIGRlIDMwIHNlZ3VuZG9zLiBJc3NvIHByb3ZhdmVsbWVudGUgaW5kaWNhIHF1ZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkltcHJpbWEgbWVuc2FnZW5zIGVtIGFsZ3VtYXMgbGluaGFzIHBhcmEgZGVzY29icmlyIHNlIHNldSBwcm9ncmFtYSBlc3TDoSBlbSB1bSBsb29wIGluZmluaXRvLiBDYXNvIG7Do28gZXN0ZWphLCB2b2PDqiBwb2RlIGF1bWVudGFyIG8gdGVtcG8gbGltaXRlIGRlIGV4ZWN1w6fDo28gY29tIG8gY29tYW5kbyBzeXMuc2V0RXhlY3V0aW9uTGltaXQobXMpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0YSBtZW5zYWdlbSBpbmRpY2EgcXVlIFB5dGhvbiBuw6NvIGVudGVuZGV1IGEgc2ludGF4ZSBkZSB1bSBjb21hbmRvLiBBbGd1bnMgZXhlbXBsb3Mgc8OjbyBhdHJpYnVpw6fDo28gZGUgdW0gbGl0ZXJhbCwgb3UgdW1hIGNoYW1hZGEgZGUgZnVuw6fDo29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlcXVlIGFzIGF0cmlidWnDp8O1ZXMgZGUgc2V1IHByb2dyYW1hIGUgY2VydGlmaXF1ZS1zZSBkZSBxdWUgbyBsYWRvIGVzcXVlcmRvIMOpIHVtYSB2YXJpw6F2ZWwsIGUgbsOjbyB1bSBsaXRlcmFsIG91IGZ1bsOnw6NvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGEgbWVuc2FnZW0gaW5kaWNhIHF1ZSB2b2PDqiBlc3TDoSB0ZW50YW5kbyBhY2Vzc2FyIHVtIGVsZW1lbnRvIGN1amEgY2hhdmUgbsOjbyBleGlzdGUgbm8gZGljaW9uw6FyaW8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlZvY8OqIHBvZGUgdGVyIHVtIGVycm8gZGUgZGlnaXRhw6fDo28gbm8gbm9tZSBkYSBzdWEgY2hhdmUuIMOJIHVtYSBib2EgcHLDoXRpY2EgY2hlY2FyIHNlIGEgY2hhdmUgZXhpc3RlIHVzYW5kbyB1bSBjb21hbmRvICdpZiAoY2hhdmUpIGluIG1ldV9kaWNpb25hcmlvJy4gVm9jw6ogdGFtYsOpbSBwb2RlIHVzYXIgbyBjb21hbmRvICdtZXVfZGljaW9uYXJpby5nZXQoY2hhdmUsIHZhbG9yUGFkcsOjbyknIHBhcmEgb2J0ZXIgbyB2YWxvciBwYWRyw6NvIGFvIGludsOpcyBkZSB1bSBlcnJvIGNhc28gYSBjaGF2ZSBuw6NvIGV4aXN0YS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3I6XG4gICAgICAgICAgICBcIlZvY8OqIGVzdMOhIHRlbnRhbmRvIGFjZXNzYXIgdW0gw61uZGljZSBhbMOpbSBkbyBmaW5hbCBkZSB1bWEgc3RyaW5nIG91IGxpc3RhLiBQb3IgZXhlbXBsbywgc2Ugc3VhIGxpc3RhIHBvc3N1aSAzIGVsZW1lbnRvcyBuZWxhIGUgdm9jw6ogdGVudGEgYWNlc3NhciBvIGl0ZW0gbmEgcG9zacOnw6NvIDMgb3UgbWFpcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJMZW1icmUtc2UgcXVlIG8gcHJpbWVpcm8gZWxlbWVudG8gZGUgdW1hIGxpc3RhIG91IHN0cmluZyBlc3TDoSBubyDDrW5kaWNlIDAsIG5vcm1hbG1lbnRlIGVzdGEgbWVuc2FnZW0gw6kgZXhpYmlkYSBwb3JxdWUgdm9jw6ogZXJyb3UgbyDDrW5kaWNlIHBvciAxLiBFbSB1bWEgbGlzdGEgZGUgdGFtYW5obyAzLCBvIMO6bHRpbW8gw61uZGljZSB2w6FsaWRvIMOpIDJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yOiBcIlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV91cmlfZXJyb3JfZml4OiBcIlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGEgbWVuc2FnZW0gaW5kaWNhIHF1ZSB2b2PDqiBlc3TDoSB0ZW50YW5kbyBpbXBvcnRhciB1bSBtw7NkdWxvIHF1ZSBuw6NvIGV4aXN0ZVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJVbSBwcm9ibGVtYSBwb2RlIHNlciBhcGVuYXMgdW0gZXJybyBkZSBkaWdpdGHDp8Ojby4gVGFtYsOpbSBwb2RlIHNlciBxdWUgdm9jw6ogZXN0w6EgdGVudGFuZG8gaW1wb3J0YXIgdW0gbcOzZHVsbyBxdWUgZXhpc3RlIGVtIFB5dGhvbiAncmVhbCcsIG1hcyBuw6NvIGV4aXN0ZSBuZXN0ZSBsaXZyby4gU2UgZXN0ZSDDqSBvIGNhc28sIHBvciBmYXZvciBlbnZpZSB1bSBwZWRpZG8gcGFyYSB0ZXIgZXNzZSBtw7NkdWxvIGFkaWNpb25hZG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvcjpcbiAgICAgICAgICAgIFwiSXNzbyBwYXJlY2Ugc2VyIHVtIGVycm8gaW50ZXJubywgZXNwZWNpYWxtZW50ZSBzZSBhIG1lbnNhZ2VtIGZheiByZWZlcsOqbmNpYSBhbyBjb25zb2xlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUZW50ZSBhdHVhbGl6YXIgYSBww6FnaW5hLiBTZSBvIGVycm8gcGVyc2lzdGlyLCBlbnZpZSB1bSByZWxhdMOzcmlvIGRlIGJ1ZyBqdW50byBjb20gc2V1IGPDs2RpZ29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiSXNzbyBkaXogcXVlIHZvY8OqIGVzdMOhIHRlbnRhbmRvIGRpdmlkaXIgcG9yIDAuIE5vcm1hbG1lbnRlIMOpIHBvcnF1ZSBvIHZhbG9yIGRhIHZhcmnDoXZlbCBubyBkZW5vbWluYWRvciBkZSB1bWEgZGl2aXPDo28gdGVtIG8gdmFsb3IgMFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVm9jw6ogcG9kZSBwcm90ZWdlciBjb250cmEgZGl2aWRpciBwb3IgMCBjb20gdW0gY29tYW5kbyAnaWYnLCBvdSB2b2PDqiBwb2RlIHByZWNpc2FyIHJlYXZhbGlhciBzdWFzIHN1cG9zacOnw7VlcyBzb2JyZSBvcyB2YWxvcmVzIGRhcyB2YXJpw6F2ZWlzLCBwb2lzIHVtIGNvbWFuZG8gYW50ZXJpb3IgcG9kZSB0ZXIgaW5lc3BlcmFkYW1lbnRlIGF0cmlidcOtZG8gbyB2YWxvciAwIGEgZXNzYSB2YXJpw6F2ZWwuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIHF1YXNlIHNlbXByZSBhcGFyZWNlIG5hIGZvcm1hIGRlICdUYW1hbmhvIG3DoXhpbW8gZGEgcGlsaGEgZGUgY2hhbWFkYXMgZXhjZWRpZG8nLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIklzc28gc2VtcHJlIG9jb3JyZSBxdWFuZG8gdW1hIGZ1bsOnw6NvIGNoYW1hIGVsYSBtZXNtYS4gUHJvdmF2ZWxtZW50ZSB2b2PDqiBuw6NvIGVzdMOhIGZhemVuZG8gaXNzbyBkZSBwcm9ww7NzaXRvLCBleGNldG8gbm8gY2Fww610dWxvIHNvYnJlIHJlY3Vyc8Ojby4gU2Ugdm9jw6ogZXN0w6EgbmVzc2UgY2Fww610dWxvLCBlbnTDo28gcHJvdmF2ZWxtZW50ZSBhaW5kYSBuw6NvIGlkZW50aWZpY291IHVtIGJvbSBjYXNvIGJhc2UuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yOlxuICAgICAgICAgICAgXCJVbSBlcnJvIGludGVybm8gcG9kZSBzaWduaWZpY2FyIHF1ZSB2b2PDqiBkZXNlbmNhZGVvdSB1bSBidWcgbm8gbm9zc28gUHl0aG9uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUmVwb3J0ZSBlc3RlIGVycm8gY29tbyB1bSBidWcsIGp1bnRhbWVudGUgY29tIHNldSBjw7NkaWdvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RlIGVycm8gb2NvcnJlIHF1YW5kbyB2b2PDqiBuw6NvIGluZGVudG91IHNldSBjw7NkaWdvIGRldmlkYW1lbnRlLiBJc3NvIMOpIG1haXMgcHJvdsOhdmVsIGRlIG9jb3JyZXIgY29tbyBwYXJ0ZSBkZSB1bSBjb21hbmRvIGlmLCBmb3IsIHdoaWxlIG91IGRlZi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVxdWUgc2V1cyBjb21hbmRvcyBpZiwgZGVmLCBmb3IgZSB3aGlsZSBwYXJhIHRlciBjZXJ0ZXphIGRlIHF1ZSBhcyBsaW5oYXMgZXN0w6NvIGRldmlkYW1lbnRlIGluZGVudGFkYXMgYWJhaXhvIGRlbGFzLiBPdXRyYSBmb250ZSBkZXN0ZSBlcnJvIMOpIGNvcGlhciBlIGNvbGFyIGPDs2RpZ28gZW0gcXVlIHZvY8OqIGFjaWRlbnRhbG1lbnRlIGRlaXhvdSByZXN0b3MgZGUgY8OzZGlnbyBxdWUgbsOjbyBwZXJ0ZW5jZW0gbWFpcyBhbGkuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0ZSBlcnJvIG9jb3JyZSBxdWFuZG8gdm9jw6ogdGVudGEgdXNhciB1bWEgZnVuw6fDo28gZW1idXRpZGEgZGUgUHl0aG9uIHF1ZSBuw6NvIGZvaSBpbXBsZW1lbnRhZGEgbmVzdGEgdmVyc8OjbyBicm93c2VyIGRlIFB5dGhvbi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUG9yIGVucXVhbnRvIGEgw7puaWNhIG1hbmVpcmEgZGUgY29uc2VydGFyIGlzc28gw6kgbsOjbyB1c2FuZG8gYSBmdW7Dp8Ojby4gUG9kZW0gaGF2ZXIgc29sdcOnw7VlcyBhbHRlcm5hdGl2YXMuIFNlIHZvY8OqIHJlYWxtZW50ZSBwcmVjaXNhIGRlc3RhIGZ1bsOnw6NvIGVtYnV0aWRhLCBlbnZpZS1ub3MgdW0gcmVsYXTDs3JpbyBkZSBidWcgZSBkaWdhYyBvbW8gZXN0w6EgdGVudGFuZG8gdXNhciBhIGZ1bsOnw6NvLlwiLFxuXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ZpbGVfbm90X2ZvdW5kOiBcIkFycXVpdm8gbsOjbyBlbmNvbnRyYWRvOiAnJDEnXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vX2ZpbGVfb3JfZGlyOlxuICAgICAgICAgICAgXCJbRXJybyBuwrogMl0gQXJxdWl2byBvdSBkaXJldMOzcmlvIGluZXhpc3RlbnRlOiAnJDEnXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N0YXJ0aW5nOiBcIkNsaXF1ZSBubyBib3TDo28gZGUgZXhlY3XDp8OjbyBwYXJhIGNvbWXDp2FyICQxXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BsYXlpbmc6IFwiRXhlY3V0YW5kbyAkMVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkaW5nX2F1ZGlvOlxuICAgICAgICAgICAgXCJDYXJyZWdhbmRvIMOhdWRpby4gUG9yIGZhdm9yLCBlc3BlcmUuIFNlIG8gdG91ciBuw6NvIGNvbWXDp2FyIGxvZ28sIGNsaXF1ZSBlbSAnU3RvcCBUb3VyJyBlIHRlbnRlIG5vdmFtZW50ZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGF1c2VfY3VycmVudF9hdWRpbzogXCJQYXVzYXIgw6F1ZGlvIGF0dWFsXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhdXNlX2F1ZGlvOiBcIlBhdXNhciDDoXVkaW9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGxheV9wYXVzZWRfYXVkaW86IFwiUmVwcm9kdXppciDDoXVkaW8gcGF1c2Fkb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb19wYXVzZWQ6XG4gICAgICAgICAgICBcIiQxIGZvaSBwYXVzYWRvLiBDbGlxdWUgbm8gYm90w6NvIGRlIGV4ZWN1w6fDo28gcGFyYSByZXRvbWFyIG8gdG91ci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5wdXRfcHJnOiBcIkVudHJhZGEgcGFyYSBvIHByb2dyYW1hXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3dlcmVfY29tcGlsaW5nX2VycjpcbiAgICAgICAgICAgIFwiSG91dmVyYW0gZXJyb3MgYW8gY29tcGlsYXIgc2V1IGPDs2RpZ28uIFZlamEgYWJhaXhvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2V4YzogXCJMaW1pdGUgZGUgdGVtcG8gZXhjZWRpZG8gbm8gc2V1IHByb2dyYW1hXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NlcnZlcl9lcnI6IFwiVW0gZXJybyBkZSBzZXJ2aWRvciBvY29ycmV1OiAkMSAkMlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9jb21waWxpbmdfcnVubmluZzpcbiAgICAgICAgICAgIFwiQ29tcGlsYW5kbyBlIGV4ZWN1dGFuZG8gc2V1IGPDs2RpZ28uLi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2VydmVyX2NvbW1fZXJyOiBcIkVycm8gYW8gY29tdW5pY2FyIGNvbSBvIHNlcnZpZG9yLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zYXZlX3J1bjogXCJTYWx2YXIgJiBFeGVjdXRhclwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZW5kZXI6IFwiU2FsdmFyICYgUmVuZGVyaXphclwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3I6XG4gICAgICAgICAgICBcIlVtIGVycm8gZGUgYXNzZXLDp8OjbyBvY29ycmUgcXVhbmRvIHB5dGhvbiBlbmNvbnRyYSB1bSBjb21hbmRvICdhc3NlcnQnLiBQeXRob24gYXZhbGlhIGEgZXhwcmVzc8OjbyBkbyBsYWRvIGRpcmVpdG87IHNlIMOpIHZlcmRhZGVpcmEsIG8gcHJvZ3JhbWEgY29udGludWEgbm9ybWFsbWVudGUuIFNlIMOpIGZhbHNhLCBweXRob24gZ2VyYSB1bSBlcnJvIGUgcGFyYSBhIGV4ZWN1w6fDo28uXCIgLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVxdWUgYSBleHByZXNzw6NvIGRvIGxhZG8gZGlyZWl0byBkZSAnYXNzZXJ0Jy4gRXNzYSBleHByZXNzw6NvIMOpIGZhbHNhIGUgw6kgcHJlY2lzbyB2ZXJpZmljYXIgbyBtb3Rpdm8uIFZvY8OqIHBvZGUgcXVlcmVyIGltcHJpbWlyIGNhZGEgcGFydGUgZGEgZXhwcmVzc8OjbyBlIGVudGVuZGVyIHBvcnF1ZSDDqSBmYWxzYS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZF9kYjogXCJDYXJyZWdhbmRvIGJhbmNvIGRlIGRhZG9zLi4uXCIsXG4gICAgfSxcbn0pO1xuIiwiJC5pMThuKCkubG9hZCh7XG4gICAgXCJzci1DeXJsXCI6IHtcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZF9oaXN0b3J5OiBcItCj0YfQuNGC0LDRmCDQuNGB0YLQvtGA0LjRmNGDXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F1ZGlvX3RvdXI6IFwi0JDRg9C00LjQviDRgtGD0YDQsFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkZWRfY29kZTogXCLQktCw0Ygg0LjQt9Cy0L7RgNC90Lgg0LrQvtC0INGY0LUg0YPRh9C40YLQsNC9LlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19zYXZlZF9jb2RlOiBcItCd0LUg0L/QvtGB0YLQvtGY0Lgg0YHQvdC40LzRmdC10L0g0LrQvtC0LlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ydW5fY29kZTogXCLQn9C+0LrRgNC10L3QuCDQv9GA0L7Qs9GA0LDQvFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2ZlZWRiYWNrOiBcItCf0YDQuNC60LDQttC4INGA0LXQt9GD0LvRgtCw0YJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlOiBcItCf0YDQuNC60LDQttC4INC60L7QtFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGU6IFwi0JfQsNGC0LLQvtGA0Lgg0LrQvtC0XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZWxlbnM6IFwi0JrQvtGA0LDQuiDQv9C+INC60L7RgNCw0LpcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuczogXCLQmtC+0YDQsNC6INC/0L4g0LrQvtGA0LDQulwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zOiBcItCX0LDRgtCy0L7RgNC4INC60L7RgNCw0Log0L/QviDQutC+0YDQsNC6XCIsXG5cbiAgICAgICAgbXNnX3NjdGl2ZWNvZGVfcGFyc2VfZXJyb3I6XG4gICAgICAgICAgICBcItCh0LjQvdGC0LDQutGB0L3QsCDQs9GA0LXRiNC60LAgKHBhcnNlIGVycm9yKSDQt9C90LDRh9C4INC00LAg0J/QsNGY0YLQvtC9INC90LUg0YDQsNC30YPQvNC1INGB0LjQvdGC0LDQutGB0YMg0YMg0LvQuNC90LjRmNC4INC60L7Qs9CwINC90LAg0LrQvtGY0YMg0L/QvtGA0YPQutCwINC+INCz0YDQtdGI0YbQuCDRg9C60LDQt9GD0ZjQtS4g0KLQuNC/0LjRh9C90Lgg0L/RgNC40LzQtdGA0Lgg0L7QstCw0LrQstC1INCz0YDQtdGI0LrQtSDRgdGDINC30LDQsdC+0YDQsNCy0LvRmNC10L3QsCDQtNCy0L7RgtCw0YfQutCwINC60L7QtCAnaWYnINC40LvQuCAnZm9yJyDQuNGB0LrQsNC30LAg0LjQu9C4INC30LDQsdC+0YDQsNCy0ZnQtdC90LAg0LfQsNC/0LXRgtCwINC40LfQvNC10ZLRgyDQsNGA0LPRg9C80LXQvdCw0YLQsCDQutC+0LQg0L/QvtC30LjQstCwINGE0YPQvdC60YbQuNGY0LVcIixcbiAgICAgICAgbXNnX3NjdGl2ZWNvZGVfcGFyc2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCLQlNCwINCx0LjRgdGC0LUg0LjRgdC/0YDQsNCy0LjQu9C4INGB0LjQvdGC0LDQutGB0L3RgyDQs9GA0LXRiNC60YMg0YLRgNC10LHQsCDQv9Cw0LbRmtC40LLQviDQtNCwINC/0L7Qs9C70LXQtNCw0YLQtSDQu9C40L3QuNGY0YMg0LjQt9Cy0L7RgNC90L7QsyDQutC+0LTQsCDQvdCwINC60L7RmNGDINGD0LrQsNC30YPRmNC1INC/0L7RgNGD0LPQsCDQviDQs9GA0LXRiNGG0Lgg0Lgg0LzQvtC20LTQsCDQv9GA0LXRgtGF0L7QtNC90YMg0LvQuNC90LjQvdGDINC40LfQstC+0YDQvdC+0LMg0LrQvtC00LAuINCf0YDQvtCy0LXRgNC40YLQtSDQtNCwINC70Lgg0YHRgyDQv9C+0YjRgtC+0LLQsNC90LAg0YHQstCwINGB0LjQvdGC0LDQutGB0L3QsCDQv9GA0LDQstC40LvQsCDQn9Cw0ZjRgtC+0L3QsC5cIixcbiAgICB9LFxufSk7XG4iLCIvKipcbiAqXG4gKiBDcmVhdGVkIGJ5IGJtaWxsZXIgb24gMy8xOS8xNS5cbiAqL1xuLyogRGVmaW5lIGdsb2JhbCB2YXJpYWJsZXMgZm9yIEVTTGludCAqL1xuLyogZ2xvYmFsIFNrICovXG5cblwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2UuanNcIjtcbmltcG9ydCBBdWRpb1RvdXIgZnJvbSBcIi4vYXVkaW90b3VyLmpzXCI7XG5pbXBvcnQgXCIuL2FjdGl2ZWNvZGUtaTE4bi5lbi5qc1wiO1xuaW1wb3J0IFwiLi9hY3RpdmVjb2RlLWkxOG4ucHQtYnIuanNcIjtcbmltcG9ydCBcIi4vYWN0aXZlY29kZS1pMThuLnNyLUN5cmwuanNcIjtcbmltcG9ydCBDb2RlTWlycm9yIGZyb20gXCJjb2RlbWlycm9yXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvcHl0aG9uL3B5dGhvbi5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL2Nzcy9jc3MuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUveG1sL3htbC5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL3NxbC9zcWwuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9jbGlrZS9jbGlrZS5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL29jdGF2ZS9vY3RhdmUuanNcIjtcbmltcG9ydCBcIi4vLi4vY3NzL2FjdGl2ZWNvZGUuY3NzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL2xpYi9jb2RlbWlycm9yLmNzc1wiO1xuaW1wb3J0IFwiLi9za3VscHQubWluLmpzXCI7XG5pbXBvcnQgXCIuL3NrdWxwdC1zdGRsaWIuanNcIjtcbi8vIFVzZWQgYnkgU2t1bHB0LlxuaW1wb3J0IGVtYmVkIGZyb20gXCJ2ZWdhLWVtYmVkXCI7XG4vLyBBZGFwdCBmb3IgdXNlIG91dHNpZGUgd2VicGFjayAtLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1lbWJlZC5cbndpbmRvdy52ZWdhRW1iZWQgPSBlbWJlZDtcblxudmFyIGlzTW91c2VEb3duID0gZmFsc2U7XG5kb2N1bWVudC5vbm1vdXNlZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICBpc01vdXNlRG93biA9IHRydWU7XG59O1xuXG5kb2N1bWVudC5vbm1vdXNldXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgaXNNb3VzZURvd24gPSBmYWxzZTtcbn07XG53aW5kb3cuZWRMaXN0ID0ge307XG5cbnZhciBzb2NrZXQsIGNvbm5lY3Rpb24sIGRvYztcbnZhciBjaGF0Y29kZXNTZXJ2ZXIgPSBcImNoYXQuY29kZXNcIjtcblxuLy8gc2VwYXJhdGUgaW50byBjb25zdHJ1Y3RvciBhbmQgaW5pdFxuZXhwb3J0IGNsYXNzIEFjdGl2ZUNvZGUgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB2YXIgc3VmZlN0YXJ0O1xuICAgICAgICB2YXIgb3JpZyA9ICQob3B0cy5vcmlnKS5maW5kKFwidGV4dGFyZWFcIilbMF07XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2ID0gb3B0cy5vcmlnO1xuICAgICAgICB0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzID0gb3B0cy51c2VSdW5lc3RvbmVTZXJ2aWNlcztcbiAgICAgICAgdGhpcy5weXRob24zID0gb3B0cy5weXRob24zO1xuICAgICAgICB0aGlzLmFsaWduVmVydGljYWwgPSBvcHRzLnZlcnRpY2FsO1xuICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZztcbiAgICAgICAgdGhpcy5vcmlnVGV4dCA9IHRoaXMub3JpZ0VsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgIHRoaXMuZGl2aWQgPSBvcHRzLm9yaWcuaWQ7XG4gICAgICAgIHRoaXMuY29kZSA9ICQob3JpZykudGV4dCgpIHx8IFwiXFxuXFxuXFxuXFxuXFxuXCI7XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSAkKG9yaWcpLmRhdGEoXCJsYW5nXCIpO1xuICAgICAgICB0aGlzLnRpbWVsaW1pdCA9ICQob3JpZykuZGF0YShcInRpbWVsaW1pdFwiKTtcbiAgICAgICAgdGhpcy5pbmNsdWRlcyA9ICQob3JpZykuZGF0YShcImluY2x1ZGVcIik7XG4gICAgICAgIHRoaXMuaGlkZWNvZGUgPSAkKG9yaWcpLmRhdGEoXCJoaWRlY29kZVwiKTtcbiAgICAgICAgdGhpcy5jaGF0Y29kZXMgPSAkKG9yaWcpLmRhdGEoXCJjaGF0Y29kZXNcIik7XG4gICAgICAgIHRoaXMuaGlkZWhpc3RvcnkgPSAkKG9yaWcpLmRhdGEoXCJoaWRlaGlzdG9yeVwiKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9ICQob3B0cy5vcmlnKS5maW5kKGAjJHt0aGlzLmRpdmlkfV9xdWVzdGlvbmApWzBdO1xuICAgICAgICB0aGlzLnRpZSA9ICQob3JpZykuZGF0YShcInRpZVwiKTtcbiAgICAgICAgdGhpcy5kYnVybCA9ICQob3JpZykuZGF0YShcImRidXJsXCIpO1xuICAgICAgICB0aGlzLnB5dGhvbjNfaW50ZXJwcmV0ZXIgPSAkKG9yaWcpLmRhdGEoXCJweXRob24zX2ludGVycHJldGVyXCIpO1xuICAgICAgICB0aGlzLm91dHB1dF9oZWlnaHQgPSAkKG9yaWcpLmRhdGEoXCJvdXRwdXRfaGVpZ2h0XCIpO1xuICAgICAgICB0aGlzLnJ1bkJ1dHRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuZW5hYmxlZG93bmxvYWQgPSAkKG9yaWcpLmRhdGEoXCJlbmFibGVkb3dubG9hZFwiKTtcbiAgICAgICAgdGhpcy5kb3dubG9hZEJ1dHRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzZXRCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLnNhdmVCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLmxvYWRCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLm91dGVyRGl2ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYXJ0bmVyID0gXCJcIjtcbiAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFlQm9va0NvbmZpZy5hbGxvd19wYWlycyB8fCAkKG9yaWcpLmRhdGEoXCJub3BhaXJcIikpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUGFydG5lciA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVQYXJ0bmVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIGNyZWF0ZSBwcmUgZm9yIG91dHB1dFxuICAgICAgICB0aGlzLmdyYXBoaWNzID0gbnVsbDsgLy8gY3JlYXRlIGRpdiBmb3IgdHVydGxlIGdyYXBoaWNzXG4gICAgICAgIHRoaXMuY29kZWNvYWNoID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb2RlbGVucyA9IG51bGw7XG4gICAgICAgIHRoaXMuY29udHJvbERpdiA9IG51bGw7XG4gICAgICAgIHRoaXMuaGlzdG9yeVNjcnViYmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy50aW1lc3RhbXBzID0gW1wiT3JpZ2luYWxcIl07XG4gICAgICAgIHRoaXMuYXV0b3J1biA9ICQob3JpZykuZGF0YShcImF1dG9ydW5cIik7XG4gICAgICAgIGlmICh0aGlzLmNoYXRjb2RlcyAmJiBlQm9va0NvbmZpZy5lbmFibGVfY2hhdGNvZGVzKSB7XG4gICAgICAgICAgICBpZiAoIXNvY2tldCkge1xuICAgICAgICAgICAgICAgIHNvY2tldCA9IG5ldyBXZWJTb2NrZXQoXCJ3c3M6Ly9cIiArIGNoYXRjb2Rlc1NlcnZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gbmV3IHdpbmRvdy5zaGFyZWRiLkNvbm5lY3Rpb24oc29ja2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICAgICAgZG9jID0gY29ubmVjdGlvbi5nZXQoXCJjaGF0Y29kZXNcIiwgXCJjaGFubmVsc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUgfHwgdGhpcy5pc1RpbWVkKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVjb2RlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5jbHVkZXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5jbHVkZXMgPSB0aGlzLmluY2x1ZGVzLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZWZpeEVuZCA9IHRoaXMuY29kZS5pbmRleE9mKFwiXl5eXlwiKTtcbiAgICAgICAgaWYgKHByZWZpeEVuZCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnByZWZpeCA9IHRoaXMuY29kZS5zdWJzdHJpbmcoMCwgcHJlZml4RW5kKTtcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IHRoaXMuY29kZS5zdWJzdHJpbmcocHJlZml4RW5kICsgNSk7XG4gICAgICAgIH1cbiAgICAgICAgc3VmZlN0YXJ0ID0gdGhpcy5jb2RlLmluZGV4T2YoXCI9PT09XCIpO1xuICAgICAgICBpZiAoc3VmZlN0YXJ0ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuc3VmZml4ID0gdGhpcy5jb2RlLnN1YnN0cmluZyhzdWZmU3RhcnQgKyA1KTtcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IHRoaXMuY29kZS5zdWJzdHJpbmcoMCwgc3VmZlN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpc3RvcnkgPSBbdGhpcy5jb2RlXTtcbiAgICAgICAgdGhpcy5jcmVhdGVFZGl0b3IoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVDb250cm9scygpO1xuICAgICAgICBpZiAoJChvcmlnKS5kYXRhKFwiY2FwdGlvblwiKSkge1xuICAgICAgICAgICAgdGhpcy5jYXB0aW9uID0gJChvcmlnKS5kYXRhKFwiY2FwdGlvblwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FwdGlvbiA9IFwiQWN0aXZlQ29kZVwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkQ2FwdGlvbihcInJ1bmVzdG9uZVwiKTtcbiAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5yZWZyZXNoKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgICAgICAxMDAwXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmF1dG9ydW4pIHtcbiAgICAgICAgICAgIC8vIFNpbXVsYXRlIHByZXNzaW5nIHRoZSBydW4gYnV0dG9uLCBzaW5jZSB0aGlzIHdpbGwgYWxzbyBwcmV2ZW50IHRoZSB1c2VyIGZyb20gY2xpY2tpbmcgaXQgdW50aWwgdGhlIGluaXRpYWwgcnVuIGlzIGNvbXBsZXRlLCBhbmQgYWxzbyBoZWxwIHRoZSB1c2VyIHVuZGVyc3RhbmQgd2h5IHRoZXkncmUgd2FpdGluZy5cbiAgICAgICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KHRoaXMucnVuQnV0dG9uSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeSgpO1xuICAgIH1cblxuICAgIGNyZWF0ZUVkaXRvcihpbmRleCkge1xuICAgICAgICB0aGlzLm91dGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIGxpbmtkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBsaW5rZGl2LmlkID0gdGhpcy5kaXZpZC5yZXBsYWNlKC9fL2csIFwiLVwiKS50b0xvd2VyQ2FzZSgpOyAvLyA6cmVmOiBjaGFuZ2VzIF8gdG8gLSBzbyBhZGQgdGhpcyBhcyBhIHRhcmdldFxuICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLmFkZENsYXNzKFwiYWNfc2VjdGlvbiBhbGVydCBhbGVydC13YXJuaW5nXCIpO1xuICAgICAgICB2YXIgY29kZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoY29kZURpdikuYWRkQ2xhc3MoXCJhY19jb2RlX2RpdiBjb2wtbWQtMTJcIik7XG4gICAgICAgIHRoaXMuY29kZURpdiA9IGNvZGVEaXY7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYubGFuZyA9IHRoaXMubGFuZ3VhZ2U7XG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5vdXRlckRpdik7XG4gICAgICAgIGlmIChsaW5rZGl2LmlkICE9PSB0aGlzLmRpdmlkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB3YW50IHRoZSAnZXh0cmEnIHRhcmdldCBpZiB0aGV5IG1hdGNoLlxuICAgICAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsaW5rZGl2KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNvZGVEaXYpO1xuICAgICAgICB2YXIgZWRtb2RlID0gdGhpcy5vdXRlckRpdi5sYW5nO1xuICAgICAgICBpZiAoZWRtb2RlID09PSBcInNxbFwiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1zcWxcIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwiamF2YVwiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1qYXZhXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcImNwcFwiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1jKytzcmNcIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwiY1wiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1jc3JjXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcInB5dGhvbjNcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJweXRob25cIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwib2N0YXZlXCIgfHwgZWRtb2RlID09PSBcIk1BVExBQlwiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1vY3RhdmVcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZGl2aWQpICE9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5jb2RlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5kaXZpZCk7XG5cbiAgICAgICAgdmFyIG9wdHMgPSB7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXG4gICAgICAgICAgICBtb2RlOiBlZG1vZGUsXG4gICAgICAgICAgICBpbmRlbnRVbml0OiA0LFxuICAgICAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9NYXRjaFBhcmVuczogdHJ1ZSxcbiAgICAgICAgICAgIGV4dHJhS2V5czoge1xuICAgICAgICAgICAgICAgIFRhYjogXCJpbmRlbnRNb3JlXCIsXG4gICAgICAgICAgICAgICAgXCJTaGlmdC1UYWJcIjogXCJpbmRlbnRMZXNzXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yKGNvZGVEaXYsb3B0cyApO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFrZSB0aGUgZWRpdG9yIHJlc2l6YWJsZVxuICAgICAgICAkKGVkaXRvci5nZXRXcmFwcGVyRWxlbWVudCgpKS5yZXNpemFibGUoe1xuICAgICAgICAgICAgcmVzaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZWRpdG9yLnNldFNpemUoJCh0aGlzKS53aWR0aCgpLCAkKHRoaXMpLmhlaWdodCgpKTtcbiAgICAgICAgICAgICAgICBlZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGdpdmUgdGhlIHVzZXIgYSB2aXN1YWwgY3VlIHRoYXQgdGhleSBoYXZlIGNoYW5nZWQgYnV0IG5vdCBzYXZlZFxuICAgICAgICBlZGl0b3Iub24oXG4gICAgICAgICAgICBcImNoYW5nZVwiLFxuICAgICAgICAgICAgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuYWNFZGl0RXZlbnQgPT0gZmFsc2UgfHxcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmFjRWRpdEV2ZW50ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50cyBjYW4gY29tZSBiZWZvcmUgYW55IHJlYWwgY2hhbmdlcyBmb3IgdmFyaW91cyByZWFzb25zLCBzb21lIHVua25vd25cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhdm9pZHMgdW5uZWNjc2FyeSBsb2cgZXZlbnRzIGFuZCB1cGRhdGVzIHRvIHRoZSBhY3Rpdml0eSBjb3VudGVyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9yaWdUZXh0ID09PSBlZGl0b3IuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICQoZWRpdG9yLmdldFdyYXBwZXJFbGVtZW50KCkpLmNzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLXRvcFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIycHggc29saWQgI2I0MzIzMlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICQoZWRpdG9yLmdldFdyYXBwZXJFbGVtZW50KCkpLmNzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLWJvdHRvbVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIycHggc29saWQgI2I0MzIzMlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBbnN3ZXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcImFjdGl2ZWNvZGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdDogXCJlZGl0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlZGl0b3IuYWNFZGl0RXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7IC8vIHVzZSBiaW5kIHRvIHByZXNlcnZlICp0aGlzKiBpbnNpZGUgdGhlIG9uIGhhbmRsZXIuXG4gICAgICAgIC8vU29sdmluZyBLZXlib2FyZCBUcmFwIG9mIEFjdGl2ZUNvZGU6IElmIHVzZXIgdXNlIHRhYiBmb3IgbmF2aWdhdGlvbiBvdXRzaWRlIG9mIEFjdGl2ZUNvZGUsIHRoZW4gY2hhbmdlIHRhYiBiZWhhdmlvciBpbiBBY3RpdmVDb2RlIHRvIGVuYWJsZSB0YWIgdXNlciB0byB0YWIgb3V0IG9mIHRoZSB0ZXh0YXJlYVxuICAgICAgICAkKHdpbmRvdykua2V5ZG93bihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyIGNvZGUgPSBlLmtleUNvZGUgPyBlLmtleUNvZGUgOiBlLndoaWNoO1xuICAgICAgICAgICAgaWYgKGNvZGUgPT0gOSAmJiAkKFwidGV4dGFyZWE6Zm9jdXNcIikubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZWRpdG9yLnNldE9wdGlvbihcImV4dHJhS2V5c1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIFRhYjogZnVuY3Rpb24gKGNtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoXCIudGFiLWNvbnRlbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dFNpYmxpbmcuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCJTaGlmdC1UYWJcIjogZnVuY3Rpb24gKGNtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoXCIudGFiLWNvbnRlbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJldmlvdXNTaWJsaW5nLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjtcbiAgICAgICAgaWYgKHRoaXMuaGlkZWNvZGUpIHtcbiAgICAgICAgICAgICQodGhpcy5jb2RlRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJ1bkJ1dHRvbkhhbmRsZXIoKSB7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIHJ1biBidXR0b24gdW50aWwgdGhlIHJ1biBpcyBmaW5pc2hlZC4gICAgXG4gICAgICAgIHRoaXMucnVuQnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuUHJvZygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgdGhlcmUgd2FzIGFuIGVycm9yICR7ZX0gcnVubmluZyB0aGUgY29kZWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxvZ1Jlc3VsdHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nQ3VycmVudEFuc3dlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyRmVlZGJhY2soKTtcbiAgICAgICAgLy8gVGhlIHJ1biBpcyBmaW5pc2hlZDsgcmUtZW5hYmxlIHRoZSBidXR0b24uXG4gICAgICAgIHRoaXMucnVuQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY3JlYXRlQ29udHJvbHMoKSB7XG4gICAgICAgIHZhciBjdHJsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIGJ1dHQ7XG4gICAgICAgICQoY3RybERpdikuYWRkQ2xhc3MoXCJhY19hY3Rpb25zXCIpO1xuICAgICAgICAkKGN0cmxEaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xuICAgICAgICAvLyBSdW5cbiAgICAgICAgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9ydW5fY29kZVwiKSk7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gYnRuLXN1Y2Nlc3MgcnVuLWJ1dHRvblwiKTtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgdGhpcy5ydW5CdXR0b24gPSBidXR0O1xuICAgICAgICBjb25zb2xlLmxvZyhcImFkZGluZyBjbGljayBmdW5jdGlvbiBmb3IgcnVuXCIpO1xuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrID0gdGhpcy5ydW5CdXR0b25IYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG5cbiAgICAgICAgdGhpcy5hZGRSZXNldEJ1dHRvbihjdHJsRGl2KTtcblxuICAgICAgICBpZiAodGhpcy5lbmFibGVkb3dubG9hZCB8fCBlQm9va0NvbmZpZy5kb3dubG9hZHNFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZERvd25sb2FkQnV0dG9uKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5oaWRlY29kZSAmJiAhdGhpcy5oaWRlaGlzdG9yeSkge1xuICAgICAgICAgICAgdGhpcy5hZGRIaXN0b3J5QnV0dG9uKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJncmFkZWJ1dHRvblwiKSAmJiAhdGhpcy5ncmFkZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmVlZGJhY2tCdXR0b24oY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2hvdy9IaWRlIENvZGVcbiAgICAgICAgaWYgKHRoaXMuaGlkZWNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlSGlkZVNob3coY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29kZUxlbnNcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcImNvZGVsZW5zXCIpICYmICF0aGlzLmdyYWRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVDb2RlTGVucyhjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBdWRpbyBUb3VyXG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJhdWRpb1wiKSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVBdWRpb1RvdXJzKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlQm9va0NvbmZpZy5pc0luc3RydWN0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlSW5zdHJ1Y3RvclNoYXJpbmcoY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlUGFydG5lcikge1xuICAgICAgICAgICAgdGhpcy5zZXR1cFBhcnRuZXIoY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2hhdGNvZGVzICYmIGVCb29rQ29uZmlnLmVuYWJsZV9jaGF0Y29kZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlQ2hhdENvZGVzKGN0cmxEaXYpO1xuICAgICAgICB9XG5cbiAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5wcmVwZW5kKGN0cmxEaXYpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbikge1xuICAgICAgICAgICAgaWYgKCQodGhpcy5xdWVzdGlvbikuaHRtbCgpLm1hdGNoKC9eXFxzKyQvKSkge1xuICAgICAgICAgICAgICAgICQodGhpcy5xdWVzdGlvbikucmVtb3ZlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQodGhpcy5vdXRlckRpdikucHJlcGVuZCh0aGlzLnF1ZXN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRyb2xEaXYgPSBjdHJsRGl2O1xuICAgIH1cblxuICAgIGFkZEZlZWRiYWNrQnV0dG9uKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfZmVlZGJhY2tcIikpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5ncmFkZUJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5jcmVhdGVHcmFkZVN1bW1hcnkuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgYWRkSGlzdG9yeUJ1dHRvbihjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2xvYWRfaGlzdG9yeVwiKSk7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgIHRoaXMuaGlzdEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5hZGRIaXN0b3J5U2NydWJiZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIGlmICh0aGlzLmdyYWRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRIaXN0b3J5U2NydWJiZXIodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGREb3dubG9hZEJ1dHRvbihjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KFwiRG93bmxvYWRcIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gc2F2ZS1idXR0b25cIik7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgIHRoaXMuZG93bmxvYWRCdXR0b24gPSBidXR0O1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMuZG93bmxvYWRGaWxlLmJpbmQodGhpcywgdGhpcy5sYW5ndWFnZSkpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgIH1cblxuICAgIGFkZFJlc2V0QnV0dG9uKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoXCJSZXNldFwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgdGhpcy5yZXNldEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5yZXNldENvZGUuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgZW5hYmxlSGlkZVNob3coY3RybERpdikge1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZVwiKSk7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnNob3dIaWRlQnV0dCA9IGJ1dHQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgICQoYnV0dCkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmNvZGVEaXYpLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIucGFyZW50RWxlbWVudCkudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnNob3dIaWRlQnV0dCkudGV4dCgpID09XG4gICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZVwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuc2hvd0hpZGVCdXR0KS50ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlXCIpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnNob3dIaWRlQnV0dCkudGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZVwiKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBlbmFibGVDb2RlTGVucyhjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVsZW5zXCIpKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgIHRoaXMuY2xCdXR0b24gPSBidXR0O1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMuc2hvd0NvZGVsZW5zLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGVuYWJsZUF1ZGlvVG91cnMoY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJhY19vcHQgYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXVkaW9fdG91clwiKSk7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICB0aGlzLmF0QnV0dG9uID0gYnV0dDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgJChidXR0KS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBuZXcgQXVkaW9Ub3VyKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5vcmlnRWxlbSkuZGF0YShcImF1ZGlvXCIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGVuYWJsZUluc3RydWN0b3JTaGFyaW5nKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIGJ0bi1pbmZvXCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoXCJTaGFyZSBDb2RlXCIpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgdGhpcy5zaGFyZUJ1dHQgPSBidXR0O1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKFxuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIWNvbmZpcm0oXG4gICAgICAgICAgICAgICAgICAgICAgICBcIllvdSBhcmUgYWJvdXQgdG8gc2hhcmUgdGhpcyBjb2RlIHdpdGggQUxMIG9mIHlvdXIgc3R1ZGVudHMuICBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/XCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICBkaXZpZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgbGFuZzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoXG4gICAgICAgICAgICAgICAgICAgIGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcImJyb2FkY2FzdF9jb2RlLmpzb25cIixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbGV0IHBvc3RfcHJvbWlzZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIGxldCBzdGF0dXMgPSBhd2FpdCBwb3N0X3Byb21pc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMubWVzcyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoYFNoYXJlZCBDb2RlIHdpdGggJHtzdGF0dXMuc2hhcmVfY291bnR9IHN0dWRlbnRzYCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoXCJTaGFyaW5nIEZhaWxlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZXR1cFBhcnRuZXIoY3RybERpdikge1xuICAgICAgICB2YXIgY2hlY2tQYXJ0bmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBjaGVja1BhcnRuZXIudHlwZSA9IFwiY2hlY2tib3hcIjtcbiAgICAgICAgY2hlY2tQYXJ0bmVyLmlkID0gYCR7dGhpcy5kaXZpZH1fcGFydGA7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoY2hlY2tQYXJ0bmVyKTtcbiAgICAgICAgdmFyIHBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgcGxhYmVsLmZvciA9IGAke3RoaXMuZGl2aWR9X3BhcnRgO1xuICAgICAgICAkKHBsYWJlbCkudGV4dChcIlBhaXI/XCIpO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKHBsYWJlbCk7XG4gICAgICAgICQoY2hlY2tQYXJ0bmVyKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJ0bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFydG5lciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAkKHBhcnRuZXJUZXh0Qm94KS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFydG5lciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRuZXJUZXh0Qm94LnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgJChwbGFiZWwpLnRleHQoXCJQYWlyP1wiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlkQWdyZWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnRuZXJBZ3JlZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWRBZ3JlZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlkQWdyZWUgPSBjb25maXJtKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiUGFpciBQcm9ncmFtbWluZyBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggdGhlIGNvbnNlbnQgb2YgeW91ciBpbnN0cnVjdG9yLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJZb3VyIHBhcnRuZXIgbXVzdCBiZSBhIHJlZ2lzdGVyZWQgbWVtYmVyIG9mIHRoZSBjbGFzcyBhbmQgaGF2ZSBhZ3JlZWQgdG8gcGFpciB3aXRoIHlvdS5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQnkgY2xpY2tpbmcgT0sgeW91IGNlcnRpZnkgdGhhdCBib3RoIG9mIHRoZXNlIGNvbmRpdGlvbnMgaGF2ZSBiZWVuIG1ldC5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWRBZ3JlZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwicGFydG5lckFncmVlXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFydG5lciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICQocGxhYmVsKS50ZXh0KFwid2l0aDogXCIpO1xuICAgICAgICAgICAgICAgICAgICAkKHBhcnRuZXJUZXh0Qm94KS5zaG93KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIHZhciBwYXJ0bmVyVGV4dEJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgcGFydG5lclRleHRCb3gudHlwZSA9IFwidGV4dFwiO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKHBhcnRuZXJUZXh0Qm94KTtcbiAgICAgICAgJChwYXJ0bmVyVGV4dEJveCkuaGlkZSgpO1xuICAgICAgICAkKHBhcnRuZXJUZXh0Qm94KS5jaGFuZ2UoXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gcGFydG5lclRleHRCb3gudmFsdWU7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIHByb2JhYmx5IG9ic29sZXRlLiAgTm90IHN1cmUgaWYgYW55b25lIGF0IE1pY2hpZ2FuIHdpbGwgY29tZSBiYWNrXG4gICAgLy8gdG8gd29ya2luZyBvbiB0aGlzIGFnYWluLlxuICAgIGVuYWJsZUNoYXRDb2RlcyhjdHJsRGl2KSB7XG4gICAgICAgIHZhciBjaGF0QmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIGNoYW5uZWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHZhciB0b3BpYyA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0ICsgXCItXCIgKyB0aGlzLmRpdmlkO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGNoYXRCYXIpO1xuICAgICAgICAkKGNoYXRCYXIpLnRleHQoXCJDaGF0OiBcIik7XG4gICAgICAgICQoY2hhdEJhcikuYXBwZW5kKGNoYW5uZWxzKTtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkudGV4dChcIkNyZWF0ZSBDaGFubmVsXCIpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidGFyZ2V0XCIsIFwiX2JsYW5rXCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXG4gICAgICAgICAgICBcImhyZWZcIixcbiAgICAgICAgICAgIFwiaHR0cDovL1wiICtcbiAgICAgICAgICAgICAgICBjaGF0Y29kZXNTZXJ2ZXIgK1xuICAgICAgICAgICAgICAgIFwiL25ldz9cIiArXG4gICAgICAgICAgICAgICAgJC5wYXJhbSh7XG4gICAgICAgICAgICAgICAgICAgIHRvcGljOiB3aW5kb3cubG9jYXRpb24uaG9zdCArIFwiLVwiICsgdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgbGFuZzogXCJQeXRob25cIixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNoYXRCdXR0b24gPSBidXR0O1xuICAgICAgICBjaGF0QmFyLmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICB2YXIgdXBkYXRlQ2hhdENvZGVzQ2hhbm5lbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IGRvYy5kYXRhO1xuICAgICAgICAgICAgdmFyIGkgPSAxO1xuICAgICAgICAgICAgJChjaGFubmVscykuaHRtbChcIlwiKTtcbiAgICAgICAgICAgIGRhdGFbXCJjaGFubmVsc1wiXS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsLmFyY2hpdmVkICYmIHRvcGljID09PSBjaGFubmVsLnRvcGljKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsaW5rID0gJChcIjxhIC8+XCIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaHJlZiA9XG4gICAgICAgICAgICAgICAgICAgICAgICBcImh0dHA6Ly9cIiArIGNoYXRjb2Rlc1NlcnZlciArIFwiL1wiICsgY2hhbm5lbC5jaGFubmVsTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgbGluay5hdHRyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IGhyZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBsaW5rLnRleHQoXCIgXCIgKyBjaGFubmVsLmNoYW5uZWxOYW1lICsgXCIoXCIgKyBpICsgXCIpIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgJChjaGFubmVscykuYXBwZW5kKGxpbmspO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICQoY2hhbm5lbHMpLnRleHQoXCIobm8gYWN0aXZlIGNvbnZlcnN0YXRpb25zIG9uIHRoaXMgcHJvYmxlbSlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGRvYy5zdWJzY3JpYmUodXBkYXRlQ2hhdENvZGVzQ2hhbm5lbHMpO1xuICAgICAgICBkb2Mub24oXCJvcFwiLCB1cGRhdGVDaGF0Q29kZXNDaGFubmVscyk7XG4gICAgfVxuXG4gICAgZW5hYmxlU2F2ZUxvYWQoKSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2F2ZV9ydW5cIikpO1xuICAgIH1cblxuICAgIC8vIEFjdGl2ZWNvZGUgLS0gSWYgdGhlIGNvZGUgaGFzIG5vdCBjaGFuZ2VkIHdydCB0aGUgc2NydWJiZXIgcG9zaXRpb24gdmFsdWUgdGhlbiBkb24ndCBzYXZlIHRoZSBjb2RlIG9yIHJlcG9zaXRpb24gdGhlIHNjcnViYmVyXG4gICAgLy8gIC0tIHN0aWxsIGNhbGwgcnVubG9nLCBidXQgYWRkIGEgcGFyYW1ldGVyIHRvIG5vdCBzYXZlIHRoZSBjb2RlXG4gICAgLy8gYWRkIGFuIGluaXRpYWwgbG9hZCBoaXN0b3J5IGJ1dHRvblxuICAgIC8vIGlmIHRoZXJlIGlzIG5vIGVkaXQgdGhlbiB0aGVyZSBpcyBubyBhcHBlbmQgICB0b19zYXZlIChUcnVlL0ZhbHNlKVxuICAgIGFzeW5jIGFkZEhpc3RvcnlTY3J1YmJlcihwb3NfbGFzdCkge1xuICAgICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICAgIHZhciByZXFEYXRhID0ge1xuICAgICAgICAgICAgYWNpZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuc2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlcURhdGFbXCJzaWRcIl0gPSB0aGlzLnNpZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhcImJlZm9yZSBnZXQgaGlzdFwiKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZUJvb2tDb25maWcucHJhY3RpY2VfbW9kZSB8fFxuICAgICAgICAgICAgKHRoaXMuaXNUaW1lZCAmJiAhdGhpcy5hc3Nlc3NtZW50VGFrZW4pXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aW1lZCBhbmQgYWxyZWFkeSB0YWtlbiB3ZSBzaG91bGQgcmVzdG9yZSBoaXN0b3J5IGluZm9cbiAgICAgICAgICAgIHRoaXMucmVuZGVyU2NydWJiZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoZUJvb2tDb25maWcuYWpheFVSTCArIFwiZ2V0aGlzdC5qc29uXCIsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxRGF0YSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oaXN0b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5ID0gdGhpcy5oaXN0b3J5LmNvbmNhdChkYXRhLmhpc3RvcnkpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0IGluIGRhdGEudGltZXN0YW1wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXBzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoZGF0YS50aW1lc3RhbXBzW3RdKS50b0xvY2FsZVN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidW5hYmxlIHRvIGZldGNoIGhpc3RvcnlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlbmRlclNjcnViYmVyKHBvc19sYXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJzdWNjZXNzXCI7XG4gICAgfVxuXG4gICAgcmVuZGVyU2NydWJiZXIocG9zX2xhc3QpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJtYWtpbmcgYSBuZXcgc2NydWJiZXJcIik7XG4gICAgICAgIHZhciBzY3J1YmJlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoc2NydWJiZXJEaXYpLmNzcyhcImRpc3BsYXlcIiwgXCJpbmxpbmUtYmxvY2tcIik7XG4gICAgICAgICQoc2NydWJiZXJEaXYpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgJChzY3J1YmJlckRpdikuY3NzKFwibWFyZ2luLXJpZ2h0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgJChzY3J1YmJlckRpdikuY3NzKHtcbiAgICAgICAgICAgIFwibWluLXdpZHRoXCI6IFwiMjAwcHhcIixcbiAgICAgICAgICAgIFwibWF4LXdpZHRoXCI6IFwiMzAwcHhcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzY3J1YmJlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMudGltZXN0YW1wUCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICB0aGlzLnNsaWRlaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmhpc3RvcnlbJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIildKTtcbiAgICAgICAgICAgIHZhciBjdXJWYWwgPSB0aGlzLnRpbWVzdGFtcHNbJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIildO1xuICAgICAgICAgICAgbGV0IHBvcyA9ICQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpO1xuICAgICAgICAgICAgbGV0IG91dE9mID0gdGhpcy5oaXN0b3J5Lmxlbmd0aDtcbiAgICAgICAgICAgICQodGhpcy50aW1lc3RhbXBQKS50ZXh0KGAke2N1clZhbH0gLSAke3BvcyArIDF9IG9mICR7b3V0T2Z9YCk7XG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiYWN0aXZlY29kZVwiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJzbGlkZTpcIiArIGN1clZhbCxcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgJChzY3J1YmJlcikuc2xpZGVyKHtcbiAgICAgICAgICAgIG1heDogdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEsXG4gICAgICAgIH0pO1xuICAgICAgICAkKHNjcnViYmVyKS5jc3MoXCJtYXJnaW5cIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKHNjcnViYmVyKS5vbihcInNsaWRlXCIsIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpKTtcbiAgICAgICAgJChzY3J1YmJlcikub24oXCJzbGlkZWNoYW5nZVwiLCB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKSk7XG4gICAgICAgIHNjcnViYmVyRGl2LmFwcGVuZENoaWxkKHNjcnViYmVyKTtcbiAgICAgICAgc2NydWJiZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy50aW1lc3RhbXBQKTtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBkZWFkbGluZSBzZXQgdGhlbiBwb3NpdGlvbiB0aGUgc2NydWJiZXIgYXQgdGhlIGxhc3Qgc3VibWlzc2lvblxuICAgICAgICAvLyBwcmlvciB0byB0aGUgZGVhZGxpbmVcbiAgICAgICAgaWYgKHRoaXMuZGVhZGxpbmUpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAoaSA8IHRoaXMuaGlzdG9yeS5sZW5ndGggJiYgIWRvbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAobmV3IERhdGUodGhpcy50aW1lc3RhbXBzW2ldKSA+IHRoaXMuZGVhZGxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkgPSBpIC0gMTtcbiAgICAgICAgICAgIHNjcnViYmVyLnZhbHVlID0gTWF0aC5tYXgoaSwgMCk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmhpc3Rvcnlbc2NydWJiZXIudmFsdWVdKTtcbiAgICAgICAgICAgICQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIsIHNjcnViYmVyLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NfbGFzdCkge1xuICAgICAgICAgICAgc2NydWJiZXIudmFsdWUgPSB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuaGlzdG9yeVtzY3J1YmJlci52YWx1ZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2NydWJiZXIudmFsdWUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3MgPSAkKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKTtcbiAgICAgICAgbGV0IG91dE9mID0gdGhpcy5oaXN0b3J5Lmxlbmd0aDtcbiAgICAgICAgbGV0IHRzID0gdGhpcy50aW1lc3RhbXBzWyQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpXTtcbiAgICAgICAgJCh0aGlzLnRpbWVzdGFtcFApLnRleHQoYCR7dHN9IC0gJHtwb3MgKyAxfSBvZiAke291dE9mfWApO1xuICAgICAgICAkKHRoaXMuaGlzdEJ1dHRvbikucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuaGlzdEJ1dHRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuaGlzdG9yeVNjcnViYmVyID0gc2NydWJiZXI7XG4gICAgICAgICQoc2NydWJiZXJEaXYpLmluc2VydEFmdGVyKHRoaXMucnVuQnV0dG9uKTtcbiAgICB9IC8vIGVuZCBkZWZpbml0aW9uIG9mIGhlbHBlclxuXG4gICAgY3JlYXRlT3V0cHV0KCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBwYXJlbnQgZGl2IHdpdGggdHdvIGVsZW1lbnRzOiAgcHJlIGZvciBzdGFuZGFyZCBvdXRwdXQgYW5kIGEgZGl2XG4gICAgICAgIC8vIHRvIGhvbGQgdHVydGxlIGdyYXBoaWNzIG91dHB1dC4gIFdlIHVzZSBhIGRpdiBpbiBjYXNlIHRoZSB0dXJ0bGUgY2hhbmdlcyBmcm9tXG4gICAgICAgIC8vIHVzaW5nIGEgY2FudmFzIHRvIHVzaW5nIHNvbWUgb3RoZXIgZWxlbWVudCBsaWtlIHN2ZyBpbiB0aGUgZnV0dXJlLlxuICAgICAgICB2YXIgb3V0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiYWNfb3V0cHV0IGNvbC1tZC0xMlwiKTtcbiAgICAgICAgdGhpcy5vdXREaXYgPSBvdXREaXY7XG4gICAgICAgIHRoaXMub3V0cHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKTtcbiAgICAgICAgdGhpcy5vdXRwdXQuaWQgPSB0aGlzLmRpdmlkICsgXCJfc3Rkb3V0XCI7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIik7XG4gICAgICAgIHRoaXMuZ3JhcGhpY3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmdyYXBoaWNzLmlkID0gdGhpcy5kaXZpZCArIFwiX2dyYXBoaWNzXCI7XG4gICAgICAgICQodGhpcy5ncmFwaGljcykuYWRkQ2xhc3MoXCJhYy1jYW52YXNcIik7XG4gICAgICAgIC8vIFRoaXMgYml0IG9mIG1hZ2ljIGFkZHMgYW4gZXZlbnQgd2hpY2ggd2FpdHMgZm9yIGEgY2FudmFzIGNoaWxkIHRvIGJlIGNyZWF0ZWQgb24gb3VyXG4gICAgICAgIC8vIG5ld2x5IGNyZWF0ZWQgZGl2LiAgV2hlbiBhIGNhbnZhcyBjaGlsZCBpcyBhZGRlZCB3ZSBhZGQgYSBuZXcgY2xhc3Mgc28gdGhhdCB0aGUgdmlzaWJsZVxuICAgICAgICAvLyBjYW52YXMgY2FuIGJlIHN0eWxlZCBpbiBDU1MuICBXaGljaCBhIHRoZSBtb21lbnQgbWVhbnMganVzdCBhZGRpbmcgYSBib3JkZXIuXG4gICAgICAgICQodGhpcy5ncmFwaGljcykub24oXG4gICAgICAgICAgICBcIkRPTU5vZGVJbnNlcnRlZFwiLFxuICAgICAgICAgICAgXCJjYW52YXNcIixcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMuZ3JhcGhpY3MpLmFkZENsYXNzKFwidmlzaWJsZS1hYy1jYW52YXNcIik7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIGNsZWFyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjbGVhckRpdikuY3NzKFwiY2xlYXJcIiwgXCJib3RoXCIpOyAvLyBuZWVkZWQgdG8gbWFrZSBwYXJlbnQgZGl2IHJlc2l6ZSBwcm9wZXJseVxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNsZWFyRGl2KTtcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMub3V0cHV0KTtcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMuZ3JhcGhpY3MpO1xuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKG91dERpdik7XG4gICAgICAgIHZhciBsZW5zRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgbGVuc0Rpdi5pZCA9IGAke3RoaXMuZGl2aWR9X2NvZGVsZW5zYDtcbiAgICAgICAgJChsZW5zRGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgJChsZW5zRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcbiAgICAgICAgdGhpcy5jb2RlbGVucyA9IGxlbnNEaXY7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQobGVuc0Rpdik7XG4gICAgICAgIHZhciBjb2FjaERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoY29hY2hEaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xuICAgICAgICAkKGNvYWNoRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcbiAgICAgICAgdGhpcy5jb2RlY29hY2ggPSBjb2FjaERpdjtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjb2FjaERpdik7XG4gICAgICAgIGNsZWFyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjbGVhckRpdikuY3NzKFwiY2xlYXJcIiwgXCJib3RoXCIpOyAvLyBuZWVkZWQgdG8gbWFrZSBwYXJlbnQgZGl2IHJlc2l6ZSBwcm9wZXJseVxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNsZWFyRGl2KTtcbiAgICB9XG5cbiAgICBkaXNhYmxlU2F2ZUxvYWQoKSB7XG4gICAgICAgICQodGhpcy5zYXZlQnV0dG9uKS5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMuc2F2ZUJ1dHRvbikuYXR0cihcInRpdGxlXCIsIFwiTG9naW4gdG8gc2F2ZSB5b3VyIGNvZGVcIik7XG4gICAgICAgICQodGhpcy5sb2FkQnV0dG9uKS5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMubG9hZEJ1dHRvbikuYXR0cihcInRpdGxlXCIsIFwiTG9naW4gdG8gbG9hZCB5b3VyIGNvZGVcIik7XG4gICAgfVxuXG4gICAgZG93bmxvYWRGaWxlKGxhbmcpIHtcbiAgICAgICAgdmFyIGZuYiA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIHZhciBkID0gbmV3IERhdGUoKTtcbiAgICAgICAgdmFyIGZpbGVOYW1lID1cbiAgICAgICAgICAgIGZuYiArXG4gICAgICAgICAgICBcIl9cIiArXG4gICAgICAgICAgICBkXG4gICAgICAgICAgICAgICAgLnRvSlNPTigpXG4gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCAxMCkgLy8gcmV2ZXJzZSBkYXRlIGZvcm1hdFxuICAgICAgICAgICAgICAgIC5zcGxpdChcIi1cIilcbiAgICAgICAgICAgICAgICAuam9pbihcIlwiKSArXG4gICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICBsYW5ndWFnZUV4dGVuc2lvbnNbbGFuZ107XG4gICAgICAgIHZhciBjb2RlID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgaWYgKFwiQmxvYlwiIGluIHdpbmRvdykge1xuICAgICAgICAgICAgdmFyIHRleHRUb1dyaXRlID0gY29kZS5yZXBsYWNlKC9cXG4vZywgXCJcXHJcXG5cIik7XG4gICAgICAgICAgICB2YXIgdGV4dEZpbGVBc0Jsb2IgPSBuZXcgQmxvYihbdGV4dFRvV3JpdGVdLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0L3BsYWluXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChcIm1zU2F2ZU9yT3BlbkJsb2JcIiBpbiBuYXZpZ2F0b3IpIHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYih0ZXh0RmlsZUFzQmxvYiwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZG93bmxvYWRMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLmlubmVySFRNTCA9IFwiRG93bmxvYWQgRmlsZVwiO1xuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5ocmVmID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwodGV4dEZpbGVBc0Jsb2IpO1xuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb3dubG9hZExpbmspO1xuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxlcnQoXCJZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSFRNTDUgQmxvYi5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldENvZGUoKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuZGl2aWQpO1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgY3JlYXRlR3JhZGVTdW1tYXJ5KCkge1xuICAgICAgICAvLyBnZXQgZ3JhZGUgYW5kIGNvbW1lbnRzIGZvciB0aGlzIGFzc2lnbm1lbnRcbiAgICAgICAgLy8gZ2V0IHN1bW1hcnkgb2YgYWxsIGdyYWRlcyBmb3IgdGhpcyBzdHVkZW50XG4gICAgICAgIC8vIGRpc3BsYXkgZ3JhZGVzIGluIG1vZGFsIHdpbmRvd1xuICAgICAgICB2YXIgZGF0YSA9IHtcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChlQm9va0NvbmZpZy5hamF4VVJMICsgXCJnZXRhc3NpZ25tZW50Z3JhZGVcIiwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICBsZXQgcmVwb3J0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICB2YXIgYm9keTtcbiAgICAgICAgLy8gY2hlY2sgZm9yIHJlcG9ydFsnbWVzc2FnZSddXG4gICAgICAgIGlmIChyZXBvcnQpIHtcbiAgICAgICAgICAgIGlmIChyZXBvcnRbXCJ2ZXJzaW9uXCJdID09IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBuZXcgdmVyc2lvbjsgd291bGQgYmUgYmV0dGVyIHRvIGVtYmVkIHRoaXMgaW4gSFRNTCBmb3IgdGhlIGFjdGl2ZWNvZGVcbiAgICAgICAgICAgICAgICBib2R5ID1cbiAgICAgICAgICAgICAgICAgICAgXCI8aDQ+R3JhZGUgUmVwb3J0PC9oND5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+VGhpcyBxdWVzdGlvbjogXCIgK1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJncmFkZVwiXTtcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0W1wicmVsZWFzZWRcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBcIiBvdXQgb2YgXCIgKyByZXBvcnRbXCJtYXhcIl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJvZHkgKz0gXCI8L3A+IDxwPlwiO1xuICAgICAgICAgICAgICAgIGlmIChyZXBvcnRbXCJyZWxlYXNlZFwiXSA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IFwiUHJlbGltaW5hcnkgQ29tbWVudHM6IFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBib2R5ICs9IHJlcG9ydFtcImNvbW1lbnRcIl0gKyBcIjwvcD5cIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYm9keSA9XG4gICAgICAgICAgICAgICAgICAgIFwiPGg0PkdyYWRlIFJlcG9ydDwvaDQ+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIjxwPlRoaXMgYXNzaWdubWVudDogXCIgK1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJncmFkZVwiXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9wPlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCI8cD5cIiArXG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydFtcImNvbW1lbnRcIl0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+TnVtYmVyIG9mIGdyYWRlZCBhc3NpZ25tZW50czogXCIgK1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJjb3VudFwiXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9wPlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCI8cD5BdmVyYWdlIHNjb3JlOiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydFtcImF2Z1wiXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9wPlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYm9keSA9IFwiPGg0PlRoZSBzZXJ2ZXIgZGlkIG5vdCByZXR1cm4gYW55IGdyYWRlIGluZm9ybWF0aW9uPC9oND5cIjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaHRtbCA9IGA8ZGl2IGNsYXNzPVwibW9kYWwgZmFkZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBjb21wYXJlLW1vZGFsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5Bc3NpZ25tZW50IEZlZWRiYWNrPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHtib2R5fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHZhciBlbCA9ICQoaHRtbCk7XG4gICAgICAgIGVsLm1vZGFsKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIGFzeW5jIHNob3dDb2RlbGVucygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnNcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsID0gdGhpcy5jb2RlbGVucy5maXJzdENoaWxkO1xuICAgICAgICBpZiAoY2wpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMucmVtb3ZlQ2hpbGQoY2wpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb2RlID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpO1xuICAgICAgICB2YXIgbXlWYXJzID0ge307XG4gICAgICAgIG15VmFycy5jb2RlID0gY29kZTtcbiAgICAgICAgbXlWYXJzLm9yaWdpbiA9IFwib3B0LWZyb250ZW5kLmpzXCI7XG4gICAgICAgIG15VmFycy5jdW11bGF0aXZlID0gZmFsc2U7XG4gICAgICAgIG15VmFycy5oZWFwUHJpbWl0aXZlcyA9IGZhbHNlO1xuICAgICAgICBteVZhcnMuZHJhd1BhcmVudFBvaW50ZXJzID0gZmFsc2U7XG4gICAgICAgIG15VmFycy50ZXh0UmVmZXJlbmNlcyA9IGZhbHNlO1xuICAgICAgICBteVZhcnMuc2hvd09ubHlPdXRwdXRzID0gZmFsc2U7XG4gICAgICAgIG15VmFycy5yYXdJbnB1dExzdEpTT04gPSBKU09OLnN0cmluZ2lmeShbXSk7XG4gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlID09IFwicHl0aG9uXCIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnB5dGhvbjMpIHtcbiAgICAgICAgICAgICAgICBteVZhcnMucHkgPSAzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBteVZhcnMucHkgPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFuZ2F1Z2UgPT0gXCJqYXZhc2NyaXB0XCIpIHtcbiAgICAgICAgICAgIG15VmFycy5weSA9IFwianNcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG15VmFycy5weSA9IHRoaXMubGFuZ3VhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgbXlWYXJzLmN1ckluc3RyID0gMDtcbiAgICAgICAgbXlWYXJzLmNvZGVEaXZXaWR0aCA9IDM1MDtcbiAgICAgICAgbXlWYXJzLmNvZGVEaXZIZWlnaHQgPSA0MDA7XG4gICAgICAgIHZhciBzcmNVUkwgPSBcImh0dHBzOi8vcHl0aG9udHV0b3IuY29tL2lmcmFtZS1lbWJlZC5odG1sXCI7XG4gICAgICAgIHZhciBzcmNWYXJzID0gJC5wYXJhbShteVZhcnMpO1xuICAgICAgICB2YXIgZW1iZWRVcmxTdHIgPSBgJHtzcmNVUkx9IyR7c3JjVmFyc31gO1xuICAgICAgICB2YXIgbXlJZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB0aGlzLmRpdmlkICsgXCJfY29kZWxlbnNcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiODAwXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgXCI1MDBcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiZGlzcGxheTpibG9ja1wiKTtcbiAgICAgICAgbXlJZnJhbWUuc3R5bGUuYmFja2dyb3VuZCA9IFwiI2ZmZlwiO1xuICAgICAgICAvL215SWZyYW1lLnNldEF0dHJpYnV0ZShcInNyY1wiLHNyY1VSTClcbiAgICAgICAgbXlJZnJhbWUuc3JjID0gZW1iZWRVcmxTdHI7XG4gICAgICAgIHRoaXMuY29kZWxlbnMuYXBwZW5kQ2hpbGQobXlJZnJhbWUpO1xuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJjb2RlbGVuc1wiLFxuICAgICAgICAgICAgYWN0OiBcInZpZXdcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIDxpZnJhbWUgaWQ9XCIlKGRpdmlkKXNfY29kZWxlbnNcIiB3aWR0aD1cIjgwMFwiIGhlaWdodD1cIjUwMFwiIHN0eWxlPVwiZGlzcGxheTpibG9ja1wic3JjPVwiI1wiPlxuICAgIC8vIDwvaWZyYW1lPlxuICAgIHNob3dDb2RlQ29hY2goKSB7XG4gICAgICAgIHZhciBteUlmcmFtZTtcbiAgICAgICAgdmFyIHNyY1VSTDtcbiAgICAgICAgdmFyIGNsO1xuICAgICAgICB2YXIgZGl2X2lkID0gdGhpcy5kaXZpZDtcbiAgICAgICAgaWYgKHRoaXMuY29kZWNvYWNoID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVjb2FjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0aGlzLmNvZGVjb2FjaC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICB9XG4gICAgICAgIGNsID0gdGhpcy5jb2RlY29hY2guZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGNsKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVjb2FjaC5yZW1vdmVDaGlsZChjbCk7XG4gICAgICAgIH1cbiAgICAgICAgc3JjVVJMID0gZUJvb2tDb25maWcuYXBwICsgXCIvYWRtaW4vZGlmZnZpZXdlcj9kaXZpZD1cIiArIGRpdl9pZDtcbiAgICAgICAgbXlJZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBkaXZfaWQgKyBcIl9jb2FjaFwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCI4MDBweFwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIFwiNTAwcHhcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiZGlzcGxheTpibG9ja1wiKTtcbiAgICAgICAgbXlJZnJhbWUuc3R5bGUuYmFja2dyb3VuZCA9IFwiI2ZmZlwiO1xuICAgICAgICBteUlmcmFtZS5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgICAgICBteUlmcmFtZS5zcmMgPSBzcmNVUkw7XG4gICAgICAgIHRoaXMuY29kZWNvYWNoLmFwcGVuZENoaWxkKG15SWZyYW1lKTtcbiAgICAgICAgJCh0aGlzLmNvZGVjb2FjaCkuc2hvdygpO1xuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJjb2FjaFwiLFxuICAgICAgICAgICAgYWN0OiBcInZpZXdcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdG9nZ2xlRWRpdG9yVmlzaWJpbGl0eSgpIHt9XG5cbiAgICBhZGRFcnJvck1lc3NhZ2UoZXJyKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgZXJyb3IgbWVzc2FnZVxuICAgICAgICB0aGlzLmVyckxhc3RSdW4gPSB0cnVlO1xuICAgICAgICB2YXIgZXJySGVhZCA9ICQoXCI8aDM+XCIpLmh0bWwoXCJFcnJvclwiKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZXJyb3IgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5pZCA9IHRoaXMuZGl2aWQgKyBcIl9lcnJpbmZvXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChlcnJIZWFkWzBdKTtcbiAgICAgICAgdmFyIGVyclRleHQgPSB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpXG4gICAgICAgICk7XG4gICAgICAgIC8vIEJ1dCwgYWRqdXN0IHRoZSBsaW5lIG51bWJlcnMuICBJZiB0aGUgbGluZSBudW1iZXIgaXMgPD0gcHJldGV4dExpbmVzIHRoZW4gaXQgaXMgaW4gaW5jbHVkZWQgY29kZVxuICAgICAgICAvLyBpZiBpdCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBpbmNsdWRlZCBsaW5lcyBidXQgbGVzcyB0aGFuIHRoZSBwcmV0ZXh0ICsgY3VycmVudCBlZGl0b3IgdGhlbiBpdCBpcyBpbiB0aGUgc3R1ZGVudCBjb2RlLlxuICAgICAgICAvLyBhZGp1c3QgdGhlIGxpbmUgbnVtYmVyIHdlIGRpc3BsYXkgYnkgZWxpbWluYXRpbmcgdGhlIHByZS1pbmNsdWRlZCBjb2RlLlxuICAgICAgICBpZiAoZXJyLnRyYWNlYmFjay5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgdmFyIGVycm9yTGluZSA9IGVyci50cmFjZWJhY2tbMF0ubGluZW5vO1xuICAgICAgICAgICAgaWYgKGVycm9yTGluZSA8PSB0aGlzLnByZXRleHRMaW5lcykge1xuICAgICAgICAgICAgICAgIGVyclRleHQuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICAgICAgICAgXCJBbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgaGlkZGVuLCBpbmNsdWRlZCBjb2RlLiBTb3JyeSB3ZSBjYW4ndCBnaXZlIHlvdSBhIG1vcmUgaGVscGZ1bCBlcnJvciBtZXNzYWdlXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvckxpbmUgPiB0aGlzLnByb2dMaW5lcyArIHRoaXMucHJldGV4dExpbmVzKSB7XG4gICAgICAgICAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPSBgQW4gZXJyb3Igb2NjdXJyZWQgYWZ0ZXIgdGhlIGVuZCBvZiB5b3VyIGNvZGUuXG5PbmUgcG9zc2libGUgcmVhc29uIGlzIHRoYXQgeW91IGhhdmUgYW4gdW5jbG9zZWQgcGFyZW50aGVzaXMgb3Igc3RyaW5nLlxuQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBoaWRkZW4gdGVzdCBjb2RlLlxuWWV0IGFub3RoZXIgaXMgdGhhdCB0aGVyZSBpcyBhbiBpbnRlcm5hbCBlcnJvci4gIFRoZSBpbnRlcm5hbCBlcnJvciBtZXNzYWdlIGlzOiAke2Vyci5tZXNzYWdlfWA7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV0ZXh0TGluZXMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGVyci50cmFjZWJhY2tbMF0ubGluZW5vID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci50cmFjZWJhY2tbMF0ubGluZW5vIC0gdGhpcy5wcmV0ZXh0TGluZXMgKyAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyU3RyaW5nID0gZXJyLnRvU3RyaW5nKCk7XG4gICAgICAgIHZhciB0byA9IGVyclN0cmluZy5pbmRleE9mKFwiOlwiKTtcbiAgICAgICAgdmFyIGVyck5hbWUgPSBlcnJTdHJpbmcuc3Vic3RyaW5nKDAsIHRvKTtcbiAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPSBlcnJTdHJpbmc7XG4gICAgICAgICQodGhpcy5lQ29udGFpbmVyKS5hcHBlbmQoXCI8aDM+RGVzY3JpcHRpb248L2gzPlwiKTtcbiAgICAgICAgdmFyIGVyckRlc2MgPSB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIikpO1xuICAgICAgICBlcnJEZXNjLmlubmVySFRNTCA9IGVycm9yVGV4dFtlcnJOYW1lXTtcbiAgICAgICAgJCh0aGlzLmVDb250YWluZXIpLmFwcGVuZChcIjxoMz5UbyBGaXg8L2gzPlwiKTtcbiAgICAgICAgdmFyIGVyckZpeCA9IHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSk7XG4gICAgICAgIGVyckZpeC5pbm5lckhUTUwgPSBlcnJvclRleHRbZXJyTmFtZSArIFwiRml4XCJdO1xuICAgICAgICB2YXIgbW9yZUluZm8gPSBcIi4uL0Vycm9ySGVscC9cIiArIGVyck5hbWUudG9Mb3dlckNhc2UoKSArIFwiLmh0bWxcIjtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIlJ1bnRpbWUgRXJyb3I6IFwiICsgZXJyLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBzZXRUaW1lTGltaXQodGltZXIpIHtcbiAgICAgICAgdmFyIHRpbWVsaW1pdCA9IHRoaXMudGltZWxpbWl0O1xuICAgICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGltZWxpbWl0ID0gdGltZXI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IGV4ZWNMaW1pdCBpbiBtaWxsaXNlY29uZHMgIC0tIGZvciBzdHVkZW50IHByb2plY3RzIHNldCB0aGlzIHRvXG4gICAgICAgIC8vIDI1IHNlY29uZHMgLS0ganVzdCBsZXNzIHRoYW4gQ2hyb21lJ3Mgb3duIHRpbWVyLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvZGUuaW5kZXhPZihcIm9udGltZXJcIikgPiAtMSB8fFxuICAgICAgICAgICAgdGhpcy5jb2RlLmluZGV4T2YoXCJvbmNsaWNrXCIpID4gLTEgfHxcbiAgICAgICAgICAgIHRoaXMuY29kZS5pbmRleE9mKFwib25rZXlcIikgPiAtMSB8fFxuICAgICAgICAgICAgdGhpcy5jb2RlLmluZGV4T2YoXCJzZXREZWxheVwiKSA+IC0xXG4gICAgICAgICkge1xuICAgICAgICAgICAgU2suZXhlY0xpbWl0ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aW1lbGltaXQgPT09IFwib2ZmXCIpIHtcbiAgICAgICAgICAgICAgICBTay5leGVjTGltaXQgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lbGltaXQpIHtcbiAgICAgICAgICAgICAgICBTay5leGVjTGltaXQgPSB0aW1lbGltaXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIFNrLmV4ZWNMaW1pdCA9IDI1MDAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGJ1aWx0aW5SZWFkKHgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgU2suYnVpbHRpbkZpbGVzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIFNrLmJ1aWx0aW5GaWxlc1tcImZpbGVzXCJdW3hdID09PSB1bmRlZmluZWRcbiAgICAgICAgKVxuICAgICAgICAgICAgdGhyb3cgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfZmlsZV9ub3RfZm91bmRcIiwgeCk7XG4gICAgICAgIHJldHVybiBTay5idWlsdGluRmlsZXNbXCJmaWxlc1wiXVt4XTtcbiAgICB9XG4gICAgZmlsZVJlYWRlcihkaXZpZCkge1xuICAgICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRpdmlkKTtcbiAgICAgICAgbGV0IGRhdGEgPSBcIlwiO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgaWYgKGVsZW0gPT0gbnVsbCAmJiBTay5idWlsdGluRmlsZXMuZmlsZXMuaGFzT3duUHJvcGVydHkoZGl2aWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gU2suYnVpbHRpbkZpbGVzW1wiZmlsZXNcIl1bZGl2aWRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdHJ5IHJlbW90ZSBmaWxlIHVubGVzcyBpdCBlbmRzIHdpdGggLmpzIG9yIC5weSAtLSBvdGhlcndpc2Ugd2UnbGwgYXNrIHRoZSBzZXJ2ZXIgZm9yIGFsbFxuICAgICAgICAgICAgLy8ga2luZHMgb2YgbW9kdWxlcyB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gaW1wb3J0XG4gICAgICAgICAgICBpZiAoIShkaXZpZC5lbmRzV2l0aChcIi5qc1wiKSB8fCBkaXZpZC5lbmRzV2l0aChcIi5weVwiKSkpIHtcbiAgICAgICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgICAgICBhc3luYzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHVybDogYC9ydW5lc3RvbmUvYWpheC9nZXRfZGF0YWZpbGU/Y291cnNlX2lkPSR7ZUJvb2tDb25maWcuY291cnNlfSZhY2lkPSR7ZGl2aWR9YCxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoZGF0YSkuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbSA9PSBudWxsICYmIHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSU9FcnJvcihcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9ub19maWxlX29yX2RpclwiLCBkaXZpZClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwidGV4dGFyZWFcIikge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBlbGVtLnZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZWxlbS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgb3V0cHV0ZnVuKHRleHQpIHtcbiAgICAgICAgLy8gYm5tIHB5dGhvbiAzXG4gICAgICAgIHZhciBweVN0ciA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiW1wiICsgeC5qb2luKFwiLCBcIikgKyBcIl1cIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHZhciB4ID0gdGV4dDtcbiAgICAgICAgaWYgKCF0aGlzLnB5dGhvbjMpIHtcbiAgICAgICAgICAgIGlmICh4LmNoYXJBdCgwKSA9PSBcIihcIikge1xuICAgICAgICAgICAgICAgIHggPSB4LnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICB4ID0gXCJbXCIgKyB4ICsgXCJdXCI7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhsID0gZXZhbCh4KTtcbiAgICAgICAgICAgICAgICAgICAgeGwgPSB4bC5tYXAocHlTdHIpO1xuICAgICAgICAgICAgICAgICAgICB4ID0geGwuam9pbihcIiBcIik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xuICAgICAgICB0ZXh0ID0geDtcbiAgICAgICAgdGV4dCA9IHRleHRcbiAgICAgICAgICAgIC5yZXBsYWNlKC88L2csIFwiJmx0O1wiKVxuICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxuL2csIFwiPGJyLz5cIik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLmFwcGVuZCh0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZpbGV3cml0ZXIoZm9iaiwgYnl0ZXMpIHtcbiAgICAgICAgbGV0IGZpbGVjb21wb25lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb2JqLm5hbWUpO1xuICAgICAgICBpZiAoIWZpbGVjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKFwicnVuZXN0b25lXCIpO1xuICAgICAgICAgICAgbGV0IHRhYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAkKHRhYikuYWRkQ2xhc3MoXCJkYXRhZmlsZV9jYXB0aW9uXCIpO1xuICAgICAgICAgICAgdGFiLmlubmVySFRNTCA9IGBEYXRhIGZpbGU6IDxjb2RlPiR7Zm9iai5uYW1lfTwvY29kZT5gO1xuICAgICAgICAgICAgZmlsZWNvbXBvbmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcbiAgICAgICAgICAgIGZpbGVjb21wb25lbnQucm93cyA9IDEwO1xuICAgICAgICAgICAgZmlsZWNvbXBvbmVudC5jb2xzID0gNTA7XG4gICAgICAgICAgICBmaWxlY29tcG9uZW50LmlkID0gZm9iai5uYW1lO1xuICAgICAgICAgICAgJChmaWxlY29tcG9uZW50KS5jc3MoXCJtYXJnaW4tYm90dG9tXCIsIFwiNXB4XCIpO1xuICAgICAgICAgICAgJChmaWxlY29tcG9uZW50KS5hZGRDbGFzcyhcImFjX291dHB1dFwiKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWIpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGZpbGVjb21wb25lbnQpO1xuICAgICAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvYmoucG9zJCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgJChmaWxlY29tcG9uZW50KS52YWwoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSAkKGZpbGVjb21wb25lbnQpLnZhbCgpO1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudCArIGJ5dGVzLnY7XG4gICAgICAgICQoZmlsZWNvbXBvbmVudCkudmFsKGN1cnJlbnQpO1xuICAgICAgICAkKGZpbGVjb21wb25lbnQpLmNzcyhcImRpc3BsYXlcIiwgXCJibG9ja1wiKTtcbiAgICAgICAgZm9iai5wb3MkID0gY3VycmVudC5sZW5ndGg7XG4gICAgICAgIHJldHVybiBjdXJyZW50Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRJbmNsdWRlZENvZGUoZGl2aWQpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5lZExpc3RbZGl2aWRdKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmVkTGlzdFtkaXZpZF0uZWRpdG9yLmdldFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KFxuICAgICAgICAgICAgICAgIGAvcnVuZXN0b25lL2FqYXgvZ2V0X2RhdGFmaWxlP2NvdXJzZV9pZD0ke2VCb29rQ29uZmlnLmNvdXJzZX0mYWNpZD0ke2RpdmlkfWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCB3cmVzdWx0ID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG4gICAgICAgICAgICBsZXQgb2JqID0gYXdhaXQgd3Jlc3VsdC5qc29uKCk7XG4gICAgICAgICAgICByZXR1cm4gb2JqLmRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBidWlsZFByb2codXNlU3VmZml4KSB7XG4gICAgICAgIC8vIGFzc2VtYmxlIGNvZGUgZnJvbSBwcmVmaXgsIHN1ZmZpeCwgYW5kIGVkaXRvciBmb3IgcnVubmluZy5cbiAgICAgICAgdmFyIHByZXRleHQ7XG4gICAgICAgIHZhciBwcm9nID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSArIFwiXFxuXCI7XG4gICAgICAgIGlmICh0aGlzLnByZWZpeCkge1xuICAgICAgICAgICAgcHJvZyA9IHRoaXMucHJlZml4ICsgcHJvZztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXRleHQgPSBcIlwiO1xuICAgICAgICB0aGlzLnByZXRleHRMaW5lcyA9IDA7XG4gICAgICAgIHRoaXMucHJvZ0xpbmVzID0gcHJvZy5tYXRjaCgvXFxuL2cpLmxlbmd0aCArIDE7XG4gICAgICAgIGlmICh0aGlzLmluY2x1ZGVzKSB7XG4gICAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGluY2x1ZGVzLCBpbi1vcmRlciBwcmVwZW5kaW5nIHRvIHByb2dcbiAgICAgICAgICAgIHByZXRleHQgPSBcIlwiO1xuICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLmluY2x1ZGVzLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlDb2RlID0gYXdhaXQgdGhpcy5nZXRJbmNsdWRlZENvZGUodGhpcy5pbmNsdWRlc1t4XSk7XG4gICAgICAgICAgICAgICAgcHJldGV4dCA9IHByZXRleHQgKyBpQ29kZSArIFwiXFxuXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByZXRleHQgPSBwcmV0ZXh0O1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldGV4dCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldGV4dExpbmVzID0gKHRoaXMucHJldGV4dC5tYXRjaCgvXFxuL2cpIHx8IFwiXCIpLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2cgPSBwcmV0ZXh0ICsgcHJvZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlU3VmZml4ICYmIHRoaXMuc3VmZml4KSB7XG4gICAgICAgICAgICBwcm9nID0gcHJvZyArIHRoaXMuc3VmZml4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocHJvZyk7XG4gICAgfVxuXG4gICAgYXN5bmMgbWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciA9PT0gbnVsbCAmJiAhdGhpcy5hdXRvcnVuKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkZEhpc3RvcnlTY3J1YmJlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeVNjcnViYmVyICYmXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnlbJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIildICE9XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh0aGlzLmVkaXRvci5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wcy5wdXNoKG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKSk7XG4gICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXG4gICAgICAgICAgICAgICAgXCJvcHRpb25cIixcbiAgICAgICAgICAgICAgICBcIm1heFwiLFxuICAgICAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFxuICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zbGlkZWl0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzYXZlQ29kZSA9IFwiRmFsc2VcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oaXN0b3J5U2NydWJiZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgc2F2ZUNvZGUgPSBcIkZhbHNlXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhdmVDb2RlO1xuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuUHJvZygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgZXJyb3IgcnVubmluZyBjb2RlICR7ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgY29kZTogdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgIGxhbmc6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgICAgICBlcnJpbmZvOiB0aGlzLmVycmluZm8sXG4gICAgICAgICAgICB0b19zYXZlOiB0aGlzLnNhdmVDb2RlLFxuICAgICAgICAgICAgcHJlZml4OiB0aGlzLnByZXRleHQsXG4gICAgICAgICAgICBzdWZmaXg6IHRoaXMuc3VmZml4LFxuICAgICAgICAgICAgcGFydG5lcjogdGhpcy5wYXJ0bmVyLFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5kaXZpZCwgZGF0YVsnY29kZSddKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMubG9nUnVuRXZlbnQoZGF0YSk7IC8vIExvZyB0aGUgcnVuIGV2ZW50XG4gICAgICAgIC8vIElmIHVuaXQgdGVzdHMgd2VyZSBydW4gdGhlcmUgd2lsbCBiZSBhIHVuaXRfcmVzdWx0c1xuICAgICAgICBpZiAodGhpcy51bml0X3Jlc3VsdHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBhY3Q6IHRoaXMudW5pdF9yZXN1bHRzLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICBldmVudDogXCJ1bml0dGVzdFwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJGZWVkYmFjaygpIHtcbiAgICAgICAgLy8gVGhlIHB5dGhvbiB1bml0IHRlc3QgY29kZSBidWlsZHMgdGhlIHRhYmxlIGFzIGl0IGlzIHJ1bm5pbmcgdGhlIHRlc3RzXG4gICAgICAgIC8vIEluIFwibm9ybWFsXCIgdXNhZ2UgdGhpcyBpcyBkaXNwbGF5ZWQgaW1tZWRpYXRlbHkuXG4gICAgICAgIC8vIEhvd2V2ZXIgaW4gZXhhbSBtb2RlIHdlIG1ha2UgYSBkaXYgd2hpY2ggaXMgb2Zmc2NyZWVuXG4gICAgICAgIGlmICh0aGlzLnVuaXRfcmVzdWx0c19kaXZpZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzX2RpdmlkLmluZGV4T2YoXCJfb2Zmc2NyZWVuX1wiKSA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgdXJEaXZpZCA9IGAke3RoaXMuZGl2aWR9X29mZnNjcmVlbl91bml0X3Jlc3VsdHNgO1xuICAgICAgICAgICAgICAgIGxldCB1bml0RmVlZGJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh1ckRpdmlkKTtcbiAgICAgICAgICAgICAgICBsZXQgdG1wID0gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh1bml0RmVlZGJhY2spO1xuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMub3V0ZXJEaXYpLmZpbmQoYCMke3VyRGl2aWR9YCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0bXAgPSAkKHRoaXMub3V0ZXJEaXYpLmZpbmQoYCMke3VyRGl2aWR9YClbMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZCh0bXApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkKHRtcCkuc2hvdygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdXJEaXZpZCA9IHRoaXMuZGl2aWQgKyBcIl91bml0X3Jlc3VsdHNcIjtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5vdXRlckRpdikuZmluZChgIyR7dXJEaXZpZH1gKS5sZW5ndGggPT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLmZpbmQoYCMke3VyRGl2aWR9X29mZnNjcmVlbl91bml0X3Jlc3VsdHNgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCA9PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1clJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh1ckRpdmlkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZCh1clJlc3VsdHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qIHJ1blByb2cgaGFzIHNldmVyYWwgYXN5bmMgZWxlbWVudHMgdG8gaXQuXG4gICAgICogMS4gU2t1bHB0IHJ1bnMgdGhlIHB5dGhvbiBwcm9ncmFtIGFzeW5jaHJvbm91c2x5XG4gICAgICogMi4gVGhlIGhpc3RvcnkgaXMgcmVzdG9yZWQgYXN5bmNocm9ub3VzbHlcbiAgICAgKiAzLiBMb2dnaW5nIGlzIGFzeW5jaHJvbm91c1xuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2t1bHB0IFByb21pc2UgYW5kIHNvIHRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZSB3aGVuIHNrdWxwdCBpcyBmaW5pc2hlZC5cbiAgICAgKiB3aGVuIGZpbmlzaGVkIHRoaXMudW5pdF9yZXN1bHRzIHdpbGwgY29udGFpbiB0aGUgcmVzdWx0cyBvZiBhbnkgdW5pdCB0ZXN0cyB0aGF0IGhhdmUgYmVlbiBydW4uXG4gICAgICogVGhlIHRhYmxlIG9mIHJlc3VsdHMgaXMgY29uc3RydWN0ZWQgYW5kIGFkZGVkIHRvIHRoZSBET00gYnkgdGhlIHB5dGhvbiB1bml0dGVzdC5ndWkgbW9kdWxlIGluIHNrdWxwdC5cbiAgICAgKlxuICAgICAqL1xuICAgIGFzeW5jIHJ1blByb2cobm9VSSwgbG9nUmVzdWx0cykge1xuICAgICAgICBjb25zb2xlLmxvZyhcInN0YXJ0aW5nIHJ1blByb2dcIik7XG4gICAgICAgIGlmICh0eXBlb2YgbG9nUmVzdWx0cyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nUmVzdWx0cyA9IGxvZ1Jlc3VsdHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBub1VJICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgbm9VSSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9nID0gYXdhaXQgdGhpcy5idWlsZFByb2codHJ1ZSk7XG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcIlwiKTtcbiAgICAgICAgd2hpbGUgKCQoYCMke3RoaXMuZGl2aWR9X2VycmluZm9gKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAkKGAjJHt0aGlzLmRpdmlkfV9lcnJpbmZvYCkucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8kKHRoaXMuZUNvbnRhaW5lcikucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLmNvZGVsZW5zKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jbEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zXCIpO1xuICAgICAgICB9XG4gICAgICAgIFNrLmNvbmZpZ3VyZSh7XG4gICAgICAgICAgICBvdXRwdXQ6IHRoaXMub3V0cHV0ZnVuLmJpbmQodGhpcyksXG4gICAgICAgICAgICByZWFkOiB0aGlzLmZpbGVSZWFkZXIsXG4gICAgICAgICAgICBmaWxld3JpdGU6IHRoaXMuZmlsZXdyaXRlci5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgX19mdXR1cmVfXzogU2sucHl0aG9uMyxcbiAgICAgICAgICAgIG5vbnJlYWRvcGVuOiB0cnVlLFxuICAgICAgICAgICAgLy8gICAgICAgIHB5dGhvbjM6IHRoaXMucHl0aG9uMyxcbiAgICAgICAgICAgIGltYWdlUHJveHk6IFwiaHR0cDovL2ltYWdlLnJ1bmVzdG9uZS5hY2FkZW15OjgwODAvMzIweFwiLFxuICAgICAgICAgICAgaW5wdXRmdW5UYWtlc1Byb21wdDogdHJ1ZSxcbiAgICAgICAgICAgIGpzb25wU2l0ZXM6IFtcImh0dHBzOi8vaXR1bmVzLmFwcGxlLmNvbVwiXSxcbiAgICAgICAgfSk7XG4gICAgICAgIFNrLmRpdmlkID0gdGhpcy5kaXZpZDtcbiAgICAgICAgU2subG9nUmVzdWx0cyA9IGxvZ1Jlc3VsdHM7XG5cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5kaXZpZCx0aGlzLmNvZGUpO1xuXG4gICAgICAgIGlmICh0aGlzLmdyYWRlcmFjdGl2ZSAmJiB0aGlzLm91dGVyRGl2LmNsb3Nlc3QoXCIubG9hZGluZ1wiKSkge1xuICAgICAgICAgICAgU2suZ3JhZGVDb250YWluZXIgPSB0aGlzLm91dGVyRGl2LmNsb3Nlc3QoXCIubG9hZGluZ1wiKS5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFNrLmdyYWRlQ29udGFpbmVyID0gdGhpcy5kaXZpZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFRpbWVMaW1pdCgpO1xuICAgICAgICAoU2suVHVydGxlR3JhcGhpY3MgfHwgKFNrLlR1cnRsZUdyYXBoaWNzID0ge30pKS50YXJnZXQgPSB0aGlzLmdyYXBoaWNzO1xuICAgICAgICBTay5jYW52YXMgPSB0aGlzLmdyYXBoaWNzLmlkOyAvL3RvZG86IGdldCByaWQgb2YgdGhpcyBoZXJlIGFuZCBpbiBpbWFnZVxuICAgICAgICBpZiAoIW5vVUkpIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBhd2FpdCB0aGlzLm1hbmFnZV9zY3J1YmJlcih0aGlzLnNhdmVDb2RlKTtcbiAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikub2ZmKFwic2xpZGVjaGFuZ2VcIik7XG4gICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXCJkaXNhYmxlXCIpO1xuICAgICAgICAgICAgJCh0aGlzLm91dERpdikuc2hvdyh7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDcwMCxcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgU2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2UoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTay5pbXBvcnRNYWluV2l0aEJvZHkoXCI8c3RkaW4+XCIsIGZhbHNlLCBwcm9nLCB0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFub1VJKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVpdCkge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5vbihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2xpZGVjaGFuZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImVuYWJsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXJyTGFzdFJ1biA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5lcnJpbmZvID0gXCJzdWNjZXNzXCI7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFub1VJKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikub24oXG4gICAgICAgICAgICAgICAgICAgIFwic2xpZGVjaGFuZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZWl0LmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImVuYWJsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IGVyci50b1N0cmluZygpO1xuICAgICAgICAgICAgdGhpcy5hZGRFcnJvck1lc3NhZ2UoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmFsbFZpc3VhbGl6ZXJzICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAkLmVhY2god2luZG93LmFsbFZpc3VhbGl6ZXJzLCBmdW5jdGlvbiAoaSwgZSkge1xuICAgICAgICAgICAgICAgICAgICBlLnJlZHJhd0Nvbm5lY3RvcnMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc2FibGVJbnRlcmFjdGlvbigpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikuaGlkZSgpO1xuICAgICAgICAkKHRoaXMuY29kZURpdikuYWRkQ2xhc3MoXCJhYy1kaXNhYmxlZFwiKTtcbiAgICB9XG59XG5cbnZhciBsYW5ndWFnZUV4dGVuc2lvbnMgPSB7XG4gICAgcHl0aG9uOiBcInB5XCIsXG4gICAgaHRtbDogXCJodG1sXCIsXG4gICAgamF2YXNjcmlwdDogXCJqc1wiLFxuICAgIGphdmE6IFwiamF2YVwiLFxuICAgIHB5dGhvbjI6IFwicHlcIixcbiAgICBweXRob24zOiBcInB5XCIsXG4gICAgY3BwOiBcImNwcFwiLFxuICAgIGM6IFwiY1wiLFxuICAgIHNxbDogXCJzcWxcIixcbiAgICBvY3RhdmU6IFwibVwiLFxufTtcblxudmFyIGVycm9yVGV4dCA9IHt9O1xuXG5lcnJvclRleHQuUGFyc2VFcnJvciA9ICQuaTE4bihcIm1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlBhcnNlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfc2N0aXZlY29kZV9wYXJzZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuVHlwZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvclwiKTtcbmVycm9yVGV4dC5UeXBlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5OYW1lRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yXCIpO1xuZXJyb3JUZXh0Lk5hbWVFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlZhbHVlRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvclwiKTtcbmVycm9yVGV4dC5WYWx1ZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkF0dHJpYnV0ZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkF0dHJpYnV0ZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5Ub2tlbkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdG9rZW5fZXJyb3JcIik7XG5lcnJvclRleHQuVG9rZW5FcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5UaW1lTGltaXRFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3JcIik7XG5lcnJvclRleHQuVGltZUxpbWl0RXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3JcIik7XG5lcnJvclRleHQuRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5TeW50YXhFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvclwiKTtcbmVycm9yVGV4dC5TeW50YXhFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuSW5kZXhFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yXCIpO1xuZXJyb3JUZXh0LkluZGV4RXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuVVJJRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV91cmlfZXJyb3JcIik7XG5lcnJvclRleHQuVVJJRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV91cmlfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkltcG9ydEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yXCIpO1xuZXJyb3JUZXh0LkltcG9ydEVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5SZWZlcmVuY2VFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvclwiKTtcbmVycm9yVGV4dC5SZWZlcmVuY2VFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuWmVyb0RpdmlzaW9uRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yXCIpO1xuZXJyb3JUZXh0Llplcm9EaXZpc2lvbkVycm9yRml4ID0gJC5pMThuKFxuICAgIFwibXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvcl9maXhcIlxuKTtcbmVycm9yVGV4dC5SYW5nZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3JcIik7XG5lcnJvclRleHQuUmFuZ2VFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5JbnRlcm5hbEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3JcIik7XG5lcnJvclRleHQuSW50ZXJuYWxFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5JbmRlbnRhdGlvbkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3JcIik7XG5lcnJvclRleHQuSW5kZW50YXRpb25FcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5Ob3RJbXBsZW1lbnRlZEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yXCIpO1xuZXJyb3JUZXh0Lk5vdEltcGxlbWVudGVkRXJyb3JGaXggPSAkLmkxOG4oXG4gICAgXCJtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3JfZml4XCJcbik7XG5lcnJvclRleHQuS2V5RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3JcIik7XG5lcnJvclRleHQuS2V5RXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkFzc2VydGlvbkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkFzc2VydGlvbkVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yX2ZpeFwiKTtcblxuU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsID0gZnVuY3Rpb24gKHRhcmdldCwgcmVwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5zcGxpdCh0YXJnZXQpLmpvaW4ocmVwbGFjZW1lbnQpO1xufTtcbiIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyeXRob25BY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgb3B0cy5hbGlnblZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5weXRob24zX2ludGVycHJldGVyID0gJChvcmlnKS5kYXRhKFwicHl0aG9uM19pbnRlcnByZXRlclwiKTtcbiAgICAgICAgdGhpcy5vdXRwdXRfaGVpZ2h0ID0gJChvcmlnKS5kYXRhKFwib3V0cHV0X2hlaWdodFwiKTtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikudGV4dChcIlJlbmRlclwiKTtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodGhpcy5jb2RlKTtcbiAgICB9XG5cbiAgICBhc3luYyBydW5Qcm9nKCkge1xuICAgICAgICB2YXIgcHJvZyA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKHRydWUpO1xuICAgICAgICBsZXQgc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcIlwiKTtcbiAgICAgICAgaWYgKCF0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgICAgICAgICQodGhpcy5jb2RlRGl2KS5zd2l0Y2hDbGFzcyhcImNvbC1tZC0xMlwiLCBcImNvbC1tZC02XCIsIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coeyBkdXJhdGlvbjogNzAwLCBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIHByb2cgPSBgXG4gICAgICAgIDxodG1sPlxuICAgICAgICA8aGVhZD5cbiAgICAgICAgICAgIDxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vYnJ5dGhvbkAzLjkuNS9icnl0aG9uLm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgICAgICAgICAgPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9icnl0aG9uQDMuOS41L2JyeXRob25fc3RkbGliLm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgICAgICAgICAgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCIvL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9oaWdobGlnaHQuanMvMTEuMC4xL3N0eWxlcy9kZWZhdWx0Lm1pbi5jc3NcIj5cbiAgICAgICAgICAgIDxzY3JpcHQgc3JjPVwiLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaGlnaGxpZ2h0LmpzLzExLjAuMS9oaWdobGlnaHQubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgICAgICAgICA8c3R5bGU+XG4gICAgICAgICAgICAgICAgaHRtbCwgYm9keXtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBtYXgtY29udGVudDsgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC5jb250YWluZXItcHJle1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsgZm9udC1zaXplOiAxM3B4OyBsaW5lLWhlaWdodDogMS40Mjg1NzE0MzsgYm9yZGVyOiAxcHggc29saWQgI2NjYzsgYm9yZGVyLXJhZGl1czogNHB4OyB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsgYm90dG9tOiAwcHg7IHdpZHRoOiA5NCU7IG1heC13aWR0aDogOTYlOyBtYXgtaGVpZ2h0OiAyMDBweDsgb3ZlcmZsb3c6IGF1dG87IGNsZWFyOiBib3RoOyByZXNpemU6IGJvdGg7IHRyYW5zZm9ybTogc2NhbGUoMSwgLTEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmUge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogc3RpY2t5OyBwYWRkaW5nOiAxMnB4OyB0cmFuc2Zvcm06IHNjYWxlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29kZXtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvc3R5bGU+XG4gICAgICAgIDwvaGVhZD5cbiAgICAgICAgPGJvZHkgb25sb2FkPSdicnl0aG9uKCknPlxuICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSd0ZXh0L3B5dGhvbic+XG5pbXBvcnQgc3lzXG5mcm9tIGJyb3dzZXIgaW1wb3J0IGRvY3VtZW50LCBodG1sXG5pbXBvcnQgdHJhY2ViYWNrXG5wcmVFbGVtID0gaHRtbC5QUkUoKVxubG9nZ2VyID0gaHRtbC5DT0RFKClcbmNvbnRhaW5lciA9IGh0bWwuRElWKClcbmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY29udGFpbmVyLXByZVwiKVxucHJlRWxlbSA8PSBsb2dnZXJcbmNvbnRhaW5lciA8PSBwcmVFbGVtXG5jbGFzcyBOZXdPdXQ6XG4gICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOlxuICAgICAgICBsb2dnZXIuaW5uZXJIVE1MICs9IHN0cihkYXRhKVxuICAgICAgICBjb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiXG5zeXMuc3RkZXJyID0gc3lzLnN0ZG91dCA9IE5ld091dCgpXG5kZWYgbXlfZXhlYyhjb2RlKTpcbiAgICB0cnk6XG4gICAgICAgIGV4ZWMoY29kZSwgbG9jYWxzKCkpXG4gICAgICAgIG91dF9oZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dFwiKVxuICAgICAgICBvdXRfaGVhZGVyLmlubmVySFRNTCA9IFwiT3V0cHV0XCJcbiAgICAgICAgb3V0X2hlYWRlci5zdHlsZS5mb250ID0gXCIyNHB4ICdBcmlhbCdcIlxuICAgICAgICBsb2dnZXIuY2xhc3NMaXN0LmFkZChcInBsYWludGV4dFwiKVxuICAgICAgICBwcmVFbGVtLnByZXBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKVxuICAgICAgICBwcmVFbGVtLnByZXBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKVxuICAgICAgICBwcmVFbGVtLnByZXBlbmQob3V0X2hlYWRlcilcbiAgICAgICAgZG9jdW1lbnQgPD0gY29udGFpbmVyXG4gICAgZXhjZXB0IFN5bnRheEVycm9yIGFzIGVycjpcbiAgICAgICAgZXJyb3JfY2xhc3MgPSBlcnIuX19jbGFzc19fLl9fbmFtZV9fXG4gICAgICAgIGRldGFpbCA9IGVyci5hcmdzWzBdXG4gICAgICAgIGxpbmVfbnVtYmVyID0gZlwiYXQgbGluZSB7ZXJyLmxpbmVub31cIlxuICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uIGFzIGVycjpcbiAgICAgICAgZXJyb3JfY2xhc3MgPSBlcnIuX19jbGFzc19fLl9fbmFtZV9fXG4gICAgICAgIGRldGFpbCA9IGVyci5hcmdzWzBdXG4gICAgICAgIGNsLCBleGMsIHRiID0gc3lzLmV4Y19pbmZvKClcbiAgICAgICAgIyBXaGVuIGVycm9ycyBkb24ndCBzcGVjaWZ5IGEgbGluZVxuICAgICAgICB0cnk6XG4gICAgICAgICAgICBsaW5lX251bWJlciA9IGZcImF0IGxpbmUge3RyYWNlYmFjay5leHRyYWN0X3RiKHRiKVstMV1bMV19XCJcbiAgICAgICAgZXhjZXB0OlxuICAgICAgICAgICAgbGluZV9udW1iZXIgPSBcIlwiXG4gICAgZWxzZTpcbiAgICAgICAgcmV0dXJuXG4gICAgXG4gICAgIyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBhbiBFeGNlcHRpb24gd2FzIGNhdGNoZWRcbiAgICByZXN1bHQgPSBmXCIne2Vycm9yX2NsYXNzfSc6IHtkZXRhaWx9IHtsaW5lX251bWJlcn1cIlxuICAgIHByaW50KHJlc3VsdClcbiAgICAjIFN0eWxpbmcgdGhlIHByZSBlbGVtZW50IGZvciBlcnJvclxuICAgIGVycm9yX2hlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoM1wiKVxuICAgIGVycm9yX2hlYWRlci5pbm5lckhUTUwgPSBcIkVycm9yXCJcbiAgICBlcnJvcl9oZWFkZXIuc3R5bGUuZm9udCA9IFwiMjRweCAnQXJpYWwnXCJcbiAgICBwcmVFbGVtLnByZXBlbmQoZXJyb3JfaGVhZGVyKVxuICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIiNmMmRlZGVcIlxuICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXIgPSBcIjFweCBzb2xpZCAjZWJjY2QxXCJcbiAgICBsb2dnZXIuY2xhc3NMaXN0LmFkZChcInBsYWludGV4dFwiKVxuICAgIGRvY3VtZW50IDw9IGNvbnRhaW5lclxubXlfcHJvZyA9ICR7SlNPTi5zdHJpbmdpZnkocHJvZyl9XG5teV9leGVjKG15X3Byb2cpXG5kb2N1bWVudCA8PSBodG1sLlNDUklQVChcImhsanMuaGlnaGxpZ2h0QWxsKCk7XCIpXG5kb2N1bWVudCA8PSBodG1sLlNDUklQVChcImxldCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29udGFpbmVyLXByZScpOyBsZXQgaGVpZ2h0ID0gY29udGFpbmVyLm9mZnNldEhlaWdodDsgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nQm90dG9tID0gU3RyaW5nKGhlaWdodCkrJ3B4JztcIilcbiAgICAgICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8L2JvZHk+XG4gICAgICAgIDwvaHRtbD5cbiAgICAgICAgYDtcbiAgICAgICAgdGhpcy5vdXRwdXQuc3JjZG9jID0gcHJvZztcbiAgICB9XG5cbiAgICBjcmVhdGVPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHZhciBvdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJhY19vdXRwdXRcIik7XG4gICAgICAgIGlmICh0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC01XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3V0cHV0X2hlaWdodCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0X2hlaWdodCA9IFwiNDAwcHhcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3V0RGl2ID0gb3V0RGl2O1xuICAgICAgICB0aGlzLm91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJ3aGl0ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwiaGVpZ2h0XCIsICQodGhpcy5vdXRwdXRfaGVpZ2h0KSk7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcIndpZHRoXCIsIFwiMTAwJVwiKTtcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMub3V0cHV0KTtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChvdXREaXYpO1xuICAgICAgICB2YXIgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgIH1cbiAgICBlbmFibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZW5kZXJcIikpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhUTUxBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgb3B0cy5hbGlnblZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb2RlID0gJChcIjx0ZXh0YXJlYSAvPlwiKS5odG1sKHRoaXMub3JpZ0VsZW0uaW5uZXJIVE1MKS50ZXh0KCk7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoXCJSZW5kZXJcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuY29kZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgbGV0IHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBhd2FpdCB0aGlzLm1hbmFnZV9zY3J1YmJlcihzYXZlQ29kZSk7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQoXCJcIik7XG4gICAgICAgIGlmICghdGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICAgICAgICAkKHRoaXMuY29kZURpdikuc3dpdGNoQ2xhc3MoXCJjb2wtbWQtMTJcIiwgXCJjb2wtbWQtNlwiLCB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICBwcm9nID1cbiAgICAgICAgICAgIFwiPHNjcmlwdCB0eXBlPXRleHQvamF2YXNjcmlwdD53aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uKG1zZyx1cmwsbGluZSkge2FsZXJ0KG1zZysnIG9uIGxpbmU6ICcrbGluZSk7fTs8L3NjcmlwdD5cIiArXG4gICAgICAgICAgICBwcm9nO1xuICAgICAgICB0aGlzLm91dHB1dC5zcmNkb2MgPSBwcm9nO1xuICAgIH1cblxuICAgIGNyZWF0ZU91dHB1dCgpIHtcbiAgICAgICAgdGhpcy5hbGlnblZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgdmFyIG91dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImFjX291dHB1dFwiKTtcbiAgICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiY29sLW1kLTVcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXREaXYgPSBvdXREaXY7XG4gICAgICAgIHRoaXMub3V0cHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBcIndoaXRlXCIpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJoZWlnaHRcIiwgXCI0MDBweFwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICBvdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5vdXRwdXQpO1xuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKG91dERpdik7XG4gICAgICAgIHZhciBjbGVhckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoY2xlYXJEaXYpLmNzcyhcImNsZWFyXCIsIFwiYm90aFwiKTsgLy8gbmVlZGVkIHRvIG1ha2UgcGFyZW50IGRpdiByZXNpemUgcHJvcGVybHlcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjbGVhckRpdik7XG4gICAgfVxuICAgIGVuYWJsZVNhdmVMb2FkKCkge1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JlbmRlclwiKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSlNBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICB9XG4gICAgb3V0cHV0ZnVuKGEpIHtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XG4gICAgICAgIHZhciBzdHIgPSBcIltcIjtcbiAgICAgICAgaWYgKHR5cGVvZiBhID09IFwib2JqZWN0XCIgJiYgYS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFbaV0gPT0gXCJvYmplY3RcIiAmJiBhW2ldLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gKGkgPT0gMCA/IFwiXCIgOiBcIiBcIikgKyBcIltcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhW2ldLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtpXVtqXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogPT0gYVtpXS5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJdXCIgKyAoaSA9PSBhLmxlbmd0aCAtIDEgPyBcIl1cIiA6IFwiLFwiKSArIFwiXFxuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIiwgXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBzdHIgKz0gYVtpXSArIChpID09IGEubGVuZ3RoIC0gMSA/IFwiXVwiIDogXCIsIFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3RyID0gSlNPTi5zdHJpbmdpZnkoYSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgc3RyID0gYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBhc3luYyBydW5Qcm9nKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcHJvZyA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKHRydWUpO1xuICAgICAgICB2YXIgc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgdmFyIHdyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgX3RoaXMub3V0cHV0LmlubmVySFRNTCArPSBfdGhpcy5vdXRwdXRmdW4oc3RyKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHdyaXRlbG4gPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICBpZiAoIXN0cikgc3RyID0gXCJcIjtcbiAgICAgICAgICAgIF90aGlzLm91dHB1dC5pbm5lckhUTUwgKz0gX3RoaXMub3V0cHV0ZnVuKHN0cikgKyBcIjxiciAvPlwiO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpO1xuICAgICAgICAkKHRoaXMuZUNvbnRhaW5lcikucmVtb3ZlKCk7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQoXCJcIik7XG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coeyBkdXJhdGlvbjogNzAwLCBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBldmFsKHByb2cpO1xuICAgICAgICAgICAgdGhpcy5lcnJpbmZvID0gXCJzdWNjZXNzXCI7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXJyb3JNZXNzYWdlKGUpO1xuICAgICAgICAgICAgdGhpcy5lcnJpbmZvID0gZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEVycm9yTWVzc2FnZShlcnIpIHtcbiAgICAgICAgLy8gQWRkIHRoZSBlcnJvciBtZXNzYWdlXG4gICAgICAgIHRoaXMuZXJyTGFzdFJ1biA9IHRydWU7XG4gICAgICAgIHZhciBlcnJIZWFkID0gJChcIjxoMz5cIikuaHRtbChcIkVycm9yXCIpO1xuICAgICAgICB0aGlzLmVDb250YWluZXIgPSB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmVDb250YWluZXIuY2xhc3NOYW1lID0gXCJlcnJvciBhbGVydCBhbGVydC1kYW5nZXJcIjtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmlkID0gdGhpcy5kaXZpZCArIFwiX2VycmluZm9cIjtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKGVyckhlYWRbMF0pO1xuICAgICAgICB2YXIgZXJyVGV4dCA9IHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIilcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIGVyclN0cmluZyA9IGVyci50b1N0cmluZygpO1xuICAgICAgICBlcnJUZXh0LmlubmVySFRNTCA9IGVyclN0cmluZztcbiAgICAgICAgY29uc29sZS5sb2coXCJSdW50aW1lIEVycm9yOiBcIiArIGVyci50b1N0cmluZygpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuaW1wb3J0IEhhbmRzb250YWJsZSBmcm9tIFwiaGFuZHNvbnRhYmxlXCI7XG5pbXBvcnQgJ2hhbmRzb250YWJsZS9kaXN0L2hhbmRzb250YWJsZS5mdWxsLmNzcyc7XG5pbXBvcnQgaW5pdFNxbEpzIGZyb20gXCJzcWwuanMvZGlzdC9zcWwtd2FzbS5qc1wiO1xuXG52YXIgYWxsRGJ1cmxzID0ge307XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNRTEFjdGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICAvLyAgZm5wcmVmaXggc2V0cyB0aGUgcGF0aCB0byBsb2FkIHRoZSBzcWwtd2FzbS53YXNtIGZpbGVcbiAgICAgICAgdmFyIGJvb2twcmVmaXg7XG4gICAgICAgIHZhciBmbnByZWZpeDtcbiAgICAgICAgaWYgKGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XG4gICAgICAgICAgICBib29rcHJlZml4ID0gYCR7ZUJvb2tDb25maWcuYXBwfS9ib29rcy9wdWJsaXNoZWQvJHtlQm9va0NvbmZpZy5iYXNlY291cnNlfWA7XG4gICAgICAgICAgICBmbnByZWZpeCA9IGJvb2twcmVmaXggKyBcIi9fc3RhdGljXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib29rcHJlZml4ID0gXCJcIjtcbiAgICAgICAgICAgIGZucHJlZml4ID0gXCIvX3N0YXRpY1wiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgICAgICAgbG9jYXRlRmlsZTogKGZpbGVuYW1lKSA9PiBgJHtmbnByZWZpeH0vJHtmaWxlbmFtZX1gLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNob3dMYXN0ID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwic2hvd2xhc3RzcWxcIik7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgaW5pdFNxbEpzKHRoaXMuY29uZmlnKS50aGVuKGZ1bmN0aW9uIChTUUwpIHtcbiAgICAgICAgICAgIC8vIHNldCB1cCBjYWxsIHRvIGxvYWQgZGF0YWJhc2UgYXN5bmNocm9ub3VzbHkgaWYgZ2l2ZW5cbiAgICAgICAgICAgIGlmIChzZWxmLmRidXJsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuZGJ1cmwuc3RhcnRzV2l0aChcIi9fc3RhdGljXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGJ1cmwgPSBgJHtib29rcHJlZml4fSR7c2VsZi5kYnVybH1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uVGV4dCA9ICQoc2VsZi5ydW5CdXR0b24pLnRleHQoKTtcbiAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2xvYWRfZGJcIikpO1xuICAgICAgICAgICAgICAgIGlmICghKHNlbGYuZGJ1cmwgaW4gYWxsRGJ1cmxzKSkge1xuICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwibG9hZGluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgeFdhaXRGb3I6IGpRdWVyeS5EZWZlcnJlZCgpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxEYnVybHNbc2VsZi5kYnVybF0uc3RhdHVzID09IFwibG9hZGluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0ueFdhaXRGb3IuZG9uZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYiA9IG5ldyBTUUwuRGF0YWJhc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5kYlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnRleHQoYnV0dG9uVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZWxmLmRiID0gbmV3IFNRTC5EYXRhYmFzZShhbGxEYnVybHNbc2VsZi5kYnVybF0uZGIpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnRleHQoYnV0dG9uVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBodHRwczovL2dpdGh1Yi5jb20vbGVyb2NoYS9jaGlub29rLWRhdGFiYXNlL3Jhdy9tYXN0ZXIvQ2hpbm9va0RhdGFiYXNlL0RhdGFTb3VyY2VzL0NoaW5vb2tfU3FsaXRlLnNxbGl0ZVxuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIHNlbGYuZGJ1cmwsIHRydWUpO1xuICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XG4gICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1SW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYiA9IG5ldyBTUUwuRGF0YWJhc2UodUludDhBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnRleHQoYnV0dG9uVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLmRiID0gdUludDhBcnJheTtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnN0YXR1cyA9IFwicmVhZHlcIjtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnhXYWl0Rm9yLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29udGVudHMgaXMgbm93IFt7Y29sdW1uczpbJ2NvbDEnLCdjb2wyJywuLi5dLCB2YWx1ZXM6W1tmaXJzdCByb3ddLCBbc2Vjb25kIHJvd10sIC4uLl19XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VsZi5kYiA9IG5ldyBTUUwuRGF0YWJhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHJ1blByb2cobm9VSSwgbG9nUmVzdWx0cykge1xuICAgICAgICBpZiAodHlwZW9mIGxvZ1Jlc3VsdHMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nUmVzdWx0cyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSBsb2dSZXN1bHRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygbm9VSSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIG5vVUkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDbGVhciBhbnkgb2xkIHJlc3VsdHNcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICBsZXQgZGl2aWQgPSB0aGlzLmRpdmlkICsgXCJfc3FsX291dFwiO1xuICAgICAgICBsZXQgcmVzcERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRpdmlkKTtcbiAgICAgICAgaWYgKHJlc3BEaXYpIHtcbiAgICAgICAgICAgIHJlc3BEaXYucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChyZXNwRGl2KTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICAvLyBSdW4gdGhpcyBxdWVyeVxuICAgICAgICBsZXQgcXVlcnkgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7IC8vIGZhbHNlIC0tPiBEbyBub3QgaW5jbHVkZSBzdWZmaXhcbiAgICAgICAgaWYgKCF0aGlzLmRiKSB7XG4gICAgICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFxuICAgICAgICAgICAgICAgIGBFcnJvcjogRGF0YWJhc2Ugbm90IGluaXRpYWxpemVkISBEQlVSTDogJHt0aGlzLmRidXJsfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXQgPSB0aGlzLmRiLml0ZXJhdGVTdGF0ZW1lbnRzKHF1ZXJ5KTtcbiAgICAgICAgdGhpcy5yZXN1bHRzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2YgaXQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29sdW1ucyA9IHN0YXRlbWVudC5nZXRDb2x1bW5OYW1lcygpO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSEgcHJvYmFibHkgYSBTRUxFQ1RcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0YXRlbWVudC5zdGVwKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaChzdGF0ZW1lbnQuZ2V0KCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiBjb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Y291bnQ6IGRhdGEubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbnNxbCA9IHN0YXRlbWVudC5nZXROb3JtYWxpemVkU1FMKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVmaXggPSBuc3FsLnN1YnN0cigwLCA2KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuc3RlcCgpOyAvLyBleGVjdXRlIHRoZSBxdWVyeVxuICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZWN0IElOU0VSVC9VUERBVEUvREVMRVRFIHRvIGdpdmUgZnJpZW5kbHkgZmVlZGJhY2tcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gcm93cyBtb2RpZmllZCAtIHVuZm9ydHVuYXRlbHksIHRoaXMgd29uJ3QgY2F0Y2ggc3VjaCBxdWVyaWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXkgdXNlIENURXMuICBUaGVyZSBzZWVtcyB0byBiZSBubyByZWxpYWJsZSB3YXkgb2Yga25vd2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGEgU1FMaXRlIHF1ZXJ5IGFjdHVhbGx5IG1vZGlmaWVkIGRhdGEuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9PT0gXCJpbnNlcnRcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID09PSBcInVwZGF0ZVwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPT09IFwiZGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IHByZWZpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3djb3VudDogdGhpcy5kYi5nZXRSb3dzTW9kaWZpZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goeyBzdGF0dXM6IFwic3VjY2Vzc1wiIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcImZhaWx1cmVcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgc3FsOiBpdC5nZXRSZW1haW5pbmdTUUwoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFwiZmFpbHVyZVwiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiTm8gcXVlcmllcyBzdWJtaXR0ZWQuXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIodGhpcy5zYXZlQ29kZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zbGlkZWl0KSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikub24oXG4gICAgICAgICAgICAgICAgICAgIFwic2xpZGVjaGFuZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZWl0LmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwiZW5hYmxlXCIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIHVwZGF0ZSBzY3J1YmJlciAke2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXNwRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgcmVzcERpdi5pZCA9IGRpdmlkO1xuICAgICAgICB0aGlzLm91dERpdi5hcHBlbmRDaGlsZChyZXNwRGl2KTtcbiAgICAgICAgJCh0aGlzLm91dERpdikuc2hvdygpO1xuICAgICAgICAvLyBTb21ldGltZXMgd2UgZG9uJ3Qgd2FudCB0byBzaG93IGEgYnVuY2ggb2YgaW50ZXJtZWRpYXRlIHJlc3VsdHNcbiAgICAgICAgLy8gbGlrZSB3aGVuIHdlIGFyZSBpbmNsdWRpbmcgYSBidW5jaCBvZiBwcmV2aW91cyBzdGF0ZW1lbnRzIGZyb21cbiAgICAgICAgLy8gb3RoZXIgYWN0aXZlY29kZXMgSW4gdGhhdCBjYXNlIHRoZSBzaG93bGFzdHNxbCBmbGFnIGNhbiBiZSBzZXRcbiAgICAgICAgLy8gc28gd2Ugb25seSBzaG93IHRoZSBsYXN0IHJlc3VsdFxuICAgICAgICBsZXQgcmVzdWx0QXJyYXkgPSB0aGlzLnJlc3VsdHM7XG4gICAgICAgIGlmICh0aGlzLnNob3dMYXN0KSB7XG4gICAgICAgICAgICByZXN1bHRBcnJheSA9IHRoaXMucmVzdWx0cy5zbGljZSgtMSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgciBvZiByZXN1bHRBcnJheSkge1xuICAgICAgICAgICAgbGV0IHNlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgc2VjdGlvbi5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRcIik7XG4gICAgICAgICAgICByZXNwRGl2LmFwcGVuZENoaWxkKHNlY3Rpb24pO1xuICAgICAgICAgICAgaWYgKHIuc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgIGlmIChyLmNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhYmxlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZCh0YWJsZURpdik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXhIZWlnaHQgPSAzNTA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRBcnJheS5sZW5ndGggPiAxKSBtYXhIZWlnaHQgPSAyMDA7IC8vIG1heCBoZWlnaHQgc21hbGxlciBpZiBsb3RzIG9mIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlVGFibGUociwgdGFibGVEaXYsIG1heEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlQm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJtc2cgPSByLnJvd2NvdW50ICE9PSAxID8gXCIgcm93cyBcIiA6IFwiIHJvdyBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1zZyA9IFwiXCIgKyByLnJvd2NvdW50ICsgcm1zZyArIFwicmV0dXJuZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIucm93Y291bnQgPiAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IG1zZyArIFwiIChvbmx5IGZpcnN0IDEwMCByb3dzIGRpc3BsYXllZClcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtc2cgPSBtc2cgKyBcIi5cIjtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUJveC50ZXh0Q29udGVudCA9IG1zZztcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRfc3VjY2Vzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChtZXNzYWdlQm94KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHIucm93Y291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3AgPSByLm9wZXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBvcCArIChvcC5jaGFyQXQob3AubGVuZ3RoIC0gMSkgPT09IFwiZVwiID8gXCJkLlwiIDogXCJlZC5cIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBybXNnID0gci5yb3djb3VudCAhPT0gMSA/IFwiIHJvd3MgXCIgOiBcIiByb3cgXCI7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSBcIlwiICsgci5yb3djb3VudCArIHJtc2cgKyBvcDtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRfc3VjY2Vzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChtZXNzYWdlQm94KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSBcIk9wZXJhdGlvbiBzdWNjZWVkZWQuXCI7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUJveC50ZXh0Q29udGVudCA9IHIubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiYWNfc3FsX3Jlc3VsdF9mYWlsdXJlXCIpO1xuICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3cgaGFuZGxlIGF1dG9ncmFkaW5nXG4gICAgICAgIGlmICh0aGlzLnN1ZmZpeCkge1xuICAgICAgICAgICAgdGhpcy50ZXN0UmVzdWx0ID0gdGhpcy5hdXRvZ3JhZGUoXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzW3RoaXMucmVzdWx0cy5sZW5ndGggLSAxXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiZG9uZVwiKTtcbiAgICB9XG5cbiAgICBsb2dDdXJyZW50QW5zd2VyKCkge1xuICAgICAgICB0aGlzLmxvZ1J1bkV2ZW50KHtcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuZWRpdG9yLmdldFZhbHVlKCksXG4gICAgICAgICAgICBsYW5nOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgZXJyaW5mbzogdGhpcy5yZXN1bHRzW3RoaXMucmVzdWx0cy5sZW5ndGggLSAxXS5zdGF0dXMsXG4gICAgICAgICAgICB0b19zYXZlOiB0aGlzLnNhdmVDb2RlLFxuICAgICAgICAgICAgcHJlZml4OiB0aGlzLnByZXRleHQsXG4gICAgICAgICAgICBzdWZmaXg6IHRoaXMuc3VmZml4LFxuICAgICAgICAgICAgcGFydG5lcjogdGhpcy5wYXJ0bmVyLFxuICAgICAgICB9KTsgLy8gTG9nIHRoZSBydW4gZXZlbnRcblxuICAgICAgICBpZiAodGhpcy51bml0X3Jlc3VsdHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJ1bml0dGVzdFwiLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICBjb3Vyc2U6IGVCb29rQ29uZmlnLmNvdXJzZSxcbiAgICAgICAgICAgICAgICBhY3Q6IHRoaXMudW5pdF9yZXN1bHRzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJGZWVkYmFjaygpIHtcbiAgICAgICAgaWYgKHRoaXMudGVzdFJlc3VsdCkge1xuICAgICAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dCh0aGlzLnRlc3RSZXN1bHQpO1xuICAgICAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhdXRvZ3JhZGUocmVzdWx0X3RhYmxlKSB7XG4gICAgICAgIHZhciB0ZXN0cyA9IHRoaXMuc3VmZml4LnNwbGl0KC9cXG4vKTtcbiAgICAgICAgdGhpcy5wYXNzZWQgPSAwO1xuICAgICAgICB0aGlzLmZhaWxlZCA9IDA7XG4gICAgICAgIC8vIFRlc3RzIHNob3VsZCBiZSBvZiB0aGUgZm9ybVxuICAgICAgICAvLyBhc3NlcnQgcm93LGNvbCBvcGVyIHZhbHVlIGZvciBleGFtcGxlXG4gICAgICAgIC8vIGFzc2VydCA0LDQgPT0gM1xuICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgdGVzdHMgPSB0ZXN0cy5maWx0ZXIoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzLmluZGV4T2YoXCJhc3NlcnRcIikgPiAtMTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IHRlc3Qgb2YgdGVzdHMpIHtcbiAgICAgICAgICAgIGxldCB3bGlzdCA9IHRlc3Quc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgIHdsaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgbG9jID0gd2xpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgIGxldCBvcGVyID0gd2xpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IHdsaXN0LmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgbGV0IFtyb3csIGNvbF0gPSBsb2Muc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMudGVzdE9uZUFzc2VydChcbiAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgY29sLFxuICAgICAgICAgICAgICAgIG9wZXIsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgICAgICAgICAgcmVzdWx0X3RhYmxlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzdWx0ICs9IFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBjdCA9ICgxMDAgKiB0aGlzLnBhc3NlZCkgLyAodGhpcy5wYXNzZWQgKyB0aGlzLmZhaWxlZCk7XG4gICAgICAgIHBjdCA9IHBjdC50b0xvY2FsZVN0cmluZyh1bmRlZmluZWQsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyIH0pO1xuICAgICAgICByZXN1bHQgKz0gYFlvdSBwYXNzZWQgJHt0aGlzLnBhc3NlZH0gb3V0IG9mICR7XG4gICAgICAgICAgICB0aGlzLnBhc3NlZCArIHRoaXMuZmFpbGVkXG4gICAgICAgIH0gdGVzdHMgZm9yICR7cGN0fSVgO1xuICAgICAgICB0aGlzLnVuaXRfcmVzdWx0cyA9IGBwZXJjZW50OiR7cGN0fTpwYXNzZWQ6JHt0aGlzLnBhc3NlZH06ZmFpbGVkOiR7dGhpcy5mYWlsZWR9YDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdGVzdE9uZUFzc2VydChyb3csIGNvbCwgb3BlciwgZXhwZWN0ZWQsIHJlc3VsdF90YWJsZSkge1xuICAgICAgICAvLyBtYWtlIHN1cmUgcm93IGFuZCBjb2wgYXJlIGluIGJvdW5kc1xuICAgICAgICBsZXQgYWN0dWFsO1xuICAgICAgICBsZXQgb3V0cHV0ID0gXCJcIjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFjdHVhbCA9IHJlc3VsdF90YWJsZS52YWx1ZXNbcm93XVtjb2xdO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgRmFpbGVkIE5vdCBlbm91Z2ggZGF0YSB0byBjaGVjayByb3cgJHtyb3d9IG9yIGNvbHVtbiAke2NvbH1gO1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVyYXRvcnMgPSB7XG4gICAgICAgICAgICBcIj09XCI6IGZ1bmN0aW9uIChvcGVyYW5kMSwgb3BlcmFuZDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmFuZDEgPT0gb3BlcmFuZDI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIhPVwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxICE9IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiPlwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID4gb3BlcmFuZDI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCI8XCI6IGZ1bmN0aW9uIChvcGVyYW5kMSwgb3BlcmFuZDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmFuZDEgPiBvcGVyYW5kMjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGxldCByZXMgPSBvcGVyYXRvcnNbb3Blcl0oYWN0dWFsLCBleHBlY3RlZCk7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IGBQYXNzOiAke2FjdHVhbH0gJHtvcGVyfSAke2V4cGVjdGVkfSBpbiByb3cgJHtyb3d9IGNvbHVtbiAke3Jlc3VsdF90YWJsZS5jb2x1bW5zW2NvbF19YDtcbiAgICAgICAgICAgIHRoaXMucGFzc2VkKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgRmFpbGVkICR7YWN0dWFsfSAke29wZXJ9ICR7ZXhwZWN0ZWR9IGluIHJvdyAke3Jvd30gY29sdW1uICR7cmVzdWx0X3RhYmxlLmNvbHVtbnNbY29sXX1gO1xuICAgICAgICAgICAgdGhpcy5mYWlsZWQrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlVGFibGUodGFibGVEYXRhLCBjb250YWluZXIsIG1heEhlaWdodCkge1xuICAgIGxldCBkYXRhID0gdGFibGVEYXRhLnZhbHVlcztcbiAgICBsZXQgdHJpbVJvd3MgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGtsdWRnZTogbm8gY29sdW1uIGhlYWRlcnMgd2lsbCBzaG93IHVwIHVubGVzcyB3ZSBkbyB0aGlzXG4gICAgICAgIGRhdGEgPSBbdGFibGVEYXRhLmNvbHVtbnMubWFwKChlKSA9PiBudWxsKV07XG4gICAgICAgIHRyaW1Sb3dzID0gWzBdO1xuICAgIH1cblxuICAgIHZhciBob3QgPSBuZXcgSGFuZHNvbnRhYmxlKGNvbnRhaW5lciwge1xuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICB0cmltUm93czogdHJpbVJvd3MsXG4gICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgaGVpZ2h0OiBtYXhIZWlnaHQsXG4gICAgICAgIGF1dG9Sb3dTaXplOiB0cnVlLFxuICAgICAgICBhdXRvQ29sdW1uU2l6ZTogeyB1c2VIZWFkZXJzOiB0cnVlIH0sXG4gICAgICAgIHJvd0hlYWRlcnM6IGZhbHNlLFxuICAgICAgICBjb2xIZWFkZXJzOiB0YWJsZURhdGEuY29sdW1ucyxcbiAgICAgICAgZWRpdG9yOiBmYWxzZSxcbiAgICAgICAgbWF4Um93czogMTAwLFxuICAgICAgICBmaWx0ZXJzOiBmYWxzZSxcbiAgICAgICAgZHJvcGRvd25NZW51OiBmYWxzZSxcbiAgICAgICAgbGljZW5zZUtleTogXCJub24tY29tbWVyY2lhbC1hbmQtZXZhbHVhdGlvblwiLFxuICAgIH0pO1xuXG4gICAgLy8gY2FsY3VsYXRlIGFjdHVhbCBoZWlnaHQgYW5kIHJlc2l6ZVxuICAgIGxldCBhY3R1YWxIZWlnaHQgPSA0MDsgLy8gaGVhZGVyIGhlaWdodCArIHNtYWxsIG1hcmdpblxuICAgIGlmICh0YWJsZURhdGEudmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhY3R1YWxIZWlnaHQgPSBhY3R1YWxIZWlnaHQgKyBob3QuZ2V0Um93SGVpZ2h0KGkpO1xuICAgICAgICAgICAgaWYgKGFjdHVhbEhlaWdodCA+IG1heEhlaWdodCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob3QudXBkYXRlU2V0dGluZ3MoeyBoZWlnaHQ6IGFjdHVhbEhlaWdodCB9KTtcblxuICAgIHJldHVybiBob3Q7XG59XG4iLCJpbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2UuanNcIjtcblxuLy8gZnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgYXVkaW8gdG91cnNcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1ZGlvVG91ciBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGRpdmlkLCBjb2RlLCBibnVtLCBhdWRpb190ZXh0KSB7XG4gICAgICAgIC8vIEJ1ZyBGaXg6IElmIGEgY2xhc3MgZXh0ZW5kcyBhbm90aGVyIGNsYXNzLCB0aGlzIGlzIHVuZGVmaW5lZCBVTlRJTCBzdXBlciBpcyBjYWxsZWRcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hdWRpb190b3VyID0gbnVsbDtcbiAgICAgICAgdGhpcy5hdWRpb19jb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy53aW5kb3djb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpbyA9IG51bGw7XG4gICAgICAgIHRoaXMucHJldl9hdWRpbyA9IG51bGw7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RvcF9idXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLnRvdXJCdXR0b25zID0gW107XG4gICAgICAgIHRoaXMuZWxlbSA9IG51bGw7IC8vIGN1cnJlbnQgYXVkaW8gZWxlbWVudCBwbGF5aW5nXG4gICAgICAgIHRoaXMuY3VyckluZGV4ID0gbnVsbDsgLy8gY3VycmVudCBpbmRleFxuICAgICAgICB0aGlzLmxlbiA9IG51bGw7IC8vIGN1cnJlbnQgbGVuZ3RoIG9mIGF1ZGlvIGZpbGVzIGZvciB0b3VyXG4gICAgICAgIHRoaXMuYnV0dG9uQ291bnQgPSBudWxsOyAvLyBudW1iZXIgb2YgYXVkaW8gdG91ciBidXR0b25zXG4gICAgICAgIHRoaXMuYW5hbWUgPSBudWxsOyAvLyB0aGUgYXVkaW8gZmlsZSBuYW1lXG4gICAgICAgIHRoaXMuYWhhc2ggPSBudWxsOyAvLyBoYXNoIG9mIHRoZSBhdWRpbyBmaWxlIG5hbWUgdG8gdGhlIGxpbmVzIHRvIGhpZ2hsaWdodFxuICAgICAgICB0aGlzLnRoZURpdmlkID0gbnVsbDsgLy8gZGl2IGlkXG4gICAgICAgIHRoaXMuYWZpbGUgPSBudWxsOyAvLyBmaWxlIG5hbWUgZm9yIGF1ZGlvXG4gICAgICAgIHRoaXMucGxheWluZyA9IGZhbHNlOyAvLyBmbGFnIHRvIHNheSBpZiBwbGF5aW5nIG9yIG5vdFxuICAgICAgICB0aGlzLnRvdXJOYW1lID0gXCJcIjtcbiAgICAgICAgLy8gUmVwbGFjaW5nIGhhcyBiZWVuIGRvbmUgaGVyZSB0byBtYWtlIHN1cmUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBjb2RlIGFyZSBkaXNwbGF5ZWQgY29ycmVjdGx5XG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2VBbGwoXCIqZG91YmxlcSpcIiwgJ1wiJyk7XG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2VBbGwoXCIqc2luZ2xlcSpcIiwgXCInXCIpO1xuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKm9wZW4qXCIsIFwiKFwiKTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZUFsbChcIipjbG9zZSpcIiwgXCIpXCIpO1xuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKm5saW5lKlwiLCBcIjxici8+XCIpO1xuICAgICAgICB2YXIgY29kZUFycmF5ID0gY29kZS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgdmFyIGF1ZGlvX2hhc2ggPSBbXTtcbiAgICAgICAgdmFyIGJ2YWwgPSBbXTtcbiAgICAgICAgdmFyIGF0eXBlID0gYXVkaW9fdGV4dC5yZXBsYWNlQWxsKFwiKmRvdWJsZXEqXCIsICdcIicpO1xuICAgICAgICB2YXIgYXVkaW9fdHlwZSA9IGF0eXBlLnNwbGl0KFwiKmF0eXBlKlwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdWRpb190eXBlLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgYXVkaW9faGFzaFtpXSA9IGF1ZGlvX3R5cGVbaV07XG4gICAgICAgICAgICB2YXIgYXdvcmQgPSBhdWRpb190eXBlW2ldLnNwbGl0KFwiO1wiKTtcbiAgICAgICAgICAgIGJ2YWwucHVzaChhd29yZFswXSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZpcnN0ID1cbiAgICAgICAgICAgIFwiPHByZT48ZGl2IGlkPSdcIiArXG4gICAgICAgICAgICBkaXZpZCArXG4gICAgICAgICAgICBcIl9sMSc+XCIgK1xuICAgICAgICAgICAgXCIxLiAgIFwiICtcbiAgICAgICAgICAgIGNvZGVBcnJheVswXSArXG4gICAgICAgICAgICBcIjwvZGl2PlwiO1xuICAgICAgICB2YXIgbnVtX2xpbmVzID0gY29kZUFycmF5Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBudW1fbGluZXM7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPCA5KSB7XG4gICAgICAgICAgICAgICAgZmlyc3QgPVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCArXG4gICAgICAgICAgICAgICAgICAgIFwiPGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgICAgICAgICBkaXZpZCArXG4gICAgICAgICAgICAgICAgICAgIFwiX2xcIiArXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICBcIic+XCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCIuICAgXCIgK1xuICAgICAgICAgICAgICAgICAgICBjb2RlQXJyYXlbaV0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvZGl2PlwiO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgOTkpIHtcbiAgICAgICAgICAgICAgICBmaXJzdCA9XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ICtcbiAgICAgICAgICAgICAgICAgICAgXCI8ZGl2IGlkPSdcIiArXG4gICAgICAgICAgICAgICAgICAgIGRpdmlkICtcbiAgICAgICAgICAgICAgICAgICAgXCJfbFwiICtcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwiJz5cIiArXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICBcIi4gIFwiICtcbiAgICAgICAgICAgICAgICAgICAgY29kZUFycmF5W2ldICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmlyc3QgPVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCArXG4gICAgICAgICAgICAgICAgICAgIFwiPGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgICAgICAgICBkaXZpZCArXG4gICAgICAgICAgICAgICAgICAgIFwiX2xcIiArXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICBcIic+XCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCIuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgY29kZUFycmF5W2ldICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaXJzdCA9IGZpcnN0ICsgXCI8L3ByZT5cIjtcbiAgICAgICAgLy9sYXlpbmcgb3V0IHRoZSBIVE1MIGNvbnRlbnRcbiAgICAgICAgdmFyIGJjb3VudCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXVkaW9fdHlwZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBuZXdCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAgICAgbmV3QnV0dG9uLmNsYXNzTmFtZSA9IFwiYnRuIGJ0bi1zdWNjZXNzXCI7XG4gICAgICAgICAgICBuZXdCdXR0b24uaW5uZXJIVE1MID0gYnZhbFtpXS5yZXBsYWNlKC9cXFwiL2csIFwiXCIpO1xuICAgICAgICAgICAgdGhpcy50b3VyQnV0dG9ucy5wdXNoKG5ld0J1dHRvbik7XG4gICAgICAgICAgICBiY291bnQrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF1ZGlvX3RvdXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmF1ZGlvX3RvdXIuYWxpZ24gPSBcImNlbnRlclwiO1xuICAgICAgICB0aGlzLmF1ZGlvX2NvZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcbiAgICAgICAgdGhpcy53aW5kb3djb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy53aW5kb3djb2RlLmFsaWduID0gXCJsZWZ0XCI7XG4gICAgICAgICQodGhpcy53aW5kb3djb2RlKS5odG1sKGZpcnN0KTtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgIHRoaXMucHJldl9hdWRpbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tZmFzdC1iYWNrd2FyZFwiO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8uY2xhc3NOYW1lID1cbiAgICAgICAgICAgIFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1zdGVwLWJhY2t3YXJkXCI7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID0gXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCI7XG4gICAgICAgIHRoaXMubmV4dF9hdWRpby5jbGFzc05hbWUgPVxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXN0ZXAtZm9yd2FyZFwiO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8uY2xhc3NOYW1lID1cbiAgICAgICAgICAgIFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1mYXN0LWZvcndhcmRcIjtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBcImhlaWdodDogMjJweDsgd2lkdGg6IDI1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXJpZ2h0OjJweDtcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBcImhlaWdodDogMjJweDsgd2lkdGg6IDI1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXJpZ2h0OjJweDtcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0OiAyMnB4OyB3aWR0aDogMjVweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tcmlnaHQ6MnB4O1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8ubmFtZSA9IFwiZmlyc3RfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLm5hbWUgPSBcInByZXZfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5uYW1lID0gXCJwYXVzZV9hdWRpb1wiO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8ubmFtZSA9IFwibmV4dF9hdWRpb1wiO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8ubmFtZSA9IFwibGFzdF9hdWRpb1wiO1xuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLnRpdGxlID0gXCJQbGF5IGZpcnN0IGF1ZGlvIGluIHRvdXJcIjtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnRpdGxlID0gXCJQbGF5IHByZXZpb3VzIGF1ZGlvIGluIHRvdXJcIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby50aXRsZSA9IFwiUGF1c2UgY3VycmVudCBhdWRpb1wiO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8udGl0bGUgPSBcIlBsYXkgbmV4dCBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMubGFzdF9hdWRpby50aXRsZSA9IFwiUGxheSBsYXN0IGF1ZGlvIGluIHRvdXJcIjtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiUGxheSBmaXJzdCBhdWRpbyBpbiB0b3VyXCIpO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICBcIlBsYXkgcHJldmlvdXMgYXVkaW8gaW4gdG91clwiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIlBhdXNlIGF1ZGlvXCIpO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIlBsYXkgbmV4dCBhdWRpbyBpbiB0b3VyXCIpO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIlBsYXkgbGFzdCBhdWRpbyBpbiB0b3VyXCIpO1xuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubmV4dF9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubGFzdF9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5zdGF0dXMuY2xhc3NOYW1lID0gXCJhbGVydCBhbGVydC1pbmZvXCI7XG4gICAgICAgIHRoaXMuc3RhdHVzLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiZGlzcGxheTogbm9uZTtcIik7XG4gICAgICAgIHRoaXMuc3RvcF9idXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uLmNsYXNzTmFtZSA9IFwiYnRuIGJ0bi1kZWZhdWx0XCI7XG4gICAgICAgIHRoaXMuc3RvcF9idXR0b24uaW5uZXJIVE1MID0gXCJTdG9wIHRvdXJcIjtcbiAgICAgICAgJCh0aGlzLmF1ZGlvX3RvdXIpLmFwcGVuZChcbiAgICAgICAgICAgIHRoaXMuYXVkaW9fY29kZSxcbiAgICAgICAgICAgIHRoaXMud2luZG93Y29kZSxcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSxcbiAgICAgICAgICAgIHRoaXMuZmlyc3RfYXVkaW8sXG4gICAgICAgICAgICB0aGlzLnByZXZfYXVkaW8sXG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIiksXG4gICAgICAgICAgICB0aGlzLnRvdXJCdXR0b25zLFxuICAgICAgICAgICAgdGhpcy5zdG9wX2J1dHRvblxuICAgICAgICApO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuYWNfY29kZV9kaXZcIikuYXBwZW5kKHRoaXMuYXVkaW9fdG91cik7XG4gICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19jb2RlX2RpdlwiKS5jc3MoXCJ3aWR0aFwiLCBcIjEwMCVcIik7XG4gICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5Db2RlTWlycm9yLmNtLXMtZGVmYXVsdC51aS1yZXNpemFibGVcIikuaGlkZSgpO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuYWNfb3B0LmJ0bi5idG4tZGVmYXVsdDpsYXN0LWNoaWxkXCIpLmhpZGUoKTtcbiAgICAgICAgJCh0aGlzLnN0b3BfYnV0dG9uKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcIkF1ZGlvXCIsXG4gICAgICAgICAgICAgICAgICAgIGFjdDogXCJjbG9zZVdpbmRvd1wiLFxuICAgICAgICAgICAgICAgICAgICBkaXZfaWQ6IGRpdmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICQodGhpcy5hdWRpb190b3VyKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgICAgICBcIiNcIiArIGRpdmlkICsgXCIgLkNvZGVNaXJyb3IuY20tcy1kZWZhdWx0LnVpLXJlc2l6YWJsZVwiXG4gICAgICAgICAgICAgICAgKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX29wdC5idG4uYnRuLWRlZmF1bHQ6bGFzdC1jaGlsZFwiKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX2NvZGVfZGl2XCIpLmNzcyhcIndpZHRoXCIsIFwiXCIpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgICQodGhpcy50b3VyQnV0dG9uc1swXSkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyKGRpdmlkLCBhdWRpb19oYXNoWzBdLCBiY291bnQpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgICQodGhpcy50b3VyQnV0dG9uc1sxXSkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyKGRpdmlkLCBhdWRpb19oYXNoWzFdLCBiY291bnQpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgICQodGhpcy50b3VyQnV0dG9uc1syXSkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyKGRpdmlkLCBhdWRpb19oYXNoWzJdLCBiY291bnQpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgICQodGhpcy50b3VyQnV0dG9uc1szXSkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyKGRpdmlkLCBhdWRpb19oYXNoWzNdLCBiY291bnQpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgICQodGhpcy50b3VyQnV0dG9uc1s0XSkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyKGRpdmlkLCBhdWRpb19oYXNoWzRdLCBiY291bnQpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIC8vIGhhbmRsZSB0aGUgY2xpY2sgdG8gZ28gdG8gdGhlIG5leHQgYXVkaW9cbiAgICAgICAgJCh0aGlzLmZpcnN0X2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXVkaW8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZBdWRpbygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIC8vIGhhbmRsZSB0aGUgY2xpY2sgdG8gcGF1c2Ugb3IgcGxheSB0aGUgYXVkaW9cbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhdXNlQW5kUGxheUF1ZGlvKGRpdmlkKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRBdWRpbygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIC8vIGhhbmRsZSB0aGUgY2xpY2sgdG8gZ28gdG8gdGhlIG5leHQgYXVkaW9cbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdEF1ZGlvKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gbWFrZSB0aGUgaW1hZ2UgYnV0dG9ucyBsb29rIGRpc2FibGVkXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgIH1cbiAgICB0b3VyKGRpdmlkLCBhdWRpb190eXBlLCBiY291bnQpIHtcbiAgICAgICAgLy8gc2V0IGdsb2JhbHNcbiAgICAgICAgdGhpcy5idXR0b25Db3VudCA9IGJjb3VudDtcbiAgICAgICAgdGhpcy50aGVEaXZpZCA9IGRpdmlkO1xuICAgICAgICB0aGlzLnN0YXR1cy5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luLXRvcDogN3B4OyBtYXJnaW4tYm90dG9tOiAzcHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgLy8gZW5hYmxlIHByZXYsIHBhdXNlL3BsYXkgYW5kIG5leHQgYnV0dG9ucyBhbmQgbWFrZSB2aXNpYmxlXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLmZpcnN0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDEuMCk7XG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDEuMCk7XG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMubmV4dF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAvLyBkaXNhYmxlIHRvdXIgYnV0dG9uc1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJjb3VudDsgaSsrKVxuICAgICAgICAgICAgJCh0aGlzLnRvdXJCdXR0b25zW2ldKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgdmFyIGF0eXBlID0gYXVkaW9fdHlwZS5zcGxpdChcIjtcIik7XG4gICAgICAgIHZhciBuYW1lID0gYXR5cGVbMF0ucmVwbGFjZUFsbCgnXCInLCBcIiBcIik7XG4gICAgICAgIHRoaXMudG91ck5hbWUgPSBuYW1lO1xuICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3N0YXJ0aW5nXCIsIG5hbWUpKTtcbiAgICAgICAgLy9sb2cgdG91ciB0eXBlIHRvIGRiXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHsgZXZlbnQ6IFwiQXVkaW9cIiwgYWN0OiBuYW1lLCBkaXZfaWQ6IGRpdmlkIH0pO1xuICAgICAgICB2YXIgbWF4ID0gYXR5cGUubGVuZ3RoO1xuICAgICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgICAgdGhpcy5haGFzaCA9IFtdO1xuICAgICAgICB0aGlzLmFuYW1lID0gW107XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBtYXggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0ZW1wID0gYXR5cGVbaV0uc3BsaXQoXCI6XCIpO1xuICAgICAgICAgICAgdmFyIHRlbXBfbGluZSA9IHRlbXBbMF07XG4gICAgICAgICAgICB2YXIgdGVtcF9hbmFtZSA9IHRlbXBbMV07XG4gICAgICAgICAgICB2YXIgYWtleSA9IHRlbXBfYW5hbWUuc3Vic3RyaW5nKDEsIHRlbXBfYW5hbWUubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBsbnVtcyA9IHRlbXBfbGluZS5zdWJzdHJpbmcoMSwgdGVtcF9saW5lLmxlbmd0aCk7XG4gICAgICAgICAgICAvL2FsZXJ0KFwiYWtleTpcIitha2V5K1wibG51bTpcIitsbnVtcyk7XG4gICAgICAgICAgICAvLyBzdHIrPVwiPGF1ZGlvIGlkPVwiK2FrZXkrXCIgcHJlbG9hZD0nYXV0byc+PHNvdXJjZSBzcmM9J2h0dHA6Ly9pY2Utd2ViLmNjLmdhdGVjaC5lZHUvY2UyMS9hdWRpby9cIitcbiAgICAgICAgICAgIC8vIGFrZXkrXCIubXAzJyB0eXBlPSdhdWRpby9tcGVnJz48c291cmNlIHNyYz0naHR0cDovL2ljZS13ZWIuY2MuZ2F0ZWNoLmVkdS9jZTIxL2F1ZGlvL1wiK2FrZXkrXG4gICAgICAgICAgICAvLyBcIi5vZ2cnIHR5cGU9J2F1ZGlvL29nZyc+WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGF1ZGlvIHRhZzwvYXVkaW8+XCI7XG4gICAgICAgICAgICAvL3ZhciBkaXIgPVxuICAgICAgICAgICAgLy8gICAgXCJodHRwOi8vbWVkaWEuaW50ZXJhY3RpdmVweXRob24ub3JnL1wiICtcbiAgICAgICAgICAgIC8vICAgIGVCb29rQ29uZmlnLmJhc2Vjb3Vyc2UudG9Mb3dlckNhc2UoKSArXG4gICAgICAgICAgICAvLyAgICBcIi9hdWRpby9cIjtcbiAgICAgICAgICAgIHZhciBkaXIgPSBcIi4uL19zdGF0aWMvYXVkaW8vXCJcbiAgICAgICAgICAgIHN0ciArPSBcIjxhdWRpbyBpZD1cIiArIGFrZXkgKyBcIiBwcmVsb2FkPSdhdXRvJyA+XCI7XG4gICAgICAgICAgICBzdHIgKz0gXCI8c291cmNlIHNyYz0nXCIgKyBkaXIgKyBha2V5ICsgXCIud2F2JyB0eXBlPSdhdWRpby93YXYnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLm1wMycgdHlwZT0nYXVkaW8vbXBlZyc+XCI7XG4gICAgICAgICAgICBzdHIgKz0gXCI8c291cmNlIHNyYz0nXCIgKyBkaXIgKyBha2V5ICsgXCIud2F2JyB0eXBlPSdhdWRpby93YXYnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLm1wMycgdHlwZT0nYXVkaW8vbXBlZyc+XCI7XG4gICAgICAgICAgICBzdHIgKz0gXCI8YnIgLz5Zb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYXVkaW8gdGFnPC9hdWRpbz5cIjtcbiAgICAgICAgICAgIHRoaXMuYWhhc2hbYWtleV0gPSBsbnVtcztcbiAgICAgICAgICAgIHRoaXMuYW5hbWUucHVzaChha2V5KTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMuYXVkaW9fY29kZSkuaHRtbChzdHIpO1xuICAgICAgICB0aGlzLmxlbiA9IHRoaXMuYW5hbWUubGVuZ3RoOyAvLyBzZXQgdGhlIG51bWJlciBvZiBhdWRpbyBmaWxlIGluIHRoZSB0b3VyXG4gICAgICAgIHRoaXMuY3VyckluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICB9XG4gICAgaGFuZGxlUGxheWluZygpIHtcbiAgICAgICAgdGhpcy5lbGVtLnBhdXNlKCk7XG4gICAgICAgIC8vIHVuYmluZCBjdXJyZW50IGVuZGVkXG4gICAgICAgICQoXCIjXCIgKyB0aGlzLmFmaWxlKS51bmJpbmQoXCJlbmRlZFwiKTtcbiAgICAgICAgLy8gdW5oaWdobGlnaHQgdGhlIHByZXYgbGluZXNcbiAgICAgICAgdGhpcy51bmhpZ2hsaWdodExpbmVzKFxuICAgICAgICAgICAgdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIHRoaXMuYWhhc2hbdGhpcy5hbmFtZVt0aGlzLmN1cnJJbmRleF1dXG4gICAgICAgICk7XG4gICAgfVxuICAgIGZpcnN0QXVkaW8oKSB7XG4gICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgdGhpcy5oYW5kbGVQbGF5aW5nKCk7XG4gICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgYWN0OiBcImZpcnN0XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMudGhlRGl2aWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBtb3ZlIHRvIHRoZSBmaXJzdCBhdWRpb1xuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IDA7XG4gICAgICAgIC8vIHN0YXJ0IGF0IHRoZSBmaXJzdCBhdWRpb1xuICAgICAgICB0aGlzLnBsYXlDdXJySW5kZXhBdWRpbygpO1xuICAgIH1cbiAgICBwcmV2QXVkaW8oKSB7XG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgcHJldmlvdXMgYXVkaW9cbiAgICAgICAgaWYgKHRoaXMuY3VyckluZGV4ID4gMCkge1xuICAgICAgICAgICAgLy8gaWYgYXVkaW8gaXMgdGhpcy5wbGF5aW5nIGhhbmRsZSBpdFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVQbGF5aW5nKCk7XG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJwcmV2XCIsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBtb3ZlIHRvIHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IChidXQgdGhlIGN1cnJlbnQgaW5kZXggaGFzIG1vdmVkIHRvIHRoZSBuZXh0KVxuICAgICAgICAgICAgdGhpcy5jdXJySW5kZXggPSB0aGlzLmN1cnJJbmRleCAtIDE7XG4gICAgICAgICAgICAvLyBzdGFydCBhdCB0aGUgcHJldiBhdWRpb1xuICAgICAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZXh0QXVkaW8oKSB7XG4gICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgdGhpcy5oYW5kbGVQbGF5aW5nKCk7XG4gICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgYWN0OiBcIm5leHRcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIG5vdCBhdCB0aGUgZW5kXG4gICAgICAgIGlmICh0aGlzLmN1cnJJbmRleCA8IHRoaXMubGVuIC0gMSkge1xuICAgICAgICAgICAgLy8gc3RhcnQgYXQgdGhlIG5leHQgYXVkaW9cbiAgICAgICAgICAgIHRoaXMuY3VyckluZGV4ID0gdGhpcy5jdXJySW5kZXggKyAxO1xuICAgICAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJJbmRleCA9PSB0aGlzLmxlbiAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlVG91ckVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxhc3RBdWRpbygpIHtcbiAgICAgICAgLy8gaWYgYXVkaW8gaXMgdGhpcy5wbGF5aW5nIGhhbmRsZSBpdFxuICAgICAgICB0aGlzLmhhbmRsZVBsYXlpbmcoKTtcbiAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50OiBcIkF1ZGlvXCIsXG4gICAgICAgICAgICBhY3Q6IFwibGFzdFwiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gbW92ZSB0byB0aGUgbGFzdCBhdWRpb1xuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IHRoaXMubGVuIC0gMTtcbiAgICAgICAgLy8gc3RhcnQgYXQgbGFzdFxuICAgICAgICB0aGlzLnBsYXlDdXJySW5kZXhBdWRpbygpO1xuICAgIH1cbiAgICAvLyBwbGF5IHRoZSBhdWRpbyBhdCB0aGUgY3VycmVudCBpbmRleFxuICAgIHBsYXlDdXJySW5kZXhBdWRpbygpIHtcbiAgICAgICAgLy8gc2V0IHRoaXMucGxheWluZyB0byBmYWxzZVxuICAgICAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gcGxheSB0aGUgY3VycmVudCBhdWRpbyBhbmQgaGlnaGxpZ2h0IHRoZSBsaW5lc1xuICAgICAgICB0aGlzLnBsYXlhdWRpbyh0aGlzLmN1cnJJbmRleCwgdGhpcy5hbmFtZSwgdGhpcy50aGVEaXZpZCwgdGhpcy5haGFzaCk7XG4gICAgfVxuICAgIC8vIGhhbmRsZSB0aGUgZW5kIG9mIHRoZSB0b3VyXG4gICAgaGFuZGxlVG91ckVuZCgpIHtcbiAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbChcIlRoZSBcIiArIHRoaXMudG91ck5hbWUgKyBcIiBoYXMgZW5kZWQuXCIpO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9IFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1wYXVzZVwiO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnRpdGxlID0gXCJQYXVzZSBhdWRpb1wiO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQYXVzZSBhdWRpb1wiKTtcbiAgICAgICAgJCh0aGlzLmZpcnN0X2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMubmV4dF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLmZpcnN0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMubmV4dF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgIC8vIGVuYWJsZSB0aGUgdG91ciBidXR0b25zXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5idXR0b25Db3VudDsgaisrKVxuICAgICAgICAgICAgJCh0aGlzLnRvdXJCdXR0b25zW2pdKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgfVxuICAgIC8vIG9ubHkgY2FsbCB0aGlzIG9uZSBhZnRlciB0aGUgZmlyc3QgdGltZVxuICAgIG91dGVyQXVkaW8oKSB7XG4gICAgICAgIC8vIHVuYmluZCBlbmRlZFxuICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkudW5iaW5kKFwiZW5kZWRcIik7XG4gICAgICAgIC8vIHNldCB0aGlzLnBsYXlpbmcgdG8gZmFsc2VcbiAgICAgICAgdGhpcy5wbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIC8vIHVuaGlnaGxpZ2h0IHByZXZpb3VzIGxpbmVzIGZyb20gdGhlIGxhc3QgYXVkaW9cbiAgICAgICAgdGhpcy51bmhpZ2hsaWdodExpbmVzKFxuICAgICAgICAgICAgdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIHRoaXMuYWhhc2hbdGhpcy5hbmFtZVt0aGlzLmN1cnJJbmRleF1dXG4gICAgICAgICk7XG4gICAgICAgIC8vIGluY3JlbWVudCB0aGUgdGhpcy5jdXJySW5kZXggdG8gcG9pbnQgdG8gdGhlIG5leHQgb25lXG4gICAgICAgIHRoaXMuY3VyckluZGV4Kys7XG4gICAgICAgIC8vIGlmIHRoZSBlbmQgb2YgdGhlIHRvdXIgcmVzZXQgdGhlIGJ1dHRvbnNcbiAgICAgICAgaWYgKHRoaXMuY3VyckluZGV4ID09IHRoaXMubGVuKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVRvdXJFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIG5vdCBkb25lIHlldCBzbyBwbGF5IHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIGN1cnJlbnQgaW5kZXhcbiAgICAgICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGxheSB0aGUgYXVkaW8gbm93IHRoYXQgaXQgaXMgcmVhZHlcbiAgICBwbGF5V2hlblJlYWR5KGFmaWxlLCBkaXZpZCwgYWhhc2gpIHtcbiAgICAgICAgLy8gdW5iaW5kIGN1cnJlbnRcbiAgICAgICAgJChcIiNcIiArIGFmaWxlKS51bmJpbmQoXCJjYW5wbGF5dGhyb3VnaFwiKTtcbiAgICAgICAgdGhpcy5lbGVtLmN1cnJlbnRUaW1lID0gMDtcbiAgICAgICAgdGhpcy5wbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImluIHBsYXlXaGVuUmVhZHkgXCIgKyBlbGVtLmR1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRMaW5lcyhkaXZpZCwgYWhhc2hbYWZpbGVdKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5jbGFzc05hbWUgPT09XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tcGF1c2VcIlxuICAgICAgICApIHtcbiAgICAgICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGxheWluZ1wiLCB0aGlzLnRvdXJOYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQoXCIjXCIgKyBhZmlsZSkuYmluZChcbiAgICAgICAgICAgICAgICBcImVuZGVkXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGVyQXVkaW8oKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmVsZW0ucGxheSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChcIiNcIiArIGFmaWxlKS5iaW5kKFxuICAgICAgICAgICAgICAgIFwiZW5kZWRcIixcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0ZXJBdWRpbygpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBwbGF5IHRoZSBhdWRpbyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGkgYW5kIHNldCB0aGUgZHVyYXRpb24gYW5kIGhpZ2hsaWdodCB0aGUgbGluZXNcbiAgICBwbGF5YXVkaW8oaSwgYW5hbWUsIGRpdmlkLCBhaGFzaCkge1xuICAgICAgICB0aGlzLmFmaWxlID0gYW5hbWVbaV07XG4gICAgICAgIHRoaXMuZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuYWZpbGUpO1xuICAgICAgICAvLyBpZiB0aGlzIGlzbid0IHJlYWR5IHRvIHBsYXkgeWV0IC0gbm8gZHVyYXRpb24geWV0IHRoZW4gd2FpdFxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiaW4gcGxheWF1ZGlvIFwiICsgZWxlbS5kdXJhdGlvbik7XG4gICAgICAgIGlmIChpc05hTih0aGlzLmVsZW0uZHVyYXRpb24pIHx8IHRoaXMuZWxlbS5kdXJhdGlvbiA9PSAwKSB7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIHN0YXR1c1xuICAgICAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9sb2FkaW5nX2F1ZGlvXCIpKTtcbiAgICAgICAgICAgICQoXCIjXCIgKyB0aGlzLmFmaWxlKS5iaW5kKFxuICAgICAgICAgICAgICAgIFwiY2FucGxheXRocm91Z2hcIixcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheVdoZW5SZWFkeSh0aGlzLmFmaWxlLCBkaXZpZCwgYWhhc2gpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2UgaXQgaXMgcmVhZHkgc28gcGxheSBpdFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGxheVdoZW5SZWFkeSh0aGlzLmFmaWxlLCBkaXZpZCwgYWhhc2gpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHBhdXNlIGlmIHRoaXMucGxheWluZyBhbmQgcGxheSBpZiBwYXVzZWRcbiAgICBwYXVzZUFuZFBsYXlBdWRpbyhkaXZpZCkge1xuICAgICAgICB2YXIgYnRuID0gdGhpcy5wYXVzZV9hdWRpbztcbiAgICAgICAgLy8gaWYgcGF1c2VkIGFuZCBjbGlja2VkIHRoZW4gY29udGludWUgZnJvbSBjdXJyZW50XG4gICAgICAgIGlmICh0aGlzLmVsZW0ucGF1c2VkKSB7XG4gICAgICAgICAgICAvLyBjYWxjdWFsdGUgdGhlIHRpbWUgbGVmdCB0byBwbGF5IGluIG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAodGhpcy5lbGVtLmR1cmF0aW9uIC0gdGhpcy5lbGVtLmN1cnJlbnRUaW1lKSAqIDEwMDA7XG4gICAgICAgICAgICB0aGlzLmVsZW0ucGxheSgpOyAvLyBzdGFydCB0aGUgYXVkaW8gZnJvbSBjdXJyZW50IHNwb3RcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID1cbiAgICAgICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tcGF1c2VcIjtcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSAkLmkxOG4oXG4gICAgICAgICAgICAgICAgXCJtc2dfYWN0aXZlY29kZV9wYXVzZV9jdXJyZW50X2F1ZGlvXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICBcImFyaWEtbGFiZWxcIixcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9wYXVzZV9hdWRpb1wiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGxheWluZ1wiLCB0aGlzLnRvdXJOYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiBcIkF1ZGlvXCIsXG4gICAgICAgICAgICAgICAgYWN0OiBcInBsYXlcIixcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMudGhlRGl2aWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhdWRpbyB3YXMgdGhpcy5wbGF5aW5nIHBhdXNlIGl0XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucGxheWluZykge1xuICAgICAgICAgICAgdGhpcy5lbGVtLnBhdXNlKCk7IC8vIHBhdXNlIHRoZSBhdWRpb1xuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5jbGFzc05hbWUgPSBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tcGxheVwiO1xuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby50aXRsZSA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvXCIpO1xuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGxheV9wYXVzZWRfYXVkaW9cIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2F1ZGlvX3BhdXNlZFwiLCB0aGlzLnRvdXJOYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiBcIkF1ZGlvXCIsXG4gICAgICAgICAgICAgICAgYWN0OiBcInBhdXNlXCIsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcHJvY2VzcyB0aGUgbGluZXNcbiAgICBwcm9jZXNzTGluZXMoZGl2aWQsIGxudW0sIGNvbG9yKSB7XG4gICAgICAgIHZhciBjb21tYSA9IGxudW0uc3BsaXQoXCIsXCIpO1xuICAgICAgICBpZiAoY29tbWEubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZEZvckxpbmVzKGRpdmlkLCBjb21tYVtpXSwgY29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRCYWNrZ3JvdW5kRm9yTGluZXMoZGl2aWQsIGxudW0sIGNvbG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyB1bmhpZ2hsaWdodCB0aGUgbGluZXMgLSBzZXQgdGhlIGJhY2tncm91bmQgYmFjayB0byB0cmFuc3BhcmVudFxuICAgIHVuaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGxudW0pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGluZXMoZGl2aWQsIGxudW0sIFwidHJhbnNwYXJlbnRcIik7XG4gICAgfVxuICAgIC8vIGhpZ2hsaWdodCB0aGUgbGluZXMgLSBzZXQgdGhlIGJhY2tncm91bmQgdG8gYSB5ZWxsb3cgY29sb3JcbiAgICBoaWdobGlnaHRMaW5lcyhkaXZpZCwgbG51bSkge1xuICAgICAgICB0aGlzLnByb2Nlc3NMaW5lcyhkaXZpZCwgbG51bSwgXCIjZmZmZjk5XCIpO1xuICAgIH1cbiAgICAvLyBzZXQgdGhlIGJhY2tncm91bmQgdG8gdGhlIHBhc3NlZCBjb2xvclxuICAgIHNldEJhY2tncm91bmRGb3JMaW5lcyhkaXZpZCwgbG51bSwgY29sb3IpIHtcbiAgICAgICAgdmFyIGh5cGhlbiA9IGxudW0uc3BsaXQoXCItXCIpO1xuICAgICAgICB2YXIgc3RyO1xuICAgICAgICAvLyBpZiBhIHJhbmdlIG9mIGxpbmVzXG4gICAgICAgIGlmIChoeXBoZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcGFyc2VJbnQoaHlwaGVuWzBdKTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBwYXJzZUludChoeXBoZW5bMV0pICsgMTtcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7XG4gICAgICAgICAgICAgICAgLy9hbGVydChrKTtcbiAgICAgICAgICAgICAgICBzdHIgPSBcIiNcIiArIGRpdmlkICsgXCJfbFwiICsgaztcbiAgICAgICAgICAgICAgICBpZiAoJChzdHIpLnRleHQoKSAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICQoc3RyKS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIGNvbG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8kKHN0cikuZWZmZWN0KFwiaGlnaGxpZ2h0XCIse30sKGR1cioxMDAwKSs0NTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vYWxlcnQobG51bSk7XG4gICAgICAgICAgICBzdHIgPSBcIiNcIiArIGRpdmlkICsgXCJfbFwiICsgbG51bTtcbiAgICAgICAgICAgICQoc3RyKS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIGNvbG9yKTtcbiAgICAgICAgICAgIC8vJChzdHIpLmVmZmVjdChcImhpZ2hsaWdodFwiLHt9LChkdXIqMTAwMCkrNDUwMCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJ2YXIgdGVzdFN0cmluZyA9IGBTdGFydGluZyBUZXN0c1xuRXhwZWN0ZWQ6IEFuc3dlciAgICAgICAgICAgICAgICAgICBBY3R1YWw6IEFuc3dlciAgICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBtZXRob2QgcHJpbnRBbnN3ZXIoKSAgICAgICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRXhwZWN0ZWQ6IDYgbGluZShzKSBvZiB0ZXh0ICAgICAgICBBY3R1YWw6IDAgbGluZShzKSBvZiB0ZXh0ICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBtYWluIG1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NlZDogZmFsc2VcbkhlbGxvIFdvcmxkXG5FeHBlY3RlZDogU3RyaW5nIFN0cmluZyAgICAgICAgICAgIEFjdHVhbDogU3RyaW5nIFN0cmluZyAgICAgICAgICAgIE1lc3NhZ2U6IENoZWNraW5nIEluc3RhbmNlIFZhcmlhYmxlIFR5cGUocykgICAgICAgICAgICAgICAgUGFzc2VkOiB0cnVlXG5FeHBlY3RlZDogUXVlc3Rpb24gICAgICAgICAgICAgICAgIEFjdHVhbDogUXVlc3Rpb24gICAgICAgICAgICAgICAgIE1lc3NhZ2U6IENoZWNraW5nIG1ldGhvZCBwcmludFF1ZXN0aW9uKCkgICAgICAgICAgICAgICAgICAgUGFzc2VkOiB0cnVlXG5EZWJ1Z2dpbmcgb3V0cHV0XG5Nb3JlIGRlYnVnIG91dHB1dFxuRXhwZWN0ZWQ6IDIgUHJpdmF0ZSAgICAgICAgICAgICAgICBBY3R1YWw6IDIgUHJpdmF0ZSAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBQcml2YXRlIEluc3RhbmNlIFZhcmlhYmxlKHMpICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRXhwZWN0ZWQ6IHBhc3MgICAgICAgICAgICAgICAgICAgICBBY3R1YWw6IHBhc3MgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRXhwZWN0ZWQ6IGZhaWwgICAgICAgICAgICAgICAgICAgICBBY3R1YWw6IGZhaWwgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBkZWZhdWx0IGNvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRW5kaW5nIFRlc3RzXG5Zb3UgZ290IDYgb3V0IG9mIDcgY29ycmVjdC4gODUuNzElYDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSlVuaXRUZXN0UGFyc2VyIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXQsIHBhcmVudElkKSB7XG4gICAgICAgIGxldCBwYXR0ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgIFwiRXhwZWN0ZWQ6XFxcXHMrKC4qPylBY3R1YWw6XFxcXHMrKC4qPylNZXNzYWdlOlxcXFxzKyguKj8pUGFzc2VkOlxcXFxzKyh0cnVlfGZhbHNlKVwiLFxuICAgICAgICAgICAgXCJnXCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy50ZXh0UmVzdWx0cyA9IFwiXCI7XG4gICAgICAgIGxldCBtYXRjaGVzID0gb3V0cHV0Lm1hdGNoQWxsKHBhdHQpO1xuICAgICAgICBsZXQgcGFyZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5hZGQoXCJ1bml0dGVzdC1yZXN1bHRzXCIpO1xuICAgICAgICBsZXQgdGJsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRhYmxlXCIpO1xuICAgICAgICB0YmwuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGJsKTtcbiAgICAgICAgcGFyZW50LnNldEF0dHJpYnV0ZShcImlkXCIsIGAke3BhcmVudElkfV91bml0X3Jlc3VsdHNgKTtcbiAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyXCIpO1xuICAgICAgICB0ci5pbm5lckhUTUwgPVxuICAgICAgICAgICAgJzx0aCBjbGFzcz1cImFjLWZlZWRiYWNrXCI+UmVzdWx0PC90aD48dGggY2xhc3M9XCJhYy1mZWVkYmFja1wiPkV4cGVjdGVkPC90aD48dGggY2xhc3M9XCJhYy1mZWVkYmFja1wiPkFjdHVhbDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5Ob3RlczwvdGg+JztcbiAgICAgICAgdGJsLmFwcGVuZENoaWxkKHRyKTtcbiAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBsZXQgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidHJcIik7XG4gICAgICAgICAgICBsZXQgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGRcIik7XG4gICAgICAgICAgICB0ZC5jbGFzc0xpc3QuYWRkKFwiYWMtZmVlZGJhY2tcIik7XG4gICAgICAgICAgICBpZiAobWF0Y2hbbWF0Y2gubGVuZ3RoIC0gMV0gPT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICB0ZC5pbm5lckhUTUwgPSBcIlBhc3NcIjtcbiAgICAgICAgICAgICAgICB0ZC5zdHlsZSA9XG4gICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogcmdiKDEzMSwgMjExLCAxMzApOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRkLmlubmVySFRNTCA9IFwiRmFpbFwiO1xuICAgICAgICAgICAgICAgIHRkLnN0eWxlID1cbiAgICAgICAgICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjIyLCAxNDIsIDE1MCk7IHRleHQtYWxpZ246IGNlbnRlcjtcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyLmFwcGVuZENoaWxkKHRkKTtcbiAgICAgICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG1hdGNoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiKTtcbiAgICAgICAgICAgICAgICB0ZC5pbm5lckhUTUwgPSBtYXRjaFtpXTtcbiAgICAgICAgICAgICAgICB0ZC5jbGFzc0xpc3QuYWRkKFwiYWMtZmVlZGJhY2tcIik7XG4gICAgICAgICAgICAgICAgdHIuYXBwZW5kQ2hpbGQodGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGJsLmFwcGVuZENoaWxkKHRyKTtcbiAgICAgICAgICAgIHRoaXMudGFibGUgPSBwYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLnRleHRSZXN1bHRzICs9IG1hdGNoWzBdICsgXCJcXG5cIjtcbiAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKG1hdGNoWzBdLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWF0Y2ggPSBvdXRwdXQubWF0Y2goXG4gICAgICAgICAgICAvWW91IGdvdFxccysoXFxkKykgb3V0IG9mIChcXGQrKSBjb3JyZWN0LlxccysoXFxkK1xcLlxcZCspJS9cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShtYXRjaFswXSwgXCJcIik7XG4gICAgICAgICAgICBsZXQgcGN0U3RyaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgICBwY3RTdHJpbmcuaW5uZXJIVE1MID0gbWF0Y2hbMF07XG4gICAgICAgICAgICB0aGlzLnBjdFN0cmluZyA9IHBjdFN0cmluZztcbiAgICAgICAgICAgIHRoaXMucGN0ID0gbWF0Y2hbM107XG4gICAgICAgICAgICB0aGlzLnBhc3NlZCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgdGhpcy5mYWlsZWQgPSBtYXRjaFsyXSAtIG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKFwiU3RhcnRpbmcgVGVzdHNcIiwgXCJcIik7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKFwiRW5kaW5nIFRlc3RzXCIsIFwiXCIpO1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoLyg8YnI+KSsvZywgXCI8YnI+XCIpO1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZUFsbChcIiZsdDtpbWdcIiwgXCI8aW1nXCIpO1xuICAgICAgICB0aGlzLnN0ZG91dCA9IG91dHB1dDtcbiAgICB9XG59XG5cbi8vIGxldCB4ID0gbmV3IFJlc3VsdHNUb1RhYmxlKHRlc3RTdHJpbmcpO1xuLy8gY29uc29sZS5sb2coeC5zdGRvdXQpO1xuLy8gY29uc29sZS5sb2coeC50YWJsZSk7XG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuaW1wb3J0IE1ENSBmcm9tIFwiLi9tZDUuanNcIjtcbmltcG9ydCBKVW5pdFRlc3RQYXJzZXIgZnJvbSBcIi4vZXh0cmFjdFVuaXRSZXN1bHRzLmpzXCI7XG5pbXBvcnQgXCIuLi8uLi9jb2RlbGVucy9qcy9weXR1dG9yLWVtYmVkLmJ1bmRsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdmFyIG9yaWcgPSAkKG9wdHMub3JpZykuZmluZChcInRleHRhcmVhXCIpWzBdO1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy5zdGRpbiA9ICQob3JpZykuZGF0YShcInN0ZGluXCIpO1xuICAgICAgICB0aGlzLmRhdGFmaWxlID0gJChvcmlnKS5kYXRhKFwiZGF0YWZpbGVcIik7XG4gICAgICAgIHRoaXMuc291cmNlZmlsZSA9ICQob3JpZykuZGF0YShcInNvdXJjZWZpbGVcIik7XG4gICAgICAgIHRoaXMuY29tcGlsZWFyZ3MgPSB1bmVzY2FwZUh0bWwoJChvcmlnKS5kYXRhKFwiY29tcGlsZWFyZ3NcIikpO1xuICAgICAgICB0aGlzLmxpbmthcmdzID0gdW5lc2NhcGVIdG1sKCQob3JpZykuZGF0YShcImxpbmthcmdzXCIpKTtcbiAgICAgICAgdGhpcy5ydW5hcmdzID0gdW5lc2NhcGVIdG1sKCQob3JpZykuZGF0YShcInJ1bmFyZ3NcIikpO1xuICAgICAgICB0aGlzLmludGVycHJldGVyYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJpbnRlcnByZXRlcmFyZ3NcIikpO1xuICAgICAgICB0aGlzLkFQSV9LRVkgPSBcIjY3MDMzcFY3ZVVVdnFvMDdPSkRJVjhVWjA0OWFMRUsxXCI7XG4gICAgICAgIHRoaXMuVVNFX0FQSV9LRVkgPSB0cnVlO1xuICAgICAgICB0aGlzLkpPQkVfU0VSVkVSID0gZUJvb2tDb25maWcuam9iZWhvc3QgfHwgZUJvb2tDb25maWcuaG9zdDtcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IGVCb29rQ29uZmlnLnByb3h5dXJpX3J1bnMgfHwgXCIvcnVuZXN0b25lL3Byb3h5L2pvYmVSdW5cIjtcbiAgICAgICAgdGhpcy5qb2JlUHV0RmlsZXMgPVxuICAgICAgICAgICAgZUJvb2tDb25maWcucHJveHl1cmlfZmlsZXMgfHwgXCIvcnVuZXN0b25lL3Byb3h5L2pvYmVQdXNoRmlsZS9cIjtcbiAgICAgICAgdGhpcy5qb2JlQ2hlY2tGaWxlcyA9XG4gICAgICAgICAgICBlQm9va0NvbmZpZy5wcm94eXVyaV9maWxlcyB8fCBcIi9ydW5lc3RvbmUvcHJveHkvam9iZUNoZWNrRmlsZS9cIjtcbiAgICAgICAgLy8gVE9ETzogIHNob3VsZCBhZGQgYSBwcm9wZXIgcHV0L2NoZWNrIGluIHBhdmVtZW50LnRtcGwgYXMgdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCB3aWxsIGJyZWFrIG9uIHJ1bmVzdG9uZVxuICAgICAgICB0aGlzLmRpdjJpZCA9IHt9O1xuICAgICAgICBpZiAodGhpcy5zdGRpbikge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVJbnB1dEVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNyZWF0ZUVycm9yT3V0cHV0KCk7XG4gICAgfVxuICAgIG91dHB1dGZ1bihhKSB7fVxuICAgIGNyZWF0ZUlucHV0RWxlbWVudCgpIHtcbiAgICAgICAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICBsYWJlbC5mb3IgPSB0aGlzLmRpdmlkICsgXCJfc3RkaW5cIjtcbiAgICAgICAgJChsYWJlbCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbnB1dF9wcmdcIikpO1xuICAgICAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgIGlucHV0LmlkID0gdGhpcy5kaXZpZCArIFwiX3N0ZGluXCI7XG4gICAgICAgIGlucHV0LnR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgaW5wdXQuc2l6ZSA9IFwiMzVcIjtcbiAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLnN0ZGluO1xuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgICAgIHRoaXMuc3RkaW5fZWwgPSBpbnB1dDtcbiAgICB9XG4gICAgY3JlYXRlRXJyb3JPdXRwdXQoKSB7fVxuXG4gICAgLyogIE1haW4gcnVuUHJvZyBtZXRob2QgZm9yIGxpdmVjb2RlXG4gICAgICpcbiAgICAgKi9cbiAgICBhc3luYyBydW5Qcm9nKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blNldHVwKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5zdWJtaXRUb0pvYmUoKTtcbiAgICAgICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAkLmkxOG4oYFNlcnZlciBFcnJvcjogJHtyZXMuc3RhdHVzVGV4dH1gKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcImZhaWxcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBydW5SZXN1bHRzID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0pvYmVSZXNwb25zZShydW5SZXN1bHRzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3NlcnZlcl9jb21tX2VyclwiKSArIGUudG9TdHJpbmcoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBgZmFpbDogJHtlfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwic3VjY2Vzc1wiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb3RlOlxuICAgICAqIEluIG9yZGVyIHRvIGNoZWNrIGZvciBzdXBwbGVtZW50YWwgZmlsZXMgaW4gamF2YSBhbmQgZGVhbCB3aXRoIGFzeW5jaHJvbmljaXR5XG4gICAgICogSSBzcGxpdCB0aGUgb3JpZ2luYWwgcnVuUHJvZyBpbnRvIHR3byBmdW5jdGlvbnM6IHJ1blByb2cgYW5kIHJ1blByb2dfY2FsbGJhY2tcbiAgICAgKi9cbiAgICBhc3luYyBydW5TZXR1cCgpIHtcbiAgICAgICAgdmFyIHN0ZGluO1xuICAgICAgICB2YXIgc291cmNlO1xuICAgICAgICB2YXIgc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgdmFyIHNmaWxlbWFwID0ge1xuICAgICAgICAgICAgamF2YTogXCJcIixcbiAgICAgICAgICAgIGNwcDogXCJ0ZXN0LmNwcFwiLFxuICAgICAgICAgICAgYzogXCJ0ZXN0LmNcIixcbiAgICAgICAgICAgIHB5dGhvbjM6IFwidGVzdC5weVwiLFxuICAgICAgICAgICAgcHl0aG9uMjogXCJ0ZXN0LnB5XCIsXG4gICAgICAgICAgICBvY3RhdmU6IFwib2N0YXRlc3QubVwiLFxuICAgICAgICB9O1xuICAgICAgICB2YXIgc291cmNlZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICB2YXIgdGVzdGRyaXZlcm5hbWUgPSBcIlwiO1xuICAgICAgICB2YXIgZmlsZV9jaGVja3A7XG5cbiAgICAgICAgLy8gZXh0cmFjdCB0aGUgY2xhc3MgbmFtZXMgc28gZmlsZXMgY2FuIGJlIG5hbWVkIHByb3Blcmx5XG4gICAgICAgIGlmICh0aGlzLnN1ZmZpeCAmJiB0aGlzLmxhbmd1YWdlID09IFwiamF2YVwiKSB7XG4gICAgICAgICAgICBsZXQgY2xhc3NNYXRjaCA9IG5ldyBSZWdFeHAoL3B1YmxpYyBjbGFzc1xccysoXFx3KylbXFxzK3tdLyk7XG4gICAgICAgICAgICBzb3VyY2UgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7XG4gICAgICAgICAgICBsZXQgbSA9IHNvdXJjZS5tYXRjaChjbGFzc01hdGNoKTtcbiAgICAgICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgICAgICAgc291cmNlZmlsZW5hbWUgPSBtWzFdICsgXCIuamF2YVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGJlIHVuaXQgdGVzdCBjb2RlXG4gICAgICAgICAgICBtID0gdGhpcy5zdWZmaXgubWF0Y2goY2xhc3NNYXRjaCk7XG4gICAgICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgICAgIHRlc3Rkcml2ZXJuYW1lID0gbVsxXSArIFwiLmphdmFcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvdXJjZSA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhIGlzIGNvbnZlcnRpYmxlIHRvIEJhc2U2NC4gSWYgbm90IHRoZW4gZXJyb3Igb3V0IG5vd1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYnRvYShzb3VyY2UpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhbGVydChcbiAgICAgICAgICAgICAgICBcIkVycm9yOiBCYWQgQ2hhcmFjdGVycyBpbiB0aGUgYWN0aXZlY29kZSB3aW5kb3cuIExpa2VseSBhIHF1b3RlIGNoYXJhY3RlciB0aGF0IGhhcyBiZWVuIGNvcHkvcGFzdGVkLiDwn5mBXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpO1xuXG4gICAgICAgIC8vIGFzc2VtYmxlIHBhcmFtZXRlcnMgZm9yIEpPQkVcbiAgICAgICAgdmFyIHBhcmFtbGlzdCA9IFtcbiAgICAgICAgICAgIFwiY29tcGlsZWFyZ3NcIixcbiAgICAgICAgICAgIFwibGlua2FyZ3NcIixcbiAgICAgICAgICAgIFwicnVuYXJnc1wiLFxuICAgICAgICAgICAgXCJpbnRlcnByZXRlcmFyZ3NcIixcbiAgICAgICAgICAgIFwibWVtb3J5bGltaXRcIixcbiAgICAgICAgXTtcbiAgICAgICAgdmFyIHBhcmFtb2JqID0ge307XG4gICAgICAgIGZvciAobGV0IHBhcmFtIG9mIHBhcmFtbGlzdCkge1xuICAgICAgICAgICAgaWYgKHRoaXNbcGFyYW1dKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1vYmpbcGFyYW1dID0gZXZhbCh0aGlzW3BhcmFtXSk7IC8vIG5lZWRzIGEgbGlzdFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlID09PSBcIm9jdGF2ZVwiKSB7XG4gICAgICAgICAgICBwYXJhbW9iai5tZW1vcnlsaW1pdCA9IDIwMDAwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0ZGluKSB7XG4gICAgICAgICAgICBzdGRpbiA9ICQodGhpcy5zdGRpbl9lbCkudmFsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZWZpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlZmlsZSA9IHNmaWxlbWFwW3RoaXMubGFuZ3VhZ2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgJCh0aGlzLm91dHB1dCkuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9jb21waWxpbmdfcnVubmluZ1wiKSk7XG4gICAgICAgIHZhciBmaWxlcyA9IFtdO1xuICAgICAgICB2YXIgY29udGVudCwgYmFzZTY0O1xuICAgICAgICBpZiAodGhpcy5kYXRhZmlsZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBpZHMgPSB0aGlzLmRhdGFmaWxlLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVOYW1lID0gaWRzW2ldLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZUV4dGVuc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUubGFzdEluZGV4T2YoXCIuXCIpICsgMVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGUgPT09IG51bGwgfHwgZmlsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTm8gZmlsZSB3aXRoIGdpdmVuIGlkXCIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgZmlsZSBpcyBpbiBkYlxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gdGhpcy5maWxlUmVhZGVyKGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gZmlsZS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGJlIHVuZGVmaW5lZCBhdCB0aGlzIHBvaW50IGlmIGZpbGUgaXMgYW4gaW1hZ2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZpbGVFeHRlbnNpb24gPT09IFwiamFyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBmaWxlcy5jb25jYXQodGhpcy5wYXJzZUphdmFDbGFzc2VzKGNvbnRlbnQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFtcImpwZ1wiLCBcInBuZ1wiLCBcImdpZlwiXS5pbmRleE9mKGZpbGVFeHRlbnNpb24pID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLnRvRGF0YVVSTCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NCA9IGZpbGUudG9EYXRhVVJMKFwiaW1hZ2UvXCIgKyBmaWxlRXh0ZW5zaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyaW5nKGJhc2U2NC5pbmRleE9mKFwiLFwiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBmaWxlLnNyYy5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3JjLmluZGV4T2YoXCIsXCIpICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBmaWxlTmFtZSwgY29udGVudDogYmFzZTY0IH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIGNsYXNzTmFtZSBvciB1biByZWNvZ25pemVkIGNsYXNzTmFtZSBpdCBpcyB0cmVhdGVkIGFzIGFuIGluZGl2aWR1YWwgZmlsZVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGFueSB0eXBlIG9mIGZpbGUsIC50eHQsIC5qYXZhLCAuY3N2LCBldGNcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaCh7IG5hbWU6IGZpbGVOYW1lLCBjb250ZW50OiBjb250ZW50IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBhcmUgcnVubmluZyB1bml0IHRlc3RzIHdlIG5lZWQgdG8gc3Vic3RpdHV0ZSB0aGUgdGVzdCBkcml2ZXIgZm9yIHRoZSBzdHVkZW50XG4gICAgICAgIC8vIGNvZGUgYW5kIHNlbmQgdGhlIHN0dWRlbnQgY29kZSBhcyBhIGZpbGUuICBXZSdsbCBkbyB0aGF0IGhlcmUuXG4gICAgICAgIHRoaXMuanVuaXREcml2ZXJDb2RlID0gYFxuICAgICAgICBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5KVW5pdENvcmU7XG4gICAgICAgIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJlc3VsdDtcbiAgICAgICAgaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubm90aWZpY2F0aW9uLkZhaWx1cmU7XG5cbiAgICAgICAgcHVibGljIGNsYXNzIFRlc3RSdW5uZXIge1xuICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuICAgICAgICAgICAgICAgIENvZGVUZXN0SGVscGVyLnJlc2V0RmluYWxSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IEpVbml0Q29yZS5ydW5DbGFzc2VzKCR7dGVzdGRyaXZlcm5hbWUucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgXCIuamF2YVwiLFxuICAgICAgICAgICAgICAgICAgICBcIi5jbGFzc1wiXG4gICAgICAgICAgICAgICAgKX0pO1xuICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihDb2RlVGVzdEhlbHBlci5nZXRGaW5hbFJlc3VsdHMoKSk7XG5cbiAgICAgICAgICAgICAgICBpbnQgdG90YWwgPSByZXN1bHQuZ2V0UnVuQ291bnQoKTtcbiAgICAgICAgICAgICAgICBpbnQgZmFpbHMgPSByZXN1bHQuZ2V0RmFpbHVyZUNvdW50KCk7XG4gICAgICAgICAgICAgICAgaW50IGNvcnIgID0gdG90YWwgLSBmYWlscztcbiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJZb3UgZ290IFwiICsgY29yciArIFwiIG91dCBvZiBcIiArIHRvdGFsICsgXCIgY29ycmVjdC4gXCIgKyBTdHJpbmcuZm9ybWF0KFwiJS4yZlwiLCAoMTAwLjAgKiBjb3JyIC8gdG90YWwpKSArIFwiJVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgICBpZiAodGhpcy5zdWZmaXggJiYgdGhpcy5sYW5ndWFnZSA9PSBcImphdmFcIikge1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IG5hbWU6IHNvdXJjZWZpbGVuYW1lLCBjb250ZW50OiBzb3VyY2UgfSk7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgbmFtZTogdGVzdGRyaXZlcm5hbWUsIGNvbnRlbnQ6IHRoaXMuc3VmZml4IH0pO1xuICAgICAgICAgICAgc291cmNlID0gdGhpcy5qdW5pdERyaXZlckNvZGU7XG4gICAgICAgICAgICBpZiAocGFyYW1vYmouY29tcGlsZWFyZ3MpIHtcbiAgICAgICAgICAgICAgICBwYXJhbW9iai5jb21waWxlYXJncy5wdXNoKHNvdXJjZWZpbGVuYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyYW1vYmouY29tcGlsZWFyZ3MgPSBbc291cmNlZmlsZW5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBydW5zcGVjID0ge1xuICAgICAgICAgICAgbGFuZ3VhZ2VfaWQ6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgICAgICBzb3VyY2Vjb2RlOiBzb3VyY2UsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbW9iaixcbiAgICAgICAgICAgIHNvdXJjZWZpbGVuYW1lOiB0aGlzLnNvdXJjZWZpbGUsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHN0ZGluKSB7XG4gICAgICAgICAgICBydW5zcGVjLmlucHV0ID0gc3RkaW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5qc29uX3J1bnNwZWMgPSBKU09OLnN0cmluZ2lmeSh7IHJ1bl9zcGVjOiBydW5zcGVjIH0pO1xuICAgICAgICAgICAgZmlsZV9jaGVja3AgPSBQcm9taXNlLnJlc29sdmUoXCJyZWFkeVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1bnNwZWNbXCJmaWxlX2xpc3RcIl0gPSBbXTtcbiAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcztcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IGZpbGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgdmFyIGZpbGVDb250ZW50ID0gZmlsZXNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5kaXYyaWRbZmlsZU5hbWVdID1cbiAgICAgICAgICAgICAgICAgICAgXCJydW5lc3RvbmVcIiArIE1ENShmaWxlTmFtZSArIGZpbGVDb250ZW50KTtcbiAgICAgICAgICAgICAgICBydW5zcGVjW1wiZmlsZV9saXN0XCJdLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5kaXYyaWRbZmlsZU5hbWVdLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jaGVja0ZpbGUoZmlsZXNbaV0sIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuanNvbl9ydW5zcGVjID0gSlNPTi5zdHJpbmdpZnkoeyBydW5fc3BlYzogcnVuc3BlYyB9KTtcbiAgICAgICAgICAgIHRoaXMuZGl2MmlkID0gaW5zdGFuY2UuZGl2MmlkO1xuICAgICAgICAgICAgZmlsZV9jaGVja3AgPSBQcm9taXNlLmFsbChwcm9taXNlcykuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3I6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlX2NoZWNrcDtcbiAgICB9XG5cbiAgICAvKiBTdWJtaXQgdGhlIGFzc2VtYmxlZCBqb2IgdG8gdGhlIEpPQkUgc2VydmVyIGFuZCBhd2FpdCB0aGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqL1xuICAgIGFzeW5jIHN1Ym1pdFRvSm9iZSgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmpzb25fcnVuc3BlYztcbiAgICAgICAgbGV0IGhvc3QgPSB0aGlzLkpPQkVfU0VSVkVSICsgdGhpcy5yZXNvdXJjZTtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coeyBkdXJhdGlvbjogNzAwLCBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgICQodGhpcy5lcnJEaXYpLnJlbW92ZSgpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwidmlzaWJsZVwiKTtcblxuICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICAgIFwiQ29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIFwiWC1BUEktS0VZXCI6IHRoaXMuQVBJX0tFWSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaG9zdCwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZldGNoKHJlcXVlc3QpO1xuXG4gICAgICAgIC8vLyQoXCIjXCIgKyBkaXZpZCArIFwiX2VycmluZm9cIikucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgcHJvY2Vzc0pvYmVSZXNwb25zZShyZXN1bHQpIHtcbiAgICAgICAgdmFyIGxvZ3Jlc3VsdDtcbiAgICAgICAgdmFyIG9kaXYgPSB0aGlzLm91dHB1dDtcbiAgICAgICAgdGhpcy5wYXJzZWRPdXRwdXQgPSB7fTtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICBpZiAocmVzdWx0Lm91dGNvbWUgPT09IDE1KSB7XG4gICAgICAgICAgICBsb2dyZXN1bHQgPSBcInN1Y2Nlc3NcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ3Jlc3VsdCA9IHJlc3VsdC5vdXRjb21lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXJyaW5mbyA9IGxvZ3Jlc3VsdDtcbiAgICAgICAgc3dpdGNoIChyZXN1bHQub3V0Y29tZSkge1xuICAgICAgICAgICAgY2FzZSAxNToge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkT3V0cHV0ID0gbmV3IEpVbml0VGVzdFBhcnNlcihcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0ZG91dCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXZpZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHRoaXMucGFyc2VkT3V0cHV0LnN0ZG91dCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlZE91dHB1dC5wY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZWRPdXRwdXQucGN0ID0gdGhpcy5wYXJzZWRPdXRwdXQucGFzc2VkID0gdGhpcy5wYXJzZWRPdXRwdXQuZmFpbGVkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXRfcmVzdWx0cyA9IGBwZXJjZW50OiR7dGhpcy5wYXJzZWRPdXRwdXQucGN0fTpwYXNzZWQ6JHt0aGlzLnBhcnNlZE91dHB1dC5wYXNzZWR9OmZhaWxlZDoke3RoaXMucGFyc2VkT3V0cHV0LmZhaWxlZH1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgMTE6IC8vIGNvbXBpbGVyIGVycm9yXG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3dlcmVfY29tcGlsaW5nX2VyclwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKHJlc3VsdC5jbXBpbmZvKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTI6IC8vIHJ1biB0aW1lIGVycm9yXG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHJlc3VsdC5zdGRvdXQucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGRlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKHJlc3VsdC5zdGRlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTM6IC8vIHRpbWUgbGltaXRcbiAgICAgICAgICAgICAgICAkKG9kaXYpLmh0bWwocmVzdWx0LnN0ZG91dC5yZXBsYWNlKC9cXG4vZywgXCI8YnI+XCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEpvYmVFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXhjXCIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGRlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHJlc3VsdC5zdGRlcnIucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2VydmVyX2VyclwiKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0b2RvOiBoYW5kbGUgc2VydmVyIGJ1c3kgYW5kIHRpbWVvdXQgZXJyb3JzIHRvb1xuICAgIH1cblxuICAgIHJlbmRlckZlZWRiYWNrKCkge1xuICAgICAgICBsZXQgcmRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3RoaXMuZGl2aWR9X3VuaXRfcmVzdWx0c2ApO1xuICAgICAgICBpZiAocmRpdikge1xuICAgICAgICAgICAgcmRpdi5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJzZWRPdXRwdXQgJiYgdGhpcy5wYXJzZWRPdXRwdXQudGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMub3V0RGl2LmFwcGVuZENoaWxkKHRoaXMucGFyc2VkT3V0cHV0LnRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICByZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7dGhpcy5kaXZpZH1fdW5pdF9yZXN1bHRzYCk7XG4gICAgICAgIGlmIChyZGl2KSB7XG4gICAgICAgICAgICByZGl2LmFwcGVuZENoaWxkKHRoaXMucGFyc2VkT3V0cHV0LnBjdFN0cmluZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRKb2JlRXJyb3JNZXNzYWdlKGVycikge1xuICAgICAgICB2YXIgZXJySGVhZCA9ICQoXCI8aDM+XCIpLmh0bWwoXCJFcnJvclwiKTtcbiAgICAgICAgdmFyIGVDb250YWluZXIgPSB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmVyckRpdiA9IGVDb250YWluZXI7XG4gICAgICAgIGVDb250YWluZXIuY2xhc3NOYW1lID0gXCJlcnJvciBhbGVydCBhbGVydC1kYW5nZXJcIjtcbiAgICAgICAgZUNvbnRhaW5lci5pZCA9IHRoaXMuZGl2aWQgKyBcIl9lcnJpbmZvXCI7XG4gICAgICAgIGVDb250YWluZXIuYXBwZW5kQ2hpbGQoZXJySGVhZFswXSk7XG4gICAgICAgIHZhciBlcnJUZXh0ID0gZUNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpKTtcbiAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPSBlcnI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0byBzZWUgaWYgZmlsZSBpcyBvbiBzZXJ2ZXJcbiAgICAgKiBQbGFjZXMgaXQgb24gc2VydmVyIGlmIGl0IGlzIG5vdCBvbiBzZXJ2ZXJcbiAgICAgKiBAcGFyYW0gIHtvYmplY3R7bmFtZSwgY29udGVudHN9fSBmaWxlICAgIEZpbGUgdG8gcGxhY2Ugb24gc2VydmVyXG4gICAgICogQHBhcmFtICB7ZnVuY3Rpb259IHJlc29sdmUgcHJvbWlzZSByZXNvbHZlIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtICB7ZnVuY3Rpb259IHJlamVjdCAgcHJvbWlzZSByZWplY3QgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja0ZpbGUoZmlsZSwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBmaWxlX2lkID0gdGhpcy5kaXYyaWRbZmlsZS5uYW1lXTtcbiAgICAgICAgdmFyIHJlc291cmNlID0gdGhpcy5qb2JlQ2hlY2tGaWxlcyArIGZpbGVfaWQ7XG4gICAgICAgIHZhciBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHJlc291cmNlO1xuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiSEVBRFwiLCBob3N0LCB0cnVlKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLCBcInRleHQvcGxhaW5cIik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiWC1BUEktS0VZXCIsIHRoaXMuQVBJX0tFWSk7XG4gICAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJlcnJvciBzZW5kaW5nIGZpbGVcIiArIHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICB9O1xuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3dpdGNoICh4aHIuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDg6XG4gICAgICAgICAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRmlsZSBub3Qgb24gU2VydmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2hEYXRhRmlsZShmaWxlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQwMDpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJCYWQgUmVxdWVzdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjA0OlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZpbGUgYWxyZWFkeSBvbiBTZXJ2ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlRoaXMgY2FzZSBzaG91bGQgbmV2ZXIgaGFwcGVuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQbGFjZXMgYSBmaWxlIG9uIGEgc2VydmVyXG4gICAgICovXG4gICAgcHVzaERhdGFGaWxlKGZpbGUsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZmlsZU5hbWUgPSBmaWxlLm5hbWU7XG4gICAgICAgIHZhciBleHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUuaW5kZXhPZihcIi5cIikgKyAxKTtcbiAgICAgICAgdmFyIGZpbGVfaWQgPSB0aGlzLmRpdjJpZFtmaWxlTmFtZV07XG4gICAgICAgIHZhciBjb250ZW50cyA9IGZpbGUuY29udGVudDtcbiAgICAgICAgLy8gRmlsZSB0eXBlcyBiZWluZyB1cGxvYWRlZCB0aGF0IGNvbWUgaW4gYWxyZWFkeSBpbiBiYXNlNjQgZm9ybWF0XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gW1wiamFyXCIsIFwiemlwXCIsIFwicG5nXCIsIFwianBnXCIsIFwianBlZ1wiXTtcbiAgICAgICAgdmFyIGNvbnRlbnRzYjY0O1xuICAgICAgICBpZiAoZXh0ZW5zaW9ucy5pbmRleE9mKGV4dGVuc2lvbikgPT09IC0xKSB7XG4gICAgICAgICAgICBjb250ZW50c2I2NCA9IGJ0b2EoY29udGVudHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudHNiNjQgPSBjb250ZW50cztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF0YSA9IEpTT04uc3RyaW5naWZ5KHsgZmlsZV9jb250ZW50czogY29udGVudHNiNjQgfSk7XG4gICAgICAgIHZhciByZXNvdXJjZSA9IHRoaXMuam9iZVB1dEZpbGVzICsgZmlsZV9pZDtcbiAgICAgICAgdmFyIGhvc3QgPSB0aGlzLkpPQkVfU0VSVkVSICsgcmVzb3VyY2U7XG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJQVVRcIiwgaG9zdCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC10eXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIiwgXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQVBJLUtFWVwiLCB0aGlzLkFQSV9LRVkpO1xuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3dpdGNoICh4aHIuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRm9yYmlkZGVuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDA6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQmFkIFJlcXVlc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcInN1Y2Nlc3NmdWxseSBzZW50IGZpbGUgXCIgKyB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkZpbGUgXCIgKyBmaWxlTmFtZSArXCIsIFwiICsgZmlsZV9pZCArXCIgcGxhY2VkIG9uIHNlcnZlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRoaXMgY2FzZSBzaG91bGQgbmV2ZXIgaGFwcGVuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXJyb3Igc2VuZGluZyBmaWxlXCIgKyB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICB9O1xuICAgICAgICB4aHIuc2VuZChkYXRhKTtcbiAgICB9XG5cbiAgICBhc3luYyBzaG93Q29kZWxlbnMoKSB7XG4gICAgICAgIGxldCBjbE1lc3MgPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgICBjbE1lc3MgPSBcIkJ1aWxkaW5nIHlvdXIgdmlzdWFsaXphdGlvblwiO1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5pbm5lckhUTUwgPSBjbE1lc3M7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZWxlbnNcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIHRoaXMuY2xCdXR0b24uaW5uZXJUZXh0ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuc1wiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2wgPSB0aGlzLmNvZGVsZW5zLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChjbCkge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5yZW1vdmVDaGlsZChjbCk7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLmlubmVySFRNTCA9IGNsTWVzcztcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29kZSA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKGZhbHNlKTtcbiAgICAgICAgaWYgKGNvZGUubWF0Y2goL1N5c3RlbS5leGl0LykpIHtcbiAgICAgICAgICAgIGFsZXJ0KFxuICAgICAgICAgICAgICAgIFwiU29ycnkuLi4gU3lzdGVtLmV4aXQgYnJlYWtzIHRoZSB2aXN1YWxpemVyIHRlbXBvcmFyaWx5IHJlbW92aW5nXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlKC9TeXN0ZW0uZXhpdFxcKFxcZCtcXCk7LywgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG15VmFycyA9IHt9O1xuICAgICAgICBteVZhcnMuY29kZSA9IGNvZGU7XG4gICAgICAgIG15VmFycy5sYW5nID0gdGhpcy5sYW5ndWFnZTtcbiAgICAgICAgaWYgKHRoaXMuc3RkaW4pIHtcbiAgICAgICAgICAgIG15VmFycy5zdGRpbiA9ICQodGhpcy5zdGRpbl9lbCkudmFsKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRhcmdldERpdiA9IHRoaXMuY29kZWxlbnMuaWQ7XG5cbiAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcIi9ydW5lc3RvbmUvcHJveHkvcHl0dXRvcl90cmFjZVwiLCB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkobXlWYXJzKSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGxldCB2aXMgPSBhZGRWaXN1YWxpemVyVG9QYWdlKGRhdGEsIHRhcmdldERpdiwge1xuICAgICAgICAgICAgICAgIHN0YXJ0aW5nSW5zdHJ1Y3Rpb246IDAsXG4gICAgICAgICAgICAgICAgZWRpdENvZGVCYXNlVVJMOiBudWxsLFxuICAgICAgICAgICAgICAgIGhpZGVDb2RlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYW5nOiBteVZhcnMubGFuZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbGV0IHRhcmdldERpdkVycm9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0RGl2KTtcbiAgICAgICAgICAgIHRhcmdldERpdkVycm9yLmlubmVySFRNTCA9XG4gICAgICAgICAgICAgICAgXCJTb3JyeSwgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgeW91ciB2aXN1YWxpemF0aW9uLlwiO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXQgVHJhY2UgRmFpbGVkIC0tIFwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50OiBcImNvZGVsZW5zXCIsXG4gICAgICAgICAgICBhY3Q6IFwidmlld1wiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXBlcmF0ZXMgdGV4dCBpbnRvIG11bHRpcGxlIC5qYXZhIGZpbGVzXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSB0ZXh0IFN0cmluZyB3aXRoIG11bGlwbGUgamF2YSBjbGFzc2VzIG5lZWRlZCB0byBiZSBzZXBlcmF0ZWRcbiAgICAgKiBAcmV0dXJuIHthcnJheSBvZiBvYmplY3RzfSAgLm5hbWUgZ2l2ZXMgdGhlIG5hbWUgb2YgdGhlIGphdmEgZmlsZSB3aXRoIC5qYXZhIGV4dGVuc2lvblxuICAgICAqICAgICAgICAgICAgICAgICAgIC5jb250ZW50IGdpdmVzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZVxuICAgICAqL1xuICAgIHBhcnNlSmF2YUNsYXNzZXModGV4dCkge1xuICAgICAgICB0ZXh0ID0gdGV4dC50cmltKCk7XG4gICAgICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuICAgICAgICB2YXIgc3RhY2sgPSAwO1xuICAgICAgICB2YXIgc3RhcnRJbmRleCA9IDA7XG4gICAgICAgIHZhciBjbGFzc2VzID0gW107XG4gICAgICAgIHZhciBpbXBvcnRJbmRleCA9IDA7XG4gICAgICAgIHZhciBlbmRPZkxhc3RDb21tZW50QmVmb3JlQ2xhc3NCZWdpbnMgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGFyID0gdGV4dC5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAoY2hhciA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckF0KGkpID09PSBcIi9cIikge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0ZXh0LmNoYXJBdChpKSAhPT0gXCJcXG5cIiAmJiBpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRPZkxhc3RDb21tZW50QmVmb3JlQ2xhc3NCZWdpbnMgPSBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0LmNoYXJBdChpKSA9PSBcIipcIikge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgICAgICh0ZXh0LmNoYXJBdChpKSAhPT0gXCIqXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmNoYXJBdChpICsgMSkgIT09IFwiL1wiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaSArIDEgPCB0ZXh0Lmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRPZkxhc3RDb21tZW50QmVmb3JlQ2xhc3NCZWdpbnMgPSBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0ZXh0LmNoYXJBdChpKSAhPT0gJ1wiJyAmJiBpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09IFwiJ1wiICYmIGkgPCB0ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBcIihcIikge1xuICAgICAgICAgICAgICAgIHZhciBwQ291bnQgPSAxO1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB3aGlsZSAocENvdW50ID4gMCAmJiBpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckF0KGkpID09PSBcIihcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5jaGFyQXQoaSkgPT09IFwiKVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwQ291bnQtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiB0ZXh0LmNoYXJBdChpKSA9PT0gXCJ7XCIpIHtcbiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3RhY2sgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCJ7XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2srKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckF0KGkpID09PSBcIn1cIikge1xuICAgICAgICAgICAgICAgICAgICBzdGFjay0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb3VuZCAmJiBzdGFjayA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIHZhciB3b3JkcyA9IHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhlbmRPZkxhc3RDb21tZW50QmVmb3JlQ2xhc3NCZWdpbnMsIHN0YXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgICAgICAgICAgLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB3ID0gMDsgdyA8IHdvcmRzLmxlbmd0aDsgdysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHdvcmRzW3ddO1xuICAgICAgICAgICAgICAgICAgICBpZiAod29yZHNbd10gPT09IFwiZXh0ZW5kc1wiIHx8IHdvcmRzW3ddID09PSBcImltcGxlbWVudHNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gd29yZHNbdyAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHdvcmRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudHJpbSgpICsgXCIuamF2YVwiO1xuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogdGV4dC5zdWJzdHJpbmcoaW1wb3J0SW5kZXgsIGVuZEluZGV4KSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGltcG9ydEluZGV4ID0gZW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gZW5kSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsYXNzZXM7XG4gICAgfVxufVxuZnVuY3Rpb24gdW5lc2NhcGVIdG1sKHNhZmUpIHtcbiAgICBpZiAoc2FmZSkge1xuICAgICAgICByZXR1cm4gc2FmZVxuICAgICAgICAgICAgLnJlcGxhY2UoLyZhbXA7L2csIFwiJlwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyZsdDsvZywgXCI8XCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvJmd0Oy9nLCBcIj5cIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mcXVvdDsvZywgJ1wiJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mI3gyNzsvZywgXCInXCIpO1xuICAgIH1cbn1cbiIsIi8qKlxuICpcbiAqICBNRDUgKE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSlcbiAqICBodHRwOi8vd3d3LndlYnRvb2xraXQuaW5mby9cbiAqXG4gKiovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1ENShzdHJpbmcpIHtcbiAgICBmdW5jdGlvbiBSb3RhdGVMZWZ0KGxWYWx1ZSwgaVNoaWZ0Qml0cykge1xuICAgICAgICByZXR1cm4gKGxWYWx1ZSA8PCBpU2hpZnRCaXRzKSB8IChsVmFsdWUgPj4+ICgzMiAtIGlTaGlmdEJpdHMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBBZGRVbnNpZ25lZChsWCwgbFkpIHtcbiAgICAgICAgdmFyIGxYNCwgbFk0LCBsWDgsIGxZOCwgbFJlc3VsdDtcbiAgICAgICAgbFg4ID0gbFggJiAweDgwMDAwMDAwO1xuICAgICAgICBsWTggPSBsWSAmIDB4ODAwMDAwMDA7XG4gICAgICAgIGxYNCA9IGxYICYgMHg0MDAwMDAwMDtcbiAgICAgICAgbFk0ID0gbFkgJiAweDQwMDAwMDAwO1xuICAgICAgICBsUmVzdWx0ID0gKGxYICYgMHgzZmZmZmZmZikgKyAobFkgJiAweDNmZmZmZmZmKTtcbiAgICAgICAgaWYgKGxYNCAmIGxZNCkge1xuICAgICAgICAgICAgcmV0dXJuIGxSZXN1bHQgXiAweDgwMDAwMDAwIF4gbFg4IF4gbFk4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChsWDQgfCBsWTQpIHtcbiAgICAgICAgICAgIGlmIChsUmVzdWx0ICYgMHg0MDAwMDAwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gMHhjMDAwMDAwMCBeIGxYOCBeIGxZODtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxSZXN1bHQgXiAweDQwMDAwMDAwIF4gbFg4IF4gbFk4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxSZXN1bHQgXiBsWDggXiBsWTg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBGKHgsIHksIHopIHtcbiAgICAgICAgcmV0dXJuICh4ICYgeSkgfCAofnggJiB6KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBHKHgsIHksIHopIHtcbiAgICAgICAgcmV0dXJuICh4ICYgeikgfCAoeSAmIH56KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBIKHgsIHksIHopIHtcbiAgICAgICAgcmV0dXJuIHggXiB5IF4gejtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBJKHgsIHksIHopIHtcbiAgICAgICAgcmV0dXJuIHkgXiAoeCB8IH56KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBGRihhLCBiLCBjLCBkLCB4LCBzLCBhYykge1xuICAgICAgICBhID0gQWRkVW5zaWduZWQoYSwgQWRkVW5zaWduZWQoQWRkVW5zaWduZWQoRihiLCBjLCBkKSwgeCksIGFjKSk7XG4gICAgICAgIHJldHVybiBBZGRVbnNpZ25lZChSb3RhdGVMZWZ0KGEsIHMpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBHRyhhLCBiLCBjLCBkLCB4LCBzLCBhYykge1xuICAgICAgICBhID0gQWRkVW5zaWduZWQoYSwgQWRkVW5zaWduZWQoQWRkVW5zaWduZWQoRyhiLCBjLCBkKSwgeCksIGFjKSk7XG4gICAgICAgIHJldHVybiBBZGRVbnNpZ25lZChSb3RhdGVMZWZ0KGEsIHMpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBISChhLCBiLCBjLCBkLCB4LCBzLCBhYykge1xuICAgICAgICBhID0gQWRkVW5zaWduZWQoYSwgQWRkVW5zaWduZWQoQWRkVW5zaWduZWQoSChiLCBjLCBkKSwgeCksIGFjKSk7XG4gICAgICAgIHJldHVybiBBZGRVbnNpZ25lZChSb3RhdGVMZWZ0KGEsIHMpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBJSShhLCBiLCBjLCBkLCB4LCBzLCBhYykge1xuICAgICAgICBhID0gQWRkVW5zaWduZWQoYSwgQWRkVW5zaWduZWQoQWRkVW5zaWduZWQoSShiLCBjLCBkKSwgeCksIGFjKSk7XG4gICAgICAgIHJldHVybiBBZGRVbnNpZ25lZChSb3RhdGVMZWZ0KGEsIHMpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBDb252ZXJ0VG9Xb3JkQXJyYXkoc3RyaW5nKSB7XG4gICAgICAgIHZhciBsV29yZENvdW50O1xuICAgICAgICB2YXIgbE1lc3NhZ2VMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgICB2YXIgbE51bWJlck9mV29yZHNfdGVtcDEgPSBsTWVzc2FnZUxlbmd0aCArIDg7XG4gICAgICAgIHZhciBsTnVtYmVyT2ZXb3Jkc190ZW1wMiA9XG4gICAgICAgICAgICAobE51bWJlck9mV29yZHNfdGVtcDEgLSAobE51bWJlck9mV29yZHNfdGVtcDEgJSA2NCkpIC8gNjQ7XG4gICAgICAgIHZhciBsTnVtYmVyT2ZXb3JkcyA9IChsTnVtYmVyT2ZXb3Jkc190ZW1wMiArIDEpICogMTY7XG4gICAgICAgIHZhciBsV29yZEFycmF5ID0gQXJyYXkobE51bWJlck9mV29yZHMgLSAxKTtcbiAgICAgICAgdmFyIGxCeXRlUG9zaXRpb24gPSAwO1xuICAgICAgICB2YXIgbEJ5dGVDb3VudCA9IDA7XG4gICAgICAgIHdoaWxlIChsQnl0ZUNvdW50IDwgbE1lc3NhZ2VMZW5ndGgpIHtcbiAgICAgICAgICAgIGxXb3JkQ291bnQgPSAobEJ5dGVDb3VudCAtIChsQnl0ZUNvdW50ICUgNCkpIC8gNDtcbiAgICAgICAgICAgIGxCeXRlUG9zaXRpb24gPSAobEJ5dGVDb3VudCAlIDQpICogODtcbiAgICAgICAgICAgIGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gPVxuICAgICAgICAgICAgICAgIGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gfFxuICAgICAgICAgICAgICAgIChzdHJpbmcuY2hhckNvZGVBdChsQnl0ZUNvdW50KSA8PCBsQnl0ZVBvc2l0aW9uKTtcbiAgICAgICAgICAgIGxCeXRlQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgICBsV29yZENvdW50ID0gKGxCeXRlQ291bnQgLSAobEJ5dGVDb3VudCAlIDQpKSAvIDQ7XG4gICAgICAgIGxCeXRlUG9zaXRpb24gPSAobEJ5dGVDb3VudCAlIDQpICogODtcbiAgICAgICAgbFdvcmRBcnJheVtsV29yZENvdW50XSA9XG4gICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdIHwgKDB4ODAgPDwgbEJ5dGVQb3NpdGlvbik7XG4gICAgICAgIGxXb3JkQXJyYXlbbE51bWJlck9mV29yZHMgLSAyXSA9IGxNZXNzYWdlTGVuZ3RoIDw8IDM7XG4gICAgICAgIGxXb3JkQXJyYXlbbE51bWJlck9mV29yZHMgLSAxXSA9IGxNZXNzYWdlTGVuZ3RoID4+PiAyOTtcbiAgICAgICAgcmV0dXJuIGxXb3JkQXJyYXk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV29yZFRvSGV4KGxWYWx1ZSkge1xuICAgICAgICB2YXIgV29yZFRvSGV4VmFsdWUgPSBcIlwiLFxuICAgICAgICAgICAgV29yZFRvSGV4VmFsdWVfdGVtcCA9IFwiXCIsXG4gICAgICAgICAgICBsQnl0ZSxcbiAgICAgICAgICAgIGxDb3VudDtcbiAgICAgICAgZm9yIChsQ291bnQgPSAwOyBsQ291bnQgPD0gMzsgbENvdW50KyspIHtcbiAgICAgICAgICAgIGxCeXRlID0gKGxWYWx1ZSA+Pj4gKGxDb3VudCAqIDgpKSAmIDI1NTtcbiAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAgPSBcIjBcIiArIGxCeXRlLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlID1cbiAgICAgICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZSArXG4gICAgICAgICAgICAgICAgV29yZFRvSGV4VmFsdWVfdGVtcC5zdWJzdHIoV29yZFRvSGV4VmFsdWVfdGVtcC5sZW5ndGggLSAyLCAyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV29yZFRvSGV4VmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVXRmOEVuY29kZShzdHJpbmcpIHtcbiAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoL1xcclxcbi9nLCBcIlxcblwiKTtcbiAgICAgICAgdmFyIHV0ZnRleHQgPSBcIlwiO1xuXG4gICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgc3RyaW5nLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KG4pO1xuXG4gICAgICAgICAgICBpZiAoYyA8IDEyOCkge1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+IDEyNyAmJiBjIDwgMjA0OCkge1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiA2KSB8IDE5Mik7XG4gICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgNjMpIHwgMTI4KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjID4+IDEyKSB8IDIyNCk7XG4gICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyA+PiA2KSAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgNjMpIHwgMTI4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1dGZ0ZXh0O1xuICAgIH1cblxuICAgIHZhciB4ID0gQXJyYXkoKTtcbiAgICB2YXIgaywgQUEsIEJCLCBDQywgREQsIGEsIGIsIGMsIGQ7XG4gICAgdmFyIFMxMSA9IDcsXG4gICAgICAgIFMxMiA9IDEyLFxuICAgICAgICBTMTMgPSAxNyxcbiAgICAgICAgUzE0ID0gMjI7XG4gICAgdmFyIFMyMSA9IDUsXG4gICAgICAgIFMyMiA9IDksXG4gICAgICAgIFMyMyA9IDE0LFxuICAgICAgICBTMjQgPSAyMDtcbiAgICB2YXIgUzMxID0gNCxcbiAgICAgICAgUzMyID0gMTEsXG4gICAgICAgIFMzMyA9IDE2LFxuICAgICAgICBTMzQgPSAyMztcbiAgICB2YXIgUzQxID0gNixcbiAgICAgICAgUzQyID0gMTAsXG4gICAgICAgIFM0MyA9IDE1LFxuICAgICAgICBTNDQgPSAyMTtcblxuICAgIHN0cmluZyA9IFV0ZjhFbmNvZGUoc3RyaW5nKTtcblxuICAgIHggPSBDb252ZXJ0VG9Xb3JkQXJyYXkoc3RyaW5nKTtcblxuICAgIGEgPSAweDY3NDUyMzAxO1xuICAgIGIgPSAweGVmY2RhYjg5O1xuICAgIGMgPSAweDk4YmFkY2ZlO1xuICAgIGQgPSAweDEwMzI1NDc2O1xuXG4gICAgZm9yIChrID0gMDsgayA8IHgubGVuZ3RoOyBrICs9IDE2KSB7XG4gICAgICAgIEFBID0gYTtcbiAgICAgICAgQkIgPSBiO1xuICAgICAgICBDQyA9IGM7XG4gICAgICAgIEREID0gZDtcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDBdLCBTMTEsIDB4ZDc2YWE0NzgpO1xuICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgMV0sIFMxMiwgMHhlOGM3Yjc1Nik7XG4gICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCB4W2sgKyAyXSwgUzEzLCAweDI0MjA3MGRiKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDNdLCBTMTQsIDB4YzFiZGNlZWUpO1xuICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgeFtrICsgNF0sIFMxMSwgMHhmNTdjMGZhZik7XG4gICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCB4W2sgKyA1XSwgUzEyLCAweDQ3ODdjNjJhKTtcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDZdLCBTMTMsIDB4YTgzMDQ2MTMpO1xuICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgeFtrICsgN10sIFMxNCwgMHhmZDQ2OTUwMSk7XG4gICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCB4W2sgKyA4XSwgUzExLCAweDY5ODA5OGQ4KTtcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDldLCBTMTIsIDB4OGI0NGY3YWYpO1xuICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgeFtrICsgMTBdLCBTMTMsIDB4ZmZmZjViYjEpO1xuICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgeFtrICsgMTFdLCBTMTQsIDB4ODk1Y2Q3YmUpO1xuICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgeFtrICsgMTJdLCBTMTEsIDB4NmI5MDExMjIpO1xuICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgMTNdLCBTMTIsIDB4ZmQ5ODcxOTMpO1xuICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgeFtrICsgMTRdLCBTMTMsIDB4YTY3OTQzOGUpO1xuICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgeFtrICsgMTVdLCBTMTQsIDB4NDliNDA4MjEpO1xuICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgeFtrICsgMV0sIFMyMSwgMHhmNjFlMjU2Mik7XG4gICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCB4W2sgKyA2XSwgUzIyLCAweGMwNDBiMzQwKTtcbiAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIHhbayArIDExXSwgUzIzLCAweDI2NWU1YTUxKTtcbiAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIHhbayArIDBdLCBTMjQsIDB4ZTliNmM3YWEpO1xuICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgeFtrICsgNV0sIFMyMSwgMHhkNjJmMTA1ZCk7XG4gICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCB4W2sgKyAxMF0sIFMyMiwgMHgyNDQxNDUzKTtcbiAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIHhbayArIDE1XSwgUzIzLCAweGQ4YTFlNjgxKTtcbiAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIHhbayArIDRdLCBTMjQsIDB4ZTdkM2ZiYzgpO1xuICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgeFtrICsgOV0sIFMyMSwgMHgyMWUxY2RlNik7XG4gICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCB4W2sgKyAxNF0sIFMyMiwgMHhjMzM3MDdkNik7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAzXSwgUzIzLCAweGY0ZDUwZDg3KTtcbiAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIHhbayArIDhdLCBTMjQsIDB4NDU1YTE0ZWQpO1xuICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgeFtrICsgMTNdLCBTMjEsIDB4YTllM2U5MDUpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMl0sIFMyMiwgMHhmY2VmYTNmOCk7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyA3XSwgUzIzLCAweDY3NmYwMmQ5KTtcbiAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIHhbayArIDEyXSwgUzI0LCAweDhkMmE0YzhhKTtcbiAgICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIHhbayArIDVdLCBTMzEsIDB4ZmZmYTM5NDIpO1xuICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgeFtrICsgOF0sIFMzMiwgMHg4NzcxZjY4MSk7XG4gICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyAxMV0sIFMzMywgMHg2ZDlkNjEyMik7XG4gICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCB4W2sgKyAxNF0sIFMzNCwgMHhmZGU1MzgwYyk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyAxXSwgUzMxLCAweGE0YmVlYTQ0KTtcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDRdLCBTMzIsIDB4NGJkZWNmYTkpO1xuICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgeFtrICsgN10sIFMzMywgMHhmNmJiNGI2MCk7XG4gICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCB4W2sgKyAxMF0sIFMzNCwgMHhiZWJmYmM3MCk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyAxM10sIFMzMSwgMHgyODliN2VjNik7XG4gICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCB4W2sgKyAwXSwgUzMyLCAweGVhYTEyN2ZhKTtcbiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIHhbayArIDNdLCBTMzMsIDB4ZDRlZjMwODUpO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgNl0sIFMzNCwgMHg0ODgxZDA1KTtcbiAgICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIHhbayArIDldLCBTMzEsIDB4ZDlkNGQwMzkpO1xuICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgeFtrICsgMTJdLCBTMzIsIDB4ZTZkYjk5ZTUpO1xuICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgeFtrICsgMTVdLCBTMzMsIDB4MWZhMjdjZjgpO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMl0sIFMzNCwgMHhjNGFjNTY2NSk7XG4gICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyAwXSwgUzQxLCAweGY0MjkyMjQ0KTtcbiAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIHhbayArIDddLCBTNDIsIDB4NDMyYWZmOTcpO1xuICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgeFtrICsgMTRdLCBTNDMsIDB4YWI5NDIzYTcpO1xuICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgeFtrICsgNV0sIFM0NCwgMHhmYzkzYTAzOSk7XG4gICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyAxMl0sIFM0MSwgMHg2NTViNTljMyk7XG4gICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCB4W2sgKyAzXSwgUzQyLCAweDhmMGNjYzkyKTtcbiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIHhbayArIDEwXSwgUzQzLCAweGZmZWZmNDdkKTtcbiAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDFdLCBTNDQsIDB4ODU4NDVkZDEpO1xuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgOF0sIFM0MSwgMHg2ZmE4N2U0Zik7XG4gICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCB4W2sgKyAxNV0sIFM0MiwgMHhmZTJjZTZlMCk7XG4gICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyA2XSwgUzQzLCAweGEzMDE0MzE0KTtcbiAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDEzXSwgUzQ0LCAweDRlMDgxMWExKTtcbiAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIHhbayArIDRdLCBTNDEsIDB4Zjc1MzdlODIpO1xuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgMTFdLCBTNDIsIDB4YmQzYWYyMzUpO1xuICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgeFtrICsgMl0sIFM0MywgMHgyYWQ3ZDJiYik7XG4gICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCB4W2sgKyA5XSwgUzQ0LCAweGViODZkMzkxKTtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFBKTtcbiAgICAgICAgYiA9IEFkZFVuc2lnbmVkKGIsIEJCKTtcbiAgICAgICAgYyA9IEFkZFVuc2lnbmVkKGMsIENDKTtcbiAgICAgICAgZCA9IEFkZFVuc2lnbmVkKGQsIEREKTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcCA9IFdvcmRUb0hleChhKSArIFdvcmRUb0hleChiKSArIFdvcmRUb0hleChjKSArIFdvcmRUb0hleChkKTtcblxuICAgIHJldHVybiB0ZW1wLnRvTG93ZXJDYXNlKCk7XG59XG4iLCJTay5idWlsdGluRmlsZXM9e1wiZmlsZXNcIjp7XCJzcmMvYnVpbHRpbi9zeXMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBiLGE9TWF0aC5wb3csYz17fSxkPVtdLGU9U2suZ2V0U3lzQXJndigpO2ZvcihiPTA7YjxlLmxlbmd0aDsrK2IpZC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlW2JdKSk7cmV0dXJuIGMuYXJndj1uZXcgU2suYnVpbHRpbnMubGlzdChkKSxjLmNvcHlyaWdodD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkNvcHlyaWdodCAyMDA5LTIwMTAgU2NvdHQgR3JhaGFtLlxcXFxuQWxsIFJpZ2h0cyBSZXNlcnZlZC5cXFxcblxcXCIpLFNrLl9fZnV0dXJlX18ucHl0aG9uMz8oYy52ZXJzaW9uPVxcXCIzLjcoaXNoKSBbU2t1bHB0XVxcXCIsYy52ZXJzaW9uX2luZm89bmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8oMyksbmV3IFNrLmJ1aWx0aW4uaW50Xyg3KV0pKTooYy52ZXJzaW9uPVxcXCIyLjcoaXNoKSBbU2t1bHB0XVxcXCIsYy52ZXJzaW9uX2luZm89bmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8oMiksbmV3IFNrLmJ1aWx0aW4uaW50Xyg3KV0pKSxjLm1heGludD1uZXcgU2suYnVpbHRpbi5pbnRfKGEoMiw1MyktMSksYy5tYXhzaXplPW5ldyBTay5idWlsdGluLmludF8oYSgyLDUzKS0xKSxjLm1vZHVsZXM9U2suc3lzbW9kdWxlcyxjLnBhdGg9U2sucmVhbHN5c3BhdGgsYy5nZXRFeGVjdXRpb25MaW1pdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT1Tay5leGVjTGltaXQ/U2suYnVpbHRpbi5ub25lLm5vbmUkOm5ldyBTay5idWlsdGluLmludF8oU2suZXhlY0xpbWl0KX0pLGMuc2V0RXhlY3V0aW9uTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtpZihudWxsPT09U2suZXhlY0xpbWl0KXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkV4ZWN1dGlvbiBsaW1pdGluZyBpcyBub3QgZW5hYmxlZFxcXCIpO3ZvaWQgMCE9PWEmJihTay5leGVjTGltaXQ9U2suYnVpbHRpbi5hc251bSQoYSkpfSksYy5yZXNldFRpbWVvdXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe1NrLmV4ZWNTdGFydD1uZXcgRGF0ZX0pLGMuZ2V0WWllbGRMaW1pdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT1Tay55aWVsZExpbWl0P1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpuZXcgU2suYnVpbHRpbi5pbnRfKFNrLnlpZWxkTGltaXQpfSksYy5zZXRZaWVsZExpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYobnVsbD09PVNrLnlpZWxkTGltaXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiWWllbGRpbmcgaXMgbm90IGVuYWJsZWRcXFwiKTt2b2lkIDAhPT1hJiYoU2sueWllbGRMaW1pdD1Tay5idWlsdGluLmFzbnVtJChhKSl9KSxjLmRlYnVnPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSksYy5fX3N0ZG91dF9fPW5ldyBTay5idWlsdGluLmZpbGUobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIvZGV2L3N0ZG91dFxcXCIpLG5ldyBTay5idWlsdGluLnN0cihcXFwid1xcXCIpKSxjLl9fc3RkaW5fXz1uZXcgU2suYnVpbHRpbi5maWxlKG5ldyBTay5idWlsdGluLnN0cihcXFwiL2Rldi9zdGRpblxcXCIpLG5ldyBTay5idWlsdGluLnN0cihcXFwiclxcXCIpKSxjLnN0ZG91dD1jLl9fc3Rkb3V0X18sYy5zdGRpbj1jLl9fc3RkaW5fXyxjfTtcIixcInNyYy9idWlsdGluL3RoaXMucHlcIjpcInMgPSBcXFwiXFxcIlxcXCJHdXIgTXJhIGJzIENsZ3ViYSwgb2wgR3Z6IENyZ3JlZlxcblxcbk9ybmhndnNoeSB2ZiBvcmdncmUgZ3VuYSBodHlsLlxcblJrY3l2cHZnIHZmIG9yZ2dyZSBndW5hIHZ6Y3l2cHZnLlxcbkZ2emN5ciB2ZiBvcmdncmUgZ3VuYSBwYnpjeXJrLlxcblBiemN5cmsgdmYgb3JnZ3JlIGd1bmEgcGJ6Y3l2cG5ncnEuXFxuU3luZyB2ZiBvcmdncmUgZ3VuYSBhcmZncnEuXFxuRmNuZWZyIHZmIG9yZ2dyZSBndW5hIHFyYWZyLlxcbkVybnFub3Z5dmdsIHBiaGFnZi5cXG5GY3Jwdm55IHBuZnJmIG5lcmEnZyBmY3Jwdm55IHJhYmh0dSBnYiBvZXJueCBndXIgZWh5cmYuXFxuTnlndWJodHUgY2VucGd2cG55dmdsIG9ybmdmIGNoZXZnbC5cXG5SZWViZWYgZnViaHlxIGFyaXJlIGNuZmYgZnZ5cmFneWwuXFxuSGF5cmZmIHJrY3l2cHZneWwgZnZ5cmFwcnEuXFxuVmEgZ3VyIHNucHIgYnMgbnpvdnRodmdsLCBlcnNoZnIgZ3VyIGdyemNnbmd2YmEgZ2IgdGhyZmYuXFxuR3VyZXIgZnViaHlxIG9yIGJhci0tIG5hcSBjZXJzcmVub3lsIGJheWwgYmFyIC0tYm9pdmJoZiBqbmwgZ2IgcWIgdmcuXFxuTnlndWJodHUgZ3VuZyBqbmwgem5sIGFiZyBvciBib2l2YmhmIG5nIHN2ZWZnIGhheXJmZiBsYmgnZXIgUWhncHUuXFxuQWJqIHZmIG9yZ2dyZSBndW5hIGFyaXJlLlxcbk55Z3ViaHR1IGFyaXJlIHZmIGJzZ3JhIG9yZ2dyZSBndW5hICpldnR1ZyogYWJqLlxcblZzIGd1ciB2emN5cnpyYWduZ3ZiYSB2ZiB1bmVxIGdiIHJrY3ludmEsIHZnJ2YgbiBvbnEgdnFybi5cXG5WcyBndXIgdnpjeXJ6cmFnbmd2YmEgdmYgcm5mbCBnYiBya2N5bnZhLCB2ZyB6bmwgb3IgbiB0YmJxIHZxcm4uXFxuQW56cmZjbnByZiBuZXIgYmFyIHViYXh2YXQgdGVybmcgdnFybiAtLSB5cmcnZiBxYiB6YmVyIGJzIGd1YmZyIVxcXCJcXFwiXFxcIlxcblxcbmQgPSB7fVxcbmZvciBjIGluICg2NSwgOTcpOlxcbiAgICBmb3IgaSBpbiByYW5nZSgyNik6XFxuICAgICAgICBkW2NocihpK2MpXSA9IGNocigoaSsxMykgJSAyNiArIGMpXFxuXFxucHJpbnQoXFxcIlxcXCIuam9pbihbZC5nZXQoYywgYykgZm9yIGMgaW4gc10pKVxcblwiLFwic3JjL2xpYi9CYXNlSFRUUFNlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQmFzZUhUVFBTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9CYXN0aW9uLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJCYXN0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvQ0dJSFRUUFNlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQ0dJSFRUUFNlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0NvbmZpZ1BhcnNlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQ29uZmlnUGFyc2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvQ29va2llLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJDb29raWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Eb2NYTUxSUENTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkRvY1hNTFJQQ1NlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0hUTUxQYXJzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkhUTUxQYXJzZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9NaW1lV3JpdGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJNaW1lV3JpdGVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvUXVldWUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlF1ZXVlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvU2ltcGxlSFRUUFNlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU2ltcGxlSFRUUFNlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1NpbXBsZVhNTFJQQ1NlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU2ltcGxlWE1MUlBDU2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvU29ja2V0U2VydmVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJTb2NrZXRTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9TdHJpbmdJTy5weVwiOlwiclxcXCJcXFwiXFxcIkZpbGUtbGlrZSBvYmplY3RzIHRoYXQgcmVhZCBmcm9tIG9yIHdyaXRlIHRvIGEgc3RyaW5nIGJ1ZmZlci5cXG5cXG5UaGlzIGltcGxlbWVudHMgKG5lYXJseSkgYWxsIHN0ZGlvIG1ldGhvZHMuXFxuXFxuZiA9IFN0cmluZ0lPKCkgICAgICAjIHJlYWR5IGZvciB3cml0aW5nXFxuZiA9IFN0cmluZ0lPKGJ1ZikgICAjIHJlYWR5IGZvciByZWFkaW5nXFxuZi5jbG9zZSgpICAgICAgICAgICAjIGV4cGxpY2l0bHkgcmVsZWFzZSByZXNvdXJjZXMgaGVsZFxcbmZsYWcgPSBmLmlzYXR0eSgpICAgIyBhbHdheXMgZmFsc2VcXG5wb3MgPSBmLnRlbGwoKSAgICAgICMgZ2V0IGN1cnJlbnQgcG9zaXRpb25cXG5mLnNlZWsocG9zKSAgICAgICAgICMgc2V0IGN1cnJlbnQgcG9zaXRpb25cXG5mLnNlZWsocG9zLCBtb2RlKSAgICMgbW9kZSAwOiBhYnNvbHV0ZTsgMTogcmVsYXRpdmU7IDI6IHJlbGF0aXZlIHRvIEVPRlxcbmJ1ZiA9IGYucmVhZCgpICAgICAgIyByZWFkIHVudGlsIEVPRlxcbmJ1ZiA9IGYucmVhZChuKSAgICAgIyByZWFkIHVwIHRvIG4gYnl0ZXNcXG5idWYgPSBmLnJlYWRsaW5lKCkgICMgcmVhZCB1bnRpbCBlbmQgb2YgbGluZSAoJ1xcXFxuJykgb3IgRU9GXFxubGlzdCA9IGYucmVhZGxpbmVzKCkjIGxpc3Qgb2YgZi5yZWFkbGluZSgpIHJlc3VsdHMgdW50aWwgRU9GXFxuZi50cnVuY2F0ZShbc2l6ZV0pICAjIHRydW5jYXRlIGZpbGUgYXQgdG8gYXQgbW9zdCBzaXplIChkZWZhdWx0OiBjdXJyZW50IHBvcylcXG5mLndyaXRlKGJ1ZikgICAgICAgICMgd3JpdGUgYXQgY3VycmVudCBwb3NpdGlvblxcbmYud3JpdGVsaW5lcyhsaXN0KSAgIyBmb3IgbGluZSBpbiBsaXN0OiBmLndyaXRlKGxpbmUpXFxuZi5nZXR2YWx1ZSgpICAgICAgICAjIHJldHVybiB3aG9sZSBmaWxlJ3MgY29udGVudHMgYXMgYSBzdHJpbmdcXG5cXG5Ob3RlczpcXG4tIFVzaW5nIGEgcmVhbCBmaWxlIGlzIG9mdGVuIGZhc3RlciAoYnV0IGxlc3MgY29udmVuaWVudCkuXFxuLSBUaGVyZSdzIGFsc28gYSBtdWNoIGZhc3RlciBpbXBsZW1lbnRhdGlvbiBpbiBDLCBjYWxsZWQgY1N0cmluZ0lPLCBidXRcXG4gIGl0J3Mgbm90IHN1YmNsYXNzYWJsZS5cXG4tIGZpbGVubygpIGlzIGxlZnQgdW5pbXBsZW1lbnRlZCBzbyB0aGF0IGNvZGUgd2hpY2ggdXNlcyBpdCB0cmlnZ2Vyc1xcbiAgYW4gZXhjZXB0aW9uIGVhcmx5Llxcbi0gU2Vla2luZyBmYXIgYmV5b25kIEVPRiBhbmQgdGhlbiB3cml0aW5nIHdpbGwgaW5zZXJ0IHJlYWwgbnVsbFxcbiAgYnl0ZXMgdGhhdCBvY2N1cHkgc3BhY2UgaW4gdGhlIGJ1ZmZlci5cXG4tIFRoZXJlJ3MgYSBzaW1wbGUgdGVzdCBzZXQgKHNlZSBlbmQgb2YgdGhpcyBmaWxlKS5cXG5cXFwiXFxcIlxcXCJcXG5cXG5fX2FsbF9fID0gW1xcXCJTdHJpbmdJT1xcXCJdXFxuXFxuZGVmIF9jb21wbGFpbl9pZmNsb3NlZChjbG9zZWQpOlxcbiAgICBpZiBjbG9zZWQ6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlXFxcIilcXG5cXG5jbGFzcyBTdHJpbmdJTzpcXG4gICAgXFxcIlxcXCJcXFwiY2xhc3MgU3RyaW5nSU8oW2J1ZmZlcl0pXFxuXFxuICAgIFdoZW4gYSBTdHJpbmdJTyBvYmplY3QgaXMgY3JlYXRlZCwgaXQgY2FuIGJlIGluaXRpYWxpemVkIHRvIGFuIGV4aXN0aW5nXFxuICAgIHN0cmluZyBieSBwYXNzaW5nIHRoZSBzdHJpbmcgdG8gdGhlIGNvbnN0cnVjdG9yLiBJZiBubyBzdHJpbmcgaXMgZ2l2ZW4sXFxuICAgIHRoZSBTdHJpbmdJTyB3aWxsIHN0YXJ0IGVtcHR5LlxcblxcbiAgICBUaGUgU3RyaW5nSU8gb2JqZWN0IGNhbiBhY2NlcHQgZWl0aGVyIFVuaWNvZGUgb3IgOC1iaXQgc3RyaW5ncywgYnV0XFxuICAgIG1peGluZyB0aGUgdHdvIG1heSB0YWtlIHNvbWUgY2FyZS4gSWYgYm90aCBhcmUgdXNlZCwgOC1iaXQgc3RyaW5ncyB0aGF0XFxuICAgIGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyA3LWJpdCBBU0NJSSAodGhhdCB1c2UgdGhlIDh0aCBiaXQpIHdpbGwgY2F1c2VcXG4gICAgYSBVbmljb2RlRXJyb3IgdG8gYmUgcmFpc2VkIHdoZW4gZ2V0dmFsdWUoKSBpcyBjYWxsZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgYnVmID0gJycpOlxcbiAgICAgICAgIyBGb3JjZSBzZWxmLmJ1ZiB0byBiZSBhIHN0cmluZyBvciB1bmljb2RlXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShidWYsIHN0cik6XFxuICAgICAgICAgICAgYnVmID0gc3RyKGJ1ZilcXG4gICAgICAgIHNlbGYuYnVmID0gYnVmXFxuICAgICAgICBzZWxmLmxlbiA9IGxlbihidWYpXFxuICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgc2VsZi5wb3MgPSAwXFxuICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlXFxuICAgICAgICBzZWxmLnNvZnRzcGFjZSA9IDBcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIG5leHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBIGZpbGUgb2JqZWN0IGlzIGl0cyBvd24gaXRlcmF0b3IsIGZvciBleGFtcGxlIGl0ZXIoZikgcmV0dXJucyBmXFxuICAgICAgICAodW5sZXNzIGYgaXMgY2xvc2VkKS4gV2hlbiBhIGZpbGUgaXMgdXNlZCBhcyBhbiBpdGVyYXRvciwgdHlwaWNhbGx5XFxuICAgICAgICBpbiBhIGZvciBsb29wIChmb3IgZXhhbXBsZSwgZm9yIGxpbmUgaW4gZjogcHJpbnQgbGluZSksIHRoZSBuZXh0KClcXG4gICAgICAgIG1ldGhvZCBpcyBjYWxsZWQgcmVwZWF0ZWRseS4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmV4dCBpbnB1dCBsaW5lLFxcbiAgICAgICAgb3IgcmFpc2VzIFN0b3BJdGVyYXRpb24gd2hlbiBFT0YgaXMgaGl0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICByID0gc2VsZi5yZWFkbGluZSgpXFxuICAgICAgICBpZiBub3QgcjpcXG4gICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uXFxuICAgICAgICByZXR1cm4gclxcblxcbiAgICBkZWYgY2xvc2Uoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGcmVlIHRoZSBtZW1vcnkgYnVmZmVyLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBub3Qgc2VsZi5jbG9zZWQ6XFxuICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlXFxuICAgICAgICAgICAgc2VsZi5idWYgPSBOb25lXFxuICAgICAgICAgICAgc2VsZi5wb3MgPSBOb25lXFxuXFxuICAgIGRlZiBpc2F0dHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm5zIEZhbHNlIGJlY2F1c2UgU3RyaW5nSU8gb2JqZWN0cyBhcmUgbm90IGNvbm5lY3RlZCB0byBhXFxuICAgICAgICB0dHktbGlrZSBkZXZpY2UuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgc2VlayhzZWxmLCBwb3MsIG1vZGUgPSAwKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB0aGUgZmlsZSdzIGN1cnJlbnQgcG9zaXRpb24uXFxuXFxuICAgICAgICBUaGUgbW9kZSBhcmd1bWVudCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gMCAoYWJzb2x1dGUgZmlsZVxcbiAgICAgICAgcG9zaXRpb25pbmcpOyBvdGhlciB2YWx1ZXMgYXJlIDEgKHNlZWsgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnRcXG4gICAgICAgIHBvc2l0aW9uKSBhbmQgMiAoc2VlayByZWxhdGl2ZSB0byB0aGUgZmlsZSdzIGVuZCkuXFxuXFxuICAgICAgICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdClcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgaWYgbW9kZSA9PSAxOlxcbiAgICAgICAgICAgIHBvcyArPSBzZWxmLnBvc1xcbiAgICAgICAgZWxpZiBtb2RlID09IDI6XFxuICAgICAgICAgICAgcG9zICs9IHNlbGYubGVuXFxuICAgICAgICBzZWxmLnBvcyA9IG1heCgwLCBwb3MpXFxuXFxuICAgIGRlZiB0ZWxsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBmaWxlJ3MgY3VycmVudCBwb3NpdGlvbi5cXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIHJldHVybiBzZWxmLnBvc1xcblxcbiAgICBkZWYgcmVhZChzZWxmLCBuID0gLTEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVhZCBhdCBtb3N0IHNpemUgYnl0ZXMgZnJvbSB0aGUgZmlsZVxcbiAgICAgICAgKGxlc3MgaWYgdGhlIHJlYWQgaGl0cyBFT0YgYmVmb3JlIG9idGFpbmluZyBzaXplIGJ5dGVzKS5cXG5cXG4gICAgICAgIElmIHRoZSBzaXplIGFyZ3VtZW50IGlzIG5lZ2F0aXZlIG9yIG9taXR0ZWQsIHJlYWQgYWxsIGRhdGEgdW50aWwgRU9GXFxuICAgICAgICBpcyByZWFjaGVkLiBUaGUgYnl0ZXMgYXJlIHJldHVybmVkIGFzIGEgc3RyaW5nIG9iamVjdC4gQW4gZW1wdHlcXG4gICAgICAgIHN0cmluZyBpcyByZXR1cm5lZCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBpbW1lZGlhdGVseS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgaWYgc2VsZi5idWZsaXN0OlxcbiAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KVxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtdXFxuICAgICAgICBpZiBuIGlzIE5vbmUgb3IgbiA8IDA6XFxuICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5sZW5cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbmV3cG9zID0gbWluKHNlbGYucG9zK24sIHNlbGYubGVuKVxcbiAgICAgICAgciA9IHNlbGYuYnVmW3NlbGYucG9zOm5ld3Bvc11cXG4gICAgICAgIHNlbGYucG9zID0gbmV3cG9zXFxuICAgICAgICByZXR1cm4gclxcblxcbiAgICBkZWYgcmVhZGxpbmUoc2VsZiwgbGVuZ3RoPU5vbmUpOlxcbiAgICAgICAgclxcXCJcXFwiXFxcIlJlYWQgb25lIGVudGlyZSBsaW5lIGZyb20gdGhlIGZpbGUuXFxuXFxuICAgICAgICBBIHRyYWlsaW5nIG5ld2xpbmUgY2hhcmFjdGVyIGlzIGtlcHQgaW4gdGhlIHN0cmluZyAoYnV0IG1heSBiZSBhYnNlbnRcXG4gICAgICAgIHdoZW4gYSBmaWxlIGVuZHMgd2l0aCBhbiBpbmNvbXBsZXRlIGxpbmUpLiBJZiB0aGUgc2l6ZSBhcmd1bWVudCBpc1xcbiAgICAgICAgcHJlc2VudCBhbmQgbm9uLW5lZ2F0aXZlLCBpdCBpcyBhIG1heGltdW0gYnl0ZSBjb3VudCAoaW5jbHVkaW5nIHRoZVxcbiAgICAgICAgdHJhaWxpbmcgbmV3bGluZSkgYW5kIGFuIGluY29tcGxldGUgbGluZSBtYXkgYmUgcmV0dXJuZWQuXFxuXFxuICAgICAgICBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgb25seSB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBpbW1lZGlhdGVseS5cXG5cXG4gICAgICAgIE5vdGU6IFVubGlrZSBzdGRpbydzIGZnZXRzKCksIHRoZSByZXR1cm5lZCBzdHJpbmcgY29udGFpbnMgbnVsbFxcbiAgICAgICAgY2hhcmFjdGVycyAoJ1xcXFwwJykgaWYgdGhleSBvY2N1cnJlZCBpbiB0aGUgaW5wdXQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdClcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgaSA9IHNlbGYuYnVmLmZpbmQoJ1xcXFxuJywgc2VsZi5wb3MpXFxuICAgICAgICBpZiBpIDwgMDpcXG4gICAgICAgICAgICBuZXdwb3MgPSBzZWxmLmxlblxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdwb3MgPSBpKzFcXG4gICAgICAgIGlmIGxlbmd0aCBpcyBub3QgTm9uZSBhbmQgbGVuZ3RoID49IDA6XFxuICAgICAgICAgICAgaWYgc2VsZi5wb3MgKyBsZW5ndGggPCBuZXdwb3M6XFxuICAgICAgICAgICAgICAgIG5ld3BvcyA9IHNlbGYucG9zICsgbGVuZ3RoXFxuICAgICAgICByID0gc2VsZi5idWZbc2VsZi5wb3M6bmV3cG9zXVxcbiAgICAgICAgc2VsZi5wb3MgPSBuZXdwb3NcXG4gICAgICAgIHJldHVybiByXFxuXFxuICAgIGRlZiByZWFkbGluZXMoc2VsZiwgc2l6ZWhpbnQgPSAwKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlYWQgdW50aWwgRU9GIHVzaW5nIHJlYWRsaW5lKCkgYW5kIHJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGVcXG4gICAgICAgIGxpbmVzIHRodXMgcmVhZC5cXG5cXG4gICAgICAgIElmIHRoZSBvcHRpb25hbCBzaXplaGludCBhcmd1bWVudCBpcyBwcmVzZW50LCBpbnN0ZWFkIG9mIHJlYWRpbmcgdXBcXG4gICAgICAgIHRvIEVPRiwgd2hvbGUgbGluZXMgdG90YWxsaW5nIGFwcHJveGltYXRlbHkgc2l6ZWhpbnQgYnl0ZXMgKG9yIG1vcmVcXG4gICAgICAgIHRvIGFjY29tbW9kYXRlIGEgZmluYWwgd2hvbGUgbGluZSkuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHRvdGFsID0gMFxcbiAgICAgICAgbGluZXMgPSBbXVxcbiAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKVxcbiAgICAgICAgd2hpbGUgbGluZTpcXG4gICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSlcXG4gICAgICAgICAgICB0b3RhbCArPSBsZW4obGluZSlcXG4gICAgICAgICAgICBpZiAwIDwgc2l6ZWhpbnQgPD0gdG90YWw6XFxuICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKVxcbiAgICAgICAgcmV0dXJuIGxpbmVzXFxuXFxuICAgIGRlZiB0cnVuY2F0ZShzZWxmLCBzaXplPU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVHJ1bmNhdGUgdGhlIGZpbGUncyBzaXplLlxcblxcbiAgICAgICAgSWYgdGhlIG9wdGlvbmFsIHNpemUgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGZpbGUgaXMgdHJ1bmNhdGVkIHRvXFxuICAgICAgICAoYXQgbW9zdCkgdGhhdCBzaXplLiBUaGUgc2l6ZSBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBwb3NpdGlvbi5cXG4gICAgICAgIFRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24gaXMgbm90IGNoYW5nZWQgdW5sZXNzIHRoZSBwb3NpdGlvblxcbiAgICAgICAgaXMgYmV5b25kIHRoZSBuZXcgZmlsZSBzaXplLlxcblxcbiAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBzaXplIGV4Y2VlZHMgdGhlIGZpbGUncyBjdXJyZW50IHNpemUsIHRoZVxcbiAgICAgICAgZmlsZSByZW1haW5zIHVuY2hhbmdlZC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgaWYgc2l6ZSBpcyBOb25lOlxcbiAgICAgICAgICAgIHNpemUgPSBzZWxmLnBvc1xcbiAgICAgICAgZWxpZiBzaXplIDwgMDpcXG4gICAgICAgICAgICByYWlzZSBJT0Vycm9yKDIyLCBcXFwiTmVnYXRpdmUgc2l6ZSBub3QgYWxsb3dlZFxcXCIpXFxuICAgICAgICBlbGlmIHNpemUgPCBzZWxmLnBvczpcXG4gICAgICAgICAgICBzZWxmLnBvcyA9IHNpemVcXG4gICAgICAgIHNlbGYuYnVmID0gc2VsZi5nZXR2YWx1ZSgpWzpzaXplXVxcbiAgICAgICAgc2VsZi5sZW4gPSBzaXplXFxuXFxuICAgIGRlZiB3cml0ZShzZWxmLCBzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIldyaXRlIGEgc3RyaW5nIHRvIHRoZSBmaWxlLlxcblxcbiAgICAgICAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBub3QgczogcmV0dXJuXFxuICAgICAgICAjIEZvcmNlIHMgdG8gYmUgYSBzdHJpbmcgb3IgdW5pY29kZVxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uocywgc3RyKTpcXG4gICAgICAgICAgICBzID0gc3RyKHMpXFxuICAgICAgICBzcG9zID0gc2VsZi5wb3NcXG4gICAgICAgIHNsZW4gPSBzZWxmLmxlblxcbiAgICAgICAgaWYgc3BvcyA9PSBzbGVuOlxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQocylcXG4gICAgICAgICAgICBzZWxmLmxlbiA9IHNlbGYucG9zID0gc3BvcyArIGxlbihzKVxcbiAgICAgICAgICAgIHJldHVyblxcbiAgICAgICAgaWYgc3BvcyA+IHNsZW46XFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0LmFwcGVuZCgnXFxcXDAnKihzcG9zIC0gc2xlbikpXFxuICAgICAgICAgICAgc2xlbiA9IHNwb3NcXG4gICAgICAgIG5ld3BvcyA9IHNwb3MgKyBsZW4ocylcXG4gICAgICAgIGlmIHNwb3MgPCBzbGVuOlxcbiAgICAgICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW3NlbGYuYnVmWzpzcG9zXSwgcywgc2VsZi5idWZbbmV3cG9zOl1dXFxuICAgICAgICAgICAgc2VsZi5idWYgPSAnJ1xcbiAgICAgICAgICAgIGlmIG5ld3BvcyA+IHNsZW46XFxuICAgICAgICAgICAgICAgIHNsZW4gPSBuZXdwb3NcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0LmFwcGVuZChzKVxcbiAgICAgICAgICAgIHNsZW4gPSBuZXdwb3NcXG4gICAgICAgIHNlbGYubGVuID0gc2xlblxcbiAgICAgICAgc2VsZi5wb3MgPSBuZXdwb3NcXG5cXG4gICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgaXRlcmFibGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiV3JpdGUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHRvIHRoZSBmaWxlLiBUaGUgc2VxdWVuY2UgY2FuIGJlIGFueVxcbiAgICAgICAgaXRlcmFibGUgb2JqZWN0IHByb2R1Y2luZyBzdHJpbmdzLCB0eXBpY2FsbHkgYSBsaXN0IG9mIHN0cmluZ3MuIFRoZXJlXFxuICAgICAgICBpcyBubyByZXR1cm4gdmFsdWUuXFxuXFxuICAgICAgICAoVGhlIG5hbWUgaXMgaW50ZW5kZWQgdG8gbWF0Y2ggcmVhZGxpbmVzKCk7IHdyaXRlbGluZXMoKSBkb2VzIG5vdCBhZGRcXG4gICAgICAgIGxpbmUgc2VwYXJhdG9ycy4pXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHdyaXRlID0gc2VsZi53cml0ZVxcbiAgICAgICAgZm9yIGxpbmUgaW4gaXRlcmFibGU6XFxuICAgICAgICAgICAgd3JpdGUobGluZSlcXG5cXG4gICAgZGVmIGZsdXNoKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRmx1c2ggdGhlIGludGVybmFsIGJ1ZmZlclxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuXFxuICAgIGRlZiBnZXR2YWx1ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgUmV0cmlldmUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgXFxcImZpbGVcXFwiIGF0IGFueSB0aW1lIGJlZm9yZVxcbiAgICAgICAgdGhlIFN0cmluZ0lPIG9iamVjdCdzIGNsb3NlKCkgbWV0aG9kIGlzIGNhbGxlZC5cXG5cXG4gICAgICAgIFRoZSBTdHJpbmdJTyBvYmplY3QgY2FuIGFjY2VwdCBlaXRoZXIgVW5pY29kZSBvciA4LWJpdCBzdHJpbmdzLFxcbiAgICAgICAgYnV0IG1peGluZyB0aGUgdHdvIG1heSB0YWtlIHNvbWUgY2FyZS4gSWYgYm90aCBhcmUgdXNlZCwgOC1iaXRcXG4gICAgICAgIHN0cmluZ3MgdGhhdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgNy1iaXQgQVNDSUkgKHRoYXQgdXNlIHRoZVxcbiAgICAgICAgOHRoIGJpdCkgd2lsbCBjYXVzZSBhIFVuaWNvZGVFcnJvciB0byBiZSByYWlzZWQgd2hlbiBnZXR2YWx1ZSgpXFxuICAgICAgICBpcyBjYWxsZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdClcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgcmV0dXJuIHNlbGYuYnVmXFxuXCIsXCJzcmMvbGliL1VzZXJEaWN0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJVc2VyRGljdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1VzZXJMaXN0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJVc2VyTGlzdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1VzZXJTdHJpbmcucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlVzZXJTdHJpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fTFdQQ29va2llSmFyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfTFdQQ29va2llSmFyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX01vemlsbGFDb29raWVKYXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9Nb3ppbGxhQ29va2llSmFyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX19mdXR1cmVfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX19mdXR1cmVfXyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19fcGhlbGxvX18uZm9vLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfX3BoZWxsb19fLmZvbyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19hYmNvbGwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9hYmNvbGwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fc3RycHRpbWUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9zdHJwdGltZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL190aHJlYWRpbmdfbG9jYWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl90aHJlYWRpbmdfbG9jYWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hYmMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFiYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FpZmMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFpZmMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hbHRhaXIvX19pbml0X18ucHlcIjpcImltcG9ydCByYW5kb21cXG5cXG50cnk6XFxuICAgIGZyb20gdmVnYV9jYWxsZXIgaW1wb3J0IHJlbmRlcl9ncmFwaFxcbmV4Y2VwdDpcXG4gICAgcHJpbnQoXFxcIk1vY2sgcmVuZGVyXFxcIilcXG5cXG4gICAgZGVmIHJlbmRlcl9ncmFwaChqcyk6XFxuICAgICAgICBwcmludChqcylcXG5cXG5cXG5jbGFzcyBDaGFydDpcXG4gICAgIyBUT0RPIGFsbG93IGRhdGEgdG8gYmUgc3BlY2lmaWVkIGFzIGEgVVJMIHRvIGEgQ1NWIG9yIERCIG9yIGpzb25cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEsIHRpdGxlPU5vbmUpOlxcbiAgICAgICAgc2VsZi50aXRsZSA9IHRpdGxlXFxuICAgICAgICBzZWxmLmRhdGFfaWQgPSByYW5kb20ucmFuZHJhbmdlKDEwMDAwMDAsIDUwMDAwMDApXFxuICAgICAgICBzZWxmLmRzbmFtZSA9IFxcXCJkYXRhLXt9XFxcIi5mb3JtYXQoc2VsZi5kYXRhX2lkKVxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBkaWN0KTpcXG4gICAgICAgICAgICBzZWxmLmRhdGEgPSBEYXRhKCoqZGF0YSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5kYXRhID0gZGF0YVxcblxcbiAgICAgICAgc2VsZi5qc29uID0ge31cXG4gICAgICAgIHNlbGYuanNvbltcXFwiJHNjaGVtYVxcXCJdID0gXFxcImh0dHBzOi8vdmVnYS5naXRodWIuaW8vc2NoZW1hL3ZlZ2EtbGl0ZS92Mi41Lmpzb25cXFwiXFxuICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFcXFwiXSA9IHt9XFxuICAgICAgICBpZiBzZWxmLnRpdGxlOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwidGl0bGVcXFwiXSA9IHNlbGYudGl0bGVcXG5cXG4gICAgICAgIHNlbGYuanNvbltcXFwiZGF0YVxcXCJdID0ge1xcXCJ2YWx1ZXNcXFwiOiBzZWxmLmRhdGEudmFsc31cXG4gICAgICAgIHNlbGYuaXNfY29tcG9zaXRlID0gRmFsc2VcXG5cXG4gICAgIyBtYXJrIGNhbiBiZSBhIHNpbXBsZSBzdHJpbmcgb3IgYSBkaWN0aW9uYXJ5XFxuICAgICMgXFxcIm1hcmtcXFwiOiB7XFxcImNvbG9yXFxcIjogXFxcImdyZWVuXFxcIiwgXFxcIm9wYWNpdHlcXFwiOiAwLjIsIFxcXCJ0eXBlXFxcIjogXFxcInJlY3RcXFwifVxcblxcbiAgICBkZWYgbWFya19qc29uKHNlbGYsIG1hcmtfdHlwZSwgKiprd2FyZ3MpOlxcbiAgICAgICAgaWYga3dhcmdzOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdID0ge31cXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXVtcXFwidHlwZVxcXCJdID0gbWFya190eXBlXFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl0udXBkYXRlKGt3YXJncylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl0gPSBtYXJrX3R5cGVcXG5cXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBtYXJrX2JhcihzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5tYXJrX2pzb24oXFxcImJhclxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19wb2ludChzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5tYXJrX2pzb24oXFxcInBvaW50XFxcIiwgKiprd2FyZ3MpXFxuXFxuICAgIGRlZiBtYXJrX2xpbmUoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJsaW5lXFxcIiwgKiprd2FyZ3MpXFxuXFxuICAgIGRlZiBtYXJrX3JlY3Qoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJyZWN0XFxcIiwgKiprd2FyZ3MpXFxuXFxuICAgIGRlZiBtYXJrX2FyZWEoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJhcmVhXFxcIiwgKiprd2FyZ3MpXFxuXFxuICAgIGRlZiBtYXJrX3RpY2soc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJ0aWNrXFxcIiwgKiprd2FyZ3MpXFxuXFxuICAgIGRlZiBlbmNvZGUoc2VsZiwgeD1cXFwiXFxcIiwgeT1cXFwiXFxcIiwgY29sb3I9XFxcIlxcXCIsIHNpemU9XFxcIlxcXCIsIHRvb2x0aXA9XFxcIlxcXCIpOlxcbiAgICAgICAgc2VsZi5lbmNvZGluZyA9IHt9XFxuICAgICAgICBpZiB4OlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoeCwgQXhpcyk6XFxuICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInhcXFwiXSA9IHgudG9Kc29uKClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ4XFxcIl0gPSBBeGlzKHgpLnRvSnNvbigpXFxuICAgICAgICBpZiB5OlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoeSwgQXhpcyk6XFxuICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInlcXFwiXSA9IHkudG9Kc29uKClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ5XFxcIl0gPSBBeGlzKHkpLnRvSnNvbigpXFxuXFxuICAgICAgICAjIFxcXCJjb2xvclxcXCI6IHtcXFwidHlwZVxcXCI6IFxcXCJub21pbmFsXFxcIiwgXFxcImZpZWxkXFxcIjogXFxcInNwZWNpZXNcXFwifVxcbiAgICAgICAgaWYgY29sb3I6XFxuICAgICAgICAgICAgZmllbGQsIHRwID0gX2dldF9uYW1lX3R5cGUoY29sb3IpXFxuICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwiY29sb3JcXFwiXSA9IGRpY3QodHlwZT10cCwgZmllbGQ9ZmllbGQpXFxuXFxuICAgICAgICAjIFxcXCJzaXplXFxcIjoge1xcXCJ0eXBlXFxcIjogXFxcInF1YW50aXRhdGl2ZVxcXCIsIFxcXCJmaWVsZFxcXCI6IFxcXCJBY2NlbGVyYXRpb25cXFwifVxcbiAgICAgICAgaWYgc2l6ZTpcXG4gICAgICAgICAgICBmaWVsZCwgdHAgPSBfZ2V0X25hbWVfdHlwZShzaXplKVxcbiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInNpemVcXFwiXSA9IGRpY3QodHlwZT10cCwgZmllbGQ9ZmllbGQpXFxuXFxuICAgICAgICBpZiB0b29sdGlwOlxcbiAgICAgICAgICAgIGZpZWxkLCB0cCA9IF9nZXRfbmFtZV90eXBlKHRvb2x0aXApXFxuICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwidG9vbHRpcFxcXCJdID0gZGljdCh0eXBlPXRwLCBmaWVsZD1maWVsZClcXG5cXG4gICAgICAgIHNlbGYuanNvbltcXFwiZW5jb2RpbmdcXFwiXSA9IHNlbGYuZW5jb2RpbmdcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBpbnRlcmFjdGl2ZShzZWxmKTpcXG4gICAgICAgIGljb25maWcgPSB7XFxuICAgICAgICAgICAgXFxcInNlbGVjdG9yMDAyXFxcIjoge1xcbiAgICAgICAgICAgICAgICBcXFwidHlwZVxcXCI6IFxcXCJpbnRlcnZhbFxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJiaW5kXFxcIjogXFxcInNjYWxlc1xcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJlbmNvZGluZ3NcXFwiOiBbXFxcInhcXFwiLCBcXFwieVxcXCJdLFxcbiAgICAgICAgICAgICAgICBcXFwib25cXFwiOiBcXFwiW21vdXNlZG93biwgd2luZG93Om1vdXNldXBdID4gd2luZG93Om1vdXNlbW92ZSFcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwidHJhbnNsYXRlXFxcIjogXFxcIlttb3VzZWRvd24sIHdpbmRvdzptb3VzZXVwXSA+IHdpbmRvdzptb3VzZW1vdmUhXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcInpvb21cXFwiOiBcXFwid2hlZWwhXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcIm1hcmtcXFwiOiB7XFxcImZpbGxcXFwiOiBcXFwiIzMzM1xcXCIsIFxcXCJmaWxsT3BhY2l0eVxcXCI6IDAuMTI1LCBcXFwic3Ryb2tlXFxcIjogXFxcIndoaXRlXFxcIn0sXFxuICAgICAgICAgICAgICAgIFxcXCJyZXNvbHZlXFxcIjogXFxcImdsb2JhbFxcXCIsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgc2VsZi5qc29uW1xcXCJzZWxlY3Rpb25cXFwiXSA9IGljb25maWdcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBkaXNwbGF5KHNlbGYpOlxcbiAgICAgICAgcmVuZGVyX2dyYXBoKHNlbGYuanNvbilcXG5cXG4gICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuYWRkX2xheWVyKG90aGVyLCBcXFwibGF5ZXJcXFwiKVxcblxcbiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICByZXR1cm4gc2VsZi5hZGRfbGF5ZXIob3RoZXIsIFxcXCJ2Y29uY2F0XFxcIilcXG5cXG4gICAgZGVmIF9fb3JfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICByZXR1cm4gc2VsZi5hZGRfbGF5ZXIob3RoZXIsIFxcXCJoY29uY2F0XFxcIilcXG5cXG4gICAgZGVmIGFkZF9sYXllcihzZWxmLCBvdGhlciwgbG5hbWUpOlxcbiAgICAgICAgIyBtdWx0bGUgbGF5ZXJzIGFyZSBhZGRlZCBieSBjb25jYXRlbmF0aW5nIHRoZSBuZXcgZWxlbWVudCB0byB0aGVcXG4gICAgICAgICMgZXhpc3RpbmcgbGF5ZXIuICBJZiB0aGUgbGF5ZXIgZG9lcyBub3QgZXhpc3QgdGhlbiBpbml0aWFsaXplXFxuICAgICAgICAjIGl0IGZyb20gc2VsZi5cXG4gICAgICAgIGlmIGxuYW1lIG5vdCBpbiBzZWxmLmpzb246XFxuICAgICAgICAgICAgc2VsZi5qc29uW2xuYW1lXSA9IFtdXFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhc2V0c1xcXCJdID0ge31cXG4gICAgICAgICAgICB0ZW1wID0ge31cXG4gICAgICAgICAgICB0ZW1wW1xcXCJkYXRhXFxcIl0gPSB7XFxcIm5hbWVcXFwiOiBzZWxmLmRzbmFtZX1cXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFzZXRzXFxcIl1bc2VsZi5kc25hbWVdID0gc2VsZi5qc29uW1xcXCJkYXRhXFxcIl1bXFxcInZhbHVlc1xcXCJdXFxuICAgICAgICAgICAgZGVsIHNlbGYuanNvbltcXFwiZGF0YVxcXCJdXFxuICAgICAgICAgICAgdGVtcFtcXFwiZW5jb2RpbmdcXFwiXSA9IHNlbGYuanNvbltcXFwiZW5jb2RpbmdcXFwiXVxcbiAgICAgICAgICAgIGRlbCBzZWxmLmpzb25bXFxcImVuY29kaW5nXFxcIl1cXG4gICAgICAgICAgICB0ZW1wW1xcXCJtYXJrXFxcIl0gPSBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXVxcbiAgICAgICAgICAgIGRlbCBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXVxcbiAgICAgICAgICAgIHNlbGYuanNvbltsbmFtZV0uYXBwZW5kKHRlbXApXFxuICAgICAgICB0ZW1wID0ge31cXG4gICAgICAgIHNlbGYuanNvbltcXFwiZGF0YXNldHNcXFwiXVtvdGhlci5kc25hbWVdID0gb3RoZXIuanNvbltcXFwiZGF0YVxcXCJdW1xcXCJ2YWx1ZXNcXFwiXVxcbiAgICAgICAgdGVtcFtcXFwiZGF0YVxcXCJdID0ge1xcXCJuYW1lXFxcIjogb3RoZXIuZHNuYW1lfVxcbiAgICAgICAgdGVtcFtcXFwiZW5jb2RpbmdcXFwiXSA9IG90aGVyLmpzb25bXFxcImVuY29kaW5nXFxcIl1cXG4gICAgICAgIHRlbXBbXFxcIm1hcmtcXFwiXSA9IG90aGVyLmpzb25bXFxcIm1hcmtcXFwiXVxcbiAgICAgICAgc2VsZi5qc29uW2xuYW1lXS5hcHBlbmQodGVtcClcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuXFxuIyAgIFxcXCJkYXRhc2V0c1xcXCI6IHtcXG4jICAgICBcXFwiZGF0YS1lNTZlNDMzNTRkOWI4ZjJhYjBkMWU5MGNmMjdjZDQ3ZlxcXCI6IFtcXG4jICAgICAgIHtcXFwiYVxcXCI6IDQsIFxcXCJiXFxcIjogMSwgXFxcImNcXFwiOiBcXFwiclxcXCJ9LFxcbiMgICAgICAge1xcXCJhXFxcIjogNSwgXFxcImJcXFwiOiAyLCBcXFwiY1xcXCI6IFxcXCJnXFxcIn0sXFxuIyAgICAgICB7XFxcImFcXFwiOiA2LCBcXFwiYlxcXCI6IDMsIFxcXCJjXFxcIjogXFxcImJcXFwifVxcbiMgICAgIF0sXFxuIyAgICAgXFxcImRhdGEtYTRjMzA0N2ExNWJmOTM4MGMyZTYxNWNmODc2NDgzNjlcXFwiOiBbXFxuIyAgICAgICB7XFxcImFcXFwiOiAxLCBcXFwiYlxcXCI6IDQsIFxcXCJjXFxcIjogXFxcInJcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDIsIFxcXCJiXFxcIjogNSwgXFxcImNcXFwiOiBcXFwiZ1xcXCJ9LFxcbiMgICAgICAge1xcXCJhXFxcIjogMywgXFxcImJcXFwiOiA2LCBcXFwiY1xcXCI6IFxcXCJiXFxcIn1cXG4jICAgICBdXFxuIyAgIH1cXG5cXG4jIFRPRE86ICBhZGQgYSByZWN0IG1hcmsgdHlwZSBmb3IgYSBoZWF0IG1hcFxcblxcblxcbmRlZiBfZ2V0X25hbWVfdHlwZShuYW1lKTpcXG4gICAgdHlwZWQgPSB7XFxcIlFcXFwiOiBcXFwicXVhbnRpdGF0aXZlXFxcIiwgXFxcIk9cXFwiOiBcXFwib3JkaW5hbFxcXCIsIFxcXCJOXFxcIjogXFxcIm5vbWluYWxcXFwiLCBcXFwiVFxcXCI6IFxcXCJ0ZW1wb3JhbFxcXCJ9XFxuICAgIG50ID0gbmFtZS5zcGxpdChcXFwiOlxcXCIpXFxuICAgIHRzdHJpbmcgPSBcXFwicXVhbnRpdGF0aXZlXFxcIlxcbiAgICBpZiBsZW4obnQpID09IDI6XFxuICAgICAgICB0c3RyaW5nID0gdHlwZWRbbnRbMV1dXFxuICAgIHJldHVybiBudFswXSwgdHN0cmluZ1xcblxcblxcbmNsYXNzIEF4aXM6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBiaW49RmFsc2UpOlxcbiAgICAgICAgc2VsZi5hZ2dyZWdhdGUgPSBOb25lXFxuICAgICAgICBzZWxmLm5hbWUsIHNlbGYudHlwZSA9IF9nZXRfbmFtZV90eXBlKG5hbWUpXFxuICAgICAgICBpZiBcXFwiKClcXFwiIGluIHNlbGYubmFtZTogICMgYWdncmVnYXRlIGZ1bmN0aW9uXFxuICAgICAgICAgICAgc2VsZi5hZ2dyZWdhdGUgPSBzZWxmLm5hbWUucmVwbGFjZShcXFwiKClcXFwiLCBcXFwiXFxcIilcXG4gICAgICAgICAgICBzZWxmLm5hbWUgPSBOb25lXFxuICAgICAgICBzZWxmLmJpbiA9IGJpblxcblxcbiAgICBkZWYgdG9Kc29uKHNlbGYpOlxcbiAgICAgICAganNvbiA9IHt9XFxuICAgICAgICBpZiBzZWxmLm5hbWU6XFxuICAgICAgICAgICAganNvbltcXFwiZmllbGRcXFwiXSA9IHNlbGYubmFtZVxcbiAgICAgICAgaWYgc2VsZi50eXBlOlxcbiAgICAgICAgICAgIGpzb25bXFxcInR5cGVcXFwiXSA9IHNlbGYudHlwZVxcbiAgICAgICAgaWYgc2VsZi5iaW46XFxuICAgICAgICAgICAganNvbltcXFwiYmluXFxcIl0gPSBUcnVlXFxuICAgICAgICBpZiBzZWxmLmFnZ3JlZ2F0ZTpcXG4gICAgICAgICAgICBqc29uW1xcXCJhZ2dyZWdhdGVcXFwiXSA9IHNlbGYuYWdncmVnYXRlXFxuXFxuICAgICAgICByZXR1cm4ganNvblxcblxcblxcbmNsYXNzIFgoQXhpcyk6XFxuICAgIHBhc3NcXG5cXG5cXG5jbGFzcyBZKEF4aXMpOlxcbiAgICBwYXNzXFxuXFxuXFxuY2xhc3MgRGF0YTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaW5wdXQgY2FuIGJlIHRoZSBmb3JtIG9mIGEgc2VyaWVzIG9mIGtleXdvcmQgYXJncyB3aGVyZVxcbiAgICAgICAgdGhlIGtleXdvcmQgaXMgdGhlIGNvbHVtbiBuYW1lLCBvciBhIHNpbmdsZSBrZXl3b3JkIGRhdGFcXG4gICAgICAgIHRoYXQgaXMgYSBsaXN0IG9mIGpzb24gc3R5bGUgcmVjb3JkcyBhcyByb3dzLlxcbiAgICAgICAgY291bGQgYWxzbyBhY2NlcHQgYSBjc3YgZmlsZT8gb3Iga2V5d29yZHMgY29sdW1ucyBhbmQgcm93c1xcbiAgICAgICAgVGhpcyBhY2NlcHRzIGEgbG90IG1vcmUgb3B0aW9ucyB0aGF0IFxcXCJyZWFsIGFsdGFpclxcXCIgdG8gbWFrZSBpdCBlYXNpZXJcXG4gICAgICAgIHRvIHdvcmsgd2l0aCBub24tRGF0YUZyYW1lIGRhdGEgc2V0cy4gIEludGVybmFsbHk6XFxuICAgICAgICBzZWxmLmtleXMgY29udGFpbnMgdGhlIGxpc3Qgb2YgY29sdW1uIG5hbWVzXFxuICAgICAgICBzZWxmLnZhbHMgaXMgYSBsaXN0IG9mIGRpY3Rpb25hcmllcyBvZiB0aGUgZm9ybSBbe2NvbDE6dmFsMSwgY29sMjp2YWwyLCAuLi4gY29sbjp2YWxufSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sMTp2YWwzLCBjb2wyOnZhbDQsIC4uLiBjb2xuOnZhbG59LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjb2wxOnZhbDUsIGNvbDI6dmFsNiwgLi4uIGNvbG46dmFsbn1dXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgICMgdG9kbzogYWNjZXB0IGEgVVJMIGFzIHRoZSBhcmd1bWVudCB0byByZWFkIGEgQ1NWIG9yIEpTT04gZmlsZVxcbiAgICAgICAgaWYgbGVuKGt3YXJncykgPT0gMSBhbmQgXFxcImRhdGFcXFwiIGluIGt3YXJnczpcXG4gICAgICAgICAgICBzZWxmLmRhdGEgPSBrd2FyZ3NbXFxcImRhdGFcXFwiXVxcbiAgICAgICAgICAgIHNlbGYua2V5cyA9IHNlbGYuZGF0YVswXS5rZXlzKClcXG4gICAgICAgICAgICBzZWxmLnZhbHMgPSBzZWxmLmRhdGFcXG4gICAgICAgIGVsaWYgbGVuKGt3YXJncykgPT0gMiBhbmQgKFxcXCJjb2x1bW5zXFxcIiBpbiBrd2FyZ3MpIGFuZCAoXFxcInJvd3NcXFwiIGluIGt3YXJncyk6XFxuICAgICAgICAgICAgc2VsZi5rZXlzID0ga3dhcmdzW1xcXCJjb2x1bW5zXFxcIl1cXG4gICAgICAgICAgICBzZWxmLnZhbHMgPSBbXVxcbiAgICAgICAgICAgIGZvciByIGluIGt3YXJnc1tcXFwicm93c1xcXCJdOlxcbiAgICAgICAgICAgICAgICBzZWxmLnZhbHMuYXBwZW5kKGRpY3QoemlwKHNlbGYua2V5cywgcikpKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBrZXlzID0ga3dhcmdzLmtleXMoKVxcbiAgICAgICAgICAgIHZhbHMgPSBbXVxcbiAgICAgICAgICAgIHByaW1hcnlfa2V5ID0gbGlzdChrZXlzKVswXVxcbiAgICAgICAgICAgIGZvciBpeCBpbiByYW5nZShsZW4oa3dhcmdzW3ByaW1hcnlfa2V5XSkpOlxcbiAgICAgICAgICAgICAgICBkID0ge31cXG4gICAgICAgICAgICAgICAgZm9yIGtleSBpbiBrZXlzOlxcbiAgICAgICAgICAgICAgICAgICAgZFtrZXldID0ga3dhcmdzW2tleV1baXhdXFxuICAgICAgICAgICAgICAgIHZhbHMuYXBwZW5kKGQpXFxuICAgICAgICAgICAgc2VsZi52YWxzID0gdmFsc1xcbiAgICAgICAgICAgIHNlbGYua2V5cyA9IGtleXNcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICAjIGhlYWRlciA9IFxcXCJcXFxcdFxcXCIuam9pbihzZWxmLmtleXMpICsgXFxcIlxcXFxuXFxcIlxcbiAgICAgICAgaGVhZGVyID0gXFxcIlxcXCJcXG4gICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzOlxcbiAgICAgICAgICAgIGhlYWRlciArPSBrZXkuY2VudGVyKDEwKSArIFxcXCIgXFxcIlxcbiAgICAgICAgaGVhZGVyICs9IFxcXCJcXFxcblxcXCJcXG4gICAgICAgIHRlbXBsYXRlID0gXFxcIlxcXCJcXG4gICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzOlxcbiAgICAgICAgICAgIHRlbXBsYXRlICs9IFxcXCJ7XFxcIiArIGtleSArIFxcXCI6IDwxMH0gXFxcIlxcbiAgICAgICAgdGVtcGxhdGUgKz0gXFxcIlxcXFxuXFxcIlxcbiAgICAgICAgcmVzID0gXFxcIlxcXCJcXG4gICAgICAgIGZvciByb3cgaW4gc2VsZi52YWxzOlxcbiAgICAgICAgICAgIHJlcyArPSB0ZW1wbGF0ZS5mb3JtYXQoKipyb3cpXFxuXFxuICAgICAgICByZXR1cm4gaGVhZGVyICsgcmVzXFxuXFxuXFxuaWYgX19uYW1lX18gPT0gXFxcIl9fbWFpbl9fXFxcIjpcXG4gICAgZCA9IERhdGEoYT1bMywgNCwgNV0sIGI9WzEsIDIsIDNdLCBjPVtcXFwiclxcXCIsIFxcXCJnXFxcIiwgXFxcImJcXFwiXSlcXG4gICAgcHJpbnQoZClcXG4gICAgcHJpbnQoXFxuICAgICAgICB0eXBlKFxcbiAgICAgICAgICAgIENoYXJ0KHtcXFwiYVxcXCI6IGxpc3QoXFxcImFiY1xcXCIpLCBcXFwiYlxcXCI6IFsxLCAyLCAzXX0pLm1hcmtfYmFyKCkuZW5jb2RlKHg9XFxcImE6TlxcXCIsIHk9XFxcImJcXFwiKVxcbiAgICAgICAgKVxcbiAgICApXFxuICAgIGFhID0gKFxcbiAgICAgICAgQ2hhcnQoRGF0YShhPVszLCA0LCA1XSwgYj1bMSwgMiwgM10sIGM9W1xcXCJyXFxcIiwgXFxcImdcXFwiLCBcXFwiYlxcXCJdKSlcXG4gICAgICAgIC5tYXJrX3BvaW50KGNvbG9yPVxcXCJyZWRcXFwiKVxcbiAgICAgICAgLmVuY29kZSh4PVxcXCJiXFxcIiwgeT1cXFwiYVxcXCIsIGNvbG9yPVxcXCJjOk9cXFwiKVxcbiAgICApXFxuICAgIHByaW50KFxcXCJhYSA9IFxcXCIsIGFhKVxcbiAgICBhYS5kaXNwbGF5KClcXG5cXG4gICAgYmIgPSAoXFxuICAgICAgICBDaGFydChEYXRhKGE9WzEsIDIsIDNdLCBiPVs0LCA1LCA2XSwgYz1bXFxcInJcXFwiLCBcXFwiZ1xcXCIsIFxcXCJiXFxcIl0pKVxcbiAgICAgICAgLm1hcmtfbGluZSgpXFxuICAgICAgICAuZW5jb2RlKHg9XFxcImJcXFwiLCB5PVxcXCJhXFxcIiwgY29sb3I9XFxcImM6T1xcXCIpXFxuICAgIClcXG4gICAgcHJpbnQoXFxcImJiID0gXFxcIiwgYmIpXFxuICAgIGJiLmRpc3BsYXkoKVxcbiAgICBwcmludChcXFwiYWErYmJcXFwiLCAoYWEgKyBiYikuZGlzcGxheSgpKVxcbiAgICAjIENoYXJ0KERhdGEoYT1bMSwyLDMsMiwyLDQsNSw1LDYsNyw4LDgsOCw4LDgsOSwwLDBdKSkubWFya19iYXIoKS5lbmNvZGUoQXhpcygnYTpRJywgYmluPVRydWUpLHk9J2NvdW50KCknKVxcblxcblxcbiMgdG9kbzogc2VlIGlmIEkgY2FuIHdvcmsgd2l0aCB0aGUgcmVwciBvZiBhbiBvYmplY3QgdG8gZ2V0IHRoZSBiZWhhdmlvciB0aGF0IGFsdGFpciBnZXRzIGluIG5vdGVib29rc1xcbiMgdG9kbzogaW1wbGVtZW50IGEgQmluIG9iamVjdCB0byBzcGVjaWZpeSBtYXhiaW5zXFxuXCIsXCJzcmMvbGliL2FsdGFpci92ZWdhX2NhbGxlci5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e19fZmlsZV9fOlxcXCIvc3JjL2xpYi92ZWdhX2NhbGxlci5qc1xcXCIsX19wYWNrYWdlX186U2suYnVpbHRpbi5ub25lLm5vbmUkLHJlbmRlcl9ncmFwaDpuZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcInJlbmRlcl9ncmFwaFxcXCIsYXJndW1lbnRzLDEsMSk7bGV0IGI9XFxcIiNcXFwiK1NrLmRpdmlkK1xcXCJfZ3JhcGhpY3NcXFwiO3RyeXt2ZWdhRW1iZWQoYixTay5mZmkucmVtYXBUb0pzKGEpLHthY3Rpb25zOiEwfSl9Y2F0Y2goYSl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uRXhjZXB0aW9uKFxcXCJFcnJvciBpbiBncmFwaCBzcGVjaWZpY2F0aW9uIHVuYWJsZSB0byByZW5kZXIgdGhlIGdyYXBoXFxcXG5cXFwiK2EubWVzc2FnZSl9fSl9O3JldHVybiBhfTtcIixcInNyYy9saWIvYW50aWdyYXZpdHkucHlcIjpcImltcG9ydCB3ZWJicm93c2VyXFxuXFxud2ViYnJvd3Nlci5vcGVuKFxcXCJodHRwczovL3hrY2QuY29tLzM1My9cXFwiKVxcblwiLFwic3JjL2xpYi9hbnlkYm0ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFueWRibSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FycmF5LmpzXCI6XCIkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9LGI9W1xcXCJjXFxcIixcXFwiYlxcXCIsXFxcIkJcXFwiLFxcXCJ1XFxcIixcXFwiaFxcXCIsXFxcIkhcXFwiLFxcXCJpXFxcIixcXFwiSVxcXCIsXFxcImxcXFwiLFxcXCJMXFxcIixcXFwiZlxcXCIsXFxcImRcXFwiXTtyZXR1cm4gYS5fX25hbWVfXz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImFycmF5XFxcIiksYS5hcnJheT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxjKXtjLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksLTE9PWIuaW5kZXhPZihTay5mZmkucmVtYXBUb0pzKGMpKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJiYWQgdHlwZWNvZGUgKG11c3QgYmUgYywgYiwgQiwgdSwgaCwgSCwgaSwgSSwgbCwgTCwgZiBvciBkKVxcXCIpO2lmKGQmJiFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJpdGVyYXRpb24gb3ZlciBub24tc2VxdWVuY2VcXFwiKTtpZihhLiRkLm1wJGFzc19zdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJ0eXBlY29kZVxcXCIpLGMpLGEuJGQubXAkYXNzX3N1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5zdHIoXFxcIl9fbW9kdWxlX19cXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImFycmF5XFxcIikpLGEudHlwZWNvZGU9Yyx2b2lkIDA9PT1kKWEuaW50ZXJuYWxJdGVyYWJsZT1uZXcgU2suYnVpbHRpbi5saXN0O2Vsc2UgaWYoZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdClhLmludGVybmFsSXRlcmFibGU9ZDtlbHNlIGZvcihhLmludGVybmFsSXRlcmFibGU9bmV3IFNrLmJ1aWx0aW4ubGlzdCxpdGVyPVNrLmFic3RyLml0ZXIoZCksaXRlbT1pdGVyLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09aXRlbTtpdGVtPWl0ZXIudHAkaXRlcm5leHQoKSlTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLmFwcGVuZCxbYS5pbnRlcm5hbEl0ZXJhYmxlLGl0ZW1dKX0pLGMuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1Tay5mZmkucmVtYXBUb0pzKGEudHlwZWNvZGUpLGM9XFxcIlxcXCI7cmV0dXJuIFNrLmZmaS5yZW1hcFRvSnMoYS5pbnRlcm5hbEl0ZXJhYmxlKS5sZW5ndGgmJihcXFwiY1xcXCI9PVNrLmZmaS5yZW1hcFRvSnMoYS50eXBlY29kZSk/Yz1cXFwiLCAnXFxcIitTay5mZmkucmVtYXBUb0pzKGEuaW50ZXJuYWxJdGVyYWJsZSkuam9pbihcXFwiXFxcIikrXFxcIidcXFwiOmM9XFxcIiwgXFxcIitTay5mZmkucmVtYXBUb0pzKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmludGVybmFsSXRlcmFibGUuX19yZXByX18sW2EuaW50ZXJuYWxJdGVyYWJsZV0pKSksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhcnJheSgnXFxcIitiK1xcXCInXFxcIitjK1xcXCIpXFxcIil9KSxjLl9fc3RyX189Yy5fX3JlcHJfXyxjLl9fZ2V0YXR0cmlidXRlX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBhLnRwJGdldGF0dHIoYil9KSxjLmFwcGVuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmludGVybmFsSXRlcmFibGUuYXBwZW5kLFthLmludGVybmFsSXRlcmFibGUsYl0pLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuZXh0ZW5kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJpdGVyYXRpb24gb3ZlciBub24tc2VxdWVuY2VcXFwiKTtmb3IoaXRlcj1Tay5hYnN0ci5pdGVyKGIpLGl0ZW09aXRlci50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWl0ZW07aXRlbT1pdGVyLnRwJGl0ZXJuZXh0KCkpU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuaW50ZXJuYWxJdGVyYWJsZS5hcHBlbmQsW2EuaW50ZXJuYWxJdGVyYWJsZSxpdGVtXSl9KX0sXFxcImFycmF5XFxcIixbXSksYX07XCIsXCJzcmMvbGliL2FzdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYXN0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYXN5bmNoYXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFzeW5jaGF0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYXN5bmNvcmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFzeW5jb3JlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYXRleGl0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhdGV4aXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hdWRpb2Rldi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYXVkaW9kZXYgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9iYXNlNjQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImJhc2U2NCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2JkYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYmRiIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmluaGV4LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJiaW5oZXggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9iaXNlY3QucHlcIjpcIlxcXCJcXFwiXFxcIkJpc2VjdGlvbiBhbGdvcml0aG1zLlxcXCJcXFwiXFxcIlxcblxcbmRlZiBpbnNvcnRfcmlnaHQoYSwgeCwgbG89MCwgaGk9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIkluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhbmQga2VlcCBpdCBzb3J0ZWQgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIElmIHggaXMgYWxyZWFkeSBpbiBhLCBpbnNlcnQgaXQgdG8gdGhlIHJpZ2h0IG9mIHRoZSByaWdodG1vc3QgeC5cXG5cXG4gICAgT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgbGVuKGEpKSBib3VuZCB0aGVcXG4gICAgc2xpY2Ugb2YgYSB0byBiZSBzZWFyY2hlZC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIGlmIGxvIDwgMDpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xvIG11c3QgYmUgbm9uLW5lZ2F0aXZlJylcXG4gICAgaWYgaGkgaXMgTm9uZTpcXG4gICAgICAgIGhpID0gbGVuKGEpXFxuICAgIHdoaWxlIGxvIDwgaGk6XFxuICAgICAgICBtaWQgPSAobG8raGkpLy8yXFxuICAgICAgICBpZiB4IDwgYVttaWRdOiBoaSA9IG1pZFxcbiAgICAgICAgZWxzZTogbG8gPSBtaWQrMVxcbiAgICBhLmluc2VydChsbywgeClcXG5cXG5kZWYgYmlzZWN0X3JpZ2h0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGluZGV4IHdoZXJlIHRvIGluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhc3N1bWluZyBhIGlzIHNvcnRlZC5cXG5cXG4gICAgVGhlIHJldHVybiB2YWx1ZSBpIGlzIHN1Y2ggdGhhdCBhbGwgZSBpbiBhWzppXSBoYXZlIGUgPD0geCwgYW5kIGFsbCBlIGluXFxuICAgIGFbaTpdIGhhdmUgZSA+IHguICBTbyBpZiB4IGFscmVhZHkgYXBwZWFycyBpbiB0aGUgbGlzdCwgYS5pbnNlcnQoeCkgd2lsbFxcbiAgICBpbnNlcnQganVzdCBhZnRlciB0aGUgcmlnaHRtb3N0IHggYWxyZWFkeSB0aGVyZS5cXG5cXG4gICAgT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgbGVuKGEpKSBib3VuZCB0aGVcXG4gICAgc2xpY2Ugb2YgYSB0byBiZSBzZWFyY2hlZC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIGlmIGxvIDwgMDpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xvIG11c3QgYmUgbm9uLW5lZ2F0aXZlJylcXG4gICAgaWYgaGkgaXMgTm9uZTpcXG4gICAgICAgIGhpID0gbGVuKGEpXFxuICAgIHdoaWxlIGxvIDwgaGk6XFxuICAgICAgICBtaWQgPSAobG8raGkpLy8yXFxuICAgICAgICBpZiB4IDwgYVttaWRdOiBoaSA9IG1pZFxcbiAgICAgICAgZWxzZTogbG8gPSBtaWQrMVxcbiAgICByZXR1cm4gbG9cXG5cXG5kZWYgaW5zb3J0X2xlZnQoYSwgeCwgbG89MCwgaGk9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIkluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhbmQga2VlcCBpdCBzb3J0ZWQgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIElmIHggaXMgYWxyZWFkeSBpbiBhLCBpbnNlcnQgaXQgdG8gdGhlIGxlZnQgb2YgdGhlIGxlZnRtb3N0IHguXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgYVttaWRdIDwgeDogbG8gPSBtaWQrMVxcbiAgICAgICAgZWxzZTogaGkgPSBtaWRcXG4gICAgYS5pbnNlcnQobG8sIHgpXFxuXFxuXFxuZGVmIGJpc2VjdF9sZWZ0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGluZGV4IHdoZXJlIHRvIGluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhc3N1bWluZyBhIGlzIHNvcnRlZC5cXG5cXG4gICAgVGhlIHJldHVybiB2YWx1ZSBpIGlzIHN1Y2ggdGhhdCBhbGwgZSBpbiBhWzppXSBoYXZlIGUgPCB4LCBhbmQgYWxsIGUgaW5cXG4gICAgYVtpOl0gaGF2ZSBlID49IHguICBTbyBpZiB4IGFscmVhZHkgYXBwZWFycyBpbiB0aGUgbGlzdCwgYS5pbnNlcnQoeCkgd2lsbFxcbiAgICBpbnNlcnQganVzdCBiZWZvcmUgdGhlIGxlZnRtb3N0IHggYWxyZWFkeSB0aGVyZS5cXG5cXG4gICAgT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgbGVuKGEpKSBib3VuZCB0aGVcXG4gICAgc2xpY2Ugb2YgYSB0byBiZSBzZWFyY2hlZC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIGlmIGxvIDwgMDpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xvIG11c3QgYmUgbm9uLW5lZ2F0aXZlJylcXG4gICAgaWYgaGkgaXMgTm9uZTpcXG4gICAgICAgIGhpID0gbGVuKGEpXFxuICAgIHdoaWxlIGxvIDwgaGk6XFxuICAgICAgICBtaWQgPSAobG8raGkpLy8yXFxuICAgICAgICBpZiBhW21pZF0gPCB4OiBsbyA9IG1pZCsxXFxuICAgICAgICBlbHNlOiBoaSA9IG1pZFxcbiAgICByZXR1cm4gbG9cXG5cXG4jIE92ZXJ3cml0ZSBhYm92ZSBkZWZpbml0aW9ucyB3aXRoIGEgZmFzdCBDIGltcGxlbWVudGF0aW9uXFxudHJ5OlxcbiAgICBmcm9tIF9iaXNlY3QgaW1wb3J0ICpcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG5cXG4jIENyZWF0ZSBhbGlhc2VzXFxuYmlzZWN0ID0gYmlzZWN0X3JpZ2h0XFxuaW5zb3J0ID0gaW5zb3J0X3JpZ2h0XFxuXCIsXCJzcmMvbGliL2JzZGRiL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJic2RkYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NQcm9maWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjUHJvZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NhbGVuZGFyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjYWxlbmRhciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NnaS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY2dpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY2dpdGIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNnaXRiIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY2h1bmsucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNodW5rIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY21kLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjbWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb2RlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb2RlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29kZWNzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb2RlY3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb2Rlb3AucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvZGVvcCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvbGxlY3Rpb25zLmpzXCI6XCJmdW5jdGlvbiAkYnVpbHRpbm1vZHVsZSgpe2NvbnN0IGE9e307cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcXFwia2V5d29yZFxcXCIsITEsITApLGI9PihhLl9pc2tleXdvcmQ9Yi4kZC5pc2tleXdvcmQsU2suaW1wb3J0TW9kdWxlKFxcXCJpdGVydG9vbHNcXFwiLCExLCEwKSksYj0+KGEuX2NoYWluPWIuJGQuY2hhaW4sYS5fc3Rhcm1hcD1iLiRkLnN0YXJtYXAsYS5fcmVwZWF0PWIuJGQucmVwZWF0LFNrLmltcG9ydE1vZHVsZShcXFwib3BlcmF0b3JcXFwiLCExLCEwKSksYj0+e2EuX2l0ZW1nZXR0ZXI9Yi4kZC5pdGVtZ2V0dGVyfSwoKT0+Y29sbGVjdGlvbnNfbW9kKGEpKX1mdW5jdGlvbiBjb2xsZWN0aW9uc19tb2QoYSl7ZnVuY3Rpb24gY291bnRlck51bWJlclNsb3QoYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKHZvaWQgMCE9PWMmJiEoYyBpbnN0YW5jZW9mIGEuQ291bnRlcikpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGQ9bmV3IGEuQ291bnRlcjtyZXR1cm4gYi5jYWxsKHRoaXMsZCxjKSxkfX1mdW5jdGlvbiBjb3VudGVySW5wbGFjZVNsb3QoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoIShjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIkNvdW50ZXIgXFxcIithK1xcXCI9IFxcXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXFxcIiBpcyBub3Qgc3VwcG9ydGVkXFxcIik7cmV0dXJuIGIuY2FsbCh0aGlzLGMpLHRoaXMua2VlcCRwb3NpdGl2ZSgpfX1mdW5jdGlvbiBuYW1lZHR1cGxlKGIsYyxkLGwsbSl7ZnVuY3Rpb24gX21ha2UoYSxiKXtyZXR1cm4gYS5wcm90b3R5cGUudHAkbmV3KFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGIpKX1mdW5jdGlvbiBfYXNkaWN0KGEpe2NvbnN0IGI9W107Zm9yKGxldCBjPTA7YzxhLl9maWVsZHMudi5sZW5ndGg7YysrKWIucHVzaChhLl9maWVsZHMudltjXSksYi5wdXNoKGEudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmRpY3QoYil9ZnVuY3Rpb24gX3JlcGxhY2UoYSxiKXthPW5ldyBTay5idWlsdGluLmRpY3QoYSk7Y29uc3QgYz1hLnRwJGdldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJwb3BcXFwiKSksZD1Tay5hYnN0ci5nYXR0cihiLG5ldyBTay5idWlsdGluLnN0cihcXFwiX21ha2VcXFwiKSksZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXksZj1lKGQsW2UoU2suYnVpbHRpbi5tYXBfLFtjLHIsYl0pXSk7aWYoYS5zcSRsZW5ndGgoKSl7Y29uc3QgYj1hLnNrJGFzYXJyYXkoKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJHb3QgdW5leHBlY3RkIGZpZWxkIG5hbWVzOiBbXFxcIitiLm1hcChhPT5cXFwiJ1xcXCIrYS4kanNzdHIoKStcXFwiJ1xcXCIpK1xcXCJdXFxcIil9cmV0dXJuIGZ9aWYoYj1iLnRwJHN0cigpLFNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5faXNrZXl3b3JkLFtiXSkpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlR5cGUgbmFtZXMgYW5kIGZpZWxkIG5hbWVzIGNhbm5vdCBiZSBhIGtleXdvcmQ6ICdcXFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYikrXFxcIidcXFwiKTtjb25zdCBuPWIuJGpzc3RyKCk7aWYoZS50ZXN0KG4pfHwhZy50ZXN0KG4pfHwhbil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBtdXN0IGJlIHZhbGlkIGlkZW50aWZpZXJzOiAnXFxcIituK1xcXCInXFxcIik7bGV0IG8scDtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKW89Yy4kanNzdHIoKS5yZXBsYWNlKGgsXFxcIiBcXFwiKS5zcGxpdChqKSwxPT1vLmxlbmd0aCYmXFxcIlxcXCI9PT1vWzBdJiYobz1bXSkscD1vLm1hcChhPT5uZXcgU2suYnVpbHRpbi5zdHIoYSkpO2Vsc2V7bz1bXSxwPVtdO2ZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpYj1iLnRwJHN0cigpLHAucHVzaChiKSxvLnB1c2goYi4kanNzdHIoKSl9bGV0IHE9bmV3IFNldDtpZihTay5taXNjZXZhbC5pc1RydWUoZCkpZm9yKGk9MDtpPG8ubGVuZ3RoO2krKykoU2subWlzY2V2YWwuaXNUcnVlKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLl9pc2tleXdvcmQsW3BbaV1dKSl8fGYudGVzdChvW2ldKXx8IWcudGVzdChvW2ldKXx8IW9baV18fHEuaGFzKG9baV0pKSYmKG9baV09XFxcIl9cXFwiK2kscFtpXT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIl9cXFwiK2kpKSxxLmFkZChvW2ldKTtlbHNlIGZvcihpPTA7aTxvLmxlbmd0aDtpKyspe2lmKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5faXNrZXl3b3JkLFtwW2ldXSkpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlR5cGUgbmFtZXMgYW5kIGZpZWxkIG5hbWVzIGNhbm5vdCBiZSBhIGtleXdvcmQ6ICdcXFwiK29baV0rXFxcIidcXFwiKTtlbHNlIGlmKGYudGVzdChvW2ldKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJGaWVsZCBuYW1lcyBjYW5ub3Qgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlOiAnXFxcIitvW2ldK1xcXCInXFxcIik7ZWxzZSBpZighZy50ZXN0KG9baV0pfHwhb1tpXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBtdXN0IGJlIHZhbGlkIGlkZW50aWZpZXJzOiAnXFxcIitvW2ldK1xcXCInXFxcIik7ZWxzZSBpZihxLmhhcyhvW2ldKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJFbmNvdW50ZXJlZCBkdXBsaWNhdGUgZmllbGQgbmFtZTogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO3EuYWRkKG9baV0pfWNvbnN0IHI9bmV3IFNrLmJ1aWx0aW4udHVwbGUocCkscz1bXTtsZXQgdD1bXTtpZighU2suYnVpbHRpbi5jaGVja05vbmUobCkpe2lmKHQ9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUobCksdC5sZW5ndGg+by5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJHb3QgbW9yZSBkZWZhdWx0IHZhbHVlcyB0aGFuIGZpZWxkIG5hbWVzXFxcIik7Zm9yKGxldCBhPTAsYj1wLmxlbmd0aC10Lmxlbmd0aDtiPHAubGVuZ3RoO2ErKyxiKyspcy5wdXNoKHBbYl0pLHMucHVzaCh0W2FdKX1jb25zdCB1PW5ldyBTay5idWlsdGluLmRpY3Qocyk7X21ha2UuY29fdmFybmFtZXM9W1xcXCJfY2xzXFxcIixcXFwiaXRlcmFibGVcXFwiXSxfYXNkaWN0LmNvX3Zhcm5hbWVzPVtcXFwic2VsZlxcXCJdLF9yZXBsYWNlLmNvX2t3YXJncz0xLF9yZXBsYWNlLmNvX3Zhcm5hbWVzPVtcXFwiX3NlbGZcXFwiXTtjb25zdCB2PXt9O2ZvcihsZXQgZT0wO2U8by5sZW5ndGg7ZSsrKXZbcFtlXS4kbWFuZ2xlZF09bmV3IFNrLmJ1aWx0aW4ucHJvcGVydHkobmV3IGEuX2l0ZW1nZXR0ZXIoW25ldyBTay5idWlsdGluLmludF8oZSldKSx2b2lkIDAsdm9pZCAwLG5ldyBTay5idWlsdGluLnN0cihcXFwiQWxpYXMgZm9yIGZpZWxkIG51bWJlciBcXFwiK2UpKTtyZXR1cm4gU2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhuLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBOYW1lZFR1cGxlKCl7fSxiYXNlOlNrLmJ1aWx0aW4udHVwbGUsc2xvdHM6e3RwJGRvYzpuK1xcXCIoXFxcIitvLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiLHRwJG5ldyhhLGIpe2E9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcIl9fbmV3X19cXFwiLG8sYSxiLHQpO2NvbnN0IGM9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIFNrLmJ1aWx0aW4udHVwbGUuY2FsbChjLGEpLGN9LCRyKCl7Y29uc3QgYT10aGlzLnYubWFwKChhLGIpPT5vW2JdK1xcXCI9XFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1xcXCIoXFxcIithLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiKX19LHByb3RvOk9iamVjdC5hc3NpZ24oe19fbW9kdWxlX186U2suYnVpbHRpbi5jaGVja05vbmUobSk/U2suZ2xvYmFscy5fX25hbWVfXzptLF9fc2xvdHNfXzpuZXcgU2suYnVpbHRpbi50dXBsZSxfZmllbGRzOnIsX2ZpZWxkX2RlZmF1bHRzOnUsX21ha2U6bmV3IFNrLmJ1aWx0aW4uY2xhc3NtZXRob2QobmV3IFNrLmJ1aWx0aW4uZnVuYyhfbWFrZSkpLF9hc2RpY3Q6bmV3IFNrLmJ1aWx0aW4uZnVuYyhfYXNkaWN0KSxfcmVwbGFjZTpuZXcgU2suYnVpbHRpbi5mdW5jKF9yZXBsYWNlKX0sdil9KX1hLl9fYWxsX189bmV3IFNrLmJ1aWx0aW4ubGlzdChbXFxcImRlcXVlXFxcIixcXFwiZGVmYXVsdGRpY3RcXFwiLFxcXCJuYW1lZHR1cGxlXFxcIixcXFwiQ291bnRlclxcXCIsXFxcIk9yZGVyZWREaWN0XFxcIl0ubWFwKGE9Pm5ldyBTay5idWlsdGluLnN0cihhKSkpLGEuZGVmYXVsdGRpY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiY29sbGVjdGlvbnMuZGVmYXVsdGRpY3RcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBkZWZhdWx0ZGljdChhLGIpe3RoaXMuZGVmYXVsdF9mYWN0b3J5PWEsU2suYnVpbHRpbi5kaWN0LmNhbGwodGhpcyxiKX0sYmFzZTpTay5idWlsdGluLmRpY3QsbWV0aG9kczp7Y29weTp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH19LF9fY29weV9fOnskbWV0aCgpe3JldHVybiB0aGlzLiRjb3B5KCl9LCRmbGFnczp7Tm9BcmdzOiEwfX0sX19taXNzaW5nX186eyRtZXRoKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMuZGVmYXVsdF9mYWN0b3J5KSl0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTtlbHNle2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMuZGVmYXVsdF9mYWN0b3J5LFtdKTtyZXR1cm4gdGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsYiksYn19LCRmbGFnczp7T25lQXJnOiEwfX19LGdldHNldHM6e2RlZmF1bHRfZmFjdG9yeTp7JGdldCgpe3JldHVybiB0aGlzLmRlZmF1bHRfZmFjdG9yeX0sJHNldChhKXthPWF8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0aGlzLmRlZmF1bHRfZmFjdG9yeT1hfX19LHNsb3RzOnt0cCRkb2M6XFxcImRlZmF1bHRkaWN0KGRlZmF1bHRfZmFjdG9yeVssIC4uLl0pIC0tPiBkaWN0IHdpdGggZGVmYXVsdCBmYWN0b3J5XFxcXG5cXFxcblRoZSBkZWZhdWx0IGZhY3RvcnkgaXMgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzIHRvIHByb2R1Y2VcXFxcbmEgbmV3IHZhbHVlIHdoZW4gYSBrZXkgaXMgbm90IHByZXNlbnQsIGluIF9fZ2V0aXRlbV9fIG9ubHkuXFxcXG5BIGRlZmF1bHRkaWN0IGNvbXBhcmVzIGVxdWFsIHRvIGEgZGljdCB3aXRoIHRoZSBzYW1lIGl0ZW1zLlxcXFxuQWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgaWYgdGhleSB3ZXJlXFxcXG5wYXNzZWQgdG8gdGhlIGRpY3QgY29uc3RydWN0b3IsIGluY2x1ZGluZyBrZXl3b3JkIGFyZ3VtZW50cy5cXFxcblxcXCIsdHAkaW5pdChhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO2lmKHZvaWQgMD09PWMpdGhpcy5kZWZhdWx0X2ZhY3Rvcnk9U2suYnVpbHRpbi5ub25lLm5vbmUkO2Vsc2UgaWYoIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShjKSYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZVxcXCIpO2Vsc2UgdGhpcy5kZWZhdWx0X2ZhY3Rvcnk9YztyZXR1cm4gU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS50cCRpbml0LmNhbGwodGhpcyxhLGIpfSwkcigpe2NvbnN0IGE9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLmRlZmF1bHRfZmFjdG9yeSksYj1Tay5idWlsdGluLmRpY3QucHJvdG90eXBlLiRyLmNhbGwodGhpcykudjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJkZWZhdWx0ZGljdChcXFwiK2ErXFxcIiwgXFxcIitiK1xcXCIpXFxcIil9fSxwcm90bzp7JGNvcHkoKXtjb25zdCBiPVtdO3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIodGhpcyksYT0+e2IucHVzaChhKSxiLnB1c2godGhpcy5tcCRzdWJzY3JpcHQoYSkpfSksbmV3IGEuZGVmYXVsdGRpY3QodGhpcy5kZWZhdWx0X2ZhY3RvcnksYil9fX0pLGEuQ291bnRlcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJDb3VudGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gQ291bnRlcigpe3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdCxTay5idWlsdGluLmRpY3QuYXBwbHkodGhpcyl9LGJhc2U6U2suYnVpbHRpbi5kaWN0LG1ldGhvZHM6e2VsZW1lbnRzOnskZmxhZ3M6e05vQXJnczohMH0sJG1ldGgoKXtjb25zdCBiPWEuX2NoYWluLnRwJGdldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJmcm9tX2l0ZXJhYmxlXFxcIikpLGM9YS5fc3Rhcm1hcCxkPWEuX3JlcGVhdCxlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheTtyZXR1cm4gZShiLFtlKGMsW2QsZSh0aGlzLnRwJGdldGF0dHIodGhpcy5zdHIkaXRlbXMpKV0pXSl9fSxtb3N0X2NvbW1vbjp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJuXFxcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4ubm9uZS5ub25lJF19LCRtZXRoKGEpe2xlbmd0aD10aGlzLnNxJGxlbmd0aCgpLFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpP2E9bGVuZ3RoOihhPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpLGE9YT5sZW5ndGg/bGVuZ3RoOjA+YT8wOmEpO2NvbnN0IGI9dGhpcy4kaXRlbXMoKS5zb3J0KChjLGEpPT5Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woY1sxXSxhWzFdLFxcXCJMdFxcXCIpPzE6U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbMV0sYVsxXSxcXFwiR3RcXFwiKT8tMTowKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiLnNsaWNlKDAsYSkubWFwKGE9Pm5ldyBTay5idWlsdGluLnR1cGxlKGEpKSl9fSx1cGRhdGU6eyRmbGFnczp7RmFzdENhbGw6ITB9LCRtZXRoKGEsYil7cmV0dXJuIFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwidXBkYXRlXFxcIixhLDAsMSksdGhpcy5jb3VudGVyJHVwZGF0ZShhLGIpfX0sc3VidHJhY3Q6eyRmbGFnczp7RmFzdENhbGw6ITB9LCRtZXRoKGEsYil7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJzdWJ0cmFjdFxcXCIsYSwwLDEpO2NvbnN0IGM9YVswXTtpZih2b2lkIDAhPT1jKWlmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpZm9yKGxldCBhPVNrLmFic3RyLml0ZXIoYyksYj1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWEudHAkaXRlcm5leHQoKSl7Y29uc3QgYT10aGlzLm1wJHN1YnNjcmlwdChiKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoYixTay5hYnN0ci5udW1iZXJCaW5PcChhLGMubXAkc3Vic2NyaXB0KGIpLFxcXCJTdWJcXFwiKSl9ZWxzZSBmb3IoaXRlcj1Tay5hYnN0ci5pdGVyKGMpLGs9aXRlci50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWs7az1pdGVyLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoayk7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGssU2suYWJzdHIubnVtYmVyQmluT3AoYSx0aGlzLiRvbmUsXFxcIlN1YlxcXCIpKX1iPWJ8fFtdO2ZvcihsZXQgYz0wO2M8Yi5sZW5ndGg7Yys9Mil7Y29uc3QgYT1uZXcgU2suYnVpbHRpbi5zdHIoYltjXSksZD10aGlzLm1wJHN1YnNjcmlwdChhKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoYSxTay5hYnN0ci5udW1iZXJCaW5PcChkLGJbYysxXSxcXFwiU3ViXFxcIikpfXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9fSxfX21pc3NpbmdfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kemVyb30sJGZsYWdzOntPbmVBcmc6ITB9fSxjb3B5OnskbWV0aCgpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5Db3VudGVyLFt0aGlzXSl9LCRmbGFnczp7Tm9BcmdzOiEwfX19LGdldHNldHM6e19fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH0sc2xvdHM6e3RwJGRvYzpcXFwiRGljdCBzdWJjbGFzcyBmb3IgY291bnRpbmcgaGFzaGFibGUgaXRlbXMuICBTb21ldGltZXMgY2FsbGVkIGEgYmFnXFxcXG4gICAgb3IgbXVsdGlzZXQuICBFbGVtZW50cyBhcmUgc3RvcmVkIGFzIGRpY3Rpb25hcnkga2V5cyBhbmQgdGhlaXIgY291bnRzXFxcXG4gICAgYXJlIHN0b3JlZCBhcyBkaWN0aW9uYXJ5IHZhbHVlcy5cXFxcblxcXFxuICAgID4+PiBjID0gQ291bnRlcignYWJjZGVhYmNkYWJjYWJhJykgICMgY291bnQgZWxlbWVudHMgZnJvbSBhIHN0cmluZ1xcXFxuXFxcXG4gICAgPj4+IGMubW9zdF9jb21tb24oMykgICAgICAgICAgICAgICAgIyB0aHJlZSBtb3N0IGNvbW1vbiBlbGVtZW50c1xcXFxuICAgIFsoJ2EnLCA1KSwgKCdiJywgNCksICgnYycsIDMpXVxcXFxuICAgID4+PiBzb3J0ZWQoYykgICAgICAgICAgICAgICAgICAgICAgICMgbGlzdCBhbGwgdW5pcXVlIGVsZW1lbnRzXFxcXG4gICAgWydhJywgJ2InLCAnYycsICdkJywgJ2UnXVxcXFxuICAgID4+PiAnJy5qb2luKHNvcnRlZChjLmVsZW1lbnRzKCkpKSAgICMgbGlzdCBlbGVtZW50cyB3aXRoIHJlcGV0aXRpb25zXFxcXG4gICAgJ2FhYWFhYmJiYmNjY2RkZSdcXFxcbiAgICA+Pj4gc3VtKGMudmFsdWVzKCkpICAgICAgICAgICAgICAgICAjIHRvdGFsIG9mIGFsbCBjb3VudHNcXFxcbiAgICAxNVxcXFxuXFxcXG4gICAgPj4+IGNbJ2EnXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb3VudCBvZiBsZXR0ZXIgJ2EnXFxcXG4gICAgNVxcXFxuICAgID4+PiBmb3IgZWxlbSBpbiAnc2hhemFtJzogICAgICAgICAgICMgdXBkYXRlIGNvdW50cyBmcm9tIGFuIGl0ZXJhYmxlXFxcXG4gICAgLi4uICAgICBjW2VsZW1dICs9IDEgICAgICAgICAgICAgICAgIyBieSBhZGRpbmcgMSB0byBlYWNoIGVsZW1lbnQncyBjb3VudFxcXFxuICAgID4+PiBjWydhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgbm93IHRoZXJlIGFyZSBzZXZlbiAnYSdcXFxcbiAgICA3XFxcXG4gICAgPj4+IGRlbCBjWydiJ10gICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgYWxsICdiJ1xcXFxuICAgID4+PiBjWydiJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgbm93IHRoZXJlIGFyZSB6ZXJvICdiJ1xcXFxuICAgIDBcXFxcblxcXFxuICAgID4+PiBkID0gQ291bnRlcignc2ltc2FsYWJpbScpICAgICAgICMgbWFrZSBhbm90aGVyIGNvdW50ZXJcXFxcbiAgICA+Pj4gYy51cGRhdGUoZCkgICAgICAgICAgICAgICAgICAgICAjIGFkZCBpbiB0aGUgc2Vjb25kIGNvdW50ZXJcXFxcbiAgICA+Pj4gY1snYSddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgbmluZSAnYSdcXFxcbiAgICA5XFxcXG5cXFxcbiAgICA+Pj4gYy5jbGVhcigpICAgICAgICAgICAgICAgICAgICAgICAjIGVtcHR5IHRoZSBjb3VudGVyXFxcXG4gICAgPj4+IGNcXFxcbiAgICBDb3VudGVyKClcXFxcblxcXFxuICAgIE5vdGU6ICBJZiBhIGNvdW50IGlzIHNldCB0byB6ZXJvIG9yIHJlZHVjZWQgdG8gemVybywgaXQgd2lsbCByZW1haW5cXFxcbiAgICBpbiB0aGUgY291bnRlciB1bnRpbCB0aGUgZW50cnkgaXMgZGVsZXRlZCBvciB0aGUgY291bnRlciBpcyBjbGVhcmVkOlxcXFxuXFxcXG4gICAgPj4+IGMgPSBDb3VudGVyKCdhYWFiYmMnKVxcXFxuICAgID4+PiBjWydiJ10gLT0gMiAgICAgICAgICAgICAgICAgICAgICMgcmVkdWNlIHRoZSBjb3VudCBvZiAnYicgYnkgdHdvXFxcXG4gICAgPj4+IGMubW9zdF9jb21tb24oKSAgICAgICAgICAgICAgICAgIyAnYicgaXMgc3RpbGwgaW4sIGJ1dCBpdHMgY291bnQgaXMgemVyb1xcXFxuICAgIFsoJ2EnLCAzKSwgKCdjJywgMSksICgnYicsIDApXVxcXFxuXFxcXG5cXFwiLHRwJGluaXQoYSxiKXtyZXR1cm4gU2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMudHBqc19uYW1lLGEsMCwxKSx0aGlzLmNvdW50ZXIkdXBkYXRlKGEsYil9LCRyKCl7Y29uc3QgYT0wPHRoaXMuc2l6ZT9Tay5idWlsdGluLmRpY3QucHJvdG90eXBlLiRyLmNhbGwodGhpcykudjpcXFwiXFxcIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1xcXCIoXFxcIithK1xcXCIpXFxcIil9LHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsbXAkYXNzX3N1YnNjcmlwdChhLGIpe3JldHVybiB2b2lkIDA9PT1iP3RoaXMubXAkbG9va3VwKGEpJiZTay5idWlsdGluLmRpY3QucHJvdG90eXBlLm1wJGFzc19zdWJzY3JpcHQuY2FsbCh0aGlzLGEsYik6U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5tcCRhc3Nfc3Vic2NyaXB0LmNhbGwodGhpcyxhLGIpfSx0cCRhc19udW1iZXI6ITAsbmIkcG9zaXRpdmU6Y291bnRlck51bWJlclNsb3QoZnVuY3Rpb24oYSl7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyx0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYixjKX0pfSksbmIkbmVnYXRpdmU6Y291bnRlck51bWJlclNsb3QoZnVuY3Rpb24oYSl7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyx0aGlzLiR6ZXJvLFxcXCJMdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYixTay5hYnN0ci5udW1iZXJCaW5PcCh0aGlzLiR6ZXJvLGMsXFxcIlN1YlxcXCIpKX0pfSksbmIkc3VidHJhY3Q6Y291bnRlck51bWJlclNsb3QoZnVuY3Rpb24oYSxiKXt0aGlzLiRpdGVtcygpLmZvckVhY2goKFtjLGRdKT0+e2NvbnN0IGU9U2suYWJzdHIubnVtYmVyQmluT3AoZCxiLm1wJHN1YnNjcmlwdChjKSxcXFwiU3ViXFxcIik7U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGUsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGMsZSl9KSxiLiRpdGVtcygpLmZvckVhY2goKFtiLGNdKT0+e3ZvaWQgMD09PXRoaXMubXAkbG9va3VwKGIpJiZTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyx0aGlzLiR6ZXJvLFxcXCJMdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYixTay5hYnN0ci5udW1iZXJCaW5PcCh0aGlzLiR6ZXJvLGMsXFxcIlN1YlxcXCIpKX0pfSksbmIkYWRkOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEsYil7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYyxkXSk9Pntjb25zdCBlPVNrLmFic3RyLm51bWJlckJpbk9wKGQsYi5tcCRzdWJzY3JpcHQoYyksXFxcIkFkZFxcXCIpO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChlLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGUpfSksYi4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pnt2b2lkIDA9PT10aGlzLm1wJGxvb2t1cChiKSYmU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsYyl9KX0pLG5iJGlucGxhY2VfYWRkOmNvdW50ZXJJbnBsYWNlU2xvdChcXFwiK1xcXCIsZnVuY3Rpb24oYSl7YS4kaXRlbXMoKS5mb3JFYWNoKChbYSxiXSk9Pntjb25zdCBjPVNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcCh0aGlzLm1wJHN1YnNjcmlwdChhKSxiLFxcXCJBZGRcXFwiKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoYSxjKX0pfSksbmIkaW5wbGFjZV9zdWJ0cmFjdDpjb3VudGVySW5wbGFjZVNsb3QoXFxcIi1cXFwiLGZ1bmN0aW9uKGEpe2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57Y29uc3QgYz1Tay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AodGhpcy5tcCRzdWJzY3JpcHQoYSksYixcXFwiU3ViXFxcIik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsYyl9KX0pLG5iJG9yOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEsYil7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYyxkXSk9Pntjb25zdCBlPWIubXAkc3Vic2NyaXB0KGMpLGY9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGQsZSxcXFwiTHRcXFwiKT9lOmQ7U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGYsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGMsZil9KSxiLiRpdGVtcygpLmZvckVhY2goKFtiLGNdKT0+e3ZvaWQgMD09PXRoaXMubXAkbG9va3VwKGIpJiZTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyx0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYixjKX0pfSksbmIkYW5kOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEsYil7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYyxkXSk9Pntjb25zdCBlPWIubXAkc3Vic2NyaXB0KGMpLGY9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGQsZSxcXFwiTHRcXFwiKT9kOmU7U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGYsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGMsZil9KX0pLG5iJGlucGxhY2VfYW5kOmNvdW50ZXJJbnBsYWNlU2xvdChcXFwiJlxcXCIsZnVuY3Rpb24oYSl7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pntjb25zdCBkPWEubXAkc3Vic2NyaXB0KGIpO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGMsXFxcIkx0XFxcIikmJnRoaXMubXAkYXNzX3N1YnNjcmlwdChiLGQpfSl9KSxuYiRpbnBsYWNlX29yOmNvdW50ZXJJbnBsYWNlU2xvdChcXFwifFxcXCIsZnVuY3Rpb24oYSl7YS4kaXRlbXMoKS5mb3JFYWNoKChbYSxiXSk9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYix0aGlzLm1wJHN1YnNjcmlwdChhKSxcXFwiR3RcXFwiKSYmdGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsYil9KX0pLG5iJHJlZmxlY3RlZF9hbmQ6bnVsbCxuYiRyZWZsZWN0ZWRfb3I6bnVsbCxuYiRyZWZsZWN0ZWRfYWRkOm51bGwsbmIkcmVmbGVjdGVkX3N1YnRyYWN0Om51bGx9LHByb3RvOntrZWVwJHBvc2l0aXZlKCl7cmV0dXJuIHRoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsdGhpcy4kemVybyxcXFwiTHRFXFxcIikmJnRoaXMubXAkYXNzX3N1YnNjcmlwdChhKX0pLHRoaXN9LCR6ZXJvOm5ldyBTay5idWlsdGluLmludF8oMCksJG9uZTpuZXcgU2suYnVpbHRpbi5pbnRfKDEpLHN0ciRpdGVtczpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIml0ZW1zXFxcIiksY291bnRlciR1cGRhdGUoYSxiKXtjb25zdCBjPWFbMF07aWYodm9pZCAwIT09YylpZighU2suYnVpbHRpbi5jaGVja01hcHBpbmcoYykpZm9yKGxldCBhPVNrLmFic3RyLml0ZXIoYyksYj1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWEudHAkaXRlcm5leHQoKSl7Y29uc3QgYT10aGlzLm1wJHN1YnNjcmlwdChiKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoYixTay5hYnN0ci5udW1iZXJCaW5PcChhLHRoaXMuJG9uZSxcXFwiQWRkXFxcIikpfWVsc2UgaWYoIXRoaXMuc3EkbGVuZ3RoKCkpdGhpcy51cGRhdGUkY29tbW9uKGEsdm9pZCAwLFxcXCJ1cGRhdGVcXFwiKTtlbHNlIGZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoYik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AoYSxjLm1wJHN1YnNjcmlwdChiKSxcXFwiQWRkXFxcIikpfWlmKGImJmIubGVuZ3RoKWlmKCF0aGlzLnNxJGxlbmd0aCgpKXRoaXMudXBkYXRlJGNvbW1vbihbXSxiLFxcXCJ1cGRhdGVcXFwiKTtlbHNlIGZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9Mil7Y29uc3QgYz1uZXcgU2suYnVpbHRpbi5zdHIoYlthXSksZD10aGlzLm1wJHN1YnNjcmlwdChjKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoYyxTay5hYnN0ci5udW1iZXJCaW5PcChkLGJbYSsxXSxcXFwiQWRkXFxcIikpfXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9fSxjbGFzc21ldGhvZHM6e2Zyb21rZXlzOnskbWV0aDpmdW5jdGlvbiBmcm9ta2V5cygpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNvdW50ZXIuZnJvbWtleXMoKSBpcyB1bmRlZmluZWQuICBVc2UgQ291bnRlcihpdGVyYWJsZSkgaW5zdGVhZC5cXFwiKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfX19fSk7Y29uc3QgYj1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIm9kaWN0X2l0ZXJhdG9yXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gb2RpY3RfaXRlcl8oYSl7dGhpcy4kaW5kZXg9MCx0aGlzLiRzZXE9YS5zayRhc2FycmF5KCksdGhpcy4kb3JpZz1hfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplLGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7YS5PcmRlcmVkRGljdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJPcmRlcmVkRGljdFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIE9yZGVyZWREaWN0KCl7cmV0dXJuIHRoaXMub3JkZXJlZGtleXM9W10sU2suYnVpbHRpbi5kaWN0LmNhbGwodGhpcyksdGhpc30sYmFzZTpTay5idWlsdGluLmRpY3Qsc2xvdHM6e3RwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaW5pdChhLGIpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiT3JkZXJlZERpY3RcXFwiLGEsMCwxKSxhLnVuc2hpZnQodGhpcykscmVzPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnVwZGF0ZSxhLGIpfSx0cCRkb2M6XFxcIkRpY3Rpb25hcnkgdGhhdCByZW1lbWJlcnMgaW5zZXJ0aW9uIG9yZGVyXFxcIiwkcigpe2xldCBhLGI7Y29uc3QgYz1bXTtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksZD1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZDtkPWIudHAkaXRlcm5leHQoKSlhPXRoaXMubXAkc3Vic2NyaXB0KGQpLHZvaWQgMD09PWEmJihhPW51bGwpLGMucHVzaChcXFwiKFxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihkKStcXFwiLCBcXFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXFxcIilcXFwiKTtyZXR1cm4gYj1jLmpvaW4oXFxcIiwgXFxcIiksMDxjLmxlbmd0aCYmKGI9XFxcIltcXFwiK2IrXFxcIl1cXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIk9yZGVyZWREaWN0KFxcXCIrYitcXFwiKVxcXCIpfSx0cCRyaWNoY29tcGFyZShiLGMpe2lmKFxcXCJFcVxcXCIhPWMmJlxcXCJOZVxcXCIhPWMpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGQ9XFxcIkVxXFxcIj09YztpZighKGIgaW5zdGFuY2VvZiBhLk9yZGVyZWREaWN0KSlyZXR1cm4gU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS50cCRyaWNoY29tcGFyZS5jYWxsKHRoaXMsYixjKTtjb25zdCBlPXRoaXMuc2l6ZSxmPWIuc2l6ZTtpZihlIT09ZilyZXR1cm4hZDtmb3IobGV0IGE9dGhpcy50cCRpdGVyKCksZT1iLnRwJGl0ZXIoKSxmPWEudHAkaXRlcm5leHQoKSxnPWUudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1mO2Y9YS50cCRpdGVybmV4dCgpLGc9ZS50cCRpdGVybmV4dCgpKXtpZighU2subWlzY2V2YWwuaXNUcnVlKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmLGcsXFxcIkVxXFxcIikpKXJldHVybiFkO2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoZiksYz1iLm1wJHN1YnNjcmlwdChnKTtpZighU2subWlzY2V2YWwuaXNUcnVlKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLGMsXFxcIkVxXFxcIikpKXJldHVybiFkfXJldHVybiBkfSxtcCRhc3Nfc3Vic2NyaXB0KGEsYil7aWYodm9pZCAwPT09Yil7Y29uc3QgYj10aGlzLnBvcCRpdGVtKGEpO2lmKHZvaWQgMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSl9ZWxzZSB0aGlzLnNldCRpdGVtKGEsYil9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGIodGhpcyl9fSxtZXRob2RzOntwb3A6eyRmbGFnczp7TmFtZWRBcmdzOltcXFwia2V5XFxcIixcXFwiZGVmYXVsdFxcXCJdLERlZmF1bHRzOltudWxsXX0sJG1ldGgoYSxiKXtyZXR1cm4gbnVsbD09PWI/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUucG9wLFt0aGlzLGFdKTpTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5wb3AsW3RoaXMsYSxiXSl9fSxwb3BpdGVtOnskZmxhZ3M6e05hbWVkQXJnczpbXFxcImxhc3RcXFwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ib29sLnRydWUkXX0sJG1ldGgoYSl7bGV0IGIsYztpZighdGhpcy5vcmRlcmVka2V5cy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoXFxcImRpY3Rpb25hcnkgaXMgZW1wdHlcXFwiKTtyZXR1cm4gYj10aGlzLm9yZGVyZWRrZXlzWzBdLFNrLm1pc2NldmFsLmlzVHJ1ZShhKSYmKGI9dGhpcy5vcmRlcmVka2V5c1t0aGlzLm9yZGVyZWRrZXlzLmxlbmd0aC0xXSksYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5wb3AsW3RoaXMsYl0pLG5ldyBTay5idWlsdGluLnR1cGxlKFtiLGNdKX19LG1vdmVfdG9fZW5kOnskZmxhZ3M6e05hbWVkQXJnczpbXFxcImtleVxcXCIsXFxcImxhc3RcXFwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ib29sLnRydWUkXX0sJG1ldGgoYSxiKXtsZXQgYyxkPS0xO2ZvcihsZXQgZT0wO2U8dGhpcy5vcmRlcmVka2V5cy5sZW5ndGg7ZSsrKWlmKGM9dGhpcy5vcmRlcmVka2V5c1tlXSxjPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiRXFcXFwiKSl7ZD1lO2JyZWFrfWlmKC0xIT09ZCl0aGlzLm9yZGVyZWRrZXlzLnNwbGljZShkLDEpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7cmV0dXJuIFNrLm1pc2NldmFsLmlzVHJ1ZShiKT90aGlzLm9yZGVyZWRrZXlzLnB1c2goYSk6dGhpcy5vcmRlcmVka2V5cy51bnNoaWZ0KGEpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fSxwcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLm9yZGVyZWRrZXlzLnNsaWNlKDApfSxzZXQkaXRlbShhLGIpe2NvbnN0IGM9dGhpcy5vcmRlcmVka2V5cy5pbmRleE9mKGEpOy0xPT1jJiZ0aGlzLm9yZGVyZWRrZXlzLnB1c2goYSksU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5zZXQkaXRlbS5jYWxsKHRoaXMsYSxiKX0scG9wJGl0ZW0oYSl7dmFyIGI9dGhpcy5vcmRlcmVka2V5cy5pbmRleE9mKGEpO2lmKC0xIT1iKXJldHVybiB0aGlzLm9yZGVyZWRrZXlzLnNwbGljZShiLDEpLFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUucG9wJGl0ZW0uY2FsbCh0aGlzLGEpfX19KSxhLmRlcXVlPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcImNvbGxlY3Rpb25zLmRlcXVlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZGVxdWUoYSxiLGMsZCxlKXt0aGlzLmhlYWQ9Y3x8MCx0aGlzLnRhaWw9ZHx8MCx0aGlzLm1hc2s9ZXx8MSx0aGlzLm1heGxlbj1iLHRoaXMudj1hfHxbLCxdfSxzbG90czp7dHAkZG9jOlxcXCJkZXF1ZShbaXRlcmFibGVbLCBtYXhsZW5dXSkgLS0+IGRlcXVlIG9iamVjdFxcXFxuXFxcXG5BIGxpc3QtbGlrZSBzZXF1ZW5jZSBvcHRpbWl6ZWQgZm9yIGRhdGEgYWNjZXNzZXMgbmVhciBpdHMgZW5kcG9pbnRzLlxcXCIsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxiKXtpZihbaXRlcmFibGUsbWF4bGVuXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiZGVxdWVcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJtYXhsZW5cXFwiXSxhLGIpLHZvaWQgMCE9PW1heGxlbiYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKG1heGxlbikpaWYobWF4bGVuPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChtYXhsZW4sU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yLFxcXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkXFxcIiksMD5tYXhsZW4pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF4bGVuIG11c3QgYmUgbm9uLW5lZ2F0aXZlXFxcIik7ZWxzZSB0aGlzLm1heGxlbj1tYXhsZW47dGhpcy4kY2xlYXIoKSx2b2lkIDAhPT1pdGVyYWJsZSYmdGhpcy4kZXh0ZW5kKGl0ZXJhYmxlKX0sdHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkcmljaGNvbXBhcmUoYixjKXt2YXIgZD1NYXRoLm1heDtpZih0aGlzPT09YiYmU2subWlzY2V2YWwub3BBbGxvd3NFcXVhbGl0eShjKSlyZXR1cm4hMDtpZighKGIgaW5zdGFuY2VvZiBhLmRlcXVlKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7Y29uc3QgZT1iLGY9dGhpcy52O2I9Yi52O2NvbnN0IGc9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2ssaD1lLnRhaWwtZS5oZWFkJmUubWFzaztsZXQgaixsPWQoZyxoKTtpZihnPT09aClmb3IobD0wO2w8ZyYmbDxoJiYoaj1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZlt0aGlzLmhlYWQrbCZ0aGlzLm1hc2tdLGJbZS5oZWFkK2wmZS5tYXNrXSxcXFwiRXFcXFwiKSwhIWopOysrbCk7aWYobD49Z3x8bD49aClzd2l0Y2goYyl7Y2FzZVxcXCJMdFxcXCI6cmV0dXJuIGc8aDtjYXNlXFxcIkx0RVxcXCI6cmV0dXJuIGc8PWg7Y2FzZVxcXCJFcVxcXCI6cmV0dXJuIGc9PT1oO2Nhc2VcXFwiTm90RXFcXFwiOnJldHVybiBnIT09aDtjYXNlXFxcIkd0XFxcIjpyZXR1cm4gZz5oO2Nhc2VcXFwiR3RFXFxcIjpyZXR1cm4gZz49aDt9cmV0dXJuXFxcIkVxXFxcIiE9PWMmJihcXFwiTm90RXFcXFwiPT09Y3x8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGZbdGhpcy5oZWFkK2wmdGhpcy5tYXNrXSxiW2UuaGVhZCtsJmUubWFza10sYykpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBjKHRoaXMpfSwkcigpe2NvbnN0IGE9W10sYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztpZih0aGlzLiRlbnRlcmVkX3JlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiWy4uLl1cXFwiKTt0aGlzLiRlbnRlcmVkX3JlcHI9ITA7Zm9yKGxldCBjPTA7YzxiO2MrKylhLnB1c2goU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnZbdGhpcy5oZWFkK2MmdGhpcy5tYXNrXSkpO2NvbnN0IGM9U2suYWJzdHIudHlwZU5hbWUodGhpcyk7cmV0dXJuIHZvaWQgMD09PXRoaXMubWF4bGVuPyh0aGlzLiRlbnRlcmVkX3JlcHI9dm9pZCAwLG5ldyBTay5idWlsdGluLnN0cihjK1xcXCIoW1xcXCIrYS5maWx0ZXIoQm9vbGVhbikuam9pbihcXFwiLCBcXFwiKStcXFwiXSlcXFwiKSk6bmV3IFNrLmJ1aWx0aW4uc3RyKGMrXFxcIihbXFxcIithLmZpbHRlcihCb29sZWFuKS5qb2luKFxcXCIsIFxcXCIpK1xcXCJdLCBtYXhsZW49XFxcIit0aGlzLm1heGxlbitcXFwiKVxcXCIpfSx0cCRhc19udW1iZXI6ITAsbmIkYm9vbCgpe3JldHVybiAwIT0odGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2spfSx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHNxJGNvbnRhaW5zKGEpe2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKWlmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkVxXFxcIikpcmV0dXJuITA7cmV0dXJuITF9LHNxJGNvbmNhdChiKXtpZighKGIgaW5zdGFuY2VvZiBhLmRlcXVlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImNhbiBvbmx5IGNvbmNhdGVuYXRlIGRlcXVlIChub3QgJ1xcXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXFxcIicpIHRvIGRlcXVlXFxcIik7Y29uc3QgYz10aGlzLiRjb3B5KCk7Zm9yKGxldCBhPWIudHAkaXRlcigpLGQ9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1hLnRwJGl0ZXJuZXh0KCkpYy4kcHVzaChkKTtyZXR1cm4gY30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrfSxzcSRyZXBlYXQoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhLFxcXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ3t0cCRuYW1lfSdcXFwiKTtjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrLGM9dGhpcy4kY29weSgpO2xldCBkOzA+PWEmJmMuJGNsZWFyKCk7Zm9yKGxldCBlPTE7ZTxhO2UrKylmb3IobGV0IGE9MDthPGI7YSsrKWQ9dGhpcy5oZWFkK2EmdGhpcy5tYXNrLGMuJHB1c2godGhpcy52W2RdKTtyZXR1cm4gY30sbXAkc3Vic2NyaXB0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSk7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztpZihhPj1ifHxhPC1iKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXFxcImRlcXVlIGluZGV4IG91dCBvZiByYW5nZVxcXCIpO2NvbnN0IGM9KDA8PWE/dGhpcy5oZWFkOnRoaXMudGFpbCkrYSZ0aGlzLm1hc2s7cmV0dXJuIHRoaXMudltjXX0sbXAkYXNzX3N1YnNjcmlwdChhLGIpe2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSk7Y29uc3QgYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztpZihhPj1jfHxhPC1jKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXFxcImRlcXVlIGluZGV4IG91dCBvZiByYW5nZVxcXCIpO3ZvaWQgMD09PWI/dGhpcy5kZWwkaXRlbShhKTp0aGlzLnNldCRpdGVtKGEsYil9LG5iJGlucGxhY2VfYWRkKGEpe2Zvcih0aGlzLm1heGxlbj12b2lkIDAsaXQ9U2suYWJzdHIuaXRlcihhKSxpPWl0LnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09aTtpPWl0LnRwJGl0ZXJuZXh0KCkpdGhpcy4kcHVzaChpKTtyZXR1cm4gdGhpc30sbmIkaW5wbGFjZV9tdWx0aXBseShhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixcXFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICd7dHAkbmFtZX0nXFxcIiksMD49YSYmdGhpcy4kY2xlYXIoKTtjb25zdCBiPXRoaXMuJGNvcHkoKSxjPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2ZvcihsZXQgZD0xO2Q8YTtkKyspZm9yKGxldCBhPTA7YTxjO2ErKyl7Y29uc3QgYz10aGlzLmhlYWQrYSZ0aGlzLm1hc2s7Yi4kcHVzaCh0aGlzLnZbY10pfXJldHVybiB0aGlzLnY9Yi52LHRoaXMuaGVhZD1iLmhlYWQsdGhpcy50YWlsPWIudGFpbCx0aGlzLm1hc2s9Yi5tYXNrLHRoaXN9fSxtZXRob2RzOnthcHBlbmQ6eyRtZXRoKGEpe3JldHVybiB0aGlzLiRwdXNoKGEpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiQWRkIGFuIGVsZW1lbnQgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRlcXVlLlxcXCJ9LGFwcGVuZGxlZnQ6eyRtZXRoKGEpe3JldHVybiB0aGlzLiRwdXNoTGVmdChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkFkZCBhbiBlbGVtZW50IHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGRlcXVlLlxcXCJ9LGNsZWFyOnskbWV0aCgpe3JldHVybiB0aGlzLiRjbGVhcigpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBkZXF1ZS5cXFwifSxfX2NvcHlfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS5cXFwifSxjb3B5OnskbWV0aCgpe3JldHVybiB0aGlzLiRjb3B5KCl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiBhIGRlcXVlLlxcXCJ9LGNvdW50OnskbWV0aChhKXtjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2xldCBjPTA7Zm9yKGxldCBkPTA7ZDxiO2QrKylTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W3RoaXMuaGVhZCtkJnRoaXMubWFza10sYSxcXFwiRXFcXFwiKSYmYysrO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELmNvdW50KHZhbHVlKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWVcXFwifSxleHRlbmQ6eyRtZXRoKGEpe3JldHVybiB0aGlzLiRleHRlbmQoYSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJFeHRlbmQgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRlcXVlIHdpdGggZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGVcXFwifSxleHRlbmRsZWZ0OnskbWV0aChhKXtmb3IoaXQ9U2suYWJzdHIuaXRlcihhKSxpPWl0LnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09aTtpPWl0LnRwJGl0ZXJuZXh0KCkpdGhpcy4kcHVzaExlZnQoaSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRXh0ZW5kIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGRlcXVlIHdpdGggZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGVcXFwifSxpbmRleDp7JG1ldGgoYSxiLGMpe2NvbnN0IGQ9dGhpcy4kaW5kZXgoYSxiLGMpO2lmKHZvaWQgMCE9PWQpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1xcXCIgaXMgbm90IGluIGRlcXVlXFxcIil9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELmluZGV4KHZhbHVlLCBbc3RhcnQsIFtzdG9wXV0pIC0+IGludGVnZXIgLS0gcmV0dXJuIGZpcnN0IGluZGV4IG9mIHZhbHVlLlxcXFxuUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlxcXCJ9LGluc2VydDp7JG1ldGgoYSxiKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXFxcImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCB7dHAkbmFtZX1cXFwiKTtjb25zdCBjPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2lmKHZvaWQgMCE9PXRoaXMubWF4bGVuJiZjPj10aGlzLm1heGxlbil0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJkZXF1ZSBhbHJlYWR5IGF0IGl0cyBtYXhpbXVtIHNpemVcXFwiKTthPmMmJihhPWMpLGE8PS1jJiYoYT0wKTtjb25zdCBkPSgwPD1hP3RoaXMuaGVhZDp0aGlzLnRhaWwpK2EmdGhpcy5tYXNrO2xldCBlPXRoaXMudGFpbDtmb3IodGhpcy50YWlsPXRoaXMudGFpbCsxJnRoaXMubWFzaztlIT09ZDspe2NvbnN0IGE9ZS0xJnRoaXMubWFzazt0aGlzLnZbZV09dGhpcy52W2FdLGU9YX1yZXR1cm4gdGhpcy52W2RdPWIsdGhpcy5oZWFkPT09dGhpcy50YWlsJiZ0aGlzLiRyZXNpemUodGhpcy52Lmxlbmd0aCx0aGlzLnYubGVuZ3RoPDwxKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELmluc2VydChpbmRleCwgb2JqZWN0KSAtLSBpbnNlcnQgb2JqZWN0IGJlZm9yZSBpbmRleFxcXCJ9LHBvcDp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kcG9wKCl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJlbW92ZSBhbmQgcmV0dXJuIHRoZSByaWdodG1vc3QgZWxlbWVudC5cXFwifSxwb3BsZWZ0OnskbWV0aCgpe3JldHVybiB0aGlzLiRwb3BMZWZ0KCl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJlbW92ZSBhbmQgcmV0dXJuIHRoZSBsZWZ0bW9zdCBlbGVtZW50LlxcXCJ9LHJlbW92ZTp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLiRpbmRleChhKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcXFwiIGlzIG5vdCBpbiBkZXF1ZVxcXCIpO2NvbnN0IGM9dGhpcy5oZWFkK2ImdGhpcy5tYXNrO2ZvcihsZXQgYj1jO2IhPT10aGlzLnRhaWw7KXtjb25zdCBhPWIrMSZ0aGlzLm1hc2s7dGhpcy52W2JdPXRoaXMudlthXSxiPWF9dGhpcy50YWlsPXRoaXMudGFpbC0xJnRoaXMubWFzazt2YXIgZD10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztkPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShkLHRoaXMudi5sZW5ndGg+Pj4xKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5yZW1vdmUodmFsdWUpIC0tIHJlbW92ZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHZhbHVlLlxcXCJ9LF9fcmV2ZXJzZWRfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IGQodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkQuX19yZXZlcnNlZF9fKCkgLS0gcmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBkZXF1ZVxcXCJ9LHJldmVyc2U6eyRtZXRoKCl7Y29uc3QgYz10aGlzLmhlYWQsZD10aGlzLnRhaWwsZT10aGlzLm1hc2ssZj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztmb3IobGV0IGc9MDtnPH5+KGYvMik7ZysrKXtjb25zdCBmPWQtZy0xJmUsYT1jK2cmZSxiPXRoaXMudltmXTt0aGlzLnZbZl09dGhpcy52W2FdLHRoaXMudlthXT1ifXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkQucmV2ZXJzZSgpIC0tIHJldmVyc2UgKklOIFBMQUNFKlxcXCJ9LHJvdGF0ZTp7JG1ldGgoYSl7YT12b2lkIDA9PT1hPzE6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtjb25zdCBjPXRoaXMuaGVhZCxkPXRoaXMudGFpbDtpZigwPT09YXx8Yz09PWQpcmV0dXJuIHRoaXM7aWYodGhpcy5oZWFkPWMtYSZ0aGlzLm1hc2ssdGhpcy50YWlsPWQtYSZ0aGlzLm1hc2ssMDxhKWZvcihsZXQgZT0xO2U8PWE7ZSsrKXtjb25zdCBmPWMtZSZ0aGlzLm1hc2ssYT1kLWUmdGhpcy5tYXNrO3RoaXMudltmXT10aGlzLnZbYV0sdGhpcy52W2FdPXZvaWQgMH1lbHNlIGZvcihsZXQgZT0wO2U+YTtlLS0pe2NvbnN0IGY9ZC1lJnRoaXMubWFzayxhPWMtZSZ0aGlzLm1hc2s7dGhpcy52W2ZdPXRoaXMudlthXSx0aGlzLnZbYV09dm9pZCAwfXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSb3RhdGUgdGhlIGRlcXVlIG4gc3RlcHMgdG8gdGhlIHJpZ2h0IChkZWZhdWx0IG49MSkuICBJZiBuIGlzIG5lZ2F0aXZlLCByb3RhdGVzIGxlZnQuXFxcIn19LGdldHNldHM6e21heGxlbjp7JGdldCgpe3JldHVybiB2b2lkIDA9PT10aGlzLm1heGxlbj9Tay5idWlsdGluLm5vbmUubm9uZSQ6bmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLm1heGxlbil9LCRkb2M6XFxcIm1heGltdW0gc2l6ZSBvZiBhIGRlcXVlIG9yIE5vbmUgaWYgdW5ib3VuZGVkXFxcIn19LHByb3RvOnskY2xlYXIoKXt0aGlzLmhlYWQ9MCx0aGlzLnRhaWw9MCx0aGlzLm1hc2s9MSx0aGlzLnY9WywsXX0sJGNvcHkoKXtyZXR1cm4gbmV3IGEuZGVxdWUodGhpcy52LnNsaWNlKDApLHRoaXMubWF4bGVuLHRoaXMuaGVhZCx0aGlzLnRhaWwsdGhpcy5tYXNrKX0sJGV4dGVuZChhKXtmb3IoaXQ9U2suYWJzdHIuaXRlcihhKSxpPWl0LnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09aTtpPWl0LnRwJGl0ZXJuZXh0KCkpdGhpcy4kcHVzaChpKX0sc2V0JGl0ZW0oYSxiKXtjb25zdCBjPSgwPD1hP3RoaXMuaGVhZDp0aGlzLnRhaWwpK2EmdGhpcy5tYXNrO3RoaXMudltjXT1ifSxkZWwkaXRlbShhKXtjb25zdCBiPSgwPD1hP3RoaXMuaGVhZDp0aGlzLnRhaWwpK2EmdGhpcy5tYXNrO2ZvcihsZXQgYz1iO2MhPT10aGlzLnRhaWw7KXtjb25zdCBhPWMrMSZ0aGlzLm1hc2s7dGhpcy52W2NdPXRoaXMudlthXSxjPWF9Y29uc3QgYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzazt0aGlzLnRhaWw9dGhpcy50YWlsLTEmdGhpcy5tYXNrLGM8dGhpcy5tYXNrPj4+MSYmdGhpcy4kcmVzaXplKGMsdGhpcy52Lmxlbmd0aD4+PjEpfSwkcHVzaChhKXt0aGlzLnZbdGhpcy50YWlsXT1hLHRoaXMudGFpbD10aGlzLnRhaWwrMSZ0aGlzLm1hc2ssdGhpcy5oZWFkPT09dGhpcy50YWlsJiZ0aGlzLiRyZXNpemUodGhpcy52Lmxlbmd0aCx0aGlzLnYubGVuZ3RoPDwxKTtjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO3JldHVybiB2b2lkIDAhPT10aGlzLm1heGxlbiYmYj50aGlzLm1heGxlbiYmdGhpcy4kcG9wTGVmdCgpLHRoaXN9LCRwdXNoTGVmdChhKXt0aGlzLmhlYWQ9dGhpcy5oZWFkLTEmdGhpcy5tYXNrLHRoaXMudlt0aGlzLmhlYWRdPWEsdGhpcy5oZWFkPT09dGhpcy50YWlsJiZ0aGlzLiRyZXNpemUodGhpcy52Lmxlbmd0aCx0aGlzLnYubGVuZ3RoPDwxKTtjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO3JldHVybiB2b2lkIDAhPT10aGlzLm1heGxlbiYmYj50aGlzLm1heGxlbiYmdGhpcy4kcG9wKCksdGhpc30sJHBvcCgpe2lmKHRoaXMuaGVhZD09PXRoaXMudGFpbCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJwb3AgZnJvbSBhbiBlbXB0eSBkZXF1ZVxcXCIpO3RoaXMudGFpbD10aGlzLnRhaWwtMSZ0aGlzLm1hc2s7Y29uc3QgYT10aGlzLnZbdGhpcy50YWlsXTt0aGlzLnZbdGhpcy50YWlsXT12b2lkIDA7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gYjx0aGlzLm1hc2s+Pj4xJiZ0aGlzLiRyZXNpemUoYix0aGlzLnYubGVuZ3RoPj4+MSksYX0sJHBvcExlZnQoKXtpZih0aGlzLmhlYWQ9PT10aGlzLnRhaWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwicG9wIGZyb20gYW4gZW1wdHkgZGVxdWVcXFwiKTtjb25zdCBhPXRoaXMudlt0aGlzLmhlYWRdO3RoaXMudlt0aGlzLmhlYWRdPXZvaWQgMCx0aGlzLmhlYWQ9dGhpcy5oZWFkKzEmdGhpcy5tYXNrO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7cmV0dXJuIGI8dGhpcy5tYXNrPj4+MSYmdGhpcy4kcmVzaXplKGIsdGhpcy52Lmxlbmd0aD4+PjEpLGF9LCRyZXNpemUoYSxiKXtjb25zdCBjPXRoaXMuaGVhZCxkPXRoaXMubWFzaztpZih0aGlzLmhlYWQ9MCx0aGlzLnRhaWw9YSx0aGlzLm1hc2s9Yi0xLDA9PT1jKXJldHVybiB2b2lkKHRoaXMudi5sZW5ndGg9Yik7Y29uc3QgZT1BcnJheShiKTtmb3IobGV0IGY9MDtmPGE7ZisrKWVbZl09dGhpcy52W2MrZiZkXTt0aGlzLnY9ZX0sJGluZGV4KGEsYixjKXtjb25zdCBkPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2I9dm9pZCAwPT09Yj8wOlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGIpLGM9Yz09PXZvaWQgMD9kOlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGMpO2NvbnN0IGU9dGhpcy5oZWFkLGY9dGhpcy5tYXNrLGc9dGhpcy52LGg9MDw9Yj9iOmI8LWQ/MDpkK2I7Yz0wPD1jP2M6YzwtZD8wOmQrYztmb3IobGV0IGQ9aDtkPGM7ZCsrKWlmKGdbZStkJmZdPT09YSlyZXR1cm4gZH0sc2skYXNhcnJheSgpe2NvbnN0IGE9W10sYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztmb3IobGV0IGM9MDtjPGI7KytjKXtjb25zdCBiPXRoaXMuaGVhZCtjJnRoaXMubWFzazthLnB1c2godGhpcy52W2JdKX1yZXR1cm4gYX19fSk7Y29uc3QgYz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIl9jb2xsZWN0aW9ucy5fZGVxdWVfaXRlcmF0b3JcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBfZGVxdWVfaXRlcmF0b3IoYSl7dGhpcy4kaW5kZXg9MCx0aGlzLmRxPWEudix0aGlzLiRsZW5ndGg9YS50YWlsLWEuaGVhZCZhLm1hc2ssdGhpcy4kaGVhZD1hLmhlYWQsdGhpcy4kdGFpbD1hLnRhaWwsdGhpcy4kbWFzaz1hLm1hc2t9LGl0ZXJuZXh0KCl7aWYoISh0aGlzLiRpbmRleD49dGhpcy4kbGVuZ3RoKSl7Y29uc3QgYT0oMDw9dGhpcy4kaW5kZXg/dGhpcy4kaGVhZDp0aGlzLiR0YWlsKSt0aGlzLiRpbmRleCZ0aGlzLiRtYXNrO3JldHVybiB0aGlzLiRpbmRleCsrLHRoaXMuZHFbYV19fSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186eyRtZXRoOmZ1bmN0aW9uIF9fbGVuZ3RoX2hpbnRfXygpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJGxlbmd0aC10aGlzLiRpbmRleCl9LCRmbGFnczp7Tm9BcmdzOiEwfX19fSksZD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIl9jb2xsZWN0aW9ucy5fZGVxdWVfcmV2ZXJzZV9pdGVyYXRvclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIF9kZXF1ZV9yZXZlcnNlX2l0ZXJhdG9yKGEpe3RoaXMuJGluZGV4PShhLnRhaWwtYS5oZWFkJmEubWFzayktMSx0aGlzLmRxPWEudix0aGlzLiRoZWFkPWEuaGVhZCx0aGlzLiRtYXNrPWEubWFza30saXRlcm5leHQoKXtpZighKDA+dGhpcy4kaW5kZXgpKXtjb25zdCBhPXRoaXMuJGhlYWQrdGhpcy4kaW5kZXgmdGhpcy4kbWFzaztyZXR1cm4gdGhpcy4kaW5kZXgtLSx0aGlzLmRxW2FdfX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmfX0pLGU9bmV3IFJlZ0V4cCgvXlswLTldLiovKSxmPW5ldyBSZWdFeHAoL15bMC05X10uKi8pLGc9bmV3IFJlZ0V4cCgvXlxcXFx3KiQvKSxoPS8sL2csaj0vXFxcXHMrLztyZXR1cm4gbmFtZWR0dXBsZS5jb19hcmdjb3VudD0yLG5hbWVkdHVwbGUuY29fa3dvbmx5YXJnY291bnQ9MyxuYW1lZHR1cGxlLiRrd2RlZnM9W1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQsU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0sbmFtZWR0dXBsZS5jb192YXJuYW1lcz1bXFxcInR5cGVuYW1lXFxcIixcXFwiZmllbGRfbmFtZXNcXFwiLFxcXCJyZW5hbWVcXFwiLFxcXCJkZWZhdWx0c1xcXCIsXFxcIm1vZHVsZVxcXCJdLGEubmFtZWR0dXBsZT1uZXcgU2suYnVpbHRpbi5mdW5jKG5hbWVkdHVwbGUpLGF9XCIsXCJzcmMvbGliL2NvbG9yc3lzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb2xvcnN5cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvbW1hbmRzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21tYW5kcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvbXBpbGVhbGwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbXBpbGVhbGwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb21waWxlci9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29tcGlsZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb25maWcvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbmZpZyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvbnRleHRsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbnRleHRsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb29raWVsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvb2tpZWxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvcHkucHlcIjpcIlxcXCJcXFwiXFxcIlxcblRoaXMgZmlsZSB3YXMgbW9kaWZpZWQgZnJvbSBDUHl0aG9uLlxcbkNvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCxcXG4yMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBBbGwgUmlnaHRzIFJlc2VydmVkXFxuXFxcIlxcXCJcXFwiXFxuaW1wb3J0IHR5cGVzXFxuY2xhc3MgRXJyb3IoRXhjZXB0aW9uKTpcXG4gICAgcGFzc1xcbmVycm9yID0gRXJyb3IgXFxuY2xhc3MgX0VtcHR5Q2xhc3M6XFxuICAgIHBhc3NcXG50cnk6XFxuICAgIGxvbmdcXG5leGNlcHQgTmFtZUVycm9yOlxcbiAgICBsb25nID0gaW50XFxuXFxuZGVmIGNvcHkoeCk6XFxuICAgIGNscyA9IHR5cGUoeClcXG4gICAgaWYgY2FsbGFibGUoeCk6XFxuICAgICAgICByZXR1cm4geFxcbiAgICBjb3BpZXIgPSBnZXRhdHRyKGNscywgXFxcIl9fY29weV9fXFxcIiwgTm9uZSlcXG4gICAgaWYgY29waWVyOlxcbiAgICAgICAgcmV0dXJuIGNvcGllcih4KVxcbiAgICBpZiBjbHMgaW4gKHR5cGUoTm9uZSksIGludCwgZmxvYXQsIGJvb2wsIHN0ciwgdHVwbGUsIHR5cGUsIGZyb3plbnNldCwgbG9uZyk6XFxuICAgICAgICByZXR1cm4geFxcbiAgICBpZiAoY2xzID09IGxpc3QpIG9yIChjbHMgPT0gZGljdCkgb3IgKGNscyA9PSBzZXQpIG9yIChjbHMgPT0gc2xpY2UpOlxcbiAgICAgICAgcmV0dXJuIGNscyh4KVxcbiAgICB0cnk6XFxuICAgICAgICBnZXRzdGF0ZSA9IGdldGF0dHIoeCwgXFxcIl9fZ2V0c3RhdGVfX1xcXCIsIE5vbmUpXFxuICAgICAgICBzZXRzdGF0ZSA9IGdldGF0dHIoeCwgXFxcIl9fc2V0c3RhdGVfX1xcXCIsIE5vbmUpXFxuICAgICAgICBpbml0YXJncyA9IGdldGF0dHIoeCwgXFxcIl9fZ2V0aW5pdGFyZ3NfX1xcXCIsIE5vbmUpXFxuICAgIGV4Y2VwdDpcXG4gICAgICAgIHJlZHVjdG9yID0gRmFsc2VcXG4gICAgaWYgZ2V0c3RhdGUgb3Igc2V0c3RhdGUgb3IgaW5pdGFyZ3M6XFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJTa3VscHQgZG9lcyBub3QgeWV0IHN1cHBvcnQgY29weWluZyB3aXRoIHVzZXItZGVmaW5lZCBfX2dldHN0YXRlX18sIF9fc2V0c3RhdGVfXyBvciBfX2dldGluaXRhcmdzX18oKVxcXCIpXFxuICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfZXhfX1xcXCIsIE5vbmUpXFxuICAgIGlmIHJlZHVjdG9yOlxcbiAgICAgICAgcnYgPSByZWR1Y3Rvcig0KVxcbiAgICBlbHNlOlxcbiAgICAgICAgcmVkdWN0b3IgPSBnZXRhdHRyKHgsIFxcXCJfX3JlZHVjZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIGlmIHJlZHVjdG9yOlxcbiAgICAgICAgICAgIHJ2ID0gcmVkdWN0b3IoKVxcbiAgICAgICAgZWxpZiBzdHIoY2xzKVsxOjZdID09IFxcXCJjbGFzc1xcXCI6XFxuICAgICAgICAgICAgY29waWVyID0gX2NvcHlfaW5zdFxcbiAgICAgICAgICAgIHJldHVybiBjb3BpZXIoeClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmFpc2UgRXJyb3IoXFxcInVuKHNoYWxsb3cpY29weWFibGUgb2JqZWN0IG9mIHR5cGUgJXNcXFwiICUgY2xzKVxcbiAgICBpZiBpc2luc3RhbmNlKHJ2LCBzdHIpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgcmV0dXJuIF9yZWNvbnN0cnVjdCh4LCBydiwgMClcXG5cXG5kZWYgX2NvcHlfaW5zdCh4KTpcXG4gICAgaWYgaGFzYXR0cih4LCAnX19jb3B5X18nKTpcXG4gICAgICAgIHJldHVybiB4Ll9fY29weV9fKClcXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRpbml0YXJnc19fJyk6XFxuICAgICAgICBhcmdzID0geC5fX2dldGluaXRhcmdzX18oKVxcbiAgICAgICAgeSA9IHguX19jbGFzc19fKCphcmdzKVxcbiAgICBlbHNlOlxcbiAgICAgICAgeSA9IF9FbXB0eUNsYXNzKClcXG4gICAgICAgIHkuX19jbGFzc19fID0geC5fX2NsYXNzX19cXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRzdGF0ZV9fJyk6XFxuICAgICAgICBzdGF0ZSA9IHguX19nZXRzdGF0ZV9fKClcXG4gICAgZWxzZTpcXG4gICAgICAgIHN0YXRlID0geC5fX2RpY3RfX1xcbiAgICBpZiBoYXNhdHRyKHksICdfX3NldHN0YXRlX18nKTpcXG4gICAgICAgIHkuX19zZXRzdGF0ZV9fKHN0YXRlKVxcbiAgICBlbHNlOlxcbiAgICAgICAgeS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpXFxuICAgIHJldHVybiB5XFxuXFxuZCA9IF9kZWVwY29weV9kaXNwYXRjaCA9IHt9XFxuXFxuZGVmIGRlZXBjb3B5KHgsIG1lbW89Tm9uZSwgX25pbD1bXSk6XFxuICAgIFxcXCJcXFwiXFxcIkRlZXAgY29weSBvcGVyYXRpb24gb24gYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLlxcbiAgICBTZWUgdGhlIG1vZHVsZSdzIF9fZG9jX18gc3RyaW5nIGZvciBtb3JlIGluZm8uXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBpZiBtZW1vIGlzIE5vbmU6XFxuICAgICAgICBtZW1vID0ge31cXG4gICAgaWR4ID0gaWQoeClcXG4gICAgeSA9IG1lbW8uZ2V0KGlkeCwgX25pbClcXG4gICAgaWYgeSBpcyBub3QgX25pbDpcXG4gICAgICAgIHJldHVybiB5XFxuICAgIGNscyA9IHR5cGUoeClcXG4gICAgdHJ5OlxcbiAgICAgICAgZ2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX2dldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgc2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX3NldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgaW5pdGFyZ3MgPSBnZXRhdHRyKHgsIFxcXCJfX2dldGluaXRhcmdzX19cXFwiLCBOb25lKVxcbiAgICBleGNlcHQ6XFxuICAgICAgICByZWR1Y3RvciA9IEZhbHNlXFxuICAgIGlmIGdldHN0YXRlIG9yIHNldHN0YXRlIG9yIGluaXRhcmdzOlxcbiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU2t1bHB0IGRvZXMgbm90IHlldCBzdXBwb3J0IGNvcHlpbmcgd2l0aCB1c2VyLWRlZmluZWQgX19nZXRzdGF0ZV9fLCBfX3NldHN0YXRlX18gb3IgX19nZXRpbml0YXJnc19fKClcXFwiKVxcbiAgICBjb3BpZXIgPSBfZGVlcGNvcHlfZGlzcGF0Y2guZ2V0KGNscylcXG4gICAgaWYgY29waWVyOlxcbiAgICAgICAgeSA9IGNvcGllcih4LCBtZW1vKVxcbiAgICBlbGlmIHN0cihjbHMpWzE6Nl0gPT0gXFxcImNsYXNzXFxcIjpcXG4gICAgICAgIGNvcGllciA9IF9kZWVwY29weV9kaXNwYXRjaFtcXFwiSW5zdGFuY2VUeXBlXFxcIl1cXG4gICAgICAgIHkgPSBjb3BpZXIoeCwgbWVtbylcXG4gICAgZWxzZTpcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBpc3NjID0gaXNzdWJjbGFzcyhjbHMsIHR5cGUpXFxuICAgICAgICBleGNlcHQgVHlwZUVycm9yOiAjIGNscyBpcyBub3QgYSBjbGFzcyAob2xkIEJvb3N0OyBzZWUgU0YgIzUwMjA4NSlcXG4gICAgICAgICAgICBpc3NjID0gMFxcbiAgICAgICAgaWYgaXNzYzpcXG4gICAgICAgICAgICB5ID0gX2RlZXBjb3B5X2F0b21pYyh4LCBtZW1vKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBjb3BpZXIgPSBnZXRhdHRyKHgsIFxcXCJfX2RlZXBjb3B5X19cXFwiLCBOb25lKVxcbiAgICAgICAgICAgIGlmIGNvcGllcjpcXG4gICAgICAgICAgICAgICAgeSA9IGNvcGllcihtZW1vKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfZXhfX1xcXCIsIE5vbmUpXFxuICAgICAgICAgICAgICAgIGlmIHJlZHVjdG9yOlxcbiAgICAgICAgICAgICAgICAgICAgcnYgPSByZWR1Y3RvcigyKVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgcmVkdWN0b3IgPSBnZXRhdHRyKHgsIFxcXCJfX3JlZHVjZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgICAgICAgICAgICAgIGlmIHJlZHVjdG9yOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gcmVkdWN0b3IoKVxcbiAgICAgICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvcihcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInVuKGRlZXApY29weWFibGUgb2JqZWN0IG9mIHR5cGUgJXNcXFwiICUgY2xzKVxcbiAgICAgICAgICAgICAgICB5ID0gX3JlY29uc3RydWN0KHgsIHJ2LCAxLCBtZW1vKVxcbiAgICBtZW1vW2lkeF0gPSB5XFxuICAgIF9rZWVwX2FsaXZlKHgsIG1lbW8pICMgTWFrZSBzdXJlIHggbGl2ZXMgYXQgbGVhc3QgYXMgbG9uZyBhcyBkXFxuICAgIHJldHVybiB5XFxuXFxuZGVmIF9kZWVwY29weV9hdG9taWMoeCwgbWVtbyk6XFxuICAgIHJldHVybiB4XFxuZFt0eXBlKE5vbmUpXSA9IF9kZWVwY29weV9hdG9taWNcXG4jIGRbdHlwZShFbGxpcHNpcyldID0gX2RlZXBjb3B5X2F0b21pY1xcbmRbdHlwZShOb3RJbXBsZW1lbnRlZCldID0gX2RlZXBjb3B5X2F0b21pY1xcbmRbaW50XSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2Zsb2F0XSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2Jvb2xdID0gX2RlZXBjb3B5X2F0b21pY1xcbmRbY29tcGxleF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW2J5dGVzXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW3N0cl0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyB0cnk6XFxuIyBkW3R5cGVzLkNvZGVUeXBlXSA9IF9kZWVwY29weV9hdG9taWNcXG4jIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjpcXG4jICAgcGFzc1xcbmRbdHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW3R5cGVzLkJ1aWx0aW5GdW5jdGlvblR5cGVdID0gX2RlZXBjb3B5X2F0b21pY1xcbmRbdHlwZXMuRnVuY3Rpb25UeXBlXSA9IF9kZWVwY29weV9hdG9taWNcXG4jIGRbd2Vha3JlZi5yZWZdID0gX2RlZXBjb3B5X2F0b21pY1xcblxcbmRlZiBfZGVlcGNvcHlfbGlzdCh4LCBtZW1vKTpcXG4gICAgeSA9IFtdXFxuICAgIG1lbW9baWQoeCldID0geVxcbiAgICBmb3IgYSBpbiB4OlxcbiAgICAgICAgeS5hcHBlbmQoZGVlcGNvcHkoYSwgbWVtbykpXFxuICAgIHJldHVybiB5XFxuZFtsaXN0XSA9IF9kZWVwY29weV9saXN0XFxuXFxuZGVmIF9kZWVwY29weV9zZXQoeCwgbWVtbyk6XFxuICAgIHJlc3VsdCA9IHNldChbXSkgICMgbWFrZSBlbXB0eSBzZXRcXG4gICAgbWVtb1tpZCh4KV0gPSByZXN1bHQgICMgcmVnaXN0ZXIgdGhpcyBzZXQgaW4gdGhlIG1lbW8gZm9yIGxvb3AgY2hlY2tpbmdcXG4gICAgZm9yIGEgaW4geDogICAjIGdvIHRocm91Z2ggZWxlbWVudHMgb2Ygc2V0XFxuICAgICAgICByZXN1bHQuYWRkKGRlZXBjb3B5KGEsIG1lbW8pKSAgIyBhZGQgdGhlIGNvcGllZCBlbGVtZW50cyBpbnRvIHRoZSBuZXcgc2V0XFxuICAgIHJldHVybiByZXN1bHQgIyByZXR1cm4gdGhlIG5ldyBzZXRcXG5kW3NldF0gPSBfZGVlcGNvcHlfc2V0XFxuXFxuZGVmIF9kZWVwY29weV9mcm96ZW5zZXQoeCwgbWVtbyk6XFxuICAgIHJlc3VsdCA9IGZyb3plbnNldChfZGVlcGNvcHlfc2V0KHgsbWVtbykpIFxcbiAgICBtZW1vW2lkKHgpXSA9IHJlc3VsdCBcXG4gICAgcmV0dXJuIHJlc3VsdFxcbmRbZnJvemVuc2V0XSA9IF9kZWVwY29weV9mcm96ZW5zZXRcXG5cXG5kZWYgX2RlZXBjb3B5X3R1cGxlKHgsIG1lbW8pOlxcbiAgICB5ID0gW2RlZXBjb3B5KGEsIG1lbW8pIGZvciBhIGluIHhdXFxuICAgICMgV2UncmUgbm90IGdvaW5nIHRvIHB1dCB0aGUgdHVwbGUgaW4gdGhlIG1lbW8sIGJ1dCBpdCdzIHN0aWxsIGltcG9ydGFudCB3ZVxcbiAgICAjIGNoZWNrIGZvciBpdCwgaW4gY2FzZSB0aGUgdHVwbGUgY29udGFpbnMgcmVjdXJzaXZlIG11dGFibGUgc3RydWN0dXJlcy5cXG4gICAgdHJ5OlxcbiAgICAgICAgcmV0dXJuIG1lbW9baWQoeCldXFxuICAgIGV4Y2VwdCBLZXlFcnJvcjpcXG4gICAgICAgIHBhc3NcXG4gICAgZm9yIGssIGogaW4gemlwKHgsIHkpOlxcbiAgICAgICAgaWYgayBpcyBub3QgajpcXG4gICAgICAgICAgICB5ID0gdHVwbGUoeSlcXG4gICAgICAgICAgICBicmVha1xcbiAgICBlbHNlOlxcbiAgICAgICAgeSA9IHhcXG4gICAgcmV0dXJuIHlcXG5kW3R1cGxlXSA9IF9kZWVwY29weV90dXBsZVxcblxcbmRlZiBfZGVlcGNvcHlfZGljdCh4LCBtZW1vKTpcXG4gICAgeSA9IHt9XFxuICAgIG1lbW9baWQoeCldID0geVxcbiAgICBmb3Iga2V5LCB2YWx1ZSBpbiB4Lml0ZW1zKCk6XFxuICAgICAgICB5W2RlZXBjb3B5KGtleSwgbWVtbyldID0gZGVlcGNvcHkodmFsdWUsIG1lbW8pXFxuICAgIHJldHVybiB5XFxuZFtkaWN0XSA9IF9kZWVwY29weV9kaWN0XFxuXFxuIyBkZWYgX2RlZXBjb3B5X21ldGhvZCh4LCBtZW1vKTogIyBDb3B5IGluc3RhbmNlIG1ldGhvZHNcXG4jICAgICB5ID0gdHlwZSh4KSh4LmltX2Z1bmMsIGRlZXBjb3B5KHguaW1fc2VsZiwgbWVtbyksIHguaW1fY2xhc3MpO1xcbiMgICAgIHJldHVybiB5XFxuZFt0eXBlcy5NZXRob2RUeXBlXSA9IF9kZWVwY29weV9hdG9taWNcXG5cXG5kZWYgX2RlZXBjb3B5X2luc3QoeCwgbWVtbyk6XFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZGVlcGNvcHlfXycpOlxcbiAgICAgICAgIHJldHVybiB4Ll9fZGVlcGNvcHlfXyhtZW1vKVxcbiAgICBpZiBoYXNhdHRyKHgsICdfX2dldGluaXRhcmdzX18nKTpcXG4gICAgICAgIGFyZ3MgPSB4Ll9fZ2V0aW5pdGFyZ3NfXygpXFxuICAgICAgICBhcmdzID0gZGVlcGNvcHkoYXJncywgbWVtbylcXG4gICAgICAgIHkgPSB4Ll9fY2xhc3NfXygqYXJncylcXG4gICAgZWxzZTpcXG4gICAgICAgIHkgPSBfRW1wdHlDbGFzcygpXFxuICAgICAgICB5Ll9fY2xhc3NfXyA9IHguX19jbGFzc19fXFxuICAgIG1lbW9baWQoeCldID0geVxcbiAgICBpZiBoYXNhdHRyKHgsICdfX2dldHN0YXRlX18nKTpcXG4gICAgICAgIHN0YXRlID0geC5fX2dldHN0YXRlX18oKVxcbiAgICBlbHNlOlxcbiAgICAgICAgc3RhdGUgPSB4Ll9fZGljdF9fXFxuICAgIHN0YXRlID0gZGVlcGNvcHkoc3RhdGUsIG1lbW8pXFxuICAgIGlmIGhhc2F0dHIoeSwgJ19fc2V0c3RhdGVfXycpOlxcbiAgICAgICAgeS5fX3NldHN0YXRlX18oc3RhdGUpXFxuICAgIGVsc2U6XFxuICAgICAgICB5Ll9fZGljdF9fLnVwZGF0ZShzdGF0ZSlcXG4gICAgICAgIHJldHVybiB5XFxuZFtcXFwiSW5zdGFuY2VUeXBlXFxcIl0gPSBfZGVlcGNvcHlfaW5zdFxcblxcbmRlZiBfa2VlcF9hbGl2ZSh4LCBtZW1vKTpcXG4gICAgXFxcIlxcXCJcXFwiS2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB4IGluIHRoZSBtZW1vLlxcbiAgICBCZWNhdXNlIHdlIHJlbWVtYmVyIG9iamVjdHMgYnkgdGhlaXIgaWQsIHdlIGhhdmVcXG4gICAgdG8gYXNzdXJlIHRoYXQgcG9zc2libHkgdGVtcG9yYXJ5IG9iamVjdHMgYXJlIGtlcHRcXG4gICAgYWxpdmUgYnkgcmVmZXJlbmNpbmcgdGhlbS5cXG4gICAgV2Ugc3RvcmUgYSByZWZlcmVuY2UgYXQgdGhlIGlkIG9mIHRoZSBtZW1vLCB3aGljaCBzaG91bGRcXG4gICAgbm9ybWFsbHkgbm90IGJlIHVzZWQgdW5sZXNzIHNvbWVvbmUgdHJpZXMgdG8gZGVlcGNvcHlcXG4gICAgdGhlIG1lbW8gaXRzZWxmLi4uXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICB0cnk6XFxuICAgICAgICBtZW1vW2lkKG1lbW8pXS5hcHBlbmQoeClcXG4gICAgZXhjZXB0IEtleUVycm9yOlxcbiAgICAgICAgIyBhaGEsIHRoaXMgaXMgdGhlIGZpcnN0IG9uZSA6LSlcXG4gICAgICAgIG1lbW9baWQobWVtbyldPVt4XVxcblxcbmRlZiBfcmVjb25zdHJ1Y3QoeCwgaW5mbywgZGVlcCwgbWVtbz1Ob25lKTpcXG4gICAgaWYgaXNpbnN0YW5jZShpbmZvLCBzdHIpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgYXNzZXJ0IGlzaW5zdGFuY2UoaW5mbywgdHVwbGUpXFxuICAgIGlmIG1lbW8gaXMgTm9uZTpcXG4gICAgICAgIG1lbW8gPSB7fVxcbiAgICBuID0gbGVuKGluZm8pXFxuICAgIGFzc2VydCBuIGluICgyLCAzLCA0LCA1KVxcbiAgICBjYWxsYWJsZSwgYXJncyA9IGluZm9bOjJdXFxuICAgIGlmIG4gPiAyOlxcbiAgICAgICAgc3RhdGUgPSBpbmZvWzJdXFxuICAgIGVsc2U6XFxuICAgICAgICBzdGF0ZSA9IE5vbmVcXG4gICAgaWYgbiA+IDM6XFxuICAgICAgICBsaXN0aXRlciA9IGluZm9bM11cXG4gICAgZWxzZTpcXG4gICAgICAgIGxpc3RpdGVyID0gTm9uZVxcbiAgICBpZiBuID4gNDpcXG4gICAgICAgIGRpY3RpdGVyID0gaW5mb1s0XVxcbiAgICBlbHNlOlxcbiAgICAgICAgZGljdGl0ZXIgPSBOb25lXFxuICAgIGlmIGRlZXA6XFxuICAgICAgICBhcmdzID0gZGVlcGNvcHkoYXJncywgbWVtbylcXG4gICAgeSA9IGNhbGxhYmxlKCphcmdzKVxcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG5cXG4gICAgaWYgc3RhdGUgaXMgbm90IE5vbmU6XFxuICAgICAgICBpZiBkZWVwOlxcbiAgICAgICAgICAgIHN0YXRlID0gZGVlcGNvcHkoc3RhdGUsIG1lbW8pXFxuICAgICAgICBpZiBoYXNhdHRyKHksICdfX3NldHN0YXRlX18nKTpcXG4gICAgICAgICAgICB5Ll9fc2V0c3RhdGVfXyhzdGF0ZSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzdGF0ZSwgdHVwbGUpIGFuZCBsZW4oc3RhdGUpID09IDI6XFxuICAgICAgICAgICAgICAgIHN0YXRlLCBzbG90c3RhdGUgPSBzdGF0ZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNsb3RzdGF0ZSA9IE5vbmVcXG4gICAgICAgICAgICBpZiBzdGF0ZSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgeS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpXFxuICAgICAgICAgICAgaWYgc2xvdHN0YXRlIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzbG90c3RhdGUuaXRlbXMoKTpcXG4gICAgICAgICAgICAgICAgICAgIHNldGF0dHIoeSwga2V5LCB2YWx1ZSlcXG5cXG4gICAgaWYgbGlzdGl0ZXIgaXMgbm90IE5vbmU6XFxuICAgICAgICBmb3IgaXRlbSBpbiBsaXN0aXRlcjpcXG4gICAgICAgICAgICBpZiBkZWVwOlxcbiAgICAgICAgICAgICAgICBpdGVtID0gZGVlcGNvcHkoaXRlbSwgbWVtbylcXG4gICAgICAgICAgICB5LmFwcGVuZChpdGVtKVxcbiAgICBpZiBkaWN0aXRlciBpcyBub3QgTm9uZTpcXG4gICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRpY3RpdGVyOlxcbiAgICAgICAgICAgIGlmIGRlZXA6XFxuICAgICAgICAgICAgICAgIGtleSA9IGRlZXBjb3B5KGtleSwgbWVtbylcXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBkZWVwY29weSh2YWx1ZSwgbWVtbylcXG4gICAgICAgICAgICB5W2tleV0gPSB2YWx1ZVxcbiAgICByZXR1cm4geVxcblxcbmRlbCBkXFxuXFxuZGVsIHR5cGVzXFxuXFxuIyBIZWxwZXIgZm9yIGluc3RhbmNlIGNyZWF0aW9uIHdpdGhvdXQgY2FsbGluZyBfX2luaXRfX1xcbmNsYXNzIF9FbXB0eUNsYXNzOlxcbiAgICBwYXNzXCIsXCJzcmMvbGliL2NvcHlfcmVnLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb3B5X3JlZyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Nzdi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY3N2IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY3R5cGVzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjdHlwZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jdHlwZXMvbWFjaG9saWIvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hY2hvbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY3Vyc2VzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjdXJzZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kYXRldGltZS5weVwiOlwiXFxcIlxcXCJcXFwiQ29uY3JldGUgZGF0ZS90aW1lIGFuZCByZWxhdGVkIHR5cGVzIC0tIHByb3RvdHlwZSBpbXBsZW1lbnRlZCBpbiBQeXRob24uXFxuXFxuU2VlIGh0dHA6Ly93d3cuem9wZS5vcmcvTWVtYmVycy9mZHJha2UvRGF0ZVRpbWVXaWtpL0Zyb250UGFnZVxcblxcblNlZSBhbHNvIGh0dHA6Ly9kaXIueWFob28uY29tL1JlZmVyZW5jZS9jYWxlbmRhcnMvXFxuXFxuRm9yIGEgcHJpbWVyIG9uIERTVCwgaW5jbHVkaW5nIG1hbnkgY3VycmVudCBEU1QgcnVsZXMsIHNlZVxcbmh0dHA6Ly93ZWJleGhpYml0cy5vcmcvZGF5bGlnaHRzYXZpbmcvXFxuXFxuRm9yIG1vcmUgYWJvdXQgRFNUIHRoYW4geW91IGV2ZXIgd2FudGVkIHRvIGtub3csIHNlZVxcbmZ0cDovL2Vsc2llLm5jaS5uaWguZ292L3B1Yi9cXG5cXG5Tb3VyY2VzIGZvciB0aW1lIHpvbmUgYW5kIERTVCBkYXRhOiBodHRwOi8vd3d3LnR3aW5zdW4uY29tL3R6L3R6LWxpbmsuaHRtXFxuXFxuVGhpcyB3YXMgb3JpZ2luYWxseSBjb3BpZWQgZnJvbSB0aGUgc2FuZGJveCBvZiB0aGUgQ1B5dGhvbiBDVlMgcmVwb3NpdG9yeS5cXG5UaGFua3MgdG8gVGltIFBldGVycyBmb3Igc3VnZ2VzdGluZyB1c2luZyBpdC5cXG5cXG5UaGlzIHdhcyB0aGVuIGNvcGllZCBmcm9tIFB5UHkgdjUuMS4wIGludG8gU2t1bHB0IGJ5IE1lcmVkeWRkIEx1ZmYsIHJlbW92aW5nXFxuJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24nIChhbmQgcmVwbGFjaW5nIGRpdmlzaW9uIG9wZXJhdG9ycyBhY2NvcmRpbmdseSlcXG5hbmQgcGlja2xlIHN1cHBvcnQgKHdoaWNoIHJlcXVpcmVzICdzdHJ1Y3QnLCB3aGljaCBTa3VscHQgZG9lcyBub3QgY3VycmVudGx5XFxuW2FzIG9mIDMxLzgvMjAxNl0gaGF2ZSlcXG5cXFwiXFxcIlxcXCJcXG5cXG5pbXBvcnQgdGltZSBhcyBfdGltZVxcbmltcG9ydCBtYXRoIGFzIF9tYXRoXFxuXFxuIyBQeXRob24gMi12cy0zIGNvbXBhdCBoYWNrXFxuaW1wb3J0IHN5c1xcbnVuaWNvZGUgPSB1bmljb2RlIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywpIGVsc2Ugc3RyXFxuXFxuX1NFTlRJTkVMID0gb2JqZWN0KClcXG5cXG5kZWYgX2NtcCh4LCB5KTpcXG4gICAgcmV0dXJuIDAgaWYgeCA9PSB5IGVsc2UgMSBpZiB4ID4geSBlbHNlIC0xXFxuXFxuZGVmIF9yb3VuZCh4KTpcXG4gICAgcmV0dXJuIGludChfbWF0aC5mbG9vcih4ICsgMC41KSBpZiB4ID49IDAuMCBlbHNlIF9tYXRoLmNlaWwoeCAtIDAuNSkpXFxuXFxuTUlOWUVBUiA9IDFcXG5NQVhZRUFSID0gOTk5OVxcbl9NSU5ZRUFSRk1UID0gMTkwMFxcblxcbl9NQVhfREVMVEFfREFZUyA9IDk5OTk5OTk5OVxcblxcbiMgVXRpbGl0eSBmdW5jdGlvbnMsIGFkYXB0ZWQgZnJvbSBQeXRob24ncyBEZW1vL2NsYXNzZXMvRGF0ZXMucHksIHdoaWNoXFxuIyBhbHNvIGFzc3VtZXMgdGhlIGN1cnJlbnQgR3JlZ29yaWFuIGNhbGVuZGFyIGluZGVmaW5pdGVseSBleHRlbmRlZCBpblxcbiMgYm90aCBkaXJlY3Rpb25zLiAgRGlmZmVyZW5jZTogIERhdGVzLnB5IGNhbGxzIEphbnVhcnkgMSBvZiB5ZWFyIDAgZGF5XFxuIyBudW1iZXIgMS4gIFRoZSBjb2RlIGhlcmUgY2FsbHMgSmFudWFyeSAxIG9mIHllYXIgMSBkYXkgbnVtYmVyIDEuICBUaGlzIGlzXFxuIyB0byBtYXRjaCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgXFxcInByb2xlcHRpYyBHcmVnb3JpYW5cXFwiIGNhbGVuZGFyIGluIERlcnNob3dpdHpcXG4jIGFuZCBSZWluZ29sZCdzIFxcXCJDYWxlbmRyaWNhbCBDYWxjdWxhdGlvbnNcXFwiLCB3aGVyZSBpdCdzIHRoZSBiYXNlIGNhbGVuZGFyXFxuIyBmb3IgYWxsIGNvbXB1dGF0aW9ucy4gIFNlZSB0aGUgYm9vayBmb3IgYWxnb3JpdGhtcyBmb3IgY29udmVydGluZyBiZXR3ZWVuXFxuIyBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWxzIGFuZCBtYW55IG90aGVyIGNhbGVuZGFyIHN5c3RlbXMuXFxuXFxuX0RBWVNfSU5fTU9OVEggPSBbLTEsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdXFxuXFxuX0RBWVNfQkVGT1JFX01PTlRIID0gWy0xXVxcbmRibSA9IDBcXG5mb3IgZGltIGluIF9EQVlTX0lOX01PTlRIWzE6XTpcXG4gICAgX0RBWVNfQkVGT1JFX01PTlRILmFwcGVuZChkYm0pXFxuICAgIGRibSArPSBkaW1cXG5kZWwgZGJtLCBkaW1cXG5cXG5kZWYgX2lzX2xlYXAoeWVhcik6XFxuICAgIFxcXCJ5ZWFyIC0+IDEgaWYgbGVhcCB5ZWFyLCBlbHNlIDAuXFxcIlxcbiAgICByZXR1cm4geWVhciAlIDQgPT0gMCBhbmQgKHllYXIgJSAxMDAgIT0gMCBvciB5ZWFyICUgNDAwID09IDApXFxuXFxuZGVmIF9kYXlzX2JlZm9yZV95ZWFyKHllYXIpOlxcbiAgICBcXFwieWVhciAtPiBudW1iZXIgb2YgZGF5cyBiZWZvcmUgSmFudWFyeSAxc3Qgb2YgeWVhci5cXFwiXFxuICAgIHkgPSB5ZWFyIC0gMVxcbiAgICByZXR1cm4geSozNjUgKyB5Ly80IC0geS8vMTAwICsgeS8vNDAwXFxuXFxuZGVmIF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKTpcXG4gICAgXFxcInllYXIsIG1vbnRoIC0+IG51bWJlciBvZiBkYXlzIGluIHRoYXQgbW9udGggaW4gdGhhdCB5ZWFyLlxcXCJcXG4gICAgYXNzZXJ0IDEgPD0gbW9udGggPD0gMTIsIG1vbnRoXFxuICAgIGlmIG1vbnRoID09IDIgYW5kIF9pc19sZWFwKHllYXIpOlxcbiAgICAgICAgcmV0dXJuIDI5XFxuICAgIHJldHVybiBfREFZU19JTl9NT05USFttb250aF1cXG5cXG5kZWYgX2RheXNfYmVmb3JlX21vbnRoKHllYXIsIG1vbnRoKTpcXG4gICAgXFxcInllYXIsIG1vbnRoIC0+IG51bWJlciBvZiBkYXlzIGluIHllYXIgcHJlY2VkaW5nIGZpcnN0IGRheSBvZiBtb250aC5cXFwiXFxuICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyLCAnbW9udGggbXVzdCBiZSBpbiAxLi4xMidcXG4gICAgcmV0dXJuIF9EQVlTX0JFRk9SRV9NT05USFttb250aF0gKyAobW9udGggPiAyIGFuZCBfaXNfbGVhcCh5ZWFyKSlcXG5cXG5kZWYgX3ltZDJvcmQoeWVhciwgbW9udGgsIGRheSk6XFxuICAgIFxcXCJ5ZWFyLCBtb250aCwgZGF5IC0+IG9yZGluYWwsIGNvbnNpZGVyaW5nIDAxLUphbi0wMDAxIGFzIGRheSAxLlxcXCJcXG4gICAgYXNzZXJ0IDEgPD0gbW9udGggPD0gMTIsICdtb250aCBtdXN0IGJlIGluIDEuLjEyJ1xcbiAgICBkaW0gPSBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aClcXG4gICAgYXNzZXJ0IDEgPD0gZGF5IDw9IGRpbSwgKCdkYXkgbXVzdCBiZSBpbiAxLi4lZCcgJSBkaW0pXFxuICAgIHJldHVybiAoX2RheXNfYmVmb3JlX3llYXIoeWVhcikgK1xcbiAgICAgICAgICAgIF9kYXlzX2JlZm9yZV9tb250aCh5ZWFyLCBtb250aCkgK1xcbiAgICAgICAgICAgIGRheSlcXG5cXG5fREk0MDBZID0gX2RheXNfYmVmb3JlX3llYXIoNDAxKSAgICAjIG51bWJlciBvZiBkYXlzIGluIDQwMCB5ZWFyc1xcbl9ESTEwMFkgPSBfZGF5c19iZWZvcmVfeWVhcigxMDEpICAgICMgICAgXFxcIiAgICBcXFwiICAgXFxcIiAgIFxcXCIgMTAwICAgXFxcIlxcbl9ESTRZICAgPSBfZGF5c19iZWZvcmVfeWVhcig1KSAgICAgICMgICAgXFxcIiAgICBcXFwiICAgXFxcIiAgIFxcXCIgICA0ICAgXFxcIlxcblxcbiMgQSA0LXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkIGdldCBmcm9tIHBhc3RpbmdcXG4jIHRvZ2V0aGVyIDQgc2luZ2xlIHllYXJzLlxcbmFzc2VydCBfREk0WSA9PSA0ICogMzY1ICsgMVxcblxcbiMgU2ltaWxhcmx5LCBhIDQwMC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZCBnZXQgZnJvbVxcbiMgcGFzdGluZyB0b2dldGhlciA0IDEwMC15ZWFyIGN5Y2xlcy5cXG5hc3NlcnQgX0RJNDAwWSA9PSA0ICogX0RJMTAwWSArIDFcXG5cXG4jIE9UT0gsIGEgMTAwLXllYXIgY3ljbGUgaGFzIG9uZSBmZXdlciBsZWFwIGRheSB0aGFuIHdlJ2QgZ2V0IGZyb21cXG4jIHBhc3RpbmcgdG9nZXRoZXIgMjUgNC15ZWFyIGN5Y2xlcy5cXG5hc3NlcnQgX0RJMTAwWSA9PSAyNSAqIF9ESTRZIC0gMVxcblxcbl9VU19QRVJfVVMgPSAxXFxuX1VTX1BFUl9NUyA9IDEwMDBcXG5fVVNfUEVSX1NFQ09ORCA9IDEwMDAwMDBcXG5fVVNfUEVSX01JTlVURSA9IDYwMDAwMDAwXFxuX1NFQ09ORFNfUEVSX0RBWSA9IDI0ICogMzYwMFxcbl9VU19QRVJfSE9VUiA9IDM2MDAwMDAwMDBcXG5fVVNfUEVSX0RBWSA9IDg2NDAwMDAwMDAwXFxuX1VTX1BFUl9XRUVLID0gNjA0ODAwMDAwMDAwXFxuXFxuZGVmIF9vcmQyeW1kKG4pOlxcbiAgICBcXFwib3JkaW5hbCAtPiAoeWVhciwgbW9udGgsIGRheSksIGNvbnNpZGVyaW5nIDAxLUphbi0wMDAxIGFzIGRheSAxLlxcXCJcXG5cXG4gICAgIyBuIGlzIGEgMS1iYXNlZCBpbmRleCwgc3RhcnRpbmcgYXQgMS1KYW4tMS4gIFRoZSBwYXR0ZXJuIG9mIGxlYXAgeWVhcnNcXG4gICAgIyByZXBlYXRzIGV4YWN0bHkgZXZlcnkgNDAwIHllYXJzLiAgVGhlIGJhc2ljIHN0cmF0ZWd5IGlzIHRvIGZpbmQgdGhlXFxuICAgICMgY2xvc2VzdCA0MDAteWVhciBib3VuZGFyeSBhdCBvciBiZWZvcmUgbiwgdGhlbiB3b3JrIHdpdGggdGhlIG9mZnNldFxcbiAgICAjIGZyb20gdGhhdCBib3VuZGFyeSB0byBuLiAgTGlmZSBpcyBtdWNoIGNsZWFyZXIgaWYgd2Ugc3VidHJhY3QgMSBmcm9tXFxuICAgICMgbiBmaXJzdCAtLSB0aGVuIHRoZSB2YWx1ZXMgb2YgbiBhdCA0MDAteWVhciBib3VuZGFyaWVzIGFyZSBleGFjdGx5XFxuICAgICMgdGhvc2UgZGl2aXNpYmxlIGJ5IF9ESTQwMFk6XFxuICAgICNcXG4gICAgIyAgICAgRCAgTSAgIFkgICAgICAgICAgICBuICAgICAgICAgICAgICBuLTFcXG4gICAgIyAgICAgLS0gLS0tIC0tLS0gICAgICAgIC0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS1cXG4gICAgIyAgICAgMzEgRGVjIC00MDAgICAgICAgIC1fREk0MDBZICAgICAgIC1fREk0MDBZIC0xXFxuICAgICMgICAgICAxIEphbiAtMzk5ICAgICAgICAgLV9ESTQwMFkgKzEgICAtX0RJNDAwWSAgICAgIDQwMC15ZWFyIGJvdW5kYXJ5XFxuICAgICMgICAgIC4uLlxcbiAgICAjICAgICAzMCBEZWMgIDAwMCAgICAgICAgLTEgICAgICAgICAgICAgLTJcXG4gICAgIyAgICAgMzEgRGVjICAwMDAgICAgICAgICAwICAgICAgICAgICAgIC0xXFxuICAgICMgICAgICAxIEphbiAgMDAxICAgICAgICAgMSAgICAgICAgICAgICAgMCAgICAgICAgICAgIDQwMC15ZWFyIGJvdW5kYXJ5XFxuICAgICMgICAgICAyIEphbiAgMDAxICAgICAgICAgMiAgICAgICAgICAgICAgMVxcbiAgICAjICAgICAgMyBKYW4gIDAwMSAgICAgICAgIDMgICAgICAgICAgICAgIDJcXG4gICAgIyAgICAgLi4uXFxuICAgICMgICAgIDMxIERlYyAgNDAwICAgICAgICAgX0RJNDAwWSAgICAgICAgX0RJNDAwWSAtMVxcbiAgICAjICAgICAgMSBKYW4gIDQwMSAgICAgICAgIF9ESTQwMFkgKzEgICAgIF9ESTQwMFkgICAgICA0MDAteWVhciBib3VuZGFyeVxcbiAgICBuIC09IDFcXG4gICAgbjQwMCwgbiA9IGRpdm1vZChuLCBfREk0MDBZKVxcbiAgICB5ZWFyID0gbjQwMCAqIDQwMCArIDEgICAjIC4uLiwgLTM5OSwgMSwgNDAxLCAuLi5cXG5cXG4gICAgIyBOb3cgbiBpcyB0aGUgKG5vbi1uZWdhdGl2ZSkgb2Zmc2V0LCBpbiBkYXlzLCBmcm9tIEphbnVhcnkgMSBvZiB5ZWFyLCB0b1xcbiAgICAjIHRoZSBkZXNpcmVkIGRhdGUuICBOb3cgY29tcHV0ZSBob3cgbWFueSAxMDAteWVhciBjeWNsZXMgcHJlY2VkZSBuLlxcbiAgICAjIE5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvciBuMTAwIHRvIGVxdWFsIDQhICBJbiB0aGF0IGNhc2UgNCBmdWxsXFxuICAgICMgMTAwLXllYXIgY3ljbGVzIHByZWNlZGUgdGhlIGRlc2lyZWQgZGF5LCB3aGljaCBpbXBsaWVzIHRoZSBkZXNpcmVkXFxuICAgICMgZGF5IGlzIERlY2VtYmVyIDMxIGF0IHRoZSBlbmQgb2YgYSA0MDAteWVhciBjeWNsZS5cXG4gICAgbjEwMCwgbiA9IGRpdm1vZChuLCBfREkxMDBZKVxcblxcbiAgICAjIE5vdyBjb21wdXRlIGhvdyBtYW55IDQteWVhciBjeWNsZXMgcHJlY2VkZSBpdC5cXG4gICAgbjQsIG4gPSBkaXZtb2QobiwgX0RJNFkpXFxuXFxuICAgICMgQW5kIG5vdyBob3cgbWFueSBzaW5nbGUgeWVhcnMuICBBZ2FpbiBuMSBjYW4gYmUgNCwgYW5kIGFnYWluIG1lYW5pbmdcXG4gICAgIyB0aGF0IHRoZSBkZXNpcmVkIGRheSBpcyBEZWNlbWJlciAzMSBhdCB0aGUgZW5kIG9mIHRoZSA0LXllYXIgY3ljbGUuXFxuICAgIG4xLCBuID0gZGl2bW9kKG4sIDM2NSlcXG5cXG4gICAgeWVhciArPSBuMTAwICogMTAwICsgbjQgKiA0ICsgbjFcXG4gICAgaWYgbjEgPT0gNCBvciBuMTAwID09IDQ6XFxuICAgICAgICBhc3NlcnQgbiA9PSAwXFxuICAgICAgICByZXR1cm4geWVhci0xLCAxMiwgMzFcXG5cXG4gICAgIyBOb3cgdGhlIHllYXIgaXMgY29ycmVjdCwgYW5kIG4gaXMgdGhlIG9mZnNldCBmcm9tIEphbnVhcnkgMS4gIFdlIGZpbmRcXG4gICAgIyB0aGUgbW9udGggdmlhIGFuIGVzdGltYXRlIHRoYXQncyBlaXRoZXIgZXhhY3Qgb3Igb25lIHRvbyBsYXJnZS5cXG4gICAgbGVhcHllYXIgPSBuMSA9PSAzIGFuZCAobjQgIT0gMjQgb3IgbjEwMCA9PSAzKVxcbiAgICBhc3NlcnQgbGVhcHllYXIgPT0gX2lzX2xlYXAoeWVhcilcXG4gICAgbW9udGggPSAobiArIDUwKSA+PiA1XFxuICAgIHByZWNlZGluZyA9IF9EQVlTX0JFRk9SRV9NT05USFttb250aF0gKyAobW9udGggPiAyIGFuZCBsZWFweWVhcilcXG4gICAgaWYgcHJlY2VkaW5nID4gbjogICMgZXN0aW1hdGUgaXMgdG9vIGxhcmdlXFxuICAgICAgICBtb250aCAtPSAxXFxuICAgICAgICBwcmVjZWRpbmcgLT0gX0RBWVNfSU5fTU9OVEhbbW9udGhdICsgKG1vbnRoID09IDIgYW5kIGxlYXB5ZWFyKVxcbiAgICBuIC09IHByZWNlZGluZ1xcbiAgICBhc3NlcnQgMCA8PSBuIDwgX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuXFxuICAgICMgTm93IHRoZSB5ZWFyIGFuZCBtb250aCBhcmUgY29ycmVjdCwgYW5kIG4gaXMgdGhlIG9mZnNldCBmcm9tIHRoZVxcbiAgICAjIHN0YXJ0IG9mIHRoYXQgbW9udGg6ICB3ZSdyZSBkb25lIVxcbiAgICByZXR1cm4geWVhciwgbW9udGgsIG4rMVxcblxcbiMgTW9udGggYW5kIGRheSBuYW1lcy4gIEZvciBsb2NhbGl6ZWQgdmVyc2lvbnMsIHNlZSB0aGUgY2FsZW5kYXIgbW9kdWxlLlxcbl9NT05USE5BTUVTID0gW05vbmUsIFxcXCJKYW5cXFwiLCBcXFwiRmViXFxcIiwgXFxcIk1hclxcXCIsIFxcXCJBcHJcXFwiLCBcXFwiTWF5XFxcIiwgXFxcIkp1blxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgXFxcIkp1bFxcXCIsIFxcXCJBdWdcXFwiLCBcXFwiU2VwXFxcIiwgXFxcIk9jdFxcXCIsIFxcXCJOb3ZcXFwiLCBcXFwiRGVjXFxcIl1cXG5fREFZTkFNRVMgPSBbTm9uZSwgXFxcIk1vblxcXCIsIFxcXCJUdWVcXFwiLCBcXFwiV2VkXFxcIiwgXFxcIlRodVxcXCIsIFxcXCJGcmlcXFwiLCBcXFwiU2F0XFxcIiwgXFxcIlN1blxcXCJdXFxuXFxuXFxuZGVmIF9idWlsZF9zdHJ1Y3RfdGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCBkc3RmbGFnKTpcXG4gICAgd2RheSA9IChfeW1kMm9yZCh5LCBtLCBkKSArIDYpICUgN1xcbiAgICBkbnVtID0gX2RheXNfYmVmb3JlX21vbnRoKHksIG0pICsgZFxcbiAgICByZXR1cm4gX3RpbWUuc3RydWN0X3RpbWUoKHksIG0sIGQsIGhoLCBtbSwgc3MsIHdkYXksIGRudW0sIGRzdGZsYWcpKVxcblxcbmRlZiBfZm9ybWF0X3RpbWUoaGgsIG1tLCBzcywgdXMpOlxcbiAgICAjIFNraXAgdHJhaWxpbmcgbWljcm9zZWNvbmRzIHdoZW4gdXM9PTAuXFxuICAgIHJlc3VsdCA9IFxcXCIlMDJkOiUwMmQ6JTAyZFxcXCIgJSAoaGgsIG1tLCBzcylcXG4gICAgaWYgdXM6XFxuICAgICAgICByZXN1bHQgKz0gXFxcIi4lMDZkXFxcIiAlIHVzXFxuICAgIHJldHVybiByZXN1bHRcXG5cXG4jIENvcnJlY3RseSBzdWJzdGl0dXRlIGZvciAleiBhbmQgJVogZXNjYXBlcyBpbiBzdHJmdGltZSBmb3JtYXRzLlxcbmRlZiBfd3JhcF9zdHJmdGltZShvYmplY3QsIGZvcm1hdCwgdGltZXR1cGxlKTpcXG4gICAgeWVhciA9IHRpbWV0dXBsZVswXVxcbiAgICBpZiB5ZWFyIDwgX01JTllFQVJGTVQ6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJ5ZWFyPSVkIGlzIGJlZm9yZSAlZDsgdGhlIGRhdGV0aW1lIHN0cmZ0aW1lKCkgXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXFwibWV0aG9kcyByZXF1aXJlIHllYXIgPj0gJWRcXFwiICVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgKHllYXIsIF9NSU5ZRUFSRk1ULCBfTUlOWUVBUkZNVCkpXFxuICAgICMgRG9uJ3QgY2FsbCB1dGNvZmZzZXQoKSBvciB0em5hbWUoKSB1bmxlc3MgYWN0dWFsbHkgbmVlZGVkLlxcbiAgICBmcmVwbGFjZSA9IE5vbmUgICMgdGhlIHN0cmluZyB0byB1c2UgZm9yICVmXFxuICAgIHpyZXBsYWNlID0gTm9uZSAgIyB0aGUgc3RyaW5nIHRvIHVzZSBmb3IgJXpcXG4gICAgWnJlcGxhY2UgPSBOb25lICAjIHRoZSBzdHJpbmcgdG8gdXNlIGZvciAlWlxcblxcbiAgICAjIFNjYW4gZm9ybWF0IGZvciAleiBhbmQgJVogZXNjYXBlcywgcmVwbGFjaW5nIGFzIG5lZWRlZC5cXG4gICAgbmV3Zm9ybWF0ID0gW11cXG4gICAgcHVzaCA9IG5ld2Zvcm1hdC5hcHBlbmRcXG4gICAgaSwgbiA9IDAsIGxlbihmb3JtYXQpXFxuICAgIHdoaWxlIGkgPCBuOlxcbiAgICAgICAgY2ggPSBmb3JtYXRbaV1cXG4gICAgICAgIGkgKz0gMVxcbiAgICAgICAgaWYgY2ggPT0gJyUnOlxcbiAgICAgICAgICAgIGlmIGkgPCBuOlxcbiAgICAgICAgICAgICAgICBjaCA9IGZvcm1hdFtpXVxcbiAgICAgICAgICAgICAgICBpICs9IDFcXG4gICAgICAgICAgICAgICAgaWYgY2ggPT0gJ2YnOlxcbiAgICAgICAgICAgICAgICAgICAgaWYgZnJlcGxhY2UgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmVwbGFjZSA9ICclMDZkJyAlIGdldGF0dHIob2JqZWN0LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWljcm9zZWNvbmQnLCAwKVxcbiAgICAgICAgICAgICAgICAgICAgbmV3Zm9ybWF0LmFwcGVuZChmcmVwbGFjZSlcXG4gICAgICAgICAgICAgICAgZWxpZiBjaCA9PSAneic6XFxuICAgICAgICAgICAgICAgICAgICBpZiB6cmVwbGFjZSBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHpyZXBsYWNlID0gXFxcIlxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgXFxcIl91dGNvZmZzZXRcXFwiKTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gb2JqZWN0Ll91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gJysnXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvZmZzZXQgPCAwOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gJy0nXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLCBtID0gZGl2bW9kKG9mZnNldCwgNjApXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6cmVwbGFjZSA9ICclYyUwMmQlMDJkJyAlIChzaWduLCBoLCBtKVxcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ICclJyBub3QgaW4genJlcGxhY2VcXG4gICAgICAgICAgICAgICAgICAgIG5ld2Zvcm1hdC5hcHBlbmQoenJlcGxhY2UpXFxuICAgICAgICAgICAgICAgIGVsaWYgY2ggPT0gJ1onOlxcbiAgICAgICAgICAgICAgICAgICAgaWYgWnJlcGxhY2UgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICBacmVwbGFjZSA9IFxcXCJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsIFxcXCJ0em5hbWVcXFwiKTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IG9iamVjdC50em5hbWUoKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdHJmdGltZSBpcyBnb2luZyB0byBoYXZlIGF0IHRoaXM6IGVzY2FwZSAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBacmVwbGFjZSA9IHMucmVwbGFjZSgnJScsICclJScpXFxuICAgICAgICAgICAgICAgICAgICBuZXdmb3JtYXQuYXBwZW5kKFpyZXBsYWNlKVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgcHVzaCgnJScpXFxuICAgICAgICAgICAgICAgICAgICBwdXNoKGNoKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHB1c2goJyUnKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBwdXNoKGNoKVxcbiAgICBuZXdmb3JtYXQgPSBcXFwiXFxcIi5qb2luKG5ld2Zvcm1hdClcXG4gICAgcmV0dXJuIF90aW1lLnN0cmZ0aW1lKG5ld2Zvcm1hdCwgdGltZXR1cGxlKVxcblxcbiMgSnVzdCByYWlzZSBUeXBlRXJyb3IgaWYgdGhlIGFyZyBpc24ndCBOb25lIG9yIGEgc3RyaW5nLlxcbmRlZiBfY2hlY2tfdHpuYW1lKG5hbWUpOlxcbiAgICBpZiBuYW1lIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShuYW1lLCBzdHIpOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0emluZm8udHpuYW1lKCkgbXVzdCByZXR1cm4gTm9uZSBvciBzdHJpbmcsIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwibm90ICclcydcXFwiICUgdHlwZShuYW1lKSlcXG5cXG4jIG5hbWUgaXMgdGhlIG9mZnNldC1wcm9kdWNpbmcgbWV0aG9kLCBcXFwidXRjb2Zmc2V0XFxcIiBvciBcXFwiZHN0XFxcIi5cXG4jIG9mZnNldCBpcyB3aGF0IGl0IHJldHVybmVkLlxcbiMgSWYgb2Zmc2V0IGlzbid0IE5vbmUgb3IgdGltZWRlbHRhLCByYWlzZXMgVHlwZUVycm9yLlxcbiMgSWYgb2Zmc2V0IGlzIE5vbmUsIHJldHVybnMgTm9uZS5cXG4jIEVsc2Ugb2Zmc2V0IGlzIGNoZWNrZWQgZm9yIGJlaW5nIGluIHJhbmdlLCBhbmQgYSB3aG9sZSAjIG9mIG1pbnV0ZXMuXFxuIyBJZiBpdCBpcywgaXRzIGludGVnZXIgdmFsdWUgaXMgcmV0dXJuZWQuICBFbHNlIFZhbHVlRXJyb3IgaXMgcmFpc2VkLlxcbmRlZiBfY2hlY2tfdXRjX29mZnNldChuYW1lLCBvZmZzZXQpOlxcbiAgICBhc3NlcnQgbmFtZSBpbiAoXFxcInV0Y29mZnNldFxcXCIsIFxcXCJkc3RcXFwiKVxcbiAgICBpZiBvZmZzZXQgaXMgTm9uZTpcXG4gICAgICAgIHJldHVyblxcbiAgICBpZiBub3QgaXNpbnN0YW5jZShvZmZzZXQsIHRpbWVkZWx0YSk6XFxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcInR6aW5mby4lcygpIG11c3QgcmV0dXJuIE5vbmUgXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJvciB0aW1lZGVsdGEsIG5vdCAnJXMnXFxcIiAlIChuYW1lLCB0eXBlKG9mZnNldCkpKVxcbiAgICBkYXlzID0gb2Zmc2V0LmRheXNcXG4gICAgaWYgZGF5cyA8IC0xIG9yIGRheXMgPiAwOlxcbiAgICAgICAgb2Zmc2V0ID0gMTQ0MCAgIyB0cmlnZ2VyIG91dC1vZi1yYW5nZVxcbiAgICBlbHNlOlxcbiAgICAgICAgc2Vjb25kcyA9IGRheXMgKiA4NjQwMCArIG9mZnNldC5zZWNvbmRzXFxuICAgICAgICBtaW51dGVzLCBzZWNvbmRzID0gZGl2bW9kKHNlY29uZHMsIDYwKVxcbiAgICAgICAgaWYgc2Vjb25kcyBvciBvZmZzZXQubWljcm9zZWNvbmRzOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcInR6aW5mby4lcygpIG11c3QgcmV0dXJuIGEgd2hvbGUgbnVtYmVyIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJvZiBtaW51dGVzXFxcIiAlIG5hbWUpXFxuICAgICAgICBvZmZzZXQgPSBtaW51dGVzXFxuICAgIGlmIG5vdCAtMTQ0MCA8IG9mZnNldCA8IDE0NDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCIlcygpPSVkLCBtdXN0IGJlIGluIC0xNDM5Li4xNDM5XFxcIiAlIChuYW1lLCBvZmZzZXQpKVxcbiAgICByZXR1cm4gb2Zmc2V0XFxuXFxuZGVmIF9jaGVja19pbnRfZmllbGQodmFsdWUpOlxcbiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBpbnQpOlxcbiAgICAgICAgcmV0dXJuIGludCh2YWx1ZSlcXG4gICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KTpcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLl9faW50X18oKVxcbiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOlxcbiAgICAgICAgICAgIHBhc3NcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgaW50KTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGludCh2YWx1ZSlcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ19faW50X18gbWV0aG9kIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlcicpXFxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2FuIGludGVnZXIgaXMgcmVxdWlyZWQnKVxcbiAgICByYWlzZSBUeXBlRXJyb3IoJ2ludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCcpXFxuXFxuZGVmIF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KTpcXG4gICAgeWVhciA9IF9jaGVja19pbnRfZmllbGQoeWVhcilcXG4gICAgbW9udGggPSBfY2hlY2tfaW50X2ZpZWxkKG1vbnRoKVxcbiAgICBkYXkgPSBfY2hlY2tfaW50X2ZpZWxkKGRheSlcXG4gICAgaWYgbm90IE1JTllFQVIgPD0geWVhciA8PSBNQVhZRUFSOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigneWVhciBtdXN0IGJlIGluICVkLi4lZCcgJSAoTUlOWUVBUiwgTUFYWUVBUiksIHllYXIpXFxuICAgIGlmIG5vdCAxIDw9IG1vbnRoIDw9IDEyOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbW9udGggbXVzdCBiZSBpbiAxLi4xMicsIG1vbnRoKVxcbiAgICBkaW0gPSBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aClcXG4gICAgaWYgbm90IDEgPD0gZGF5IDw9IGRpbTpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2RheSBtdXN0IGJlIGluIDEuLiVkJyAlIGRpbSwgZGF5KVxcbiAgICByZXR1cm4geWVhciwgbW9udGgsIGRheVxcblxcbmRlZiBfY2hlY2tfdGltZV9maWVsZHMoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kKTpcXG4gICAgaG91ciA9IF9jaGVja19pbnRfZmllbGQoaG91cilcXG4gICAgbWludXRlID0gX2NoZWNrX2ludF9maWVsZChtaW51dGUpXFxuICAgIHNlY29uZCA9IF9jaGVja19pbnRfZmllbGQoc2Vjb25kKVxcbiAgICBtaWNyb3NlY29uZCA9IF9jaGVja19pbnRfZmllbGQobWljcm9zZWNvbmQpXFxuICAgIGlmIG5vdCAwIDw9IGhvdXIgPD0gMjM6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdob3VyIG11c3QgYmUgaW4gMC4uMjMnLCBob3VyKVxcbiAgICBpZiBub3QgMCA8PSBtaW51dGUgPD0gNTk6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdtaW51dGUgbXVzdCBiZSBpbiAwLi41OScsIG1pbnV0ZSlcXG4gICAgaWYgbm90IDAgPD0gc2Vjb25kIDw9IDU5OlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignc2Vjb25kIG11c3QgYmUgaW4gMC4uNTknLCBzZWNvbmQpXFxuICAgIGlmIG5vdCAwIDw9IG1pY3Jvc2Vjb25kIDw9IDk5OTk5OTpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21pY3Jvc2Vjb25kIG11c3QgYmUgaW4gMC4uOTk5OTk5JywgbWljcm9zZWNvbmQpXFxuICAgIHJldHVybiBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmRcXG5cXG5kZWYgX2NoZWNrX3R6aW5mb19hcmcodHopOlxcbiAgICBpZiB0eiBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UodHosIHR6aW5mbyk6XFxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcInR6aW5mbyBhcmd1bWVudCBtdXN0IGJlIE5vbmUgb3Igb2YgYSB0emluZm8gc3ViY2xhc3NcXFwiKVxcblxcblxcbiMgTm90ZXMgb24gY29tcGFyaXNvbjogIEluIGdlbmVyYWwsIGRhdGV0aW1lIG1vZHVsZSBjb21wYXJpc29uIG9wZXJhdG9ycyByYWlzZVxcbiMgVHlwZUVycm9yIHdoZW4gdGhleSBkb24ndCBrbm93IGhvdyB0byBkbyBhIGNvbXBhcmlzb24gdGhlbXNlbGYuICBJZiB0aGV5XFxuIyByZXR1cm5lZCBOb3RJbXBsZW1lbnRlZCBpbnN0ZWFkLCBjb21wYXJpc29uIGNvdWxkIChzaWxlbnRseSkgZmFsbCBiYWNrIHRvXFxuIyB0aGUgZGVmYXVsdCBjb21wYXJlLW9iamVjdHMtYnktY29tcGFyaW5nLXRoZWlyLW1lbW9yeS1hZGRyZXNzZXMgc3RyYXRlZ3ksXFxuIyBhbmQgdGhhdCdzIG5vdCBoZWxwZnVsLiAgVGhlcmUgYXJlIHR3byBleGNlcHRpb25zOlxcbiNcXG4jIDEuIEZvciBkYXRlIGFuZCBkYXRldGltZSwgaWYgdGhlIG90aGVyIG9iamVjdCBoYXMgYSBcXFwidGltZXR1cGxlXFxcIiBhdHRyLFxcbiMgICAgTm90SW1wbGVtZW50ZWQgaXMgcmV0dXJuZWQuICBUaGlzIGlzIGEgaG9vayB0byBhbGxvdyBvdGhlciBraW5kcyBvZlxcbiMgICAgZGF0ZXRpbWUtbGlrZSBvYmplY3RzIGEgY2hhbmNlIHRvIGludGVyY2VwdCB0aGUgY29tcGFyaXNvbi5cXG4jXFxuIyAyLiBFbHNlIF9fZXFfXyBhbmQgX19uZV9fIHJldHVybiBGYWxzZSBhbmQgVHJ1ZSwgcmVzcGVjdGl2ZWx5LiAgVGhpcyBpc1xcbiMgICAgc28gb3BlcnRhaW9ucyBsaWtlXFxuI1xcbiMgICAgICAgIHggPT0geVxcbiMgICAgICAgIHggIT0geVxcbiMgICAgICAgIHggaW4gc2VxdWVuY2VcXG4jICAgICAgICB4IG5vdCBpbiBzZXF1ZW5jZVxcbiMgICAgICAgIGRpY3RbeF0gPSB5XFxuI1xcbiMgICAgZG9uJ3QgcmFpc2UgYW5ub3lpbmcgVHlwZUVycm9ycyBqdXN0IGJlY2F1c2UgYSBkYXRldGltZSBvYmplY3RcXG4jICAgIGlzIHBhcnQgb2YgYSBoZXRlcm9nZW5lb3VzIGNvbGxlY3Rpb24uICBJZiB0aGVyZSdzIG5vIGtub3duIHdheSB0b1xcbiMgICAgY29tcGFyZSBYIHRvIGEgZGF0ZXRpbWUsIHNheWluZyB0aGV5J3JlIG5vdCBlcXVhbCBpcyByZWFzb25hYmxlLlxcblxcbmRlZiBfY21wZXJyb3IoeCwgeSk6XFxuICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiY2FuJ3QgY29tcGFyZSAnJXMnIHRvICclcydcXFwiICUgKFxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSh4KS5fX25hbWVfXywgdHlwZSh5KS5fX25hbWVfXykpXFxuXFxuZGVmIF9ub3JtYWxpemVfcGFpcihoaSwgbG8sIGZhY3Rvcik6XFxuICAgIGlmIG5vdCAwIDw9IGxvIDw9IGZhY3Rvci0xOlxcbiAgICAgICAgaW5jLCBsbyA9IGRpdm1vZChsbywgZmFjdG9yKVxcbiAgICAgICAgaGkgKz0gaW5jXFxuICAgIHJldHVybiBoaSwgbG9cXG5cXG5kZWYgX25vcm1hbGl6ZV9kYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgaWdub3JlX292ZXJmbG93PUZhbHNlKTpcXG4gICAgIyBOb3JtYWxpemUgYWxsIHRoZSBpbnB1dHMsIGFuZCBzdG9yZSB0aGUgbm9ybWFsaXplZCB2YWx1ZXMuXFxuICAgIHNzLCB1cyA9IF9ub3JtYWxpemVfcGFpcihzcywgdXMsIDEwMDAwMDApXFxuICAgIG1tLCBzcyA9IF9ub3JtYWxpemVfcGFpcihtbSwgc3MsIDYwKVxcbiAgICBoaCwgbW0gPSBfbm9ybWFsaXplX3BhaXIoaGgsIG1tLCA2MClcXG4gICAgZCwgaGggPSBfbm9ybWFsaXplX3BhaXIoZCwgaGgsIDI0KVxcbiAgICB5LCBtLCBkID0gX25vcm1hbGl6ZV9kYXRlKHksIG0sIGQsIGlnbm9yZV9vdmVyZmxvdylcXG4gICAgcmV0dXJuIHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzXFxuXFxuZGVmIF9ub3JtYWxpemVfZGF0ZSh5ZWFyLCBtb250aCwgZGF5LCBpZ25vcmVfb3ZlcmZsb3c9RmFsc2UpOlxcbiAgICAjIFRoYXQgd2FzIGVhc3kuICBOb3cgaXQgZ2V0cyBtdWRkeTogIHRoZSBwcm9wZXIgcmFuZ2UgZm9yIGRheVxcbiAgICAjIGNhbid0IGJlIGRldGVybWluZWQgd2l0aG91dCBrbm93aW5nIHRoZSBjb3JyZWN0IG1vbnRoIGFuZCB5ZWFyLFxcbiAgICAjIGJ1dCBpZiBkYXkgaXMsIGUuZy4sIHBsdXMgb3IgbWludXMgYSBtaWxsaW9uLCB0aGUgY3VycmVudCBtb250aFxcbiAgICAjIGFuZCB5ZWFyIHZhbHVlcyBtYWtlIG5vIHNlbnNlIChhbmQgbWF5IGFsc28gYmUgb3V0IG9mIGJvdW5kc1xcbiAgICAjIHRoZW1zZWx2ZXMpLlxcbiAgICAjIFNheWluZyAxMiBtb250aHMgPT0gMSB5ZWFyIHNob3VsZCBiZSBub24tY29udHJvdmVyc2lhbC5cXG4gICAgaWYgbm90IDEgPD0gbW9udGggPD0gMTI6XFxuICAgICAgICB5ZWFyLCBtb250aCA9IF9ub3JtYWxpemVfcGFpcih5ZWFyLCBtb250aC0xLCAxMilcXG4gICAgICAgIG1vbnRoICs9IDFcXG4gICAgICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyXFxuXFxuICAgICMgTm93IG9ubHkgZGF5IGNhbiBiZSBvdXQgb2YgYm91bmRzICh5ZWFyIG1heSBhbHNvIGJlIG91dCBvZiBib3VuZHNcXG4gICAgIyBmb3IgYSBkYXRldGltZSBvYmplY3QsIGJ1dCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoYXQgaGVyZSkuXFxuICAgICMgSWYgZGF5IGlzIG91dCBvZiBib3VuZHMsIHdoYXQgdG8gZG8gaXMgYXJndWFibGUsIGJ1dCBhdCBsZWFzdCB0aGVcXG4gICAgIyBtZXRob2QgaGVyZSBpcyBwcmluY2lwbGVkIGFuZCBleHBsYWluYWJsZS5cXG4gICAgZGltID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgIGlmIG5vdCAxIDw9IGRheSA8PSBkaW06XFxuICAgICAgICAjIE1vdmUgZGF5LTEgZGF5cyBmcm9tIHRoZSBmaXJzdCBvZiB0aGUgbW9udGguICBGaXJzdCB0cnkgdG9cXG4gICAgICAgICMgZ2V0IG9mZiBjaGVhcCBpZiB3ZSdyZSBvbmx5IG9uZSBkYXkgb3V0IG9mIHJhbmdlIChhZGp1c3RtZW50c1xcbiAgICAgICAgIyBmb3IgdGltZXpvbmUgYWxvbmUgY2FuJ3QgYmUgd29yc2UgdGhhbiB0aGF0KS5cXG4gICAgICAgIGlmIGRheSA9PSAwOiAgICAjIG1vdmUgYmFjayBhIGRheVxcbiAgICAgICAgICAgIG1vbnRoIC09IDFcXG4gICAgICAgICAgICBpZiBtb250aCA+IDA6XFxuICAgICAgICAgICAgICAgIGRheSA9IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHllYXIsIG1vbnRoLCBkYXkgPSB5ZWFyLTEsIDEyLCAzMVxcbiAgICAgICAgZWxpZiBkYXkgPT0gZGltICsgMTogICAgIyBtb3ZlIGZvcndhcmQgYSBkYXlcXG4gICAgICAgICAgICBtb250aCArPSAxXFxuICAgICAgICAgICAgZGF5ID0gMVxcbiAgICAgICAgICAgIGlmIG1vbnRoID4gMTI6XFxuICAgICAgICAgICAgICAgIG1vbnRoID0gMVxcbiAgICAgICAgICAgICAgICB5ZWFyICs9IDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgb3JkaW5hbCA9IF95bWQyb3JkKHllYXIsIG1vbnRoLCAxKSArIChkYXkgLSAxKVxcbiAgICAgICAgICAgIHllYXIsIG1vbnRoLCBkYXkgPSBfb3JkMnltZChvcmRpbmFsKVxcblxcbiAgICBpZiBub3QgaWdub3JlX292ZXJmbG93IGFuZCBub3QgTUlOWUVBUiA8PSB5ZWFyIDw9IE1BWFlFQVI6XFxuICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKFxcXCJkYXRlIHZhbHVlIG91dCBvZiByYW5nZVxcXCIpXFxuICAgIHJldHVybiB5ZWFyLCBtb250aCwgZGF5XFxuXFxuZGVmIF9hY2N1bSh0YWcsIHNvZmFyLCBudW0sIGZhY3RvciwgbGVmdG92ZXIpOlxcbiAgICBpZiBpc2luc3RhbmNlKG51bSwgaW50KTpcXG4gICAgICAgIHByb2QgPSBudW0gKiBmYWN0b3JcXG4gICAgICAgIHJzdW0gPSBzb2ZhciArIHByb2RcXG4gICAgICAgIHJldHVybiByc3VtLCBsZWZ0b3ZlclxcbiAgICBpZiBpc2luc3RhbmNlKG51bSwgZmxvYXQpOlxcbiAgICAgICAgZnJhY3BhcnQsIGludHBhcnQgPSBfbWF0aC5tb2RmKG51bSlcXG4gICAgICAgIHByb2QgPSBpbnQoaW50cGFydCkgKiBmYWN0b3JcXG4gICAgICAgIHJzdW0gPSBzb2ZhciArIHByb2RcXG4gICAgICAgIGlmIGZyYWNwYXJ0ID09IDAuMDpcXG4gICAgICAgICAgICByZXR1cm4gcnN1bSwgbGVmdG92ZXJcXG4gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGZhY3RvciwgaW50KVxcbiAgICAgICAgZnJhY3BhcnQsIGludHBhcnQgPSBfbWF0aC5tb2RmKGZhY3RvciAqIGZyYWNwYXJ0KVxcbiAgICAgICAgcnN1bSArPSBpbnQoaW50cGFydClcXG4gICAgICAgIHJldHVybiByc3VtLCBsZWZ0b3ZlciArIGZyYWNwYXJ0XFxuICAgIHJhaXNlIFR5cGVFcnJvcihcXFwidW5zdXBwb3J0ZWQgdHlwZSBmb3IgdGltZWRlbHRhICVzIGNvbXBvbmVudDogJXNcXFwiICVcXG4gICAgICAgICAgICAgICAgICAgICh0YWcsIHR5cGUobnVtKSkpXFxuXFxuY2xhc3MgdGltZWRlbHRhKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIlJlcHJlc2VudCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBkYXRldGltZSBvYmplY3RzLlxcblxcbiAgICBTdXBwb3J0ZWQgb3BlcmF0b3JzOlxcblxcbiAgICAtIGFkZCwgc3VidHJhY3QgdGltZWRlbHRhXFxuICAgIC0gdW5hcnkgcGx1cywgbWludXMsIGFic1xcbiAgICAtIGNvbXBhcmUgdG8gdGltZWRlbHRhXFxuICAgIC0gbXVsdGlwbHksIGRpdmlkZSBieSBpbnQvbG9uZ1xcblxcbiAgICBJbiBhZGRpdGlvbiwgZGF0ZXRpbWUgc3VwcG9ydHMgc3VidHJhY3Rpb24gb2YgdHdvIGRhdGV0aW1lIG9iamVjdHNcXG4gICAgcmV0dXJuaW5nIGEgdGltZWRlbHRhLCBhbmQgYWRkaXRpb24gb3Igc3VidHJhY3Rpb24gb2YgYSBkYXRldGltZVxcbiAgICBhbmQgYSB0aW1lZGVsdGEgZ2l2aW5nIGEgZGF0ZXRpbWUuXFxuXFxuICAgIFJlcHJlc2VudGF0aW9uOiAoZGF5cywgc2Vjb25kcywgbWljcm9zZWNvbmRzKS4gIFdoeT8gIEJlY2F1c2UgSVxcbiAgICBmZWx0IGxpa2UgaXQuXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAnX2RheXMnLCAnX3NlY29uZHMnLCAnX21pY3Jvc2Vjb25kcycsICdfaGFzaGNvZGUnXFxuXFxuICAgIGRlZiBfX25ld19fKGNscywgZGF5cz1fU0VOVElORUwsIHNlY29uZHM9X1NFTlRJTkVMLCBtaWNyb3NlY29uZHM9X1NFTlRJTkVMLFxcbiAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHM9X1NFTlRJTkVMLCBtaW51dGVzPV9TRU5USU5FTCwgaG91cnM9X1NFTlRJTkVMLCB3ZWVrcz1fU0VOVElORUwpOlxcbiAgICAgICAgeCA9IDBcXG4gICAgICAgIGxlZnRvdmVyID0gMC4wXFxuICAgICAgICBpZiBtaWNyb3NlY29uZHMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwibWljcm9zZWNvbmRzXFxcIiwgeCwgbWljcm9zZWNvbmRzLCBfVVNfUEVSX1VTLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIG1pbGxpc2Vjb25kcyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJtaWxsaXNlY29uZHNcXFwiLCB4LCBtaWxsaXNlY29uZHMsIF9VU19QRVJfTVMsIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgc2Vjb25kcyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJzZWNvbmRzXFxcIiwgeCwgc2Vjb25kcywgX1VTX1BFUl9TRUNPTkQsIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgbWludXRlcyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJtaW51dGVzXFxcIiwgeCwgbWludXRlcywgX1VTX1BFUl9NSU5VVEUsIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgaG91cnMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwiaG91cnNcXFwiLCB4LCBob3VycywgX1VTX1BFUl9IT1VSLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIGRheXMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwiZGF5c1xcXCIsIHgsIGRheXMsIF9VU19QRVJfREFZLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIHdlZWtzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcIndlZWtzXFxcIiwgeCwgd2Vla3MsIF9VU19QRVJfV0VFSywgbGVmdG92ZXIpXFxuICAgICAgICBpZiBsZWZ0b3ZlciAhPSAwLjA6XFxuICAgICAgICAgICAgeCArPSBfcm91bmQobGVmdG92ZXIpXFxuICAgICAgICByZXR1cm4gY2xzLl9mcm9tX21pY3Jvc2Vjb25kcyh4KVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIF9mcm9tX21pY3Jvc2Vjb25kcyhjbHMsIHVzKTpcXG4gICAgICAgIHMsIHVzID0gZGl2bW9kKHVzLCBfVVNfUEVSX1NFQ09ORClcXG4gICAgICAgIGQsIHMgPSBkaXZtb2QocywgX1NFQ09ORFNfUEVSX0RBWSlcXG4gICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZShkLCBzLCB1cywgRmFsc2UpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgX2NyZWF0ZShjbHMsIGQsIHMsIHVzLCBub3JtYWxpemUpOlxcbiAgICAgICAgaWYgbm9ybWFsaXplOlxcbiAgICAgICAgICAgIHMsIHVzID0gX25vcm1hbGl6ZV9wYWlyKHMsIHVzLCAxMDAwMDAwKVxcbiAgICAgICAgICAgIGQsIHMgPSBfbm9ybWFsaXplX3BhaXIoZCwgcywgMjQqMzYwMClcXG5cXG4gICAgICAgIGlmIG5vdCAtX01BWF9ERUxUQV9EQVlTIDw9IGQgPD0gX01BWF9ERUxUQV9EQVlTOlxcbiAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoXFxcImRheXM9JWQ7IG11c3QgaGF2ZSBtYWduaXR1ZGUgPD0gJWRcXFwiICUgKGQsIF9NQVhfREVMVEFfREFZUykpXFxuXFxuICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKVxcbiAgICAgICAgc2VsZi5fZGF5cyA9IGRcXG4gICAgICAgIHNlbGYuX3NlY29uZHMgPSBzXFxuICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMgPSB1c1xcbiAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIF90b19taWNyb3NlY29uZHMoc2VsZik6XFxuICAgICAgICByZXR1cm4gKChzZWxmLl9kYXlzICogX1NFQ09ORFNfUEVSX0RBWSArIHNlbGYuX3NlY29uZHMpICogX1VTX1BFUl9TRUNPTkQgK1xcbiAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMpXFxuXFxuICAgIGRlZiBfX3JlcHJfXyhzZWxmKTpcXG4gICAgICAgIG1vZHVsZSA9IFxcXCJkYXRldGltZS5cXFwiIGlmIHNlbGYuX19jbGFzc19fIGlzIHRpbWVkZWx0YSBlbHNlIFxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9taWNyb3NlY29uZHM6XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCIlcyglZCwgJWQsICVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcylcXG4gICAgICAgIGlmIHNlbGYuX3NlY29uZHM6XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCIlcyglZCwgJWQpXFxcIiAlIChtb2R1bGUgKyBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzKVxcbiAgICAgICAgcmV0dXJuIFxcXCIlcyglZClcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLl9kYXlzKVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIG1tLCBzcyA9IGRpdm1vZChzZWxmLl9zZWNvbmRzLCA2MClcXG4gICAgICAgIGhoLCBtbSA9IGRpdm1vZChtbSwgNjApXFxuICAgICAgICBzID0gXFxcIiVkOiUwMmQ6JTAyZFxcXCIgJSAoaGgsIG1tLCBzcylcXG4gICAgICAgIGlmIHNlbGYuX2RheXM6XFxuICAgICAgICAgICAgZGVmIHBsdXJhbChuKTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIG4sIGFicyhuKSAhPSAxIGFuZCBcXFwic1xcXCIgb3IgXFxcIlxcXCJcXG4gICAgICAgICAgICBzID0gKFxcXCIlZCBkYXklcywgXFxcIiAlIHBsdXJhbChzZWxmLl9kYXlzKSkgKyBzXFxuICAgICAgICBpZiBzZWxmLl9taWNyb3NlY29uZHM6XFxuICAgICAgICAgICAgcyA9IHMgKyBcXFwiLiUwNmRcXFwiICUgc2VsZi5fbWljcm9zZWNvbmRzXFxuICAgICAgICByZXR1cm4gc1xcblxcbiAgICBkZWYgdG90YWxfc2Vjb25kcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRvdGFsIHNlY29uZHMgaW4gdGhlIGR1cmF0aW9uLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3RvX21pY3Jvc2Vjb25kcygpIC8gMTAuMCoqNlxcblxcbiAgICAjIFJlYWQtb25seSBmaWVsZCBhY2Nlc3NvcnNcXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBkYXlzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGF5c1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2RheXNcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBzZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwic2Vjb25kc1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NlY29uZHNcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtaWNyb3NlY29uZHMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaWNyb3NlY29uZHNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9taWNyb3NlY29uZHNcXG5cXG4gICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICAjIGZvciBDUHl0aG9uIGNvbXBhdGliaWxpdHksIHdlIGNhbm5vdCB1c2VcXG4gICAgICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZShzZWxmLl9kYXlzICsgb3RoZXIuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgKyBvdGhlci5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzICsgb3RoZXIuX21pY3Jvc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgICMgZm9yIENQeXRob24gY29tcGF0aWJpbGl0eSwgd2UgY2Fubm90IHVzZVxcbiAgICAgICAgICAgICMgb3VyIF9fY2xhc3NfXyBoZXJlLCBidXQgbmVlZCBhIHJlYWwgdGltZWRlbHRhXFxuICAgICAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fY3JlYXRlKHNlbGYuX2RheXMgLSBvdGhlci5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyAtIG90aGVyLl9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMgLSBvdGhlci5fbWljcm9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlKVxcbiAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuXFxuICAgIGRlZiBfX25lZ19fKHNlbGYpOlxcbiAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fY3JlYXRlKC1zZWxmLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zZWxmLl9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zZWxmLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSlcXG5cXG4gICAgZGVmIF9fcG9zX18oc2VsZik6XFxuICAgICAgICAjIGZvciBDUHl0aG9uIGNvbXBhdGliaWxpdHksIHdlIGNhbm5vdCB1c2VcXG4gICAgICAgICMgb3VyIF9fY2xhc3NfXyBoZXJlLCBidXQgbmVlZCBhIHJlYWwgdGltZWRlbHRhXFxuICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoc2VsZi5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZSlcXG5cXG4gICAgZGVmIF9fYWJzX18oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl9kYXlzIDwgMDpcXG4gICAgICAgICAgICByZXR1cm4gLXNlbGZcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIF9fbXVsX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGludCk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICB1c2VjID0gc2VsZi5fdG9fbWljcm9zZWNvbmRzKClcXG4gICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2Zyb21fbWljcm9zZWNvbmRzKHVzZWMgKiBvdGhlcilcXG5cXG4gICAgX19ybXVsX18gPSBfX211bF9fXFxuXFxuICAgIGRlZiBfX2Rpdl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBpbnQpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgdXNlYyA9IHNlbGYuX3RvX21pY3Jvc2Vjb25kcygpXFxuICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9mcm9tX21pY3Jvc2Vjb25kcyh1c2VjIC8vIG90aGVyKVxcblxcbiAgICBfX2Zsb29yZGl2X18gPSBfX2Rpdl9fXFxuXFxuICAgICMgQ29tcGFyaXNvbnMgb2YgdGltZWRlbHRhIG9iamVjdHMgd2l0aCBvdGhlci5cXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSAhPSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuXFxuICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID4gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfY21wKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpXFxuICAgICAgICByZXR1cm4gX2NtcChzZWxmLl9nZXRzdGF0ZSgpLCBvdGhlci5fZ2V0c3RhdGUoKSlcXG5cXG4gICAgZGVmIF9faGFzaF9fKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5faGFzaGNvZGUgPT0gLTE6XFxuICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKHNlbGYuX2dldHN0YXRlKCkpXFxuICAgICAgICByZXR1cm4gc2VsZi5faGFzaGNvZGVcXG5cXG4gICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIChzZWxmLl9kYXlzICE9IDAgb3JcXG4gICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyAhPSAwIG9yXFxuICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcyAhPSAwKVxcblxcbnRpbWVkZWx0YS5taW4gPSB0aW1lZGVsdGEoLV9NQVhfREVMVEFfREFZUylcXG50aW1lZGVsdGEubWF4ID0gdGltZWRlbHRhKF9NQVhfREVMVEFfREFZUywgMjQqMzYwMC0xLCAxMDAwMDAwLTEpXFxudGltZWRlbHRhLnJlc29sdXRpb24gPSB0aW1lZGVsdGEobWljcm9zZWNvbmRzPTEpXFxuXFxuY2xhc3MgZGF0ZShvYmplY3QpOlxcbiAgICBcXFwiXFxcIlxcXCJDb25jcmV0ZSBkYXRlIHR5cGUuXFxuXFxuICAgIENvbnN0cnVjdG9yczpcXG5cXG4gICAgX19uZXdfXygpXFxuICAgIGZyb210aW1lc3RhbXAoKVxcbiAgICB0b2RheSgpXFxuICAgIGZyb21vcmRpbmFsKClcXG5cXG4gICAgT3BlcmF0b3JzOlxcblxcbiAgICBfX3JlcHJfXywgX19zdHJfX1xcbiAgICBfX2NtcF9fLCBfX2hhc2hfX1xcbiAgICBfX2FkZF9fLCBfX3JhZGRfXywgX19zdWJfXyAoYWRkL3JhZGQgb25seSB3aXRoIHRpbWVkZWx0YSBhcmcpXFxuXFxuICAgIE1ldGhvZHM6XFxuXFxuICAgIHRpbWV0dXBsZSgpXFxuICAgIHRvb3JkaW5hbCgpXFxuICAgIHdlZWtkYXkoKVxcbiAgICBpc293ZWVrZGF5KCksIGlzb2NhbGVuZGFyKCksIGlzb2Zvcm1hdCgpXFxuICAgIGN0aW1lKClcXG4gICAgc3RyZnRpbWUoKVxcblxcbiAgICBQcm9wZXJ0aWVzIChyZWFkb25seSk6XFxuICAgIHllYXIsIG1vbnRoLCBkYXlcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIF9fc2xvdHNfXyA9ICdfeWVhcicsICdfbW9udGgnLCAnX2RheScsICdfaGFzaGNvZGUnXFxuXFxuICAgIGRlZiBfX25ld19fKGNscywgeWVhciwgbW9udGg9Tm9uZSwgZGF5PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29uc3RydWN0b3IuXFxuXFxuICAgICAgICBBcmd1bWVudHM6XFxuXFxuICAgICAgICB5ZWFyLCBtb250aCwgZGF5IChyZXF1aXJlZCwgYmFzZSAxKVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gX2NoZWNrX2RhdGVfZmllbGRzKHllYXIsIG1vbnRoLCBkYXkpXFxuICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKVxcbiAgICAgICAgc2VsZi5feWVhciA9IHllYXJcXG4gICAgICAgIHNlbGYuX21vbnRoID0gbW9udGhcXG4gICAgICAgIHNlbGYuX2RheSA9IGRheVxcbiAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgIyBBZGRpdGlvbmFsIGNvbnN0cnVjdG9yc1xcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIGZyb210aW1lc3RhbXAoY2xzLCB0KTpcXG4gICAgICAgIFxcXCJDb25zdHJ1Y3QgYSBkYXRlIGZyb20gYSBQT1NJWCB0aW1lc3RhbXAgKGxpa2UgdGltZS50aW1lKCkpLlxcXCJcXG4gICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MsIHdlZWtkYXksIGpkYXksIGRzdCA9IF90aW1lLmxvY2FsdGltZSh0KVxcbiAgICAgICAgcmV0dXJuIGNscyh5LCBtLCBkKVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIHRvZGF5KGNscyk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgZGF0ZSBmcm9tIHRpbWUudGltZSgpLlxcXCJcXG4gICAgICAgIHQgPSBfdGltZS50aW1lKClcXG4gICAgICAgIHJldHVybiBjbHMuZnJvbXRpbWVzdGFtcCh0KVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIGZyb21vcmRpbmFsKGNscywgbik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb250cnVjdCBhIGRhdGUgZnJvbSBhIHByb2xlcHRpYyBHcmVnb3JpYW4gb3JkaW5hbC5cXG5cXG4gICAgICAgIEphbnVhcnkgMSBvZiB5ZWFyIDEgaXMgZGF5IDEuICBPbmx5IHRoZSB5ZWFyLCBtb250aCBhbmQgZGF5IGFyZVxcbiAgICAgICAgbm9uLXplcm8gaW4gdGhlIHJlc3VsdC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgeSwgbSwgZCA9IF9vcmQyeW1kKG4pXFxuICAgICAgICByZXR1cm4gY2xzKHksIG0sIGQpXFxuXFxuICAgICMgQ29udmVyc2lvbnMgdG8gc3RyaW5nXFxuXFxuICAgIGRlZiBfX3JlcHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnZlcnQgdG8gZm9ybWFsIHN0cmluZywgZm9yIHJlcHIoKS5cXG5cXG4gICAgICAgID4+PiBkdCA9IGRhdGV0aW1lKDIwMTAsIDEsIDEpXFxuICAgICAgICA+Pj4gcmVwcihkdClcXG4gICAgICAgICdkYXRldGltZS5kYXRldGltZSgyMDEwLCAxLCAxLCAwLCAwKSdcXG5cXG4gICAgICAgID4+PiBkdCA9IGRhdGV0aW1lKDIwMTAsIDEsIDEsIHR6aW5mbz10aW1lem9uZS51dGMpXFxuICAgICAgICA+Pj4gcmVwcihkdClcXG4gICAgICAgICdkYXRldGltZS5kYXRldGltZSgyMDEwLCAxLCAxLCAwLCAwLCB0emluZm89ZGF0ZXRpbWUudGltZXpvbmUudXRjKSdcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgbW9kdWxlID0gXFxcImRhdGV0aW1lLlxcXCIgaWYgc2VsZi5fX2NsYXNzX18gaXMgZGF0ZSBlbHNlIFxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gXFxcIiVzKCVkLCAlZCwgJWQpXFxcIiAlIChtb2R1bGUgKyBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3llYXIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9tb250aCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RheSlcXG5cXG4gICAgIyBYWFggVGhlc2Ugc2hvdWxkbid0IGRlcGVuZCBvbiB0aW1lLmxvY2FsdGltZSgpLCBiZWNhdXNlIHRoYXRcXG4gICAgIyBjbGlwcyB0aGUgdXNhYmxlIGRhdGVzIHRvIFsxOTcwIC4uIDIwMzgpLiAgQXQgbGVhc3QgY3RpbWUoKSBpc1xcbiAgICAjIGVhc2lseSBkb25lIHdpdGhvdXQgdXNpbmcgc3RyZnRpbWUoKSAtLSB0aGF0J3MgYmV0dGVyIHRvbyBiZWNhdXNlXFxuICAgICMgc3RyZnRpbWUoXFxcIiVjXFxcIiwgLi4uKSBpcyBsb2NhbGUgc3BlY2lmaWMuXFxuXFxuICAgIGRlZiBjdGltZShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gY3RpbWUoKSBzdHlsZSBzdHJpbmcuXFxcIlxcbiAgICAgICAgd2Vla2RheSA9IHNlbGYudG9vcmRpbmFsKCkgJSA3IG9yIDdcXG4gICAgICAgIHJldHVybiBcXFwiJXMgJXMgJTJkIDAwOjAwOjAwICUwNGRcXFwiICUgKFxcbiAgICAgICAgICAgIF9EQVlOQU1FU1t3ZWVrZGF5XSxcXG4gICAgICAgICAgICBfTU9OVEhOQU1FU1tzZWxmLl9tb250aF0sXFxuICAgICAgICAgICAgc2VsZi5fZGF5LCBzZWxmLl95ZWFyKVxcblxcbiAgICBkZWYgc3RyZnRpbWUoc2VsZiwgZm9ybWF0KTpcXG4gICAgICAgIFxcXCJGb3JtYXQgdXNpbmcgc3RyZnRpbWUoKS5cXFwiXFxuICAgICAgICByZXR1cm4gX3dyYXBfc3RyZnRpbWUoc2VsZiwgZm9ybWF0LCBzZWxmLnRpbWV0dXBsZSgpKVxcblxcbiAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmbXQpOlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZm10LCAoc3RyLCB1bmljb2RlKSk6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiX19mb3JtYXRfXyBleHBlY3RzIHN0ciBvciB1bmljb2RlLCBub3QgJXNcXFwiICVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5fX2NsYXNzX18uX19uYW1lX18pXFxuICAgICAgICBpZiBsZW4oZm10KSAhPSAwOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnN0cmZ0aW1lKGZtdClcXG4gICAgICAgIHJldHVybiBzdHIoc2VsZilcXG5cXG4gICAgZGVmIGlzb2Zvcm1hdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgZGF0ZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIElTTy5cXG5cXG4gICAgICAgIFRoaXMgaXMgJ1lZWVktTU0tREQnLlxcblxcbiAgICAgICAgUmVmZXJlbmNlczpcXG4gICAgICAgIC0gaHR0cDovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZVxcbiAgICAgICAgLSBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvaXNvLXRpbWUuaHRtbFxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gXFxcIiUwNGQtJTAyZC0lMDJkXFxcIiAlIChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5KVxcblxcbiAgICBfX3N0cl9fID0gaXNvZm9ybWF0XFxuXFxuICAgICMgUmVhZC1vbmx5IGZpZWxkIGFjY2Vzc29yc1xcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHllYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ5ZWFyICgxLTk5OTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5feWVhclxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1vbnRoKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibW9udGggKDEtMTIpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbW9udGhcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBkYXkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJkYXkgKDEtMzEpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZGF5XFxuXFxuICAgICMgU3RhbmRhcmQgY29udmVyc2lvbnMsIF9fY21wX18sIF9faGFzaF9fIChhbmQgaGVscGVycylcXG5cXG4gICAgZGVmIHRpbWV0dXBsZShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gbG9jYWwgdGltZSB0dXBsZSBjb21wYXRpYmxlIHdpdGggdGltZS5sb2NhbHRpbWUoKS5cXFwiXFxuICAgICAgICByZXR1cm4gX2J1aWxkX3N0cnVjdF90aW1lKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIC0xKVxcblxcbiAgICBkZWYgdG9vcmRpbmFsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHByb2xlcHRpYyBHcmVnb3JpYW4gb3JkaW5hbCBmb3IgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXkuXFxuXFxuICAgICAgICBKYW51YXJ5IDEgb2YgeWVhciAxIGlzIGRheSAxLiAgT25seSB0aGUgeWVhciwgbW9udGggYW5kIGRheSB2YWx1ZXNcXG4gICAgICAgIGNvbnRyaWJ1dGUgdG8gdGhlIHJlc3VsdC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIF95bWQyb3JkKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXkpXFxuXFxuICAgIGRlZiByZXBsYWNlKHNlbGYsIHllYXI9Tm9uZSwgbW9udGg9Tm9uZSwgZGF5PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgbmV3IGRhdGUgd2l0aCBuZXcgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkcy5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHllYXIgaXMgTm9uZTpcXG4gICAgICAgICAgICB5ZWFyID0gc2VsZi5feWVhclxcbiAgICAgICAgaWYgbW9udGggaXMgTm9uZTpcXG4gICAgICAgICAgICBtb250aCA9IHNlbGYuX21vbnRoXFxuICAgICAgICBpZiBkYXkgaXMgTm9uZTpcXG4gICAgICAgICAgICBkYXkgPSBzZWxmLl9kYXlcXG4gICAgICAgIHJldHVybiBkYXRlKHllYXIsIG1vbnRoLCBkYXkpXFxuXFxuICAgICMgQ29tcGFyaXNvbnMgb2YgZGF0ZSBvYmplY3RzIHdpdGggb3RoZXIuXFxuXFxuICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPT0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpICE9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPCAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID49IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX2NtcChzZWxmLCBvdGhlcik6XFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSlcXG4gICAgICAgIHksIG0sIGQgPSBzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5XFxuICAgICAgICB5MiwgbTIsIGQyID0gb3RoZXIuX3llYXIsIG90aGVyLl9tb250aCwgb3RoZXIuX2RheVxcbiAgICAgICAgcmV0dXJuIF9jbXAoKHksIG0sIGQpLCAoeTIsIG0yLCBkMikpXFxuXFxuICAgIGRlZiBfX2hhc2hfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJIYXNoLlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX2hhc2hjb2RlID09IC0xOlxcbiAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuICAgICMgQ29tcHV0YXRpb25zXFxuXFxuICAgIGRlZiBfYWRkX3RpbWVkZWx0YShzZWxmLCBvdGhlciwgZmFjdG9yKTpcXG4gICAgICAgIHksIG0sIGQgPSBfbm9ybWFsaXplX2RhdGUoXFxuICAgICAgICAgICAgc2VsZi5feWVhcixcXG4gICAgICAgICAgICBzZWxmLl9tb250aCxcXG4gICAgICAgICAgICBzZWxmLl9kYXkgKyBvdGhlci5kYXlzICogZmFjdG9yKVxcbiAgICAgICAgcmV0dXJuIGRhdGUoeSwgbSwgZClcXG5cXG4gICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIkFkZCBhIGRhdGUgdG8gYSB0aW1lZGVsdGEuXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fYWRkX3RpbWVkZWx0YShvdGhlciwgMSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBfX3JhZGRfXyA9IF9fYWRkX19cXG5cXG4gICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU3VidHJhY3QgdHdvIGRhdGVzLCBvciBhIGRhdGUgYW5kIGEgdGltZWRlbHRhLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgZGF5czEgPSBzZWxmLnRvb3JkaW5hbCgpXFxuICAgICAgICAgICAgZGF5czIgPSBvdGhlci50b29yZGluYWwoKVxcbiAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZShkYXlzMSAtIGRheXMyLCAwLCAwLCBGYWxzZSlcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZF90aW1lZGVsdGEob3RoZXIsIC0xKVxcbiAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuXFxuICAgIGRlZiB3ZWVrZGF5KHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBkYXkgb2YgdGhlIHdlZWssIHdoZXJlIE1vbmRheSA9PSAwIC4uLiBTdW5kYXkgPT0gNi5cXFwiXFxuICAgICAgICByZXR1cm4gKHNlbGYudG9vcmRpbmFsKCkgKyA2KSAlIDdcXG5cXG4gICAgIyBEYXktb2YtdGhlLXdlZWsgYW5kIHdlZWstb2YtdGhlLXllYXIsIGFjY29yZGluZyB0byBJU09cXG5cXG4gICAgZGVmIGlzb3dlZWtkYXkoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGRheSBvZiB0aGUgd2Vlaywgd2hlcmUgTW9uZGF5ID09IDEgLi4uIFN1bmRheSA9PSA3LlxcXCJcXG4gICAgICAgICMgMS1KYW4tMDAwMSBpcyBhIE1vbmRheVxcbiAgICAgICAgcmV0dXJuIHNlbGYudG9vcmRpbmFsKCkgJSA3IG9yIDdcXG5cXG4gICAgZGVmIGlzb2NhbGVuZGFyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIElTTyB5ZWFyLCB3ZWVrIG51bWJlciwgYW5kIHdlZWtkYXkuXFxuXFxuICAgICAgICBUaGUgZmlyc3QgSVNPIHdlZWsgb2YgdGhlIHllYXIgaXMgdGhlIChNb24tU3VuKSB3ZWVrXFxuICAgICAgICBjb250YWluaW5nIHRoZSB5ZWFyJ3MgZmlyc3QgVGh1cnNkYXk7IGV2ZXJ5dGhpbmcgZWxzZSBkZXJpdmVzXFxuICAgICAgICBmcm9tIHRoYXQuXFxuXFxuICAgICAgICBUaGUgZmlyc3Qgd2VlayBpcyAxOyBNb25kYXkgaXMgMSAuLi4gU3VuZGF5IGlzIDcuXFxuXFxuICAgICAgICBJU08gY2FsZW5kYXIgYWxnb3JpdGhtIHRha2VuIGZyb21cXG4gICAgICAgIGh0dHA6Ly93d3cucGh5cy51dS5ubC9+dmdlbnQvY2FsZW5kYXIvaXNvY2FsZW5kYXIuaHRtXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHllYXIgPSBzZWxmLl95ZWFyXFxuICAgICAgICB3ZWVrMW1vbmRheSA9IF9pc293ZWVrMW1vbmRheSh5ZWFyKVxcbiAgICAgICAgdG9kYXkgPSBfeW1kMm9yZChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5KVxcbiAgICAgICAgIyBJbnRlcm5hbGx5LCB3ZWVrIGFuZCBkYXkgaGF2ZSBvcmlnaW4gMFxcbiAgICAgICAgd2VlaywgZGF5ID0gZGl2bW9kKHRvZGF5IC0gd2VlazFtb25kYXksIDcpXFxuICAgICAgICBpZiB3ZWVrIDwgMDpcXG4gICAgICAgICAgICB5ZWFyIC09IDFcXG4gICAgICAgICAgICB3ZWVrMW1vbmRheSA9IF9pc293ZWVrMW1vbmRheSh5ZWFyKVxcbiAgICAgICAgICAgIHdlZWssIGRheSA9IGRpdm1vZCh0b2RheSAtIHdlZWsxbW9uZGF5LCA3KVxcbiAgICAgICAgZWxpZiB3ZWVrID49IDUyOlxcbiAgICAgICAgICAgIGlmIHRvZGF5ID49IF9pc293ZWVrMW1vbmRheSh5ZWFyKzEpOlxcbiAgICAgICAgICAgICAgICB5ZWFyICs9IDFcXG4gICAgICAgICAgICAgICAgd2VlayA9IDBcXG4gICAgICAgIHJldHVybiB5ZWFyLCB3ZWVrKzEsIGRheSsxXFxuXFxuX2RhdGVfY2xhc3MgPSBkYXRlICAjIHNvIGZ1bmN0aW9ucyB3LyBhcmdzIG5hbWVkIFxcXCJkYXRlXFxcIiBjYW4gZ2V0IGF0IHRoZSBjbGFzc1xcblxcbmRhdGUubWluID0gZGF0ZSgxLCAxLCAxKVxcbmRhdGUubWF4ID0gZGF0ZSg5OTk5LCAxMiwgMzEpXFxuZGF0ZS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKGRheXM9MSlcXG5cXG5jbGFzcyB0emluZm8ob2JqZWN0KTpcXG4gICAgXFxcIlxcXCJcXFwiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgdGltZSB6b25lIGluZm8gY2xhc3Nlcy5cXG5cXG4gICAgU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoZSBuYW1lKCksIHV0Y29mZnNldCgpIGFuZCBkc3QoKSBtZXRob2RzLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gKClcXG5cXG4gICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6XFxuICAgICAgICBcXFwiZGF0ZXRpbWUgLT4gc3RyaW5nIG5hbWUgb2YgdGltZSB6b25lLlxcXCJcXG4gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInR6aW5mbyBzdWJjbGFzcyBtdXN0IG92ZXJyaWRlIHR6bmFtZSgpXFxcIilcXG5cXG4gICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6XFxuICAgICAgICBcXFwiZGF0ZXRpbWUgLT4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgZm9yIHdlc3Qgb2YgVVRDKVxcXCJcXG4gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInR6aW5mbyBzdWJjbGFzcyBtdXN0IG92ZXJyaWRlIHV0Y29mZnNldCgpXFxcIilcXG5cXG4gICAgZGVmIGRzdChzZWxmLCBkdCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJkYXRldGltZSAtPiBEU1Qgb2Zmc2V0IGluIG1pbnV0ZXMgZWFzdCBvZiBVVEMuXFxuXFxuICAgICAgICBSZXR1cm4gMCBpZiBEU1Qgbm90IGluIGVmZmVjdC4gIHV0Y29mZnNldCgpIG11c3QgaW5jbHVkZSB0aGUgRFNUXFxuICAgICAgICBvZmZzZXQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInR6aW5mbyBzdWJjbGFzcyBtdXN0IG92ZXJyaWRlIGRzdCgpXFxcIilcXG5cXG4gICAgZGVmIGZyb211dGMoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcImRhdGV0aW1lIGluIFVUQyAtPiBkYXRldGltZSBpbiBsb2NhbCB0aW1lLlxcXCJcXG5cXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGR0LCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJmcm9tdXRjKCkgcmVxdWlyZXMgYSBkYXRldGltZSBhcmd1bWVudFxcXCIpXFxuICAgICAgICBpZiBkdC50emluZm8gaXMgbm90IHNlbGY6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiZHQudHppbmZvIGlzIG5vdCBzZWxmXFxcIilcXG5cXG4gICAgICAgIGR0b2ZmID0gZHQudXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIGR0b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiZnJvbXV0YygpIHJlcXVpcmVzIGEgbm9uLU5vbmUgdXRjb2Zmc2V0KCkgXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInJlc3VsdFxcXCIpXFxuXFxuICAgICAgICAjIFNlZSB0aGUgbG9uZyBjb21tZW50IGJsb2NrIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlIGZvciBhblxcbiAgICAgICAgIyBleHBsYW5hdGlvbiBvZiB0aGlzIGFsZ29yaXRobS5cXG4gICAgICAgIGR0ZHN0ID0gZHQuZHN0KClcXG4gICAgICAgIGlmIGR0ZHN0IGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiZnJvbXV0YygpIHJlcXVpcmVzIGEgbm9uLU5vbmUgZHN0KCkgcmVzdWx0XFxcIilcXG4gICAgICAgIGRlbHRhID0gZHRvZmYgLSBkdGRzdFxcbiAgICAgICAgaWYgZGVsdGE6XFxuICAgICAgICAgICAgZHQgPSBkdCArIGRlbHRhXFxuICAgICAgICAgICAgZHRkc3QgPSBkdC5kc3QoKVxcbiAgICAgICAgICAgIGlmIGR0ZHN0IGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImZyb211dGMoKTogZHQuZHN0IGdhdmUgaW5jb25zaXN0ZW50IFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicmVzdWx0czsgY2Fubm90IGNvbnZlcnRcXFwiKVxcbiAgICAgICAgaWYgZHRkc3Q6XFxuICAgICAgICAgICAgcmV0dXJuIGR0ICsgZHRkc3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIGR0XFxuXFxuX3R6aW5mb19jbGFzcyA9IHR6aW5mb1xcblxcbmNsYXNzIHRpbWUob2JqZWN0KTpcXG4gICAgXFxcIlxcXCJcXFwiVGltZSB3aXRoIHRpbWUgem9uZS5cXG5cXG4gICAgQ29uc3RydWN0b3JzOlxcblxcbiAgICBfX25ld19fKClcXG5cXG4gICAgT3BlcmF0b3JzOlxcblxcbiAgICBfX3JlcHJfXywgX19zdHJfX1xcbiAgICBfX2NtcF9fLCBfX2hhc2hfX1xcblxcbiAgICBNZXRob2RzOlxcblxcbiAgICBzdHJmdGltZSgpXFxuICAgIGlzb2Zvcm1hdCgpXFxuICAgIHV0Y29mZnNldCgpXFxuICAgIHR6bmFtZSgpXFxuICAgIGRzdCgpXFxuXFxuICAgIFByb3BlcnRpZXMgKHJlYWRvbmx5KTpcXG4gICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCB0emluZm9cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIF9fc2xvdHNfXyA9ICdfaG91cicsICdfbWludXRlJywgJ19zZWNvbmQnLCAnX21pY3Jvc2Vjb25kJywgJ190emluZm8nLCAnX2hhc2hjb2RlJ1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIGhvdXI9MCwgbWludXRlPTAsIHNlY29uZD0wLCBtaWNyb3NlY29uZD0wLCB0emluZm89Tm9uZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb25zdHJ1Y3Rvci5cXG5cXG4gICAgICAgIEFyZ3VtZW50czpcXG5cXG4gICAgICAgIGhvdXIsIG1pbnV0ZSAocmVxdWlyZWQpXFxuICAgICAgICBzZWNvbmQsIG1pY3Jvc2Vjb25kIChkZWZhdWx0IHRvIHplcm8pXFxuICAgICAgICB0emluZm8gKGRlZmF1bHQgdG8gTm9uZSlcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kID0gX2NoZWNrX3RpbWVfZmllbGRzKFxcbiAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZClcXG4gICAgICAgIF9jaGVja190emluZm9fYXJnKHR6aW5mbylcXG4gICAgICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpXFxuICAgICAgICBzZWxmLl9ob3VyID0gaG91clxcbiAgICAgICAgc2VsZi5fbWludXRlID0gbWludXRlXFxuICAgICAgICBzZWxmLl9zZWNvbmQgPSBzZWNvbmRcXG4gICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kID0gbWljcm9zZWNvbmRcXG4gICAgICAgIHNlbGYuX3R6aW5mbyA9IHR6aW5mb1xcbiAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgaG91cihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImhvdXIgKDAtMjMpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faG91clxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pbnV0ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1pbnV0ZSAoMC01OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9taW51dGVcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBzZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJzZWNvbmQgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWljcm9zZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaWNyb3NlY29uZCAoMC05OTk5OTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWljcm9zZWNvbmRcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB0emluZm8oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ0aW1lem9uZSBpbmZvIG9iamVjdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3R6aW5mb1xcblxcbiAgICAjIFN0YW5kYXJkIGNvbnZlcnNpb25zLCBfX2hhc2hfXyAoYW5kIGhlbHBlcnMpXFxuXFxuICAgICMgQ29tcGFyaXNvbnMgb2YgdGltZSBvYmplY3RzIHdpdGggb3RoZXIuXFxuXFxuICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSAhPSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuXFxuICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPD0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPCAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX2NtcChzZWxmLCBvdGhlcik6XFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdGhlciwgdGltZSlcXG4gICAgICAgIG15dHogPSBzZWxmLl90emluZm9cXG4gICAgICAgIG90dHogPSBvdGhlci5fdHppbmZvXFxuICAgICAgICBteW9mZiA9IG90b2ZmID0gTm9uZVxcblxcbiAgICAgICAgaWYgbXl0eiBpcyBvdHR6OlxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbXlvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIG90b2ZmID0gb3RoZXIuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgYmFzZV9jb21wYXJlID0gbXlvZmYgPT0gb3RvZmZcXG5cXG4gICAgICAgIGlmIGJhc2VfY29tcGFyZTpcXG4gICAgICAgICAgICByZXR1cm4gX2NtcCgoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIuX2hvdXIsIG90aGVyLl9taW51dGUsIG90aGVyLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLl9taWNyb3NlY29uZCkpXFxuICAgICAgICBpZiBteW9mZiBpcyBOb25lIG9yIG90b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBjb21wYXJlIG9mZnNldC1uYWl2ZSBhbmQgb2Zmc2V0LWF3YXJlIHRpbWVzXFxcIilcXG4gICAgICAgIG15aGhtbSA9IHNlbGYuX2hvdXIgKiA2MCArIHNlbGYuX21pbnV0ZSAtIG15b2ZmXFxuICAgICAgICBvdGhobW0gPSBvdGhlci5faG91ciAqIDYwICsgb3RoZXIuX21pbnV0ZSAtIG90b2ZmXFxuICAgICAgICByZXR1cm4gX2NtcCgobXloaG1tLCBzZWxmLl9zZWNvbmQsIHNlbGYuX21pY3Jvc2Vjb25kKSxcXG4gICAgICAgICAgICAgICAgICAgIChvdGhobW0sIG90aGVyLl9zZWNvbmQsIG90aGVyLl9taWNyb3NlY29uZCkpXFxuXFxuICAgIGRlZiBfX2hhc2hfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkhhc2guXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICB0em9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgaWYgbm90IHR6b2ZmOiAgIyB6ZXJvIG9yIE5vbmVcXG4gICAgICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKHNlbGYuX2dldHN0YXRlKClbMF0pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaCwgbSA9IGRpdm1vZChzZWxmLmhvdXIgKiA2MCArIHNlbGYubWludXRlIC0gdHpvZmYsIDYwKVxcbiAgICAgICAgICAgICAgICBpZiAwIDw9IGggPCAyNDpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaCh0aW1lKGgsIG0sIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKSlcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaCgoaCwgbSwgc2VsZi5zZWNvbmQsIHNlbGYubWljcm9zZWNvbmQpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuICAgICMgQ29udmVyc2lvbiB0byBzdHJpbmdcXG5cXG4gICAgZGVmIF90enN0cihzZWxmLCBzZXA9XFxcIjpcXFwiKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBmb3JtYXR0ZWQgdGltZXpvbmUgb2Zmc2V0ICgreHg6eHgpIG9yIE5vbmUuXFxcIlxcXCJcXFwiXFxuICAgICAgICBvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgb2ZmIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGlmIG9mZiA8IDA6XFxuICAgICAgICAgICAgICAgIHNpZ24gPSBcXFwiLVxcXCJcXG4gICAgICAgICAgICAgICAgb2ZmID0gLW9mZlxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNpZ24gPSBcXFwiK1xcXCJcXG4gICAgICAgICAgICBoaCwgbW0gPSBkaXZtb2Qob2ZmLCA2MClcXG4gICAgICAgICAgICBhc3NlcnQgMCA8PSBoaCA8IDI0XFxuICAgICAgICAgICAgb2ZmID0gXFxcIiVzJTAyZCVzJTAyZFxcXCIgJSAoc2lnbiwgaGgsIHNlcCwgbW0pXFxuICAgICAgICByZXR1cm4gb2ZmXFxuXFxuICAgIGRlZiBfX3JlcHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnZlcnQgdG8gZm9ybWFsIHN0cmluZywgZm9yIHJlcHIoKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX21pY3Jvc2Vjb25kICE9IDA6XFxuICAgICAgICAgICAgcyA9IFxcXCIsICVkLCAlZFxcXCIgJSAoc2VsZi5fc2Vjb25kLCBzZWxmLl9taWNyb3NlY29uZClcXG4gICAgICAgIGVsaWYgc2VsZi5fc2Vjb25kICE9IDA6XFxuICAgICAgICAgICAgcyA9IFxcXCIsICVkXFxcIiAlIHNlbGYuX3NlY29uZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzID0gXFxcIlxcXCJcXG4gICAgICAgIG1vZHVsZSA9IFxcXCJkYXRldGltZS5cXFwiIGlmIHNlbGYuX19jbGFzc19fIGlzIHRpbWUgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgcz0gXFxcIiVzKCVkLCAlZCVzKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHMpXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgYXNzZXJ0IHNbLTE6XSA9PSBcXFwiKVxcXCJcXG4gICAgICAgICAgICBzID0gc1s6LTFdICsgXFxcIiwgdHppbmZvPSVyXFxcIiAlIHNlbGYuX3R6aW5mbyArIFxcXCIpXFxcIlxcbiAgICAgICAgcmV0dXJuIHNcXG5cXG4gICAgZGVmIGlzb2Zvcm1hdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIElTTy5cXG5cXG4gICAgICAgIFRoaXMgaXMgJ0hIOk1NOlNTLm1tbW1tbSt6ejp6eicsIG9yICdISDpNTTpTUyt6ejp6eicgaWZcXG4gICAgICAgIHNlbGYubWljcm9zZWNvbmQgPT0gMC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcyA9IF9mb3JtYXRfdGltZShzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpXFxuICAgICAgICB0eiA9IHNlbGYuX3R6c3RyKClcXG4gICAgICAgIGlmIHR6OlxcbiAgICAgICAgICAgIHMgKz0gdHpcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIF9fc3RyX18gPSBpc29mb3JtYXRcXG5cXG4gICAgZGVmIHN0cmZ0aW1lKHNlbGYsIGZvcm1hdCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGb3JtYXQgdXNpbmcgc3RyZnRpbWUoKS4gIFRoZSBkYXRlIHBhcnQgb2YgdGhlIHRpbWVzdGFtcCBwYXNzZWRcXG4gICAgICAgIHRvIHVuZGVybHlpbmcgc3RyZnRpbWUgc2hvdWxkIG5vdCBiZSB1c2VkLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIFRoZSB5ZWFyIG11c3QgYmUgPj0gX01JTllFQVJGTVQgZWxzZSBQeXRob24ncyBzdHJmdGltZSBpbXBsZW1lbnRhdGlvblxcbiAgICAgICAgIyBjYW4gcmFpc2UgYSBib2d1cyBleGNlcHRpb24uXFxuICAgICAgICB0aW1ldHVwbGUgPSAoMTkwMCwgMSwgMSxcXG4gICAgICAgICAgICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAwLCAxLCAtMSlcXG4gICAgICAgIHJldHVybiBfd3JhcF9zdHJmdGltZShzZWxmLCBmb3JtYXQsIHRpbWV0dXBsZSlcXG5cXG4gICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm10KTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZtdCwgKHN0ciwgdW5pY29kZSkpOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIl9fZm9ybWF0X18gZXhwZWN0cyBzdHIgb3IgdW5pY29kZSwgbm90ICVzXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuX19jbGFzc19fLl9fbmFtZV9fKVxcbiAgICAgICAgaWYgbGVuKGZtdCkgIT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zdHJmdGltZShmbXQpXFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYpXFxuXFxuICAgICMgVGltZXpvbmUgZnVuY3Rpb25zXFxuXFxuICAgIGRlZiB1dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWV6b25lIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDIChuZWdhdGl2ZSB3ZXN0IG9mXFxuICAgICAgICBVVEMpLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby51dGNvZmZzZXQoTm9uZSlcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJ1dGNvZmZzZXRcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX3V0Y29mZnNldChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICBkZWYgdHpuYW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBuYW1lLlxcblxcbiAgICAgICAgTm90ZSB0aGF0IHRoZSBuYW1lIGlzIDEwMCUgaW5mb3JtYXRpb25hbCAtLSB0aGVyZSdzIG5vIHJlcXVpcmVtZW50IHRoYXRcXG4gICAgICAgIGl0IG1lYW4gYW55dGhpbmcgaW4gcGFydGljdWxhci4gRm9yIGV4YW1wbGUsIFxcXCJHTVRcXFwiLCBcXFwiVVRDXFxcIiwgXFxcIi01MDBcXFwiLFxcbiAgICAgICAgXFxcIi01OjAwXFxcIiwgXFxcIkVEVFxcXCIsIFxcXCJVUy9FYXN0ZXJuXFxcIiwgXFxcIkFtZXJpY2EvTmV3IFlvcmtcXFwiIGFyZSBhbGwgdmFsaWQgcmVwbGllcy5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG5hbWUgPSBzZWxmLl90emluZm8udHpuYW1lKE5vbmUpXFxuICAgICAgICBfY2hlY2tfdHpuYW1lKG5hbWUpXFxuICAgICAgICByZXR1cm4gbmFtZVxcblxcbiAgICBkZWYgZHN0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIDAgaWYgRFNUIGlzIG5vdCBpbiBlZmZlY3QsIG9yIHRoZSBEU1Qgb2Zmc2V0IChpbiBtaW51dGVzXFxuICAgICAgICBlYXN0d2FyZCkgaWYgRFNUIGlzIGluIGVmZmVjdC5cXG5cXG4gICAgICAgIFRoaXMgaXMgcHVyZWx5IGluZm9ybWF0aW9uYWw7IHRoZSBEU1Qgb2Zmc2V0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG9cXG4gICAgICAgIHRoZSBVVEMgb2Zmc2V0IHJldHVybmVkIGJ5IHV0Y29mZnNldCgpIGlmIGFwcGxpY2FibGUsIHNvIHRoZXJlJ3Mgbm9cXG4gICAgICAgIG5lZWQgdG8gY29uc3VsdCBkc3QoKSB1bmxlc3MgeW91J3JlIGludGVyZXN0ZWQgaW4gZGlzcGxheWluZyB0aGUgRFNUXFxuICAgICAgICBpbmZvLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLmRzdChOb25lKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcImRzdFxcXCIsIG9mZnNldClcXG4gICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBvZmZzZXQgPSB0aW1lZGVsdGEuX2NyZWF0ZSgwLCBvZmZzZXQgKiA2MCwgMCwgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgIyBSZXR1cm4gYW4gaW50ZWdlciAob3IgTm9uZSkgaW5zdGVhZCBvZiBhIHRpbWVkZWx0YSAob3IgTm9uZSkuXFxuICAgIGRlZiBfZHN0KHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3QoTm9uZSlcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgIGRlZiByZXBsYWNlKHNlbGYsIGhvdXI9Tm9uZSwgbWludXRlPU5vbmUsIHNlY29uZD1Ob25lLCBtaWNyb3NlY29uZD1Ob25lLFxcbiAgICAgICAgICAgICAgICB0emluZm89VHJ1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gYSBuZXcgdGltZSB3aXRoIG5ldyB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGRzLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaG91ciBpcyBOb25lOlxcbiAgICAgICAgICAgIGhvdXIgPSBzZWxmLmhvdXJcXG4gICAgICAgIGlmIG1pbnV0ZSBpcyBOb25lOlxcbiAgICAgICAgICAgIG1pbnV0ZSA9IHNlbGYubWludXRlXFxuICAgICAgICBpZiBzZWNvbmQgaXMgTm9uZTpcXG4gICAgICAgICAgICBzZWNvbmQgPSBzZWxmLnNlY29uZFxcbiAgICAgICAgaWYgbWljcm9zZWNvbmQgaXMgTm9uZTpcXG4gICAgICAgICAgICBtaWNyb3NlY29uZCA9IHNlbGYubWljcm9zZWNvbmRcXG4gICAgICAgIGlmIHR6aW5mbyBpcyBUcnVlOlxcbiAgICAgICAgICAgIHR6aW5mbyA9IHNlbGYudHppbmZvXFxuICAgICAgICByZXR1cm4gdGltZShob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsIHR6aW5mbylcXG5cXG4gICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5zZWNvbmQgb3Igc2VsZi5taWNyb3NlY29uZDpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdXRjb2Zmc2V0KCkgb3IgMFxcbiAgICAgICAgcmV0dXJuIHNlbGYuaG91ciAqIDYwICsgc2VsZi5taW51dGUgIT0gb2Zmc2V0XFxuXFxuX3RpbWVfY2xhc3MgPSB0aW1lICAjIHNvIGZ1bmN0aW9ucyB3LyBhcmdzIG5hbWVkIFxcXCJ0aW1lXFxcIiBjYW4gZ2V0IGF0IHRoZSBjbGFzc1xcblxcbnRpbWUubWluID0gdGltZSgwLCAwLCAwKVxcbnRpbWUubWF4ID0gdGltZSgyMywgNTksIDU5LCA5OTk5OTkpXFxudGltZS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKVxcblxcbmNsYXNzIGRhdGV0aW1lKGRhdGUpOlxcbiAgICBcXFwiXFxcIlxcXCJkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5WywgaG91clssIG1pbnV0ZVssIHNlY29uZFssIG1pY3Jvc2Vjb25kWyx0emluZm9dXV1dXSlcXG5cXG4gICAgVGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgYXJndW1lbnRzIGFyZSByZXF1aXJlZC4gdHppbmZvIG1heSBiZSBOb25lLCBvciBhblxcbiAgICBpbnN0YW5jZSBvZiBhIHR6aW5mbyBzdWJjbGFzcy4gVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgbWF5IGJlIGludHMgb3IgbG9uZ3MuXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSBkYXRlLl9fc2xvdHNfXyArIHRpbWUuX19zbG90c19fXFxuXFxuICAgIGRlZiBfX25ld19fKGNscywgeWVhciwgbW9udGg9Tm9uZSwgZGF5PU5vbmUsIGhvdXI9MCwgbWludXRlPTAsIHNlY29uZD0wLFxcbiAgICAgICAgICAgICAgICBtaWNyb3NlY29uZD0wLCB0emluZm89Tm9uZSk6XFxuICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gX2NoZWNrX2RhdGVfZmllbGRzKHllYXIsIG1vbnRoLCBkYXkpXFxuICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQgPSBfY2hlY2tfdGltZV9maWVsZHMoXFxuICAgICAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kKVxcbiAgICAgICAgX2NoZWNrX3R6aW5mb19hcmcodHppbmZvKVxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX3llYXIgPSB5ZWFyXFxuICAgICAgICBzZWxmLl9tb250aCA9IG1vbnRoXFxuICAgICAgICBzZWxmLl9kYXkgPSBkYXlcXG4gICAgICAgIHNlbGYuX2hvdXIgPSBob3VyXFxuICAgICAgICBzZWxmLl9taW51dGUgPSBtaW51dGVcXG4gICAgICAgIHNlbGYuX3NlY29uZCA9IHNlY29uZFxcbiAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgPSBtaWNyb3NlY29uZFxcbiAgICAgICAgc2VsZi5fdHppbmZvID0gdHppbmZvXFxuICAgICAgICBzZWxmLl9oYXNoY29kZSA9IC0xXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICAjIFJlYWQtb25seSBmaWVsZCBhY2Nlc3NvcnNcXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBob3VyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiaG91ciAoMC0yMylcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9ob3VyXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWludXRlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWludXRlICgwLTU5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21pbnV0ZVxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHNlY29uZChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcInNlY29uZCAoMC01OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zZWNvbmRcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtaWNyb3NlY29uZChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1pY3Jvc2Vjb25kICgwLTk5OTk5OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9taWNyb3NlY29uZFxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHR6aW5mbyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcInRpbWV6b25lIGluZm8gb2JqZWN0XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fdHppbmZvXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgZnJvbXRpbWVzdGFtcChjbHMsIHRpbWVzdGFtcCwgdHo9Tm9uZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb25zdHJ1Y3QgYSBkYXRldGltZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS5cXG5cXG4gICAgICAgIEEgdGltZXpvbmUgaW5mbyBvYmplY3QgbWF5IGJlIHBhc3NlZCBpbiBhcyB3ZWxsLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY2hlY2tfdHppbmZvX2FyZyh0eilcXG4gICAgICAgIGNvbnZlcnRlciA9IF90aW1lLmxvY2FsdGltZSBpZiB0eiBpcyBOb25lIGVsc2UgX3RpbWUuZ210aW1lXFxuICAgICAgICBzZWxmID0gY2xzLl9mcm9tX3RpbWVzdGFtcChjb252ZXJ0ZXIsIHRpbWVzdGFtcCwgdHopXFxuICAgICAgICBpZiB0eiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBzZWxmID0gdHouZnJvbXV0YyhzZWxmKVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiB1dGNmcm9tdGltZXN0YW1wKGNscywgdCk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgVVRDIGRhdGV0aW1lIGZyb20gYSBQT1NJWCB0aW1lc3RhbXAgKGxpa2UgdGltZS50aW1lKCkpLlxcXCJcXG4gICAgICAgIHJldHVybiBjbHMuX2Zyb21fdGltZXN0YW1wKF90aW1lLmdtdGltZSwgdCwgTm9uZSlcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBfZnJvbV90aW1lc3RhbXAoY2xzLCBjb252ZXJ0ZXIsIHRpbWVzdGFtcCwgdHppbmZvKTpcXG4gICAgICAgIHRfZnVsbCA9IHRpbWVzdGFtcFxcbiAgICAgICAgdGltZXN0YW1wID0gaW50KF9tYXRoLmZsb29yKHRpbWVzdGFtcCkpXFxuICAgICAgICBmcmFjID0gdF9mdWxsIC0gdGltZXN0YW1wXFxuICAgICAgICB1cyA9IF9yb3VuZChmcmFjICogMWU2KVxcblxcbiAgICAgICAgIyBJZiB0aW1lc3RhbXAgaXMgbGVzcyB0aGFuIG9uZSBtaWNyb3NlY29uZCBzbWFsbGVyIHRoYW4gYVxcbiAgICAgICAgIyBmdWxsIHNlY29uZCwgdXMgY2FuIGJlIHJvdW5kZWQgdXAgdG8gMTAwMDAwMC4gIEluIHRoaXMgY2FzZSxcXG4gICAgICAgICMgcm9sbCBvdmVyIHRvIHNlY29uZHMsIG90aGVyd2lzZSwgVmFsdWVFcnJvciBpcyByYWlzZWRcXG4gICAgICAgICMgYnkgdGhlIGNvbnN0cnVjdG9yLlxcbiAgICAgICAgaWYgdXMgPT0gMTAwMDAwMDpcXG4gICAgICAgICAgICB0aW1lc3RhbXAgKz0gMVxcbiAgICAgICAgICAgIHVzID0gMFxcbiAgICAgICAgeSwgbSwgZCwgaGgsIG1tLCBzcywgd2Vla2RheSwgamRheSwgZHN0ID0gY29udmVydGVyKHRpbWVzdGFtcClcXG4gICAgICAgIHNzID0gbWluKHNzLCA1OSkgICAgIyBjbGFtcCBvdXQgbGVhcCBzZWNvbmRzIGlmIHRoZSBwbGF0Zm9ybSBoYXMgdGhlbVxcbiAgICAgICAgcmV0dXJuIGNscyh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvKVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIG5vdyhjbHMsIHR6PU5vbmUpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGV0aW1lIGZyb20gdGltZS50aW1lKCkgYW5kIG9wdGlvbmFsIHRpbWUgem9uZSBpbmZvLlxcXCJcXG4gICAgICAgIHQgPSBfdGltZS50aW1lKClcXG4gICAgICAgIHJldHVybiBjbHMuZnJvbXRpbWVzdGFtcCh0LCB0eilcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiB1dGNub3coY2xzKTpcXG4gICAgICAgIFxcXCJDb25zdHJ1Y3QgYSBVVEMgZGF0ZXRpbWUgZnJvbSB0aW1lLnRpbWUoKS5cXFwiXFxuICAgICAgICB0ID0gX3RpbWUudGltZSgpXFxuICAgICAgICByZXR1cm4gY2xzLnV0Y2Zyb210aW1lc3RhbXAodClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBjb21iaW5lKGNscywgZGF0ZSwgdGltZSk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgZGF0ZXRpbWUgZnJvbSBhIGdpdmVuIGRhdGUgYW5kIGEgZ2l2ZW4gdGltZS5cXFwiXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRlLCBfZGF0ZV9jbGFzcyk6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJkYXRlIGFyZ3VtZW50IG11c3QgYmUgYSBkYXRlIGluc3RhbmNlXFxcIilcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRpbWUsIF90aW1lX2NsYXNzKTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcInRpbWUgYXJndW1lbnQgbXVzdCBiZSBhIHRpbWUgaW5zdGFuY2VcXFwiKVxcbiAgICAgICAgcmV0dXJuIGNscyhkYXRlLnllYXIsIGRhdGUubW9udGgsIGRhdGUuZGF5LFxcbiAgICAgICAgICAgICAgICAgICB0aW1lLmhvdXIsIHRpbWUubWludXRlLCB0aW1lLnNlY29uZCwgdGltZS5taWNyb3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgdGltZS50emluZm8pXFxuXFxuICAgIGRlZiB0aW1ldHVwbGUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGxvY2FsIHRpbWUgdHVwbGUgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuXFxcIlxcbiAgICAgICAgZHN0ID0gc2VsZi5fZHN0KClcXG4gICAgICAgIGlmIGRzdCBpcyBOb25lOlxcbiAgICAgICAgICAgIGRzdCA9IC0xXFxuICAgICAgICBlbGlmIGRzdDpcXG4gICAgICAgICAgICBkc3QgPSAxXFxuICAgICAgICByZXR1cm4gX2J1aWxkX3N0cnVjdF90aW1lKHNlbGYueWVhciwgc2VsZi5tb250aCwgc2VsZi5kYXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QpXFxuXFxuICAgIGRlZiB1dGN0aW1ldHVwbGUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIFVUQyB0aW1lIHR1cGxlIGNvbXBhdGlibGUgd2l0aCB0aW1lLmdtdGltZSgpLlxcXCJcXG4gICAgICAgIHksIG0sIGQgPSBzZWxmLnllYXIsIHNlbGYubW9udGgsIHNlbGYuZGF5XFxuICAgICAgICBoaCwgbW0sIHNzID0gc2VsZi5ob3VyLCBzZWxmLm1pbnV0ZSwgc2VsZi5zZWNvbmRcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICBpZiBvZmZzZXQ6ICAjIG5laXRoZXIgTm9uZSBub3IgMFxcbiAgICAgICAgICAgIG1tIC09IG9mZnNldFxcbiAgICAgICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MsIF8gPSBfbm9ybWFsaXplX2RhdGV0aW1lKFxcbiAgICAgICAgICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCAwLCBpZ25vcmVfb3ZlcmZsb3c9VHJ1ZSlcXG4gICAgICAgIHJldHVybiBfYnVpbGRfc3RydWN0X3RpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgMClcXG5cXG4gICAgZGVmIGRhdGUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIHRoZSBkYXRlIHBhcnQuXFxcIlxcbiAgICAgICAgcmV0dXJuIGRhdGUoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG5cXG4gICAgZGVmIHRpbWUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIHRoZSB0aW1lIHBhcnQsIHdpdGggdHppbmZvIE5vbmUuXFxcIlxcbiAgICAgICAgcmV0dXJuIHRpbWUoc2VsZi5ob3VyLCBzZWxmLm1pbnV0ZSwgc2VsZi5zZWNvbmQsIHNlbGYubWljcm9zZWNvbmQpXFxuXFxuICAgIGRlZiB0aW1ldHooc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIHRoZSB0aW1lIHBhcnQsIHdpdGggc2FtZSB0emluZm8uXFxcIlxcbiAgICAgICAgcmV0dXJuIHRpbWUoc2VsZi5ob3VyLCBzZWxmLm1pbnV0ZSwgc2VsZi5zZWNvbmQsIHNlbGYubWljcm9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl90emluZm8pXFxuXFxuICAgIGRlZiByZXBsYWNlKHNlbGYsIHllYXI9Tm9uZSwgbW9udGg9Tm9uZSwgZGF5PU5vbmUsIGhvdXI9Tm9uZSxcXG4gICAgICAgICAgICAgICAgbWludXRlPU5vbmUsIHNlY29uZD1Ob25lLCBtaWNyb3NlY29uZD1Ob25lLCB0emluZm89VHJ1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gYSBuZXcgZGF0ZXRpbWUgd2l0aCBuZXcgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkcy5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHllYXIgaXMgTm9uZTpcXG4gICAgICAgICAgICB5ZWFyID0gc2VsZi55ZWFyXFxuICAgICAgICBpZiBtb250aCBpcyBOb25lOlxcbiAgICAgICAgICAgIG1vbnRoID0gc2VsZi5tb250aFxcbiAgICAgICAgaWYgZGF5IGlzIE5vbmU6XFxuICAgICAgICAgICAgZGF5ID0gc2VsZi5kYXlcXG4gICAgICAgIGlmIGhvdXIgaXMgTm9uZTpcXG4gICAgICAgICAgICBob3VyID0gc2VsZi5ob3VyXFxuICAgICAgICBpZiBtaW51dGUgaXMgTm9uZTpcXG4gICAgICAgICAgICBtaW51dGUgPSBzZWxmLm1pbnV0ZVxcbiAgICAgICAgaWYgc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgc2Vjb25kID0gc2VsZi5zZWNvbmRcXG4gICAgICAgIGlmIG1pY3Jvc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWljcm9zZWNvbmQgPSBzZWxmLm1pY3Jvc2Vjb25kXFxuICAgICAgICBpZiB0emluZm8gaXMgVHJ1ZTpcXG4gICAgICAgICAgICB0emluZm8gPSBzZWxmLnR6aW5mb1xcbiAgICAgICAgcmV0dXJuIGRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pXFxuXFxuICAgIGRlZiBhc3RpbWV6b25lKHNlbGYsIHR6KTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHR6LCB0emluZm8pOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwidHogYXJndW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB0emluZm9cXFwiKVxcblxcbiAgICAgICAgbXl0eiA9IHNlbGYudHppbmZvXFxuICAgICAgICBpZiBteXR6IGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiYXN0aW1lem9uZSgpIHJlcXVpcmVzIGFuIGF3YXJlIGRhdGV0aW1lXFxcIilcXG5cXG4gICAgICAgIGlmIHR6IGlzIG15dHo6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgICAgICMgQ29udmVydCBzZWxmIHRvIFVUQywgYW5kIGF0dGFjaCB0aGUgbmV3IHRpbWUgem9uZSBvYmplY3QuXFxuICAgICAgICBteW9mZnNldCA9IHNlbGYudXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG15b2Zmc2V0IGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiYXN0aW1lem9uZSgpIHJlcXVpcmVzIGFuIGF3YXJlIGRhdGV0aW1lXFxcIilcXG4gICAgICAgIHV0YyA9IChzZWxmIC0gbXlvZmZzZXQpLnJlcGxhY2UodHppbmZvPXR6KVxcblxcbiAgICAgICAgIyBDb252ZXJ0IGZyb20gVVRDIHRvIHR6J3MgbG9jYWwgdGltZS5cXG4gICAgICAgIHJldHVybiB0ei5mcm9tdXRjKHV0YylcXG5cXG4gICAgIyBXYXlzIHRvIHByb2R1Y2UgYSBzdHJpbmcuXFxuXFxuICAgIGRlZiBjdGltZShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gY3RpbWUoKSBzdHlsZSBzdHJpbmcuXFxcIlxcbiAgICAgICAgd2Vla2RheSA9IHNlbGYudG9vcmRpbmFsKCkgJSA3IG9yIDdcXG4gICAgICAgIHJldHVybiBcXFwiJXMgJXMgJTJkICUwMmQ6JTAyZDolMDJkICUwNGRcXFwiICUgKFxcbiAgICAgICAgICAgIF9EQVlOQU1FU1t3ZWVrZGF5XSxcXG4gICAgICAgICAgICBfTU9OVEhOQU1FU1tzZWxmLl9tb250aF0sXFxuICAgICAgICAgICAgc2VsZi5fZGF5LFxcbiAgICAgICAgICAgIHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgIHNlbGYuX3llYXIpXFxuXFxuICAgIGRlZiBpc29mb3JtYXQoc2VsZiwgc2VwPSdUJyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uXFxuXFxuICAgICAgICBUaGlzIGlzICdZWVlZLU1NLUREIEhIOk1NOlNTLm1tbW1tbScsIG9yICdZWVlZLU1NLUREIEhIOk1NOlNTJyBpZlxcbiAgICAgICAgc2VsZi5taWNyb3NlY29uZCA9PSAwLlxcblxcbiAgICAgICAgSWYgc2VsZi50emluZm8gaXMgbm90IE5vbmUsIHRoZSBVVEMgb2Zmc2V0IGlzIGFsc28gYXR0YWNoZWQsIGdpdmluZ1xcbiAgICAgICAgJ1lZWVktTU0tREQgSEg6TU06U1MubW1tbW1tK0hIOk1NJyBvciAnWVlZWS1NTS1ERCBISDpNTTpTUytISDpNTScuXFxuXFxuICAgICAgICBPcHRpb25hbCBhcmd1bWVudCBzZXAgc3BlY2lmaWVzIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiBkYXRlIGFuZFxcbiAgICAgICAgdGltZSwgZGVmYXVsdCAnVCcuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHMgPSAoXFxcIiUwNGQtJTAyZC0lMDJkJWNcXFwiICUgKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXksIHNlcCkgK1xcbiAgICAgICAgICAgICBfZm9ybWF0X3RpbWUoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCkpXFxuICAgICAgICBvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgb2ZmIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGlmIG9mZiA8IDA6XFxuICAgICAgICAgICAgICAgIHNpZ24gPSBcXFwiLVxcXCJcXG4gICAgICAgICAgICAgICAgb2ZmID0gLW9mZlxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNpZ24gPSBcXFwiK1xcXCJcXG4gICAgICAgICAgICBoaCwgbW0gPSBkaXZtb2Qob2ZmLCA2MClcXG4gICAgICAgICAgICBzICs9IFxcXCIlcyUwMmQ6JTAyZFxcXCIgJSAoc2lnbiwgaGgsIG1tKVxcbiAgICAgICAgcmV0dXJuIHNcXG5cXG4gICAgZGVmIF9fcmVwcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29udmVydCB0byBmb3JtYWwgc3RyaW5nLCBmb3IgcmVwcigpLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgTCA9IFtzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LCAgIyBUaGVzZSBhcmUgbmV2ZXIgemVyb1xcbiAgICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwgc2VsZi5fbWljcm9zZWNvbmRdXFxuICAgICAgICBpZiBMWy0xXSA9PSAwOlxcbiAgICAgICAgICAgIGRlbCBMWy0xXVxcbiAgICAgICAgaWYgTFstMV0gPT0gMDpcXG4gICAgICAgICAgICBkZWwgTFstMV1cXG4gICAgICAgIHMgPSBcXFwiLCBcXFwiLmpvaW4obWFwKHN0ciwgTCkpXFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyBkYXRldGltZSBlbHNlIFxcXCJcXFwiXFxuICAgICAgICBzID0gXFxcIiVzKCVzKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHMpXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgYXNzZXJ0IHNbLTE6XSA9PSBcXFwiKVxcXCJcXG4gICAgICAgICAgICBzID0gc1s6LTFdICsgXFxcIiwgdHppbmZvPSVyXFxcIiAlIHNlbGYuX3R6aW5mbyArIFxcXCIpXFxcIlxcbiAgICAgICAgcmV0dXJuIHNcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBcXFwiQ29udmVydCB0byBzdHJpbmcsIGZvciBzdHIoKS5cXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5pc29mb3JtYXQoc2VwPScgJylcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBzdHJwdGltZShjbHMsIGRhdGVfc3RyaW5nLCBmb3JtYXQpOlxcbiAgICAgICAgJ3N0cmluZywgZm9ybWF0IC0+IG5ldyBkYXRldGltZSBwYXJzZWQgZnJvbSBhIHN0cmluZyAobGlrZSB0aW1lLnN0cnB0aW1lKCkpLidcXG4gICAgICAgIGZyb20gX3N0cnB0aW1lIGltcG9ydCBfc3RycHRpbWVcXG4gICAgICAgICMgX3N0cnB0aW1lLl9zdHJwdGltZSByZXR1cm5zIGEgdHdvLWVsZW1lbnQgdHVwbGUuICBUaGUgZmlyc3RcXG4gICAgICAgICMgZWxlbWVudCBpcyBhIHRpbWUuc3RydWN0X3RpbWUgb2JqZWN0LiAgVGhlIHNlY29uZCBpcyB0aGVcXG4gICAgICAgICMgbWljcm9zZWNvbmRzICh3aGljaCBhcmUgbm90IGRlZmluZWQgZm9yIHRpbWUuc3RydWN0X3RpbWUpLlxcbiAgICAgICAgc3RydWN0LCBtaWNyb3MgPSBfc3RycHRpbWUoZGF0ZV9zdHJpbmcsIGZvcm1hdClcXG4gICAgICAgIHJldHVybiBjbHMoKihzdHJ1Y3RbMDo2XSArIChtaWNyb3MsKSkpXFxuXFxuICAgIGRlZiB1dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWV6b25lIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDIChuZWdhdGl2ZSB3ZXN0IG9mXFxuICAgICAgICBVVEMpLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby51dGNvZmZzZXQoc2VsZilcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJ1dGNvZmZzZXRcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX3V0Y29mZnNldChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICBkZWYgdHpuYW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBuYW1lLlxcblxcbiAgICAgICAgTm90ZSB0aGF0IHRoZSBuYW1lIGlzIDEwMCUgaW5mb3JtYXRpb25hbCAtLSB0aGVyZSdzIG5vIHJlcXVpcmVtZW50IHRoYXRcXG4gICAgICAgIGl0IG1lYW4gYW55dGhpbmcgaW4gcGFydGljdWxhci4gRm9yIGV4YW1wbGUsIFxcXCJHTVRcXFwiLCBcXFwiVVRDXFxcIiwgXFxcIi01MDBcXFwiLFxcbiAgICAgICAgXFxcIi01OjAwXFxcIiwgXFxcIkVEVFxcXCIsIFxcXCJVUy9FYXN0ZXJuXFxcIiwgXFxcIkFtZXJpY2EvTmV3IFlvcmtcXFwiIGFyZSBhbGwgdmFsaWQgcmVwbGllcy5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG5hbWUgPSBzZWxmLl90emluZm8udHpuYW1lKHNlbGYpXFxuICAgICAgICBfY2hlY2tfdHpuYW1lKG5hbWUpXFxuICAgICAgICByZXR1cm4gbmFtZVxcblxcbiAgICBkZWYgZHN0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIDAgaWYgRFNUIGlzIG5vdCBpbiBlZmZlY3QsIG9yIHRoZSBEU1Qgb2Zmc2V0IChpbiBtaW51dGVzXFxuICAgICAgICBlYXN0d2FyZCkgaWYgRFNUIGlzIGluIGVmZmVjdC5cXG5cXG4gICAgICAgIFRoaXMgaXMgcHVyZWx5IGluZm9ybWF0aW9uYWw7IHRoZSBEU1Qgb2Zmc2V0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG9cXG4gICAgICAgIHRoZSBVVEMgb2Zmc2V0IHJldHVybmVkIGJ5IHV0Y29mZnNldCgpIGlmIGFwcGxpY2FibGUsIHNvIHRoZXJlJ3Mgbm9cXG4gICAgICAgIG5lZWQgdG8gY29uc3VsdCBkc3QoKSB1bmxlc3MgeW91J3JlIGludGVyZXN0ZWQgaW4gZGlzcGxheWluZyB0aGUgRFNUXFxuICAgICAgICBpbmZvLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLmRzdChzZWxmKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcImRzdFxcXCIsIG9mZnNldClcXG4gICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBvZmZzZXQgPSB0aW1lZGVsdGEuX2NyZWF0ZSgwLCBvZmZzZXQgKiA2MCwgMCwgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgIyBSZXR1cm4gYW4gaW50ZWdlciAob3IgTm9uZSkgaW5zdGVhZCBvZiBhIHRpbWVkZWx0YSAob3IgTm9uZSkuXFxuICAgIGRlZiBfZHN0KHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3Qoc2VsZilcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgQ29tcGFyaXNvbnMgb2YgZGF0ZXRpbWUgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA9PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG5cXG4gICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPD0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lKVxcbiAgICAgICAgbXl0eiA9IHNlbGYuX3R6aW5mb1xcbiAgICAgICAgb3R0eiA9IG90aGVyLl90emluZm9cXG4gICAgICAgIG15b2ZmID0gb3RvZmYgPSBOb25lXFxuXFxuICAgICAgICBpZiBteXR6IGlzIG90dHo6XFxuICAgICAgICAgICAgYmFzZV9jb21wYXJlID0gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBteXR6IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICBteW9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgaWYgb3R0eiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgb3RvZmYgPSBvdGhlci5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICBiYXNlX2NvbXBhcmUgPSBteW9mZiA9PSBvdG9mZlxcblxcbiAgICAgICAgaWYgYmFzZV9jb21wYXJlOlxcbiAgICAgICAgICAgIHJldHVybiBfY21wKChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlci5feWVhciwgb3RoZXIuX21vbnRoLCBvdGhlci5fZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5faG91ciwgb3RoZXIuX21pbnV0ZSwgb3RoZXIuX3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuX21pY3Jvc2Vjb25kKSlcXG4gICAgICAgIGlmIG15b2ZmIGlzIE5vbmUgb3Igb3RvZmYgaXMgTm9uZTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcImNhbid0IGNvbXBhcmUgb2Zmc2V0LW5haXZlIGFuZCBvZmZzZXQtYXdhcmUgZGF0ZXRpbWVzXFxcIilcXG4gICAgICAgICMgWFhYIFdoYXQgZm9sbG93cyBjb3VsZCBiZSBkb25lIG1vcmUgZWZmaWNpZW50bHkuLi5cXG4gICAgICAgIGRpZmYgPSBzZWxmIC0gb3RoZXIgICAgICMgdGhpcyB3aWxsIHRha2Ugb2Zmc2V0cyBpbnRvIGFjY291bnRcXG4gICAgICAgIGlmIGRpZmYuZGF5cyA8IDA6XFxuICAgICAgICAgICAgcmV0dXJuIC0xXFxuICAgICAgICByZXR1cm4gZGlmZiBhbmQgMSBvciAwXFxuXFxuICAgIGRlZiBfYWRkX3RpbWVkZWx0YShzZWxmLCBvdGhlciwgZmFjdG9yKTpcXG4gICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzID0gX25vcm1hbGl6ZV9kYXRldGltZShcXG4gICAgICAgICAgICBzZWxmLl95ZWFyLFxcbiAgICAgICAgICAgIHNlbGYuX21vbnRoLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSArIG90aGVyLmRheXMgKiBmYWN0b3IsXFxuICAgICAgICAgICAgc2VsZi5faG91cixcXG4gICAgICAgICAgICBzZWxmLl9taW51dGUsXFxuICAgICAgICAgICAgc2VsZi5fc2Vjb25kICsgb3RoZXIuc2Vjb25kcyAqIGZhY3RvcixcXG4gICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCArIG90aGVyLm1pY3Jvc2Vjb25kcyAqIGZhY3RvcilcXG4gICAgICAgIHJldHVybiBkYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvPXNlbGYuX3R6aW5mbylcXG5cXG4gICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIkFkZCBhIGRhdGV0aW1lIGFuZCBhIHRpbWVkZWx0YS5cXFwiXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAxKVxcblxcbiAgICBfX3JhZGRfXyA9IF9fYWRkX19cXG5cXG4gICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlN1YnRyYWN0IHR3byBkYXRldGltZXMsIG9yIGEgZGF0ZXRpbWUgYW5kIGEgdGltZWRlbHRhLlxcXCJcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZF90aW1lZGVsdGEob3RoZXIsIC0xKVxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICAgICAgZGVsdGFfZCA9IHNlbGYudG9vcmRpbmFsKCkgLSBvdGhlci50b29yZGluYWwoKVxcbiAgICAgICAgZGVsdGFfcyA9IChzZWxmLl9ob3VyIC0gb3RoZXIuX2hvdXIpICogMzYwMCArIFxcXFxcXG4gICAgICAgICAgICAgICAgICAoc2VsZi5fbWludXRlIC0gb3RoZXIuX21pbnV0ZSkgKiA2MCArIFxcXFxcXG4gICAgICAgICAgICAgICAgICAoc2VsZi5fc2Vjb25kIC0gb3RoZXIuX3NlY29uZClcXG4gICAgICAgIGRlbHRhX3VzID0gc2VsZi5fbWljcm9zZWNvbmQgLSBvdGhlci5fbWljcm9zZWNvbmRcXG4gICAgICAgIGJhc2UgPSB0aW1lZGVsdGEuX2NyZWF0ZShkZWx0YV9kLCBkZWx0YV9zLCBkZWx0YV91cywgVHJ1ZSlcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBvdGhlci5fdHppbmZvOlxcbiAgICAgICAgICAgIHJldHVybiBiYXNlXFxuICAgICAgICBteW9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICBvdG9mZiA9IG90aGVyLl91dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgbXlvZmYgPT0gb3RvZmY6XFxuICAgICAgICAgICAgcmV0dXJuIGJhc2VcXG4gICAgICAgIGlmIG15b2ZmIGlzIE5vbmUgb3Igb3RvZmYgaXMgTm9uZTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcImNhbid0IHN1YnRyYWN0IG9mZnNldC1uYWl2ZSBhbmQgb2Zmc2V0LWF3YXJlIGRhdGV0aW1lc1xcXCIpXFxuICAgICAgICByZXR1cm4gYmFzZSArIHRpbWVkZWx0YShtaW51dGVzID0gb3RvZmYtbXlvZmYpXFxuXFxuICAgIGRlZiBfX2hhc2hfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX2hhc2hjb2RlID09IC0xOlxcbiAgICAgICAgICAgIHR6b2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICBpZiB0em9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goc2VsZi5fZ2V0c3RhdGUoKVswXSlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBkYXlzID0gX3ltZDJvcmQoc2VsZi55ZWFyLCBzZWxmLm1vbnRoLCBzZWxmLmRheSlcXG4gICAgICAgICAgICAgICAgc2Vjb25kcyA9IHNlbGYuaG91ciAqIDM2MDAgKyAoc2VsZi5taW51dGUgLSB0em9mZikgKiA2MCArIHNlbGYuc2Vjb25kXFxuICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaCh0aW1lZGVsdGEoZGF5cywgc2Vjb25kcywgc2VsZi5taWNyb3NlY29uZCkpXFxuICAgICAgICByZXR1cm4gc2VsZi5faGFzaGNvZGVcXG5cXG5cXG5cXG5kYXRldGltZS5taW4gPSBkYXRldGltZSgxLCAxLCAxKVxcbmRhdGV0aW1lLm1heCA9IGRhdGV0aW1lKDk5OTksIDEyLCAzMSwgMjMsIDU5LCA1OSwgOTk5OTk5KVxcbmRhdGV0aW1lLnJlc29sdXRpb24gPSB0aW1lZGVsdGEobWljcm9zZWNvbmRzPTEpXFxuXFxuXFxuZGVmIF9pc293ZWVrMW1vbmRheSh5ZWFyKTpcXG4gICAgIyBIZWxwZXIgdG8gY2FsY3VsYXRlIHRoZSBkYXkgbnVtYmVyIG9mIHRoZSBNb25kYXkgc3RhcnRpbmcgd2VlayAxXFxuICAgICMgWFhYIFRoaXMgY291bGQgYmUgZG9uZSBtb3JlIGVmZmljaWVudGx5XFxuICAgIFRIVVJTREFZID0gM1xcbiAgICBmaXJzdGRheSA9IF95bWQyb3JkKHllYXIsIDEsIDEpXFxuICAgIGZpcnN0d2Vla2RheSA9IChmaXJzdGRheSArIDYpICUgNyAgIyBTZWUgd2Vla2RheSgpIGFib3ZlXFxuICAgIHdlZWsxbW9uZGF5ID0gZmlyc3RkYXkgLSBmaXJzdHdlZWtkYXlcXG4gICAgaWYgZmlyc3R3ZWVrZGF5ID4gVEhVUlNEQVk6XFxuICAgICAgICB3ZWVrMW1vbmRheSArPSA3XFxuICAgIHJldHVybiB3ZWVrMW1vbmRheVxcblxcblxcXCJcXFwiXFxcIlxcblNvbWUgdGltZSB6b25lIGFsZ2VicmEuICBGb3IgYSBkYXRldGltZSB4LCBsZXRcXG4gICAgeC5uID0geCBzdHJpcHBlZCBvZiBpdHMgdGltZXpvbmUgLS0gaXRzIG5haXZlIHRpbWUuXFxuICAgIHgubyA9IHgudXRjb2Zmc2V0KCksIGFuZCBhc3N1bWluZyB0aGF0IGRvZXNuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIG9yXFxuICAgICAgICAgIHJldHVybiBOb25lXFxuICAgIHguZCA9IHguZHN0KCksIGFuZCBhc3N1bWluZyB0aGF0IGRvZXNuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIG9yXFxuICAgICAgICAgIHJldHVybiBOb25lXFxuICAgIHgucyA9IHgncyBzdGFuZGFyZCBvZmZzZXQsIHgubyAtIHguZFxcblxcbk5vdyBzb21lIGRlcml2ZWQgcnVsZXMsIHdoZXJlIGsgaXMgYSBkdXJhdGlvbiAodGltZWRlbHRhKS5cXG5cXG4xLiB4Lm8gPSB4LnMgKyB4LmRcXG4gICBUaGlzIGZvbGxvd3MgZnJvbSB0aGUgZGVmaW5pdGlvbiBvZiB4LnMuXFxuXFxuMi4gSWYgeCBhbmQgeSBoYXZlIHRoZSBzYW1lIHR6aW5mbyBtZW1iZXIsIHgucyA9IHkucy5cXG4gICBUaGlzIGlzIGFjdHVhbGx5IGEgcmVxdWlyZW1lbnQsIGFuIGFzc3VtcHRpb24gd2UgbmVlZCB0byBtYWtlIGFib3V0XFxuICAgc2FuZSB0emluZm8gY2xhc3Nlcy5cXG5cXG4zLiBUaGUgbmFpdmUgVVRDIHRpbWUgY29ycmVzcG9uZGluZyB0byB4IGlzIHgubiAtIHguby5cXG4gICBUaGlzIGlzIGFnYWluIGEgcmVxdWlyZW1lbnQgZm9yIGEgc2FuZSB0emluZm8gY2xhc3MuXFxuXFxuNC4gKHgraykucyA9IHguc1xcbiAgIFRoaXMgZm9sbG93cyBmcm9tICMyLCBhbmQgdGhhdCBkYXRpbWV0aW1ldHordGltZWRlbHRhIHByZXNlcnZlcyB0emluZm8uXFxuXFxuNS4gKHgraykubiA9IHgubiArIGtcXG4gICBBZ2FpbiBmb2xsb3dzIGZyb20gaG93IGFyaXRobWV0aWMgaXMgZGVmaW5lZC5cXG5cXG5Ob3cgd2UgY2FuIGV4cGxhaW4gdHouZnJvbXV0Yyh4KS4gIExldCdzIGFzc3VtZSBpdCdzIGFuIGludGVyZXN0aW5nIGNhc2VcXG4obWVhbmluZyB0aGF0IHRoZSB2YXJpb3VzIHR6aW5mbyBtZXRob2RzIGV4aXN0LCBhbmQgZG9uJ3QgYmxvdyB1cCBvciByZXR1cm5cXG5Ob25lIHdoZW4gY2FsbGVkKS5cXG5cXG5UaGUgZnVuY3Rpb24gd2FudHMgdG8gcmV0dXJuIGEgZGF0ZXRpbWUgeSB3aXRoIHRpbWV6b25lIHR6LCBlcXVpdmFsZW50IHRvIHguXFxueCBpcyBhbHJlYWR5IGluIFVUQy5cXG5cXG5CeSAjMywgd2Ugd2FudFxcblxcbiAgICB5Lm4gLSB5Lm8gPSB4Lm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXVxcblxcblRoZSBhbGdvcml0aG0gc3RhcnRzIGJ5IGF0dGFjaGluZyB0eiB0byB4Lm4sIGFuZCBjYWxsaW5nIHRoYXQgeS4gIFNvXFxueC5uID0geS5uIGF0IHRoZSBzdGFydC4gIFRoZW4gaXQgd2FudHMgdG8gYWRkIGEgZHVyYXRpb24gayB0byB5LCBzbyB0aGF0IFsxXVxcbmJlY29tZXMgdHJ1ZTsgaW4gZWZmZWN0LCB3ZSB3YW50IHRvIHNvbHZlIFsyXSBmb3IgazpcXG5cXG4gICAoeStrKS5uIC0gKHkraykubyA9IHgubiAgICAgICAgICAgICAgICAgICAgICBbMl1cXG5cXG5CeSAjMSwgdGhpcyBpcyB0aGUgc2FtZSBhc1xcblxcbiAgICh5K2spLm4gLSAoKHkraykucyArICh5K2spLmQpID0geC5uICAgICAgICAgIFszXVxcblxcbkJ5ICM1LCAoeStrKS5uID0geS5uICsgaywgd2hpY2ggZXF1YWxzIHgubiArIGsgYmVjYXVzZSB4Lm49eS5uIGF0IHRoZSBzdGFydC5cXG5TdWJzdGl0dXRpbmcgdGhhdCBpbnRvIFszXSxcXG5cXG4gICB4Lm4gKyBrIC0gKHkraykucyAtICh5K2spLmQgPSB4Lm47IHRoZSB4Lm4gdGVybXMgY2FuY2VsLCBsZWF2aW5nXFxuICAgayAtICh5K2spLnMgLSAoeStrKS5kID0gMDsgcmVhcnJhbmdpbmcsXFxuICAgayA9ICh5K2spLnMgLSAoeStrKS5kOyBieSAjNCwgKHkraykucyA9PSB5LnMsIHNvXFxuICAgayA9IHkucyAtICh5K2spLmRcXG5cXG5PbiB0aGUgUkhTLCAoeStrKS5kIGNhbid0IGJlIGNvbXB1dGVkIGRpcmVjdGx5LCBidXQgeS5zIGNhbiBiZSwgYW5kIHdlXFxuYXBwcm94aW1hdGUgayBieSBpZ25vcmluZyB0aGUgKHkraykuZCB0ZXJtIGF0IGZpcnN0LiAgTm90ZSB0aGF0IGsgY2FuJ3QgYmVcXG52ZXJ5IGxhcmdlLCBzaW5jZSBhbGwgb2Zmc2V0LXJldHVybmluZyBtZXRob2RzIHJldHVybiBhIGR1cmF0aW9uIG9mIG1hZ25pdHVkZVxcbmxlc3MgdGhhbiAyNCBob3Vycy4gIEZvciB0aGF0IHJlYXNvbiwgaWYgeSBpcyBmaXJtbHkgaW4gc3RkIHRpbWUsICh5K2spLmQgbXVzdFxcbmJlIDAsIHNvIGlnbm9yaW5nIGl0IGhhcyBubyBjb25zZXF1ZW5jZSB0aGVuLlxcblxcbkluIGFueSBjYXNlLCB0aGUgbmV3IHZhbHVlIGlzXFxuXFxuICAgIHogPSB5ICsgeS5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzRdXFxuXFxuSXQncyBoZWxwZnVsIHRvIHN0ZXAgYmFjayBhdCBsb29rIGF0IFs0XSBmcm9tIGEgaGlnaGVyIGxldmVsOiAgaXQncyBzaW1wbHlcXG5tYXBwaW5nIGZyb20gVVRDIHRvIHR6J3Mgc3RhbmRhcmQgdGltZS5cXG5cXG5BdCB0aGlzIHBvaW50LCBpZlxcblxcbiAgICB6Lm4gLSB6Lm8gPSB4Lm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs1XVxcblxcbndlIGhhdmUgYW4gZXF1aXZhbGVudCB0aW1lLCBhbmQgYXJlIGFsbW9zdCBkb25lLiAgVGhlIGluc2VjdXJpdHkgaGVyZSBpc1xcbmF0IHRoZSBzdGFydCBvZiBkYXlsaWdodCB0aW1lLiAgUGljdHVyZSBVUyBFYXN0ZXJuIGZvciBjb25jcmV0ZW5lc3MuICBUaGUgd2FsbFxcbnRpbWUganVtcHMgZnJvbSAxOjU5IHRvIDM6MDAsIGFuZCB3YWxsIGhvdXJzIG9mIHRoZSBmb3JtIDI6TU0gZG9uJ3QgbWFrZSBnb29kXFxuc2Vuc2UgdGhlbi4gIFRoZSBkb2NzIGFzayB0aGF0IGFuIEVhc3Rlcm4gdHppbmZvIGNsYXNzIGNvbnNpZGVyIHN1Y2ggYSB0aW1lIHRvXFxuYmUgRURUIChiZWNhdXNlIGl0J3MgXFxcImFmdGVyIDJcXFwiKSwgd2hpY2ggaXMgYSByZWR1bmRhbnQgc3BlbGxpbmcgb2YgMTpNTSBFU1RcXG5vbiB0aGUgZGF5IERTVCBzdGFydHMuICBXZSB3YW50IHRvIHJldHVybiB0aGUgMTpNTSBFU1Qgc3BlbGxpbmcgYmVjYXVzZSB0aGF0J3NcXG50aGUgb25seSBzcGVsbGluZyB0aGF0IG1ha2VzIHNlbnNlIG9uIHRoZSBsb2NhbCB3YWxsIGNsb2NrLlxcblxcbkluIGZhY3QsIGlmIFs1XSBob2xkcyBhdCB0aGlzIHBvaW50LCB3ZSBkbyBoYXZlIHRoZSBzdGFuZGFyZC10aW1lIHNwZWxsaW5nLFxcbmJ1dCB0aGF0IHRha2VzIGEgYml0IG9mIHByb29mLiAgV2UgZmlyc3QgcHJvdmUgYSBzdHJvbmdlciByZXN1bHQuICBXaGF0J3MgdGhlXFxuZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBMSFMgYW5kIFJIUyBvZiBbNV0/ICBMZXRcXG5cXG4gICAgZGlmZiA9IHgubiAtICh6Lm4gLSB6Lm8pICAgICAgICAgICAgICAgICAgICBbNl1cXG5cXG5Ob3dcXG4gICAgei5uID0gICAgICAgICAgICAgICAgICAgICAgIGJ5IFs0XVxcbiAgICAoeSArIHkucykubiA9ICAgICAgICAgICAgICAgYnkgIzVcXG4gICAgeS5uICsgeS5zID0gICAgICAgICAgICAgICAgIHNpbmNlIHkubiA9IHgublxcbiAgICB4Lm4gKyB5LnMgPSAgICAgICAgICAgICAgICAgc2luY2UgeiBhbmQgeSBhcmUgaGF2ZSB0aGUgc2FtZSB0emluZm8gbWVtYmVyLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkucyA9IHoucyBieSAjMlxcbiAgICB4Lm4gKyB6LnNcXG5cXG5QbHVnZ2luZyB0aGF0IGJhY2sgaW50byBbNl0gZ2l2ZXNcXG5cXG4gICAgZGlmZiA9XFxuICAgIHgubiAtICgoeC5uICsgei5zKSAtIHoubykgPSAgICAgZXhwYW5kaW5nXFxuICAgIHgubiAtIHgubiAtIHoucyArIHoubyA9ICAgICAgICAgY2FuY2VsbGluZ1xcbiAgICAtIHoucyArIHoubyA9ICAgICAgICAgICAgICAgICAgIGJ5ICMyXFxuICAgIHouZFxcblxcblNvIGRpZmYgPSB6LmQuXFxuXFxuSWYgWzVdIGlzIHRydWUgbm93LCBkaWZmID0gMCwgc28gei5kID0gMCB0b28sIGFuZCB3ZSBoYXZlIHRoZSBzdGFuZGFyZC10aW1lXFxuc3BlbGxpbmcgd2Ugd2FudGVkIGluIHRoZSBlbmRjYXNlIGRlc2NyaWJlZCBhYm92ZS4gIFdlJ3JlIGRvbmUuICBDb250cmFyaWx5LFxcbmlmIHouZCA9IDAsIHRoZW4gd2UgaGF2ZSBhIFVUQyBlcXVpdmFsZW50LCBhbmQgYXJlIGFsc28gZG9uZS5cXG5cXG5JZiBbNV0gaXMgbm90IHRydWUgbm93LCBkaWZmID0gei5kICE9IDAsIGFuZCB6LmQgaXMgdGhlIG9mZnNldCB3ZSBuZWVkIHRvXFxuYWRkIHRvIHogKGluIGVmZmVjdCwgeiBpcyBpbiB0eidzIHN0YW5kYXJkIHRpbWUsIGFuZCB3ZSBuZWVkIHRvIHNoaWZ0IHRoZVxcbmxvY2FsIGNsb2NrIGludG8gdHoncyBkYXlsaWdodCB0aW1lKS5cXG5cXG5MZXRcXG5cXG4gICAgeicgPSB6ICsgei5kID0geiArIGRpZmYgICAgICAgICAgICAgICAgICAgICBbN11cXG5cXG5hbmQgd2UgY2FuIGFnYWluIGFzayB3aGV0aGVyXFxuXFxuICAgIHonLm4gLSB6Jy5vID0geC5uICAgICAgICAgICAgICAgICAgICAgICAgICAgWzhdXFxuXFxuSWYgc28sIHdlJ3JlIGRvbmUuICBJZiBub3QsIHRoZSB0emluZm8gY2xhc3MgaXMgaW5zYW5lLCBhY2NvcmRpbmcgdG8gdGhlXFxuYXNzdW1wdGlvbnMgd2UndmUgbWFkZS4gIFRoaXMgYWxzbyByZXF1aXJlcyBhIGJpdCBvZiBwcm9vZi4gIEFzIGJlZm9yZSwgbGV0J3NcXG5jb21wdXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIExIUyBhbmQgUkhTIG9mIFs4XSAoYW5kIHNraXBwaW5nIHNvbWUgb2ZcXG50aGUganVzdGlmaWNhdGlvbnMgZm9yIHRoZSBraW5kcyBvZiBzdWJzdGl0dXRpb25zIHdlJ3ZlIGRvbmUgc2V2ZXJhbCB0aW1lc1xcbmFscmVhZHkpOlxcblxcbiAgICBkaWZmJyA9IHgubiAtICh6Jy5uIC0geicubykgPSAgICAgICAgICAgcmVwbGFjaW5nIHonLm4gdmlhIFs3XVxcbiAgICAgICAgICAgIHgubiAgLSAoei5uICsgZGlmZiAtIHonLm8pID0gICAgcmVwbGFjaW5nIGRpZmYgdmlhIFs2XVxcbiAgICAgICAgICAgIHgubiAtICh6Lm4gKyB4Lm4gLSAoei5uIC0gei5vKSAtIHonLm8pID1cXG4gICAgICAgICAgICB4Lm4gLSB6Lm4gLSB4Lm4gKyB6Lm4gLSB6Lm8gKyB6Jy5vID0gICAgY2FuY2VsIHgublxcbiAgICAgICAgICAgIC0gei5uICsgei5uIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICBjYW5jZWwgei5uXFxuICAgICAgICAgICAgLSB6Lm8gKyB6Jy5vID0gICAgICAgICAgICAgICAgICAgICAgIzEgdHdpY2VcXG4gICAgICAgICAgICAtei5zIC0gei5kICsgeicucyArIHonLmQgPSAgICAgICAgICB6IGFuZCB6JyBoYXZlIHNhbWUgdHppbmZvXFxuICAgICAgICAgICAgeicuZCAtIHouZFxcblxcblNvIHonIGlzIFVUQy1lcXVpdmFsZW50IHRvIHggaWZmIHonLmQgPSB6LmQgYXQgdGhpcyBwb2ludC4gIElmIHRoZXkgYXJlIGVxdWFsLFxcbndlJ3ZlIGZvdW5kIHRoZSBVVEMtZXF1aXZhbGVudCBzbyBhcmUgZG9uZS4gIEluIGZhY3QsIHdlIHN0b3Agd2l0aCBbN10gYW5kXFxucmV0dXJuIHonLCBub3QgYm90aGVyaW5nIHRvIGNvbXB1dGUgeicuZC5cXG5cXG5Ib3cgY291bGQgei5kIGFuZCB6J2QgZGlmZmVyPyAgeicgPSB6ICsgei5kIFs3XSwgc28gbWVyZWx5IG1vdmluZyB6JyBieVxcbmEgZHN0KCkgb2Zmc2V0LCBhbmQgc3RhcnRpbmcgKmZyb20qIGEgdGltZSBhbHJlYWR5IGluIERTVCAod2Uga25vdyB6LmQgIT0gMCksXFxud291bGQgaGF2ZSB0byBjaGFuZ2UgdGhlIHJlc3VsdCBkc3QoKSByZXR1cm5zOiAgd2Ugc3RhcnQgaW4gRFNULCBhbmQgbW92aW5nXFxuYSBsaXR0bGUgZnVydGhlciBpbnRvIGl0IHRha2VzIHVzIG91dCBvZiBEU1QuXFxuXFxuVGhlcmUgaXNuJ3QgYSBzYW5lIGNhc2Ugd2hlcmUgdGhpcyBjYW4gaGFwcGVuLiAgVGhlIGNsb3Nlc3QgaXQgZ2V0cyBpcyBhdFxcbnRoZSBlbmQgb2YgRFNULCB3aGVyZSB0aGVyZSdzIGFuIGhvdXIgaW4gVVRDIHdpdGggbm8gc3BlbGxpbmcgaW4gYSBoeWJyaWRcXG50emluZm8gY2xhc3MuICBJbiBVUyBFYXN0ZXJuLCB0aGF0J3MgNTpNTSBVVEMgPSAwOk1NIEVTVCA9IDE6TU0gRURULiAgRHVyaW5nXFxudGhhdCBob3VyLCBvbiBhbiBFYXN0ZXJuIGNsb2NrIDE6TU0gaXMgdGFrZW4gYXMgYmVpbmcgaW4gc3RhbmRhcmQgdGltZSAoNjpNTVxcblVUQykgYmVjYXVzZSB0aGUgZG9jcyBpbnNpc3Qgb24gdGhhdCwgYnV0IDA6TU0gaXMgdGFrZW4gYXMgYmVpbmcgaW4gZGF5bGlnaHRcXG50aW1lICg0Ok1NIFVUQykuICBUaGVyZSBpcyBubyBsb2NhbCB0aW1lIG1hcHBpbmcgdG8gNTpNTSBVVEMuICBUaGUgbG9jYWxcXG5jbG9jayBqdW1wcyBmcm9tIDE6NTkgYmFjayB0byAxOjAwIGFnYWluLCBhbmQgcmVwZWF0cyB0aGUgMTpNTSBob3VyIGluXFxuc3RhbmRhcmQgdGltZS4gIFNpbmNlIHRoYXQncyB3aGF0IHRoZSBsb2NhbCBjbG9jayAqZG9lcyosIHdlIHdhbnQgdG8gbWFwIGJvdGhcXG5VVEMgaG91cnMgNTpNTSBhbmQgNjpNTSB0byAxOk1NIEVhc3Rlcm4uICBUaGUgcmVzdWx0IGlzIGFtYmlndW91c1xcbmluIGxvY2FsIHRpbWUsIGJ1dCBzbyBpdCBnb2VzIC0tIGl0J3MgdGhlIHdheSB0aGUgbG9jYWwgY2xvY2sgd29ya3MuXFxuXFxuV2hlbiB4ID0gNTpNTSBVVEMgaXMgdGhlIGlucHV0IHRvIHRoaXMgYWxnb3JpdGhtLCB4Lm89MCwgeS5vPS01IGFuZCB5LmQ9MCxcXG5zbyB6PTA6TU0uICB6LmQ9NjAgKG1pbnV0ZXMpIHRoZW4sIHNvIFs1XSBkb2Vzbid0IGhvbGQgYW5kIHdlIGtlZXAgZ29pbmcuXFxueicgPSB6ICsgei5kID0gMTpNTSB0aGVuLCBhbmQgeicuZD0wLCBhbmQgeicuZCAtIHouZCA9IC02MCAhPSAwIHNvIFs4XVxcbihjb3JyZWN0bHkpIGNvbmNsdWRlcyB0aGF0IHonIGlzIG5vdCBVVEMtZXF1aXZhbGVudCB0byB4LlxcblxcbkJlY2F1c2Ugd2Uga25vdyB6LmQgc2FpZCB6IHdhcyBpbiBkYXlsaWdodCB0aW1lIChlbHNlIFs1XSB3b3VsZCBoYXZlIGhlbGQgYW5kXFxud2Ugd291bGQgaGF2ZSBzdG9wcGVkIHRoZW4pLCBhbmQgd2Uga25vdyB6LmQgIT0geicuZCAoZWxzZSBbOF0gd291bGQgaGF2ZSBoZWxkXFxuYW5kIHdlIGhhdmUgc3RvcHBlZCB0aGVuKSwgYW5kIHRoZXJlIGFyZSBvbmx5IDIgcG9zc2libGUgdmFsdWVzIGRzdCgpIGNhblxcbnJldHVybiBpbiBFYXN0ZXJuLCBpdCBmb2xsb3dzIHRoYXQgeicuZCBtdXN0IGJlIDAgKHdoaWNoIGl0IGlzIGluIHRoZSBleGFtcGxlLFxcbmJ1dCB0aGUgcmVhc29uaW5nIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSBleGFtcGxlIC0tIGl0IGRlcGVuZHMgb24gdGhlcmUgYmVpbmdcXG50d28gcG9zc2libGUgZHN0KCkgb3V0Y29tZXMsIG9uZSB6ZXJvIGFuZCB0aGUgb3RoZXIgbm9uLXplcm8pLiAgVGhlcmVmb3JlXFxueicgbXVzdCBiZSBpbiBzdGFuZGFyZCB0aW1lLCBhbmQgaXMgdGhlIHNwZWxsaW5nIHdlIHdhbnQgaW4gdGhpcyBjYXNlLlxcblxcbk5vdGUgYWdhaW4gdGhhdCB6JyBpcyBub3QgVVRDLWVxdWl2YWxlbnQgYXMgZmFyIGFzIHRoZSBoeWJyaWQgdHppbmZvIGNsYXNzIGlzXFxuY29uY2VybmVkIChiZWNhdXNlIGl0IHRha2VzIHonIGFzIGJlaW5nIGluIHN0YW5kYXJkIHRpbWUgcmF0aGVyIHRoYW4gdGhlXFxuZGF5bGlnaHQgdGltZSB3ZSBpbnRlbmQgaGVyZSksIGJ1dCByZXR1cm5pbmcgaXQgZ2l2ZXMgdGhlIHJlYWwtbGlmZSBcXFwibG9jYWxcXG5jbG9jayByZXBlYXRzIGFuIGhvdXJcXFwiIGJlaGF2aW9yIHdoZW4gbWFwcGluZyB0aGUgXFxcInVuc3BlbGxhYmxlXFxcIiBVVEMgaG91ciBpbnRvXFxudHouXFxuXFxuV2hlbiB0aGUgaW5wdXQgaXMgNjpNTSwgej0xOk1NIGFuZCB6LmQ9MCwgYW5kIHdlIHN0b3AgYXQgb25jZSwgYWdhaW4gd2l0aFxcbnRoZSAxOk1NIHN0YW5kYXJkIHRpbWUgc3BlbGxpbmcgd2Ugd2FudC5cXG5cXG5TbyBob3cgY2FuIHRoaXMgYnJlYWs/ICBPbmUgb2YgdGhlIGFzc3VtcHRpb25zIG11c3QgYmUgdmlvbGF0ZWQuICBUd29cXG5wb3NzaWJpbGl0aWVzOlxcblxcbjEpIFsyXSBlZmZlY3RpdmVseSBzYXlzIHRoYXQgeS5zIGlzIGludmFyaWFudCBhY3Jvc3MgYWxsIHkgYmVsb25nIHRvIGEgZ2l2ZW5cXG4gICB0aW1lIHpvbmUuICBUaGlzIGlzbid0IHRydWUgaWYsIGZvciBwb2xpdGljYWwgcmVhc29ucyBvciBjb250aW5lbnRhbCBkcmlmdCxcXG4gICBhIHJlZ2lvbiBkZWNpZGVzIHRvIGNoYW5nZSBpdHMgYmFzZSBvZmZzZXQgZnJvbSBVVEMuXFxuXFxuMikgVGhlcmUgbWF5IGJlIHZlcnNpb25zIG9mIFxcXCJkb3VibGUgZGF5bGlnaHRcXFwiIHRpbWUgd2hlcmUgdGhlIHRhaWwgZW5kIG9mXFxuICAgdGhlIGFuYWx5c2lzIGdpdmVzIHVwIGEgc3RlcCB0b28gZWFybHkuICBJIGhhdmVuJ3QgdGhvdWdodCBhYm91dCB0aGF0XFxuICAgZW5vdWdoIHRvIHNheS5cXG5cXG5JbiBhbnkgY2FzZSwgaXQncyBjbGVhciB0aGF0IHRoZSBkZWZhdWx0IGZyb211dGMoKSBpcyBzdHJvbmcgZW5vdWdoIHRvIGhhbmRsZVxcblxcXCJhbG1vc3QgYWxsXFxcIiB0aW1lIHpvbmVzOiAgc28gbG9uZyBhcyB0aGUgc3RhbmRhcmQgb2Zmc2V0IGlzIGludmFyaWFudCwgaXRcXG5kb2Vzbid0IG1hdHRlciBpZiBkYXlsaWdodCB0aW1lIHRyYW5zaXRpb24gcG9pbnRzIGNoYW5nZSBmcm9tIHllYXIgdG8geWVhciwgb3JcXG5pZiBkYXlsaWdodCB0aW1lIGlzIHNraXBwZWQgaW4gc29tZSB5ZWFyczsgaXQgZG9lc24ndCBtYXR0ZXIgaG93IGxhcmdlIG9yXFxuc21hbGwgZHN0KCkgbWF5IGdldCB3aXRoaW4gaXRzIGJvdW5kczsgYW5kIGl0IGRvZXNuJ3QgZXZlbiBtYXR0ZXIgaWYgc29tZVxcbnBlcnZlcnNlIHRpbWUgem9uZSByZXR1cm5zIGEgbmVnYXRpdmUgZHN0KCkpLiAgU28gYSBicmVha2luZyBjYXNlIG11c3QgYmVcXG5wcmV0dHkgYml6YXJyZSwgYW5kIGEgdHppbmZvIHN1YmNsYXNzIGNhbiBvdmVycmlkZSBmcm9tdXRjKCkgaWYgaXQgaXMuXFxuXFxcIlxcXCJcXFwiXFxuXCIsXCJzcmMvbGliL2RiaGFzaC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGJoYXNoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGVjaW1hbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGVjaW1hbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RpZmZsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpZmZsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaXJjYWNoZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGlyY2FjaGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaXMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Rpc3R1dGlscy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGlzdHV0aWxzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzdHV0aWxzL2NvbW1hbmQvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbW1hbmQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaXN0dXRpbHMvdGVzdHMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRlc3RzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZG9jdGVzdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZG9jdGVzdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RvY3VtZW50LmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYSxiPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcImRvY3VtZW50XFxcIil9O3JldHVybiBiLmdldEVsZW1lbnRCeUlkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS52KTtyZXR1cm4gYz9Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjXSk6U2suYnVpbHRpbi5ub25lLm5vbmUkfSksYi5jcmVhdGVFbGVtZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChhLnYpO2lmKGMpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NdKX0pLGIuZ2V0RWxlbWVudHNCeVRhZ05hbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYS52KSxkPVtdLGU9Yy5sZW5ndGgtMTswPD1lO2UtLSlkLnB1c2goU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY1tlXV0pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChkKX0pLGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEudiksZD1bXSxlPTA7ZTxjLmxlbmd0aDtlKyspZC5wdXNoKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NbZV1dKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoZCl9KSxiLmdldEVsZW1lbnRzQnlOYW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKGEudiksZD1bXSxlPTA7ZTxjLmxlbmd0aDtlKyspZC5wdXNoKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NbZV1dKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoZCl9KSxiLnF1ZXJ5U2VsZWN0b3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGEudik7cmV0dXJuIGM/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY10pOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIucXVlcnlTZWxlY3RvckFsbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGEudiksZD1bXSxlPTA7ZTxjLmxlbmd0aDtlKyspZC5wdXNoKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NbZV1dKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoZCl9KSxiLmdldEN1cnJlbnRFZGl0b3JWYWx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09U2suZGl2aWQmJnZvaWQgMCE9PXdpbmRvdy5lZExpc3Qpe2lmKFNrLmdyYWRlQ29udGFpbmVyIT1Tay5kaXZpZCl7dmFyIGE9U2suZ3JhZGVDb250YWluZXIrXFxcIiBcXFwiK1NrLmRpdmlkO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIod2luZG93LmVkTGlzdFthXS5lZGl0b3IuZ2V0VmFsdWUoKSl9cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih3aW5kb3cuZWRMaXN0W1NrLmRpdmlkXS5lZGl0b3IuZ2V0VmFsdWUoKSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXFxcIkNhbid0IGZpbmQgZWRpdG9yIGZvciB0aGlzIGRpdlxcXCIpfSksYi5jdXJyZW50RGl2PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1Tay5kaXZpZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmRpdmlkKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcXFwiVGhlcmUgaXMgbm8gdmFsdWUgc2V0IGZvciBkaXZpZFxcXCIpfSksYi5jdXJyZW50Q291cnNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1lQm9va0NvbmZpZylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGVCb29rQ29uZmlnLmNvdXJzZSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXFxcIlRoZXJlIGlzIG5vIGNvdXJzZVxcXCIpfSksYi5jdXJyZW50R3JhZGluZ0NvbnRhaW5lcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09U2suZ3JhZGVDb250YWluZXIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5ncmFkZUNvbnRhaW5lcik7aWYobnVsbCE9U2suZGl2aWQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5kaXZpZCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXFxcIlRoZXJlIGlzIG5vIHZhbHVlIHNldCBmb3IgZ3JhZGluZ1xcXCIpfSksYT1mdW5jdGlvbihhLGMpe2MuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudj1iLGEuaW5uZXJIVE1MPWIuaW5uZXJIVE1MLGEuaW5uZXJUZXh0PWIuaW5uZXJUZXh0LHZvaWQgMCE9PWIudmFsdWUmJihhLnZhbHVlPWIudmFsdWUsU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihcXFwidmFsdWVcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYS52YWx1ZSkpKSx2b2lkIDAhPT1iLmNoZWNrZWQmJihhLmNoZWNrZWQ9Yi5jaGVja2VkLFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImNoZWNrZWRcXFwiKSxTay5idWlsdGluLmJvb2woYS5jaGVja2VkKSkpLFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImlubmVySFRNTFxcXCIpLG5ldyBTay5idWlsdGluLnN0cihhLmlubmVySFRNTCkpLFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImlubmVyVGV4dFxcXCIpLG5ldyBTay5idWlsdGluLnN0cihhLmlubmVyVGV4dCkpfSksYy50cCRnZXRhdHRyPVNrLmdlbmVyaWMuZ2V0QXR0cixjLl9fc2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwiaW5uZXJIVE1MXFxcIj09PWImJihhLmlubmVySFRNTD1jLGEudi5pbm5lckhUTUw9Yy52LFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImlubmVySFRNTFxcXCIpLGMpKSxcXFwiaW5uZXJUZXh0XFxcIj09PWImJihhLmlubmVyVGV4dD1jLGEudi5pbm5lclRleHQ9Yy52LFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImlubmVyVGV4dFxcXCIpLGMpKX0pLGMuYXBwZW5kQ2hpbGQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5hcHBlbmRDaGlsZChiLnYpfSksYy5yZW1vdmVDaGlsZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnJlbW92ZUNoaWxkKGIudil9KSxjLmNsb3Nlc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe3ZhciBkPWEudi5jbG9zZXN0KGMudik7cmV0dXJuIGQ/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbZF0pOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuZ2V0Q1NTPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEudi5zdHlsZVtiLnZdKX0pLGMuc2V0Q1NTPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2Eudi5zdHlsZVtiLnZdPWMudn0pLGMuZ2V0QXR0cmlidXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnYuZ2V0QXR0cmlidXRlKGIudik7cmV0dXJuIGM/bmV3IFNrLmJ1aWx0aW4uc3RyKGMpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuc2V0QXR0cmlidXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2Eudi5zZXRBdHRyaWJ1dGUoYi52LGMudil9KSxjLmdldFByb3BlcnR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnZbYi52XTtyZXR1cm4gYz9uZXcgU2suYnVpbHRpbi5zdHIoYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfSksYy5fX3N0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIGNvbnNvbGUubG9nKGEudi50YWdOYW1lKSxuZXcgU2suYnVpbHRpbi5zdHIoYS52LnRhZ05hbWUpfSksYy5fX3JlcHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiW0RPTSBFbGVtZW50XVxcXCIpfSl9LGIuRWxlbWVudD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGIsYSxcXFwiRWxlbWVudFxcXCIsW10pLGJ9O1wiLFwic3JjL2xpYi9kdW1iZGJtLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1iZGJtIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZHVtbXlfdGhyZWFkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1teV90aHJlYWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kdW1teV90aHJlYWRpbmcucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImR1bW15X3RocmVhZGluZyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2VtYWlsL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJlbWFpbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2VtYWlsL21pbWUvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1pbWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbWFpbC90ZXN0L2RhdGEvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRhdGEgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbmNvZGluZ3MvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImVuY29kaW5ncyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ZpbGVjbXAucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZpbGVjbXAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9maWxlaW5wdXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZpbGVpbnB1dCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ZubWF0Y2gucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZubWF0Y2ggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mb3JtYXR0ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZvcm1hdHRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ZwZm9ybWF0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmcGZvcm1hdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ZyYWN0aW9ucy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnJhY3Rpb25zIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZnRwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmdHBsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mdW5jdG9vbHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZ1bmN0b29scyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2dlbmVyaWNwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJnZW5lcmljcGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2dldG9wdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2V0b3B0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZ2V0cGFzcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2V0cGFzcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2dldHRleHQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdldHRleHQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nbG9iLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJnbG9iIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZ3ppcC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ3ppcCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2hhc2hsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImhhc2hsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9oZWFwcS5weVwiOlwiXFxcIlxcXCJcXFwiSGVhcCBxdWV1ZSBhbGdvcml0aG0gKGEuay5hLiBwcmlvcml0eSBxdWV1ZSkuXFxuXFxuSGVhcHMgYXJlIGFycmF5cyBmb3Igd2hpY2ggYVtrXSA8PSBhWzIqaysxXSBhbmQgYVtrXSA8PSBhWzIqaysyXSBmb3JcXG5hbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sXFxubm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXFxucHJvcGVydHkgb2YgYSBoZWFwIGlzIHRoYXQgYVswXSBpcyBhbHdheXMgaXRzIHNtYWxsZXN0IGVsZW1lbnQuXFxuXFxuVXNhZ2U6XFxuXFxuaGVhcCA9IFtdICAgICAgICAgICAgIyBjcmVhdGVzIGFuIGVtcHR5IGhlYXBcXG5oZWFwcHVzaChoZWFwLCBpdGVtKSAjIHB1c2hlcyBhIG5ldyBpdGVtIG9uIHRoZSBoZWFwXFxuaXRlbSA9IGhlYXBwb3AoaGVhcCkgIyBwb3BzIHRoZSBzbWFsbGVzdCBpdGVtIGZyb20gdGhlIGhlYXBcXG5pdGVtID0gaGVhcFswXSAgICAgICAjIHNtYWxsZXN0IGl0ZW0gb24gdGhlIGhlYXAgd2l0aG91dCBwb3BwaW5nIGl0XFxuaGVhcGlmeSh4KSAgICAgICAgICAgIyB0cmFuc2Zvcm1zIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBsaW5lYXIgdGltZVxcbml0ZW0gPSBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKSAjIHBvcHMgYW5kIHJldHVybnMgc21hbGxlc3QgaXRlbSwgYW5kIGFkZHNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXcgaXRlbTsgdGhlIGhlYXAgc2l6ZSBpcyB1bmNoYW5nZWRcXG5cXG5PdXIgQVBJIGRpZmZlcnMgZnJvbSB0ZXh0Ym9vayBoZWFwIGFsZ29yaXRobXMgYXMgZm9sbG93czpcXG5cXG4tIFdlIHVzZSAwLWJhc2VkIGluZGV4aW5nLiAgVGhpcyBtYWtlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlXFxuICBpbmRleCBmb3IgYSBub2RlIGFuZCB0aGUgaW5kZXhlcyBmb3IgaXRzIGNoaWxkcmVuIHNsaWdodGx5IGxlc3NcXG4gIG9idmlvdXMsIGJ1dCBpcyBtb3JlIHN1aXRhYmxlIHNpbmNlIFB5dGhvbiB1c2VzIDAtYmFzZWQgaW5kZXhpbmcuXFxuXFxuLSBPdXIgaGVhcHBvcCgpIG1ldGhvZCByZXR1cm5zIHRoZSBzbWFsbGVzdCBpdGVtLCBub3QgdGhlIGxhcmdlc3QuXFxuXFxuVGhlc2UgdHdvIG1ha2UgaXQgcG9zc2libGUgdG8gdmlldyB0aGUgaGVhcCBhcyBhIHJlZ3VsYXIgUHl0aG9uIGxpc3RcXG53aXRob3V0IHN1cnByaXNlczogaGVhcFswXSBpcyB0aGUgc21hbGxlc3QgaXRlbSwgYW5kIGhlYXAuc29ydCgpXFxubWFpbnRhaW5zIHRoZSBoZWFwIGludmFyaWFudCFcXG5cXFwiXFxcIlxcXCJcXG5cXG4jIE9yaWdpbmFsIGNvZGUgYnkgS2V2aW4gTydDb25ub3IsIGF1Z21lbnRlZCBieSBUaW0gUGV0ZXJzIGFuZCBSYXltb25kIEhldHRpbmdlclxcblxcbl9fYWJvdXRfXyA9IFxcXCJcXFwiXFxcIkhlYXAgcXVldWVzXFxuXFxuW2V4cGxhbmF0aW9uIGJ5IEZyYW7Dp29pcyBQaW5hcmRdXFxuXFxuSGVhcHMgYXJlIGFycmF5cyBmb3Igd2hpY2ggYVtrXSA8PSBhWzIqaysxXSBhbmQgYVtrXSA8PSBhWzIqaysyXSBmb3JcXG5hbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sXFxubm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXFxucHJvcGVydHkgb2YgYSBoZWFwIGlzIHRoYXQgYVswXSBpcyBhbHdheXMgaXRzIHNtYWxsZXN0IGVsZW1lbnQuXFxuXFxuVGhlIHN0cmFuZ2UgaW52YXJpYW50IGFib3ZlIGlzIG1lYW50IHRvIGJlIGFuIGVmZmljaWVudCBtZW1vcnlcXG5yZXByZXNlbnRhdGlvbiBmb3IgYSB0b3VybmFtZW50LiAgVGhlIG51bWJlcnMgYmVsb3cgYXJlIGBrJywgbm90IGFba106XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwXFxuXFxuICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJcXG5cXG4gICAgICAgICAgMyAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgNSAgICAgICAgICAgICAgIDZcXG5cXG4gICAgICA3ICAgICAgIDggICAgICAgOSAgICAgICAxMCAgICAgIDExICAgICAgMTIgICAgICAxMyAgICAgIDE0XFxuXFxuICAgIDE1IDE2ICAgMTcgMTggICAxOSAyMCAgIDIxIDIyICAgMjMgMjQgICAyNSAyNiAgIDI3IDI4ICAgMjkgMzBcXG5cXG5cXG5JbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIGBrJyBpcyB0b3BwaW5nIGAyKmsrMScgYW5kIGAyKmsrMicuICBJblxcbmEgdXN1YWwgYmluYXJ5IHRvdXJuYW1lbnQgd2Ugc2VlIGluIHNwb3J0cywgZWFjaCBjZWxsIGlzIHRoZSB3aW5uZXJcXG5vdmVyIHRoZSB0d28gY2VsbHMgaXQgdG9wcywgYW5kIHdlIGNhbiB0cmFjZSB0aGUgd2lubmVyIGRvd24gdGhlIHRyZWVcXG50byBzZWUgYWxsIG9wcG9uZW50cyBzL2hlIGhhZC4gIEhvd2V2ZXIsIGluIG1hbnkgY29tcHV0ZXIgYXBwbGljYXRpb25zXFxub2Ygc3VjaCB0b3VybmFtZW50cywgd2UgZG8gbm90IG5lZWQgdG8gdHJhY2UgdGhlIGhpc3Rvcnkgb2YgYSB3aW5uZXIuXFxuVG8gYmUgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCB3aGVuIGEgd2lubmVyIGlzIHByb21vdGVkLCB3ZSB0cnkgdG9cXG5yZXBsYWNlIGl0IGJ5IHNvbWV0aGluZyBlbHNlIGF0IGEgbG93ZXIgbGV2ZWwsIGFuZCB0aGUgcnVsZSBiZWNvbWVzXFxudGhhdCBhIGNlbGwgYW5kIHRoZSB0d28gY2VsbHMgaXQgdG9wcyBjb250YWluIHRocmVlIGRpZmZlcmVudCBpdGVtcyxcXG5idXQgdGhlIHRvcCBjZWxsIFxcXCJ3aW5zXFxcIiBvdmVyIHRoZSB0d28gdG9wcGVkIGNlbGxzLlxcblxcbklmIHRoaXMgaGVhcCBpbnZhcmlhbnQgaXMgcHJvdGVjdGVkIGF0IGFsbCB0aW1lLCBpbmRleCAwIGlzIGNsZWFybHlcXG50aGUgb3ZlcmFsbCB3aW5uZXIuICBUaGUgc2ltcGxlc3QgYWxnb3JpdGhtaWMgd2F5IHRvIHJlbW92ZSBpdCBhbmRcXG5maW5kIHRoZSBcXFwibmV4dFxcXCIgd2lubmVyIGlzIHRvIG1vdmUgc29tZSBsb3NlciAobGV0J3Mgc2F5IGNlbGwgMzAgaW4gdGhlXFxuZGlhZ3JhbSBhYm92ZSkgaW50byB0aGUgMCBwb3NpdGlvbiwgYW5kIHRoZW4gcGVyY29sYXRlIHRoaXMgbmV3IDAgZG93blxcbnRoZSB0cmVlLCBleGNoYW5naW5nIHZhbHVlcywgdW50aWwgdGhlIGludmFyaWFudCBpcyByZS1lc3RhYmxpc2hlZC5cXG5UaGlzIGlzIGNsZWFybHkgbG9nYXJpdGhtaWMgb24gdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdHJlZS5cXG5CeSBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMsIHlvdSBnZXQgYW4gTyhuIGxuIG4pIHNvcnQuXFxuXFxuQSBuaWNlIGZlYXR1cmUgb2YgdGhpcyBzb3J0IGlzIHRoYXQgeW91IGNhbiBlZmZpY2llbnRseSBpbnNlcnQgbmV3XFxuaXRlbXMgd2hpbGUgdGhlIHNvcnQgaXMgZ29pbmcgb24sIHByb3ZpZGVkIHRoYXQgdGhlIGluc2VydGVkIGl0ZW1zIGFyZVxcbm5vdCBcXFwiYmV0dGVyXFxcIiB0aGFuIHRoZSBsYXN0IDAndGggZWxlbWVudCB5b3UgZXh0cmFjdGVkLiAgVGhpcyBpc1xcbmVzcGVjaWFsbHkgdXNlZnVsIGluIHNpbXVsYXRpb24gY29udGV4dHMsIHdoZXJlIHRoZSB0cmVlIGhvbGRzIGFsbFxcbmluY29taW5nIGV2ZW50cywgYW5kIHRoZSBcXFwid2luXFxcIiBjb25kaXRpb24gbWVhbnMgdGhlIHNtYWxsZXN0IHNjaGVkdWxlZFxcbnRpbWUuICBXaGVuIGFuIGV2ZW50IHNjaGVkdWxlIG90aGVyIGV2ZW50cyBmb3IgZXhlY3V0aW9uLCB0aGV5IGFyZVxcbnNjaGVkdWxlZCBpbnRvIHRoZSBmdXR1cmUsIHNvIHRoZXkgY2FuIGVhc2lseSBnbyBpbnRvIHRoZSBoZWFwLiAgU28sIGFcXG5oZWFwIGlzIGEgZ29vZCBzdHJ1Y3R1cmUgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzICh0aGlzIGlzIHdoYXQgSVxcbnVzZWQgZm9yIG15IE1JREkgc2VxdWVuY2VyIDotKS5cXG5cXG5WYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseVxcbnN0dWRpZWQsIGFuZCBoZWFwcyBhcmUgZ29vZCBmb3IgdGhpcywgYXMgdGhleSBhcmUgcmVhc29uYWJseSBzcGVlZHksXFxudGhlIHNwZWVkIGlzIGFsbW9zdCBjb25zdGFudCwgYW5kIHRoZSB3b3JzdCBjYXNlIGlzIG5vdCBtdWNoIGRpZmZlcmVudFxcbnRoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2hcXG5hcmUgbW9yZSBlZmZpY2llbnQgb3ZlcmFsbCwgeWV0IHRoZSB3b3JzdCBjYXNlcyBtaWdodCBiZSB0ZXJyaWJsZS5cXG5cXG5IZWFwcyBhcmUgYWxzbyB2ZXJ5IHVzZWZ1bCBpbiBiaWcgZGlzayBzb3J0cy4gIFlvdSBtb3N0IHByb2JhYmx5IGFsbFxcbmtub3cgdGhhdCBhIGJpZyBzb3J0IGltcGxpZXMgcHJvZHVjaW5nIFxcXCJydW5zXFxcIiAod2hpY2ggYXJlIHByZS1zb3J0ZWRcXG5zZXF1ZW5jZXMsIHdoaWNoIHNpemUgaXMgdXN1YWxseSByZWxhdGVkIHRvIHRoZSBhbW91bnQgb2YgQ1BVIG1lbW9yeSksXFxuZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlblxcbnZlcnkgY2xldmVybHkgb3JnYW5pc2VkWzFdLiAgSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGUgaW5pdGlhbFxcbnNvcnQgcHJvZHVjZXMgdGhlIGxvbmdlc3QgcnVucyBwb3NzaWJsZS4gIFRvdXJuYW1lbnRzIGFyZSBhIGdvb2Qgd2F5XFxudG8gdGhhdC4gIElmLCB1c2luZyBhbGwgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gaG9sZCBhIHRvdXJuYW1lbnQsIHlvdVxcbnJlcGxhY2UgYW5kIHBlcmNvbGF0ZSBpdGVtcyB0aGF0IGhhcHBlbiB0byBmaXQgdGhlIGN1cnJlbnQgcnVuLCB5b3UnbGxcXG5wcm9kdWNlIHJ1bnMgd2hpY2ggYXJlIHR3aWNlIHRoZSBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHJhbmRvbSBpbnB1dCxcXG5hbmQgbXVjaCBiZXR0ZXIgZm9yIGlucHV0IGZ1enppbHkgb3JkZXJlZC5cXG5cXG5Nb3Jlb3ZlciwgaWYgeW91IG91dHB1dCB0aGUgMCd0aCBpdGVtIG9uIGRpc2sgYW5kIGdldCBhbiBpbnB1dCB3aGljaFxcbm1heSBub3QgZml0IGluIHRoZSBjdXJyZW50IHRvdXJuYW1lbnQgKGJlY2F1c2UgdGhlIHZhbHVlIFxcXCJ3aW5zXFxcIiBvdmVyXFxudGhlIGxhc3Qgb3V0cHV0IHZhbHVlKSwgaXQgY2Fubm90IGZpdCBpbiB0aGUgaGVhcCwgc28gdGhlIHNpemUgb2YgdGhlXFxuaGVhcCBkZWNyZWFzZXMuICBUaGUgZnJlZWQgbWVtb3J5IGNvdWxkIGJlIGNsZXZlcmx5IHJldXNlZCBpbW1lZGlhdGVseVxcbmZvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkaW5nIGEgc2Vjb25kIGhlYXAsIHdoaWNoIGdyb3dzIGF0IGV4YWN0bHkgdGhlXFxuc2FtZSByYXRlIHRoZSBmaXJzdCBoZWFwIGlzIG1lbHRpbmcuICBXaGVuIHRoZSBmaXJzdCBoZWFwIGNvbXBsZXRlbHlcXG52YW5pc2hlcywgeW91IHN3aXRjaCBoZWFwcyBhbmQgc3RhcnQgYSBuZXcgcnVuLiAgQ2xldmVyIGFuZCBxdWl0ZVxcbmVmZmVjdGl2ZSFcXG5cXG5JbiBhIHdvcmQsIGhlYXBzIGFyZSB1c2VmdWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8ga25vdy4gIEkgdXNlIHRoZW0gaW5cXG5hIGZldyBhcHBsaWNhdGlvbnMsIGFuZCBJIHRoaW5rIGl0IGlzIGdvb2QgdG8ga2VlcCBhIGBoZWFwJyBtb2R1bGVcXG5hcm91bmQuIDotKVxcblxcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuWzFdIFRoZSBkaXNrIGJhbGFuY2luZyBhbGdvcml0aG1zIHdoaWNoIGFyZSBjdXJyZW50LCBub3dhZGF5cywgYXJlXFxubW9yZSBhbm5veWluZyB0aGFuIGNsZXZlciwgYW5kIHRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgc2Vla2luZ1xcbmNhcGFiaWxpdGllcyBvZiB0aGUgZGlza3MuICBPbiBkZXZpY2VzIHdoaWNoIGNhbm5vdCBzZWVrLCBsaWtlIGJpZ1xcbnRhcGUgZHJpdmVzLCB0aGUgc3Rvcnkgd2FzIHF1aXRlIGRpZmZlcmVudCwgYW5kIG9uZSBoYWQgdG8gYmUgdmVyeVxcbmNsZXZlciB0byBlbnN1cmUgKGZhciBpbiBhZHZhbmNlKSB0aGF0IGVhY2ggdGFwZSBtb3ZlbWVudCB3aWxsIGJlIHRoZVxcbm1vc3QgZWZmZWN0aXZlIHBvc3NpYmxlICh0aGF0IGlzLCB3aWxsIGJlc3QgcGFydGljaXBhdGUgYXRcXG5cXFwicHJvZ3Jlc3NpbmdcXFwiIHRoZSBtZXJnZSkuICBTb21lIHRhcGVzIHdlcmUgZXZlbiBhYmxlIHRvIHJlYWRcXG5iYWNrd2FyZHMsIGFuZCB0aGlzIHdhcyBhbHNvIHVzZWQgdG8gYXZvaWQgdGhlIHJld2luZGluZyB0aW1lLlxcbkJlbGlldmUgbWUsIHJlYWwgZ29vZCB0YXBlIHNvcnRzIHdlcmUgcXVpdGUgc3BlY3RhY3VsYXIgdG8gd2F0Y2ghXFxuRnJvbSBhbGwgdGltZXMsIHNvcnRpbmcgaGFzIGFsd2F5cyBiZWVuIGEgR3JlYXQgQXJ0ISA6LSlcXG5cXFwiXFxcIlxcXCJcXG5cXG5fX2FsbF9fID0gWydoZWFwcHVzaCcsICdoZWFwcG9wJywgJ2hlYXBpZnknLCAnaGVhcHJlcGxhY2UnLFxcbiAgICAgICAgICAgJ25sYXJnZXN0JywgJ25zbWFsbGVzdCcsICdoZWFwcHVzaHBvcCddXFxuXFxuZGVmIGhlYXBwdXNoKGhlYXAsIGl0ZW0pOlxcbiAgICBcXFwiXFxcIlxcXCJQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuXFxcIlxcXCJcXFwiXFxuICAgIGhlYXAuYXBwZW5kKGl0ZW0pXFxuICAgIF9zaWZ0ZG93bihoZWFwLCAwLCBsZW4oaGVhcCktMSlcXG5cXG5kZWYgaGVhcHBvcChoZWFwKTpcXG4gICAgXFxcIlxcXCJcXFwiUG9wIHRoZSBzbWFsbGVzdCBpdGVtIG9mZiB0aGUgaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxcXCJcXFwiXFxcIlxcbiAgICBsYXN0ZWx0ID0gaGVhcC5wb3AoKSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaWYgaGVhcDpcXG4gICAgICAgIHJldHVybml0ZW0gPSBoZWFwWzBdXFxuICAgICAgICBoZWFwWzBdID0gbGFzdGVsdFxcbiAgICAgICAgX3NpZnR1cChoZWFwLCAwKVxcbiAgICAgICAgcmV0dXJuIHJldHVybml0ZW1cXG4gICAgcmV0dXJuIGxhc3RlbHRcXG5cXG5kZWYgaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSk6XFxuICAgIFxcXCJcXFwiXFxcIlBvcCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHNtYWxsZXN0IHZhbHVlLCBhbmQgYWRkIHRoZSBuZXcgaXRlbS5cXG5cXG4gICAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGhlYXBwb3AoKSBmb2xsb3dlZCBieSBoZWFwcHVzaCgpLCBhbmQgY2FuIGJlXFxuICAgIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkLXNpemUgaGVhcC4gIE5vdGUgdGhhdCB0aGUgdmFsdWVcXG4gICAgcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hICBUaGF0IGNvbnN0cmFpbnMgcmVhc29uYWJsZSB1c2VzIG9mXFxuICAgIHRoaXMgcm91dGluZSB1bmxlc3Mgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgY29uZGl0aW9uYWwgcmVwbGFjZW1lbnQ6XFxuXFxuICAgICAgICBpZiBpdGVtID4gaGVhcFswXTpcXG4gICAgICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSlcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIHJldHVybml0ZW0gPSBoZWFwWzBdICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eVxcbiAgICBoZWFwWzBdID0gaXRlbVxcbiAgICBfc2lmdHVwKGhlYXAsIDApXFxuICAgIHJldHVybiByZXR1cm5pdGVtXFxuXFxuZGVmIGhlYXBwdXNocG9wKGhlYXAsIGl0ZW0pOlxcbiAgICBcXFwiXFxcIlxcXCJGYXN0IHZlcnNpb24gb2YgYSBoZWFwcHVzaCBmb2xsb3dlZCBieSBhIGhlYXBwb3AuXFxcIlxcXCJcXFwiXFxuICAgIGlmIGhlYXAgYW5kIGhlYXBbMF0gPCBpdGVtOlxcbiAgICAgICAgaXRlbSwgaGVhcFswXSA9IGhlYXBbMF0sIGl0ZW1cXG4gICAgICAgIF9zaWZ0dXAoaGVhcCwgMClcXG4gICAgcmV0dXJuIGl0ZW1cXG5cXG5kZWYgaGVhcGlmeSh4KTpcXG4gICAgXFxcIlxcXCJcXFwiVHJhbnNmb3JtIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBPKGxlbih4KSkgdGltZS5cXFwiXFxcIlxcXCJcXG4gICAgbiA9IGxlbih4KVxcbiAgICAjIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0byBsb29raW5nIGF0XFxuICAgICMgaXMgdGhlIGxhcmdlc3Qgd2l0aCBhIGNoaWxkIGluZGV4IGluLXJhbmdlLCBzbyBtdXN0IGhhdmUgMippICsgMSA8IG4sXFxuICAgICMgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMgKDIqai0xKS8yID0gai0xLzIgc29cXG4gICAgIyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYgbiBpcyBvZGQgPSAyKmorMSwgdGhpcyBpc1xcbiAgICAjICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIGFuZCB0aGF0J3MgYWdhaW4gbi8vMi0xLlxcbiAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShuLy8yKSk6XFxuICAgICAgICBfc2lmdHVwKHgsIGkpXFxuXFxuZGVmIF9oZWFwcG9wX21heChoZWFwKTpcXG4gICAgXFxcIlxcXCJcXFwiTWF4aGVhcCB2ZXJzaW9uIG9mIGEgaGVhcHBvcC5cXFwiXFxcIlxcXCJcXG4gICAgbGFzdGVsdCA9IGhlYXAucG9wKCkgICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5XFxuICAgIGlmIGhlYXA6XFxuICAgICAgICByZXR1cm5pdGVtID0gaGVhcFswXVxcbiAgICAgICAgaGVhcFswXSA9IGxhc3RlbHRcXG4gICAgICAgIF9zaWZ0dXBfbWF4KGhlYXAsIDApXFxuICAgICAgICByZXR1cm4gcmV0dXJuaXRlbVxcbiAgICByZXR1cm4gbGFzdGVsdFxcblxcbmRlZiBfaGVhcHJlcGxhY2VfbWF4KGhlYXAsIGl0ZW0pOlxcbiAgICBcXFwiXFxcIlxcXCJNYXhoZWFwIHZlcnNpb24gb2YgYSBoZWFwcG9wIGZvbGxvd2VkIGJ5IGEgaGVhcHB1c2guXFxcIlxcXCJcXFwiXFxuICAgIHJldHVybml0ZW0gPSBoZWFwWzBdICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eVxcbiAgICBoZWFwWzBdID0gaXRlbVxcbiAgICBfc2lmdHVwX21heChoZWFwLCAwKVxcbiAgICByZXR1cm4gcmV0dXJuaXRlbVxcblxcbmRlZiBfaGVhcGlmeV9tYXgoeCk6XFxuICAgIFxcXCJcXFwiXFxcIlRyYW5zZm9ybSBsaXN0IGludG8gYSBtYXhoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oeCkpIHRpbWUuXFxcIlxcXCJcXFwiXFxuICAgIG4gPSBsZW4oeClcXG4gICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2Uobi8vMikpOlxcbiAgICAgICAgX3NpZnR1cF9tYXgoeCwgaSlcXG5cXG4jICdoZWFwJyBpcyBhIGhlYXAgYXQgYWxsIGluZGljZXMgPj0gc3RhcnRwb3MsIGV4Y2VwdCBwb3NzaWJseSBmb3IgcG9zLiAgcG9zXFxuIyBpcyB0aGUgaW5kZXggb2YgYSBsZWFmIHdpdGggYSBwb3NzaWJseSBvdXQtb2Ytb3JkZXIgdmFsdWUuICBSZXN0b3JlIHRoZVxcbiMgaGVhcCBpbnZhcmlhbnQuXFxuZGVmIF9zaWZ0ZG93bihoZWFwLCBzdGFydHBvcywgcG9zKTpcXG4gICAgbmV3aXRlbSA9IGhlYXBbcG9zXVxcbiAgICAjIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nIGEgcGxhY2VcXG4gICAgIyBuZXdpdGVtIGZpdHMuXFxuICAgIHdoaWxlIHBvcyA+IHN0YXJ0cG9zOlxcbiAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDFcXG4gICAgICAgIHBhcmVudCA9IGhlYXBbcGFyZW50cG9zXVxcbiAgICAgICAgaWYgbmV3aXRlbSA8IHBhcmVudDpcXG4gICAgICAgICAgICBoZWFwW3Bvc10gPSBwYXJlbnRcXG4gICAgICAgICAgICBwb3MgPSBwYXJlbnRwb3NcXG4gICAgICAgICAgICBjb250aW51ZVxcbiAgICAgICAgYnJlYWtcXG4gICAgaGVhcFtwb3NdID0gbmV3aXRlbVxcblxcbiMgVGhlIGNoaWxkIGluZGljZXMgb2YgaGVhcCBpbmRleCBwb3MgYXJlIGFscmVhZHkgaGVhcHMsIGFuZCB3ZSB3YW50IHRvIG1ha2VcXG4jIGEgaGVhcCBhdCBpbmRleCBwb3MgdG9vLiAgV2UgZG8gdGhpcyBieSBidWJibGluZyB0aGUgc21hbGxlciBjaGlsZCBvZlxcbiMgcG9zIHVwIChhbmQgc28gb24gd2l0aCB0aGF0IGNoaWxkJ3MgY2hpbGRyZW4sIGV0YykgdW50aWwgaGl0dGluZyBhIGxlYWYsXFxuIyB0aGVuIHVzaW5nIF9zaWZ0ZG93biB0byBtb3ZlIHRoZSBvZGRiYWxsIG9yaWdpbmFsbHkgYXQgaW5kZXggcG9zIGludG8gcGxhY2UuXFxuI1xcbiMgV2UgKmNvdWxkKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgYXMgc29vbiBhcyB3ZSBmaW5kIGEgcG9zIHdoZXJlIG5ld2l0ZW0gPD1cXG4jIGJvdGggaXRzIGNoaWxkcmVuLCBidXQgdHVybnMgb3V0IHRoYXQncyBub3QgYSBnb29kIGlkZWEsIGFuZCBkZXNwaXRlIHRoYXRcXG4jIG1hbnkgYm9va3Mgd3JpdGUgdGhlIGFsZ29yaXRobSB0aGF0IHdheS4gIER1cmluZyBhIGhlYXAgcG9wLCB0aGUgbGFzdCBhcnJheVxcbiMgZWxlbWVudCBpcyBzaWZ0ZWQgaW4sIGFuZCB0aGF0IHRlbmRzIHRvIGJlIGxhcmdlLCBzbyB0aGF0IGNvbXBhcmluZyBpdFxcbiMgYWdhaW5zdCB2YWx1ZXMgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCB1c3VhbGx5IGRvZXNuJ3QgcGF5ICg9IHVzdWFsbHkgZG9lc24ndFxcbiMgZ2V0IHVzIG91dCBvZiB0aGUgbG9vcCBlYXJseSkuICBTZWUgS251dGgsIFZvbHVtZSAzLCB3aGVyZSB0aGlzIGlzXFxuIyBleHBsYWluZWQgYW5kIHF1YW50aWZpZWQgaW4gYW4gZXhlcmNpc2UuXFxuI1xcbiMgQ3V0dGluZyB0aGUgIyBvZiBjb21wYXJpc29ucyBpcyBpbXBvcnRhbnQsIHNpbmNlIHRoZXNlIHJvdXRpbmVzIGhhdmUgbm9cXG4jIHdheSB0byBleHRyYWN0IFxcXCJ0aGUgcHJpb3JpdHlcXFwiIGZyb20gYW4gYXJyYXkgZWxlbWVudCwgc28gdGhhdCBpbnRlbGxpZ2VuY2VcXG4jIGlzIGxpa2VseSB0byBiZSBoaWRpbmcgaW4gY3VzdG9tIGNvbXBhcmlzb24gbWV0aG9kcywgb3IgaW4gYXJyYXkgZWxlbWVudHNcXG4jIHN0b3JpbmcgKHByaW9yaXR5LCByZWNvcmQpIHR1cGxlcy4gIENvbXBhcmlzb25zIGFyZSB0aHVzIHBvdGVudGlhbGx5XFxuIyBleHBlbnNpdmUuXFxuI1xcbiMgT24gcmFuZG9tIGFycmF5cyBvZiBsZW5ndGggMTAwMCwgbWFraW5nIHRoaXMgY2hhbmdlIGN1dCB0aGUgbnVtYmVyIG9mXFxuIyBjb21wYXJpc29ucyBtYWRlIGJ5IGhlYXBpZnkoKSBhIGxpdHRsZSwgYW5kIHRob3NlIG1hZGUgYnkgZXhoYXVzdGl2ZVxcbiMgaGVhcHBvcCgpIGEgbG90LCBpbiBhY2NvcmQgd2l0aCB0aGVvcnkuICBIZXJlIGFyZSB0eXBpY2FsIHJlc3VsdHMgZnJvbSAzXFxuIyBydW5zICgzIGp1c3QgdG8gZGVtb25zdHJhdGUgaG93IHNtYWxsIHRoZSB2YXJpYW5jZSBpcyk6XFxuI1xcbiMgQ29tcGFyZXMgbmVlZGVkIGJ5IGhlYXBpZnkgICAgIENvbXBhcmVzIG5lZWRlZCBieSAxMDAwIGhlYXBwb3BzXFxuIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4jIDE4MzcgY3V0IHRvIDE2NjMgICAgICAgICAgICAgICAxNDk5NiBjdXQgdG8gODY4MFxcbiMgMTg1NSBjdXQgdG8gMTY1OSAgICAgICAgICAgICAgIDE0OTY2IGN1dCB0byA4Njc4XFxuIyAxODQ3IGN1dCB0byAxNjYwICAgICAgICAgICAgICAgMTUwMjQgY3V0IHRvIDg3MDNcXG4jXFxuIyBCdWlsZGluZyB0aGUgaGVhcCBieSB1c2luZyBoZWFwcHVzaCgpIDEwMDAgdGltZXMgaW5zdGVhZCByZXF1aXJlZFxcbiMgMjE5OCwgMjE0OCwgYW5kIDIyMTkgY29tcGFyZXM6ICBoZWFwaWZ5KCkgaXMgbW9yZSBlZmZpY2llbnQsIHdoZW5cXG4jIHlvdSBjYW4gdXNlIGl0LlxcbiNcXG4jIFRoZSB0b3RhbCBjb21wYXJlcyBuZWVkZWQgYnkgbGlzdC5zb3J0KCkgb24gdGhlIHNhbWUgbGlzdHMgd2VyZSA4NjI3LFxcbiMgODYyNywgYW5kIDg2MzIgKHRoaXMgc2hvdWxkIGJlIGNvbXBhcmVkIHRvIHRoZSBzdW0gb2YgaGVhcGlmeSgpIGFuZFxcbiMgaGVhcHBvcCgpIGNvbXBhcmVzKTogIGxpc3Quc29ydCgpIGlzICh1bnN1cnByaXNpbmdseSEpIG1vcmUgZWZmaWNpZW50XFxuIyBmb3Igc29ydGluZy5cXG5cXG5kZWYgX3NpZnR1cChoZWFwLCBwb3MpOlxcbiAgICBlbmRwb3MgPSBsZW4oaGVhcClcXG4gICAgc3RhcnRwb3MgPSBwb3NcXG4gICAgbmV3aXRlbSA9IGhlYXBbcG9zXVxcbiAgICAjIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi5cXG4gICAgY2hpbGRwb3MgPSAyKnBvcyArIDEgICAgIyBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvblxcbiAgICB3aGlsZSBjaGlsZHBvcyA8IGVuZHBvczpcXG4gICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuXFxuICAgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMVxcbiAgICAgICAgaWYgcmlnaHRwb3MgPCBlbmRwb3MgYW5kIG5vdCBoZWFwW2NoaWxkcG9zXSA8IGhlYXBbcmlnaHRwb3NdOlxcbiAgICAgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3NcXG4gICAgICAgICMgTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC5cXG4gICAgICAgIGhlYXBbcG9zXSA9IGhlYXBbY2hpbGRwb3NdXFxuICAgICAgICBwb3MgPSBjaGlsZHBvc1xcbiAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDFcXG4gICAgIyBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBidWJibGUgaXQgdXBcXG4gICAgIyB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS5cXG4gICAgaGVhcFtwb3NdID0gbmV3aXRlbVxcbiAgICBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcylcXG5cXG5kZWYgX3NpZnRkb3duX21heChoZWFwLCBzdGFydHBvcywgcG9zKTpcXG4gICAgJ01heGhlYXAgdmFyaWFudCBvZiBfc2lmdGRvd24nXFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZyBhIHBsYWNlXFxuICAgICMgbmV3aXRlbSBmaXRzLlxcbiAgICB3aGlsZSBwb3MgPiBzdGFydHBvczpcXG4gICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxXFxuICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc11cXG4gICAgICAgIGlmIHBhcmVudCA8IG5ld2l0ZW06XFxuICAgICAgICAgICAgaGVhcFtwb3NdID0gcGFyZW50XFxuICAgICAgICAgICAgcG9zID0gcGFyZW50cG9zXFxuICAgICAgICAgICAgY29udGludWVcXG4gICAgICAgIGJyZWFrXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG5cXG5kZWYgX3NpZnR1cF9tYXgoaGVhcCwgcG9zKTpcXG4gICAgJ01heGhlYXAgdmFyaWFudCBvZiBfc2lmdHVwJ1xcbiAgICBlbmRwb3MgPSBsZW4oaGVhcClcXG4gICAgc3RhcnRwb3MgPSBwb3NcXG4gICAgbmV3aXRlbSA9IGhlYXBbcG9zXVxcbiAgICAjIEJ1YmJsZSB1cCB0aGUgbGFyZ2VyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLlxcbiAgICBjaGlsZHBvcyA9IDIqcG9zICsgMSAgICAjIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uXFxuICAgIHdoaWxlIGNoaWxkcG9zIDwgZW5kcG9zOlxcbiAgICAgICAgIyBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2YgbGFyZ2VyIGNoaWxkLlxcbiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDFcXG4gICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgaGVhcFtyaWdodHBvc10gPCBoZWFwW2NoaWxkcG9zXTpcXG4gICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zXFxuICAgICAgICAjIE1vdmUgdGhlIGxhcmdlciBjaGlsZCB1cC5cXG4gICAgICAgIGhlYXBbcG9zXSA9IGhlYXBbY2hpbGRwb3NdXFxuICAgICAgICBwb3MgPSBjaGlsZHBvc1xcbiAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDFcXG4gICAgIyBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBidWJibGUgaXQgdXBcXG4gICAgIyB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS5cXG4gICAgaGVhcFtwb3NdID0gbmV3aXRlbVxcbiAgICBfc2lmdGRvd25fbWF4KGhlYXAsIHN0YXJ0cG9zLCBwb3MpXFxuXFxuXFxuIyBBbGdvcml0aG0gbm90ZXMgZm9yIG5sYXJnZXN0KCkgYW5kIG5zbWFsbGVzdCgpXFxuIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuI1xcbiMgTWFrZSBhIHNpbmdsZSBwYXNzIG92ZXIgdGhlIGRhdGEgd2hpbGUga2VlcGluZyB0aGUgayBtb3N0IGV4dHJlbWUgdmFsdWVzXFxuIyBpbiBhIGhlYXAuICBNZW1vcnkgY29uc3VtcHRpb24gaXMgbGltaXRlZCB0byBrZWVwaW5nIGsgdmFsdWVzIGluIGEgbGlzdC5cXG4jXFxuIyBNZWFzdXJlZCBwZXJmb3JtYW5jZSBmb3IgcmFuZG9tIGlucHV0czpcXG4jXFxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGNvbXBhcmlzb25zXFxuIyAgICBuIGlucHV0cyAgICAgay1leHRyZW1lIHZhbHVlcyAgKGF2ZXJhZ2Ugb2YgNSB0cmlhbHMpICAgJSBtb3JlIHRoYW4gbWluKClcXG4jIC0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLVxcbiMgICAgICAxLDAwMCAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgICAgMywzMTcgICAgICAgICAgICAgICAyMzEuNyVcXG4jICAgICAxMCwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAgMTQsMDQ2ICAgICAgICAgICAgICAgIDQwLjUlXFxuIyAgICAxMDAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgICAgMTA1LDc0OSAgICAgICAgICAgICAgICAgNS43JVxcbiMgIDEsMDAwLDAwMCAgICAgICAgICAgMTAwICAgICAgICAgICAgICAxLDAwNyw3NTEgICAgICAgICAgICAgICAgIDAuOCVcXG4jIDEwLDAwMCwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAxMCwwMDksNDAxICAgICAgICAgICAgICAgICAwLjElXFxuI1xcbiMgVGhlb3JldGljYWwgbnVtYmVyIG9mIGNvbXBhcmlzb25zIGZvciBrIHNtYWxsZXN0IG9mIG4gcmFuZG9tIGlucHV0czpcXG4jXFxuIyBTdGVwICAgQ29tcGFyaXNvbnMgICAgICAgICAgICAgICAgICBBY3Rpb25cXG4jIC0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgIDEgICAgIDEuNjYgKiBrICAgICAgICAgICAgICAgICAgICAgaGVhcGlmeSB0aGUgZmlyc3Qgay1pbnB1dHNcXG4jICAyICAgICBuIC0gayAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUgcmVtYWluaW5nIGVsZW1lbnRzIHRvIHRvcCBvZiBoZWFwXFxuIyAgMyAgICAgayAqICgxICsgbGcyKGspKSAqIGxuKG4vaykgICByZXBsYWNlIHRoZSB0b3Btb3N0IHZhbHVlIG9uIHRoZSBoZWFwXFxuIyAgNCAgICAgayAqIGxnMihrKSAtIChrLzIpICAgICAgICAgICBmaW5hbCBzb3J0IG9mIHRoZSBrIG1vc3QgZXh0cmVtZSB2YWx1ZXNcXG4jXFxuIyBDb21iaW5pbmcgYW5kIHNpbXBsaWZ5aW5nIGZvciBhIHJvdWdoIGVzdGltYXRlIGdpdmVzOlxcbiNcXG4jICAgICAgICBjb21wYXJpc29ucyA9IG4gKyBrICogKGxvZyhrLCAyKSAqIGxvZyhuL2spICsgbG9nKGssIDIpICsgbG9nKG4vaykpXFxuI1xcbiMgQ29tcHV0aW5nIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgZm9yIHN0ZXAgMzpcXG4jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuIyAqIEZvciB0aGUgaS10aCBuZXcgdmFsdWUgZnJvbSB0aGUgaXRlcmFibGUsIHRoZSBwcm9iYWJpbGl0eSBvZiBiZWluZyBpbiB0aGVcXG4jICAgayBtb3N0IGV4dHJlbWUgdmFsdWVzIGlzIGsvaS4gIEZvciBleGFtcGxlLCB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIDEwMXN0XFxuIyAgIHZhbHVlIHNlZW4gYmVpbmcgaW4gdGhlIDEwMCBtb3N0IGV4dHJlbWUgdmFsdWVzIGlzIDEwMC8xMDEuXFxuIyAqIElmIHRoZSB2YWx1ZSBpcyBhIG5ldyBleHRyZW1lIHZhbHVlLCB0aGUgY29zdCBvZiBpbnNlcnRpbmcgaXQgaW50byB0aGVcXG4jICAgaGVhcCBpcyAxICsgbG9nKGssIDIpLlxcbiMgKiBUaGUgcHJvYmFiaWxpdHkgdGltZXMgdGhlIGNvc3QgZ2l2ZXM6XFxuIyAgICAgICAgICAgIChrL2kpICogKDEgKyBsb2coaywgMikpXFxuIyAqIFN1bW1pbmcgYWNyb3NzIHRoZSByZW1haW5pbmcgbi1rIGVsZW1lbnRzIGdpdmVzOlxcbiMgICAgICAgICAgICBzdW0oKGsvaSkgKiAoMSArIGxvZyhrLCAyKSkgZm9yIGkgaW4gcmFuZ2UoaysxLCBuKzEpKVxcbiMgKiBUaGlzIHJlZHVjZXMgdG86XFxuIyAgICAgICAgICAgIChIKG4pIC0gSChrKSkgKiBrICogKDEgKyBsb2coaywgMikpXFxuIyAqIFdoZXJlIEgobikgaXMgdGhlIG4tdGggaGFybW9uaWMgbnVtYmVyIGVzdGltYXRlZCBieTpcXG4jICAgICAgICAgICAgZ2FtbWEgPSAwLjU3NzIxNTY2NDlcXG4jICAgICAgICAgICAgSChuKSA9IGxvZyhuLCBlKSArIGdhbW1hICsgMSAvICgyICogbilcXG4jICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYXJtb25pY19zZXJpZXNfKG1hdGhlbWF0aWNzKSNSYXRlX29mX2RpdmVyZ2VuY2VcXG4jICogU3Vic3RpdHV0aW5nIHRoZSBIKG4pIGZvcm11bGE6XFxuIyAgICAgICAgICAgIGNvbXBhcmlzb25zID0gayAqICgxICsgbG9nKGssIDIpKSAqIChsb2cobi9rLCBlKSArICgxL24gLSAxL2spIC8gMilcXG4jXFxuIyBXb3JzdC1jYXNlIGZvciBzdGVwIDM6XFxuIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuIyBJbiB0aGUgd29yc3QgY2FzZSwgdGhlIGlucHV0IGRhdGEgaXMgcmV2ZXJzZWQgc29ydGVkIHNvIHRoYXQgZXZlcnkgbmV3IGVsZW1lbnRcXG4jIG11c3QgYmUgaW5zZXJ0ZWQgaW4gdGhlIGhlYXA6XFxuI1xcbiMgICAgICAgICAgICAgY29tcGFyaXNvbnMgPSAxLjY2ICogayArIGxvZyhrLCAyKSAqIChuIC0gaylcXG4jXFxuIyBBbHRlcm5hdGl2ZSBBbGdvcml0aG1zXFxuIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuIyBPdGhlciBhbGdvcml0aG1zIHdlcmUgbm90IHVzZWQgYmVjYXVzZSB0aGV5OlxcbiMgMSkgVG9vayBtdWNoIG1vcmUgYXV4aWxpYXJ5IG1lbW9yeSxcXG4jIDIpIE1hZGUgbXVsdGlwbGUgcGFzc2VzIG92ZXIgdGhlIGRhdGEuXFxuIyAzKSBNYWRlIG1vcmUgY29tcGFyaXNvbnMgaW4gY29tbW9uIGNhc2VzIChzbWFsbCBrLCBsYXJnZSBuLCBzZW1pLXJhbmRvbSBpbnB1dCkuXFxuIyBTZWUgdGhlIG1vcmUgZGV0YWlsZWQgY29tcGFyaXNvbiBvZiBhcHByb2FjaCBhdDpcXG4jIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzU3NzU3My1jb21wYXJlLWFsZ29yaXRobXMtZm9yLWhlYXBxc21hbGxlc3RcXG5cXG5kZWYgbnNtYWxsZXN0KG4sIGl0ZXJhYmxlLCBrZXk9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIkZpbmQgdGhlIG4gc21hbGxlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LlxcblxcbiAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl1cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtaW4oKVxcbiAgICBpZiBuID09IDE6XFxuICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgICAgICBzZW50aW5lbCA9IG9iamVjdCgpXFxuICAgICAgICByZXN1bHQgPSBtaW4oaXQsIGRlZmF1bHQ9c2VudGluZWwsIGtleT1rZXkpXFxuICAgICAgICByZXR1cm4gW10gaWYgcmVzdWx0IGlzIHNlbnRpbmVsIGVsc2UgW3Jlc3VsdF1cXG5cXG4gICAgIyBXaGVuIG4+PXNpemUsIGl0J3MgZmFzdGVyIHRvIHVzZSBzb3J0ZWQoKVxcbiAgICB0cnk6XFxuICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKVxcbiAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOlxcbiAgICAgICAgcGFzc1xcbiAgICBlbHNlOlxcbiAgICAgICAgaWYgbiA+PSBzaXplOlxcbiAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXkpWzpuXVxcblxcbiAgICAjIFdoZW4ga2V5IGlzIG5vbmUsIHVzZSBzaW1wbGVyIGRlY29yYXRpb25cXG4gICAgaWYga2V5IGlzIE5vbmU6XFxuICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgICAgICAjIHB1dCB0aGUgcmFuZ2UobikgZmlyc3Qgc28gdGhhdCB6aXAoKSBkb2Vzbid0XFxuICAgICAgICAjIGNvbnN1bWUgb25lIHRvbyBtYW55IGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhdG9yXFxuICAgICAgICByZXN1bHQgPSBbKGVsZW0sIGkpIGZvciBpLCBlbGVtIGluIHppcChyYW5nZShuKSwgaXQpXVxcbiAgICAgICAgaWYgbm90IHJlc3VsdDpcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgICAgICBfaGVhcGlmeV9tYXgocmVzdWx0KVxcbiAgICAgICAgdG9wID0gcmVzdWx0WzBdWzBdXFxuICAgICAgICBvcmRlciA9IG5cXG4gICAgICAgIF9oZWFwcmVwbGFjZSA9IF9oZWFwcmVwbGFjZV9tYXhcXG4gICAgICAgIGZvciBlbGVtIGluIGl0OlxcbiAgICAgICAgICAgIGlmIGVsZW0gPCB0b3A6XFxuICAgICAgICAgICAgICAgIF9oZWFwcmVwbGFjZShyZXN1bHQsIChlbGVtLCBvcmRlcikpXFxuICAgICAgICAgICAgICAgIHRvcCwgX29yZGVyID0gcmVzdWx0WzBdXFxuICAgICAgICAgICAgICAgIG9yZGVyICs9IDFcXG4gICAgICAgIHJlc3VsdC5zb3J0KClcXG4gICAgICAgIHJldHVybiBbZWxlbSBmb3IgKGVsZW0sIG9yZGVyKSBpbiByZXN1bHRdXFxuXFxuICAgICMgR2VuZXJhbCBjYXNlLCBzbG93ZXN0IG1ldGhvZFxcbiAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgIHJlc3VsdCA9IFsoa2V5KGVsZW0pLCBpLCBlbGVtKSBmb3IgaSwgZWxlbSBpbiB6aXAocmFuZ2UobiksIGl0KV1cXG4gICAgaWYgbm90IHJlc3VsdDpcXG4gICAgICAgIHJldHVybiByZXN1bHRcXG4gICAgX2hlYXBpZnlfbWF4KHJlc3VsdClcXG4gICAgdG9wID0gcmVzdWx0WzBdWzBdXFxuICAgIG9yZGVyID0gblxcbiAgICBfaGVhcHJlcGxhY2UgPSBfaGVhcHJlcGxhY2VfbWF4XFxuICAgIGZvciBlbGVtIGluIGl0OlxcbiAgICAgICAgayA9IGtleShlbGVtKVxcbiAgICAgICAgaWYgayA8IHRvcDpcXG4gICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoaywgb3JkZXIsIGVsZW0pKVxcbiAgICAgICAgICAgIHRvcCwgX29yZGVyLCBfZWxlbSA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgIG9yZGVyICs9IDFcXG4gICAgcmVzdWx0LnNvcnQoKVxcbiAgICByZXR1cm4gW2VsZW0gZm9yIChrLCBvcmRlciwgZWxlbSkgaW4gcmVzdWx0XVxcblxcbmRlZiBubGFyZ2VzdChuLCBpdGVyYWJsZSwga2V5PU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LlxcblxcbiAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5LCByZXZlcnNlPVRydWUpWzpuXVxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgIyBTaG9ydC1jdXQgZm9yIG49PTEgaXMgdG8gdXNlIG1heCgpXFxuICAgIGlmIG4gPT0gMTpcXG4gICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSlcXG4gICAgICAgIHNlbnRpbmVsID0gb2JqZWN0KClcXG4gICAgICAgIHJlc3VsdCA9IG1heChpdCwgZGVmYXVsdD1zZW50aW5lbCwga2V5PWtleSlcXG4gICAgICAgIHJldHVybiBbXSBpZiByZXN1bHQgaXMgc2VudGluZWwgZWxzZSBbcmVzdWx0XVxcblxcbiAgICAjIFdoZW4gbj49c2l6ZSwgaXQncyBmYXN0ZXIgdG8gdXNlIHNvcnRlZCgpXFxuICAgIHRyeTpcXG4gICAgICAgIHNpemUgPSBsZW4oaXRlcmFibGUpXFxuICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6XFxuICAgICAgICBwYXNzXFxuICAgIGVsc2U6XFxuICAgICAgICBpZiBuID49IHNpemU6XFxuICAgICAgICAgICAgcmV0dXJuIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl1cXG5cXG4gICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uXFxuICAgIGlmIGtleSBpcyBOb25lOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgcmVzdWx0ID0gWyhlbGVtLCBpKSBmb3IgaSwgZWxlbSBpbiB6aXAocmFuZ2UoMCwgLW4sIC0xKSwgaXQpXVxcbiAgICAgICAgaWYgbm90IHJlc3VsdDpcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgICAgICBoZWFwaWZ5KHJlc3VsdClcXG4gICAgICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICAgICAgb3JkZXIgPSAtblxcbiAgICAgICAgX2hlYXByZXBsYWNlID0gaGVhcHJlcGxhY2VcXG4gICAgICAgIGZvciBlbGVtIGluIGl0OlxcbiAgICAgICAgICAgIGlmIHRvcCA8IGVsZW06XFxuICAgICAgICAgICAgICAgIF9oZWFwcmVwbGFjZShyZXN1bHQsIChlbGVtLCBvcmRlcikpXFxuICAgICAgICAgICAgICAgIHRvcCwgX29yZGVyID0gcmVzdWx0WzBdXFxuICAgICAgICAgICAgICAgIG9yZGVyIC09IDFcXG4gICAgICAgIHJlc3VsdC5zb3J0KHJldmVyc2U9VHJ1ZSlcXG4gICAgICAgIHJldHVybiBbZWxlbSBmb3IgKGVsZW0sIG9yZGVyKSBpbiByZXN1bHRdXFxuXFxuICAgICMgR2VuZXJhbCBjYXNlLCBzbG93ZXN0IG1ldGhvZFxcbiAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgIHJlc3VsdCA9IFsoa2V5KGVsZW0pLCBpLCBlbGVtKSBmb3IgaSwgZWxlbSBpbiB6aXAocmFuZ2UoMCwgLW4sIC0xKSwgaXQpXVxcbiAgICBpZiBub3QgcmVzdWx0OlxcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICBoZWFwaWZ5KHJlc3VsdClcXG4gICAgdG9wID0gcmVzdWx0WzBdWzBdXFxuICAgIG9yZGVyID0gLW5cXG4gICAgX2hlYXByZXBsYWNlID0gaGVhcHJlcGxhY2VcXG4gICAgZm9yIGVsZW0gaW4gaXQ6XFxuICAgICAgICBrID0ga2V5KGVsZW0pXFxuICAgICAgICBpZiB0b3AgPCBrOlxcbiAgICAgICAgICAgIF9oZWFwcmVwbGFjZShyZXN1bHQsIChrLCBvcmRlciwgZWxlbSkpXFxuICAgICAgICAgICAgdG9wLCBfb3JkZXIsIF9lbGVtID0gcmVzdWx0WzBdXFxuICAgICAgICAgICAgb3JkZXIgLT0gMVxcbiAgICByZXN1bHQuc29ydChyZXZlcnNlPVRydWUpXFxuICAgIHJldHVybiBbZWxlbSBmb3IgKGssIG9yZGVyLCBlbGVtKSBpbiByZXN1bHRdXFxuXFxuIyBJZiBhdmFpbGFibGUsIHVzZSBDIGltcGxlbWVudGF0aW9uXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgKlxcbmV4Y2VwdCBJbXBvcnRFcnJvcjpcXG4gICAgcGFzc1xcbnRyeTpcXG4gICAgZnJvbSBfaGVhcHEgaW1wb3J0IF9oZWFwcmVwbGFjZV9tYXhcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG50cnk6XFxuICAgIGZyb20gX2hlYXBxIGltcG9ydCBfaGVhcGlmeV9tYXhcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG50cnk6XFxuICAgIGZyb20gX2hlYXBxIGltcG9ydCBfaGVhcHBvcF9tYXhcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG5cXG5cXG5pZiBfX25hbWVfXyA9PSBcXFwiX19tYWluX19cXFwiOlxcblxcbiAgICBpbXBvcnQgZG9jdGVzdCAjIHByYWdtYTogbm8gY292ZXJcXG4gICAgcHJpbnQoZG9jdGVzdC50ZXN0bW9kKCkpICMgcHJhZ21hOiBubyBjb3ZlclxcblwiLFwic3JjL2xpYi9obWFjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJobWFjIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaG90c2hvdC9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaG90c2hvdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2h0bWxlbnRpdHlkZWZzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJodG1sZW50aXR5ZGVmcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2h0bWxsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImh0bWxsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9odHRwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJodHRwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaWRsZWxpYi9JY29ucy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiSWNvbnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pZGxlbGliL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpZGxlbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaWhvb2tzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpaG9va3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pbWFnZS5qc1wiOlwidmFyIEltYWdlTW9kLCRidWlsdGlubW9kdWxlO0ltYWdlTW9kfHwoSW1hZ2VNb2Q9e30sSW1hZ2VNb2QuY2FudmFzTGliPVtdKSwkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnLGg9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwiaW1hZ2VcXFwiKX07cmV0dXJuIGguSW1hZ2U9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhoLGZ1bmN0aW9uKGEsYil7dmFyIGM9TWF0aC5mbG9vcjtlPWZ1bmN0aW9uKGEpe2Eud2lkdGg9YS5pbWFnZS53aWR0aCxhLmhlaWdodD1hLmltYWdlLmhlaWdodCxhLmRlbGF5PTAsYS51cGRhdGVDb3VudD0wLGEudXBkYXRlSW50ZXJ2YWw9MSxhLmxhc3R4PTAsYS5sYXN0eT0wLGEuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGEuY2FudmFzLmhlaWdodD1hLmhlaWdodCxhLmNhbnZhcy53aWR0aD1hLndpZHRoLGEuY3R4PWEuY2FudmFzLmdldENvbnRleHQoXFxcIjJkXFxcIiksYS5jdHguZHJhd0ltYWdlKGEuaW1hZ2UsMCwwKSxhLmltYWdlZGF0YT1hLmN0eC5nZXRJbWFnZURhdGEoMCwwLGEud2lkdGgsYS5oZWlnaHQpfSxiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYztTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpO3RyeXthLmltYWdlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFNrLmZmaS5yZW1hcFRvSnMoYikpLGUoYSl9Y2F0Y2goYil7YS5pbWFnZT1udWxsfWlmKG51bGw9PWEuaW1hZ2UpcmV0dXJuIGM9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb24sYy5yZXN1bWU9ZnVuY3Rpb24oKXtpZihjLmRhdGEuZXJyb3IpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSU9FcnJvcihjLmRhdGEuZXJyb3IubWVzc2FnZSl9LGMuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTpuZXcgUHJvbWlzZShmdW5jdGlvbihjLGQpe3ZhciBmPW5ldyBJbWFnZTtmLmNyb3NzT3JpZ2luPVxcXCJcXFwiLGYub25lcnJvcj1mdW5jdGlvbigpe2QoRXJyb3IoXFxcIkZhaWxlZCB0byBsb2FkIFVSTDogXFxcIitmLnNyYykpfSxmLm9ubG9hZD1mdW5jdGlvbigpe2EuaW1hZ2U9dGhpcyxlKGEpLGMoKX0sZi5zcmM9ZyhiKX0pfSxjfSksZz1mdW5jdGlvbihhKXtsZXQgYj1Tay5mZmkucmVtYXBUb0pzKGEpO3RyeXtsZXQgYT1Tay5yZWFkKGIpLGM9Yi5zdWJzdHJpbmcoYi5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKzEpO3JldHVybmBkYXRhOmltYWdlLyR7Y307YmFzZTY0LCAke2F9YH1jYXRjaChhKXtjb25zb2xlLmxvZyhgJHtifSBpcyBub3QgaW4gdGhlIGRhdGFiYXNlICR7YX1gKX12YXIgYyxkLGU9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIFNrLmltYWdlUHJveHk/U2suaW1hZ2VQcm94eTpmdW5jdGlvbihhKXtyZXR1cm4gYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJhXFxcIiksYy5ocmVmPWQsd2luZG93LmxvY2F0aW9uLmhvc3Q9PT1jLmhvc3Q/YTpTay5pbWFnZVByb3h5K1xcXCIvXFxcIithfTtyZXR1cm4gZD1Tay5mZmkucmVtYXBUb0pzKGEpLGQ9ZShkKSxkfSxmPWZ1bmN0aW9uKGEsYixjKXtpZigwPmJ8fDA+Y3x8Yj49YS53aWR0aHx8Yz49YS5oZWlnaHQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiUGl4ZWwgaW5kZXggb3V0IG9mIHJhbmdlLlxcXCIpfTt2YXIgaT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0ZGVsYXlcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSxhLmRlbGF5PVNrLmZmaS5yZW1hcFRvSnMoYiksZD1Tay5idWlsdGluLmFzbnVtJChjKSxhLnVwZGF0ZUludGVydmFsPWQ/ZDoxfTtiLnNldF9kZWxheT1uZXcgU2suYnVpbHRpbi5mdW5jKGkpLGIuc2V0RGVsYXk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKTt2YXIgaj1mdW5jdGlvbihhKXt2YXIgYixkPVtdO2ZvcihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRwaXhlbHNcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxiPTA7YjxhLmltYWdlLmhlaWdodCphLmltYWdlLndpZHRoO2IrKylkW2JdPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmdldFBpeGVsLFthLGIlYS5pbWFnZS53aWR0aCxjKGIvYS5pbWFnZS53aWR0aCldKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoZCl9O2IuZ2V0X3BpeGVscz1uZXcgU2suYnVpbHRpbi5mdW5jKGopLGIuZ2V0UGl4ZWxzPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5nZXREYXRhPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGIsZCxlLGcsaCxqLGssbD1bXTtmb3IoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0RGF0YVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLGI9MDtiPGEuaW1hZ2UuaGVpZ2h0KmEuaW1hZ2Uud2lkdGg7YisrKWQ9YiVhLmltYWdlLndpZHRoLGU9YyhiL2EuaW1hZ2Uud2lkdGgpLGYoYSxkLGUpLGs9NCplKmEud2lkdGgrNCpkLGc9YS5pbWFnZWRhdGEuZGF0YVtrXSxoPWEuaW1hZ2VkYXRhLmRhdGFbaysxXSxqPWEuaW1hZ2VkYXRhLmRhdGFbaysyXSxsW2JdPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKGcpLG5ldyBTay5idWlsdGluLmludF8oaCksbmV3IFNrLmJ1aWx0aW4uaW50XyhqKV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGwpfSk7dmFyIGs9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZyxpO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRwaXhlbFxcXCIsYXJndW1lbnRzLmxlbmd0aCwzLDMpLGI9U2suYnVpbHRpbi5hc251bSQoYiksYz1Tay5idWlsdGluLmFzbnVtJChjKSxmKGEsYixjKSxpPTQqYyphLndpZHRoKzQqYixkPWEuaW1hZ2VkYXRhLmRhdGFbaV0sZz1hLmltYWdlZGF0YS5kYXRhW2krMV0sZT1hLmltYWdlZGF0YS5kYXRhW2krMl0sU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGguUGl4ZWwsW2QsZyxlLGIsY10pfTtiLmdldF9waXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKGspLGIuZ2V0UGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKSxkPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbjtyZXR1cm4gZC5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxkLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6bmV3IFByb21pc2UoZnVuY3Rpb24oZCl7dmFyIGU9TWF0aC5tYXgsZj1NYXRoLmFicyxnPU1hdGgubWluO2EudXBkYXRlQ291bnQrKywwPT1hLnVwZGF0ZUNvdW50JWEudXBkYXRlSW50ZXJ2YWw/KGEubGFzdHgrYS51cGRhdGVJbnRlcnZhbD49YS53aWR0aD9hLmxhc3RDdHgucHV0SW1hZ2VEYXRhKGEuaW1hZ2VkYXRhLGEubGFzdFVseCxhLmxhc3RVbHksMCxhLmxhc3R5LGEud2lkdGgsMik6YS5sYXN0eSthLnVwZGF0ZUludGVydmFsPj1hLmhlaWdodD9hLmxhc3RDdHgucHV0SW1hZ2VEYXRhKGEuaW1hZ2VkYXRhLGEubGFzdFVseCxhLmxhc3RVbHksYS5sYXN0eCwwLDIsYS5oZWlnaHQpOmEubGFzdEN0eC5wdXRJbWFnZURhdGEoYS5pbWFnZWRhdGEsYS5sYXN0VWx4LGEubGFzdFVseSxnKGIsYS5sYXN0eCksZyhjLGEubGFzdHkpLGUoZihiLWEubGFzdHgpLDEpLGUoZihjLWEubGFzdHkpLDEpKSxhLmxhc3R4PWIsYS5sYXN0eT1jLDA8YS5kZWxheT93aW5kb3cuc2V0VGltZW91dChkLGEuZGVsYXkpOmQoKSk6ZCgpfSl9LGR9O3ZhciBsPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBnO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRwaXhlbFxcXCIsYXJndW1lbnRzLmxlbmd0aCw0LDQpLGI9U2suYnVpbHRpbi5hc251bSQoYiksYz1Tay5idWlsdGluLmFzbnVtJChjKSxmKGEsYixjKSxnPTQqYyphLndpZHRoKzQqYixhLmltYWdlZGF0YS5kYXRhW2ddPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldFJlZCxbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2crMV09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0R3JlZW4sW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzJdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldEJsdWUsW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzNdPTI1NSxkKGEsYixjKX07Yi5zZXRfcGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKSxiLnNldFBpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobCk7dmFyIG09ZnVuY3Rpb24oYSxiLGUpe3ZhciBnLGgsaTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0cGl4ZWxhdFxcXCIsYXJndW1lbnRzLmxlbmd0aCwzLDMpLGI9U2suYnVpbHRpbi5hc251bSQoYiksZz1iJWEuaW1hZ2Uud2lkdGgsaD1jKGIvYS5pbWFnZS53aWR0aCksZihhLGcsaCksaT00KmgqYS53aWR0aCs0KmcsYS5pbWFnZWRhdGEuZGF0YVtpXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRSZWQsW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtpKzFdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldEdyZWVuLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbaSsyXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRCbHVlLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbaSszXT0yNTUsZChhLGcsaCl9O2Iuc2V0X3BpeGVsX2F0PW5ldyBTay5idWlsdGluLmZ1bmMobSksYi5zZXRQaXhlbEF0PW5ldyBTay5idWlsdGluLmZ1bmMobSk7dmFyIG49ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGc7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInVwZGF0ZXBpeGVsXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYz1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRYLFtiXSkpLGU9U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuZ2V0WSxbYl0pKSxmKGEsYyxlKSxnPTQqZSphLndpZHRoKzQqYyxhLmltYWdlZGF0YS5kYXRhW2ddPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldFJlZCxbYl0pKSxhLmltYWdlZGF0YS5kYXRhW2crMV09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuZ2V0R3JlZW4sW2JdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzJdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldEJsdWUsW2JdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzNdPTI1NSxkKGEsYyxlKX07Yi51cGRhdGVfcGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhuKSxiLnVwZGF0ZVBpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobik7dmFyIG89ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldGhlaWdodFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLG5ldyBTay5idWlsdGluLmludF8oYS5oZWlnaHQpfTtiLmdldF9oZWlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhvKSxiLmdldEhlaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKG8pO3ZhciBwPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXR3aWR0aFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLG5ldyBTay5idWlsdGluLmludF8oYS53aWR0aCl9O2IuZ2V0X3dpZHRoPW5ldyBTay5idWlsdGluLmZ1bmMocCksYi5nZXRXaWR0aD1uZXcgU2suYnVpbHRpbi5mdW5jKHApLGIuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImhlaWdodFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGEuaGVpZ2h0KTpcXFwid2lkdGhcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEud2lkdGgpOnZvaWQgMH0pLGIuX19zZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwiaGVpZ2h0XFxcIj09PWJ8fFxcXCJ3aWR0aFxcXCI9PT1iKXRocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcXFwiQ2Fubm90IGNoYW5nZSBoZWlnaHQgb3Igd2lkdGggdGhleSBjYW4gb25seSBiZSBzZXQgb24gY3JlYXRpb25cXFwiKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcXFwiVW5rbm93biBhdHRyaWJ1dGU6IFxcXCIrYil9KSxiLmRyYXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXt2YXIgZTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZHJhd1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpLGU9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb24sZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxlLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6bmV3IFByb21pc2UoZnVuY3Rpb24oZSl7dmFyIGYsZztiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGM9U2suYnVpbHRpbi5hc251bSQoYyksZD1Tay5idWlsdGluLmFzbnVtJChkKSxmPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldFdpbixbYl0pLGc9Zi5nZXRDb250ZXh0KFxcXCIyZFxcXCIpLHZvaWQgMD09PWMmJihjPTAsZD0wKSxhLmxhc3RVbHg9YyxhLmxhc3RVbHk9ZCxhLmxhc3RDdHg9ZyxnLnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxjLGQpLDA8YS5kZWxheT93aW5kb3cuc2V0VGltZW91dChlLGEuZGVsYXkpOndpbmRvdy5zZXRUaW1lb3V0KGUsMjAwKX0pfSxlfSl9LFxcXCJJbWFnZVxcXCIsW10pLGM9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDMsMyksYS53aWR0aD1Tay5idWlsdGluLmFzbnVtJChiKSxhLmhlaWdodD1Tay5idWlsdGluLmFzbnVtJChjKSxhLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJjYW52YXNcXFwiKSxhLmN0eD1hLmNhbnZhcy5nZXRDb250ZXh0KFxcXCIyZFxcXCIpLGEuY2FudmFzLmhlaWdodD1hLmhlaWdodCxhLmNhbnZhcy53aWR0aD1hLndpZHRoLGEuaW1hZ2VkYXRhPWEuY3R4LmdldEltYWdlRGF0YSgwLDAsYS53aWR0aCxhLmhlaWdodCl9KX0saC5FbXB0eUltYWdlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxjLFxcXCJFbXB0eUltYWdlXFxcIixbaC5JbWFnZV0pLGI9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQsZSxiLGYpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDQsNiksYS5yZWQ9U2suYnVpbHRpbi5hc251bSQoYyksYS5ncmVlbj1Tay5idWlsdGluLmFzbnVtJChkKSxhLmJsdWU9U2suYnVpbHRpbi5hc251bSQoZSksYS54PVNrLmJ1aWx0aW4uYXNudW0kKGIpLGEueT1Tay5idWlsdGluLmFzbnVtJChmKX0pO3ZhciBjPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRyZWRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLmFzc2skKGEucmVkKX07Yi5nZXRfcmVkPW5ldyBTay5idWlsdGluLmZ1bmMoYyksYi5nZXRSZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhjKTt2YXIgZD1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0Z3JlZW5cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLmFzc2skKGEuZ3JlZW4pfTtiLmdldF9ncmVlbj1uZXcgU2suYnVpbHRpbi5mdW5jKGQpLGIuZ2V0R3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhkKTt2YXIgZT1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0Ymx1ZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4uYXNzayQoYS5ibHVlKX07Yi5nZXRfYmx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGUpLGIuZ2V0Qmx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGUpO3ZhciBmPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXR4XFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLngpfTtiLmdldF94PW5ldyBTay5idWlsdGluLmZ1bmMoZiksYi5nZXRYPW5ldyBTay5idWlsdGluLmZ1bmMoZik7dmFyIGc9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldHlcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLmFzc2skKGEueSl9O2IuZ2V0X3k9bmV3IFNrLmJ1aWx0aW4uZnVuYyhnKSxiLmdldFk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhnKTt2YXIgaD1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHJlZFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGEucmVkPVNrLmJ1aWx0aW4uYXNudW0kKGIpfTtiLnNldF9yZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhoKSxiLnNldFJlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGgpO3ZhciBpPWZ1bmN0aW9uKGEsYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0Z3JlZW5cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLmdyZWVuPVNrLmJ1aWx0aW4uYXNudW0kKGIpfTtiLnNldF9ncmVlbj1uZXcgU2suYnVpbHRpbi5mdW5jKGkpLGIuc2V0R3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKTt2YXIgaj1mdW5jdGlvbihhLGMpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldGJsdWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLmJsdWU9U2suYnVpbHRpbi5hc251bSQoYyl9O2Iuc2V0X2JsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhqKSxiLnNldEJsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhqKSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJyZWRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLnJlZCk6XFxcImdyZWVuXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLmdyZWVuKTpcXFwiYmx1ZVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS5ibHVlKTp2b2lkIDB9KSxiLl9fc2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9U2suZmZpLnJlbWFwVG9KcyhiKSwoXFxcInJlZFxcXCI9PT1ifHxcXFwiZ3JlZW5cXFwiPT09Ynx8XFxcImJsdWVcXFwiPT09YikmJihhW2JdPVNrLmJ1aWx0aW4uYXNudW0kKGMpKX0pO3ZhciBrPWZ1bmN0aW9uKGEsYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0eFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGEueD1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfeD1uZXcgU2suYnVpbHRpbi5mdW5jKGspLGIuc2V0WD1uZXcgU2suYnVpbHRpbi5mdW5jKGspO3ZhciBsPWZ1bmN0aW9uKGEsYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0eVxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGEueT1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfeT1uZXcgU2suYnVpbHRpbi5mdW5jKGwpLGIuc2V0WT1uZXcgU2suYnVpbHRpbi5mdW5jKGwpLGIuX19nZXRpdGVtX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLDA9PT1iKT9hLnJlZDoxPT1iP2EuZ3JlZW46Mj09Yj9hLmJsdWU6dm9pZCAwfSksYi5fX3N0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoXFxcIltcXFwiK2EucmVkK1xcXCIsXFxcIithLmdyZWVuK1xcXCIsXFxcIithLmJsdWUrXFxcIl1cXFwiKX0pLGIuZ2V0Q29sb3JUdXBsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7fSksYi5zZXRSYW5nZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS5tYXg9U2suYnVpbHRpbi5hc251bSQoYil9KX0saC5QaXhlbD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGgsYixcXFwiUGl4ZWxcXFwiLFtdKSxhPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwzKSxkPUltYWdlTW9kLmNhbnZhc0xpYltTay5jYW52YXNdLHZvaWQgMD09PWQ/KGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIiksZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChTay5jYW52YXMpLGEudGhlU2NyZWVuPWUsZi5hcHBlbmRDaGlsZChlKSxJbWFnZU1vZC5jYW52YXNMaWJbU2suY2FudmFzXT1lLEltYWdlTW9kLmNhbnZhc0xpYltTay5jYW52YXNdPWEudGhlU2NyZWVuKTooYS50aGVTY3JlZW49ZCxhLnRoZVNjcmVlbi5oZWlnaHQ9YS50aGVTY3JlZW4uaGVpZ2h0KSx2b2lkIDA9PT1iPyhTay5hdmFpbGFibGVIZWlnaHQmJihhLnRoZVNjcmVlbi5oZWlnaHQ9U2suYXZhaWxhYmxlSGVpZ2h0KSxTay5hdmFpbGFibGVXaWR0aCYmKGEudGhlU2NyZWVuLndpZHRoPVNrLmF2YWlsYWJsZVdpZHRoKSk6KGEudGhlU2NyZWVuLmhlaWdodD1jLnYsYS50aGVTY3JlZW4ud2lkdGg9Yi52KSxhLnRoZVNjcmVlbi5zdHlsZS5kaXNwbGF5PVxcXCJibG9ja1xcXCJ9KSxiLmdldFdpbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBhLnRoZVNjcmVlbn0pLGIuZXhpdG9uY2xpY2s9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnRoZVNjcmVlbi5pZDthLnRoZVNjcmVlbi5vbmNsaWNrPWZ1bmN0aW9uKCl7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikuc3R5bGUuZGlzcGxheT1cXFwibm9uZVxcXCIsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikub25jbGljaz1udWxsLGRlbGV0ZSBJbWFnZU1vZC5jYW52YXNMaWJbYl19fSl9LGguSW1hZ2VXaW49U2subWlzY2V2YWwuYnVpbGRDbGFzcyhoLGEsXFxcIkltYWdlV2luXFxcIixbXSksaH07XCIsXCJzcmMvbGliL2ltYXBsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImltYXBsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pbWdoZHIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImltZ2hkciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ltcHV0aWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImltcHV0aWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pby5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaW8gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pdGVydG9vbHMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGNvbWJpbmF0aW9uc05ldyhhLGIsYyl7bGV0IGQsZTtbZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhhLnRwJG5hbWUsW1xcXCJpdGVyYWJsZVxcXCIsXFxcInJcXFwiXSxiLGMsW10pO2NvbnN0IGY9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoZCk7aWYoZT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZSxTay5idWlsdGluLk92ZXJGbG93RXJyb3IpLDA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJyIG11c3QgYmUgbm9uLW5lZ2F0aXZlXFxcIik7aWYodGhpcz09PWEpcmV0dXJuIG5ldyBhLmNvbnN0cnVjdG9yKGYsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmNvbnN0cnVjdG9yLmNhbGwoYixmLGUpLGJ9fXZhciBhPXt9O3JldHVybiBhLmFjY3VtdWxhdGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuYWNjdW11bGF0ZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGFjY3VtdWxhdGUoYSxiLGMpe3RoaXMuaXRlcj1hLHRoaXMuZnVuYz1iLHRoaXMudG90YWw9Yyx0aGlzLnRwJGl0ZXJuZXh0PSgpPT4odGhpcy50b3RhbD1Tay5idWlsdGluLmNoZWNrTm9uZSh0aGlzLnRvdGFsKT90aGlzLml0ZXIudHAkaXRlcm5leHQoKTp0aGlzLnRvdGFsLHRoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQsdGhpcy50b3RhbCl9LGl0ZXJuZXh0KCl7bGV0IGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwIT09YSlyZXR1cm4gdGhpcy50b3RhbD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5mdW5jLFt0aGlzLnRvdGFsLGFdKSx0aGlzLnRvdGFsfSxzbG90czp7dHAkZG9jOlxcXCJhY2N1bXVsYXRlKGl0ZXJhYmxlWywgZnVuYywgaW5pdGlhbF0pIC0tPiBhY2N1bXVsYXRlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc2VyaWVzIG9mIGFjY3VtdWxhdGVkIHN1bXMgKG9yIG90aGVyIGJpbmFyeSBmdW5jdGlvbiByZXN1bHRzKS5cXFwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiYWNjdW11bGF0ZVxcXCIsYiwwLDIpO2xldFtkLGUsZl09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImFjY3VtdWxhdGVcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJmdW5jXFxcIixcXFwiaW5pdGlhbFxcXCJdLGIsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO2lmKGQ9U2suYWJzdHIuaXRlcihkKSxlPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGUpP25ldyBTay5idWlsdGluLmZ1bmMoKGMsYSk9PlNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiQWRkXFxcIikpOmUsdGhpcz09PWEuYWNjdW11bGF0ZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmFjY3VtdWxhdGUoZCxlLGYpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5hY2N1bXVsYXRlLmNhbGwoYixkLGUsZiksYn19fX0pLGEuY2hhaW49U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY2hhaW5cXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjaGFpbihhKXt0aGlzLml0ZXJhYmxlcz1hLHRoaXMuY3VycmVudF9pdD1udWxsLHRoaXMudHAkaXRlcm5leHQ9KCk9Pih0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LHRoaXMuY3VycmVudF9pdD10aGlzLml0ZXJhYmxlcy50cCRpdGVybmV4dCgpLHZvaWQgMD09PXRoaXMuY3VycmVudF9pdCk/dm9pZCh0aGlzLnRwJGl0ZXJuZXh0PSgpPT52b2lkIDApOih0aGlzLmN1cnJlbnRfaXQ9U2suYWJzdHIuaXRlcih0aGlzLmN1cnJlbnRfaXQpLHRoaXMudHAkaXRlcm5leHQoKSl9LGl0ZXJuZXh0KCl7Zm9yKGxldCBhO3ZvaWQgMD09PWE7KWlmKGE9dGhpcy5jdXJyZW50X2l0LnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09YSl7aWYodGhpcy5jdXJyZW50X2l0PXRoaXMuaXRlcmFibGVzLnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09dGhpcy5jdXJyZW50X2l0KXJldHVybiB2b2lkKHRoaXMudHAkaXRlcm5leHQ9KCk9PnZvaWQgMCk7dGhpcy5jdXJyZW50X2l0PVNrLmFic3RyLml0ZXIodGhpcy5jdXJyZW50X2l0KX1lbHNlIHJldHVybiBhfSxzbG90czp7dHAkZG9jOlxcXCJjaGFpbigqaXRlcmFibGVzKSAtLT4gY2hhaW4gb2JqZWN0XFxcXG5cXFxcblJldHVybiBhIGNoYWluIG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBlbGVtZW50cyBmcm9tIHRoZVxcXFxuZmlyc3QgaXRlcmFibGUgdW50aWwgaXQgaXMgZXhoYXVzdGVkLCB0aGVuIGVsZW1lbnRzIGZyb20gdGhlIG5leHRcXFxcbml0ZXJhYmxlLCB1bnRpbCBhbGwgb2YgdGhlIGl0ZXJhYmxlcyBhcmUgZXhoYXVzdGVkLlxcXCIsdHAkbmV3KGIsYyl7aWYoU2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiY2hhaW5cXFwiLGMpLGI9bmV3IFNrLmJ1aWx0aW4udHVwbGUoYi5zbGljZSgwKSkudHAkaXRlcigpLHRoaXM9PT1hLmNoYWluLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuY2hhaW4oYik7ZWxzZXtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmNoYWluLmNhbGwoYyxiKSxjfX19LGNsYXNzbWV0aG9kczp7ZnJvbV9pdGVyYWJsZTp7JG1ldGgoYil7Y29uc3QgYz1Tay5hYnN0ci5pdGVyKGIpO3JldHVybiBuZXcgYS5jaGFpbihjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XFxcImNoYWluLmZyb21faXRlcmFibGUoaXRlcmFibGUpIC0tPiBjaGFpbiBvYmplY3RcXFxcblxcXFxuQWx0ZXJuYXRlIGNoYWluKCkgY29uc3RydWN0b3IgdGFraW5nIGEgc2luZ2xlIGl0ZXJhYmxlIGFyZ3VtZW50XFxcXG50aGF0IGV2YWx1YXRlcyBsYXppbHkuXFxcIiwkdGV4dHNpZzpudWxsfX19KSxhLmNvbWJpbmF0aW9ucz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jb21iaW5hdGlvbnNcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjb21iaW5hdGlvbnMoYSxiKXt0aGlzLnBvb2w9YSx0aGlzLnI9Yix0aGlzLmluZGljZXM9QXJyYXkoYikuZmlsbCgpLm1hcCgoYSxiKT0+YiksdGhpcy5uPWEubGVuZ3RoLHRoaXMudHAkaXRlcm5leHQ9KCk9PntpZighKHRoaXMucj50aGlzLm4pKXJldHVybiB0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMucG9vbC5zbGljZSgwLHRoaXMucikpfX0saXRlcm5leHQoKXtsZXQgYSxiPSExO2ZvcihhPXRoaXMuci0xOzA8PWE7YS0tKWlmKHRoaXMuaW5kaWNlc1thXSE9YSt0aGlzLm4tdGhpcy5yKXtiPSEwO2JyZWFrfWlmKCFiKXJldHVybiB2b2lkKHRoaXMucj0wKTt0aGlzLmluZGljZXNbYV0rKztmb3IobGV0IGI9YSsxO2I8dGhpcy5yO2IrKyl0aGlzLmluZGljZXNbYl09dGhpcy5pbmRpY2VzW2ItMV0rMTtjb25zdCBjPXRoaXMuaW5kaWNlcy5tYXAoYT0+dGhpcy5wb29sW2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYyl9LHNsb3RzOnt0cCRkb2M6XFxcImNvbWJpbmF0aW9ucyhpdGVyYWJsZSwgcikgLS0+IGNvbWJpbmF0aW9ucyBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHN1Y2Nlc3NpdmUgci1sZW5ndGggY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIGluIHRoZSBpdGVyYWJsZS5cXFxcblxcXFxuY29tYmluYXRpb25zKHJhbmdlKDQpLCAzKSAtLT4gKDAsMSwyKSwgKDAsMSwzKSwgKDAsMiwzKSwgKDEsMiwzKVxcXCIsdHAkbmV3KGIsYyl7cmV0dXJuIGNvbWJpbmF0aW9uc05ldy5jYWxsKHRoaXMsYS5jb21iaW5hdGlvbnMucHJvdG90eXBlLGIsYyl9fX0pLGEuY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnRcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudChhLGIpe3RoaXMucG9vbD1hLHRoaXMucj1iLHRoaXMuaW5kaWNlcz1BcnJheShiKS5maWxsKDApLHRoaXMubj1hLmxlbmd0aCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYoIXRoaXMucnx8dGhpcy5uKXt0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0O2NvbnN0IGE9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShhKX19fSxpdGVybmV4dCgpe2xldCBhLGI9ITE7Zm9yKGE9dGhpcy5yLTE7MDw9YTthLS0paWYodGhpcy5pbmRpY2VzW2FdIT10aGlzLm4tMSl7Yj0hMDticmVha31pZighYilyZXR1cm4gdm9pZCh0aGlzLnI9MCk7Y29uc3QgYz10aGlzLmluZGljZXNbYV0rMTtmb3IobGV0IGI9YTtiPHRoaXMucjtiKyspdGhpcy5pbmRpY2VzW2JdPWM7Y29uc3QgZD10aGlzLmluZGljZXMubWFwKGE9PnRoaXMucG9vbFthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGQpfSxzbG90czp7dHAkZG9jOlxcXCJjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudChpdGVyYWJsZSwgcikgLS0+IGNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50IG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSByLWxlbmd0aCBjb21iaW5hdGlvbnMgb2YgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlXFxcXG5hbGxvd2luZyBpbmRpdmlkdWFsIGVsZW1lbnRzIHRvIGhhdmUgc3VjY2Vzc2l2ZSByZXBlYXRzLlxcXFxuY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoJ0FCQycsIDIpIC0tPiBBQSBBQiBBQyBCQiBCQyBDQ1xcXCIsdHAkbmV3KGIsYyl7cmV0dXJuIGNvbWJpbmF0aW9uc05ldy5jYWxsKHRoaXMsYS5jb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudC5wcm90b3R5cGUsYixjKX19fSksYS5jb21wcmVzcz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jb21wcmVzc1xcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGNvbXByZXNzKGEsYil7dGhpcy5kYXRhPWEsdGhpcy5zZWxlY3RvcnM9Yn0saXRlcm5leHQoKXtsZXQgYT10aGlzLmRhdGEudHAkaXRlcm5leHQoKSxiPXRoaXMuc2VsZWN0b3JzLnRwJGl0ZXJuZXh0KCk7Zm9yKDt2b2lkIDAhPT1hJiZ2b2lkIDAhPT1iOyl7aWYoU2subWlzY2V2YWwuaXNUcnVlKGIpKXJldHVybiBhO2E9dGhpcy5kYXRhLnRwJGl0ZXJuZXh0KCksYj10aGlzLnNlbGVjdG9ycy50cCRpdGVybmV4dCgpfX0sc2xvdHM6e3RwJGRvYzpcXFwiY29tcHJlc3MoZGF0YSwgc2VsZWN0b3JzKSAtLT4gaXRlcmF0b3Igb3ZlciBzZWxlY3RlZCBkYXRhXFxcXG5cXFxcblJldHVybiBkYXRhIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdHJ1ZSBzZWxlY3RvciBlbGVtZW50cy5cXFxcbkZvcm1zIGEgc2hvcnRlciBpdGVyYXRvciBmcm9tIHNlbGVjdGVkIGRhdGEgZWxlbWVudHMgdXNpbmcgdGhlXFxcXG5zZWxlY3RvcnMgdG8gY2hvb3NlIHRoZSBkYXRhIGVsZW1lbnRzLlxcXCIsdHAkbmV3KGIsYyl7bGV0IGQsZTtpZihbZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiY29tcHJlc3NcXFwiLFtcXFwiZGF0YVxcXCIsXFxcInNlbGVjdG9yc1xcXCJdLGIsYyxbXSksZD1Tay5hYnN0ci5pdGVyKGQpLGU9U2suYWJzdHIuaXRlcihlKSx0aGlzPT09YS5jb3VudC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmNvbXByZXNzKGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmNvbXByZXNzLmNhbGwoYixkLGUpLGJ9fX19KSxhLmNvdW50PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNvdW50XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY291bnQoYSxiKXt0aGlzLnN0YXJ0PWEsdGhpcy5zdGVwPWJ9LGl0ZXJuZXh0KCl7Y29uc3QgYT10aGlzLnN0YXJ0O3JldHVybiB0aGlzLnN0YXJ0PVNrLmFic3RyLm51bWJlckJpbk9wKHRoaXMuc3RhcnQsdGhpcy5zdGVwLFxcXCJBZGRcXFwiKSxhfSxzbG90czp7dHAkZG9jOlxcXCJjb3VudChzdGFydD0wLCBzdGVwPTEpIC0tPiBjb3VudCBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY291bnQgb2JqZWN0IHdob3NlIC5fX25leHRfXygpIG1ldGhvZCByZXR1cm5zIGNvbnNlY3V0aXZlIHZhbHVlcy5cXFxcbkVxdWl2YWxlbnQgdG86XFxcXG5cXFxcbiAgICBkZWYgY291bnQoZmlyc3R2YWw9MCwgc3RlcD0xKTpcXFxcbiAgICAgICAgeCA9IGZpcnN0dmFsXFxcXG4gICAgICAgIHdoaWxlIDE6XFxcXG4gICAgICAgICAgICB5aWVsZCB4XFxcXG4gICAgICAgICAgICB4ICs9IHN0ZXBcXFxcblxcXCIsdHAkbmV3KGIsYyl7Y29uc3RbZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiY291bnRcXFwiLFtcXFwic3RhcnRcXFwiLFxcXCJzdGVwXFxcIl0sYixjLFtuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMSldKTtpZighU2suYnVpbHRpbi5jaGVja051bWJlcihkKSYmIVNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4KGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiYSBudW1iZXIgaXMgcmVxdWlyZWRcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja051bWJlcihlKSYmIVNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4KGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiYSBudW1iZXIgaXMgcmVxdWlyZWRcXFwiKTtpZih0aGlzPT09YS5jb3VudC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmNvdW50KGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmNvdW50LmNhbGwoYixkLGUpLGJ9fSwkcigpe2NvbnN0IGE9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0YXJ0KTtsZXQgYj1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuc3RlcCk7cmV0dXJuIGI9XFxcIjFcXFwiPT09Yj9cXFwiXFxcIjpcXFwiLCBcXFwiK2IsbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1xcXCIoXFxcIithK2IrXFxcIilcXFwiKX19fSksYS5jeWNsZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jeWNsZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGN5Y2xlKGEpe3RoaXMuaXRlcj1hLHRoaXMuc2F2ZWQ9W10sdGhpcy5jb25zdW1lZD0hMSx0aGlzLmk9MCx0aGlzLmxlbmd0aH0saXRlcm5leHQoKXtsZXQgYTtpZighdGhpcy5jb25zdW1lZCl7aWYoYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKSx2b2lkIDAhPT1hKXJldHVybiB0aGlzLnNhdmVkLnB1c2goYSksYTtpZih0aGlzLmNvbnN1bWVkPSEwLHRoaXMubGVuZ3RoPXRoaXMuc2F2ZWQubGVuZ3RoLCF0aGlzLmxlbmd0aClyZXR1cm59cmV0dXJuIGE9dGhpcy5zYXZlZFt0aGlzLmldLHRoaXMuaT0odGhpcy5pKzEpJXRoaXMubGVuZ3RoLGF9LHNsb3RzOnt0cCRkb2M6XFxcImN5Y2xlKGl0ZXJhYmxlKSAtLT4gY3ljbGUgb2JqZWN0XFxcXG5cXFxcblJldHVybiBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYWJsZSB1bnRpbCBpdCBpcyBleGhhdXN0ZWQuXFxcXG5UaGVuIHJlcGVhdCB0aGUgc2VxdWVuY2UgaW5kZWZpbml0ZWx5LlxcXCIsdHAkbmV3KGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcoXFxcImN5Y2xlXFxcIixiLGMpO2NvbnN0IGQ9U2suYWJzdHIuaXRlcihiWzBdKTtpZih0aGlzPT09YS5jeWNsZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmN5Y2xlKGQpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jeWNsZS5jYWxsKGIsZCksYn19fX0pLGEuZHJvcHdoaWxlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmRyb3B3aGlsZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGRyb3B3aGlsZShhLGIpe3RoaXMucHJlZGljYXRlPWEsdGhpcy5pdGVyPWIsdGhpcy5wYXNzZWR9LGl0ZXJuZXh0KCl7bGV0IGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7Zm9yKDt2b2lkIDA9PT10aGlzLnBhc3NlZCYmdm9pZCAwIT09YTspe2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSk7aWYoIVNrLm1pc2NldmFsLmlzVHJ1ZShiKSlyZXR1cm4gdGhpcy5wYXNzZWQ9ITAsYTthPXRoaXMuaXRlci50cCRpdGVybmV4dCgpfXJldHVybiBhfSxzbG90czp7dHAkZG9jOlxcXCJkcm9wd2hpbGUocHJlZGljYXRlLCBpdGVyYWJsZSkgLS0+IGRyb3B3aGlsZSBvYmplY3RcXFxcblxcXFxuRHJvcCBpdGVtcyBmcm9tIHRoZSBpdGVyYWJsZSB3aGlsZSBwcmVkaWNhdGUoaXRlbSkgaXMgdHJ1ZS5cXFxcbkFmdGVyd2FyZHMsIHJldHVybiBldmVyeSBlbGVtZW50IHVudGlsIHRoZSBpdGVyYWJsZSBpcyBleGhhdXN0ZWQuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJkcm9wd2hpbGVcXFwiLGMpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiZHJvcHdoaWxlXFxcIixiLDIsMik7Y29uc3QgZD1iWzBdLGU9U2suYWJzdHIuaXRlcihiWzFdKTtpZih0aGlzPT09YS5kcm9wd2hpbGUucHJvdG90eXBlKXJldHVybiBuZXcgYS5kcm9wd2hpbGUoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuZHJvcHdoaWxlLmNhbGwoYixkLGUpLGJ9fX19KSxhLmZpbHRlcmZhbHNlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmZpbHRlcmZhbHNlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZmlsdGVyZmFsc2UoYSxiKXt0aGlzLnByZWRpY2F0ZT1hLHRoaXMuaXRlcj1ifSxpdGVybmV4dCgpe2xldCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMCE9PWEpe2ZvcihsZXQgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5wcmVkaWNhdGUsW2FdKTtTay5taXNjZXZhbC5pc1RydWUoYik7KXtpZihhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpLHZvaWQgMD09PWEpcmV0dXJuO2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSl9cmV0dXJuIGF9fSxzbG90czp7dHAkZG9jOlxcXCJmaWx0ZXJmYWxzZShmdW5jdGlvbiBvciBOb25lLCBzZXF1ZW5jZSkgLS0+IGZpbHRlcmZhbHNlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gdGhvc2UgaXRlbXMgb2Ygc2VxdWVuY2UgZm9yIHdoaWNoIGZ1bmN0aW9uKGl0ZW0pIGlzIGZhbHNlLlxcXFxuSWYgZnVuY3Rpb24gaXMgTm9uZSwgcmV0dXJuIHRoZSBpdGVtcyB0aGF0IGFyZSBmYWxzZS5cXFwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImZpbHRlcmZhbHNlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImZpbHRlcmZhbHNlXFxcIixiLDIsMik7Y29uc3QgZD1Tay5idWlsdGluLmNoZWNrTm9uZShiWzBdKT9Tay5idWlsdGluLmJvb2w6YlswXSxlPVNrLmFic3RyLml0ZXIoYlsxXSk7aWYodGhpcz09PWEuZmlsdGVyZmFsc2UucHJvdG90eXBlKXJldHVybiBuZXcgYS5maWx0ZXJmYWxzZShkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5maWx0ZXJmYWxzZS5jYWxsKGIsZCxlKSxifX19fSksYS5fZ3JvdXBlcj1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5fZ3JvdXBlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIF9ncm91cGVyKGEpe3RoaXMuZ3JvdXBieT1hLHRoaXMudGd0a2V5PWEudGd0a2V5LHRoaXMuaWQ9YS5pZH0saXRlcm5leHQoKXtjb25zdCBhPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCh0aGlzLmdyb3VwYnkuY3VycmtleSx0aGlzLnRndGtleSxcXFwiRXFcXFwiKTtpZih0aGlzLmdyb3VwYnkuaWQ9PT10aGlzLmlkJiZhKXtsZXQgYT10aGlzLmdyb3VwYnkuY3VycnZhbDtyZXR1cm4gdGhpcy5ncm91cGJ5LmN1cnJ2YWw9dGhpcy5ncm91cGJ5Lml0ZXIudHAkaXRlcm5leHQoKSx2b2lkIDAhPT10aGlzLmdyb3VwYnkuY3VycnZhbCYmKHRoaXMuZ3JvdXBieS5jdXJya2V5PVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmdyb3VwYnkua2V5ZixbdGhpcy5ncm91cGJ5LmN1cnJ2YWxdKSksYX19fSksYS5ncm91cGJ5PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmdyb3VwYnlcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBncm91cGJ5KGEsYil7dGhpcy5pdGVyPWEsdGhpcy5rZXlmPWIsdGhpcy5jdXJydmFsLHRoaXMuY3VycmtleT10aGlzLnRndGtleT1uZXcgU2suYnVpbHRpbi5vYmplY3QsdGhpcy5pZH0saXRlcm5leHQoKXt0aGlzLmlkPXt9O2ZvcihsZXQgYT1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5jdXJya2V5LHRoaXMudGd0a2V5LFxcXCJFcVxcXCIpO2E7KXtpZih0aGlzLmN1cnJ2YWw9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09dGhpcy5jdXJydmFsKXJldHVybjt0aGlzLmN1cnJrZXk9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMua2V5ZixbdGhpcy5jdXJydmFsXSksYT1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5jdXJya2V5LHRoaXMudGd0a2V5LFxcXCJFcVxcXCIpfXRoaXMudGd0a2V5PXRoaXMuY3VycmtleTtjb25zdCBiPW5ldyBhLl9ncm91cGVyKHRoaXMpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbdGhpcy5jdXJya2V5LGJdKX0sc2xvdHM6e3RwJGRvYzpcXFwiZ3JvdXBieShpdGVyYWJsZSwga2V5PU5vbmUpIC0+IG1ha2UgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGNvbnNlY3V0aXZlXFxcXG5rZXlzIGFuZCBncm91cHMgZnJvbSB0aGUgaXRlcmFibGUuICBJZiB0aGUga2V5IGZ1bmN0aW9uIGlzIG5vdCBzcGVjaWZpZWQgb3JcXFxcbmlzIE5vbmUsIHRoZSBlbGVtZW50IGl0c2VsZiBpcyB1c2VkIGZvciBncm91cGluZy5cXFxcblxcXCIsdHAkbmV3KGIsYyl7bGV0IGQsZTtpZihbZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiZ3JvdXBieVxcXCIsW1xcXCJpdGVyYWJsZVxcXCIsXFxcImtleVxcXCJdLGIsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkXSksZD1Tay5hYnN0ci5pdGVyKGQpLGU9U2suYnVpbHRpbi5jaGVja05vbmUoZSk/bmV3IFNrLmJ1aWx0aW4uZnVuYyhhPT5hKTplLHRoaXM9PT1hLmdyb3VwYnkucHJvdG90eXBlKXJldHVybiBuZXcgYS5ncm91cGJ5KGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmdyb3VwYnkuY2FsbChiLGQsZSksYn19fX0pLGEuaXNsaWNlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmlzbGljZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGlzbGljZShhLGIsYyxkKXt0aGlzLml0ZXI9YSx0aGlzLnByZXZpdD1iLHRoaXMuc3RvcD1jLHRoaXMuc3RlcD1kLHRoaXMudHAkaXRlcm5leHQ9KCk9PntpZih0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LHRoaXMucHJldml0Pj10aGlzLnN0b3Ape2ZvcihsZXQgYT0wO2E8dGhpcy5zdG9wO2ErKyl0aGlzLml0ZXIudHAkaXRlcm5leHQoKTtyZXR1cm59Zm9yKGxldCBhPTA7YTx0aGlzLnByZXZpdDthKyspdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJuIHRoaXMuaXRlci50cCRpdGVybmV4dCgpfX0saXRlcm5leHQoKXtpZih0aGlzLnByZXZpdCt0aGlzLnN0ZXA+PXRoaXMuc3RvcCl7Zm9yKGxldCBhPXRoaXMucHJldml0KzE7YTx0aGlzLnN0b3A7YSsrKXRoaXMucHJldml0Kz10aGlzLnN0ZXAsdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJufWZvcihsZXQgYT10aGlzLnByZXZpdCsxO2E8dGhpcy5wcmV2aXQrdGhpcy5zdGVwO2ErKyl0aGlzLml0ZXIudHAkaXRlcm5leHQoKTtyZXR1cm4gdGhpcy5wcmV2aXQrPXRoaXMuc3RlcCx0aGlzLml0ZXIudHAkaXRlcm5leHQoKX0sc2xvdHM6e3RwJGRvYzpcXFwiaXNsaWNlKGl0ZXJhYmxlLCBzdG9wKSAtLT4gaXNsaWNlIG9iamVjdFxcXFxuaXNsaWNlKGl0ZXJhYmxlLCBzdGFydCwgc3RvcFssIHN0ZXBdKSAtLT4gaXNsaWNlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYW4gaXRlcmF0b3Igd2hvc2UgbmV4dCgpIG1ldGhvZCByZXR1cm5zIHNlbGVjdGVkIHZhbHVlcyBmcm9tIGFuXFxcXG5pdGVyYWJsZS4gIElmIHN0YXJ0IGlzIHNwZWNpZmllZCwgd2lsbCBza2lwIGFsbCBwcmVjZWRpbmcgZWxlbWVudHM7XFxcXG5vdGhlcndpc2UsIHN0YXJ0IGRlZmF1bHRzIHRvIHplcm8uICBTdGVwIGRlZmF1bHRzIHRvIG9uZS4gIElmXFxcXG5zcGVjaWZpZWQgYXMgYW5vdGhlciB2YWx1ZSwgc3RlcCBkZXRlcm1pbmVzIGhvdyBtYW55IHZhbHVlcyBhcmUgXFxcXG5za2lwcGVkIGJldHdlZW4gc3VjY2Vzc2l2ZSBjYWxscy4gIFdvcmtzIGxpa2UgYSBzbGljZSgpIG9uIGEgbGlzdFxcXFxuYnV0IHJldHVybnMgYW4gaXRlcmF0b3IuXFxcIix0cCRuZXcoYixjKXt2YXIgZD1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJpc2xpY2VcXFwiLGMpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXNsaWNlXFxcIixiLDIsNCk7Y29uc3QgZT1Tay5hYnN0ci5pdGVyKGJbMF0pO2xldCBmPWJbMV0sZz1iWzJdLGg9YlszXTtpZih2b2lkIDA9PT1nPyhnPWYsZj1Tay5idWlsdGluLm5vbmUubm9uZSQsaD1Tay5idWlsdGluLm5vbmUubm9uZSQpOnZvaWQgMD09PWgmJihoPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCksIShTay5idWlsdGluLmNoZWNrTm9uZShnKXx8U2subWlzY2V2YWwuaXNJbmRleChnKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiU3RvcCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtlbHNlIGlmKGc9U2suYnVpbHRpbi5jaGVja05vbmUoZyk/ZDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZyksMD5nfHxnPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiU3RvcCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtpZighKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpfHxTay5taXNjZXZhbC5pc0luZGV4KGYpKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJJbmRpY2VzIGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLlxcXCIpO2Vsc2UgaWYoZj1Tay5idWlsdGluLmNoZWNrTm9uZShmKT8wOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChmKSwwPmZ8fGY+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJJbmRpY2VzIGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLlxcXCIpO2lmKCEoU2suYnVpbHRpbi5jaGVja05vbmUoaCl8fFNrLm1pc2NldmFsLmlzSW5kZXgoaCkpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0ZXAgZm9yIGlzbGljZSgpIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIE5vbmVcXFwiKTtlbHNlIGlmKGg9U2suYnVpbHRpbi5jaGVja05vbmUoaCk/MTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoaCksMD49aHx8aD5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0ZXAgZm9yIGlzbGljZSgpIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIE5vbmUuXFxcIik7aWYodGhpcz09PWEuaXNsaWNlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuaXNsaWNlKGUsZixnLGgpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5pc2xpY2UuY2FsbChiLGUsZixnLGgpLGJ9fX19KSxhLnBlcm11dGF0aW9ucz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5wZXJtdXRhdGlvbnNcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBwZXJtdXRhdGlvbnMoYSxiKXt0aGlzLnBvb2w9YSx0aGlzLnI9Yjtjb25zdCBjPWEubGVuZ3RoO3RoaXMuaW5kaWNlcz1BcnJheShjKS5maWxsKCkubWFwKChhLGIpPT5iKSx0aGlzLmN5Y2xlcz1BcnJheShiKS5maWxsKCkubWFwKChhLGIpPT5jLWIpLHRoaXMubj1jLHRoaXMudHAkaXRlcm5leHQ9KCk9PntpZighKHRoaXMucj50aGlzLm4pKXJldHVybiB0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMucG9vbC5zbGljZSgwLHRoaXMucikpfX0saXRlcm5leHQoKXtmb3IobGV0IGE9dGhpcy5yLTE7MDw9YTthLS0paWYodGhpcy5jeWNsZXNbYV0tLSwwPT10aGlzLmN5Y2xlc1thXSl0aGlzLmluZGljZXMucHVzaCh0aGlzLmluZGljZXMuc3BsaWNlKGEsMSlbMF0pLHRoaXMuY3ljbGVzW2FdPXRoaXMubi1hO2Vsc2V7aj10aGlzLmN5Y2xlc1thXSxbdGhpcy5pbmRpY2VzW2FdLHRoaXMuaW5kaWNlc1t0aGlzLm4tal1dPVt0aGlzLmluZGljZXNbdGhpcy5uLWpdLHRoaXMuaW5kaWNlc1thXV07Y29uc3QgYj10aGlzLmluZGljZXMubWFwKGE9PnRoaXMucG9vbFthXSkuc2xpY2UoMCx0aGlzLnIpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShiKX10aGlzLnI9MH0sc2xvdHM6e3RwJGRvYzpcXFwicGVybXV0YXRpb25zKGl0ZXJhYmxlWywgcl0pIC0tPiBwZXJtdXRhdGlvbnMgb2JqZWN0XFxcXG5cXFxcblJldHVybiBzdWNjZXNzaXZlIHItbGVuZ3RoIHBlcm11dGF0aW9ucyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUuXFxcXG5cXFxcbnBlcm11dGF0aW9ucyhyYW5nZSgzKSwgMikgLS0+ICgwLDEpLCAoMCwyKSwgKDEsMCksICgxLDIpLCAoMiwwKSwgKDIsMSlcXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7W2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcInBlcm11dGF0aW9uc1xcXCIsW1xcXCJpdGVyYWJsZVxcXCIsXFxcInJcXFwiXSxiLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO2NvbnN0IGY9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoZCk7aWYoZT1Tay5idWlsdGluLmNoZWNrTm9uZShlKT9mLmxlbmd0aDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZSxTay5idWlsdGluLk92ZXJGbG93RXJyb3IpLDA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJyIG11c3QgYmUgbm9uLW5lZ2F0aXZlXFxcIik7aWYodGhpcz09PWEucGVybXV0YXRpb25zLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEucGVybXV0YXRpb25zKGYsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnBlcm11dGF0aW9ucy5jYWxsKGIsZixlKSxifX19fSksYS5wcm9kdWN0PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLnByb2R1Y3RcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBwcm9kdWN0KGEpe3RoaXMucG9vbHM9YSx0aGlzLm49YS5sZW5ndGgsdGhpcy5pbmRpY2VzPUFycmF5KGEubGVuZ3RoKS5maWxsKDApLHRoaXMucG9vbF9zaXplcz1hLm1hcChhPT5hLmxlbmd0aCksdGhpcy50cCRpdGVybmV4dD0oKT0+e3RoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQ7Y29uc3QgYT10aGlzLmluZGljZXMubWFwKChhLGIpPT50aGlzLnBvb2xzW2JdW3RoaXMuaW5kaWNlc1tiXV0pO3JldHVybiBhLnNvbWUoYT0+dm9pZCAwPT09YSk/dm9pZCh0aGlzLm49MCk6bmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9fSxpdGVybmV4dCgpe2ZvcihsZXQgYT10aGlzLm4tMTswPD1hJiZhPHRoaXMubjspdGhpcy5pbmRpY2VzW2FdKyssdGhpcy5pbmRpY2VzW2FdPj10aGlzLnBvb2xfc2l6ZXNbYV0/KHRoaXMuaW5kaWNlc1thXT0tMSxhLS0pOmErKztpZighdGhpcy5ufHx0aGlzLmluZGljZXMuZXZlcnkoYT0+LTE9PT1hKSlyZXR1cm4gdm9pZCh0aGlzLm49MCk7ZWxzZXtjb25zdCBhPXRoaXMuaW5kaWNlcy5tYXAoKGEsYik9PnRoaXMucG9vbHNbYl1bdGhpcy5pbmRpY2VzW2JdXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGEpfX0sc2xvdHM6e3RwJGRvYzpcXFwicHJvZHVjdCgqaXRlcmFibGVzLCByZXBlYXQ9MSkgLS0+IHByb2R1Y3Qgb2JqZWN0XFxcXG5cXFxcbkNhcnRlc2lhbiBwcm9kdWN0IG9mIGlucHV0IGl0ZXJhYmxlcy4gIEVxdWl2YWxlbnQgdG8gbmVzdGVkIGZvci1sb29wcy5cXFxcblxcXFxuRm9yIGV4YW1wbGUsIHByb2R1Y3QoQSwgQikgcmV0dXJucyB0aGUgc2FtZSBhczogICgoeCx5KSBmb3IgeCBpbiBBIGZvciB5IGluIEIpLlxcXFxuVGhlIGxlZnRtb3N0IGl0ZXJhdG9ycyBhcmUgaW4gdGhlIG91dGVybW9zdCBmb3ItbG9vcCwgc28gdGhlIG91dHB1dCB0dXBsZXNcXFxcbmN5Y2xlIGluIGEgbWFubmVyIHNpbWlsYXIgdG8gYW4gb2RvbWV0ZXIgKHdpdGggdGhlIHJpZ2h0bW9zdCBlbGVtZW50IGNoYW5naW5nXFxcXG5vbiBldmVyeSBpdGVyYXRpb24pLlxcXFxuXFxcXG5UbyBjb21wdXRlIHRoZSBwcm9kdWN0IG9mIGFuIGl0ZXJhYmxlIHdpdGggaXRzZWxmLCBzcGVjaWZ5IHRoZSBudW1iZXJcXFxcbm9mIHJlcGV0aXRpb25zIHdpdGggdGhlIG9wdGlvbmFsIHJlcGVhdCBrZXl3b3JkIGFyZ3VtZW50LiBGb3IgZXhhbXBsZSxcXFxcbnByb2R1Y3QoQSwgcmVwZWF0PTQpIG1lYW5zIHRoZSBzYW1lIGFzIHByb2R1Y3QoQSwgQSwgQSwgQSkuXFxcXG5cXFxcbnByb2R1Y3QoJ2FiJywgcmFuZ2UoMykpIC0tPiAoJ2EnLDApICgnYScsMSkgKCdhJywyKSAoJ2InLDApICgnYicsMSkgKCdiJywyKVxcXFxucHJvZHVjdCgoMCwxKSwgKDAsMSksICgwLDEpKSAtLT4gKDAsMCwwKSAoMCwwLDEpICgwLDEsMCkgKDAsMSwxKSAoMSwwLDApIC4uLlxcXCIsdHAkbmV3KGIsYyl7bGV0W2RdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJwcm9kdWN0XFxcIixbXFxcInJlcGVhdFxcXCJdLFtdLGMsW25ldyBTay5idWlsdGluLmludF8oMSldKTtpZihkPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChkLFNrLmJ1aWx0aW4uT3ZlckZsb3dFcnJvciksMD5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcInJlcGVhdCBhcmd1bWVudCBjYW5ub3QgYmUgbmVnYXRpdmVcXFwiKTtjb25zdCBlPVtdO2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSsrKWUucHVzaChTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShiW2FdKSk7Y29uc3QgZj1bXS5jb25jYXQoLi4uQXJyYXkoZCkuZmlsbChlKSk7aWYodGhpcz09PWEucHJvZHVjdC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnByb2R1Y3QoZik7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnByb2R1Y3QuY2FsbChiLGYpLGJ9fX19KSxhLnJlcGVhdD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5yZXBlYXRcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiByZXBlYXQoYSxiKXt0aGlzLm9iamVjdD1hLHRoaXMudGltZXM9Yix2b2lkIDA9PT1iJiYodGhpcy50cCRpdGVybmV4dD0oKT0+dGhpcy5vYmplY3QpfSxpdGVybmV4dCgpe3JldHVybiAwPHRoaXMudGltZXMtLT90aGlzLm9iamVjdDp2b2lkIDB9LHNsb3RzOnt0cCRkb2M6XFxcInJlcGVhdChvYmplY3QgWyx0aW1lc10pIC0+IGNyZWF0ZSBhbiBpdGVyYXRvciB3aGljaCByZXR1cm5zIHRoZSBvYmplY3RcXFxcbmZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcy4gIElmIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgdGhlIG9iamVjdFxcXFxuZW5kbGVzc2x5LlxcXCIsdHAkbmV3KGIsYyl7bGV0IGQsZTtpZihbZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwicmVwZWF0XFxcIixbXFxcIm9iamVjdFxcXCIsXFxcInRpbWVzXFxcIl0sYixjLFtudWxsXSksZT1udWxsPT09ZT92b2lkIDA6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGUsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSx0aGlzPT09YS5yZXBlYXQucHJvdG90eXBlKXJldHVybiBuZXcgYS5yZXBlYXQoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEucmVwZWF0LmNhbGwoYixkLGUpLGJ9fSwkcigpe3JldHVybiBvYmplY3RfcmVwcj1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMub2JqZWN0KSx0aW1lc19yZXByPXZvaWQgMD09PXRoaXMudGltZXM/XFxcIlxcXCI6XFxcIiwgXFxcIisoMDw9dGhpcy50aW1lcz90aGlzLnRpbWVzOjApLG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrb2JqZWN0X3JlcHIrdGltZXNfcmVwcitcXFwiKVxcXCIpfX0sbWV0aG9kczp7X19sZW5naHRfaGludF9fOnskbWV0aCgpe2lmKHZvaWQgMD09PXRoaXMudGltZXMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJsZW4oKSBvZiB1bnNpemVkIG9iamVjdFxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMudGltZXMpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbH19fSksYS5zdGFybWFwPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLnN0YXJtYXBcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBzdGFybWFwKGEsYil7dGhpcy5mdW5jPWEsdGhpcy5pdGVyPWJ9LGl0ZXJuZXh0KCl7Y29uc3QgYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKTtpZih2b2lkIDA9PT1hKXJldHVybjtjb25zdCBiPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpLGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMuZnVuYyxiKTtyZXR1cm4gY30sc2xvdHM6e3RwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcInN0YXJtYXBcXFwiLFtcXFwiZnVuY1xcXCIsXFxcIml0ZXJhYmxlXFxcIl0sYixjLFtdKSxlPVNrLmFic3RyLml0ZXIoZSksZD1Tay5idWlsdGluLmNoZWNrTm9uZShkKT9Tay5idWlsdGluLmJvb2w6ZCx0aGlzPT09YS5zdGFybWFwLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuc3Rhcm1hcChkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5zdGFybWFwLmNhbGwoYixkLGUpLGJ9fX19KSxhLnRha2V3aGlsZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy50YWtld2hpbGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiB0YWtld2hpbGUoYSxiKXt0aGlzLnByZWRpY2F0ZT1hLHRoaXMuaXRlcj1ifSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwIT09YSl7Y29uc3QgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5wcmVkaWNhdGUsW2FdKTtpZihTay5taXNjZXZhbC5pc1RydWUoYikpcmV0dXJuIGE7dGhpcy50cCRpdGVybmV4dD0oKT0+dm9pZCAwfX0sc2xvdHM6e3RwJGRvYzpcXFwidGFrZXdoaWxlKHByZWRpY2F0ZSwgaXRlcmFibGUpIC0tPiB0YWtld2hpbGUgb2JqZWN0XFxcXG5cXFxcblJldHVybiBzdWNjZXNzaXZlIGVudHJpZXMgZnJvbSBhbiBpdGVyYWJsZSBhcyBsb25nIGFzIHRoZSBcXFxcbnByZWRpY2F0ZSBldmFsdWF0ZXMgdG8gdHJ1ZSBmb3IgZWFjaCBlbnRyeS5cXFwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcInRha2V3aGlsZVxcXCIsYyksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJ0YWtld2hpbGVcXFwiLGIsMiwyKTtjb25zdCBkPWJbMF0sZT1Tay5hYnN0ci5pdGVyKGJbMV0pO2lmKHRoaXM9PT1hLnRha2V3aGlsZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnRha2V3aGlsZShkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS50YWtld2hpbGUuY2FsbChiLGQsZSksYn19fX0pLGEudGVlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKX0pLGEuemlwX2xvbmdlc3Q9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuemlwX2xvbmdlc3RcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiB6aXBfbG9uZ2VzdChhLGIpe3RoaXMuaXRlcnM9YSx0aGlzLmZpbGx2YWx1ZT1iLHRoaXMuYWN0aXZlPXRoaXMuaXRlcnMubGVuZ3RofSxpdGVybmV4dCgpe2lmKCF0aGlzLmFjdGl2ZSlyZXR1cm47bGV0IGI7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPHRoaXMuaXRlcnMubGVuZ3RoO2QrKyl7aWYoYj10aGlzLml0ZXJzW2RdLnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09Yil7aWYodGhpcy5hY3RpdmUtLSwhdGhpcy5hY3RpdmUpcmV0dXJuO3RoaXMuaXRlcnNbZF09bmV3IGEucmVwZWF0KHRoaXMuZmlsbHZhbHVlKSxiPXRoaXMuZmlsbHZhbHVlfWMucHVzaChiKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYyl9LHNsb3RzOnt0cCRkb2M6XFxcInppcF9sb25nZXN0KGl0ZXIxIFssaXRlcjIgWy4uLl1dLCBbZmlsbHZhbHVlPU5vbmVdKSAtLT4gemlwX2xvbmdlc3Qgb2JqZWN0XFxcXG5cXFxcblJldHVybiBhIHppcF9sb25nZXN0IG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBhIHR1cGxlIHdoZXJlXFxcXG50aGUgaS10aCBlbGVtZW50IGNvbWVzIGZyb20gdGhlIGktdGggaXRlcmFibGUgYXJndW1lbnQuICBUaGUgLl9fbmV4dF9fKClcXFxcbm1ldGhvZCBjb250aW51ZXMgdW50aWwgdGhlIGxvbmdlc3QgaXRlcmFibGUgaW4gdGhlIGFyZ3VtZW50IHNlcXVlbmNlXFxcXG5pcyBleGhhdXN0ZWQgYW5kIHRoZW4gaXQgcmFpc2VzIFN0b3BJdGVyYXRpb24uICBXaGVuIHRoZSBzaG9ydGVyIGl0ZXJhYmxlc1xcXFxuYXJlIGV4aGF1c3RlZCwgdGhlIGZpbGx2YWx1ZSBpcyBzdWJzdGl0dXRlZCBpbiB0aGVpciBwbGFjZS4gIFRoZSBmaWxsdmFsdWVcXFxcbmRlZmF1bHRzIHRvIE5vbmUgb3IgY2FuIGJlIHNwZWNpZmllZCBieSBhIGtleXdvcmQgYXJndW1lbnQuXFxcXG5cXFwiLHRwJG5ldyhiLGMpe2NvbnN0W2RdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJ6aXBfbG9uZ2VzdFxcXCIsW1xcXCJmaWxsdmFsdWVcXFwiXSxbXSxjLFtTay5idWlsdGluLm5vbmUubm9uZSRdKSxlPVtdO2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSsrKWUucHVzaChTay5hYnN0ci5pdGVyKGJbYV0pKTtpZih0aGlzPT09YS56aXBfbG9uZ2VzdC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnppcF9sb25nZXN0KGUsZCk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnppcF9sb25nZXN0LmNhbGwoYixlLGQpLGJ9fX19KSxhLl9fZG9jX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcHl0aG9uIGl0ZXJ0b29scyBtb2R1bGUgaW4gU2t1bHB0XFxcIiksYS5fX3BhY2thZ2VfXz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpLGF9O1wiLFwic3JjL2xpYi9qc29uL19faW5pdF9fLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtcXFwidXNlIHN0cmljdFxcXCI7dmFyIGE9e30sYj1mdW5jdGlvbihhKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzKFxcXCJkdW1wc1xcXCIsYXJndW1lbnRzLDEsMS8wLCEwLCExKTt2YXIgYixjLGQsZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZj1uZXcgU2suYnVpbHRpbnMuZGljdChhKSxnPSExO3JldHVybiBiPXthc2NpaTohMCxzZXBhcmF0b3JzOntpdGVtX3NlcGFyYXRvcjpcXFwiLCBcXFwiLGtleV9zZXBhcmF0b3I6XFxcIjogXFxcIn19LGY9U2suZmZpLnJlbWFwVG9KcyhmKSxjPVNrLmZmaS5yZW1hcFRvSnMoZVswXSksXFxcImJvb2xlYW5cXFwiPT10eXBlb2YgZi5lbnN1cmVfYXNjaWkmJiExPT09Zi5lbnN1cmVfYXNjaWkmJihiLmFzY2lpPSExKSxcXFwiYm9vbGVhblxcXCI9PXR5cGVvZiBmLnNvcnRfa2V5cyYmZi5zb3J0X2tleXMmJihnPSEwKSxnfHwoYi5jbXA9ZnVuY3Rpb24oKXtyZXR1cm4gMH0pLFxcXCJvYmplY3RcXFwiPT10eXBlb2YgZi5zZXBhcmF0b3JzJiYyPT1mLnNlcGFyYXRvcnMubGVuZ3RoJiYoYi5zZXBhcmF0b3JzLml0ZW1fc2VwYXJhdG9yPWYuc2VwYXJhdG9yc1swXSxiLnNlcGFyYXRvcnMua2V5X3NlcGFyYXRvcj1mLnNlcGFyYXRvcnNbMV0pLGYuaW5kZW50JiYoYi5zcGFjZT1mLmluZGVudCksZi5kZWZhdWx0LGQ9c3RyaW5naWZ5KGMsYiksbmV3IFNrLmJ1aWx0aW4uc3RyKGQpfTtiLmNvX2t3YXJncz0hMCxhLmR1bXBzPW5ldyBTay5idWlsdGluLmZ1bmMoYik7dmFyIGM9ZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5weUNoZWNrQXJncyhcXFwibG9hZHNcXFwiLGFyZ3VtZW50cywxLDEvMCwhMCwhMSk7dmFyIGIsYyxkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxlPW5ldyBTay5idWlsdGlucy5kaWN0KGEpO3JldHVybiBlPVNrLmZmaS5yZW1hcFRvSnMoZSksYj1kWzBdLnYsYz1KU09OLnBhcnNlKGIpLFNrLmZmaS5yZW1hcFRvUHkoYyl9O3JldHVybiBjLmNvX2t3YXJncz0hMCxhLmxvYWRzPW5ldyBTay5idWlsdGluLmZ1bmMoYyksYX07KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihiLGQsZSl7ZnVuY3Rpb24gbyhoLGkpe2lmKCFkW2hdKXtpZighYltoXSl7dmFyIGY9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWkmJmYpcmV0dXJuIGYoaCwhMCk7aWYoZylyZXR1cm4gZyhoLCEwKTt2YXIgYz1uZXcgRXJyb3IoXFxcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXFxcIitoK1xcXCInXFxcIik7dGhyb3cgYy5jb2RlPVxcXCJNT0RVTEVfTk9UX0ZPVU5EXFxcIixjfXZhciBhPWRbaF09e2V4cG9ydHM6e319O2JbaF1bMF0uY2FsbChhLmV4cG9ydHMsZnVuY3Rpb24oYSl7dmFyIGM9YltoXVsxXVthXTtyZXR1cm4gbyhjfHxhKX0sYSxhLmV4cG9ydHMscixiLGQsZSl9cmV0dXJuIGRbaF0uZXhwb3J0c31mb3IodmFyIGc9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsYT0wO2E8ZS5sZW5ndGg7YSsrKW8oZVthXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpKHsxOltmdW5jdGlvbihhLGIpe3ZhciBjPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgSlNPTj9hKFxcXCJqc29uaWZ5XFxcIik6SlNPTjtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXtifHwoYj17fSksXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGImJihiPXtjbXA6Yn0pO3ZhciBmPWIuY21wJiZmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGZ1bmN0aW9uKGUsYSl7dmFyIGI9e2tleTplLHZhbHVlOmRbZV19LGY9e2tleTphLHZhbHVlOmRbYV19O3JldHVybiBjKGIsZil9fX0oYi5jbXApO3JldHVybiBmdW5jdGlvbiBzdHJpbmdpZnkoYSl7aWYoXFxcIm9iamVjdFxcXCIhPXR5cGVvZiBhfHxudWxsPT09YSlyZXR1cm4gYy5zdHJpbmdpZnkoYSk7aWYoZChhKSl7Zm9yKHZhciBiPVtdLGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goc3RyaW5naWZ5KGFbZ10pKTtyZXR1cm5cXFwiW1xcXCIrYi5qb2luKFxcXCIsXFxcIikrXFxcIl1cXFwifWZvcih2YXIgaCxqPWUoYSkuc29ydChmJiZmKGEpKSxiPVtdLGc9MDtnPGoubGVuZ3RoO2crKyloPWpbZ10sYi5wdXNoKHN0cmluZ2lmeShoKStcXFwiOlxcXCIrc3RyaW5naWZ5KGFbaF0pKTtyZXR1cm5cXFwie1xcXCIrYi5qb2luKFxcXCIsXFxcIikrXFxcIn1cXFwifShhKX07dmFyIGQ9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuXFxcIltvYmplY3QgQXJyYXldXFxcIj09PXt9LnRvU3RyaW5nLmNhbGwoYSl9LGU9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGEpe3ZhciBiPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHl8fGZ1bmN0aW9uKCl7cmV0dXJuITB9LGM9W107Zm9yKHZhciBkIGluIGEpYi5jYWxsKGEsZCkmJmMucHVzaChkKTtyZXR1cm4gY319LHtqc29uaWZ5OjJ9XSwyOltmdW5jdGlvbihhLGIsYyl7Yy5wYXJzZT1hKFxcXCIuL2xpYi9wYXJzZVxcXCIpLGMuc3RyaW5naWZ5PWEoXFxcIi4vbGliL3N0cmluZ2lmeVxcXCIpfSx7XFxcIi4vbGliL3BhcnNlXFxcIjozLFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiOjR9XSwzOltmdW5jdGlvbihhLGIpe3ZhciBkLGUsZixnLGg9eydcXFwiJzpcXFwiXFxcXFxcXCJcXFwiLFxcXCJcXFxcXFxcXFxcXCI6XFxcIlxcXFxcXFxcXFxcIixcXFwiL1xcXCI6XFxcIi9cXFwiLGI6XFxcIlxcXFxiXFxcIixmOlxcXCJcXFxcZlxcXCIsbjpcXFwiXFxcXG5cXFwiLHI6XFxcIlxcXFxyXFxcIix0OlxcXCJcXFxcdFxcXCJ9LGo9ZnVuY3Rpb24oYSl7dGhyb3d7bmFtZTpcXFwiU3ludGF4RXJyb3JcXFwiLG1lc3NhZ2U6YSxhdDpkLHRleHQ6Zn19LGs9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEhPT1lJiZqKFxcXCJFeHBlY3RlZCAnXFxcIithK1xcXCInIGluc3RlYWQgb2YgJ1xcXCIrZStcXFwiJ1xcXCIpLGU9Zi5jaGFyQXQoZCksZCs9MSxlfSxsPWZ1bmN0aW9uKCl7dmFyIGEsYj1cXFwiXFxcIjtmb3IoXFxcIi1cXFwiPT09ZSYmKGI9XFxcIi1cXFwiLGsoXFxcIi1cXFwiKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO2lmKFxcXCIuXFxcIj09PWUpZm9yKGIrPVxcXCIuXFxcIjtrKCkmJlxcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lO2lmKFxcXCJlXFxcIj09PWV8fFxcXCJFXFxcIj09PWUpZm9yKGIrPWUsaygpLChcXFwiLVxcXCI9PT1lfHxcXFwiK1xcXCI9PT1lKSYmKGIrPWUsaygpKTtcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZSxrKCk7cmV0dXJuIGE9K2IsaXNGaW5pdGUoYSk/YTp2b2lkIGooXFxcIkJhZCBudW1iZXJcXFwiKX0sbT1mdW5jdGlvbigpe3ZhciBiLGMsZCxhPVN0cmluZy5mcm9tQ2hhckNvZGUsZj1cXFwiXFxcIjtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlmb3IoO2soKTspe2lmKFxcXCJcXFxcXFxcIlxcXCI9PT1lKXJldHVybiBrKCksZjtpZihcXFwiXFxcXFxcXFxcXFwiIT09ZSlmKz1lO2Vsc2UgaWYoaygpLFxcXCJ1XFxcIj09PWUpe2ZvcihkPTAsYz0wOzQ+YyYmKGI9cGFyc2VJbnQoaygpLDE2KSwhIWlzRmluaXRlKGIpKTtjKz0xKWQ9MTYqZCtiO2YrPWEoZCl9ZWxzZSBpZihcXFwic3RyaW5nXFxcIj09dHlwZW9mIGhbZV0pZis9aFtlXTtlbHNlIGJyZWFrfWooXFxcIkJhZCBzdHJpbmdcXFwiKX0sbj1mdW5jdGlvbigpe2Zvcig7ZSYmXFxcIiBcXFwiPj1lOylrKCl9LG89ZnVuY3Rpb24oKXtzd2l0Y2goZSl7Y2FzZVxcXCJ0XFxcIjpyZXR1cm4gayhcXFwidFxcXCIpLGsoXFxcInJcXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwiZVxcXCIpLCEwO2Nhc2VcXFwiZlxcXCI6cmV0dXJuIGsoXFxcImZcXFwiKSxrKFxcXCJhXFxcIiksayhcXFwibFxcXCIpLGsoXFxcInNcXFwiKSxrKFxcXCJlXFxcIiksITE7Y2FzZVxcXCJuXFxcIjpyZXR1cm4gayhcXFwiblxcXCIpLGsoXFxcInVcXFwiKSxrKFxcXCJsXFxcIiksayhcXFwibFxcXCIpLG51bGw7fWooXFxcIlVuZXhwZWN0ZWQgJ1xcXCIrZStcXFwiJ1xcXCIpfSxwPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYoXFxcIltcXFwiPT09ZSl7aWYoayhcXFwiW1xcXCIpLG4oKSxcXFwiXVxcXCI9PT1lKXJldHVybiBrKFxcXCJdXFxcIiksYTtmb3IoO2U7KXtpZihhLnB1c2goZygpKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIGFycmF5XFxcIil9LHE9ZnVuY3Rpb24oKXt2YXIgYSxiPXt9O2lmKFxcXCJ7XFxcIj09PWUpe2lmKGsoXFxcIntcXFwiKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7Zm9yKDtlOyl7aWYoYT1tKCksbigpLGsoXFxcIjpcXFwiKSxPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChiLGEpJiZqKFxcXCJEdXBsaWNhdGUga2V5IFxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCIpLGJbYV09ZygpLG4oKSxcXFwifVxcXCI9PT1lKXJldHVybiBrKFxcXCJ9XFxcIiksYjtrKFxcXCIsXFxcIiksbigpfX1qKFxcXCJCYWQgb2JqZWN0XFxcIil9O2c9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLFxcXCJ7XFxcIj09PWU/cSgpOlxcXCJbXFxcIj09PWU/cCgpOlxcXCJcXFxcXFxcIlxcXCI9PT1lP20oKTpcXFwiLVxcXCI9PT1lP2woKTpcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZT9sKCk6bygpfSxiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXt2YXIgYztyZXR1cm4gZj1hLGQ9MCxlPVxcXCIgXFxcIixjPWcoKSxuKCksZSYmaihcXFwiU3ludGF4IGVycm9yXFxcIiksXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGI/ZnVuY3Rpb24gd2FsayhhLGMpe3ZhciBkLGUsZj1hW2NdO2lmKGYmJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgZilmb3IoZCBpbiBmKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmLGQpJiYoZT13YWxrKGYsZCksdm9pZCAwPT09ZT9kZWxldGUgZltkXTpmW2RdPWUpO3JldHVybiBiLmNhbGwoYSxjLGYpfSh7XFxcIlxcXCI6Y30sXFxcIlxcXCIpOmN9fSx7fV0sNDpbZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBxdW90ZShhKXtyZXR1cm4gZi5sYXN0SW5kZXg9MCxmLnRlc3QoYSk/XFxcIlxcXFxcXFwiXFxcIithLnJlcGxhY2UoZixmdW5jdGlvbihiKXt2YXIgYT1nW2JdO3JldHVyblxcXCJzdHJpbmdcXFwiPT10eXBlb2YgYT9hOlxcXCJcXFxcXFxcXHVcXFwiKyhcXFwiMDAwMFxcXCIrYi5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpfSkrXFxcIlxcXFxcXFwiXFxcIjpcXFwiXFxcXFxcXCJcXFwiK2ErXFxcIlxcXFxcXFwiXFxcIn1mdW5jdGlvbiBzdHIoYSxiKXt2YXIgZixnLGgsaixsLG09YyxuPWJbYV07c3dpdGNoKG4mJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgbiYmXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIG4udG9KU09OJiYobj1uLnRvSlNPTihhKSksXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGUmJihuPWUuY2FsbChiLGEsbikpLHR5cGVvZiBuKXtjYXNlXFxcInN0cmluZ1xcXCI6cmV0dXJuIHF1b3RlKG4pO2Nhc2VcXFwibnVtYmVyXFxcIjpyZXR1cm4gaXNGaW5pdGUobik/bitcXFwiXFxcIjpcXFwibnVsbFxcXCI7Y2FzZVxcXCJib29sZWFuXFxcIjpjYXNlXFxcIm51bGxcXFwiOnJldHVybiBuK1xcXCJcXFwiO2Nhc2VcXFwib2JqZWN0XFxcIjppZighbilyZXR1cm5cXFwibnVsbFxcXCI7aWYoYys9ZCxsPVtdLFxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG4pKXtmb3Ioaj1uLmxlbmd0aCxmPTA7ZjxqO2YrPTEpbFtmXT1zdHIoZixuKXx8XFxcIm51bGxcXFwiO3JldHVybiBoPTA9PT1sLmxlbmd0aD9cXFwiW11cXFwiOmM/XFxcIltcXFxcblxcXCIrYytsLmpvaW4oXFxcIixcXFxcblxcXCIrYykrXFxcIlxcXFxuXFxcIittK1xcXCJdXFxcIjpcXFwiW1xcXCIrbC5qb2luKFxcXCIsXFxcIikrXFxcIl1cXFwiLGM9bSxofWlmKGUmJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgZSlmb3Ioaj1lLmxlbmd0aCxmPTA7ZjxqO2YrPTEpZz1lW2ZdLFxcXCJzdHJpbmdcXFwiPT10eXBlb2YgZyYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7ZWxzZSBmb3IoZyBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLGcpJiYoaD1zdHIoZyxuKSxoJiZsLnB1c2gocXVvdGUoZykrKGM/XFxcIjogXFxcIjpcXFwiOlxcXCIpK2gpKTtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcInt9XFxcIjpjP1xcXCJ7XFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwifVxcXCI6XFxcIntcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIixjPW0saDt9fXZhciBjLGQsZSxmPS9bXFxcXFxcXFxcXFxcXFxcIlxcXFx4MDAtXFxcXHgxZlxcXFx4N2YtXFxcXHg5ZlxcXFx1MDBhZFxcXFx1MDYwMC1cXFxcdTA2MDRcXFxcdTA3MGZcXFxcdTE3YjRcXFxcdTE3YjVcXFxcdTIwMGMtXFxcXHUyMDBmXFxcXHUyMDI4LVxcXFx1MjAyZlxcXFx1MjA2MC1cXFxcdTIwNmZcXFxcdWZlZmZcXFxcdWZmZjAtXFxcXHVmZmZmXS9nLGc9e1xcXCJcXGJcXFwiOlxcXCJcXFxcXFxcXGJcXFwiLFxcXCJcXHRcXFwiOlxcXCJcXFxcXFxcXHRcXFwiLFxcXCJcXFxcblxcXCI6XFxcIlxcXFxcXFxcblxcXCIsXFxcIlxcZlxcXCI6XFxcIlxcXFxcXFxcZlxcXCIsXFxcIlxcXFxyXFxcIjpcXFwiXFxcXFxcXFxyXFxcIiwnXFxcIic6XFxcIlxcXFxcXFxcXFxcXFxcXCJcXFwiLFxcXCJcXFxcXFxcXFxcXCI6XFxcIlxcXFxcXFxcXFxcXFxcXFxcXFwifTtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiLGYpe3ZhciBnO2lmKGM9XFxcIlxcXCIsZD1cXFwiXFxcIixcXFwibnVtYmVyXFxcIj09dHlwZW9mIGYpZm9yKGc9MDtnPGY7Zys9MSlkKz1cXFwiIFxcXCI7ZWxzZVxcXCJzdHJpbmdcXFwiPT10eXBlb2YgZiYmKGQ9Zik7aWYoZT1iLGImJlxcXCJmdW5jdGlvblxcXCIhPXR5cGVvZiBiJiYoXFxcIm9iamVjdFxcXCIhPXR5cGVvZiBifHxcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGIubGVuZ3RoKSl0aHJvdyBuZXcgRXJyb3IoXFxcIkpTT04uc3RyaW5naWZ5XFxcIik7cmV0dXJuIHN0cihcXFwiXFxcIix7XFxcIlxcXCI6YX0pfX0se31dLDU6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpe3Rocm93IG5ldyBFcnJvcihcXFwic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFxcXCIpfWZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFxcXCIpfWZ1bmN0aW9uIHJ1blRpbWVvdXQoYSl7aWYoYz09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoYSwwKTtpZigoYz09PWRlZmF1bHRTZXRUaW1vdXR8fCFjKSYmc2V0VGltZW91dClyZXR1cm4gYz1zZXRUaW1lb3V0LHNldFRpbWVvdXQoYSwwKTt0cnl7cmV0dXJuIGMoYSwwKX1jYXRjaChiKXt0cnl7cmV0dXJuIGMuY2FsbChudWxsLGEsMCl9Y2F0Y2goYil7cmV0dXJuIGMuY2FsbCh0aGlzLGEsMCl9fX1mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQoYSl7aWYoZD09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGEpO2lmKChkPT09ZGVmYXVsdENsZWFyVGltZW91dHx8IWQpJiZjbGVhclRpbWVvdXQpcmV0dXJuIGQ9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChhKTt0cnl7cmV0dXJuIGQoYSl9Y2F0Y2goYil7dHJ5e3JldHVybiBkLmNhbGwobnVsbCxhKX1jYXRjaChiKXtyZXR1cm4gZC5jYWxsKHRoaXMsYSl9fX1mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKXtoJiZmJiYoaD0hMSxmLmxlbmd0aD9nPWYuY29uY2F0KGcpOmk9LTEsZy5sZW5ndGgmJmRyYWluUXVldWUoKSl9ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpe2lmKCFoKXt2YXIgYT1ydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7aD0hMDtmb3IodmFyIGI9Zy5sZW5ndGg7Yjspe2ZvcihmPWcsZz1bXTsrK2k8YjspZiYmZltpXS5ydW4oKTtpPS0xLGI9Zy5sZW5ndGh9Zj1udWxsLGg9ITEscnVuQ2xlYXJUaW1lb3V0KGEpfX1mdW5jdGlvbiBJdGVtKGEsYil7dGhpcy5mdW49YSx0aGlzLmFycmF5PWJ9ZnVuY3Rpb24gbm9vcCgpe312YXIgYyxkLGU9Yi5leHBvcnRzPXt9OyhmdW5jdGlvbigpe3RyeXtjPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6ZGVmYXVsdFNldFRpbW91dH1jYXRjaChhKXtjPWRlZmF1bHRTZXRUaW1vdXR9dHJ5e2Q9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6ZGVmYXVsdENsZWFyVGltZW91dH1jYXRjaChhKXtkPWRlZmF1bHRDbGVhclRpbWVvdXR9fSkoKTt2YXIgZixnPVtdLGg9ITEsaT0tMTtlLm5leHRUaWNrPWZ1bmN0aW9uKGEpe3ZhciBiPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoMTxhcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYltjLTFdPWFyZ3VtZW50c1tjXTtnLnB1c2gobmV3IEl0ZW0oYSxiKSksMSE9PWcubGVuZ3RofHxofHxydW5UaW1lb3V0KGRyYWluUXVldWUpfSxJdGVtLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxlLnRpdGxlPVxcXCJicm93c2VyXFxcIixlLmJyb3dzZXI9ITAsZS5lbnY9e30sZS5hcmd2PVtdLGUudmVyc2lvbj1cXFwiXFxcIixlLnZlcnNpb25zPXt9LGUub249bm9vcCxlLmFkZExpc3RlbmVyPW5vb3AsZS5vbmNlPW5vb3AsZS5vZmY9bm9vcCxlLnJlbW92ZUxpc3RlbmVyPW5vb3AsZS5yZW1vdmVBbGxMaXN0ZW5lcnM9bm9vcCxlLmVtaXQ9bm9vcCxlLnByZXBlbmRMaXN0ZW5lcj1ub29wLGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1ub29wLGUubGlzdGVuZXJzPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUuYmluZGluZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcXFwicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm5cXFwiL1xcXCJ9LGUuY2hkaXI9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFxcXCIpfSxlLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSx7fV0sNjpbZnVuY3Rpb24oYSxiKXsoZnVuY3Rpb24oYyl7dmFyIGQ9YShcXFwianNvbi1zdGFibGUtc3RyaW5naWZ5XFxcIik7Yy5icm93c2VyP3dpbmRvdy5zdHJpbmdpZnk9ZDpiLmV4cG9ydHM9ZH0pLmNhbGwodGhpcyxhKFxcXCJfcHJvY2Vzc1xcXCIpKX0se19wcm9jZXNzOjUsXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCI6MX1dfSx7fSxbNl0pO1wiLFwic3JjL2xpYi9qc29uL3N0cmluZ2lmeS5qc1wiOlwiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihiLGQsZSl7ZnVuY3Rpb24gbyhoLGkpe2lmKCFkW2hdKXtpZighYltoXSl7dmFyIGY9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWkmJmYpcmV0dXJuIGYoaCwhMCk7aWYoZylyZXR1cm4gZyhoLCEwKTt2YXIgYz1uZXcgRXJyb3IoXFxcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXFxcIitoK1xcXCInXFxcIik7dGhyb3cgYy5jb2RlPVxcXCJNT0RVTEVfTk9UX0ZPVU5EXFxcIixjfXZhciBhPWRbaF09e2V4cG9ydHM6e319O2JbaF1bMF0uY2FsbChhLmV4cG9ydHMsZnVuY3Rpb24oYSl7dmFyIGM9YltoXVsxXVthXTtyZXR1cm4gbyhjfHxhKX0sYSxhLmV4cG9ydHMscixiLGQsZSl9cmV0dXJuIGRbaF0uZXhwb3J0c31mb3IodmFyIGc9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsYT0wO2E8ZS5sZW5ndGg7YSsrKW8oZVthXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpKHsxOltmdW5jdGlvbihhLGIpe3ZhciBjPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgSlNPTj9hKFxcXCJqc29uaWZ5XFxcIik6SlNPTjtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXtifHwoYj17fSksXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGImJihiPXtjbXA6Yn0pO3ZhciBmPWIuY21wJiZmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGZ1bmN0aW9uKGUsYSl7dmFyIGI9e2tleTplLHZhbHVlOmRbZV19LGY9e2tleTphLHZhbHVlOmRbYV19O3JldHVybiBjKGIsZil9fX0oYi5jbXApO3JldHVybiBmdW5jdGlvbiBzdHJpbmdpZnkoYSl7aWYoXFxcIm9iamVjdFxcXCIhPXR5cGVvZiBhfHxudWxsPT09YSlyZXR1cm4gYy5zdHJpbmdpZnkoYSk7aWYoZChhKSl7Zm9yKHZhciBiPVtdLGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goc3RyaW5naWZ5KGFbZ10pKTtyZXR1cm5cXFwiW1xcXCIrYi5qb2luKFxcXCIsXFxcIikrXFxcIl1cXFwifWZvcih2YXIgaCxqPWUoYSkuc29ydChmJiZmKGEpKSxiPVtdLGc9MDtnPGoubGVuZ3RoO2crKyloPWpbZ10sYi5wdXNoKHN0cmluZ2lmeShoKStcXFwiOlxcXCIrc3RyaW5naWZ5KGFbaF0pKTtyZXR1cm5cXFwie1xcXCIrYi5qb2luKFxcXCIsXFxcIikrXFxcIn1cXFwifShhKX07dmFyIGQ9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuXFxcIltvYmplY3QgQXJyYXldXFxcIj09PXt9LnRvU3RyaW5nLmNhbGwoYSl9LGU9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGEpe3ZhciBiPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHl8fGZ1bmN0aW9uKCl7cmV0dXJuITB9LGM9W107Zm9yKHZhciBkIGluIGEpYi5jYWxsKGEsZCkmJmMucHVzaChkKTtyZXR1cm4gY319LHtqc29uaWZ5OjJ9XSwyOltmdW5jdGlvbihhLGIsYyl7Yy5wYXJzZT1hKFxcXCIuL2xpYi9wYXJzZVxcXCIpLGMuc3RyaW5naWZ5PWEoXFxcIi4vbGliL3N0cmluZ2lmeVxcXCIpfSx7XFxcIi4vbGliL3BhcnNlXFxcIjozLFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiOjR9XSwzOltmdW5jdGlvbihhLGIpe3ZhciBkLGUsZixnLGg9eydcXFwiJzpcXFwiXFxcXFxcXCJcXFwiLFxcXCJcXFxcXFxcXFxcXCI6XFxcIlxcXFxcXFxcXFxcIixcXFwiL1xcXCI6XFxcIi9cXFwiLGI6XFxcIlxcXFxiXFxcIixmOlxcXCJcXFxcZlxcXCIsbjpcXFwiXFxcXG5cXFwiLHI6XFxcIlxcXFxyXFxcIix0OlxcXCJcXFxcdFxcXCJ9LGo9ZnVuY3Rpb24oYSl7dGhyb3d7bmFtZTpcXFwiU3ludGF4RXJyb3JcXFwiLG1lc3NhZ2U6YSxhdDpkLHRleHQ6Zn19LGs9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEhPT1lJiZqKFxcXCJFeHBlY3RlZCAnXFxcIithK1xcXCInIGluc3RlYWQgb2YgJ1xcXCIrZStcXFwiJ1xcXCIpLGU9Zi5jaGFyQXQoZCksZCs9MSxlfSxsPWZ1bmN0aW9uKCl7dmFyIGEsYj1cXFwiXFxcIjtmb3IoXFxcIi1cXFwiPT09ZSYmKGI9XFxcIi1cXFwiLGsoXFxcIi1cXFwiKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO2lmKFxcXCIuXFxcIj09PWUpZm9yKGIrPVxcXCIuXFxcIjtrKCkmJlxcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lO2lmKFxcXCJlXFxcIj09PWV8fFxcXCJFXFxcIj09PWUpZm9yKGIrPWUsaygpLChcXFwiLVxcXCI9PT1lfHxcXFwiK1xcXCI9PT1lKSYmKGIrPWUsaygpKTtcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZSxrKCk7cmV0dXJuIGE9K2IsaXNGaW5pdGUoYSk/YTp2b2lkIGooXFxcIkJhZCBudW1iZXJcXFwiKX0sbT1mdW5jdGlvbigpe3ZhciBiLGMsZCxhPVN0cmluZy5mcm9tQ2hhckNvZGUsZj1cXFwiXFxcIjtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlmb3IoO2soKTspe2lmKFxcXCJcXFxcXFxcIlxcXCI9PT1lKXJldHVybiBrKCksZjtpZihcXFwiXFxcXFxcXFxcXFwiIT09ZSlmKz1lO2Vsc2UgaWYoaygpLFxcXCJ1XFxcIj09PWUpe2ZvcihkPTAsYz0wOzQ+YyYmKGI9cGFyc2VJbnQoaygpLDE2KSwhIWlzRmluaXRlKGIpKTtjKz0xKWQ9MTYqZCtiO2YrPWEoZCl9ZWxzZSBpZihcXFwic3RyaW5nXFxcIj09dHlwZW9mIGhbZV0pZis9aFtlXTtlbHNlIGJyZWFrfWooXFxcIkJhZCBzdHJpbmdcXFwiKX0sbj1mdW5jdGlvbigpe2Zvcig7ZSYmXFxcIiBcXFwiPj1lOylrKCl9LG89ZnVuY3Rpb24oKXtzd2l0Y2goZSl7Y2FzZVxcXCJ0XFxcIjpyZXR1cm4gayhcXFwidFxcXCIpLGsoXFxcInJcXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwiZVxcXCIpLCEwO2Nhc2VcXFwiZlxcXCI6cmV0dXJuIGsoXFxcImZcXFwiKSxrKFxcXCJhXFxcIiksayhcXFwibFxcXCIpLGsoXFxcInNcXFwiKSxrKFxcXCJlXFxcIiksITE7Y2FzZVxcXCJuXFxcIjpyZXR1cm4gayhcXFwiblxcXCIpLGsoXFxcInVcXFwiKSxrKFxcXCJsXFxcIiksayhcXFwibFxcXCIpLG51bGw7fWooXFxcIlVuZXhwZWN0ZWQgJ1xcXCIrZStcXFwiJ1xcXCIpfSxwPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYoXFxcIltcXFwiPT09ZSl7aWYoayhcXFwiW1xcXCIpLG4oKSxcXFwiXVxcXCI9PT1lKXJldHVybiBrKFxcXCJdXFxcIiksYTtmb3IoO2U7KXtpZihhLnB1c2goZygpKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIGFycmF5XFxcIil9LHE9ZnVuY3Rpb24oKXt2YXIgYSxiPXt9O2lmKFxcXCJ7XFxcIj09PWUpe2lmKGsoXFxcIntcXFwiKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7Zm9yKDtlOyl7aWYoYT1tKCksbigpLGsoXFxcIjpcXFwiKSxPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChiLGEpJiZqKFxcXCJEdXBsaWNhdGUga2V5IFxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCIpLGJbYV09ZygpLG4oKSxcXFwifVxcXCI9PT1lKXJldHVybiBrKFxcXCJ9XFxcIiksYjtrKFxcXCIsXFxcIiksbigpfX1qKFxcXCJCYWQgb2JqZWN0XFxcIil9O2c9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLFxcXCJ7XFxcIj09PWU/cSgpOlxcXCJbXFxcIj09PWU/cCgpOlxcXCJcXFxcXFxcIlxcXCI9PT1lP20oKTpcXFwiLVxcXCI9PT1lP2woKTpcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZT9sKCk6bygpfSxiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXt2YXIgYztyZXR1cm4gZj1hLGQ9MCxlPVxcXCIgXFxcIixjPWcoKSxuKCksZSYmaihcXFwiU3ludGF4IGVycm9yXFxcIiksXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGI/ZnVuY3Rpb24gd2FsayhhLGMpe3ZhciBkLGUsZj1hW2NdO2lmKGYmJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgZilmb3IoZCBpbiBmKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmLGQpJiYoZT13YWxrKGYsZCksdm9pZCAwPT09ZT9kZWxldGUgZltkXTpmW2RdPWUpO3JldHVybiBiLmNhbGwoYSxjLGYpfSh7XFxcIlxcXCI6Y30sXFxcIlxcXCIpOmN9fSx7fV0sNDpbZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBxdW90ZShhKXtyZXR1cm4gZi5sYXN0SW5kZXg9MCxmLnRlc3QoYSk/XFxcIlxcXFxcXFwiXFxcIithLnJlcGxhY2UoZixmdW5jdGlvbihiKXt2YXIgYT1nW2JdO3JldHVyblxcXCJzdHJpbmdcXFwiPT10eXBlb2YgYT9hOlxcXCJcXFxcXFxcXHVcXFwiKyhcXFwiMDAwMFxcXCIrYi5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpfSkrXFxcIlxcXFxcXFwiXFxcIjpcXFwiXFxcXFxcXCJcXFwiK2ErXFxcIlxcXFxcXFwiXFxcIn1mdW5jdGlvbiBzdHIoYSxiKXt2YXIgZixnLGgsaixsLG09YyxuPWJbYV07c3dpdGNoKG4mJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgbiYmXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIG4udG9KU09OJiYobj1uLnRvSlNPTihhKSksXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGUmJihuPWUuY2FsbChiLGEsbikpLHR5cGVvZiBuKXtjYXNlXFxcInN0cmluZ1xcXCI6cmV0dXJuIHF1b3RlKG4pO2Nhc2VcXFwibnVtYmVyXFxcIjpyZXR1cm4gaXNGaW5pdGUobik/bitcXFwiXFxcIjpcXFwibnVsbFxcXCI7Y2FzZVxcXCJib29sZWFuXFxcIjpjYXNlXFxcIm51bGxcXFwiOnJldHVybiBuK1xcXCJcXFwiO2Nhc2VcXFwib2JqZWN0XFxcIjppZighbilyZXR1cm5cXFwibnVsbFxcXCI7aWYoYys9ZCxsPVtdLFxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG4pKXtmb3Ioaj1uLmxlbmd0aCxmPTA7ZjxqO2YrPTEpbFtmXT1zdHIoZixuKXx8XFxcIm51bGxcXFwiO3JldHVybiBoPTA9PT1sLmxlbmd0aD9cXFwiW11cXFwiOmM/XFxcIltcXFxcblxcXCIrYytsLmpvaW4oXFxcIixcXFxcblxcXCIrYykrXFxcIlxcXFxuXFxcIittK1xcXCJdXFxcIjpcXFwiW1xcXCIrbC5qb2luKFxcXCIsXFxcIikrXFxcIl1cXFwiLGM9bSxofWlmKGUmJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgZSlmb3Ioaj1lLmxlbmd0aCxmPTA7ZjxqO2YrPTEpZz1lW2ZdLFxcXCJzdHJpbmdcXFwiPT10eXBlb2YgZyYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7ZWxzZSBmb3IoZyBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLGcpJiYoaD1zdHIoZyxuKSxoJiZsLnB1c2gocXVvdGUoZykrKGM/XFxcIjogXFxcIjpcXFwiOlxcXCIpK2gpKTtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcInt9XFxcIjpjP1xcXCJ7XFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwifVxcXCI6XFxcIntcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIixjPW0saDt9fXZhciBjLGQsZSxmPS9bXFxcXFxcXFxcXFxcXFxcIlxcXFx4MDAtXFxcXHgxZlxcXFx4N2YtXFxcXHg5ZlxcXFx1MDBhZFxcXFx1MDYwMC1cXFxcdTA2MDRcXFxcdTA3MGZcXFxcdTE3YjRcXFxcdTE3YjVcXFxcdTIwMGMtXFxcXHUyMDBmXFxcXHUyMDI4LVxcXFx1MjAyZlxcXFx1MjA2MC1cXFxcdTIwNmZcXFxcdWZlZmZcXFxcdWZmZjAtXFxcXHVmZmZmXS9nLGc9e1xcXCJcXGJcXFwiOlxcXCJcXFxcXFxcXGJcXFwiLFxcXCJcXHRcXFwiOlxcXCJcXFxcXFxcXHRcXFwiLFxcXCJcXFxcblxcXCI6XFxcIlxcXFxcXFxcblxcXCIsXFxcIlxcZlxcXCI6XFxcIlxcXFxcXFxcZlxcXCIsXFxcIlxcXFxyXFxcIjpcXFwiXFxcXFxcXFxyXFxcIiwnXFxcIic6XFxcIlxcXFxcXFxcXFxcXFxcXCJcXFwiLFxcXCJcXFxcXFxcXFxcXCI6XFxcIlxcXFxcXFxcXFxcXFxcXFxcXFwifTtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiLGYpe3ZhciBnO2lmKGM9XFxcIlxcXCIsZD1cXFwiXFxcIixcXFwibnVtYmVyXFxcIj09dHlwZW9mIGYpZm9yKGc9MDtnPGY7Zys9MSlkKz1cXFwiIFxcXCI7ZWxzZVxcXCJzdHJpbmdcXFwiPT10eXBlb2YgZiYmKGQ9Zik7aWYoZT1iLGImJlxcXCJmdW5jdGlvblxcXCIhPXR5cGVvZiBiJiYoXFxcIm9iamVjdFxcXCIhPXR5cGVvZiBifHxcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGIubGVuZ3RoKSl0aHJvdyBuZXcgRXJyb3IoXFxcIkpTT04uc3RyaW5naWZ5XFxcIik7cmV0dXJuIHN0cihcXFwiXFxcIix7XFxcIlxcXCI6YX0pfX0se31dLDU6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpe3Rocm93IG5ldyBFcnJvcihcXFwic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFxcXCIpfWZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFxcXCIpfWZ1bmN0aW9uIHJ1blRpbWVvdXQoYSl7aWYoYz09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoYSwwKTtpZigoYz09PWRlZmF1bHRTZXRUaW1vdXR8fCFjKSYmc2V0VGltZW91dClyZXR1cm4gYz1zZXRUaW1lb3V0LHNldFRpbWVvdXQoYSwwKTt0cnl7cmV0dXJuIGMoYSwwKX1jYXRjaChiKXt0cnl7cmV0dXJuIGMuY2FsbChudWxsLGEsMCl9Y2F0Y2goYil7cmV0dXJuIGMuY2FsbCh0aGlzLGEsMCl9fX1mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQoYSl7aWYoZD09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGEpO2lmKChkPT09ZGVmYXVsdENsZWFyVGltZW91dHx8IWQpJiZjbGVhclRpbWVvdXQpcmV0dXJuIGQ9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChhKTt0cnl7cmV0dXJuIGQoYSl9Y2F0Y2goYil7dHJ5e3JldHVybiBkLmNhbGwobnVsbCxhKX1jYXRjaChiKXtyZXR1cm4gZC5jYWxsKHRoaXMsYSl9fX1mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKXtoJiZmJiYoaD0hMSxmLmxlbmd0aD9nPWYuY29uY2F0KGcpOmk9LTEsZy5sZW5ndGgmJmRyYWluUXVldWUoKSl9ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpe2lmKCFoKXt2YXIgYT1ydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7aD0hMDtmb3IodmFyIGI9Zy5sZW5ndGg7Yjspe2ZvcihmPWcsZz1bXTsrK2k8YjspZiYmZltpXS5ydW4oKTtpPS0xLGI9Zy5sZW5ndGh9Zj1udWxsLGg9ITEscnVuQ2xlYXJUaW1lb3V0KGEpfX1mdW5jdGlvbiBJdGVtKGEsYil7dGhpcy5mdW49YSx0aGlzLmFycmF5PWJ9ZnVuY3Rpb24gbm9vcCgpe312YXIgYyxkLGU9Yi5leHBvcnRzPXt9OyhmdW5jdGlvbigpe3RyeXtjPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6ZGVmYXVsdFNldFRpbW91dH1jYXRjaChhKXtjPWRlZmF1bHRTZXRUaW1vdXR9dHJ5e2Q9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6ZGVmYXVsdENsZWFyVGltZW91dH1jYXRjaChhKXtkPWRlZmF1bHRDbGVhclRpbWVvdXR9fSkoKTt2YXIgZixnPVtdLGg9ITEsaT0tMTtlLm5leHRUaWNrPWZ1bmN0aW9uKGEpe3ZhciBiPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoMTxhcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYltjLTFdPWFyZ3VtZW50c1tjXTtnLnB1c2gobmV3IEl0ZW0oYSxiKSksMSE9PWcubGVuZ3RofHxofHxydW5UaW1lb3V0KGRyYWluUXVldWUpfSxJdGVtLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxlLnRpdGxlPVxcXCJicm93c2VyXFxcIixlLmJyb3dzZXI9ITAsZS5lbnY9e30sZS5hcmd2PVtdLGUudmVyc2lvbj1cXFwiXFxcIixlLnZlcnNpb25zPXt9LGUub249bm9vcCxlLmFkZExpc3RlbmVyPW5vb3AsZS5vbmNlPW5vb3AsZS5vZmY9bm9vcCxlLnJlbW92ZUxpc3RlbmVyPW5vb3AsZS5yZW1vdmVBbGxMaXN0ZW5lcnM9bm9vcCxlLmVtaXQ9bm9vcCxlLnByZXBlbmRMaXN0ZW5lcj1ub29wLGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1ub29wLGUubGlzdGVuZXJzPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUuYmluZGluZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcXFwicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm5cXFwiL1xcXCJ9LGUuY2hkaXI9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFxcXCIpfSxlLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSx7fV0sNjpbZnVuY3Rpb24oYSxiKXsoZnVuY3Rpb24oYyl7dmFyIGQ9YShcXFwianNvbi1zdGFibGUtc3RyaW5naWZ5XFxcIik7Yy5icm93c2VyP3dpbmRvdy5zdHJpbmdpZnk9ZDpiLmV4cG9ydHM9ZH0pLmNhbGwodGhpcyxhKFxcXCJfcHJvY2Vzc1xcXCIpKX0se19wcm9jZXNzOjUsXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCI6MX1dfSx7fSxbNl0pO1wiLFwic3JjL2xpYi9qc29uL3Rlc3RzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZXN0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2tleXdvcmQucHlcIjpcIlxcbl9fYWxsX18gPSBbXFxcImlza2V5d29yZFxcXCIsIFxcXCJrd2xpc3RcXFwiXVxcblxcbmt3bGlzdCA9IFtcXG4jLS1zdGFydCBrZXl3b3Jkcy0tXFxuICAgICAgICAnYW5kJyxcXG4gICAgICAgICdhcycsXFxuICAgICAgICAnYXNzZXJ0JyxcXG4gICAgICAgICdicmVhaycsXFxuICAgICAgICAnY2xhc3MnLFxcbiAgICAgICAgJ2NvbnRpbnVlJyxcXG4gICAgICAgICdkZWYnLFxcbiAgICAgICAgJ2RlbCcsXFxuICAgICAgICAnZWxpZicsXFxuICAgICAgICAnZWxzZScsXFxuICAgICAgICAnZXhjZXB0JyxcXG4gICAgICAgICdleGVjJyxcXG4gICAgICAgICdmaW5hbGx5JyxcXG4gICAgICAgICdmb3InLFxcbiAgICAgICAgJ2Zyb20nLFxcbiAgICAgICAgJ2dsb2JhbCcsXFxuICAgICAgICAnaWYnLFxcbiAgICAgICAgJ2ltcG9ydCcsXFxuICAgICAgICAnaW4nLFxcbiAgICAgICAgJ2lzJyxcXG4gICAgICAgICdsYW1iZGEnLFxcbiAgICAgICAgJ25vdCcsXFxuICAgICAgICAnb3InLFxcbiAgICAgICAgJ3Bhc3MnLFxcbiAgICAgICAgJ3ByaW50JyxcXG4gICAgICAgICdyYWlzZScsXFxuICAgICAgICAncmV0dXJuJyxcXG4gICAgICAgICd0cnknLFxcbiAgICAgICAgJ3doaWxlJyxcXG4gICAgICAgICd3aXRoJyxcXG4gICAgICAgICd5aWVsZCcsXFxuIy0tZW5kIGtleXdvcmRzLS1cXG4gICAgICAgIF1cXG5cXG5pc2tleXdvcmQgPSBmcm96ZW5zZXQoa3dsaXN0KS5fX2NvbnRhaW5zX19cXG5cXG5cIixcInNyYy9saWIvbGliLWR5bmxvYWQvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImxpYi1keW5sb2FkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliLXRrL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsaWItdGsgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9saWIydG8zL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsaWIydG8zIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy9maXhlcy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZml4ZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9saWIydG8zL3BnZW4yL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwZ2VuMiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYjJ0bzMvdGVzdHMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRlc3RzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGluZWNhY2hlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsaW5lY2FjaGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9sb2NhbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImxvY2FsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xvZ2dpbmcvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImxvZ2dpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tYWNwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWNwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFjdXJsMnBhdGgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hY3VybDJwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFpbGJveC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFpbGJveCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21haWxjYXAucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1haWxjYXAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tYXJrdXBiYXNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXJrdXBiYXNlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWF0aC5qc1wiOlwiY29uc3QgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT1NYXRoLlBJLGI9TWF0aC5zcXJ0LGM9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsZD1NYXRoLkUsZT1NYXRoLmxvZyxmPU1hdGguZXhwLGc9TWF0aC5wb3csaD1NYXRoLmxvZzIsaT1OdW1iZXIuaXNGaW5pdGUsaj1NYXRoLmZsb29yLGs9TWF0aC5hYnM7Y29uc3QgbD17cGk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpLGU6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQpLHRhdTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMiphKSxuYW46bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTiksaW5mOm5ldyBTay5idWlsdGluLmZsb2F0XygxLzApfSxuPWZ1bmN0aW9uKGEpe3JldHVybiBhPWE/MD5hPy0xOjE6MD4xL2E/LTE6MSxhfSxvPTE4O3JldHVybiBTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXFxcIm1hdGhcXFwiLGwse2Fjb3M6eyRtZXRoOmZ1bmN0aW9uIGFjb3MoYSl7dmFyIGI9TWF0aC5hY29zO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGFyYyBjb3NpbmUgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguXFxcIn0sYWNvc2g6eyRtZXRoOmZ1bmN0aW9uIGFjb3NoKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYz1hK2IoYSphLTEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZShjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGludmVyc2UgaHlwZXJib2xpYyBjb3NpbmUgb2YgeC5cXFwifSxhc2luOnskbWV0aDpmdW5jdGlvbiBhc2luKGEpe3ZhciBiPU1hdGguYXNpbjtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhcmMgc2luZSAobWVhc3VyZWQgaW4gcmFkaWFucykgb2YgeC5cXFwifSxhc2luaDp7JG1ldGg6ZnVuY3Rpb24gYXNpbmgoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksYT1Tay5idWlsdGluLmFzbnVtJChhKTtjb25zdCBjPWErYihhKmErMSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhlKGMpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaW52ZXJzZSBoeXBlcmJvbGljIHNpbmUgb2YgeC5cXFwifSxhdGFuOnskbWV0aDpmdW5jdGlvbiBhdGFuKGEpe3ZhciBiPU1hdGguYXRhbjtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhcmMgdGFuZ2VudCAobWVhc3VyZWQgaW4gcmFkaWFucykgb2YgeC5cXFwifSxhdGFuMjp7JG1ldGg6ZnVuY3Rpb24gYXRhbjIoYSxiKXt2YXIgYz1NYXRoLmF0YW4yO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyhTay5idWlsdGluLmFzbnVtJChhKSxTay5idWlsdGluLmFzbnVtJChiKSkpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIHRhbmdlbnQgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHkveC5cXFxcblxcXFxuVW5saWtlIGF0YW4oeS94KSwgdGhlIHNpZ25zIG9mIGJvdGggeCBhbmQgeSBhcmUgY29uc2lkZXJlZC5cXFwifSxhdGFuaDp7JG1ldGg6ZnVuY3Rpb24gYXRhbmgoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksYT1Tay5idWlsdGluLmFzbnVtJChhKTtjb25zdCBiPSgxK2EpLygxLWEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZShiKS8yKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaW52ZXJzZSBoeXBlcmJvbGljIHRhbmdlbnQgb2YgeC5cXFwifSxjZWlsOnskbWV0aDpmdW5jdGlvbiBjZWlsKGEpe3ZhciBiPU1hdGguY2VpbDtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJcXFwiLFxcXCJyZWFsIG51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYz1Tay5idWlsdGluLmFzbnVtJChhKTtyZXR1cm4gU2suX19mdXR1cmVfXy5jZWlsX2Zsb29yX2ludD9uZXcgU2suYnVpbHRpbi5pbnRfKGIoYykpOm5ldyBTay5idWlsdGluLmZsb2F0XyhiKGMpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgY2VpbGluZyBvZiB4IGFzIGFuIEludGVncmFsLlxcXFxuXFxcXG5UaGlzIGlzIHRoZSBzbWFsbGVzdCBpbnRlZ2VyID49IHguXFxcIn0sY29weXNpZ246eyRtZXRoOmZ1bmN0aW9uIGNvcHlzaWduKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7Y29uc3QgYz1Tay5idWlsdGluLmFzbnVtJChiKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGU9bihkKSxmPW4oYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhkKihlKmYpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gYSBmbG9hdCB3aXRoIHRoZSBtYWduaXR1ZGUgKGFic29sdXRlIHZhbHVlKSBvZiB4IGJ1dCB0aGUgc2lnbiBvZiB5LlxcXFxuXFxcXG5PbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHNpZ25lZCB6ZXJvcywgY29weXNpZ24oMS4wLCAtMC4wKVxcXFxucmV0dXJucyAtMS4wLlxcXFxuXFxcIn0sY29zOnskbWV0aDpmdW5jdGlvbiBjb3MoYSl7dmFyIGI9TWF0aC5jb3M7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgY29zaW5lIG9mIHggKG1lYXN1cmVkIGluIHJhZGlhbnMpLlxcXCJ9LGNvc2g6eyRtZXRoOmZ1bmN0aW9uIGNvc2goYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksYT1Tay5idWlsdGluLmFzbnVtJChhKTtjb25zdCBiPWcoZCxhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKChiKzEvYikvMil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGh5cGVyYm9saWMgY29zaW5lIG9mIHguXFxcIn0sZGVncmVlczp7JG1ldGg6ZnVuY3Rpb24gZGVncmVlcyhiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2NvbnN0IGM9MTgwL2EqU2suYnVpbHRpbi5hc251bSQoYik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkNvbnZlcnQgYW5nbGUgeCBmcm9tIHJhZGlhbnMgdG8gZGVncmVlcy5cXFwifSxlcmY6eyRtZXRoOmZ1bmN0aW9uIGVyZigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hdGguZXJmKCkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkVycm9yIGZ1bmN0aW9uIGF0IHguXFxcIn0sZXJmYzp7JG1ldGg6ZnVuY3Rpb24gZXJmYygpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hdGguZXJmYygpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJDb21wbGVtZW50YXJ5IGVycm9yIGZ1bmN0aW9uIGF0IHguXFxcIn0sZXhwOnskbWV0aDpmdW5jdGlvbiBleHAoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9YS52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgYiYmKGI9YS5uYiRmbG9hdCgpLnYpLGI9PTEvMHx8Yj09LUluZmluaXR5fHxpc05hTihiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGYoYikpO2NvbnN0IGM9ZihiKTtpZighaXNGaW5pdGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcXFwibWF0aCByYW5nZSBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gZSByYWlzZWQgdG8gdGhlIHBvd2VyIG9mIHguXFxcIn0sZXhwbTE6eyRtZXRoOmZ1bmN0aW9uIGV4cG0xKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoLjc+ayhiKSl7Y29uc3QgYT1mKGIpO2lmKDE9PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKTtlbHNle2NvbnN0IGM9KGEtMSkqYi9lKGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9fWVsc2V7Y29uc3QgYT1mKGIpLTE7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX19LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gZXhwKHgpLTEuXFxcXG5cXFxcblRoaXMgZnVuY3Rpb24gYXZvaWRzIHRoZSBsb3NzIG9mIHByZWNpc2lvbiBpbnZvbHZlZCBpbiB0aGUgZGlyZWN0IGV2YWx1YXRpb24gb2YgZXhwKHgpLTEgZm9yIHNtYWxsIHguXFxcIn0sZmFiczp7JG1ldGg6ZnVuY3Rpb24gZmFicyhhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYj1hLnY7cmV0dXJuIEpTQkkuX19pc0JpZ0ludChiKSYmKGI9YS5uYiRmbG9hdCgpLnYpLGI9ayhiKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBmbG9hdCB4LlxcXCJ9LGZhY3RvcmlhbDp7JG1ldGg6ZnVuY3Rpb24gZmFjdG9yaWFsKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKGE9aihiKSxhIT1iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImZhY3RvcmlhbCgpIG9ubHkgYWNjZXB0cyBpbnRlZ3JhbCB2YWx1ZXNcXFwiKTtpZigwPmEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiZmFjdG9yaWFsKCkgbm90IGRlZmluZWQgZm9yIG5lZ2F0aXZlIG51bWJlcnNcXFwiKTtsZXQgYz0xO2ZvcihsZXQgYj0yO2I8PWEmJmI8PW87YisrKWMqPWI7aWYoYTw9bylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKTtjPUpTQkkuQmlnSW50KGMpO2ZvcihsZXQgYj0xOTtiPD1hO2IrKyljPUpTQkkubXVsdGlwbHkoYyxKU0JJLkJpZ0ludChiKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJGaW5kIHghLlxcXFxuXFxcXG5SYWlzZSBhIFZhbHVlRXJyb3IgaWYgeCBpcyBuZWdhdGl2ZSBvciBub24taW50ZWdyYWwuXFxcIn0sZmxvb3I6eyRtZXRoOmZ1bmN0aW9uIGZsb29yKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5fX2Z1dHVyZV9fLmNlaWxfZmxvb3JfaW50P25ldyBTay5idWlsdGluLmludF8oaihTay5idWlsdGluLmFzbnVtJChhKSkpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGZsb29yIG9mIHggYXMgYW4gSW50ZWdyYWwuXFxcXG5cXFxcblRoaXMgaXMgdGhlIGxhcmdlc3QgaW50ZWdlciA8PSB4LlxcXCJ9LGZtb2Q6eyRtZXRoOmZ1bmN0aW9uIGZtb2QoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtsZXQgYz1hLnYsZD1iLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBjJiYoYz1hLm5iJGZsb2F0KCkudiksXFxcIm51bWJlclxcXCIhPXR5cGVvZiBkJiYoZD1iLm5iJGZsb2F0KCkudiksKGQ9PTEvMHx8ZD09LUluZmluaXR5KSYmaXNGaW5pdGUoYykpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKTtjb25zdCBlPWMlZDtpZihpc05hTihlKSYmIWlzTmFOKGMpJiYhaXNOYU4oZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgeSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBmbW9kKHgsIHkpLCBhY2NvcmRpbmcgdG8gcGxhdGZvcm0gQy5cXFxcblxcXFxueCAlIHkgbWF5IGRpZmZlci5cXFwifSxmcmV4cDp7JG1ldGg6ZnVuY3Rpb24gZnJleHAoYSl7dmFyIGI9TWF0aC5tYXg7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYz1Tay5idWlsdGluLmFzbnVtJChhKSxkPVtjLDBdO2lmKDAhPT1jJiZpKGMpKXtjb25zdCBhPWsoYyk7bGV0IGU9YigtMTAyMyxqKGgoYSkpKzEpLGY9YSpnKDIsLWUpO2Zvcig7LjU+ZjspZio9MixlLS07Zm9yKDsxPD1mOylmKj0uNSxlKys7MD5jJiYoZj0tZiksZFswXT1mLGRbMV09ZX1yZXR1cm4gZFswXT1uZXcgU2suYnVpbHRpbi5mbG9hdF8oZFswXSksZFsxXT1uZXcgU2suYnVpbHRpbi5pbnRfKGRbMV0pLG5ldyBTay5idWlsdGluLnR1cGxlKGQpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBtYW50aXNzYSBhbmQgZXhwb25lbnQgb2YgeCwgYXMgcGFpciAobSwgZSkuXFxcXG5cXFxcbm0gaXMgYSBmbG9hdCBhbmQgZSBpcyBhbiBpbnQsIHN1Y2ggdGhhdCB4ID0gbSAqIDIuKiplLlxcXFxuSWYgeCBpcyAwLCBtIGFuZCBlIGFyZSBib3RoIDAuICBFbHNlIDAuNSA8PSBhYnMobSkgPCAxLjAuXFxcIn0sZnN1bTp7JG1ldGg6ZnVuY3Rpb24gZnN1bShhKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiJ1xcXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXFxcIicgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZVxcXCIpO2xldCBiPVtdO2E9U2suYWJzdHIuaXRlcihhKTtsZXQgYyxkLGU7Zm9yKGxldCBmPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1mO2Y9YS50cCRpdGVybmV4dCgpKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJcXFwiLFxcXCJyZWFsIG51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihmKSksYz0wO2xldCBhPWYudjtcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGEmJihhPWYubmIkZmxvYXQoKS52KSxmPWE7Zm9yKGxldCBhLGc9MCxoPWIubGVuZ3RoO2c8aDtnKyspe2lmKGE9YltnXSxrKGYpPGsoYSkpe2xldCBiPWY7Zj1hLGE9Yn1kPWYrYSxlPWEtKGQtZiksZSYmKGJbY109ZSxjKyspLGY9ZH1iPWIuc2xpY2UoMCxjKS5jb25jYXQoW2ZdKX1jb25zdCBmPWIucmVkdWNlKGZ1bmN0aW9uKGMsYSl7cmV0dXJuIGMrYX0sMCk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhmKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgc2VxLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGFuIGFjY3VyYXRlIGZsb2F0aW5nIHBvaW50IHN1bSBvZiB2YWx1ZXMgaW4gdGhlIGl0ZXJhYmxlIHNlcS5cXFxcblxcXFxuQXNzdW1lcyBJRUVFLTc1NCBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljLlxcXCJ9LGdhbW1hOnskbWV0aDpmdW5jdGlvbiBnYW1tYSgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hdGguZ2FtbWEoKSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiR2FtbWEgZnVuY3Rpb24gYXQgeC5cXFwifSxnY2Q6eyRtZXRoOmZ1bmN0aW9uIGdjZChjLGEpe2Z1bmN0aW9uIF9nY2QoYyxhKXtyZXR1cm4gMD09YT9jOl9nY2QoYSxjJWEpfWZ1bmN0aW9uIF9iaWdnY2QoYyxhKXtyZXR1cm4gSlNCSS5lcXVhbChhLEpTQkkuX19aRVJPKT9jOl9iaWdnY2QoYSxKU0JJLnJlbWFpbmRlcihjLGEpKX1Tay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJhXFxcIixcXFwiaW50ZWdlclxcXCIsU2suYnVpbHRpbi5jaGVja0ludChjKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYlxcXCIsXFxcImludGVnZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpO2xldCBiLGQ9U2suYnVpbHRpbi5hc251bSQoYyksZT1Tay5idWlsdGluLmFzbnVtJChhKTtyZXR1cm5cXFwibnVtYmVyXFxcIj09dHlwZW9mIGQmJlxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT8oZD1rKGQpLGU9ayhlKSxiPV9nY2QoZCxlKSxiPTA+Yj8tYjpiLG5ldyBTay5idWlsdGluLmludF8oYikpOihkPUpTQkkuQmlnSW50KGQpLGU9SlNCSS5CaWdJbnQoZSksYj1fYmlnZ2NkKGQsZSksSlNCSS5sZXNzVGhhbihiLEpTQkkuX19aRVJPKSYmKGI9SlNCSS5tdWx0aXBseShiLEpTQkkuQmlnSW50KC0xKSkpLG5ldyBTay5idWlsdGluLmludF8oYi50b1N0cmluZygpKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3Igb2YgeCBhbmQgeVxcXCJ9LGh5cG90OnskbWV0aDpmdW5jdGlvbiBoeXBvdChhLGMpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGMpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGM9U2suYnVpbHRpbi5hc251bSQoYyksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoYSphK2MqYykpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgeSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlLCBzcXJ0KHgqeCArIHkqeSkuXFxcIn0saXNjbG9zZTp7JG1ldGg6ZnVuY3Rpb24gaXNjbG9zZShjLGQpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXNjbG9zZVxcXCIsYywyLDIpLHJlbF9hYnNfdmFscz1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiaXNjbG9zZVxcXCIsW1xcXCJyZWxfdG9sXFxcIixcXFwiYWJzX3RvbFxcXCJdLFtdLGQsW25ldyBTay5idWlsdGluLmZsb2F0XygxZS05KSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oMCldKTtjb25zdCBlPWNbMF0sYT1jWzFdLGI9cmVsX2Fic192YWxzWzBdLGY9cmVsX2Fic192YWxzWzFdO1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImFcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImJcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJlbF90b2xcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImFic190b2xcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZikpO2NvbnN0IGc9U2suYnVpbHRpbi5hc251bSQoZSksaD1Tay5idWlsdGluLmFzbnVtJChhKSxpPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGo9U2suYnVpbHRpbi5hc251bSQoZik7aWYoMD5pfHwwPmopdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwidG9sZXJhbmNlcyBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2lmKGc9PWgpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtpZihnPT0xLzB8fGc9PS1JbmZpbml0eXx8aD09MS8wfHxoPT0tSW5maW5pdHkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Y29uc3QgbD1rKGgtZyksbT1sPD1rKGkqaCl8fGw8PWsoaSpnKXx8bDw9ajtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChtKX0sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCAvLCBhLCBiLCAqLCByZWxfdG9sPTFlLTA5LCBhYnNfdG9sPTAuMClcXFwiLCRkb2M6XFxcIkRldGVybWluZSB3aGV0aGVyIHR3byBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSBjbG9zZSBpbiB2YWx1ZS5cXFxcblxcXFxuICByZWxfdG9sXFxcXG4gICAgbWF4aW11bSBkaWZmZXJlbmNlIGZvciBiZWluZyBjb25zaWRlcmVkIFxcXFxcXFwiY2xvc2VcXFxcXFxcIiwgcmVsYXRpdmUgdG8gdGhlXFxcXG4gICAgbWFnbml0dWRlIG9mIHRoZSBpbnB1dCB2YWx1ZXNcXFxcbiAgYWJzX3RvbFxcXFxuICAgIG1heGltdW0gZGlmZmVyZW5jZSBmb3IgYmVpbmcgY29uc2lkZXJlZCBcXFxcXFxcImNsb3NlXFxcXFxcXCIsIHJlZ2FyZGxlc3Mgb2YgdGhlXFxcXG4gICAgbWFnbml0dWRlIG9mIHRoZSBpbnB1dCB2YWx1ZXNcXFxcblxcXFxuUmV0dXJuIFRydWUgaWYgYSBpcyBjbG9zZSBpbiB2YWx1ZSB0byBiLCBhbmQgRmFsc2Ugb3RoZXJ3aXNlLlxcXFxuXFxcXG5Gb3IgdGhlIHZhbHVlcyB0byBiZSBjb25zaWRlcmVkIGNsb3NlLCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW1cXFxcbm11c3QgYmUgc21hbGxlciB0aGFuIGF0IGxlYXN0IG9uZSBvZiB0aGUgdG9sZXJhbmNlcy5cXFxcblxcXFxuLWluZiwgaW5mIGFuZCBOYU4gYmVoYXZlIHNpbWlsYXJseSB0byB0aGUgSUVFRSA3NTQgU3RhbmRhcmQuICBUaGF0XFxcXG5pcywgTmFOIGlzIG5vdCBjbG9zZSB0byBhbnl0aGluZywgZXZlbiBpdHNlbGYuICBpbmYgYW5kIC1pbmYgYXJlXFxcXG5vbmx5IGNsb3NlIHRvIHRoZW1zZWx2ZXMuXFxcIn0saXNmaW5pdGU6eyRtZXRoOmZ1bmN0aW9uIGlzZmluaXRlKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSk/U2suYnVpbHRpbi5ib29sLnRydWUkOmlzRmluaXRlKGIpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIFRydWUgaWYgeCBpcyBuZWl0aGVyIGFuIGluZmluaXR5IG5vciBhIE5hTiwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFwifSxpc2luZjp7JG1ldGg6ZnVuY3Rpb24gaXNpbmYoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYj1Tay5idWlsdGluLmFzbnVtJChhKTtyZXR1cm4gU2suYnVpbHRpbi5jaGVja0ludChhKT9Tay5idWlsdGluLmJvb2wuZmFsc2UkOmlzRmluaXRlKGIpfHxpc05hTihiKT9Tay5idWlsdGluLmJvb2wuZmFsc2UkOlNrLmJ1aWx0aW4uYm9vbC50cnVlJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBUcnVlIGlmIHggaXMgYSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbmZpbml0eSwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFwifSxpc25hbjp7JG1ldGg6ZnVuY3Rpb24gaXNuYW4oYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYj1Tay5idWlsdGluLmFzbnVtJChhKTtyZXR1cm4gaXNOYU4oYik/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiB4IGlzIGEgTmFOIChub3QgYSBudW1iZXIpLCBhbmQgRmFsc2Ugb3RoZXJ3aXNlLlxcXCJ9LGxkZXhwOnskbWV0aDpmdW5jdGlvbiBsZGV4cChhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImlcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGIpKTtsZXQgYz1hLnY7XFxcIm51bWJlclxcXCIhPXR5cGVvZiBjJiYoYz1hLm5iJGZsb2F0KCkudik7Y29uc3QgZD1Tay5idWlsdGluLmFzbnVtJChiKTtpZihjPT0xLzB8fGM9PS1JbmZpbml0eXx8MD09Y3x8aXNOYU4oYykpcmV0dXJuIGE7Y29uc3QgZT1jKmcoMixkKTtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcXFwibWF0aCByYW5nZSBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCBpLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHggKiAoMioqaSkuXFxcXG5cXFxcblRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIGludmVyc2Ugb2YgZnJleHAoKS5cXFwifSxsZ2FtbWE6eyRtZXRoOmZ1bmN0aW9uIGxnYW1tYSgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hdGgubGdhbW1hKCkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIk5hdHVyYWwgbG9nYXJpdGhtIG9mIGFic29sdXRlIHZhbHVlIG9mIEdhbW1hIGZ1bmN0aW9uIGF0IHguXFxcIn0sbG9nOnskbWV0aDpmdW5jdGlvbiBsb2coYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgZixnLGg9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoMD49aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2lmKHZvaWQgMD09PWI/Zj1kOihTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJiYXNlXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxmPVNrLmJ1aWx0aW4uYXNudW0kKGIpKSwwPj1mKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrRmxvYXQoYSl8fGg8YylnPWUoaCkvZShmKTtlbHNle2g9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpLiRqc3N0cigpO2NvbnN0IGI9aC5sZW5ndGgsYz1wYXJzZUZsb2F0KFxcXCIwLlxcXCIraCk7Zz0oYiplKDEwKStlKGMpKS9lKGYpfXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZyl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJsb2coeCwgW2Jhc2U9ZV0pXFxcXG5SZXR1cm4gdGhlIGxvZ2FyaXRobSBvZiB4IHRvIHRoZSBnaXZlbiBiYXNlLlxcXFxuXFxcXG5JZiB0aGUgYmFzZSBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSAoYmFzZSBlKSBvZiB4LlxcXCJ9LGxvZzEwOnskbWV0aDpmdW5jdGlvbiBsb2cxMChhKXt2YXIgYj1NYXRoLmxvZzEwO1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBkLGU9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoMD5lKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrRmxvYXQoYSl8fGU8YylkPWIoZSk7ZWxzZXtlPW5ldyBTay5idWlsdGluLnN0cihhKS4kanNzdHIoKTtjb25zdCBjPWUubGVuZ3RoLGY9cGFyc2VGbG9hdChcXFwiMC5cXFwiK2UpO2Q9YytiKGYpfXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGJhc2UgMTAgbG9nYXJpdGhtIG9mIHguXFxcIn0sbG9nMXA6eyRtZXRoOmZ1bmN0aW9uIGxvZzFwKGEpe3ZhciBiPU51bWJlci5FUFNJTE9OO1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBjPWEudjtpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGMmJihjPWEubmIkZmxvYXQoKS52KSwtMT49Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2V7aWYoMD09YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpO2lmKGsoYyk8Yi8yKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyk7aWYoLS41PD1jJiYxPj1jKXtjb25zdCBhPTErYyxiPWUoYSktKGEtMS1jKS9hO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYil9ZWxzZXtjb25zdCBhPWUoMStjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfX19LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIDEreCAoYmFzZSBlKS5cXFxcblxcXFxuVGhlIHJlc3VsdCBpcyBjb21wdXRlZCBpbiBhIHdheSB3aGljaCBpcyBhY2N1cmF0ZSBmb3IgeCBuZWFyIHplcm8uXFxcIn0sbG9nMjp7JG1ldGg6ZnVuY3Rpb24gbG9nMihhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYixkPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxkPGMpYj1oKGQpO2Vsc2V7ZD1uZXcgU2suYnVpbHRpbi5zdHIoYSkuJGpzc3RyKCk7Y29uc3QgYz1kLmxlbmd0aCxlPXBhcnNlRmxvYXQoXFxcIjAuXFxcIitkKTtiPWMqaCgxMCkraChlKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBiYXNlIDIgbG9nYXJpdGhtIG9mIHguXFxcIn0sbW9kZjp7JG1ldGg6ZnVuY3Rpb24gbW9kZihhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYj1Tay5idWlsdGluLmFzbnVtJChhKTtpZighaXNGaW5pdGUoYikpe2lmKGI9PTEvMClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XygwKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYildKTtpZihiPT0tSW5maW5pdHkpcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oLTApLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKV0pO2lmKGlzTmFOKGIpKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKV0pfWNvbnN0IGM9bihiKTtiPWsoYik7Y29uc3QgZT1jKmooYiksZj1jKihiLWooYikpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGYpLG5ldyBTay5idWlsdGluLmZsb2F0XyhlKV0pfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBmcmFjdGlvbmFsIGFuZCBpbnRlZ2VyIHBhcnRzIG9mIHguXFxcXG5cXFxcbkJvdGggcmVzdWx0cyBjYXJyeSB0aGUgc2lnbiBvZiB4IGFuZCBhcmUgZmxvYXRzLlxcXCJ9LHBvdzp7JG1ldGg6ZnVuY3Rpb24gcG93KGEsYil7dmFyIGM9TnVtYmVyLmlzSW50ZWdlcjtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtsZXQgZD1hLnYsZT1iLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBkJiYoZD1hLm5iJGZsb2F0KCkudiksXFxcIm51bWJlclxcXCIhPXR5cGVvZiBlJiYoZT1iLm5iJGZsb2F0KCkudiksMD09ZCYmMD5lKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7ZWxzZXtpZigxPT1kKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oMSk7aWYoaShkKSYmaShlKSYmMD5kJiYhYyhlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoLTE9PWQmJihlPT0tSW5maW5pdHl8fGU9PTEvMCkpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygxKX1jb25zdCBmPWcoZCxlKTtpZighaShkKXx8IWkoZSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhmKTtpZihmPT0xLzB8fGY9PS1JbmZpbml0eSl0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKFxcXCJtYXRoIHJhbmdlIGVycm9yXFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhmKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4geCoqeSAoeCB0byB0aGUgcG93ZXIgb2YgeSkuXFxcIn0scmFkaWFuczp7JG1ldGg6ZnVuY3Rpb24gcmFkaWFucyhiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJkZWdcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2NvbnN0IGM9YS8xODAqU2suYnVpbHRpbi5hc251bSQoYik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkNvbnZlcnQgYW5nbGUgeCBmcm9tIGRlZ3JlZXMgdG8gcmFkaWFucy5cXFwifSxyZW1haW5kZXI6eyRtZXRoOmZ1bmN0aW9uIHJlbWFpbmRlcihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInlcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2xldCBkPWEudixlPWIudjtpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGQmJihkPWEubmIkZmxvYXQoKS52KSxcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGUmJihlPWIubmIkZmxvYXQoKS52KSxpc0Zpbml0ZShkKSYmaXNGaW5pdGUoZSkpe2xldCBhLGIsZixjLGc7aWYoMD09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2lmKGE9ayhkKSxiPWsoZSksYz1hJWIsZj1iLWMsYzxmKWc9YztlbHNlIGlmKGM+ZilnPS1mO2Vsc2V7aWYoYyE9Zil0aHJvdyBuZXcgU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcjtnPWMtMiooLjUqKGEtYyklYil9cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhuKGQpKmcpfWlmKGlzTmFOKGQpKXJldHVybiBhO2lmKGlzTmFOKGUpKXJldHVybiBiO2lmKGQ9PTEvMHx8ZD09LUluZmluaXR5KXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7aWYoZSE9MS8wJiZlIT0tSW5maW5pdHkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3I7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhkKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJEaWZmZXJlbmNlIGJldHdlZW4geCBhbmQgdGhlIGNsb3Nlc3QgaW50ZWdlciBtdWx0aXBsZSBvZiB5LlxcXFxuXFxcXG5SZXR1cm4geCAtIG4qeSB3aGVyZSBuKnkgaXMgdGhlIGNsb3Nlc3QgaW50ZWdlciBtdWx0aXBsZSBvZiB5LlxcXFxuSW4gdGhlIGNhc2Ugd2hlcmUgeCBpcyBleGFjdGx5IGhhbGZ3YXkgYmV0d2VlbiB0d28gbXVsdGlwbGVzIG9mXFxcXG55LCB0aGUgbmVhcmVzdCBldmVuIHZhbHVlIG9mIG4gaXMgdXNlZC4gVGhlIHJlc3VsdCBpcyBhbHdheXMgZXhhY3QuXFxcIn0sc2luOnskbWV0aDpmdW5jdGlvbiBzaW4oYSl7dmFyIGI9TWF0aC5zaW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgc2luZSBvZiB4IChtZWFzdXJlZCBpbiByYWRpYW5zKS5cXFwifSxzaW5oOnskbWV0aDpmdW5jdGlvbiBzaW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYj1nKGQsYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygoYi0xL2IpLzIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBoeXBlcmJvbGljIHNpbmUgb2YgeC5cXFwifSxzcXJ0OnskbWV0aDpmdW5jdGlvbiBzcXJ0KGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoMD5jKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKGMpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgc3F1YXJlIHJvb3Qgb2YgeC5cXFwifSx0YW46eyRtZXRoOmZ1bmN0aW9uIHRhbihhKXt2YXIgYj1NYXRoLnRhbjtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSB0YW5nZW50IG9mIHggKG1lYXN1cmVkIGluIHJhZGlhbnMpLlxcXCJ9LHRhbmg6eyRtZXRoOmZ1bmN0aW9uIHRhbmgoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYj1Tay5idWlsdGluLmFzbnVtJChhKTtpZigwPT09YilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpO2NvbnN0IGM9ZyhkLGIpLGU9MS9jO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oKGMtZSkvMi8oKGMrZSkvMikpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBoeXBlcmJvbGljIHRhbmdlbnQgb2YgeC5cXFwifSx0cnVuYzp7JG1ldGg6ZnVuY3Rpb24gdHJ1bmMoYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSk/YTpuZXcgU2suYnVpbHRpbi5pbnRfKDB8U2suYnVpbHRpbi5hc251bSQoYSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiVHJ1bmNhdGVzIHRoZSBSZWFsIHggdG8gdGhlIG5lYXJlc3QgSW50ZWdyYWwgdG93YXJkIDAuXFxcXG5cXFxcblVzZXMgdGhlIF9fdHJ1bmNfXyBtYWdpYyBtZXRob2QuXFxcIn19KSxsfTtcIixcInNyYy9saWIvbWQ1LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtZDUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9taGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWhsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9taW1ldG9vbHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1pbWV0b29scyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21pbWV0eXBlcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWltZXR5cGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWltaWZ5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1pZnkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tb2R1bGVmaW5kZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1vZHVsZWZpbmRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211bHRpZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibXVsdGlmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbXVsdGlwcm9jZXNzaW5nL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtdWx0aXByb2Nlc3NpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImR1bW15IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbXV0ZXgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm11dGV4IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbmV0cmMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm5ldHJjIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbmV3LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJuZXcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9ubnRwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJubnRwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbnRwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJudHBhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9udHVybDJwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJudHVybDJwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbnVtYmVycy5weVwiOlwiTnVtYmVyID0gKGludCwgZmxvYXQsIGNvbXBsZXgpXFxuSW50ZWdyYWwgPSBpbnRcXG5Db21wbGV4ID0gY29tcGxleFxcblwiLFwic3JjL2xpYi9vcGNvZGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm9wY29kZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL29wZXJhdG9yLmpzXCI6XCJmdW5jdGlvbiAkYnVpbHRpbm1vZHVsZSgpe3JldHVybiBvcGVyYXRvcj17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJvcGVyYXRvclxcXCIpLF9fZG9jX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJPcGVyYXRvciBpbnRlcmZhY2UuXFxcXG5cXFxcblRoaXMgbW9kdWxlIGV4cG9ydHMgYSBzZXQgb2YgZnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGphdmFzY3JpcHQgY29ycmVzcG9uZGluZ1xcXFxudG8gdGhlIGludHJpbnNpYyBvcGVyYXRvcnMgb2YgUHl0aG9uLiAgRm9yIGV4YW1wbGUsIG9wZXJhdG9yLmFkZCh4LCB5KVxcXFxuaXMgZXF1aXZhbGVudCB0byB0aGUgZXhwcmVzc2lvbiB4K3kuICBUaGUgZnVuY3Rpb24gbmFtZXMgYXJlIHRob3NlXFxcXG51c2VkIGZvciBzcGVjaWFsIG1ldGhvZHM7IHZhcmlhbnRzIHdpdGhvdXQgbGVhZGluZyBhbmQgdHJhaWxpbmdcXFxcbidfXycgYXJlIGFsc28gcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlLlxcXCIpLF9fYWxsX186bmV3IFNrLmJ1aWx0aW4ubGlzdChbXFxcImFic1xcXCIsXFxcImFkZFxcXCIsXFxcImFuZF9cXFwiLFxcXCJhdHRyZ2V0dGVyXFxcIixcXFwiY29uY2F0XFxcIixcXFwiY29udGFpbnNcXFwiLFxcXCJjb3VudE9mXFxcIixcXFwiZGVsaXRlbVxcXCIsXFxcImVxXFxcIixcXFwiZmxvb3JkaXZcXFwiLFxcXCJnZVxcXCIsXFxcImdldGl0ZW1cXFwiLFxcXCJndFxcXCIsXFxcImlhZGRcXFwiLFxcXCJpYW5kXFxcIixcXFwiaWNvbmNhdFxcXCIsXFxcImlmbG9vcmRpdlxcXCIsXFxcImlsc2hpZnRcXFwiLFxcXCJpbWF0bXVsXFxcIixcXFwiaW1vZFxcXCIsXFxcImltdWxcXFwiLFxcXCJpbmRleFxcXCIsXFxcImluZGV4T2ZcXFwiLFxcXCJpbnZcXFwiLFxcXCJpbnZlcnRcXFwiLFxcXCJpb3JcXFwiLFxcXCJpcG93XFxcIixcXFwiaXJzaGlmdFxcXCIsXFxcImlzX1xcXCIsXFxcImlzX25vdFxcXCIsXFxcImlzdWJcXFwiLFxcXCJpdGVtZ2V0dGVyXFxcIixcXFwiaXRydWVkaXZcXFwiLFxcXCJpeG9yXFxcIixcXFwibGVcXFwiLFxcXCJsZW5ndGhfaGludFxcXCIsXFxcImxzaGlmdFxcXCIsXFxcImx0XFxcIixcXFwibWF0bXVsXFxcIixcXFwibWV0aG9kY2FsbGVyXFxcIixcXFwibW9kXFxcIixcXFwibXVsXFxcIixcXFwibmVcXFwiLFxcXCJuZWdcXFwiLFxcXCJub3RfXFxcIixcXFwib3JfXFxcIixcXFwicG9zXFxcIixcXFwicG93XFxcIixcXFwicnNoaWZ0XFxcIixcXFwic2V0aXRlbVxcXCIsXFxcInN1YlxcXCIsXFxcInRydWVkaXZcXFwiLFxcXCJ0cnV0aFxcXCIsXFxcInhvclxcXCJdLm1hcChhPT5uZXcgU2suYnVpbHRpbi5zdHIoYSkpKX0sb3BlcmF0b3IuaXRlbWdldHRlcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJvcGVyYXRvci5pdGVtZ2V0dGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gaXRlbWdldHRlcihhKXt0aGlzLml0ZW1zPWEsdGhpcy5vbmVpdGVtPTE9PT1hLmxlbmd0aCx0aGlzLml0ZW09YVswXSx0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXcoYSxiKXtyZXR1cm4gU2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiaXRlbWdldHRlclxcXCIsYiksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJpdGVtZ2V0dGVyXFxcIixhLDEpLG5ldyBvcGVyYXRvci5pdGVtZ2V0dGVyKGEpfSx0cCRjYWxsKGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiaXRlbWdldHRlclxcXCIsYiksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJpdGVtZ2V0dGVyXFxcIixhLDEsMSk7Y29uc3QgYz1hWzBdO3JldHVybiB0aGlzLm9uZWl0ZW0/U2suYWJzdHIub2JqZWN0R2V0SXRlbShjLHRoaXMuaXRlbSwhMCk6bmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy5pdGVtcy5tYXAoYT0+U2suYWJzdHIub2JqZWN0R2V0SXRlbShjLGEpKSl9LHRwJGRvYzpcXFwiUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgZmV0Y2hlcyB0aGUgZ2l2ZW4gaXRlbShzKSBmcm9tIGl0cyBvcGVyYW5kLlxcXFxuICAgICAgICAgICAgQWZ0ZXIgZiA9IGl0ZW1nZXR0ZXIoMiksIHRoZSBjYWxsIGYocikgcmV0dXJucyByWzJdLlxcXFxuICAgICAgICAgICAgQWZ0ZXIgZyA9IGl0ZW1nZXR0ZXIoMiwgNSwgMyksIHRoZSBjYWxsIGcocikgcmV0dXJucyAoclsyXSwgcls1XSwgclszXSlcXFwiLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy50cCRuYW1lK1xcXCIoLi4uKVxcXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudHAkbmFtZStcXFwiKFxcXCIrdGhpcy5pdGVtcy5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSkuam9pbihcXFwiLCBcXFwiKStcXFwiKVxcXCI7cmV0dXJuIHRoaXMuaW4kcmVwcj0hMSxhfX19KSxvcGVyYXRvci5hdHRyZ2V0dGVyPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcIm9wZXJhdG9yLmF0dHJnZXR0ZXJcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBhdHRyZ2V0dGVyKGEpe3RoaXMuYXR0cnM9YSx0aGlzLm9uZWF0dHI9MT09PWEubGVuZ3RoLHRoaXMuYXR0cj1hWzBdLHRoaXMuaW4kcmVwcj0hMX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJG5ldyhhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImF0dHJnZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiYXR0cmdldHRlclxcXCIsYSwxKTtjb25zdCBjPVtdO2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBiPWFbZF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nXFxcIik7Yi52LmluY2x1ZGVzKFxcXCIuXFxcIik/Yy5wdXNoKGIuJGpzc3RyKCkuc3BsaXQoXFxcIi5cXFwiKS5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSk6Yy5wdXNoKFtiXSl9cmV0dXJuIG5ldyBvcGVyYXRvci5hdHRyZ2V0dGVyKGMpfSx0cCRjYWxsKGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiYXR0cmdldHRlclxcXCIsYiksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJhdHRyZ2V0dGVyXFxcIixhLDEsMSk7Y29uc3QgYz1hWzBdO2lmKHRoaXMub25lYXR0cilyZXR1cm4gdGhpcy5hdHRyLnJlZHVjZSgoYSxiKT0+U2suYWJzdHIuZ2F0dHIoYSxiKSxjKTtjb25zdCBkPXRoaXMuYXR0cnMubWFwKGE9PmEucmVkdWNlKChhLGIpPT5Tay5hYnN0ci5nYXR0cihhLGIpLGMpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoZCl9LHRwJGRvYzpcXFwiYXR0cmdldHRlcihhdHRyLCAuLi4pIC0tPiBhdHRyZ2V0dGVyIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBmZXRjaGVzIHRoZSBnaXZlbiBhdHRyaWJ1dGUocykgZnJvbSBpdHMgb3BlcmFuZC5cXFxcbkFmdGVyIGYgPSBhdHRyZ2V0dGVyKCduYW1lJyksIHRoZSBjYWxsIGYocikgcmV0dXJucyByLm5hbWUuXFxcXG5BZnRlciBnID0gYXR0cmdldHRlcignbmFtZScsICdkYXRlJyksIHRoZSBjYWxsIGcocikgcmV0dXJucyAoci5uYW1lLCByLmRhdGUpLlxcXFxuQWZ0ZXIgaCA9IGF0dHJnZXR0ZXIoJ25hbWUuZmlyc3QnLCAnbmFtZS5sYXN0JyksIHRoZSBjYWxsIGgocikgcmV0dXJuc1xcXFxuKHIubmFtZS5maXJzdCwgci5uYW1lLmxhc3QpLlxcXCIsJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnRwJG5hbWUrXFxcIiguLi4pXFxcIik7dGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy50cCRuYW1lK1xcXCIoXFxcIit0aGlzLml0ZW1zLm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKS5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIjtyZXR1cm4gdGhpcy5pbiRyZXByPSExLGF9fX0pLG9wZXJhdG9yLm1ldGhvZGNhbGxlcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJvcGVyYXRvci5tZXRob2RjYWxsZXJcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBtZXRob2RjYWxsZXIoYSxiLGMpe3RoaXMuJG5hbWU9YSx0aGlzLmFyZ3M9Yix0aGlzLmt3YXJncz1jfHxbXSx0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcIm1ldGhvZGNhbGxlclxcXCIsYSwxKTtjb25zdCBjPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nXFxcIik7cmV0dXJuIG5ldyBvcGVyYXRvci5tZXRob2RjYWxsZXIoYyxhLnNsaWNlKDEpLGIpfSx0cCRjYWxsKGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwibWV0aG9kY2FsbGVyXFxcIixiKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcIm1ldGhvZGNhbGxlclxcXCIsYSwxLDEpO2NvbnN0IGM9YVswXTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIuZ2F0dHIoYyx0aGlzLiRuYW1lLCEwKSxhPT5Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYSx0aGlzLmFyZ3MsdGhpcy5rd2FyZ3MpKX0sdHAkZG9jOlxcXCJtZXRob2RjYWxsZXIobmFtZSwgLi4uKSAtLT4gbWV0aG9kY2FsbGVyIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBjYWxscyB0aGUgZ2l2ZW4gbWV0aG9kIG9uIGl0cyBvcGVyYW5kLlxcXFxuQWZ0ZXIgZiA9IG1ldGhvZGNhbGxlcignbmFtZScpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgci5uYW1lKCkuXFxcXG5BZnRlciBnID0gbWV0aG9kY2FsbGVyKCduYW1lJywgJ2RhdGUnLCBmb289MSksIHRoZSBjYWxsIGcocikgcmV0dXJuc1xcXFxuci5uYW1lKCdkYXRlJywgZm9vPTEpLlxcXCIsJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnRwJG5hbWUrXFxcIiguLi4pXFxcIik7dGhpcy5pbiRyZXByPSEwO2xldCBhPVtTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuJG5hbWUpLC4uLnRoaXMuYXJncy5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSldO2ZvcihsZXQgYj0wO2I8dGhpcy5rd2FyZ3MubGVuZ3RoO2IrPTIpYS5wdXNoKHRoaXMua3dhcmdzW2JdK1xcXCI9XFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMua3dhcmdzW2IrMV0pKTtyZXR1cm4gYT10aGlzLnRwJG5hbWUrXFxcIihcXFwiK2Euam9pbihcXFwiLCBcXFwiKStcXFwiKVxcXCIsdGhpcy5pbiRyZXByPSExLGF9fX0pLFNrLmFic3RyLnNldFVwTW9kdWxlTWV0aG9kcyhcXFwib3BlcmF0b3JcXFwiLG9wZXJhdG9yLHtsdDp7JG1ldGg6ZnVuY3Rpb24gbHQoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkx0XFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA8IGIuXFxcIn0sbGU6eyRtZXRoOmZ1bmN0aW9uIGxlKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJMdEVcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIDw9IGIuXFxcIn0sZXE6eyRtZXRoOmZ1bmN0aW9uIGVxKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJFcVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPT0gYi5cXFwifSxuZTp7JG1ldGg6ZnVuY3Rpb24gbmUoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIk5vdEVxXFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAhPSBiLlxcXCJ9LGdlOnskbWV0aDpmdW5jdGlvbiBnZShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiR3RFXFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+PSBiLlxcXCJ9LGd0OnskbWV0aDpmdW5jdGlvbiBndChjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiR3RcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID4gYi5cXFwifSxub3RfOnskbWV0aDpmdW5jdGlvbiBub3RfKGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIk5vdFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBub3QgYS5cXFwifSx0cnV0aDp7JG1ldGg6ZnVuY3Rpb24gdHJ1dGgoYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChhKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBUcnVlIGlmIGEgaXMgdHJ1ZSwgRmFsc2Ugb3RoZXJ3aXNlLlxcXCJ9LGlzXzp7JG1ldGg6ZnVuY3Rpb24gaXNfKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJJc1xcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgaXMgYi5cXFwifSxpc19ub3Q6eyRtZXRoOmZ1bmN0aW9uIGlzX25vdChjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiSXNOb3RcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIGlzIG5vdCBiLlxcXCJ9LGFiczp7JG1ldGg6ZnVuY3Rpb24gYWJzKGEpe3JldHVybiBTay5idWlsdGluLmFicyhhKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYWJzKGEpLlxcXCJ9LGFkZDp7JG1ldGg6ZnVuY3Rpb24gYWRkKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiQWRkXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICsgYi5cXFwifSxhbmRfOnskbWV0aDpmdW5jdGlvbiBhbmRfKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiQml0QW5kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICYgYi5cXFwifSxmbG9vcmRpdjp7JG1ldGg6ZnVuY3Rpb24gZmxvb3JkaXYoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJGbG9vckRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvLyBiLlxcXCJ9LGluZGV4OnskbWV0aDpmdW5jdGlvbiBpbmRleChiKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEuX19pbmRleF9fKClcXFwifSxpbnY6eyRtZXRoOmZ1bmN0aW9uIGludihhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyVW5hcnlPcChhLFxcXCJJbnZlcnRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgfmEuXFxcIn0saW52ZXJ0OnskbWV0aDpmdW5jdGlvbiBpbnZlcnQoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiSW52ZXJ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyB+YS5cXFwifSxsc2hpZnQ6eyRtZXRoOmZ1bmN0aW9uIGxzaGlmdChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkxTaGlmdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA8PCBiLlxcXCJ9LG1vZDp7JG1ldGg6ZnVuY3Rpb24gbW9kKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiTW9kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICUgYi5cXFwifSxtdWw6eyRtZXRoOmZ1bmN0aW9uIG11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIk11bHRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKiBiLlxcXCJ9LG1hdG11bDp7JG1ldGg6ZnVuY3Rpb24gbWF0bXVsKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiTWF0TXVsdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSBAIGIuXFxcIn0sbmVnOnskbWV0aDpmdW5jdGlvbiBuZWcoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiVVN1YlxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyAtYS5cXFwifSxvcl86eyRtZXRoOmZ1bmN0aW9uIG9yXyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkJpdE9yXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIHwgYi5cXFwifSxwb3M6eyRtZXRoOmZ1bmN0aW9uIHBvcyhhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyVW5hcnlPcChhLFxcXCJVQWRkXFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzICthLlxcXCJ9LHBvdzp7JG1ldGg6ZnVuY3Rpb24gcG93KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiUG93XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICoqIGIuXFxcIn0scnNoaWZ0OnskbWV0aDpmdW5jdGlvbiByc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJSU2hpZnRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPj4gYi5cXFwifSxzdWI6eyRtZXRoOmZ1bmN0aW9uIHN1YihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIlN1YlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAtIGIuXFxcIn0sdHJ1ZWRpdjp7JG1ldGg6ZnVuY3Rpb24gZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiRGl2XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC8gYi5cXFwifSx4b3I6eyRtZXRoOmZ1bmN0aW9uIHhvcihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkJpdFhvclxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSBeIGIuXFxcIn0sY29uY2F0OnskbWV0aDpmdW5jdGlvbiBjb25jYXQoYyxhKXtyZXR1cm4gU2suYWJzdHIuc2VxdWVuY2VDb25jYXQoYyxhKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKyBiLCBmb3IgYSBhbmQgYiBzZXF1ZW5jZXMuXFxcIn0sY29udGFpbnM6eyRtZXRoOmZ1bmN0aW9uIGNvbnRhaW5zKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5hYnN0ci5zZXF1ZW5jZUNvbnRhaW5zKGMsYSkpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYiBpbiBhIChub3RlIHJldmVyc2VkIG9wZXJhbmRzKS5cXFwifSxjb3VudE9mOnskbWV0aDpmdW5jdGlvbiBjb3VudE9mKGMsYSl7cmV0dXJuIFNrLmFic3RyLnNlcXVlbmNlR2V0Q291bnRPZihjLGEpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIGIgb2NjdXJzIGluIGEuXFxcIn0sZGVsaXRlbTp7JG1ldGg6ZnVuY3Rpb24gZGVsaXRlbShjLGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5hYnN0ci5vYmplY3REZWxJdGVtKGMsYSwhMCksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBkZWwgYVtiXS5cXFwifSxnZXRpdGVtOnskbWV0aDpmdW5jdGlvbiBnZXRpdGVtKGMsYSl7cmV0dXJuIFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxhKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGFbYl0uXFxcIn0saW5kZXhPZjp7JG1ldGg6ZnVuY3Rpb24gaW5kZXhPZihjLGEpe3JldHVybiBTay5hYnN0ci5zZXF1ZW5jZUdldEluZGV4T2YoYyxhKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGZpcnN0IGluZGV4IG9mIGIgaW4gYS5cXFwifSxzZXRpdGVtOnskbWV0aDpmdW5jdGlvbiBzZXRpdGVtKGQsYSxiKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIub2JqZWN0U2V0SXRlbShkLGEsYiwhMCksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7TWluQXJnczozLE1heEFyZ3M6M30sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCBjLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhW2JdID0gYy5cXFwifSxsZW5ndGhfaGludDp7JG1ldGg6ZnVuY3Rpb24gbGVuZ3RoX2hpbnQoYSxiKXtpZih2b2lkIDA9PT1iKWI9bmV3IFNrLmJ1aWx0aW4uaW50XygwKTtlbHNlIGlmKCFTay5idWlsdGluLmNoZWNrSW50KGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiJ1xcXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXFxcIicgb2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyXFxcIik7dHJ5e3JldHVybiBTay5idWlsdGluLmxlbihhKX1jYXRjaChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLlR5cGVFcnJvcikpdGhyb3cgYX1jb25zdCBjPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kbGVuZ3RoX2hpbnQpO2lmKHZvaWQgMCE9PWMpe2NvbnN0IGE9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGMsW10pO2lmKGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJClyZXR1cm4gYjtpZighU2suYnVpbHRpbi5jaGVja0ludGVnZXIoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJfX2xlbmd0aF9oaW50X18gbXVzdCBiZSBhbiBpbnRlZ2VyLCBub3QgXFxcIitTay5hYnN0ci50eXBlTmFtZShhKSk7ZWxzZSBpZihhLm5iJGlzbmVnYXRpdmUoKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIl9fbGVuZ3RoX2hpbnRfXygpIHNob3VsZCByZXR1cm4gPj0gMFxcXCIpO3JldHVybiBhfXJldHVybiBifSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgb2JqLCBkZWZhdWx0PTAsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBvYmouXFxcXG5cXFxcblRoaXMgaXMgdXNlZnVsIGZvciBwcmVzaXppbmcgY29udGFpbmVycyB3aGVuIGJ1aWxkaW5nIGZyb20gYW4gaXRlcmFibGUuXFxcXG5cXFxcbklmIHRoZSBvYmplY3Qgc3VwcG9ydHMgbGVuKCksIHRoZSByZXN1bHQgd2lsbCBiZSBleGFjdC5cXFxcbk90aGVyd2lzZSwgaXQgbWF5IG92ZXItIG9yIHVuZGVyLWVzdGltYXRlIGJ5IGFuIGFyYml0cmFyeSBhbW91bnQuXFxcXG5UaGUgcmVzdWx0IHdpbGwgYmUgYW4gaW50ZWdlciA+PSAwLlxcXCJ9LGlhZGQ6eyRtZXRoOmZ1bmN0aW9uIGlhZGQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQWRkXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICs9IGIuXFxcIn0saWFuZDp7JG1ldGg6ZnVuY3Rpb24gaWFuZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJCaXRBbmRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgJj0gYi5cXFwifSxpY29uY2F0OnskbWV0aDpmdW5jdGlvbiBpY29uY2F0KGMsYSl7aWYodm9pZCAwIT09Yy5zcSRpbnBsYWNlX2NvbmNhdClyZXR1cm4gYy5zcSRpbnBsYWNlX2NvbmNhdChhKTtpZih2b2lkIDAhPT1jLnNxJGNvbmNhdClyZXR1cm4gYy5zcSRjb25jYXQoYSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZShjKXx8IVNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoU2suYWJzdHIudHlwZU5hbWUoYykrXFxcIiBvYmplY3QgY2FuJ3QgYmUgY29uY2F0ZW5hdGVkXFxcIik7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkFkZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArPSBiLCBmb3IgYSBhbmQgYiBzZXF1ZW5jZXMuXFxcIn0saWZsb29yZGl2OnskbWV0aDpmdW5jdGlvbiBpZmxvb3JkaXYoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiRmxvb3JEaXZcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLy89IGIuXFxcIn0saWxzaGlmdDp7JG1ldGg6ZnVuY3Rpb24gaWxzaGlmdChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJMU2hpZnRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPDw9IGIuXFxcIn0saW1vZDp7JG1ldGg6ZnVuY3Rpb24gaW1vZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJNb2RcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgJT0gYi5cXFwifSxpbXVsOnskbWV0aDpmdW5jdGlvbiBpbXVsKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIk11bHRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKj0gYi5cXFwifSxpbWF0bXVsOnskbWV0aDpmdW5jdGlvbiBpbWF0bXVsKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIk1hdE11bHRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgQD0gYi5cXFwifSxpb3I6eyRtZXRoOmZ1bmN0aW9uIGlvcihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJCaXRPclxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSB8PSBiLlxcXCJ9LGlwb3c6eyRtZXRoOmZ1bmN0aW9uIGlwb3coYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiUG93XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICoqPSBiLlxcXCJ9LGlyc2hpZnQ6eyRtZXRoOmZ1bmN0aW9uIGlyc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTFJoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID4+PSBiLlxcXCJ9LGlzdWI6eyRtZXRoOmZ1bmN0aW9uIGlzdWIoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiU3ViXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC09IGIuXFxcIn0saXRydWVkaXY6eyRtZXRoOmZ1bmN0aW9uIGlkaXYoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiRGl2XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC89IGIuXFxcIn0saXhvcjp7JG1ldGg6ZnVuY3Rpb24gaXhvcihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJCaXRYb3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgXj0gYi5cXFwifX0pLE9iamVjdC5hc3NpZ24ob3BlcmF0b3Ise19fYWJzX186b3BlcmF0b3IuYWJzLF9fYWRkX186b3BlcmF0b3IuYWRkLF9fYW5kX186b3BlcmF0b3IuYW5kLF9fY29uY2F0X186b3BlcmF0b3IuY29uY2F0LF9fY29udGFpbnNfXzpvcGVyYXRvci5jb250YWlucyxfX2RlbGl0ZW1fXzpvcGVyYXRvci5kZWxpdGVtLF9fZXFfXzpvcGVyYXRvci5lcSxfX2Zsb29yZGl2X186b3BlcmF0b3IuZmxvb3JkaXYsX19nZV9fOm9wZXJhdG9yLmdlLF9fZ2V0aXRlbV9fOm9wZXJhdG9yLmdldGl0ZW0sX19ndF9fOm9wZXJhdG9yLmd0LF9faWFkZF9fOm9wZXJhdG9yLmlhZGQsX19pYW5kX186b3BlcmF0b3IuaWFuZCxfX2ljb25jYXRfXzpvcGVyYXRvci5pY29uY2F0LF9faWZsb29yZGl2X186b3BlcmF0b3IuaWZsb29yZGl2LF9faWxzaGlmdF9fOm9wZXJhdG9yLmlsc2hpZnQsX19pbWF0bXVsX186b3BlcmF0b3IuaW1hdG11bCxfX2ltb2RfXzpvcGVyYXRvci5pbW9kLF9faW11bF9fOm9wZXJhdG9yLmltdWwsX19pbmRleF9fOm9wZXJhdG9yLmluZGV4LF9faW52X186b3BlcmF0b3IuaW52LF9faW52ZXJ0X186b3BlcmF0b3IuaW52ZXJ0LF9faW9yX186b3BlcmF0b3IuaW9yLF9faXBvd19fOm9wZXJhdG9yLmlwb3csX19pcnNoaWZ0X186b3BlcmF0b3IuaXJzaGlmdCxfX2lzdWJfXzpvcGVyYXRvci5pc3ViLF9faXRydWVkaXZfXzpvcGVyYXRvci5pdHJ1ZWRpdixfX2l4b3JfXzpvcGVyYXRvci5peG9yLF9fbGVfXzpvcGVyYXRvci5sZSxfX2xzaGlmdF9fOm9wZXJhdG9yLmxzaGlmdCxfX2x0X186b3BlcmF0b3IubHQsX19tYXRtdWxfXzpvcGVyYXRvci5tYXRtdWwsX19tb2RfXzpvcGVyYXRvci5tb2QsX19tdWxfXzpvcGVyYXRvci5tdWwsX19uZV9fOm9wZXJhdG9yLm5lLF9fbmVnX186b3BlcmF0b3IubmVnLF9fbm90X186b3BlcmF0b3Iubm90LF9fb3JfXzpvcGVyYXRvci5vcixfX3Bvc19fOm9wZXJhdG9yLnBvcyxfX3Bvd19fOm9wZXJhdG9yLnBvdyxfX3JzaGlmdF9fOm9wZXJhdG9yLnJzaGlmdCxfX3NldGl0ZW1fXzpvcGVyYXRvci5zZXRpdGVtLF9fc3ViX186b3BlcmF0b3Iuc3ViLF9fdHJ1ZWRpdl9fOm9wZXJhdG9yLnRydWVkaXYsX194b3JfXzpvcGVyYXRvci54b3IsX2FiczpTay5idWlsdGlucy5hYnMsZGl2Om9wZXJhdG9yLnRydWVkaXYsX19kaXZfXzpvcGVyYXRvci50cnVlZGl2fSksb3BlcmF0b3J9XCIsXCJzcmMvbGliL29wdHBhcnNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvcHRwYXJzZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL29zLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL29zMmVteHBhdGgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm9zMmVteHBhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wZGIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBkYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BpY2tsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGlja2xlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGlja2xldG9vbHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBpY2tsZXRvb2xzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGlwZXMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBpcGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGtndXRpbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGtndXRpbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BsYXRmb3JtLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fSxiPVxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2Ygd2luZG93JiZcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3I7cmV0dXJuIGEucHl0aG9uX2ltcGxlbWVudGF0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwicHl0aG9uX2ltcGxlbWVudGF0aW9uXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJTa3VscHRcXFwiKX0pLGEubm9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm5vZGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSksYS52ZXJzaW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwidmVyc2lvblxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnN0cihcXFwiXFxcIil9KSxhLnB5dGhvbl92ZXJzaW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwicHl0aG9uX3ZlcnNpb25cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxhPVNrLl9fZnV0dXJlX18ucHl0aG9uX3ZlcnNpb24/XFxcIjMuMi4wXFxcIjpcXFwiMi43LjBcXFwiLG5ldyBTay5idWlsdGluLnN0cihhKX0pLGEuc3lzdGVtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic3lzdGVtXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1iP3dpbmRvdy5uYXZpZ2F0b3IuYXBwQ29kZU5hbWU6XFxcIlxcXCIsbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSksYS5tYWNoaW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibWFjaGluZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLGE9Yj93aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtOlxcXCJcXFwiLG5ldyBTay5idWlsdGluLnN0cihhKX0pLGEucmVsZWFzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJlbGVhc2VcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxhPWI/d2luZG93Lm5hdmlnYXRvci5hcHBWZXJzaW9uOlxcXCJcXFwiLG5ldyBTay5idWlsdGluLnN0cihhKX0pLGEuYXJjaGl0ZWN0dXJlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiYXJjaGl0ZWN0dXJlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihcXFwiNjRiaXRcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpXSl9KSxhLnByb2Nlc3Nvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInByb2Nlc3NvclxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnN0cihcXFwiXFxcIil9KSxhfTtcIixcInNyYy9saWIvcGxhdGZvcm0ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBsYXRmb3JtIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGxpc3RsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBsaXN0bGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcG9wZW4yLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwb3BlbjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wb3BsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBvcGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Bvc2l4ZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9zaXhmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcG9zaXhwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwb3NpeHBhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wcHJpbnQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBwcmludCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Byb2Nlc3NpbmcuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBiLGMsZCxlLGYsZyxoLGE9TWF0aC5QSSxqPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcInByb2Nlc3NpbmdcXFwiKX0saz1bXSxsPSEwLG09bnVsbDtyZXR1cm4gai5wcm9jZXNzaW5nPW51bGwsai5wPW51bGwsai5YPW5ldyBTay5idWlsdGluLmludF8oMCksai5ZPW5ldyBTay5idWlsdGluLmludF8oMSksai5aPW5ldyBTay5idWlsdGluLmludF8oMiksai5SPW5ldyBTay5idWlsdGluLmludF8oMyksai5HPW5ldyBTay5idWlsdGluLmludF8oNCksai5CPW5ldyBTay5idWlsdGluLmludF8oNSksai5BPW5ldyBTay5idWlsdGluLmludF8oNiksai5VPW5ldyBTay5idWlsdGluLmludF8oNyksai5WPW5ldyBTay5idWlsdGluLmludF8oOCksai5OWD1uZXcgU2suYnVpbHRpbi5pbnRfKDkpLGouTlk9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5OWj1uZXcgU2suYnVpbHRpbi5pbnRfKDExKSxqLkVER0U9bmV3IFNrLmJ1aWx0aW4uaW50XygxMiksai5TUj1uZXcgU2suYnVpbHRpbi5pbnRfKDEzKSxqLlNHPW5ldyBTay5idWlsdGluLmludF8oMTQpLGouU0I9bmV3IFNrLmJ1aWx0aW4uaW50XygxNSksai5TQT1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLlNXPW5ldyBTay5idWlsdGluLmludF8oMTcpLGouVFg9bmV3IFNrLmJ1aWx0aW4uaW50XygxOCksai5UWT1uZXcgU2suYnVpbHRpbi5pbnRfKDE5KSxqLlRaPW5ldyBTay5idWlsdGluLmludF8oMjApLGouVlg9bmV3IFNrLmJ1aWx0aW4uaW50XygyMSksai5WWT1uZXcgU2suYnVpbHRpbi5pbnRfKDIyKSxqLlZaPW5ldyBTay5idWlsdGluLmludF8oMjMpLGouVlc9bmV3IFNrLmJ1aWx0aW4uaW50XygyNCksai5BUj1uZXcgU2suYnVpbHRpbi5pbnRfKDI1KSxqLkFHPW5ldyBTay5idWlsdGluLmludF8oMjYpLGouQUI9bmV3IFNrLmJ1aWx0aW4uaW50XygyNyksai5EUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouREc9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLkRCPW5ldyBTay5idWlsdGluLmludF8oNSksai5EQT1uZXcgU2suYnVpbHRpbi5pbnRfKDYpLGouU1BSPW5ldyBTay5idWlsdGluLmludF8oMjgpLGouU1BHPW5ldyBTay5idWlsdGluLmludF8oMjkpLGouU1BCPW5ldyBTay5idWlsdGluLmludF8oMzApLGouU0hJTkU9bmV3IFNrLmJ1aWx0aW4uaW50XygzMSksai5FUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMyKSxqLkVHPW5ldyBTay5idWlsdGluLmludF8oMzMpLGouRUI9bmV3IFNrLmJ1aWx0aW4uaW50XygzNCksai5CRUVOX0xJVD1uZXcgU2suYnVpbHRpbi5pbnRfKDM1KSxqLlZFUlRFWF9GSUVMRF9DT1VOVD1uZXcgU2suYnVpbHRpbi5pbnRfKDM2KSxqLkNFTlRFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouUkFESVVTPW5ldyBTay5idWlsdGluLmludF8oMiksai5DT1JORVJTPW5ldyBTay5idWlsdGluLmludF8oMSksai5DT1JORVI9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkRJQU1FVEVSPW5ldyBTay5idWlsdGluLmludF8oMyksai5CQVNFTElORT1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouVE9QPW5ldyBTay5idWlsdGluLmludF8oMTAxKSxqLkJPVFRPTT1uZXcgU2suYnVpbHRpbi5pbnRfKDEwMiksai5OT1JNQUw9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLk5PUk1BTElaRUQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLklNQUdFPW5ldyBTay5idWlsdGluLmludF8oMiksai5NT0RFTD1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouU0hBUEU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg1KSxqLkFNQklFTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkRJUkVDVElPTkFMPW5ldyBTay5idWlsdGluLmludF8oMSksai5TUE9UPW5ldyBTay5idWlsdGluLmludF8oMyksai5SR0I9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkFSR0I9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkhTQj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQUxQSEE9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLkNNWUs9bmV3IFNrLmJ1aWx0aW4uaW50Xyg1KSxqLlRJRkY9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLlRBUkdBPW5ldyBTay5idWlsdGluLmludF8oMSksai5KUEVHPW5ldyBTay5idWlsdGluLmludF8oMiksai5HSUY9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLk1JVEVSPW5ldyBTay5idWlsdGluLnN0cihcXFwibWl0ZXJcXFwiKSxqLkJFVkVMPW5ldyBTay5idWlsdGluLnN0cihcXFwiYmV2ZWxcXFwiKSxqLlJPVU5EPW5ldyBTay5idWlsdGluLnN0cihcXFwicm91bmRcXFwiKSxqLlNRVUFSRT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImJ1dHRcXFwiKSxqLlBST0pFQ1Q9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJzcXVhcmVcXFwiKSxqLlAyRD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouSkFWQTJEPW5ldyBTay5idWlsdGluLmludF8oMSksai5XRUJHTD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUDNEPW5ldyBTay5idWlsdGluLmludF8oMiksai5PUEVOR0w9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlBERj1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouRFhGPW5ldyBTay5idWlsdGluLmludF8oMCksai5PVEhFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouV0lORE9XUz1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouTUFYT1NYPW5ldyBTay5idWlsdGluLmludF8oMiksai5MSU5VWD1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouRVBTSUxPTj1uZXcgU2suYnVpbHRpbi5mbG9hdF8oMWUtNCksai5NQVhfRkxPQVQ9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDM0MDI4MjM1ZTMxKSxqLk1JTl9GTE9BVD1uZXcgU2suYnVpbHRpbi5mbG9hdF8oLTM0MDI4MjM1ZTMxKSxqLk1BWF9JTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygyMTQ3NDgzNjQ3KSxqLk1JTl9JTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygtMjE0NzQ4MzY0OCksai5IQUxGX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XyhhLzIpLGouVEhJUkRfUEk9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvMyksai5QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSksai5UV09fUEk9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDIqYSksai5UQVU9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDIqYSksai5RVUFSVEVSX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XyhhLzQpLGouREVHX1RPX1JBRD1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS8xODApLGouUkFEX1RPX0RFRz1uZXcgU2suYnVpbHRpbi5mbG9hdF8oMTgwL2EpLGouV0hJVEVTUEFDRT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiBcXFxcdFxcXFxuXFxcXHJcXFxcZlxcXFx4QTBcXFwiKSxqLlBPSU5UPW5ldyBTay5idWlsdGluLmludF8oMiksai5QT0lOVFM9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkxJTkU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLkxJTkVTPW5ldyBTay5idWlsdGluLmludF8oNCksai5UUklBTkdMRT1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouVFJJQU5HTEVTPW5ldyBTay5idWlsdGluLmludF8oOSksai5UUklBTkdMRV9GQU49bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksai5UUklBTkdMRV9TVFJJUD1uZXcgU2suYnVpbHRpbi5pbnRfKDEwKSxqLlFVQUQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5RVUFEUz1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLlFVQURfU1RSSVA9bmV3IFNrLmJ1aWx0aW4uaW50XygxNyksai5QT0xZR09OPW5ldyBTay5idWlsdGluLmludF8oMjApLGouUEFUSD1uZXcgU2suYnVpbHRpbi5pbnRfKDIxKSxqLlJFQ1Q9bmV3IFNrLmJ1aWx0aW4uaW50XygzMCksai5FTExJUFNFPW5ldyBTay5idWlsdGluLmludF8oMzEpLGouQVJDPW5ldyBTay5idWlsdGluLmludF8oMzIpLGouU1BIRVJFPW5ldyBTay5idWlsdGluLmludF8oNDApLGouQk9YPW5ldyBTay5idWlsdGluLmludF8oNDEpLGouR1JPVVA9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLlBSSU1JVElWRT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouR0VPTUVUUlk9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLlZFUlRFWD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouQkVaSUVSX1ZFUlRFWD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouQ1VSVkVfVkVSVEVYPW5ldyBTay5idWlsdGluLmludF8oMiksai5CUkVBSz1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQ0xPU0VTSEFQRT1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouUkVQTEFDRT1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouQkxFTkQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkFERD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouU1VCVFJBQ1Q9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLkxJR0hURVNUPW5ldyBTay5idWlsdGluLmludF8oOCksai5EQVJLRVNUPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouRElGRkVSRU5DRT1uZXcgU2suYnVpbHRpbi5pbnRfKDMyKSxqLkVYQ0xVU0lPTj1uZXcgU2suYnVpbHRpbi5pbnRfKDY0KSxqLk1VTFRJUExZPW5ldyBTay5idWlsdGluLmludF8oMTI4KSxqLlNDUkVFTj1uZXcgU2suYnVpbHRpbi5pbnRfKDI1Niksai5PVkVSTEFZPW5ldyBTay5idWlsdGluLmludF8oNTEyKSxqLkhBUkRfTElHSFQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMDI0KSxqLlNPRlRfTElHSFQ9bmV3IFNrLmJ1aWx0aW4uaW50XygyMDQ4KSxqLkRPREdFPW5ldyBTay5idWlsdGluLmludF8oNDA5Niksai5CVVJOPW5ldyBTay5idWlsdGluLmludF8oODE5Miksai5BTFBIQV9NQVNLPW5ldyBTay5idWlsdGluLmludF8oNDI3ODE5MDA4MCksai5SRURfTUFTSz1uZXcgU2suYnVpbHRpbi5pbnRfKDE2NzExNjgwKSxqLkdSRUVOX01BU0s9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2NTI4MCksai5CTFVFX01BU0s9bmV3IFNrLmJ1aWx0aW4uaW50XygyNTUpLGouQ1VTVE9NPW5ldyBTay5idWlsdGluLmludF8oMCksai5PUlRIT0dSQVBISUM9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlBFUlNQRUNUSVZFPW5ldyBTay5idWlsdGluLmludF8oMyksai5BUlJPVz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImRlZmF1bHRcXFwiKSxqLkNST1NTPW5ldyBTay5idWlsdGluLnN0cihcXFwiY3Jvc3NoYWlyXFxcIiksai5IQU5EPW5ldyBTay5idWlsdGluLnN0cihcXFwicG9pbnRlclxcXCIpLGouTU9WRT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIm1vdmVcXFwiKSxqLlRFWFQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJ0ZXh0XFxcIiksai5XQUlUPW5ldyBTay5idWlsdGluLnN0cihcXFwid2FpdFxcXCIpLGouTk9DVVJTT1I9U2suYnVpbHRpbi5hc3NrJChcXFwidXJsKCdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFQLy8vd0FBQUNINUJBRUFBQUFBTEFBQUFBQUJBQUVBQUFJQ1JBRUFPdz09JyksIGF1dG9cXFwiKSxqLkRJU0FCTEVfT1BFTkdMXzJYX1NNT09USD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouRU5BQkxFX09QRU5HTF8yWF9TTU9PVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygtMSksai5FTkFCTEVfT1BFTkdMXzRYX1NNT09USD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouRU5BQkxFX05BVElWRV9GT05UUz1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouRElTQUJMRV9ERVBUSF9URVNUPW5ldyBTay5idWlsdGluLmludF8oNCksai5FTkFCTEVfREVQVEhfVEVTVD1uZXcgU2suYnVpbHRpbi5pbnRfKC00KSxqLkVOQUJMRV9ERVBUSF9TT1JUPW5ldyBTay5idWlsdGluLmludF8oNSksai5ESVNBQkxFX0RFUFRIX1NPUlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygtNSksai5ESVNBQkxFX09QRU5HTF9FUlJPUl9SRVBPUlQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2KSxqLkVOQUJMRV9PUEVOR0xfRVJST1JfUkVQT1JUPW5ldyBTay5idWlsdGluLmludF8oLTYpLGouRU5BQkxFX0FDQ1VSQVRFX1RFWFRVUkVTPW5ldyBTay5idWlsdGluLmludF8oNyksai5ESVNBQkxFX0FDQ1VSQVRFX1RFWFRVUkVTPW5ldyBTay5idWlsdGluLmludF8oLTcpLGouSElOVF9DT1VOVD1uZXcgU2suYnVpbHRpbi5pbnRfKDEwKSxqLk9QRU49bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkNMT1NFPW5ldyBTay5idWlsdGluLmludF8oMiksai5CTFVSPW5ldyBTay5idWlsdGluLmludF8oMTEpLGouR1JBWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyKSxqLklOVkVSVD1uZXcgU2suYnVpbHRpbi5pbnRfKDEzKSxqLk9QQVFVRT1uZXcgU2suYnVpbHRpbi5pbnRfKDE0KSxqLlBPU1RFUklaRT1uZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxqLlRIUkVTSE9MRD1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLkVST0RFPW5ldyBTay5idWlsdGluLmludF8oMTcpLGouRElMQVRFPW5ldyBTay5idWlsdGluLmludF8oMTgpLGouQkFDS1NQQUNFPW5ldyBTay5idWlsdGluLmludF8oOCksai5UQUI9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLkVOVEVSPW5ldyBTay5idWlsdGluLmludF8oMTApLGouUkVUVVJOPW5ldyBTay5idWlsdGluLmludF8oMTMpLGouRVNDPW5ldyBTay5idWlsdGluLmludF8oMjcpLGouREVMRVRFPW5ldyBTay5idWlsdGluLmludF8oMTI3KSxqLkNPREVEPW5ldyBTay5idWlsdGluLmludF8oNjU1MzUpLGouU0hJRlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5DT05UUk9MPW5ldyBTay5idWlsdGluLmludF8oMTcpLGouQUxUPW5ldyBTay5idWlsdGluLmludF8oMTgpLGouQ0FQU0xLPW5ldyBTay5idWlsdGluLmludF8oMjApLGouUEdVUD1uZXcgU2suYnVpbHRpbi5pbnRfKDMzKSxqLlBHRE49bmV3IFNrLmJ1aWx0aW4uaW50XygzNCksai5FTkQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNSksai5IT01FPW5ldyBTay5idWlsdGluLmludF8oMzYpLGouTEVGVD1uZXcgU2suYnVpbHRpbi5pbnRfKDM3KSxqLlVQPW5ldyBTay5idWlsdGluLmludF8oMzgpLGouUklHSFQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzOSksai5ET1dOPW5ldyBTay5idWlsdGluLmludF8oNDApLGouRjE9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTIpLGouRjI9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTMpLGouRjM9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTQpLGouRjQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTUpLGouRjU9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTYpLGouRjY9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTcpLGouRjc9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTgpLGouRjg9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTkpLGouRjk9bmV3IFNrLmJ1aWx0aW4uaW50XygxMjApLGouRjEwPW5ldyBTay5idWlsdGluLmludF8oMTIxKSxqLkYxMT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyMiksai5GMTI9bmV3IFNrLmJ1aWx0aW4uaW50XygxMjMpLGouTlVNTEs9bmV3IFNrLmJ1aWx0aW4uaW50XygxNDQpLGouTUVUQT1uZXcgU2suYnVpbHRpbi5pbnRfKDE1Nyksai5JTlNFUlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxNTUpLGouU0lOQ09TX0xFTkdUSD1uZXcgU2suYnVpbHRpbi5pbnRfKDcyMCksai5QUkVDSVNJT05CPW5ldyBTay5idWlsdGluLmludF8oMTUpLGouUFJFQ0lTSU9ORj1uZXcgU2suYnVpbHRpbi5pbnRfKDMyNzY4KSxqLlBSRUNfTUFYVkFMPW5ldyBTay5idWlsdGluLmludF8oMzI3NjcpLGouUFJFQ19BTFBIQV9TSElGVD1uZXcgU2suYnVpbHRpbi5pbnRfKDkpLGouUFJFQ19SRURfU0hJRlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLk5PUk1BTF9NT0RFX0FVVE89bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLk5PUk1BTF9NT0RFX1NIQVBFPW5ldyBTay5idWlsdGluLmludF8oMSksai5OT1JNQUxfTU9ERV9WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLk1BWF9MSUdIVFM9bmV3IFNrLmJ1aWx0aW4uaW50Xyg4KSxqLmxpbmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtqLnByb2Nlc3NpbmcubGluZShhLnYsYi52LGMudixkLnYpfSksai5lbGxpcHNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmVsbGlwc2UoYS52LGIudixjLnYsZC52KX0pLGoudGV4dD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3NpbmcudGV4dChhLnYsYi52LGMudil9KSxqLnBvaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtqLnByb2Nlc3NpbmcucG9pbnQoYS52LGIudil9KSxqLmFyYz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtqLnByb2Nlc3NpbmcuYXJjKGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGoucXVhZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7ai5wcm9jZXNzaW5nLnF1YWQoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudil9KSxqLnJlY3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZT9qLnByb2Nlc3NpbmcucmVjdChhLnYsYi52LGMudixkLnYpOmoucHJvY2Vzc2luZy5yZWN0KGEudixiLnYsYy52LGQudixlLnYpfSksai50cmlhbmdsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtqLnByb2Nlc3NpbmcudHJpYW5nbGUoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5iZXppZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxrLGwsbSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBpP2oucHJvY2Vzc2luZy5iZXppZXIoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudik6ai5wcm9jZXNzaW5nLmJlemllcihhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudixrLnYsbC52LG0udil9KSxqLmFscGhhPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmFscGhhKGEudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmFscGhhKGEudixjLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmFscGhhKGEudixjLnYsZC52KSl9KSxqLmFtYmllbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy5hbWJpZW50KGEudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5hbWJpZW50KGEudixjLnYpOmoucHJvY2Vzc2luZy5hbWJpZW50KGEudixjLnYsZC52KX0pLGouYW1iaWVudExpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcuYW1iaWVudExpZ2h0KGEudixiLnYsYy52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGU/ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudixkLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZj9qLnByb2Nlc3NpbmcuYW1iaWVudExpZ2h0KGEudixiLnYsYy52LGQudixlLnYpOmoucHJvY2Vzc2luZy5hbWJpZW50TGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5iZWdpbkNhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLmJlZ2luQ2FtZXJhKCl9KSxqLmJlZ2luU2hhcGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGEmJihhPWouUE9MWUdPTiksai5wcm9jZXNzaW5nLmJlZ2luU2hhcGUoYS52KX0pLGouYmV6aWVyRGV0YWlsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YT1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/MjA6YS52LGoucHJvY2Vzc2luZy5iZXppZXJEZXRhaWwoYSl9KSxqLmJlemllclBvaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuYmV6aWVyUG9pbnQoZS52LGEudixiLnYsYy52LGQudil9KSxqLmJlemllclRhbmdlbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihlLGEsYixjLGQpe2oucHJvY2Vzc2luZy5iZXppZXJUYW5nZW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5iZXppZXJWZXJ0ZXg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBnP2oucHJvY2Vzc2luZy5iZXppZXJWZXJ0ZXgoYS52LGIudixjLnYsZC52LGUudixmLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaD9qLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBpP2oucHJvY2Vzc2luZy5iZXppZXJWZXJ0ZXgoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudik6ai5wcm9jZXNzaW5nLmJlemllclZlcnRleChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudil9KSxqLmJsZW5kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksayl7b3RoZXIgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fG90aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/ai5wcm9jZXNzaW5nLmJsZW5kKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KTpqLnByb2Nlc3NpbmcuYmxlbmQoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52KX0pLGouYmxlbmRDb2xvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5jb2xvcixbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCldKTtyZXR1cm4gZS52PWoucHJvY2Vzc2luZy5ibGVuZENvbG9yKGEudixiLnYsZC52KSxlfSksai5icmlnaHRuZXNzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmJyaWdodG5lc3MoYS52KSk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuYnJpZ2h0bmVzcyhhLnYsYy52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5icmlnaHRuZXNzKGEudixjLnYsZC52KSl9KSxqLmNhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLmNhbWVyYSgpOmoucHJvY2Vzc2luZy5jYW1lcmEoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYpfSksai5jb25zdHJhaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuY29uc3RyYWluKGEudixiLnYsYy52KSl9KSxqLmNvcHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7b3RoZXIgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fG90aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/ai5wcm9jZXNzaW5nLmNvcHkoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudik6ai5wcm9jZXNzaW5nLmNvcHkoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYpfSksai5jcmVhdGVGb250PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEZvbnQpO3JldHVybiBlLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy5jcmVhdGVGb250KGEudixiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcuY3JlYXRlRm9udChhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLmNyZWF0ZUZvbnQoYS52LGIudixjLnYsZC52KSxlfSksai5jcmVhdGVHcmFwaGljcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBHcmFwaGljcyk7cmV0dXJuIGUudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmNyZWF0ZUdyYXBoaWNzKGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcuY3JlYXRlR3JhcGhpY3MoYS52LGIudixjLnYsZC52KSxlfSksai5jcmVhdGVJbWFnZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXt2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QSW1hZ2UpO3JldHVybiBkLnY9ai5wcm9jZXNzaW5nLmNyZWF0ZUltYWdlKGEudixiLnYsYy52KSxkfSksai5jdXJzb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP2oucHJvY2Vzc2luZy5jdXJzb3IoKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLmN1cnNvcihhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuY3Vyc29yKGEudixiLnYpOmoucHJvY2Vzc2luZy5jdXJzb3IoYS52LGIudixjLnYpfSksai5jdXJ2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGssbCxtKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGk/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2Ygaz9qLnByb2Nlc3NpbmcuY3VydmUoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgbD9qLnByb2Nlc3NpbmcuY3VydmUoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIG0/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudixsLnYpOmoucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudixrLnYsbC52LG0udil9KSxqLmN1cnZlRGV0YWlsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmN1cnZlRGV0YWlsKGEudil9KSxqLmN1cnZlUG9pbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihlLGEsYixjLGQpe2oucHJvY2Vzc2luZy5jdXJ2ZVBvaW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5jdXJ2ZVRhbmdlbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihlLGEsYixjLGQpe2oucHJvY2Vzc2luZy5jdXJ2ZVRhbmdlbnQoZS52LGEudixiLnYsYy52LGQudil9KSxqLmN1cnZlVGlnaHRuZXNzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmN1cnZlVGlnaHRuZXNzKGEudil9KSxqLmN1cnZlVmVydGV4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuY3VydmVWZXJ0ZXgoYS52LGIudik6ai5wcm9jZXNzaW5nLmN1cnZlVmVydGV4KGEudixiLnYsYy52KX0pLGouZGF5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuZGF5KCkpfSksai5kZWdyZWVzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuZGVncmVlcyhhLnYpKX0pLGouZGlyZWN0aW9uYWxMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtqLnByb2Nlc3NpbmcuZGlyZWN0aW9uYWxMaWdodChhLnYsYi52LGMudixkLnYsZS52LGYudil9KSxqLmRpc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuZGlzdChhLnYsYi52LGMudixkLnYpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGY/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5kaXN0KGEudixiLnYsYy52LGQudixlLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRpc3QoYS52LGIudixjLnYsZC52LGUudixmLnYpKX0pLGouZW1pc3NpdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5lbWlzc2l2ZShhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuZW1pc3NpdmUoYS52LGIudik6ai5wcm9jZXNzaW5nLmVtaXNzaXZlKGEudixiLnYsYy52KX0pLGouZW5kQ2FtZXJhPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcuZW5kQ2FtZXJhKCl9KSxqLmVuZFNoYXBlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP2oucHJvY2Vzc2luZy5lbmRTaGFwZSgpOmoucHJvY2Vzc2luZy5lbmRTaGFwZShhLnYpfSksai5maWx0ZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcuZmlsdGVyKGEudik6ai5wcm9jZXNzaW5nLmZpbHRlcihhLnYsYi52KX0pLGouZnJ1c3R1bT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtqLnByb2Nlc3NpbmcuZnJ1c3R1bShhLGIsYyxkLGUsZil9KSxqLmhpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcuaGludChhKX0pLGouaG91cj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmhvdXIoKSl9KSxqLmh1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmh1ZShhLnYpKX0pLGouaW1hZ2VNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmltYWdlTW9kZShhLnYpfSksai5sZXJwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmxlcnAoYS52LGIudixjLnYpKX0pLGoubGVycENvbG9yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGQpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLmNvbG9yLFtuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCksbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0pO3JldHVybiBlLnY9ai5wcm9jZXNzaW5nLmxlcnBDb2xvcihhLnYsYi52LGQudiksZX0pLGoubGlnaHRGYWxsb2ZmPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2oucHJvY2Vzc2luZy5saWdodEZhbGxvZmYoYS52LGIudixjLnYpfSksai5saWdodHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5saWdodHMoKX0pLGoubGlnaHRTcGVjdWxhcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3NpbmcubGlnaHRTcGVjdWxhcihhLnYsYi52LGMudil9KSxqLmxvYWRCeXRlcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGoucHJvY2Vzc2luZy5sb2FkQnl0ZXMoYS52KSl9KSxqLmxvYWRGb250PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEZvbnQpO3JldHVybiBiLnY9ai5wcm9jZXNzaW5nLmxvYWRGb250KGEudiksYn0pLGoubG9hZFNoYXBlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFNoYXBlU1ZHLFtuZXcgU2suYnVpbHRpbi5zdHIoXFxcInN0cmluZ1xcXCIpLGFdKTtyZXR1cm4gYn0pLGoubG9hZFN0cmluZ3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChqLnByb2Nlc3NpbmcubG9hZFN0cmluZ3MoYS52KSl9KSxqLm1hZz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGQsYSxiKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5tYWcoZC52LGEudikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubWFnKGQudixhLnYsYi52KSl9KSxqLm1hcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubWFwKGEudixiLnYsYy52LGQudixlLnYpKX0pLGoubWlsbGlzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcubWlsbGlzKCkpfSksai5taW51dGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5taW51dGUoKSl9KSxqLm1vZGVsWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5tb2RlbFgoYS52LGIudixjLnYpKX0pLGoubW9kZWxZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1vZGVsWShhLnYsYi52LGMudikpfSksai5tb2RlbFo9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubW9kZWxaKGEudixiLnYsYy52KSl9KSxqLm1vbnRoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcubW9udGgoKSl9KSxqLm5vQ3Vyc29yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3Npbmcubm9DdXJzb3IoKX0pLGoubm9pc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcubm9pc2UoYS52KSk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcubm9pc2UoYS52LGIudikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcubm9pc2UoYS52LGIudixjLnYpKX0pLGoubm9pc2VEZXRhaWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2oucHJvY2Vzc2luZy5ub2lzZURldGFpbChhLnYsYi52KX0pLGoubm9pc2VTZWVkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcubm9pc2VTZWVkKGEudikpfSksai5ub0xpZ2h0cz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vTGlnaHRzKCl9KSxqLm5vcm09bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcubm9ybShhLnYsYi52LGMudikpfSksai5ub3JtYWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLm5vcm1hbChhLnYsYi52LGMudil9KSxqLm5vVGludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vVGludCgpfSksai5vcnRobz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtqLnByb2Nlc3Npbmcub3J0aG8oYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5wZXJzcGVjdGl2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcucGVyc3BlY3RpdmUoKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKGEudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcucGVyc3BlY3RpdmUoYS52LGIudixjLnYsZC52KX0pLGoucG9pbnRMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtqLnByb2Nlc3NpbmcucG9pbnRMaWdodChhLnYsYi52LGMudixkLnYsZS52LGYudil9KSxqLnByaW50Q2FtZXJhPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcucHJpbnRDYW1lcmEoKX0pLGoucHJpbnRsbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5wcmludGxuKGEudil9KSxqLnByaW50UHJvamVjdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnByaW50UHJvamVjdGlvbigpfSksai5yYWRpYW5zPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcucmFkaWFucyhhLnYpKX0pLGoucmFuZG9tU2VlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhbmRvbVNlZWQoYS52KSl9KSxqLnJhbmRvbT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcucmFuZG9tKCkpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhbmRvbShhLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhbmRvbShhLnYsYi52KSl9KSxqLnJlcXVlc3RJbWFnZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEltYWdlKTtyZXR1cm4gYy52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcucmVxdWVzdEltYWdlKGEudik6ai5wcm9jZXNzaW5nLnJlcXVlc3RJbWFnZShhLnYsYi52KSxjfSksai5zYXR1cmF0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcuc2F0dXJhdGlvbihhLnYpKX0pLGouc2F2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zYXZlKGEudil9KSxqLnNhdmVGcmFtZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3Npbmcuc2F2ZUZyYW1lKCk6ai5wcm9jZXNzaW5nLnNhdmVGcmFtZShhLnYpfSksai5zYXZlU3RyaW5ncz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7ai5wcm9jZXNzaW5nLnNhdmVTdHJpbmdzKGEudixiLnYpfSksai5zY3JlZW5YPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNjcmVlblgoYS52LGIudixjLnYpKX0pLGouc2NyZWVuWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zY3JlZW5ZKGEudixiLnYsYy52KSl9KSxqLnNjcmVlblo9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcuc2NyZWVuWihhLnYsYi52LGMudikpfSksai5zZWNvbmQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5zZWNvbmQoKSl9KSxqLnNoYXBlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnNoYXBlKGEudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLnNoYXBlKGEudixiLnYsYy52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGU/ai5wcm9jZXNzaW5nLnNoYXBlKGEudixiLnYsYy52LGQudik6ai5wcm9jZXNzaW5nLnNoYXBlKGEudixiLnYsYy52LGQudixlLnYpfSksai5zaGFwZU1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc2hhcGVNb2RlKGEudil9KSxqLnNoaW5pbmVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zaGluaW5lc3MoYS52KX0pLGouc3BlY3VsYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5zcGVjdWxhcihhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3Npbmcuc3BlY3VsYXIoYS52LGIudik6ai5wcm9jZXNzaW5nLnNwZWN1bGFyKGEudixiLnYsYy52KX0pLGouc3BvdExpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXtqLnByb2Nlc3Npbmcuc3BvdExpZ2h0KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpfSksai5zcT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNxKGEpKX0pLGouc3RhdHVzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnN0YXR1cyhhLnYpfSksai50ZXh0QWxpZ249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcudGV4dEFsaWduKGEudik6ai5wcm9jZXNzaW5nLnRleHRBbGlnbihhLnYsYi52KX0pLGoudGV4dEFzY2VudD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcudGV4dEFzY2VudCgpKX0pLGoudGV4dERlc2NlbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnRleHREZXNjZW50KCkpfSksai50ZXh0Rm9udD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy50ZXh0Rm9udChhLnYpOmoucHJvY2Vzc2luZy50ZXh0Rm9udChhLnYsYi52KX0pLGoudGV4dExlYWRpbmc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcudGV4dExlYWRpbmcoYS52KX0pLGoudGV4dE1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcudGV4dE1vZGUoYS52KX0pLGoudGV4dFNpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcudGV4dFNpemUoYS52KX0pLGoudGV4dHVyZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy50ZXh0dXJlKGEudil9KSxqLnRleHR1cmVNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHR1cmVNb2RlKGEudil9KSxqLnRleHRXaWR0aD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnRleHRXaWR0aChhLnYpKX0pLGoudGludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcudGludChhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcudGludChhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLnRpbnQoYS52LGIudixjLnYpOmoucHJvY2Vzc2luZy50aW50KGEudixiLnYsYy52LGQudil9KSxqLnVwZGF0ZVBpeGVscz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnVwZGF0ZVBpeGVscygpfSksai52ZXJ0ZXg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcudmVydGV4KGEudixiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcudmVydGV4KGEudixiLnYsYy52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGU/ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52LGMudixkLnYpOmoucHJvY2Vzc2luZy52ZXJ0ZXgoYS52LGIudixjLnYsZC52LGUudil9KSxqLnllYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy55ZWFyKCkpfSksai5ib3g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcuYm94KGEudil9KSxqLnNwaGVyZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zcGhlcmUoYS52KX0pLGouc3BoZXJlRGV0YWlsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnNwaGVyZURldGFpbChhLnYpOmoucHJvY2Vzc2luZy5zcGhlcmVEZXRhaWwoYS52LGIudil9KSxqLmJhY2tncm91bmQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCl7XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBjJiYoYz1jLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZCYmKGQ9ZC52KSxqLnByb2Nlc3NpbmcuYmFja2dyb3VuZChhLnYsYyxkKX0pLGouZmlsbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkLGUpe1xcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBlJiYoZT1lLnYpLGoucHJvY2Vzc2luZy5maWxsKGEudixjLGQsZSl9KSxqLnN0cm9rZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkLGUpe1xcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBlJiYoZT1lLnYpLGoucHJvY2Vzc2luZy5zdHJva2UoYS52LGMsZCxlKX0pLGoubm9TdHJva2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub1N0cm9rZSgpfSksai5jb2xvck1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe2I9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiPzI1NTpiLnYsXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBjJiYoYz1jLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZCYmKGQ9ZC52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGUmJihlPWUudiksai5wcm9jZXNzaW5nLmNvbG9yTW9kZShhLnYsYixjLGQsZSl9KSxqLm5vRmlsbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vRmlsbCgpfSksai5sb29wPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtpZihudWxsPT09ai5wcm9jZXNzaW5nKXRocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcXFwibG9vcCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgcnVuKClcXFwiKTtsPSEwLGoucHJvY2Vzc2luZy5sb29wKCl9KSxqLm5vTG9vcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYobnVsbD09PWoucHJvY2Vzc2luZyl0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIm5vTG9vcCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgcnVuKClcXFwiKTtsPSExLGoucHJvY2Vzc2luZy5ub0xvb3AoKX0pLGouZnJhbWVSYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmZyYW1lUmF0ZShhLnYpfSksai53aWR0aD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouaGVpZ2h0PW5ldyBTay5idWlsdGluLmludF8oMCksai5yZW5kZXJNb2RlPWouUDJELGouc2l6ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGMmJihjPWouUDJEKSxqLnByb2Nlc3Npbmcuc2l6ZShhLnYsYi52LGMudiksai53aWR0aD1uZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy53aWR0aCksai5oZWlnaHQ9bmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuaGVpZ2h0KSxqLnJlbmRlck1vZGU9Y30pLGouZXhpdHA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5leGl0KCl9KSxqLm1vdXNlWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1vdXNlWCl9KSxqLm1vdXNlWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1vdXNlWSl9KSxqLnBtb3VzZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5wbW91c2VYKX0pLGoucG1vdXNlWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLnBtb3VzZVkpfSksai5yZWN0TW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5yZWN0TW9kZShhLnYpfSksai5zdHJva2VXZWlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3Ryb2tlV2VpZ2h0KGEudil9KSxqLnNtb290aD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnNtb290aCgpfSksai5ub1Ntb290aD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vU21vb3RoKCl9KSxqLmVsbGlwc2VNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmVsbGlwc2VNb2RlKGEudil9KSxqLnN0cm9rZUNhcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zdHJva2VDYXAoYS52KX0pLGouc3Ryb2tlSm9pbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zdHJva2VKb2luKGEudil9KSxqLnJvdGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5yb3RhdGUoYS52KX0pLGoucm90YXRlWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5yb3RhdGVYKGEudil9KSxqLnJvdGF0ZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlWShhLnYpfSksai5yb3RhdGVaPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnJvdGF0ZVooYS52KX0pLGouc2NhbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7Yj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/MTpiLnYsYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/MTpjLnYsai5wcm9jZXNzaW5nLnNjYWxlKGEudixiLGMpfSksai50cmFuc2xhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7Yj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/MTpiLnYsYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/MTpjLnYsai5wcm9jZXNzaW5nLnRyYW5zbGF0ZShhLnYsYixjKX0pLGoucG9wTWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcucG9wTWF0cml4KCl9KSxqLnB1c2hNYXRyaXg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5wdXNoTWF0cml4KCl9KSxqLmFwcGx5TWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYSxiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwLDE2KTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV09XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiW2FdPzA6YlthXS52O2oucHJvY2Vzc2luZy5hcHBseU1hdHJpeC5hcHBseShqLnByb2Nlc3NpbmcsYil9KSxqLnJlc2V0TWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcucmVzZXRNYXRyaXgoKX0pLGoucHJpbnRNYXRyaXg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5mZmkucmVtYXBUb1B5KGoucHJvY2Vzc2luZy5wcmludE1hdHJpeCgpKX0pLGoucnVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChTay5jYW52YXMpO2lmKCFhKXRocm93IG5ldyBFcnJvcihcXFwiUHJvY2Vzc2luZyBtb2R1bGU6IENhbnZhcyBlbGVtZW50IG5vdCBzcGVjaWZpZWRcXFwiKTtpZih3aW5kb3cuUHJvY2Vzc2luZy5sb2dnZXI9e2xvZzpmdW5jdGlvbihhKXtTay5taXNjZXZhbC5wcmludF8oYSl9fSxtPXdpbmRvdy5Qcm9jZXNzaW5nLmdldEluc3RhbmNlQnlJZChTay5jYW52YXMpLG0mJm0uZXhpdCgpLGoucD1uZXcgd2luZG93LlByb2Nlc3NpbmcoYSxmdW5jdGlvbiBza2V0Y2hQcm9jKGEpe2oucHJvY2Vzc2luZz1hLGEuZHJhdz1mdW5jdGlvbigpe3ZhciBiPSExO2Zvcih2YXIgYyBpbiBrKTA9PT1rW2NdLndpZHRoJiYoYj0hMCk7aWYoITA9PWIpcmV0dXJuITA9PT1sP3ZvaWQgMDp2b2lkIGEubG9vcCgpO2lmKCExPT09bCYmYS5ub0xvb3AoKSxqLmZyYW1lQ291bnQ9YS5mcmFtZUNvdW50LFNrLmdsb2JhbHMuZHJhdyl0cnl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmdsb2JhbHMuZHJhdyl9Y2F0Y2goYSl7U2sudW5jYXVnaHRFeGNlcHRpb24oYSl9fTt2YXIgYj1bXFxcInNldHVwXFxcIixcXFwibW91c2VNb3ZlZFxcXCIsXFxcIm1vdXNlQ2xpY2tlZFxcXCIsXFxcIm1vdXNlRHJhZ2dlZFxcXCIsXFxcIm1vdXNlTW92ZWRcXFwiLFxcXCJtb3VzZU91dFxcXCIsXFxcIm1vdXNlT3ZlclxcXCIsXFxcIm1vdXNlUHJlc3NlZFxcXCIsXFxcIm1vdXNlUmVsZWFzZWRcXFwiLFxcXCJrZXlQcmVzc2VkXFxcIixcXFwia2V5UmVsZWFzZWRcXFwiLFxcXCJrZXlUeXBlZFxcXCJdO2Zvcih2YXIgYyBpbiBiKVNrLmdsb2JhbHNbYltjXV0mJihhW2JbY11dPW5ldyBGdW5jdGlvbihcXFwidHJ5IHtTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suZ2xvYmFsc1snXFxcIitiW2NdK1xcXCInXSk7fSBjYXRjaChlKSB7U2sudW5jYXVnaHRFeGNlcHRpb24oZSk7fVxcXCIpKX0pLDA9PT1qLndpZHRoLnYmJjA9PT1qLmhlaWdodC52KXt2YXIgYj1hLm9mZnNldFdpZHRoLGM9YS5vZmZzZXRIZWlnaHQ7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouc2l6ZSxbbmV3IFNrLmJ1aWx0aW4uaW50XyhiKSxuZXcgU2suYnVpbHRpbi5pbnRfKGMpLGoucmVuZGVyTW9kZV0pfX0pLGc9ZnVuY3Rpb24oYSxiKXtiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJ4XFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLm1vdXNlWCk6XFxcInlcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5tb3VzZVkpOlxcXCJweFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLnBtb3VzZVgpOlxcXCJweVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLnBtb3VzZVkpOlxcXCJwcmVzc2VkXFxcIj09PWI/bmV3IFNrLmJ1aWx0aW4uYm9vbChqLnByb2Nlc3NpbmcuX19tb3VzZVByZXNzZWQpOlxcXCJidXR0b25cXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5tb3VzZUJ1dHRvbik6dm9pZCAwfSl9LGouTW91c2U9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGcsXFxcIk1vdXNlXFxcIixbXSksai5tb3VzZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5Nb3VzZSksZj1mdW5jdGlvbihhLGIpe2IuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImtleVxcXCI9PT1iKT9uZXcgU2suYnVpbHRpbi5zdHIoai5wcm9jZXNzaW5nLmtleS50b1N0cmluZygpKTpcXFwia2V5Q29kZVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmtleUNvZGUpOlxcXCJrZXlQcmVzc2VkXFxcIj09PWI/bmV3IFNrLmJ1aWx0aW4uc3RyKGoucHJvY2Vzc2luZy5rZXlQcmVzc2VkKTp2b2lkIDB9KX0sai5LZXlib2FyZD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZixcXFwiS2V5Ym9hcmRcXFwiLFtdKSxqLmtleWJvYXJkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLktleWJvYXJkKSxlPWZ1bmN0aW9uKGEsYil7Yi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwiZnJhbWVDb3VudFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5mcmFtZUNvdW50KTpcXFwiZnJhbWVSYXRlXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcuZnJhbWVSYXRlKTpcXFwiaGVpZ2h0XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcuaGVpZ2h0KTpcXFwid2lkdGhcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy53aWR0aCk6XFxcIm9ubGluZVxcXCI9PT1iP25ldyBTay5idWlsdGluLmJvb2woai5wcm9jZXNzaW5nLm9ubGluZSk6XFxcImZvY3VzZWRcXFwiPT09Yj9uZXcgU2suYnVpbHRpbi5ib29sKGoucHJvY2Vzc2luZy5mb2N1c2VkKTp2b2lkIDB9KX0sai5FbnZpcm9ubWVudD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZSxcXFwiRW52aXJvbm1lbnRcXFwiLFtdKSxqLmVudmlyb25tZW50PVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLkVudmlyb25tZW50KSxkPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EucGl4ZWxzPW51bGx9KSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJoZWlnaHRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcuaGVpZ2h0KTpcXFwid2lkdGhcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy53aWR0aCk6KFxcXCJwaXhlbHNcXFwiPT09YiYmbnVsbD09YS5waXhlbHMmJihhLnBpeGVscz1uZXcgU2suYnVpbHRpbi5saXN0KGoucHJvY2Vzc2luZy5waXhlbHMudG9BcnJheSgpKSksYS5waXhlbHMpfSl9LGouU2NyZWVuPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixkLFxcXCJTY3JlZW5cXFwiLFtdKSxqLnNjcmVlbj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5TY3JlZW4pLGoubG9hZFBpeGVscz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLmxvYWRQaXhlbHMoKX0pLGM9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxhLnY9ai5wcm9jZXNzaW5nLmNvbG9yKGIudixjLGQsZSl9KX0sai5jb2xvcj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosYyxcXFwiY29sb3JcXFwiLFtdKSxqLnJlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5yZWQoYS52KSl9KSxqLmdyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmdyZWVuKGEudikpfSksai5ibHVlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmJsdWUoYS52KSl9KSxiPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IGoucHJvY2Vzc2luZy5QSW1hZ2U6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP25ldyBqLnByb2Nlc3NpbmcuUEltYWdlKGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBqLnByb2Nlc3NpbmcuUEltYWdlKGIudixjLnYpOm5ldyBqLnByb2Nlc3NpbmcuUEltYWdlKGIudixjLnYsZC52KX0pLGIuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYud2lkdGgpOlxcXCJoZWlnaHRcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEudi5oZWlnaHQpOnZvaWQgMH0pfSxqLmxvYWRJbWFnZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWoucHJvY2Vzc2luZy5sb2FkSW1hZ2UoYS52KTtrLnB1c2goYik7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEltYWdlKTtyZXR1cm4gYy52PWIsY30pLGouaW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcuaW1hZ2UoYS52LGIudixjLnYpOmoucHJvY2Vzc2luZy5pbWFnZShhLnYsYi52LGMudixkLnYsZS52KX0pLGouZ2V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1qLnByb2Nlc3NpbmcuZ2V0KGEudixiLnYpO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5jb2xvcixbbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucmVkKGMpKSxuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ncmVlbihjKSksbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuYmx1ZShjKSldKX0pLGouc2V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2oucHJvY2Vzc2luZy5zZXQoYS52LGIudixjLnYpfSksaD1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcjpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudixjLnYpOm5ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcihiLnYsYy52LGQudil9KSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJ4XFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoYS52LngpOlxcXCJ5XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYueSk6XFxcInpcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEudi56KTp2b2lkIDB9KSxiLmdldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBiLnY9YS52LmdldCgpLGJ9KSxiLnNldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9hLnYuc2V0KGIudixjLnYpOmEudi5zZXQoYi52LGMudixkLnYpfSksYi5tYWc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChhLnYubWFnKCkpfSksYi5hZGQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LmFkZChiLnYpLGN9KSxiLnN1Yj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGMudj1hLnYuc3ViKGIudiksY30pLGIubXVsdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGMudj1hLnYubXVsdChiLnYpLGN9KSxiLmRpdj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGMudj1hLnYuZGl2KGIudiksY30pLGIuZGlzdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4uYXNzayQoYS52LmRpc3QoYi52KSl9KSxiLmRvdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9Tay5idWlsdGluLmFzc2skKGEudi5kb3QoYi52KSk6U2suYnVpbHRpbi5hc3NrJChhLnYuZG90KGIudixjLnYsZC52KSl9KSxiLmNyb3NzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYy52PWEudi5jcm9zcyhiLnYpLGN9KSxiLm5vcm1hbGl6ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5ub3JtYWxpemUoKX0pLGIubGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5saW1pdChiLnYpfSksYi5hbmdsZUJldHdlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5idWlsdGluLmFzc2skKGEudi5hbmdsZUJldHdlZW4oYi52KSl9KSxiLmFycmF5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYS52LmFycmF5KCkpfSl9LGZvbnRDbGFzcz1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IGoucHJvY2Vzc2luZy5QRm9udDpuZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52KX0pLGIubGlzdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEudi5saXN0KCkpfSl9LGdyYXBoaWNzQ2xhc3M9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3I6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcihiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudixkLnYpfSksYi5iZWdpbkRyYXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYuYmVnaW5EcmF3KCl9KSxiLmVuZERyYXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYuZW5kRHJhdygpfSl9LHNoYXBlQ2xhc3M9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9udWxsOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgai5wcm9jZXNzaW5nLlBTaGFwZVNWRyhiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBTaGFwZVNWRyhiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBTaGFwZVNWRyhiLnYsYy52LGQudil9KSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJ3aWR0aFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGEudi53aWR0aCk6XFxcImhlaWdodFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LmhlaWdodCk6dm9pZCAwfSksYi5pc1Zpc2libGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChhLnYuaXNWaXNpYmxlKCkpfSksYi5zZXRWaXNpYmxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYuc2V0VmlzaWJsZShiLnYpfSksYi5kaXNhYmxlU3R5bGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYuZGlzYWJsZVN0eWxlKCl9KSxiLmVuYWJsZVN0eWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmVuYWJsZVN0eWxlKCl9KSxiLmdldENoaWxkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnYuZ2V0Q2hpbGQoYi52KTtpZihudWxsIT1jKXt2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QU2hhcGVTVkcpO3JldHVybiBkLnY9YyxkfXJldHVybiBudWxsfSksYi50cmFuc2xhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/YS52LnRyYW5zbGF0ZShiLnYsYy52KTphLnYudHJhbnNsYXRlKGIudixjLnYsZC52KX0pLGIucm90YXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYucm90YXRlKGIudil9KSxiLnJvdGF0ZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5yb3RhdGVYKGIudil9KSxiLnJvdGF0ZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYucm90YXRlWShhbmdsZS52KX0pLGIucm90YXRlWj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5yb3RhdGVaKGFuZ2xlLnYpfSksYi5zY2FsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9hLnYuc2NhbGUoYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/YS52LnNjYWxlKGIudixjLnYpOmEudi5zY2FsZShiLnYsYy52LGQudil9KX0sai5QRm9udD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZm9udENsYXNzLFxcXCJQRm9udFxcXCIsW10pLGouUEdyYXBoaWNzPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixncmFwaGljc0NsYXNzLFxcXCJQR3JhcGhpY3NcXFwiLFtdKSxqLlBTaGFwZVNWRz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosc2hhcGVDbGFzcyxcXFwiUFNoYXBlU1ZHXFxcIixbXSksai5QVmVjdG9yPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixoLFxcXCJQVmVjdG9yXFxcIixbXSksai5QSW1hZ2U9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGIsXFxcIlBJbWFnZVxcXCIsW10pLGp9O1wiLFwic3JjL2xpYi9wcm9maWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwcm9maWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHN0YXRzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwc3RhdHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wdHkucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInB0eSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B5X2NvbXBpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInB5X2NvbXBpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weWNsYnIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInB5Y2xiciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B5ZG9jLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweWRvYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B5ZG9jX3RvcGljcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHlkb2NfdG9waWNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvX19pbml0X18ucHlcIjpcIlwiLFwic3JjL2xpYi9weXRob25kcy9iYXNpYy9fX2luaXRfXy5weVwiOlwiXFxuI19fYWxsX18gPSBbXFxcInN0YWNrXFxcIl1cXG5cXG5cXG5mcm9tIC5zdGFjayBpbXBvcnQgU3RhY2tcXG5mcm9tIC5xdWV1ZSBpbXBvcnQgUXVldWVcXG5mcm9tIC5kZXF1ZSBpbXBvcnQgRGVxdWVcXG5cXG5cXG5cIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvZGVxdWUucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jXFxuIyBkZXF1ZS5weVxcblxcblxcbmNsYXNzIERlcXVlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzRW1wdHkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcyA9PSBbXVxcblxcbiAgICBkZWYgYWRkRnJvbnQoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgYWRkUmVhcihzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiByZW1vdmVGcm9udChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiByZW1vdmVSZWFyKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKDApXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLml0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kcy9iYXNpYy9xdWV1ZS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNVxcbiNcXG4jIHF1ZXVlLnB5XFxuXFxuXFxuY2xhc3MgUXVldWU6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaXRlbXMgPSBbXVxcblxcbiAgICBkZWYgaXNFbXB0eShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBlbnF1ZXVlKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5pbnNlcnQoMCwgaXRlbSlcXG5cXG4gICAgZGVmIGRlcXVldWUoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvc3RhY2sucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jXFxuIyBzdGFjay5weVxcblxcblxcbmNsYXNzIFN0YWNrOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzRW1wdHkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcyA9PSBbXVxcblxcbiAgICBkZWYgcHVzaChzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBwb3Aoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcGVlayhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zW2xlbihzZWxmLml0ZW1zKSAtIDFdXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLml0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kcy9ncmFwaHMvX19pbml0X18ucHlcIjpcIlxcblxcbmZyb20gLmFkakdyYXBoIGltcG9ydCBHcmFwaFxcbmZyb20gLmFkakdyYXBoIGltcG9ydCBWZXJ0ZXhcXG5mcm9tIC5wcmlvcml0eVF1ZXVlIGltcG9ydCBQcmlvcml0eVF1ZXVlXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2dyYXBocy9hZGpHcmFwaC5weVwiOlwiI1xcbiMgIGFkakdyYXBoXFxuI1xcbiMgIENyZWF0ZWQgYnkgQnJhZCBNaWxsZXIgb24gMjAwNS0wMi0yNC5cXG4jICBDb3B5cmlnaHQgKGMpIDIwMDUgQnJhZCBNaWxsZXIsIERhdmlkIFJhbnVtLCBMdXRoZXIgQ29sbGVnZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cXG4jXFxuXFxuaW1wb3J0IHN5c1xcbmltcG9ydCBvc1xcbmltcG9ydCB1bml0dGVzdFxcblxcbmNsYXNzIEdyYXBoOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLnZlcnRpY2VzID0ge31cXG4gICAgICAgIHNlbGYubnVtVmVydGljZXMgPSAwXFxuICAgICAgICBcXG4gICAgZGVmIGFkZFZlcnRleChzZWxmLGtleSk6XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gc2VsZi5udW1WZXJ0aWNlcyArIDFcXG4gICAgICAgIG5ld1ZlcnRleCA9IFZlcnRleChrZXkpXFxuICAgICAgICBzZWxmLnZlcnRpY2VzW2tleV0gPSBuZXdWZXJ0ZXhcXG4gICAgICAgIHJldHVybiBuZXdWZXJ0ZXhcXG4gICAgXFxuICAgIGRlZiBnZXRWZXJ0ZXgoc2VsZixuKTpcXG4gICAgICAgIGlmIG4gaW4gc2VsZi52ZXJ0aWNlczpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi52ZXJ0aWNlc1tuXVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsbik6XFxuICAgICAgICByZXR1cm4gbiBpbiBzZWxmLnZlcnRpY2VzXFxuICAgIFxcbiAgICBkZWYgYWRkRWRnZShzZWxmLGYsdCxjb3N0PTApOlxcbiAgICAgICAgICAgIGlmIGYgbm90IGluIHNlbGYudmVydGljZXM6XFxuICAgICAgICAgICAgICAgIG52ID0gc2VsZi5hZGRWZXJ0ZXgoZilcXG4gICAgICAgICAgICBpZiB0IG5vdCBpbiBzZWxmLnZlcnRpY2VzOlxcbiAgICAgICAgICAgICAgICBudiA9IHNlbGYuYWRkVmVydGV4KHQpXFxuICAgICAgICAgICAgc2VsZi52ZXJ0aWNlc1tmXS5hZGROZWlnaGJvcihzZWxmLnZlcnRpY2VzW3RdLGNvc3QpXFxuICAgIFxcbiAgICBkZWYgZ2V0VmVydGljZXMoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGlzdChzZWxmLnZlcnRpY2VzLmtleXMoKSlcXG4gICAgICAgIFxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gaXRlcihzZWxmLnZlcnRpY2VzLnZhbHVlcygpKVxcbiAgICAgICAgICAgICAgICBcXG5jbGFzcyBWZXJ0ZXg6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLG51bSk6XFxuICAgICAgICBzZWxmLmlkID0gbnVtXFxuICAgICAgICBzZWxmLmNvbm5lY3RlZFRvID0ge31cXG4gICAgICAgIHNlbGYuY29sb3IgPSAnd2hpdGUnXFxuICAgICAgICBzZWxmLmRpc3QgPSBzeXMubWF4c2l6ZVxcbiAgICAgICAgc2VsZi5wcmVkID0gTm9uZVxcbiAgICAgICAgc2VsZi5kaXNjID0gMFxcbiAgICAgICAgc2VsZi5maW4gPSAwXFxuXFxuICAgICMgZGVmIF9fbHRfXyhzZWxmLG8pOlxcbiAgICAjICAgICByZXR1cm4gc2VsZi5pZCA8IG8uaWRcXG4gICAgXFxuICAgIGRlZiBhZGROZWlnaGJvcihzZWxmLG5icix3ZWlnaHQ9MCk6XFxuICAgICAgICBzZWxmLmNvbm5lY3RlZFRvW25icl0gPSB3ZWlnaHRcXG4gICAgICAgIFxcbiAgICBkZWYgc2V0Q29sb3Ioc2VsZixjb2xvcik6XFxuICAgICAgICBzZWxmLmNvbG9yID0gY29sb3JcXG4gICAgICAgIFxcbiAgICBkZWYgc2V0RGlzdGFuY2Uoc2VsZixkKTpcXG4gICAgICAgIHNlbGYuZGlzdCA9IGRcXG5cXG4gICAgZGVmIHNldFByZWQoc2VsZixwKTpcXG4gICAgICAgIHNlbGYucHJlZCA9IHBcXG5cXG4gICAgZGVmIHNldERpc2NvdmVyeShzZWxmLGR0aW1lKTpcXG4gICAgICAgIHNlbGYuZGlzYyA9IGR0aW1lXFxuICAgICAgICBcXG4gICAgZGVmIHNldEZpbmlzaChzZWxmLGZ0aW1lKTpcXG4gICAgICAgIHNlbGYuZmluID0gZnRpbWVcXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0RmluaXNoKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZmluXFxuICAgICAgICBcXG4gICAgZGVmIGdldERpc2NvdmVyeShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmRpc2NcXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0UHJlZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnByZWRcXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0RGlzdGFuY2Uoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5kaXN0XFxuICAgICAgICBcXG4gICAgZGVmIGdldENvbG9yKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29sb3JcXG4gICAgXFxuICAgIGRlZiBnZXRDb25uZWN0aW9ucyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3RlZFRvLmtleXMoKVxcbiAgICAgICAgXFxuICAgIGRlZiBnZXRXZWlnaHQoc2VsZixuYnIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGVkVG9bbmJyXVxcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYuaWQpICsgXFxcIjpjb2xvciBcXFwiICsgc2VsZi5jb2xvciArIFxcXCI6ZGlzYyBcXFwiICsgc3RyKHNlbGYuZGlzYykgKyBcXFwiOmZpbiBcXFwiICsgc3RyKHNlbGYuZmluKSArIFxcXCI6ZGlzdCBcXFwiICsgc3RyKHNlbGYuZGlzdCkgKyBcXFwiOnByZWQgXFxcXG5cXFxcdFtcXFwiICsgc3RyKHNlbGYucHJlZCkrIFxcXCJdXFxcXG5cXFwiXFxuICAgIFxcbiAgICBkZWYgZ2V0SWQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pZFxcblxcbmNsYXNzIGFkakdyYXBoVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOlxcbiAgICBkZWYgc2V0VXAoc2VsZik6XFxuICAgICAgICBzZWxmLnRHcmFwaCA9IEdyYXBoKClcXG4gICAgICAgIFxcbiAgICBkZWYgdGVzdE1ha2VHcmFwaChzZWxmKTpcXG4gICAgICAgIGdGaWxlID0gb3BlbihcXFwidGVzdC5kYXRcXFwiKVxcbiAgICAgICAgZm9yIGxpbmUgaW4gZ0ZpbGU6XFxuICAgICAgICAgICAgZlZlcnRleCwgdFZlcnRleCA9IGxpbmUuc3BsaXQoJ3wnKVxcbiAgICAgICAgICAgIGZWZXJ0ZXggPSBpbnQoZlZlcnRleClcXG4gICAgICAgICAgICB0VmVydGV4ID0gaW50KHRWZXJ0ZXgpXFxuICAgICAgICAgICAgc2VsZi50R3JhcGguYWRkRWRnZShmVmVydGV4LHRWZXJ0ZXgpXFxuICAgICAgICBmb3IgaSBpbiBzZWxmLnRHcmFwaDpcXG4gICAgICAgICAgICBhZGogPSBpLmdldEFkaigpXFxuICAgICAgICAgICAgZm9yIGsgaW4gYWRqOlxcbiAgICAgICAgICAgICAgICBwcmludChpLCBrKVxcblxcbiAgICAgICAgXFxuaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzpcXG4gICAgdW5pdHRlc3QubWFpbigpXFxuICAgICAgICAgICAgICBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvZ3JhcGhzL3ByaW9yaXR5UXVldWUucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jIFxcbmltcG9ydCB1bml0dGVzdFxcblxcbiMgdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgaGVhcCB0YWtlcyBrZXkgdmFsdWUgcGFpcnMsXFxuIyB3ZSB3aWxsIGFzc3VtZSB0aGF0IHRoZSBrZXlzIGFyZSBhbGwgY29tcGFyYWJsZVxcblxcbmNsYXNzIFByaW9yaXR5UXVldWU6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaGVhcEFycmF5ID0gWygwLDApXVxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IDBcXG5cXG4gICAgZGVmIGJ1aWxkSGVhcChzZWxmLGFsaXN0KTpcXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBsZW4oYWxpc3QpXFxuICAgICAgICBzZWxmLmhlYXBBcnJheSA9IFsoMCwwKV1cXG4gICAgICAgIGZvciBpIGluIGFsaXN0OlxcbiAgICAgICAgICAgIHNlbGYuaGVhcEFycmF5LmFwcGVuZChpKVxcbiAgICAgICAgaSA9IGxlbihhbGlzdCkgLy8gMiAgICAgICAgICAgIFxcbiAgICAgICAgd2hpbGUgKGkgPiAwKTpcXG4gICAgICAgICAgICBzZWxmLnBlcmNEb3duKGkpXFxuICAgICAgICAgICAgaSA9IGkgLSAxXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgIGRlZiBwZXJjRG93bihzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgKGkgKiAyKSA8PSBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIG1jID0gc2VsZi5taW5DaGlsZChpKVxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2ldWzBdID4gc2VsZi5oZWFwQXJyYXlbbWNdWzBdOlxcbiAgICAgICAgICAgICAgICB0bXAgPSBzZWxmLmhlYXBBcnJheVtpXVxcbiAgICAgICAgICAgICAgICBzZWxmLmhlYXBBcnJheVtpXSA9IHNlbGYuaGVhcEFycmF5W21jXVxcbiAgICAgICAgICAgICAgICBzZWxmLmhlYXBBcnJheVttY10gPSB0bXBcXG4gICAgICAgICAgICBpID0gbWNcXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBtaW5DaGlsZChzZWxmLGkpOlxcbiAgICAgICAgaWYgaSoyID4gc2VsZi5jdXJyZW50U2l6ZTpcXG4gICAgICAgICAgICByZXR1cm4gLTFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgaSoyICsgMSA+IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmhlYXBBcnJheVtpKjJdWzBdIDwgc2VsZi5oZWFwQXJyYXlbaSoyKzFdWzBdOlxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkqMlxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkqMisxXFxuXFxuICAgIGRlZiBwZXJjVXAoc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIGkgLy8gMiA+IDA6XFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwQXJyYXlbaV1bMF0gPCBzZWxmLmhlYXBBcnJheVtpLy8yXVswXTpcXG4gICAgICAgICAgICAgICB0bXAgPSBzZWxmLmhlYXBBcnJheVtpLy8yXVxcbiAgICAgICAgICAgICAgIHNlbGYuaGVhcEFycmF5W2kvLzJdID0gc2VsZi5oZWFwQXJyYXlbaV1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBBcnJheVtpXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBpLy8yXFxuIFxcbiAgICBkZWYgYWRkKHNlbGYsayk6XFxuICAgICAgICBzZWxmLmhlYXBBcnJheS5hcHBlbmQoaylcXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBzZWxmLmN1cnJlbnRTaXplICsgMVxcbiAgICAgICAgc2VsZi5wZXJjVXAoc2VsZi5jdXJyZW50U2l6ZSlcXG5cXG4gICAgZGVmIGRlbE1pbihzZWxmKTpcXG4gICAgICAgIHJldHZhbCA9IHNlbGYuaGVhcEFycmF5WzFdWzFdXFxuICAgICAgICBzZWxmLmhlYXBBcnJheVsxXSA9IHNlbGYuaGVhcEFycmF5W3NlbGYuY3VycmVudFNpemVdXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSAtIDFcXG4gICAgICAgIHNlbGYuaGVhcEFycmF5LnBvcCgpXFxuICAgICAgICBzZWxmLnBlcmNEb3duKDEpXFxuICAgICAgICByZXR1cm4gcmV0dmFsXFxuICAgICAgICBcXG4gICAgZGVmIGlzRW1wdHkoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmN1cnJlbnRTaXplID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBkZWNyZWFzZUtleShzZWxmLHZhbCxhbXQpOlxcbiAgICAgICAgIyB0aGlzIGlzIGEgbGl0dGxlIHdpZXJkLCBidXQgd2UgbmVlZCB0byBmaW5kIHRoZSBoZWFwIHRoaW5nIHRvIGRlY3JlYXNlIGJ5XFxuICAgICAgICAjIGxvb2tpbmcgYXQgaXRzIHZhbHVlXFxuICAgICAgICBkb25lID0gRmFsc2VcXG4gICAgICAgIGkgPSAxXFxuICAgICAgICBteUtleSA9IDBcXG4gICAgICAgIHdoaWxlIG5vdCBkb25lIGFuZCBpIDw9IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwQXJyYXlbaV1bMV0gPT0gdmFsOlxcbiAgICAgICAgICAgICAgICBkb25lID0gVHJ1ZVxcbiAgICAgICAgICAgICAgICBteUtleSA9IGlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgIGlmIG15S2V5ID4gMDpcXG4gICAgICAgICAgICBzZWxmLmhlYXBBcnJheVtteUtleV0gPSAoYW10LHNlbGYuaGVhcEFycmF5W215S2V5XVsxXSlcXG4gICAgICAgICAgICBzZWxmLnBlcmNVcChteUtleSlcXG4gICAgICAgICAgICBcXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLHZ0eCk6XFxuICAgICAgICBmb3IgcGFpciBpbiBzZWxmLmhlYXBBcnJheTpcXG4gICAgICAgICAgICBpZiBwYWlyWzFdID09IHZ0eDpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIHJldHVybiBGYWxzZVxcbiAgICAgICAgXFxuY2xhc3MgVGVzdEJpbkhlYXAodW5pdHRlc3QuVGVzdENhc2UpOlxcbiAgICBkZWYgc2V0VXAoc2VsZik6XFxuICAgICAgICBzZWxmLnRoZUhlYXAgPSBQcmlvcml0eVF1ZXVlKClcXG4gICAgICAgIHNlbGYudGhlSGVhcC5hZGQoKDIsJ3gnKSlcXG4gICAgICAgIHNlbGYudGhlSGVhcC5hZGQoKDMsJ3knKSlcXG4gICAgICAgIHNlbGYudGhlSGVhcC5hZGQoKDUsJ3onKSlcXG4gICAgICAgIHNlbGYudGhlSGVhcC5hZGQoKDYsJ2EnKSlcXG4gICAgICAgIHNlbGYudGhlSGVhcC5hZGQoKDQsJ2QnKSlcXG5cXG5cXG4gICAgZGVmIHRlc3RJbnNlcnQoc2VsZik6XFxuICAgICAgICBhc3NlcnQgc2VsZi50aGVIZWFwLmN1cnJlbnRTaXplID09IDVcXG5cXG4gICAgZGVmIHRlc3REZWxtaW4oc2VsZik6XFxuICAgICAgICBhc3NlcnQgc2VsZi50aGVIZWFwLmRlbE1pbigpID09ICd4J1xcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5kZWxNaW4oKSA9PSAneSdcXG4gICAgXFxuICAgIGRlZiB0ZXN0RGVjS2V5KHNlbGYpOlxcbiAgICAgICAgc2VsZi50aGVIZWFwLmRlY3JlYXNlS2V5KCdkJywxKVxcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5kZWxNaW4oKSA9PSAnZCdcXG4gICAgICAgIFxcbmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6XFxuICAgIHVuaXR0ZXN0Lm1haW4oKVxcblwiLFwic3JjL2xpYi9weXRob25kcy90cmVlcy9fX2luaXRfXy5weVwiOlwiXFxuZnJvbSAuYmluYXJ5VHJlZSBpbXBvcnQgQmluYXJ5VHJlZVxcbmZyb20gLmJhbGFuY2UgaW1wb3J0IEFWTFRyZWVcXG5mcm9tIC5ic3QgaW1wb3J0IEJpbmFyeVNlYXJjaFRyZWVcXG5mcm9tIC5iaW5oZWFwIGltcG9ydCBCaW5IZWFwXFxuXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JhbGFuY2UucHlcIjpcIiMhL2Jpbi9lbnYgcHl0aG9uMy4xXFxuIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNSwgMjAxMFxcbiMgXFxuXFxuZnJvbSAuYnN0IGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlLCBUcmVlTm9kZVxcblxcbmNsYXNzIEFWTFRyZWUoQmluYXJ5U2VhcmNoVHJlZSk6XFxuICAgICcnJ1xcbiAgICBBdXRob3I6ICBCcmFkIE1pbGxlclxcbiAgICBEYXRlOiAgMS8xNS8yMDA1XFxuICAgIERlc2NyaXB0aW9uOiAgSW1sZW1lbnQgYSBiaW5hcnkgc2VhcmNoIHRyZWUgd2l0aCB0aGUgZm9sbG93aW5nIGludGVyZmFjZVxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uczogIFxcbiAgICAgICAgICAgICAgICAgIF9fY29udGFpbnNfXyh5KSA8PT0+IHkgaW4geFxcbiAgICAgICAgICAgICAgICAgIF9fZ2V0aXRlbV9fKHkpIDw9PT4geFt5XVxcbiAgICAgICAgICAgICAgICAgIF9faW5pdF9fKClcXG4gICAgICAgICAgICAgICAgICBfX2xlbl9fKCkgPD09PiBsZW4oeClcXG4gICAgICAgICAgICAgICAgICBfX3NldGl0ZW1fXyhrLHYpIDw9PT4geFtrXSA9IHZcXG4gICAgICAgICAgICAgICAgICBjbGVhcigpXFxuICAgICAgICAgICAgICAgICAgZ2V0KGspXFxuICAgICAgICAgICAgICAgICAgaGFzX2tleShrKVxcbiAgICAgICAgICAgICAgICAgIGl0ZW1zKCkgXFxuICAgICAgICAgICAgICAgICAga2V5cygpIFxcbiAgICAgICAgICAgICAgICAgIHZhbHVlcygpXFxuICAgICAgICAgICAgICAgICAgcHV0KGssdilcXG4gICAgJycnXFxuXFxuXFxuICAgIGRlZiBfcHV0KHNlbGYsa2V5LHZhbCxjdXJyZW50Tm9kZSk6XFxuICAgICAgICBpZiBrZXkgPCBjdXJyZW50Tm9kZS5rZXk6XFxuICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLGN1cnJlbnROb2RlLmxlZnRDaGlsZClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQgPSBUcmVlTm9kZShrZXksdmFsLHBhcmVudD1jdXJyZW50Tm9kZSlcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVCYWxhbmNlKGN1cnJlbnROb2RlLmxlZnRDaGlsZClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaGFzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LHZhbCxjdXJyZW50Tm9kZS5yaWdodENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQgPSBUcmVlTm9kZShrZXksdmFsLHBhcmVudD1jdXJyZW50Tm9kZSlcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVCYWxhbmNlKGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpICAgICAgICAgICAgICAgIFxcblxcbiAgICBkZWYgdXBkYXRlQmFsYW5jZShzZWxmLG5vZGUpOlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlRmFjdG9yID4gMSBvciBub2RlLmJhbGFuY2VGYWN0b3IgPCAtMTpcXG4gICAgICAgICAgICBzZWxmLnJlYmFsYW5jZShub2RlKVxcbiAgICAgICAgICAgIHJldHVyblxcbiAgICAgICAgaWYgbm9kZS5wYXJlbnQgIT0gTm9uZTpcXG4gICAgICAgICAgICBpZiBub2RlLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LmJhbGFuY2VGYWN0b3IgKz0gMVxcbiAgICAgICAgICAgIGVsaWYgbm9kZS5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQuYmFsYW5jZUZhY3RvciAtPSAxXFxuXFxuICAgICAgICAgICAgaWYgbm9kZS5wYXJlbnQuYmFsYW5jZUZhY3RvciAhPSAwOlxcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUJhbGFuY2Uobm9kZS5wYXJlbnQpXFxuXFxuICAgIGRlZiByZWJhbGFuY2Uoc2VsZixub2RlKTpcXG4gICAgICAgIGlmIG5vZGUuYmFsYW5jZUZhY3RvciA8IDA6XFxuICAgICAgICAgICAgaWYgbm9kZS5yaWdodENoaWxkLmJhbGFuY2VGYWN0b3IgPiAwOlxcbiAgICAgICAgICAgICAgICAjIERvIGFuIExSIFJvdGF0aW9uXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlUmlnaHQobm9kZS5yaWdodENoaWxkKVxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUxlZnQobm9kZSlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAjIHNpbmdsZSBsZWZ0XFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlTGVmdChub2RlKVxcbiAgICAgICAgZWxpZiBub2RlLmJhbGFuY2VGYWN0b3IgPiAwOlxcbiAgICAgICAgICAgIGlmIG5vZGUubGVmdENoaWxkLmJhbGFuY2VGYWN0b3IgPCAwOlxcbiAgICAgICAgICAgICAgICAjIERvIGFuIFJMIFJvdGF0aW9uXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlTGVmdChub2RlLmxlZnRDaGlsZClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVSaWdodChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIHJpZ2h0XFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlUmlnaHQobm9kZSlcXG5cXG4gICAgZGVmIHJvdGF0ZUxlZnQoc2VsZixyb3RSb290KTpcXG4gICAgICAgIG5ld1Jvb3QgPSByb3RSb290LnJpZ2h0Q2hpbGRcXG4gICAgICAgIHJvdFJvb3QucmlnaHRDaGlsZCA9IG5ld1Jvb3QubGVmdENoaWxkXFxuICAgICAgICBpZiBuZXdSb290LmxlZnRDaGlsZCAhPSBOb25lOlxcbiAgICAgICAgICAgIG5ld1Jvb3QubGVmdENoaWxkLnBhcmVudCA9IHJvdFJvb3RcXG4gICAgICAgIG5ld1Jvb3QucGFyZW50ID0gcm90Um9vdC5wYXJlbnRcXG4gICAgICAgIGlmIHJvdFJvb3QuaXNSb290KCk6XFxuICAgICAgICAgICAgc2VsZi5yb290ID0gbmV3Um9vdFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiByb3RSb290LmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHJvdFJvb3QucGFyZW50LmxlZnRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5yaWdodENoaWxkID0gbmV3Um9vdFxcbiAgICAgICAgbmV3Um9vdC5sZWZ0Q2hpbGQgPSByb3RSb290XFxuICAgICAgICByb3RSb290LnBhcmVudCA9IG5ld1Jvb3RcXG4gICAgICAgIHJvdFJvb3QuYmFsYW5jZUZhY3RvciA9IHJvdFJvb3QuYmFsYW5jZUZhY3RvciArIDEgLSBtaW4obmV3Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcbiAgICAgICAgbmV3Um9vdC5iYWxhbmNlRmFjdG9yID0gbmV3Um9vdC5iYWxhbmNlRmFjdG9yICsgMSArIG1heChyb3RSb290LmJhbGFuY2VGYWN0b3IsIDApXFxuXFxuXFxuICAgIGRlZiByb3RhdGVSaWdodChzZWxmLHJvdFJvb3QpOlxcbiAgICAgICAgbmV3Um9vdCA9IHJvdFJvb3QubGVmdENoaWxkXFxuICAgICAgICByb3RSb290LmxlZnRDaGlsZCA9IG5ld1Jvb3QucmlnaHRDaGlsZFxcbiAgICAgICAgaWYgbmV3Um9vdC5yaWdodENoaWxkICE9IE5vbmU6XFxuICAgICAgICAgICAgbmV3Um9vdC5yaWdodENoaWxkLnBhcmVudCA9IHJvdFJvb3RcXG4gICAgICAgIG5ld1Jvb3QucGFyZW50ID0gcm90Um9vdC5wYXJlbnRcXG4gICAgICAgIGlmIHJvdFJvb3QuaXNSb290KCk6XFxuICAgICAgICAgICAgc2VsZi5yb290ID0gbmV3Um9vdFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiByb3RSb290LmlzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5yaWdodENoaWxkID0gbmV3Um9vdFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJvdFJvb3QucGFyZW50LmxlZnRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgIG5ld1Jvb3QucmlnaHRDaGlsZCA9IHJvdFJvb3RcXG4gICAgICAgIHJvdFJvb3QucGFyZW50ID0gbmV3Um9vdFxcbiAgICAgICAgcm90Um9vdC5iYWxhbmNlRmFjdG9yID0gcm90Um9vdC5iYWxhbmNlRmFjdG9yIC0gMSAtIG1heChuZXdSb290LmJhbGFuY2VGYWN0b3IsIDApXFxuICAgICAgICBuZXdSb290LmJhbGFuY2VGYWN0b3IgPSBuZXdSb290LmJhbGFuY2VGYWN0b3IgLSAxICsgbWluKHJvdFJvb3QuYmFsYW5jZUZhY3RvciwgMClcXG4gICAgICAgIFxcblwiLFwic3JjL2xpYi9weXRob25kcy90cmVlcy9iaW5hcnlUcmVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuIyBcXG5cXG5jbGFzcyBCaW5hcnlUcmVlOlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgQSByZWN1cnNpdmUgaW1wbGVtZW50YXRpb24gb2YgQmluYXJ5IFRyZWVcXG4gICAgVXNpbmcgbGlua3MgYW5kIE5vZGVzIGFwcHJvYWNoLlxcbiAgICBcXFwiXFxcIlxcXCIgICAgXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLHJvb3RPYmopOlxcbiAgICAgICAgc2VsZi5rZXkgPSByb290T2JqXFxuICAgICAgICBzZWxmLmxlZnRDaGlsZCA9IE5vbmVcXG4gICAgICAgIHNlbGYucmlnaHRDaGlsZCA9IE5vbmVcXG5cXG4gICAgZGVmIGluc2VydExlZnQoc2VsZixuZXdOb2RlKTpcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkID09IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBCaW5hcnlUcmVlKG5ld05vZGUpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHQgPSBCaW5hcnlUcmVlKG5ld05vZGUpXFxuICAgICAgICAgICAgdC5sZWZ0ID0gc2VsZi5sZWZ0Q2hpbGRcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZCA9IHRcXG4gICAgXFxuICAgIGRlZiBpbnNlcnRSaWdodChzZWxmLG5ld05vZGUpOlxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkID09IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICB0ID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgICAgIHQucmlnaHQgPSBzZWxmLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQgPSB0XFxuXFxuICAgIGRlZiBpc0xlYWYoc2VsZik6XFxuICAgICAgICByZXR1cm4gKChub3Qgc2VsZi5sZWZ0Q2hpbGQpIGFuZCAobm90IHNlbGYucmlnaHRDaGlsZCkpXFxuXFxuICAgIGRlZiBnZXRSaWdodENoaWxkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucmlnaHRDaGlsZFxcblxcbiAgICBkZWYgZ2V0TGVmdENoaWxkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubGVmdENoaWxkXFxuXFxuICAgIGRlZiBzZXRSb290VmFsKHNlbGYsb2JqKTpcXG4gICAgICAgIHNlbGYua2V5ID0gb2JqXFxuXFxuICAgIGRlZiBnZXRSb290VmFsKHNlbGYsKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmtleVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLmlub3JkZXIoKVxcbiAgICAgICAgcHJpbnQoc2VsZi5rZXkpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLmlub3JkZXIoKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQucG9zdG9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQucG9zdG9yZGVyKClcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcblxcblxcbiAgICBkZWYgcHJlb3JkZXIoc2VsZik6XFxuICAgICAgICBwcmludChzZWxmLmtleSlcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnByZW9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQucHJlb3JkZXIoKVxcblxcbiAgICBkZWYgcHJpbnRleHAoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBwcmludCgnKCcpXFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQucHJpbnRleHAoKVxcbiAgICAgICAgcHJpbnQoc2VsZi5rZXkpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnByaW50ZXhwKClcXG4gICAgICAgICAgICBwcmludCgnKScpXFxuXFxuICAgIGRlZiBwb3N0b3JkZXJldmFsKHNlbGYpOlxcbiAgICAgICAgb3BlcnMgPSB7JysnOm9wZXJhdG9yLmFkZCwgJy0nOm9wZXJhdG9yLnN1YiwgJyonOm9wZXJhdG9yLm11bCwgJy8nOm9wZXJhdG9yLnRydWVkaXZ9XFxuICAgICAgICByZXMxID0gTm9uZVxcbiAgICAgICAgcmVzMiA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgIHJlczEgPSBzZWxmLmxlZnRDaGlsZC5wb3N0b3JkZXJldmFsKCkgICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHJlczIgPSBzZWxmLnJpZ2h0Q2hpbGQucG9zdG9yZGVyZXZhbCgpICMvLyBcXFxcbGFiZWx7cGVyaWdodH1cXG4gICAgICAgIGlmIHJlczEgYW5kIHJlczI6XFxuICAgICAgICAgICAgcmV0dXJuIG9wZXJzW3NlbGYua2V5XShyZXMxLHJlczIpICMvLyBcXFxcbGFiZWx7cGVldmFsfVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5rZXlcXG5cXG5kZWYgaW5vcmRlcih0cmVlKTpcXG4gICAgaWYgdHJlZSAhPSBOb25lOlxcbiAgICAgICAgaW5vcmRlcih0cmVlLmdldExlZnRDaGlsZCgpKVxcbiAgICAgICAgcHJpbnQodHJlZS5nZXRSb290VmFsKCkpXFxuICAgICAgICBpbm9yZGVyKHRyZWUuZ2V0UmlnaHRDaGlsZCgpKVxcblxcbmRlZiBwcmludGV4cCh0cmVlKTpcXG4gICAgaWYgdHJlZS5sZWZ0Q2hpbGQ6XFxuICAgICAgICBwcmludCgnKCcpXFxuICAgICAgICBwcmludGV4cCh0cmVlLmdldExlZnRDaGlsZCgpKVxcbiAgICBwcmludCh0cmVlLmdldFJvb3RWYWwoKSlcXG4gICAgaWYgdHJlZS5yaWdodENoaWxkOlxcbiAgICAgICAgcHJpbnRleHAodHJlZS5nZXRSaWdodENoaWxkKCkpXFxuICAgICAgICBwcmludCgnKScpIFxcblxcbmRlZiBwcmludGV4cCh0cmVlKTpcXG4gICAgc1ZhbCA9IFxcXCJcXFwiXFxuICAgIGlmIHRyZWU6XFxuICAgICAgICBzVmFsID0gJygnICsgcHJpbnRleHAodHJlZS5nZXRMZWZ0Q2hpbGQoKSlcXG4gICAgICAgIHNWYWwgPSBzVmFsICsgc3RyKHRyZWUuZ2V0Um9vdFZhbCgpKVxcbiAgICAgICAgc1ZhbCA9IHNWYWwgKyBwcmludGV4cCh0cmVlLmdldFJpZ2h0Q2hpbGQoKSkgKyAnKSdcXG4gICAgcmV0dXJuIHNWYWxcXG5cXG5kZWYgcG9zdG9yZGVyZXZhbCh0cmVlKTpcXG4gICAgb3BlcnMgPSB7JysnOm9wZXJhdG9yLmFkZCwgJy0nOm9wZXJhdG9yLnN1YiwgJyonOm9wZXJhdG9yLm11bCwgJy8nOm9wZXJhdG9yLnRydWVkaXZ9XFxuICAgIHJlczEgPSBOb25lXFxuICAgIHJlczIgPSBOb25lXFxuICAgIGlmIHRyZWU6XFxuICAgICAgICByZXMxID0gcG9zdG9yZGVyZXZhbCh0cmVlLmdldExlZnRDaGlsZCgpKSAgIy8vIFxcXFxsYWJlbHtwZWxlZnR9XFxuICAgICAgICByZXMyID0gcG9zdG9yZGVyZXZhbCh0cmVlLmdldFJpZ2h0Q2hpbGQoKSkgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcnNbdHJlZS5nZXRSb290VmFsKCldKHJlczEscmVzMikgIy8vIFxcXFxsYWJlbHtwZWV2YWx9XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiB0cmVlLmdldFJvb3RWYWwoKVxcblxcbmRlZiBoZWlnaHQodHJlZSk6XFxuICAgIGlmIHRyZWUgPT0gTm9uZTpcXG4gICAgICAgIHJldHVybiAtMVxcbiAgICBlbHNlOlxcbiAgICAgICAgcmV0dXJuIDEgKyBtYXgoaGVpZ2h0KHRyZWUubGVmdENoaWxkKSxoZWlnaHQodHJlZS5yaWdodENoaWxkKSlcXG5cXG4jIHQgPSBCaW5hcnlUcmVlKDcpXFxuIyB0Lmluc2VydExlZnQoMylcXG4jIHQuaW5zZXJ0UmlnaHQoOSlcXG4jIGlub3JkZXIodClcXG4jIGltcG9ydCBvcGVyYXRvclxcbiMgeCA9IEJpbmFyeVRyZWUoJyonKVxcbiMgeC5pbnNlcnRMZWZ0KCcrJylcXG4jIGwgPSB4LmdldExlZnRDaGlsZCgpXFxuIyBsLmluc2VydExlZnQoNClcXG4jIGwuaW5zZXJ0UmlnaHQoNSlcXG4jIHguaW5zZXJ0UmlnaHQoNylcXG4jIHByaW50KHByaW50ZXhwKHgpKVxcbiMgcHJpbnQocG9zdG9yZGVyZXZhbCh4KSlcXG4jIHByaW50KGhlaWdodCh4KSlcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvYmluaGVhcC5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNVxcbiMgXFxuXFxuIyB0aGlzIGhlYXAgdGFrZXMga2V5IHZhbHVlIHBhaXJzLCB3ZSB3aWxsIGFzc3VtZSB0aGF0IHRoZSBrZXlzIGFyZSBpbnRlZ2Vyc1xcbmNsYXNzIEJpbkhlYXA6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaGVhcExpc3QgPSBbMF1cXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSAwXFxuXFxuXFxuICAgIGRlZiBidWlsZEhlYXAoc2VsZixhbGlzdCk6XFxuICAgICAgICBpID0gbGVuKGFsaXN0KSAvLyAyXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gbGVuKGFsaXN0KVxcbiAgICAgICAgc2VsZi5oZWFwTGlzdCA9IFswXSArIGFsaXN0WzpdXFxuICAgICAgICBwcmludChsZW4oc2VsZi5oZWFwTGlzdCksIGkpXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHByaW50KHNlbGYuaGVhcExpc3QsIGkpXFxuICAgICAgICAgICAgc2VsZi5wZXJjRG93bihpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgcHJpbnQoc2VsZi5oZWFwTGlzdCxpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgcGVyY0Rvd24oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi5jdXJyZW50U2l6ZTpcXG4gICAgICAgICAgICBtYyA9IHNlbGYubWluQ2hpbGQoaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBMaXN0W2ldID4gc2VsZi5oZWFwTGlzdFttY106XFxuICAgICAgICAgICAgICAgIHRtcCA9IHNlbGYuaGVhcExpc3RbaV1cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwTGlzdFtpXSA9IHNlbGYuaGVhcExpc3RbbWNdXFxuICAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbbWNdID0gdG1wXFxuICAgICAgICAgICAgaSA9IG1jXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgbWluQ2hpbGQoc2VsZixpKTpcXG4gICAgICAgIGlmIGkgKiAyICsgMSA+IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcExpc3RbaSAqIDJdIDwgc2VsZi5oZWFwTGlzdFtpICogMiArIDFdOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDIgKyAxXFxuXFxuICAgIGRlZiBwZXJjVXAoc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIGkgLy8gMiA+IDA6XFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwTGlzdFtpXSA8IHNlbGYuaGVhcExpc3RbaS8vMl06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwTGlzdFtpIC8vIDJdXFxuICAgICAgICAgICAgICAgc2VsZi5oZWFwTGlzdFtpIC8vIDJdID0gc2VsZi5oZWFwTGlzdFtpXVxcbiAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbaV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaSAvLyAyXFxuIFxcbiAgICBkZWYgaW5zZXJ0KHNlbGYsayk6XFxuICAgICAgICBzZWxmLmhlYXBMaXN0LmFwcGVuZChrKVxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IHNlbGYuY3VycmVudFNpemUgKyAxXFxuICAgICAgICBzZWxmLnBlcmNVcChzZWxmLmN1cnJlbnRTaXplKVxcblxcbiAgICBkZWYgZGVsTWluKHNlbGYpOlxcbiAgICAgICAgcmV0dmFsID0gc2VsZi5oZWFwTGlzdFsxXVxcbiAgICAgICAgc2VsZi5oZWFwTGlzdFsxXSA9IHNlbGYuaGVhcExpc3Rbc2VsZi5jdXJyZW50U2l6ZV1cXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBzZWxmLmN1cnJlbnRTaXplIC0gMVxcbiAgICAgICAgc2VsZi5oZWFwTGlzdC5wb3AoKVxcbiAgICAgICAgc2VsZi5wZXJjRG93bigxKVxcbiAgICAgICAgcmV0dXJuIHJldHZhbFxcbiAgICAgICAgXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgaWYgY3VycmVudFNpemUgPT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvYnN0LnB5XCI6XCIjIS9iaW4vZW52IHB5dGhvbjMuMVxcbiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG4jIFxcblxcbmNsYXNzIEJpbmFyeVNlYXJjaFRyZWU6XFxuICAgICcnJ1xcbiAgICBBdXRob3I6ICBCcmFkIE1pbGxlclxcbiAgICBEYXRlOiAgMS8xNS8yMDA1XFxuICAgIERlc2NyaXB0aW9uOiAgSW1sZW1lbnQgYSBiaW5hcnkgc2VhcmNoIHRyZWUgd2l0aCB0aGUgZm9sbG93aW5nIGludGVyZmFjZVxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uczogIFxcbiAgICAgICAgICAgICAgICAgIF9fY29udGFpbnNfXyh5KSA8PT0+IHkgaW4geFxcbiAgICAgICAgICAgICAgICAgIF9fZ2V0aXRlbV9fKHkpIDw9PT4geFt5XVxcbiAgICAgICAgICAgICAgICAgIF9faW5pdF9fKClcXG4gICAgICAgICAgICAgICAgICBfX2xlbl9fKCkgPD09PiBsZW4oeClcXG4gICAgICAgICAgICAgICAgICBfX3NldGl0ZW1fXyhrLHYpIDw9PT4geFtrXSA9IHZcXG4gICAgICAgICAgICAgICAgICBjbGVhcigpXFxuICAgICAgICAgICAgICAgICAgZ2V0KGspXFxuICAgICAgICAgICAgICAgICAgaXRlbXMoKSBcXG4gICAgICAgICAgICAgICAgICBrZXlzKCkgXFxuICAgICAgICAgICAgICAgICAgdmFsdWVzKClcXG4gICAgICAgICAgICAgICAgICBwdXQoayx2KVxcbiAgICAgICAgICAgICAgICAgIGluXFxuICAgICAgICAgICAgICAgICAgZGVsIDw9PT4gXFxuICAgICcnJ1xcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLnJvb3QgPSBOb25lXFxuICAgICAgICBzZWxmLnNpemUgPSAwXFxuICAgIFxcbiAgICBkZWYgcHV0KHNlbGYsa2V5LHZhbCk6XFxuICAgICAgICBpZiBzZWxmLnJvb3Q6XFxuICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsc2VsZi5yb290KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLnJvb3QgPSBUcmVlTm9kZShrZXksdmFsKVxcbiAgICAgICAgc2VsZi5zaXplID0gc2VsZi5zaXplICsgMVxcblxcbiAgICBkZWYgX3B1dChzZWxmLGtleSx2YWwsY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudE5vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LHZhbCxjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICAgICAgXFxuICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLGssdik6XFxuICAgICAgICBzZWxmLnB1dChrLHYpXFxuXFxuICAgIGRlZiBnZXQoc2VsZixrZXkpOlxcbiAgICAgICAgaWYgc2VsZi5yb290OlxcbiAgICAgICAgICAgIHJlcyA9IHNlbGYuX2dldChrZXksc2VsZi5yb290KVxcbiAgICAgICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5wYXlsb2FkXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIFxcbiAgICBkZWYgX2dldChzZWxmLGtleSxjdXJyZW50Tm9kZSk6XFxuICAgICAgICBpZiBub3QgY3VycmVudE5vZGU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIGVsaWYgY3VycmVudE5vZGUua2V5ID09IGtleTpcXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudE5vZGVcXG4gICAgICAgIGVsaWYga2V5IDwgY3VycmVudE5vZGUua2V5OlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LGN1cnJlbnROb2RlLmxlZnRDaGlsZClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldChrZXksY3VycmVudE5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICBcXG4gICAgICAgIFxcbiAgICBkZWYgX19nZXRpdGVtX18oc2VsZixrZXkpOlxcbiAgICAgICAgcmVzID0gc2VsZi5nZXQoa2V5KVxcbiAgICAgICAgaWYgcmVzOlxcbiAgICAgICAgICAgIHJldHVybiByZXNcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBrZXkgbm90IGluIHRyZWUnKVxcbiAgICAgICAgICAgIFxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsa2V5KTpcXG4gICAgICAgIGlmIHNlbGYuX2dldChrZXksc2VsZi5yb290KTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG4gICAgICAgIFxcbiAgICBkZWYgbGVuZ3RoKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuc2l6ZVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnNpemVcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucm9vdC5fX2l0ZXJfXygpXFxuICAgIFxcbiAgICBkZWYgZGVsZXRlKHNlbGYsa2V5KTpcXG4gICAgICAgIGlmIHNlbGYuc2l6ZSA+IDE6XFxuICAgICAgICAgICAgbm9kZVRvUmVtb3ZlID0gc2VsZi5fZ2V0KGtleSxzZWxmLnJvb3QpXFxuICAgICAgICAgICAgaWYgbm9kZVRvUmVtb3ZlOlxcbiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZShub2RlVG9SZW1vdmUpXFxuICAgICAgICAgICAgICAgIHNlbGYuc2l6ZSA9IHNlbGYuc2l6ZS0xXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBrZXkgbm90IGluIHRyZWUnKVxcbiAgICAgICAgZWxpZiBzZWxmLnNpemUgPT0gMSBhbmQgc2VsZi5yb290LmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgc2VsZi5yb290ID0gTm9uZVxcbiAgICAgICAgICAgIHNlbGYuc2l6ZSA9IHNlbGYuc2l6ZSAtIDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBrZXkgbm90IGluIHRyZWUnKVxcblxcbiAgICBkZWYgX19kZWxpdGVtX18oc2VsZixrZXkpOlxcbiAgICAgICAgc2VsZi5kZWxldGUoa2V5KVxcbiAgICBcXG4gICAgZGVmIHJlbW92ZShzZWxmLGN1cnJlbnROb2RlKTpcXG4gICAgICAgIGlmIGN1cnJlbnROb2RlLmlzTGVhZigpOiAjbGVhZlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlID09IGN1cnJlbnROb2RlLnBhcmVudC5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5sZWZ0Q2hpbGQgPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LnJpZ2h0Q2hpbGQgPSBOb25lXFxuICAgICAgICBlbGlmIGN1cnJlbnROb2RlLmhhc0JvdGhDaGlsZHJlbigpOiAjaW50ZXJpb3JcXG4gICAgICAgICAgICBzdWNjID0gY3VycmVudE5vZGUuZmluZFN1Y2Nlc3NvcigpXFxuICAgICAgICAgICAgc3VjYy5zcGxpY2VPdXQoKVxcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLmtleSA9IHN1Y2Mua2V5XFxuICAgICAgICAgICAgY3VycmVudE5vZGUucGF5bG9hZCA9IHN1Y2MucGF5bG9hZFxcbiAgICAgICAgZWxzZTogIyB0aGlzIG5vZGUgaGFzIG9uZSBjaGlsZFxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkLnBhcmVudCA9IGN1cnJlbnROb2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LmxlZnRDaGlsZCA9IGN1cnJlbnROb2RlLmxlZnRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnROb2RlLmlzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkLnBhcmVudCA9IGN1cnJlbnROb2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LnJpZ2h0Q2hpbGQgPSBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJlcGxhY2VOb2RlRGF0YShjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQua2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5wYXlsb2FkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5sZWZ0Q2hpbGQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQucGFyZW50ID0gY3VycmVudE5vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkID0gY3VycmVudE5vZGUucmlnaHRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnROb2RlLmlzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5yaWdodENoaWxkID0gY3VycmVudE5vZGUucmlnaHRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmVwbGFjZU5vZGVEYXRhKGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQua2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQucGF5bG9hZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLmxlZnRDaGlsZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnJpZ2h0Q2hpbGQpXFxuXFxuICAgIGRlZiBpbm9yZGVyKHNlbGYpOlxcbiAgICAgICAgc2VsZi5faW5vcmRlcihzZWxmLnJvb3QpXFxuXFxuICAgIGRlZiBfaW5vcmRlcihzZWxmLHRyZWUpOlxcbiAgICAgICAgaWYgdHJlZSAhPSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgcHJpbnQodHJlZS5rZXkpXFxuICAgICAgICAgICAgc2VsZi5faW5vcmRlcih0cmVlLnJpZ2h0Q2hpbGQpXFxuXFxuICAgIGRlZiBwb3N0b3JkZXIoc2VsZik6XFxuICAgICAgICBzZWxmLl9wb3N0b3JkZXIoc2VsZi5yb290KVxcblxcbiAgICBkZWYgX3Bvc3RvcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIGlmIHRyZWU6XFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZXIodHJlZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgcHJpbnQodHJlZS5rZXkpICAgICAgICAgICAgXFxuXFxuICAgIGRlZiBwcmVvcmRlcihzZWxmKTpcXG4gICAgICAgIHNlbGYuX3ByZW9yZGVyKHNlbGYsc2VsZi5yb290KVxcblxcbiAgICBkZWYgX3ByZW9yZGVyKHNlbGYsdHJlZSk6XFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5KSAgICAgICAgICAgIFxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVyKHRyZWUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVyKHRyZWUucmlnaHRDaGlsZClcXG5cXG4gICAgICAgICAgICAgICAgXFxuY2xhc3MgVHJlZU5vZGU6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLGtleSx2YWwsbGVmdD1Ob25lLHJpZ2h0PU5vbmUscGFyZW50PU5vbmUpOlxcbiAgICAgICAgc2VsZi5rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYucGF5bG9hZCA9IHZhbFxcbiAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBsZWZ0XFxuICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQgPSByaWdodFxcbiAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnRcXG4gICAgICAgIHNlbGYuYmFsYW5jZUZhY3RvciA9IDBcXG4gICAgICAgIFxcbiAgICBkZWYgaGFzTGVmdENoaWxkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubGVmdENoaWxkXFxuXFxuICAgIGRlZiBoYXNSaWdodENoaWxkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucmlnaHRDaGlsZFxcbiAgICBcXG4gICAgZGVmIGlzTGVmdENoaWxkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50IGFuZCBzZWxmLnBhcmVudC5sZWZ0Q2hpbGQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNSaWdodENoaWxkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50IGFuZCBzZWxmLnBhcmVudC5yaWdodENoaWxkID09IHNlbGZcXG5cXG4gICAgZGVmIGlzUm9vdChzZWxmKTpcXG4gICAgICAgIHJldHVybiBub3Qgc2VsZi5wYXJlbnRcXG5cXG4gICAgZGVmIGlzTGVhZihzZWxmKTpcXG4gICAgICAgIHJldHVybiBub3QgKHNlbGYucmlnaHRDaGlsZCBvciBzZWxmLmxlZnRDaGlsZClcXG5cXG4gICAgZGVmIGhhc0FueUNoaWxkcmVuKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucmlnaHRDaGlsZCBvciBzZWxmLmxlZnRDaGlsZFxcblxcbiAgICBkZWYgaGFzQm90aENoaWxkcmVuKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucmlnaHRDaGlsZCBhbmQgc2VsZi5sZWZ0Q2hpbGRcXG4gICAgXFxuICAgIGRlZiByZXBsYWNlTm9kZURhdGEoc2VsZixrZXksdmFsdWUsbGMscmMpOlxcbiAgICAgICAgc2VsZi5rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYucGF5bG9hZCA9IHZhbHVlXFxuICAgICAgICBzZWxmLmxlZnRDaGlsZCA9IGxjXFxuICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQgPSByY1xcbiAgICAgICAgaWYgc2VsZi5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5wYXJlbnQgPSBzZWxmXFxuICAgICAgICBpZiBzZWxmLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQucGFyZW50ID0gc2VsZlxcbiAgICAgICAgXFxuICAgIGRlZiBmaW5kU3VjY2Vzc29yKHNlbGYpOlxcbiAgICAgICAgc3VjYyA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYuaGFzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgIHN1Y2MgPSBzZWxmLnJpZ2h0Q2hpbGQuZmluZE1pbigpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYucGFyZW50OlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBzdWNjID0gc2VsZi5wYXJlbnRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJpZ2h0Q2hpbGQgPSBOb25lXFxuICAgICAgICAgICAgICAgICAgICBzdWNjID0gc2VsZi5wYXJlbnQuZmluZFN1Y2Nlc3NvcigpXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gc2VsZlxcbiAgICAgICAgcmV0dXJuIHN1Y2NcXG5cXG5cXG4gICAgZGVmIHNwbGljZU91dChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuaXNMZWFmKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5sZWZ0Q2hpbGQgPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IE5vbmVcXG4gICAgICAgIGVsaWYgc2VsZi5oYXNBbnlDaGlsZHJlbigpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LmxlZnRDaGlsZCA9IHNlbGYubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gc2VsZi5sZWZ0Q2hpbGRcXG4gICAgICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQucGFyZW50ID0gc2VsZi5wYXJlbnRcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5sZWZ0Q2hpbGQgPSBzZWxmLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJpZ2h0Q2hpbGQgPSBzZWxmLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnBhcmVudCA9IHNlbGYucGFyZW50XFxuXFxuICAgIGRlZiBmaW5kTWluKHNlbGYpOlxcbiAgICAgICAgY3VycmVudCA9IHNlbGZcXG4gICAgICAgIHdoaWxlIGN1cnJlbnQuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubGVmdENoaWxkXFxuICAgICAgICByZXR1cm4gY3VycmVudFxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUaGUgc3RhbmRhcmQgaW5vcmRlciB0cmF2ZXJzYWwgb2YgYSBiaW5hcnkgdHJlZS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGY6XFxuICAgICAgICAgICAgaWYgc2VsZi5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtXFxuICAgICAgICAgICAgeWllbGQgc2VsZi5rZXlcXG4gICAgICAgICAgICBpZiBzZWxmLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcblxcbiAgICAgICAgICAgIFxcblwiLFwic3JjL2xpYi9weXRob25kczMvX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMgaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcblxcbmZyb20gcHl0aG9uZHMzLmJhc2ljIGltcG9ydCBTdGFjaywgUXVldWUsIERlcXVlXFxuZnJvbSBweXRob25kczMuZ3JhcGhzIGltcG9ydCBHcmFwaCwgVmVydGV4XFxuZnJvbSBweXRob25kczMuc2VhcmNoaW5nIGltcG9ydCBIYXNoVGFibGVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcyBpbXBvcnQgKFxcbiAgICBCaW5hcnlUcmVlLFxcbiAgICBBVkxUcmVlLFxcbiAgICBCaW5hcnlTZWFyY2hUcmVlLFxcbiAgICBCaW5hcnlIZWFwLFxcbiAgICBQcmlvcml0eVF1ZXVlLFxcbilcXG5cXG5fX2FsbF9fID0gW1xcbiAgICBcXFwiU3RhY2tcXFwiLFxcbiAgICBcXFwiUXVldWVcXFwiLFxcbiAgICBcXFwiRGVxdWVcXFwiLFxcbiAgICBcXFwiR3JhcGhcXFwiLFxcbiAgICBcXFwiVmVydGV4XFxcIixcXG4gICAgXFxcIkhhc2hUYWJsZVxcXCIsXFxuICAgIFxcXCJCaW5hcnlUcmVlXFxcIixcXG4gICAgXFxcIkFWTFRyZWVcXFwiLFxcbiAgICBcXFwiQmluYXJ5U2VhcmNoVHJlZVxcXCIsXFxuICAgIFxcXCJCaW5hcnlIZWFwXFxcIixcXG4gICAgXFxcIkJpbmFyeVRyZWVcXFwiLFxcbiAgICBcXFwiUHJpb3JpdHlRdWV1ZVxcXCIsXFxuXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuYmFzaWMgaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLmJhc2ljLnN0YWNrIGltcG9ydCBTdGFja1xcbmZyb20gcHl0aG9uZHMzLmJhc2ljLnF1ZXVlIGltcG9ydCBRdWV1ZVxcbmZyb20gcHl0aG9uZHMzLmJhc2ljLmRlcXVlIGltcG9ydCBEZXF1ZVxcbmZyb20gcHl0aG9uZHMzLmJhc2ljLmxpbmtlZF9saXN0IGltcG9ydCBPcmRlcmVkTGlzdFxcbmZyb20gcHl0aG9uZHMzLmJhc2ljLmxpbmtlZF9saXN0IGltcG9ydCBVbm9yZGVyZWRMaXN0XFxuXFxuX19hbGxfXyA9IFtcXFwiU3RhY2tcXFwiLCBcXFwiUXVldWVcXFwiLCBcXFwiRGVxdWVcXFwiLCBcXFwiT3JkZXJlZExpc3RcXFwiLCBcXFwiVW5vcmRlcmVkTGlzdFxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9iYXNpYy9kZXF1ZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBEZXF1ZTpcXG4gICAgXFxcIlxcXCJcXFwiUXVldWUgaW1wbGVtZW50YXRpb24gYXMgYSBsaXN0XFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgZGVxdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIGRlcXVlIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faXRlbXMpXFxuXFxuICAgIGRlZiBhZGRfZnJvbnQoc2VsZiwgaXRlbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYW4gaXRlbSB0byB0aGUgZnJvbnQgb2YgdGhlIGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGFkZF9yZWFyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHJlYXIgb2YgdGhlIGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcy5pbnNlcnQoMCwgaXRlbSlcXG5cXG4gICAgZGVmIHJlbW92ZV9mcm9udChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIGZyb250IG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiByZW1vdmVfcmVhcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIHJlYXIgb2YgdGhlIGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faXRlbXMucG9wKDApXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2l0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvbGlua2VkX2xpc3QucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgTGlua2VkTGlzdE5vZGU6XFxuICAgIFxcXCJcXFwiXFxcIkEgbm9kZSBvZiBhIGxpbmtlZCBsaXN0XFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlX2RhdGEpOlxcbiAgICAgICAgc2VsZi5fZGF0YSA9IG5vZGVfZGF0YVxcbiAgICAgICAgc2VsZi5fbmV4dCA9IE5vbmVcXG5cXG4gICAgZGVmIGdldF9kYXRhKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IG5vZGUgZGF0YVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGFcXG5cXG4gICAgZGVmIHNldF9kYXRhKHNlbGYsIG5vZGVfZGF0YSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgbm9kZSBkYXRhXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9kYXRhID0gbm9kZV9kYXRhXFxuXFxuICAgIGRhdGEgPSBwcm9wZXJ0eShnZXRfZGF0YSwgc2V0X2RhdGEpXFxuXFxuICAgIGRlZiBnZXRfbmV4dChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBuZXh0IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9uZXh0XFxuXFxuICAgIGRlZiBzZXRfbmV4dChzZWxmLCBub2RlX25leHQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5leHQgbm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fbmV4dCA9IG5vZGVfbmV4dFxcblxcbiAgICBuZXh0ID0gcHJvcGVydHkoZ2V0X25leHQsIHNldF9uZXh0KVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlN0cmluZ1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLl9kYXRhKVxcblxcblxcbmNsYXNzIExpbmtlZExpc3Q6XFxuICAgIFxcXCJcXFwiXFxcIkxpbmtlZCBMaXN0IGNsYXNzIGltcGxlbWVudGF0aW9uXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhIGxpbmtlZCBsaXN0XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9oZWFkID0gTm9uZVxcbiAgICAgICAgc2VsZi5fY291bnQgPSAwXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIklzIHRoZSBsaXN0IGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faGVhZCBpcyBOb25lXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2l6ZSBvZiB0aGUgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NvdW50XFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2l6ZSBvZiB0aGUgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NvdW50XFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTGlzdCBhcyBhIHN0cmluZ1xcXCJcXFwiXFxcIlxcbiAgICAgICAgbGlzdF9zdHIgPSBcXFwiW1xcXCJcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmLl9oZWFkXFxuXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIGxpc3Rfc3RyICs9IHN0cihjdXJyZW50KVxcbiAgICAgICAgICAgIGlmIGN1cnJlbnQubmV4dDpcXG4gICAgICAgICAgICAgICAgbGlzdF9zdHIgKz0gXFxcIiwgXFxcIlxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcXG4gICAgICAgIGxpc3Rfc3RyICs9IFxcXCJdXFxcIlxcbiAgICAgICAgcmV0dXJuIGxpc3Rfc3RyXFxuXFxuICAgIGRlZiBhZGQoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhc3NcXG5cXG4gICAgZGVmIHJlbW92ZShzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcGFzc1xcblxcbiAgICBkZWYgc2VhcmNoKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNlYXJjaCBmb3IgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcGFzc1xcblxcblxcbmNsYXNzIFVub3JkZXJlZExpc3QoTGlua2VkTGlzdCk6XFxuICAgIFxcXCJcXFwiXFxcIlVub3JkZXJlZCBsaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYW4gdW5vcmRlcmVkIGxpbmtlZCBsaXN0XFxcIlxcXCJcXFwiXFxuICAgICAgICBMaW5rZWRMaXN0Ll9faW5pdF9fKHNlbGYpXFxuXFxuICAgIGRlZiBhZGQoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19ub2RlID0gTGlua2VkTGlzdE5vZGUodmFsdWUpXFxuICAgICAgICBuZXdfbm9kZS5zZXRfbmV4dChzZWxmLl9oZWFkKVxcbiAgICAgICAgc2VsZi5faGVhZCA9IG5ld19ub2RlXFxuICAgICAgICBzZWxmLl9jb3VudCA9IHNlbGYuX2NvdW50ICsgMVxcblxcbiAgICBkZWYgcmVtb3ZlKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhIG5vZGUgd2l0aCBhIHNwZWNpZmljIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZi5faGVhZFxcbiAgICAgICAgcHJldiA9IE5vbmVcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQ6XFxuICAgICAgICAgICAgaWYgY3VycmVudC5kYXRhID09IHZhbHVlOlxcbiAgICAgICAgICAgICAgICBpZiBwcmV2IGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFkID0gY3VycmVudC5uZXh0XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBjdXJyZW50Lm5leHRcXG4gICAgICAgICAgICAgICAgc2VsZi5fY291bnQgPSBzZWxmLl9jb3VudCAtIDFcXG4gICAgICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICAgICAgcHJldiA9IGN1cnJlbnRcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJ7fSBpcyBub3QgaW4gdGhlIGxpc3RcXFwiLmZvcm1hdCh2YWx1ZSkpXFxuXFxuICAgIGRlZiBzZWFyY2goc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2VhcmNoIGZvciBhIG5vZGUgd2l0aCBhIHNwZWNpZmljIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZi5faGVhZFxcblxcbiAgICAgICAgd2hpbGUgY3VycmVudDpcXG4gICAgICAgICAgICBpZiBjdXJyZW50LmRhdGEgPT0gdmFsdWU6XFxuICAgICAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuXFxuY2xhc3MgT3JkZXJlZExpc3QoTGlua2VkTGlzdCk6XFxuICAgIFxcXCJcXFwiXFxcIk9yZGVyZWQgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGFuIE9yZGVyZWQgbGlua2VkIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIExpbmtlZExpc3QuX19pbml0X18oc2VsZilcXG5cXG4gICAgZGVmIGFkZChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYSBuZXcgbm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG4gICAgICAgIHByZXYgPSBOb25lXFxuICAgICAgICBuZXdfbm9kZSA9IExpbmtlZExpc3ROb2RlKHZhbHVlKVxcblxcbiAgICAgICAgd2hpbGUgY3VycmVudCBhbmQgY3VycmVudC5kYXRhIDwgdmFsdWU6XFxuICAgICAgICAgICAgcHJldiA9IGN1cnJlbnRcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XFxuXFxuICAgICAgICBpZiBwcmV2IGlzIE5vbmU6XFxuICAgICAgICAgICAgbmV3X25vZGUubmV4dCA9IHNlbGYuX2hlYWRcXG4gICAgICAgICAgICBzZWxmLl9oZWFkID0gbmV3X25vZGVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbmV3X25vZGUubmV4dCA9IGN1cnJlbnRcXG4gICAgICAgICAgICBwcmV2Lm5leHQgPSBuZXdfbm9kZVxcbiAgICAgICAgc2VsZi5fY291bnQgPSBzZWxmLl9jb3VudCArIDFcXG5cXG4gICAgZGVmIHJlbW92ZShzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBUaGlzIGlzIGFuIGV4ZXJjaXNlXFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiBzZWFyY2goc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2VhcmNoIGZvciBhIG5vZGUgd2l0aCBhIHNwZWNpZmljIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIFRoaXMgaXMgYW4gZXhlcmNpc2VcXG4gICAgICAgIHBhc3NcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL3F1ZXVlLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIFF1ZXVlOlxcbiAgICBcXFwiXFxcIlxcXCJRdWV1ZSBpbXBsZW1lbnRhdGlvbiBhcyBhIGxpc3RcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIG5ldyBxdWV1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMgPSBbXVxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgcXVldWUgaXMgZW1wdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBub3QgYm9vbChzZWxmLl9pdGVtcylcXG5cXG4gICAgZGVmIGVucXVldWUoc2VsZiwgaXRlbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYW4gaXRlbSB0byB0aGUgcXVldWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zLmluc2VydCgwLCBpdGVtKVxcblxcbiAgICBkZWYgZGVxdWV1ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgcXVldWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5faXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9iYXNpYy9zdGFjay5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBTdGFjazpcXG4gICAgXFxcIlxcXCJcXFwiU3RhY2sgaW1wbGVtZW50YXRpb24gYXMgYSBsaXN0XFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgc3RhY2tcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIHN0YWNrIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faXRlbXMpXFxuXFxuICAgIGRlZiBwdXNoKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIHBvcChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHBlZWsoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdGhlIHZhbHVlIG9mIHRoZSB0b3AgaXRlbSBpbiB0aGUgc3RhY2tcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9pdGVtc1stMV1cXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgc3RhY2tcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5faXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9ncmFwaHMvX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuZ3JhcGhzIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy5ncmFwaHMuYWRqYWNlbmN5X2dyYXBoIGltcG9ydCBHcmFwaFxcbmZyb20gcHl0aG9uZHMzLmdyYXBocy5hZGphY2VuY3lfZ3JhcGggaW1wb3J0IFZlcnRleFxcblxcbl9fYWxsX18gPSBbXFxcIkdyYXBoXFxcIl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2dyYXBocy9hZGphY2VuY3lfZ3JhcGgucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IGhlYXBxXFxuaW1wb3J0IHN5c1xcblxcblxcbmNsYXNzIFZlcnRleDpcXG4gICAgXFxcIlxcXCJcXFwiR3JhcGggdmVydGV4IGNsYXNzXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIG5ldyB2ZXJ0ZXhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fbmVpZ2hib3JzID0ge31cXG4gICAgICAgIHNlbGYuX2NvbG9yID0gXFxcIndoaXRlXFxcIlxcbiAgICAgICAgc2VsZi5fZGlzdGFuY2UgPSBzeXMubWF4c2l6ZVxcbiAgICAgICAgc2VsZi5fcHJldmlvdXMgPSBOb25lXFxuICAgICAgICBzZWxmLl9kaXNjb3ZlcnlfdGltZSA9IDBcXG4gICAgICAgIHNlbGYuX2Nsb3NpbmdfdGltZSA9IDBcXG5cXG4gICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJMZXNzIHRoYW4gb3BlcmF0b3IgcmVxdWlyZWQgZm9yIGhlYXBpZnlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLmtleSA8IG90aGVyLmtleVxcblxcbiAgICBkZWYgZ2V0X2tleShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB2ZXJ0ZXgga2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fa2V5XFxuXFxuICAgIGtleSA9IHByb3BlcnR5KGdldF9rZXkpXFxuXFxuICAgIGRlZiBnZXRfbmVpZ2hib3Ioc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBkaXN0YW5jZSAoZWRnZSB3ZWlnaHQpIHRvIGFuIGFkamFjZW50IG5vZGUgKG5laWdoYm9yKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX25laWdoYm9ycy5nZXQob3RoZXIsIE5vbmUpXFxuXFxuICAgIGRlZiBzZXRfbmVpZ2hib3Ioc2VsZiwgb3RoZXIsIHdlaWdodD0wKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB0aGUgZGlzdGFuY2UgKGFkZCBhbiBlZGdlKSB0byBhbiBhZGphY2VudCBub2RlIChuZWlnaGJvcilcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX25laWdoYm9yc1tvdGhlcl0gPSB3ZWlnaHRcXG5cXG4gICAgZGVmIGdldF9uZWlnaGJvcnMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgYWxsIGFkamFjZW50IG5vZGVzIChuZWlnaGJvcnMpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbmVpZ2hib3JzLmtleXMoKVxcblxcbiAgICBkZWYgZ2V0X2NvbG9yKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHZlcnRleCBjb2xvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbG9yXFxuXFxuICAgIGRlZiBzZXRfY29sb3Ioc2VsZiwgY29sb3IpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHZlcnRleCBjb2xvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fY29sb3IgPSBjb2xvclxcblxcbiAgICBjb2xvciA9IHByb3BlcnR5KGdldF9jb2xvciwgc2V0X2NvbG9yKVxcblxcbiAgICBkZWYgZ2V0X2Rpc3RhbmNlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGRpc3RhbmNlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZGlzdGFuY2VcXG5cXG4gICAgZGVmIHNldF9kaXN0YW5jZShzZWxmLCBkaXN0YW5jZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgZGlzdGFuY2VcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Rpc3RhbmNlID0gZGlzdGFuY2VcXG5cXG4gICAgZGlzdGFuY2UgPSBwcm9wZXJ0eShnZXRfZGlzdGFuY2UsIHNldF9kaXN0YW5jZSlcXG5cXG4gICAgZGVmIGdldF9wcmV2aW91cyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBwcmV2aW91c1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXZpb3VzXFxuXFxuICAgIGRlZiBzZXRfcHJldmlvdXMoc2VsZiwgcHJldmlvdXMpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHByZXZpb3VzXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9wcmV2aW91cyA9IHByZXZpb3VzXFxuXFxuICAgIHByZXZpb3VzID0gcHJvcGVydHkoZ2V0X3ByZXZpb3VzLCBzZXRfcHJldmlvdXMpXFxuXFxuICAgIGRlZiBnZXRfZGlzY292ZXJ5X3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgZGlzY292ZXJ5IHRpbWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kaXNjb3ZlcnlfdGltZVxcblxcbiAgICBkZWYgc2V0X2Rpc2NvdmVyeV90aW1lKHNlbGYsIGRpc2NvdmVyeV90aW1lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBkaXNjb3ZlcnkgdGltZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fZGlzY292ZXJ5X3RpbWUgPSBkaXNjb3ZlcnlfdGltZVxcblxcbiAgICBkaXNjb3ZlcnlfdGltZSA9IHByb3BlcnR5KGdldF9kaXNjb3ZlcnlfdGltZSwgc2V0X2Rpc2NvdmVyeV90aW1lKVxcblxcbiAgICBkZWYgZ2V0X2Nsb3NpbmdfdGltZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBjbG9zaW5nIHRpbWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jbG9zaW5nX3RpbWVcXG5cXG4gICAgZGVmIHNldF9jbG9zaW5nX3RpbWUoc2VsZiwgY2xvc2luZ190aW1lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBjbG9zaW5nIHRpbWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Nsb3NpbmdfdGltZSA9IGNsb3NpbmdfdGltZVxcblxcbiAgICBjbG9zaW5nX3RpbWUgPSBwcm9wZXJ0eShnZXRfY2xvc2luZ190aW1lLCBzZXRfY2xvc2luZ190aW1lKVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBcXFwiezpeOH18ezpeOH18ezpeOH18ezpeOH18ezpeOH18IHt9XFxcIi5mb3JtYXQoXFxuICAgICAgICAgICAgc2VsZi5fa2V5LFxcbiAgICAgICAgICAgIHNlbGYuX2NvbG9yLFxcbiAgICAgICAgICAgIHNlbGYuX2Rpc3RhbmNlLFxcbiAgICAgICAgICAgIHNlbGYuX2Rpc2NvdmVyeV90aW1lLFxcbiAgICAgICAgICAgIHNlbGYuX2Nsb3NpbmdfdGltZSxcXG4gICAgICAgICAgICBzZWxmLl9wcmV2aW91cyxcXG4gICAgICAgIClcXG5cXG5cXG5jbGFzcyBHcmFwaDpcXG4gICAgXFxcIlxcXCJcXFwiR3JhcGggYXMgYW4gYWRqYWNlbmN5IG1hdHJpeFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLl92ZXJ0aWNlcyA9IHt9XFxuICAgICAgICBzZWxmLl9lZGdlcyA9IHt9XFxuICAgICAgICBzZWxmLl90aW1lID0gMFxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJdGVyYXRvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fdmVydGljZXMudmFsdWVzKCkpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR3JhcGgncyBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3ZlcnRpY2VzKVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdyYXBoJ3Mgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl92ZXJ0aWNlcylcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiaW4gb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5fdmVydGljZXNcXG5cXG4gICAgZGVmIGdldF92ZXJ0ZXgoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZpbmQgdGhlIHZlcnRleCBpbiB0aGUgZ3JhcGggbmFtZWQgdmVydF9rZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl92ZXJ0aWNlcy5nZXQoa2V5LCBOb25lKVxcblxcbiAgICBkZWYgc2V0X3ZlcnRleChzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGluc3RhbmNlIG9mIFZlcnRleCB0byB0aGUgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3ZlcnRpY2VzW2tleV0gPSBWZXJ0ZXgoa2V5KVxcblxcbiAgICBkZWYgYWRkX2VkZ2Uoc2VsZiwgZnJvbV92ZXJ0ZXgsIHRvX3ZlcnRleCwgd2VpZ2h0PTApOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgd2VpZ2h0ZWQgYW5kIGRpcmVjdGVkIGVkZ2UgdG8gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBmcm9tX3ZlcnRleCBub3QgaW4gc2VsZi5fdmVydGljZXM6XFxuICAgICAgICAgICAgc2VsZi5zZXRfdmVydGV4KGZyb21fdmVydGV4KVxcbiAgICAgICAgaWYgdG9fdmVydGV4IG5vdCBpbiBzZWxmLl92ZXJ0aWNlczpcXG4gICAgICAgICAgICBzZWxmLnNldF92ZXJ0ZXgodG9fdmVydGV4KVxcbiAgICAgICAgc2VsZi5fdmVydGljZXNbZnJvbV92ZXJ0ZXhdLnNldF9uZWlnaGJvcihzZWxmLl92ZXJ0aWNlc1t0b192ZXJ0ZXhdLCB3ZWlnaHQpXFxuICAgICAgICBzZWxmLl9lZGdlc1soZnJvbV92ZXJ0ZXgsIHRvX3ZlcnRleCldID0gd2VpZ2h0XFxuXFxuICAgIGRlZiBnZXRfdmVydGljZXMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHZlcnRpY2VzIGluIHRoZSBncmFwaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnRpY2VzLmtleXMoKVxcblxcbiAgICBkZWYgZ2V0X2VkZ2VzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBlZGdlcyBpbiB0aGUgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9lZGdlcy5rZXlzKClcXG5cXG4gICAgZGVmIHJlc2V0X2Rpc3RhbmNlcyhzZWxmLCBkZWZhdWx0X2Rpc3RhbmNlPXN5cy5tYXhzaXplKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlc2V0IGRpc3RhbmNlcyB0byB0ZXN0IERpamtzdHJhJ3NcXFwiXFxcIlxcXCJcXG4gICAgICAgIGZvciB2ZXJ0ZXggaW4gc2VsZjpcXG4gICAgICAgICAgICB2ZXJ0ZXguZGlzdGFuY2UgPSBkZWZhdWx0X2Rpc3RhbmNlXFxuXFxuICAgIGRlZiBiZnMoc2VsZiwgc3RhcnQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQnJlYWR0aCBGaXJzdCBTZWFyY2hcXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgc3RhcnQucHJldmlvdXMgPSBOb25lXFxuICAgICAgICB2ZXJ0X3F1ZXVlID0gW3N0YXJ0XVxcbiAgICAgICAgd2hpbGUgdmVydF9xdWV1ZTpcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnQgPSB2ZXJ0X3F1ZXVlLnBvcCgwKVxcbiAgICAgICAgICAgIGZvciBuZWlnaCBpbiBjdXJyZW50X3ZlcnQuZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgICAgICBpZiBuZWlnaC5jb2xvciA9PSBcXFwid2hpdGVcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgbmVpZ2guY29sb3IgPSBcXFwiZ3JheVxcXCJcXG4gICAgICAgICAgICAgICAgICAgIG5laWdoLmRpc3RhbmNlID0gY3VycmVudF92ZXJ0LmRpc3RhbmNlICsgMVxcbiAgICAgICAgICAgICAgICAgICAgbmVpZ2gucHJldmlvdXMgPSBjdXJyZW50X3ZlcnRcXG4gICAgICAgICAgICAgICAgICAgIHZlcnRfcXVldWUuYXBwZW5kKG5laWdoKVxcbiAgICAgICAgICAgIGN1cnJlbnRfdmVydC5jb2xvciA9IFxcXCJibGFja1xcXCJcXG5cXG4gICAgZGVmIGRmcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkRlcHRoIEZpcnN0IHNlYXJjaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgZm9yIHZlcnRleCBpbiBzZWxmOlxcbiAgICAgICAgICAgIGlmIHZlcnRleC5jb2xvciA9PSBcXFwid2hpdGVcXFwiOlxcbiAgICAgICAgICAgICAgICBzZWxmLmRmc192aXNpdCh2ZXJ0ZXgpXFxuXFxuICAgIGRlZiBkZnNfdmlzaXQoc2VsZiwgc3RhcnQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiREZTIGhlbHBlciBmdW5jdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnQuY29sb3IgPSBcXFwiZ3JheVxcXCJcXG4gICAgICAgIHNlbGYuX3RpbWUgPSBzZWxmLl90aW1lICsgMVxcbiAgICAgICAgc3RhcnQuZGlzY292ZXJ5X3RpbWUgPSBzZWxmLl90aW1lXFxuICAgICAgICBmb3IgbmV4dF92ZXJ0ZXggaW4gc3RhcnQuZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgIGlmIG5leHRfdmVydGV4LmNvbG9yID09IFxcXCJ3aGl0ZVxcXCI6XFxuICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LnNldF9wcmV2aW91cyhzdGFydClcXG4gICAgICAgICAgICAgICAgc2VsZi5kZnNfdmlzaXQobmV4dF92ZXJ0ZXgpXFxuICAgICAgICBzdGFydC5jb2xvciA9IFxcXCJibGFja1xcXCJcXG4gICAgICAgIHNlbGYuX3RpbWUgPSBzZWxmLl90aW1lICsgMVxcbiAgICAgICAgc3RhcnQuY2xvc2luZ190aW1lID0gc2VsZi5fdGltZVxcblxcbiAgICBkZWYgdHJhdmVyc2Uoc2VsZiwgc3JjLCBkc3QpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVHJhdmVyc2UgYSBncmFwaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcGF0aCA9IFtdXFxuICAgICAgICBjdXJyZW50ID0gc2VsZi5nZXRfdmVydGV4KGRzdClcXG4gICAgICAgIHdoaWxlIGN1cnJlbnQ6XFxuICAgICAgICAgICAgcGF0aC5hcHBlbmQoY3VycmVudClcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wcmV2aW91c1xcbiAgICAgICAgcHJpbnQoXFxuICAgICAgICAgICAgXFxcIlBhdGggZnJvbSB7fSB0byB7fSAoe30pOiB7fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoc3JjKS5rZXksXFxuICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChkc3QpLmtleSxcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGRzdCkuZGlzdGFuY2UsXFxuICAgICAgICAgICAgICAgIFxcXCIgXFxcIi5qb2luKHZlcnRleC5rZXkgZm9yIHZlcnRleCBpbiByZXZlcnNlZChwYXRoKSksXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgKVxcblxcbiAgICBkZWYgZGlqa3N0cmEoc2VsZiwgc3RhcnQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRGlqa3N0cmEncyBzaG9ydGVzdCBwYXRoIGFsZ29yaXRobVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnQuZGlzdGFuY2UgPSAwXFxuICAgICAgICBub3RfeWV0X3Zpc2l0ZWQgPSBbW3N0YXJ0LmRpc3RhbmNlLCBzdGFydF1dXFxuICAgICAgICBoZWFwcS5oZWFwaWZ5KG5vdF95ZXRfdmlzaXRlZClcXG4gICAgICAgIHdoaWxlIG5vdF95ZXRfdmlzaXRlZDpcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnRleCA9IGhlYXBxLmhlYXBwb3Aobm90X3lldF92aXNpdGVkKVsxXVxcbiAgICAgICAgICAgIGZvciBuZXh0X3ZlcnRleCBpbiBjdXJyZW50X3ZlcnRleC5nZXRfbmVpZ2hib3JzKCk6XFxuICAgICAgICAgICAgICAgIG5ld19kaXN0YW5jZSA9IGN1cnJlbnRfdmVydGV4LmRpc3RhbmNlICsgY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9yKFxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXhcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgICAgICBpZiBuZXdfZGlzdGFuY2UgPCBuZXh0X3ZlcnRleC5kaXN0YW5jZTpcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LmRpc3RhbmNlID0gbmV3X2Rpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5wcmV2aW91cyA9IGN1cnJlbnRfdmVydGV4XFxuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlXFxuICAgICAgICAgICAgICAgICAgICBmb3IgdmVydGV4IGluIG5vdF95ZXRfdmlzaXRlZDpcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiB2ZXJ0ZXhbMV0ua2V5ID09IG5leHRfdmVydGV4LmtleTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4WzBdID0gbmV4dF92ZXJ0ZXguZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfeWV0X3Zpc2l0ZWQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZVxcbiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZvdW5kOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBxLmhlYXBwdXNoKFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RfeWV0X3Zpc2l0ZWQsIFtuZXh0X3ZlcnRleC5kaXN0YW5jZSwgbmV4dF92ZXJ0ZXhdXFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxcblxcbiAgICBkZWYgYmVsbG1hbl9mb3JkKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkJlbGxtYW4tRm9yZCBzaG9ydGVzdCBwYXRoIGFsZ29yaXRobVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnQuZGlzdGFuY2UgPSAwXFxuICAgICAgICBmb3IgXyBpbiByYW5nZShsZW4oc2VsZi5fdmVydGljZXMpKTpcXG4gICAgICAgICAgICBmb3IgZWRnZSBpbiBzZWxmLl9lZGdlczpcXG4gICAgICAgICAgICAgICAgaWYgKFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMF0pLmRpc3RhbmNlICsgc2VsZi5fZWRnZXNbZWRnZV1cXG4gICAgICAgICAgICAgICAgICAgIDwgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMV0pLmRpc3RhbmNlXFxuICAgICAgICAgICAgICAgICk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkuZGlzdGFuY2UgPSAoXFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMF0pLmRpc3RhbmNlICsgc2VsZi5fZWRnZXNbZWRnZV1cXG4gICAgICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzFdKS5wcmV2aW91cyA9IHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKVxcbiAgICAgICAgZm9yIGVkZ2UgaW4gc2VsZi5fZWRnZXM6XFxuICAgICAgICAgICAgaWYgKFxcbiAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZWRnZVswXSkuZGlzdGFuY2UgKyBzZWxmLl9lZGdlc1tlZGdlXVxcbiAgICAgICAgICAgICAgICA8IHNlbGYuZ2V0X3ZlcnRleChlZGdlWzFdKS5kaXN0YW5jZVxcbiAgICAgICAgICAgICk6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIkdyYXBoIGNvbnRhaW5zIGEgbmVnYXRpdmUtd2VpZ2h0IGN5Y2xlXFxcIilcXG5cXG4gICAgZGVmIHByaW0oc2VsZiwgc3RhcnQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJpbSdzIHNwYW5uaW5nIHRyZWUgYWxnb3JpdGhtXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydC5kaXN0YW5jZSA9IDBcXG4gICAgICAgIG5vdF9pbl9hX3RyZWUgPSBbW3ZlcnRleC5kaXN0YW5jZSwgdmVydGV4XSBmb3IgdmVydGV4IGluIHNlbGZdXFxuICAgICAgICBoZWFwcS5oZWFwaWZ5KG5vdF9pbl9hX3RyZWUpXFxuICAgICAgICB3aGlsZSBub3RfaW5fYV90cmVlOlxcbiAgICAgICAgICAgIGN1cnJlbnRfdmVydGV4ID0gaGVhcHEuaGVhcHBvcChub3RfaW5fYV90cmVlKVsxXVxcbiAgICAgICAgICAgIGZvciBuZXh0X3ZlcnRleCBpbiBjdXJyZW50X3ZlcnRleC5nZXRfbmVpZ2hib3JzKCk6XFxuICAgICAgICAgICAgICAgIG5ld19kaXN0YW5jZSA9IGN1cnJlbnRfdmVydGV4LmdldF9uZWlnaGJvcihuZXh0X3ZlcnRleClcXG4gICAgICAgICAgICAgICAgaWYgKFxcbiAgICAgICAgICAgICAgICAgICAgYW55KGl0ZW1bMV0gPT0gbmV4dF92ZXJ0ZXggZm9yIGl0ZW0gaW4gbm90X2luX2FfdHJlZSlcXG4gICAgICAgICAgICAgICAgICAgIGFuZCBuZXdfZGlzdGFuY2UgPCBuZXh0X3ZlcnRleC5kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXgucHJldmlvdXMgPSBjdXJyZW50X3ZlcnRleFxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXguZGlzdGFuY2UgPSBuZXdfZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG5vdF9pbl9hX3RyZWU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXRlbVsxXSA9PSBuZXh0X3ZlcnRleDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVswXSA9IG5ld19kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwcS5oZWFwaWZ5KG5vdF9pbl9hX3RyZWUpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9pbnRyby9fX2luaXRfXy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbnB5dGhvbmRzMy5pbnRybyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuaW50cm8ub29wIGltcG9ydCBGcmFjdGlvblxcblxcbl9fYWxsX18gPSBbXFxcIkZyYWN0aW9uXFxcIl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2ludHJvL29vcC5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5kZWYgZ2NkKG51bWJlcjEsIG51bWJlcjIpOlxcbiAgICBcXFwiXFxcIlxcXCJIZWxwZXIgZnVuY3Rpb24gdG8gc2ltcGxpZnkgZnJhY3Rpb25zXFxcIlxcXCJcXFwiXFxuICAgIGlmIG5vdCBpc2luc3RhbmNlKG51bWJlcjEsIGludCkgb3Igbm90IGlzaW5zdGFuY2UobnVtYmVyMiwgaW50KTpcXG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiTnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBtdXN0IGJlIGludGVnZXJzXFxcIilcXG4gICAgd2hpbGUgbnVtYmVyMSAlIG51bWJlcjI6XFxuICAgICAgICBudW1iZXIxLCBudW1iZXIyID0gbnVtYmVyMiwgbnVtYmVyMSAlIG51bWJlcjJcXG4gICAgcmV0dXJuIG51bWJlcjJcXG5cXG5cXG5jbGFzcyBGcmFjdGlvbjpcXG4gICAgXFxcIlxcXCJcXFwiRnJhY3Rpb24gY2xhc3NcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5ld19udW1lciwgbmV3X2Rlbm9tKTpcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBjb21tb24gPSBnY2QobmV3X251bWVyLCBuZXdfZGVub20pXFxuICAgICAgICBleGNlcHQgVHlwZUVycm9yOlxcbiAgICAgICAgICAgIHJhaXNlXFxuICAgICAgICBzZWxmLl9udW1lciA9IG5ld19udW1lciAvLyBjb21tb25cXG4gICAgICAgIHNlbGYuX2Rlbm9tID0gbmV3X2Rlbm9tIC8vIGNvbW1vblxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG51bWVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IG51bWVyYXRvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX251bWVyXFxuXFxuICAgIEBudW1lci5zZXR0ZXJcXG4gICAgZGVmIHNldF9udW1lcihzZWxmLCBuZXdfbnVtZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG51bWVyYXRvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fbnVtZXIgPSBuZXdfbnVtZXJcXG5cXG4gICAgZGVmIGdldF9kZW5vbShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBkZW5pbWluYXRvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2Rlbm9tXFxuXFxuICAgIGRlZiBzZXRfZGVub20oc2VsZiwgbmV3X2Rlbm9tKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBkZW5pbWluYXRvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fZGVub20gPSBuZXdfZGVub21cXG5cXG4gICAgIyBBbm90aGVyIHdheSB0byBjcmVhdGUgYW4gYXR0cmlidXRlXFxuICAgIGRlbm9tID0gcHJvcGVydHkoZ2V0X2Rlbm9tLCBzZXRfZGVub20pXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBzdHJpbmcgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX251bWVyID4gc2VsZi5fZGVub206XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ7fSB7fS97fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICBzZWxmLl9udW1lciAvLyBzZWxmLl9kZW5vbSwgc2VsZi5fbnVtZXIgJSBzZWxmLl9kZW5vbSwgc2VsZi5fZGVub21cXG4gICAgICAgICAgICApXFxuICAgICAgICByZXR1cm4gXFxcInt9L3t9XFxcIi5mb3JtYXQoc2VsZi5fbnVtZXIsIHNlbGYuX2Rlbm9tKVxcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGcmFjdGlvbiByZXByZXNlbnRhdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCJGcmFjdGlvbih7fSwge30pXFxcIi5mb3JtYXQoc2VsZi5fbnVtZXIsIHNlbGYuX2Rlbm9tKVxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkVxdWFsaXR5IGNvbXBhcmlzb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9udW1lciAqIG90aGVyLmRlbm9tID09IG90aGVyLm51bWVyICogc2VsZi5fZGVub21cXG5cXG4gICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIHR3byBmcmFjdGlvbnNcXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19udW1lciA9IHNlbGYuX251bWVyICogb3RoZXIuZGVub20gKyBzZWxmLl9kZW5vbSAqIG90aGVyLm51bWVyXFxuICAgICAgICBuZXdfZGVub20gPSBzZWxmLl9kZW5vbSAqIG90aGVyLmRlbm9tXFxuICAgICAgICByZXR1cm4gRnJhY3Rpb24obmV3X251bWVyLCBuZXdfZGVub20pXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zZWFyY2hpbmcvX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuc2VhcmNoIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy5zZWFyY2hpbmcuaGFzaF90YWJsZSBpbXBvcnQgSGFzaFRhYmxlXFxuXFxuX19hbGxfXyA9IFtcXFwiSGFzaFRhYmxlXFxcIl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3NlYXJjaGluZy9oYXNoX3RhYmxlLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIEhhc2hUYWJsZTpcXG4gICAgXFxcIlxcXCJcXFwiSGFzaCBUYWJsZSBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZT0xNik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBoYXNoIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9zaXplID0gc2l6ZVxcbiAgICAgICAgc2VsZi5fc2xvdHMgPSBbTm9uZV0gKiBzZWxmLl9zaXplXFxuICAgICAgICBzZWxmLl9kYXRhID0gW05vbmVdICogc2VsZi5fc2l6ZVxcblxcbiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2ljIF9fZ2V0X19cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLmdldChrZXkpXFxuXFxuICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIGRhdGEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTWFnaWMgX19zZXRfX1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5wdXQoa2V5LCBkYXRhKVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2ljIF9fbGVuX19cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplIC0gc2VsZi5fc2xvdHMuY291bnQoTm9uZSlcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTWFnaW4gaW5cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5fc2xvdHNcXG5cXG4gICAgZGVmIF9oYXNoX2Z1bmN0aW9uKHNlbGYsIGtleSwgc2l6ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTaW1wbGUgaGFzaCBmdW5jdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGtleSAlIHNpemVcXG5cXG4gICAgZGVmIF9yZWhhc2goc2VsZiwgb2xkX2hhc2gsIHNpemUsIHN0ZXA9MSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTaW1wbGUgcmVoYXNoIGZ1bmN0aW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gKG9sZF9oYXNoICsgc3RlcCkgJSBzaXplXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSB0YWJsZSBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NpemUgPT0gc2VsZi5fc2xvdHMuY291bnQoTm9uZSlcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSB0YWJsZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NpemUgLSBzZWxmLl9zbG90cy5jb3VudChOb25lKVxcblxcbiAgICBkZWYgcHV0KHNlbGYsIGtleSwgZGF0YSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYW4gaXRlbSB0byB0aGUgdGFibGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGhhc2hfdmFsdWUgPSBzZWxmLl9oYXNoX2Z1bmN0aW9uKGtleSwgbGVuKHNlbGYuX3Nsb3RzKSlcXG5cXG4gICAgICAgIGlmIHNlbGYuX3Nsb3RzW2hhc2hfdmFsdWVdIGlzIE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5fc2xvdHNbaGFzaF92YWx1ZV0gPSBrZXlcXG4gICAgICAgICAgICBzZWxmLl9kYXRhW2hhc2hfdmFsdWVdID0gZGF0YVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9zbG90c1toYXNoX3ZhbHVlXSA9PSBrZXk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFbaGFzaF92YWx1ZV0gPSBkYXRhICAjIHJlcGxhY2VcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBqID0gMFxcbiAgICAgICAgICAgICAgICBuZXh0X3Nsb3QgPSBzZWxmLl9yZWhhc2goaGFzaF92YWx1ZSwgbGVuKHNlbGYuX3Nsb3RzKSwgailcXG4gICAgICAgICAgICAgICAgd2hpbGUgKFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2xvdHNbbmV4dF9zbG90XSBpcyBub3QgTm9uZVxcbiAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGYuX3Nsb3RzW25leHRfc2xvdF0gIT0ga2V5XFxuICAgICAgICAgICAgICAgICAgICBhbmQgaiA8IHNlbGYuX3NpemVcXG4gICAgICAgICAgICAgICAgKTpcXG4gICAgICAgICAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF9zbG90ID0gc2VsZi5fcmVoYXNoKGhhc2hfdmFsdWUsIGxlbihzZWxmLl9zbG90cyksIGopXFxuXFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuX3Nsb3RzW25leHRfc2xvdF0gaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3Nsb3RzW25leHRfc2xvdF0gPSBrZXlcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFbbmV4dF9zbG90XSA9IGRhdGFcXG4gICAgICAgICAgICAgICAgZWxpZiBqID09IHNlbGYuX3NpemU6XFxuICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oXFxcIkhhc2ggVGFibGUgaXMgZnVsbFxcXCIpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW25leHRfc2xvdF0gPSBkYXRhICAjIHJlcGxhY2VcXG5cXG4gICAgZGVmIGdldChzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGFuIGl0ZW0gZnJvbSB0aGUgdGFibGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0X3Nsb3QgPSBzZWxmLl9oYXNoX2Z1bmN0aW9uKGtleSwgbGVuKHNlbGYuX3Nsb3RzKSlcXG4gICAgICAgIHBvc2l0aW9uID0gc3RhcnRfc2xvdFxcbiAgICAgICAgaiA9IDBcXG5cXG4gICAgICAgIHdoaWxlIHNlbGYuX3Nsb3RzW3Bvc2l0aW9uXSBpcyBub3QgTm9uZSBhbmQgaiA8IHNlbGYuX3NpemU6XFxuICAgICAgICAgICAgaWYgc2VsZi5fc2xvdHNbcG9zaXRpb25dID09IGtleTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGFbcG9zaXRpb25dXFxuICAgICAgICAgICAgaiA9IGogKyAxXFxuICAgICAgICAgICAgcG9zaXRpb24gPSBzZWxmLl9yZWhhc2goc3RhcnRfc2xvdCwgbGVuKHNlbGYuX3Nsb3RzKSwgailcXG5cXG4gICAgICAgIHJhaXNlIEtleUVycm9yKFxcXCJ7fSBpcyBub3QgaW4gdGhlIHRhYmxlXFxcIi5mb3JtYXQoa2V5KSlcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3NvcnRpbmcvX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuc29ydGluZyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IGJ1YmJsZV9zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IHNlbGVjdF9zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IGluc2VydF9zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IHNoZWxsX3NvcnRcXG5mcm9tIHB5dGhvbmRzMy5zb3J0aW5nLnNvcnRpbmdfYWxnb3JpdGhtcyBpbXBvcnQgbWVyZ2Vfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBxdWlja19zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IGhlYXBfc29ydFxcblwiLFwic3JjL2xpYi9weXRob25kczMvc29ydGluZy9zb3J0aW5nX2FsZ29yaXRobXMucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IGhlYXBxXFxuXFxuXFxuZGVmIGJ1YmJsZV9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIkJ1YmJsZSBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIGZvciBpIGluIHJhbmdlKGxlbihsc3QpIC0gMSwgMCwgLTEpOlxcbiAgICAgICAgZXhjaGFuZ2VzID0gRmFsc2VcXG4gICAgICAgIGZvciBqIGluIHJhbmdlKGkpOlxcbiAgICAgICAgICAgIGlmIGxzdFtqXSA+IGxzdFtqICsgMV06XFxuICAgICAgICAgICAgICAgIGV4Y2hhbmdlcyA9IFRydWVcXG4gICAgICAgICAgICAgICAgbHN0W2pdLCBsc3RbaiArIDFdID0gbHN0W2ogKyAxXSwgbHN0W2pdXFxuICAgICAgICBpZiBub3QgZXhjaGFuZ2VzOlxcbiAgICAgICAgICAgIGJyZWFrXFxuXFxuXFxuZGVmIHNlbGVjdF9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIlNlbGVjdGlvbiBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIGZvciBpLCBpdGVtIGluIGVudW1lcmF0ZShsc3QpOlxcbiAgICAgICAgbWluX2lkeCA9IGxlbihsc3QpIC0gMVxcbiAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSwgbGVuKGxzdCkpOlxcbiAgICAgICAgICAgIGlmIGxzdFtqXSA8IGxzdFttaW5faWR4XTpcXG4gICAgICAgICAgICAgICAgbWluX2lkeCA9IGpcXG4gICAgICAgIGlmIG1pbl9pZHggIT0gaTpcXG4gICAgICAgICAgICBsc3RbbWluX2lkeF0sIGxzdFtpXSA9IGxzdFtpXSwgbHN0W21pbl9pZHhdXFxuXFxuXFxuZGVmIGluc2VydF9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIkluc2VydGlvbiBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihsc3QpKTpcXG4gICAgICAgIGN1cl92YWwgPSBsc3RbaV1cXG4gICAgICAgIGN1cl9wb3MgPSBpXFxuXFxuICAgICAgICB3aGlsZSBjdXJfcG9zID4gMCBhbmQgbHN0W2N1cl9wb3MgLSAxXSA+IGN1cl92YWw6XFxuICAgICAgICAgICAgbHN0W2N1cl9wb3NdID0gbHN0W2N1cl9wb3MgLSAxXVxcbiAgICAgICAgICAgIGN1cl9wb3MgPSBjdXJfcG9zIC0gMVxcbiAgICAgICAgbHN0W2N1cl9wb3NdID0gY3VyX3ZhbFxcblxcblxcbmRlZiBzaGVsbF9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIlNoZWxsIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgc3VibGlzdF9jb3VudCA9IGxlbihsc3QpIC8vIDNcXG4gICAgd2hpbGUgc3VibGlzdF9jb3VudCA+IDA6XFxuICAgICAgICBmb3IgcG9zX3N0YXJ0IGluIHJhbmdlKHN1Ymxpc3RfY291bnQpOlxcbiAgICAgICAgICAgIF9nYXBfaW5zZXJ0X3NvcnQobHN0LCBwb3Nfc3RhcnQsIHN1Ymxpc3RfY291bnQpXFxuICAgICAgICBzdWJsaXN0X2NvdW50ID0gc3VibGlzdF9jb3VudCAvLyAyXFxuXFxuXFxuZGVmIF9nYXBfaW5zZXJ0X3NvcnQobHN0LCBzdGFydCwgZ2FwKTpcXG4gICAgXFxcIlxcXCJcXFwiU2hlbGwgc29ydCBoZWxwZXIgZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgZm9yIGkgaW4gcmFuZ2Uoc3RhcnQgKyBnYXAsIGxlbihsc3QpLCBnYXApOlxcbiAgICAgICAgY3VyX3ZhbCA9IGxzdFtpXVxcbiAgICAgICAgY3VyX3BvcyA9IGlcXG4gICAgICAgIHdoaWxlIGN1cl9wb3MgPj0gZ2FwIGFuZCBsc3RbY3VyX3BvcyAtIGdhcF0gPiBjdXJfdmFsOlxcbiAgICAgICAgICAgIGxzdFtjdXJfcG9zXSA9IGxzdFtjdXJfcG9zIC0gZ2FwXVxcbiAgICAgICAgICAgIGN1cl9wb3MgPSBjdXJfcG9zIC0gZ2FwXFxuICAgICAgICBsc3RbY3VyX3Bvc10gPSBjdXJfdmFsXFxuXFxuXFxuZGVmIG1lcmdlX3NvcnQobHN0KTpcXG4gICAgXFxcIlxcXCJcXFwiTWVyZ2Ugc29ydFxcXCJcXFwiXFxcIlxcbiAgICBpZiBsZW4obHN0KSA+IDE6XFxuICAgICAgICBtaWQgPSBsZW4obHN0KSAvLyAyXFxuICAgICAgICBsZWZ0X2hhbGYgPSBsc3RbOm1pZF1cXG4gICAgICAgIHJpZ2h0X2hhbGYgPSBsc3RbbWlkOl1cXG5cXG4gICAgICAgIG1lcmdlX3NvcnQobGVmdF9oYWxmKVxcbiAgICAgICAgbWVyZ2Vfc29ydChyaWdodF9oYWxmKVxcblxcbiAgICAgICAgaSwgaiwgayA9IDAsIDAsIDBcXG4gICAgICAgIHdoaWxlIGkgPCBsZW4obGVmdF9oYWxmKSBhbmQgaiA8IGxlbihyaWdodF9oYWxmKTpcXG4gICAgICAgICAgICBpZiBsZWZ0X2hhbGZbaV0gPD0gcmlnaHRfaGFsZltqXTpcXG4gICAgICAgICAgICAgICAgbHN0W2tdID0gbGVmdF9oYWxmW2ldXFxuICAgICAgICAgICAgICAgIGkgPSBpICsgMVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGxzdFtrXSA9IHJpZ2h0X2hhbGZbal1cXG4gICAgICAgICAgICAgICAgaiA9IGogKyAxXFxuICAgICAgICAgICAgayA9IGsgKyAxXFxuXFxuICAgICAgICB3aGlsZSBpIDwgbGVuKGxlZnRfaGFsZik6XFxuICAgICAgICAgICAgbHN0W2tdID0gbGVmdF9oYWxmW2ldXFxuICAgICAgICAgICAgaSA9IGkgKyAxXFxuICAgICAgICAgICAgayA9IGsgKyAxXFxuXFxuICAgICAgICB3aGlsZSBqIDwgbGVuKHJpZ2h0X2hhbGYpOlxcbiAgICAgICAgICAgIGxzdFtrXSA9IHJpZ2h0X2hhbGZbal1cXG4gICAgICAgICAgICBqID0gaiArIDFcXG4gICAgICAgICAgICBrID0gayArIDFcXG5cXG5cXG5kZWYgcXVpY2tfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJRdWljayBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIF9xdWlja19zb3J0X2hlbHAobHN0LCAwLCBsZW4obHN0KSAtIDEpXFxuXFxuXFxuZGVmIF9xdWlja19zb3J0X2hlbHAobHN0LCBtYXJrX2wsIG1hcmtfcik6XFxuICAgIFxcXCJcXFwiXFxcIlF1aWNrIHNvcnQgaGVscGVyXFxcIlxcXCJcXFwiXFxuICAgIGlmIG1hcmtfbCA8IG1hcmtfcjpcXG4gICAgICAgIHNwbGl0ID0gX3F1aWNrX3NvcnRfcGFydChsc3QsIG1hcmtfbCwgbWFya19yKVxcbiAgICAgICAgX3F1aWNrX3NvcnRfaGVscChsc3QsIG1hcmtfbCwgc3BsaXQgLSAxKVxcbiAgICAgICAgX3F1aWNrX3NvcnRfaGVscChsc3QsIHNwbGl0ICsgMSwgbWFya19yKVxcblxcblxcbmRlZiBfcXVpY2tfc29ydF9wYXJ0KGxzdCwgbWFya19sLCBtYXJrX3IpOlxcbiAgICBcXFwiXFxcIlxcXCJRdWljayBzb3J0IHBhcnRpdGlvblxcXCJcXFwiXFxcIlxcbiAgICBwaXZvdF92YWwgPSBsc3RbbWFya19sXVxcbiAgICBtYXJrX2xfY3VyID0gbWFya19sICsgMVxcbiAgICBtYXJrX3JfY3VyID0gbWFya19yXFxuICAgIGRvbmUgPSBGYWxzZVxcblxcbiAgICB3aGlsZSBub3QgZG9uZTpcXG4gICAgICAgIHdoaWxlIG1hcmtfbF9jdXIgPD0gbWFya19yX2N1ciBhbmQgbHN0W21hcmtfbF9jdXJdIDw9IHBpdm90X3ZhbDpcXG4gICAgICAgICAgICBtYXJrX2xfY3VyID0gbWFya19sX2N1ciArIDFcXG4gICAgICAgIHdoaWxlIG1hcmtfbF9jdXIgPD0gbWFya19yX2N1ciBhbmQgbHN0W21hcmtfcl9jdXJdID49IHBpdm90X3ZhbDpcXG4gICAgICAgICAgICBtYXJrX3JfY3VyID0gbWFya19yX2N1ciAtIDFcXG4gICAgICAgIGlmIG1hcmtfcl9jdXIgPCBtYXJrX2xfY3VyOlxcbiAgICAgICAgICAgIGRvbmUgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGxzdFttYXJrX2xfY3VyXSwgbHN0W21hcmtfcl9jdXJdID0gbHN0W21hcmtfcl9jdXJdLCBsc3RbbWFya19sX2N1cl1cXG4gICAgbHN0W21hcmtfbF0sIGxzdFttYXJrX3JfY3VyXSA9IGxzdFttYXJrX3JfY3VyXSwgbHN0W21hcmtfbF1cXG5cXG4gICAgcmV0dXJuIG1hcmtfcl9jdXJcXG5cXG5cXG5kZWYgaGVhcF9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIkhlYXAgc29ydFxcXCJcXFwiXFxcIlxcbiAgICByZXMgPSBbXVxcbiAgICBoZWFwcS5oZWFwaWZ5KGxzdClcXG4gICAgd2hpbGUgbHN0OlxcbiAgICAgICAgcmVzLmFwcGVuZChoZWFwcS5oZWFwcG9wKGxzdCkpXFxuICAgIGZvciBpIGluIHJlczpcXG4gICAgICAgIGxzdC5hcHBlbmQoaSlcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3RyZWVzL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLnRyZWVzIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5hdmxfdHJlZSBpbXBvcnQgQVZMVHJlZVxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV9zZWFyY2hfdHJlZSBpbXBvcnQgQmluYXJ5U2VhcmNoVHJlZVxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV9oZWFwIGltcG9ydCBCaW5hcnlIZWFwXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3RyZWUgaW1wb3J0IEJpbmFyeVRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5wcmlvcml0eV9xdWV1ZSBpbXBvcnQgUHJpb3JpdHlRdWV1ZVxcblxcbl9fYWxsX18gPSBbXFxcIkJpbmFyeVRyZWVcXFwiLCBcXFwiQmluYXJ5SGVhcFxcXCIsIFxcXCJCaW5hcnlTZWFyY2hUcmVlXFxcIiwgXFxcIkFWTFRyZWVcXFwiLCBcXFwiUHJpb3JpdHlRdWV1ZVxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9hdmxfdHJlZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNSwgMjAxMFxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfc2VhcmNoX3RyZWUgaW1wb3J0IEJpbmFyeVNlYXJjaFRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfc2VhcmNoX3RyZWUgaW1wb3J0IEJpbmFyeVRyZWVOb2RlXFxuXFxuXFxuY2xhc3MgQVZMVHJlZU5vZGUoQmluYXJ5VHJlZU5vZGUpOlxcbiAgICBcXFwiXFxcIlxcXCJBVkwgVHJlZSBOb2RlXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXksIHZhbCwgYmFsYW5jZV9mYWN0b3IsIGxlZnQ9Tm9uZSwgcmlnaHQ9Tm9uZSwgcGFyZW50PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGFuIEFWTCB0cmVlIG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIEJpbmFyeVRyZWVOb2RlLl9faW5pdF9fKHNlbGYsIGtleSwgdmFsLCBsZWZ0LCByaWdodCwgcGFyZW50KVxcbiAgICAgICAgc2VsZi5fYmFsYW5jZV9mYWN0b3IgPSBiYWxhbmNlX2ZhY3RvclxcblxcbiAgICBkZWYgZ2V0X2JhbGFuY2VfZmFjdG9yKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBub2RlIGJhbGFuY2UgZmFjdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fYmFsYW5jZV9mYWN0b3JcXG5cXG4gICAgZGVmIHNldF9iYWxhbmNlX2ZhY3RvcihzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIG5vZGUgYmFsYW5jZSBmYWN0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2JhbGFuY2VfZmFjdG9yID0gdmFsdWVcXG5cXG4gICAgYmFsYW5jZV9mYWN0b3IgPSBwcm9wZXJ0eShnZXRfYmFsYW5jZV9mYWN0b3IsIHNldF9iYWxhbmNlX2ZhY3RvcilcXG5cXG5cXG5jbGFzcyBBVkxUcmVlKEJpbmFyeVNlYXJjaFRyZWUpOlxcbiAgICBcXFwiXFxcIlxcXCJBVkwgdHJlZSBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBuZXcgQVZMIHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIEJpbmFyeVNlYXJjaFRyZWUuX19pbml0X18oc2VsZilcXG5cXG4gICAgZGVmIHB1dChzZWxmLCBrZXksIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBuZXcgbm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fcm9vdDpcXG4gICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgc2VsZi5fcm9vdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5fcm9vdCA9IEFWTFRyZWVOb2RlKGtleSwgdmFsdWUsIDApXFxuICAgICAgICBzZWxmLl9zaXplID0gc2VsZi5fc2l6ZSArIDFcXG5cXG4gICAgZGVmIF9wdXQoc2VsZiwga2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlIHRvIHRoZSB0cmVlIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBrZXkgPCBjdXJyZW50X25vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5nZXRfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQgPSBBVkxUcmVlTm9kZShcXG4gICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIDAsIHBhcmVudD1jdXJyZW50X25vZGVcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9iYWxhbmNlKGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuZ2V0X2NoaWxkX3JpZ2h0KCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0ID0gQVZMVHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCAwLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYmFsYW5jZShjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiB1cGRhdGVfYmFsYW5jZShzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlVwZGF0ZSB0aGUgdHJlZSBiYWxhbmNlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBub2RlLmJhbGFuY2VfZmFjdG9yID4gMSBvciBub2RlLmJhbGFuY2VfZmFjdG9yIDwgLTE6XFxuICAgICAgICAgICAgc2VsZi5yZWJhbGFuY2Uobm9kZSlcXG4gICAgICAgICAgICByZXR1cm5cXG4gICAgICAgIGlmIG5vZGUucGFyZW50OlxcbiAgICAgICAgICAgIGlmIG5vZGUuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlX2ZhY3RvciArPSAxXFxuICAgICAgICAgICAgZWxpZiBub2RlLmlzX2NoaWxkX3JpZ2h0KCk6XFxuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LmJhbGFuY2VfZmFjdG9yIC09IDFcXG5cXG4gICAgICAgICAgICBpZiBub2RlLnBhcmVudC5iYWxhbmNlX2ZhY3RvciAhPSAwOlxcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9iYWxhbmNlKG5vZGUucGFyZW50KVxcblxcbiAgICBkZWYgcmViYWxhbmNlKHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmViYWxhbmNlIHRoZSB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBub2RlLmJhbGFuY2VfZmFjdG9yIDwgMDpcXG4gICAgICAgICAgICBpZiBub2RlLmNoaWxkX3JpZ2h0LmJhbGFuY2VfZmFjdG9yID4gMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBMUiBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9yaWdodChub2RlLmNoaWxkX3JpZ2h0KVxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9sZWZ0KG5vZGUpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgIyBzaW5nbGUgbGVmdFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9sZWZ0KG5vZGUpXFxuICAgICAgICBlbGlmIG5vZGUuYmFsYW5jZV9mYWN0b3IgPiAwOlxcbiAgICAgICAgICAgIGlmIG5vZGUuY2hpbGRfbGVmdC5iYWxhbmNlX2ZhY3RvciA8IDA6XFxuICAgICAgICAgICAgICAgICMgRG8gYW4gUkwgUm90YXRpb25cXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfbGVmdChub2RlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX3JpZ2h0KG5vZGUpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgIyBzaW5nbGUgcmlnaHRcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfcmlnaHQobm9kZSlcXG5cXG4gICAgZGVmIHJvdGF0ZV9sZWZ0KHNlbGYsIHJvdGF0aW9uX3Jvb3QpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTGVmdCByb3RhdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgbmV3X3Jvb3QgPSByb3RhdGlvbl9yb290LmNoaWxkX3JpZ2h0XFxuICAgICAgICByb3RhdGlvbl9yb290LmNoaWxkX3JpZ2h0ID0gbmV3X3Jvb3QuY2hpbGRfbGVmdFxcbiAgICAgICAgaWYgbmV3X3Jvb3QuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBuZXdfcm9vdC5jaGlsZF9sZWZ0LnBhcmVudCA9IHJvdGF0aW9uX3Jvb3RcXG4gICAgICAgIG5ld19yb290LnBhcmVudCA9IHJvdGF0aW9uX3Jvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RhdGlvbl9yb290LmlzX3Jvb3QoKTpcXG4gICAgICAgICAgICBzZWxmLl9yb290ID0gbmV3X3Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90YXRpb25fcm9vdC5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50LmNoaWxkX2xlZnQgPSBuZXdfcm9vdFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50LmNoaWxkX3JpZ2h0ID0gbmV3X3Jvb3RcXG4gICAgICAgIG5ld19yb290LmNoaWxkX2xlZnQgPSByb3RhdGlvbl9yb290XFxuICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudCA9IG5ld19yb290XFxuICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QuYmFsYW5jZV9mYWN0b3IgKyAxIC0gbWluKG5ld19yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcbiAgICAgICAgbmV3X3Jvb3QuYmFsYW5jZV9mYWN0b3IgPSAoXFxuICAgICAgICAgICAgbmV3X3Jvb3QuYmFsYW5jZV9mYWN0b3IgKyAxICsgbWF4KHJvdGF0aW9uX3Jvb3QuYmFsYW5jZV9mYWN0b3IsIDApXFxuICAgICAgICApXFxuXFxuICAgIGRlZiByb3RhdGVfcmlnaHQoc2VsZiwgcm90YXRpb25fcm9vdCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSaWdodCByb3RhdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgbmV3X3Jvb3QgPSByb3RhdGlvbl9yb290LmNoaWxkX2xlZnRcXG4gICAgICAgIHJvdGF0aW9uX3Jvb3QuY2hpbGRfbGVmdCA9IG5ld19yb290LmNoaWxkX3JpZ2h0XFxuICAgICAgICBpZiBuZXdfcm9vdC5jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBuZXdfcm9vdC5jaGlsZF9yaWdodC5wYXJlbnQgPSByb3RhdGlvbl9yb290XFxuICAgICAgICBuZXdfcm9vdC5wYXJlbnQgPSByb3RhdGlvbl9yb290LnBhcmVudFxcbiAgICAgICAgaWYgcm90YXRpb25fcm9vdC5pc19yb290KCk6XFxuICAgICAgICAgICAgc2VsZi5fcm9vdCA9IG5ld19yb290XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfY2hpbGRfcmlnaHQoKTpcXG4gICAgICAgICAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQuY2hpbGRfcmlnaHQgPSBuZXdfcm9vdFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50LmNoaWxkX2xlZnQgPSBuZXdfcm9vdFxcbiAgICAgICAgbmV3X3Jvb3QuY2hpbGRfcmlnaHQgPSByb3RhdGlvbl9yb290XFxuICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudCA9IG5ld19yb290XFxuICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QuYmFsYW5jZV9mYWN0b3IgLSAxIC0gbWF4KG5ld19yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcbiAgICAgICAgbmV3X3Jvb3QuYmFsYW5jZV9mYWN0b3IgPSAoXFxuICAgICAgICAgICAgbmV3X3Jvb3QuYmFsYW5jZV9mYWN0b3IgLSAxICsgbWluKHJvdGF0aW9uX3Jvb3QuYmFsYW5jZV9mYWN0b3IsIDApXFxuICAgICAgICApXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9iaW5hcnlfaGVhcC5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBCaW5hcnlIZWFwOlxcbiAgICBcXFwiXFxcIlxcXCJNaW5pbWFsIEJpbmFyeSBIZWFwXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhIGhlYXBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXAgPSBbXVxcblxcbiAgICBkZWYgX3BlcmNfdXAoc2VsZiwgY3VyX2lkeCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNb3ZlIGEgbm9kZSB1cFxcXCJcXFwiXFxcIlxcbiAgICAgICAgd2hpbGUgKGN1cl9pZHggLSAxKSAvLyAyID49IDA6XFxuICAgICAgICAgICAgcGFyZW50X2lkeCA9IChjdXJfaWR4IC0gMSkgLy8gMlxcbiAgICAgICAgICAgIGlmIHNlbGYuX2hlYXBbY3VyX2lkeF0gPCBzZWxmLl9oZWFwW3BhcmVudF9pZHhdOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLCBzZWxmLl9oZWFwW3BhcmVudF9pZHhdID0gKFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGVhcFtwYXJlbnRfaWR4XSxcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbY3VyX2lkeF0sXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICBjdXJfaWR4ID0gcGFyZW50X2lkeFxcblxcbiAgICBkZWYgX3BlcmNfZG93bihzZWxmLCBjdXJfaWR4KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1vdmUgYSBub2RlIGRvd25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHdoaWxlIDIgKiBjdXJfaWR4ICsgMSA8IGxlbihzZWxmLl9oZWFwKTpcXG4gICAgICAgICAgICBtaW5fY2hpbGRfaWR4ID0gc2VsZi5fZ2V0X21pbl9jaGlsZChjdXJfaWR4KVxcbiAgICAgICAgICAgIGlmIHNlbGYuX2hlYXBbY3VyX2lkeF0gPiBzZWxmLl9oZWFwW21pbl9jaGlsZF9pZHhdOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLCBzZWxmLl9oZWFwW21pbl9jaGlsZF9pZHhdID0gKFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGVhcFttaW5fY2hpbGRfaWR4XSxcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbY3VyX2lkeF0sXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm5cXG4gICAgICAgICAgICBjdXJfaWR4ID0gbWluX2NoaWxkX2lkeFxcblxcbiAgICBkZWYgX2dldF9taW5fY2hpbGQoc2VsZiwgcGFyZW50X2lkeCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgYSBzbWFsbGVyIGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiAyICogcGFyZW50X2lkeCArIDIgPiBsZW4oc2VsZi5faGVhcCkgLSAxOlxcbiAgICAgICAgICAgIHJldHVybiAyICogcGFyZW50X2lkeCArIDFcXG4gICAgICAgIGlmIHNlbGYuX2hlYXBbMiAqIHBhcmVudF9pZHggKyAxXSA8IHNlbGYuX2hlYXBbMiAqIHBhcmVudF9pZHggKyAyXTpcXG4gICAgICAgICAgICByZXR1cm4gMiAqIHBhcmVudF9pZHggKyAxXFxuICAgICAgICByZXR1cm4gMiAqIHBhcmVudF9pZHggKyAyXFxuXFxuICAgIGRlZiBoZWFwaWZ5KHNlbGYsIG5vdF9hX2hlYXAsIHNob3dfZGV0YWlscz1GYWxzZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJCdWlsZCBhIGhlYXAgZnJvbSBhbnkgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhcCA9IG5vdF9hX2hlYXBbOl1cXG4gICAgICAgIGN1cl9pZHggPSBsZW4oc2VsZi5faGVhcCkgLy8gMiAtIDFcXG4gICAgICAgIHdoaWxlIGN1cl9pZHggPj0gMDpcXG4gICAgICAgICAgICBzZWxmLl9wZXJjX2Rvd24oY3VyX2lkeClcXG4gICAgICAgICAgICBjdXJfaWR4ID0gY3VyX2lkeCAtIDFcXG4gICAgICAgICAgICBpZiBzaG93X2RldGFpbHM6XFxuICAgICAgICAgICAgICAgIHByaW50KHNlbGYuX2hlYXApXFxuXFxuICAgIGRlZiBpbnNlcnQoc2VsZiwgaXRlbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYSBuZXcgaXRlbVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhcC5hcHBlbmQoaXRlbSlcXG4gICAgICAgIHNlbGYuX3BlcmNfdXAobGVuKHNlbGYuX2hlYXApIC0gMSlcXG5cXG4gICAgZGVmIGRlbGV0ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbiBpdGVtXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9oZWFwWzBdLCBzZWxmLl9oZWFwWy0xXSA9IHNlbGYuX2hlYXBbLTFdLCBzZWxmLl9oZWFwWzBdXFxuICAgICAgICByZXN1bHQgPSBzZWxmLl9oZWFwLnBvcCgpXFxuICAgICAgICBzZWxmLl9wZXJjX2Rvd24oMClcXG4gICAgICAgIHJldHVybiByZXN1bHRcXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIGhlYXAgaXMgZW1wdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBub3QgYm9vbChzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBoZWFwIHNpemVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5faGVhcClcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJIZWFwIGFzIGEgc3RyaW5nXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYuX2hlYXApXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfX2NvbnRhaW5zX19pbiBtZXRob2Qgb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBpdGVtIGluIHNlbGYuX2hlYXBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3RyZWVzL2JpbmFyeV9zZWFyY2hfdHJlZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNSwgMjAxMFxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBCaW5hcnlUcmVlTm9kZTpcXG4gICAgXFxcIlxcXCJcXFwiQmluYXJ5IFRyZWUgTm9kZSBjbGFzc1xcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5LCB2YWx1ZSwgbGVmdD1Ob25lLCByaWdodD1Ob25lLCBwYXJlbnQ9Tm9uZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IFRyZWUgTm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbGVmdFxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSByaWdodFxcbiAgICAgICAgc2VsZi5fcGFyZW50ID0gcGFyZW50XFxuXFxuICAgIGRlZiBnZXRfY2hpbGRfbGVmdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbm9kZSdzIGxlZnQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9sZWZ0XFxuXFxuICAgIGRlZiBzZXRfY2hpbGRfbGVmdChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFzc2lnbiB0aGUgbm9kZSdzIGxlZnQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBub2RlXFxuXFxuICAgIGNoaWxkX2xlZnQgPSBwcm9wZXJ0eShnZXRfY2hpbGRfbGVmdCwgc2V0X2NoaWxkX2xlZnQpXFxuXFxuICAgIGRlZiBnZXRfY2hpbGRfcmlnaHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIG5vZGUncyByaWdodCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkX3JpZ2h0XFxuXFxuICAgIGRlZiBzZXRfY2hpbGRfcmlnaHQoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBc3NpZ24gdGhlIG5vZGUncyByaWdodCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSBub2RlXFxuXFxuICAgIGNoaWxkX3JpZ2h0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX3JpZ2h0LCBzZXRfY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBnZXRfcGFyZW50KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBub2RlJ3MgcGFyZW50XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fcGFyZW50XFxuXFxuICAgIGRlZiBzZXRfcGFyZW50KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQXNzaWduIHRoZSBub2RlJ3MgcGFyZW50XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9wYXJlbnQgPSBub2RlXFxuXFxuICAgIHBhcmVudCA9IHByb3BlcnR5KGdldF9wYXJlbnQsIHNldF9wYXJlbnQpXFxuXFxuICAgIGRlZiBpc19jaGlsZF9sZWZ0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaXMgYSBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9wYXJlbnQuY2hpbGRfbGVmdCA9PSBzZWxmXFxuXFxuICAgIGRlZiBpc19jaGlsZF9yaWdodChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9PSBzZWxmXFxuXFxuICAgIGRlZiBpc19yb290KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaXMgYSB0cmVlIHJvb3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBub3Qgc2VsZi5fcGFyZW50XFxuXFxuICAgIGRlZiBpc19sZWFmKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaXMgYSBsZWFmXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IChzZWxmLl9jaGlsZF9yaWdodCBvciBzZWxmLl9jaGlsZF9sZWZ0KVxcblxcbiAgICBkZWYgaGFzX2FfY2hpbGQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgbm9kZSBoYXMgYW55IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHQgb3Igc2VsZi5fY2hpbGRfbGVmdFxcblxcbiAgICBkZWYgaGFzX2NoaWxkcmVuKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaGFzIGJvdGggY2hpbGRyZW5cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9yaWdodCBhbmQgc2VsZi5fY2hpbGRfbGVmdFxcblxcbiAgICBkZWYgZ2V0X2tleShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBub2RlIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBkZWYgc2V0X2tleShzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5vZGUga2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG5cXG4gICAga2V5ID0gcHJvcGVydHkoZ2V0X2tleSwgc2V0X2tleSlcXG5cXG4gICAgZGVmIGdldF92YWx1ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBub2RlIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWVcXG5cXG4gICAgZGVmIHNldF92YWx1ZShzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgbm9kZSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZVxcblxcbiAgICB2YWx1ZSA9IHByb3BlcnR5KGdldF92YWx1ZSwgc2V0X3ZhbHVlKVxcblxcbiAgICBkZWYgcmVwbGFjZV9wYXlsb2FkKHNlbGYsIGtleSwgdmFsdWUsIGxlZnQsIHJpZ2h0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoYW5nZSBub2RlIHBheWxvYWRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZVxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IGxlZnRcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gcmlnaHRcXG4gICAgICAgIGlmIHNlbGYuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnBhcmVudCA9IHNlbGZcXG4gICAgICAgIGlmIHNlbGYuY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQucGFyZW50ID0gc2VsZlxcblxcbiAgICBkZWYgZmluZF9zdWNjZXNzb3Ioc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBub2RlJ3Mgc3VjY2Vzc29yXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdWNjZXNzb3IgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBzdWNjZXNzb3IgPSBzZWxmLl9jaGlsZF9yaWdodC5maW5kX21pbigpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYuX3BhcmVudDpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzb3IgPSBzZWxmLl9wYXJlbnRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IE5vbmVcXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NvciA9IHNlbGYuX3BhcmVudC5maW5kX3N1Y2Nlc3NvcigpXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPSBzZWxmXFxuICAgICAgICByZXR1cm4gc3VjY2Vzc29yXFxuXFxuICAgIGRlZiBmaW5kX21pbihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZpbmQgdGhlIHNtYWxsZXN0IG5vZGUgaW4gdGhlIHJpZ2h0IHN1YnRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmXFxuICAgICAgICB3aGlsZSBjdXJyZW50LmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGRfbGVmdFxcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRcXG5cXG4gICAgZGVmIHNwbGljZV9vdXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTcGxpY2Ugb3V0XFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLmlzX2xlYWYoKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX2xlZnQgPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID0gTm9uZVxcbiAgICAgICAgZWxpZiBzZWxmLmhhc19hX2NoaWxkKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID0gc2VsZi5fY2hpbGRfbGVmdFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID0gc2VsZi5fY2hpbGRfbGVmdFxcbiAgICAgICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnBhcmVudCA9IHNlbGYuX3BhcmVudFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX2xlZnQgPSBzZWxmLl9jaGlsZF9yaWdodFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID0gc2VsZi5fY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQucGFyZW50ID0gc2VsZi5fcGFyZW50XFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRoZSBzdGFuZGFyZCBpbm9yZGVyIHRyYXZlcnNhbCBvZiBhIGJpbmFyeSB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmOlxcbiAgICAgICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtXFxuICAgICAgICAgICAgeWllbGQgc2VsZi5fa2V5XFxuICAgICAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcblxcblxcbmNsYXNzIEJpbmFyeVNlYXJjaFRyZWU6XFxuICAgIFxcXCJcXFwiXFxcIkJpbmFyeSBzZWFyY2ggdHJlZSBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLl9yb290ID0gTm9uZVxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IDBcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUcmVlIHNpemVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVHJlZSBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZVxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJdGVyYXRvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3Jvb3QuX19pdGVyX18oKVxcblxcbiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIltdIGdldHRlciBvcGVyYXRvciBvdmVycmlkZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmVzdWx0ID0gc2VsZi5nZXQoa2V5KVxcbiAgICAgICAgaWYgcmVzdWx0OlxcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcXG4gICAgICAgIHJhaXNlIEtleUVycm9yKFxcXCJFcnJvciwga2V5IG5vdCBpbiB0cmVlXFxcIilcXG5cXG4gICAgZGVmIGdldF9yb290KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRyZWUgcm9vdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3Jvb3RcXG5cXG4gICAgZGVmIHNldF9yb290KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHRyZWUgcm9vdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcm9vdCA9IG5vZGVcXG5cXG4gICAgcm9vdCA9IHByb3BlcnR5KGdldF9yb290LCBzZXRfcm9vdClcXG5cXG4gICAgZGVmIGdldChzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0cmlldmUgYSB2YWx1ZSBieSB0aGUga2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2dldChrZXksIHNlbGYuX3Jvb3QpXFxuICAgICAgICAgICAgaWYgcmVzdWx0OlxcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlXFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9nZXQoc2VsZiwga2V5LCBjdXJyZW50X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0cmlldmUgYSB2YWx1ZSBieSB0aGUga2V5IChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBub3QgY3VycmVudF9ub2RlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBpZiBjdXJyZW50X25vZGUua2V5ID09IGtleTpcXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudF9ub2RlXFxuICAgICAgICBlbGlmIGtleSA8IGN1cnJlbnRfbm9kZS5rZXk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldChrZXksIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KGtleSwgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJbXSBzZXR0ZXIgb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYucHV0KGtleSwgdmFsdWUpXFxuXFxuICAgIGRlZiBwdXQoc2VsZiwga2V5LCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3Jvb3Q6XFxuICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIHNlbGYuX3Jvb3QpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBCaW5hcnlUcmVlTm9kZShrZXksIHZhbHVlKVxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgKyAxXFxuXFxuICAgIGRlZiBfcHV0KHNlbGYsIGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgbmV3IG5vZGUgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGtleSA8IGN1cnJlbnRfbm9kZS5rZXk6XFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdCA9IEJpbmFyeVRyZWVOb2RlKFxcbiAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSwgcGFyZW50PWN1cnJlbnRfbm9kZVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQgPSBCaW5hcnlUcmVlTm9kZShcXG4gICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIHBhcmVudD1jdXJyZW50X25vZGVcXG4gICAgICAgICAgICAgICAgKVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJpbiBvcGVyYXRvciBvdmVycmlkZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fZ2V0KGtleSwgc2VsZi5fcm9vdCkpXFxuXFxuICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGVsIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLmRlbGV0ZShrZXkpXFxuXFxuICAgIGRlZiBkZWxldGUoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhIG5vZGUgYnkgaXRzIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fc2l6ZSA+IDE6XFxuICAgICAgICAgICAgbm9kZV90b19yZW1vdmUgPSBzZWxmLl9nZXQoa2V5LCBzZWxmLl9yb290KVxcbiAgICAgICAgICAgIGlmIG5vZGVfdG9fcmVtb3ZlOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9kZWxldGUobm9kZV90b19yZW1vdmUpXFxuICAgICAgICAgICAgICAgIHNlbGYuX3NpemUgPSBzZWxmLl9zaXplIC0gMVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKFxcXCJFcnJvciwga2V5IG5vdCBpbiB0cmVlXFxcIilcXG4gICAgICAgIGVsaWYgc2VsZi5fc2l6ZSA9PSAxIGFuZCBzZWxmLl9yb290LmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgc2VsZi5fcm9vdCA9IE5vbmVcXG4gICAgICAgICAgICBzZWxmLl9zaXplID0gc2VsZi5fc2l6ZSAtIDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoXFxcIkVycm9yLCBrZXkgbm90IGluIHRyZWVcXFwiKVxcblxcbiAgICBkZWYgX2RlbGV0ZShzZWxmLCBjdXJyZW50X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSBieSBpdHMga2V5IChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBjdXJyZW50X25vZGUuaXNfbGVhZigpOiAgIyByZW1vdmluZyBhIGxlYWZcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUgPT0gY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNoaWxkX2xlZnQgPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9yaWdodCA9IE5vbmVcXG4gICAgICAgIGVsaWYgY3VycmVudF9ub2RlLmhhc19jaGlsZHJlbigpOiAgIyByZW1vdmluZyBhIG5vZGUgd2l0aCB0d28gY2hpbGRyZW5cXG4gICAgICAgICAgICBzdWNjZXNzb3IgPSBjdXJyZW50X25vZGUuZmluZF9zdWNjZXNzb3IoKVxcbiAgICAgICAgICAgIHN1Y2Nlc3Nvci5zcGxpY2Vfb3V0KClcXG4gICAgICAgICAgICBjdXJyZW50X25vZGUua2V5ID0gc3VjY2Vzc29yLmtleVxcbiAgICAgICAgICAgIGN1cnJlbnRfbm9kZS52YWx1ZSA9IHN1Y2Nlc3Nvci52YWx1ZVxcbiAgICAgICAgZWxzZTogICMgcmVtb3ZpbmcgYSBub2RlIHdpdGggb25lIGNoaWxkXFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmdldF9jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5wYXJlbnQgPSBjdXJyZW50X25vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNoaWxkX2xlZnQgPSBjdXJyZW50X25vZGUuY2hpbGRfbGVmdFxcbiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnRfbm9kZS5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQucGFyZW50ID0gY3VycmVudF9ub2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9yaWdodCA9IGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucmVwbGFjZV9wYXlsb2FkKFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0LmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC52YWx1ZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5jaGlsZF9sZWZ0LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0LmNoaWxkX3JpZ2h0LFxcbiAgICAgICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQucGFyZW50ID0gY3VycmVudF9ub2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0ID0gY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0XFxuICAgICAgICAgICAgICAgIGVsaWYgY3VycmVudF9ub2RlLmlzX2NoaWxkX3JpZ2h0KCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQucGFyZW50ID0gY3VycmVudF9ub2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9yaWdodCA9IGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnJlcGxhY2VfcGF5bG9hZChcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQua2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodC52YWx1ZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQuY2hpbGRfbGVmdCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQuY2hpbGRfcmlnaHQsXFxuICAgICAgICAgICAgICAgICAgICApXFxuXFxuICAgIGRlZiBpbm9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSW4tb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2lub3JkZXIoc2VsZi5fcm9vdClcXG5cXG4gICAgZGVmIF9pbm9yZGVyKHNlbGYsIHRyZWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSW4tb3JkZXIgdHJlZSB0cmF2ZXJzYWwgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHRyZWU6XFxuICAgICAgICAgICAgc2VsZi5faW5vcmRlcih0cmVlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgcHJpbnQodHJlZS5rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICAgICAgc2VsZi5faW5vcmRlcih0cmVlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgcG9zdG9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUG9zdC1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHNlbGYuX3Jvb3QpXFxuXFxuICAgIGRlZiBfcG9zdG9yZGVyKHNlbGYsIHRyZWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUG9zdC1vcmRlciB0cmVlIHRyYXZlcnNhbCAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgdHJlZTpcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZXIodHJlZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlcih0cmVlLmNoaWxkX3JpZ2h0KVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5LCBlbmQ9XFxcIiBcXFwiKVxcblxcbiAgICBkZWYgcHJlb3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQcmUtb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3ByZW9yZGVyKHNlbGYuX3Jvb3QpXFxuXFxuICAgIGRlZiBfcHJlb3JkZXIoc2VsZiwgdHJlZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQcmUtb3JkZXIgdHJlZSB0cmF2ZXJzYWwgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHRyZWU6XFxuICAgICAgICAgICAgcHJpbnQodHJlZS5rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICAgICAgc2VsZi5fcHJlb3JkZXIodHJlZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVyKHRyZWUuY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBjbGVhcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbGwgbm9kZXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHdoaWxlIHNlbGYuX3Jvb3Q6XFxuICAgICAgICAgICAgc2VsZi5kZWxldGUoc2VsZi5fcm9vdC5rZXkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9iaW5hcnlfdHJlZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5pbXBvcnQgb3BlcmF0b3JcXG5cXG5cXG5jbGFzcyBCaW5hcnlUcmVlOlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgQSByZWN1cnNpdmUgaW1wbGVtZW50YXRpb24gb2YgQmluYXJ5IFRyZWVcXG4gICAgVXNpbmcgbGlua3MgYW5kIE5vZGVzIGFwcHJvYWNoLlxcblxcbiAgICBNb2RpZmllZCB0byBhbGxvdyBmb3IgdHJlZXMgdG8gYmUgY29uc3RydWN0ZWQgZnJvbSBvdGhlciB0cmVlc1xcbiAgICByYXRoZXIgdGhhbiBhbHdheXMgY3JlYXRpbmcgYSBuZXcgdHJlZSBpbiB0aGUgaW5zZXJ0X2ZlZnQgb3IgaW5zZXJ0X3JpZ2h0XFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gTm9uZVxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSBOb25lXFxuXFxuICAgIGRlZiBnZXRfcm9vdF92YWwoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgcm9vdCBrZXkgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9rZXlcXG5cXG4gICAgZGVmIHNldF9yb290X3ZhbChzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHJvb3Qga2V5IHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG5cXG4gICAgcm9vdCA9IHByb3BlcnR5KGdldF9yb290X3ZhbCwgc2V0X3Jvb3RfdmFsKVxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX2xlZnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbGVmdCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIHNldF9jaGlsZF9sZWZ0KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IGxlZnQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBub2RlXFxuXFxuICAgIGNoaWxkX2xlZnQgPSBwcm9wZXJ0eShnZXRfY2hpbGRfbGVmdCwgc2V0X2NoaWxkX2xlZnQpXFxuXFxuICAgIGRlZiBnZXRfY2hpbGRfcmlnaHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9yaWdodFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX3JpZ2h0KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IG5vZGVcXG5cXG4gICAgY2hpbGRfcmlnaHQgPSBwcm9wZXJ0eShnZXRfY2hpbGRfcmlnaHQsIHNldF9jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIGlzX2xlYWYoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiBhIG5vZGUgaXMgbGVhZlxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIChub3Qgc2VsZi5fY2hpbGRfbGVmdCkgYW5kIChub3Qgc2VsZi5fY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBpbnNlcnRfbGVmdChzZWxmLCBuZXdfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbnNlcnQgbGVmdCBzdWJ0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKG5ld19ub2RlLCBCaW5hcnlUcmVlKTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IG5ld19ub2RlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlID0gQmluYXJ5VHJlZShuZXdfbm9kZSlcXG5cXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUuc2V0X2NoaWxkX2xlZnQoc2VsZi5fY2hpbGRfbGVmdClcXG5cXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBuZXdfc3VidHJlZVxcblxcbiAgICBkZWYgaW5zZXJ0X3JpZ2h0KHNlbGYsIG5ld19ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluc2VydCByaWdodCBzdWJ0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKG5ld19ub2RlLCBCaW5hcnlUcmVlKTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IG5ld19ub2RlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlID0gQmluYXJ5VHJlZShuZXdfbm9kZSlcXG5cXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlLnNldF9jaGlsZF9yaWdodChzZWxmLl9jaGlsZF9yaWdodClcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gbmV3X3N1YnRyZWVcXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQucHJlb3JkZXIoKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQucHJlb3JkZXIoKVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQuaW5vcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9yaWdodC5pbm9yZGVyKClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3Qtb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wb3N0b3JkZXIoKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQucG9zdG9yZGVyKClcXG4gICAgICAgIHByaW50KHNlbGYuX2tleSwgZW5kPVxcXCIgXFxcIilcXG5cXG4gICAgZGVmIHByaW50X2V4cChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByaW50IGFuIGV4cHJlc3Npb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgcHJpbnQoXFxcIihcXFwiLCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQucHJpbnRfZXhwKClcXG4gICAgICAgIHByaW50KHNlbGYuX2tleSwgZW5kPVxcXCIgXFxcIilcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnByaW50X2V4cCgpXFxuICAgICAgICAgICAgcHJpbnQoXFxcIilcXFwiLCBlbmQ9XFxcIiBcXFwiKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyX2V2YWwoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQb3N0b3JkZXIgZXZhbHVhdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgb3BlcmF0aW9ucyA9IHtcXG4gICAgICAgICAgICBcXFwiK1xcXCI6IG9wZXJhdG9yLmFkZCxcXG4gICAgICAgICAgICBcXFwiLVxcXCI6IG9wZXJhdG9yLnN1YixcXG4gICAgICAgICAgICBcXFwiKlxcXCI6IG9wZXJhdG9yLm11bCxcXG4gICAgICAgICAgICBcXFwiL1xcXCI6IG9wZXJhdG9yLnRydWVkaXYsXFxuICAgICAgICB9XFxuICAgICAgICByZXN1bHRfMSA9IE5vbmVcXG4gICAgICAgIHJlc3VsdF8yID0gTm9uZVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICByZXN1bHRfMSA9IHNlbGYuX2NoaWxkX2xlZnQucG9zdG9yZGVyX2V2YWwoKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgcmVzdWx0XzIgPSBzZWxmLl9jaGlsZF9yaWdodC5wb3N0b3JkZXJfZXZhbCgpXFxuICAgICAgICBpZiByZXN1bHRfMSBhbmQgcmVzdWx0XzI6XFxuICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbnNbc2VsZi5fa2V5XShyZXN1bHRfMSwgcmVzdWx0XzIpXFxuICAgICAgICByZXR1cm4gc2VsZi5fa2V5XFxuXFxuICAgIGRlZiBoZWlnaHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJIZWlnaHQgb2YgYSB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBub3Qgc2VsZi5fa2V5OlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBoZWlnaHRfbGVmdCA9IHNlbGYuX2NoaWxkX2xlZnQuaGVpZ2h0KClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaGVpZ2h0X2xlZnQgPSAtMVxcblxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgaGVpZ2h0X3JpZ2h0ID0gc2VsZi5fY2hpbGRfcmlnaHQuaGVpZ2h0KClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaGVpZ2h0X3JpZ2h0ID0gLTFcXG5cXG4gICAgICAgIHJldHVybiAxICsgbWF4KGhlaWdodF9sZWZ0LCBoZWlnaHRfcmlnaHQpXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2l6ZSBvZiBhIHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLnNpemUoKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvdW50IG5vZGVzIGluIGEgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IHNlbGYuX2tleTpcXG4gICAgICAgICAgICByZXR1cm4gMFxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBjaGlsZHJlbl9sZWZ0ID0gc2VsZi5fY2hpbGRfbGVmdC5zaXplKClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgY2hpbGRyZW5fbGVmdCA9IDBcXG5cXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIGNoaWxkcmVuX3JpZ2h0ID0gc2VsZi5fY2hpbGRfcmlnaHQuc2l6ZSgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNoaWxkcmVuX3JpZ2h0ID0gMFxcblxcbiAgICAgICAgcmV0dXJuIDEgKyBjaGlsZHJlbl9sZWZ0ICsgY2hpbGRyZW5fcmlnaHRcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3RyZWVzL3ByaW9yaXR5X3F1ZXVlLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV9oZWFwIGltcG9ydCBCaW5hcnlIZWFwXFxuXFxuXFxuY2xhc3MgUHJpb3JpdHlRdWV1ZShCaW5hcnlIZWFwKTpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IGhlYXAgdGFrZXMgKGtleSwgdmFsdWUpIHBhaXJzIHdoZXJlIGtleSBzaWduaWZpZXMgcHJpb3JpdHlcXG4gICAgV2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUga2V5cyBhcmUgYWxsIGNvbXBhcmFibGUuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgY2hhbmdlX3ByaW9yaXR5KHNlbGYsIG5ld19wcmlvcml0eSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hhbmdlIHRoZSBwcmlvcml0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAga2V5X3RvX21vdmUgPSAwXFxuICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5faGVhcCkpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuX2hlYXBbaV1bMV0gPT0gdmFsdWU6XFxuICAgICAgICAgICAgICAgIGtleV90b19tb3ZlID0gaVxcbiAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgaWYga2V5X3RvX21vdmUgPiAtMTpcXG4gICAgICAgICAgICBzZWxmLl9oZWFwW2tleV90b19tb3ZlXSA9IChuZXdfcHJpb3JpdHksIHNlbGYuX2hlYXBba2V5X3RvX21vdmVdWzFdKVxcbiAgICAgICAgICAgIHNlbGYuX3BlcmNfdXAoa2V5X3RvX21vdmUpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL19faW5pdF9fLnB5XCI6XCJcIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9fX2luaXRfXy5weVwiOlwiXFxuXFxuXFxuZnJvbSAuYXZsIGltcG9ydCBBcmJvbEFWTFxcbmZyb20gLmFiYiBpbXBvcnQgQXJib2xCaW5hcmlvQnVzcXVlZGFcXG5mcm9tIC5tb250aWN1bG9CaW5hcmlvIGltcG9ydCBNb250aWN1bG9CaW5hcmlvXFxuXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvYWJiLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuI1xcbiNhYmIucHlcXG5cXG5jbGFzcyBBcmJvbEJpbmFyaW9CdXNxdWVkYTpcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5yYWl6ID0gTm9uZVxcbiAgICAgICAgc2VsZi50YW1hbm8gPSAwXFxuXFxuICAgIGRlZiBhZ3JlZ2FyKHNlbGYsY2xhdmUsdmFsb3IpOlxcbiAgICAgICAgaWYgc2VsZi5yYWl6OlxcbiAgICAgICAgICAgIHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isc2VsZi5yYWl6KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLnJhaXogPSBOb2RvQXJib2woY2xhdmUsdmFsb3IpXFxuICAgICAgICBzZWxmLnRhbWFubyA9IHNlbGYudGFtYW5vICsgMVxcblxcbiAgICBkZWYgX2FncmVnYXIoc2VsZixjbGF2ZSx2YWxvcixub2RvQWN0dWFsKTpcXG4gICAgICAgIGlmIGNsYXZlIDwgbm9kb0FjdHVhbC5jbGF2ZTpcXG4gICAgICAgICAgICBpZiBub2RvQWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICBzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkbylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8gPSBOb2RvQXJib2woY2xhdmUsdmFsb3IscGFkcmU9bm9kb0FjdHVhbClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgICAgICAgIHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvRGVyZWNobylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9EZXJlY2hvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuIFxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZixjLHYpOlxcbiAgICAgICAgc2VsZi5hZ3JlZ2FyKGMsdilcXG5cXG4gICAgZGVmIG9idGVuZXIoc2VsZixjbGF2ZSk6XFxuICAgICAgICBpZiBzZWxmLnJhaXo6XFxuICAgICAgICAgICAgcmVzID0gc2VsZi5fb2J0ZW5lcihjbGF2ZSxzZWxmLnJhaXopXFxuICAgICAgICAgICAgaWYgcmVzOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmNhcmdhVXRpbFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuXFxuICAgIGRlZiBfb2J0ZW5lcihzZWxmLGNsYXZlLG5vZG9BY3R1YWwpOlxcbiAgICBcXHRpZiBub3Qgbm9kb0FjdHVhbDpcXG4gICAgXFx0ICAgIHJldHVybiBOb25lXFxuICAgIFxcdGVsaWYgbm9kb0FjdHVhbC5jbGF2ZSA9PSBjbGF2ZTpcXG4gICAgXFx0ICAgIHJldHVybiBub2RvQWN0dWFsXFxuICAgIFxcdGVsaWYgY2xhdmUgPCBub2RvQWN0dWFsLmNsYXZlOlxcbiAgICBcXHQgICAgcmV0dXJuIHNlbGYuX29idGVuZXIoY2xhdmUsbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgcmV0dXJuIHNlbGYuX29idGVuZXIoY2xhdmUsbm9kb0FjdHVhbC5oaWpvRGVyZWNobykgICAgICAgIFxcblxcbiAgICBkZWYgX19nZXRpdGVtX18oc2VsZixjbGF2ZSk6XFxuICAgICAgICByZXMgPSBzZWxmLm9idGVuZXIoY2xhdmUpIFxcbiAgICAgICAgaWYgcmVzOlxcbiAgICAgICAgICAgIHJldHVybiByZXNcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBsYSBjbGF2ZSBubyBlc3TDoSBlbiBlbCDDoXJib2wnKVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsY2xhdmUpOlxcbiAgICBcXHRpZiBzZWxmLl9vYnRlbmVyKGNsYXZlLHNlbGYucmFpeik6XFxuICAgIFxcdCAgICByZXR1cm4gVHJ1ZVxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgcmV0dXJuIEZhbHNlXFxuICAgICAgIFxcbiAgICBkZWYgbG9uZ2l0dWQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi50YW1hbm9cXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi50YW1hbm9cXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucmFpei5fX2l0ZXJfXygpXFxuXFxuICAgIGRlZiBlbGltaW5hcihzZWxmLGNsYXZlKTpcXG4gICAgICAgIGlmIHNlbGYudGFtYW5vID4gMTpcXG4gICAgICAgICAgIG5vZG9BRWxpbWluYXIgPSBzZWxmLl9vYnRlbmVyKGNsYXZlLHNlbGYucmFpeilcXG4gICAgXFx0ICAgaWYgbm9kb0FFbGltaW5hcjpcXG4gICAgXFx0ICAgICAgIHNlbGYucmVtb3Zlcihub2RvQUVsaW1pbmFyKVxcbiAgICBcXHQgICAgICAgc2VsZi50YW1hbm8gPSBzZWxmLnRhbWFuby0xXFxuICAgIFxcdCAgIGVsc2U6XFxuICAgIFxcdCAgICAgICByYWlzZSBLZXlFcnJvcignRXJyb3IsIGxhIGNsYXZlIG5vIGVzdMOhIGVuIGVsIMOhcmJvbCcpXFxuICAgICAgICBlbGlmIHNlbGYudGFtYW5vID09IDEgYW5kIHNlbGYucmFpei5jbGF2ZSA9PSBjbGF2ZTpcXG4gICAgXFx0ICAgIHNlbGYucmFpeiA9IE5vbmVcXG4gICAgXFx0ICAgIHNlbGYudGFtYW5vID0gc2VsZi50YW1hbm8gLSAxXFxuICAgICAgICBlbHNlOlxcbiAgICBcXHQgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBsYSBjbGF2ZSBubyBlc3TDoSBlbiBlbCDDoXJib2wnKVxcblxcbiAgICBkZWYgX19kZWxpdGVtX18oc2VsZixjbGF2ZSk6XFxuICAgICAgICBzZWxmLmVsaW1pbmFyKGNsYXZlKVxcblxcbiAgICBkZWYgcmVtb3ZlcihzZWxmLG5vZG9BY3R1YWwpOlxcbiAgICAgICAgaWYgbm9kb0FjdHVhbC5lc0hvamEoKTogI2hvamFcXG4gICAgICAgICAgICBpZiBub2RvQWN0dWFsID09IG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5wYWRyZS5oaWpvSXpxdWllcmRvID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgICAgICBlbGlmIG5vZG9BY3R1YWwudGllbmVBbWJvc0hpam9zKCk6ICNpbnRlcmlvclxcbiAgICAgICAgICAgIHN1YyA9IG5vZG9BY3R1YWwuZW5jb250cmFyU3VjZXNvcigpXFxuICAgICAgICAgICAgc3VjLmVtcGFsbWFyKClcXG4gICAgICAgICAgICBub2RvQWN0dWFsLmNsYXZlID0gc3VjLmNsYXZlXFxuICAgICAgICAgICAgbm9kb0FjdHVhbC5jYXJnYVV0aWwgPSBzdWMuY2FyZ2FVdGlsXFxuXFxuICAgICAgICBlbHNlOiAjIGVzdGUgbm9kbyB0aWVuZSB1biAoMSkgaGlqb1xcbiAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9JenF1aWVyZG8gPSBub2RvQWN0dWFsLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgZWxpZiBub2RvQWN0dWFsLmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5wYWRyZSA9IG5vZG9BY3R1YWwucGFkcmVcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0RlcmVjaG8gPSBub2RvQWN0dWFsLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucmVlbXBsYXphckRhdG9EZU5vZG8obm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmNsYXZlLCBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8uY2FyZ2FVdGlsLCBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8uaGlqb0l6cXVpZXJkbywgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmhpam9EZXJlY2hvKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9EZXJlY2hvLnBhZHJlID0gbm9kb0FjdHVhbC5wYWRyZVxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5wYWRyZS5oaWpvSXpxdWllcmRvID0gbm9kb0FjdHVhbC5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBlbGlmIG5vZG9BY3R1YWwuZXNIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5wYWRyZSA9IG5vZG9BY3R1YWwucGFkcmVcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0RlcmVjaG8gPSBub2RvQWN0dWFsLmhpam9EZXJlY2hvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnJlZW1wbGF6YXJEYXRvRGVOb2RvKG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8uY2xhdmUsIG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8uY2FyZ2FVdGlsLCBub2RvQWN0dWFsLmhpam9EZXJlY2hvLmhpam9JenF1aWVyZG8sIG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8uaGlqb0RlcmVjaG8pXFxuXFxuICAgIGRlZiBpbm9yZGVuKHNlbGYpOlxcbiAgICAgICAgc2VsZi5faW5vcmRlbihzZWxmLnJhaXopXFxuXFxuICAgIGRlZiBfaW5vcmRlbihzZWxmLGFyYm9sKTpcXG4gICAgICAgIGlmIGFyYm9sICE9IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5faW5vcmRlbihhcmJvbC5oaWpvSXpxdWllcmRvKVxcbiAgICAgICAgICAgIHByaW50KGFyYm9sLmNsYXZlKVxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZW4oYXJib2wuaGlqb0RlcmVjaG8pXFxuXFxuICAgIGRlZiBwb3N0b3JkZW4oc2VsZik6XFxuICAgICAgICBzZWxmLl9wb3N0b3JkZW4oc2VsZi5yYWl6KVxcblxcbiAgICBkZWYgX3Bvc3RvcmRlbihzZWxmLCBhcmJvbCk6XFxuICAgICAgICBpZiBhcmJvbDpcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZW4oYXJib2wuaGlqb0RlcmVjaG8pXFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVuKGFyYm9sLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgcHJpbnQoYXJib2wuY2xhdmUpICAgICAgICAgICAgXFxuXFxuICAgIGRlZiBwcmVvcmRlbihzZWxmKTpcXG4gICAgICAgIHNlbGYuX3ByZW9yZGVuKHNlbGYsc2VsZi5yYWl6KVxcblxcbiAgICBkZWYgX3ByZW9yZGVuKHNlbGYsYXJib2wpOlxcbiAgICAgICAgaWYgYXJib2w6XFxuICAgICAgICAgICAgcHJpbnQoYXJib2wuY2xhdmUpICAgICAgICAgICAgXFxuICAgICAgICAgICAgc2VsZi5fcHJlb3JkZW4oYXJib2wuaGlqb0l6cXVpZXJkbylcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlbihhcmJvbC5oaWpvRGVyZWNobylcXG5cXG5cXG5jbGFzcyBOb2RvQXJib2w6XFxuICAgZGVmIF9faW5pdF9fKHNlbGYsY2xhdmUsdmFsb3IsaXpxdWllcmRvPU5vbmUsZGVyZWNobz1Ob25lLHBhZHJlPU5vbmUpOlxcbiAgICAgICAgc2VsZi5jbGF2ZSA9IGNsYXZlXFxuICAgICAgICBzZWxmLmNhcmdhVXRpbCA9IHZhbG9yXFxuICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8gPSBpenF1aWVyZG9cXG4gICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBkZXJlY2hvXFxuICAgICAgICBzZWxmLnBhZHJlID0gcGFkcmVcXG4gICAgICAgIHNlbGYuZmFjdG9yRXF1aWxpYnJpbyA9IDBcXG5cXG4gICAgZGVmIHRpZW5lSGlqb0l6cXVpZXJkbyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgXFxuICAgIGRlZiB0aWVuZUhpam9EZXJlY2hvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaGlqb0RlcmVjaG9cXG5cXG4gICAgZGVmIGVzSGlqb0l6cXVpZXJkbyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhZHJlIGFuZCBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPT0gc2VsZlxcbiAgICBcXG4gICAgZGVmIGVzSGlqb0RlcmVjaG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wYWRyZSBhbmQgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9PSBzZWxmXFxuXFxuICAgIGRlZiBlc1JhaXooc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IHNlbGYucGFkcmVcXG5cXG4gICAgZGVmIGVzSG9qYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBub3QgKHNlbGYuaGlqb0RlcmVjaG8gb3Igc2VsZi5oaWpvSXpxdWllcmRvKVxcblxcbiAgICBkZWYgdGllbmVBbGd1bkhpam8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvRGVyZWNobyBvciBzZWxmLmhpam9JenF1aWVyZG9cXG5cXG4gICAgZGVmIHRpZW5lQW1ib3NIaWpvcyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvIGFuZCBzZWxmLmhpam9JenF1aWVyZG9cXG5cXG4gICAgZGVmIHJlZW1wbGF6YXJEYXRvRGVOb2RvKHNlbGYsY2xhdmUsdmFsb3IsaGl6cSxoZGVyKTpcXG4gICAgICAgIHNlbGYuY2xhdmUgPSBjbGF2ZVxcbiAgICAgICAgc2VsZi5jYXJnYVV0aWwgPSB2YWxvclxcbiAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gaGl6cVxcbiAgICAgICAgc2VsZi5oaWpvRGVyZWNobyA9IGhkZXJcXG4gICAgICAgIGlmIHNlbGYudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLnBhZHJlID0gc2VsZlxcbiAgICAgICAgaWYgc2VsZi50aWVuZUhpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5wYWRyZSA9IHNlbGYgICAgXFxuXFxuICAgIGRlZiBlbmNvbnRyYXJTdWNlc29yKHNlbGYpOlxcbiAgICAgICAgc3VjID0gTm9uZVxcbiAgICAgICAgaWYgc2VsZi50aWVuZUhpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgc3VjID0gc2VsZi5oaWpvRGVyZWNoby5lbmNvbnRyYXJNaW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLnBhZHJlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgc3VjID0gc2VsZi5wYWRyZVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IE5vbmVcXG4gICAgICAgICAgICAgICAgICAgIHN1YyA9IHNlbGYucGFkcmUuZW5jb250cmFyU3VjZXNvcigpXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9EZXJlY2hvID0gc2VsZlxcbiAgICAgICAgcmV0dXJuIHN1Y1xcblxcbiAgICBkZWYgZW1wYWxtYXIoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmVzSG9qYSgpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0l6cXVpZXJkbyA9IE5vbmVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9EZXJlY2hvID0gTm9uZVxcbiAgICAgICAgZWxpZiBzZWxmLnRpZW5lQWxndW5IaWpvKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0l6cXVpZXJkbyA9IHNlbGYuaGlqb0l6cXVpZXJkb1xcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IHNlbGYuaGlqb0l6cXVpZXJkb1xcbiAgICAgICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucGFkcmUgPSBzZWxmLnBhZHJlXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0l6cXVpZXJkbyA9IHNlbGYuaGlqb0RlcmVjaG9cXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBzZWxmLmhpam9EZXJlY2hvXFxuICAgICAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8ucGFkcmUgPSBzZWxmLnBhZHJlXFxuXFxuICAgIGRlZiBlbmNvbnRyYXJNaW4oc2VsZik6XFxuICAgICAgICBhY3R1YWwgPSBzZWxmXFxuICAgICAgICB3aGlsZSBhY3R1YWwudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgYWN0dWFsID0gYWN0dWFsLmhpam9JenF1aWVyZG9cXG4gICAgICAgIHJldHVybiBhY3R1YWxcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZjpcXG4gICAgXFx0ICAgIGlmIHNlbGYudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdCAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICBcXHRcXHQgICAgeWllbGQgZWxlbVxcbiAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xhdmVcXG4gICAgXFx0ICAgIGlmIHNlbGYudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLmhpam9EZXJlY2hvOlxcbiAgICBcXHRcXHQgICAgeWllbGQgZWxlbVxcblwiLFwic3JjL2xpYi9weXRob25lZC9hcmJvbGVzL2FyYm9sQmluYXJpby5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI2FyYm9sQmluYXJpby5weVxcblxcbmNsYXNzIEFyYm9sQmluYXJpbzpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsb2JqZXRvUmFpeik6XFxuICAgICAgICBzZWxmLmNsYXZlID0gb2JqZXRvUmFpelxcbiAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gTm9uZVxcbiAgICAgICAgc2VsZi5oaWpvRGVyZWNobyA9IE5vbmVcXG4gICAgXFxuICAgIGRlZiBpbnNlcnRhckl6cXVpZXJkbyhzZWxmLG51ZXZvTm9kbyk6XFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG8gPT0gTm9uZTpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8gPSBBcmJvbEJpbmFyaW8obnVldm9Ob2RvKVxcbiAgICAgICAgZWxzZTogIFxcbiAgICAgICAgICAgIHQgPSBBcmJvbEJpbmFyaW8obnVldm9Ob2RvKVxcbiAgICAgICAgICAgIHQuaGlqb0l6cXVpZXJkbyA9IHNlbGYuaGlqb0l6cXVpZXJkb1xcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IHRcXG5cXG4gICAgZGVmIGluc2VydGFyRGVyZWNobyhzZWxmLG51ZXZvTm9kbyk6XFxuICAgICAgICBpZiBzZWxmLmhpam9EZXJlY2hvID09IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNobyA9IEFyYm9sQmluYXJpbyhudWV2b05vZG8pXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHQgPSBBcmJvbEJpbmFyaW8obnVldm9Ob2RvKVxcbiAgICAgICAgICAgIHQuaGlqb0RlcmVjaG8gPSBzZWxmLmhpam9EZXJlY2hvXFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNobyA9IHRcXG5cXG4gICAgZGVmIGVzSG9qYShzZWxmKTpcXG4gICAgICAgIHJldHVybiAoKG5vdCBzZWxmLmhpam9JenF1aWVyZG8pIGFuZCAobm90IHNlbGYuaGlqb0RlcmVjaG8pKVxcblxcbiAgICBkZWYgb2J0ZW5lckhpam9EZXJlY2hvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaGlqb0RlcmVjaG9cXG4gICAgXFxuICAgIGRlZiBvYnRlbmVySGlqb0l6cXVpZXJkbyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgXFxuICAgIGRlZiBhc2lnbmFyVmFsb3JSYWl6KHNlbGYsb2JqKTpcXG4gICAgICAgIHNlbGYuY2xhdmUgPSBvYmpcXG5cXG4gICAgZGVmIG9idGVuZXJWYWxvclJhaXooc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5jbGF2ZVxcblxcbiAgICBkZWYgaW5vcmRlbihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8uaW5vcmRlbigpXFxuICAgICAgICBwcmludChzZWxmLmNsYXZlKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLmlub3JkZW4oKVxcblxcbiAgICBkZWYgcG9zdG9yZGVuKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5wb3N0b3JkZW4oKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnBvc3RvcmRlbigpXFxuICAgICAgICBwcmludChzZWxmLmNsYXZlKVxcblxcbiAgICBkZWYgcHJlb3JkZW4oc2VsZik6XFxuICAgICAgICBwcmludChzZWxmLmNsYXZlKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5wcmVvcmRlbigpXFxuICAgICAgICBpZiBzZWxmLmhpam9EZXJlY2hvOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8ucHJlb3JkZW4oKVxcblxcbiAgICBkZWYgaW1wcmltaXJFeHByZXNpb24oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgcHJpbnQoJygnLCBlbmQ9JyAnKVxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5pbXByaW1pckV4cHJlc2lvbigpXFxuICAgICAgICBwcmludChzZWxmLmNsYXZlLCBlbmQ9JyAnKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLmltcHJpbWlyRXhwcmVzaW9uKClcXG4gICAgICAgICAgICBwcmludCgnKScsIGVuZD0nICcpXFxuXFxuICAgIGRlZiBldmFsUG9zdG9yZGVuKHNlbGYpOlxcbiAgICAgICAgb3BlcnMgPSB7JysnOm9wZXJhdG9yLmFkZCwgJy0nOm9wZXJhdG9yLnN1YiwgJyonOm9wZXJhdG9yLm11bCwgJy8nOm9wZXJhdG9yLnRydWVkaXZ9XFxuICAgICAgICByZXMxID0gTm9uZVxcbiAgICAgICAgcmVzMiA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICByZXMxID0gc2VsZi5oaWpvSXpxdWllcmRvLmV2YWxQb3N0b3JkZW4oKSAgIy8vIFxcXFxsYWJlbHtwZWxlZnR9XFxuICAgICAgICBpZiBzZWxmLmhpam9EZXJlY2hvOlxcbiAgICAgICAgICAgIHJlczIgPSBzZWxmLmhpam9EZXJlY2hvLmV2YWxQb3N0b3JkZW4oKSAjLy8gXFxcXGxhYmVse3BlcmlnaHR9XFxuICAgICAgICBpZiByZXMxIGFuZCByZXMyOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyc1tzZWxmLmNsYXZlXShyZXMxLHJlczIpICMvLyBcXFxcbGFiZWx7cGVldmFsfVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5jbGF2ZVxcblxcbmRlZiBpbm9yZGVuKGFyYm9sKTpcXG4gICAgaWYgYXJib2wgIT0gTm9uZTpcXG4gICAgICAgIGlub3JkZW4oYXJib2wub2J0ZW5lckhpam9JenF1aWVyZG8oKSlcXG4gICAgICAgIHByaW50KGFyYm9sLm9idGVuZXJWYWxvclJhaXooKSlcXG4gICAgICAgIGlub3JkZW4oYXJib2wub2J0ZW5lckhpam9EZXJlY2hvKCkpXFxuXFxuZGVmIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sKTpcXG4gICAgaWYgYXJib2wuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgIHByaW50KCcoJywgZW5kPScgJylcXG4gICAgICAgIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpXFxuICAgIHByaW50KGFyYm9sLm9idGVuZXJWYWxvclJhaXooKSwgZW5kPScgJylcXG4gICAgaWYgYXJib2wuaGlqb0RlcmVjaG86XFxuICAgICAgICBpbXByaW1pckV4cHJlc2lvbihhcmJvbC5vYnRlbmVySGlqb0RlcmVjaG8oKSlcXG4gICAgICAgIHByaW50KCcpJywgZW5kPScgJykgXFxuXFxuZGVmIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sKTpcXG4gIHZhbG9yQ2FkZW5hID0gXFxcIlxcXCJcXG4gIGlmIGFyYm9sOlxcbiAgICAgIHZhbG9yQ2FkZW5hID0gJygnICsgaW1wcmltaXJFeHByZXNpb24oYXJib2wub2J0ZW5lckhpam9JenF1aWVyZG8oKSlcXG4gICAgICB2YWxvckNhZGVuYSA9IHZhbG9yQ2FkZW5hICsgc3RyKGFyYm9sLm9idGVuZXJWYWxvclJhaXooKSlcXG4gICAgICB2YWxvckNhZGVuYSA9IHZhbG9yQ2FkZW5hICsgaW1wcmltaXJFeHByZXNpb24oYXJib2wub2J0ZW5lckhpam9EZXJlY2hvKCkpKycpJ1xcbiAgcmV0dXJuIHZhbG9yQ2FkZW5hXFxuXFxuZGVmIGV2YWxQb3N0b3JkZW4oYXJib2wpOlxcbiAgICBvcGVyYWRvcmVzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICByZXMxID0gTm9uZVxcbiAgICByZXMyID0gTm9uZVxcbiAgICBpZiBhcmJvbDpcXG4gICAgICAgIHJlczEgPSBldmFsUG9zdG9yZGVuKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgcmVzMiA9IGV2YWxQb3N0b3JkZW4oYXJib2wub2J0ZW5lckhpam9EZXJlY2hvKCkpICAjLy8gXFxcXGxhYmVse3BlcmlnaHR9XFxuICAgICAgICBpZiByZXMxIGFuZCByZXMyOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyYWRvcmVzW2FyYm9sLm9idGVuZXJWYWxvclJhaXooKV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIGFyYm9sLm9idGVuZXJWYWxvclJhaXooKVxcblxcbmRlZiBhbHR1cmEoYXJib2wpOlxcbiAgICBpZiBhcmJvbCA9PSBOb25lOlxcbiAgICAgICAgcmV0dXJuIC0xXFxuICAgIGVsc2U6XFxuICAgICAgICByZXR1cm4gMSArIG1heChhbHR1cmEoYXJib2wuaGlqb0l6cXVpZXJkbyksYWx0dXJhKGFyYm9sLmhpam9EZXJlY2hvKSlcXG5cXG50ID0gQXJib2xCaW5hcmlvKDcpXFxudC5pbnNlcnRhckl6cXVpZXJkbygzKVxcbnQuaW5zZXJ0YXJEZXJlY2hvKDkpXFxuaW5vcmRlbih0KVxcbmltcG9ydCBvcGVyYXRvclxcbnggPSBBcmJvbEJpbmFyaW8oJyonKVxcbnguaW5zZXJ0YXJJenF1aWVyZG8oJysnKVxcbmwgPSB4Lm9idGVuZXJIaWpvSXpxdWllcmRvKClcXG5sLmluc2VydGFySXpxdWllcmRvKDQpXFxubC5pbnNlcnRhckRlcmVjaG8oNSlcXG54Lmluc2VydGFyRGVyZWNobyg3KVxcbnByaW50KGltcHJpbWlyRXhwcmVzaW9uKHgpKVxcbnByaW50KGV2YWxQb3N0b3JkZW4oeCkpXFxucHJpbnQoYWx0dXJhKHgpKVxcblwiLFwic3JjL2xpYi9weXRob25lZC9hcmJvbGVzL2F2bC5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiNcXG4jYXZsLnB5XFxuXFxuZnJvbSAuYWJiIGltcG9ydCBBcmJvbEJpbmFyaW9CdXNxdWVkYSwgTm9kb0FyYm9sXFxuXFxuY2xhc3MgQXJib2xBVkwoQXJib2xCaW5hcmlvQnVzcXVlZGEpOlxcblxcbiAgICBkZWYgX2FncmVnYXIoc2VsZixjbGF2ZSx2YWxvcixub2RvQWN0dWFsKTpcXG4gICAgXFx0aWYgY2xhdmUgPCBub2RvQWN0dWFsLmNsYXZlOlxcbiAgICBcXHQgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgXFx0XFx0c2VsZi5fYWdyZWdhcihjbGF2ZSx2YWxvcixub2RvQWN0dWFsLmhpam9JenF1aWVyZG8pXFxuICAgIFxcdCAgICBlbHNlOlxcbiAgICBcXHRcXHRub2RvQWN0dWFsLmhpam9JenF1aWVyZG8gPSBOb2RvQXJib2woY2xhdmUsdmFsb3IscGFkcmU9bm9kb0FjdHVhbClcXG4gICAgXFx0XFx0c2VsZi5hY3R1YWxpemFyRXF1aWxpYnJpbyhub2RvQWN0dWFsLmhpam9JenF1aWVyZG8pXFxuICAgIFxcdGVsc2U6XFxuICAgIFxcdCAgICBpZiBub2RvQWN0dWFsLnRpZW5lSGlqb0RlcmVjaG8oKTpcXG4gICAgXFx0XFx0c2VsZi5fYWdyZWdhcihjbGF2ZSx2YWxvcixub2RvQWN0dWFsLmhpam9EZXJlY2hvKVxcbiAgICBcXHQgICAgZWxzZTpcXG4gICAgXFx0XFx0bm9kb0FjdHVhbC5oaWpvRGVyZWNobyA9IE5vZG9BcmJvbChjbGF2ZSx2YWxvcixwYWRyZT1ub2RvQWN0dWFsKVxcbiAgICBcXHRcXHRzZWxmLmFjdHVhbGl6YXJFcXVpbGlicmlvKG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pXFxuXFxuICAgIGRlZiBhY3R1YWxpemFyRXF1aWxpYnJpbyhzZWxmLG5vZG8pOlxcbiAgICBcXHRpZiBub2RvLmZhY3RvckVxdWlsaWJyaW8gPiAxIG9yIG5vZG8uZmFjdG9yRXF1aWxpYnJpbyA8IC0xOlxcbiAgICBcXHQgICAgc2VsZi5yZWVxdWlsaWJyYXIobm9kbykgICAgXFxuICAgIFxcdCAgICByZXR1cm5cXG4gICAgXFx0aWYgbm9kby5wYWRyZSAhPSBOb25lOlxcbiAgICBcXHQgICAgaWYgbm9kby5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgXFx0XFx0ICAgIG5vZG8ucGFkcmUuZmFjdG9yRXF1aWxpYnJpbyArPSAxXFxuICAgIFxcdCAgICBlbGlmIG5vZG8uZXNIaWpvRGVyZWNobygpOlxcbiAgICBcXHRcXHQgICAgbm9kby5wYWRyZS5mYWN0b3JFcXVpbGlicmlvIC09IDFcXG5cXG4gICAgXFx0ICAgIGlmIG5vZG8ucGFkcmUuZmFjdG9yRXF1aWxpYnJpbyAhPSAwOlxcbiAgICBcXHRcXHQgICAgc2VsZi5hY3R1YWxpemFyRXF1aWxpYnJpbyhub2RvLnBhZHJlKVxcblxcbiAgICBkZWYgcmVlcXVpbGlicmFyKHNlbGYsbm9kbyk6XFxuICAgICAgICBpZiBub2RvLmZhY3RvckVxdWlsaWJyaW8gPCAwOlxcblxcdCAgICBpZiBub2RvLmhpam9EZXJlY2hvLmZhY3RvckVxdWlsaWJyaW8gPiAwOlxcblxcdCAgICAgICAgc2VsZi5yb3RhckRlcmVjaGEobm9kby5oaWpvRGVyZWNobylcXG5cXHQgICAgICAgIHNlbGYucm90YXJJenF1aWVyZGEobm9kbylcXG5cXHQgICAgZWxzZTpcXG5cXHQgICAgICAgIHNlbGYucm90YXJJenF1aWVyZGEobm9kbylcXG4gICAgICAgIGVsaWYgbm9kby5mYWN0b3JFcXVpbGlicmlvID4gMDpcXG5cXHQgICAgaWYgbm9kby5oaWpvSXpxdWllcmRvLmZhY3RvckVxdWlsaWJyaW8gPCAwOlxcblxcdCAgICAgICAgc2VsZi5yb3Rhckl6cXVpZXJkYShub2RvLmhpam9JenF1aWVyZG8pXFxuXFx0ICAgICAgICBzZWxmLnJvdGFyRGVyZWNoYShub2RvKVxcblxcdCAgICAgZWxzZTpcXG5cXHQgICAgICAgIHNlbGYucm90YXJEZXJlY2hhKG5vZG8pXFxuICAgICAgICAgICBcXG4gICAgZGVmIHJvdGFySXpxdWllcmRhKHNlbGYscm90UmFpeik6XFxuICAgIFxcdG51ZXZhUmFpeiA9IHJvdFJhaXouaGlqb0RlcmVjaG9cXG4gICAgXFx0cm90UmFpei5oaWpvRGVyZWNobyA9IG51ZXZhUmFpei5oaWpvSXpxdWllcmRvXFxuICAgIFxcdGlmIG51ZXZhUmFpei5oaWpvSXpxdWllcmRvICE9IE5vbmU6XFxuICAgIFxcdCAgICBudWV2YVJhaXouaGlqb0l6cXVpZXJkby5wYWRyZSA9IHJvdFJhaXpcXG4gICAgXFx0bnVldmFSYWl6LnBhZHJlID0gcm90UmFpei5wYWRyZVxcbiAgICBcXHRpZiByb3RSYWl6LmVzUmFpeigpOlxcbiAgICBcXHQgICAgc2VsZi5yYWl6ID0gbnVldmFSYWl6XFxuICAgIFxcdGVsc2U6XFxuICAgIFxcdCAgICBpZiByb3RSYWl6LmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICBcXHQgICAgICAgIHJvdFJhaXoucGFkcmUuaGlqb0l6cXVpZXJkbyA9IG51ZXZhUmFpelxcbiAgICBcXHQgICAgZWxzZTpcXG4gICAgXFx0ICAgIFxcdHJvdFJhaXoucGFkcmUuaGlqb0RlcmVjaG8gPSBudWV2YVJhaXpcXG4gICAgXFx0bnVldmFSYWl6Lmhpam9JenF1aWVyZG8gPSByb3RSYWl6XFxuICAgIFxcdHJvdFJhaXoucGFkcmUgPSBudWV2YVJhaXpcXG4gICAgXFx0cm90UmFpei5mYWN0b3JFcXVpbGlicmlvID0gcm90UmFpei5mYWN0b3JFcXVpbGlicmlvICsgMSAtIG1pbihudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbywgMClcXG4gICAgXFx0bnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSBudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbyArIDEgKyBtYXgocm90UmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKVxcblxcbiAgICBkZWYgcm90YXJEZXJlY2hhKHNlbGYscm90UmFpeik6XFxuICAgICAgICBudWV2YVJhaXogPSByb3RSYWl6Lmhpam9JenF1aWVyZG9cXG4gICAgICAgIHJvdFJhaXouaGlqb0l6cXVpZXJkbyA9IG51ZXZhUmFpei5oaWpvRGVyZWNob1xcbiAgICAgICAgaWYgbnVldmFSYWl6Lmhpam9EZXJlY2hvICE9IE5vbmU6XFxuICAgICAgICAgICAgbnVldmFSYWl6Lmhpam9EZXJlY2hvLnBhZHJlID0gcm90UmFpelxcbiAgICAgICAgbnVldmFSYWl6LnBhZHJlID0gcm90UmFpei5wYWRyZVxcbiAgICAgICAgaWYgcm90UmFpei5lc1JhaXooKTpcXG4gICAgICAgICAgICBzZWxmLnJhaXogPSBudWV2YVJhaXpcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90UmFpei5lc0hpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgICAgIHJvdFJhaXoucGFkcmUuaGlqb0RlcmVjaG8gPSBudWV2YVJhaXpcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RSYWl6LnBhZHJlLmhpam9JenF1aWVyZG8gPSBudWV2YVJhaXpcXG4gICAgICAgIG51ZXZhUmFpei5oaWpvRGVyZWNobyA9IHJvdFJhaXpcXG4gICAgICAgIHJvdFJhaXoucGFkcmUgPSBudWV2YVJhaXpcXG4gICAgICAgIHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyA9IHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyAtIDEgLSBtYXgobnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8sIDApXFxuICAgICAgICBudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbyA9IG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvIC0gMSArIG1pbihyb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8sIDApICBcXG5cXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9tb250aWN1bG9CaW5hcmlvLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jbW9udGljdWxvQmluYXJpby5weVxcblxcbmNsYXNzIE1vbnRpY3Vsb0JpbmFyaW86XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYubGlzdGFNb250aWN1bG8gPSBbMF1cXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gMFxcblxcbiAgICBkZWYgY29uc3RydWlyTW9udGljdWxvKHNlbGYsdW5hTGlzdGEpOlxcbiAgICAgICAgaSA9IGxlbih1bmFMaXN0YSkgLy8gMlxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBsZW4odW5hTGlzdGEpXFxuICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvID0gWzBdICsgdW5hTGlzdGFbOl1cXG4gICAgICAgIHByaW50KGxlbihzZWxmLmxpc3RhTW9udGljdWxvKSwgaSlcXG4gICAgICAgIHdoaWxlIChpID4gMCk6XFxuICAgICAgICAgICAgcHJpbnQoc2VsZi5saXN0YU1vbnRpY3VsbywgaSlcXG4gICAgICAgICAgICBzZWxmLmluZmlsdEFiYWpvKGkpXFxuICAgICAgICAgICAgaSA9IGkgLSAxXFxuICAgICAgICBwcmludChzZWxmLmxpc3RhTW9udGljdWxvLGkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgIGRlZiBpbmZpbHRBYmFqbyhzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgKGkgKiAyKSA8PSBzZWxmLnRhbWFub0FjdHVhbDpcXG4gICAgICAgICAgICBobSA9IHNlbGYuaGlqb01pbihpKVxcbiAgICAgICAgICAgIGlmIHNlbGYubGlzdGFNb250aWN1bG9baV0gPiBzZWxmLmxpc3RhTW9udGljdWxvW2htXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tpXVxcbiAgICAgICAgICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvW2ldID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tobV1cXG4gICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tobV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaG1cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBoaWpvTWluKHNlbGYsaSk6XFxuICAgICAgICBpZiBpICogMiArIDEgPiBzZWxmLnRhbWFub0FjdHVhbDpcXG4gICAgICAgICAgICByZXR1cm4gaSAqIDJcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5saXN0YU1vbnRpY3Vsb1tpICogMl0gPCBzZWxmLmxpc3RhTW9udGljdWxvW2kgKiAyICsgMV06XFxuICAgICAgICAgICAgICAgIHJldHVybiBpICogMlxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpICogMiArIDFcXG5cXG4gICAgZGVmIGluZmlsdEFycmliYShzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgaSAvLyAyID4gMDpcXG4gICAgICAgICAgICBpZiBzZWxmLmxpc3RhTW9udGljdWxvW2ldIDwgc2VsZi5saXN0YU1vbnRpY3Vsb1tpLy8yXTpcXG4gICAgICAgICAgICAgICB0bXAgPSBzZWxmLmxpc3RhTW9udGljdWxvW2kgLy8gMl1cXG4gICAgICAgICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvW2kgLy8gMl0gPSBzZWxmLmxpc3RhTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBpIC8vIDJcXG4gXFxuICAgIGRlZiBpbnNlcnRhcihzZWxmLGspOlxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsby5hcHBlbmQoaylcXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gc2VsZi50YW1hbm9BY3R1YWwgKyAxXFxuICAgICAgICBzZWxmLmluZmlsdEFycmliYShzZWxmLnRhbWFub0FjdHVhbClcXG5cXG4gICAgZGVmIGVsaW1pbmFyTWluKHNlbGYpOlxcbiAgICAgICAgdmFsb3JTYWNhZG8gPSBzZWxmLmxpc3RhTW9udGljdWxvWzFdXFxuICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvWzFdID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tzZWxmLnRhbWFub0FjdHVhbF1cXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gc2VsZi50YW1hbm9BY3R1YWwgLSAxXFxuICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvLnBvcCgpXFxuICAgICAgICBzZWxmLmluZmlsdEFiYWpvKDEpXFxuICAgICAgICByZXR1cm4gdmFsb3JTYWNhZG9cXG4gICAgICAgIFxcbiAgICBkZWYgZXN0YVZhY2lvKHNlbGYpOlxcbiAgICAgICAgaWYgdGFtYW5vQWN0dWFsID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvX19pbml0X18ucHlcIjpcIlxcbiNfX2FsbF9fID0gW1xcXCJwaWxhXFxcIl1cXG5cXG5cXG5mcm9tIC5waWxhIGltcG9ydCBQaWxhXFxuZnJvbSAuY29sYSBpbXBvcnQgQ29sYVxcbmZyb20gLmNvbGFkb2JsZSBpbXBvcnQgQ29sYURvYmxlXFxuXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvY29sYS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiNcXG4jY29sYS5weVxcblxcbmNsYXNzIENvbGE6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaXRlbXMgPSBbXVxcblxcbiAgICBkZWYgZXN0YVZhY2lhKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIGFncmVnYXIoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmluc2VydCgwLGl0ZW0pXFxuXFxuICAgIGRlZiBhdmFuemFyKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHRhbWFubyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYmFzaWNhcy9jb2xhZG9ibGUucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jIFxcbiNjb2xhZG9ibGUucHlcXG5cXG5jbGFzcyBDb2xhRG9ibGU6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaXRlbXMgPSBbXVxcblxcbiAgICBkZWYgZXN0YVZhY2lhKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIGFncmVnYXJGcmVudGUoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgYWdyZWdhckZpbmFsKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5pbnNlcnQoMCxpdGVtKVxcblxcbiAgICBkZWYgcmVtb3ZlckZyZW50ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiByZW1vdmVyRmluYWwoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoMClcXG5cXG4gICAgZGVmIHRhbWFubyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYmFzaWNhcy9waWxhLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jcGlsYS5weVxcblxcbmNsYXNzIFBpbGE6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaXRlbXMgPSBbXVxcblxcbiAgICBkZWYgZXN0YVZhY2lhKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIGluY2x1aXIoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgZXh0cmFlcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBpbnNwZWNjaW9uYXIoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtc1tsZW4oc2VsZi5pdGVtcyktMV1cXG5cXG4gICAgZGVmIHRhbWFubyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvZ3JhZm9zL19faW5pdF9fLnB5XCI6XCJcXG5cXG5mcm9tIC5ncmFmb0FkeSBpbXBvcnQgR3JhZm9cXG5mcm9tIC5ncmFmb0FkeSBpbXBvcnQgVmVydGljZVxcbmZyb20gLmNvbGFQcmlvcmlkYWQgaW1wb3J0IENvbGFQcmlvcmlkYWRcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvZ3JhZm9zL2NvbGFQcmlvcmlkYWQucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jIFxcbiNjb2xhUHJpb3JpZGFkLnB5XFxuXFxuY2xhc3MgQ29sYVByaW9yaWRhZDpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvID0gWygwLDApXVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSAwXFxuXFxuICAgIGRlZiBjb25zdHJ1aXJNb250aWN1bG8oc2VsZix1bmFMaXN0YSk6XFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IGxlbih1bmFMaXN0YSlcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3VsbyA9IFsoMCwwKV1cXG4gICAgICAgIGZvciBpIGluIHVuYUxpc3RhOlxcbiAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsby5hcHBlbmQoaSlcXG4gICAgICAgIGkgPSBsZW4odW5hTGlzdGEpIC8vIDIgICAgICAgICAgICBcXG4gICAgICAgIHdoaWxlIChpID4gMCk6XFxuICAgICAgICAgICAgc2VsZi5pbmZpbHRBYmFqbyhpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaW5maWx0QWJham8oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgaG0gPSBzZWxmLmhpam9NaW4oaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1bMF0gPiBzZWxmLmFycmVnbG9Nb250aWN1bG9baG1dWzBdOlxcbiAgICAgICAgICAgICAgICB0bXAgPSBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1cXG4gICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2htXVxcbiAgICAgICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG9baG1dID0gdG1wXFxuICAgICAgICAgICAgaSA9IGhtXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaGlqb01pbihzZWxmLGkpOlxcbiAgICAgICAgaWYgaSoyID4gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgcmV0dXJuIC0xXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGkqMiArIDEgPiBzZWxmLnRhbWFub0FjdHVhbDpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkqMlxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpKjJdWzBdIDwgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kqMisxXVswXTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjIrMVxcblxcbiAgICBkZWYgaW5maWx0QXJyaWJhKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpXVswXSA8IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpLy8yXVswXTpcXG4gICAgICAgICAgICAgICB0bXAgPSBzZWxmLmFycmVnbG9Nb250aWN1bG9baS8vMl1cXG4gICAgICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG9baS8vMl0gPSBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1cXG4gICAgICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG9baV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaS8vMlxcbiBcXG4gICAgZGVmIGluc2VydGFyKHNlbGYsayk6XFxuICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8uYXBwZW5kKGspXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsICsgMVxcbiAgICAgICAgc2VsZi5pbmZpbHRBcnJpYmEoc2VsZi50YW1hbm9BY3R1YWwpXFxuXFxuICAgIGRlZiBlbGltaW5hck1pbihzZWxmKTpcXG4gICAgICAgIHZhbG9yU2FjYWRvID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvWzFdWzFdXFxuICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG9bMV0gPSBzZWxmLmFycmVnbG9Nb250aWN1bG9bc2VsZi50YW1hbm9BY3R1YWxdXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsIC0gMVxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvLnBvcCgpXFxuICAgICAgICBzZWxmLmluZmlsdEFiYWpvKDEpXFxuICAgICAgICByZXR1cm4gdmFsb3JTYWNhZG9cXG4gICAgICAgIFxcbiAgICBkZWYgZXN0YVZhY2lhKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi50YW1hbm9BY3R1YWwgPT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIGRlY3JlbWVudGFyQ2xhdmUoc2VsZix2YWxvcixudWV2byk6XFxuICAgICAgICBoZWNobyA9IEZhbHNlXFxuICAgICAgICBpID0gMVxcbiAgICAgICAgbWlDbGF2ZSA9IDBcXG4gICAgICAgIHdoaWxlIG5vdCBoZWNobyBhbmQgaSA8PSBzZWxmLnRhbWFub0FjdHVhbDpcXG4gICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1bMV0gPT0gdmFsb3I6XFxuICAgICAgICAgICAgICAgIGhlY2hvID0gVHJ1ZVxcbiAgICAgICAgICAgICAgICBtaUNsYXZlID0gaVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGkgPSBpICsgMVxcbiAgICAgICAgaWYgbWlDbGF2ZSA+IDA6XFxuICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW21pQ2xhdmVdID0gKG51ZXZvLHNlbGYuYXJyZWdsb01vbnRpY3Vsb1ttaUNsYXZlXVsxXSlcXG4gICAgICAgICAgICBzZWxmLmluZmlsdEFycmliYShtaUNsYXZlKVxcbiAgICAgICAgICAgIFxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsdmVydGljZSk6XFxuICAgICAgICBmb3IgcGFyZWphIGluIHNlbGYuYXJyZWdsb01vbnRpY3VsbzpcXG4gICAgICAgICAgICBpZiBwYXJlamFbMV0gPT0gdmVydGljZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIHJldHVybiBGYWxzZSAgICAgXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2dyYWZvcy9ncmFmb0FkeS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiNcXG4jZ3JhZm9BZHkucHlcXG5cXG5cXG5pbXBvcnQgc3lzXFxuXFxuY2xhc3MgR3JhZm86XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYubGlzdGFWZXJ0aWNlcyA9IHt9XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gMFxcbiAgICAgICAgXFxuICAgIGRlZiBhZ3JlZ2FyVmVydGljZShzZWxmLGNsYXZlKTpcXG4gICAgICAgIHNlbGYubnVtVmVydGljZXMgPSBzZWxmLm51bVZlcnRpY2VzICsgMVxcbiAgICAgICAgbnVldm9WZXJ0aWNlID0gVmVydGljZShjbGF2ZSlcXG4gICAgICAgIHNlbGYubGlzdGFWZXJ0aWNlc1tjbGF2ZV0gPSBudWV2b1ZlcnRpY2VcXG4gICAgICAgIHJldHVybiBudWV2b1ZlcnRpY2VcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVyVmVydGljZShzZWxmLG4pOlxcbiAgICAgICAgaWYgbiBpbiBzZWxmLmxpc3RhVmVydGljZXM6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYubGlzdGFWZXJ0aWNlc1tuXVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsbik6XFxuICAgICAgICByZXR1cm4gbiBpbiBzZWxmLmxpc3RhVmVydGljZXNcXG4gICAgXFxuICAgIGRlZiBhZ3JlZ2FyQXJpc3RhKHNlbGYsZGUsYSxjb3N0bz0wKTpcXG4gICAgICAgICAgICBpZiBkZSBub3QgaW4gc2VsZi5saXN0YVZlcnRpY2VzOlxcbiAgICAgICAgICAgICAgICBudiA9IHNlbGYuYWdyZWdhclZlcnRpY2UoZGUpXFxuICAgICAgICAgICAgaWYgYSBub3QgaW4gc2VsZi5saXN0YVZlcnRpY2VzOlxcbiAgICAgICAgICAgICAgICBudiA9IHNlbGYuYWdyZWdhclZlcnRpY2UoYSlcXG4gICAgICAgICAgICBzZWxmLmxpc3RhVmVydGljZXNbZGVdLmFncmVnYXJWZWNpbm8oc2VsZi5saXN0YVZlcnRpY2VzW2FdLGNvc3RvKVxcbiAgICBcXG4gICAgZGVmIG9idGVuZXJWZXJ0aWNlcyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBsaXN0KHNlbGYubGlzdGFWZXJ0aWNlcy5rZXlzKCkpXFxuICAgICAgICBcXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5saXN0YVZlcnRpY2VzLnZhbHVlcygpKVxcbiAgICAgICAgICAgICAgICBcXG5jbGFzcyBWZXJ0aWNlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZixjbGF2ZSk6XFxuICAgICAgICBzZWxmLmlkID0gY2xhdmVcXG4gICAgICAgIHNlbGYuY29uZWN0YWRvQSA9IHt9XFxuICAgICAgICBzZWxmLmNvbG9yID0gJ2JsYW5jbydcXG4gICAgICAgIHNlbGYuZGlzdCA9IHN5cy5tYXhzaXplXFxuICAgICAgICBzZWxmLnByZWRlY2Vzb3IgPSBOb25lXFxuICAgICAgICBzZWxmLmRlc2MgPSAwXFxuICAgICAgICBzZWxmLmZpbiA9IDBcXG5cXG4gICAgIyBkZWYgX19sdF9fKHNlbGYsbyk6XFxuICAgICMgICAgIHJldHVybiBzZWxmLmlkIDwgby5pZFxcbiAgICBcXG4gICAgZGVmICBhZ3JlZ2FyVmVjaW5vKHNlbGYsdmVjaW5vLHBvbmRlcmFjaW9uPTApOlxcbiAgICAgICAgc2VsZi5jb25lY3RhZG9BW3ZlY2lub10gPSBwb25kZXJhY2lvblxcbiAgICAgICAgXFxuICAgIGRlZiBhc2lnbmFyQ29sb3Ioc2VsZixjb2xvcik6XFxuICAgICAgICBzZWxmLmNvbG9yID0gY29sb3JcXG4gICAgICAgIFxcbiAgICBkZWYgYXNpZ25hckRpc3RhbmNpYShzZWxmLGQpOlxcbiAgICAgICAgc2VsZi5kaXN0ID0gZFxcblxcbiAgICBkZWYgYXNpZ25hclByZWRlY2Vzb3Ioc2VsZixwKTpcXG4gICAgICAgIHNlbGYucHJlZGVjZXNvciA9IHBcXG5cXG4gICAgZGVmIGFzaWduYXJEZXNjdWJyaW1pZW50byhzZWxmLHRpZW1wb0Rlc2N1YnJpbWllbnRvKTpcXG4gICAgICAgIHNlbGYuZGVzYyA9IHRpZW1wb0Rlc2N1YnJpbWllbnRvXFxuICAgICAgICBcXG4gICAgZGVmIGFzaWduYXJGaW5hbGl6YWNpb24oc2VsZix0aWVtcG9GaW5hbGl6YWNpb24pOlxcbiAgICAgICAgc2VsZi5maW4gPSB0aWVtcG9GaW5hbGl6YWNpb25cXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckZpbmFsaXphY2lvbihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmZpblxcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyRGVzY3VicmltaWVudG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5kZXNjXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJQcmVkZWNlc29yKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucHJlZGVjZXNvclxcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyRGlzdGFuY2lhKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGlzdFxcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyQ29sb3Ioc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb2xvclxcbiAgICBcXG4gICAgZGVmIG9idGVuZXJDb25leGlvbmVzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29uZWN0YWRvQS5rZXlzKClcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lclBvbmRlcmFjaW9uKHNlbGYsdmVjaW5vKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbmVjdGFkb0FbdmVjaW5vXVxcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYuaWQpICsgXFxcIjpjb2xvciBcXFwiICsgc2VsZi5jb2xvciArIFxcXCI6ZGVzYyBcXFwiICsgc3RyKHNlbGYuZGVzYykgKyBcXFwiOmZpbiBcXFwiICsgc3RyKHNlbGYuZmluKSArIFxcXCI6ZGlzdGFuY2lhIFxcXCIgKyBzdHIoc2VsZi5kaXN0KSArIFxcXCI6cHJlZGVjZXNvciBcXFxcblxcXFx0W1xcXCIgKyBzdHIoc2VsZi5wcmVkZWNlc29yKSsgXFxcIl1cXFxcblxcXCJcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVySWQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pZFxcblwiLFwic3JjL2xpYi9xdW9wcmkucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInF1b3ByaSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JhbmRvbS5qc1wiOlwidmFyIE1lcnNlbm5lVHdpc3Rlcj1mdW5jdGlvbihhKXthPT1udWxsJiYoYT1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PUFycmF5KHRoaXMuTiksdGhpcy5tdGk9dGhpcy5OKzEsdGhpcy5pbml0X2dlbnJhbmQoYSl9O01lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuaW5pdF9nZW5yYW5kPWZ1bmN0aW9uKGEpe2Zvcih0aGlzLm10WzBdPWE+Pj4wLHRoaXMubXRpPTE7dGhpcy5tdGk8dGhpcy5OO3RoaXMubXRpKyspe3ZhciBhPXRoaXMubXRbdGhpcy5tdGktMV1edGhpcy5tdFt0aGlzLm10aS0xXT4+PjMwO3RoaXMubXRbdGhpcy5tdGldPSgxODEyNDMzMjUzKigoNDI5NDkwMTc2MCZhKT4+PjE2KTw8MTYpKzE4MTI0MzMyNTMqKDY1NTM1JmEpK3RoaXMubXRpLHRoaXMubXRbdGhpcy5tdGldPj4+PTB9fSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGY7Zm9yKHRoaXMuaW5pdF9nZW5yYW5kKDE5NjUwMjE4KSxkPTEsZT0wLGY9dGhpcy5OPmI/dGhpcy5OOmI7ZjtmLS0pe3ZhciBnPXRoaXMubXRbZC0xXV50aGlzLm10W2QtMV0+Pj4zMDt0aGlzLm10W2RdPSh0aGlzLm10W2RdXigxNjY0NTI1KigoNDI5NDkwMTc2MCZnKT4+PjE2KTw8MTYpKzE2NjQ1MjUqKDY1NTM1JmcpKSthW2VdK2UsdGhpcy5tdFtkXT4+Pj0wLGQrKyxlKyssZD49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxkPTEpLGU+PWImJihlPTApfWZvcihmPXRoaXMuTi0xO2Y7Zi0tKXt2YXIgZz10aGlzLm10W2QtMV1edGhpcy5tdFtkLTFdPj4+MzA7dGhpcy5tdFtkXT0odGhpcy5tdFtkXV4oMTU2NjA4Mzk0MSooKDQyOTQ5MDE3NjAmZyk+Pj4xNik8PDE2KSsxNTY2MDgzOTQxKig2NTUzNSZnKSktZCx0aGlzLm10W2RdPj4+PTAsZCsrLGQ+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sZD0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9pbnQzMj1mdW5jdGlvbigpe3ZhciBhLGI9WzAsdGhpcy5NQVRSSVhfQV07aWYodGhpcy5tdGk+PXRoaXMuTil7dmFyIGQ7Zm9yKHRoaXMubXRpPT10aGlzLk4rMSYmdGhpcy5pbml0X2dlbnJhbmQoNTQ4OSksZD0wO2Q8dGhpcy5OLXRoaXMuTTtkKyspYT10aGlzLm10W2RdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10W2QrMV0mdGhpcy5MT1dFUl9NQVNLLHRoaXMubXRbZF09dGhpcy5tdFtkK3RoaXMuTV1eYT4+PjFeYlsxJmFdO2Zvcig7ZDx0aGlzLk4tMTtkKyspYT10aGlzLm10W2RdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10W2QrMV0mdGhpcy5MT1dFUl9NQVNLLHRoaXMubXRbZF09dGhpcy5tdFtkKyh0aGlzLk0tdGhpcy5OKV1eYT4+PjFeYlsxJmFdO2E9dGhpcy5tdFt0aGlzLk4tMV0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbMF0mdGhpcy5MT1dFUl9NQVNLLHRoaXMubXRbdGhpcy5OLTFdPXRoaXMubXRbdGhpcy5NLTFdXmE+Pj4xXmJbMSZhXSx0aGlzLm10aT0wfXJldHVybiBhPXRoaXMubXRbdGhpcy5tdGkrK10sYV49YT4+PjExLGFePTI2MzY5Mjg2NDAmYTw8NyxhXj00MDIyNzMwNzUyJmE8PDE1LGFePWE+Pj4xOCxhPj4+MH0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5nZW5yYW5kX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2VucmFuZF9pbnQzMigpPj4+MX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5nZW5yYW5kX3JlYWwxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2VucmFuZF9pbnQzMigpKigxLzQyOTQ5NjcyOTUpfSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLnJhbmRvbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlbnJhbmRfaW50MzIoKSooMS80Mjk0OTY3Mjk2KX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5nZW5yYW5kX3JlYWwzPWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuZ2VucmFuZF9pbnQzMigpKy41KSooMS80Mjk0OTY3Mjk2KX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5nZW5yYW5kX3JlczUzPWZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5nZW5yYW5kX2ludDMyKCk+Pj41LGE9dGhpcy5nZW5yYW5kX2ludDMyKCk+Pj42O3JldHVybig2NzEwODg2NCpkK2EpKigxLzkwMDcxOTkyNTQ3NDA5OTIpfTt2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT1NYXRoLmxvZyxiPU1hdGguc3FydCxkPXt9LGU9bmV3IE1lcnNlbm5lVHdpc3RlcixmPXZvaWQgMDtkLnNlZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2VlZFxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLGE9U2suYnVpbHRpbi5hc251bSQoYSksZT0wPGFyZ3VtZW50cy5sZW5ndGg/bmV3IE1lcnNlbm5lVHdpc3RlcihhKTpuZXcgTWVyc2VubmVUd2lzdGVyLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGQucmFuZG9tPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwicmFuZG9tXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUuZ2VucmFuZF9yZXM1MygpKX0pO3ZhciBnPWZ1bmN0aW9uKGEpe3JldHVybiAwfGF9LGg9ZnVuY3Rpb24oYSxiLGQpe3ZhciBmLGgsaTtpZighU2suYnVpbHRpbi5jaGVja0ludChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJub24taW50ZWdlciBmaXJzdCBhcmd1bWVudCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZih2b2lkIDA9PT1iKXJldHVybiBpPWcoZS5nZW5yYW5kX3JlczUzKCkqYSksbmV3IFNrLmJ1aWx0aW4uaW50XyhpKTtpZighU2suYnVpbHRpbi5jaGVja0ludChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJub24taW50ZWdlciBzdG9wIGZvciByYW5kcmFuZ2UoKVxcXCIpO2lmKHZvaWQgMD09PWQmJihkPTEpLGY9Yi1hLDE9PWQmJjA8ZilyZXR1cm4gaT1hK2coZS5nZW5yYW5kX3JlczUzKCkqZiksbmV3IFNrLmJ1aWx0aW4uaW50XyhpKTtpZigxPT1kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImVtcHR5IHJhbmdlIGZvciByYW5kcmFuZ2UoKSAoXFxcIithK1xcXCIsIFxcXCIrYitcXFwiLCBcXFwiK2YrXFxcIilcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja0ludChkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJub24taW50ZWdlciBzdGVwIGZvciByYW5kcmFuZ2UoKVxcXCIpO2lmKDA8ZCloPWcoKGYrZC0xKS9kKTtlbHNlIGlmKDA+ZCloPWcoKGYrZCsxKS9kKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcInplcm8gc3RlcCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZigwPj1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImVtcHR5IHJhbmdlIGZvciByYW5kcmFuZ2UoKVxcXCIpO3JldHVybiBpPWErZCpnKGUuZ2VucmFuZF9yZXM1MygpKmgpLG5ldyBTay5idWlsdGluLmludF8oaSl9O2QucmFuZGludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGQsZSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJhbmRpbnRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGU9U2suYnVpbHRpbi5hc251bSQoZSksaChkLGUrMSl9KSxkLnJhbmRyYW5nZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwicmFuZHJhbmdlXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMyksYT1Tay5idWlsdGluLmFzbnVtJChhKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksaChhLGIsZCl9KSxkLnVuaWZvcm09bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihkLGYpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInVuaWZvcm1cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGY9U2suYnVpbHRpbi5hc251bSQoZik7dmFyIGc9ZS5nZW5yYW5kX3JlczUzKCk7cmV0dXJuIGM9ZCtnKihmLWQpLG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX0pLGQudHJpYW5ndWxhcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsZCxmKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ0cmlhbmd1bGFyXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwibG93XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJoaWdoXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGQpKTt2YXIgZyxoLGk7cmV0dXJuIGE9U2suYnVpbHRpbi5hc251bSQoYSksZD1Tay5idWlsdGluLmFzbnVtJChkKSxhPmQmJihpPWEsYT1kLGQ9aSksdm9pZCAwPT09Znx8Zj09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9mPShkLWEpLzI6KFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcIm1vZGVcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZikpLGY9U2suYnVpbHRpbi5hc251bSQoZikpLGc9ZS5nZW5yYW5kX3JlczUzKCksaD1nPChmLWEpLyhkLWEpP2ErYihnKihkLWEpKihmLWEpKTpkLWIoKDEtZykqKGQtYSkqKGQtZikpLG5ldyBTay5idWlsdGluLmZsb2F0XyhoKX0pO3ZhciBpPWZ1bmN0aW9uKGQsZyl7dmFyIGssbCxtLG4sbyxoPU1hdGguc2luLGk9TWF0aC5jb3Msaj1NYXRoLlBJO3JldHVybiB2b2lkIDA9PT1mPyhrPWUuZ2VucmFuZF9yZXM1MygpLGw9ZS5nZW5yYW5kX3JlczUzKCksbT1iKC0yKmEoaykpLG49MipqKmwsbz1tKmkobiksZj1tKmgobikpOihvPWYsZj12b2lkIDApLGQrZypvfTtyZXR1cm4gZC5nYXVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdhdXNzXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwibXVcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInNpZ21hXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGI9U2suYnVpbHRpbi5hc251bSQoYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGkoYSxiKSl9KSxkLm5vcm1hbHZhcmlhdGU9ZC5nYXVzcyxkLmxvZ25vcm12YXJpYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgZD1NYXRoLmV4cDtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibG9nbm9ybXZhcmlhdGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJtdVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwic2lnbWFcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpLGE9U2suYnVpbHRpbi5hc251bSQoYSksYj1Tay5idWlsdGluLmFzbnVtJChiKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZChpKGEsYikpKX0pLGQuZXhwb3ZhcmlhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJleHBvdmFyaWF0ZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImxhbWJkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO3ZhciBkPWUuZ2VucmFuZF9yZXM1MygpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oLWEoZCkvYil9KSxkLmNob2ljZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImNob2ljZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInNlcVxcXCIsXFxcInNlcXVlbmNlXFxcIixTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYSkpLHZvaWQgMCE9PWEuc3EkbGVuZ3RoKXt2YXIgYj1uZXcgU2suYnVpbHRpbi5pbnRfKGcoZS5nZW5yYW5kX3JlczUzKCkqYS5zcSRsZW5ndGgoKSkpO3JldHVybiBhLm1wJHN1YnNjcmlwdChiKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm9iamVjdCBoYXMgbm8gbGVuZ3RoXFxcIil9KSxkLnNodWZmbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzaHVmZmxlXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcInNlcXVlbmNlXFxcIixTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYSkpLGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmxpc3Qpe2NvbnN0IGg9YS52O2Zvcih2YXIgYj1oLmxlbmd0aC0xOzA8YjtiLT0xKXt2YXIgZD1nKGUuZ2VucmFuZF9yZXM1MygpKihiKzEpKSxmPWhbZF07aFtkXT1oW2JdLGhbYl09Zn19ZWxzZSBpZih2b2lkIDA9PT1hLnNxJGxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm9iamVjdCBoYXMgbm8gbGVuZ3RoXFxcIik7ZWxzZSBpZih2b2lkIDAhPT1hLm1wJGFzc19zdWJzY3JpcHQpZm9yKHZhciBkLGI9YS5zcSRsZW5ndGgoKS0xOzA8YjtiLT0xKXtkPW5ldyBTay5idWlsdGluLmludF8oZyhlLmdlbnJhbmRfcmVzNTMoKSooYisxKSkpLGI9bmV3IFNrLmJ1aWx0aW4uaW50XyhiKTt2YXIgZj1hLm1wJHN1YnNjcmlwdChkKTthLm1wJGFzc19zdWJzY3JpcHQoZCxhLm1wJHN1YnNjcmlwdChiKSksYS5tcCRhc3Nfc3Vic2NyaXB0KGIsZil9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm9iamVjdCBpcyBpbW11dGFibGVcXFwiKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSksZC5zYW1wbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBmLGcsaCxsLG0sZD1NYXRoLmZsb29yO2ZvcihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzYW1wbGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJwb3B1bGF0aW9uXFxcIixcXFwiaXRlcmFibGVcXFwiLFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwia1xcXCIsXFxcImludGVnZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQoYikpLGI9U2suYnVpbHRpbi5hc251bSQoYiksbT1bXSxoPVNrLmFic3RyLml0ZXIoYSksKGY9MCxsPWgudHAkaXRlcm5leHQoKSk7dm9pZCAwIT09bDtmKyssbD1oLnRwJGl0ZXJuZXh0KCkpZz1kKGUuZ2VucmFuZF9yZXM1MygpKihmKzEpKSxmPGI/KGc8ZiYmKG1bZl09bVtnXSksbVtnXT1sKTpnPGImJihtW2ddPWwpO2lmKGY8Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJzYW1wbGUgbGFyZ2VyIHRoYW4gcG9wdWxhdGlvblxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KG0pfSksZH07XCIsXCJzcmMvbGliL3JlLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24obmFtZSl7dmFyIHZhbGlkR3JvdXBzLGNvbnZlcnQsZ2V0RmxhZ3MsX3NwbGl0LF9maW5kYWxsLG1hdGNob2JqLF9zZWFyY2gsX21hdGNoLHJlZ2V4b2JqLG1vZD17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJyZVxcXCIpfTtyZXR1cm4gbW9kLkk9Mixtb2QuSUdOT1JFQ0FTRT0yLG1vZC5NPTgsbW9kLk1VTFRJTElORT04LHZhbGlkR3JvdXBzPVtcXFwiKD86XFxcIixcXFwiKD89XFxcIixcXFwiKD8hXFxcIl0sY29udmVydD1mdW5jdGlvbihhKXt2YXIgYixjLGQ7aWYoYz1hLm1hdGNoKC9cXFxcKFxcXFw/Li9nKSxjKWZvcihkPTA7ZDxjLmxlbmd0aDtkKyspaWYoLTE9PXZhbGlkR3JvdXBzLmluZGV4T2YoY1tkXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiRGlzYWxsb3dlZCBncm91cCBpbiBwYXR0ZXJuOiAnXFxcIitjW2RdK1xcXCInXFxcIik7cmV0dXJuIGI9YS5yZXBsYWNlKFxcXCIvXFxcXFxcXFwvZ1xcXCIsXFxcIlxcXFxcXFxcXFxcXFxcXFxcXFwiKSxiPWEucmVwbGFjZSgvKFteXFxcXFxcXFxdKXssKD8hW15cXFxcW10qXFxcXF0pL2csXFxcIiQxezAsXFxcIiksYn0sZ2V0RmxhZ3M9ZnVuY3Rpb24oYSl7dmFyIGI9XFxcImdcXFwiO3JldHVybihhJm1vZC5JR05PUkVDQVNFKT09bW9kLklHTk9SRUNBU0UmJihiKz1cXFwiaVxcXCIpLChhJm1vZC5NVUxUSUxJTkUpPT1tb2QuTVVMVElMSU5FJiYoYis9XFxcIm1cXFwiKSxifSxfc3BsaXQ9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqLGssbCxtO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNwbGl0XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJtYXhzcGxpdCBtdXN0IGJlIGEgbnVtYmVyXFxcIik7aWYodm9pZCAwPT09ZCYmKGQ9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7Zm9yKGM9U2suYnVpbHRpbi5hc251bSQoYyksZT1Tay5mZmkudW53cmFwbyhhKSxmPVNrLmZmaS51bndyYXBvKGIpLGU9Y29udmVydChlKSxnPW51bGwhPT1lLm1hdGNoKC9eXFxcXCguKlxcXFwpJC8pLGg9Z2V0RmxhZ3MoZCksaT1uZXcgUmVnRXhwKGUsaCksaj1bXSxrLGw9MCxtPTA7bnVsbCE9KGs9aS5leGVjKGYpKSYmay5pbmRleCE9PWkubGFzdEluZGV4JiYoai5wdXNoKG5ldyBTay5idWlsdGluLnN0cihmLnN1YnN0cmluZyhsLGsuaW5kZXgpKSksZyYmai5wdXNoKG5ldyBTay5idWlsdGluLnN0cihrWzBdKSksbD1pLmxhc3RJbmRleCxtKz0xLCEoYyYmbT49YykpOyk7cmV0dXJuIGoucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZi5zdWJzdHJpbmcobCkpKSxuZXcgU2suYnVpbHRpbi5saXN0KGopfSxfc3BsaXQuY29fdmFybmFtZXM9W1xcXCJwYXR0ZXJuXFxcIixcXFwic3RyaW5nXFxcIixcXFwibWF4c3BsaXRcXFwiLFxcXCJmbGFnc1xcXCJdLF9zcGxpdC4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCksbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0sbW9kLnNwbGl0PW5ldyBTay5idWlsdGluLmZ1bmMoX3NwbGl0KSxfZmluZGFsbD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxqO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImZpbmRhbGxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic3RyaW5nIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz0wKSwhU2suYnVpbHRpbi5jaGVja051bWJlcihjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZsYWdzIG11c3QgYmUgYSBudW1iZXJcXFwiKTtpZihkPVNrLmZmaS51bndyYXBvKGEpLGU9U2suZmZpLnVud3JhcG8oYiksZD1jb252ZXJ0KGQpLGY9Z2V0RmxhZ3MoYyksZz1uZXcgUmVnRXhwKGQsZiksZC5tYXRjaCgvXFxcXCQvKSl7dmFyIGs9bmV3IFJlZ0V4cCgvXFxcXG4kLyk7ZS5tYXRjaChrKSYmKGU9ZS5zbGljZSgwLC0xKSl9Zm9yKGg9W10sajtudWxsIT0oaj1nLmV4ZWMoZSkpOyl7aWYoMj5qLmxlbmd0aCloLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGpbMF0pKTtlbHNlIGlmKDI9PWoubGVuZ3RoKWgucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoalsxXSkpO2Vsc2V7Zm9yKHZhciBsPVtdLG09MTttPGoubGVuZ3RoO20rKylsLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGpbbV0pKTtoLnB1c2gobmV3IFNrLmJ1aWx0aW4udHVwbGUobCkpfWouaW5kZXg9PT1nLmxhc3RJbmRleCYmKGcubGFzdEluZGV4Kz0xKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChoKX0sX2ZpbmRhbGwuY29fdmFybmFtZXM9W1xcXCJwYXR0ZXJuXFxcIixcXFwic3RyaW5nXFxcIixcXFwiZmxhZ3NcXFwiXSxfZmluZGFsbC4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCldLG1vZC5maW5kYWxsPW5ldyBTay5idWlsdGluLmZ1bmMoX2ZpbmRhbGwpLG1hdGNob2JqPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLnRoZW1hdGNoPWIsYS5yZT1jLGEuc3RyaW5nPWQsU2suYnVpbHRpbi5ub25lLm5vbmUkfSksYi5ncm91cHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnRoZW1hdGNoLnYuc2xpY2UoMSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfSksYi5ncm91cD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7aWYoYj12b2lkIDA9PT1iPzA6U2suYnVpbHRpbi5hc251bSQoYiksYj49YS50aGVtYXRjaC52Lmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJJbmRleCBvdXQgb2YgcmFuZ2U6IFxcXCIrYik7cmV0dXJuIGEudGhlbWF0Y2gudltiXX0pfSxtb2QuTWF0Y2hPYmplY3Q9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhtb2QsbWF0Y2hvYmosXFxcIk1hdGNoT2JqZWN0XFxcIixbXSksbW9kLl9maW5kcmU9ZnVuY3Rpb24ocmVzLHN0cmluZyl7cmVzPXJlcy5yZXBsYWNlKC8oW15cXFxcXFxcXF0peywoPyFbXlxcXFxbXSpcXFxcXSkvZyxcXFwiJDF7MCxcXFwiKTt2YXIgbWF0Y2hlcyxzaXRlbSxyZXR2YWwscmU9ZXZhbChyZXMpLHBhdHQ9L1xcXFxuJC8sc3RyPVNrLmZmaS5yZW1hcFRvSnMoc3RyaW5nKTtpZihtYXRjaGVzPXN0ci5tYXRjaChwYXR0KT9zdHIuc2xpY2UoMCwtMSkubWF0Y2gocmUpOnN0ci5tYXRjaChyZSkscmV0dmFsPW5ldyBTay5idWlsdGluLmxpc3QsbnVsbD09bWF0Y2hlcylyZXR1cm4gcmV0dmFsO2Zvcih2YXIgaT0wO2k8bWF0Y2hlcy5sZW5ndGg7KytpKXNpdGVtPW5ldyBTay5idWlsdGluLnN0cihtYXRjaGVzW2ldKSxyZXR2YWwudi5wdXNoKHNpdGVtKTtyZXR1cm4gcmV0dmFsfSxfc2VhcmNoPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNlYXJjaFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwicGF0dGVybiBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzdHJpbmcgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO3JldHVybihlPVxcXCIvXFxcIithLnYucmVwbGFjZSgvXFxcXC8vZyxcXFwiXFxcXFxcXFwvXFxcIikrXFxcIi9cXFwiLGxzdD1tb2QuX2ZpbmRyZShlLGIpLDE+bHN0LnYubGVuZ3RoKT9Tay5idWlsdGluLm5vbmUubm9uZSQ6KGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG1vZC5NYXRjaE9iamVjdCxbbHN0LGEsYl0pLGQpfSxfc2VhcmNoLmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcImZsYWdzXFxcIl0sX3NlYXJjaC4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCldLG1vZC5zZWFyY2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhfc2VhcmNoKSxfbWF0Y2g9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibWF0Y2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic3RyaW5nIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz0wKSwhU2suYnVpbHRpbi5jaGVja051bWJlcihjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZsYWdzIG11c3QgYmUgYSBudW1iZXJcXFwiKTtyZXR1cm4ocGF0PVNrLmZmaS5yZW1hcFRvSnMoYSksZT1cXFwiL15cXFwiK3BhdC5yZXBsYWNlKC9cXFxcLy9nLFxcXCJcXFxcXFxcXC9cXFwiKStcXFwiL1xcXCIsbHN0PW1vZC5fZmluZHJlKGUsYiksMT5Tay5mZmkucmVtYXBUb0pzKGxzdCkubGVuZ3RoKT9Tay5idWlsdGluLm5vbmUubm9uZSQ6KGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG1vZC5NYXRjaE9iamVjdCxbbHN0LGEsYl0pLGQpfSxfbWF0Y2guY29fdmFybmFtZXM9W1xcXCJwYXR0ZXJuXFxcIixcXFwic3RyaW5nXFxcIixcXFwiZmxhZ3NcXFwiXSxfbWF0Y2guJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2QubWF0Y2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhfbWF0Y2gpLHJlZ2V4b2JqPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZyxoO2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEucmU9YixhLmZsYWdzPXZvaWQgMD09PWM/MDpjLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1cXFwicmUuY29tcGlsZSgnXFxcIitTay5mZmkucmVtYXBUb0pzKGEucmUpK1xcXCInKVxcXCI7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoYi5zdWJzdHJpbmcoMCwyMTIpKX0pLGIuX19zdHJfXz1oLGIuX19yZXByX189aCxjPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1Tay5mZmkucmVtYXBUb0pzKGEpLGU9bnVsbD09Yj8wOlNrLmZmaS5yZW1hcFRvSnMoYiksZj1udWxsPT1jP2QubGVuZ3RoOlNrLmZmaS5yZW1hcFRvSnMoYyk7cmV0dXJuXFxcIl5cXFwiPT1lJiYoZT1kLmluZGV4T2YoXFxcIlxcXFxuXFxcIikrMSksbnVsbD09PWYmJihmPWQubGVuZ3RoKSxTay5mZmkucmVtYXBUb1B5KGQuc3Vic3RyaW5nKGUsZikpfSxkPWZ1bmN0aW9uKGEsYixkLGUpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNlYXJjaFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpO3ZhciBmPWMoYixkLGUpO3JldHVybiBfc2VhcmNoKGEucmUsZixhLmZsYWdzKX0sZC5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJwb3NcXFwiLFxcXCJlbmRwb3NcXFwiXSxkLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdLGIuc2VhcmNoPW5ldyBTay5idWlsdGluLmZ1bmMoZCksZT1mdW5jdGlvbihhLGIsZCxlKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJtYXRjaFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpO3ZhciBmPWMoYixkLGUpO3JldHVybiBfbWF0Y2goYS5yZSxmLGEuZmxhZ3MpfSxlLmNvX3Zhcm5hbWVzPVtcXFwic2VsZlxcXCIsXFxcInN0cmluZ1xcXCIsXFxcInBvc1xcXCIsXFxcImVuZHBvc1xcXCJdLGUuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0sYi5tYXRjaD1uZXcgU2suYnVpbHRpbi5mdW5jKGUpLGY9ZnVuY3Rpb24oYSxiLGMpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNwbGl0XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksdm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJtYXhzcGxpdCBtdXN0IGJlIGFuIGludGVnZXJcXFwiKTtyZXR1cm4gX3NwbGl0KGEucmUsYixjLGEuZmxhZ3MpfSxmLmNvX3Zhcm5hbWVzPVtcXFwic2VsZlxcXCIsXFxcInN0cmluZ1xcXCIsXFxcIm1heHNwbGl0XFxcIl0sZi4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCldLGIuc3BsaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmKSxnPWZ1bmN0aW9uKGEsYixkLGUpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImZpbmRhbGxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KTt2YXIgZj1jKGIsZCxlKTtyZXR1cm4gX2ZpbmRhbGwoYS5yZSxmLGEuZmxhZ3MpfSxnLmNvX3Zhcm5hbWVzPVtcXFwic2VsZlxcXCIsXFxcInN0cmluZ1xcXCIsXFxcInBvc1xcXCIsXFxcImVuZHBvc1xcXCJdLGcuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0sYi5maW5kYWxsPW5ldyBTay5idWlsdGluLmZ1bmMoZyl9LG1vZC5SZWdleE9iamVjdD1Tay5taXNjZXZhbC5idWlsZENsYXNzKG1vZCxyZWdleG9iaixcXFwiUmVnZXhPYmplY3RcXFwiLFtdKSxtb2QuY29tcGlsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiY29tcGlsZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDIpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwicGF0dGVybiBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YiYmKGI9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7cmV0dXJuIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG1vZC5SZWdleE9iamVjdCxbYSxiXSksY30pLG1vZC5wdXJnZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7fSksbW9kfTtcIixcInNyYy9saWIvcmVwci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicmVwciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JlcXVlc3RzLnB5XCI6XCIjIG1vc3QgcmVzdHJpY3RlZCB2ZXJzaW9uXFxuXFxcIlxcXCJcXFwiXFxuVGhpcyBzb2x1dGlvbiB3b3JrcyBpbiBydW5lc3RvbmUgLSBob3dldmVyIGl0IGlzIG11Y2ggbW9yZSBsaW1pdGVkLlxcbkFuIGVycm9yIGRvZXMgbm90IG9jY3VyIGluIHRoZSBzYW1lIHdheSBpbiB0aGUgdGV4dGJvb2sgYXMgaXQgZG9lc1xcbmZvciB0aGUgY29tbWFuZCBsaW5lLiBTaW5jZSBIVFRQRXJyb3IgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgaW5cXG5SdW5lc3RvbmUsIEkgaGFkIHRvIGNoYW5nZSB0aGUgZXhjZXB0aW9uLlxcbkRlY29kZSBhbmQgRW5jb2RlIGFyZSBub3QgYXZhaWxhYmxlIGluIFJ1bmVzdG9uZSwgc28gdGhlcmUgbWlnaHQgYmVcXG5pc3N1ZXMgd2l0aCByZXBvbnNlcy5cXG5Eb2VzIG5vdCB1c2UgdGhlIHN0YXR1cyBhdHRyaWJ1dGUgZm9yIHVybG9wZW4sIHdvdWxkIGJlIG5pY2UgdG8gaGF2ZVxcbnRoYXQgYmFjay5cXG5Eb2VzIG5vdCB3b3JrIG9uIHJlZ3VsYXIgd2ViIHBhZ2VzIChsaWtlIGdvb2dsZSBvciB0aGUgbWljaGlnYW4gZGFpbHkpIGJlY2F1c2Ugb2YgY3Jvc3Mtc2l0ZSBzY3JpcHRpbmcgbGltaXRzLlxcblxcXCJcXFwiXFxcIlxcbmZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW5cXG5pbXBvcnQganNvblxcblxcbmNsYXNzIFJlc3BvbnNlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSwgdXJsKTpcXG4gICAgICAgIHNlbGYudGV4dCA9IGRhdGFcXG4gICAgICAgIHNlbGYudXJsID0gdXJsXFxuXFxuICAgIGRlZiBqc29uKHNlbGYpOlxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKHNlbGYudGV4dClcXG4gICAgICAgIGV4Y2VwdDpcXG4gICAgICAgICAgICByZXR1cm4ge1xcXCJlcnJvclxcXCI6IFxcXCJSZXNwb25zZSBub3QgaW50ZXJwcmV0YWJsZSBhcyBqc29uLiBUcnkgcHJpbnRpbmcgdGhlIC50ZXh0IGF0dHJpYnV0ZVxcXCJ9XFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIFxcXCI8QSBSZXNwb25zZSBvYmplY3QgZm9yIHRoZSBmb2xsb3dpbmcgcmVxdWVzdDoge30+XFxcIi5mb3JtYXQoc2VsZi51cmwpXFxuXFxuXFxudXJsX3N1YnMgPSB7XFxcIiBcXFwiOiBcXFwiK1xcXCIsXFxuICAgICAgICAgICAgXFxcIiFcXFwiOiBcXFwiJTIxXFxcIixcXG4gICAgICAgICAgICAnXFxcIic6IFxcXCIlMjJcXFwiLFxcbiAgICAgICAgICAgIFxcXCIjXFxcIjogXFxcIiUyM1xcXCIsXFxuICAgICAgICAgICAgXFxcIiRcXFwiOiBcXFwiJTI0XFxcIixcXG4gICAgICAgICAgICBcXFwiJ1xcXCI6IFxcXCIlMjdcXFwiLFxcbiAgICAgICAgICAgIFxcXCIoXFxcIjogXFxcIiUyOFxcXCIsXFxuICAgICAgICAgICAgXFxcIilcXFwiOiBcXFwiJTI5XFxcIixcXG4gICAgICAgICAgICBcXFwiKlxcXCI6IFxcXCIlMkFcXFwiLFxcbiAgICAgICAgICAgIFxcXCIrXFxcIjogXFxcIiUyQlxcXCIsXFxuICAgICAgICAgICAgXFxcIixcXFwiOiBcXFwiJTJDXFxcIixcXG4gICAgICAgICAgICBcXFwiL1xcXCI6IFxcXCIlMkZcXFwiLFxcbiAgICAgICAgICAgIFxcXCI6XFxcIjogXFxcIiUzQVxcXCIsXFxuICAgICAgICAgICAgXFxcIjtcXFwiOiBcXFwiJTNCXFxcIixcXG4gICAgICAgICAgICBcXFwiPVxcXCI6IFxcXCIlM0RcXFwiLFxcbiAgICAgICAgICAgIFxcXCI/XFxcIjogXFxcIiUzRlxcXCIsXFxuICAgICAgICAgICAgXFxcIkBcXFwiOiBcXFwiJTQwXFxcIixcXG4gICAgICAgICAgICBcXFwiW1xcXCI6IFxcXCIlNUJcXFwiLFxcbiAgICAgICAgICAgIFxcXCJdXFxcIjogXFxcIiU1RFxcXCIsXFxuICAgICAgICAgICAgfVxcblxcbmRlZiBfc3Vic3Qocywgc3Vic3RpdHV0aW9ucz11cmxfc3Vicyk6XFxuICAgIHJlcyA9IFxcXCJcXFwiXFxuICAgIGZvciBjIGluIHN0cihzKTpcXG4gICAgICAgIGlmIGMgaW4gc3Vic3RpdHV0aW9uczpcXG4gICAgICAgICAgICByZXMgKz0gc3Vic3RpdHV0aW9uc1tjXVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXMgKz0gY1xcbiAgICByZXR1cm4gcmVzXFxuXFxuXFxuZGVmIHJlcXVlc3RVUkwoYmFzZXVybCwgcGFyYW1zPXt9KTpcXG4gICAgdHJ5OlxcbiAgICAgICAgaWYgbGVuKHBhcmFtcykgPT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gYmFzZXVybFxcbiAgICAgICAgY29tcGxldGVfdXJsID0gYmFzZXVybCArIFxcXCI/XFxcIlxcbiAgICAgICAgcGFpcnMgPSBbXFxcInt9PXt9XFxcIi5mb3JtYXQoX3N1YnN0KGspLCBfc3Vic3QocGFyYW1zW2tdKSkgZm9yIGsgaW4gcGFyYW1zXVxcbiAgICAgICAgY29tcGxldGVfdXJsICs9IFxcXCImXFxcIi5qb2luKHBhaXJzKVxcbiAgICAgICAgcmV0dXJuIGNvbXBsZXRlX3VybFxcbiAgICBleGNlcHQ6XFxuICAgICAgICByZXR1cm4gTm9uZVxcblxcbmRlZiBnZXQoYmFzZXVybCwgcGFyYW1zPXt9KTpcXG4gICAgZnVsbF91cmwgPSByZXF1ZXN0VVJMKGJhc2V1cmwsIHBhcmFtcylcXG4gICAgaWYgbm90IGZ1bGxfdXJsOlxcbiAgICAgICAgdGV4dF9kYXRhID0gXFxcIjxodG1sPjxib2R5PjxoMT5pbnZhbGlkIHJlcXVlc3Q8L2gxPjwvYm9keT48L2h0bWw+XFxcIlxcbiAgICAgICAgZnVsbF91cmwgPSBcXFwiQ291bGRu4oCZdCBnZW5lcmF0ZSBhIHZhbGlkIFVSTFxcXCJcXG4gICAgZWxzZTpcXG4gICAgICAgIGRhdGEgPSB1cmxvcGVuKGZ1bGxfdXJsKVxcbiAgICAgICAgdGV4dF9kYXRhID0gZGF0YS5yZWFkKCkuc3RyaXAoKVxcbiAgICAgICAgaWYgbGVuKHRleHRfZGF0YSkgPT0gMDpcXG4gICAgICAgICAgICB0ZXh0X2RhdGEgPSBcXFwiRmFpbGVkIHRvIHJldHJpZXZlIHRoYXQgVVJMXFxcIlxcbiAgICByZXR1cm4gUmVzcG9uc2UodGV4dF9kYXRhLCBmdWxsX3VybClcIixcInNyYy9saWIvcmVxdWVzdHNfd2l0aF9jYWNoaW5nLnB5XCI6XCJpbXBvcnQgcmVxdWVzdHNcXG5pbXBvcnQganNvblxcblxcblBFUk1BTkVOVF9DQUNIRV9GTkFNRSA9IFxcXCJwZXJtYW5lbnRfY2FjaGUudHh0XFxcIlxcblRFTVBfQ0FDSEVfRk5BTUUgPSBcXFwidGhpc19wYWdlX2NhY2hlLnR4dFxcXCJcXG5cXG5kZWYgX3dyaXRlX3RvX2ZpbGUoY2FjaGUsIGZuYW1lKTpcXG4gICAgd2l0aCBvcGVuKGZuYW1lLCAndycpIGFzIG91dGZpbGU6XFxuICAgICAgICBvdXRmaWxlLndyaXRlKGpzb24uZHVtcHMoY2FjaGUsIGluZGVudD0yKSlcXG5cXG5kZWYgX3JlYWRfZnJvbV9maWxlKGZuYW1lKTpcXG4gICAgdHJ5OlxcbiAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCAncicpIGFzIGluZmlsZTpcXG4gICAgICAgICAgICByZXMgPSBpbmZpbGUucmVhZCgpXFxuICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMocmVzKVxcbiAgICBleGNlcHQ6XFxuICAgICAgICByZXR1cm4ge31cXG5cXG5kZWYgYWRkX3RvX2NhY2hlKGNhY2hlX2ZpbGUsIGNhY2hlX2tleSwgY2FjaGVfdmFsdWUpOlxcbiAgICB0ZW1wX2NhY2hlID0gX3JlYWRfZnJvbV9maWxlKGNhY2hlX2ZpbGUpXFxuICAgIHRlbXBfY2FjaGVbY2FjaGVfa2V5XSA9IGNhY2hlX3ZhbHVlXFxuICAgIF93cml0ZV90b19maWxlKHRlbXBfY2FjaGUsIGNhY2hlX2ZpbGUpXFxuXFxuZGVmIGNsZWFyX2NhY2hlKGNhY2hlX2ZpbGU9VEVNUF9DQUNIRV9GTkFNRSk6XFxuICAgIF93cml0ZV90b19maWxlKHt9LCBjYWNoZV9maWxlKVxcblxcbmRlZiBtYWtlX2NhY2hlX2tleShiYXNldXJsLCBwYXJhbXNfZCwgcHJpdmF0ZV9rZXlzPVtcXFwiYXBpX2tleVxcXCIsIFxcXCJhcGlrZXlcXFwiXSk6XFxuICAgIFxcXCJcXFwiXFxcIk1ha2VzIGEgbG9uZyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBxdWVyeS5cXG4gICAgQWxwaGFiZXRpemUgdGhlIGtleXMgZnJvbSB0aGUgcGFyYW1zIGRpY3Rpb25hcnkgc28gd2UgZ2V0IHRoZSBzYW1lIG9yZGVyIGVhY2ggdGltZS5cXG4gICAgT21pdCBrZXlzIHdpdGggcHJpdmF0ZSBpbmZvLlxcXCJcXFwiXFxcIlxcbiAgICBhbHBoYWJldGl6ZWRfa2V5cyA9IHNvcnRlZChwYXJhbXNfZC5rZXlzKCkpXFxuICAgIHJlcyA9IFtdXFxuICAgIGZvciBrIGluIGFscGhhYmV0aXplZF9rZXlzOlxcbiAgICAgICAgaWYgayBub3QgaW4gcHJpdmF0ZV9rZXlzOlxcbiAgICAgICAgICAgIHJlcy5hcHBlbmQoXFxcInt9LXt9XFxcIi5mb3JtYXQoaywgcGFyYW1zX2Rba10pKVxcbiAgICByZXR1cm4gYmFzZXVybCArIFxcXCJfXFxcIi5qb2luKHJlcylcXG5cXG5kZWYgZ2V0KGJhc2V1cmwsIHBhcmFtcz17fSwgcHJpdmF0ZV9rZXlzX3RvX2lnbm9yZT1bXFxcImFwaV9rZXlcXFwiLCBcXFwiYXBpa2V5XFxcIl0sIHBlcm1hbmVudF9jYWNoZV9maWxlPVBFUk1BTkVOVF9DQUNIRV9GTkFNRSwgdGVtcF9jYWNoZV9maWxlPVRFTVBfQ0FDSEVfRk5BTUUpOlxcbiAgICBmdWxsX3VybCA9IHJlcXVlc3RzLnJlcXVlc3RVUkwoYmFzZXVybCwgcGFyYW1zKVxcbiAgICBjYWNoZV9rZXkgPSBtYWtlX2NhY2hlX2tleShiYXNldXJsLCBwYXJhbXMsIHByaXZhdGVfa2V5c190b19pZ25vcmUpXFxuICAgICMgTG9hZCB0aGUgcGVybWFuZW50IGFuZCBwYWdlLXNwZWNpZmljIGNhY2hlcyBmcm9tIGZpbGVzXFxuICAgIHBlcm1hbmVudF9jYWNoZSA9IF9yZWFkX2Zyb21fZmlsZShwZXJtYW5lbnRfY2FjaGVfZmlsZSlcXG4gICAgdGVtcF9jYWNoZSA9IF9yZWFkX2Zyb21fZmlsZSh0ZW1wX2NhY2hlX2ZpbGUpXFxuICAgIGlmIGNhY2hlX2tleSBpbiB0ZW1wX2NhY2hlOlxcbiAgICAgICAgcHJpbnQoXFxcImZvdW5kIGluIHBhZ2Utc3BlY2lmaWMgY2FjaGVcXFwiKVxcbiAgICAgICAgIyBtYWtlIGEgUmVzcG9uc2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGV4dCBmcm9tIHRoZSBjaGFuZ2UsIGFuZCB0aGUgZnVsbF91cmwgdGhhdCB3b3VsZCBoYXZlIGJlZW4gZmV0Y2hlZFxcbiAgICAgICAgcmV0dXJuIHJlcXVlc3RzLlJlc3BvbnNlKHRlbXBfY2FjaGVbY2FjaGVfa2V5XSwgZnVsbF91cmwpXFxuICAgIGVsaWYgY2FjaGVfa2V5IGluIHBlcm1hbmVudF9jYWNoZTpcXG4gICAgICAgIHByaW50KFxcXCJmb3VuZCBpbiBwZXJtYW5lbnRfY2FjaGVcXFwiKVxcbiAgICAgICAgIyBtYWtlIGEgUmVzcG9uc2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGV4dCBmcm9tIHRoZSBjaGFuZ2UsIGFuZCB0aGUgZnVsbF91cmwgdGhhdCB3b3VsZCBoYXZlIGJlZW4gZmV0Y2hlZFxcbiAgICAgICAgcmV0dXJuIHJlcXVlc3RzLlJlc3BvbnNlKHBlcm1hbmVudF9jYWNoZVtjYWNoZV9rZXldLCBmdWxsX3VybClcXG4gICAgZWxzZTpcXG4gICAgICAgIHByaW50KFxcXCJuZXc7IGFkZGluZyB0byBjYWNoZVxcXCIpXFxuICAgICAgICAjIGFjdHVhbGx5IHJlcXVlc3QgaXRcXG4gICAgICAgIHJlc3AgPSByZXF1ZXN0cy5nZXQoYmFzZXVybCwgcGFyYW1zKVxcbiAgICAgICAgIyBzYXZlIGl0XFxuICAgICAgICBhZGRfdG9fY2FjaGUodGVtcF9jYWNoZV9maWxlLCBjYWNoZV9rZXksIHJlc3AudGV4dClcXG4gICAgICAgIHJldHVybiByZXNwXCIsXCJzcmMvbGliL3JleGVjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJyZXhlYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JmYzgyMi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicmZjODIyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcmxjb21wbGV0ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJsY29tcGxldGVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcm9ib3RwYXJzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJvYm90cGFyc2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcnVucHkucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJ1bnB5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2NoZWQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNjaGVkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2V0cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2V0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NnbWxsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNnbWxsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zaGEucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNoYSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NoZWx2ZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2hlbHZlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2hsZXgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNobGV4IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2h1dGlsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaHV0aWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zaWduYWwuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtTSUdfREZMOm5ldyBTay5idWlsdGluLmludF8oMCksU0lHX0lHTjpuZXcgU2suYnVpbHRpbi5pbnRfKDEpLENUUkxfQ19FVkVOVDpuZXcgU2suYnVpbHRpbi5pbnRfKDApLENUUkxfQlJFQUtfRVZFTlQ6bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxOU0lHOm5ldyBTay5idWlsdGluLmludF8oMjMpLFNJR0hVUDpuZXcgU2suYnVpbHRpbi5pbnRfKDEpLFNJR05JTlQ6bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxTSUdJTEw6bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxTSUdGUEU6bmV3IFNrLmJ1aWx0aW4uaW50Xyg4KSxTSUdLSUxMOm5ldyBTay5idWlsdGluLmludF8oOSksU0lHU0VHVjpuZXcgU2suYnVpbHRpbi5pbnRfKDExKSxTSUdURVJNOm5ldyBTay5idWlsdGluLmludF8oMTUpLFNJR0JSRUFLOm5ldyBTay5idWlsdGluLmludF8oMjEpLFNJR0FCUlQ6bmV3IFNrLmJ1aWx0aW4uaW50XygyMikscGF1c2U6bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInBhdXNlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCk7dmFyIGE9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247cmV0dXJuIGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sYS5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGEpe2lmKG51bGwhPVNrLnNpZ25hbHMmJlNrLnNpZ25hbHMuYWRkRXZlbnRMaXN0ZW5lcil7ZnVuY3Rpb24gaGFuZGxlU2lnbmFsKCl7U2suc2lnbmFscy5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZVNpZ25hbCksYSgpfVNrLnNpZ25hbHMuYWRkRXZlbnRMaXN0ZW5lcihoYW5kbGVTaWduYWwpfWVsc2UgY29uc29sZS53YXJuKFxcXCJzaWduYWwucGF1c2UoKSBub3Qgc3VwcG9ydGVkXFxcIiksU2subWlzY2V2YWwucHJpbnRfKFxcXCJzaWduYWwucGF1c2UoKSBub3Qgc3VwcG9ydGVkXFxcIiksYSgpfSl9LGF9KSxzaWduYWw6bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNpZ25hbC5zaWduYWwgaXMgbm90IHN1cHBvcnRlZC5cXFwiKX0pfTtyZXR1cm4gYX07XCIsXCJzcmMvbGliL3NpdGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNpdGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zbXRwZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic210cGQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zbXRwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzbXRwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc25kaGRyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzbmRoZHIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zb2NrZXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNvY2tldCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NxbGl0ZTMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNxbGl0ZTMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNyZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NyZV9jb21waWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmVfY29tcGlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NyZV9jb25zdGFudHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNyZV9jb25zdGFudHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmVfcGFyc2UucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNyZV9wYXJzZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NzbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3NsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RhdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RhdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0YXRpc3RpY3MucHlcIjpcIlxcXCJcXFwiXFxcIlxcbkJhc2ljIHN0YXRpc3RpY3MgbW9kdWxlLlxcblxcblRoaXMgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgY2FsY3VsYXRpbmcgc3RhdGlzdGljcyBvZiBkYXRhLCBpbmNsdWRpbmdcXG5hdmVyYWdlcywgdmFyaWFuY2UsIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24uXFxuXFxuQ2FsY3VsYXRpbmcgYXZlcmFnZXNcXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuRnVuY3Rpb24gICAgICAgICAgICBEZXNjcmlwdGlvblxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxubWVhbiAgICAgICAgICAgICAgICBBcml0aG1ldGljIG1lYW4gKGF2ZXJhZ2UpIG9mIGRhdGEuXFxuaGFybW9uaWNfbWVhbiAgICAgICBIYXJtb25pYyBtZWFuIG9mIGRhdGEuXFxubWVkaWFuICAgICAgICAgICAgICBNZWRpYW4gKG1pZGRsZSB2YWx1ZSkgb2YgZGF0YS5cXG5tZWRpYW5fbG93ICAgICAgICAgIExvdyBtZWRpYW4gb2YgZGF0YS5cXG5tZWRpYW5faGlnaCAgICAgICAgIEhpZ2ggbWVkaWFuIG9mIGRhdGEuXFxubWVkaWFuX2dyb3VwZWQgICAgICBNZWRpYW4sIG9yIDUwdGggcGVyY2VudGlsZSwgb2YgZ3JvdXBlZCBkYXRhLlxcbm1vZGUgICAgICAgICAgICAgICAgTW9kZSAobW9zdCBjb21tb24gdmFsdWUpIG9mIGRhdGEuXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5cXG5DYWxjdWxhdGUgdGhlIGFyaXRobWV0aWMgbWVhbiAoXFxcInRoZSBhdmVyYWdlXFxcIikgb2YgZGF0YTpcXG5cXG4+Pj4gbWVhbihbLTEuMCwgMi41LCAzLjI1LCA1Ljc1XSlcXG4yLjYyNVxcblxcblxcbkNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgbWVkaWFuIG9mIGRpc2NyZXRlIGRhdGE6XFxuXFxuPj4+IG1lZGlhbihbMiwgMywgNCwgNV0pXFxuMy41XFxuXFxuXFxuQ2FsY3VsYXRlIHRoZSBtZWRpYW4sIG9yIDUwdGggcGVyY2VudGlsZSwgb2YgZGF0YSBncm91cGVkIGludG8gY2xhc3MgaW50ZXJ2YWxzXFxuY2VudHJlZCBvbiB0aGUgZGF0YSB2YWx1ZXMgcHJvdmlkZWQuIEUuZy4gaWYgeW91ciBkYXRhIHBvaW50cyBhcmUgcm91bmRlZCB0b1xcbnRoZSBuZWFyZXN0IHdob2xlIG51bWJlcjpcXG5cXG4+Pj4gbWVkaWFuX2dyb3VwZWQoWzIsIDIsIDMsIDMsIDMsIDRdKSAgI2RvY3Rlc3Q6ICtFTExJUFNJU1xcbjIuODMzMzMzMzMzMy4uLlxcblxcblRoaXMgc2hvdWxkIGJlIGludGVycHJldGVkIGluIHRoaXMgd2F5OiB5b3UgaGF2ZSB0d28gZGF0YSBwb2ludHMgaW4gdGhlIGNsYXNzXFxuaW50ZXJ2YWwgMS41LTIuNSwgdGhyZWUgZGF0YSBwb2ludHMgaW4gdGhlIGNsYXNzIGludGVydmFsIDIuNS0zLjUsIGFuZCBvbmUgaW5cXG50aGUgY2xhc3MgaW50ZXJ2YWwgMy41LTQuNS4gVGhlIG1lZGlhbiBvZiB0aGVzZSBkYXRhIHBvaW50cyBpcyAyLjgzMzMuLi5cXG5cXG5cXG5DYWxjdWxhdGluZyB2YXJpYWJpbGl0eSBvciBzcHJlYWRcXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbkZ1bmN0aW9uICAgICAgICAgICAgRGVzY3JpcHRpb25cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbnB2YXJpYW5jZSAgICAgICAgICAgUG9wdWxhdGlvbiB2YXJpYW5jZSBvZiBkYXRhLlxcbnZhcmlhbmNlICAgICAgICAgICAgU2FtcGxlIHZhcmlhbmNlIG9mIGRhdGEuXFxucHN0ZGV2ICAgICAgICAgICAgICBQb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBkYXRhLlxcbnN0ZGV2ICAgICAgICAgICAgICAgU2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBkYXRhLlxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuXFxuQ2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2Ygc2FtcGxlIGRhdGE6XFxuXFxuPj4+IHN0ZGV2KFsyLjUsIDMuMjUsIDUuNSwgMTEuMjUsIDExLjc1XSkgICNkb2N0ZXN0OiArRUxMSVBTSVNcXG40LjM4OTYxODQzNDQ0Li4uXFxuXFxuSWYgeW91IGhhdmUgcHJldmlvdXNseSBjYWxjdWxhdGVkIHRoZSBtZWFuLCB5b3UgY2FuIHBhc3MgaXQgYXMgdGhlIG9wdGlvbmFsXFxuc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBmb3VyIFxcXCJzcHJlYWRcXFwiIGZ1bmN0aW9ucyB0byBhdm9pZCByZWNhbGN1bGF0aW5nIGl0Olxcblxcbj4+PiBkYXRhID0gWzEsIDIsIDIsIDQsIDQsIDQsIDUsIDZdXFxuPj4+IG11ID0gbWVhbihkYXRhKVxcbj4+PiBwdmFyaWFuY2UoZGF0YSwgbXUpXFxuMi41XFxuXFxuXFxuRXhjZXB0aW9uc1xcbi0tLS0tLS0tLS1cXG5cXG5BIHNpbmdsZSBleGNlcHRpb24gaXMgZGVmaW5lZDogU3RhdGlzdGljc0Vycm9yIGlzIGEgc3ViY2xhc3Mgb2YgVmFsdWVFcnJvci5cXG5cXG5cXFwiXFxcIlxcXCJcXG5cXG5fX2FsbF9fID0gWyAnU3RhdGlzdGljc0Vycm9yJyxcXG4gICAgICAgICAgICAncHN0ZGV2JywgJ3B2YXJpYW5jZScsICdzdGRldicsICd2YXJpYW5jZScsXFxuICAgICAgICAgICAgJ21lZGlhbicsICAnbWVkaWFuX2xvdycsICdtZWRpYW5faGlnaCcsICdtZWRpYW5fZ3JvdXBlZCcsXFxuICAgICAgICAgICAgJ21lYW4nLCAnbW9kZScsICdoYXJtb25pY19tZWFuJyxcXG4gICAgICAgICAgXVxcblxcbmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IENvdW50ZXJcXG5mcm9tIG1hdGggaW1wb3J0IHNxcnRcXG5cXG5kZWYgbWVhbihkYXRhKTpcXG4gICAgcmV0dXJuIHN1bShkYXRhKSAvIGxlbihkYXRhKVxcblxcbmRlZiBoYXJtb25pY19tZWFuKGRhdGEpOlxcbiAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yXFxuXFxuXFxuZGVmIG1lZGlhbihkYXRhKTpcXG4gICAgX2RhdGEgPSBzb3J0ZWQoZGF0YSlcXG4gICAgbCA9IGxlbihfZGF0YSlcXG4gICAgaWYgbCAlIDIgPT0gMDpcXG4gICAgICAgIF9tZWRpYW4gPSAoX2RhdGFbbC8vMl0gKyBfZGF0YVtsLy8yLTFdKSAvIDJcXG4gICAgZWxzZTpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yXVxcbiAgICByZXR1cm4gX21lZGlhblxcblxcbmRlZiBtZWRpYW5fbG93KGRhdGEpOlxcbiAgICBfZGF0YSA9IHNvcnRlZChkYXRhKVxcbiAgICBsID0gbGVuKF9kYXRhKVxcbiAgICBpZiBsICUgMiA9PSAwOlxcbiAgICAgICAgX21lZGlhbiA9IF9kYXRhW2wvLzItMV1cXG4gICAgZWxzZTpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yXVxcbiAgICByZXR1cm4gX21lZGlhblxcblxcblxcbmRlZiBtZWRpYW5faGlnaChkYXRhKTpcXG4gICAgX2RhdGEgPSBzb3J0ZWQoZGF0YSlcXG4gICAgbCA9IGxlbihfZGF0YSlcXG4gICAgaWYgbCAlIDIgPT0gMDpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yXVxcbiAgICBlbHNlOlxcbiAgICAgICAgX21lZGlhbiA9IF9kYXRhW2wvLzJdXFxuICAgIHJldHVybiBfbWVkaWFuXFxuXFxuXFxuZGVmIG1lZGlhbl9ncm91cGVkKGRhdGEpOlxcbiAgICByZXR1cm4gbWVkaWFuKGRhdGEpXFxuXFxuZGVmIG1vZGUoZGF0YSk6XFxuICAgIGNvdW50ZXIgPSBDb3VudGVyKGRhdGEpXFxuICAgIG1heF9jb3VudCA9IG1heChjb3VudGVyLnZhbHVlcygpKVxcbiAgICBfbW9kZSA9IFtrIGZvciBrLHYgaW4gY291bnRlci5pdGVtcygpIGlmIHYgPT0gbWF4X2NvdW50XVxcbiAgICBpZiBsZW4oX21vZGUpID4gMTpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIk5vIFVuaXF1ZSBNb2RlLCBmb3VuZCB7fSBlcXVhbGx5IGNvbW1vbiB2YWx1ZXNcXFwiLmZvcm1hdChsZW4oX21vZGUpKSlcXG4gICAgZWxzZTpcXG4gICAgICAgIHJldHVybiBfbW9kZVswXVxcblxcblxcbmRlZiB2YXJpYW5jZShkYXRhKTpcXG4gICAgYXZlcmFnZT1tZWFuKGRhdGEpXFxuICAgIF92YXJpYW5jZT0wXFxuICAgIGZvciBkIGluIGRhdGE6XFxuICAgICAgICBfdmFyaWFuY2UgKz0gKChhdmVyYWdlLWQpKioyKVxcbiAgICAgICAgZmluYWxfdmFyaWFuY2U9X3ZhcmlhbmNlL2xlbihkYXRhKVxcbiAgICByZXR1cm4gZmluYWxfdmFyaWFuY2VcXG5cXG5kZWYgcHZhcmlhbmNlKGRhdGEpOlxcbiAgICBhdmVyYWdlPW1lYW4oZGF0YSlcXG4gICAgX3ZhcmlhbmNlPTBcXG4gICAgZm9yIGQgaW4gZGF0YTpcXG4gICAgICAgIF92YXJpYW5jZSArPSAoKGF2ZXJhZ2UtZCkqKjIpXFxuICAgICAgICBmaW5hbF92YXJpYW5jZT1fdmFyaWFuY2UvbGVuKGRhdGEpXFxuICAgIHJldHVybiBmaW5hbF92YXJpYW5jZVxcblxcbmRlZiB2YXJpYW5jZShkYXRhKTpcXG4gICAgYXZlcmFnZT1tZWFuKGRhdGEpXFxuICAgIF92YXJpYW5jZT0wXFxuICAgIGZvciBkIGluIGRhdGE6XFxuICAgICAgICBfdmFyaWFuY2UgKz0gKChhdmVyYWdlLWQpKioyKVxcbiAgICAgICAgZmluYWxfdmFyaWFuY2U9X3ZhcmlhbmNlLyhsZW4oZGF0YSkgLTEpXFxuICAgIHJldHVybiBmaW5hbF92YXJpYW5jZVxcblxcbmRlZiBwc3RkZXYoZGF0YSk6XFxuICAgIHJldHVybiBzcXJ0KHB2YXJpYW5jZShkYXRhKSlcXG5cXG5kZWYgc3RkZXYoZGF0YSk6XFxuICAgIHJldHVybiBzcXJ0KHZhcmlhbmNlKGRhdGEpKVxcblxcblwiLFwic3JjL2xpYi9zdGF0dmZzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdGF0dmZzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RyaW5nLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fTtyZXR1cm4gYS5hc2NpaV9sb3dlcmNhc2U9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxcXCIpLGEuYXNjaWlfdXBwZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcXFwiKSxhLmFzY2lpX2xldHRlcnM9bmV3IFNrLmJ1aWx0aW4uc3RyKGEuYXNjaWlfbG93ZXJjYXNlLnYrYS5hc2NpaV91cHBlcmNhc2UudiksYS5sb3dlcmNhc2U9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxcXCIpLGEudXBwZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcXFwiKSxhLmxldHRlcnM9bmV3IFNrLmJ1aWx0aW4uc3RyKGEubG93ZXJjYXNlLnYrYS51cHBlcmNhc2UudiksYS5kaWdpdHM9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIwMTIzNDU2Nzg5XFxcIiksYS5oZXhkaWdpdHM9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIwMTIzNDU2Nzg5YWJjZGVmQUJDREVGXFxcIiksYS5vY3RkaWdpdHM9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIwMTIzNDU2N1xcXCIpLGEucHVuY3R1YXRpb249bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIhXFxcXFxcXCIjJCUmJygpKissLS4vOjs8PT4/QFtcXFxcXFxcXF1eX2B7fH1+XFxcIiksYS53aGl0ZXNwYWNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiXFxcXHRcXFxcblxcXFx4MEJcXFxcZlxcXFxyIFxcXCIpLGEucHJpbnRhYmxlPW5ldyBTay5idWlsdGluLnN0cihhLmRpZ2l0cy52K2EubGV0dGVycy52K2EucHVuY3R1YXRpb24uditcXFwiIFxcXFx0XFxcXG5cXFxcclxcXFx4MEJcXFxcZlxcXCIpLGEuc3BsaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiguLi5hKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5zcGxpdCxhKX0pLGEuY2FwaXRhbGl6ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi5zdHIucHJvdG90eXBlLmNhcGl0YWxpemUsW2FdKX0pLGEuam9pbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIHZvaWQgMD09PWImJihiPW5ldyBTay5idWlsdGluLnN0cihcXFwiIFxcXCIpKSxTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi5zdHIucHJvdG90eXBlLmpvaW4sW2IsYV0pfSksYS5jYXB3b3Jkcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiY2Fwd29yZHNcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInMgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWMmJihjPW5ldyBTay5idWlsdGluLnN0cihcXFwiIFxcXCIpKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInNlcCBtdXN0IGJlIGEgc3RyaW5nXFxcIik7Zm9yKHZhciBkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLnNwbGl0LFtiLGNdKS52LGU9W10sZj0wO2Y8ZC5sZW5ndGg7ZisrKXt2YXIgZz1kW2ZdLGg9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuY2FwaXRhbGl6ZSxbZ10pO2UucHVzaChoKX1yZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuam9pbixbbmV3IFNrLmJ1aWx0aW4ubGlzdChlKSxjXSl9KSxhfTtcIixcInNyYy9saWIvc3RyaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdHJpbmdvbGQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0cmluZ29sZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0cmluZ3ByZXAucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0cmluZ3ByZXAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdHJ1Y3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0cnVjdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N1YnByb2Nlc3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN1YnByb2Nlc3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdW5hdS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3VuYXUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdW5hdWRpby5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3VuYXVkaW8gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zeW1ib2wucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN5bWJvbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N5bXRhYmxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzeW10YWJsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RhYm5hbm55LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0YWJuYW5ueSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RhcmZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRhcmZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZWxuZXRsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRlbG5ldGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RlbXBmaWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZW1wZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Rlc3QvX19pbml0X18ucHlcIjpcIl9fYXV0aG9yX18gPSAnYm1pbGxlcidcXG5cXG5kZWYgdGVzdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHBsYWNlcz01KTpcXG4gICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCxpbnQpOlxcbiAgICAgICAgaWYgYWN0dWFsID09IGV4cGVjdGVkOlxcbiAgICAgICAgICAgIHByaW50KCdQYXNzJylcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICBlbGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsZmxvYXQpOlxcbiAgICAgICAgaWYgYWJzKGFjdHVhbC1leHBlY3RlZCkgPCAxMCoqKC1wbGFjZXMpOlxcbiAgICAgICAgICAgIHByaW50KCdQYXNzJylcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICBlbHNlOlxcbiAgICAgICAgaWYgYWN0dWFsID09IGV4cGVjdGVkOlxcbiAgICAgICAgICAgIHByaW50KCdQYXNzJylcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICBwcmludCgnVGVzdCBGYWlsZWQ6IGV4cGVjdGVkICcgKyBzdHIoZXhwZWN0ZWQpICsgJyBidXQgZ290ICcgKyBzdHIoYWN0dWFsKSlcXG4gICAgcmV0dXJuIEZhbHNlXFxuXFxuZGVmIHRlc3ROb3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkKTpcXG4gICAgcGFzc1xcblxcblwiLFwic3JjL2xpYi90ZXN0L2JhZF9nZXRhdHRyLnB5XCI6XCJ4ID0gMVxcblxcbl9fZ2V0YXR0cl9fID0gXFxcIlN1cnByaXNlIVxcXCJcXG5fX2Rpcl9fID0gXFxcIlN1cnByaXNlIGFnYWluIVxcXCJcXG5cIixcInNyYy9saWIvdGVzdC9iYWRfZ2V0YXR0cjIucHlcIjpcImRlZiBfX2dldGF0dHJfXygpOlxcbiAgICBcXFwiQmFkIG9uZVxcXCJcXG5cXG54ID0gMVxcblxcbmRlZiBfX2Rpcl9fKGJhZF9zaWcpOlxcbiAgICByZXR1cm4gW11cXG5cIixcInNyYy9saWIvdGVzdC9iYWRfZ2V0YXR0cjMucHlcIjpcImRlZiBfX2dldGF0dHJfXyhuYW1lKTpcXG4gICAgZ2xvYmFsIF9fZ2V0YXR0cl9fXFxuICAgIGlmIG5hbWUgIT0gJ2RlbGdldGF0dHInOlxcbiAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3JcXG4gICAgZGVsIF9fZ2V0YXR0cl9fXFxuICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yXFxuXCIsXCJzcmMvbGliL3Rlc3QvZGVjaW1hbHRlc3RkYXRhL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkZWNpbWFsdGVzdGRhdGEgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZXN0L2dvb2RfZ2V0YXR0ci5weVwiOlwieCA9IDFcXG5cXG5kZWYgX19kaXJfXygpOlxcbiAgICByZXR1cm4gWydhJywgJ2InLCAnYyddXFxuXFxuZGVmIF9fZ2V0YXR0cl9fKG5hbWUpOlxcbiAgICBpZiBuYW1lID09IFxcXCJ5b2xvXFxcIjpcXG4gICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKFxcXCJEZXByZWNhdGVkLCB1c2Ugd2hhdGV2ZXIgaW5zdGVhZFxcXCIpXFxuICAgIHJldHVybiBmXFxcIlRoZXJlIGlzIHtuYW1lfVxcXCJcXG5cXG55ID0gMlxcblwiLFwic3JjL2xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weVwiOlwiXFxcIlxcXCJcXFwiU3VwcG9ydGluZyBkZWZpbml0aW9ucyBmb3IgdGhlIFB5dGhvbiByZWdyZXNzaW9uIHRlc3RzLlxcXCJcXFwiXFxcIlxcblxcbmlmIF9fbmFtZV9fICE9ICd0ZXN0LnRlc3Rfc3VwcG9ydCc6XFxuICAgIHJhaXNlIEltcG9ydEVycm9yKCd0ZXN0X3N1cHBvcnQgbXVzdCBiZSBpbXBvcnRlZCBmcm9tIHRoZSB0ZXN0IHBhY2thZ2UnKVxcblxcbmltcG9ydCB1bml0dGVzdFxcblxcblxcbiMgZGVmIHJ1bl91bml0dGVzdCgqY2xhc3Nlcyk6XFxuIyAgICAgXFxcIlxcXCJcXFwiUnVuIHRlc3RzIGZyb20gdW5pdHRlc3QuVGVzdENhc2UtZGVyaXZlZCBjbGFzc2VzLlxcXCJcXFwiXFxcIlxcbiMgICAgIHZhbGlkX3R5cGVzID0gKHVuaXR0ZXN0LlRlc3RTdWl0ZSwgdW5pdHRlc3QuVGVzdENhc2UpXFxuIyAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKVxcbiMgICAgIGZvciBjbHMgaW4gY2xhc3NlczpcXG4jICAgICAgICAgaWYgaXNpbnN0YW5jZShjbHMsIHN0cik6XFxuIyAgICAgICAgICAgICBpZiBjbHMgaW4gc3lzLm1vZHVsZXM6XFxuIyAgICAgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5maW5kVGVzdENhc2VzKHN5cy5tb2R1bGVzW2Nsc10pKVxcbiMgICAgICAgICAgICAgZWxzZTpcXG4jICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJzdHIgYXJndW1lbnRzIG11c3QgYmUga2V5cyBpbiBzeXMubW9kdWxlc1xcXCIpXFxuIyAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShjbHMsIHZhbGlkX3R5cGVzKTpcXG4jICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QoY2xzKVxcbiMgICAgICAgICBlbHNlOlxcbiMgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoY2xzKSlcXG4jICAgICBfcnVuX3N1aXRlKHN1aXRlKVxcblxcbmRlZiBydW5fdW5pdHRlc3QoKmNsYXNzZXMpOlxcbiAgICBcXFwiXFxcIlxcXCJSdW4gdGVzdHMgZnJvbSB1bml0dGVzdC5UZXN0Q2FzZS1kZXJpdmVkIGNsYXNzZXMuXFxcIlxcXCJcXFwiXFxuICAgIGZvciBjbHMgaW4gY2xhc3NlczpcXG4gICAgICAgIHByaW50IGNsc1xcbiAgICAgICAgaWYgaXNzdWJjbGFzcyhjbHMsIHVuaXR0ZXN0LlRlc3RDYXNlKTpcXG4gICAgICAgICAgICBjbHMoKS5tYWluKClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcHJpbnQgXFxcIkRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIFxcXCIsIGNsc1xcblwiLFwic3JjL2xpYi90ZXh0d3JhcC5weVwiOlwiXFxcIlxcXCJcXFwiVGV4dCB3cmFwcGluZyBhbmQgZmlsbGluZy5cXG5cXFwiXFxcIlxcXCJcXG5cXG4jIENvcHlyaWdodCAoQykgMTk5OS0yMDAxIEdyZWdvcnkgUC4gV2FyZC5cXG4jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi5cXG4jIFdyaXR0ZW4gYnkgR3JlZyBXYXJkIDxnd2FyZEBweXRob24ubmV0PlxcblxcbmltcG9ydCByZSwgc3RyaW5nXFxuXFxuX19hbGxfXyA9IFsnVGV4dFdyYXBwZXInLCAnd3JhcCcsICdmaWxsJywgJ2RlZGVudCcsICdpbmRlbnQnLCAnc2hvcnRlbiddXFxuXFxuIyBIYXJkY29kZSB0aGUgcmVjb2duaXplZCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gdGhlIFVTLUFTQ0lJXFxuIyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuICBUaGUgbWFpbiByZWFzb24gZm9yIGRvaW5nIHRoaXMgaXMgdGhhdFxcbiMgc29tZSBVbmljb2RlIHNwYWNlcyAobGlrZSBcXFxcdTAwYTApIGFyZSBub24tYnJlYWtpbmcgd2hpdGVzcGFjZXMuXFxuX3doaXRlc3BhY2UgPSAnXFxcXHRcXFxcblxcXFx4MGJcXFxceDBjXFxcXHIgJ1xcblxcbmNsYXNzIFRleHRXcmFwcGVyOlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgT2JqZWN0IGZvciB3cmFwcGluZy9maWxsaW5nIHRleHQuICBUaGUgcHVibGljIGludGVyZmFjZSBjb25zaXN0cyBvZlxcbiAgICB0aGUgd3JhcCgpIGFuZCBmaWxsKCkgbWV0aG9kczsgdGhlIG90aGVyIG1ldGhvZHMgYXJlIGp1c3QgdGhlcmUgZm9yXFxuICAgIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUgaW4gb3JkZXIgdG8gdHdlYWsgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLlxcbiAgICBJZiB5b3Ugd2FudCB0byBjb21wbGV0ZWx5IHJlcGxhY2UgdGhlIG1haW4gd3JhcHBpbmcgYWxnb3JpdGhtLFxcbiAgICB5b3UnbGwgcHJvYmFibHkgaGF2ZSB0byBvdmVycmlkZSBfd3JhcF9jaHVua3MoKS5cXG4gICAgU2V2ZXJhbCBpbnN0YW5jZSBhdHRyaWJ1dGVzIGNvbnRyb2wgdmFyaW91cyBhc3BlY3RzIG9mIHdyYXBwaW5nOlxcbiAgICAgIHdpZHRoIChkZWZhdWx0OiA3MClcXG4gICAgICAgIHRoZSBtYXhpbXVtIHdpZHRoIG9mIHdyYXBwZWQgbGluZXMgKHVubGVzcyBicmVha19sb25nX3dvcmRzXFxuICAgICAgICBpcyBmYWxzZSlcXG4gICAgICBpbml0aWFsX2luZGVudCAoZGVmYXVsdDogXFxcIlxcXCIpXFxuICAgICAgICBzdHJpbmcgdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgZmlyc3QgbGluZSBvZiB3cmFwcGVkXFxuICAgICAgICBvdXRwdXQuICBDb3VudHMgdG93YXJkcyB0aGUgbGluZSdzIHdpZHRoLlxcbiAgICAgIHN1YnNlcXVlbnRfaW5kZW50IChkZWZhdWx0OiBcXFwiXFxcIilcXG4gICAgICAgIHN0cmluZyB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIGFsbCBsaW5lcyBzYXZlIHRoZSBmaXJzdFxcbiAgICAgICAgb2Ygd3JhcHBlZCBvdXRwdXQ7IGFsc28gY291bnRzIHRvd2FyZHMgZWFjaCBsaW5lJ3Mgd2lkdGguXFxuICAgICAgZXhwYW5kX3RhYnMgKGRlZmF1bHQ6IHRydWUpXFxuICAgICAgICBFeHBhbmQgdGFicyBpbiBpbnB1dCB0ZXh0IHRvIHNwYWNlcyBiZWZvcmUgZnVydGhlciBwcm9jZXNzaW5nLlxcbiAgICAgICAgRWFjaCB0YWIgd2lsbCBiZWNvbWUgMCAuLiAndGFic2l6ZScgc3BhY2VzLCBkZXBlbmRpbmcgb24gaXRzIHBvc2l0aW9uXFxuICAgICAgICBpbiBpdHMgbGluZS4gIElmIGZhbHNlLCBlYWNoIHRhYiBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIGNoYXJhY3Rlci5cXG4gICAgICB0YWJzaXplIChkZWZhdWx0OiA4KVxcbiAgICAgICAgRXhwYW5kIHRhYnMgaW4gaW5wdXQgdGV4dCB0byAwIC4uICd0YWJzaXplJyBzcGFjZXMsIHVubGVzc1xcbiAgICAgICAgJ2V4cGFuZF90YWJzJyBpcyBmYWxzZS5cXG4gICAgICByZXBsYWNlX3doaXRlc3BhY2UgKGRlZmF1bHQ6IHRydWUpXFxuICAgICAgICBSZXBsYWNlIGFsbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgaW4gdGhlIGlucHV0IHRleHQgYnkgc3BhY2VzXFxuICAgICAgICBhZnRlciB0YWIgZXhwYW5zaW9uLiAgTm90ZSB0aGF0IGlmIGV4cGFuZF90YWJzIGlzIGZhbHNlIGFuZFxcbiAgICAgICAgcmVwbGFjZV93aGl0ZXNwYWNlIGlzIHRydWUsIGV2ZXJ5IHRhYiB3aWxsIGJlIGNvbnZlcnRlZCB0byBhXFxuICAgICAgICBzaW5nbGUgc3BhY2UhXFxuICAgICAgZml4X3NlbnRlbmNlX2VuZGluZ3MgKGRlZmF1bHQ6IGZhbHNlKVxcbiAgICAgICAgRW5zdXJlIHRoYXQgc2VudGVuY2UtZW5kaW5nIHB1bmN0dWF0aW9uIGlzIGFsd2F5cyBmb2xsb3dlZFxcbiAgICAgICAgYnkgdHdvIHNwYWNlcy4gIE9mZiBieSBkZWZhdWx0IGJlY2F1c2UgdGhlIGFsZ29yaXRobSBpc1xcbiAgICAgICAgKHVuYXZvaWRhYmx5KSBpbXBlcmZlY3QuXFxuICAgICAgYnJlYWtfbG9uZ193b3JkcyAoZGVmYXVsdDogdHJ1ZSlcXG4gICAgICAgIEJyZWFrIHdvcmRzIGxvbmdlciB0aGFuICd3aWR0aCcuICBJZiBmYWxzZSwgdGhvc2Ugd29yZHMgd2lsbCBub3RcXG4gICAgICAgIGJlIGJyb2tlbiwgYW5kIHNvbWUgbGluZXMgbWlnaHQgYmUgbG9uZ2VyIHRoYW4gJ3dpZHRoJy5cXG4gICAgICBicmVha19vbl9oeXBoZW5zIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgQWxsb3cgYnJlYWtpbmcgaHlwaGVuYXRlZCB3b3Jkcy4gSWYgdHJ1ZSwgd3JhcHBpbmcgd2lsbCBvY2N1clxcbiAgICAgICAgcHJlZmVyYWJseSBvbiB3aGl0ZXNwYWNlcyBhbmQgcmlnaHQgYWZ0ZXIgaHlwaGVucyBwYXJ0IG9mXFxuICAgICAgICBjb21wb3VuZCB3b3Jkcy5cXG4gICAgICBkcm9wX3doaXRlc3BhY2UgKGRlZmF1bHQ6IHRydWUpXFxuICAgICAgICBEcm9wIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBsaW5lcy5cXG4gICAgICBtYXhfbGluZXMgKGRlZmF1bHQ6IE5vbmUpXFxuICAgICAgICBUcnVuY2F0ZSB3cmFwcGVkIGxpbmVzLlxcbiAgICAgIHBsYWNlaG9sZGVyIChkZWZhdWx0OiAnIFsuLi5dJylcXG4gICAgICAgIEFwcGVuZCB0byB0aGUgbGFzdCBsaW5lIG9mIHRydW5jYXRlZCB0ZXh0LlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgdW5pY29kZV93aGl0ZXNwYWNlX3RyYW5zID0ge31cXG4gICAgIyB1c3BhY2UgPSBvcmQoJyAnKVxcbiAgICB1c3BhY2UgPSAnICdcXG4gICAgZm9yIHggaW4gX3doaXRlc3BhY2U6XFxuICAgICAgICAjIHVuaWNvZGVfd2hpdGVzcGFjZV90cmFuc1tvcmQoeCldID0gdXNwYWNlXFxuICAgICAgICB1bmljb2RlX3doaXRlc3BhY2VfdHJhbnNbeF0gPSB1c3BhY2VcXG5cXG4gICAgIyBUaGlzIGZ1bmt5IGxpdHRsZSByZWdleCBpcyBqdXN0IHRoZSB0cmljayBmb3Igc3BsaXR0aW5nXFxuICAgICMgdGV4dCB1cCBpbnRvIHdvcmQtd3JhcHBhYmxlIGNodW5rcy4gIEUuZy5cXG4gICAgIyAgIFxcXCJIZWxsbyB0aGVyZSAtLSB5b3UgZ29vZi1iYWxsLCB1c2UgdGhlIC1iIG9wdGlvbiFcXFwiXFxuICAgICMgc3BsaXRzIGludG9cXG4gICAgIyAgIEhlbGxvLyAvdGhlcmUvIC8tLS8gL3lvdS8gL2dvb2YtL2JhbGwsLyAvdXNlLyAvdGhlLyAvLWIvIC9vcHRpb24hXFxuICAgICMgKGFmdGVyIHN0cmlwcGluZyBvdXQgZW1wdHkgc3RyaW5ncykuXFxuICAgIHdvcmRzZXBfcmUgPSByZS5jb21waWxlKFxcbiAgICAgICAgcicoXFxcXHMrfCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbnkgd2hpdGVzcGFjZVxcbiAgICAgICAgcidbXlxcXFxzXFxcXHddKlxcXFx3K1teMC05XFxcXFddLSg/PVxcXFx3K1teMC05XFxcXFddKSknKSAgIyBoeXBoZW5hdGVkIHdvcmRzXFxuICAgIGVtX2Rhc2ggPSByZS5jb21waWxlKHInKFxcXFxzK3wnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IHdoaXRlc3BhY2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgcidbXlxcXFxzXFxcXHddKlxcXFx3K1teMC05XFxcXFddLSg/PVxcXFx3K1teMC05XFxcXFddKXwnICAgIyBoeXBoZW5hdGVkIHdvcmRzXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHInKD8hXiktezIsfSg/PVxcXFx3KSknKSAgICAgICAgICAgICAgICAgICAgICMgZW0tZGFzaFxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgIyBUaGlzIGxlc3MgZnVua3kgbGl0dGxlIHJlZ2V4IGp1c3Qgc3BsaXQgb24gcmVjb2duaXplZCBzcGFjZXMuIEUuZy5cXG4gICAgIyAgIFxcXCJIZWxsbyB0aGVyZSAtLSB5b3UgZ29vZi1iYWxsLCB1c2UgdGhlIC1iIG9wdGlvbiFcXFwiXFxuICAgICMgc3BsaXRzIGludG9cXG4gICAgIyAgIEhlbGxvLyAvdGhlcmUvIC8tLS8gL3lvdS8gL2dvb2YtYmFsbCwvIC91c2UvIC90aGUvIC8tYi8gL29wdGlvbiEvXFxuICAgIHdvcmRzZXBfc2ltcGxlX3JlID0gcmUuY29tcGlsZShyJyhcXFxccyspJylcXG5cXG5cXG4gICAgIyBYWFggdGhpcyBpcyBub3QgbG9jYWxlLSBvciBjaGFyc2V0LWF3YXJlIC0tIHN0cmluZy5sb3dlcmNhc2VcXG4gICAgIyBpcyBVUy1BU0NJSSBvbmx5IChhbmQgdGhlcmVmb3JlIEVuZ2xpc2gtb25seSlcXG4gICAgc2VudGVuY2VfZW5kX3JlID0gcmUuY29tcGlsZShyJ1thLXpdJyAgICAgICAgICAgICAjIGxvd2VyY2FzZSBsZXR0ZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1tcXFxcLlxcXFwhXFxcXD9dJyAgICAgICAgICAjIHNlbnRlbmNlLWVuZGluZyBwdW5jdC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1tcXFxcXFxcIlxcXFwnXT8nICAgICAgICAgICAjIG9wdGlvbmFsIGVuZC1vZi1xdW90ZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInXFxcXFonKSAgICAgICAgICAgICAgICMgZW5kIG9mIGNodW5rXFxuICAgIHNlbnRlbmNlX2VuZF9yZSA9IHInW2Etel1bXFxcXC5cXFxcIVxcXFw/XVtcXFxcXFxcIlxcXFwnXT8nXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLFxcbiAgICAgICAgICAgICAgICAgd2lkdGg9NzAsXFxuICAgICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD1cXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgIHN1YnNlcXVlbnRfaW5kZW50PVxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgZXhwYW5kX3RhYnM9VHJ1ZSxcXG4gICAgICAgICAgICAgICAgIHJlcGxhY2Vfd2hpdGVzcGFjZT1UcnVlLFxcbiAgICAgICAgICAgICAgICAgZml4X3NlbnRlbmNlX2VuZGluZ3M9RmFsc2UsXFxuICAgICAgICAgICAgICAgICBicmVha19sb25nX3dvcmRzPVRydWUsXFxuICAgICAgICAgICAgICAgICBkcm9wX3doaXRlc3BhY2U9VHJ1ZSxcXG4gICAgICAgICAgICAgICAgIGJyZWFrX29uX2h5cGhlbnM9VHJ1ZSxcXG4gICAgICAgICAgICAgICAgIHRhYnNpemU9OCxcXG4gICAgICAgICAgICAgICAgIG1heF9saW5lcz1Ob25lLFxcbiAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9JyBbLi4uXScpOlxcbiAgICAgICAgc2VsZi53aWR0aCA9IHdpZHRoXFxuICAgICAgICBzZWxmLmluaXRpYWxfaW5kZW50ID0gaW5pdGlhbF9pbmRlbnRcXG4gICAgICAgIHNlbGYuc3Vic2VxdWVudF9pbmRlbnQgPSBzdWJzZXF1ZW50X2luZGVudFxcbiAgICAgICAgc2VsZi5leHBhbmRfdGFicyA9IGV4cGFuZF90YWJzXFxuICAgICAgICBzZWxmLnJlcGxhY2Vfd2hpdGVzcGFjZSA9IHJlcGxhY2Vfd2hpdGVzcGFjZVxcbiAgICAgICAgc2VsZi5maXhfc2VudGVuY2VfZW5kaW5ncyA9IGZpeF9zZW50ZW5jZV9lbmRpbmdzXFxuICAgICAgICBzZWxmLmJyZWFrX2xvbmdfd29yZHMgPSBicmVha19sb25nX3dvcmRzXFxuICAgICAgICBzZWxmLmRyb3Bfd2hpdGVzcGFjZSA9IGRyb3Bfd2hpdGVzcGFjZVxcbiAgICAgICAgc2VsZi5icmVha19vbl9oeXBoZW5zID0gYnJlYWtfb25faHlwaGVuc1xcbiAgICAgICAgc2VsZi50YWJzaXplID0gdGFic2l6ZVxcbiAgICAgICAgc2VsZi5tYXhfbGluZXMgPSBtYXhfbGluZXNcXG4gICAgICAgIHNlbGYucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlclxcblxcblxcbiAgICAjIC0tIFByaXZhdGUgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAgICAjIChwb3NzaWJseSB1c2VmdWwgZm9yIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUpXFxuXFxuICAgIGRlZiBfbXVuZ2Vfd2hpdGVzcGFjZShzZWxmLCB0ZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl9tdW5nZV93aGl0ZXNwYWNlKHRleHQgOiBzdHJpbmcpIC0+IHN0cmluZ1xcbiAgICAgICAgTXVuZ2Ugd2hpdGVzcGFjZSBpbiB0ZXh0OiBleHBhbmQgdGFicyBhbmQgY29udmVydCBhbGwgb3RoZXJcXG4gICAgICAgIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBzcGFjZXMuICBFZy4gXFxcIiBmb29cXFxcXFxcXHRiYXJcXFxcXFxcXG5cXFxcXFxcXG5iYXpcXFwiXFxuICAgICAgICBiZWNvbWVzIFxcXCIgZm9vICAgIGJhciAgYmF6XFxcIi5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5leHBhbmRfdGFiczpcXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5leHBhbmR0YWJzKHNlbGYudGFic2l6ZSlcXG4gICAgICAgIGlmIHNlbGYucmVwbGFjZV93aGl0ZXNwYWNlOlxcbiAgICAgICAgICAgIGZvciBrZXksIHZhbCBpbiBzZWxmLnVuaWNvZGVfd2hpdGVzcGFjZV90cmFucy5pdGVtcygpOlxcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKGtleSwgdmFsKVxcbiAgICAgICAgcmV0dXJuIHRleHRcXG5cXG5cXG4gICAgZGVmIF9zcGxpdChzZWxmLCB0ZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl9zcGxpdCh0ZXh0IDogc3RyaW5nKSAtPiBbc3RyaW5nXVxcbiAgICAgICAgU3BsaXQgdGhlIHRleHQgdG8gd3JhcCBpbnRvIGluZGl2aXNpYmxlIGNodW5rcy4gIENodW5rcyBhcmVcXG4gICAgICAgIG5vdCBxdWl0ZSB0aGUgc2FtZSBhcyB3b3Jkczsgc2VlIF93cmFwX2NodW5rcygpIGZvciBmdWxsXFxuICAgICAgICBkZXRhaWxzLiAgQXMgYW4gZXhhbXBsZSwgdGhlIHRleHRcXG4gICAgICAgICAgTG9vaywgZ29vZi1iYWxsIC0tIHVzZSB0aGUgLWIgb3B0aW9uIVxcbiAgICAgICAgYnJlYWtzIGludG8gdGhlIGZvbGxvd2luZyBjaHVua3M6XFxuICAgICAgICAgICdMb29rLCcsICcgJywgJ2dvb2YtJywgJ2JhbGwnLCAnICcsICctLScsICcgJyxcXG4gICAgICAgICAgJ3VzZScsICcgJywgJ3RoZScsICcgJywgJy1iJywgJyAnLCAnb3B0aW9uISdcXG4gICAgICAgIGlmIGJyZWFrX29uX2h5cGhlbnMgaXMgVHJ1ZSwgb3IgaW46XFxuICAgICAgICAgICdMb29rLCcsICcgJywgJ2dvb2YtYmFsbCcsICcgJywgJy0tJywgJyAnLFxcbiAgICAgICAgICAndXNlJywgJyAnLCAndGhlJywgJyAnLCAnLWInLCAnICcsIG9wdGlvbiEnXFxuICAgICAgICBvdGhlcndpc2UuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuYnJlYWtfb25faHlwaGVucyBpcyBUcnVlOlxcbiAgICAgICAgICAgIGNodW5rcyA9IHNlbGYud29yZHNlcF9yZS5zcGxpdCh0ZXh0KVxcbiAgICAgICAgICAgIGlmIFxcXCItLVxcXCIgaW4gdGV4dDpcXG4gICAgICAgICAgICAgICAgY2h1bmtzID0gW2l0ZW0gXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzdWJsaXN0IGluIFtzZWxmLmVtX2Rhc2guc3BsaXQoY2h1bmspIGZvciBjaHVuayBpbiBjaHVua3NdIFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc3VibGlzdF1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgY2h1bmtzID0gc2VsZi53b3Jkc2VwX3NpbXBsZV9yZS5zcGxpdCh0ZXh0KVxcbiAgICAgICAgY2h1bmtzID0gW2MgZm9yIGMgaW4gY2h1bmtzIGlmIGNdXFxuICAgICAgICByZXR1cm4gY2h1bmtzXFxuXFxuICAgIGRlZiBfZml4X3NlbnRlbmNlX2VuZGluZ3Moc2VsZiwgY2h1bmtzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl9maXhfc2VudGVuY2VfZW5kaW5ncyhjaHVua3MgOiBbc3RyaW5nXSlcXG4gICAgICAgIENvcnJlY3QgZm9yIHNlbnRlbmNlIGVuZGluZ3MgYnVyaWVkIGluICdjaHVua3MnLiAgRWcuIHdoZW4gdGhlXFxuICAgICAgICBvcmlnaW5hbCB0ZXh0IGNvbnRhaW5zIFxcXCIuLi4gZm9vLlxcXFxcXFxcbkJhciAuLi5cXFwiLCBtdW5nZV93aGl0ZXNwYWNlKClcXG4gICAgICAgIGFuZCBzcGxpdCgpIHdpbGwgY29udmVydCB0aGF0IHRvIFsuLi4sIFxcXCJmb28uXFxcIiwgXFxcIiBcXFwiLCBcXFwiQmFyXFxcIiwgLi4uXVxcbiAgICAgICAgd2hpY2ggaGFzIG9uZSB0b28gZmV3IHNwYWNlczsgdGhpcyBtZXRob2Qgc2ltcGx5IGNoYW5nZXMgdGhlIG9uZVxcbiAgICAgICAgc3BhY2UgdG8gdHdvLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpID0gMFxcbiAgICAgICAgIyBwYXRzZWFyY2ggPSBzZWxmLnNlbnRlbmNlX2VuZF9yZS5zZWFyY2hcXG4gICAgICAgIHdoaWxlIGkgPCBsZW4oY2h1bmtzKS0xOlxcbiAgICAgICAgICAgIGlmIGNodW5rc1tpKzFdID09IFxcXCIgXFxcIiBhbmQgcmUuc2VhcmNoKHNlbGYuc2VudGVuY2VfZW5kX3JlLCBjaHVua3NbaV0pIGFuZCBjaHVua3NbaV1bLTFdIGluIFxcXCIuIT9cXFxcXFxcIlxcXFwnXFxcIjpcXG4gICAgICAgICAgICAgICAgY2h1bmtzW2krMV0gPSBcXFwiICBcXFwiXFxuICAgICAgICAgICAgICAgIGkgKz0gMlxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGkgKz0gMVxcblxcbiAgICBkZWYgX2hhbmRsZV9sb25nX3dvcmQoc2VsZiwgcmV2ZXJzZWRfY2h1bmtzLCBjdXJfbGluZSwgY3VyX2xlbiwgd2lkdGgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiX2hhbmRsZV9sb25nX3dvcmQoY2h1bmtzIDogW3N0cmluZ10sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGluZSA6IFtzdHJpbmddLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2xlbiA6IGludCwgd2lkdGggOiBpbnQpXFxuICAgICAgICBIYW5kbGUgYSBjaHVuayBvZiB0ZXh0IChtb3N0IGxpa2VseSBhIHdvcmQsIG5vdCB3aGl0ZXNwYWNlKSB0aGF0XFxuICAgICAgICBpcyB0b28gbG9uZyB0byBmaXQgaW4gYW55IGxpbmUuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgICMgRmlndXJlIG91dCB3aGVuIGluZGVudCBpcyBsYXJnZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHdpZHRoLCBhbmQgbWFrZVxcbiAgICAgICAgIyBzdXJlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaXMgc3RyaXBwZWQgb2ZmIG9uIGV2ZXJ5IHBhc3NcXG4gICAgICAgIGlmIHdpZHRoIDwgMTpcXG4gICAgICAgICAgICBzcGFjZV9sZWZ0ID0gMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzcGFjZV9sZWZ0ID0gd2lkdGggLSBjdXJfbGVuXFxuXFxuICAgICAgICAjIElmIHdlJ3JlIGFsbG93ZWQgdG8gYnJlYWsgbG9uZyB3b3JkcywgdGhlbiBkbyBzbzogcHV0IGFzIG11Y2hcXG4gICAgICAgICMgb2YgdGhlIG5leHQgY2h1bmsgb250byB0aGUgY3VycmVudCBsaW5lIGFzIHdpbGwgZml0LlxcbiAgICAgICAgaWYgc2VsZi5icmVha19sb25nX3dvcmRzOlxcbiAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChyZXZlcnNlZF9jaHVua3NbLTFdWzpzcGFjZV9sZWZ0XSlcXG4gICAgICAgICAgICByZXZlcnNlZF9jaHVua3NbLTFdID0gcmV2ZXJzZWRfY2h1bmtzWy0xXVtzcGFjZV9sZWZ0Ol1cXG5cXG4gICAgICAgICMgT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIHByZXNlcnZlIHRoZSBsb25nIHdvcmQgaW50YWN0LiAgT25seSBhZGRcXG4gICAgICAgICMgaXQgdG8gdGhlIGN1cnJlbnQgbGluZSBpZiB0aGVyZSdzIG5vdGhpbmcgYWxyZWFkeSB0aGVyZSAtLVxcbiAgICAgICAgIyB0aGF0IG1pbmltaXplcyBob3cgbXVjaCB3ZSB2aW9sYXRlIHRoZSB3aWR0aCBjb25zdHJhaW50LlxcbiAgICAgICAgZWxpZiBub3QgY3VyX2xpbmU6XFxuICAgICAgICAgICAgY3VyX2xpbmUuYXBwZW5kKHJldmVyc2VkX2NodW5rcy5wb3AoKSlcXG5cXG4gICAgICAgICMgSWYgd2UncmUgbm90IGFsbG93ZWQgdG8gYnJlYWsgbG9uZyB3b3JkcywgYW5kIHRoZXJlJ3MgYWxyZWFkeVxcbiAgICAgICAgIyB0ZXh0IG9uIHRoZSBjdXJyZW50IGxpbmUsIGRvIG5vdGhpbmcuICBOZXh0IHRpbWUgdGhyb3VnaCB0aGVcXG4gICAgICAgICMgbWFpbiBsb29wIG9mIF93cmFwX2NodW5rcygpLCB3ZSdsbCB3aW5kIHVwIGhlcmUgYWdhaW4sIGJ1dFxcbiAgICAgICAgIyBjdXJfbGVuIHdpbGwgYmUgemVybywgc28gdGhlIG5leHQgbGluZSB3aWxsIGJlIGVudGlyZWx5XFxuICAgICAgICAjIGRldm90ZWQgdG8gdGhlIGxvbmcgd29yZCB0aGF0IHdlIGNhbid0IGhhbmRsZSByaWdodCBub3cuXFxuXFxuICAgIGRlZiBfd3JhcF9jaHVua3Moc2VsZiwgY2h1bmtzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl93cmFwX2NodW5rcyhjaHVua3MgOiBbc3RyaW5nXSkgLT4gW3N0cmluZ11cXG4gICAgICAgIFdyYXAgYSBzZXF1ZW5jZSBvZiB0ZXh0IGNodW5rcyBhbmQgcmV0dXJuIGEgbGlzdCBvZiBsaW5lcyBvZlxcbiAgICAgICAgbGVuZ3RoICdzZWxmLndpZHRoJyBvciBsZXNzLiAgKElmICdicmVha19sb25nX3dvcmRzJyBpcyBmYWxzZSxcXG4gICAgICAgIHNvbWUgbGluZXMgbWF5IGJlIGxvbmdlciB0aGFuIHRoaXMuKSAgQ2h1bmtzIGNvcnJlc3BvbmQgcm91Z2hseVxcbiAgICAgICAgdG8gd29yZHMgYW5kIHRoZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlbTogZWFjaCBjaHVuayBpc1xcbiAgICAgICAgaW5kaXZpc2libGUgKG1vZHVsbyAnYnJlYWtfbG9uZ193b3JkcycpLCBidXQgYSBsaW5lIGJyZWFrIGNhblxcbiAgICAgICAgY29tZSBiZXR3ZWVuIGFueSB0d28gY2h1bmtzLiAgQ2h1bmtzIHNob3VsZCBub3QgaGF2ZSBpbnRlcm5hbFxcbiAgICAgICAgd2hpdGVzcGFjZTsgaWUuIGEgY2h1bmsgaXMgZWl0aGVyIGFsbCB3aGl0ZXNwYWNlIG9yIGEgXFxcIndvcmRcXFwiLlxcbiAgICAgICAgV2hpdGVzcGFjZSBjaHVua3Mgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mXFxuICAgICAgICBsaW5lcywgYnV0IGFwYXJ0IGZyb20gdGhhdCB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgbGluZXMgPSBbXVxcbiAgICAgICAgaWYgc2VsZi53aWR0aCA8PSAwOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImludmFsaWQgd2lkdGggJXIgKG11c3QgYmUgPiAwKVxcXCIgJSBzZWxmLndpZHRoKVxcbiAgICAgICAgaWYgc2VsZi5tYXhfbGluZXMgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgaWYgc2VsZi5tYXhfbGluZXMgPiAxOlxcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLnN1YnNlcXVlbnRfaW5kZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbml0aWFsX2luZGVudFxcbiAgICAgICAgICAgIGlmIGxlbihpbmRlbnQpICsgbGVuKHNlbGYucGxhY2Vob2xkZXIubHN0cmlwKCkpID4gc2VsZi53aWR0aDpcXG4gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwicGxhY2Vob2xkZXIgdG9vIGxhcmdlIGZvciBtYXggd2lkdGhcXFwiKVxcblxcbiAgICAgICAgIyBBcnJhbmdlIGluIHJldmVyc2Ugb3JkZXIgc28gaXRlbXMgY2FuIGJlIGVmZmljaWVudGx5IHBvcHBlZFxcbiAgICAgICAgIyBmcm9tIGEgc3RhY2sgb2YgY2h1Y2tzLlxcbiAgICAgICAgY2h1bmtzLnJldmVyc2UoKVxcblxcbiAgICAgICAgd2hpbGUgY2h1bmtzOlxcblxcbiAgICAgICAgICAgICMgU3RhcnQgdGhlIGxpc3Qgb2YgY2h1bmtzIHRoYXQgd2lsbCBtYWtlIHVwIHRoZSBjdXJyZW50IGxpbmUuXFxuICAgICAgICAgICAgIyBjdXJfbGVuIGlzIGp1c3QgdGhlIGxlbmd0aCBvZiBhbGwgdGhlIGNodW5rcyBpbiBjdXJfbGluZS5cXG4gICAgICAgICAgICBjdXJfbGluZSA9IFtdXFxuICAgICAgICAgICAgY3VyX2xlbiA9IDBcXG5cXG4gICAgICAgICAgICAjIEZpZ3VyZSBvdXQgd2hpY2ggc3RhdGljIHN0cmluZyB3aWxsIHByZWZpeCB0aGlzIGxpbmUuXFxuICAgICAgICAgICAgaWYgbGluZXM6XFxuICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuc3Vic2VxdWVudF9pbmRlbnRcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmluaXRpYWxfaW5kZW50XFxuXFxuICAgICAgICAgICAgIyBNYXhpbXVtIHdpZHRoIGZvciB0aGlzIGxpbmUuXFxuICAgICAgICAgICAgd2lkdGggPSBzZWxmLndpZHRoIC0gbGVuKGluZGVudClcXG5cXG4gICAgICAgICAgICAjIEZpcnN0IGNodW5rIG9uIGxpbmUgaXMgd2hpdGVzcGFjZSAtLSBkcm9wIGl0LCB1bmxlc3MgdGhpc1xcbiAgICAgICAgICAgICMgaXMgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0IChpZS4gbm8gbGluZXMgc3RhcnRlZCB5ZXQpLlxcbiAgICAgICAgICAgIGlmIHNlbGYuZHJvcF93aGl0ZXNwYWNlIGFuZCBjaHVua3NbLTFdLnN0cmlwKCkgPT0gJycgYW5kIGxpbmVzOlxcbiAgICAgICAgICAgICAgICBkZWwgY2h1bmtzWy0xXVxcblxcbiAgICAgICAgICAgIHdoaWxlIGNodW5rczpcXG4gICAgICAgICAgICAgICAgbCA9IGxlbihjaHVua3NbLTFdKVxcblxcbiAgICAgICAgICAgICAgICAjIENhbiBhdCBsZWFzdCBzcXVlZXplIHRoaXMgY2h1bmsgb250byB0aGUgY3VycmVudCBsaW5lLlxcbiAgICAgICAgICAgICAgICBpZiBjdXJfbGVuICsgbCA8PSB3aWR0aDpcXG4gICAgICAgICAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChjaHVua3MucG9wKCkpXFxuICAgICAgICAgICAgICAgICAgICBjdXJfbGVuICs9IGxcXG5cXG4gICAgICAgICAgICAgICAgIyBOb3BlLCB0aGlzIGxpbmUgaXMgZnVsbC5cXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXFxuXFxuICAgICAgICAgICAgIyBUaGUgY3VycmVudCBsaW5lIGlzIGZ1bGwsIGFuZCB0aGUgbmV4dCBjaHVuayBpcyB0b28gYmlnIHRvXFxuICAgICAgICAgICAgIyBmaXQgb24gKmFueSogbGluZSAobm90IGp1c3QgdGhpcyBvbmUpLlxcbiAgICAgICAgICAgIGlmIGNodW5rcyBhbmQgbGVuKGNodW5rc1stMV0pID4gd2lkdGg6XFxuICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9sb25nX3dvcmQoY2h1bmtzLCBjdXJfbGluZSwgY3VyX2xlbiwgd2lkdGgpXFxuICAgICAgICAgICAgICAgIGN1cl9sZW4gPSBzdW0obWFwKGxlbiwgY3VyX2xpbmUpKVxcblxcbiAgICAgICAgICAgICMgSWYgdGhlIGxhc3QgY2h1bmsgb24gdGhpcyBsaW5lIGlzIGFsbCB3aGl0ZXNwYWNlLCBkcm9wIGl0LlxcbiAgICAgICAgICAgIGlmIHNlbGYuZHJvcF93aGl0ZXNwYWNlIGFuZCBjdXJfbGluZSBhbmQgY3VyX2xpbmVbLTFdLnN0cmlwKCkgPT0gJyc6XFxuICAgICAgICAgICAgICAgIGN1cl9sZW4gLT0gbGVuKGN1cl9saW5lWy0xXSlcXG4gICAgICAgICAgICAgICAgZGVsIGN1cl9saW5lWy0xXVxcblxcbiAgICAgICAgICAgIGlmIGN1cl9saW5lOlxcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5tYXhfbGluZXMgaXMgTm9uZSBvclxcbiAgICAgICAgICAgICAgICAgICAgbGVuKGxpbmVzKSArIDEgPCBzZWxmLm1heF9saW5lcyBvclxcbiAgICAgICAgICAgICAgICAgICAgKG5vdCBjaHVua3Mgb3JcXG4gICAgICAgICAgICAgICAgICAgICBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmRcXG4gICAgICAgICAgICAgICAgICAgICBsZW4oY2h1bmtzKSA9PSAxIGFuZFxcbiAgICAgICAgICAgICAgICAgICAgIG5vdCBjaHVua3NbMF0uc3RyaXAoKSkgYW5kIGN1cl9sZW4gPD0gd2lkdGgpOlxcbiAgICAgICAgICAgICAgICAgICAgIyBDb252ZXJ0IGN1cnJlbnQgbGluZSBiYWNrIHRvIGEgc3RyaW5nIGFuZCBzdG9yZSBpdCBpblxcbiAgICAgICAgICAgICAgICAgICAgIyBsaXN0IG9mIGFsbCBsaW5lcyAocmV0dXJuIHZhbHVlKS5cXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChpbmRlbnQgKyAnJy5qb2luKGN1cl9saW5lKSlcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIGN1cl9saW5lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJfbGluZVstMV0uc3RyaXAoKSBhbmRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2xlbiArIGxlbihzZWxmLnBsYWNlaG9sZGVyKSA8PSB3aWR0aCk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChzZWxmLnBsYWNlaG9sZGVyKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoaW5kZW50ICsgJycuam9pbihjdXJfbGluZSkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2xlbiAtPSBsZW4oY3VyX2xpbmVbLTFdKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBjdXJfbGluZVstMV1cXG4gICAgICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZXM6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfbGluZSA9IGxpbmVzWy0xXS5yc3RyaXAoKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuKHByZXZfbGluZSkgKyBsZW4oc2VsZi5wbGFjZWhvbGRlcikgPD1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpZHRoKTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzWy0xXSA9IHByZXZfbGluZSArIHNlbGYucGxhY2Vob2xkZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGluZGVudCArIHNlbGYucGxhY2Vob2xkZXIubHN0cmlwKCkpXFxuICAgICAgICAgICAgICAgICAgICBicmVha1xcblxcbiAgICAgICAgcmV0dXJuIGxpbmVzXFxuXFxuICAgIGRlZiBfc3BsaXRfY2h1bmtzKHNlbGYsIHRleHQpOlxcbiAgICAgICAgdGV4dCA9IHNlbGYuX211bmdlX3doaXRlc3BhY2UodGV4dClcXG4gICAgICAgIHJldHVybiBzZWxmLl9zcGxpdCh0ZXh0KVxcblxcbiAgICAjIC0tIFB1YmxpYyBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblxcbiAgICBkZWYgd3JhcChzZWxmLCB0ZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIndyYXAodGV4dCA6IHN0cmluZykgLT4gW3N0cmluZ11cXG4gICAgICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyBzbyBpdCBmaXRzIGluIGxpbmVzIG9mXFxuICAgICAgICBubyBtb3JlIHRoYW4gJ3NlbGYud2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBsaXN0IG9mIHdyYXBwZWRcXG4gICAgICAgIGxpbmVzLiAgVGFicyBpbiAndGV4dCcgYXJlIGV4cGFuZGVkIHdpdGggc3RyaW5nLmV4cGFuZHRhYnMoKSxcXG4gICAgICAgIGFuZCBhbGwgb3RoZXIgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgbmV3bGluZSkgYXJlXFxuICAgICAgICBjb252ZXJ0ZWQgdG8gc3BhY2UuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGNodW5rcyA9IHNlbGYuX3NwbGl0X2NodW5rcyh0ZXh0KVxcbiAgICAgICAgaWYgc2VsZi5maXhfc2VudGVuY2VfZW5kaW5nczpcXG4gICAgICAgICAgICBzZWxmLl9maXhfc2VudGVuY2VfZW5kaW5ncyhjaHVua3MpXFxuICAgICAgICByZXR1cm4gc2VsZi5fd3JhcF9jaHVua3MoY2h1bmtzKVxcblxcbiAgICBkZWYgZmlsbChzZWxmLCB0ZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImZpbGwodGV4dCA6IHN0cmluZykgLT4gc3RyaW5nXFxuICAgICAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgdG8gZml0IGluIGxpbmVzIG9mIG5vXFxuICAgICAgICBtb3JlIHRoYW4gJ3NlbGYud2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBuZXcgc3RyaW5nXFxuICAgICAgICBjb250YWluaW5nIHRoZSBlbnRpcmUgd3JhcHBlZCBwYXJhZ3JhcGguXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBcXFwiXFxcXG5cXFwiLmpvaW4oc2VsZi53cmFwKHRleHQpKVxcblxcblxcbiMgLS0gQ29udmVuaWVuY2UgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblxcbmRlZiB3cmFwKHRleHQsIHdpZHRoPTcwLCAqKmt3YXJncyk6XFxuICAgIFxcXCJcXFwiXFxcIldyYXAgYSBzaW5nbGUgcGFyYWdyYXBoIG9mIHRleHQsIHJldHVybmluZyBhIGxpc3Qgb2Ygd3JhcHBlZCBsaW5lcy5cXG4gICAgUmVmb3JtYXQgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gJ3RleHQnIHNvIGl0IGZpdHMgaW4gbGluZXMgb2Ygbm9cXG4gICAgbW9yZSB0aGFuICd3aWR0aCcgY29sdW1ucywgYW5kIHJldHVybiBhIGxpc3Qgb2Ygd3JhcHBlZCBsaW5lcy4gIEJ5XFxuICAgIGRlZmF1bHQsIHRhYnMgaW4gJ3RleHQnIGFyZSBleHBhbmRlZCB3aXRoIHN0cmluZy5leHBhbmR0YWJzKCksIGFuZFxcbiAgICBhbGwgb3RoZXIgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgbmV3bGluZSkgYXJlIGNvbnZlcnRlZCB0b1xcbiAgICBzcGFjZS4gIFNlZSBUZXh0V3JhcHBlciBjbGFzcyBmb3IgYXZhaWxhYmxlIGtleXdvcmQgYXJncyB0byBjdXN0b21pemVcXG4gICAgd3JhcHBpbmcgYmVoYXZpb3VyLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdyA9IFRleHRXcmFwcGVyKHdpZHRoPXdpZHRoLCAqKmt3YXJncylcXG4gICAgcmV0dXJuIHcud3JhcCh0ZXh0KVxcblxcbmRlZiBmaWxsKHRleHQsIHdpZHRoPTcwLCAqKmt3YXJncyk6XFxuICAgIFxcXCJcXFwiXFxcIkZpbGwgYSBzaW5nbGUgcGFyYWdyYXBoIG9mIHRleHQsIHJldHVybmluZyBhIG5ldyBzdHJpbmcuXFxuICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyB0byBmaXQgaW4gbGluZXMgb2Ygbm8gbW9yZVxcbiAgICB0aGFuICd3aWR0aCcgY29sdW1ucywgYW5kIHJldHVybiBhIG5ldyBzdHJpbmcgY29udGFpbmluZyB0aGUgZW50aXJlXFxuICAgIHdyYXBwZWQgcGFyYWdyYXBoLiAgQXMgd2l0aCB3cmFwKCksIHRhYnMgYXJlIGV4cGFuZGVkIGFuZCBvdGhlclxcbiAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgY29udmVydGVkIHRvIHNwYWNlLiAgU2VlIFRleHRXcmFwcGVyIGNsYXNzIGZvclxcbiAgICBhdmFpbGFibGUga2V5d29yZCBhcmdzIHRvIGN1c3RvbWl6ZSB3cmFwcGluZyBiZWhhdmlvdXIuXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICB3ID0gVGV4dFdyYXBwZXIod2lkdGg9d2lkdGgsICoqa3dhcmdzKVxcbiAgICByZXR1cm4gdy5maWxsKHRleHQpXFxuXFxuZGVmIHNob3J0ZW4odGV4dCwgd2lkdGgsICoqa3dhcmdzKTpcXG4gICAgXFxcIlxcXCJcXFwiQ29sbGFwc2UgYW5kIHRydW5jYXRlIHRoZSBnaXZlbiB0ZXh0IHRvIGZpdCBpbiB0aGUgZ2l2ZW4gd2lkdGguXFxuICAgIFRoZSB0ZXh0IGZpcnN0IGhhcyBpdHMgd2hpdGVzcGFjZSBjb2xsYXBzZWQuICBJZiBpdCB0aGVuIGZpdHMgaW5cXG4gICAgdGhlICp3aWR0aCosIGl0IGlzIHJldHVybmVkIGFzIGlzLiAgT3RoZXJ3aXNlLCBhcyBtYW55IHdvcmRzXFxuICAgIGFzIHBvc3NpYmxlIGFyZSBqb2luZWQgYW5kIHRoZW4gdGhlIHBsYWNlaG9sZGVyIGlzIGFwcGVuZGVkOjpcXG4gICAgICAgID4+PiB0ZXh0d3JhcC5zaG9ydGVuKFxcXCJIZWxsbyAgd29ybGQhXFxcIiwgd2lkdGg9MTIpXFxuICAgICAgICAnSGVsbG8gd29ybGQhJ1xcbiAgICAgICAgPj4+IHRleHR3cmFwLnNob3J0ZW4oXFxcIkhlbGxvICB3b3JsZCFcXFwiLCB3aWR0aD0xMSlcXG4gICAgICAgICdIZWxsbyBbLi4uXSdcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIHcgPSBUZXh0V3JhcHBlcih3aWR0aD13aWR0aCwgbWF4X2xpbmVzPTEsICoqa3dhcmdzKVxcbiAgICByZXR1cm4gdy5maWxsKCcgJy5qb2luKHRleHQuc3RyaXAoKS5zcGxpdCgpKSlcXG5cXG5cXG4jIC0tIExvb3NlbHkgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG4jIF93aGl0ZXNwYWNlX29ubHlfcmUgPSByZS5jb21waWxlKCdeWyBcXFxcdF0rJCcsIHJlLk1VTFRJTElORSlcXG4jIF9sZWFkaW5nX3doaXRlc3BhY2VfcmUgPSByZS5jb21waWxlKCcoXlsgXFxcXHRdKikoPzpbXiBcXFxcdFxcXFxuXSknLCByZS5NVUxUSUxJTkUpXFxuXFxuZGVmIGRlZGVudCh0ZXh0KTpcXG4gICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGFueSBjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gZXZlcnkgbGluZSBpbiBgdGV4dGAuXFxuICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gbWFrZSB0cmlwbGUtcXVvdGVkIHN0cmluZ3MgbGluZSB1cCB3aXRoIHRoZSBsZWZ0XFxuICAgIGVkZ2Ugb2YgdGhlIGRpc3BsYXksIHdoaWxlIHN0aWxsIHByZXNlbnRpbmcgdGhlbSBpbiB0aGUgc291cmNlIGNvZGVcXG4gICAgaW4gaW5kZW50ZWQgZm9ybS5cXG4gICAgTm90ZSB0aGF0IHRhYnMgYW5kIHNwYWNlcyBhcmUgYm90aCB0cmVhdGVkIGFzIHdoaXRlc3BhY2UsIGJ1dCB0aGV5XFxuICAgIGFyZSBub3QgZXF1YWw6IHRoZSBsaW5lcyBcXFwiICBoZWxsb1xcXCIgYW5kIFxcXCJcXFxcXFxcXHRoZWxsb1xcXCIgYXJlXFxuICAgIGNvbnNpZGVyZWQgdG8gaGF2ZSBubyBjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlLlxcbiAgICBFbnRpcmVseSBibGFuayBsaW5lcyBhcmUgbm9ybWFsaXplZCB0byBhIG5ld2xpbmUgY2hhcmFjdGVyLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgIyBMb29rIGZvciB0aGUgbG9uZ2VzdCBsZWFkaW5nIHN0cmluZyBvZiBzcGFjZXMgYW5kIHRhYnMgY29tbW9uIHRvXFxuICAgICMgYWxsIGxpbmVzLlxcbiAgICBtYXJnaW4gPSBOb25lXFxuXFxuICAgIGluZGVudHMgPSByZS5maW5kYWxsKHInKF5bIFxcXFx0XSopKD86W14gXFxcXHRcXFxcbl0pJyx0ZXh0LCByZS5NVUxUSUxJTkUpXFxuICAgIGZvciBpbmRlbnQgaW4gaW5kZW50czpcXG4gICAgICAgIGlmIG1hcmdpbiBpcyBOb25lOlxcbiAgICAgICAgICAgIG1hcmdpbiA9IGluZGVudFxcblxcbiAgICAgICAgIyBDdXJyZW50IGxpbmUgbW9yZSBkZWVwbHkgaW5kZW50ZWQgdGhhbiBwcmV2aW91cyB3aW5uZXI6XFxuICAgICAgICAjIG5vIGNoYW5nZSAocHJldmlvdXMgd2lubmVyIGlzIHN0aWxsIG9uIHRvcCkuXFxuICAgICAgICBlbGlmIGluZGVudC5zdGFydHN3aXRoKG1hcmdpbik6XFxuICAgICAgICAgICAgcGFzc1xcblxcbiAgICAgICAgIyBDdXJyZW50IGxpbmUgY29uc2lzdGVudCB3aXRoIGFuZCBubyBkZWVwZXIgdGhhbiBwcmV2aW91cyB3aW5uZXI6XFxuICAgICAgICAjIGl0J3MgdGhlIG5ldyB3aW5uZXIuXFxuICAgICAgICBlbGlmIG1hcmdpbi5zdGFydHN3aXRoKGluZGVudCk6XFxuICAgICAgICAgICAgbWFyZ2luID0gaW5kZW50XFxuXFxuICAgICAgICAjIEZpbmQgdGhlIGxhcmdlc3QgY29tbW9uIHdoaXRlc3BhY2UgYmV0d2VlbiBjdXJyZW50IGxpbmUgYW5kIHByZXZpb3VzXFxuICAgICAgICAjIHdpbm5lci5cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgZm9yIGksICh4LCB5KSBpbiBlbnVtZXJhdGUoemlwKG1hcmdpbiwgaW5kZW50KSk6XFxuICAgICAgICAgICAgICAgIGlmIHggIT0geTpcXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbls6aV1cXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICMgc2FuaXR5IGNoZWNrICh0ZXN0aW5nL2RlYnVnZ2luZyBvbmx5KVxcbiAgICBpZiAwIGFuZCBtYXJnaW46XFxuICAgICAgICBmb3IgbGluZSBpbiB0ZXh0LnNwbGl0KFxcXCJcXFxcblxcXCIpOlxcbiAgICAgICAgICAgIGFzc2VydCBub3QgbGluZSBvciBsaW5lLnN0YXJ0c3dpdGgobWFyZ2luKSwgXFxcXFxcbiAgICAgICAgICAgICAgICAgICBcXFwibGluZSA9ICVyLCBtYXJnaW4gPSAlclxcXCIgJSAobGluZSwgbWFyZ2luKVxcblxcbiAgICBpZiBtYXJnaW46XFxuICAgICAgICBsaW5lcyA9IFtsaW5lW2xlbihtYXJnaW4pOl0gXFxuICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0cmlwKClcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGxpbmUuc3RyaXAoKSBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdChcXFwiXFxcXG5cXFwiKV1cXG4gICAgICAgIHRleHQgPSBcXFwiXFxcXG5cXFwiLmpvaW4obGluZXMpXFxuICAgIHJldHVybiB0ZXh0XFxuXFxuXFxuZGVmIGluZGVudCh0ZXh0LCBwcmVmaXgsIHByZWRpY2F0ZT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiQWRkcyAncHJlZml4JyB0byB0aGUgYmVnaW5uaW5nIG9mIHNlbGVjdGVkIGxpbmVzIGluICd0ZXh0Jy5cXG4gICAgSWYgJ3ByZWRpY2F0ZScgaXMgcHJvdmlkZWQsICdwcmVmaXgnIHdpbGwgb25seSBiZSBhZGRlZCB0byB0aGUgbGluZXNcXG4gICAgd2hlcmUgJ3ByZWRpY2F0ZShsaW5lKScgaXMgVHJ1ZS4gSWYgJ3ByZWRpY2F0ZScgaXMgbm90IHByb3ZpZGVkLFxcbiAgICBpdCB3aWxsIGRlZmF1bHQgdG8gYWRkaW5nICdwcmVmaXgnIHRvIGFsbCBub24tZW1wdHkgbGluZXMgdGhhdCBkbyBub3RcXG4gICAgY29uc2lzdCBzb2xlbHkgb2Ygd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgaWYgcHJlZGljYXRlIGlzIE5vbmU6XFxuICAgICAgICBkZWYgcHJlZGljYXRlKGxpbmUpOlxcbiAgICAgICAgICAgIHJldHVybiBsaW5lLnN0cmlwKClcXG5cXG4gICAgZGVmIHByZWZpeGVkX2xpbmVzKCk6XFxuICAgICAgICBmb3IgbGluZSBpbiB0ZXh0LnNwbGl0bGluZXMoVHJ1ZSk6XFxuICAgICAgICAgICAgeWllbGQgKHByZWZpeCArIGxpbmUgaWYgcHJlZGljYXRlKGxpbmUpIGVsc2UgbGluZSlcXG4gICAgcmV0dXJuICcnLmpvaW4ocHJlZml4ZWRfbGluZXMoKSlcXG5cXG5cXG5pZiBfX25hbWVfXyA9PSBcXFwiX19tYWluX19cXFwiOlxcbiAgICAjcHJpbnQgZGVkZW50KFxcXCJcXFxcdGZvb1xcXFxuXFxcXHRiYXJcXFwiKVxcbiAgICAjcHJpbnQgZGVkZW50KFxcXCIgIFxcXFx0aGVsbG8gdGhlcmVcXFxcbiAgXFxcXHQgIGhvdyBhcmUgeW91P1xcXCIpXFxuICAgIHByaW50KGRlZGVudChcXFwiSGVsbG8gdGhlcmUuXFxcXG4gIFRoaXMgaXMgaW5kZW50ZWQuXFxcIikpXCIsXCJzcmMvbGliL3RoaXMucHlcIjpcIlxcbnByaW50KFxcXCJcXFwiXFxcIlxcblRoZSBaZW4gb2YgUHl0aG9uLCBieSBUaW0gUGV0ZXJzXFxuXFxuQmVhdXRpZnVsIGlzIGJldHRlciB0aGFuIHVnbHkuXFxuRXhwbGljaXQgaXMgYmV0dGVyIHRoYW4gaW1wbGljaXQuXFxuU2ltcGxlIGlzIGJldHRlciB0aGFuIGNvbXBsZXguXFxuQ29tcGxleCBpcyBiZXR0ZXIgdGhhbiBjb21wbGljYXRlZC5cXG5GbGF0IGlzIGJldHRlciB0aGFuIG5lc3RlZC5cXG5TcGFyc2UgaXMgYmV0dGVyIHRoYW4gZGVuc2UuXFxuUmVhZGFiaWxpdHkgY291bnRzLlxcblNwZWNpYWwgY2FzZXMgYXJlbid0IHNwZWNpYWwgZW5vdWdoIHRvIGJyZWFrIHRoZSBydWxlcy5cXG5BbHRob3VnaCBwcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LlxcbkVycm9ycyBzaG91bGQgbmV2ZXIgcGFzcyBzaWxlbnRseS5cXG5Vbmxlc3MgZXhwbGljaXRseSBzaWxlbmNlZC5cXG5JbiB0aGUgZmFjZSBvZiBhbWJpZ3VpdHksIHJlZnVzZSB0aGUgdGVtcHRhdGlvbiB0byBndWVzcy5cXG5UaGVyZSBzaG91bGQgYmUgb25lLS0gYW5kIHByZWZlcmFibHkgb25seSBvbmUgLS1vYnZpb3VzIHdheSB0byBkbyBpdC5cXG5BbHRob3VnaCB0aGF0IHdheSBtYXkgbm90IGJlIG9idmlvdXMgYXQgZmlyc3QgdW5sZXNzIHlvdSdyZSBEdXRjaC5cXG5Ob3cgaXMgYmV0dGVyIHRoYW4gbmV2ZXIuXFxuQWx0aG91Z2ggbmV2ZXIgaXMgb2Z0ZW4gYmV0dGVyIHRoYW4gKnJpZ2h0KiBub3cuXFxuSWYgdGhlIGltcGxlbWVudGF0aW9uIGlzIGhhcmQgdG8gZXhwbGFpbiwgaXQncyBhIGJhZCBpZGVhLlxcbklmIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBlYXN5IHRvIGV4cGxhaW4sIGl0IG1heSBiZSBhIGdvb2QgaWRlYS5cXG5OYW1lc3BhY2VzIGFyZSBvbmUgaG9ua2luZyBncmVhdCBpZGVhIC0tIGxldCdzIGRvIG1vcmUgb2YgdGhvc2UhXFxuXFxcIlxcXCJcXFwiXFxuKVxcblwiLFwic3JjL2xpYi90aHJlYWRpbmcucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRocmVhZGluZyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RpbWUuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGNoZWNrX3N0cnVjdF90aW1lKGEpe2lmKCEoYSBpbnN0YW5jZW9mIGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiUmVxdWlyZWQgYXJndW1lbnQgJ3N0cnVjdF90aW1lJyBtdXN0IGJlIG9mIHR5cGU6ICdzdHJ1Y3RfdGltZSdcXFwiKTt2YXIgYyxkPWEudi5sZW5ndGgsZT1hLnY7Zm9yKGM9MDtjPGQ7KytjKWlmKCFTay5idWlsdGluLmNoZWNrSW50KGVbY10pKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic3RydWN0X3RpbWUgbWF5IG9ubHkgY29udGFpbiBpbnRlZ2Vyc1xcXCIpO3JldHVybiEwfWZ1bmN0aW9uIHBhZExlZnQoYSxiLGQpe3ZhciBjPWEudG9TdHJpbmcoKTtyZXR1cm4gQXJyYXkoYi1jLmxlbmd0aCsxKS5qb2luKGR8fFxcXCIgXFxcIikrY31mdW5jdGlvbiBpc0xlYXBZZWFyKGEpe3JldHVybiAwPT0oMyZhKSYmKDAhPWElMTAwfHwwPT1hJTQwMCl9ZnVuY3Rpb24gZ2V0RGF5T2ZZZWFyKGEsYil7Yj1ifHwhMTt2YXIgYz1iP2EuZ2V0VVRDTW9udGgoKTphLmdldE1vbnRoKCksZD1iP2EuZ2V0VVRDRGF0ZSgpOmEuZ2V0RGF0ZSgpLGU9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF1bY10rZDtyZXR1cm4gMTxjJiZpc0xlYXBZZWFyKGI/YS5nZXRVVENGdWxsWWVhcigpOmEuZ2V0RnVsbFllYXIoKSkmJmUrKyxlfWZ1bmN0aW9uIHN0ZFRpbWV6b25lT2Zmc2V0KCl7dmFyIGE9TWF0aC5tYXgsYj1uZXcgRGF0ZSgyMDAyLDAsMSksYz1uZXcgRGF0ZSgyMDAyLDYsMSk7cmV0dXJuIGEoYi5nZXRUaW1lem9uZU9mZnNldCgpLGMuZ2V0VGltZXpvbmVPZmZzZXQoKSl9ZnVuY3Rpb24gZHN0KGEpe3JldHVybiBhLmdldFRpbWV6b25lT2Zmc2V0KCk8c3RkVGltZXpvbmVPZmZzZXQoKX1mdW5jdGlvbiB0aW1lWm9uZU5hbWUoYSl7dmFyIGIsYz0vXFxcXCgoLiopXFxcXCkvLmV4ZWMoYS50b1N0cmluZygpKTtpZihudWxsIT10aGlzLm5hdmlnYXRvciYmKGI9dGhpcy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx0aGlzLm5hdmlnYXRvci5sYW5ndWFnZSksYyYmMTxjLmxlbmd0aClyZXR1cm4gY1sxXTtpZih2b2lkIDA9PT1iKXJldHVybiBudWxsO3RyeXt2YXIgZD1hLnRvTG9jYWxlU3RyaW5nKGIse3RpbWVab25lTmFtZTpcXFwic2hvcnRcXFwifSk7cmV0dXJuIGM9ZC5zcGxpdChcXFwiIFxcXCIpLGNbYy5sZW5ndGgtMV19Y2F0Y2goYSl7cmV0dXJuIG51bGx9fWZ1bmN0aW9uIGRhdGVfdG9fc3RydWN0X3RpbWUoYSxjKXtyZXR1cm4gYz1jfHwhMSxuZXcgYihbU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDRnVsbFllYXIoKTphLmdldEZ1bGxZZWFyKCkpLFNrLmJ1aWx0aW4uYXNzayQoKGM/YS5nZXRVVENNb250aCgpOmEuZ2V0TW9udGgoKSkrMSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDRGF0ZSgpOmEuZ2V0RGF0ZSgpKSxTay5idWlsdGluLmFzc2skKGM/YS5nZXRVVENIb3VycygpOmEuZ2V0SG91cnMoKSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDTWludXRlcygpOmEuZ2V0TWludXRlcygpKSxTay5idWlsdGluLmFzc2skKGM/YS5nZXRVVENTZWNvbmRzKCk6YS5nZXRTZWNvbmRzKCkpLFNrLmJ1aWx0aW4uYXNzayQoKChjP2EuZ2V0VVRDRGF5KCk6YS5nZXREYXkoKSkrNiklNyksU2suYnVpbHRpbi5hc3NrJChnZXREYXlPZlllYXIoYSxjKSksU2suYnVpbHRpbi5hc3NrJChjPzA6ZHN0KGEpPzE6MCldKX1mdW5jdGlvbiBmcm9tX3NlY29uZHMoYSxiKXt2YXIgYz1uZXcgRGF0ZTtpZihhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzZWNzXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTt2YXIgZD1Tay5idWlsdGluLmFzbnVtJChhKTtjLnNldFRpbWUoMWUzKmQpfXJldHVybiBkYXRlX3RvX3N0cnVjdF90aW1lKGMsYil9ZnVuY3Rpb24gYXNjdGltZV9mKGEpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImFzY3RpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSwhYXx8U2suYnVpbHRpbi5jaGVja05vbmUoYSk/YT1mcm9tX3NlY29uZHMoKTohKGEgaW5zdGFuY2VvZiBiKSYmKGE9bmV3IGIoYSkpLGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlJiY5PT1hLnYubGVuZ3RoKXt2YXIgZT1bZFtTay5idWlsdGluLmFzbnVtJChhLnZbNl0pXSxjW1NrLmJ1aWx0aW4uYXNudW0kKGEudlsxXSktMV0scGFkTGVmdChTay5idWlsdGluLmFzbnVtJChhLnZbMl0pLnRvU3RyaW5nKCksMixcXFwiMFxcXCIpLHBhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzNdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKStcXFwiOlxcXCIrcGFkTGVmdChTay5idWlsdGluLmFzbnVtJChhLnZbNF0pLnRvU3RyaW5nKCksMixcXFwiMFxcXCIpK1xcXCI6XFxcIitwYWRMZWZ0KFNrLmJ1aWx0aW4uYXNudW0kKGEudls1XSkudG9TdHJpbmcoKSwyLFxcXCIwXFxcIikscGFkTGVmdChTay5idWlsdGluLmFzbnVtJChhLnZbMF0pLnRvU3RyaW5nKCksNCxcXFwiMFxcXCIpXTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGUuam9pbihcXFwiIFxcXCIpKX19ZnVuY3Rpb24gbWt0aW1lX2YoYSl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibWt0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUmJjk9PWEudi5sZW5ndGgpe3ZhciBiPW5ldyBEYXRlKFNrLmJ1aWx0aW4uYXNudW0kKGEudlswXSksU2suYnVpbHRpbi5hc251bSQoYS52WzFdKS0xLFNrLmJ1aWx0aW4uYXNudW0kKGEudlsyXSksU2suYnVpbHRpbi5hc251bSQoYS52WzNdKSxTay5idWlsdGluLmFzbnVtJChhLnZbNF0pLFNrLmJ1aWx0aW4uYXNudW0kKGEudls1XSkpO3JldHVybiBTay5idWlsdGluLmFzc2skKGIuZ2V0VGltZSgpLzFlMyx2b2lkIDApfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWt0aW1lKCkgcmVxdWlyZXMgYSBzdHJ1Y3RfdGltZSBvciA5LXR1cGxlXFxcIil9dmFyIGE9e19fcGFja2FnZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwiXFxcIil9LGI9U2suYnVpbHRpbi5tYWtlX3N0cnVjdHNlcShcXFwidGltZVxcXCIsXFxcInN0cnVjdF90aW1lXFxcIix7dG1feWVhcjpcXFwieWVhciwgZm9yIGV4YW1wbGUsIDE5OTNcXFwiLHRtX21vbjpcXFwibW9udGggb2YgeWVhciwgcmFuZ2UgWzEsIDEyXVxcXCIsdG1fbWRheTpcXFwiZGF5IG9mIG1vbnRoLCByYW5nZSBbMSwgMzFdXFxcIix0bV9ob3VyOlxcXCJob3VycywgcmFuZ2UgWzAsIDIzXVxcXCIsdG1fbWluOlxcXCJtaW51dGVzLCByYW5nZSBbMCwgNTldXFxcIix0bV9zZWM6XFxcInNlY29uZHMsIHJhbmdlIFswLCA2MV1cXFwiLHRtX3dkYXk6XFxcImRheSBvZiB3ZWVrLCByYW5nZSBbMCwgNl0sIE1vbmRheSBpcyAwXFxcIix0bV95ZGF5OlxcXCJkYXkgb2YgeWVhciwgcmFuZ2UgWzEsIDM2Nl1cXFwiLHRtX2lzZHN0OlxcXCIxIGlmIHN1bW1lciB0aW1lIGlzIGluIGVmZmVjdCwgMCBpZiBub3QsIGFuZCAtMSBpZiB1bmtub3duXFxcIn0pO2Euc3RydWN0X3RpbWU9YixhLnRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInRpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKTt2YXIgYT1EYXRlLm5vdygpO3JldHVybiB0aGlzLnBlcmZvcm1hbmNlJiZ0aGlzLnBlcmZvcm1hbmNlLm5vdyYmKGErPXBlcmZvcm1hbmNlLm5vdygpJTEpLFNrLmJ1aWx0aW4uYXNzayQoYS8xZTMsdm9pZCAwKX0pLGEuc2xlZXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2xlZXBcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJkZWxheVxcXCIsXFxcImZsb2F0XFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2subWlzY2V2YWwucHJvbWlzZVRvU3VzcGVuc2lvbihuZXcgUHJvbWlzZShmdW5jdGlvbihiKXtTay5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YihTay5idWlsdGluLm5vbmUubm9uZSQpfSwxZTMqU2suZmZpLnJlbWFwVG9KcyhhKSl9KSl9KSxhLmxvY2FsdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJsb2NhbHRpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSxmcm9tX3NlY29uZHMoYSwhMSl9KSxhLmdtdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnbXRpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSxmcm9tX3NlY29uZHMoYSwhMCl9KTt2YXIgYz1bXFxcIkphblxcXCIsXFxcIkZlYlxcXCIsXFxcIk1hclxcXCIsXFxcIkFwclxcXCIsXFxcIk1heVxcXCIsXFxcIkp1blxcXCIsXFxcIkp1bFxcXCIsXFxcIkF1Z1xcXCIsXFxcIlNlcFxcXCIsXFxcIk9jdFxcXCIsXFxcIk5vdlxcXCIsXFxcIkRlY1xcXCJdLGQ9W1xcXCJNb25cXFwiLFxcXCJUdWVcXFwiLFxcXCJXZWRcXFwiLFxcXCJUaHVcXFwiLFxcXCJGcmlcXFwiLFxcXCJTYXRcXFwiLFxcXCJTdW5cXFwiXTtyZXR1cm4gYS5hc2N0aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoYXNjdGltZV9mKSxhLmN0aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImN0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksYXNjdGltZV9mKGZyb21fc2Vjb25kcyhhKSl9KSxhLm1rdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKG1rdGltZV9mKSxhLnRpbWV6b25lPW5ldyBTay5idWlsdGluLmludF8oNjAqc3RkVGltZXpvbmVPZmZzZXQoKSksYS5hbHR6b25lPW5ldyBTay5idWlsdGluLmludF8oNjAqZnVuY3Rpb24gYWx0VGltZXpvbmVPZmZzZXQoKXt2YXIgYT1NYXRoLm1pbixiPW5ldyBEYXRlKDIwMDIsMCwxKSxjPW5ldyBEYXRlKDIwMDIsNiwxKTtyZXR1cm4gYShiLmdldFRpbWV6b25lT2Zmc2V0KCksYy5nZXRUaW1lem9uZU9mZnNldCgpKX0oKSksYS5kYXlsaWdodD1uZXcgU2suYnVpbHRpbi5pbnRfKGRzdChuZXcgRGF0ZSk/MTowKSxhLnR6bmFtZT1uZXcgU2suYnVpbHRpbi50dXBsZShmdW5jdGlvbiB0aW1lWm9uZU5hbWVzKCl7dmFyIGE9bmV3IERhdGUoMjAwMiwwLDEpLGI9bmV3IERhdGUoMjAwMiw2LDEpO3JldHVybiBkc3QoYSk/W25ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYikpLG5ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYSkpXTpbbmV3IFNrLmJ1aWx0aW4uc3RyKHRpbWVab25lTmFtZShhKSksbmV3IFNrLmJ1aWx0aW4uc3RyKHRpbWVab25lTmFtZShiKSldfSgpKSxhLmFjY2VwdDJkeWVhcj1Tay5idWlsdGluLmFzc2skKDEpLGEuY2xvY2s9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhPTA7cmV0dXJuIGE9dGhpcy5wZXJmb3JtYW5jZSYmdGhpcy5wZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCkvMWUzOm5ldyBEYXRlKCkuZ2V0VGltZSgpLzFlMyxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSl9KSxhLnN0cmZ0aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gc3RyZnRpbWVfZihhLGMpe3ZhciBkO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInN0cmZ0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMiksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmb3JtYXQgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO3JldHVybiBjPyEoYyBpbnN0YW5jZW9mIGIpJiYoYz1uZXcgYihjKSk6Yz1mcm9tX3NlY29uZHMoKSxjaGVja19zdHJ1Y3RfdGltZShjKSxkPVNrLmZmaS5yZW1hcFRvSnMoYSksU2suZmZpLnJlbWFwVG9QeShzdHJmdGltZShkLG5ldyBEYXRlKDFlMypta3RpbWVfZihjKS52KSkpfSksYS50enNldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIHR6c2V0X2YoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0aW1lLnR6c2V0KCkgaXMgbm90IHlldCBpbXBsZW1lbnRlZFxcXCIpfSksYS5zdHJwdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIHN0cnB0aW1lX2YoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzdHJwdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDIpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInN0cmluZ1xcXCIsXFxcInN0cmluZ1xcXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSksdm9pZCAwPT09Yj9iPW5ldyBTay5idWlsdGluLnN0cihcXFwiJWEgJWIgJWQgJUg6JU06JVMgJVlcXFwiKTpTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJmb3JtYXRcXFwiLFxcXCJzdHJpbmdcXFwiLFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpO2xldCBjPWRhdGVfdG9fc3RydWN0X3RpbWUoc3RycHRpbWUoU2suZmZpLnJlbWFwVG9KcyhhKSxTay5mZmkucmVtYXBUb0pzKGIpLCEwKSk7cmV0dXJuIGMudls4XT1uZXcgU2suYnVpbHRpbi5pbnRfKC0xKSxjfSksYX07XCIsXCJzcmMvbGliL3RpbWVpdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGltZWl0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdG9haWZmLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0b2FpZmYgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90b2tlbi5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e19fZmlsZV9fOlxcXCIvc3JjL2xpYi90b2tlbi5weVxcXCJ9O2NvbnN0IGI9W107Zm9yKHRva2VuIGluIFNrLnRva2VuLnRva19uYW1lKXtjb25zdCBjPVNrLnRva2VuLnRva19uYW1lW3Rva2VuXS5zbGljZSgyKSxkPXBhcnNlSW50KHRva2VuLDEwKTtiLnB1c2goU2suZmZpLnJlbWFwVG9QeShkKSksYi5wdXNoKFNrLmZmaS5yZW1hcFRvUHkoYykpLGFbY109U2suZmZpLnJlbWFwVG9QeShkKX1yZXR1cm4gYS50b2tfbmFtZT1uZXcgU2suYnVpbHRpbi5kaWN0KGIpLGEuSVNURVJNSU5BTD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJJU1RFUk1JTkFMXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2sudG9rZW4uSVNURVJNSU5BTChTay5mZmkucmVtYXBUb0pzKGEpKX0pLGEuSVNOT05URVJNSU5BTD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJJU05PTlRFUk1JTkFMXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2sudG9rZW4uSVNOT05URVJNSU5BTChTay5mZmkucmVtYXBUb0pzKGEpKX0pLGEuSVNFT0Y9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiSVNFT0ZcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay50b2tlbi5JU0VPRihTay5mZmkucmVtYXBUb0pzKGEpKX0pLGF9O1wiLFwic3JjL2xpYi90b2tlbml6ZS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e3Rva2VuaXplOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwidG9rZW5pemVcXFwiLDEsMSksU2suYnVpbHRpbi5jaGVja0Z1bmN0aW9uKGEpO2NvbnN0IGI9W107cmV0dXJuIFNrLl90b2tlbml6ZShcXFwiPHN0ZGluPlxcXCIsZnVuY3Rpb24ganNSZWFkbGluZSgpe2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEpO3JldHVybiBTay5mZmkucmVtYXBUb0pzKGIpfSxcXFwiVVRGLThcXFwiLGZ1bmN0aW9uIHJlY2VpdmVUb2tlbihhKXtiLnB1c2gobmV3IFNrLmJ1aWx0aW4udHVwbGUoW1NrLmZmaS5yZW1hcFRvUHkoYS50eXBlKSxTay5mZmkucmVtYXBUb1B5KGEuc3RyaW5nKSxuZXcgU2suYnVpbHRpbi50dXBsZShbU2suZmZpLnJlbWFwVG9QeShhLnN0YXJ0WzBdKSxTay5mZmkucmVtYXBUb1B5KGEuc3RhcnRbMV0pXSksbmV3IFNrLmJ1aWx0aW4udHVwbGUoW1NrLmZmaS5yZW1hcFRvUHkoYS5lbmRbMF0pLFNrLmZmaS5yZW1hcFRvUHkoYS5lbmRbMV0pXSksU2suZmZpLnJlbWFwVG9QeShhLmxpbmUpXSkpfSksbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0pfTtyZXR1cm4gYX07XCIsXCJzcmMvbGliL3RyYWNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0cmFjZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RyYWNlYmFjay5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHJhY2ViYWNrIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdHR5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0dHkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90dXJ0bGUuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe1xcXCJ1c2Ugc3RyaWN0XFxcIjt2YXIgZT1mdW5jdGlvbiBnZXRDb25maWd1cmVkVGFyZ2V0KCl7dmFyIGUsdDtmb3IoZT1Tay5UdXJ0bGVHcmFwaGljcyYmU2suVHVydGxlR3JhcGhpY3MudGFyZ2V0fHxcXFwidHVydGxlXFxcIix0PVxcXCJzdHJpbmdcXFwiPT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKTplO3QuZmlyc3RDaGlsZDspdC5yZW1vdmVDaGlsZCh0LmZpcnN0Q2hpbGQpO3JldHVybiB0fSgpO3JldHVybiBlLnR1cnRsZUluc3RhbmNlP2UudHVydGxlSW5zdGFuY2UucmVzZXQoKTplLnR1cnRsZUluc3RhbmNlPWZ1bmN0aW9uIGdlbmVyYXRlVHVydGxlTW9kdWxlKGUpe3ZhciB0PU1hdGgucm91bmQscj1NYXRoLm1heCxuPU1hdGguc3FydCxhPU1hdGgubWluLHM9TWF0aC5hYnMsbz1NYXRoLlBJLGQ9TWF0aC5hdGFuMixfPU1hdGguc2luLGM9TWF0aC5jb3M7ZnVuY3Rpb24gZ2V0QXNzZXQoZSl7dmFyIHQ9Zy5hc3NldHMscj1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgdD90KGUpOnRbZV07cmV0dXJuXFxcInN0cmluZ1xcXCI9PXR5cGVvZiByP25ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7dmFyIGE9bmV3IEltYWdlO2Eub25sb2FkPWZ1bmN0aW9uKCl7Zy5hc3NldHNbZV09dGhpcyx0KGEpfSxhLm9uZXJyb3I9ZnVuY3Rpb24oKXtuKG5ldyBFcnJvcihcXFwiTWlzc2luZyBhc3NldDogXFxcIityKSl9LGEuc3JjPXJ9KTpuZXcgSW5zdGFudFByb21pc2Uodm9pZCAwLHIpfWZ1bmN0aW9uIEluc3RhbnRQcm9taXNlKGUsdCl7dGhpcy5sYXN0UmVzdWx0PXQsdGhpcy5sYXN0RXJyb3I9ZX1mdW5jdGlvbiBGcmFtZU1hbmFnZXIoKXt0aGlzLnJlc2V0KCl9ZnVuY3Rpb24gZ2V0RnJhbWVNYW5hZ2VyKCl7cmV0dXJuIEF8fChBPW5ldyBGcmFtZU1hbmFnZXIpLEF9ZnVuY3Rpb24gTW91c2VIYW5kbGVyKCl7dmFyIHQ9dGhpcztmb3IodmFyIHIgaW4gdGhpcy5fdGFyZ2V0PWdldFRhcmdldCgpLHRoaXMuX21hbmFnZXJzPXt9LHRoaXMuX2hhbmRsZXJzPXttb3VzZWRvd246ZnVuY3Rpb24ocil7dC5vbkV2ZW50KFxcXCJtb3VzZWRvd25cXFwiLHIpfSxtb3VzZXVwOmZ1bmN0aW9uKHIpe3Qub25FdmVudChcXFwibW91c2V1cFxcXCIscil9LG1vdXNlbW92ZTpmdW5jdGlvbihyKXt0Lm9uRXZlbnQoXFxcIm1vdXNlbW92ZVxcXCIscil9fSx0aGlzLl9oYW5kbGVycyl0aGlzLl90YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihyLHRoaXMuX2hhbmRsZXJzW3JdKX1mdW5jdGlvbiBFdmVudE1hbmFnZXIoZSx0KXt0aGlzLl90eXBlPWUsdGhpcy5fdGFyZ2V0PXQsdGhpcy5faGFuZGxlcnM9dm9pZCAwLGdldE1vdXNlSGFuZGxlcigpLmFkZE1hbmFnZXIoZSx0aGlzKX1mdW5jdGlvbiBUdXJ0bGUoZSl7aWYoZ2V0RnJhbWVNYW5hZ2VyKCkuYWRkVHVydGxlKHRoaXMpLHRoaXMuX3NjcmVlbj1nZXRTY3JlZW4oKSx0aGlzLl9tYW5hZ2Vycz17fSx0aGlzLl9zaGFwZT1lLnYsIXYuaGFzT3duUHJvcGVydHkodGhpcy5fc2hhcGUpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlNoYXBlOidcXFwiK3RoaXMuX3NoYXBlK1xcXCInIG5vdCBpbiBkZWZhdWx0IHNoYXBlLCBwbGVhc2UgY2hlY2sgc2hhcGUgYWdhaW4hXFxcIik7dGhpcy5yZXNldCgpfWZ1bmN0aW9uIFNjcmVlbigpe3ZhciBlLHQ7dGhpcy5fZnJhbWVzPTEsdGhpcy5fZGVsYXk9dm9pZCAwLHRoaXMuX2JnY29sb3I9XFxcIm5vbmVcXFwiLHRoaXMuX21vZGU9XFxcInN0YW5kYXJkXFxcIix0aGlzLl9tYW5hZ2Vycz17fSx0aGlzLl9rZXlMb2dnZXI9e30sZT0oZy53b3JsZFdpZHRofHxnLndpZHRofHxnZXRXaWR0aCgpKS8yLHQ9KGcud29ybGRIZWlnaHR8fGcuaGVpZ2h0fHxnZXRIZWlnaHQoKSkvMix0aGlzLnNldFVwV29ybGQoLWUsLXQsZSx0KX1mdW5jdGlvbiBlbnN1cmVBbm9ueW1vdXMoKXtyZXR1cm4gZnx8KGY9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHkuVHVydGxlKSksZi5pbnN0YW5jZX1mdW5jdGlvbiBnZXRUYXJnZXQoKXtyZXR1cm4gZX1mdW5jdGlvbiBnZXRTY3JlZW4oKXtyZXR1cm4gcHx8KHA9bmV3IFNjcmVlbikscH1mdW5jdGlvbiBnZXRNb3VzZUhhbmRsZXIoKXtyZXR1cm4gaHx8KGg9bmV3IE1vdXNlSGFuZGxlciksaH1mdW5jdGlvbiBnZXRXaWR0aCgpe3JldHVybiAwfChwJiZwLl93aWR0aHx8Zy53aWR0aHx8Z2V0VGFyZ2V0KCkuY2xpZW50V2lkdGh8fFQud2lkdGgpfWZ1bmN0aW9uIGdldEhlaWdodCgpe3JldHVybiAwfChwJiZwLl9oZWlnaHR8fGcuaGVpZ2h0fHxnZXRUYXJnZXQoKS5jbGllbnRIZWlnaHR8fFQuaGVpZ2h0KX1mdW5jdGlvbiBjcmVhdGVMYXllcihlLHQpe3ZhciByLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIiksYT1nZXRXaWR0aCgpLHM9Z2V0SGVpZ2h0KCksbD1nZXRUYXJnZXQoKS5maXJzdENoaWxkPy1zK1xcXCJweFxcXCI6XFxcIjBcXFwiO3JldHVybiBuLndpZHRoPWEsbi5oZWlnaHQ9cyxuLnN0eWxlLnBvc2l0aW9uPVxcXCJyZWxhdGl2ZVxcXCIsbi5zdHlsZS5kaXNwbGF5PVxcXCJibG9ja1xcXCIsbi5zdHlsZS5zZXRQcm9wZXJ0eShcXFwibWFyZ2luLXRvcFxcXCIsbCksbi5zdHlsZS5zZXRQcm9wZXJ0eShcXFwiei1pbmRleFxcXCIsZSksdCYmKG4uc3R5bGUuZGlzcGxheT1cXFwibm9uZVxcXCIpLGdldFRhcmdldCgpLmFwcGVuZENoaWxkKG4pLHI9bi5nZXRDb250ZXh0KFxcXCIyZFxcXCIpLHIubGluZUNhcD1cXFwicm91bmRcXFwiLHIubGluZUpvaW49XFxcInJvdW5kXFxcIixhcHBseVdvcmxkKGdldFNjcmVlbigpLHIpLHJ9ZnVuY3Rpb24gY2FuY2VsQW5pbWF0aW9uRnJhbWUoKXt1JiYoKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lKSh1KSx1PXZvaWQgMCksbSYmKHdpbmRvdy5jbGVhclRpbWVvdXQobSksbT12b2lkIDApfWZ1bmN0aW9uIGFwcGx5V29ybGQoZSx0KXt2YXIgcj1lLmxseCxuPWUubGx5LGE9ZS51cngscz1lLnVyeSxsPWUueFNjYWxlLGk9ZS55U2NhbGU7dCYmKGNsZWFyTGF5ZXIodCksdC5yZXN0b3JlKCksdC5zYXZlKCksdC5zY2FsZSgxL2wsMS9pKSx0LnRyYW5zbGF0ZSgtciwtcykpfWZ1bmN0aW9uIHB1c2hVbmRvKGUpe3ZhciB0LHIsbjtpZihnLmFsbG93VW5kbyYmZS5fYnVmZmVyU2l6ZSl7Zm9yKGUuX3VuZG9CdWZmZXJ8fChlLl91bmRvQnVmZmVyPVtdKTtlLl91bmRvQnVmZmVyLmxlbmd0aD5lLl9idWZmZXJTaXplOyllLl91bmRvQnVmZmVyLnNoaWZ0KCk7Zm9yKHI9e30sdD1bXFxcInhcXFwiLFxcXCJ5XFxcIixcXFwiYW5nbGVcXFwiLFxcXCJyYWRpYW5zXFxcIixcXFwiY29sb3JcXFwiLFxcXCJmaWxsXFxcIixcXFwiZG93blxcXCIsXFxcImZpbGxpbmdcXFwiLFxcXCJzaG93blxcXCIsXFxcInNoYXBlXFxcIixcXFwic2l6ZVxcXCJdLG49MDtuPHQubGVuZ3RoO24rKylyW3Rbbl1dPWVbXFxcIl9cXFwiK3Rbbl1dO3JldHVybiBlLl91bmRvQnVmZmVyLnB1c2gociksZS5hZGRVcGRhdGUoZnVuY3Rpb24oKXtyLmZpbGxCdWZmZXI9dGhpcy5maWxsQnVmZmVyP3RoaXMuZmlsbEJ1ZmZlci5zbGljZSgpOnZvaWQgMCxlLl9wYXBlciYmZS5fcGFwZXIuY2FudmFzJiYoci5pbWFnZT1lLl9wYXBlci5jYW52YXMudG9EYXRhVVJMKCkpfSwhMSl9fWZ1bmN0aW9uIHBvcFVuZG8oZSl7dmFyIHQ7aWYoZS5fYnVmZmVyU2l6ZSYmZS5fdW5kb0J1ZmZlciYmKHQ9ZS5fdW5kb0J1ZmZlci5wb3AoKSwhIXQpKXtmb3IodmFyIHIgaW4gdClcXFwiaW1hZ2VcXFwiIT1yJiZcXFwiZmlsbEJ1ZmZlclxcXCIhPT1yJiYoZVtcXFwiX1xcXCIrcl09dFtyXSk7cmV0dXJuIGUuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7dmFyIGU7dC5pbWFnZSYmKEwuc3JjPXQuaW1hZ2UsZT1MKSxjbGVhckxheWVyKHRoaXMuY29udGV4dCgpLCExLEwpLGRlbGV0ZSB0LmltYWdlfSwhMCx0KX19ZnVuY3Rpb24gcmVtb3ZlTGF5ZXIoZSl7ZSYmZS5jYW52YXMmJmUuY2FudmFzLnBhcmVudE5vZGUmJmUuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZS5jYW52YXMpfWZ1bmN0aW9uIGNsZWFyTGF5ZXIoZSx0LHIpe2UmJihlLnNhdmUoKSxlLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksdD8oZS5maWxsU3R5bGU9dCxlLmZpbGxSZWN0KDAsMCxlLmNhbnZhcy53aWR0aCxlLmNhbnZhcy5oZWlnaHQpKTplLmNsZWFyUmVjdCgwLDAsZS5jYW52YXMud2lkdGgsZS5jYW52YXMuaGVpZ2h0KSxyJiZlLmRyYXdJbWFnZShyLDAsMCksZS5yZXN0b3JlKCkpfWZ1bmN0aW9uIGRyYXdUdXJ0bGUoZSx0KXt2YXIgcixuLGEscz12W2Uuc2hhcGVdLGw9Z2V0U2NyZWVuKCksdT1nZXRXaWR0aCgpLG09Z2V0SGVpZ2h0KCkscD1sLnhTY2FsZSxnPWwueVNjYWxlO2lmKHQpe2lmKHI9YyhlLnJhZGlhbnMpL3Asbj1fKGUucmFkaWFucykvZyxhPWQobixyKS1vLzIsdC5zYXZlKCksdC50cmFuc2xhdGUoZS54LGUueSksdC5zY2FsZShwLGcpLHMubm9kZU5hbWUpe3ZhciBmPXMubmF0dXJhbFdpZHRoLGg9cy5uYXR1cmFsSGVpZ2h0O3QuZHJhd0ltYWdlKHMsMCwwLGYsaCwtZi8yLC1oLzIsZixoKX1lbHNle3Qucm90YXRlKGEpLHQuYmVnaW5QYXRoKCksdC5saW5lV2lkdGg9MSx0LnN0cm9rZVN0eWxlPWUuY29sb3IsdC5maWxsU3R5bGU9ZS5maWxsLHQubW92ZVRvKC1zWzBdWzBdLHNbMF1bMV0pO2Zvcih2YXIgJD0xOyQ8cy5sZW5ndGg7JCsrKXQubGluZVRvKC1zWyRdWzBdLHNbJF1bMV0pO3QuY2xvc2VQYXRoKCksdC5maWxsKCksdC5zdHJva2UoKX10LnJlc3RvcmUoKX19ZnVuY3Rpb24gZHJhd0RvdChlLHQpe3ZhciByPXRoaXMuY29udGV4dCgpLG49Z2V0U2NyZWVuKCksbD1uLnhTY2FsZSxpPW4ueVNjYWxlO3ImJihyLmJlZ2luUGF0aCgpLHIubW92ZVRvKHRoaXMueCx0aGlzLnkpLGUqPWEocyhsKSxzKGkpKSxyLmFyYyh0aGlzLngsdGhpcy55LGUvMiwwLFR1cnRsZS5SQURJQU5TKSxyLmNsb3NlUGF0aCgpLHIuZmlsbFN0eWxlPXR8fHRoaXMuY29sb3Isci5maWxsKCkpfWZ1bmN0aW9uIG1lYXN1cmVUZXh0KGUsdCl7cmV0dXJuIHQmJihTLmZvbnQ9dCksUy5tZWFzdXJlVGV4dChlKS53aWR0aH1mdW5jdGlvbiBkcmF3VGV4dChlLHQscil7dmFyIG49dGhpcy5jb250ZXh0KCk7biYmKG4uc2F2ZSgpLHImJihuLmZvbnQ9ciksdCYmdC5tYXRjaCgvXihsZWZ0fHJpZ2h0fGNlbnRlcikkLykmJihuLnRleHRBbGlnbj10KSxuLnNjYWxlKDEsLTEpLG4uZmlsbFN0eWxlPXRoaXMuZmlsbCxuLmZpbGxUZXh0KGUsdGhpcy54LC10aGlzLnkpLG4ucmVzdG9yZSgpKX1mdW5jdGlvbiBkcmF3TGluZShlLHQpe3ZhciByPXRoaXMuY29udGV4dCgpO3ImJih0JiYoci5iZWdpblBhdGgoKSxyLm1vdmVUbyh0aGlzLngsdGhpcy55KSksci5saW5lV2lkdGg9dGhpcy5zaXplKmdldFNjcmVlbigpLmxpbmVTY2FsZSxyLnN0cm9rZVN0eWxlPXRoaXMuY29sb3Isci5saW5lVG8oZS54LGUueSksci5zdHJva2UoKSl9ZnVuY3Rpb24gZHJhd0ZpbGwoKXt2YXIgZSx0PXRoaXMuY29udGV4dCgpLHI9dGhpcy5maWxsQnVmZmVyO2lmKHQmJnImJnIubGVuZ3RoKXtmb3IodC5zYXZlKCksdC5iZWdpblBhdGgoKSx0Lm1vdmVUbyhyWzBdLngsclswXS55KSxlPTE7ZTxyLmxlbmd0aDtlKyspdC5saW5lVG8ocltlXS54LHJbZV0ueSk7Zm9yKHQuY2xvc2VQYXRoKCksdC5maWxsU3R5bGU9dGhpcy5maWxsLHQuZmlsbCgpLGU9MTtlPHIubGVuZ3RoO2UrKylyW2VdLnN0cm9rZSYmKHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8ocltlLTFdLngscltlLTFdLnkpLHQubGluZVdpZHRoPXJbZV0uc2l6ZSpnZXRTY3JlZW4oKS5saW5lU2NhbGUsdC5zdHJva2VTdHlsZT1yW2VdLmNvbG9yLHQubGluZVRvKHJbZV0ueCxyW2VdLnkpLHQuc3Ryb2tlKCkpO3QucmVzdG9yZSgpfX1mdW5jdGlvbiBwYXJ0aWFsVHJhbnNsYXRlKGUsdCxyLG4sYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYWRkVXBkYXRlKGZ1bmN0aW9uKGUpe3RoaXMuZG93biYmZHJhd0xpbmUuY2FsbCh0aGlzLGUsbil9LGEse3g6dCx5OnJ9LG4pfX1mdW5jdGlvbiB0cmFuc2xhdGUoZSxhLGwsbyxkLF8sYyl7dmFyIHUsbT1lLl9jb21wdXRlZF9zcGVlZCxwPWdldFNjcmVlbigpLGc9cyhwLnhTY2FsZSksZj1zKHAueVNjYWxlKSxoPWEsJD1sLHc9bihvKm8qZytkKmQqZiksYj1tP3QocigxLHcvbSkpOjEsdj1nZXRGcmFtZU1hbmFnZXIoKS53aWxsUmVuZGVyTmV4dCgpP1Byb21pc2UucmVzb2x2ZSgpOm5ldyBJbnN0YW50UHJvbWlzZTtmb3IoZS5hZGRVcGRhdGUoZnVuY3Rpb24oKXt0aGlzLmZpbGxpbmcmJnRoaXMuZmlsbEJ1ZmZlci5wdXNoKHt4OnRoaXMueCx5OnRoaXMueSxzdHJva2U6dGhpcy5kb3duLGNvbG9yOnRoaXMuY29sb3Isc2l6ZTp0aGlzLnNpemV9KX0sITEpLHU9MDt1PGI7dSsrKWg9YStvL2IqKHUrMSksJD1sK2QvYioodSsxKSx2PXYudGhlbihwYXJ0aWFsVHJhbnNsYXRlKGUsaCwkLF8sbXx8IWMpKSxfPSExO3JldHVybiB2LnRoZW4oZnVuY3Rpb24oKXtyZXR1cm5bYStvLGwrZF19KX1mdW5jdGlvbiBwYXJ0aWFsUm90YXRlKGUsdCxyLG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFkZFVwZGF0ZSh2b2lkIDAsbix7YW5nbGU6dCxyYWRpYW5zOnJ9KX19ZnVuY3Rpb24gcm90YXRlKGUsbixhLGwpe3ZhciBvLGQ9ZS5fY29tcHV0ZWRfc3BlZWQsXz0zNjAqKGEvZS5fZnVsbENpcmNsZSksYz1kP3QocigxLHMoXykvZCkpOjEsdT17fSxtPWdldEZyYW1lTWFuYWdlcigpLndpbGxSZW5kZXJOZXh0KCk/UHJvbWlzZS5yZXNvbHZlKCk6bmV3IEluc3RhbnRQcm9taXNlO2ZvcihvPTA7bzxjO28rKyljYWxjdWxhdGVIZWFkaW5nKGUsbithL2MqKG8rMSksdSksbT1tLnRoZW4ocGFydGlhbFJvdGF0ZShlLHUuYW5nbGUsdS5yYWRpYW5zLGR8fCFsKSk7cmV0dXJuIG0udGhlbihmdW5jdGlvbigpe3JldHVybiBjYWxjdWxhdGVIZWFkaW5nKGUsbithKX0pfWZ1bmN0aW9uIGdldENvb3JkaW5hdGVzKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PWUmJihlLnl8fGUuX3l8fGVbMV0pfHwwLGU9ZSYmKGUueHx8ZS5feHx8ZVswXSl8fDApLHt4OmUseTp0fX1mdW5jdGlvbiBoZXhUb1JHQihlKXt2YXIgdCxyLG47cmV0dXJuKHQ9L15yZ2JhP1xcXFwoKFxcXFxkKyksKFxcXFxkKyksKFxcXFxkKykoPzosKFsuXFxcXGRdKykpP1xcXFwpJC8uZXhlYyhlKSk/KG49W3BhcnNlSW50KHRbMV0pLHBhcnNlSW50KHRbMl0pLHBhcnNlSW50KHRbM10pXSx0WzRdJiZuLnB1c2gocGFyc2VGbG9hdCh0WzRdKSkpOi9eIz9bYS1mXFxcXGRdezN9fFthLWZcXFxcZF17Nn0kL2kuZXhlYyhlKT8oND09PWUubGVuZ3RoJiYoZT1lLnJlcGxhY2UoL14jPyhbYS1mXFxcXGRdKShbYS1mXFxcXGRdKShbYS1mXFxcXGRdKSQvaSxmdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdCt0K3IrcituK259KSkscj0vXiM/KFthLWZcXFxcZF17Mn0pKFthLWZcXFxcZF17Mn0pKFthLWZcXFxcZF17Mn0pJC9pLmV4ZWMoZSksbj1bcGFyc2VJbnQoclsxXSwxNikscGFyc2VJbnQoclsyXSwxNikscGFyc2VJbnQoclszXSwxNildKTpuPWUsbn1mdW5jdGlvbiBjcmVhdGVDb2xvcihlLHQsbixzLGwpe3ZhciBvO2lmKHZvaWQgMCE9PW4mJih0PVt0LG4scyxsXSksdC5jb25zdHJ1Y3Rvcj09PUFycmF5JiZ0Lmxlbmd0aCl7aWYoMjU1PT09ZSl7Zm9yKG89MDszPm87bysrKWlmKFxcXCJudW1iZXJcXFwiPT10eXBlb2YgdFtvXSl0W29dPXIoMCxhKDI1NSxwYXJzZUludCh0W29dKSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIGNvbG9yIHNlcXVlbmNlXFxcIik7fWVsc2UgZm9yKG89MDszPm87bysrKWlmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgdFtvXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJiYWQgY29sb3Igc2VxdWVuY2VcXFwiKTtlbHNlIGlmKDE+PXRbb10pdFtvXT1yKDAsYSgyNTUscGFyc2VJbnQoMjU1KnRbb10pKSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJiYWQgY29sb3Igc2VxdWVuY2VcXFwiKTtcXFwibnVtYmVyXFxcIj09dHlwZW9mIHRbb10/KHRbM109cigwLGEoMSx0W29dKSksdD1cXFwicmdiYShcXFwiK3Quam9pbihcXFwiLFxcXCIpK1xcXCIpXFxcIik6dD1cXFwicmdiKFxcXCIrdC5zbGljZSgwLDMpLmpvaW4oXFxcIixcXFwiKStcXFwiKVxcXCJ9ZWxzZSBpZihcXFwic3RyaW5nXFxcIj09dHlwZW9mIHQmJiF0Lm1hdGNoKC9cXFxccyp1cmxcXFxccypcXFxcKC9pKSl0PXQucmVwbGFjZSgvXFxcXHMrL2csXFxcIlxcXCIpO2Vsc2UgcmV0dXJuXFxcImJsYWNrXFxcIjtyZXR1cm4gdH1mdW5jdGlvbiBjYWxjdWxhdGVIZWFkaW5nKGUsdCxyKXt2YXIgbj1lLl9hbmdsZXx8MCxhPWUuX3JhZGlhbnN8fDA7cmV0dXJuIHJ8fChyPXt9KSxcXFwibnVtYmVyXFxcIj09dHlwZW9mIHQmJihlLl9pc1JhZGlhbnM/bj1hPXQlVHVydGxlLlJBRElBTlM6ZS5fZnVsbENpcmNsZT8obj10JWUuX2Z1bGxDaXJjbGUsYT1uL2UuX2Z1bGxDaXJjbGUqVHVydGxlLlJBRElBTlMpOm49YT0wLDA+biYmKG4rPWUuX2Z1bGxDaXJjbGUsYSs9VHVydGxlLlJBRElBTlMpKSxyLmFuZ2xlPW4sci5yYWRpYW5zPWEscn1mdW5jdGlvbiBweXRob25Ub0phdmFzY3JpcHRGdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksbj1yLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShlKX0pO3JldHVyblxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgdCYmbi51bnNoaWZ0KHQpLFNrLm1pc2NldmFsLmFwcGx5QXN5bmModm9pZCAwLGUsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbikuY2F0Y2goU2sudW5jYXVnaHRFeGNlcHRpb24pfX1mdW5jdGlvbiBhZGRNb2R1bGVNZXRob2QoZSx0LHIsbil7dmFyIGEscz1yLnJlcGxhY2UoL15cXFxcJC8sXFxcIlxcXCIpLGw9cy5yZXBsYWNlKC9fXFxcXCRbYS16XStcXFxcJCQvaSxcXFwiXFxcIiksbz1lLnByb3RvdHlwZVtyXS5sZW5ndGgsZD1lLnByb3RvdHlwZVtyXS5taW5BcmdzLF89ZS5wcm90b3R5cGVbcl0uY29fdmFybmFtZXN8fFtdLGM9ZS5wcm90b3R5cGVbcl0ucmV0dXJuVHlwZSx1PWUucHJvdG90eXBlW3JdLmlzU2s7dm9pZCAwPT09ZCYmKGQ9byksYT1mdW5jdGlvbigpe3ZhciBlLHQsYSxzLF8sbT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkscD1uP24oKTptLnNoaWZ0KCkuaW5zdGFuY2U7aWYobS5sZW5ndGg8ZHx8bS5sZW5ndGg+byl0aHJvdyBfPWQ9PT1vP1xcXCJleGFjdGx5IFxcXCIrbzpcXFwiYmV0d2VlbiBcXFwiK2QrXFxcIiBhbmQgXFxcIitvLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihsK1xcXCIoKSB0YWtlcyBcXFwiK18rXFxcIiBwb3NpdGlvbmFsIGFyZ3VtZW50KHMpIChcXFwiK20ubGVuZ3RoK1xcXCIgZ2l2ZW4pXFxcIik7Zm9yKGU9bS5sZW5ndGg7MDw9LS1lOyl2b2lkIDAhPT1tW2VdJiYobVtlXT1tW2VdaW5zdGFuY2VvZiBTay5idWlsdGluLmZ1bmM/cHl0aG9uVG9KYXZhc2NyaXB0RnVuY3Rpb24obVtlXSk6bVtlXWluc3RhbmNlb2YgU2suYnVpbHRpbi5tZXRob2Q/cHl0aG9uVG9KYXZhc2NyaXB0RnVuY3Rpb24obVtlXS5pbV9mdW5jLG1bZV0uaW1fc2VsZik6bVtlXSYmbVtlXS4kZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCYmbVtlXS5pbnN0YW5jZT9tW2VdLmluc3RhbmNlOlNrLmZmaS5yZW1hcFRvSnMobVtlXSkpO3ZhciBnPW0uc2xpY2UoMCk7Zm9yKG09W10sZT1nLmxlbmd0aDswPD1lOy0tZSludWxsIT09Z1tlXSYmKG1bZV09Z1tlXSk7dHJ5e3Q9cFtyXS5hcHBseShwLG0pfWNhdGNoKHQpe3Rocm93IHdpbmRvdyYmd2luZG93LmNvbnNvbGUmJih3aW5kb3cuY29uc29sZS5sb2coXFxcIndyYXBwZWQgbWV0aG9kIGZhaWxlZFxcXCIpLHdpbmRvdy5jb25zb2xlLmxvZyh0LnN0YWNrKSksdH1yZXR1cm4gdCBpbnN0YW5jZW9mIEluc3RhbnRQcm9taXNlJiYodD10Lmxhc3RSZXN1bHQpLHQgaW5zdGFuY2VvZiBQcm9taXNlPyh0PXQuY2F0Y2goZnVuY3Rpb24odCl7dGhyb3cgd2luZG93JiZ3aW5kb3cuY29uc29sZSYmKHdpbmRvdy5jb25zb2xlLmxvZyhcXFwicHJvbWlzZSBmYWlsZWRcXFwiKSx3aW5kb3cuY29uc29sZS5sb2codC5zdGFjaykpLHR9KSxhPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uLGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXM/U2suYnVpbHRpbi5ub25lLm5vbmUkOlNrLmZmaS5yZW1hcFRvUHkocyl9LGEuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTp0LnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIHM9ZSxlfSl9LGEpOnZvaWQgMD09PXQ/U2suYnVpbHRpbi5ub25lLm5vbmUkOnU/dDpcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgYz9jKHQpOlNrLmZmaS5yZW1hcFRvUHkodCl9LGEuY29fbmFtZT1uZXcgU2suYnVpbHRpbi5zdHIobCksYS5jb192YXJuYW1lcz1fLnNsaWNlKCksYS4kZGVmYXVsdHM9W107Zm9yKHZhciBtPWQ7bTxfLmxlbmd0aDttKyspYS4kZGVmYXVsdHMucHVzaChTay5idWlsdGluLm5vbmUubm9uZSQpO258fGEuY29fdmFybmFtZXMudW5zaGlmdChcXFwic2VsZlxcXCIpLHRbc109bmV3IFNrLmJ1aWx0aW4uZnVuYyhhKX1mdW5jdGlvbiBpbml0VHVydGxlKGUsdCl7U2suYnVpbHRpbi5weUNoZWNrQXJncyhcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cywyLDMsITEsITEpLGUuaW5zdGFuY2U9bmV3IFR1cnRsZSh0KSxlLmluc3RhbmNlLnNrSW5zdGFuY2U9ZX1mdW5jdGlvbiBmb2N1c1R1cnRsZShlKXtyZXR1cm4gdm9pZCAwIT09ZSYmKHc9ISFlLHc/Z2V0VGFyZ2V0KCkuZm9jdXMoKTpnZXRUYXJnZXQoKS5ibHVyKCkpLHd9ZnVuY3Rpb24gcmVzZXRUdXJ0bGUoKXtmb3IoY2FuY2VsQW5pbWF0aW9uRnJhbWUoKSxnZXRTY3JlZW4oKS5yZXNldCgpLGdldEZyYW1lTWFuYWdlcigpLnJlc2V0KCk7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7aCYmaC5yZXNldCgpLCQ9MCxwPXZvaWQgMCxmPXZvaWQgMCxoPXZvaWQgMCxrPTB9ZnVuY3Rpb24gc3RvcFR1cnRsZSgpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKCksaCYmaC5yZXNldCgpLCQ9MCxwPXZvaWQgMCxmPXZvaWQgMCxoPXZvaWQgMCxrPTB9dmFyIHUsbSxwLGcsZixoLHk9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwidHVydGxlXFxcIil9LCQ9MCx3PSEwLGI9MWUzLzMwLHY9e30saz0wLHg9e30sVD17dGFyZ2V0OlxcXCJ0dXJ0bGVcXFwiLHdpZHRoOjQwMCxoZWlnaHQ6NDAwLHdvcmxkV2lkdGg6MCx3b3JsZEhlaWdodDowLGFuaW1hdGU6ITAsYnVmZmVyU2l6ZTowLGFsbG93VW5kbzohMCxhc3NldHM6e319O2UuaGFzQXR0cmlidXRlKFxcXCJ0YWJpbmRleFxcXCIpfHxlLnNldEF0dHJpYnV0ZShcXFwidGFiaW5kZXhcXFwiLDApLHguRkxPQVQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhlKX0seC5DT0xPUj1mdW5jdGlvbihlKXtpZihcXFwic3RyaW5nXFxcIj09dHlwZW9mIGUpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlKTtmb3IodmFyIHQ9MDszPnQ7dCsrKWVbdF09U2suYnVpbHRpbi5hc3NrJChlW3RdKTtyZXR1cm4gND09PWUubGVuZ3RoJiYoZVszXT1uZXcgU2suYnVpbHRpbi5mbG9hdF8oZVszXSkpLG5ldyBTay5idWlsdGluLnR1cGxlKGUpfSx4LlRVUlRMRV9MSVNUPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxyPTA7cjxlLmxlbmd0aDtyKyspdC5wdXNoKGVbcl0uc2tJbnN0YW5jZSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKHQpfSx2LmFycm93PVtbLTEwLDBdLFsxMCwwXSxbMCwxMF1dLHYuc3F1YXJlPVtbMTAsLTEwXSxbMTAsMTBdLFstMTAsMTBdLFstMTAsLTEwXV0sdi50cmlhbmdsZT1bWzEwLC01Ljc3XSxbMCwxMS41NV0sWy0xMCwtNS43N11dLHYuY2xhc3NpYz1bWzAsMF0sWy01LC05XSxbMCwtN10sWzUsLTldXSx2LnR1cnRsZT1bWzAsMTZdLFstMiwxNF0sWy0xLDEwXSxbLTQsN10sWy03LDldLFstOSw4XSxbLTYsNV0sWy03LDFdLFstNSwtM10sWy04LC02XSxbLTYsLThdLFstNCwtNV0sWzAsLTddLFs0LC01XSxbNiwtOF0sWzgsLTZdLFs1LC0zXSxbNywxXSxbNiw1XSxbOSw4XSxbNyw5XSxbNCw3XSxbMSwxMF0sWzIsMTRdXSx2LmNpcmNsZT1bWzEwLDBdLFs5LjUxLDMuMDldLFs4LjA5LDUuODhdLFs1Ljg4LDguMDldLFszLjA5LDkuNTFdLFswLDEwXSxbLTMuMDksOS41MV0sWy01Ljg4LDguMDldLFstOC4wOSw1Ljg4XSxbLTkuNTEsMy4wOV0sWy0xMCwwXSxbLTkuNTEsLTMuMDldLFstOC4wOSwtNS44OF0sWy01Ljg4LC04LjA5XSxbLTMuMDksLTkuNTFdLFstMCwtMTBdLFszLjA5LC05LjUxXSxbNS44OCwtOC4wOV0sWzguMDksLTUuODhdLFs5LjUxLC0zLjA5XV0sZz1mdW5jdGlvbigpe2Zvcih2YXIgZSBpbiBTay5UdXJ0bGVHcmFwaGljc3x8KFNrLlR1cnRsZUdyYXBoaWNzPXt9KSxUKVNrLlR1cnRsZUdyYXBoaWNzLmhhc093blByb3BlcnR5KGUpfHwoU2suVHVydGxlR3JhcGhpY3NbZV09VFtlXSk7cmV0dXJuIFNrLlR1cnRsZUdyYXBoaWNzfSgpLEluc3RhbnRQcm9taXNlLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKGUpe2lmKHRoaXMubGFzdEVycm9yKXJldHVybiB0aGlzO3RyeXt0aGlzLmxhc3RSZXN1bHQ9ZSh0aGlzLmxhc3RSZXN1bHQpfWNhdGNoKHQpe3RoaXMubGFzdFJlc3VsdD12b2lkIDAsdGhpcy5sYXN0RXJyb3I9dH1yZXR1cm4gdGhpcy5sYXN0UmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZT90aGlzLmxhc3RSZXN1bHQ6dGhpc30sSW5zdGFudFByb21pc2UucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKGUpe2lmKHRoaXMubGFzdEVycm9yKXRyeXt0aGlzLmxhc3RSZXN1bHQ9ZSh0aGlzLmxhc3RFcnJvciksdGhpcy5sYXN0RXJyb3I9dm9pZCAwfWNhdGNoKHQpe3RoaXMubGFzdFJlc3VsdD12b2lkIDAsdGhpcy5sYXN0RXJyb3I9dH1yZXR1cm4gdGhpcy5sYXN0UmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZT90aGlzLmxhc3RSZXN1bHQ6dGhpc307dmFyIEE7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGFuaW1hdGlvbkZyYW1lKGUpe3JldHVybiBnLmFuaW1hdGU/IWUmJnQ/dDpmdW5jdGlvbih0KXtyZXR1cm4gbT13aW5kb3cuc2V0VGltZW91dCh0LGV8fGIpLG19OmZ1bmN0aW9uKGUpe2UoKX19dmFyIHQ7KGZ1bmN0aW9uKGUpe2UmJih0PWZ1bmN0aW9uKHQpe3JldHVybiB1PWUodCl9KX0pKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpLGUud2lsbFJlbmRlck5leHQ9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9idWZmZXImJnRoaXMuX2ZyYW1lQ291bnQrMT09PXRoaXMuZnJhbWVCdWZmZXIoKSl9LGUudHVydGxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90dXJ0bGVzfSxlLmFkZFR1cnRsZT1mdW5jdGlvbihlKXt0aGlzLl90dXJ0bGVzLnB1c2goZSl9LGUucmVzZXQ9ZnVuY3Rpb24oKXtpZih0aGlzLl90dXJ0bGVzKWZvcih2YXIgZT10aGlzLl90dXJ0bGVzLmxlbmd0aDswPD0tLWU7KXRoaXMuX3R1cnRsZXNbZV0ucmVzZXQoKTt0aGlzLl90dXJ0bGVzPVtdLHRoaXMuX2ZyYW1lcz1bXSx0aGlzLl9mcmFtZUNvdW50PTAsdGhpcy5fYnVmZmVyPTEsdGhpcy5fcmF0ZT0wLHRoaXMuX2FuaW1hdGlvbkZyYW1lPWFuaW1hdGlvbkZyYW1lKCl9LGUuYWRkRnJhbWU9ZnVuY3Rpb24oZSx0KXt2YXIgcj0hMTtyZXR1cm4gdCYmKHRoaXMuX2ZyYW1lQ291bnQrPTEpLHRoaXMuZnJhbWVzKCkucHVzaChlKSxyPSFnLmFuaW1hdGV8fHRoaXMuX2J1ZmZlciYmdGhpcy5fZnJhbWVDb3VudD09PXRoaXMuZnJhbWVCdWZmZXIoKSxyP3RoaXMudXBkYXRlKCk6bmV3IEluc3RhbnRQcm9taXNlfSxlLmZyYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mcmFtZXN9LGUuZnJhbWVCdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuXFxcIm51bWJlclxcXCI9PXR5cGVvZiBlJiYodGhpcy5fYnVmZmVyPTB8ZSxlJiZlPD10aGlzLl9mcmFtZUNvdW50KT90aGlzLnVwZGF0ZSgpOnRoaXMuX2J1ZmZlcn0sZS5yZWZyZXNoSW50ZXJ2YWw9ZnVuY3Rpb24oZSl7cmV0dXJuXFxcIm51bWJlclxcXCI9PXR5cGVvZiBlJiYodGhpcy5fcmF0ZT0wfGUsdGhpcy5fYW5pbWF0aW9uRnJhbWU9YW5pbWF0aW9uRnJhbWUoZSkpLHRoaXMuX3JhdGV9LGUudXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZyYW1lcyYmdGhpcy5fZnJhbWVzLmxlbmd0aD90aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSgpOm5ldyBJbnN0YW50UHJvbWlzZX0sZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oKXt2YXIgZSx0LHI9dGhpcy5fZnJhbWVzLG49dGhpcy5fYW5pbWF0aW9uRnJhbWUsYT10aGlzLl90dXJ0bGVzLHM9Z2V0U2NyZWVuKCkuc3ByaXRlTGF5ZXIoKTtyZXR1cm4gdGhpcy5fZnJhbWVzPVtdLHRoaXMuX2ZyYW1lQ291bnQ9MCxuZXcgUHJvbWlzZShmdW5jdGlvbihsKXtuKGZ1bmN0aW9uIHBhaW50KCl7Zm9yKHQ9MDt0PHIubGVuZ3RoO3QrKylyW3RdJiZyW3RdKCk7Zm9yKGNsZWFyTGF5ZXIocyksdD0wO3Q8YS5sZW5ndGg7dCsrKWU9YVt0XSxlLmdldFN0YXRlKCkuc2hvd24mJmRyYXdUdXJ0bGUoZS5nZXRTdGF0ZSgpLHMpO2woKX0pfSl9fSkoRnJhbWVNYW5hZ2VyLnByb3RvdHlwZSksZnVuY3Rpb24oZSl7ZS5vbkV2ZW50PWZ1bmN0aW9uKHQscil7ZnVuY3Rpb24gY29tcHV0ZUNvb3JkaW5hdGVzKCl7aWYoIV8pe3ZhciB0PWdldFNjcmVlbigpLGw9dC5zcHJpdGVMYXllcigpLmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlPTB8ci5jbGllbnRYLWwubGVmdCxuPTB8ci5jbGllbnRZLWwudG9wLGE9ZSp0LnhTY2FsZSt0LmxseCxzPW4qdC55U2NhbGUrdC51cnksXz0hMH19dmFyIGUsbixhLHMsbCxvPXRoaXMuX21hbmFnZXJzW3RdLGQ9dGhpcy5fbWFuYWdlcnMubW91c2Vtb3ZlLF89ITE7aWYoKFxcXCJtb3VzZWRvd25cXFwiPT09dHx8XFxcIm1vdXNldXBcXFwiPT09dCkmJmQmJmQubGVuZ3RoKWZvcihjb21wdXRlQ29vcmRpbmF0ZXMoKSxsPWQubGVuZ3RoOzA8PS0tbDspZFtsXS50ZXN0KGUsbixhLHMpJiZkW2xdLmNhbk1vdmUoXFxcIm1vdXNlZG93blxcXCI9PT10KTtpZihvJiZvLmxlbmd0aClmb3IoY29tcHV0ZUNvb3JkaW5hdGVzKCksbD1vLmxlbmd0aDswPD0tLWw7KVxcXCJtb3VzZW1vdmVcXFwiPT09dCYmb1tsXS5jYW5Nb3ZlKCkmJm9bbF0udGVzdChlLG4sYSxzKT9vW2xdLnRyaWdnZXIoW2Esc10pOlxcXCJtb3VzZWRvd25cXFwiPT09dCYmb1tsXS50ZXN0KGUsbixhLHMpJiZvW2xdLnRyaWdnZXIoW2Esc10pfSxlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5fbWFuYWdlcnM9e319LGUuYWRkTWFuYWdlcj1mdW5jdGlvbihlLHQpe3RoaXMuX21hbmFnZXJzW2VdfHwodGhpcy5fbWFuYWdlcnNbZV09W10pLHRoaXMuX21hbmFnZXJzW2VdLnB1c2godCl9fShNb3VzZUhhbmRsZXIucHJvdG90eXBlKSxmdW5jdGlvbihlKXtlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5faGFuZGxlcnM9dm9pZCAwfSxlLmNhbk1vdmU9ZnVuY3Rpb24oZSl7cmV0dXJuISEodGhpcy5fdGFyZ2V0JiZ0aGlzLl90YXJnZXQuaGl0VGVzdCkmJih2b2lkIDAhPT1lJiYodGhpcy5fdGFyZ2V0LmhpdFRlc3QuaGl0PWUpLHRoaXMuX3RhcmdldC5oaXRUZXN0LmhpdCl9LGUudGVzdD1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdGhpcy5fdGFyZ2V0JiZ0aGlzLl90YXJnZXQuaGl0VGVzdD90aGlzLl90YXJnZXQuaGl0VGVzdChlLHQscixuKTohIXRoaXMuX3RhcmdldH0sZS50cmlnZ2VyPWZ1bmN0aW9uKGUpe3ZhciB0LHI9dGhpcy5faGFuZGxlcnM7aWYociYmci5sZW5ndGgpZm9yKHQ9MDt0PHIubGVuZ3RoO3QrKylyW3RdLmFwcGx5KHt9LGUpfSxlLmFkZEhhbmRsZXI9ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLl9oYW5kbGVycztpZighdCYmciYmci5sZW5ndGgpZm9yKDtyLnNoaWZ0KCk7KTtyZXR1cm5cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZT92b2lkKCFyJiYocj10aGlzLl9oYW5kbGVycz1bXSksci5wdXNoKGUpKTp2b2lkKHImJiFyLmxlbmd0aCYmdGhpcy5yZXNldCgpKX19KEV2ZW50TWFuYWdlci5wcm90b3R5cGUpLFR1cnRsZS5SQURJQU5TPTIqbyxmdW5jdGlvbihlKXtmdW5jdGlvbiBjaXJjbGVSb3RhdGUoZSx0LHIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFkZFVwZGF0ZSh2b2lkIDAsITEse2FuZ2xlOnQscmFkaWFuczpyfSl9fWZ1bmN0aW9uIGNpcmNsZVNlZ21lbnQoZSx0LHIsbixhLHMpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLnRyYW5zbGF0ZSh0LHIsbixhLHMsITApfX1lLmhpdFRlc3Q9ZnVuY3Rpb24oZSx0KXt2YXIgcj1nZXRTY3JlZW4oKS5oaXRUZXN0TGF5ZXIoKTtjbGVhckxheWVyKHIpLGRyYXdUdXJ0bGUodGhpcy5nZXRTdGF0ZSgpLHIpO3ZhciBuPXIuZ2V0SW1hZ2VEYXRhKGUsdCwxLDEpLmRhdGE7cmV0dXJuIG5bM118fG5bMF18fG5bMV18fG5bMl19LGUuYWRkVXBkYXRlPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10aGlzLGE9dGhpcy5nZXRTdGF0ZSgpLHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLHI/MjozKTtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkuYWRkRnJhbWUoZnVuY3Rpb24oKXtpZihlJiZlLmFwcGx5KGEscykscilmb3IodmFyIHQgaW4gcilhW3RdPXJbdF19LHQpfSxlLmdldFN0YXRlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5fc3RhdGV8fCh0aGlzLl9zdGF0ZT17eDp0aGlzLl94LHk6dGhpcy5feSxhbmdsZTp0aGlzLl9hbmdsZSxyYWRpYW5zOnRoaXMuX3JhZGlhbnMsc2hhcGU6dGhpcy5fc2hhcGUsY29sb3I6dGhpcy5fY29sb3IsZmlsbDp0aGlzLl9maWxsLGZpbGxpbmc6dGhpcy5fZmlsbGluZyxzaXplOnRoaXMuX3NpemUsc3BlZWQ6dGhpcy5fY29tcHV0ZWRfc3BlZWQsZG93bjp0aGlzLl9kb3duLHNob3duOnRoaXMuX3Nob3duLGNvbG9yTW9kZTp0aGlzLl9jb2xvck1vZGUsY29udGV4dDpmdW5jdGlvbigpe3JldHVybiBlLmdldFBhcGVyKCl9fSksdGhpcy5fc3RhdGV9LGUudHJhbnNsYXRlPWZ1bmN0aW9uKGUsdCxyLG4sYSxzKXt2YXIgbD10aGlzO3JldHVybiB0cmFuc2xhdGUodGhpcyxlLHQscixuLGEscykudGhlbihmdW5jdGlvbihlKXtsLl94PWVbMF0sbC5feT1lWzFdfSl9LGUucm90YXRlPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10aGlzO3JldHVybiByb3RhdGUodGhpcyxlLHQscikudGhlbihmdW5jdGlvbihlKXtuLl9hbmdsZT1lLmFuZ2xlLG4uX3JhZGlhbnM9ZS5yYWRpYW5zfSl9LGUucXVldWVNb3ZlQnk9ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGE9YyhyKSpuLHM9XyhyKSpuO3JldHVybiB0aGlzLnRyYW5zbGF0ZShlLHQsYSxzLCEwKX0sZS5xdWV1ZVR1cm5Ubz1mdW5jdGlvbihlLHQpe3JldHVybiB0JT10aGlzLl9mdWxsQ2lyY2xlLDA+dCYmKHQrPXRoaXMuX2Z1bGxDaXJjbGUpLHRoaXMucm90YXRlKGUsdC1lKX0sZS5nZXRNYW5hZ2VyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9tYW5hZ2Vyc1tlXXx8KHRoaXMuX21hbmFnZXJzW2VdPW5ldyBFdmVudE1hbmFnZXIoZSx0aGlzKSksdGhpcy5fbWFuYWdlcnNbZV19LGUuZ2V0UGFwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFwZXJ8fCh0aGlzLl9wYXBlcj1jcmVhdGVMYXllcigyKSl9LGUucmVzZXQ9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5feD0wLHRoaXMuX3k9MCx0aGlzLl9yYWRpYW5zPTAsdGhpcy5fYW5nbGU9MCx0aGlzLl9zaG93bj0hMCx0aGlzLl9kb3duPSEwLHRoaXMuX2NvbG9yPVxcXCJibGFja1xcXCIsdGhpcy5fZmlsbD1cXFwiYmxhY2tcXFwiLHRoaXMuX3NpemU9MSx0aGlzLl9maWxsaW5nPSExLHRoaXMuX3VuZG9CdWZmZXI9W10sdGhpcy5fc3BlZWQ9Myx0aGlzLl9jb21wdXRlZF9zcGVlZD01LHRoaXMuX2NvbG9yTW9kZT0xLHRoaXMuX3N0YXRlPXZvaWQgMCx0aGlzLl9tYW5hZ2Vycyl0aGlzLl9tYW5hZ2Vyc1tlXS5yZXNldCgpO3RoaXMuX2lzUmFkaWFucz0hMSx0aGlzLl9mdWxsQ2lyY2xlPTM2MCx0aGlzLl9idWZmZXJTaXplPVxcXCJudW1iZXJcXFwiPT10eXBlb2YgZy5idWZmZXJTaXplP2cuYnVmZmVyU2l6ZTowLHJlbW92ZUxheWVyKHRoaXMuX3BhcGVyKSx0aGlzLl9wYXBlcj12b2lkIDB9LGUuJGRlZ3JlZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBlP3MoZSk6MzYwLHRoaXMuX2lzUmFkaWFucz0hMSx0aGlzLl9hbmdsZT1lJiZ0aGlzLl9mdWxsQ2lyY2xlP3RoaXMuX2FuZ2xlL3RoaXMuX2Z1bGxDaXJjbGUqZTp0aGlzLl9yYWRpYW5zPTAsdGhpcy5fZnVsbENpcmNsZT1lLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7YW5nbGU6dGhpcy5fYW5nbGUscmFkaWFuczp0aGlzLl9yYWRpYW5zfSl9LGUuJGRlZ3JlZXMubWluQXJncz0wLGUuJGRlZ3JlZXMuY29fdmFybmFtZXM9W1xcXCJmdWxsY2lyY2xlXFxcIl0sZS4kZGVncmVlcy5yZXR1cm5UeXBlPXguRkxPQVQsZS4kcmFkaWFucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1JhZGlhbnN8fCh0aGlzLl9pc1JhZGlhbnM9ITAsdGhpcy5fYW5nbGU9dGhpcy5fcmFkaWFucyx0aGlzLl9mdWxsQ2lyY2xlPVR1cnRsZS5SQURJQU5TKSx0aGlzLl9hbmdsZX0sZS4kcmFkaWFucy5yZXR1cm5UeXBlPXguRkxPQVQsZS4kcG9zaXRpb249ZS4kcG9zPWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuJHhjb3IoKSx0aGlzLiR5Y29yKCldfSxlLiRwb3NpdGlvbi5yZXR1cm5UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGVbMF0pLG5ldyBTay5idWlsdGluLmZsb2F0XyhlWzFdKV0pfSxlLiR0b3dhcmRzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0Q29vcmRpbmF0ZXMoZSx0KSxuPW8rZCh0aGlzLl95LXIueSx0aGlzLl94LXIueCksYT1uKih0aGlzLl9mdWxsQ2lyY2xlL1R1cnRsZS5SQURJQU5TKTtyZXR1cm4gYX0sZS4kdG93YXJkcy5jb192YXJuYW1lcz1bXFxcInhcXFwiLFxcXCJ5XFxcIl0sZS4kdG93YXJkcy5taW5BcmdzPTEsZS4kdG93YXJkcy5yZXR1cm5UeXBlPXguRkxPQVQsZS4kZGlzdGFuY2U9ZnVuY3Rpb24oZSx0KXt2YXIgcj1nZXRDb29yZGluYXRlcyhlLHQpLGE9ci54LXRoaXMuX3gscz1yLnktdGhpcy5feTtyZXR1cm4gbihhKmErcypzKX0sZS4kZGlzdGFuY2UuY29fdmFybmFtZXM9W1xcXCJ4XFxcIixcXFwieVxcXCJdLGUuJGRpc3RhbmNlLm1pbkFyZ3M9MSxlLiRkaXN0YW5jZS5yZXR1cm5UeXBlPXguRkxPQVQsZS4kaGVhZGluZz1mdW5jdGlvbigpe3JldHVybiAxZS0xMz5zKHRoaXMuX2FuZ2xlKT8wOnRoaXMuX2FuZ2xlfSxlLiRoZWFkaW5nLnJldHVyblR5cGU9eC5GTE9BVCxlLiR4Y29yPWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTEzPnModGhpcy5feCk/MDp0aGlzLl94fSxlLiR4Y29yLnJldHVyblR5cGU9eC5GTE9BVCxlLiR5Y29yPWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTEzPnModGhpcy5feSk/MDp0aGlzLl95fSxlLiR5Y29yLnJldHVyblR5cGU9eC5GTE9BVCxlLiRmb3J3YXJkPWUuJGZkPWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnF1ZXVlTW92ZUJ5KHRoaXMuX3gsdGhpcy5feSx0aGlzLl9yYWRpYW5zLGUpfSxlLiRmb3J3YXJkLmNvX3Zhcm5hbWVzPWUuJGZkLmNvX3Zhcm5hbWVzPVtcXFwiZGlzdGFuY2VcXFwiXSxlLiR1bmRvPWZ1bmN0aW9uKCl7cG9wVW5kbyh0aGlzKX0sZS4kdW5kb2J1ZmZlcmVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW5kb0J1ZmZlci5sZW5ndGh9LGUuJHNldHVuZG9idWZmZXI9ZnVuY3Rpb24oZSl7dGhpcy5fYnVmZmVyU2l6ZT1cXFwibnVtYmVyXFxcIj09dHlwZW9mIGU/YShzKGUpLDFlMyk6MH0sZS4kc2V0dW5kb2J1ZmZlci5jb192YXJuYW1lcz1bXFxcInNpemVcXFwiXSxlLiRiYWNrd2FyZD1lLiRiYWNrPWUuJGJrPWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnF1ZXVlTW92ZUJ5KHRoaXMuX3gsdGhpcy5feSx0aGlzLl9yYWRpYW5zLC1lKX0sZS4kYmFja3dhcmQuY29fdmFybmFtZXM9ZS4kYmFjay5jb192YXJuYW1lcz1lLiRiay5jb192YXJuYW1lcz1bXFxcImRpc3RhbmNlXFxcIl0sZS4kZ290b18kcnckPWUuJHNldHBvcz1lLiRzZXRwb3NpdGlvbj1mdW5jdGlvbihlLHQpe3ZhciByPWdldENvb3JkaW5hdGVzKGUsdCk7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLHRoaXMudHJhbnNsYXRlKHRoaXMuX3gsdGhpcy5feSxyLngtdGhpcy5feCxyLnktdGhpcy5feSwhMCl9LGUuJGdvdG9fJHJ3JC5jb192YXJuYW1lcz1lLiRzZXRwb3MuY29fdmFybmFtZXM9ZS4kc2V0cG9zaXRpb24uY29fdmFybmFtZXM9W1xcXCJ4XFxcIixcXFwieVxcXCJdLGUuJGdvdG9fJHJ3JC5taW5BcmdzPWUuJHNldHBvcy5taW5BcmdzPWUuJHNldHBvc2l0aW9uLm1pbkFyZ3M9MSxlLiRzZXR4PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksZS10aGlzLl94LDAsITApfSxlLiRzZXR4LmNvX3Zhcm5hbWVzPVtcXFwieFxcXCJdLGUuJHNldHk9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlKHRoaXMuX3gsdGhpcy5feSwwLGUtdGhpcy5feSwhMCl9LGUuJHNldHkuY29fdmFybmFtZXM9W1xcXCJ5XFxcIl0sZS4kaG9tZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLl9hbmdsZTtyZXR1cm4gcHVzaFVuZG8odGhpcyksZS50cmFuc2xhdGUodGhpcy5feCx0aGlzLl95LC10aGlzLl94LC10aGlzLl95LCEwKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGUucXVldWVUdXJuVG8odCwwKX0pLnRoZW4oZnVuY3Rpb24oKXt9KX0sZS4kcmlnaHQ9ZS4kcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLHRoaXMucm90YXRlKHRoaXMuX2FuZ2xlLC1lKX0sZS4kcmlnaHQuY29fdmFybmFtZXM9ZS4kcnQuY29fdmFybmFtZXM9W1xcXCJhbmdsZVxcXCJdLGUuJGxlZnQ9ZS4kbHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLHRoaXMucm90YXRlKHRoaXMuX2FuZ2xlLGUpfSxlLiRsZWZ0LmNvX3Zhcm5hbWVzPWUuJGx0LmNvX3Zhcm5hbWVzPVtcXFwiYW5nbGVcXFwiXSxlLiRzZXRoZWFkaW5nPWUuJHNldGg9ZnVuY3Rpb24oZSl7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLHRoaXMucXVldWVUdXJuVG8odGhpcy5fYW5nbGUsZSl9LGUuJHNldGhlYWRpbmcuY29fdmFybmFtZXM9ZS4kc2V0aC5jb192YXJuYW1lcz1bXFxcImFuZ2xlXFxcIl0sZS4kY2lyY2xlPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbixkLHUsbSxwLGcsZixoLCQsYj10aGlzLHY9dGhpcy5feCxrPXRoaXMuX3ksVD10aGlzLl9hbmdsZSxBPXt9LEw9MS9nZXRTY3JlZW4oKS5saW5lU2NhbGUsUz0hMDtmb3IocHVzaFVuZG8odGhpcyksdm9pZCAwPT09dCYmKHQ9Yi5fZnVsbENpcmNsZSksdm9pZCAwPT09ciYmKGQ9cyh0KS9iLl9mdWxsQ2lyY2xlLHI9MSsoMHxhKDExK3MoZSpMKS82LDU5KSpkKSksdT10L3IsbT0uNSp1LHA9MiplKl8odSpvL2IuX2Z1bGxDaXJjbGUpLDA+ZT8ocD0tcCx1PS11LG09LW0sbj1ULXQpOm49VCt0LCQ9Z2V0RnJhbWVNYW5hZ2VyKCkud2lsbFJlbmRlck5leHQoKT9Qcm9taXNlLnJlc29sdmUoKTpuZXcgSW5zdGFudFByb21pc2UsVCs9bSxnPTA7ZzxyO2crKyljYWxjdWxhdGVIZWFkaW5nKGIsVCt1KmcsQSksZj1jKEEucmFkaWFucykqcCxoPV8oQS5yYWRpYW5zKSpwLCQ9JC50aGVuKGNpcmNsZVJvdGF0ZShiLEEuYW5nbGUsQS5yYWRpYW5zKSkudGhlbihjaXJjbGVTZWdtZW50KGIsdixrLGYsaCxTKSksdis9ZixrKz1oLFM9ITE7cmV0dXJuICQ9JC50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGNhbGN1bGF0ZUhlYWRpbmcoYixuLEEpLGIuX2FuZ2xlPUEuYW5nbGUsYi5fcmFkaWFucz1BLnJhZGlhbnMsYi5hZGRVcGRhdGUodm9pZCAwLCEwLEEpfSksJH0sZS4kY2lyY2xlLmNvX3Zhcm5hbWVzPVtcXFwicmFkaXVzXFxcIixcXFwiZXh0ZW50XFxcIixcXFwic3RlcHNcXFwiXSxlLiRjaXJjbGUubWluQXJncz0xLGUuJHBlbnVwPWUuJHVwPWUuJHB1PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd249ITEsdGhpcy5hZGRVcGRhdGUodm9pZCAwLCExLHtkb3duOiExfSl9LGUuJHBlbmRvd249ZS4kZG93bj1lLiRwZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3duPSEwLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7ZG93bjohMH0pfSxlLiRpc2Rvd249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG93bn0sZS4kc3BlZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5fc3BlZWQ6KHRoaXMuX3NwZWVkPXIoMCxhKDFlMyxlKSksdGhpcy5fY29tcHV0ZWRfc3BlZWQ9cigwLDIqZS0xKSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse3NwZWVkOnRoaXMuX2NvbXB1dGVkX3NwZWVkfSkpfSxlLiRzcGVlZC5taW5BcmdzPTAsZS4kc3BlZWQuY29fdmFybmFtZXM9W1xcXCJzcGVlZFxcXCJdLGUuJHBlbmNvbG9yPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB2b2lkIDA9PT1lP2hleFRvUkdCKHRoaXMuX2NvbG9yKToodGhpcy5fY29sb3I9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLGUsdCxyLG4pLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7Y29sb3I6dGhpcy5fY29sb3J9KSl9LGUuJHBlbmNvbG9yLmNvX3Zhcm5hbWVzPVtcXFwiclxcXCIsXFxcImdcXFwiLFxcXCJiXFxcIixcXFwiYVxcXCJdLGUuJHBlbmNvbG9yLm1pbkFyZ3M9MCxlLiRwZW5jb2xvci5yZXR1cm5UeXBlPXguQ09MT1IsZS4kZmlsbGNvbG9yPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB2b2lkIDA9PT1lP2hleFRvUkdCKHRoaXMuX2ZpbGwpOih0aGlzLl9maWxsPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlLHQscixuKSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se2ZpbGw6dGhpcy5fZmlsbH0pKX0sZS4kZmlsbGNvbG9yLmNvX3Zhcm5hbWVzPVtcXFwiclxcXCIsXFxcImdcXFwiLFxcXCJiXFxcIixcXFwiYVxcXCJdLGUuJGZpbGxjb2xvci5taW5BcmdzPTAsZS4kZmlsbGNvbG9yLnJldHVyblR5cGU9eC5DT0xPUixlLiRjb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9bdGhpcy4kcGVuY29sb3IoKSx0aGlzLiRmaWxsY29sb3IoKV06KHZvaWQgMD09PXR8fHZvaWQgMCE9PXI/KHRoaXMuX2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlLHQscixuKSx0aGlzLl9maWxsPXRoaXMuX2NvbG9yKToodGhpcy5fY29sb3I9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLGUpLHRoaXMuX2ZpbGw9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLHQpKSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se2NvbG9yOnRoaXMuX2NvbG9yLGZpbGw6dGhpcy5fZmlsbH0pKX0sZS4kY29sb3IubWluQXJncz0wLGUuJGNvbG9yLmNvX3Zhcm5hbWVzPVtcXFwiY29sb3JcXFwiLFxcXCJmaWxsXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRjb2xvci5yZXR1cm5UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbeC5DT0xPUihlWzBdKSx4LkNPTE9SKGVbMV0pXSl9LGUuJGZpbGw9ZnVuY3Rpb24oZSl7dGhpcztyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9maWxsaW5nOihlPSEhZSxlPT09dGhpcy5fZmlsbGluZyk/dm9pZCAwOih0aGlzLl9maWxsaW5nPWUsZT8ocHVzaFVuZG8odGhpcyksdGhpcy5hZGRVcGRhdGUodm9pZCAwLCExLHtmaWxsaW5nOiEwLGZpbGxCdWZmZXI6W3t4OnRoaXMuX3gseTp0aGlzLl95fV19KSk6KHB1c2hVbmRvKHRoaXMpLHRoaXMuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7dGhpcy5maWxsQnVmZmVyLnB1c2godGhpcyksZHJhd0ZpbGwuY2FsbCh0aGlzKX0sITAse2ZpbGxpbmc6ITEsZmlsbEJ1ZmZlcjp2b2lkIDB9KSkpfSxlLiRmaWxsLmNvX3Zhcm5hbWVzPVtcXFwiZmxhZ1xcXCJdLGUuJGZpbGwubWluQXJncz0wLGUuJGJlZ2luX2ZpbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZmlsbCghMCl9LGUuJGVuZF9maWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZpbGwoITEpfSxlLiRzdGFtcD1mdW5jdGlvbigpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLmFkZFVwZGF0ZShmdW5jdGlvbigpe2RyYXdUdXJ0bGUodGhpcyx0aGlzLmNvbnRleHQoKSl9LCEwKX0sZS4kZG90PWZ1bmN0aW9uKGUsdCxuLGwsaSl7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLGU9U2suYnVpbHRpbi5hc251bSQoZSksZT1cXFwibnVtYmVyXFxcIj09dHlwZW9mIGU/cigxLDB8cyhlKSk6cih0aGlzLl9zaXplKzQsMip0aGlzLl9zaXplKSx0PXZvaWQgMD09PXQ/dGhpcy5fY29sb3I6Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLHQsbixsLGkpLHRoaXMuYWRkVXBkYXRlKGRyYXdEb3QsITAsdm9pZCAwLGUsdCl9LGUuJGRvdC5jb192YXJuYW1lcz1bXFxcInNpemVcXFwiLFxcXCJjb2xvclxcXCIsXFxcImdcXFwiLFxcXCJiXFxcIixcXFwiYVxcXCJdLGUuJHdyaXRlPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBhLHMsbCxpLG8sZD10aGlzO3JldHVybiBwdXNoVW5kbyh0aGlzKSxlKz1cXFwiXFxcIixuJiZuLmNvbnN0cnVjdG9yPT09QXJyYXkmJihzPVxcXCJzdHJpbmdcXFwiPT10eXBlb2YgblswXT9uWzBdOlxcXCJBcmlhbFxcXCIsbD0oblsxXXx8XFxcIjEycHRcXFwiKStcXFwiXFxcIixpPVxcXCJzdHJpbmdcXFwiPT10eXBlb2YgblsyXT9uWzJdOlxcXCJub3JtYWxcXFwiLC9eXFxcXGQrJC8udGVzdChsKSYmKGwrPVxcXCJwdFxcXCIpLG49W2ksbCxzXS5qb2luKFxcXCIgXFxcIikpLHJ8fChyPVxcXCJsZWZ0XFxcIiksYT10aGlzLmFkZFVwZGF0ZShkcmF3VGV4dCwhMCx2b2lkIDAsZSxyLG4pLHQmJihcXFwibGVmdFxcXCI9PT1yfHxcXFwiY2VudGVyXFxcIj09PXIpJiYobz1tZWFzdXJlVGV4dChlLG4pLFxcXCJjZW50ZXJcXFwiPT09ciYmKG8vPTIpLGE9YS50aGVuKGZ1bmN0aW9uKCl7dmFyIGU9ZC5nZXRTdGF0ZSgpO3JldHVybiBkLnRyYW5zbGF0ZShlLngsZS55LG8sMCwhMCl9KSksYX0sZS4kd3JpdGUuY29fdmFybmFtZXM9W1xcXCJtZXNzYWdlXFxcIixcXFwibW92ZVxcXCIsXFxcImFsaWduXFxcIixcXFwiZm9udFxcXCJdLGUuJHdyaXRlLm1pbkFyZ3M9MSxlLiRwZW5zaXplPWUuJHdpZHRoPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuX3NpemU6KHRoaXMuX3NpemU9ZSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se3NpemU6ZX0pKX0sZS4kcGVuc2l6ZS5taW5BcmdzPWUuJHdpZHRoLm1pbkFyZ3M9MCxlLiRwZW5zaXplLmNvX3Zhcm5hbWVzPWUuJHdpZHRoLmNvX3Zhcm5hbWVzPVtcXFwid2lkdGhcXFwiXSxlLiRzaG93dHVydGxlPWUuJHN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nob3duPSEwLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMCx7c2hvd246ITB9KX0sZS4kaGlkZXR1cnRsZT1lLiRodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93bj0hMSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITAse3Nob3duOiExfSl9LGUuJGlzdmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93bn0sZS4kc2hhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJnZbZV0/KHRoaXMuX3NoYXBlPWUsdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtzaGFwZTplfSkpOnRoaXMuX3NoYXBlfSxlLiRzaGFwZS5taW5BcmdzPTAsZS4kc2hhcGUuY29fdmFybmFtZXM9W1xcXCJuYW1lXFxcIl0sZS4kY29sb3Jtb2RlPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuX2NvbG9yTW9kZToodGhpcy5fY29sb3JNb2RlPTI1NT09PWU/MjU1OjEsdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtjb2xvck1vZGU6dGhpcy5fY29sb3JNb2RlfSkpfSxlLiRjb2xvcm1vZGUubWluQXJncz0wLGUuJGNvbG9ybW9kZS5jb192YXJuYW1lcz1bXFxcImNtb2RlXFxcIl0sZS4kY29sb3Jtb2RlLnJldHVyblR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIDI1NT09PWU/bmV3IFNrLmJ1aWx0aW4uaW50XygyNTUpOm5ldyBTay5idWlsdGluLmZsb2F0XygxKX0sZS4kd2luZG93X3dpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kd2luZG93X3dpZHRoKCl9LGUuJHdpbmRvd19oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR3aW5kb3dfaGVpZ2h0KCl9LGUuJHRyYWNlcj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9zY3JlZW4uJHRyYWNlcihlLHQpfSxlLiR0cmFjZXIubWluQXJncz0wLGUuJHRyYWNlci5jb192YXJuYW1lcz1bXFxcIm5cXFwiLFxcXCJkZWxheVxcXCJdLGUuJHVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JlZW4uJHVwZGF0ZSgpfSxlLiRkZWxheT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiRkZWxheShlKX0sZS4kZGVsYXkubWluQXJncz0wLGUuJGRlbGF5LmNvX3Zhcm5hbWVzPVtcXFwiZGVsYXlcXFwiXSxlLiRyZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlc2V0KCksdGhpcy4kY2xlYXIoKX0sZS4kbWFpbmxvb3A9ZS4kZG9uZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JlZW4uJG1haW5sb29wKCl9LGUuJGNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7Y2xlYXJMYXllcih0aGlzLmNvbnRleHQoKSl9LCEwKX0sZS4kZG90Lm1pbkFyZ3M9MCxlLiRvbmNsaWNrPWZ1bmN0aW9uKGUsdCxyKXt0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25jbGljay5taW5BcmdzPTEsZS4kb25jbGljay5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJG9ucmVsZWFzZT1mdW5jdGlvbihlLHQscil7dGhpcy5nZXRNYW5hZ2VyKFxcXCJtb3VzZXVwXFxcIikuYWRkSGFuZGxlcihlLHIpfSxlLiRvbnJlbGVhc2UubWluQXJncz0xLGUuJG9ucmVsZWFzZS5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJG9uZHJhZz1mdW5jdGlvbihlLHQscil7dGhpcy5nZXRNYW5hZ2VyKFxcXCJtb3VzZW1vdmVcXFwiKS5hZGRIYW5kbGVyKGUscil9LGUuJG9uZHJhZy5taW5BcmdzPTEsZS4kb25kcmFnLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiYnRuXFxcIixcXFwiYWRkXFxcIl0sZS4kZ2V0c2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh5LlNjcmVlbil9LGUuJGdldHNjcmVlbi5pc1NrPSEwLGUuJGNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KHkuVHVydGxlKTtyZXR1cm4gZS5pbnN0YW5jZS5feD10aGlzLl94LGUuaW5zdGFuY2UuX3k9dGhpcy5feSxlLmluc3RhbmNlLl9hbmdsZT10aGlzLl9hbmdsZSxlLmluc3RhbmNlLl9yYWRpYW5zPXRoaXMuX3JhZGlhbnMsZS5pbnN0YW5jZS5fc2hhcGU9dGhpcy5fc2hhcGUsZS5pbnN0YW5jZS5fY29sb3I9dGhpcy5fY29sb3IsZS5pbnN0YW5jZS5fZmlsbD10aGlzLl9maWxsLGUuaW5zdGFuY2UuX2ZpbGxpbmc9dGhpcy5fZmlsbGluZyxlLmluc3RhbmNlLl9zaXplPXRoaXMuX3NpemUsZS5pbnN0YW5jZS5fY29tcHV0ZWRfc3BlZWQ9dGhpcy5fY29tcHV0ZWRfc3BlZWQsZS5pbnN0YW5jZS5fZG93bj10aGlzLl9kb3duLGUuaW5zdGFuY2UuX3Nob3duPXRoaXMuX3Nob3duLGUuaW5zdGFuY2UuX2NvbG9yTW9kZT10aGlzLl9jb2xvck1vZGUsZS5pbnN0YW5jZS5faXNSYWRpYW5zPXRoaXMuX2lzUmFkaWFucyxlLmluc3RhbmNlLl9mdWxsQ2lyY2xlPXRoaXMuX2Z1bGxDaXJjbGUsZS5pbnN0YW5jZS5fYnVmZmVyU2l6ZT10aGlzLl9idWZmZXJTaXplLGUuaW5zdGFuY2UuX3VuZG9CdWZmZXI9dGhpcy5fdW5kb0J1ZmZlcixlLl9jbG9uZWRGcm9tPXRoaXMsZX0sZS4kY2xvbmUucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gZX0sZS4kZ2V0dHVydGxlPWUuJGdldHBlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNrSW5zdGFuY2V9LGUuJGdldHR1cnRsZS5pc1NrPSEwfShUdXJ0bGUucHJvdG90eXBlKSxmdW5jdGlvbihlKXtlLnNwcml0ZUxheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZXN8fCh0aGlzLl9zcHJpdGVzPWNyZWF0ZUxheWVyKDMpKX0sZS5iZ0xheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tncm91bmR8fCh0aGlzLl9iYWNrZ3JvdW5kPWNyZWF0ZUxheWVyKDEpKX0sZS5oaXRUZXN0TGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGl0VGVzdHx8KHRoaXMuX2hpdFRlc3Q9Y3JlYXRlTGF5ZXIoMCwhMCkpfSxlLmdldE1hbmFnZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX21hbmFnZXJzW2VdfHwodGhpcy5fbWFuYWdlcnNbZV09bmV3IEV2ZW50TWFuYWdlcihlLHRoaXMpKSx0aGlzLl9tYW5hZ2Vyc1tlXX0sZS5yZXNldD1mdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLl9rZXlMaXN0ZW5lcnM9dm9pZCAwLHRoaXMuX2tleUxvZ2dlcil3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9rZXlMb2dnZXJbZV0pLHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fa2V5TG9nZ2VyW2VdKSxkZWxldGUgdGhpcy5fa2V5TG9nZ2VyW2VdO2ZvcihlIGluIHRoaXMuX2tleURvd25MaXN0ZW5lciYmKGdldFRhcmdldCgpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXFxcImtleWRvd25cXFwiLHRoaXMuX2tleURvd25MaXN0ZW5lciksdGhpcy5fa2V5RG93bkxpc3RlbmVyPXZvaWQgMCksdGhpcy5fa2V5VXBMaXN0ZW5lciYmKGdldFRhcmdldCgpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXFxcImtleXVwXFxcIix0aGlzLl9rZXlVcExpc3RlbmVyKSx0aGlzLl9rZXlVcExpc3RlbmVyPXZvaWQgMCksdGhpcy5fdGltZXImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj12b2lkIDApLHRoaXMuX21hbmFnZXJzKXRoaXMuX21hbmFnZXJzW2VdLnJlc2V0KCk7dGhpcy5fbW9kZT1cXFwic3RhbmRhcmRcXFwiLHJlbW92ZUxheWVyKHRoaXMuX3Nwcml0ZXMpLHRoaXMuX3Nwcml0ZXM9dm9pZCAwLHJlbW92ZUxheWVyKHRoaXMuX2JhY2tncm91bmQpLHRoaXMuX2JhY2tncm91bmQ9dm9pZCAwfSxlLnNldFVwV29ybGQ9ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGw9dGhpcztsLmxseD1lLGwubGx5PXQsbC51cng9cixsLnVyeT1uLGwueFNjYWxlPShyLWUpL2dldFdpZHRoKCksbC55U2NhbGU9LTEqKG4tdCkvZ2V0SGVpZ2h0KCksbC5saW5lU2NhbGU9YShzKGwueFNjYWxlKSxzKGwueVNjYWxlKSl9LGUuJHNldHVwPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiBpc05hTihwYXJzZUZsb2F0KGUpKSYmKGU9Z2V0V2lkdGgoKSksaXNOYU4ocGFyc2VGbG9hdCh0KSkmJih0PWdldEhlaWdodCgpKSwxPj1lJiYoZT1nZXRXaWR0aCgpKmUpLDE+PXQmJih0PWdldEhlaWdodCgpKnQpLHRoaXMuX3dpZHRoPWUsdGhpcy5faGVpZ2h0PXQsdGhpcy5feE9mZnNldD12b2lkIDA9PT1yfHxpc05hTihwYXJzZUludChyKSk/MDpwYXJzZUludChyKSx0aGlzLl95T2Zmc2V0PXZvaWQgMD09PW58fGlzTmFOKHBhcnNlSW50KG4pKT8wOnBhcnNlSW50KG4pLFxcXCJ3b3JsZFxcXCI9PT10aGlzLl9tb2RlP3RoaXMuX3NldHdvcmxkY29vcmRpbmF0ZXModGhpcy5sbHgsdGhpcy5sbHksdGhpcy51cngsdGhpcy51cnkpOnRoaXMuX3NldHdvcmxkY29vcmRpbmF0ZXMoLWUvMiwtdC8yLGUvMix0LzIpfSxlLiRzZXR1cC5taW5BcmdzPTAsZS4kc2V0dXAuY29fdmFybmFtZXM9W1xcXCJ3aWR0aFxcXCIsXFxcImhlaWdodFxcXCIsXFxcInN0YXJ0eFxcXCIsXFxcInN0YXJ0eVxcXCJdLGUuJHJlZ2lzdGVyX3NoYXBlPWUuJGFkZHNoYXBlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dm9pZCh2W2VdPXQpOmdldEFzc2V0KGUpLnRoZW4oZnVuY3Rpb24odCl7dltlXT10fSl9LGUuJHJlZ2lzdGVyX3NoYXBlLm1pbkFyZ3M9MSxlLiRnZXRzaGFwZXM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModil9LGUuJHRyYWNlcj1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDAhPT1lfHx2b2lkIDAhPT10PyhcXFwibnVtYmVyXFxcIj09dHlwZW9mIHQmJih0aGlzLl9kZWxheT10LGdldEZyYW1lTWFuYWdlcigpLnJlZnJlc2hJbnRlcnZhbCh0KSksXFxcIm51bWJlclxcXCI9PXR5cGVvZiBlPyh0aGlzLl9mcmFtZXM9ZSxnZXRGcmFtZU1hbmFnZXIoKS5mcmFtZUJ1ZmZlcihlKSk6dm9pZCAwKTp0aGlzLl9mcmFtZXN9LGUuJHRyYWNlci5jb192YXJuYW1lcz1bXFxcImZyYW1lc1xcXCIsXFxcImRlbGF5XFxcIl0sZS4kdHJhY2VyLm1pbkFyZ3M9MCxlLiRkZWxheT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT92b2lkIDA9PT10aGlzLl9kZWxheT9iOnRoaXMuX2RlbGF5OnRoaXMuJHRyYWNlcih2b2lkIDAsZSl9LGUuJGRlbGF5LmNvX3Zhcm5hbWVzPVtcXFwiZGVsYXlcXFwiXSxlLl9zZXR3b3JsZGNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBhPXRoaXMscz1nZXRGcmFtZU1hbmFnZXIoKS50dXJ0bGVzKCk7cmV0dXJuIHRoaXMuc2V0VXBXb3JsZChlLHQscixuKSx0aGlzLl9zcHJpdGVzJiZhcHBseVdvcmxkKHRoaXMsdGhpcy5fc3ByaXRlcyksdGhpcy5fYmFja2dyb3VuZCYmYXBwbHlXb3JsZCh0aGlzLHRoaXMuX2JhY2tncm91bmQpLHRoaXMuJGNsZWFyKCl9LGUuJHNldHdvcmxkY29vcmRpbmF0ZXM9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHRoaXMuX21vZGU9XFxcIndvcmxkXFxcIix0aGlzLl9zZXR3b3JsZGNvb3JkaW5hdGVzKGUsdCxyLG4pfSxlLiRzZXR3b3JsZGNvb3JkaW5hdGVzLmNvX3Zhcm5hbWVzPVtcXFwibGx4XFxcIixcXFwibGx5XFxcIixcXFwidXJ4XFxcIixcXFwidXJ5XFxcIl0sZS5taW5BcmdzPTQsZS4kY2xlYXI9ZS4kY2xlYXJzY3JlZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXNldCgpLHRoaXMuJHJlc2V0KCl9LGUuJHVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiBnZXRGcmFtZU1hbmFnZXIoKS51cGRhdGUoKX0sZS4kcmVzZXQ9ZS4kcmVzZXRzY3JlZW49ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9Z2V0RnJhbWVNYW5hZ2VyKCkudHVydGxlcygpO3JldHVybiBnZXRGcmFtZU1hbmFnZXIoKS5hZGRGcmFtZShmdW5jdGlvbigpe2FwcGx5V29ybGQoZSxlLl9zcHJpdGVzKSxhcHBseVdvcmxkKGUsZS5fYmFja2dyb3VuZCk7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspdFtyXS5yZXNldCgpLGFwcGx5V29ybGQoZSx0W3JdLl9wYXBlcil9LCEwKX0sZS4kd2luZG93X3dpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIGdldFdpZHRoKCl9LGUuJHdpbmRvd19oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0SGVpZ2h0KCl9LGUuJGRlbGF5Lm1pbkFyZ3M9MCxlLiR0dXJ0bGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGdldEZyYW1lTWFuYWdlcigpLnR1cnRsZXMoKX0sZS4kdHVydGxlcy5yZXR1cm5UeXBlPXguVFVSVExFX0xJU1QsZS4kYmdwaWM9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGU/KHQ9dGhpcyxnZXRBc3NldChlKS50aGVuKGZ1bmN0aW9uKGUpe2NsZWFyTGF5ZXIodC5iZ0xheWVyKCksdm9pZCAwLGUpfSkpOnRoaXMuX2JncGljfSxlLiRiZ3BpYy5taW5BcmdzPTAsZS4kYmdwaWMuY29fdmFybmFtZXM9W1xcXCJuYW1lXFxcIl0sZS4kYmdjb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9oZXhUb1JHQih0aGlzLl9iZ2NvbG9yKToodGhpcy5fYmdjb2xvcj1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdm9pZCBjbGVhckxheWVyKHRoaXMuYmdMYXllcigpLHRoaXMuX2JnY29sb3IpKX0sZS4kYmdjb2xvci5taW5BcmdzPTAsZS4kYmdjb2xvci5jb192YXJuYW1lcz1bXFxcImNvbG9yXFxcIixcXFwiZ1xcXCIsXFxcImJcXFwiLFxcXCJhXFxcIl0sZS4kYmdjb2xvci5yZXR1cm5UeXBlPXguQ09MT1IsZS4kbWFpbmxvb3A9ZS4kZG9uZT1mdW5jdGlvbigpe30sZS4kYnllPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLlR1cnRsZUdyYXBoaWNzLnJlc2V0KCl9LGUuJGV4aXRvbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V4aXRPbkNsaWNrPSEwLHRoaXMuZ2V0TWFuYWdlcihcXFwibW91c2Vkb3duXFxcIikuYWRkSGFuZGxlcihmdW5jdGlvbigpe3Jlc2V0VHVydGxlKCl9LCExKX0sZS4kb25jbGljaz1mdW5jdGlvbihlLHQscil7dGhpcy5fZXhpdE9uQ2xpY2t8fHRoaXMuZ2V0TWFuYWdlcihcXFwibW91c2Vkb3duXFxcIikuYWRkSGFuZGxlcihlLHIpfSxlLiRvbmNsaWNrLm1pbkFyZ3M9MSxlLiRvbmNsaWNrLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiYnRuXFxcIixcXFwiYWRkXFxcIl07dmFyIHQ9ezg6L15iYWNrKHNwYWNlKT8kL2ksOTovXnRhYiQvaSwxMzovXihlbnRlcnxyZXR1cm4pJC9pLDE2Oi9ec2hpZnQkL2ksMTc6L14oY3RybHxjb250cm9sKSQvaSwxODovXmFsdCQvaSwyNzovXmVzYyhhcGUpPyQvaSwzMjovXnNwYWNlJC9pLDMzOi9ecGFnZVtcXFxcc1xcXFwtXT91cCQvaSwzNDovXnBhZ2VbXFxcXHNcXFxcLV0/ZG93biQvaSwzNTovXmVuZCQvaSwzNjovXmhvbWUkL2ksMzc6L15sZWZ0KFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDM4Oi9edXAoW1xcXFxzXFxcXC1dP2Fycm93KT8kL2ksMzk6L15yaWdodChbXFxcXHNcXFxcLV0/YXJyb3cpPyQvaSw0MDovXmRvd24oW1xcXFxzXFxcXC1dP2Fycm93KT8kL2ksNDU6L15pbnNlcnQkL2ksNDY6L15kZWwoZXRlKT8kL2l9O2UuX2NyZWF0ZUtleVJlcGVhdGVyPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztyLl9rZXlMb2dnZXJbdF09d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLl9rZXlMaXN0ZW5lcnNbZV0oKSxyLl9rZXlMb2dnZXJbdF09d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7ci5fa2V5TGlzdGVuZXJzW2VdKCl9LDUwKX0sMzMzKX0sZS5fY3JlYXRlS2V5RG93bkxpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0aGlzLl9rZXlEb3duTGlzdGVuZXJ8fCh0aGlzLl9rZXlEb3duTGlzdGVuZXI9ZnVuY3Rpb24obil7dmFyIGU9U3RyaW5nLmZyb21DaGFyQ29kZTtpZihmb2N1c1R1cnRsZSgpKXt2YXIgYSxzLGw9bi5jaGFyQ29kZXx8bi5rZXlDb2RlLGk9ZShsKS50b0xvd2VyQ2FzZSgpO2lmKCFyLl9rZXlMb2dnZXJbbF0pZm9yKGEgaW4gci5fa2V5TGlzdGVuZXJzKWlmKHM9MTxhLmxlbmd0aCYmdFtsXSYmdFtsXS50ZXN0KGEpLGE9PT1pfHxzKXtyLl9rZXlMaXN0ZW5lcnNbYV0oKSxyLl9jcmVhdGVLZXlSZXBlYXRlcihhLGwpLG4ucHJldmVudERlZmF1bHQoKTticmVha319fSxnZXRUYXJnZXQoKS5hZGRFdmVudExpc3RlbmVyKFxcXCJrZXlkb3duXFxcIix0aGlzLl9rZXlEb3duTGlzdGVuZXIpKX0sZS5fY3JlYXRlS2V5VXBMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fa2V5VXBMaXN0ZW5lcnx8KHRoaXMuX2tleVVwTGlzdGVuZXI9ZnVuY3Rpb24ocil7dmFyIGU9dC5fa2V5TG9nZ2VyW3IuY2hhckNvZGV8fHIua2V5Q29kZV07dm9pZCAwIT09ZSYmKHIucHJldmVudERlZmF1bHQoKSx3aW5kb3cuY2xlYXJJbnRlcnZhbChlKSx3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLGRlbGV0ZSB0Ll9rZXlMb2dnZXJbci5jaGFyQ29kZXx8ci5rZXlDb2RlXSl9LGdldFRhcmdldCgpLmFkZEV2ZW50TGlzdGVuZXIoXFxcImtleXVwXFxcIix0aGlzLl9rZXlVcExpc3RlbmVyKSl9LGUuJGxpc3Rlbj1mdW5jdGlvbigpe3RoaXMuX2NyZWF0ZUtleVVwTGlzdGVuZXIoKSx0aGlzLl9jcmVhdGVLZXlEb3duTGlzdGVuZXIoKX0sZS4kb25rZXk9ZnVuY3Rpb24oZSx0KXtpZihcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgdCl7dmFyIHI9ZTtlPXQsdD1yfXQ9KHQrXFxcIlxcXCIpLnRvTG93ZXJDYXNlKCksZSYmXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGU/KCF0aGlzLl9rZXlMaXN0ZW5lcnMmJih0aGlzLl9rZXlMaXN0ZW5lcnM9e30pLHRoaXMuX2tleUxpc3RlbmVyc1t0XT1lKTpkZWxldGUgdGhpcy5fa2V5TGlzdGVuZXJzW3RdfSxlLiRvbmtleS5taW5BcmdzPTIsZS4kb25rZXkuY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJrZXlWYWx1ZVxcXCJdLGUuJG9uc2NyZWVuY2xpY2s9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2Vkb3duXFxcIikuYWRkSGFuZGxlcihlLHIpfSxlLiRvbnNjcmVlbmNsaWNrLm1pbkFyZ3M9MSxlLiRvbnNjcmVlbmNsaWNrLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiYnRuXFxcIixcXFwiYWRkXFxcIl0sZS4kb250aW1lcj1mdW5jdGlvbihlLHQpe3RoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9dm9pZCAwKSxlJiZcXFwibnVtYmVyXFxcIj09dHlwZW9mIHQmJih0aGlzLl90aW1lcj13aW5kb3cuc2V0VGltZW91dChlLHIoMCwwfHQpKSl9LGUuJG9udGltZXIubWluQXJncz0wLGUuJG9udGltZXIuY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJpbnRlcnZhbFxcXCJdfShTY3JlZW4ucHJvdG90eXBlKTt2YXIgTD1uZXcgSW1hZ2UsUz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJjYW52YXNcXFwiKS5nZXRDb250ZXh0KFxcXCIyZFxcXCIpO2Zvcih2YXIgQyBpbiBpbml0VHVydGxlLmNvX3Zhcm5hbWVzPVtcXFwic2VsZlxcXCIsXFxcInNoYXBlXFxcIl0saW5pdFR1cnRsZS5jb19uYW1lPW5ldyBTay5idWlsdGluLnN0cihcXFwiVHVydGxlXFxcIiksaW5pdFR1cnRsZS5jb19hcmdjb3VudD0yLGluaXRUdXJ0bGUuJGRlZmF1bHRzPVtTay5idWlsdGluLm5vbmUubm9uZSQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJjbGFzc2ljXFxcIildLFR1cnRsZS5wcm90b3R5cGUpL15cXFxcJFthLXpfXSsvLnRlc3QoQykmJmFkZE1vZHVsZU1ldGhvZChUdXJ0bGUseSxDLGVuc3VyZUFub255bW91cyk7cmV0dXJuIGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJG1haW5sb29wXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJGRvbmVcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkYnllXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJHRyYWNlclxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR1cGRhdGVcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkZGVsYXlcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkd2luZG93X3dpZHRoXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJHdpbmRvd19oZWlnaHRcXFwiLGdldFNjcmVlbikseS5UdXJ0bGU9U2subWlzY2V2YWwuYnVpbGRDbGFzcyh5LGZ1bmN0aW9uIFR1cnRsZVdyYXBwZXIoZSx0KXtmb3IodmFyIHIgaW4gdC5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGluaXRUdXJ0bGUpLFR1cnRsZS5wcm90b3R5cGUpL15cXFxcJFthLXpfXSsvLnRlc3QocikmJmFkZE1vZHVsZU1ldGhvZChUdXJ0bGUsdCxyKX0sXFxcIlR1cnRsZVxcXCIsW10pLHkuU2NyZWVuPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoeSxmdW5jdGlvbiBTY3JlZW5XcmFwcGVyKGUsdCl7Zm9yKHZhciByIGluIHQuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihlKXtlLmluc3RhbmNlPWdldFNjcmVlbigpfSksU2NyZWVuLnByb3RvdHlwZSkvXlxcXFwkW2Etel9dKy8udGVzdChyKSYmYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix0LHIpfSxcXFwiU2NyZWVuXFxcIixbXSkse3NrTW9kdWxlOnkscmVzZXQ6cmVzZXRUdXJ0bGUsc3RvcDpzdG9wVHVydGxlLGZvY3VzOmZvY3VzVHVydGxlLFR1cnRsZTpUdXJ0bGUsU2NyZWVuOlNjcmVlbn19KGUpLFNrLlR1cnRsZUdyYXBoaWNzLm1vZHVsZT1lLnR1cnRsZUluc3RhbmNlLnNrTW9kdWxlLFNrLlR1cnRsZUdyYXBoaWNzLnJlc2V0PWUudHVydGxlSW5zdGFuY2UucmVzZXQsU2suVHVydGxlR3JhcGhpY3Muc3RvcD1lLnR1cnRsZUluc3RhbmNlLnN0b3AsU2suVHVydGxlR3JhcGhpY3MuZm9jdXM9ZS50dXJ0bGVJbnN0YW5jZS5mb2N1cyxTay5UdXJ0bGVHcmFwaGljcy5yYXc9e1R1cnRsZTplLnR1cnRsZUluc3RhbmNlLlR1cnRsZSxTY3JlZW46ZS50dXJ0bGVJbnN0YW5jZS5TY3JlZW59LGUudHVydGxlSW5zdGFuY2Uuc2tNb2R1bGV9O1wiLFwic3JjL2xpYi90eXBlcy5weVwiOlwiXFxcIlxcXCJcXFwiXFxuVGhpcyBmaWxlIHdhcyBtb2RpZmllZCBmcm9tIENQeXRob24uXFxuQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLFxcbjIwMTEsIDIwMTIsIDIwMTMsIDIwMTQsIDIwMTUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb247IEFsbCBSaWdodHMgUmVzZXJ2ZWRcXG5cXFwiXFxcIlxcXCJcXG5cXFwiXFxcIlxcXCJEZWZpbmUgbmFtZXMgZm9yIGFsbCB0eXBlIHN5bWJvbHMga25vd24gaW4gdGhlIHN0YW5kYXJkIGludGVycHJldGVyLlxcblR5cGVzIHRoYXQgYXJlIHBhcnQgb2Ygb3B0aW9uYWwgbW9kdWxlcyAoZS5nLiBhcnJheSkgYXJlIG5vdCBsaXN0ZWQuXFxuXFxcIlxcXCJcXFwiXFxuaW1wb3J0IHN5c1xcblxcbiMgSXRlcmF0b3JzIGluIFB5dGhvbiBhcmVuJ3QgYSBtYXR0ZXIgb2YgdHlwZSBidXQgb2YgcHJvdG9jb2wuICBBIGxhcmdlXFxuIyBhbmQgY2hhbmdpbmcgbnVtYmVyIG9mIGJ1aWx0aW4gdHlwZXMgaW1wbGVtZW50ICpzb21lKiBmbGF2b3Igb2ZcXG4jIGl0ZXJhdG9yLiAgRG9uJ3QgY2hlY2sgdGhlIHR5cGUhICBVc2UgaGFzYXR0ciB0byBjaGVjayBmb3IgYm90aFxcbiMgXFxcIl9faXRlcl9fXFxcIiBhbmQgXFxcIm5leHRcXFwiIGF0dHJpYnV0ZXMgaW5zdGVhZC5cXG5NYXBwaW5nUHJveHlUeXBlID0gdHlwZSh0eXBlLl9fZGljdF9fKVxcbldyYXBwZXJEZXNjcmlwdG9yVHlwZSA9IHR5cGUob2JqZWN0Ll9faW5pdF9fKVxcbk1ldGhvZFdyYXBwZXJUeXBlID0gdHlwZShvYmplY3QoKS5fX3N0cl9fKVxcbk1ldGhvZERlc2NyaXB0b3JUeXBlID0gdHlwZShzdHIuam9pbilcXG5DbGFzc01ldGhvZERlc2NyaXB0b3JUeXBlID0gdHlwZShkaWN0Ll9fZGljdF9fWydmcm9ta2V5cyddKVxcblxcbk5vbmVUeXBlID0gdHlwZShOb25lKVxcblR5cGVUeXBlID0gdHlwZVxcbk9iamVjdFR5cGUgPSBvYmplY3RcXG5JbnRUeXBlID0gaW50XFxudHJ5OlxcbiAgICBMb25nVHlwZSA9IGxvbmdcXG5leGNlcHQ6IHBhc3NcXG5GbG9hdFR5cGUgPSBmbG9hdFxcbkJvb2xlYW5UeXBlID0gYm9vbFxcbnRyeTpcXG4gICAgQ29tcGxleFR5cGUgPSBjb21wbGV4XFxuZXhjZXB0IE5hbWVFcnJvcjpcXG4gICAgcGFzc1xcblN0cmluZ1R5cGUgPSBzdHJcXG5cXG4jIFN0cmluZ1R5cGVzIGlzIGFscmVhZHkgb3V0ZGF0ZWQuICBJbnN0ZWFkIG9mIHdyaXRpbmcgXFxcInR5cGUoeCkgaW5cXG4jIHR5cGVzLlN0cmluZ1R5cGVzXFxcIiwgeW91IHNob3VsZCB1c2UgXFxcImlzaW5zdGFuY2UoeCwgYmFzZXN0cmluZylcXFwiLiAgQnV0XFxuIyB3ZSBrZWVwIGFyb3VuZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjIuXFxudHJ5OlxcbiAgICBVbmljb2RlVHlwZSA9IHVuaWNvZGVcXG4gICAgU3RyaW5nVHlwZXMgPSAoU3RyaW5nVHlwZSwgVW5pY29kZVR5cGUpXFxuZXhjZXB0IE5hbWVFcnJvcjpcXG4gICAgU3RyaW5nVHlwZXMgPSAoU3RyaW5nVHlwZSwpXFxuXFxuQnVmZmVyVHlwZSA9IGJ1ZmZlclxcblxcblR1cGxlVHlwZSA9IHR1cGxlXFxuTGlzdFR5cGUgPSBsaXN0XFxuRGljdFR5cGUgPSBEaWN0aW9uYXJ5VHlwZSA9IGRpY3RcXG5cXG5kZWYgX2YoKTogcGFzc1xcbkZ1bmN0aW9uVHlwZSA9IHR5cGUoX2YpXFxuTGFtYmRhVHlwZSA9IHR5cGUobGFtYmRhOiBOb25lKSAgICAgICAgICMgU2FtZSBhcyBGdW5jdGlvblR5cGVcXG4jQ29kZVR5cGUgPSB0eXBlKF9mLmZ1bmNfY29kZSlcXG5cXG5kZWYgX2coKTpcXG4gICAgeWllbGQgMVxcbkdlbmVyYXRvclR5cGUgPSB0eXBlKF9nKCkpXFxuXFxuY2xhc3MgX0M6XFxuICAgIGRlZiBfbShzZWxmKTogcGFzc1xcbkNsYXNzVHlwZSA9IHR5cGUoX0MpXFxuVW5ib3VuZE1ldGhvZFR5cGUgPSB0eXBlKF9DLl9tKSAgICAgICAgICMgU2FtZSBhcyBNZXRob2RUeXBlXFxuX3ggPSBfQygpXFxuSW5zdGFuY2VUeXBlID0gdHlwZShfeClcXG5NZXRob2RUeXBlID0gdHlwZShfeC5fbSlcXG5CdWlsdGluRnVuY3Rpb25UeXBlID0gdHlwZShsZW4pXFxuQnVpbHRpbk1ldGhvZFR5cGUgPSB0eXBlKFtdLmFwcGVuZCkgICAgICMgU2FtZSBhcyBCdWlsdGluRnVuY3Rpb25UeXBlXFxuXFxuTW9kdWxlVHlwZSA9IHR5cGUoc3lzKVxcbkZpbGVUeXBlID0gZmlsZVxcbnRyeTpcXG4gICAgWFJhbmdlVHlwZSA9IHhyYW5nZVxcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIHBhc3NcXG5cXG4jIHRyeTpcXG4jICAgICByYWlzZSBUeXBlRXJyb3JcXG4jIGV4Y2VwdCBUeXBlRXJyb3I6XFxuIyAgICAgdGIgPSBzeXMuZXhjX2luZm8oKVsyXVxcbiMgICAgIFRyYWNlYmFja1R5cGUgPSB0eXBlKHRiKVxcbiMgICAgIEZyYW1lVHlwZSA9IHR5cGUodGIudGJfZnJhbWUpXFxuIyAgICAgZGVsIHRiXFxuXFxuU2xpY2VUeXBlID0gc2xpY2VcXG4jIEVsbGlwc2lzVHlwZSA9IHR5cGUoRWxsaXBzaXMpXFxuXFxuIyBEaWN0UHJveHlUeXBlID0gdHlwZShUeXBlVHlwZS5fX2RpY3RfXylcXG5Ob3RJbXBsZW1lbnRlZFR5cGUgPSB0eXBlKE5vdEltcGxlbWVudGVkKVxcblxcbiMgRm9yIEp5dGhvbiwgdGhlIGZvbGxvd2luZyB0d28gdHlwZXMgYXJlIGlkZW50aWNhbFxcbiMgR2V0U2V0RGVzY3JpcHRvclR5cGUgPSB0eXBlKEZ1bmN0aW9uVHlwZS5mdW5jX2NvZGUpXFxuIyBNZW1iZXJEZXNjcmlwdG9yVHlwZSA9IHR5cGUoRnVuY3Rpb25UeXBlLmZ1bmNfZ2xvYmFscylcXG5cXG5kZWwgc3lzLCBfZiwgX2csIF9DLCBfeCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm90IGZvciBleHBvcnRcXG5fX2FsbF9fID0gbGlzdChuIGZvciBuIGluIGdsb2JhbHMoKSBpZiBuWzoxXSAhPSAnXycpXFxuXCIsXCJzcmMvbGliL3VuaXR0ZXN0L19faW5pdF9fLnB5XCI6XCJfX2F1dGhvcl9fID0gJ2JtaWxsZXInXFxuJycnXFxuVGhpcyBpcyB0aGUgc3RhcnQgb2Ygc29tZXRoaW5nIHRoYXQgYmVoYXZlcyBsaWtlXFxudGhlIHVuaXR0ZXN0IG1vZHVsZSBmcm9tIGNweXRob24uXFxuXFxuJycnXFxuaW1wb3J0IHJlXFxuXFxuY2xhc3MgX0Fzc2VydFJhaXNlc0NvbnRleHQob2JqZWN0KTpcXG4gICAgXFxcIlxcXCJcXFwiQSBjb250ZXh0IG1hbmFnZXIgdXNlZCB0byBpbXBsZW1lbnQgVGVzdENhc2UuYXNzZXJ0UmFpc2VzKiBtZXRob2RzLlxcXCJcXFwiXFxcIlxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0ZWQsIHRlc3RfY2FzZSk6XFxuICAgICAgICBzZWxmLnRlc3RfY2FzZSA9IHRlc3RfY2FzZVxcbiAgICAgICAgc2VsZi5leHBlY3RlZCA9IGV4cGVjdGVkXFxuICAgICAgICBzZWxmLmV4Y2VwdGlvbiA9IE5vbmVcXG5cXG4gICAgZGVmIF9pc19zdWJ0eXBlKHNlbGYsIGV4cGVjdGVkLCBiYXNldHlwZSk6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkLCB0dXBsZSk6XFxuICAgICAgICAgICAgcmV0dXJuIGFsbChzZWxmLl9pc19zdWJ0eXBlKGUsIGJhc2V0eXBlKSBmb3IgZSBpbiBleHBlY3RlZClcXG4gICAgICAgIHJldHVybiBpc2luc3RhbmNlKGV4cGVjdGVkLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyhleHBlY3RlZCwgYmFzZXR5cGUpXFxuXFxuICAgIGRlZiBoYW5kbGUoc2VsZiwgYXJncywga3dhcmdzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgSWYgYXJncyBpcyBlbXB0eSwgYXNzZXJ0UmFpc2VzIGlzIGJlaW5nIHVzZWQgYXMgYVxcbiAgICAgICAgY29udGV4dCBtYW5hZ2VyLCBzbyByZXR1cm4gc2VsZi5cXG4gICAgICAgIElmIGFyZ3MgaXMgbm90IGVtcHR5LCBjYWxsIGEgY2FsbGFibGUgcGFzc2luZyBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkXFxuICAgICAgICBhcmd1bWVudHMuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBpZiBub3Qgc2VsZi5faXNfc3VidHlwZShzZWxmLmV4cGVjdGVkLCBCYXNlRXhjZXB0aW9uKTpcXG4gICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdhc3NlcnRSYWlzZXMoKSBhcmcgMSBtdXN0IGJlIGFuIGV4Y2VwdGlvbiB0eXBlIG9yIHR1cGxlIG9mIGV4Y2VwdGlvbiB0eXBlcycpXFxuICAgICAgICAgICAgaWYgbm90IGFyZ3M6XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICAgICAgICAgY2FsbGFibGVfb2JqID0gYXJnc1swXVxcbiAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzE6XVxcbiAgICAgICAgICAgIHdpdGggc2VsZjpcXG4gICAgICAgICAgICAgICAgY2FsbGFibGVfb2JqKCphcmdzLCAqKmt3YXJncykgXFxuXFxuICAgICAgICBmaW5hbGx5OlxcbiAgICAgICAgICAgICMgYnBvLTIzODkwOiBtYW51YWxseSBicmVhayBhIHJlZmVyZW5jZSBjeWNsZVxcbiAgICAgICAgICAgIHNlbGYgPSBOb25lXFxuXFxuICAgIGRlZiBfX2VudGVyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdGIpOlxcbiAgICAgICAgcmVzID0gVHJ1ZVxcbiAgICAgICAgZmVlZGJhY2sgPSBcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5leGNlcHRpb24gPSBleGNfdmFsdWVcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBhY3RfZXhjID0gZXhjX3R5cGUuX19uYW1lX19cXG4gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjpcXG4gICAgICAgICAgICBhY3RfZXhjID0gc3RyKGV4Y190eXBlKVxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIGV4cF9leGMgPSBzZWxmLmV4cGVjdGVkLl9fbmFtZV9fXFxuICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuICAgICAgICAgICAgZXhwX2V4YyA9IHN0cihzZWxmLmV4cGVjdGVkKVxcblxcbiAgICAgICAgaWYgZXhjX3R5cGUgaXMgTm9uZTpcXG4gICAgICAgICAgICByZXMgPSBGYWxzZVxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcInt9IG5vdCByYWlzZWRcXFwiLmZvcm1hdChleHBfZXhjKVxcbiAgICAgICAgZWxpZiBub3QgaXNzdWJjbGFzcyhleGNfdHlwZSwgc2VsZi5leHBlY3RlZCk6XFxuICAgICAgICAgICAgcmVzID0gRmFsc2VcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCB7fSBidXQgZ290IHt9XFxcIi5mb3JtYXQoZXhwX2V4YywgYWN0X2V4YylcXG5cXG4gICAgICAgIHNlbGYudGVzdF9jYXNlLmFwcGVuZFJlc3VsdChyZXMsIGFjdF9leGMsIGV4cF9leGMsIGZlZWRiYWNrKVxcbiAgICAgICAgcmV0dXJuIFRydWVcXG5cXG5cXG5jbGFzcyBUZXN0Q2FzZShvYmplY3QpOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLm51bVBhc3NlZCA9IDBcXG4gICAgICAgIHNlbGYubnVtRmFpbGVkID0gMFxcbiAgICAgICAgc2VsZi5hc3NlcnRQYXNzZWQgPSAwXFxuICAgICAgICBzZWxmLmFzc2VydEZhaWxlZCA9IDBcXG4gICAgICAgIHNlbGYudmVyYm9zaXR5ID0gMVxcbiAgICAgICAgc2VsZi50bGlzdCA9IFtdXFxuICAgICAgICB0ZXN0TmFtZXMgPSB7fVxcbiAgICAgICAgZm9yIG5hbWUgaW4gZGlyKHNlbGYpOlxcbiAgICAgICAgICAgIGlmIG5hbWVbOjRdID09ICd0ZXN0JyBhbmQgbmFtZSBub3QgaW4gdGVzdE5hbWVzOlxcbiAgICAgICAgICAgICAgICBzZWxmLnRsaXN0LmFwcGVuZChnZXRhdHRyKHNlbGYsbmFtZSkpXFxuICAgICAgICAgICAgICAgIHRlc3ROYW1lc1tuYW1lXT1UcnVlXFxuXFxuICAgIGRlZiBzZXRVcChzZWxmKTpcXG4gICAgICAgIHBhc3NcXG5cXG4gICAgZGVmIHRlYXJEb3duKHNlbGYpOlxcbiAgICAgICAgcGFzc1xcbiAgICBcXG4gICAgZGVmIGNsZWFuTmFtZShzZWxmLGZ1bmNOYW1lKTpcXG4gICAgICAgIHJldHVybiBmdW5jTmFtZS5fX2Z1bmNfXy5fX25hbWVfX1xcblxcbiAgICBkZWYgbWFpbihzZWxmKTpcXG5cXG4gICAgICAgIGZvciBmdW5jIGluIHNlbGYudGxpc3Q6XFxuICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NpdHkgPiAxOlxcbiAgICAgICAgICAgICAgICBwcmludCgnUnVubmluZyAlcycgJSBzZWxmLmNsZWFuTmFtZShmdW5jKSlcXG4gICAgICAgICAgICB0cnk6XFxuICAgICAgICAgICAgICAgIHNlbGYuc2V0VXAoKVxcbiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFBhc3NlZCA9IDBcXG4gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgPSAwXFxuICAgICAgICAgICAgICAgIGZ1bmMoKVxcbiAgICAgICAgICAgICAgICBzZWxmLnRlYXJEb3duKClcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5hc3NlcnRGYWlsZWQgPT0gMDpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYubnVtUGFzc2VkICs9IDFcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYubnVtRmFpbGVkICs9IDFcXG4gICAgICAgICAgICAgICAgICAgIHByaW50KCdUZXN0cyBmYWlsZWQgaW4gJXMgJyAlIHNlbGYuY2xlYW5OYW1lKGZ1bmMpKVxcbiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgKz0gMVxcbiAgICAgICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuICAgICAgICAgICAgICAgIHByaW50KCdUZXN0IHRocmV3IGV4Y2VwdGlvbiBpbiAlcyAoJXMpJyAlIChzZWxmLmNsZWFuTmFtZShmdW5jKSwgZSkpXFxuICAgICAgICBzZWxmLnNob3dTdW1tYXJ5KClcXG5cXG4gICAgZGVmIGFzc2VydEVxdWFsKHNlbGYsIGFjdHVhbCwgZXhwZWN0ZWQsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGFjdHVhbD09ZXhwZWN0ZWRcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGVxdWFsICVzXFxcIiAlIChzdHIoYWN0dWFsKSxzdHIoZXhwZWN0ZWQpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhY3R1YWwgLGV4cGVjdGVkLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdEVxdWFsKHNlbGYsIGFjdHVhbCwgZXhwZWN0ZWQsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGFjdHVhbCAhPSBleHBlY3RlZFxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gbm90IGVxdWFsICVzXFxcIiAlIChzdHIoYWN0dWFsKSxzdHIoZXhwZWN0ZWQpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhY3R1YWwsIGV4cGVjdGVkLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydFRydWUoc2VsZix4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBib29sKHgpIGlzIFRydWVcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIFRydWVcXFwiICUgKHN0cih4KSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgeCwgVHJ1ZSwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRGYWxzZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IG5vdCBib29sKHgpXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBGYWxzZVxcXCIgJSAoc3RyKHgpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCB4LCBGYWxzZSwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRJcyhzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSBpcyBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSB0aGUgc2FtZSBvYmplY3QgYXMgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXNOb3Qoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgaXMgbm90IGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBiZSB0aGUgc2FtZSBvYmplY3QgYXMgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXNOb25lKHNlbGYseCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0geCBpcyBOb25lXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBOb25lXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIE5vbmUsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXNOb3ROb25lKHNlbGYseCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0geCBpcyBub3QgTm9uZVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gbm90IGJlIE5vbmVcXFwiICUgKHN0cih4KSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgeCwgTm9uZSwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRJbihzZWxmLCBhLCBiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIGluIGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIGluICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdEluKHNlbGYsIGEsIGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgbm90IGluIGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBiZSBpbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRJc0luc3RhbmNlKHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBpc2luc3RhbmNlKGEsYilcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIGFuIGluc3RhbmNlIG9mICVzXFxcIiAlIChzdHIoYSksIHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RJc0luc3RhbmNlKHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBub3QgaXNpbnN0YW5jZShhLGIpXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgYW4gaW5zdGFuY2Ugb2YgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0UmVnZXgoc2VsZiwgdGV4dCwgZXhwZWN0ZWRfcmVnZXgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZhaWwgdGhlIHRlc3QgdW5sZXNzIHRoZSB0ZXh0IG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWRfcmVnZXgsIChzdHIsICkpOiAjYnl0ZXNcXG4gICAgICAgICAgICBhc3NlcnQgZXhwZWN0ZWRfcmVnZXgsIFxcXCJleHBlY3RlZF9yZWdleCBtdXN0IG5vdCBiZSBlbXB0eS5cXFwiXFxuICAgICAgICAgICAgZXhwZWN0ZWRfcmVnZXggPSByZS5jb21waWxlKGV4cGVjdGVkX3JlZ2V4KVxcbiAgICAgICAgaWYgbm90IGV4cGVjdGVkX3JlZ2V4LnNlYXJjaCh0ZXh0KTpcXG4gICAgICAgICAgICByZXMgPSBGYWxzZVxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIlJlZ2V4IGRpZG4ndCBtYXRjaDogJXIgbm90IGZvdW5kIGluICVyXFxcIiAlIChcXG4gICAgICAgICAgICAgICAgcmVwcihleHBlY3RlZF9yZWdleCksIHRleHQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJlcyA9IFRydWVcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgdGV4dCwgZXhwZWN0ZWRfcmVnZXgsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0Tm90UmVnZXgoc2VsZiwgdGV4dCwgdW5leHBlY3RlZF9yZWdleCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRmFpbCB0aGUgdGVzdCBpZiB0aGUgdGV4dCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKHVuZXhwZWN0ZWRfcmVnZXgsIChzdHIsICkpOiAjIGJ5dGVzXFxuICAgICAgICAgICAgdW5leHBlY3RlZF9yZWdleCA9IHJlLmNvbXBpbGUodW5leHBlY3RlZF9yZWdleClcXG4gICAgICAgIG1hdGNoID0gdW5leHBlY3RlZF9yZWdleC5zZWFyY2godGV4dClcXG4gICAgICAgIGlmIG1hdGNoOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gJ1JlZ2V4IG1hdGNoZWQ6ICVyIG1hdGNoZXMgJXIgaW4gJXInICUgKFxcbiAgICAgICAgICAgICAgICB0ZXh0W21hdGNoLnN0YXJ0KCkgOiBtYXRjaC5lbmQoKV0sXFxuICAgICAgICAgICAgICAgIHJlcHIodW5leHBlY3RlZF9yZWdleCksXFxuICAgICAgICAgICAgICAgIHRleHQpXFxuICAgICAgICAgICAgIyBfZm9ybWF0TWVzc2FnZSBlbnN1cmVzIHRoZSBsb25nTWVzc2FnZSBvcHRpb24gaXMgcmVzcGVjdGVkXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChub3QgYm9vbChtYXRjaCksIHRleHQsIHVuZXhwZWN0ZWRfcmVnZXgsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0QWxtb3N0RXF1YWwoc2VsZiwgYSwgYiwgcGxhY2VzPTcsIGZlZWRiYWNrPVxcXCJcXFwiLCBkZWx0YT1Ob25lKTpcXG5cXG4gICAgICAgIGlmIGRlbHRhIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIHJlcyA9IGFicyhhLWIpIDw9IGRlbHRhXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHBsYWNlcyBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICBwbGFjZXMgPSA3XFxuICAgICAgICAgICAgcmVzID0gcm91bmQoYS1iLCBwbGFjZXMpID09IDBcXG4gICAgICAgIFxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gZXF1YWwgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0Tm90QWxtb3N0RXF1YWwoc2VsZiwgYSwgYiwgcGxhY2VzPTcsIGZlZWRiYWNrPVxcXCJcXFwiLCBkZWx0YT1Ob25lKTpcXG5cXG4gICAgICAgIGlmIGRlbHRhIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIHJlcyA9IG5vdCAoYSA9PSBiKSBhbmQgYWJzKGEgLSBiKSA+IGRlbHRhXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHBsYWNlcyBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICBwbGFjZXMgPSA3XFxuXFxuICAgICAgICAgICAgcmVzID0gcm91bmQoYS1iLCBwbGFjZXMpICE9IDBcXG5cXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBlcXVhbCAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRHcmVhdGVyKHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhID4gYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgZ3JlYXRlciB0aGFuICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydEdyZWF0ZXJFcXVhbChzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA+PSBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSA+PSAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRMZXNzKHNlbGYsIGEsIGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgPCBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBsZXNzIHRoYW4gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0TGVzc0VxdWFsKHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIDw9IGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIDw9ICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFwcGVuZFJlc3VsdChzZWxmLHJlcyxhY3R1YWwsZXhwZWN0ZWQsZmVlZGJhY2spOlxcbiAgICAgICAgaWYgcmVzOlxcbiAgICAgICAgICAgIG1zZyA9ICdQYXNzJ1xcbiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UGFzc2VkICs9IDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbXNnID0gJ0ZhaWw6ICcgKyAgZmVlZGJhY2tcXG4gICAgICAgICAgICBwcmludChtc2cpXFxuICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgKz0gMVxcblxcbiAgICBkZWYgYXNzZXJ0UmFpc2VzKHNlbGYsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgKmFyZ3MsICoqa3dhcmdzKTpcXG4gICAgICAgIGNvbnRleHQgPSBfQXNzZXJ0UmFpc2VzQ29udGV4dChleHBlY3RlZF9leGNlcHRpb24sIHNlbGYpXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuaGFuZGxlKGFyZ3MsIGt3YXJncylcXG4gICAgICAgIGZpbmFsbHk6XFxuICAgICAgICAgICAgIyBicG8tMjM4OTA6IG1hbnVhbGx5IGJyZWFrIGEgcmVmZXJlbmNlIGN5Y2xlXFxuICAgICAgICAgICAgY29udGV4dCA9IE5vbmVcXG5cXG4gICAgZGVmIGZhaWwoc2VsZiwgbXNnPU5vbmUpOlxcbiAgICAgICAgaWYgbXNnIGlzIE5vbmU6XFxuICAgICAgICAgICAgbXNnID0gJ0ZhaWwnXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG1zZyA9ICdGYWlsOiAnICsgbXNnXFxuICAgICAgICBwcmludChtc2cpXFxuICAgICAgICBzZWxmLmFzc2VydEZhaWxlZCArPSAxXFxuXFxuICAgIGRlZiBzaG93U3VtbWFyeShzZWxmKTpcXG4gICAgICAgIHBjdCA9IHNlbGYubnVtUGFzc2VkIC8gKHNlbGYubnVtUGFzc2VkK3NlbGYubnVtRmFpbGVkKSAqIDEwMFxcbiAgICAgICAgcHJpbnQoXFxcIlJhbiAlZCB0ZXN0cywgcGFzc2VkOiAlZCBmYWlsZWQ6ICVkXFxcXG5cXFwiICUgKHNlbGYubnVtUGFzc2VkK3NlbGYubnVtRmFpbGVkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5udW1QYXNzZWQsIHNlbGYubnVtRmFpbGVkKSlcXG5cXG5cXG5cXG5kZWYgbWFpbih2ZXJib3NpdHk9MSk6XFxuICAgIGdsb2IgPSBnbG9iYWxzKCkgIyBnbG9iYWxzKCkgc3RpbGwgbmVlZHMgd29ya1xcbiAgICBmb3IgbmFtZSBpbiBnbG9iOlxcbiAgICAgICAgaWYgdHlwZShnbG9iW25hbWVdKSA9PSB0eXBlIGFuZCBpc3N1YmNsYXNzKGdsb2JbbmFtZV0sIFRlc3RDYXNlKTpcXG4gICAgICAgICAgICB0cnk6XFxuICAgICAgICAgICAgICAgIHRjID0gZ2xvYltuYW1lXSgpXFxuICAgICAgICAgICAgICAgIHRjLnZlcmJvc2l0eSA9IHZlcmJvc2l0eVxcbiAgICAgICAgICAgICAgICB0Yy5tYWluKClcXG4gICAgICAgICAgICBleGNlcHQ6XFxuICAgICAgICAgICAgICAgIHByaW50KFxcXCJVbmNhdWdodCBFcnJvciBpbjogXFxcIiwgbmFtZSlcXG5cIixcInNyYy9saWIvdW5pdHRlc3QvZ3VpLnB5XCI6XCJpbXBvcnQgZG9jdW1lbnRcXG5mcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZVxcbmZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW5cXG5mcm9tIHRpbWUgaW1wb3J0IHNsZWVwXFxuXFxuXFxuY2xhc3MgVGVzdENhc2VHdWkoVGVzdENhc2UpOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBUZXN0Q2FzZS5fX2luaXRfXyhzZWxmKVxcbiAgICAgICAgc2VsZi5jbG9zZXN0RGl2ID0gZG9jdW1lbnQuY3VycmVudERpdigpXFxuICAgICAgICBzZWxmLmRpdmlkID0gZG9jdW1lbnQuY3VycmVudEdyYWRpbmdDb250YWluZXIoKVxcbiAgICAgICAgc2VsZi5teWRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZGl2aWQpXFxuICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpdiB0aGVuIGNyZWF0ZSBhIGR1bW15IHRvIGF2b2lkIGVycm9ycyB3aGVuIHJ1bm5pbmdcXG4gICAgICAgICMgZ3JhZGluZyBcXFwib2ZmIHNjcmVlblxcXCJcXG4gICAgICAgIGlmIHNlbGYubXlkaXYgaXMgTm9uZTpcXG4gICAgICAgICAgICBzZWxmLm15ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiZGl2XFxcIilcXG4gICAgICAgICAgICBzZWxmLm15ZGl2LnNldEF0dHJpYnV0ZShcXFwiaWRcXFwiLCBzZWxmLmRpdmlkICsgXFxcIl9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzXFxcIilcXG4gICAgICAgICAgICBzZWxmLm15ZGl2LnNldENTUyhcXFwiZGlzcGxheVxcXCIsIFxcXCJub25lXFxcIilcXG4gICAgICAgICAgICBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXFxcImJvZHlcXFwiKVswXVxcbiAgICAgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoc2VsZi5teWRpdilcXG4gICAgICAgICAgICBzZWxmLnVuaXRfcmVzdWx0c19kaXZpZCA9IHNlbGYuZGl2aWQgKyBcXFwiX29mZnNjcmVlbl91bml0X3Jlc3VsdHNcXFwiXFxuXFxuICAgICAgICByZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxmLmRpdmlkICsgXFxcIl91bml0X3Jlc3VsdHNcXFwiKVxcbiAgICAgICAgaWYgcmVzOlxcbiAgICAgICAgICAgIHNlbGYucmVzZGl2ID0gcmVzXFxuICAgICAgICAgICAgcmVzLmlubmVySFRNTCA9IFxcXCJcXFwiXFxuICAgICAgICAgICAgc2VsZi51bml0X3Jlc3VsdHNfZGl2aWQgPSBzZWxmLmRpdmlkICsgXFxcIl91bml0X3Jlc3VsdHNcXFwiXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYucmVzZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiZGl2XFxcIilcXG4gICAgICAgICAgICBzZWxmLnJlc2Rpdi5zZXRBdHRyaWJ1dGUoXFxcImlkXFxcIiwgc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIilcXG4gICAgICAgICAgICBzZWxmLnJlc2Rpdi5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcInVuaXR0ZXN0LXJlc3VsdHNcXFwiKVxcbiAgICAgICAgICAgIHNlbGYubXlkaXYuYXBwZW5kQ2hpbGQoc2VsZi5yZXNkaXYpXFxuICAgICAgICAgICAgc2VsZi51bml0X3Jlc3VsdHNfZGl2aWQgPSBzZWxmLmRpdmlkICsgXFxcIl91bml0X3Jlc3VsdHNcXFwiXFxuXFxuICAgIGRlZiBtYWluKHNlbGYpOlxcbiAgICAgICAgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRhYmxlXFxcIilcXG4gICAgICAgIHNlbGYucmVzVGFibGUgPSB0XFxuICAgICAgICB4ID0gc2VsZi5yZXNkaXYuY2xvc2VzdChcXFwiLnRpbWVkQ29tcG9uZW50XFxcIilcXG4gICAgICAgIGlmIHg6XFxuICAgICAgICAgICAgc2VsZi5pc190aW1lZCA9IFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5pc190aW1lZCA9IEZhbHNlXFxuICAgICAgICBzZWxmLnJlc2Rpdi5hcHBlbmRDaGlsZChzZWxmLnJlc1RhYmxlKVxcbiAgICAgICAgaWYgc2VsZi5pc190aW1lZDpcXG4gICAgICAgICAgICBzZWxmLnJlc2Rpdi5zZXRDU1MoXFxcImRpc3BsYXlcXFwiLCBcXFwibm9uZVxcXCIpXFxuXFxuICAgICAgICBoZWFkZXJzID0gW1xcXCJSZXN1bHRcXFwiLCBcXFwiQWN0dWFsIFZhbHVlXFxcIiwgXFxcIkV4cGVjdGVkIFZhbHVlXFxcIiwgXFxcIk5vdGVzXFxcIl1cXG4gICAgICAgIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRyXFxcIilcXG4gICAgICAgIGZvciBpdGVtIGluIGhlYWRlcnM6XFxuICAgICAgICAgICAgaGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRoXFxcIilcXG4gICAgICAgICAgICBoZWFkLnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcbiAgICAgICAgICAgIGhlYWQuaW5uZXJIVE1MID0gaXRlbVxcbiAgICAgICAgICAgIGhlYWQuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGhlYWQpXFxuICAgICAgICBzZWxmLnJlc1RhYmxlLmFwcGVuZENoaWxkKHJvdylcXG5cXG4gICAgICAgIGZvciBmdW5jIGluIHNlbGYudGxpc3Q6XFxuICAgICAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgICAgICBzZWxmLnNldFVwKClcXG4gICAgICAgICAgICAgICAgZnVuYygpXFxuICAgICAgICAgICAgICAgIHNlbGYudGVhckRvd24oKVxcbiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQoXFxcIkVycm9yXFxcIiwgTm9uZSwgTm9uZSwgc3RyKGUpLnNwbGl0KFxcXCJvbiBsaW5lXFxcIilbMF0pXFxuICAgICAgICAgICAgICAgIHNlbGYubnVtRmFpbGVkICs9IDFcXG4gICAgICAgIHNlbGYuc2hvd1N1bW1hcnkoKVxcblxcbiAgICBkZWYgZ2V0T3V0cHV0KHNlbGYpOlxcbiAgICAgICAgc2xlZXAoMC4yKVxcbiAgICAgICAgIyBzZWxmLmRpdmlkIHdpbGwgYmUgdGhlIGdyYWRpbmdXcmFwcGVyIHdoZW4gaW4gZ3JhZGluZyBtb2RlXFxuICAgICAgICBpZiBzZWxmLmNsb3Nlc3REaXYgIT0gc2VsZi5kaXZpZDpcXG4gICAgICAgICAgICBvdXRwdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxcbiAgICAgICAgICAgICAgICBcXFwiI3t9ICN7fV9zdGRvdXRcXFwiLmZvcm1hdChzZWxmLmRpdmlkLCBzZWxmLmNsb3Nlc3REaXYpXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBvdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxmLmRpdmlkICsgXFxcIl9zdGRvdXRcXFwiKVxcbiAgICAgICAgcmV0dXJuIG91dHB1dC5pbm5lclRleHRcXG5cXG4gICAgZGVmIGdldEVkaXRvclRleHQoc2VsZik6XFxuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0Q3VycmVudEVkaXRvclZhbHVlKClcXG5cXG4gICAgZGVmIGFwcGVuZFJlc3VsdChzZWxmLCByZXMsIGFjdHVhbCwgZXhwZWN0ZWQsIHBhcmFtKTpcXG4gICAgICAgIHRyaW1BY3R1YWwgPSBGYWxzZVxcbiAgICAgICAgaWYgbGVuKHN0cihhY3R1YWwpKSA+IDE1OlxcbiAgICAgICAgICAgIHRyaW1BY3R1YWwgPSBUcnVlXFxuICAgICAgICAgICAgYWN0dWFsVHlwZSA9IHR5cGUoYWN0dWFsKVxcbiAgICAgICAgdHJpbUV4cGVjdGVkID0gRmFsc2VcXG4gICAgICAgIGlmIGxlbihzdHIoZXhwZWN0ZWQpKSA+IDE1OlxcbiAgICAgICAgICAgIHRyaW1FeHBlY3RlZCA9IFRydWVcXG4gICAgICAgICAgICBleHBlY3RlZFR5cGUgPSB0eXBlKGV4cGVjdGVkKVxcbiAgICAgICAgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidHJcXFwiKVxcbiAgICAgICAgZXJyID0gRmFsc2VcXG4gICAgICAgIGlmIHJlcyA9PSBcXFwiRXJyb3JcXFwiOlxcbiAgICAgICAgICAgIGVyciA9IFRydWVcXG4gICAgICAgICAgICBtc2cgPSBcXFwiRXJyb3I6ICVzXFxcIiAlIHBhcmFtXFxuICAgICAgICAgICAgZXJyb3JEYXRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgICAgIGVycm9yRGF0YS5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBlcnJvckRhdGEuaW5uZXJIVE1MID0gXFxcIkVSUk9SXFxcIlxcbiAgICAgICAgICAgIGVycm9yRGF0YS5zZXRDU1MoXFxcImJhY2tncm91bmQtY29sb3JcXFwiLCBcXFwiI2RlOGU5NlxcXCIpXFxuICAgICAgICAgICAgZXJyb3JEYXRhLnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChlcnJvckRhdGEpXFxuICAgICAgICBlbGlmIHJlczpcXG4gICAgICAgICAgICBwYXNzZWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICAgICAgcGFzc2VkLnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcbiAgICAgICAgICAgIHBhc3NlZC5pbm5lckhUTUwgPSBcXFwiUGFzc1xcXCJcXG4gICAgICAgICAgICBwYXNzZWQuc2V0Q1NTKFxcXCJiYWNrZ3JvdW5kLWNvbG9yXFxcIiwgXFxcIiM4M2QzODJcXFwiKVxcbiAgICAgICAgICAgIHBhc3NlZC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQocGFzc2VkKVxcbiAgICAgICAgICAgIHNlbGYubnVtUGFzc2VkICs9IDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgZmFpbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgICAgICBmYWlsLnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcbiAgICAgICAgICAgIGZhaWwuaW5uZXJIVE1MID0gXFxcIkZhaWxcXFwiXFxuICAgICAgICAgICAgZmFpbC5zZXRDU1MoXFxcImJhY2tncm91bmQtY29sb3JcXFwiLCBcXFwiI2RlOGU5NlxcXCIpXFxuICAgICAgICAgICAgZmFpbC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoZmFpbClcXG4gICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuXFxuICAgICAgICBhY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICBhY3Quc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuICAgICAgICBpZiB0cmltQWN0dWFsOlxcbiAgICAgICAgICAgIGFjdEhUTUwgPSBzdHIoYWN0dWFsKVs6NV0gKyBcXFwiLi4uXFxcIiArIHN0cihhY3R1YWwpWy01Ol1cXG4gICAgICAgICAgICBpZiBhY3R1YWxUeXBlID09IHN0cjpcXG4gICAgICAgICAgICAgICAgYWN0SFRNTCA9IHJlcHIoYWN0SFRNTClcXG4gICAgICAgICAgICBhY3QuaW5uZXJIVE1MID0gYWN0SFRNTFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBhY3QuaW5uZXJIVE1MID0gcmVwcihhY3R1YWwpXFxuICAgICAgICBhY3Quc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICByb3cuYXBwZW5kQ2hpbGQoYWN0KVxcblxcbiAgICAgICAgZXhwZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgZXhwZWN0LnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcblxcbiAgICAgICAgaWYgdHJpbUV4cGVjdGVkOlxcbiAgICAgICAgICAgIGV4cGVjdGVkSFRNTCA9IHN0cihleHBlY3RlZClbOjVdICsgXFxcIi4uLlxcXCIgKyBzdHIoZXhwZWN0ZWQpWy01Ol1cXG4gICAgICAgICAgICBpZiBleHBlY3RlZFR5cGUgPT0gc3RyOlxcbiAgICAgICAgICAgICAgICBleHBlY3RlZEhUTUwgPSByZXByKGV4cGVjdGVkSFRNTClcXG4gICAgICAgICAgICBleHBlY3QuaW5uZXJIVE1MID0gZXhwZWN0ZWRIVE1MXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGV4cGVjdC5pbm5lckhUTUwgPSByZXByKGV4cGVjdGVkKVxcbiAgICAgICAgZXhwZWN0LnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKGV4cGVjdClcXG4gICAgICAgIGlucCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgIGlucC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG5cXG4gICAgICAgIGlmIGVycjpcXG4gICAgICAgICAgICBpbnAuaW5uZXJIVE1MID0gbXNnXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlucC5pbm5lckhUTUwgPSBwYXJhbVxcbiAgICAgICAgaW5wLnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKGlucClcXG5cXG4gICAgICAgIGlmIHRyaW1BY3R1YWwgb3IgdHJpbUV4cGVjdGVkOlxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImJ1dHRvblxcXCIpXFxuICAgICAgICAgICAgZXhwYW5kYnV0dG9uLmlubmVySFRNTCA9IFxcXCJFeHBhbmQgRGlmZmVyZW5jZXNcXFwiXFxuICAgICAgICAgICAgZXhwYW5kbXNnID0gXFxcIkFjdHVhbDogXFxcIiArIHN0cihhY3R1YWwpICsgXFxcIlxcXFxuRXhwZWN0ZWQ6IFxcXCIgKyBzdHIoZXhwZWN0ZWQpXFxuICAgICAgICAgICAgZXhwYW5kYnV0dG9uLnNldEF0dHJpYnV0ZShcXFwidmFsdWVcXFwiLCBleHBhbmRtc2cpXFxuICAgICAgICAgICAgZXhwYW5kYnV0dG9uLnNldEF0dHJpYnV0ZShcXFwidHlwZVxcXCIsIFxcXCJidXR0b25cXFwiKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcIm9uY2xpY2tcXFwiLCBcXFwiYWxlcnQodGhpcy52YWx1ZSlcXFwiKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImJ0biBidG4taW5mb1xcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGV4cGFuZGJ1dHRvbilcXG5cXG4gICAgICAgIHNlbGYucmVzVGFibGUuYXBwZW5kQ2hpbGQocm93KVxcblxcbiAgICBkZWYgc2hvd1N1bW1hcnkoc2VsZik6XFxuICAgICAgICBwY3QgPSBmbG9hdChzZWxmLm51bVBhc3NlZCkgLyAoc2VsZi5udW1QYXNzZWQgKyBzZWxmLm51bUZhaWxlZCkgKiAxMDBcXG4gICAgICAgIHBjdGNvcnJlY3QgPSAoXFxuICAgICAgICAgICAgXFxcInBlcmNlbnQ6XFxcIlxcbiAgICAgICAgICAgICsgc3RyKHBjdClcXG4gICAgICAgICAgICArIFxcXCI6cGFzc2VkOlxcXCJcXG4gICAgICAgICAgICArIHN0cihzZWxmLm51bVBhc3NlZClcXG4gICAgICAgICAgICArIFxcXCI6ZmFpbGVkOlxcXCJcXG4gICAgICAgICAgICArIHN0cihzZWxmLm51bUZhaWxlZClcXG4gICAgICAgIClcXG4gICAgICAgIHBUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJwXFxcIilcXG4gICAgICAgIGlmIG5vdCBzZWxmLmlzX3RpbWVkOlxcbiAgICAgICAgICAgIHBUYWcuaW5uZXJIVE1MID0gXFxcIllvdSBwYXNzZWQ6IFxcXCIgKyBzdHIocGN0KSArIFxcXCIlIG9mIHRoZSB0ZXN0c1xcXCJcXG4gICAgICAgICAgICBzZWxmLnJlc2Rpdi5hcHBlbmRDaGlsZChwVGFnKVxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIGpzZXZhbChcXFwid2luZG93LmVkTGlzdFsne30nXS5wY3RfY29ycmVjdCA9IHt9XFxcIi5mb3JtYXQoc2VsZi5jbG9zZXN0RGl2LCBwY3QpKVxcbiAgICAgICAgICAgIGpzZXZhbChcXG4gICAgICAgICAgICAgICAgXFxcIndpbmRvdy5lZExpc3RbJ3t9J10udW5pdF9yZXN1bHRzID0gJ3t9J1xcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZXN0RGl2LCBwY3Rjb3JyZWN0XFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICApXFxuICAgICAgICAgICAganNldmFsKFxcbiAgICAgICAgICAgICAgICBcXFwid2luZG93LmVkTGlzdFsne30nXS51bml0X3Jlc3VsdHNfZGl2aWQgPSAne30nXFxcIi5mb3JtYXQoXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3Nlc3REaXYsIHNlbGYubXlkaXYuZ2V0QXR0cmlidXRlKFxcXCJpZFxcXCIpXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICApXFxuXFxuICAgICAgICBleGNlcHQ6XFxuICAgICAgICAgICAgcHJpbnQoXFxuICAgICAgICAgICAgICAgIFxcXCJmYWlsZWQgdG8gZmluZCBvYmplY3QgdG8gcmVjb3JkIHVuaXR0ZXN0IHJlc3VsdHMhIHt9XFxcIi5mb3JtYXQoXFxuICAgICAgICAgICAgICAgICAgICBwY3Rjb3JyZWN0XFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICApXFxuXCIsXCJzcmMvbGliL3VybGxpYi9fX2luaXRfXy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7cmV0dXJue319O1wiLFwic3JjL2xpYi91cmxsaWIvcmVxdWVzdC9fX2luaXRfXy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e307YS5SZXNwb25zZT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLmRhdGEkPWIucmVzcG9uc2VUZXh0LGEubGluZUxpc3Q9YS5kYXRhJC5zcGxpdChcXFwiXFxcXG5cXFwiKSxhLmxpbmVMaXN0PWEubGluZUxpc3Quc2xpY2UoMCwtMSk7Zm9yKHZhciBjPTA7YzxhLmxpbmVMaXN0Lmxlbmd0aDtjKyspYS5saW5lTGlzdFtjXSs9XFxcIlxcXFxuXFxcIjthLmN1cnJlbnRMaW5lPTAsYS5wb3MkPTB9KSxiLl9fc3RyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5mZmkucmVtYXBUb1B5KFxcXCI8UmVzcG9uc2U+XFxcIil9KSxiLl9faXRlcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS5saW5lTGlzdDtyZXR1cm4gU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGluZGV4Pj10aGlzLiRsaW5lcy5sZW5ndGg/dm9pZCAwOm5ldyBTay5idWlsdGluLnN0cih0aGlzLiRsaW5lc1t0aGlzLiRpbmRleCsrXSl9LHskb2JqOmEsJGluZGV4OjAsJGxpbmVzOmJ9KX0pLGIucmVhZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7aWYoYS5jbG9zZWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVxcXCIpO3ZhciBjPWEuZGF0YSQubGVuZ3RoO3ZvaWQgMD09PWImJihiPWMpO3ZhciBkPW5ldyBTay5idWlsdGluLnN0cihhLmRhdGEkLnN1YnN0cihhLnBvcyQsYikpO3JldHVybiBhLnBvcyQrPWIsYS5wb3MkPj1jJiYoYS5wb3MkPWMpLGR9KSxiLnJlYWRsaW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9XFxcIlxcXCI7cmV0dXJuIGEuY3VycmVudExpbmU8YS5saW5lTGlzdC5sZW5ndGgmJihiPWEubGluZUxpc3RbYS5jdXJyZW50TGluZV0sYS5jdXJyZW50TGluZSsrKSxuZXcgU2suYnVpbHRpbi5zdHIoYil9KSxiLnJlYWRsaW5lcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPWEuY3VycmVudExpbmU7YzxhLmxpbmVMaXN0Lmxlbmd0aDtjKyspYi5wdXNoKG5ldyBTay5idWlsdGluLnN0cihhLmxpbmVMaXN0W2NdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9KX0sXFxcIlJlc3BvbnNlXFxcIixbXSk7dmFyIGI9ZnVuY3Rpb24oYSl7dmFyIGI7aWYoIVNrLmpzb25wU2l0ZXMpcmV0dXJuITE7Zm9yKGI9MDtiPFNrLmpzb25wU2l0ZXMubGVuZ3RoO2IrKylpZihhLnN0YXJ0c1dpdGgoU2suanNvbnBTaXRlc1tiXSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiBhLnVybG9wZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihjLGQpe3ZhciBlPWIoYy52KT9uZXcgUHJvbWlzZShmdW5jdGlvbihiLGQpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInNjcmlwdFxcXCIpO2Uuc3JjPWMuditcXFwiJmNhbGxiYWNrPVNrLmpzb25wY2FsbGJhY2tcXFwiLGUub25lcnJvcj1mdW5jdGlvbigpe2QoXFxcIkFuIGVycm9yIG9jY3VyZWQgZ2V0dGluZyB0aGUgZGF0YVxcXCIpfSxTay5qc29ucGNhbGxiYWNrPWZ1bmN0aW9uKGMpe3ZhciBkPXtyZXNwb25zZVRleHQ6SlNPTi5zdHJpbmdpZnkoYyl9O2IoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuUmVzcG9uc2UsW2RdKSl9O3RyeXtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpfWNhdGNoKGEpe2NvbnNvbGUubG9nKFxcXCJjYXVnaHQgZXJyb3IgaW4gdXJsb3BlblxcXCIrYSl9fSk6bmV3IFByb21pc2UoZnVuY3Rpb24oYil7dmFyIGU9bmV3IFhNTEh0dHBSZXF1ZXN0O2UuYWRkRXZlbnRMaXN0ZW5lcihcXFwibG9hZGVuZFxcXCIsZnVuY3Rpb24oKXtiKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlJlc3BvbnNlLFtlXSkpfSksZD8oZS5vcGVuKFxcXCJQT1NUXFxcIixjLnYpLGUuc2V0UmVxdWVzdEhlYWRlcihcXFwiQ29udGVudC10eXBlXFxcIixcXFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXFxcIiksZS5zZW5kKGQudikpOihlLm9wZW4oXFxcIkdFVFxcXCIsYy52KSxlLnNlbmQobnVsbCkpfSk7dmFyIGY9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247cmV0dXJuIGYucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHJlc29sdXRpb259LGYuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTplLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIHJlc29sdXRpb249YSxhfSxmdW5jdGlvbihhKXtyZXR1cm4gcmVzb2x1dGlvbj1cXFwiXFxcIixhfSl9LGZ9KSxhfTtcIixcInNyYy9saWIvdXJsbGliMi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXJsbGliMiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3VybHBhcnNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ1cmxwYXJzZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3VzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInVzZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91dS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91dWlkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ1dWlkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2FybmluZ3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndhcm5pbmdzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2F2ZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwid2F2ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dlYWtyZWYucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndlYWtyZWYgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93ZWJicm93c2VyLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBvcGVuX3RhYihhKXtyZXR1cm4oU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwidXJsXFxcIixcXFwic3RyaW5nXFxcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKSwhYik/U2suYnVpbHRpbi5ib29sLmZhbHNlJDooYT1hLiRqc3N0cigpLHdpbmRvdy5vcGVuKGEsXFxcIl9ibGFua1xcXCIpLFNrLmJ1aWx0aW4uYm9vbC50cnVlJCl9dmFyIGE9e30sYj1cXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHdpbmRvdyYmXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cubmF2aWdhdG9yO3JldHVybiBhLl9fbmFtZV9fPW5ldyBTay5idWlsdGluLnN0cihcXFwid2ViYnJvd3NlclxcXCIpLGEub3Blbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIG9wZW4oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5cXFwiLGFyZ3VtZW50cy5sZW5ndGgrMSwxLDMpLG9wZW5fdGFiKGEpfSksYS5vcGVuX25ldz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIG9wZW5fbmV3KGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuX25ld1xcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLG9wZW5fdGFiKGEpfSksYS5vcGVuX25ld190YWI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuX25ld190YWIoYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5fbmV3X3RhYlxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLG9wZW5fdGFiKGEpfSksYS5EZWZhdWx0QnJvd3Nlcj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24gZGZsYnJvd3NlcihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBfX2luaXRfXygpe3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KSxiLm9wZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuKGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KSxvcGVuX3RhYihiKX0pLGIub3Blbl9uZXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuX25ldyhhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuX25ld1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLG9wZW5fdGFiKGIpfSksYi5vcGVuX25ld190YWI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuX25ld190YWIoYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdfdGFiXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksb3Blbl90YWIoYil9KX0sXFxcIkRlZmF1bHRCcm93c2VyXFxcIixbXSksYS5nZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBnZXQoKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0XFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuRGVmYXVsdEJyb3dzZXIsW10pfSksYX07XCIsXCJzcmMvbGliL3dlYmJyb3dzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndlYmJyb3dzZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93ZWJnbC9fX2luaXRfXy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwid2ViZ2xcXFwiKX0sYz1mdW5jdGlvbihhKXtyZXR1cm5cXFwiPHRhYmxlIHN0eWxlPVxcXFxcXFwiYmFja2dyb3VuZC1jb2xvcjogIzhDRTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcXFxcXFxcIj48dHI+PHRkIGFsaWduPVxcXFxcXFwiY2VudGVyXFxcXFxcXCI+PGRpdiBzdHlsZT1cXFxcXFxcImRpc3BsYXk6IHRhYmxlLWNlbGw7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcXFxcXCI+PGRpdiBzdHlsZT1cXFxcXFxcIlxcXFxcXFwiPlxcXCIrYStcXFwiPC9kaXY+PC9kaXY+PC90ZD48L3RyPjwvdGFibGU+XFxcIn0sZD1cXFwiVGhpcyBwYWdlIHJlcXVpcmVzIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIFdlYkdMLjxici8+PGEgaHJlZj1cXFxcXFxcImh0dHA6Ly9nZXQud2ViZ2wub3JnXFxcXFxcXCI+Q2xpY2sgaGVyZSB0byB1cGdyYWRlIHlvdXIgYnJvd3Nlci48L2E+XFxcIixlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXFxcIndlYmdsXFxcIixcXFwiZXhwZXJpbWVudGFsLXdlYmdsXFxcIixcXFwid2Via2l0LTNkXFxcIixcXFwibW96LXdlYmdsXFxcIl0sYz1udWxsLGQ9MDtkPGIubGVuZ3RoOysrZCl7dHJ5e2M9YS5nZXRDb250ZXh0KGJbZF0pfWNhdGNoKGEpe31pZihjKWJyZWFrfWlmKGMpe2Z1bmN0aW9uIHJldHVybkZhbHNlKCl7cmV0dXJuITF9YS5vbnNlbGVjdHN0YXJ0PXJldHVybkZhbHNlLGEub25tb3VzZWRvd249cmV0dXJuRmFsc2V9cmV0dXJuIGN9LGY9ZnVuY3Rpb24oYSxmKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtpZihmfHwoZj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKFxcXCJjYW52YXNcXFwiKVswXSksIWYpcmV0dXJuIHZvaWQoZy5pbm5lckhUTUw9YyhkKSk7dmFyIGg9ZShmKTtpZighaCl7dmFyIGk9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvKFxcXFx3K1xcXFwvLio/ICkvZyksaj17fTt0cnl7Zm9yKHZhciBrPTA7azxpLmxlbmd0aDsrK2spe2Zvcih2YXIgbD1pW2tdLm1hdGNoKC8oXFxcXHcrKS9nKSxtPVtdLG49MTtuPGwubGVuZ3RoOysrbiltLnB1c2gocGFyc2VJbnQobFtuXSkpO2pbbFswXV09bX19Y2F0Y2goYSl7fWcuaW5uZXJIVE1MPWouQ2hyb21lJiYoNzxqLkNocm9tZVswXXx8Nz09ai5DaHJvbWVbMF0mJjA8ai5DaHJvbWVbMV18fDc9PWouQ2hyb21lWzBdJiYwPT1qLkNocm9tZVsxXSYmNTIxPD1qLkNocm9tZVsyXSk/YyhcXFwiSXQgZG9lc24ndCBhcHBlYXIgeW91ciBjb21wdXRlciBjYW4gc3VwcG9ydCBXZWJHTC48YnIvPjxhIGhyZWY9XFxcXFxcXCJodHRwOi8vZ2V0LndlYmdsLm9yZ1xcXFxcXFwiPkNsaWNrIGhlcmUgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9hPlxcXCIpOmMoZCl9cmV0dXJuIGh9O3JldHVybiBhLkNvbnRleHQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi52KSxkPWYoYi52LGMpO2lmKCFkKXRocm93IG5ldyBFcnJvcihcXFwiWW91ciBicm93c2VyIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IFdlYkdMLlxcXCIpO2Zvcih2YXIgZSBpbiBhLmdsPWQsZC5fX3Byb3RvX18paWYoXFxcIm51bWJlclxcXCI9PXR5cGVvZiBkLl9fcHJvdG9fX1tlXSlTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKGUpLGQuX19wcm90b19fW2VdKTtlbHNlIGlmKFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBkLl9fcHJvdG9fX1tlXSlzd2l0Y2goZSl7Y2FzZVxcXCJidWZmZXJEYXRhXFxcIjpicmVhaztjYXNlXFxcImNsZWFyQ29sb3JcXFwiOmJyZWFrO2Nhc2VcXFwiZHJhd0FycmF5c1xcXCI6YnJlYWs7Y2FzZVxcXCJnZXRBdHRyaWJMb2NhdGlvblxcXCI6YnJlYWs7Y2FzZVxcXCJnZXRVbmlmb3JtTG9jYXRpb25cXFwiOmJyZWFrO2Nhc2VcXFwic2hhZGVyU291cmNlXFxcIjpicmVhaztjYXNlXFxcInVuaWZvcm1NYXRyaXg0ZnZcXFwiOmJyZWFrO2Nhc2VcXFwidmVydGV4QXR0cmliUG9pbnRlclxcXCI6YnJlYWs7Y2FzZVxcXCJ2aWV3cG9ydFxcXCI6YnJlYWs7ZGVmYXVsdDooZnVuY3Rpb24oYil7U2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihlKSxuZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE9ZC5fX3Byb3RvX19bYl07cmV0dXJuIGEuYXBwbHkoZCxhcmd1bWVudHMpfSkpfSkoZSk7fWQuY2xlYXJDb2xvcigxMDAvMjU1LDE0OS8yNTUsMjM3LzI1NSwxKSxkLmNsZWFyKGQuQ09MT1JfQlVGRkVSX0JJVCl9KSxiLnRwJGdldGF0dHI9U2suZ2VuZXJpYy5nZXRBdHRyLGIuYnVmZmVyRGF0YT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EuZ2wuYnVmZmVyRGF0YShiLGMudixkKX0pLGIuY2xlYXJDb2xvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7YS5nbC5jbGVhckNvbG9yKFNrLmJ1aWx0aW4uYXNudW0kKGIpLFNrLmJ1aWx0aW4uYXNudW0kKGMpLFNrLmJ1aWx0aW4uYXNudW0kKGQpLFNrLmJ1aWx0aW4uYXNudW0kKGUpKX0pLGIuZ2V0QXR0cmliTG9jYXRpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEuZ2wuZ2V0QXR0cmliTG9jYXRpb24oYixjLnYpfSksYi5nZXRVbmlmb3JtTG9jYXRpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKGIsYy52KX0pLGIuc2hhZGVyU291cmNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2EuZ2wuc2hhZGVyU291cmNlKGIsYy52KX0pLGIuZHJhd0FycmF5cz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EuZ2wuZHJhd0FycmF5cyhTay5idWlsdGluLmFzbnVtJChiKSxTay5idWlsdGluLmFzbnVtJChjKSxTay5idWlsdGluLmFzbnVtJChkKSl9KSxiLnZlcnRleEF0dHJpYlBvaW50ZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnKXthLmdsLnZlcnRleEF0dHJpYlBvaW50ZXIoYixTay5idWlsdGluLmFzbnVtJChjKSxTay5idWlsdGluLmFzbnVtJChkKSxlLFNrLmJ1aWx0aW4uYXNudW0kKGYpLFNrLmJ1aWx0aW4uYXNudW0kKGcpKX0pLGIudmlld3BvcnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe2EuZ2wudmlld3BvcnQoU2suYnVpbHRpbi5hc251bSQoYiksU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCksU2suYnVpbHRpbi5hc251bSQoZSkpfSksYi51bmlmb3JtTWF0cml4NGZ2PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS5nbC51bmlmb3JtTWF0cml4NGZ2KFNrLmJ1aWx0aW4uYXNudW0kKGIpLGMsZC52KX0pLGIuc2V0RHJhd0Z1bmM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBEYXRlKCkuZ2V0VGltZSgpLGQ9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYixbYSxuZXcgRGF0ZSgpLmdldFRpbWUoKS1jXSl9LDFlMy82MCl9KX0sXFxcIkNvbnRleHRcXFwiLFtdKSxhLkZsb2F0MzJBcnJheT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBiP25ldyBGbG9hdDMyQXJyYXkoYik6bmV3IEZsb2F0MzJBcnJheShTay5mZmkucmVtYXBUb0pzKGIpKX0pLGIuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS52Lmxlbmd0aDsrK2MpYi5wdXNoKGEudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiW1xcXCIrYi5qb2luKFxcXCIsIFxcXCIpK1xcXCJdXFxcIil9KX0sXFxcIkZsb2F0MzJBcnJheVxcXCIsW10pLGEuTWF0cml4NHg0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudj1uZXcgRmxvYXQzMkFycmF5KFNrLmZmaS5yZW1hcFRvSnMoYikpfSksYi5pZGVudGl0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWEudjtiWzBdPTEsYlsxXT0wLGJbMl09MCxiWzNdPTAsYls0XT0wLGJbNV09MSxiWzZdPTAsYls3XT0wLGJbOF09MCxiWzldPTAsYlsxMF09MSxiWzExXT0wLGJbMTJdPTAsYlsxM109MCxiWzE0XT0wLGJbMTVdPTF9KSxiLnBlcnNwZWN0aXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjLGQsZSxnKXt2YXIgaD1NYXRoLnRhbixpPU1hdGguUEksaj1oKC41KmktLjUqKFNrLmJ1aWx0aW4uYXNudW0kKGMpKmkvMTgwKSksbD1Tay5idWlsdGluLmFzbnVtJChkKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGUpLG49U2suYnVpbHRpbi5hc251bSQoZyksZj0xLyhhLW4pLGs9Yi52O2tbMF09ai9sLGtbMV09MCxrWzJdPTAsa1szXT0wLGtbNF09MCxrWzVdPWosa1s2XT0wLGtbN109MCxrWzhdPTAsa1s5XT0wLGtbMTBdPShhK24pKmYsa1sxMV09LTEsa1sxMl09MCxrWzEzXT0wLGtbMTRdPTIqKGEqbipmKSxrWzE1XT0wfSksYi50cmFuc2xhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPWEudixkPVNrLmZmaS5yZW1hcFRvSnMoYik7Y1swXT0xLGNbMV09MCxjWzJdPTAsY1szXT0wLGNbNF09MCxjWzVdPTEsY1s2XT0wLGNbN109MCxjWzhdPTAsY1s5XT0wLGNbMTBdPTEsY1sxMV09MCxjWzEyXT1kWzBdLGNbMTNdPWRbMV0sY1sxNF09ZFsyXSxjWzE1XT0xfSksYi5fX3JlcHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7YzxhLnYubGVuZ3RoOysrYyliLnB1c2goYS52W2NdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJbXFxcIitiLmpvaW4oXFxcIiwgXFxcIikrXFxcIl1cXFwiKX0pfSxcXFwiTWF0cml4NHg0XFxcIixbXSksYX07XCIsXCJzcmMvbGliL3dlYmdsL21hdGguanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9O3JldHVybiBhLk1hdDQ0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihiLGMpe3ZhciBkPU1hdGguc3FydDtjLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGMubG9hZElkZW50aXR5LFthXSksYS5zdGFjaz1bXX0pLGMucHVzaD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Euc3RhY2sucHVzaChhLmVsZW1lbnRzLnNsaWNlKDApKX0pLGMucG9wPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS5lbGVtZW50cz1hLnN0YWNrLnBvcCgpfSksYy5sb2FkSWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXX0pLGMudHJhbnNmb3JtMz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yi5lbGVtZW50cztyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuVmVjMyxbZFswXSpjLngrZFs0XSpjLnkrZFs4XSpjLnosZFsxXSpjLngrZFs1XSpjLnkrZFs5XSpjLnosZFsyXSpjLngrZFs2XSpjLnkrZFsxMF0qYy56XSl9KSxjLnNjYWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEuZWxlbWVudHNbMF0qPWIsYS5lbGVtZW50c1sxXSo9YixhLmVsZW1lbnRzWzJdKj1iLGEuZWxlbWVudHNbM10qPWIsYS5lbGVtZW50c1s0XSo9YyxhLmVsZW1lbnRzWzVdKj1jLGEuZWxlbWVudHNbNl0qPWMsYS5lbGVtZW50c1s3XSo9YyxhLmVsZW1lbnRzWzhdKj1kLGEuZWxlbWVudHNbOV0qPWQsYS5lbGVtZW50c1sxMF0qPWQsYS5lbGVtZW50c1sxMV0qPWQsYX0pLGMudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEuZWxlbWVudHNbMTJdKz1hLmVsZW1lbnRzWzBdKmIrYS5lbGVtZW50c1s0XSpjK2EuZWxlbWVudHNbOF0qZCxhLmVsZW1lbnRzWzEzXSs9YS5lbGVtZW50c1sxXSpiK2EuZWxlbWVudHNbNV0qYythLmVsZW1lbnRzWzldKmQsYS5lbGVtZW50c1sxNF0rPWEuZWxlbWVudHNbMl0qYithLmVsZW1lbnRzWzZdKmMrYS5lbGVtZW50c1sxMF0qZCxhLmVsZW1lbnRzWzE1XSs9YS5lbGVtZW50c1szXSpiK2EuZWxlbWVudHNbN10qYythLmVsZW1lbnRzWzExXSpkLGF9KSxjLnJvdGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyxlLGYsZyl7dmFyIGg9TWF0aC5jb3MsaT1NYXRoLnNpbixqPU1hdGguUEksaz1kKGUqZStmKmYrZypnKSxsPWkoYypqLzE4MCksbT1oKGMqai8xODApO2lmKDA8ayl7dmFyIG4sbyxwLHEscixzLHQsdSx2LHcsQTtlLz1rLGYvPWssZy89ayxuPWUqZSxvPWYqZixwPWcqZyxxPWUqZixyPWYqZyxzPWcqZSx0PWUqbCx1PWYqbCx2PWcqbCx3PTEtbSxBPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLk1hdDQ0KSxBLmVsZW1lbnRzWzBdPXcqbittLEEuZWxlbWVudHNbMV09dypxLXYsQS5lbGVtZW50c1syXT13KnMrdSxBLmVsZW1lbnRzWzNdPTAsQS5lbGVtZW50c1s0XT13KnErdixBLmVsZW1lbnRzWzVdPXcqbyttLEEuZWxlbWVudHNbNl09dypyLXQsQS5lbGVtZW50c1s3XT0wLEEuZWxlbWVudHNbOF09dypzLXUsQS5lbGVtZW50c1s5XT13KnIrdCxBLmVsZW1lbnRzWzEwXT13KnArbSxBLmVsZW1lbnRzWzExXT0wLEEuZWxlbWVudHNbMTJdPTAsQS5lbGVtZW50c1sxM109MCxBLmVsZW1lbnRzWzE0XT0wLEEuZWxlbWVudHNbMTVdPTEsQT1BLm11bHRpcGx5KGIpLGIuZWxlbWVudHM9QS5lbGVtZW50c31yZXR1cm4gYn0pLGMubXVsdGlwbHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe2Zvcih2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5NYXQ0NCksZT0wOzQ+ZTtlKyspZC5lbGVtZW50c1s0KmUrMF09Yi5lbGVtZW50c1s0KmUrMF0qYy5lbGVtZW50c1swXStiLmVsZW1lbnRzWzQqZSsxXSpjLmVsZW1lbnRzWzRdK2IuZWxlbWVudHNbNCplKzJdKmMuZWxlbWVudHNbOF0rYi5lbGVtZW50c1s0KmUrM10qYy5lbGVtZW50c1sxMl0sZC5lbGVtZW50c1s0KmUrMV09Yi5lbGVtZW50c1s0KmUrMF0qYy5lbGVtZW50c1sxXStiLmVsZW1lbnRzWzQqZSsxXSpjLmVsZW1lbnRzWzVdK2IuZWxlbWVudHNbNCplKzJdKmMuZWxlbWVudHNbOV0rYi5lbGVtZW50c1s0KmUrM10qYy5lbGVtZW50c1sxM10sZC5lbGVtZW50c1s0KmUrMl09Yi5lbGVtZW50c1s0KmUrMF0qYy5lbGVtZW50c1syXStiLmVsZW1lbnRzWzQqZSsxXSpjLmVsZW1lbnRzWzZdK2IuZWxlbWVudHNbNCplKzJdKmMuZWxlbWVudHNbMTBdK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTRdLGQuZWxlbWVudHNbNCplKzNdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbM10rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s3XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzExXStiLmVsZW1lbnRzWzQqZSszXSpjLmVsZW1lbnRzWzE1XTtyZXR1cm4gYi5lbGVtZW50cz1kLmVsZW1lbnRzLGJ9KSxjLmxvb2tBdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyxlLGYsZyxoLGksaixrLGwpe3ZhciBtPVtjLWcsZS1oLGYtaV0sbj1kKG1bMF0qbVswXSttWzFdKm1bMV0rbVsyXSptWzJdKTtuJiYobVswXS89bixtWzFdLz1uLG1bMl0vPW4pO3ZhciBvPVtqLGssbF0scD1bXTtwWzBdPW9bMV0qbVsyXS1vWzJdKm1bMV0scFsxXT0tb1swXSptWzJdK29bMl0qbVswXSxwWzJdPW9bMF0qbVsxXS1vWzFdKm1bMF0sb1swXT1tWzFdKnBbMl0tbVsyXSpwWzFdLG9bMV09LW1bMF0qcFsyXSttWzJdKnBbMF0sb1syXT1tWzBdKnBbMV0tbVsxXSpwWzBdLG49ZChwWzBdKnBbMF0rcFsxXSpwWzFdK3BbMl0qcFsyXSksbiYmKHBbMF0vPW4scFsxXS89bixwWzJdLz1uKSxuPWQob1swXSpvWzBdK29bMV0qb1sxXStvWzJdKm9bMl0pLG4mJihvWzBdLz1uLG9bMV0vPW4sb1syXS89bik7dmFyIHE9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuTWF0NDQpO3JldHVybiBxLmVsZW1lbnRzWzBdPXBbMF0scS5lbGVtZW50c1s0XT1wWzFdLHEuZWxlbWVudHNbOF09cFsyXSxxLmVsZW1lbnRzWzEyXT0wLHEuZWxlbWVudHNbMV09b1swXSxxLmVsZW1lbnRzWzVdPW9bMV0scS5lbGVtZW50c1s5XT1vWzJdLHEuZWxlbWVudHNbMTNdPTAscS5lbGVtZW50c1syXT1tWzBdLHEuZWxlbWVudHNbNl09bVsxXSxxLmVsZW1lbnRzWzEwXT1tWzJdLHEuZWxlbWVudHNbMTRdPTAscS5lbGVtZW50c1szXT0wLHEuZWxlbWVudHNbN109MCxxLmVsZW1lbnRzWzExXT0wLHEuZWxlbWVudHNbMTVdPTEscT1xLm11bHRpcGx5KGIpLGIuZWxlbWVudHM9cS5lbGVtZW50cyxiLnRyYW5zbGF0ZSgtYywtZSwtZiksYn0pfSxcXFwiTWF0NDRcXFwiLFtdKSxhLk1hdDMzPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5sb2FkSWRlbnRpdHksW2FdKX0pLGIubG9hZElkZW50aXR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdfSl9LFxcXCJNYXQzM1xcXCIsW10pLGEuVmVjMz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYixjKXtjLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS54PWIsYS55PWMsYS56PWR9KSxjLl9fc3ViX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5WZWMzLFtiLngtYy54LGIueS1jLnksYi56LWMuel0pfSl9LFxcXCJWZWMzXFxcIixbXSksYS5jcm9zcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyl7cmV0dXJuIFNrLmFzc2VydHMuYXNzZXJ0KGIgaW5zdGFuY2VvZiBhLlZlYzMmJmMgaW5zdGFuY2VvZiBhLlZlYzMpLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlZlYzMsW2IueSpjLnotYi56KmMueSxiLnoqYy54LWIueCpjLnosYi54KmMueS1iLnkqYy54XSl9KSxhfTtcIixcInNyYy9saWIvd2ViZ2wvbWF0cml4NC5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5QSSxiPXt9LGM9bmV3IEZsb2F0MzJBcnJheSgzKSxkPW5ldyBGbG9hdDMyQXJyYXkoMyksZT1uZXcgRmxvYXQzMkFycmF5KDMpLGY9bmV3IEZsb2F0MzJBcnJheSg0KSxnPW5ldyBGbG9hdDMyQXJyYXkoNCksaD1uZXcgRmxvYXQzMkFycmF5KDQpLGk9bmV3IEZsb2F0MzJBcnJheSgxNiksaj1uZXcgRmxvYXQzMkFycmF5KDE2KSxrPW5ldyBGbG9hdDMyQXJyYXkoMTYpLGw9ZnVuY3Rpb24oYixjKXtmb3IodmFyIGE9TWF0aC5zcXJ0LGQ9MCxlPWMubGVuZ3RoLGY9MDtmPGU7KytmKWQrPWNbZl0qY1tmXTtpZihkPWEoZCksMWUtNTxkKWZvcih2YXIgZj0wO2Y8ZTsrK2YpYltmXT1jW2ZdL2Q7ZWxzZSBmb3IodmFyIGY9MDtmPGU7KytmKWJbZl09MDtyZXR1cm4gYn0sbT1mdW5jdGlvbihjLGQsYSl7cmV0dXJuIGNbMF09ZFsxXSphWzJdLWRbMl0qYVsxXSxjWzFdPWRbMl0qYVswXS1kWzBdKmFbMl0sY1syXT1kWzBdKmFbMV0tZFsxXSphWzBdLGN9LG49ZnVuY3Rpb24oYyxkLGEpe2Zvcih2YXIgYj1kLmxlbmd0aCxlPTA7ZTxiOysrZSljW2VdPWRbZV0tYVtlXTtyZXR1cm4gY30sbz1mdW5jdGlvbihjLGEpe3JldHVybiBjWzBdKmFbMF0rY1sxXSphWzFdK2NbMl0qYVsyXX07cmV0dXJuIGIubG9va0F0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGYsZyl7dmFyIGg9YyxpPWQsaj1sKGgsbihoLGIudixmLnYpKSxrPWwoaSxtKGksZy52LGopKSxwPW0oZSxqLGspLHE9YS52O3JldHVybiBxWzBdPWtbMF0scVsxXT1wWzBdLHFbMl09alswXSxxWzNdPTAscVs0XT1rWzFdLHFbNV09cFsxXSxxWzZdPWpbMV0scVs3XT0wLHFbOF09a1syXSxxWzldPXBbMl0scVsxMF09alsyXSxxWzExXT0wLHFbMTJdPS1vKGssYi52KSxxWzEzXT0tbyhwLGIudikscVsxNF09LW8oaixiLnYpLHFbMTVdPTEsYX0pLGIucGVyc3BlY3RpdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZCxlLGcpe3ZhciBoPU1hdGgudGFuLGk9aCguNSphLS41KihjKmEvMTgwKSksZj0xLyhlLWcpLGo9Yi52O3JldHVybiBqWzBdPWkvZCxqWzFdPTAsalsyXT0wLGpbM109MCxqWzRdPTAsals1XT1pLGpbNl09MCxqWzddPTAsals4XT0wLGpbOV09MCxqWzEwXT0oZStnKSpmLGpbMTFdPS0xLGpbMTJdPTAsalsxM109MCxqWzE0XT0yKihlKmcqZiksalsxNV09MCxifSksYi5yb3RhdGlvblk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGQpe3ZhciBlPU1hdGguc2luLGY9TWF0aC5jb3MsZz1iLnYsaD1mKGQqYS8xODApLGM9ZShkKmEvMTgwKTtyZXR1cm4gZ1swXT1oLGdbMV09MCxnWzJdPS1jLGdbM109MCxnWzRdPTAsZ1s1XT0xLGdbNl09MCxnWzddPTAsZ1s4XT1jLGdbOV09MCxnWzEwXT1oLGdbMTFdPTAsZ1sxMl09MCxnWzEzXT0wLGdbMTRdPTAsZ1sxNV09MSxifSksYi5pZGVudGl0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWEudjtyZXR1cm4gYlswXT0xLGJbMV09MCxiWzJdPTAsYlszXT0wLGJbNF09MCxiWzVdPTEsYls2XT0wLGJbN109MCxiWzhdPTAsYls5XT0wLGJbMTBdPTEsYlsxMV09MCxiWzEyXT0wLGJbMTNdPTAsYlsxNF09MCxiWzE1XT0xLGF9KSxiLm11bD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGMsZCxlKXt2YXIgZj1jLnYsZz1kLnYsYT1lLnYsYj1nWzBdLGg9Z1sxXSxpPWdbMl0saj1nWzNdLGs9Z1s0XSxsPWdbNV0sbT1nWzZdLG49Z1s3XSxvPWdbOF0scD1nWzldLHE9Z1sxMF0scj1nWzExXSxzPWdbMTJdLHQ9Z1sxM10sdT1nWzE0XSx2PWdbMTVdLHc9YVswXSx4PWFbMV0seT1hWzJdLHo9YVszXSxBPWFbNF0sQj1hWzVdLEM9YVs2XSxEPWFbN10sRT1hWzhdLEY9YVs5XSxHPWFbMTBdLEg9YVsxMV0sST1hWzEyXSxKPWFbMTNdLEs9YVsxNF0sTD1hWzE1XTtyZXR1cm4gZlswXT1iKncraCpBK2kqRStqKkksZlsxXT1iKngraCpCK2kqRitqKkosZlsyXT1iKnkraCpDK2kqRytqKkssZlszXT1iKnoraCpEK2kqSCtqKkwsZls0XT1rKncrbCpBK20qRStuKkksZls1XT1rKngrbCpCK20qRituKkosZls2XT1rKnkrbCpDK20qRytuKkssZls3XT1rKnorbCpEK20qSCtuKkwsZls4XT1vKncrcCpBK3EqRStyKkksZls5XT1vKngrcCpCK3EqRityKkosZlsxMF09byp5K3AqQytxKkcrcipLLGZbMTFdPW8qeitwKkQrcSpIK3IqTCxmWzEyXT1zKncrdCpBK3UqRSt2KkksZlsxM109cyp4K3QqQit1KkYrdipKLGZbMTRdPXMqeSt0KkMrdSpHK3YqSyxmWzE1XT1zKnordCpEK3UqSCt2KkwsY30pLGIuaW52ZXJ0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnYsZT1iLnYsZj1lWzBdLGc9ZVsxXSxoPWVbMl0saT1lWzNdLGo9ZVs0XSxrPWVbNV0sbD1lWzZdLG09ZVs3XSxuPWVbOF0sbz1lWzldLHA9ZVsxMF0scT1lWzExXSxyPWVbMTJdLHM9ZVsxM10sdD1lWzE0XSx1PWVbMTVdLHY9cCp1LHc9dCpxLHg9bCp1LHk9dCptLHo9bCpxLEE9cCptLEI9aCp1LEM9dCppLEQ9aCpxLEU9cCppLEY9aCptLEc9bCppLEg9bipzLEk9cipvLEo9aipzLEs9ciprLEw9aipvLE09biprLE49ZipzLE89cipnLFA9ZipvLFE9bipnLFI9ZiprLFM9aipnLFQ9diprK3kqbyt6KnMtKHcqayt4Km8rQSpzKSxVPXcqZytCKm8rRSpzLSh2KmcrQypvK0QqcyksVj14KmcrQyprK0Yqcy0oeSpnK0IqaytHKnMpLFc9QSpnK0QqaytHKm8tKHoqZytFKmsrRipvKSxYPTEvKGYqVCtqKlUrbipWK3IqVyk7cmV0dXJuIGNbMF09WCpULGNbMV09WCpVLGNbMl09WCpWLGNbM109WCpXLGNbNF09WCoodypqK3gqbitBKnItKHYqait5Km4reipyKSksY1s1XT1YKih2KmYrQypuK0Qqci0odypmK0IqbitFKnIpKSxjWzZdPVgqKHkqZitCKmorRypyLSh4KmYrQypqK0YqcikpLGNbN109WCooeipmK0UqaitGKm4tKEEqZitEKmorRypuKSksY1s4XT1YKihIKm0rSypxK0wqdS0oSSptK0oqcStNKnUpKSxjWzldPVgqKEkqaStOKnErUSp1LShIKmkrTypxK1AqdSkpLGNbMTBdPVgqKEoqaStPKm0rUip1LShLKmkrTiptK1MqdSkpLGNbMTFdPVgqKE0qaStQKm0rUypxLShMKmkrUSptK1IqcSkpLGNbMTJdPVgqKEoqcCtNKnQrSSpsLShMKnQrSCpsK0sqcCkpLGNbMTNdPVgqKFAqdCtIKmgrTypwLShOKnArUSp0K0kqaCkpLGNbMTRdPVgqKE4qbCtTKnQrSypoLShSKnQrSipoK08qbCkpLGNbMTVdPVgqKFIqcCtMKmgrUSpsLShQKmwrUypwK00qaCkpLGF9KSxiLnRyYW5zcG9zZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEudixkPWIudixlPTA7ND5lOysrZSlmb3IodmFyIGY9MDs0PmY7KytmKWNbNCplK2ZdPWRbNCpmK2VdO3JldHVybiBjfSksYn07XCIsXCJzcmMvbGliL3dlYmdsL21vZGVscy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ZnVuY3Rpb24oYSxjKXt2YXIgZD1jfHxnbC5BUlJBWV9CVUZGRVIsZT1nbC5jcmVhdGVCdWZmZXIoKTtpZih0aGlzLnRhcmdldD1kLHRoaXMuYnVmPWUsdGhpcy5zZXQoYSksdGhpcy5udW1Db21wb25lbnRzXz1hLm51bUNvbXBvbmVudHMsdGhpcy5udW1FbGVtZW50c189YS5udW1FbGVtZW50cyx0aGlzLnRvdGFsQ29tcG9uZW50c189dGhpcy5udW1Db21wb25lbnRzXyp0aGlzLm51bUVsZW1lbnRzXyxhLmJ1ZmZlciBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSl0aGlzLnR5cGVfPWdsLkZMT0FUO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5KXRoaXMudHlwZV89Z2wuVU5TSUdORURfQllURTtlbHNlIGlmKGEuYnVmZmVyIGluc3RhbmNlb2YgSW50OEFycmF5KXRoaXMudHlwZV89Z2wuX0JZVEU7ZWxzZSBpZihhLmJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KXRoaXMudHlwZV89Z2wuVU5TSUdORURfU0hPUlQ7ZWxzZSBpZihhLmJ1ZmZlciBpbnN0YW5jZW9mIEludDE2QXJyYXkpdGhpcy50eXBlXz1nbC5TSE9SVDtlbHNlIHRocm93XFxcInVuaGFuZGxlZCB0eXBlOlxcXCIrdHlwZW9mIGEuYnVmZmVyfTtyZXR1cm4gZC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGEpe2dsLmJpbmRCdWZmZXIodGhpcy50YXJnZXQsdGhpcy5idWYpLGdsLmJ1ZmZlckRhdGEodGhpcy50YXJnZXQsYS5idWZmZXIsZ2wuU1RBVElDX0RSQVcpfSxkLnByb3RvdHlwZS50eXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZV99LGQucHJvdG90eXBlLm51bUNvbXBvbmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5udW1Db21wb25lbnRzX30sZC5wcm90b3R5cGUubnVtRWxlbWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5udW1FbGVtZW50c199LGQucHJvdG90eXBlLnRvdGFsQ29tcG9uZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvdGFsQ29tcG9uZW50c199LGQucHJvdG90eXBlLmJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1Zn0sZC5wcm90b3R5cGUuc3RyaWRlPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGQucHJvdG90eXBlLm9mZnNldD1mdW5jdGlvbigpe3JldHVybiAwfSxjLk1vZGVsPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYyxmdW5jdGlvbihjLGUpe2UuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihjLGUsZixnKXtjLmJ1ZmZlcnM9e307dmFyIGg9ZnVuY3Rpb24oYSxlKXt2YXIgZj1cXFwiaW5kaWNlc1xcXCI9PWE/Z2wuRUxFTUVOVF9BUlJBWV9CVUZGRVI6Z2wuQVJSQVlfQlVGRkVSO2I9Yy5idWZmZXJzW2FdLGI/Yi5zZXQoZSk6Yj1uZXcgZChlLGYpLGMuYnVmZmVyc1thXT1ifTtmb3IoYSBpbiBmKWgoYSxmW2FdKTt2YXIgaT17fSxqPTA7Zm9yKHZhciBrIGluIGcpaVtrXT1qKys7Yy5tb2RlPWdsLlRSSUFOR0xFUyxjLnRleHR1cmVzPWcudixjLnRleHR1cmVVbml0cz1pLGMuc2hhZGVyPWV9KSxlLmRyYXdQcmVwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgZD1hLnNoYWRlcixlPWEuYnVmZmVycyxmPWEudGV4dHVyZXM7Zm9yKHZhciBnIGluIGM9U2suZmZpLnJlbWFwVG9KcyhjKSxTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZC51c2UsW2RdKSxlKXt2YXIgaD1lW2ddO2lmKFxcXCJpbmRpY2VzXFxcIj09ZylnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLGguYnVmZmVyKCkpO2Vsc2V7dmFyIGk9ZC5hdHRyaWJbZ107aSYmaShoKX19Zm9yKHZhciBqIGluIGYpe3ZhciBrPWEudGV4dHVyZVVuaXRzW2pdO2Quc2V0VW5pZm9ybSRpbXBsKGQsdGV4dHVlcixrKSxmW2pdLmJpbmRUb1VuaXQoayl9Zm9yKHZhciBsIGluIGMpZC5zZXRVbmlmb3JtJGltcGwoZCxsLGNbbF0pfSksZS5kcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWEuc2hhZGVyO2Zvcih1bmlmb3JtIGluIGM9U2suZmZpLnJlbWFwVG9KcyhjKSxjKWUuc2V0VW5pZm9ybSRpbXBsKGUsdW5pZm9ybSxjW3VuaWZvcm1dKTtpZihkKWZvcih2YXIgZiBpbiBkKXt2YXIgZz1hLnRleHR1cmVVbml0c1tmXTtlLnNldFVuaWZvcm0kaW1wbChlLGYsZyksZFtmXS5iaW5kVG9Vbml0KGcpfXZhciBoPWEuYnVmZmVycztnbC5kcmF3RWxlbWVudHMoYS5tb2RlLGguaW5kaWNlcy50b3RhbENvbXBvbmVudHMoKSxnbC5VTlNJR05FRF9TSE9SVCwwKX0pfSxcXFwiTW9kZWxcXFwiLFtdKSxjfTtcIixcInNyYy9saWIvd2ViZ2wvcHJpbWl0aXZlcy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e30sYj1mdW5jdGlvbihhLGIsYyl7Yz1jfHxcXFwiRmxvYXQzMkFycmF5XFxcIjt2YXIgZD13aW5kb3dbY107Yi5sZW5ndGg/KHRoaXMuYnVmZmVyPW5ldyBkKGIpLGI9dGhpcy5idWZmZXIubGVuZ3RoL2EsdGhpcy5jdXJzb3I9Yik6KHRoaXMuYnVmZmVyPW5ldyBkKGEqYiksdGhpcy5jdXJzb3I9MCksdGhpcy5udW1Db21wb25lbnRzPWEsdGhpcy5udW1FbGVtZW50cz1iLHRoaXMudHlwZT1jfTtyZXR1cm4gYi5wcm90b3R5cGUuc3RyaWRlPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGIucHJvdG90eXBlLm9mZnNldD1mdW5jdGlvbigpe3JldHVybiAwfSxiLnByb3RvdHlwZS5nZXRFbGVtZW50PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hKnRoaXMubnVtQ29tcG9uZW50cyxjPVtdLGQ9MDtkPHRoaXMubnVtQ29tcG9uZW50czsrK2QpYy5wdXNoKHRoaXMuYnVmZmVyW2IrZF0pO3JldHVybiBjfSxiLnByb3RvdHlwZS5zZXRFbGVtZW50PWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEqdGhpcy5udW1Db21wb25lbnRzLGQ9MDtkPHRoaXMubnVtQ29tcG9uZW50czsrK2QpdGhpcy5idWZmZXJbYytkXT1iW2RdfSxiLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBhPW5ldyBiKHRoaXMubnVtQ29tcG9uZW50cyx0aGlzLm51bUVsZW1lbnRzLHRoaXMudHlwZSk7cmV0dXJuIGEucHVzaEFycmF5KHRoaXMpLGF9LGIucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oYSl7dGhpcy5zZXRFbGVtZW50KHRoaXMuY3Vyc29yKyssYSl9LGIucHJvdG90eXBlLnB1c2hBcnJheT1mdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPGEubnVtRWxlbWVudHM7KytiKXRoaXMucHVzaChhLmdldEVsZW1lbnQoYikpfSxiLnByb3RvdHlwZS5wdXNoQXJyYXlXaXRoT2Zmc2V0PWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9MDtkPGEubnVtRWxlbWVudHM7KytkKXtjPWEuZ2V0RWxlbWVudChkKTtmb3IodmFyIGU9MDtlPGIubGVuZ3RoOysrZSljW2VdKz1iW2VdO3RoaXMucHVzaChjKX19LGIucHJvdG90eXBlLmNvbXB1dGVFeHRlbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPU1hdGgubWF4LGI9TWF0aC5taW4sYyxkPXRoaXMubnVtRWxlbWVudHMsZT10aGlzLm51bUNvbXBvbmVudHMsZj10aGlzLmdldEVsZW1lbnQoMCksZz10aGlzLmdldEVsZW1lbnQoMCksaD0xO2g8ZDsrK2gpe2M9dGhpcy5nZXRFbGVtZW50KGgpO2Zvcih2YXIgaT0wO2k8ZTsrK2kpZltpXT1iKGZbaV0sY1tpXSksZ1tpXT1hKGdbaV0sY1tpXSl9cmV0dXJue21pbjpmLG1heDpnfX0sYS5jcmVhdGVDdWJlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBjLGQ9W1szLDcsNSwxXSxbMCw0LDYsMl0sWzYsNywzLDJdLFswLDEsNSw0XSxbNSw3LDYsNF0sWzIsMywxLDBdXSxlPWEvMixnPVtbLWUsLWUsLWVdLFsrZSwtZSwtZV0sWy1lLCtlLC1lXSxbK2UsK2UsLWVdLFstZSwtZSwrZV0sWytlLC1lLCtlXSxbLWUsK2UsK2VdLFsrZSwrZSwrZV1dLGg9W1sxLDAsMF0sWy0xLDAsMF0sWzAsMSwwXSxbMCwtMSwwXSxbMCwwLDFdLFswLDAsLTFdXSxpPVtbMCwwXSxbMSwwXSxbMSwxXSxbMCwxXV0saj0yNCxrPW5ldyBiKDMsaiksbD1uZXcgYigzLGopLG09bmV3IGIoMixqKSxuPW5ldyBiKDMsMTIsXFxcIlVpbnQxNkFycmF5XFxcIiksbz0wOzY+bzsrK28pe2M9ZFtvXTtmb3IodmFyIHA9MDs0PnA7KytwKXt2YXIgcT1nW2NbcF1dLHI9aFtvXSxzPWlbcF07ay5wdXNoKHEpLGwucHVzaChyKSxtLnB1c2gocyl9dmFyIHQ9NCpvO24ucHVzaChbdCswLHQrMSx0KzJdKSxuLnB1c2goW3QrMCx0KzIsdCszXSl9cmV0dXJue3Bvc2l0aW9uOmssbm9ybWFsOmwsdGV4Q29vcmQ6bSxpbmRpY2VzOm59fSksYX07XCIsXCJzcmMvbGliL3doaWNoZGIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndoaWNoZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93c2dpcmVmL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3c2dpcmVmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveGRybGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ4ZHJsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInhtbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbC9kb20vX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRvbSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbC9ldHJlZS9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZXRyZWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvcGFyc2Vycy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGFyc2VycyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbC9zYXgvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNheCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieG1sbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1scnBjbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ4bWxycGNsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi96aXBmaWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ6aXBmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIn19IiwiKGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO3ZhciAkanNjb21wPSRqc2NvbXB8fHt9OyRqc2NvbXAuc2NvcGU9e307JGpzY29tcC5BU1NVTUVfRVM1PSExOyRqc2NvbXAuQVNTVU1FX05PX05BVElWRV9NQVA9ITE7JGpzY29tcC5BU1NVTUVfTk9fTkFUSVZFX1NFVD0hMTskanNjb21wLlNJTVBMRV9GUk9VTkRfUE9MWUZJTEw9ITE7JGpzY29tcC5kZWZpbmVQcm9wZXJ0eT0kanNjb21wLkFTU1VNRV9FUzV8fFwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihtLHEsYSl7bSE9QXJyYXkucHJvdG90eXBlJiZtIT1PYmplY3QucHJvdG90eXBlJiYobVtxXT1hLnZhbHVlKX07JGpzY29tcC5nZXRHbG9iYWw9ZnVuY3Rpb24obSl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09bT9tOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWwmJm51bGwhPWdsb2JhbD9nbG9iYWw6bX07JGpzY29tcC5nbG9iYWw9JGpzY29tcC5nZXRHbG9iYWwodGhpcyk7XG4kanNjb21wLnBvbHlmaWxsPWZ1bmN0aW9uKG0scSxhLGMpe2lmKHEpe2E9JGpzY29tcC5nbG9iYWw7bT1tLnNwbGl0KFwiLlwiKTtmb3IoYz0wO2M8bS5sZW5ndGgtMTtjKyspe3ZhciBiPW1bY107YiBpbiBhfHwoYVtiXT17fSk7YT1hW2JdfW09bVttLmxlbmd0aC0xXTtjPWFbbV07cT1xKGMpO3EhPWMmJm51bGwhPXEmJiRqc2NvbXAuZGVmaW5lUHJvcGVydHkoYSxtLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6cX0pfX07JGpzY29tcC5wb2x5ZmlsbChcIkFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1wiLGZ1bmN0aW9uKG0pe3JldHVybiBtP206ZnVuY3Rpb24obSxhKXt2YXIgYz10aGlzO2MgaW5zdGFuY2VvZiBTdHJpbmcmJihjPVN0cmluZyhjKSk7dmFyIGI9Yy5sZW5ndGg7YT1hfHwwO2ZvcigwPmEmJihhPU1hdGgubWF4KGErYiwwKSk7YTxiO2ErKyl7dmFyIGU9Y1thXTtpZihlPT09bXx8T2JqZWN0LmlzKGUsbSkpcmV0dXJuITB9cmV0dXJuITF9fSxcImVzN1wiLFwiZXMzXCIpO1xuJGpzY29tcC5vd25zPWZ1bmN0aW9uKG0scSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtLHEpfTskanNjb21wLnBvbHlmaWxsKFwiT2JqZWN0LmVudHJpZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0pe3ZhciBhPVtdLGM7Zm9yKGMgaW4gbSkkanNjb21wLm93bnMobSxjKSYmYS5wdXNoKFtjLG1bY11dKTtyZXR1cm4gYX19LFwiZXM4XCIsXCJlczNcIik7XG4kanNjb21wLmNoZWNrU3RyaW5nQXJncz1mdW5jdGlvbihtLHEsYSl7aWYobnVsbD09bSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlICd0aGlzJyB2YWx1ZSBmb3IgU3RyaW5nLnByb3RvdHlwZS5cIithK1wiIG11c3Qgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkXCIpO2lmKHEgaW5zdGFuY2VvZiBSZWdFeHApdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZpcnN0IGFyZ3VtZW50IHRvIFN0cmluZy5wcm90b3R5cGUuXCIrYStcIiBtdXN0IG5vdCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvblwiKTtyZXR1cm4gbStcIlwifTskanNjb21wLnN0cmluZ1BhZGRpbmc9ZnVuY3Rpb24obSxxKXttPXZvaWQgMCE9PW0/U3RyaW5nKG0pOlwiIFwiO3JldHVybiAwPHEmJm0/bS5yZXBlYXQoTWF0aC5jZWlsKHEvbS5sZW5ndGgpKS5zdWJzdHJpbmcoMCxxKTpcIlwifTtcbiRqc2NvbXAucG9seWZpbGwoXCJTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0XCIsZnVuY3Rpb24obSl7cmV0dXJuIG0/bTpmdW5jdGlvbihtLGEpe3ZhciBjPSRqc2NvbXAuY2hlY2tTdHJpbmdBcmdzKHRoaXMsbnVsbCxcInBhZFN0YXJ0XCIpO3JldHVybiAkanNjb21wLnN0cmluZ1BhZGRpbmcoYSxtLWMubGVuZ3RoKStjfX0sXCJlczhcIixcImVzM1wiKTskanNjb21wLnBvbHlmaWxsKFwiT2JqZWN0LnZhbHVlc1wiLGZ1bmN0aW9uKG0pe3JldHVybiBtP206ZnVuY3Rpb24obSl7dmFyIGE9W10sYztmb3IoYyBpbiBtKSRqc2NvbXAub3ducyhtLGMpJiZhLnB1c2gobVtjXSk7cmV0dXJuIGF9fSxcImVzOFwiLFwiZXMzXCIpOyRqc2NvbXAuYXJyYXlJdGVyYXRvckltcGw9ZnVuY3Rpb24obSl7dmFyIHE9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcTxtLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTptW3ErK119Ontkb25lOiEwfX19OyRqc2NvbXAuYXJyYXlJdGVyYXRvcj1mdW5jdGlvbihtKXtyZXR1cm57bmV4dDokanNjb21wLmFycmF5SXRlcmF0b3JJbXBsKG0pfX07XG4kanNjb21wLlNZTUJPTF9QUkVGSVg9XCJqc2NvbXBfc3ltYm9sX1wiOyRqc2NvbXAuaW5pdFN5bWJvbD1mdW5jdGlvbigpeyRqc2NvbXAuaW5pdFN5bWJvbD1mdW5jdGlvbigpe307JGpzY29tcC5nbG9iYWwuU3ltYm9sfHwoJGpzY29tcC5nbG9iYWwuU3ltYm9sPSRqc2NvbXAuU3ltYm9sKX07JGpzY29tcC5TeW1ib2xDbGFzcz1mdW5jdGlvbihtLHEpe3RoaXMuJGpzY29tcCRzeW1ib2wkaWRfPW07JGpzY29tcC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiZGVzY3JpcHRpb25cIix7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnF9KX07JGpzY29tcC5TeW1ib2xDbGFzcy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kanNjb21wJHN5bWJvbCRpZF99O1xuJGpzY29tcC5TeW1ib2w9ZnVuY3Rpb24oKXtmdW5jdGlvbiBtKGEpe2lmKHRoaXMgaW5zdGFuY2VvZiBtKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3JcIik7cmV0dXJuIG5ldyAkanNjb21wLlN5bWJvbENsYXNzKCRqc2NvbXAuU1lNQk9MX1BSRUZJWCsoYXx8XCJcIikrXCJfXCIrcSsrLGEpfXZhciBxPTA7cmV0dXJuIG19KCk7XG4kanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcj1mdW5jdGlvbigpeyRqc2NvbXAuaW5pdFN5bWJvbCgpO3ZhciBtPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5pdGVyYXRvcjttfHwobT0kanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3I9JGpzY29tcC5nbG9iYWwuU3ltYm9sKFwiU3ltYm9sLml0ZXJhdG9yXCIpKTtcImZ1bmN0aW9uXCIhPXR5cGVvZiBBcnJheS5wcm90b3R5cGVbbV0mJiRqc2NvbXAuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLG0se2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiAkanNjb21wLml0ZXJhdG9yUHJvdG90eXBlKCRqc2NvbXAuYXJyYXlJdGVyYXRvckltcGwodGhpcykpfX0pOyRqc2NvbXAuaW5pdFN5bWJvbEl0ZXJhdG9yPWZ1bmN0aW9uKCl7fX07XG4kanNjb21wLmluaXRTeW1ib2xBc3luY0l0ZXJhdG9yPWZ1bmN0aW9uKCl7JGpzY29tcC5pbml0U3ltYm9sKCk7dmFyIG09JGpzY29tcC5nbG9iYWwuU3ltYm9sLmFzeW5jSXRlcmF0b3I7bXx8KG09JGpzY29tcC5nbG9iYWwuU3ltYm9sLmFzeW5jSXRlcmF0b3I9JGpzY29tcC5nbG9iYWwuU3ltYm9sKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3JcIikpOyRqc2NvbXAuaW5pdFN5bWJvbEFzeW5jSXRlcmF0b3I9ZnVuY3Rpb24oKXt9fTskanNjb21wLml0ZXJhdG9yUHJvdG90eXBlPWZ1bmN0aW9uKG0peyRqc2NvbXAuaW5pdFN5bWJvbEl0ZXJhdG9yKCk7bT17bmV4dDptfTttWyRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307cmV0dXJuIG19O1xuJGpzY29tcC5pdGVyYXRvckZyb21BcnJheT1mdW5jdGlvbihtLHEpeyRqc2NvbXAuaW5pdFN5bWJvbEl0ZXJhdG9yKCk7bSBpbnN0YW5jZW9mIFN0cmluZyYmKG0rPVwiXCIpO3ZhciBhPTAsYz17bmV4dDpmdW5jdGlvbigpe2lmKGE8bS5sZW5ndGgpe3ZhciBiPWErKztyZXR1cm57dmFsdWU6cShiLG1bYl0pLGRvbmU6ITF9fWMubmV4dD1mdW5jdGlvbigpe3JldHVybntkb25lOiEwLHZhbHVlOnZvaWQgMH19O3JldHVybiBjLm5leHQoKX19O2NbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiBjfTtyZXR1cm4gY307JGpzY29tcC5wb2x5ZmlsbChcIkFycmF5LnByb3RvdHlwZS52YWx1ZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKCl7cmV0dXJuICRqc2NvbXAuaXRlcmF0b3JGcm9tQXJyYXkodGhpcyxmdW5jdGlvbihtLGEpe3JldHVybiBhfSl9fSxcImVzOFwiLFwiZXMzXCIpO1xuKGZ1bmN0aW9uKG0pe2Z1bmN0aW9uIHEoYyl7aWYoYVtjXSlyZXR1cm4gYVtjXS5leHBvcnRzO3ZhciBiPWFbY109e2k6YyxsOiExLGV4cG9ydHM6e319O21bY10uY2FsbChiLmV4cG9ydHMsYixiLmV4cG9ydHMscSk7Yi5sPSEwO3JldHVybiBiLmV4cG9ydHN9dmFyIGE9e307cS5tPW07cS5jPWE7cS5kPWZ1bmN0aW9uKGEsYixlKXtxLm8oYSxiKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7ZW51bWVyYWJsZTohMCxnZXQ6ZX0pfTtxLnI9ZnVuY3Rpb24oYSl7XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9O3EudD1mdW5jdGlvbihhLGIpe2ImMSYmKGE9cShhKSk7aWYoYiY4fHxiJjQmJlwib2JqZWN0XCI9PT10eXBlb2YgYSYmYSYmYS5fX2VzTW9kdWxlKXJldHVybiBhO1xudmFyIGM9T2JqZWN0LmNyZWF0ZShudWxsKTtxLnIoYyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsXCJkZWZhdWx0XCIse2VudW1lcmFibGU6ITAsdmFsdWU6YX0pO2lmKGImMiYmXCJzdHJpbmdcIiE9dHlwZW9mIGEpZm9yKHZhciBmIGluIGEpcS5kKGMsZixmdW5jdGlvbihiKXtyZXR1cm4gYVtiXX0uYmluZChudWxsLGYpKTtyZXR1cm4gY307cS5uPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJmEuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBhW1wiZGVmYXVsdFwiXX06ZnVuY3Rpb24oKXtyZXR1cm4gYX07cS5kKGIsXCJhXCIsYik7cmV0dXJuIGJ9O3Eubz1mdW5jdGlvbihhLGIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxiKX07cS5wPVwiXCI7cmV0dXJuIHEocS5zPTEpfSkoW2Z1bmN0aW9uKG0scSl7cT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtxPXF8fChuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSkoKX1jYXRjaChhKXtcIm9iamVjdFwiPT09XG50eXBlb2Ygd2luZG93JiYocT13aW5kb3cpfW0uZXhwb3J0cz1xfSxmdW5jdGlvbihtLHEsYSl7YSgyKTtTay5nbG9iYWwuc3RyZnRpbWU9YSgzKTtTay5nbG9iYWwuc3RycHRpbWU9YSg0KTthKDUpO2EoNyk7YSg5KTthKDEwKTthKDExKTthKDEyKTthKDEzKTthKDE0KTthKDE1KTthKDE2KTthKDE3KTthKDE4KTtbU2suYnVpbHRpbi5vYmplY3QsU2suYnVpbHRpbi50eXBlXS5mb3JFYWNoKGE9PntTay5hYnN0ci5zZXRVcFNsb3RzKGEpO1NrLmFic3RyLnNldFVwTWV0aG9kcyhhKTtTay5hYnN0ci5zZXRVcEdldFNldHMoYSl9KTthKDE5KTthKDIwKTthKDIxKTtbU2suYnVpbHRpbi5zdHIsU2suYnVpbHRpbi5ub25lLFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQsU2suYnVpbHRpbi5vYmplY3RdLmZvckVhY2goYT0+e2E9YS5wcm90b3R5cGU7YS5fX2RvY19fPWEuaGFzT3duUHJvcGVydHkoXCJ0cCRkb2NcIik/bmV3IFNrLmJ1aWx0aW4uc3RyKGEudHAkZG9jKTpTay5idWlsdGluLm5vbmUubm9uZSR9KTtcbmEoMjIpO2EoMjMpO2EoMjQpO2EoMjUpO2EoMjYpO2EoMjcpO2EoMjgpO2EoMjkpO2EoMzEpO2EoMzIpO2EoMzMpO2EoMzQpO2EoMzUpO2EoMzYpO2EoMzcpO2EoMzgpO2EoMzkpO2EoNDApO2EoNDEpO2EoNDIpO2EoNDMpO2EoNDQpO2EoNDUpO2EoNDYpO2EoNDcpO2EoNDgpO2EoNDkpO2EoNTApO2EoNTEpO2EoNTIpO2EoNTMpO2EoNTQpO2EoNTUpO2EoNTYpO2EoNTcpO2EoNTgpO2EoNTkpO2EoNjApO2EoNjEpO2EoNjIpO2EoNjMpO2EoNjQpO2EoNjUpfSxmdW5jdGlvbihtLHEsYSl7KGZ1bmN0aW9uKGEpe3ZhciBiPXtidWlsZDp7Z2l0aGFzaDpcIjM0ODQ3ZWM3NWNlMjEyNzQxMzkzODI3MjU4MDY1MDEwMDQ2MzI4MTlcIixkYXRlOlwiMjAyMS0wNi0wN1QxNTo0NjowMC44MDRaXCJ9fTtiLmdsb2JhbD1cInVuZGVmaW5lZFwiIT09dHlwZW9mIGE/YTpcInVuZGVmaW5lZFwiIT09dHlwZW9mIHNlbGY/c2VsZjpcInVuZGVmaW5lZFwiIT09dHlwZW9mIHdpbmRvdz93aW5kb3c6e307Yi5leHBvcnRTeW1ib2w9XG5mdW5jdGlvbihhLGMpe2E9YS5zcGxpdChcIi5cIik7dmFyIGU9Yi5nbG9iYWwsZjtmb3IoZj0wO2Y8YS5sZW5ndGgtMTtmKyspe3ZhciBkPWFbZl07ZT1lLmhhc093blByb3BlcnR5KGQpP2VbZF06ZVtkXT17fX1cInVuZGVmaW5lZFwiIT09dHlwZW9mIGMmJihkPWFbZl0sZVtkXT1jKX07Yi5pc0FycmF5TGlrZT1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIEFycmF5fHxhJiZhLmxlbmd0aCYmXCJudW1iZXJcIj09dHlwZW9mIGEubGVuZ3RoPyEwOiExfTtiLmpzX2JlYXV0aWZ5PWZ1bmN0aW9uKGEpe3JldHVybiBhfTtiLmV4cG9ydFN5bWJvbChcIlNrXCIsYik7Yi5leHBvcnRTeW1ib2woXCJTay5nbG9iYWxcIixiLmdsb2JhbCk7Yi5leHBvcnRTeW1ib2woXCJTay5idWlsZFwiLGIuYnVpbGQpO2IuZXhwb3J0U3ltYm9sKFwiU2suZXhwb3J0U3ltYm9sXCIsYi5leHBvcnRTeW1ib2wpO2IuZXhwb3J0U3ltYm9sKFwiU2suaXNBcnJheUxpa2VcIixiLmlzQXJyYXlMaWtlKTtiLmV4cG9ydFN5bWJvbChcIlNrLmpzX2JlYXV0aWZ5XCIsXG5iLmpzX2JlYXV0aWZ5KX0pLmNhbGwodGhpcyxhKDApKX0sZnVuY3Rpb24obSxxKXsoZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGssbixBKXtmdW5jdGlvbiBwKGEsZCxrLGcpe2Zvcih2YXIgeT1cIlwiLG49bnVsbCx2PSExLEw9YS5sZW5ndGgsRz0hMSxFPTA7RTxMO0UrKyl7dmFyIEE9YS5jaGFyQ29kZUF0KEUpO2lmKCEwPT09dilpZig0NT09PUEpbj1cIlwiO2Vsc2UgaWYoOTU9PT1BKW49XCIgXCI7ZWxzZSBpZig0OD09PUEpbj1cIjBcIjtlbHNlIGlmKDU4PT09QSlHJiZoKFwiW1dBUk5JTkddIGRldGVjdGVkIHVzZSBvZiB1bnN1cHBvcnRlZCAlOjogb3IgJTo6OiBtb2RpZmllcnMgdG8gc3RyZnRpbWVcIiksRz0hMDtlbHNle3N3aXRjaChBKXtjYXNlIDM3OnkrPVwiJVwiO2JyZWFrO2Nhc2UgNjU6eSs9ay5kYXlzW2QuZ2V0RGF5KCldO2JyZWFrO2Nhc2UgNjY6eSs9ay5tb250aHNbZC5nZXRNb250aCgpXTticmVhaztjYXNlIDY3OnkrPWMoTWF0aC5mbG9vcihkLmdldEZ1bGxZZWFyKCkvMTAwKSxuKTtcbmJyZWFrO2Nhc2UgNjg6eSs9cChrLmZvcm1hdHMuRCxkLGssZyk7YnJlYWs7Y2FzZSA3MDp5Kz1wKGsuZm9ybWF0cy5GLGQsayxnKTticmVhaztjYXNlIDcyOnkrPWMoZC5nZXRIb3VycygpLG4pO2JyZWFrO2Nhc2UgNzM6eSs9YyhlKGQuZ2V0SG91cnMoKSksbik7YnJlYWs7Y2FzZSA3Njp5Kz1iKE1hdGguZmxvb3IoZyUxRTMpKTticmVhaztjYXNlIDc3OnkrPWMoZC5nZXRNaW51dGVzKCksbik7YnJlYWs7Y2FzZSA4MDp5Kz0xMj5kLmdldEhvdXJzKCk/ay5hbTprLnBtO2JyZWFrO2Nhc2UgODI6eSs9cChrLmZvcm1hdHMuUixkLGssZyk7YnJlYWs7Y2FzZSA4Mzp5Kz1jKGQuZ2V0U2Vjb25kcygpLG4pO2JyZWFrO2Nhc2UgODQ6eSs9cChrLmZvcm1hdHMuVCxkLGssZyk7YnJlYWs7Y2FzZSA4NTp5Kz1jKGYoZCxcInN1bmRheVwiKSxuKTticmVhaztjYXNlIDg3OnkrPWMoZihkLFwibW9uZGF5XCIpLG4pO2JyZWFrO2Nhc2UgODg6eSs9cChrLmZvcm1hdHMuWCxkLGssZyk7YnJlYWs7Y2FzZSA4OTp5Kz1cbmQuZ2V0RnVsbFllYXIoKTticmVhaztjYXNlIDkwOkQmJjA9PT1CP3krPVwiR01UXCI6KG49ZC50b1N0cmluZygpLm1hdGNoKC9cXCgoW1xcd1xcc10rKVxcKS8pLHkrPW4mJm5bMV18fFwiXCIpO2JyZWFrO2Nhc2UgOTc6eSs9ay5zaG9ydERheXNbZC5nZXREYXkoKV07YnJlYWs7Y2FzZSA5ODp5Kz1rLnNob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07YnJlYWs7Y2FzZSA5OTp5Kz1wKGsuZm9ybWF0cy5jLGQsayxnKTticmVhaztjYXNlIDEwMDp5Kz1jKGQuZ2V0RGF0ZSgpLG4pO2JyZWFrO2Nhc2UgMTAxOnkrPWMoZC5nZXREYXRlKCksbnVsbD09bj9cIiBcIjpuKTticmVhaztjYXNlIDEwNDp5Kz1rLnNob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07YnJlYWs7Y2FzZSAxMDY6bj1uZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksMCwxKTtuPU1hdGguY2VpbCgoZC5nZXRUaW1lKCktbi5nZXRUaW1lKCkpLzg2NEU1KTt5Kz1iKG4pO2JyZWFrO2Nhc2UgMTA3OnkrPWMoZC5nZXRIb3VycygpLG51bGw9PW4/XCIgXCI6bik7XG5icmVhaztjYXNlIDEwODp5Kz1jKGUoZC5nZXRIb3VycygpKSxudWxsPT1uP1wiIFwiOm4pO2JyZWFrO2Nhc2UgMTA5OnkrPWMoZC5nZXRNb250aCgpKzEsbik7YnJlYWs7Y2FzZSAxMTA6eSs9XCJcXG5cIjticmVhaztjYXNlIDExMTpuPWQuZ2V0RGF0ZSgpO3k9ay5vcmRpbmFsU3VmZml4ZXM/eSsoU3RyaW5nKG4pKyhrLm9yZGluYWxTdWZmaXhlc1tuLTFdfHxsKG4pKSk6eSsoU3RyaW5nKG4pK2wobikpO2JyZWFrO2Nhc2UgMTEyOnkrPTEyPmQuZ2V0SG91cnMoKT9rLkFNOmsuUE07YnJlYWs7Y2FzZSAxMTQ6eSs9cChrLmZvcm1hdHMucixkLGssZyk7YnJlYWs7Y2FzZSAxMTU6eSs9TWF0aC5mbG9vcihnLzFFMyk7YnJlYWs7Y2FzZSAxMTY6eSs9XCJcXHRcIjticmVhaztjYXNlIDExNzpuPWQuZ2V0RGF5KCk7eSs9MD09PW4/NzpuO2JyZWFrO2Nhc2UgMTE4OnkrPXAoay5mb3JtYXRzLnYsZCxrLGcpO2JyZWFrO2Nhc2UgMTE5OnkrPWQuZ2V0RGF5KCk7YnJlYWs7Y2FzZSAxMjA6eSs9cChrLmZvcm1hdHMueCxcbmQsayxnKTticmVhaztjYXNlIDEyMTp5Kz0oXCJcIitkLmdldEZ1bGxZZWFyKCkpLnNsaWNlKDIpO2JyZWFrO2Nhc2UgMTIyOkQmJjA9PT1CP3krPUc/XCIrMDA6MDBcIjpcIiswMDAwXCI6KG49MCE9PUI/Qi82RTQ6LWQuZ2V0VGltZXpvbmVPZmZzZXQoKSx2PUc/XCI6XCI6XCJcIixBPU1hdGguYWJzKG4lNjApLHkrPSgwPm4/XCItXCI6XCIrXCIpK2MoTWF0aC5mbG9vcihNYXRoLmFicyhuLzYwKSkpK3YrYyhBKSk7YnJlYWs7ZGVmYXVsdDp2JiYoeSs9XCIlXCIpLHkrPWFbRV19bj1udWxsO3Y9ITF9ZWxzZSAzNz09PUE/dj0hMDp5Kz1hW0VdfXJldHVybiB5fXZhciB2PWt8fGcsQj1ufHwwLEQ9QXx8ITEsRT0wLHUsbT1mdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBkPWIuZ2V0VGltZSgpO2lmKEQpe3ZhciBjPTZFNCooYi5nZXRUaW1lem9uZU9mZnNldCgpfHwwKTtiPW5ldyBEYXRlKGQrYytCKTs2RTQqKGIuZ2V0VGltZXpvbmVPZmZzZXQoKXx8MCkhPT1jJiYoYj02RTQqKGIuZ2V0VGltZXpvbmVPZmZzZXQoKXx8XG4wKSxiPW5ldyBEYXRlKGQrYitCKSl9fWVsc2UgZD1EYXRlLm5vdygpLGQ+RT8oRT1kLHU9bmV3IERhdGUoRSksZD1FLEQmJih1PW5ldyBEYXRlKEUrNkU0Kih1LmdldFRpbWV6b25lT2Zmc2V0KCl8fDApK0IpKSk6ZD1FLGI9dTtyZXR1cm4gcChhLGIsdixkKX07bS5sb2NhbGl6ZT1mdW5jdGlvbihiKXtyZXR1cm4gbmV3IGEoYnx8dixCLEQpfTttLmxvY2FsaXplQnlJZGVudGlmaWVyPWZ1bmN0aW9uKGEpe3ZhciBiPWRbYV07cmV0dXJuIGI/bS5sb2NhbGl6ZShiKTooaCgnW1dBUk5JTkddIE5vIGxvY2FsZSBmb3VuZCB3aXRoIGlkZW50aWZpZXIgXCInK2ErJ1wiLicpLG0pfTttLnRpbWV6b25lPWZ1bmN0aW9uKGIpe3ZhciBkPUIsYz1ELGU9dHlwZW9mIGI7aWYoXCJudW1iZXJcIj09PWV8fFwic3RyaW5nXCI9PT1lKWM9ITAsXCJzdHJpbmdcIj09PWU/KGQ9XCItXCI9PT1iWzBdPy0xOjEsZT1wYXJzZUludChiLnNsaWNlKDEsMyksMTApLGI9cGFyc2VJbnQoYi5zbGljZSgzLDUpLDEwKSxkPWQqKDYwKlxuZStiKSo2RTQpOlwibnVtYmVyXCI9PT1lJiYoZD02RTQqYik7cmV0dXJuIG5ldyBhKHYsZCxjKX07bS51dGM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGEodixCLCEwKX07cmV0dXJuIG19ZnVuY3Rpb24gYyhhLGIpe2lmKFwiXCI9PT1ifHw5PGEpcmV0dXJuIGE7bnVsbD09YiYmKGI9XCIwXCIpO3JldHVybiBiK2F9ZnVuY3Rpb24gYihhKXtyZXR1cm4gOTk8YT9hOjk8YT9cIjBcIithOlwiMDBcIithfWZ1bmN0aW9uIGUoYSl7cmV0dXJuIDA9PT1hPzEyOjEyPGE/YS0xMjphfWZ1bmN0aW9uIGYoYSxiKXtiPWJ8fFwic3VuZGF5XCI7dmFyIGQ9YS5nZXREYXkoKTtcIm1vbmRheVwiPT09YiYmKDA9PT1kP2Q9NjpkLS0pO2I9RGF0ZS5VVEMoYS5nZXRGdWxsWWVhcigpLDAsMSk7YT1EYXRlLlVUQyhhLmdldEZ1bGxZZWFyKCksYS5nZXRNb250aCgpLGEuZ2V0RGF0ZSgpKTtyZXR1cm4gTWF0aC5mbG9vcigoTWF0aC5mbG9vcigoYS1iKS84NjRFNSkrNy1kKS83KX1mdW5jdGlvbiBsKGEpe3ZhciBiPWElMTA7YSU9MTAwO1xuaWYoMTE8PWEmJjEzPj1hfHwwPT09Ynx8NDw9YilyZXR1cm5cInRoXCI7c3dpdGNoKGIpe2Nhc2UgMTpyZXR1cm5cInN0XCI7Y2FzZSAyOnJldHVyblwibmRcIjtjYXNlIDM6cmV0dXJuXCJyZFwifX1mdW5jdGlvbiBoKGEpe1widW5kZWZpbmVkXCIhPT10eXBlb2YgY29uc29sZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oYSl9dmFyIGQ9e2RlX0RFOntkYXlzOlwiU29ubnRhZyBNb250YWcgRGllbnN0YWcgTWl0dHdvY2ggRG9ubmVyc3RhZyBGcmVpdGFnIFNhbXN0YWdcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiU28gTW8gRGkgTWkgRG8gRnIgU2FcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiSmFudWFyIEZlYnJ1YXIgTVxcdTAwZTRyeiBBcHJpbCBNYWkgSnVuaSBKdWxpIEF1Z3VzdCBTZXB0ZW1iZXIgT2t0b2JlciBOb3ZlbWJlciBEZXplbWJlclwiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIkphbiBGZWIgTVxcdTAwZTRyIEFwciBNYWkgSnVuIEp1bCBBdWcgU2VwIE9rdCBOb3YgRGV6XCIuc3BsaXQoXCIgXCIpLFxuQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC4lbS4lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0sZW5fQ0E6e2RheXM6XCJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheVwiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJTdW4gTW9uIFR1ZSBXZWQgVGh1IEZyaSBTYXRcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiSmFudWFyeSBGZWJydWFyeSBNYXJjaCBBcHJpbCBNYXkgSnVuZSBKdWx5IEF1Z3VzdCBTZXB0ZW1iZXIgT2N0b2JlciBOb3ZlbWJlciBEZWNlbWJlclwiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLG9yZGluYWxTdWZmaXhlczpcInN0IG5kIHJkIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHN0IG5kIHJkIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHN0XCIuc3BsaXQoXCIgXCIpLFxuQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlclwiLHg6XCIlRFwifX0sZW5fVVM6e2RheXM6XCJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheVwiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJTdW4gTW9uIFR1ZSBXZWQgVGh1IEZyaSBTYXRcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiSmFudWFyeSBGZWJydWFyeSBNYXJjaCBBcHJpbCBNYXkgSnVuZSBKdWx5IEF1Z3VzdCBTZXB0ZW1iZXIgT2N0b2JlciBOb3ZlbWJlciBEZWNlbWJlclwiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLG9yZGluYWxTdWZmaXhlczpcInN0IG5kIHJkIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHN0IG5kIHJkIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHN0XCIuc3BsaXQoXCIgXCIpLFxuQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlbS8lZC8leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlclwiLHg6XCIlRFwifX0sZXNfTVg6e2RheXM6XCJkb21pbmdvIGx1bmVzIG1hcnRlcyBtaVxcdTAwZTlyY29sZXMganVldmVzIHZpZXJuZXMgc1xcdTAwZTFiYWRvXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcImRvbSBsdW4gbWFyIG1pXFx1MDBlOSBqdWUgdmllIHNcXHUwMGUxYlwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJlbmVybztmZWJyZXJvO21hcnpvO2FicmlsO21heW87anVuaW87anVsaW87YWdvc3RvO3NlcHRpZW1icmU7b2N0dWJyZTtub3ZpZW1icmU7IGRpY2llbWJyZVwiLnNwbGl0KFwiO1wiKSxzaG9ydE1vbnRoczpcImVuZSBmZWIgbWFyIGFiciBtYXkganVuIGp1bCBhZ28gc2VwIG9jdCBub3YgZGljXCIuc3BsaXQoXCIgXCIpLEFNOlwiQU1cIixQTTpcIlBNXCIsXG5hbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0sZnJfRlI6e2RheXM6XCJkaW1hbmNoZSBsdW5kaSBtYXJkaSBtZXJjcmVkaSBqZXVkaSB2ZW5kcmVkaSBzYW1lZGlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiZGltLiBsdW4uIG1hci4gbWVyLiBqZXUuIHZlbi4gc2FtLlwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW52aWVyIGZcXHUwMGU5dnJpZXIgbWFycyBhdnJpbCBtYWkganVpbiBqdWlsbGV0IGFvXFx1MDBmYnQgc2VwdGVtYnJlIG9jdG9icmUgbm92ZW1icmUgZFxcdTAwZTljZW1icmVcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJqYW52LiBmXFx1MDBlOXZyLiBtYXJzIGF2cmlsIG1haSBqdWluIGp1aWwuIGFvXFx1MDBmYnQgc2VwdC4gb2N0LiBub3YuIGRcXHUwMGU5Yy5cIi5zcGxpdChcIiBcIiksQU06XCJBTVwiLFxuUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsRDpcIiVkLyVtLyVZXCIsRjpcIiVZLSVtLSVkXCIsUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSxpdF9JVDp7ZGF5czpcImRvbWVuaWNhIGx1bmVkXFx1MDBlYyBtYXJ0ZWRcXHUwMGVjIG1lcmNvbGVkXFx1MDBlYyBnaW92ZWRcXHUwMGVjIHZlbmVyZFxcdTAwZWMgc2FiYXRvXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcImRvbSBsdW4gbWFyIG1lciBnaW8gdmVuIHNhYlwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJnZW5uYWlvIGZlYmJyYWlvIG1hcnpvIGFwcmlsZSBtYWdnaW8gZ2l1Z25vIGx1Z2xpbyBhZ29zdG8gc2V0dGVtYnJlIG90dG9icmUgbm92ZW1icmUgZGljZW1icmVcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJwciBtYWcgZ2l1IGx1ZyBhZ28gc2V0IG90dCBub3YgZGljXCIuc3BsaXQoXCIgXCIpLEFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLFxucG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0sbmxfTkw6e2RheXM6XCJ6b25kYWcgbWFhbmRhZyBkaW5zZGFnIHdvZW5zZGFnIGRvbmRlcmRhZyB2cmlqZGFnIHphdGVyZGFnXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcInpvIG1hIGRpIHdvIGRvIHZyIHphXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcImphbnVhcmkgZmVicnVhcmkgbWFhcnQgYXByaWwgbWVpIGp1bmkganVsaSBhdWd1c3R1cyBzZXB0ZW1iZXIgb2t0b2JlciBub3ZlbWJlciBkZWNlbWJlclwiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcImphbiBmZWIgbXJ0IGFwciBtZWkganVuIGp1bCBhdWcgc2VwIG9rdCBub3YgZGVjXCIuc3BsaXQoXCIgXCIpLEFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixcbkQ6XCIlZC0lbS0leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0scHRfQlI6e2RheXM6XCJkb21pbmdvIHNlZ3VuZGEgdGVyXFx1MDBlN2EgcXVhcnRhIHF1aW50YSBzZXh0YSBzXFx1MDBlMWJhZG9cIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiRG9tIFNlZyBUZXIgUXVhIFF1aSBTZXggU1xcdTAwZTFiXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcImphbmVpcm8gZmV2ZXJlaXJvIG1hclxcdTAwZTdvIGFicmlsIG1haW8ganVuaG8ganVsaG8gYWdvc3RvIHNldGVtYnJvIG91dHVicm8gbm92ZW1icm8gZGV6ZW1icm9cIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmV2IE1hciBBYnIgTWFpIEp1biBKdWwgQWdvIFNldCBPdXQgTm92IERlelwiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsRDpcIiVkLSVtLSVZXCIsRjpcIiVZLSVtLSVkXCIsXG5SOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LHJ1X1JVOntkYXlzOlwiXFx1MDQxMlxcdTA0M2VcXHUwNDQxXFx1MDQzYVxcdTA0NDBcXHUwNDM1XFx1MDQ0MVxcdTA0MzVcXHUwNDNkXFx1MDQ0Y1xcdTA0MzUgXFx1MDQxZlxcdTA0M2VcXHUwNDNkXFx1MDQzNVxcdTA0MzRcXHUwNDM1XFx1MDQzYlxcdTA0NGNcXHUwNDNkXFx1MDQzOFxcdTA0M2EgXFx1MDQxMlxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0M2RcXHUwNDM4XFx1MDQzYSBcXHUwNDIxXFx1MDQ0MFxcdTA0MzVcXHUwNDM0XFx1MDQzMCBcXHUwNDI3XFx1MDQzNVxcdTA0NDJcXHUwNDMyXFx1MDQzNVxcdTA0NDBcXHUwNDMzIFxcdTA0MWZcXHUwNDRmXFx1MDQ0MlxcdTA0M2RcXHUwNDM4XFx1MDQ0NlxcdTA0MzAgXFx1MDQyMVxcdTA0NDNcXHUwNDMxXFx1MDQzMVxcdTA0M2VcXHUwNDQyXFx1MDQzMFwiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJcXHUwNDEyXFx1MDQ0MSBcXHUwNDFmXFx1MDQzZCBcXHUwNDEyXFx1MDQ0MiBcXHUwNDIxXFx1MDQ0MCBcXHUwNDI3XFx1MDQ0MiBcXHUwNDFmXFx1MDQ0MiBcXHUwNDIxXFx1MDQzMVwiLnNwbGl0KFwiIFwiKSxcbm1vbnRoczpcIlxcdTA0MmZcXHUwNDNkXFx1MDQzMlxcdTA0MzBcXHUwNDQwXFx1MDQ0YyBcXHUwNDI0XFx1MDQzNVxcdTA0MzJcXHUwNDQwXFx1MDQzMFxcdTA0M2JcXHUwNDRjIFxcdTA0MWNcXHUwNDMwXFx1MDQ0MFxcdTA0NDIgXFx1MDQxMFxcdTA0M2ZcXHUwNDQwXFx1MDQzNVxcdTA0M2JcXHUwNDRjIFxcdTA0MWNcXHUwNDMwXFx1MDQzOSBcXHUwNDE4XFx1MDQ0ZVxcdTA0M2RcXHUwNDRjIFxcdTA0MThcXHUwNDRlXFx1MDQzYlxcdTA0NGMgXFx1MDQxMFxcdTA0MzJcXHUwNDMzXFx1MDQ0M1xcdTA0NDFcXHUwNDQyIFxcdTA0MjFcXHUwNDM1XFx1MDQzZFxcdTA0NDJcXHUwNDRmXFx1MDQzMVxcdTA0NDBcXHUwNDRjIFxcdTA0MWVcXHUwNDNhXFx1MDQ0MlxcdTA0NGZcXHUwNDMxXFx1MDQ0MFxcdTA0NGMgXFx1MDQxZFxcdTA0M2VcXHUwNDRmXFx1MDQzMVxcdTA0NDBcXHUwNDRjIFxcdTA0MTRcXHUwNDM1XFx1MDQzYVxcdTA0MzBcXHUwNDMxXFx1MDQ0MFxcdTA0NGNcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJcXHUwNDRmXFx1MDQzZFxcdTA0MzIgXFx1MDQ0NFxcdTA0MzVcXHUwNDMyIFxcdTA0M2NcXHUwNDMwXFx1MDQ0MCBcXHUwNDMwXFx1MDQzZlxcdTA0NDAgXFx1MDQzY1xcdTA0MzBcXHUwNDM5IFxcdTA0MzhcXHUwNDRlXFx1MDQzZCBcXHUwNDM4XFx1MDQ0ZVxcdTA0M2IgXFx1MDQzMFxcdTA0MzJcXHUwNDMzIFxcdTA0NDFcXHUwNDM1XFx1MDQzZCBcXHUwNDNlXFx1MDQzYVxcdTA0NDIgXFx1MDQzZFxcdTA0M2VcXHUwNDRmIFxcdTA0MzRcXHUwNDM1XFx1MDQzYVwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVhcIixEOlwiJWQuJW0uJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LHRyX1RSOntkYXlzOlwiUGF6YXIgUGF6YXJ0ZXNpIFNhbFxcdTAxMzEgXFx1MDBjN2FyXFx1MDE1ZmFtYmEgUGVyXFx1MDE1ZmVtYmUgQ3VtYSBDdW1hcnRlc2lcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiUGF6IFB6dCBTYWwgXFx1MDBjN3JcXHUwMTVmIFByXFx1MDE1ZiBDdW0gQ3RzXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIk9jYWsgXFx1MDE1ZXViYXQgTWFydCBOaXNhbiBNYXlcXHUwMTMxcyBIYXppcmFuIFRlbW11eiBBXFx1MDExZnVzdG9zIEV5bFxcdTAwZmNsIEVraW0gS2FzXFx1MDEzMW0gQXJhbFxcdTAxMzFrXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiT2NhIFxcdTAxNWV1YiBNYXIgTmlzIE1heSBIYXogVGVtIEFcXHUwMTFmdSBFeWwgRWtpIEthcyBBcmFcIi5zcGxpdChcIiBcIiksXG5BTTpcIlxcdTAwZDZcXHUwMGQ2XCIsUE06XCJcXHUwMGQ2U1wiLGFtOlwiXFx1MDBkNlxcdTAwZDZcIixwbTpcIlxcdTAwZDZTXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsRDpcIiVkLSVtLSVZXCIsRjpcIiVZLSVtLSVkXCIsUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSx6aF9DTjp7ZGF5czpcIlxcdTY2MWZcXHU2NzFmXFx1NjVlNSBcXHU2NjFmXFx1NjcxZlxcdTRlMDAgXFx1NjYxZlxcdTY3MWZcXHU0ZThjIFxcdTY2MWZcXHU2NzFmXFx1NGUwOSBcXHU2NjFmXFx1NjcxZlxcdTU2ZGIgXFx1NjYxZlxcdTY3MWZcXHU0ZTk0IFxcdTY2MWZcXHU2NzFmXFx1NTE2ZFwiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJcXHU2NWU1XFx1NGUwMFxcdTRlOGNcXHU0ZTA5XFx1NTZkYlxcdTRlOTRcXHU1MTZkXCIuc3BsaXQoXCJcIiksbW9udGhzOlwiXFx1NGUwMFxcdTY3MDhcXHU0ZWZkIFxcdTRlOGNcXHU2NzA4XFx1NGVmZCBcXHU0ZTA5XFx1NjcwOFxcdTRlZmQgXFx1NTZkYlxcdTY3MDhcXHU0ZWZkIFxcdTRlOTRcXHU2NzA4XFx1NGVmZCBcXHU1MTZkXFx1NjcwOFxcdTRlZmQgXFx1NGUwM1xcdTY3MDhcXHU0ZWZkIFxcdTUxNmJcXHU2NzA4XFx1NGVmZCBcXHU0ZTVkXFx1NjcwOFxcdTRlZmQgXFx1NTM0MVxcdTY3MDhcXHU0ZWZkIFxcdTUzNDFcXHU0ZTAwXFx1NjcwOFxcdTRlZmQgXFx1NTM0MVxcdTRlOGNcXHU2NzA4XFx1NGVmZFwiLnNwbGl0KFwiIFwiKSxcbnNob3J0TW9udGhzOlwiXFx1NGUwMFxcdTY3MDggXFx1NGU4Y1xcdTY3MDggXFx1NGUwOVxcdTY3MDggXFx1NTZkYlxcdTY3MDggXFx1NGU5NFxcdTY3MDggXFx1NTE2ZFxcdTY3MDggXFx1NGUwM1xcdTY3MDggXFx1NTE2YlxcdTY3MDggXFx1NGU1ZFxcdTY3MDggXFx1NTM0MVxcdTY3MDggXFx1NTM0MVxcdTRlMDBcXHU2NzA4IFxcdTUzNDFcXHU0ZThjXFx1NjcwOFwiLnNwbGl0KFwiIFwiKSxBTTpcIlxcdTRlMGFcXHU1MzQ4XCIsUE06XCJcXHU0ZTBiXFx1NTM0OFwiLGFtOlwiXFx1NGUwYVxcdTUzNDhcIixwbTpcIlxcdTRlMGJcXHU1MzQ4XCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsRDpcIiVkLyVtLyV5XCIsRjpcIiVZLSVtLSVkXCIsUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVyXCIseDpcIiVEXCJ9fX0sZz1kLmVuX1VTLG49bmV3IGEoZywwLCExKTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIG0pdmFyIGs9bS5leHBvcnRzPW47ZWxzZSBrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN8fCgwLGV2YWwpKFwidGhpc1wiKX0oKSxcbmsuc3RyZnRpbWU9bjtcImZ1bmN0aW9uXCIhPT10eXBlb2YgRGF0ZS5ub3cmJihEYXRlLm5vdz1mdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX0pfSkoKX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbigpe3ZhciBhPWZ1bmN0aW9uKGIsYyxmKXtyZXR1cm4gYS5wYXJzZShiLGMsZil9O2EudmVyc2lvbj1cIjAuMC4xXCI7KG0uZXhwb3J0cz1hKS5zdHJwdGltZT1hO2EubG9jYWxlPXthOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLEE6XCJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheVwiLnNwbGl0KFwiIFwiKSxiOlwiSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWNcIi5zcGxpdChcIiBcIiksQjpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksZjpcIkphbi4gRmViLiBNYXIuIEFwci4gTWF5IEp1bi4gSnVsLiBBdWcuIFNlcC4gT2N0LiBOb3YuIERlYy5cIi5zcGxpdChcIiBcIiksXG5jOlwiJVktJW0tJWQgJUg6JU06JVNcIixQOltcImFtXCIsXCJwbVwiXSxyOlwiJUk6JU06JVMgJXBcIix4OlwiJW0vJWQvJXlcIixYOlwiJUg6JU06JVNcIixkYXk6W1wiWWVzdGVyZGF5XCIsXCJUb2RheVwiLFwiVG9tb3Jyb3dcIl0sYmc6XCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlY1wiLnNwbGl0KFwiIFwiKSxCZzpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksZmc6XCJKYW4uIEZlYi4gTWFyLiBBcHIuIE1heSBKdW4uIEp1bC4gQXVnLiBTZXAuIE9jdC4gTm92LiBEZWMuXCIuc3BsaXQoXCIgXCIpLERhdGVfZEJZX3llYXJfaW5fSE06XCIlI0IgJS1kLCAlWSBhdCAlLUg6JU1cIixEYXRlX2RCWV95ZWFyOlwiJSNCICUtZCwgJVlcIixEYXRlX2RCWTpcIiUjQiAlLWQsICVZXCIsRGF0ZV9BZEJZOlwiJUEsICUjQiAlLWQsICVZXCIsRGF0ZV9kQkE6XCIlI0IgJS1kLCAlQVwiLFxuRGF0ZV9kZl9pbl9ITTpcIiUjZiwgJS1kIGF0ICUtSDolTVwiLERhdGVfZGZZOlwiJS1kICUjZiAlWVwiLERhdGVfZEJfaW5fSE06XCIlI0IgJS1kIGF0ICUtSDolTVwiLERhdGVfZGY6XCIlLWQgJSNmXCJ9OyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYyxlLGYsaCxsKXtjPVN0cmluZyhjKTtlPVN0cmluZyhlKTtjPWMucmVwbGFjZSgvXlsjXzBcXF5cXC0hfl0rLyxcIlwiKTtmPWRbY107aWYoIWYpcmV0dXJuIGE7dmFyIGs9ITE7LTE9PT1lLmluZGV4T2YoXCIhXCIpJiYxPT09Yy5sZW5ndGgmJigtMTxlLmluZGV4T2YoXCJ+XCIpfHwtMTxcImJCZlwiLmluZGV4T2YoYykmJi8lWzBcXC1fXT9kW1xcc10rJC8udGVzdChsLnN1YnN0cigwLGgpKSkmJihrPSEwKTtpZigoXCJJXCI9PT1jfHxcImxcIj09PWMpJiYhLyVbcFBdLy50ZXN0KGwpKXRocm93IEVycm9yKFwiVW5kZWZpbmVkIEFNL1BNXCIpO3N3aXRjaCh0eXBlb2YgZil7Y2FzZSBcImZ1bmN0aW9uXCI6cmV0dXJuIGYoKTtjYXNlIFwic3RyaW5nXCI6cmV0dXJuIGY7Y2FzZSBcIm9iamVjdFwiOnJldHVybiBiLm1ha2UucHVzaChbZi5tYWtlLFxuZSxrXSksXCIoXCIrZi5yZWcrXCIpXCI7ZGVmYXVsdDpyZXR1cm4gYX19ZnVuY3Rpb24gYyhhLGIpe2E9U3RyaW5nKGEpO2I9U3RyaW5nKGIpO3JldHVybi0xIT09Yi5pbmRleE9mKFwiI1wiKT9hLnN1YnN0cigwLDEpLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHIoMSk6LTEhPT1iLmluZGV4T2YoXCJeXCIpP2Euc3Vic3RyKDAsMSkrYS5zdWJzdHIoMSkudG9Mb3dlckNhc2UoKTphfXZhciBsPUFycmF5LnByb3RvdHlwZS5pbmRleE9mfHxmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5sZW5ndGgsZD0wO2Q8Yjspe2lmKGE9PXRoaXNbZF0pcmV0dXJuIGQ7ZCsrfXJldHVybi0xfSxoPWEubG9jYWxlLGQ9e1wiJVwiOlwiXFxcXCVcIixhOlwiXFxcXFMrXCIsQTpcIlxcXFxTK1wiLGI6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiLGQsZSl7Yj1sLmNhbGwoZT9oLmJnOmguYixjKGIsZCkpO2lmKC0xPT09YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGIpO3JldHVybiEwfX0saDp7cmVnOlwiXFxcXFMrXCIsbWFrZTpmdW5jdGlvbihhLFxuYixkLGUpe2I9bC5jYWxsKGU/aC5iZzpoLmIsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LEI6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiLGQsZSl7Yj1sLmNhbGwoZT9oLkJnOmguQixjKGIsZCkpO2lmKC0xPT09YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGIpO3JldHVybiEwfX0sZjp7cmVnOlwiXFxcXFMrXCIsbWFrZTpmdW5jdGlvbihhLGIsZCxlKXtiPWwuY2FsbChlP2guZmc6aC5mLGMoYixkKSk7aWYoLTE9PT1iKXJldHVybiExO2Euc2V0VVRDTW9udGgoYik7cmV0dXJuITB9fSxnOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigwPmJ8fDk5PGIpcmV0dXJuITE7Yis9MTAwKnBhcnNlSW50KChuZXcgRGF0ZSkuZ2V0VVRDRnVsbFllYXIoKS8xMDAsMTApO2Euc2V0VVRDRnVsbFllYXIoYik7cmV0dXJuITB9fSxHOntyZWc6XCJcXFxcZHs0fVwiLG1ha2U6ZnVuY3Rpb24oYSxcbmIpe2I9cGFyc2VJbnQoYiwxMCk7YS5zZXRVVENGdWxsWWVhcihiKTtyZXR1cm4hMH19LGQ6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDE+Ynx8MzE8YilyZXR1cm4hMTthLnNldFVUQ0RhdGUoYik7cmV0dXJuITB9fSxlOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDMxPGIpcmV0dXJuITE7YS5zZXRVVENEYXRlKGIpO3JldHVybiEwfX0sSDp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHwyMzxiKXJldHVybiExO2Euc2V0VVRDSG91cnMoYik7cmV0dXJuITB9fSxJOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrYik7cmV0dXJuITB9fSxtOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixcbm1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDE+Ynx8MTI8YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGItMSk7cmV0dXJuITB9fSxNOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigwPmJ8fDU5PGIpcmV0dXJuITE7YS5zZXRVVENNaW51dGVzKGIpO3JldHVybiEwfX0sbjpcIlxcXFxuXCIscDp7cmVnOlwiXFxcXFMrXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9bC5jYWxsKGguUCxiLnRvTG93ZXJDYXNlKCkpO2lmKC0xPT09YilyZXR1cm4hMTsxPT09YiYmYS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrMTIpO3JldHVybiEwfX0sUDp7cmVnOlwiXFxcXFMrXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9bC5jYWxsKGguUCxiLnRvTG93ZXJDYXNlKCkpO2lmKC0xPT09YilyZXR1cm4hMTsxPT09YiYmYS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrMTIpO3JldHVybiEwfX0sUzp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLFxuYil7Yj1wYXJzZUludChiLDEwKTtpZigwPmJ8fDYwPGIpcmV0dXJuITE7YS5zZXRVVENTZWNvbmRzKGIpO3JldHVybiEwfX0sdDpcIlxcXFx0XCIsdTpcIlxcXFxkXCIsVTpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLHc6XCJcXFxcZFwiLFc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIix5OntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigwPmJ8fDk5PGIpcmV0dXJuITE7Yis9MTAwKnBhcnNlSW50KChuZXcgRGF0ZSkuZ2V0VVRDRnVsbFllYXIoKS8xMDAsMTApO2Euc2V0VVRDRnVsbFllYXIoYik7cmV0dXJuITB9fSxZOntyZWc6XCJcXFxcZHs0fVwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2Euc2V0VVRDRnVsbFllYXIoYik7cmV0dXJuITB9fSx6OntyZWc6XCJbK1xcXFwtXVxcXFxkezR9XCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9Yi5tYXRjaCgvXihbK1xcLV0pKFxcZHsyfSkoXFxkezJ9KSQvKTtpZighYilyZXR1cm4hMTt2YXIgZD02RTQqKDYwKnBhcnNlSW50KGJbMl0sMTApK1xucGFyc2VJbnQoYlszXSwxMCkpO1wiK1wiPT09YlsxXSYmKGQ9LWQpO2Euc2V0VGltZShhLmdldFRpbWUoKStkKTtyZXR1cm4hMH19LGw6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDE+Ynx8MTI8YilyZXR1cm4hMTthLnNldFVUQ0hvdXJzKGEuZ2V0VVRDSG91cnMoKStiKTtyZXR1cm4hMH19LHM6e3JlZzpcIlxcXFxkK1wiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2Euc2V0VGltZSgxRTMqYik7cmV0dXJuITB9fSxjOmguYyxyOmgucixSOlwiJUg6JU1cIixUOlwiJUg6JU06JVNcIix4OmgueCxYOmguWCxEOlwiJW0vJWQvJXlcIixGOlwiJVktJW0tJWRcIixEYXRlX2lzbzpcIiVZLSVtLSVkVCVIOiVNOiVTXCIsRGF0ZV9kQllfeWVhcl9pbl9ITTpoLkRhdGVfZEJZX3llYXJfaW5fSE0sRGF0ZV9kQllfeWVhcjpoLkRhdGVfZEJZX3llYXIsRGF0ZV9kQlk6aC5EYXRlX2RCWSxEYXRlX2RCQTpoLkRhdGVfZEJBLERhdGVfQWRCWTpoLkRhdGVfQWRCWSxcbkRhdGVfZGZfaW5fSE06aC5EYXRlX2RmX2luX0hNLERhdGVfZGZZOmguRGF0ZV9kZlksRGF0ZV9kQl9pbl9ITTpoLkRhdGVfZEJfaW5fSE0sRGF0ZV9kbVlfX2RvdDpcIiVkLiVtLiVZXCIsRGF0ZV9kZjpoLkRhdGVfZGYsRGF0ZV9GVDpcIiVGICVUXCIsRGF0ZV9kbVlfX21pbnVzOlwiJWQtJW0tJVlcIn07YS5wYXJzZT1mdW5jdGlvbihhLGQsYyl7YT1TdHJpbmcoYSk7ZD1TdHJpbmcoZCk7Zm9yKHZhciBlPTU7LyUoRGF0ZV9bYS16QS1aMC05X10rfFtjREZyUlR4WF0pL2cudGVzdChkKSYmZTspZD1kLnJlcGxhY2UoLyUoRGF0ZV9bYS16QS1aMC05X10rfFtjREZyUlR4WF0pLyxiKSxlLS07Yi5tYWtlPVtdO2Q9ZC5yZXBsYWNlKC8lKChbI1xcXiF+XXswLDJ9KVthQWJCZmhdfChbMFxcLV9dPylbZGVnSEltTVNWV3lsXXxbR25wUHR1VXdZelpzJV0pL2csYik7YT1hLm1hdGNoKG5ldyBSZWdFeHAoZCkpO2lmKCFhfHwhYi5tYWtlLmxlbmd0aClyZXR1cm4gbnVsbDtkPW5ldyBEYXRlKERhdGUuVVRDKDAsXG4wKSk7ZT0wO2Zvcih2YXIgaz1iLm1ha2UubGVuZ3RoO2U8aztlKyspe3ZhciBmPWIubWFrZVtlXTtpZighZlswXShkLGFbZSsxXSxmWzFdLGZbMl0pKXJldHVybiBudWxsfWMmJmQuc2V0VGltZShkLmdldFRpbWUoKSs2RTQqZC5nZXRUaW1lem9uZU9mZnNldCgpKTtyZXR1cm4gZH19KShhKX0pKCl9LGZ1bmN0aW9uKG0scSxhKXttPWEoNik7Y29uc3QgYz1Tay5nbG9iYWwuSlNCST12b2lkIDAhPT1Tay5nbG9iYWwuQmlnSW50P3t9Om07aWYodm9pZCAwPT09U2suZ2xvYmFsLkJpZ0ludCl7Y29uc3QgYT1jLl9faXNCaWdJbnQ7Yy5fX2lzQmlnSW50PWE/Yj0+bnVsbCE9PWImJmEoYik6YT0+YSBpbnN0YW5jZW9mIGM7Yy5wb3dlcm1vZD0oYSxiLGwpPT57Y29uc3QgZT1jLkJpZ0ludCgxKTtsZXQgZD1lO2ZvcihiPWMuZ3JlYXRlclRoYW4oYixjLl9fWkVSTyk/YjpjLnVuYXJ5TWludXMoYik7Yy5ncmVhdGVyVGhhbihiLGMuX19aRVJPKTspYy5iaXR3aXNlQW5kKGIsZSkmJihkPWMucmVtYWluZGVyKGMubXVsdGlwbHkoZCxcbmEpLGwpKSxiPWMuc2lnbmVkUmlnaHRTaGlmdChiLGUpLGE9Yy5yZW1haW5kZXIoYy5tdWx0aXBseShhLGEpLGwpO3JldHVybiBkfX1lbHNlIE9iamVjdC5hc3NpZ24oYyx7QmlnSW50OlNrLmdsb2JhbC5CaWdJbnQsdG9OdW1iZXI6YT0+TnVtYmVyKGEpLHRvU3RyaW5nOmE9PmEudG9TdHJpbmcoKSxfX2lzQmlnSW50OmE9PlwiYmlnaW50XCI9PT10eXBlb2YgYSx1bmFyeU1pbnVzOmE9Pi1hLGJpdHdpc2VOb3Q6YT0+fmEsYml0d2lzZUFuZDooYSxjKT0+YSZjLGJpdHdpc2VPcjooYSxjKT0+YXxjLGJpdHdpc2VYb3I6KGEsYyk9PmFeYyxleHBvbmVudGlhdGU6KGEsZSk9Pntjb25zdCBiPWMuQmlnSW50KDEpO2xldCBsPWI7Zm9yKGU9ZT5jLl9fWkVSTz9lOi1lO2U+Yy5fX1pFUk87KWUmYiYmKGwqPWEpLGU+Pj1iLGEqPWE7cmV0dXJuIGx9LHBvd2VybW9kOihhLGUsZik9Pntjb25zdCBiPWMuQmlnSW50KDEpO2xldCBoPWI7Zm9yKGU9ZT5jLl9fWkVSTz9lOi1lO2U+Yy5fX1pFUk87KWUmXG5iJiYoaD1oKmElZiksZT4+PWIsYT1hKmElZjtyZXR1cm4gaH0sbXVsdGlwbHk6KGEsYyk9PmEqYyxkaXZpZGU6KGEsYyk9PmEvYyxyZW1haW5kZXI6KGEsYyk9PmElYyxhZGQ6KGEsYyk9PmErYyxzdWJ0cmFjdDooYSxjKT0+YS1jLGxlZnRTaGlmdDooYSxjKT0+YTw8YyxzaWduZWRSaWdodFNoaWZ0OihhLGMpPT5hPj5jLHVuc2lnbmVkUmlnaHRTaGlmdDooYSxjKT0+YT4+PmMsbGVzc1RoYW46KGEsYyk9PmE8YyxsZXNzVGhhbk9yRXF1YWw6KGEsYyk9PmE8PWMsZ3JlYXRlclRoYW46KGEsYyk9PmE+YyxncmVhdGVyVGhhbk9yRXF1YWw6KGEsYyk9PmE+PWMsZXF1YWw6KGEsYyk9PmE9PT1jLG5vdEVxdWFsOihhLGMpPT5hIT09Y30pO2MuX19aRVJPPWMuQmlnSW50KDApO2MuX19NQVhfU0FGRT1jLkJpZ0ludChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7Yy5fX01JTl9TQUZFPWMuQmlnSW50KC1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7Yy5udW1iZXJJZlNhZmU9YT0+Yy5sZXNzVGhhbihhLFxuYy5fX01BWF9TQUZFKSYmYy5ncmVhdGVyVGhhbihhLGMuX19NSU5fU0FGRSk/Yy50b051bWJlcihhKTphfSxmdW5jdGlvbihtLHEsYSl7KGZ1bmN0aW9uKGEsYil7bS5leHBvcnRzPWIoKX0pKHRoaXMsZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe1wiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtyZXR1cm4gYT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBhfSxhKGIpfWZ1bmN0aW9uIGIoYSxiKXtmb3IodmFyIGQsYz0wO2M8Yi5sZW5ndGg7YysrKWQ9YltjXSxkLmVudW1lcmFibGU9ZC5lbnVtZXJhYmxlfHwhMSxkLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBkJiYoZC53cml0YWJsZT1cbiEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxkLmtleSxkKX1mdW5jdGlvbiBlKGEsZCxjKXtyZXR1cm4gZCYmYihhLnByb3RvdHlwZSxkKSxjJiZiKGEsYyksYX1mdW5jdGlvbiBmKGEsYil7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgYiYmbnVsbCE9PWIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYiYmYi5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTphLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTtiJiZoKGEsYil9ZnVuY3Rpb24gbChhKXtyZXR1cm4gbD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKGEpe3JldHVybiBhLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpfSxsKGEpfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm4gaD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKGEsXG5iKXtyZXR1cm4gYS5fX3Byb3RvX189YixhfSxoKGEsYil9ZnVuY3Rpb24gZCgpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2goRCl7cmV0dXJuITF9fWZ1bmN0aW9uIGcoKXtyZXR1cm4gZz1kKCk/UmVmbGVjdC5jb25zdHJ1Y3Q6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPVtudWxsXTtjLnB1c2guYXBwbHkoYyxiKTthPW5ldyAoRnVuY3Rpb24uYmluZC5hcHBseShhLGMpKTtyZXR1cm4gZCYmaChhLGQucHJvdG90eXBlKSxhfSxnLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBuKGEpe3ZhciBiPVwiZnVuY3Rpb25cIj09dHlwZW9mIE1hcD9uZXcgTWFwOnZvaWQgMDtcbnJldHVybiBuPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoKXtyZXR1cm4gZyhhLGFyZ3VtZW50cyxsKHRoaXMpLmNvbnN0cnVjdG9yKX1pZihudWxsPT09YXx8LTE9PT1GdW5jdGlvbi50b1N0cmluZy5jYWxsKGEpLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpKXJldHVybiBhO2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGEpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBiKXtpZihiLmhhcyhhKSlyZXR1cm4gYi5nZXQoYSk7Yi5zZXQoYSxkKX1yZXR1cm4gZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksaChkLGEpfSxuKGEpfWZ1bmN0aW9uIGsoYSl7dmFyIGI9ZCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWwoYSk7aWYoYil7dmFyIGM9XG5sKHRoaXMpLmNvbnN0cnVjdG9yO2Q9UmVmbGVjdC5jb25zdHJ1Y3QoZCxhcmd1bWVudHMsYyl9ZWxzZSBkPWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCFkfHxcIm9iamVjdFwiIT10eXBlb2YgZCYmXCJmdW5jdGlvblwiIT10eXBlb2YgZCl7aWYodm9pZCAwPT09dGhpcyl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7ZD10aGlzfXJldHVybiBkfX1mdW5jdGlvbiBwKGEsYil7aWYoYSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGEpcmV0dXJuIHUoYSxiKTt2YXIgZD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkuc2xpY2UoOCwtMSk7cmV0dXJuXCJPYmplY3RcIj09PWQmJmEuY29uc3RydWN0b3ImJihkPWEuY29uc3RydWN0b3IubmFtZSksXCJNYXBcIj09PWR8fFwiU2V0XCI9PT1kP0FycmF5LmZyb20oYSk6XCJBcmd1bWVudHNcIj09PWR8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGQpP1xudShhLGIpOnZvaWQgMH19ZnVuY3Rpb24gdShhLGIpeyhudWxsPT1ifHxiPmEubGVuZ3RoKSYmKGI9YS5sZW5ndGgpO2Zvcih2YXIgZD0wLGM9QXJyYXkoYik7ZDxiO2QrKyljW2RdPWFbZF07cmV0dXJuIGN9ZnVuY3Rpb24gQShhLGIpe3ZhciBkO2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PWFbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheShhKXx8KGQ9cChhKSl8fGImJmEmJlwibnVtYmVyXCI9PXR5cGVvZiBhLmxlbmd0aCl7ZCYmKGE9ZCk7dmFyIGM9MDtiPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpiLG46ZnVuY3Rpb24oKXtyZXR1cm4gYz49YS5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOmFbYysrXX19LGU6ZnVuY3Rpb24oYSl7dGhyb3cgYTt9LGY6Yn19dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufXZhciBlLGs9ITAsZj0hMTtyZXR1cm57czpmdW5jdGlvbigpe2Q9YVtTeW1ib2wuaXRlcmF0b3JdKCl9LG46ZnVuY3Rpb24oKXt2YXIgYT1kLm5leHQoKTtyZXR1cm4gaz1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtmPSEwO2U9YX0sZjpmdW5jdGlvbigpe3RyeXtrfHxudWxsPT1kLnJldHVybnx8ZC5yZXR1cm4oKX1maW5hbGx5e2lmKGYpdGhyb3cgZTt9fX19dmFyIHQ9TWF0aC5pbXVsLHY9TWF0aC5jbHozMixCPWZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoYSxiKXt2YXIgYztpZighKHRoaXMgaW5zdGFuY2VvZiBkKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO2lmKGE+ZC5fX2tNYXhMZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXhpbXVtIEJpZ0ludCBzaXplIGV4Y2VlZGVkXCIpO3JldHVybiBjPWguY2FsbCh0aGlzLGEpLGMuc2lnbj1iLGN9dmFyIGM9TWF0aC5hYnMsZz1NYXRoLm1heDtmKGQsYik7dmFyIGg9ayhkKTtcbnJldHVybiBlKGQsW3trZXk6XCJ0b0RlYnVnU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYSxiPVtcIkJpZ0ludFtcIl0sZD1BKHRoaXMpO3RyeXtmb3IoZC5zKCk7IShhPWQubigpKS5kb25lOyl7dmFyIGM9YS52YWx1ZTtiLnB1c2goKGM/KGM+Pj4wKS50b1N0cmluZygxNik6YykrXCIsIFwiKX19Y2F0Y2goUCl7ZC5lKFApfWZpbmFsbHl7ZC5mKCl9cmV0dXJuIGIucHVzaChcIl1cIiksYi5qb2luKFwiXCIpfX0se2tleTpcInRvU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT0wPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MTA7aWYoMj5hfHwzNjxhKXRocm93IG5ldyBSYW5nZUVycm9yKFwidG9TdHJpbmcoKSByYWRpeCBhcmd1bWVudCBtdXN0IGJlIGJldHdlZW4gMiBhbmQgMzZcIik7cmV0dXJuIDA9PT10aGlzLmxlbmd0aD9cIjBcIjowPT0oYSZhLTEpP2QuX190b1N0cmluZ0Jhc2VQb3dlck9mVHdvKHRoaXMsYSk6ZC5fX3RvU3RyaW5nR2VuZXJpYyh0aGlzLFxuYSwhMSl9fSx7a2V5OlwiX19jb3B5XCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9bmV3IGQodGhpcy5sZW5ndGgsdGhpcy5zaWduKSxiPTA7Yjx0aGlzLmxlbmd0aDtiKyspYVtiXT10aGlzW2JdO3JldHVybiBhfX0se2tleTpcIl9fdHJpbVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMubGVuZ3RoLGI9dGhpc1thLTFdOzA9PT1iOylhLS0sYj10aGlzW2EtMV0sdGhpcy5wb3AoKTtyZXR1cm4gMD09PWEmJih0aGlzLnNpZ249ITEpLHRoaXN9fSx7a2V5OlwiX19pbml0aWFsaXplRGlnaXRzXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMubGVuZ3RoO2ErKyl0aGlzW2FdPTB9fSx7a2V5OlwiX19jbHptc2RcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkLl9fY2x6MzIodGhpc1t0aGlzLmxlbmd0aC0xXSl9fSx7a2V5OlwiX19pbnBsYWNlTXVsdGlwbHlBZGRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7Yz50aGlzLmxlbmd0aCYmKGM9dGhpcy5sZW5ndGgpO3ZhciBlPVxuNjU1MzUmYTthPj4+PTE2O3ZhciBrPTAsZj02NTUzNSZiO2I+Pj49MTY7Zm9yKHZhciBnPTA7ZzxjO2crKyl7dmFyIGg9dGhpcy5fX2RpZ2l0KGcpLHA9NjU1MzUmaCxsPWg+Pj4xNjtoPWQuX19pbXVsKHAsZSk7cD1kLl9faW11bChwLGEpO3ZhciB2PWQuX19pbXVsKGwsZSk7bD1kLl9faW11bChsLGEpO3ZhciB5PWYrKDY1NTM1JmgpO2g9YitrKyh5Pj4+MTYpKyhoPj4+MTYpKyg2NTUzNSZwKSsoNjU1MzUmdik7Zj0ocD4+PjE2KSsodj4+PjE2KSsoNjU1MzUmbCkrKGg+Pj4xNik7az1mPj4+MTY7ZiY9NjU1MzU7Yj1sPj4+MTY7dGhpcy5fX3NldERpZ2l0KGcsNjU1MzUmeXxoPDwxNil9aWYoMCE9PWt8fDAhPT1mfHwwIT09Yil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTt9fSx7a2V5OlwiX19pbnBsYWNlQWRkXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGQpe2Zvcih2YXIgYyxlPTAsaz0wO2s8ZDtrKyspYz10aGlzLl9faGFsZkRpZ2l0KGIraykrYS5fX2hhbGZEaWdpdChrKStcbmUsZT1jPj4+MTYsdGhpcy5fX3NldEhhbGZEaWdpdChiK2ssYyk7cmV0dXJuIGV9fSx7a2V5OlwiX19pbnBsYWNlU3ViXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPTA7aWYoMSZiKXtiPj49MTtmb3IodmFyIGU9dGhpcy5fX2RpZ2l0KGIpLGs9NjU1MzUmZSxmPTA7ZjxkLTE+Pj4xO2YrKyl7dmFyIGc9YS5fX2RpZ2l0KGYpO2U9KGU+Pj4xNiktKDY1NTM1JmcpLWM7Yz0xJmU+Pj4xNjt0aGlzLl9fc2V0RGlnaXQoYitmLGU8PDE2fDY1NTM1JmspO2U9dGhpcy5fX2RpZ2l0KGIrZisxKTtrPSg2NTUzNSZlKS0oZz4+PjE2KS1jO2M9MSZrPj4+MTZ9Zz1hLl9fZGlnaXQoZik7dmFyIGg9KGU+Pj4xNiktKDY1NTM1JmcpLWM7Yz0xJmg+Pj4xNjt0aGlzLl9fc2V0RGlnaXQoYitmLGg8PDE2fDY1NTM1JmspO2lmKGIrZisxPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm91dCBvZiBib3VuZHNcIik7MD09KDEmZCkmJihlPXRoaXMuX19kaWdpdChiK2YrMSksaz0oNjU1MzUmXG5lKS0oZz4+PjE2KS1jLGM9MSZrPj4+MTYsdGhpcy5fX3NldERpZ2l0KGIrYS5sZW5ndGgsNDI5NDkwMTc2MCZlfDY1NTM1JmspKX1lbHNle2I+Pj0xO2ZvcihrPTA7azxhLmxlbmd0aC0xO2srKyllPXRoaXMuX19kaWdpdChiK2spLGc9YS5fX2RpZ2l0KGspLGY9KDY1NTM1JmUpLSg2NTUzNSZnKS1jLGM9MSZmPj4+MTYsZT0oZT4+PjE2KS0oZz4+PjE2KS1jLGM9MSZlPj4+MTYsdGhpcy5fX3NldERpZ2l0KGIrayxlPDwxNnw2NTUzNSZmKTtmPXRoaXMuX19kaWdpdChiK2spO2E9YS5fX2RpZ2l0KGspO2U9KDY1NTM1JmYpLSg2NTUzNSZhKS1jO2M9MSZlPj4+MTY7Zz0wOzA9PSgxJmQpJiYoZz0oZj4+PjE2KS0oYT4+PjE2KS1jLGM9MSZnPj4+MTYpO3RoaXMuX19zZXREaWdpdChiK2ssZzw8MTZ8NjU1MzUmZSl9cmV0dXJuIGN9fSx7a2V5OlwiX19pbnBsYWNlUmlnaHRTaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe2lmKDAhPT1hKXtmb3IodmFyIGIsZD10aGlzLl9fZGlnaXQoMCk+Pj5hLFxuYz10aGlzLmxlbmd0aC0xLGU9MDtlPGM7ZSsrKWI9dGhpcy5fX2RpZ2l0KGUrMSksdGhpcy5fX3NldERpZ2l0KGUsYjw8MzItYXxkKSxkPWI+Pj5hO3RoaXMuX19zZXREaWdpdChjLGQpfX19LHtrZXk6XCJfX2RpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXNbYV19fSx7a2V5OlwiX191bnNpZ25lZERpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXNbYV0+Pj4wfX0se2tleTpcIl9fc2V0RGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3RoaXNbYV09MHxifX0se2tleTpcIl9fc2V0RGlnaXRHcm93XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt0aGlzW2FdPTB8Yn19LHtrZXk6XCJfX2hhbGZEaWdpdExlbmd0aFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZW5ndGg7cmV0dXJuIDY1NTM1Pj10aGlzLl9fdW5zaWduZWREaWdpdChhLTEpPzIqYS0xOjIqYX19LHtrZXk6XCJfX2hhbGZEaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiA2NTUzNSZ0aGlzW2E+Pj4xXT4+PlxuKCgxJmEpPDw0KX19LHtrZXk6XCJfX3NldEhhbGZEaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YT4+PjEsYz10aGlzLl9fZGlnaXQoZCk7dGhpcy5fX3NldERpZ2l0KGQsMSZhPzY1NTM1JmN8Yjw8MTY6NDI5NDkwMTc2MCZjfDY1NTM1JmIpfX1dLFt7a2V5OlwiQmlnSW50XCIsdmFsdWU6ZnVuY3Rpb24oYil7dmFyIGM9TWF0aC5mbG9vcixlPU51bWJlci5pc0Zpbml0ZTtpZihcIm51bWJlclwiPT10eXBlb2YgYil7aWYoMD09PWIpcmV0dXJuIGQuX196ZXJvKCk7aWYoKDB8Yik9PT1iKXJldHVybiAwPmI/ZC5fX29uZURpZ2l0KC1iLCEwKTpkLl9fb25lRGlnaXQoYiwhMSk7aWYoIWUoYil8fGMoYikhPT1iKXRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIG51bWJlciBcIitiK1wiIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gQmlnSW50IGJlY2F1c2UgaXQgaXMgbm90IGFuIGludGVnZXJcIik7cmV0dXJuIGQuX19mcm9tRG91YmxlKGIpfWlmKFwic3RyaW5nXCI9PXR5cGVvZiBiKXtjPWQuX19mcm9tU3RyaW5nKGIpO1xuaWYobnVsbD09PWMpdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQ2Fubm90IGNvbnZlcnQgXCIrYitcIiB0byBhIEJpZ0ludFwiKTtyZXR1cm4gY31pZihcImJvb2xlYW5cIj09dHlwZW9mIGIpcmV0dXJuITA9PT1iP2QuX19vbmVEaWdpdCgxLCExKTpkLl9femVybygpO2lmKFwib2JqZWN0XCI9PT1hKGIpKXtpZihiLmNvbnN0cnVjdG9yPT09ZClyZXR1cm4gYjtiPWQuX190b1ByaW1pdGl2ZShiKTtyZXR1cm4gZC5CaWdJbnQoYil9dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IFwiK2IrXCIgdG8gYSBCaWdJbnRcIik7fX0se2tleTpcInRvTnVtYmVyXCIsdmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5sZW5ndGg7aWYoMD09PWIpcmV0dXJuIDA7aWYoMT09PWIpe3ZhciBjPWEuX191bnNpZ25lZERpZ2l0KDApO3JldHVybiBhLnNpZ24/LWM6Y312YXIgZT1hLl9fZGlnaXQoYi0xKSxrPWQuX19jbHozMihlKTtjPTMyKmItaztpZigxMDI0PGMpcmV0dXJuIGEuc2lnbj8tSW5maW5pdHk6MS8wOy0tYztcbnZhciBmPWItMSxnPWsrMTtrPSgzMj09PWc/MDplPDxnKT4+PjEyO3ZhciBoPWctMTI7Yj0xMjw9Zz8wOmU8PDIwK2c7Zz0yMCtnOzA8aCYmMDxmJiYoZi0tLGU9YS5fX2RpZ2l0KGYpLGt8PWU+Pj4zMi1oLGI9ZTw8aCxnPWgpOzA8ZyYmMDxmJiYoZi0tLGU9YS5fX2RpZ2l0KGYpLGJ8PWU+Pj4zMi1nLGctPTMyKTtlPWQuX19kZWNpZGVSb3VuZGluZyhhLGcsZixlKTtpZigoMT09PWV8fDA9PT1lJiYxPT0oMSZiKSkmJihiPWIrMT4+PjAsMD09PWImJihrKyssMCE9az4+PjIwJiYoaz0wLGMrKywxMDIzPGMpKSkpcmV0dXJuIGEuc2lnbj8tSW5maW5pdHk6MS8wO2E9YS5zaWduPy0yMTQ3NDgzNjQ4OjA7cmV0dXJuIGM9YysxMDIzPDwyMCxkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdPWF8Y3xrLGQuX19rQml0Q29udmVyc2lvbkludHNbMF09YixkLl9fa0JpdENvbnZlcnNpb25Eb3VibGVbMF19fSx7a2V5OlwidW5hcnlNaW51c1wiLHZhbHVlOmZ1bmN0aW9uKGEpe2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtcbnZhciBiPWEuX19jb3B5KCk7cmV0dXJuIGIuc2lnbj0hYS5zaWduLGJ9fSx7a2V5OlwiYml0d2lzZU5vdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnNpZ24/ZC5fX2Fic29sdXRlU3ViT25lKGEpLl9fdHJpbSgpOmQuX19hYnNvbHV0ZUFkZE9uZShhLCEwKX19LHtrZXk6XCJleHBvbmVudGlhdGVcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKGIuc2lnbil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkV4cG9uZW50IG11c3QgYmUgcG9zaXRpdmVcIik7aWYoMD09PWIubGVuZ3RoKXJldHVybiBkLl9fb25lRGlnaXQoMSwhMSk7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDE9PT1hLmxlbmd0aCYmMT09PWEuX19kaWdpdCgwKSlyZXR1cm4gYS5zaWduJiYwPT0oMSZiLl9fZGlnaXQoMCkpP2QudW5hcnlNaW51cyhhKTphO2lmKDE8Yi5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCaWdJbnQgdG9vIGJpZ1wiKTtiPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iKXJldHVybiBhO2lmKGI+PVxuZC5fX2tNYXhMZW5ndGhCaXRzKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQmlnSW50IHRvbyBiaWdcIik7aWYoMT09PWEubGVuZ3RoJiYyPT09YS5fX2RpZ2l0KDApKXt2YXIgYz0xKyhiPj4+NSk7YT1uZXcgZChjLGEuc2lnbiYmMCE9KDEmYikpO2EuX19pbml0aWFsaXplRGlnaXRzKCk7cmV0dXJuIGEuX19zZXREaWdpdChjLTEsMTw8KDMxJmIpKSxhfWM9bnVsbDt2YXIgZT1hOzAhPSgxJmIpJiYoYz1hKTtmb3IoYj4+PTE7MCE9PWI7Yj4+PTEpZT1kLm11bHRpcGx5KGUsZSksMCE9KDEmYikmJihudWxsPT09Yz9jPWU6Yz1kLm11bHRpcGx5KGMsZSkpO3JldHVybiBjfX0se2tleTpcIm11bHRpcGx5XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGE7aWYoMD09PWIubGVuZ3RoKXJldHVybiBiO3ZhciBjPWEubGVuZ3RoK2IubGVuZ3RoOzMyPD1hLl9fY2x6bXNkKCkrYi5fX2Nsem1zZCgpJiZjLS07Yz1uZXcgZChjLGEuc2lnbiE9PWIuc2lnbik7Yy5fX2luaXRpYWxpemVEaWdpdHMoKTtcbmZvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQuX19tdWx0aXBseUFjY3VtdWxhdGUoYixhLl9fZGlnaXQoZSksYyxlKTtyZXR1cm4gYy5fX3RyaW0oKX19LHtrZXk6XCJkaXZpZGVcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKDA9PT1iLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkRpdmlzaW9uIGJ5IHplcm9cIik7aWYoMD5kLl9fYWJzb2x1dGVDb21wYXJlKGEsYikpcmV0dXJuIGQuX196ZXJvKCk7dmFyIGM9YS5zaWduIT09Yi5zaWduLGU9Yi5fX3Vuc2lnbmVkRGlnaXQoMCk7aWYoMT09PWIubGVuZ3RoJiY2NTUzNT49ZSl7aWYoMT09PWUpcmV0dXJuIGM9PT1hLnNpZ24/YTpkLnVuYXJ5TWludXMoYSk7YT1kLl9fYWJzb2x1dGVEaXZTbWFsbChhLGUsbnVsbCl9ZWxzZSBhPWQuX19hYnNvbHV0ZURpdkxhcmdlKGEsYiwhMCwhMSk7cmV0dXJuIGEuc2lnbj1jLGEuX190cmltKCl9fSx7a2V5OlwicmVtYWluZGVyXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEaXZpc2lvbiBieSB6ZXJvXCIpO1xuaWYoMD5kLl9fYWJzb2x1dGVDb21wYXJlKGEsYikpcmV0dXJuIGE7dmFyIGM9Yi5fX3Vuc2lnbmVkRGlnaXQoMCk7aWYoMT09PWIubGVuZ3RoJiY2NTUzNT49Yyl7aWYoMT09PWMpcmV0dXJuIGQuX196ZXJvKCk7Yj1kLl9fYWJzb2x1dGVNb2RTbWFsbChhLGMpO3JldHVybiAwPT09Yj9kLl9femVybygpOmQuX19vbmVEaWdpdChiLGEuc2lnbil9Yj1kLl9fYWJzb2x1dGVEaXZMYXJnZShhLGIsITEsITApO3JldHVybiBiLnNpZ249YS5zaWduLGIuX190cmltKCl9fSx7a2V5OlwiYWRkXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnNpZ247cmV0dXJuIGM9PT1iLnNpZ24/ZC5fX2Fic29sdXRlQWRkKGEsYixjKTowPD1kLl9fYWJzb2x1dGVDb21wYXJlKGEsYik/ZC5fX2Fic29sdXRlU3ViKGEsYixjKTpkLl9fYWJzb2x1dGVTdWIoYixhLCFjKX19LHtrZXk6XCJzdWJ0cmFjdFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zaWduO3JldHVybiBjPT09Yi5zaWduPzA8PWQuX19hYnNvbHV0ZUNvbXBhcmUoYSxcbmIpP2QuX19hYnNvbHV0ZVN1YihhLGIsYyk6ZC5fX2Fic29sdXRlU3ViKGIsYSwhYyk6ZC5fX2Fic29sdXRlQWRkKGEsYixjKX19LHtrZXk6XCJsZWZ0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPT09Yi5sZW5ndGh8fDA9PT1hLmxlbmd0aD9hOmIuc2lnbj9kLl9fcmlnaHRTaGlmdEJ5QWJzb2x1dGUoYSxiKTpkLl9fbGVmdFNoaWZ0QnlBYnNvbHV0ZShhLGIpfX0se2tleTpcInNpZ25lZFJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPT09Yi5sZW5ndGh8fDA9PT1hLmxlbmd0aD9hOmIuc2lnbj9kLl9fbGVmdFNoaWZ0QnlBYnNvbHV0ZShhLGIpOmQuX19yaWdodFNoaWZ0QnlBYnNvbHV0ZShhLGIpfX0se2tleTpcInVuc2lnbmVkUmlnaHRTaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkJpZ0ludHMgaGF2ZSBubyB1bnNpZ25lZCByaWdodCBzaGlmdDsgdXNlID4+IGluc3RlYWRcIik7fX0se2tleTpcImxlc3NUaGFuXCIsXG52YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPmQuX19jb21wYXJlVG9CaWdJbnQoYSxiKX19LHtrZXk6XCJsZXNzVGhhbk9yRXF1YWxcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPj1kLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwiZ3JlYXRlclRoYW5cIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKX19LHtrZXk6XCJncmVhdGVyVGhhbk9yRXF1YWxcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPD1kLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwiZXF1YWxcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKGEuc2lnbiE9PWIuc2lnbnx8YS5sZW5ndGghPT1iLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKylpZihhLl9fZGlnaXQoZCkhPT1iLl9fZGlnaXQoZCkpcmV0dXJuITE7cmV0dXJuITB9fSx7a2V5Olwibm90RXF1YWxcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiFkLmVxdWFsKGEsXG5iKX19LHtrZXk6XCJiaXR3aXNlQW5kXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZighYS5zaWduJiYhYi5zaWduKXJldHVybiBkLl9fYWJzb2x1dGVBbmQoYSxiKS5fX3RyaW0oKTtpZihhLnNpZ24mJmIuc2lnbil7dmFyIGM9ZyhhLmxlbmd0aCxiLmxlbmd0aCkrMTthPWQuX19hYnNvbHV0ZVN1Yk9uZShhLGMpO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIpO3JldHVybiBhPWQuX19hYnNvbHV0ZU9yKGEsYixhKSxkLl9fYWJzb2x1dGVBZGRPbmUoYSwhMCxhKS5fX3RyaW0oKX1hLnNpZ24mJihiPVtiLGFdLGE9YlswXSxiPWJbMV0pO3JldHVybiBkLl9fYWJzb2x1dGVBbmROb3QoYSxkLl9fYWJzb2x1dGVTdWJPbmUoYikpLl9fdHJpbSgpfX0se2tleTpcImJpdHdpc2VYb3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKCFhLnNpZ24mJiFiLnNpZ24pcmV0dXJuIGQuX19hYnNvbHV0ZVhvcihhLGIpLl9fdHJpbSgpO2lmKGEuc2lnbiYmYi5zaWduKXt2YXIgYz1nKGEubGVuZ3RoLGIubGVuZ3RoKTthPVxuZC5fX2Fic29sdXRlU3ViT25lKGEsYyk7Yj1kLl9fYWJzb2x1dGVTdWJPbmUoYik7cmV0dXJuIGQuX19hYnNvbHV0ZVhvcihhLGIsYSkuX190cmltKCl9Yz1nKGEubGVuZ3RoLGIubGVuZ3RoKSsxO2Euc2lnbiYmKGI9W2IsYV0sYT1iWzBdLGI9YlsxXSk7Yj1kLl9fYWJzb2x1dGVTdWJPbmUoYixjKTtyZXR1cm4gYj1kLl9fYWJzb2x1dGVYb3IoYixhLGIpLGQuX19hYnNvbHV0ZUFkZE9uZShiLCEwLGIpLl9fdHJpbSgpfX0se2tleTpcImJpdHdpc2VPclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZyhhLmxlbmd0aCxiLmxlbmd0aCk7aWYoIWEuc2lnbiYmIWIuc2lnbilyZXR1cm4gZC5fX2Fic29sdXRlT3IoYSxiKS5fX3RyaW0oKTtpZihhLnNpZ24mJmIuc2lnbilyZXR1cm4gYT1kLl9fYWJzb2x1dGVTdWJPbmUoYSxjKSxiPWQuX19hYnNvbHV0ZVN1Yk9uZShiKSxhPWQuX19hYnNvbHV0ZUFuZChhLGIsYSksZC5fX2Fic29sdXRlQWRkT25lKGEsITAsYSkuX190cmltKCk7YS5zaWduJiZcbihiPVtiLGFdLGE9YlswXSxiPWJbMV0pO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIsYyk7cmV0dXJuIGI9ZC5fX2Fic29sdXRlQW5kTm90KGIsYSxiKSxkLl9fYWJzb2x1dGVBZGRPbmUoYiwhMCxiKS5fX3RyaW0oKX19LHtrZXk6XCJhc0ludE5cIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYjtpZigwPT09YSlyZXR1cm4gZC5fX3plcm8oKTtpZihhPj1kLl9fa01heExlbmd0aEJpdHMpcmV0dXJuIGI7dmFyIGM9YSszMT4+PjU7aWYoYi5sZW5ndGg8YylyZXR1cm4gYjt2YXIgZT1iLl9fdW5zaWduZWREaWdpdChjLTEpLGs9MTw8KDMxJmEtMSk7aWYoYi5sZW5ndGg9PT1jJiZlPGspcmV0dXJuIGI7aWYoKGUmaykhPT1rKXJldHVybiBkLl9fdHJ1bmNhdGVUb05CaXRzKGEsYik7aWYoIWIuc2lnbilyZXR1cm4gZC5fX3RydW5jYXRlQW5kU3ViRnJvbVBvd2VyT2ZUd28oYSxiLCEwKTtpZigwPT0oZSZrLTEpKXtmb3IodmFyIGY9Yy0yOzA8PWY7Zi0tKWlmKDAhPT1cbmIuX19kaWdpdChmKSlyZXR1cm4gZC5fX3RydW5jYXRlQW5kU3ViRnJvbVBvd2VyT2ZUd28oYSxiLCExKTtyZXR1cm4gYi5sZW5ndGg9PT1jJiZlPT09az9iOmQuX190cnVuY2F0ZVRvTkJpdHMoYSxiKX1yZXR1cm4gZC5fX3RydW5jYXRlQW5kU3ViRnJvbVBvd2VyT2ZUd28oYSxiLCExKX19LHtrZXk6XCJhc1VpbnROXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGI7aWYoMD09PWEpcmV0dXJuIGQuX196ZXJvKCk7aWYoYi5zaWduKXtpZihhPmQuX19rTWF4TGVuZ3RoQml0cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO3JldHVybiBkLl9fdHJ1bmNhdGVBbmRTdWJGcm9tUG93ZXJPZlR3byhhLGIsITEpfWlmKGE+PWQuX19rTWF4TGVuZ3RoQml0cylyZXR1cm4gYjt2YXIgYz1hKzMxPj4+NTtpZihiLmxlbmd0aDxjKXJldHVybiBiO3ZhciBlPTMxJmE7cmV0dXJuIGIubGVuZ3RoIT1jfHwwIT09ZSYmMCE9Yi5fX2RpZ2l0KGMtMSk+Pj5cbmU/ZC5fX3RydW5jYXRlVG9OQml0cyhhLGIpOmJ9fSx7a2V5OlwiQUREXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihhPWQuX190b1ByaW1pdGl2ZShhKSxiPWQuX190b1ByaW1pdGl2ZShiKSxcInN0cmluZ1wiPT10eXBlb2YgYSlyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgYiYmKGI9Yi50b1N0cmluZygpKSxhK2I7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGIpcmV0dXJuIGEudG9TdHJpbmcoKStiO2lmKGE9ZC5fX3RvTnVtZXJpYyhhKSxiPWQuX190b051bWVyaWMoYiksZC5fX2lzQmlnSW50KGEpJiZkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuYWRkKGEsYik7aWYoXCJudW1iZXJcIj09dHlwZW9mIGEmJlwibnVtYmVyXCI9PXR5cGVvZiBiKXJldHVybiBhK2I7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBtaXggQmlnSW50IGFuZCBvdGhlciB0eXBlcywgdXNlIGV4cGxpY2l0IGNvbnZlcnNpb25zXCIpO319LHtrZXk6XCJMVFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYixcbjApfX0se2tleTpcIkxFXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZC5fX2NvbXBhcmUoYSxiLDEpfX0se2tleTpcIkdUXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZC5fX2NvbXBhcmUoYSxiLDIpfX0se2tleTpcIkdFXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZC5fX2NvbXBhcmUoYSxiLDMpfX0se2tleTpcIkVRXCIsdmFsdWU6ZnVuY3Rpb24oYixjKXtmb3IoOzspe2lmKGQuX19pc0JpZ0ludChiKSlyZXR1cm4gZC5fX2lzQmlnSW50KGMpP2QuZXF1YWwoYixjKTpkLkVRKGMsYik7aWYoXCJudW1iZXJcIj09dHlwZW9mIGIpe2lmKGQuX19pc0JpZ0ludChjKSlyZXR1cm4gZC5fX2VxdWFsVG9OdW1iZXIoYyxiKTtpZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwic3RyaW5nXCI9PXR5cGVvZiBiKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuIGI9ZC5fX2Zyb21TdHJpbmcoYiksbnVsbCE9PWImJmQuZXF1YWwoYixjKTtcbmlmKFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBiPT1jO2M9ZC5fX3RvUHJpbWl0aXZlKGMpfWVsc2UgaWYoXCJib29sZWFuXCI9PXR5cGVvZiBiKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuIGQuX19lcXVhbFRvTnVtYmVyKGMsK2IpO2lmKFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBiPT1jO2M9ZC5fX3RvUHJpbWl0aXZlKGMpfWVsc2UgaWYoXCJzeW1ib2xcIj09PWEoYikpe2lmKGQuX19pc0JpZ0ludChjKSlyZXR1cm4hMTtpZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwib2JqZWN0XCI9PT1hKGIpKXtpZihcIm9iamVjdFwiPT09YShjKSYmYy5jb25zdHJ1Y3RvciE9PWQpcmV0dXJuIGI9PWM7Yj1kLl9fdG9QcmltaXRpdmUoYil9ZWxzZSByZXR1cm4gYj09Y319fSx7a2V5OlwiTkVcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiFkLkVRKGEsYil9fSx7a2V5OlwiX196ZXJvXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGQoMCwhMSl9fSxcbntrZXk6XCJfX29uZURpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtiPW5ldyBkKDEsYik7cmV0dXJuIGIuX19zZXREaWdpdCgwLGEpLGJ9fSx7a2V5OlwiX19kZWNpZGVSb3VuZGluZ1wiLHZhbHVlOmZ1bmN0aW9uKGEsYixkLGMpe2lmKDA8YilyZXR1cm4tMTtpZigwPmIpYj0tYi0xO2Vsc2V7aWYoMD09PWQpcmV0dXJuLTE7ZC0tO2M9YS5fX2RpZ2l0KGQpO2I9MzF9Yj0xPDxiO2lmKDA9PShjJmIpKXJldHVybi0xO2lmKC0tYiwwIT0oYyZiKSlyZXR1cm4gMTtmb3IoOzA8ZDspaWYoZC0tLDAhPT1hLl9fZGlnaXQoZCkpcmV0dXJuIDE7cmV0dXJuIDB9fSx7a2V5OlwiX19mcm9tRG91YmxlXCIsdmFsdWU6ZnVuY3Rpb24oYSl7ZC5fX2tCaXRDb252ZXJzaW9uRG91YmxlWzBdPWE7dmFyIGI9KDIwNDcmZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT4+PjIwKS0xMDIzO3ZhciBjPShiPj4+NSkrMTthPW5ldyBkKGMsMD5hKTt2YXIgZT0xMDQ4NTc1JmQuX19rQml0Q29udmVyc2lvbkludHNbMV18MTA0ODU3Nixcbms9ZC5fX2tCaXRDb252ZXJzaW9uSW50c1swXTtiJj0zMTtpZigyMD5iKXt2YXIgZj0yMC1iO3ZhciBnPWYrMzI7Yj1lPj4+ZjtlPWU8PDMyLWZ8az4+PmY7azw8PTMyLWZ9ZWxzZSAyMD09PWI/KGc9MzIsYj1lLGU9ayk6KGY9Yi0yMCxnPTMyLWYsYj1lPDxmfGs+Pj4zMi1mLGU9azw8Zik7YS5fX3NldERpZ2l0KGMtMSxiKTtmb3IoYy09MjswPD1jO2MtLSkwPGc/KGctPTMyLGI9ZSxlPWspOmI9MCxhLl9fc2V0RGlnaXQoYyxiKTtyZXR1cm4gYS5fX3RyaW0oKX19LHtrZXk6XCJfX2lzV2hpdGVzcGFjZVwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiEhKDEzPj1hJiY5PD1hKXx8KDE1OT49YT8zMj09YToxMzEwNzE+PWE/MTYwPT1hfHw1NzYwPT1hOjE5NjYwNz49YT8oYSY9MTMxMDcxLDEwPj1hfHw0MD09YXx8NDE9PWF8fDQ3PT1hfHw5NT09YXx8NDA5Nj09YSk6NjUyNzk9PWEpfX0se2tleTpcIl9fZnJvbVN0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTE8YXJndW1lbnRzLmxlbmd0aCYmXG52b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAsYz0wLGU9YS5sZW5ndGgsaz0wO2lmKGs9PT1lKXJldHVybiBkLl9femVybygpO2Zvcih2YXIgZj1hLmNoYXJDb2RlQXQoayk7ZC5fX2lzV2hpdGVzcGFjZShmKTspe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7Zj1hLmNoYXJDb2RlQXQoayl9aWYoNDM9PT1mKXtpZigrK2s9PT1lKXJldHVybiBudWxsO2Y9YS5jaGFyQ29kZUF0KGspO2M9MX1lbHNlIGlmKDQ1PT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKTtjPS0xfWlmKDA9PT1iKXtpZihiPTEwLDQ4PT09Zil7aWYoKytrPT09ZSlyZXR1cm4gZC5fX3plcm8oKTtpZihmPWEuY2hhckNvZGVBdChrKSw4OD09PWZ8fDEyMD09PWYpe2lmKGI9MTYsKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKX1lbHNlIGlmKDc5PT09Znx8MTExPT09Zil7aWYoYj04LCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9ZWxzZSBpZig2Nj09PVxuZnx8OTg9PT1mKXtpZihiPTIsKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKX19fWVsc2UgaWYoMTY9PT1iJiY0OD09PWYpe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7aWYoZj1hLmNoYXJDb2RlQXQoayksODg9PT1mfHwxMjA9PT1mKXtpZigrK2s9PT1lKXJldHVybiBudWxsO2Y9YS5jaGFyQ29kZUF0KGspfX1mb3IoOzQ4PT09Zjspe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7Zj1hLmNoYXJDb2RlQXQoayl9dmFyIGc9ZS1rLGg9ZC5fX2tNYXhCaXRzUGVyQ2hhcltiXSxwPWQuX19rQml0c1BlckNoYXJUYWJsZU11bHRpcGxpZXItMTtpZihnPjEwNzM3NDE4MjQvaClyZXR1cm4gbnVsbDtnPW5ldyBkKChoKmcrcD4+PmQuX19rQml0c1BlckNoYXJUYWJsZVNoaWZ0KSszMT4+PjUsITEpO3ZhciBsPTEwPmI/YjoxMCx2PTEwPGI/Yi0xMDowO2lmKDA9PShiJmItMSkpe2g+Pj1kLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdDt2YXIgQj1bXSxuPVtdLEE9XG4hMTtkb3tmb3IodmFyIEQsdT1wPTA7Oyl7aWYoZi00OD4+PjA8bClEPWYtNDg7ZWxzZSBpZigoMzJ8ZiktOTc+Pj4wPHYpRD0oMzJ8ZiktODc7ZWxzZXtBPSEwO2JyZWFrfWlmKHUrPWgscD1wPDxofEQsKytrPT09ZSl7QT0hMDticmVha31pZihmPWEuY2hhckNvZGVBdChrKSwzMjx1K2gpYnJlYWt9Qi5wdXNoKHApO24ucHVzaCh1KX13aGlsZSghQSk7ZC5fX2ZpbGxGcm9tUGFydHMoZyxCLG4pfWVsc2V7Zy5fX2luaXRpYWxpemVEaWdpdHMoKTtCPSExO249MDtkb3tBPTA7Zm9yKEQ9MTs7KXtpZihmLTQ4Pj4+MDxsKXA9Zi00ODtlbHNlIGlmKCgzMnxmKS05Nz4+PjA8dilwPSgzMnxmKS04NztlbHNle0I9ITA7YnJlYWt9dT1EKmI7aWYoNDI5NDk2NzI5NTx1KWJyZWFrO2lmKEQ9dSxBPUEqYitwLG4rKywrK2s9PT1lKXtCPSEwO2JyZWFrfWY9YS5jaGFyQ29kZUF0KGspfXA9MzIqZC5fX2tCaXRzUGVyQ2hhclRhYmxlTXVsdGlwbGllci0xO2cuX19pbnBsYWNlTXVsdGlwbHlBZGQoRCxcbkEsaCpuK3A+Pj5kLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdCs1KX13aGlsZSghQil9aWYoayE9PWUpe2lmKCFkLl9faXNXaGl0ZXNwYWNlKGYpKXJldHVybiBudWxsO2ZvcihrKys7azxlO2srKylpZihmPWEuY2hhckNvZGVBdChrKSwhZC5fX2lzV2hpdGVzcGFjZShmKSlyZXR1cm4gbnVsbH1yZXR1cm4gMCE9PWMmJjEwIT09Yj9udWxsOihnLnNpZ249LTE9PT1jLGcuX190cmltKCkpfX0se2tleTpcIl9fZmlsbEZyb21QYXJ0c1wiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXtmb3IodmFyIGM9MCxlPTAsaz0wLGY9Yi5sZW5ndGgtMTswPD1mO2YtLSl7dmFyIGc9YltmXSxoPWRbZl07ZXw9Zzw8aztrKz1oOzMyPT09az8oYS5fX3NldERpZ2l0KGMrKyxlKSxrPTAsZT0wKTozMjxrJiYoYS5fX3NldERpZ2l0KGMrKyxlKSxrLT0zMixlPWc+Pj5oLWspfWlmKDAhPT1lKXtpZihjPj1hLmxlbmd0aCl0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTthLl9fc2V0RGlnaXQoYysrLGUpfWZvcig7YzxcbmEubGVuZ3RoO2MrKylhLl9fc2V0RGlnaXQoYywwKX19LHtrZXk6XCJfX3RvU3RyaW5nQmFzZVBvd2VyT2ZUd29cIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGU9Yi0xO2U9KDg1JmU+Pj4xKSsoODUmZSk7ZT0oNTEmZT4+PjIpKyg1MSZlKTtlPSgxNSZlPj4+NCkrKDE1JmUpOy0tYjt2YXIgaz1hLl9fZGlnaXQoYy0xKSxmPWQuX19jbHozMihrKSxnPTB8KDMyKmMtZitlLTEpL2U7aWYoYS5zaWduJiZnKyssMjY4NDM1NDU2PGcpdGhyb3cgRXJyb3IoXCJzdHJpbmcgdG9vIGxvbmdcIik7Zj1BcnJheShnKTstLWc7Zm9yKHZhciBoPTAscD0wLGw9MDtsPGMtMTtsKyspe3ZhciB2PWEuX19kaWdpdChsKTtoPShofHY8PHApJmI7ZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2hdO3A9ZS1wO2g9dj4+PnA7Zm9yKHA9MzItcDtwPj1lOylmW2ctLV09ZC5fX2tDb252ZXJzaW9uQ2hhcnNbaCZiXSxoPj4+PWUscC09ZX1mW2ctLV09ZC5fX2tDb252ZXJzaW9uQ2hhcnNbKGh8azw8XG5wKSZiXTtmb3IoaD1rPj4+ZS1wOzAhPT1oOylmW2ctLV09ZC5fX2tDb252ZXJzaW9uQ2hhcnNbaCZiXSxoPj4+PWU7aWYoYS5zaWduJiYoZltnLS1dPVwiLVwiKSwtMSE9PWcpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7cmV0dXJuIGYuam9pbihcIlwiKX19LHtrZXk6XCJfX3RvU3RyaW5nR2VuZXJpY1wiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT1hLmxlbmd0aDtpZigwPT09ZSlyZXR1cm5cIlwiO2lmKDE9PT1lKXJldHVybiBiPWEuX191bnNpZ25lZERpZ2l0KDApLnRvU3RyaW5nKGIpLCExPT09YyYmYS5zaWduJiYoYj1cIi1cIitiKSxiO3ZhciBrPTMyKmUtZC5fX2NsejMyKGEuX19kaWdpdChlLTEpKTtlPWQuX19rTWF4Qml0c1BlckNoYXJbYl0tMTtrKj1kLl9fa0JpdHNQZXJDaGFyVGFibGVNdWx0aXBsaWVyO2U9KDB8KGsrKGUtMSkpL2UpKzE+PjE7az1kLmV4cG9uZW50aWF0ZShkLl9fb25lRGlnaXQoYiwhMSksZC5fX29uZURpZ2l0KGUsITEpKTt2YXIgZj1rLl9fdW5zaWduZWREaWdpdCgwKTtcbmlmKDE9PT1rLmxlbmd0aCYmNjU1MzU+PWYpe2s9bmV3IGQoYS5sZW5ndGgsITEpO2suX19pbml0aWFsaXplRGlnaXRzKCk7dmFyIGc9MDtmb3IodmFyIGg9MiphLmxlbmd0aC0xOzA8PWg7aC0tKWc9Zzw8MTZ8YS5fX2hhbGZEaWdpdChoKSxrLl9fc2V0SGFsZkRpZ2l0KGgsMHxnL2YpLGc9MHxnJWY7Zj1nLnRvU3RyaW5nKGIpfWVsc2UgZj1kLl9fYWJzb2x1dGVEaXZMYXJnZShhLGssITAsITApLGs9Zi5xdW90aWVudCxmPWYucmVtYWluZGVyLl9fdHJpbSgpLGY9ZC5fX3RvU3RyaW5nR2VuZXJpYyhmLGIsITApO2suX190cmltKCk7Zm9yKGI9ZC5fX3RvU3RyaW5nR2VuZXJpYyhrLGIsITApO2YubGVuZ3RoPGU7KWY9XCIwXCIrZjtyZXR1cm4hMT09PWMmJmEuc2lnbiYmKGI9XCItXCIrYiksYitmfX0se2tleTpcIl9fdW5lcXVhbFNpZ25cIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYT8tMToxfX0se2tleTpcIl9fYWJzb2x1dGVHcmVhdGVyXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/XG4tMToxfX0se2tleTpcIl9fYWJzb2x1dGVMZXNzXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/MTotMX19LHtrZXk6XCJfX2NvbXBhcmVUb0JpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zaWduO2lmKGMhPT1iLnNpZ24pcmV0dXJuIGQuX191bmVxdWFsU2lnbihjKTthPWQuX19hYnNvbHV0ZUNvbXBhcmUoYSxiKTtyZXR1cm4gMDxhP2QuX19hYnNvbHV0ZUdyZWF0ZXIoYyk6MD5hP2QuX19hYnNvbHV0ZUxlc3MoYyk6MH19LHtrZXk6XCJfX2NvbXBhcmVUb051bWJlclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMXxiKXt2YXIgZT1hLnNpZ24saz0wPmI7aWYoZSE9PWspcmV0dXJuIGQuX191bmVxdWFsU2lnbihlKTtpZigwPT09YS5sZW5ndGgpe2lmKGspdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7cmV0dXJuIDA9PT1iPzA6LTF9aWYoMTxhLmxlbmd0aClyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihlKTtiPWMoYik7YT1hLl9fdW5zaWduZWREaWdpdCgwKTtcbnJldHVybiBhPmI/ZC5fX2Fic29sdXRlR3JlYXRlcihlKTphPGI/ZC5fX2Fic29sdXRlTGVzcyhlKTowfXJldHVybiBkLl9fY29tcGFyZVRvRG91YmxlKGEsYil9fSx7a2V5OlwiX19jb21wYXJlVG9Eb3VibGVcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKGIhPT1iKXJldHVybiBiO2lmKGI9PT0xLzApcmV0dXJuLTE7aWYoLUluZmluaXR5PT09YilyZXR1cm4gMTt2YXIgYz1hLnNpZ247aWYoYyE9PTA+YilyZXR1cm4gZC5fX3VuZXF1YWxTaWduKGMpO2lmKDA9PT1iKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnOiBzaG91bGQgYmUgaGFuZGxlZCBlbHNld2hlcmVcIik7aWYoMD09PWEubGVuZ3RoKXJldHVybi0xO2QuX19rQml0Q29udmVyc2lvbkRvdWJsZVswXT1iO2I9MjA0NyZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdPj4+MjA7aWYoMjA0Nz09Yil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1ZzogaGFuZGxlZCBlbHNld2hlcmVcIik7dmFyIGU9Yi0xMDIzO2lmKDA+ZSlyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtcbmI9YS5sZW5ndGg7dmFyIGs9YS5fX2RpZ2l0KGItMSksZj1kLl9fY2x6MzIoayksZz0zMipiLWY7ZSs9MTtpZihnPGUpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyk7aWYoZz5lKXJldHVybiBkLl9fYWJzb2x1dGVHcmVhdGVyKGMpO2U9MTA0ODU3NnwxMDQ4NTc1JmQuX19rQml0Q29udmVyc2lvbkludHNbMV07dmFyIGg9ZC5fX2tCaXRDb252ZXJzaW9uSW50c1swXTtmPTMxLWY7aWYoZiE9PShnLTEpJTMxKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO2lmKDIwPmYpe3ZhciBwPTIwLWY7Zj1wKzMyO2c9ZT4+PnA7ZT1lPDwzMi1wfGg+Pj5wO2g8PD0zMi1wfWVsc2UgMjA9PT1mPyhmPTMyLGc9ZSxlPWgpOihwPWYtMjAsZj0zMi1wLGc9ZTw8cHxoPj4+MzItcCxlPWg8PHApO2lmKGs+Pj49MCxnPj4+PTAsaz5nKXJldHVybiBkLl9fYWJzb2x1dGVHcmVhdGVyKGMpO2lmKGs8ZylyZXR1cm4gZC5fX2Fic29sdXRlTGVzcyhjKTtmb3IoYi09MjswPD1iO2ItLSl7MDxmPyhmLT1cbjMyLGc9ZT4+PjAsZT1oLGg9MCk6Zz0wO2s9YS5fX3Vuc2lnbmVkRGlnaXQoYik7aWYoaz5nKXJldHVybiBkLl9fYWJzb2x1dGVHcmVhdGVyKGMpO2lmKGs8ZylyZXR1cm4gZC5fX2Fic29sdXRlTGVzcyhjKX1pZigwIT09ZXx8MCE9PWgpe2lmKDA9PT1mKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiBkLl9fYWJzb2x1dGVMZXNzKGMpfXJldHVybiAwfX0se2tleTpcIl9fZXF1YWxUb051bWJlclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGJ8MD09PWI/MD09PWI/MD09PWEubGVuZ3RoOjE9PT1hLmxlbmd0aCYmYS5zaWduPT09MD5iJiZhLl9fdW5zaWduZWREaWdpdCgwKT09PWMoYik6MD09PWQuX19jb21wYXJlVG9Eb3VibGUoYSxiKX19LHtrZXk6XCJfX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2xcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3N3aXRjaChiKXtjYXNlIDA6cmV0dXJuIDA+YTtjYXNlIDE6cmV0dXJuIDA+PWE7Y2FzZSAyOnJldHVybiAwPGE7Y2FzZSAzOnJldHVybiAwPD1cbmF9dGhyb3cgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTt9fSx7a2V5OlwiX19jb21wYXJlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe2lmKGE9ZC5fX3RvUHJpbWl0aXZlKGEpLGI9ZC5fX3RvUHJpbWl0aXZlKGIpLFwic3RyaW5nXCI9PXR5cGVvZiBhJiZcInN0cmluZ1wiPT10eXBlb2YgYilzd2l0Y2goYyl7Y2FzZSAwOnJldHVybiBhPGI7Y2FzZSAxOnJldHVybiBhPD1iO2Nhc2UgMjpyZXR1cm4gYT5iO2Nhc2UgMzpyZXR1cm4gYT49Yn1pZihkLl9faXNCaWdJbnQoYSkmJlwic3RyaW5nXCI9PXR5cGVvZiBiKXJldHVybiBiPWQuX19mcm9tU3RyaW5nKGIpLG51bGwhPT1iJiZkLl9fY29tcGFyaXNvblJlc3VsdFRvQm9vbChkLl9fY29tcGFyZVRvQmlnSW50KGEsYiksYyk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGEmJmQuX19pc0JpZ0ludChiKSlyZXR1cm4gYT1kLl9fZnJvbVN0cmluZyhhKSxudWxsIT09YSYmZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpLGMpO1xuaWYoYT1kLl9fdG9OdW1lcmljKGEpLGI9ZC5fX3RvTnVtZXJpYyhiKSxkLl9faXNCaWdJbnQoYSkpe2lmKGQuX19pc0JpZ0ludChiKSlyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpLGMpO2lmKFwibnVtYmVyXCIhPXR5cGVvZiBiKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiBkLl9fY29tcGFyaXNvblJlc3VsdFRvQm9vbChkLl9fY29tcGFyZVRvTnVtYmVyKGEsYiksYyl9aWYoXCJudW1iZXJcIiE9dHlwZW9mIGEpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7aWYoZC5fX2lzQmlnSW50KGIpKXJldHVybiBkLl9fY29tcGFyaXNvblJlc3VsdFRvQm9vbChkLl9fY29tcGFyZVRvTnVtYmVyKGIsYSksMl5jKTtpZihcIm51bWJlclwiIT10eXBlb2YgYil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gMD09PWM/YTxiOjE9PT1jP2E8PWI6Mj09PWM/YT5iOjM9PT1jP2E+PWI6XG52b2lkIDB9fSx7a2V5OlwiX19hYnNvbHV0ZUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtpZihhLmxlbmd0aDxiLmxlbmd0aClyZXR1cm4gZC5fX2Fic29sdXRlQWRkKGIsYSxjKTtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGE7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhLnNpZ249PT1jP2E6ZC51bmFyeU1pbnVzKGEpO3ZhciBlPWEubGVuZ3RoOygwPT09YS5fX2Nsem1zZCgpfHxiLmxlbmd0aD09PWEubGVuZ3RoJiYwPT09Yi5fX2Nsem1zZCgpKSYmZSsrO2M9bmV3IGQoZSxjKTtmb3IodmFyIGs9ZT0wO2s8Yi5sZW5ndGg7aysrKXt2YXIgZj1iLl9fZGlnaXQoayksZz1hLl9fZGlnaXQoayksaD0oNjU1MzUmZykrKDY1NTM1JmYpK2U7Zj0oZz4+PjE2KSsoZj4+PjE2KSsoaD4+PjE2KTtlPWY+Pj4xNjtjLl9fc2V0RGlnaXQoayw2NTUzNSZofGY8PDE2KX1mb3IoO2s8YS5sZW5ndGg7aysrKWg9YS5fX2RpZ2l0KGspLGI9KDY1NTM1JmgpK2UsaD0oaD4+PjE2KSsoYj4+PjE2KSxlPWg+Pj5cbjE2LGMuX19zZXREaWdpdChrLDY1NTM1JmJ8aDw8MTYpO3JldHVybiBrPGMubGVuZ3RoJiZjLl9fc2V0RGlnaXQoayxlKSxjLl9fdHJpbSgpfX0se2tleTpcIl9fYWJzb2x1dGVTdWJcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYS5zaWduPT09Yz9hOmQudW5hcnlNaW51cyhhKTtjPW5ldyBkKGEubGVuZ3RoLGMpO2Zvcih2YXIgZT0wLGs9MDtrPGIubGVuZ3RoO2srKyl7dmFyIGY9YS5fX2RpZ2l0KGspLGc9Yi5fX2RpZ2l0KGspLGg9KDY1NTM1JmYpLSg2NTUzNSZnKS1lO2U9MSZoPj4+MTY7Zj0oZj4+PjE2KS0oZz4+PjE2KS1lO2U9MSZmPj4+MTY7Yy5fX3NldERpZ2l0KGssNjU1MzUmaHxmPDwxNil9Zm9yKDtrPGEubGVuZ3RoO2srKyloPWEuX19kaWdpdChrKSxiPSg2NTUzNSZoKS1lLGU9MSZiPj4+MTYsaD0oaD4+PjE2KS1lLGU9MSZoPj4+MTYsYy5fX3NldERpZ2l0KGssNjU1MzUmYnxoPDwxNik7XG5yZXR1cm4gYy5fX3RyaW0oKX19LHtrZXk6XCJfX2Fic29sdXRlQWRkT25lXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoO251bGw9PT1jP2M9bmV3IGQoZSxiKTpjLnNpZ249Yjtmb3IodmFyIGssZj0hMCxnPTA7ZzxlO2crKyl7aWYoaz1hLl9fZGlnaXQoZyksZilmPS0xPT09ayxrPTB8aysxO2MuX19zZXREaWdpdChnLGspfXJldHVybiBmJiZjLl9fc2V0RGlnaXRHcm93KGUsMSksY319LHtrZXk6XCJfX2Fic29sdXRlU3ViT25lXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aDtiPWJ8fGM7Zm9yKHZhciBlLGs9bmV3IGQoYiwhMSksZj0hMCxnPTA7ZzxjO2crKyl7aWYoZT1hLl9fZGlnaXQoZyksZilmPTA9PT1lLGU9MHxlLTE7ay5fX3NldERpZ2l0KGcsZSl9aWYoZil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtmb3IoYT1jO2E8XG5iO2ErKylrLl9fc2V0RGlnaXQoYSwwKTtyZXR1cm4ga319LHtrZXk6XCJfX2Fic29sdXRlQW5kXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2U8ayYmKGY9ZSxlPWEsYT1iLGI9ZSk7ZT1mO251bGw9PT1jP2M9bmV3IGQoZSwhMSk6ZT1jLmxlbmd0aDtmb3Ioaz0wO2s8ZjtrKyspYy5fX3NldERpZ2l0KGssYS5fX2RpZ2l0KGspJmIuX19kaWdpdChrKSk7Zm9yKDtrPGU7aysrKWMuX19zZXREaWdpdChrLDApO3JldHVybiBjfX0se2tleTpcIl9fYWJzb2x1dGVBbmROb3RcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLGU9YS5sZW5ndGgsaz1iLmxlbmd0aCxmPWs7ZTxrJiYoZj1lKTtrPWU7bnVsbD09PWM/Yz1uZXcgZChrLCExKTpcbms9Yy5sZW5ndGg7Zm9yKHZhciBnPTA7ZzxmO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZykmfmIuX19kaWdpdChnKSk7Zm9yKDtnPGU7ZysrKWMuX19zZXREaWdpdChnLGEuX19kaWdpdChnKSk7Zm9yKDtnPGs7ZysrKWMuX19zZXREaWdpdChnLDApO3JldHVybiBjfX0se2tleTpcIl9fYWJzb2x1dGVPclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aCxrPWIubGVuZ3RoLGY9aztpZihlPGspe2Y9ZTt2YXIgZz1hO2E9YjtlPWs7Yj1nfWs9ZTtudWxsPT09Yz9jPW5ldyBkKGssITEpOms9Yy5sZW5ndGg7Zm9yKGc9MDtnPGY7ZysrKWMuX19zZXREaWdpdChnLGEuX19kaWdpdChnKXxiLl9fZGlnaXQoZykpO2Zvcig7ZzxlO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZykpO2Zvcig7ZzxrO2crKyljLl9fc2V0RGlnaXQoZywwKTtyZXR1cm4gY319LFxue2tleTpcIl9fYWJzb2x1dGVYb3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLGU9YS5sZW5ndGgsaz1iLmxlbmd0aCxmPWs7aWYoZTxrKXtmPWU7dmFyIGc9YTthPWI7ZT1rO2I9Z31rPWU7bnVsbD09PWM/Yz1uZXcgZChrLCExKTprPWMubGVuZ3RoO2ZvcihnPTA7ZzxmO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZyleYi5fX2RpZ2l0KGcpKTtmb3IoO2c8ZTtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpKTtmb3IoO2c8aztnKyspYy5fX3NldERpZ2l0KGcsMCk7cmV0dXJuIGN9fSx7a2V5OlwiX19hYnNvbHV0ZUNvbXBhcmVcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPWEubGVuZ3RoLWIubGVuZ3RoO2lmKDAhPWQpcmV0dXJuIGQ7Zm9yKGQ9YS5sZW5ndGgtMTswPD1kJiZhLl9fZGlnaXQoZCk9PT1iLl9fZGlnaXQoZCk7KWQtLTtyZXR1cm4gMD5kPzA6YS5fX3Vuc2lnbmVkRGlnaXQoZCk+XG5iLl9fdW5zaWduZWREaWdpdChkKT8xOi0xfX0se2tleTpcIl9fbXVsdGlwbHlBY2N1bXVsYXRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMsZSl7aWYoMCE9PWIpe2Zvcih2YXIgaz02NTUzNSZiLGY9Yj4+PjE2LGc9Yj0wLGg9MCxwPTA7cDxhLmxlbmd0aDtwKyssZSsrKXt2YXIgbD1jLl9fZGlnaXQoZSksdj02NTUzNSZsO2w+Pj49MTY7dmFyIEI9YS5fX2RpZ2l0KHApLG49NjU1MzUmQixBPUI+Pj4xNjtCPWQuX19pbXVsKG4sayk7bj1kLl9faW11bChuLGYpO3ZhciBEPWQuX19pbXVsKEEsayk7QT1kLl9faW11bChBLGYpO3YrPWcrKDY1NTM1JkIpO2wrPWgrYisodj4+PjE2KSsoQj4+PjE2KSsoNjU1MzUmbikrKDY1NTM1JkQpO2I9bD4+PjE2O2c9KG4+Pj4xNikrKEQ+Pj4xNikrKDY1NTM1JkEpK2I7Yj1nPj4+MTY7ZyY9NjU1MzU7aD1BPj4+MTY7bD02NTUzNSZ2fGw8PDE2O2MuX19zZXREaWdpdChlLGwpfWZvcig7MCE9PWJ8fDAhPT1nfHwwIT09aDtlKyspaz1jLl9fZGlnaXQoZSksYT1cbig2NTUzNSZrKStnLGs9KGs+Pj4xNikrKGE+Pj4xNikraCtiLGg9Zz0wLGI9az4+PjE2LGs9NjU1MzUmYXxrPDwxNixjLl9fc2V0RGlnaXQoZSxrKX19fSx7a2V5OlwiX19pbnRlcm5hbE11bHRpcGx5QWRkXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMsZSxrKXtmb3IodmFyIGY9MCxnPTA7ZzxlO2crKyl7dmFyIGg9YS5fX2RpZ2l0KGcpLHA9ZC5fX2ltdWwoNjU1MzUmaCxiKSxsPSg2NTUzNSZwKStmK2M7Yz1sPj4+MTY7Zj1kLl9faW11bChoPj4+MTYsYik7cD0oNjU1MzUmZikrKHA+Pj4xNikrYztjPXA+Pj4xNjtmPj4+PTE2O2suX19zZXREaWdpdChnLHA8PDE2fDY1NTM1JmwpfWlmKGsubGVuZ3RoPmUpZm9yKGsuX19zZXREaWdpdChlKyssYytmKTtlPGsubGVuZ3RoOylrLl9fc2V0RGlnaXQoZSsrLDApO2Vsc2UgaWYoMCE9PWMrZil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTt9fSx7a2V5OlwiX19hYnNvbHV0ZURpdlNtYWxsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe251bGw9PT1cbmMmJihjPW5ldyBkKGEubGVuZ3RoLCExKSk7Zm9yKHZhciBlPTAsaz0yKmEubGVuZ3RoLTE7MDw9aztrLT0yKXtlPShlPDwxNnxhLl9faGFsZkRpZ2l0KGspKT4+PjA7dmFyIGY9MHxlL2I7ZT0wfGUlYjtlPShlPDwxNnxhLl9faGFsZkRpZ2l0KGstMSkpPj4+MDt2YXIgZz0wfGUvYjtlPTB8ZSViO2MuX19zZXREaWdpdChrPj4+MSxmPDwxNnxnKX1yZXR1cm4gY319LHtrZXk6XCJfX2Fic29sdXRlTW9kU21hbGxcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTA7Zm9yKHZhciBjPTIqYS5sZW5ndGgtMTswPD1jO2MtLSlkPShkPDwxNnxhLl9faGFsZkRpZ2l0KGMpKT4+PjAsZD0wfGQlYjtyZXR1cm4gZH19LHtrZXk6XCJfX2Fic29sdXRlRGl2TGFyZ2VcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyxlKXt2YXIgaz1iLl9faGFsZkRpZ2l0TGVuZ3RoKCksZj1iLmxlbmd0aCxnPWEuX19oYWxmRGlnaXRMZW5ndGgoKS1rLGg9bnVsbDtjJiYoaD1uZXcgZChnKzI+Pj4xLCExKSxoLl9faW5pdGlhbGl6ZURpZ2l0cygpKTtcbnZhciBwPW5ldyBkKGsrMj4+PjEsITEpO3AuX19pbml0aWFsaXplRGlnaXRzKCk7dmFyIGw9ZC5fX2NsejE2KGIuX19oYWxmRGlnaXQoay0xKSk7MDxsJiYoYj1kLl9fc3BlY2lhbExlZnRTaGlmdChiLGwsMCkpO2E9ZC5fX3NwZWNpYWxMZWZ0U2hpZnQoYSxsLDEpO2Zvcih2YXIgdj1iLl9faGFsZkRpZ2l0KGstMSksQj0wOzA8PWc7Zy0tKXt2YXIgbj02NTUzNSxBPWEuX19oYWxmRGlnaXQoZytrKTtpZihBIT09dil7QT0oQTw8MTZ8YS5fX2hhbGZEaWdpdChnK2stMSkpPj4+MDtuPTB8QS92O0E9MHxBJXY7Zm9yKHZhciBEPWIuX19oYWxmRGlnaXQoay0yKSx1PWEuX19oYWxmRGlnaXQoZytrLTIpO2QuX19pbXVsKG4sRCk+Pj4wPihBPDwxNnx1KT4+PjAmJihuLS0sQSs9diwhKDY1NTM1PEEpKTspO31kLl9faW50ZXJuYWxNdWx0aXBseUFkZChiLG4sMCxmLHApO0E9YS5fX2lucGxhY2VTdWIocCxnLGsrMSk7MCE9PUEmJihBPWEuX19pbnBsYWNlQWRkKGIsZyxrKSxhLl9fc2V0SGFsZkRpZ2l0KGcrXG5rLGEuX19oYWxmRGlnaXQoZytrKStBKSxuLS0pO2MmJigxJmc/Qj1uPDwxNjpoLl9fc2V0RGlnaXQoZz4+PjEsQnxuKSl9cmV0dXJuIGU/KGEuX19pbnBsYWNlUmlnaHRTaGlmdChsKSxjP3txdW90aWVudDpoLHJlbWFpbmRlcjphfTphKTpjP2g6dm9pZCAwfX0se2tleTpcIl9fY2x6MTZcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gZC5fX2NsejMyKGEpLTE2fX0se2tleTpcIl9fc3BlY2lhbExlZnRTaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT1hLmxlbmd0aCxrPW5ldyBkKGUrYywhMSk7aWYoMD09PWIpe2ZvcihiPTA7YjxlO2IrKylrLl9fc2V0RGlnaXQoYixhLl9fZGlnaXQoYikpO3JldHVybiAwPGMmJmsuX19zZXREaWdpdChlLDApLGt9Zm9yKHZhciBmLGc9MCxoPTA7aDxlO2grKylmPWEuX19kaWdpdChoKSxrLl9fc2V0RGlnaXQoaCxmPDxifGcpLGc9Zj4+PjMyLWI7cmV0dXJuIDA8YyYmay5fX3NldERpZ2l0KGUsZyksa319LHtrZXk6XCJfX2xlZnRTaGlmdEJ5QWJzb2x1dGVcIixcbnZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZC5fX3RvU2hpZnRBbW91bnQoYik7aWYoMD5jKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQmlnSW50IHRvbyBiaWdcIik7Yj1jPj4+NTt2YXIgZT0zMSZjLGs9YS5sZW5ndGgsZj0wIT09ZSYmMCE9YS5fX2RpZ2l0KGstMSk+Pj4zMi1lLGc9aytiKyhmPzE6MCk7Yz1uZXcgZChnLGEuc2lnbik7aWYoMD09PWUpe2ZvcihlPTA7ZTxiO2UrKyljLl9fc2V0RGlnaXQoZSwwKTtmb3IoO2U8ZztlKyspYy5fX3NldERpZ2l0KGUsYS5fX2RpZ2l0KGUtYikpfWVsc2V7Zm9yKHZhciBoPWc9MDtoPGI7aCsrKWMuX19zZXREaWdpdChoLDApO2Zvcih2YXIgcD0wO3A8aztwKyspaD1hLl9fZGlnaXQocCksYy5fX3NldERpZ2l0KHArYixoPDxlfGcpLGc9aD4+PjMyLWU7aWYoZiljLl9fc2V0RGlnaXQoaytiLGcpO2Vsc2UgaWYoMCE9PWcpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7fXJldHVybiBjLl9fdHJpbSgpfX0se2tleTpcIl9fcmlnaHRTaGlmdEJ5QWJzb2x1dGVcIixcbnZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZT1hLnNpZ24saz1kLl9fdG9TaGlmdEFtb3VudChiKTtpZigwPmspcmV0dXJuIGQuX19yaWdodFNoaWZ0QnlNYXhpbXVtKGUpO2I9az4+PjU7dmFyIGY9MzEmayxnPWMtYjtpZigwPj1nKXJldHVybiBkLl9fcmlnaHRTaGlmdEJ5TWF4aW11bShlKTtrPSExO2lmKGUpaWYoMCE9KGEuX19kaWdpdChiKSYoMTw8ZiktMSkpaz0hMDtlbHNlIGZvcih2YXIgaD0wO2g8YjtoKyspaWYoMCE9PWEuX19kaWdpdChoKSl7az0hMDticmVha31rJiYwPT09ZiYmMD09fmEuX19kaWdpdChjLTEpJiZnKys7ZT1uZXcgZChnLGUpO2lmKDA9PT1mKWZvcihmPWI7ZjxjO2YrKyllLl9fc2V0RGlnaXQoZi1iLGEuX19kaWdpdChmKSk7ZWxzZXtnPWEuX19kaWdpdChiKT4+PmY7aD1jLWItMTtmb3IodmFyIHA9MDtwPGg7cCsrKWM9YS5fX2RpZ2l0KHArYisxKSxlLl9fc2V0RGlnaXQocCxjPDwzMi1mfGcpLGc9Yz4+PmY7ZS5fX3NldERpZ2l0KGgsZyl9cmV0dXJuIGsmJlxuKGU9ZC5fX2Fic29sdXRlQWRkT25lKGUsITAsZSkpLGUuX190cmltKCl9fSx7a2V5OlwiX19yaWdodFNoaWZ0QnlNYXhpbXVtXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ZC5fX29uZURpZ2l0KDEsITApOmQuX196ZXJvKCl9fSx7a2V5OlwiX190b1NoaWZ0QW1vdW50XCIsdmFsdWU6ZnVuY3Rpb24oYSl7aWYoMTxhLmxlbmd0aClyZXR1cm4tMTthPWEuX191bnNpZ25lZERpZ2l0KDApO3JldHVybiBhPmQuX19rTWF4TGVuZ3RoQml0cz8tMTphfX0se2tleTpcIl9fdG9QcmltaXRpdmVcIix2YWx1ZTpmdW5jdGlvbihiKXt2YXIgYz0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06XCJkZWZhdWx0XCI7aWYoXCJvYmplY3RcIiE9PWEoYil8fGIuY29uc3RydWN0b3I9PT1kKXJldHVybiBiO3ZhciBlPWJbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihlKXtjPWUoYyk7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGM7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59aWYoYz1iLnZhbHVlT2YpaWYoYz1jLmNhbGwoYiksXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGM7aWYoYz1iLnRvU3RyaW5nKWlmKGM9Yy5jYWxsKGIpLFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO319LHtrZXk6XCJfX3RvTnVtZXJpY1wiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBkLl9faXNCaWdJbnQoYSk/YTorYX19LHtrZXk6XCJfX2lzQmlnSW50XCIsdmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuXCJvYmplY3RcIj09PWEoYikmJmIuY29uc3RydWN0b3I9PT1kfX0se2tleTpcIl9fdHJ1bmNhdGVUb05CaXRzXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hKzMxPj4+NSxlPW5ldyBkKGMsYi5zaWduKTstLWM7Zm9yKHZhciBrPTA7azxjO2srKyllLl9fc2V0RGlnaXQoayxiLl9fZGlnaXQoaykpO2I9Yi5fX2RpZ2l0KGMpOzAhPSgzMSZhKSYmKGE9MzItKDMxJmEpLGI9Yjw8YT4+PlxuYSk7cmV0dXJuIGUuX19zZXREaWdpdChjLGIpLGUuX190cmltKCl9fSx7a2V5OlwiX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPU1hdGgubWluLGs9YSszMT4+PjU7Yz1uZXcgZChrLGMpO3ZhciBmPTA7LS1rO3ZhciBnPTA7Zm9yKGU9ZShrLGIubGVuZ3RoKTtmPGU7ZisrKXt2YXIgaD1iLl9fZGlnaXQoZikscD0tKDY1NTM1JmgpLWc7Zz0xJnA+Pj4xNjtoPS0oaD4+PjE2KS1nO2c9MSZoPj4+MTY7Yy5fX3NldERpZ2l0KGYsNjU1MzUmcHxoPDwxNil9Zm9yKDtmPGs7ZisrKWMuX19zZXREaWdpdChmLDB8LWcpO2I9azxiLmxlbmd0aD9iLl9fZGlnaXQoayk6MDthJj0zMTswPT09YT8oZz0tKDY1NTM1JmIpLWcsZz02NTUzNSZnfC0oYj4+PjE2KS0oMSZnPj4+MTYpPDwxNik6KGE9MzItYSxiPWI8PGE+Pj5hLGE9MTw8MzItYSxnPSg2NTUzNSZhKS0oNjU1MzUmYiktZyxnPSg2NTUzNSZnfChhPj4+MTYpLShiPj4+MTYpLSgxJmc+Pj5cbjE2KTw8MTYpJmEtMSk7cmV0dXJuIGMuX19zZXREaWdpdChrLGcpLGMuX190cmltKCl9fSx7a2V5OlwiX19kaWdpdFBvd1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPTE7MDxiOykxJmImJihkKj1hKSxiPj4+PTEsYSo9YTtyZXR1cm4gZH19XSksZH0obihBcnJheSkpO3JldHVybiBCLl9fa01heExlbmd0aD0zMzU1NDQzMixCLl9fa01heExlbmd0aEJpdHM9Qi5fX2tNYXhMZW5ndGg8PDUsQi5fX2tNYXhCaXRzUGVyQ2hhcj1bMCwwLDMyLDUxLDY0LDc1LDgzLDkwLDk2LDEwMiwxMDcsMTExLDExNSwxMTksMTIyLDEyNiwxMjgsMTMxLDEzNCwxMzYsMTM5LDE0MSwxNDMsMTQ1LDE0NywxNDksMTUxLDE1MywxNTQsMTU2LDE1OCwxNTksMTYwLDE2MiwxNjMsMTY1LDE2Nl0sQi5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQ9NSxCLl9fa0JpdHNQZXJDaGFyVGFibGVNdWx0aXBsaWVyPTE8PEIuX19rQml0c1BlckNoYXJUYWJsZVNoaWZ0LEIuX19rQ29udmVyc2lvbkNoYXJzPVwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCIuc3BsaXQoXCJcIiksXG5CLl9fa0JpdENvbnZlcnNpb25CdWZmZXI9bmV3IEFycmF5QnVmZmVyKDgpLEIuX19rQml0Q29udmVyc2lvbkRvdWJsZT1uZXcgRmxvYXQ2NEFycmF5KEIuX19rQml0Q29udmVyc2lvbkJ1ZmZlciksQi5fX2tCaXRDb252ZXJzaW9uSW50cz1uZXcgSW50MzJBcnJheShCLl9fa0JpdENvbnZlcnNpb25CdWZmZXIpLEIuX19jbHozMj12fHxmdW5jdGlvbihhKXt2YXIgYj1NYXRoLkxOMixkPU1hdGgubG9nO3JldHVybiAwPT09YT8zMjowfDMxLSgwfGQoYT4+PjApL2IpfSxCLl9faW11bD10fHxmdW5jdGlvbihhLGIpe3JldHVybiAwfGEqYn0sQn0pfSxmdW5jdGlvbihtLHEsYSl7KGZ1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZShhKXtkZWxldGUgdFthXX1mdW5jdGlvbiBmKGEpe2lmKHYpc2V0VGltZW91dChmLDAsYSk7ZWxzZXt2YXIgYj10W2FdO2lmKGIpe3Y9ITA7dHJ5e3ZhciBkPWIuY2FsbGJhY2ssaz1iLmFyZ3M7c3dpdGNoKGsubGVuZ3RoKXtjYXNlIDA6ZCgpO1xuYnJlYWs7Y2FzZSAxOmQoa1swXSk7YnJlYWs7Y2FzZSAyOmQoa1swXSxrWzFdKTticmVhaztjYXNlIDM6ZChrWzBdLGtbMV0sa1syXSk7YnJlYWs7ZGVmYXVsdDpkLmFwcGx5KGMsayl9fWZpbmFsbHl7ZShhKSx2PSExfX19fWZ1bmN0aW9uIGQoKXtEPWZ1bmN0aW9uKGEpe2IubmV4dFRpY2soZnVuY3Rpb24oKXtmKGEpfSl9fWZ1bmN0aW9uIGcoKXtpZihhLnBvc3RNZXNzYWdlJiYhYS5pbXBvcnRTY3JpcHRzKXt2YXIgYj0hMCxkPWEub25tZXNzYWdlO2Eub25tZXNzYWdlPWZ1bmN0aW9uKCl7Yj0hMX07YS5wb3N0TWVzc2FnZShcIlwiLFwiKlwiKTthLm9ubWVzc2FnZT1kO3JldHVybiBifX1mdW5jdGlvbiBuKCl7dmFyIGI9XCJzZXRJbW1lZGlhdGUkXCIrTWF0aC5yYW5kb20oKStcIiRcIixkPWZ1bmN0aW9uKGQpe2Quc291cmNlPT09YSYmXCJzdHJpbmdcIj09PXR5cGVvZiBkLmRhdGEmJjA9PT1kLmRhdGEuaW5kZXhPZihiKSYmZigrZC5kYXRhLnNsaWNlKGIubGVuZ3RoKSl9O2EuYWRkRXZlbnRMaXN0ZW5lcj9cbmEuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIixkLCExKTphLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsZCk7RD1mdW5jdGlvbihkKXthLnBvc3RNZXNzYWdlKGIrZCxcIipcIil9fWZ1bmN0aW9uIGsoKXt2YXIgYT1uZXcgTWVzc2FnZUNoYW5uZWw7YS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24oYSl7ZihhLmRhdGEpfTtEPWZ1bmN0aW9uKGIpe2EucG9ydDIucG9zdE1lc3NhZ2UoYil9fWZ1bmN0aW9uIHAoKXt2YXIgYT1CLmRvY3VtZW50RWxlbWVudDtEPWZ1bmN0aW9uKGIpe3ZhciBkPUIuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtkLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2YoYik7ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDthLnJlbW92ZUNoaWxkKGQpO2Q9bnVsbH07YS5hcHBlbmRDaGlsZChkKX19ZnVuY3Rpb24gdSgpe0Q9ZnVuY3Rpb24oYSl7c2V0VGltZW91dChmLDAsYSl9fWlmKCFhLnNldEltbWVkaWF0ZSl7dmFyIEE9MSx0PXt9LHY9ITEsQj1hLmRvY3VtZW50LFxuRCxFPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpO0U9RSYmRS5zZXRUaW1lb3V0P0U6YTtcIltvYmplY3QgcHJvY2Vzc11cIj09PXt9LnRvU3RyaW5nLmNhbGwoYS5wcm9jZXNzKT9kKCk6ZygpP24oKTphLk1lc3NhZ2VDaGFubmVsP2soKTpCJiZcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiaW4gQi5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpP3AoKTp1KCk7RS5zZXRJbW1lZGlhdGU9ZnVuY3Rpb24oYSl7XCJmdW5jdGlvblwiIT09dHlwZW9mIGEmJihhPW5ldyBGdW5jdGlvbihcIlwiK2EpKTtmb3IodmFyIGI9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxkPTA7ZDxiLmxlbmd0aDtkKyspYltkXT1hcmd1bWVudHNbZCsxXTt0W0FdPXtjYWxsYmFjazphLGFyZ3M6Yn07RChBKTtyZXR1cm4gQSsrfTtFLmNsZWFySW1tZWRpYXRlPWV9fSkoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBzZWxmP1widW5kZWZpbmVkXCI9PT10eXBlb2YgYT90aGlzOmE6c2VsZil9KS5jYWxsKHRoaXMsXG5hKDApLGEoOCkpfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoKXt0aHJvdyBFcnJvcihcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIik7fWZ1bmN0aW9uIGMoKXt0aHJvdyBFcnJvcihcImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFwiKTt9ZnVuY3Rpb24gYihiKXtpZihnPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChiLDApO2lmKChnPT09YXx8IWcpJiZzZXRUaW1lb3V0KXJldHVybiBnPXNldFRpbWVvdXQsc2V0VGltZW91dChiLDApO3RyeXtyZXR1cm4gZyhiLDApfWNhdGNoKHYpe3RyeXtyZXR1cm4gZy5jYWxsKG51bGwsYiwwKX1jYXRjaChCKXtyZXR1cm4gZy5jYWxsKHRoaXMsYiwwKX19fWZ1bmN0aW9uIGUoYSl7aWYobj09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGEpO2lmKChuPT09Y3x8IW4pJiZjbGVhclRpbWVvdXQpcmV0dXJuIG49Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChhKTt0cnl7cmV0dXJuIG4oYSl9Y2F0Y2godil7dHJ5e3JldHVybiBuLmNhbGwobnVsbCxcbmEpfWNhdGNoKEIpe3JldHVybiBuLmNhbGwodGhpcyxhKX19fWZ1bmN0aW9uIGYoKXtwJiZ1JiYocD0hMSx1Lmxlbmd0aD9rPXUuY29uY2F0KGspOkE9LTEsay5sZW5ndGgmJmwoKSl9ZnVuY3Rpb24gbCgpe2lmKCFwKXt2YXIgYT1iKGYpO3A9ITA7Zm9yKHZhciBkPWsubGVuZ3RoO2Q7KXt1PWs7Zm9yKGs9W107KytBPGQ7KXUmJnVbQV0ucnVuKCk7QT0tMTtkPWsubGVuZ3RofXU9bnVsbDtwPSExO2UoYSl9fWZ1bmN0aW9uIGgoYSxiKXt0aGlzLmZ1bj1hO3RoaXMuYXJyYXk9Yn1mdW5jdGlvbiBkKCl7fW09bS5leHBvcnRzPXt9O3RyeXt2YXIgZz1cImZ1bmN0aW9uXCI9PT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmF9Y2F0Y2godCl7Zz1hfXRyeXt2YXIgbj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDpjfWNhdGNoKHQpe249Y312YXIgaz1bXSxwPSExLHUsQT0tMTttLm5leHRUaWNrPWZ1bmN0aW9uKGEpe3ZhciBkPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtXG4xKTtpZigxPGFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKylkW2MtMV09YXJndW1lbnRzW2NdO2sucHVzaChuZXcgaChhLGQpKTsxIT09ay5sZW5ndGh8fHB8fGIobCl9O2gucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O20udGl0bGU9XCJicm93c2VyXCI7bS5icm93c2VyPSEwO20uZW52PXt9O20uYXJndj1bXTttLnZlcnNpb249XCJcIjttLnZlcnNpb25zPXt9O20ub249ZDttLmFkZExpc3RlbmVyPWQ7bS5vbmNlPWQ7bS5vZmY9ZDttLnJlbW92ZUxpc3RlbmVyPWQ7bS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZDttLmVtaXQ9ZDttLnByZXBlbmRMaXN0ZW5lcj1kO20ucHJlcGVuZE9uY2VMaXN0ZW5lcj1kO20ubGlzdGVuZXJzPWZ1bmN0aW9uKGEpe3JldHVybltdfTttLmJpbmRpbmc9ZnVuY3Rpb24oYSl7dGhyb3cgRXJyb3IoXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFwiKTt9O20uY3dkPVxuZnVuY3Rpb24oKXtyZXR1cm5cIi9cIn07bS5jaGRpcj1mdW5jdGlvbihhKXt0aHJvdyBFcnJvcihcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFwiKTt9O20udW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH19LGZ1bmN0aW9uKG0scSl7U2suYXNzZXJ0cz17fTtTay5hc3NlcnRzLmFzc2VydD1mdW5jdGlvbihhLGMpe3JldHVybiBhfTtTay5leHBvcnRTeW1ib2woXCJTay5hc3NlcnRzLmFzc2VydFwiLFNrLmFzc2VydHMuYXNzZXJ0KTtTay5hc3NlcnRzLmZhaWw9ZnVuY3Rpb24oYSl7fTtTay5leHBvcnRTeW1ib2woXCJTay5hc3NlcnRzLmZhaWxcIixTay5hc3NlcnRzLmZhaWwpfSxmdW5jdGlvbihtLHEpe1NrLmJvb2xfY2hlY2s9ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDA9PT1hfHxudWxsPT09YXx8XCJib29sZWFuXCIhPT10eXBlb2YgYSl0aHJvdyBFcnJvcihcIm11c3Qgc3BlY2lmeSBcIitjK1wiIGFuZCBpdCBtdXN0IGJlIGEgYm9vbGVhblwiKTt9O1NrLnB5dGhvbjI9e3ByaW50X2Z1bmN0aW9uOiExLFxuZGl2aXNpb246ITEsYWJzb2x1dGVfaW1wb3J0Om51bGwsdW5pY29kZV9saXRlcmFsczohMSxweXRob24zOiExLGNsYXNzX3JlcHI6ITEsaW5oZXJpdF9mcm9tX29iamVjdDohMSxzdXBlcl9hcmdzOiExLG9jdGFsX251bWJlcl9saXRlcmFsOiExLGJhbmtlcnNfcm91bmRpbmc6ITEscHl0aG9uX3ZlcnNpb246ITEsZHVuZGVyX3JvdW5kOiExLGV4Y2VwdGlvbnM6ITEsbm9fbG9uZ190eXBlOiExLGNlaWxfZmxvb3JfaW50OiExLHNpbGVudF9vY3RhbF9saXRlcmFsOiEwfTtTay5weXRob24zPXtwcmludF9mdW5jdGlvbjohMCxkaXZpc2lvbjohMCxhYnNvbHV0ZV9pbXBvcnQ6bnVsbCx1bmljb2RlX2xpdGVyYWxzOiEwLHB5dGhvbjM6ITAsY2xhc3NfcmVwcjohMCxpbmhlcml0X2Zyb21fb2JqZWN0OiEwLHN1cGVyX2FyZ3M6ITAsb2N0YWxfbnVtYmVyX2xpdGVyYWw6ITAsYmFua2Vyc19yb3VuZGluZzohMCxweXRob25fdmVyc2lvbjohMCxkdW5kZXJfcm91bmQ6ITAsZXhjZXB0aW9uczohMCxcbm5vX2xvbmdfdHlwZTohMCxjZWlsX2Zsb29yX2ludDohMCxzaWxlbnRfb2N0YWxfbGl0ZXJhbDohMX07U2suY29uZmlndXJlPWZ1bmN0aW9uKGEpe1NrLm91dHB1dD1hLm91dHB1dHx8U2sub3V0cHV0O1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5vdXRwdXQpO1NrLmZpbGV3cml0ZXI9YS5maWxld3JpdGVyfHxTay5maWxld3JpdGVyO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5maWxld3JpdGVyKTtTay5kZWJ1Z291dD1hLmRlYnVnb3V0fHxTay5kZWJ1Z291dDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZGVidWdvdXQpO1NrLnVuY2F1Z2h0RXhjZXB0aW9uPWEudW5jYXVnaHRFeGNlcHRpb258fFNrLnVuY2F1Z2h0RXhjZXB0aW9uO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay51bmNhdWdodEV4Y2VwdGlvbik7U2sucmVhZD1hLnJlYWR8fFNrLnJlYWQ7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09XG50eXBlb2YgU2sucmVhZCk7U2subm9ucmVhZG9wZW49YS5ub25yZWFkb3Blbnx8ITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2subm9ucmVhZG9wZW4pO1NrLmZpbGVvcGVuPWEuZmlsZW9wZW58fHZvaWQgMDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZW9wZW58fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgU2suZmlsZW9wZW4pO1NrLmZpbGV3cml0ZT1hLmZpbGV3cml0ZXx8dm9pZCAwO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5maWxld3JpdGV8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlKTtTay50aW1lb3V0TXNnPWEudGltZW91dE1zZ3x8U2sudGltZW91dE1zZztTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sudGltZW91dE1zZyk7U2suZXhwb3J0U3ltYm9sKFwiU2sudGltZW91dE1zZ1wiLFNrLnRpbWVvdXRNc2cpO1NrLnN5c2FyZ3Y9YS5zeXNhcmd2fHxcblNrLnN5c2FyZ3Y7U2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoU2suc3lzYXJndikpO1NrLl9fZnV0dXJlX189YS5fX2Z1dHVyZV9ffHxTay5weXRob24zO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5wcmludF9mdW5jdGlvbixcIlNrLl9fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmRpdmlzaW9uLFwiU2suX19mdXR1cmVfXy5kaXZpc2lvblwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18udW5pY29kZV9saXRlcmFscyxcIlNrLl9fZnV0dXJlX18udW5pY29kZV9saXRlcmFsc1wiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uY2xhc3NfcmVwcixcIlNrLl9fZnV0dXJlX18uY2xhc3NfcmVwclwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uaW5oZXJpdF9mcm9tX29iamVjdCxcIlNrLl9fZnV0dXJlX18uaW5oZXJpdF9mcm9tX29iamVjdFwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uc3VwZXJfYXJncyxcblwiU2suX19mdXR1cmVfXy5zdXBlcl9hcmdzXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5vY3RhbF9udW1iZXJfbGl0ZXJhbCxcIlNrLl9fZnV0dXJlX18ub2N0YWxfbnVtYmVyX2xpdGVyYWxcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmJhbmtlcnNfcm91bmRpbmcsXCJTay5fX2Z1dHVyZV9fLmJhbmtlcnNfcm91bmRpbmdcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnB5dGhvbl92ZXJzaW9uLFwiU2suX19mdXR1cmVfXy5weXRob25fdmVyc2lvblwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kLFwiU2suX19mdXR1cmVfXy5kdW5kZXJfcm91bmRcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmV4Y2VwdGlvbnMsXCJTay5fX2Z1dHVyZV9fLmV4Y2VwdGlvbnNcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLm5vX2xvbmdfdHlwZSxcIlNrLl9fZnV0dXJlX18ubm9fbG9uZ190eXBlXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5jZWlsX2Zsb29yX2ludCxcblwiU2suX19mdXR1cmVfXy5jZWlsX2Zsb29yX2ludFwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uc2lsZW50X29jdGFsX2xpdGVyYWwsXCJTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsXCIpO1NrLmltYWdlUHJveHk9YS5pbWFnZVByb3h5fHxcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8zMjB4XCI7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBTay5pbWFnZVByb3h5fHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suaW1hZ2VQcm94eSk7U2suaW5wdXRmdW49YS5pbnB1dGZ1bnx8U2suaW5wdXRmdW47U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmlucHV0ZnVuKTtTay5pbnB1dGZ1blRha2VzUHJvbXB0PWEuaW5wdXRmdW5UYWtlc1Byb21wdHx8ITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2suaW5wdXRmdW5UYWtlc1Byb21wdCk7U2sucmV0YWluR2xvYmFscz1hLnJldGFpbmdsb2JhbHN8fGEucmV0YWluR2xvYmFsc3x8XG4hMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5yZXRhaW5HbG9iYWxzKTtTay5kZWJ1Z2dpbmc9YS5kZWJ1Z2dpbmd8fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLmRlYnVnZ2luZyk7U2sua2lsbGFibGVXaGlsZT1hLmtpbGxhYmxlV2hpbGV8fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLmtpbGxhYmxlV2hpbGUpO1NrLmtpbGxhYmxlRm9yPWEua2lsbGFibGVGb3J8fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLmtpbGxhYmxlRm9yKTtTay5zaWduYWxzPWEuc2lnbmFscztTay5zaWduYWxzPSEwPT09U2suc2lnbmFscz97bGlzdGVuZXJzOltdLGFkZEV2ZW50TGlzdGVuZXIoYSl7U2suc2lnbmFscy5saXN0ZW5lcnMucHVzaChhKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcihhKXthPVNrLnNpZ25hbHMubGlzdGVuZXJzLmluZGV4T2YoYSk7MDw9YSYmU2suc2lnbmFscy5saXN0ZW5lcnMuc3BsaWNlKGEsXG4xKX0sc2lnbmFsKGEsYil7Zm9yKHZhciBjPTA7YzxTay5zaWduYWxzLmxpc3RlbmVycy5sZW5ndGg7YysrKVNrLnNpZ25hbHMubGlzdGVuZXJzW2NdLmNhbGwobnVsbCxhLGIpfX06bnVsbDtTay5hc3NlcnRzLmFzc2VydChcIm9iamVjdFwiPT09dHlwZW9mIFNrLnNpZ25hbHMpO1NrLmJyZWFrcG9pbnRzPWEuYnJlYWtwb2ludHN8fGZ1bmN0aW9uKCl7cmV0dXJuITB9O1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5icmVha3BvaW50cyk7U2suc2V0VGltZW91dD1hLnNldFRpbWVvdXQ7dm9pZCAwPT09U2suc2V0VGltZW91dCYmKFNrLnNldFRpbWVvdXQ9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/ZnVuY3Rpb24oYSxiKXtzZXRUaW1lb3V0KGEsYil9OmZ1bmN0aW9uKGEsYil7YSgpfSk7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLnNldFRpbWVvdXQpO1wiZXhlY0xpbWl0XCJpbiBhJiYoU2suZXhlY0xpbWl0PWEuZXhlY0xpbWl0KTtcblwieWllbGRMaW1pdFwiaW4gYSYmKFNrLnlpZWxkTGltaXQ9YS55aWVsZExpbWl0KTthLnN5c3BhdGgmJihTay5zeXNwYXRoPWEuc3lzcGF0aCxTay5hc3NlcnRzLmFzc2VydChTay5pc0FycmF5TGlrZShTay5zeXNwYXRoKSksU2sucmVhbHN5c3BhdGg9dm9pZCAwLFNrLnN5c21vZHVsZXM9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSkpO1NrLm1pc2NldmFsLnNvZnRzcGFjZV89ITE7U2suc3dpdGNoX3ZlcnNpb24oU2suX19mdXR1cmVfXy5weXRob24zKTtTay5idWlsdGluLnN0ci4kbmV4dD1Tay5fX2Z1dHVyZV9fLnB5dGhvbjM/bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZXh0X19cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwibmV4dFwiKTtTay5zZXR1cE9wZXJhdG9ycyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpO1NrLnNldHVwRHVuZGVyTWV0aG9kcyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpO1NrLnNldHVwT2JqZWN0cyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpO1NrLnRva2VuLnNldHVwVG9rZW5zKFNrLl9fZnV0dXJlX18ucHl0aG9uMyl9O1xuU2suZXhwb3J0U3ltYm9sKFwiU2suY29uZmlndXJlXCIsU2suY29uZmlndXJlKTtTay51bmNhdWdodEV4Y2VwdGlvbj1mdW5jdGlvbihhKXt0aHJvdyBhO307U2sudW5jYXVnaHRFeGNlcHRpb249ZnVuY3Rpb24oYSl7dGhyb3cgYTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnVuY2F1Z2h0RXhjZXB0aW9uXCIsU2sudW5jYXVnaHRFeGNlcHRpb24pO1NrLnRpbWVvdXRNc2c9ZnVuY3Rpb24oKXtyZXR1cm5cIlByb2dyYW0gZXhjZWVkZWQgcnVuIHRpbWUgbGltaXQuXCJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnRpbWVvdXRNc2dcIixTay50aW1lb3V0TXNnKTtTay5leGVjTGltaXQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1NrLnlpZWxkTGltaXQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1NrLm91dHB1dD1mdW5jdGlvbihhKXt9O1NrLnJlYWQ9ZnVuY3Rpb24oYSl7aWYodm9pZCAwPT09U2suYnVpbHRpbkZpbGVzKXRocm93XCJza3VscHQtc3RkbGliLmpzIGhhcyBub3QgYmVlbiBsb2FkZWRcIjtpZih2b2lkIDA9PT1cblNrLmJ1aWx0aW5GaWxlcy5maWxlc1thXSl0aHJvd1wiRmlsZSBub3QgZm91bmQ6ICdcIithK1wiJ1wiO3JldHVybiBTay5idWlsdGluRmlsZXMuZmlsZXNbYV19O1NrLnN5c2FyZ3Y9W107U2suZ2V0U3lzQXJndj1mdW5jdGlvbigpe3JldHVybiBTay5zeXNhcmd2fTtTay5leHBvcnRTeW1ib2woXCJTay5nZXRTeXNBcmd2XCIsU2suZ2V0U3lzQXJndik7U2suc3lzcGF0aD1bXTtTay5pbkJyb3dzZXI9dm9pZCAwIT09U2suZ2xvYmFsLmRvY3VtZW50O1NrLmRlYnVnb3V0PWZ1bmN0aW9uKGEpe307KGZ1bmN0aW9uKCl7dm9pZCAwIT09U2suZ2xvYmFsLndyaXRlPyhTay5vdXRwdXQ9U2suZ2xvYmFsLndyaXRlLFNrLmZpbGV3cml0ZXI9U2suZ2xvYmFsLndyaXRlKTp2b2lkIDAhPT1Tay5nbG9iYWwuY29uc29sZSYmdm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUubG9nPyhTay5vdXRwdXQ9ZnVuY3Rpb24oYSl7U2suZ2xvYmFsLmNvbnNvbGUubG9nKGEpfSxTay5maWxld3JpdGVyPVNrLm91dHB1dCk6XG52b2lkIDAhPT1Tay5nbG9iYWwucHJpbnQmJihTay5vdXRwdXQ9U2suZ2xvYmFsLnByaW50LFNrLmZpbGV3cml0ZXI9U2sub3V0cHV0KTt2b2lkIDAhPT1Tay5nbG9iYWwuY29uc29sZSYmdm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUubG9nP1NrLmRlYnVnb3V0PWZ1bmN0aW9uKGEpe1NrLmdsb2JhbC5jb25zb2xlLmxvZyhhKX06dm9pZCAwIT09U2suZ2xvYmFsLnByaW50JiYoU2suZGVidWdvdXQ9U2suZ2xvYmFsLnByaW50KX0pKCk7U2suaW5wdXRmdW49ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5wcm9tcHQoYSl9O1NrLnNldHVwX21ldGhvZF9tYXBwaW5ncz1mdW5jdGlvbigpe307U2suc2V0dXBEaWN0SXRlcmF0b3JzPWZ1bmN0aW9uKGEpe307U2suc3dpdGNoX3ZlcnNpb249ZnVuY3Rpb24oYSl7Y29uc3QgYz17ZmxvYXRfOnttZXRob2RfbmFtZXM6W1wiX19yb3VuZF9fXCJdLDI6WyExXSwzOlshMF19LGludF86e21ldGhvZF9uYW1lczpbXCJfX3JvdW5kX19cIl0sMjpbITFdLDM6WyEwXX0sXG5saXN0OnttZXRob2RfbmFtZXM6W1wiY2xlYXJcIixcImNvcHlcIixcInNvcnRcIl0sMjpbITEsITEsITBdLDM6WyEwLCEwLCEwXX0sZGljdDp7bWV0aG9kX25hbWVzOltcImhhc19rZXlcIixcImtleXNcIixcIml0ZW1zXCIsXCJ2YWx1ZXNcIl0sMjpbITAsITAsITAsITBdLDM6WyExLCEwLCEwLCEwXX19O2ZvcihsZXQgbCBpbiBjKXtjb25zdCBoPVNrLmJ1aWx0aW5bbF0sZD1jW2xdLm1ldGhvZF9uYW1lczt2YXIgYj1jW2xdWzNdO2lmKGEmJnZvaWQgMD09PWgucHkzJG1ldGhvZHMpYnJlYWs7ZWxzZSBpZih2b2lkIDA9PT1oLnB5MyRtZXRob2RzKXtoLnB5MyRtZXRob2RzPXt9O2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1kW2VdO2JbZV0mJihoLnB5MyRtZXRob2RzW2ZdPWgucHJvdG90eXBlW2ZdLmQkZGVmKX19YT9lPWgucHkzJG1ldGhvZHM6KGI9Y1tsXVsyXSxlPWgucHkyJG1ldGhvZHMpO2ZvcihmPTA7ZjxkLmxlbmd0aDtmKyspe2NvbnN0IGE9ZFtmXTtkZWxldGUgaC5wcm90b3R5cGVbYV07XG5iW2ZdJiYoaC5wcm90b3R5cGVbYV09bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IoaCxlW2FdKSl9fX07U2suZXhwb3J0U3ltYm9sKFwiU2suX19mdXR1cmVfX1wiLFNrLl9fZnV0dXJlX18pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmlucHV0ZnVuXCIsU2suaW5wdXRmdW4pfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIHRoaXMucHJvdG90eXBlW2EuJG1hbmdsZWRdfWZ1bmN0aW9uIGMoYSl7YT1hLiRtYW5nbGVkO2NvbnN0IGI9dGhpcy5wcm90b3R5cGUudHAkbXJvO2ZvcihsZXQgZD0wO2Q8Yi5sZW5ndGg7KytkKXtjb25zdCBjPWJbZF0ucHJvdG90eXBlO2lmKGMuaGFzT3duUHJvcGVydHkoYSkpcmV0dXJuIGNbYV19fWZ1bmN0aW9uIGIoYixmLGgsayl7Y29uc3QgZD1lKGgpLGc9Zi5wcm90b3R5cGU7U2suYWJzdHIuc2V0VXBJbmhlcml0YW5jZShiLGYsZCxrKTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhnLHtzayRwcm90b3R5cGljYWw6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfSxcbnRwJGJhc2VzOnt2YWx1ZTpoLHdyaXRhYmxlOiEwfSx0cCRtcm86e3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9LGhwJHR5cGU6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfX0pO2cudHAkbXJvPWYuJGJ1aWxkTVJPKCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZix7JHR5cGVMb29rdXA6e3ZhbHVlOmcuc2skcHJvdG90eXBpY2FsP2E6Yyx3cml0YWJsZTohMH0sc2ska2xhc3M6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfX0pfWZ1bmN0aW9uIGUoYSl7ZnVuY3Rpb24gYihhKXtyZXR1cm4gdm9pZCAwPT09YS5zayRrbGFzcz9hOmIoYS5wcm90b3R5cGUudHAkYmFzZSl9MD09PWEubGVuZ3RoJiZhLnB1c2goU2suYnVpbHRpbi5vYmplY3QpO2xldCBkLGMsZSxmO2ZvcihsZXQgaz0wO2s8YS5sZW5ndGg7aysrKXtmPWFba107aWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhmKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYXNlcyBtdXN0IGJlICd0eXBlJyBvYmplY3RzXCIpO2lmKCExPT09XG5mLnNrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzcyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlICdcIitmLnByb3RvdHlwZS50cCRuYW1lK1wiJyBpcyBub3QgYW4gYWNjZXB0YWJsZSBiYXNlIHR5cGVcIik7ZT1iKGYpO2lmKHZvaWQgMD09PWMpYz1lLGQ9ZjtlbHNlIGlmKCFjLiRpc1N1YlR5cGUoZSkpaWYoZS4kaXNTdWJUeXBlKGMpKWM9ZSxkPWY7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtdWx0aXBsZSBiYXNlcyBoYXZlIGluc3RhbmNlIGxheW91dCBjb25mbGljdHNcIik7fXJldHVybiBkfWZ1bmN0aW9uIGYoYSl7Zm9yKDtudWxsIT09YS5wcm90b3R5cGUudHAkYmFzZTspe2lmKHZvaWQgMD09PWEuc2ska2xhc3MmJmEucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwiX19kaWN0X19cIikpcmV0dXJuIGE9YS5wcm90b3R5cGUuX19kaWN0X18sU2suYnVpbHRpbi5jaGVja0RhdGFEZXNjcihhKT9hOnZvaWQgMDthPWEucHJvdG90eXBlLnRwJGJhc2V9fVxuZnVuY3Rpb24gbChhLGIsYyl7aWYodm9pZCAwPT09YS5zayRrbGFzcyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBzZXQgXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIi5cIitjLiRqc3N0cigpKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGRlbGV0ZSBcIithLnByb3RvdHlwZS50cCRuYW1lK1wiLlwiK2MuJGpzc3RyKCkpO312b2lkIDA9PT1Tay5idWlsdGluJiYoU2suYnVpbHRpbj17fSk7U2suYnVpbHRpbi50eXBlPWZ1bmN0aW9uKGEpe3RoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR5cGUmJlNrLmFzc2VydHMuZmFpbChcImNhbGxpbmcgbmV3IFNrLmJ1aWx0aW4udHlwZSBpcyBub3Qgc2FmZVwiKTtyZXR1cm4gYS5vYiR0eXBlfTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhTay5idWlsdGluLnR5cGUucHJvdG90eXBlLHtjYWxsOnt2YWx1ZTpGdW5jdGlvbi5wcm90b3R5cGUuY2FsbH0sYXBwbHk6e3ZhbHVlOkZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseX0sXG50cCRzbG90czp7dmFsdWU6e3RwJGRvYzpcInR5cGUob2JqZWN0X29yX25hbWUsIGJhc2VzLCBkaWN0KVxcbnR5cGUob2JqZWN0KSAtPiB0aGUgb2JqZWN0J3MgdHlwZVxcbnR5cGUobmFtZSwgYmFzZXMsIGRpY3QpIC0+IGEgbmV3IHR5cGVcIix0cCRjYWxsOmZ1bmN0aW9uKGEsYil7aWYodGhpcz09PVNrLmJ1aWx0aW4udHlwZSl7aWYoMT09PWEubGVuZ3RoJiYodm9pZCAwPT09Ynx8IWIubGVuZ3RoKSlyZXR1cm4gYVswXS5vYiR0eXBlO2lmKDMhPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgdGFrZXMgMSBvciAzIGFyZ3VtZW50c1wiKTt9bGV0IGQ9dGhpcy5wcm90b3R5cGUudHAkbmV3KGEsYik7aWYoZC4kaXNTdXNwZW5zaW9uKXJldHVybiBTay5taXNjZXZhbC5jaGFpbihkLGM9PntkPWM7aWYoZC5vYiR0eXBlLiRpc1N1YlR5cGUodGhpcykpcmV0dXJuIGQudHAkaW5pdChhLGIpfSwoKT0+ZCk7aWYoZC5vYiR0eXBlLiRpc1N1YlR5cGUodGhpcykpe2NvbnN0IGM9XG5kLnRwJGluaXQoYSxiKTtyZXR1cm4gdm9pZCAwIT09YyYmYy4kaXNTdXNwZW5zaW9uP1NrLm1pc2NldmFsLmNoYWluKGMsKCk9PmQpOmR9cmV0dXJuIGR9LHRwJG5ldzpmdW5jdGlvbihhLGMpe2lmKDMhPT1hLmxlbmd0aCl7aWYoMT09PWEubGVuZ3RoJiYodm9pZCAwPT09Y3x8IWMubGVuZ3RoKSlyZXR1cm4gYVswXS5vYiR0eXBlO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR5cGUoKSB0YWtlcyAxIG9yIDMgYXJndW1lbnRzXCIpO31sZXQgZDtjPWFbMF07ZD1hWzFdO2E9YVsyXTtpZihcImRpY3RcIiE9PWEudHAkbmFtZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgYXJndW1lbnQgMyBtdXN0IGJlIGRpY3QsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIGFyZ3VtZW50IDEgbXVzdCBiZSBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShjKSk7XG5jPWMuJGpzc3RyKCk7aWYoXCJ0dXBsZVwiIT09ZC50cCRuYW1lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR5cGUoKSBhcmd1bWVudCAyIG11c3QgYmUgdHVwbGUsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShkKSk7ZD1kLnNrJGFzYXJyYXkoKTtjb25zdCBlPWZ1bmN0aW9uKCl7dGhpcy4kZD1uZXcgU2suYnVpbHRpbi5kaWN0fTtiKGMsZSxkLHRoaXMuY29uc3RydWN0b3IpO1NrLmdsb2JhbHMmJihlLnByb3RvdHlwZS5fX21vZHVsZV9fPVNrLmdsb2JhbHMuX19uYW1lX18pO2UucHJvdG90eXBlLl9fZG9jX189U2suYnVpbHRpbi5ub25lLm5vbmUkO3ZvaWQgMD09PWUuJHR5cGVMb29rdXAoU2suYnVpbHRpbi5zdHIuJGRpY3QpJiYoZS5wcm90b3R5cGUuX19kaWN0X189bmV3IFNrLmJ1aWx0aW4uZ2V0c2V0X2Rlc2NyaXB0b3IoZSxoKSk7YS4kaXRlbXMoKS5mb3JFYWNoKChbYSxiXSk9PntlLnByb3RvdHlwZVthLiRtYW5nbGVkXT1ifSk7ZS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJfX25ld19fXCIpJiZcbihhPWUucHJvdG90eXBlLl9fbmV3X18sYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZnVuYyYmKGUucHJvdG90eXBlLl9fbmV3X189bmV3IFNrLmJ1aWx0aW4uc3RhdGljbWV0aG9kKGEpKSk7ZS4kYWxsb2NhdGVTbG90cygpO3JldHVybiBlfSx0cCRnZXRhdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dGhpcy5vYiR0eXBlO2NvbnN0IGM9ZC4kdHlwZUxvb2t1cChhKTtsZXQgZTtpZih2b2lkIDAhPT1jJiYoZT1jLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1lJiZ2b2lkIDAhPT1jLnRwJGRlc2NyX3NldCkpcmV0dXJuIGI9ZS5jYWxsKGMsdGhpcyxkLGIpO2E9dGhpcy4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1hKXJldHVybiBkPWEudHAkZGVzY3JfZ2V0LHZvaWQgMCE9PWQ/Yj1kLmNhbGwoYSxudWxsLHRoaXMsYik6YTtpZih2b2lkIDAhPT1lKXJldHVybiBiPWUuY2FsbChjLHRoaXMsZCxiKTtpZih2b2lkIDAhPT1jKXJldHVybiBjfSx0cCRzZXRhdHRyOmZ1bmN0aW9uKGEsYixjKXtpZighdGhpcy5zayRrbGFzcyl7aWYodm9pZCAwIT09XG5iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHNldCBhdHRyaWJ1dGVzIG9mIGJ1aWx0LWluL2V4dGVuc2lvbiB0eXBlICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJ1wiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBkZWxldGUgYXR0cmlidXRlcyBvbiB0eXBlIG9iamVjdCAnXCIrdGhpcy5wcm90b3R5cGUudHAkbmFtZStcIidcIik7fWNvbnN0IGQ9dGhpcy5vYiR0eXBlLiR0eXBlTG9va3VwKGEpO2lmKHZvaWQgMCE9PWQpe2NvbnN0IGE9ZC50cCRkZXNjcl9zZXQ7aWYoYSlyZXR1cm4gYS5jYWxsKGQsdGhpcyxiLGMpfWM9YS4kbWFuZ2xlZDtpZih2b2lkIDA9PT1iKWlmKGI9dGhpcy5wcm90b3R5cGUsYi5oYXNPd25Qcm9wZXJ0eShjKSlkZWxldGUgYltjXSxhPVNrLmR1bmRlclRvU2t1bHB0W2NdLHZvaWQgMCE9PWEmJihkZWxldGUgdGhpcy5wcm90b3R5cGVbYV0sYi5zayRwcm90b3R5cGljYWx8fHRoaXMuJGFsbG9jYXRlR2V0dGVyU2xvdChjKSk7XG5lbHNlIHRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwidHlwZSBvYmplY3QgJ1wiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInIGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2EuJGpzc3RyKCkrXCInXCIpO2Vsc2UgdGhpcy5wcm90b3R5cGVbY109YixjIGluIFNrLmR1bmRlclRvU2t1bHB0JiZ0aGlzLiRhbGxvY2F0ZVNsb3QoYyxiKX0sJHI6ZnVuY3Rpb24oKXtsZXQgYT10aGlzLnByb3RvdHlwZS5fX21vZHVsZV9fLGI9XCJcIixjPVwiY2xhc3NcIjthJiZTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpP2I9YS52K1wiLlwiOmE9bnVsbDthfHx0aGlzLnNrJGtsYXNzfHxTay5fX2Z1dHVyZV9fLmNsYXNzX3JlcHJ8fChjPVwidHlwZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPFwiK2MrXCIgJ1wiK2IrdGhpcy5wcm90b3R5cGUudHAkbmFtZStcIic+XCIpfX0sd3JpdGFibGU6ITB9LHRwJG1ldGhvZHM6e3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9LHRwJGdldHNldHM6e3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9LFxuc2skdHlwZTp7dmFsdWU6ITB9LCRpc1N1YlR5cGU6e3ZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzPT09YXx8dGhpcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBhfHwhdGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsJiZ0aGlzLnByb3RvdHlwZS50cCRtcm8uaW5jbHVkZXMoYSl9fSwkYWxsb2NhdGVTbG90Ont2YWx1ZTpmdW5jdGlvbihhLGIpe2E9U2suc2xvdHNbYV07Y29uc3QgYz1hLiRzbG90X25hbWUsZD10aGlzLnByb3RvdHlwZTtkLmhhc093blByb3BlcnR5KGMpJiZkZWxldGUgZFtjXTtkW2NdPWEuJHNsb3RfZnVuYyhiKX19LCRhbGxvY2F0ZVNsb3RzOnt2YWx1ZTpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5wcm90b3R5cGU7dGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsP09iamVjdC5rZXlzKGEpLmZvckVhY2goYj0+e2IgaW4gU2suc2xvdHMmJnRoaXMuJGFsbG9jYXRlU2xvdChiLGFbYl0pfSk6T2JqZWN0LmtleXMoU2suc2xvdHMpLmZvckVhY2goYj0+e2EuaGFzT3duUHJvcGVydHkoYik/XG50aGlzLiRhbGxvY2F0ZVNsb3QoYixhW2JdKTp0aGlzLiRhbGxvY2F0ZUdldHRlclNsb3QoYil9KX19LCRhbGxvY2F0ZUdldHRlclNsb3Q6e3ZhbHVlOmZ1bmN0aW9uKGEpe2NvbnN0IGI9U2suc2xvdHNbYV0uJHNsb3RfbmFtZSxjPXRoaXMucHJvdG90eXBlO2MuaGFzT3duUHJvcGVydHkoYil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLGIse2NvbmZpZ3VyYWJsZTohMCxnZXQoKXtjb25zdCBhPWMudHAkbXJvO2ZvcihsZXQgYz0xO2M8YS5sZW5ndGg7YysrKXtjb25zdCBkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYVtjXS5wcm90b3R5cGUsYik7aWYodm9pZCAwIT09ZCYmZC52YWx1ZSlyZXR1cm4gZC52YWx1ZX19fSl9fSwkdHlwZUxvb2t1cDp7dmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbD90aGlzLnByb3RvdHlwZVthLiRtYW5nbGVkXTpjLmNhbGwodGhpcyxhKX0sd3JpdGFibGU6ITB9LCRtcm9NZXJnZTp7dmFsdWU6ZnVuY3Rpb24oYSl7dGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsPVxuITA7bGV0IGI7Y29uc3QgYz1bXTtmb3IoOzspe2ZvcihiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBkPWFbYl07aWYoMCE9PWQubGVuZ3RoKWJyZWFrfWlmKGI9PT1hLmxlbmd0aClyZXR1cm4gYzt2YXIgZT1bXTtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWlmKGQ9YVtiXSwwIT09ZC5sZW5ndGgpe2NvbnN0IGI9ZFswXTtkPTA7YTpmb3IoO2Q8YS5sZW5ndGg7KytkKXtjb25zdCBjPWFbZF07Zm9yKGxldCBhPTE7YTxjLmxlbmd0aDsrK2EpaWYoY1thXT09PWIpYnJlYWsgYX1kPT09YS5sZW5ndGgmJmUucHVzaChiKX1pZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiSW5jb25zaXN0ZW50IHByZWNlZGVuY2VzIGluIHR5cGUgaGllcmFyY2h5XCIpO2U9ZVswXTtjLmxlbmd0aCYmdGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoY1tjLmxlbmd0aC0xXS5wcm90b3R5cGUpIT09ZS5wcm90b3R5cGUmJih0aGlzLnByb3RvdHlwZS5zayRwcm90b3R5cGljYWw9XG4hMSk7Yy5wdXNoKGUpO2ZvcihiPTA7YjxhLmxlbmd0aDsrK2IpZD1hW2JdLDA8ZC5sZW5ndGgmJmRbMF09PT1lJiZkLnNwbGljZSgwLDEpfX19LCRidWlsZE1STzp7dmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBhPVtbdGhpc11dLGI9dGhpcy5wcm90b3R5cGUudHAkYmFzZXM7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDsrK2MpYS5wdXNoKFsuLi5iW2NdLnByb3RvdHlwZS50cCRtcm9dKTtjPVtdO2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7KythKWMucHVzaChiW2FdKTthLnB1c2goYyk7cmV0dXJuIHRoaXMuJG1yb01lcmdlKGEpfX0sc2skYXR0ckVycm9yOnt2YWx1ZSgpe3JldHVyblwidHlwZSBvYmplY3QgJ1wiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInXCJ9LHdyaXRhYmxlOiEwfX0pO1NrLmJ1aWx0aW4udHlwZS5wcm90b3R5cGUudHAkZ2V0c2V0cz17X19iYXNlX186eyRnZXQoKXtyZXR1cm4gdGhpcy5wcm90b3R5cGUudHAkYmFzZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19iYXNlc19fOnskZ2V0KCl7dm9pZCAwPT09XG50aGlzLnNrJHR1cGxlX2Jhc2VzJiYodGhpcy5zayR0dXBsZV9iYXNlcz1uZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnByb3RvdHlwZS50cCRiYXNlcykpO3JldHVybiB0aGlzLnNrJHR1cGxlX2Jhc2VzfX0sX19tcm9fXzp7JGdldCgpe3ZvaWQgMD09PXRoaXMuc2skdHVwbGVfbXJvJiYodGhpcy5zayR0dXBsZV9tcm89bmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy5wcm90b3R5cGUudHAkbXJvKSk7cmV0dXJuIHRoaXMuc2skdHVwbGVfbXJvfX0sX19kaWN0X186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5KHRoaXMucHJvdG90eXBlKX19LF9fZG9jX186eyRnZXQoKXtjb25zdCBhPXRoaXMuJHR5cGVMb29rdXAoU2suYnVpbHRpbi5zdHIuJGRvYyk7cmV0dXJuIGE/dm9pZCAwIT09YS50cCRkZXNjcl9nZXQ/dGhpcz09PVNrLmJ1aWx0aW4udHlwZT9uZXcgU2suYnVpbHRpbi5zdHIodGhpcy5wcm90b3R5cGUudHAkZG9jKTphLnRwJGRlc2NyX2dldChudWxsLFxudGhpcyk6dGhpcy5wcm90b3R5cGUuX19kb2NfXzpTay5idWlsdGluLm5vbmUubm9uZSR9LCRzZXQoYSl7bCh0aGlzLGEsU2suYnVpbHRpbi5zdHIuJGRvYyk7dGhpcy5wcm90b3R5cGUuX19kb2NfXz1hfX0sX19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMucHJvdG90eXBlLnRwJG5hbWUpfSwkc2V0KGEpe2wodGhpcyxhLFNrLmJ1aWx0aW4uc3RyLiRuYW1lKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4gb25seSBhc3NpZ24gc3RyaW5nIHRvIFwiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCIuX19uYW1lX18sIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO3RoaXMucHJvdG90eXBlLnRwJG5hbWU9YS4kanNzdHIoKX19LF9fbW9kdWxlX186eyRnZXQoKXtsZXQgYT10aGlzLnByb3RvdHlwZS5fX21vZHVsZV9fO3JldHVybiBhJiZhLm9iJHR5cGUhPT1Tay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yP1xuYTpuZXcgU2suYnVpbHRpbi5zdHIoXCJidWlsdGluc1wiKX0sJHNldChhKXtsKHRoaXMsYSxTay5idWlsdGluLnN0ci4kbW9kdWxlKTt0aGlzLnByb3RvdHlwZS5fX21vZHVsZV9fPWF9fX07U2suYnVpbHRpbi50eXBlLnByb3RvdHlwZS50cCRtZXRob2RzPXttcm86eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kYnVpbGRNUk8oKSl9LCRmbGFnczp7Tm9BcmdzOiEwfX0sX19kaXJfXzp7JG1ldGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2EgaW4gU2sucmVzZXJ2ZWRXb3Jkc198fChhPVNrLnVuZml4UmVzZXJ2ZWQoYSksLTEhPT1hLmluZGV4T2YoXCIkXCIpfHxiLmhhcyhhKXx8KGIuYWRkKGEpLGMucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYSkpKSl9Y29uc3QgYj1uZXcgU2V0LGM9W107aWYodGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsKWZvcih2YXIgZSBpbiB0aGlzLnByb3RvdHlwZSlhKGUpO2Vsc2V7ZT10aGlzLnByb3RvdHlwZS50cCRtcm87Zm9yKGxldCBiPVxuMDtiPGUubGVuZ3RoO2IrKyl7Y29uc3QgYz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlW2JdLnByb3RvdHlwZSk7Zm9yKGxldCBiPTA7YjxjLmxlbmd0aDtiKyspYShjW2JdKX19cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiU3BlY2lhbGl6ZWQgX19kaXJfXyBpbXBsZW1lbnRhdGlvbiBmb3IgdHlwZXMuXCJ9fTtjb25zdCBoPXskZ2V0KCl7Y29uc3QgYT1mKHRoaXMub2IkdHlwZSk7cmV0dXJuIHZvaWQgMCE9PWE/YS50cCRkZXNjcl9nZXQodGhpcyx0aGlzLm9iJHR5cGUpOlNrLmdlbmVyaWMuZ2V0U2V0RGljdC4kZ2V0LmNhbGwodGhpcyl9LCRzZXQoYSl7Y29uc3QgYj1mKHRoaXMub2IkdHlwZSk7cmV0dXJuIHZvaWQgMCE9PWI/Yi50cCRkZXNjcl9zZXQodGhpcyxhKTpTay5nZW5lcmljLmdldFNldERpY3QuJHNldC5jYWxsKHRoaXMsYSl9LCRkb2M6XCJkaWN0aW9uYXJ5IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMgKGlmIGRlZmluZWQpXCIsXG4kbmFtZTpcIl9fZGljdF9fXCJ9fSxmdW5jdGlvbihtLHEpe1NrLmdlbmVyaWM9e307U2suZ2VuZXJpYy5nZXRBdHRyPWZ1bmN0aW9uKGEsYyl7bGV0IGI7Y29uc3QgZT10aGlzLm9iJHR5cGUsZj1lLiR0eXBlTG9va3VwKGEpO2lmKHZvaWQgMCE9PWYmJihiPWYudHAkZGVzY3JfZ2V0LHZvaWQgMCE9PWImJnZvaWQgMCE9PWYudHAkZGVzY3Jfc2V0KSlyZXR1cm4gYi5jYWxsKGYsdGhpcyxlLGMpO2NvbnN0IGw9dGhpcy4kZDtpZih2b2lkIDAhPT1sJiYoYT1sLnF1aWNrJGxvb2t1cChhKSx2b2lkIDAhPT1hKSlyZXR1cm4gYTtpZih2b2lkIDAhPT1iKXJldHVybiBiLmNhbGwoZix0aGlzLGUsYyk7aWYodm9pZCAwIT09ZilyZXR1cm4gZn07U2suZXhwb3J0U3ltYm9sKFwiU2suZ2VuZXJpYy5nZXRBdHRyXCIsU2suZ2VuZXJpYy5nZXRBdHRyKTtTay5nZW5lcmljLnNldEF0dHI9ZnVuY3Rpb24oYSxjLGIpe3ZhciBlPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1lJiZudWxsIT09XG5lKXtjb25zdCBhPWUudHAkZGVzY3Jfc2V0O2lmKGEpcmV0dXJuIGEuY2FsbChlLHRoaXMsYyxiKX1iPXRoaXMuJGQ7aWYodm9pZCAwIT09YilpZihiLm1wJGFzc19zdWJzY3JpcHQpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGIubXAkYXNzX3N1YnNjcmlwdChhLGMpO3RyeXtyZXR1cm4gYi5tcCRhc3Nfc3Vic2NyaXB0KGEpfWNhdGNoKGYpe2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLktleUVycm9yKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnXCIrYS4kanNzdHIoKStcIidcIik7dGhyb3cgZjt9fWVsc2UgaWYoXCJvYmplY3RcIj09PXR5cGVvZiBiKXtlPWEuJG1hbmdsZWQ7aWYodm9pZCAwIT09Yyl7YltlXT1jO3JldHVybn1pZih2b2lkIDAhPT1iW2VdKXtkZWxldGUgYltlXTtyZXR1cm59fXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKHRoaXMuc2skYXR0ckVycm9yKCkrXG5cIiBoYXMgbm8gYXR0cmlidXRlICdcIithLiRqc3N0cigpK1wiJ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmdlbmVyaWMuc2V0QXR0clwiLFNrLmdlbmVyaWMuc2V0QXR0cik7U2suZ2VuZXJpYy5uZXc9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGMsYil7aWYodGhpcy5jb25zdHJ1Y3Rvcj09PWEpcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yO2M9bmV3IHRoaXMuY29uc3RydWN0b3I7YS5jYWxsKGMpO3JldHVybiBjfX07U2suZ2VuZXJpYy5uZXdNZXRob2REZWY9eyRtZXRoKGEsYyl7Y29uc3QgYj10aGlzLnByb3RvdHlwZTtpZigxPmEubGVuZ3RoKXRocm93IGE9Yi50cCRuYW1lLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiLl9fbmV3X18oKTogbm90IGVub3VnaCBhcmd1bWVudHNcIik7dmFyIGU9YS5zaGlmdCgpO2lmKHZvaWQgMD09PWUuc2skdHlwZSl0aHJvdyBhPWIudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIl9fbmV3X18oWCk6IFggaXMgbm90IGEgdHlwZSBvYmplY3QgKFwiK1xuU2suYWJzdHIudHlwZU5hbWUoZSkrXCIpXCIpO2lmKCFlLiRpc1N1YlR5cGUodGhpcykpdGhyb3cgYT1iLnRwJG5hbWUsZT1lLnByb3RvdHlwZS50cCRuYW1lLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiLl9fbmV3X18oXCIrZStcIik6IFwiK2UrXCIgaXMgbm90IGEgc3VidHlwZSBvZiBcIithKTtjb25zdCBmPWUucHJvdG90eXBlLnNrJHN0YXRpY05ldy5wcm90b3R5cGU7aWYoZi50cCRuZXchPT1iLnRwJG5ldyl0aHJvdyBhPWIudHAkbmFtZSxlPWUucHJvdG90eXBlLnRwJG5hbWUsbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIuX19uZXdfXyhcIitlK1wiKSBpcyBub3Qgc2FmZSwgdXNlIFwiK2YudHAkbmFtZStcIi5fX25ld19fKClcIik7cmV0dXJuIGIudHAkbmV3LmNhbGwoZS5wcm90b3R5cGUsYSxjKX0sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6XCIoJHR5cGUsICphcmdzLCAqKmt3YXJncylcIiwkbmFtZTpcIl9fbmV3X19cIn07U2suZ2VuZXJpYy5zZWxmSXRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtcblNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXlDaGVja1NpemU9ZnVuY3Rpb24oKXtpZih0aGlzLiRzZXEubGVuZ3RoIT09dGhpcy4kb3JpZy5nZXQkc2l6ZSgpKXtjb25zdCBhPXRoaXMudHAkbmFtZS5zcGxpdChcIl9cIilbMF07dGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKGErXCIgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb25cIik7fWlmKCEodGhpcy4kaW5kZXg+PXRoaXMuJHNlcS5sZW5ndGgpKXJldHVybiB0aGlzLiRzZXFbdGhpcy4kaW5kZXgrK119O1NrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXk9ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXTt2b2lkIDA9PT1hJiYodGhpcy50cCRpdGVybmV4dD0oKT0+e30pO3JldHVybiBhfTtTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmPXskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJHNlcS5sZW5ndGgtdGhpcy4kaW5kZXgpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfX07U2suZ2VuZXJpYy5pdGVyUmV2ZXJzZUxlbmd0aEhpbnRNZXRob2REZWY9eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy4kaW5kZXgpfSwkZmxhZ3M6e05vQXJnczohMH19O1NrLmdlbmVyaWMuZ2V0U2V0RGljdD17JGdldCgpe3JldHVybiB0aGlzLiRkfSwkc2V0KGEpe2lmKHZvaWQgMD09PWEpdGhpcy4kZD1uZXcgU2suYnVpbHRpbi5kaWN0O2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCl0aGlzLiRkPWE7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2RpY3RfXyBtdXN0IGJlIHNldCB0byBhIGRpY3Rpb25hcnksIG5vdCBhICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fSwkZG9jOlwiZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKVwiLCRuYW1lOlwiX19kaWN0X19cIn07U2suZ2VuZXJpYy5zZXFDb21wYXJlPWZ1bmN0aW9uKGEsXG5jKXtpZih0aGlzPT09YSYmU2subWlzY2V2YWwub3BBbGxvd3NFcXVhbGl0eShjKSlyZXR1cm4hMDtpZighKGEgaW5zdGFuY2VvZiB0aGlzLnNrJGJ1aWx0aW5CYXNlKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7Y29uc3QgYj10aGlzLnY7YT1hLnY7bGV0IGU7aWYoYi5sZW5ndGghPT1hLmxlbmd0aCYmKFwiRXFcIj09PWN8fFwiTm90RXFcIj09PWMpKXJldHVyblwiRXFcIj09PWM/ITE6ITA7Zm9yKGU9MDtlPGIubGVuZ3RoJiZlPGEubGVuZ3RoJiYoYltlXT09PWFbZV18fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiW2VdLGFbZV0sXCJFcVwiKSk7KytlKTtjb25zdCBmPWIubGVuZ3RoLGw9YS5sZW5ndGg7aWYoZT49Znx8ZT49bClzd2l0Y2goYyl7Y2FzZSBcIkx0XCI6cmV0dXJuIGY8bDtjYXNlIFwiTHRFXCI6cmV0dXJuIGY8PWw7Y2FzZSBcIkVxXCI6cmV0dXJuIGY9PT1sO2Nhc2UgXCJOb3RFcVwiOnJldHVybiBmIT09bDtjYXNlIFwiR3RcIjpyZXR1cm4gZj5cbmw7Y2FzZSBcIkd0RVwiOnJldHVybiBmPj1sO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKCl9cmV0dXJuXCJFcVwiPT09Yz8hMTpcIk5vdEVxXCI9PT1jPyEwOlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiW2VdLGFbZV0sYyl9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3M9ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe2M9Yy5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9SW5maW5pdHkpO2YmJi0tYztsJiYtLWM7aWYoYzxifHxjPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChiPT09ZT9hK1wiKCkgdGFrZXMgZXhhY3RseSBcIitiK1wiIGFyZ3VtZW50c1wiOmM8Yj9hK1wiKCkgdGFrZXMgYXQgbGVhc3QgXCIrYitcIiBhcmd1bWVudHNcIjowPGI/YStcIigpIHRha2VzIGF0IG1vc3QgXCIrZStcIiBhcmd1bWVudHNcIjphK1wiKCkgdGFrZXMgbm8gYXJndW1lbnRzXCIpKyhcIiAoXCIrYytcIiBnaXZlbilcIikpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5weUNoZWNrQXJnc1wiLFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3MpO1xuU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbj1mdW5jdGlvbihhLGMsYixlLGYsbCl7dm9pZCAwPT09ZSYmKGU9SW5maW5pdHkpO2YmJi0tYztsJiYtLWM7aWYoYzxifHxjPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChiPT09ZT9hK1wiKCkgdGFrZXMgZXhhY3RseSBcIitiK1wiIGFyZ3VtZW50c1wiOmM8Yj9hK1wiKCkgdGFrZXMgYXQgbGVhc3QgXCIrYitcIiBhcmd1bWVudHNcIjphK1wiKCkgdGFrZXMgYXQgbW9zdCBcIitlK1wiIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2MrXCIgZ2l2ZW4pXCIpKTt9O1NrLmJ1aWx0aW4ucHlDaGVja1R5cGU9ZnVuY3Rpb24oYSxjLGIpe2lmKCFiKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiIG11c3QgYmUgYSBcIitjKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ucHlDaGVja1R5cGVcIixTay5idWlsdGluLnB5Q2hlY2tUeXBlKTtTay5idWlsdGluLmNoZWNrU2VxdWVuY2U9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJnZvaWQgMCE9PWEubXAkc3Vic2NyaXB0fTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZVwiLFNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZSk7U2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hPyExOmEudHAkaXRlcj92b2lkIDAhPT1hLnRwJGl0ZXIoKS50cCRpdGVybmV4dDp2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlXCIsU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKTtTay5idWlsdGluLmNoZWNrQ2FsbGFibGU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJnZvaWQgMCE9PWEudHAkY2FsbH07U2suYnVpbHRpbi5jaGVja051bWJlcj1mdW5jdGlvbihhKXtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGF8fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrTnVtYmVyXCIsXG5Tay5idWlsdGluLmNoZWNrTnVtYmVyKTtTay5idWlsdGluLmNoZWNrQ29tcGxleD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uY29tcGxleH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0NvbXBsZXhcIixTay5idWlsdGluLmNoZWNrQ29tcGxleCk7U2suYnVpbHRpbi5jaGVja0ludD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8XCJudW1iZXJcIj09PXR5cGVvZiBhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrSW50XCIsU2suYnVpbHRpbi5jaGVja0ludCk7U2suYnVpbHRpbi5jaGVja0Zsb2F0PWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF99O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tGbG9hdFwiLFNrLmJ1aWx0aW4uY2hlY2tGbG9hdCk7U2suYnVpbHRpbi5jaGVja1N0cmluZz1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0cn07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja1N0cmluZ1wiLFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcpO1NrLmJ1aWx0aW4uY2hlY2tCeXRlcz1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXN9O1NrLmJ1aWx0aW4uY2hlY2tDbGFzcz1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHlwZX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0NsYXNzXCIsU2suYnVpbHRpbi5jaGVja0NsYXNzKTtTay5idWlsdGluLmNoZWNrQm9vbD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYm9vbH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0Jvb2xcIixTay5idWlsdGluLmNoZWNrQm9vbCk7U2suYnVpbHRpbi5jaGVja05vbmU9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSR9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tOb25lXCIsXG5Tay5idWlsdGluLmNoZWNrTm9uZSk7U2suYnVpbHRpbi5jaGVja0Z1bmN0aW9uPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLnRwJGNhbGx9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvblwiLFNrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbik7U2suYnVpbHRpbi5jaGVja0RhdGFEZXNjcj1mdW5jdGlvbihhKXtyZXR1cm4gYSYmdm9pZCAwIT09YS50cCRkZXNjcl9zZXR9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3JcIixTay5idWlsdGluLmNoZWNrRGF0YURlc2NyKTtTay5idWlsdGluLmNoZWNrQW55U2V0PWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zZXR8fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZyb3plbnNldH07U2suYnVpbHRpbi5jaGVja01hcHBpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3R8fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eXx8XG5udWxsIT1hJiZ2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdCYmdm9pZCAwIT09U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRrZXlzKX19LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIpe3N3aXRjaChiKXtjYXNlIFwiQWRkXCI6cmV0dXJuIGEubmIkYWRkO2Nhc2UgXCJTdWJcIjpyZXR1cm4gYS5uYiRzdWJ0cmFjdDtjYXNlIFwiTXVsdFwiOnJldHVybiBhLm5iJG11bHRpcGx5O2Nhc2UgXCJNYXRNdWx0XCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBhLm5iJG1hdHJpeF9tdWx0aXBseTtjYXNlIFwiRGl2XCI6cmV0dXJuIGEubmIkZGl2aWRlO2Nhc2UgXCJGbG9vckRpdlwiOnJldHVybiBhLm5iJGZsb29yX2RpdmlkZTtjYXNlIFwiTW9kXCI6cmV0dXJuIGEubmIkcmVtYWluZGVyO2Nhc2UgXCJEaXZNb2RcIjpyZXR1cm4gYS5uYiRkaXZtb2Q7Y2FzZSBcIlBvd1wiOnJldHVybiBhLm5iJHBvd2VyO2Nhc2UgXCJMU2hpZnRcIjpyZXR1cm4gYS5uYiRsc2hpZnQ7Y2FzZSBcIlJTaGlmdFwiOnJldHVybiBhLm5iJHJzaGlmdDtcbmNhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRhbmQ7Y2FzZSBcIkJpdFhvclwiOnJldHVybiBhLm5iJHhvcjtjYXNlIFwiQml0T3JcIjpyZXR1cm4gYS5uYiRvcn19ZnVuY3Rpb24gYyhhLGIpe3N3aXRjaChiKXtjYXNlIFwiQWRkXCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX2FkZDtjYXNlIFwiU3ViXCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX3N1YnRyYWN0O2Nhc2UgXCJNdWx0XCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX211bHRpcGx5O2Nhc2UgXCJNYXRNdWx0XCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBhLm5iJHJlZmxlY3RlZF9tYXRyaXhfbXVsdGlwbHk7Y2FzZSBcIkRpdlwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9kaXZpZGU7Y2FzZSBcIkZsb29yRGl2XCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX2Zsb29yX2RpdmlkZTtjYXNlIFwiTW9kXCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX3JlbWFpbmRlcjtjYXNlIFwiRGl2TW9kXCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX2Rpdm1vZDtjYXNlIFwiUG93XCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX3Bvd2VyO1xuY2FzZSBcIkxTaGlmdFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9sc2hpZnQ7Y2FzZSBcIlJTaGlmdFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9yc2hpZnQ7Y2FzZSBcIkJpdEFuZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9hbmQ7Y2FzZSBcIkJpdFhvclwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF94b3I7Y2FzZSBcIkJpdE9yXCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX29yfX1mdW5jdGlvbiBiKGEsYil7c3dpdGNoKGIpe2Nhc2UgXCJBZGRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2FkZDtjYXNlIFwiU3ViXCI6cmV0dXJuIGEubmIkaW5wbGFjZV9zdWJ0cmFjdDtjYXNlIFwiTXVsdFwiOnJldHVybiBhLm5iJGlucGxhY2VfbXVsdGlwbHk7Y2FzZSBcIk1hdE11bHRcIjppZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpcmV0dXJuIGEubmIkaW5wbGFjZV9tYXRyaXhfbXVsdGlwbHk7Y2FzZSBcIkRpdlwiOnJldHVybiBhLm5iJGlucGxhY2VfZGl2aWRlO2Nhc2UgXCJGbG9vckRpdlwiOnJldHVybiBhLm5iJGlucGxhY2VfZmxvb3JfZGl2aWRlO1xuY2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJGlucGxhY2VfcmVtYWluZGVyO2Nhc2UgXCJQb3dcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3Bvd2VyO2Nhc2UgXCJMU2hpZnRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2xzaGlmdDtjYXNlIFwiUlNoaWZ0XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9yc2hpZnQ7Y2FzZSBcIkJpdEFuZFwiOnJldHVybiBhLm5iJGlucGxhY2VfYW5kO2Nhc2UgXCJCaXRPclwiOnJldHVybiBhLm5iJGlucGxhY2Vfb3I7Y2FzZSBcIkJpdFhvclwiOnJldHVybiBhLm5iJGlucGxhY2VfeG9yfX1mdW5jdGlvbiBlKGIsZCxlKXt2YXIgaz1kLmNvbnN0cnVjdG9yLGY9Yi5jb25zdHJ1Y3RvcjtpZihrPWshPT1mJiZ2b2lkIDA9PT1rLnNrJGJhc2VDbGFzcyYmZCBpbnN0YW5jZW9mIGYpaWYoZj1jKGQsZSksdm9pZCAwIT09ZiYmZiE9PWMoYixlKSYmKGY9Zi5jYWxsKGQsYiksZiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSlyZXR1cm4gZjtmPWEoYixlKTtpZih2b2lkIDAhPT1cbmYmJihmPWYuY2FsbChiLGQpLGYhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCl8fCFrJiYoZj1jKGQsZSksdm9pZCAwIT09ZiYmKGY9Zi5jYWxsKGQsYiksZiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSkpcmV0dXJuIGZ9ZnVuY3Rpb24gZihhKXtuLmZvckVhY2goKFtiLGNdKT0+e2FbY109ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHAkcmljaGNvbXBhcmUoYSxiKX19KX1mdW5jdGlvbiBsKGEpe2NvbnN0IGI9U2sucmVmbGVjdGVkTnVtYmVyU2xvdHM7T2JqZWN0LmtleXMoYikuZm9yRWFjaChjPT57aWYodm9pZCAwIT09YVtjXSl7Y29uc3QgZD1iW2NdLGU9ZC5yZWZsZWN0ZWQsZj1hW2VdO3ZvaWQgMCE9PWY/bnVsbD09PWYmJmRlbGV0ZSBhW2VdOmFbZV09ZC5zbG90fHxhW2NdfX0pfWZ1bmN0aW9uIGgoYSl7Y29uc3QgYj1Tay5zZXF1ZW5jZUFuZE1hcHBpbmdTbG90cztPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGM9Plxue3ZvaWQgMCE9PWFbY10mJmJbY10uZm9yRWFjaChiPT57YVtiXT1hW2NdfSl9KX1Tay5hYnN0cj17fTtTay5hYnN0ci50eXBlTmFtZT1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmdm9pZCAwIT09YS50cCRuYW1lP2EudHAkbmFtZTpcIjxpbnZhbGlkIHR5cGU+XCJ9O2NvbnN0IGQ9e0FkZDpcIitcIixTdWI6XCItXCIsTXVsdDpcIipcIixNYXRNdWx0OlwiQFwiLERpdjpcIi9cIixGbG9vckRpdjpcIi8vXCIsTW9kOlwiJVwiLERpdk1vZDpcImRpdm1vZCgpXCIsUG93OlwiKiogb3IgcG93KClcIixMU2hpZnQ6XCI8PFwiLFJTaGlmdDpcIj4+XCIsQml0QW5kOlwiJlwiLEJpdFhvcjpcIl5cIixCaXRPcjpcInxcIn0sZz17VUFkZDpcIitcIixVU3ViOlwiLVwiLEludmVydDpcIn5cIn07U2suYWJzdHIubnVtYmVyQmluT3A9ZnVuY3Rpb24oYSxiLGMpe3ZhciBmO2lmKCEoZj1lKGEsYixjKSkpdGhyb3cgYT1Tay5hYnN0ci50eXBlTmFtZShhKSxiPVNrLmFic3RyLnR5cGVOYW1lKGIpLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgXCIrXG5kW2NdK1wiOiAnXCIrYStcIicgYW5kICdcIitiK1wiJ1wiKTtyZXR1cm4gZn07U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIubnVtYmVyQmluT3BcIixTay5hYnN0ci5udW1iZXJCaW5PcCk7U2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wPWZ1bmN0aW9uKGEsYyxmKXthOnt2YXIgaz1iKGEsZik7aWYodm9pZCAwIT09ayYmKGs9ay5jYWxsKGEsYyksayE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSlicmVhayBhO2s9ZShhLGMsZil9aWYoIWspdGhyb3cgYT1Tay5hYnN0ci50eXBlTmFtZShhKSxjPVNrLmFic3RyLnR5cGVOYW1lKGMpLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgXCIrZFtmXStcIj06ICdcIithK1wiJyBhbmQgJ1wiK2MrXCInXCIpO3JldHVybiBrfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3BcIixTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3ApO1NrLmFic3RyLm51bWJlclVuYXJ5T3A9XG5mdW5jdGlvbihhLGIpe2lmKFwiTm90XCI9PT1iKXJldHVybiBTay5taXNjZXZhbC5pc1RydWUoYSk/U2suYnVpbHRpbi5ib29sLmZhbHNlJDpTay5idWlsdGluLmJvb2wudHJ1ZSQ7Yjp7c3dpdGNoKGIpe2Nhc2UgXCJVU3ViXCI6dmFyIGM9YS5uYiRuZWdhdGl2ZTticmVhayBiO2Nhc2UgXCJVQWRkXCI6Yz1hLm5iJHBvc2l0aXZlO2JyZWFrIGI7Y2FzZSBcIkludmVydFwiOmM9YS5uYiRpbnZlcnQ7YnJlYWsgYn1jPXZvaWQgMH1jPXZvaWQgMCE9PWM/Yy5jYWxsKGEpOnZvaWQgMDtpZighYyl0aHJvdyBhPVNrLmFic3RyLnR5cGVOYW1lKGEpLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IFwiK2dbYl0rXCI6ICdcIithK1wiJ1wiKTtyZXR1cm4gY307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIubnVtYmVyVW5hcnlPcFwiLFNrLmFic3RyLm51bWJlclVuYXJ5T3ApO1NrLmFic3RyLmZpeFNlcUluZGV4Xz1mdW5jdGlvbihhLGIpe2I9U2suYnVpbHRpbi5hc251bSQoYik7XG4wPmImJmEuc3EkbGVuZ3RoJiYoYis9YS5zcSRsZW5ndGgoKSk7cmV0dXJuIGJ9O1NrLmFic3RyLnNlcXVlbmNlQ29udGFpbnM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEuc3EkY29udGFpbnMpcmV0dXJuIGEuc3EkY29udGFpbnMoYixjKTthPVNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLGIsXCJFcVwiKT9uZXcgU2subWlzY2V2YWwuQnJlYWsoITApOiExfSwhMSk7cmV0dXJuIGM/YTpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYSl9O1NrLmFic3RyLnNlcXVlbmNlQ29uY2F0PWZ1bmN0aW9uKGEsYil7aWYoYS5zcSRjb25jYXQpcmV0dXJuIGEuc3EkY29uY2F0KGIpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZFwiKTt9O1NrLmFic3RyLnNlcXVlbmNlR2V0SW5kZXhPZj1cbmZ1bmN0aW9uKGEsYil7aWYoYS5pbmRleClyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuaW5kZXgsW2EsYl0pO2xldCBjPTA7Zm9yKGxldCBkPVNrLmFic3RyLml0ZXIoYSksZT1kLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZTtlPWQudHAkaXRlcm5leHQoKSl7aWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsZSxcIkVxXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpO2MrPTF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInNlcXVlbmNlLmluZGV4KHgpOiB4IG5vdCBpbiBzZXF1ZW5jZVwiKTt9O1NrLmFic3RyLnNlcXVlbmNlR2V0Q291bnRPZj1mdW5jdGlvbihhLGIpe2lmKGEuY291bnQpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmNvdW50LFthLGJdKTtsZXQgYz0wO2ZvcihsZXQgZD1Tay5hYnN0ci5pdGVyKGEpLGU9ZC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWU7ZT1kLnRwJGl0ZXJuZXh0KCkpU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsXG5lLFwiRXFcIikmJihjKz0xKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKX07U2suYWJzdHIuc2VxdWVuY2VHZXRJdGVtPWZ1bmN0aW9uKGEsYixjKXtcIm51bWJlclwiPT09dHlwZW9mIGImJihiPW5ldyBTay5idWlsdGluLmludF8oYikpO3JldHVybiBTay5hYnN0ci5vYmplY3RHZXRJdGVtKGEsYixjKX07U2suYWJzdHIuc2VxdWVuY2VTZXRJdGVtPWZ1bmN0aW9uKGEsYixjLGQpe1wibnVtYmVyXCI9PT10eXBlb2YgYiYmKGI9bmV3IFNrLmJ1aWx0aW4uaW50XyhiKSk7cmV0dXJuIFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYSxiLGMsZCl9O1NrLmFic3RyLnNlcXVlbmNlRGVsSXRlbT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIFNrLmFic3RyLm9iamVjdERlbEl0ZW0oYSxiLGMpfTtTay5hYnN0ci5zZXF1ZW5jZUdldFNsaWNlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGIsYykpfTtTay5hYnN0ci5zZXF1ZW5jZURlbFNsaWNlPVxuZnVuY3Rpb24oYSxiLGMpe3JldHVybiBTay5hYnN0ci5vYmplY3REZWxJdGVtKGEsbmV3IFNrLmJ1aWx0aW4uc2xpY2UoYixjKSl9O1NrLmFic3RyLnNlcXVlbmNlU2V0U2xpY2U9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5zbGljZShiLGMpKX07U2suYWJzdHIuc2VxdWVuY2VVbnBhY2s9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW5ub3QgdW5wYWNrIG5vbi1pdGVyYWJsZSBcIitTay5hYnN0ci50eXBlTmFtZShhKStcIiBvYmplY3RcIik7Y29uc3QgZT1Tay5hYnN0ci5pdGVyKGEpLGY9W107bGV0IGs9MCxnOzA8YiYmKGc9U2subWlzY2V2YWwuaXRlckZvcihlLGE9PntmLnB1c2goYSk7aWYoKytrPT09YilyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrfSkpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihnLFxuKCk9PntpZihmLmxlbmd0aDxiKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJub3QgZW5vdWdoIHZhbHVlcyB0byB1bnBhY2sgKGV4cGVjdGVkIGF0IGxlYXN0IFwiK2MrXCIsIGdvdCBcIitmLmxlbmd0aCtcIilcIik7aWYoIWQpcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGUudHAkaXRlcm5leHQoITApLGE9PntpZih2b2lkIDAhPT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJ0b28gbWFueSB2YWx1ZXMgdG8gdW5wYWNrIChleHBlY3RlZCBcIitiK1wiKVwiKTtyZXR1cm4gZn0pO2NvbnN0IGE9W107cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoZSxiPT57YS5wdXNoKGIpfSksKCk9Pntjb25zdCBkPWEubGVuZ3RoK2ItYztpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5vdCBlbm91Z2ggdmFsdWVzIHRvIHVucGFjayAoZXhwZWN0ZWQgYXQgbGVhc3QgXCIrYytcIiwgZ290IFwiKyhjK2QpK1wiKVwiKTtmLnB1c2gobmV3IFNrLmJ1aWx0aW4ubGlzdChhLnNsaWNlKDAsXG5kKSkpO2YucHVzaCguLi5hLnNsaWNlKGQpKTtyZXR1cm4gZn0pfSl9O1NrLmFic3RyLm1hcHBpbmdVbnBhY2tJbnRvS2V5d29yZEFycmF5PWZ1bmN0aW9uKGEsYixjKXtpZihiIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KWIuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsZF0pPT57aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChjLiRxdWFsbmFtZT9jLiRxdWFsbmFtZStcIigpIFwiOlwiXCIpK1wia2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzXCIpO2EucHVzaChiLnYpO2EucHVzaChkKX0pO2Vsc2V7dmFyIGQ9U2suYWJzdHIubG9va3VwU3BlY2lhbChiLFNrLmJ1aWx0aW4uc3RyLiRrZXlzKTtpZih2b2lkIDA9PT1kKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIk9iamVjdCBpcyBub3QgYSBtYXBwaW5nXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCksZD0+U2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGQpLFxuZD0+e2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYy4kcXVhbG5hbWU/Yy4kcXVhbG5hbWUrXCIoKSBcIjpcIlwiKStcImtleXdvcmRzIG11c3QgYmUgc3RyaW5nc1wiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYi5tcCRzdWJzY3JpcHQoZCwhMCksYj0+e2EucHVzaChkLnYpO2EucHVzaChiKX0pfSkpfX07U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3M9ZnVuY3Rpb24oYSxiLGMsZCxlKXtkPWR8fFtdO3ZhciBmPWMubGVuZ3RoK2QubGVuZ3RoLzI7aWYoZj5iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGV4cGVjdGVkIGF0IG1vc3QgXCIrYi5sZW5ndGgrXCIgYXJndW1lbnRzIChcIitmK1wiIGdpdmVuKVwiKTtpZihkLmxlbmd0aHx8dm9pZCAwIT09ZSl7aWYoZj09PWIubGVuZ3RoJiYhZC5sZW5ndGgpcmV0dXJuIGM7aWYoMD09PWYmJmIubGVuZ3RoPT09KGUmJmUubGVuZ3RoKSlyZXR1cm4gZX1lbHNlIHJldHVybiBjO1xuYz1jLnNsaWNlKDApO2ZvcihmPTA7ZjxkLmxlbmd0aDtmKz0yKXtjb25zdCBlPWRbZl0saz1kW2YrMV0sZz1iLmluZGV4T2YoZSk7aWYoMDw9Zyl7aWYodm9pZCAwIT09Y1tnXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGFyZ3VtZW50ICdcIitlK1wiJ1wiKTtjW2ddPWt9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJ1wiK2UrXCInXCIpO31pZihlKXtkPWIubGVuZ3RoO2ZvcihmPWQtMTswPD1mO2YtLSl2b2lkIDA9PT1jW2ZdJiYoY1tmXT1lW2UubGVuZ3RoLTEtKGQtMS1mKV0pO2I9Yi5maWx0ZXIoKGEsYik9PnZvaWQgMD09PWNbYl0pO2lmKGIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgbWlzc2luZyBcIitiLmxlbmd0aCtcIiByZXF1aXJlZCBwb3NpdGlvbmFsIGFyZ3VtZW50czogXCIrYi5qb2luKFwiLCBcIikpO1xufXJldHVybiBjfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJnc1wiLFNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKTtTay5hYnN0ci5jaGVja05vS3dhcmdzPWZ1bmN0aW9uKGEsYil7aWYoYiYmYi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50c1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3NcIixTay5hYnN0ci5jaGVja05vS3dhcmdzKTtTay5hYnN0ci5jaGVja05vQXJncz1mdW5jdGlvbihhLGIsYyl7aWYoYj1iLmxlbmd0aCsoYz9jLmxlbmd0aDowKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIHRha2VzIG5vIGFyZ3VtZW50cyAoXCIrYitcIiBnaXZlbilcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja05vQXJnc1wiLFNrLmFic3RyLmNoZWNrTm9BcmdzKTtTay5hYnN0ci5jaGVja09uZUFyZz1cbmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKGEsYyk7aWYoMSE9PWIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKFwiK2IubGVuZ3RoK1wiIGdpdmVuKVwiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmNoZWNrT25lQXJnXCIsU2suYWJzdHIuY2hlY2tPbmVBcmcpO1NrLmFic3RyLmNoZWNrQXJnc0xlbj1mdW5jdGlvbihhLGIsYyxkKXtiPWIubGVuZ3RoO3ZvaWQgMD09PWQmJihkPUluZmluaXR5KTtpZihiPGN8fGI+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoKGM9PT1kP2ErXCIoKSB0YWtlcyBleGFjdGx5IFwiK2MrXCIgYXJndW1lbnRzXCI6YjxjP2ErXCIoKSB0YWtlcyBhdCBsZWFzdCBcIitjK1wiIGFyZ3VtZW50c1wiOmErXCIoKSB0YWtlcyBhdCBtb3N0IFwiK2QrXCIgYXJndW1lbnRzXCIpKyhcIiAoXCIrYitcIiBnaXZlbilcIikpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY2hlY2tBcmdzTGVuXCIsXG5Tay5hYnN0ci5jaGVja0FyZ3NMZW4pO1NrLmFic3RyLm9iamVjdEZvcm1hdD1mdW5jdGlvbihhLGIpe2E9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRmb3JtYXQpO2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW2JdKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2Zvcm1hdF9fIG11c3QgcmV0dXJuIGEgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYikpO3JldHVybiBifTtTay5hYnN0ci5vYmplY3RIYXNoPWZ1bmN0aW9uKGEpe2NvbnN0IGI9YS50cCRoYXNoO2lmKHZvaWQgMCE9PWIpe2lmKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuaGFzaGFibGUgdHlwZTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTtyZXR1cm4gYS50cCRoYXNoKCl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgSmF2YXNjcmlwdCB0eXBlXCIpO1xufTtTay5hYnN0ci5vYmplY3RBZGQ9ZnVuY3Rpb24oYSxiKXtpZihhLm5iJGFkZClyZXR1cm4gYS5uYiRhZGQoYik7YT1Tay5hYnN0ci50eXBlTmFtZShhKTtiPVNrLmFic3RyLnR5cGVOYW1lKGIpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgKzogJ1wiK2ErXCInIGFuZCAnXCIrYitcIidcIik7fTtTay5hYnN0ci5vYmplY3ROZWdhdGl2ZT1mdW5jdGlvbihhKXtpZihhLm5iJG5lZ2F0aXZlKXJldHVybiBhLm5iJG5lZ2F0aXZlKCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgLTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt9O1NrLmFic3RyLm9iamVjdFBvc2l0aXZlPWZ1bmN0aW9uKGEpe2lmKGEubmIkcG9zaXRpdmUpcmV0dXJuIGEubmIkcG9zaXRpdmUoKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSArOiAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fTtTay5hYnN0ci5vYmplY3REZWxJdGVtPWZ1bmN0aW9uKGEsYixjKXtpZihhLm1wJGFzc19zdWJzY3JpcHQpcmV0dXJuIGEubXAkYXNzX3N1YnNjcmlwdChiLHZvaWQgMCxjKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb25cIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5vYmplY3REZWxJdGVtXCIsU2suYWJzdHIub2JqZWN0RGVsSXRlbSk7U2suYWJzdHIub2JqZWN0R2V0SXRlbT1mdW5jdGlvbihhLGIsYyl7aWYoYS5tcCRzdWJzY3JpcHQpcmV0dXJuIGEubXAkc3Vic2NyaXB0KGIsYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBkb2VzIG5vdCBzdXBwb3J0IGluZGV4aW5nXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIub2JqZWN0R2V0SXRlbVwiLFxuU2suYWJzdHIub2JqZWN0R2V0SXRlbSk7U2suYWJzdHIub2JqZWN0U2V0SXRlbT1mdW5jdGlvbihhLGIsYyxkKXtpZihhLm1wJGFzc19zdWJzY3JpcHQpcmV0dXJuIGEubXAkYXNzX3N1YnNjcmlwdChiLGMsZCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudFwiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm9iamVjdFNldEl0ZW1cIixTay5hYnN0ci5vYmplY3RTZXRJdGVtKTtTay5hYnN0ci5nYXR0cj1mdW5jdGlvbihhLGIsYyl7Yz1hLnRwJGdldGF0dHIoYixjKTtpZih2b2lkIDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEuc2skYXR0ckVycm9yKCkrXCIgaGFzIG5vIGF0dHJpYnV0ZSAnXCIrYi4kanNzdHIoKStcIidcIik7cmV0dXJuIGMuJGlzU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5jaGFpbihjLGZ1bmN0aW9uKGMpe2lmKHZvaWQgMD09PVxuYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihhLnNrJGF0dHJFcnJvcigpK1wiIGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2IuJGpzc3RyKCkrXCInXCIpO3JldHVybiBjfSk6Y307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuZ2F0dHJcIixTay5hYnN0ci5nYXR0cik7U2suYWJzdHIuc2F0dHI9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEudHAkc2V0YXR0cihiLGMsZCl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLnNhdHRyXCIsU2suYWJzdHIuc2F0dHIpO1NrLmFic3RyLml0ZXJuZXh0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEudHAkaXRlcm5leHQoYil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLml0ZXJuZXh0XCIsU2suYWJzdHIuaXRlcm5leHQpO1NrLmFic3RyLml0ZXI9ZnVuY3Rpb24oYSl7aWYoYS50cCRpdGVyKXthPWEudHAkaXRlcigpO2lmKGEudHAkaXRlcm5leHQpcmV0dXJuIGE7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaXRlcigpIHJldHVybmVkIG5vbi1pdGVyYXRvciBvZiB0eXBlICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt9aWYoYS5tcCRzdWJzY3JpcHQpcmV0dXJuIG5ldyBTay5idWlsdGluLnNlcV9pdGVyXyhhKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5pdGVyXCIsU2suYWJzdHIuaXRlcik7U2suYWJzdHIubG9va3VwU3BlY2lhbD1mdW5jdGlvbihhLGIpe3ZhciBjPWEub2IkdHlwZTtpZih2b2lkIDA9PT1jKVNrLmFzc2VydHMuZmFpbChcImphdmFzY3JpcHQgb2JqZWN0IHNlbnQgdG8gbG9va3VwU3BlY2lhbFwiKTtlbHNlIGlmKGI9Yy4kdHlwZUxvb2t1cChiKSx2b2lkIDAhPT1iKXJldHVybiB2b2lkIDAhPT1iLnRwJGRlc2NyX2dldCYmKGI9Yi50cCRkZXNjcl9nZXQoYSxjKSksYn07U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIubG9va3VwU3BlY2lhbFwiLFNrLmFic3RyLmxvb2t1cFNwZWNpYWwpO1xuU2suYWJzdHIudHlwZUxvb2t1cD1mdW5jdGlvbihhLGIpe2I9YS4kdHlwZUxvb2t1cChiKTtyZXR1cm4gdm9pZCAwIT09YiYmYi50cCRkZXNjcl9nZXQ/Yi50cCRkZXNjcl9nZXQobnVsbCxhKTpifTtTay5hYnN0ci5tYXJrVW5oYXNoYWJsZT1mdW5jdGlvbihhKXthPWEucHJvdG90eXBlO2EuX19oYXNoX189U2suYnVpbHRpbi5ub25lLm5vbmUkO2EudHAkaGFzaD1Tay5idWlsdGluLm5vbmUubm9uZSR9O1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2U9ZnVuY3Rpb24oYSxiLGMsZCl7ZD1kfHxTay5idWlsdGluLnR5cGU7Yz12b2lkIDA9PT1jP1NrLmJ1aWx0aW4ub2JqZWN0OmM7Y29uc3QgZT1udWxsIT09Yz9jLnByb3RvdHlwZTpudWxsO09iamVjdC5zZXRQcm90b3R5cGVPZihiLGQucHJvdG90eXBlKTtPYmplY3Quc2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUsZSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYi5wcm90b3R5cGUse3NrJG9iamVjdDp7dmFsdWU6Yix3cml0YWJsZTohMH0sXG5vYiR0eXBlOnt2YWx1ZTpiLHdyaXRhYmxlOiEwfSx0cCRuYW1lOnt2YWx1ZTphLHdyaXRhYmxlOiEwfSx0cCRiYXNlOnt2YWx1ZTpjLHdyaXRhYmxlOiEwfX0pfTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm89ZnVuY3Rpb24oYSl7bGV0IGI9YS5wcm90b3R5cGUudHAkYmFzZTtjb25zdCBjPW51bGw9PT1iP1tdOltiXTtpZihiPT09U2suYnVpbHRpbi5vYmplY3R8fG51bGw9PT1iKU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwic2skYmFzZUNsYXNzXCIse3ZhbHVlOiEwLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEucHJvdG90eXBlLFwic2skYnVpbHRpbkJhc2VcIix7dmFsdWU6YSx3cml0YWJsZTohMH0pO2NvbnN0IGQ9W2FdO2Zvcig7bnVsbCE9PWI7KWQucHVzaChiKSxiPWIucHJvdG90eXBlLnRwJGJhc2U7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYS5wcm90b3R5cGUse3NrJHByb3RvdHlwaWNhbDp7dmFsdWU6ITAsd3JpdGFibGU6ITB9LHRwJGJhc2VzOnt2YWx1ZTpjLFxud3JpdGFibGU6ITB9LHRwJG1ybzp7dmFsdWU6ZCx3cml0YWJsZTohMH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxcIiR0eXBlTG9va3VwXCIse3ZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZVthLiRtYW5nbGVkXX0sd3JpdGFibGU6ITB9KX07U2suYWJzdHIuc2V0VXBHZXRTZXRzPWZ1bmN0aW9uKGEsYil7aWYodm9pZCAwIT09U2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcil7dmFyIGM9YS5wcm90b3R5cGU7Yj1ifHxjLnRwJGdldHNldHN8fHt9O09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtiLGRdKT0+e2QuJG5hbWU9YjtjW2JdPW5ldyBTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yKGEsZCl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxcInRwJGdldHNldHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07U2suYWJzdHIuc2V0VXBNZXRob2RzPWZ1bmN0aW9uKGEsYil7aWYodm9pZCAwIT09U2suYnVpbHRpbi5tZXRob2RfZGVzY3JpcHRvcil7dmFyIGM9XG5hLnByb3RvdHlwZTtiPWJ8fGMudHAkbWV0aG9kc3x8e307T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2IsZF0pPT57ZC4kbmFtZT1iO2NbYl09bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IoYSxkKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwidHAkbWV0aG9kc1wiLHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSl9fTtTay5hYnN0ci5zZXRVcENsYXNzTWV0aG9kcz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcil7dmFyIGM9YS5wcm90b3R5cGU7Yj1ifHxjLnRwJGNsYXNzbWV0aG9kc3x8e307T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2IsZF0pPT57ZC4kbmFtZT1iO2NbYl09bmV3IFNrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcihhLGQpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsXCJ0cCRjbGFzc21ldGhvZHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07Y29uc3Qgbj1PYmplY3QuZW50cmllcyh7RXE6XCJvYiRlcVwiLFxuTm90RXE6XCJvYiRuZVwiLEd0Olwib2IkZ3RcIixHdEU6XCJvYiRnZVwiLEx0Olwib2IkbHRcIixMdEU6XCJvYiRsZVwifSk7U2suYWJzdHIuc2V0VXBTbG90cz1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYixjKXtlW2JdPW5ldyBTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcihhLFNrLnNsb3RzW2JdLGMpfWZ1bmN0aW9uIGQoYSxiKXtcInN0cmluZ1wiPT09dHlwZW9mIGE/YyhhLGIpOmEuZm9yRWFjaChhPT57YyhhLGIpfSl9aWYodm9pZCAwIT09U2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3Ipe3ZhciBlPWEucHJvdG90eXBlO2I9Ynx8ZS50cCRzbG90c3x8e307Yi50cCRuZXc9PT1Tay5nZW5lcmljLm5ldyYmKGIudHAkbmV3PVNrLmdlbmVyaWMubmV3KGEpKTtiLnRwJHJpY2hjb21wYXJlJiZmKGIpO2IudHAkYXNfbnVtYmVyJiZsKGIpO2IudHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZyYmaChiKTtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbYSxiXSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcbmEse3ZhbHVlOmIsd3JpdGFibGU6ITB9KX0pO2IudHAkbmV3JiYoZS5fX25ld19fPW5ldyBTay5idWlsdGluLnNrX21ldGhvZChTay5nZW5lcmljLm5ld01ldGhvZERlZixhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInNrJHN0YXRpY05ld1wiLHt2YWx1ZTphLHdyaXRhYmxlOiEwfSkpO1NrLnN1YlNsb3RzLm1haW5fc2xvdHMuZm9yRWFjaCgoW2EsY10pPT57YT1iW2FdO3ZvaWQgMCE9PWEmJmQoYyxhKX0pO3ZhciBnPWIudHAkaGFzaDt2b2lkIDAhPT1nJiYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGc/YyhcIl9faGFzaF9fXCIsZyk6Zz09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9lLl9faGFzaF9fPWc6U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCB0cCRoYXNoXCIpKTtiLnRwJGFzX251bWJlciYmU2suc3ViU2xvdHMubnVtYmVyX3Nsb3RzLmZvckVhY2goKFthLGNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTtiLnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmcmJlNrLnN1YlNsb3RzLnNlcXVlbmNlX2FuZF9tYXBwaW5nX3Nsb3RzLmZvckVhY2goKFthLFxuY10pPT57YT1iW2FdO3ZvaWQgMCE9PWEmJmQoYyxhKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwidHAkc2xvdHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcz1mdW5jdGlvbihhLGIpe2I9Ynx8e307U2suYXNzZXJ0cy5hc3NlcnQoYi5oYXNPd25Qcm9wZXJ0eShcImNvbnN0cnVjdG9yXCIpLFwiQSBjb25zdHJ1Y3RvciBpcyByZXF1aXJlZCB0byBidWlsZCBhIG5hdGl2ZSBjbGFzc1wiKTtsZXQgYz1iLmNvbnN0cnVjdG9yO2lmKGEuaW5jbHVkZXMoXCIuXCIpKXt2YXIgZD1hLnNwbGl0KFwiLlwiKTthPWQucG9wKCk7ZD1kLmpvaW4oXCIuXCIpfVNrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoYSxjLGIuYmFzZSxiLm1ldGEpO1NrLmFic3RyLnNldFVwQnVpbHRpbk1ybyhjKTtjb25zdCBlPWMucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUse3RwJHNsb3RzOnt2YWx1ZTpiLnNsb3RzLHdyaXRhYmxlOiEwfSx0cCRnZXRzZXRzOnt2YWx1ZTpiLmdldHNldHMsXG53cml0YWJsZTohMH0sdHAkbWV0aG9kczp7dmFsdWU6Yi5tZXRob2RzLHdyaXRhYmxlOiEwfSx0cCRjbGFzc21ldGhvZHM6e3ZhbHVlOmIuY2xhc3NtZXRob2RzLHdyaXRhYmxlOiEwfX0pO1NrLmFic3RyLnNldFVwU2xvdHMoYyxiLnNsb3RzfHx7fSk7U2suYWJzdHIuc2V0VXBNZXRob2RzKGMsYi5tZXRob2RzKTtTay5hYnN0ci5zZXRVcEdldFNldHMoYyxiLmdldHNldHMpO1NrLmFic3RyLnNldFVwQ2xhc3NNZXRob2RzKGMsYi5jbGFzc21ldGhvZHMpO3ZvaWQgMCE9PWQmJihlLl9fbW9kdWxlX189bmV3IFNrLmJ1aWx0aW4uc3RyKGQpKTtPYmplY3QuZW50cmllcyhiLnByb3RvfHx7fSkuZm9yRWFjaCgoW2EsYl0pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsYSx7dmFsdWU6Yix3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEoYS5pbmNsdWRlcyhcIiRcIil8fGEgaW4gT2JqZWN0LnByb3RvdHlwZSl9KX0pO09iamVjdC5lbnRyaWVzKGIuZmxhZ3N8fHt9KS5mb3JFYWNoKChbYSxiXSk9Plxue09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLGEse3ZhbHVlOmIsd3JpdGFibGU6ITB9KX0pO3ZvaWQgMCE9PVNrLmJ1aWx0aW4uc3RyJiZlLmhhc093blByb3BlcnR5KFwidHAkZG9jXCIpJiYhZS5oYXNPd25Qcm9wZXJ0eShcIl9fZG9jX19cIikmJihhPWUudHAkZG9jfHxudWxsLGUuX19kb2NfXz1cInN0cmluZ1wiPT09dHlwZW9mIGE/bmV3IFNrLmJ1aWx0aW4uc3RyKGEpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7cmV0dXJuIGN9O1NrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcz1mdW5jdGlvbihhLGIpe1NrLmFzc2VydHMuYXNzZXJ0KGIuaGFzT3duUHJvcGVydHkoXCJjb25zdHJ1Y3RvclwiKSxcIm11c3QgcHJvdmlkZSBhIGNvbnN0cnVjdG9yXCIpO2Iuc2xvdHM9Yi5zbG90c3x8e307Yi5zbG90cy50cCRpdGVyPVNrLmdlbmVyaWMuc2VsZkl0ZXI7Yi5zbG90cy50cCRpdGVybmV4dD1iLnNsb3RzLnRwJGl0ZXJuZXh0fHxiLml0ZXJuZXh0O2Iuc2xvdHMudHAkZ2V0YXR0cj1iLnNsb3RzLnRwJGdldGF0dHJ8fFxuU2suZ2VuZXJpYy5nZXRBdHRyO2E9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhhLGIpO1NrLmFic3RyLmJ1aWx0JGl0ZXJhdG9ycy5wdXNoKGEpO3JldHVybiBhfTtTay5hYnN0ci5idWlsdCRpdGVyYXRvcnM9W107U2suYWJzdHIuc2V0VXBNb2R1bGVNZXRob2RzPWZ1bmN0aW9uKGEsYixjKXtPYmplY3QuZW50cmllcyhjKS5mb3JFYWNoKChbYyxkXSk9PntkLiRuYW1lPWQuJG5hbWV8fGM7YltjXT1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoZCxudWxsLGEpfSl9O1NrLmFic3RyLnN1cGVyQ29uc3RydWN0b3I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKTthLnByb3RvdHlwZS50cCRiYXNlLmFwcGx5KGIsZCl9fSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9bmV3IE1hcDtTay5idWlsdGluLm9iamVjdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwib2JqZWN0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mXG5Tay5idWlsdGluLm9iamVjdCxcImJhZCBjYWxsIHRvIG9iamVjdCwgdXNlICduZXcnXCIpfSxiYXNlOm51bGwsc2xvdHM6e3RwJG5ldyhhLGIpe2lmKGEubGVuZ3RofHxiJiZiLmxlbmd0aCl7aWYodGhpcy50cCRuZXchPT1Tay5idWlsdGluLm9iamVjdC5wcm90b3R5cGUudHAkbmV3KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9iamVjdC5fX25ld19fKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSB0eXBlIHRvIGluc3RhbnRpYXRlKVwiKTtpZih0aGlzLnRwJGluaXQ9PT1Tay5idWlsdGluLm9iamVjdC5wcm90b3R5cGUudHAkaW5pdCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIoKSB0YWtlcyBubyBhcmd1bWVudHNcIik7fXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcn0sdHAkaW5pdChhLGIpe2lmKGEubGVuZ3RofHxiJiZiLmxlbmd0aCl7aWYodGhpcy50cCRpbml0IT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJGluaXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib2JqZWN0Ll9faW5pdF9fKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSBpbnN0YW5jZSB0byBpbml0aWFsaXplKVwiKTtcbmlmKHRoaXMudHAkbmV3PT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJG5ldyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIuX19pbml0X18oKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAodGhlIGluc3RhbmNlIHRvIGluaXRpYWxpemUpXCIpO319LHRwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJHNldGF0dHI6U2suZ2VuZXJpYy5zZXRBdHRyLCRyKCl7Y29uc3QgYT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKHRoaXMsU2suYnVpbHRpbi5zdHIuJG1vZHVsZSk7bGV0IGI9XCJcIjthJiZTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpJiYoYj1hLnYrXCIuXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8XCIrYitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIiBvYmplY3Q+XCIpfSx0cCRzdHIoKXtyZXR1cm4gdGhpcy4kcigpfSx0cCRoYXNoKCl7bGV0IGM9YS5nZXQodGhpcyk7aWYodm9pZCAwIT09YylyZXR1cm4gYztcbmM9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSLU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLzIpO2Euc2V0KHRoaXMsYyk7cmV0dXJuIGN9LHRwJHJpY2hjb21wYXJlKGEsYil7c3dpdGNoKGIpe2Nhc2UgXCJFcVwiOmE9dGhpcz09PWF8fFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2JyZWFrO2Nhc2UgXCJOb3RFcVwiOmE9dGhpcy50cCRyaWNoY29tcGFyZShhLFwiRXFcIik7YSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkJiYoYT0hU2subWlzY2V2YWwuaXNUcnVlKGEpKTticmVhaztkZWZhdWx0OmE9U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9cmV0dXJuIGF9LHRwJGRvYzpcIlRoZSBtb3N0IGJhc2UgdHlwZVwifSxnZXRzZXRzOntfX2NsYXNzX186eyRnZXQoKXtyZXR1cm4gdGhpcy5vYiR0eXBlfSwkc2V0KGEpe2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgZGVsZXRlIF9fY2xhc3NfXyBhdHRyaWJ1dGVcIik7XG5pZighU2suYnVpbHRpbi5jaGVja0NsYXNzKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fY2xhc3NfXyBtdXN0IGJlIHNldCB0byBhIGNsYXNzLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3RcIik7Y29uc3QgYj10aGlzLm9iJHR5cGU7aWYoIShiLiRpc1N1YlR5cGUoU2suYnVpbHRpbi5tb2R1bGUpJiZhLiRpc1N1YlR5cGUoU2suYnVpbHRpbi5tb2R1bGUpfHx2b2lkIDAhPT1iLnNrJGtsYXNzJiZ2b2lkIDAhPT1hLnNrJGtsYXNzKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCIgX19jbGFzc19fIGFzc2lnbm1lbnQgb25seSBzdXBwb3J0ZWQgZm9yIGhlYXAgdHlwZXMgb3IgTW9kdWxlVHlwZSBzdWJjbGFzc2VzXCIpO2lmKGEucHJvdG90eXBlLnNrJGJ1aWx0aW5CYXNlIT09dGhpcy5zayRidWlsdGluQmFzZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2NsYXNzX18gYXNzaWdubWVudDogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1xuXCInIG9iamVjdCBsYXlvdXQgZGlmZmVycyBmcm9tICdcIithLnByb3RvdHlwZS50cCRuYW1lK1wiJ1wiKTtPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxhLnByb3RvdHlwZSl9LCRkb2M6XCJ0aGUgb2JqZWN0J3MgY2xhc3NcIn19LG1ldGhvZHM6e19fZGlyX186eyRtZXRoOmZ1bmN0aW9uKCl7bGV0IGE9W107aWYodGhpcy4kZClpZih0aGlzLiRkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KWE9dGhpcy4kZC5zayRhc2FycmF5KCk7ZWxzZSBmb3IodmFyIGIgaW4gdGhpcy4kZClhLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGIpKTtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLnR5cGUucHJvdG90eXBlLl9fZGlyX18sW3RoaXMub2IkdHlwZV0pO2EucHVzaCguLi5iLnYpO2Iudj1hO3JldHVybiBifSwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIkRlZmF1bHQgZGlyKCkgaW1wbGVtZW50YXRpb24uXCJ9LF9fZm9ybWF0X186eyRtZXRoKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpe2lmKGE9XG5Tay5mZmkucmVtYXBUb0pzKGEpLFwiXCIhPT1hKXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJmb3JtYXQgc3BlYyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO31lbHNle2lmKFNrLl9fZnV0dXJlX18uZXhjZXB0aW9ucyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQoKSBhcmd1bWVudCAyIG11c3QgYmUgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZvcm1hdCBleHBlY3RzIGFyZyAyIHRvIGJlIHN0cmluZyBvciB1bmljb2RlLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO31yZXR1cm4gdGhpcy50cCRzdHIoKX0sJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJEZWZhdWx0IG9iamVjdCBmb3JtYXR0ZXIuXCJ9fSxwcm90bzp7dmFsdWVPZjpPYmplY3QucHJvdG90eXBlLnZhbHVlT2YsdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cCRzdHIoKS52fSxoYXNPd25Qcm9wZXJ0eTpPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxuaHAkdHlwZTp2b2lkIDAsc2skYXR0ckVycm9yKCl7cmV0dXJuXCInXCIrdGhpcy50cCRuYW1lK1wiJyBvYmplY3RcIn19fSk7U2suYWJzdHIuc2V0VXBJbmhlcml0YW5jZShcInR5cGVcIixTay5idWlsdGluLnR5cGUsU2suYnVpbHRpbi5vYmplY3QpO1NrLmFic3RyLnNldFVwQnVpbHRpbk1ybyhTay5idWlsdGluLnR5cGUpfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuJG5hbWUsYixjKTthPXRoaXMuY2FsbChhKTtyZXR1cm4gdm9pZCAwPT09YT9Tay5idWlsdGluLm5vbmUubm9uZSQ6YX1mdW5jdGlvbiBjKGEsYixjKXtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLiRuYW1lLGIsYyk7YT10aGlzLmNhbGwoYSxiWzBdKTtyZXR1cm4gdm9pZCAwPT09YT9Tay5idWlsdGluLm5vbmUubm9uZSQ6YX1mdW5jdGlvbiBiKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuJG5hbWUsXG5iLDEsMik7YT10aGlzLmNhbGwoYSwuLi5iKTtyZXR1cm4gdm9pZCAwPT09YT9Tay5idWlsdGluLm5vbmUubm9uZSQ6YX1mdW5jdGlvbiBlKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuJG5hbWUsYiwyLDIpO3RoaXMuY2FsbChhLGJbMF0sYlsxXSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH1mdW5jdGlvbiBmKGEsYixkKXthPWMuY2FsbCh0aGlzLGEsYixkKTtyZXR1cm4gYT09PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkP2E6bmV3IFNrLmJ1aWx0aW4uYm9vbChhKX1mdW5jdGlvbiBsKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtjPWEuY2FsbCh0aGlzLGMsZCxlKTtyZXR1cm4gYihjKX19ZnVuY3Rpb24gaChhKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBiPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLFxuW10pfX1mdW5jdGlvbiBkKGEsYixjLGQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZj1lLnRwJGRlc2NyX2dldD9lLnRwJGRlc2NyX2dldCh0aGlzKTplO2Y9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGYsW10pO2lmKCFiKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiIHNob3VsZCByZXR1cm4gXCIrYytcIiAocmV0dXJuZWQgXCIrU2suYWJzdHIudHlwZU5hbWUoZikrXCIpXCIpO3JldHVybiB2b2lkIDAhPT1kP2QoZik6Zn19fWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGMsW2JdKX19ZnVuY3Rpb24gbihhLGIpe2xldCBjPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChTay5idWlsdGluLnN0ci4kZ2V0YXR0cmlidXRlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3IpcmV0dXJuIGMuZCR3cmFwcGVkLmNhbGwodGhpcyxcbmEsYik7Yy50cCRkZXNjcl9nZXQmJihjPWMudHAkZGVzY3JfZ2V0KHRoaXMpKTtjb25zdCBkPVNrLm1pc2NldmFsLnRyeUNhdGNoKCgpPT5Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbYV0pLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKSl0aHJvdyBhO30pO3JldHVybiBiP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfWZ1bmN0aW9uIGsoYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXtyZXR1cm4gZnVuY3Rpb24oZCxlLGYpe2xldCBnO3ZvaWQgMD09PWU/KGc9YixjPW51bGwpOmc9YTtsZXQgaD10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAobmV3IFNrLmJ1aWx0aW4uc3RyKGcpKTtpZihoIGluc3RhbmNlb2YgU2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3IpcmV0dXJuIGguZCR3cmFwcGVkLmNhbGwodGhpcyxkLGUpO2gudHAkZGVzY3JfZ2V0JiYoaD1oLnRwJGRlc2NyX2dldCh0aGlzKSk7XG5pZih2b2lkIDAhPT1oKWQ9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGgsdm9pZCAwPT09ZT9bZF06W2QsZV0pO2Vsc2V7aWYoYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCInIG9iamVjdCBcIitjKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihnKTt9cmV0dXJuIGY/ZDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coZCl9fX1mdW5jdGlvbiBwKGEsYil7bGV0IGM9YS5vYiR0eXBlO2Zvcig7YyYmdm9pZCAwIT09Yy5zayRrbGFzczspYz1jLnByb3RvdHlwZS50cCRiYXNlO2lmKGMmJmMucHJvdG90eXBlLnRwJHNldGF0dHIhPT1iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGFwcGx5IHRoaXMgXCIrYi4kbmFtZStcIiB0byBcIitTay5hYnN0ci50eXBlTmFtZShhKStcIiBvYmplY3RcIik7fVNrLnNsb3RzPU9iamVjdC5jcmVhdGUobnVsbCk7XG5tPVNrLnNsb3RzO1NrLnNsb3RzLl9faW5pdF9fPXskbmFtZTpcIl9faW5pdF9fXCIsJHNsb3RfbmFtZTpcInRwJGluaXRcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLGIsYyk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIsYT0+e2lmKCFTay5idWlsdGluLmNoZWNrTm9uZShhKSYmdm9pZCAwIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2luaXRfXygpIHNob3VsZCByZXR1cm4gTm9uZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9KX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhbGwoYSxiLGMpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqYXJncywgKiprd2FyZ3MpXCIsJGZsYWdzOntGYXN0Q2FsbDohMH0sJGRvYzpcIkluaXRpYWxpemUgc2VsZi4gIFNlZSBoZWxwKHR5cGUoc2VsZikpIGZvciBhY2N1cmF0ZSBzaWduYXR1cmUuXCJ9O1xubS5fX25ld19fPXskbmFtZTpcIl9fbmV3X19cIiwkc2xvdF9uYW1lOlwidHAkbmV3XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtjb25zdCBiPWZ1bmN0aW9uKGIsYyl7bGV0IGQ9YTthLnRwJGRlc2NyX2dldCYmKGQ9YS50cCRkZXNjcl9nZXQobnVsbCx0aGlzLmNvbnN0cnVjdG9yKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFt0aGlzLmNvbnN0cnVjdG9yLC4uLmJdLGMpfTtiLnNrJHN0YXRpY19uZXc9ITE7cmV0dXJuIGJ9LCR3cmFwcGVyOm51bGwsJHRleHRzaWc6XCIoJHNlbGYsIC8sICphcmdzLCAqKmt3YXJncylcIiwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkZG9jOlwiQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgb2JqZWN0LlwifTttLl9fY2FsbF9fPXskbmFtZTpcIl9fY2FsbF9fXCIsJHNsb3RfbmFtZTpcInRwJGNhbGxcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6XG5hO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxiLGMpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe2E9YS50cCRjYWxsKGIsYyk7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqYXJncywgKiprd2FyZ3MpXCIsJGZsYWdzOntGYXN0Q2FsbDohMH0sJGRvYzpcIkNhbGwgc2VsZiBhcyBhIGZ1bmN0aW9uLlwifTttLl9fcmVwcl9fPXskbmFtZTpcIl9fcmVwcl9fXCIsJHNsb3RfbmFtZTpcIiRyXCIsJHNsb3RfZnVuYzpkKFwiX19yZXByX19cIixTay5idWlsdGluLmNoZWNrU3RyaW5nLFwic3RyXCIpLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJSZXR1cm4gcmVwcihzZWxmKS5cIn07bS5fX3N0cl9fPXskbmFtZTpcIl9fc3RyX19cIiwkc2xvdF9uYW1lOlwidHAkc3RyXCIsJHNsb3RfZnVuYzpkKFwiX19zdHJfX1wiLFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcsXG5cInN0clwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHN0cihzZWxmKS5cIn07dmFyIHU9ZChcIl9faGFzaF9fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiLGE9PlwibnVtYmVyXCI9PT10eXBlb2YgYS52P2EudjphLnRwJGhhc2goKSk7bS5fX2hhc2hfXz17JG5hbWU6XCJfX2hhc2hfX1wiLCRzbG90X25hbWU6XCJ0cCRoYXNoXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gYT09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9Tay5idWlsdGluLm5vbmUubm9uZSQ6dShhKX0sJHdyYXBwZXI6bChhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIGhhc2goc2VsZikuXCJ9O20uX19nZXRhdHRyaWJ1dGVfXz17JG5hbWU6XCJfX2dldGF0dHJpYnV0ZV9fXCIsJHNsb3RfbmFtZTpcInRwJGdldGF0dHJcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihhLFxuYil7bGV0IGM9dGhpcy5vYiR0eXBlLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRnZXRhdHRyKTtpZih2b2lkIDA9PT1jKXJldHVybiBuLmNhbGwodGhpcyxhLGIpO2NvbnN0IGQ9U2subWlzY2V2YWwuY2hhaW4obi5jYWxsKHRoaXMsYSxiKSxiPT5Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+e2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7Yy50cCRkZXNjcl9nZXQmJihjPWMudHAkZGVzY3JfZ2V0KHRoaXMpKTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW2FdKX0sZnVuY3Rpb24oYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KSk7cmV0dXJuIGI/ZDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coZCl9fSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy4kbmFtZSxiLGMpO2I9YlswXTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGIpK1wiJ1wiKTtjPXRoaXMuY2FsbChhLGIpO2lmKHZvaWQgMD09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgaGFzIG5vIGF0dHJpYnV0ZSBcIitiLiRqc3N0cigpKTtyZXR1cm4gY30sJHRleHRzaWc6XCIoJHNlbGYsIG5hbWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gZ2V0YXR0cihzZWxmLCBuYW1lKS5cIn07bS5fX2dldGF0dHJfXz17JG5hbWU6XCJfX2dldGF0dHJfX1wiLCRzbG90X25hbWU6XCJ0cCRnZXRhdHRyXCIsJHNsb3RfZnVuYzptLl9fZ2V0YXR0cmlidXRlX18uJHNsb3RfZnVuYywkd3JhcHBlcjpudWxsLCR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGdldGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19zZXRhdHRyX189eyRuYW1lOlwiX19zZXRhdHRyX19cIiwkc2xvdF9uYW1lOlwidHAkc2V0YXR0clwiLCRzbG90X2Z1bmM6ayhcIl9fc2V0YXR0cl9fXCIsXG5cIl9fZGVsYXR0cl9fXCIpLCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuJG5hbWUsYiwyLDIpO3AoYSx0aGlzKTt0aGlzLmNhbGwoYSxiWzBdLGJbMV0pO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCRkb2M6XCJJbXBsZW1lbnQgc2V0YXR0cihzZWxmLCBuYW1lLCB2YWx1ZSkuXCJ9O20uX19kZWxhdHRyX189eyRuYW1lOlwiX19kZWxhdHRyX19cIiwkc2xvdF9uYW1lOlwidHAkc2V0YXR0clwiLCRzbG90X2Z1bmM6bS5fX3NldGF0dHJfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLiRuYW1lLGIsYyk7cChhLHRoaXMpO3RoaXMuY2FsbChhLGJbMF0pO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LFxuJHRleHRzaWc6XCIoJHNlbGYsIG5hbWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgZGVsYXR0cihzZWxmLCBuYW1lKS5cIn07bS5fX2dldF9fPXskbmFtZTpcIl9fZ2V0X19cIiwkc2xvdF9uYW1lOlwidHAkZGVzY3JfZ2V0XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe251bGw9PT1iJiYoYj1Tay5idWlsdGluLm5vbmUubm9uZSQpO251bGw9PWMmJihjPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7Y29uc3QgZT1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO2I9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGUsW2IsY10pO3JldHVybiBkP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy4kbmFtZSxjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4odGhpcy4kbmFtZSxcbmIsMSwyKTtjPWJbMF07Yj1iWzFdO2M9PT1Tay5idWlsdGluLm5vbmUubm9uZSQmJihjPW51bGwpO2I9PT1Tay5idWlsdGluLm5vbmUubm9uZSQmJihiPW51bGwpO2lmKG51bGw9PT1iJiZudWxsPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2dldF9fKE5vbmUsIE5vbmUpIGlzIGludmFsaWRcIik7cmV0dXJuIHRoaXMuY2FsbChhLGMsYil9LCR0ZXh0c2lnOlwiKCRzZWxmLCBpbnN0YW5jZSwgb3duZXIsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkZG9jOlwiUmV0dXJuIGFuIGF0dHJpYnV0ZSBvZiBpbnN0YW5jZSwgd2hpY2ggaXMgb2YgdHlwZSBvd25lci5cIn07bS5fX3NldF9fPXskbmFtZTpcIl9fc2V0X19cIiwkc2xvdF9uYW1lOlwidHAkZGVzY3Jfc2V0XCIsJHNsb3RfZnVuYzprKFwiX19zZXRfX1wiLFwiX19kZWxldGVfX1wiKSwkd3JhcHBlcjplLCR0ZXh0c2lnOlwiKCRzZWxmLCBpbnN0YW5jZSwgdmFsdWUsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSxcbiRkb2M6XCJTZXQgYW4gYXR0cmlidXRlIG9mIGluc3RhbmNlIHRvIHZhbHVlLlwifTttLl9fZGVsZXRlX189eyRuYW1lOlwiX19kZWxldGVfX1wiLCRzbG90X25hbWU6XCJ0cCRkZXNjcl9zZXRcIiwkc2xvdF9mdW5jOm0uX19zZXRfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGluc3RhbmNlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiRGVsZXRlIGFuIGF0dHJpYnV0ZSBvZiBpbnN0YW5jZS5cIn07bS5fX2VxX189eyRuYW1lOlwiX19lcV9fXCIsJHNsb3RfbmFtZTpcIm9iJGVxXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGY9PXZhbHVlLlwifTttLl9fZ2VfXz17JG5hbWU6XCJfX2dlX19cIiwkc2xvdF9uYW1lOlwib2IkZ2VcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6ZiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LFxuJGRvYzpcIlJldHVybiBzZWxmPj12YWx1ZS5cIn07bS5fX2d0X189eyRuYW1lOlwiX19ndF9fXCIsJHNsb3RfbmFtZTpcIm9iJGd0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGY+dmFsdWUuXCJ9O20uX19sZV9fPXskbmFtZTpcIl9fbGVfX1wiLCRzbG90X25hbWU6XCJvYiRsZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPD12YWx1ZS5cIn07bS5fX2x0X189eyRuYW1lOlwiX19sdF9fXCIsJHNsb3RfbmFtZTpcIm9iJGx0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGY8dmFsdWUuXCJ9O20uX19uZV9fPXskbmFtZTpcIl9fbmVfX1wiLCRzbG90X25hbWU6XCJvYiRuZVwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYhPXZhbHVlLlwifTttLl9faXRlcl9fPXskbmFtZTpcIl9faXRlcl9fXCIsJHNsb3RfbmFtZTpcInRwJGl0ZXJcIiwkc2xvdF9mdW5jOmgsJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIkltcGxlbWVudCBpdGVyKHNlbGYpLlwifTttLl9fbmV4dF9fPXskbmFtZTpcIl9fbmV4dF9fXCIsJHNsb3RfbmFtZTpcInRwJGl0ZXJuZXh0XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7Y29uc3QgYz1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphLGQ9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFtdKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uKSl0aHJvdyBhO1xufSk7cmV0dXJuIGI/ZDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coZCl9fSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3ModGhpcy4kbmFtZSxiLGMpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLnRwJGl0ZXJuZXh0KCEwKSxhPT57aWYodm9pZCAwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uO3JldHVybiBhfSl9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiSW1wbGVtZW50IG5leHQoc2VsZikuXCJ9O20uX19sZW5fXz17JG5hbWU6XCJfX2xlbl9fXCIsJHNsb3RfbmFtZTpcInNxJGxlbmd0aFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtpZihiKXJldHVybiBiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFtdKSxTay5taXNjZXZhbC5jaGFpbihiLFxuYT0+U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSkpO2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGMsW10pO3JldHVybiBTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKX19LCR3cmFwcGVyOmwoYSxhPT5uZXcgU2suYnVpbHRpbi5pbnRfKGEpKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBsZW4oc2VsZikuXCJ9O20uX19jb250YWluc19fPXskbmFtZTpcIl9fY29udGFpbnNfX1wiLCRzbG90X25hbWU6XCJzcSRjb250YWluc1wiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO2I9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW2JdKTtiPVNrLm1pc2NldmFsLmNoYWluKGIsYT0+U2subWlzY2V2YWwuaXNUcnVlKGEpKTtyZXR1cm4gYi4kaXNTdXNwZW5zaW9uP2M/YjpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYik6XG5ifX0sJHdyYXBwZXI6bChjLGE9Pm5ldyBTay5idWlsdGluLmJvb2woYSkpLCR0ZXh0c2lnOlwiKCRzZWxmLCBrZXksIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4ga2V5IGluIHNlbGYuXCJ9O20uX19nZXRpdGVtX189eyRuYW1lOlwiX19nZXRpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkc3Vic2NyaXB0XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7Yj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxbYl0pO3JldHVybiBjP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfX0sJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwga2V5LCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZba2V5XS5cIn07bS5fX3NldGl0ZW1fXz17JG5hbWU6XCJfX3NldGl0ZW1fX1wiLCRzbG90X25hbWU6XCJtcCRhc3Nfc3Vic2NyaXB0XCIsXG4kc2xvdF9mdW5jOmsoXCJfX3NldGl0ZW1fX1wiLFwiX19kZWxpdGVtX19cIixcImRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50XCIpLCR3cmFwcGVyOmUsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgdmFsdWUsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkZG9jOlwiU2V0IHNlbGZba2V5XSB0byB2YWx1ZS5cIn07bS5fX2RlbGl0ZW1fXz17JG5hbWU6XCJfX2RlbGl0ZW1fX1wiLCRzbG90X25hbWU6XCJtcCRhc3Nfc3Vic2NyaXB0XCIsJHNsb3RfZnVuYzptLl9fc2V0aXRlbV9fLiRzbG90X2Z1bmMsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwga2V5LCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiRGVsZXRlIHNlbGZba2V5XS5cIn07bS5fX2FkZF9fPXskbmFtZTpcIl9fYWRkX19cIiwkc2xvdF9uYW1lOlwibmIkYWRkXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYrdmFsdWUuXCJ9O1xubS5fX3JhZGRfXz17JG5hbWU6XCJfX3JhZGRfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfYWRkXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlK3NlbGYuXCJ9O20uX19pYWRkX189eyRuYW1lOlwiX19pYWRkX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9hZGRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZis9dmFsdWUuXCJ9O20uX19zdWJfXz17JG5hbWU6XCJfX3N1Yl9fXCIsJHNsb3RfbmFtZTpcIm5iJHN1YnRyYWN0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYtdmFsdWUuXCJ9O20uX19yc3ViX189eyRuYW1lOlwiX19yc3ViX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3N1YnRyYWN0XCIsXG4kc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWUtc2VsZi5cIn07bS5fX2ltdWxfXz17JG5hbWU6XCJfX2ltdWxfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX211bHRpcGx5XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYqPXZhbHVlLlwifTttLl9fbXVsX189eyRuYW1lOlwiX19tdWxfX1wiLCRzbG90X25hbWU6XCJuYiRtdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmKnZhbHVlLlwifTttLl9fcm11bF9fPXskbmFtZTpcIl9fcm11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLFxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlKnNlbGYuXCJ9O20uX19pc3ViX189eyRuYW1lOlwiX19pc3ViX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9zdWJ0cmFjdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmLT12YWx1ZS5cIn07bS5fX21vZF9fPXskbmFtZTpcIl9fbW9kX19cIiwkc2xvdF9uYW1lOlwibmIkcmVtYWluZGVyXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYldmFsdWUuXCJ9O20uX19ybW9kX189eyRuYW1lOlwiX19ybW9kX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3JlbWFpbmRlclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIixcbiRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlJXNlbGYuXCJ9O20uX19pbW9kX189eyRuYW1lOlwiX19pbW9kX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9yZW1haW5kZXJcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgdmFsdWUlPXNlbGYuXCJ9O20uX19kaXZtb2RfXz17JG5hbWU6XCJfX2Rpdm1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGRpdm1vZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBkaXZtb2Qoc2VsZiwgdmFsdWUpLlwifTttLl9fcmRpdm1vZF9fPXskbmFtZTpcIl9fcmRpdm1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9kaXZtb2RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LFxuJGRvYzpcIlJldHVybiBkaXZtb2QodmFsdWUsIHNlbGYpXCJ9O20uX19wb3NfXz17JG5hbWU6XCJfX3Bvc19fXCIsJHNsb3RfbmFtZTpcIm5iJHBvc2l0aXZlXCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCIrc2VsZlwifTttLl9fbmVnX189eyRuYW1lOlwiX19uZWdfX1wiLCRzbG90X25hbWU6XCJuYiRuZWdhdGl2ZVwiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiLXNlbGZcIn07bS5fX2Fic19fPXskbmFtZTpcIl9fYWJzX19cIiwkc2xvdF9uYW1lOlwibmIkYWJzXCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJhYnMoc2VsZilcIn07bS5fX2Jvb2xfXz17JG5hbWU6XCJfX2Jvb2xfX1wiLCRzbG90X25hbWU6XCJuYiRib29sXCIsJHNsb3RfZnVuYzpkKFwiX19ib29sX19cIixcblNrLmJ1aWx0aW4uY2hlY2tCb29sLFwiYm9vbFwiLGE9PjAhPT1hLnYpLCR3cmFwcGVyOmwoYSxhPT5uZXcgU2suYnVpbHRpbi5ib29sKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcInNlbGYgIT0gMFwifTttLl9faW52ZXJ0X189eyRuYW1lOlwiX19pbnZlcnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnZlcnRcIiwkc2xvdF9mdW5jOmgsJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIn5zZWxmXCJ9O20uX19sc2hpZnRfXz17JG5hbWU6XCJfX2xzaGlmdF9fXCIsJHNsb3RfbmFtZTpcIm5iJGxzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPDx2YWx1ZS5cIn07bS5fX3Jsc2hpZnRfXz17JG5hbWU6XCJfX3Jsc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfbHNoaWZ0XCIsJHNsb3RfZnVuYzpnLFxuJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWU8PHNlbGYuXCJ9O20uX19yc2hpZnRfXz17JG5hbWU6XCJfX3JzaGlmdF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPj52YWx1ZS5cIn07bS5fX3Jyc2hpZnRfXz17JG5hbWU6XCJfX3Jyc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfcnNoaWZ0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlPj5zZWxmLlwifTttLl9faWxzaGlmdF9fPXskbmFtZTpcIl9faWxzaGlmdF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfbHNoaWZ0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsXG4kdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZjw8PXZhbHVlLlwifTttLl9faXJzaGlmdF9fPXskbmFtZTpcIl9faXJzaGlmdF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfcnNoaWZ0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGY9Pj52YWx1ZS5cIn07bS5fX2FuZF9fPXskbmFtZTpcIl9fYW5kX19cIiwkc2xvdF9uYW1lOlwibmIkYW5kXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYmdmFsdWUuXCJ9O20uX19yYW5kX189eyRuYW1lOlwiX19yYW5kX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmZWxjdGVkX2FuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIixcbiRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlJnNlbGYuXCJ9O20uX19pYW5kX189eyRuYW1lOlwiX19pYW5kX19cIiwkc2xvdF9uYW1lOlwibmIkYW5kXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYmPXZhbHVlLlwifTttLl9feG9yX189eyRuYW1lOlwiX194b3JfX1wiLCRzbG90X25hbWU6XCJuYiR4b3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZl52YWx1ZS5cIn07bS5fX3J4b3JfXz17JG5hbWU6XCJfX3J4b3JfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfeG9yXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlXnNlbGYuXCJ9O1xubS5fX2l4b3JfXz17JG5hbWU6XCJfX2l4b3JfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX3hvclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmXj12YWx1ZS5cIn07bS5fX29yX189eyRuYW1lOlwiX19vcl9fXCIsJHNsb3RfbmFtZTpcIm5iJG9yXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZ8dmFsdWUuXCJ9O20uX19yb3JfXz17JG5hbWU6XCJfX3Jvcl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9vclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZXxzZWxmLlwifTttLl9faW9yX189eyRuYW1lOlwiX19pb3JfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX29yXCIsXG4kc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZnw9dmFsdWUuXCJ9O20uX19pbnRfXz17JG5hbWU6XCJfX2ludF9fXCIsJHNsb3RfbmFtZTpcIm5iJGludFwiLCRzbG90X2Z1bmM6ZChcIl9faW50X19cIixTay5idWlsdGluLmNoZWNrSW50LFwiaW50XCIpLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJpbnQoc2VsZilcIn07bS5fX2Zsb2F0X189eyRuYW1lOlwiX19mbG9hdF9fXCIsJHNsb3RfbmFtZTpcIm5iJGZsb2F0XCIsJHNsb3RfZnVuYzpkKFwiX19mbG9hdF9fXCIsU2suYnVpbHRpbi5jaGVja0Zsb2F0LFwiZmxvYXRcIiksJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcImZsb2F0KHNlbGYpXCJ9O20uX19mbG9vcmRpdl9fPXskbmFtZTpcIl9fZmxvb3JkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRmbG9vcl9kaXZpZGVcIixcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmLy92YWx1ZS5cIn07bS5fX3JmbG9vcmRpdl9fPXskbmFtZTpcIl9fcmZsb29yZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2Zsb29yX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZS8vc2VsZi5cIn07bS5fX2lmbG9vcmRpdl9fPXskbmFtZTpcIl9faWZsb29yZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9mbG9vcl9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi8vPXZhbHVlLlwifTttLl9fdHJ1ZWRpdl9fPXskbmFtZTpcIl9fdHJ1ZWRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJGRpdmlkZVwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYvdmFsdWUuXCJ9O20uX19ydHJ1ZWRpdl9fPXskbmFtZTpcIl9fcnRydWVkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlL3NlbGYuXCJ9O20uX19pdHJ1ZWRpdl9fPXskbmFtZTpcIl9faXRydWVkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmLz12YWx1ZS5cIn07bS5fX2luZGV4X189eyRuYW1lOlwiX19pbmRleF9fXCIsJHNsb3RfbmFtZTpcIm5iJGluZGV4XCIsJHNsb3RfZnVuYzpkKFwiX19pbmRleF9fXCIsXG5Tay5idWlsdGluLmNoZWNrSW50LFwiaW50XCIsYT0+YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZiBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciwgaWYgc2VsZiBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIGFuIGluZGV4IGludG8gYSBsaXN0LlwifTttLl9fcG93X189eyRuYW1lOlwiX19wb3dfX1wiLCRzbG90X25hbWU6XCJuYiRwb3dlclwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO3JldHVybiB2b2lkIDA9PWM/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQsW2JdKTpTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZCxbYixjXSl9fSwkd3JhcHBlcjpiLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgbW9kPU5vbmUsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjEsXG5NYXhBcmdzOjJ9LCRkb2M6XCJSZXR1cm4gcG93KHNlbGYsIHZhbHVlLCBtb2QpLlwifTttLl9fcnBvd19fPXskbmFtZTpcIl9fcnBvd19fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9wb3dlclwiLCRzbG90X2Z1bmM6bS5fX3Bvd19fLiRzbG90X2Z1bmMsJHdyYXBwZXI6YiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIG1vZD1Ob25lLCAvKVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJGRvYzpcIlJldHVybiBwb3codmFsdWUsIHNlbGYsIG1vZCkuXCJ9O20uX19pcG93X189eyRuYW1lOlwiX19pcG93X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9wb3dlclwiLCRzbG90X2Z1bmM6bS5fX3Bvd19fLiRzbG90X2Z1bmMsJHdyYXBwZXI6YiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIG1vZD1Ob25lLCAvKVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJGRvYzpcIkltcGxlbWVudCAqKj1cIn07bS5fX21hdG11bF9fPXskbmFtZTpcIl9fbWF0bXVsX19cIiwkc2xvdF9uYW1lOlwibmIkbWF0cml4X211bHRpcGx5XCIsXG4kc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZkB2YWx1ZS5cIn07bS5fX3JtYXRtdWxfXz17JG5hbWU6XCJfX3JtYXRtdWxfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlQHNlbGYuXCJ9O20uX19pbWF0bXVsX189eyRuYW1lOlwiX19pbWF0bXVsX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9tYXRyaXhfbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZkA9dmFsdWUuXCJ9O20uX19sb25nX189eyRuYW1lOlwiX19sb25nX19cIiwkc2xvdF9uYW1lOlwibmIkbG9uZ1wiLFxuJHNsb3RfZnVuYzpkKFwiX19sb25nX19cIixTay5idWlsdGluLmNoZWNrSW50LFwiaW50XCIpLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJpbnQoc2VsZilcIn07dmFyIEEsdD17bmV4dDp7JG5hbWU6XCJuZXh0XCIsJHNsb3RfbmFtZTpcInRwJGl0ZXJuZXh0XCIsJHNsb3RfZnVuYzptLl9fbmV4dF9fLiRzbG90X2Z1bmMsJHdyYXBwZXI6bS5fX25leHRfXy4kd3JhcHBlciwkdGV4dHNpZzptLl9fbmV4dF9fLiR0ZXh0c2lnLCRmbGFnczptLl9fbmV4dF9fLiRmbGFnc30sX19ub256ZXJvX186eyRuYW1lOlwiX19ub256ZXJvX19cIiwkc2xvdF9uYW1lOlwibmIkYm9vbFwiLCRzbG90X2Z1bmM6ZChcIl9fbm9uemVyb19fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiLGE9PjAhPT1hLnYpLCR3cmFwcGVyOmwoYSxhPT5uZXcgU2suYnVpbHRpbi5ib29sKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcInguX19ub256ZXJvX18oKSA8PT0+IHggIT0gMFwifSxcbl9fZGl2X186eyRuYW1lOlwiX19kaXZfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgb3RoZXIvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwieC5fX2Rpdl9fKHkpIDw9PT4geC95XCJ9LF9fcmRpdl9fOnskbmFtZTpcIl9fcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgb3RoZXIvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwieC5fX3JkaXZfXyh5KSA8PT0+IHgveVwifSxfX2lkaXZfXzp7JG5hbWU6XCJfX2lkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCBvdGhlci8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJpbXBsZW1lbnQgc2VsZiAvPSBvdGhlclwifX07U2suc3ViU2xvdHM9e21haW5fc2xvdHM6T2JqZWN0LmVudHJpZXMoe3RwJGluaXQ6XCJfX2luaXRfX1wiLFxudHAkY2FsbDpcIl9fY2FsbF9fXCIsJHI6XCJfX3JlcHJfX1wiLHRwJHN0cjpcIl9fc3RyX19cIix0cCRnZXRhdHRyOlwiX19nZXRhdHRyaWJ1dGVfX1wiLHRwJHNldGF0dHI6W1wiX19zZXRhdHRyX19cIixcIl9fZGVsYXR0cl9fXCJdLG9iJGVxOlwiX19lcV9fXCIsb2IkbmU6XCJfX25lX19cIixvYiRsdDpcIl9fbHRfX1wiLG9iJGxlOlwiX19sZV9fXCIsb2IkZ3Q6XCJfX2d0X19cIixvYiRnZTpcIl9fZ2VfX1wiLHRwJGRlc2NyX2dldDpcIl9fZ2V0X19cIix0cCRkZXNjcl9zZXQ6W1wiX19zZXRfX1wiLFwiX19kZWxldGVfX1wiXSx0cCRpdGVyOlwiX19pdGVyX19cIix0cCRpdGVybmV4dDpcIl9fbmV4dF9fXCJ9KSxudW1iZXJfc2xvdHM6T2JqZWN0LmVudHJpZXMoe25iJGFiczpcIl9fYWJzX19cIixuYiRuZWdhdGl2ZTpcIl9fbmVnX19cIixuYiRwb3NpdGl2ZTpcIl9fcG9zX19cIixuYiRpbnQ6XCJfX2ludF9fXCIsbmIkbG9uZzpcIl9fbG9uZ19fXCIsbmIkZmxvYXQ6XCJfX2Zsb2F0X19cIixuYiRhZGQ6XCJfX2FkZF9fXCIsbmIkcmVmbGVjdGVkX2FkZDpcIl9fcmFkZF9fXCIsXG5uYiRpbnBsYWNlX2FkZDpcIl9faWFkZF9fXCIsbmIkc3VidHJhY3Q6XCJfX3N1Yl9fXCIsbmIkcmVmbGVjdGVkX3N1YnRyYWN0OlwiX19yc3ViX19cIixuYiRpbnBsYWNlX3N1YnRyYWN0OlwiX19pc3ViX19cIixuYiRtdWx0aXBseTpcIl9fbXVsX19cIixuYiRyZWZsZWN0ZWRfbXVsdGlwbHk6XCJfX3JtdWxfX1wiLG5iJGlucGxhY2VfbXVsdGlwbHk6XCJfX2ltdWxfX1wiLG5iJGZsb29yX2RpdmlkZTpcIl9fZmxvb3JkaXZfX1wiLG5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGU6XCJfX3JmbG9vcmRpdl9fXCIsbmIkaW5wbGFjZV9mbG9vcl9kaXZpZGU6XCJfX2lmbG9vcmRpdl9fXCIsbmIkaW52ZXJ0OlwiX19pbnZlcnRfX1wiLG5iJHJlbWFpbmRlcjpcIl9fbW9kX19cIixuYiRyZWZsZWN0ZWRfcmVtYWluZGVyOlwiX19ybW9kX19cIixuYiRpbnBsYWNlX3JlbWFpbmRlcjpcIl9faW1vZF9fXCIsbmIkZGl2bW9kOlwiX19kaXZtb2RfX1wiLG5iJHJlZmxlY3RlZF9kaXZtb2Q6XCJfX3JkaXZtb2RfX1wiLG5iJHBvd2VyOlwiX19wb3dfX1wiLG5iJHJlZmxlY3RlZF9wb3dlcjpcIl9fcnBvd19fXCIsXG5uYiRpbnBsYWNlX3Bvd2VyOlwiX19pcG93X19cIixuYiRkaXZpZGU6XCJfX3RydWVkaXZfX1wiLG5iJHJlZmxlY3RlZF9kaXZpZGU6XCJfX3J0cnVlZGl2X19cIixuYiRpbnBsYWNlX2RpdmlkZTpcIl9faXRydWVkaXZfX1wiLG5iJGJvb2w6XCJfX2Jvb2xfX1wiLG5iJGFuZDpcIl9fYW5kX19cIixuYiRyZWZsZWN0ZWRfYW5kOlwiX19yYW5kX19cIixuYiRpbnBsYWNlX2FuZDpcIl9faWFuZF9fXCIsbmIkb3I6XCJfX29yX19cIixuYiRyZWZsZWN0ZWRfb3I6XCJfX3Jvcl9fXCIsbmIkaW5wbGFjZV9vcjpcIl9faW9yX19cIixuYiR4b3I6XCJfX3hvcl9fXCIsbmIkcmVmbGVjdGVkX3hvcjpcIl9fcnhvcl9fXCIsbmIkaW5wbGFjZV94b3I6XCJfX2l4b3JfX1wiLG5iJGxzaGlmdDpcIl9fbHNoaWZ0X19cIixuYiRyZWZsZWN0ZWRfbHNoaWZ0OlwiX19ybHNoaWZ0X19cIixuYiRyc2hpZnQ6XCJfX3JzaGlmdF9fXCIsbmIkcmVmbGVjdGVkX3JzaGlmdDpcIl9fcnJzaGlmdF9fXCIsbmIkaW5wbGFjZV9sc2hpZnQ6XCJfX2lsc2hpZnRfX1wiLG5iJGlucGxhY2VfcnNoaWZ0OlwiX19pcnNoaWZ0X19cIixcbm5iJG1hdHJpeF9tdWx0aXBseTpcIl9fbWF0bXVsX19cIixuYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5OlwiX19ybWF0bXVsX19cIixuYiRpbnBsYWNlX21hdHJpeF9tdWx0aXBseTpcIl9faW1hdG11bF9fXCJ9KSxzZXF1ZW5jZV9hbmRfbWFwcGluZ19zbG90czpPYmplY3QuZW50cmllcyh7c3EkbGVuZ3RoOlwiX19sZW5fX1wiLHNxJGNvbnRhaW5zOlwiX19jb250YWluc19fXCIsbXAkc3Vic2NyaXB0OlwiX19nZXRpdGVtX19cIixtcCRhc3Nfc3Vic2NyaXB0OltcIl9fc2V0aXRlbV9fXCIsXCJfX2RlbGl0ZW1fX1wiXSxuYiRhZGQ6XCJfX2FkZF9fXCIsbmIkbXVsdGlwbHk6XCJfX211bF9fXCIsbmIkcmVmbGVjdGVkX211bHRpcGx5OlwiX19ybXVsX19cIixuYiRpbnBsYWNlX2FkZDpcIl9faWFkZF9fXCIsbmIkaW5wbGFjZV9tdWx0aXBseTpcIl9faW11bF9fXCJ9KX07U2sucmVmbGVjdGVkTnVtYmVyU2xvdHM9e25iJGFkZDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2FkZFwifSxuYiRzdWJ0cmFjdDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX3N1YnRyYWN0XCIsXG5zbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJHN1YnRyYWN0KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkbXVsdGlwbHk6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9tdWx0aXBseVwifSxuYiRkaXZpZGU6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9kaXZpZGVcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGRpdmlkZSh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJGZsb29yX2RpdmlkZTp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2Zsb29yX2RpdmlkZVwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkZmxvb3JfZGl2aWRlKHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sXG5uYiRyZW1haW5kZXI6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9yZW1haW5kZXJcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJHJlbWFpbmRlcih0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJGRpdm1vZDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2Rpdm1vZFwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkZGl2bW9kKHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkcG93ZXI6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9wb3dlclwiLHNsb3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRwb3dlcih0aGlzLGIpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkYW5kOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfYW5kXCJ9LFxubmIkb3I6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9vclwifSxuYiR4b3I6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF94b3JcIn0sbmIkbHNoaWZ0OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfbHNoaWZ0XCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRsc2hpZnQodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRyc2hpZnQ6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9yc2hpZnRcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJHJzaGlmdCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJG1hdHJpeF9tdWx0aXBseTp7cmVmbGVjdGVkOlwibmIkcmVmbGV4dGVkX21hdHJpeF9tdWx0aXBseVwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP1xuYS5uYiRtYXRyaXhfbXVsdGlwbHkodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fX07U2suc2VxdWVuY2VBbmRNYXBwaW5nU2xvdHM9e3NxJGNvbmNhdDpbXCJuYiRhZGRcIl0sc3EkcmVwZWF0OltcIm5iJG11bHRpcGx5XCIsXCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIl0sbXAkbGVuZ3RoOltcInNxJGxlbmd0aFwiXSxzcSRpbnBsYWNlX3JlcGVhdDpbXCJuYiRpbnBsYWNlX211bHRpcGx5XCJdLHNxJGlucGxhY2VfY29uY2F0OltcIm5iJGlucGxhY2VfYWRkXCJdfTtTay5kdW5kZXJUb1NrdWxwdD17X19yZXByX186XCIkclwiLF9fc3RyX186XCJ0cCRzdHJcIixfX2luaXRfXzpcInRwJGluaXRcIixfX25ld19fOlwidHAkbmV3XCIsX19oYXNoX186XCJ0cCRoYXNoXCIsX19jYWxsX186XCJ0cCRjYWxsXCIsX19pdGVyX186XCJ0cCRpdGVyXCIsX19uZXh0X186XCJ0cCRpdGVybmV4dFwiLF9fZXFfXzpcIm9iJGVxXCIsX19uZV9fOlwib2IkbmVcIixfX2x0X186XCJvYiRsdFwiLF9fbGVfXzpcIm9iJGxlXCIsXG5fX2d0X186XCJvYiRndFwiLF9fZ2VfXzpcIm9iJGdlXCIsX19hYnNfXzpcIm5iJGFic1wiLF9fbmVnX186XCJuYiRuZWdhdGl2ZVwiLF9fcG9zX186XCJuYiRwb3NpdGl2ZVwiLF9faW50X186XCJuYiRpbnRcIixfX2Zsb2F0X186XCJuYiRmbG9hdFwiLF9fYWRkX186XCJuYiRhZGRcIixfX3JhZGRfXzpcIm5iJHJlZmxlY3RlZF9hZGRcIixfX2lhZGRfXzpcIm5iJGlucGxhY2VfYWRkXCIsX19zdWJfXzpcIm5iJHN1YnRyYWN0XCIsX19yc3ViX186XCJuYiRyZWZsZWN0ZWRfc3VidHJhY3RcIixfX2lzdWJfXzpcIm5iJGlucGxhY2Vfc3VidHJhY3RcIixfX211bF9fOlwibmIkbXVsdGlwbHlcIixfX3JtdWxfXzpcIm5iJHJlZmxlY3RlZF9tdWx0aXBseVwiLF9faW11bF9fOlwibmIkaW5wbGFjZV9tdWx0aXBseVwiLF9fdHJ1ZWRpdl9fOlwibmIkZGl2aWRlXCIsX19ydHJ1ZWRpdl9fOlwibmIkcmVmbGVjdGVkX2RpdmlkZVwiLF9faXRydWVkaXZfXzpcIm5iJGlucGxhY2VfZGl2aWRlXCIsX19mbG9vcmRpdl9fOlwibmIkZmxvb3JfZGl2aWRlXCIsX19yZmxvb3JkaXZfXzpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIixcbl9faWZsb29yZGl2X186XCJuYiRpbnBsYWNlX2Zsb29yX2RpdmlkZVwiLF9faW52ZXJ0X186XCJuYiRpbnZlcnRcIixfX21vZF9fOlwibmIkcmVtYWluZGVyXCIsX19ybW9kX186XCJuYiRyZWZsZWN0ZWRfcmVtYWluZGVyXCIsX19pbW9kX186XCJuYiRpbnBsYWNlX3JlbWFpbmRlclwiLF9fZGl2bW9kX186XCJuYiRkaXZtb2RcIixfX3JkaXZtb2RfXzpcIm5iJHJlZmxlY3RlZF9kaXZtb2RcIixfX3Bvd19fOlwibmIkcG93ZXJcIixfX3Jwb3dfXzpcIm5iJHJlZmxlY3RlZF9wb3dlclwiLF9faXBvd19fOlwibmIkaW5wbGFjZV9wb3dlclwiLF9fYm9vbF9fOlwibmIkYm9vbFwiLF9fbG9uZ19fOlwibmIkbG9uZ1wiLF9fbHNoaWZ0X186XCJuYiRsc2hpZnRcIixfX3Jsc2hpZnRfXzpcIm5iJHJlZmxlY3RlZF9sc2hpZnRcIixfX2lsc2hpZnRfXzpcIm5iJGlucGxhY2VfbHNoaWZ0XCIsX19yc2hpZnRfXzpcIm5iJHJzaGlmdFwiLF9fcnJzaGlmdF9fOlwibmIkcmVmbGVjdGVkX3JzaGlmdFwiLF9faXJzaGlmdF9fOlwibmIkaW5wbGFjZV9yc2hpZnRcIixcbl9fYW5kX186XCJuYiRhbmRcIixfX3JhbmRfXzpcIm5iJHJlZmxlY3RlZF9hbmRcIixfX2lhbmRfXzpcIm5iJGlucGxhY2VfYW5kXCIsX19vcl9fOlwibmIkb3JcIixfX3Jvcl9fOlwibmIkcmVmbGVjdGVkX29yXCIsX19pb3JfXzpcIm5iJGlucGxhY2Vfb3JcIixfX3hvcl9fOlwibmIkeG9yXCIsX19yeG9yX186XCJuYiRyZWZsZWN0ZWRfeG9yXCIsX19peG9yX186XCJuYiRpbnBsYWNlX3hvclwiLF9fbWF0bXVsX186XCJuYiRtYXRyaXhfbXVsdGlwbHlcIixfX3JtYXRtdWxfXzpcIm5iJHJlZmxlY3RlZF9tYXRyaXhfbXVsdGlwbHlcIixfX2ltYXRtdWxfXzpcIm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5XCIsX19nZXRfXzpcInRwJGRlc2NyX2dldFwiLF9fc2V0X186XCJ0cCRkZXNjcl9zZXRcIixfX2RlbGV0ZV9fOlwidHAkZGVzY3Jfc2V0XCIsX19nZXRhdHRyaWJ1dGVfXzpcInRwJGdldGF0dHJcIixfX2dldGF0dHJfXzpcInRwJGdldGF0dHJcIixfX3NldGF0dHJfXzpcInRwJHNldGF0dHJcIixfX2RlbGF0dHJfXzpcInRwJHNldGF0dHJcIixfX2xlbl9fOlwic3EkbGVuZ3RoXCIsXG5fX2NvbnRhaW5zX186XCJzcSRjb250YWluc1wiLF9fZ2V0aXRlbV9fOlwibXAkc3Vic2NyaXB0XCIsX19zZXRpdGVtX186XCJtcCRhc3Nfc3Vic2NyaXB0XCIsX19kZWxpdGVtX186XCJtcCRhc3Nfc3Vic2NyaXB0XCJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnNldHVwRHVuZGVyTWV0aG9kc1wiLFNrLnNldHVwRHVuZGVyTWV0aG9kcyk7U2suc2V0dXBEdW5kZXJNZXRob2RzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiLGMpe2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBlPWFbZF0ucHJvdG90eXBlO2UuaGFzT3duUHJvcGVydHkoYyl8fChlW2NdPWVbYl0sZGVsZXRlIGVbYl0pfX12YXIgYz1Tay5zbG90cztpZighYXx8dm9pZCAwIT09QSl7dmFyIGQ9U2suYWJzdHIuYnVpbHQkaXRlcmF0b3JzLGU9W1NrLmJ1aWx0aW4uaW50XyxTay5idWlsdGluLmxuZyxTay5idWlsdGluLmZsb2F0XyxTay5idWlsdGluLmNvbXBsZXhdLGY9U2suc3ViU2xvdHMubnVtYmVyX3Nsb3RzLGc9U2suc3ViU2xvdHMubWFpbl9zbG90cyxcbmg9Zy5maW5kSW5kZXgoYT0+XCJ0cCRpdGVybmV4dFwiPT09YVswXSksaz1mLmZpbmRJbmRleChhPT5cIm5iJGJvb2xcIj09PWFbMF0pLGw9U2suZHVuZGVyVG9Ta3VscHQ7aWYoYSl7bC5fX2Jvb2xfXz1cIm5iJGJvb2xcIjtsLl9fbmV4dF9fPVwidHAkaXRlcm5leHRcIjtkZWxldGUgbC5fX25vbnplcm9fXztkZWxldGUgbC5fX2Rpdl9fO2RlbGV0ZSBsLl9fcmRpdl9fO2RlbGV0ZSBsLl9faWRpdl9fO2RlbGV0ZSBsLm5leHQ7Zm9yKGxldCBhIGluIEEpY1thXT1BW2FdO2ZvcihsZXQgYSBpbiB0KWRlbGV0ZSBjW2FdO2ZvcihhPTA7YTxlLmxlbmd0aDthKyspYz1lW2FdLnByb3RvdHlwZSxkZWxldGUgYy5fX2Rpdl9fLGRlbGV0ZSBjLl9fcmRpdl9fO2dbaF1bMV09XCJfX25leHRfX1wiO2Zba11bMV09XCJfX2Jvb2xfX1wiO2IoZCxcIm5leHRcIixcIl9fbmV4dF9fXCIpO2IoZSxcIl9fYm9vbF9fXCIsXCJfX25vbnplcm9fX1wiKX1lbHNle3ZvaWQgMD09PUEmJihjLnB5MyRzbG90cz17X19uZXh0X186Yy5fX25leHRfX30sXG5BPWMucHkzJHNsb3RzKTtsLm5leHQ9XCJ0cCRpdGVybmV4dFwiO2wuX19ub256ZXJvX189XCJuYiRib29sXCI7bC5fX2Rpdl9fPVwibmIkZGl2aWRlXCI7bC5fX3JkaXZfXz1cIm5iJHJlZmxlY3RlZF9kaXZpZGVcIjtsLl9faWRpdl9fPVwibmIkaW5wbGFjZV9kaXZpZGVcIjtkZWxldGUgbC5fX2Jvb2xfXztkZWxldGUgbC5fX25leHRfXztmb3IobGV0IGEgaW4gdCljW2FdPXRbYV07Zm9yKGxldCBhIGluIEEpZGVsZXRlIGNbYV07Z1toXVsxXT1cIm5leHRcIjtmW2tdWzFdPVwiX19ub256ZXJvX19cIjtiKGQsXCJfX25leHRfX1wiLFwibmV4dFwiKTtiKGUsXCJfX25vbnplcm9fX1wiLFwiX19ib29sX19cIik7Zm9yKGQ9MDtkPGUubGVuZ3RoO2QrKylmPWVbZF0sZz1mLnByb3RvdHlwZSxnLmhhc093blByb3BlcnR5KFwiX19kaXZfX1wiKXx8KGcuX19kaXZfXz1uZXcgU2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3IoZix0Ll9fZGl2X18sZy5uYiRkaXZpZGUpLGcuX19yZGl2X189bmV3IFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKGYsXG50Ll9fcmRpdl9fLFNrLnJlZmxlY3RlZE51bWJlclNsb3RzLm5iJGRpdmlkZS5zbG90KSl9fX19LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGgsZCl7cmV0dXJuIFNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoYSx7Y29uc3RydWN0b3I6ZC5jb25zdHJ1Y3RvcixzbG90czpPYmplY3QuYXNzaWduKHt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0ciwkcjplfSxkLnNsb3RzKSxnZXRzZXRzOk9iamVjdC5hc3NpZ24oZC5nZXRzZXRzfHx7fSxmKSxwcm90bzpPYmplY3QuYXNzaWduKGQucHJvdG98fHt9LHtkJHJlcHJfbmFtZTpofHxhLGQkY2hlY2s6YyxkJHNldF9jaGVjazpifSksZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KX1mdW5jdGlvbiBjKGEpe2lmKG51bGw9PWEpcmV0dXJuIHRoaXM7aWYoIWEub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMuZCR0eXBlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcblwiJyByZXF1aXJlcyBhICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IGJ1dCByZWNlaXZlZCBhICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0XCIpO31mdW5jdGlvbiBiKGEpe2lmKCFhLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3RcIik7fWZ1bmN0aW9uIGUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPFwiK3RoaXMuZCRyZXByX25hbWUrXCIgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdHM+XCIpfWNvbnN0IGY9e19fZG9jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5kJGRlZi4kZG9jP1xubmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuZCRkZWYuJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19vYmpjbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCR0eXBlfX0sX19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuZCRuYW1lKX19fTttPXtfX3RleHRfc2lnbmF0dXJlX186eyRnZXQoKXtyZXR1cm4gdGhpcy5kJGRlZi4kdGV4dHNpZz9uZXcgU2suYnVpbHRpbi5zdHIodGhpcy5kJGRlZi4kdGV4dHNpZyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfX19O1NrLmJ1aWx0aW4uZ2V0c2V0X2Rlc2NyaXB0b3I9YShcImdldHNldF9kZXNjcmlwdG9yXCIsdm9pZCAwLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMuZCRkZWY9Yjt0aGlzLiRnZXQ9Yi4kZ2V0O3RoaXMuJHNldD1iLiRzZXQ7dGhpcy5kJHR5cGU9YTt0aGlzLmQkbmFtZT1iLiRuYW1lfSxzbG90czp7dHAkZGVzY3JfZ2V0KGEsYil7aWYoYj10aGlzLmQkY2hlY2soYSkpcmV0dXJuIGI7XG5pZih2b2lkIDAhPT10aGlzLiRnZXQpcmV0dXJuIHRoaXMuJGdldC5jYWxsKGEpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiZ2V0c2V0X2Rlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdHMgaXMgbm90IHJlYWRhYmxlXCIpO30sdHAkZGVzY3Jfc2V0KGEsYil7dGhpcy5kJHNldF9jaGVjayhhKTtpZih2b2lkIDAhPT10aGlzLiRzZXQpcmV0dXJuIHRoaXMuJHNldC5jYWxsKGEsYik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCJhdHRyaWJ1dGUgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdHMgaXMgcmVhZG9ubHlcIik7fX19KTtTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yPWEoXCJtZXRob2RfZGVzY3JpcHRvclwiLFwibWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7dGhpcy5kJGRlZj1cbmI7dGhpcy4kbWV0aD1iLiRtZXRoO3RoaXMuZCR0eXBlPWE7dGhpcy5kJG5hbWU9Yi4kbmFtZXx8XCI8bmF0aXZlIEpTPlwiO3RoaXMuJGZsYWdzPWE9Yi4kZmxhZ3N8fHt9O2EuRmFzdENhbGwmJmEuTm9Ld2FyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZEZhc3RDYWxsTm9Ld2FyZ3M6YS5GYXN0Q2FsbD90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aG9kRmFzdENhbGw6YS5Ob0FyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZENhbGxOb0FyZ3M6YS5PbmVBcmc/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZENhbGxPbmVBcmc6YS5OYW1lZEFyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZENhbGxOYW1lZEFyZ3M6dm9pZCAwIT09YS5NaW5BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsTWluQXJnczoodGhpcy5mdW5jX2NvZGU9Yi4kbWV0aCx0aGlzLnRwJGNhbGw9dGhpcy4kZGVmYXVsdENhbGwsdGhpcy4kbWVtb2lzZUZsYWdzPVNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUuJG1lbW9pc2VGbGFncyxcbnRoaXMuJHJlc29sdmVBcmdzPVNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUuJHJlc29sdmVBcmdzKX0sc2xvdHM6e3RwJGNhbGwoYSxiKXtyZXR1cm4gdGhpcy50cCRjYWxsKGEsYil9LHRwJGRlc2NyX2dldChhLGIpe2xldCBjO3JldHVybihjPXRoaXMuZCRjaGVjayhhKSk/YzpuZXcgU2suYnVpbHRpbi5za19tZXRob2QodGhpcy5kJGRlZixhKX19LGdldHNldHM6bSxwcm90bzp7JG1ldGhvZEZhc3RDYWxsKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMsYSxiKX0sJG1ldGhvZEZhc3RDYWxsTm9Ld2FyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy5kJG5hbWUsYik7cmV0dXJuIHRoaXMuJG1ldGguY2FsbChjLGEpfSwkbWV0aG9kQ2FsbE5vQXJncyhhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7U2suYWJzdHIuY2hlY2tOb0FyZ3ModGhpcy5kJG5hbWUsXG5hLGIpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYyl9LCRtZXRob2RDYWxsT25lQXJnKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLmQkbmFtZSxhLGIpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYyxhWzBdKX0sJG1ldGhvZENhbGxOYW1lZEFyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO2E9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3ModGhpcy5kJG5hbWUsdGhpcy4kZmxhZ3MuTmFtZWRBcmdzLGEsYix0aGlzLiRmbGFncy5EZWZhdWx0cyk7cmV0dXJuIHRoaXMuJG1ldGguY2FsbChjLC4uLmEpfSwkbWV0aG9kQ2FsbE1pbkFyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy5kJG5hbWUsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuZCRuYW1lLGEsdGhpcy4kZmxhZ3MuTWluQXJncyxcbnRoaXMuJGZsYWdzLk1heEFyZ3MpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYywuLi5hKX0sJGRlZmF1bHRDYWxsKGEsYil7dGhpcy5tJGNoZWNrc2VsZihhWzBdKTtyZXR1cm4gU2suYnVpbHRpbi5mdW5jLnByb3RvdHlwZS50cCRjYWxsLmNhbGwodGhpcyxhLGIpfSxtJGNoZWNrc2VsZihhKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBuZWVkcyBhbiBhcmd1bWVudFwiKTt0aGlzLmQkY2hlY2soYSl9fX0pO1NrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yPWEoXCJ3cmFwcGVyX2Rlc2NyaXB0b3JcIixcInNsb3Qgd3JhcHBlclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIsYyl7dGhpcy5kJGRlZj1iO3RoaXMuZCR0eXBlPWE7dGhpcy5kJG5hbWU9Yy4kbmFtZT1iLiRuYW1lO3RoaXMuZCR3cmFwcGVkPWN9LHNsb3RzOnt0cCRkZXNjcl9nZXQoYSxcbmIpe2xldCBjO3JldHVybihjPXRoaXMuZCRjaGVjayhhKSk/YzpuZXcgU2suYnVpbHRpbi5tZXRob2Rfd3JhcHBlcih0aGlzLGEpfSx0cCRjYWxsKGEsYil7aWYoMT5hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcIik7Y29uc3QgYz1hLnNoaWZ0KCk7aWYoIWMub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMuZCR0eXBlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgcmVxdWlyZXMgYSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBidXQgcmVjZWl2ZWQgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInXCIpO3JldHVybiB0aGlzLnJhdyRjYWxsKGMsYSxiKX19LHByb3RvOntyYXckY2FsbChhLGIsYyl7dGhpcy5kJHdyYXBwZWQuJG5hbWU9XG50aGlzLmQkbmFtZTtyZXR1cm4gdGhpcy5kJGRlZi4kd3JhcHBlci5jYWxsKHRoaXMuZCR3cmFwcGVkLGEsYixjKX19fSk7U2suYnVpbHRpbi5tZXRob2Rfd3JhcHBlcj1hKFwibWV0aG9kX3dyYXBwZXJcIix2b2lkIDAse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7dGhpcy5tJGRlc2NyPWE7dGhpcy5tJHNlbGY9Yjt0aGlzLmQkZGVmPWEuZCRkZWY7dGhpcy5kJG5hbWU9YS5kJG5hbWU7dGhpcy5kJHR5cGU9YS5kJHR5cGV9LHNsb3RzOnt0cCRjYWxsKGEsYil7cmV0dXJuIHRoaXMubSRkZXNjci5yYXckY2FsbCh0aGlzLm0kc2VsZixhLGIpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKFwiRXFcIiE9PWImJlwiTm90RXFcIiE9PWJ8fCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXIpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPXRoaXMubSRzZWxmPT09YS5tJHNlbGYmJnRoaXMubSRkZXNjcj09PWEubSRkZXNjcjtyZXR1cm5cIkVxXCI9PT1cbmI/YTohYX0sJHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPG1ldGhvZC13cmFwcGVyICdcIit0aGlzLmQkbmFtZStcIicgb2YgXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy5tJHNlbGYpK1wiIG9iamVjdD5cIil9fSxnZXRzZXRzOntfX3NlbGZfXzp7JGdldCgpe3JldHVybiB0aGlzLm0kc2VsZn19fX0pO1NrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcj1hKFwiY2xhc3NtZXRob2RfZGVzY3JpcHRvclwiLFwibWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7dGhpcy5kJGRlZj1iO3RoaXMuJG1ldGg9Yi4kbWV0aDt0aGlzLmQkdHlwZT1hO3RoaXMuZCRuYW1lPWIuJG5hbWV8fFwiPG5hdGl2ZSBKUz5cIn0sc2xvdHM6e3RwJGNhbGwoYSxiKXtpZigxPmEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBuZWVkcyBhbiBhcmd1bWVudFwiKTtcbmNvbnN0IGM9YS5zaGlmdCgpO3JldHVybiB0aGlzLnRwJGRlc2NyX2dldChudWxsLGMpLnRwJGNhbGwoYSxiKX0sdHAkZGVzY3JfZ2V0KGEsYixjKXtpZih2b2lkIDA9PT1iKWlmKG51bGwhPT1hKWI9Ynx8YS5vYiR0eXBlO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIGZvciB0eXBlICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgbmVlZHMgYW4gb2JqZWN0IG9yIGEgdHlwZVwiKTtpZihiLm9iJHR5cGUhPT1Tay5idWlsdGluLnR5cGUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIGZvciB0eXBlICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgbmVlZHMgYSB0eXBlIG5vdCBhICdcIitTay5hYnN0ci50eXBlTmFtZShiKStcIicgYXMgYXJnIDJcIik7aWYoIWIuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrXG50aGlzLmQkbmFtZStcIicgcmVxdWlyZXMgYSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBidXQgcmVjZWl2ZWQgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXCInIG9iamVjdFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHRoaXMuZCRkZWYsYil9fSxnZXRzZXRzOm19KTtbU2suYnVpbHRpbi5tZXRob2RfZGVzY3JpcHRvcixTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yLFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yLFNrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXIsU2suYnVpbHRpbi5jbGFzc21ldGhvZF9kZXNjcmlwdG9yXS5mb3JFYWNoKGE9PntTay5hYnN0ci5zZXRVcFNsb3RzKGEpO1NrLmFic3RyLnNldFVwTWV0aG9kcyhhKTtTay5hYnN0ci5zZXRVcEdldFNldHMoYSl9KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnNrX21ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiYnVpbHRpbl9mdW5jdGlvbl9vcl9tZXRob2RcIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYil7dGhpcy4kbWV0aD1hLiRtZXRoLmJpbmQoYyk7dGhpcy4kZG9jPWEuJGRvYzt0aGlzLiRzZWxmPWN8fG51bGw7dGhpcy4kbW9kdWxlPWI/bmV3IFNrLmJ1aWx0aW4uc3RyKGIpOm51bGw7dGhpcy4kbmFtZT1hLiRuYW1lfHxhLiRtZXRoLm5hbWV8fFwiPG5hdGl2ZSBKUz5cIjt0aGlzLm0kZGVmPWE7dGhpcy4kdGV4dHNpZz1hLiR0ZXh0c2lnO3RoaXMuJGZsYWdzPWE9YS4kZmxhZ3N8fHt9O2EuRmFzdENhbGwmJmEuTm9Ld2FyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGZhc3RDYWxsTm9Ld2FyZ3M6YS5GYXN0Q2FsbD90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aDphLk5vQXJncz90aGlzLnRwJGNhbGw9dGhpcy4kY2FsbE5vQXJnczphLk9uZUFyZz90aGlzLnRwJGNhbGw9dGhpcy4kY2FsbE9uZUFyZzphLk5hbWVkQXJncz90aGlzLnRwJGNhbGw9dGhpcy4kY2FsbE5hbWVkQXJnczp2b2lkIDAhPT1hLk1pbkFyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxNaW5BcmdzOlxuKHRoaXMuZnVuY19jb2RlPXRoaXMuJG1ldGgsdGhpcy50cCRjYWxsPXRoaXMuJGRlZmF1bHRDYWxsTWV0aG9kKX0scHJvdG86eyRmYXN0Q2FsbE5vS3dhcmdzKGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO3JldHVybiB0aGlzLiRtZXRoKGEpfSwkY2FsbE5vQXJncyhhLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuJG5hbWUsYSxjKTtyZXR1cm4gdGhpcy4kbWV0aCgpfSwkY2FsbE9uZUFyZyhhLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKHRoaXMuJG5hbWUsYSxjKTtyZXR1cm4gdGhpcy4kbWV0aChhWzBdKX0sJGNhbGxOYW1lZEFyZ3MoYSxjKXthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKHRoaXMuJG5hbWUsdGhpcy4kZmxhZ3MuTmFtZWRBcmdzLGEsYyx0aGlzLiRmbGFncy5EZWZhdWx0cyk7cmV0dXJuIHRoaXMuJG1ldGgoLi4uYSl9LCRjYWxsTWluQXJncyhhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy4kbmFtZSxjKTtcblNrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGEsdGhpcy4kZmxhZ3MuTWluQXJncyx0aGlzLiRmbGFncy5NYXhBcmdzKTtyZXR1cm4gdGhpcy4kbWV0aCguLi5hKX0sJGRlZmF1bHRDYWxsTWV0aG9kKGEsYyl7cmV0dXJuIG51bGwhPT10aGlzLiRzZWxmP1NrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsW3RoaXMuJHNlbGYsLi4uYV0sYyk6U2suYnVpbHRpbi5mdW5jLnByb3RvdHlwZS50cCRjYWxsLmNhbGwodGhpcyxhLGMpfSwkbWVtb2lzZUZsYWdzKCl7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUuJG1lbW9pc2VGbGFncy5jYWxsKHRoaXMpfSwkcmVzb2x2ZUFyZ3MoKXtyZXR1cm4gU2suYnVpbHRpbi5mdW5jLnByb3RvdHlwZS4kcmVzb2x2ZUFyZ3MuY2FsbCh0aGlzKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0ciwkcigpe3JldHVybiBudWxsPT09XG50aGlzLiRzZWxmP25ldyBTay5idWlsdGluLnN0cihcIjxidWlsdC1pbiBmdW5jdGlvbiBcIit0aGlzLiRuYW1lK1wiPlwiKTpuZXcgU2suYnVpbHRpbi5zdHIoXCI8YnVpbHQtaW4gbWV0aG9kIFwiK3RoaXMuJG5hbWUrXCIgb2YgXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy4kc2VsZikrXCIgb2JqZWN0PlwiKX0sdHAkY2FsbChhLGMpe3JldHVybiB0aGlzLnRwJGNhbGwoYSxjKX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihcIkVxXCIhPT1jJiZcIk5vdEVxXCIhPT1jfHwhKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNrX21ldGhvZCkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2E9dGhpcy4kc2VsZj09PWEuJHNlbGYmJnRoaXMubSRkZWYuJG1ldGg9PT1hLm0kZGVmLiRtZXRoO3JldHVyblwiRXFcIj09PWM/YTohYX19LGdldHNldHM6e19fbW9kdWxlX186eyRnZXQoKXtyZXR1cm4gdGhpcy4kbW9kdWxlfHxTay5idWlsdGluLm5vbmUubm9uZSR9LCRzZXQoYSl7dGhpcy4kbW9kdWxlPVxuYT1hfHxTay5idWlsdGluLm5vbmUubm9uZSR9fSxfX2RvY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJGRvYz9uZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kZG9jKTpTay5idWlsdGluLm5vbmUubm9uZSR9fSxfX25hbWVfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kbmFtZSl9fSxfX3RleHRfc2lnbmF0dXJlX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJHRleHRzaWcpfX0sX19zZWxmX186eyRnZXQoKXtyZXR1cm4gdGhpcy4kc2VsZnx8U2suc3lzTW9kdWxlcy5tcCRsb29rdXAodGhpcy4kbW9kdWxlKXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX19fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5ub25lPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOb25lVHlwZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LHNsb3RzOnt0cCRuZXcoYSxjKXtTay5hYnN0ci5jaGVja05vQXJncyhcIk5vbmVUeXBlXCIsXG5hLGMpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIk5vbmVcIil9LHRwJGFzX251bWJlcjohMCxuYiRib29sKCl7cmV0dXJuITF9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4ubm9uZS5ub25lJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4ubm9uZS5wcm90b3R5cGUse3Y6e3ZhbHVlOm51bGwsZW51bWVyYWJsZTohMH19KTtTay5idWlsdGluLk5vdEltcGxlbWVudGVkPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOb3RJbXBsZW1lbnRlZFR5cGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9LHNsb3RzOnskcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJOb3RJbXBsZW1lbnRlZFwiKX0sdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3MoXCJOb3RJbXBsZW1lbnRlZFR5cGVcIixcbmEsYyk7cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQucHJvdG90eXBlLHt2Ont2YWx1ZTpudWxsLGVudW1lcmFibGU6ITB9fSl9LGZ1bmN0aW9uKG0scSl7Y29uc3QgYT0vXig/OiguKT8oWzw+PVxcXl0pKT8oW1xcK1xcLVxcc10pPygjKT8oMCk/KFxcZCspPygsKT8oPzpcXC4oXFxkKykpPyhbYmNkZUVmRmdHbm9zeFglXSk/JC87U2suZm9ybWF0dGluZz17fTtsZXQgYz1mdW5jdGlvbihhLGIsYyxlKXtTay5hc3NlcnRzLmFzc2VydChcInN0cmluZ1wiPT09dHlwZW9mIGIpO2lmKGFbNl0pe3ZhciBkPXBhcnNlSW50KGFbNl0sMTApO2U9YVsyXXx8KGFbNV0/XCI9XCI6ZT9cIj5cIjpcIjxcIik7bGV0IGY9ZC0oYi5sZW5ndGgrKGM/Yy5sZW5ndGg6MCkpO1xuaWYoMD49ZilyZXR1cm4gYjtkPShhWzFdfHwoYVs1XT9cIjBcIjpcIiBcIikpLnJlcGVhdChmKTtzd2l0Y2goZSl7Y2FzZSBcIj1cIjppZihcInNcIj09PWFbOV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIic9JyBhbGlnbm1lbnQgbm90IGFsbG93ZWQgaW4gc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJcIik7cmV0dXJuIGMrZCtiO2Nhc2UgXCI+XCI6cmV0dXJuIGQrYytiO2Nhc2UgXCI8XCI6cmV0dXJuIGMrYitkO2Nhc2UgXCJeXCI6cmV0dXJuIGE9TWF0aC5mbG9vcihmLzIpLGQuc3Vic3RyaW5nKDAsYSkrYytiK2Quc3Vic3RyaW5nKGEpfX1yZXR1cm4gYytifSxiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/XCItXCI6XCIrXCI9PT1hWzNdP1wiK1wiOlwiIFwiPT09YVszXT9cIiBcIjpcIlwifSxlPWZ1bmN0aW9uKGEsZSxkKXtTay5hc3NlcnRzLmFzc2VydChlIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxlIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmcpO2lmKGFbOF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlByZWNpc2lvbiBub3QgYWxsb3dlZCBpbiBpbnRlZ2VyIGZvcm1hdFwiKTtcbmxldCBmPWUuc3RyJChkLCExKTtlPWUubmIkaXNuZWdhdGl2ZSgpO2U9YihhLGUpO2FbNF0mJigxNj09PWQ/ZSs9XCIweFwiOjg9PT1kP2UrPVwiMG9cIjoyPT09ZCYmKGUrPVwiMGJcIikpO1wiWFwiPT09YVs5XSYmKGY9Zi50b1VwcGVyQ2FzZSgpKTtcIm5cIj09PWFbOV0/Zj0oK2YpLnRvTG9jYWxlU3RyaW5nKCk6YVs3XSYmKGQ9Zi50b1N0cmluZygpLnNwbGl0KFwiLlwiKSxkWzBdPWRbMF0ucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZyxcIixcIiksZj1kLmpvaW4oXCIuXCIpKTtyZXR1cm4gYyhhLGYsZSwhMCl9LGY9ZnVuY3Rpb24oZixoLGQpe2lmKCFoKXJldHVybiBmLnN0ciQoMTAsITApO2g9aC5tYXRjaChhKTtpZighaCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSW52YWxpZCBmb3JtYXQgc3BlY2lmaWVyXCIpO3ZhciBnPWhbOV07Z3x8KGc9ZD9cImdcIjpcImRcIik7aWYoLTE9PShkP1wiZkZlRWdHJVwiOlwiYmNkb3hYbmZGZUVnRyVcIikuaW5kZXhPZihnKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiVW5rbm93biBmb3JtYXQgY29kZSAnXCIrXG5oWzldK1wiJyBmb3Igb2JqZWN0IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiJ1wiKTtzd2l0Y2goZyl7Y2FzZSBcImRcIjpjYXNlIFwiblwiOnJldHVybiBlKGgsZiwxMCk7Y2FzZSBcInhcIjpjYXNlIFwiWFwiOnJldHVybiBlKGgsZiwxNik7Y2FzZSBcIm9cIjpyZXR1cm4gZShoLGYsOCk7Y2FzZSBcImJcIjpyZXR1cm4gZShoLGYsMik7Y2FzZSBcImNcIjppZihoWzNdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJTaWduIG5vdCBhbGxvd2VkIHdpdGggaW50ZWdlciBmb3JtYXQgc3BlY2lmaWVyICdjJ1wiKTtpZihoWzRdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBbHRlcm5hdGUgZm9ybSBub3QgYWxsb3dlZCB3aXRoIGludGVnZXIgZm9ybWF0IHNwZWNpZmllciAnYydcIik7aWYoaFs3XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQ2Fubm90IHNwZWNpZnkgJywnIHdpdGggJ2MnXCIpO2lmKGhbOF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5ICcsJyB3aXRoICdjJ1wiKTtcbnJldHVybiBjKGgsU3RyaW5nLmZyb21Db2RlUG9pbnQoU2suYnVpbHRpbi5hc251bSQoZikpLFwiXCIsITApO2Nhc2UgXCJmXCI6Y2FzZSBcIkZcIjpjYXNlIFwiZVwiOmNhc2UgXCJFXCI6Y2FzZSBcImdcIjpjYXNlIFwiR1wiOntpZihoWzRdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBbHRlcm5hdGUgZm9ybSAoIykgbm90IGFsbG93ZWQgaW4gZmxvYXQgZm9ybWF0IHNwZWNpZmllclwiKTtkPVNrLmJ1aWx0aW4uYXNudW0kKGYpO1wic3RyaW5nXCI9PT10eXBlb2YgZCYmKGQ9TnVtYmVyKGQpKTtpZihJbmZpbml0eT09PWQpcmV0dXJuIGMoaCxcImluZlwiLFwiXCIsITApO2lmKC1JbmZpbml0eT09PWQpcmV0dXJuIGMoaCxcImluZlwiLFwiLVwiLCEwKTtpZihpc05hTihkKSlyZXR1cm4gYyhoLFwibmFuXCIsXCJcIiwhMCk7Zj0hMTswPmQmJihkPS1kLGY9ITApO3ZhciBsPVtcInRvRXhwb25lbnRpYWxcIixcInRvRml4ZWRcIixcInRvUHJlY2lzaW9uXCJdW1wiZWZnXCIuaW5kZXhPZihnLnRvTG93ZXJDYXNlKCkpXTtsZXQgYT1oWzhdP1xucGFyc2VJbnQoaFs4XSwxMCk6NjtkPWRbbF0oYSk7LTEhPT1cIkVGR1wiLmluZGV4T2YoZykmJihkPWQudG9VcHBlckNhc2UoKSk7aWYoXCJnXCI9PT1nLnRvTG93ZXJDYXNlKCl8fCFoWzldKXtpZihsPWQubWF0Y2goL1xcLihcXGQqWzEtOV0pPygwKykkLykpe2xldCBbLGEsYl09bDtkPWQuc2xpY2UoMCxhPy1iLmxlbmd0aDotKGIubGVuZ3RoKzEpKX0tMSE9ZC5pbmRleE9mKFwiLlwiKXx8aFs5XXx8KGQrPVwiLjBcIil9XCJlXCI9PT1nLnRvTG93ZXJDYXNlKCkmJihkPWQucmVwbGFjZSgvXihbLStdP1swLTldKlxcLj9bMC05XStbZUVdWy0rXT8pKFswLTldKT8kLyxcIiQxMCQyXCIpKTtoWzddJiYoZz1kLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpLGdbMF09Z1swXS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLFwiLFwiKSxkPWcuam9pbihcIi5cIikpO3JldHVybiBjKGgsZCxiKGgsZiksITApfWNhc2UgXCIlXCI6aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIHdpdGggZm9ybWF0IHNwZWNpZmllciAnJSdcIik7XG5mPVNrLmJ1aWx0aW4uYXNudW0kKGYpO1wic3RyaW5nXCI9PT10eXBlb2YgZiYmKGY9TnVtYmVyKGYpKTtpZihJbmZpbml0eT09PWYpcmV0dXJuIGMoaCxcImluZiVcIixcIlwiLCEwKTtpZigtSW5maW5pdHk9PT1mKXJldHVybiBjKGgsXCJpbmYlXCIsXCItXCIsITApO2lmKGlzTmFOKGYpKXJldHVybiBjKGgsXCJuYW4lXCIsXCJcIiwhMCk7Zz0hMTswPmYmJihmPS1mLGc9ITApO2Q9aFs4XT9wYXJzZUludChoWzhdLDEwKTo2O2Y9KDEwMCpmKS50b0ZpeGVkKGQpK1wiJVwiO3JldHVybiBjKGgsZixiKGgsZyksITApO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gZm9ybWF0IGNvZGUgJ1wiK2hbOV0rXCInXCIpO319O1NrLmZvcm1hdHRpbmcubWtOdW1iZXJfX2Zvcm1hdF9fPWE9PmZ1bmN0aW9uKGIpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZvcm1hdCgpIGFyZ3VtZW50IDIgbXVzdCBiZSBzdHIsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGIpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGYodGhpcyxiLiRqc3N0cigpLGEpKX07U2suZm9ybWF0dGluZy5mb3JtYXQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fFtdO2NvbnN0IGM9e307Zm9yKGxldCBhPTA7YTxiLmxlbmd0aDthKz0yKWNbYlthXV09YlthKzFdO2ZvcihsZXQgYiBpbiBhKWNbYl09YVtiXTtsZXQgZT0wO2E9dGhpcy52LnJlcGxhY2UoL3soKCg/OlxcZCspfCg/OlxcdyspKT8oKD86XFwuKFxcdyspKXwoPzpcXFsoKD86XFxkKyl8KD86XFx3KykpXFxdKT8pKT8oPzohKFtyc10pKT8oPzo6KFtefV0qKSk/fS9nLGZ1bmN0aW9uKGEsYixkLGYsZyxoLGwsQixELG0pe2xldCBrO2lmKHZvaWQgMCE9PWgmJlwiXCIhPT1oKWE9Y1tkXSxrPWEuY29uc3RydWN0b3I9PT1BcnJheT9hW2hdOi9eXFxkKyQvLnRlc3QoaCk/U2suYWJzdHIub2JqZWN0R2V0SXRlbShhLG5ldyBTay5idWlsdGluLmludF8ocGFyc2VJbnQoaCwxMCkpLCExKTpTay5hYnN0ci5vYmplY3RHZXRJdGVtKGEsXG5uZXcgU2suYnVpbHRpbi5zdHIoaCksITEpLGUrKztlbHNlIGlmKHZvaWQgMCE9PWcmJlwiXCIhPT1nKWs9U2suYWJzdHIuZ2F0dHIoY1tkfHxlKytdLG5ldyBTay5idWlsdGluLnN0cihnKSk7ZWxzZSBpZih2b2lkIDAhPT1kJiZcIlwiIT09ZClrPWNbZF07ZWxzZSBpZih2b2lkIDA9PT1ifHxcIlwiPT09YilrPWNbZV0sZSsrO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRffHxiIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmd8fC9eXFxkKyQvLnRlc3QoYikpaz1jW2JdLGUrKztpZihcInNcIj09PWwpaz1uZXcgU2suYnVpbHRpbi5zdHIoayk7ZWxzZSBpZihcInJcIj09PWwpaz1Tay5idWlsdGluLnJlcHIoayk7ZWxzZSBpZihcIlwiIT09bCYmdm9pZCAwIT09bCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiVW5rbm93biBjb252ZXJzaW9uIHNwZWNpZmllciBcIitsKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0Rm9ybWF0KGssXG5uZXcgU2suYnVpbHRpbi5zdHIoQikpLiRqc3N0cigpfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX07U2suZm9ybWF0dGluZy5mb3JtYXRTdHJpbmc9ZnVuY3Rpb24oYil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZm9ybWF0KCkgYXJndW1lbnQgMiBtdXN0IGJlIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpKTtiPWIuJGpzc3RyKCkubWF0Y2goYSk7aWYoYls5XSYmXCJzXCIhPT1iWzldKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJVbmtub3duIGZvcm1hdCBjb2RlICdcIitiWzldK1wiJyBmb3Igb2JqZWN0IG9mIHR5cGUgJ3N0cidcIik7aWYoYlszXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiU2lnbiBub3QgYWxsb3dlZCBpbiBzdHJpbmcgZm9ybWF0IHNwZWNpZmllclwiKTtpZihiWzRdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBbHRlcm5hdGUgZm9ybSAoIykgbm90IGFsbG93ZWQgd2l0aCBzdHJpbmcgZm9ybWF0IHNwZWNpZmllclwiKTtcbmlmKGJbN10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5ICcsJyB3aXRoICdzJ1wiKTtsZXQgZT10aGlzLnY7Yls4XSYmKGU9ZS5zdWJzdHJpbmcoMCxiWzhdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihjKGIsZSxcIlwiLCExKSl9fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSl7bGV0IGI7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyliPWEuY2hhckF0KGQpLGsudGVzdChiKT9jLnB1c2goYik6XCJcXFxcMDAwXCI9PT1iP2MucHVzaChcIlxcXFwwMDBcIik6Yy5wdXNoKFwiXFxcXFwiK2IpO3JldHVybiBjLmpvaW4oXCJcIil9ZnVuY3Rpb24gYyhhLGIsYyl7Yj1Tay5idWlsdGluLmNoZWNrTm9uZShiKT9udWxsOmEuZ2V0JHRndChiKTtpZihudWxsIT09YiYmIWIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJlbXB0eSBzZXBhcmF0b3JcIik7YT1hLnY7dmFyIGQ9MDtpZihudWxsPT09Yil7dmFyIGU9L1tcXHNcXHhhMF0rL2c7XG5kPWEubGVuZ3RoO2E9YS5yZXBsYWNlKHUsXCJcIik7ZC09YS5sZW5ndGh9ZWxzZSBlPWIucmVwbGFjZShwLFwiXFxcXCQxXCIpLGU9bmV3IFJlZ0V4cChlLFwiZ1wiKTtjb25zdCBmPVtdO2xldCBnPTAsaz0wLGg7Zm9yKGM9MD5jP0luZmluaXR5OmM7bnVsbCE9KGg9ZS5leGVjKGEpKSYmazxjJiZoLmluZGV4IT09ZS5sYXN0SW5kZXg7KWYucHVzaChnK2QpLGYucHVzaChoLmluZGV4K2QpLGc9ZS5sYXN0SW5kZXgsays9MTtpZihudWxsIT09Ynx8YS5sZW5ndGgtZylmLnB1c2goZytkKSxmLnB1c2goYS5sZW5ndGgrZCk7cmV0dXJuIGZ9ZnVuY3Rpb24gYihiLGMpe3JldHVybiBmdW5jdGlvbihkKXtpZih2b2lkIDA9PT1kfHxTay5idWlsdGluLmNoZWNrTm9uZShkKSlkPWI7ZWxzZSBpZihkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpZD1hKGQudiksZD1uZXcgUmVnRXhwKGMoZCksXCJnXCIpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3RyaXAgYXJnIG11c3QgYmUgTm9uZSBvciBzdHJcIik7XG5yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5yZXBsYWNlKGQsXCJcIikpfX1mdW5jdGlvbiBlKGEpe3JldHVybiBmdW5jdGlvbihiKXtiPXRoaXMuZ2V0JHRndChiKTtjb25zdCBjPXRoaXMudjtsZXQgZDtpZihhKXtpZihkPWMubGFzdEluZGV4T2YoYiksMD5kKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpLG5ldyBTay5idWlsdGluLnN0cihcIlwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYyldKX1lbHNlIGlmKGQ9Yy5pbmRleE9mKGIpLDA+ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihjKSxuZXcgU2suYnVpbHRpbi5zdHIoXCJcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoYy5zdWJzdHJpbmcoMCxkKSksbmV3IFNrLmJ1aWx0aW4uc3RyKGIpLG5ldyBTay5idWlsdGluLnN0cihjLnN1YnN0cmluZyhkK2IubGVuZ3RoKSldKX19XG5mdW5jdGlvbiBmKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7Yz1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYyxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKHZvaWQgMD09PWQpZD1cIiBcIjtlbHNlIGlmKGQgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0ciYmMT09PWQuc3EkbGVuZ3RoKCkpZD1kLnY7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0aGUgZmlsbCBjaGFyYWN0ZXIgbXVzdCBiZSBhIHN0ciBvZiBsZW5ndGggMVwiKTtjb25zdCBlPXRoaXMuc3EkbGVuZ3RoKCk7bGV0IGY7aWYoZT49YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudik7aWYoYilyZXR1cm4gZj1kLnJlcGVhdChNYXRoLmZsb29yKChjLWUpLzIpKSxmPWYrdGhpcy52K2YsKGMtZSklMiYmKGYrPWQpLG5ldyBTay5idWlsdGluLnN0cihmKTtmPWQucmVwZWF0KGMtZSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhP2YrdGhpcy52OnRoaXMuditmKX19ZnVuY3Rpb24gbChhLFxuYixjKXsoe3N0YXJ0OmIsZW5kOmN9PVNrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0KGEsYixjKSk7aWYoYS4kaGFzQXN0cmFsQ29kZVBvaW50cygpKXtjb25zdCBkPWEuY29kZXBvaW50c1tiXTtiPXZvaWQgMD09PWQ/YithLnYubGVuZ3RoLWEuY29kZXBvaW50cy5sZW5ndGg6ZDtjPWEuY29kZXBvaW50c1tjXTtjPXZvaWQgMD09PWM/YS52Lmxlbmd0aDpjfXJldHVybntzdGFydDpiLGVuZDpjfX1mdW5jdGlvbiBoKGEpe3JldHVybiBmdW5jdGlvbihiLGMsZCl7Yj10aGlzLmdldCR0Z3QoYik7KHtzdGFydDpjLGVuZDpkfT1sKHRoaXMsYyxkKSk7aWYoZDxjKXJldHVybi0xO2QtPWIubGVuZ3RoO2I9YT90aGlzLnYubGFzdEluZGV4T2YoYixkKTp0aGlzLnYuaW5kZXhPZihiLGMpO2I9Yj49YyYmYjw9ZD9iOi0xO2lmKHRoaXMuY29kZXBvaW50cyl7ZD10aGlzLnNxJGxlbmd0aCgpO2M9LTE7Zm9yKGxldCBhPTA7YTxkO2ErKyliPT10aGlzLmNvZGVwb2ludHNbYV0mJihjPWEpfWVsc2UgYz1cbmI7cmV0dXJuIGN9fWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyxkLGUpe2lmKCEoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyfHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIgZmlyc3QgYXJnIG11c3QgYmUgc3RyIG9yIGEgdHVwbGUgb2Ygc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpOyh7c3RhcnQ6ZCxlbmQ6ZX09bCh0aGlzLGQsZSkpO2lmKGQ+ZSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtkPXRoaXMudi5zbGljZShkLGUpO2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKXtmb3IobGV0IGU9U2suYWJzdHIuaXRlcihjKSxmPWUudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1mO2Y9ZS50cCRpdGVybmV4dCgpKXtpZighKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHVwbGUgZm9yIFwiK2ErXCIgbXVzdCBvbmx5IGNvbnRhaW4gc3RyLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShmKSk7aWYoYihkLGYudikpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJH1yZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJH1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChiKGQsYy52KSl9fXZhciBnPS9eWzAtOSEjX10vLG49T2JqZWN0LmNyZWF0ZShudWxsKTtTay5idWlsdGluLnN0cj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3RyXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cixcImJhZCBjYWxsIHRvIHN0ciAtIHVzZSAnbmV3J1wiKTtpZihcInN0cmluZ1wiIT09dHlwZW9mIGEpaWYodm9pZCAwPT09YSlhPVwiXCI7ZWxzZSBpZihudWxsPT09YSlhPVwiTm9uZVwiO2Vsc2V7aWYodm9pZCAwIT09YS50cCRzdHIpcmV0dXJuIGEudHAkc3RyKCk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWE9TnVtYmVyLmlzRmluaXRlKGEpP1N0cmluZyhhKTpTdHJpbmcoYSkucmVwbGFjZShcIkluZmluaXR5XCIsXG5cImluZlwiKS5yZXBsYWNlKFwiTmFOXCIsXCJuYW5cIik7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb3VsZCBub3QgY29udmVydCBvYmplY3Qgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIHRvIHN0clwiKTt9dmFyIGI9blthXTtpZih2b2lkIDAhPT1iKXJldHVybiBiO25bYV09dGhpcztiPXZvaWQgMD09PXRbYV0/YTphK1wiXyRydyRcIjt0aGlzLiRtYW5nbGVkPWI7dGhpcy4kc2F2ZWRLZXlIYXNoPWEucmVwbGFjZShnLFwiISQmXCIpO3RoaXMudj1hfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRkb2M6XCJzdHIob2JqZWN0PScnKSAtPiBzdHJcXG5zdHIoYnl0ZXNfb3JfYnVmZmVyWywgZW5jb2RpbmdbLCBlcnJvcnNdXSkgLT4gc3RyXFxuXFxuQ3JlYXRlIGEgbmV3IHN0cmluZyBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0LiBJZiBlbmNvZGluZyBvclxcbmVycm9ycyBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIG9iamVjdCBtdXN0IGV4cG9zZSBhIGRhdGEgYnVmZmVyXFxudGhhdCB3aWxsIGJlIGRlY29kZWQgdXNpbmcgdGhlIGdpdmVuIGVuY29kaW5nIGFuZCBlcnJvciBoYW5kbGVyLlxcbk90aGVyd2lzZSwgcmV0dXJucyB0aGUgcmVzdWx0IG9mIG9iamVjdC5fX3N0cl9fKCkgKGlmIGRlZmluZWQpXFxub3IgcmVwcihvYmplY3QpLlxcbmVuY29kaW5nIGRlZmF1bHRzIHRvIHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKS5cXG5lcnJvcnMgZGVmYXVsdHMgdG8gJ3N0cmljdCcuXCIsXG50cCRuZXcoYSxiKXtiPWJ8fFtdO2lmKHRoaXMhPT1Tay5idWlsdGluLnN0ci5wcm90b3R5cGUpcmV0dXJuIHRoaXMuJHN1YnR5cGVfbmV3KGEsYik7aWYoMT49YS5sZW5ndGgmJiFiLmxlbmd0aClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGFbMF0pO2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMyl7Y29uc3QgW2MsZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcInN0clwiLFtcIm9iamVjdFwiLFwiZW5jb2RpbmdcIixcImVycm9yc1wiXSxhLGIpO2lmKHZvaWQgMD09PWN8fHZvaWQgMD09PWQmJnZvaWQgMD09PWUpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihjKTtTay5idWlsdGluLmJ5dGVzLmNoZWNrJGVuY29kZUFyZ3MoXCJzdHJcIixkLGUpO2lmKCFTay5idWlsdGluLmNoZWNrQnl0ZXMoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVjb2RpbmcgdG8gc3RyOiBuZWVkIGEgYnl0ZXMtbGlrZSBvYmplY3QsIFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiIGZvdW5kXCIpO1xucmV0dXJuIFNrLmJ1aWx0aW4uYnl0ZXMuJGRlY29kZS5jYWxsKGMsZCxlKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHIgdGFrZXMgYXQgbW9zdCBvbmUgYXJndW1lbnQgKFwiKyhhLmxlbmd0aCtiLmxlbmd0aCkrXCIgZ2l2ZW4pXCIpO30sJHIoKXtsZXQgYT1cIidcIjstMSE9PXRoaXMudi5pbmRleE9mKFwiJ1wiKSYmLTE9PT10aGlzLnYuaW5kZXhPZignXCInKSYmKGE9J1wiJyk7Y29uc3QgYj10aGlzLnYubGVuZ3RoO2xldCBjPWE7Zm9yKGxldCBmPTA7ZjxiO2YrKyl7dmFyIGQ9dGhpcy52LmNoYXJBdChmKTt2YXIgZT10aGlzLnYuY2hhckNvZGVBdChmKTtkPT09YXx8XCJcXFxcXCI9PT1kP2MrPVwiXFxcXFwiK2Q6XCJcXHRcIj09PWQ/Yys9XCJcXFxcdFwiOlwiXFxuXCI9PT1kP2MrPVwiXFxcXG5cIjpcIlxcclwiPT09ZD9jKz1cIlxcXFxyXCI6KDI1NTxlJiY1NTI5Nj5lfHw1NzM0NDw9ZSkmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yys9XCJcXFxcdVwiKyhcIjAwMFwiK2UudG9TdHJpbmcoMTYpKS5zbGljZSgtNCk6NTUyOTY8PWUmJlxuIVNrLl9fZnV0dXJlX18ucHl0aG9uMz8oZD10aGlzLnYuY29kZVBvaW50QXQoZiksZisrLGQ9ZC50b1N0cmluZygxNiksZT1cIjAwMDAwMDBcIitkLnRvU3RyaW5nKDE2KSxjPTQ8ZC5sZW5ndGg/YysoXCJcXFxcVVwiK2Uuc2xpY2UoLTgpKTpjKyhcIlxcXFx1XCIrZS5zbGljZSgtNCkpKToyNTU8ZSYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMz9jKz1cIlxcXFx1ZmZmZFwiOlwiIFwiPmR8fDEyNzw9ZSYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMz8oZD1kLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLDI+ZC5sZW5ndGgmJihkPVwiMFwiK2QpLGMrPVwiXFxcXHhcIitkKTpjKz1kfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYythKX0sdHAkc3RyKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnN0cj90aGlzOm5ldyBTay5idWlsdGluLnN0cih0aGlzLnYpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBBKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7XG5zd2l0Y2goYil7Y2FzZSBcIkx0XCI6cmV0dXJuIHRoaXMudjxhLnY7Y2FzZSBcIkx0RVwiOnJldHVybiB0aGlzLnY8PWEudjtjYXNlIFwiRXFcIjpyZXR1cm4gdGhpcy52PT09YS52O2Nhc2UgXCJOb3RFcVwiOnJldHVybiB0aGlzLnYhPT1hLnY7Y2FzZSBcIkd0XCI6cmV0dXJuIHRoaXMudj5hLnY7Y2FzZSBcIkd0RVwiOnJldHVybiB0aGlzLnY+PWEudn19LG1wJHN1YnNjcmlwdChhKXtsZXQgYjtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Yj10aGlzLnNxJGxlbmd0aCgpOzA+YSYmKGErPWIpO2lmKDA+YXx8YT49Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFwic3RyaW5nIGluZGV4IG91dCBvZiByYW5nZVwiKTtyZXR1cm4gdGhpcy5jb2RlcG9pbnRzP25ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyaW5nKHRoaXMuY29kZXBvaW50c1thXSx0aGlzLmNvZGVwb2ludHNbYSsxXSkpOlxubmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5jaGFyQXQoYSkpfWlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNsaWNlKXtsZXQgYz1cIlwiO2I9dGhpcy5zcSRsZW5ndGgoKTt0aGlzLmNvZGVwb2ludHM/YS5zc3NpdGVyJChiLGE9PntjKz10aGlzLnYuc3Vic3RyaW5nKHRoaXMuY29kZXBvaW50c1thXSx0aGlzLmNvZGVwb2ludHNbYSsxXSl9KTphLnNzc2l0ZXIkKGIsYT0+e2MrPXRoaXMudi5jaGFyQXQoYSl9KTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInN0cmluZyBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy4kaGFzQXN0cmFsQ29kZVBvaW50cygpP3RoaXMuY29kZXBvaW50cy5sZW5ndGg6dGhpcy52Lmxlbmd0aH0sc3EkY29uY2F0KGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW5ub3QgY29uY2F0ZW5hdGUgJ3N0cicgYW5kICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3RzXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52K2Eudil9LHNxJHJlcGVhdChhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoYSp0aGlzLnYubGVuZ3RoPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7bGV0IGI9XCJcIjtmb3IobGV0IGM9MDtjPGE7YysrKWIrPXRoaXMudjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGIpfSxzcSRjb250YWlucyhhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ2luIDxzdHJpbmc+JyByZXF1aXJlcyBzdHJpbmcgYXMgbGVmdCBvcGVyYW5kIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpKTtyZXR1cm4tMSE9PXRoaXMudi5pbmRleE9mKGEudil9LHRwJGFzX251bWJlcjohMCxuYiRyZW1haW5kZXI6ZnVuY3Rpb24oYSl7dmFyIGI7Y29uc3QgYz10aGlzLnNrJGJ1aWx0aW5CYXNlO2EuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnR1cGxlfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tYXBwaW5ncHJveHl8fChhPW5ldyBTay5idWlsdGluLnR1cGxlKFthXSkpO3ZhciBkPTA7dmFyIGU9dGhpcy4kanNzdHIoKS5yZXBsYWNlKC8lKFxcKFthLXpBLVowLTldK1xcKSk/KFsjMCArXFwtXSspPyhcXCp8WzAtOV0rKT8oXFwuKFxcKnxbMC05XSspKT9baGxMXT8oW2Rpb3V4WGVFZkZnR2Nyc2IlXSkvZyxmdW5jdGlvbihlLGYsZyxrLGgsbCxwKXt2YXIgbixCLEEsdixMO2s9U2suYnVpbHRpbi5hc251bSQoayk7aD1Tay5idWlsdGluLmFzbnVtJChoKTt2b2lkIDAhPT1mJiZcIlwiIT09Znx8XCIlXCI9PXB8fChuPVxuZCsrKTtcIlwiPT09aCYmKGg9dm9pZCAwKTt2YXIgdD1CPUE9dj1MPSExO2cmJigtMSE9PWcuaW5kZXhPZihcIi1cIik/dj0hMDotMSE9PWcuaW5kZXhPZihcIjBcIikmJihMPSEwKSwtMSE9PWcuaW5kZXhPZihcIitcIik/Qj0hMDotMSE9PWcuaW5kZXhPZihcIiBcIikmJihBPSEwKSx0PS0xIT09Zy5pbmRleE9mKFwiI1wiKSk7aCYmKGg9cGFyc2VJbnQoaC5zdWJzdHIoMSksMTApKTtnPWZ1bmN0aW9uKGEsYil7dmFyIGM7Yj1Tay5idWlsdGluLmFzbnVtJChiKTt2YXIgZD0hMTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpezA+YSYmKGE9LWEsZD0hMCk7dmFyIGU9YS50b1N0cmluZyhiKX1lbHNlIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0Xz8oZT1hLnN0ciQoYiwhMSksMjxlLmxlbmd0aCYmXCIuMFwiPT09ZS5zdWJzdHIoLTIpJiYoZT1lLnN1YnN0cigwLGUubGVuZ3RoLTIpKSxkPWEubmIkaXNuZWdhdGl2ZSgpKTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfPyhlPWEuc3RyJChiLCExKSxkPVxuYS5uYiRpc25lZ2F0aXZlKCkpOmEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZyYmKGU9YS5zdHIkKGIsITEpLGQ9YS5uYiRpc25lZ2F0aXZlKCkpO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWUsXCJ1bmhhbmRsZWQgbnVtYmVyIGZvcm1hdFwiKTthPSExO2lmKGgpZm9yKGM9ZS5sZW5ndGg7YzxoOysrYyllPVwiMFwiK2UsYT0hMDtjPVwiXCI7ZD9jPVwiLVwiOkI/Yz1cIitcIitjOkEmJihjPVwiIFwiK2MpO3QmJigxNj09PWI/Yys9XCIweFwiOjghPT1ifHxhfHxcIjBcIj09PWV8fChjKz1cIjBcIikpO3JldHVybltjLGVdfTtlPWZ1bmN0aW9uKGEpe3ZhciBiPWFbMF07YT1hWzFdO2lmKGspe2s9cGFyc2VJbnQoaywxMCk7dmFyIGM9YS5sZW5ndGgrYi5sZW5ndGg7aWYoTClmb3IoO2M8azsrK2MpYT1cIjBcIithO2Vsc2UgaWYodil7Zm9yKDtjPGs7KytjKWErPVwiIFwiO1NrLl9fZnV0dXJlX18ucHl0aG9uMyYmKGErPWIsYj1cIlwiKX1lbHNlIGZvcig7YzxrOysrYyliPVwiIFwiK2J9cmV0dXJuIGIrYX07aWYoYS5jb25zdHJ1Y3Rvcj09PVxuU2suYnVpbHRpbi50dXBsZSlmPWEudltuXTtlbHNlIGlmKHZvaWQgMCE9PWEubXAkc3Vic2NyaXB0JiZ2b2lkIDAhPT1mKWY9Zi5zdWJzdHJpbmcoMSxmLmxlbmd0aC0xKSxmPWEubXAkc3Vic2NyaXB0KG5ldyBjKGYpKTtlbHNlIGlmKGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmRpY3R8fGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmxpc3QpZj1hO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoYS50cCRuYW1lK1wiIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJ21wJHN1YnNjcmlwdCdcIik7aWYoXCJkXCI9PT1wfHxcImlcIj09PXApe3ZhciB1PWcoZiwxMCk7aWYodm9pZCAwPT09dVsxXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCIlXCIrcCtcIiBmb3JtYXQ6IGEgbnVtYmVyIGlzIHJlcXVpcmVkLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoZikpO3A9dVsxXTt1WzFdPS0xIT09cC5pbmRleE9mKFwiLlwiKT9wYXJzZUludChwLDEwKS50b1N0cmluZygpOlxucDtyZXR1cm4gZSh1KX1pZihcIm9cIj09PXApcmV0dXJuIGUoZyhmLDgpKTtpZihcInhcIj09PXApcmV0dXJuIGUoZyhmLDE2KSk7aWYoXCJYXCI9PT1wKXJldHVybiBlKGcoZiwxNikpLnRvVXBwZXJDYXNlKCk7aWYoXCJmXCI9PT1wfHxcIkZcIj09PXB8fFwiZVwiPT09cHx8XCJFXCI9PT1wfHxcImdcIj09PXB8fFwiR1wiPT09cCl7dT1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIHUmJih1PU51bWJlcih1KSk7aWYoSW5maW5pdHk9PT11KXJldHVyblwiaW5mXCI7aWYoLUluZmluaXR5PT09dSlyZXR1cm5cIi1pbmZcIjtpZihpc05hTih1KSlyZXR1cm5cIm5hblwiO249W1widG9FeHBvbmVudGlhbFwiLFwidG9GaXhlZFwiLFwidG9QcmVjaXNpb25cIl1bXCJlZmdcIi5pbmRleE9mKHAudG9Mb3dlckNhc2UoKSldO2lmKHZvaWQgMD09PWh8fFwiXCI9PT1oKWlmKFwiZVwiPT09cHx8XCJFXCI9PT1wKWg9NjtlbHNlIGlmKFwiZlwiPT09cHx8XCJGXCI9PT1wKWg9U2suX19mdXR1cmVfXy5weXRob24zPzY6NztuPXVbbl0oaCk7U2suYnVpbHRpbi5jaGVja0Zsb2F0KGYpJiZcbjA9PT11JiYtSW5maW5pdHk9PT0xL3UmJihuPVwiLVwiK24pO1NrLl9fZnV0dXJlX18ucHl0aG9uMyYmKDc8PW4ubGVuZ3RoJiZcIjAuMDAwMFwiPT1uLnNsaWNlKDAsNikmJihiPXBhcnNlRmxvYXQobiksbj1iLnRvRXhwb25lbnRpYWwoKSksXCItXCI9PW4uY2hhckF0KG4ubGVuZ3RoLTIpJiYobj1uLnNsaWNlKDAsbi5sZW5ndGgtMSkrXCIwXCIrbi5jaGFyQXQobi5sZW5ndGgtMSkpKTstMSE9PVwiRUZHXCIuaW5kZXhPZihwKSYmKG49bi50b1VwcGVyQ2FzZSgpKTtyZXR1cm4gZShbXCJcIixuXSl9aWYoXCJjXCI9PT1wKXtpZihcIm51bWJlclwiPT09dHlwZW9mIGYpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZik7aWYoZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8ZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGYudik7aWYoZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGYuc3RyJCgxMCxcbiExKVswXSk7aWYoZi5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uc3RyKXJldHVybiBmLnYuc3Vic3RyKDAsMSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTt9aWYoXCJyXCI9PT1wKXJldHVybiBwPVNrLmJ1aWx0aW4ucmVwcihmKSxoP3Audi5zdWJzdHIoMCxoKTpwLnY7aWYoXCJzXCI9PT1wJiZjPT09U2suYnVpbHRpbi5zdHIpe3A9bmV3IFNrLmJ1aWx0aW4uc3RyKGYpO3A9cC4kanNzdHIoKTtpZihoKXJldHVybiBwLnN1YnN0cigwLGgpO2smJihwPWUoW1wiIFwiLHBdKSk7cmV0dXJuIHB9aWYoXCJiXCI9PT1wfHxcInNcIj09PXApe2lmKGM9PT1Tay5idWlsdGluLnN0cil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwidW5zdXBwb3J0ZWQgZm9ybWF0IGNoYXJhY3RlciAnYidcIik7aWYoIShmIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcykmJnZvaWQgMD09PSh1PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoZixTay5idWlsdGluLnN0ci4kYnl0ZXMpKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCIlYiByZXF1aXJlcyBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCBvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIF9fYnl0ZXNfXywgbm90ICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGYpK1wiJ1wiKTt2b2lkIDAhPT11JiYoZj1uZXcgU2suYnVpbHRpbi5ieXRlcyhmKSk7cD1mLiRqc3N0cigpO2lmKGgpcmV0dXJuIHAuc3Vic3RyKDAsaCk7ayYmKHA9ZShbXCIgXCIscF0pKTtyZXR1cm4gcH1pZihcIiVcIj09PXApcmV0dXJuXCIlXCJ9KTtyZXR1cm4gbmV3IGMoZSl9fSxwcm90bzp7dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy52fSwkc3VidHlwZV9uZXcoYSxiKXtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2E9U2suYnVpbHRpbi5zdHIucHJvdG90eXBlLnRwJG5ldyhhLGIpO2MuJG1hbmdsZWQ9YS4kbWFuZ2xlZDtjLiRzYXZlZEtleUhhc2g9YS4kc2F2ZWRLZXlIYXNoO2Mudj1hLnY7cmV0dXJuIGN9LCRqc3N0cigpe3JldHVybiB0aGlzLnZ9LCRoYXNBc3RyYWxDb2RlUG9pbnRzKCl7aWYobnVsbD09PXRoaXMuY29kZXBvaW50cylyZXR1cm4hMTtpZih2b2lkIDAhPT10aGlzLmNvZGVwb2ludHMpcmV0dXJuITA7Zm9yKHZhciBhPTA7YTx0aGlzLnYubGVuZ3RoO2ErKyl7bGV0IGI9XG50aGlzLnYuY2hhckNvZGVBdChhKTtpZig1NTI5Njw9YiYmNTczNDQ+Yil7dGhpcy5jb2RlcG9pbnRzPVtdO2ZvcihhPTA7YTx0aGlzLnYubGVuZ3RoO2ErKyl0aGlzLmNvZGVwb2ludHMucHVzaChhKSxiPXRoaXMudi5jaGFyQ29kZUF0KGEpLDU1Mjk2PD1iJiY1NjMyMD5iJiZhKys7cmV0dXJuITB9fXRoaXMuY29kZXBvaW50cz1udWxsO3JldHVybiExfSxzayRhc2FycmF5KCl7Y29uc3QgYT1bXTtpZih0aGlzLiRoYXNBc3RyYWxDb2RlUG9pbnRzKCkpe3ZhciBiPXRoaXMuY29kZXBvaW50cztmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zdWJzdHJpbmcoYltjXSxiW2MrMV0pKSl9ZWxzZSBmb3IoYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnZbYl0pKTtyZXR1cm4gYX0sZmluZCRsZWZ0OmgoITEpLGZpbmQkcmlnaHQ6aCghMCksZ2V0JHRndChhKXtpZihhIGluc3RhbmNlb2ZcblNrLmJ1aWx0aW4uc3RyKXJldHVybiBhLnY7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYSBzdHIgaW5zdGFuY2UgaXMgcmVxdWlyZWQgbm90ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fX0sbWV0aG9kczp7ZW5jb2RlOnskbWV0aDpmdW5jdGlvbihhLGIpeyh7ZW5jb2Rpbmc6YSxlcnJvcnM6Yn09U2suYnVpbHRpbi5ieXRlcy5jaGVjayRlbmNvZGVBcmdzKFwiZW5jb2RlXCIsYSxiKSk7YT1Tay5idWlsdGluLmJ5dGVzLnN0ciRlbmNvZGUodGhpcyxhLGIpO3JldHVybiBTay5fX2Z1dHVyZV9fLnB5dGhvbjM/YTpuZXcgU2suYnVpbHRpbi5zdHIoYS4kanNzdHIoKSl9LCRmbGFnczp7TmFtZWRBcmdzOltcImVuY29kaW5nXCIsXCJlcnJvcnNcIl19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBlbmNvZGluZz0ndXRmLTgnLCBlcnJvcnM9J3N0cmljdCcpXCIsJGRvYzpcIkVuY29kZSB0aGUgc3RyaW5nIHVzaW5nIHRoZSBjb2RlYyByZWdpc3RlcmVkIGZvciBlbmNvZGluZy5cXG5cXG4gIGVuY29kaW5nXFxuICAgIFRoZSBlbmNvZGluZyBpbiB3aGljaCB0byBlbmNvZGUgdGhlIHN0cmluZy5cXG4gIGVycm9yc1xcbiAgICBUaGUgZXJyb3IgaGFuZGxpbmcgc2NoZW1lIHRvIHVzZSBmb3IgZW5jb2RpbmcgZXJyb3JzLlxcbiAgICBUaGUgZGVmYXVsdCBpcyAnc3RyaWN0JyBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGFcXG4gICAgVW5pY29kZUVuY29kZUVycm9yLiAgT3RoZXIgcG9zc2libGUgdmFsdWVzIGFyZSAnaWdub3JlJywgJ3JlcGxhY2UnIGFuZFxcbiAgICAneG1sY2hhcnJlZnJlcGxhY2UnIGFzIHdlbGwgYXMgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJlZCB3aXRoXFxuICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvciB0aGF0IGNhbiBoYW5kbGUgVW5pY29kZUVuY29kZUVycm9ycy5cIn0sXG5yZXBsYWNlOnskbWV0aChiLGMsZCl7Yj10aGlzLmdldCR0Z3QoYik7Yz10aGlzLmdldCR0Z3QoYyk7ZD12b2lkIDA9PT1kPy0xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChkLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Yj1uZXcgUmVnRXhwKGEoYiksXCJnXCIpO2lmKDA+ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5yZXBsYWNlKGIsYykpO2xldCBlPTA7Yj10aGlzLnYucmVwbGFjZShiLGE9PmUrKzxkP2M6YSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkc2VsZiwgb2xkLCBuZXcsIGNvdW50PS0xLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IHdpdGggYWxsIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyBvbGQgcmVwbGFjZWQgYnkgbmV3LlxcblxcbiAgY291bnRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgdG8gcmVwbGFjZS5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcy5cXG5cXG5JZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgY291bnQgaXMgZ2l2ZW4sIG9ubHkgdGhlIGZpcnN0IGNvdW50IG9jY3VycmVuY2VzIGFyZVxcbnJlcGxhY2VkLlwifSxcbnNwbGl0OnskbWV0aDpmdW5jdGlvbihhLGIpe2I9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGIsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTthPWModGhpcyxhLGIpO2I9W107Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyaW5nKGFbY10sYVsrK2NdKSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyBzZXAgYXMgdGhlIGRlbGltaXRlciBzdHJpbmcuXFxuXFxuICBzZXBcXG4gICAgVGhlIGRlbGltaXRlciBhY2NvcmRpbmcgd2hpY2ggdG8gc3BsaXQgdGhlIHN0cmluZy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IGFjY29yZGluZyB0byBhbnkgd2hpdGVzcGFjZSxcXG4gICAgYW5kIGRpc2NhcmQgZW1wdHkgc3RyaW5ncyBmcm9tIHRoZSByZXN1bHQuXFxuICBtYXhzcGxpdFxcbiAgICBNYXhpbXVtIG51bWJlciBvZiBzcGxpdHMgdG8gZG8uXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgbm8gbGltaXQuXCJ9LFxucnNwbGl0OnskbWV0aDpmdW5jdGlvbihhLGIpe2I9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGIsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTthPWModGhpcyxhLC0xKTt2YXIgZD0wPmI/MDoyKihhLmxlbmd0aC8yLWIpO2I9W107Zm9yKDA+PWQ/ZD0wOmIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnNsaWNlKDAsYVtkLTFdKSkpO2Q8YS5sZW5ndGg7ZCsrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cmluZyhhW2RdLGFbKytkXSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wic2VwXCIsXCJtYXhzcGxpdFwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLC0xXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcIiwkZG9jOlwiUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgc2VwIGFzIHRoZSBkZWxpbWl0ZXIgc3RyaW5nLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBzdHJpbmcuXFxuICAgIE5vbmUgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBzcGxpdCBhY2NvcmRpbmcgdG8gYW55IHdoaXRlc3BhY2UsXFxuICAgIGFuZCBkaXNjYXJkIGVtcHR5IHN0cmluZ3MgZnJvbSB0aGUgcmVzdWx0LlxcbiAgbWF4c3BsaXRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygc3BsaXRzIHRvIGRvLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIG5vIGxpbWl0LlxcblxcblNwbGl0cyBhcmUgZG9uZSBzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgYW5kIHdvcmtpbmcgdG8gdGhlIGZyb250LlwifSxcbmpvaW46eyRtZXRoKGEpe2NvbnN0IGI9W107cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcXVlbmNlIGl0ZW0gXCIrYi5sZW5ndGgrXCI6IGV4cGVjdGVkIHN0ciwgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgZm91bmRcIik7Yi5wdXNoKGEudil9KSwoKT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGIuam9pbih0aGlzLnYpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgaXRlcmFibGUsIC8pXCIsJGRvYzpcIkNvbmNhdGVuYXRlIGFueSBudW1iZXIgb2Ygc3RyaW5ncy5cXG5cXG5UaGUgc3RyaW5nIHdob3NlIG1ldGhvZCBpcyBjYWxsZWQgaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbiBlYWNoIGdpdmVuIHN0cmluZy5cXG5UaGUgcmVzdWx0IGlzIHJldHVybmVkIGFzIGEgbmV3IHN0cmluZy5cXG5cXG5FeGFtcGxlOiAnLicuam9pbihbJ2FiJywgJ3BxJywgJ3JzJ10pIC0+ICdhYi5wcS5ycydcIn0sXG5jYXBpdGFsaXplOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3RoaXMudi5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjYXBpdGFsaXplZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuXFxuXFxuTW9yZSBzcGVjaWZpY2FsbHksIG1ha2UgdGhlIGZpcnN0IGNoYXJhY3RlciBoYXZlIHVwcGVyIGNhc2UgYW5kIHRoZSByZXN0IGxvd2VyXFxuY2FzZS5cIn0sdGl0bGU6eyRtZXRoOmZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLnYucmVwbGFjZSgvW2Etel1bYS16XSovZ2ksYT0+YVswXS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoZXJlIGVhY2ggd29yZCBpcyB0aXRsZWNhc2VkLlxcblxcbk1vcmUgc3BlY2lmaWNhbGx5LCB3b3JkcyBzdGFydCB3aXRoIHVwcGVyY2FzZWQgY2hhcmFjdGVycyBhbmQgYWxsIHJlbWFpbmluZ1xcbmNhc2VkIGNoYXJhY3RlcnMgaGF2ZSBsb3dlciBjYXNlLlwifSxcbmNlbnRlcjp7JG1ldGg6ZighMSwhMCksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIGZpbGxjaGFyPScgJywgLylcIiwkZG9jOlwiUmV0dXJuIGEgY2VudGVyZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sY291bnQ6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZ2V0JHRndChhKTsoe3N0YXJ0OmIsZW5kOmN9PWwodGhpcyxiLGMpKTtpZihjPGIpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oMCk7YT1hLnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLFwiXFxcXCQmXCIpO2E9bmV3IFJlZ0V4cChhLFwiZ1wiKTtyZXR1cm4oYj10aGlzLnYuc2xpY2UoYixjKS5tYXRjaChhKSk/bmV3IFNrLmJ1aWx0aW4uaW50XyhiLmxlbmd0aCk6bmV3IFNrLmJ1aWx0aW4uaW50XygwKX0sJGZsYWdzOntNaW5BcmdzOjEsXG5NYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlMuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyBzdWIgaW5cXG5zdHJpbmcgU1tzdGFydDplbmRdLiAgT3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlXFxuaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXCJ9LGV4cGFuZHRhYnM6eyRtZXRoOmZ1bmN0aW9uKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpYT1Tay5idWlsdGluLmFzbnVtJChhKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWQsIGdvdCB0eXBlXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2NvbnN0IGI9QXJyYXkoYSsxKS5qb2luKFwiIFwiKSxjPXRoaXMudi5yZXBsYWNlKC8oW15cXHJcXG5cXHRdKilcXHQvZywoYyxkKT0+ZCtiLnNsaWNlKGQubGVuZ3RoJWEpKTtcbnJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyl9LCRmbGFnczp7TmFtZWRBcmdzOltcInRhYnNpemVcIl0sRGVmYXVsdHM6WzhdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgdGFic2l6ZT04KVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgZXhwYW5kZWQgdXNpbmcgc3BhY2VzLlxcblxcbklmIHRhYnNpemUgaXMgbm90IGdpdmVuLCBhIHRhYiBzaXplIG9mIDggY2hhcmFjdGVycyBpcyBhc3N1bWVkLlwifSxmaW5kOnskbWV0aDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJGxlZnQoYSxiLGMpKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0sXG5wYXJ0aXRpb246eyRtZXRoOmUoITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIHN0cmluZyBpbnRvIHRocmVlIHBhcnRzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IuXFxuXFxuVGhpcyB3aWxsIHNlYXJjaCBmb3IgdGhlIHNlcGFyYXRvciBpbiB0aGUgc3RyaW5nLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBmb3VuZCxcXG5yZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yXFxuaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuXFxuXFxuSWYgdGhlIHNlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHN0cmluZ1xcbmFuZCB0d28gZW1wdHkgc3RyaW5ncy5cIn0saW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRsZWZ0KGEsYixjKTtpZigtMT09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInN1YnN0cmluZyBub3QgZm91bmRcIik7XG5yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIFMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCwgXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QgZm91bmQuXCJ9LGxqdXN0OnskbWV0aDpmKCExLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCB3aWR0aCwgZmlsbGNoYXI9JyAnLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBsZWZ0LWp1c3RpZmllZCBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLlxcblxcblBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLlwifSxcbmxvd2VyOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvTG93ZXJDYXNlKCkpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlwifSxsc3RyaXA6eyRtZXRoOmIoL15cXHMrL2csYT0+XCJeW1wiK2ErXCJdK1wiKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBjaGFycz1Ob25lLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZC5cXG5cXG5JZiBjaGFycyBpcyBnaXZlbiBhbmQgbm90IE5vbmUsIHJlbW92ZSBjaGFyYWN0ZXJzIGluIGNoYXJzIGluc3RlYWQuXCJ9LHJmaW5kOnskbWV0aChhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJHJpZ2h0KGEsYixjKSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sXG4kdGV4dHNpZzpudWxsLCRkb2M6XCJTLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBTIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJldHVybiAtMSBvbiBmYWlsdXJlLlwifSxyaW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRyaWdodChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzdHJpbmcgbm90IGZvdW5kXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlMucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBTIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QgZm91bmQuXCJ9LFxucmp1c3Q6eyRtZXRoOmYoITAsITEpLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJHNlbGYsIHdpZHRoLCBmaWxsY2hhcj0nICcsIC8pXCIsJGRvYzpcIlJldHVybiBhIHJpZ2h0LWp1c3RpZmllZCBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLlxcblxcblBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLlwifSxyc3RyaXA6eyRtZXRoOmIoL1xccyskL2csYT0+XCJbXCIrYStcIl0rJFwiKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBjaGFycz1Ob25lLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuXFxuXFxuSWYgY2hhcnMgaXMgZ2l2ZW4gYW5kIG5vdCBOb25lLCByZW1vdmUgY2hhcmFjdGVycyBpbiBjaGFycyBpbnN0ZWFkLlwifSxycGFydGl0aW9uOnskbWV0aDplKCEwKSwkZmxhZ3M6e09uZUFyZzohMH0sXG4kdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIHN0cmluZyBpbnRvIHRocmVlIHBhcnRzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IuXFxuXFxuVGhpcyB3aWxsIHNlYXJjaCBmb3IgdGhlIHNlcGFyYXRvciBpbiB0aGUgc3RyaW5nLCBzdGFydGluZyBhdCB0aGUgZW5kLiBJZlxcbnRoZSBzZXBhcmF0b3IgaXMgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZVxcbnNlcGFyYXRvciwgdGhlIHNlcGFyYXRvciBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciBpdC5cXG5cXG5JZiB0aGUgc2VwYXJhdG9yIGlzIG5vdCBmb3VuZCwgcmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5nc1xcbmFuZCB0aGUgb3JpZ2luYWwgc3RyaW5nLlwifSxzcGxpdGxpbmVzOnskbWV0aDpmdW5jdGlvbihhKXthPVNrLm1pc2NldmFsLmlzVHJ1ZShhKTtjb25zdCBiPXRoaXMudixjPVtdLGQ9Yi5sZW5ndGg7dmFyIGU9XG4wO2ZvcihsZXQgZz0wO2c8ZDtnKyspe3ZhciBmPWIuY2hhckF0KGcpO2lmKFwiXFxuXCI9PT1iLmNoYXJBdChnKzEpJiZcIlxcclwiPT09ZilmPWcrMixlPWIuc2xpY2UoZSxmKSxhfHwoZT1lLnJlcGxhY2UoLyhcXHJ8XFxuKS9nLFwiXCIpKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGUpKSxlPWY7ZWxzZSBpZihcIlxcblwiPT09ZiYmXCJcXHJcIiE9PWIuY2hhckF0KGctMSl8fFwiXFxyXCI9PT1mKWY9ZysxLGU9Yi5zbGljZShlLGYpLGF8fChlPWUucmVwbGFjZSgvKFxccnxcXG4pL2csXCJcIikpLGMucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZSkpLGU9Zn1lPGQmJihlPWIuc2xpY2UoZSxkKSxhfHwoZT1lLnJlcGxhY2UoLyhcXHJ8XFxuKS9nLFwiXCIpKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGUpKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYyl9LCRmbGFnczp7TmFtZWRBcmdzOltcImtlZXBlbmRzXCJdLERlZmF1bHRzOlshMV19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBrZWVwZW5kcz1GYWxzZSlcIiwkZG9jOlwiUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgbGluZSBib3VuZGFyaWVzLlxcblxcbkxpbmUgYnJlYWtzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0IHVubGVzcyBrZWVwZW5kcyBpcyBnaXZlbiBhbmRcXG50cnVlLlwifSxcbnN0cmlwOnskbWV0aDpiKC9eXFxzK3xcXHMrJC9nLGE9PlwiXltcIithK1wiXSt8W1wiK2ErXCJdKyRcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSByZW1vdmUuXFxuXFxuSWYgY2hhcnMgaXMgZ2l2ZW4gYW5kIG5vdCBOb25lLCByZW1vdmUgY2hhcmFjdGVycyBpbiBjaGFycyBpbnN0ZWFkLlwifSxzd2FwY2FzZTp7JG1ldGgoKXtjb25zdCBhPXRoaXMudi5yZXBsYWNlKC9bYS16XS9naSxhPT57Y29uc3QgYj1hLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGI9PT1hP2EudG9VcHBlckNhc2UoKTpifSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJDb252ZXJ0IHVwcGVyY2FzZSBjaGFyYWN0ZXJzIHRvIGxvd2VyY2FzZSBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgdG8gdXBwZXJjYXNlLlwifSxcbnVwcGVyOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvVXBwZXJDYXNlKCkpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLlwifSxzdGFydHN3aXRoOnskbWV0aDpkKFwic3RhcnRzd2l0aFwiLChhLGIpPT4wPT09YS5pbmRleE9mKGIpKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlMuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgUyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxcbldpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgUyBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cXG5XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgUyBhdCB0aGF0IHBvc2l0aW9uLlxcbnByZWZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHN0cmluZ3MgdG8gdHJ5LlwifSxcbmVuZHN3aXRoOnskbWV0aDpkKFwiZW5kc3dpdGhcIiwoYSxiKT0+LTEhPT1hLmluZGV4T2YoYixhLmxlbmd0aC1iLmxlbmd0aCkpLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgUyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBzdWZmaXgsIEZhbHNlIG90aGVyd2lzZS5cXG5XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IFMgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXFxuV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi5cXG5zdWZmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdHJpbmdzIHRvIHRyeS5cIn0saXNhc2NpaTp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCgvXltcXHgwMC1cXHg3Rl0qJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIEFTQ0lJLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQVNDSUkgY2hhcmFjdGVycyBoYXZlIGNvZGUgcG9pbnRzIGluIHRoZSByYW5nZSBVKzAwMDAtVSswMDdGLlxcbkVtcHR5IHN0cmluZyBpcyBBU0NJSSB0b28uXCJ9LGlzbG93ZXI6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wodGhpcy52Lmxlbmd0aCYmL1thLXpdLy50ZXN0KHRoaXMudikmJiEvW0EtWl0vLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIGxvd2VyY2FzZSBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBsb3dlcmNhc2UgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgbG93ZXJjYXNlIGFuZFxcbnRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXG5pc3VwcGVyOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJiEvW2Etel0vLnRlc3QodGhpcy52KSYmL1tBLVpdLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYW4gdXBwZXJjYXNlIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkEgc3RyaW5nIGlzIHVwcGVyY2FzZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1cHBlcmNhc2UgYW5kXFxudGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSxpc3RpdGxlOnskbWV0aDpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy52O2xldCBiPSExLGM9ITEsZDtmb3IobGV0IGU9MDtlPGEubGVuZ3RoO2UrKylpZihkPWEuY2hhckF0KGUpLCEvW2Etel0vLnRlc3QoZCkmJi9bQS1aXS8udGVzdChkKSl7aWYoYylyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtcbmI9Yz0hMH1lbHNlIGlmKC9bYS16XS8udGVzdChkKSYmIS9bQS1aXS8udGVzdChkKSl7aWYoIWMpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Yj0hMH1lbHNlIGM9ITE7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYil9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHRpdGxlLWNhc2VkIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkluIGEgdGl0bGUtY2FzZWQgc3RyaW5nLCB1cHBlci0gYW5kIHRpdGxlLWNhc2UgY2hhcmFjdGVycyBtYXkgb25seVxcbmZvbGxvdyB1bmNhc2VkIGNoYXJhY3RlcnMgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIG9ubHkgY2FzZWQgb25lcy5cIn0saXNzcGFjZTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCgvXlxccyskLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsXG4kZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHdoaXRlc3BhY2Ugc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgd2hpdGVzcGFjZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB3aGl0ZXNwYWNlIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0saXNkaWdpdDp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCgvXlxcZCskLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBkaWdpdCBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBhIGRpZ2l0IHN0cmluZyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgYW5kIHRoZXJlXFxuaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSxcbmlzbnVtZXJpYzp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1teMC05XS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgbnVtZXJpYyBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBudW1lcmljIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIG51bWVyaWMgYW5kIHRoZXJlIGlzIGF0XFxubGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSxpc2FscGhhOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJiEvW15hLXpBLVpdLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYW4gYWxwaGFiZXRpYyBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBhbHBoYWJldGljIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhYmV0aWMgYW5kIHRoZXJlXFxuaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSxcbmlzYWxudW06eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wodGhpcy52Lmxlbmd0aCYmIS9bXmEtekEtWjAtOV0vLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhbiBhbHBoYS1udW1lcmljIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkEgc3RyaW5nIGlzIGFscGhhLW51bWVyaWMgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGEtbnVtZXJpYyBhbmRcXG50aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LHpmaWxsOnskbWV0aDpmdW5jdGlvbihhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7bGV0IGI9XCJcIjthLT10aGlzLnYubGVuZ3RoO2NvbnN0IGM9XCIrXCI9PT10aGlzLnZbMF18fFwiLVwiPT09dGhpcy52WzBdPzE6MDtcbmZvcihsZXQgYz0wO2M8YTtjKyspYis9XCIwXCI7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyKDAsYykrYit0aGlzLnYuc3Vic3RyKGMpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCB3aWR0aCwgLylcIiwkZG9jOlwiUGFkIGEgbnVtZXJpYyBzdHJpbmcgd2l0aCB6ZXJvcyBvbiB0aGUgbGVmdCwgdG8gZmlsbCBhIGZpZWxkIG9mIHRoZSBnaXZlbiB3aWR0aC5cXG5cXG5UaGUgc3RyaW5nIGlzIG5ldmVyIHRydW5jYXRlZC5cIn0sZm9ybWF0OnskbWV0aDpTay5mb3JtYXR0aW5nLmZvcm1hdCwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmZvcm1hdCgqYXJncywgKiprd2FyZ3MpIC0+IHN0clxcblxcblJldHVybiBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIFMsIHVzaW5nIHN1YnN0aXR1dGlvbnMgZnJvbSBhcmdzIGFuZCBrd2FyZ3MuXFxuVGhlIHN1YnN0aXR1dGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgYnJhY2VzICgneycgYW5kICd9JykuXCJ9LFxuX19mb3JtYXRfXzp7JG1ldGg6U2suZm9ybWF0dGluZy5mb3JtYXRTdHJpbmcsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBmb3JtYXRfc3BlYywgLylcIiwkZG9jOlwiUmV0dXJuIGEgZm9ybWF0dGVkIHZlcnNpb24gb2YgdGhlIHN0cmluZyBhcyBkZXNjcmliZWQgYnkgZm9ybWF0X3NwZWMuXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6bnVsbH19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5zdHJcIixTay5idWlsdGluLnN0cik7dmFyIGs9L15bQS1aYS16MC05XSskLyxwPS8oWy4qKz89fFxcXFxcXC8oKVxcW1xcXVxce1xcfV4kXSkvZyx1PS9eW1xcc1xceGEwXSsvO1NrLmJ1aWx0aW4uc3RyLiRweTJkZWNvZGU9bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IoU2suYnVpbHRpbi5zdHIseyRuYW1lOlwiZGVjb2RlXCIsXG4kbWV0aChhLGIpe2NvbnN0IGM9bmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtyZXR1cm4gU2suYnVpbHRpbi5ieXRlcy4kZGVjb2RlLmNhbGwoYyxhLGIpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJlbmNvZGluZ1wiLFwiZXJyb3JzXCJdfX0pO3ZhciBBPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInN0cl9pdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO2EuJGhhc0FzdHJhbENvZGVQb2ludHMoKT8odGhpcy4kc2VxPWEuY29kZXBvaW50cyx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57Y29uc3QgYj10aGlzLiRzZXFbdGhpcy4kaW5kZXhdO2lmKHZvaWQgMCE9PWIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhLnYuc3Vic3RyaW5nKGIsdGhpcy4kc2VxWysrdGhpcy4kaW5kZXhdKSl9KToodGhpcy4kc2VxPWEudix0aGlzLnRwJGl0ZXJuZXh0PSgpPT57Y29uc3QgYT10aGlzLiRzZXFbdGhpcy4kaW5kZXgrK107aWYodm9pZCAwIT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSl9LFxuaXRlcm5leHQoKXtyZXR1cm4gdGhpcy50cCRpdGVybmV4dCgpfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KSx0PXthYnN0cmFjdDohMCxhczohMCxib29sZWFuOiEwLGJyZWFrOiEwLGJ5dGU6ITAsY2FzZTohMCxjYXRjaDohMCxjaGFyOiEwLGNsYXNzOiEwLGNvbnRpbnVlOiEwLGNvbnN0OiEwLGRlYnVnZ2VyOiEwLGRlZmF1bHQ6ITAsZGVsZXRlOiEwLGRvOiEwLGRvdWJsZTohMCxlbHNlOiEwLGVudW06ITAsZXhwb3J0OiEwLGV4dGVuZHM6ITAsZmFsc2U6ITAsZmluYWw6ITAsZmluYWxseTohMCxmbG9hdDohMCxmb3I6ITAsZnVuY3Rpb246ITAsZ290bzohMCxpZjohMCxpbXBsZW1lbnRzOiEwLGltcG9ydDohMCxpbjohMCxpbnN0YW5jZW9mOiEwLGludDohMCxpbnRlcmZhY2U6ITAsaXM6ITAsbG9uZzohMCxuYW1lc3BhY2U6ITAsXG5uYXRpdmU6ITAsbmV3OiEwLG51bGw6ITAscGFja2FnZTohMCxwcml2YXRlOiEwLHByb3RlY3RlZDohMCxwdWJsaWM6ITAscmV0dXJuOiEwLHNob3J0OiEwLHN0YXRpYzohMCxzdXBlcjohMCxzd2l0Y2g6ITAsc3luY2hyb25pemVkOiEwLHRoaXM6ITAsdGhyb3c6ITAsdGhyb3dzOiEwLHRyYW5zaWVudDohMCx0cnVlOiEwLHRyeTohMCx0eXBlb2Y6ITAsdXNlOiEwLHZhcjohMCx2b2lkOiEwLHZvbGF0aWxlOiEwLHdoaWxlOiEwLHdpdGg6ITAsY29uc3RydWN0b3I6ITAsX19kZWZpbmVHZXR0ZXJfXzohMCxfX2RlZmluZVNldHRlcl9fOiEwLGFwcGx5OiEwLGFyZ3VtZW50czohMCxjYWxsOiEwLGNhbGxlcjohMCxldmFsOiEwLGhhc093blByb3BlcnR5OiEwLGlzUHJvdG90eXBlT2Y6ITAsX19sb29rdXBHZXR0ZXJfXzohMCxfX2xvb2t1cFNldHRlcl9fOiEwLF9fbm9TdWNoTWV0aG9kX186ITAscHJvcGVydHlJc0VudW1lcmFibGU6ITAscHJvdG90eXBlOiEwLHRvU291cmNlOiEwLHRvTG9jYWxlU3RyaW5nOiEwLFxudG9TdHJpbmc6ITAsdW53YXRjaDohMCx2YWx1ZU9mOiEwLHdhdGNoOiEwLGxlbmd0aDohMCxuYW1lOiEwfTtTay5idWlsdGluLnN0ci5yZXNlcnZlZFdvcmRzXz10fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZnVuYz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZnVuY3Rpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZnVuYyxcImJ1aWx0aW4gZnVuYyBzaG91bGQgYmUgY2FsbGVkIGFzIGEgY2xhc3Mgd2l0aCBgbmV3YFwiKTt0aGlzLmZ1bmNfY29kZT1hO3RoaXMuZnVuY19nbG9iYWxzPWN8fG51bGw7dGhpcy4kbmFtZT1hLmNvX25hbWUmJmEuY29fbmFtZS52fHxhLm5hbWV8fFwiPG5hdGl2ZSBKUz5cIjt0aGlzLiRkPVNrLmJ1aWx0aW4uZGljdD9uZXcgU2suYnVpbHRpbi5kaWN0OnZvaWQgMDt0aGlzLiRkb2M9YS4kZG9jO3RoaXMuJG1vZHVsZT1Tay5nbG9iYWxzJiZTay5nbG9iYWxzLl9fbmFtZV9ffHxcblNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLiRxdWFsbmFtZT1hLmNvX3F1YWxuYW1lJiZhLmNvX3F1YWxuYW1lLnZ8fHRoaXMuJG5hbWU7aWYodm9pZCAwIT09ZSlmb3IobGV0IGEgaW4gZSliW2FdPWVbYV07dGhpcy5mdW5jX2Nsb3N1cmU9Yjt0aGlzLiRtZW1vaXNlRmxhZ3MoKTt0aGlzLm1lbW9pc2VkPWEuY29fZmFzdGNhbGx8fG51bGw7dGhpcy50cCRjYWxsPWEuY29fZmFzdGNhbGw/YS5iaW5kKHRoaXMpOlNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5iaW5kKHRoaXMpfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkZGVzY3JfZ2V0KGEsYyl7cmV0dXJuIG51bGw9PT1hP3RoaXM6bmV3IFNrLmJ1aWx0aW4ubWV0aG9kKHRoaXMsYSl9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxmdW5jdGlvbiBcIit0aGlzLiRxdWFsbmFtZStcIj5cIil9LHRwJGNhbGwoYSxjKXt0aGlzLm1lbW9pc2VkfHwodGhpcy4kbWVtb2lzZUZsYWdzKCksXG50aGlzLm1lbW9pc2VkPSEwKTtpZih2b2lkIDA9PT10aGlzLmNvX2FyZ2NvdW50JiZ2b2lkIDA9PT10aGlzLmNvX3Zhcm5hbWVzJiYhdGhpcy5jb19rd2FyZ3MmJiF0aGlzLmZ1bmNfY2xvc3VyZSl7aWYoYyYmMCE9PWMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7cmV0dXJuIHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGEpfWE9dGhpcy4kcmVzb2x2ZUFyZ3MoYSxjKTt0aGlzLmZ1bmNfY2xvc3VyZSYmYS5wdXNoKHRoaXMuZnVuY19jbG9zdXJlKTtyZXR1cm4gdGhpcy5mdW5jX2NvZGUuYXBwbHkodGhpcy5mdW5jX2dsb2JhbHMsYSl9fSxnZXRzZXRzOntfX25hbWVfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kbmFtZSl9LCRzZXQoYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19uYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0XCIpO1xudGhpcy4kbmFtZT1hLiRqc3N0cigpfX0sX19xdWFsbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLiRxdWFsbmFtZSl9LCRzZXQoYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19xdWFsbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdFwiKTt0aGlzLiRxdWFsbmFtZT1hLiRqc3N0cigpfX0sX19kaWN0X186U2suZ2VuZXJpYy5nZXRTZXREaWN0LF9fZGVmYXVsdHNfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLiRkZWZhdWx0cyl9fSxfX2RvY19fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLiRkb2MpfX19LHByb3RvOnskbWVtb2lzZUZsYWdzKCl7dGhpcy5jb192YXJuYW1lcz10aGlzLmZ1bmNfY29kZS5jb192YXJuYW1lczt0aGlzLmNvX2FyZ2NvdW50PXRoaXMuZnVuY19jb2RlLmNvX2FyZ2NvdW50O3ZvaWQgMD09PVxudGhpcy5jb19hcmdjb3VudCYmdGhpcy5jb192YXJuYW1lcyYmKHRoaXMuY29fYXJnY291bnQ9dGhpcy5jb19hcmdjb3VudD10aGlzLmNvX3Zhcm5hbWVzLmxlbmd0aCk7dGhpcy5jb19rd29ubHlhcmdjb3VudD10aGlzLmZ1bmNfY29kZS5jb19rd29ubHlhcmdjb3VudHx8MDt0aGlzLmNvX3ZhcmFyZ3M9dGhpcy5mdW5jX2NvZGUuY29fdmFyYXJnczt0aGlzLmNvX2t3YXJncz10aGlzLmZ1bmNfY29kZS5jb19rd2FyZ3M7dGhpcy4kZGVmYXVsdHM9dGhpcy5mdW5jX2NvZGUuJGRlZmF1bHRzfHxbXTt0aGlzLiRrd2RlZnM9dGhpcy5mdW5jX2NvZGUuJGt3ZGVmc3x8W119LCRyZXNvbHZlQXJnczpmdW5jdGlvbihhLGMpe3ZhciBiPXRoaXMuY29fYXJnY291bnQ7dm9pZCAwPT09YiYmKGI9dGhpcy5jb192YXJuYW1lcz90aGlzLmNvX3Zhcm5hbWVzLmxlbmd0aDphLmxlbmd0aCk7dmFyIGU9dGhpcy5jb192YXJuYW1lc3x8W10sZj10aGlzLmNvX2t3b25seWFyZ2NvdW50fHwwO2xldCBsPWIrXG5mO2lmKCEoMCE9PWZ8fHRoaXMuY29fa3dhcmdzfHxjJiYwIT09Yy5sZW5ndGh8fHRoaXMuY29fdmFyYXJncykpe2lmKGEubGVuZ3RoPT1iKXJldHVybiBhO2lmKDA9PT1hLmxlbmd0aCYmdGhpcy4kZGVmYXVsdHMmJnRoaXMuJGRlZmF1bHRzLmxlbmd0aD09PWIpe2ZvcihlPTA7ZSE9dGhpcy4kZGVmYXVsdHMubGVuZ3RoO2UrKylhW2VdPXRoaXMuJGRlZmF1bHRzW2VdO3JldHVybiBhfX1sZXQgaDt0aGlzLmNvX2t3YXJncyYmKGg9W10pO3ZhciBkPWEubGVuZ3RoO2xldCBnPWEubGVuZ3RoPD1iP2E6YS5zbGljZSgwLGIpO2lmKHRoaXMuY29fdmFyYXJncylhPWEubGVuZ3RoPmcubGVuZ3RoP2Euc2xpY2UoZy5sZW5ndGgpOltdLGdbbF09bmV3IFNrLmJ1aWx0aW4udHVwbGUoYSk7ZWxzZSBpZihkPmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSB0YWtlcyBcIitiK1wiIHBvc2l0aW9uYWwgYXJndW1lbnRcIisoMT09Yj9cIlwiOlwic1wiKStcIiBidXQgXCIrZCsoMT09XG5kP1wiIHdhcyBcIjpcIiB3ZXJlIFwiKStcIiBnaXZlblwiKTtpZihjKXtpZih0aGlzLmZ1bmNfY29kZS5ub19rdyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzXCIpO2ZvcihhPTA7YTxjLmxlbmd0aDthKz0yKXtkPWNbYV07dmFyIG49Y1thKzFdLGs9ZS5pbmRleE9mKGQpO2lmKDA8PWspe2lmKHZvaWQgMCE9PWdba10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBhcmd1bWVudCAnXCIrZCtcIidcIik7Z1trXT1ufWVsc2UgaWYoaCloLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGQpLG4pO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdcIitkK1wiJ1wiKTt9fWM9dGhpcy4kZGVmYXVsdHN8fFtdO2E9MDtkPVtdO249ITE7Zm9yKGs9Yi1jLmxlbmd0aDthPFxuazthKyspdm9pZCAwPT09Z1thXSYmKGQucHVzaChlW2FdKSx2b2lkIDA9PT1lW2FdJiYobj0hMCkpO2lmKDAhPWQubGVuZ3RoJiYodGhpcy5jb19hcmdjb3VudHx8dGhpcy5jb192YXJuYW1lcykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSBtaXNzaW5nIFwiK2QubGVuZ3RoK1wiIHJlcXVpcmVkIGFyZ3VtZW50XCIrKDE9PWQubGVuZ3RoP1wiXCI6XCJzXCIpKyhuP1wiXCI6XCI6IFwiK2Quam9pbihcIiwgXCIpKSk7Zm9yKDthPGI7YSsrKXZvaWQgMD09PWdbYV0mJihnW2FdPWNbYS1rXSk7aWYoMDxmKXtmPVtdO2M9dGhpcy4ka3dkZWZzO2ZvcihhPWI7YTxsO2ErKyl2b2lkIDA9PT1nW2FdJiYodm9pZCAwIT09Y1thLWJdP2dbYV09Y1thLWJdOmYucHVzaChlW2FdKSk7aWYoMCE9PWYubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgbWlzc2luZyBcIitmLmxlbmd0aCtcIiByZXF1aXJlZCBrZXl3b3JkIGFyZ3VtZW50XCIrKDE9PVxuZi5sZW5ndGg/XCJcIjpcInNcIikrXCI6IFwiK2Yuam9pbihcIiwgXCIpKTt9aWYodGhpcy5mdW5jX2Nsb3N1cmUmJmUpZm9yKGI9Zy5sZW5ndGg7YjxlLmxlbmd0aDtiKyspZy5wdXNoKHZvaWQgMCk7aCYmZy51bnNoaWZ0KGgpO3JldHVybiBnfX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmFzbnVtJD1mdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YXx8bnVsbD09PWF8fFwibnVtYmVyXCI9PT10eXBlb2YgYT9hOmEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8/XCJudW1iZXJcIj09PXR5cGVvZiBhLnY/YS52OmEudi50b1N0cmluZygpOmEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0Xz9hLnY6YT09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9udWxsOmF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uYXNudW0kXCIsU2suYnVpbHRpbi5hc251bSQpO1NrLmJ1aWx0aW4uYXNzayQ9ZnVuY3Rpb24oYSl7cmV0dXJuIDA9PT1hJTE/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSl9O1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5hc3NrJFwiLFNrLmJ1aWx0aW4uYXNzayQpO1NrLmJ1aWx0aW4uYXNudW0kbm9mbG9hdD1mdW5jdGlvbihhKXtpZih2b2lkIDA9PT1hfHxudWxsPT09YSlyZXR1cm4gYTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpYT1hLnRvU3RyaW5nKCk7ZWxzZSBpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKWE9YS52LnRvU3RyaW5nKCk7ZWxzZSBpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8pYT1hLnYudG9TdHJpbmcoKTtlbHNle2lmKGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpcmV0dXJuIG51bGw7cmV0dXJufWlmKDA+YS5pbmRleE9mKFwiLlwiKSYmMD5hLmluZGV4T2YoXCJlXCIpJiYwPmEuaW5kZXhPZihcIkVcIikpcmV0dXJuIGE7dmFyIGI9MDtpZigwPD1hLmluZGV4T2YoXCJlXCIpKXt2YXIgYz1hLnN1YnN0cigwLGEuaW5kZXhPZihcImVcIikpO2I9YS5zdWJzdHIoYS5pbmRleE9mKFwiZVwiKSsxKX1lbHNlIDA8PWEuaW5kZXhPZihcIkVcIik/XG4oYz1hLnN1YnN0cigwLGEuaW5kZXhPZihcImVcIikpLGI9YS5zdWJzdHIoYS5pbmRleE9mKFwiRVwiKSsxKSk6Yz1hO2I9cGFyc2VJbnQoYiwxMCk7YT1jLmluZGV4T2YoXCIuXCIpO2lmKDA+YSl7aWYoMDw9Yil7Zm9yKDswPGItLTspYys9XCIwXCI7cmV0dXJuIGN9cmV0dXJuIGMubGVuZ3RoPi1iP2Muc3Vic3RyKDAsYy5sZW5ndGgrYik6MH1jPTA9PT1hP2Muc3Vic3RyKDEpOmE8Yy5sZW5ndGg/Yy5zdWJzdHIoMCxhKStjLnN1YnN0cihhKzEpOmMuc3Vic3RyKDAsYSk7Zm9yKGErPWI7YT5jLmxlbmd0aDspYys9XCIwXCI7cmV0dXJuIGM9MD49YT8wOmMuc3Vic3RyKDAsYSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uYXNudW0kbm9mbG9hdFwiLFNrLmJ1aWx0aW4uYXNudW0kbm9mbG9hdCk7U2suYnVpbHRpbi5yb3VuZD1mdW5jdGlvbihhLGMpe2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYSBmbG9hdCBpcyByZXF1aXJlZFwiKTtpZighU2suX19mdXR1cmVfXy5kdW5kZXJfcm91bmQpe2lmKCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7XG5pZihhLnJvdW5kJClyZXR1cm4gYS5yb3VuZCQoYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgaW5zdGFuY2UgaGFzIG5vIGF0dHJpYnV0ZSAnX19mbG9hdF9fJ1wiKTt9aWYodm9pZCAwIT09YyYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGMpJiYhU2subWlzY2V2YWwuaXNJbmRleChjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXhcIik7YT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJHJvdW5kKTtpZih2b2lkIDAhPT1hKXJldHVybiB2b2lkIDAhPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtjXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW10pO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7fTtTay5idWlsdGluLmxlbj1cbmZ1bmN0aW9uKGEpe2lmKGEuc3EkbGVuZ3RoKWE9YS5zcSRsZW5ndGgoITApO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib2JqZWN0IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBoYXMgbm8gbGVuKClcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsYT0+bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSl9O1NrLmJ1aWx0aW4ubWluPWZ1bmN0aW9uKGEsYyl7bGV0IGI7Y29uc3QgZT1hLmxlbmd0aDtpZighZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtaW4gZXhwZWN0ZWQgMSBhcmd1bWVudCwgZ290IDBcIik7Y29uc3QgW2gsZF09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJtaW5cIixbXCJkZWZhdWx0XCIsXCJrZXlcIl0sW10sYyxbbnVsbCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtpZigxPGUmJm51bGwhPT1oKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGEgZGVmYXVsdCBmb3IgbWluKCkgd2l0aCBtdWx0aXBsZSBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKTtcbmI9MT09ZT9Tay5hYnN0ci5pdGVyKGFbMF0pOlNrLmFic3RyLml0ZXIobmV3IFNrLmJ1aWx0aW4udHVwbGUoYSkpO2lmKCFTay5idWlsdGluLmNoZWNrTm9uZShkKSYmIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoZCkrXCInIG9iamVjdCBpcyBub3QgY2FsbGFibGVcIik7bGV0IGc7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoITApLGE9PntnPWE7aWYodm9pZCAwIT09ZylyZXR1cm4gU2suYnVpbHRpbi5jaGVja05vbmUoZCk/U2subWlzY2V2YWwuaXRlckZvcihiLGE9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxnLFwiTHRcIikmJihnPWEpfSk6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW2ddKSxhPT5Tay5taXNjZXZhbC5pdGVyRm9yKGIsYj0+U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsXG5bYl0pLGM9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFwiTHRcIikmJihnPWIsYT1jKX0pKSl9LCgpPT57aWYodm9pZCAwPT09Zyl7aWYobnVsbD09PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm1pbigpIGFyZyBpcyBhbiBlbXB0eSBzZXF1ZW5jZVwiKTtnPWh9cmV0dXJuIGd9KX07U2suYnVpbHRpbi5tYXg9ZnVuY3Rpb24oYSxjKXtsZXQgYjtjb25zdCBlPWEubGVuZ3RoO2lmKCFlKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm1heCBleHBlY3RlZCAxIGFyZ3VtZW50LCBnb3QgMFwiKTtjb25zdCBbaCxkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcIm1pblwiLFtcImRlZmF1bHRcIixcImtleVwiXSxbXSxjLFtudWxsLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO2lmKDE8ZSYmbnVsbCE9PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiQ2Fubm90IHNwZWNpZnkgYSBkZWZhdWx0IGZvciBtYXgoKSB3aXRoIG11bHRpcGxlIHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpO1xuYj0xPT09ZT9Tay5hYnN0ci5pdGVyKGFbMF0pOlNrLmFic3RyLml0ZXIobmV3IFNrLmJ1aWx0aW4udHVwbGUoYSkpO2lmKCFTay5idWlsdGluLmNoZWNrTm9uZShkKSYmIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoZCkrXCInIG9iamVjdCBpcyBub3QgY2FsbGFibGVcIik7bGV0IGc7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoITApLGE9PntnPWE7aWYodm9pZCAwIT09ZylyZXR1cm4gU2suYnVpbHRpbi5jaGVja05vbmUoZCk/U2subWlzY2V2YWwuaXRlckZvcihiLGE9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxnLFwiR3RcIikmJihnPWEpfSk6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW2ddKSxhPT5Tay5taXNjZXZhbC5pdGVyRm9yKGIsYj0+U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsXG5bYl0pLGM9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFwiR3RcIikmJihnPWIsYT1jKX0pKSl9LCgpPT57aWYodm9pZCAwPT09Zyl7aWYobnVsbD09PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm1pbigpIGFyZyBpcyBhbiBlbXB0eSBzZXF1ZW5jZVwiKTtnPWh9cmV0dXJuIGd9KX07U2suYnVpbHRpbi5taW4uY29fZmFzdGNhbGw9U2suYnVpbHRpbi5tYXguY29fZmFzdGNhbGw9MTtTay5idWlsdGluLmFueT1mdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGZ1bmN0aW9uKGEpe2lmKFNrLm1pc2NldmFsLmlzVHJ1ZShhKSlyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKFNrLmJ1aWx0aW4uYm9vbC50cnVlJCl9KSxhPT5hfHxTay5idWlsdGluLmJvb2wuZmFsc2UkKX07U2suYnVpbHRpbi5hbGw9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxcbmZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc1RydWUoYSkpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhTay5idWlsdGluLmJvb2wuZmFsc2UkKX0pLGE9PmF8fFNrLmJ1aWx0aW4uYm9vbC50cnVlJCl9O1NrLmJ1aWx0aW4uc3VtPWZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gYigpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKGQsYT0+e2lmKGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmludF8pZz1nLm5iJGFkZChhKTtlbHNle2lmKGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmZsb2F0XylyZXR1cm4gZz1nLm5iJGZsb2F0KCkubmIkYWRkKGEpLG5ldyBTay5taXNjZXZhbC5CcmVhayhcImZsb2F0XCIpO2c9U2suYWJzdHIubnVtYmVyQmluT3AoZyxhLFwiQWRkXCIpO3JldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJzbG93XCIpfX0pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihkLGE9PntpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5mbG9hdF98fFxuYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50XylnPWcubmIkYWRkKGEpO2Vsc2UgcmV0dXJuIGc9U2suYWJzdHIubnVtYmVyQmluT3AoZyxhLFwiQWRkXCIpLG5ldyBTay5taXNjZXZhbC5CcmVhayhcInNsb3dcIil9KX1mdW5jdGlvbiBoKCl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoZCxhPT57Zz1Tay5hYnN0ci5udW1iZXJCaW5PcChnLGEsXCJBZGRcIil9KX1jb25zdCBkPVNrLmFic3RyLml0ZXIoYSk7aWYodm9pZCAwPT09Yyl2YXIgZz1uZXcgU2suYnVpbHRpbi5pbnRfKDApO2Vsc2V7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdW0oKSBjYW4ndCBzdW0gc3RyaW5ncyBbdXNlICcnLmpvaW4oc2VxKSBpbnN0ZWFkXVwiKTtnPWN9YT12b2lkIDA9PT1jfHxjLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5pbnRfP2IoKTpjLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5mbG9hdF8/XCJmbG9hdFwiOlwic2xvd1wiO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLFxuYT0+XCJmbG9hdFwiPT09YT9lKCk6YSxhPT57aWYoXCJzbG93XCI9PT1hKXJldHVybiBoKCl9LCgpPT5nKX07U2suYnVpbHRpbi56aXA9ZnVuY3Rpb24oKXt2YXIgYSxjO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KFtdKTt2YXIgZj1bXTtmb3IoYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspaWYoU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGFyZ3VtZW50c1tjXSkpZi5wdXNoKFNrLmFic3RyLml0ZXIoYXJndW1lbnRzW2NdKSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhcmd1bWVudCBcIitjK1wiIG11c3Qgc3VwcG9ydCBpdGVyYXRpb25cIik7dmFyIGw9W107Zm9yKGE9ITE7IWE7KXt2YXIgaD1bXTtmb3IoYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspe3ZhciBkPWZbY10udHAkaXRlcm5leHQoKTtpZih2b2lkIDA9PT1kKXthPSEwO2JyZWFrfWgucHVzaChkKX1hfHxsLnB1c2gobmV3IFNrLmJ1aWx0aW4udHVwbGUoaCkpfXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGwpfTtcblNrLmJ1aWx0aW4uYWJzPWZ1bmN0aW9uKGEpe2lmKGEubmIkYWJzKXJldHVybiBhLm5iJGFicygpO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJiYWQgb3BlcmFuZCB0eXBlIGZvciBhYnMoKTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt9O1NrLmJ1aWx0aW4uZmFicz1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5hYnMoYSl9O1NrLmJ1aWx0aW4ub3JkPWZ1bmN0aW9uKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpe2lmKDEhPT1hLnYubGVuZ3RoJiYxIT09YS5zcSRsZW5ndGgoKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvcmQoKSBleHBlY3RlZCBhIGNoYXJhY3RlciwgYnV0IHN0cmluZyBvZiBsZW5ndGggXCIrYS52Lmxlbmd0aCtcIiBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhLnYuY29kZVBvaW50QXQoMCkpfWlmKFNrLmJ1aWx0aW4uY2hlY2tCeXRlcyhhKSl7aWYoMSE9PWEuc3EkbGVuZ3RoKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib3JkKCkgZXhwZWN0ZWQgYSBjaGFyYWN0ZXIsIGJ1dCBzdHJpbmcgb2YgbGVuZ3RoIFwiK1xuYS52Lmxlbmd0aCtcIiBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhLnZbMF0pfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9yZCgpIGV4cGVjdGVkIGEgc3RyaW5nIG9mIGxlbmd0aCAxLCBidXQgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgZm91bmRcIik7fTtTay5idWlsdGluLmNocj1mdW5jdGlvbihhKXtpZighU2suYnVpbHRpbi5jaGVja0ludChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkXCIpO2E9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoU2suX19mdXR1cmVfXy5weXRob24zKXtpZigwPmF8fDExMTQxMTI8PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNocigpIGFyZyBub3QgaW4gcmFuZ2UoMHgxMTAwMDApXCIpO31lbHNlIGlmKDA+YXx8MjU2PD1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjaHIoKSBhcmcgbm90IGluIHJhbmdlKDI1NilcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTdHJpbmcuZnJvbUNvZGVQb2ludChhKSl9O1xuU2suYnVpbHRpbi51bmljaHI9ZnVuY3Rpb24oYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTthPVNrLmJ1aWx0aW4uYXNudW0kKGEpO3RyeXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFN0cmluZy5mcm9tQ29kZVBvaW50KGEpKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKGUubWVzc2FnZSk7dGhyb3cgZTt9fTtTay5idWlsdGluLmludDJzdHJfPWZ1bmN0aW9uKGEsYyxmKXtsZXQgYjthLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHwoYT1hLm5iJGluZGV4KCkpO2I9YS52O2xldCBlPWIudG9TdHJpbmcoYyk7ZT1hLm5iJGlzbmVnYXRpdmUoKT9cIi1cIitmK2Uuc2xpY2UoMSk6ZitlOzIhPT1jJiYhU2suX19mdXR1cmVfXy5weXRob24zJiZcbihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmd8fEpTQkkuX19pc0JpZ0ludChiKSkmJihlKz1cIkxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlKX07U2suYnVpbHRpbi5oZXg9ZnVuY3Rpb24oYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaGV4KCkgYXJndW1lbnQgY2FuJ3QgYmUgY29udmVydGVkIHRvIGhleFwiKTtyZXR1cm4gU2suYnVpbHRpbi5pbnQyc3RyXyhhLDE2LFwiMHhcIil9O1NrLmJ1aWx0aW4ub2N0PWZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9jdCgpIGFyZ3VtZW50IGNhbid0IGJlIGNvbnZlcnRlZCB0byBoZXhcIik7cmV0dXJuIFNrLl9fZnV0dXJlX18ub2N0YWxfbnVtYmVyX2xpdGVyYWw/U2suYnVpbHRpbi5pbnQyc3RyXyhhLDgsXCIwb1wiKTpTay5idWlsdGluLmludDJzdHJfKGEsOCxcIjBcIil9O1NrLmJ1aWx0aW4uYmluPVxuZnVuY3Rpb24oYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgY2FuJ3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXhcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50MnN0cl8oYSwyLFwiMGJcIil9O1NrLmJ1aWx0aW4uZGlyPWZ1bmN0aW9uKGEpe2lmKHZvaWQgMCE9PWEpcmV0dXJuIGE9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRkaXIpLFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShhLFtdKSxhPT5Tay5idWlsdGluLnNvcnRlZChhKSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcInNrdWxwdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBkaXIgd2l0aCBubyBhcmdzXCIpO307U2suYnVpbHRpbi5yZXByPWZ1bmN0aW9uKGEpe3JldHVybiBhLiRyKCl9O1NrLmJ1aWx0aW4uYXNjaWk9XG5mdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYS4kcigpLGE9PntsZXQgYixjO2ZvcihjPTA7YzxhLnYubGVuZ3RoO2MrKylpZigxMjc8PWEudi5jaGFyQ29kZUF0KGMpKXtiPWEudi5zdWJzdHIoMCxjKTticmVha31pZighYilyZXR1cm4gYTtmb3IoO2M8YS52Lmxlbmd0aDtjKyspe3ZhciBlPWEudi5jaGFyQXQoYyksZD1hLnYuY2hhckNvZGVBdChjKTsxMjc8ZCYmMjU1Pj1kPyhlPWQudG9TdHJpbmcoMTYpLDI+ZS5sZW5ndGgmJihlPVwiMFwiK2UpLGIrPVwiXFxcXHhcIitlKToxMjc8ZCYmNTUyOTY+ZHx8NTczNDQ8PWQ/Yis9XCJcXFxcdVwiKyhcIjAwMFwiK2QudG9TdHJpbmcoMTYpKS5zbGljZSgtNCk6NTUyOTY8PWQ/KGU9YS52LmNvZGVQb2ludEF0KGMpLGMrKyxlPWUudG9TdHJpbmcoMTYpLGQ9XCIwMDAwMDAwXCIrZS50b1N0cmluZygxNiksYj00PGUubGVuZ3RoP2IrKFwiXFxcXFVcIitkLnNsaWNlKC04KSk6YisoXCJcXFxcdVwiK2Quc2xpY2UoLTQpKSk6Yis9ZX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGIpfSl9O1xuU2suYnVpbHRpbi5vcGVuPWZ1bmN0aW9uKGEsYyxmKXt2b2lkIDA9PT1jJiYoYz1uZXcgU2suYnVpbHRpbi5zdHIoXCJyXCIpKTtpZigvXFwrLy50ZXN0KGMudikpdGhyb3dcInRvZG87IGhhdmVuJ3QgaW1wbGVtZW50ZWQgcmVhZC93cml0ZSBtb2RlXCI7aWYoKFwid1wiPT09Yy52fHxcIndiXCI9PT1jLnZ8fFwiYVwiPT09Yy52fHxcImFiXCI9PT1jLnYpJiYhU2subm9ucmVhZG9wZW4pdGhyb3dcInRvZG87IGhhdmVuJ3QgaW1wbGVtZW50ZWQgbm9uLXJlYWQgb3BlbnNcIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmlsZShhLGMsZil9O1NrLmJ1aWx0aW4uaXNpbnN0YW5jZT1mdW5jdGlvbihhLGMpe2lmKCEoU2suYnVpbHRpbi5jaGVja0NsYXNzKGMpfHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaXNpbnN0YW5jZSgpIGFyZyAyIG11c3QgYmUgYSBjbGFzcywgdHlwZSwgb3IgdHVwbGUgb2YgY2xhc3NlcyBhbmQgdHlwZXNcIik7dmFyIGI9YS5vYiR0eXBlO1xuaWYoYj09PWMpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKSl7aWYoYi4kaXNTdWJUeXBlKGMpKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7YT1hLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGNsYXNzKTtyZXR1cm4gYSE9YiYmU2suYnVpbHRpbi5jaGVja0NsYXNzKGEpJiZhLiRpc1N1YlR5cGUoYyk/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9Zm9yKGI9MDtiPGMudi5sZW5ndGg7KytiKWlmKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzaW5zdGFuY2UoYSxjLnZbYl0pKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO3JldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkfTtTay5idWlsdGluLmhhc2g9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oU2suYWJzdHIub2JqZWN0SGFzaChhKSl9O1NrLmJ1aWx0aW4uZ2V0YXR0cj1mdW5jdGlvbihhLFxuYyxmKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZ1wiKTtjb25zdCBiPVNrLm1pc2NldmFsLnRyeUNhdGNoKCgpPT5hLnRwJGdldGF0dHIoYywhMCksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIsYj0+e2lmKHZvaWQgMD09PWIpe2lmKHZvaWQgMCE9PWYpcmV0dXJuIGY7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoYS5zayRhdHRyRXJyb3IoKStcIiBoYXMgbm8gYXR0cmlidXRlIFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYykpO31yZXR1cm4gYn0pfTtTay5idWlsdGluLnNldGF0dHI9ZnVuY3Rpb24oYSxjLGYpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nXCIpO1xucmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEudHAkc2V0YXR0cihjLGYsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfTtTay5idWlsdGluLnJhd19pbnB1dD1mdW5jdGlvbihhKXt2YXIgYj1hP2E6XCJcIjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suaW1wb3J0TW9kdWxlKFwic3lzXCIsITEsITApLGZ1bmN0aW9uKGEpe3JldHVybiBTay5pbnB1dGZ1blRha2VzUHJvbXB0P1NrLmJ1aWx0aW4uZmlsZS4kcmVhZGxpbmUoYS4kZC5zdGRpbixudWxsLGIpOlNrLm1pc2NldmFsLmNoYWluKHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYS4kZC5zdGRvdXQud3JpdGUsW2EuJGQuc3Rkb3V0LG5ldyBTay5idWlsdGluLnN0cihiKV0pfSxmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYS4kZC5zdGRpbi5yZWFkbGluZSxbYS4kZC5zdGRpbl0pfSl9KX07U2suYnVpbHRpbi5pbnB1dD1cblNrLmJ1aWx0aW4ucmF3X2lucHV0O1NrLmJ1aWx0aW4uanNldmFsPWZ1bmN0aW9uKGEpe2E9U2suZ2xvYmFsLmV2YWwoU2suZmZpLnJlbWFwVG9KcyhhKSk7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoYSl9O1NrLmJ1aWx0aW4uanNtaWxsaXM9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oXCJqc21pbGxpcyBpcyBkZXByZWNhdGVkXCIpO3JldHVybihuZXcgRGF0ZSkudmFsdWVPZigpfTtTay5idWlsdGluLmV2YWxfPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImV2YWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4ubWFwPWZ1bmN0aW9uKGEsYyl7dmFyIGI9W10sZSxoO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXCJtYXBcIixhcmd1bWVudHMubGVuZ3RoLDIpO2lmKDI8YXJndW1lbnRzLmxlbmd0aCl7dmFyIGQ9W107dmFyIGc9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykuc2xpY2UoMSk7Zm9yKGg9XG4wO2g8Zy5sZW5ndGg7aCsrKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGdbaF0pKXt2YXIgbj1wYXJzZUludChoLDEwKSsyO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFyZ3VtZW50IFwiK24rXCIgdG8gbWFwKCkgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvblwiKTt9Z1toXT1Tay5hYnN0ci5pdGVyKGdbaF0pfWZvcig7Oyl7dmFyIGs9W107Zm9yKGg9ZT0wO2g8Zy5sZW5ndGg7aCsrKW49Z1toXS50cCRpdGVybmV4dCgpLHZvaWQgMD09PW4/KGsucHVzaChTay5idWlsdGluLm5vbmUubm9uZSQpLGUrKyk6ay5wdXNoKG4pO2lmKGUhPT1nLmxlbmd0aClkLnB1c2goayk7ZWxzZSBicmVha31jPW5ldyBTay5idWlsdGluLmxpc3QoZCl9aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihjKSxcbmZ1bmN0aW9uKGMpe2lmKGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpYyBpbnN0YW5jZW9mIEFycmF5JiYoYz1uZXcgU2suYnVpbHRpbi50dXBsZShjKSksYi5wdXNoKGMpO2Vsc2UgcmV0dXJuIGMgaW5zdGFuY2VvZiBBcnJheXx8KGM9W2NdKSxTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYSxjKSxmdW5jdGlvbihhKXtiLnB1c2goYSl9KX0pLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9KX07U2suYnVpbHRpbi5yZWR1Y2U9ZnVuY3Rpb24oYSxjLGYpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO2M9U2suYWJzdHIuaXRlcihjKTtpZih2b2lkIDA9PT1mJiYoZj1jLnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09ZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwicmVkdWNlKCkgb2YgZW1wdHkgc2VxdWVuY2Ugd2l0aCBubyBpbml0aWFsIHZhbHVlXCIpO1xudmFyIGI9Zjtmb3IoZj1jLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWMudHAkaXRlcm5leHQoKSliPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiLGZdKTtyZXR1cm4gYn07U2suYnVpbHRpbi5zb3J0ZWQ9ZnVuY3Rpb24oYSxjLGYsbCl7YT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT57YT1uZXcgU2suYnVpbHRpbi5saXN0KGEpO2EubGlzdCRzb3J0KGMsZixsKTtyZXR1cm4gYX0pfTtTay5idWlsdGluLmZpbHRlcj1mdW5jdGlvbihhLGMpe3ZhciBiO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXCJmaWx0ZXJcIixhcmd1bWVudHMubGVuZ3RoLDIsMik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcIik7dmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm5bXX07XG52YXIgaD1mdW5jdGlvbihhLGIpe2EucHVzaChiKTtyZXR1cm4gYX07dmFyIGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYSl9O2Mub2IkdHlwZT09PVNrLmJ1aWx0aW4uc3RyPyhlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIlwiKX0saD1mdW5jdGlvbihhLGIpe3JldHVybiBhLnNxJGNvbmNhdChiKX0sZD1mdW5jdGlvbihhKXtyZXR1cm4gYX0pOmMub2IkdHlwZT09PVNrLmJ1aWx0aW4udHVwbGUmJihkPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShhKX0pO3ZhciBnPWUoKTt2YXIgbj1Tay5hYnN0ci5pdGVyKGMpO2ZvcihiPW4udHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9bi50cCRpdGVybmV4dCgpKWU9YT09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9uZXcgU2suYnVpbHRpbi5ib29sKGIpOlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiXSksU2subWlzY2V2YWwuaXNUcnVlKGUpJiYoZz1oKGcsYikpO1xucmV0dXJuIGQoZyl9O1NrLmJ1aWx0aW4uaGFzYXR0cj1mdW5jdGlvbihhLGMpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImhhc2F0dHIoKTogYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmdcIik7Y29uc3QgYj1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+YS50cCRnZXRhdHRyKGMsITApLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKSl0aHJvdyBhO30pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGE9PnZvaWQgMD09PWE/U2suYnVpbHRpbi5ib29sLmZhbHNlJDpTay5idWlsdGluLmJvb2wudHJ1ZSQpfTtTay5idWlsdGluLnBvdz1mdW5jdGlvbihhLGMsZil7aWYodm9pZCAwPT09Znx8U2suYnVpbHRpbi5jaGVja05vbmUoZikpcmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGEsYyxcIlBvd1wiKTtpZighKFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkmJlNrLmJ1aWx0aW4uY2hlY2tJbnQoYykmJlxuU2suYnVpbHRpbi5jaGVja0ludChmKSkpe2lmKFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8U2suYnVpbHRpbi5jaGVja0NvbXBsZXgoYSkpcmV0dXJuIGEubmIkcG93ZXIoYyxmKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICoqIG9yIHBvdygpOiAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInLCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInLCAnXCIrU2suYWJzdHIudHlwZU5hbWUoZikrXCInXCIpO31yZXR1cm4gYS5uYiRwb3dlcihjLGYpfTtTay5idWlsdGluLnF1aXQ9ZnVuY3Rpb24oYSl7YT0obmV3IFNrLmJ1aWx0aW4uc3RyKGEpKS52O3Rocm93IG5ldyBTay5idWlsdGluLlN5c3RlbUV4aXQoYSk7fTtTay5idWlsdGluLmlzc3ViY2xhc3M9ZnVuY3Rpb24oYSxjKXtpZighU2suYnVpbHRpbi5jaGVja0NsYXNzKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzc3ViY2xhc3MoKSBhcmcgMSBtdXN0IGJlIGEgY2xhc3NcIik7XG52YXIgYj1Tay5idWlsdGluLmNoZWNrQ2xhc3MoYyk7aWYoIShifHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaXNzdWJjbGFzcygpIGFyZyAyIG11c3QgYmUgYSBjbGFzcyBvciB0dXBsZSBvZiBjbGFzc2VzXCIpO2lmKGIpcmV0dXJuIGEuJGlzU3ViVHlwZShjKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJDtmb3IoYj0wO2I8Yy52Lmxlbmd0aDsrK2IpaWYoU2subWlzY2V2YWwuaXNUcnVlKFNrLmJ1aWx0aW4uaXNzdWJjbGFzcyhhLGMudltiXSkpKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9O1NrLmJ1aWx0aW4uZ2xvYmFscz1mdW5jdGlvbigpe3ZhciBhLGM9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7Zm9yKGEgaW4gU2suZ2xvYmFscyl7dmFyIGY9U2sudW5maXhSZXNlcnZlZChhKTtjLm1wJGFzc19zdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLFxuU2suZ2xvYmFsc1thXSl9cmV0dXJuIGN9O1NrLmJ1aWx0aW4uZGl2bW9kPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGEsYyxcIkRpdk1vZFwiKX07U2suYnVpbHRpbi5mb3JtYXQ9ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz1Tay5idWlsdGluLnN0ci4kZW1wdHlzdHIpO3JldHVybiBTay5hYnN0ci5vYmplY3RGb3JtYXQoYSxjKX07Y29uc3QgYT1uZXcgTWFwO2xldCBjPTA7U2suYnVpbHRpbi5pZD1mdW5jdGlvbihiKXtjb25zdCBlPWEuZ2V0KGIpO2lmKHZvaWQgMCE9PWUpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZSk7YS5zZXQoYixjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKyspfTtTay5idWlsdGluLmJ5dGVhcnJheT1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJieXRlYXJyYXkgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uY2FsbGFibGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShhKT9cblNrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfTtTay5idWlsdGluLmRlbGF0dHI9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gU2suYnVpbHRpbi5zZXRhdHRyKGEsYyx2b2lkIDApfTtTay5idWlsdGluLmV4ZWNmaWxlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImV4ZWNmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmhlbHA9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiaGVscCBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5pdGVyPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP1NrLmFic3RyLml0ZXIoYSk6U2suYWJzdHIuaXRlcihuZXcgU2suYnVpbHRpbi5jYWxsYWJsZV9pdGVyXyhhLGMpKX07U2suYnVpbHRpbi5sb2NhbHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwibG9jYWxzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1NrLmJ1aWx0aW4ubWVtb3J5dmlldz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJtZW1vcnl2aWV3IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLm5leHRfPWZ1bmN0aW9uKGEsYyl7aWYoIWEudHAkaXRlcm5leHQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGFuIGl0ZXJhdG9yXCIpO2E9YS50cCRpdGVybmV4dCgpO2lmKHZvaWQgMD09PWEpe2lmKGMpcmV0dXJuIGM7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbjt9cmV0dXJuIGF9O1NrLmJ1aWx0aW4ucmVsb2FkPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcInJlbG9hZCBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi52YXJzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcInZhcnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07U2suYnVpbHRpbi5hcHBseV89ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiYXBwbHkgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uYnVmZmVyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImJ1ZmZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5jb2VyY2U9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiY29lcmNlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmludGVybj1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJpbnRlcm4gaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiQmFzZUV4Y2VwdGlvblwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb24sXCJiYWQgY2FsbCB0byBleGNlcHRpb24gY29uc3RydWN0b3IsIHVzZSAnbmV3J1wiKTtsZXQgYz1hWzBdO1wic3RyaW5nXCI9PT10eXBlb2YgYyYmKGM9bmV3IFNrLmJ1aWx0aW4uc3RyKGMpKTt0aGlzLmFyZ3M9bmV3IFNrLmJ1aWx0aW4udHVwbGUoYz9bY106W10pO3RoaXMudHJhY2ViYWNrPVtdO3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdDszPD1hLmxlbmd0aCYmdGhpcy50cmFjZWJhY2sucHVzaCh7bGluZW5vOmFbMl0sZmlsZW5hbWU6YVsxXXx8XCI8dW5rbm93bj5cIn0pfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkZG9jOlwiQ29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zXCIsdHAkbmV3KGEsYyl7dGhpcy5ocCR0eXBlPyhjPW5ldyB0aGlzLmNvbnN0cnVjdG9yLFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbi5jYWxsKGMpKTpcbmM9bmV3IHRoaXMuY29uc3RydWN0b3I7Yy5hcmdzPW5ldyBTay5idWlsdGluLnR1cGxlKGEuc2xpY2UoKSk7cmV0dXJuIGN9LHRwJGluaXQoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpLGMpfSwkcigpe2xldCBhPXRoaXMudHAkbmFtZTthKz1cIihcIit0aGlzLmFyZ3Mudi5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSkuam9pbihcIiwgXCIpK1wiKVwiO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LHRwJHN0cigpe3JldHVybiAxPj10aGlzLmFyZ3Mudi5sZW5ndGg/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuYXJncy52WzBdKTp0aGlzLmFyZ3MuJHIoKX19LGdldHNldHM6e2FyZ3M6eyRnZXQoKXtyZXR1cm4gdGhpcy5hcmdzfX0sX19kaWN0X186U2suZ2VuZXJpYy5nZXRTZXREaWN0fSxwcm90bzp7dG9TdHJpbmcoKXtsZXQgYT10aGlzLnRwJG5hbWU7YSs9XCI6IFwiK3RoaXMudHAkc3RyKCkudjtyZXR1cm4gYT0wIT09dGhpcy50cmFjZWJhY2subGVuZ3RoP1xuYSsoXCIgb24gbGluZSBcIit0aGlzLnRyYWNlYmFja1swXS5saW5lbm8pOmErXCIgYXQgPHVua25vd24+XCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvblwiLFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbik7U2suYnVpbHRpbi5FeGNlcHRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkV4Y2VwdGlvblwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkJhc2VFeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkV4Y2VwdGlvblwiLFNrLmJ1aWx0aW4uRXhjZXB0aW9uKTtTay5idWlsdGluLkFzc2VydGlvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJBc3NlcnRpb25FcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkFzc2VydGlvbkVycm9yXCIsU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcik7U2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiQXR0cmlidXRlRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uSW1wb3J0RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkltcG9ydEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLkluZGVudGF0aW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkluZGVudGF0aW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxcbmEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5JbmRleEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJbmRleEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLkxvb2t1cEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJMb29rdXBFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5LZXlFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiS2V5RXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5Mb29rdXBFcnJvci5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uTG9va3VwRXJyb3J9KTtTay5idWlsdGluLk5hbWVFcnJvcj1cblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOYW1lRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uVW5ib3VuZExvY2FsRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlVuYm91bmRMb2NhbEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLk92ZXJmbG93RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIk92ZXJmbG93RXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uU3ludGF4RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN5bnRheEVycm9yXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uUnVudGltZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJSdW50aW1lRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uUnVudGltZUVycm9yXCIsU2suYnVpbHRpbi5SdW50aW1lRXJyb3IpO1NrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJTdXNwZW5zaW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yXCIsXG5Tay5idWlsdGluLlN1c3BlbnNpb25FcnJvcik7U2suYnVpbHRpbi5TeXN0ZW1FeGl0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJTeXN0ZW1FeGl0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uU3lzdGVtRXhpdFwiLFNrLmJ1aWx0aW4uU3lzdGVtRXhpdCk7U2suYnVpbHRpbi5UeXBlRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlR5cGVFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5UeXBlRXJyb3JcIixTay5idWlsdGluLlR5cGVFcnJvcik7U2suYnVpbHRpbi5WYWx1ZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJWYWx1ZUVycm9yXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uVmFsdWVFcnJvclwiLFNrLmJ1aWx0aW4uVmFsdWVFcnJvcik7U2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiWmVyb0RpdmlzaW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uVGltZUxpbWl0RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlRpbWVMaW1pdEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlRpbWVMaW1pdEVycm9yXCIsXG5Tay5idWlsdGluLlRpbWVMaW1pdEVycm9yKTtTay5idWlsdGluLklPRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIklPRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uSU9FcnJvclwiLFNrLmJ1aWx0aW4uSU9FcnJvcik7U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOb3RJbXBsZW1lbnRlZEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3JcIixTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IpO1NrLmJ1aWx0aW4uTmVnYXRpdmVQb3dlckVycm9yPVxuU2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIk5lZ2F0aXZlUG93ZXJFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3JcIixTay5idWlsdGluLk5lZ2F0aXZlUG93ZXJFcnJvcik7U2suYnVpbHRpbi5FeHRlcm5hbEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJFeHRlcm5hbEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe3RoaXMubmF0aXZlRXJyb3I9YVswXTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyh0aGlzLm5hdGl2ZUVycm9yKSYmKGFbMF09dGhpcy5uYXRpdmVFcnJvci50b1N0cmluZygpLGFbMF0uc3RhcnRzV2l0aChcIlJhbmdlRXJyb3I6IE1heGltdW0gY2FsbFwiKSkpcmV0dXJuIGFbMF09XCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLFxubmV3IFNrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3IoLi4uYSk7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvclwiLFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcik7U2suYnVpbHRpbi5SZWN1cnNpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiUmVjdXJzaW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5SdW50aW1lRXJyb3IuYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3JcIixTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yKTtTay5idWlsdGluLk9wZXJhdGlvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJPcGVyYXRpb25FcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLFxuYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLk9wZXJhdGlvbkVycm9yXCIsU2suYnVpbHRpbi5PcGVyYXRpb25FcnJvcik7U2suYnVpbHRpbi5TeXN0ZW1FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3lzdGVtRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uU3lzdGVtRXJyb3JcIixTay5idWlsdGluLlN5c3RlbUVycm9yKTtTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVW5pY29kZURlY29kZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvclwiLFxuU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IpO1NrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJVbmljb2RlRW5jb2RlRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yXCIsU2suYnVpbHRpbi5Vbmljb2RlRW5jb2RlRXJyb3IpO1NrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3RvcEl0ZXJhdGlvblwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uXCIsU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uKTtcblNrLmJ1aWx0aW4uZ2V0RXhjSW5mbz1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2Eub2IkdHlwZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkLGEsU2suYnVpbHRpbi5ub25lLm5vbmUkXSl9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubWV0aG9kPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJtZXRob2RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tZXRob2QsXCJiYWQgY2FsbCB0byBtZXRob2QgY29uc3RydWN0b3IsIHVzZSAnbmV3J1wiKTt0aGlzLmltX2Z1bmM9YTt0aGlzLmltX3NlbGY9Yzt0aGlzLmltX2NhbGw9YS50cCRjYWxsfSxzbG90czp7JHIoKXtsZXQgYT10aGlzLmltX2Z1bmMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kcXVhbG5hbWUpfHx0aGlzLmltX2Z1bmMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbmFtZSk7YT1hJiZhLnZ8fFwiP1wiO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8Ym91bmQgbWV0aG9kIFwiK1xuYStcIiBvZiBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuaW1fc2VsZikrXCI+XCIpfSx0cCRoYXNoKCl7Y29uc3QgYT1Tay5hYnN0ci5vYmplY3RIYXNoKHRoaXMuaW1fc2VsZiksYz1Tay5hYnN0ci5vYmplY3RIYXNoKHRoaXMuaW1fZnVuYyk7cmV0dXJuIGErY30sdHAkY2FsbChhLGMpe3ZhciBiPXRoaXMuaW1fY2FsbDtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzLmltX2Z1bmMpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2E9W3RoaXMuaW1fc2VsZiwuLi5hXTtyZXR1cm4gYi5jYWxsKHRoaXMuaW1fZnVuYyxhLGMpfSx0cCRuZXcoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwibWV0aG9kXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwibWV0aG9kXCIsYSwyLDIpO2M9YVswXTthPWFbMV07aWYoIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlXCIpO1xuaWYoU2suYnVpbHRpbi5jaGVja05vbmUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2VsZiBtdXN0IG5vdCBiZSBOb25lXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5tZXRob2QoYyxhKX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihcIkVxXCIhPWMmJlwiTm90RXFcIiE9Y3x8IShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tZXRob2QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtsZXQgYjt0cnl7Yj1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5pbV9zZWxmLGEuaW1fc2VsZixcIkVxXCIsITEpJiZ0aGlzLmltX2Z1bmM9PWEuaW1fZnVuY31jYXRjaChlKXtiPSExfXJldHVyblwiRXFcIj09Yz9iOiFifSx0cCRkZXNjcl9nZXQoYSxjKXtyZXR1cm4gdGhpc30sdHAkZ2V0YXR0cihhLGMpe2NvbnN0IGI9U2suYWJzdHIubG9va3VwU3BlY2lhbCh0aGlzLGEpO3JldHVybiB2b2lkIDAhPT1iP2I6dGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoYSxcbmMpfX0sZ2V0c2V0czp7X19mdW5jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5pbV9mdW5jfX0sX19zZWxmX186eyRnZXQoKXtyZXR1cm4gdGhpcy5pbV9zZWxmfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLmltX2Z1bmMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kZG9jKX19fSxmbGFnczp7c2skc3VpdGFibGVfYXNfYmFzZV9jbGFzczohMX19KX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2lmKG51bGwhPT1hJiZ2b2lkIDAhPT1hKXtpZihhLm5iJGluZGV4KXJldHVybiBhLm5iJGluZGV4KCk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpKXJldHVybiBhfX1mdW5jdGlvbiBjKGIsYyl7Y29uc3QgZT1hKGIpO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGU7Yz0oY3x8XCIne3RwJG5hbWV9JyBvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGludGVnZXJcIikucmVwbGFjZShcInt0cCRuYW1lfVwiLFNrLmFic3RyLnR5cGVOYW1lKGIpKTtcbnRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihjKTt9U2subWlzY2V2YWw9e307U2subWlzY2V2YWwuU3VzcGVuc2lvbj1mdW5jdGlvbihhLGMsZil7dGhpcy4kaXNTdXNwZW5zaW9uPSEwO3ZvaWQgMCE9PWEmJnZvaWQgMCE9PWMmJih0aGlzLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBhKGMucmVzdW1lKCkpfSk7dGhpcy5jaGlsZD1jO3RoaXMub3B0aW9uYWw9dm9pZCAwIT09YyYmYy5vcHRpb25hbDt0aGlzLmRhdGE9dm9pZCAwPT09ZiYmdm9pZCAwIT09Yz9jLmRhdGE6Zn07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuU3VzcGVuc2lvblwiLFNrLm1pc2NldmFsLlN1c3BlbnNpb24pO1NrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdz1mdW5jdGlvbihhLGMpe2Zvcig7YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb247KXtpZighYS5vcHRpb25hbCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TdXNwZW5zaW9uRXJyb3IoY3x8XCJDYW5ub3QgY2FsbCBhIGZ1bmN0aW9uIHRoYXQgYmxvY2tzIG9yIHN1c3BlbmRzIGhlcmVcIik7XG5hPWEucmVzdW1lKCl9cmV0dXJuIGF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvd1wiLFNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyk7U2subWlzY2V2YWwuaXNJbmRleD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWEmJih2b2lkIDAhPT1hLm5iJGluZGV4fHxcIm51bWJlclwiPT09dHlwZW9mIGEmJk51bWJlci5pc0ludGVnZXIoYSkpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5pc0luZGV4XCIsU2subWlzY2V2YWwuaXNJbmRleCk7U2subWlzY2V2YWwuYXNJbmRleD1hO1NrLm1pc2NldmFsLmFzSW5kZXhTaXplZD1mdW5jdGlvbihhLGUsZil7Zj1jKGEsZik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBmKXJldHVybiBmO2lmKG51bGw9PWUpcmV0dXJuIEpTQkkubGVzc1RoYW4oZixKU0JJLl9fWkVSTyk/LU51bWJlci5NQVhfU0FGRV9JTlRFR0VSOk51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xudGhyb3cgbmV3IGUoXCJjYW5ub3QgZml0ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgaW50byBhbiBpbmRleC1zaXplZCBpbnRlZ2VyXCIpO307U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3c9YztTay5taXNjZXZhbC5hcHBseVNsaWNlPWZ1bmN0aW9uKGEsYyxmLGwpe3JldHVybiBTay5hYnN0ci5vYmplY3RHZXRJdGVtKGEsbmV3IFNrLmJ1aWx0aW4uc2xpY2UoYyxmLG51bGwpLGwpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hcHBseVNsaWNlXCIsU2subWlzY2V2YWwuYXBwbHlTbGljZSk7U2subWlzY2V2YWwuYXNzaWduU2xpY2U9ZnVuY3Rpb24oYSxjLGYsbCxoKXtjPW5ldyBTay5idWlsdGluLnNsaWNlKGMsZik7cmV0dXJuIG51bGw9PT1sP1NrLmFic3RyLm9iamVjdERlbEl0ZW0oYSxjKTpTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsYyxsLGgpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hc3NpZ25TbGljZVwiLFNrLm1pc2NldmFsLmFzc2lnblNsaWNlKTtcblNrLm1pc2NldmFsLmFycmF5RnJvbUFyZ3VtZW50cz1mdW5jdGlvbihhKXt2YXIgYjtpZigxIT1hLmxlbmd0aClyZXR1cm4gYTt2YXIgYz1hWzBdO2MgaW5zdGFuY2VvZiBTay5idWlsdGluLnNldD9jPWMudHAkaXRlcigpLiRvYmo6YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCYmKGM9U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5rZXlzLmZ1bmNfY29kZShjKSk7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdHx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpcmV0dXJuIGMudjtpZihTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpe2E9W107Yz1Tay5hYnN0ci5pdGVyKGMpO2ZvcihiPWMudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9Yy50cCRpdGVybmV4dCgpKWEucHVzaChiKTtyZXR1cm4gYX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHNcIixcblNrLm1pc2NldmFsLmFycmF5RnJvbUFyZ3VtZW50cyk7U2subWlzY2V2YWwuaXRlcmF0b3I9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLnRwJGl0ZXJuZXh0PWM/YTpmdW5jdGlvbihiKXtsZXQgYz1hKCk7cmV0dXJuIGJ8fCFjLiRpc1N1c3BlbnNpb24/YzpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9fSxpdGVybmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cCRpdGVybmV4dChhKX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5taXNjZXZhbC5zd2FwcGVkT3BfPXtFcTpcIkVxXCIsTm90RXE6XCJOb3RFcVwiLEx0OlwiR3RcIixMdEU6XCJHdEVcIixHdDpcIkx0XCIsR3RFOlwiTHRFXCJ9O1NrLm1pc2NldmFsLm9wU3ltYm9scz17RXE6XCI9PVwiLE5vdEVxOlwiIT1cIixMdDpcIjxcIixMdEU6XCI8PVwiLEd0OlwiPlwiLEd0RTpcIj49XCIsSXM6XCJpc1wiLElzTm90OlwiaXMgbm90XCIsXG5Jbl86XCJpblwiLE5vdEluOlwibm90IGluXCJ9O1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbD1mdW5jdGlvbihhLGMsZixsKXtTay5hc3NlcnRzLmFzc2VydChhLnNrJG9iamVjdCYmYy5zayRvYmplY3QsXCJKUyBvYmplY3QgcGFzc2VkIHRvIHJpY2hDb21wYXJlQm9vbFwiKTt2YXIgYjt2YXIgZD1hLm9iJHR5cGU7dmFyIGU9Yy5vYiR0eXBlLG49ZSE9PWQmJnZvaWQgMD09PWUuc2skYmFzZUNsYXNzJiZlLiRpc1N1YlR5cGUoZCk7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyYmZCE9PWUmJihcIkd0RVwiPT09Znx8XCJHdFwiPT09Znx8XCJMdEVcIj09PWZ8fFwiTHRcIj09PWYpKXt2YXIgaz1bU2suYnVpbHRpbi5mbG9hdF8sU2suYnVpbHRpbi5pbnRfLFNrLmJ1aWx0aW4ubG5nLFNrLmJ1aWx0aW4uYm9vbF0scD1bU2suYnVpbHRpbi5kaWN0LFNrLmJ1aWx0aW4uZW51bWVyYXRlLFNrLmJ1aWx0aW4uZmlsdGVyXyxTay5idWlsdGluLmxpc3QsU2suYnVpbHRpbi5tYXBfLFNrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW4udHVwbGUsXG5Tay5idWlsdGluLnppcF9dO2NvbnN0IGI9ay5pbmRleE9mKGQpLGc9cC5pbmRleE9mKGQpO2s9ay5pbmRleE9mKGUpO3A9cC5pbmRleE9mKGUpO2lmKGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiEwO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMDtjYXNlIFwiR3RcIjpyZXR1cm4hMTtjYXNlIFwiR3RFXCI6cmV0dXJuITF9aWYoYz09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJClzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuITE7Y2FzZSBcIkx0RVwiOnJldHVybiExO2Nhc2UgXCJHdFwiOnJldHVybiEwO2Nhc2UgXCJHdEVcIjpyZXR1cm4hMH1pZigtMSE9PWImJi0xIT09cClzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuITA7Y2FzZSBcIkx0RVwiOnJldHVybiEwO2Nhc2UgXCJHdFwiOnJldHVybiExO2Nhc2UgXCJHdEVcIjpyZXR1cm4hMX1pZigtMSE9PWcmJi0xIT09aylzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuITE7Y2FzZSBcIkx0RVwiOnJldHVybiExO2Nhc2UgXCJHdFwiOnJldHVybiEwO1xuY2FzZSBcIkd0RVwiOnJldHVybiEwfWlmKC0xIT09ZyYmLTEhPT1wKXN3aXRjaChmKXtjYXNlIFwiTHRcIjpyZXR1cm4gZzxwO2Nhc2UgXCJMdEVcIjpyZXR1cm4gZzw9cDtjYXNlIFwiR3RcIjpyZXR1cm4gZz5wO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZz49cH19aWYoXCJJc1wiPT09Zil7aWYoZD09PWUpe2lmKGE9PT1jKXJldHVybiEwO2lmKGQ9PT1Tay5idWlsdGluLmZsb2F0XylyZXR1cm4gYS52PT09Yy52O2lmKGQ9PT1Tay5idWlsdGluLmludF8pcmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhLnYmJlwibnVtYmVyXCI9PT10eXBlb2YgYS52P2Eudj09PWMudjpKU0JJLmVxdWFsKEpTQkkuQmlnSW50KGEudiksSlNCSS5CaWdJbnQoYy52KSl9cmV0dXJuITF9aWYoXCJJc05vdFwiPT09ZilyZXR1cm4gZCE9PWU/ITA6ZD09PVNrLmJ1aWx0aW4uZmxvYXRfP2EudiE9PWMudjpkPT09U2suYnVpbHRpbi5pbnRfP1wibnVtYmVyXCI9PT10eXBlb2YgYS52JiZcIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnYhPT1jLnY6SlNCSS5ub3RFcXVhbChKU0JJLkJpZ0ludChhLnYpLFxuSlNCSS5CaWdJbnQoYy52KSk6YSE9PWM7aWYoXCJJblwiPT09ZilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEsbCksU2subWlzY2V2YWwuaXNUcnVlKTtpZihcIk5vdEluXCI9PT1mKXJldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5hYnN0ci5zZXF1ZW5jZUNvbnRhaW5zKGMsYSxsKSxmdW5jdGlvbihhKXtyZXR1cm4hU2subWlzY2V2YWwuaXNUcnVlKGEpfSk7ZT17RXE6XCJvYiRlcVwiLE5vdEVxOlwib2IkbmVcIixHdDpcIm9iJGd0XCIsR3RFOlwib2IkZ2VcIixMdDpcIm9iJGx0XCIsTHRFOlwib2IkbGVcIn07ZD1lW2ZdO2lmKG4mJihsPWVbU2subWlzY2V2YWwuc3dhcHBlZE9wX1tmXV0sY1tsXSE9PWFbbF0mJihiPWNbbF0oYSkpIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpfHwoYj1hW2RdKGMpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfHwhbiYmKGw9ZVtTay5taXNjZXZhbC5zd2FwcGVkT3BfW2ZdXSxcbihiPWNbbF0oYSkpIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpKXJldHVybiBTay5taXNjZXZhbC5pc1RydWUoYik7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl7aWYobj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGNtcCkpdHJ5e2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG4sW2NdKTtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO2lmKFwiRXFcIj09PWYpcmV0dXJuIDA9PT1iO2lmKFwiTm90RXFcIj09PWYpcmV0dXJuIDAhPT1iO2lmKFwiTHRcIj09PWYpcmV0dXJuIDA+YjtpZihcIkd0XCI9PT1mKXJldHVybiAwPGI7aWYoXCJMdEVcIj09PWYpcmV0dXJuIDA+PWI7aWYoXCJHdEVcIj09PWYpcmV0dXJuIDA8PWJ9aWYoYiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50XCIpO1xufWNhdGNoKHUpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50XCIpO31pZihuPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYyxTay5idWlsdGluLnN0ci4kY21wKSl0cnl7Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkobixbYV0pO2lmKFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpe2I9U2suYnVpbHRpbi5hc251bSQoYik7aWYoXCJFcVwiPT09ZilyZXR1cm4gMD09PWI7aWYoXCJOb3RFcVwiPT09ZilyZXR1cm4gMCE9PWI7aWYoXCJMdFwiPT09ZilyZXR1cm4gMDxiO2lmKFwiR3RcIj09PWYpcmV0dXJuIDA+YjtpZihcIkx0RVwiPT09ZilyZXR1cm4gMDw9YjtpZihcIkd0RVwiPT09ZilyZXR1cm4gMD49Yn1pZihiIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGFyaXNvbiBkaWQgbm90IHJldHVybiBhbiBpbnRcIik7fWNhdGNoKHUpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50XCIpO1xufWlmKGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQmJmM9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpe2lmKFwiRXFcIj09PWYpcmV0dXJuIGEudj09PWMudjtpZihcIk5vdEVxXCI9PT1mKXJldHVybiBhLnYhPT1jLnY7aWYoXCJHdFwiPT09ZilyZXR1cm4gYS52PmMudjtpZihcIkd0RVwiPT09ZilyZXR1cm4gYS52Pj1jLnY7aWYoXCJMdFwiPT09ZilyZXR1cm4gYS52PGMudjtpZihcIkx0RVwiPT09ZilyZXR1cm4gYS52PD1jLnZ9fWlmKFwiRXFcIj09PWYpcmV0dXJuIGE9PT1jO2lmKFwiTm90RXFcIj09PWYpcmV0dXJuIGEhPT1jO2E9U2suYWJzdHIudHlwZU5hbWUoYSk7Yz1Tay5hYnN0ci50eXBlTmFtZShjKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2subWlzY2V2YWwub3BTeW1ib2xzW2ZdK1wiJyBub3Qgc3VwcG9ydGVkIGJldHdlZW4gaW5zdGFuY2VzIG9mICdcIithK1wiJyBhbmQgJ1wiK2MrXCInXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sXCIsU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKTtcblNrLm1pc2NldmFsLm9iamVjdFJlcHI9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YSxcInRyeWluZyB0byByZXByIHVuZGVmaW5lZFwiKTtpZihudWxsIT09YSYmYS4kcilyZXR1cm4gYS4kcigpLnY7dHJ5e3JldHVybihuZXcgU2suYnVpbHRpbi5zdHIoYSkpLnZ9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uVHlwZUVycm9yKXJldHVyblwiPHVua25vd24+XCI7dGhyb3cgZTt9fTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5vYmplY3RSZXByXCIsU2subWlzY2V2YWwub2JqZWN0UmVwcik7U2subWlzY2V2YWwub3BBbGxvd3NFcXVhbGl0eT1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSBcIkx0RVwiOmNhc2UgXCJFcVwiOmNhc2UgXCJHdEVcIjpyZXR1cm4hMH1yZXR1cm4hMX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwub3BBbGxvd3NFcXVhbGl0eVwiLFNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkpO1NrLm1pc2NldmFsLmlzVHJ1ZT1mdW5jdGlvbihhKXtyZXR1cm4hMD09PVxuYXx8YT09PVNrLmJ1aWx0aW4uYm9vbC50cnVlJD8hMDohMT09PWF8fGE9PT1Tay5idWlsdGluLmJvb2wuZmFsc2UkfHxudWxsPT09YXx8dm9pZCAwPT09YT8hMTphLm5iJGJvb2w/YS5uYiRib29sKCk6YS5zcSRsZW5ndGg/MCE9PWEuc3EkbGVuZ3RoKCk6ISFhfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5pc1RydWVcIixTay5taXNjZXZhbC5pc1RydWUpO1NrLm1pc2NldmFsLnNvZnRzcGFjZV89ITE7U2subWlzY2V2YWwucHJpbnRfPWZ1bmN0aW9uKGEpe1NrLm1pc2NldmFsLnNvZnRzcGFjZV8mJihcIlxcblwiIT09YSYmU2sub3V0cHV0KFwiIFwiKSxTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExKTt2YXIgYj1uZXcgU2suYnVpbHRpbi5zdHIoYSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcInN5c1wiLCExLCEwKSxmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHkoYS4kZC5zdGRvdXQud3JpdGUsdm9pZCAwLHZvaWQgMCx2b2lkIDAsW2EuJGQuc3Rkb3V0LFxuYl0pfSxmdW5jdGlvbigpe3ZhciBhOyhhPTA9PT1iLnYubGVuZ3RoKXx8KGE9Yi52W2Iudi5sZW5ndGgtMV0sYT0hKFwiXFxuXCI9PT1hfHxcIlxcdFwiPT09YXx8XCJcXHJcIj09PWEpKTtpZihhfHxcIiBcIj09PWIudltiLnYubGVuZ3RoLTFdKVNrLm1pc2NldmFsLnNvZnRzcGFjZV89ITB9KX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwucHJpbnRfXCIsU2subWlzY2V2YWwucHJpbnRfKTtTay5taXNjZXZhbC5sb2FkbmFtZT1mdW5jdGlvbihhLGMpe2M9Y1thXTtpZih2b2lkIDAhPT1jKXJldHVybiBjO2M9U2suYnVpbHRpbnNbYV07aWYodm9pZCAwIT09YylyZXR1cm4gYzt0aHJvdyBuZXcgU2suYnVpbHRpbi5OYW1lRXJyb3IoXCJuYW1lICdcIitTay51bmZpeFJlc2VydmVkKGEpK1wiJyBpcyBub3QgZGVmaW5lZFwiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmxvYWRuYW1lXCIsU2subWlzY2V2YWwubG9hZG5hbWUpO1NrLm1pc2NldmFsLmNhbGw9ZnVuY3Rpb24oYSxjLGYsbCxoKXtoPVxuQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDQpO3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLGMsZixsLGgpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsXCIsU2subWlzY2V2YWwuY2FsbCk7U2subWlzY2V2YWwuY2FsbEFzeW5jPWZ1bmN0aW9uKGEsYyxmLGwsaCxkKXtkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyw1KTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlBc3luYyhhLGMsZixsLGgsZCl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxBc3luY1wiLFNrLm1pc2NldmFsLmNhbGxBc3luYyk7U2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZD1mdW5jdGlvbihhLGMsZixsLGgpe2g9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDQpO3JldHVybiBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChhLGMsZixsLGgpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsT3JTdXNwZW5kXCIsXG5Tay5taXNjZXZhbC5jYWxsT3JTdXNwZW5kKTtTay5taXNjZXZhbC5jYWxsc2ltPWZ1bmN0aW9uKGEsYyl7Yz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5KGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAsYyl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1cIixTay5taXNjZXZhbC5jYWxsc2ltKTtTay5taXNjZXZhbC5jYWxsc2ltQXJyYXk9ZnVuY3Rpb24oYSxjLGYpe2M9Y3x8W107cmV0dXJuIFNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYSxjLGYpKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbHNpbUFycmF5XCIsU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KTtTay5taXNjZXZhbC5jYWxsc2ltQXN5bmM9ZnVuY3Rpb24oYSxjLGYpe2Y9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLFxuMik7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5QXN5bmMoYSxjLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGYpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltQXN5bmNcIixTay5taXNjZXZhbC5jYWxsc2ltQXN5bmMpO1NrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmQ9ZnVuY3Rpb24oYSxjKXtjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYSx2b2lkIDAsdm9pZCAwLHZvaWQgMCxjKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZFwiLFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmQpO1NrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheT1mdW5jdGlvbihhLGMsZil7Yz1jfHxbXTtyZXR1cm4gdm9pZCAwIT09YSYmYS50cCRjYWxsP2EudHAkY2FsbChjLGYpOlNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKGEsdm9pZCAwLHZvaWQgMCxmLFxuYyl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheVwiLFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSk7U2subWlzY2V2YWwuYXBwbHk9ZnVuY3Rpb24oYSxjLGYsbCxoKXthPVNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKGEsYyxmLGwsaCk7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uP1NrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhhKTphfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hcHBseVwiLFNrLm1pc2NldmFsLmFwcGx5KTtTay5taXNjZXZhbC5hc3luY1RvUHJvbWlzZT1mdW5jdGlvbihhLGMpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihiLGUpe3RyeXsoZnVuY3Rpb24gZyhhKXt0cnl7Zm9yKHZhciBkPWZ1bmN0aW9uKCl7dHJ5e2coYS5yZXN1bWUoKSl9Y2F0Y2godCl7ZSh0KX19LGY9ZnVuY3Rpb24oYil7dHJ5e2EuZGF0YS5yZXN1bHQ9YixcbmQoKX1jYXRjaCh2KXtlKHYpfX0scD1mdW5jdGlvbihiKXt0cnl7YS5kYXRhLmVycm9yPWIsZCgpfWNhdGNoKHYpe2Uodil9fTthIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbjspe3ZhciBsPWMmJihjW2EuZGF0YS50eXBlXXx8Y1tcIipcIl0pO2lmKGwpe3ZhciBBPWwoYSk7aWYoQSl7QS50aGVuKGcsZSk7cmV0dXJufX1pZihcIlNrLnByb21pc2VcIj09YS5kYXRhLnR5cGUpe2EuZGF0YS5wcm9taXNlLnRoZW4oZixwKTtyZXR1cm59aWYoXCJTay55aWVsZFwiPT1hLmRhdGEudHlwZSl7U2suZ2xvYmFsLnNldEltbWVkaWF0ZShkKTtyZXR1cm59aWYoXCJTay5kZWxheVwiPT1hLmRhdGEudHlwZSl7U2suZ2xvYmFsLnNldEltbWVkaWF0ZShkKTtyZXR1cm59aWYoYS5vcHRpb25hbClhPWEucmVzdW1lKCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5TdXNwZW5zaW9uRXJyb3IoXCJVbmhhbmRsZWQgbm9uLW9wdGlvbmFsIHN1c3BlbnNpb24gb2YgdHlwZSAnXCIrYS5kYXRhLnR5cGUrXCInXCIpO1xufWIoYSl9Y2F0Y2godCl7ZSh0KX19KShhKCkpfWNhdGNoKGgpe2UoaCl9fSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlXCIsU2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2UpO1NrLm1pc2NldmFsLmFwcGx5QXN5bmM9ZnVuY3Rpb24oYSxjLGYsbCxoLGQpe3JldHVybiBTay5taXNjZXZhbC5hc3luY1RvUHJvbWlzZShmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChjLGYsbCxoLGQpfSxhKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlBc3luY1wiLFNrLm1pc2NldmFsLmFwcGx5QXN5bmMpO1NrLm1pc2NldmFsLmNoYWluPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBiPTEsZT1hLGgsZDs7KXtpZihiPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBlO2lmKGUmJmUuJGlzU3VzcGVuc2lvbilicmVhaztlPWFyZ3VtZW50c1tiXShlKTtiKyt9ZD1BcnJheShhcmd1bWVudHMubGVuZ3RoLWIpO2ZvcihoPTA7aDxhcmd1bWVudHMubGVuZ3RoLVxuYjtoKyspZFtoXT1hcmd1bWVudHNbYitoXTtoPTA7cmV0dXJuIGZ1bmN0aW9uIGsoYSl7Zm9yKDtoPGQubGVuZ3RoOyl7aWYoYSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKGssYSk7YT1kW2hdKGEpO2grK31yZXR1cm4gYX0oZSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNoYWluXCIsU2subWlzY2V2YWwuY2hhaW4pO1NrLm1pc2NldmFsLnRyeUNhdGNoPWZ1bmN0aW9uKGEsYyl7dHJ5e3ZhciBiPWEoKX1jYXRjaChsKXtyZXR1cm4gYyhsKX1yZXR1cm4gYiBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24/KGE9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb24odm9pZCAwLGIpLGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLm1pc2NldmFsLnRyeUNhdGNoKGIucmVzdW1lLGMpfSxhKTpifTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC50cnlDYXRjaFwiLFNrLm1pc2NldmFsLnRyeUNhdGNoKTtcblNrLm1pc2NldmFsLml0ZXJGb3I9ZnVuY3Rpb24oYSxjLGYpe3ZhciBiPWYsZT1mdW5jdGlvbihjKXtiPWM7cmV0dXJuIGMgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5CcmVhaz9jOmEudHAkaXRlcm5leHQoITApfTtyZXR1cm4gZnVuY3Rpb24gbihhKXtmb3IoO3ZvaWQgMCE9PWE7KXtpZihhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbilyZXR1cm4gbmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb24obixhKTtpZihhPT09U2subWlzY2V2YWwuQnJlYWt8fGEgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5CcmVhaylyZXR1cm4gYS5iclZhbHVlO2E9U2subWlzY2V2YWwuY2hhaW4oYyhhLGIpLGUpfXJldHVybiBifShhLnRwJGl0ZXJuZXh0KCEwKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLml0ZXJGb3JcIixTay5taXNjZXZhbC5pdGVyRm9yKTtTay5taXNjZXZhbC5pdGVyQXJyYXk9ZnVuY3Rpb24oYSxjLGYpe1NrLmFzc2VydHMuYXNzZXJ0KEFycmF5LmlzQXJyYXkoYSksXG5cIml0ZXJBcmdzIHJlcXVpcmVzIGFuIGFycmF5XCIpO2xldCBiPTA7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3Ioe3RwJGl0ZXJuZXh0OigpPT5hW2IrK119LGMsZil9O1NrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlPWZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwPT09YSlyZXR1cm5bXTtpZih2b2lkIDA9PT1hLmhwJHR5cGUmJnZvaWQgMCE9PWEuc2skYXNhcnJheSlyZXR1cm4gYS5zayRhc2FycmF5KCk7Y29uc3QgYj1bXTthPVNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57Yi5wdXNoKGEpfSksKCk9PmIpO3JldHVybiBjP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpfTtTay5taXNjZXZhbC5CcmVhaz1mdW5jdGlvbihhKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5CcmVhaykpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhhKTt0aGlzLmJyVmFsdWU9YX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuQnJlYWtcIixcblNrLm1pc2NldmFsLkJyZWFrKTtTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZD1mdW5jdGlvbihhLGMsZixsLGgpe3ZhciBiO2lmKG51bGw9PWF8fGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBhJiZ2b2lkIDA9PT1hLnRwJGNhbGwmJihhPW5ldyBTay5idWlsdGluLmZ1bmMoYSkpO3ZhciBlPWEudHAkY2FsbDtpZih2b2lkIDAhPT1lKXtpZihmKWZvcihmPWYudHAkaXRlcigpLGI9Zi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1mLnRwJGl0ZXJuZXh0KCkpaC5wdXNoKGIpO2lmKGMpZm9yKGY9U2suYWJzdHIuaXRlcihjKSxiPWYudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9Zi50cCRpdGVybmV4dCgpKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJGdW5jdGlvbiBrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3NcIik7XG5sLnB1c2goYi52KTtsLnB1c2goU2suYWJzdHIub2JqZWN0R2V0SXRlbShjLGIsITEpKX1yZXR1cm4gZS5jYWxsKGEsaCxsLGMpfWU9YS5fX2NhbGxfXztpZih2b2lkIDAhPT1lKXJldHVybiBoLnVuc2hpZnQoYSksU2subWlzY2V2YWwuYXBwbHkoZSxjLGYsbCxoKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBpcyBub3QgY2FsbGFibGVcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZFwiLFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKTtTay5taXNjZXZhbC5wcm9taXNlVG9TdXNwZW5zaW9uPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO2IucmVzdW1lPWZ1bmN0aW9uKCl7aWYoYi5kYXRhLmVycm9yKXRocm93IGIuZGF0YS5lcnJvcjtyZXR1cm4gYi5kYXRhLnJlc3VsdH07Yi5kYXRhPXt0eXBlOlwiU2sucHJvbWlzZVwiLHByb21pc2U6YX07cmV0dXJuIGJ9O1xuU2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwucHJvbWlzZVRvU3VzcGVuc2lvblwiLFNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb24pO1NrLm1pc2NldmFsLmJ1aWxkQ2xhc3M9ZnVuY3Rpb24oYSxjLGYsbCxoKXt2YXIgYj1Tay5idWlsdGluLnR5cGUsZT17fTtjKGEsZSx2b2lkIDA9PT1oP3t9OmgpO2EuX19uYW1lX18mJihlLl9fbW9kdWxlX189YS5fX25hbWVfXyk7YT1uZXcgU2suYnVpbHRpbi5zdHIoZik7bD1uZXcgU2suYnVpbHRpbi50dXBsZShsKTtjPVtdO2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJihjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKG4pKSxjLnB1c2goZVtuXSkpO2M9bmV3IFNrLmJ1aWx0aW4uZGljdChjKTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW2EsbCxjXSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmJ1aWxkQ2xhc3NcIixTay5taXNjZXZhbC5idWlsZENsYXNzKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmNhbGxhYmxlX2l0ZXJfPVxuU2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiY2FsbGFibGVfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXtpZighU2suYnVpbHRpbi5jaGVja0NhbGxhYmxlKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIml0ZXIodiwgdyk6IHYgbXVzdCBiZSBjYWxsYWJsZVwiKTt0aGlzLiRjYWxsYWJsZT1hO3RoaXMuJHNlbnRpbmVsPWM7dGhpcy4kZmxhZz0hMX0saXRlcm5leHQoYSl7aWYoITAhPT10aGlzLiRmbGFnKXtpZihhKXJldHVybiBhPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLiRjYWxsYWJsZSxbXSksU2subWlzY2V2YWwuY2hhaW4oYSxhPT57aWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsdGhpcy4kc2VudGluZWwsXCJFcVwiLCEwKSl0aGlzLiRmbGFnPSEwO2Vsc2UgcmV0dXJuIGF9KTthPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLiRjYWxsYWJsZSxbXSk7aWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsXG50aGlzLiRzZW50aW5lbCxcIkVxXCIsITEpKXRoaXMuJGZsYWc9ITA7ZWxzZSByZXR1cm4gYX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suYnVpbHRpbi5zZXFfaXRlcl89U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YX0saXRlcm5leHQoYSl7bGV0IGM7Yz1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+dGhpcy4kc2VxLm1wJHN1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJGluZGV4KyspLGEpLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkluZGV4RXJyb3J8fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLlN0b3BJdGVyYXRpb24pKXRocm93IGE7fSk7cmV0dXJuIGE/YzpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzp7JGZsYWdzOntOb0FyZ3M6ITB9LFxuJG1ldGgoKXtpZih0aGlzLiRzZXEuc3EkbGVuZ3RoKXJldHVybiB0aGlzLiRzZXEuc3EkbGVuZ3RoKCktdGhpcy4kaW5kZXg7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImxlbiBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMuJHNlcSkpO319fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2FsbGFibGVfaXRlcl9cIixTay5idWlsdGluLmNhbGxhYmxlX2l0ZXJfKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmxpc3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImxpc3RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5saXN0LFwiYmFkIGNhbGwgdG8gbGlzdCwgdXNlICduZXcnIHdpdGggYW4gQXJyYXkgb2YgcHl0aG9uIG9iamVjdHNcIik7XG50aGlzLnY9YTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJGRvYzpcIkJ1aWx0LWluIG11dGFibGUgc2VxdWVuY2UuXFxuXFxuSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbmV3IGVtcHR5IGxpc3QuXFxuVGhlIGFyZ3VtZW50IG11c3QgYmUgYW4gaXRlcmFibGUgaWYgc3BlY2lmaWVkLlwiLHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcImxpc3RcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJsaXN0XCIsYSwwLDEpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhWzBdLCEwKSxhPT57dGhpcy52PWF9KX0sJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIlsuLi5dXCIpO1xudGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy52Lm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTt0aGlzLmluJHJlcHI9ITE7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIltcIithLmpvaW4oXCIsIFwiKStcIl1cIil9LHRwJHJpY2hjb21wYXJlOlNrLmdlbmVyaWMuc2VxQ29tcGFyZSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBhKHRoaXMpfSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy52Lmxlbmd0aH0sc3EkY29uY2F0KGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgY29uY2F0ZW5hdGUgbGlzdCB0byBsaXN0XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMudi5jb25jYXQoYS52KSl9LHNxJGNvbnRhaW5zKGEpe2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKWlmKGM9PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxcbmEsXCJFcVwiKSlyZXR1cm4hMDtyZXR1cm4hMX0sc3EkcmVwZWF0KGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZihhKnRoaXMudi5sZW5ndGg+TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcjtjb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YTtjKyspZm9yKGxldCBhPTA7YTx0aGlzLnYubGVuZ3RoO2ErKyliLnB1c2godGhpcy52W2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpcmV0dXJuIGE9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKSxcbmE9dGhpcy5saXN0JGluUmFuZ2UoYSxcImxpc3QgaW5kZXggb3V0IG9mIHJhbmdlXCIpLHRoaXMudlthXTtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7Y29uc3QgYj1bXTthLnNzc2l0ZXIkKHRoaXMudi5sZW5ndGgsYT0+e2IucHVzaCh0aGlzLnZbYV0pfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sbXAkYXNzX3N1YnNjcmlwdChhLGMpe3ZvaWQgMD09PWM/dGhpcy5kZWwkc3Vic2NyaXB0KGEpOnRoaXMuYXNzJHN1YnNjcmlwdChhLGMpfSxzcSRpbnBsYWNlX2NvbmNhdChhKXtyZXR1cm4gYT09PXRoaXM/KHRoaXMudi5wdXNoKC4uLnRoaXMudiksdGhpcyk6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9Pnt0aGlzLnYucHVzaChhKX0pLFxuKCk9PnRoaXMpfSxzcSRpbnBsYWNlX3JlcGVhdChhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Y29uc3QgYj10aGlzLnYubGVuZ3RoO2lmKDA+PWEpdGhpcy52Lmxlbmd0aD0wO2Vsc2UgaWYoYSpiPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7Zm9yKGxldCBjPTE7YzxhO2MrKylmb3IobGV0IGE9MDthPGI7YSsrKXRoaXMudi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIHRoaXN9fSxtZXRob2RzOntfX3JldmVyc2VkX186eyRtZXRoKCl7cmV0dXJuIG5ldyBjKHRoaXMpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsXG4kZG9jOlwiUmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBsaXN0LlwifSxjbGVhcjp7JG1ldGgoKXt0aGlzLnYubGVuZ3RoPTA7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZW1vdmUgYWxsIGl0ZW1zIGZyb20gbGlzdC5cIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYuc2xpY2UoMCkpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGUgbGlzdC5cIn0sYXBwZW5kOnskbWV0aChhKXt0aGlzLnYucHVzaChhKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIG9iamVjdCwgLylcIiwkZG9jOlwiQXBwZW5kIG9iamVjdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlwifSxpbnNlcnQ6eyRtZXRoKGEsXG5jKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7KHtzdGFydDphfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGEpKTt0aGlzLnYuc3BsaWNlKGEsMCxjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCBpbmRleCwgb2JqZWN0LCAvKVwiLCRkb2M6XCJJbnNlcnQgb2JqZWN0IGJlZm9yZSBpbmRleC5cIn0sZXh0ZW5kOnskbWV0aChhKXtyZXR1cm4gYT09PXRoaXM/KHRoaXMudi5wdXNoKC4uLnRoaXMudiksU2suYnVpbHRpbi5ub25lLm5vbmUkKTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMudi5wdXNoKGEpfSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgaXRlcmFibGUsIC8pXCIsJGRvYzpcIkV4dGVuZCBsaXN0IGJ5IGFwcGVuZGluZyBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYWJsZS5cIn0sXG5wb3A6eyRtZXRoKGEpe2E9dm9pZCAwPT09YT90aGlzLnYubGVuZ3RoLTE6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTthPXRoaXMubGlzdCRpblJhbmdlKGEsXCJwb3AgaW5kZXggb3V0IG9mIHJhbmdlXCIpO2NvbnN0IGI9dGhpcy52W2FdO3RoaXMudi5zcGxpY2UoYSwxKTtyZXR1cm4gYn0sJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5kZXg9LTEsIC8pXCIsJGRvYzpcIlJlbW92ZSBhbmQgcmV0dXJuIGl0ZW0gYXQgaW5kZXggKGRlZmF1bHQgbGFzdCkuXFxuXFxuUmFpc2VzIEluZGV4RXJyb3IgaWYgbGlzdCBpcyBlbXB0eSBvciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXCJ9LHJlbW92ZTp7JG1ldGgoYSl7YT10aGlzLmxpc3QkaW5kZXhPZihhKTtpZigtMT09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImxpc3QucmVtb3ZlKHgpOiB4IG5vdCBpbiBsaXN0XCIpO3RoaXMudi5zcGxpY2UoYSxcbjEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGRvYzpcIlJlbW92ZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHZhbHVlLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cIn0sc29ydDp7JG1ldGgoYSxjKXtpZihhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzb3J0KCkgdGFrZXMgbm8gcG9zaXRpb25hbCBhcmd1bWVudHNcIik7Y29uc3QgW2IsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJzb3J0XCIsW1wia2V5XCIsXCJyZXZlcnNlXCJdLGEsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSRdKTtyZXR1cm4gdGhpcy5saXN0JHNvcnQodm9pZCAwLGIsZSl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqLCBrZXk9Tm9uZSwgcmV2ZXJzZT1GYWxzZSlcIixcbiRkb2M6XCJTdGFibGUgc29ydCAqSU4gUExBQ0UqLlwifSxpbmRleDp7JG1ldGgoYSxjLGYpe2lmKHZvaWQgMCE9PWMmJiFTay5taXNjZXZhbC5pc0luZGV4KGMpfHx2b2lkIDAhPT1mJiYhU2subWlzY2V2YWwuaXNJbmRleChmKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpO2M9dGhpcy5saXN0JGluZGV4T2YoYSxjLGYpO2lmKC0xPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXCIgaXMgbm90IGluIGxpc3RcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBzdGFydD0wLCBzdG9wPXN5cy5tYXhzaXplLCAvKVwiLCRkb2M6XCJSZXR1cm4gZmlyc3QgaW5kZXggb2YgdmFsdWUuXFxuXFxuUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifSxcbmNvdW50OnskbWV0aChhKXtsZXQgYj0wO2NvbnN0IGM9dGhpcy52Lmxlbmd0aDtmb3IobGV0IGU9MDtlPGM7ZSsrKWlmKHRoaXMudltlXT09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCh0aGlzLnZbZV0sYSxcIkVxXCIpKWIrPTE7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGRvYzpcIlJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWUuXCJ9LHJldmVyc2U6eyRtZXRoKCl7dGhpcy5saXN0JHJldmVyc2UoKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldmVyc2UgKklOIFBMQUNFKi5cIn19LHByb3RvOntzayRhc2FycmF5KCl7cmV0dXJuIHRoaXMudi5zbGljZSgwKX0sbGlzdCRzb3J0OmZ1bmN0aW9uKGEsYyxmKXtjb25zdCBiPW51bGwhPWMmJmMhPT1Tay5idWlsdGluLm5vbmUubm9uZSQ7XG52YXIgZT1udWxsIT1hJiZhIT09U2suYnVpbHRpbi5ub25lLm5vbmUkO2xldCBkO2lmKHZvaWQgMD09PWYpZD0hMTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tJbnQoZikpZD1Tay5taXNjZXZhbC5pc1RydWUoZik7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkXCIpO2Y9bmV3IFNrLmJ1aWx0aW4udGltU29ydCh0aGlzKTt0aGlzLnY9W107Y29uc3QgZz1uZXcgU2suYnVpbHRpbi5pbnRfKDApO2lmKGIpe2YubHQ9ZT9mdW5jdGlvbihiLGMpe2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW2JbMF0sY1swXV0pO3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYixnLFwiTHRcIil9OmZ1bmN0aW9uKGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhWzBdLGJbMF0sXCJMdFwiKX07Zm9yKGxldCBhPTA7YTxmLmxpc3RsZW5ndGg7YSsrKXtlPWYubGlzdC52W2FdO2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGMsXG5bZV0pO2YubGlzdC52W2FdPVtiLGVdfX1lbHNlIGUmJihmLmx0PWZ1bmN0aW9uKGIsYyl7Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYixjXSk7cmV0dXJuIFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLGcsXCJMdFwiKX0pO2QmJmYubGlzdC5saXN0JHJldmVyc2UoKTtmLnNvcnQoKTtkJiZmLmxpc3QubGlzdCRyZXZlcnNlKCk7aWYoYilmb3IoYz0wO2M8Zi5saXN0bGVuZ3RoO2MrKyllPWYubGlzdC52W2NdWzFdLGYubGlzdC52W2NdPWU7Yz0wPHRoaXMuc3EkbGVuZ3RoKCk7dGhpcy52PWYubGlzdC52O2lmKGMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImxpc3QgbW9kaWZpZWQgZHVyaW5nIHNvcnRcIik7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sbGlzdCRpblJhbmdlKGEsYyl7MD5hJiYoYSs9dGhpcy52Lmxlbmd0aCk7aWYoMDw9YSYmYTx0aGlzLnYubGVuZ3RoKXJldHVybiBhO3Rocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoYyk7XG59LGxpc3QkaW5kZXhPZihhLGMsZil7Zm9yKHtzdGFydDpjLGVuZDpmfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGMsZik7YzxmJiZjPHRoaXMudi5sZW5ndGg7YysrKWlmKHRoaXMudltjXT09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCh0aGlzLnZbY10sYSxcIkVxXCIpKXJldHVybiBjO3JldHVybi0xfSxsaXN0JHJldmVyc2UoKXt0aGlzLnYucmV2ZXJzZSgpfSxhc3Mkc3Vic2NyaXB0KGEsYyl7aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl0aGlzLmFzcyRpbmRleChhLGMpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IHtzdGFydDpiLHN0b3A6ZSxzdGVwOmh9PWEuc2xpY2UkaW5kaWNlcyh0aGlzLnYubGVuZ3RoKTsxPT09aD90aGlzLmFzcyRzbGljZShiLGUsYyk6dGhpcy5hc3MkZXh0X3NsaWNlKGEsYyl9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpKTt9LGFzcyRpbmRleChhLGMpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKTthPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3RoaXMudlthXT1jfSxhc3Mkc2xpY2UoYSxjLGYpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgYXNzaWduIGFuIGl0ZXJhYmxlXCIpO2Y9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoZik7dGhpcy52LnNwbGljZShhLGMtYSwuLi5mKX0sYXNzJGV4dF9zbGljZShhLGMpe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2goYSl9KTtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm11c3QgYXNzaWduIGl0ZXJhYmxlIHRvIGV4dGVuZGVkIHNsaWNlXCIpO1xuYT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShjKTtpZihiLmxlbmd0aCE9PWEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJhdHRlbXB0IHRvIGFzc2lnbiBzZXF1ZW5jZSBvZiBzaXplIFwiK2EubGVuZ3RoK1wiIHRvIGV4dGVuZGVkIHNsaWNlIG9mIHNpemUgXCIrYi5sZW5ndGgpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy52LnNwbGljZShiW2NdLDEsYVtjXSl9LGRlbCRzdWJzY3JpcHQoYSl7aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl0aGlzLmRlbCRpbmRleChhKTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNsaWNlKXtjb25zdCB7c3RhcnQ6YixzdG9wOmMsc3RlcDpsfT1hLnNsaWNlJGluZGljZXModGhpcy52Lmxlbmd0aCk7MT09PWw/dGhpcy5kZWwkc2xpY2UoYixjKTp0aGlzLmRlbCRleHRfc2xpY2UoYSwwPGw/MTowKX1lbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKSk7fSxkZWwkaW5kZXgoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLkluZGV4RXJyb3IpO2E9dGhpcy5saXN0JGluUmFuZ2UoYSxcImxpc3QgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2VcIik7dGhpcy52LnNwbGljZShhLDEpfSxkZWwkc2xpY2UoYSxjKXt0aGlzLnYuc3BsaWNlKGEsYy1hKX0sZGVsJGV4dF9zbGljZShhLGMpe2xldCBiPTA7YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9Pnt0aGlzLnYuc3BsaWNlKGEtYiwxKTtiKz1jfSl9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ubGlzdFwiLFNrLmJ1aWx0aW4ubGlzdCk7U2suYnVpbHRpbi5saXN0LnB5MiRtZXRob2RzPXtzb3J0OnskbmFtZTpcInNvcnRcIiwkbWV0aChhLGMpe2NvbnN0IFtiLGUsaF09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJzb3J0XCIsW1wiY21wXCIsXCJrZXlcIixcInJldmVyc2VcIl0sYSxjLFtTay5idWlsdGluLm5vbmUubm9uZSQsXG5Tay5idWlsdGluLm5vbmUubm9uZSQsU2suYnVpbHRpbi5ib29sLmZhbHNlJF0pO3JldHVybiB0aGlzLmxpc3Qkc29ydChiLGUsaCl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBjbXA9Tm9uZSwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpXCIsJGRvYzpcIlN0YWJsZSBzb3J0ICpJTiBQTEFDRSouXCJ9fTt2YXIgYT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJsaXN0X2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEudn0saXRlcm5leHQ6U2suZ2VuZXJpYy5pdGVyTmV4dFdpdGhBcnJheSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KSxjPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImxpc3RfcmV2ZXJzZWl0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PVxuYS52Lmxlbmd0aC0xO3RoaXMuJHNlcT1hLnZ9LGl0ZXJuZXh0KCl7Y29uc3QgYT10aGlzLiRzZXFbdGhpcy4kaW5kZXgtLV07aWYodm9pZCAwPT09YSl0aGlzLnRwJGl0ZXJuZXh0PSgpPT57fTtlbHNlIHJldHVybiBhfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyUmV2ZXJzZUxlbmd0aEhpbnRNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9LGZ1bmN0aW9uKG0scSxhKXtmdW5jdGlvbiBjKGEpe3ZhciBiPWEucmVwbGFjZShGLFwiXCIpLnJlcGxhY2UoTSxcIl9cIikudG9Mb3dlckNhc2UoKTtiPUVbYl07cmV0dXJuIHZvaWQgMD09PWI/YTpifWZ1bmN0aW9uIGIoYSxiLGMpe2lmKHZvaWQgMD09PWIpYj1cInV0Zi04XCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKWI9Yi4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgYXJndW1lbnQgXCIrKFwiYnl0ZXNzdHJcIi5pbmNsdWRlcyhhKT9cbjI6MSkrXCIgbXVzdCBiZSBzdHIgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpKTtpZih2b2lkIDA9PT1jKWM9XCJzdHJpY3RcIjtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpYz1jLiRqc3N0cigpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBhcmd1bWVudCBcIisoXCJieXRlc3N0clwiLmluY2x1ZGVzKGEpPzM6MikrXCIgbXVzdCBiZSBzdHIgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTtyZXR1cm57ZW5jb2Rpbmc6YixlcnJvcnM6Y319ZnVuY3Rpb24gZShhLGIsZCl7YT1hLiRqc3N0cigpO2I9YyhiKTtpZihcInN0cmljdFwiIT09ZCYmXCJpZ25vcmVcIiE9PWQmJlwicmVwbGFjZVwiIT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiJ1wiK2QrXCInIGVycm9yIGhhbmRsaW5nIG5vdCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcIik7aWYoXCJhc2NpaVwiPT09Yil7Yj1bXTtmb3IoZSBpbiBhKXtjb25zdCBjPWEuY2hhckNvZGVBdChlKTtcbmlmKDEyNzxjKXtpZihcInN0cmljdFwiPT09ZCl0aHJvdyBkPWYoYyksbmV3IFNrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yKFwiJ2FzY2lpJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVyICdcIitkK1wiJyBpbiBwb3NpdGlvbiBcIitlK1wiOiBvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpXCIpO1wicmVwbGFjZVwiPT09ZCYmYi5wdXNoKDYzKX1lbHNlIGIucHVzaChjKX12YXIgZT1uZXcgVWludDhBcnJheShiKX1lbHNlIGlmKFwidXRmLThcIj09PWIpZT1WLmVuY29kZShhKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLkxvb2t1cEVycm9yKFwidW5rbm93biBlbmNvZGluZzogXCIrYik7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGUpfWZ1bmN0aW9uIGYoYSl7dmFyIGI9MjY1Pj1hP1wiXFxcXHhcIjpcIlxcXFx1XCI7YT1hLnRvU3RyaW5nKDE2KTszPT09YS5sZW5ndGgmJihhPWEuc2xpY2UoMSwzKSk7cmV0dXJuIGE9MT09PWEubGVuZ3RoP2IrXCIwXCIrYTpiK2F9ZnVuY3Rpb24gbChhLGQpeyh7ZW5jb2Rpbmc6YSxcbmVycm9yczpkfT1iKFwiZGVjb2RlXCIsYSxkKSk7YT1jKGEpO2lmKFwic3RyaWN0XCIhPT1kJiZcImlnbm9yZVwiIT09ZCYmXCJyZXBsYWNlXCIhPT1kKXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCInXCIrZCtcIicgZXJyb3IgaGFuZGxpbmcgbm90IGltcGxlbWVudGVkIGluIFNrdWxwdFwiKTtpZihcImFzY2lpXCI9PT1hKXthPXRoaXMudjt2YXIgZT1cIlwiO2ZvcihsZXQgYj0wO2I8YS5sZW5ndGg7YisrKXtjb25zdCBjPWFbYl07aWYoMTI3PGMpe2lmKFwic3RyaWN0XCI9PT1kKXRocm93IG5ldyBTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcihcIidhc2NpaScgY29kZWMgY2FuJ3QgZGVjb2RlIGJ5dGUgMHhcIitjLnRvU3RyaW5nKDE2KStcIiBpbiBwb3NpdGlvbiBcIitiK1wiOiBvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpXCIpO1wicmVwbGFjZVwiPT09ZCYmKGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoNjU1MzMpKX1lbHNlIGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoYyl9YT1lfWVsc2UgaWYoXCJ1dGYtOFwiPT09XG5hKWE6aWYoYT10aGlzLnYsZT1kLGQ9eS5kZWNvZGUoYSksXCJyZXBsYWNlXCI9PT1lKWE9ZDtlbHNle2lmKFwic3RyaWN0XCI9PT1lKXtlPWQuaW5kZXhPZihcIlxcdWZmZmRcIik7aWYoLTE9PT1lKXthPWQ7YnJlYWsgYX10aHJvdyBuZXcgU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IoXCIndXRmLTgnIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4XCIrYVtlXS50b1N0cmluZygxNikrXCIgaW4gcG9zaXRpb24gXCIrZStcIjogaW52YWxpZCBzdGFydCBieXRlXCIpO31hPWQucmVwbGFjZSgvXFx1ZmZmZC9nLFwiXCIpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTG9va3VwRXJyb3IoXCJ1bmtub3duIGVuY29kaW5nOiBcIithKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyxkLGUpe2lmKCEoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXN8fGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcblwiIGZpcnN0IGFyZyBtdXN0IGJlIGJ5dGVzIG9yIGEgdHVwbGUgb2YgYnl0ZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShjKSk7KHtzdGFydDpkLGVuZDplfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGQsZSkpO2lmKGU8ZClyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtkPXRoaXMudi5zdWJhcnJheShkLGUpO2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKXtmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxlPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1lO2U9YS50cCRpdGVybmV4dCgpKWlmKGU9dGhpcy5nZXQkcmF3KGUpLGIoZCxlKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO3JldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkfXJldHVybiBiKGQsYy52KT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gZChhKXtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpO1xuKHtzdGFydDpjLGVuZDpkfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGMsZCkpO3JldHVybiBkPGM/LTE6XCJudW1iZXJcIj09PXR5cGVvZiBiPyhiPWE/dGhpcy52Lmxhc3RJbmRleE9mKGIsZC0xKTp0aGlzLnYuaW5kZXhPZihiLGMpLGI+PWMmJmI8ZD9iOi0xKTphP3RoaXMuZmluZCRzdWJyaWdodChiLGMsZCk6dGhpcy5maW5kJHN1YmxlZnQoYixjLGQpfX1mdW5jdGlvbiBnKGEpe3JldHVybiBmdW5jdGlvbihiKXtiPXRoaXMuZ2V0JHJhdyhiKTtsZXQgYztpZihhKXtpZihjPXRoaXMuZmluZCRzdWJyaWdodChiLDAsdGhpcy52Lmxlbmd0aCksMD5jKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uYnl0ZXMsbmV3IFNrLmJ1aWx0aW4uYnl0ZXMsdGhpc10pfWVsc2UgaWYoYz10aGlzLmZpbmQkc3VibGVmdChiLDAsdGhpcy52Lmxlbmd0aCksMD5jKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbdGhpcyxuZXcgU2suYnVpbHRpbi5ieXRlcyxcbm5ldyBTay5idWlsdGluLmJ5dGVzXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxjKSksbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYiksbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGMrYi5sZW5ndGgpKV0pfX1mdW5jdGlvbiBuKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe3ZhciBkPXZvaWQgMD09PWN8fGM9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bmV3IFVpbnQ4QXJyYXkoWzksMTAsMTEsMTIsMTMsMzIsMTMzXSk6dGhpcy5nZXQkcmF3KGMpO2M9MDt2YXIgZT10aGlzLnYubGVuZ3RoO2lmKGEpZm9yKDtjPGUmJmQuaW5jbHVkZXModGhpcy52W2NdKTspYysrO2lmKGIpZm9yKDtlPmMmJmQuaW5jbHVkZXModGhpcy52W2UtMV0pOyllLS07ZD1uZXcgVWludDhBcnJheShlLWMpO2ZvcihlPTA7ZTxkLmxlbmd0aDtlKyspZFtlXT10aGlzLnZbZStjXTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoZCl9fVxuZnVuY3Rpb24gayhhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQsZSl7aWYodm9pZCAwPT09ZSllPTMyO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMmJjE9PWUudi5sZW5ndGgpZT1lLnZbMF07ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGFyZ3VtZW50IDIgbXVzdCBiZSBhIGJ5dGUgc3RyaW5nIG9mIGxlbmd0aCAxLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoZSkpO2NvbnN0IGY9dGhpcy52Lmxlbmd0aDtkPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChkLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoZDw9ZilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtjb25zdCBnPW5ldyBVaW50OEFycmF5KGQpO2xldCBrLGg7Yz8oaz1NYXRoLmZsb29yKChkLWYpLzIpLGg9KGQtZiklMj9rKzE6ayk6Yj8oaz1kLWYsaD0wKTooaz0wLGg9ZC1mKTtnLmZpbGwoZSwwLGspO2ZvcihsZXQgYT0wO2E8ZjthKyspZ1thK2tdPXRoaXMudlthXTtcbmcuZmlsbChlLGQtaCk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGcpfX1mdW5jdGlvbiBwKGEpe3JldHVybiA5PD1hJiYxMz49YXx8MzI9PT1hfWZ1bmN0aW9uIHUoYSl7cmV0dXJuIDk3PD1hJiYxMjI+PWF9ZnVuY3Rpb24gQShhKXtyZXR1cm4gNjU8PWEmJjkwPj1hfWZ1bmN0aW9uIHQoYSl7cmV0dXJuIDQ4PD1hJiY1Nz49YX1mdW5jdGlvbiB2KGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnYubGVuZ3RoP2I/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6dGhpcy52LmV2ZXJ5KGI9PmEoYikpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfX1mdW5jdGlvbiBCKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7bGV0IGM9ITE7Zm9yKGxldCBkPTA7ZDx0aGlzLnYubGVuZ3RoO2QrKyl7aWYoYih0aGlzLnZbZF0pKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkOyFjJiZhKHRoaXMudltkXSkmJlxuKGM9ITApfXJldHVybiBjP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfX1mdW5jdGlvbiBEKGEpe3JldHVybiBmdW5jdGlvbigpe2NvbnN0IGI9bmV3IFVpbnQ4QXJyYXkodGhpcy52Lmxlbmd0aCk7Zm9yKGxldCBjPTA7Yzx0aGlzLnYubGVuZ3RoO2MrKyliW2NdPWEodGhpcy52W2NdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYil9fWEoMzApO2NvbnN0IEU9e3V0ZjpcInV0Zi04XCIsdXRmODpcInV0Zi04XCIsdXRmXzg6XCJ1dGYtOFwiLGFzY2lpOlwiYXNjaWlcIn07dmFyIEY9L1xccysvZyxNPS9bXy1dKy9nO2NvbnN0IFY9bmV3IFRleHRFbmNvZGVyLHk9bmV3IFRleHREZWNvZGVyO1NrLmJ1aWx0aW4uYnl0ZXM9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImJ5dGVzXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJieXRlcyBpcyBhIGNvbnN0cnVjdG9yIHVzZSAnbmV3J1wiKTtcbmlmKHZvaWQgMD09PWEpdGhpcy52PW5ldyBVaW50OEFycmF5O2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpdGhpcy52PWE7ZWxzZSBpZihBcnJheS5pc0FycmF5KGEpKVNrLmFzc2VydHMuYXNzZXJ0KGEuZXZlcnkoYT0+MDw9YSYmMjU1Pj1hKSxcImJhZCBpbnRlcm5hbCBjYWxsIHRvIGJ5dGVzIHdpdGggYXJyYXlcIiksdGhpcy52PW5ldyBVaW50OEFycmF5KGEpO2Vsc2UgaWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXtsZXQgYjtjb25zdCBjPW5ldyBVaW50OEFycmF5KGEubGVuZ3RoKSxkPWEubGVuZ3RoO2ZvcihsZXQgZT0wO2U8ZDtlKyspe2I9YS5jaGFyQ29kZUF0KGUpO2lmKDI1NTxiKXRocm93IG5ldyBTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcihcImludmFsaWQgc3RyaW5nIGF0IGluZGV4IFwiK2UrXCIgKHBvc3NpYmx5IGNvbnRhaW5zIGEgdW5pY29kZSBjaGFyYWN0ZXIpXCIpO2NbZV09Yn10aGlzLnY9Y31lbHNlIGlmKFwibnVtYmVyXCI9PT10eXBlb2YgYSl0aGlzLnY9XG5uZXcgVWludDhBcnJheShhKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImJhZCBhcmd1bWVudCB0byBieXRlcyBjb25zdHJ1Y3RvclwiKTt9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRkb2M6XCJieXRlcyhpdGVyYWJsZV9vZl9pbnRzKSAtPiBieXRlc1xcbmJ5dGVzKHN0cmluZywgZW5jb2RpbmdbLCBlcnJvcnNdKSAtPiBieXRlc1xcbmJ5dGVzKGJ5dGVzX29yX2J1ZmZlcikgLT4gaW1tdXRhYmxlIGNvcHkgb2YgYnl0ZXNfb3JfYnVmZmVyXFxuYnl0ZXMoaW50KSAtPiBieXRlcyBvYmplY3Qgb2Ygc2l6ZSBnaXZlbiBieSB0aGUgcGFyYW1ldGVyIGluaXRpYWxpemVkIHdpdGggbnVsbCBieXRlc1xcbmJ5dGVzKCkgLT4gZW1wdHkgYnl0ZXMgb2JqZWN0XFxuXFxuQ29uc3RydWN0IGFuIGltbXV0YWJsZSBhcnJheSBvZiBieXRlcyBmcm9tOlxcbiAgLSBhbiBpdGVyYWJsZSB5aWVsZGluZyBpbnRlZ2VycyBpbiByYW5nZSgyNTYpXFxuICAtIGEgdGV4dCBzdHJpbmcgZW5jb2RlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nXFxuICAtIGFueSBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSBidWZmZXIgQVBJLlxcbiAgLSBhbiBpbnRlZ2VyXCIsXG50cCRuZXcoYSxjKXtpZih0aGlzIT09U2suYnVpbHRpbi5ieXRlcy5wcm90b3R5cGUpcmV0dXJuIHRoaXMuJHN1YnR5cGVfbmV3KGEsYyk7Yz1jfHxbXTtpZigxPj1hLmxlbmd0aCYmMD09PStjLmxlbmd0aClhPWFbMF07ZWxzZXtbYSxkLGNdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiYnl0ZXNcIixbbnVsbCxcInB5U291cmNlXCIsXCJlcnJvcnNcIl0sYSxjKTsoe2VuY29kaW5nOmQsZXJyb3JzOmN9PWIoXCJieXRlc1wiLGQsYykpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImVuY29kaW5nIG9yIGVycm9ycyB3aXRob3V0IGEgc3RyaW5nIGFyZ3VtZW50XCIpO3JldHVybiBlKGEsZCxjKX1pZih2b2lkIDA9PT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcztpZih2b2lkIDAhPT0oYz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGJ5dGVzKSkpe3ZhciBkPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFxuW10pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihkLGE9PntpZighU2suYnVpbHRpbi5jaGVja0J5dGVzKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fYnl0ZXNfXyByZXR1cm5lZCBub24tYnl0ZXMgKHR5cGUgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIpXCIpO3JldHVybiBhfSl9aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl7ZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKDA+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibmVnYXRpdmUgY291bnRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGQpfWlmKFNrLmJ1aWx0aW4uY2hlY2tCeXRlcyhhKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYS52KTtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInN0cmluZyBhcmd1bWVudCB3aXRob3V0IGFuIGVuY29kaW5nXCIpO2lmKFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhKSl7bGV0IGI9XG5bXTtkPVNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSk7aWYoMD5hfHwyNTU8YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiYnl0ZXMgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpXCIpO2IucHVzaChhKX0pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihkLCgpPT5uZXcgU2suYnVpbHRpbi5ieXRlcyhiKSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNvbnZlcnQgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaW50byBieXRlc1wiKTt9LCRyKCl7bGV0IGEsYj1cIidcIjtjb25zdCBjPS0xIT09dGhpcy52LmluZGV4T2YoMzQpO2xldCBkPVwiXCI7Zm9yKGxldCBlPTA7ZTx0aGlzLnYubGVuZ3RoO2UrKylpZihhPXRoaXMudltlXSw5PmF8fDEwPGEmJjEzPmF8fDEzPGEmJjMyPmF8fDEyNjxhKWQrPWYoYSk7ZWxzZSBpZig5PT09YXx8MTA9PT1hfHwxMz09PWF8fDM5PT09XG5hfHw5Mj09PWEpc3dpdGNoKGEpe2Nhc2UgOTpkKz1cIlxcXFx0XCI7YnJlYWs7Y2FzZSAxMDpkKz1cIlxcXFxuXCI7YnJlYWs7Y2FzZSAxMzpkKz1cIlxcXFxyXCI7YnJlYWs7Y2FzZSAzOTpjP2QrPVwiXFxcXCdcIjooZCs9XCInXCIsYj0nXCInKTticmVhaztjYXNlIDkyOmQrPVwiXFxcXFxcXFxcIn1lbHNlIGQrPVN0cmluZy5mcm9tQ2hhckNvZGUoYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcImJcIitiK2QrYil9LHRwJHN0cigpe3JldHVybiB0aGlzLiRyKCl9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IEcodGhpcyl9LHRwJHJpY2hjb21wYXJlKGEsYil7aWYodGhpcz09PWEmJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYikpcmV0dXJuITA7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcykpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGM9dGhpcy52O2E9YS52O2lmKGMubGVuZ3RoIT09YS5sZW5ndGgmJihcIkVxXCI9PT1ifHxcIk5vdEVxXCI9PT1iKSlyZXR1cm5cIkVxXCI9PT1cbmI/ITE6ITA7bGV0IGQ7Y29uc3QgZT1NYXRoLm1pbihjLmxlbmd0aCxhLmxlbmd0aCk7Zm9yKGQ9MDtkPGUmJmNbZF09PT1hW2RdO2QrKyk7c3dpdGNoKGIpe2Nhc2UgXCJMdFwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg8YS5sZW5ndGh8fGNbZF08YVtkXTtjYXNlIFwiTHRFXCI6cmV0dXJuIGQ9PT1lJiZjLmxlbmd0aDw9YS5sZW5ndGh8fGNbZF08PWFbZF07Y2FzZSBcIkVxXCI6cmV0dXJuIGQ9PT1lO2Nhc2UgXCJOb3RFcVwiOnJldHVybiBkPGU7Y2FzZSBcIkd0XCI6cmV0dXJuIGQ9PT1lJiZjLmxlbmd0aD5hLmxlbmd0aHx8Y1tkXT5hW2RdO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZD09PWUmJmMubGVuZ3RoPj1hLmxlbmd0aHx8Y1tkXT49YVtkXX19LHRwJGhhc2goKXtyZXR1cm4obmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJGpzc3RyKCkpKS50cCRoYXNoKCl9LHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2xldCBiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFxuU2suYnVpbHRpbi5JbmRleEVycm9yKTtpZih2b2lkIDAhPT1iKXswPmImJihiPXRoaXMudi5sZW5ndGgrYik7aWYoMD5ifHxiPj10aGlzLnYubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXCJpbmRleCBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy52W2JdKX19ZWxzZSBpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7Y29uc3QgYj1bXTthLnNzc2l0ZXIkKHRoaXMudi5sZW5ndGgsYT0+e2IucHVzaCh0aGlzLnZbYV0pfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKG5ldyBVaW50OEFycmF5KGIpKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJieXRlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy52Lmxlbmd0aH0sc3EkY29uY2F0KGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGNvbmNhdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIHRvIGJ5dGVzXCIpO2NvbnN0IGI9bmV3IFVpbnQ4QXJyYXkodGhpcy52Lmxlbmd0aCthLnYubGVuZ3RoKTtsZXQgYztmb3IoYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspYltjXT10aGlzLnZbY107Zm9yKGxldCBkPTA7ZDxhLnYubGVuZ3RoO2QrKyxjKyspYltjXT1hLnZbZF07cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSxzcSRyZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2NvbnN0IGI9YSp0aGlzLnYubGVuZ3RoO2lmKGI+TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcjtpZigwPj1cbmEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzO2E9bmV3IFVpbnQ4QXJyYXkoYik7bGV0IGM9MDtmb3IoO2M8YjspZm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhW2MrK109dGhpcy52W2JdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhhKX0sc3EkY29udGFpbnMoYSl7cmV0dXJuLTEhPT10aGlzLmZpbmQkbGVmdChhKX0sdHAkYXNfbnVtYmVyOiEwLG5iJHJlbWFpbmRlcjpTay5idWlsdGluLnN0ci5wcm90b3R5cGUubmIkcmVtYWluZGVyfSxwcm90bzp7JGpzc3RyKCl7bGV0IGE9XCJcIjtmb3IobGV0IGI9MDtiPHRoaXMudi5sZW5ndGg7YisrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy52W2JdKTtyZXR1cm4gYX0sZ2V0JHRndChhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcylyZXR1cm4gYS52O2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSxcImFyZ3VtZW50IHNob3VsZCBiZSBpbnRlZ2VyIG9yIGJ5dGVzLWxpa2Ugb2JqZWN0LCBub3Qge3RwJG5hbWV9XCIpO1xuaWYoMD5hfHwyNTU8YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiYnl0ZXMgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpXCIpO3JldHVybiBhfSxnZXQkcmF3KGEpe2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKXJldHVybiBhLnY7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYSBieXRlcy1saWtlIG9iamVjdCBpcyByZXF1aXJlZCwgbm90ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fSxnZXQkc3BsaXRBcmdzOmZ1bmN0aW9uKGEsYil7Yj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYixTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9MD5iP0luZmluaXR5OmI7YT1Tay5idWlsdGluLmNoZWNrTm9uZShhKT9udWxsOnRoaXMuZ2V0JHJhdyhhKTtpZihudWxsIT09YSYmIWEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJlbXB0eSBzZXBhcmF0b3JcIik7cmV0dXJue3NlcDphLG1heHNwbGl0OmJ9fSxmaW5kJGxlZnQ6ZCghMSksXG5maW5kJHJpZ2h0OmQoITApLGZpbmQkc3VibGVmdDpmdW5jdGlvbihhLGIsYyl7Yz1jLWEubGVuZ3RoKzE7bGV0IGQ9Yjtmb3IoO2Q8Yzspe2lmKGEuZXZlcnkoKGEsYik9PmE9PT10aGlzLnZbZCtiXSkpcmV0dXJuIGQ7ZCsrfXJldHVybi0xfSxmaW5kJHN1YnJpZ2h0KGEsYixjKXtsZXQgZD1jLWEubGVuZ3RoO2Zvcig7ZD49Yjspe2lmKGEuZXZlcnkoKGEsYik9PmE9PT10aGlzLnZbZCtiXSkpcmV0dXJuIGQ7ZC0tfXJldHVybi0xfSwkc3VidHlwZV9uZXcoYSxiKXtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2E9U2suYnVpbHRpbi5ieXRlcy5wcm90b3R5cGUudHAkbmV3KGEsYik7Yy52PWEudjtyZXR1cm4gY30sc2skYXNhcnJheSgpe2NvbnN0IGE9W107dGhpcy52LmZvckVhY2goYj0+e2EucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGIpKX0pO3JldHVybiBhfX0sZmxhZ3M6e3N0ciRlbmNvZGU6ZSwkZGVjb2RlOmwsY2hlY2skZW5jb2RlQXJnczpifSxtZXRob2RzOntfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KSl9LFxuJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpudWxsfSxjYXBpdGFsaXplOnskbWV0aCgpe2NvbnN0IGE9dGhpcy52Lmxlbmd0aDtpZigwPT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtjb25zdCBiPW5ldyBVaW50OEFycmF5KGEpO2xldCBjPXRoaXMudlswXTtiWzBdPXUoYyk/Yy0zMjpjO2ZvcihsZXQgZD0xO2Q8YTtkKyspYz10aGlzLnZbZF0sYltkXT1BKGMpP2MrMzI6YztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYil9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmNhcGl0YWxpemUoKSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gYSBjb3B5IG9mIEIgd2l0aCBvbmx5IGl0cyBmaXJzdCBjaGFyYWN0ZXIgY2FwaXRhbGl6ZWQgKEFTQ0lJKVxcbmFuZCB0aGUgcmVzdCBsb3dlci1jYXNlZC5cIn0sY2VudGVyOnskbWV0aDprKFwiY2VudGVyXCIsITEsITApLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCxcbiRkb2M6XCJCLmNlbnRlcih3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIEIgY2VudGVyZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiAgUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sY291bnQ6eyRtZXRoKGEsYixjKXthPXRoaXMuZ2V0JHRndChhKTsoe3N0YXJ0OmIsZW5kOmN9PVNrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0KHRoaXMsYixjKSk7bGV0IGQ9MDtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpZm9yKDtiPGM7YisrKXRoaXMudltiXT09PWEmJmQrKztlbHNle2M9Yy1hLmxlbmd0aCsxO2ZvcihsZXQgZT1iO2U8YztlKyspYS5ldmVyeSgoYSxiKT0+YT09PXRoaXMudltlK2JdKSYmKGQrKyxlKz1hLmxlbmd0aC0xKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhkKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzZWN0aW9uIHN1YiBpblxcbmJ5dGVzIEJbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZFxcbmFzIGluIHNsaWNlIG5vdGF0aW9uLlwifSxcbmRlY29kZTp7JG1ldGg6bCwkZmxhZ3M6e05hbWVkQXJnczpbXCJlbmNvZGluZ1wiLFwiZXJyb3JzXCJdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSdzdHJpY3QnKVwiLCRkb2M6XCJEZWNvZGUgdGhlIGJ5dGVzIHVzaW5nIHRoZSBjb2RlYyByZWdpc3RlcmVkIGZvciBlbmNvZGluZy5cXG5cXG4gIGVuY29kaW5nXFxuICAgIFRoZSBlbmNvZGluZyB3aXRoIHdoaWNoIHRvIGRlY29kZSB0aGUgYnl0ZXMuXFxuICBlcnJvcnNcXG4gICAgVGhlIGVycm9yIGhhbmRsaW5nIHNjaGVtZSB0byB1c2UgZm9yIHRoZSBoYW5kbGluZyBvZiBkZWNvZGluZyBlcnJvcnMuXFxuICAgIFRoZSBkZWZhdWx0IGlzICdzdHJpY3QnIG1lYW5pbmcgdGhhdCBkZWNvZGluZyBlcnJvcnMgcmFpc2UgYVxcbiAgICBVbmljb2RlRGVjb2RlRXJyb3IuIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgJ2lnbm9yZScgYW5kICdyZXBsYWNlJ1xcbiAgICBhcyB3ZWxsIGFzIGFueSBvdGhlciBuYW1lIHJlZ2lzdGVyZWQgd2l0aCBjb2RlY3MucmVnaXN0ZXJfZXJyb3IgdGhhdFxcbiAgICBjYW4gaGFuZGxlIFVuaWNvZGVEZWNvZGVFcnJvcnMuXCJ9LFxuZW5kc3dpdGg6eyRtZXRoOmgoXCJlbmRzd2l0aFwiLChhLGIpPT57Y29uc3QgYz1hLmxlbmd0aC1iLmxlbmd0aDtyZXR1cm4gMDw9YyYmYi5ldmVyeSgoYixkKT0+Yj09PWFbYytkXSl9KSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXFxuV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxcbldpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBCIGF0IHRoYXQgcG9zaXRpb24uXFxuc3VmZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgYnl0ZXMgdG8gdHJ5LlwifSxleHBhbmR0YWJzOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixcImFuIGludGVnZXIgaXMgcmVxdWlyZWQgKGdvdCB0eXBlIHt0cCRuYW19KVwiKTtcbmNvbnN0IGI9W107bGV0IGM9MDtmb3IobGV0IGU9MDtlPHRoaXMudi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnZbZV07OT09PWQ/KGQ9YS1jJWEsYi5wdXNoKC4uLkFycmF5KGQpLmZpbGwoMzIpKSxjKz1kKToxMD09PWR8fDEzPT09ZD8oYi5wdXNoKGQpLGM9MCk6KGIucHVzaChkKSxjKyspfXJldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhuZXcgVWludDhBcnJheShiKSl9LCRmbGFnczp7TmFtZWRBcmdzOltcInRhYnNpemVcIl0sRGVmYXVsdHM6WzhdfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmV4cGFuZHRhYnModGFic2l6ZT04KSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gYSBjb3B5IG9mIEIgd2hlcmUgYWxsIHRhYiBjaGFyYWN0ZXJzIGFyZSBleHBhbmRlZCB1c2luZyBzcGFjZXMuXFxuSWYgdGFic2l6ZSBpcyBub3QgZ2l2ZW4sIGEgdGFiIHNpemUgb2YgOCBjaGFyYWN0ZXJzIGlzIGFzc3VtZWQuXCJ9LGZpbmQ6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLmZpbmQkbGVmdChhLFxuYixjKSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJldHVybiAtMSBvbiBmYWlsdXJlLlwifSxoZXg6eyRtZXRoKCl7bGV0IGE9XCJcIjtmb3IobGV0IGI9MDtiPHRoaXMudi5sZW5ndGg7YisrKWErPXRoaXMudltiXS50b1N0cmluZygxNikucGFkU3RhcnQoMixcIjBcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaGV4KCkgLT4gc3RyaW5nXFxuXFxuQ3JlYXRlIGEgc3RyaW5nIG9mIGhleGFkZWNpbWFsIG51bWJlcnMgZnJvbSBhIGJ5dGVzIG9iamVjdC5cXG5FeGFtcGxlOiBiJ1xcXFx4YjlcXFxceDAxXFxcXHhlZicuaGV4KCkgLT4gJ2I5MDFlZicuXCJ9LFxuaW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRsZWZ0KGEsYixjKTtpZigtMT09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInN1YnNlY3Rpb24gbm90IGZvdW5kXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzZWN0aW9uIHN1YiBpcyBmb3VuZCxcXG5zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gQltzdGFydCxlbmRdLiAgT3B0aW9uYWxcXG5hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXFxuXFxuUmFpc2VzIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic2VjdGlvbiBpcyBub3QgZm91bmQuXCJ9LGlzYWxudW06eyRtZXRoOnYoYT0+dChhKXx8XG51KGEpfHxBKGEpKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2FsbnVtKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIGFscGhhbnVtZXJpY1xcbmFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0saXNhbHBoYTp7JG1ldGg6dihhPT42NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzYWxwaGEoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gQiBhcmUgYWxwaGFiZXRpY1xcbmFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0saXNhc2NpaTp7JG1ldGg6dihhPT4wPD1hJiYxMjc+PWEsITApLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzYXNjaWkoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgQiBpcyBlbXB0eSBvciBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBBU0NJSSxcXG5GYWxzZSBvdGhlcndpc2UuXCJ9LFxuaXNkaWdpdDp7JG1ldGg6dih0KSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2RpZ2l0KCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIGRpZ2l0c1xcbmFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0saXNsb3dlcjp7JG1ldGg6Qih1LEEpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzbG93ZXIoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgaW4gQiBhcmUgbG93ZXJjYXNlIGFuZCB0aGVyZSBpc1xcbmF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIgaW4gQiwgRmFsc2Ugb3RoZXJ3aXNlLlwifSxpc3NwYWNlOnskbWV0aDp2KHApLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzc3BhY2UoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gQiBhcmUgd2hpdGVzcGFjZVxcbmFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0sXG5pc3RpdGxlOnskbWV0aDpmdW5jdGlvbigpe2xldCBhPSExLGI9ITE7Zm9yKGxldCBjPTA7Yzx0aGlzLnYubGVuZ3RoO2MrKyl7Y29uc3QgZD10aGlzLnZbY107aWYoQShkKSl7aWYoYSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtiPWE9ITB9ZWxzZSBpZih1KGQpKXtpZighYSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtiPSEwfWVsc2UgYT0hMX1yZXR1cm4gYj9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXN0aXRsZSgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBCIGlzIGEgdGl0bGVjYXNlZCBzdHJpbmcgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZVxcbmNoYXJhY3RlciBpbiBCLCBpLmUuIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5IGZvbGxvdyB1bmNhc2VkXFxuY2hhcmFjdGVycyBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgb25seSBjYXNlZCBvbmVzLiBSZXR1cm4gRmFsc2VcXG5vdGhlcndpc2UuXCJ9LFxuaXN1cHBlcjp7JG1ldGg6QihBLHUpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzdXBwZXIoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgaW4gQiBhcmUgdXBwZXJjYXNlIGFuZCB0aGVyZSBpc1xcbmF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIgaW4gQiwgRmFsc2Ugb3RoZXJ3aXNlLlwifSxqb2luOnskbWV0aChhKXtjb25zdCBiPVtdO2xldCBjPTA7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2VxdWVuY2UgaXRlbSBcIitjK1wiOiBleHBlY3RlZCBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCBcIitTay5hYnN0ci50eXBlTmFtZShhKStcIiBmb3VuZFwiKTtjKys7Yi5sZW5ndGgmJmIucHVzaCguLi50aGlzLnYpO2IucHVzaCguLi5hLnYpfSksXG4oKT0+bmV3IFNrLmJ1aWx0aW4uYnl0ZXMobmV3IFVpbnQ4QXJyYXkoYikpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBpdGVyYWJsZV9vZl9ieXRlcywgLylcIiwkZG9jOlwiQ29uY2F0ZW5hdGUgYW55IG51bWJlciBvZiBieXRlcyBvYmplY3RzLlxcblxcblRoZSBieXRlcyB3aG9zZSBtZXRob2QgaXMgY2FsbGVkIGlzIGluc2VydGVkIGluIGJldHdlZW4gZWFjaCBwYWlyLlxcblxcblRoZSByZXN1bHQgaXMgcmV0dXJuZWQgYXMgYSBuZXcgYnl0ZXMgb2JqZWN0LlxcblxcbkV4YW1wbGU6IGInLicuam9pbihbYidhYicsIGIncHEnLCBiJ3JzJ10pIC0+IGInYWIucHEucnMnLlwifSxsanVzdDp7JG1ldGg6ayhcImxqdXN0XCIsITEsITEpLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIEIgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiBQYWRkaW5nIGlzXFxuZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLlwifSxcbmxvd2VyOnskbWV0aDpEKGE9PkEoYSk/YSszMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5sb3dlcigpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIGFsbCBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuXCJ9LGxzdHJpcDp7JG1ldGg6bighMCwhMSksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgYnl0ZXM9Tm9uZSwgLylcIiwkZG9jOlwiU3RyaXAgbGVhZGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIGxlYWRpbmcgIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LHBhcnRpdGlvbjp7JG1ldGg6ZyghMSksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBzZXAsIC8pXCIsJGRvYzpcIlBhcnRpdGlvbiB0aGUgYnl0ZXMgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3Igc2VwIGluIHRoZSBieXRlcy4gSWYgdGhlIHNlcGFyYXRvciBpcyBmb3VuZCxcXG5yZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yXFxuaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuXFxuXFxuSWYgdGhlIHNlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGJ5dGVzXFxub2JqZWN0IGFuZCB0d28gZW1wdHkgYnl0ZXMgb2JqZWN0cy5cIn0sXG5yZXBsYWNlOnskbWV0aChhLGIsYyl7YT10aGlzLmdldCRyYXcoYSk7Yj10aGlzLmdldCRyYXcoYik7Yz12b2lkIDA9PT1jPy0xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChjLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Yz0wPmM/SW5maW5pdHk6Yztjb25zdCBkPVtdO2xldCBlPTA7Zm9yKHZhciBmPTA7Zjx0aGlzLnYubGVuZ3RoJiZlPGM7KXtjb25zdCBjPXRoaXMuZmluZCRzdWJsZWZ0KGEsZix0aGlzLnYubGVuZ3RoKTtpZigtMT09PWMpYnJlYWs7Zm9yKDtmPGM7ZisrKWQucHVzaCh0aGlzLnZbZl0pO2QucHVzaCguLi5iKTtmPWMrYS5sZW5ndGg7ZSsrfWZvcihmO2Y8dGhpcy52Lmxlbmd0aDtmKyspZC5wdXNoKHRoaXMudltmXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKG5ldyBVaW50OEFycmF5KGQpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkc2VsZiwgb2xkLCBuZXcsIGNvdW50PS0xLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IHdpdGggYWxsIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyBvbGQgcmVwbGFjZWQgYnkgbmV3LlxcblxcbiAgY291bnRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgdG8gcmVwbGFjZS5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcy5cXG5cXG5JZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgY291bnQgaXMgZ2l2ZW4sIG9ubHkgdGhlIGZpcnN0IGNvdW50IG9jY3VycmVuY2VzIGFyZVxcbnJlcGxhY2VkLlwifSxcbnJmaW5kOnskbWV0aChhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJHJpZ2h0KGEsYixjKSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzZWN0aW9uIHN1YiBpcyBmb3VuZCxcXG5zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gQltzdGFydCxlbmRdLiAgT3B0aW9uYWxcXG5hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXFxuXFxuUmV0dXJuIC0xIG9uIGZhaWx1cmUuXCJ9LHJpbmRleDp7JG1ldGg6ZnVuY3Rpb24oYSxiLGMpe2E9dGhpcy5maW5kJHJpZ2h0KGEsYixjKTtpZigtMT09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInN1YnNlY3Rpb24gbm90IGZvdW5kXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEpfSxcbiRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJhaXNlIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic2VjdGlvbiBpcyBub3QgZm91bmQuXCJ9LHJqdXN0OnskbWV0aDprKFwicmp1c3RcIiwhMCwhMSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnJqdXN0KHdpZHRoWywgZmlsbGNoYXJdKSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gQiByaWdodCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiBQYWRkaW5nIGlzXFxuZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpXCJ9LFxucnBhcnRpdGlvbjp7JG1ldGg6ZyghMCksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBzZXAsIC8pXCIsJGRvYzpcIlBhcnRpdGlvbiB0aGUgYnl0ZXMgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3Igc2VwIGluIHRoZSBieXRlcywgc3RhcnRpbmcgYXQgdGhlIGVuZC4gSWZcXG50aGUgc2VwYXJhdG9yIGlzIGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGVcXG5zZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuXFxuXFxuSWYgdGhlIHNlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IGJ5dGVzXFxub2JqZWN0cyBhbmQgdGhlIG9yaWdpbmFsIGJ5dGVzIG9iamVjdC5cIn0scnNwbGl0OnskbWV0aDpmdW5jdGlvbihhLGIpeyh7c2VwOmEsXG5tYXhzcGxpdDpifT10aGlzLmdldCRzcGxpdEFyZ3MoYSxiKSk7Y29uc3QgYz1bXTtsZXQgZD0wLGU9dGhpcy52Lmxlbmd0aDtpZihudWxsIT09YSl7Zm9yKDswPD1lJiZkPGI7KXtjb25zdCBiPXRoaXMuZmluZCRzdWJyaWdodChhLDAsZSk7aWYoLTE9PT1iKWJyZWFrO2MucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYithLmxlbmd0aCxlKSkpO2U9YjtkKyt9Yy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheSgwLGUpKSl9ZWxzZXtmb3IoZS0tO2Q8Yjspe2Zvcig7cCh0aGlzLnZbZV0pOyllLS07aWYoMD5lKWJyZWFrO2E9ZSsxO2ZvcihlLS07MDw9ZSYmIXAodGhpcy52W2VdKTspZS0tO2MucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoZSsxLGEpKSk7ZCsrfWlmKDA8PWUpe2Zvcig7cCh0aGlzLnZbZV0pOyllLS07MDw9ZSYmYy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheSgwLFxuZSsxKSkpfX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChjLnJldmVyc2UoKSl9LCRmbGFnczp7TmFtZWRBcmdzOltcInNlcFwiLFwibWF4c3BsaXRcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4ubm9uZS5ub25lJCwtMV19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIHNlY3Rpb25zIGluIHRoZSBieXRlcywgdXNpbmcgc2VwIGFzIHRoZSBkZWxpbWl0ZXIuXFxuXFxuICBzZXBcXG4gICAgVGhlIGRlbGltaXRlciBhY2NvcmRpbmcgd2hpY2ggdG8gc3BsaXQgdGhlIGJ5dGVzLlxcbiAgICBOb25lICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgc3BsaXQgb24gQVNDSUkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXFxuICAgIChzcGFjZSwgdGFiLCByZXR1cm4sIG5ld2xpbmUsIGZvcm1mZWVkLCB2ZXJ0aWNhbCB0YWIpLlxcbiAgbWF4c3BsaXRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygc3BsaXRzIHRvIGRvLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIG5vIGxpbWl0LlxcblxcblNwbGl0dGluZyBpcyBkb25lIHN0YXJ0aW5nIGF0IHRoZSBlbmQgb2YgdGhlIGJ5dGVzIGFuZCB3b3JraW5nIHRvIHRoZSBmcm9udC5cIn0sXG5yc3RyaXA6eyRtZXRoOm4oITEsITApLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGJ5dGVzPU5vbmUsIC8pXCIsJGRvYzpcIlN0cmlwIHRyYWlsaW5nIGJ5dGVzIGNvbnRhaW5lZCBpbiB0aGUgYXJndW1lbnQuXFxuXFxuSWYgdGhlIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgTm9uZSwgc3RyaXAgdHJhaWxpbmcgQVNDSUkgd2hpdGVzcGFjZS5cIn0sc3BsaXQ6eyRtZXRoOmZ1bmN0aW9uKGEsYil7KHtzZXA6YSxtYXhzcGxpdDpifT10aGlzLmdldCRzcGxpdEFyZ3MoYSxiKSk7Y29uc3QgYz1bXSxkPXRoaXMudi5sZW5ndGg7bGV0IGU9MCxmPTA7aWYobnVsbCE9PWEpe2Zvcig7ZjxkJiZlPGI7KXtjb25zdCBiPXRoaXMuZmluZCRzdWJsZWZ0KGEsZixkKTtpZigtMT09PWIpYnJlYWs7Yy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLGIpKSk7Zj1iK2EubGVuZ3RoO2UrK31jLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGYsXG5kKSkpfWVsc2V7Zm9yKDtlPGI7KXtmb3IoO3AodGhpcy52W2ZdKTspZisrO2lmKGY9PT1kKWJyZWFrO2E9Zjtmb3IoZisrO2Y8ZCYmIXAodGhpcy52W2ZdKTspZisrO2MucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYSxmKSkpO2UrK31pZihmPGQpe2Zvcig7cCh0aGlzLnZbZl0pOylmKys7ZjxkJiZjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGYsZCkpKX19cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYyl9LCRmbGFnczp7TmFtZWRBcmdzOltcInNlcFwiLFwibWF4c3BsaXRcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4ubm9uZS5ub25lJCwtMV19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIHNlY3Rpb25zIGluIHRoZSBieXRlcywgdXNpbmcgc2VwIGFzIHRoZSBkZWxpbWl0ZXIuXFxuXFxuICBzZXBcXG4gICAgVGhlIGRlbGltaXRlciBhY2NvcmRpbmcgd2hpY2ggdG8gc3BsaXQgdGhlIGJ5dGVzLlxcbiAgICBOb25lICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgc3BsaXQgb24gQVNDSUkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXFxuICAgIChzcGFjZSwgdGFiLCByZXR1cm4sIG5ld2xpbmUsIGZvcm1mZWVkLCB2ZXJ0aWNhbCB0YWIpLlxcbiAgbWF4c3BsaXRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygc3BsaXRzIHRvIGRvLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIG5vIGxpbWl0LlwifSxcbnNwbGl0bGluZXM6eyRtZXRoKGEpe2E9U2subWlzY2V2YWwuaXNUcnVlKGEpO2NvbnN0IGI9W107bGV0IGM9MDtsZXQgZD0wO2NvbnN0IGU9dGhpcy52Lmxlbmd0aDtmb3IoO2Q8ZTspe3ZhciBmPXRoaXMudltkXTtpZigxMz09PWYpe2NvbnN0IGU9MTA9PT10aGlzLnZbZCsxXTtmPWE/ZT9kKzI6ZCsxOmQ7Yi5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShjLGYpKSk7ZD1jPWU/ZCsyOmQrMX1lbHNlIDEwPT09Zj8oZj1hP2QrMTpkLGIucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYyxmKSkpLGQ9Yz1kKzEpOmQrK31jPGUmJmIucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYyxlKSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJrZWVwZW5kc1wiXSxEZWZhdWx0czpbITFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywga2VlcGVuZHM9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBieXRlcywgYnJlYWtpbmcgYXQgbGluZSBib3VuZGFyaWVzLlxcblxcbkxpbmUgYnJlYWtzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0IHVubGVzcyBrZWVwZW5kcyBpcyBnaXZlbiBhbmRcXG50cnVlLlwifSxcbnN0YXJ0c3dpdGg6eyRtZXRoOmgoXCJzdGFydHN3aXRoXCIsKGEsYik9PmIubGVuZ3RoPD1hLmxlbmd0aCYmYi5ldmVyeSgoYixjKT0+Yj09PWFbY10pKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgQiBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxcbldpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cXG5XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxcbnByZWZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS5cIn0sc3RyaXA6eyRtZXRoOm4oITAsITApLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGJ5dGVzPU5vbmUsIC8pXCIsJGRvYzpcIlN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGJ5dGVzIGNvbnRhaW5lZCBpbiB0aGUgYXJndW1lbnQuXFxuXFxuSWYgdGhlIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgTm9uZSwgc3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgQVNDSUkgd2hpdGVzcGFjZS5cIn0sXG5zd2FwY2FzZTp7JG1ldGg6RChhPT5BKGEpP2ErMzI6dShhKT9hLTMyOmEpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnN3YXBjYXNlKCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdpdGggdXBwZXJjYXNlIEFTQ0lJIGNoYXJhY3RlcnMgY29udmVydGVkXFxudG8gbG93ZXJjYXNlIEFTQ0lJIGFuZCB2aWNlIHZlcnNhLlwifSx0aXRsZTp7JG1ldGgoKXtjb25zdCBhPXRoaXMudi5sZW5ndGgsYj1uZXcgVWludDhBcnJheShhKTtsZXQgYz0hMTtmb3IobGV0IGQ9MDtkPGE7ZCsrKXtjb25zdCBhPXRoaXMudltkXTtBKGEpPyhiW2RdPWM/YSszMjphLGM9ITApOnUoYSk/KGJbZF09Yz9hOmEtMzIsYz0hMCk6KGJbZF09YSxjPSExKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYil9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnRpdGxlKCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgdGl0bGVjYXNlZCB2ZXJzaW9uIG9mIEIsIGkuZS4gQVNDSUkgd29yZHMgc3RhcnQgd2l0aCB1cHBlcmNhc2VcXG5jaGFyYWN0ZXJzLCBhbGwgcmVtYWluaW5nIGNhc2VkIGNoYXJhY3RlcnMgaGF2ZSBsb3dlcmNhc2UuXCJ9LFxudXBwZXI6eyRtZXRoOkQoYT0+dShhKT9hLTMyOmEpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnVwcGVyKCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdpdGggYWxsIEFTQ0lJIGNoYXJhY3RlcnMgY29udmVydGVkIHRvIHVwcGVyY2FzZS5cIn0semZpbGw6eyRtZXRoKGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKTtjb25zdCBiPWEtdGhpcy52Lmxlbmd0aDtpZigwPj1iKXJldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYpO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkoYSk7bGV0IGQ9MCxlO2lmKDQzPT09dGhpcy52WzBdfHw0NT09PXRoaXMudlswXSljWzBdPXRoaXMudlswXSxkKys7Yy5maWxsKDQ4LGQsZCtiKTtlPWQ7Zm9yKGQrPWI7ZDxhO2QrKyxlKyspY1tkXT10aGlzLnZbZV07cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCxcbiRkb2M6XCJCLnpmaWxsKHdpZHRoKSAtPiBjb3B5IG9mIEJcXG5cXG5QYWQgYSBudW1lcmljIHN0cmluZyBCIHdpdGggemVyb3Mgb24gdGhlIGxlZnQsIHRvIGZpbGwgYSBmaWVsZFxcbm9mIHRoZSBzcGVjaWZpZWQgd2lkdGguICBCIGlzIG5ldmVyIHRydW5jYXRlZC5cIn19LGNsYXNzbWV0aG9kczp7ZnJvbWhleDp7JG1ldGg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmb3IobGV0IGM9ZjtjPGI7Yys9Mil7bGV0IGI9YS5zdWJzdHIoYywyKTtpZighZC50ZXN0KGIpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJub24taGV4YWRlY2ltYWwgbnVtYmVyIGZvdW5kIGluIGZyb21oZXgoKSBhcmcgYXQgcG9zaXRpb24gXCIrKGMrMSkpO2UucHVzaChwYXJzZUludChiLDE2KSl9fWlmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZyb21oZXgoKSBhcmd1bWVudCBtdXN0IGJlIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTtcbmE9YS4kanNzdHIoKTtjb25zdCBjPS9cXHMrL2csZD0vXlthYmNkZWZBQkNERUYwMTIzNDU2Nzg5XXsyfSQvLGU9W107bGV0IGY9MCxnO2Zvcig7bnVsbCE9PShnPWMuZXhlYyhhKSk7KWIoZy5pbmRleCksZj1jLmxhc3RJbmRleDtiKGEubGVuZ3RoKTtyZXR1cm4gbmV3IHRoaXMoZSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkdHlwZSwgc3RyaW5nLCAvKVwiLCRkb2M6XCJDcmVhdGUgYSBieXRlcyBvYmplY3QgZnJvbSBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBudW1iZXJzLlxcblxcblNwYWNlcyBiZXR3ZWVuIHR3byBudW1iZXJzIGFyZSBhY2NlcHRlZC5cXG5FeGFtcGxlOiBieXRlcy5mcm9taGV4KCdCOSAwMUVGJykgLT4gYidcXFxcXFxcXHhiOVxcXFxcXFxceDAxXFxcXFxcXFx4ZWYnLlwifX19KTt2YXIgRz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJieXRlc19pdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO3RoaXMuJHNlcT1hLnZ9LGl0ZXJuZXh0KCl7Y29uc3QgYT1cbnRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXTtpZih2b2lkIDAhPT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEpfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmJ5dGVzXCIsU2suYnVpbHRpbi5ieXRlcyl9LGZ1bmN0aW9uKG0scSxhKXsoZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXt9ZnVuY3Rpb24gYygpe312YXIgbD1TdHJpbmcuZnJvbUNoYXJDb2RlLGg9e30udG9TdHJpbmcsZD1oLmNhbGwoYS5TaGFyZWRBcnJheUJ1ZmZlciksZz1oKCksbj1hLlVpbnQ4QXJyYXksaz1ufHxBcnJheSxwPW4/QXJyYXlCdWZmZXI6ayx1PXAuaXNWaWV3fHxmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJsZW5ndGhcImluIGF9LEE9aC5jYWxsKHAucHJvdG90eXBlKTtwPWMucHJvdG90eXBlO1xudmFyIHQ9YS5UZXh0RW5jb2RlcixtPW5ldyAobj9VaW50MTZBcnJheTprKSgzMik7Yi5wcm90b3R5cGUuZGVjb2RlPWZ1bmN0aW9uKGEpe2lmKCF1KGEpKXt2YXIgYj1oLmNhbGwoYSk7aWYoYiE9PUEmJmIhPT1kJiZiIT09Zyl0aHJvdyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gZXhlY3V0ZSAnZGVjb2RlJyBvbiAnVGV4dERlY29kZXInOiBUaGUgcHJvdmlkZWQgdmFsdWUgaXMgbm90IG9mIHR5cGUgJyhBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpJ1wiKTthPW4/bmV3IGsoYSk6YXx8W119Zm9yKHZhciBjPWI9XCJcIixlPTAsZj1hLmxlbmd0aHwwLHA9Zi0zMnwwLEIsdCx2PTAscT0wLFAsUT0wLFU9LTE7ZTxmOyl7Zm9yKEI9ZTw9cD8zMjpmLWV8MDtRPEI7ZT1lKzF8MCxRPVErMXwwKXt0PWFbZV0mMjU1O3N3aXRjaCh0Pj40KXtjYXNlIDE1OlA9YVtlPWUrMXwwXSYyNTU7aWYoMiE9PVA+PjZ8fDI0Nzx0KXtlPWUtMXwwO2JyZWFrfXY9KHQmNyk8PDZ8UCY2MztxPTU7dD0yNTY7Y2FzZSAxNDpQPVxuYVtlPWUrMXwwXSYyNTUsdjw8PTYsdnw9KHQmMTUpPDw2fFAmNjMscT0yPT09UD4+Nj9xKzR8MDoyNCx0PXQrMjU2Jjc2ODtjYXNlIDEzOmNhc2UgMTI6UD1hW2U9ZSsxfDBdJjI1NSx2PDw9Nix2fD0odCYzMSk8PDZ8UCY2MyxxPXErN3wwLGU8ZiYmMj09PVA+PjYmJnY+PnEmJjExMTQxMTI+dj8odD12LHY9di02NTUzNnwwLDA8PXYmJihVPSh2Pj4xMCkrNTUyOTZ8MCx0PSh2JjEwMjMpKzU2MzIwfDAsMzE+UT8obVtRXT1VLFE9USsxfDAsVT0tMSk6KFA9VSxVPXQsdD1QKSkpOih0Pj49OCxlPWUtdC0xfDAsdD02NTUzMyksdj1xPTAsQj1lPD1wPzMyOmYtZXwwO2RlZmF1bHQ6bVtRXT10O2NvbnRpbnVlO2Nhc2UgMTE6Y2FzZSAxMDpjYXNlIDk6Y2FzZSA4On1tW1FdPTY1NTMzfWMrPWwobVswXSxtWzFdLG1bMl0sbVszXSxtWzRdLG1bNV0sbVs2XSxtWzddLG1bOF0sbVs5XSxtWzEwXSxtWzExXSxtWzEyXSxtWzEzXSxtWzE0XSxtWzE1XSxtWzE2XSxtWzE3XSxtWzE4XSxtWzE5XSxtWzIwXSxcbm1bMjFdLG1bMjJdLG1bMjNdLG1bMjRdLG1bMjVdLG1bMjZdLG1bMjddLG1bMjhdLG1bMjldLG1bMzBdLG1bMzFdKTszMj5RJiYoYz1jLnNsaWNlKDAsUS0zMnwwKSk7aWYoZTxmKXtpZihtWzBdPVUsUT1+VT4+PjMxLFU9LTEsYy5sZW5ndGg8Yi5sZW5ndGgpY29udGludWV9ZWxzZS0xIT09VSYmKGMrPWwoVSkpO2IrPWM7Yz1cIlwifXJldHVybiBifTtwLmVuY29kZT1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/XCJcIjpcIlwiK2E7dmFyIGI9YS5sZW5ndGh8MCxjPW5ldyBrKChiPDwxKSs4fDApLGQsZT0wLGY9IW47Zm9yKGQ9MDtkPGI7ZD1kKzF8MCxlPWUrMXwwKXt2YXIgZz1hLmNoYXJDb2RlQXQoZCl8MDtpZigxMjc+PWcpY1tlXT1nO2Vsc2V7aWYoMjA0Nz49ZyljW2VdPTE5MnxnPj42O2Vsc2V7YTp7aWYoNTUyOTY8PWcpaWYoNTYzMTk+PWcpe3ZhciBoPWEuY2hhckNvZGVBdChkPWQrMXwwKXwwO2lmKDU2MzIwPD1oJiY1NzM0Mz49aCl7Zz0oZzw8MTApK2gtNTY2MTM4ODh8MDtpZig2NTUzNTxcbmcpe2NbZV09MjQwfGc+PjE4O2NbZT1lKzF8MF09MTI4fGc+PjEyJjYzO2NbZT1lKzF8MF09MTI4fGc+PjYmNjM7Y1tlPWUrMXwwXT0xMjh8ZyY2Mztjb250aW51ZX1icmVhayBhfWc9NjU1MzN9ZWxzZSA1NzM0Mz49ZyYmKGc9NjU1MzMpOyFmJiZkPDwxPGUmJmQ8PDE8KGUtN3wwKSYmKGY9ITAsaD1uZXcgaygzKmIpLGguc2V0KGMpLGM9aCl9Y1tlXT0yMjR8Zz4+MTI7Y1tlPWUrMXwwXT0xMjh8Zz4+NiY2M31jW2U9ZSsxfDBdPTEyOHxnJjYzfX1yZXR1cm4gbj9jLnN1YmFycmF5KDAsZSk6Yy5zbGljZSgwLGUpfTt0fHwoYS5UZXh0RGVjb2Rlcj1iLGEuVGV4dEVuY29kZXI9Yyl9KShcInVuZGVmaW5lZFwiPT10eXBlb2YgYT9cInVuZGVmaW5lZFwiPT10eXBlb2Ygc2VsZj90aGlzOnNlbGY6YSl9KS5jYWxsKHRoaXMsYSgwKSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi50dXBsZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwidHVwbGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09XG5hP2E9W106QXJyYXkuaXNBcnJheShhKXx8KGE9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSkpO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlLFwiYmFkIGNhbGwgdG8gdHVwbGUsIHVzZSAnbmV3JyB3aXRoIGFuIEFycmF5IG9mIHB5dGhvbiBvYmplY3RzXCIpO3RoaXMudj1hO3RoaXMuaW4kcmVwcj0hMX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkZG9jOlwiQnVpbHQtaW4gaW1tdXRhYmxlIHNlcXVlbmNlLlxcblxcbklmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgcmV0dXJucyBhbiBlbXB0eSB0dXBsZS5cXG5JZiBpdGVyYWJsZSBpcyBzcGVjaWZpZWQgdGhlIHR1cGxlIGlzIGluaXRpYWxpemVkIGZyb20gaXRlcmFibGUncyBpdGVtcy5cXG5cXG5JZiB0aGUgYXJndW1lbnQgaXMgYSB0dXBsZSwgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc2FtZSBvYmplY3QuXCIsXG4kcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiKC4uLilcIik7dGhpcy5pbiRyZXByPSEwO2xldCBhPXRoaXMudi5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7dGhpcy5pbiRyZXByPSExO2E9YS5qb2luKFwiLCBcIik7MT09PXRoaXMudi5sZW5ndGgmJihhKz1cIixcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIihcIithK1wiKVwiKX0sdHAkbmV3KGEsYil7aWYodGhpcyE9PVNrLmJ1aWx0aW4udHVwbGUucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGIpO1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJ0dXBsZVwiLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInR1cGxlXCIsYSwwLDEpO2E9YVswXTtyZXR1cm4gdm9pZCAwPT09YT9uZXcgU2suYnVpbHRpbi50dXBsZShbXSk6YS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4udHVwbGU/YTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLFxuITApLGE9Pm5ldyBTay5idWlsdGluLnR1cGxlKGEpKX0sdHAkaGFzaCgpe2xldCBhLGI9MzQzMDAwOCxlPTEwMDAwMDM7Y29uc3QgZj10aGlzLnYubGVuZ3RoO2ZvcihsZXQgYz0wO2M8ZjsrK2Mpe2E9U2suYWJzdHIub2JqZWN0SGFzaCh0aGlzLnZbY10pO2lmKC0xPT09YSlyZXR1cm4tMTtiPShiXmEpKmU7ZSs9ODI1MjArZitmfWIrPTk3NTMxOy0xPT09YiYmKGI9LTIpO3JldHVybiBifDB9LHRwJHJpY2hjb21wYXJlOlNrLmdlbmVyaWMuc2VxQ29tcGFyZSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBhKHRoaXMpfSxtcCRzdWJzY3JpcHQoYSl7aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSk7MD5hJiYoYT10aGlzLnYubGVuZ3RoK2EpO2lmKDA+YXx8YT49dGhpcy52Lmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFwidHVwbGUgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiB0aGlzLnZbYV19aWYoYSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnNsaWNlKXtjb25zdCBiPVtdO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57Yi5wdXNoKHRoaXMudlthXSl9KTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYil9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHVwbGUgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIHNsaWNlcywgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLnYubGVuZ3RofSxzcSRyZXBlYXQoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKDE9PT1hJiZ0aGlzLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi50dXBsZSlyZXR1cm4gdGhpcztjb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YTtjKyspZm9yKGxldCBhPTA7YTx0aGlzLnYubGVuZ3RoO2ErKyliLnB1c2godGhpcy52W2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYil9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgY29uY2F0ZW5hdGUgdHVwbGUgKG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInKSB0byB0dXBsZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy52LmNvbmNhdChhLnYpKX0sc3EkY29udGFpbnMoYSl7Zm9yKGxldCBiPXRoaXMudHAkaXRlcigpLGM9Yi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWM7Yz1iLnRwJGl0ZXJuZXh0KCkpaWYoYz09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXCJFcVwiKSlyZXR1cm4hMDtyZXR1cm4hMX19LHByb3RvOnskc3VidHlwZV9uZXcoYSxiKXtiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2E9U2suYnVpbHRpbi50dXBsZS5wcm90b3R5cGUudHAkbmV3KGEpO2Iudj1hLnY7cmV0dXJuIGJ9LHNrJGFzYXJyYXkoKXtyZXR1cm4gdGhpcy52LnNsaWNlKDApfX0sbWV0aG9kczp7X19nZXRuZXdhcmdzX186eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMudi5zbGljZSgwKSl9LFxuJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6bnVsbH0saW5kZXg6eyRtZXRoKGEsYixlKXtpZih2b2lkIDAhPT1iJiYhU2subWlzY2V2YWwuaXNJbmRleChiKXx8dm9pZCAwIT09ZSYmIVNrLm1pc2NldmFsLmlzSW5kZXgoZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKTsoe3N0YXJ0OmIsZW5kOmV9PVNrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0KHRoaXMsYixlKSk7Y29uc3QgYz10aGlzLnY7Zm9yKDtiPGU7YisrKWlmKGNbYl09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woY1tiXSxhLFwiRXFcIikpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInR1cGxlLmluZGV4KHgpOiB4IG5vdCBpbiB0dXBsZVwiKTt9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sXG4kdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIHN0YXJ0PTAsIHN0b3A9c3lzLm1heHNpemUsIC8pXCIsJGRvYzpcIlJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZS5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuXCJ9LGNvdW50OnskbWV0aChhKXtjb25zdCBiPXRoaXMudi5sZW5ndGgsYz10aGlzLnY7bGV0IGY9MDtmb3IobGV0IGU9MDtlPGI7KytlKWlmKGNbZV09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woY1tlXSxhLFwiRXFcIikpZis9MTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhmKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZG9jOlwiUmV0dXJuIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB2YWx1ZS5cIn19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi50dXBsZVwiLFNrLmJ1aWx0aW4udHVwbGUpO3ZhciBhPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInR1cGxlX2l0ZXJhdG9yXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS5zayRhc2FycmF5KCl9LGl0ZXJuZXh0OlNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXksbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhKXtsZXQgYj1hLiRzYXZlZEtleUhhc2g7cmV0dXJuIHZvaWQgMCE9PWI/YjpiPVNrLmFic3RyLm9iamVjdEhhc2goYSl9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc2V0KFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKX1mdW5jdGlvbiBiKGEsYil7Zm9yKGxldCBjPVNrLmFic3RyLml0ZXIoYSksZD1jLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZDtkPWMudHAkaXRlcm5leHQoKSlpZighU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhiLFxuZCkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZShhLGIsZCl7Y29uc3QgZT17Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7aWYoMSE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNyZWF0ZSAnXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCInIGluc3RhbmNlc1wiKTt0aGlzLmRpY3Q9YTt0aGlzLmluJHJlcHI9ITF9fTtlLnNsb3RzPU9iamVjdC5hc3NpZ24oYixoKTtlLm1ldGhvZHM9e2lzZGlzam9pbnQ6eyRtZXRoKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi5pc2Rpc2pvaW50LiRtZXRoLmNhbGwoYixhKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSB2aWV3IGFuZCB0aGUgZ2l2ZW4gaXRlcmFibGUgaGF2ZSBhIG51bGwgaW50ZXJzZWN0aW9uLlwifSxfX3JldmVyc2VkX186eyRtZXRoOmQsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgZGljdCBrZXlzLlwifX07XG5lLmZsYWdzPXtzayRhY2NlcHRhYmxlX2FzX2Jhc2U6ITF9O1wiZGljdF92YWx1ZXNcIj09PWEmJihkZWxldGUgZS5zbG90cy50cCRhc19udW1iZXIsZGVsZXRlIGUuc2xvdHMudHAkcmljaGNvbXBhcmUpO3JldHVybiBTay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKGEsZSl9ZnVuY3Rpb24gZihhLGIsYyl7cmV0dXJuIFNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhhLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO3RoaXMuJG9yaWc9YTt0aGlzLnRwJGl0ZXJuZXh0PSgpPT57dGhpcy4kc2VxPWEuJGl0ZW1zKCk7dGhpcy4kdmVyc2lvbj1hLiR2ZXJzaW9uO2MmJih0aGlzLiRzZXE9dGhpcy4kc2VxLnJldmVyc2UoKSk7dGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dDtyZXR1cm4gdGhpcy50cCRpdGVybmV4dCgpfX0saXRlcm5leHQ6YixtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sXG5mbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfSxwcm90bzp7bmV4dCRpdGVtOmx9fSl9ZnVuY3Rpb24gbCgpe2lmKHRoaXMuJHZlcnNpb24hPT10aGlzLiRvcmlnLiR2ZXJzaW9uKXtpZih0aGlzLiRsZW4hPT10aGlzLiRvcmlnLmdldCRzaXplKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKFwiZGljdCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvblwiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5SdW50aW1lRXJyb3IoXCJkaWN0aW9uYXJ5IGtleXMgY2hhbmdlZCBkdXJpbmcgaXRlcmF0aW9uXCIpO31yZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfVNrLmJ1aWx0aW4uZGljdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZGljdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1bXSk7U2suYXNzZXJ0cy5hc3NlcnQoQXJyYXkuaXNBcnJheShhKSYmMD09PWEubGVuZ3RoJTImJnRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QsXG5cImJhZCBjYWxsIHRvIGRpY3QgY29uc3RydWN0b3JcIik7dGhpcy5zaXplPTA7dGhpcy5lbnRyaWVzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5idWNrZXRzPXt9O2ZvcihsZXQgYj0wO2I8YS5sZW5ndGg7Yis9Mil0aGlzLnNldCRpdGVtKGFbYl0sYVtiKzFdKTt0aGlzLmluJHJlcHI9ITE7dGhpcy4kdmVyc2lvbj0wfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRhc19udW1iZXI6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkZG9jOlwiZGljdCgpIC0+IG5ldyBlbXB0eSBkaWN0aW9uYXJ5XFxuZGljdChtYXBwaW5nKSAtPiBuZXcgZGljdGlvbmFyeSBpbml0aWFsaXplZCBmcm9tIGEgbWFwcGluZyBvYmplY3Qnc1xcbiAgICAoa2V5LCB2YWx1ZSkgcGFpcnNcXG5kaWN0KGl0ZXJhYmxlKSAtPiBuZXcgZGljdGlvbmFyeSBpbml0aWFsaXplZCBhcyBpZiB2aWE6XFxuICAgIGQgPSB7fVxcbiAgICBmb3IgaywgdiBpbiBpdGVyYWJsZTpcXG4gICAgICAgIGRba10gPSB2XFxuZGljdCgqKmt3YXJncykgLT4gbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbmFtZT12YWx1ZSBwYWlyc1xcbiAgICBpbiB0aGUga2V5d29yZCBhcmd1bWVudCBsaXN0LiAgRm9yIGV4YW1wbGU6ICBkaWN0KG9uZT0xLCB0d289MilcIixcbiRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJ7Li4ufVwiKTt0aGlzLmluJHJlcHI9ITA7Y29uc3QgYT10aGlzLiRpdGVtcygpLm1hcCgoW2EsYl0pPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiOiBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGIpKTt0aGlzLmluJHJlcHI9ITE7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIntcIithLmpvaW4oXCIsIFwiKStcIn1cIil9LHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYil7cmV0dXJuIHRoaXMudXBkYXRlJGNvbW1vbihhLGIsXCJkaWN0XCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBrKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLGIpe2xldCBjO2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCl8fFwiRXFcIiE9PWImJlwiTm90RXFcIiE9PWIpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2lmKGE9PT10aGlzKWM9ITA7ZWxzZSBpZih0aGlzLnNpemUhPT1cbmEuc2l6ZSljPSExO2Vsc2V7bGV0IGI7Yz10aGlzLiRpdGVtcygpLmV2ZXJ5KChbYyxkXSk9PntiPWEubXAkbG9va3VwKGMpO3JldHVybiB2b2lkIDAhPT1iJiYoYj09PWR8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGIsXCJFcVwiKSl9KX1yZXR1cm5cIkVxXCI9PT1iP2M6IWN9LG5iJG9yKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGI9dGhpcy5kaWN0JGNvcHkoKTtiLmRpY3QkbWVyZ2UoYSk7cmV0dXJuIGJ9LG5iJHJlZmxlY3RlZF9vcihhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPWEuZGljdCRjb3B5KCk7YS5kaWN0JG1lcmdlKHRoaXMpO3JldHVybiBhfSxuYiRpbnBsYWNlX29yKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZSRvbmVhcmcoYSksXG4oKT0+dGhpcyl9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmdldCRzaXplKCl9LHNxJGNvbnRhaW5zKGEpe3JldHVybiB2b2lkIDAhPT10aGlzLm1wJGxvb2t1cChhKX0sbXAkc3Vic2NyaXB0KGEsYil7dmFyIGM9dGhpcy5tcCRsb29rdXAoYSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztjPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwodGhpcyxTay5idWlsdGluLnN0ci4kbWlzc2luZyk7aWYodm9pZCAwIT09YylyZXR1cm4gYT1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbYV0pLGI/YTpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7fSxtcCRhc3Nfc3Vic2NyaXB0KGEsYil7aWYodm9pZCAwPT09Yil7aWYodm9pZCAwPT09dGhpcy5wb3AkaXRlbShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihhKTt9ZWxzZSB0aGlzLnNldCRpdGVtKGEsYil9fSxtZXRob2RzOntfX3JldmVyc2VkX186eyRtZXRoKCl7cmV0dXJuIG5ldyBBKHRoaXMpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Qga2V5cy5cIn0sZ2V0OnskbWV0aChhLGIpe3JldHVybiB0aGlzLm1wJGxvb2t1cChhKXx8Ynx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSB2YWx1ZSBmb3Iga2V5IGlmIGtleSBpcyBpbiB0aGUgZGljdGlvbmFyeSwgZWxzZSBkZWZhdWx0LlwifSxzZXRkZWZhdWx0OnskbWV0aChiLGMpe2xldCBkO2NvbnN0IGU9YShiKTtkPVwic3RyaW5nXCI9PT10eXBlb2YgZT90aGlzLmVudHJpZXNbZV06dGhpcy5nZXQkYnVja2V0X2l0ZW0oYixlKTtpZih2b2lkIDAhPT1kKXJldHVybiBkWzFdO2M9Y3x8U2suYnVpbHRpbi5ub25lLm5vbmUkO1wic3RyaW5nXCI9PT10eXBlb2YgZT90aGlzLmVudHJpZXNbZV09W2IsY106XG50aGlzLnNldCRidWNrZXRfaXRlbShiLGMsZSk7dGhpcy5zaXplKys7dGhpcy4kdmVyc2lvbisrO3JldHVybiBjfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSwgLylcIiwkZG9jOlwiSW5zZXJ0IGtleSB3aXRoIGEgdmFsdWUgb2YgZGVmYXVsdCBpZiBrZXkgaXMgbm90IGluIHRoZSBkaWN0aW9uYXJ5LlxcblxcblJldHVybiB0aGUgdmFsdWUgZm9yIGtleSBpZiBrZXkgaXMgaW4gdGhlIGRpY3Rpb25hcnksIGVsc2UgZGVmYXVsdC5cIn0scG9wOnskbWV0aChhLGIpe2NvbnN0IGM9dGhpcy5wb3AkaXRlbShhKTtpZih2b2lkIDAhPT1jKXJldHVybiBjWzFdO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7fSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQucG9wKGtbLGRdKSAtPiB2LCByZW1vdmUgc3BlY2lmaWVkIGtleSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLlxcbklmIGtleSBpcyBub3QgZm91bmQsIGQgaXMgcmV0dXJuZWQgaWYgZ2l2ZW4sIG90aGVyd2lzZSBLZXlFcnJvciBpcyByYWlzZWRcIn0sXG5wb3BpdGVtOnskbWV0aCgpe2NvbnN0IGE9dGhpcy5nZXQkc2l6ZSgpO2lmKDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKFwicG9waXRlbSgpOiBkaWN0aW9uYXJ5IGlzIGVtcHR5XCIpO2NvbnN0IFtiLGNdPXRoaXMuJGl0ZW1zKClbYS0xXTt0aGlzLnBvcCRpdGVtKGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbYixjXSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnBvcGl0ZW0oKSAtPiAoaywgdiksIHJlbW92ZSBhbmQgcmV0dXJuIHNvbWUgKGtleSwgdmFsdWUpIHBhaXIgYXMgYVxcbjItdHVwbGU7IGJ1dCByYWlzZSBLZXlFcnJvciBpZiBEIGlzIGVtcHR5LlwifSxrZXlzOnskbWV0aCgpe3JldHVybiBuZXcgZCh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQua2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGtleXNcIn0saXRlbXM6eyRtZXRoKCl7cmV0dXJuIG5ldyBuKHRoaXMpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELml0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3MgaXRlbXNcIn0sdmFsdWVzOnskbWV0aCgpe3JldHVybiBuZXcgZyh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQudmFsdWVzKCkgLT4gYW4gb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIHZhbHVlc1wifSx1cGRhdGU6eyRtZXRoKGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKHRoaXMudXBkYXRlJGNvbW1vbihhLGIsXCJ1cGRhdGVcIiksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQudXBkYXRlKFtFLCBdKipGKSAtPiBOb25lLiAgVXBkYXRlIEQgZnJvbSBkaWN0L2l0ZXJhYmxlIEUgYW5kIEYuXFxuSWYgRSBpcyBwcmVzZW50IGFuZCBoYXMgYSAua2V5cygpIG1ldGhvZCwgdGhlbiBkb2VzOiAgZm9yIGsgaW4gRTogRFtrXSA9IEVba11cXG5JZiBFIGlzIHByZXNlbnQgYW5kIGxhY2tzIGEgLmtleXMoKSBtZXRob2QsIHRoZW4gZG9lczogIGZvciBrLCB2IGluIEU6IERba10gPSB2XFxuSW4gZWl0aGVyIGNhc2UsIHRoaXMgaXMgZm9sbG93ZWQgYnk6IGZvciBrIGluIEY6ICBEW2tdID0gRltrXVwifSxcbmNsZWFyOnskbWV0aCgpe3RoaXMuc2l6ZT0wO3RoaXMuJHZlcnNpb24rKzt0aGlzLmVudHJpZXM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmJ1Y2tldHM9e319LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmNsZWFyKCkgLT4gTm9uZS4gIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSBELlwifSxjb3B5OnskbWV0aCgpe3JldHVybiB0aGlzLmRpY3QkY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5jb3B5KCkgLT4gYSBzaGFsbG93IGNvcHkgb2YgRFwifX0sY2xhc3NtZXRob2RzOntmcm9ta2V5czp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPWJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtsZXQgYz10aGlzPT09U2suYnVpbHRpbi5kaWN0P25ldyB0aGlzOnRoaXMudHAkY2FsbChbXSxbXSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGMsZD0+e2M9ZDtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PlxuYy5tcCRhc3Nfc3Vic2NyaXB0KGEsYiwhMCkpfSwoKT0+Yyl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJHR5cGUsIGl0ZXJhYmxlLCB2YWx1ZT1Ob25lLCAvKVwiLCRkb2M6XCJDcmVhdGUgYSBuZXcgZGljdGlvbmFyeSB3aXRoIGtleXMgZnJvbSBpdGVyYWJsZSBhbmQgdmFsdWVzIHNldCB0byB2YWx1ZS5cIn19LHByb3RvOntxdWljayRsb29rdXA6ZnVuY3Rpb24oYSl7YT10aGlzLmVudHJpZXNbYS4kc2F2ZWRLZXlIYXNoXTtpZih2b2lkIDAhPT1hKXJldHVybiBhWzFdfSxtcCRsb29rdXA6ZnVuY3Rpb24oYil7Y29uc3QgYz1hKGIpO2I9XCJzdHJpbmdcIj09PXR5cGVvZiBjP3RoaXMuZW50cmllc1tjXTp0aGlzLmdldCRidWNrZXRfaXRlbShiLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGJbMV19LGdldCRzaXplKCl7cmV0dXJuIHRoaXMuc2l6ZX0sc2skYXNhcnJheSgpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZW50cmllcykubWFwKGE9PmFbMF0pfSx1cGRhdGUkY29tbW9uOmZ1bmN0aW9uKGEsXG5iLGMpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihjLGEsMCwxKTthPWFbMF07bGV0IGQ7dm9pZCAwIT09YSYmKGQ9dGhpcy51cGRhdGUkb25lYXJnKGEpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCwoKT0+e2lmKGIpZm9yKGxldCBhPTA7YTxiLmxlbmd0aDthKz0yKXRoaXMuc2V0JGl0ZW0obmV3IFNrLmJ1aWx0aW4uc3RyKGJbYV0pLGJbYSsxXSl9KX0sdXBkYXRlJG9uZWFyZyhhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdHx8dm9pZCAwIT09U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRrZXlzKT90aGlzLmRpY3QkbWVyZ2UoYSk6dGhpcy5kaWN0JG1lcmdlX3NlcShhKX0sZGljdCRjb3B5KCl7Y29uc3QgYT1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTthLnNpemU9dGhpcy5zaXplO3ZhciBiPU9iamVjdC5lbnRyaWVzKHRoaXMuZW50cmllcyk7Zm9yKHZhciBjIGluIGIpe3ZhciBkPWJbY11bMV07YS5lbnRyaWVzW2JbY11bMF1dPVtkWzBdLFxuZFsxXV19Zm9yKGxldCBlIGluIHRoaXMuYnVja2V0cylmb3IoYz10aGlzLmJ1Y2tldHNbZV0sYS5idWNrZXRzW2VdPWI9W10sZD0wO2Q8Yy5sZW5ndGg7ZCsrKWIucHVzaChhLmVudHJpZXNbXCIjXCIrZStcIl9cIitkXSk7cmV0dXJuIGF9LCRpdGVtcygpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZW50cmllcyl9LHNldCRpdGVtOmZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hKGIpO2xldCBlO1wic3RyaW5nXCI9PT10eXBlb2YgZD8oZT10aGlzLmVudHJpZXNbZF0sdm9pZCAwPT09ZT8odGhpcy5lbnRyaWVzW2RdPVtiLGNdLHRoaXMuc2l6ZSsrLHRoaXMuJHZlcnNpb24rKyk6ZVsxXT1jKTooZT10aGlzLmdldCRidWNrZXRfaXRlbShiLGQpLHZvaWQgMD09PWU/KHRoaXMuc2V0JGJ1Y2tldF9pdGVtKGIsYyxkKSx0aGlzLnNpemUrKyx0aGlzLiR2ZXJzaW9uKyspOmVbMV09Yyl9LGdldCRidWNrZXRfaXRlbTpmdW5jdGlvbihhLGIpe2I9dGhpcy5idWNrZXRzW2JdO2lmKHZvaWQgMCE9PWIpZm9yKGxldCBkPVxuMDtkPGIubGVuZ3RoO2QrKyl7dmFyIGM9YltkXTtpZih2b2lkIDAhPT1jJiYoY1swXT09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLGNbMF0sXCJFcVwiKSkpcmV0dXJuIGN9fSxwb3AkYnVja2V0X2l0ZW06ZnVuY3Rpb24oYSxiKXtjb25zdCBjPXRoaXMuYnVja2V0c1tiXTtsZXQgZDtpZih2b2lkIDAhPT1jKWZvcihsZXQgZT0wO2U8Yy5sZW5ndGg7ZSsrKWlmKGQ9Y1tlXSx2b2lkIDAhPT1kJiYoZFswXT09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLGRbMF0sXCJFcVwiKSkpcmV0dXJuIGRlbGV0ZSB0aGlzLmVudHJpZXNbXCIjXCIrYitcIl9cIitlXSxjW2VdPXZvaWQgMCxjLmV2ZXJ5KGE9PnZvaWQgMD09PWEpJiZkZWxldGUgdGhpcy5idWNrZXRzW2JdLGR9LHNldCRidWNrZXRfaXRlbTpmdW5jdGlvbihhLGIsYyl7bGV0IGQ9dGhpcy5idWNrZXRzW2NdO2E9W2EsYl07dm9pZCAwPT09ZD8odGhpcy5idWNrZXRzW2NdPVthXSxjPVwiI1wiK2MrXCJfMFwiKTooYj1kLmluZGV4T2Yodm9pZCAwKSxcbi0xIT09Yj8oYz1cIiNcIitjK1wiX1wiK2IsZFtiXT1hKTooYz1cIiNcIitjK1wiX1wiK2QubGVuZ3RoLGQucHVzaChhKSkpO3RoaXMuZW50cmllc1tjXT1hfSxwb3AkaXRlbTpmdW5jdGlvbihiKXtjb25zdCBjPWEoYik7XCJzdHJpbmdcIj09PXR5cGVvZiBjPyhiPXRoaXMuZW50cmllc1tjXSxkZWxldGUgdGhpcy5lbnRyaWVzW2NdKTpiPXRoaXMucG9wJGJ1Y2tldF9pdGVtKGIsYyk7aWYodm9pZCAwIT09YilyZXR1cm4gdGhpcy5zaXplLS0sdGhpcy4kdmVyc2lvbisrLGJ9LGRpY3QkbWVyZ2U6ZnVuY3Rpb24oYSl7aWYoYS50cCRpdGVyPT09U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS50cCRpdGVyKXt2YXIgYj1hLnRwJGl0ZXIoKTtmb3IobGV0IGM9Yi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWM7Yz1iLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGI9YS5tcCRzdWJzY3JpcHQoYyk7dGhpcy5zZXQkaXRlbShjLGIpfX1lbHNlIHJldHVybiBiPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyksXG5Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYixbXSksYj0+U2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGIpLGI9PlNrLm1pc2NldmFsLmNoYWluKGEubXAkc3Vic2NyaXB0KGIsITApLGE9Pnt0aGlzLnNldCRpdGVtKGIsYSl9KSkpfSxkaWN0JG1lcmdlX3NlcTpmdW5jdGlvbihhKXtsZXQgYj0wO3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNvbnZlcnQgZGljdGlvbmFyeSB1cGRhdGUgc2VxdWVuY2UgZWxlbWVudCAjXCIrYitcIiB0byBhIHNlcXVlbmNlXCIpO2E9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSk7aWYoMiE9PWEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJkaWN0aW9uYXJ5IHVwZGF0ZSBzZXF1ZW5jZSBlbGVtZW50ICNcIitcbmIrXCIgaGFzIGxlbmd0aCBcIithLmxlbmd0aCtcIjsgMiBpcyByZXF1aXJlZFwiKTt0aGlzLnNldCRpdGVtKGFbMF0sYVsxXSk7YisrfSl9fX0pO2NvbnN0IGg9e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX251bWJlcjohMCx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCIuLi5cIik7dGhpcy5pbiRyZXByPSEwO2xldCBhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKHRoaXMpO2E9YS5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIoW1wiK2Euam9pbihcIiwgXCIpK1wiXSlcIil9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoIShTay5idWlsdGluLmNoZWNrQW55U2V0KGEpfHxhIGluc3RhbmNlb2YgZHx8XG5hIGluc3RhbmNlb2YgbikpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGU9dGhpcy5zcSRsZW5ndGgoKSxmPWEuc3EkbGVuZ3RoKCk7c3dpdGNoKGMpe2Nhc2UgXCJOb3RFcVwiOmNhc2UgXCJFcVwiOmxldCBkO3RoaXM9PT1hP2Q9ITA6ZT09PWYmJihkPWIodGhpcyxhKSk7cmV0dXJuXCJOb3RFcVwiPT09Yz8hZDpkO2Nhc2UgXCJMdFwiOnJldHVybiBlPGYmJmIodGhpcyxhKTtjYXNlIFwiTHRFXCI6cmV0dXJuIGU8PWYmJmIodGhpcyxhKTtjYXNlIFwiR3RcIjpyZXR1cm4gZT5mJiZiKGEsdGhpcyk7Y2FzZSBcIkd0RVwiOnJldHVybiBlPj1mJiZiKGEsdGhpcyl9fSxuYiRzdWJ0cmFjdChhKXtjb25zdCBiPWModGhpcyk7cmV0dXJuIGIuZGlmZmVyZW5jZS4kbWV0aC5jYWxsKGIsYSl9LG5iJGFuZChhKXtjb25zdCBiPWModGhpcyk7cmV0dXJuIGIuaW50ZXJzZWN0aW9uLiRtZXRoLmNhbGwoYixhKX0sbmIkb3IoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLnVuaW9uLiRtZXRoLmNhbGwoYixcbmEpfSxuYiR4b3IoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLnN5bW1ldHJpY19kaWZmZXJlbmNlLiRtZXRoLmNhbGwoYixhKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMuZGljdC5nZXQkc2l6ZSgpfX07dmFyIGQ9ZShcImRpY3Rfa2V5c1wiLHtzcSRjb250YWlucyhhKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5kaWN0Lm1wJGxvb2t1cChhKX0sdHAkaXRlcigpe3JldHVybiBuZXcgayh0aGlzLmRpY3QpfX0sZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEEodGhpcy5kaWN0KX0pLGc9ZShcImRpY3RfdmFsdWVzXCIse3RwJGl0ZXIoKXtyZXR1cm4gbmV3IHUodGhpcy5kaWN0KX19LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2KHRoaXMuZGljdCl9KSxuPWUoXCJkaWN0X2l0ZW1zXCIse3NxJGNvbnRhaW5zKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUmJjI9PT1hLnNxJGxlbmd0aCgpKSlyZXR1cm4hMTt2YXIgYj1hLm1wJHN1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5pbnRfKDApKTtcbmE9YS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50XygxKSk7Yj10aGlzLmRpY3QubXAkbG9va3VwKGIpO3JldHVybiB2b2lkIDA9PT1iPyExOmI9PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYixhLFwiRXFcIil9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IHAodGhpcy5kaWN0KX19LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KHRoaXMuZGljdCl9KSxrPWYoXCJkaWN0X2tleWl0ZXJhdG9yXCIsZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMubmV4dCRpdGVtKCk7cmV0dXJuIGEmJmFbMF19KSxwPWYoXCJkaWN0X2l0ZW1pdGVyYXRvclwiLGZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLm5leHQkaXRlbSgpO3JldHVybiBhJiZuZXcgU2suYnVpbHRpbi50dXBsZShbYVswXSxhWzFdXSl9KSx1PWYoXCJkaWN0X3ZhbHVlaXRlcmF0b3JcIixmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5uZXh0JGl0ZW0oKTtyZXR1cm4gYSYmYVsxXX0pLEE9ZihcImRpY3RfcmV2ZXJzZWtleWl0ZXJhdG9yXCIsay5wcm90b3R5cGUudHAkaXRlcm5leHQsXG4hMCksdD1mKFwiZGljdF9yZXZlcnNlaXRlbWl0ZXJhdG9yXCIscC5wcm90b3R5cGUudHAkaXRlcm5leHQsITApLHY9ZihcImRpY3RfcmV2ZXJzZXZhbHVlaXRlcmF0b3JcIix1LnByb3RvdHlwZS50cCRpdGVybmV4dCwhMCk7U2suYnVpbHRpbi5kaWN0LnB5MiRtZXRob2RzPXtoYXNfa2V5OnskbmFtZTpcImhhc19rZXlcIiwkZmxhZ3M6e09uZUFyZzohMH0sJG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wodGhpcy5zcSRjb250YWlucyhhKSl9LCRkb2M6XCJELmhhc19rZXkoaykgLT4gVHJ1ZSBpZiBEIGhhcyBhIGtleSBrLCBlbHNlIEZhbHNlXCJ9LGtleXM6eyRuYW1lOlwia2V5c1wiLCRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy5zayRhc2FycmF5KCkpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5rZXlzKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3Mga2V5c1wifSxpdGVtczp7JG5hbWU6XCJpdGVtc1wiLFxuJG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLiRpdGVtcygpLm1hcCgoW2EsYl0pPT5uZXcgU2suYnVpbHRpbi50dXBsZShbYSxiXSkpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuaXRlbXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBpdGVtc1wifSx2YWx1ZXM6eyRuYW1lOlwidmFsdWVzXCIsJG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLiRpdGVtcygpLm1hcCgoWyxhXSk9PmEpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQudmFsdWVzKCkgLT4gYW4gb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIHZhbHVlc1wifX19LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEse2VudHJpZXM6e2dldDooKT0+e2NvbnN0IGE9T2JqZWN0LmNyZWF0ZShudWxsKTtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbYixcbmNdKT0+e2I9U2sudW5maXhSZXNlcnZlZChiKTtiLmluY2x1ZGVzKFwiJFwiKXx8KGI9bmV3IFNrLmJ1aWx0aW4uc3RyKGIpLGFbYi4kc2F2ZWRLZXlIYXNoXT1bYixjXSl9KTtyZXR1cm4gYX0sY29uZmlndXJhYmxlOiEwfSxzaXplOntnZXQ6KCk9Pk9iamVjdC5rZXlzKGIpLm1hcChhPT5Tay51bmZpeFJlc2VydmVkKGEpKS5maWx0ZXIoYT0+IWEuaW5jbHVkZXMoXCIkXCIpKS5sZW5ndGgsY29uZmlndXJhYmxlOiEwfX0pfVNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJtYXBwaW5ncHJveHlcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYyl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5LFwiYmFkIGNhbGwgdG8gbWFwcGluZyBwcm94eSwgdXNlICduZXcnXCIpO3RoaXMubWFwcGluZz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTt2b2lkIDAhPT1jJiZhKHRoaXMubWFwcGluZyxjKX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLFxudHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwibWFwcGluZ3Byb3h5XCIsYik7U2suYWJzdHIuY2hlY2tPbmVBcmcoXCJtYXBwaW5ncHJveHlcIixhLGIpO2E9YVswXTtpZighU2suYnVpbHRpbi5jaGVja01hcHBpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibWFwcGluZ3Byb3h5KCkgYXJndW1lbnQgbXVzdCBiZSBhIG1hcHBpbmcsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7Yj1uZXcgU2suYnVpbHRpbi5tYXBwaW5ncHJveHk7Yi5tYXBwaW5nPWE7cmV0dXJuIGJ9LHRwJHJpY2hjb21wYXJlKGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCh0aGlzLm1hcHBpbmcsYSxiKX0sdHAkc3RyKCl7cmV0dXJuIHRoaXMubWFwcGluZy50cCRzdHIoKX0sJHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwibWFwcGluZ3Byb3h5KFwiK1xuU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLm1hcHBpbmcpK1wiKVwiKX0sbXAkc3Vic2NyaXB0KGEsYil7cmV0dXJuIHRoaXMubWFwcGluZy5tcCRzdWJzY3JpcHQoYSxiKX0sc3EkY29udGFpbnMoYSl7cmV0dXJuIHRoaXMubWFwcGluZy5zcSRjb250YWlucyhhKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMubWFwcGluZy5zcSRsZW5ndGgoKX0sdHAkaXRlcigpe3JldHVybiB0aGlzLm1hcHBpbmcudHAkaXRlcigpfSx0cCRhc19udW1iZXI6ITAsbmIkb3IoYSl7YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5JiYoYT1hLm1hcHBpbmcpO3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcCh0aGlzLm1hcHBpbmcsYSxcIkJpdE9yXCIpfSxuYiRyZWZsZWN0ZWRfb3IoYSl7YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5JiYoYT1hLm1hcHBpbmcpO3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLHRoaXMubWFwcGluZyxcIkJpdE9yXCIpfSxuYiRpbnBsYWNlX29yKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIid8PScgaXMgbm90IHN1cHBvcnRlZCBieSBcIitcblNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiOyB1c2UgJ3wnIGluc3RlYWRcIik7fX0sbWV0aG9kczp7Z2V0OnskbWV0aChhLGIpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5tYXBwaW5nLnRwJGdldGF0dHIodGhpcy5zdHIkZ2V0KSxhLGIpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmdldChrWyxkXSkgLT4gRFtrXSBpZiBrIGluIEQsIGVsc2UgZC4gIGQgZGVmYXVsdHMgdG8gTm9uZS5cIn0sa2V5czp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGtleXMpLFtdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQua2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGtleXNcIn0saXRlbXM6eyRtZXRoKCl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLm1hcHBpbmcudHAkZ2V0YXR0cih0aGlzLnN0ciRpdGVtcyksXG5bXSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELml0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3MgaXRlbXNcIn0sdmFsdWVzOnskbWV0aCgpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5tYXBwaW5nLnRwJGdldGF0dHIodGhpcy5zdHIkdmFsdWVzKSxbXSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIHZhbHVlc1wifSxjb3B5OnskbWV0aCgpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5tYXBwaW5nLnRwJGdldGF0dHIodGhpcy5zdHIkY29weSksW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5jb3B5KCkgLT4gYSBzaGFsbG93IGNvcHkgb2YgRFwifX0scHJvdG86e3N0ciRnZXQ6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiZ2V0XCIpLFxuc3RyJGNvcHk6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiY29weVwiKSxzdHIka2V5czpuZXcgU2suYnVpbHRpbi5zdHIoXCJrZXlzXCIpLHN0ciRpdGVtczpuZXcgU2suYnVpbHRpbi5zdHIoXCJpdGVtc1wiKSxzdHIkdmFsdWVzOm5ldyBTay5idWlsdGluLnN0cihcInZhbHVlc1wiKSxtcCRsb29rdXAoYSl7cmV0dXJuIHRoaXMubWFwcGluZy5tcCRsb29rdXAoYSl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ucHJvcGVydHk9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInByb3BlcnR5XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyxiLGUpe3RoaXMucHJvcCRnZXQ9YXx8U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMucHJvcCRzZXQ9Y3x8U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMucHJvcCRkZWw9Ynx8U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMucHJvcCRkb2M9ZXx8YSYmYS4kZG9jfHxTay5idWlsdGluLm5vbmUubm9uZSR9LFxuc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYyl7YT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcInByb3BlcnR5XCIsW1wiZmdldFwiLFwiZnNldFwiLFwiZmRlbFwiLFwiZG9jXCJdLGEsYyxBcnJheSg0KS5maWxsKFNrLmJ1aWx0aW4ubm9uZS5ub25lJCkpO3RoaXMucHJvcCRnZXQ9YVswXTt0aGlzLnByb3Akc2V0PWFbMV07dGhpcy5wcm9wJGRlbD1hWzJdO1NrLmJ1aWx0aW4uY2hlY2tOb25lKGFbM10pP1NrLmJ1aWx0aW4uY2hlY2tOb25lKGFbMF0pfHwodGhpcy5wcm9wJGRvYz1hWzBdLiRkb2N8fGFbM10pOnRoaXMucHJvcCRkb2M9YVszXX0sdHAkZG9jOlwiUHJvcGVydHkgYXR0cmlidXRlLlxcblxcbiAgZmdldFxcbiAgICBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBnZXR0aW5nIGFuIGF0dHJpYnV0ZSB2YWx1ZVxcbiAgZnNldFxcbiAgICBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBzZXR0aW5nIGFuIGF0dHJpYnV0ZSB2YWx1ZVxcbiAgZmRlbFxcbiAgICBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBkZWwnaW5nIGFuIGF0dHJpYnV0ZVxcbiAgZG9jXFxuICAgIGRvY3N0cmluZ1xcblxcblR5cGljYWwgdXNlIGlzIHRvIGRlZmluZSBhIG1hbmFnZWQgYXR0cmlidXRlIHg6XFxuXFxuY2xhc3MgQyhvYmplY3QpOlxcbiAgICBkZWYgZ2V0eChzZWxmKTogcmV0dXJuIHNlbGYuX3hcXG4gICAgZGVmIHNldHgoc2VsZiwgdmFsdWUpOiBzZWxmLl94ID0gdmFsdWVcXG4gICAgZGVmIGRlbHgoc2VsZik6IGRlbCBzZWxmLl94XFxuICAgIHggPSBwcm9wZXJ0eShnZXR4LCBzZXR4LCBkZWx4LCAnSSdtIHRoZSAneCcgcHJvcGVydHkuJylcXG5cXG5EZWNvcmF0b3JzIG1ha2UgZGVmaW5pbmcgbmV3IHByb3BlcnRpZXMgb3IgbW9kaWZ5aW5nIGV4aXN0aW5nIG9uZXMgZWFzeTpcXG5cXG5jbGFzcyBDKG9iamVjdCk6XFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgeChzZWxmKTpcXG4gICAgICAgICdJIGFtIHRoZSAneCcgcHJvcGVydHkuJ1xcbiAgICAgICAgcmV0dXJuIHNlbGYuX3hcXG4gICAgQHguc2V0dGVyXFxuICAgIGRlZiB4KHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIHNlbGYuX3ggPSB2YWx1ZVxcbiAgICBAeC5kZWxldGVyXFxuICAgIGRlZiB4KHNlbGYpOlxcbiAgICAgICAgZGVsIHNlbGYuX3hcIixcbnRwJGRlc2NyX2dldChhLGMpe2lmKG51bGw9PT1hKXJldHVybiB0aGlzO2lmKHZvaWQgMD09PXRoaXMucHJvcCRnZXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCJ1bnJlYWRhYmxlIGF0dHJpYnV0ZVwiKTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KHRoaXMucHJvcCRnZXQsW2FdKX0sdHAkZGVzY3Jfc2V0KGEsYyl7bGV0IGI7Yj1udWxsPT1jP3RoaXMucHJvcCRkZWw6dGhpcy5wcm9wJHNldDtpZihTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcImNhbid0IFwiKyhudWxsPT1jP1wiZGVsZXRlXCI6XCJzZXRcIikrXCIgYXR0cmlidXRlXCIpO2lmKCFiLnRwJGNhbGwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1wiJyBpcyBub3QgY2FsbGFibGVcIik7cmV0dXJuIG51bGw9PWM/Yi50cCRjYWxsKFthXSk6Yi50cCRjYWxsKFthLGNdKX19LFxubWV0aG9kczp7Z2V0dGVyOnskbWV0aChhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ucHJvcGVydHkoYSx0aGlzLnByb3Akc2V0LHRoaXMucHJvcCRkZWwsdGhpcy5wcm9wJGRvYyl9LCRmbGFnczp7T25lQXJnOiEwfX0sc2V0dGVyOnskbWV0aChhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ucHJvcGVydHkodGhpcy5wcm9wJGdldCxhLHRoaXMucHJvcCRkZWwsdGhpcy5wcm9wJGRvYyl9LCRmbGFnczp7T25lQXJnOiEwfX0sZGVsZXRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KHRoaXMucHJvcCRnZXQsdGhpcy5wcm9wJHNldCxhLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19fSxnZXRzZXRzOntmZ2V0OnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvcCRnZXR9fSxmc2V0OnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvcCRzZXR9fSxmZGVsOnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvcCRkZWx9fSxfX2RvY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvcCRkb2N9LFxuJHNldChhKXt0aGlzLnByb3AkZG9jPWE9YXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX19fSk7U2suYnVpbHRpbi5jbGFzc21ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiY2xhc3NtZXRob2RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5jbSRjYWxsYWJsZT1hO3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdH0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcImNsYXNzbWV0aG9kXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwiY2xhc3NtZXRob2RcIixhLDEsMSk7dGhpcy5jbSRjYWxsYWJsZT1hWzBdfSx0cCRkb2M6XCJjbGFzc21ldGhvZChmdW5jdGlvbikgLT4gbWV0aG9kXFxuXFxuQ29udmVydCBhIGZ1bmN0aW9uIHRvIGJlIGEgY2xhc3MgbWV0aG9kLlxcblxcbkEgY2xhc3MgbWV0aG9kIHJlY2VpdmVzIHRoZSBjbGFzcyBhcyBpbXBsaWNpdCBmaXJzdCBhcmd1bWVudCxcXG5qdXN0IGxpa2UgYW4gaW5zdGFuY2UgbWV0aG9kIHJlY2VpdmVzIHRoZSBpbnN0YW5jZS5cXG5UbyBkZWNsYXJlIGEgY2xhc3MgbWV0aG9kLCB1c2UgdGhpcyBpZGlvbTpcXG5cXG4gIGNsYXNzIEM6XFxuICAgICAgQGNsYXNzbWV0aG9kXFxuICAgICAgZGVmIGYoY2xzLCBhcmcxLCBhcmcyLCAuLi4pOlxcbiAgICAgICAgICAuLi5cXG5cXG5JdCBjYW4gYmUgY2FsbGVkIGVpdGhlciBvbiB0aGUgY2xhc3MgKGUuZy4gQy5mKCkpIG9yIG9uIGFuIGluc3RhbmNlXFxuKGUuZy4gQygpLmYoKSkuICBUaGUgaW5zdGFuY2UgaXMgaWdub3JlZCBleGNlcHQgZm9yIGl0cyBjbGFzcy5cXG5JZiBhIGNsYXNzIG1ldGhvZCBpcyBjYWxsZWQgZm9yIGEgZGVyaXZlZCBjbGFzcywgdGhlIGRlcml2ZWQgY2xhc3NcXG5vYmplY3QgaXMgcGFzc2VkIGFzIHRoZSBpbXBsaWVkIGZpcnN0IGFyZ3VtZW50LlxcblxcbkNsYXNzIG1ldGhvZHMgYXJlIGRpZmZlcmVudCB0aGFuIEMrKyBvciBKYXZhIHN0YXRpYyBtZXRob2RzLlxcbklmIHlvdSB3YW50IHRob3NlLCBzZWUgdGhlIHN0YXRpY21ldGhvZCBidWlsdGluLlwiLFxudHAkZGVzY3JfZ2V0KGEsYyl7Y29uc3QgYj10aGlzLmNtJGNhbGxhYmxlO2lmKHZvaWQgMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKFwidW5pbml0aWFsaXplZCBjbGFzc21ldGhvZCBvYmplY3RcIik7dm9pZCAwPT09YyYmKGM9YS5vYiR0eXBlKTtyZXR1cm4oYT1iLnRwJGRlc2NyX2dldCk/YS5jYWxsKGIsYyk6bmV3IFNrLmJ1aWx0aW4ubWV0aG9kKGIsYyl9fSxnZXRzZXRzOntfX2Z1bmNfXzp7JGdldCgpe3JldHVybiB0aGlzLmNtJGNhbGxhYmxlfX0sX19kaWN0X186U2suZ2VuZXJpYy5nZXRTZXREaWN0fX0pO1NrLmJ1aWx0aW4uc3RhdGljbWV0aG9kPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJzdGF0aWNtZXRob2RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5zbSRjYWxsYWJsZT1hO3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdH0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJG5ldzpTay5nZW5lcmljLm5ldyxcbnRwJGluaXQoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic3RhdGljbWV0aG9kXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic3RhdGljbWV0aG9kXCIsYSwxLDEpO3RoaXMuc20kY2FsbGFibGU9YVswXX0sdHAkZG9jOlwic3RhdGljbWV0aG9kKGZ1bmN0aW9uKSAtPiBtZXRob2RcXG5cXG5Db252ZXJ0IGEgZnVuY3Rpb24gdG8gYmUgYSBzdGF0aWMgbWV0aG9kLlxcblxcbkEgc3RhdGljIG1ldGhvZCBkb2VzIG5vdCByZWNlaXZlIGFuIGltcGxpY2l0IGZpcnN0IGFyZ3VtZW50LlxcblRvIGRlY2xhcmUgYSBzdGF0aWMgbWV0aG9kLCB1c2UgdGhpcyBpZGlvbTpcXG5cXG4gICAgIGNsYXNzIEM6XFxuICAgICAgICAgQHN0YXRpY21ldGhvZFxcbiAgICAgICAgIGRlZiBmKGFyZzEsIGFyZzIsIC4uLik6XFxuICAgICAgICAgICAgIC4uLlxcblxcbkl0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIG9uIHRoZSBjbGFzcyAoZS5nLiBDLmYoKSkgb3Igb24gYW4gaW5zdGFuY2VcXG4oZS5nLiBDKCkuZigpKS4gIFRoZSBpbnN0YW5jZSBpcyBpZ25vcmVkIGV4Y2VwdCBmb3IgaXRzIGNsYXNzLlxcblxcblN0YXRpYyBtZXRob2RzIGluIFB5dGhvbiBhcmUgc2ltaWxhciB0byB0aG9zZSBmb3VuZCBpbiBKYXZhIG9yIEMrKy5cXG5Gb3IgYSBtb3JlIGFkdmFuY2VkIGNvbmNlcHQsIHNlZSB0aGUgY2xhc3NtZXRob2QgYnVpbHRpbi5cIixcbnRwJGRlc2NyX2dldChhLGMpe2lmKHZvaWQgMD09PXRoaXMuc20kY2FsbGFibGUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKFwidW5pbml0aWFsaXplZCBzdGF0aWNtZXRob2Qgb2JqZWN0XCIpO3JldHVybiB0aGlzLnNtJGNhbGxhYmxlfX0sZ2V0c2V0czp7X19mdW5jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5zbSRjYWxsYWJsZX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH19KX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBlPXRoaXMudjtjPWMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGUmJlwibnVtYmVyXCI9PT10eXBlb2YgYyl7Y29uc3QgYj1hKGUsYyk7aWYoZChiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX1lPW4oZSk7Yz1uKGMpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIoZSxjKSl9cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1cbmZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xyl7bGV0IGQ9dGhpcy52O2M9Yy52O2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZCYmXCJudW1iZXJcIj09PXR5cGVvZiBjKXJldHVybiBhKGQsYyk7ZD1uKGQpO2M9bihjKTtyZXR1cm4gYihkLGMpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19ZnVuY3Rpb24gYihhLGIpe3JldHVybiBmdW5jdGlvbigpe2NvbnN0IGM9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYz9uZXcgU2suYnVpbHRpbi5pbnRfKGEoYykpOm5ldyBTay5idWlsdGluLmludF8oYihjKSl9fWZ1bmN0aW9uIGUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnYpfWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xyl7bGV0IGQ9dGhpcy52O2M9Yy52O2lmKDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yKFwiaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1wiKTtcbmlmKFwibnVtYmVyXCI9PT10eXBlb2YgZCYmXCJudW1iZXJcIj09PXR5cGVvZiBjKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEoZCxjKSk7ZD1uKGQpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLm51bWJlcklmU2FmZShiKGQsYykpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGwoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xyl7bGV0IGQ9dGhpcy52O2M9Yy52O2lmKDA9PT1kKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMudik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBjKXtpZigwPmMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5lZ2F0aXZlIHNoaWZ0IGNvdW50XCIpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZCl7Y29uc3QgYj1hKGQsYyk7aWYodm9pZCAwIT09YilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX1jPUpTQkkuQmlnSW50KGMpfWVsc2UgaWYoSlNCSS5sZXNzVGhhbihKU0JJLkJpZ0ludCgwKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5lZ2F0aXZlIHNoaWZ0IGNvdW50XCIpO1xuZD1uKGQpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIoZCxjKSl9cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe3ZhciBkPXRoaXMudjtjPWMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gZD1hKGQsYyksMD5kJiYoZCs9NDI5NDk2NzI5NiksbmV3IFNrLmJ1aWx0aW4uaW50XyhkKTtkPW4oZCk7Yz1uKGMpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkubnVtYmVySWZTYWZlKGIoZCxjKSkpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19ZnVuY3Rpb24gZChhKXtyZXR1cm4gYTw9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVImJmE+PS1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1mdW5jdGlvbiBnKGEpe3JldHVybiBhPD1cbk51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZhPj0tTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI/K2E6SlNCSS5CaWdJbnQoYSl9ZnVuY3Rpb24gbihhKXtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGE/SlNCSS5CaWdJbnQoYSk6YX1Tay5idWlsdGluLmludF89U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImludFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfLFwiYmFkIGNhbGwgdG8gaW50IHVzZSAnbmV3J1wiKTtsZXQgYjtpZihcIm51bWJlclwiPT09dHlwZW9mIGF8fEpTQkkuX19pc0JpZ0ludChhKSliPWE7ZWxzZSBpZih2b2lkIDA9PT1hKWI9MDtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSliPWcoYSk7ZWxzZXtpZihhLm5iJGludClyZXR1cm4gYS5uYiRpbnQoKTtTay5hc3NlcnRzLmZhaWwoXCJiYWQgYXJndW1lbnQgdG8gaW50IGNvbnN0cnVjdG9yXCIpfXRoaXMudj1ifSxzbG90czp7dHAkYXNfbnVtYmVyOiEwLFxudHAkZG9jOlwiaW50KHg9MCkgLT4gaW50ZWdlclxcbmludCh4LCBiYXNlPTEwKSAtPiBpbnRlZ2VyXFxuXFxuQ29udmVydCBhIG51bWJlciBvciBzdHJpbmcgdG8gYW4gaW50ZWdlciwgb3IgcmV0dXJuIDAgaWYgbm8gYXJndW1lbnRzXFxuYXJlIGdpdmVuLiAgSWYgeCBpcyBhIG51bWJlciwgcmV0dXJuIHguX19pbnRfXygpLiAgRm9yIGZsb2F0aW5nIHBvaW50XFxubnVtYmVycywgdGhpcyB0cnVuY2F0ZXMgdG93YXJkcyB6ZXJvLlxcblxcbklmIHggaXMgbm90IGEgbnVtYmVyIG9yIGlmIGJhc2UgaXMgZ2l2ZW4sIHRoZW4geCBtdXN0IGJlIGEgc3RyaW5nLFxcbmJ5dGVzLCBvciBieXRlYXJyYXkgaW5zdGFuY2UgcmVwcmVzZW50aW5nIGFuIGludGVnZXIgbGl0ZXJhbCBpbiB0aGVcXG5naXZlbiBiYXNlLiAgVGhlIGxpdGVyYWwgY2FuIGJlIHByZWNlZGVkIGJ5ICcrJyBvciAnLScgYW5kIGJlIHN1cnJvdW5kZWRcXG5ieSB3aGl0ZXNwYWNlLiAgVGhlIGJhc2UgZGVmYXVsdHMgdG8gMTAuICBWYWxpZCBiYXNlcyBhcmUgMCBhbmQgMi0zNi5cXG5CYXNlIDAgbWVhbnMgdG8gaW50ZXJwcmV0IHRoZSBiYXNlIGZyb20gdGhlIHN0cmluZyBhcyBhbiBpbnRlZ2VyIGxpdGVyYWwuXFxuPj4+IGludCgnMGIxMDAnLCBiYXNlPTApXFxuNFwiLFxuJHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b1N0cmluZygpKX0sdHAkaGFzaCgpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT9hOkpTQkkudG9OdW1iZXIoSlNCSS5yZW1haW5kZXIoYSxKU0JJLl9fTUFYX1NBRkUpKX0sdHAkbmV3KGEsYil7MT09PWEubGVuZ3RoKyhiP2IubGVuZ3RoOjApPyhiPWFbMF0sYT1Tay5idWlsdGluLm5vbmUubm9uZSQpOihhPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiaW50XCIsW251bGwsXCJiYXNlXCJdLGEsYixbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdKSxiPWFbMF0sYT1hWzFdKTthPWEhPT1Tay5idWlsdGluLm5vbmUubm9uZSQ/U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSk6bnVsbDtpZihiIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpbnVsbD09PWEmJihhPTEwKSxiPW5ldyBTay5idWlsdGluLmludF8oU2suc3RyMm51bWJlcihiLnYsXG5hKSk7ZWxzZXtpZihudWxsIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpbnQoKSBjYW4ndCBjb252ZXJ0IG5vbi1zdHJpbmcgd2l0aCBleHBsaWNpdCBiYXNlXCIpO2lmKGIubmIkaW50KWI9Yi5uYiRpbnQoKTtlbHNlIGlmKGE9U2suYWJzdHIubG9va3VwU3BlY2lhbChiLFNrLmJ1aWx0aW4uc3RyLiR0cnVuYykpe2E9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW10pO2lmKCFTay5idWlsdGluLmNoZWNrSW50KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihTay5idWlsdGluLnN0ci4kdHJ1bmMuJGpzc3RyKCkrXCIgcmV0dXJuZWQgbm9uLUludGVncmFsICh0eXBlIFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1wiKVwiKTtiPW5ldyBTay5idWlsdGluLmludF8oYS52KX1lbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImludCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIGEgYnl0ZXMtbGlrZSBvYmplY3Qgb3IgYSBudW1iZXIsIG5vdCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShiKStcIidcIik7fWlmKHRoaXM9PT1Tay5idWlsdGluLmludF8ucHJvdG90eXBlKXJldHVybiBiO2E9bmV3IHRoaXMuY29uc3RydWN0b3I7YS52PWIudjtyZXR1cm4gYX0sdHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsb2IkZXE6YygoYSxiKT0+YT09YixKU0JJLmVxdWFsKSxvYiRuZTpjKChhLGIpPT5hIT1iLEpTQkkubm90RXF1YWwpLG9iJGd0OmMoKGEsYik9PmE+YixKU0JJLmdyZWF0ZXJUaGFuKSxvYiRnZTpjKChhLGIpPT5hPj1iLEpTQkkuZ3JlYXRlclRoYW5PckVxdWFsKSxvYiRsdDpjKChhLGIpPT5hPGIsSlNCSS5sZXNzVGhhbiksb2IkbGU6YygoYSxiKT0+YTw9YixKU0JJLmxlc3NUaGFuT3JFcXVhbCksbmIkaW50OmUsbmIkaW5kZXgoKXtyZXR1cm4gdGhpcy52fSxuYiRmbG9hdCgpe3ZhciBhPXRoaXMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKTthPXBhcnNlRmxvYXQoSlNCSS50b051bWJlcihhKSk7XG5pZihJbmZpbml0eT09PWF8fC1JbmZpbml0eT09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcImludCB0b28gbGFyZ2UgdG8gY29udmVydCB0byBmbG9hdFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfSxuYiRpc25lZ2F0aXZlKCl7Y29uc3QgYT10aGlzLnY7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhPzA+YTpKU0JJLmxlc3NUaGFuKGEsSlNCSS5fX1pFUk8pfSxuYiRpc3Bvc2l0aXZlKCl7Y29uc3QgYT10aGlzLnY7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhPzA+YTpKU0JJLmdyZWF0ZXJUaGFuT3JFcXVhbChhLEpTQkkuX19aRVJPKX0sbmIkYm9vbCgpe3JldHVybiAwIT09dGhpcy52fSxuYiRwb3NpdGl2ZTplLG5iJG5lZ2F0aXZlOmIoYT0+LWEsSlNCSS51bmFyeU1pbnVzKSxuYiRhZGQ6YSgoYSxiKT0+YStiLChhLGIpPT5KU0JJLm51bWJlcklmU2FmZShKU0JJLmFkZChhLGIpKSksbmIkc3VidHJhY3Q6YSgoYSxiKT0+YS1iLChhLGIpPT5cbkpTQkkubnVtYmVySWZTYWZlKEpTQkkuc3VidHJhY3QoYSxiKSkpLG5iJG11bHRpcGx5OmEoKGEsYik9PmEqYixKU0JJLm11bHRpcGx5KSxuYiRkaXZpZGUoYSl7cmV0dXJuIFNrLl9fZnV0dXJlX18uZGl2aXNpb24/dGhpcy5uYiRmbG9hdCgpLm5iJGRpdmlkZShhKTp0aGlzLm5iJGZsb29yX2RpdmlkZShhKX0sbmIkZmxvb3JfZGl2aWRlOmYoKGEsYik9Pk1hdGguZmxvb3IoYS9iKSxKU0JJLmRpdmlkZSksbmIkcmVtYWluZGVyOmYoKGEsYik9PmEtTWF0aC5mbG9vcihhL2IpKmIsSlNCSS5yZW1haW5kZXIpLG5iJGRpdm1vZChhKXtjb25zdCBiPXRoaXMubmIkZmxvb3JfZGl2aWRlKGEpO2E9dGhpcy5uYiRyZW1haW5kZXIoYSk7cmV0dXJuIGI9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJHx8YT09PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkP1NrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkOm5ldyBTay5idWlsdGluLnR1cGxlKFtiLFxuYV0pfSxuYiRhbmQ6aCgoYSxiKT0+YSZiLEpTQkkuYml0d2lzZUFuZCksbmIkb3I6aCgoYSxiKT0+YXxiLEpTQkkuYml0d2lzZU9yKSxuYiR4b3I6aCgoYSxiKT0+YV5iLEpTQkkuYml0d2lzZVhvciksbmIkYWJzOmIoTWF0aC5hYnMsYT0+SlNCSS5sZXNzVGhhbihhLEpTQkkuX19aRVJPKT9KU0JJLnVuYXJ5TWludXMoYSk6YSksbmIkbHNoaWZ0OmwoKGEsYik9PntpZig1Mz5iJiYoYT0yKmEqcFtiXSxkKGEpKSlyZXR1cm4gYX0sSlNCSS5sZWZ0U2hpZnQpLG5iJHJzaGlmdDpsKChhLGIpPT57Y29uc3QgYz1hPj5iO3JldHVybiAwPGEmJjA+Yz9jJk1hdGgucG93KDIsMzItYiktMTpjfSwoYSxiKT0+SlNCSS5udW1iZXJJZlNhZmUoSlNCSS5zaWduZWRSaWdodFNoaWZ0KGEsYikpKSxuYiRpbnZlcnQ6YihhPT5+YSxKU0JJLmJpdHdpc2VOb3QpLG5iJHBvd2VyKGEsYil7bGV0IGM7dm9pZCAwIT09YiYmU2suYnVpbHRpbi5jaGVja05vbmUoYikmJihiPXZvaWQgMCk7aWYoYSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLmludF8mJih2b2lkIDA9PT1ifHxiIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKSl7bGV0IGU9dGhpcy52LGY9YS52O2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZSYmXCJudW1iZXJcIj09PXR5cGVvZiBmKXtjb25zdCBhPU1hdGgucG93KGUsZik7aWYoZChhKSYmKGM9MD5mP25ldyBTay5idWlsdGluLmZsb2F0XyhhKTpuZXcgU2suYnVpbHRpbi5pbnRfKGEpLHZvaWQgMD09PWIpKXJldHVybiBjfWlmKHZvaWQgMCE9PWIpe2lmKGEubmIkaXNuZWdhdGl2ZSgpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJwb3coKSAybmQgYXJndW1lbnQgY2Fubm90IGJlIG5lZ2F0aXZlIHdoZW4gM3JkIGFyZ3VtZW50IHNwZWNpZmllZFwiKTtpZigwPT09Yi52KXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJwb3coKSAzcmQgYXJndW1lbnQgY2Fubm90IGJlIDBcIik7cmV0dXJuIHZvaWQgMCE9PWM/Yy5uYiRyZW1haW5kZXIoYik6bmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLnBvd2VybW9kKG4oZSksXG5uKGYpLG4oYi52KSkpfXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkuZXhwb25lbnRpYXRlKG4oZSksbihmKSkpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH0sbmIkbG9uZygpe3JldHVybiBuZXcgU2suYnVpbHRpbi5sbmcodGhpcy52KX19LGdldHNldHM6e3JlYWw6eyRnZXQ6ZSwkZG9jOlwidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyXCJ9LGltYWc6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XygwKX0sJGRvYzpcInRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyXCJ9fSxtZXRob2RzOntjb25qdWdhdGU6eyRtZXRoOmUsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybnMgc2VsZiwgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGFueSBpbnQuXCJ9LGJpdF9sZW5ndGg6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oU2suYnVpbHRpbi5iaW4odGhpcykuc3EkbGVuZ3RoKCktXG4yKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJOdW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVwcmVzZW50IHNlbGYgaW4gYmluYXJ5Llxcblxcbj4+PiBiaW4oMzcpXFxuJzBiMTAwMTAxJ1xcbj4+PiAoMzcpLmJpdF9sZW5ndGgoKVxcbjZcIn0sdG9fYnl0ZXM6eyRtZXRoKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XCIpO30sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGxlbmd0aCwgYnl0ZW9yZGVyLCAqLCBzaWduZWQ9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhbiBhcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYW4gaW50ZWdlci5cXG5cXG4gIGxlbmd0aFxcbiAgICBMZW5ndGggb2YgYnl0ZXMgb2JqZWN0IHRvIHVzZS4gIEFuIE92ZXJmbG93RXJyb3IgaXMgcmFpc2VkIGlmIHRoZVxcbiAgICBpbnRlZ2VyIGlzIG5vdCByZXByZXNlbnRhYmxlIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcy5cXG4gIGJ5dGVvcmRlclxcbiAgICBUaGUgYnl0ZSBvcmRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgaW50ZWdlci4gIElmIGJ5dGVvcmRlciBpcyAnYmlnJyxcXG4gICAgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBieXRlIGFycmF5LiAgSWZcXG4gICAgYnl0ZW9yZGVyIGlzICdsaXR0bGUnLCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGlzIGF0IHRoZSBlbmQgb2YgdGhlXFxuICAgIGJ5dGUgYXJyYXkuICBUbyByZXF1ZXN0IHRoZSBuYXRpdmUgYnl0ZSBvcmRlciBvZiB0aGUgaG9zdCBzeXN0ZW0sIHVzZVxcbiAgICBgc3lzLmJ5dGVvcmRlcicgYXMgdGhlIGJ5dGUgb3JkZXIgdmFsdWUuXFxuICBzaWduZWRcXG4gICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHR3bydzIGNvbXBsZW1lbnQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGludGVnZXIuXFxuICAgIElmIHNpZ25lZCBpcyBGYWxzZSBhbmQgYSBuZWdhdGl2ZSBpbnRlZ2VyIGlzIGdpdmVuLCBhbiBPdmVyZmxvd0Vycm9yXFxuICAgIGlzIHJhaXNlZC5cIn0sXG5fX3RydW5jX186eyRtZXRoOmUsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlRydW5jYXRpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuXCJ9LF9fZmxvb3JfXzp7JG1ldGg6ZSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRmxvb3JpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuXCJ9LF9fY2VpbF9fOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJDZWlsaW5nIG9mIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlwifSxfX3JvdW5kX186eyRtZXRoKGEpe3JldHVybiB0aGlzLnJvdW5kJChhKX0sJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSb3VuZGluZyBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi5cXG5Sb3VuZGluZyB3aXRoIGFuIG5kaWdpdHMgYXJndW1lbnQgYWxzbyByZXR1cm5zIGFuIGludGVnZXIuXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnYpXSl9LFxuJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6U2suYnVpbHRpbi5ub25lLm5vbmUkfSxfX2Zvcm1hdF9fOnskbWV0aDpTay5mb3JtYXR0aW5nLm1rTnVtYmVyX19mb3JtYXRfXyghMSksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBmb3JtYXRfc3BlYywgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LHByb3RvOntzdHIkKGEsYil7YT12b2lkIDA9PT1hfHwxMD09PWE/dGhpcy52LnRvU3RyaW5nKCk6dGhpcy52LnRvU3RyaW5nKGEpO2J8fHZvaWQgMD09PWJ8fFwiLVwiPT09YVswXSYmKGE9YS5zdWJzdHJpbmcoMSkpO3JldHVybiBhfSxyb3VuZCQoYSl7YT12b2lkIDA9PT1hPzA6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpO3ZhciBiPXRoaXMudixjPU1hdGgucG93KDEwLC1hKTtpZigwPGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBiJiZTay5fX2Z1dHVyZV9fLmJhbmtlcnNfcm91bmRpbmcpcmV0dXJuIGE9XG5iL2MsYj1NYXRoLnJvdW5kKGEpLG5ldyBTay5idWlsdGluLmludF8oKC41PT09KDA8YT9hOi1hKSUxPzA9PT1iJTI/YjpiLTE6YikqYyk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBiKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKE1hdGgucm91bmQoYi9jKSpjKTt7Yz1KU0JJLkJpZ0ludCgxMCpjKTthPUpTQkkuQmlnSW50KDEwKTtiPUpTQkkuZGl2aWRlKGIsYyk7Y29uc3QgZD1KU0JJLmRpdmlkZShiLGEpLGU9SlNCSS5zdWJ0cmFjdChiLEpTQkkubXVsdGlwbHkoYSxkKSk7NT5KU0JJLnRvTnVtYmVyKGUpP2I9SlNCSS5tdWx0aXBseShKU0JJLm11bHRpcGx5KGQsYSksYyk6SlNCSS5tdWx0aXBseShKU0JJLm11bHRpcGx5KEpTQkkuYWRkKGQsSlNCSS5CaWdJbnQoMSksYSksYykpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5pbnRfXCIsU2suYnVpbHRpbi5pbnRfKTtjb25zdCBrPS9fKD89W15fXSkvZztTay5zdHIybnVtYmVyPVxuZnVuY3Rpb24oYSxiKXt2YXIgYz1hLGU9ITEsZjthPWEucmVwbGFjZSgvXlxccyt8XFxzKyQvZyxcIlwiKTtcIi1cIj09PWEuY2hhckF0KDApJiYoZT0hMCxhPWEuc3Vic3RyaW5nKDEpKTtcIitcIj09PWEuY2hhckF0KDApJiYoYT1hLnN1YnN0cmluZygxKSk7aWYobnVsbD09PWJ8fHZvaWQgMD09PWIpYj0xMDtpZigoMj5ifHwzNjxiKSYmMCE9PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludCgpIGJhc2UgbXVzdCBiZSA+PSAyIGFuZCA8PSAzNlwiKTtcInN0cmluZ1wiPT09dHlwZW9mIGImJihiPU51bWJlcihiKSk7aWYoXCIweFwiPT09YS5zdWJzdHJpbmcoMCwyKS50b0xvd2VyQ2FzZSgpKWlmKDE2PT09Ynx8MD09PWIpYT1hLnN1YnN0cmluZygyKSxiPTE2O2Vsc2V7aWYoMzQ+Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO31lbHNlIGlmKFwiMGJcIj09PWEuc3Vic3RyaW5nKDAsXG4yKS50b0xvd2VyQ2FzZSgpKWlmKDI9PT1ifHwwPT09YilhPWEuc3Vic3RyaW5nKDIpLGI9MjtlbHNle2lmKDEyPmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBvXCI9PT1hLnN1YnN0cmluZygwLDIpLnRvTG93ZXJDYXNlKCkpaWYoOD09PWJ8fDA9PT1iKWE9YS5zdWJzdHJpbmcoMiksYj04O2Vsc2V7aWYoMjU+Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO31lbHNlIGlmKFwiMFwiPT09YS5jaGFyQXQoMCkpe2lmKFwiMFwiPT09YSlyZXR1cm4gMDtpZig4PT09Ynx8MD09PWIpYj04fTA9PT1iJiYoYj0xMCk7aWYoLTEhPT1hLmluZGV4T2YoXCJfXCIpKXtpZigtMSE9PWEuaW5kZXhPZihcIl9fXCIpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitcbmIrXCI6ICdcIitjK1wiJ1wiKTthPTEwIT09Yj9hLnJlcGxhY2UoayxcIlwiKTphLmNoYXJBdCgwKSthLnN1YnN0cmluZygxKS5yZXBsYWNlKGssXCJcIil9aWYoMD09PWEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7Zm9yKGY9MDtmPGEubGVuZ3RoO2YrPTEpe3ZhciBnPWEuY2hhckNvZGVBdChmKTt2YXIgaD1iOzQ4PD1nJiY1Nz49Zz9oPWctNDg6NjU8PWcmJjkwPj1nP2g9Zy02NSsxMDo5Nzw9ZyYmMTIyPj1nJiYoaD1nLTk3KzEwKTtpZihoPj1iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7fWUmJihhPVwiLVwiK2EpO2g9cGFyc2VJbnQoYSxiKTtpZihkKGgpKXJldHVybiBoO2M9ITE7XCItXCI9PT1hWzBdJiYoYz0hMCxhPWEuc3Vic3RyaW5nKDEpKTtiPUpTQkkuQmlnSW50KGIpO1xuZT1KU0JJLkJpZ0ludCgxKTtmPUpTQkkuQmlnSW50KDApO2ZvcihnPWEubGVuZ3RoLTE7MDw9ZztnLS0paD1hLmNoYXJDb2RlQXQoZyksNDg8PWgmJjU3Pj1oP2gtPTQ4OjY1PD1oJiY5MD49aD9oPWgtNjUrMTA6OTc8PWgmJjEyMj49aCYmKGg9aC05NysxMCksaD1KU0JJLm11bHRpcGx5KEpTQkkuQmlnSW50KGgpLGUpLGY9SlNCSS5hZGQoZixoKSxlPUpTQkkubXVsdGlwbHkoZSxiKTtjJiYoZj1KU0JJLm11bHRpcGx5KGYsSlNCSS5CaWdJbnQoLTEpKSk7cmV0dXJuIGE9Zn07U2suYnVpbHRpbi5pbnRfLnB5MiRtZXRob2RzPXt9O1NrLmxvbmdGcm9tU3RyPWZ1bmN0aW9uKGEsYil7aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGcoYSkpO2E9U2suc3RyMm51bWJlcihhLGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5sbmcoYSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmxvbmdGcm9tU3RyXCIsU2subG9uZ0Zyb21TdHIpO1NrLmJ1aWx0aW4uaW50Xy53aXRoaW5UaHJlc2hvbGQ9XG5kO1NrLmJ1aWx0aW4uaW50Xy5zdHJpbmdUb051bWJlck9yQmlnPWc7Y29uc3QgcD1bLjUsMSwyLDQsOCwxNiwzMiw2NCwxMjgsMjU2LDUxMiwxMDI0LDIwNDgsNDA5Niw4MTkyLDE2Mzg0LDMyNzY4LDY1NTM2LDEzMTA3MiwyNjIxNDQsNTI0Mjg4LDEwNDg1NzYsMjA5NzE1Miw0MTk0MzA0LDgzODg2MDgsMTY3NzcyMTYsMzM1NTQ0MzIsNjcxMDg4NjQsMTM0MjE3NzI4LDI2ODQzNTQ1Niw1MzY4NzA5MTIsMTA3Mzc0MTgyNCwyMTQ3NDgzNjQ4LDQyOTQ5NjcyOTYsODU4OTkzNDU5MiwxNzE3OTg2OTE4NCwzNDM1OTczODM2OCw2ODcxOTQ3NjczNiwxMzc0Mzg5NTM0NzIsMjc0ODc3OTA2OTQ0LDU0OTc1NTgxMzg4OCwxMDk5NTExNjI3Nzc2LDIxOTkwMjMyNTU1NTIsNDM5ODA0NjUxMTEwNCw4Nzk2MDkzMDIyMjA4LDE3NTkyMTg2MDQ0NDE2LDM1MTg0MzcyMDg4ODMyLDcwMzY4NzQ0MTc3NjY0LDB4ODAwMDAwMDAwMDAwLDI4MTQ3NDk3NjcxMDY1Niw1NjI5NDk5NTM0MjEzMTIsMHg0MDAwMDAwMDAwMDAwLFxuMHg4MDAwMDAwMDAwMDAwLDQ1MDM1OTk2MjczNzA0OTYsOTAwNzE5OTI1NDc0MDk5Ml07U2suYnVpbHRpbi5sbmc9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImxvbmdcIix7YmFzZTpTay5idWlsdGluLmludF8sY29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5pbnRfLmNhbGwodGhpcyxhKX0sc2xvdHM6eyRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKStcIkxcIil9LHRwJGFzX251bWJlcjohMCxuYiRuZWdhdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5sbmcodS5uYiRuZWdhdGl2ZS5jYWxsKHRoaXMpLnYpfSxuYiRwb3NpdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5sbmcodS5uYiRwb3NpdGl2ZS5jYWxsKHRoaXMpLnYpfX19KTtjb25zdCB1PVNrLmJ1aWx0aW4uaW50Xy5wcm90b3R5cGV9LGZ1bmN0aW9uKG0scSl7Y29uc3QgYT1Tay5idWlsdGluLmludF8ucHJvdG90eXBlO1NrLmJ1aWx0aW4uYm9vbD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiYm9vbFwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5pc1RydWUoYSk/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9LGJhc2U6U2suYnVpbHRpbi5pbnRfLHNsb3RzOnt0cCRkb2M6XCJib29sKHgpIC0+IGJvb2xcXG5cXG5SZXR1cm5zIFRydWUgd2hlbiB0aGUgYXJndW1lbnQgeCBpcyB0cnVlLCBGYWxzZSBvdGhlcndpc2UuXFxuVGhlIGJ1aWx0aW5zIFRydWUgYW5kIEZhbHNlIGFyZSB0aGUgb25seSB0d28gaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBib29sLlxcblRoZSBjbGFzcyBib29sIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGNsYXNzIGludCwgYW5kIGNhbm5vdCBiZSBzdWJjbGFzc2VkLlwiLHRwJG5ldyhhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJib29sXCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwiYm9vbFwiLGEsMCwxKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChhWzBdKX0sJHIoKXtyZXR1cm4gdGhpcy52P3RoaXMuc3RyJFRydWU6XG50aGlzLnN0ciRGYWxzZX0sdHAkYXNfbnVtYmVyOiEwLG5iJGFuZChjKXtyZXR1cm4gYy5vYiR0eXBlPT09U2suYnVpbHRpbi5ib29sP25ldyBTay5idWlsdGluLmJvb2wodGhpcy52JmMudik6YS5uYiRhbmQuY2FsbCh0aGlzLGMpfSxuYiRvcihjKXtyZXR1cm4gYy5vYiR0eXBlPT09U2suYnVpbHRpbi5ib29sP25ldyBTay5idWlsdGluLmJvb2wodGhpcy52fGMudik6YS5uYiRvci5jYWxsKHRoaXMsYyl9LG5iJHhvcihjKXtyZXR1cm4gYy5vYiR0eXBlPT09U2suYnVpbHRpbi5ib29sP25ldyBTay5idWlsdGluLmJvb2wodGhpcy52XmMudik6YS5uYiR4b3IuY2FsbCh0aGlzLGMpfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX0sbWV0aG9kczp7X19mb3JtYXRfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kcigpfSwkZmxhZ3M6e09uZUFyZzohMH19fSxwcm90bzp7c3RyJEZhbHNlOm5ldyBTay5idWlsdGluLnN0cihcIkZhbHNlXCIpLHN0ciRUcnVlOm5ldyBTay5idWlsdGluLnN0cihcIlRydWVcIil9fSk7XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmJvb2xcIixTay5idWlsdGluLmJvb2wpO1NrLmJ1aWx0aW4uYm9vbC50cnVlJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4uYm9vbC5wcm90b3R5cGUse3Y6e3ZhbHVlOjEsZW51bWVyYWJsZTohMH19KTtTay5idWlsdGluLmJvb2wuZmFsc2UkPU9iamVjdC5jcmVhdGUoU2suYnVpbHRpbi5ib29sLnByb3RvdHlwZSx7djp7dmFsdWU6MCxlbnVtZXJhYmxlOiEwfX0pfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMudil9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7Y29uc3QgYz10aGlzLnY7Yj1iLnY7aWYoXCJudW1iZXJcIiE9PXR5cGVvZiBiKWlmKEpTQkkuX19pc0JpZ0ludChiKSl7aWYoYj1wYXJzZUZsb2F0KEpTQkkudG9OdW1iZXIoYikpLEluZmluaXR5PT1ifHwtSW5maW5pdHk9PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcImludCB0b28gbGFyZ2UgdG8gY29udmVydCB0byBmbG9hdFwiKTtcbn1lbHNlIHJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtyZXR1cm4gYShjLGIpfX1mdW5jdGlvbiBiKGEpe2NvbnN0IGI9YyhhKTtyZXR1cm4gZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jJiYhU2suYnVpbHRpbi5jaGVja05vbmUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwicG93KCkgM3JkIGFyZ3VtZW50IG5vdCBhbGxvd2VkIHVubGVzcyBhbGwgYXJndW1lbnRzIGFyZSBpbnRlZ2Vyc1wiKTtyZXR1cm4gYi5jYWxsKHRoaXMsYSl9fWZ1bmN0aW9uIGUoYSxiKXtpZigwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7cmV0dXJuIEluZmluaXR5PT09YT9JbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik6MD5iP25ldyBTay5idWlsdGluLmZsb2F0XygtSW5maW5pdHkpOm5ldyBTay5idWlsdGluLmZsb2F0XyhJbmZpbml0eSk6XG4tSW5maW5pdHk9PT1hP0luZmluaXR5PT09Ynx8LUluZmluaXR5PT09YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oTmFOKTowPmI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKEluZmluaXR5KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oLUluZmluaXR5KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYS9iKX1mdW5jdGlvbiBmKGEsYil7aWYoSW5maW5pdHk9PT1hfHwtSW5maW5pdHk9PT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oTmFOKTtpZigwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7cmV0dXJuIEluZmluaXR5PT09Yj8wPmE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0xKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMCk6LUluZmluaXR5PT09Yj8wPmF8fDAhPT1hP25ldyBTay5idWlsdGluLmZsb2F0XygwKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oLTEpOm5ldyBTay5idWlsdGluLmZsb2F0XyhNYXRoLmZsb29yKGEvXG5iKSl9ZnVuY3Rpb24gbChhLGIpe2lmKDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yKFwiaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1wiKTtpZigwPT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApO2lmKEluZmluaXR5PT09YilyZXR1cm4gSW5maW5pdHk9PT1hfHwtSW5maW5pdHk9PT10aGlzLnY/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik6MDxhP25ldyBTay5idWlsdGluLmZsb2F0XyhhKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oSW5maW5pdHkpO2xldCBjPWElYjswPmE/MDxiJiYwPmMmJihjKz1iKTowPmImJjAhPT1jJiYoYys9Yik7MD09PWMmJigwPmI/Yz0tMDotSW5maW5pdHk9PT1JbmZpbml0eS9jJiYoYz0wKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX1mdW5jdGlvbiBoKGEsYil7aWYoMD5hJiYwIT09YiUxKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBudW1iZXIgY2Fubm90IGJlIHJhaXNlZCB0byBhIGZyYWN0aW9uYWwgcG93ZXJcIik7XG5pZigwPT09YSYmMD5iKXRocm93IG5ldyBTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yKFwiMC4wIGNhbm5vdCBiZSByYWlzZWQgdG8gYSBuZWdhdGl2ZSBwb3dlclwiKTtjb25zdCBjPU1hdGgucG93KGEsYik7aWYoSW5maW5pdHk9PT1NYXRoLmFicyhjKSYmSW5maW5pdHkhPT1NYXRoLmFicyhhKSYmSW5maW5pdHkhPT1NYXRoLmFicyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKFwiTnVtZXJpY2FsIHJlc3VsdCBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX1jb25zdCBkPU9iamVjdC5jcmVhdGUobnVsbCx7SW5maW5pdHk6e3ZhbHVlOjMxNDE1OX0sXCItSW5maW5pdHlcIjp7dmFsdWU6LTMxNDE1OX0sTmFOOnt2YWx1ZTowfX0pO1NrLmJ1aWx0aW4uZmxvYXRfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJmbG9hdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8sXG5cImJhZCBjYWxsIHRvIGZsb2F0IHVzZSAnbmV3J1wiKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpdGhpcy52PWE7ZWxzZSBpZih2b2lkIDA9PT1hKXRoaXMudj0wO2Vsc2UgaWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXRoaXMudj1wYXJzZUZsb2F0KGEpO2Vsc2V7aWYoYS5uYiRmbG9hdClyZXR1cm4gYS5uYiRmbG9hdCgpO1NrLmFzc2VydHMuZmFpbChcImJhZCBhcmd1bWVudCB0byBmbG9hdCBjb25zdHJ1Y3RvclwiKX19LHNsb3RzOnt0cCRnZXR0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfbnVtYmVyOiEwLHRwJGRvYzpcIkNvbnZlcnQgYSBzdHJpbmcgb3IgbnVtYmVyIHRvIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBpZiBwb3NzaWJsZS5cIix0cCRoYXNoKCl7Y29uc3QgYT10aGlzLnY7bGV0IGI9ZFthXTtpZih2b2lkIDAhPT1iKXJldHVybiBiO2I9TnVtYmVyLmlzSW50ZWdlcihhKT90aGlzLm5iJGludCgpLnRwJGhhc2goKTpNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVItXG5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUi8yKTtyZXR1cm4gZFt0aGlzLnZdPWJ9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnN0ciQoMTAsITApKX0sdHAkbmV3KGEsYil7aWYoYiYmYi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZmxvYXQoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50c1wiKTtpZihhJiYxPGEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZsb2F0IGV4cGVjdGVkIGF0IG1vc3QgMSBhcmd1bWVudHMsIGdvdCBcIithLmxlbmd0aCk7YT1hWzBdO2lmKHZvaWQgMD09PWEpdmFyIGM9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApO2Vsc2UgaWYoYS5uYiRmbG9hdCljPWEubmIkZmxvYXQoKTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpe2M9YS52O2E9YztpZigtMSE9PWMuaW5kZXhPZihcIl9cIikpe2lmKGcudGVzdChjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGZsb2F0OiAnXCIrXG5jK1wiJ1wiKTthPWMuY2hhckF0KDApK2Muc3Vic3RyaW5nKDEpLnJlcGxhY2UobixcIlwiKX1pZihjLm1hdGNoKC9eLWluZiQvaSkpdmFyIGQ9LUluZmluaXR5O2Vsc2UgYy5tYXRjaCgvXlsrXT9pbmYkL2kpP2Q9SW5maW5pdHk6Yy5tYXRjaCgvXlstK10/bmFuJC9pKT9kPU5hTjppc05hTihhKXx8KGQ9cGFyc2VGbG9hdChhKSxOdW1iZXIuaXNOYU4oZCkmJihkPXZvaWQgMCkpO2lmKHZvaWQgMD09PWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byBmbG9hdDogXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihuZXcgU2suYnVpbHRpbi5zdHIoYykpKTtjPW5ldyBTay5idWlsdGluLmZsb2F0XyhkKX1pZih2b2lkIDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZsb2F0KCkgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhIG51bWJlclwiKTtpZih0aGlzPT09U2suYnVpbHRpbi5mbG9hdF8ucHJvdG90eXBlKXJldHVybiBjO1xuZD1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtkLnY9Yy52O3JldHVybiBkfSxuYiRpbnQoKXtsZXQgYT10aGlzLnY7YT0wPmE/TWF0aC5jZWlsKGEpOk1hdGguZmxvb3IoYSk7aWYoIU51bWJlci5pc0ludGVnZXIoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNhbm5vdCBjb252ZXJ0IGZsb2F0IFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcykrXCIgdG8gaW50ZWdlclwiKTtyZXR1cm4gU2suYnVpbHRpbi5pbnRfLndpdGhpblRocmVzaG9sZChhKT9uZXcgU2suYnVpbHRpbi5pbnRfKGEpOm5ldyBTay5idWlsdGluLmludF8oSlNCSS5CaWdJbnQoYSkpfSxuYiRmbG9hdDphLG5iJGxvbmcoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHRoaXMubmIkaW50KCkudil9LG5iJGFkZDpjKChhLGIpPT5uZXcgU2suYnVpbHRpbi5mbG9hdF8oYStiKSksbmIkc3VidHJhY3Q6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEtYikpLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpjKChhLFxuYik9Pm5ldyBTay5idWlsdGluLmZsb2F0XyhiLWEpKSxuYiRtdWx0aXBseTpjKChhLGIpPT5uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSpiKSksbmIkZGl2aWRlOmMoZSksbmIkcmVmbGVjdGVkX2RpdmlkZTpjKChhLGIpPT5lKGIsYSkpLG5iJGZsb29yX2RpdmlkZTpjKGYpLG5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGU6YygoYSxiKT0+ZihiLGEpKSxuYiRyZW1haW5kZXI6YyhsKSxuYiRyZWZsZWN0ZWRfcmVtYWluZGVyOmMoKGEsYik9PmwoYixhKSksbmIkZGl2bW9kOmMoKGEsYik9Pm5ldyBTay5idWlsdGluLnR1cGxlKFtmKGEsYiksbChhLGIpXSkpLG5iJHJlZmxlY3RlZF9kaXZtb2Q6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4udHVwbGUoW2YoYixhKSxsKGIsYSldKSksbmIkcG93ZXI6YihoKSxuYiRyZWZsZWN0ZWRfcG93ZXI6YigoYSxiKT0+aChiLGEpKSxuYiRhYnMoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKHRoaXMudikpfSxuYiRuZWdhdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oLXRoaXMudil9LFxubmIkcG9zaXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMudil9LG5iJGJvb2woKXtyZXR1cm4gMCE9PXRoaXMudn0sbmIkaXNuZWdhdGl2ZSgpe3JldHVybiAwPnRoaXMudn0sbmIkaXNwb3NpdGl2ZSgpe3JldHVybiAwPD10aGlzLnZ9LG9iJGVxOmMoKGEsYik9PmE9PWIpLG9iJG5lOmMoKGEsYik9PmEhPWIpLG9iJGd0OmMoKGEsYik9PmE+Yiksb2IkZ2U6YygoYSxiKT0+YT49Yiksb2IkbHQ6YygoYSxiKT0+YTxiKSxvYiRsZTpjKChhLGIpPT5hPD1iKX0sZ2V0c2V0czp7cmVhbDp7JGdldDphLCRkb2M6XCJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn0saW1hZzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oMCl9LCRkb2M6XCJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifX0sbWV0aG9kczp7Y29uanVnYXRlOnskbWV0aDphLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgZmxvYXQuXCJ9LFxuX190cnVuY19fOnskbWV0aCgpe3JldHVybiB0aGlzLm5iJGludCgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgSW50ZWdyYWwgY2xvc2VzdCB0byB4IGJldHdlZW4gMCBhbmQgeC5cIn0sX19yb3VuZF9fOnskbWV0aChhKXtyZXR1cm4gdGhpcy5yb3VuZCQoYSl9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIG5kaWdpdHM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBJbnRlZ3JhbCBjbG9zZXN0IHRvIHgsIHJvdW5kaW5nIGhhbGYgdG93YXJkIGV2ZW4uXFxuXFxuV2hlbiBhbiBhcmd1bWVudCBpcyBwYXNzZWQsIHdvcmsgbGlrZSBidWlsdC1pbiByb3VuZCh4LCBuZGlnaXRzKS5cIn0saXNfaW50ZWdlcjp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChOdW1iZXIuaXNJbnRlZ2VyKHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsXG4kZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIGZsb2F0IGlzIGFuIGludGVnZXIuXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbdGhpc10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9LF9fZm9ybWF0X186eyRtZXRoOlNrLmZvcm1hdHRpbmcubWtOdW1iZXJfX2Zvcm1hdF9fKCEwKSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGZvcm1hdF9zcGVjLCAvKVwiLCRkb2M6U2suYnVpbHRpbi5ub25lLm5vbmUkfX19KTtjb25zdCBnPS9fW2VFXXxbZUVdX3xcXC5ffF9cXC58WystXV98X18vLG49L18oPz1bXl9dKS9nO1NrLmJ1aWx0aW4uZmxvYXRfLlB5RmxvYXRfQ2hlY2s9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/ITE6U2suYnVpbHRpbi5jaGVja051bWJlcihhKXx8U2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxhLm9iJHR5cGUuJGlzU3ViVHlwZShTay5idWlsdGluLmZsb2F0Xyk/XG4hMDohMX07U2suYnVpbHRpbi5mbG9hdF8ucHJvdG90eXBlLnRvRml4ZWQ9ZnVuY3Rpb24oYSl7YT1Tay5idWlsdGluLmFzbnVtJChhKTtyZXR1cm4gdGhpcy52LnRvRml4ZWQoYSl9O1NrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZS5yb3VuZCQ9ZnVuY3Rpb24oYSl7dmFyIGI9U2suYnVpbHRpbi5hc251bSQodGhpcyk7dmFyIGM9dm9pZCAwPT09YT8wOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTtpZihTay5fX2Z1dHVyZV9fLmJhbmtlcnNfcm91bmRpbmcpe2IqPU1hdGgucG93KDEwLGMpO3ZhciBkPU1hdGgucm91bmQoYik7Yz0oLjU9PT0oMDxiP2I6LWIpJTE/MD09PWQlMj9kOmQtMTpkKS9NYXRoLnBvdygxMCxjKTtyZXR1cm4gdm9pZCAwPT09YT9uZXcgU2suYnVpbHRpbi5pbnRfKGMpOm5ldyBTay5idWlsdGluLmZsb2F0XyhjKX1hPU1hdGgucG93KDEwLGMpO2M9TWF0aC5yb3VuZChiKmEpL2E7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX07U2suYnVpbHRpbi5mbG9hdF8ucHJvdG90eXBlLnN0ciQ9XG5mdW5jdGlvbihhLGIpe2lmKGlzTmFOKHRoaXMudikpcmV0dXJuXCJuYW5cIjt2b2lkIDA9PT1iJiYoYj0hMCk7aWYoSW5maW5pdHk9PXRoaXMudilyZXR1cm5cImluZlwiO2lmKC1JbmZpbml0eT09dGhpcy52JiZiKXJldHVyblwiLWluZlwiO2lmKC1JbmZpbml0eT09dGhpcy52JiYhYilyZXR1cm5cImluZlwiO2I9Yj90aGlzLnY6TWF0aC5hYnModGhpcy52KTtpZih2b2lkIDA9PT1hfHwxMD09PWEpe3ZhciBjPVNrLl9fZnV0dXJlX18ucHl0aG9uMz9iLnRvUHJlY2lzaW9uKDE2KTpiLnRvUHJlY2lzaW9uKDEyKTt2YXIgZD1jLmluZGV4T2YoXCIuXCIpO2E9Yi50b1N0cmluZygpLnNsaWNlKDAsZCk7ZD1iLnRvU3RyaW5nKCkuc2xpY2UoZCk7YS5tYXRjaCgvXi0/MCQvKSYmZC5zbGljZSgxKS5tYXRjaCgvXjB7NCx9LykmJihjPTEyPmMubGVuZ3RoP2IudG9FeHBvbmVudGlhbCgpOmIudG9FeHBvbmVudGlhbCgxMSkpO2lmKDA+Yy5pbmRleE9mKFwiZVwiKSYmMDw9Yy5pbmRleE9mKFwiLlwiKSl7Zm9yKDtcIjBcIj09XG5jLmNoYXJBdChjLmxlbmd0aC0xKTspYz1jLnN1YnN0cmluZygwLGMubGVuZ3RoLTEpO1wiLlwiPT1jLmNoYXJBdChjLmxlbmd0aC0xKSYmKGMrPVwiMFwiKX1jPWMucmVwbGFjZSgvXFwuMCtlLyxcImVcIixcImlcIik7Yz1jLnJlcGxhY2UoLyhlWy0rXSkoWzEtOV0pJC8sXCIkMTAkMlwiKTtjPWMucmVwbGFjZSgvMCsoZS4qKS8sXCIkMVwiKX1lbHNlIGM9Yi50b1N0cmluZyhhKTswPT09dGhpcy52JiYtSW5maW5pdHk9PT0xL3RoaXMudiYmKGM9XCItXCIrYyk7MD5jLmluZGV4T2YoXCIuXCIpJiYwPmMuaW5kZXhPZihcIkVcIikmJjA+Yy5pbmRleE9mKFwiZVwiKSYmKGMrPVwiLjBcIik7cmV0dXJuIGN9O1NrLmJ1aWx0aW4uZmxvYXRfLnB5MiRtZXRob2RzPXt9fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSl7bGV0IGI9YS52O2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYilyZXR1cm4gYjthLm5iJGZsb2F0JiYoYj1hLm5iJGZsb2F0KCkpO2lmKHZvaWQgMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYSBmbG9hdCBpcyByZXF1aXJlZFwiKTtcbnJldHVybiBiLnZ9ZnVuY3Rpb24gYyhhLGIsYyl7aWYoYz09PVNrLmJ1aWx0aW4uY29tcGxleC5wcm90b3R5cGUpcmV0dXJuIG5ldyBTay5idWlsdGluLmNvbXBsZXgoYSxiKTtjPW5ldyBjLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4uY29tcGxleC5jYWxsKGMsYSxiKTtyZXR1cm4gY31mdW5jdGlvbiBiKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2NvbnN0IGQ9dGhpcy5yZWFsLGU9dGhpcy5pbWFnO3ZhciBmPWMucmVhbDtjb25zdCBnPWMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGYpYz1jLmltYWc7ZWxzZSBpZihcIm51bWJlclwiPT09dHlwZW9mIGcpZj1nLGM9MDtlbHNlIGlmKEpTQkkuX19pc0JpZ0ludChnKSl7aWYodm9pZCAwPT09Yil7aWYoZj1wYXJzZUZsb2F0KEpTQkkudG9OdW1iZXIoZykpLEluZmluaXR5PT1mfHwtSW5maW5pdHk9PWYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcImludCB0b28gbGFyZ2UgdG8gY29udmVydCB0byBmbG9hdFwiKTt9ZWxzZSBmPVxuZy50b1N0cmluZygpO2M9MH1lbHNlIHJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtyZXR1cm4gYShkLGUsZixjKX19ZnVuY3Rpb24gZShhLGIsYyxkKXt2YXIgZT1NYXRoLmFicyhjKTtjb25zdCBmPU1hdGguYWJzKGQpO2lmKGU+PWYpe2lmKDA9PT1lKXRocm93IG5ldyBTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yKFwiY29tcGxleCBkaXZpc2lvbiBieSB6ZXJvXCIpO2U9ZC9jO2MrPWQqZTtkPShhK2IqZSkvYzthPShiLWEqZSkvY31lbHNlIGY+PWU/KGU9Yy9kLGM9YyplK2QsU2suYXNzZXJ0cy5hc3NlcnQoMCE9PWQpLGQ9KGEqZStiKS9jLGE9KGIqZS1hKS9jKTphPWQ9TmFOO3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KGQsYSl9ZnVuY3Rpb24gZihhLGIsYyxkKXtpZigwPT09YyYmMD09PWQpe2Q9MTt2YXIgZT0wfWVsc2UgaWYoMD09PWEmJjA9PT1iKXtpZigwIT09ZHx8MD5jKXRocm93IG5ldyBTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yKFwiY29tcGxleCBkaXZpc2lvbiBieSB6ZXJvXCIpO1xuZT1kPTB9ZWxzZXtjb25zdCBmPU1hdGguaHlwb3QoYSxiKTtlPU1hdGgucG93KGYsYyk7YT1NYXRoLmF0YW4yKGIsYSk7Yyo9YTswIT09ZCYmKGUvPU1hdGguZXhwKGEqZCksYys9ZCpNYXRoLmxvZyhmKSk7ZD1lKk1hdGguY29zKGMpO2UqPU1hdGguc2luKGMpfXJldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KGQsZSl9ZnVuY3Rpb24gbChhLGIsYyl7bGV0IGQ9MTt2YXIgZT1uZXcgU2suYnVpbHRpbi5jb21wbGV4KDEsMCk7Zm9yKGE9bmV3IFNrLmJ1aWx0aW4uY29tcGxleChhLGIpOzA8ZCYmYz49ZDspYyZkJiYoZT1uZXcgU2suYnVpbHRpbi5jb21wbGV4KGUucmVhbCphLnJlYWwtZS5pbWFnKmEuaW1hZyxlLnJlYWwqYS5pbWFnK2EucmVhbCplLmltYWcpKSxkPDw9MSxhPW5ldyBTay5idWlsdGluLmNvbXBsZXgoYS5yZWFsKmEucmVhbC1hLmltYWcqYS5pbWFnLDIqYS5yZWFsKmEuaW1hZyk7cmV0dXJuIGV9ZnVuY3Rpb24gaChhLGIsYyxkLGUpe2U9ITE7c3dpdGNoKGIpe2Nhc2UgXCJlXCI6Y2FzZSBcImZcIjpjYXNlIFwiZ1wiOmJyZWFrO1xuY2FzZSBcIkVcIjplPSEwO2I9XCJlXCI7YnJlYWs7Y2FzZSBcIkZcIjplPSEwO2I9XCJmXCI7YnJlYWs7Y2FzZSBcInJcIjppZigwIT09Yyl0aHJvdyBFcnJvcihcIkJhZCBpbnRlcm5hbGwgY2FsbFwiKTtjPTE3O2I9XCJnXCI7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihcIkJhZCBpbnRlcm5hbGwgY2FsbFwiKTt9aWYoaXNOYU4oYSkpYT1cIm5hblwiO2Vsc2UgaWYoSW5maW5pdHk9PT1hKWE9XCJpbmZcIjtlbHNlIGlmKC1JbmZpbml0eT09PWEpYT1cIi1pbmZcIjtlbHNle2QmaC5QeV9EVFNGX0FERF9ET1RfMCYmKGI9XCJnXCIpO3ZhciBmPVwiJVwiKyhkJmguUHlfRFRTRl9BTFQ/XCIjXCI6XCJcIik7bnVsbCE9YyYmKGY9ZitcIi5cIitjKTtmPW5ldyBTay5idWlsdGluLnN0cihmK2IpO2E9Zi5uYiRyZW1haW5kZXIobmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpKTthPWEudn1kJmguUHlfRFRTRl9TSUdOJiZcIi1cIiE9PWFbMF0mJihhPVwiK1wiK2EpO2UmJihhPWEudG9VcHBlckNhc2UoKSk7cmV0dXJuIGF9U2suYnVpbHRpbi5jb21wbGV4PVxuU2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImNvbXBsZXhcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5jb21wbGV4LFwiYmFkIGNhbGwgdG8gY29tcGxleCBjb25zdHJ1Y3RvciwgdXNlICduZXcnXCIpO3RoaXMucmVhbD1hO3RoaXMuaW1hZz1ifSxzbG90czp7dHAkYXNfbnVtYmVyOiEwLHRwJGRvYzpcIkNyZWF0ZSBhIGNvbXBsZXggbnVtYmVyIGZyb20gYSByZWFsIHBhcnQgYW5kIGFuIG9wdGlvbmFsIGltYWdpbmFyeSBwYXJ0LlxcblxcblRoaXMgaXMgZXF1aXZhbGVudCB0byAocmVhbCArIGltYWcqMWopIHdoZXJlIGltYWcgZGVmYXVsdHMgdG8gMC5cIix0cCRoYXNoKCl7dmFyIGE9KG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnJlYWwpKS50cCRoYXNoKCk7YT0xMDAzKihuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5pbWFnKSkudHAkaGFzaCgpK2E7cmV0dXJuIFNrLmJ1aWx0aW4uaW50Xy53aXRoaW5UaHJlc2hvbGQoYSk/XG5hOihuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkuQmlnSW50KGEpKSkudHAkaGFzaCgpfSx0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXcoYixlKXtiPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiY29tcGxleFwiLFtcInJlYWxcIixcImltYWdcIl0sYixlLFtudWxsLG51bGxdKTt7dmFyIGY9YlsxXSxnO2xldCBrPWU9ITE7dmFyIGg9YlswXTtpZihudWxsIT1oJiZoLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5jb21wbGV4JiZudWxsPT1mKWU9aDtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoaCkpe2lmKG51bGwhPWYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGxleCgpIGNhbid0IHRha2Ugc2Vjb25kIGFyZyBpZiBmaXJzdCBpcyBhIHN0cmluZ1wiKTtlPVNrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcoaCx0aGlzKX1lbHNle2lmKG51bGwhPWYmJlNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGxleCgpIHNlY29uZCBhcmcgY2FuJ3QgYmUgYSBzdHJpbmdcIik7XG5udWxsPT1oP2I9bnVsbDooYj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGgsU2suYnVpbHRpbi5zdHIuJGNvbXBsZXgpLGI9dm9pZCAwIT09Yj9Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYixbXSk6bnVsbCk7aWYobnVsbCE9YiYmYiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXtpZighZChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2NvbXBsZXhfXyBzaG91bGQgcmV0dXJuIGEgY29tcGxleCBvYmplY3RcIik7aD1ifWlmKG51bGwhPWgmJnZvaWQgMD09PWgubmIkZmxvYXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGxleCgpIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBudW1iZXIsIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoaCkrXCInXCIpO2lmKG51bGwhPWYmJnZvaWQgMD09PWYubmIkZmxvYXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGxleCgpIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyLCBub3QgJ1wiK1xuU2suYWJzdHIudHlwZU5hbWUoaCkrXCInXCIpO251bGw9PWg/aD1iPTA6ZChoKT8oYj1oLnJlYWwsaD1oLmltYWcsZT0hMCk6KGI9YShoKSxoPTApO251bGw9PWY/Zj1nPTA6ZChmKT8oZz1mLnJlYWwsZj1mLmltYWcsaz0hMCk6KGc9YShmKSxmPTApOyEwPT09ayYmKGItPWYpOyEwPT09ZSYmKGcrPWgpO2U9YyhiLGcsdGhpcyl9fXJldHVybiBlfSx0cCRyaWNoY29tcGFyZShhLGMpe2lmKFwiRXFcIiE9PWMmJlwiTm90RXFcIiE9PWMpe2lmKFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSl8fGQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzXCIpO3JldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH1yZXR1cm4gYihmdW5jdGlvbihhLGIsZCxlKXthPWE9PWQmJmI9PWU7cmV0dXJuXCJFcVwiPT09Yz9hOiFhfSwhMCkuY2FsbCh0aGlzLGEpfSwkcigpe3t2YXIgYSxcbmI7bGV0IGU9YT1cIlwiO3ZhciBjPXRoaXMucmVhbDt2YXIgZD10aGlzLmltYWc7aWYoYj0wPT09YyliPTE9PShjPzA+Yz8tMToxOjA+MS9jPy0xOjEpO2I/KGM9XCJcIixiPWgoZCxcImdcIixudWxsLDAsbnVsbCkpOihjPWE9aChjLFwiZ1wiLG51bGwsMCxudWxsKSxiPWgoZCxcImdcIixudWxsLGguUHlfRFRTRl9TSUdOLG51bGwpLDA9PT1kJiYtSW5maW5pdHk9PT0xL2QmJmImJlwiLVwiIT09YlswXSYmKGI9XCItXCIrYiksYT1cIihcIixlPVwiKVwiKTtkPW5ldyBTay5idWlsdGluLnN0cihcIlwiK2ErYytiK1wialwiK2UpfXJldHVybiBkfSxuYiRpbnQoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gaW50XCIpO30sbmIkbG9uZygpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGNvbnZlcnQgY29tcGxleCB0byBsb25nXCIpO30sbmIkZmxvYXQoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gZmxvYXRcIik7XG59LG5iJHBvc2l0aXZlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmNvbXBsZXgodGhpcy5yZWFsLHRoaXMuaW1hZyl9LG5iJG5lZ2F0aXZlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmNvbXBsZXgoLXRoaXMucmVhbCwtdGhpcy5pbWFnKX0sbmIkYm9vbCgpe3JldHVybiB0aGlzLnJlYWx8fHRoaXMuaW1hZ30sbmIkYWRkOmIoKGEsYixjLGQpPT5uZXcgU2suYnVpbHRpbi5jb21wbGV4KGErYyxiK2QpKSxuYiRzdWJ0cmFjdDpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChhLWMsYi1kKSksbmIkcmVmbGVjdGVkX3N1YnRyYWN0OmIoKGEsYixjLGQpPT5uZXcgU2suYnVpbHRpbi5jb21wbGV4KGMtYSxkLWIpKSxuYiRtdWx0aXBseTpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChjKmEtZCpiLGEqZCtiKmMpKSxuYiRkaXZpZGU6YihlKSxuYiRyZWZsZWN0ZWRfZGl2aWRlOmIoKGEsYixjLGQpPT5lKGMsZCxhLGIpKSxuYiRmbG9vcl9kaXZpZGUoYSl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgdGFrZSBmbG9vciBvZiBjb21wbGV4IG51bWJlci5cIik7XG59LG5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGUoYSl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgdGFrZSBmbG9vciBvZiBjb21wbGV4IG51bWJlci5cIik7fSxuYiRyZW1haW5kZXIoYSl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbW9kIGNvbXBsZXggbnVtYmVycy5cIik7fSxuYiRyZWZsZWN0ZWRfcmVtYWluZGVyKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG1vZCBjb21wbGV4IG51bWJlcnMuXCIpO30sbmIkZGl2bW9kKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb3IgbW9kIG9mIGNvbXBsZXggbnVtYmVyLlwiKTt9LG5iJHBvd2VyKGEsYil7aWYobnVsbCE9YiYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb21wbGV4IG1vZHVsb1wiKTtyZXR1cm4gay5jYWxsKHRoaXMsYSl9LG5iJGFicygpe3ZhciBhPVxudGhpcy5yZWFsO2NvbnN0IGI9dGhpcy5pbWFnO2lmKCFOdW1iZXIuaXNGaW5pdGUoYSl8fCFOdW1iZXIuaXNGaW5pdGUoYikpcmV0dXJuIEluZmluaXR5PT09YXx8LUluZmluaXR5PT09YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oTWF0aC5hYnMoYSkpOkluZmluaXR5PT09Ynx8LUluZmluaXR5PT09Yj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oTWF0aC5hYnMoYikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pO2E9TWF0aC5oeXBvdChhLGIpO2lmKCFOdW1iZXIuaXNGaW5pdGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcImFic29sdXRlIHZhbHVlIHRvbyBsYXJnZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfX0sZ2V0c2V0czp7cmVhbDp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5yZWFsKX0sJGRvYzpcInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifSxpbWFnOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLmltYWcpfSxcbiRkb2M6XCJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifX0sbWV0aG9kczp7Y29uanVnYXRlOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KHRoaXMucmVhbCwtdGhpcy5pbWFnKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcImNvbXBsZXguY29uanVnYXRlKCkgLT4gY29tcGxleFxcblxcblJldHVybiB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgaXRzIGFyZ3VtZW50LiAoMy00aikuY29uanVnYXRlKCkgPT0gMys0ai5cIn0sX19nZXRuZXdhcmdzX186eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5yZWFsKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5pbWFnKV0pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sX19mb3JtYXRfXzp7JG1ldGgoYSl7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiX19mb3JtYXRfXyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIGNvbXBsZXggdHlwZS5cIik7XG50aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2Zvcm1hdF9fIHJlcXVpcmVzIHN0clwiKTt9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJjb21wbGV4Ll9fZm9ybWF0X18oKSAtPiBzdHJcXG5cXG5Db252ZXJ0IHRvIGEgc3RyaW5nIGFjY29yZGluZyB0byBmb3JtYXRfc3BlYy5cIn19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jb21wbGV4XCIsU2suYnVpbHRpbi5jb21wbGV4KTtjb25zdCBkPVNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4LGc9L19bZUVdfFtlRV1ffFxcLl98X1xcLnxbKy1dX3xfanxqXy8sbj0vXyg/PVteX10pL2c7U2suYnVpbHRpbi5jb21wbGV4LmNvbXBsZXhfc3VidHlwZV9mcm9tX3N0cmluZz1mdW5jdGlvbihhLGIpe2I9Ynx8U2suYnVpbHRpbi5jb21wbGV4LnByb3RvdHlwZTt2YXIgZD0wLGU9MCxmPSExO2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpYT1Tay5mZmkucmVtYXBUb0pzKGEpO2Vsc2UgaWYoXCJzdHJpbmdcIiE9PVxudHlwZW9mIGEpdGhyb3cgbmV3IFR5cGVFcnJvcihcInByb3ZpZGVkIHVuc3VwcG9ydGVkIHN0cmluZy1hbGlrZSBhcmd1bWVudFwiKTtpZigtMSE9PWEuaW5kZXhPZihcIlxceDAwXCIpfHwwPT09YS5sZW5ndGh8fFwiXCI9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb21wbGV4KCkgYXJnIGlzIGEgbWFsZm9ybWVkIHN0cmluZ1wiKTt2YXIgaD0wO2E9YS5yZXBsYWNlKC9pbmZ8aW5maW5pdHkvZ2ksXCJJbmZpbml0eVwiKTtmb3IoYT1hLnJlcGxhY2UoL25hbi9naSxcIk5hTlwiKTtcIiBcIj09PWFbaF07KWgrKztpZihcIihcIj09PWFbaF0pZm9yKGY9ITAsaCsrO1wiIFwiPT09YVtoXTspaCsrO2lmKC0xIT09YS5pbmRleE9mKFwiX1wiKSl7aWYoZy50ZXN0KGEpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gY29tcGxleDogJ1wiK2ErXCInXCIpO2E9YS5jaGFyQXQoMCkrYS5zdWJzdHJpbmcoMSkucmVwbGFjZShuLFwiXCIpfXZhciBrPS9eKD86WystXT8oPzooPzooPzpcXGQqXFwuXFxkKyl8KD86XFxkK1xcLj8pKSg/OltlRV1bKy1dP1xcZCspP3xOYU58SW5maW5pdHkpKS87XG52YXIgbD1hLnN1YnN0cihoKTt2YXIgcD1sLm1hdGNoKGspO2lmKG51bGwhPT1wKWlmKGgrPXBbMF0ubGVuZ3RoLFwialwiPT09YVtoXXx8XCJKXCI9PT1hW2hdKWU9cGFyc2VGbG9hdChwWzBdKSxoKys7ZWxzZSBpZihcIitcIj09PWFbaF18fFwiLVwiPT09YVtoXSl7ZD1wYXJzZUZsb2F0KHBbMF0pO3A9YS5zdWJzdHIoaCkubWF0Y2goayk7bnVsbCE9PXA/KGU9cGFyc2VGbG9hdChwWzBdKSxoKz1wWzBdLmxlbmd0aCk6KGU9XCIrXCI9PT1hW2hdPzE6LTEsaCsrKTtpZihcImpcIiE9PWFbaF0mJlwiSlwiIT09YVtoXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCgpIGFyZyBpcyBtYWxmb3JtZWQgc3RyaW5nXCIpO2grK31lbHNlIGQ9cGFyc2VGbG9hdChwWzBdKTtlbHNlIHA9cD1sLm1hdGNoKC9eKFsrLV0/W2pKXSkvKSxudWxsIT09cCYmKGU9MT09PXBbMF0ubGVuZ3RoPzE6XCIrXCI9PT1wWzBdWzBdPzE6LTEsaCs9cFswXS5sZW5ndGgpO2Zvcig7XCIgXCI9PT1hW2hdOyloKys7aWYoZil7aWYoXCIpXCIhPT1cbmFbaF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtmb3IoaCsrO1wiIFwiPT09YVtoXTspaCsrfWlmKGEubGVuZ3RoIT09aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCgpIGFyZyBpcyBtYWxmb3JtZWQgc3RyaW5nXCIpO3JldHVybiBjKGQsZSxiKX07Y29uc3Qgaz1iKChhLGIsYyxkKT0+e2NvbnN0IGc9Y3wwO3JldHVybiAwPT09ZCYmYz09PWc/KDEwMDxnfHwtMTAwPmc/YT1mKGEsYixnLDApOjA8Zz9hPWwoYSxiLGcpOihhPWwoYSxiLC1nKSxhPWUoMSwwLGEucmVhbCxhLmltYWcpKSxhKTpmKGEsYixjLGQpfSk7aC5QeV9EVFNGX1NJR049MTtoLlB5X0RUU0ZfQUREX0RPVF8wPTI7aC5QeV9EVFNGX0FMVD00O2guUHlfRFRTVF9GSU5JVEU9MDtoLlB5X0RUU1RfSU5GSU5JVEU9MTtoLlB5X0RUU1RfTkFOPTJ9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5zbGljZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic2xpY2VcIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYil7dm9pZCAwPT09YyYmdm9pZCAwPT09YiYmKGM9YSxhPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt2b2lkIDA9PT1iJiYoYj1Tay5idWlsdGluLm5vbmUubm9uZSQpO3RoaXMuc3RhcnQ9YTt0aGlzLnN0b3A9Yzt0aGlzLnN0ZXA9Yn0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRvYzpcInNsaWNlKHN0b3ApXFxuc2xpY2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSlcXG5cXG5DcmVhdGUgYSBzbGljZSBvYmplY3QuICBUaGlzIGlzIHVzZWQgZm9yIGV4dGVuZGVkIHNsaWNpbmcgKGUuZy4gYVswOjEwOjJdKS5cIix0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRuZXcoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic2xpY2VcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJzbGljZVwiLGEsMSwzKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc2xpY2UoLi4uYSl9LFxuJHIoKXtjb25zdCBhPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5zdGFydCksYz1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuc3RvcCksYj1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuc3RlcCk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcInNsaWNlKFwiK2ErXCIsIFwiK2MrXCIsIFwiK2IrXCIpXCIpfSx0cCRyaWNoY29tcGFyZShhLGMpe2lmKGEub2IkdHlwZSE9PVNrLmJ1aWx0aW4uc2xpY2UpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGI9bmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXMuc3RhcnQsdGhpcy5zdG9wLHRoaXMuc3RlcF0pO2E9bmV3IFNrLmJ1aWx0aW4udHVwbGUoW2Euc3RhcnQsYS5zdG9wLGEuc3RlcF0pO3JldHVybiBiLnRwJHJpY2hjb21wYXJlKGEsYyl9fSxnZXRzZXRzOntzdGFydDp7JGdldCgpe3JldHVybiB0aGlzLnN0YXJ0fX0sc3RlcDp7JGdldCgpe3JldHVybiB0aGlzLnN0ZXB9fSxzdG9wOnskZ2V0KCl7cmV0dXJuIHRoaXMuc3RvcH19fSxcbm1ldGhvZHM6e2luZGljZXM6eyRtZXRoOmZ1bmN0aW9uKGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigwPmEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibGVuZ3RoIHNob3VsZCBub3QgYmUgbmVnYXRpdmVcIik7Y29uc3Qge3N0YXJ0OmMsc3RvcDpiLHN0ZXA6ZX09dGhpcy5zbGljZSRpbmRpY2VzKGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50XyhjKSxuZXcgU2suYnVpbHRpbi5pbnRfKGIpLG5ldyBTay5idWlsdGluLmludF8oZSldKX0sJGRvYzpcIlMuaW5kaWNlcyhsZW4pIC0+IChzdGFydCwgc3RvcCwgc3RyaWRlKVxcblxcbkFzc3VtaW5nIGEgc2VxdWVuY2Ugb2YgbGVuZ3RoIGxlbiwgY2FsY3VsYXRlIHRoZSBzdGFydCBhbmQgc3RvcFxcbmluZGljZXMsIGFuZCB0aGUgc3RyaWRlIGxlbmd0aCBvZiB0aGUgZXh0ZW5kZWQgc2xpY2UgZGVzY3JpYmVkIGJ5XFxuUy4gT3V0IG9mIGJvdW5kcyBpbmRpY2VzIGFyZSBjbGlwcGVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCB0aGVcXG5oYW5kbGluZyBvZiBub3JtYWwgc2xpY2VzLlwiLFxuJHRleHRzaWc6bnVsbCwkZmxhZ3M6e09uZUFyZzohMH19fSxwcm90bzp7c2xpY2UkYXNfaW5kaWNlcyhhKXtsZXQgYzt2YXIgYj1hP2E9PlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLG51bGwsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgTm9uZSBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik6YT0+U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSxcInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBOb25lIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKTtpZihTay5idWlsdGluLmNoZWNrTm9uZSh0aGlzLnN0ZXApKWM9MTtlbHNlIGlmKGM9Yih0aGlzLnN0ZXApLDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzbGljZSBzdGVwIGNhbm5vdCBiZSB6ZXJvXCIpO2E9U2suYnVpbHRpbi5jaGVja05vbmUodGhpcy5zdGFydCk/bnVsbDpiKHRoaXMuc3RhcnQpO2I9U2suYnVpbHRpbi5jaGVja05vbmUodGhpcy5zdG9wKT9udWxsOlxuYih0aGlzLnN0b3ApO3JldHVybntzdGFydDphLHN0b3A6YixzdGVwOmN9fSwkd3J0KGEsYyxiLGUsZil7Zj1mP2I9PkpTQkkuX19pc0JpZ0ludChiKT9KU0JJLmFkZChiLEpTQkkuQmlnSW50KGEpKTpiK2E6Yj0+YithOzA8ZT8obnVsbD09PWM/Yz0wOjA+YyYmKGM9ZihjKSwwPmMmJihjPTApKSxudWxsPT09Yj9iPWE6Yj5hP2I9YTowPmImJihiPWYoYikpKToobnVsbD09PWM/Yz1hLTE6Yz49YT9jPWEtMTowPmMmJihjPWYoYykpLG51bGw9PT1iP2I9LTE6MD5iJiYoYj1mKGIpLDA+YiYmKGI9LTEpKSk7cmV0dXJue3N0YXJ0OmMsc3RvcDpiLHN0ZXA6ZX19LHNsaWNlJGluZGljZXMoYSxjKXtsZXQge3N0YXJ0OmIsc3RvcDplLHN0ZXA6Zn09dGhpcy5zbGljZSRhc19pbmRpY2VzKCEwLGMpO3JldHVybiB0aGlzLiR3cnQoYSxiLGUsZixjKX0sc3NzaXRlciQoYSxjKXtsZXQge3N0YXJ0OmIsc3RvcDplLHN0ZXA6Zn09dGhpcy5zbGljZSRpbmRpY2VzKGEsITApO2lmKDA8Zilmb3IoYT1iO2E8XG5lO2ErPWYpYyhhKTtlbHNlIGZvcihhPWI7YT5lO2ErPWYpYyhhKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQ9ZnVuY3Rpb24oYSxjLGIpe2E9YS5zcSRsZW5ndGgoKTt2b2lkIDA9PT1jfHxTay5idWlsdGluLmNoZWNrTm9uZShjKT9jPTA6KGM9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGMsbnVsbCxcInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIiksMD5jJiYoYys9YSwwPmMmJihjPTApKSk7dm9pZCAwPT09Ynx8U2suYnVpbHRpbi5jaGVja05vbmUoYik/Yj1hOihiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLG51bGwsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpLDA+Yj8oYis9YSwwPmImJihiPTApKTpiPmEmJihiPWEpKTtyZXR1cm57c3RhcnQ6YyxlbmQ6Yn19fSxmdW5jdGlvbihtLFxucSl7ZnVuY3Rpb24gYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tBbnlTZXQoYik/YS5jYWxsKHRoaXMsYik6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGMoYSl7YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2V0JiZhLnRwJGhhc2g9PT1Tay5idWlsdGluLm5vbmUubm9uZSQmJihhPW5ldyBTay5idWlsdGluLmZyb3plbnNldChTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSkpO3JldHVybiBhfW09e307U2suYnVpbHRpbi5zZXQ9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInNldFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hP2E9W106QXJyYXkuaXNBcnJheShhKXx8KGE9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSkpO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLnNldCxcIkJhZCBjYWxsIHRvIHNldCAtIG11c3QgYmUgY2FsbGVkIHdpdGggYW4gQXJyYXkgYW5kICduZXcnXCIpO1xuY29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSksYi5wdXNoKCEwKTt0aGlzLnY9bmV3IFNrLmJ1aWx0aW4uZGljdChiKTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19udW1iZXI6ITAsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRkb2M6XCJzZXQoKSAtPiBuZXcgZW1wdHkgc2V0IG9iamVjdFxcbnNldChpdGVyYWJsZSkgLT4gbmV3IHNldCBvYmplY3RcXG5cXG5CdWlsZCBhbiB1bm9yZGVyZWQgY29sbGVjdGlvbiBvZiB1bmlxdWUgZWxlbWVudHMuXCIsdHAkaW5pdChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJzZXRcIixiKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJzZXRcIixhLDAsMSk7dGhpcy5zZXQkY2xlYXIoKTtyZXR1cm4oYT1hWzBdKSYmdGhpcy5zZXQkdXBkYXRlKGEpfSx0cCRuZXc6U2suZ2VuZXJpYy5uZXcsXG4kcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKC4uLilcIik7dGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy5zayRhc2FycmF5KCkubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3RoaXMuaW4kcmVwcj0hMTtyZXR1cm4gU2suX19mdXR1cmVfXy5weXRob24zPzA9PT1hLmxlbmd0aD9uZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIoKVwiKTp0aGlzLm9iJHR5cGUhPT1Tay5idWlsdGluLnNldD9uZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIoe1wiK2Euam9pbihcIiwgXCIpK1wifSlcIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwie1wiK2Euam9pbihcIiwgXCIpK1wifVwiKTpuZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIoW1wiK2Euam9pbihcIiwgXCIpK1wiXSlcIil9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGIodGhpcyl9LHRwJHJpY2hjb21wYXJlKGEsXG5iKXtpZighU2suYnVpbHRpbi5jaGVja0FueVNldChhKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7c3dpdGNoKGIpe2Nhc2UgXCJOb3RFcVwiOmNhc2UgXCJFcVwiOnJldHVybiBhPXRoaXM9PT1hPyEwOnRoaXMuZ2V0JHNpemUoKSE9PWEuZ2V0JHNpemUoKT8hMTpTay5taXNjZXZhbC5pc1RydWUodGhpcy5zZXQkaXNzdWJzZXQoYSkpLFwiRXFcIj09PWI/YTohYTtjYXNlIFwiTHRFXCI6cmV0dXJuIHRoaXM9PT1hfHxTay5taXNjZXZhbC5pc1RydWUodGhpcy5zZXQkaXNzdWJzZXQoYSkpO2Nhc2UgXCJHdEVcIjpyZXR1cm4gdGhpcz09PWF8fFNrLm1pc2NldmFsLmlzVHJ1ZShhLnNldCRpc3N1YnNldCh0aGlzKSk7Y2FzZSBcIkx0XCI6cmV0dXJuIHRoaXMuZ2V0JHNpemUoKTxhLmdldCRzaXplKCkmJlNrLm1pc2NldmFsLmlzVHJ1ZSh0aGlzLnNldCRpc3N1YnNldChhKSk7Y2FzZSBcIkd0XCI6cmV0dXJuIHRoaXMuZ2V0JHNpemUoKT5hLmdldCRzaXplKCkmJlNrLm1pc2NldmFsLmlzVHJ1ZShhLnNldCRpc3N1YnNldCh0aGlzKSl9fSxcbm5iJHN1YnRyYWN0OmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGlmZmVyZW5jZS4kbWV0aC5jYWxsKHRoaXMsYSl9KSxuYiRhbmQ6YShmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pbnRlcnNlY3Rpb24uJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkb3I6YShmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy51bmlvbi4kbWV0aC5jYWxsKHRoaXMsYSl9KSxuYiR4b3I6YShmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zeW1tZXRyaWNfZGlmZmVyZW5jZS4kbWV0aC5jYWxsKHRoaXMsYSl9KSxuYiRpbnBsYWNlX3N1YnRyYWN0OmEoZnVuY3Rpb24oYSl7YT09PXRoaXMmJihhPWEuc2V0JGNvcHkoKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKHRoaXMuZGlmZmVyZW5jZV91cGRhdGUuJG1ldGguY2FsbCh0aGlzLGEpLCgpPT50aGlzKX0pLG5iJGlucGxhY2VfYW5kOmEoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKHRoaXMuaW50ZXJzZWN0aW9uX3VwZGF0ZS4kbWV0aC5jYWxsKHRoaXMsXG5hKSwoKT0+dGhpcyl9KSxuYiRpbnBsYWNlX29yOmEoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKHRoaXMudXBkYXRlLiRtZXRoLmNhbGwodGhpcyxhKSwoKT0+dGhpcyl9KSxuYiRpbnBsYWNlX3hvcjphKGZ1bmN0aW9uKGEpe2E9PT10aGlzJiYoYT1hLnNldCRjb3B5KCkpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZS4kbWV0aC5jYWxsKHRoaXMsYSksKCk9PnRoaXMpfSksc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMuZ2V0JHNpemUoKX0sc3EkY29udGFpbnMoYSl7YT1jKGEpO3JldHVybiB0aGlzLnYuc3EkY29udGFpbnMoYSl9fSxtZXRob2RzOnthZGQ6eyRtZXRoKGEpe3RoaXMuc2V0JGFkZChhKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQWRkIGFuIGVsZW1lbnQgdG8gYSBzZXQuXFxuXFxuVGhpcyBoYXMgbm8gZWZmZWN0IGlmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgcHJlc2VudC5cIn0sXG5jbGVhcjp7JG1ldGgoKXt0aGlzLnNldCRjbGVhcigpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBzZXQuXCJ9LGNvcHk6eyRtZXRoKCl7cmV0dXJuIHRoaXMuc2V0JGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiBhIHNldC5cIn0sZGlzY2FyZDp7JG1ldGgoYSl7YT1jKGEpO3RoaXMuc2V0JGRpc2NhcmQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlbW92ZSBhbiBlbGVtZW50IGZyb20gYSBzZXQgaWYgaXQgaXMgYSBtZW1iZXIuXFxuXFxuSWYgdGhlIGVsZW1lbnQgaXMgbm90IGEgbWVtYmVyLCBkbyBub3RoaW5nLlwifSxkaWZmZXJlbmNlOnskbWV0aCguLi5hKXtjb25zdCBiPXRoaXMuc2V0JGNvcHkoKTtcbnJldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT5iLnNldCRkaWZmZXJlbmNlX3VwZGF0ZShhKSksKCk9PmIpfSwkZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBvciBtb3JlIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiB0aGlzIHNldCBidXQgbm90IHRoZSBvdGhlcnMuKVwifSxkaWZmZXJlbmNlX3VwZGF0ZTp7JG1ldGgoLi4uYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLGE9PnRoaXMuc2V0JGRpZmZlcmVuY2VfdXBkYXRlKGEpKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlbW92ZSBhbGwgZWxlbWVudHMgb2YgYW5vdGhlciBzZXQgZnJvbSB0aGlzIHNldC5cIn0saW50ZXJzZWN0aW9uOnskbWV0aCguLi5hKXtyZXR1cm4gdGhpcy5zZXQkaW50ZXJzZWN0aW9uX211bHRpKC4uLmEpfSxcbiRmbGFnczp7TWluQXJnczowfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gdGhlIGludGVyc2VjdGlvbiBvZiB0d28gc2V0cyBhcyBhIG5ldyBzZXQuXFxuXFxuKGkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGJvdGggc2V0cy4pXCJ9LGludGVyc2VjdGlvbl91cGRhdGU6eyRtZXRoKC4uLmEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnNldCRpbnRlcnNlY3Rpb25fbXVsdGkoLi4uYSksYT0+e3RoaXMuc3dhcCRib2RpZXMoYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pfSwkZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiVXBkYXRlIGEgc2V0IHdpdGggdGhlIGludGVyc2VjdGlvbiBvZiBpdHNlbGYgYW5kIGFub3RoZXIuXCJ9LGlzZGlzam9pbnQ6eyRtZXRoKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKHRoaXMuc3EkY29udGFpbnMoYSkpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhTay5idWlsdGluLmJvb2wuZmFsc2UkKX0pLFxuYT0+YXx8U2suYnVpbHRpbi5ib29sLnRydWUkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiBUcnVlIGlmIHR3byBzZXRzIGhhdmUgYSBudWxsIGludGVyc2VjdGlvbi5cIn0saXNzdWJzZXQ6eyRtZXRoKGEpe1NrLmJ1aWx0aW4uY2hlY2tBbnlTZXQoYSl8fChhPXRoaXMuc2V0JG1ha2VfYmFzZXR5cGUoYSkpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLGE9PnRoaXMuc2V0JGlzc3Vic2V0KGEpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlcG9ydCB3aGV0aGVyIGFub3RoZXIgc2V0IGNvbnRhaW5zIHRoaXMgc2V0LlwifSxpc3N1cGVyc2V0OnskbWV0aChhKXtTay5idWlsdGluLmNoZWNrQW55U2V0KGEpfHwoYT10aGlzLnNldCRtYWtlX2Jhc2V0eXBlKGEpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT5hLnNldCRpc3N1YnNldCh0aGlzKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLFxuJGRvYzpcIlJlcG9ydCB3aGV0aGVyIHRoaXMgc2V0IGNvbnRhaW5zIGFub3RoZXIgc2V0LlwifSxwb3A6eyRtZXRoKCl7aWYoMD09PXRoaXMuZ2V0JHNpemUoKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihcInBvcCBmcm9tIGFuIGVtcHR5IHNldFwiKTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMudi5wb3BpdGVtLFt0aGlzLnZdKS52WzBdfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmVtb3ZlIGFuZCByZXR1cm4gYW4gYXJiaXRyYXJ5IHNldCBlbGVtZW50LlxcblJhaXNlcyBLZXlFcnJvciBpZiB0aGUgc2V0IGlzIGVtcHR5LlwifSxyZW1vdmU6eyRtZXRoKGEpe2NvbnN0IGI9YyhhKTtpZih0aGlzLnYubXAkbG9va3VwKGIpKXJldHVybiB0aGlzLnYubXAkYXNzX3N1YnNjcmlwdChiKSxTay5idWlsdGluLm5vbmUubm9uZSQ7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCxcbiRkb2M6XCJSZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgc2V0OyBpdCBtdXN0IGJlIGEgbWVtYmVyLlxcblxcbklmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgcmFpc2UgYSBLZXlFcnJvci5cIn0sc3ltbWV0cmljX2RpZmZlcmVuY2U6eyRtZXRoKGEpe2xldCBiO3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnNldCRtYWtlX2Jhc2V0eXBlKGEpLGE9PntiPWE7cmV0dXJuIGIuc2V0JHN5bW1ldHJpY19kaWZmX3VwZGF0ZSh0aGlzKX0sKCk9PmIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiB0d28gc2V0cyBhcyBhIG5ldyBzZXQuXFxuXFxuKGkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGV4YWN0bHkgb25lIG9mIHRoZSBzZXRzLilcIn0sc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlOnskbWV0aChhKXtTay5idWlsdGluLmNoZWNrQW55U2V0KGEpfHwoYT10aGlzLnNldCRtYWtlX2Jhc2V0eXBlKGEpKTtcbnJldHVybiBTay5taXNjZXZhbC5jaGFpbihhLGE9PnRoaXMuc2V0JHN5bW1ldHJpY19kaWZmX3VwZGF0ZShhKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiBpdHNlbGYgYW5kIGFub3RoZXIuXCJ9LHVuaW9uOnskbWV0aCguLi5hKXtjb25zdCBiPXRoaXMuc2V0JGNvcHkoKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KGEsYT0+Yi5zZXQkdXBkYXRlKGEpKSwoKT0+Yil9LCRmbGFnczp7TWluQXJnczowfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gdGhlIHVuaW9uIG9mIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBlaXRoZXIgc2V0LilcIn0sdXBkYXRlOnskbWV0aCguLi5hKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KGEsXG5hPT50aGlzLnNldCR1cGRhdGUoYSkpLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiVXBkYXRlIGEgc2V0IHdpdGggdGhlIHVuaW9uIG9mIGl0c2VsZiBhbmQgb3RoZXJzLlwifX0scHJvdG86T2JqZWN0LmFzc2lnbihtLHtzayRhc2FycmF5KCl7cmV0dXJuIHRoaXMudi5zayRhc2FycmF5KCl9LGdldCRzaXplKCl7cmV0dXJuIHRoaXMudi5zcSRsZW5ndGgoKX0sc2V0JGFkZChhKXt0aGlzLnYubXAkYXNzX3N1YnNjcmlwdChhLCEwKX0sc2V0JG1ha2VfYmFzZXR5cGUoYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEsITApLGE9Pm5ldyB0aGlzLnNrJGJ1aWx0aW5CYXNlKGEpKX0sc2V0JGRpc2NhcmQoYSl7cmV0dXJuIHRoaXMudi5wb3AkaXRlbShhKX0sc2V0JGNsZWFyKCl7dGhpcy52PW5ldyBTay5idWlsdGluLmRpY3QoW10pfSxzZXQkY29weSgpe2NvbnN0IGE9XG5uZXcgdGhpcy5zayRidWlsdGluQmFzZTthLnY9dGhpcy52LmRpY3QkY29weSgpO3JldHVybiBhfSxzZXQkZGlmZmVyZW5jZV91cGRhdGUoYSl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy5zZXQkZGlzY2FyZChhKX0pfSxzZXQkaW50ZXJzZWN0aW9uKGEpe2NvbnN0IGI9bmV3IHRoaXMuc2skYnVpbHRpbkJhc2U7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy5zcSRjb250YWlucyhhKSYmYi5zZXQkYWRkKGEpfSksKCk9PmIpfSxzZXQkaW50ZXJzZWN0aW9uX211bHRpKC4uLmEpe2lmKCFhLmxlbmd0aClyZXR1cm4gdGhpcy5zZXQkY29weSgpO2xldCBiPXRoaXM7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLGE9PlNrLm1pc2NldmFsLmNoYWluKGIuc2V0JGludGVyc2VjdGlvbihhKSxhPT57Yj1hfSkpLCgpPT5iKX0sXG5zZXQkaXNzdWJzZXQoYSl7Y29uc3QgYj10aGlzLmdldCRzaXplKCksYz1hLmdldCRzaXplKCk7aWYoYj5jKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKWlmKCFhLnNxJGNvbnRhaW5zKGMpKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO3JldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSR9LHNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUoYSl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dm9pZCAwPT09dGhpcy5zZXQkZGlzY2FyZChhKSYmdGhpcy5zZXQkYWRkKGEpfSl9LHNldCR1cGRhdGUoYSl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy5zZXQkYWRkKGEpfSl9LHN3YXAkYm9kaWVzKGEpe3RoaXMudj1hLnZ9fSl9KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLnNldFwiLFxuU2suYnVpbHRpbi5zZXQpO3E9U2suYnVpbHRpbi5zZXQucHJvdG90eXBlO1NrLmJ1aWx0aW4uZnJvemVuc2V0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJmcm96ZW5zZXRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9W10pO1NrLmFzc2VydHMuYXNzZXJ0KEFycmF5LmlzQXJyYXkoYSkmJnRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmZyb3plbnNldCxcImJhZCBjYWxsIHRvIGZyb3plbiBzZXQgLSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIEFycmF5IGFuZCAnbmV3J1wiKTtjb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKSxiLnB1c2goITApO3RoaXMudj1uZXcgU2suYnVpbHRpbi5kaWN0KGIpO3RoaXMuaW4kcmVwcj0hMX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX251bWJlcjohMCx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGRvYzpcImZyb3plbnNldCgpIC0+IGVtcHR5IGZyb3plbnNldCBvYmplY3RcXG5mcm96ZW5zZXQoaXRlcmFibGUpIC0+IGZyb3plbnNldCBvYmplY3RcXG5cXG5CdWlsZCBhbiBpbW11dGFibGUgdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2YgdW5pcXVlIGVsZW1lbnRzLlwiLFxudHAkaGFzaCgpe2xldCBhPTE5Mjc4NjgyMzc7Y29uc3QgYj10aGlzLnNrJGFzYXJyYXkoKTthKj1iLmxlbmd0aCsxO2ZvcihsZXQgYz0wO2M8Yi5sZW5ndGg7YysrKXtjb25zdCBlPVNrLmFic3RyLm9iamVjdEhhc2goYltjXSk7YV49MzY0NDc5ODE2NyooZV5lPDwxNl44OTg2OTc0Nyl9cmV0dXJuIDY5MDY5KmErOTA3MTMzOTIzfSx0cCRuZXcoYSxiKXtpZih0aGlzIT09U2suYnVpbHRpbi5mcm96ZW5zZXQucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGIpO1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJmcm96ZW5zZXRcIixiKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJmcm96ZW5zZXRcIixhLDAsMSk7YT1hWzBdO3JldHVybiB2b2lkIDAhPT1hJiZhLm9iJHR5cGU9PT1Tay5idWlsdGluLmZyb3plbnNldD9hOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEsITApLGE9PmEubGVuZ3RoP25ldyBTay5idWlsdGluLmZyb3plbnNldChhKTpcblNrLmJ1aWx0aW4uZnJvemVuc2V0LiRlbXB0eXNldCl9LCRyOnEuJHIsdHAkaXRlcjpxLnRwJGl0ZXIsdHAkcmljaGNvbXBhcmU6cS50cCRyaWNoY29tcGFyZSxuYiRzdWJ0cmFjdDpxLm5iJHN1YnRyYWN0LG5iJGFuZDpxLm5iJGFuZCxuYiRvcjpxLm5iJG9yLG5iJHhvcjpxLm5iJHhvcixzcSRsZW5ndGg6cS5zcSRsZW5ndGgsc3EkY29udGFpbnM6cS5zcSRjb250YWluc30sbWV0aG9kczp7Y29weTpPYmplY3QuYXNzaWduKHt9LHEuY29weS5kJGRlZix7JG1ldGgoKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvcj09PXRoaXMuc2skYnVpbHRpbkJhc2U/dGhpczpuZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQodGhpcy5zayRhc2FycmF5KCkpfX0pLGRpZmZlcmVuY2U6cS5kaWZmZXJlbmNlLmQkZGVmLGludGVyc2VjdGlvbjpxLmludGVyc2VjdGlvbi5kJGRlZixpc2Rpc2pvaW50OnEuaXNkaXNqb2ludC5kJGRlZixpc3N1YnNldDpxLmlzc3Vic2V0LmQkZGVmLGlzc3VwZXJzZXQ6cS5pc3N1cGVyc2V0LmQkZGVmLFxuc3ltbWV0cmljX2RpZmZlcmVuY2U6cS5zeW1tZXRyaWNfZGlmZmVyZW5jZS5kJGRlZix1bmlvbjpxLnVuaW9uLmQkZGVmfSxwcm90bzpPYmplY3QuYXNzaWduKHskc3VidHlwZV9uZXcoYSxiKXtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5idWlsdGluLmZyb3plbnNldC5wcm90b3R5cGUudHAkbmV3KGEpLGE9PntjLnY9YS52O3JldHVybiBjfSl9fSxtKX0pO1NrLmJ1aWx0aW4uZnJvemVuc2V0LiRlbXB0eXNldD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4uZnJvemVuc2V0LnByb3RvdHlwZSx7djp7dmFsdWU6bmV3IFNrLmJ1aWx0aW4uZGljdChbXSksZW51bWVyYWJsZTohMH0saW4kcmVwcjp7dmFsdWU6ITEsZW51bWVyYWJsZTohMH19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmZyb3plbnNldFwiLFNrLmJ1aWx0aW4uZnJvemVuc2V0KTt2YXIgYj1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJzZXRfaXRlcmF0b3JcIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO3RoaXMuJHNlcT1hLnNrJGFzYXJyYXkoKTt0aGlzLiRvcmlnPWF9LGl0ZXJuZXh0OlNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXlDaGVja1NpemUsbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5wcmludD1mdW5jdGlvbihhLGMpe2xldCBbYixlLGZdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwicHJpbnRcIixbXCJzZXBcIixcImVuZFwiLFwiZmlsZVwiLFwiZmx1c2hcIl0sW10sYyk7aWYodm9pZCAwPT09Ynx8U2suYnVpbHRpbi5jaGVja05vbmUoYikpYj1cIiBcIjtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpYj1iLiRqc3N0cigpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2VwIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZywgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoYikpO2lmKHZvaWQgMD09PWV8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGUpKWU9XCJcXG5cIjtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoZSkpZT1lLiRqc3N0cigpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZW5kIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZywgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGUpKTtsZXQgbDtpZih2b2lkIDAhPT1mJiYhU2suYnVpbHRpbi5jaGVja05vbmUoZikmJihsPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoZixTay5idWlsdGluLnN0ci4kd3JpdGUpLHZvaWQgMD09PWwpKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnd3JpdGUnXCIpO2NvbnN0IGg9bmV3IFNrLmJ1aWx0aW4uc3RyKGEubWFwKGE9PihuZXcgU2suYnVpbHRpbi5zdHIoYSkpLnRvU3RyaW5nKCkpLmpvaW4oYikrZSk7XG5pZih2b2lkIDAhPT1sKVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShsLFtoXSk7ZWxzZSByZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suaW1wb3J0TW9kdWxlKFwic3lzXCIsITEsITApLGE9PihsPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYS4kZC5zdGRvdXQsU2suYnVpbHRpbi5zdHIuJHdyaXRlKSkmJlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShsLFtoXSkpfTtTay5idWlsdGluLnByaW50LmNvX2Zhc3RjYWxsPTF9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5tb2R1bGU9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIm1vZHVsZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMuJGQ9e319LHNsb3RzOnt0cCRkb2M6XCJDcmVhdGUgYSBtb2R1bGUgb2JqZWN0LlxcblxcblRoZSBuYW1lIG11c3QgYmUgYSBzdHJpbmc7IHRoZSBvcHRpb25hbCBkb2MgYXJndW1lbnQgY2FuIGhhdmUgYW55IHR5cGUuXCIsdHAkZ2V0YXR0cihhLGMpe3ZhciBiPXRoaXMuJGRbYS4kbWFuZ2xlZF07XG5pZih2b2lkIDAhPT1iKXJldHVybiBiO2I9dGhpcy5vYiR0eXBlLiR0eXBlTG9va3VwKGEpO2lmKHZvaWQgMCE9PWIpe2NvbnN0IGE9Yi50cCRkZXNjcl9nZXQ7cmV0dXJuIGE/YS5jYWxsKGIsdGhpcyx0aGlzLm9iJHR5cGUsYyk6Yn1jb25zdCBlPXRoaXMuJGQuX19nZXRhdHRyX187aWYodm9pZCAwIT09ZSlyZXR1cm4gYj1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGUsW2FdKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KSxjP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfSx0cCRzZXRhdHRyOlNrLmdlbmVyaWMuc2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe2NvbnN0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwibW9kdWxlXCIsW1wibmFtZVwiLFwiZG9jXCJdLGEsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkXSk7XG5Tay5idWlsdGluLnB5Q2hlY2tUeXBlKFwibW9kdWxlXCIsXCJzdHJpbmdcIixiKTt0aGlzLmluaXQkZGljdChiLGUpfSwkcigpe2xldCBhPXRoaXMuZ2V0JG5hbWUoKTtpZih2b2lkIDAhPT1hKXt2YXIgYz10aGlzLmdldCRtb2RfcmVwcmYoKTtpZih2b2lkIDAhPT1jKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbdGhpc10pfWE9dm9pZCAwPT09YT9cIic/J1wiOmE7Yz10aGlzLmZyb20kZmlsZSgpO2M9dm9pZCAwPT09Yz90aGlzLmVtcHR5X29yJGxvYWRlcigpOmM7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxtb2R1bGUgXCIrYStjK1wiPlwiKX19LGdldHNldHM6e19fZGljdF9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLm1hcHBpbmdwcm94eSh0aGlzLiRkKX19fSxtZXRob2RzOntfX2Rpcl9fOnskbWV0aCgpe2NvbnN0IGE9dGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRkaWN0KTtpZighU2suYnVpbHRpbi5jaGVja01hcHBpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19kaWN0X18gaXMgbm90IGEgZGljdGlvbmFyeVwiKTtcbmNvbnN0IGM9YS5tcCRsb29rdXAoU2suYnVpbHRpbi5zdHIuJGRpcik7cmV0dXJuIHZvaWQgMCE9PWM/U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW10pOm5ldyBTay5idWlsdGluLmxpc3QoU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSkpfSwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIl9fZGlyX18oKSAtPiBsaXN0XFxuc3BlY2lhbGl6ZWQgZGlyKCkgaW1wbGVtZW50YXRpb25cIn19LHByb3RvOntpbml0JGRpY3QoYSxjKXt0aGlzLiRkLl9fbmFtZV9fPWE7dGhpcy4kZC5fX2RvY19fPWM7dGhpcy4kZC5fX3BhY2thZ2VfXz1Tay5idWlsdGluLm5vbmUubm9uZSQ7dGhpcy4kZC5fX3NwZWNfXz1Tay5idWlsdGluLm5vbmUubm9uZSQ7dGhpcy4kZC5fX2xvYWRlcl9fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sc2skYXR0ckVycm9yKCl7Y29uc3QgYT10aGlzLmdldCRuYW1lKCk7cmV0dXJuIHZvaWQgMD09PWE/XCJtb2R1bGVcIjpcIm1vZHVsZSBcIithfSxnZXQkbmFtZSgpe2NvbnN0IGE9XG50aGlzLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJG5hbWUpO3JldHVybiBhJiZTay5taXNjZXZhbC5vYmplY3RSZXByKGEpfSxmcm9tJGZpbGUoKXtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kZmlsZSk7cmV0dXJuIGEmJlwiIGZyb20gXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKX0sZW1wdHlfb3IkbG9hZGVyKCl7aWYodGhpcy4kanMmJnRoaXMuJGpzLmluY2x1ZGVzKFwiJGJ1aWx0aW5tb2R1bGVcIikpcmV0dXJuXCIgKGJ1aWx0LWluKVwiO2NvbnN0IGE9dGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRsb2FkZXIpO3JldHVybiB2b2lkIDA9PT1hfHxTay5idWlsdGluLmNoZWNrTm9uZShhKT9cIlwiOlwiIChcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiKVwifSxnZXQkbW9kX3JlcHJmKCl7Y29uc3QgYT10aGlzLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGxvYWRlcik7cmV0dXJuIGEmJmEudHAkZ2V0YXR0cih0aGlzLnN0ciRtb2RfcmVwcil9LFxuc3RyJG1vZF9yZXByOm5ldyBTay5idWlsdGluLnN0cihcIm1vZHVsZV9yZXByXCIpfX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ubW9kdWxlXCIsU2suYnVpbHRpbi5tb2R1bGUpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc3RydWN0c2VxX3R5cGVzPXt9O1NrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXE9ZnVuY3Rpb24oYSxjLGIsZSl7Y29uc3QgZj1hK1wiLlwiK2MsbD1bXTthPVtdO2ZvcihsZXQgYyBpbiBiKWwucHVzaChjKSxhLnB1c2goYltjXSk7Yj17fTtmb3IobGV0IGM9MDtjPGwubGVuZ3RoO2MrKyliW2xbY11dPXskZ2V0KCl7cmV0dXJuIHRoaXMudltjXX0sJGRvYzphW2NdfTt2YXIgaD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKGYse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KChBcnJheS5pc0FycmF5KGEpfHx2b2lkIDA9PT1hKSYmdGhpcyBpbnN0YW5jZW9mIGgpO1NrLmJ1aWx0aW4udHVwbGUuY2FsbCh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4udHVwbGUsXG5zbG90czp7dHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tPbmVBcmcoZixhLGIpO2I9W107YT1hWzBdO2ZvcihsZXQgYz1Tay5hYnN0ci5pdGVyKGEpLGQ9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1jLnRwJGl0ZXJuZXh0KCkpYi5wdXNoKGQpO2lmKGIubGVuZ3RoIT1sLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoZitcIigpIHRha2VzIGEgXCIrbC5sZW5ndGgrXCItc2VxdWVuY2UgKFwiK2IubGVuZ3RoK1wiLXNlcXVlbmNlIGdpdmVuKVwiKTtyZXR1cm4gbmV3IGgoYil9LHRwJGRvYzplP2U6U2suYnVpbHRpbi5ub25lLm5vbmUkLCRyKCl7dmFyIGE7aWYoMD09PXRoaXMudi5sZW5ndGgpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihmK1wiKClcIik7dmFyIGI9W107Zm9yKGE9MDthPHRoaXMudi5sZW5ndGg7KythKWJbYV09bFthXStcIj1cIitTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMudlthXSk7YT1iLmpvaW4oXCIsIFwiKTsxPT09dGhpcy52Lmxlbmd0aCYmKGErPVxuXCIsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZitcIihcIithK1wiKVwiKX19LG1ldGhvZHM6e19fcmVkdWNlX186eyRtZXRoKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIl9fcmVkdWNlX18gaXMgbm90IGltcGxlbWVudGVkXCIpO30sJGZsYWdzOntOb0FyZ3M6ITB9fX0sZ2V0c2V0czpiLHByb3RvOntudW1fc2VxdWVuY2VfZmllbGRzOm5ldyBTay5idWlsdGluLmludF8obC5sZW5ndGgpfX0pO3JldHVybiBofTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLm1ha2Vfc3RydWN0c2VxXCIsU2suYnVpbHRpbi5tYWtlX3N0cnVjdHNlcSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5nZW5lcmF0b3I9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiZ2VuZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyxiLGUsZil7dmFyIGw7aWYoYSl7aWYoISh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5nZW5lcmF0b3IpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJiYWQgaW50ZXJuYWwgY2FsbCB0byBnZW5lcmF0b3IsIHVzZSAnbmV3J1wiKTtcbnRoaXMuZnVuY19jb2RlPWE7dGhpcy5mdW5jX2dsb2JhbHM9Y3x8bnVsbDt0aGlzLmdpJHJ1bm5pbmc9ITE7dGhpcy5naSRyZXN1bWVhdD0wO3RoaXMuZ2kkc2VudHZhbHVlPXZvaWQgMDt0aGlzLmdpJGxvY2Fscz17fTt0aGlzLmdpJGNlbGxzPXt9O2lmKDA8Yi5sZW5ndGgpZm9yKGM9MDtjPGEuY29fdmFybmFtZXMubGVuZ3RoOysrYyl0aGlzLmdpJGxvY2Fsc1thLmNvX3Zhcm5hbWVzW2NdXT1iW2NdO2lmKHZvaWQgMCE9PWYpZm9yKGwgaW4gZillW2xdPWZbbF07dGhpcy5mdW5jX2Nsb3N1cmU9ZX19LHNsb3RzOnskcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8Z2VuZXJhdG9yIG9iamVjdCBcIit0aGlzLmZ1bmNfY29kZS5jb19uYW1lLnYrXCI+XCIpfX0saXRlcm5leHQoYSxjKXt2YXIgYj10aGlzO3RoaXMuZ2kkcnVubmluZz0hMDt2b2lkIDA9PT1jJiYoYz1Tay5idWlsdGluLm5vbmUubm9uZSQpO3RoaXMuZ2kkc2VudHZhbHVlPWM7Yz1bdGhpc107dGhpcy5mdW5jX2Nsb3N1cmUmJlxuYy5wdXNoKHRoaXMuZnVuY19jbG9zdXJlKTtyZXR1cm4gZnVuY3Rpb24gbChjKXtpZihjIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbil7aWYoYSlyZXR1cm4gbmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb24obCxjKTtjPVNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX1iLmdpJHJ1bm5pbmc9ITE7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09Yyk7aWYoYyE9PVNrLmJ1aWx0aW4ubm9uZS5ub25lJClyZXR1cm4gYi5naSRyZXN1bWVhdD1jWzBdLGM9Y1sxXX0odGhpcy5mdW5jX2NvZGUuYXBwbHkodGhpcy5mdW5jX2dsb2JhbHMsYykpfSxtZXRob2RzOntzZW5kOnskbWV0aChhKXtyZXR1cm4gdGhpcy50cCRpdGVybmV4dCghMCxhKX0sJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJzZW5kKGFyZykgLT4gc2VuZCAnYXJnJyBpbnRvIGdlbmVyYXRvcixcXG5yZXR1cm4gbmV4dCB5aWVsZGVkIHZhbHVlIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24uXCJ9fX0pO1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5nZW5lcmF0b3JcIixTay5idWlsdGluLmdlbmVyYXRvcik7U2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yPWZ1bmN0aW9uKGEsYyl7dmFyIGIsZT1uZXcgU2suYnVpbHRpbi5nZW5lcmF0b3IobnVsbCxudWxsLG51bGwpO2UudHAkaXRlcm5leHQ9YTtmb3IoYiBpbiBjKWMuaGFzT3duUHJvcGVydHkoYikmJihlW2JdPWNbYl0pO3JldHVybiBlfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLm1ha2VHZW5lcmF0b3JcIixTay5idWlsdGluLm1ha2VHZW5lcmF0b3IpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZmlsZT1mdW5jdGlvbihhLGMsYil7dmFyIGU7aWYoISh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5maWxlKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmlsZShhLGMsYik7dGhpcy5tb2RlPWM7dGhpcy5uYW1lPVNrLmZmaS5yZW1hcFRvSnMoYSk7dGhpcy5jbG9zZWQ9ITE7aWYoXCIvZGV2L3N0ZG91dFwiPT09dGhpcy5uYW1lKXRoaXMuZGF0YSQ9XG5Tay5idWlsdGluLm5vbmUubm9uZSQsdGhpcy5maWxlbm89MTtlbHNlIGlmKFwiL2Rldi9zdGRpblwiPT09dGhpcy5uYW1lKXRoaXMuZmlsZW5vPTA7ZWxzZSBpZihcIi9kZXYvc3RkZXJyXCI9PT10aGlzLm5hbWUpdGhpcy5maWxlbm89MjtlbHNle2lmKFwid1wiPT09U2suZmZpLnJlbWFwVG9Kcyh0aGlzLm1vZGUpKXRoaXMuZmlsZW5vPVNrLmJ1aWx0aW4uZmlsZS5jdXJyZW50RmlsZW5vKys7ZWxzZSBmb3IoZSBpbiB0aGlzLmZpbGVubz1Tay5pbkJyb3dzZXI/MTA6MTEsdGhpcy5kYXRhJD1Tay5yZWFkKGEudiksdGhpcy5saW5lTGlzdD10aGlzLmRhdGEkLnNwbGl0KFwiXFxuXCIpLHRoaXMubGluZUxpc3Q9dGhpcy5saW5lTGlzdC5zbGljZSgwLC0xKSx0aGlzLmxpbmVMaXN0KXRoaXMubGluZUxpc3RbZV0rPVwiXFxuXCI7dGhpcy5jdXJyZW50TGluZT0wfXRoaXMucG9zJD0wO1NrLmZpbGVvcGVuJiYxMDw9dGhpcy5maWxlbm8mJlNrLmZpbGVvcGVuKHRoaXMpO3JldHVybiB0aGlzfTtTay5idWlsdGluLmZpbGUuY3VycmVudEZpbGVubz1cbjEyO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoXCJmaWxlXCIsU2suYnVpbHRpbi5maWxlLFNrLmJ1aWx0aW4ub2JqZWN0KTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm8oU2suYnVpbHRpbi5maWxlKTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLiRyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIisodGhpcy5jbG9zZWQ/XCJjbG9zZWRcIjpcIm9wZW5cIikrXCJmaWxlICdcIit0aGlzLm5hbWUrXCInLCBtb2RlICdcIitTay5mZmkucmVtYXBUb0pzKHRoaXMubW9kZSkrXCInPlwiKX07U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS50cCRpdGVyPWZ1bmN0aW9uKCl7dmFyIGE9e3RwJGl0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sJG9iajp0aGlzLCRpbmRleDp0aGlzLmN1cnJlbnRMaW5lLCRsaW5lczp0aGlzLmxpbmVMaXN0LHRwJGl0ZXJuZXh0OmZ1bmN0aW9uKCl7aWYoIShhLiRpbmRleD49YS4kbGluZXMubGVuZ3RoKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEuJGxpbmVzW2EuJGluZGV4KytdKX19O1xucmV0dXJuIGF9O1NrLmFic3RyLnNldFVwU2xvdHMoU2suYnVpbHRpbi5maWxlKTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLl9fZW50ZXJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBhfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5fX2V4aXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5jbG9zZSxbYV0pfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5jbG9zZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuY2xvc2VkPSEwO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLmZsdXNoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7fSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5maWxlbm89bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5maWxlbm99KTtcblNrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuaXNhdHR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuITF9KTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLnJlYWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe3ZhciBiPWEuZGF0YSQubGVuZ3RoO2lmKGEuY2xvc2VkKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlXCIpO3ZhciBlPXZvaWQgMD09PWM/YjpTay5mZmkucmVtYXBUb0pzKGMpO2U9bmV3IFNrLmJ1aWx0aW4uc3RyKGEuZGF0YSQuc3Vic3RyKGEucG9zJCxlKSk7YS5wb3MkPXZvaWQgMD09PWM/YjphLnBvcyQrU2suZmZpLnJlbWFwVG9KcyhjKTthLnBvcyQ+PWImJihhLnBvcyQ9Yik7cmV0dXJuIGV9KTtTay5idWlsdGluLmZpbGUuJHJlYWRsaW5lPWZ1bmN0aW9uKGEsYyxiKXtpZigwPT09YS5maWxlbm8pe2E9U2suZmZpLnJlbWFwVG9KcyhiKTthPVNrLmlucHV0ZnVuKGE/XG5hOlwiXCIpO2lmKGEgaW5zdGFuY2VvZiBQcm9taXNlfHxhJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYS50aGVuKXt2YXIgZT1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbjtlLnJlc3VtZT1mdW5jdGlvbigpe2lmKGUuZGF0YS5lcnJvcil0aHJvdyBlLmRhdGEuZXJyb3I7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlLmRhdGEucmVzdWx0KX07ZS5kYXRhPXt0eXBlOlwiU2sucHJvbWlzZVwiLHByb21pc2U6YX07cmV0dXJuIGV9cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX1jPVwiXCI7YS5jdXJyZW50TGluZTxhLmxpbmVMaXN0Lmxlbmd0aCYmKGM9YS5saW5lTGlzdFthLmN1cnJlbnRMaW5lXSxhLmN1cnJlbnRMaW5lKyspO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyl9O1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUucmVhZGxpbmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe3JldHVybiBTay5idWlsdGluLmZpbGUuJHJlYWRsaW5lKGEsYyx2b2lkIDApfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5yZWFkbGluZXM9XG5uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7aWYoMD09PWEuZmlsZW5vKXJldHVybiBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwicmVhZGxpbmVzIGlucyd0IGltcGxlbWVudGVkIGJlY2F1c2UgdGhlIHdlYiBkb2Vzbid0IHN1cHBvcnQgQ3RybCtEXCIpO3ZhciBiPVtdO2ZvcihjPWEuY3VycmVudExpbmU7YzxhLmxpbmVMaXN0Lmxlbmd0aDtjKyspYi5wdXNoKG5ldyBTay5idWlsdGluLnN0cihhLmxpbmVMaXN0W2NdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9KTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLnNlZWs9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsYil7Yz1Tay5mZmkucmVtYXBUb0pzKGMpO3ZvaWQgMD09PWImJihiPTApOzA9PT1iP2EucG9zJD1jOjE9PWI/YS5wb3MkPWEuZGF0YSQubGVuZ3RoK2M6Mj09YiYmKGEucG9zJD1hLmRhdGEkLmxlbmd0aCtjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSk7XG5Tay5idWlsdGluLmZpbGUucHJvdG90eXBlLnRlbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShhLnBvcyQpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS50cnVuY2F0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5mYWlsKCl9KTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLndyaXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgYj1Tay5mZmkucmVtYXBUb0pzKGEubW9kZSk7U2suZmZpLnJlbWFwVG9KcyhjKTtpZihcIndcIj09PWJ8fFwid2JcIj09PWJ8fFwiYVwiPT09Ynx8XCJhYlwiPT09YilpZihTay5maWxld3JpdGUpe2lmKGEuY2xvc2VkKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlXCIpOzE9PT1hLmZpbGVubz9Tay5vdXRwdXQoU2suZmZpLnJlbWFwVG9KcyhjKSk6U2suZmlsZXdyaXRlKGEsYyl9ZWxzZSAxPT09XG5hLmZpbGVubz9Tay5vdXRwdXQoU2suZmZpLnJlbWFwVG9KcyhjKSk6U2suYXNzZXJ0cy5mYWlsKCk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZmlsZVwiLFNrLmJ1aWx0aW4uZmlsZSl9LGZ1bmN0aW9uKG0scSl7U2suZmZpPVNrLmZmaXx8e307U2suZmZpLnJlbWFwVG9QeT1mdW5jdGlvbihhKXt2YXIgYztpZihudWxsPT09YXx8XCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSQ7aWYoYS5vYiR0eXBlfHxhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbilyZXR1cm4gYTtpZihcIltvYmplY3QgQXJyYXldXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkpe3ZhciBiPVtdO2ZvcihjPTA7YzxhLmxlbmd0aDsrK2MpYi5wdXNoKFNrLmZmaS5yZW1hcFRvUHkoYVtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfWlmKFwib2JqZWN0XCI9PT10eXBlb2YgYSl7Yj1cbltdO2ZvcihjIGluIGEpYi5wdXNoKFNrLmZmaS5yZW1hcFRvUHkoYykpLGIucHVzaChTay5mZmkucmVtYXBUb1B5KGFbY10pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZGljdChiKX1pZihcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpcmV0dXJuIFNrLmJ1aWx0aW4uYXNzayQoYSk7aWYoXCJib29sZWFuXCI9PT10eXBlb2YgYSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChhKTtpZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIGEpcmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZnVuYyhhKTtTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgcmVtYXAgdHlwZSBcIit0eXBlb2YgYSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5yZW1hcFRvUHlcIixTay5mZmkucmVtYXBUb1B5KTtTay5mZmkucmVtYXBUb0pzPWZ1bmN0aW9uKGEpe3ZhciBjLFxuYjtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KXt2YXIgZT17fTthLiRpdGVtcygpLmZvckVhY2goKFthLGNdKT0+e2I9U2suZmZpLnJlbWFwVG9KcyhhKTtlW2JdPVNrLmZmaS5yZW1hcFRvSnMoYyl9KTtyZXR1cm4gZX1pZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5saXN0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7ZT1bXTtmb3IoYz0wO2M8YS52Lmxlbmd0aDsrK2MpZS5wdXNoKFNrLmZmaS5yZW1hcFRvSnMoYS52W2NdKSk7cmV0dXJuIGV9aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYm9vbClyZXR1cm4gYS52PyEwOiExO2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKXJldHVybiBTay5idWlsdGluLmFzbnVtJChhKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGF8fFwiYm9vbGVhblwiPT09dHlwZW9mIGF8fFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gYTtcbmlmKHZvaWQgMCE9PWEpcmV0dXJuIGEudn07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnJlbWFwVG9Kc1wiLFNrLmZmaS5yZW1hcFRvSnMpO1NrLmZmaS5jYWxsYmFjaz1mdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9hOmZ1bmN0aW9uKCl7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5KGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5jYWxsYmFja1wiLFNrLmZmaS5jYWxsYmFjayk7U2suZmZpLnN0ZHdyYXA9ZnVuY3Rpb24oYSxjKXthPW5ldyBhO2Eudj1jO3JldHVybiBhfTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkuc3Rkd3JhcFwiLFNrLmZmaS5zdGR3cmFwKTtTay5mZmkuYmFzaWN3cmFwPWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKXJldHVybiBTay5idWlsdGluLmFzbnVtJChhKTtcbmlmKFwibnVtYmVyXCI9PT10eXBlb2YgYXx8XCJib29sZWFuXCI9PT10eXBlb2YgYSlyZXR1cm4gYTtpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKTtTay5hc3NlcnRzLmZhaWwoXCJ1bmV4cGVjdGVkIHR5cGUgZm9yIGJhc2ljd3JhcFwiKX07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLmJhc2ljd3JhcFwiLFNrLmZmaS5iYXNpY3dyYXApO1NrLmZmaS51bndyYXBvPWZ1bmN0aW9uKGEpe2lmKHZvaWQgMCE9PWEpcmV0dXJuIGEudn07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnVud3JhcG9cIixTay5mZmkudW53cmFwbyk7U2suZmZpLnVud3JhcG49ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hP251bGw6YS52fTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkudW53cmFwblwiLFNrLmZmaS51bndyYXBuKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixlKXthPXZvaWQgMD09PWE/YTpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhKTtiPXZvaWQgMD09PVxuYj9iOlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGIpO2U9dm9pZCAwPT09ZT9lOlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGUpO2lmKHZvaWQgMD09PWImJnZvaWQgMD09PWUpYj1hLGE9MCxlPTE7ZWxzZSBpZih2b2lkIDA9PT1lKWU9MTtlbHNlIGlmKDA9PT1lKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJyYW5nZSgpIHN0ZXAgYXJndW1lbnQgbXVzdCBub3QgYmUgemVyb1wiKTtjb25zdCBkPVtdO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSYmXCJudW1iZXJcIj09PXR5cGVvZiBiJiZcIm51bWJlclwiPT09dHlwZW9mIGUpaWYoMDxlKWZvcih2YXIgZj1hO2Y8YjtmKz1lKWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGYpKTtlbHNlIGZvcihmPWE7Zj5iO2YrPWUpZC5wdXNoKG5ldyBTay5idWlsdGluLmludF8oZikpO2Vsc2V7YT1mPUpTQkkuQmlnSW50KGEpO2U9SlNCSS5CaWdJbnQoZSk7Yj1KU0JJLkJpZ0ludChiKTtpZihKU0JJLmdyZWF0ZXJUaGFuKGUsSlNCSS5fX1pFUk8pKWZvcig7SlNCSS5sZXNzVGhhbihmLFxuYik7KWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGMoZikpKSxmPUpTQkkuYWRkKGYsZSk7ZWxzZSBmb3IoO0pTQkkuZ3JlYXRlclRoYW4oZixiKTspZC5wdXNoKG5ldyBTay5idWlsdGluLmludF8oYyhmKSkpLGY9SlNCSS5hZGQoZixlKTthPWMoYSk7ZT1jKGUpO2I9YyhiKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ucmFuZ2VfKGEsYixlLGQpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIEpTQkkubGVzc1RoYW4oYSxKU0JJLl9fTUFYX1NBRkUpJiZKU0JJLmdyZWF0ZXJUaGFuKGEsSlNCSS5fX01JTl9TQUZFKT9KU0JJLnRvTnVtYmVyKGEpOmF9U2suYnVpbHRpbi5yYW5nZV89U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInJhbmdlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuc3RhcnQ9YTt0aGlzLnN0b3A9Yjt0aGlzLnN0ZXA9Yzt0aGlzLnY9ZH0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsXG50cCRkb2M6XCJyYW5nZShzdG9wKSAtPiByYW5nZSBvYmplY3RcXG5yYW5nZShzdGFydCwgc3RvcFssIHN0ZXBdKSAtPiByYW5nZSBvYmplY3RcXG5cXG5SZXR1cm4gYW4gb2JqZWN0IHRoYXQgcHJvZHVjZXMgYSBzZXF1ZW5jZSBvZiBpbnRlZ2VycyBmcm9tIHN0YXJ0IChpbmNsdXNpdmUpXFxudG8gc3RvcCAoZXhjbHVzaXZlKSBieSBzdGVwLiAgcmFuZ2UoaSwgaikgcHJvZHVjZXMgaSwgaSsxLCBpKzIsIC4uLiwgai0xLlxcbnN0YXJ0IGRlZmF1bHRzIHRvIDAsIGFuZCBzdG9wIGlzIG9taXR0ZWQhICByYW5nZSg0KSBwcm9kdWNlcyAwLCAxLCAyLCAzLlxcblRoZXNlIGFyZSBleGFjdGx5IHRoZSB2YWxpZCBpbmRpY2VzIGZvciBhIGxpc3Qgb2YgNCBlbGVtZW50cy5cXG5XaGVuIHN0ZXAgaXMgZ2l2ZW4sIGl0IHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IChvciBkZWNyZW1lbnQpLlwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJyYW5nZVwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInJhbmdlXCIsXG5iLDEsMyk7cmV0dXJuIGEoYlswXSxiWzFdLGJbMl0pfSwkcigpe2xldCBhPVwicmFuZ2UoXCIrdGhpcy5zdGFydCtcIiwgXCIrdGhpcy5zdG9wOzEhPXRoaXMuc3RlcCYmKGErPVwiLCBcIit0aGlzLnN0ZXApO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYStcIilcIil9LHRwJHJpY2hjb21wYXJlKGEsYil7aWYoXCJFcVwiIT09YiYmXCJOb3RFcVwiIT09Ynx8YS5vYiR0eXBlIT09U2suYnVpbHRpbi5yYW5nZV8pcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2E9bmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYpO3JldHVybihuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMudikpLnRwJHJpY2hjb21wYXJlKGEsYil9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGIodGhpcyl9LG5iJGJvb2woKXtyZXR1cm4gMCE9PXRoaXMudi5sZW5ndGh9LHNxJGNvbnRhaW5zKGEpe2NvbnN0IGI9dGhpcy52O2ZvcihsZXQgYz0wO2M8Yi5sZW5ndGg7YysrKWlmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLFxuYltjXSxcIkVxXCIpKXJldHVybiEwO3JldHVybiExfSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy52Lmxlbmd0aH0sbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpOzA+YSYmKGE9dGhpcy52Lmxlbmd0aCthKTtpZigwPmF8fGE+PXRoaXMudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcInJhbmdlIG9iamVjdCBpbmRleCBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIHRoaXMudlthXX1pZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5zbGljZSl7Y29uc3QgYj1bXSxjPXRoaXMudjthLnNzc2l0ZXIkKGMubGVuZ3RoLGE9PntiLnB1c2goY1thXSl9KTtsZXQge3N0YXJ0OmQsc3RvcDplLHN0ZXA6Zn09YS5zbGljZSRpbmRpY2VzKGMubGVuZ3RoKTtkPVNrLm1pc2NldmFsLmFzSW5kZXgoY1tkXSl8fHRoaXMuc3RhcnQ7ZT1Tay5taXNjZXZhbC5hc0luZGV4KGNbZV0pfHx0aGlzLnN0b3A7Zj1cblwibnVtYmVyXCI9PT10eXBlb2YgdGhpcy5zdGVwP2YqdGhpcy5zdGVwOkpTQkkubXVsdGlwbHkodGhpcy5zdGVwLEpTQkkuQmlnSW50KGYpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ucmFuZ2VfKGQsZSxmLGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInJhbmdlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fX0sZ2V0c2V0czp7c3RhcnQ6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnN0YXJ0KX19LHN0ZXA6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnN0ZXApfX0sc3RvcDp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuc3RvcCl9fX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgZSh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiBhIHJldmVyc2UgaXRlcmF0b3IuXCJ9LFxuY291bnQ6eyRtZXRoKGEpe2xldCBiPTA7Zm9yKGxldCBjPTA7Yzx0aGlzLnYubGVuZ3RoO2MrKylTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSx0aGlzLnZbY10sXCJFcVwiKSYmYisrO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwicmFuZ2VvYmplY3QuY291bnQodmFsdWUpIC0+IGludGVnZXIgLS0gcmV0dXJuIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB2YWx1ZVwifSxpbmRleDp7JG1ldGgoYSl7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSx0aGlzLnZbYl0sXCJFcVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXCJpcyBub3QgaW4gcmFuZ2VcIik7fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwicmFuZ2VvYmplY3QuaW5kZXgodmFsdWUsIFtzdGFydCwgW3N0b3BdXSkgLT4gaW50ZWdlciAtLSByZXR1cm4gaW5kZXggb2YgdmFsdWUuXFxuUmFpc2UgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuXCJ9fSxcbnByb3RvOntzayRhc2FycmF5KCl7cmV0dXJuIHRoaXMudi5zbGljZSgwKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7dmFyIGI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwicmFuZ2VfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe3JldHVybiB0aGlzLiRzZXFbdGhpcy4kaW5kZXgrK119LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pLGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwicmFuZ2VfcmV2ZXJzZWl0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJHNlcT1hLnY7dGhpcy4kaW5kZXg9dGhpcy4kc2VxLmxlbmd0aC0xfSxpdGVybmV4dCgpe3JldHVybiB0aGlzLiRzZXFbdGhpcy4kaW5kZXgtLV19LFxubWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4ucmFuZ2U9U2suYnVpbHRpbi54cmFuZ2U9ZnVuY3Rpb24oYixjLGUpe2I9YShiLGMsZSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYi52KX19LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5lbnVtZXJhdGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiZW51bWVyYXRlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7aWYoISh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5lbnVtZXJhdGUpKXRocm93IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ2VudW1lcmF0ZSc6IFBsZWFzZSB1c2UgdGhlICduZXcnIG9wZXJhdG9yXCIpO3RoaXMuJGl0ZXJhYmxlPWE7dGhpcy4kaW5kZXg9YztyZXR1cm4gdGhpc30saXRlcm5leHQoYSl7Y29uc3QgYz1Tay5taXNjZXZhbC5jaGFpbih0aGlzLiRpdGVyYWJsZS50cCRpdGVybmV4dChhKSxcbmE9PntpZih2b2lkIDAhPT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpbmRleCsrKSxhXSl9KTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX0sc2xvdHM6e3RwJGRvYzpcIlJldHVybiBhbiBlbnVtZXJhdGUgb2JqZWN0LlxcblxcbiAgaXRlcmFibGVcXG4gICAgYW4gb2JqZWN0IHN1cHBvcnRpbmcgaXRlcmF0aW9uXFxuXFxuVGhlIGVudW1lcmF0ZSBvYmplY3QgeWllbGRzIHBhaXJzIGNvbnRhaW5pbmcgYSBjb3VudCAoZnJvbSBzdGFydCwgd2hpY2hcXG5kZWZhdWx0cyB0byB6ZXJvKSBhbmQgYSB2YWx1ZSB5aWVsZGVkIGJ5IHRoZSBpdGVyYWJsZSBhcmd1bWVudC5cXG5cXG5lbnVtZXJhdGUgaXMgdXNlZnVsIGZvciBvYnRhaW5pbmcgYW4gaW5kZXhlZCBsaXN0OlxcbiAgICAoMCwgc2VxWzBdKSwgKDEsIHNlcVsxXSksICgyLCBzZXFbMl0pLCAuLi5cIix0cCRuZXcoYSxjKXtsZXQgW2IsXG5lXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImVudW1lcmF0ZVwiLFtcIml0ZXJhYmxlXCIsXCJzdGFydFwiXSxhLGMsW25ldyBTay5idWlsdGluLmludF8oMCldKTtiPVNrLmFic3RyLml0ZXIoYik7ZT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhlKTtpZih0aGlzPT09U2suYnVpbHRpbi5lbnVtZXJhdGUucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5lbnVtZXJhdGUoYixlKTthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4uZW51bWVyYXRlLmNhbGwoYSxiLGUpO3JldHVybiBhfX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmVudW1lcmF0ZVwiLFNrLmJ1aWx0aW4uZW51bWVyYXRlKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZpbHRlcl89U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiZmlsdGVyXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy4kZnVuYz1hO3RoaXMuJGl0ZXJhYmxlPWN9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9XG5Tay5taXNjZXZhbC5pdGVyRm9yKHRoaXMuJGl0ZXJhYmxlLGE9PlNrLm1pc2NldmFsLmNoYWluKHRoaXMuY2hlY2skZmlsdGVyKGEpLGE9PmE/bmV3IFNrLm1pc2NldmFsLkJyZWFrKGEpOnZvaWQgMCkpO3JldHVybiBhP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfSxzbG90czp7dHAkZG9jOlwiUmV0dXJuIGFuIGl0ZXJhdG9yIHlpZWxkaW5nIHRob3NlIGl0ZW1zIG9mIGl0ZXJhYmxlIGZvciB3aGljaCBmdW5jdGlvbihpdGVtKVxcbmlzIHRydWUuIElmIGZ1bmN0aW9uIGlzIE5vbmUsIHJldHVybiB0aGUgaXRlbXMgdGhhdCBhcmUgdHJ1ZS5cIix0cCRuZXcoYSxjKXtsZXQgW2IsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJmaWx0ZXJcIixbXCJwcmVkaWNhdGVcIixcIml0ZXJhYmxlXCJdLGEsYyxbXSk7Yj1Tay5idWlsdGluLmNoZWNrTm9uZShiKT9udWxsOmI7ZT1Tay5hYnN0ci5pdGVyKGUpO2lmKHRoaXM9PT1Tay5idWlsdGluLmZpbHRlcl8ucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5maWx0ZXJfKGIsXG5lKTthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4uZmlsdGVyXy5jYWxsKGEsYixlKTtyZXR1cm4gYX19LHByb3RvOntjaGVjayRmaWx0ZXIoYSl7bGV0IGM7Yz1udWxsPT09dGhpcy4kZnVuYz9hOlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLiRmdW5jLFthXSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGMsYj0+U2subWlzY2V2YWwuaXNUcnVlKGIpP2E6dm9pZCAwKX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5maWx0ZXJfXCIsU2suYnVpbHRpbi5maWx0ZXJfKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLm1hcF89U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwibWFwXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy4kZnVuYz1hO3RoaXMuJGl0ZXJzPWN9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9W10sYj1Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkodGhpcy4kaXRlcnMsYj0+U2subWlzY2V2YWwuY2hhaW4oYi50cCRpdGVybmV4dChhKSxcbmE9PntpZih2b2lkIDA9PT1hKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoITApO2MucHVzaChhKX0pKSxhPT5hP3ZvaWQgMDpTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkodGhpcy4kZnVuYyxjKSk7cmV0dXJuIGE/YjpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYil9LHNsb3RzOnt0cCRkb2M6XCJtYXAoZnVuYywgKml0ZXJhYmxlcykgLS1cXHgzZSBtYXAgb2JqZWN0XFxuXFxuTWFrZSBhbiBpdGVyYXRvciB0aGF0IGNvbXB1dGVzIHRoZSBmdW5jdGlvbiB1c2luZyBhcmd1bWVudHMgZnJvbVxcbmVhY2ggb2YgdGhlIGl0ZXJhYmxlcy4gIFN0b3BzIHdoZW4gdGhlIHNob3J0ZXN0IGl0ZXJhYmxlIGlzIGV4aGF1c3RlZC5cIix0cCRuZXcoYSxjKXt0aGlzPT09U2suYnVpbHRpbi5tYXBfLnByb3RvdHlwZSYmU2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1hcFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcIm1hcFwiLGEsMik7Yz1hWzBdO2NvbnN0IGI9XG5bXTtmb3IobGV0IGM9MTtjPGEubGVuZ3RoO2MrKyliLnB1c2goU2suYWJzdHIuaXRlcihhW2NdKSk7aWYodGhpcz09PVNrLmJ1aWx0aW4ubWFwXy5wcm90b3R5cGUpcmV0dXJuIG5ldyBTay5idWlsdGluLm1hcF8oYyxiKTthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4ubWFwXy5jYWxsKGEsYyxiKTtyZXR1cm4gYX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYXBfXCIsU2suYnVpbHRpbi5tYXBfKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnJldmVyc2VkPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInJldmVyc2VkXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGlkeD1hLnNxJGxlbmd0aCgpLTE7dGhpcy4kc2VxPWE7cmV0dXJuIHRoaXN9LGl0ZXJuZXh0KGEpe2lmKCEoMD50aGlzLiRpZHgpKXt2YXIgYz1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+U2suYWJzdHIub2JqZWN0R2V0SXRlbSh0aGlzLiRzZXEsbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpZHgtLSksXG5hKSxhPT57aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uSW5kZXhFcnJvcil0aGlzLiRpZHg9LTE7ZWxzZSB0aHJvdyBhO30pO3JldHVybiBhP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfX0sc2xvdHM6e3RwJGRvYzpcIlJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBzZXF1ZW5jZS5cIix0cCRuZXcoYSxjKXt0aGlzPT09U2suYnVpbHRpbi5yZXZlcnNlZC5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJyZXZlcnNlZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInJldmVyc2VkXCIsYSwxLDEpO2E9YVswXTtjPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kcmV2ZXJzZWQpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtpZighU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpfHx2b2lkIDA9PT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsXG5Tay5idWlsdGluLnN0ci4kbGVuKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBpcyBub3QgYSBzZXF1ZW5jZVwiKTtpZih0aGlzPT09U2suYnVpbHRpbi5yZXZlcnNlZC5wcm90b3R5cGUpcmV0dXJuIG5ldyBTay5idWlsdGluLnJldmVyc2VkKGEpO2M9bmV3IHRoaXMuY29uc3RydWN0b3I7U2suYnVpbHRpbi5yZXZlcnNlZC5jYWxsKGMsYSk7cmV0dXJuIGN9fSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PXRoaXMuJGlkeD9uZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJGlkeCk6bmV3IFNrLmJ1aWx0aW4uaW50XygwKX0sJGZsYWdzOntOb0FyZ3M6ITB9fX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnppcF89U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiemlwXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGl0ZXJzPWE7MD09PWEubGVuZ3RoJiZcbih0aGlzLnRwJGl0ZXJuZXh0PSgpPT57fSl9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9W10sYj1Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkodGhpcy4kaXRlcnMsYj0+U2subWlzY2V2YWwuY2hhaW4oYi50cCRpdGVybmV4dChhKSxhPT57aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTtjLnB1c2goYSl9KSksYT0+YT92b2lkIDA6bmV3IFNrLmJ1aWx0aW4udHVwbGUoYykpO3JldHVybiBhP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfSxzbG90czp7dHAkZG9jOlwiemlwKGl0ZXIxIFssaXRlcjIgWy4uLl1dKSAtLVxceDNlIHppcCBvYmplY3RcXG5cXG5SZXR1cm4gYSB6aXAgb2JqZWN0IHdob3NlIC5fX25leHRfXygpIG1ldGhvZCByZXR1cm5zIGEgdHVwbGUgd2hlcmVcXG50aGUgaS10aCBlbGVtZW50IGNvbWVzIGZyb20gdGhlIGktdGggaXRlcmFibGUgYXJndW1lbnQuICBUaGUgLl9fbmV4dF9fKClcXG5tZXRob2QgY29udGludWVzIHVudGlsIHRoZSBzaG9ydGVzdCBpdGVyYWJsZSBpbiB0aGUgYXJndW1lbnQgc2VxdWVuY2VcXG5pcyBleGhhdXN0ZWQgYW5kIHRoZW4gaXQgcmFpc2VzIFN0b3BJdGVyYXRpb24uXCIsXG50cCRuZXcoYSxjKXt0aGlzPT09U2suYnVpbHRpbi56aXBfLnByb3RvdHlwZSYmU2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInppcFwiLGMpO2M9W107Zm9yKGxldCBiPTA7YjxhLmxlbmd0aDtiKyspdHJ5e2MucHVzaChTay5hYnN0ci5pdGVyKGFbYl0pKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgU2suYnVpbHRpbi5UeXBlRXJyb3IpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiemlwIGFyZ3VtZW50ICNcIisoYisxKStcIiBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uXCIpO3Rocm93IGU7fWlmKHRoaXM9PT1Tay5idWlsdGluLnppcF8ucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi56aXBfKGMpO2E9bmV3IHRoaXMuY29uc3RydWN0b3I7U2suYnVpbHRpbi56aXBfLmNhbGwoYSxjKTtyZXR1cm4gYX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi56aXBfXCIsU2suYnVpbHRpbi56aXBfKX0sZnVuY3Rpb24obSxxKXt2YXIgYT17VF9FTkRNQVJLRVI6MCxUX05BTUU6MSxcblRfTlVNQkVSOjIsVF9TVFJJTkc6MyxUX05FV0xJTkU6NCxUX0lOREVOVDo1LFRfREVERU5UOjYsVF9MUEFSOjcsVF9SUEFSOjgsVF9MU1FCOjksVF9SU1FCOjEwLFRfQ09MT046MTEsVF9DT01NQToxMixUX1NFTUk6MTMsVF9QTFVTOjE0LFRfTUlOVVM6MTUsVF9TVEFSOjE2LFRfU0xBU0g6MTcsVF9WQkFSOjE4LFRfQU1QRVI6MTksVF9MRVNTOjIwLFRfR1JFQVRFUjoyMSxUX0VRVUFMOjIyLFRfRE9UOjIzLFRfUEVSQ0VOVDoyNCxUX0xCUkFDRToyNSxUX1JCUkFDRToyNixUX0VRRVFVQUw6MjcsVF9OT1RFUVVBTDoyOCxUX0xFU1NFUVVBTDoyOSxUX0dSRUFURVJFUVVBTDozMCxUX1RJTERFOjMxLFRfQ0lSQ1VNRkxFWDozMixUX0xFRlRTSElGVDozMyxUX1JJR0hUU0hJRlQ6MzQsVF9ET1VCTEVTVEFSOjM1LFRfUExVU0VRVUFMOjM2LFRfTUlORVFVQUw6MzcsVF9TVEFSRVFVQUw6MzgsVF9TTEFTSEVRVUFMOjM5LFRfUEVSQ0VOVEVRVUFMOjQwLFRfQU1QRVJFUVVBTDo0MSxUX1ZCQVJFUVVBTDo0MixcblRfQ0lSQ1VNRkxFWEVRVUFMOjQzLFRfTEVGVFNISUZURVFVQUw6NDQsVF9SSUdIVFNISUZURVFVQUw6NDUsVF9ET1VCTEVTVEFSRVFVQUw6NDYsVF9ET1VCTEVTTEFTSDo0NyxUX0RPVUJMRVNMQVNIRVFVQUw6NDgsVF9BVDo0OSxUX0FURVFVQUw6NTAsVF9SQVJST1c6NTEsVF9FTExJUFNJUzo1MixUX09QOjUzLFRfQVdBSVQ6NTQsVF9BU1lOQzo1NSxUX0VSUk9SVE9LRU46NTYsVF9OVF9PRkZTRVQ6MjU2LFRfTl9UT0tFTlM6NjAsVF9DT01NRU5UOjU3LFRfTkw6NTgsVF9FTkNPRElORzo1OX07bT17XCIhPVwiOmEuVF9OT1RFUVVBTCxcIiVcIjphLlRfUEVSQ0VOVCxcIiU9XCI6YS5UX1BFUkNFTlRFUVVBTCxcIiZcIjphLlRfQU1QRVIsXCImPVwiOmEuVF9BTVBFUkVRVUFMLFwiKFwiOmEuVF9MUEFSLFwiKVwiOmEuVF9SUEFSLFwiKlwiOmEuVF9TVEFSLFwiKipcIjphLlRfRE9VQkxFU1RBUixcIioqPVwiOmEuVF9ET1VCTEVTVEFSRVFVQUwsXCIqPVwiOmEuVF9TVEFSRVFVQUwsXCIrXCI6YS5UX1BMVVMsXCIrPVwiOmEuVF9QTFVTRVFVQUwsXG5cIixcIjphLlRfQ09NTUEsXCItXCI6YS5UX01JTlVTLFwiLT1cIjphLlRfTUlORVFVQUwsXCItPlwiOmEuVF9SQVJST1csXCIuXCI6YS5UX0RPVCxcIi4uLlwiOmEuVF9FTExJUFNJUyxcIi9cIjphLlRfU0xBU0gsXCIvL1wiOmEuVF9ET1VCTEVTTEFTSCxcIi8vPVwiOmEuVF9ET1VCTEVTTEFTSEVRVUFMLFwiLz1cIjphLlRfU0xBU0hFUVVBTCxcIjpcIjphLlRfQ09MT04sXCI7XCI6YS5UX1NFTUksXCI8XCI6YS5UX0xFU1MsXCI8PFwiOmEuVF9MRUZUU0hJRlQsXCI8PD1cIjphLlRfTEVGVFNISUZURVFVQUwsXCI8PVwiOmEuVF9MRVNTRVFVQUwsXCI9XCI6YS5UX0VRVUFMLFwiPT1cIjphLlRfRVFFUVVBTCxcIj5cIjphLlRfR1JFQVRFUixcIj49XCI6YS5UX0dSRUFURVJFUVVBTCxcIj4+XCI6YS5UX1JJR0hUU0hJRlQsXCI+Pj1cIjphLlRfUklHSFRTSElGVEVRVUFMLFwiQFwiOmEuVF9BVCxcIkA9XCI6YS5UX0FURVFVQUwsXCJbXCI6YS5UX0xTUUIsXCJdXCI6YS5UX1JTUUIsXCJeXCI6YS5UX0NJUkNVTUZMRVgsXCJePVwiOmEuVF9DSVJDVU1GTEVYRVFVQUwsXCJ7XCI6YS5UX0xCUkFDRSxcblwifFwiOmEuVF9WQkFSLFwifD1cIjphLlRfVkJBUkVRVUFMLFwifVwiOmEuVF9SQlJBQ0UsXCJ+XCI6YS5UX1RJTERFfTt2YXIgYz17fTsoZnVuY3Rpb24oKXtmb3IodmFyIGIgaW4gYSljW2FbYl1dPWJ9KSgpO1tcInRva19uYW1lXCIsXCJJU1RFUk1JTkFMXCIsXCJJU05PTlRFUk1JTkFMXCIsXCJJU0VPRlwiXS5jb25jYXQoT2JqZWN0LmtleXMoYykubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBjW2FdfSkpO1NrLnRva2VuPXt9O1NrLnRva2VuLnRva2Vucz1hO1NrLnRva2VuLnRva19uYW1lPWM7U2sudG9rZW4uRVhBQ1RfVE9LRU5fVFlQRVM9bTtTay50b2tlbi5JU1RFUk1JTkFMPWZ1bmN0aW9uKGIpe3JldHVybiBiPGEuVF9OVF9PRkZTRVR9O1NrLnRva2VuLklTTk9OVEVSTUlOQUw9ZnVuY3Rpb24oYil7cmV0dXJuIGI+PWEuVF9OVF9PRkZTRVR9O1NrLnRva2VuLklTRU9GPWZ1bmN0aW9uKGIpe3JldHVybiBiPT1hLlRfRU5ETUFSS0VSfTtTay5leHBvcnRTeW1ib2woXCJTay50b2tlblwiLFNrLnRva2VuKTtTay5leHBvcnRTeW1ib2woXCJTay50b2tlbi50b2tlbnNcIixcblNrLnRva2VuLnRva2Vucyk7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4udG9rX25hbWVcIixTay50b2tlbi50b2tfbmFtZSk7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4uRVhBQ1RfVE9LRU5fVFlQRVNcIik7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4uSVNURVJNSU5BTFwiLFNrLnRva2VuLklTVEVSTUlOQUwpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLklTTk9OVEVSTUlOQUxcIixTay50b2tlbi5JU05PTlRFUk1JTkFMKTtTay5leHBvcnRTeW1ib2woXCJTay50b2tlbi5JU0VPRlwiLFNrLnRva2VuLklTRU9GKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjLGQsZSl7dGhpcy50eXBlPWE7dGhpcy5zdHJpbmc9Yjt0aGlzLnN0YXJ0PWM7dGhpcy5lbmQ9ZDt0aGlzLmxpbmU9ZX1mdW5jdGlvbiBjKGEpe3JldHVyblwiKFwiK0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbihcInxcIikrXCIpXCJ9ZnVuY3Rpb24gYihhKXtyZXR1cm4gYy5hcHBseShudWxsLGFyZ3VtZW50cykrXG5cIj9cIn1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoO2MtLTspaWYoYVtjXT09PWIpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gZigpe3JldHVyblwiIEZSIFJGIEJyIEJSIEZyIHIgQiBSIGIgYlIgZiByYiByQiBGIFJmIFUgckYgdSBSQiBiciBmUiBmciByZiBSYlwiLnNwbGl0KFwiIFwiKX1mdW5jdGlvbiBsKGEpe2E/ZGVsZXRlIFNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW1wiPD5cIl06U2sudG9rZW4uRVhBQ1RfVE9LRU5fVFlQRVNbXCI8PlwiXT1Tay50b2tlbi50b2tlbnMuVF9OT1RFUVVBTDt0PU9iamVjdC5rZXlzKFNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTKS5zb3J0KCk7dj1jLmFwcGx5KHRoaXMsdC5yZXZlcnNlKCkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhJiZrLnRlc3QoYSk/YS5yZXBsYWNlKG4sXCJcXFxcJCZcIik6YX0pKTtCPWMoXCJcXFxccj9cXFxcblwiLHYpfXZhciBoPVNrLnRva2VuLnRva2Vucztjb25zdCBkPVNrLmJ1aWx0aW4uU3ludGF4RXJyb3IsZz1Tay5idWlsdGluLlN5bnRheEVycm9yO1xuYS5wcm90b3R5cGUuZXhhY3RfdHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGU9PWguVF9PUCYmdGhpcy5zdHJpbmcgaW4gU2sudG9rZW4uRVhBQ1RfVE9LRU5fVFlQRVM/U2sudG9rZW4uRVhBQ1RfVE9LRU5fVFlQRVNbdGhpcy5zdHJpbmddOnRoaXMudHlwZX07dmFyIG49L1tcXFxcXiQuKis/KClbXFxde318XS9nLGs9UmVnRXhwKG4uc291cmNlKTtjb25zdCBwPWZ1bmN0aW9uKCl7dmFyIGE9YyhcIltBLVpdXCIsXCJbYS16XVwiLFwiW1xcXFx1ezEwQjk5fS1cXFxcdXsxMEI5Q31cXFxcdXsxMTJBOX1cXFxcdXsxMTVEQ30tXFxcXHV7MTE1RER9XFxcXHUwMzRGXFxcXHUxMTVGLVxcXFx1MTE2MFxcXFx1MTdCNC1cXFxcdTE3QjVcXFxcdTIwNjVcXFxcdTMxNjRcXFxcdUZGQTBcXFxcdUZGRjAtXFxcXHVGRkY4XFxcXHV7RTAwMDB9XFxcXHV7RTAwMDJ9LVxcXFx1e0UwMDFGfVxcXFx1e0UwMDgwfS1cXFxcdXtFMDBGRn1cXFxcdXtFMDFGMH0tXFxcXHV7RTBGRkZ9XFxcXHV7MTEyQTl9XFxcXHUwMEQ3XVwiLFwiW1xcXFx1MDJCMC1cXFxcdTAyQzFcXFxcdTAyQzYtXFxcXHUwMkQxXFxcXHUwMkUwLVxcXFx1MDJFNFxcXFx1MDJFQ1xcXFx1MDJFRVxcXFx1MDM3NFxcXFx1MDM3QVxcXFx1MDU1OVxcXFx1MDZFNS1cXFxcdTA2RTZcXFxcdTA3RjQtXFxcXHUwN0Y1XFxcXHUwOTcxXFxcXHUxQzc4LVxcXFx1MUM3RFxcXFx1MUQyQy1cXFxcdTFENkFcXFxcdTFERkQtXFxcXHUxREZGXFxcXHUyRTJGXFxcXHUzMEZDXFxcXHVBNjdGXFxcXHVBNjlDLVxcXFx1QTY5RFxcXFx1QTcxNy1cXFxcdUE3MUZcXFxcdUE3ODhcXFxcdUE3RjgtXFxcXHVBN0Y5XFxcXHVBQjVDLVxcXFx1QUI1RlxcXFx1RkY3MFxcXFx1RkY5RS1cXFxcdUZGOUZcXFxcdXsxNkY5M30tXFxcXHV7MTZGOUZ9XFxcXHUwMkQwLVxcXFx1MDJEMVxcXFx1MDY0MFxcXFx1MDdGQVxcXFx1MEU0NlxcXFx1MEVDNlxcXFx1MTg0M1xcXFx1MUFBN1xcXFx1MUM3QlxcXFx1MzAwNVxcXFx1MzAzMS1cXFxcdTMwMzVcXFxcdTMwOUQtXFxcXHUzMDlFXFxcXHUzMEZDLVxcXFx1MzBGRVxcXFx1QTAxNVxcXFx1QTYwQ1xcXFx1QTlDRlxcXFx1QTlFNlxcXFx1QUE3MFxcXFx1QUFERFxcXFx1QUFGMy1cXFxcdUFBRjRcXFxcdUZGNzBcXFxcdXsxNkI0Mn0tXFxcXHV7MTZCNDN9XFxcXHV7MTZGRTB9LVxcXFx1ezE2RkUxfVxcXFx1MDJCMC1cXFxcdTAyQjhcXFxcdTAyQzAtXFxcXHUwMkMxXFxcXHUwMkUwLVxcXFx1MDJFNFxcXFx1MDM3QVxcXFx1MUQyQy1cXFxcdTFENkFcXFxcdTFENzhcXFxcdTFEOUItXFxcXHUxREJGXFxcXHUyMDcxXFxcXHUyMDdGXFxcXHUyMDkwLVxcXFx1MjA5Q1xcXFx1MkM3Qy1cXFxcdTJDN0RcXFxcdUE2OUMtXFxcXHVBNjlEXFxcXHVBNzcwXFxcXHVBN0Y4LVxcXFx1QTdGOVxcXFx1QUI1Qy1cXFxcdUFCNUZcXFxcdUZGOUUtXFxcXHVGRjlGXFxcXHUwMkIyXFxcXHUxRDYyXFxcXHUxREE0XFxcXHUxREE4XFxcXHUyMDcxXFxcXHUyQzdDXFxcXHUyRTE4LVxcXFx1MkUxOVxcXFx1MkUyRl1cIixcblwiW1xcXFx1MjEzNS1cXFxcdTIxMzhcXFxcdXsxRUUwMH0tXFxcXHV7MUVFMDN9XFxcXHV7MUVFMDV9LVxcXFx1ezFFRTFGfVxcXFx1ezFFRTIxfS1cXFxcdXsxRUUyMn1cXFxcdXsxRUUyNH1cXFxcdXsxRUUyN31cXFxcdXsxRUUyOX0tXFxcXHV7MUVFMzJ9XFxcXHV7MUVFMzR9LVxcXFx1ezFFRTM3fVxcXFx1ezFFRTM5fVxcXFx1ezFFRTNCfVxcXFx1ezFFRTQyfVxcXFx1ezFFRTQ3fVxcXFx1ezFFRTQ5fVxcXFx1ezFFRTRCfVxcXFx1ezFFRTREfS1cXFxcdXsxRUU0Rn1cXFxcdXsxRUU1MX0tXFxcXHV7MUVFNTJ9XFxcXHV7MUVFNTR9XFxcXHV7MUVFNTd9XFxcXHV7MUVFNTl9XFxcXHV7MUVFNUJ9XFxcXHV7MUVFNUR9XFxcXHV7MUVFNUZ9XFxcXHV7MUVFNjF9LVxcXFx1ezFFRTYyfVxcXFx1ezFFRTY0fVxcXFx1ezFFRTY3fS1cXFxcdXsxRUU2QX1cXFxcdXsxRUU2Q30tXFxcXHV7MUVFNzJ9XFxcXHV7MUVFNzR9LVxcXFx1ezFFRTc3fVxcXFx1ezFFRTc5fS1cXFxcdXsxRUU3Q31cXFxcdXsxRUU3RX1cXFxcdXsxRUU4MH0tXFxcXHV7MUVFODl9XFxcXHV7MUVFOEJ9LVxcXFx1ezFFRTlCfVxcXFx1ezFFRUExfS1cXFxcdXsxRUVBM31cXFxcdXsxRUVBNX0tXFxcXHV7MUVFQTl9XFxcXHV7MUVFQUJ9LVxcXFx1ezFFRUJCfVxcXFx1MzAwNlxcXFx1MzQwMC1cXFxcdTREQjVcXFxcdTRFMDAtXFxcXHU5RkVGXFxcXHVGOTAwLVxcXFx1RkE2RFxcXFx1RkE3MC1cXFxcdUZBRDlcXFxcdXsxNzAwMH0tXFxcXHV7MTg3RjF9XFxcXHV7MTg4MDB9LVxcXFx1ezE4QUYyfVxcXFx1ezFCMTcwfS1cXFxcdXsxQjJGQn1cXFxcdXsyMDAwMH0tXFxcXHV7MkE2RDZ9XFxcXHV7MkE3MDB9LVxcXFx1ezJCNzM0fVxcXFx1ezJCNzQwfS1cXFxcdXsyQjgxRH1cXFxcdXsyQjgyMH0tXFxcXHV7MkNFQTF9XFxcXHV7MkNFQjB9LVxcXFx1ezJFQkUwfVxcXFx1ezJGODAwfS1cXFxcdXsyRkExRH1cXFxcdUFBQzBcXFxcdUFBQzJcXFxcdUZFMjAtXFxcXHVGRTJGXFxcXHV7MTBEMjJ9LVxcXFx1ezEwRDIzfVxcXFx1ezExMzVEfVxcXFx1MDBBQVxcXFx1MDBCQVxcXFx1MzQwMC1cXFxcdTREQjVcXFxcdTRFMDAtXFxcXHU5RkVGXFxcXHVGQTBFLVxcXFx1RkEwRlxcXFx1RkExMVxcXFx1RkExMy1cXFxcdUZBMTRcXFxcdUZBMUZcXFxcdUZBMjFcXFxcdUZBMjMtXFxcXHVGQTI0XFxcXHVGQTI3LVxcXFx1RkEyOVxcXFx1ezIwMDAwfS1cXFxcdXsyQTZENn1cXFxcdXsyQTcwMH0tXFxcXHV7MkI3MzR9XFxcXHV7MkI3NDB9LVxcXFx1ezJCODFEfVxcXFx1ezJCODIwfS1cXFxcdXsyQ0VBMX1cXFxcdXsyQ0VCMH0tXFxcXHV7MkVCRTB9XFxcXHUxMTVGLVxcXFx1MTE2MFxcXFx1MzE2NFxcXFx1RkZBMFxcXFx1MDY3M1xcXFx1MTdBMy1cXFxcdTE3QTRcXFxcdTBFNDAtXFxcXHUwRTQ0XFxcXHUwRUMwLVxcXFx1MEVDNFxcXFx1MTlCNS1cXFxcdTE5QjdcXFxcdTE5QkFcXFxcdUFBQjUtXFxcXHVBQUI2XFxcXHVBQUI5XFxcXHVBQUJCLVxcXFx1QUFCQ11cIixcblwiW1xcXFx1MzAwN1xcXFx1MzAyMS1cXFxcdTMwMjlcXFxcdTMwMzgtXFxcXHUzMDNBXFxcXHUyMTcwLVxcXFx1MjE3RlxcXFx1MjE2MC1cXFxcdTIxNkZdXCIsXCJfXCIsXCJbXFxcXHUxODg1LVxcXFx1MTg4NlxcXFx1MjExOFxcXFx1MjEyRVxcXFx1MzA5Qi1cXFxcdTMwOUNdXCIpLGI9YyhhLFwiW1xcXFx1MTA0QS1cXFxcdTEwNEJcXFxcdTEwMkItXFxcXHUxMDJDXFxcXHUxMDJELVxcXFx1MTAzMFxcXFx1MTAzMVxcXFx1MTAzMi1cXFxcdTEwMzZcXFxcdTEwMzhcXFxcdTEwM0ItXFxcXHUxMDNDXFxcXHUxMDNELVxcXFx1MTAzRVxcXFx1MTA1Ni1cXFxcdTEwNTdcXFxcdTEwNTgtXFxcXHUxMDU5XFxcXHUxMDVFLVxcXFx1MTA2MFxcXFx1MTA2MlxcXFx1MTA2Ny1cXFxcdTEwNjhcXFxcdTEwNzEtXFxcXHUxMDc0XFxcXHUxMDgyXFxcXHUxMDgzLVxcXFx1MTA4NFxcXFx1MTA4NS1cXFxcdTEwODZcXFxcdTEwOUNcXFxcdTEwOURcXFxcdTEwMzdcXFxcdTEwMzktXFxcXHUxMDNBXFxcXHUxMDg3LVxcXFx1MTA4Q1xcXFx1MTA4RFxcXFx1MTA4RlxcXFx1MTA5QS1cXFxcdTEwOUJcXFxcdUE5RTVcXFxcdUFBN0JcXFxcdUFBN0NcXFxcdUFBN0RcXFxcdUE5RTZcXFxcdUFBNzBcXFxcdTEwNEEtXFxcXHUxMDRCXVwiLFwiW1xcXFx1MDkwM1xcXFx1MDkzQlxcXFx1MDkzRS1cXFxcdTA5NDBcXFxcdTA5NDktXFxcXHUwOTRDXFxcXHUwOTRFLVxcXFx1MDk0RlxcXFx1MDk4Mi1cXFxcdTA5ODNcXFxcdTA5QkUtXFxcXHUwOUMwXFxcXHUwOUM3LVxcXFx1MDlDOFxcXFx1MDlDQi1cXFxcdTA5Q0NcXFxcdTA5RDdcXFxcdTBBMDNcXFxcdTBBM0UtXFxcXHUwQTQwXFxcXHUwQTgzXFxcXHUwQUJFLVxcXFx1MEFDMFxcXFx1MEFDOVxcXFx1MEFDQi1cXFxcdTBBQ0NcXFxcdTBCMDItXFxcXHUwQjAzXFxcXHUwQjNFXFxcXHUwQjQwXFxcXHUwQjQ3LVxcXFx1MEI0OFxcXFx1MEI0Qi1cXFxcdTBCNENcXFxcdTBCNTdcXFxcdTBCQkUtXFxcXHUwQkJGXFxcXHUwQkMxLVxcXFx1MEJDMlxcXFx1MEJDNi1cXFxcdTBCQzhcXFxcdTBCQ0EtXFxcXHUwQkNDXFxcXHUwQkQ3XFxcXHUwQzAxLVxcXFx1MEMwM1xcXFx1MEM0MS1cXFxcdTBDNDRcXFxcdTBDODItXFxcXHUwQzgzXFxcXHUwQ0JFXFxcXHUwQ0MwLVxcXFx1MENDNFxcXFx1MENDNy1cXFxcdTBDQzhcXFxcdTBDQ0EtXFxcXHUwQ0NCXFxcXHUwQ0Q1LVxcXFx1MENENlxcXFx1MEQwMi1cXFxcdTBEMDNcXFxcdTBEM0UtXFxcXHUwRDQwXFxcXHUwRDQ2LVxcXFx1MEQ0OFxcXFx1MEQ0QS1cXFxcdTBENENcXFxcdTBENTdcXFxcdTBEODItXFxcXHUwRDgzXFxcXHUwRENGLVxcXFx1MEREMVxcXFx1MEREOC1cXFxcdTBEREZcXFxcdTBERjItXFxcXHUwREYzXFxcXHUwRjdGXFxcXHUxMDJCLVxcXFx1MTAyQ1xcXFx1MTAzMVxcXFx1MTAzOFxcXFx1MTAzQi1cXFxcdTEwM0NcXFxcdTEwNTYtXFxcXHUxMDU3XFxcXHUxMDYyXFxcXHUxMDY3LVxcXFx1MTA2OFxcXFx1MTA4My1cXFxcdTEwODRcXFxcdTEwOUNcXFxcdTE3QjZcXFxcdTE3QkUtXFxcXHUxN0M1XFxcXHUxN0M3LVxcXFx1MTdDOFxcXFx1MTkyMy1cXFxcdTE5MjZcXFxcdTE5MjktXFxcXHUxOTJCXFxcXHUxOTMwLVxcXFx1MTkzMVxcXFx1MTkzMy1cXFxcdTE5MzhcXFxcdTFBMTktXFxcXHUxQTFBXFxcXHUxQTU1XFxcXHUxQTU3XFxcXHUxQTYxXFxcXHUxQTYzLVxcXFx1MUE2NFxcXFx1MUE2RC1cXFxcdTFBNzJcXFxcdTFCMDRcXFxcdTFCMzVcXFxcdTFCM0JcXFxcdTFCM0QtXFxcXHUxQjQxXFxcXHUxQjQzXFxcXHUxQjgyXFxcXHUxQkExXFxcXHUxQkE2LVxcXFx1MUJBN1xcXFx1MUJFN1xcXFx1MUJFQS1cXFxcdTFCRUNcXFxcdTFCRUVcXFxcdTFDMjQtXFxcXHUxQzJCXFxcXHUxQzM0LVxcXFx1MUMzNVxcXFx1MUNGMi1cXFxcdTFDRjNcXFxcdUE4MjMtXFxcXHVBODI0XFxcXHVBODI3XFxcXHVBODgwLVxcXFx1QTg4MVxcXFx1QThCNC1cXFxcdUE4QzNcXFxcdUE5NTJcXFxcdUE5ODNcXFxcdUE5QjQtXFxcXHVBOUI1XFxcXHVBOUJBLVxcXFx1QTlCQlxcXFx1QTlCRC1cXFxcdUE5QkZcXFxcdUFBMkYtXFxcXHVBQTMwXFxcXHVBQTMzLVxcXFx1QUEzNFxcXFx1QUE0RFxcXFx1QUFFQlxcXFx1QUFFRS1cXFxcdUFBRUZcXFxcdUFBRjVcXFxcdUFCRTMtXFxcXHVBQkU0XFxcXHVBQkU2LVxcXFx1QUJFN1xcXFx1QUJFOS1cXFxcdUFCRUFcXFxcdXsxMTAwMH1cXFxcdXsxMTAwMn1cXFxcdXsxMTA4Mn1cXFxcdXsxMTBCMH0tXFxcXHV7MTEwQjJ9XFxcXHV7MTEwQjd9LVxcXFx1ezExMEI4fVxcXFx1ezExMTJDfVxcXFx1ezExMTQ1fS1cXFxcdXsxMTE0Nn1cXFxcdXsxMTE4Mn1cXFxcdXsxMTFCM30tXFxcXHV7MTExQjV9XFxcXHV7MTExQkZ9XFxcXHV7MTEyMkN9LVxcXFx1ezExMjJFfVxcXFx1ezExMjMyfS1cXFxcdXsxMTIzM31cXFxcdXsxMTJFMH0tXFxcXHV7MTEyRTJ9XFxcXHV7MTEzMDJ9LVxcXFx1ezExMzAzfVxcXFx1ezExMzNFfS1cXFxcdXsxMTMzRn1cXFxcdXsxMTM0MX0tXFxcXHV7MTEzNDR9XFxcXHV7MTEzNDd9LVxcXFx1ezExMzQ4fVxcXFx1ezExMzRCfS1cXFxcdXsxMTM0Q31cXFxcdXsxMTM1N31cXFxcdXsxMTM2Mn0tXFxcXHV7MTEzNjN9XFxcXHV7MTE0MzV9LVxcXFx1ezExNDM3fVxcXFx1ezExNDQwfS1cXFxcdXsxMTQ0MX1cXFxcdXsxMTQ0NX1cXFxcdXsxMTRCMH0tXFxcXHV7MTE0QjJ9XFxcXHV7MTE0Qjl9XFxcXHV7MTE0QkJ9LVxcXFx1ezExNEJFfVxcXFx1ezExNEMxfVxcXFx1ezExNUFGfS1cXFxcdXsxMTVCMX1cXFxcdXsxMTVCOH0tXFxcXHV7MTE1QkJ9XFxcXHV7MTE1QkV9XFxcXHV7MTE2MzB9LVxcXFx1ezExNjMyfVxcXFx1ezExNjNCfS1cXFxcdXsxMTYzQ31cXFxcdXsxMTYzRX1cXFxcdXsxMTZBQ31cXFxcdXsxMTZBRX0tXFxcXHV7MTE2QUZ9XFxcXHV7MTE3MjB9LVxcXFx1ezExNzIxfVxcXFx1ezExNzI2fVxcXFx1ezExODJDfS1cXFxcdXsxMTgyRX1cXFxcdXsxMTgzOH1cXFxcdXsxMUEzOX1cXFxcdXsxMUE1N30tXFxcXHV7MTFBNTh9XFxcXHV7MTFBOTd9XFxcXHV7MTFDMkZ9XFxcXHV7MTFDM0V9XFxcXHV7MTFDQTl9XFxcXHV7MTFDQjF9XFxcXHV7MTFDQjR9XFxcXHV7MTFEOEF9LVxcXFx1ezExRDhFfVxcXFx1ezExRDkzfS1cXFxcdXsxMUQ5NH1cXFxcdXsxMUQ5Nn1cXFxcdXsxMUVGNX0tXFxcXHV7MTFFRjZ9XFxcXHV7MTZGNTF9LVxcXFx1ezE2RjdFfVxcXFx1MEYzRS1cXFxcdTBGM0ZcXFxcdTEwODctXFxcXHUxMDhDXFxcXHUxMDhGXFxcXHUxMDlBLVxcXFx1MTA5QlxcXFx1MUI0NFxcXFx1MUJBQVxcXFx1MUNFMVxcXFx1MUNGN1xcXFx1MzAyRS1cXFxcdTMwMkZcXFxcdUE5NTNcXFxcdUE5QzBcXFxcdUFBN0JcXFxcdUFBN0RcXFxcdUFCRUNcXFxcdXsxMTFDMH1cXFxcdXsxMTIzNX1cXFxcdXsxMTM0RH1cXFxcdXsxMTZCNn1cXFxcdXsxRDE2RH0tXFxcXHV7MUQxNzJ9XFxcXHUwOUJFXFxcXHUwOUQ3XFxcXHUwQjNFXFxcXHUwQjU3XFxcXHUwQkJFXFxcXHUwQkQ3XFxcXHUwQ0MyXFxcXHUwQ0Q1LVxcXFx1MENENlxcXFx1MEQzRVxcXFx1MEQ1N1xcXFx1MERDRlxcXFx1MERERlxcXFx1MzAyRS1cXFxcdTMwMkZcXFxcdXsxMTMzRX1cXFxcdXsxMTM1N31cXFxcdXsxMTRCMH1cXFxcdXsxMTRCRH1cXFxcdXsxMTVBRn1cXFxcdXsxRDE2NX1cXFxcdXsxRDE2RX0tXFxcXHV7MUQxNzJ9XVwiLFxuXCJbXFxcXHV7MUQ3Q0V9LVxcXFx1ezFEN0ZGfVxcXFx1RkYxMC1cXFxcdUZGMTldXCIsXCJcXFxcdTIwNDBcIixcIltcXFxcdTAwQjdcXFxcdTAzODdcXFxcdTEzNjktXFxcXHUxMzcxXFxcXHUxOURBXVwiKTtpZighMT09PVJlZ0V4cCgpLnVuaWNvZGUpcmV0dXJuIG5ldyBSZWdFeHAoXCJeXCIrYStcIitcIitiK1wiKiRcIixcInVcIik7YT1jKFwiW0EtWl1cIixcIlthLXpdXCIsXCJfXCIpO2I9YyhhLFwiWzAtOV1cIik7cmV0dXJuIG5ldyBSZWdFeHAoXCJeXCIrYStcIitcIitiK1wiKiRcIil9KCk7KGZ1bmN0aW9uKGEpe3JldHVybiBjLmFwcGx5KG51bGwsYXJndW1lbnRzKStcIipcIn0pKFwiXFxcXFxcXFxcXFxccj9cXFxcblsgXFxcXGZcXFxcdF0qXCIpO2IoXCIjW15cXFxcclxcXFxuXSpcIik7bT1jKFwiWzAtOV0oPzpfP1swLTldKSpcXFxcLig/OlswLTldKD86Xz9bMC05XSkqKT9cIixcIlxcXFwuWzAtOV0oPzpfP1swLTldKSpcIikrYihcIltlRV1bLStdP1swLTldKD86Xz9bMC05XSkqXCIpO3ZhciB1PWMobSxcIlswLTldKD86Xz9bMC05XSkqW2VFXVstK10/WzAtOV0oPzpfP1swLTldKSpcIiksQT1jKFwiWzAtOV0oPzpfP1swLTldKSpbakpdXCIsXG51K1wiW2pKXVwiKTttPWMuYXBwbHkobnVsbCxmKCkpO3E9YyhtK1wiJycnXCIsbSsnXCJcIlwiJyk7YyhtK1wiJ1teXFxcXG4nXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXFxcXG4nXFxcXFxcXFxdKikqJ1wiLG0rJ1wiW15cXFxcblwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXFxcXG5cIlxcXFxcXFxcXSopKlwiJyk7dmFyIHQsdixCO2woITApO1NrLnRva2VuLnNldHVwVG9rZW5zPWw7dmFyIEQ9YyhtK1wiJ1teXFxcXG4nXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXFxcXG4nXFxcXFxcXFxdKikqXCIrYyhcIidcIixcIlxcXFxcXFxcXFxcXHI/XFxcXG5cIiksbSsnXCJbXlxcXFxuXCJcXFxcXFxcXF0qKD86XFxcXFxcXFwuW15cXFxcblwiXFxcXFxcXFxdKikqJytjKCdcIicsXCJcXFxcXFxcXFxcXFxyP1xcXFxuXCIpKSxFPWMoXCJcXFxcXFxcXFxcXFxyP1xcXFxufCRcIixcIiNbXlxcXFxyXFxcXG5dKlwiLHEpLEY9e307bT1mKCk7Zm9yKGxldCBhIG9mIG0pRlthK1wiJ1wiXT1cIl5bXidcXFxcXFxcXF0qKD86XFxcXFxcXFwuW14nXFxcXFxcXFxdKikqJ1wiLEZbYSsnXCInXT0nXlteXCJcXFxcXFxcXF0qKD86XFxcXFxcXFwuW15cIlxcXFxcXFxcXSopKlwiJyxGW2ErXCInJydcIl09XCJeW14nXFxcXFxcXFxdKig/Oig/OlxcXFxcXFxcLnwnKD8hJycpKVteJ1xcXFxcXFxcXSopKicnJ1wiLFxuRlthKydcIlwiXCInXT0nXlteXCJcXFxcXFxcXF0qKD86KD86XFxcXFxcXFwufFwiKD8hXCJcIikpW15cIlxcXFxcXFxcXSopKlwiXCJcIic7bGV0IE09W10sVj1bXTtmb3IobGV0IGEgb2YgbSlNLnB1c2goYSsnXCInKSxNLnB1c2goYStcIidcIiksVi5wdXNoKGErJ1wiXCJcIicpLFYucHVzaChhK1wiJycnXCIpO1NrLl90b2tlbml6ZT1mdW5jdGlvbihiLGYsayxuKXt2YXIgbD1Tay5fX2Z1dHVyZV9fLnB5dGhvbjM/XCJcIjpcIig/Okw/KVwiO2w9YyhcIjBbeFhdKD86Xz9bMC05YS1mQS1GXSkrXCIrbCxcIjBbYkJdKD86Xz9bMDFdKStcIitsLFNrLl9fZnV0dXJlX18uc2lsZW50X29jdGFsX2xpdGVyYWw/XCIwKFtvT10/KSg/Ol8/WzAtN10pK1wiK2w6XCIwKFtvT10pKD86Xz9bMC03XSkrXCIrbCxcIig/OjAoPzpfPzApKnxbMS05XSg/Ol8/WzAtOV0pKilcIitsKTtsPWMoQSx1LGwpO2w9XCJbIFxcXFxmXFxcXHRdKlwiK2MoRSxsLEIsRCxcIlxcXFx3K1wiKTtsPW5ldyBSZWdFeHAobCk7dmFyIG09MCx0PTAscT0wLHY9XCJcIix5PTAsRz1udWxsLEw9WzBdLEgsVD12b2lkIDAsXG5YPXZvaWQgMCxJLFI7dm9pZCAwIT09ayYmKFwidXRmLTgtc2lnXCI9PWsmJihrPVwidXRmLThcIiksbihuZXcgYShoLlRfRU5DT0RJTkcsayxbMCwwXSxbMCwwXSxcIlwiKSkpO2Zvcih2YXIgQz1rPVwiXCI7Oyl7dHJ5e2s9QyxDPWYoKX1jYXRjaChPKXtDPVwiXCJ9bSs9MTt2YXIgdz0wLE49Qy5sZW5ndGg7aWYodil7aWYoIUMpdGhyb3cgbmV3IGQoXCJFT0YgaW4gbXVsdGktbGluZSBzdHJpbmdcIixiLFhbMF0sWFsxXSk7VC5sYXN0SW5kZXg9MDt2YXIgcj1ULmV4ZWMoQyk7aWYocil3PUk9clswXS5sZW5ndGgsbihuZXcgYShoLlRfU1RSSU5HLHYrQy5zdWJzdHJpbmcoMCxJKSxYLFttLEldLEcrQykpLHY9XCJcIix5PTAsRz1udWxsO2Vsc2V7eSYmXCJcXFxcXFxuXCIhPT1DLnN1YnN0cmluZyhDLmxlbmd0aC0yKSYmXCJcXFxcXFxyXFxuXCIhPT1DLnN1YnN0cmluZyhDLmxlbmd0aC0zKT8obihuZXcgYShoLlRfRVJST1JUT0tFTix2K0MsWCxbbSxDLmxlbmd0aF0sRykpLHY9XCJcIixHPW51bGwpOih2Kz1DLEcrPUMpO2NvbnRpbnVlfX1lbHNlIGlmKDAhPVxudHx8cSl7aWYoIUMpdGhyb3cgbmV3IGQoXCJFT0YgaW4gbXVsdGktbGluZSBzdGF0ZW1lbnRcIixiLG0sMCk7cT0wfWVsc2V7aWYoIUMpYnJlYWs7Zm9yKEg9MDt3PE47KXtpZihcIiBcIj09Q1t3XSlIKz0xO2Vsc2UgaWYoXCJcXHRcIj09Q1t3XSlIPTgqTWF0aC5mbG9vcihILzgrMSk7ZWxzZSBpZihcIlxcZlwiPT1DW3ddKUg9MDtlbHNlIGJyZWFrO3crPTF9aWYodz09TilicmVhaztpZihlKFwiI1xcclxcblwiLENbd10pKXtpZihcIiNcIj09Q1t3XSl7SD1DLnN1YnN0cmluZyh3KTtmb3IoTj1ILmxlbmd0aDswPE4mJi0xIT09XCJcXHJcXG5cIi5pbmRleE9mKEguY2hhckF0KE4tMSkpOy0tTik7Tj1ILnN1YnN0cmluZygwLE4pO24obmV3IGEoaC5UX0NPTU1FTlQsTixbbSx3XSxbbSx3K04ubGVuZ3RoXSxDKSk7dys9Ti5sZW5ndGh9bihuZXcgYShoLlRfTkwsQy5zdWJzdHJpbmcodyksW20sd10sW20sQy5sZW5ndGhdLEMpKTtjb250aW51ZX1IPkxbTC5sZW5ndGgtMV0mJihMLnB1c2goSCksbihuZXcgYShoLlRfSU5ERU5ULFxuQy5zdWJzdHJpbmcodyksW20sMF0sW20sd10sQykpKTtmb3IoO0g8TFtMLmxlbmd0aC0xXTspe2lmKCFlKEwsSCkpdGhyb3cgbmV3IGcoXCJ1bmluZGVudCBkb2VzIG5vdCBtYXRjaCBhbnkgb3V0ZXIgaW5kZW50YXRpb24gbGV2ZWxcIixiLG0sdyk7TD1MLnNsaWNlKDAsLTEpO24obmV3IGEoaC5UX0RFREVOVCxcIlwiLFttLHddLFttLHddLEMpKX19Zm9yKDt3PE47KXtmb3IoSD1DLmNoYXJBdCh3KTtcIiBcIj09PUh8fFwiXFxmXCI9PT1IfHxcIlxcdFwiPT09SDspdys9MSxIPUMuY2hhckF0KHcpO2lmKFI9bC5leGVjKEMuc3Vic3RyaW5nKHcpKSl7aWYoSD13LEk9SCtSWzFdLmxlbmd0aCxSPVttLEhdLHI9W20sSV0sdz1JLEghPUkpe0k9Qy5zdWJzdHJpbmcoSCxJKTt2YXIgej1DW0hdO2lmKGUoXCIwMTIzNDU2Nzg5XCIseil8fFwiLlwiPT16JiZcIi5cIiE9SSYmXCIuLi5cIiE9SSluKG5ldyBhKGguVF9OVU1CRVIsSSxSLHIsQykpO2Vsc2UgaWYoZShcIlxcclxcblwiLHopKTA8dD9uKG5ldyBhKGguVF9OTCxJLFIscixDKSk6XG5uKG5ldyBhKGguVF9ORVdMSU5FLEksUixyLEMpKTtlbHNlIGlmKFwiI1wiPT16KW4obmV3IGEoaC5UX0NPTU1FTlQsSSxSLHIsQykpO2Vsc2UgaWYoZShWLEkpKWlmKFQ9UmVnRXhwKEZbSV0pLHI9VC5leGVjKEMuc3Vic3RyaW5nKHcpKSl3PXJbMF0ubGVuZ3RoK3csST1DLnN1YnN0cmluZyhILHcpLG4obmV3IGEoaC5UX1NUUklORyxJLFIsW20sd10sQykpO2Vsc2V7WD1bbSxIXTt2PUMuc3Vic3RyaW5nKEgpO0c9QzticmVha31lbHNlIGlmKGUoTSx6KXx8ZShNLEkuc3Vic3RyaW5nKDAsMikpfHxlKE0sSS5zdWJzdHJpbmcoMCwzKSkpaWYoXCJcXG5cIj09SVtJLmxlbmd0aC0xXSl7WD1bbSxIXTtUPVJlZ0V4cChGW3pdfHxGW0lbMV1dfHxGW0lbMl1dKTt2PUMuc3Vic3RyaW5nKEgpO3k9MTtHPUM7YnJlYWt9ZWxzZSBuKG5ldyBhKGguVF9TVFJJTkcsSSxSLHIsQykpO2Vsc2UgSD16Lm5vcm1hbGl6ZShcIk5GS0NcIikscC50ZXN0KEgpP24obmV3IGEoaC5UX05BTUUsSSxSLHIsQykpOlwiXFxcXFwiPT1cbno/cT0xOihlKFwiKFt7XCIseik/dCs9MTplKFwiKV19XCIseikmJi0tdCxuKG5ldyBhKGguVF9PUCxJLFIscixDKSkpfX1lbHNlIG4obmV3IGEoaC5UX0VSUk9SVE9LRU4sQ1t3XSxbbSx3XSxbbSx3KzFdLEMpKSx3Kz0xfX1rJiYhZShcIlxcclxcblwiLGtbay5sZW5ndGgtMV0pJiZuKG5ldyBhKGguVF9ORVdMSU5FLFwiXCIsW20tMSxrLmxlbmd0aF0sW20tMSxrLmxlbmd0aCsxXSxcIlwiKSk7Zm9yKHZhciBaIGluIEwuc2xpY2UoMSkpbihuZXcgYShoLlRfREVERU5ULFwiXCIsW20sMF0sW20sMF0sXCJcIikpO24obmV3IGEoaC5UX0VORE1BUktFUixcIlwiLFttLDBdLFttLDBdLFwiXCIpKX07U2suZXhwb3J0U3ltYm9sKFwiU2suX3Rva2VuaXplXCIsU2suX3Rva2VuaXplKX0sZnVuY3Rpb24obSxxKXtTay5PcE1hcD17XCIoXCI6U2sudG9rZW4udG9rZW5zLlRfTFBBUixcIilcIjpTay50b2tlbi50b2tlbnMuVF9SUEFSLFwiW1wiOlNrLnRva2VuLnRva2Vucy5UX0xTUUIsXCJdXCI6U2sudG9rZW4udG9rZW5zLlRfUlNRQixcIjpcIjpTay50b2tlbi50b2tlbnMuVF9DT0xPTixcblwiLFwiOlNrLnRva2VuLnRva2Vucy5UX0NPTU1BLFwiO1wiOlNrLnRva2VuLnRva2Vucy5UX1NFTUksXCIrXCI6U2sudG9rZW4udG9rZW5zLlRfUExVUyxcIi1cIjpTay50b2tlbi50b2tlbnMuVF9NSU5VUyxcIipcIjpTay50b2tlbi50b2tlbnMuVF9TVEFSLFwiL1wiOlNrLnRva2VuLnRva2Vucy5UX1NMQVNILFwifFwiOlNrLnRva2VuLnRva2Vucy5UX1ZCQVIsXCImXCI6U2sudG9rZW4udG9rZW5zLlRfQU1QRVIsXCI8XCI6U2sudG9rZW4udG9rZW5zLlRfTEVTUyxcIj5cIjpTay50b2tlbi50b2tlbnMuVF9HUkVBVEVSLFwiPVwiOlNrLnRva2VuLnRva2Vucy5UX0VRVUFMLFwiLlwiOlNrLnRva2VuLnRva2Vucy5UX0RPVCxcIiVcIjpTay50b2tlbi50b2tlbnMuVF9QRVJDRU5ULFwiYFwiOlNrLnRva2VuLnRva2Vucy5UX0JBQ0tRVU9URSxcIntcIjpTay50b2tlbi50b2tlbnMuVF9MQlJBQ0UsXCJ9XCI6U2sudG9rZW4udG9rZW5zLlRfUkJSQUNFLFwiQFwiOlNrLnRva2VuLnRva2Vucy5UX0FULFwiQD1cIjpTay50b2tlbi50b2tlbnMuVF9BVEVRVUFMLFxuXCI9PVwiOlNrLnRva2VuLnRva2Vucy5UX0VRRVFVQUwsXCIhPVwiOlNrLnRva2VuLnRva2Vucy5UX05PVEVRVUFMLFwiPD5cIjpTay50b2tlbi50b2tlbnMuVF9OT1RFUVVBTCxcIjw9XCI6U2sudG9rZW4udG9rZW5zLlRfTEVTU0VRVUFMLFwiPj1cIjpTay50b2tlbi50b2tlbnMuVF9HUkVBVEVSRVFVQUwsXCJ+XCI6U2sudG9rZW4udG9rZW5zLlRfVElMREUsXCJeXCI6U2sudG9rZW4udG9rZW5zLlRfQ0lSQ1VNRkxFWCxcIjw8XCI6U2sudG9rZW4udG9rZW5zLlRfTEVGVFNISUZULFwiPj5cIjpTay50b2tlbi50b2tlbnMuVF9SSUdIVFNISUZULFwiKipcIjpTay50b2tlbi50b2tlbnMuVF9ET1VCTEVTVEFSLFwiKz1cIjpTay50b2tlbi50b2tlbnMuVF9QTFVTRVFVQUwsXCItPVwiOlNrLnRva2VuLnRva2Vucy5UX01JTkVRVUFMLFwiKj1cIjpTay50b2tlbi50b2tlbnMuVF9TVEFSRVFVQUwsXCIvPVwiOlNrLnRva2VuLnRva2Vucy5UX1NMQVNIRVFVQUwsXCIlPVwiOlNrLnRva2VuLnRva2Vucy5UX1BFUkNFTlRFUVVBTCxcIiY9XCI6U2sudG9rZW4udG9rZW5zLlRfQU1QRVJFUVVBTCxcblwifD1cIjpTay50b2tlbi50b2tlbnMuVF9WQkFSRVFVQUwsXCJePVwiOlNrLnRva2VuLnRva2Vucy5UX0NJUkNVTUZMRVhFUVVBTCxcIjw8PVwiOlNrLnRva2VuLnRva2Vucy5UX0xFRlRTSElGVEVRVUFMLFwiPj49XCI6U2sudG9rZW4udG9rZW5zLlRfUklHSFRTSElGVEVRVUFMLFwiKio9XCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU1RBUkVRVUFMLFwiLy9cIjpTay50b2tlbi50b2tlbnMuVF9ET1VCTEVTTEFTSCxcIi8vPVwiOlNrLnRva2VuLnRva2Vucy5UX0RPVUJMRVNMQVNIRVFVQUwsXCItPlwiOlNrLnRva2VuLnRva2Vucy5UX1JBUlJPVyxcIi4uLlwiOlNrLnRva2VuLnRva2Vucy5UX0VMTElQU0lTfTtTay5QYXJzZVRhYmxlcz17c3ltOnthbmRfZXhwcjoyNTcsYW5kX3Rlc3Q6MjU4LGFubmFzc2lnbjoyNTksYXJnbGlzdDoyNjAsYXJndW1lbnQ6MjYxLGFyaXRoX2V4cHI6MjYyLGFzc2VydF9zdG10OjI2Myxhc3luY19mdW5jZGVmOjI2NCxhc3luY19zdG10OjI2NSxhdG9tOjI2NixhdG9tX2V4cHI6MjY3LFxuYXVnYXNzaWduOjI2OCxicmVha19zdG10OjI2OSxjbGFzc2RlZjoyNzAsY29tcF9mb3I6MjcxLGNvbXBfaWY6MjcyLGNvbXBfaXRlcjoyNzMsY29tcF9vcDoyNzQsY29tcGFyaXNvbjoyNzUsY29tcG91bmRfc3RtdDoyNzYsY29udGludWVfc3RtdDoyNzcsZGVidWdnZXJfc3RtdDoyNzgsZGVjb3JhdGVkOjI3OSxkZWNvcmF0b3I6MjgwLGRlY29yYXRvcnM6MjgxLGRlbF9zdG10OjI4MixkaWN0b3JzZXRtYWtlcjoyODMsZG90dGVkX2FzX25hbWU6Mjg0LGRvdHRlZF9hc19uYW1lczoyODUsZG90dGVkX25hbWU6Mjg2LGVuY29kaW5nX2RlY2w6Mjg3LGV2YWxfaW5wdXQ6Mjg4LGV4Y2VwdF9jbGF1c2U6Mjg5LGV4cHI6MjkwLGV4cHJfc3RtdDoyOTEsZXhwcmxpc3Q6MjkyLGZhY3RvcjoyOTMsZmlsZV9pbnB1dDoyOTQsZmxvd19zdG10OjI5NSxmb3Jfc3RtdDoyOTYsZnVuY2RlZjoyOTcsZ2xvYmFsX3N0bXQ6Mjk4LGlmX3N0bXQ6Mjk5LGltcG9ydF9hc19uYW1lOjMwMCxpbXBvcnRfYXNfbmFtZXM6MzAxLFxuaW1wb3J0X2Zyb206MzAyLGltcG9ydF9uYW1lOjMwMyxpbXBvcnRfc3RtdDozMDQsbGFtYmRlZjozMDUsbGFtYmRlZl9ub2NvbmQ6MzA2LG5vbmxvY2FsX3N0bXQ6MzA3LG5vdF90ZXN0OjMwOCxvcl90ZXN0OjMwOSxwYXJhbWV0ZXJzOjMxMCxwYXNzX3N0bXQ6MzExLHBvd2VyOjMxMixwcmludF9zdG10OjMxMyxyYWlzZV9zdG10OjMxNCxyZXR1cm5fc3RtdDozMTUsc2hpZnRfZXhwcjozMTYsc2ltcGxlX3N0bXQ6MzE3LHNpbmdsZV9pbnB1dDoyNTYsc2xpY2VvcDozMTgsc21hbGxfc3RtdDozMTksc3Rhcl9leHByOjMyMCxzdG10OjMyMSxzdWJzY3JpcHQ6MzIyLHN1YnNjcmlwdGxpc3Q6MzIzLHN1aXRlOjMyNCx0ZXJtOjMyNSx0ZXN0OjMyNix0ZXN0X25vY29uZDozMjcsdGVzdGxpc3Q6MzI4LHRlc3RsaXN0X2NvbXA6MzI5LHRlc3RsaXN0X3N0YXJfZXhwcjozMzAsdGZwZGVmOjMzMSx0cmFpbGVyOjMzMix0cnlfc3RtdDozMzMsdHlwZWRhcmdzbGlzdDozMzQsdmFyYXJnc2xpc3Q6MzM1LFxudmZwZGVmOjMzNix3aGlsZV9zdG10OjMzNyx3aXRoX2l0ZW06MzM4LHdpdGhfc3RtdDozMzkseG9yX2V4cHI6MzQwLHlpZWxkX2FyZzozNDEseWllbGRfZXhwcjozNDIseWllbGRfc3RtdDozNDN9LG51bWJlcjJzeW1ib2w6ezI1NjpcInNpbmdsZV9pbnB1dFwiLDI1NzpcImFuZF9leHByXCIsMjU4OlwiYW5kX3Rlc3RcIiwyNTk6XCJhbm5hc3NpZ25cIiwyNjA6XCJhcmdsaXN0XCIsMjYxOlwiYXJndW1lbnRcIiwyNjI6XCJhcml0aF9leHByXCIsMjYzOlwiYXNzZXJ0X3N0bXRcIiwyNjQ6XCJhc3luY19mdW5jZGVmXCIsMjY1OlwiYXN5bmNfc3RtdFwiLDI2NjpcImF0b21cIiwyNjc6XCJhdG9tX2V4cHJcIiwyNjg6XCJhdWdhc3NpZ25cIiwyNjk6XCJicmVha19zdG10XCIsMjcwOlwiY2xhc3NkZWZcIiwyNzE6XCJjb21wX2ZvclwiLDI3MjpcImNvbXBfaWZcIiwyNzM6XCJjb21wX2l0ZXJcIiwyNzQ6XCJjb21wX29wXCIsMjc1OlwiY29tcGFyaXNvblwiLDI3NjpcImNvbXBvdW5kX3N0bXRcIiwyNzc6XCJjb250aW51ZV9zdG10XCIsMjc4OlwiZGVidWdnZXJfc3RtdFwiLFxuMjc5OlwiZGVjb3JhdGVkXCIsMjgwOlwiZGVjb3JhdG9yXCIsMjgxOlwiZGVjb3JhdG9yc1wiLDI4MjpcImRlbF9zdG10XCIsMjgzOlwiZGljdG9yc2V0bWFrZXJcIiwyODQ6XCJkb3R0ZWRfYXNfbmFtZVwiLDI4NTpcImRvdHRlZF9hc19uYW1lc1wiLDI4NjpcImRvdHRlZF9uYW1lXCIsMjg3OlwiZW5jb2RpbmdfZGVjbFwiLDI4ODpcImV2YWxfaW5wdXRcIiwyODk6XCJleGNlcHRfY2xhdXNlXCIsMjkwOlwiZXhwclwiLDI5MTpcImV4cHJfc3RtdFwiLDI5MjpcImV4cHJsaXN0XCIsMjkzOlwiZmFjdG9yXCIsMjk0OlwiZmlsZV9pbnB1dFwiLDI5NTpcImZsb3dfc3RtdFwiLDI5NjpcImZvcl9zdG10XCIsMjk3OlwiZnVuY2RlZlwiLDI5ODpcImdsb2JhbF9zdG10XCIsMjk5OlwiaWZfc3RtdFwiLDMwMDpcImltcG9ydF9hc19uYW1lXCIsMzAxOlwiaW1wb3J0X2FzX25hbWVzXCIsMzAyOlwiaW1wb3J0X2Zyb21cIiwzMDM6XCJpbXBvcnRfbmFtZVwiLDMwNDpcImltcG9ydF9zdG10XCIsMzA1OlwibGFtYmRlZlwiLDMwNjpcImxhbWJkZWZfbm9jb25kXCIsMzA3Olwibm9ubG9jYWxfc3RtdFwiLFxuMzA4Olwibm90X3Rlc3RcIiwzMDk6XCJvcl90ZXN0XCIsMzEwOlwicGFyYW1ldGVyc1wiLDMxMTpcInBhc3Nfc3RtdFwiLDMxMjpcInBvd2VyXCIsMzEzOlwicHJpbnRfc3RtdFwiLDMxNDpcInJhaXNlX3N0bXRcIiwzMTU6XCJyZXR1cm5fc3RtdFwiLDMxNjpcInNoaWZ0X2V4cHJcIiwzMTc6XCJzaW1wbGVfc3RtdFwiLDMxODpcInNsaWNlb3BcIiwzMTk6XCJzbWFsbF9zdG10XCIsMzIwOlwic3Rhcl9leHByXCIsMzIxOlwic3RtdFwiLDMyMjpcInN1YnNjcmlwdFwiLDMyMzpcInN1YnNjcmlwdGxpc3RcIiwzMjQ6XCJzdWl0ZVwiLDMyNTpcInRlcm1cIiwzMjY6XCJ0ZXN0XCIsMzI3OlwidGVzdF9ub2NvbmRcIiwzMjg6XCJ0ZXN0bGlzdFwiLDMyOTpcInRlc3RsaXN0X2NvbXBcIiwzMzA6XCJ0ZXN0bGlzdF9zdGFyX2V4cHJcIiwzMzE6XCJ0ZnBkZWZcIiwzMzI6XCJ0cmFpbGVyXCIsMzMzOlwidHJ5X3N0bXRcIiwzMzQ6XCJ0eXBlZGFyZ3NsaXN0XCIsMzM1OlwidmFyYXJnc2xpc3RcIiwzMzY6XCJ2ZnBkZWZcIiwzMzc6XCJ3aGlsZV9zdG10XCIsMzM4Olwid2l0aF9pdGVtXCIsMzM5Olwid2l0aF9zdG10XCIsXG4zNDA6XCJ4b3JfZXhwclwiLDM0MTpcInlpZWxkX2FyZ1wiLDM0MjpcInlpZWxkX2V4cHJcIiwzNDM6XCJ5aWVsZF9zdG10XCJ9LGRmYXM6ezI1NjpbW1tbMSwxXSxbMiwxXSxbMywyXV0sW1swLDFdXSxbWzIsMV1dXSx7MjoxLDQ6MSw1OjEsNjoxLDc6MSw4OjEsOToxLDEwOjEsMTE6MSwxMjoxLDEzOjEsMTQ6MSwxNToxLDE2OjEsMTc6MSwxODoxLDE5OjEsMjA6MSwyMToxLDIyOjEsMjM6MSwyNDoxLDI1OjEsMjY6MSwyNzoxLDI4OjEsMjk6MSwzMDoxLDMxOjEsMzI6MSwzMzoxLDM0OjEsMzU6MSwzNjoxLDM3OjEsMzg6MSwzOToxLDQwOjEsNDE6MSw0MjoxLDQzOjF9XSwyNTc6W1tbWzQ0LDFdXSxbWzQ1LDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI1ODpbW1tbNDYsMV1dLFtbNDcsMF0sWzAsMV1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSxcbjM1OjEsMzg6MSw0MzoxfV0sMjU5OltbW1s0OCwxXV0sW1s0OSwyXV0sW1s1MCwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sezQ4OjF9XSwyNjA6W1tbWzUxLDFdXSxbWzUyLDJdLFswLDFdXSxbWzUxLDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyNjE6W1tbWzQ5LDFdLFsxNSwyXSxbNTMsMl1dLFtbNTAsMl0sWzU0LDNdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNTM6MX1dLDI2MjpbW1tbNTUsMV1dLFtbMzAsMF0sWzQzLDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI2MzpbW1tbMjQsMV1dLFtbNDksXG4yXV0sW1s1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sezI0OjF9XSwyNjQ6W1tbWzEwLDFdXSxbWzU2LDJdXSxbWzAsMl1dXSx7MTA6MX1dLDI2NTpbW1tbMTAsMV1dLFtbNTcsMl0sWzU2LDJdLFs1OCwyXV0sW1swLDJdXV0sezEwOjF9XSwyNjY6W1tbWzYsMV0sWzI1LDFdLFszMywxXSxbOSwxXSxbMTEsMV0sWzEyLDJdLFszNSwzXSxbMzgsNF0sWzE5LDFdLFs3LDVdXSxbWzAsMV1dLFtbNTksMV0sWzYwLDZdXSxbWzYxLDFdLFs2Miw3XSxbNjMsN11dLFtbNjQsMV0sWzYzLDhdXSxbWzcsNV0sWzAsNV1dLFtbNTksMV1dLFtbNjEsMV1dLFtbNjQsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjU6MSwzMzoxLDM1OjEsMzg6MX1dLDI2NzpbW1tbMjksMV0sWzY1LDJdXSxbWzY1LDJdXSxbWzY2LDJdLFswLDJdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDI1OjEsMjk6MSwzMzoxLDM1OjEsMzg6MX1dLDI2ODpbW1tbNjcsMV0sWzY4LDFdLFs2OSwxXSxcbls3MCwxXSxbNzEsMV0sWzcyLDFdLFs3MywxXSxbNzQsMV0sWzc1LDFdLFs3NiwxXSxbNzcsMV0sWzc4LDFdLFs3OSwxXV0sW1swLDFdXV0sezY3OjEsNjg6MSw2OToxLDcwOjEsNzE6MSw3MjoxLDczOjEsNzQ6MSw3NToxLDc2OjEsNzc6MSw3ODoxLDc5OjF9XSwyNjk6W1tbWzM5LDFdXSxbWzAsMV1dXSx7Mzk6MX1dLDI3MDpbW1tbMTMsMV1dLFtbMjUsMl1dLFtbNDgsM10sWzM1LDRdXSxbWzgwLDVdXSxbWzYxLDZdLFs4MSw3XV0sW1swLDVdXSxbWzQ4LDNdXSxbWzYxLDZdXV0sezEzOjF9XSwyNzE6W1tbWzEwLDFdLFszNCwyXV0sW1szNCwyXV0sW1s4MiwzXV0sW1s4Myw0XV0sW1s4NCw1XV0sW1s4NSw2XSxbMCw1XV0sW1swLDZdXV0sezEwOjEsMzQ6MX1dLDI3MjpbW1tbMzcsMV1dLFtbODYsMl1dLFtbODUsM10sWzAsMl1dLFtbMCwzXV1dLHszNzoxfV0sMjczOltbW1s4NywxXSxbNTQsMV1dLFtbMCwxXV1dLHsxMDoxLDM0OjEsMzc6MX1dLDI3NDpbW1tbODgsMV0sWzg5LDFdLFxuWzgsMl0sWzkwLDFdLFs4OCwxXSxbODMsMV0sWzkxLDFdLFs5MiwzXSxbOTMsMV0sWzk0LDFdXSxbWzAsMV1dLFtbODMsMV1dLFtbOCwxXSxbMCwzXV1dLHs4OjEsODM6MSw4ODoxLDg5OjEsOTA6MSw5MToxLDkyOjEsOTM6MSw5NDoxfV0sMjc1OltbW1s5NSwxXV0sW1s5NiwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNzY6W1tbWzk3LDFdLFs5OCwxXSxbNTgsMV0sWzk5LDFdLFs1NywxXSxbMTAwLDFdLFs1NiwxXSxbMTAxLDFdLFsxMDIsMV1dLFtbMCwxXV1dLHs0OjEsMTA6MSwxMzoxLDIwOjEsMjE6MSwzNDoxLDM3OjEsNDE6MSw0MjoxfV0sMjc3OltbW1s0MCwxXV0sW1swLDFdXV0sezQwOjF9XSwyNzg6W1tbWzE3LDFdXSxbWzAsMV1dXSx7MTc6MX1dLDI3OTpbW1tbMTAzLDFdXSxbWzU2LDJdLFsxMDQsMl0sWzk5LDJdXSxbWzAsMl1dXSx7NDE6MX1dLDI4MDpbW1tbNDEsMV1dLFxuW1sxMDUsMl1dLFtbMiw0XSxbMzUsM11dLFtbNjEsNV0sWzgxLDZdXSxbWzAsNF1dLFtbMiw0XV0sW1s2MSw1XV1dLHs0MToxfV0sMjgxOltbW1sxMDYsMV1dLFtbMTA2LDFdLFswLDFdXV0sezQxOjF9XSwyODI6W1tbWzI3LDFdXSxbWzgyLDJdXSxbWzAsMl1dXSx7Mjc6MX1dLDI4MzpbW1tbNDksMV0sWzEwNywyXSxbNTMsM11dLFtbNDgsNF0sWzU0LDVdLFs1Miw2XSxbMCwxXV0sW1s1NCw1XSxbNTIsNl0sWzAsMl1dLFtbOTUsN11dLFtbNDksN11dLFtbMCw1XV0sW1s0OSw4XSxbMTA3LDhdLFswLDZdXSxbWzU0LDVdLFs1Miw5XSxbMCw3XV0sW1s1Miw2XSxbMCw4XV0sW1s0OSwxMF0sWzUzLDExXSxbMCw5XV0sW1s0OCwxMl1dLFtbOTUsMTNdXSxbWzQ5LDEzXV0sW1s1Miw5XSxbMCwxM11dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNTM6MX1dLDI4NDpbW1tbMTA1LDFdXSxbWzEwOCxcbjJdLFswLDFdXSxbWzI1LDNdXSxbWzAsM11dXSx7MjU6MX1dLDI4NTpbW1tbMTA5LDFdXSxbWzUyLDBdLFswLDFdXV0sezI1OjF9XSwyODY6W1tbWzI1LDFdXSxbWzExMCwwXSxbMCwxXV1dLHsyNToxfV0sMjg3OltbW1syNSwxXV0sW1swLDFdXV0sezI1OjF9XSwyODg6W1tbWzExMSwxXV0sW1syLDFdLFsxMTIsMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyODk6W1tbWzExMywxXV0sW1s0OSwyXSxbMCwxXV0sW1sxMDgsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzAsNF1dXSx7MTEzOjF9XSwyOTA6W1tbWzExNCwxXV0sW1sxMTUsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjkxOltbW1sxMTYsMV1dLFtbMTE3LDJdLFs1MCwzXSxbMTE4LDRdLFswLDFdXSxbWzExMSxcbjRdLFs2Miw0XV0sW1sxMTYsNV0sWzYyLDVdXSxbWzAsNF1dLFtbNTAsM10sWzAsNV1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTI6W1tbWzk1LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbOTUsMV0sWzEwNywxXSxbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI5MzpbW1tbMTE5LDJdLFszMCwxXSxbMjIsMV0sWzQzLDFdXSxbWzEyMCwyXV0sW1swLDJdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI5NDpbW1tbMiwwXSxbMTEyLDFdLFsxMjEsMF1dLFtbMCwxXV1dLHsyOjEsNDoxLDU6MSw2OjEsNzoxLDg6MSw5OjEsMTA6MSwxMToxLDEyOjEsMTM6MSwxNDoxLDE1OjEsMTY6MSxcbjE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxLDExMjoxfV0sMjk1OltbW1sxMjIsMV0sWzEyMywxXSxbMTI0LDFdLFsxMjUsMV0sWzEyNiwxXV0sW1swLDFdXV0sezU6MSwyMzoxLDMxOjEsMzk6MSw0MDoxfV0sMjk2OltbW1szNCwxXV0sW1s4MiwyXV0sW1s4MywzXV0sW1sxMTEsNF1dLFtbNDgsNV1dLFtbODAsNl1dLFtbMTI3LDddLFswLDZdXSxbWzQ4LDhdXSxbWzgwLDldXSxbWzAsOV1dXSx7MzQ6MX1dLDI5NzpbW1tbNCwxXV0sW1syNSwyXV0sW1sxMjgsM11dLFtbNDgsNF0sWzEyOSw1XV0sW1s4MCw2XV0sW1s0OSw3XV0sW1swLDZdXSxbWzQ4LDRdXV0sezQ6MX1dLDI5ODpbW1tbMjYsMV1dLFtbMjUsMl1dLFtbNTIsMV0sWzAsMl1dXSx7MjY6MX1dLDI5OTpbW1tbMzcsMV1dLFtbNDksMl1dLFxuW1s0OCwzXV0sW1s4MCw0XV0sW1sxMjcsNV0sWzEzMCwxXSxbMCw0XV0sW1s0OCw2XV0sW1s4MCw3XV0sW1swLDddXV0sezM3OjF9XSwzMDA6W1tbWzI1LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sezI1OjF9XSwzMDE6W1tbWzEzMSwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxMzEsMV0sWzAsMl1dXSx7MjU6MX1dLDMwMjpbW1tbMzYsMV1dLFtbMTA1LDJdLFsxOSwzXSxbMTEwLDNdXSxbWzMyLDRdXSxbWzEwNSwyXSxbMTksM10sWzMyLDRdLFsxMTAsM11dLFtbMTMyLDVdLFsxNSw1XSxbMzUsNl1dLFtbMCw1XV0sW1sxMzIsN11dLFtbNjEsNV1dXSx7MzY6MX1dLDMwMzpbW1tbMzIsMV1dLFtbMTMzLDJdXSxbWzAsMl1dXSx7MzI6MX1dLDMwNDpbW1tbMTM0LDFdLFsxMzUsMV1dLFtbMCwxXV1dLHszMjoxLDM2OjF9XSwzMDU6W1tbWzE0LDFdXSxbWzQ4LDJdLFsxMzYsM11dLFtbNDksNF1dLFtbNDgsMl1dLFtbMCw0XV1dLHsxNDoxfV0sMzA2OltbW1sxNCwxXV0sXG5bWzQ4LDJdLFsxMzYsM11dLFtbODYsNF1dLFtbNDgsMl1dLFtbMCw0XV1dLHsxNDoxfV0sMzA3OltbW1sxOCwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLHsxODoxfV0sMzA4OltbW1s4LDFdLFsxMzcsMl1dLFtbNDYsMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzA5OltbW1sxMzgsMV1dLFtbMTM5LDBdLFswLDFdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMTA6W1tbWzM1LDFdXSxbWzYxLDJdLFsxNDAsM11dLFtbMCwyXV0sW1s2MSwyXV1dLHszNToxfV0sMzExOltbW1syOCwxXV0sW1swLDFdXV0sezI4OjF9XSwzMTI6W1tbWzE0MSwxXV0sW1s1MywyXSxbMCwxXV0sW1sxMjAsM11dLFtbMCwzXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyNToxLDI5OjEsMzM6MSxcbjM1OjEsMzg6MX1dLDMxMzpbW1tbMTYsMV1dLFtbNDksMl0sWzE0MiwzXSxbMCwxXV0sW1s1Miw0XSxbMCwyXV0sW1s0OSw1XV0sW1s0OSwyXSxbMCw0XV0sW1s1Miw2XSxbMCw1XV0sW1s0OSw3XV0sW1s1Miw4XSxbMCw3XV0sW1s0OSw3XSxbMCw4XV1dLHsxNjoxfV0sMzE0OltbW1s1LDFdXSxbWzQ5LDJdLFswLDFdXSxbWzM2LDNdLFs1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1s1Miw1XSxbMCw0XV0sW1s0OSw2XV0sW1swLDZdXV0sezU6MX1dLDMxNTpbW1tbMjMsMV1dLFtbMTExLDJdLFswLDFdXSxbWzAsMl1dXSx7MjM6MX1dLDMxNjpbW1tbMTQzLDFdXSxbWzE0NCwwXSxbMTQyLDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMxNzpbW1tbMTQ1LDFdXSxbWzIsMl0sWzE0NiwzXV0sW1swLDJdXSxbWzE0NSwxXSxbMiwyXV1dLHs1OjEsNjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLFxuMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIyOjEsMjM6MSwyNDoxLDI1OjEsMjY6MSwyNzoxLDI4OjEsMjk6MSwzMDoxLDMxOjEsMzI6MSwzMzoxLDM1OjEsMzY6MSwzODoxLDM5OjEsNDA6MSw0MzoxfV0sMzE4OltbW1s0OCwxXV0sW1s0OSwyXSxbMCwxXV0sW1swLDJdXV0sezQ4OjF9XSwzMTk6W1tbWzE0NywxXSxbMTQ4LDFdLFsxNDksMV0sWzE1MCwxXSxbMTUxLDFdLFsxNTIsMV0sWzE1MywxXSxbMTU0LDFdLFsxNTUsMV0sWzE1NiwxXV0sW1swLDFdXV0sezU6MSw2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIyOjEsMjM6MSwyNDoxLDI1OjEsMjY6MSwyNzoxLDI4OjEsMjk6MSwzMDoxLDMxOjEsMzI6MSwzMzoxLDM1OjEsMzY6MSwzODoxLDM5OjEsNDA6MSw0MzoxfV0sMzIwOltbW1sxNSwxXV0sW1s5NSwyXV0sW1swLDJdXV0sezE1OjF9XSwzMjE6W1tbWzEsMV0sWzMsMV1dLFtbMCwxXV1dLHs0OjEsNToxLDY6MSw3OjEsXG44OjEsOToxLDEwOjEsMTE6MSwxMjoxLDEzOjEsMTQ6MSwxNToxLDE2OjEsMTc6MSwxODoxLDE5OjEsMjA6MSwyMToxLDIyOjEsMjM6MSwyNDoxLDI1OjEsMjY6MSwyNzoxLDI4OjEsMjk6MSwzMDoxLDMxOjEsMzI6MSwzMzoxLDM0OjEsMzU6MSwzNjoxLDM3OjEsMzg6MSwzOToxLDQwOjEsNDE6MSw0MjoxLDQzOjF9XSwzMjI6W1tbWzQ5LDFdLFs0OCwyXV0sW1s0OCwyXSxbMCwxXV0sW1s0OSwzXSxbMTU3LDRdLFswLDJdXSxbWzE1Nyw0XSxbMCwzXV0sW1swLDRdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MSw0ODoxfV0sMzIzOltbW1sxNTgsMV1dLFtbNTIsMl0sWzAsMV1dLFtbMTU4LDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MSw0ODoxfV0sMzI0OltbW1sxLDFdLFsyLDJdXSxcbltbMCwxXV0sW1sxNTksM11dLFtbMTIxLDRdXSxbWzE2MCwxXSxbMTIxLDRdXV0sezI6MSw1OjEsNjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMyNTpbW1tbMTIwLDFdXSxbWzE2MSwwXSxbMTUsMF0sWzE2MiwwXSxbNDEsMF0sWzE2MywwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMjY6W1tbWzg0LDFdLFsxNjQsMl1dLFtbMzcsM10sWzAsMV1dLFtbMCwyXV0sW1s4NCw0XV0sW1sxMjcsNV1dLFtbNDksMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI3OltbW1sxNjUsXG4xXSxbODQsMV1dLFtbMCwxXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMjg6W1tbWzQ5LDFdXSxbWzUyLDJdLFswLDFdXSxbWzQ5LDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMyOTpbW1tbNDksMV0sWzEwNywxXV0sW1s1NCwyXSxbNTIsM10sWzAsMV1dLFtbMCwyXV0sW1s0OSw0XSxbMTA3LDRdLFswLDNdXSxbWzUyLDNdLFswLDRdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzMwOltbW1s0OSwxXSxbMTA3LDFdXSxbWzUyLDJdLFswLDFdXSxbWzQ5LDFdLFsxMDcsMV0sWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTk6MSxcbjIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzMTpbW1tbMjUsMV1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM11dLFtbMCwzXV1dLHsyNToxfV0sMzMyOltbW1szNSwxXSxbMTEwLDJdLFszOCwzXV0sW1s2MSw0XSxbODEsNV1dLFtbMjUsNF1dLFtbMTY2LDZdXSxbWzAsNF1dLFtbNjEsNF1dLFtbNjQsNF1dXSx7MzU6MSwzODoxLDExMDoxfV0sMzMzOltbW1syMCwxXV0sW1s0OCwyXV0sW1s4MCwzXV0sW1sxNjcsNF0sWzE2OCw1XV0sW1s0OCw2XV0sW1s0OCw3XV0sW1s4MCw4XV0sW1s4MCw5XV0sW1sxNjcsNF0sWzEyNywxMF0sWzE2OCw1XSxbMCw4XV0sW1swLDldXSxbWzQ4LDExXV0sW1s4MCwxMl1dLFtbMTY4LDVdLFswLDEyXV1dLHsyMDoxfV0sMzM0OltbW1sxNSwxXSxbMTY5LDJdLFs1MywzXV0sW1sxNjksNF0sWzUyLDVdLFswLDFdXSxbWzUwLDZdLFs1Miw3XSxbMCwyXV0sW1sxNjksOF1dLFtbNTIsNV0sWzAsNF1dLFtbMTY5LDldLFs1MywzXSxbMCxcbjVdXSxbWzQ5LDEwXV0sW1sxNSwxMV0sWzE2OSwyXSxbNTMsM10sWzAsN11dLFtbNTIsMTJdLFswLDhdXSxbWzUwLDEzXSxbNTIsNV0sWzAsOV1dLFtbNTIsN10sWzAsMTBdXSxbWzE2OSwxNF0sWzUyLDE1XSxbMCwxMV1dLFtbMCwxMl1dLFtbNDksNF1dLFtbNTIsMTVdLFswLDE0XV0sW1sxNjksMTZdLFs1MywzXSxbMCwxNV1dLFtbNTAsMTddLFs1MiwxNV0sWzAsMTZdXSxbWzQ5LDE0XV1dLHsxNToxLDI1OjEsNTM6MX1dLDMzNTpbW1tbMTUsMV0sWzUzLDJdLFsxNzAsM11dLFtbMTcwLDVdLFs1Miw0XSxbMCwxXV0sW1sxNzAsNl1dLFtbNTAsN10sWzUyLDhdLFswLDNdXSxbWzUzLDJdLFsxNzAsOV0sWzAsNF1dLFtbNTIsNF0sWzAsNV1dLFtbNTIsMTBdLFswLDZdXSxbWzQ5LDExXV0sW1sxNSwxMl0sWzUzLDJdLFsxNzAsM10sWzAsOF1dLFtbNTAsMTNdLFs1Miw0XSxbMCw5XV0sW1swLDEwXV0sW1s1Miw4XSxbMCwxMV1dLFtbNTIsMTVdLFsxNzAsMTRdLFswLDEyXV0sW1s0OSw1XV0sXG5bWzUyLDE1XSxbMCwxNF1dLFtbNTMsMl0sWzE3MCwxNl0sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSx7MTU6MSwyNToxLDUzOjF9XSwzMzY6W1tbWzI1LDFdXSxbWzAsMV1dXSx7MjU6MX1dLDMzNzpbW1tbMjEsMV1dLFtbNDksMl1dLFtbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSx7MjE6MX1dLDMzODpbW1tbNDksMV1dLFtbMTA4LDJdLFswLDFdXSxbWzk1LDNdXSxbWzAsM11dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzM5OltbW1s0MiwxXV0sW1sxNzEsMl1dLFtbNDgsM10sWzUyLDFdXSxbWzgwLDRdXSxbWzAsNF1dXSx7NDI6MX1dLDM0MDpbW1tbMTcyLDFdXSxbWzE3MywwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsXG4zNToxLDM4OjEsNDM6MX1dLDM0MTpbW1tbMTExLDJdLFszNiwxXV0sW1s0OSwyXV0sW1swLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM2OjEsMzg6MSw0MzoxfV0sMzQyOltbW1szMSwxXV0sW1sxNzQsMl0sWzAsMV1dLFtbMCwyXV1dLHszMToxfV0sMzQzOltbW1s2MiwxXV0sW1swLDFdXV0sezMxOjF9XX0sc3RhdGVzOltbW1sxLDFdLFsyLDFdLFszLDJdXSxbWzAsMV1dLFtbMiwxXV1dLFtbWzQ0LDFdXSxbWzQ1LDBdLFswLDFdXV0sW1tbNDYsMV1dLFtbNDcsMF0sWzAsMV1dXSxbW1s0OCwxXV0sW1s0OSwyXV0sW1s1MCwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sW1tbNTEsMV1dLFtbNTIsMl0sWzAsMV1dLFtbNTEsMV0sWzAsMl1dXSxbW1s0OSwxXSxbMTUsMl0sWzUzLDJdXSxbWzUwLDJdLFs1NCwzXSxbMCwxXV0sW1s0OSwzXV0sW1swLDNdXV0sW1tbNTUsMV1dLFtbMzAsMF0sWzQzLDBdLFxuWzAsMV1dXSxbW1syNCwxXV0sW1s0OSwyXV0sW1s1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sW1tbMTAsMV1dLFtbNTYsMl1dLFtbMCwyXV1dLFtbWzEwLDFdXSxbWzU3LDJdLFs1NiwyXSxbNTgsMl1dLFtbMCwyXV1dLFtbWzYsMV0sWzI1LDFdLFszMywxXSxbOSwxXSxbMTEsMV0sWzEyLDJdLFszNSwzXSxbMzgsNF0sWzE5LDFdLFs3LDVdXSxbWzAsMV1dLFtbNTksMV0sWzYwLDZdXSxbWzYxLDFdLFs2Miw3XSxbNjMsN11dLFtbNjQsMV0sWzYzLDhdXSxbWzcsNV0sWzAsNV1dLFtbNTksMV1dLFtbNjEsMV1dLFtbNjQsMV1dXSxbW1syOSwxXSxbNjUsMl1dLFtbNjUsMl1dLFtbNjYsMl0sWzAsMl1dXSxbW1s2NywxXSxbNjgsMV0sWzY5LDFdLFs3MCwxXSxbNzEsMV0sWzcyLDFdLFs3MywxXSxbNzQsMV0sWzc1LDFdLFs3NiwxXSxbNzcsMV0sWzc4LDFdLFs3OSwxXV0sW1swLDFdXV0sW1tbMzksMV1dLFtbMCwxXV1dLFtbWzEzLDFdXSxbWzI1LDJdXSxbWzQ4LDNdLFszNSw0XV0sXG5bWzgwLDVdXSxbWzYxLDZdLFs4MSw3XV0sW1swLDVdXSxbWzQ4LDNdXSxbWzYxLDZdXV0sW1tbMTAsMV0sWzM0LDJdXSxbWzM0LDJdXSxbWzgyLDNdXSxbWzgzLDRdXSxbWzg0LDVdXSxbWzg1LDZdLFswLDVdXSxbWzAsNl1dXSxbW1szNywxXV0sW1s4NiwyXV0sW1s4NSwzXSxbMCwyXV0sW1swLDNdXV0sW1tbODcsMV0sWzU0LDFdXSxbWzAsMV1dXSxbW1s4OCwxXSxbODksMV0sWzgsMl0sWzkwLDFdLFs4OCwxXSxbODMsMV0sWzkxLDFdLFs5MiwzXSxbOTMsMV0sWzk0LDFdXSxbWzAsMV1dLFtbODMsMV1dLFtbOCwxXSxbMCwzXV1dLFtbWzk1LDFdXSxbWzk2LDBdLFswLDFdXV0sW1tbOTcsMV0sWzk4LDFdLFs1OCwxXSxbOTksMV0sWzU3LDFdLFsxMDAsMV0sWzU2LDFdLFsxMDEsMV0sWzEwMiwxXV0sW1swLDFdXV0sW1tbNDAsMV1dLFtbMCwxXV1dLFtbWzE3LDFdXSxbWzAsMV1dXSxbW1sxMDMsMV1dLFtbNTYsMl0sWzEwNCwyXSxbOTksMl1dLFtbMCwyXV1dLFtbWzQxLDFdXSxbWzEwNSxcbjJdXSxbWzIsNF0sWzM1LDNdXSxbWzYxLDVdLFs4MSw2XV0sW1swLDRdXSxbWzIsNF1dLFtbNjEsNV1dXSxbW1sxMDYsMV1dLFtbMTA2LDFdLFswLDFdXV0sW1tbMjcsMV1dLFtbODIsMl1dLFtbMCwyXV1dLFtbWzQ5LDFdLFsxMDcsMl0sWzUzLDNdXSxbWzQ4LDRdLFs1NCw1XSxbNTIsNl0sWzAsMV1dLFtbNTQsNV0sWzUyLDZdLFswLDJdXSxbWzk1LDddXSxbWzQ5LDddXSxbWzAsNV1dLFtbNDksOF0sWzEwNyw4XSxbMCw2XV0sW1s1NCw1XSxbNTIsOV0sWzAsN11dLFtbNTIsNl0sWzAsOF1dLFtbNDksMTBdLFs1MywxMV0sWzAsOV1dLFtbNDgsMTJdXSxbWzk1LDEzXV0sW1s0OSwxM11dLFtbNTIsOV0sWzAsMTNdXV0sW1tbMTA1LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sW1tbMTA5LDFdXSxbWzUyLDBdLFswLDFdXV0sW1tbMjUsMV1dLFtbMTEwLDBdLFswLDFdXV0sW1tbMjUsMV1dLFtbMCwxXV1dLFtbWzExMSwxXV0sW1syLDFdLFsxMTIsMl1dLFtbMCwyXV1dLFxuW1tbMTEzLDFdXSxbWzQ5LDJdLFswLDFdXSxbWzEwOCwzXSxbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLFtbWzExNCwxXV0sW1sxMTUsMF0sWzAsMV1dXSxbW1sxMTYsMV1dLFtbMTE3LDJdLFs1MCwzXSxbMTE4LDRdLFswLDFdXSxbWzExMSw0XSxbNjIsNF1dLFtbMTE2LDVdLFs2Miw1XV0sW1swLDRdXSxbWzUwLDNdLFswLDVdXV0sW1tbOTUsMV0sWzEwNywxXV0sW1s1MiwyXSxbMCwxXV0sW1s5NSwxXSxbMTA3LDFdLFswLDJdXV0sW1tbMTE5LDJdLFszMCwxXSxbMjIsMV0sWzQzLDFdXSxbWzEyMCwyXV0sW1swLDJdXV0sW1tbMiwwXSxbMTEyLDFdLFsxMjEsMF1dLFtbMCwxXV1dLFtbWzEyMiwxXSxbMTIzLDFdLFsxMjQsMV0sWzEyNSwxXSxbMTI2LDFdXSxbWzAsMV1dXSxbW1szNCwxXV0sW1s4MiwyXV0sW1s4MywzXV0sW1sxMTEsNF1dLFtbNDgsNV1dLFtbODAsNl1dLFtbMTI3LDddLFswLDZdXSxbWzQ4LDhdXSxbWzgwLDldXSxbWzAsOV1dXSxbW1s0LDFdXSxbWzI1LFxuMl1dLFtbMTI4LDNdXSxbWzQ4LDRdLFsxMjksNV1dLFtbODAsNl1dLFtbNDksN11dLFtbMCw2XV0sW1s0OCw0XV1dLFtbWzI2LDFdXSxbWzI1LDJdXSxbWzUyLDFdLFswLDJdXV0sW1tbMzcsMV1dLFtbNDksMl1dLFtbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFsxMzAsMV0sWzAsNF1dLFtbNDgsNl1dLFtbODAsN11dLFtbMCw3XV1dLFtbWzI1LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sW1tbMTMxLDFdXSxbWzUyLDJdLFswLDFdXSxbWzEzMSwxXSxbMCwyXV1dLFtbWzM2LDFdXSxbWzEwNSwyXSxbMTksM10sWzExMCwzXV0sW1szMiw0XV0sW1sxMDUsMl0sWzE5LDNdLFszMiw0XSxbMTEwLDNdXSxbWzEzMiw1XSxbMTUsNV0sWzM1LDZdXSxbWzAsNV1dLFtbMTMyLDddXSxbWzYxLDVdXV0sW1tbMzIsMV1dLFtbMTMzLDJdXSxbWzAsMl1dXSxbW1sxMzQsMV0sWzEzNSwxXV0sW1swLDFdXV0sW1tbMTQsMV1dLFtbNDgsMl0sWzEzNiwzXV0sW1s0OSw0XV0sW1s0OCxcbjJdXSxbWzAsNF1dXSxbW1sxNCwxXV0sW1s0OCwyXSxbMTM2LDNdXSxbWzg2LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSxbW1sxOCwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLFtbWzgsMV0sWzEzNywyXV0sW1s0NiwyXV0sW1swLDJdXV0sW1tbMTM4LDFdXSxbWzEzOSwwXSxbMCwxXV1dLFtbWzM1LDFdXSxbWzYxLDJdLFsxNDAsM11dLFtbMCwyXV0sW1s2MSwyXV1dLFtbWzI4LDFdXSxbWzAsMV1dXSxbW1sxNDEsMV1dLFtbNTMsMl0sWzAsMV1dLFtbMTIwLDNdXSxbWzAsM11dXSxbW1sxNiwxXV0sW1s0OSwyXSxbMTQyLDNdLFswLDFdXSxbWzUyLDRdLFswLDJdXSxbWzQ5LDVdXSxbWzQ5LDJdLFswLDRdXSxbWzUyLDZdLFswLDVdXSxbWzQ5LDddXSxbWzUyLDhdLFswLDddXSxbWzQ5LDddLFswLDhdXV0sW1tbNSwxXV0sW1s0OSwyXSxbMCwxXV0sW1szNiwzXSxbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbNTIsNV0sWzAsNF1dLFtbNDksNl1dLFtbMCw2XV1dLFtbWzIzLDFdXSxbWzExMSxcbjJdLFswLDFdXSxbWzAsMl1dXSxbW1sxNDMsMV1dLFtbMTQ0LDBdLFsxNDIsMF0sWzAsMV1dXSxbW1sxNDUsMV1dLFtbMiwyXSxbMTQ2LDNdXSxbWzAsMl1dLFtbMTQ1LDFdLFsyLDJdXV0sW1tbNDgsMV1dLFtbNDksMl0sWzAsMV1dLFtbMCwyXV1dLFtbWzE0NywxXSxbMTQ4LDFdLFsxNDksMV0sWzE1MCwxXSxbMTUxLDFdLFsxNTIsMV0sWzE1MywxXSxbMTU0LDFdLFsxNTUsMV0sWzE1NiwxXV0sW1swLDFdXV0sW1tbMTUsMV1dLFtbOTUsMl1dLFtbMCwyXV1dLFtbWzEsMV0sWzMsMV1dLFtbMCwxXV1dLFtbWzQ5LDFdLFs0OCwyXV0sW1s0OCwyXSxbMCwxXV0sW1s0OSwzXSxbMTU3LDRdLFswLDJdXSxbWzE1Nyw0XSxbMCwzXV0sW1swLDRdXV0sW1tbMTU4LDFdXSxbWzUyLDJdLFswLDFdXSxbWzE1OCwxXSxbMCwyXV1dLFtbWzEsMV0sWzIsMl1dLFtbMCwxXV0sW1sxNTksM11dLFtbMTIxLDRdXSxbWzE2MCwxXSxbMTIxLDRdXV0sW1tbMTIwLDFdXSxbWzE2MSwwXSxbMTUsMF0sWzE2MixcbjBdLFs0MSwwXSxbMTYzLDBdLFswLDFdXV0sW1tbODQsMV0sWzE2NCwyXV0sW1szNywzXSxbMCwxXV0sW1swLDJdXSxbWzg0LDRdXSxbWzEyNyw1XV0sW1s0OSwyXV1dLFtbWzE2NSwxXSxbODQsMV1dLFtbMCwxXV1dLFtbWzQ5LDFdXSxbWzUyLDJdLFswLDFdXSxbWzQ5LDFdLFswLDJdXV0sW1tbNDksMV0sWzEwNywxXV0sW1s1NCwyXSxbNTIsM10sWzAsMV1dLFtbMCwyXV0sW1s0OSw0XSxbMTA3LDRdLFswLDNdXSxbWzUyLDNdLFswLDRdXV0sW1tbNDksMV0sWzEwNywxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMTA3LDFdLFswLDJdXV0sW1tbMjUsMV1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM11dLFtbMCwzXV1dLFtbWzM1LDFdLFsxMTAsMl0sWzM4LDNdXSxbWzYxLDRdLFs4MSw1XV0sW1syNSw0XV0sW1sxNjYsNl1dLFtbMCw0XV0sW1s2MSw0XV0sW1s2NCw0XV1dLFtbWzIwLDFdXSxbWzQ4LDJdXSxbWzgwLDNdXSxbWzE2Nyw0XSxbMTY4LDVdXSxbWzQ4LDZdXSxbWzQ4LDddXSxcbltbODAsOF1dLFtbODAsOV1dLFtbMTY3LDRdLFsxMjcsMTBdLFsxNjgsNV0sWzAsOF1dLFtbMCw5XV0sW1s0OCwxMV1dLFtbODAsMTJdXSxbWzE2OCw1XSxbMCwxMl1dXSxbW1sxNSwxXSxbMTY5LDJdLFs1MywzXV0sW1sxNjksNF0sWzUyLDVdLFswLDFdXSxbWzUwLDZdLFs1Miw3XSxbMCwyXV0sW1sxNjksOF1dLFtbNTIsNV0sWzAsNF1dLFtbMTY5LDldLFs1MywzXSxbMCw1XV0sW1s0OSwxMF1dLFtbMTUsMTFdLFsxNjksMl0sWzUzLDNdLFswLDddXSxbWzUyLDEyXSxbMCw4XV0sW1s1MCwxM10sWzUyLDVdLFswLDldXSxbWzUyLDddLFswLDEwXV0sW1sxNjksMTRdLFs1MiwxNV0sWzAsMTFdXSxbWzAsMTJdXSxbWzQ5LDRdXSxbWzUyLDE1XSxbMCwxNF1dLFtbMTY5LDE2XSxbNTMsM10sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSxbW1sxNSwxXSxbNTMsMl0sWzE3MCwzXV0sW1sxNzAsNV0sWzUyLDRdLFswLDFdXSxbWzE3MCw2XV0sW1s1MCw3XSxbNTIsXG44XSxbMCwzXV0sW1s1MywyXSxbMTcwLDldLFswLDRdXSxbWzUyLDRdLFswLDVdXSxbWzUyLDEwXSxbMCw2XV0sW1s0OSwxMV1dLFtbMTUsMTJdLFs1MywyXSxbMTcwLDNdLFswLDhdXSxbWzUwLDEzXSxbNTIsNF0sWzAsOV1dLFtbMCwxMF1dLFtbNTIsOF0sWzAsMTFdXSxbWzUyLDE1XSxbMTcwLDE0XSxbMCwxMl1dLFtbNDksNV1dLFtbNTIsMTVdLFswLDE0XV0sW1s1MywyXSxbMTcwLDE2XSxbMCwxNV1dLFtbNTAsMTddLFs1MiwxNV0sWzAsMTZdXSxbWzQ5LDE0XV1dLFtbWzI1LDFdXSxbWzAsMV1dXSxbW1syMSwxXV0sW1s0OSwyXV0sW1s0OCwzXV0sW1s4MCw0XV0sW1sxMjcsNV0sWzAsNF1dLFtbNDgsNl1dLFtbODAsN11dLFtbMCw3XV1dLFtbWzQ5LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1s5NSwzXV0sW1swLDNdXV0sW1tbNDIsMV1dLFtbMTcxLDJdXSxbWzQ4LDNdLFs1MiwxXV0sW1s4MCw0XV0sW1swLDRdXV0sW1tbMTcyLDFdXSxbWzE3MywwXSxbMCwxXV1dLFtbWzExMSwyXSxcblszNiwxXV0sW1s0OSwyXV0sW1swLDJdXV0sW1tbMzEsMV1dLFtbMTc0LDJdLFswLDFdXSxbWzAsMl1dXSxbW1s2MiwxXV0sW1swLDFdXV1dLGxhYmVsczpbWzAsXCJFTVBUWVwiXSxbMzE3LG51bGxdLFs0LG51bGxdLFsyNzYsbnVsbF0sWzEsXCJkZWZcIl0sWzEsXCJyYWlzZVwiXSxbMSxcIlRydWVcIl0sWzMsbnVsbF0sWzEsXCJub3RcIl0sWzEsXCJudWxsXCJdLFs1NSxudWxsXSxbMixudWxsXSxbMjUsbnVsbF0sWzEsXCJjbGFzc1wiXSxbMSxcImxhbWJkYVwiXSxbMTYsbnVsbF0sWzEsXCJwcmludFwiXSxbMSxcImRlYnVnZ2VyXCJdLFsxLFwibm9ubG9jYWxcIl0sWzUyLG51bGxdLFsxLFwidHJ5XCJdLFsxLFwid2hpbGVcIl0sWzMxLG51bGxdLFsxLFwicmV0dXJuXCJdLFsxLFwiYXNzZXJ0XCJdLFsxLG51bGxdLFsxLFwiZ2xvYmFsXCJdLFsxLFwiZGVsXCJdLFsxLFwicGFzc1wiXSxbNTQsbnVsbF0sWzE1LG51bGxdLFsxLFwieWllbGRcIl0sWzEsXCJpbXBvcnRcIl0sWzEsXCJGYWxzZVwiXSxbMSxcImZvclwiXSxbNyxudWxsXSxbMSxcImZyb21cIl0sWzEsXG5cImlmXCJdLFs5LG51bGxdLFsxLFwiYnJlYWtcIl0sWzEsXCJjb250aW51ZVwiXSxbNDksbnVsbF0sWzEsXCJ3aXRoXCJdLFsxNCxudWxsXSxbMzE2LG51bGxdLFsxOSxudWxsXSxbMzA4LG51bGxdLFsxLFwiYW5kXCJdLFsxMSxudWxsXSxbMzI2LG51bGxdLFsyMixudWxsXSxbMjYxLG51bGxdLFsxMixudWxsXSxbMzUsbnVsbF0sWzI3MSxudWxsXSxbMzI1LG51bGxdLFsyOTcsbnVsbF0sWzMzOSxudWxsXSxbMjk2LG51bGxdLFsyNixudWxsXSxbMjgzLG51bGxdLFs4LG51bGxdLFszNDIsbnVsbF0sWzMyOSxudWxsXSxbMTAsbnVsbF0sWzI2NixudWxsXSxbMzMyLG51bGxdLFs0NSxudWxsXSxbMzgsbnVsbF0sWzQwLG51bGxdLFs1MCxudWxsXSxbNDYsbnVsbF0sWzQxLG51bGxdLFs0MixudWxsXSxbMzYsbnVsbF0sWzQzLG51bGxdLFs0OCxudWxsXSxbNDQsbnVsbF0sWzM3LG51bGxdLFszOSxudWxsXSxbMzI0LG51bGxdLFsyNjAsbnVsbF0sWzI5MixudWxsXSxbMSxcImluXCJdLFszMDksbnVsbF0sWzI3Myxcbm51bGxdLFszMjcsbnVsbF0sWzI3MixudWxsXSxbMjgsbnVsbF0sWzIxLG51bGxdLFsyNyxudWxsXSxbMjksbnVsbF0sWzEsXCJpc1wiXSxbMzAsbnVsbF0sWzIwLG51bGxdLFsyOTAsbnVsbF0sWzI3NCxudWxsXSxbMzMzLG51bGxdLFsyOTksbnVsbF0sWzI3MCxudWxsXSxbMzM3LG51bGxdLFsyNzksbnVsbF0sWzI2NSxudWxsXSxbMjgxLG51bGxdLFsyNjQsbnVsbF0sWzI4NixudWxsXSxbMjgwLG51bGxdLFszMjAsbnVsbF0sWzEsXCJhc1wiXSxbMjg0LG51bGxdLFsyMyxudWxsXSxbMzI4LG51bGxdLFswLG51bGxdLFsxLFwiZXhjZXB0XCJdLFszNDAsbnVsbF0sWzE4LG51bGxdLFszMzAsbnVsbF0sWzI2OCxudWxsXSxbMjU5LG51bGxdLFszMTIsbnVsbF0sWzI5MyxudWxsXSxbMzIxLG51bGxdLFsyNjksbnVsbF0sWzI3NyxudWxsXSxbMzE0LG51bGxdLFszMTUsbnVsbF0sWzM0MyxudWxsXSxbMSxcImVsc2VcIl0sWzMxMCxudWxsXSxbNTEsbnVsbF0sWzEsXCJlbGlmXCJdLFszMDAsbnVsbF0sWzMwMSxcbm51bGxdLFsyODUsbnVsbF0sWzMwMyxudWxsXSxbMzAyLG51bGxdLFszMzUsbnVsbF0sWzI3NSxudWxsXSxbMjU4LG51bGxdLFsxLFwib3JcIl0sWzMzNCxudWxsXSxbMjY3LG51bGxdLFszNCxudWxsXSxbMjYyLG51bGxdLFszMyxudWxsXSxbMzE5LG51bGxdLFsxMyxudWxsXSxbMjk1LG51bGxdLFsyNjMsbnVsbF0sWzI5MSxudWxsXSxbMzExLG51bGxdLFszMDcsbnVsbF0sWzMxMyxudWxsXSxbMjgyLG51bGxdLFsyOTgsbnVsbF0sWzMwNCxudWxsXSxbMjc4LG51bGxdLFszMTgsbnVsbF0sWzMyMixudWxsXSxbNSxudWxsXSxbNixudWxsXSxbNDcsbnVsbF0sWzE3LG51bGxdLFsyNCxudWxsXSxbMzA1LG51bGxdLFszMDYsbnVsbF0sWzMyMyxudWxsXSxbMjg5LG51bGxdLFsxLFwiZmluYWxseVwiXSxbMzMxLG51bGxdLFszMzYsbnVsbF0sWzMzOCxudWxsXSxbMjU3LG51bGxdLFszMixudWxsXSxbMzQxLG51bGxdXSxrZXl3b3Jkczp7RmFsc2U6MzMsXCJudWxsXCI6OSxUcnVlOjYsYW5kOjQ3LFxuYXM6MTA4LGFzc2VydDoyNCxcImJyZWFrXCI6MzksXCJjbGFzc1wiOjEzLFwiY29udGludWVcIjo0MCxcImRlYnVnZ2VyXCI6MTcsZGVmOjQsZGVsOjI3LGVsaWY6MTMwLFwiZWxzZVwiOjEyNyxleGNlcHQ6MTEzLFwiZmluYWxseVwiOjE2OCxcImZvclwiOjM0LGZyb206MzYsZ2xvYmFsOjI2LFwiaWZcIjozNyxcImltcG9ydFwiOjMyLFwiaW5cIjo4Myxpczo5MixsYW1iZGE6MTQsbm9ubG9jYWw6MTgsbm90Ojgsb3I6MTM5LHBhc3M6MjgscHJpbnQ6MTYscmFpc2U6NSxcInJldHVyblwiOjIzLFwidHJ5XCI6MjAsXCJ3aGlsZVwiOjIxLFwid2l0aFwiOjQyLHlpZWxkOjMxfSx0b2tlbnM6ezA6MTEyLDE6MjUsMjoxMSwzOjcsNDoyLDU6MTU5LDY6MTYwLDc6MzUsODo2MSw5OjM4LDEwOjY0LDExOjQ4LDEyOjUyLDEzOjE0NiwxNDo0MywxNTozMCwxNjoxNSwxNzoxNjIsMTg6MTE1LDE5OjQ1LDIwOjk0LDIxOjg5LDIyOjUwLDIzOjExMCwyNDoxNjMsMjU6MTIsMjY6NTksMjc6OTAsMjg6ODgsMjk6OTEsMzA6OTMsMzE6MjIsMzI6MTczLFxuMzM6MTQ0LDM0OjE0MiwzNTo1MywzNjo3NCwzNzo3OCwzODo2OCwzOTo3OSw0MDo2OSw0MTo3Miw0Mjo3Myw0Mzo3NSw0NDo3Nyw0NTo2Nyw0Njo3MSw0NzoxNjEsNDg6NzYsNDk6NDEsNTA6NzAsNTE6MTI5LDUyOjE5LDU0OjI5LDU1OjEwfSxzdGFydDoyNTZ9fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLmZpbGVuYW1lPWE7dGhpcy5ncmFtbWFyPWM7dGhpcy5wX2ZsYWdzPTA7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gYyhiLGMpe3ZvaWQgMD09PWMmJihjPVwiZmlsZV9pbnB1dFwiKTtiPW5ldyBhKGIsU2suUGFyc2VUYWJsZXMpO1wiZmlsZV9pbnB1dFwiPT09Yz9iLnNldHVwKFNrLlBhcnNlVGFibGVzLnN5bS5maWxlX2lucHV0KTpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvO1wiKTtyZXR1cm4gYn1hLkZVVFVSRV9QUklOVF9GVU5DVElPTj1cInByaW50X2Z1bmN0aW9uXCI7YS5GVVRVUkVfVU5JQ09ERV9MSVRFUkFMUz1cInVuaWNvZGVfbGl0ZXJhbHNcIjthLkZVVFVSRV9ESVZJU0lPTj1cblwiZGl2aXNpb25cIjthLkZVVFVSRV9BQlNPTFVURV9JTVBPUlQ9XCJhYnNvbHV0ZV9pbXBvcnRcIjthLkZVVFVSRV9XSVRIX1NUQVRFTUVOVD1cIndpdGhfc3RhdGVtZW50XCI7YS5GVVRVUkVfTkVTVEVEX1NDT1BFUz1cIm5lc3RlZF9zY29wZXNcIjthLkZVVFVSRV9HRU5FUkFUT1JTPVwiZ2VuZXJhdG9yc1wiO2EuQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OPTY1NTM2O2EuQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFM9MTMxMDcyO2EuQ09fRlVUVVJFX0RJVklTT049ODE5MjthLkNPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQ9MTYzODQ7YS5DT19GVVRVUkVfV0lUSF9TVEFURU1FTlQ9MzI3Njg7YS5wcm90b3R5cGUuc2V0dXA9ZnVuY3Rpb24oYSl7YT1hfHx0aGlzLmdyYW1tYXIuc3RhcnQ7dGhpcy5zdGFjaz1be2RmYTp0aGlzLmdyYW1tYXIuZGZhc1thXSxzdGF0ZTowLG5vZGU6e3R5cGU6YSx2YWx1ZTpudWxsLGNvbnRleHQ6bnVsbCxjaGlsZHJlbjpbXX19XTt0aGlzLnVzZWRfbmFtZXM9e319O2EucHJvdG90eXBlLmFkZHRva2VuPVxuZnVuY3Rpb24oYSxjLGYpe3ZhciBiLGU9dGhpcy5jbGFzc2lmeShhLGMsZik7YTpmb3IoOzspe3ZhciBkPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV07dmFyIGc9ZC5kZmFbMF07dmFyIG49Z1tkLnN0YXRlXTtmb3IoYj0wO2I8bi5sZW5ndGg7KytiKXt2YXIgaz1uW2JdWzBdO3ZhciBwPW5bYl1bMV07dmFyIG09dGhpcy5ncmFtbWFyLmxhYmVsc1trXVswXTtpZihlPT09ayl7U2suYXNzZXJ0cy5hc3NlcnQoMjU2Pm0pO3RoaXMuc2hpZnQoYSxjLHAsZik7Zm9yKGY9cDsxPT09Z1tmXS5sZW5ndGgmJjA9PT1nW2ZdWzBdWzBdJiZnW2ZdWzBdWzFdPT09Zjspe3RoaXMucG9wKCk7aWYoMD09PXRoaXMuc3RhY2subGVuZ3RoKXJldHVybiEwO2Q9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXTtmPWQuc3RhdGU7Zz1kLmRmYVswXX1yZXR1cm4hMX1pZigyNTY8PW0mJihrPXRoaXMuZ3JhbW1hci5kZmFzW21dLGs9a1sxXSxrLmhhc093blByb3BlcnR5KGUpKSl7dGhpcy5wdXNoKG0sXG50aGlzLmdyYW1tYXIuZGZhc1ttXSxwLGYpO2NvbnRpbnVlIGF9fWI6e2c9WzAsZC5zdGF0ZV07Zm9yKGQ9bi5sZW5ndGg7ZC0tOylpZihuW2RdWzBdPT09Z1swXSYmbltkXVsxXT09PWdbMV0pe249ITA7YnJlYWsgYn1uPSExfWlmKG4pe2lmKHRoaXMucG9wKCksMD09PXRoaXMuc3RhY2subGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwidG9vIG11Y2ggaW5wdXRcIix0aGlzLmZpbGVuYW1lKTt9ZWxzZSB0aHJvdyBhPWZbMF1bMF0sbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJiYWQgaW5wdXRcIix0aGlzLmZpbGVuYW1lLGEsZik7fX07YS5wcm90b3R5cGUuY2xhc3NpZnk9ZnVuY3Rpb24oYixjLGYpe2lmKGI9PT1Tay50b2tlbi50b2tlbnMuVF9OQU1FKXt0aGlzLnVzZWRfbmFtZXNbY109ITA7dmFyIGU9dGhpcy5ncmFtbWFyLmtleXdvcmRzLmhhc093blByb3BlcnR5KGMpJiZ0aGlzLmdyYW1tYXIua2V5d29yZHNbY107XCJwcmludFwiPT09YyYmKHRoaXMucF9mbGFncyZcbmEuQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OfHwhMD09PVNrLl9fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb24pJiYoZT0hMSk7aWYoZSlyZXR1cm4gZX1lPXRoaXMuZ3JhbW1hci50b2tlbnMuaGFzT3duUHJvcGVydHkoYikmJnRoaXMuZ3JhbW1hci50b2tlbnNbYl07aWYoIWUpe2M9XCIjXCIrYjtmb3IobGV0IGEgaW4gU2sudG9rZW4udG9rZW5zKWlmKFNrLnRva2VuLnRva2Vuc1thXT09Yil7Yz1hO2JyZWFrfXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYmFkIHRva2VuIFwiK2MsdGhpcy5maWxlbmFtZSxmWzBdWzBdLGYpO31yZXR1cm4gZX07YS5wcm90b3R5cGUuc2hpZnQ9ZnVuY3Rpb24oYSxjLGYsbCl7dmFyIGI9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5kZmEsZD10aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLm5vZGU7ZC5jaGlsZHJlbi5wdXNoKHt0eXBlOmEsdmFsdWU6YyxsaW5lbm86bFswXVswXSxjb2xfb2Zmc2V0OmxbMF1bMV0sY2hpbGRyZW46bnVsbH0pO1xudGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXT17ZGZhOmIsc3RhdGU6Zixub2RlOmR9fTthLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEsYyxmLGwpe2E9e3R5cGU6YSx2YWx1ZTpudWxsLGxpbmVubzpsWzBdWzBdLGNvbF9vZmZzZXQ6bFswXVsxXSxjaGlsZHJlbjpbXX07dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXT17ZGZhOnRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV0uZGZhLHN0YXRlOmYsbm9kZTp0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLm5vZGV9O3RoaXMuc3RhY2sucHVzaCh7ZGZhOmMsc3RhdGU6MCxub2RlOmF9KX07YS5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zdGFjay5wb3AoKS5ub2RlO2lmKGEpaWYoMCE9PXRoaXMuc3RhY2subGVuZ3RoKXt2YXIgYz10aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLm5vZGU7Yy5jaGlsZHJlbi5wdXNoKGEpfWVsc2UgdGhpcy5yb290bm9kZT1hLHRoaXMucm9vdG5vZGUudXNlZF9uYW1lcz1cbnRoaXMudXNlZF9uYW1lc307U2sucGFyc2U9ZnVuY3Rpb24oYSxlKXt2YXIgYj1Tay50b2tlbi50b2tlbnMuVF9DT01NRU5ULGw9U2sudG9rZW4udG9rZW5zLlRfTkwsaD1Tay50b2tlbi50b2tlbnMuVF9PUCxkPVNrLnRva2VuLnRva2Vucy5UX0VORE1BUktFUixnPVNrLnRva2VuLnRva2Vucy5UX0VOQ09ESU5HLG49ITEsaz1jKGEpO1NrLl90b2tlbml6ZShhLGZ1bmN0aW9uKGEpe3ZhciBiPWEuc3BsaXQoXCJcXG5cIikucmV2ZXJzZSgpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYStcIlxcblwifSk7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoMD09PWIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcIkVPRlwiKTtyZXR1cm4gYi5wb3AoKX19KGUpLFwidXRmLThcIixmdW5jdGlvbihhKXt2YXIgYz1udWxsO2EudHlwZSE9PWImJmEudHlwZSE9PWwmJmEudHlwZSE9PWcmJihhLnR5cGU9PT1oJiYoYz1Tay5PcE1hcFthLnN0cmluZ10pLGsuYWRkdG9rZW4oY3x8YS50eXBlLGEuc3RyaW5nLFxuW2Euc3RhcnQsYS5lbmQsYS5saW5lXSksYS50eXBlPT09ZCYmKG49ITApKX0pO2lmKCFuKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW5jb21wbGV0ZSBpbnB1dFwiLHRoaXMuZmlsZW5hbWUpO3JldHVybntjc3Q6ay5yb290bm9kZSxmbGFnczprLnBfZmxhZ3N9fTtTay5wYXJzZVRyZWVEdW1wPWZ1bmN0aW9uKGEsYyl7dmFyIGI7Yz1jfHxcIlwiO3ZhciBlPVwiXCIrYztpZigyNTY8PWEudHlwZSlmb3IoZSs9U2suUGFyc2VUYWJsZXMubnVtYmVyMnN5bWJvbFthLnR5cGVdK1wiXFxuXCIsYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7KytiKWUrPVNrLnBhcnNlVHJlZUR1bXAoYS5jaGlsZHJlbltiXSxjK1wiICBcIik7ZWxzZSBlKz1Tay50b2tlbi50b2tfbmFtZVthLnR5cGVdK1wiOiBcIisobmV3IFNrLmJ1aWx0aW4uc3RyKGEudmFsdWUpKS4kcigpLnYrXCJcXG5cIjtyZXR1cm4gZX07U2suZXhwb3J0U3ltYm9sKFwiU2suUGFyc2VyXCIsYSk7U2suZXhwb3J0U3ltYm9sKFwiU2sucGFyc2VcIixTay5wYXJzZSk7XG5Tay5leHBvcnRTeW1ib2woXCJTay5wYXJzZVRyZWVEdW1wXCIsU2sucGFyc2VUcmVlRHVtcCl9LGZ1bmN0aW9uKG0scSl7U2suYXN0bm9kZXM9e307U2suYXN0bm9kZXMuTG9hZD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuU3RvcmU9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkRlbD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQXVnTG9hZD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQXVnU3RvcmU9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlBhcmFtPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5BbmQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk9yPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5BZGQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlN1Yj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTXVsdD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTWF0TXVsdD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuRGl2PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Nb2Q9ZnVuY3Rpb24oKXt9O1xuU2suYXN0bm9kZXMuUG93PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5MU2hpZnQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlJTaGlmdD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQml0T3I9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkJpdFhvcj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQml0QW5kPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5GbG9vckRpdj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuSW52ZXJ0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Ob3Q9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlVBZGQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlVTdWI9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkVxPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Ob3RFcT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTHQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkx0RT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuR3Q9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkd0RT1cbmZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Jcz1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuSXNOb3Q9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkluPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Ob3RJbj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTW9kdWxlPWZ1bmN0aW9uKGEsYyl7dGhpcy5ib2R5PWE7dGhpcy5kb2NzdHJpbmc9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSW50ZXJhY3RpdmU9ZnVuY3Rpb24oYSl7dGhpcy5ib2R5PWE7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkV4cHJlc3Npb249ZnVuY3Rpb24oYSl7dGhpcy5ib2R5PWE7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlN1aXRlPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZj1mdW5jdGlvbihhLGMsYixlLGYsbCxoLGQpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1oJiZ2b2lkIDAhPT1oKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZCYmdm9pZCAwIT09XG5kKTt0aGlzLm5hbWU9YTt0aGlzLmFyZ3M9Yzt0aGlzLmJvZHk9Yjt0aGlzLmRlY29yYXRvcl9saXN0PWU7dGhpcy5yZXR1cm5zPWY7dGhpcy5kb2NzdHJpbmc9bDt0aGlzLmxpbmVubz1oO3RoaXMuY29sX29mZnNldD1kO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmPWZ1bmN0aW9uKGEsYyxiLGUsZixsLGgsZCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWgmJnZvaWQgMCE9PWgpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1kJiZ2b2lkIDAhPT1kKTt0aGlzLm5hbWU9YTt0aGlzLmFyZ3M9Yzt0aGlzLmJvZHk9Yjt0aGlzLmRlY29yYXRvcl9saXN0PWU7dGhpcy5yZXR1cm5zPWY7dGhpcy5kb2NzdHJpbmc9bDt0aGlzLmxpbmVubz1oO3RoaXMuY29sX29mZnNldD1kO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5DbGFzc0RlZj1mdW5jdGlvbihhLGMsYixlLGYsbCxoLGQpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1oJiZ2b2lkIDAhPT1oKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5kJiZ2b2lkIDAhPT1kKTt0aGlzLm5hbWU9YTt0aGlzLmJhc2VzPWM7dGhpcy5rZXl3b3Jkcz1iO3RoaXMuYm9keT1lO3RoaXMuZGVjb3JhdG9yX2xpc3Q9Zjt0aGlzLmRvY3N0cmluZz1sO3RoaXMubGluZW5vPWg7dGhpcy5jb2xfb2Zmc2V0PWQ7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlJldHVybj1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRGVsZXRlPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudGFyZ2V0cz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFzc2lnbj1cbmZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy50YXJnZXRzPWE7dGhpcy52YWx1ZT1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkF1Z0Fzc2lnbj1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50YXJnZXQ9YTt0aGlzLm9wPWM7dGhpcy52YWx1ZT1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFubkFzc2lnbj1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLnRhcmdldD1cbmE7dGhpcy5hbm5vdGF0aW9uPWM7dGhpcy52YWx1ZT1iO3RoaXMuc2ltcGxlPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRm9yPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWwmJnZvaWQgMCE9PWwpO3RoaXMudGFyZ2V0PWE7dGhpcy5pdGVyPWM7dGhpcy5ib2R5PWI7dGhpcy5vcmVsc2U9ZTt0aGlzLmxpbmVubz1mO3RoaXMuY29sX29mZnNldD1sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3luY0Zvcj1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLnRhcmdldD1hO3RoaXMuaXRlcj1jO3RoaXMuYm9keT1iO3RoaXMub3JlbHNlPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9XG5sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5XaGlsZT1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50ZXN0PWE7dGhpcy5ib2R5PWM7dGhpcy5vcmVsc2U9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JZj1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50ZXN0PWE7dGhpcy5ib2R5PWM7dGhpcy5vcmVsc2U9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5XaXRoPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5lJiZ2b2lkIDAhPT1lKTt0aGlzLml0ZW1zPWE7dGhpcy5ib2R5PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXN5bmNXaXRoPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5pdGVtcz1hO3RoaXMuYm9keT1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlJhaXNlPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWwmJnZvaWQgMCE9PWwpO3RoaXMuZXhjPWE7dGhpcy5jYXVzZT1jO3RoaXMuaW5zdD1iO3RoaXMudGJhY2s9ZTt0aGlzLmxpbmVubz1mO3RoaXMuY29sX29mZnNldD1sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Ucnk9XG5mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLmJvZHk9YTt0aGlzLmhhbmRsZXJzPWM7dGhpcy5vcmVsc2U9Yjt0aGlzLmZpbmFsYm9keT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PWw7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFzc2VydD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMudGVzdD1hO3RoaXMubXNnPWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSW1wb3J0PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PVxuYik7dGhpcy5uYW1lcz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkltcG9ydEZyb209ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMubW9kdWxlPWE7dGhpcy5uYW1lcz1jO3RoaXMubGV2ZWw9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5HbG9iYWw9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy5uYW1lcz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk5vbmxvY2FsPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy5uYW1lcz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkV4cHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlBhc3M9ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YSYmdm9pZCAwIT09YSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJyZWFrPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWEmJnZvaWQgMCE9PVxuYSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbnRpbnVlPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWEmJnZvaWQgMCE9PWEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5QcmludD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5kZXN0PWE7dGhpcy52YWx1ZXM9Yzt0aGlzLm5sPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRGVidWdnZXI9ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5hJiZ2b2lkIDAhPT1hKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7dGhpcy5saW5lbm89YTt0aGlzLmNvbF9vZmZzZXQ9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQm9vbE9wPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5vcD1hO3RoaXMudmFsdWVzPWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQmluT3A9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMubGVmdD1hO3RoaXMub3A9Yzt0aGlzLnJpZ2h0PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuVW5hcnlPcD1cbmZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5vcD1hO3RoaXMub3BlcmFuZD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkxhbWJkYT1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuYXJncz1hO3RoaXMuYm9keT1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLklmRXhwPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnRlc3Q9YTt0aGlzLmJvZHk9Yzt0aGlzLm9yZWxzZT1cbmI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRGljdD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMua2V5cz1hO3RoaXMudmFsdWVzPWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU2V0PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMuZWx0cz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkxpc3RDb21wPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdD1hO3RoaXMuZ2VuZXJhdG9ycz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlNldENvbXA9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdD1hO3RoaXMuZ2VuZXJhdG9ycz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRpY3RDb21wPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLmtleT1hO3RoaXMudmFsdWU9Yzt0aGlzLmdlbmVyYXRvcnM9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA9XG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuZWx0PWE7dGhpcy5nZW5lcmF0b3JzPWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXdhaXQ9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLllpZWxkPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1cbmI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLllpZWxkRnJvbT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ29tcGFyZT1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5sZWZ0PWE7dGhpcy5vcHM9Yzt0aGlzLmNvbXBhcmF0b3JzPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ2FsbD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmXG52b2lkIDAhPT1mKTt0aGlzLmZ1bmM9YTt0aGlzLmFyZ3M9Yzt0aGlzLmtleXdvcmRzPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTnVtPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubj1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlN0cj1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZT1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1cbmUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnZhbHVlPWE7dGhpcy5jb252ZXJzaW9uPWM7dGhpcy5mb3JtYXRfc3BlYz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkpvaW5lZFN0cj1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlcz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJ5dGVzPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMucz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk5hbWVDb25zdGFudD1cbmZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FbGxpcHNpcz1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1hKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7dGhpcy5saW5lbm89YTt0aGlzLmNvbF9vZmZzZXQ9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ29uc3RhbnQ9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkF0dHJpYnV0ZT1cbmZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnZhbHVlPWE7dGhpcy5hdHRyPWM7dGhpcy5jdHg9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdWJzY3JpcHQ9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudmFsdWU9YTt0aGlzLnNsaWNlPWM7dGhpcy5jdHg9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdGFycmVkPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7XG50aGlzLnZhbHVlPWE7dGhpcy5jdHg9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5OYW1lPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5pZD1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTGlzdD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuZWx0cz1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuVHVwbGU9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PVxuYik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuZWx0cz1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU2xpY2U9ZnVuY3Rpb24oYSxjLGIpe3RoaXMubG93ZXI9YTt0aGlzLnVwcGVyPWM7dGhpcy5zdGVwPWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkV4dFNsaWNlPWZ1bmN0aW9uKGEpe3RoaXMuZGltcz1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JbmRleD1mdW5jdGlvbihhKXt0aGlzLnZhbHVlPWE7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLmNvbXByZWhlbnNpb249ZnVuY3Rpb24oYSxjLGIsZSl7dGhpcy50YXJnZXQ9YTt0aGlzLml0ZXI9Yzt0aGlzLmlmcz1iO3RoaXMuaXNfYXN5bmM9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlcj1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1cbmUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnR5cGU9YTt0aGlzLm5hbWU9Yzt0aGlzLmJvZHk9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5hcmd1bWVudHNfPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXt0aGlzLmFyZ3M9YTt0aGlzLnZhcmFyZz1jO3RoaXMua3dvbmx5YXJncz1iO3RoaXMua3dfZGVmYXVsdHM9ZTt0aGlzLmt3YXJnPWY7dGhpcy5kZWZhdWx0cz1sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5hcmc9ZnVuY3Rpb24gYShhLGMpe3RoaXMuYXJnPWE7dGhpcy5hbm5vdGF0aW9uPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLmtleXdvcmQ9ZnVuY3Rpb24oYSxjKXt0aGlzLmFyZz1hO3RoaXMudmFsdWU9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuYWxpYXM9ZnVuY3Rpb24oYSxjKXt0aGlzLm5hbWU9YTt0aGlzLmFzbmFtZT1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy53aXRoaXRlbT1cbmZ1bmN0aW9uKGEsYyl7dGhpcy5jb250ZXh0X2V4cHI9YTt0aGlzLm9wdGlvbmFsX3ZhcnM9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTW9kdWxlLnByb3RvdHlwZS5fYXN0bmFtZT1cIk1vZHVsZVwiO1NrLmFzdG5vZGVzLk1vZHVsZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJkb2NzdHJpbmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kb2NzdHJpbmd9XTtTay5hc3Rub2Rlcy5JbnRlcmFjdGl2ZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbnRlcmFjdGl2ZVwiO1NrLmFzdG5vZGVzLkludGVyYWN0aXZlLnByb3RvdHlwZS5fZmllbGRzPVtcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fV07U2suYXN0bm9kZXMuRXhwcmVzc2lvbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJFeHByZXNzaW9uXCI7U2suYXN0bm9kZXMuRXhwcmVzc2lvbi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLlN1aXRlLnByb3RvdHlwZS5fYXN0bmFtZT1cblwiU3VpdGVcIjtTay5hc3Rub2Rlcy5TdWl0ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmLnByb3RvdHlwZS5fYXN0bmFtZT1cIkZ1bmN0aW9uRGVmXCI7U2suYXN0bm9kZXMuRnVuY3Rpb25EZWYucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ3N9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZGVjb3JhdG9yX2xpc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZWNvcmF0b3JfbGlzdH0sXCJyZXR1cm5zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEucmV0dXJuc30sXCJkb2NzdHJpbmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kb2NzdHJpbmd9XTtTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFzeW5jRnVuY3Rpb25EZWZcIjtTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmLnByb3RvdHlwZS5fZmllbGRzPVxuW1wibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ3N9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZGVjb3JhdG9yX2xpc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZWNvcmF0b3JfbGlzdH0sXCJyZXR1cm5zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEucmV0dXJuc30sXCJkb2NzdHJpbmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kb2NzdHJpbmd9XTtTay5hc3Rub2Rlcy5DbGFzc0RlZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJDbGFzc0RlZlwiO1NrLmFzdG5vZGVzLkNsYXNzRGVmLnByb3RvdHlwZS5fZmllbGRzPVtcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImJhc2VzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYmFzZXN9LFwia2V5d29yZHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl3b3Jkc30sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJkZWNvcmF0b3JfbGlzdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRlY29yYXRvcl9saXN0fSxcblwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuUmV0dXJuLnByb3RvdHlwZS5fYXN0bmFtZT1cIlJldHVyblwiO1NrLmFzdG5vZGVzLlJldHVybi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuRGVsZXRlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkRlbGV0ZVwiO1NrLmFzdG5vZGVzLkRlbGV0ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0c31dO1NrLmFzdG5vZGVzLkFzc2lnbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3NpZ25cIjtTay5hc3Rub2Rlcy5Bc3NpZ24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldHN9LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkF1Z0Fzc2lnbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBdWdBc3NpZ25cIjtcblNrLmFzdG5vZGVzLkF1Z0Fzc2lnbi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFwib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQW5uQXNzaWduLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFubkFzc2lnblwiO1NrLmFzdG5vZGVzLkFubkFzc2lnbi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFwiYW5ub3RhdGlvblwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFubm90YXRpb259LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX0sXCJzaW1wbGVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zaW1wbGV9XTtTay5hc3Rub2Rlcy5Gb3IucHJvdG90eXBlLl9hc3RuYW1lPVwiRm9yXCI7U2suYXN0bm9kZXMuRm9yLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXG5cIml0ZXJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pdGVyfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcIm9yZWxzZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9yZWxzZX1dO1NrLmFzdG5vZGVzLkFzeW5jRm9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFzeW5jRm9yXCI7U2suYXN0bm9kZXMuQXN5bmNGb3IucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcIml0ZXJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pdGVyfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcIm9yZWxzZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9yZWxzZX1dO1NrLmFzdG5vZGVzLldoaWxlLnByb3RvdHlwZS5fYXN0bmFtZT1cIldoaWxlXCI7U2suYXN0bm9kZXMuV2hpbGUucHJvdG90eXBlLl9maWVsZHM9W1widGVzdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRlc3R9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwib3JlbHNlXCIsXG5mdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5JZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJJZlwiO1NrLmFzdG5vZGVzLklmLnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50ZXN0fSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcIm9yZWxzZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9yZWxzZX1dO1NrLmFzdG5vZGVzLldpdGgucHJvdG90eXBlLl9hc3RuYW1lPVwiV2l0aFwiO1NrLmFzdG5vZGVzLldpdGgucHJvdG90eXBlLl9maWVsZHM9W1wiaXRlbXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pdGVtc30sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLkFzeW5jV2l0aC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3luY1dpdGhcIjtTay5hc3Rub2Rlcy5Bc3luY1dpdGgucHJvdG90eXBlLl9maWVsZHM9W1wiaXRlbXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pdGVtc30sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1xuU2suYXN0bm9kZXMuUmFpc2UucHJvdG90eXBlLl9hc3RuYW1lPVwiUmFpc2VcIjtTay5hc3Rub2Rlcy5SYWlzZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJleGNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5leGN9LFwiY2F1c2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jYXVzZX0sXCJpbnN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5zdH0sXCJ0YmFja1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRiYWNrfV07U2suYXN0bm9kZXMuVHJ5LnByb3RvdHlwZS5fYXN0bmFtZT1cIlRyeVwiO1NrLmFzdG5vZGVzLlRyeS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJoYW5kbGVyc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmhhbmRsZXJzfSxcIm9yZWxzZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9yZWxzZX0sXCJmaW5hbGJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5maW5hbGJvZHl9XTtTay5hc3Rub2Rlcy5Bc3NlcnQucHJvdG90eXBlLl9hc3RuYW1lPVwiQXNzZXJ0XCI7XG5Tay5hc3Rub2Rlcy5Bc3NlcnQucHJvdG90eXBlLl9maWVsZHM9W1widGVzdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRlc3R9LFwibXNnXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubXNnfV07U2suYXN0bm9kZXMuSW1wb3J0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkltcG9ydFwiO1NrLmFzdG5vZGVzLkltcG9ydC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuSW1wb3J0RnJvbS5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbXBvcnRGcm9tXCI7U2suYXN0bm9kZXMuSW1wb3J0RnJvbS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJtb2R1bGVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5tb2R1bGV9LFwibmFtZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lc30sXCJsZXZlbFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmxldmVsfV07U2suYXN0bm9kZXMuR2xvYmFsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkdsb2JhbFwiO1NrLmFzdG5vZGVzLkdsb2JhbC5wcm90b3R5cGUuX2ZpZWxkcz1cbltcIm5hbWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZXN9XTtTay5hc3Rub2Rlcy5Ob25sb2NhbC5wcm90b3R5cGUuX2FzdG5hbWU9XCJOb25sb2NhbFwiO1NrLmFzdG5vZGVzLk5vbmxvY2FsLnByb3RvdHlwZS5fZmllbGRzPVtcIm5hbWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZXN9XTtTay5hc3Rub2Rlcy5FeHByLnByb3RvdHlwZS5fYXN0bmFtZT1cIkV4cHJcIjtTay5hc3Rub2Rlcy5FeHByLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5QYXNzLnByb3RvdHlwZS5fYXN0bmFtZT1cIlBhc3NcIjtTay5hc3Rub2Rlcy5QYXNzLnByb3RvdHlwZS5fZmllbGRzPVtdO1NrLmFzdG5vZGVzLkJyZWFrLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJyZWFrXCI7U2suYXN0bm9kZXMuQnJlYWsucHJvdG90eXBlLl9maWVsZHM9W107U2suYXN0bm9kZXMuQ29udGludWUucHJvdG90eXBlLl9hc3RuYW1lPVwiQ29udGludWVcIjtTay5hc3Rub2Rlcy5Db250aW51ZS5wcm90b3R5cGUuX2ZpZWxkcz1cbltdO1NrLmFzdG5vZGVzLlByaW50LnByb3RvdHlwZS5fYXN0bmFtZT1cIlByaW50XCI7U2suYXN0bm9kZXMuUHJpbnQucHJvdG90eXBlLl9maWVsZHM9W1wiZGVzdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRlc3R9LFwidmFsdWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWVzfSxcIm5sXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmx9XTtTay5hc3Rub2Rlcy5EZWJ1Z2dlci5wcm90b3R5cGUuX2FzdG5hbWU9XCJEZWJ1Z2dlclwiO1NrLmFzdG5vZGVzLkRlYnVnZ2VyLnByb3RvdHlwZS5fZmllbGRzPVtdO1NrLmFzdG5vZGVzLkJvb2xPcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJCb29sT3BcIjtTay5hc3Rub2Rlcy5Cb29sT3AucHJvdG90eXBlLl9maWVsZHM9W1wib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJ2YWx1ZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZXN9XTtTay5hc3Rub2Rlcy5CaW5PcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaW5PcFwiO1NrLmFzdG5vZGVzLkJpbk9wLnByb3RvdHlwZS5fZmllbGRzPVxuW1wibGVmdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmxlZnR9LFwib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJyaWdodFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnJpZ2h0fV07U2suYXN0bm9kZXMuVW5hcnlPcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJVbmFyeU9wXCI7U2suYXN0bm9kZXMuVW5hcnlPcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJvcFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9wfSxcIm9wZXJhbmRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcGVyYW5kfV07U2suYXN0bm9kZXMuTGFtYmRhLnByb3RvdHlwZS5fYXN0bmFtZT1cIkxhbWJkYVwiO1NrLmFzdG5vZGVzLkxhbWJkYS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJhcmdzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnc30sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLklmRXhwLnByb3RvdHlwZS5fYXN0bmFtZT1cIklmRXhwXCI7U2suYXN0bm9kZXMuSWZFeHAucHJvdG90eXBlLl9maWVsZHM9W1widGVzdFwiLFxuZnVuY3Rpb24oYSl7cmV0dXJuIGEudGVzdH0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5EaWN0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkRpY3RcIjtTay5hc3Rub2Rlcy5EaWN0LnByb3RvdHlwZS5fZmllbGRzPVtcImtleXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXlzfSxcInZhbHVlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlc31dO1NrLmFzdG5vZGVzLlNldC5wcm90b3R5cGUuX2FzdG5hbWU9XCJTZXRcIjtTay5hc3Rub2Rlcy5TZXQucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmVsdHN9XTtTay5hc3Rub2Rlcy5MaXN0Q29tcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJMaXN0Q29tcFwiO1NrLmFzdG5vZGVzLkxpc3RDb21wLnByb3RvdHlwZS5fZmllbGRzPVtcImVsdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmVsdH0sXCJnZW5lcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2VuZXJhdG9yc31dO1xuU2suYXN0bm9kZXMuU2V0Q29tcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJTZXRDb21wXCI7U2suYXN0bm9kZXMuU2V0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHR9LFwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtTay5hc3Rub2Rlcy5EaWN0Q29tcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJEaWN0Q29tcFwiO1NrLmFzdG5vZGVzLkRpY3RDb21wLnByb3RvdHlwZS5fZmllbGRzPVtcImtleVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmtleX0sXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImdlbmVyYXRvcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5nZW5lcmF0b3JzfV07U2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwLnByb3RvdHlwZS5fYXN0bmFtZT1cIkdlbmVyYXRvckV4cFwiO1NrLmFzdG5vZGVzLkdlbmVyYXRvckV4cC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHR9LFxuXCJnZW5lcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2VuZXJhdG9yc31dO1NrLmFzdG5vZGVzLkF3YWl0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkF3YWl0XCI7U2suYXN0bm9kZXMuQXdhaXQucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLllpZWxkLnByb3RvdHlwZS5fYXN0bmFtZT1cIllpZWxkXCI7U2suYXN0bm9kZXMuWWllbGQucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLllpZWxkRnJvbS5wcm90b3R5cGUuX2FzdG5hbWU9XCJZaWVsZEZyb21cIjtTay5hc3Rub2Rlcy5ZaWVsZEZyb20ucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkNvbXBhcmUucHJvdG90eXBlLl9hc3RuYW1lPVwiQ29tcGFyZVwiO1NrLmFzdG5vZGVzLkNvbXBhcmUucHJvdG90eXBlLl9maWVsZHM9XG5bXCJsZWZ0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVmdH0sXCJvcHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcHN9LFwiY29tcGFyYXRvcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jb21wYXJhdG9yc31dO1NrLmFzdG5vZGVzLkNhbGwucHJvdG90eXBlLl9hc3RuYW1lPVwiQ2FsbFwiO1NrLmFzdG5vZGVzLkNhbGwucHJvdG90eXBlLl9maWVsZHM9W1wiZnVuY1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmZ1bmN9LFwiYXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ3N9LFwia2V5d29yZHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl3b3Jkc31dO1NrLmFzdG5vZGVzLk51bS5wcm90b3R5cGUuX2FzdG5hbWU9XCJOdW1cIjtTay5hc3Rub2Rlcy5OdW0ucHJvdG90eXBlLl9maWVsZHM9W1wiblwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm59XTtTay5hc3Rub2Rlcy5TdHIucHJvdG90eXBlLl9hc3RuYW1lPVwiU3RyXCI7U2suYXN0bm9kZXMuU3RyLnByb3RvdHlwZS5fZmllbGRzPVtcInNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zfV07XG5Tay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJGb3JtYXR0ZWRWYWx1ZVwiO1NrLmFzdG5vZGVzLkZvcm1hdHRlZFZhbHVlLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwiY29udmVyc2lvblwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbnZlcnNpb259LFwiZm9ybWF0X3NwZWNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5mb3JtYXRfc3BlY31dO1NrLmFzdG5vZGVzLkpvaW5lZFN0ci5wcm90b3R5cGUuX2FzdG5hbWU9XCJKb2luZWRTdHJcIjtTay5hc3Rub2Rlcy5Kb2luZWRTdHIucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWVzfV07U2suYXN0bm9kZXMuQnl0ZXMucHJvdG90eXBlLl9hc3RuYW1lPVwiQnl0ZXNcIjtTay5hc3Rub2Rlcy5CeXRlcy5wcm90b3R5cGUuX2ZpZWxkcz1bXCJzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc31dO1NrLmFzdG5vZGVzLk5hbWVDb25zdGFudC5wcm90b3R5cGUuX2FzdG5hbWU9XG5cIk5hbWVDb25zdGFudFwiO1NrLmFzdG5vZGVzLk5hbWVDb25zdGFudC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuRWxsaXBzaXMucHJvdG90eXBlLl9hc3RuYW1lPVwiRWxsaXBzaXNcIjtTay5hc3Rub2Rlcy5FbGxpcHNpcy5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5Db25zdGFudC5wcm90b3R5cGUuX2FzdG5hbWU9XCJDb25zdGFudFwiO1NrLmFzdG5vZGVzLkNvbnN0YW50LnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5BdHRyaWJ1dGUucHJvdG90eXBlLl9hc3RuYW1lPVwiQXR0cmlidXRlXCI7U2suYXN0bm9kZXMuQXR0cmlidXRlLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwiYXR0clwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmF0dHJ9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07XG5Tay5hc3Rub2Rlcy5TdWJzY3JpcHQucHJvdG90eXBlLl9hc3RuYW1lPVwiU3Vic2NyaXB0XCI7U2suYXN0bm9kZXMuU3Vic2NyaXB0LnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwic2xpY2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zbGljZX0sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5TdGFycmVkLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0YXJyZWRcIjtTay5hc3Rub2Rlcy5TdGFycmVkLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuTmFtZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJOYW1lXCI7U2suYXN0bm9kZXMuTmFtZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJpZFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmlkfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1NrLmFzdG5vZGVzLkxpc3QucHJvdG90eXBlLl9hc3RuYW1lPVxuXCJMaXN0XCI7U2suYXN0bm9kZXMuTGlzdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0c30sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5UdXBsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJUdXBsZVwiO1NrLmFzdG5vZGVzLlR1cGxlLnByb3RvdHlwZS5fZmllbGRzPVtcImVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHRzfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1NrLmFzdG5vZGVzLkxvYWQucHJvdG90eXBlLl9hc3RuYW1lPVwiTG9hZFwiO1NrLmFzdG5vZGVzLkxvYWQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuU3RvcmUucHJvdG90eXBlLl9hc3RuYW1lPVwiU3RvcmVcIjtTay5hc3Rub2Rlcy5TdG9yZS5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5EZWwucHJvdG90eXBlLl9hc3RuYW1lPVwiRGVsXCI7U2suYXN0bm9kZXMuRGVsLnByb3RvdHlwZS5faXNlbnVtPSEwO1xuU2suYXN0bm9kZXMuQXVnTG9hZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBdWdMb2FkXCI7U2suYXN0bm9kZXMuQXVnTG9hZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5BdWdTdG9yZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJBdWdTdG9yZVwiO1NrLmFzdG5vZGVzLkF1Z1N0b3JlLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlBhcmFtLnByb3RvdHlwZS5fYXN0bmFtZT1cIlBhcmFtXCI7U2suYXN0bm9kZXMuUGFyYW0ucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuU2xpY2UucHJvdG90eXBlLl9hc3RuYW1lPVwiU2xpY2VcIjtTay5hc3Rub2Rlcy5TbGljZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJsb3dlclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmxvd2VyfSxcInVwcGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudXBwZXJ9LFwic3RlcFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnN0ZXB9XTtTay5hc3Rub2Rlcy5FeHRTbGljZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJFeHRTbGljZVwiO1xuU2suYXN0bm9kZXMuRXh0U2xpY2UucHJvdG90eXBlLl9maWVsZHM9W1wiZGltc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRpbXN9XTtTay5hc3Rub2Rlcy5JbmRleC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbmRleFwiO1NrLmFzdG5vZGVzLkluZGV4LnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5BbmQucHJvdG90eXBlLl9hc3RuYW1lPVwiQW5kXCI7U2suYXN0bm9kZXMuQW5kLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIk9yXCI7U2suYXN0bm9kZXMuT3IucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQWRkLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFkZFwiO1NrLmFzdG5vZGVzLkFkZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5TdWIucHJvdG90eXBlLl9hc3RuYW1lPVwiU3ViXCI7U2suYXN0bm9kZXMuU3ViLnByb3RvdHlwZS5faXNlbnVtPSEwO1xuU2suYXN0bm9kZXMuTXVsdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNdWx0XCI7U2suYXN0bm9kZXMuTXVsdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5NYXRNdWx0LnByb3RvdHlwZS5fYXN0bmFtZT1cIk1hdE11bHRcIjtTay5hc3Rub2Rlcy5NYXRNdWx0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkRpdi5wcm90b3R5cGUuX2FzdG5hbWU9XCJEaXZcIjtTay5hc3Rub2Rlcy5EaXYucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTW9kLnByb3RvdHlwZS5fYXN0bmFtZT1cIk1vZFwiO1NrLmFzdG5vZGVzLk1vZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Qb3cucHJvdG90eXBlLl9hc3RuYW1lPVwiUG93XCI7U2suYXN0bm9kZXMuUG93LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkxTaGlmdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJMU2hpZnRcIjtTay5hc3Rub2Rlcy5MU2hpZnQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuUlNoaWZ0LnByb3RvdHlwZS5fYXN0bmFtZT1cblwiUlNoaWZ0XCI7U2suYXN0bm9kZXMuUlNoaWZ0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkJpdE9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJpdE9yXCI7U2suYXN0bm9kZXMuQml0T3IucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQml0WG9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJpdFhvclwiO1NrLmFzdG5vZGVzLkJpdFhvci5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5CaXRBbmQucHJvdG90eXBlLl9hc3RuYW1lPVwiQml0QW5kXCI7U2suYXN0bm9kZXMuQml0QW5kLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkZsb29yRGl2LnByb3RvdHlwZS5fYXN0bmFtZT1cIkZsb29yRGl2XCI7U2suYXN0bm9kZXMuRmxvb3JEaXYucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuSW52ZXJ0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkludmVydFwiO1NrLmFzdG5vZGVzLkludmVydC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Ob3QucHJvdG90eXBlLl9hc3RuYW1lPVxuXCJOb3RcIjtTay5hc3Rub2Rlcy5Ob3QucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuVUFkZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJVQWRkXCI7U2suYXN0bm9kZXMuVUFkZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5VU3ViLnByb3RvdHlwZS5fYXN0bmFtZT1cIlVTdWJcIjtTay5hc3Rub2Rlcy5VU3ViLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkVxLnByb3RvdHlwZS5fYXN0bmFtZT1cIkVxXCI7U2suYXN0bm9kZXMuRXEucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTm90RXEucHJvdG90eXBlLl9hc3RuYW1lPVwiTm90RXFcIjtTay5hc3Rub2Rlcy5Ob3RFcS5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJMdFwiO1NrLmFzdG5vZGVzLkx0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkx0RS5wcm90b3R5cGUuX2FzdG5hbWU9XCJMdEVcIjtTay5hc3Rub2Rlcy5MdEUucHJvdG90eXBlLl9pc2VudW09XG4hMDtTay5hc3Rub2Rlcy5HdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHdFwiO1NrLmFzdG5vZGVzLkd0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkd0RS5wcm90b3R5cGUuX2FzdG5hbWU9XCJHdEVcIjtTay5hc3Rub2Rlcy5HdEUucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuSXMucHJvdG90eXBlLl9hc3RuYW1lPVwiSXNcIjtTay5hc3Rub2Rlcy5Jcy5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Jc05vdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJc05vdFwiO1NrLmFzdG5vZGVzLklzTm90LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkluLnByb3RvdHlwZS5fYXN0bmFtZT1cIkluXCI7U2suYXN0bm9kZXMuSW4ucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTm90SW4ucHJvdG90eXBlLl9hc3RuYW1lPVwiTm90SW5cIjtTay5hc3Rub2Rlcy5Ob3RJbi5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uLnByb3RvdHlwZS5fYXN0bmFtZT1cblwiY29tcHJlaGVuc2lvblwiO1NrLmFzdG5vZGVzLmNvbXByZWhlbnNpb24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcIml0ZXJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pdGVyfSxcImlmc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmlmc30sXCJpc19hc3luY1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmlzX2FzeW5jfV07U2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlci5wcm90b3R5cGUuX2FzdG5hbWU9XCJFeGNlcHRIYW5kbGVyXCI7U2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0eXBlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZX0sXCJuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLmFyZ3VtZW50c18ucHJvdG90eXBlLl9hc3RuYW1lPVwiYXJndW1lbnRzXCI7U2suYXN0bm9kZXMuYXJndW1lbnRzXy5wcm90b3R5cGUuX2ZpZWxkcz1cbltcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcInZhcmFyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhcmFyZ30sXCJrd29ubHlhcmdzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua3dvbmx5YXJnc30sXCJrd19kZWZhdWx0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3X2RlZmF1bHRzfSxcImt3YXJnXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua3dhcmd9LFwiZGVmYXVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZWZhdWx0c31dO1NrLmFzdG5vZGVzLmFyZy5wcm90b3R5cGUuX2FzdG5hbWU9XCJhcmdcIjtTay5hc3Rub2Rlcy5hcmcucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnfSxcImFubm90YXRpb25cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hbm5vdGF0aW9ufV07U2suYXN0bm9kZXMua2V5d29yZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJrZXl3b3JkXCI7U2suYXN0bm9kZXMua2V5d29yZC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJhcmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmd9LFxuXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuYWxpYXMucHJvdG90eXBlLl9hc3RuYW1lPVwiYWxpYXNcIjtTay5hc3Rub2Rlcy5hbGlhcy5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0sXCJhc25hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hc25hbWV9XTtTay5hc3Rub2Rlcy53aXRoaXRlbS5wcm90b3R5cGUuX2FzdG5hbWU9XCJ3aXRoaXRlbVwiO1NrLmFzdG5vZGVzLndpdGhpdGVtLnByb3RvdHlwZS5fZmllbGRzPVtcImNvbnRleHRfZXhwclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbnRleHRfZXhwcn0sXCJvcHRpb25hbF92YXJzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B0aW9uYWxfdmFyc31dO1NrLmV4cG9ydFN5bWJvbChcIlNrLmFzdG5vZGVzXCIsU2suYXN0bm9kZXMpfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMuY19lbmNvZGluZz1hO3RoaXMuY19maWxlbmFtZT1iO3RoaXMuY19mbGFncz1cbmN8fDB9ZnVuY3Rpb24gYyhhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwibm9kZSBtdXN0IGJlIGRlZmluZWRcIik7cmV0dXJuIG51bGw9PT1hLmNoaWxkcmVuPzA6YS5jaGlsZHJlbi5sZW5ndGh9ZnVuY3Rpb24gYihhLGIpe1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJub2RlIG11c3QgYmUgZGVmaW5lZFwiKTtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1iLFwiaW5kZXggb2YgY2hpbGQgbXVzdCBiZSBzcGVjaWZpZWRcIik7cmV0dXJuIGEuY2hpbGRyZW5bYl19ZnVuY3Rpb24gZShhLGIpe1NrLmFzc2VydHMuYXNzZXJ0KGEudHlwZT09PWIsXCJub2RlIHdhc24ndCBleHBlY3RlZCB0eXBlXCIpfWZ1bmN0aW9uIGYoYSxiLGMpe3Rocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKGMsYS5jX2ZpbGVuYW1lLGIubGluZW5vKTt9ZnVuY3Rpb24gbChhKXtTay5hc3NlcnRzLmFzc2VydChcInN0cmluZ1wiPT09dHlwZW9mIGEsXCJleHBlY3Rpbmcgc3RyaW5nLCBnb3QgXCIrdHlwZW9mIGEpO1xucmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBoKGEpe3ZhciBkLGU7c3dpdGNoKGEudHlwZSl7Y2FzZSByLnNpbmdsZV9pbnB1dDppZihiKGEsMCkudHlwZT09PXouVF9ORVdMSU5FKWJyZWFrO2Vsc2UgcmV0dXJuIGgoYihhLDApKTtjYXNlIHIuZmlsZV9pbnB1dDpmb3IoZD1lPTA7ZDxjKGEpOysrZCl7dmFyIGY9YihhLGQpO2YudHlwZT09PXIuc3RtdCYmKGUrPWgoZikpfXJldHVybiBlO2Nhc2Ugci5zdG10OnJldHVybiBoKGIoYSwwKSk7Y2FzZSByLmNvbXBvdW5kX3N0bXQ6cmV0dXJuIDE7Y2FzZSByLnNpbXBsZV9zdG10OnJldHVybiBNYXRoLmZsb29yKGMoYSkvMik7Y2FzZSByLnN1aXRlOmlmKDE9PT1jKGEpKXJldHVybiBoKGIoYSwwKSk7ZT0wO2ZvcihkPTI7ZDxjKGEpLTE7KytkKWUrPWgoYihhLGQpKTtyZXR1cm4gZTtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcIk5vbi1zdGF0ZW1lbnQgZm91bmRcIil9cmV0dXJuIDB9ZnVuY3Rpb24gZChhLGIsYyxkKXtjIGluc3RhbmNlb2ZcblNrLmJ1aWx0aW4uc3RyJiYoYz1jLnYpO2lmKFwiTm9uZVwiPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFzc2lnbm1lbnQgdG8gTm9uZVwiLGEuY19maWxlbmFtZSxkKTtpZihcIlRydWVcIj09PWN8fFwiRmFsc2VcIj09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIFRydWUgb3IgRmFsc2UgaXMgZm9yYmlkZGVuXCIsYS5jX2ZpbGVuYW1lLGQpO31mdW5jdGlvbiBnKGEsYixjLGUpe3ZhciBmO1NrLmFzc2VydHMuYXNzZXJ0KGMhPT1Tay5hc3Rub2Rlcy5BdWdTdG9yZSYmYyE9PVNrLmFzdG5vZGVzLkF1Z0xvYWQsXCJjb250ZXh0IG5vdCBBdWdTdG9yZSBvciBBdWdMb2FkXCIpO3ZhciBoPWY9bnVsbDtzd2l0Y2goYi5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5BdHRyaWJ1dGU6Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOmM9PT1Tay5hc3Rub2Rlcy5TdG9yZSYmZChhLGUsYi5hdHRyLGUubGluZW5vKTtiLmN0eD1jO2JyZWFrO1xuY2FzZSBTay5hc3Rub2Rlcy5TdGFycmVkOmIuY3R4PWM7ZyhhLGIudmFsdWUsYyxlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDpiLmN0eD1jO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDpiLmN0eD1jO2Y9Yi5lbHRzO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuVHVwbGU6aWYoMD09PWIuZWx0cy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJjYW4ndCBhc3NpZ24gdG8gKClcIixhLmNfZmlsZW5hbWUsZS5saW5lbm8pO2IuY3R4PWM7Zj1iLmVsdHM7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MYW1iZGE6aD1cImxhbWJkYVwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ2FsbDpoPVwiZnVuY3Rpb24gY2FsbFwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQm9vbE9wOmNhc2UgU2suYXN0bm9kZXMuQmluT3A6Y2FzZSBTay5hc3Rub2Rlcy5VbmFyeU9wOmg9XCJvcGVyYXRvclwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwOmg9XCJnZW5lcmF0b3IgZXhwcmVzc2lvblwiO1xuYnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5ZaWVsZDpoPVwieWllbGQgZXhwcmVzc2lvblwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdENvbXA6aD1cImxpc3QgY29tcHJlaGVuc2lvblwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU2V0Q29tcDpoPVwic2V0IGNvbXByZWhlbnNpb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3RDb21wOmg9XCJkaWN0IGNvbXByZWhlbnNpb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3Q6Y2FzZSBTay5hc3Rub2Rlcy5TZXQ6Y2FzZSBTay5hc3Rub2Rlcy5OdW06Y2FzZSBTay5hc3Rub2Rlcy5TdHI6aD1cImxpdGVyYWxcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudDpoPVwiVHJ1ZSwgRmFsc2Ugb3IgTm9uZVwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ29tcGFyZTpoPVwiY29tcGFyaXNvblwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmVwcjpoPVwicmVwclwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuSWZFeHA6aD1cImNvbmRpdGlvbmFsIGV4cHJlc3Npb25cIjtcbmJyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGV4cHJlc3Npb24gaW4gYXNzaWdubWVudFwiKX1pZihoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgXCIrKGM9PT1Tay5hc3Rub2Rlcy5TdG9yZT9cImFzc2lnbiB0b1wiOlwiZGVsZXRlXCIpK1wiIFwiK2gsYS5jX2ZpbGVuYW1lLGUubGluZW5vKTtpZihmKWZvcihiPTA7YjxmLmxlbmd0aDsrK2IpZyhhLGZbYl0sYyxlKX1mdW5jdGlvbiBuKGEpe2lmKHZvaWQgMD09PU9bYS50eXBlXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImludmFsaWQgc3ludGF4XCIsYS50eXBlLGEubGluZW5vKTtyZXR1cm4gT1thLnR5cGVdfWZ1bmN0aW9uIGsoYSxiKXtyZXR1cm4gYS52YWx1ZT9uZXcgU2suYnVpbHRpbi5zdHIoYS52YWx1ZSk6bmV3IFNrLmJ1aWx0aW4uc3RyKGEpfWZ1bmN0aW9uIHAoYSxkKXtlKGQsci5jb21wX29wKTtpZigxPT09YyhkKSlzd2l0Y2goZD1iKGQsMCksZC50eXBlKXtjYXNlIHouVF9MRVNTOnJldHVybiBTay5hc3Rub2Rlcy5MdDtcbmNhc2Ugei5UX0dSRUFURVI6cmV0dXJuIFNrLmFzdG5vZGVzLkd0O2Nhc2Ugei5UX0VRRVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLkVxO2Nhc2Ugei5UX0xFU1NFUVVBTDpyZXR1cm4gU2suYXN0bm9kZXMuTHRFO2Nhc2Ugei5UX0dSRUFURVJFUVVBTDpyZXR1cm4gU2suYXN0bm9kZXMuR3RFO2Nhc2Ugei5UX05PVEVRVUFMOnJldHVybiBTay5hc3Rub2Rlcy5Ob3RFcTtjYXNlIHouVF9OQU1FOmlmKFwiaW5cIj09PWQudmFsdWUpcmV0dXJuIFNrLmFzdG5vZGVzLkluO2lmKFwiaXNcIj09PWQudmFsdWUpcmV0dXJuIFNrLmFzdG5vZGVzLklzfWVsc2UgaWYoMj09PWMoZCkmJmIoZCwwKS50eXBlPT09ei5UX05BTUUpe2lmKFwiaW5cIj09PWIoZCwxKS52YWx1ZSlyZXR1cm4gU2suYXN0bm9kZXMuTm90SW47aWYoXCJpc1wiPT09YihkLDApLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5Jc05vdH1Tay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIGNvbXBfb3BcIil9ZnVuY3Rpb24gdShhLGIpe2EmJihhLmxpbmVubz1cbmIubGluZW5vLGEuY29sX29mZnNldD1iLmNvbF9vZmZzZXQsYS5lbmRfbGluZW5vPWIuZW5kX2xpbmVubyxhLmVuZF9jb2xfb2Zmc2V0PWIuZW5kX2NvbF9vZmZzZXQpO3JldHVybiBhfWZ1bmN0aW9uIEEoYSxkKXt2YXIgZSxmPVtdO1NrLmFzc2VydHMuYXNzZXJ0KGQudHlwZT09PXIudGVzdGxpc3R8fGQudHlwZT09PXIudGVzdGxpc3Rfc3Rhcl9leHByfHxkLnR5cGU9PT1yLmxpc3RtYWtlcnx8ZC50eXBlPT09ci50ZXN0bGlzdF9jb21wfHxkLnR5cGU9PT1yLnRlc3RsaXN0X3NhZmV8fGQudHlwZT09PXIudGVzdGxpc3QxLFwibm9kZSB0eXBlIG11c3QgYmUgbGlzdGxpa2VcIik7Zm9yKGU9MDtlPGMoZCk7ZSs9MilTay5hc3NlcnRzLmFzc2VydChiKGQsZSkudHlwZT09PXIudGVzdHx8YihkLGUpLnR5cGU9PT1yLm9sZF90ZXN0fHxiKGQsZSkudHlwZT09PXIuc3Rhcl9leHByKSxmW2UvMl09dyhhLGIoZCxlKSk7cmV0dXJuIGZ9ZnVuY3Rpb24gdChhLGQpe3ZhciBmO2UoZCxyLnN1aXRlKTtcbnZhciBnPVtdO3ZhciBrPTA7aWYoYihkLDApLnR5cGU9PT1yLnNpbXBsZV9zdG10KXtkPWIoZCwwKTt2YXIgeD1jKGQpLTE7YihkLHgtMSkudHlwZT09PXouVF9TRU1JJiYtLXg7Zm9yKGY9MDtmPHg7Zis9MilnW2srK109TihhLGIoZCxmKSl9ZWxzZSBmb3IoZj0yO2Y8YyhkKS0xOysrZil7eD1iKGQsZik7ZSh4LHIuc3RtdCk7dmFyIG49aCh4KTtpZigxPT09bilnW2srK109TihhLHgpO2Vsc2UgZm9yKHg9Yih4LDApLGUoeCxyLnNpbXBsZV9zdG10KSxuPTA7bjxjKHgpO24rPTIpe2lmKDA9PT1jKGIoeCxuKSkpe1NrLmFzc2VydHMuYXNzZXJ0KG4rMT09PWMoeCkpO2JyZWFrfWdbaysrXT1OKGEsYih4LG4pKX19U2suYXNzZXJ0cy5hc3NlcnQoaz09PWgoZCkpO3JldHVybiBnfWZ1bmN0aW9uIHYoYSxkLGYpe3ZhciBoO2UoZCxyLmV4cHJsaXN0KTt2YXIgaz1bXTtmb3IoaD0wO2g8YyhkKTtoKz0yKXt2YXIgeD13KGEsYihkLGgpKTtrW2gvMl09eDtmJiZnKGEseCxmLGIoZCxoKSl9cmV0dXJuIGt9XG5mdW5jdGlvbiBCKGEsZCl7YTpmb3IoOzspc3dpdGNoKGQudHlwZSl7Y2FzZSByLmltcG9ydF9hc19uYW1lOmE9bnVsbDt2YXIgZT1sKGIoZCwwKS52YWx1ZSk7Mz09PWMoZCkmJihhPWIoZCwyKS52YWx1ZSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hbGlhcyhlLG51bGw9PWE/bnVsbDpsKGEpKTtjYXNlIHIuZG90dGVkX2FzX25hbWU6aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9ZWxzZSByZXR1cm4gYT1CKGEsYihkLDApKSxTay5hc3NlcnRzLmFzc2VydCghYS5hc25hbWUpLGEuYXNuYW1lPWwoYihkLDIpLnZhbHVlKSxhO2Nhc2Ugci5kb3R0ZWRfbmFtZTppZigxPT09YyhkKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLmFsaWFzKGwoYihkLDApLnZhbHVlKSxudWxsKTthPVwiXCI7Zm9yKGU9MDtlPGMoZCk7ZSs9MilhKz1iKGQsZSkudmFsdWUrXCIuXCI7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hbGlhcyhsKGEuc3Vic3RyKDAsYS5sZW5ndGgtMSkpLG51bGwpO2Nhc2Ugei5UX1NUQVI6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hbGlhcyhsKFwiKlwiKSxcbm51bGwpO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ1bmV4cGVjdGVkIGltcG9ydCBuYW1lXCIsYS5jX2ZpbGVuYW1lLGQubGluZW5vKTt9fWZ1bmN0aW9uIEQoYSxiKXtTay5hc3NlcnRzLmFzc2VydChiLnR5cGU9PXIudGVzdGxpc3RfY29tcHx8Yi50eXBlPT1yLmFyZ3VtZW50KTtyZXR1cm4gYWEoYSxiLDApfWZ1bmN0aW9uIEUoYSxkKXtpZihiKGQsMCkudHlwZT09PXouVF9NSU5VUyYmMj09PWMoZCkpe3ZhciBlPWIoZCwxKTtpZihlLnR5cGU9PT1yLmZhY3RvciYmMT09PWMoZSkmJihlPWIoZSwwKSxlLnR5cGU9PT1yLnBvd2VyJiYxPT09YyhlKSkpe3ZhciBmPWIoZSwwKTtpZihmLnR5cGU9PT1yLmF0b20mJihlPWIoZiwwKSxlLnR5cGU9PT16LlRfTlVNQkVSKSlyZXR1cm4gZS52YWx1ZT1cIi1cIitlLnZhbHVlLFIoYSxmKX19YT13KGEsYihkLDEpKTtzd2l0Y2goYihkLDApLnR5cGUpe2Nhc2Ugei5UX1BMVVM6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5VbmFyeU9wKFNrLmFzdG5vZGVzLlVBZGQsXG5hLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSB6LlRfTUlOVVM6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5VbmFyeU9wKFNrLmFzdG5vZGVzLlVTdWIsYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX1RJTERFOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5JbnZlcnQsYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpfVNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBmYWN0b3JcIil9ZnVuY3Rpb24gRihhLGcsaCxrKXt2YXIgeCxuLGw7ZShnLHIuYXJnbGlzdCk7Zm9yKHg9bD1uPTA7eDxjKGcpO3grKyl7dmFyIHA9YihnLHgpO3AudHlwZT09ci5hcmd1bWVudCYmKDE9PWMocCk/bisrOmIocCwxKS50eXBlPT1yLmNvbXBfZm9yPyhuKyssa3x8ZihhLHAsXCJpbnZhbGlkIHN5bnRheFwiKSwxPGMoZykmJmYoYSxwLFwiR2VuZXJhdG9yIGV4cHJlc3Npb24gbXVzdCBiZSBwYXJlbnRoZXNpemVkXCIpKTpiKHAsMCkudHlwZT09ei5UX1NUQVI/bisrOmwrKyl9dmFyIFM9XG5bXTt2YXIgbT1bXTtmb3IoeD1rPWw9bj0wO3g8YyhnKTt4KyspaWYocD1iKGcseCkscC50eXBlPT1yLmFyZ3VtZW50KXt2YXIgSj1iKHAsMCk7aWYoMT09YyhwKSl7bCYmKGs/ZihhLEosXCJwb3NpdGlvbmFsIGFyZ3VtZW50IGZvbGxvd3Mga2V5d29yZCBhcmd1bWVudCB1bnBhY2tpbmdcIik6ZihhLEosXCJwb3NpdGlvbmFsIGFyZ3VtZW50IGZvbGxvd3Mga2V5d29yZCBhcmd1bWVudFwiKSk7dmFyIEs9dyhhLEopO2lmKCFLKXJldHVybiBudWxsO1NbbisrXT1LfWVsc2UgaWYoSi50eXBlPT16LlRfU1RBUil7aWYoaylyZXR1cm4gZihhLEosXCJpdGVyYWJsZSBhcmd1bWVudCB1bnBhY2tpbmcgZm9sbG93cyBrZXl3b3JkIGFyZ3VtZW50IHVucGFja2luZ1wiKSxudWxsO0s9dyhhLGIocCwxKSk7aWYoIUspcmV0dXJuIG51bGw7cD1uZXcgU2suYXN0bm9kZXMuU3RhcnJlZChLLFNrLmFzdG5vZGVzLkxvYWQsSi5saW5lbm8sSi5jb2xfb2Zmc2V0KTtTW24rK109cH1lbHNlIGlmKEoudHlwZT09ei5UX0RPVUJMRVNUQVIpe3grKztcbks9dyhhLGIocCwxKSk7aWYoIUspcmV0dXJuIG51bGw7cD1uZXcgU2suYXN0bm9kZXMua2V5d29yZChudWxsLEspO21bbCsrXT1wO2srK31lbHNlIGlmKGIocCwxKS50eXBlPT1yLmNvbXBfZm9yKXtLPUQoYSxwKTtpZighSylyZXR1cm4gbnVsbDtTW24rK109S31lbHNle3ZhciB1O0s9dyhhLEopO2lmKCFLKXJldHVybiBudWxsO2lmKEsuY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5MYW1iZGEpcmV0dXJuIGYoYSxKLFwibGFtYmRhIGNhbm5vdCBjb250YWluIGFzc2lnbm1lbnRcIiksbnVsbDtpZihLLmNvbnN0cnVjdG9yIT09U2suYXN0bm9kZXMuTmFtZSlyZXR1cm4gZihhLEosXCJrZXl3b3JkIGNhbid0IGJlIGFuIGV4cHJlc3Npb25cIiksbnVsbDtpZihkKGEsSy5pZCxwLDEpKXJldHVybiBudWxsO3ZhciBBPUsuaWQ7Zm9yKHU9MDt1PGw7dSsrKWlmKChLPW1bdV0uYXJnKSYmSz09PUEpcmV0dXJuIGYoYSxKLFwia2V5d29yZCBhcmd1bWVudCByZXBlYXRlZFwiKSxudWxsO0s9dyhhLGIocCxcbjIpKTtpZighSylyZXR1cm4gbnVsbDtwPW5ldyBTay5hc3Rub2Rlcy5rZXl3b3JkKEEsSyk7bVtsKytdPXB9fXJldHVybiBuZXcgU2suYXN0bm9kZXMuQ2FsbChoLFMsbSxoLmxpbmVubyxoLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIE0oYSxkLGYpe2UoZCxyLnRyYWlsZXIpO2lmKGIoZCwwKS50eXBlPT16LlRfTFBBUilyZXR1cm4gMj09YyhkKT9uZXcgU2suYXN0bm9kZXMuQ2FsbChmLG51bGwsbnVsbCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOkYoYSxiKGQsMSksZiwhMCk7aWYoYihkLDApLnR5cGU9PXouVF9ET1Qpe3ZhciBnPWsoYihkLDEpKTtyZXR1cm4gZz9uZXcgU2suYXN0bm9kZXMuQXR0cmlidXRlKGYsZyxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk6bnVsbH1lKGIoZCwwKSx6LlRfTFNRQik7ZShiKGQsMiksei5UX1JTUUIpO2Q9YihkLDEpO2lmKDE9PWMoZCkpcmV0dXJuKGc9SShhLGIoZCwwKSkpP25ldyBTay5hc3Rub2Rlcy5TdWJzY3JpcHQoZixnLFxuU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOm51bGw7dmFyIGgsbj0xLHg9W107Zm9yKGg9MDtoPGMoZCk7aCs9Mil7Zz1JKGEsYihkLGgpKTtpZighZylyZXR1cm4gbnVsbDtnLmtpbmQhPVouSW5kZXhfa2luZCYmKG49MCk7eFtoLzJdPWd9aWYoIW4pcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5TdWJzY3JpcHQoZixuZXcgU2suYXN0bm9kZXMuRXh0U2xpY2UoeCksU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2E9W107Zm9yKGg9MDtoPHgubGVuZ3RoOysraClnPXhbaF0sU2suYXNzZXJ0cy5hc3NlcnQoZy5raW5kPT1aLkluZGV4X2tpbmQmJmcudi5JbmRleC52YWx1ZSksYVtoXT1nLnYuSW5kZXgudmFsdWU7Zz1uZXcgU2suYXN0bm9kZXMuVHVwbGUoYSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5TdWJzY3JpcHQoZixuZXcgU2suYXN0bm9kZXMuSW5kZXgoZyksU2suYXN0bm9kZXMuTG9hZCxcbmQubGluZW5vLGQuY29sX29mZnNldCl9ZnVuY3Rpb24gVihhLGQpe2UoZCxyLmZsb3dfc3RtdCk7dmFyIGc9YihkLDApO3N3aXRjaChnLnR5cGUpe2Nhc2Ugci5icmVha19zdG10OnJldHVybiBuZXcgU2suYXN0bm9kZXMuQnJlYWsoZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtjYXNlIHIuY29udGludWVfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNvbnRpbnVlKGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7Y2FzZSByLnlpZWxkX3N0bXQ6cmV0dXJuKGE9dyhhLGIoZywwKSkpP25ldyBTay5hc3Rub2Rlcy5FeHByKGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpudWxsO2Nhc2Ugci5yZXR1cm5fc3RtdDppZigxPT1jKGcpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuUmV0dXJuKG51bGwsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxcbmQuZW5kX2NvbF9vZmZzZXQpO3ZhciBoPVcoYSxiKGcsMSkpO3JldHVybiBoP25ldyBTay5hc3Rub2Rlcy5SZXR1cm4oaCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOm51bGw7Y2FzZSByLnJhaXNlX3N0bXQ6aWYoMT09YyhnKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlJhaXNlKG51bGwsbnVsbCxudWxsLG51bGwsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtpZigyPD1jKGcpKXt2YXIgaz1udWxsO2g9dyhhLGIoZywxKSk7dmFyIG49bnVsbCx4PW51bGw7ND09YyhnKSYmXCJmcm9tXCI9PWIoZywyKS52YWx1ZT8oU2suX19mdXR1cmVfXy5weXRob24zfHxmKGEsYihnLDIpLFwicmFpc2UgLi4uIGZyb20gLi4uIGlzIG5vdCBhdmFpbGFibGUgaW4gUHl0aG9uIDJcIiksaz13KGEsYihnLDMpKSk6NDw9YyhnKSYmXCIsXCI9PWIoZywyKS52YWx1ZSYmKFNrLl9fZnV0dXJlX18ucHl0aG9uMyYmZihhLFxuZCxcIk9sZCByYWlzZSBzeW50YXggaXMgbm90IGF2YWlsYWJsZSBpbiBQeXRob24gM1wiKSxuPXcoYSxiKGcsMykpLDY9PWMoZykmJih4PXcoYSxiKGcsNSkpKSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5SYWlzZShoLGssbix4LGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCl9ZGVmYXVsdDpyZXR1cm4gU2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCBmbG93X3N0bXQ6IFwiLGcudHlwZSksbnVsbH19ZnVuY3Rpb24geShhLGUpe3ZhciBmPW51bGw7U2suYXNzZXJ0cy5hc3NlcnQoZS50eXBlPT09ci50ZnBkZWZ8fGUudHlwZT09PXIudmZwZGVmKTt2YXIgZz1iKGUsMCk7ZChhLGcsZy52YWx1ZSxnLmxpbmVubyk7Zz1sKGcudmFsdWUpOzM9PWMoZSkmJmIoZSwxKS50eXBlPT09ei5UX0NPTE9OJiYoZj13KGEsYihlLDIpKSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hcmcoZyxmLGUubGluZW5vLGUuY29sX29mZnNldCl9ZnVuY3Rpb24gRyhhLFxuZSxnLGgsayl7dmFyIG49Zyx4PTA7aHx8ZihhLGIoZSxnKSxcIm5hbWVkIGFyZ3VtZW50cyBtdXN0IGZvbGxvdyBiYXJlICpcIik7Zm9yKFNrLmFzc2VydHMuYXNzZXJ0KGspO248YyhlKTspe3ZhciBwPWIoZSxuKTtzd2l0Y2gocC50eXBlKXtjYXNlIHIudmZwZGVmOmNhc2Ugci50ZnBkZWY6bisxPGMoZSkmJmIoZSxuKzEpLnR5cGU9PXouVF9FUVVBTD8oa1t4XT13KGEsYihlLG4rMikpLG4rPTIpOmtbeF09bnVsbDt2YXIgbT0zPT1jKHApP3coYSxiKHAsMikpOm51bGw7cD1iKHAsMCk7ZChhLHAscC52YWx1ZSxwLmxpbmVubyk7Zz1sKHAudmFsdWUpO2hbeCsrXT1uZXcgU2suYXN0bm9kZXMuYXJnKGcsbSxwLmxpbmVubyxwLmNvbF9vZmZzZXQpO24rPTI7YnJlYWs7Y2FzZSB6LlRfRE9VQkxFU1RBUjpyZXR1cm4gbjtkZWZhdWx0OmYoYSxwLFwidW5leHBlY3RlZCBub2RlXCIpfX1yZXR1cm4gbn1mdW5jdGlvbiBMKGEsZCl7dmFyIGUsZixnLGg9W10saz1bXSxuPVtdLHg9W10sbD1udWxsLFxucD1udWxsO2lmKGQudHlwZT09PXIucGFyYW1ldGVycyl7aWYoMj09PWMoZCkpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hcmd1bWVudHNfKFtdLG51bGwsW10sW10sbnVsbCxbXSk7ZD1iKGQsMSl9U2suYXNzZXJ0cy5hc3NlcnQoZC50eXBlPT09ci52YXJhcmdzbGlzdHx8ZC50eXBlPT09ci50eXBlZGFyZ3NsaXN0KTtmb3IoZT1mPWc9MDtnPGMoZCk7KXt2YXIgbT1iKGQsZyk7c3dpdGNoKG0udHlwZSl7Y2FzZSByLnRmcGRlZjpjYXNlIHIudmZwZGVmOmlmKGcrMTxjKGQpJiZiKGQsZysxKS50eXBlPT16LlRfRVFVQUwpe2tbZisrXT13KGEsYihkLGcrMikpO2crPTI7dmFyIEo9MX1lbHNlIGlmKEopdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJub24tZGVmYXVsdCBhcmd1bWVudCBmb2xsb3dzIGRlZmF1bHQgYXJndW1lbnRcIixhLmNfZmlsZW5hbWUsZC5saW5lbm8pO2hbZSsrXT15KGEsbSk7Zys9MjticmVhaztjYXNlIHouVF9TVEFSOmlmKGcrMT49YyhkKXx8ZysyPT1cbmMoZCkmJmIoZCxnKzEpLnR5cGU9PXouVF9DT01NQSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm5hbWVkIGFyZ3VtZW50cyBtdXN0IGZvbGxvdyBiYXJlICpcIixhLmNfZmlsZW5hbWUsZC5saW5lbm8pO209YihkLGcrMSk7bS50eXBlPT16LlRfQ09NTUE/KGcrPTIsZz1HKGEsZCxnLG4seCkpOihsPXkoYSxtKSxnKz0zLGc8YyhkKSYmKGIoZCxnKS50eXBlPT1yLnRmcGRlZnx8YihkLGcpLnR5cGU9PXIudmZwZGVmKSYmKGc9RyhhLGQsZyxuLHgpKSk7YnJlYWs7Y2FzZSB6LlRfRE9VQkxFU1RBUjptPWIoZCxnKzEpO1NrLmFzc2VydHMuYXNzZXJ0KG0udHlwZT09ci50ZnBkZWZ8fG0udHlwZT09ci52ZnBkZWYpO3A9eShhLG0pO2crPTM7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmV4cGVjdGVkIG5vZGUgaW4gdmFyYXJnc2xpc3RcIik7cmV0dXJufX1yZXR1cm4gbmV3IFNrLmFzdG5vZGVzLmFyZ3VtZW50c18oaCxsLG4seCxwLGspfWZ1bmN0aW9uIFQoYSxcbmcsaCxuKXt2YXIgeD1uP2IoZywxKTpnLGw9bnVsbCxwPTEsbT1udWxsO2lmKG4mJjU+YS5jX2ZlYXR1cmVfdmVyc2lvbilyZXR1cm4gZihhLHgsXCJBc3luYyBmdW5jdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIFB5dGhvbiAzLjUgYW5kIGdyZWF0ZXJcIiksbnVsbDtlKHgsci5mdW5jZGVmKTt2YXIgUz1rKGIoeCxwKSk7aWYoZChhLFMsYih4LHApLDApKXJldHVybiBudWxsO3ZhciBKPUwoYSxiKHgscCsxKSk7aWYoIUopcmV0dXJuIG51bGw7aWYoYih4LHArMikudHlwZT09ei5UX1JBUlJPVyl7bD13KGEsYih4LHArMykpO2lmKCFsKXJldHVybiBudWxsO3ArPTJ9aWYoYih4LHArMykudHlwZT09ei5UX1RZUEVfQ09NTUVOVCl7bT16LlRfTkVXX1RZUEVfQ09NTUVOVChiKHgscCszKSk7aWYoIW0pcmV0dXJuIG51bGw7cCs9MX12YXIgSz10KGEsYih4LHArMykpO2lmKCFLKXJldHVybiBudWxsO2lmKDE8YyhiKHgscCszKSkmJihwPWIoYih4LHArMyksMSkscC50eXBlPT16LlRfVFlQRV9DT01NRU5UKSl7aWYobnVsbCE9XG5tKXJldHVybiBmKGEseCxcIkNhbm5vdCBoYXZlIHR3byB0eXBlIGNvbW1lbnRzIG9uIGRlZlwiKSxudWxsO209ei5UX05FV19UWVBFX0NPTU1FTlQocCk7aWYoIW0pcmV0dXJuIG51bGx9cmV0dXJuIG4/bmV3IFNrLmFzdG5vZGVzLkFzeW5jRnVuY3Rpb25EZWYoUyxKLEssaCxsLG0sZy5saW5lbm8sZy5jb2xfb2Zmc2V0LHZvaWQgMCx2b2lkIDApOm5ldyBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZihTLEosSyxoLGwsbSx4LmxpbmVubyx4LmNvbF9vZmZzZXQsdm9pZCAwLHZvaWQgMCl9ZnVuY3Rpb24gUChhLGYsZyl7ZShmLHIuY2xhc3NkZWYpO2lmKDQ9PWMoZikpe3ZhciBoPXQoYSxiKGYsMykpO3ZhciBuPWsoYihmLDEpLnZhbHVlKTtkKGEsYihmLDMpLG4sZi5saW5lbm8pO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQ2xhc3NEZWYobixbXSxbXSxoLGcsbnVsbCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWlmKGIoZiwzKS50eXBlPT09ei5UX1JQQVIpcmV0dXJuIGg9dChhLGIoZiw1KSksbj1cbmsoYihmLDEpLnZhbHVlKSxkKGEsYihmLDMpLG4sYihmLDMpLmxpbmVubyksbmV3IFNrLmFzdG5vZGVzLkNsYXNzRGVmKG4sW10sW10saCxnLG51bGwsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtuPWsoYihmLDEpKTtuPW5ldyBTay5hc3Rub2Rlcy5OYW1lKG4sU2suYXN0bm9kZXMuTG9hZCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpO3ZhciBsPUYoYSxiKGYsMyksbiwhMSk7aD10KGEsYihmLDYpKTtuPWsoYihmLDEpLnZhbHVlKTtkKGEsYihmLDEpLG4sYihmLDEpLmxpbmVubyk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5DbGFzc0RlZihuLGwuYXJncyxsLmtleXdvcmRzLGgsZyxudWxsLGYubGluZW5vLGYuY29sX29mZnNldCl9ZnVuY3Rpb24gUShhLGQpe2Z1bmN0aW9uIGYoYSxkKXtmb3IoYT0wOzspe2UoZCxyLmNvbXBfaXRlcik7aWYoYihkLDApLnR5cGU9PT1yLmNvbXBfZm9yKXJldHVybiBhO2Q9YihkLDApO2UoZCxyLmNvbXBfaWYpO2ErKztpZigyPT09YyhkKSlyZXR1cm4gYTtkPVxuYihkLDIpfX12YXIgZzt2YXIgaD1mdW5jdGlvbihhLGQpe2E9MDthOmZvcig7Oyl7YSsrO2UoZCxyLmNvbXBfZm9yKTtpZig1PT09YyhkKSlkPWIoZCw0KTtlbHNlIHJldHVybiBhO2I6Zm9yKDs7KXtlKGQsci5jb21wX2l0ZXIpO2Q9YihkLDApO2lmKGQudHlwZT09PXIuY29tcF9mb3IpY29udGludWUgYTtlbHNlIGlmKGQudHlwZT09PXIuY29tcF9pZilpZigzPT09YyhkKSl7ZD1iKGQsMik7Y29udGludWUgYn1lbHNlIHJldHVybiBhO2JyZWFrfWJyZWFrfVNrLmFzc2VydHMuZmFpbChcImxvZ2ljIGVycm9yIGluIGNvdW50Q29tcEZvcnNcIil9KGEsZCk7dmFyIGs9W107Zm9yKGc9MDtnPGg7KytnKXtlKGQsci5jb21wX2Zvcik7dmFyIG49YihkLDEpO3ZhciBsPXYoYSxuLFNrLmFzdG5vZGVzLlN0b3JlKTt2YXIgcD13KGEsYihkLDMpKTt2YXIgeD0xPT09YyhuKT9uZXcgU2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbihsWzBdLHAsW10pOm5ldyBTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uKG5ldyBTay5hc3Rub2Rlcy5UdXBsZShsLFxuU2suYXN0bm9kZXMuU3RvcmUsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KSxwLFtdKTtpZig1PT09YyhkKSl7ZD1iKGQsNCk7dmFyIG09ZihhLGQpO249W107Zm9yKGw9MDtsPG07KytsKWUoZCxyLmNvbXBfaXRlciksZD1iKGQsMCksZShkLHIuY29tcF9pZikscD13KGEsYihkLDEpKSxuW2xdPXAsMz09PWMoZCkmJihkPWIoZCwyKSk7ZC50eXBlPT09ci5jb21wX2l0ZXImJihkPWIoZCwwKSk7eC5pZnM9bn1rW2ddPXh9cmV0dXJuIGt9ZnVuY3Rpb24gVShhLGQpe3ZhciBmPVtdO2E6e3ZhciBnPWQ7dmFyIGg9MDtiOmZvcig7Oyl7dmFyIGs9MDtoKys7ZShnLHIuY29tcF9mb3IpO2IoZywwKS50eXBlPT16LlRfQVNZTkMmJihrPTEpO2lmKGMoZyk9PTUraylnPWIoZyw0K2spO2Vsc2UgYnJlYWsgYTtjOmZvcig7Oyl7ZShnLHIuY29tcF9pdGVyKTtnPWIoZywwKTtpZihnLnR5cGU9PT1yLmNvbXBfZm9yKWNvbnRpbnVlIGI7ZWxzZSBpZihnLnR5cGU9PT1yLmNvbXBfaWYpaWYoMz09PWMoZykpe2c9XG5iKGcsMik7Y29udGludWUgY31lbHNlIGJyZWFrIGE7YnJlYWt9YnJlYWt9aD12b2lkIDB9Zm9yKGc9MDtnPGg7ZysrKXt2YXIgbj0wO2IoZCwwKS50eXBlPT16LlRfQVNZTkMmJihuPTEpO3ZhciBsPWIoZCwxK24pO3ZhciBwPXYoYSxsLFNrLmFzdG5vZGVzLlN0b3JlKTtpZighcClyZXR1cm4gbnVsbDtrPXcoYSxiKGQsMytuKSk7aWYoIWspcmV0dXJuIG51bGw7dmFyIHg9cFswXTtwPTE9PWMobCk/bmV3IFNrLmFzdG5vZGVzLmNvbXByZWhlbnNpb24oeCxrLG51bGwsbik6bmV3IFNrLmFzdG5vZGVzLmNvbXByZWhlbnNpb24obmV3IFNrLmFzdG5vZGVzLlR1cGxlKHAsU2suYXN0bm9kZXMuU3RvcmUseC5saW5lbm8seC5jb2xfb2Zmc2V0LGwuZW5kX2xpbmVubyxsLmVuZF9jb2xfb2Zmc2V0KSxrLG51bGwsbik7aWYoYyhkKT09NStuKXt4PVtdO2Q9YihkLDQrbik7YTpmb3Ioaz1kLG49MDs7KXtlKGssci5jb21wX2l0ZXIpO2lmKGIoaywwKS50eXBlPT1yLmNvbXBfZm9yKXtsPW47YnJlYWsgYX1rPVxuYihrLDApO2UoayxyLmNvbXBfaWYpO24rKztpZigyPT1jKGspKXtsPW47YnJlYWsgYX1rPWIoaywyKX1pZigtMT09bClyZXR1cm4gbnVsbDtmb3Iobj0wO248bDtuKyspe2UoZCxyLmNvbXBfaXRlcik7ZD1iKGQsMCk7ZShkLHIuY29tcF9pZik7az13KGEsYihkLDEpKTtpZighaylyZXR1cm4gbnVsbDt4W25dPWs7Mz09YyhkKSYmKGQ9YihkLDIpKX1kLnR5cGU9PXIuY29tcF9pdGVyJiYoZD1iKGQsMCkpO3AuaWZzPXh9ZltnXT1wfXJldHVybiBmfWZ1bmN0aW9uIGFhKGEsZCxlKXtTay5hc3NlcnRzLmFzc2VydCgxPGMoZCkpO3ZhciBnPWIoZCwwKTt2YXIgaD13KGEsZyk7aWYoaC5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0YXJyZWQpcmV0dXJuIGYoYSxnLFwiaXRlcmFibGUgdW5wYWNraW5nIGNhbm5vdCBiZSB1c2VkIGluIGNvbXByZWhlbnNpb25cIiksbnVsbDthPVUoYSxiKGQsMSkpO3JldHVybiAwPT1lP25ldyBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHAoaCxhLGQubGluZW5vLFxuZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KToxPT1lP25ldyBTay5hc3Rub2Rlcy5MaXN0Q29tcChoLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KToyPT1lP25ldyBTay5hc3Rub2Rlcy5TZXRDb21wKGgsYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOm51bGx9ZnVuY3Rpb24gY2EoYSxjKXtlKGMsci5hdWdhc3NpZ24pO2M9YihjLDApO3N3aXRjaChjLnZhbHVlLmNoYXJBdCgwKSl7Y2FzZSBcIitcIjpyZXR1cm4gU2suYXN0bm9kZXMuQWRkO2Nhc2UgXCItXCI6cmV0dXJuIFNrLmFzdG5vZGVzLlN1YjtjYXNlIFwiL1wiOnJldHVyblwiL1wiPT09Yy52YWx1ZS5jaGFyQXQoMSk/U2suYXN0bm9kZXMuRmxvb3JEaXY6U2suYXN0bm9kZXMuRGl2O2Nhc2UgXCIlXCI6cmV0dXJuIFNrLmFzdG5vZGVzLk1vZDtjYXNlIFwiPFwiOnJldHVybiBTay5hc3Rub2Rlcy5MU2hpZnQ7Y2FzZSBcIj5cIjpyZXR1cm4gU2suYXN0bm9kZXMuUlNoaWZ0O1xuY2FzZSBcIiZcIjpyZXR1cm4gU2suYXN0bm9kZXMuQml0QW5kO2Nhc2UgXCJeXCI6cmV0dXJuIFNrLmFzdG5vZGVzLkJpdFhvcjtjYXNlIFwifFwiOnJldHVybiBTay5hc3Rub2Rlcy5CaXRPcjtjYXNlIFwiKlwiOnJldHVyblwiKlwiPT09Yy52YWx1ZS5jaGFyQXQoMSk/U2suYXN0bm9kZXMuUG93OlNrLmFzdG5vZGVzLk11bHQ7Y2FzZSBcIkBcIjppZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpcmV0dXJuIFNrLmFzdG5vZGVzLk1hdE11bHQ7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIGF1Z2Fzc2lnblwiKX19ZnVuY3Rpb24gVyhhLGQpe1NrLmFzc2VydHMuYXNzZXJ0KDA8YyhkKSk7ZC50eXBlPT09ci50ZXN0bGlzdF9jb21wPzE8YyhkKSYmU2suYXNzZXJ0cy5hc3NlcnQoYihkLDEpLnR5cGUhPT1yLmNvbXBfZm9yKTpTay5hc3NlcnRzLmFzc2VydChkLnR5cGU9PT1yLnRlc3RsaXN0fHxkLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcik7cmV0dXJuIDE9PT1jKGQpP3coYSxiKGQsMCkpOm5ldyBTay5hc3Rub2Rlcy5UdXBsZShBKGEsXG5kKSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCl9ZnVuY3Rpb24gZGEoYSxmKXtlKGYsci5leHByX3N0bXQpO2lmKDE9PT1jKGYpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuRXhwcihXKGEsYihmLDApKSxmLmxpbmVubyxmLmNvbF9vZmZzZXQpO2lmKGIoZiwxKS50eXBlPT09ci5hdWdhc3NpZ24pe3ZhciBoPWIoZiwwKTt2YXIgaz1XKGEsaCk7ZyhhLGssU2suYXN0bm9kZXMuU3RvcmUsaCk7c3dpdGNoKGsuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuTmFtZTp2YXIgbj1rLmlkO2QoYSxoLG4sZi5saW5lbm8pO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOmNhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwOnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXVnbWVudGVkIGFzc2lnbm1lbnQgdG8gZ2VuZXJhdG9yIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlXCIsYS5jX2ZpbGVuYW1lLFxuZi5saW5lbm8pO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhdWdtZW50ZWQgYXNzaWdubWVudCB0byB5aWVsZCBleHByZXNzaW9uIG5vdCBwb3NzaWJsZVwiLGEuY19maWxlbmFtZSxmLmxpbmVubyk7ZGVmYXVsdDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImlsbGVnYWwgZXhwcmVzc2lvbiBmb3IgYXVnbWVudGVkIGFzc2lnbm1lbnRcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO31oPWIoZiwyKTtuPWgudHlwZT09PXIudGVzdGxpc3Q/VyhhLGgpOncoYSxoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkF1Z0Fzc2lnbihrLGNhKGEsYihmLDEpKSxuLGYubGluZW5vLGYuY29sX29mZnNldCl9aWYoYihmLDEpLnR5cGU9PT1yLmFubmFzc2lnbil7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIkFubm90YXRlZCBhc3NpZ25tZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDJcIixcbmEuY19maWxlbmFtZSxmLmxpbmVubyk7aD1iKGYsMCk7dmFyIGw9YihmLDEpO3ZhciBwPTE7Zm9yKGs9aDsxPT1jKGspOylrPWIoaywwKTswPGMoaykmJmIoaywwKS50eXBlPT16LlRfTFBBUiYmKHA9MCk7az1XKGEsaCk7c3dpdGNoKGsuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuTmFtZTpuPWsuaWQ7ZChhLGgsbixmLmxpbmVubyk7ZyhhLGssU2suYXN0bm9kZXMuU3RvcmUsaCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5BdHRyaWJ1dGU6bj1rLmF0dHI7ZChhLGgsbixmLmxpbmVubyk7ZyhhLGssU2suYXN0bm9kZXMuU3RvcmUsaCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6ZyhhLGssU2suYXN0bm9kZXMuU3RvcmUsaCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwib25seSBzaW5nbGUgdGFyZ2V0IChub3QgbGlzdCkgY2FuIGJlIGFubm90YXRlZFwiLGEuY19maWxlbmFtZSxmLmxpbmVubyk7XG5jYXNlIFNrLmFzdG5vZGVzLlR1cGxlOnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwib25seSBzaW5nbGUgdGFyZ2V0IChub3QgdHVwbGUpIGNhbiBiZSBhbm5vdGF0ZWRcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbGxlZ2FsIHRhcmdldCBmb3IgYW5ub3RhdGlvblwiLGEuY19maWxlbmFtZSxmLmxpbmVubyk7fWsuY29uc3RydWN0b3IhPVNrLmFzdG5vZGVzLk5hbWUmJihwPTApO2g9YihsLDEpO249dyhhLGgpO2lmKDI9PWMobCkpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Bbm5Bc3NpZ24oayxuLG51bGwscCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpO2g9YihsLDMpO2E9dyhhLGgpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQW5uQXNzaWduKGssbixhLHAsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KX1lKGIoZiwxKSx6LlRfRVFVQUwpO3A9W107Zm9yKGs9MDtrPGMoZiktMjtrKz0yKXtoPWIoZixrKTtpZihoLnR5cGU9PT1cbnIueWllbGRfZXhwcil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFzc2lnbm1lbnQgdG8geWllbGQgZXhwcmVzc2lvbiBub3QgcG9zc2libGVcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO2g9VyhhLGgpO2coYSxoLFNrLmFzdG5vZGVzLlN0b3JlLGIoZixrKSk7cFtrLzJdPWh9aD1iKGYsYyhmKS0xKTthPWgudHlwZT09PXIudGVzdGxpc3Rfc3Rhcl9leHByP1coYSxoKTp3KGEsaCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Bc3NpZ24ocCxhLGYubGluZW5vLGYuY29sX29mZnNldCl9ZnVuY3Rpb24gZWEoYSxiLGMsZCxlKXtTay5hc3NlcnRzLmFzc2VydChjPj1iKTtTay5hc3NlcnRzLmFzc2VydChcIntcIj09YS5jaGFyQXQoYi0xKSk7U2suYXNzZXJ0cy5hc3NlcnQoXCJ9XCI9PWEuY2hhckF0KGMpfHxcIiFcIj09YS5jaGFyQXQoYyl8fFwiOlwiPT1hLmNoYXJBdChjKSk7YT1hLnN1YnN0cmluZyhiLGMpOy9eXFxzKiQvLnRlc3QoYSkmJmYoZCxlLFwiZi1zdHJpbmc6IGVtcHR5IGV4cHJlc3Npb24gbm90IGFsbG93ZWRcIik7XG50cnl7bGV0IGI9U2sucGFyc2UoXCI8ZnN0cmluZz5cIixcIihcIithK1wiKVwiKTt2YXIgZz1Tay5hc3RGcm9tUGFyc2UoYi5jc3QsXCI8ZnN0cmluZz5cIixiLmZsYWdzKX1jYXRjaChZKXt0aHJvdyBZLnRyYWNlYmFjayYmWS50cmFjZWJhY2tbMF0mJihnPVkudHJhY2ViYWNrWzBdLGcubGluZW5vPShnLmxpbmVub3x8MSktMStlLmxpbmVubyxnLmZpbGVuYW1lPWQuY19maWxlbmFtZSksWTt9U2suYXNzZXJ0cy5hc3NlcnQoMT09Zy5ib2R5Lmxlbmd0aCYmZy5ib2R5WzBdLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuRXhwcik7cmV0dXJuIGcuYm9keVswXS52YWx1ZX1mdW5jdGlvbiBIKGEsYixjLGQsZSxnLGgpe1NrLmFzc2VydHMuYXNzZXJ0KFwie1wiPT1hLmNoYXJBdChiKSk7YisrO3ZhciBrPWI7bGV0IG49bnVsbCxsPTAscD0wLG0seCxTPSgpPT5mKGcsaCxcImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nXCIpO2ZvcihTay5hc3NlcnRzLmFzc2VydChiPD1jKTtiPGM7YisrKXtsZXQgZD1hLmNoYXJBdChiKTtcblwiXFxcXFwiPT1kJiZmKGcsaCxcImYtc3RyaW5nIGV4cHJlc3Npb24gcGFydCBjYW5ub3QgaW5jbHVkZSBhIGJhY2tzbGFzaFwiKTtpZihuKWQ9PW4mJigzPT1sP2IrMjxjJiZhLmNoYXJBdChiKzEpPT1kJiZhLmNoYXJBdChiKzIpPT1kJiYoYis9MixuPWw9MCk6bD1uPTApO2Vsc2UgaWYoXCInXCI9PWR8fCdcIic9PWQpYisyPGMmJmEuY2hhckF0KGIrMSk9PWQmJmEuY2hhckF0KGIrMik9PWQ/KGw9MyxiKz0yKTpsPTEsbj1kO2Vsc2UgaWYoXCJbXCI9PWR8fFwie1wiPT1kfHxcIihcIj09ZClwKys7ZWxzZSBpZigwIT1wJiYoXCJdXCI9PWR8fFwifVwiPT1kfHxcIilcIj09ZCkpcC0tO2Vsc2UgaWYoXCIjXCI9PWQpZihnLGgsXCJmLXN0cmluZyBleHByZXNzaW9uIHBhcnQgY2Fubm90IGluY2x1ZGUgJyMnXCIpO2Vsc2UgaWYoISgwIT1wfHxcIiFcIiE9ZCYmXCI6XCIhPWQmJlwifVwiIT1kfHxcIiFcIj09ZCYmYisxPGMmJlwiPVwiPT1hLmNoYXJBdChiKzEpKSlicmVha31uJiZmKGcsaCxcImYtc3RyaW5nOiB1bnRlcm1pbmF0ZWQgc3RyaW5nXCIpO1xucCYmZihnLGgsXCJmLXN0cmluZzogbWlzbWF0Y2hlZCAnKCcsICd7Jywgb3IgJ1snXCIpO2s9ZWEoYSxrLGIsZyxoKTtcIiFcIj09YS5jaGFyQXQoYikmJihiKyssYj49YyYmUygpLHg9YS5jaGFyQXQoYiksYisrLFwic1wiIT14JiZcInJcIiE9eCYmXCJhXCIhPXgmJmYoZyxoLFwiZi1zdHJpbmc6IGludmFsaWQgY29udmVyc2lvbiBjaGFyYWN0ZXI6IGV4cGVjdGVkICdzJywgJ3InLCBvciAnYSdcIikpO2I+PWMmJlMoKTtcIjpcIj09YS5jaGFyQXQoYikmJihiKyssYj49YyYmUygpLFttLGJdPWJhKGEsYixjLGQsZSsxLGcsaCkpOyhiPj1jfHxcIn1cIiE9YS5jaGFyQXQoYikpJiZTKCk7YisrO3JldHVybltuZXcgU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWUoayx4LG0saC5saW5lbm8saC5jb2xfb2Zmc2V0KSxiXX1mdW5jdGlvbiBiYShhLGIsYyxkLGUsZixnKXtsZXQgaD1bXSxrPWE9PntpZigtMSE9PWEuaW5kZXhPZihcIn1cIikpe2lmKC8oXnxbXn1dKX0ofX0pKigkfFtefV0pLy50ZXN0KGEpKXRocm93IG5ldyBTeW50YXhFcnJvcihcImYtc3RyaW5nOiBzaW5nbGUgJ30nIGlzIG5vdCBhbGxvd2VkXCIsXG5nLmxpbmVubyxnLmNvbF9vZmZzZXQpO2E9YS5yZXBsYWNlKC99fS9nLFwifVwiKX1oLnB1c2gobmV3IFNrLmFzdG5vZGVzLlN0cihuZXcgU2suYnVpbHRpbi5zdHIoYSksZy5saW5lbm8sZy5jb2xfb2Zmc2V0LGYuZW5kX2xpbmVubyxnLmVuZF9jb2xfb2Zmc2V0KSl9O2Zvcig7YjxjOyl7bGV0IG49YS5pbmRleE9mKFwie1wiLGIpO2lmKDAhPT1lKXtsZXQgZD1hLmluZGV4T2YoXCJ9XCIsYik7LTEhPT1kJiYoLTE9PT1uP2M9ZDpuPmQmJihuPS0xLGM9ZCkpfWlmKC0xPT09bil7ayhhLnN1YnN0cmluZyhiLGMpKTtiPWM7YnJlYWt9ZWxzZSBpZihuKzE8YyYmXCJ7XCI9PT1hLmNoYXJBdChuKzEpKWsoYS5zdWJzdHJpbmcoYixuKzEpKSxiPW4rMjtlbHNle2soYS5zdWJzdHJpbmcoYixuKSk7Yj1uO2xldCBbbCxwXT1IKGEsbixjLGQsZSxmLGcpO2gucHVzaChsKTtiPXB9fXJldHVybltuZXcgU2suYXN0bm9kZXMuSm9pbmVkU3RyKGgsZy5saW5lbm8sZy5jb2xfb2Zmc2V0KSxiXX1mdW5jdGlvbiBYKGEsXG5iLGMpe3ZhciBkPWIuY2hhckF0KGIubGVuZ3RoLTEpO2lmKC0xIT09Yi5pbmRleE9mKFwiX1wiKSl7aWYoZmEudGVzdChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImludmFsaWQgc3ludGF4XCIsYS5jX2ZpbGVuYW1lLGMpO2lmKGhhLnRlc3QoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIGRlY2ltYWwgbGl0ZXJhbFwiLGEuY19maWxlbmFtZSxjKTtiPWIucmVwbGFjZShpYSxcIlwiKX1pZihcImpcIj09PWR8fFwiSlwiPT09ZClyZXR1cm4gU2suYnVpbHRpbi5jb21wbGV4LmNvbXBsZXhfc3VidHlwZV9mcm9tX3N0cmluZyhiKTtpZihcImxcIj09PWR8fFwiTFwiPT09ZClyZXR1cm4gU2subG9uZ0Zyb21TdHIoYi5zdWJzdHIoMCxiLmxlbmd0aC0xKSwwKTtpZigtMSE9PWIuaW5kZXhPZihcIi5cIikpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhwYXJzZUZsb2F0KGIpKTtjPWI7YT0hMTtcIi1cIj09PWIuY2hhckF0KDApJiYoYz1iLnN1YnN0cigxKSxhPVxuITApO2lmKFwiMFwiIT09Yy5jaGFyQXQoMCl8fFwieFwiIT09Yy5jaGFyQXQoMSkmJlwiWFwiIT09Yy5jaGFyQXQoMSkpe2lmKC0xIT09Yi5pbmRleE9mKFwiZVwiKXx8LTEhPT1iLmluZGV4T2YoXCJFXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8ocGFyc2VGbG9hdChiKSk7aWYoXCIwXCIhPT1jLmNoYXJBdCgwKXx8XCJiXCIhPT1jLmNoYXJBdCgxKSYmXCJCXCIhPT1jLmNoYXJBdCgxKSlpZihcIjBcIj09PWMuY2hhckF0KDApKWlmKFwiMFwiPT09YyljPTA7ZWxzZXtjPWMuc3Vic3RyaW5nKDEpO2lmKFwib1wiPT09Yy5jaGFyQXQoMCl8fFwiT1wiPT09Yy5jaGFyQXQoMCkpYz1jLnN1YnN0cmluZygxKTtjPXBhcnNlSW50KGMsOCl9ZWxzZSBjPXBhcnNlSW50KGMsMTApO2Vsc2UgYz1jLnN1YnN0cmluZygyKSxjPXBhcnNlSW50KGMsMil9ZWxzZSBjPWMuc3Vic3RyaW5nKDIpLGM9cGFyc2VJbnQoYywxNik7cmV0dXJuIGM+TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVImJk1hdGguZmxvb3IoYyk9PT1jJiYtMT09PWIuaW5kZXhPZihcImVcIikmJlxuLTE9PT1iLmluZGV4T2YoXCJFXCIpP1NrLmxvbmdGcm9tU3RyKGIsMCk6YT9uZXcgU2suYnVpbHRpbi5pbnRfKC1jKTpuZXcgU2suYnVpbHRpbi5pbnRfKGMpfWZ1bmN0aW9uIEkoYSxkKXt2YXIgZixnO2UoZCxyLnN1YnNjcmlwdCk7dmFyIGg9YihkLDApO3ZhciBrPWY9Zz1udWxsO2lmKGgudHlwZT09PXouVF9ET1QpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5FbGxpcHNpcztpZigxPT09YyhkKSYmaC50eXBlPT09ci50ZXN0KXJldHVybiBuZXcgU2suYXN0bm9kZXMuSW5kZXgodyhhLGgpKTtoLnR5cGU9PT1yLnRlc3QmJihnPXcoYSxoKSk7aC50eXBlPT09ei5UX0NPTE9OPzE8YyhkKSYmKGg9YihkLDEpLGgudHlwZT09PXIudGVzdCYmKGY9dyhhLGgpKSk6MjxjKGQpJiYoaD1iKGQsMiksaC50eXBlPT09ci50ZXN0JiYoZj13KGEsaCkpKTtoPWIoZCxjKGQpLTEpO2gudHlwZT09PXIuc2xpY2VvcCYmKDE9PT1jKGgpPyhoPWIoaCwwKSxrPW5ldyBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQoU2suYnVpbHRpbi5ub25lLm5vbmUkLFxuU2suYXN0bm9kZXMuTG9hZCxoLmxpbmVubyxoLmNvbF9vZmZzZXQpKTooaD1iKGgsMSksaC50eXBlPT09ci50ZXN0JiYoaz13KGEsaCkpKSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5TbGljZShnLGYsayl9ZnVuY3Rpb24gUihhLGQpe3ZhciBnPWIoZCwwKTtzd2l0Y2goZy50eXBlKXtjYXNlIHouVF9OQU1FOnZhciBoPWcudmFsdWU7aWYoNDw9aC5sZW5ndGgmJjU+PWgubGVuZ3RoKXtpZihcIk5vbmVcIj09PWgpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQoU2suYnVpbHRpbi5ub25lLm5vbmUkLGQubGluZW5vLGQuY29sX29mZnNldCk7aWYoXCJUcnVlXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4uYm9vbC50cnVlJCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2lmKFwiRmFsc2VcIj09PWgpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQoU2suYnVpbHRpbi5ib29sLmZhbHNlJCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpfWE9XG5rKGgsYSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5OYW1lKGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO2Nhc2Ugei5UX1NUUklORzpnPVtdO2Zvcih2YXIgbj0wO248YyhkKTsrK24pe3ZhciBwPWIoZCxuKS52YWx1ZTt2YXIgbT1hO3ZhciB4PWIoZCxuKTt2YXIgdD1wO3ZhciBxPXQuY2hhckF0KDApO2Zvcih2YXIgSj0hMSx2PXA9ITE7Oyl7aWYoXCJ1XCIhPT1xJiZcIlVcIiE9PXEpaWYoXCJyXCI9PT1xfHxcIlJcIj09PXEpSj0hMDtlbHNlIGlmKFwiYlwiPT09cXx8XCJCXCI9PT1xKXY9ITA7ZWxzZSBpZihcImZcIj09PXF8fFwiRlwiPT09cSlwPSEwO2Vsc2UgYnJlYWs7dD10LnN1YnN0cigxKTtxPXQuY2hhckF0KDApfVNrLmFzc2VydHMuYXNzZXJ0KFwiJ1wiPT09cXx8J1wiJz09PXEmJnQuY2hhckF0KHQubGVuZ3RoLTEpPT09cSk7dD10LnN1YnN0cigxLHQubGVuZ3RoLTIpOzQ8PXQubGVuZ3RoJiZ0LmNoYXJBdCgwKT09PXEmJlxudC5jaGFyQXQoMSk9PT1xJiYoU2suYXNzZXJ0cy5hc3NlcnQodC5jaGFyQXQodC5sZW5ndGgtMSk9PT1xJiZ0LmNoYXJBdCh0Lmxlbmd0aC0yKT09PXEpLHQ9dC5zdWJzdHIoMix0Lmxlbmd0aC00KSk7aWYoSnx8LTE9PT10LmluZGV4T2YoXCJcXFxcXCIpKXtpZih2KWZvcihxPTA7cTx0Lmxlbmd0aDtxKyspMTI3PHQuY2hhckNvZGVBdChxKSYmZihtLHgsXCJieXRlcyBjYW4gb25seSBjb250YWluIEFTQ0lJIGxpdGVyYWwgY2hhcmFjdGVyc1wiKTttPVtsKHQpLHAsdl19ZWxzZXtKPXQ7dmFyIEI9Si5sZW5ndGgseT1cIlwiO2Zvcih0PTA7dDxCOysrdClxPUouY2hhckF0KHQpLFwiXFxcXFwiPT09cT8oKyt0LHE9Si5jaGFyQXQodCksXCJuXCI9PT1xP3krPVwiXFxuXCI6XCJcXFxcXCI9PT1xP3krPVwiXFxcXFwiOlwidFwiPT09cT95Kz1cIlxcdFwiOlwiclwiPT09cT95Kz1cIlxcclwiOlwiYlwiPT09cT95Kz1cIlxcYlwiOlwiZlwiPT09cT95Kz1cIlxcZlwiOlwidlwiPT09cT95Kz1cIlxcdlwiOlwiMFwiPT09cT95Kz1cIlxceDAwXCI6J1wiJz09PXE/eSs9J1wiJzpcIidcIj09PXE/XG55Kz1cIidcIjpcIlxcblwiIT09cSYmKFwieFwiPT09cT8odCsyPj1CJiZmKG0seCxcIlRydW5jYXRlZCBcXFxceE5OIGVzY2FwZVwiKSx5Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KEouc3Vic3RyKHQrMSwyKSwxNikpLHQrPTIpOnZ8fFwidVwiIT09cT92fHxcIlVcIiE9PXE/eSs9XCJcXFxcXCIrcToodCs4Pj1CJiZmKG0seCxcIlRydW5jYXRlZCBcXFxcVVhYWFhYWFhYIGVzY2FwZVwiKSx5Kz1TdHJpbmcuZnJvbUNvZGVQb2ludChwYXJzZUludChKLnN1YnN0cih0KzEsOCksMTYpKSx0Kz04KToodCs0Pj1CJiZmKG0seCxcIlRydW5jYXRlZCBcXFxcdVhYWFggZXNjYXBlXCIpLHkrPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoSi5zdWJzdHIodCsxLDQpLDE2KSksdCs9NCkpKTp2JiYxMjc8cS5jaGFyQ29kZUF0KDApP2YobSx4LFwiYnl0ZXMgY2FuIG9ubHkgY29udGFpbiBBU0NJSSBsaXRlcmFsIGNoYXJhY3RlcnNcIik6eSs9cTttPXk7bT1bbChtKSxwLHZdfXA9bTttPXBbMF07eD1wWzFdO3A9cFsyXTswIT1uJiZcbmghPT1wJiZmKGEsZCxcImNhbm5vdCBtaXggYnl0ZXMgYW5kIG5vbmJ5dGVzIGxpdGVyYWxzXCIpO2g9cDtpZih4KXtpZighU2suX19mdXR1cmVfXy5weXRob24zKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBzdHJpbmcgKGYtc3RyaW5ncyBhcmUgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMilcIixhLmNfZmlsZW5hbWUsYihkLG4pLmxpbmVubyk7dmFyIEY9bS4kanNzdHIoKTtbRl09YmEoRiwwLEYubGVuZ3RoLCExLDAsYSxiKGQsbikpO2cucHVzaC5hcHBseShnLEYudmFsdWVzKTtGPW51bGx9ZWxzZSBGP0Yucz1GLnMuc3EkY29uY2F0KG0pOihGPW5ldyAoaD9Tay5hc3Rub2Rlcy5CeXRlczpTay5hc3Rub2Rlcy5TdHIpKG0sZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGEuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KSxnLnB1c2goRikpfWQ9MT09PWcubGVuZ3RoJiZnWzBdLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RyP2dbMF06bmV3IFNrLmFzdG5vZGVzLkpvaW5lZFN0cihnLFxuZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGEuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtyZXR1cm4gZDtjYXNlIHouVF9OVU1CRVI6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5OdW0oWChhLGcudmFsdWUsZC5saW5lbm8pLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSB6LlRfRUxMSVBTSVM6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5FbGxpcHNpcyhkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO2Nhc2Ugei5UX0xQQVI6cmV0dXJuIGc9YihkLDEpLGcudHlwZT09ei5UX1JQQVI/bmV3IFNrLmFzdG5vZGVzLlR1cGxlKFtdLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpnLnR5cGU9PXIueWllbGRfZXhwcj93KGEsZyk6MT09YyhnKT9XKGEsZyk6YihnLDEpLnR5cGU9PXIuY29tcF9mb3I/dShEKGEsZyksZCk6dShXKGEsZyksZCk7Y2FzZSB6LlRfTFNRQjpnPVxuYihkLDEpO2lmKGcudHlwZT09ei5UX1JTUUIpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5MaXN0KFtdLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtlKGcsci50ZXN0bGlzdF9jb21wKTtpZigxPT1jKGcpfHxiKGcsMSkudHlwZT09ei5UX0NPTU1BKXJldHVybihhPUEoYSxnKSk/bmV3IFNrLmFzdG5vZGVzLkxpc3QoYSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6bnVsbDtoPWc7U2suYXNzZXJ0cy5hc3NlcnQoaC50eXBlPT1yLnRlc3RsaXN0X2NvbXApO2E9YWEoYSxoLDEpO3JldHVybiB1KGEsZCk7Y2FzZSB6LlRfTEJSQUNFOmc9YihkLDEpO2lmKGcudHlwZT09ei5UX1JCUkFDRSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkRpY3QobnVsbCxudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7XG5oPWIoZywwKS50eXBlPT16LlRfRE9VQkxFU1RBUjtpZigxPT1jKGcpfHwxPGMoZykmJmIoZywxKS50eXBlPT16LlRfQ09NTUEpe2g9ZztuPVtdO1NrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09PXIuZGljdG9yc2V0bWFrZXIpO2ZvcihnPTA7ZzxjKGgpO2crPTIpRj13KGEsYihoLGcpKSxuW2cvMl09RjthPW5ldyBTay5hc3Rub2Rlcy5TZXQobixoLmxpbmVubyxoLmNvbF9vZmZzZXQpfWVsc2UgaWYoMTxjKGcpJiZiKGcsMSkudHlwZT09ci5jb21wX2ZvciloPWcsU2suYXNzZXJ0cy5hc3NlcnQoaC50eXBlPT09ci5kaWN0b3JzZXRtYWtlciksU2suYXNzZXJ0cy5hc3NlcnQoMTxjKGgpKSxnPXcoYSxiKGgsMCkpLGE9UShhLGIoaCwxKSksYT1uZXcgU2suYXN0bm9kZXMuU2V0Q29tcChnLGEsaC5saW5lbm8saC5jb2xfb2Zmc2V0KTtlbHNlIGlmKGMoZyk+My1oJiZiKGcsMy1oKS50eXBlPT1yLmNvbXBfZm9yKXtpZihoKXJldHVybiBmKGEsZCxcImRpY3QgdW5wYWNraW5nIGNhbm5vdCBiZSB1c2VkIGluIGRpY3QgY29tcHJlaGVuc2lvblwiKSxcbm51bGw7aD1nO1NrLmFzc2VydHMuYXNzZXJ0KDM8YyhoKSk7ZShiKGgsMSksei5UX0NPTE9OKTtnPXcoYSxiKGgsMCkpO249dyhhLGIoaCwyKSk7YT1RKGEsYihoLDMpKTthPW5ldyBTay5hc3Rub2Rlcy5EaWN0Q29tcChnLG4sYSxoLmxpbmVubyxoLmNvbF9vZmZzZXQpfWVsc2V7aD1nO249W107Rj1bXTtmb3IocD1nPTA7cDxjKGgpO3ArKyltPWEseD1oLHY9cCxiKHgsdikudHlwZT09ei5UX0RPVUJMRVNUQVI/KFNrLmFzc2VydHMuYXNzZXJ0KDI8PWMoeCktdikscD13KG0sYih4LHYrMSkpLG09e2tleTpudWxsLHZhbHVlOnAsaTp2KzJ9KTooU2suYXNzZXJ0cy5hc3NlcnQoMzw9Yyh4KS12KSwocD13KG0sYih4LHYpKSk/KHQ9cCxlKGIoeCx2KzEpLHouVF9DT0xPTiksbT0ocD13KG0sYih4LHYrMikpKT97a2V5OnQsdmFsdWU6cCxpOnYrM306ITEpOm09MCkscD1tLmksbltnXT1tLmtleSxGW2ddPW0udmFsdWUsZysrO2E9bmV3IFNrLmFzdG5vZGVzLkRpY3QobixGLGgubGluZW5vLFxuaC5jb2xfb2Zmc2V0LGguZW5kX2xpbmVubyxoLmVuZF9jb2xfb2Zmc2V0KX1yZXR1cm4gdShhLGQpO2RlZmF1bHQ6cmV0dXJuIFNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBhdG9tIFwiK2cudHlwZSksbnVsbH19ZnVuY3Rpb24gQyhhLGQpe3ZhciBnLGY9MDtlKGQsci5hdG9tX2V4cHIpO3ZhciBoPWMoZCk7YihkLDApLnR5cGU9PT16LlRfQVdBSVQmJihmPTEsU2suYXNzZXJ0cy5hc3NlcnQoMTxoKSk7dmFyIGs9UihhLGIoZCxmKSk7aWYoIWspcmV0dXJuIG51bGw7aWYoMT09PWgpcmV0dXJuIGs7aWYoZiYmMj09PWgpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Bd2FpdChrLGQubGluZW5vLGQuY29sX29mZnNldCk7Zm9yKGc9ZisxO2c8aDtnKyspe3ZhciBuPWIoZCxnKTtpZihuLnR5cGUhPT1yLnRyYWlsZXIpYnJlYWs7bj1NKGEsbixrKTtpZighbilyZXR1cm4gbnVsbDtuLmxpbmVubz1rLmxpbmVubztuLmNvbF9vZmZzZXQ9ay5jb2xfb2Zmc2V0O2s9bn1yZXR1cm4gZj9uZXcgU2suYXN0bm9kZXMuQXdhaXQoayxcbmQubGluZSxkLmNvbF9vZmZzZXQpOmt9ZnVuY3Rpb24gdyhhLGQpe2E6Zm9yKDs7KXtzd2l0Y2goZC50eXBlKXtjYXNlIHIudGVzdDpjYXNlIHIudGVzdF9ub2NvbmQ6aWYoYihkLDApLnR5cGU9PT1yLmxhbWJkZWZ8fGIoZCwwKS50eXBlPT09ci5sYW1iZGVmX25vY29uZCl7dmFyIGc9YihkLDApOzM9PT1jKGcpPyhkPW5ldyBTay5hc3Rub2Rlcy5hcmd1bWVudHNfKFtdLG51bGwsbnVsbCxbXSksYT13KGEsYihnLDIpKSk6KGQ9TChhLGIoZywxKSksYT13KGEsYihnLDMpKSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5MYW1iZGEoZCxhLGcubGluZW5vLGcuY29sX29mZnNldCl9aWYoMTxjKGQpKXJldHVybiBTay5hc3NlcnRzLmFzc2VydCg1PT09YyhkKSksbmV3IFNrLmFzdG5vZGVzLklmRXhwKHcoYSxiKGQsMikpLHcoYSxiKGQsMCkpLHcoYSxiKGQsNCkpLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLm9yX3Rlc3Q6Y2FzZSByLmFuZF90ZXN0OmlmKDE9PT1jKGQpKXtkPWIoZCxcbjApO2NvbnRpbnVlIGF9dmFyIGY9W107Zm9yKGc9MDtnPGMoZCk7Zys9MilmW2cvMl09dyhhLGIoZCxnKSk7aWYoXCJhbmRcIj09PWIoZCwxKS52YWx1ZSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkJvb2xPcChTay5hc3Rub2Rlcy5BbmQsZixkLmxpbmVubyxkLmNvbF9vZmZzZXQpO1NrLmFzc2VydHMuYXNzZXJ0KFwib3JcIj09PWIoZCwxKS52YWx1ZSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Cb29sT3AoU2suYXN0bm9kZXMuT3IsZixkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5ub3RfdGVzdDppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX1lbHNlIHJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5Ob3QsdyhhLGIoZCwxKSksZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIuY29tcGFyaXNvbjppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX1lbHNle3ZhciBoPVtdO2Y9W107Zm9yKGc9MTtnPGMoZCk7Zys9MiloWyhnLTEpLzJdPVxucChhLGIoZCxnKSksZlsoZy0xKS8yXT13KGEsYihkLGcrMSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQ29tcGFyZSh3KGEsYihkLDApKSxoLGYsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1jYXNlIHIuc3Rhcl9leHByOnJldHVybiBlKGQsci5zdGFyX2V4cHIpLG5ldyBTay5hc3Rub2Rlcy5TdGFycmVkKHcoYSxiKGQsMSkpLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIuZXhwcjpjYXNlIHIueG9yX2V4cHI6Y2FzZSByLmFuZF9leHByOmNhc2Ugci5zaGlmdF9leHByOmNhc2Ugci5hcml0aF9leHByOmNhc2Ugci50ZXJtOmlmKDE9PT1jKGQpKXtkPWIoZCwwKTtjb250aW51ZSBhfXZhciBrPWQsbD1uZXcgU2suYXN0bm9kZXMuQmluT3AodyhhLGIoaywwKSksbihiKGssMSkpLHcoYSxiKGssMikpLGsubGluZW5vLGsuY29sX29mZnNldCksbT0oYyhrKS0xKS8yO2ZvcihkPTE7ZDxtOysrZClnPWIoaywyKmQrMSksZj1uKGcpLGg9dyhhLGIoaywyKmQrXG4yKSksbD1uZXcgU2suYXN0bm9kZXMuQmluT3AobCxmLGgsZy5saW5lbm8sZy5jb2xfb2Zmc2V0KTtyZXR1cm4gbDtjYXNlIHIueWllbGRfZXhwcjpyZXR1cm4gZj0hMSxoPW51bGwsMTxjKGQpJiYoZz1iKGQsMSkpLGcmJihoPWIoZyxjKGcpLTEpLDI9PWMoZyk/KGY9ITAsaD13KGEsaCkpOmg9VyhhLGgpKSxmP25ldyBTay5hc3Rub2Rlcy5ZaWVsZEZyb20oaCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOm5ldyBTay5hc3Rub2Rlcy5ZaWVsZChoLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmZhY3RvcjppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX1yZXR1cm4gRShhLGQpO2Nhc2Ugci5wb3dlcjpyZXR1cm4gZz1kLGUoZyxyLnBvd2VyKSxkPUMoYSxiKGcsMCkpLDEhPT1jKGcpJiZiKGcsYyhnKS0xKS50eXBlPT09ci5mYWN0b3ImJihhPXcoYSxiKGcsYyhnKS0xKSksZD1uZXcgU2suYXN0bm9kZXMuQmluT3AoZCxTay5hc3Rub2Rlcy5Qb3csYSxnLmxpbmVubyxnLmNvbF9vZmZzZXQpKSxcbmQ7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgZXhwclwiLFwibi50eXBlOiAlZFwiLGQudHlwZSl9YnJlYWt9fWZ1bmN0aW9uIE4oYSxkKXtkLnR5cGU9PT1yLnN0bXQmJihTay5hc3NlcnRzLmFzc2VydCgxPT09YyhkKSksZD1iKGQsMCkpO2QudHlwZT09PXIuc2ltcGxlX3N0bXQmJihTay5hc3NlcnRzLmFzc2VydCgxPT09aChkKSksZD1iKGQsMCkpO2lmKGQudHlwZT09PXIuc21hbGxfc3RtdClzd2l0Y2goZD1iKGQsMCksZC50eXBlKXtjYXNlIHIuZXhwcl9zdG10OnJldHVybiBkYShhLGQpO2Nhc2Ugci5kZWxfc3RtdDp2YXIgaz1kO2UoayxyLmRlbF9zdG10KTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkRlbGV0ZSh2KGEsYihrLDEpLFNrLmFzdG5vZGVzLkRlbCksay5saW5lbm8say5jb2xfb2Zmc2V0KTtjYXNlIHIucGFzc19zdG10OnJldHVybiBuZXcgU2suYXN0bm9kZXMuUGFzcyhkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5mbG93X3N0bXQ6cmV0dXJuIFYoYSxcbmQpO2Nhc2Ugci5pbXBvcnRfc3RtdDp2YXIgbj1kLHA7ZShuLHIuaW1wb3J0X3N0bXQpO3ZhciBtPW4ubGluZW5vO2Q9bi5jb2xfb2Zmc2V0O249YihuLDApO2lmKG4udHlwZT09PXIuaW1wb3J0X25hbWUpe249YihuLDEpO2UobixyLmRvdHRlZF9hc19uYW1lcyk7dmFyIHE9W107Zm9yKHA9MDtwPGMobik7cCs9MilxW3AvMl09QihhLGIobixwKSk7YT1uZXcgU2suYXN0bm9kZXMuSW1wb3J0KHEsbSxkKX1lbHNlIGlmKG4udHlwZT09PXIuaW1wb3J0X2Zyb20pe3ZhciB1PW51bGw7az0wO2ZvcihxPTE7cTxjKG4pOysrcSlpZihiKG4scSkudHlwZT09PXIuZG90dGVkX25hbWUpe3U9QihhLGIobixxKSk7cSsrO2JyZWFrfWVsc2UgaWYoYihuLHEpLnR5cGU9PT16LlRfRE9UKWsrKztlbHNlIGlmKGIobixxKS50eXBlPT09ei5UX0VMTElQU0lTKWsrPTM7ZWxzZSBicmVhazsrK3E7c3dpdGNoKGIobixxKS50eXBlKXtjYXNlIHouVF9TVEFSOm49YihuLHEpO2JyZWFrO2Nhc2Ugei5UX0xQQVI6bj1cbmIobixxKzEpO2Mobik7YnJlYWs7Y2FzZSByLmltcG9ydF9hc19uYW1lczpuPWIobixxKTtxPWMobik7aWYoMD09PXElMil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInRyYWlsaW5nIGNvbW1hIG5vdCBhbGxvd2VkIHdpdGhvdXQgc3Vycm91bmRpbmcgcGFyZW50aGVzZXNcIixhLmNfZmlsZW5hbWUsbi5saW5lbm8pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJVbmV4cGVjdGVkIG5vZGUtdHlwZSBpbiBmcm9tLWltcG9ydFwiLGEuY19maWxlbmFtZSxuLmxpbmVubyk7fXE9W107aWYobi50eXBlPT09ei5UX1NUQVIpcVswXT1CKGEsbik7ZWxzZSBmb3IocD0wO3A8YyhuKTtwKz0yKXFbcC8yXT1CKGEsYihuLHApKTthPXU/dS5uYW1lLnY6XCJcIjthPW5ldyBTay5hc3Rub2Rlcy5JbXBvcnRGcm9tKGwoYSkscSxrLG0sZCl9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInVua25vd24gaW1wb3J0IHN0YXRlbWVudFwiLFxuYS5jX2ZpbGVuYW1lLG4ubGluZW5vKTtyZXR1cm4gYTtjYXNlIHIuZ2xvYmFsX3N0bXQ6YT1kO2Q9W107ZShhLHIuZ2xvYmFsX3N0bXQpO2ZvcihrPTE7azxjKGEpO2srPTIpZFsoay0xKS8yXT1sKGIoYSxrKS52YWx1ZSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5HbG9iYWwoZCxhLmxpbmVubyxhLmNvbF9vZmZzZXQpO2Nhc2Ugci5ub25sb2NhbF9zdG10OmYoYSxkLFwiTm90IGltcGxlbWVudGVkOiBub25sb2NhbFwiKTticmVhaztjYXNlIHIuYXNzZXJ0X3N0bXQ6cmV0dXJuIGs9ZCxlKGssci5hc3NlcnRfc3RtdCksMj09PWMoayk/YT1uZXcgU2suYXN0bm9kZXMuQXNzZXJ0KHcoYSxiKGssMSkpLG51bGwsay5saW5lbm8say5jb2xfb2Zmc2V0KTo0PT09YyhrKT9hPW5ldyBTay5hc3Rub2Rlcy5Bc3NlcnQodyhhLGIoaywxKSksdyhhLGIoaywzKSksay5saW5lbm8say5jb2xfb2Zmc2V0KTooU2suYXNzZXJ0cy5mYWlsKFwiaW1wcm9wZXIgbnVtYmVyIG9mIHBhcnRzIHRvIGFzc2VydCBzdG10XCIpLFxuYT12b2lkIDApLGE7Y2FzZSByLnByaW50X3N0bXQ6az1kO1NrLl9fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb24mJmYoYSxrLFwiTWlzc2luZyBwYXJlbnRoZXNlcyBpbiBjYWxsIHRvICdwcmludCdcIik7bj0xO209bnVsbDtlKGssci5wcmludF9zdG10KTsyPD1jKGspJiZiKGssMSkudHlwZT09PXouVF9SSUdIVFNISUZUJiYobT13KGEsYihrLDIpKSxuPTQpO2Q9W107Zm9yKHU9MDtuPGMoayk7bis9MiwrK3UpZFt1XT13KGEsYihrLG4pKTthPWIoayxjKGspLTEpLnR5cGU9PT16LlRfQ09NTUE/ITE6ITA7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5QcmludChtLGQsYSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Nhc2Ugci5kZWJ1Z2dlcl9zdG10OnJldHVybiBuZXcgU2suYXN0bm9kZXMuRGVidWdnZXIoZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBzbWFsbF9zdG10XCIpfWVsc2Ugc3dpdGNoKGs9YihkLDApLGUoZCxyLmNvbXBvdW5kX3N0bXQpLFxuay50eXBlKXtjYXNlIHIuaWZfc3RtdDplKGssci5pZl9zdG10KTtpZig0PT09YyhrKSlhPW5ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxbXSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Vsc2UgaWYoZD1iKGssNCkudmFsdWUuY2hhckF0KDIpLFwic1wiPT09ZClhPW5ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLDEpKSx0KGEsYihrLDMpKSx0KGEsYihrLDYpKSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Vsc2UgaWYoXCJpXCI9PT1kKXttPWMoayktNDtuPSExO2Q9W107YihrLG0rMSkudHlwZT09PXouVF9OQU1FJiZcInNcIj09PWIoayxtKzEpLnZhbHVlLmNoYXJBdCgyKSYmKG49ITAsbS09Myk7bS89NDtuJiYoZD1bbmV3IFNrLmFzdG5vZGVzLklmKHcoYSxiKGssYyhrKS02KSksdChhLGIoayxjKGspLTQpKSx0KGEsYihrLGMoayktMSkpLGIoayxjKGspLTYpLmxpbmVubyxiKGssYyhrKS02KS5jb2xfb2Zmc2V0KV0sbS0tKTtmb3IodT0wO3U8bTsrK3Upbj01KzQqXG4obS11LTEpLGQ9W25ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLG4pKSx0KGEsYihrLG4rMikpLGQsYihrLG4pLmxpbmVubyxiKGssbikuY29sX29mZnNldCldO2E9bmV3IFNrLmFzdG5vZGVzLklmKHcoYSxiKGssMSkpLHQoYSxiKGssMykpLGQsay5saW5lbm8say5jb2xfb2Zmc2V0KX1lbHNlIFNrLmFzc2VydHMuZmFpbChcInVuZXhwZWN0ZWQgdG9rZW4gaW4gJ2lmJyBzdGF0ZW1lbnRcIiksYT12b2lkIDA7cmV0dXJuIGE7Y2FzZSByLndoaWxlX3N0bXQ6cmV0dXJuIGUoayxyLndoaWxlX3N0bXQpLDQ9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLldoaWxlKHcoYSxiKGssMSkpLHQoYSxiKGssMykpLFtdLGsubGluZW5vLGsuY29sX29mZnNldCk6Nz09PWMoayk/YT1uZXcgU2suYXN0bm9kZXMuV2hpbGUodyhhLGIoaywxKSksdChhLGIoaywzKSksdChhLGIoayw2KSksay5saW5lbm8say5jb2xfb2Zmc2V0KTooU2suYXNzZXJ0cy5mYWlsKFwid3JvbmcgbnVtYmVyIG9mIHRva2VucyBmb3IgJ3doaWxlJyBzdG10XCIpLFxuYT12b2lkIDApLGE7Y2FzZSByLmZvcl9zdG10OnJldHVybiBkPVtdLGUoayxyLmZvcl9zdG10KSw5PT09YyhrKSYmKGQ9dChhLGIoayw4KSkpLG49YihrLDEpLG09dihhLG4sU2suYXN0bm9kZXMuU3RvcmUpLG09MT09PWMobik/bVswXTpuZXcgU2suYXN0bm9kZXMuVHVwbGUobSxTay5hc3Rub2Rlcy5TdG9yZSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpLG5ldyBTay5hc3Rub2Rlcy5Gb3IobSxXKGEsYihrLDMpKSx0KGEsYihrLDUpKSxkLGsubGluZW5vLGsuY29sX29mZnNldCk7Y2FzZSByLnRyeV9zdG10OmQ9W107cD1jKGspO209KHAtMykvMzt1PVtdO3E9bnVsbDtlKGssci50cnlfc3RtdCk7bj10KGEsYihrLDIpKTtpZihiKGsscC0zKS50eXBlPT09ei5UX05BTUUpXCJmaW5hbGx5XCI9PT1iKGsscC0zKS52YWx1ZT8oOTw9cCYmYihrLHAtNikudHlwZT09PXouVF9OQU1FJiYodT10KGEsYihrLHAtNCkpLG0tLSkscT10KGEsYihrLHAtMSkpKTp1PXQoYSxiKGsscC0xKSksbS0tO2Vsc2UgaWYoYihrLFxucC0zKS50eXBlIT09ci5leGNlcHRfY2xhdXNlKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibWFsZm9ybWVkICd0cnknIHN0YXRlbWVudFwiLGEuY19maWxlbmFtZSxrLmxpbmVubyk7aWYoMDxtKWZvcihwPTA7cDxtO3ArKyl7dmFyIEE9cDt2YXIgeD1hLHk9YihrLDMrMypwKSxEPWIoayw1KzMqcCk7ZSh5LHIuZXhjZXB0X2NsYXVzZSk7ZShELHIuc3VpdGUpO2lmKDE9PT1jKHkpKXZhciBFPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKG51bGwsbnVsbCx0KHgsRCkseS5saW5lbm8seS5jb2xfb2Zmc2V0KTtlbHNlIDI9PT1jKHkpP0U9bmV3IFNrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIodyh4LGIoeSwxKSksbnVsbCx0KHgsRCkseS5saW5lbm8seS5jb2xfb2Zmc2V0KTo0PT09Yyh5KT8oU2suX19mdXR1cmVfXy5weXRob24zJiZcIixcIj09Yih5LDIpLnZhbHVlJiZmKHgseSxcIk9sZC1zdHlsZSAnZXhjZXB0JyBjbGF1c2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAzXCIpLFxudyh4LGIoeSwxKSksRT13KHgsYih5LDMpKSxnKHgsRSxTay5hc3Rub2Rlcy5TdG9yZSxiKHksMykpLEU9bmV3IFNrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIodyh4LGIoeSwxKSksRSx0KHgsRCkseS5saW5lbm8seS5jb2xfb2Zmc2V0KSk6KFNrLmFzc2VydHMuZmFpbChcIndyb25nIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgZXhjZXB0IGNsYXVzZVwiKSxFPXZvaWQgMCk7ZFtBXT1FfVNrLmFzc2VydHMuYXNzZXJ0KCEhcXx8MCE9ZC5sZW5ndGgpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuVHJ5KG4sZCx1LHEsay5saW5lbm8say5jb2xfb2Zmc2V0KTtjYXNlIHIud2l0aF9zdG10OmQ9W107ZShrLHIud2l0aF9zdG10KTtmb3IobT0xO208YyhrKS0yO20rPTIpbj12b2lkIDAscT1hLHA9YihrLG0pLGUocCxyLndpdGhfaXRlbSksdT13KHEsYihwLDApKSwzPT1jKHApJiYobj13KHEsYihwLDIpKSxnKHEsbixTay5hc3Rub2Rlcy5TdG9yZSxwKSksbj1uZXcgU2suYXN0bm9kZXMud2l0aGl0ZW0odSxcbm4pLGRbKG0tMSkvMl09bjthPXQoYSxiKGssYyhrKS0xKSk7YT1uZXcgU2suYXN0bm9kZXMuV2l0aChkLGEsay5saW5lbm8say5jb2xfb2Zmc2V0KTtyZXR1cm4gYTtjYXNlIHIuZnVuY2RlZjpyZXR1cm4gVChhLGssW10sITEpO2Nhc2Ugci5jbGFzc2RlZjpyZXR1cm4gUChhLGssW10pO2Nhc2Ugci5kZWNvcmF0ZWQ6bT1udWxsO2UoayxyLmRlY29yYXRlZCk7bj1iKGssMCk7ZShuLHIuZGVjb3JhdG9ycyk7ZD1bXTtmb3IodT0wO3U8YyhuKTsrK3Upe3E9ZDtwPXU7QT1hO0U9YihuLHUpO2UoRSxyLmRlY29yYXRvcik7ZShiKEUsMCksei5UX0FUKTtlKGIoRSxjKEUpLTEpLHouVF9ORVdMSU5FKTt2YXIgQyxHPWIoRSwxKTtlKEcsci5kb3R0ZWRfbmFtZSk7eD1HLmxpbmVubzt5PUcuY29sX29mZnNldDtEPWwoYihHLDApLnZhbHVlKTt2YXIgTT1uZXcgU2suYXN0bm9kZXMuTmFtZShELFNrLmFzdG5vZGVzLkxvYWQseCx5KTtmb3IoQz0yO0M8YyhHKTtDKz0yKUQ9bChiKEcsQykudmFsdWUpLFxuTT1uZXcgU2suYXN0bm9kZXMuQXR0cmlidXRlKE0sRCxTay5hc3Rub2Rlcy5Mb2FkLHgseSk7eD1NO0E9Mz09PWMoRSk/eDo1PT09YyhFKT9uZXcgU2suYXN0bm9kZXMuQ2FsbCh4LFtdLFtdLG51bGwsbnVsbCxFLmxpbmVubyxFLmNvbF9vZmZzZXQpOkYoQSxiKEUsMykseCk7cVtwXT1BfVNrLmFzc2VydHMuYXNzZXJ0KGIoaywxKS50eXBlPT1yLmZ1bmNkZWZ8fGIoaywxKS50eXBlPT1yLmFzeW5jX2Z1bmNkZWZ8fGIoaywxKS50eXBlPT1yLmNsYXNzZGVmKTtiKGssMSkudHlwZT09ci5mdW5jZGVmPyhtPWIoaywxKSxtPVQoYSxtLGQsITEpKTpiKGssMSkudHlwZT09ci5jbGFzc2RlZj9tPVAoYSxiKGssMSksZCk6YihrLDEpLnR5cGU9PXIuYXN5bmNfZnVuY2RlZiYmKG09YihrLDEpLGUobSxyLmFzeW5jX2Z1bmNkZWYpLGUoYihtLDApLHouVF9OQU1FKSxTay5hc3NlcnRzLmFzc2VydCgoXCJhc3luY1wiPT09YihtLDApKS52YWx1ZSksZShiKG0sMSksci5mdW5jZGVmKSxtPVQoYSxtLGQsXG4hMCkpO20mJihtLmxpbmVubz1rLmxpbmVubyxtLmNvbF9vZmZzZXQ9ay5jb2xfb2Zmc2V0KTtyZXR1cm4gbTtjYXNlIHIuYXN5bmNfc3RtdDpmKGEsayxcIk5vdCBpbXBsZW1lbnRlZDogYXN5bmNcIik7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmFzc2VydChcInVuaGFuZGxlZCBjb21wb3VuZF9zdG10XCIpfX12YXIgcj1Tay5QYXJzZVRhYmxlcy5zeW0sej1Tay50b2tlbi50b2tlbnMsWj17U2xpY2Vfa2luZDoxLEV4dFNsaWNlX2tpbmQ6MixJbmRleF9raW5kOjN9LE89e307T1t6LlRfVkJBUl09U2suYXN0bm9kZXMuQml0T3I7T1t6LlRfQ0lSQ1VNRkxFWF09U2suYXN0bm9kZXMuQml0WG9yO09bei5UX0FNUEVSXT1Tay5hc3Rub2Rlcy5CaXRBbmQ7T1t6LlRfTEVGVFNISUZUXT1Tay5hc3Rub2Rlcy5MU2hpZnQ7T1t6LlRfUklHSFRTSElGVF09U2suYXN0bm9kZXMuUlNoaWZ0O09bei5UX1BMVVNdPVNrLmFzdG5vZGVzLkFkZDtPW3ouVF9NSU5VU109U2suYXN0bm9kZXMuU3ViO09bei5UX1NUQVJdPVxuU2suYXN0bm9kZXMuTXVsdDtPW3ouVF9TTEFTSF09U2suYXN0bm9kZXMuRGl2O09bei5UX0RPVUJMRVNMQVNIXT1Tay5hc3Rub2Rlcy5GbG9vckRpdjtPW3ouVF9QRVJDRU5UXT1Tay5hc3Rub2Rlcy5Nb2Q7U2suc2V0dXBPcGVyYXRvcnM9ZnVuY3Rpb24oYSl7YT9PW3ouVF9BVF09U2suYXN0bm9kZXMuTWF0TXVsdDpPW3ouVF9BVF0mJmRlbGV0ZSBPW3ouVF9BVF19O1NrLmV4cG9ydFN5bWJvbChcIlNrLnNldHVwT3BlcmF0b3JzXCIsU2suc2V0dXBPcGVyYXRvcnMpO2NvbnN0IGZhPS9fW2VFXXxbZUVdX3xcXC5ffGpfLyxoYT0vX1xcLnxbKy1dX3xeMF9cXER8X2ovLGlhPS9fKD89W15fXSkvZztTay5hc3RGcm9tUGFyc2U9ZnVuY3Rpb24oZCxnLGYpe3ZhciBrLG49bmV3IGEoXCJ1dGYtOFwiLGcsZikscD1bXSxsPTA7c3dpdGNoKGQudHlwZSl7Y2FzZSByLmZpbGVfaW5wdXQ6Zm9yKGs9MDtrPGMoZCktMTsrK2spe3ZhciBtPWIoZCxrKTtpZihkLnR5cGUhPT16LlRfTkVXTElORSlpZihlKG0sci5zdG10KSxcbmY9aChtKSwxPT09ZilwW2wrK109TihuLG0pO2Vsc2UgZm9yKG09YihtLDApLGUobSxyLnNpbXBsZV9zdG10KSxnPTA7ZzxmOysrZylwW2wrK109TihuLGIobSwyKmcpKX1yZXR1cm4gbmV3IFNrLmFzdG5vZGVzLk1vZHVsZShwKTtjYXNlIHIuZXZhbF9pbnB1dDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvO1wiKTtjYXNlIHIuc2luZ2xlX2lucHV0OlNrLmFzc2VydHMuZmFpbChcInRvZG87XCIpO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIil9fTtTay5hc3REdW1wPWZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKGEpe3ZhciBiLGM9XCJcIjtmb3IoYj0wO2I8YTsrK2IpYys9XCIgXCI7cmV0dXJuIGN9LGM9ZnVuY3Rpb24oYSxkKXt2YXIgZTtpZihudWxsPT09YSlyZXR1cm4gZCtcIk5vbmVcIjtpZihhLnByb3RvdHlwZSYmdm9pZCAwIT09YS5wcm90b3R5cGUuX2FzdG5hbWUmJmEucHJvdG90eXBlLl9pc2VudW0pcmV0dXJuIGQrYS5wcm90b3R5cGUuX2FzdG5hbWUrXCIoKVwiO2lmKHZvaWQgMCE9PVxuYS5fYXN0bmFtZSl7dmFyIGc9YihhLl9hc3RuYW1lLmxlbmd0aCsxKTt2YXIgZj1bXTtmb3IoZT0wO2U8YS5fZmllbGRzLmxlbmd0aDtlKz0yKXt2YXIgaD1hLl9maWVsZHNbZV07dmFyIGs9YS5fZmllbGRzW2UrMV0oYSk7dmFyIG49YihoLmxlbmd0aCsxKTtmLnB1c2goW2gsYyhrLGQrZytuKV0pfWs9W107Zm9yKGU9MDtlPGYubGVuZ3RoOysrZSluPWZbZV0say5wdXNoKG5bMF0rXCI9XCIrblsxXS5yZXBsYWNlKC9eXFxzKy8sXCJcIikpO2U9ay5qb2luKFwiLFxcblwiK2QrZyk7cmV0dXJuIGQrYS5fYXN0bmFtZStcIihcIitlK1wiKVwifWlmKFNrLmlzQXJyYXlMaWtlKGEpKXtnPVtdO2ZvcihlPTA7ZTxhLmxlbmd0aDsrK2UpZj1hW2VdLGcucHVzaChjKGYsZCtcIiBcIikpO2E9Zy5qb2luKFwiLFxcblwiKTtyZXR1cm4gZCtcIltcIithLnJlcGxhY2UoL15cXHMrLyxcIlwiKStcIl1cIn1hPSEwPT09YT9cIlRydWVcIjohMT09PWE/XCJGYWxzZVwiOmEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZz9hLnRwJHN0cigpLnY6YSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0cj9hLiRyKCkudjpcIlwiK2E7cmV0dXJuIGQrYX07cmV0dXJuIGMoYSxcIlwiKX07U2suZXhwb3J0U3ltYm9sKFwiU2suYXN0RnJvbVBhcnNlXCIsU2suYXN0RnJvbVBhcnNlKTtTay5leHBvcnRTeW1ib2woXCJTay5hc3REdW1wXCIsU2suYXN0RHVtcCl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsYyl7dGhpcy5fX25hbWU9YTt0aGlzLl9fZmxhZ3M9Yjt0aGlzLl9fc2NvcGU9Yj4+MTEmNzt0aGlzLl9fbmFtZXNwYWNlcz1jfHxbXX1mdW5jdGlvbiBjKGEsYixjLGUsZil7dGhpcy5zeW1GbGFncz17fTt0aGlzLm5hbWU9Yjt0aGlzLnZhcm5hbWVzPVtdO3RoaXMuY2hpbGRyZW49W107dGhpcy5ibG9ja1R5cGU9Yzt0aGlzLnJldHVybnNWYWx1ZT10aGlzLnZhcmtleXdvcmRzPXRoaXMudmFyYXJncz10aGlzLmdlbmVyYXRvcj10aGlzLmNoaWxkSGFzRnJlZT10aGlzLmhhc0ZyZWU9dGhpcy5pc05lc3RlZD0hMTt0aGlzLmxpbmVubz1mO3RoaXMudGFibGU9YTthLmN1ciYmXG4oYS5jdXIubmVzdGVkfHxcImZ1bmN0aW9uXCI9PT1hLmN1ci5ibG9ja1R5cGUpJiYodGhpcy5pc05lc3RlZD0hMCk7ZS5zY29wZUlkPWwrKzthLnN0c3NbZS5zY29wZUlkXT10aGlzO3RoaXMuc3ltYm9scz17fX1mdW5jdGlvbiBiKGEpe3RoaXMuZmlsZW5hbWU9YTt0aGlzLnRvcD10aGlzLmN1cj1udWxsO3RoaXMuc3RhY2s9W107dGhpcy5jdXJDbGFzcz10aGlzLmdsb2JhbD1udWxsO3RoaXMudG1wbmFtZT0wO3RoaXMuc3Rzcz17fX1mdW5jdGlvbiBlKGEsYil7dmFyIGM7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhKGJbY10pfWZ1bmN0aW9uIGYoYSxiKXtmb3IodmFyIGMgaW4gYilhW2NdPWJbY119U2suZXhwb3J0U3ltYm9sKFwiU2suU1lNVEFCX0NPTlNUU1wiLHtERUZfR0xPQkFMOjEsREVGX0xPQ0FMOjIsREVGX1BBUkFNOjQsVVNFOjgsREVGX1NUQVI6MTYsREVGX0RPVUJMRVNUQVI6MzIsREVGX0lOVFVQTEU6NjQsREVGX0ZSRUU6MTI4LERFRl9GUkVFX0dMT0JBTDoyNTYsREVGX0ZSRUVfQ0xBU1M6NTEyLFxuREVGX0lNUE9SVDoxMDI0LERFRl9CT1VORDoxMDMwLFNDT1BFX09GRjoxMSxTQ09QRV9NQVNLOjcsTE9DQUw6MSxHTE9CQUxfRVhQTElDSVQ6MixHTE9CQUxfSU1QTElDSVQ6MyxGUkVFOjQsQ0VMTDo1LE9QVF9JTVBPUlRfU1RBUjoxLE9QVF9FWEVDOjIsT1BUX0JBUkVfRVhFQzo0LE9QVF9UT1BMRVZFTDo4LEdFTkVSQVRPUjoyLEdFTkVSQVRPUl9FWFBSRVNTSU9OOjIsTW9kdWxlQmxvY2s6XCJtb2R1bGVcIixGdW5jdGlvbkJsb2NrOlwiZnVuY3Rpb25cIixDbGFzc0Jsb2NrOlwiY2xhc3NcIn0pO2EucHJvdG90eXBlLmdldF9uYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19uYW1lfTthLnByb3RvdHlwZS5pc19yZWZlcmVuY2VkPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjgpfTthLnByb3RvdHlwZS5pc19wYXJhbWV0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmNCl9O2EucHJvdG90eXBlLmlzX2dsb2JhbD1mdW5jdGlvbigpe3JldHVybiAzPT09dGhpcy5fX3Njb3BlfHxcbjI9PXRoaXMuX19zY29wZX07YS5wcm90b3R5cGUuaXNfZGVjbGFyZWRfZ2xvYmFsPWZ1bmN0aW9uKCl7cmV0dXJuIDI9PXRoaXMuX19zY29wZX07YS5wcm90b3R5cGUuaXNfbG9jYWw9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmMTAzMCl9O2EucHJvdG90eXBlLmlzX2ZyZWU9ZnVuY3Rpb24oKXtyZXR1cm4gND09dGhpcy5fX3Njb3BlfTthLnByb3RvdHlwZS5pc19pbXBvcnRlZD1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMuX19mbGFncyYxMDI0KX07YS5wcm90b3R5cGUuaXNfYXNzaWduZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmMil9O2EucHJvdG90eXBlLmlzX25hbWVzcGFjZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZXNwYWNlcyYmMDx0aGlzLl9fbmFtZXNwYWNlcy5sZW5ndGh9O2EucHJvdG90eXBlLmdldF9uYW1lc3BhY2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19uYW1lc3BhY2VzfTt2YXIgbD0wO2MucHJvdG90eXBlLmdldF90eXBlPVxuZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ibG9ja1R5cGV9O2MucHJvdG90eXBlLmdldF9uYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZX07Yy5wcm90b3R5cGUuZ2V0X2xpbmVubz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxpbmVub307Yy5wcm90b3R5cGUuaXNfbmVzdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOZXN0ZWR9O2MucHJvdG90eXBlLmhhc19jaGlsZHJlbj1mdW5jdGlvbigpe3JldHVybiAwPHRoaXMuY2hpbGRyZW4ubGVuZ3RofTtjLnByb3RvdHlwZS5nZXRfaWRlbnRpZmllcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oKXtyZXR1cm4hMH0pfTtjLnByb3RvdHlwZS5sb29rdXA9ZnVuY3Rpb24oYil7aWYodGhpcy5zeW1ib2xzLmhhc093blByb3BlcnR5KGIpKWI9dGhpcy5zeW1ib2xzW2JdO2Vsc2V7dmFyIGM9dGhpcy5zeW1GbGFnc1tiXTt2YXIgZT10aGlzLl9fY2hlY2tfY2hpbGRyZW4oYik7Yj10aGlzLnN5bWJvbHNbYl09XG5uZXcgYShiLGMsZSl9cmV0dXJuIGJ9O2MucHJvdG90eXBlLl9fY2hlY2tfY2hpbGRyZW49ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoYj0wO2I8dGhpcy5jaGlsZHJlbi5sZW5ndGg7KytiKXt2YXIgZT10aGlzLmNoaWxkcmVuW2JdO2UubmFtZT09PWEmJmMucHVzaChlKX1yZXR1cm4gY307Yy5wcm90b3R5cGUuX2lkZW50c01hdGNoaW5nPWZ1bmN0aW9uKGEpe3ZhciBiLGM9W107Zm9yKGIgaW4gdGhpcy5zeW1GbGFncyl0aGlzLnN5bUZsYWdzLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuc3ltRmxhZ3NbYl0pJiZjLnB1c2goYik7Yy5zb3J0KCk7cmV0dXJuIGN9O2MucHJvdG90eXBlLmdldF9wYXJhbWV0ZXJzPWZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT10aGlzLmdldF90eXBlKCksXCJnZXRfcGFyYW1ldGVycyBvbmx5IHZhbGlkIGZvciBmdW5jdGlvbiBzY29wZXNcIik7dGhpcy5fZnVuY1BhcmFtc3x8KHRoaXMuX2Z1bmNQYXJhbXM9dGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oYSl7cmV0dXJuIGEmXG40fSkpO3JldHVybiB0aGlzLl9mdW5jUGFyYW1zfTtjLnByb3RvdHlwZS5nZXRfbG9jYWxzPWZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT10aGlzLmdldF90eXBlKCksXCJnZXRfbG9jYWxzIG9ubHkgdmFsaWQgZm9yIGZ1bmN0aW9uIHNjb3Blc1wiKTt0aGlzLl9mdW5jTG9jYWxzfHwodGhpcy5fZnVuY0xvY2Fscz10aGlzLl9pZGVudHNNYXRjaGluZyhmdW5jdGlvbihhKXtyZXR1cm4gYSYxMDMwfSkpO3JldHVybiB0aGlzLl9mdW5jTG9jYWxzfTtjLnByb3RvdHlwZS5nZXRfZ2xvYmFscz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X2dsb2JhbHMgb25seSB2YWxpZCBmb3IgZnVuY3Rpb24gc2NvcGVzXCIpO3RoaXMuX2Z1bmNHbG9iYWxzfHwodGhpcy5fZnVuY0dsb2JhbHM9dGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oYSl7YT1hPj4xMSY3O3JldHVybiAzPT1hfHwyPT1hfSkpO3JldHVybiB0aGlzLl9mdW5jR2xvYmFsc307XG5jLnByb3RvdHlwZS5nZXRfZnJlZXM9ZnVuY3Rpb24oKXtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9mcmVlcyBvbmx5IHZhbGlkIGZvciBmdW5jdGlvbiBzY29wZXNcIik7dGhpcy5fZnVuY0ZyZWVzfHwodGhpcy5fZnVuY0ZyZWVzPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe3JldHVybiA0PT0oYT4+MTEmNyl9KSk7cmV0dXJuIHRoaXMuX2Z1bmNGcmVlc307Yy5wcm90b3R5cGUuZ2V0X21ldGhvZHM9ZnVuY3Rpb24oKXt2YXIgYTtTay5hc3NlcnRzLmFzc2VydChcImNsYXNzXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9tZXRob2RzIG9ubHkgdmFsaWQgZm9yIGNsYXNzIHNjb3Blc1wiKTtpZighdGhpcy5fY2xhc3NNZXRob2RzKXt2YXIgYj1bXTtmb3IoYT0wO2E8dGhpcy5jaGlsZHJlbi5sZW5ndGg7KythKWIucHVzaCh0aGlzLmNoaWxkcmVuW2FdLm5hbWUpO2Iuc29ydCgpO3RoaXMuX2NsYXNzTWV0aG9kcz1ifXJldHVybiB0aGlzLl9jbGFzc01ldGhvZHN9O1xuYy5wcm90b3R5cGUuZ2V0U2NvcGU9ZnVuY3Rpb24oYSl7YT10aGlzLnN5bUZsYWdzW2FdO3JldHVybiB2b2lkIDA9PT1hPzA6YT4+MTEmN307Yi5wcm90b3R5cGUuZ2V0U3RzRm9yQXN0PWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEuc2NvcGVJZCxcImFzdCB3YXNuJ3QgYWRkZWQgdG8gc3Q/XCIpO2E9dGhpcy5zdHNzW2Euc2NvcGVJZF07U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YSxcInVua25vd24gc3ltIHRhYiBlbnRyeVwiKTtyZXR1cm4gYX07Yi5wcm90b3R5cGUuU0VRU3RtdD1mdW5jdGlvbihhKXt2YXIgYixjO2lmKG51bGwhPT1hKXtTay5hc3NlcnRzLmFzc2VydChTay5pc0FycmF5TGlrZShhKSxcIlNFUTogbm9kZXMgaXNuJ3QgYXJyYXk/IGdvdCBcIithLnRvU3RyaW5nKCkpO3ZhciBlPWEubGVuZ3RoO2ZvcihjPTA7YzxlOysrYykoYj1hW2NdKSYmdGhpcy52aXNpdFN0bXQoYil9fTtiLnByb3RvdHlwZS5TRVFFeHByPWZ1bmN0aW9uKGEpe3ZhciBiLFxuYztpZihudWxsIT09YSl7U2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoYSksXCJTRVE6IG5vZGVzIGlzbid0IGFycmF5PyBnb3QgXCIrYS50b1N0cmluZygpKTt2YXIgZT1hLmxlbmd0aDtmb3IoYz0wO2M8ZTsrK2MpKGI9YVtjXSkmJnRoaXMudmlzaXRFeHByKGIpfX07Yi5wcm90b3R5cGUuZW50ZXJCbG9jaz1mdW5jdGlvbihhLGIsZSxmKXthPVNrLmZpeFJlc2VydmVkKGEpO3ZhciBkPW51bGw7dGhpcy5jdXImJihkPXRoaXMuY3VyLHRoaXMuc3RhY2sucHVzaCh0aGlzLmN1cikpO3RoaXMuY3VyPW5ldyBjKHRoaXMsYSxiLGUsZik7XCJ0b3BcIj09PWEmJih0aGlzLmdsb2JhbD10aGlzLmN1ci5zeW1GbGFncyk7ZCYmZC5jaGlsZHJlbi5wdXNoKHRoaXMuY3VyKX07Yi5wcm90b3R5cGUuZXhpdEJsb2NrPWZ1bmN0aW9uKCl7dGhpcy5jdXI9bnVsbDswPHRoaXMuc3RhY2subGVuZ3RoJiYodGhpcy5jdXI9dGhpcy5zdGFjay5wb3AoKSl9O2IucHJvdG90eXBlLnZpc2l0UGFyYW1zPVxuZnVuY3Rpb24oYSxiKXt2YXIgYztmb3IoYz0wO2M8YS5sZW5ndGg7KytjKWlmKGI9YVtjXSxiLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuYXJnKXRoaXMuYWRkRGVmKGIuYXJnLDQsYi5saW5lbm8pO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIGV4cHJlc3Npb24gaW4gcGFyYW1ldGVyIGxpc3RcIix0aGlzLmZpbGVuYW1lKTt9O2IucHJvdG90eXBlLnZpc2l0QXJndW1lbnRzPWZ1bmN0aW9uKGEsYil7YS5hcmdzJiZ0aGlzLnZpc2l0UGFyYW1zKGEuYXJncywhMCk7YS5rd29ubHlhcmdzJiZ0aGlzLnZpc2l0UGFyYW1zKGEua3dvbmx5YXJncywhMCk7YS52YXJhcmcmJih0aGlzLmFkZERlZihhLnZhcmFyZy5hcmcsNCxiKSx0aGlzLmN1ci52YXJhcmdzPSEwKTthLmt3YXJnJiYodGhpcy5hZGREZWYoYS5rd2FyZy5hcmcsNCxiKSx0aGlzLmN1ci52YXJrZXl3b3Jkcz0hMCl9O2IucHJvdG90eXBlLm5ld1RtcG5hbWU9ZnVuY3Rpb24oYSl7dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKFwiX1tcIitcbisrdGhpcy50bXBuYW1lK1wiXVwiKSwyLGEpfTtiLnByb3RvdHlwZS5hZGREZWY9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVNrLm1hbmdsZU5hbWUodGhpcy5jdXJDbGFzcyxhKS52O2Q9U2suZml4UmVzZXJ2ZWQoZCk7dmFyIGU9dGhpcy5jdXIuc3ltRmxhZ3NbZF07aWYodm9pZCAwIT09ZSl7aWYoYiY0JiZlJjQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJkdXBsaWNhdGUgYXJndW1lbnQgJ1wiK2EuditcIicgaW4gZnVuY3Rpb24gZGVmaW5pdGlvblwiLHRoaXMuZmlsZW5hbWUsYyk7ZXw9Yn1lbHNlIGU9Yjt0aGlzLmN1ci5zeW1GbGFnc1tkXT1lO2ImND90aGlzLmN1ci52YXJuYW1lcy5wdXNoKGQpOmImMSYmKGU9YixhPXRoaXMuZ2xvYmFsW2RdLHZvaWQgMCE9PWEmJihlfD1hKSx0aGlzLmdsb2JhbFtkXT1lKX07Yi5wcm90b3R5cGUudmlzaXRTbGljZT1mdW5jdGlvbihhKXt2YXIgYjtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5TbGljZTphLmxvd2VyJiZcbnRoaXMudmlzaXRFeHByKGEubG93ZXIpO2EudXBwZXImJnRoaXMudmlzaXRFeHByKGEudXBwZXIpO2Euc3RlcCYmdGhpcy52aXNpdEV4cHIoYS5zdGVwKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4dFNsaWNlOmZvcihiPTA7YjxhLmRpbXMubGVuZ3RoOysrYil0aGlzLnZpc2l0U2xpY2UoYS5kaW1zW2JdKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkluZGV4OnRoaXMudmlzaXRFeHByKGEudmFsdWUpfX07Yi5wcm90b3R5cGUudmlzaXRTdG10PWZ1bmN0aW9uKGEpe3ZhciBiO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJ2aXNpdFN0bXQgY2FsbGVkIHdpdGggdW5kZWZpbmVkXCIpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmOnRoaXMuYWRkRGVmKGEubmFtZSwyLGEubGluZW5vKTthLmFyZ3MuZGVmYXVsdHMmJnRoaXMuU0VRRXhwcihhLmFyZ3MuZGVmYXVsdHMpO2EuZGVjb3JhdG9yX2xpc3QmJnRoaXMuU0VRRXhwcihhLmRlY29yYXRvcl9saXN0KTtcbnRoaXMuZW50ZXJCbG9jayhhLm5hbWUudixcImZ1bmN0aW9uXCIsYSxhLmxpbmVubyk7dGhpcy52aXNpdEFyZ3VtZW50cyhhLmFyZ3MsYS5saW5lbm8pO3RoaXMuU0VRU3RtdChhLmJvZHkpO3RoaXMuZXhpdEJsb2NrKCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5DbGFzc0RlZjp0aGlzLmFkZERlZihhLm5hbWUsMixhLmxpbmVubyk7dGhpcy5TRVFFeHByKGEuYmFzZXMpO2EuZGVjb3JhdG9yX2xpc3QmJnRoaXMuU0VRRXhwcihhLmRlY29yYXRvcl9saXN0KTt0aGlzLmVudGVyQmxvY2soYS5uYW1lLnYsXCJjbGFzc1wiLGEsYS5saW5lbm8pO3RoaXMuY3VyQ2xhc3M9YS5uYW1lO3RoaXMuU0VRU3RtdChhLmJvZHkpO3RoaXMuZXhpdEJsb2NrKCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5SZXR1cm46aWYoYS52YWx1ZSYmKHRoaXMudmlzaXRFeHByKGEudmFsdWUpLHRoaXMuY3VyLnJldHVybnNWYWx1ZT0hMCx0aGlzLmN1ci5nZW5lcmF0b3IpKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiJ3JldHVybicgd2l0aCBhcmd1bWVudCBpbnNpZGUgZ2VuZXJhdG9yXCIsXG50aGlzLmZpbGVuYW1lKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbGV0ZTp0aGlzLlNFUUV4cHIoYS50YXJnZXRzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkFzc2lnbjp0aGlzLlNFUUV4cHIoYS50YXJnZXRzKTt0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkFubkFzc2lnbjppZihhLnRhcmdldC5jb25zdHJ1Y3Rvcj09U2suYXN0bm9kZXMuTmFtZSl7dmFyIGM9YS50YXJnZXQ7dmFyIGY9U2subWFuZ2xlTmFtZSh0aGlzLmN1ckNsYXNzLGMuaWQpLnY7Zj1Tay5maXhSZXNlcnZlZChmKTtjPXRoaXMuY3VyLnN5bUZsYWdzW2ZdO2lmKGMmMjA0OSYmdGhpcy5nbG9iYWwhPXRoaXMuY3VyLnN5bUZsYWdzJiZhLnNpbXBsZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFubm90YXRlZCBuYW1lICdcIitmK1wiJyBjYW4ndCBiZSBnbG9iYWxcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTthLnNpbXBsZT90aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoZiksXG40MDk4LGEubGluZW5vKTphLnZhbHVlJiZ0aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoZiksMixhLmxpbmVubyl9ZWxzZSB0aGlzLnZpc2l0RXhwcihhLnRhcmdldCk7dGhpcy52aXNpdEV4cHIoYS5hbm5vdGF0aW9uKTthLnZhbHVlJiZ0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF1Z0Fzc2lnbjp0aGlzLnZpc2l0RXhwcihhLnRhcmdldCk7dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5QcmludDphLmRlc3QmJnRoaXMudmlzaXRFeHByKGEuZGVzdCk7dGhpcy5TRVFFeHByKGEudmFsdWVzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkZvcjp0aGlzLnZpc2l0RXhwcihhLnRhcmdldCk7dGhpcy52aXNpdEV4cHIoYS5pdGVyKTt0aGlzLlNFUVN0bXQoYS5ib2R5KTthLm9yZWxzZSYmdGhpcy5TRVFTdG10KGEub3JlbHNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLldoaWxlOnRoaXMudmlzaXRFeHByKGEudGVzdCk7XG50aGlzLlNFUVN0bXQoYS5ib2R5KTthLm9yZWxzZSYmdGhpcy5TRVFTdG10KGEub3JlbHNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmOnRoaXMudmlzaXRFeHByKGEudGVzdCk7dGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5SYWlzZTphLmV4YyYmKHRoaXMudmlzaXRFeHByKGEuZXhjKSxhLmluc3QmJih0aGlzLnZpc2l0RXhwcihhLmluc3QpLGEudGJhY2smJnRoaXMudmlzaXRFeHByKGEudGJhY2spKSxhLmNhdXNlJiZ0aGlzLnZpc2l0RXhwcihhLmNhdXNlKSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NlcnQ6dGhpcy52aXNpdEV4cHIoYS50ZXN0KTthLm1zZyYmdGhpcy52aXNpdEV4cHIoYS5tc2cpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuSW1wb3J0OmNhc2UgU2suYXN0bm9kZXMuSW1wb3J0RnJvbTp0aGlzLnZpc2l0QWxpYXMoYS5uYW1lcyxhLmxpbmVubyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5HbG9iYWw6dmFyIGs9XG5hLm5hbWVzLmxlbmd0aDtmb3IoYj0wO2I8azsrK2Ipe2Y9U2subWFuZ2xlTmFtZSh0aGlzLmN1ckNsYXNzLGEubmFtZXNbYl0pLnY7Zj1Tay5maXhSZXNlcnZlZChmKTtjPXRoaXMuY3VyLnN5bUZsYWdzW2ZdO2lmKGMmMTApe2lmKGMmMil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm5hbWUgJ1wiK2YrXCInIGlzIGFzc2lnbmVkIHRvIGJlZm9yZSBnbG9iYWwgZGVjbGFyYXRpb25cIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm5hbWUgJ1wiK2YrXCInIGlzIHVzZWQgcHJpb3IgdG8gZ2xvYmFsIGRlY2xhcmF0aW9uXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7fXRoaXMuYWRkRGVmKG5ldyBTay5idWlsdGluLnN0cihmKSwxLGEubGluZW5vKX1icmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4cHI6dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5QYXNzOmNhc2UgU2suYXN0bm9kZXMuQnJlYWs6Y2FzZSBTay5hc3Rub2Rlcy5Db250aW51ZTpjYXNlIFNrLmFzdG5vZGVzLkRlYnVnZ2VyOmJyZWFrO1xuY2FzZSBTay5hc3Rub2Rlcy5XaXRoOmUodGhpcy52aXNpdF93aXRoaXRlbS5iaW5kKHRoaXMpLGEuaXRlbXMpO2UodGhpcy52aXNpdFN0bXQuYmluZCh0aGlzKSxhLmJvZHkpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuVHJ5OnRoaXMuU0VRU3RtdChhLmJvZHkpO3RoaXMudmlzaXRFeGNlcHRoYW5kbGVycyhhLmhhbmRsZXJzKTt0aGlzLlNFUVN0bXQoYS5vcmVsc2UpO3RoaXMuU0VRU3RtdChhLmZpbmFsYm9keSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJVbmhhbmRsZWQgdHlwZSBcIithLmNvbnN0cnVjdG9yLm5hbWUrXCIgaW4gdmlzaXRTdG10XCIpfX07Yi5wcm90b3R5cGUudmlzaXRfd2l0aGl0ZW09ZnVuY3Rpb24oYSl7dGhpcy52aXNpdEV4cHIoYS5jb250ZXh0X2V4cHIpO2Eub3B0aW9uYWxfdmFycyYmdGhpcy52aXNpdEV4cHIoYS5vcHRpb25hbF92YXJzKX07Yi5wcm90b3R5cGUudmlzaXRFeHByPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PVxuYSxcInZpc2l0RXhwciBjYWxsZWQgd2l0aCB1bmRlZmluZWRcIik7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuQm9vbE9wOnRoaXMuU0VRRXhwcihhLnZhbHVlcyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5CaW5PcDp0aGlzLnZpc2l0RXhwcihhLmxlZnQpO3RoaXMudmlzaXRFeHByKGEucmlnaHQpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuVW5hcnlPcDp0aGlzLnZpc2l0RXhwcihhLm9wZXJhbmQpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGFtYmRhOnRoaXMuYWRkRGVmKG5ldyBTay5idWlsdGluLnN0cihcImxhbWJkYVwiKSwyLGEubGluZW5vKTthLmFyZ3MuZGVmYXVsdHMmJnRoaXMuU0VRRXhwcihhLmFyZ3MuZGVmYXVsdHMpO3RoaXMuZW50ZXJCbG9jayhcImxhbWJkYVwiLFwiZnVuY3Rpb25cIixhLGEubGluZW5vKTt0aGlzLnZpc2l0QXJndW1lbnRzKGEuYXJncyxhLmxpbmVubyk7dGhpcy52aXNpdEV4cHIoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuSWZFeHA6dGhpcy52aXNpdEV4cHIoYS50ZXN0KTtcbnRoaXMudmlzaXRFeHByKGEuYm9keSk7dGhpcy52aXNpdEV4cHIoYS5vcmVsc2UpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGljdDp0aGlzLlNFUUV4cHIoYS5rZXlzKTt0aGlzLlNFUUV4cHIoYS52YWx1ZXMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGljdENvbXA6Y2FzZSBTay5hc3Rub2Rlcy5TZXRDb21wOnRoaXMudmlzaXRDb21wcmVoZW5zaW9uKGEuZ2VuZXJhdG9ycywwKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOnRoaXMubmV3VG1wbmFtZShhLmxpbmVubyk7dGhpcy52aXNpdEV4cHIoYS5lbHQpO3RoaXMudmlzaXRDb21wcmVoZW5zaW9uKGEuZ2VuZXJhdG9ycywwKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDp0aGlzLnZpc2l0R2VuZXhwKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6YS52YWx1ZSYmdGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7dGhpcy5jdXIuZ2VuZXJhdG9yPSEwO2lmKHRoaXMuY3VyLnJldHVybnNWYWx1ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidyZXR1cm4nIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvclwiLFxudGhpcy5maWxlbmFtZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Db21wYXJlOnRoaXMudmlzaXRFeHByKGEubGVmdCk7dGhpcy5TRVFFeHByKGEuY29tcGFyYXRvcnMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ2FsbDp0aGlzLnZpc2l0RXhwcihhLmZ1bmMpO2lmKGEuYXJncylmb3IobGV0IGIgb2YgYS5hcmdzKWIuY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkP3RoaXMudmlzaXRFeHByKGIudmFsdWUpOnRoaXMudmlzaXRFeHByKGIpO2lmKGEua2V5d29yZHMpZm9yKGxldCBiIG9mIGEua2V5d29yZHMpdGhpcy52aXNpdEV4cHIoYi52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OdW06Y2FzZSBTay5hc3Rub2Rlcy5TdHI6Y2FzZSBTay5hc3Rub2Rlcy5CeXRlczpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkpvaW5lZFN0cjpmb3IobGV0IGIgb2YgYS52YWx1ZXMpdGhpcy52aXNpdEV4cHIoYik7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZTp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTtcbmEuZm9ybWF0X3NwZWMmJnRoaXMudmlzaXRFeHByKGEuZm9ybWF0X3NwZWMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OnRoaXMudmlzaXRFeHByKGEudmFsdWUpO3RoaXMudmlzaXRTbGljZShhLnNsaWNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLk5hbWU6dGhpcy5hZGREZWYoYS5pZCxhLmN0eD09PVNrLmFzdG5vZGVzLkxvYWQ/ODoyLGEubGluZW5vKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3Q6Y2FzZSBTay5hc3Rub2Rlcy5UdXBsZTpjYXNlIFNrLmFzdG5vZGVzLlNldDp0aGlzLlNFUUV4cHIoYS5lbHRzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlN0YXJyZWQ6dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJVbmhhbmRsZWQgdHlwZSBcIithLmNvbnN0cnVjdG9yLm5hbWUrXG5cIiBpbiB2aXNpdEV4cHJcIil9fTtiLnByb3RvdHlwZS52aXNpdENvbXByZWhlbnNpb249ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPWEubGVuZ3RoO2ZvcihjPWI7YzxkOysrYyliPWFbY10sdGhpcy52aXNpdEV4cHIoYi50YXJnZXQpLHRoaXMudmlzaXRFeHByKGIuaXRlciksdGhpcy5TRVFFeHByKGIuaWZzKX07Yi5wcm90b3R5cGUudmlzaXRBbGlhcz1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7Zm9yKGQ9MDtkPGEubGVuZ3RoOysrZCl7dmFyIGU9YVtkXTt2YXIgZj1jPW51bGw9PT1lLmFzbmFtZT9lLm5hbWUudjplLmFzbmFtZS52O2U9Yy5pbmRleE9mKFwiLlwiKTstMSE9PWUmJihmPWMuc3Vic3RyKDAsZSkpO2lmKFwiKlwiIT09Yyl0aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoZiksMTAyNCxiKTtlbHNlIGlmKFwibW9kdWxlXCIhPT10aGlzLmN1ci5ibG9ja1R5cGUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbXBvcnQgKiBvbmx5IGFsbG93ZWQgYXQgbW9kdWxlIGxldmVsXCIsXG50aGlzLmZpbGVuYW1lKTt9fTtiLnByb3RvdHlwZS52aXNpdEdlbmV4cD1mdW5jdGlvbihhKXt2YXIgYj1hLmdlbmVyYXRvcnNbMF07dGhpcy52aXNpdEV4cHIoYi5pdGVyKTt0aGlzLmVudGVyQmxvY2soXCJnZW5leHByXCIsXCJmdW5jdGlvblwiLGEsYS5saW5lbm8pO3RoaXMuY3VyLmdlbmVyYXRvcj0hMDt0aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoXCIuMFwiKSw0LGEubGluZW5vKTt0aGlzLnZpc2l0RXhwcihiLnRhcmdldCk7dGhpcy5TRVFFeHByKGIuaWZzKTt0aGlzLnZpc2l0Q29tcHJlaGVuc2lvbihhLmdlbmVyYXRvcnMsMSk7dGhpcy52aXNpdEV4cHIoYS5lbHQpO3RoaXMuZXhpdEJsb2NrKCl9O2IucHJvdG90eXBlLnZpc2l0RXhjZXB0aGFuZGxlcnM9ZnVuY3Rpb24oYSl7dmFyIGIsYztmb3IoYj0wO2M9YVtiXTsrK2IpYy50eXBlJiZ0aGlzLnZpc2l0RXhwcihjLnR5cGUpLGMubmFtZSYmdGhpcy52aXNpdEV4cHIoYy5uYW1lKSx0aGlzLlNFUVN0bXQoYy5ib2R5KX07Yi5wcm90b3R5cGUuYW5hbHl6ZUJsb2NrPVxuZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGQ9e307dmFyIGc9e30saD17fSxuPXt9LGw9e307XCJjbGFzc1wiPT1hLmJsb2NrVHlwZSYmKGYoaCxlKSxiJiZmKG4sYikpO2ZvcihxIGluIGEuc3ltRmxhZ3Mpe3ZhciBtPWEuc3ltRmxhZ3NbcV07dGhpcy5hbmFseXplTmFtZShhLGcscSxtLGIsZCxjLGUpfVwiY2xhc3NcIiE9PWEuYmxvY2tUeXBlJiYoXCJmdW5jdGlvblwiPT09YS5ibG9ja1R5cGUmJmYobixkKSxiJiZmKG4sYiksZihoLGUpKTtkPXt9O3ZhciBxPWEuY2hpbGRyZW4ubGVuZ3RoO2ZvcihtPTA7bTxxOysrbSlpZihlPWEuY2hpbGRyZW5bbV0sdGhpcy5hbmFseXplQ2hpbGRCbG9jayhlLG4sbCxoLGQpLGUuaGFzRnJlZXx8ZS5jaGlsZEhhc0ZyZWUpYS5jaGlsZEhhc0ZyZWU9ITA7ZihsLGQpO1wiZnVuY3Rpb25cIj09PWEuYmxvY2tUeXBlJiZ0aGlzLmFuYWx5emVDZWxscyhnLGwpO2I9dGhpcy51cGRhdGVTeW1ib2xzKGEuc3ltRmxhZ3MsZyxiLGwsXCJjbGFzc1wiPT09YS5ibG9ja1R5cGUpO1xuYS5oYXNGcmVlPWEuaGFzRnJlZXx8YjtmKGMsbCl9O2IucHJvdG90eXBlLmFuYWx5emVDaGlsZEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUsayl7dmFyIGQ9e307ZihkLGIpO2I9e307ZihiLGMpO2M9e307ZihjLGUpO3RoaXMuYW5hbHl6ZUJsb2NrKGEsZCxiLGMpO2YoayxiKX07Yi5wcm90b3R5cGUuYW5hbHl6ZUNlbGxzPWZ1bmN0aW9uKGEsYil7dmFyIGM7Zm9yKGMgaW4gYSl7dmFyIGQ9YVtjXTsxPT09ZCYmdm9pZCAwIT09YltjXSYmKGFbY109NSxkZWxldGUgYltjXSl9fTtiLnByb3RvdHlwZS51cGRhdGVTeW1ib2xzPWZ1bmN0aW9uKGEsYixjLGUsZil7dmFyIGQsZz0hMTtmb3IoZCBpbiBhKXt2YXIgaz1hW2RdO3ZhciBoPWJbZF07a3w9aDw8MTE7YVtkXT1rfWZvcihkIGluIGUpYj1hW2RdLHZvaWQgMCE9PWI/ZiYmYiYxMDMxJiYoYnw9NTEyLGFbZF09Yik6dm9pZCAwIT09Y1tkXSYmKGFbZF09ODE5MixnPSEwKTtyZXR1cm4gZ307Yi5wcm90b3R5cGUuYW5hbHl6ZU5hbWU9ZnVuY3Rpb24oYSxcbmIsYyxlLGYscCxsLG0pe2lmKGUmMSl7aWYoZSY0KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibmFtZSAnXCIrYytcIicgaXMgbG9jYWwgYW5kIGdsb2JhbFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2JbY109MjttW2NdPW51bGw7ZiYmdm9pZCAwIT09ZltjXSYmZGVsZXRlIGZbY119ZWxzZSBlJjEwMzA/KGJbY109MSxwW2NdPW51bGwsZGVsZXRlIG1bY10pOmYmJnZvaWQgMCE9PWZbY10/KGJbY109NCxhLmhhc0ZyZWU9ITAsbFtjXT1udWxsKToobSYmdm9pZCAwIT09bVtjXXx8IWEuaXNOZXN0ZWR8fChhLmhhc0ZyZWU9ITApLGJbY109Myl9O2IucHJvdG90eXBlLmFuYWx5emU9ZnVuY3Rpb24oKXt0aGlzLmFuYWx5emVCbG9jayh0aGlzLnRvcCxudWxsLHt9LHt9KX07U2suc3ltYm9sdGFibGU9ZnVuY3Rpb24oYSxjKXt2YXIgZD1uZXcgYihjKTtkLmVudGVyQmxvY2soXCJ0b3BcIixcIm1vZHVsZVwiLGEsMCk7ZC50b3A9ZC5jdXI7Zm9yKGM9MDtjPGEuYm9keS5sZW5ndGg7KytjKWQudmlzaXRTdG10KGEuYm9keVtjXSk7XG5kLmV4aXRCbG9jaygpO2QuYW5hbHl6ZSgpO3JldHVybiBkfTtTay5kdW1wU3ltdGFiPWZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKGEpe3JldHVybiBhP1wiVHJ1ZVwiOlwiRmFsc2VcIn0sYz1mdW5jdGlvbihhKXt2YXIgYixjPVtdO2ZvcihiPTA7YjxhLmxlbmd0aDsrK2IpYy5wdXNoKChuZXcgU2suYnVpbHRpbi5zdHIoYVtiXSkpLiRyKCkudik7cmV0dXJuXCJbXCIrYy5qb2luKFwiLCBcIikrXCJdXCJ9LGU9ZnVuY3Rpb24oYSxkKXt2YXIgZixnO3ZvaWQgMD09PWQmJihkPVwiXCIpO3ZhciBrPWQrXCJTeW1fdHlwZTogXCIrYS5nZXRfdHlwZSgpK1wiXFxuXCI7ays9ZCtcIlN5bV9uYW1lOiBcIithLmdldF9uYW1lKCkrXCJcXG5cIjtrKz1kK1wiU3ltX2xpbmVubzogXCIrYS5nZXRfbGluZW5vKCkrXCJcXG5cIjtrKz1kK1wiU3ltX25lc3RlZDogXCIrYihhLmlzX25lc3RlZCgpKStcIlxcblwiO2srPWQrXCJTeW1faGFzY2hpbGRyZW46IFwiK2IoYS5oYXNfY2hpbGRyZW4oKSkrXCJcXG5cIjtcImNsYXNzXCI9PT1hLmdldF90eXBlKCk/ays9ZCtcblwiQ2xhc3NfbWV0aG9kczogXCIrYyhhLmdldF9tZXRob2RzKCkpK1wiXFxuXCI6XCJmdW5jdGlvblwiPT09YS5nZXRfdHlwZSgpJiYoays9ZCtcIkZ1bmNfcGFyYW1zOiBcIitjKGEuZ2V0X3BhcmFtZXRlcnMoKSkrXCJcXG5cIixrKz1kK1wiRnVuY19sb2NhbHM6IFwiK2MoYS5nZXRfbG9jYWxzKCkpK1wiXFxuXCIsays9ZCtcIkZ1bmNfZ2xvYmFsczogXCIrYyhhLmdldF9nbG9iYWxzKCkpK1wiXFxuXCIsays9ZCtcIkZ1bmNfZnJlZXM6IFwiK2MoYS5nZXRfZnJlZXMoKSkrXCJcXG5cIik7ays9ZCtcIi0tIElkZW50aWZpZXJzIC0tXFxuXCI7dmFyIGg9YS5nZXRfaWRlbnRpZmllcnMoKTt2YXIgbj1oLmxlbmd0aDtmb3IoZz0wO2c8bjsrK2cpe3ZhciBsPWEubG9va3VwKGhbZ10pO2srPWQrXCJuYW1lOiBcIitsLmdldF9uYW1lKCkrXCJcXG5cIjtrKz1kK1wiICBpc19yZWZlcmVuY2VkOiBcIitiKGwuaXNfcmVmZXJlbmNlZCgpKStcIlxcblwiO2srPWQrXCIgIGlzX2ltcG9ydGVkOiBcIitiKGwuaXNfaW1wb3J0ZWQoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19wYXJhbWV0ZXI6IFwiK1xuYihsLmlzX3BhcmFtZXRlcigpKStcIlxcblwiO2srPWQrXCIgIGlzX2dsb2JhbDogXCIrYihsLmlzX2dsb2JhbCgpKStcIlxcblwiO2srPWQrXCIgIGlzX2RlY2xhcmVkX2dsb2JhbDogXCIrYihsLmlzX2RlY2xhcmVkX2dsb2JhbCgpKStcIlxcblwiO2srPWQrXCIgIGlzX2xvY2FsOiBcIitiKGwuaXNfbG9jYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19mcmVlOiBcIitiKGwuaXNfZnJlZSgpKStcIlxcblwiO2srPWQrXCIgIGlzX2Fzc2lnbmVkOiBcIitiKGwuaXNfYXNzaWduZWQoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19uYW1lc3BhY2U6IFwiK2IobC5pc19uYW1lc3BhY2UoKSkrXCJcXG5cIjt2YXIgbT1sLmdldF9uYW1lc3BhY2VzKCk7dmFyIHA9bS5sZW5ndGg7ays9ZCtcIiAgbmFtZXNwYWNlczogW1xcblwiO3ZhciBxPVtdO2ZvcihmPTA7ZjxwOysrZilsPW1bZl0scS5wdXNoKGUobCxkK1wiICAgIFwiKSk7ays9cS5qb2luKFwiXFxuXCIpO2srPWQrXCIgIF1cXG5cIn1yZXR1cm4ga307cmV0dXJuIGUoYS50b3AsXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnN5bWJvbHRhYmxlXCIsXG5Tay5zeW1ib2x0YWJsZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suZHVtcFN5bXRhYlwiLFNrLmR1bXBTeW10YWIpfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMsZSxmKXt0aGlzLmZpbGVuYW1lPWE7dGhpcy5zdD1iO3RoaXMuZmxhZ3M9Yzt0aGlzLmNhblN1c3BlbmQ9ZTt0aGlzLmludGVyYWN0aXZlPSExO3RoaXMubmVzdGxldmVsPTA7dGhpcy51PW51bGw7dGhpcy5zdGFjaz1bXTt0aGlzLnJlc3VsdD1bXTt0aGlzLmFsbFVuaXRzPVtdO3RoaXMuc291cmNlPWY/Zi5zcGxpdChcIlxcblwiKTohMX1mdW5jdGlvbiBjKCl7dGhpcy5uYW1lPXRoaXMuc3RlPW51bGw7dGhpcy5kb2VzU3VzcGVuZD10aGlzLmNhblN1c3BlbmQ9ITE7dGhpcy5wcml2YXRlXz1udWxsO3RoaXMubGluZW5vPXRoaXMuZmlyc3RsaW5lbm89MDt0aGlzLmxpbmVub1NldD0hMTt0aGlzLmxvY2FsbmFtZXM9W107dGhpcy5sb2NhbHRlbXBzPVtdO3RoaXMudGVtcHNUb1NhdmU9W107dGhpcy5ibG9ja251bT0wO3RoaXMuYmxvY2tzPVxuW107dGhpcy5jdXJibG9jaz0wO3RoaXMuY29uc3RzPXt9O3RoaXMuc2NvcGVuYW1lPW51bGw7dGhpcy5zdWZmaXhDb2RlPXRoaXMuc3dpdGNoQ29kZT10aGlzLnZhckRlY2xzQ29kZT10aGlzLnByZWZpeENvZGU9XCJcIjt0aGlzLmJyZWFrQmxvY2tzPVtdO3RoaXMuY29udGludWVCbG9ja3M9W107dGhpcy5leGNlcHRCbG9ja3M9W107dGhpcy5maW5hbGx5QmxvY2tzPVtdfWZ1bmN0aW9uIGIoYSl7cmV0dXJuIHZvaWQgMD09PWhbYV0/YTphK1wiXyRydyRcIn1mdW5jdGlvbiBlKGEsYil7dmFyIGM9Yi52O2lmKG51bGw9PT1hfHxudWxsPT09Y3x8XCJfXCIhPT1jLmNoYXJBdCgwKXx8XCJfXCIhPT1jLmNoYXJBdCgxKXx8XCJfXCI9PT1jLmNoYXJBdChjLmxlbmd0aC0xKSYmXCJfXCI9PT1jLmNoYXJBdChjLmxlbmd0aC0yKSlyZXR1cm4gYjt2YXIgZD1hLnY7ZC5yZXBsYWNlKC9fL2csXCJcIik7aWYoXCJcIj09PWQpcmV0dXJuIGI7ZD1hLnY7ZC5yZXBsYWNlKC9eXyovLFwiXCIpO3JldHVybiBkPW5ldyBTay5idWlsdGluLnN0cihcIl9cIitcbmQrYyl9ZnVuY3Rpb24gZihhKXtsZXQgYj0nXCInO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKXtsZXQgZD1hLmNoYXJDb2RlQXQoYyk7Yj0xMD09ZD9iK1wiXFxcXG5cIjo5Mj09ZD9iK1wiXFxcXFxcXFxcIjozND09ZHx8MzI+ZHx8MTI3PD1kJiYyNTY+ZD9iKyhcIlxcXFx4XCIrKFwiMFwiK2QudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTIpKToyNTY8PWQ/YisoXCJcXFxcdVwiKyhcIjAwMFwiK2QudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTQpKTpiK2EuY2hhckF0KGMpfXJldHVybiBiKydcIid9dmFyIGw7U2suZ2Vuc3ltY291bnQ9MDtjLnByb3RvdHlwZS5hY3RpdmF0ZVNjb3BlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztsPWZ1bmN0aW9uKCl7dmFyIGIsYz1hLmJsb2Nrc1thLmN1cmJsb2NrXTtpZihudWxsPT09Yy5fbmV4dClmb3IoYj0wO2I8YXJndW1lbnRzLmxlbmd0aDsrK2IpYy5wdXNoKGFyZ3VtZW50c1tiXSl9fTthLnByb3RvdHlwZS5nZXRTb3VyY2VMaW5lPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMuc291cmNlKTtcbnJldHVybiB0aGlzLnNvdXJjZVthLTFdfTthLnByb3RvdHlwZS5hbm5vdGF0ZVNvdXJjZT1mdW5jdGlvbihhKXt2YXIgYjtpZih0aGlzLnNvdXJjZSl7dmFyIGM9YS5saW5lbm87dmFyIGQ9YS5jb2xfb2Zmc2V0O2woXCJcXG4vL1xcbi8vIGxpbmUgXCIsYyxcIjpcXG4vLyBcIix0aGlzLmdldFNvdXJjZUxpbmUoYyksXCJcXG4vLyBcIik7Zm9yKGI9MDtiPGQ7KytiKWwoXCIgXCIpO2woXCJeXFxuLy9cXG5cIik7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YS5saW5lbm8mJnZvaWQgMCE9PWEuY29sX29mZnNldCk7bChcIiRjdXJyTGluZU5vID0gXCIsYyxcIjtcXG4kY3VyckNvbE5vID0gXCIsZCxcIjtcXG5cXG5cIil9fTthLnByb3RvdHlwZS5nZW5zeW09ZnVuY3Rpb24oYSl7cmV0dXJuIGE9XCIkXCIrKGF8fFwiXCIpK1NrLmdlbnN5bWNvdW50Kyt9O2EucHJvdG90eXBlLm5pY2VOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdlbnN5bShhLnJlcGxhY2UoXCI8XCIsXCJcIikucmVwbGFjZShcIj5cIixcIlwiKS5yZXBsYWNlKFwiIFwiLFwiX1wiKSl9O1xudmFyIGg9U2suYnVpbHRpbi5zdHIucmVzZXJ2ZWRXb3Jkc187YS5wcm90b3R5cGUubWFrZUNvbnN0YW50PWZ1bmN0aW9uKGEpe3ZhciBiLGM9XCJcIjtmb3IoYj0wO2I8YXJndW1lbnRzLmxlbmd0aDsrK2IpYys9YXJndW1lbnRzW2JdO2ZvcihkIGluIHRoaXMudS5jb25zdHMpaWYodGhpcy51LmNvbnN0cy5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9dGhpcy51LmNvbnN0c1tkXSxiPT1jKSlyZXR1cm4gZDt2YXIgZD10aGlzLnUuc2NvcGVuYW1lK1wiLlwiK3RoaXMuZ2Vuc3ltKFwiY29uc3RcIik7dGhpcy51LmNvbnN0c1tkXT1jO3JldHVybiBkfTthLnByb3RvdHlwZS5fZ3I9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPXRoaXMuZ2Vuc3ltKGEpO3RoaXMudS5sb2NhbHRlbXBzLnB1c2goZCk7bChcInZhciBcIixkLFwiPVwiKTtmb3IoYz0xO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpbChhcmd1bWVudHNbY10pO2woXCI7XCIpO3JldHVybiBkfTthLnByb3RvdHlwZS5vdXRwdXRJbnRlcnJ1cHRUZXN0PWZ1bmN0aW9uKCl7dmFyIGE9XG5cIlwiO2lmKG51bGwhPT1Tay5leGVjTGltaXR8fG51bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZClhKz1cInZhciAkZGF0ZU5vdyA9IERhdGUubm93KCk7XCIsbnVsbCE9PVNrLmV4ZWNMaW1pdCYmKGErPVwiaWYgKCRkYXRlTm93IC0gU2suZXhlY1N0YXJ0ID4gU2suZXhlY0xpbWl0KSB7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVGltZUxpbWl0RXJyb3IoU2sudGltZW91dE1zZygpKX1cIiksbnVsbCE9PVNrLnlpZWxkTGltaXQmJnRoaXMudS5jYW5TdXNwZW5kJiYoYT1hK1wiaWYgKCRkYXRlTm93IC0gU2subGFzdFlpZWxkID4gU2sueWllbGRMaW1pdCkge1wiKyhcInZhciAkc3VzcCA9ICRzYXZlU3VzcGVuc2lvbih7ZGF0YToge3R5cGU6ICdTay55aWVsZCd9LCByZXN1bWU6IGZ1bmN0aW9uKCkge319LCAnXCIrdGhpcy5maWxlbmFtZStcIicsJGN1cnJMaW5lTm8sJGN1cnJDb2xObyk7XCIpLGErPVwiJHN1c3AuJGJsayA9ICRibGs7JHN1c3Aub3B0aW9uYWwgPSB0cnVlO3JldHVybiAkc3VzcDt9XCIsXG50aGlzLnUuZG9lc1N1c3BlbmQ9ITApO3JldHVybiBhfTthLnByb3RvdHlwZS5fanVtcGZhbHNlPWZ1bmN0aW9uKGEsYil7YT10aGlzLl9ncihcImpmYWxzZVwiLFwiKFwiLGEsXCI9PT1mYWxzZXx8IVNrLm1pc2NldmFsLmlzVHJ1ZShcIixhLFwiKSlcIik7bChcImlmKFwiLGEsXCIpey8qdGVzdCBmYWlsZWQgKi8kYmxrPVwiLGIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXB1bmRlZj1mdW5jdGlvbihhLGIpe2woXCJpZihcIixhLFwiPT09dW5kZWZpbmVkKXskYmxrPVwiLGIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXBub3R1bmRlZj1mdW5jdGlvbihhLGIpe2woXCJpZihcIixhLFwiIT09dW5kZWZpbmVkKXskYmxrPVwiLGIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXB0cnVlPWZ1bmN0aW9uKGEsYil7YT10aGlzLl9ncihcImp0cnVlXCIsXCIoXCIsYSxcIj09PXRydWV8fFNrLm1pc2NldmFsLmlzVHJ1ZShcIixhLFwiKSlcIik7bChcImlmKFwiLGEsXCIpey8qdGVzdCBwYXNzZWQgKi8kYmxrPVwiLFxuYixcIjtjb250aW51ZTt9XCIpfTthLnByb3RvdHlwZS5fanVtcD1mdW5jdGlvbihhKXtudWxsPT09dGhpcy51LmJsb2Nrc1t0aGlzLnUuY3VyYmxvY2tdLl9uZXh0JiYobChcIiRibGs9XCIsYSxcIjtcIiksdGhpcy51LmJsb2Nrc1t0aGlzLnUuY3VyYmxvY2tdLl9uZXh0PWEpfTthLnByb3RvdHlwZS5fY2hlY2tTdXNwZW5zaW9uPWZ1bmN0aW9uKGEpe2lmKHRoaXMudS5jYW5TdXNwZW5kKXt2YXIgYj10aGlzLm5ld0Jsb2NrKFwiZnVuY3Rpb24gcmV0dXJuIG9yIHJlc3VtZSBzdXNwZW5zaW9uXCIpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTthPWF8fHtsaW5lbm86XCIkY3VyckxpbmVOb1wiLGNvbF9vZmZzZXQ6XCIkY3VyckNvbE5vXCJ9O2woXCJpZiAoJHJldCAmJiAkcmV0LiRpc1N1c3BlbnNpb24pIHsgcmV0dXJuICRzYXZlU3VzcGVuc2lvbigkcmV0LCdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpOyB9XCIpO3RoaXMudS5kb2VzU3VzcGVuZD0hMDtcbnRoaXMudS50ZW1wc1RvU2F2ZT10aGlzLnUudGVtcHNUb1NhdmUuY29uY2F0KHRoaXMudS5sb2NhbHRlbXBzKX1lbHNlIGwoXCJpZiAoJHJldCAmJiAkcmV0LiRpc1N1c3BlbnNpb24pIHsgJHJldCA9IFNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdygkcmV0KTsgfVwiKX07YS5wcm90b3R5cGUuY3VucGFja3N0YXJzdG9hcnJheT1mdW5jdGlvbihhLGIpe2lmKCFhfHwwPT1hLmxlbmd0aClyZXR1cm5cIltdXCI7bGV0IGM9ITE7Zm9yKGxldCBkIG9mIGEpe2lmKGImJmMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJFeHRlbmRlZCBhcmd1bWVudCB1bnBhY2tpbmcgaXMgbm90IHBlcm1pdHRlZCBpbiBQeXRob24gMlwiKTtkLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZCYmKGM9ITApfWlmKGMpe2I9dGhpcy5fZ3IoXCJ1bnBhY2tcIixcIltdXCIpO2ZvcihsZXQgYyBvZiBhKWMuY29uc3RydWN0b3IhPT1Tay5hc3Rub2Rlcy5TdGFycmVkP2woYixcblwiLnB1c2goXCIsdGhpcy52ZXhwcihjKSxcIik7XCIpOihsKFwiJHJldCA9IFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihcIix0aGlzLnZleHByKGMudmFsdWUpLFwiKSwgZnVuY3Rpb24oZSkgeyBcIixiLFwiLnB1c2goZSk7IH0pO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKSk7cmV0dXJuIGJ9cmV0dXJuXCJbXCIrYS5tYXAoYT0+dGhpcy52ZXhwcihhKSkuam9pbihcIixcIikrXCJdXCJ9O2EucHJvdG90eXBlLmN0dXBsZWxpc3RvcnNldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7U2suYXNzZXJ0cy5hc3NlcnQoXCJ0dXBsZVwiPT09Y3x8XCJsaXN0XCI9PT1jfHxcInNldFwiPT09Yyk7dmFyIGU9ITE7Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7ZCsrKWlmKGEuZWx0c1tkXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0YXJyZWQpe2U9ITA7dmFyIGY9ZDticmVha31pZihhLmN0eD09PVNrLmFzdG5vZGVzLlN0b3JlKXtpZihlKXtpZighU2suX19mdXR1cmVfXy5weXRob24zKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXNzaWdubWVudCB1bnBhY2tpbmcgd2l0aCBzdGFycyBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIsXG50aGlzLmZpbGVuYW1lLGEubGluZW5vKTtmb3IoZD1mKzE7ZDxhLmVsdHMubGVuZ3RoO2QrKylpZihhLmVsdHNbZF0uY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibXVsdGlwbGUgc3RhcnJlZCBleHByZXNzaW9ucyBpbiBhc3NpZ25tZW50XCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7fWM9ZT9mOmEuZWx0cy5sZW5ndGg7bChcIiRyZXQgPSBTay5hYnN0ci5zZXF1ZW5jZVVucGFjayhcIitiK1wiLFwiK2MrXCIsXCIrKGU/YS5lbHRzLmxlbmd0aC0xOmMpK1wiLCBcIitlK1wiKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKCk7Yj10aGlzLl9ncihcIml0ZW1zXCIsXCIkcmV0XCIpO2ZvcihkPTA7ZDxhLmVsdHMubGVuZ3RoOysrZClkPT09Zj90aGlzLnZleHByKGEuZWx0c1tkXS52YWx1ZSxiK1wiW1wiK2QrXCJdXCIpOnRoaXMudmV4cHIoYS5lbHRzW2RdLGIrXCJbXCIrZCtcIl1cIil9ZWxzZSBpZihhLmN0eD09PVNrLmFzdG5vZGVzLkxvYWR8fFwic2V0XCI9PT1cbmMpe2lmKGUpe2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJMaXN0IHBhY2tpbmcgd2l0aCBzdGFycyBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO3JldHVybiB0aGlzLl9ncihcImxvYWRcIitjLFwibmV3IFNrLmJ1aWx0aW5zWydcIixjLFwiJ10oXCIsdGhpcy5jdW5wYWNrc3RhcnN0b2FycmF5KGEuZWx0cyksXCIpXCIpfWlmKFwidHVwbGVcIj09PWMpe2U9ITA7Yj1bXTtmb3IoZD0wO2Q8YS5lbHRzLmxlbmd0aDsrK2QpZj10aGlzLnZleHByKGEuZWx0c1tkXSksZSYmLTE9PWYuaW5kZXhPZihcIiRjb25zdFwiKSYmKGU9ITEpLGIucHVzaChmKTtpZihlKXJldHVybiB0aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLnR1cGxlKFtcIitiK1wiXSlcIik7Zm9yKGQ9MDtkPGIubGVuZ3RoOysrZCliW2RdPXRoaXMuX2dyKFwiZWxlbVwiLGJbZF0pO3JldHVybiB0aGlzLl9ncihcImxvYWRcIitjLFwibmV3IFNrLmJ1aWx0aW5zWydcIixjLFwiJ10oW1wiLFxuYixcIl0pXCIpfWI9W107Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7KytkKWIucHVzaCh0aGlzLl9ncihcImVsZW1cIix0aGlzLnZleHByKGEuZWx0c1tkXSkpKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFtcIixiLFwiXSlcIil9fTthLnByb3RvdHlwZS5jZGljdD1mdW5jdGlvbihhKXt2YXIgYjt2YXIgYz1bXTtpZihudWxsIT09YS5rZXlzKWZvcihTay5hc3NlcnRzLmFzc2VydChhLnZhbHVlcy5sZW5ndGg9PT1hLmtleXMubGVuZ3RoKSxiPTA7YjxhLnZhbHVlcy5sZW5ndGg7KytiKXt2YXIgZD10aGlzLnZleHByKGEudmFsdWVzW2JdKTtjLnB1c2godGhpcy52ZXhwcihhLmtleXNbYl0pKTtjLnB1c2goZCl9cmV0dXJuIHRoaXMuX2dyKFwibG9hZGRpY3RcIixcIm5ldyBTay5idWlsdGluc1snZGljdCddKFtcIixjLFwiXSlcIil9O2EucHJvdG90eXBlLmNsaXN0Y29tcD1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuTGlzdENvbXApO1xudmFyIGI9dGhpcy5fZ3IoXCJfY29tcHJcIixcIm5ldyBTay5idWlsdGluc1snbGlzdCddKFtdKVwiKTtyZXR1cm4gdGhpcy5jY29tcGdlbihcImxpc3RcIixiLGEuZ2VuZXJhdG9ycywwLGEuZWx0LG51bGwsYSl9O2EucHJvdG90eXBlLmNkaWN0Y29tcD1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuRGljdENvbXApO3ZhciBiPXRoaXMuX2dyKFwiX2Rjb21wclwiLFwibmV3IFNrLmJ1aWx0aW5zLmRpY3QoW10pXCIpO3JldHVybiB0aGlzLmNjb21wZ2VuKFwiZGljdFwiLGIsYS5nZW5lcmF0b3JzLDAsYS52YWx1ZSxhLmtleSxhKX07YS5wcm90b3R5cGUuY3NldGNvbXA9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLlNldENvbXApO3ZhciBiPXRoaXMuX2dyKFwiX3NldGNvbXByXCIsXCJuZXcgU2suYnVpbHRpbnMuc2V0KFtdKVwiKTtyZXR1cm4gdGhpcy5jY29tcGdlbihcInNldFwiLGIsYS5nZW5lcmF0b3JzLDAsXG5hLmVsdCxudWxsLGEpfTthLnByb3RvdHlwZS5jY29tcGdlbj1mdW5jdGlvbihhLGIsYyxlLGYsaCxtKXt2YXIgZD10aGlzLm5ld0Jsb2NrKGErXCIgY29tcCBzdGFydFwiKSxnPXRoaXMubmV3QmxvY2soYStcIiBjb21wIHNraXBcIiksaz10aGlzLm5ld0Jsb2NrKGErXCIgY29tcCBhbmNob3JcIiksbj1jW2VdLHA9dGhpcy52ZXhwcihuLml0ZXIpO3A9dGhpcy5fZ3IoXCJpdGVyXCIsXCJTay5hYnN0ci5pdGVyKFwiLHAsXCIpXCIpO3ZhciBxO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhkKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLHAsXCIsIHRydWUpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24obSk7cD10aGlzLl9ncihcIm5leHRcIixcIiRyZXRcIik7dGhpcy5fanVtcHVuZGVmKHAsayk7dGhpcy52ZXhwcihuLnRhcmdldCxwKTt2YXIgdT1uLmlmcz9uLmlmcy5sZW5ndGg6MDtmb3IocT0wO3E8dTsrK3EpcD10aGlzLnZleHByKG4uaWZzW3FdKSx0aGlzLl9qdW1wZmFsc2UocCxkKTsrK2U8Yy5sZW5ndGgmJlxudGhpcy5jY29tcGdlbihhLGIsYyxlLGYsaCxtKTtlPj1jLmxlbmd0aCYmKGM9dGhpcy52ZXhwcihmKSxcImRpY3RcIj09PWE/KGE9dGhpcy52ZXhwcihoKSxsKGIsXCIubXAkYXNzX3N1YnNjcmlwdChcIixhLFwiLFwiLGMsXCIpO1wiKSk6XCJsaXN0XCI9PT1hP2woYixcIi52LnB1c2goXCIsYyxcIik7XCIpOlwic2V0XCI9PT1hJiZsKGIsXCIudi5tcCRhc3Nfc3Vic2NyaXB0KFwiLGMsXCIsIHRydWUpO1wiKSx0aGlzLl9qdW1wKGcpLHRoaXMuc2V0QmxvY2soZykpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhrKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY3lpZWxkPWZ1bmN0aW9uKGEpe2lmKHRoaXMudS5zdGUuYmxvY2tUeXBlIT09U2suU1lNVEFCX0NPTlNUUy5GdW5jdGlvbkJsb2NrKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiJ3lpZWxkJyBvdXRzaWRlIGZ1bmN0aW9uXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7dmFyIGI9XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjthLnZhbHVlJiYoYj10aGlzLnZleHByKGEudmFsdWUpKTtcbmE9dGhpcy5uZXdCbG9jayhcImFmdGVyIHlpZWxkXCIpO2woXCJyZXR1cm4gWy8qcmVzdW1lKi9cIixhLFwiLC8qcmV0Ki9cIixiLFwiXTtcIik7dGhpcy5zZXRCbG9jayhhKTtyZXR1cm5cIiRnZW4uZ2kkc2VudHZhbHVlXCJ9O2EucHJvdG90eXBlLmNjb21wYXJlPWZ1bmN0aW9uKGEpe3ZhciBiO1NrLmFzc2VydHMuYXNzZXJ0KGEub3BzLmxlbmd0aD09PWEuY29tcGFyYXRvcnMubGVuZ3RoKTt2YXIgYz10aGlzLnZleHByKGEubGVmdCk7dmFyIGQ9YS5vcHMubGVuZ3RoO3ZhciBlPXRoaXMubmV3QmxvY2soXCJkb25lXCIpO3ZhciBmPXRoaXMuX2dyKFwiY29tcGFyZXJlc1wiLFwibnVsbFwiKTtmb3IoYj0wO2I8ZDsrK2Ipe3ZhciBoPXRoaXMudmV4cHIoYS5jb21wYXJhdG9yc1tiXSk7bChcIiRyZXQgPSBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKFwiLGMsXCIsXCIsaCxcIiwnXCIsYS5vcHNbYl0ucHJvdG90eXBlLl9hc3RuYW1lLFwiJywgdHJ1ZSkpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7XG5sKGYsXCI9JHJldDtcIik7dGhpcy5fanVtcGZhbHNlKFwiJHJldFwiLGUpO2M9aH10aGlzLl9qdW1wKGUpO3RoaXMuc2V0QmxvY2soZSk7cmV0dXJuIGZ9O2EucHJvdG90eXBlLmNjYWxsPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmV4cHIoYS5mdW5jKTtsZXQgYz10aGlzLmN1bnBhY2tzdGFyc3RvYXJyYXkoYS5hcmdzLCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpO3ZhciBkPVwidW5kZWZpbmVkXCI7aWYoYS5rZXl3b3JkcyYmMDxhLmtleXdvcmRzLmxlbmd0aCl7bGV0IGM9ITE7ZD1bXTtmb3IobGV0IGIgb2YgYS5rZXl3b3Jkcyl7aWYoYyYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJBZHZhbmNlZCB1bnBhY2tpbmcgb2YgZnVuY3Rpb24gYXJndW1lbnRzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDJcIik7Yi5hcmc/KGQucHVzaChcIidcIitiLmFyZy52K1wiJ1wiKSxkLnB1c2godGhpcy52ZXhwcihiLnZhbHVlKSkpOmM9ITB9ZD1cIltcIitkLmpvaW4oXCIsXCIpK1xuXCJdXCI7aWYoYyl7ZD10aGlzLl9ncihcImtleXdvcmRBcmdzXCIsZCk7Zm9yKGxldCBjIG9mIGEua2V5d29yZHMpYy5hcmd8fChsKFwiJHJldCA9IFNrLmFic3RyLm1hcHBpbmdVbnBhY2tJbnRvS2V5d29yZEFycmF5KFwiLGQsXCIsXCIsdGhpcy52ZXhwcihjLnZhbHVlKSxcIixcIixiLFwiKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCkpfX1Tay5fX2Z1dHVyZV9fLnN1cGVyX2FyZ3MmJmEuZnVuYy5pZCYmXCJzdXBlclwiPT09YS5mdW5jLmlkLnYmJlwiW11cIj09PWMmJihsKCdpZiAodHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgfHwgc2VsZi50b1N0cmluZygpLmluZGV4T2YoXCJXaW5kb3dcIikgPiAwKSB7IHRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInN1cGVyKCk6IG5vIGFyZ3VtZW50c1wiKSB9OycpLGM9XCJbJGdibC5fX2NsYXNzX18sc2VsZl1cIik7bChcIiRyZXQgPSAoXCIsYixcIi50cCRjYWxsKT9cIixiLFwiLnRwJGNhbGwoXCIsYyxcIixcIixkLFwiKSA6IFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKFwiLFxuYixcIix1bmRlZmluZWQsdW5kZWZpbmVkLFwiLGQsXCIsXCIsYyxcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtyZXR1cm4gdGhpcy5fZ3IoXCJjYWxsXCIsXCIkcmV0XCIpfTthLnByb3RvdHlwZS5jc2xpY2U9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLlNsaWNlKTtpZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe3ZhciBiPWEubG93ZXI/dGhpcy52ZXhwcihhLmxvd2VyKTpcIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiO3ZhciBjPWEudXBwZXI/dGhpcy52ZXhwcihhLnVwcGVyKTpcIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwifWVsc2UgYj1hLmxvd2VyP3RoaXMudmV4cHIoYS5sb3dlcik6YS5zdGVwP1wiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI6XCJuZXcgU2suYnVpbHRpbi5pbnRfKDApXCIsYz1hLnVwcGVyP3RoaXMudmV4cHIoYS51cHBlcik6YS5zdGVwP1wiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI6XCJuZXcgU2suYnVpbHRpbi5pbnRfKDIxNDc0ODM2NDcpXCI7XG5hPWEuc3RlcD90aGlzLnZleHByKGEuc3RlcCk6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjtyZXR1cm4gdGhpcy5fZ3IoXCJzbGljZVwiLFwibmV3IFNrLmJ1aWx0aW5zWydzbGljZSddKFwiLGIsXCIsXCIsYyxcIixcIixhLFwiKVwiKX07YS5wcm90b3R5cGUuZXNsaWNlPWZ1bmN0aW9uKGEpe3ZhciBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBBcnJheSk7dmFyIGM9W107Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2godGhpcy52c2xpY2VzdWIoYVtiXSkpO3JldHVybiB0aGlzLl9ncihcImV4dHNsaWNlXCIsXCJuZXcgU2suYnVpbHRpbnNbJ3R1cGxlJ10oW1wiLGMsXCJdKVwiKX07YS5wcm90b3R5cGUudnNsaWNlc3ViPWZ1bmN0aW9uKGEpe3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkluZGV4OnZhciBiPXRoaXMudmV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TbGljZTpiPXRoaXMuY3NsaWNlKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRWxsaXBzaXM6U2suYXNzZXJ0cy5mYWlsKFwidG9kbyBjb21waWxlLmpzIEVsbGlwc2lzO1wiKTtcbmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRXh0U2xpY2U6Yj10aGlzLmVzbGljZShhLmRpbXMpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBzdWJzY3JpcHQga2luZFwiKX1yZXR1cm4gYn07YS5wcm90b3R5cGUudnNsaWNlPWZ1bmN0aW9uKGEsYixjLGUpe2E9dGhpcy52c2xpY2VzdWIoYSk7cmV0dXJuIHRoaXMuY2hhbmRsZXN1YnNjcihiLGMsYSxlKX07YS5wcm90b3R5cGUuY2hhbmRsZXN1YnNjcj1mdW5jdGlvbihhLGIsYyxlKXtpZihhPT09U2suYXN0bm9kZXMuTG9hZHx8YT09PVNrLmFzdG5vZGVzLkF1Z0xvYWQpcmV0dXJuIGwoXCIkcmV0ID0gU2suYWJzdHIub2JqZWN0R2V0SXRlbShcIixiLFwiLFwiLGMsXCIsIHRydWUpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKSx0aGlzLl9ncihcImxzdWJzY3JcIixcIiRyZXRcIik7YT09PVNrLmFzdG5vZGVzLlN0b3JlfHxhPT09U2suYXN0bm9kZXMuQXVnU3RvcmU/KGwoXCIkcmV0ID0gU2suYWJzdHIub2JqZWN0U2V0SXRlbShcIixcbmIsXCIsXCIsYyxcIixcIixlLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCkpOmE9PT1Tay5hc3Rub2Rlcy5EZWw/bChcIlNrLmFic3RyLm9iamVjdERlbEl0ZW0oXCIsYixcIixcIixjLFwiKTtcIik6U2suYXNzZXJ0cy5mYWlsKFwiaGFuZGxlc3Vic2NyIGZhaWxcIil9O2EucHJvdG90eXBlLmNib29sb3A9ZnVuY3Rpb24oYSl7dmFyIGIsYztTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuQm9vbE9wKTt2YXIgZD1hLm9wPT09U2suYXN0bm9kZXMuQW5kP3RoaXMuX2p1bXBmYWxzZTp0aGlzLl9qdW1wdHJ1ZTt2YXIgZT10aGlzLm5ld0Jsb2NrKFwiZW5kIG9mIGJvb2xvcFwiKTt2YXIgZj1hLnZhbHVlczt2YXIgaD1mLmxlbmd0aDtmb3IoYj0wO2I8aDsrK2IpYT10aGlzLnZleHByKGZbYl0pLDA9PT1iJiYoYz10aGlzLl9ncihcImJvb2xvcHN1Y2NcIixhKSksbChjLFwiPVwiLGEsXCI7XCIpLGQuY2FsbCh0aGlzLGEsZSk7dGhpcy5fanVtcChlKTt0aGlzLnNldEJsb2NrKGUpO1xucmV0dXJuIGN9O2EucHJvdG90eXBlLmNqb2luZWRzdHI9ZnVuY3Rpb24oYSl7bGV0IGI7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkpvaW5lZFN0cik7Zm9yKGxldCBjIG9mIGEudmFsdWVzKWE9dGhpcy52ZXhwcihjKSxiP2woYixcIj1cIixiLFwiLnNxJGNvbmNhdChcIixhLFwiKTtcIik6Yj10aGlzLl9ncihcImpvaW5lZHN0clwiLGEpO2J8fChiPVwiU2suYnVpbHRpbi5zdHIuJGVtcHR5c3RyXCIpO3JldHVybiBifTthLnByb3RvdHlwZS5jZm9ybWF0dGVkdmFsdWU9ZnVuY3Rpb24oYSl7bGV0IGI9dGhpcy52ZXhwcihhLnZhbHVlKTtzd2l0Y2goYS5jb252ZXJzaW9uKXtjYXNlIFwic1wiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwibmV3IFNrLmJ1aWx0aW4uc3RyKFwiLGIsXCIpXCIpO2JyZWFrO2Nhc2UgXCJhXCI6Yj10aGlzLl9ncihcInZhbHVlXCIsXCJTay5idWlsdGluLmFzY2lpKFwiLGIsXCIpXCIpO2JyZWFrO2Nhc2UgXCJyXCI6Yj10aGlzLl9ncihcInZhbHVlXCIsXCJTay5idWlsdGluLnJlcHIoXCIsXG5iLFwiKVwiKX1hPWEuZm9ybWF0X3NwZWM/dGhpcy52ZXhwcihhLmZvcm1hdF9zcGVjKTpcIlNrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0clwiO3JldHVybiB0aGlzLl9ncihcImZvcm1hdHRlZFwiLFwiU2suYWJzdHIub2JqZWN0Rm9ybWF0KFwiK2IrXCIsXCIrYStcIilcIil9O2EucHJvdG90eXBlLnZleHByPWZ1bmN0aW9uKGEsYixjLGspe3ZhciBkO2EubGluZW5vPnRoaXMudS5saW5lbm8mJih0aGlzLnUubGluZW5vPWEubGluZW5vLHRoaXMudS5saW5lbm9TZXQ9ITEpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDpyZXR1cm4gdGhpcy5jYm9vbG9wKGEpO2Nhc2UgU2suYXN0bm9kZXMuQmluT3A6cmV0dXJuIHRoaXMuX2dyKFwiYmlub3BcIixcIlNrLmFic3RyLm51bWJlckJpbk9wKFwiLHRoaXMudmV4cHIoYS5sZWZ0KSxcIixcIix0aGlzLnZleHByKGEucmlnaHQpLFwiLCdcIixhLm9wLnByb3RvdHlwZS5fYXN0bmFtZSxcIicpXCIpO2Nhc2UgU2suYXN0bm9kZXMuVW5hcnlPcDpyZXR1cm4gdGhpcy5fZ3IoXCJ1bmFyeW9wXCIsXG5cIlNrLmFic3RyLm51bWJlclVuYXJ5T3AoXCIsdGhpcy52ZXhwcihhLm9wZXJhbmQpLFwiLCdcIixhLm9wLnByb3RvdHlwZS5fYXN0bmFtZSxcIicpXCIpO2Nhc2UgU2suYXN0bm9kZXMuTGFtYmRhOnJldHVybiB0aGlzLmNsYW1iZGEoYSk7Y2FzZSBTay5hc3Rub2Rlcy5JZkV4cDpyZXR1cm4gdGhpcy5jaWZleHAoYSk7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0OnJldHVybiB0aGlzLmNkaWN0KGEpO2Nhc2UgU2suYXN0bm9kZXMuTGlzdENvbXA6cmV0dXJuIHRoaXMuY2xpc3Rjb21wKGEpO2Nhc2UgU2suYXN0bm9kZXMuRGljdENvbXA6cmV0dXJuIHRoaXMuY2RpY3Rjb21wKGEpO2Nhc2UgU2suYXN0bm9kZXMuU2V0Q29tcDpyZXR1cm4gdGhpcy5jc2V0Y29tcChhKTtjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDpyZXR1cm4gdGhpcy5jZ2VuZXhwKGEpO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6cmV0dXJuIHRoaXMuY3lpZWxkKGEpO2Nhc2UgU2suYXN0bm9kZXMuQ29tcGFyZTpyZXR1cm4gdGhpcy5jY29tcGFyZShhKTtcbmNhc2UgU2suYXN0bm9kZXMuQ2FsbDpyZXR1cm4gYj10aGlzLmNjYWxsKGEpLHRoaXMuYW5ub3RhdGVTb3VyY2UoYSksYjtjYXNlIFNrLmFzdG5vZGVzLk51bTppZihcIm51bWJlclwiPT09dHlwZW9mIGEubilyZXR1cm4gYS5uO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKXJldHVybiB0aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLmxuZygnXCIrYS5uLnYudG9TdHJpbmcoKStcIicpXCIpO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XylyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGEubi52P3RoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uaW50XyhcIithLm4uditcIilcIik6dGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5pbnRfKCdcIithLm4udi50b1N0cmluZygpK1wiJylcIik7aWYoYS5uIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGE9MD09PWEubi52JiYtSW5maW5pdHk9PT0xL2Eubi52P1wiLTBcIjphLm4udix0aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLmZsb2F0XyhcIitcbmErXCIpXCIpO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uY29tcGxleClyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5jb21wbGV4KFwiKygwPT09YS5uLnJlYWwmJi1JbmZpbml0eT09PTEvYS5uLnJlYWw/XCItMFwiOmEubi5yZWFsKStcIiwgXCIrKDA9PT1hLm4uaW1hZyYmLUluZmluaXR5PT09MS9hLm4uaW1hZz9cIi0wXCI6YS5uLmltYWcpK1wiKVwiKTtTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgTnVtIHR5cGVcIik7Y2FzZSBTay5hc3Rub2Rlcy5CeXRlczppZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2I9W107YT1hLnMuJGpzc3RyKCk7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYS5jaGFyQ29kZUF0KGMpKTtyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5ieXRlcyhbXCIsYi5qb2luKFwiLCBcIiksXCJdKVwiKX1jYXNlIFNrLmFzdG5vZGVzLlN0cjpyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5zdHIoXCIsXG5mKGEucy4kanNzdHIoKSksXCIpXCIpO2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOmEuY3R4IT09U2suYXN0bm9kZXMuQXVnTG9hZCYmYS5jdHghPT1Tay5hc3Rub2Rlcy5BdWdTdG9yZSYmKGQ9dGhpcy52ZXhwcihhLnZhbHVlKSk7az1hLmF0dHIuJHIoKS52O2s9ay5zdWJzdHJpbmcoMSxrLmxlbmd0aC0xKTtrPWUodGhpcy51LnByaXZhdGVfLG5ldyBTay5idWlsdGluLnN0cihrKSkudjtrPXRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uc3RyKCdcIitrK1wiJylcIik7c3dpdGNoKGEuY3R4KXtjYXNlIFNrLmFzdG5vZGVzLkF1Z0xvYWQ6cmV0dXJuIGwoXCIkcmV0ID0gXCIsYyxcIi50cCRnZXRhdHRyKFwiLGssXCIsIHRydWUpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oYSksbChcIlxcbmlmICgkcmV0ID09PSB1bmRlZmluZWQpIHtcIiksbChcIlxcbnRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiLGMsJy5zayRhdHRyRXJyb3IoKSArIFwiIGhhcyBubyBhdHRyaWJ1dGUgXFwnXCIgKyAnLFxuaywnLiRqc3N0cigpICsgXCJcXCdcIik7JyksbChcIlxcbn07XCIpLHRoaXMuX2dyKFwibGF0dHJcIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOnJldHVybiBsKFwiJHJldCA9IFwiLGQsXCIudHAkZ2V0YXR0cihcIixrLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpLGwoXCJcXG5pZiAoJHJldCA9PT0gdW5kZWZpbmVkKSB7XCIpLGwoXCJcXG50aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIixkLCcuc2skYXR0ckVycm9yKCkgKyBcIiBoYXMgbm8gYXR0cmlidXRlIFxcJ1wiICsgJyxrLCcuJGpzc3RyKCkgKyBcIlxcJ1wiKTsnKSxsKFwiXFxufTtcIiksdGhpcy5fZ3IoXCJsYXR0clwiLFwiJHJldFwiKTtjYXNlIFNrLmFzdG5vZGVzLkF1Z1N0b3JlOmwoXCIkcmV0ID0gdW5kZWZpbmVkO1wiKTtsKFwiaWYoXCIsYixcIiE9PXVuZGVmaW5lZCl7XCIpO2woXCIkcmV0ID0gXCIsYyxcIi50cCRzZXRhdHRyKFwiLGssXCIsXCIsYixcIiwgdHJ1ZSk7XCIpO2woXCJ9XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztcbmNhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChcIiRyZXQgPSBcIixkLFwiLnRwJHNldGF0dHIoXCIsayxcIixcIixiLFwiLCB0cnVlKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVsOmwoXCIkcmV0ID0gXCIsZCxcIi50cCRzZXRhdHRyKFwiLGssXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgYXR0cmlidXRlIGV4cHJlc3Npb25cIil9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6c3dpdGNoKGEuY3R4KXtjYXNlIFNrLmFzdG5vZGVzLkF1Z0xvYWQ6cmV0dXJuIGwoXCIkcmV0ID0gU2suYWJzdHIub2JqZWN0R2V0SXRlbShcIixjLFwiLFwiLGssXCIsIHRydWUpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oYSksdGhpcy5fZ3IoXCJnaXRlbVwiLFwiJHJldFwiKTtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTpjYXNlIFNrLmFzdG5vZGVzLkRlbDpyZXR1cm4gdGhpcy52c2xpY2UoYS5zbGljZSxcbmEuY3R4LHRoaXMudmV4cHIoYS52YWx1ZSksYik7Y2FzZSBTay5hc3Rub2Rlcy5BdWdTdG9yZTpsKFwiJHJldD11bmRlZmluZWQ7XCIpO2woXCJpZihcIixiLFwiIT09dW5kZWZpbmVkKXtcIik7bChcIiRyZXQ9U2suYWJzdHIub2JqZWN0U2V0SXRlbShcIixjLFwiLFwiLGssXCIsXCIsYixcIiwgdHJ1ZSlcIik7bChcIn1cIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBzdWJzY3JpcHQgZXhwcmVzc2lvblwiKX1icmVhaztjYXNlIFNrLmFzdG5vZGVzLk5hbWU6cmV0dXJuIHRoaXMubmFtZW9wKGEuaWQsYS5jdHgsYik7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6aWYoYS5jdHg9PT1Tay5hc3Rub2Rlcy5TdG9yZXx8YS5jdHg9PT1Tay5hc3Rub2Rlcy5BdWdTdG9yZXx8YS5jdHg9PT1Tay5hc3Rub2Rlcy5EZWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJjYW4gbm90IGFzc2lnbiB0byBhIGNvbnN0YW50IG5hbWVcIik7XG5zd2l0Y2goYS52YWx1ZSl7Y2FzZSBTay5idWlsdGluLm5vbmUubm9uZSQ6cmV0dXJuXCJTay5idWlsdGluLm5vbmUubm9uZSRcIjtjYXNlIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDpyZXR1cm5cIlNrLmJ1aWx0aW4uYm9vbC50cnVlJFwiO2Nhc2UgU2suYnVpbHRpbi5ib29sLmZhbHNlJDpyZXR1cm5cIlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSRcIjtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgbmFtZWQgY29uc3RhbnRcIil9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0OnJldHVybiB0aGlzLmN0dXBsZWxpc3RvcnNldChhLGIsXCJsaXN0XCIpO2Nhc2UgU2suYXN0bm9kZXMuVHVwbGU6cmV0dXJuIHRoaXMuY3R1cGxlbGlzdG9yc2V0KGEsYixcInR1cGxlXCIpO2Nhc2UgU2suYXN0bm9kZXMuU2V0OnJldHVybiB0aGlzLmN0dXBsZWxpc3RvcnNldChhLGIsXCJzZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5TdGFycmVkOnN3aXRjaChhLmN0eCl7Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInN0YXJyZWQgYXNzaWdubWVudCB0YXJnZXQgbXVzdCBiZSBpbiBhIGxpc3Qgb3IgdHVwbGVcIixcbnRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJjYW4ndCB1c2Ugc3RhcnJlZCBleHByZXNzaW9uIGhlcmVcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTt9Y2FzZSBTay5hc3Rub2Rlcy5Kb2luZWRTdHI6cmV0dXJuIHRoaXMuY2pvaW5lZHN0cihhKTtjYXNlIFNrLmFzdG5vZGVzLkZvcm1hdHRlZFZhbHVlOnJldHVybiB0aGlzLmNmb3JtYXR0ZWR2YWx1ZShhKTtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlIFwiK2EuY29uc3RydWN0b3IubmFtZStcIiB2ZXhwclwiKX19O2EucHJvdG90eXBlLnZzZXFleHByPWZ1bmN0aW9uKGEsYil7dmFyIGM7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwPT09Ynx8YS5sZW5ndGg9PT1iLmxlbmd0aCk7dmFyIGQ9W107Zm9yKGM9MDtjPGEubGVuZ3RoOysrYylkLnB1c2godGhpcy52ZXhwcihhW2NdLHZvaWQgMD09PWI/dm9pZCAwOmJbY10pKTtyZXR1cm4gZH07YS5wcm90b3R5cGUuY2F1Z2Fzc2lnbj1cbmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5BdWdBc3NpZ24pO3ZhciBiPWEudGFyZ2V0O3N3aXRjaChiLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTp2YXIgYz10aGlzLnZleHByKGIudmFsdWUpO2I9bmV3IFNrLmFzdG5vZGVzLkF0dHJpYnV0ZShiLnZhbHVlLGIuYXR0cixTay5hc3Rub2Rlcy5BdWdMb2FkLGIubGluZW5vLGIuY29sX29mZnNldCk7dmFyIGQ9dGhpcy52ZXhwcihiLHZvaWQgMCxjKTt2YXIgZT10aGlzLnZleHByKGEudmFsdWUpO2E9dGhpcy5fZ3IoXCJpbnBsYmlub3BhdHRyXCIsXCJTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoXCIsZCxcIixcIixlLFwiLCdcIixhLm9wLnByb3RvdHlwZS5fYXN0bmFtZSxcIicpXCIpO2IuY3R4PVNrLmFzdG5vZGVzLkF1Z1N0b3JlO3JldHVybiB0aGlzLnZleHByKGIsYSxjKTtjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDpjPXRoaXMudmV4cHIoYi52YWx1ZSk7dmFyIGY9XG50aGlzLnZzbGljZXN1YihiLnNsaWNlKTtiPW5ldyBTay5hc3Rub2Rlcy5TdWJzY3JpcHQoYi52YWx1ZSxmLFNrLmFzdG5vZGVzLkF1Z0xvYWQsYi5saW5lbm8sYi5jb2xfb2Zmc2V0KTtkPXRoaXMudmV4cHIoYix2b2lkIDAsYyxmKTtlPXRoaXMudmV4cHIoYS52YWx1ZSk7YT10aGlzLl9ncihcImlucGxiaW5vcHN1YnNjclwiLFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKFwiLGQsXCIsXCIsZSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtiLmN0eD1Tay5hc3Rub2Rlcy5BdWdTdG9yZTtyZXR1cm4gdGhpcy52ZXhwcihiLGEsYyxmKTtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6cmV0dXJuIGM9dGhpcy5uYW1lb3AoYi5pZCxTay5hc3Rub2Rlcy5Mb2FkKSxlPXRoaXMudmV4cHIoYS52YWx1ZSksYT10aGlzLl9ncihcImlucGxiaW5vcFwiLFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKFwiLGMsXCIsXCIsZSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKSx0aGlzLm5hbWVvcChiLmlkLFxuU2suYXN0bm9kZXMuU3RvcmUsYSk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBpbiBhdWdhc3NpZ25cIil9fTthLnByb3RvdHlwZS5leHByQ29uc3RhbnQ9ZnVuY3Rpb24oYSl7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuTnVtOnJldHVybiBTay5taXNjZXZhbC5pc1RydWUoYS5uKT8xOjA7Y2FzZSBTay5hc3Rub2Rlcy5TdHI6cmV0dXJuIFNrLm1pc2NldmFsLmlzVHJ1ZShhLnMpPzE6MDtkZWZhdWx0OnJldHVybi0xfX07YS5wcm90b3R5cGUubmV3QmxvY2s9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy51LmJsb2NrbnVtKys7dGhpcy51LmJsb2Nrc1tiXT1bXTt0aGlzLnUuYmxvY2tzW2JdLl9uYW1lPWF8fFwiPHVubmFtZWQ+XCI7dGhpcy51LmJsb2Nrc1tiXS5fbmV4dD1udWxsO3JldHVybiBifTthLnByb3RvdHlwZS5zZXRCbG9jaz1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgwPD1hJiZhPHRoaXMudS5ibG9ja251bSk7dGhpcy51LmN1cmJsb2NrPVxuYX07YS5wcm90b3R5cGUucHVzaEJyZWFrQmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5icmVha0Jsb2Nrcy5wdXNoKGEpfTthLnByb3RvdHlwZS5wb3BCcmVha0Jsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmJyZWFrQmxvY2tzLnBvcCgpfTthLnByb3RvdHlwZS5wdXNoQ29udGludWVCbG9jaz1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgwPD1hJiZhPHRoaXMudS5ibG9ja251bSk7dGhpcy51LmNvbnRpbnVlQmxvY2tzLnB1c2goYSl9O2EucHJvdG90eXBlLnBvcENvbnRpbnVlQmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnUuY29udGludWVCbG9ja3MucG9wKCl9O2EucHJvdG90eXBlLnB1c2hFeGNlcHRCbG9jaz1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgwPD1hJiZhPHRoaXMudS5ibG9ja251bSk7dGhpcy51LmV4Y2VwdEJsb2Nrcy5wdXNoKGEpfTthLnByb3RvdHlwZS5wb3BFeGNlcHRCbG9jaz1mdW5jdGlvbigpe3RoaXMudS5leGNlcHRCbG9ja3MucG9wKCl9O1xuYS5wcm90b3R5cGUucHVzaEZpbmFsbHlCbG9jaz1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgwPD1hJiZhPHRoaXMudS5ibG9ja251bSk7U2suYXNzZXJ0cy5hc3NlcnQodGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aD09PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgpO3RoaXMudS5maW5hbGx5QmxvY2tzLnB1c2goe2JsazphLGJyZWFrRGVwdGg6dGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aH0pfTthLnByb3RvdHlwZS5wb3BGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnUuZmluYWxseUJsb2Nrcy5wb3AoKX07YS5wcm90b3R5cGUucGVla0ZpbmFsbHlCbG9jaz1mdW5jdGlvbigpe3JldHVybiAwPHRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aD90aGlzLnUuZmluYWxseUJsb2Nrc1t0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGgtMV06dm9pZCAwfTthLnByb3RvdHlwZS5zZXR1cEV4Y2VwdD1mdW5jdGlvbihhKXtsKFwiJGV4Yy5wdXNoKFwiLGEsXCIpO1wiKX07YS5wcm90b3R5cGUuZW5kRXhjZXB0PVxuZnVuY3Rpb24oKXtsKFwiJGV4Yy5wb3AoKTtcIil9O2EucHJvdG90eXBlLm91dHB1dExvY2Fscz1mdW5jdGlvbihhKXt2YXIgYixjPXt9O2ZvcihiPTA7YS5hcmduYW1lcyYmYjxhLmFyZ25hbWVzLmxlbmd0aDsrK2IpY1thLmFyZ25hbWVzW2JdXT0hMDthLmxvY2FsbmFtZXMuc29ydCgpO3ZhciBkPVtdO2ZvcihiPTA7YjxhLmxvY2FsbmFtZXMubGVuZ3RoOysrYil7dmFyIGU9YS5sb2NhbG5hbWVzW2JdO3ZvaWQgMD09PWNbZV0mJihkLnB1c2goZSksY1tlXT0hMCl9cmV0dXJuIDA8ZC5sZW5ndGg/XCJ2YXIgXCIrZC5qb2luKFwiLFwiKStcIjsgLyogbG9jYWxzICovXCI6XCJcIn07YS5wcm90b3R5cGUub3V0cHV0U3VzcGVuc2lvbkhlbHBlcnM9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPWEubG9jYWxuYW1lcy5jb25jYXQoYS50ZW1wc1RvU2F2ZSksZT17fSxmPWEuc3RlLmJsb2NrVHlwZT09PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayYmYS5zdGUuY2hpbGRIYXNGcmVlLGg9KDA8ZC5sZW5ndGg/XG5cInZhciBcIitkLmpvaW4oXCIsXCIpK1wiO1wiOlwiXCIpK1widmFyICR3YWtlRnJvbVN1c3BlbnNpb24gPSBmdW5jdGlvbigpIHt2YXIgc3VzcCA9IFwiK2Euc2NvcGVuYW1lK1wiLiR3YWtpbmdTdXNwZW5zaW9uOyBcIithLnNjb3BlbmFtZStcIi4kd2FraW5nU3VzcGVuc2lvbiA9IHVuZGVmaW5lZDskYmxrPXN1c3AuJGJsazsgJGxvYz1zdXNwLiRsb2M7ICRnYmw9c3VzcC4kZ2JsOyAkZXhjPXN1c3AuJGV4YzsgJGVycj1zdXNwLiRlcnI7ICRwb3N0ZmluYWxseT1zdXNwLiRwb3N0ZmluYWxseTskY3VyckxpbmVObz1zdXNwLiRsaW5lbm87ICRjdXJyQ29sTm89c3VzcC4kY29sbm87IFNrLmxhc3RZaWVsZD1EYXRlLm5vdygpO1wiKyhmP1wiJGNlbGw9c3VzcC4kY2VsbDtcIjpcIlwiKTtmb3IoYj0wO2I8ZC5sZW5ndGg7YisrKXt2YXIgbD1kW2JdO3ZvaWQgMD09PWVbbF0mJihoKz1sK1wiPXN1c3AuJHRtcHMuXCIrbCtcIjtcIixlW2xdPSEwKX1oKz1cInRyeSB7ICRyZXQ9c3VzcC5jaGlsZC5yZXN1bWUoKTsgfSBjYXRjaChlcnIpIHsgaWYgKCEoZXJyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uKSkgeyBlcnIgPSBuZXcgU2suYnVpbHRpbi5FeHRlcm5hbEVycm9yKGVycik7IH0gZXJyLnRyYWNlYmFjay5wdXNoKHtsaW5lbm86ICRjdXJyTGluZU5vLCBjb2xubzogJGN1cnJDb2xObywgZmlsZW5hbWU6ICdcIitcbnRoaXMuZmlsZW5hbWUrXCInfSk7IGlmKCRleGMubGVuZ3RoPjApIHsgJGVycj1lcnI7ICRibGs9JGV4Yy5wb3AoKTsgfSBlbHNlIHsgdGhyb3cgZXJyOyB9IH19O1wiO2grPVwidmFyICRzYXZlU3VzcGVuc2lvbiA9IGZ1bmN0aW9uKCRjaGlsZCwgJGZpbGVuYW1lLCAkbGluZW5vLCAkY29sbm8pIHt2YXIgc3VzcCA9IG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKCk7IHN1c3AuY2hpbGQ9JGNoaWxkO3N1c3AucmVzdW1lPWZ1bmN0aW9uKCl7XCIrYS5zY29wZW5hbWUrXCIuJHdha2luZ1N1c3BlbnNpb249c3VzcDsgcmV0dXJuIFwiK2Euc2NvcGVuYW1lK1wiKFwiKyhhLnN0ZS5nZW5lcmF0b3I/XCIkZ2VuXCI6XCJcIikrXCIpOyB9O3N1c3AuZGF0YT1zdXNwLmNoaWxkLmRhdGE7c3VzcC4kYmxrPSRibGs7c3VzcC4kbG9jPSRsb2M7c3VzcC4kZ2JsPSRnYmw7c3VzcC4kZXhjPSRleGM7c3VzcC4kZXJyPSRlcnI7c3VzcC4kcG9zdGZpbmFsbHk9JHBvc3RmaW5hbGx5O3N1c3AuJGZpbGVuYW1lPSRmaWxlbmFtZTtzdXNwLiRsaW5lbm89JGxpbmVubztzdXNwLiRjb2xubz0kY29sbm87c3VzcC5vcHRpb25hbD1zdXNwLmNoaWxkLm9wdGlvbmFsO1wiK1xuKGY/XCJzdXNwLiRjZWxsPSRjZWxsO1wiOlwiXCIpO2U9e307Zm9yKGI9MDtiPGQubGVuZ3RoO2IrKylsPWRbYl0sdm9pZCAwPT09ZVtsXSYmKGMucHVzaCgnXCInK2wrJ1wiOicrbCksZVtsXT0hMCk7cmV0dXJuIGgrPVwic3VzcC4kdG1wcz17XCIrYy5qb2luKFwiLFwiKStcIn07cmV0dXJuIHN1c3A7fTtcIn07YS5wcm90b3R5cGUub3V0cHV0QWxsVW5pdHM9ZnVuY3Rpb24oKXt2YXIgYSxiLGM9XCJcIjtmb3IoYj0wO2I8dGhpcy5hbGxVbml0cy5sZW5ndGg7KytiKXt2YXIgZT10aGlzLmFsbFVuaXRzW2JdO2MrPWUucHJlZml4Q29kZTtjKz10aGlzLm91dHB1dExvY2FscyhlKTtlLmRvZXNTdXNwZW5kJiYoYys9dGhpcy5vdXRwdXRTdXNwZW5zaW9uSGVscGVycyhlKSk7Yys9ZS52YXJEZWNsc0NvZGU7Yys9ZS5zd2l0Y2hDb2RlO3ZhciBmPWUuYmxvY2tzO3ZhciBoPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGE9MDthPGYubGVuZ3RoOysrYSl7dmFyIGw9YTtpZighKGwgaW4gaCkpZm9yKDs7KWlmKGhbbF09XG4hMCxjKz1cImNhc2UgXCIrbCtcIjogLyogLS0tIFwiK2ZbbF0uX25hbWUrXCIgLS0tICovXCIsYys9ZltsXS5qb2luKFwiXCIpLG51bGwhPT1mW2xdLl9uZXh0KWlmKGZbbF0uX25leHQgaW4gaCl7Yys9XCIvKiBqdW1wICovIGNvbnRpbnVlO1wiO2JyZWFrfWVsc2UgYys9XCIvKiBhbGxvd2luZyBjYXNlIGZhbGx0aHJvdWdoICovXCIsbD1mW2xdLl9uZXh0O2Vsc2V7Yys9XCJ0aHJvdyBuZXcgU2suYnVpbHRpbi5TeXN0ZW1FcnJvcignaW50ZXJuYWwgZXJyb3I6IHVudGVybWluYXRlZCBibG9jaycpO1wiO2JyZWFrfX1jKz1lLnN1ZmZpeENvZGV9cmV0dXJuIGN9O2EucHJvdG90eXBlLmNpZj1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuSWYpO3ZhciBjPXRoaXMuZXhwckNvbnN0YW50KGEudGVzdCk7aWYoMD09PWMpYS5vcmVsc2UmJjA8YS5vcmVsc2UubGVuZ3RoJiZ0aGlzLnZzZXFzdG10KGEub3JlbHNlKTtlbHNlIGlmKDE9PT1jKXRoaXMudnNlcXN0bXQoYS5ib2R5KTtcbmVsc2V7dmFyIGQ9dGhpcy5uZXdCbG9jayhcImVuZCBvZiBpZlwiKTthLm9yZWxzZSYmMDxhLm9yZWxzZS5sZW5ndGgmJihiPXRoaXMubmV3QmxvY2soXCJuZXh0IGJyYW5jaCBvZiBpZlwiKSk7Yz10aGlzLnZleHByKGEudGVzdCk7YS5vcmVsc2UmJjA8YS5vcmVsc2UubGVuZ3RoPyh0aGlzLl9qdW1wZmFsc2UoYyxiKSx0aGlzLnZzZXFzdG10KGEuYm9keSksdGhpcy5fanVtcChkKSx0aGlzLnNldEJsb2NrKGIpLHRoaXMudnNlcXN0bXQoYS5vcmVsc2UpKToodGhpcy5fanVtcGZhbHNlKGMsZCksdGhpcy52c2Vxc3RtdChhLmJvZHkpKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCl9fTthLnByb3RvdHlwZS5jd2hpbGU9ZnVuY3Rpb24oYSl7aWYoMD09PXRoaXMuZXhwckNvbnN0YW50KGEudGVzdCkpYS5vcmVsc2UmJnRoaXMudnNlcXN0bXQoYS5vcmVsc2UpO2Vsc2V7dmFyIGI9dGhpcy5uZXdCbG9jayhcIndoaWxlIHRlc3RcIik7dGhpcy5fanVtcChiKTt0aGlzLnNldEJsb2NrKGIpO1xudmFyIGM9dGhpcy5uZXdCbG9jayhcImFmdGVyIHdoaWxlXCIpO3ZhciBkPTA8YS5vcmVsc2UubGVuZ3RoP3RoaXMubmV3QmxvY2soXCJ3aGlsZSBvcmVsc2VcIik6bnVsbDt2YXIgZT10aGlzLm5ld0Jsb2NrKFwid2hpbGUgYm9keVwiKTt0aGlzLmFubm90YXRlU291cmNlKGEpO3RoaXMuX2p1bXBmYWxzZSh0aGlzLnZleHByKGEudGVzdCksZD9kOmMpO3RoaXMuX2p1bXAoZSk7dGhpcy5wdXNoQnJlYWtCbG9jayhjKTt0aGlzLnB1c2hDb250aW51ZUJsb2NrKGIpO3RoaXMuc2V0QmxvY2soZSk7KFNrLmRlYnVnZ2luZ3x8U2sua2lsbGFibGVXaGlsZSkmJnRoaXMudS5jYW5TdXNwZW5kJiYoZT10aGlzLm5ld0Jsb2NrKFwiZGVidWcgYnJlYWtwb2ludCBmb3IgbGluZSBcIithLmxpbmVubyksbChcImlmIChTay5icmVha3BvaW50cygnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKSkge1wiLFwidmFyICRzdXNwID0gJHNhdmVTdXNwZW5zaW9uKHtkYXRhOiB7dHlwZTogJ1NrLmRlbGF5J30sIHJlc3VtZTogZnVuY3Rpb24oKSB7fX0sICdcIitcbnRoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIik7XCIsXCIkc3VzcC4kYmxrID0gXCIrZStcIjtcIixcIiRzdXNwLm9wdGlvbmFsID0gdHJ1ZTtcIixcInJldHVybiAkc3VzcDtcIixcIn1cIiksdGhpcy5fanVtcChlKSx0aGlzLnNldEJsb2NrKGUpLHRoaXMudS5kb2VzU3VzcGVuZD0hMCk7dGhpcy52c2Vxc3RtdChhLmJvZHkpO3RoaXMuX2p1bXAoYik7dGhpcy5wb3BDb250aW51ZUJsb2NrKCk7dGhpcy5wb3BCcmVha0Jsb2NrKCk7MDxhLm9yZWxzZS5sZW5ndGgmJih0aGlzLnNldEJsb2NrKGQpLHRoaXMudnNlcXN0bXQoYS5vcmVsc2UpLHRoaXMuX2p1bXAoYykpO3RoaXMuc2V0QmxvY2soYyl9fTthLnByb3RvdHlwZS5jZm9yPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmV3QmxvY2soXCJmb3Igc3RhcnRcIiksYz10aGlzLm5ld0Jsb2NrKFwiZm9yIGNsZWFudXBcIiksZD10aGlzLm5ld0Jsb2NrKFwiZm9yIGVuZFwiKTt0aGlzLnB1c2hCcmVha0Jsb2NrKGQpO3RoaXMucHVzaENvbnRpbnVlQmxvY2soYik7XG52YXIgZT10aGlzLnZleHByKGEuaXRlcik7aWYodGhpcy51LnN0ZS5nZW5lcmF0b3Ipe3ZhciBmPVwiJGxvYy5cIit0aGlzLmdlbnN5bShcIml0ZXJcIik7bChmLFwiPVNrLmFic3RyLml0ZXIoXCIsZSxcIik7XCIpfWVsc2UgZj10aGlzLl9ncihcIml0ZXJcIixcIlNrLmFic3RyLml0ZXIoXCIsZSxcIilcIiksdGhpcy51LnRlbXBzVG9TYXZlLnB1c2goZik7dGhpcy5fanVtcChiKTt0aGlzLnNldEJsb2NrKGIpO2woXCIkcmV0ID0gU2suYWJzdHIuaXRlcm5leHQoXCIsZix0aGlzLnUuY2FuU3VzcGVuZD9cIiwgdHJ1ZVwiOlwiLCBmYWxzZVwiLFwiKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2Y9dGhpcy5fZ3IoXCJuZXh0XCIsXCIkcmV0XCIpO3RoaXMuX2p1bXB1bmRlZihmLGMpO3RoaXMudmV4cHIoYS50YXJnZXQsZik7KFNrLmRlYnVnZ2luZ3x8U2sua2lsbGFibGVGb3IpJiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGY9dGhpcy5uZXdCbG9jayhcImRlYnVnIGJyZWFrcG9pbnQgZm9yIGxpbmUgXCIrYS5saW5lbm8pLGwoXCJpZiAoU2suYnJlYWtwb2ludHMoJ1wiK1xudGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKSkge1wiLFwidmFyICRzdXNwID0gJHNhdmVTdXNwZW5zaW9uKHtkYXRhOiB7dHlwZTogJ1NrLmRlbGF5J30sIHJlc3VtZTogZnVuY3Rpb24oKSB7fX0sICdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2YrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpLHRoaXMuX2p1bXAoZiksdGhpcy5zZXRCbG9jayhmKSx0aGlzLnUuZG9lc1N1c3BlbmQ9ITApO3RoaXMudnNlcXN0bXQoYS5ib2R5KTt0aGlzLl9qdW1wKGIpO3RoaXMuc2V0QmxvY2soYyk7dGhpcy5wb3BDb250aW51ZUJsb2NrKCk7dGhpcy5wb3BCcmVha0Jsb2NrKCk7dGhpcy52c2Vxc3RtdChhLm9yZWxzZSk7dGhpcy5fanVtcChkKTt0aGlzLnNldEJsb2NrKGQpfTthLnByb3RvdHlwZS5jcmFpc2U9ZnVuY3Rpb24oYSl7aWYoYS5leGMpe3ZhciBiPVxudGhpcy5fZ3IoXCJleGNcIix0aGlzLnZleHByKGEuZXhjKSksYz10aGlzLm5ld0Jsb2NrKFwiZXhjZXB0aW9uIG5vdyBpbnN0YW50aWF0ZWRcIiksZD10aGlzLl9ncihcImlzY2xhc3NcIixiK1wiLnByb3RvdHlwZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvblwiKTt0aGlzLl9qdW1wZmFsc2UoZCxjKTthLmluc3Q/KGQ9dGhpcy5fZ3IoXCJpbnN0XCIsdGhpcy52ZXhwcihhLmluc3QpKSxsKFwiaWYoIShcIixkLFwiIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpIHtcIixkLFwiPSBuZXcgU2suYnVpbHRpbi50dXBsZShbXCIsZCxcIl0pO1wiLFwifVwiKSxsKFwiJHJldCA9IFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShcIixiLFwiLFwiLGQsXCIudik7XCIpKTpsKFwiJHJldCA9IFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmQoXCIsYixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtsKGIsXCI9JHJldDtcIik7dGhpcy5fanVtcChjKTt0aGlzLnNldEJsb2NrKGMpO2woXCJpZiAoXCIsYixcblwiIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uKSB7dGhyb3cgXCIsYixcIjt9IGVsc2Uge3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcignZXhjZXB0aW9ucyBtdXN0IGRlcml2ZSBmcm9tIEJhc2VFeGNlcHRpb24nKTt9O1wiKX1lbHNlIGwoXCJ0aHJvdyAkZXJyO1wiKX07YS5wcm90b3R5cGUub3V0cHV0RmluYWxseUNhc2NhZGU9ZnVuY3Rpb24oYSl7aWYoMD09dGhpcy51LmZpbmFsbHlCbG9ja3MubGVuZ3RoKWwoXCJpZigkcG9zdGZpbmFsbHkhPT11bmRlZmluZWQpIHsgaWYgKCRwb3N0ZmluYWxseS5yZXR1cm5pbmcpIHsgcmV0dXJuICRwb3N0ZmluYWxseS5yZXR1cm5pbmc7IH0gZWxzZSB7ICRibGs9JHBvc3RmaW5hbGx5LmdvdG9CbG9jazsgJHBvc3RmaW5hbGx5PXVuZGVmaW5lZDsgY29udGludWU7IH0gfVwiKTtlbHNle3ZhciBiPXRoaXMucGVla0ZpbmFsbHlCbG9jaygpO2woXCJpZigkcG9zdGZpbmFsbHkhPT11bmRlZmluZWQpIHtcIixcImlmICgkcG9zdGZpbmFsbHkucmV0dXJuaW5nXCIsXG5iLmJyZWFrRGVwdGg9PWEuYnJlYWtEZXB0aD9cInx8ICRwb3N0ZmluYWxseS5pc0JyZWFrXCI6XCJcIixcIikge1wiLFwiJGJsaz1cIixiLmJsayxcIjtjb250aW51ZTtcIixcIn0gZWxzZSB7XCIsXCIkYmxrPSRwb3N0ZmluYWxseS5nb3RvQmxvY2s7JHBvc3RmaW5hbGx5PXVuZGVmaW5lZDtjb250aW51ZTtcIixcIn1cIixcIn1cIil9fTthLnByb3RvdHlwZS5jdHJ5PWZ1bmN0aW9uKGEpe3ZhciBiLGM9YS5oYW5kbGVycy5sZW5ndGg7aWYoYS5maW5hbGJvZHkpe3ZhciBkPXRoaXMubmV3QmxvY2soXCJmaW5hbGJvZHlcIik7dmFyIGU9dGhpcy5uZXdCbG9jayhcImZpbmFsZXhoXCIpO3ZhciBmPXRoaXMuX2dyKFwiZmluYWxseV9yZXJhaXNlXCIsXCJ1bmRlZmluZWRcIik7dGhpcy51LnRlbXBzVG9TYXZlLnB1c2goZik7dGhpcy5wdXNoRmluYWxseUJsb2NrKGQpO3ZhciBoPXRoaXMucGVla0ZpbmFsbHlCbG9jaygpO3RoaXMuc2V0dXBFeGNlcHQoZSl9dmFyIG09W107Zm9yKGI9MDtiPGM7KytiKW0ucHVzaCh0aGlzLm5ld0Jsb2NrKFwiZXhjZXB0X1wiK1xuYitcIl9cIikpO3ZhciBxPXRoaXMubmV3QmxvY2soXCJ1bmhhbmRsZWRcIik7dmFyIEI9dGhpcy5uZXdCbG9jayhcIm9yZWxzZVwiKTt2YXIgRD10aGlzLm5ld0Jsb2NrKFwiZW5kXCIpOzAhPW0ubGVuZ3RoJiZ0aGlzLnNldHVwRXhjZXB0KG1bMF0pO3RoaXMudnNlcXN0bXQoYS5ib2R5KTswIT1tLmxlbmd0aCYmdGhpcy5lbmRFeGNlcHQoKTt0aGlzLl9qdW1wKEIpO2ZvcihiPTA7YjxjOysrYil7dGhpcy5zZXRCbG9jayhtW2JdKTt2YXIgRT1hLmhhbmRsZXJzW2JdO2lmKCFFLnR5cGUmJmI8Yy0xKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiZGVmYXVsdCAnZXhjZXB0OicgbXVzdCBiZSBsYXN0XCIsdGhpcy5maWxlbmFtZSxFLmxpbmVubyk7aWYoRS50eXBlKXt2YXIgRj10aGlzLnZleHByKEUudHlwZSk7dmFyIE09Yj09Yy0xP3E6bVtiKzFdO0Y9dGhpcy5fZ3IoXCJpbnN0YW5jZVwiLFwiU2subWlzY2V2YWwuaXNUcnVlKFNrLmJ1aWx0aW4uaXNpbnN0YW5jZSgkZXJyLCBcIixGLFwiKSlcIik7XG50aGlzLl9qdW1wZmFsc2UoRixNKX1FLm5hbWUmJnRoaXMudmV4cHIoRS5uYW1lLFwiJGVyclwiKTt0aGlzLnZzZXFzdG10KEUuYm9keSk7dGhpcy5fanVtcChEKX10aGlzLnNldEJsb2NrKHEpO2woXCJ0aHJvdyAkZXJyO1wiKTt0aGlzLnNldEJsb2NrKEIpO3RoaXMudnNlcXN0bXQoYS5vcmVsc2UpO3RoaXMuX2p1bXAoRCk7dGhpcy5zZXRCbG9jayhEKTthLmZpbmFsYm9keSYmKHRoaXMuZW5kRXhjZXB0KCksdGhpcy5fanVtcChkKSx0aGlzLnNldEJsb2NrKGUpLGwoZixcIj0kZXJyO1wiKSx0aGlzLl9qdW1wKGQpLHRoaXMuc2V0QmxvY2soZCksdGhpcy5wb3BGaW5hbGx5QmxvY2soKSx0aGlzLnZzZXFzdG10KGEuZmluYWxib2R5KSxsKFwiaWYoXCIsZixcIiE9PXVuZGVmaW5lZCkgeyB0aHJvdyBcIixmLFwiO31cIiksdGhpcy5vdXRwdXRGaW5hbGx5Q2FzY2FkZShoKSl9O2EucHJvdG90eXBlLmN3aXRoPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5uZXdCbG9jayhcIndpdGhleGhcIiksZD10aGlzLm5ld0Jsb2NrKFwid2l0aHRpZHl1cFwiKSxcbmU9dGhpcy5uZXdCbG9jayhcIndpdGhjYXJyeW9uXCIpO3ZhciBmPXRoaXMuX2dyKFwibWdyXCIsdGhpcy52ZXhwcihhLml0ZW1zW2JdLmNvbnRleHRfZXhwcikpO2woXCIkcmV0ID0gU2suYWJzdHIubG9va3VwU3BlY2lhbChcIixmLFwiLFNrLmJ1aWx0aW4uc3RyLiRleGl0KTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO3ZhciBnPXRoaXMuX2dyKFwiZXhpdFwiLFwiJHJldFwiKTt0aGlzLnUudGVtcHNUb1NhdmUucHVzaChnKTtsKFwiJHJldCA9IFNrLmFic3RyLmxvb2t1cFNwZWNpYWwoXCIsZixcIixTay5idWlsdGluLnN0ci4kZW50ZXIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoJHJldCk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtmPXRoaXMuX2dyKFwidmFsdWVcIixcIiRyZXRcIik7dGhpcy5wdXNoRmluYWxseUJsb2NrKGQpO3ZhciBoPXRoaXMudS5maW5hbGx5QmxvY2tzW3RoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aC1cbjFdO3RoaXMuc2V0dXBFeGNlcHQoYyk7YS5pdGVtc1tiXS5vcHRpb25hbF92YXJzJiZ0aGlzLm5hbWVvcChhLml0ZW1zW2JdLm9wdGlvbmFsX3ZhcnMuaWQsU2suYXN0bm9kZXMuU3RvcmUsZik7YisxPGEuaXRlbXMubGVuZ3RoP3RoaXMuY3dpdGgoYSxiKzEpOnRoaXMudnNlcXN0bXQoYS5ib2R5KTt0aGlzLmVuZEV4Y2VwdCgpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhjKTtsKFwiJHJldCA9IFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKFwiLGcsXCIsdW5kZWZpbmVkLFNrLmJ1aWx0aW4uZ2V0RXhjSW5mbygkZXJyKSx1bmRlZmluZWQsW10pO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7dGhpcy5fanVtcHRydWUoXCIkcmV0XCIsZSk7bChcInRocm93ICRlcnI7XCIpO3RoaXMuc2V0QmxvY2soZCk7dGhpcy5wb3BGaW5hbGx5QmxvY2soKTtsKFwiJHJldCA9IFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShcIixnLFwiLFtTay5idWlsdGluLm5vbmUubm9uZSQsU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO1wiKTtcbnRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt0aGlzLm91dHB1dEZpbmFsbHlDYXNjYWRlKGgpO3RoaXMuX2p1bXAoZSk7dGhpcy5zZXRCbG9jayhlKX07YS5wcm90b3R5cGUuY2Fzc2VydD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnZleHByKGEudGVzdCksYz10aGlzLm5ld0Jsb2NrKFwiZW5kXCIpO3RoaXMuX2p1bXB0cnVlKGIsYyk7bChcInRocm93IG5ldyBTay5idWlsdGluLkFzc2VydGlvbkVycm9yKFwiLGEubXNnP3RoaXMudmV4cHIoYS5tc2cpOlwiXCIsXCIpO1wiKTt0aGlzLnNldEJsb2NrKGMpfTthLnByb3RvdHlwZS5jaW1wb3J0YXM9ZnVuY3Rpb24oYSxiLGMpe2E9YS52O3ZhciBkPWEuaW5kZXhPZihcIi5cIiksZT1jO2lmKC0xIT09ZClmb3IoYT1hLnN1YnN0cihkKzEpOy0xIT09ZDspZD1hLmluZGV4T2YoXCIuXCIpLGM9LTEhPT1kP2Euc3Vic3RyKDAsZCk6YSxlPXRoaXMuX2dyKFwibGF0dHJcIixcIlNrLmFic3RyLmdhdHRyKFwiLGUsXCIsIG5ldyBTay5idWlsdGluLnN0cignXCIsYyxcIicpKVwiKSxhPVxuYS5zdWJzdHIoZCsxKTtyZXR1cm4gdGhpcy5uYW1lb3AoYixTay5hc3Rub2Rlcy5TdG9yZSxlKX07YS5wcm90b3R5cGUuY2ltcG9ydD1mdW5jdGlvbihhKXt2YXIgYixjPWEubmFtZXMubGVuZ3RoO2ZvcihiPTA7YjxjOysrYil7dmFyIGQ9YS5uYW1lc1tiXTtsKFwiJHJldCA9IFNrLmJ1aWx0aW4uX19pbXBvcnRfXyhcIixkLm5hbWUuJHIoKS52LFwiLCRnYmwsJGxvYyxbXSxcIixTay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydD8wOi0xLFwiKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO3ZhciBlPXRoaXMuX2dyKFwibW9kdWxlXCIsXCIkcmV0XCIpO2lmKGQuYXNuYW1lKXRoaXMuY2ltcG9ydGFzKGQubmFtZSxkLmFzbmFtZSxlKTtlbHNle3ZhciBmPWQubmFtZTtkPWYudi5pbmRleE9mKFwiLlwiKTstMSE9PWQmJihmPW5ldyBTay5idWlsdGluLnN0cihmLnYuc3Vic3RyKDAsZCkpKTt0aGlzLm5hbWVvcChmLFNrLmFzdG5vZGVzLlN0b3JlLGUpfX19O2EucHJvdG90eXBlLmNmcm9taW1wb3J0PVxuZnVuY3Rpb24oYSl7dmFyIGMsZD1hLm5hbWVzLmxlbmd0aDt2YXIgZT1bXTt2YXIgZj1hLmxldmVsOzAhPWZ8fFNrLl9fZnV0dXJlX18uYWJzb2x1dGVfaW1wb3J0fHwoZj0tMSk7Zm9yKGM9MDtjPGQ7KytjKWVbY109XCInXCIrYihhLm5hbWVzW2NdLm5hbWUudikrXCInXCI7bChcIiRyZXQgPSBTay5idWlsdGluLl9faW1wb3J0X18oXCIsYS5tb2R1bGUuJHIoKS52LFwiLCRnYmwsJGxvYyxbXCIsZSxcIl0sXCIsZixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtmPXRoaXMuX2dyKFwibW9kdWxlXCIsXCIkcmV0XCIpO2ZvcihjPTA7YzxkOysrYyl7ZT1hLm5hbWVzW2NdO3ZhciBoPVwiJ1wiK2UubmFtZS52K1wiJ1wiO2lmKDA9PT1jJiZcIipcIj09PWUubmFtZS52KXtTay5hc3NlcnRzLmFzc2VydCgxPT09ZCk7bChcIlNrLmltcG9ydFN0YXIoXCIsZixcIiwkbG9jLCAkZ2JsKTtcIik7YnJlYWt9dmFyIG09dGhpcy5fZ3IoXCJpdGVtXCIsXCJTay5hYnN0ci5nYXR0cihcIixmLFwiLCBuZXcgU2suYnVpbHRpbi5zdHIoXCIsaCxcblwiKSwgdW5kZWZpbmVkKVwiKTtoPWUubmFtZTtlLmFzbmFtZSYmKGg9ZS5hc25hbWUpO3RoaXMubmFtZW9wKGgsU2suYXN0bm9kZXMuU3RvcmUsbSl9fTthLnByb3RvdHlwZS5idWlsZGNvZGVvYmo9ZnVuY3Rpb24oYSxjLGYsayxoLG0pe3ZhciBkPVtdLGc9W10sbj1bXSxwPVtdLHE9bnVsbCx1PW51bGw7ZiYmKGc9dGhpcy52c2VxZXhwcihmKSk7ayYmay5kZWZhdWx0cyYmKG49dGhpcy52c2VxZXhwcihrLmRlZmF1bHRzKSk7ayYmay5rd19kZWZhdWx0cyYmKHA9ay5rd19kZWZhdWx0cy5tYXAoYT0+YT90aGlzLnZleHByKGEpOlwidW5kZWZpbmVkXCIpKTtrJiZrLnZhcmFyZyYmKHE9ay52YXJhcmcpO2smJmsua3dhcmcmJih1PWsua3dhcmcpO2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJmsmJmsua3dvbmx5YXJncyYmMCE9ay5rd29ubHlhcmdzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIktleXdvcmQtb25seSBhcmd1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDJcIik7XG52YXIgRj10aGlzLmVudGVyU2NvcGUoYyxhLGEubGluZW5vLHRoaXMuY2FuU3VzcGVuZCk7Zj10aGlzLnUuc3RlLmdlbmVyYXRvcjt2YXIgTT10aGlzLnUuc3RlLmhhc0ZyZWU7dmFyIFY9dGhpcy51LnN0ZS5jaGlsZEhhc0ZyZWU7dmFyIHk9dGhpcy5uZXdCbG9jayhcImNvZGVvYmogZW50cnlcIik7dGhpcy51LnByZWZpeENvZGU9XCJ2YXIgXCIrRitcIj0oZnVuY3Rpb24gXCIrdGhpcy5uaWNlTmFtZShjLnYpK1wiJChcIjt2YXIgRz1bXTtpZihmKXtpZih1KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKGMuditcIigpOiBrZXl3b3JkIGFyZ3VtZW50cyBpbiBnZW5lcmF0b3JzIG5vdCBzdXBwb3J0ZWRcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtpZihxKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKGMuditcIigpOiB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIGluIGdlbmVyYXRvcnMgbm90IHN1cHBvcnRlZFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO0cucHVzaChcIiRnZW5cIil9ZWxzZXt1JiZcbihHLnB1c2goXCIka3dhXCIpLHRoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKFwiJGt3YVwiKSk7Zm9yKGE9MDtrJiZhPGsuYXJncy5sZW5ndGg7KythKUcucHVzaCh0aGlzLm5hbWVvcChrLmFyZ3NbYV0uYXJnLFNrLmFzdG5vZGVzLlBhcmFtKSk7Zm9yKGE9MDtrJiZrLmt3b25seWFyZ3MmJmE8ay5rd29ubHlhcmdzLmxlbmd0aDsrK2EpRy5wdXNoKHRoaXMubmFtZW9wKGsua3dvbmx5YXJnc1thXS5hcmcsU2suYXN0bm9kZXMuUGFyYW0pKTtxJiZHLnB1c2godGhpcy5uYW1lb3Aoay52YXJhcmcuYXJnLFNrLmFzdG5vZGVzLlBhcmFtKSl9bGV0IEw9IWY7TSYmKEx8fEcucHVzaChcIiRmcmVlXCIpLHRoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKFwiJGZyZWVcIikpO3RoaXMudS5wcmVmaXhDb2RlPUw/dGhpcy51LnByZWZpeENvZGUrXCIkcG9zYXJncywka3dhcmdzXCI6dGhpcy51LnByZWZpeENvZGUrRy5qb2luKFwiLFwiKTt0aGlzLnUucHJlZml4Q29kZSs9XCIpe1wiO2YmJih0aGlzLnUucHJlZml4Q29kZSs9XCJcXG4vLyBnZW5lcmF0b3JcXG5cIik7XG5NJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gaGFzIGZyZWVcXG5cIik7ViYmKHRoaXMudS5wcmVmaXhDb2RlKz1cIlxcbi8vIGhhcyBjZWxsXFxuXCIpO0wmJih0aGlzLnUucHJlZml4Q29kZSs9XCJcXG4vLyBmYXN0IGNhbGxcXG5cIik7dmFyIFQ9XCJ7fVwiO2YmJih5PVwiJGdlbi5naSRyZXN1bWVhdFwiLFQ9XCIkZ2VuLmdpJGxvY2Fsc1wiKTthPVwiLCRjZWxsPXt9XCI7ViYmZiYmKGE9XCIsJGNlbGw9JGdlbi5naSRjZWxsc1wiKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cInZhciAkYmxrPVwiK3krXCIsJGV4Yz1bXSwkbG9jPVwiK1QrYStcIiwkZ2JsPVwiKyhMP1widGhpcyAmJiB0aGlzLmZ1bmNfZ2xvYmFsc1wiOlwidGhpc1wiKSsoTCYmTT9cIiwkZnJlZT10aGlzICYmIHRoaXMuZnVuY19jbG9zdXJlXCI6XCJcIikrXCIsJGVycj11bmRlZmluZWQsJHJldD11bmRlZmluZWQsJHBvc3RmaW5hbGx5PXVuZGVmaW5lZCwkY3VyckxpbmVObz11bmRlZmluZWQsJGN1cnJDb2xObz11bmRlZmluZWQ7XCI7bnVsbCE9PVNrLmV4ZWNMaW1pdCYmKHRoaXMudS52YXJEZWNsc0NvZGUrPVxuXCJpZiAodHlwZW9mIFNrLmV4ZWNTdGFydCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5leGVjU3RhcnQgPSBEYXRlLm5vdygpfVwiKTtudWxsIT09U2sueWllbGRMaW1pdCYmdGhpcy51LmNhblN1c3BlbmQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmICh0eXBlb2YgU2subGFzdFlpZWxkID09PSAndW5kZWZpbmVkJykge1NrLmxhc3RZaWVsZCA9IERhdGUubm93KCl9XCIpO3RoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYgKFwiK0YrXCIuJHdha2luZ1N1c3BlbnNpb24hPT11bmRlZmluZWQpIHsgJHdha2VGcm9tU3VzcGVuc2lvbigpOyB9IGVsc2Uge1wiO2lmKEwpe3RoaXMudS52YXJEZWNsc0NvZGU9dXx8cXx8ayYmay5rd29ubHlhcmdzJiYwIT09ay5rd29ubHlhcmdzLmxlbmd0aD90aGlzLnUudmFyRGVjbHNDb2RlK1wiXFxudmFyICRhcmdzID0gdGhpcy4kcmVzb2x2ZUFyZ3MoJHBvc2FyZ3MsJGt3YXJncylcXG5cIjp0aGlzLnUudmFyRGVjbHNDb2RlKyhcInZhciAkYXJncyA9ICgoISRrd2FyZ3MgfHwgJGt3YXJncy5sZW5ndGg9PT0wKSAmJiAkcG9zYXJncy5sZW5ndGg9PT1cIitcbkcubGVuZ3RoK1wiKSA/ICRwb3NhcmdzIDogdGhpcy4kcmVzb2x2ZUFyZ3MoJHBvc2FyZ3MsJGt3YXJncylcIik7Zm9yKGE9MDthPEcubGVuZ3RoO2ErKyl0aGlzLnUudmFyRGVjbHNDb2RlKz1cIixcIitHW2FdK1wiPSRhcmdzW1wiK2ErXCJdXCI7dGhpcy51LnZhckRlY2xzQ29kZSs9XCI7XFxuXCJ9aWYoZiYmMDxuLmxlbmd0aClmb3IoeT1rLmFyZ3MubGVuZ3RoLW4ubGVuZ3RoLGE9MDthPG4ubGVuZ3RoOysrYSlHPXRoaXMubmFtZW9wKGsuYXJnc1thK3ldLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSksdGhpcy51LnZhckRlY2xzQ29kZSs9XCJpZihcIitHK1wiPT09dW5kZWZpbmVkKVwiK0crXCI9XCIrRitcIi4kZGVmYXVsdHNbXCIrYStcIl07XCI7Zm9yKGE9MDtrJiZhPGsuYXJncy5sZW5ndGg7KythKUc9ay5hcmdzW2FdLmFyZyx0aGlzLmlzQ2VsbChHKSYmKEc9YihlKHRoaXMudS5wcml2YXRlXyxHKS52KSx0aGlzLnUudmFyRGVjbHNDb2RlKz1cIiRjZWxsLlwiK0crXCI9XCIrRytcIjtcIik7Zm9yKGE9MDtrJiZrLmt3b25seWFyZ3MmJlxuYTxrLmt3b25seWFyZ3MubGVuZ3RoOysrYSlHPWsua3dvbmx5YXJnc1thXS5hcmcsdGhpcy5pc0NlbGwoRykmJihHPWIoZSh0aGlzLnUucHJpdmF0ZV8sRykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIitHK1wiPVwiK0crXCI7XCIpO3EmJnRoaXMuaXNDZWxsKHEuYXJnKSYmKGE9YihlKHRoaXMudS5wcml2YXRlXyxxLmFyZykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIithK1wiPVwiK2ErXCI7XCIpO3UmJih0aGlzLnUubG9jYWxuYW1lcy5wdXNoKHUuYXJnLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPXUuYXJnLnYrXCI9bmV3IFNrLmJ1aWx0aW5zWydkaWN0J10oJGt3YSk7XCIsdGhpcy5pc0NlbGwodS5hcmcpJiYoYT1iKGUodGhpcy51LnByaXZhdGVfLHUuYXJnKS52KSx0aGlzLnUudmFyRGVjbHNDb2RlKz1cIiRjZWxsLlwiK2ErXCI9XCIrYStcIjtcIikpO3RoaXMudS52YXJEZWNsc0NvZGUrPVwifVwiO1NrLl9fZnV0dXJlX18ucHl0aG9uMyYmbSYmKHRoaXMudS52YXJEZWNsc0NvZGUrPVxuXCIkZ2JsLl9fY2xhc3NfXz0kZ2JsLlwiK20uditcIjtcIik7dGhpcy51LnN3aXRjaENvZGU9XCJ3aGlsZSh0cnVlKXt0cnl7XCI7dGhpcy51LnN3aXRjaENvZGUrPXRoaXMub3V0cHV0SW50ZXJydXB0VGVzdCgpO3RoaXMudS5zd2l0Y2hDb2RlKz1cInN3aXRjaCgkYmxrKXtcIjt0aGlzLnUuc3VmZml4Q29kZT1cIn0gfWNhdGNoKGVycil7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrdGhpcy5maWxlbmFtZStcIid9KTsgaWYgKCRleGMubGVuZ3RoPjApIHsgJGVyciA9IGVycjsgJGJsaz0kZXhjLnBvcCgpOyBjb250aW51ZTsgfSBlbHNlIHsgdGhyb3cgZXJyOyB9fSB9fSk7XCI7aC5jYWxsKHRoaXMsRik7aWYoayl7Zm9yKGxldCBhIG9mIGsuYXJncylkLnB1c2goYS5hcmcudik7XG5mb3IobGV0IGEgb2Ygay5rd29ubHlhcmdzfHxbXSlkLnB1c2goYS5hcmcudik7dGhpcy51LmFyZ25hbWVzPWR9dGhpcy5leGl0U2NvcGUoKTswPG4ubGVuZ3RoJiZsKEYsXCIuJGRlZmF1bHRzPVtcIixuLmpvaW4oXCIsXCIpLFwiXTtcIik7ayYmay5rd29ubHlhcmdzJiYwPGsua3dvbmx5YXJncy5sZW5ndGgmJihsKEYsXCIuY29fYXJnY291bnQ9XCIsay5hcmdzLmxlbmd0aCxcIjtcIiksbChGLFwiLmNvX2t3b25seWFyZ2NvdW50PVwiLGsua3dvbmx5YXJncy5sZW5ndGgsXCI7XCIpLGwoRixcIi4ka3dkZWZzPVtcIixwLmpvaW4oXCIsXCIpLFwiXTtcIikpOzA8ZC5sZW5ndGg/bChGLFwiLmNvX3Zhcm5hbWVzPVsnXCIsZC5qb2luKFwiJywnXCIpLFwiJ107XCIpOmwoRixcIi5jb192YXJuYW1lcz1bXTtcIik7dSYmbChGLFwiLmNvX2t3YXJncz0xO1wiKTtxJiZsKEYsXCIuY29fdmFyYXJncz0xO1wiKTtmfHxsKEYsXCIuY29fZmFzdGNhbGw9MTtcIik7aD1cIlwiO00mJihoPVwiLCRjZWxsXCIsKG09dGhpcy51LnN0ZS5oYXNGcmVlKSYmKGgrPVwiLCRmcmVlXCIpKTtcbmlmKGYpcmV0dXJuIGsmJjA8ay5hcmdzLmxlbmd0aD90aGlzLl9ncihcImdlbmVyXCIsXCJuZXcgU2suYnVpbHRpbnNbJ2Z1bmN0aW9uJ10oKGZ1bmN0aW9uKCl7dmFyICRvcmlnYXJncz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIlwiLGMudiwnXCIsYXJndW1lbnRzLmxlbmd0aCwnLGsuYXJncy5sZW5ndGgtbi5sZW5ndGgsXCIsXCIsay5hcmdzLmxlbmd0aCxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluc1snZ2VuZXJhdG9yJ10oXCIsRixcIiwkZ2JsLCRvcmlnYXJnc1wiLGgsXCIpO30pKVwiKTp0aGlzLl9ncihcImdlbmVyXCIsXCJuZXcgU2suYnVpbHRpbnNbJ2Z1bmN0aW9uJ10oKGZ1bmN0aW9uKCl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiXCIsYy52LFwiXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCk7cmV0dXJuIG5ldyBTay5idWlsdGluc1snZ2VuZXJhdG9yJ10oXCIsRixcIiwkZ2JsLFtdXCIsaCxcIik7fSkpXCIpO2lmKDA8Zy5sZW5ndGgpe2woXCIkcmV0ID0gbmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKFwiLFxuRixcIiwkZ2JsXCIsaCxcIik7XCIpO2ZvcihsZXQgYSBvZiBnLnJldmVyc2UoKSlsKFwiJHJldCA9IFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShcIixhLFwiLFskcmV0XSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpO3JldHVybiB0aGlzLl9ncihcImZ1bmNvYmpcIixcIiRyZXRcIil9cmV0dXJuIHRoaXMuX2dyKFwiZnVuY29ialwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKFwiLEYsXCIsJGdibFwiLGgsXCIpXCIpfTthLnByb3RvdHlwZS5jZnVuY3Rpb249ZnVuY3Rpb24oYSxiKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuRnVuY3Rpb25EZWYpO2I9dGhpcy5idWlsZGNvZGVvYmooYSxhLm5hbWUsYS5kZWNvcmF0b3JfbGlzdCxhLmFyZ3MsZnVuY3Rpb24oYil7dGhpcy52c2Vxc3RtdChhLmJvZHkpO2woXCJyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO1wiKX0sYik7dGhpcy5uYW1lb3AoYS5uYW1lLFNrLmFzdG5vZGVzLlN0b3JlLGIpfTthLnByb3RvdHlwZS5jbGFtYmRhPVxuZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkxhbWJkYSk7cmV0dXJuIHRoaXMuYnVpbGRjb2Rlb2JqKGEsbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGxhbWJkYT5cIiksbnVsbCxhLmFyZ3MsZnVuY3Rpb24oYil7Yj10aGlzLnZleHByKGEuYm9keSk7bChcInJldHVybiBcIixiLFwiO1wiKX0pfTthLnByb3RvdHlwZS5jaWZleHA9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5uZXdCbG9jayhcIm5leHQgb2YgaWZleHBcIiksYz10aGlzLm5ld0Jsb2NrKFwiZW5kIG9mIGlmZXhwXCIpLGQ9dGhpcy5fZ3IoXCJyZXNcIixcIm51bGxcIiksZT10aGlzLnZleHByKGEudGVzdCk7dGhpcy5fanVtcGZhbHNlKGUsYik7bChkLFwiPVwiLHRoaXMudmV4cHIoYS5ib2R5KSxcIjtcIik7dGhpcy5fanVtcChjKTt0aGlzLnNldEJsb2NrKGIpO2woZCxcIj1cIix0aGlzLnZleHByKGEub3JlbHNlKSxcIjtcIik7dGhpcy5fanVtcChjKTt0aGlzLnNldEJsb2NrKGMpO3JldHVybiBkfTthLnByb3RvdHlwZS5jZ2VuZXhwZ2VuPVxuZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMubmV3QmxvY2soXCJzdGFydCBmb3IgXCIrYiksZT10aGlzLm5ld0Jsb2NrKFwic2tpcCBmb3IgXCIrYik7dGhpcy5uZXdCbG9jayhcImlmIGNsZWFudXAgZm9yIFwiK2IpO3ZhciBmPXRoaXMubmV3QmxvY2soXCJlbmQgZm9yIFwiK2IpLGc9YVtiXTtpZigwPT09Yil2YXIgaD1cIiRsb2MuJGl0ZXIwXCI7ZWxzZXt2YXIgbT10aGlzLnZleHByKGcuaXRlcik7aD1cIiRsb2MuXCIrdGhpcy5nZW5zeW0oXCJpdGVyXCIpO2woaCxcIj1cIixcIlNrLmFic3RyLml0ZXIoXCIsbSxcIik7XCIpfXRoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhkKTt0aGlzLmFubm90YXRlU291cmNlKGMpO2woXCIkcmV0ID0gU2suYWJzdHIuaXRlcm5leHQoXCIsaCx0aGlzLnUuY2FuU3VzcGVuZD9cIiwgdHJ1ZVwiOlwiLCBmYWxzZVwiLFwiKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGMpO209dGhpcy5fZ3IoXCJuZXh0XCIsXCIkcmV0XCIpO3RoaXMuX2p1bXB1bmRlZihtLGYpO3RoaXMudmV4cHIoZy50YXJnZXQsXG5tKTt2YXIgbj1nLmlmcz9nLmlmcy5sZW5ndGg6MDtmb3IoaD0wO2g8bjsrK2gpdGhpcy5hbm5vdGF0ZVNvdXJjZShnLmlmc1toXSksbT10aGlzLnZleHByKGcuaWZzW2hdKSx0aGlzLl9qdW1wZmFsc2UobSxkKTsrK2I8YS5sZW5ndGgmJnRoaXMuY2dlbmV4cGdlbihhLGIsYyk7Yj49YS5sZW5ndGgmJih0aGlzLmFubm90YXRlU291cmNlKGMpLGE9dGhpcy52ZXhwcihjKSxsKFwicmV0dXJuIFtcIixlLFwiLypyZXN1bWUqLyxcIixhLFwiLypyZXQqL107XCIpLHRoaXMuc2V0QmxvY2soZSkpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhmKTsxPT09YiYmbChcInJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSQ7XCIpfTthLnByb3RvdHlwZS5jZ2VuZXhwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYnVpbGRjb2Rlb2JqKGEsbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGdlbmV4cHI+XCIpLG51bGwsbnVsbCxmdW5jdGlvbihiKXt0aGlzLmNnZW5leHBnZW4oYS5nZW5lcmF0b3JzLDAsYS5lbHQpfSk7Yj10aGlzLl9ncihcImdlbmVyXCIsXG5cIlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShcIixiLFwiKTtcIik7bChiLFwiLmdpJGxvY2Fscy4kaXRlcjA9U2suYWJzdHIuaXRlcihcIix0aGlzLnZleHByKGEuZ2VuZXJhdG9yc1swXS5pdGVyKSxcIik7XCIpO3JldHVybiBifTthLnByb3RvdHlwZS5jY2xhc3M9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkNsYXNzRGVmKTt2YXIgYj10aGlzLnZzZXFleHByKGEuZGVjb3JhdG9yX2xpc3QpO3ZhciBjPXRoaXMudnNlcWV4cHIoYS5iYXNlcyk7dmFyIGQ9dGhpcy5lbnRlclNjb3BlKGEubmFtZSxhLGEubGluZW5vKTt2YXIgZT10aGlzLm5ld0Jsb2NrKFwiY2xhc3MgZW50cnlcIik7dGhpcy51LnByZWZpeENvZGU9XCJ2YXIgXCIrZCtcIj0oZnVuY3Rpb24gJFwiK2EubmFtZS52K1wiJGNsYXNzX291dGVyKCRnbG9iYWxzLCRsb2NhbHMsJGNlbGwpe3ZhciAkZ2JsPSRnbG9iYWxzLCRsb2M9JGxvY2FsczskZnJlZT0kZ2xvYmFscztcIjt0aGlzLnUuc3dpdGNoQ29kZSs9XG5cIihmdW5jdGlvbiAkXCIrYS5uYW1lLnYrXCIkX2Nsb3N1cmUoJGNlbGwpe1wiO3RoaXMudS5zd2l0Y2hDb2RlKz1cInZhciAkYmxrPVwiK2UrXCIsJGV4Yz1bXSwkcmV0PXVuZGVmaW5lZCwkcG9zdGZpbmFsbHk9dW5kZWZpbmVkLCRjdXJyTGluZU5vPXVuZGVmaW5lZCwkY3VyckNvbE5vPXVuZGVmaW5lZDtcIjtudWxsIT09U2suZXhlY0xpbWl0JiYodGhpcy51LnN3aXRjaENvZGUrPVwiaWYgKHR5cGVvZiBTay5leGVjU3RhcnQgPT09ICd1bmRlZmluZWQnKSB7U2suZXhlY1N0YXJ0ID0gRGF0ZS5ub3coKX1cIik7bnVsbCE9PVNrLnlpZWxkTGltaXQmJnRoaXMudS5jYW5TdXNwZW5kJiYodGhpcy51LnN3aXRjaENvZGUrPVwiaWYgKHR5cGVvZiBTay5sYXN0WWllbGQgPT09ICd1bmRlZmluZWQnKSB7U2subGFzdFlpZWxkID0gRGF0ZS5ub3coKX1cIik7dGhpcy51LnN3aXRjaENvZGUrPVwid2hpbGUodHJ1ZSl7dHJ5e1wiO3RoaXMudS5zd2l0Y2hDb2RlKz10aGlzLm91dHB1dEludGVycnVwdFRlc3QoKTt0aGlzLnUuc3dpdGNoQ29kZSs9XG5cInN3aXRjaCgkYmxrKXtcIjt0aGlzLnUuc3VmZml4Q29kZT1cIn19Y2F0Y2goZXJyKXsgaWYgKCEoZXJyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uKSkgeyBlcnIgPSBuZXcgU2suYnVpbHRpbi5FeHRlcm5hbEVycm9yKGVycik7IH0gZXJyLnRyYWNlYmFjay5wdXNoKHtsaW5lbm86ICRjdXJyTGluZU5vLCBjb2xubzogJGN1cnJDb2xObywgZmlsZW5hbWU6ICdcIit0aGlzLmZpbGVuYW1lK1wiJ30pOyBpZiAoJGV4Yy5sZW5ndGg+MCkgeyAkZXJyID0gZXJyOyAkYmxrPSRleGMucG9wKCk7IGNvbnRpbnVlOyB9IGVsc2UgeyB0aHJvdyBlcnI7IH19fVwiO3RoaXMudS5zdWZmaXhDb2RlKz1cIn0pLmNhbGwobnVsbCwgJGNlbGwpO30pO1wiO3RoaXMudS5wcml2YXRlXz1hLm5hbWU7dGhpcy5jYm9keShhLmJvZHksYS5uYW1lKTtsKFwicmV0dXJuO1wiKTt0aGlzLmV4aXRTY29wZSgpO2woXCIkcmV0ID0gU2subWlzY2V2YWwuYnVpbGRDbGFzcygkZ2JsLFwiLGQsXCIsXCIsYS5uYW1lLiRyKCkudixcblwiLFtcIixjLFwiXSwgJGNlbGwpO1wiKTtmb3IobGV0IGEgb2YgYilsKFwiJHJldCA9IFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShcIixhLFwiLCBbJHJldF0pO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKTt0aGlzLm5hbWVvcChhLm5hbWUsU2suYXN0bm9kZXMuU3RvcmUsXCIkcmV0XCIpfTthLnByb3RvdHlwZS5jY29udGludWU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZWVrRmluYWxseUJsb2NrKCk7aWYoMD09dGhpcy51LmNvbnRpbnVlQmxvY2tzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidjb250aW51ZScgb3V0c2lkZSBsb29wXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YT10aGlzLnUuY29udGludWVCbG9ja3NbdGhpcy51LmNvbnRpbnVlQmxvY2tzLmxlbmd0aC0xXTtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnUuYnJlYWtCbG9ja3MubGVuZ3RoPT09dGhpcy51LmNvbnRpbnVlQmxvY2tzLmxlbmd0aCk7YiYmYi5icmVha0RlcHRoPT10aGlzLnUuY29udGludWVCbG9ja3MubGVuZ3RoP1xubChcIiRwb3N0ZmluYWxseT17aXNCcmVhazp0cnVlLGdvdG9CbG9jazpcIixhLFwifTtcIik6dGhpcy5fanVtcChhKX07YS5wcm90b3R5cGUuY2JyZWFrPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGVla0ZpbmFsbHlCbG9jaygpO2lmKDA9PT10aGlzLnUuYnJlYWtCbG9ja3MubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiJ2JyZWFrJyBvdXRzaWRlIGxvb3BcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTthPXRoaXMudS5icmVha0Jsb2Nrc1t0aGlzLnUuYnJlYWtCbG9ja3MubGVuZ3RoLTFdO2ImJmIuYnJlYWtEZXB0aD09dGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aD9sKFwiJHBvc3RmaW5hbGx5PXtpc0JyZWFrOnRydWUsZ290b0Jsb2NrOlwiLGEsXCJ9O1wiKTp0aGlzLl9qdW1wKGEpfTthLnByb3RvdHlwZS52c3RtdD1mdW5jdGlvbihhLGIpe3RoaXMudS5saW5lbm89YS5saW5lbm87dGhpcy51LmxpbmVub1NldD0hMTt0aGlzLnUubG9jYWx0ZW1wcz1bXTtpZihTay5kZWJ1Z2dpbmcmJlxudGhpcy51LmNhblN1c3BlbmQpe3ZhciBjPXRoaXMubmV3QmxvY2soXCJkZWJ1ZyBicmVha3BvaW50IGZvciBsaW5lIFwiK2EubGluZW5vKTtsKFwiaWYgKFNrLmJyZWFrcG9pbnRzKCdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpKSB7XCIsXCJ2YXIgJHN1c3AgPSAkc2F2ZVN1c3BlbnNpb24oe2RhdGE6IHt0eXBlOiAnU2suZGVidWcnfSwgcmVzdW1lOiBmdW5jdGlvbigpIHt9fSwgJ1wiK3RoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIik7XCIsXCIkc3VzcC4kYmxrID0gXCIrYytcIjtcIixcIiRzdXNwLm9wdGlvbmFsID0gdHJ1ZTtcIixcInJldHVybiAkc3VzcDtcIixcIn1cIik7dGhpcy5fanVtcChjKTt0aGlzLnNldEJsb2NrKGMpO3RoaXMudS5kb2VzU3VzcGVuZD0hMH10aGlzLmFubm90YXRlU291cmNlKGEpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmOnRoaXMuY2Z1bmN0aW9uKGEsYik7XG5icmVhaztjYXNlIFNrLmFzdG5vZGVzLkNsYXNzRGVmOnRoaXMuY2NsYXNzKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmV0dXJuOmlmKHRoaXMudS5zdGUuYmxvY2tUeXBlIT09U2suU1lNVEFCX0NPTlNUUy5GdW5jdGlvbkJsb2NrKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiJ3JldHVybicgb3V0c2lkZSBmdW5jdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2M9YS52YWx1ZT90aGlzLnZleHByKGEudmFsdWUpOlwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7MD09dGhpcy51LmZpbmFsbHlCbG9ja3MubGVuZ3RoP2woXCJyZXR1cm4gXCIsYyxcIjtcIik6KGwoXCIkcG9zdGZpbmFsbHk9e3JldHVybmluZzpcIixjLFwifTtcIiksdGhpcy5fanVtcCh0aGlzLnBlZWtGaW5hbGx5QmxvY2soKS5ibGspKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbGV0ZTp0aGlzLnZzZXFleHByKGEudGFyZ2V0cyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NpZ246dmFyIGQ9YS50YXJnZXRzLmxlbmd0aDtcbmM9dGhpcy52ZXhwcihhLnZhbHVlKTtmb3IoYj0wO2I8ZDsrK2IpdGhpcy52ZXhwcihhLnRhcmdldHNbYl0sYyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bbm5Bc3NpZ246Yz10aGlzLnZleHByKGEudmFsdWUpO3RoaXMudmV4cHIoYS50YXJnZXQsYyk7dGhpcy52ZXhwcihhLmFubm90YXRpb24pO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXVnQXNzaWduOnJldHVybiB0aGlzLmNhdWdhc3NpZ24oYSk7Y2FzZSBTay5hc3Rub2Rlcy5QcmludDp0aGlzLmNwcmludChhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkZvcjpyZXR1cm4gdGhpcy5jZm9yKGEpO2Nhc2UgU2suYXN0bm9kZXMuV2hpbGU6cmV0dXJuIHRoaXMuY3doaWxlKGEpO2Nhc2UgU2suYXN0bm9kZXMuSWY6cmV0dXJuIHRoaXMuY2lmKGEpO2Nhc2UgU2suYXN0bm9kZXMuUmFpc2U6cmV0dXJuIHRoaXMuY3JhaXNlKGEpO2Nhc2UgU2suYXN0bm9kZXMuVHJ5OnJldHVybiB0aGlzLmN0cnkoYSk7Y2FzZSBTay5hc3Rub2Rlcy5XaXRoOnJldHVybiB0aGlzLmN3aXRoKGEsXG4wKTtjYXNlIFNrLmFzdG5vZGVzLkFzc2VydDpyZXR1cm4gdGhpcy5jYXNzZXJ0KGEpO2Nhc2UgU2suYXN0bm9kZXMuSW1wb3J0OnJldHVybiB0aGlzLmNpbXBvcnQoYSk7Y2FzZSBTay5hc3Rub2Rlcy5JbXBvcnRGcm9tOnJldHVybiB0aGlzLmNmcm9taW1wb3J0KGEpO2Nhc2UgU2suYXN0bm9kZXMuR2xvYmFsOmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRXhwcjp0aGlzLnZleHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFzczpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkJyZWFrOnRoaXMuY2JyZWFrKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ29udGludWU6dGhpcy5jY29udGludWUoYSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWJ1Z2dlcjpsKFwiZGVidWdnZXI7XCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gdnN0bXQ6IFwiK0pTT04uc3RyaW5naWZ5KGEpKX19O2EucHJvdG90eXBlLnZzZXFzdG10PWZ1bmN0aW9uKGEpe3ZhciBiO1xuZm9yKGI9MDtiPGEubGVuZ3RoOysrYil0aGlzLnZzdG10KGFbYl0pfTthLnByb3RvdHlwZS5pc0NlbGw9ZnVuY3Rpb24oYSl7YT1iKGUodGhpcy51LnByaXZhdGVfLGEpLnYpO3JldHVybiB0aGlzLnUuc3RlLmdldFNjb3BlKGEpPT09U2suU1lNVEFCX0NPTlNUUy5DRUxMfTthLnByb3RvdHlwZS5uYW1lb3A9ZnVuY3Rpb24oYSxjLGYpe2lmKChjPT09U2suYXN0bm9kZXMuU3RvcmV8fGM9PT1Tay5hc3Rub2Rlcy5BdWdTdG9yZXx8Yz09PVNrLmFzdG5vZGVzLkRlbCkmJlwiX19kZWJ1Z19fXCI9PT1hLnYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJjYW4gbm90IGFzc2lnbiB0byBfX2RlYnVnX19cIix0aGlzLmZpbGVuYW1lLHRoaXMudS5saW5lbm8pO1NrLmFzc2VydHMuYXNzZXJ0KFwiTm9uZVwiIT09YS52KTtpZihcIk5vdEltcGxlbWVudGVkXCI9PT1hLnYpcmV0dXJuXCJTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJFwiO3ZhciBkPWUodGhpcy51LnByaXZhdGVfLFxuYSkudjtkPWIoZCk7dmFyIGc9Mzt2YXIgaD10aGlzLnUuc3RlLmdldFNjb3BlKGQpO3ZhciBtPW51bGw7c3dpdGNoKGgpe2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5GUkVFOm09XCIkZnJlZVwiO2c9MjticmVhaztjYXNlIFNrLlNZTVRBQl9DT05TVFMuQ0VMTDptPVwiJGNlbGxcIjtnPTI7YnJlYWs7Y2FzZSBTay5TWU1UQUJfQ09OU1RTLkxPQ0FMOnRoaXMudS5zdGUuYmxvY2tUeXBlIT09U2suU1lNVEFCX0NPTlNUUy5GdW5jdGlvbkJsb2NrfHx0aGlzLnUuc3RlLmdlbmVyYXRvcnx8KGc9MCk7YnJlYWs7Y2FzZSBTay5TWU1UQUJfQ09OU1RTLkdMT0JBTF9JTVBMSUNJVDp0aGlzLnUuc3RlLmJsb2NrVHlwZT09PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayYmKGc9MSk7YnJlYWs7Y2FzZSBTay5TWU1UQUJfQ09OU1RTLkdMT0JBTF9FWFBMSUNJVDpnPTF9U2suYXNzZXJ0cy5hc3NlcnQoaHx8XCJfXCI9PT1hLnYuY2hhckF0KDEpKTthPWQ7dGhpcy51LnN0ZS5nZW5lcmF0b3J8fHRoaXMudS5zdGUuYmxvY2tUeXBlIT09XG5Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2s/ZD1cIiRsb2MuXCIrZDooMD09PWd8fDM9PT1nKSYmdGhpcy51LmxvY2FsbmFtZXMucHVzaChkKTtzd2l0Y2goZyl7Y2FzZSAwOnN3aXRjaChjKXtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6Y2FzZSBTay5hc3Rub2Rlcy5QYXJhbTpyZXR1cm4gbChcImlmIChcIixkLFwiID09PSB1bmRlZmluZWQpIHsgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVW5ib3VuZExvY2FsRXJyb3IoJ2xvY2FsIHZhcmlhYmxlIFxcXFwnXCIsZCxcIlxcXFwnIHJlZmVyZW5jZWQgYmVmb3JlIGFzc2lnbm1lbnQnKTsgfVxcblwiKSxkO2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChkLFwiPVwiLGYsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVsOmwoXCJkZWxldGUgXCIsZCxcIjtcIik7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWRcIil9YnJlYWs7Y2FzZSAzOnN3aXRjaChjKXtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6cmV0dXJuIHRoaXMuX2dyKFwibG9hZG5hbWVcIixkLFxuXCIhPT11bmRlZmluZWQ/XCIsZCxcIjpTay5taXNjZXZhbC5sb2FkbmFtZSgnXCIsYSxcIicsJGdibCk7XCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChkLFwiPVwiLGYsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVsOmwoXCJkZWxldGUgXCIsZCxcIjtcIik7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5QYXJhbTpyZXR1cm4gZDtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZFwiKX1icmVhaztjYXNlIDE6c3dpdGNoKGMpe2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkZ2JsXCIsXCJTay5taXNjZXZhbC5sb2FkbmFtZSgnXCIsYSxcIicsJGdibClcIik7Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTpsKFwiJGdibC5cIixhLFwiPVwiLGYsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVsOmwoXCJkZWxldGUgJGdibC5cIixhKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlIGluIG5hbWUgb3BfZ2xvYmFsXCIpfWJyZWFrO2Nhc2UgMjpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOnJldHVybiBtK1xuXCIuXCIrYTtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwobSxcIi5cIixhLFwiPVwiLGYsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFyYW06cmV0dXJuIGE7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBpbiBuYW1lIG9wX2RlcmVmXCIpfWJyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2VcIil9fTthLnByb3RvdHlwZS5lbnRlclNjb3BlPWZ1bmN0aW9uKGEsYixlLGYpe3ZhciBkPW5ldyBjO2Quc3RlPXRoaXMuc3QuZ2V0U3RzRm9yQXN0KGIpO2QubmFtZT1hO2QuZmlyc3RsaW5lbm89ZTtkLmNhblN1c3BlbmQ9Znx8ITE7dGhpcy51JiZ0aGlzLnUucHJpdmF0ZV8mJihkLnByaXZhdGVfPXRoaXMudS5wcml2YXRlXyk7dGhpcy5zdGFjay5wdXNoKHRoaXMudSk7dGhpcy5hbGxVbml0cy5wdXNoKGQpO2E9dGhpcy5nZW5zeW0oXCJzY29wZVwiKTtkLnNjb3BlbmFtZT1hO3RoaXMudT1kO3RoaXMudS5hY3RpdmF0ZVNjb3BlKCk7dGhpcy5uZXN0bGV2ZWwrKztcbnJldHVybiBhfTthLnByb3RvdHlwZS5leGl0U2NvcGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnU7dGhpcy5uZXN0bGV2ZWwtLTsodGhpcy51PTA8PXRoaXMuc3RhY2subGVuZ3RoLTE/dGhpcy5zdGFjay5wb3AoKTpudWxsKSYmdGhpcy51LmFjdGl2YXRlU2NvcGUoKTtpZihcIjxtb2R1bGU+XCIhPT1hLm5hbWUudil7dmFyIGI9YS5uYW1lLiRyKCkudjtiPWIuc3Vic3RyaW5nKDEsYi5sZW5ndGgtMSk7bChhLnNjb3BlbmFtZSxcIi5jb19uYW1lPW5ldyBTay5idWlsdGluc1snc3RyJ10oJ1wiLGIsXCInKTtcIik7dGhpcy5zdGFjay5sZW5ndGgmJlwiY2xhc3NcIj09dGhpcy51LnN0ZS5ibG9ja1R5cGUmJmwoYS5zY29wZW5hbWUsXCIuY29fcXVhbG5hbWU9bmV3IFNrLmJ1aWx0aW5zWydzdHInXSgnXCIrdGhpcy51Lm5hbWUuditcIi5cIitiK1wiJyk7XCIpfWZvcih2YXIgYyBpbiBhLmNvbnN0cylhLmNvbnN0cy5oYXNPd25Qcm9wZXJ0eShjKSYmKGEuc3VmZml4Q29kZSs9YytcIiA9IFwiK2EuY29uc3RzW2NdK1wiO1wiKX07XG5hLnByb3RvdHlwZS5jYm9keT1mdW5jdGlvbihhLGIpe3ZhciBjO2ZvcihjPTA7YzxhLmxlbmd0aDsrK2MpdGhpcy52c3RtdChhW2NdLGIpfTthLnByb3RvdHlwZS5jcHJpbnQ9ZnVuY3Rpb24oYSl7dmFyIGI7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLlByaW50KTthLmRlc3QmJnRoaXMudmV4cHIoYS5kZXN0KTt2YXIgYz1hLnZhbHVlcy5sZW5ndGg7Zm9yKGI9MDtiPGM7KytiKWwoXCIkcmV0ID0gU2subWlzY2V2YWwucHJpbnRfKFwiLFwibmV3IFNrLmJ1aWx0aW5zWydzdHInXShcIix0aGlzLnZleHByKGEudmFsdWVzW2JdKSxcIikudik7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTthLm5sJiYobChcIiRyZXQgPSBTay5taXNjZXZhbC5wcmludF8oXCIsJ1wiXFxcXG5cIik7JyksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpKX07YS5wcm90b3R5cGUuY21vZD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmVudGVyU2NvcGUobmV3IFNrLmJ1aWx0aW4uc3RyKFwiPG1vZHVsZT5cIiksXG5hLDAsdGhpcy5jYW5TdXNwZW5kKSxjPXRoaXMubmV3QmxvY2soXCJtb2R1bGUgZW50cnlcIik7dGhpcy51LnByZWZpeENvZGU9XCJ2YXIgXCIrYitcIj0oZnVuY3Rpb24oJGZvcmNlZ2JsKXtcIjt0aGlzLnUudmFyRGVjbHNDb2RlPVwidmFyICRnYmwgPSAkZm9yY2VnYmwgfHwge30sICRibGs9XCIrYytcIiwkZXhjPVtdLCRsb2M9JGdibCwkY2VsbD17fSwkZXJyPXVuZGVmaW5lZDskbG9jLl9fZmlsZV9fPW5ldyBTay5idWlsdGlucy5zdHIoJ1wiK3RoaXMuZmlsZW5hbWUrXCInKTt2YXIgJHJldD11bmRlZmluZWQsJHBvc3RmaW5hbGx5PXVuZGVmaW5lZCwkY3VyckxpbmVObz11bmRlZmluZWQsJGN1cnJDb2xObz11bmRlZmluZWQ7XCI7bnVsbCE9PVNrLmV4ZWNMaW1pdCYmKHRoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYgKHR5cGVvZiBTay5leGVjU3RhcnQgPT09ICd1bmRlZmluZWQnKSB7U2suZXhlY1N0YXJ0ID0gRGF0ZS5ub3coKX1cIik7bnVsbCE9PVNrLnlpZWxkTGltaXQmJnRoaXMudS5jYW5TdXNwZW5kJiZcbih0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmICh0eXBlb2YgU2subGFzdFlpZWxkID09PSAndW5kZWZpbmVkJykge1NrLmxhc3RZaWVsZCA9IERhdGUubm93KCl9XCIpO3RoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYgKFwiK2IrXCIuJHdha2luZ1N1c3BlbnNpb24hPT11bmRlZmluZWQpIHsgJHdha2VGcm9tU3VzcGVuc2lvbigpOyB9aWYgKFNrLnJldGFpbkdsb2JhbHMpIHsgICAgaWYgKFNrLmdsb2JhbHMpIHsgJGdibCA9IFNrLmdsb2JhbHM7IFNrLmdsb2JhbHMgPSAkZ2JsOyAkbG9jID0gJGdibDsgfSAgICBpZiAoU2suZ2xvYmFscykgeyAkZ2JsID0gU2suZ2xvYmFsczsgU2suZ2xvYmFscyA9ICRnYmw7ICRsb2MgPSAkZ2JsOyAkbG9jLl9fZmlsZV9fPW5ldyBTay5idWlsdGlucy5zdHIoJ1wiK3RoaXMuZmlsZW5hbWUrXCInKTt9ICAgIGVsc2UgeyBTay5nbG9iYWxzID0gJGdibDsgfX0gZWxzZSB7IFNrLmdsb2JhbHMgPSAkZ2JsOyB9XCI7dGhpcy51LnN3aXRjaENvZGU9XCJ3aGlsZSh0cnVlKXt0cnl7XCI7XG50aGlzLnUuc3dpdGNoQ29kZSs9dGhpcy5vdXRwdXRJbnRlcnJ1cHRUZXN0KCk7dGhpcy51LnN3aXRjaENvZGUrPVwic3dpdGNoKCRibGspe1wiO3RoaXMudS5zdWZmaXhDb2RlPVwifVwiO3RoaXMudS5zdWZmaXhDb2RlKz1cIn1jYXRjaChlcnIpeyBpZiAoIShlcnIgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb24pKSB7IGVyciA9IG5ldyBTay5idWlsdGluLkV4dGVybmFsRXJyb3IoZXJyKTsgfSBlcnIudHJhY2ViYWNrLnB1c2goe2xpbmVubzogJGN1cnJMaW5lTm8sIGNvbG5vOiAkY3VyckNvbE5vLCBmaWxlbmFtZTogJ1wiK3RoaXMuZmlsZW5hbWUrXCInfSk7IGlmICgkZXhjLmxlbmd0aD4wKSB7ICRlcnIgPSBlcnI7ICRibGs9JGV4Yy5wb3AoKTsgY29udGludWU7IH0gZWxzZSB7IHRocm93IGVycjsgfX0gfSB9KTtcIjtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5Nb2R1bGU6dGhpcy5jYm9keShhLmJvZHkpO2woXCJyZXR1cm4gJGxvYztcIik7YnJlYWs7XG5kZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInRvZG87IHVuaGFuZGxlZCBjYXNlIGluIGNvbXBpbGVyTW9kXCIpfXRoaXMuZXhpdFNjb3BlKCk7dGhpcy5yZXN1bHQucHVzaCh0aGlzLm91dHB1dEFsbFVuaXRzKCkpO3JldHVybiBifTtTay5jb21waWxlPWZ1bmN0aW9uKGIsYyxlLGYpe2U9U2suX19mdXR1cmVfXztTay5fX2Z1dHVyZV9fPU9iamVjdC5jcmVhdGUoU2suX19mdXR1cmVfXyk7dmFyIGQ9U2sucGFyc2UoYyxiKSxnPVNrLmFzdEZyb21QYXJzZShkLmNzdCxjLGQuZmxhZ3MpO2Q9ZC5mbGFnczt2YXIgaD1Tay5zeW1ib2x0YWJsZShnLGMpO2I9bmV3IGEoYyxoLGQsZixiKTtjPWIuY21vZChnKTtTay5fX2Z1dHVyZV9fPWU7cmV0dXJue2Z1bmNuYW1lOlwiJGNvbXBpbGVkbW9kXCIsY29kZTpcIiRjb21waWxlZG1vZCA9IGZ1bmN0aW9uKCkge1wiK2IucmVzdWx0LmpvaW4oXCJcIikrXCJcXG5yZXR1cm4gXCIrYytcIjt9KCk7XCJ9fTtTay5leHBvcnRTeW1ib2woXCJTay5jb21waWxlXCIsU2suY29tcGlsZSk7XG5Tay5yZXNldENvbXBpbGVyPWZ1bmN0aW9uKCl7U2suZ2Vuc3ltY291bnQ9MH07U2suZXhwb3J0U3ltYm9sKFwiU2sucmVzZXRDb21waWxlclwiLFNrLnJlc2V0Q29tcGlsZXIpO1NrLmZpeFJlc2VydmVkPWI7U2suZXhwb3J0U3ltYm9sKFwiU2suZml4UmVzZXJ2ZWRcIixTay5maXhSZXNlcnZlZCk7U2sudW5maXhSZXNlcnZlZD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9fXFwkcndcXCQkLyxcIlwiKX07U2suZXhwb3J0U3ltYm9sKFwiU2sudW5maXhSZXNlcnZlZFwiLFNrLnVuZml4UmVzZXJ2ZWQpO1NrLm1hbmdsZU5hbWU9ZTtTay5leHBvcnRTeW1ib2woXCJTay5tYW5nbGVOYW1lXCIsU2subWFuZ2xlTmFtZSk7U2sucmVzZXJ2ZWRXb3Jkc189aDtTay5leHBvcnRTeW1ib2woXCJTay5yZXNlcnZlZFdvcmRzX1wiLFNrLnJlc2VydmVkV29yZHNfKX0sZnVuY3Rpb24obSxxKXtTay5zeXNtb2R1bGVzPW5ldyBTay5idWlsdGluLmRpY3QoW10pO1NrLnJlYWxzeXNwYXRoPXZvaWQgMDtTay5pbXBvcnRTZWFyY2hQYXRoRm9yTmFtZT1cbmZ1bmN0aW9uKGEsYyxiKXt2YXIgZT1hLnJlcGxhY2UoL1xcLi9nLFwiL1wiKSxmPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLnRyeUNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLnJlYWQoYSl9LGZ1bmN0aW9uKGEpe30pLGZ1bmN0aW9uKGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayh7ZmlsZW5hbWU6YSxjb2RlOmMscGFja2FnZVBhdGg6Yn0pfSl9O3ZvaWQgMD09PWImJihiPVNrLnJlYWxzeXNwYXRoKTtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihiLnRwJGl0ZXIoKSxmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZihhLnYrXCIvXCIrZStjLCExKSxmdW5jdGlvbihiKXtyZXR1cm4gYj9iOmYoYS52K1wiL1wiK2UrXCIvX19pbml0X19cIitjLGEuditcIi9cIitlKX0pfSl9O1NrLmltcG9ydFNldFVwUGF0aD1mdW5jdGlvbihhKXtpZighU2sucmVhbHN5c3BhdGgpe3ZhciBjPVtuZXcgU2suYnVpbHRpbi5zdHIoXCJzcmMvYnVpbHRpblwiKSxcbm5ldyBTay5idWlsdGluLnN0cihcInNyYy9saWJcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFwiLlwiKV07Zm9yKGE9MDthPFNrLnN5c3BhdGgubGVuZ3RoOysrYSljLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKFNrLnN5c3BhdGhbYV0pKTtTay5yZWFsc3lzcGF0aD1uZXcgU2suYnVpbHRpbi5saXN0KGMpfX07U2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfPWZ1bmN0aW9uKGEsYyxiLGUsZixsLGgpe3ZhciBkLGcsbSxrLHA9bnVsbCxxPXZvaWQgMCE9PWY/Zi50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRuYW1lKTp2b2lkIDAsQT12b2lkIDAhPT1xP3EuditcIi5cIjpcIlwiLHQ9dm9pZCAwIT09Zj9mLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJHBhdGgpOnZvaWQgMDtTay5pbXBvcnRTZXRVcFBhdGgoaCk7aWYoZiYmIXEpe2lmKGwpcmV0dXJuO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBdHRlbXB0ZWQgdG8gaW1wb3J0IHJlbGF0aXZlIHRvIGludmFsaWQgcGFja2FnZSAobm8gbmFtZSlcIik7XG59dm9pZCAwPT09YiYmKGI9QSthKTt2YXIgdj1hLnNwbGl0KFwiLlwiKTtpZigxPHYubGVuZ3RoKXt2YXIgQj12LnNsaWNlKDAsdi5sZW5ndGgtMSkuam9pbihcIi5cIik7cD1Tay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oQixjLHZvaWQgMCx2b2lkIDAsZixsLGgpfXZhciBEPVNrLm1pc2NldmFsLmNoYWluKHAsZnVuY3Rpb24obil7cD1uO2c9U2suc3lzbW9kdWxlcy5xdWljayRsb29rdXAobmV3IFNrLmJ1aWx0aW4uc3RyKGIpKTtyZXR1cm4gdm9pZCAwIT09Zz9wfHxnOlNrLm1pc2NldmFsLmNoYWluKHZvaWQgMCxmdW5jdGlvbigpe3ZhciBiPWE7aWYoMTx2Lmxlbmd0aCl7aWYoIXApcmV0dXJuO209U2suc3lzbW9kdWxlcy5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKEErQikpO2I9dlt2Lmxlbmd0aC0xXTt0PW0udHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kcGF0aCl9az1uZXcgU2suYnVpbHRpbi5tb2R1bGU7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBlKXtkPWErXCIucHlcIjt2YXIgYz1cblNrLmNvbXBpbGUoZSxkLFwiZXhlY1wiLGgpfWVsc2UgYz1Tay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXtpZihTay5vbkJlZm9yZUltcG9ydCYmXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLm9uQmVmb3JlSW1wb3J0KXJldHVybiBTay5vbkJlZm9yZUltcG9ydChhKX0sZnVuY3Rpb24oYyl7aWYoITE9PT1jKXRocm93IG5ldyBTay5idWlsdGluLkltcG9ydEVycm9yKFwiSW1wb3J0aW5nIFwiK2ErXCIgaXMgbm90IGFsbG93ZWRcIik7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBjKXRocm93IG5ldyBTay5idWlsdGluLkltcG9ydEVycm9yKGMpO3JldHVybiBTay5pbXBvcnRTZWFyY2hQYXRoRm9yTmFtZShiLFwiLmpzXCIsdCl9LGZ1bmN0aW9uKGEpe3JldHVybiBhP3tmdW5jbmFtZTpcIiRidWlsdGlubW9kdWxlXCIsY29kZTphLmNvZGUsZmlsZW5hbWU6YS5maWxlbmFtZSxwYWNrYWdlUGF0aDphLnBhY2thZ2VQYXRofTpTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRTZWFyY2hQYXRoRm9yTmFtZShiLFxuXCIucHlcIix0KSxmdW5jdGlvbihiKXtpZihhPWIpcmV0dXJuIFNrLmNvbXBpbGUoYS5jb2RlLGEuZmlsZW5hbWUsXCJleGVjXCIsaCl9LGZ1bmN0aW9uKGIpe2lmKGIpcmV0dXJuIGIucGFja2FnZVBhdGg9YS5wYWNrYWdlUGF0aCxifSl9KTtyZXR1cm4gY30sZnVuY3Rpb24oYSl7aWYoYSl7U2suc3lzbW9kdWxlcy5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihiKSxrKTt2YXIgZT1rLiRqcz1hLmNvZGU7bnVsbD09ZCYmKGQ9YS5maWxlbmFtZSk7bnVsbCE9U2suZGF0ZVNldCYmU2suZGF0ZVNldHx8KGU9XCJTay5leGVjU3RhcnQgPSBTay5sYXN0WWllbGQgPSBuZXcgRGF0ZSgpO1xcblwiK2EuY29kZSxTay5kYXRlU2V0PSEwKTtpZihjKXt2YXIgZj1mdW5jdGlvbihhKXt2YXIgYixjPVNrLmpzX2JlYXV0aWZ5KGEpLnNwbGl0KFwiXFxuXCIpO2ZvcihiPTE7Yjw9Yy5sZW5ndGg7KytiKXt2YXIgZD0oXCJcIitiKS5sZW5ndGg7Zm9yKGE9XCJcIjs1PmQ7KytkKWErPVwiIFwiO2NbYi0xXT1cIi8qIFwiK1xuYStiK1wiICovIFwiK2NbYi0xXX1yZXR1cm4gYy5qb2luKFwiXFxuXCIpfTtlPWYoZSk7U2suZGVidWdvdXQoZSl9ZSs9XCJcXG5cIithLmZ1bmNuYW1lK1wiO1wiO2U9U2suZ2xvYmFsLmV2YWwoZSk7ay4kZD17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKGIpLF9fZG9jX186U2suYnVpbHRpbi5ub25lLm5vbmUkLF9fcGFja2FnZV9fOmEucGFja2FnZVBhdGg/bmV3IFNrLmJ1aWx0aW4uc3RyKGIpOkI/bmV3IFNrLmJ1aWx0aW4uc3RyKEErQik6cT9xOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH07YS5wYWNrYWdlUGF0aCYmKGsuJGQuX19wYXRoX189bmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihhLnBhY2thZ2VQYXRoKV0pKTtyZXR1cm4gZShrLiRkKX19LGZ1bmN0aW9uKGIpe3ZhciBjO2lmKHZvaWQgMD09PWIpe2lmKGwmJiFwKXJldHVybjt0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihcIk5vIG1vZHVsZSBuYW1lZCBcIithKTt9aWYoYiE9PWsuJGQpe2ZvcihjIGluIGsuJGQpYltjXXx8XG4oYltjXT1rLiRkW2NdKTtrLiRkPWJ9aWYoU2sub25BZnRlckltcG9ydCYmXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLm9uQWZ0ZXJJbXBvcnQpdHJ5e1NrLm9uQWZ0ZXJJbXBvcnQoYSl9Y2F0Y2goVil7fWlmKHApcmV0dXJuIG0udHAkc2V0YXR0cihuZXcgU2suYnVpbHRpbi5zdHIodlt2Lmxlbmd0aC0xXSksaykscDtmJiZmLnRwJHNldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKGEpLGspO3JldHVybiBrfSl9KTtyZXR1cm4gaD9EOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhEKX07U2suaW1wb3J0TW9kdWxlPWZ1bmN0aW9uKGEsYyxiKXtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCwhMSxiKX07U2suaW1wb3J0TWFpbj1mdW5jdGlvbihhLGMsYil7U2suZGF0ZVNldD0hMTtTay5maWxlc0xvYWRlZD0hMTtTay5zeXNtb2R1bGVzPW5ldyBTay5idWlsdGluLmRpY3QoW10pO1NrLnJlYWxzeXNwYXRoPVxudm9pZCAwO1NrLnJlc2V0Q29tcGlsZXIoKTtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fbWFpbl9fXCIsdm9pZCAwLHZvaWQgMCwhMSxiKX07U2suaW1wb3J0TWFpbldpdGhCb2R5PWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmRhdGVTZXQ9ITE7U2suZmlsZXNMb2FkZWQ9ITE7U2suc3lzbW9kdWxlcz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTtTay5yZWFsc3lzcGF0aD12b2lkIDA7U2sucmVzZXRDb21waWxlcigpO3JldHVybiBTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSxjLFwiX19tYWluX19cIixiLHZvaWQgMCwhMSxlKX07U2suaW1wb3J0QnVpbHRpbldpdGhCb2R5PWZ1bmN0aW9uKGEsYyxiLGUpe3JldHVybiBTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSxjLFwiX19idWlsdGluX18uXCIrYSxiLHZvaWQgMCwhMSxlKX07U2suYnVpbHRpbi5fX2ltcG9ydF9fPWZ1bmN0aW9uKGEsYyxiLGUsZil7dmFyIGw9U2suZ2xvYmFscyxoO3ZvaWQgMD09PWYmJihmPVNrLl9fZnV0dXJlX18uYWJzb2x1dGVfaW1wb3J0P1xuMDotMSk7aWYoMCE9PWYmJmMuX19wYWNrYWdlX18mJmMuX19wYWNrYWdlX18hPT1Tay5idWlsdGluLm5vbmUubm9uZSQpe2lmKChoPWMuX19wYWNrYWdlX18udikmJjA8Zil7Yz1oLnNwbGl0KFwiLlwiKTtpZihmLTE+PWMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGJleW9uZCB0b3BsZXZlbCBwYWNrYWdlXCIpO2MubGVuZ3RoLT1mLTE7aD1jLmpvaW4oXCIuXCIpfXZhciBkPVNrLnN5c21vZHVsZXMucXVpY2skbG9va3VwKG5ldyBTay5idWlsdGluLnN0cihoKSl9aWYoMDxmJiZ2b2lkIDA9PT1kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGluIG5vbi1wYWNrYWdlXCIpO2Euc3BsaXQoXCIuXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXtpZigwIT09ZiYmdm9pZCAwIT09ZClyZXR1cm5cIlwiPT09YT9kOlNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLFxudm9pZCAwLGgrXCIuXCIrYSx2b2lkIDAsZCwtMT09ZiwhMCl9LGZ1bmN0aW9uKGIpe3JldHVybiB2b2lkIDA9PT1iPyhoPWQ9dm9pZCAwLFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCwhMSwhMCkpOmJ9LGZ1bmN0aW9uKGIpe2lmKGUmJjAhPT1lLmxlbmd0aCl7dmFyIGM7dmFyIGQ9U2suc3lzbW9kdWxlcy5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKChofHxcIlwiKSsoaCYmYT9cIi5cIjpcIlwiKSthKSk7Zm9yKGI9MDtiPGUubGVuZ3RoO2IrKyl7dmFyIGY9ZVtiXTtcIipcIiE9ZiYmdm9pZCAwPT09ZC50cCRnZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihmKSkmJihjPVNrLm1pc2NldmFsLmNoYWluKGMsU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfLmJpbmQobnVsbCxmLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGQsITAsITApKSl9cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGMsZnVuY3Rpb24oKXtTay5hc3NlcnRzLmFzc2VydChkKTtyZXR1cm4gZH0pfXJldHVybiBifSxcbmZ1bmN0aW9uKGEpe2whPT1Tay5nbG9iYWxzJiYoU2suZ2xvYmFscz1sKTtyZXR1cm4gYX0pfTtTay5pbXBvcnRTdGFyPWZ1bmN0aW9uKGEsYyxiKXtpZihiPWEudHAkZ2V0YXR0cihuZXcgU2suYnVpbHRpbi5zdHIoXCJfX2FsbF9fXCIpKSlmb3IobGV0IGU9U2suYWJzdHIuaXRlcihiKSxmPWUudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1mO2Y9ZS50cCRpdGVybmV4dCgpKWNbZi52XT1Tay5hYnN0ci5nYXR0cihhLGYpO2Vsc2V7Yj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhLiRkKTtmb3IobGV0IGUgaW4gYilcIl9cIiE9YltlXS5jaGFyQXQoMCkmJihjW2JbZV1dPWEuJGRbYltlXV0pfX07U2suZXhwb3J0U3ltYm9sKFwiU2suaW1wb3J0TWFpblwiLFNrLmltcG9ydE1haW4pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydE1haW5XaXRoQm9keVwiLFNrLmltcG9ydE1haW5XaXRoQm9keSk7U2suZXhwb3J0U3ltYm9sKFwiU2suaW1wb3J0QnVpbHRpbldpdGhCb2R5XCIsU2suaW1wb3J0QnVpbHRpbldpdGhCb2R5KTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uX19pbXBvcnRfX1wiLFNrLmJ1aWx0aW4uX19pbXBvcnRfXyk7U2suZXhwb3J0U3ltYm9sKFwiU2suaW1wb3J0U3RhclwiLFNrLmltcG9ydFN0YXIpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4udGltU29ydD1mdW5jdGlvbihhLGMpe3RoaXMubGlzdD1uZXcgU2suYnVpbHRpbi5saXN0KGEudik7dGhpcy5NSU5fR0FMTE9QPTc7dGhpcy5saXN0bGVuZ3RoPWM/YzphLnNxJGxlbmd0aCgpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLmx0PWZ1bmN0aW9uKGEsYyl7cmV0dXJuIFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLGMsXCJMdFwiKX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5sZT1mdW5jdGlvbihhLGMpe3JldHVybiF0aGlzLmx0KGMsYSl9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUuc2V0aXRlbT1mdW5jdGlvbihhLGMpe3RoaXMubGlzdC52W2FdPWN9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUuYmluYXJ5X3NvcnQ9XG5mdW5jdGlvbihhLGMpe3ZhciBiO2ZvcihiPWEuYmFzZStjO2I8YS5iYXNlK2EubGVuO2IrKyl7dmFyIGU9YS5iYXNlO3ZhciBmPWI7Zm9yKGM9YS5nZXRpdGVtKGYpO2U8Zjspe3ZhciBsPWUrKGYtZT4+MSk7dGhpcy5sdChjLGEuZ2V0aXRlbShsKSk/Zj1sOmU9bCsxfVNrLmFzc2VydHMuYXNzZXJ0KGU9PT1mKTtmb3IobD1iO2w+ZTtsLS0pYS5zZXRpdGVtKGwsYS5nZXRpdGVtKGwtMSkpO2Euc2V0aXRlbShlLGMpfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5jb3VudF9ydW49ZnVuY3Rpb24oYSl7dmFyIGM7aWYoMT49YS5sZW4pe3ZhciBiPWEubGVuO3ZhciBlPSExfWVsc2UgaWYoYj0yLHRoaXMubHQoYS5nZXRpdGVtKGEuYmFzZSsxKSxhLmdldGl0ZW0oYS5iYXNlKSkpZm9yKGU9ITAsYz1hLmJhc2UrMjtjPGEuYmFzZSthLmxlbjtjKyspaWYodGhpcy5sdChhLmdldGl0ZW0oYyksYS5nZXRpdGVtKGMtMSkpKWIrKztlbHNlIGJyZWFrO2Vsc2UgZm9yKGU9ITEsYz1hLmJhc2UrXG4yO2M8YS5iYXNlK2EubGVuJiYhdGhpcy5sdChhLmdldGl0ZW0oYyksYS5nZXRpdGVtKGMtMSkpO2MrKyliKys7cmV0dXJue3J1bjpuZXcgU2suYnVpbHRpbi5saXN0U2xpY2UoYS5saXN0LGEuYmFzZSxiKSxkZXNjZW5kaW5nOmV9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLnNvcnQ9ZnVuY3Rpb24oKXt2YXIgYSxjPW5ldyBTay5idWlsdGluLmxpc3RTbGljZSh0aGlzLmxpc3QsMCx0aGlzLmxpc3RsZW5ndGgpO2lmKCEoMj5jLmxlbikpe3RoaXMubWVyZ2VfaW5pdCgpO2ZvcihhPXRoaXMubWVyZ2VfY29tcHV0ZV9taW5ydW4oYy5sZW4pOzA8Yy5sZW47KXt2YXIgYj10aGlzLmNvdW50X3J1bihjKTtiLmRlc2NlbmRpbmcmJmIucnVuLnJldmVyc2UoKTtpZihiLnJ1bi5sZW48YSl7dmFyIGU9Yi5ydW4ubGVuO2IucnVuLmxlbj1hPGMubGVuP2E6Yy5sZW47dGhpcy5iaW5hcnlfc29ydChiLnJ1bixlKX1jLmFkdmFuY2UoYi5ydW4ubGVuKTt0aGlzLnBlbmRpbmcucHVzaChiLnJ1bik7XG50aGlzLm1lcmdlX2NvbGxhcHNlKCl9U2suYXNzZXJ0cy5hc3NlcnQoYy5iYXNlPT10aGlzLmxpc3RsZW5ndGgpO3RoaXMubWVyZ2VfZm9yY2VfY29sbGFwc2UoKTtTay5hc3NlcnRzLmFzc2VydCgxPT10aGlzLnBlbmRpbmcubGVuZ3RoKTtTay5hc3NlcnRzLmFzc2VydCgwPT09dGhpcy5wZW5kaW5nWzBdLmJhc2UpO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMucGVuZGluZ1swXS5sZW49PXRoaXMubGlzdGxlbmd0aCl9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLmdhbGxvcD1mdW5jdGlvbihhLGMsYixlKXt2YXIgZjtTay5hc3NlcnRzLmFzc2VydCgwPD1iJiZiPGMubGVuKTt2YXIgbD10aGlzO2U9ZT9mdW5jdGlvbihhLGIpe3JldHVybiBsLmxlKGEsYil9OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGwubHQoYSxiKX07dmFyIGg9Yy5iYXNlK2I7dmFyIGQ9MDt2YXIgZz0xO2lmKGUoYy5nZXRpdGVtKGgpLGEpKXtmb3IoZj1jLmxlbi1iO2c8ZjspaWYoZShjLmdldGl0ZW0oaCtnKSxcbmEpKXtkPWc7dHJ5e2c9KGc8PDEpKzF9Y2F0Y2gobil7Zz1mfX1lbHNlIGJyZWFrO2c+ZiYmKGc9Zik7ZCs9YjtnKz1ifWVsc2V7Zm9yKGY9YisxO2c8ZiYmIWUoYy5nZXRpdGVtKGgtZyksYSk7KXtkPWc7dHJ5e2c9KGc8PDEpKzF9Y2F0Y2gobil7Zz1mfX1nPmYmJihnPWYpO2g9Yi1kO2Q9Yi1nO2c9aH1Tay5hc3NlcnRzLmFzc2VydCgtMTw9ZDxnPD1jLmxlbik7Zm9yKGQrPTE7ZDxnOyliPWQrKGctZD4+MSksZShjLmdldGl0ZW0oYy5iYXNlK2IpLGEpP2Q9YisxOmc9YjtTay5hc3NlcnRzLmFzc2VydChkPT1nKTtyZXR1cm4gZ307U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5tZXJnZV9pbml0PWZ1bmN0aW9uKCl7dGhpcy5taW5fZ2FsbG9wPXRoaXMuTUlOX0dBTExPUDt0aGlzLnBlbmRpbmc9W119O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfbG89ZnVuY3Rpb24oYSxjKXt2YXIgYixlLGY7U2suYXNzZXJ0cy5hc3NlcnQoMDxhLmxlbiYmMDxjLmxlbiYmYS5iYXNlK1xuYS5sZW49PWMuYmFzZSk7dmFyIGw9dGhpcy5taW5fZ2FsbG9wO3ZhciBoPWEuYmFzZTthPWEuY29weWl0ZW1zKCk7dHJ5e2lmKHRoaXMuc2V0aXRlbShoLGMucG9wbGVmdCgpKSxoKyssMSE9YS5sZW4mJjAhPT1jLmxlbilmb3IoOzspe2ZvcihlPWI9MDs7KWlmKHRoaXMubHQoYy5nZXRpdGVtKGMuYmFzZSksYS5nZXRpdGVtKGEuYmFzZSkpKXt0aGlzLnNldGl0ZW0oaCxjLnBvcGxlZnQoKSk7aCsrO2lmKDA9PT1jLmxlbilyZXR1cm47ZSsrO2I9MDtpZihlPj1sKWJyZWFrfWVsc2V7dGhpcy5zZXRpdGVtKGgsYS5wb3BsZWZ0KCkpO2grKztpZigxPT1hLmxlbilyZXR1cm47YisrO2U9MDtpZihiPj1sKWJyZWFrfWZvcihsKz0xOzspe3RoaXMubWluX2dhbGxvcD1sLT0xPGw7Yj10aGlzLmdhbGxvcChjLmdldGl0ZW0oYy5iYXNlKSxhLDAsITApO2ZvcihmPWEuYmFzZTtmPGEuYmFzZStiO2YrKyl0aGlzLnNldGl0ZW0oaCxhLmdldGl0ZW0oZikpLGgrKzthLmFkdmFuY2UoYik7aWYoMT49XG5hLmxlbilyZXR1cm47dGhpcy5zZXRpdGVtKGgsYy5wb3BsZWZ0KCkpO2grKztpZigwPT09Yy5sZW4pcmV0dXJuO2U9dGhpcy5nYWxsb3AoYS5nZXRpdGVtKGEuYmFzZSksYywwLCExKTtmb3IoZj1jLmJhc2U7ZjxjLmJhc2UrZTtmKyspdGhpcy5zZXRpdGVtKGgsYy5nZXRpdGVtKGYpKSxoKys7Yy5hZHZhbmNlKGUpO2lmKDA9PT1jLmxlbilyZXR1cm47dGhpcy5zZXRpdGVtKGgsYS5wb3BsZWZ0KCkpO2grKztpZigxPT1hLmxlbilyZXR1cm47aWYoYjx0aGlzLk1JTl9HQUxMT1AmJmU8dGhpcy5NSU5fR0FMTE9QKWJyZWFrO2wrKzt0aGlzLm1pbl9nYWxsb3A9bH19fWZpbmFsbHl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YS5sZW4mJjA8PWMubGVuKTtmb3IoZj1jLmJhc2U7ZjxjLmJhc2UrYy5sZW47ZisrKXRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSksaCsrO2ZvcihmPWEuYmFzZTtmPGEuYmFzZSthLmxlbjtmKyspdGhpcy5zZXRpdGVtKGgsYS5nZXRpdGVtKGYpKSxoKyt9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2hpPVxuZnVuY3Rpb24oYSxjKXt2YXIgYixlLGY7U2suYXNzZXJ0cy5hc3NlcnQoMDxhLmxlbiYmMDxjLmxlbiYmYS5iYXNlK2EubGVuPT1jLmJhc2UpO3ZhciBsPXRoaXMubWluX2dhbGxvcDt2YXIgaD1jLmJhc2UrYy5sZW47Yz1jLmNvcHlpdGVtcygpO3RyeXtpZihoLS0sdGhpcy5zZXRpdGVtKGgsYS5wb3ByaWdodCgpKSwwIT09YS5sZW4mJjEhPWMubGVuKWZvcig7Oyl7Zm9yKGU9Yj0wOzspe3ZhciBkPWEuZ2V0aXRlbShhLmJhc2UrYS5sZW4tMSk7dmFyIGc9Yy5nZXRpdGVtKGMuYmFzZStjLmxlbi0xKTtpZih0aGlzLmx0KGcsZCkpe2gtLTt0aGlzLnNldGl0ZW0oaCxkKTthLmxlbi0tO2lmKDA9PT1hLmxlbilyZXR1cm47YisrO2U9MDtpZihiPj1sKWJyZWFrfWVsc2V7aC0tO3RoaXMuc2V0aXRlbShoLGcpO2MubGVuLS07aWYoMT09Yy5sZW4pcmV0dXJuO2UrKztiPTA7aWYoZT49bClicmVha319Zm9yKGwrPTE7Oyl7dGhpcy5taW5fZ2FsbG9wPWwtPTE8bDtnPWMuZ2V0aXRlbShjLmJhc2UrXG5jLmxlbi0xKTt2YXIgbT10aGlzLmdhbGxvcChnLGEsYS5sZW4tMSwhMCk7Yj1hLmxlbi1tO2ZvcihmPWEuYmFzZSthLmxlbi0xO2Y+YS5iYXNlK20tMTtmLS0paC0tLHRoaXMuc2V0aXRlbShoLGEuZ2V0aXRlbShmKSk7YS5sZW4tPWI7aWYoMD09PWEubGVuKXJldHVybjtoLS07dGhpcy5zZXRpdGVtKGgsYy5wb3ByaWdodCgpKTtpZigxPT1jLmxlbilyZXR1cm47ZD1hLmdldGl0ZW0oYS5iYXNlK2EubGVuLTEpO209dGhpcy5nYWxsb3AoZCxjLGMubGVuLTEsITEpO2U9Yy5sZW4tbTtmb3IoZj1jLmJhc2UrYy5sZW4tMTtmPmMuYmFzZSttLTE7Zi0tKWgtLSx0aGlzLnNldGl0ZW0oaCxjLmdldGl0ZW0oZikpO2MubGVuLT1lO2lmKDE+PWMubGVuKXJldHVybjtoLS07dGhpcy5zZXRpdGVtKGgsYS5wb3ByaWdodCgpKTtpZigwPT09YS5sZW4pcmV0dXJuO2lmKGI8dGhpcy5NSU5fR0FMTE9QJiZlPHRoaXMuTUlOX0dBTExPUClicmVhaztsKys7dGhpcy5taW5fZ2FsbG9wPWx9fX1maW5hbGx5e1NrLmFzc2VydHMuYXNzZXJ0KDA8PVxuYS5sZW4mJjA8PWMubGVuKTtmb3IoZj1hLmJhc2UrYS5sZW4tMTtmPmEuYmFzZS0xO2YtLSloLS0sdGhpcy5zZXRpdGVtKGgsYS5nZXRpdGVtKGYpKTtmb3IoZj1jLmJhc2UrYy5sZW4tMTtmPmMuYmFzZS0xO2YtLSloLS0sdGhpcy5zZXRpdGVtKGgsYy5nZXRpdGVtKGYpKX19O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfYXQ9ZnVuY3Rpb24oYSl7MD5hJiYoYT10aGlzLnBlbmRpbmcubGVuZ3RoK2EpO3ZhciBjPXRoaXMucGVuZGluZ1thXTt2YXIgYj10aGlzLnBlbmRpbmdbYSsxXTtTay5hc3NlcnRzLmFzc2VydCgwPGMubGVuJiYwPGIubGVuKTtTay5hc3NlcnRzLmFzc2VydChjLmJhc2UrYy5sZW49PWIuYmFzZSk7dGhpcy5wZW5kaW5nW2FdPW5ldyBTay5idWlsdGluLmxpc3RTbGljZSh0aGlzLmxpc3QsYy5iYXNlLGMubGVuK2IubGVuKTt0aGlzLnBlbmRpbmcuc3BsaWNlKGErMSwxKTthPXRoaXMuZ2FsbG9wKGIuZ2V0aXRlbShiLmJhc2UpLGMsMCwhMCk7Yy5hZHZhbmNlKGEpO1xuMCE9PWMubGVuJiYoYi5sZW49dGhpcy5nYWxsb3AoYy5nZXRpdGVtKGMuYmFzZStjLmxlbi0xKSxiLGIubGVuLTEsITEpLDAhPT1iLmxlbiYmKGMubGVuPD1iLmxlbj90aGlzLm1lcmdlX2xvKGMsYik6dGhpcy5tZXJnZV9oaShjLGIpKSl9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfY29sbGFwc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5wZW5kaW5nOzE8YS5sZW5ndGg7KWlmKDM8PWEubGVuZ3RoJiZhW2EubGVuZ3RoLTNdLmxlbjw9YVthLmxlbmd0aC0yXS5sZW4rYVthLmxlbmd0aC0xXS5sZW4pYVthLmxlbmd0aC0zXS5sZW48YVthLmxlbmd0aC0xXS5sZW4/dGhpcy5tZXJnZV9hdCgtMyk6dGhpcy5tZXJnZV9hdCgtMik7ZWxzZSBpZihhW2EubGVuZ3RoLTJdLmxlbjw9YVthLmxlbmd0aC0xXS5sZW4pdGhpcy5tZXJnZV9hdCgtMik7ZWxzZSBicmVha307U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5tZXJnZV9mb3JjZV9jb2xsYXBzZT1mdW5jdGlvbigpe2Zvcih2YXIgYT1cbnRoaXMucGVuZGluZzsxPGEubGVuZ3RoOykzPD1hLmxlbmd0aCYmYVthLmxlbmd0aC0zXS5sZW48YVthLmxlbmd0aC0xXS5sZW4/dGhpcy5tZXJnZV9hdCgtMyk6dGhpcy5tZXJnZV9hdCgtMil9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfY29tcHV0ZV9taW5ydW49ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7NjQ8PWE7KWN8PWEmMSxhPj49MTtyZXR1cm4gYStjfTtTay5idWlsdGluLmxpc3RTbGljZT1mdW5jdGlvbihhLGMsYil7dGhpcy5saXN0PWE7dGhpcy5iYXNlPWM7dGhpcy5sZW49Yn07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLmNvcHlpdGVtcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYmFzZSxjPXRoaXMuYmFzZSt0aGlzLmxlbjtTay5hc3NlcnRzLmFzc2VydCgwPD1hPD1jKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdFNsaWNlKG5ldyBTay5idWlsdGluLmxpc3QodGhpcy5saXN0LnYuc2xpY2UoYSxjKSksMCx0aGlzLmxlbil9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5hZHZhbmNlPVxuZnVuY3Rpb24oYSl7dGhpcy5iYXNlKz1hO3RoaXMubGVuLT1hO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMuYmFzZTw9dGhpcy5saXN0LnNxJGxlbmd0aCgpKX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLmdldGl0ZW09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubGlzdC52W2FdfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUuc2V0aXRlbT1mdW5jdGlvbihhLGMpe3RoaXMubGlzdC52W2FdPWN9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5wb3BsZWZ0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5saXN0LnZbdGhpcy5iYXNlXTt0aGlzLmJhc2UrKzt0aGlzLmxlbi0tO3JldHVybiBhfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUucG9wcmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLmxlbi0tO3JldHVybiB0aGlzLmxpc3Qudlt0aGlzLmJhc2UrdGhpcy5sZW5dfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2Zvcih2YXIgYSxcbmMsYj10aGlzLmxpc3QsZT10aGlzLmJhc2UsZj1lK3RoaXMubGVuLTE7ZTxmOylhPWIudltmXSxjPWIudltlXSxiLnZbZV09YSxiLnZbZl09YyxlKyssZi0tfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmxpc3RTbGljZVwiLFNrLmJ1aWx0aW4ubGlzdFNsaWNlKTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLnRpbVNvcnRcIixTay5idWlsdGluLnRpbVNvcnQpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc3VwZXJfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJzdXBlclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLnN1cGVyXyxcImJhZCBjYWxsIHRvIHN1cGVyLCB1c2UgJ25ldydcIik7dGhpcy50eXBlPWE7dGhpcy5vYmo9YztpZih2b2lkIDAhPT1hJiYhU2suYnVpbHRpbi5jaGVja0NsYXNzKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm11c3QgYmUgdHlwZSwgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoYSkpO3RoaXMub2JqX3R5cGU9dm9pZCAwIT09dGhpcy5vYmo/dGhpcy4kc3VwZXJjaGVjayhhLHRoaXMub2JqKTpudWxsfSxzbG90czp7dHAkZG9jOlwic3VwZXIoKSAtPiBzYW1lIGFzIHN1cGVyKF9fY2xhc3NfXywgPGZpcnN0IGFyZ3VtZW50PilcXG5zdXBlcih0eXBlKSAtPiB1bmJvdW5kIHN1cGVyIG9iamVjdFxcbnN1cGVyKHR5cGUsIG9iaikgLT4gYm91bmQgc3VwZXIgb2JqZWN0OyByZXF1aXJlcyBpc2luc3RhbmNlKG9iaiwgdHlwZSlcXG5zdXBlcih0eXBlLCB0eXBlMikgLT4gYm91bmQgc3VwZXIgb2JqZWN0OyByZXF1aXJlcyBpc3N1YmNsYXNzKHR5cGUyLCB0eXBlKVxcblR5cGljYWwgdXNlIHRvIGNhbGwgYSBjb29wZXJhdGl2ZSBzdXBlcmNsYXNzIG1ldGhvZDpcXG5jbGFzcyBDKEIpOlxcbiAgICBkZWYgbWV0aChzZWxmLCBhcmcpOlxcbiAgICAgICAgc3VwZXIoKS5tZXRoKGFyZylcXG5UaGlzIHdvcmtzIGZvciBjbGFzcyBtZXRob2RzIHRvbzpcXG5jbGFzcyBDKEIpOlxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIGNtZXRoKGNscywgYXJnKTpcXG4gICAgICAgIHN1cGVyKCkuY21ldGgoYXJnKVxcblwiLFxudHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic3VwZXJcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJzdXBlclwiLGEsMSwyKTtjPWFbMF07YT1hWzFdO2lmKCFTay5idWlsdGluLmNoZWNrQ2xhc3MoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibXVzdCBiZSB0eXBlLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpO3RoaXMub2JqPWE7dGhpcy50eXBlPWM7bnVsbCE9dGhpcy5vYmomJih0aGlzLm9ial90eXBlPXRoaXMuJHN1cGVyY2hlY2soYyx0aGlzLm9iaikpfSwkcigpe3JldHVybiB0aGlzLm9iaj9uZXcgU2suYnVpbHRpbi5zdHIoXCI8c3VwZXI6IDxjbGFzcyAnXCIrdGhpcy50eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJz4sIDxcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzLm9iaikrXCIgb2JqZWN0Pj5cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPHN1cGVyOiA8Y2xhc3MgJ1wiK3RoaXMudHlwZS5wcm90b3R5cGUudHAkbmFtZStcblwiJz4sIE5VTEw+XCIpfSx0cCRnZXRhdHRyKGEsYyl7bGV0IGI9dGhpcy5vYmpfdHlwZTtpZihudWxsPT1iKXJldHVybiBTay5nZW5lcmljLmdldEF0dHIuY2FsbCh0aGlzLGEsYyk7dmFyIGU9Yi5wcm90b3R5cGUudHAkbXJvO2NvbnN0IGY9ZS5sZW5ndGg7aWYoYT09PVNrLmJ1aWx0aW4uc3RyLiRjbGFzcylyZXR1cm4gU2suZ2VuZXJpYy5nZXRBdHRyLmNhbGwodGhpcyxhLGMpO2xldCBsO2ZvcihsPTA7bCsxPGYmJnRoaXMudHlwZSE9PWVbbF07bCsrKTtsKys7aWYobD49ZilyZXR1cm4gU2suZ2VuZXJpYy5nZXRBdHRyLmNhbGwodGhpcyxhLGMpO2E9YS4kbWFuZ2xlZDtsZXQgaDtmb3IoO2w8Zjspe2M9ZVtsXS5wcm90b3R5cGU7Yy5oYXNPd25Qcm9wZXJ0eShhKSYmKGg9Y1thXSk7aWYodm9pZCAwIT09aClyZXR1cm4gZT1oLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1lJiYoaD1lLmNhbGwoaCx0aGlzLm9iaj09PWI/bnVsbDp0aGlzLm9iaixiKSksaDtsKyt9fSx0cCRkZXNjcl9nZXQoYSxcbmMpe2lmKG51bGw9PT1hfHxudWxsIT10aGlzLm9iailyZXR1cm4gdGhpcztpZih0aGlzLm9iJHR5cGUhPT1Tay5idWlsdGluLnN1cGVyXylyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KHRoaXMub2IkdHlwZSxbdGhpcy50eXBlLGFdKTt7Yz10aGlzLiRzdXBlcmNoZWNrKHRoaXMudHlwZSxhKTtjb25zdCBiPW5ldyBTay5idWlsdGluLnN1cGVyXztiLnR5cGU9dGhpcy50eXBlO2Iub2JqPWE7Yi5vYmpfdHlwZT1jO3JldHVybiBifX19LGdldHNldHM6e19fdGhpc2NsYXNzX186eyRnZXQoKXtyZXR1cm4gdGhpcy50eXBlfSwkZG9jOlwidGhlIGNsYXNzIGludm9raW5nIHN1cGVyKClcIn0sX19zZWxmX186eyRnZXQoKXtyZXR1cm4gdGhpcy5vYmp8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGRvYzpcInRoZSBpbnN0YW5jZSBpbnZva2luZyBzdXBlcigpOyBtYXkgYmUgTm9uZVwifSxfX3NlbGZfY2xhc3NfXzp7JGdldCgpe3JldHVybiB0aGlzLm9ial90eXBlfHxTay5idWlsdGluLm5vbmUubm9uZSR9LFxuJGRvYzpcInRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSBpbnZva2luZyBzdXBlcigpOyBtYXkgYmUgTm9uZVwifX0scHJvdG86eyRzdXBlcmNoZWNrKGEsYyl7aWYoU2suYnVpbHRpbi5jaGVja0NsYXNzKGMpJiZjLiRpc1N1YlR5cGUoYSkpcmV0dXJuIGM7aWYoYy5vYiR0eXBlLiRpc1N1YlR5cGUoYSkpcmV0dXJuIGMub2IkdHlwZTt7Y29uc3QgYj1jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGNsYXNzKTtpZih2b2lkIDAhPT1iJiZiIT09Yy5vYiR0eXBlJiZTay5idWlsdGluLmNoZWNrQ2xhc3MoYikmJmIuJGlzU3ViVHlwZShhKSlyZXR1cm4gYn10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdXBlcih0eXBlLCBvYmopOiBvYmogbXVzdCBiZSBhbiBpbnN0YW5jZSBvciBzdWJ0eXBlIG9mIHR5cGVcIik7fX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGlucz17cm91bmQ6bnVsbCxsZW46bnVsbCxtaW46bnVsbCxtYXg6bnVsbCxzdW06bnVsbCxhYnM6bnVsbCxmYWJzOm51bGwsXG5vcmQ6bnVsbCxjaHI6bnVsbCxoZXg6bnVsbCxvY3Q6bnVsbCxiaW46bnVsbCxkaXI6bnVsbCxyZXByOm51bGwsb3BlbjpudWxsLGlzaW5zdGFuY2U6bnVsbCxoYXNoOm51bGwsZ2V0YXR0cjpudWxsLGhhc2F0dHI6bnVsbCxpZDpudWxsLHJlZHVjZTpuZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4ucmVkdWNlKSxzb3J0ZWQ6bnVsbCxhbnk6bnVsbCxhbGw6bnVsbCxlbnVtZXJhdGU6U2suYnVpbHRpbi5lbnVtZXJhdGUsZmlsdGVyOlNrLmJ1aWx0aW4uZmlsdGVyXyxtYXA6U2suYnVpbHRpbi5tYXBfLHJhbmdlOlNrLmJ1aWx0aW4ucmFuZ2VfLHJldmVyc2VkOlNrLmJ1aWx0aW4ucmV2ZXJzZWQsemlwOlNrLmJ1aWx0aW4uemlwXyxCYXNlRXhjZXB0aW9uOlNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbixBdHRyaWJ1dGVFcnJvcjpTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yLFZhbHVlRXJyb3I6U2suYnVpbHRpbi5WYWx1ZUVycm9yLEV4Y2VwdGlvbjpTay5idWlsdGluLkV4Y2VwdGlvbixcblplcm9EaXZpc2lvbkVycm9yOlNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IsQXNzZXJ0aW9uRXJyb3I6U2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcixJbXBvcnRFcnJvcjpTay5idWlsdGluLkltcG9ydEVycm9yLEluZGVudGF0aW9uRXJyb3I6U2suYnVpbHRpbi5JbmRlbnRhdGlvbkVycm9yLEluZGV4RXJyb3I6U2suYnVpbHRpbi5JbmRleEVycm9yLExvb2t1cEVycm9yOlNrLmJ1aWx0aW4uTG9va3VwRXJyb3IsS2V5RXJyb3I6U2suYnVpbHRpbi5LZXlFcnJvcixUeXBlRXJyb3I6U2suYnVpbHRpbi5UeXBlRXJyb3IsVW5pY29kZURlY29kZUVycm9yOlNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yLFVuaWNvZGVFbmNvZGVFcnJvcjpTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcixOYW1lRXJyb3I6U2suYnVpbHRpbi5OYW1lRXJyb3IsSU9FcnJvcjpTay5idWlsdGluLklPRXJyb3IsTm90SW1wbGVtZW50ZWRFcnJvcjpTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IsXG5TeXN0ZW1FeGl0OlNrLmJ1aWx0aW4uU3lzdGVtRXhpdCxPdmVyZmxvd0Vycm9yOlNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixPcGVyYXRpb25FcnJvcjpTay5idWlsdGluLk9wZXJhdGlvbkVycm9yLE5lZ2F0aXZlUG93ZXJFcnJvcjpTay5idWlsdGluLk5lZ2F0aXZlUG93ZXJFcnJvcixSdW50aW1lRXJyb3I6U2suYnVpbHRpbi5SdW50aW1lRXJyb3IsUmVjdXJzaW9uRXJyb3I6U2suYnVpbHRpbi5SZWN1cnNpb25FcnJvcixTdG9wSXRlcmF0aW9uOlNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbixTeW50YXhFcnJvcjpTay5idWlsdGluLlN5bnRheEVycm9yLFN5c3RlbUVycm9yOlNrLmJ1aWx0aW4uU3lzdGVtRXJyb3IsZmxvYXRfJHJ3JDpTay5idWlsdGluLmZsb2F0XyxpbnRfJHJ3JDpTay5idWlsdGluLmludF8sYm9vbDpTay5idWlsdGluLmJvb2wsY29tcGxleDpTay5idWlsdGluLmNvbXBsZXgsZGljdDpTay5idWlsdGluLmRpY3QsZmlsZTpTay5idWlsdGluLmZpbGUsZnJvemVuc2V0OlNrLmJ1aWx0aW4uZnJvemVuc2V0LFxuXCJmdW5jdGlvblwiOlNrLmJ1aWx0aW4uZnVuYyxnZW5lcmF0b3I6U2suYnVpbHRpbi5nZW5lcmF0b3IsbGlzdDpTay5idWlsdGluLmxpc3QsbG9uZ18kcnckOlNrLmJ1aWx0aW4ubG5nLG1ldGhvZDpTay5idWlsdGluLm1ldGhvZCxvYmplY3Q6U2suYnVpbHRpbi5vYmplY3Qsc2xpY2U6U2suYnVpbHRpbi5zbGljZSxzdHI6U2suYnVpbHRpbi5zdHIsc2V0OlNrLmJ1aWx0aW4uc2V0LHR1cGxlOlNrLmJ1aWx0aW4udHVwbGUsdHlwZTpTay5idWlsdGluLnR5cGUsaW5wdXQ6bnVsbCxyYXdfaW5wdXQ6bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLnJhd19pbnB1dCksc2V0YXR0cjpudWxsLGpzZXZhbDpTay5idWlsdGluLmpzZXZhbCxqc21pbGxpczpTay5idWlsdGluLmpzbWlsbGlzLHF1aXQ6bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLnF1aXQpLGV4aXQ6bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLnF1aXQpLHByaW50Om51bGwsZGl2bW9kOm51bGwsZm9ybWF0Om51bGwsXG5nbG9iYWxzOm51bGwsaXNzdWJjbGFzczpudWxsLGl0ZXI6bnVsbCxleGVjZmlsZTpTay5idWlsdGluLmV4ZWNmaWxlLGhlbHA6U2suYnVpbHRpbi5oZWxwLG1lbW9yeXZpZXc6U2suYnVpbHRpbi5tZW1vcnl2aWV3LHJlbG9hZDpTay5idWlsdGluLnJlbG9hZCxzdXBlcl8kcnckOlNrLmJ1aWx0aW4uc3VwZXJfLHVuaWNocjpTay5idWlsdGluLnVuaWNocix2YXJzOlNrLmJ1aWx0aW4udmFycyxhcHBseV8kcnckOlNrLmJ1aWx0aW4uYXBwbHlfLGJ1ZmZlcjpTay5idWlsdGluLmJ1ZmZlcixjb2VyY2U6U2suYnVpbHRpbi5jb2VyY2UsaW50ZXJuOlNrLmJ1aWx0aW4uaW50ZXJuLHByb3BlcnR5OlNrLmJ1aWx0aW4ucHJvcGVydHksY2xhc3NtZXRob2Q6U2suYnVpbHRpbi5jbGFzc21ldGhvZCxzdGF0aWNtZXRob2Q6U2suYnVpbHRpbi5zdGF0aWNtZXRob2R9O1NrLmFic3RyLnNldFVwTW9kdWxlTWV0aG9kcyhcImJ1aWx0aW5zXCIsU2suYnVpbHRpbnMse19faW1wb3J0X186eyRtZXRoOlNrLmJ1aWx0aW4uX19pbXBvcnRfXyxcbiRmbGFnczp7TmFtZWRBcmdzOltcIm5hbWVcIixcImdsb2JhbHNcIixcImxvY2Fsc1wiLFwiZnJvbWxpc3RcIixcImxldmVsXCJdfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJfX2ltcG9ydF9fKG5hbWUsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUsIGZyb21saXN0PSgpLCBsZXZlbD0wKSAtPiBtb2R1bGVcXG5cXG5JbXBvcnQgYSBtb2R1bGUuIEJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBtZWFudCBmb3IgdXNlIGJ5IHRoZSBQeXRob25cXG5pbnRlcnByZXRlciBhbmQgbm90IGZvciBnZW5lcmFsIHVzZSwgaXQgaXMgYmV0dGVyIHRvIHVzZVxcbmltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkgdG8gcHJvZ3JhbW1hdGljYWxseSBpbXBvcnQgYSBtb2R1bGUuXFxuXFxuVGhlIGdsb2JhbHMgYXJndW1lbnQgaXMgb25seSB1c2VkIHRvIGRldGVybWluZSB0aGUgY29udGV4dDtcXG50aGV5IGFyZSBub3QgbW9kaWZpZWQuICBUaGUgbG9jYWxzIGFyZ3VtZW50IGlzIHVudXNlZC4gIFRoZSBmcm9tbGlzdFxcbnNob3VsZCBiZSBhIGxpc3Qgb2YgbmFtZXMgdG8gZW11bGF0ZSBgYGZyb20gbmFtZSBpbXBvcnQgLi4uJycsIG9yIGFuXFxuZW1wdHkgbGlzdCB0byBlbXVsYXRlIGBgaW1wb3J0IG5hbWUnJy5cXG5XaGVuIGltcG9ydGluZyBhIG1vZHVsZSBmcm9tIGEgcGFja2FnZSwgbm90ZSB0aGF0IF9faW1wb3J0X18oJ0EuQicsIC4uLilcXG5yZXR1cm5zIHBhY2thZ2UgQSB3aGVuIGZyb21saXN0IGlzIGVtcHR5LCBidXQgaXRzIHN1Ym1vZHVsZSBCIHdoZW5cXG5mcm9tbGlzdCBpcyBub3QgZW1wdHkuICBUaGUgbGV2ZWwgYXJndW1lbnQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0b1xcbnBlcmZvcm0gYWJzb2x1dGUgb3IgcmVsYXRpdmUgaW1wb3J0czogMCBpcyBhYnNvbHV0ZSwgd2hpbGUgYSBwb3NpdGl2ZSBudW1iZXJcXG5pcyB0aGUgbnVtYmVyIG9mIHBhcmVudCBkaXJlY3RvcmllcyB0byBzZWFyY2ggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbW9kdWxlLlwifSxcbmFiczp7JG1ldGg6U2suYnVpbHRpbi5hYnMsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHgsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50LlwifSxhbGw6eyRtZXRoOlNrLmJ1aWx0aW4uYWxsLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgYm9vbCh4KSBpcyBUcnVlIGZvciBhbGwgdmFsdWVzIHggaW4gdGhlIGl0ZXJhYmxlLlxcblxcbklmIHRoZSBpdGVyYWJsZSBpcyBlbXB0eSwgcmV0dXJuIFRydWUuXCJ9LGFueTp7JG1ldGg6U2suYnVpbHRpbi5hbnksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiBib29sKHgpIGlzIFRydWUgZm9yIGFueSB4IGluIHRoZSBpdGVyYWJsZS5cXG5cXG5JZiB0aGUgaXRlcmFibGUgaXMgZW1wdHksIHJldHVybiBGYWxzZS5cIn0sXG5hc2NpaTp7JG1ldGg6U2suYnVpbHRpbi5hc2NpaSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCAvKVwiLCRkb2M6XCJSZXR1cm4gYW4gQVNDSUktb25seSByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuXFxuXFxuQXMgcmVwcigpLCByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiBhblxcbm9iamVjdCwgYnV0IGVzY2FwZSB0aGUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyByZXR1cm5lZCBieVxcbnJlcHIoKSB1c2luZyBcXFxcXFxcXHgsIFxcXFxcXFxcdSBvciBcXFxcXFxcXFUgZXNjYXBlcy4gVGhpcyBnZW5lcmF0ZXMgYSBzdHJpbmcgc2ltaWxhclxcbnRvIHRoYXQgcmV0dXJuZWQgYnkgcmVwcigpIGluIFB5dGhvbiAyLlwifSxiaW46eyRtZXRoOlNrLmJ1aWx0aW4uYmluLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBudW1iZXIsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IGJpbigyNzk2MjAyKVxcbiAgICcwYjEwMTAxMDEwMTAxMDEwMTAxMDEwMTAnXCJ9LFxuY2FsbGFibGU6eyRtZXRoOlNrLmJ1aWx0aW4uY2FsbGFibGUsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHdoZXRoZXIgdGhlIG9iamVjdCBpcyBjYWxsYWJsZSAoaS5lLiwgc29tZSBraW5kIG9mIGZ1bmN0aW9uKS5cXG5cXG5Ob3RlIHRoYXQgY2xhc3NlcyBhcmUgY2FsbGFibGUsIGFzIGFyZSBpbnN0YW5jZXMgb2YgY2xhc3NlcyB3aXRoIGFcXG5fX2NhbGxfXygpIG1ldGhvZC5cIn0sY2hyOnskbWV0aDpTay5idWlsdGluLmNociwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgVW5pY29kZSBzdHJpbmcgb2Ygb25lIGNoYXJhY3RlciB3aXRoIG9yZGluYWwgaTsgMCA8PSBpIDw9IDB4MTBmZmZmLlwifSxkZWxhdHRyOnskbWV0aDpTay5idWlsdGluLmRlbGF0dHIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIG5hbWUsIC8pXCIsXG4kZG9jOlwiRGVsZXRlcyB0aGUgbmFtZWQgYXR0cmlidXRlIGZyb20gdGhlIGdpdmVuIG9iamVjdC5cXG5cXG5kZWxhdHRyKHgsICd5JykgaXMgZXF1aXZhbGVudCB0byBgYGRlbCB4LnknJ1wifSxkaXI6eyRtZXRoOlNrLmJ1aWx0aW4uZGlyLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiZGlyKFtvYmplY3RdKSAtPiBsaXN0IG9mIHN0cmluZ3NcXG5cXG5JZiBjYWxsZWQgd2l0aG91dCBhbiBhcmd1bWVudCwgcmV0dXJuIHRoZSBuYW1lcyBpbiB0aGUgY3VycmVudCBzY29wZS5cXG5FbHNlLCByZXR1cm4gYW4gYWxwaGFiZXRpemVkIGxpc3Qgb2YgbmFtZXMgY29tcHJpc2luZyAoc29tZSBvZikgdGhlIGF0dHJpYnV0ZXNcXG5vZiB0aGUgZ2l2ZW4gb2JqZWN0LCBhbmQgb2YgYXR0cmlidXRlcyByZWFjaGFibGUgZnJvbSBpdC5cXG5JZiB0aGUgb2JqZWN0IHN1cHBsaWVzIGEgbWV0aG9kIG5hbWVkIF9fZGlyX18sIGl0IHdpbGwgYmUgdXNlZDsgb3RoZXJ3aXNlXFxudGhlIGRlZmF1bHQgZGlyKCkgbG9naWMgaXMgdXNlZCBhbmQgcmV0dXJuczpcXG4gIGZvciBhIG1vZHVsZSBvYmplY3Q6IHRoZSBtb2R1bGUncyBhdHRyaWJ1dGVzLlxcbiAgZm9yIGEgY2xhc3Mgb2JqZWN0OiAgaXRzIGF0dHJpYnV0ZXMsIGFuZCByZWN1cnNpdmVseSB0aGUgYXR0cmlidXRlc1xcbiAgICBvZiBpdHMgYmFzZXMuXFxuICBmb3IgYW55IG90aGVyIG9iamVjdDogaXRzIGF0dHJpYnV0ZXMsIGl0cyBjbGFzcydzIGF0dHJpYnV0ZXMsIGFuZFxcbiAgICByZWN1cnNpdmVseSB0aGUgYXR0cmlidXRlcyBvZiBpdHMgY2xhc3MncyBiYXNlIGNsYXNzZXMuXCJ9LFxuZGl2bW9kOnskbWV0aDpTay5idWlsdGluLmRpdm1vZCwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHgsIHksIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgdHVwbGUgKHgvL3ksIHgleSkuICBJbnZhcmlhbnQ6IGRpdip5ICsgbW9kID09IHguXCJ9LGV2YWxfJHJ3JDp7JG5hbWU6XCJldmFsXCIsJG1ldGg6U2suYnVpbHRpbi5ldmFsXywkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHNvdXJjZSwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSwgLylcIiwkZG9jOlwiRXZhbHVhdGUgdGhlIGdpdmVuIHNvdXJjZSBpbiB0aGUgY29udGV4dCBvZiBnbG9iYWxzIGFuZCBsb2NhbHMuXFxuXFxuVGhlIHNvdXJjZSBtYXkgYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgUHl0aG9uIGV4cHJlc3Npb25cXG5vciBhIGNvZGUgb2JqZWN0IGFzIHJldHVybmVkIGJ5IGNvbXBpbGUoKS5cXG5UaGUgZ2xvYmFscyBtdXN0IGJlIGEgZGljdGlvbmFyeSBhbmQgbG9jYWxzIGNhbiBiZSBhbnkgbWFwcGluZyxcXG5kZWZhdWx0aW5nIHRvIHRoZSBjdXJyZW50IGdsb2JhbHMgYW5kIGxvY2Fscy5cXG5JZiBvbmx5IGdsb2JhbHMgaXMgZ2l2ZW4sIGxvY2FscyBkZWZhdWx0cyB0byBpdC5cIn0sXG5mb3JtYXQ6eyRtZXRoOlNrLmJ1aWx0aW4uZm9ybWF0LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgdmFsdWUsIGZvcm1hdF9zcGVjPScnLCAvKVwiLCRkb2M6XCJSZXR1cm4gdmFsdWUuX19mb3JtYXRfXyhmb3JtYXRfc3BlYylcXG5cXG5mb3JtYXRfc3BlYyBkZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLlxcblNlZSB0aGUgRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSBzZWN0aW9uIG9mIGhlbHAoJ0ZPUk1BVFRJTkcnKSBmb3JcXG5kZXRhaWxzLlwifSxnZXRhdHRyOnskbWV0aDpTay5idWlsdGluLmdldGF0dHIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJnZXRhdHRyKG9iamVjdCwgbmFtZVssIGRlZmF1bHRdKSAtPiB2YWx1ZVxcblxcbkdldCBhIG5hbWVkIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdDsgZ2V0YXR0cih4LCAneScpIGlzIGVxdWl2YWxlbnQgdG8geC55LlxcbldoZW4gYSBkZWZhdWx0IGFyZ3VtZW50IGlzIGdpdmVuLCBpdCBpcyByZXR1cm5lZCB3aGVuIHRoZSBhdHRyaWJ1dGUgZG9lc24ndFxcbmV4aXN0OyB3aXRob3V0IGl0LCBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGluIHRoYXQgY2FzZS5cIn0sXG5nbG9iYWxzOnskbWV0aDpTay5idWlsdGluLmdsb2JhbHMsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjdXJyZW50IHNjb3BlJ3MgZ2xvYmFsIHZhcmlhYmxlcy5cXG5cXG5OT1RFOiBVcGRhdGVzIHRvIHRoaXMgZGljdGlvbmFyeSAqd2lsbCogYWZmZWN0IG5hbWUgbG9va3VwcyBpbiB0aGUgY3VycmVudFxcbmdsb2JhbCBzY29wZSBhbmQgdmljZS12ZXJzYS5cIn0saGFzYXR0cjp7JG1ldGg6U2suYnVpbHRpbi5oYXNhdHRyLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCBuYW1lLCAvKVwiLCRkb2M6XCJSZXR1cm4gd2hldGhlciB0aGUgb2JqZWN0IGhhcyBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cXG5cXG5UaGlzIGlzIGRvbmUgYnkgY2FsbGluZyBnZXRhdHRyKG9iaiwgbmFtZSkgYW5kIGNhdGNoaW5nIEF0dHJpYnV0ZUVycm9yLlwifSxcbmhhc2g6eyRtZXRoOlNrLmJ1aWx0aW4uaGFzaCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBnaXZlbiBvYmplY3QuXFxuXFxuVHdvIG9iamVjdHMgdGhhdCBjb21wYXJlIGVxdWFsIG11c3QgYWxzbyBoYXZlIHRoZSBzYW1lIGhhc2ggdmFsdWUsIGJ1dCB0aGVcXG5yZXZlcnNlIGlzIG5vdCBuZWNlc3NhcmlseSB0cnVlLlwifSxoZXg6eyRtZXRoOlNrLmJ1aWx0aW4uaGV4LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBudW1iZXIsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlci5cXG5cXG4gICA+Pj4gaGV4KDEyNjQ4NDMwKVxcbiAgICcweGMwZmZlZSdcIn0saWQ6eyRtZXRoOlNrLmJ1aWx0aW4uaWQsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBpZGVudGl0eSBvZiBhbiBvYmplY3QuXFxuXFxuVGhpcyBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBhbW9uZyBzaW11bHRhbmVvdXNseSBleGlzdGluZyBvYmplY3RzLlxcbihDUHl0aG9uIHVzZXMgdGhlIG9iamVjdCdzIG1lbW9yeSBhZGRyZXNzLilcIn0sXG5pbnB1dDp7JG1ldGg6U2suYnVpbHRpbi5pbnB1dCwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHByb21wdD1Ob25lLCAvKVwiLCRkb2M6XCJSZWFkIGEgc3RyaW5nIGZyb20gc3RhbmRhcmQgaW5wdXQuICBUaGUgdHJhaWxpbmcgbmV3bGluZSBpcyBzdHJpcHBlZC5cXG5cXG5UaGUgcHJvbXB0IHN0cmluZywgaWYgZ2l2ZW4sIGlzIHByaW50ZWQgdG8gc3RhbmRhcmQgb3V0cHV0IHdpdGhvdXQgYVxcbnRyYWlsaW5nIG5ld2xpbmUgYmVmb3JlIHJlYWRpbmcgaW5wdXQuXFxuXFxuSWYgdGhlIHVzZXIgaGl0cyBFT0YgKCpuaXg6IEN0cmwtRCwgV2luZG93czogQ3RybC1aK1JldHVybiksIHJhaXNlIEVPRkVycm9yLlxcbk9uICpuaXggc3lzdGVtcywgcmVhZGxpbmUgaXMgdXNlZCBpZiBhdmFpbGFibGUuXCJ9LGlzaW5zdGFuY2U6eyRtZXRoOlNrLmJ1aWx0aW4uaXNpbnN0YW5jZSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgY2xhc3Nfb3JfdHVwbGUsIC8pXCIsXG4kZG9jOlwiUmV0dXJuIHdoZXRoZXIgYW4gb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3Mgb3Igb2YgYSBzdWJjbGFzcyB0aGVyZW9mLlxcblxcbkEgdHVwbGUsIGFzIGluIGBgaXNpbnN0YW5jZSh4LCAoQSwgQiwgLi4uKSlgYCwgbWF5IGJlIGdpdmVuIGFzIHRoZSB0YXJnZXQgdG9cXG5jaGVjayBhZ2FpbnN0LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYGBpc2luc3RhbmNlKHgsIEEpIG9yIGlzaW5zdGFuY2UoeCwgQilcXG5vciAuLi5gYCBldGMuXCJ9LGlzc3ViY2xhc3M6eyRtZXRoOlNrLmJ1aWx0aW4uaXNzdWJjbGFzcywkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGNscywgY2xhc3Nfb3JfdHVwbGUsIC8pXCIsJGRvYzpcIlJldHVybiB3aGV0aGVyICdjbHMnIGlzIGEgZGVyaXZlZCBmcm9tIGFub3RoZXIgY2xhc3Mgb3IgaXMgdGhlIHNhbWUgY2xhc3MuXFxuXFxuQSB0dXBsZSwgYXMgaW4gYGBpc3N1YmNsYXNzKHgsIChBLCBCLCAuLi4pKWBgLCBtYXkgYmUgZ2l2ZW4gYXMgdGhlIHRhcmdldCB0b1xcbmNoZWNrIGFnYWluc3QuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYGlzc3ViY2xhc3MoeCwgQSkgb3IgaXNzdWJjbGFzcyh4LCBCKVxcbm9yIC4uLmBgIGV0Yy5cIn0sXG5pdGVyOnskbWV0aDpTay5idWlsdGluLml0ZXIsJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSAvKVwiLCRkb2M6XCJpdGVyKGl0ZXJhYmxlKSAtPiBpdGVyYXRvclxcbml0ZXIoY2FsbGFibGUsIHNlbnRpbmVsKSAtPiBpdGVyYXRvclxcblxcbkdldCBhbiBpdGVyYXRvciBmcm9tIGFuIG9iamVjdC4gIEluIHRoZSBmaXJzdCBmb3JtLCB0aGUgYXJndW1lbnQgbXVzdFxcbnN1cHBseSBpdHMgb3duIGl0ZXJhdG9yLCBvciBiZSBhIHNlcXVlbmNlLlxcbkluIHRoZSBzZWNvbmQgZm9ybSwgdGhlIGNhbGxhYmxlIGlzIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIHRoZSBzZW50aW5lbC5cIn0sbGVuOnskbWV0aDpTay5idWlsdGluLmxlbiwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIGNvbnRhaW5lci5cIn0sbG9jYWxzOnskbWV0aDpTay5idWlsdGluLmxvY2FscyxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc2NvcGUncyBsb2NhbCB2YXJpYWJsZXMuXFxuXFxuTk9URTogV2hldGhlciBvciBub3QgdXBkYXRlcyB0byB0aGlzIGRpY3Rpb25hcnkgd2lsbCBhZmZlY3QgbmFtZSBsb29rdXBzIGluXFxudGhlIGxvY2FsIHNjb3BlIGFuZCB2aWNlLXZlcnNhIGlzICppbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQqIGFuZCBub3RcXG5jb3ZlcmVkIGJ5IGFueSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBndWFyYW50ZWVzLlwifSxtYXg6eyRtZXRoOlNrLmJ1aWx0aW4ubWF4LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIm1heChpdGVyYWJsZSwgKlssIGRlZmF1bHQ9b2JqLCBrZXk9ZnVuY10pIC0+IHZhbHVlXFxubWF4KGFyZzEsIGFyZzIsICphcmdzLCAqWywga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcblxcbldpdGggYSBzaW5nbGUgaXRlcmFibGUgYXJndW1lbnQsIHJldHVybiBpdHMgYmlnZ2VzdCBpdGVtLiBUaGVcXG5kZWZhdWx0IGtleXdvcmQtb25seSBhcmd1bWVudCBzcGVjaWZpZXMgYW4gb2JqZWN0IHRvIHJldHVybiBpZlxcbnRoZSBwcm92aWRlZCBpdGVyYWJsZSBpcyBlbXB0eS5cXG5XaXRoIHR3byBvciBtb3JlIGFyZ3VtZW50cywgcmV0dXJuIHRoZSBsYXJnZXN0IGFyZ3VtZW50LlwifSxcbm1pbjp7JG1ldGg6U2suYnVpbHRpbi5taW4sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwibWluKGl0ZXJhYmxlLCAqWywgZGVmYXVsdD1vYmosIGtleT1mdW5jXSkgLT4gdmFsdWVcXG5taW4oYXJnMSwgYXJnMiwgKmFyZ3MsICpbLCBrZXk9ZnVuY10pIC0+IHZhbHVlXFxuXFxuV2l0aCBhIHNpbmdsZSBpdGVyYWJsZSBhcmd1bWVudCwgcmV0dXJuIGl0cyBzbWFsbGVzdCBpdGVtLiBUaGVcXG5kZWZhdWx0IGtleXdvcmQtb25seSBhcmd1bWVudCBzcGVjaWZpZXMgYW4gb2JqZWN0IHRvIHJldHVybiBpZlxcbnRoZSBwcm92aWRlZCBpdGVyYWJsZSBpcyBlbXB0eS5cXG5XaXRoIHR3byBvciBtb3JlIGFyZ3VtZW50cywgcmV0dXJuIHRoZSBzbWFsbGVzdCBhcmd1bWVudC5cIn0sbmV4dDp7JG5hbWU6XCJuZXh0XCIsJG1ldGg6U2suYnVpbHRpbi5uZXh0XywkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIm5leHQoaXRlcmF0b3JbLCBkZWZhdWx0XSlcXG5cXG5SZXR1cm4gdGhlIG5leHQgaXRlbSBmcm9tIHRoZSBpdGVyYXRvci4gSWYgZGVmYXVsdCBpcyBnaXZlbiBhbmQgdGhlIGl0ZXJhdG9yXFxuaXMgZXhoYXVzdGVkLCBpdCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIHJhaXNpbmcgU3RvcEl0ZXJhdGlvbi5cIn0sXG5vY3Q6eyRtZXRoOlNrLmJ1aWx0aW4ub2N0LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBudW1iZXIsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgb2N0YWwgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlci5cXG5cXG4gICA+Pj4gb2N0KDM0MjM5MSlcXG4gICAnMG8xMjM0NTY3J1wifSxvcGVuOnskbWV0aDpTay5idWlsdGluLm9wZW4sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJvcGVuKG5hbWVbLCBtb2RlWywgYnVmZmVyaW5nXV0pIC0+IGZpbGUgb2JqZWN0XFxuXFxuT3BlbiBhIGZpbGUgdXNpbmcgdGhlIGZpbGUoKSB0eXBlLCByZXR1cm5zIGEgZmlsZSBvYmplY3QuICBUaGlzIGlzIHRoZVxcbnByZWZlcnJlZCB3YXkgdG8gb3BlbiBhIGZpbGUuICBTZWUgZmlsZS5fX2RvY19fIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLlwifSxvcmQ6eyRtZXRoOlNrLmJ1aWx0aW4ub3JkLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBjLCAvKVwiLFxuJGRvYzpcIlJldHVybiB0aGUgVW5pY29kZSBjb2RlIHBvaW50IGZvciBhIG9uZS1jaGFyYWN0ZXIgc3RyaW5nLlwifSxwb3c6eyRtZXRoOlNrLmJ1aWx0aW4ucG93LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJG1vZHVsZSwgeCwgeSwgej1Ob25lLCAvKVwiLCRkb2M6XCJFcXVpdmFsZW50IHRvIHgqKnkgKHdpdGggdHdvIGFyZ3VtZW50cykgb3IgeCoqeSAlIHogKHdpdGggdGhyZWUgYXJndW1lbnRzKVxcblxcblNvbWUgdHlwZXMsIHN1Y2ggYXMgaW50cywgYXJlIGFibGUgdG8gdXNlIGEgbW9yZSBlZmZpY2llbnQgYWxnb3JpdGhtIHdoZW5cXG5pbnZva2VkIHVzaW5nIHRoZSB0aHJlZSBhcmd1bWVudCBmb3JtLlwifSxwcmludDp7JG1ldGg6U2suYnVpbHRpbi5wcmludCwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJwcmludCh2YWx1ZSwgLi4uLCBzZXA9JyAnLCBlbmQ9J1xcXFxuJywgZmlsZT1zeXMuc3Rkb3V0LCBmbHVzaD1GYWxzZSlcXG5cXG5QcmludHMgdGhlIHZhbHVlcyB0byBhIHN0cmVhbSwgb3IgdG8gc3lzLnN0ZG91dCBieSBkZWZhdWx0Llxcbk9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOlxcbmZpbGU6ICBhIGZpbGUtbGlrZSBvYmplY3QgKHN0cmVhbSk7IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHN5cy5zdGRvdXQuXFxuc2VwOiAgIHN0cmluZyBpbnNlcnRlZCBiZXR3ZWVuIHZhbHVlcywgZGVmYXVsdCBhIHNwYWNlLlxcbmVuZDogICBzdHJpbmcgYXBwZW5kZWQgYWZ0ZXIgdGhlIGxhc3QgdmFsdWUsIGRlZmF1bHQgYSBuZXdsaW5lLlxcbmZsdXNoOiB3aGV0aGVyIHRvIGZvcmNpYmx5IGZsdXNoIHRoZSBzdHJlYW0uXCJ9LFxucmVwcjp7JG1ldGg6U2suYnVpbHRpbi5yZXByLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LlxcblxcbkZvciBtYW55IG9iamVjdCB0eXBlcywgaW5jbHVkaW5nIG1vc3QgYnVpbHRpbnMsIGV2YWwocmVwcihvYmopKSA9PSBvYmouXCJ9LHJvdW5kOnskbWV0aDpTay5idWlsdGluLnJvdW5kLCRmbGFnczp7TmFtZWRBcmdzOltcIm51bWJlclwiLFwibmRpZ2l0c1wiXX0sJHRleHRzaWc6XCIoJG1vZHVsZSwgLywgbnVtYmVyLCBuZGlnaXRzPU5vbmUpXCIsJGRvYzpcIlJvdW5kIGEgbnVtYmVyIHRvIGEgZ2l2ZW4gcHJlY2lzaW9uIGluIGRlY2ltYWwgZGlnaXRzLlxcblxcblRoZSByZXR1cm4gdmFsdWUgaXMgYW4gaW50ZWdlciBpZiBuZGlnaXRzIGlzIG9taXR0ZWQgb3IgTm9uZS4gIE90aGVyd2lzZVxcbnRoZSByZXR1cm4gdmFsdWUgaGFzIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG51bWJlci4gIG5kaWdpdHMgbWF5IGJlIG5lZ2F0aXZlLlwifSxcbnNldGF0dHI6eyRtZXRoOlNrLmJ1aWx0aW4uc2V0YXR0ciwkZmxhZ3M6e01pbkFyZ3M6MyxNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgbmFtZSwgdmFsdWUsIC8pXCIsJGRvYzpcIlNldHMgdGhlIG5hbWVkIGF0dHJpYnV0ZSBvbiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuXFxuXFxuc2V0YXR0cih4LCAneScsIHYpIGlzIGVxdWl2YWxlbnQgdG8gYGB4LnkgPSB2JydcIn0sc29ydGVkOnskbWV0aDpTay5idWlsdGluLnNvcnRlZCwkZmxhZ3M6e05hbWVkQXJnczpbbnVsbCxcImNtcFwiLFwia2V5XCIsXCJyZXZlcnNlXCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSRdfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLywgKiwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgYWxsIGl0ZW1zIGZyb20gdGhlIGl0ZXJhYmxlIGluIGFzY2VuZGluZyBvcmRlci5cXG5cXG5BIGN1c3RvbSBrZXkgZnVuY3Rpb24gY2FuIGJlIHN1cHBsaWVkIHRvIGN1c3RvbWl6ZSB0aGUgc29ydCBvcmRlciwgYW5kIHRoZVxcbnJldmVyc2UgZmxhZyBjYW4gYmUgc2V0IHRvIHJlcXVlc3QgdGhlIHJlc3VsdCBpbiBkZXNjZW5kaW5nIG9yZGVyLlwifSxcbnN1bTp7JG1ldGg6U2suYnVpbHRpbi5zdW0sJGZsYWdzOntOYW1lZEFyZ3M6W251bGwsXCJzdGFydFwiXSxEZWZhdWx0czpbbmV3IFNrLmJ1aWx0aW4uaW50XygwKV19LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGl0ZXJhYmxlLCAvLCBzdGFydD0wKVwiLCRkb2M6XCJSZXR1cm4gdGhlIHN1bSBvZiBhICdzdGFydCcgdmFsdWUgKGRlZmF1bHQ6IDApIHBsdXMgYW4gaXRlcmFibGUgb2YgbnVtYmVyc1xcblxcbldoZW4gdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LCByZXR1cm4gdGhlIHN0YXJ0IHZhbHVlLlxcblRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgc3BlY2lmaWNhbGx5IGZvciB1c2Ugd2l0aCBudW1lcmljIHZhbHVlcyBhbmQgbWF5XFxucmVqZWN0IG5vbi1udW1lcmljIHR5cGVzLlwifSx2YXJzOnskbWV0aDpTay5idWlsdGluLnZhcnMsJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJ2YXJzKFtvYmplY3RdKSAtPiBkaWN0aW9uYXJ5XFxuXFxuV2l0aG91dCBhcmd1bWVudHMsIGVxdWl2YWxlbnQgdG8gbG9jYWxzKCkuXFxuV2l0aCBhbiBhcmd1bWVudCwgZXF1aXZhbGVudCB0byBvYmplY3QuX19kaWN0X18uXCJ9fSk7XG5Tay5zZXR1cE9iamVjdHM9ZnVuY3Rpb24oYSl7YT8oU2suYnVpbHRpbnMuZmlsdGVyPVNrLmJ1aWx0aW4uZmlsdGVyXyxTay5idWlsdGlucy5tYXA9U2suYnVpbHRpbi5tYXBfLFNrLmJ1aWx0aW5zLnppcD1Tay5idWlsdGluLnppcF8sU2suYnVpbHRpbnMucmFuZ2U9U2suYnVpbHRpbi5yYW5nZV8sZGVsZXRlIFNrLmJ1aWx0aW5zLnhyYW5nZSxkZWxldGUgU2suYnVpbHRpbnMuU3RhbmRhcmRFcnJvcixkZWxldGUgU2suYnVpbHRpbnMudW5pY29kZSxkZWxldGUgU2suYnVpbHRpbnMuYmFzZXN0cmluZyxkZWxldGUgU2suYnVpbHRpbnMubG9uZ18kcnckLFNrLmJ1aWx0aW4uaW50Xy5wcm90b3R5cGUuJHI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b1N0cmluZygpKX0sZGVsZXRlIFNrLmJ1aWx0aW4uaW50Xy5wcm90b3R5cGUudHAkc3RyLGRlbGV0ZSBTay5idWlsdGluLmJvb2wucHJvdG90eXBlLnRwJHN0cixkZWxldGUgU2suYnVpbHRpbnMucmF3X2lucHV0LFxuZGVsZXRlIFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5kZWNvZGUsU2suYnVpbHRpbnMuYnl0ZXM9U2suYnVpbHRpbi5ieXRlcyxTay5idWlsdGlucy5hc2NpaT1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoeyRtZXRoOlNrLmJ1aWx0aW4uYXNjaWksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIGFuIEFTQ0lJLW9ubHkgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LlxcblxcbkFzIHJlcHIoKSwgcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgYW5cXG5vYmplY3QsIGJ1dCBlc2NhcGUgdGhlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnlcXG5yZXByKCkgdXNpbmcgXFxcXFxcXFx4LCBcXFxcXFxcXHUgb3IgXFxcXFxcXFxVIGVzY2FwZXMuIFRoaXMgZ2VuZXJhdGVzIGEgc3RyaW5nIHNpbWlsYXJcXG50byB0aGF0IHJldHVybmVkIGJ5IHJlcHIoKSBpbiBQeXRob24gMi5cIn0sXG5udWxsLFwiYnVpbHRpbnNcIikpOihTay5idWlsdGlucy5yYW5nZT1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoeyRtZXRoOlNrLmJ1aWx0aW4ucmFuZ2UsJG5hbWU6XCJyYW5nZVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M319LHZvaWQgMCxcImJ1aWx0aW5zXCIpLFNrLmJ1aWx0aW5zLnhyYW5nZT1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoeyRtZXRoOlNrLmJ1aWx0aW4ueHJhbmdlLCRuYW1lOlwieHJhbmdlXCIsJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfX0sbnVsbCxcImJ1aWx0aW5zXCIpLFNrLmJ1aWx0aW5zLmZpbHRlcj1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4uZmlsdGVyKSxTay5idWlsdGlucy5tYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLm1hcCksU2suYnVpbHRpbnMuemlwPW5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi56aXApLFNrLmJ1aWx0aW5zLlN0YW5kYXJkRXJyb3I9U2suYnVpbHRpbi5FeGNlcHRpb24sU2suYnVpbHRpbnMudW5pY29kZT1cblNrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW5zLmJhc2VzdHJpbmc9U2suYnVpbHRpbi5zdHIsU2suYnVpbHRpbnMubG9uZ18kcnckPVNrLmJ1aWx0aW4ubG5nLFNrLmJ1aWx0aW4uaW50Xy5wcm90b3R5cGUuJHI9ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGE/bmV3IFNrLmJ1aWx0aW4uc3RyKGEudG9TdHJpbmcoKSk6bmV3IFNrLmJ1aWx0aW4uc3RyKGEudG9TdHJpbmcoKStcIkxcIil9LFNrLmJ1aWx0aW4uaW50Xy5wcm90b3R5cGUudHAkc3RyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKSl9LFNrLmJ1aWx0aW4uYm9vbC5wcm90b3R5cGUudHAkc3RyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHIoKX0sU2suYnVpbHRpbnMucmF3X2lucHV0PW5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5yYXdfaW5wdXQpLFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5kZWNvZGU9U2suYnVpbHRpbi5zdHIuJHB5MmRlY29kZSxcbmRlbGV0ZSBTay5idWlsdGlucy5ieXRlcyxkZWxldGUgU2suYnVpbHRpbnMuYXNjaWkpfTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cE9iamVjdHNcIixTay5zZXR1cE9iamVjdHMpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW5zXCIsU2suYnVpbHRpbnMpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc3RyLiRlbXB0eT1uZXcgU2suYnVpbHRpbi5zdHIoXCJcIik7U2suYnVpbHRpbi5zdHIuJGVtcHR5c3RyPVNrLmJ1aWx0aW4uc3RyLiRlbXB0eTtTay5idWlsdGluLnN0ci4kdXRmOD1uZXcgU2suYnVpbHRpbi5zdHIoXCJ1dGYtOFwiKTtTay5idWlsdGluLnN0ci4kYXNjaWk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiYXNjaWlcIik7U2suYnVpbHRpbi5zdHIuJGRlZmF1bHRfZmFjdG9yeT1uZXcgU2suYnVpbHRpbi5zdHIoXCJkZWZhdWx0X2ZhY3RvcnlcIik7U2suYnVpbHRpbi5zdHIuJGltYWc9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiaW1hZ1wiKTtTay5idWlsdGluLnN0ci4kcmVhbD1uZXcgU2suYnVpbHRpbi5zdHIoXCJyZWFsXCIpO1xuU2suYnVpbHRpbi5zdHIuJGFicz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2Fic19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRieXRlcz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2J5dGVzX19cIik7U2suYnVpbHRpbi5zdHIuJGNhbGw9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19jYWxsX19cIik7U2suYnVpbHRpbi5zdHIuJGNsYXNzPW5ldyBTay5idWlsdGluLnN0cihcIl9fY2xhc3NfX1wiKTtTay5idWlsdGluLnN0ci4kY21wPW5ldyBTay5idWlsdGluLnN0cihcIl9fY21wX19cIik7U2suYnVpbHRpbi5zdHIuJGNvbXBsZXg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19jb21wbGV4X19cIik7U2suYnVpbHRpbi5zdHIuJGNvbnRhaW5zPW5ldyBTay5idWlsdGluLnN0cihcIl9fY29udGFpbnNfX1wiKTtTay5idWlsdGluLnN0ci4kY29weT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NvcHlfX1wiKTtTay5idWlsdGluLnN0ci4kZGljdD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2RpY3RfX1wiKTtTay5idWlsdGluLnN0ci4kZGlyPVxubmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19kaXJfX1wiKTtTay5idWlsdGluLnN0ci4kZG9jPW5ldyBTay5idWlsdGluLnN0cihcIl9fZG9jX19cIik7U2suYnVpbHRpbi5zdHIuJGVudGVyPW5ldyBTay5idWlsdGluLnN0cihcIl9fZW50ZXJfX1wiKTtTay5idWlsdGluLnN0ci4kZXE9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19lcV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRleGl0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZXhpdF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpbmRleD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2luZGV4X19cIik7U2suYnVpbHRpbi5zdHIuJGluaXQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pbml0X19cIik7U2suYnVpbHRpbi5zdHIuJGludF89bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pbnRfX1wiKTtTay5idWlsdGluLnN0ci4kaXRlcj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2l0ZXJfX1wiKTtTay5idWlsdGluLnN0ci4kZmlsZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2ZpbGVfX1wiKTtTay5idWlsdGluLnN0ci4kZmxvYXRfPVxubmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19mbG9hdF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRmb3JtYXQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19mb3JtYXRfX1wiKTtTay5idWlsdGluLnN0ci4kZ2U9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19nZV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRnZXRhdHRyPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2V0YXR0cl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRnZXRhdHRyaWJ1dGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19nZXRhdHRyaWJ1dGVfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0aXRlbT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2dldGl0ZW1fX1wiKTtTay5idWlsdGluLnN0ci4kZ3Q9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19ndF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRrZXlzPW5ldyBTay5idWlsdGluLnN0cihcImtleXNcIik7U2suYnVpbHRpbi5zdHIuJGxlPW5ldyBTay5idWlsdGluLnN0cihcIl9fbGVfX1wiKTtTay5idWlsdGluLnN0ci4kbGVuPW5ldyBTay5idWlsdGluLnN0cihcIl9fbGVuX19cIik7XG5Tay5idWlsdGluLnN0ci4kbGVuZ3RoX2hpbnQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19sZW5ndGhfaGludF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRsb2FkZXI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19sb2FkZXJfX1wiKTtTay5idWlsdGluLnN0ci4kbHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19sdF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRtb2R1bGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19tb2R1bGVfX1wiKTtTay5idWlsdGluLnN0ci4kbWlzc2luZz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX21pc3NpbmdfX1wiKTtTay5idWlsdGluLnN0ci4kbmFtZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX25hbWVfX1wiKTtTay5idWlsdGluLnN0ci4kbmU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRuZXc9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZXdfX1wiKTtTay5idWlsdGluLnN0ci4kbmV4dD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX25leHRfX1wiKTtTay5idWlsdGluLnN0ci4kcGF0aD1cbm5ldyBTay5idWlsdGluLnN0cihcIl9fcGF0aF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRxdWFsbmFtZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3F1YWxuYW1lX19cIik7U2suYnVpbHRpbi5zdHIuJHJlcHI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19yZXByX19cIik7U2suYnVpbHRpbi5zdHIuJHJldmVyc2VkPW5ldyBTay5idWlsdGluLnN0cihcIl9fcmV2ZXJzZWRfX1wiKTtTay5idWlsdGluLnN0ci4kcm91bmQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19yb3VuZF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRzZXRhdHRyPW5ldyBTay5idWlsdGluLnN0cihcIl9fc2V0YXR0cl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRzZXRpdGVtPW5ldyBTay5idWlsdGluLnN0cihcIl9fc2V0aXRlbV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRzdHI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19zdHJfX1wiKTtTay5idWlsdGluLnN0ci4kdHJ1bmM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX190cnVuY19fXCIpO1NrLmJ1aWx0aW4uc3RyLiR3cml0ZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJ3cml0ZVwiKTtcblNrLm1pc2NldmFsLm9wMm1ldGhvZF89e0VxOlNrLmJ1aWx0aW4uc3RyLiRlcSxOb3RFcTpTay5idWlsdGluLnN0ci4kbmUsR3Q6U2suYnVpbHRpbi5zdHIuJGd0LEd0RTpTay5idWlsdGluLnN0ci4kZ2UsTHQ6U2suYnVpbHRpbi5zdHIuJGx0LEx0RTpTay5idWlsdGluLnN0ci4kbGV9fV0pO30pLmNhbGwodGhpcyB8fCB3aW5kb3cpXG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNrdWxwdC5taW4uanMubWFwIiwiLypcblRoZSBUaW1lZEFjdGl2ZWNvZGUgY2xhc3NlcyBhcmUgYSBncmVhdCBleGFtcGxlIG9mIHdoZXJlIG11bHRpcGxlIGluaGVyaXRhbmNlIHdvdWxkIGJlIHVzZWZ1bFxuQnV0IHNpbmNlIEphdmFzY3JpcHQgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZSB3ZSB1c2UgdGhlIG1peGluIHBhdHRlcm4uXG5cbiovXG5pbXBvcnQgTGl2ZUNvZGUgZnJvbSBcIi4vbGl2ZWNvZGVcIjtcbmltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlXCI7XG5pbXBvcnQgSlNBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfanNcIjtcbmltcG9ydCBIVE1MQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2h0bWxcIjtcbmltcG9ydCBTUUxBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfc3FsXCI7XG5pbXBvcnQgQnJ5dGhvbkFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9icnl0aG9uLmpzXCI7XG5cbnZhciBUaW1lZEFjdGl2ZUNvZGVNaXhpbiA9IHtcbiAgICB0aW1lZEluaXQ6IGFzeW5jIGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICAgIHRoaXMuaXNUaW1lZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaGlkZUJ1dHRvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRIaXN0b3J5U2NydWJiZXIodHJ1ZSk7IC8vIHBvc2l0aW9uIGxhc3RcbiAgICAgICAgdGhpcy5uZWVkc1JlaW5pdGlhbGl6YXRpb24gPSB0cnVlOyAvLyB0aGUgcnVuIGJ1dHRvbiBjbGljayBsaXN0ZW5lciBuZWVkcyB0byBiZSByZWluaXRpYWxpemVkXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmNsYXNzTGlzdC5hZGQoXCJ0aW1lZENvbXBvbmVudFwiKTtcbiAgICAgICAgd2luZG93LmVkTGlzdFt0aGlzLmRpdmlkXSA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBoaWRlQnV0dG9uczogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnV0dG9uTGlzdCA9IFtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUJ1dHRvbixcbiAgICAgICAgICAgIHRoaXMubG9hZEJ1dHRvbixcbiAgICAgICAgICAgIHRoaXMuZ3JhZGVCdXR0b24sXG4gICAgICAgICAgICB0aGlzLnNob3dIaWRlQnV0dCxcbiAgICAgICAgICAgIHRoaXMuY29hY2hCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmF0QnV0dG9uLFxuICAgICAgICBdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1dHRvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChidXR0b25MaXN0W2ldICE9PSB1bmRlZmluZWQgJiYgYnV0dG9uTGlzdFtpXSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAkKGJ1dHRvbkxpc3RbaV0pLmhpZGUoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBiamUgLSBub3QgbmVlZGVkIGFueW1vcmVcbiAgICByZW5kZXJUaW1lZEljb246IGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgLy8gcmVuZGVycyB0aGUgY2xvY2sgaWNvbiBvbiB0aW1lZCBjb21wb25lbnRzLiAgICBUaGUgY29tcG9uZW50IHBhcmFtZXRlclxuICAgICAgICAvLyBpcyB0aGUgZWxlbWVudCB0aGF0IHRoZSBpY29uIHNob3VsZCBiZSBhcHBlbmRlZCB0by5cbiAgICAgICAgdmFyIHRpbWVJY29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIHRpbWVJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgICAgJCh0aW1lSWNvbikuYXR0cih7XG4gICAgICAgICAgICBzcmM6IFwiLi4vX3N0YXRpYy9jbG9jay5wbmdcIixcbiAgICAgICAgICAgIHN0eWxlOiBcIndpZHRoOjE1cHg7aGVpZ2h0OjE1cHhcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRpbWVJY29uRGl2LmNsYXNzTmFtZSA9IFwidGltZVRpcFwiO1xuICAgICAgICB0aW1lSWNvbkRpdi50aXRsZSA9IFwiXCI7XG4gICAgICAgIHRpbWVJY29uRGl2LmFwcGVuZENoaWxkKHRpbWVJY29uKTtcbiAgICAgICAgJChjb21wb25lbnQpLnByZXBlbmQodGltZUljb25EaXYpO1xuICAgIH0sXG5cbiAgICBjaGVja0NvcnJlY3RUaW1lZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBwY3RfY29ycmVjdCBpcyBzZXQgYnkgdGhlIHVuaXR0ZXN0L2d1aS5weSBtb2R1bGUgaW4gc2t1bHB0LlxuICAgICAgICAvLyBpdCByZWxpZXMgb24gZmluZGluZyB0aGlzIG9iamVjdCBpbiB0aGUgZWRMaXN0XG4gICAgICAgIGlmICh0aGlzLmlzQW5zd2VyZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBjdF9jb3JyZWN0ID49IDEwMC4wKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiVFwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJGXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJJXCI7IC8vIHdlIGlnbm9yZSB0aGlzIGluIHRoZSBncmFkaW5nIGlmIG5vIHVuaXR0ZXN0c1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGhpZGVGZWVkYmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpO1xuICAgIH0sXG5cbiAgICByZWluaXRpYWxpemVMaXN0ZW5lcnM6IGZ1bmN0aW9uICh0YWtlbikge1xuICAgICAgICBpZiAoIXRoaXMucnVuQnV0dG9uLm9uY2xpY2spIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVhdHRhY2hpbmcgcnVuYnV0dG9uaGFuZGxlclwiKTtcbiAgICAgICAgICAgIHRoaXMucnVuQnV0dG9uLm9uY2xpY2sgPSB0aGlzLnJ1bkJ1dHRvbkhhbmRlci5iaW5kKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgICQodGhpcy5jb2RlRGl2KS5zaG93KCk7XG4gICAgICAgIHRoaXMucnVuQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICQodGhpcy5jb2RlRGl2KS5yZW1vdmVDbGFzcyhcImFjLWRpc2FibGVkXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5yZWZyZXNoKCk7XG4gICAgICAgICQodGhpcy5oaXN0QnV0dG9uKS5jbGljayh0aGlzLmFkZEhpc3RvcnlTY3J1YmJlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yeVNjcnViYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoe1xuICAgICAgICAgICAgICAgIG1heDogdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICAgICAgICAgIHNsaWRlOiB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRha2VuKSB7XG4gICAgICAgICAgICAkKGAjJHt0aGlzLmRpdmlkfV91bml0X3Jlc3VsdHNgKS5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9LFxufTtcblxuZXhwb3J0IGNsYXNzIFRpbWVkTGl2ZUNvZGUgZXh0ZW5kcyBMaXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuXG5PYmplY3QuYXNzaWduKFRpbWVkTGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZEFjdGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLnRpbWVkSW5pdENvbXBsZXRlID0gdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxuXG4gICAgLy8gZm9yIHRpbWVkIGV4YW1zIHdlIG5lZWQgdG8gY2FsbCBydW5Qcm9nIGFuZCB0ZWxsIGl0IHRoYXQgdGhlcmUgaXNcbiAgICAvLyBubyBHVUkgZm9yIHNsaWRlcnMgb3Igb3RoZXIgdGhpbmdzLlxuICAgIC8vIHRoZSBhbnN3ZXJzLlxuICAgIGFzeW5jIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgbGV0IG5vVUkgPSB0cnVlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRpbWVkSW5pdENvbXBsZXRlO1xuICAgICAgICBpZiAodGhpcy5pc0Fuc3dlcmVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1blByb2cobm9VSSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5PYmplY3QuYXNzaWduKFRpbWVkQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcblxuZXhwb3J0IGNsYXNzIFRpbWVkSlNBY3RpdmVDb2RlIGV4dGVuZHMgSlNBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLnRpbWVkSW5pdChvcHRzKTtcbiAgICB9XG59XG5PYmplY3QuYXNzaWduKFRpbWVkSlNBY3RpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuXG5leHBvcnQgY2xhc3MgVGltZWRIVE1MQWN0aXZlQ29kZSBleHRlbmRzIEhUTUxBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLnRpbWVkSW5pdChvcHRzKTtcbiAgICB9XG59XG5PYmplY3QuYXNzaWduKFRpbWVkSFRNTEFjdGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZFNRTEFjdGl2ZUNvZGUgZXh0ZW5kcyBTUUxBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLnRpbWVkSW5pdChvcHRzKTtcbiAgICB9XG59XG5PYmplY3QuYXNzaWduKFRpbWVkU1FMQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcblxuZXhwb3J0IGNsYXNzIFRpbWVkQnJ5dGhvbkFjdGl2ZUNvZGUgZXh0ZW5kcyBCcnl0aG9uQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZEJyeXRob25BY3RpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuIiwiLypcblxuaGlnaGxpZ2h0IHY0XG5cbkhpZ2hsaWdodHMgYXJiaXRyYXJ5IHRlcm1zLlxuXG48aHR0cDovL2pvaGFubmJ1cmthcmQuZGUvYmxvZy9wcm9ncmFtbWluZy9qYXZhc2NyaXB0L2hpZ2hsaWdodC1qYXZhc2NyaXB0LXRleHQtaGlnbGlnaHRpbmctanF1ZXJ5LXBsdWdpbi5odG1sPlxuXG5NSVQgbGljZW5zZS5cblxuSm9oYW5uIEJ1cmthcmRcbjxodHRwOi8vam9oYW5uYnVya2FyZC5kZT5cbjxtYWlsdG86amJAZWFpby5jb20+XG5cbiovXG5cbmpRdWVyeS5mbi5oaWdobGlnaHQgPSBmdW5jdGlvbihwYXQpIHtcbiBmdW5jdGlvbiBpbm5lckhpZ2hsaWdodChub2RlLCBwYXQpIHtcbiAgdmFyIHNraXAgPSAwO1xuICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7XG4gICB2YXIgcG9zID0gbm9kZS5kYXRhLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihwYXQpO1xuICAgaWYgKHBvcyA+PSAwKSB7XG4gICAgdmFyIHNwYW5ub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHNwYW5ub2RlLmNsYXNzTmFtZSA9ICdoaWdobGlnaHQnO1xuICAgIHZhciBtaWRkbGViaXQgPSBub2RlLnNwbGl0VGV4dChwb3MpO1xuICAgIHZhciBlbmRiaXQgPSBtaWRkbGViaXQuc3BsaXRUZXh0KHBhdC5sZW5ndGgpO1xuICAgIHZhciBtaWRkbGVjbG9uZSA9IG1pZGRsZWJpdC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgc3Bhbm5vZGUuYXBwZW5kQ2hpbGQobWlkZGxlY2xvbmUpO1xuICAgIG1pZGRsZWJpdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChzcGFubm9kZSwgbWlkZGxlYml0KTtcbiAgICBza2lwID0gMTtcbiAgIH1cbiAgfVxuICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5jaGlsZE5vZGVzICYmICEvKHNjcmlwdHxzdHlsZSkvaS50ZXN0KG5vZGUudGFnTmFtZSkpIHtcbiAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgaSArPSBpbm5lckhpZ2hsaWdodChub2RlLmNoaWxkTm9kZXNbaV0sIHBhdCk7XG4gICB9XG4gIH1cbiAgcmV0dXJuIHNraXA7XG4gfVxuIHJldHVybiB0aGlzLmxlbmd0aCAmJiBwYXQgJiYgcGF0Lmxlbmd0aCA/IHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgaW5uZXJIaWdobGlnaHQodGhpcywgcGF0LnRvVXBwZXJDYXNlKCkpO1xuIH0pIDogdGhpcztcbn07XG5cbmpRdWVyeS5mbi5yZW1vdmVIaWdobGlnaHQgPSBmdW5jdGlvbigpIHtcbiByZXR1cm4gdGhpcy5maW5kKFwic3Bhbi5oaWdobGlnaHRcIikuZWFjaChmdW5jdGlvbigpIHtcbiAgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQubm9kZU5hbWU7XG4gIHdpdGggKHRoaXMucGFyZW50Tm9kZSkge1xuICAgcmVwbGFjZUNoaWxkKHRoaXMuZmlyc3RDaGlsZCwgdGhpcyk7XG4gICBub3JtYWxpemUoKTtcbiAgfVxuIH0pLmVuZCgpO1xufTtcbiIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/runestone/dist/runtime.bundle.js b/runestone/dist/runtime.bundle.js index 7f413db17..4c4ba8c11 100644 --- a/runestone/dist/runtime.bundle.js +++ b/runestone/dist/runtime.bundle.js @@ -107,7 +107,7 @@ /******/ // This function allow to reference async chunks /******/ __webpack_require__.u = (chunkId) => { /******/ // return url for filenames based on template -/******/ return "" + chunkId + ".bundle.js?v=" + {"vendors-node_modules_codemirror_mode_clike_clike_js-node_modules_codemirror_mode_javascript_j-ea0e03":"72d5b835b0f012e4faeb","vendors-node_modules_codemirror_mode_htmlmixed_htmlmixed_js-node_modules_handsontable_es_inde-1af827":"d503479c13820d9365ef","runestone_common_js_runestonebase_js":"c75250ad0dccea19bebf","runestone_codelens_js_pytutor-embed_bundle_js":"deb8f2f247c5f5984b7f","node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js":"53a19119f0c683ec9edd","runestone_clickableArea_js_timedclickable_js":"46bba3f29372278e5ca6","runestone_codelens_js_codelens_js":"c95e8bfecd8a67d35858","runestone_datafile_js_datafile_js":"6504816b693b4fbd0ad0","runestone_dragndrop_js_timeddnd_js":"c1868fefbd55f59a3fb4","runestone_fitb_js_timedfitb_js":"a21027361ba218ca9469","runestone_khanex_js_khanex_js":"48ca28e2bdcb2e2b8873","runestone_lp_js_lp_js":"a090d19da37a3e0d1b73","runestone_mchoice_js_timedmc_js":"e750cc1dc92a20232c4c","runestone_parsons_js_timedparsons_js":"43cb72263fef1b7b309a","runestone_poll_js_poll_js":"68474b8af3c1d20134ae","runestone_quizly_js_quizly_js":"f98c8ac098e2d06dbf4b","runestone_reveal_js_reveal_js":"55966c908800091f205a","runestone_selectquestion_js_selectone_js":"802042f9ff57544b5881","runestone_shortanswer_js_timed_shortanswer_js":"f225aa55d4c2630b36a7","runestone_showeval_js_showEval_js":"53ffdb3261ed8fcbceef","vendors-node_modules_jexcel_dist_jexcel_js-node_modules_jexcel_dist_jexcel_css":"4dff04ac5c1ef0786178","runestone_spreadsheet_js_spreadsheet_js":"6bd6316da3765f3c49bb","runestone_tabbedStuff_js_tabbedstuff_js":"33003997cbed4c38dc7a","runestone_timed_js_timed_js":"30c4f6e6bd7adec59614","vendors-node_modules_wavedrom_lib_process-all_js-node_modules_wavedrom_lib_wave-skin_js":"71f72eb02ec15779de1b","runestone_wavedrom_js_wavedrom_js":"7394bc1582ad34cdce1a","runestone_webwork_js_webwork_js":"754ac28092a8179f722c","runestone_video_js_runestonevideo_js":"bcdbd3d36584c9c528d0"}[chunkId] + ""; +/******/ return "" + chunkId + ".bundle.js?v=" + {"vendors-node_modules_codemirror_mode_clike_clike_js-node_modules_codemirror_mode_javascript_j-ea0e03":"72d5b835b0f012e4faeb","vendors-node_modules_codemirror_mode_htmlmixed_htmlmixed_js-node_modules_handsontable_es_inde-1af827":"d503479c13820d9365ef","runestone_common_js_runestonebase_js":"c75250ad0dccea19bebf","runestone_codelens_js_pytutor-embed_bundle_js":"deb8f2f247c5f5984b7f","node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js":"7ae540b8d48685f47a71","runestone_clickableArea_js_timedclickable_js":"46bba3f29372278e5ca6","runestone_codelens_js_codelens_js":"c95e8bfecd8a67d35858","runestone_datafile_js_datafile_js":"6504816b693b4fbd0ad0","runestone_dragndrop_js_timeddnd_js":"c1868fefbd55f59a3fb4","runestone_fitb_js_timedfitb_js":"a21027361ba218ca9469","runestone_khanex_js_khanex_js":"48ca28e2bdcb2e2b8873","runestone_lp_js_lp_js":"a090d19da37a3e0d1b73","runestone_mchoice_js_timedmc_js":"e750cc1dc92a20232c4c","runestone_parsons_js_timedparsons_js":"43cb72263fef1b7b309a","runestone_poll_js_poll_js":"68474b8af3c1d20134ae","runestone_quizly_js_quizly_js":"f98c8ac098e2d06dbf4b","runestone_reveal_js_reveal_js":"55966c908800091f205a","runestone_selectquestion_js_selectone_js":"802042f9ff57544b5881","runestone_shortanswer_js_timed_shortanswer_js":"f225aa55d4c2630b36a7","runestone_showeval_js_showEval_js":"53ffdb3261ed8fcbceef","vendors-node_modules_jexcel_dist_jexcel_js-node_modules_jexcel_dist_jexcel_css":"4dff04ac5c1ef0786178","runestone_spreadsheet_js_spreadsheet_js":"6bd6316da3765f3c49bb","runestone_tabbedStuff_js_tabbedstuff_js":"33003997cbed4c38dc7a","runestone_timed_js_timed_js":"30c4f6e6bd7adec59614","vendors-node_modules_wavedrom_lib_process-all_js-node_modules_wavedrom_lib_wave-skin_js":"71f72eb02ec15779de1b","runestone_wavedrom_js_wavedrom_js":"7394bc1582ad34cdce1a","runestone_webwork_js_webwork_js":"754ac28092a8179f722c","runestone_video_js_runestonevideo_js":"bcdbd3d36584c9c528d0"}[chunkId] + ""; /******/ }; /******/ })(); /******/ @@ -316,4 +316,4 @@ /******/ /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgbWluaS1jc3MgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9sb2FkIHNjcmlwdCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O1VBQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7Ozs7O1dDNUJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsOEJBQThCLHdDQUF3QztXQUN0RTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdCQUFnQixxQkFBcUI7V0FDckM7V0FDQTtXQUNBLGlCQUFpQixxQkFBcUI7V0FDdEM7V0FDQTtXQUNBLElBQUk7V0FDSjtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRTs7Ozs7V0MzQkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQyxZQUFZO1dBQzVDO1dBQ0EsRTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHdDQUF3Qyx5Q0FBeUM7V0FDakY7V0FDQTtXQUNBLEU7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFQUFFO1dBQ0YsRTs7Ozs7V0NSQTtXQUNBO1dBQ0E7V0FDQSwwQ0FBMEMsODVEQUE4NUQ7V0FDeDhELEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ0pBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGO1dBQ0E7V0FDQSxDQUFDLEk7Ozs7O1dDUEQsd0Y7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxzQkFBc0IsNEJBQTRCLFFBQVE7V0FDMUQ7V0FDQTtXQUNBO1dBQ0EsZ0JBQWdCLG9CQUFvQjtXQUNwQztXQUNBLGtHQUFrRyxZQUFZLE9BQU87V0FDckg7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0VBQWtFLGtDQUFrQztXQUNwRztXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ3pDQTtXQUNBO1dBQ0E7V0FDQSxzREFBc0Qsa0JBQWtCO1dBQ3hFO1dBQ0EsK0NBQStDLGNBQWM7V0FDN0QsRTs7Ozs7V0NOQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0M7Ozs7O1dDZkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQzs7V0FFaEM7V0FDQTtXQUNBO1dBQ0EsSUFBSTtXQUNKO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxLQUFLO1dBQ0w7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsTUFBTSxvQkFBb0I7V0FDMUI7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0EsNEciLCJmaWxlIjoicnVudGltZS5idW5kbGUuanM/dj0xNjU0YmJkZTczZTEyYTMzNjZlYiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZiA9IHt9O1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLy8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSAoY2h1bmtJZCkgPT4ge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmZba2V5XShjaHVua0lkLCBwcm9taXNlcyk7XG5cdFx0cmV0dXJuIHByb21pc2VzO1xuXHR9LCBbXSkpO1xufTsiLCIvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJcIiArIGNodW5rSWQgKyBcIi5idW5kbGUuanM/dj1cIiArIHtcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2NvZGVtaXJyb3JfbW9kZV9jbGlrZV9jbGlrZV9qcy1ub2RlX21vZHVsZXNfY29kZW1pcnJvcl9tb2RlX2phdmFzY3JpcHRfai1lYTBlMDNcIjpcIjcyZDViODM1YjBmMDEyZTRmYWViXCIsXCJ2ZW5kb3JzLW5vZGVfbW9kdWxlc19jb2RlbWlycm9yX21vZGVfaHRtbG1peGVkX2h0bWxtaXhlZF9qcy1ub2RlX21vZHVsZXNfaGFuZHNvbnRhYmxlX2VzX2luZGUtMWFmODI3XCI6XCJkNTAzNDc5YzEzODIwZDkzNjVlZlwiLFwicnVuZXN0b25lX2NvbW1vbl9qc19ydW5lc3RvbmViYXNlX2pzXCI6XCJjNzUyNTBhZDBkY2NlYTE5YmViZlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX3B5dHV0b3ItZW1iZWRfYnVuZGxlX2pzXCI6XCJkZWI4ZjJmMjQ3YzVmNTk4NGI3ZlwiLFwibm9kZV9tb2R1bGVzX21vbWVudF9sb2NhbGVfc3luY19yZWN1cnNpdmVfLXJ1bmVzdG9uZV9hY3RpdmVjb2RlX2pzX2FjZmFjdG9yeV9qc1wiOlwiNTNhMTkxMTlmMGM2ODNlYzllZGRcIixcInJ1bmVzdG9uZV9jbGlja2FibGVBcmVhX2pzX3RpbWVkY2xpY2thYmxlX2pzXCI6XCI0NmJiYTNmMjkzNzIyNzhlNWNhNlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX2NvZGVsZW5zX2pzXCI6XCJjOTVlOGJmZWNkOGE2N2QzNTg1OFwiLFwicnVuZXN0b25lX2RhdGFmaWxlX2pzX2RhdGFmaWxlX2pzXCI6XCI2NTA0ODE2YjY5M2I0ZmJkMGFkMFwiLFwicnVuZXN0b25lX2RyYWduZHJvcF9qc190aW1lZGRuZF9qc1wiOlwiYzE4NjhmZWZiZDU1ZjU5YTNmYjRcIixcInJ1bmVzdG9uZV9maXRiX2pzX3RpbWVkZml0Yl9qc1wiOlwiYTIxMDI3MzYxYmEyMThjYTk0NjlcIixcInJ1bmVzdG9uZV9raGFuZXhfanNfa2hhbmV4X2pzXCI6XCI0OGNhMjhlMmJkY2IyZTJiODg3M1wiLFwicnVuZXN0b25lX2xwX2pzX2xwX2pzXCI6XCJhMDkwZDE5ZGEzN2EzZTBkMWI3M1wiLFwicnVuZXN0b25lX21jaG9pY2VfanNfdGltZWRtY19qc1wiOlwiZTc1MGNjMWRjOTJhMjAyMzJjNGNcIixcInJ1bmVzdG9uZV9wYXJzb25zX2pzX3RpbWVkcGFyc29uc19qc1wiOlwiNDNjYjcyMjYzZmVmMWI3YjMwOWFcIixcInJ1bmVzdG9uZV9wb2xsX2pzX3BvbGxfanNcIjpcIjY4NDc0YjhhZjNjMWQyMDEzNGFlXCIsXCJydW5lc3RvbmVfcXVpemx5X2pzX3F1aXpseV9qc1wiOlwiZjk4YzhhYzA5OGUyZDA2ZGJmNGJcIixcInJ1bmVzdG9uZV9yZXZlYWxfanNfcmV2ZWFsX2pzXCI6XCI1NTk2NmM5MDg4MDAwOTFmMjA1YVwiLFwicnVuZXN0b25lX3NlbGVjdHF1ZXN0aW9uX2pzX3NlbGVjdG9uZV9qc1wiOlwiODAyMDQyZjlmZjU3NTQ0YjU4ODFcIixcInJ1bmVzdG9uZV9zaG9ydGFuc3dlcl9qc190aW1lZF9zaG9ydGFuc3dlcl9qc1wiOlwiZjIyNWFhNTVkNGMyNjMwYjM2YTdcIixcInJ1bmVzdG9uZV9zaG93ZXZhbF9qc19zaG93RXZhbF9qc1wiOlwiNTNmZmRiMzI2MWVkOGZjYmNlZWZcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2pleGNlbF9kaXN0X2pleGNlbF9qcy1ub2RlX21vZHVsZXNfamV4Y2VsX2Rpc3RfamV4Y2VsX2Nzc1wiOlwiNGRmZjA0YWM1YzFlZjA3ODYxNzhcIixcInJ1bmVzdG9uZV9zcHJlYWRzaGVldF9qc19zcHJlYWRzaGVldF9qc1wiOlwiNmJkNjMxNmRhMzc2NWYzYzQ5YmJcIixcInJ1bmVzdG9uZV90YWJiZWRTdHVmZl9qc190YWJiZWRzdHVmZl9qc1wiOlwiMzMwMDM5OTdjYmVkNGMzOGRjN2FcIixcInJ1bmVzdG9uZV90aW1lZF9qc190aW1lZF9qc1wiOlwiMzBjNGY2ZTZiZDdhZGVjNTk2MTRcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX3dhdmVkcm9tX2xpYl9wcm9jZXNzLWFsbF9qcy1ub2RlX21vZHVsZXNfd2F2ZWRyb21fbGliX3dhdmUtc2tpbl9qc1wiOlwiNzFmNzJlYjAyZWMxNTc3OWRlMWJcIixcInJ1bmVzdG9uZV93YXZlZHJvbV9qc193YXZlZHJvbV9qc1wiOlwiNzM5NGJjMTU4MmFkMzRjZGNlMWFcIixcInJ1bmVzdG9uZV93ZWJ3b3JrX2pzX3dlYndvcmtfanNcIjpcIjc1NGFjMjgwOTJhODE3OWY3MjJjXCIsXCJydW5lc3RvbmVfdmlkZW9fanNfcnVuZXN0b25ldmlkZW9fanNcIjpcImJjZGJkM2QzNjU4NGM5YzUyOGQwXCJ9W2NodW5rSWRdICsgXCJcIjtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYWxsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5taW5pQ3NzRiA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgaW5Qcm9ncmVzcyA9IHt9O1xudmFyIGRhdGFXZWJwYWNrUHJlZml4ID0gXCJXZWJDb21wb25lbnRzOlwiO1xuLy8gbG9hZFNjcmlwdCBmdW5jdGlvbiB0byBsb2FkIGEgc2NyaXB0IHZpYSBzY3JpcHQgdGFnXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmwgPSAodXJsLCBkb25lLCBrZXksIGNodW5rSWQpID0+IHtcblx0aWYoaW5Qcm9ncmVzc1t1cmxdKSB7IGluUHJvZ3Jlc3NbdXJsXS5wdXNoKGRvbmUpOyByZXR1cm47IH1cblx0dmFyIHNjcmlwdCwgbmVlZEF0dGFjaDtcblx0aWYoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgcyA9IHNjcmlwdHNbaV07XG5cdFx0XHRpZihzLmdldEF0dHJpYnV0ZShcInNyY1wiKSA9PSB1cmwgfHwgcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIikgPT0gZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpIHsgc2NyaXB0ID0gczsgYnJlYWs7IH1cblx0XHR9XG5cdH1cblx0aWYoIXNjcmlwdCkge1xuXHRcdG5lZWRBdHRhY2ggPSB0cnVlO1xuXHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG5cdFx0c2NyaXB0LmNoYXJzZXQgPSAndXRmLTgnO1xuXHRcdHNjcmlwdC50aW1lb3V0ID0gMTIwO1xuXHRcdGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKSB7XG5cdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgX193ZWJwYWNrX3JlcXVpcmVfXy5uYyk7XG5cdFx0fVxuXHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIiwgZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpO1xuXHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdH1cblx0aW5Qcm9ncmVzc1t1cmxdID0gW2RvbmVdO1xuXHR2YXIgb25TY3JpcHRDb21wbGV0ZSA9IChwcmV2LCBldmVudCkgPT4ge1xuXHRcdC8vIGF2b2lkIG1lbSBsZWFrcyBpbiBJRS5cblx0XHRzY3JpcHQub25lcnJvciA9IHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHR2YXIgZG9uZUZucyA9IGluUHJvZ3Jlc3NbdXJsXTtcblx0XHRkZWxldGUgaW5Qcm9ncmVzc1t1cmxdO1xuXHRcdHNjcmlwdC5wYXJlbnROb2RlICYmIHNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG5cdFx0ZG9uZUZucyAmJiBkb25lRm5zLmZvckVhY2goKGZuKSA9PiAoZm4oZXZlbnQpKSk7XG5cdFx0aWYocHJldikgcmV0dXJuIHByZXYoZXZlbnQpO1xuXHR9XG5cdDtcblx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KG9uU2NyaXB0Q29tcGxldGUuYmluZChudWxsLCB1bmRlZmluZWQsIHsgdHlwZTogJ3RpbWVvdXQnLCB0YXJnZXQ6IHNjcmlwdCB9KSwgMTIwMDAwKTtcblx0c2NyaXB0Lm9uZXJyb3IgPSBvblNjcmlwdENvbXBsZXRlLmJpbmQobnVsbCwgc2NyaXB0Lm9uZXJyb3IpO1xuXHRzY3JpcHQub25sb2FkID0gb25TY3JpcHRDb21wbGV0ZS5iaW5kKG51bGwsIHNjcmlwdC5vbmxvYWQpO1xuXHRuZWVkQXR0YWNoICYmIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbn07IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsInZhciBzY3JpcHRVcmw7XG5pZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5nLmltcG9ydFNjcmlwdHMpIHNjcmlwdFVybCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbiArIFwiXCI7XG52YXIgZG9jdW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7XG5pZiAoIXNjcmlwdFVybCAmJiBkb2N1bWVudCkge1xuXHRpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdClcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHNjcmlwdFVybCA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXS5zcmNcblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwicnVudGltZVwiOiAwXG59O1xuXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYuaiA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHRcdC8vIEpTT05QIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcblx0XHR2YXIgaW5zdGFsbGVkQ2h1bmtEYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgPyBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gOiB1bmRlZmluZWQ7XG5cdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSB7IC8vIDAgbWVhbnMgXCJhbHJlYWR5IGluc3RhbGxlZFwiLlxuXG5cdFx0XHQvLyBhIFByb21pc2UgbWVhbnMgXCJjdXJyZW50bHkgbG9hZGluZ1wiLlxuXHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhKSB7XG5cdFx0XHRcdHByb21pc2VzLnB1c2goaW5zdGFsbGVkQ2h1bmtEYXRhWzJdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKFwicnVudGltZVwiICE9IGNodW5rSWQpIHtcblx0XHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG5cdFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiAoaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF0pKTtcblx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKGluc3RhbGxlZENodW5rRGF0YVsyXSA9IHByb21pc2UpO1xuXG5cdFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuXHRcdFx0XHRcdHZhciB1cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCk7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGVycm9yIGJlZm9yZSBzdGFjayB1bndvdW5kIHRvIGdldCB1c2VmdWwgc3RhY2t0cmFjZSBsYXRlclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcigpO1xuXHRcdFx0XHRcdHZhciBsb2FkaW5nRW5kZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcblx0XHRcdFx0XHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBlcnJvclR5cGUgPSBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnID8gJ21pc3NpbmcnIDogZXZlbnQudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcblx0XHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLm5hbWUgPSAnQ2h1bmtMb2FkRXJyb3InO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLnR5cGUgPSBlcnJvclR5cGU7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhWzFdKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5sKHVybCwgbG9hZGluZ0VuZGVkLCBcImNodW5rLVwiICsgY2h1bmtJZCwgY2h1bmtJZCk7XG5cdFx0XHRcdH0gZWxzZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAwO1xuXHRcdFx0fVxuXHRcdH1cbn07XG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbl9fd2VicGFja19yZXF1aXJlX18uTy5qID0gKGNodW5rSWQpID0+IChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPT09IDApO1xuXG4vLyBpbnN0YWxsIGEgSlNPTlAgY2FsbGJhY2sgZm9yIGNodW5rIGxvYWRpbmdcbnZhciB3ZWJwYWNrSnNvbnBDYWxsYmFjayA9IChwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiwgZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcblx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG5cdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDA7XG5cdGZvcihtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdH1cblx0fVxuXHRpZihydW50aW1lKSB2YXIgcmVzdWx0ID0gcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0aWYocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24pIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuXHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSgpO1xuXHRcdH1cblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHNbaV1dID0gMDtcblx0fVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHJlc3VsdCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rV2ViQ29tcG9uZW50c1wiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmtXZWJDb21wb25lbnRzXCJdIHx8IFtdO1xuY2h1bmtMb2FkaW5nR2xvYmFsLmZvckVhY2god2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCAwKSk7XG5jaHVua0xvYWRpbmdHbG9iYWwucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpKTsiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgbWluaS1jc3MgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9sb2FkIHNjcmlwdCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O1VBQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7Ozs7O1dDNUJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsOEJBQThCLHdDQUF3QztXQUN0RTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdCQUFnQixxQkFBcUI7V0FDckM7V0FDQTtXQUNBLGlCQUFpQixxQkFBcUI7V0FDdEM7V0FDQTtXQUNBLElBQUk7V0FDSjtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRTs7Ozs7V0MzQkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQyxZQUFZO1dBQzVDO1dBQ0EsRTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHdDQUF3Qyx5Q0FBeUM7V0FDakY7V0FDQTtXQUNBLEU7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFQUFFO1dBQ0YsRTs7Ozs7V0NSQTtXQUNBO1dBQ0E7V0FDQSwwQ0FBMEMsODVEQUE4NUQ7V0FDeDhELEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ0pBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGO1dBQ0E7V0FDQSxDQUFDLEk7Ozs7O1dDUEQsd0Y7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxzQkFBc0IsNEJBQTRCLFFBQVE7V0FDMUQ7V0FDQTtXQUNBO1dBQ0EsZ0JBQWdCLG9CQUFvQjtXQUNwQztXQUNBLGtHQUFrRyxZQUFZLE9BQU87V0FDckg7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0VBQWtFLGtDQUFrQztXQUNwRztXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ3pDQTtXQUNBO1dBQ0E7V0FDQSxzREFBc0Qsa0JBQWtCO1dBQ3hFO1dBQ0EsK0NBQStDLGNBQWM7V0FDN0QsRTs7Ozs7V0NOQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0M7Ozs7O1dDZkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQzs7V0FFaEM7V0FDQTtXQUNBO1dBQ0EsSUFBSTtXQUNKO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxLQUFLO1dBQ0w7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsTUFBTSxvQkFBb0I7V0FDMUI7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0EsNEciLCJmaWxlIjoicnVudGltZS5idW5kbGUuanM/dj1iNzkwOTFiM2MyNDhmNWQ3Njk3YiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZiA9IHt9O1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLy8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSAoY2h1bmtJZCkgPT4ge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmZba2V5XShjaHVua0lkLCBwcm9taXNlcyk7XG5cdFx0cmV0dXJuIHByb21pc2VzO1xuXHR9LCBbXSkpO1xufTsiLCIvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJcIiArIGNodW5rSWQgKyBcIi5idW5kbGUuanM/dj1cIiArIHtcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2NvZGVtaXJyb3JfbW9kZV9jbGlrZV9jbGlrZV9qcy1ub2RlX21vZHVsZXNfY29kZW1pcnJvcl9tb2RlX2phdmFzY3JpcHRfai1lYTBlMDNcIjpcIjcyZDViODM1YjBmMDEyZTRmYWViXCIsXCJ2ZW5kb3JzLW5vZGVfbW9kdWxlc19jb2RlbWlycm9yX21vZGVfaHRtbG1peGVkX2h0bWxtaXhlZF9qcy1ub2RlX21vZHVsZXNfaGFuZHNvbnRhYmxlX2VzX2luZGUtMWFmODI3XCI6XCJkNTAzNDc5YzEzODIwZDkzNjVlZlwiLFwicnVuZXN0b25lX2NvbW1vbl9qc19ydW5lc3RvbmViYXNlX2pzXCI6XCJjNzUyNTBhZDBkY2NlYTE5YmViZlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX3B5dHV0b3ItZW1iZWRfYnVuZGxlX2pzXCI6XCJkZWI4ZjJmMjQ3YzVmNTk4NGI3ZlwiLFwibm9kZV9tb2R1bGVzX21vbWVudF9sb2NhbGVfc3luY19yZWN1cnNpdmVfLXJ1bmVzdG9uZV9hY3RpdmVjb2RlX2pzX2FjZmFjdG9yeV9qc1wiOlwiN2FlNTQwYjhkNDg2ODVmNDdhNzFcIixcInJ1bmVzdG9uZV9jbGlja2FibGVBcmVhX2pzX3RpbWVkY2xpY2thYmxlX2pzXCI6XCI0NmJiYTNmMjkzNzIyNzhlNWNhNlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX2NvZGVsZW5zX2pzXCI6XCJjOTVlOGJmZWNkOGE2N2QzNTg1OFwiLFwicnVuZXN0b25lX2RhdGFmaWxlX2pzX2RhdGFmaWxlX2pzXCI6XCI2NTA0ODE2YjY5M2I0ZmJkMGFkMFwiLFwicnVuZXN0b25lX2RyYWduZHJvcF9qc190aW1lZGRuZF9qc1wiOlwiYzE4NjhmZWZiZDU1ZjU5YTNmYjRcIixcInJ1bmVzdG9uZV9maXRiX2pzX3RpbWVkZml0Yl9qc1wiOlwiYTIxMDI3MzYxYmEyMThjYTk0NjlcIixcInJ1bmVzdG9uZV9raGFuZXhfanNfa2hhbmV4X2pzXCI6XCI0OGNhMjhlMmJkY2IyZTJiODg3M1wiLFwicnVuZXN0b25lX2xwX2pzX2xwX2pzXCI6XCJhMDkwZDE5ZGEzN2EzZTBkMWI3M1wiLFwicnVuZXN0b25lX21jaG9pY2VfanNfdGltZWRtY19qc1wiOlwiZTc1MGNjMWRjOTJhMjAyMzJjNGNcIixcInJ1bmVzdG9uZV9wYXJzb25zX2pzX3RpbWVkcGFyc29uc19qc1wiOlwiNDNjYjcyMjYzZmVmMWI3YjMwOWFcIixcInJ1bmVzdG9uZV9wb2xsX2pzX3BvbGxfanNcIjpcIjY4NDc0YjhhZjNjMWQyMDEzNGFlXCIsXCJydW5lc3RvbmVfcXVpemx5X2pzX3F1aXpseV9qc1wiOlwiZjk4YzhhYzA5OGUyZDA2ZGJmNGJcIixcInJ1bmVzdG9uZV9yZXZlYWxfanNfcmV2ZWFsX2pzXCI6XCI1NTk2NmM5MDg4MDAwOTFmMjA1YVwiLFwicnVuZXN0b25lX3NlbGVjdHF1ZXN0aW9uX2pzX3NlbGVjdG9uZV9qc1wiOlwiODAyMDQyZjlmZjU3NTQ0YjU4ODFcIixcInJ1bmVzdG9uZV9zaG9ydGFuc3dlcl9qc190aW1lZF9zaG9ydGFuc3dlcl9qc1wiOlwiZjIyNWFhNTVkNGMyNjMwYjM2YTdcIixcInJ1bmVzdG9uZV9zaG93ZXZhbF9qc19zaG93RXZhbF9qc1wiOlwiNTNmZmRiMzI2MWVkOGZjYmNlZWZcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2pleGNlbF9kaXN0X2pleGNlbF9qcy1ub2RlX21vZHVsZXNfamV4Y2VsX2Rpc3RfamV4Y2VsX2Nzc1wiOlwiNGRmZjA0YWM1YzFlZjA3ODYxNzhcIixcInJ1bmVzdG9uZV9zcHJlYWRzaGVldF9qc19zcHJlYWRzaGVldF9qc1wiOlwiNmJkNjMxNmRhMzc2NWYzYzQ5YmJcIixcInJ1bmVzdG9uZV90YWJiZWRTdHVmZl9qc190YWJiZWRzdHVmZl9qc1wiOlwiMzMwMDM5OTdjYmVkNGMzOGRjN2FcIixcInJ1bmVzdG9uZV90aW1lZF9qc190aW1lZF9qc1wiOlwiMzBjNGY2ZTZiZDdhZGVjNTk2MTRcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX3dhdmVkcm9tX2xpYl9wcm9jZXNzLWFsbF9qcy1ub2RlX21vZHVsZXNfd2F2ZWRyb21fbGliX3dhdmUtc2tpbl9qc1wiOlwiNzFmNzJlYjAyZWMxNTc3OWRlMWJcIixcInJ1bmVzdG9uZV93YXZlZHJvbV9qc193YXZlZHJvbV9qc1wiOlwiNzM5NGJjMTU4MmFkMzRjZGNlMWFcIixcInJ1bmVzdG9uZV93ZWJ3b3JrX2pzX3dlYndvcmtfanNcIjpcIjc1NGFjMjgwOTJhODE3OWY3MjJjXCIsXCJydW5lc3RvbmVfdmlkZW9fanNfcnVuZXN0b25ldmlkZW9fanNcIjpcImJjZGJkM2QzNjU4NGM5YzUyOGQwXCJ9W2NodW5rSWRdICsgXCJcIjtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYWxsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5taW5pQ3NzRiA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgaW5Qcm9ncmVzcyA9IHt9O1xudmFyIGRhdGFXZWJwYWNrUHJlZml4ID0gXCJXZWJDb21wb25lbnRzOlwiO1xuLy8gbG9hZFNjcmlwdCBmdW5jdGlvbiB0byBsb2FkIGEgc2NyaXB0IHZpYSBzY3JpcHQgdGFnXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmwgPSAodXJsLCBkb25lLCBrZXksIGNodW5rSWQpID0+IHtcblx0aWYoaW5Qcm9ncmVzc1t1cmxdKSB7IGluUHJvZ3Jlc3NbdXJsXS5wdXNoKGRvbmUpOyByZXR1cm47IH1cblx0dmFyIHNjcmlwdCwgbmVlZEF0dGFjaDtcblx0aWYoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgcyA9IHNjcmlwdHNbaV07XG5cdFx0XHRpZihzLmdldEF0dHJpYnV0ZShcInNyY1wiKSA9PSB1cmwgfHwgcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIikgPT0gZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpIHsgc2NyaXB0ID0gczsgYnJlYWs7IH1cblx0XHR9XG5cdH1cblx0aWYoIXNjcmlwdCkge1xuXHRcdG5lZWRBdHRhY2ggPSB0cnVlO1xuXHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG5cdFx0c2NyaXB0LmNoYXJzZXQgPSAndXRmLTgnO1xuXHRcdHNjcmlwdC50aW1lb3V0ID0gMTIwO1xuXHRcdGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKSB7XG5cdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgX193ZWJwYWNrX3JlcXVpcmVfXy5uYyk7XG5cdFx0fVxuXHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIiwgZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpO1xuXHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdH1cblx0aW5Qcm9ncmVzc1t1cmxdID0gW2RvbmVdO1xuXHR2YXIgb25TY3JpcHRDb21wbGV0ZSA9IChwcmV2LCBldmVudCkgPT4ge1xuXHRcdC8vIGF2b2lkIG1lbSBsZWFrcyBpbiBJRS5cblx0XHRzY3JpcHQub25lcnJvciA9IHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHR2YXIgZG9uZUZucyA9IGluUHJvZ3Jlc3NbdXJsXTtcblx0XHRkZWxldGUgaW5Qcm9ncmVzc1t1cmxdO1xuXHRcdHNjcmlwdC5wYXJlbnROb2RlICYmIHNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG5cdFx0ZG9uZUZucyAmJiBkb25lRm5zLmZvckVhY2goKGZuKSA9PiAoZm4oZXZlbnQpKSk7XG5cdFx0aWYocHJldikgcmV0dXJuIHByZXYoZXZlbnQpO1xuXHR9XG5cdDtcblx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KG9uU2NyaXB0Q29tcGxldGUuYmluZChudWxsLCB1bmRlZmluZWQsIHsgdHlwZTogJ3RpbWVvdXQnLCB0YXJnZXQ6IHNjcmlwdCB9KSwgMTIwMDAwKTtcblx0c2NyaXB0Lm9uZXJyb3IgPSBvblNjcmlwdENvbXBsZXRlLmJpbmQobnVsbCwgc2NyaXB0Lm9uZXJyb3IpO1xuXHRzY3JpcHQub25sb2FkID0gb25TY3JpcHRDb21wbGV0ZS5iaW5kKG51bGwsIHNjcmlwdC5vbmxvYWQpO1xuXHRuZWVkQXR0YWNoICYmIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbn07IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsInZhciBzY3JpcHRVcmw7XG5pZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5nLmltcG9ydFNjcmlwdHMpIHNjcmlwdFVybCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbiArIFwiXCI7XG52YXIgZG9jdW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7XG5pZiAoIXNjcmlwdFVybCAmJiBkb2N1bWVudCkge1xuXHRpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdClcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHNjcmlwdFVybCA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXS5zcmNcblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwicnVudGltZVwiOiAwXG59O1xuXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYuaiA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHRcdC8vIEpTT05QIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcblx0XHR2YXIgaW5zdGFsbGVkQ2h1bmtEYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgPyBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gOiB1bmRlZmluZWQ7XG5cdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSB7IC8vIDAgbWVhbnMgXCJhbHJlYWR5IGluc3RhbGxlZFwiLlxuXG5cdFx0XHQvLyBhIFByb21pc2UgbWVhbnMgXCJjdXJyZW50bHkgbG9hZGluZ1wiLlxuXHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhKSB7XG5cdFx0XHRcdHByb21pc2VzLnB1c2goaW5zdGFsbGVkQ2h1bmtEYXRhWzJdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKFwicnVudGltZVwiICE9IGNodW5rSWQpIHtcblx0XHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG5cdFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiAoaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF0pKTtcblx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKGluc3RhbGxlZENodW5rRGF0YVsyXSA9IHByb21pc2UpO1xuXG5cdFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuXHRcdFx0XHRcdHZhciB1cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCk7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGVycm9yIGJlZm9yZSBzdGFjayB1bndvdW5kIHRvIGdldCB1c2VmdWwgc3RhY2t0cmFjZSBsYXRlclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcigpO1xuXHRcdFx0XHRcdHZhciBsb2FkaW5nRW5kZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcblx0XHRcdFx0XHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBlcnJvclR5cGUgPSBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnID8gJ21pc3NpbmcnIDogZXZlbnQudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcblx0XHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLm5hbWUgPSAnQ2h1bmtMb2FkRXJyb3InO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLnR5cGUgPSBlcnJvclR5cGU7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhWzFdKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5sKHVybCwgbG9hZGluZ0VuZGVkLCBcImNodW5rLVwiICsgY2h1bmtJZCwgY2h1bmtJZCk7XG5cdFx0XHRcdH0gZWxzZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAwO1xuXHRcdFx0fVxuXHRcdH1cbn07XG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbl9fd2VicGFja19yZXF1aXJlX18uTy5qID0gKGNodW5rSWQpID0+IChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPT09IDApO1xuXG4vLyBpbnN0YWxsIGEgSlNPTlAgY2FsbGJhY2sgZm9yIGNodW5rIGxvYWRpbmdcbnZhciB3ZWJwYWNrSnNvbnBDYWxsYmFjayA9IChwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiwgZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcblx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG5cdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDA7XG5cdGZvcihtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdH1cblx0fVxuXHRpZihydW50aW1lKSB2YXIgcmVzdWx0ID0gcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0aWYocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24pIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuXHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSgpO1xuXHRcdH1cblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHNbaV1dID0gMDtcblx0fVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHJlc3VsdCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rV2ViQ29tcG9uZW50c1wiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmtXZWJDb21wb25lbnRzXCJdIHx8IFtdO1xuY2h1bmtMb2FkaW5nR2xvYmFsLmZvckVhY2god2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCAwKSk7XG5jaHVua0xvYWRpbmdHbG9iYWwucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpKTsiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/runestone/dist/webpack_static_imports.json b/runestone/dist/webpack_static_imports.json index 1586a2174..84b81785b 100644 --- a/runestone/dist/webpack_static_imports.json +++ b/runestone/dist/webpack_static_imports.json @@ -1 +1 @@ -{"js":["runtime.bundle.js?v=1654bbde73e12a3366eb","vendors-node_modules_bootstrap_dist_js_bootstrap_js-node_modules_jquery-ui_jquery-ui_js-node_-e60694.bundle.js?v=02c928219c61d5ca913a","runestone.bundle.js?v=db4b57b8df6b9b8f470a"],"css":[]} \ No newline at end of file +{"js":["runtime.bundle.js?v=b79091b3c248f5d7697b","vendors-node_modules_bootstrap_dist_js_bootstrap_js-node_modules_jquery-ui_jquery-ui_js-node_-e60694.bundle.js?v=02c928219c61d5ca913a","runestone.bundle.js?v=db4b57b8df6b9b8f470a"],"css":[]} \ No newline at end of file From 547a8f9bb14fa6cbef1658751ad087cd1ec2a16f Mon Sep 17 00:00:00 2001 From: sujith-rek Date: Sat, 17 Jun 2023 18:36:04 +0530 Subject: [PATCH 3/3] fix: small fix --- runestone/activecode/js/activecode_brython.js | 3 ++- ...recursive_-runestone_activecode_js_acfactory_js.bundle.js | 5 +++-- runestone/dist/runtime.bundle.js | 4 ++-- runestone/dist/webpack_static_imports.json | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/runestone/activecode/js/activecode_brython.js b/runestone/activecode/js/activecode_brython.js index 7c2a40cbe..058ace739 100644 --- a/runestone/activecode/js/activecode_brython.js +++ b/runestone/activecode/js/activecode_brython.js @@ -129,7 +129,8 @@ document <= html.SCRIPT("let container = document.querySelector('.container-pre' this.output = document.createElement("iframe"); $(this.output).css("background-color", "white"); $(this.output).css("position", "relative"); - $(this.output).css("height", $(this.output_height)); + // $(this.output).css("height", $(this.output_height)); + this.output.style.height = this.output_height; $(this.output).css("width", "100%"); outDiv.appendChild(this.output); this.outerDiv.appendChild(outDiv); diff --git a/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js b/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js index 97c36ead2..45aa45a61 100644 --- a/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js +++ b/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js @@ -2485,7 +2485,8 @@ document <= html.SCRIPT("let container = document.querySelector('.container-pre' this.output = document.createElement("iframe"); $(this.output).css("background-color", "white"); $(this.output).css("position", "relative"); - $(this.output).css("height", $(this.output_height)); + // $(this.output).css("height", $(this.output_height)); + this.output.style.height = this.output_height; $(this.output).css("width", "100%"); outDiv.appendChild(this.output); this.outerDiv.appendChild(outDiv); @@ -6042,4 +6043,4 @@ jQuery.fn.removeHighlight = function() { /***/ }) }]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvY3NzL2FjdGl2ZWNvZGUuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvL2hvbWUvcmVrL1J1bmVzdG9uZUNvbXBvbmVudHMvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGV8c3luY3wvXlxcLlxcLy4qJC8iLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2Nzcy9hY3RpdmVjb2RlLmNzcz8xZDExIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY2ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGUtaTE4bi5lbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS1pMThuLnB0LWJyLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlLWkxOG4uc3ItQ3lybC5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZV9icnl0aG9uLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlX2h0bWwuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfanMuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfc3FsLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hdWRpb3RvdXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2V4dHJhY3RVbml0UmVzdWx0cy5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvbGl2ZWNvZGUuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL21kNS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0LXN0ZGxpYi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0Lm1pbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvdGltZWRfYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnkuaGlnaGxpZ2h0LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8Y3J5cHRvIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8ZnMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy9pZ25vcmVkfC9ob21lL3Jlay9SdW5lc3RvbmVDb21wb25lbnRzL25vZGVfbW9kdWxlcy9zcWwuanMvZGlzdHxwYXRoIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfGZzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfG5vZGUtZmV0Y2giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUM0SDtBQUM3QjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0EsMERBQTBELG9CQUFvQix3QkFBd0IsdUJBQXVCLG1CQUFtQixvQkFBb0IsNkJBQTZCLHNDQUFzQywyQ0FBMkMsOENBQThDLDBCQUEwQiwrQkFBK0Isa0NBQWtDLDBCQUEwQixrQkFBa0IsR0FBRyxzQkFBc0Isb0JBQW9CLHlCQUF5QixhQUFhLGNBQWMsa0JBQWtCLGtCQUFrQix1QkFBdUIsR0FBRywwQkFBMEIsb0JBQW9CLHlCQUF5QixtQkFBbUIsa0JBQWtCLDJDQUEyQyxrQkFBa0IsbUJBQW1CLEdBQUcsaUJBQWlCLHlCQUF5QixHQUFHLGFBQWEsdUJBQXVCLDRCQUE0Qix5QkFBeUIsaUJBQWlCLG1CQUFtQixpQkFBaUIsZ0JBQWdCLEdBQUcsaUJBQWlCLHlCQUF5Qix5QkFBeUIsd0JBQXdCLHVCQUF1QixrQkFBa0IsR0FBRyxzQ0FBc0MsdUJBQXVCLHdCQUF3Qix5QkFBeUIseUJBQXlCLEdBQUcsMkJBQTJCLHdCQUF3QixHQUFHLGdCQUFnQixvQkFBb0IsdUJBQXVCLGdDQUFnQyxHQUFHLGtCQUFrQixrQ0FBa0MsR0FBRyxpQkFBaUIseUJBQXlCLHdCQUF3QixHQUFHLHNCQUFzQiwwQkFBMEIsR0FBRyxrQkFBa0IsMkNBQTJDLHlCQUF5Qix3QkFBd0Isa0JBQWtCLEdBQUcsaUJBQWlCLGdDQUFnQyx5QkFBeUIsc0JBQXNCLHdCQUF3QixxQkFBcUIsR0FBRyx3QkFBd0IsOEJBQThCLEdBQUcsOEJBQThCLGlDQUFpQyxHQUFHLG9CQUFvQixpQ0FBaUMsR0FBRyxrQkFBa0IsMkJBQTJCLEdB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFFRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7QUMvTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0pBQXdKO0FBQ3hKO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7OztBQ3JIRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsT0FBTyxHQUFHLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esa0ZBQWtGLFlBQVk7QUFDOUY7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUUsbUJBQW1CLFFBQVEsTUFBTTtBQUNwRztBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFVBQVU7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsMERBQTBELG1CQUFtQixRQUFRLE1BQU07QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsMEJBQTBCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsOENBQThDLEVBQUU7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsV0FBVztBQUM1QztBQUNBO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQsb0RBQW9ELFFBQVE7QUFDNUQsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsV0FBVztBQUNoQyxrQkFBa0IsV0FBVztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRCxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaDZDNkM7O0FBRTlCLGdDQUFnQyxzREFBVTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLDZCQUE2Qiw4QkFBOEI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQSxzQ0FBc0MsaUJBQWlCLHlCQUF5Qix3QkFBd0Isb0JBQW9CO0FBQzVILG9DQUFvQyxhQUFhLFlBQVksZ0JBQWdCLG1CQUFtQixnQkFBZ0IsYUFBYSxjQUFjO0FBQzNJO0FBQ0E7QUFDQSxxQ0FBcUMsZUFBZTtBQUNwRDtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxXQUFXO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxnQ0FBZ0M7QUFDckU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsWUFBWSxJQUFJLE9BQU8sRUFBRSxZQUFZO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsNkNBQTZDO0FBQzdDLGtGQUFrRixxQ0FBcUMseURBQXlEO0FBQ2hMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5STZDOztBQUU5Qiw2QkFBNkIsc0RBQVU7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsNkJBQTZCLDhCQUE4QjtBQUMzRDtBQUNBLG1GQUFtRiwrQkFBK0I7QUFDbEg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyRDZDOztBQUU5QiwyQkFBMkIsc0RBQVU7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsY0FBYztBQUN6QztBQUNBO0FBQ0EsbUNBQW1DLGlCQUFpQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLFNBQVM7QUFDVDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLDhCQUE4QjtBQUMzRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0RTZDO0FBQ0w7QUFDUztBQUNEOztBQUVoRDs7QUFFZSw0QkFBNEIsc0RBQVU7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGdCQUFnQixtQkFBbUIsdUJBQXVCO0FBQ3RGO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFNBQVMsR0FBRyxTQUFTO0FBQzlEO0FBQ0E7QUFDQTtBQUNBLFFBQVEsOERBQVM7QUFDakI7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFdBQVcsRUFBRSxXQUFXO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxxRUFBcUU7QUFDOUc7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBLDJEQUEyRCxXQUFXO0FBQ3RFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixxQkFBcUI7QUFDckIsMkNBQTJDLG9CQUFvQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULHFEQUFxRCxFQUFFO0FBQ3ZEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxFQUFFOztBQUVYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLDJCQUEyQjtBQUN4RSxnQ0FBZ0MsWUFBWTtBQUM1QztBQUNBLFNBQVMsYUFBYSxJQUFJO0FBQzFCLHVDQUF1QyxJQUFJLFVBQVUsWUFBWSxVQUFVLFlBQVk7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw0REFBNEQsSUFBSSxhQUFhLElBQUk7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsT0FBTyxHQUFHLEtBQUssR0FBRyxTQUFTLFVBQVUsSUFBSSxVQUFVLDBCQUEwQjtBQUMzRztBQUNBLFNBQVM7QUFDVCwrQkFBK0IsT0FBTyxHQUFHLEtBQUssR0FBRyxTQUFTLFVBQVUsSUFBSSxVQUFVLDBCQUEwQjtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGlEQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsbUJBQW1CO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLHVCQUF1QixpQkFBaUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLHVCQUF1Qjs7QUFFL0M7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyWDZEOztBQUU3RDtBQUNlLHdCQUF3QixnRUFBYTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLDhCQUE4QjtBQUM5Qix3QkFBd0I7QUFDeEIsZ0NBQWdDO0FBQ2hDLDBCQUEwQjtBQUMxQiwwQkFBMEI7QUFDMUIsNkJBQTZCO0FBQzdCLDBCQUEwQjtBQUMxQiw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDJCQUEyQjtBQUNsRDtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixlQUFlO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDJCQUEyQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixhQUFhLG9CQUFvQixrQkFBa0I7QUFDN0U7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGFBQWEsb0JBQW9CLGtCQUFrQjtBQUM3RTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsYUFBYSxvQkFBb0Isa0JBQWtCO0FBQzdFO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixhQUFhLG9CQUFvQixrQkFBa0I7QUFDN0U7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGFBQWEsb0JBQW9CLGtCQUFrQjtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLGlCQUFpQixvQkFBb0I7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsWUFBWTtBQUNuQztBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwyQ0FBMkM7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsYUFBYTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixrQkFBa0I7QUFDN0M7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixTQUFTO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ25sQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsU0FBUztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBELG9CQUFvQjtBQUM5RSxhQUFhO0FBQ2I7QUFDQTtBQUNBLDBEQUEwRCxvQkFBb0I7QUFDOUU7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLHNCQUFzQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pGNkM7QUFDbEI7QUFDMkI7QUFDSDs7QUFFcEMsdUJBQXVCLHNEQUFVO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxlQUFlO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixFQUFFO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtFQUFrRTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdCQUFnQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsZ0NBQWdDLGtDQUFrQztBQUNsRSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGdDQUFnQyxtQ0FBbUM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0NBQXdDO0FBQ2hFLHdCQUF3Qiw2Q0FBNkM7QUFDckU7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxvQkFBb0I7QUFDcEU7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBLDJCQUEyQixrQkFBa0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGdEQUFHO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxnREFBZ0Qsb0JBQW9CO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsOEJBQThCO0FBQzNEO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsMkRBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxzQkFBc0IsVUFBVSx5QkFBeUIsVUFBVSx5QkFBeUI7QUFDL0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEMsV0FBVztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsV0FBVztBQUNyRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsT0FBTyxnQkFBZ0I7QUFDdkMsZ0JBQWdCLFNBQVM7QUFDekIsZ0JBQWdCLFNBQVM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLG1DQUFtQyw2QkFBNkI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCLE9BQU87QUFDdkIsZ0JBQWdCLGlCQUFpQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixpQkFBaUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0Isa0JBQWtCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0IsMEJBQTBCO0FBQzFCLDBCQUEwQjtBQUMxQiw0QkFBNEI7QUFDNUIsNEJBQTRCO0FBQzVCO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0bkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGFBQWE7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLG1CQUFtQjtBQUMxQzs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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TSxpQ0FBaUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLGlJQUFpSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNO0FBQ3hqQyw0cURBQTRxRCxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FB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QTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw0QkFBNEI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7Ozs7Ozs7Ozs7O0FDcERBLGU7Ozs7Ozs7Ozs7QUNBQSxlOzs7Ozs7Ozs7O0FDQUEsZTs7Ozs7Ozs7OztBQ0FBLGU7Ozs7Ozs7Ozs7QUNBQSxlIiwiZmlsZSI6Im5vZGVfbW9kdWxlc19tb21lbnRfbG9jYWxlX3N5bmNfcmVjdXJzaXZlXy1ydW5lc3RvbmVfYWN0aXZlY29kZV9qc19hY2ZhY3RvcnlfanMuYnVuZGxlLmpzP3Y9N2FlNTQwYjhkNDg2ODVmNDdhNzEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5tb2RhbC1wcm9maWxlIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgbWluLWhlaWdodDogMzAwcHg7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIHdpZHRoOiA3MDBweDtcXG4gICAgcGFkZGluZzogMjVweDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZjtcXG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgLW1vei1ib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICBiYWNrZ3JvdW5kOiAjZjJmMmYyO1xcbiAgICB6LWluZGV4OiA1MDtcXG59XFxuXFxuLm1vZGFsLWxpZ2h0c291dCB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICBsZWZ0OiAwO1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgei1pbmRleDogMjU7XFxuICAgIGJhY2tncm91bmQ6ICMwMDA7XFxufVxcblxcbi5tb2RhbC1jbG9zZS1wcm9maWxlIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBoZWlnaHQ6IDQzcHg7XFxuICAgIHdpZHRoOiA0M3B4O1xcbiAgICAvKmJhY2tncm91bmQtaW1hZ2U6IHVybCgnY2xvc2UucG5nJyk7ICovXFxuICAgIHRvcDogMXB4O1xcbiAgICByaWdodDogMC41cHg7XFxufVxcblxcbi5hY19hY3Rpb25zIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG4uYWNfc2VwIHtcXG4gICAgYmFja2dyb3VuZDogIzAwMDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBtYXJnaW46IC0xNXB4IDEwcHg7XFxuICAgIHdpZHRoOiAxcHg7XFxuICAgIGhlaWdodDogMzVweDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgYm9yZGVyOiAwO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWF4LXdpZHRoOiA4MDBweDtcXG4gICAgY2xlYXI6IGJvdGg7XFxufVxcblxcbi5hY19zZWN0aW9uID4gKjpub3QoLmFjX3NlY3Rpb24pIHtcXG4gICAgbWF4LXdpZHRoOiA1MDBwdDtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiAuY2xlYXJmaXgge1xcbiAgICBwb3NpdGlvbjogaW5pdGlhbDtcXG59XFxuXFxuLmFjX291dHB1dCB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIG1heC13aWR0aDogNDUwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxufVxcbi5hY19vdXRwdXQgcHJlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xcbn1cXG5cXG4uYWNfY2FwdGlvbiB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxufVxcblxcbi5hY19jYXB0aW9uX3RleHQge1xcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xcbn1cXG5cXG4uYWNfcXVlc3Rpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI0LCAyMzYsIDIxNyk7XFxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcXG4gICAgcGFkZGluZy10b3A6IDEwcHg7XFxuICAgIG1hcmdpbjogNXB4O1xcbn1cXG5cXG4uYWN0aXZlX291dCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkY2RjZGM7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgbWluLXdpZHRoOiAyMGVtO1xcbiAgICBtYXgtaGVpZ2h0OiAzMDBweDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxufVxcblxcbi52aXNpYmxlLWFjLWNhbnZhcyB7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkIGJsYWNrO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiA+IC5jb2wtbWQtMTIge1xcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG59XFxuXFxuLmZ1bGxfd2lkdGggb2wge1xcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG59XFxuXFxuLmFjLWRpc2FibGVkIHtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi5hYy1mZWVkYmFjayB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xcbiAgICBwYWRkaW5nOiAzcHg7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5O1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0X3N1Y2Nlc3Mge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgY29sb3I6IGdyZWVuO1xcbiAgICBib3JkZXI6IDBweDtcXG4gICAgcGFkZGluZzogMHB4O1xcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICBtaW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDtcXG59XFxuXFxuLmFjX3NxbF9yZXN1bHRfZmFpbHVyZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBjb2xvcjogcmVkO1xcbiAgICBib3JkZXI6IDBweDtcXG4gICAgcGFkZGluZzogMHB4O1xcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICBtaW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDtcXG59XFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvY3NzL2FjdGl2ZWNvZGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksYUFBYTtJQUNiLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsK0JBQStCO0lBQy9CLG9DQUFvQztJQUNwQyx1Q0FBdUM7SUFDdkMsbUJBQW1CO0lBQ25CLHdCQUF3QjtJQUN4QiwyQkFBMkI7SUFDM0IsbUJBQW1CO0lBQ25CLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsTUFBTTtJQUNOLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsWUFBWTtJQUNaLFdBQVc7SUFDWCx1Q0FBdUM7SUFDdkMsUUFBUTtJQUNSLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsWUFBWTtJQUNaLFVBQVU7SUFDVixTQUFTO0FBQ2I7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsV0FBVztBQUNmOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLGdCQUFnQjtJQUNoQix5QkFBeUI7QUFDN0I7QUFDQTtJQUNJLDJCQUEyQjtBQUMvQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxvQ0FBb0M7SUFDcEMsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsY0FBYztBQUNsQjs7QUFFQTtJQUNJLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLHVCQUF1QjtJQUN2QixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksMkJBQTJCO0lBQzNCLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksNkJBQTZCO0lBQzdCLFlBQVk7SUFDWixXQUFXO0lBQ1gsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksNkJBQTZCO0lBQzdCLFVBQVU7SUFDVixXQUFXO0lBQ1gsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsMEJBQTBCO0FBQzlCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5tb2RhbC1wcm9maWxlIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgbWluLWhlaWdodDogMzAwcHg7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIHdpZHRoOiA3MDBweDtcXG4gICAgcGFkZGluZzogMjVweDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZjtcXG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgLW1vei1ib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICBiYWNrZ3JvdW5kOiAjZjJmMmYyO1xcbiAgICB6LWluZGV4OiA1MDtcXG59XFxuXFxuLm1vZGFsLWxpZ2h0c291dCB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICBsZWZ0OiAwO1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgei1pbmRleDogMjU7XFxuICAgIGJhY2tncm91bmQ6ICMwMDA7XFxufVxcblxcbi5tb2RhbC1jbG9zZS1wcm9maWxlIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBoZWlnaHQ6IDQzcHg7XFxuICAgIHdpZHRoOiA0M3B4O1xcbiAgICAvKmJhY2tncm91bmQtaW1hZ2U6IHVybCgnY2xvc2UucG5nJyk7ICovXFxuICAgIHRvcDogMXB4O1xcbiAgICByaWdodDogMC41cHg7XFxufVxcblxcbi5hY19hY3Rpb25zIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG4uYWNfc2VwIHtcXG4gICAgYmFja2dyb3VuZDogIzAwMDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBtYXJnaW46IC0xNXB4IDEwcHg7XFxuICAgIHdpZHRoOiAxcHg7XFxuICAgIGhlaWdodDogMzVweDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgYm9yZGVyOiAwO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWF4LXdpZHRoOiA4MDBweDtcXG4gICAgY2xlYXI6IGJvdGg7XFxufVxcblxcbi5hY19zZWN0aW9uID4gKjpub3QoLmFjX3NlY3Rpb24pIHtcXG4gICAgbWF4LXdpZHRoOiA1MDBwdDtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiAuY2xlYXJmaXgge1xcbiAgICBwb3NpdGlvbjogaW5pdGlhbDtcXG59XFxuXFxuLmFjX291dHB1dCB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIG1heC13aWR0aDogNDUwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxufVxcbi5hY19vdXRwdXQgcHJlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xcbn1cXG5cXG4uYWNfY2FwdGlvbiB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxufVxcblxcbi5hY19jYXB0aW9uX3RleHQge1xcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xcbn1cXG5cXG4uYWNfcXVlc3Rpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI0LCAyMzYsIDIxNyk7XFxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcXG4gICAgcGFkZGluZy10b3A6IDEwcHg7XFxuICAgIG1hcmdpbjogNXB4O1xcbn1cXG5cXG4uYWN0aXZlX291dCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkY2RjZGM7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgbWluLXdpZHRoOiAyMGVtO1xcbiAgICBtYXgtaGVpZ2h0OiAzMDBweDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxufVxcblxcbi52aXNpYmxlLWFjLWNhbnZhcyB7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkIGJsYWNrO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiA+IC5jb2wtbWQtMTIge1xcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG59XFxuXFxuLmZ1bGxfd2lkdGggb2wge1xcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG59XFxuXFxuLmFjLWRpc2FibGVkIHtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi5hYy1mZWVkYmFjayB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xcbiAgICBwYWRkaW5nOiAzcHg7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5O1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0X3N1Y2Nlc3Mge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgY29sb3I6IGdyZWVuO1xcbiAgICBib3JkZXI6IDBweDtcXG4gICAgcGFkZGluZzogMHB4O1xcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICBtaW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDtcXG59XFxuXFxuLmFjX3NxbF9yZXN1bHRfZmFpbHVyZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBjb2xvcjogcmVkO1xcbiAgICBib3JkZXI6IDBweDtcXG4gICAgcGFkZGluZzogMHB4O1xcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICBtaW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9hZlwiOiA0Mjc4Nixcblx0XCIuL2FmLmpzXCI6IDQyNzg2LFxuXHRcIi4vYXJcIjogMzA4NjcsXG5cdFwiLi9hci1kelwiOiAxNDEzMCxcblx0XCIuL2FyLWR6LmpzXCI6IDE0MTMwLFxuXHRcIi4vYXIta3dcIjogOTYxMzUsXG5cdFwiLi9hci1rdy5qc1wiOiA5NjEzNSxcblx0XCIuL2FyLWx5XCI6IDU2NDQwLFxuXHRcIi4vYXItbHkuanNcIjogNTY0NDAsXG5cdFwiLi9hci1tYVwiOiA0NzcwMixcblx0XCIuL2FyLW1hLmpzXCI6IDQ3NzAyLFxuXHRcIi4vYXItc2FcIjogMTYwNDAsXG5cdFwiLi9hci1zYS5qc1wiOiAxNjA0MCxcblx0XCIuL2FyLXRuXCI6IDM3MTAwLFxuXHRcIi4vYXItdG4uanNcIjogMzcxMDAsXG5cdFwiLi9hci5qc1wiOiAzMDg2Nyxcblx0XCIuL2F6XCI6IDMxMDgzLFxuXHRcIi4vYXouanNcIjogMzEwODMsXG5cdFwiLi9iZVwiOiA5ODA4LFxuXHRcIi4vYmUuanNcIjogOTgwOCxcblx0XCIuL2JnXCI6IDY4MzM4LFxuXHRcIi4vYmcuanNcIjogNjgzMzgsXG5cdFwiLi9ibVwiOiA2NzQzOCxcblx0XCIuL2JtLmpzXCI6IDY3NDM4LFxuXHRcIi4vYm5cIjogODkwNSxcblx0XCIuL2JuLmpzXCI6IDg5MDUsXG5cdFwiLi9ib1wiOiAxMTU2MCxcblx0XCIuL2JvLmpzXCI6IDExNTYwLFxuXHRcIi4vYnJcIjogMTI3OCxcblx0XCIuL2JyLmpzXCI6IDEyNzgsXG5cdFwiLi9ic1wiOiA4MDYyMixcblx0XCIuL2JzLmpzXCI6IDgwNjIyLFxuXHRcIi4vY2FcIjogMjQ2OCxcblx0XCIuL2NhLmpzXCI6IDI0NjgsXG5cdFwiLi9jc1wiOiA1ODIyLFxuXHRcIi4vY3MuanNcIjogNTgyMixcblx0XCIuL2N2XCI6IDUwODc3LFxuXHRcIi4vY3YuanNcIjogNTA4NzcsXG5cdFwiLi9jeVwiOiA0NzM3Myxcblx0XCIuL2N5LmpzXCI6IDQ3MzczLFxuXHRcIi4vZGFcIjogMjQ3ODAsXG5cdFwiLi9kYS5qc1wiOiAyNDc4MCxcblx0XCIuL2RlXCI6IDU5NzQwLFxuXHRcIi4vZGUtYXRcIjogNjAyMTcsXG5cdFwiLi9kZS1hdC5qc1wiOiA2MDIxNyxcblx0XCIuL2RlLWNoXCI6IDYwODk0LFxuXHRcIi4vZGUtY2guanNcIjogNjA4OTQsXG5cdFwiLi9kZS5qc1wiOiA1OTc0MCxcblx0XCIuL2R2XCI6IDUzMDAsXG5cdFwiLi9kdi5qc1wiOiA1MzAwLFxuXHRcIi4vZWxcIjogNTA4MzcsXG5cdFwiLi9lbC5qc1wiOiA1MDgzNyxcblx0XCIuL2VuLWF1XCI6IDc4MzQ4LFxuXHRcIi4vZW4tYXUuanNcIjogNzgzNDgsXG5cdFwiLi9lbi1jYVwiOiA3NzkyNSxcblx0XCIuL2VuLWNhLmpzXCI6IDc3OTI1LFxuXHRcIi4vZW4tZ2JcIjogMjIyNDMsXG5cdFwiLi9lbi1nYi5qc1wiOiAyMjI0Myxcblx0XCIuL2VuLWllXCI6IDQ2NDM2LFxuXHRcIi4vZW4taWUuanNcIjogNDY0MzYsXG5cdFwiLi9lbi1uelwiOiA3NjMxOSxcblx0XCIuL2VuLW56LmpzXCI6IDc2MzE5LFxuXHRcIi4vZW9cIjogOTI5MTUsXG5cdFwiLi9lby5qc1wiOiA5MjkxNSxcblx0XCIuL2VzXCI6IDU1NjU1LFxuXHRcIi4vZXMtZG9cIjogNTUyNTEsXG5cdFwiLi9lcy1kby5qc1wiOiA1NTI1MSxcblx0XCIuL2VzLXVzXCI6IDcxMTQ2LFxuXHRcIi4vZXMtdXMuanNcIjogNzExNDYsXG5cdFwiLi9lcy5qc1wiOiA1NTY1NSxcblx0XCIuL2V0XCI6IDU2MDMsXG5cdFwiLi9ldC5qc1wiOiA1NjAzLFxuXHRcIi4vZXVcIjogNzc3NjMsXG5cdFwiLi9ldS5qc1wiOiA3Nzc2Myxcblx0XCIuL2ZhXCI6IDc2OTU5LFxuXHRcIi4vZmEuanNcIjogNzY5NTksXG5cdFwiLi9maVwiOiAxMTg5Nyxcblx0XCIuL2ZpLmpzXCI6IDExODk3LFxuXHRcIi4vZm9cIjogOTQ2OTQsXG5cdFwiLi9mby5qc1wiOiA5NDY5NCxcblx0XCIuL2ZyXCI6IDk0NDcwLFxuXHRcIi4vZnItY2FcIjogNjMwNDksXG5cdFwiLi9mci1jYS5qc1wiOiA2MzA0OSxcblx0XCIuL2ZyLWNoXCI6IDUyMzMwLFxuXHRcIi4vZnItY2guanNcIjogNTIzMzAsXG5cdFwiLi9mci5qc1wiOiA5NDQ3MCxcblx0XCIuL2Z5XCI6IDUwNDQsXG5cdFwiLi9meS5qc1wiOiA1MDQ0LFxuXHRcIi4vZ2RcIjogMjEwMSxcblx0XCIuL2dkLmpzXCI6IDIxMDEsXG5cdFwiLi9nbFwiOiAzODc5NCxcblx0XCIuL2dsLmpzXCI6IDM4Nzk0LFxuXHRcIi4vZ29tLWxhdG5cIjogMjMxNjgsXG5cdFwiLi9nb20tbGF0bi5qc1wiOiAyMzE2OCxcblx0XCIuL2d1XCI6IDk1MzQ5LFxuXHRcIi4vZ3UuanNcIjogOTUzNDksXG5cdFwiLi9oZVwiOiAyNDIwNixcblx0XCIuL2hlLmpzXCI6IDI0MjA2LFxuXHRcIi4vaGlcIjogMzAwOTQsXG5cdFwiLi9oaS5qc1wiOiAzMDA5NCxcblx0XCIuL2hyXCI6IDMwMzE2LFxuXHRcIi4vaHIuanNcIjogMzAzMTYsXG5cdFwiLi9odVwiOiAyMjEzOCxcblx0XCIuL2h1LmpzXCI6IDIyMTM4LFxuXHRcIi4vaHktYW1cIjogMTE0MjMsXG5cdFwiLi9oeS1hbS5qc1wiOiAxMTQyMyxcblx0XCIuL2lkXCI6IDI5MjE4LFxuXHRcIi4vaWQuanNcIjogMjkyMTgsXG5cdFwiLi9pc1wiOiA5MDEzNSxcblx0XCIuL2lzLmpzXCI6IDkwMTM1LFxuXHRcIi4vaXRcIjogOTA2MjYsXG5cdFwiLi9pdC5qc1wiOiA5MDYyNixcblx0XCIuL2phXCI6IDM5MTgzLFxuXHRcIi4vamEuanNcIjogMzkxODMsXG5cdFwiLi9qdlwiOiAyNDI4Nixcblx0XCIuL2p2LmpzXCI6IDI0Mjg2LFxuXHRcIi4va2FcIjogNDA0MTUsXG5cdFwiLi9rYS5qc1wiOiA0MDQxNSxcblx0XCIuL2trXCI6IDQ3NzcyLFxuXHRcIi4va2suanNcIjogNDc3NzIsXG5cdFwiLi9rbVwiOiAxODc1OCxcblx0XCIuL2ttLmpzXCI6IDE4NzU4LFxuXHRcIi4va25cIjogNzkyODIsXG5cdFwiLi9rbi5qc1wiOiA3OTI4Mixcblx0XCIuL2tvXCI6IDMzNzMwLFxuXHRcIi4va28uanNcIjogMzM3MzAsXG5cdFwiLi9reVwiOiAzMzI5MSxcblx0XCIuL2t5LmpzXCI6IDMzMjkxLFxuXHRcIi4vbGJcIjogMzY4NDEsXG5cdFwiLi9sYi5qc1wiOiAzNjg0MSxcblx0XCIuL2xvXCI6IDU1NDY2LFxuXHRcIi4vbG8uanNcIjogNTU0NjYsXG5cdFwiLi9sdFwiOiA1NzAxMCxcblx0XCIuL2x0LmpzXCI6IDU3MDEwLFxuXHRcIi4vbHZcIjogMzc1OTUsXG5cdFwiLi9sdi5qc1wiOiAzNzU5NSxcblx0XCIuL21lXCI6IDM5ODYxLFxuXHRcIi4vbWUuanNcIjogMzk4NjEsXG5cdFwiLi9taVwiOiAzNTQ5Myxcblx0XCIuL21pLmpzXCI6IDM1NDkzLFxuXHRcIi4vbWtcIjogOTU5NjYsXG5cdFwiLi9tay5qc1wiOiA5NTk2Nixcblx0XCIuL21sXCI6IDg3MzQxLFxuXHRcIi4vbWwuanNcIjogODczNDEsXG5cdFwiLi9tclwiOiAxMDM3MCxcblx0XCIuL21yLmpzXCI6IDEwMzcwLFxuXHRcIi4vbXNcIjogOTg0Nyxcblx0XCIuL21zLW15XCI6IDQxMjM3LFxuXHRcIi4vbXMtbXkuanNcIjogNDEyMzcsXG5cdFwiLi9tcy5qc1wiOiA5ODQ3LFxuXHRcIi4vbXRcIjogNzIxMjYsXG5cdFwiLi9tdC5qc1wiOiA3MjEyNixcblx0XCIuL215XCI6IDU2MTY1LFxuXHRcIi4vbXkuanNcIjogNTYxNjUsXG5cdFwiLi9uYlwiOiA2NDkyNCxcblx0XCIuL25iLmpzXCI6IDY0OTI0LFxuXHRcIi4vbmVcIjogMTY3NDQsXG5cdFwiLi9uZS5qc1wiOiAxNjc0NCxcblx0XCIuL25sXCI6IDkzOTAxLFxuXHRcIi4vbmwtYmVcIjogNTk4MTQsXG5cdFwiLi9ubC1iZS5qc1wiOiA1OTgxNCxcblx0XCIuL25sLmpzXCI6IDkzOTAxLFxuXHRcIi4vbm5cIjogODM4NzcsXG5cdFwiLi9ubi5qc1wiOiA4Mzg3Nyxcblx0XCIuL3BhLWluXCI6IDE1ODU4LFxuXHRcIi4vcGEtaW4uanNcIjogMTU4NTgsXG5cdFwiLi9wbFwiOiA2NDQ5NSxcblx0XCIuL3BsLmpzXCI6IDY0NDk1LFxuXHRcIi4vcHRcIjogODk1MjAsXG5cdFwiLi9wdC1iclwiOiA1Nzk3MSxcblx0XCIuL3B0LWJyLmpzXCI6IDU3OTcxLFxuXHRcIi4vcHQuanNcIjogODk1MjAsXG5cdFwiLi9yb1wiOiA5NjQ1OSxcblx0XCIuL3JvLmpzXCI6IDk2NDU5LFxuXHRcIi4vcnVcIjogMjE3OTMsXG5cdFwiLi9ydS5qc1wiOiAyMTc5Myxcblx0XCIuL3NkXCI6IDQwOTUwLFxuXHRcIi4vc2QuanNcIjogNDA5NTAsXG5cdFwiLi9zZVwiOiAxMDQ5MCxcblx0XCIuL3NlLmpzXCI6IDEwNDkwLFxuXHRcIi4vc2lcIjogOTAxMjQsXG5cdFwiLi9zaS5qc1wiOiA5MDEyNCxcblx0XCIuL3NrXCI6IDY0MjQ5LFxuXHRcIi4vc2suanNcIjogNjQyNDksXG5cdFwiLi9zbFwiOiAxNDk4NSxcblx0XCIuL3NsLmpzXCI6IDE0OTg1LFxuXHRcIi4vc3FcIjogNTExMDQsXG5cdFwiLi9zcS5qc1wiOiA1MTEwNCxcblx0XCIuL3NyXCI6IDQ5MTMxLFxuXHRcIi4vc3ItY3lybFwiOiAxMzcwOSxcblx0XCIuL3NyLWN5cmwuanNcIjogMTM3MDksXG5cdFwiLi9zci5qc1wiOiA0OTEzMSxcblx0XCIuL3NzXCI6IDg1ODkzLFxuXHRcIi4vc3MuanNcIjogODU4OTMsXG5cdFwiLi9zdlwiOiA5ODc2MCxcblx0XCIuL3N2LmpzXCI6IDk4NzYwLFxuXHRcIi4vc3dcIjogOTExNzIsXG5cdFwiLi9zdy5qc1wiOiA5MTE3Mixcblx0XCIuL3RhXCI6IDI3MzMzLFxuXHRcIi4vdGEuanNcIjogMjczMzMsXG5cdFwiLi90ZVwiOiAyMzExMCxcblx0XCIuL3RlLmpzXCI6IDIzMTEwLFxuXHRcIi4vdGV0XCI6IDUyMDk1LFxuXHRcIi4vdGV0LmpzXCI6IDUyMDk1LFxuXHRcIi4vdGhcIjogOTA0MSxcblx0XCIuL3RoLmpzXCI6IDkwNDEsXG5cdFwiLi90bC1waFwiOiA3NTc2OCxcblx0XCIuL3RsLXBoLmpzXCI6IDc1NzY4LFxuXHRcIi4vdGxoXCI6IDg5NDQ0LFxuXHRcIi4vdGxoLmpzXCI6IDg5NDQ0LFxuXHRcIi4vdHJcIjogNzIzOTcsXG5cdFwiLi90ci5qc1wiOiA3MjM5Nyxcblx0XCIuL3R6bFwiOiAyODI1NCxcblx0XCIuL3R6bC5qc1wiOiAyODI1NCxcblx0XCIuL3R6bVwiOiA1MTEwNixcblx0XCIuL3R6bS1sYXRuXCI6IDMwNjk5LFxuXHRcIi4vdHptLWxhdG4uanNcIjogMzA2OTksXG5cdFwiLi90em0uanNcIjogNTExMDYsXG5cdFwiLi91a1wiOiA2NzY5MSxcblx0XCIuL3VrLmpzXCI6IDY3NjkxLFxuXHRcIi4vdXJcIjogMTM3OTUsXG5cdFwiLi91ci5qc1wiOiAxMzc5NSxcblx0XCIuL3V6XCI6IDY3OTEsXG5cdFwiLi91ei1sYXRuXCI6IDYwNTg4LFxuXHRcIi4vdXotbGF0bi5qc1wiOiA2MDU4OCxcblx0XCIuL3V6LmpzXCI6IDY3OTEsXG5cdFwiLi92aVwiOiA2NTY2Nixcblx0XCIuL3ZpLmpzXCI6IDY1NjY2LFxuXHRcIi4veC1wc2V1ZG9cIjogMTQzNzgsXG5cdFwiLi94LXBzZXVkby5qc1wiOiAxNDM3OCxcblx0XCIuL3lvXCI6IDc1ODA1LFxuXHRcIi4veW8uanNcIjogNzU4MDUsXG5cdFwiLi96aC1jblwiOiA4MzgzOSxcblx0XCIuL3poLWNuLmpzXCI6IDgzODM5LFxuXHRcIi4vemgtaGtcIjogNTU3MjYsXG5cdFwiLi96aC1oay5qc1wiOiA1NTcyNixcblx0XCIuL3poLXR3XCI6IDc0MTUyLFxuXHRcIi4vemgtdHcuanNcIjogNzQxNTJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSA0NjcwMDsiLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2FjdGl2ZWNvZGUuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcbmltcG9ydCBKU0FjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9qcy5qc1wiO1xuaW1wb3J0IEhUTUxBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfaHRtbC5qc1wiO1xuaW1wb3J0IFNRTEFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9zcWwuanNcIjtcbmltcG9ydCBCcnl0aG9uQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2JyeXRob24uanNcIjtcbmltcG9ydCBMaXZlQ29kZSBmcm9tIFwiLi9saXZlY29kZS5qc1wiO1xuaW1wb3J0IHtcbiAgICBUaW1lZEFjdGl2ZUNvZGUsXG4gICAgVGltZWRMaXZlQ29kZSxcbiAgICBUaW1lZEpTQWN0aXZlQ29kZSxcbiAgICBUaW1lZEhUTUxBY3RpdmVDb2RlLFxuICAgIFRpbWVkU1FMQWN0aXZlQ29kZSxcbiAgICBUaW1lZEJyeXRob25BY3RpdmVDb2RlLFxufSBmcm9tIFwiLi90aW1lZF9hY3RpdmVjb2RlXCI7XG5pbXBvcnQgXCIuLi8uLi9jb21tb24vanMvanF1ZXJ5LmhpZ2hsaWdodC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBQ0ZhY3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmZvbyA9IFwiYmFyXCI7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVBY3RpdmVDb2RlKG9yaWcsIGxhbmcsIGFkZG9wdHMpIHtcbiAgICAgICAgdmFyIG9wdHMgPSB7XG4gICAgICAgICAgICBvcmlnOiBvcmlnLFxuICAgICAgICAgICAgdXNlUnVuZXN0b25lU2VydmljZXM6IGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzLFxuICAgICAgICAgICAgcHl0aG9uMzogZUJvb2tDb25maWcucHl0aG9uMyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGFkZG9wdHMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGF0dHJuYW1lIGluIGFkZG9wdHMpIHtcbiAgICAgICAgICAgICAgICBvcHRzW2F0dHJuYW1lXSA9IGFkZG9wdHNbYXR0cm5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsYW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhbmcgPSAkKG9wdHMub3JpZykuZmluZChcIltkYXRhLWxhbmddXCIpLmRhdGEoXCJsYW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0ZXh0X2FyZWEgPSAkKG9wdHMub3JpZykuZmluZChcInRleHRhcmVhXCIpWzBdXG4gICAgICAgIHZhciBweXRob24zX2ludGVycHJldGVyID0gJCh0ZXh0X2FyZWEpLmF0dHIoXCJkYXRhLXB5dGhvbjNfaW50ZXJwcmV0ZXJcIik7XG4gICAgICAgIHZhciBvdXRwdXRfaGVpZ2h0ID0gJCh0ZXh0X2FyZWEpLmF0dHIoXCJkYXRhLW91dHB1dF9oZWlnaHRcIik7XG4gICAgICAgIGlmIChvcHRzLnRpbWVkID09IHRydWUpIHtcbiAgICAgICAgICAgIGlmKHB5dGhvbjNfaW50ZXJwcmV0ZXI9PT1cImJyeXRob25cIil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEJyeXRob25BY3RpdmVDb2RlKG9wdHMpOyAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhbmcgPT09IFwicHl0aG9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgbGFuZyA9PT0gXCJqYXZhXCIgfHxcbiAgICAgICAgICAgICAgICBsYW5nID09PSBcImNwcFwiIHx8XG4gICAgICAgICAgICAgICAgbGFuZyA9PT0gXCJjXCIgfHxcbiAgICAgICAgICAgICAgICBsYW5nID09PSBcInB5dGhvbjNcIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZExpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcImphdmFzY3JpcHRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRKU0FjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwiaHRtbG1peGVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkSFRNTEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwic3FsXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkU1FMQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoKGxhbmcgPT09XCJweXRob24zXCIpICYmIChweXRob24zX2ludGVycHJldGVyID09PSBcImJyeXRob25cIikpe1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnJ5dGhvbkFjdGl2ZUNvZGUob3B0cyk7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsYW5nID09PSBcImphdmFzY3JpcHRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSlNBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcImh0bWxtaXhlZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIVE1MQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJzcWxcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU1FMQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgW1wiamF2YVwiLCBcImNwcFwiLCBcImNcIiwgXCJweXRob24zXCIsIFwicHl0aG9uMlwiLCBcIm9jdGF2ZVwiXS5pbmRleE9mKFxuICAgICAgICAgICAgICAgICAgICBsYW5nXG4gICAgICAgICAgICAgICAgKSA+IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGlzIHB5dGhvblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyB1c2VkIGJ5IHdlYjJweSBjb250cm9sbGVyKHMpXG4gICAgc3RhdGljIGFkZEFjdGl2ZUNvZGVUb0RpdihvdXRlcmRpdmlkLCBhY2RpdmlkLCBzaWQsIGluaXRpYWxjb2RlLCBsYW5ndWFnZSkge1xuICAgICAgICB2YXIgdGhlcHJlLCBuZXdhYztcbiAgICAgICAgdmFyIGFjZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWNkaXZpZCk7XG4gICAgICAgICQoYWNkaXYpLmVtcHR5KCk7XG4gICAgICAgIHRoZXByZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcbiAgICAgICAgdGhlcHJlW1wiZGF0YS1jb21wb25lbnRcIl0gPSBcImFjdGl2ZWNvZGVcIjtcbiAgICAgICAgdGhlcHJlLmlkID0gb3V0ZXJkaXZpZDtcbiAgICAgICAgJCh0aGVwcmUpLmRhdGEoXCJsYW5nXCIsIGxhbmd1YWdlKTtcbiAgICAgICAgJChhY2RpdikuYXBwZW5kKHRoZXByZSk7XG4gICAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICAgICAgb3JpZzogdGhlcHJlLFxuICAgICAgICAgICAgdXNlUnVuZXN0b25lU2VydmljZXM6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIHZhciBhZGRvcHRzID0ge1xuICAgICAgICAgICAgc2lkOiBzaWQsXG4gICAgICAgICAgICBncmFkZXJhY3RpdmU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChsYW5ndWFnZSA9PT0gXCJodG1sbWl4ZWRcIikge1xuICAgICAgICAgICAgYWRkb3B0c1tcInZlcnRpY2FsXCJdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBuZXdhYyA9IEFDRmFjdG9yeS5jcmVhdGVBY3RpdmVDb2RlKHRoZXByZSwgbGFuZ3VhZ2UsIGFkZG9wdHMpO1xuICAgICAgICB2YXIgc2F2ZWRpdiA9IG5ld2FjLmRpdmlkO1xuICAgICAgICBuZXdhYy5kaXZpZCA9IHNhdmVkaXY7XG4gICAgICAgIG5ld2FjLmVkaXRvci5zZXRTaXplKDUwMCwgMzAwKTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBuZXdhYy5lZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlQWN0aXZlQ29kZUZyb21PcHRzKG9wdHMpIHtcbiAgICAgICAgcmV0dXJuIEFDRmFjdG9yeS5jcmVhdGVBY3RpdmVDb2RlKG9wdHMub3JpZywgb3B0cy5sYW5nLCBvcHRzKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVNjcmF0Y2hBY3RpdmVjb2RlKCkge1xuICAgICAgICAvKiBzZXQgdXAgdGhlIHNjcmF0Y2ggQWN0aXZlY29kZSBlZGl0b3IgaW4gdGhlIHNlYXJjaCBtZW51ICovXG4gICAgICAgIC8vIHVzZSB0aGUgVVJMIHRvIGFzc2lnbiBhIGRpdmlkIC0gZWFjaCBwYWdlIHNob3VsZCBoYXZlIGEgdW5pcXVlIEFjdGl2ZWNvZGUgYmxvY2sgaWQuXG4gICAgICAgIC8vIFJlbW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIFVSTCBidXQgdGhlIGNvdXJzZSBhbmQgcGFnZSBuYW1lXG4gICAgICAgIC8vIHRvZG86ICB0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGVsaW1pbmF0ZWQgYW5kIHNpbXBseSBtb3ZlZCB0byB0aGUgdGVtcGxhdGUgZmlsZVxuXG4gICAgICAgIGlmIChlQm9va0NvbmZpZy5lbmFibGVTY3JhdGNoQUMgPT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICB2YXIgZGl2aWQgPSBlQm9va0NvbmZpZy5jb3Vyc2UgKyBcIl9zY3JhdGNoX2FjXCI7XG4gICAgICAgIGRpdmlkID0gZGl2aWQucmVwbGFjZSgvWyMuXS9nLCBcIlwiKTsgLy8gaW4gY2FzZSBib29rIHRpdGxlIGhhcyBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBtZXNzIHVwIG91ciBzZWxlY3RvcnNcbiAgICAgICAgZUJvb2tDb25maWcuc2NyYXRjaERpdiA9IGRpdmlkO1xuICAgICAgICBsZXQgc3RkaW4gPSBcIlwiO1xuICAgICAgICB2YXIgbGFuZyA9IGVCb29rQ29uZmlnLmFjRGVmYXVsdExhbmd1YWdlXG4gICAgICAgICAgICA/IGVCb29rQ29uZmlnLmFjRGVmYXVsdExhbmd1YWdlXG4gICAgICAgICAgICA6IFwicHl0aG9uXCI7XG4gICAgICAgIGlmIChsYW5nID09PSBcImphdmFcIiB8fCBsYW5nID09PSBcImNwcFwiIHx8IGxhbmcgPT09IFwicHl0aG9uM1wiKSB7XG4gICAgICAgICAgICBzdGRpbiA9IGBkYXRhLXN0ZGluPVwidGV4dCBmb3Igc3RkaW5cImA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIEhUTUxcbiAgICAgICAgdmFyIGh0bWwgPSBgPGRpdiBpZD1cImFjX21vZGFsXyR7ZGl2aWR9XCIgY2xhc3M9XCJtb2RhbCBmYWRlXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgc2NyYXRjaC1hYy1tb2RhbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5TY3JhdGNoIEFjdGl2ZUNvZGU8L2g0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWNvbXBvbmVudD1cImFjdGl2ZWNvZGVcIiBpZD0ke2RpdmlkfT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9JHtkaXZpZH1fcXVlc3Rpb24gY2xhc3M9XCJhY19xdWVzdGlvblwiPjxwPlVzZSB0aGlzIGFyZWEgZm9yIHdyaXRpbmcgY29kZSBvciB0YWtpbmcgbm90ZXMuPC9wPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGRhdGEtY29kZWxlbnM9XCJ0cnVlXCIgZGF0YS1sYW5nPVwiJHtsYW5nfVwiICR7c3RkaW59PlxuXG5cblxuXG4gICAgICAgICAgICAgICAgICA8L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB2YXIgZWwgPSAkKGh0bWwpO1xuICAgICAgICAkKFwiYm9keVwiKS5hcHBlbmQoZWwpO1xuICAgICAgICBlbC5vbihcInNob3duLmJzLm1vZGFsIHNob3cuYnMubW9kYWxcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZWwuZmluZChcIi5Db2RlTWlycm9yXCIpLmVhY2goZnVuY3Rpb24gKGksIGUpIHtcbiAgICAgICAgICAgICAgICBlLkNvZGVNaXJyb3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgIGUuQ29kZU1pcnJvci5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgdG9nZ2xlU2NyYXRjaEFjdGl2ZWNvZGUoKSB7XG4gICAgICAgIHZhciBkaXZpZCA9IFwiYWNfbW9kYWxfXCIgKyBlQm9va0NvbmZpZy5zY3JhdGNoRGl2O1xuICAgICAgICB2YXIgZGl2ID0gJChcIiNcIiArIGRpdmlkKTtcbiAgICAgICAgJChgIyR7ZUJvb2tDb25maWcuc2NyYXRjaERpdn1gKS5yZW1vdmVDbGFzcyhcImFjX3NlY3Rpb25cIik7XG4gICAgICAgIGRpdi5tb2RhbChcInRvZ2dsZVwiKTtcbiAgICB9XG59XG5cbi8vXG4vLyBQYWdlIEluaXRpYWxpemF0aW9uXG4vL1xuXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBBQ0ZhY3RvcnkuY3JlYXRlU2NyYXRjaEFjdGl2ZWNvZGUoKTtcbiAgICAkKFwiW2RhdGEtY29tcG9uZW50PWFjdGl2ZWNvZGVdXCIpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoJCh0aGlzKS5jbG9zZXN0KFwiW2RhdGEtY29tcG9uZW50PXRpbWVkQXNzZXNzbWVudF1cIikubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBleGlzdHMgd2l0aGluIGEgdGltZWQgY29tcG9uZW50LCBkb24ndCByZW5kZXIgaXQgaGVyZVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuZWRMaXN0W3RoaXMuaWRdID0gQUNGYWN0b3J5LmNyZWF0ZUFjdGl2ZUNvZGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZChcInRleHRhcmVhXCIpLmRhdGEoXCJsYW5nXCIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciByZW5kZXJpbmcgQWN0aXZlY29kZSBQcm9ibGVtICR7dGhpcy5pZH1cbiAgICAgICAgICAgICAgICBEZXRhaWxzOiAke2Vycn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChsb2dnZWRvdXQpIHtcbiAgICAgICAgZm9yIChsZXQgayBpbiB3aW5kb3cuZWRMaXN0KSB7XG4gICAgICAgICAgICB3aW5kb3cuZWRMaXN0W2tdLmRpc2FibGVTYXZlTG9hZCgpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgayBpbiB3aW5kb3cuZWRMaXN0KSB7XG4gICAgICAgICAgICB3aW5kb3cuZWRMaXN0W2tdLmVuYWJsZVNhdmVMb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcbn1cblxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5LmFjdGl2ZWNvZGUgPSBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZUZyb21PcHRzO1xuXG4vLyBUaGlzIGlzIHRoZSBlYXNpZXN0IHdheSB0byBleHBvc2UgdGhpcyBvdXRzaWRlIHRoZSBtb2R1bGUuXG53aW5kb3cuQUNGYWN0b3J5ID0gQUNGYWN0b3J5O1xuXG4vLyBUaGlzIHNlZW1zIGEgYml0IGhhY2t5IGFuZCBwb3NzaWJseSBicml0dGxlLCBidXQgaXRzIGhhcmQgdG8ga25vdyBob3cgbG9uZyBpdCB3aWxsIHRha2UgdG9cbi8vIGZpZ3VyZSBvdXQgdGhlIGxvZ2luL2xvZ291dCBzdGF0dXMgb2YgdGhlIHVzZXIuICBTb21ldGltZXMgaXRzIGltbWVkaWF0ZSwgYW5kIHNvbWV0aW1lcyBpdHNcbi8vIGxvbmcuICBTbyB0byBiZSBzYWZlIHdlJ2xsIGRvIGl0IGJvdGggd2F5cy4uXG52YXIgbG9nZ2Vkb3V0O1xuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dvdXRcIiwgZnVuY3Rpb24gKCkge1xuICAgIGxvZ2dlZG91dCA9IHRydWU7XG59KTtcbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9nb3V0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKGxldCBrIGluIHdpbmRvdy5lZExpc3QpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5lZExpc3QuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgIHdpbmRvdy5lZExpc3Rba10uZGlzYWJsZVNhdmVMb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsIiQuaTE4bigpLmxvYWQoe1xuICAgIGVuOiB7XG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfaGlzdG9yeTogXCJMb2FkIEhpc3RvcnlcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fdG91cjogXCJBdWRpbyBUb3VyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRlZF9jb2RlOiBcIkxvYWRlZCB5b3VyIHNhdmVkIGNvZGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vX3NhdmVkX2NvZGU6IFwiTm8gc2F2ZWQgY29kZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcnVuX2NvZGU6IFwiUnVuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfZmVlZGJhY2s6IFwiU2hvdyBGZWVkYmFja1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGU6IFwiU2hvdyBDb2RlXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZTogXCJIaWRlIENvZGVcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlbGVuczogXCJTaG93IENvZGVMZW5zXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnM6IFwiU2hvdyBpbiBDb2RlTGVuc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zOiBcIkhpZGUgQ29kZWxlbnNcIixcblxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXJzZV9lcnJvcjpcbiAgICAgICAgICAgIFwiQSBwYXJzZSBlcnJvciBtZWFucyB0aGF0IFB5dGhvbiBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSBzeW50YXggb24gdGhlIGxpbmUgdGhlIGVycm9yIG1lc3NhZ2UgcG9pbnRzIG91dC4gQ29tbW9uIGV4YW1wbGVzIGFyZSBmb3JnZXR0aW5nIGNvbW1hcyBiZXRld2VlbiBhcmd1bWVudHMgb3IgZm9yZ2V0dGluZyBhIDogb24gYSBmb3Igc3RhdGVtZW50XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhcnNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVG8gZml4IGEgcGFyc2UgZXJyb3IgeW91IGp1c3QgbmVlZCB0byBsb29rIGNhcmVmdWxseSBhdCB0aGUgbGluZSB3aXRoIHRoZSBlcnJvciBhbmQgcG9zc2libHkgdGhlIGxpbmUgYmVmb3JlIGl0LiAgTWFrZSBzdXJlIGl0IGNvbmZvcm1zIHRvIGFsbCBvZiBQeXRob24ncyBydWxlcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVHlwZSBlcnJvcnMgbW9zdCBvZnRlbiBvY2N1ciB3aGVuIGFuIGV4cHJlc3Npb24gdHJpZXMgdG8gY29tYmluZSB0d28gb2JqZWN0cyB3aXRoIHR5cGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBjb21iaW5lZC4gIExpa2UgcmFpc2luZyBhIHN0cmluZyB0byBhIHBvd2VyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUbyBmaXggYSB0eXBlIGVycm9yIHlvdSB3aWxsIG1vc3QgbGlrZWx5IG5lZWQgdG8gdHJhY2UgdGhyb3VnaCB5b3VyIGNvZGUgYW5kIG1ha2Ugc3VyZSB0aGUgdmFyaWFibGVzIGhhdmUgdGhlIHR5cGVzIHlvdSBleHBlY3QgdGhlbSB0byBoYXZlLiAgSXQgbWF5IGJlIGhlbHBmdWwgdG8gcHJpbnQgb3V0IGVhY2ggdmFyaWFibGUgYWxvbmcgdGhlIHdheSB0byBiZSBzdXJlIGl0cyB2YWx1ZSBpcyB3aGF0IHlvdSB0aGluayBpdCBzaG91bGQgYmUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3I6XG4gICAgICAgICAgICBcIkEgbmFtZSBlcnJvciBhbG1vc3QgYWx3YXlzIG1lYW5zIHRoYXQgeW91IGhhdmUgdXNlZCBhIHZhcmlhYmxlIGJlZm9yZSBpdCBoYXMgYSB2YWx1ZS4gIE9mdGVuIHRoaXMgbWF5IGJlIGEgc2ltcGxlIHR5cG8sIHNvIGNoZWNrIHRoZSBzcGVsbGluZyBjYXJlZnVsbHkuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVjayB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGFzc2lnbm1lbnQgc3RhdGVtZW50cyBhbmQgeW91ciBmdW5jdGlvbiBjYWxscywgdGhpcyBpcyB0aGUgbW9zdCBsaWtlbHkgcGxhY2UgZm9yIGEgTmFtZUVycm9yIHRvIGJlIGZvdW5kLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcjpcbiAgICAgICAgICAgIFwiQSBWYWx1ZUVycm9yIG1vc3Qgb2Z0ZW4gb2NjdXJzIHdoZW4geW91IHBhc3MgYSBwYXJhbWV0ZXIgdG8gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGlzIGV4cGVjdGluZyBvbmUgdHlwZSBhbmQgeW91IHBhc3MgYW5vdGhlci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUaGUgZXJyb3IgbWVzc2FnZSBnaXZlcyB5b3UgYSBwcmV0dHkgZ29vZCBoaW50IGFib3V0IHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBhcyB3ZWxsIGFzIHRoZSB2YWx1ZSB0aGF0IGlzIGluY29ycmVjdC4gTG9vayBhdCB0aGUgZXJyb3IgbWVzc2FnZSBjbG9zZWx5IGFuZCB0aGVuIHRyYWNlIGJhY2sgdG8gdGhlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHByb2JsZW1hdGljIHZhbHVlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgZXJyb3IgbWVzc2FnZSBpcyB0ZWxsaW5nIHlvdSB0aGF0IHRoZSBvYmplY3Qgb24gdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBkb3QsIGRvZXMgbm90IGhhdmUgdGhlIGF0dHJpYnV0ZSBvciBtZXRob2Qgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVGhlIG1vc3QgY29tbW9uIHZhcmlhbnQgb2YgdGhpcyBtZXNzYWdlIGlzIHRoYXQgdGhlIG9iamVjdCB1bmRlZmluZWQgZG9lcyBub3QgaGF2ZSBhdHRyaWJ1dGUgWC4gIFRoaXMgdGVsbHMgeW91IHRoYXQgdGhlIG9iamVjdCBvbiB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIGRvdCBpcyBub3Qgd2hhdCB5b3UgdGhpbmsuIFRyYWNlIHRoZSB2YXJpYWJsZSBiYWNrIGFuZCBwcmludCBpdCBvdXQgaW4gdmFyaW91cyBwbGFjZXMgdW50aWwgeW91IGRpc2NvdmVyIHdoZXJlIGl0IGJlY29tZXMgdW5kZWZpbmVkLiAgT3RoZXJ3aXNlIGNoZWNrIHRoZSBhdHRyaWJ1dGUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgZG90IGZvciBhIHR5cG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yOlxuICAgICAgICAgICAgXCJNb3N0IG9mIHRoZSB0aW1lIHRoaXMgZXJyb3IgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUgZm9yZ290dGVuIGEgcmlnaHQgcGFyZW50aGVzaXMgb3IgaGF2ZSBmb3Jnb3R0ZW4gdG8gY2xvc2UgYSBwYWlyIG9mIHF1b3Rlcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdG9rZW5fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVjayBlYWNoIGxpbmUgb2YgeW91ciBwcm9ncmFtIGFuZCBtYWtlIHN1cmUgdGhhdCB5b3VyIHBhcmVudGhlc2lzIGFyZSBiYWxhbmNlZC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcjpcbiAgICAgICAgICAgIFwiWW91ciBwcm9ncmFtIGlzIHJ1bm5pbmcgdG9vIGxvbmcuICBNb3N0IHByb2dyYW1zIGluIHRoaXMgYm9vayBzaG91bGQgcnVuIGluIGxlc3MgdGhhbiAxMCBzZWNvbmRzIGVhc2lseS4gVGhpcyBwcm9iYWJseSBpbmRpY2F0ZXMgeW91ciBwcm9ncmFtIGlzIGluIGFuIGluZmluaXRlIGxvb3AuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJBZGQgc29tZSBwcmludCBzdGF0ZW1lbnRzIHRvIGZpZ3VyZSBvdXQgaWYgeW91ciBwcm9ncmFtIGlzIGluIGFuIGluZmludGUgbG9vcC4gIElmIGl0IGlzIG5vdCB5b3UgY2FuIGluY3JlYXNlIHRoZSBydW4gdGltZSB3aXRoIHN5cy5zZXRFeGVjdXRpb25MaW1pdChtc2VjcylcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvcjpcbiAgICAgICAgICAgIFwiWW91ciBwcm9ncmFtIGlzIHJ1bm5pbmcgZm9yIHRvbyBsb25nLiAgTW9zdCBwcm9ncmFtcyBpbiB0aGlzIGJvb2sgc2hvdWxkIHJ1biBpbiBsZXNzIHRoYW4gMzAgc2Vjb25kcyBlYXNpbHkuIFRoaXMgcHJvYmFibHkgaW5kaWNhdGVzIHlvdXIgcHJvZ3JhbSBpcyBpbiBhbiBpbmZpbml0ZSBsb29wLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQWRkIHNvbWUgcHJpbnQgc3RhdGVtZW50cyB0byBmaWd1cmUgb3V0IGlmIHlvdXIgcHJvZ3JhbSBpcyBpbiBhbiBpbmZpbnRlIGxvb3AuICBJZiBpdCBpcyBub3QgeW91IGNhbiBpbmNyZWFzZSB0aGUgcnVuIHRpbWUgd2l0aCBzeXMuc2V0RXhlY3V0aW9uTGltaXQobXNlY3MpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBtZXNzYWdlIGluZGljYXRlcyB0aGF0IFB5dGhvbiBjYW4ndCBmaWd1cmUgb3V0IHRoZSBzeW50YXggb2YgYSBwYXJ0aWN1bGFyIHN0YXRlbWVudC4gIFNvbWUgZXhhbXBsZXMgYXJlIGFzc2lnbmluZyB0byBhIGxpdGVyYWwsIG9yIGEgZnVuY3Rpb24gY2FsbFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVjayB5b3VyIGFzc2lnbm1lbnQgc3RhdGVtZW50cyBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBhc3NpZ25tZW50IGlzIGEgdmFyaWFibGUsIG5vdCBhIGxpdGVyYWwgb3IgYSBmdW5jdGlvbi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIG1lc3NhZ2UgaW5kaWNhdGVzIHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gYWNjZXNzIGFuIGVsZW1lbnQgb2YgYSBkaWN0aW9uYXJ5LCBidXQgdGhlIGRpY3Rpb25hcnkgZG9lcyBub3QgaGF2ZSB0aGF0IHRoZSBrZXkgeW91IGFyZSB1c2luZy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiWW91IG1heSBoYXZlIGEgdHlwbyBpbiB0aGUgbmFtZSBvZiB5b3VyIGtleS4gIEl0IGlzIGFsc28gZ29vZCBwcmFjdGljZSB0byBjaGVjayBpZiB0aGUga2V5IGV4aXN0cyB1c2luZyBhIHN0YXRlbWVudCBsaWtlIGlmIGtleSBpbiBteWRpY3QuICBZb3UgY2FuIGFsc28gdXNlIG15ZGljdC5nZXQoa2V5LGRlZmF1bHR2YWx1ZSkgc28gdGhhdCBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeSB5b3UgZ2V0IHRoZSBkZWZhdWx0IHZhbHVlIGluc3RlYWQgb2YgYW4gZXJyb3IuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIG1lc3NhZ2UgbWVhbnMgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBpbmRleCBwYXN0IHRoZSBlbmQgb2YgYSBzdHJpbmcgb3IgYSBsaXN0LiAgRm9yIGV4YW1wbGUgaWYgeW91ciBsaXN0IGhhcyAzIHRoaW5ncyBpbiBpdCBhbmQgeW91IHRyeSB0byBhY2Nlc3MgdGhlIGl0ZW0gYXQgcG9zaXRpb24gMyBvciBtb3JlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlJlbWVtYmVyIHRoYXQgdGhlIGZpcnN0IGl0ZW0gaW4gYSBsaXN0IG9yIHN0cmluZyBpcyBhdCBpbmRleCBwb3NpdGlvbiAwLCBxdWl0ZSBvZnRlbiB0aGlzIG1lc3NhZ2UgY29tZXMgYWJvdXQgYmVjYXVzZSB5b3UgYXJlIG9mZiBieSBvbmUuICBSZW1lbWJlciBpbiBhIGxpc3Qgb2YgbGVuZ3RoIDMgdGhlIGxhc3QgbGVnYWwgaW5kZXggaXMgMlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV91cmlfZXJyb3I6IFwiXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcl9maXg6IFwiXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBlcnJvciBtZXNzYWdlIGluZGljYXRlcyB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGltcG9ydCBhIG1vZHVsZSB0aGF0IGRvZXMgbm90IGV4aXN0XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIk9uZSBwcm9ibGVtIG1heSBzaW1wbHkgYmUgdGhhdCB5b3UgaGF2ZSBhIHR5cG8uICBJdCBtYXkgYWxzbyBiZSB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGltcG9ydCBhIG1vZHVsZSB0aGF0IGV4aXN0cyBpbiAncmVhbCcgUHl0aG9uLCBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBib29rLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgcGxlYXNlIHN1Ym1pdCBhIGZlYXR1cmUgcmVxdWVzdCB0byBoYXZlIHRoZSBtb2R1bGUgYWRkZWQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBpcyBtb3N0IGxpa2VseSBhbiBpbnRlcm5hbCBlcnJvciwgcGFydGljdWxhcmx5IGlmIHRoZSBtZXNzYWdlIHJlZmVyZW5jZXMgdGhlIGNvbnNvbGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRyeSByZWZyZXNoaW5nIHRoZSB3ZWJwYWdlLCBhbmQgaWYgdGhlIGVycm9yIGNvbnRpbnVlcywgc3VibWl0IGEgYnVnIHJlcG9ydCBhbG9uZyB3aXRoIHlvdXIgY29kZVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIHRlbGxzIHlvdSB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGRpdmlkZSBieSAwLiBUeXBpY2FsbHkgdGhpcyBpcyBiZWNhdXNlIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgaW4gdGhlIGRlbm9taW5hdG9yIG9mIGEgZGl2aXNpb24gZXhwcmVzc2lvbiBoYXMgdGhlIHZhbHVlIDBcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIllvdSBtYXkgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QgZGl2aWRpbmcgYnkgMCB3aXRoIGFuIGlmIHN0YXRtZW50LCBvciB5b3UgbWF5IG5lZWQgdG8gcmV4YW1pbmUgeW91ciBhc3N1bXB0aW9ucyBhYm91dCB0aGUgbGVnYWwgdmFsdWVzIG9mIHZhcmlhYmxlcywgaXQgY291bGQgYmUgYW4gZWFybGllciBzdGF0bWVudCB0aGF0IGlzIHVuZXhwZWN0ZWRseSBhc3NpZ25pbmcgYSB2YWx1ZSBvZiB6ZXJvIHRvIHRoZSB2YXJpYWJsZSBpbiBxdWVzdGlvbi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgbWVzc2FnZSBhbG1vc3QgYWx3YXlzIHNob3dzIHVwIGluIHRoZSBmb3JtIG9mIE1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRoaXMgYWx3YXlzIG9jY3VycyB3aGVuIGEgZnVuY3Rpb24gY2FsbHMgaXRzZWxmLiAgSXRzIHByZXR0eSBsaWtlbHkgdGhhdCB5b3UgYXJlIG5vdCBkb2luZyB0aGlzIG9uIHB1cnBvc2UuIEV4Y2VwdCBpbiB0aGUgY2hhcHRlciBvbiByZWN1cnNpb24uICBJZiB5b3UgYXJlIGluIHRoYXQgY2hhcHRlciB0aGVuIGl0cyBsaWtlbHkgeW91IGhhdmVuJ3QgaWRlbnRpZmllZCBhIGdvb2QgYmFzZSBjYXNlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcjpcbiAgICAgICAgICAgIFwiQW4gSW50ZXJuYWwgZXJyb3IgbWF5IG1lYW4gdGhhdCB5b3UndmUgdHJpZ2dlcmVkIGEgYnVnIGluIG91ciBQeXRob25cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJSZXBvcnQgdGhpcyBlcnJvciwgYWxvbmcgd2l0aCB5b3VyIGNvZGUgYXMgYSBidWcuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIGVycm9yIG9jY3VycyB3aGVuIHlvdSBoYXZlIG5vdCBpbmRlbnRlZCB5b3VyIGNvZGUgcHJvcGVybHkuICBUaGlzIGlzIG1vc3QgbGlrZWx5IHRvIGhhcHBlbiBhcyBwYXJ0IG9mIGFuIGlmLCBmb3IsIHdoaWxlIG9yIGRlZiBzdGF0ZW1lbnQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgeW91ciBpZiwgZGVmLCBmb3IsIGFuZCB3aGlsZSBzdGF0ZW1lbnRzIHRvIGJlIHN1cmUgdGhlIGxpbmVzIGFyZSBwcm9wZXJseSBpbmRlbnRlZCBiZW5lYXRoIHRoZW0uICBBbm90aGVyIHNvdXJjZSBvZiB0aGlzIGVycm9yIGNvbWVzIGZyb20gY29weWluZyBhbmQgcGFzdGluZyBjb2RlIHdoZXJlIHlvdSBoYXZlIGFjY2lkZW50YWxseSBsZWZ0IHNvbWUgYml0cyBvZiBjb2RlIGx5aW5nIGFyb3VuZCB0aGF0IGRvbid0IGJlbG9uZyB0aGVyZSBhbnltb3JlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgZXJyb3Igb2NjdXJzIHdoZW4geW91IHRyeSB0byB1c2UgYSBidWlsdGluIGZ1bmN0aW9uIG9mIFB5dGhvbiB0aGF0IGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCBpbiB0aGlzIGluLWJyb3dzZXIgdmVyc2lvbiBvZiBQeXRob24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkZvciBub3cgdGhlIG9ubHkgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIG5vdCB1c2UgdGhlIGZ1bmN0aW9uLiAgVGhlcmUgbWF5IGJlIHdvcmthcm91bmRzLiAgSWYgeW91IHJlYWxseSBuZWVkIHRoaXMgYnVpbHRpbiBmdW5jdGlvbiB0aGVuIGZpbGUgYSBidWcgcmVwb3J0IGFuZCB0ZWxsIHVzIGhvdyB5b3UgYXJlIHRyeWluZyB0byB1c2UgdGhlIGZ1bmN0aW9uLlwiLFxuXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ZpbGVfbm90X2ZvdW5kOiBcIkZpbGUgbm90IGZvdW5kOiAnJDEnXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vX2ZpbGVfb3JfZGlyOlxuICAgICAgICAgICAgXCJbRXJybm8gMl0gTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeTogJyQxJ1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zdGFydGluZzogXCJDbGljayB0aGUgcGxheSBidXR0b24gdG8gYmVnaW4gdGhlICQxXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BsYXlpbmc6IFwiUGxheWluZyB0aGUgJDFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGluZ19hdWRpbzpcbiAgICAgICAgICAgIFwiTG9hZGluZyBhdWRpby4gIFBsZWFzZSB3YWl0LiAgIElmIHRoZSB0b3VyIGRvZXNuJ3Qgc3RhcnQgc29vbiBjbGljayBvbiB0aGUgbGVmdG1vc3QgY29udHJvbCBidXR0b24gKFBsYXkgZmlyc3QgYXVkaW8gaW4gdG91cilcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGF1c2VfY3VycmVudF9hdWRpbzogXCJQYXVzZSBjdXJyZW50IGF1ZGlvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhdXNlX2F1ZGlvOiBcIlBhdXNlIGF1ZGlvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvOiBcIlBsYXkgcGF1c2VkIGF1ZGlvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F1ZGlvX3BhdXNlZDpcbiAgICAgICAgICAgIFwiVGhlICQxIGhhcyBiZWVuIHBhdXNlZC4gQ2xpY2sgb24gdGhlIHBsYXkgYnV0dG9uIHRvIHJlc3VtZSB0aGUgdG91ci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5wdXRfcHJnOiBcIklucHV0IGZvciBQcm9ncmFtXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3dlcmVfY29tcGlsaW5nX2VycjpcbiAgICAgICAgICAgIFwiVGhlcmUgd2VyZSBlcnJvcnMgY29tcGlsaW5nIHlvdXIgY29kZS4gU2VlIGJlbG93LlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2V4YzogXCJUaW1lIExpbWl0IEV4Y2VlZGVkIG9uIHlvdXIgcHJvZ3JhbVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfZXJyOiBcIkEgc2VydmVyIGVycm9yIG9jY3VycmVkOiAkMSAkMlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9jb21waWxpbmdfcnVubmluZzpcbiAgICAgICAgICAgIFwiQ29tcGlsaW5nIGFuZCBSdW5uaW5nIHlvdXIgQ29kZSBOb3cuLi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2VydmVyX2NvbW1fZXJyOiBcIkVycm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgc2VydmVyLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zYXZlX3J1bjogXCJTYXZlICYgUnVuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlbmRlcjogXCJTYXZlICYgUmVuZGVyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiQW4gYXNzZXJ0aW9uIGVycm9yIGhhcHBlbnMgd2hlbiBweXRob24gZW5jb3VudGVycyBhbiBhc3NlcnRpb24gc3RhdGVtZW50LiAgUHl0aG9uIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiB0byB0aGUgcmlnaHQgb2YgdGhlIHdvcmQgYXNzZXJ0OyBpZiB0aGF0IGV4cHJlc3Npb24gaXMgVHJ1ZSBldmVyeXRoaW5nIGlzIGZpbmUgYW5kIHRoZSBwcm9ncmFtIGNvbnRpbnVlcy4gIElmIHRoZSBleHByZXNzaW9uIGlzIEZhbHNlIFB5dGhvbiByYWlzZXMgYW4gZXJyb3IgYW5kIHN0b3BzLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVjayB0aGUgZXhwcmVzc2lvbiB0byB0aGUgcmlnaHQgb2YgYXNzZXJ0LiAgVGhlIGV4cHJlc3Npb24gaXMgRmFsc2UgYW5kIHlvdSB3aWxsIG5lZWQgdG8gZGV0ZXJtaW5lIHdoeSB0aGF0IGlzLiAgWW91IG1heSB3YW50IHRvIHNpbXBseSBwcmludCBvdXQgdGhlIGluZGl2aWR1YWwgcGFydHMgb2YgdGhlIGV4cHJlc3Npb24gdG8gdW5kZXJzdGFuZCB3aHkgaXQgaXMgZXZhbHVhdGluZyB0byBGYWxzZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZF9kYjogXCJMb2FkaW5nIERCLi4uXCIsXG4gICAgfSxcbn0pO1xuIiwiJC5pMThuKCkubG9hZCh7XG4gICAgXCJwdC1iclwiOiB7XG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfaGlzdG9yeTogXCJDYXJyZWdhciBoaXN0w7NyaWNvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F1ZGlvX3RvdXI6IFwiVG91ciBkZSDDoXVkaW9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGVkX2NvZGU6IFwiQ8OzZGlnbyBzYWx2byBjYXJyZWdhZG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vX3NhdmVkX2NvZGU6IFwiTsOjbyBow6EgY8OzZGlnbyBzYWx2by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcnVuX2NvZGU6IFwiRXhlY3V0YXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19mZWVkYmFjazogXCJFeGliaXIgRmVlZGJhY2tzXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZTogXCJNb3N0cmFyIEPDs2RpZ29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlOiBcIk9jdWx0YXIgQ8OzZGlnb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVsZW5zOiBcIk1vc3RyYXIgQ29kZUxlbnNcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuczogXCJNb3N0cmFyIGVtIENvZGVMZW5zXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZWxlbnM6IFwiT2N1bHRhciBDb2RlbGVuc1wiLFxuXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhcnNlX2Vycm9yOlxuICAgICAgICAgICAgXCJVbSBlcnJvIGRlIFBhcnNlIHNpZ25pZmljYSBxdWUgUHl0aG9uIG7Do28gZW50ZW5kZSBhIHNpbnRheGUgZGEgbGluaGEgcXVlIGEgbWVuc2FnZW0gZGUgZXJybyBhcG9udGEuIEV4ZW1wbG9zIGNvbXVucyBzw6NvIGVzcXVlY2VyIHbDrXJndWxhcyBlbnRyZSBhcmd1bWVudG9zIG91IGVzcXVlY2VyICc6JyBlbSB1bSBjb21hbmRvIGZvci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGFyc2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJQYXJhIGNvcnJpZ2lyIHVtIGVycm8gZGUgUGFyc2UsIHZvY8OqIHPDsyBwcmVjaXNhIG9saGFyIGN1aWRhZG9zYW1lbnRlIGEgbGluaGEgY29tIG8gZXJybyBlIHBvc3NpdmVsbWVudGUgYSBsaW5oYSBhbnRlcyBkZWxhLiBUZW5oYSBjZXJ0ZXphIHF1ZSBlc3TDo28gZGUgYWNvcmRvIGNvbSB0b2RhcyBhcyByZWdyYXMgZGUgUHl0aG9uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yOlxuICAgICAgICAgICAgXCJFcnJvcyBkZSB0aXBhZ2VtIG9jb3JyZW0gbWFpcyBmcmVxdWVudGVtZW50ZSBxdWFuZG8gdW1hIGV4cHJlc3PDo28gdGVudGEgY29tYmluYXIgZG9pcyBvYmpldG9zIGNvbSB0aXBvcyBxdWUgbsOjbyBkZXZlcmlhbSBzZXIgY29tYmluYWRvcy4gQ29tbyBlbGV2YXIgdW1hIFN0cmluZyBhIHVtYSBwb3TDqm5jaWEuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJQYXJhIGNvcnJpZ2lyIHVtIGVycm8gZGUgdGlwYWdlbSB2b2PDqiBwcm92YXZlbG1lbnRlIHByZWNpc2Fyw6EgcGVyY29ycmVyIHNldSBjw7NkaWdvIGUgdGVyIGNlcnRlemEgZGUgcXVlIGFzIHZhcmnDoXZlaXMgcG9zc3VlbSBvcyB0aXBvcyBxdWUgdm9jw6ogZXNwZXJhIHF1ZSBlbGFzIHRlbmhhbS4gUG9kZSBzZXIgw7p0aWwgaW1wcmltaXIgY2FkYSB2YXJpw6F2ZWwgYW8gbG9uZ28gZG8gY2FtaW5obyBwYXJhIGNoZWNhciBzZSBlbGFzIHBvc3N1ZW0gbyB2YWxvciBxdWUgdm9jw6ogYWNoYSBxdWUgZGV2ZXJpYW0gdGVyLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yOlxuICAgICAgICAgICAgXCJVbSBlcnJvIGRlIG5vbWUgcXVhc2Ugc2VtcHJlIHNpZ25pZmljYSBxdWUgdm9jw6ogdXNvdSB1bWEgdmFyacOhdmVsIGFudGVzIGRlbGEgdGVyIHVtIHZhbG9yLiBGcmVxdWVudGVtZW50ZSBpc3NvIHBvZGUgc2VyIHVtIGVycm8gZGUgZGlnaXRhw6fDo28sIGVudMOjbyBjaGVxdWUgYSBvcnRvZ3JhZmlhIGN1aWRhZG9zYW1lbnRlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlcXVlIG8gbGFkbyBkaXJlaXRvIGRhcyBhdHJpYnVpw6fDtWVzIGUgc3VhcyBjaGFtYWRhcyBkZSBmdW7Dp8O1ZXMsIHPDo28gb3MgbHVnYXJlcyBtYWlzIHByb3bDoXZlaXMgZGUgZW5jb250cmFyIHVtIGVycm8gZGUgbm9tZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3I6XG4gICAgICAgICAgICBcIlVtIGVycm8gZGUgdmFsb3Igb2NvcnJlIG1haXMgZnJlcXVlbnRlbWVudGUgcXVhbmRvIHVtYSBmdW7Dp8OjbyBlc3TDoSBlc3BlcmFuZG8gdW0gdGlwbyBtYXMgdm9jw6ogcGFzc2EgdW0gcGFyw6JtZXRybyBkZSBvdXRybyB0aXBvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkEgbWVuc2FnZW0gZGUgZXJybyB0ZSBkw6EgdW1hIGJvYSBkaWNhIHNvYnJlIG8gbm9tZSBkYSBmdW7Dp8OjbyBlIG8gdmFsb3IgaW5jb3JyZXRvLiBMZWlhIGF0ZW50YW1lbnRlIGEgbWVuc2FnZW0gZGUgZXJybyBlIHZvbHRlIMOgIHZhcmnDoXZlbCBxdWUgY29udMOpbSBvIHZhbG9yIHByb2JsZW3DoXRpY28uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcjpcbiAgICAgICAgICAgIFwiRXNzYSBtZW5zYWdlbSBkZSBlcnJvIGVzdMOhIHRlIGRpemVuZG8gcXVlIG8gb2JqZXRvIGRvIGxhZG8gZXNxdWVyZG8gZG8gcG9udG8gbsOjbyB0ZW0gbyBhdHJpYnV0byBvdSBtw6l0b2RvIGRvIHNldSBsYWRvIGRpcmVpdG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkEgdmFyaWFudGUgbWFpcyBjb211bSBkZXNzYSBtZW5zYWdlbSDDqSBxdWUgbyBvYmpldG8gaW5kZWZpbmlkbyBuw6NvIHRlbSBvIGF0cmlidXRvIFguIElzc28gZGl6IHF1ZSBvIG9iamV0byBkbyBsYWRvIGVzcXVlcmRvIGRvIHBvbnRvIG7Do28gw6kgbyBxdWUgdm9jw6ogcGVuc2EuIFJhc3RyZWllIGVzc2EgdmFyacOhdmVsIGUgaW1wcmltYS1hIGVtIHbDoXJpb3MgbHVnYXJlcyBhdMOpIGRlc2NvYnJpciBvbmRlIGVsYSBzZSB0b3JuYSBpbmRlZmluaWRhLiBDYXNvIGNvbnRyw6FyaW8sIGNoZXF1ZSBzZSBow6EgZXJybyBkZSBkaWdpdGHDp8OjbyBubyBhdHJpYnV0byBkbyBsYWRvIGRpcmVpdG8gZG8gcG9udG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yOlxuICAgICAgICAgICAgXCJOYSBtYWlvcmlhIGRhcyB2ZXplcyBlc3RlIGVycm8gaW5kaWNhIHF1ZSB2b2PDqiBlc3F1ZWNldSBkZSBmZWNoYXIgdW0gcGFyw6pudGVzZXMgb3UgYXNwYXMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlcXVlIGNhZGEgbGluaGEgZG8gc2V1IHByb2dyYW1hIGUgY2VydGlmaXF1ZS1zZSBkZSBxdWUgdG9kb3Mgb3MgcGFyw6pudGVzZXMgZXN0w6NvIGZlY2hhZG9zLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yOlxuICAgICAgICAgICAgXCJTZXUgcHJvZ3JhbWEgZXN0w6EgZGVtb3JhbmRvIG11aXRvLiBPcyBwcm9ncmFtYXMgZGVzdGUgbGl2cm8gZGV2ZXJpYW0gcm9kYXIgZW0gbWVub3MgZGUgMTAgc2VndW5kb3MuIElzc28gcHJvdmF2ZWxtZW50ZSBpbmRpY2EgcXVlIHNldSBwcm9ncmFtYSBlc3TDoSBlbSB1bSBsb29wIGluZmluaXRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiSW1wcmltYSBtZW5zYWdlbnMgZW0gYWxndW1hcyBsaW5oYXMgcGFyYSBkZXNjb2JyaXIgc2Ugc2V1IHByb2dyYW1hIGVzdMOhIGVtIHVtIGxvb3AgaW5maW5pdG8uIENhc28gbsOjbyBlc3RlamEsIHZvY8OqIHBvZGUgYXVtZW50YXIgbyB0ZW1wbyBsaW1pdGUgZGUgZXhlY3XDp8OjbyBjb20gbyBjb21hbmRvIHN5cy5zZXRFeGVjdXRpb25MaW1pdChtcylcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvcjpcbiAgICAgICAgICAgIFwiU2V1IHByb2dyYW1hIGVzdMOhIGRlbW9yYW5kbyBtdWl0by4gT3MgcHJvZ3JhbWFzIGRlc3RlIGxpdnJvIGRldmVyaWFtIHJvZGFyIGVtIG1lbm9zIGRlIDMwIHNlZ3VuZG9zLiBJc3NvIHByb3ZhdmVsbWVudGUgaW5kaWNhIHF1ZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkltcHJpbWEgbWVuc2FnZW5zIGVtIGFsZ3VtYXMgbGluaGFzIHBhcmEgZGVzY29icmlyIHNlIHNldSBwcm9ncmFtYSBlc3TDoSBlbSB1bSBsb29wIGluZmluaXRvLiBDYXNvIG7Do28gZXN0ZWphLCB2b2PDqiBwb2RlIGF1bWVudGFyIG8gdGVtcG8gbGltaXRlIGRlIGV4ZWN1w6fDo28gY29tIG8gY29tYW5kbyBzeXMuc2V0RXhlY3V0aW9uTGltaXQobXMpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0YSBtZW5zYWdlbSBpbmRpY2EgcXVlIFB5dGhvbiBuw6NvIGVudGVuZGV1IGEgc2ludGF4ZSBkZSB1bSBjb21hbmRvLiBBbGd1bnMgZXhlbXBsb3Mgc8OjbyBhdHJpYnVpw6fDo28gZGUgdW0gbGl0ZXJhbCwgb3UgdW1hIGNoYW1hZGEgZGUgZnVuw6fDo29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlcXVlIGFzIGF0cmlidWnDp8O1ZXMgZGUgc2V1IHByb2dyYW1hIGUgY2VydGlmaXF1ZS1zZSBkZSBxdWUgbyBsYWRvIGVzcXVlcmRvIMOpIHVtYSB2YXJpw6F2ZWwsIGUgbsOjbyB1bSBsaXRlcmFsIG91IGZ1bsOnw6NvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGEgbWVuc2FnZW0gaW5kaWNhIHF1ZSB2b2PDqiBlc3TDoSB0ZW50YW5kbyBhY2Vzc2FyIHVtIGVsZW1lbnRvIGN1amEgY2hhdmUgbsOjbyBleGlzdGUgbm8gZGljaW9uw6FyaW8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlZvY8OqIHBvZGUgdGVyIHVtIGVycm8gZGUgZGlnaXRhw6fDo28gbm8gbm9tZSBkYSBzdWEgY2hhdmUuIMOJIHVtYSBib2EgcHLDoXRpY2EgY2hlY2FyIHNlIGEgY2hhdmUgZXhpc3RlIHVzYW5kbyB1bSBjb21hbmRvICdpZiAoY2hhdmUpIGluIG1ldV9kaWNpb25hcmlvJy4gVm9jw6ogdGFtYsOpbSBwb2RlIHVzYXIgbyBjb21hbmRvICdtZXVfZGljaW9uYXJpby5nZXQoY2hhdmUsIHZhbG9yUGFkcsOjbyknIHBhcmEgb2J0ZXIgbyB2YWxvciBwYWRyw6NvIGFvIGludsOpcyBkZSB1bSBlcnJvIGNhc28gYSBjaGF2ZSBuw6NvIGV4aXN0YS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3I6XG4gICAgICAgICAgICBcIlZvY8OqIGVzdMOhIHRlbnRhbmRvIGFjZXNzYXIgdW0gw61uZGljZSBhbMOpbSBkbyBmaW5hbCBkZSB1bWEgc3RyaW5nIG91IGxpc3RhLiBQb3IgZXhlbXBsbywgc2Ugc3VhIGxpc3RhIHBvc3N1aSAzIGVsZW1lbnRvcyBuZWxhIGUgdm9jw6ogdGVudGEgYWNlc3NhciBvIGl0ZW0gbmEgcG9zacOnw6NvIDMgb3UgbWFpcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJMZW1icmUtc2UgcXVlIG8gcHJpbWVpcm8gZWxlbWVudG8gZGUgdW1hIGxpc3RhIG91IHN0cmluZyBlc3TDoSBubyDDrW5kaWNlIDAsIG5vcm1hbG1lbnRlIGVzdGEgbWVuc2FnZW0gw6kgZXhpYmlkYSBwb3JxdWUgdm9jw6ogZXJyb3UgbyDDrW5kaWNlIHBvciAxLiBFbSB1bWEgbGlzdGEgZGUgdGFtYW5obyAzLCBvIMO6bHRpbW8gw61uZGljZSB2w6FsaWRvIMOpIDJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yOiBcIlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV91cmlfZXJyb3JfZml4OiBcIlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGEgbWVuc2FnZW0gaW5kaWNhIHF1ZSB2b2PDqiBlc3TDoSB0ZW50YW5kbyBpbXBvcnRhciB1bSBtw7NkdWxvIHF1ZSBuw6NvIGV4aXN0ZVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJVbSBwcm9ibGVtYSBwb2RlIHNlciBhcGVuYXMgdW0gZXJybyBkZSBkaWdpdGHDp8Ojby4gVGFtYsOpbSBwb2RlIHNlciBxdWUgdm9jw6ogZXN0w6EgdGVudGFuZG8gaW1wb3J0YXIgdW0gbcOzZHVsbyBxdWUgZXhpc3RlIGVtIFB5dGhvbiAncmVhbCcsIG1hcyBuw6NvIGV4aXN0ZSBuZXN0ZSBsaXZyby4gU2UgZXN0ZSDDqSBvIGNhc28sIHBvciBmYXZvciBlbnZpZSB1bSBwZWRpZG8gcGFyYSB0ZXIgZXNzZSBtw7NkdWxvIGFkaWNpb25hZG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvcjpcbiAgICAgICAgICAgIFwiSXNzbyBwYXJlY2Ugc2VyIHVtIGVycm8gaW50ZXJubywgZXNwZWNpYWxtZW50ZSBzZSBhIG1lbnNhZ2VtIGZheiByZWZlcsOqbmNpYSBhbyBjb25zb2xlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUZW50ZSBhdHVhbGl6YXIgYSBww6FnaW5hLiBTZSBvIGVycm8gcGVyc2lzdGlyLCBlbnZpZSB1bSByZWxhdMOzcmlvIGRlIGJ1ZyBqdW50byBjb20gc2V1IGPDs2RpZ29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiSXNzbyBkaXogcXVlIHZvY8OqIGVzdMOhIHRlbnRhbmRvIGRpdmlkaXIgcG9yIDAuIE5vcm1hbG1lbnRlIMOpIHBvcnF1ZSBvIHZhbG9yIGRhIHZhcmnDoXZlbCBubyBkZW5vbWluYWRvciBkZSB1bWEgZGl2aXPDo28gdGVtIG8gdmFsb3IgMFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVm9jw6ogcG9kZSBwcm90ZWdlciBjb250cmEgZGl2aWRpciBwb3IgMCBjb20gdW0gY29tYW5kbyAnaWYnLCBvdSB2b2PDqiBwb2RlIHByZWNpc2FyIHJlYXZhbGlhciBzdWFzIHN1cG9zacOnw7VlcyBzb2JyZSBvcyB2YWxvcmVzIGRhcyB2YXJpw6F2ZWlzLCBwb2lzIHVtIGNvbWFuZG8gYW50ZXJpb3IgcG9kZSB0ZXIgaW5lc3BlcmFkYW1lbnRlIGF0cmlidcOtZG8gbyB2YWxvciAwIGEgZXNzYSB2YXJpw6F2ZWwuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIHF1YXNlIHNlbXByZSBhcGFyZWNlIG5hIGZvcm1hIGRlICdUYW1hbmhvIG3DoXhpbW8gZGEgcGlsaGEgZGUgY2hhbWFkYXMgZXhjZWRpZG8nLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIklzc28gc2VtcHJlIG9jb3JyZSBxdWFuZG8gdW1hIGZ1bsOnw6NvIGNoYW1hIGVsYSBtZXNtYS4gUHJvdmF2ZWxtZW50ZSB2b2PDqiBuw6NvIGVzdMOhIGZhemVuZG8gaXNzbyBkZSBwcm9ww7NzaXRvLCBleGNldG8gbm8gY2Fww610dWxvIHNvYnJlIHJlY3Vyc8Ojby4gU2Ugdm9jw6ogZXN0w6EgbmVzc2UgY2Fww610dWxvLCBlbnTDo28gcHJvdmF2ZWxtZW50ZSBhaW5kYSBuw6NvIGlkZW50aWZpY291IHVtIGJvbSBjYXNvIGJhc2UuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yOlxuICAgICAgICAgICAgXCJVbSBlcnJvIGludGVybm8gcG9kZSBzaWduaWZpY2FyIHF1ZSB2b2PDqiBkZXNlbmNhZGVvdSB1bSBidWcgbm8gbm9zc28gUHl0aG9uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUmVwb3J0ZSBlc3RlIGVycm8gY29tbyB1bSBidWcsIGp1bnRhbWVudGUgY29tIHNldSBjw7NkaWdvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RlIGVycm8gb2NvcnJlIHF1YW5kbyB2b2PDqiBuw6NvIGluZGVudG91IHNldSBjw7NkaWdvIGRldmlkYW1lbnRlLiBJc3NvIMOpIG1haXMgcHJvdsOhdmVsIGRlIG9jb3JyZXIgY29tbyBwYXJ0ZSBkZSB1bSBjb21hbmRvIGlmLCBmb3IsIHdoaWxlIG91IGRlZi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVxdWUgc2V1cyBjb21hbmRvcyBpZiwgZGVmLCBmb3IgZSB3aGlsZSBwYXJhIHRlciBjZXJ0ZXphIGRlIHF1ZSBhcyBsaW5oYXMgZXN0w6NvIGRldmlkYW1lbnRlIGluZGVudGFkYXMgYWJhaXhvIGRlbGFzLiBPdXRyYSBmb250ZSBkZXN0ZSBlcnJvIMOpIGNvcGlhciBlIGNvbGFyIGPDs2RpZ28gZW0gcXVlIHZvY8OqIGFjaWRlbnRhbG1lbnRlIGRlaXhvdSByZXN0b3MgZGUgY8OzZGlnbyBxdWUgbsOjbyBwZXJ0ZW5jZW0gbWFpcyBhbGkuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0ZSBlcnJvIG9jb3JyZSBxdWFuZG8gdm9jw6ogdGVudGEgdXNhciB1bWEgZnVuw6fDo28gZW1idXRpZGEgZGUgUHl0aG9uIHF1ZSBuw6NvIGZvaSBpbXBsZW1lbnRhZGEgbmVzdGEgdmVyc8OjbyBicm93c2VyIGRlIFB5dGhvbi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUG9yIGVucXVhbnRvIGEgw7puaWNhIG1hbmVpcmEgZGUgY29uc2VydGFyIGlzc28gw6kgbsOjbyB1c2FuZG8gYSBmdW7Dp8Ojby4gUG9kZW0gaGF2ZXIgc29sdcOnw7VlcyBhbHRlcm5hdGl2YXMuIFNlIHZvY8OqIHJlYWxtZW50ZSBwcmVjaXNhIGRlc3RhIGZ1bsOnw6NvIGVtYnV0aWRhLCBlbnZpZS1ub3MgdW0gcmVsYXTDs3JpbyBkZSBidWcgZSBkaWdhYyBvbW8gZXN0w6EgdGVudGFuZG8gdXNhciBhIGZ1bsOnw6NvLlwiLFxuXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ZpbGVfbm90X2ZvdW5kOiBcIkFycXVpdm8gbsOjbyBlbmNvbnRyYWRvOiAnJDEnXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vX2ZpbGVfb3JfZGlyOlxuICAgICAgICAgICAgXCJbRXJybyBuwrogMl0gQXJxdWl2byBvdSBkaXJldMOzcmlvIGluZXhpc3RlbnRlOiAnJDEnXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N0YXJ0aW5nOiBcIkNsaXF1ZSBubyBib3TDo28gZGUgZXhlY3XDp8OjbyBwYXJhIGNvbWXDp2FyICQxXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BsYXlpbmc6IFwiRXhlY3V0YW5kbyAkMVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkaW5nX2F1ZGlvOlxuICAgICAgICAgICAgXCJDYXJyZWdhbmRvIMOhdWRpby4gUG9yIGZhdm9yLCBlc3BlcmUuIFNlIG8gdG91ciBuw6NvIGNvbWXDp2FyIGxvZ28sIGNsaXF1ZSBlbSAnU3RvcCBUb3VyJyBlIHRlbnRlIG5vdmFtZW50ZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGF1c2VfY3VycmVudF9hdWRpbzogXCJQYXVzYXIgw6F1ZGlvIGF0dWFsXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhdXNlX2F1ZGlvOiBcIlBhdXNhciDDoXVkaW9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGxheV9wYXVzZWRfYXVkaW86IFwiUmVwcm9kdXppciDDoXVkaW8gcGF1c2Fkb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb19wYXVzZWQ6XG4gICAgICAgICAgICBcIiQxIGZvaSBwYXVzYWRvLiBDbGlxdWUgbm8gYm90w6NvIGRlIGV4ZWN1w6fDo28gcGFyYSByZXRvbWFyIG8gdG91ci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5wdXRfcHJnOiBcIkVudHJhZGEgcGFyYSBvIHByb2dyYW1hXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3dlcmVfY29tcGlsaW5nX2VycjpcbiAgICAgICAgICAgIFwiSG91dmVyYW0gZXJyb3MgYW8gY29tcGlsYXIgc2V1IGPDs2RpZ28uIFZlamEgYWJhaXhvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2V4YzogXCJMaW1pdGUgZGUgdGVtcG8gZXhjZWRpZG8gbm8gc2V1IHByb2dyYW1hXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NlcnZlcl9lcnI6IFwiVW0gZXJybyBkZSBzZXJ2aWRvciBvY29ycmV1OiAkMSAkMlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9jb21waWxpbmdfcnVubmluZzpcbiAgICAgICAgICAgIFwiQ29tcGlsYW5kbyBlIGV4ZWN1dGFuZG8gc2V1IGPDs2RpZ28uLi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2VydmVyX2NvbW1fZXJyOiBcIkVycm8gYW8gY29tdW5pY2FyIGNvbSBvIHNlcnZpZG9yLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zYXZlX3J1bjogXCJTYWx2YXIgJiBFeGVjdXRhclwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZW5kZXI6IFwiU2FsdmFyICYgUmVuZGVyaXphclwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3I6XG4gICAgICAgICAgICBcIlVtIGVycm8gZGUgYXNzZXLDp8OjbyBvY29ycmUgcXVhbmRvIHB5dGhvbiBlbmNvbnRyYSB1bSBjb21hbmRvICdhc3NlcnQnLiBQeXRob24gYXZhbGlhIGEgZXhwcmVzc8OjbyBkbyBsYWRvIGRpcmVpdG87IHNlIMOpIHZlcmRhZGVpcmEsIG8gcHJvZ3JhbWEgY29udGludWEgbm9ybWFsbWVudGUuIFNlIMOpIGZhbHNhLCBweXRob24gZ2VyYSB1bSBlcnJvIGUgcGFyYSBhIGV4ZWN1w6fDo28uXCIgLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVxdWUgYSBleHByZXNzw6NvIGRvIGxhZG8gZGlyZWl0byBkZSAnYXNzZXJ0Jy4gRXNzYSBleHByZXNzw6NvIMOpIGZhbHNhIGUgw6kgcHJlY2lzbyB2ZXJpZmljYXIgbyBtb3Rpdm8uIFZvY8OqIHBvZGUgcXVlcmVyIGltcHJpbWlyIGNhZGEgcGFydGUgZGEgZXhwcmVzc8OjbyBlIGVudGVuZGVyIHBvcnF1ZSDDqSBmYWxzYS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZF9kYjogXCJDYXJyZWdhbmRvIGJhbmNvIGRlIGRhZG9zLi4uXCIsXG4gICAgfSxcbn0pO1xuIiwiJC5pMThuKCkubG9hZCh7XG4gICAgXCJzci1DeXJsXCI6IHtcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZF9oaXN0b3J5OiBcItCj0YfQuNGC0LDRmCDQuNGB0YLQvtGA0LjRmNGDXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F1ZGlvX3RvdXI6IFwi0JDRg9C00LjQviDRgtGD0YDQsFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkZWRfY29kZTogXCLQktCw0Ygg0LjQt9Cy0L7RgNC90Lgg0LrQvtC0INGY0LUg0YPRh9C40YLQsNC9LlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19zYXZlZF9jb2RlOiBcItCd0LUg0L/QvtGB0YLQvtGY0Lgg0YHQvdC40LzRmdC10L0g0LrQvtC0LlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ydW5fY29kZTogXCLQn9C+0LrRgNC10L3QuCDQv9GA0L7Qs9GA0LDQvFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2ZlZWRiYWNrOiBcItCf0YDQuNC60LDQttC4INGA0LXQt9GD0LvRgtCw0YJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlOiBcItCf0YDQuNC60LDQttC4INC60L7QtFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGU6IFwi0JfQsNGC0LLQvtGA0Lgg0LrQvtC0XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZWxlbnM6IFwi0JrQvtGA0LDQuiDQv9C+INC60L7RgNCw0LpcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuczogXCLQmtC+0YDQsNC6INC/0L4g0LrQvtGA0LDQulwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zOiBcItCX0LDRgtCy0L7RgNC4INC60L7RgNCw0Log0L/QviDQutC+0YDQsNC6XCIsXG5cbiAgICAgICAgbXNnX3NjdGl2ZWNvZGVfcGFyc2VfZXJyb3I6XG4gICAgICAgICAgICBcItCh0LjQvdGC0LDQutGB0L3QsCDQs9GA0LXRiNC60LAgKHBhcnNlIGVycm9yKSDQt9C90LDRh9C4INC00LAg0J/QsNGY0YLQvtC9INC90LUg0YDQsNC30YPQvNC1INGB0LjQvdGC0LDQutGB0YMg0YMg0LvQuNC90LjRmNC4INC60L7Qs9CwINC90LAg0LrQvtGY0YMg0L/QvtGA0YPQutCwINC+INCz0YDQtdGI0YbQuCDRg9C60LDQt9GD0ZjQtS4g0KLQuNC/0LjRh9C90Lgg0L/RgNC40LzQtdGA0Lgg0L7QstCw0LrQstC1INCz0YDQtdGI0LrQtSDRgdGDINC30LDQsdC+0YDQsNCy0LvRmNC10L3QsCDQtNCy0L7RgtCw0YfQutCwINC60L7QtCAnaWYnINC40LvQuCAnZm9yJyDQuNGB0LrQsNC30LAg0LjQu9C4INC30LDQsdC+0YDQsNCy0ZnQtdC90LAg0LfQsNC/0LXRgtCwINC40LfQvNC10ZLRgyDQsNGA0LPRg9C80LXQvdCw0YLQsCDQutC+0LQg0L/QvtC30LjQstCwINGE0YPQvdC60YbQuNGY0LVcIixcbiAgICAgICAgbXNnX3NjdGl2ZWNvZGVfcGFyc2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCLQlNCwINCx0LjRgdGC0LUg0LjRgdC/0YDQsNCy0LjQu9C4INGB0LjQvdGC0LDQutGB0L3RgyDQs9GA0LXRiNC60YMg0YLRgNC10LHQsCDQv9Cw0LbRmtC40LLQviDQtNCwINC/0L7Qs9C70LXQtNCw0YLQtSDQu9C40L3QuNGY0YMg0LjQt9Cy0L7RgNC90L7QsyDQutC+0LTQsCDQvdCwINC60L7RmNGDINGD0LrQsNC30YPRmNC1INC/0L7RgNGD0LPQsCDQviDQs9GA0LXRiNGG0Lgg0Lgg0LzQvtC20LTQsCDQv9GA0LXRgtGF0L7QtNC90YMg0LvQuNC90LjQvdGDINC40LfQstC+0YDQvdC+0LMg0LrQvtC00LAuINCf0YDQvtCy0LXRgNC40YLQtSDQtNCwINC70Lgg0YHRgyDQv9C+0YjRgtC+0LLQsNC90LAg0YHQstCwINGB0LjQvdGC0LDQutGB0L3QsCDQv9GA0LDQstC40LvQsCDQn9Cw0ZjRgtC+0L3QsC5cIixcbiAgICB9LFxufSk7XG4iLCIvKipcbiAqXG4gKiBDcmVhdGVkIGJ5IGJtaWxsZXIgb24gMy8xOS8xNS5cbiAqL1xuLyogRGVmaW5lIGdsb2JhbCB2YXJpYWJsZXMgZm9yIEVTTGludCAqL1xuLyogZ2xvYmFsIFNrICovXG5cblwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2UuanNcIjtcbmltcG9ydCBBdWRpb1RvdXIgZnJvbSBcIi4vYXVkaW90b3VyLmpzXCI7XG5pbXBvcnQgXCIuL2FjdGl2ZWNvZGUtaTE4bi5lbi5qc1wiO1xuaW1wb3J0IFwiLi9hY3RpdmVjb2RlLWkxOG4ucHQtYnIuanNcIjtcbmltcG9ydCBcIi4vYWN0aXZlY29kZS1pMThuLnNyLUN5cmwuanNcIjtcbmltcG9ydCBDb2RlTWlycm9yIGZyb20gXCJjb2RlbWlycm9yXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvcHl0aG9uL3B5dGhvbi5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL2Nzcy9jc3MuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUveG1sL3htbC5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL3NxbC9zcWwuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9jbGlrZS9jbGlrZS5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL29jdGF2ZS9vY3RhdmUuanNcIjtcbmltcG9ydCBcIi4vLi4vY3NzL2FjdGl2ZWNvZGUuY3NzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL2xpYi9jb2RlbWlycm9yLmNzc1wiO1xuaW1wb3J0IFwiLi9za3VscHQubWluLmpzXCI7XG5pbXBvcnQgXCIuL3NrdWxwdC1zdGRsaWIuanNcIjtcbi8vIFVzZWQgYnkgU2t1bHB0LlxuaW1wb3J0IGVtYmVkIGZyb20gXCJ2ZWdhLWVtYmVkXCI7XG4vLyBBZGFwdCBmb3IgdXNlIG91dHNpZGUgd2VicGFjayAtLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1lbWJlZC5cbndpbmRvdy52ZWdhRW1iZWQgPSBlbWJlZDtcblxudmFyIGlzTW91c2VEb3duID0gZmFsc2U7XG5kb2N1bWVudC5vbm1vdXNlZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICBpc01vdXNlRG93biA9IHRydWU7XG59O1xuXG5kb2N1bWVudC5vbm1vdXNldXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgaXNNb3VzZURvd24gPSBmYWxzZTtcbn07XG53aW5kb3cuZWRMaXN0ID0ge307XG5cbnZhciBzb2NrZXQsIGNvbm5lY3Rpb24sIGRvYztcbnZhciBjaGF0Y29kZXNTZXJ2ZXIgPSBcImNoYXQuY29kZXNcIjtcblxuLy8gc2VwYXJhdGUgaW50byBjb25zdHJ1Y3RvciBhbmQgaW5pdFxuZXhwb3J0IGNsYXNzIEFjdGl2ZUNvZGUgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB2YXIgc3VmZlN0YXJ0O1xuICAgICAgICB2YXIgb3JpZyA9ICQob3B0cy5vcmlnKS5maW5kKFwidGV4dGFyZWFcIilbMF07XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2ID0gb3B0cy5vcmlnO1xuICAgICAgICB0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzID0gb3B0cy51c2VSdW5lc3RvbmVTZXJ2aWNlcztcbiAgICAgICAgdGhpcy5weXRob24zID0gb3B0cy5weXRob24zO1xuICAgICAgICB0aGlzLmFsaWduVmVydGljYWwgPSBvcHRzLnZlcnRpY2FsO1xuICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZztcbiAgICAgICAgdGhpcy5vcmlnVGV4dCA9IHRoaXMub3JpZ0VsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgIHRoaXMuZGl2aWQgPSBvcHRzLm9yaWcuaWQ7XG4gICAgICAgIHRoaXMuY29kZSA9ICQob3JpZykudGV4dCgpIHx8IFwiXFxuXFxuXFxuXFxuXFxuXCI7XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSAkKG9yaWcpLmRhdGEoXCJsYW5nXCIpO1xuICAgICAgICB0aGlzLnRpbWVsaW1pdCA9ICQob3JpZykuZGF0YShcInRpbWVsaW1pdFwiKTtcbiAgICAgICAgdGhpcy5pbmNsdWRlcyA9ICQob3JpZykuZGF0YShcImluY2x1ZGVcIik7XG4gICAgICAgIHRoaXMuaGlkZWNvZGUgPSAkKG9yaWcpLmRhdGEoXCJoaWRlY29kZVwiKTtcbiAgICAgICAgdGhpcy5jaGF0Y29kZXMgPSAkKG9yaWcpLmRhdGEoXCJjaGF0Y29kZXNcIik7XG4gICAgICAgIHRoaXMuaGlkZWhpc3RvcnkgPSAkKG9yaWcpLmRhdGEoXCJoaWRlaGlzdG9yeVwiKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9ICQob3B0cy5vcmlnKS5maW5kKGAjJHt0aGlzLmRpdmlkfV9xdWVzdGlvbmApWzBdO1xuICAgICAgICB0aGlzLnRpZSA9ICQob3JpZykuZGF0YShcInRpZVwiKTtcbiAgICAgICAgdGhpcy5kYnVybCA9ICQob3JpZykuZGF0YShcImRidXJsXCIpO1xuICAgICAgICB0aGlzLnB5dGhvbjNfaW50ZXJwcmV0ZXIgPSAkKG9yaWcpLmRhdGEoXCJweXRob24zX2ludGVycHJldGVyXCIpO1xuICAgICAgICB0aGlzLm91dHB1dF9oZWlnaHQgPSAkKG9yaWcpLmRhdGEoXCJvdXRwdXRfaGVpZ2h0XCIpO1xuICAgICAgICB0aGlzLnJ1bkJ1dHRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuZW5hYmxlZG93bmxvYWQgPSAkKG9yaWcpLmRhdGEoXCJlbmFibGVkb3dubG9hZFwiKTtcbiAgICAgICAgdGhpcy5kb3dubG9hZEJ1dHRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzZXRCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLnNhdmVCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLmxvYWRCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLm91dGVyRGl2ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYXJ0bmVyID0gXCJcIjtcbiAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFlQm9va0NvbmZpZy5hbGxvd19wYWlycyB8fCAkKG9yaWcpLmRhdGEoXCJub3BhaXJcIikpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUGFydG5lciA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVQYXJ0bmVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIGNyZWF0ZSBwcmUgZm9yIG91dHB1dFxuICAgICAgICB0aGlzLmdyYXBoaWNzID0gbnVsbDsgLy8gY3JlYXRlIGRpdiBmb3IgdHVydGxlIGdyYXBoaWNzXG4gICAgICAgIHRoaXMuY29kZWNvYWNoID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb2RlbGVucyA9IG51bGw7XG4gICAgICAgIHRoaXMuY29udHJvbERpdiA9IG51bGw7XG4gICAgICAgIHRoaXMuaGlzdG9yeVNjcnViYmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy50aW1lc3RhbXBzID0gW1wiT3JpZ2luYWxcIl07XG4gICAgICAgIHRoaXMuYXV0b3J1biA9ICQob3JpZykuZGF0YShcImF1dG9ydW5cIik7XG4gICAgICAgIGlmICh0aGlzLmNoYXRjb2RlcyAmJiBlQm9va0NvbmZpZy5lbmFibGVfY2hhdGNvZGVzKSB7XG4gICAgICAgICAgICBpZiAoIXNvY2tldCkge1xuICAgICAgICAgICAgICAgIHNvY2tldCA9IG5ldyBXZWJTb2NrZXQoXCJ3c3M6Ly9cIiArIGNoYXRjb2Rlc1NlcnZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gbmV3IHdpbmRvdy5zaGFyZWRiLkNvbm5lY3Rpb24oc29ja2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICAgICAgZG9jID0gY29ubmVjdGlvbi5nZXQoXCJjaGF0Y29kZXNcIiwgXCJjaGFubmVsc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUgfHwgdGhpcy5pc1RpbWVkKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVjb2RlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5jbHVkZXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5jbHVkZXMgPSB0aGlzLmluY2x1ZGVzLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZWZpeEVuZCA9IHRoaXMuY29kZS5pbmRleE9mKFwiXl5eXlwiKTtcbiAgICAgICAgaWYgKHByZWZpeEVuZCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnByZWZpeCA9IHRoaXMuY29kZS5zdWJzdHJpbmcoMCwgcHJlZml4RW5kKTtcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IHRoaXMuY29kZS5zdWJzdHJpbmcocHJlZml4RW5kICsgNSk7XG4gICAgICAgIH1cbiAgICAgICAgc3VmZlN0YXJ0ID0gdGhpcy5jb2RlLmluZGV4T2YoXCI9PT09XCIpO1xuICAgICAgICBpZiAoc3VmZlN0YXJ0ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuc3VmZml4ID0gdGhpcy5jb2RlLnN1YnN0cmluZyhzdWZmU3RhcnQgKyA1KTtcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IHRoaXMuY29kZS5zdWJzdHJpbmcoMCwgc3VmZlN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpc3RvcnkgPSBbdGhpcy5jb2RlXTtcbiAgICAgICAgdGhpcy5jcmVhdGVFZGl0b3IoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVDb250cm9scygpO1xuICAgICAgICBpZiAoJChvcmlnKS5kYXRhKFwiY2FwdGlvblwiKSkge1xuICAgICAgICAgICAgdGhpcy5jYXB0aW9uID0gJChvcmlnKS5kYXRhKFwiY2FwdGlvblwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FwdGlvbiA9IFwiQWN0aXZlQ29kZVwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkQ2FwdGlvbihcInJ1bmVzdG9uZVwiKTtcbiAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5yZWZyZXNoKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgICAgICAxMDAwXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmF1dG9ydW4pIHtcbiAgICAgICAgICAgIC8vIFNpbXVsYXRlIHByZXNzaW5nIHRoZSBydW4gYnV0dG9uLCBzaW5jZSB0aGlzIHdpbGwgYWxzbyBwcmV2ZW50IHRoZSB1c2VyIGZyb20gY2xpY2tpbmcgaXQgdW50aWwgdGhlIGluaXRpYWwgcnVuIGlzIGNvbXBsZXRlLCBhbmQgYWxzbyBoZWxwIHRoZSB1c2VyIHVuZGVyc3RhbmQgd2h5IHRoZXkncmUgd2FpdGluZy5cbiAgICAgICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KHRoaXMucnVuQnV0dG9uSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeSgpO1xuICAgIH1cblxuICAgIGNyZWF0ZUVkaXRvcihpbmRleCkge1xuICAgICAgICB0aGlzLm91dGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIGxpbmtkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBsaW5rZGl2LmlkID0gdGhpcy5kaXZpZC5yZXBsYWNlKC9fL2csIFwiLVwiKS50b0xvd2VyQ2FzZSgpOyAvLyA6cmVmOiBjaGFuZ2VzIF8gdG8gLSBzbyBhZGQgdGhpcyBhcyBhIHRhcmdldFxuICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLmFkZENsYXNzKFwiYWNfc2VjdGlvbiBhbGVydCBhbGVydC13YXJuaW5nXCIpO1xuICAgICAgICB2YXIgY29kZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoY29kZURpdikuYWRkQ2xhc3MoXCJhY19jb2RlX2RpdiBjb2wtbWQtMTJcIik7XG4gICAgICAgIHRoaXMuY29kZURpdiA9IGNvZGVEaXY7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYubGFuZyA9IHRoaXMubGFuZ3VhZ2U7XG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5vdXRlckRpdik7XG4gICAgICAgIGlmIChsaW5rZGl2LmlkICE9PSB0aGlzLmRpdmlkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB3YW50IHRoZSAnZXh0cmEnIHRhcmdldCBpZiB0aGV5IG1hdGNoLlxuICAgICAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsaW5rZGl2KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNvZGVEaXYpO1xuICAgICAgICB2YXIgZWRtb2RlID0gdGhpcy5vdXRlckRpdi5sYW5nO1xuICAgICAgICBpZiAoZWRtb2RlID09PSBcInNxbFwiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1zcWxcIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwiamF2YVwiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1qYXZhXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcImNwcFwiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1jKytzcmNcIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwiY1wiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1jc3JjXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcInB5dGhvbjNcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJweXRob25cIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwib2N0YXZlXCIgfHwgZWRtb2RlID09PSBcIk1BVExBQlwiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1vY3RhdmVcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZGl2aWQpICE9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5jb2RlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5kaXZpZCk7XG5cbiAgICAgICAgdmFyIG9wdHMgPSB7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXG4gICAgICAgICAgICBtb2RlOiBlZG1vZGUsXG4gICAgICAgICAgICBpbmRlbnRVbml0OiA0LFxuICAgICAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9NYXRjaFBhcmVuczogdHJ1ZSxcbiAgICAgICAgICAgIGV4dHJhS2V5czoge1xuICAgICAgICAgICAgICAgIFRhYjogXCJpbmRlbnRNb3JlXCIsXG4gICAgICAgICAgICAgICAgXCJTaGlmdC1UYWJcIjogXCJpbmRlbnRMZXNzXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yKGNvZGVEaXYsb3B0cyApO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFrZSB0aGUgZWRpdG9yIHJlc2l6YWJsZVxuICAgICAgICAkKGVkaXRvci5nZXRXcmFwcGVyRWxlbWVudCgpKS5yZXNpemFibGUoe1xuICAgICAgICAgICAgcmVzaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZWRpdG9yLnNldFNpemUoJCh0aGlzKS53aWR0aCgpLCAkKHRoaXMpLmhlaWdodCgpKTtcbiAgICAgICAgICAgICAgICBlZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGdpdmUgdGhlIHVzZXIgYSB2aXN1YWwgY3VlIHRoYXQgdGhleSBoYXZlIGNoYW5nZWQgYnV0IG5vdCBzYXZlZFxuICAgICAgICBlZGl0b3Iub24oXG4gICAgICAgICAgICBcImNoYW5nZVwiLFxuICAgICAgICAgICAgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuYWNFZGl0RXZlbnQgPT0gZmFsc2UgfHxcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmFjRWRpdEV2ZW50ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50cyBjYW4gY29tZSBiZWZvcmUgYW55IHJlYWwgY2hhbmdlcyBmb3IgdmFyaW91cyByZWFzb25zLCBzb21lIHVua25vd25cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhdm9pZHMgdW5uZWNjc2FyeSBsb2cgZXZlbnRzIGFuZCB1cGRhdGVzIHRvIHRoZSBhY3Rpdml0eSBjb3VudGVyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9yaWdUZXh0ID09PSBlZGl0b3IuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICQoZWRpdG9yLmdldFdyYXBwZXJFbGVtZW50KCkpLmNzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLXRvcFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIycHggc29saWQgI2I0MzIzMlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICQoZWRpdG9yLmdldFdyYXBwZXJFbGVtZW50KCkpLmNzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLWJvdHRvbVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIycHggc29saWQgI2I0MzIzMlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBbnN3ZXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcImFjdGl2ZWNvZGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdDogXCJlZGl0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlZGl0b3IuYWNFZGl0RXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7IC8vIHVzZSBiaW5kIHRvIHByZXNlcnZlICp0aGlzKiBpbnNpZGUgdGhlIG9uIGhhbmRsZXIuXG4gICAgICAgIC8vU29sdmluZyBLZXlib2FyZCBUcmFwIG9mIEFjdGl2ZUNvZGU6IElmIHVzZXIgdXNlIHRhYiBmb3IgbmF2aWdhdGlvbiBvdXRzaWRlIG9mIEFjdGl2ZUNvZGUsIHRoZW4gY2hhbmdlIHRhYiBiZWhhdmlvciBpbiBBY3RpdmVDb2RlIHRvIGVuYWJsZSB0YWIgdXNlciB0byB0YWIgb3V0IG9mIHRoZSB0ZXh0YXJlYVxuICAgICAgICAkKHdpbmRvdykua2V5ZG93bihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyIGNvZGUgPSBlLmtleUNvZGUgPyBlLmtleUNvZGUgOiBlLndoaWNoO1xuICAgICAgICAgICAgaWYgKGNvZGUgPT0gOSAmJiAkKFwidGV4dGFyZWE6Zm9jdXNcIikubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZWRpdG9yLnNldE9wdGlvbihcImV4dHJhS2V5c1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIFRhYjogZnVuY3Rpb24gKGNtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoXCIudGFiLWNvbnRlbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dFNpYmxpbmcuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCJTaGlmdC1UYWJcIjogZnVuY3Rpb24gKGNtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoXCIudGFiLWNvbnRlbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJldmlvdXNTaWJsaW5nLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjtcbiAgICAgICAgaWYgKHRoaXMuaGlkZWNvZGUpIHtcbiAgICAgICAgICAgICQodGhpcy5jb2RlRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJ1bkJ1dHRvbkhhbmRsZXIoKSB7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIHJ1biBidXR0b24gdW50aWwgdGhlIHJ1biBpcyBmaW5pc2hlZC4gICAgXG4gICAgICAgIHRoaXMucnVuQnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuUHJvZygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgdGhlcmUgd2FzIGFuIGVycm9yICR7ZX0gcnVubmluZyB0aGUgY29kZWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxvZ1Jlc3VsdHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nQ3VycmVudEFuc3dlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyRmVlZGJhY2soKTtcbiAgICAgICAgLy8gVGhlIHJ1biBpcyBmaW5pc2hlZDsgcmUtZW5hYmxlIHRoZSBidXR0b24uXG4gICAgICAgIHRoaXMucnVuQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY3JlYXRlQ29udHJvbHMoKSB7XG4gICAgICAgIHZhciBjdHJsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIGJ1dHQ7XG4gICAgICAgICQoY3RybERpdikuYWRkQ2xhc3MoXCJhY19hY3Rpb25zXCIpO1xuICAgICAgICAkKGN0cmxEaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xuICAgICAgICAvLyBSdW5cbiAgICAgICAgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9ydW5fY29kZVwiKSk7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gYnRuLXN1Y2Nlc3MgcnVuLWJ1dHRvblwiKTtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgdGhpcy5ydW5CdXR0b24gPSBidXR0O1xuICAgICAgICBjb25zb2xlLmxvZyhcImFkZGluZyBjbGljayBmdW5jdGlvbiBmb3IgcnVuXCIpO1xuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrID0gdGhpcy5ydW5CdXR0b25IYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG5cbiAgICAgICAgdGhpcy5hZGRSZXNldEJ1dHRvbihjdHJsRGl2KTtcblxuICAgICAgICBpZiAodGhpcy5lbmFibGVkb3dubG9hZCB8fCBlQm9va0NvbmZpZy5kb3dubG9hZHNFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZERvd25sb2FkQnV0dG9uKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5oaWRlY29kZSAmJiAhdGhpcy5oaWRlaGlzdG9yeSkge1xuICAgICAgICAgICAgdGhpcy5hZGRIaXN0b3J5QnV0dG9uKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJncmFkZWJ1dHRvblwiKSAmJiAhdGhpcy5ncmFkZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmVlZGJhY2tCdXR0b24oY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2hvdy9IaWRlIENvZGVcbiAgICAgICAgaWYgKHRoaXMuaGlkZWNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlSGlkZVNob3coY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29kZUxlbnNcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcImNvZGVsZW5zXCIpICYmICF0aGlzLmdyYWRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVDb2RlTGVucyhjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBdWRpbyBUb3VyXG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJhdWRpb1wiKSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVBdWRpb1RvdXJzKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlQm9va0NvbmZpZy5pc0luc3RydWN0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlSW5zdHJ1Y3RvclNoYXJpbmcoY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlUGFydG5lcikge1xuICAgICAgICAgICAgdGhpcy5zZXR1cFBhcnRuZXIoY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2hhdGNvZGVzICYmIGVCb29rQ29uZmlnLmVuYWJsZV9jaGF0Y29kZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlQ2hhdENvZGVzKGN0cmxEaXYpO1xuICAgICAgICB9XG5cbiAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5wcmVwZW5kKGN0cmxEaXYpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbikge1xuICAgICAgICAgICAgaWYgKCQodGhpcy5xdWVzdGlvbikuaHRtbCgpLm1hdGNoKC9eXFxzKyQvKSkge1xuICAgICAgICAgICAgICAgICQodGhpcy5xdWVzdGlvbikucmVtb3ZlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQodGhpcy5vdXRlckRpdikucHJlcGVuZCh0aGlzLnF1ZXN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRyb2xEaXYgPSBjdHJsRGl2O1xuICAgIH1cblxuICAgIGFkZEZlZWRiYWNrQnV0dG9uKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfZmVlZGJhY2tcIikpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5ncmFkZUJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5jcmVhdGVHcmFkZVN1bW1hcnkuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgYWRkSGlzdG9yeUJ1dHRvbihjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2xvYWRfaGlzdG9yeVwiKSk7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgIHRoaXMuaGlzdEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5hZGRIaXN0b3J5U2NydWJiZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIGlmICh0aGlzLmdyYWRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRIaXN0b3J5U2NydWJiZXIodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGREb3dubG9hZEJ1dHRvbihjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KFwiRG93bmxvYWRcIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gc2F2ZS1idXR0b25cIik7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgIHRoaXMuZG93bmxvYWRCdXR0b24gPSBidXR0O1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMuZG93bmxvYWRGaWxlLmJpbmQodGhpcywgdGhpcy5sYW5ndWFnZSkpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgIH1cblxuICAgIGFkZFJlc2V0QnV0dG9uKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoXCJSZXNldFwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgdGhpcy5yZXNldEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5yZXNldENvZGUuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgZW5hYmxlSGlkZVNob3coY3RybERpdikge1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZVwiKSk7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnNob3dIaWRlQnV0dCA9IGJ1dHQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgICQoYnV0dCkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmNvZGVEaXYpLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIucGFyZW50RWxlbWVudCkudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnNob3dIaWRlQnV0dCkudGV4dCgpID09XG4gICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZVwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuc2hvd0hpZGVCdXR0KS50ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlXCIpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnNob3dIaWRlQnV0dCkudGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZVwiKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBlbmFibGVDb2RlTGVucyhjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVsZW5zXCIpKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgIHRoaXMuY2xCdXR0b24gPSBidXR0O1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMuc2hvd0NvZGVsZW5zLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGVuYWJsZUF1ZGlvVG91cnMoY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJhY19vcHQgYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXVkaW9fdG91clwiKSk7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICB0aGlzLmF0QnV0dG9uID0gYnV0dDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgJChidXR0KS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBuZXcgQXVkaW9Ub3VyKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5vcmlnRWxlbSkuZGF0YShcImF1ZGlvXCIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGVuYWJsZUluc3RydWN0b3JTaGFyaW5nKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIGJ0bi1pbmZvXCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoXCJTaGFyZSBDb2RlXCIpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgdGhpcy5zaGFyZUJ1dHQgPSBidXR0O1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKFxuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIWNvbmZpcm0oXG4gICAgICAgICAgICAgICAgICAgICAgICBcIllvdSBhcmUgYWJvdXQgdG8gc2hhcmUgdGhpcyBjb2RlIHdpdGggQUxMIG9mIHlvdXIgc3R1ZGVudHMuICBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/XCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICBkaXZpZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgbGFuZzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoXG4gICAgICAgICAgICAgICAgICAgIGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcImJyb2FkY2FzdF9jb2RlLmpzb25cIixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbGV0IHBvc3RfcHJvbWlzZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIGxldCBzdGF0dXMgPSBhd2FpdCBwb3N0X3Byb21pc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMubWVzcyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoYFNoYXJlZCBDb2RlIHdpdGggJHtzdGF0dXMuc2hhcmVfY291bnR9IHN0dWRlbnRzYCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoXCJTaGFyaW5nIEZhaWxlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZXR1cFBhcnRuZXIoY3RybERpdikge1xuICAgICAgICB2YXIgY2hlY2tQYXJ0bmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBjaGVja1BhcnRuZXIudHlwZSA9IFwiY2hlY2tib3hcIjtcbiAgICAgICAgY2hlY2tQYXJ0bmVyLmlkID0gYCR7dGhpcy5kaXZpZH1fcGFydGA7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoY2hlY2tQYXJ0bmVyKTtcbiAgICAgICAgdmFyIHBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgcGxhYmVsLmZvciA9IGAke3RoaXMuZGl2aWR9X3BhcnRgO1xuICAgICAgICAkKHBsYWJlbCkudGV4dChcIlBhaXI/XCIpO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKHBsYWJlbCk7XG4gICAgICAgICQoY2hlY2tQYXJ0bmVyKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJ0bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFydG5lciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAkKHBhcnRuZXJUZXh0Qm94KS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFydG5lciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRuZXJUZXh0Qm94LnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgJChwbGFiZWwpLnRleHQoXCJQYWlyP1wiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlkQWdyZWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnRuZXJBZ3JlZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWRBZ3JlZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlkQWdyZWUgPSBjb25maXJtKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiUGFpciBQcm9ncmFtbWluZyBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggdGhlIGNvbnNlbnQgb2YgeW91ciBpbnN0cnVjdG9yLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJZb3VyIHBhcnRuZXIgbXVzdCBiZSBhIHJlZ2lzdGVyZWQgbWVtYmVyIG9mIHRoZSBjbGFzcyBhbmQgaGF2ZSBhZ3JlZWQgdG8gcGFpciB3aXRoIHlvdS5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQnkgY2xpY2tpbmcgT0sgeW91IGNlcnRpZnkgdGhhdCBib3RoIG9mIHRoZXNlIGNvbmRpdGlvbnMgaGF2ZSBiZWVuIG1ldC5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWRBZ3JlZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwicGFydG5lckFncmVlXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFydG5lciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICQocGxhYmVsKS50ZXh0KFwid2l0aDogXCIpO1xuICAgICAgICAgICAgICAgICAgICAkKHBhcnRuZXJUZXh0Qm94KS5zaG93KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIHZhciBwYXJ0bmVyVGV4dEJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgcGFydG5lclRleHRCb3gudHlwZSA9IFwidGV4dFwiO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKHBhcnRuZXJUZXh0Qm94KTtcbiAgICAgICAgJChwYXJ0bmVyVGV4dEJveCkuaGlkZSgpO1xuICAgICAgICAkKHBhcnRuZXJUZXh0Qm94KS5jaGFuZ2UoXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gcGFydG5lclRleHRCb3gudmFsdWU7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIHByb2JhYmx5IG9ic29sZXRlLiAgTm90IHN1cmUgaWYgYW55b25lIGF0IE1pY2hpZ2FuIHdpbGwgY29tZSBiYWNrXG4gICAgLy8gdG8gd29ya2luZyBvbiB0aGlzIGFnYWluLlxuICAgIGVuYWJsZUNoYXRDb2RlcyhjdHJsRGl2KSB7XG4gICAgICAgIHZhciBjaGF0QmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIGNoYW5uZWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHZhciB0b3BpYyA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0ICsgXCItXCIgKyB0aGlzLmRpdmlkO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGNoYXRCYXIpO1xuICAgICAgICAkKGNoYXRCYXIpLnRleHQoXCJDaGF0OiBcIik7XG4gICAgICAgICQoY2hhdEJhcikuYXBwZW5kKGNoYW5uZWxzKTtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkudGV4dChcIkNyZWF0ZSBDaGFubmVsXCIpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidGFyZ2V0XCIsIFwiX2JsYW5rXCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXG4gICAgICAgICAgICBcImhyZWZcIixcbiAgICAgICAgICAgIFwiaHR0cDovL1wiICtcbiAgICAgICAgICAgICAgICBjaGF0Y29kZXNTZXJ2ZXIgK1xuICAgICAgICAgICAgICAgIFwiL25ldz9cIiArXG4gICAgICAgICAgICAgICAgJC5wYXJhbSh7XG4gICAgICAgICAgICAgICAgICAgIHRvcGljOiB3aW5kb3cubG9jYXRpb24uaG9zdCArIFwiLVwiICsgdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgbGFuZzogXCJQeXRob25cIixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNoYXRCdXR0b24gPSBidXR0O1xuICAgICAgICBjaGF0QmFyLmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICB2YXIgdXBkYXRlQ2hhdENvZGVzQ2hhbm5lbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IGRvYy5kYXRhO1xuICAgICAgICAgICAgdmFyIGkgPSAxO1xuICAgICAgICAgICAgJChjaGFubmVscykuaHRtbChcIlwiKTtcbiAgICAgICAgICAgIGRhdGFbXCJjaGFubmVsc1wiXS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsLmFyY2hpdmVkICYmIHRvcGljID09PSBjaGFubmVsLnRvcGljKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsaW5rID0gJChcIjxhIC8+XCIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaHJlZiA9XG4gICAgICAgICAgICAgICAgICAgICAgICBcImh0dHA6Ly9cIiArIGNoYXRjb2Rlc1NlcnZlciArIFwiL1wiICsgY2hhbm5lbC5jaGFubmVsTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgbGluay5hdHRyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IGhyZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBsaW5rLnRleHQoXCIgXCIgKyBjaGFubmVsLmNoYW5uZWxOYW1lICsgXCIoXCIgKyBpICsgXCIpIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgJChjaGFubmVscykuYXBwZW5kKGxpbmspO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICQoY2hhbm5lbHMpLnRleHQoXCIobm8gYWN0aXZlIGNvbnZlcnN0YXRpb25zIG9uIHRoaXMgcHJvYmxlbSlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGRvYy5zdWJzY3JpYmUodXBkYXRlQ2hhdENvZGVzQ2hhbm5lbHMpO1xuICAgICAgICBkb2Mub24oXCJvcFwiLCB1cGRhdGVDaGF0Q29kZXNDaGFubmVscyk7XG4gICAgfVxuXG4gICAgZW5hYmxlU2F2ZUxvYWQoKSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2F2ZV9ydW5cIikpO1xuICAgIH1cblxuICAgIC8vIEFjdGl2ZWNvZGUgLS0gSWYgdGhlIGNvZGUgaGFzIG5vdCBjaGFuZ2VkIHdydCB0aGUgc2NydWJiZXIgcG9zaXRpb24gdmFsdWUgdGhlbiBkb24ndCBzYXZlIHRoZSBjb2RlIG9yIHJlcG9zaXRpb24gdGhlIHNjcnViYmVyXG4gICAgLy8gIC0tIHN0aWxsIGNhbGwgcnVubG9nLCBidXQgYWRkIGEgcGFyYW1ldGVyIHRvIG5vdCBzYXZlIHRoZSBjb2RlXG4gICAgLy8gYWRkIGFuIGluaXRpYWwgbG9hZCBoaXN0b3J5IGJ1dHRvblxuICAgIC8vIGlmIHRoZXJlIGlzIG5vIGVkaXQgdGhlbiB0aGVyZSBpcyBubyBhcHBlbmQgICB0b19zYXZlIChUcnVlL0ZhbHNlKVxuICAgIGFzeW5jIGFkZEhpc3RvcnlTY3J1YmJlcihwb3NfbGFzdCkge1xuICAgICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICAgIHZhciByZXFEYXRhID0ge1xuICAgICAgICAgICAgYWNpZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuc2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlcURhdGFbXCJzaWRcIl0gPSB0aGlzLnNpZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhcImJlZm9yZSBnZXQgaGlzdFwiKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZUJvb2tDb25maWcucHJhY3RpY2VfbW9kZSB8fFxuICAgICAgICAgICAgKHRoaXMuaXNUaW1lZCAmJiAhdGhpcy5hc3Nlc3NtZW50VGFrZW4pXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aW1lZCBhbmQgYWxyZWFkeSB0YWtlbiB3ZSBzaG91bGQgcmVzdG9yZSBoaXN0b3J5IGluZm9cbiAgICAgICAgICAgIHRoaXMucmVuZGVyU2NydWJiZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoZUJvb2tDb25maWcuYWpheFVSTCArIFwiZ2V0aGlzdC5qc29uXCIsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxRGF0YSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oaXN0b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5ID0gdGhpcy5oaXN0b3J5LmNvbmNhdChkYXRhLmhpc3RvcnkpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0IGluIGRhdGEudGltZXN0YW1wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lc3RhbXBzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoZGF0YS50aW1lc3RhbXBzW3RdKS50b0xvY2FsZVN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidW5hYmxlIHRvIGZldGNoIGhpc3RvcnlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlbmRlclNjcnViYmVyKHBvc19sYXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJzdWNjZXNzXCI7XG4gICAgfVxuXG4gICAgcmVuZGVyU2NydWJiZXIocG9zX2xhc3QpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJtYWtpbmcgYSBuZXcgc2NydWJiZXJcIik7XG4gICAgICAgIHZhciBzY3J1YmJlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoc2NydWJiZXJEaXYpLmNzcyhcImRpc3BsYXlcIiwgXCJpbmxpbmUtYmxvY2tcIik7XG4gICAgICAgICQoc2NydWJiZXJEaXYpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgJChzY3J1YmJlckRpdikuY3NzKFwibWFyZ2luLXJpZ2h0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgJChzY3J1YmJlckRpdikuY3NzKHtcbiAgICAgICAgICAgIFwibWluLXdpZHRoXCI6IFwiMjAwcHhcIixcbiAgICAgICAgICAgIFwibWF4LXdpZHRoXCI6IFwiMzAwcHhcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzY3J1YmJlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMudGltZXN0YW1wUCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICB0aGlzLnNsaWRlaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmhpc3RvcnlbJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIildKTtcbiAgICAgICAgICAgIHZhciBjdXJWYWwgPSB0aGlzLnRpbWVzdGFtcHNbJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIildO1xuICAgICAgICAgICAgbGV0IHBvcyA9ICQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpO1xuICAgICAgICAgICAgbGV0IG91dE9mID0gdGhpcy5oaXN0b3J5Lmxlbmd0aDtcbiAgICAgICAgICAgICQodGhpcy50aW1lc3RhbXBQKS50ZXh0KGAke2N1clZhbH0gLSAke3BvcyArIDF9IG9mICR7b3V0T2Z9YCk7XG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiYWN0aXZlY29kZVwiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJzbGlkZTpcIiArIGN1clZhbCxcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgJChzY3J1YmJlcikuc2xpZGVyKHtcbiAgICAgICAgICAgIG1heDogdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEsXG4gICAgICAgIH0pO1xuICAgICAgICAkKHNjcnViYmVyKS5jc3MoXCJtYXJnaW5cIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKHNjcnViYmVyKS5vbihcInNsaWRlXCIsIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpKTtcbiAgICAgICAgJChzY3J1YmJlcikub24oXCJzbGlkZWNoYW5nZVwiLCB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKSk7XG4gICAgICAgIHNjcnViYmVyRGl2LmFwcGVuZENoaWxkKHNjcnViYmVyKTtcbiAgICAgICAgc2NydWJiZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy50aW1lc3RhbXBQKTtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBkZWFkbGluZSBzZXQgdGhlbiBwb3NpdGlvbiB0aGUgc2NydWJiZXIgYXQgdGhlIGxhc3Qgc3VibWlzc2lvblxuICAgICAgICAvLyBwcmlvciB0byB0aGUgZGVhZGxpbmVcbiAgICAgICAgaWYgKHRoaXMuZGVhZGxpbmUpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAoaSA8IHRoaXMuaGlzdG9yeS5sZW5ndGggJiYgIWRvbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAobmV3IERhdGUodGhpcy50aW1lc3RhbXBzW2ldKSA+IHRoaXMuZGVhZGxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkgPSBpIC0gMTtcbiAgICAgICAgICAgIHNjcnViYmVyLnZhbHVlID0gTWF0aC5tYXgoaSwgMCk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmhpc3Rvcnlbc2NydWJiZXIudmFsdWVdKTtcbiAgICAgICAgICAgICQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIsIHNjcnViYmVyLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NfbGFzdCkge1xuICAgICAgICAgICAgc2NydWJiZXIudmFsdWUgPSB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuaGlzdG9yeVtzY3J1YmJlci52YWx1ZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2NydWJiZXIudmFsdWUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3MgPSAkKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKTtcbiAgICAgICAgbGV0IG91dE9mID0gdGhpcy5oaXN0b3J5Lmxlbmd0aDtcbiAgICAgICAgbGV0IHRzID0gdGhpcy50aW1lc3RhbXBzWyQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpXTtcbiAgICAgICAgJCh0aGlzLnRpbWVzdGFtcFApLnRleHQoYCR7dHN9IC0gJHtwb3MgKyAxfSBvZiAke291dE9mfWApO1xuICAgICAgICAkKHRoaXMuaGlzdEJ1dHRvbikucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuaGlzdEJ1dHRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuaGlzdG9yeVNjcnViYmVyID0gc2NydWJiZXI7XG4gICAgICAgICQoc2NydWJiZXJEaXYpLmluc2VydEFmdGVyKHRoaXMucnVuQnV0dG9uKTtcbiAgICB9IC8vIGVuZCBkZWZpbml0aW9uIG9mIGhlbHBlclxuXG4gICAgY3JlYXRlT3V0cHV0KCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBwYXJlbnQgZGl2IHdpdGggdHdvIGVsZW1lbnRzOiAgcHJlIGZvciBzdGFuZGFyZCBvdXRwdXQgYW5kIGEgZGl2XG4gICAgICAgIC8vIHRvIGhvbGQgdHVydGxlIGdyYXBoaWNzIG91dHB1dC4gIFdlIHVzZSBhIGRpdiBpbiBjYXNlIHRoZSB0dXJ0bGUgY2hhbmdlcyBmcm9tXG4gICAgICAgIC8vIHVzaW5nIGEgY2FudmFzIHRvIHVzaW5nIHNvbWUgb3RoZXIgZWxlbWVudCBsaWtlIHN2ZyBpbiB0aGUgZnV0dXJlLlxuICAgICAgICB2YXIgb3V0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiYWNfb3V0cHV0IGNvbC1tZC0xMlwiKTtcbiAgICAgICAgdGhpcy5vdXREaXYgPSBvdXREaXY7XG4gICAgICAgIHRoaXMub3V0cHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKTtcbiAgICAgICAgdGhpcy5vdXRwdXQuaWQgPSB0aGlzLmRpdmlkICsgXCJfc3Rkb3V0XCI7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIik7XG4gICAgICAgIHRoaXMuZ3JhcGhpY3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmdyYXBoaWNzLmlkID0gdGhpcy5kaXZpZCArIFwiX2dyYXBoaWNzXCI7XG4gICAgICAgICQodGhpcy5ncmFwaGljcykuYWRkQ2xhc3MoXCJhYy1jYW52YXNcIik7XG4gICAgICAgIC8vIFRoaXMgYml0IG9mIG1hZ2ljIGFkZHMgYW4gZXZlbnQgd2hpY2ggd2FpdHMgZm9yIGEgY2FudmFzIGNoaWxkIHRvIGJlIGNyZWF0ZWQgb24gb3VyXG4gICAgICAgIC8vIG5ld2x5IGNyZWF0ZWQgZGl2LiAgV2hlbiBhIGNhbnZhcyBjaGlsZCBpcyBhZGRlZCB3ZSBhZGQgYSBuZXcgY2xhc3Mgc28gdGhhdCB0aGUgdmlzaWJsZVxuICAgICAgICAvLyBjYW52YXMgY2FuIGJlIHN0eWxlZCBpbiBDU1MuICBXaGljaCBhIHRoZSBtb21lbnQgbWVhbnMganVzdCBhZGRpbmcgYSBib3JkZXIuXG4gICAgICAgICQodGhpcy5ncmFwaGljcykub24oXG4gICAgICAgICAgICBcIkRPTU5vZGVJbnNlcnRlZFwiLFxuICAgICAgICAgICAgXCJjYW52YXNcIixcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMuZ3JhcGhpY3MpLmFkZENsYXNzKFwidmlzaWJsZS1hYy1jYW52YXNcIik7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIGNsZWFyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjbGVhckRpdikuY3NzKFwiY2xlYXJcIiwgXCJib3RoXCIpOyAvLyBuZWVkZWQgdG8gbWFrZSBwYXJlbnQgZGl2IHJlc2l6ZSBwcm9wZXJseVxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNsZWFyRGl2KTtcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMub3V0cHV0KTtcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMuZ3JhcGhpY3MpO1xuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKG91dERpdik7XG4gICAgICAgIHZhciBsZW5zRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgbGVuc0Rpdi5pZCA9IGAke3RoaXMuZGl2aWR9X2NvZGVsZW5zYDtcbiAgICAgICAgJChsZW5zRGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgJChsZW5zRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcbiAgICAgICAgdGhpcy5jb2RlbGVucyA9IGxlbnNEaXY7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQobGVuc0Rpdik7XG4gICAgICAgIHZhciBjb2FjaERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoY29hY2hEaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xuICAgICAgICAkKGNvYWNoRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcbiAgICAgICAgdGhpcy5jb2RlY29hY2ggPSBjb2FjaERpdjtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjb2FjaERpdik7XG4gICAgICAgIGNsZWFyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjbGVhckRpdikuY3NzKFwiY2xlYXJcIiwgXCJib3RoXCIpOyAvLyBuZWVkZWQgdG8gbWFrZSBwYXJlbnQgZGl2IHJlc2l6ZSBwcm9wZXJseVxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNsZWFyRGl2KTtcbiAgICB9XG5cbiAgICBkaXNhYmxlU2F2ZUxvYWQoKSB7XG4gICAgICAgICQodGhpcy5zYXZlQnV0dG9uKS5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMuc2F2ZUJ1dHRvbikuYXR0cihcInRpdGxlXCIsIFwiTG9naW4gdG8gc2F2ZSB5b3VyIGNvZGVcIik7XG4gICAgICAgICQodGhpcy5sb2FkQnV0dG9uKS5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMubG9hZEJ1dHRvbikuYXR0cihcInRpdGxlXCIsIFwiTG9naW4gdG8gbG9hZCB5b3VyIGNvZGVcIik7XG4gICAgfVxuXG4gICAgZG93bmxvYWRGaWxlKGxhbmcpIHtcbiAgICAgICAgdmFyIGZuYiA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIHZhciBkID0gbmV3IERhdGUoKTtcbiAgICAgICAgdmFyIGZpbGVOYW1lID1cbiAgICAgICAgICAgIGZuYiArXG4gICAgICAgICAgICBcIl9cIiArXG4gICAgICAgICAgICBkXG4gICAgICAgICAgICAgICAgLnRvSlNPTigpXG4gICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCAxMCkgLy8gcmV2ZXJzZSBkYXRlIGZvcm1hdFxuICAgICAgICAgICAgICAgIC5zcGxpdChcIi1cIilcbiAgICAgICAgICAgICAgICAuam9pbihcIlwiKSArXG4gICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICBsYW5ndWFnZUV4dGVuc2lvbnNbbGFuZ107XG4gICAgICAgIHZhciBjb2RlID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgaWYgKFwiQmxvYlwiIGluIHdpbmRvdykge1xuICAgICAgICAgICAgdmFyIHRleHRUb1dyaXRlID0gY29kZS5yZXBsYWNlKC9cXG4vZywgXCJcXHJcXG5cIik7XG4gICAgICAgICAgICB2YXIgdGV4dEZpbGVBc0Jsb2IgPSBuZXcgQmxvYihbdGV4dFRvV3JpdGVdLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0L3BsYWluXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChcIm1zU2F2ZU9yT3BlbkJsb2JcIiBpbiBuYXZpZ2F0b3IpIHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYih0ZXh0RmlsZUFzQmxvYiwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZG93bmxvYWRMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLmlubmVySFRNTCA9IFwiRG93bmxvYWQgRmlsZVwiO1xuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5ocmVmID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwodGV4dEZpbGVBc0Jsb2IpO1xuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb3dubG9hZExpbmspO1xuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxlcnQoXCJZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSFRNTDUgQmxvYi5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldENvZGUoKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuZGl2aWQpO1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgY3JlYXRlR3JhZGVTdW1tYXJ5KCkge1xuICAgICAgICAvLyBnZXQgZ3JhZGUgYW5kIGNvbW1lbnRzIGZvciB0aGlzIGFzc2lnbm1lbnRcbiAgICAgICAgLy8gZ2V0IHN1bW1hcnkgb2YgYWxsIGdyYWRlcyBmb3IgdGhpcyBzdHVkZW50XG4gICAgICAgIC8vIGRpc3BsYXkgZ3JhZGVzIGluIG1vZGFsIHdpbmRvd1xuICAgICAgICB2YXIgZGF0YSA9IHtcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChlQm9va0NvbmZpZy5hamF4VVJMICsgXCJnZXRhc3NpZ25tZW50Z3JhZGVcIiwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICBsZXQgcmVwb3J0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICB2YXIgYm9keTtcbiAgICAgICAgLy8gY2hlY2sgZm9yIHJlcG9ydFsnbWVzc2FnZSddXG4gICAgICAgIGlmIChyZXBvcnQpIHtcbiAgICAgICAgICAgIGlmIChyZXBvcnRbXCJ2ZXJzaW9uXCJdID09IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBuZXcgdmVyc2lvbjsgd291bGQgYmUgYmV0dGVyIHRvIGVtYmVkIHRoaXMgaW4gSFRNTCBmb3IgdGhlIGFjdGl2ZWNvZGVcbiAgICAgICAgICAgICAgICBib2R5ID1cbiAgICAgICAgICAgICAgICAgICAgXCI8aDQ+R3JhZGUgUmVwb3J0PC9oND5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+VGhpcyBxdWVzdGlvbjogXCIgK1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJncmFkZVwiXTtcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0W1wicmVsZWFzZWRcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBcIiBvdXQgb2YgXCIgKyByZXBvcnRbXCJtYXhcIl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJvZHkgKz0gXCI8L3A+IDxwPlwiO1xuICAgICAgICAgICAgICAgIGlmIChyZXBvcnRbXCJyZWxlYXNlZFwiXSA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IFwiUHJlbGltaW5hcnkgQ29tbWVudHM6IFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBib2R5ICs9IHJlcG9ydFtcImNvbW1lbnRcIl0gKyBcIjwvcD5cIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYm9keSA9XG4gICAgICAgICAgICAgICAgICAgIFwiPGg0PkdyYWRlIFJlcG9ydDwvaDQ+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIjxwPlRoaXMgYXNzaWdubWVudDogXCIgK1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJncmFkZVwiXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9wPlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCI8cD5cIiArXG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydFtcImNvbW1lbnRcIl0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+TnVtYmVyIG9mIGdyYWRlZCBhc3NpZ25tZW50czogXCIgK1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJjb3VudFwiXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9wPlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCI8cD5BdmVyYWdlIHNjb3JlOiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydFtcImF2Z1wiXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9wPlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYm9keSA9IFwiPGg0PlRoZSBzZXJ2ZXIgZGlkIG5vdCByZXR1cm4gYW55IGdyYWRlIGluZm9ybWF0aW9uPC9oND5cIjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaHRtbCA9IGA8ZGl2IGNsYXNzPVwibW9kYWwgZmFkZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBjb21wYXJlLW1vZGFsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5Bc3NpZ25tZW50IEZlZWRiYWNrPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHtib2R5fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHZhciBlbCA9ICQoaHRtbCk7XG4gICAgICAgIGVsLm1vZGFsKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIGFzeW5jIHNob3dDb2RlbGVucygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnNcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsID0gdGhpcy5jb2RlbGVucy5maXJzdENoaWxkO1xuICAgICAgICBpZiAoY2wpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMucmVtb3ZlQ2hpbGQoY2wpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb2RlID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpO1xuICAgICAgICB2YXIgbXlWYXJzID0ge307XG4gICAgICAgIG15VmFycy5jb2RlID0gY29kZTtcbiAgICAgICAgbXlWYXJzLm9yaWdpbiA9IFwib3B0LWZyb250ZW5kLmpzXCI7XG4gICAgICAgIG15VmFycy5jdW11bGF0aXZlID0gZmFsc2U7XG4gICAgICAgIG15VmFycy5oZWFwUHJpbWl0aXZlcyA9IGZhbHNlO1xuICAgICAgICBteVZhcnMuZHJhd1BhcmVudFBvaW50ZXJzID0gZmFsc2U7XG4gICAgICAgIG15VmFycy50ZXh0UmVmZXJlbmNlcyA9IGZhbHNlO1xuICAgICAgICBteVZhcnMuc2hvd09ubHlPdXRwdXRzID0gZmFsc2U7XG4gICAgICAgIG15VmFycy5yYXdJbnB1dExzdEpTT04gPSBKU09OLnN0cmluZ2lmeShbXSk7XG4gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlID09IFwicHl0aG9uXCIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnB5dGhvbjMpIHtcbiAgICAgICAgICAgICAgICBteVZhcnMucHkgPSAzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBteVZhcnMucHkgPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFuZ2F1Z2UgPT0gXCJqYXZhc2NyaXB0XCIpIHtcbiAgICAgICAgICAgIG15VmFycy5weSA9IFwianNcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG15VmFycy5weSA9IHRoaXMubGFuZ3VhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgbXlWYXJzLmN1ckluc3RyID0gMDtcbiAgICAgICAgbXlWYXJzLmNvZGVEaXZXaWR0aCA9IDM1MDtcbiAgICAgICAgbXlWYXJzLmNvZGVEaXZIZWlnaHQgPSA0MDA7XG4gICAgICAgIHZhciBzcmNVUkwgPSBcImh0dHBzOi8vcHl0aG9udHV0b3IuY29tL2lmcmFtZS1lbWJlZC5odG1sXCI7XG4gICAgICAgIHZhciBzcmNWYXJzID0gJC5wYXJhbShteVZhcnMpO1xuICAgICAgICB2YXIgZW1iZWRVcmxTdHIgPSBgJHtzcmNVUkx9IyR7c3JjVmFyc31gO1xuICAgICAgICB2YXIgbXlJZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB0aGlzLmRpdmlkICsgXCJfY29kZWxlbnNcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiODAwXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgXCI1MDBcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiZGlzcGxheTpibG9ja1wiKTtcbiAgICAgICAgbXlJZnJhbWUuc3R5bGUuYmFja2dyb3VuZCA9IFwiI2ZmZlwiO1xuICAgICAgICAvL215SWZyYW1lLnNldEF0dHJpYnV0ZShcInNyY1wiLHNyY1VSTClcbiAgICAgICAgbXlJZnJhbWUuc3JjID0gZW1iZWRVcmxTdHI7XG4gICAgICAgIHRoaXMuY29kZWxlbnMuYXBwZW5kQ2hpbGQobXlJZnJhbWUpO1xuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJjb2RlbGVuc1wiLFxuICAgICAgICAgICAgYWN0OiBcInZpZXdcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIDxpZnJhbWUgaWQ9XCIlKGRpdmlkKXNfY29kZWxlbnNcIiB3aWR0aD1cIjgwMFwiIGhlaWdodD1cIjUwMFwiIHN0eWxlPVwiZGlzcGxheTpibG9ja1wic3JjPVwiI1wiPlxuICAgIC8vIDwvaWZyYW1lPlxuICAgIHNob3dDb2RlQ29hY2goKSB7XG4gICAgICAgIHZhciBteUlmcmFtZTtcbiAgICAgICAgdmFyIHNyY1VSTDtcbiAgICAgICAgdmFyIGNsO1xuICAgICAgICB2YXIgZGl2X2lkID0gdGhpcy5kaXZpZDtcbiAgICAgICAgaWYgKHRoaXMuY29kZWNvYWNoID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVjb2FjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0aGlzLmNvZGVjb2FjaC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICB9XG4gICAgICAgIGNsID0gdGhpcy5jb2RlY29hY2guZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGNsKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVjb2FjaC5yZW1vdmVDaGlsZChjbCk7XG4gICAgICAgIH1cbiAgICAgICAgc3JjVVJMID0gZUJvb2tDb25maWcuYXBwICsgXCIvYWRtaW4vZGlmZnZpZXdlcj9kaXZpZD1cIiArIGRpdl9pZDtcbiAgICAgICAgbXlJZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBkaXZfaWQgKyBcIl9jb2FjaFwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCI4MDBweFwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIFwiNTAwcHhcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiZGlzcGxheTpibG9ja1wiKTtcbiAgICAgICAgbXlJZnJhbWUuc3R5bGUuYmFja2dyb3VuZCA9IFwiI2ZmZlwiO1xuICAgICAgICBteUlmcmFtZS5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgICAgICBteUlmcmFtZS5zcmMgPSBzcmNVUkw7XG4gICAgICAgIHRoaXMuY29kZWNvYWNoLmFwcGVuZENoaWxkKG15SWZyYW1lKTtcbiAgICAgICAgJCh0aGlzLmNvZGVjb2FjaCkuc2hvdygpO1xuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJjb2FjaFwiLFxuICAgICAgICAgICAgYWN0OiBcInZpZXdcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdG9nZ2xlRWRpdG9yVmlzaWJpbGl0eSgpIHt9XG5cbiAgICBhZGRFcnJvck1lc3NhZ2UoZXJyKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgZXJyb3IgbWVzc2FnZVxuICAgICAgICB0aGlzLmVyckxhc3RSdW4gPSB0cnVlO1xuICAgICAgICB2YXIgZXJySGVhZCA9ICQoXCI8aDM+XCIpLmh0bWwoXCJFcnJvclwiKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZXJyb3IgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5pZCA9IHRoaXMuZGl2aWQgKyBcIl9lcnJpbmZvXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChlcnJIZWFkWzBdKTtcbiAgICAgICAgdmFyIGVyclRleHQgPSB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpXG4gICAgICAgICk7XG4gICAgICAgIC8vIEJ1dCwgYWRqdXN0IHRoZSBsaW5lIG51bWJlcnMuICBJZiB0aGUgbGluZSBudW1iZXIgaXMgPD0gcHJldGV4dExpbmVzIHRoZW4gaXQgaXMgaW4gaW5jbHVkZWQgY29kZVxuICAgICAgICAvLyBpZiBpdCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBpbmNsdWRlZCBsaW5lcyBidXQgbGVzcyB0aGFuIHRoZSBwcmV0ZXh0ICsgY3VycmVudCBlZGl0b3IgdGhlbiBpdCBpcyBpbiB0aGUgc3R1ZGVudCBjb2RlLlxuICAgICAgICAvLyBhZGp1c3QgdGhlIGxpbmUgbnVtYmVyIHdlIGRpc3BsYXkgYnkgZWxpbWluYXRpbmcgdGhlIHByZS1pbmNsdWRlZCBjb2RlLlxuICAgICAgICBpZiAoZXJyLnRyYWNlYmFjay5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgdmFyIGVycm9yTGluZSA9IGVyci50cmFjZWJhY2tbMF0ubGluZW5vO1xuICAgICAgICAgICAgaWYgKGVycm9yTGluZSA8PSB0aGlzLnByZXRleHRMaW5lcykge1xuICAgICAgICAgICAgICAgIGVyclRleHQuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICAgICAgICAgXCJBbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgaGlkZGVuLCBpbmNsdWRlZCBjb2RlLiBTb3JyeSB3ZSBjYW4ndCBnaXZlIHlvdSBhIG1vcmUgaGVscGZ1bCBlcnJvciBtZXNzYWdlXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvckxpbmUgPiB0aGlzLnByb2dMaW5lcyArIHRoaXMucHJldGV4dExpbmVzKSB7XG4gICAgICAgICAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPSBgQW4gZXJyb3Igb2NjdXJyZWQgYWZ0ZXIgdGhlIGVuZCBvZiB5b3VyIGNvZGUuXG5PbmUgcG9zc2libGUgcmVhc29uIGlzIHRoYXQgeW91IGhhdmUgYW4gdW5jbG9zZWQgcGFyZW50aGVzaXMgb3Igc3RyaW5nLlxuQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBoaWRkZW4gdGVzdCBjb2RlLlxuWWV0IGFub3RoZXIgaXMgdGhhdCB0aGVyZSBpcyBhbiBpbnRlcm5hbCBlcnJvci4gIFRoZSBpbnRlcm5hbCBlcnJvciBtZXNzYWdlIGlzOiAke2Vyci5tZXNzYWdlfWA7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV0ZXh0TGluZXMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGVyci50cmFjZWJhY2tbMF0ubGluZW5vID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci50cmFjZWJhY2tbMF0ubGluZW5vIC0gdGhpcy5wcmV0ZXh0TGluZXMgKyAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyU3RyaW5nID0gZXJyLnRvU3RyaW5nKCk7XG4gICAgICAgIHZhciB0byA9IGVyclN0cmluZy5pbmRleE9mKFwiOlwiKTtcbiAgICAgICAgdmFyIGVyck5hbWUgPSBlcnJTdHJpbmcuc3Vic3RyaW5nKDAsIHRvKTtcbiAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPSBlcnJTdHJpbmc7XG4gICAgICAgICQodGhpcy5lQ29udGFpbmVyKS5hcHBlbmQoXCI8aDM+RGVzY3JpcHRpb248L2gzPlwiKTtcbiAgICAgICAgdmFyIGVyckRlc2MgPSB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIikpO1xuICAgICAgICBlcnJEZXNjLmlubmVySFRNTCA9IGVycm9yVGV4dFtlcnJOYW1lXTtcbiAgICAgICAgJCh0aGlzLmVDb250YWluZXIpLmFwcGVuZChcIjxoMz5UbyBGaXg8L2gzPlwiKTtcbiAgICAgICAgdmFyIGVyckZpeCA9IHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSk7XG4gICAgICAgIGVyckZpeC5pbm5lckhUTUwgPSBlcnJvclRleHRbZXJyTmFtZSArIFwiRml4XCJdO1xuICAgICAgICB2YXIgbW9yZUluZm8gPSBcIi4uL0Vycm9ySGVscC9cIiArIGVyck5hbWUudG9Mb3dlckNhc2UoKSArIFwiLmh0bWxcIjtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIlJ1bnRpbWUgRXJyb3I6IFwiICsgZXJyLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBzZXRUaW1lTGltaXQodGltZXIpIHtcbiAgICAgICAgdmFyIHRpbWVsaW1pdCA9IHRoaXMudGltZWxpbWl0O1xuICAgICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGltZWxpbWl0ID0gdGltZXI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IGV4ZWNMaW1pdCBpbiBtaWxsaXNlY29uZHMgIC0tIGZvciBzdHVkZW50IHByb2plY3RzIHNldCB0aGlzIHRvXG4gICAgICAgIC8vIDI1IHNlY29uZHMgLS0ganVzdCBsZXNzIHRoYW4gQ2hyb21lJ3Mgb3duIHRpbWVyLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvZGUuaW5kZXhPZihcIm9udGltZXJcIikgPiAtMSB8fFxuICAgICAgICAgICAgdGhpcy5jb2RlLmluZGV4T2YoXCJvbmNsaWNrXCIpID4gLTEgfHxcbiAgICAgICAgICAgIHRoaXMuY29kZS5pbmRleE9mKFwib25rZXlcIikgPiAtMSB8fFxuICAgICAgICAgICAgdGhpcy5jb2RlLmluZGV4T2YoXCJzZXREZWxheVwiKSA+IC0xXG4gICAgICAgICkge1xuICAgICAgICAgICAgU2suZXhlY0xpbWl0ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aW1lbGltaXQgPT09IFwib2ZmXCIpIHtcbiAgICAgICAgICAgICAgICBTay5leGVjTGltaXQgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lbGltaXQpIHtcbiAgICAgICAgICAgICAgICBTay5leGVjTGltaXQgPSB0aW1lbGltaXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIFNrLmV4ZWNMaW1pdCA9IDI1MDAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGJ1aWx0aW5SZWFkKHgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgU2suYnVpbHRpbkZpbGVzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIFNrLmJ1aWx0aW5GaWxlc1tcImZpbGVzXCJdW3hdID09PSB1bmRlZmluZWRcbiAgICAgICAgKVxuICAgICAgICAgICAgdGhyb3cgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfZmlsZV9ub3RfZm91bmRcIiwgeCk7XG4gICAgICAgIHJldHVybiBTay5idWlsdGluRmlsZXNbXCJmaWxlc1wiXVt4XTtcbiAgICB9XG4gICAgZmlsZVJlYWRlcihkaXZpZCkge1xuICAgICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRpdmlkKTtcbiAgICAgICAgbGV0IGRhdGEgPSBcIlwiO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgaWYgKGVsZW0gPT0gbnVsbCAmJiBTay5idWlsdGluRmlsZXMuZmlsZXMuaGFzT3duUHJvcGVydHkoZGl2aWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gU2suYnVpbHRpbkZpbGVzW1wiZmlsZXNcIl1bZGl2aWRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdHJ5IHJlbW90ZSBmaWxlIHVubGVzcyBpdCBlbmRzIHdpdGggLmpzIG9yIC5weSAtLSBvdGhlcndpc2Ugd2UnbGwgYXNrIHRoZSBzZXJ2ZXIgZm9yIGFsbFxuICAgICAgICAgICAgLy8ga2luZHMgb2YgbW9kdWxlcyB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gaW1wb3J0XG4gICAgICAgICAgICBpZiAoIShkaXZpZC5lbmRzV2l0aChcIi5qc1wiKSB8fCBkaXZpZC5lbmRzV2l0aChcIi5weVwiKSkpIHtcbiAgICAgICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgICAgICBhc3luYzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHVybDogYC9ydW5lc3RvbmUvYWpheC9nZXRfZGF0YWZpbGU/Y291cnNlX2lkPSR7ZUJvb2tDb25maWcuY291cnNlfSZhY2lkPSR7ZGl2aWR9YCxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoZGF0YSkuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbSA9PSBudWxsICYmIHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSU9FcnJvcihcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9ub19maWxlX29yX2RpclwiLCBkaXZpZClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwidGV4dGFyZWFcIikge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBlbGVtLnZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZWxlbS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgb3V0cHV0ZnVuKHRleHQpIHtcbiAgICAgICAgLy8gYm5tIHB5dGhvbiAzXG4gICAgICAgIHZhciBweVN0ciA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiW1wiICsgeC5qb2luKFwiLCBcIikgKyBcIl1cIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHZhciB4ID0gdGV4dDtcbiAgICAgICAgaWYgKCF0aGlzLnB5dGhvbjMpIHtcbiAgICAgICAgICAgIGlmICh4LmNoYXJBdCgwKSA9PSBcIihcIikge1xuICAgICAgICAgICAgICAgIHggPSB4LnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICB4ID0gXCJbXCIgKyB4ICsgXCJdXCI7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhsID0gZXZhbCh4KTtcbiAgICAgICAgICAgICAgICAgICAgeGwgPSB4bC5tYXAocHlTdHIpO1xuICAgICAgICAgICAgICAgICAgICB4ID0geGwuam9pbihcIiBcIik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xuICAgICAgICB0ZXh0ID0geDtcbiAgICAgICAgdGV4dCA9IHRleHRcbiAgICAgICAgICAgIC5yZXBsYWNlKC88L2csIFwiJmx0O1wiKVxuICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxuL2csIFwiPGJyLz5cIik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLmFwcGVuZCh0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZpbGV3cml0ZXIoZm9iaiwgYnl0ZXMpIHtcbiAgICAgICAgbGV0IGZpbGVjb21wb25lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb2JqLm5hbWUpO1xuICAgICAgICBpZiAoIWZpbGVjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgJChjb250YWluZXIpLmFkZENsYXNzKFwicnVuZXN0b25lXCIpO1xuICAgICAgICAgICAgbGV0IHRhYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAkKHRhYikuYWRkQ2xhc3MoXCJkYXRhZmlsZV9jYXB0aW9uXCIpO1xuICAgICAgICAgICAgdGFiLmlubmVySFRNTCA9IGBEYXRhIGZpbGU6IDxjb2RlPiR7Zm9iai5uYW1lfTwvY29kZT5gO1xuICAgICAgICAgICAgZmlsZWNvbXBvbmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcbiAgICAgICAgICAgIGZpbGVjb21wb25lbnQucm93cyA9IDEwO1xuICAgICAgICAgICAgZmlsZWNvbXBvbmVudC5jb2xzID0gNTA7XG4gICAgICAgICAgICBmaWxlY29tcG9uZW50LmlkID0gZm9iai5uYW1lO1xuICAgICAgICAgICAgJChmaWxlY29tcG9uZW50KS5jc3MoXCJtYXJnaW4tYm90dG9tXCIsIFwiNXB4XCIpO1xuICAgICAgICAgICAgJChmaWxlY29tcG9uZW50KS5hZGRDbGFzcyhcImFjX291dHB1dFwiKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWIpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGZpbGVjb21wb25lbnQpO1xuICAgICAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvYmoucG9zJCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgJChmaWxlY29tcG9uZW50KS52YWwoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSAkKGZpbGVjb21wb25lbnQpLnZhbCgpO1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudCArIGJ5dGVzLnY7XG4gICAgICAgICQoZmlsZWNvbXBvbmVudCkudmFsKGN1cnJlbnQpO1xuICAgICAgICAkKGZpbGVjb21wb25lbnQpLmNzcyhcImRpc3BsYXlcIiwgXCJibG9ja1wiKTtcbiAgICAgICAgZm9iai5wb3MkID0gY3VycmVudC5sZW5ndGg7XG4gICAgICAgIHJldHVybiBjdXJyZW50Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRJbmNsdWRlZENvZGUoZGl2aWQpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5lZExpc3RbZGl2aWRdKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmVkTGlzdFtkaXZpZF0uZWRpdG9yLmdldFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KFxuICAgICAgICAgICAgICAgIGAvcnVuZXN0b25lL2FqYXgvZ2V0X2RhdGFmaWxlP2NvdXJzZV9pZD0ke2VCb29rQ29uZmlnLmNvdXJzZX0mYWNpZD0ke2RpdmlkfWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCB3cmVzdWx0ID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG4gICAgICAgICAgICBsZXQgb2JqID0gYXdhaXQgd3Jlc3VsdC5qc29uKCk7XG4gICAgICAgICAgICByZXR1cm4gb2JqLmRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBidWlsZFByb2codXNlU3VmZml4KSB7XG4gICAgICAgIC8vIGFzc2VtYmxlIGNvZGUgZnJvbSBwcmVmaXgsIHN1ZmZpeCwgYW5kIGVkaXRvciBmb3IgcnVubmluZy5cbiAgICAgICAgdmFyIHByZXRleHQ7XG4gICAgICAgIHZhciBwcm9nID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSArIFwiXFxuXCI7XG4gICAgICAgIGlmICh0aGlzLnByZWZpeCkge1xuICAgICAgICAgICAgcHJvZyA9IHRoaXMucHJlZml4ICsgcHJvZztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXRleHQgPSBcIlwiO1xuICAgICAgICB0aGlzLnByZXRleHRMaW5lcyA9IDA7XG4gICAgICAgIHRoaXMucHJvZ0xpbmVzID0gcHJvZy5tYXRjaCgvXFxuL2cpLmxlbmd0aCArIDE7XG4gICAgICAgIGlmICh0aGlzLmluY2x1ZGVzKSB7XG4gICAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGluY2x1ZGVzLCBpbi1vcmRlciBwcmVwZW5kaW5nIHRvIHByb2dcbiAgICAgICAgICAgIHByZXRleHQgPSBcIlwiO1xuICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLmluY2x1ZGVzLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlDb2RlID0gYXdhaXQgdGhpcy5nZXRJbmNsdWRlZENvZGUodGhpcy5pbmNsdWRlc1t4XSk7XG4gICAgICAgICAgICAgICAgcHJldGV4dCA9IHByZXRleHQgKyBpQ29kZSArIFwiXFxuXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByZXRleHQgPSBwcmV0ZXh0O1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldGV4dCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldGV4dExpbmVzID0gKHRoaXMucHJldGV4dC5tYXRjaCgvXFxuL2cpIHx8IFwiXCIpLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2cgPSBwcmV0ZXh0ICsgcHJvZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlU3VmZml4ICYmIHRoaXMuc3VmZml4KSB7XG4gICAgICAgICAgICBwcm9nID0gcHJvZyArIHRoaXMuc3VmZml4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocHJvZyk7XG4gICAgfVxuXG4gICAgYXN5bmMgbWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciA9PT0gbnVsbCAmJiAhdGhpcy5hdXRvcnVuKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkZEhpc3RvcnlTY3J1YmJlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeVNjcnViYmVyICYmXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnlbJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIildICE9XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh0aGlzLmVkaXRvci5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wcy5wdXNoKG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKSk7XG4gICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXG4gICAgICAgICAgICAgICAgXCJvcHRpb25cIixcbiAgICAgICAgICAgICAgICBcIm1heFwiLFxuICAgICAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFxuICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiLFxuICAgICAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zbGlkZWl0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzYXZlQ29kZSA9IFwiRmFsc2VcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oaXN0b3J5U2NydWJiZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgc2F2ZUNvZGUgPSBcIkZhbHNlXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhdmVDb2RlO1xuICAgIH1cblxuICAgIGFzeW5jIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuUHJvZygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgZXJyb3IgcnVubmluZyBjb2RlICR7ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgY29kZTogdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgIGxhbmc6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgICAgICBlcnJpbmZvOiB0aGlzLmVycmluZm8sXG4gICAgICAgICAgICB0b19zYXZlOiB0aGlzLnNhdmVDb2RlLFxuICAgICAgICAgICAgcHJlZml4OiB0aGlzLnByZXRleHQsXG4gICAgICAgICAgICBzdWZmaXg6IHRoaXMuc3VmZml4LFxuICAgICAgICAgICAgcGFydG5lcjogdGhpcy5wYXJ0bmVyLFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5kaXZpZCwgZGF0YVsnY29kZSddKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMubG9nUnVuRXZlbnQoZGF0YSk7IC8vIExvZyB0aGUgcnVuIGV2ZW50XG4gICAgICAgIC8vIElmIHVuaXQgdGVzdHMgd2VyZSBydW4gdGhlcmUgd2lsbCBiZSBhIHVuaXRfcmVzdWx0c1xuICAgICAgICBpZiAodGhpcy51bml0X3Jlc3VsdHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBhY3Q6IHRoaXMudW5pdF9yZXN1bHRzLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICBldmVudDogXCJ1bml0dGVzdFwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJGZWVkYmFjaygpIHtcbiAgICAgICAgLy8gVGhlIHB5dGhvbiB1bml0IHRlc3QgY29kZSBidWlsZHMgdGhlIHRhYmxlIGFzIGl0IGlzIHJ1bm5pbmcgdGhlIHRlc3RzXG4gICAgICAgIC8vIEluIFwibm9ybWFsXCIgdXNhZ2UgdGhpcyBpcyBkaXNwbGF5ZWQgaW1tZWRpYXRlbHkuXG4gICAgICAgIC8vIEhvd2V2ZXIgaW4gZXhhbSBtb2RlIHdlIG1ha2UgYSBkaXYgd2hpY2ggaXMgb2Zmc2NyZWVuXG4gICAgICAgIGlmICh0aGlzLnVuaXRfcmVzdWx0c19kaXZpZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzX2RpdmlkLmluZGV4T2YoXCJfb2Zmc2NyZWVuX1wiKSA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgdXJEaXZpZCA9IGAke3RoaXMuZGl2aWR9X29mZnNjcmVlbl91bml0X3Jlc3VsdHNgO1xuICAgICAgICAgICAgICAgIGxldCB1bml0RmVlZGJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh1ckRpdmlkKTtcbiAgICAgICAgICAgICAgICBsZXQgdG1wID0gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh1bml0RmVlZGJhY2spO1xuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMub3V0ZXJEaXYpLmZpbmQoYCMke3VyRGl2aWR9YCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0bXAgPSAkKHRoaXMub3V0ZXJEaXYpLmZpbmQoYCMke3VyRGl2aWR9YClbMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZCh0bXApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkKHRtcCkuc2hvdygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdXJEaXZpZCA9IHRoaXMuZGl2aWQgKyBcIl91bml0X3Jlc3VsdHNcIjtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5vdXRlckRpdikuZmluZChgIyR7dXJEaXZpZH1gKS5sZW5ndGggPT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLmZpbmQoYCMke3VyRGl2aWR9X29mZnNjcmVlbl91bml0X3Jlc3VsdHNgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCA9PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1clJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh1ckRpdmlkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZCh1clJlc3VsdHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qIHJ1blByb2cgaGFzIHNldmVyYWwgYXN5bmMgZWxlbWVudHMgdG8gaXQuXG4gICAgICogMS4gU2t1bHB0IHJ1bnMgdGhlIHB5dGhvbiBwcm9ncmFtIGFzeW5jaHJvbm91c2x5XG4gICAgICogMi4gVGhlIGhpc3RvcnkgaXMgcmVzdG9yZWQgYXN5bmNocm9ub3VzbHlcbiAgICAgKiAzLiBMb2dnaW5nIGlzIGFzeW5jaHJvbm91c1xuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2t1bHB0IFByb21pc2UgYW5kIHNvIHRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZSB3aGVuIHNrdWxwdCBpcyBmaW5pc2hlZC5cbiAgICAgKiB3aGVuIGZpbmlzaGVkIHRoaXMudW5pdF9yZXN1bHRzIHdpbGwgY29udGFpbiB0aGUgcmVzdWx0cyBvZiBhbnkgdW5pdCB0ZXN0cyB0aGF0IGhhdmUgYmVlbiBydW4uXG4gICAgICogVGhlIHRhYmxlIG9mIHJlc3VsdHMgaXMgY29uc3RydWN0ZWQgYW5kIGFkZGVkIHRvIHRoZSBET00gYnkgdGhlIHB5dGhvbiB1bml0dGVzdC5ndWkgbW9kdWxlIGluIHNrdWxwdC5cbiAgICAgKlxuICAgICAqL1xuICAgIGFzeW5jIHJ1blByb2cobm9VSSwgbG9nUmVzdWx0cykge1xuICAgICAgICBjb25zb2xlLmxvZyhcInN0YXJ0aW5nIHJ1blByb2dcIik7XG4gICAgICAgIGlmICh0eXBlb2YgbG9nUmVzdWx0cyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nUmVzdWx0cyA9IGxvZ1Jlc3VsdHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBub1VJICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgbm9VSSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9nID0gYXdhaXQgdGhpcy5idWlsZFByb2codHJ1ZSk7XG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcIlwiKTtcbiAgICAgICAgd2hpbGUgKCQoYCMke3RoaXMuZGl2aWR9X2VycmluZm9gKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAkKGAjJHt0aGlzLmRpdmlkfV9lcnJpbmZvYCkucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8kKHRoaXMuZUNvbnRhaW5lcikucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLmNvZGVsZW5zKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jbEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zXCIpO1xuICAgICAgICB9XG4gICAgICAgIFNrLmNvbmZpZ3VyZSh7XG4gICAgICAgICAgICBvdXRwdXQ6IHRoaXMub3V0cHV0ZnVuLmJpbmQodGhpcyksXG4gICAgICAgICAgICByZWFkOiB0aGlzLmZpbGVSZWFkZXIsXG4gICAgICAgICAgICBmaWxld3JpdGU6IHRoaXMuZmlsZXdyaXRlci5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgX19mdXR1cmVfXzogU2sucHl0aG9uMyxcbiAgICAgICAgICAgIG5vbnJlYWRvcGVuOiB0cnVlLFxuICAgICAgICAgICAgLy8gICAgICAgIHB5dGhvbjM6IHRoaXMucHl0aG9uMyxcbiAgICAgICAgICAgIGltYWdlUHJveHk6IFwiaHR0cDovL2ltYWdlLnJ1bmVzdG9uZS5hY2FkZW15OjgwODAvMzIweFwiLFxuICAgICAgICAgICAgaW5wdXRmdW5UYWtlc1Byb21wdDogdHJ1ZSxcbiAgICAgICAgICAgIGpzb25wU2l0ZXM6IFtcImh0dHBzOi8vaXR1bmVzLmFwcGxlLmNvbVwiXSxcbiAgICAgICAgfSk7XG4gICAgICAgIFNrLmRpdmlkID0gdGhpcy5kaXZpZDtcbiAgICAgICAgU2subG9nUmVzdWx0cyA9IGxvZ1Jlc3VsdHM7XG5cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5kaXZpZCx0aGlzLmNvZGUpO1xuXG4gICAgICAgIGlmICh0aGlzLmdyYWRlcmFjdGl2ZSAmJiB0aGlzLm91dGVyRGl2LmNsb3Nlc3QoXCIubG9hZGluZ1wiKSkge1xuICAgICAgICAgICAgU2suZ3JhZGVDb250YWluZXIgPSB0aGlzLm91dGVyRGl2LmNsb3Nlc3QoXCIubG9hZGluZ1wiKS5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFNrLmdyYWRlQ29udGFpbmVyID0gdGhpcy5kaXZpZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFRpbWVMaW1pdCgpO1xuICAgICAgICAoU2suVHVydGxlR3JhcGhpY3MgfHwgKFNrLlR1cnRsZUdyYXBoaWNzID0ge30pKS50YXJnZXQgPSB0aGlzLmdyYXBoaWNzO1xuICAgICAgICBTay5jYW52YXMgPSB0aGlzLmdyYXBoaWNzLmlkOyAvL3RvZG86IGdldCByaWQgb2YgdGhpcyBoZXJlIGFuZCBpbiBpbWFnZVxuICAgICAgICBpZiAoIW5vVUkpIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBhd2FpdCB0aGlzLm1hbmFnZV9zY3J1YmJlcih0aGlzLnNhdmVDb2RlKTtcbiAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikub2ZmKFwic2xpZGVjaGFuZ2VcIik7XG4gICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXCJkaXNhYmxlXCIpO1xuICAgICAgICAgICAgJCh0aGlzLm91dERpdikuc2hvdyh7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDcwMCxcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgU2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2UoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTay5pbXBvcnRNYWluV2l0aEJvZHkoXCI8c3RkaW4+XCIsIGZhbHNlLCBwcm9nLCB0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFub1VJKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVpdCkge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5vbihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2xpZGVjaGFuZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImVuYWJsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXJyTGFzdFJ1biA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5lcnJpbmZvID0gXCJzdWNjZXNzXCI7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFub1VJKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikub24oXG4gICAgICAgICAgICAgICAgICAgIFwic2xpZGVjaGFuZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZWl0LmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImVuYWJsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IGVyci50b1N0cmluZygpO1xuICAgICAgICAgICAgdGhpcy5hZGRFcnJvck1lc3NhZ2UoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmFsbFZpc3VhbGl6ZXJzICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAkLmVhY2god2luZG93LmFsbFZpc3VhbGl6ZXJzLCBmdW5jdGlvbiAoaSwgZSkge1xuICAgICAgICAgICAgICAgICAgICBlLnJlZHJhd0Nvbm5lY3RvcnMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc2FibGVJbnRlcmFjdGlvbigpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikuaGlkZSgpO1xuICAgICAgICAkKHRoaXMuY29kZURpdikuYWRkQ2xhc3MoXCJhYy1kaXNhYmxlZFwiKTtcbiAgICB9XG59XG5cbnZhciBsYW5ndWFnZUV4dGVuc2lvbnMgPSB7XG4gICAgcHl0aG9uOiBcInB5XCIsXG4gICAgaHRtbDogXCJodG1sXCIsXG4gICAgamF2YXNjcmlwdDogXCJqc1wiLFxuICAgIGphdmE6IFwiamF2YVwiLFxuICAgIHB5dGhvbjI6IFwicHlcIixcbiAgICBweXRob24zOiBcInB5XCIsXG4gICAgY3BwOiBcImNwcFwiLFxuICAgIGM6IFwiY1wiLFxuICAgIHNxbDogXCJzcWxcIixcbiAgICBvY3RhdmU6IFwibVwiLFxufTtcblxudmFyIGVycm9yVGV4dCA9IHt9O1xuXG5lcnJvclRleHQuUGFyc2VFcnJvciA9ICQuaTE4bihcIm1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlBhcnNlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfc2N0aXZlY29kZV9wYXJzZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuVHlwZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvclwiKTtcbmVycm9yVGV4dC5UeXBlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5OYW1lRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yXCIpO1xuZXJyb3JUZXh0Lk5hbWVFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlZhbHVlRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvclwiKTtcbmVycm9yVGV4dC5WYWx1ZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkF0dHJpYnV0ZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkF0dHJpYnV0ZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5Ub2tlbkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdG9rZW5fZXJyb3JcIik7XG5lcnJvclRleHQuVG9rZW5FcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5UaW1lTGltaXRFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3JcIik7XG5lcnJvclRleHQuVGltZUxpbWl0RXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3JcIik7XG5lcnJvclRleHQuRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5TeW50YXhFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvclwiKTtcbmVycm9yVGV4dC5TeW50YXhFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuSW5kZXhFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yXCIpO1xuZXJyb3JUZXh0LkluZGV4RXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuVVJJRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV91cmlfZXJyb3JcIik7XG5lcnJvclRleHQuVVJJRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV91cmlfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkltcG9ydEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yXCIpO1xuZXJyb3JUZXh0LkltcG9ydEVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5SZWZlcmVuY2VFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvclwiKTtcbmVycm9yVGV4dC5SZWZlcmVuY2VFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuWmVyb0RpdmlzaW9uRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yXCIpO1xuZXJyb3JUZXh0Llplcm9EaXZpc2lvbkVycm9yRml4ID0gJC5pMThuKFxuICAgIFwibXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvcl9maXhcIlxuKTtcbmVycm9yVGV4dC5SYW5nZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3JcIik7XG5lcnJvclRleHQuUmFuZ2VFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5JbnRlcm5hbEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3JcIik7XG5lcnJvclRleHQuSW50ZXJuYWxFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5JbmRlbnRhdGlvbkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3JcIik7XG5lcnJvclRleHQuSW5kZW50YXRpb25FcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5Ob3RJbXBsZW1lbnRlZEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yXCIpO1xuZXJyb3JUZXh0Lk5vdEltcGxlbWVudGVkRXJyb3JGaXggPSAkLmkxOG4oXG4gICAgXCJtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3JfZml4XCJcbik7XG5lcnJvclRleHQuS2V5RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3JcIik7XG5lcnJvclRleHQuS2V5RXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkFzc2VydGlvbkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkFzc2VydGlvbkVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yX2ZpeFwiKTtcblxuU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsID0gZnVuY3Rpb24gKHRhcmdldCwgcmVwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5zcGxpdCh0YXJnZXQpLmpvaW4ocmVwbGFjZW1lbnQpO1xufTtcbiIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyeXRob25BY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgb3B0cy5hbGlnblZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5weXRob24zX2ludGVycHJldGVyID0gJChvcmlnKS5kYXRhKFwicHl0aG9uM19pbnRlcnByZXRlclwiKTtcbiAgICAgICAgdGhpcy5vdXRwdXRfaGVpZ2h0ID0gJChvcmlnKS5kYXRhKFwib3V0cHV0X2hlaWdodFwiKTtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikudGV4dChcIlJlbmRlclwiKTtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodGhpcy5jb2RlKTtcbiAgICB9XG5cbiAgICBhc3luYyBydW5Qcm9nKCkge1xuICAgICAgICB2YXIgcHJvZyA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKHRydWUpO1xuICAgICAgICBsZXQgc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcIlwiKTtcbiAgICAgICAgaWYgKCF0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgICAgICAgICQodGhpcy5jb2RlRGl2KS5zd2l0Y2hDbGFzcyhcImNvbC1tZC0xMlwiLCBcImNvbC1tZC02XCIsIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coeyBkdXJhdGlvbjogNzAwLCBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIHByb2cgPSBgXG4gICAgICAgIDxodG1sPlxuICAgICAgICA8aGVhZD5cbiAgICAgICAgICAgIDxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vYnJ5dGhvbkAzLjkuNS9icnl0aG9uLm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgICAgICAgICAgPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9icnl0aG9uQDMuOS41L2JyeXRob25fc3RkbGliLm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgICAgICAgICAgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCIvL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9oaWdobGlnaHQuanMvMTEuMC4xL3N0eWxlcy9kZWZhdWx0Lm1pbi5jc3NcIj5cbiAgICAgICAgICAgIDxzY3JpcHQgc3JjPVwiLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaGlnaGxpZ2h0LmpzLzExLjAuMS9oaWdobGlnaHQubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgICAgICAgICA8c3R5bGU+XG4gICAgICAgICAgICAgICAgaHRtbCwgYm9keXtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBtYXgtY29udGVudDsgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC5jb250YWluZXItcHJle1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsgZm9udC1zaXplOiAxM3B4OyBsaW5lLWhlaWdodDogMS40Mjg1NzE0MzsgYm9yZGVyOiAxcHggc29saWQgI2NjYzsgYm9yZGVyLXJhZGl1czogNHB4OyB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsgYm90dG9tOiAwcHg7IHdpZHRoOiA5NCU7IG1heC13aWR0aDogOTYlOyBtYXgtaGVpZ2h0OiAyMDBweDsgb3ZlcmZsb3c6IGF1dG87IGNsZWFyOiBib3RoOyByZXNpemU6IGJvdGg7IHRyYW5zZm9ybTogc2NhbGUoMSwgLTEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmUge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogc3RpY2t5OyBwYWRkaW5nOiAxMnB4OyB0cmFuc2Zvcm06IHNjYWxlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29kZXtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvc3R5bGU+XG4gICAgICAgIDwvaGVhZD5cbiAgICAgICAgPGJvZHkgb25sb2FkPSdicnl0aG9uKCknPlxuICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSd0ZXh0L3B5dGhvbic+XG5pbXBvcnQgc3lzXG5mcm9tIGJyb3dzZXIgaW1wb3J0IGRvY3VtZW50LCBodG1sXG5pbXBvcnQgdHJhY2ViYWNrXG5wcmVFbGVtID0gaHRtbC5QUkUoKVxubG9nZ2VyID0gaHRtbC5DT0RFKClcbmNvbnRhaW5lciA9IGh0bWwuRElWKClcbmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY29udGFpbmVyLXByZVwiKVxucHJlRWxlbSA8PSBsb2dnZXJcbmNvbnRhaW5lciA8PSBwcmVFbGVtXG5jbGFzcyBOZXdPdXQ6XG4gICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOlxuICAgICAgICBsb2dnZXIuaW5uZXJIVE1MICs9IHN0cihkYXRhKVxuICAgICAgICBjb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiXG5zeXMuc3RkZXJyID0gc3lzLnN0ZG91dCA9IE5ld091dCgpXG5kZWYgbXlfZXhlYyhjb2RlKTpcbiAgICB0cnk6XG4gICAgICAgIGV4ZWMoY29kZSwgbG9jYWxzKCkpXG4gICAgICAgIG91dF9oZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dFwiKVxuICAgICAgICBvdXRfaGVhZGVyLmlubmVySFRNTCA9IFwiT3V0cHV0XCJcbiAgICAgICAgb3V0X2hlYWRlci5zdHlsZS5mb250ID0gXCIyNHB4ICdBcmlhbCdcIlxuICAgICAgICBsb2dnZXIuY2xhc3NMaXN0LmFkZChcInBsYWludGV4dFwiKVxuICAgICAgICBwcmVFbGVtLnByZXBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKVxuICAgICAgICBwcmVFbGVtLnByZXBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKVxuICAgICAgICBwcmVFbGVtLnByZXBlbmQob3V0X2hlYWRlcilcbiAgICAgICAgZG9jdW1lbnQgPD0gY29udGFpbmVyXG4gICAgZXhjZXB0IFN5bnRheEVycm9yIGFzIGVycjpcbiAgICAgICAgZXJyb3JfY2xhc3MgPSBlcnIuX19jbGFzc19fLl9fbmFtZV9fXG4gICAgICAgIGRldGFpbCA9IGVyci5hcmdzWzBdXG4gICAgICAgIGxpbmVfbnVtYmVyID0gZlwiYXQgbGluZSB7ZXJyLmxpbmVub31cIlxuICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uIGFzIGVycjpcbiAgICAgICAgZXJyb3JfY2xhc3MgPSBlcnIuX19jbGFzc19fLl9fbmFtZV9fXG4gICAgICAgIGRldGFpbCA9IGVyci5hcmdzWzBdXG4gICAgICAgIGNsLCBleGMsIHRiID0gc3lzLmV4Y19pbmZvKClcbiAgICAgICAgIyBXaGVuIGVycm9ycyBkb24ndCBzcGVjaWZ5IGEgbGluZVxuICAgICAgICB0cnk6XG4gICAgICAgICAgICBsaW5lX251bWJlciA9IGZcImF0IGxpbmUge3RyYWNlYmFjay5leHRyYWN0X3RiKHRiKVstMV1bMV19XCJcbiAgICAgICAgZXhjZXB0OlxuICAgICAgICAgICAgbGluZV9udW1iZXIgPSBcIlwiXG4gICAgZWxzZTpcbiAgICAgICAgcmV0dXJuXG4gICAgXG4gICAgIyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBhbiBFeGNlcHRpb24gd2FzIGNhdGNoZWRcbiAgICByZXN1bHQgPSBmXCIne2Vycm9yX2NsYXNzfSc6IHtkZXRhaWx9IHtsaW5lX251bWJlcn1cIlxuICAgIHByaW50KHJlc3VsdClcbiAgICAjIFN0eWxpbmcgdGhlIHByZSBlbGVtZW50IGZvciBlcnJvclxuICAgIGVycm9yX2hlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoM1wiKVxuICAgIGVycm9yX2hlYWRlci5pbm5lckhUTUwgPSBcIkVycm9yXCJcbiAgICBlcnJvcl9oZWFkZXIuc3R5bGUuZm9udCA9IFwiMjRweCAnQXJpYWwnXCJcbiAgICBwcmVFbGVtLnByZXBlbmQoZXJyb3JfaGVhZGVyKVxuICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIiNmMmRlZGVcIlxuICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXIgPSBcIjFweCBzb2xpZCAjZWJjY2QxXCJcbiAgICBsb2dnZXIuY2xhc3NMaXN0LmFkZChcInBsYWludGV4dFwiKVxuICAgIGRvY3VtZW50IDw9IGNvbnRhaW5lclxubXlfcHJvZyA9ICR7SlNPTi5zdHJpbmdpZnkocHJvZyl9XG5teV9leGVjKG15X3Byb2cpXG5kb2N1bWVudCA8PSBodG1sLlNDUklQVChcImhsanMuaGlnaGxpZ2h0QWxsKCk7XCIpXG5kb2N1bWVudCA8PSBodG1sLlNDUklQVChcImxldCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29udGFpbmVyLXByZScpOyBsZXQgaGVpZ2h0ID0gY29udGFpbmVyLm9mZnNldEhlaWdodDsgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nQm90dG9tID0gU3RyaW5nKGhlaWdodCkrJ3B4JztcIilcbiAgICAgICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8L2JvZHk+XG4gICAgICAgIDwvaHRtbD5cbiAgICAgICAgYDtcbiAgICAgICAgdGhpcy5vdXRwdXQuc3JjZG9jID0gcHJvZztcbiAgICB9XG5cbiAgICBjcmVhdGVPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHZhciBvdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJhY19vdXRwdXRcIik7XG4gICAgICAgIGlmICh0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC01XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3V0cHV0X2hlaWdodCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0X2hlaWdodCA9IFwiNDAwcHhcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3V0RGl2ID0gb3V0RGl2O1xuICAgICAgICB0aGlzLm91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJ3aGl0ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwiaGVpZ2h0XCIsICQodGhpcy5vdXRwdXRfaGVpZ2h0KSk7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcIndpZHRoXCIsIFwiMTAwJVwiKTtcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMub3V0cHV0KTtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChvdXREaXYpO1xuICAgICAgICB2YXIgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgIH1cbiAgICBlbmFibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZW5kZXJcIikpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhUTUxBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgb3B0cy5hbGlnblZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb2RlID0gJChcIjx0ZXh0YXJlYSAvPlwiKS5odG1sKHRoaXMub3JpZ0VsZW0uaW5uZXJIVE1MKS50ZXh0KCk7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoXCJSZW5kZXJcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuY29kZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgbGV0IHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBhd2FpdCB0aGlzLm1hbmFnZV9zY3J1YmJlcihzYXZlQ29kZSk7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQoXCJcIik7XG4gICAgICAgIGlmICghdGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICAgICAgICAkKHRoaXMuY29kZURpdikuc3dpdGNoQ2xhc3MoXCJjb2wtbWQtMTJcIiwgXCJjb2wtbWQtNlwiLCB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICBwcm9nID1cbiAgICAgICAgICAgIFwiPHNjcmlwdCB0eXBlPXRleHQvamF2YXNjcmlwdD53aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uKG1zZyx1cmwsbGluZSkge2FsZXJ0KG1zZysnIG9uIGxpbmU6ICcrbGluZSk7fTs8L3NjcmlwdD5cIiArXG4gICAgICAgICAgICBwcm9nO1xuICAgICAgICB0aGlzLm91dHB1dC5zcmNkb2MgPSBwcm9nO1xuICAgIH1cblxuICAgIGNyZWF0ZU91dHB1dCgpIHtcbiAgICAgICAgdGhpcy5hbGlnblZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgdmFyIG91dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImFjX291dHB1dFwiKTtcbiAgICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiY29sLW1kLTVcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXREaXYgPSBvdXREaXY7XG4gICAgICAgIHRoaXMub3V0cHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBcIndoaXRlXCIpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJoZWlnaHRcIiwgXCI0MDBweFwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICBvdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5vdXRwdXQpO1xuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKG91dERpdik7XG4gICAgICAgIHZhciBjbGVhckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoY2xlYXJEaXYpLmNzcyhcImNsZWFyXCIsIFwiYm90aFwiKTsgLy8gbmVlZGVkIHRvIG1ha2UgcGFyZW50IGRpdiByZXNpemUgcHJvcGVybHlcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjbGVhckRpdik7XG4gICAgfVxuICAgIGVuYWJsZVNhdmVMb2FkKCkge1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JlbmRlclwiKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSlNBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICB9XG4gICAgb3V0cHV0ZnVuKGEpIHtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XG4gICAgICAgIHZhciBzdHIgPSBcIltcIjtcbiAgICAgICAgaWYgKHR5cGVvZiBhID09IFwib2JqZWN0XCIgJiYgYS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFbaV0gPT0gXCJvYmplY3RcIiAmJiBhW2ldLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gKGkgPT0gMCA/IFwiXCIgOiBcIiBcIikgKyBcIltcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhW2ldLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtpXVtqXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogPT0gYVtpXS5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJdXCIgKyAoaSA9PSBhLmxlbmd0aCAtIDEgPyBcIl1cIiA6IFwiLFwiKSArIFwiXFxuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIiwgXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBzdHIgKz0gYVtpXSArIChpID09IGEubGVuZ3RoIC0gMSA/IFwiXVwiIDogXCIsIFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3RyID0gSlNPTi5zdHJpbmdpZnkoYSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgc3RyID0gYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBhc3luYyBydW5Qcm9nKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcHJvZyA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKHRydWUpO1xuICAgICAgICB2YXIgc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgdmFyIHdyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgX3RoaXMub3V0cHV0LmlubmVySFRNTCArPSBfdGhpcy5vdXRwdXRmdW4oc3RyKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHdyaXRlbG4gPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICBpZiAoIXN0cikgc3RyID0gXCJcIjtcbiAgICAgICAgICAgIF90aGlzLm91dHB1dC5pbm5lckhUTUwgKz0gX3RoaXMub3V0cHV0ZnVuKHN0cikgKyBcIjxiciAvPlwiO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpO1xuICAgICAgICAkKHRoaXMuZUNvbnRhaW5lcikucmVtb3ZlKCk7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQoXCJcIik7XG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coeyBkdXJhdGlvbjogNzAwLCBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBldmFsKHByb2cpO1xuICAgICAgICAgICAgdGhpcy5lcnJpbmZvID0gXCJzdWNjZXNzXCI7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXJyb3JNZXNzYWdlKGUpO1xuICAgICAgICAgICAgdGhpcy5lcnJpbmZvID0gZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEVycm9yTWVzc2FnZShlcnIpIHtcbiAgICAgICAgLy8gQWRkIHRoZSBlcnJvciBtZXNzYWdlXG4gICAgICAgIHRoaXMuZXJyTGFzdFJ1biA9IHRydWU7XG4gICAgICAgIHZhciBlcnJIZWFkID0gJChcIjxoMz5cIikuaHRtbChcIkVycm9yXCIpO1xuICAgICAgICB0aGlzLmVDb250YWluZXIgPSB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmVDb250YWluZXIuY2xhc3NOYW1lID0gXCJlcnJvciBhbGVydCBhbGVydC1kYW5nZXJcIjtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmlkID0gdGhpcy5kaXZpZCArIFwiX2VycmluZm9cIjtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKGVyckhlYWRbMF0pO1xuICAgICAgICB2YXIgZXJyVGV4dCA9IHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIilcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIGVyclN0cmluZyA9IGVyci50b1N0cmluZygpO1xuICAgICAgICBlcnJUZXh0LmlubmVySFRNTCA9IGVyclN0cmluZztcbiAgICAgICAgY29uc29sZS5sb2coXCJSdW50aW1lIEVycm9yOiBcIiArIGVyci50b1N0cmluZygpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuaW1wb3J0IEhhbmRzb250YWJsZSBmcm9tIFwiaGFuZHNvbnRhYmxlXCI7XG5pbXBvcnQgJ2hhbmRzb250YWJsZS9kaXN0L2hhbmRzb250YWJsZS5mdWxsLmNzcyc7XG5pbXBvcnQgaW5pdFNxbEpzIGZyb20gXCJzcWwuanMvZGlzdC9zcWwtd2FzbS5qc1wiO1xuXG52YXIgYWxsRGJ1cmxzID0ge307XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNRTEFjdGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICAvLyAgZm5wcmVmaXggc2V0cyB0aGUgcGF0aCB0byBsb2FkIHRoZSBzcWwtd2FzbS53YXNtIGZpbGVcbiAgICAgICAgdmFyIGJvb2twcmVmaXg7XG4gICAgICAgIHZhciBmbnByZWZpeDtcbiAgICAgICAgaWYgKGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XG4gICAgICAgICAgICBib29rcHJlZml4ID0gYCR7ZUJvb2tDb25maWcuYXBwfS9ib29rcy9wdWJsaXNoZWQvJHtlQm9va0NvbmZpZy5iYXNlY291cnNlfWA7XG4gICAgICAgICAgICBmbnByZWZpeCA9IGJvb2twcmVmaXggKyBcIi9fc3RhdGljXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib29rcHJlZml4ID0gXCJcIjtcbiAgICAgICAgICAgIGZucHJlZml4ID0gXCIvX3N0YXRpY1wiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgICAgICAgbG9jYXRlRmlsZTogKGZpbGVuYW1lKSA9PiBgJHtmbnByZWZpeH0vJHtmaWxlbmFtZX1gLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNob3dMYXN0ID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwic2hvd2xhc3RzcWxcIik7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgaW5pdFNxbEpzKHRoaXMuY29uZmlnKS50aGVuKGZ1bmN0aW9uIChTUUwpIHtcbiAgICAgICAgICAgIC8vIHNldCB1cCBjYWxsIHRvIGxvYWQgZGF0YWJhc2UgYXN5bmNocm9ub3VzbHkgaWYgZ2l2ZW5cbiAgICAgICAgICAgIGlmIChzZWxmLmRidXJsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuZGJ1cmwuc3RhcnRzV2l0aChcIi9fc3RhdGljXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGJ1cmwgPSBgJHtib29rcHJlZml4fSR7c2VsZi5kYnVybH1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uVGV4dCA9ICQoc2VsZi5ydW5CdXR0b24pLnRleHQoKTtcbiAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2xvYWRfZGJcIikpO1xuICAgICAgICAgICAgICAgIGlmICghKHNlbGYuZGJ1cmwgaW4gYWxsRGJ1cmxzKSkge1xuICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwibG9hZGluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgeFdhaXRGb3I6IGpRdWVyeS5EZWZlcnJlZCgpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxEYnVybHNbc2VsZi5kYnVybF0uc3RhdHVzID09IFwibG9hZGluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0ueFdhaXRGb3IuZG9uZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYiA9IG5ldyBTUUwuRGF0YWJhc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5kYlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnRleHQoYnV0dG9uVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZWxmLmRiID0gbmV3IFNRTC5EYXRhYmFzZShhbGxEYnVybHNbc2VsZi5kYnVybF0uZGIpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnRleHQoYnV0dG9uVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBodHRwczovL2dpdGh1Yi5jb20vbGVyb2NoYS9jaGlub29rLWRhdGFiYXNlL3Jhdy9tYXN0ZXIvQ2hpbm9va0RhdGFiYXNlL0RhdGFTb3VyY2VzL0NoaW5vb2tfU3FsaXRlLnNxbGl0ZVxuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIHNlbGYuZGJ1cmwsIHRydWUpO1xuICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XG4gICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1SW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYiA9IG5ldyBTUUwuRGF0YWJhc2UodUludDhBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnRleHQoYnV0dG9uVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLmRiID0gdUludDhBcnJheTtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnN0YXR1cyA9IFwicmVhZHlcIjtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnhXYWl0Rm9yLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29udGVudHMgaXMgbm93IFt7Y29sdW1uczpbJ2NvbDEnLCdjb2wyJywuLi5dLCB2YWx1ZXM6W1tmaXJzdCByb3ddLCBbc2Vjb25kIHJvd10sIC4uLl19XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VsZi5kYiA9IG5ldyBTUUwuRGF0YWJhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHJ1blByb2cobm9VSSwgbG9nUmVzdWx0cykge1xuICAgICAgICBpZiAodHlwZW9mIGxvZ1Jlc3VsdHMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nUmVzdWx0cyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSBsb2dSZXN1bHRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygbm9VSSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIG5vVUkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDbGVhciBhbnkgb2xkIHJlc3VsdHNcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICBsZXQgZGl2aWQgPSB0aGlzLmRpdmlkICsgXCJfc3FsX291dFwiO1xuICAgICAgICBsZXQgcmVzcERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRpdmlkKTtcbiAgICAgICAgaWYgKHJlc3BEaXYpIHtcbiAgICAgICAgICAgIHJlc3BEaXYucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChyZXNwRGl2KTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICAvLyBSdW4gdGhpcyBxdWVyeVxuICAgICAgICBsZXQgcXVlcnkgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7IC8vIGZhbHNlIC0tPiBEbyBub3QgaW5jbHVkZSBzdWZmaXhcbiAgICAgICAgaWYgKCF0aGlzLmRiKSB7XG4gICAgICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFxuICAgICAgICAgICAgICAgIGBFcnJvcjogRGF0YWJhc2Ugbm90IGluaXRpYWxpemVkISBEQlVSTDogJHt0aGlzLmRidXJsfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXQgPSB0aGlzLmRiLml0ZXJhdGVTdGF0ZW1lbnRzKHF1ZXJ5KTtcbiAgICAgICAgdGhpcy5yZXN1bHRzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2YgaXQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29sdW1ucyA9IHN0YXRlbWVudC5nZXRDb2x1bW5OYW1lcygpO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSEgcHJvYmFibHkgYSBTRUxFQ1RcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0YXRlbWVudC5zdGVwKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaChzdGF0ZW1lbnQuZ2V0KCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiBjb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Y291bnQ6IGRhdGEubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbnNxbCA9IHN0YXRlbWVudC5nZXROb3JtYWxpemVkU1FMKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVmaXggPSBuc3FsLnN1YnN0cigwLCA2KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuc3RlcCgpOyAvLyBleGVjdXRlIHRoZSBxdWVyeVxuICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZWN0IElOU0VSVC9VUERBVEUvREVMRVRFIHRvIGdpdmUgZnJpZW5kbHkgZmVlZGJhY2tcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gcm93cyBtb2RpZmllZCAtIHVuZm9ydHVuYXRlbHksIHRoaXMgd29uJ3QgY2F0Y2ggc3VjaCBxdWVyaWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXkgdXNlIENURXMuICBUaGVyZSBzZWVtcyB0byBiZSBubyByZWxpYWJsZSB3YXkgb2Yga25vd2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGEgU1FMaXRlIHF1ZXJ5IGFjdHVhbGx5IG1vZGlmaWVkIGRhdGEuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9PT0gXCJpbnNlcnRcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID09PSBcInVwZGF0ZVwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPT09IFwiZGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IHByZWZpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3djb3VudDogdGhpcy5kYi5nZXRSb3dzTW9kaWZpZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goeyBzdGF0dXM6IFwic3VjY2Vzc1wiIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcImZhaWx1cmVcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgc3FsOiBpdC5nZXRSZW1haW5pbmdTUUwoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFwiZmFpbHVyZVwiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiTm8gcXVlcmllcyBzdWJtaXR0ZWQuXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIodGhpcy5zYXZlQ29kZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zbGlkZWl0KSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikub24oXG4gICAgICAgICAgICAgICAgICAgIFwic2xpZGVjaGFuZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZWl0LmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwiZW5hYmxlXCIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIHVwZGF0ZSBzY3J1YmJlciAke2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXNwRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgcmVzcERpdi5pZCA9IGRpdmlkO1xuICAgICAgICB0aGlzLm91dERpdi5hcHBlbmRDaGlsZChyZXNwRGl2KTtcbiAgICAgICAgJCh0aGlzLm91dERpdikuc2hvdygpO1xuICAgICAgICAvLyBTb21ldGltZXMgd2UgZG9uJ3Qgd2FudCB0byBzaG93IGEgYnVuY2ggb2YgaW50ZXJtZWRpYXRlIHJlc3VsdHNcbiAgICAgICAgLy8gbGlrZSB3aGVuIHdlIGFyZSBpbmNsdWRpbmcgYSBidW5jaCBvZiBwcmV2aW91cyBzdGF0ZW1lbnRzIGZyb21cbiAgICAgICAgLy8gb3RoZXIgYWN0aXZlY29kZXMgSW4gdGhhdCBjYXNlIHRoZSBzaG93bGFzdHNxbCBmbGFnIGNhbiBiZSBzZXRcbiAgICAgICAgLy8gc28gd2Ugb25seSBzaG93IHRoZSBsYXN0IHJlc3VsdFxuICAgICAgICBsZXQgcmVzdWx0QXJyYXkgPSB0aGlzLnJlc3VsdHM7XG4gICAgICAgIGlmICh0aGlzLnNob3dMYXN0KSB7XG4gICAgICAgICAgICByZXN1bHRBcnJheSA9IHRoaXMucmVzdWx0cy5zbGljZSgtMSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgciBvZiByZXN1bHRBcnJheSkge1xuICAgICAgICAgICAgbGV0IHNlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgc2VjdGlvbi5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRcIik7XG4gICAgICAgICAgICByZXNwRGl2LmFwcGVuZENoaWxkKHNlY3Rpb24pO1xuICAgICAgICAgICAgaWYgKHIuc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgIGlmIChyLmNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhYmxlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZCh0YWJsZURpdik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXhIZWlnaHQgPSAzNTA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRBcnJheS5sZW5ndGggPiAxKSBtYXhIZWlnaHQgPSAyMDA7IC8vIG1heCBoZWlnaHQgc21hbGxlciBpZiBsb3RzIG9mIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlVGFibGUociwgdGFibGVEaXYsIG1heEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlQm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJtc2cgPSByLnJvd2NvdW50ICE9PSAxID8gXCIgcm93cyBcIiA6IFwiIHJvdyBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1zZyA9IFwiXCIgKyByLnJvd2NvdW50ICsgcm1zZyArIFwicmV0dXJuZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIucm93Y291bnQgPiAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IG1zZyArIFwiIChvbmx5IGZpcnN0IDEwMCByb3dzIGRpc3BsYXllZClcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtc2cgPSBtc2cgKyBcIi5cIjtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUJveC50ZXh0Q29udGVudCA9IG1zZztcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRfc3VjY2Vzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChtZXNzYWdlQm94KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHIucm93Y291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3AgPSByLm9wZXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgb3AgPSBvcCArIChvcC5jaGFyQXQob3AubGVuZ3RoIC0gMSkgPT09IFwiZVwiID8gXCJkLlwiIDogXCJlZC5cIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBybXNnID0gci5yb3djb3VudCAhPT0gMSA/IFwiIHJvd3MgXCIgOiBcIiByb3cgXCI7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSBcIlwiICsgci5yb3djb3VudCArIHJtc2cgKyBvcDtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRfc3VjY2Vzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChtZXNzYWdlQm94KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSBcIk9wZXJhdGlvbiBzdWNjZWVkZWQuXCI7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUJveC50ZXh0Q29udGVudCA9IHIubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiYWNfc3FsX3Jlc3VsdF9mYWlsdXJlXCIpO1xuICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3cgaGFuZGxlIGF1dG9ncmFkaW5nXG4gICAgICAgIGlmICh0aGlzLnN1ZmZpeCkge1xuICAgICAgICAgICAgdGhpcy50ZXN0UmVzdWx0ID0gdGhpcy5hdXRvZ3JhZGUoXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzW3RoaXMucmVzdWx0cy5sZW5ndGggLSAxXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiZG9uZVwiKTtcbiAgICB9XG5cbiAgICBsb2dDdXJyZW50QW5zd2VyKCkge1xuICAgICAgICB0aGlzLmxvZ1J1bkV2ZW50KHtcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuZWRpdG9yLmdldFZhbHVlKCksXG4gICAgICAgICAgICBsYW5nOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgZXJyaW5mbzogdGhpcy5yZXN1bHRzW3RoaXMucmVzdWx0cy5sZW5ndGggLSAxXS5zdGF0dXMsXG4gICAgICAgICAgICB0b19zYXZlOiB0aGlzLnNhdmVDb2RlLFxuICAgICAgICAgICAgcHJlZml4OiB0aGlzLnByZXRleHQsXG4gICAgICAgICAgICBzdWZmaXg6IHRoaXMuc3VmZml4LFxuICAgICAgICAgICAgcGFydG5lcjogdGhpcy5wYXJ0bmVyLFxuICAgICAgICB9KTsgLy8gTG9nIHRoZSBydW4gZXZlbnRcblxuICAgICAgICBpZiAodGhpcy51bml0X3Jlc3VsdHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJ1bml0dGVzdFwiLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICBjb3Vyc2U6IGVCb29rQ29uZmlnLmNvdXJzZSxcbiAgICAgICAgICAgICAgICBhY3Q6IHRoaXMudW5pdF9yZXN1bHRzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJGZWVkYmFjaygpIHtcbiAgICAgICAgaWYgKHRoaXMudGVzdFJlc3VsdCkge1xuICAgICAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dCh0aGlzLnRlc3RSZXN1bHQpO1xuICAgICAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhdXRvZ3JhZGUocmVzdWx0X3RhYmxlKSB7XG4gICAgICAgIHZhciB0ZXN0cyA9IHRoaXMuc3VmZml4LnNwbGl0KC9cXG4vKTtcbiAgICAgICAgdGhpcy5wYXNzZWQgPSAwO1xuICAgICAgICB0aGlzLmZhaWxlZCA9IDA7XG4gICAgICAgIC8vIFRlc3RzIHNob3VsZCBiZSBvZiB0aGUgZm9ybVxuICAgICAgICAvLyBhc3NlcnQgcm93LGNvbCBvcGVyIHZhbHVlIGZvciBleGFtcGxlXG4gICAgICAgIC8vIGFzc2VydCA0LDQgPT0gM1xuICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgdGVzdHMgPSB0ZXN0cy5maWx0ZXIoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzLmluZGV4T2YoXCJhc3NlcnRcIikgPiAtMTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IHRlc3Qgb2YgdGVzdHMpIHtcbiAgICAgICAgICAgIGxldCB3bGlzdCA9IHRlc3Quc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgIHdsaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgbG9jID0gd2xpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgIGxldCBvcGVyID0gd2xpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IHdsaXN0LmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgbGV0IFtyb3csIGNvbF0gPSBsb2Muc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMudGVzdE9uZUFzc2VydChcbiAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgY29sLFxuICAgICAgICAgICAgICAgIG9wZXIsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgICAgICAgICAgcmVzdWx0X3RhYmxlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzdWx0ICs9IFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBjdCA9ICgxMDAgKiB0aGlzLnBhc3NlZCkgLyAodGhpcy5wYXNzZWQgKyB0aGlzLmZhaWxlZCk7XG4gICAgICAgIHBjdCA9IHBjdC50b0xvY2FsZVN0cmluZyh1bmRlZmluZWQsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyIH0pO1xuICAgICAgICByZXN1bHQgKz0gYFlvdSBwYXNzZWQgJHt0aGlzLnBhc3NlZH0gb3V0IG9mICR7XG4gICAgICAgICAgICB0aGlzLnBhc3NlZCArIHRoaXMuZmFpbGVkXG4gICAgICAgIH0gdGVzdHMgZm9yICR7cGN0fSVgO1xuICAgICAgICB0aGlzLnVuaXRfcmVzdWx0cyA9IGBwZXJjZW50OiR7cGN0fTpwYXNzZWQ6JHt0aGlzLnBhc3NlZH06ZmFpbGVkOiR7dGhpcy5mYWlsZWR9YDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdGVzdE9uZUFzc2VydChyb3csIGNvbCwgb3BlciwgZXhwZWN0ZWQsIHJlc3VsdF90YWJsZSkge1xuICAgICAgICAvLyBtYWtlIHN1cmUgcm93IGFuZCBjb2wgYXJlIGluIGJvdW5kc1xuICAgICAgICBsZXQgYWN0dWFsO1xuICAgICAgICBsZXQgb3V0cHV0ID0gXCJcIjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFjdHVhbCA9IHJlc3VsdF90YWJsZS52YWx1ZXNbcm93XVtjb2xdO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgRmFpbGVkIE5vdCBlbm91Z2ggZGF0YSB0byBjaGVjayByb3cgJHtyb3d9IG9yIGNvbHVtbiAke2NvbH1gO1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVyYXRvcnMgPSB7XG4gICAgICAgICAgICBcIj09XCI6IGZ1bmN0aW9uIChvcGVyYW5kMSwgb3BlcmFuZDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmFuZDEgPT0gb3BlcmFuZDI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIhPVwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxICE9IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiPlwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID4gb3BlcmFuZDI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCI8XCI6IGZ1bmN0aW9uIChvcGVyYW5kMSwgb3BlcmFuZDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmFuZDEgPiBvcGVyYW5kMjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGxldCByZXMgPSBvcGVyYXRvcnNbb3Blcl0oYWN0dWFsLCBleHBlY3RlZCk7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IGBQYXNzOiAke2FjdHVhbH0gJHtvcGVyfSAke2V4cGVjdGVkfSBpbiByb3cgJHtyb3d9IGNvbHVtbiAke3Jlc3VsdF90YWJsZS5jb2x1bW5zW2NvbF19YDtcbiAgICAgICAgICAgIHRoaXMucGFzc2VkKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgRmFpbGVkICR7YWN0dWFsfSAke29wZXJ9ICR7ZXhwZWN0ZWR9IGluIHJvdyAke3Jvd30gY29sdW1uICR7cmVzdWx0X3RhYmxlLmNvbHVtbnNbY29sXX1gO1xuICAgICAgICAgICAgdGhpcy5mYWlsZWQrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlVGFibGUodGFibGVEYXRhLCBjb250YWluZXIsIG1heEhlaWdodCkge1xuICAgIGxldCBkYXRhID0gdGFibGVEYXRhLnZhbHVlcztcbiAgICBsZXQgdHJpbVJvd3MgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGtsdWRnZTogbm8gY29sdW1uIGhlYWRlcnMgd2lsbCBzaG93IHVwIHVubGVzcyB3ZSBkbyB0aGlzXG4gICAgICAgIGRhdGEgPSBbdGFibGVEYXRhLmNvbHVtbnMubWFwKChlKSA9PiBudWxsKV07XG4gICAgICAgIHRyaW1Sb3dzID0gWzBdO1xuICAgIH1cblxuICAgIHZhciBob3QgPSBuZXcgSGFuZHNvbnRhYmxlKGNvbnRhaW5lciwge1xuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICB0cmltUm93czogdHJpbVJvd3MsXG4gICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgaGVpZ2h0OiBtYXhIZWlnaHQsXG4gICAgICAgIGF1dG9Sb3dTaXplOiB0cnVlLFxuICAgICAgICBhdXRvQ29sdW1uU2l6ZTogeyB1c2VIZWFkZXJzOiB0cnVlIH0sXG4gICAgICAgIHJvd0hlYWRlcnM6IGZhbHNlLFxuICAgICAgICBjb2xIZWFkZXJzOiB0YWJsZURhdGEuY29sdW1ucyxcbiAgICAgICAgZWRpdG9yOiBmYWxzZSxcbiAgICAgICAgbWF4Um93czogMTAwLFxuICAgICAgICBmaWx0ZXJzOiBmYWxzZSxcbiAgICAgICAgZHJvcGRvd25NZW51OiBmYWxzZSxcbiAgICAgICAgbGljZW5zZUtleTogXCJub24tY29tbWVyY2lhbC1hbmQtZXZhbHVhdGlvblwiLFxuICAgIH0pO1xuXG4gICAgLy8gY2FsY3VsYXRlIGFjdHVhbCBoZWlnaHQgYW5kIHJlc2l6ZVxuICAgIGxldCBhY3R1YWxIZWlnaHQgPSA0MDsgLy8gaGVhZGVyIGhlaWdodCArIHNtYWxsIG1hcmdpblxuICAgIGlmICh0YWJsZURhdGEudmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhY3R1YWxIZWlnaHQgPSBhY3R1YWxIZWlnaHQgKyBob3QuZ2V0Um93SGVpZ2h0KGkpO1xuICAgICAgICAgICAgaWYgKGFjdHVhbEhlaWdodCA+IG1heEhlaWdodCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob3QudXBkYXRlU2V0dGluZ3MoeyBoZWlnaHQ6IGFjdHVhbEhlaWdodCB9KTtcblxuICAgIHJldHVybiBob3Q7XG59XG4iLCJpbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2UuanNcIjtcblxuLy8gZnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgYXVkaW8gdG91cnNcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1ZGlvVG91ciBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGRpdmlkLCBjb2RlLCBibnVtLCBhdWRpb190ZXh0KSB7XG4gICAgICAgIC8vIEJ1ZyBGaXg6IElmIGEgY2xhc3MgZXh0ZW5kcyBhbm90aGVyIGNsYXNzLCB0aGlzIGlzIHVuZGVmaW5lZCBVTlRJTCBzdXBlciBpcyBjYWxsZWRcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hdWRpb190b3VyID0gbnVsbDtcbiAgICAgICAgdGhpcy5hdWRpb19jb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy53aW5kb3djb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpbyA9IG51bGw7XG4gICAgICAgIHRoaXMucHJldl9hdWRpbyA9IG51bGw7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RvcF9idXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLnRvdXJCdXR0b25zID0gW107XG4gICAgICAgIHRoaXMuZWxlbSA9IG51bGw7IC8vIGN1cnJlbnQgYXVkaW8gZWxlbWVudCBwbGF5aW5nXG4gICAgICAgIHRoaXMuY3VyckluZGV4ID0gbnVsbDsgLy8gY3VycmVudCBpbmRleFxuICAgICAgICB0aGlzLmxlbiA9IG51bGw7IC8vIGN1cnJlbnQgbGVuZ3RoIG9mIGF1ZGlvIGZpbGVzIGZvciB0b3VyXG4gICAgICAgIHRoaXMuYnV0dG9uQ291bnQgPSBudWxsOyAvLyBudW1iZXIgb2YgYXVkaW8gdG91ciBidXR0b25zXG4gICAgICAgIHRoaXMuYW5hbWUgPSBudWxsOyAvLyB0aGUgYXVkaW8gZmlsZSBuYW1lXG4gICAgICAgIHRoaXMuYWhhc2ggPSBudWxsOyAvLyBoYXNoIG9mIHRoZSBhdWRpbyBmaWxlIG5hbWUgdG8gdGhlIGxpbmVzIHRvIGhpZ2hsaWdodFxuICAgICAgICB0aGlzLnRoZURpdmlkID0gbnVsbDsgLy8gZGl2IGlkXG4gICAgICAgIHRoaXMuYWZpbGUgPSBudWxsOyAvLyBmaWxlIG5hbWUgZm9yIGF1ZGlvXG4gICAgICAgIHRoaXMucGxheWluZyA9IGZhbHNlOyAvLyBmbGFnIHRvIHNheSBpZiBwbGF5aW5nIG9yIG5vdFxuICAgICAgICB0aGlzLnRvdXJOYW1lID0gXCJcIjtcbiAgICAgICAgLy8gUmVwbGFjaW5nIGhhcyBiZWVuIGRvbmUgaGVyZSB0byBtYWtlIHN1cmUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBjb2RlIGFyZSBkaXNwbGF5ZWQgY29ycmVjdGx5XG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2VBbGwoXCIqZG91YmxlcSpcIiwgJ1wiJyk7XG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2VBbGwoXCIqc2luZ2xlcSpcIiwgXCInXCIpO1xuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKm9wZW4qXCIsIFwiKFwiKTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZUFsbChcIipjbG9zZSpcIiwgXCIpXCIpO1xuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKm5saW5lKlwiLCBcIjxici8+XCIpO1xuICAgICAgICB2YXIgY29kZUFycmF5ID0gY29kZS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgdmFyIGF1ZGlvX2hhc2ggPSBbXTtcbiAgICAgICAgdmFyIGJ2YWwgPSBbXTtcbiAgICAgICAgdmFyIGF0eXBlID0gYXVkaW9fdGV4dC5yZXBsYWNlQWxsKFwiKmRvdWJsZXEqXCIsICdcIicpO1xuICAgICAgICB2YXIgYXVkaW9fdHlwZSA9IGF0eXBlLnNwbGl0KFwiKmF0eXBlKlwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdWRpb190eXBlLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgYXVkaW9faGFzaFtpXSA9IGF1ZGlvX3R5cGVbaV07XG4gICAgICAgICAgICB2YXIgYXdvcmQgPSBhdWRpb190eXBlW2ldLnNwbGl0KFwiO1wiKTtcbiAgICAgICAgICAgIGJ2YWwucHVzaChhd29yZFswXSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZpcnN0ID1cbiAgICAgICAgICAgIFwiPHByZT48ZGl2IGlkPSdcIiArXG4gICAgICAgICAgICBkaXZpZCArXG4gICAgICAgICAgICBcIl9sMSc+XCIgK1xuICAgICAgICAgICAgXCIxLiAgIFwiICtcbiAgICAgICAgICAgIGNvZGVBcnJheVswXSArXG4gICAgICAgICAgICBcIjwvZGl2PlwiO1xuICAgICAgICB2YXIgbnVtX2xpbmVzID0gY29kZUFycmF5Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBudW1fbGluZXM7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPCA5KSB7XG4gICAgICAgICAgICAgICAgZmlyc3QgPVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCArXG4gICAgICAgICAgICAgICAgICAgIFwiPGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgICAgICAgICBkaXZpZCArXG4gICAgICAgICAgICAgICAgICAgIFwiX2xcIiArXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICBcIic+XCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCIuICAgXCIgK1xuICAgICAgICAgICAgICAgICAgICBjb2RlQXJyYXlbaV0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvZGl2PlwiO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgOTkpIHtcbiAgICAgICAgICAgICAgICBmaXJzdCA9XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ICtcbiAgICAgICAgICAgICAgICAgICAgXCI8ZGl2IGlkPSdcIiArXG4gICAgICAgICAgICAgICAgICAgIGRpdmlkICtcbiAgICAgICAgICAgICAgICAgICAgXCJfbFwiICtcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwiJz5cIiArXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICBcIi4gIFwiICtcbiAgICAgICAgICAgICAgICAgICAgY29kZUFycmF5W2ldICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmlyc3QgPVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCArXG4gICAgICAgICAgICAgICAgICAgIFwiPGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgICAgICAgICBkaXZpZCArXG4gICAgICAgICAgICAgICAgICAgIFwiX2xcIiArXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICBcIic+XCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCIuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgY29kZUFycmF5W2ldICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaXJzdCA9IGZpcnN0ICsgXCI8L3ByZT5cIjtcbiAgICAgICAgLy9sYXlpbmcgb3V0IHRoZSBIVE1MIGNvbnRlbnRcbiAgICAgICAgdmFyIGJjb3VudCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXVkaW9fdHlwZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBuZXdCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAgICAgbmV3QnV0dG9uLmNsYXNzTmFtZSA9IFwiYnRuIGJ0bi1zdWNjZXNzXCI7XG4gICAgICAgICAgICBuZXdCdXR0b24uaW5uZXJIVE1MID0gYnZhbFtpXS5yZXBsYWNlKC9cXFwiL2csIFwiXCIpO1xuICAgICAgICAgICAgdGhpcy50b3VyQnV0dG9ucy5wdXNoKG5ld0J1dHRvbik7XG4gICAgICAgICAgICBiY291bnQrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF1ZGlvX3RvdXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmF1ZGlvX3RvdXIuYWxpZ24gPSBcImNlbnRlclwiO1xuICAgICAgICB0aGlzLmF1ZGlvX2NvZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcbiAgICAgICAgdGhpcy53aW5kb3djb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy53aW5kb3djb2RlLmFsaWduID0gXCJsZWZ0XCI7XG4gICAgICAgICQodGhpcy53aW5kb3djb2RlKS5odG1sKGZpcnN0KTtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgIHRoaXMucHJldl9hdWRpbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tZmFzdC1iYWNrd2FyZFwiO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8uY2xhc3NOYW1lID1cbiAgICAgICAgICAgIFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1zdGVwLWJhY2t3YXJkXCI7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID0gXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCI7XG4gICAgICAgIHRoaXMubmV4dF9hdWRpby5jbGFzc05hbWUgPVxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXN0ZXAtZm9yd2FyZFwiO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8uY2xhc3NOYW1lID1cbiAgICAgICAgICAgIFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1mYXN0LWZvcndhcmRcIjtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBcImhlaWdodDogMjJweDsgd2lkdGg6IDI1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXJpZ2h0OjJweDtcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBcImhlaWdodDogMjJweDsgd2lkdGg6IDI1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXJpZ2h0OjJweDtcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0OiAyMnB4OyB3aWR0aDogMjVweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tcmlnaHQ6MnB4O1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8ubmFtZSA9IFwiZmlyc3RfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLm5hbWUgPSBcInByZXZfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5uYW1lID0gXCJwYXVzZV9hdWRpb1wiO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8ubmFtZSA9IFwibmV4dF9hdWRpb1wiO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8ubmFtZSA9IFwibGFzdF9hdWRpb1wiO1xuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLnRpdGxlID0gXCJQbGF5IGZpcnN0IGF1ZGlvIGluIHRvdXJcIjtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnRpdGxlID0gXCJQbGF5IHByZXZpb3VzIGF1ZGlvIGluIHRvdXJcIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby50aXRsZSA9IFwiUGF1c2UgY3VycmVudCBhdWRpb1wiO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8udGl0bGUgPSBcIlBsYXkgbmV4dCBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMubGFzdF9hdWRpby50aXRsZSA9IFwiUGxheSBsYXN0IGF1ZGlvIGluIHRvdXJcIjtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiUGxheSBmaXJzdCBhdWRpbyBpbiB0b3VyXCIpO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICBcIlBsYXkgcHJldmlvdXMgYXVkaW8gaW4gdG91clwiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIlBhdXNlIGF1ZGlvXCIpO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIlBsYXkgbmV4dCBhdWRpbyBpbiB0b3VyXCIpO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIlBsYXkgbGFzdCBhdWRpbyBpbiB0b3VyXCIpO1xuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubmV4dF9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubGFzdF9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5zdGF0dXMuY2xhc3NOYW1lID0gXCJhbGVydCBhbGVydC1pbmZvXCI7XG4gICAgICAgIHRoaXMuc3RhdHVzLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiZGlzcGxheTogbm9uZTtcIik7XG4gICAgICAgIHRoaXMuc3RvcF9idXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uLmNsYXNzTmFtZSA9IFwiYnRuIGJ0bi1kZWZhdWx0XCI7XG4gICAgICAgIHRoaXMuc3RvcF9idXR0b24uaW5uZXJIVE1MID0gXCJTdG9wIHRvdXJcIjtcbiAgICAgICAgJCh0aGlzLmF1ZGlvX3RvdXIpLmFwcGVuZChcbiAgICAgICAgICAgIHRoaXMuYXVkaW9fY29kZSxcbiAgICAgICAgICAgIHRoaXMud2luZG93Y29kZSxcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSxcbiAgICAgICAgICAgIHRoaXMuZmlyc3RfYXVkaW8sXG4gICAgICAgICAgICB0aGlzLnByZXZfYXVkaW8sXG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpLFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIiksXG4gICAgICAgICAgICB0aGlzLnRvdXJCdXR0b25zLFxuICAgICAgICAgICAgdGhpcy5zdG9wX2J1dHRvblxuICAgICAgICApO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuYWNfY29kZV9kaXZcIikuYXBwZW5kKHRoaXMuYXVkaW9fdG91cik7XG4gICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19jb2RlX2RpdlwiKS5jc3MoXCJ3aWR0aFwiLCBcIjEwMCVcIik7XG4gICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5Db2RlTWlycm9yLmNtLXMtZGVmYXVsdC51aS1yZXNpemFibGVcIikuaGlkZSgpO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuYWNfb3B0LmJ0bi5idG4tZGVmYXVsdDpsYXN0LWNoaWxkXCIpLmhpZGUoKTtcbiAgICAgICAgJCh0aGlzLnN0b3BfYnV0dG9uKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcIkF1ZGlvXCIsXG4gICAgICAgICAgICAgICAgICAgIGFjdDogXCJjbG9zZVdpbmRvd1wiLFxuICAgICAgICAgICAgICAgICAgICBkaXZfaWQ6IGRpdmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICQodGhpcy5hdWRpb190b3VyKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgICAgICBcIiNcIiArIGRpdmlkICsgXCIgLkNvZGVNaXJyb3IuY20tcy1kZWZhdWx0LnVpLXJlc2l6YWJsZVwiXG4gICAgICAgICAgICAgICAgKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX29wdC5idG4uYnRuLWRlZmF1bHQ6bGFzdC1jaGlsZFwiKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX2NvZGVfZGl2XCIpLmNzcyhcIndpZHRoXCIsIFwiXCIpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgICQodGhpcy50b3VyQnV0dG9uc1swXSkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyKGRpdmlkLCBhdWRpb19oYXNoWzBdLCBiY291bnQpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgICQodGhpcy50b3VyQnV0dG9uc1sxXSkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyKGRpdmlkLCBhdWRpb19oYXNoWzFdLCBiY291bnQpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgICQodGhpcy50b3VyQnV0dG9uc1syXSkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyKGRpdmlkLCBhdWRpb19oYXNoWzJdLCBiY291bnQpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgICQodGhpcy50b3VyQnV0dG9uc1szXSkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyKGRpdmlkLCBhdWRpb19oYXNoWzNdLCBiY291bnQpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgICQodGhpcy50b3VyQnV0dG9uc1s0XSkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VyKGRpdmlkLCBhdWRpb19oYXNoWzRdLCBiY291bnQpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIC8vIGhhbmRsZSB0aGUgY2xpY2sgdG8gZ28gdG8gdGhlIG5leHQgYXVkaW9cbiAgICAgICAgJCh0aGlzLmZpcnN0X2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXVkaW8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZBdWRpbygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIC8vIGhhbmRsZSB0aGUgY2xpY2sgdG8gcGF1c2Ugb3IgcGxheSB0aGUgYXVkaW9cbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhdXNlQW5kUGxheUF1ZGlvKGRpdmlkKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRBdWRpbygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIC8vIGhhbmRsZSB0aGUgY2xpY2sgdG8gZ28gdG8gdGhlIG5leHQgYXVkaW9cbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdEF1ZGlvKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gbWFrZSB0aGUgaW1hZ2UgYnV0dG9ucyBsb29rIGRpc2FibGVkXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgIH1cbiAgICB0b3VyKGRpdmlkLCBhdWRpb190eXBlLCBiY291bnQpIHtcbiAgICAgICAgLy8gc2V0IGdsb2JhbHNcbiAgICAgICAgdGhpcy5idXR0b25Db3VudCA9IGJjb3VudDtcbiAgICAgICAgdGhpcy50aGVEaXZpZCA9IGRpdmlkO1xuICAgICAgICB0aGlzLnN0YXR1cy5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luLXRvcDogN3B4OyBtYXJnaW4tYm90dG9tOiAzcHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgLy8gZW5hYmxlIHByZXYsIHBhdXNlL3BsYXkgYW5kIG5leHQgYnV0dG9ucyBhbmQgbWFrZSB2aXNpYmxlXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLmZpcnN0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDEuMCk7XG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDEuMCk7XG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMubmV4dF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAvLyBkaXNhYmxlIHRvdXIgYnV0dG9uc1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJjb3VudDsgaSsrKVxuICAgICAgICAgICAgJCh0aGlzLnRvdXJCdXR0b25zW2ldKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgdmFyIGF0eXBlID0gYXVkaW9fdHlwZS5zcGxpdChcIjtcIik7XG4gICAgICAgIHZhciBuYW1lID0gYXR5cGVbMF0ucmVwbGFjZUFsbCgnXCInLCBcIiBcIik7XG4gICAgICAgIHRoaXMudG91ck5hbWUgPSBuYW1lO1xuICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3N0YXJ0aW5nXCIsIG5hbWUpKTtcbiAgICAgICAgLy9sb2cgdG91ciB0eXBlIHRvIGRiXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHsgZXZlbnQ6IFwiQXVkaW9cIiwgYWN0OiBuYW1lLCBkaXZfaWQ6IGRpdmlkIH0pO1xuICAgICAgICB2YXIgbWF4ID0gYXR5cGUubGVuZ3RoO1xuICAgICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgICAgdGhpcy5haGFzaCA9IFtdO1xuICAgICAgICB0aGlzLmFuYW1lID0gW107XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBtYXggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0ZW1wID0gYXR5cGVbaV0uc3BsaXQoXCI6XCIpO1xuICAgICAgICAgICAgdmFyIHRlbXBfbGluZSA9IHRlbXBbMF07XG4gICAgICAgICAgICB2YXIgdGVtcF9hbmFtZSA9IHRlbXBbMV07XG4gICAgICAgICAgICB2YXIgYWtleSA9IHRlbXBfYW5hbWUuc3Vic3RyaW5nKDEsIHRlbXBfYW5hbWUubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBsbnVtcyA9IHRlbXBfbGluZS5zdWJzdHJpbmcoMSwgdGVtcF9saW5lLmxlbmd0aCk7XG4gICAgICAgICAgICAvL2FsZXJ0KFwiYWtleTpcIitha2V5K1wibG51bTpcIitsbnVtcyk7XG4gICAgICAgICAgICAvLyBzdHIrPVwiPGF1ZGlvIGlkPVwiK2FrZXkrXCIgcHJlbG9hZD0nYXV0byc+PHNvdXJjZSBzcmM9J2h0dHA6Ly9pY2Utd2ViLmNjLmdhdGVjaC5lZHUvY2UyMS9hdWRpby9cIitcbiAgICAgICAgICAgIC8vIGFrZXkrXCIubXAzJyB0eXBlPSdhdWRpby9tcGVnJz48c291cmNlIHNyYz0naHR0cDovL2ljZS13ZWIuY2MuZ2F0ZWNoLmVkdS9jZTIxL2F1ZGlvL1wiK2FrZXkrXG4gICAgICAgICAgICAvLyBcIi5vZ2cnIHR5cGU9J2F1ZGlvL29nZyc+WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGF1ZGlvIHRhZzwvYXVkaW8+XCI7XG4gICAgICAgICAgICAvL3ZhciBkaXIgPVxuICAgICAgICAgICAgLy8gICAgXCJodHRwOi8vbWVkaWEuaW50ZXJhY3RpdmVweXRob24ub3JnL1wiICtcbiAgICAgICAgICAgIC8vICAgIGVCb29rQ29uZmlnLmJhc2Vjb3Vyc2UudG9Mb3dlckNhc2UoKSArXG4gICAgICAgICAgICAvLyAgICBcIi9hdWRpby9cIjtcbiAgICAgICAgICAgIHZhciBkaXIgPSBcIi4uL19zdGF0aWMvYXVkaW8vXCJcbiAgICAgICAgICAgIHN0ciArPSBcIjxhdWRpbyBpZD1cIiArIGFrZXkgKyBcIiBwcmVsb2FkPSdhdXRvJyA+XCI7XG4gICAgICAgICAgICBzdHIgKz0gXCI8c291cmNlIHNyYz0nXCIgKyBkaXIgKyBha2V5ICsgXCIud2F2JyB0eXBlPSdhdWRpby93YXYnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLm1wMycgdHlwZT0nYXVkaW8vbXBlZyc+XCI7XG4gICAgICAgICAgICBzdHIgKz0gXCI8c291cmNlIHNyYz0nXCIgKyBkaXIgKyBha2V5ICsgXCIud2F2JyB0eXBlPSdhdWRpby93YXYnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLm1wMycgdHlwZT0nYXVkaW8vbXBlZyc+XCI7XG4gICAgICAgICAgICBzdHIgKz0gXCI8YnIgLz5Zb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYXVkaW8gdGFnPC9hdWRpbz5cIjtcbiAgICAgICAgICAgIHRoaXMuYWhhc2hbYWtleV0gPSBsbnVtcztcbiAgICAgICAgICAgIHRoaXMuYW5hbWUucHVzaChha2V5KTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMuYXVkaW9fY29kZSkuaHRtbChzdHIpO1xuICAgICAgICB0aGlzLmxlbiA9IHRoaXMuYW5hbWUubGVuZ3RoOyAvLyBzZXQgdGhlIG51bWJlciBvZiBhdWRpbyBmaWxlIGluIHRoZSB0b3VyXG4gICAgICAgIHRoaXMuY3VyckluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICB9XG4gICAgaGFuZGxlUGxheWluZygpIHtcbiAgICAgICAgdGhpcy5lbGVtLnBhdXNlKCk7XG4gICAgICAgIC8vIHVuYmluZCBjdXJyZW50IGVuZGVkXG4gICAgICAgICQoXCIjXCIgKyB0aGlzLmFmaWxlKS51bmJpbmQoXCJlbmRlZFwiKTtcbiAgICAgICAgLy8gdW5oaWdobGlnaHQgdGhlIHByZXYgbGluZXNcbiAgICAgICAgdGhpcy51bmhpZ2hsaWdodExpbmVzKFxuICAgICAgICAgICAgdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIHRoaXMuYWhhc2hbdGhpcy5hbmFtZVt0aGlzLmN1cnJJbmRleF1dXG4gICAgICAgICk7XG4gICAgfVxuICAgIGZpcnN0QXVkaW8oKSB7XG4gICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgdGhpcy5oYW5kbGVQbGF5aW5nKCk7XG4gICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgYWN0OiBcImZpcnN0XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMudGhlRGl2aWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBtb3ZlIHRvIHRoZSBmaXJzdCBhdWRpb1xuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IDA7XG4gICAgICAgIC8vIHN0YXJ0IGF0IHRoZSBmaXJzdCBhdWRpb1xuICAgICAgICB0aGlzLnBsYXlDdXJySW5kZXhBdWRpbygpO1xuICAgIH1cbiAgICBwcmV2QXVkaW8oKSB7XG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgcHJldmlvdXMgYXVkaW9cbiAgICAgICAgaWYgKHRoaXMuY3VyckluZGV4ID4gMCkge1xuICAgICAgICAgICAgLy8gaWYgYXVkaW8gaXMgdGhpcy5wbGF5aW5nIGhhbmRsZSBpdFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVQbGF5aW5nKCk7XG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJwcmV2XCIsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBtb3ZlIHRvIHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IChidXQgdGhlIGN1cnJlbnQgaW5kZXggaGFzIG1vdmVkIHRvIHRoZSBuZXh0KVxuICAgICAgICAgICAgdGhpcy5jdXJySW5kZXggPSB0aGlzLmN1cnJJbmRleCAtIDE7XG4gICAgICAgICAgICAvLyBzdGFydCBhdCB0aGUgcHJldiBhdWRpb1xuICAgICAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZXh0QXVkaW8oKSB7XG4gICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgdGhpcy5oYW5kbGVQbGF5aW5nKCk7XG4gICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgYWN0OiBcIm5leHRcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIG5vdCBhdCB0aGUgZW5kXG4gICAgICAgIGlmICh0aGlzLmN1cnJJbmRleCA8IHRoaXMubGVuIC0gMSkge1xuICAgICAgICAgICAgLy8gc3RhcnQgYXQgdGhlIG5leHQgYXVkaW9cbiAgICAgICAgICAgIHRoaXMuY3VyckluZGV4ID0gdGhpcy5jdXJySW5kZXggKyAxO1xuICAgICAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJJbmRleCA9PSB0aGlzLmxlbiAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlVG91ckVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxhc3RBdWRpbygpIHtcbiAgICAgICAgLy8gaWYgYXVkaW8gaXMgdGhpcy5wbGF5aW5nIGhhbmRsZSBpdFxuICAgICAgICB0aGlzLmhhbmRsZVBsYXlpbmcoKTtcbiAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50OiBcIkF1ZGlvXCIsXG4gICAgICAgICAgICBhY3Q6IFwibGFzdFwiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gbW92ZSB0byB0aGUgbGFzdCBhdWRpb1xuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IHRoaXMubGVuIC0gMTtcbiAgICAgICAgLy8gc3RhcnQgYXQgbGFzdFxuICAgICAgICB0aGlzLnBsYXlDdXJySW5kZXhBdWRpbygpO1xuICAgIH1cbiAgICAvLyBwbGF5IHRoZSBhdWRpbyBhdCB0aGUgY3VycmVudCBpbmRleFxuICAgIHBsYXlDdXJySW5kZXhBdWRpbygpIHtcbiAgICAgICAgLy8gc2V0IHRoaXMucGxheWluZyB0byBmYWxzZVxuICAgICAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gcGxheSB0aGUgY3VycmVudCBhdWRpbyBhbmQgaGlnaGxpZ2h0IHRoZSBsaW5lc1xuICAgICAgICB0aGlzLnBsYXlhdWRpbyh0aGlzLmN1cnJJbmRleCwgdGhpcy5hbmFtZSwgdGhpcy50aGVEaXZpZCwgdGhpcy5haGFzaCk7XG4gICAgfVxuICAgIC8vIGhhbmRsZSB0aGUgZW5kIG9mIHRoZSB0b3VyXG4gICAgaGFuZGxlVG91ckVuZCgpIHtcbiAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbChcIlRoZSBcIiArIHRoaXMudG91ck5hbWUgKyBcIiBoYXMgZW5kZWQuXCIpO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9IFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1wYXVzZVwiO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnRpdGxlID0gXCJQYXVzZSBhdWRpb1wiO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQYXVzZSBhdWRpb1wiKTtcbiAgICAgICAgJCh0aGlzLmZpcnN0X2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMubmV4dF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLmZpcnN0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMubmV4dF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgIC8vIGVuYWJsZSB0aGUgdG91ciBidXR0b25zXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5idXR0b25Db3VudDsgaisrKVxuICAgICAgICAgICAgJCh0aGlzLnRvdXJCdXR0b25zW2pdKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgfVxuICAgIC8vIG9ubHkgY2FsbCB0aGlzIG9uZSBhZnRlciB0aGUgZmlyc3QgdGltZVxuICAgIG91dGVyQXVkaW8oKSB7XG4gICAgICAgIC8vIHVuYmluZCBlbmRlZFxuICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkudW5iaW5kKFwiZW5kZWRcIik7XG4gICAgICAgIC8vIHNldCB0aGlzLnBsYXlpbmcgdG8gZmFsc2VcbiAgICAgICAgdGhpcy5wbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIC8vIHVuaGlnaGxpZ2h0IHByZXZpb3VzIGxpbmVzIGZyb20gdGhlIGxhc3QgYXVkaW9cbiAgICAgICAgdGhpcy51bmhpZ2hsaWdodExpbmVzKFxuICAgICAgICAgICAgdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIHRoaXMuYWhhc2hbdGhpcy5hbmFtZVt0aGlzLmN1cnJJbmRleF1dXG4gICAgICAgICk7XG4gICAgICAgIC8vIGluY3JlbWVudCB0aGUgdGhpcy5jdXJySW5kZXggdG8gcG9pbnQgdG8gdGhlIG5leHQgb25lXG4gICAgICAgIHRoaXMuY3VyckluZGV4Kys7XG4gICAgICAgIC8vIGlmIHRoZSBlbmQgb2YgdGhlIHRvdXIgcmVzZXQgdGhlIGJ1dHRvbnNcbiAgICAgICAgaWYgKHRoaXMuY3VyckluZGV4ID09IHRoaXMubGVuKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVRvdXJFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlIG5vdCBkb25lIHlldCBzbyBwbGF5IHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIGN1cnJlbnQgaW5kZXhcbiAgICAgICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGxheSB0aGUgYXVkaW8gbm93IHRoYXQgaXQgaXMgcmVhZHlcbiAgICBwbGF5V2hlblJlYWR5KGFmaWxlLCBkaXZpZCwgYWhhc2gpIHtcbiAgICAgICAgLy8gdW5iaW5kIGN1cnJlbnRcbiAgICAgICAgJChcIiNcIiArIGFmaWxlKS51bmJpbmQoXCJjYW5wbGF5dGhyb3VnaFwiKTtcbiAgICAgICAgdGhpcy5lbGVtLmN1cnJlbnRUaW1lID0gMDtcbiAgICAgICAgdGhpcy5wbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImluIHBsYXlXaGVuUmVhZHkgXCIgKyBlbGVtLmR1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRMaW5lcyhkaXZpZCwgYWhhc2hbYWZpbGVdKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5jbGFzc05hbWUgPT09XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tcGF1c2VcIlxuICAgICAgICApIHtcbiAgICAgICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGxheWluZ1wiLCB0aGlzLnRvdXJOYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQoXCIjXCIgKyBhZmlsZSkuYmluZChcbiAgICAgICAgICAgICAgICBcImVuZGVkXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGVyQXVkaW8oKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmVsZW0ucGxheSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChcIiNcIiArIGFmaWxlKS5iaW5kKFxuICAgICAgICAgICAgICAgIFwiZW5kZWRcIixcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0ZXJBdWRpbygpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBwbGF5IHRoZSBhdWRpbyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGkgYW5kIHNldCB0aGUgZHVyYXRpb24gYW5kIGhpZ2hsaWdodCB0aGUgbGluZXNcbiAgICBwbGF5YXVkaW8oaSwgYW5hbWUsIGRpdmlkLCBhaGFzaCkge1xuICAgICAgICB0aGlzLmFmaWxlID0gYW5hbWVbaV07XG4gICAgICAgIHRoaXMuZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuYWZpbGUpO1xuICAgICAgICAvLyBpZiB0aGlzIGlzbid0IHJlYWR5IHRvIHBsYXkgeWV0IC0gbm8gZHVyYXRpb24geWV0IHRoZW4gd2FpdFxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiaW4gcGxheWF1ZGlvIFwiICsgZWxlbS5kdXJhdGlvbik7XG4gICAgICAgIGlmIChpc05hTih0aGlzLmVsZW0uZHVyYXRpb24pIHx8IHRoaXMuZWxlbS5kdXJhdGlvbiA9PSAwKSB7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIHN0YXR1c1xuICAgICAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9sb2FkaW5nX2F1ZGlvXCIpKTtcbiAgICAgICAgICAgICQoXCIjXCIgKyB0aGlzLmFmaWxlKS5iaW5kKFxuICAgICAgICAgICAgICAgIFwiY2FucGxheXRocm91Z2hcIixcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheVdoZW5SZWFkeSh0aGlzLmFmaWxlLCBkaXZpZCwgYWhhc2gpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2UgaXQgaXMgcmVhZHkgc28gcGxheSBpdFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGxheVdoZW5SZWFkeSh0aGlzLmFmaWxlLCBkaXZpZCwgYWhhc2gpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHBhdXNlIGlmIHRoaXMucGxheWluZyBhbmQgcGxheSBpZiBwYXVzZWRcbiAgICBwYXVzZUFuZFBsYXlBdWRpbyhkaXZpZCkge1xuICAgICAgICB2YXIgYnRuID0gdGhpcy5wYXVzZV9hdWRpbztcbiAgICAgICAgLy8gaWYgcGF1c2VkIGFuZCBjbGlja2VkIHRoZW4gY29udGludWUgZnJvbSBjdXJyZW50XG4gICAgICAgIGlmICh0aGlzLmVsZW0ucGF1c2VkKSB7XG4gICAgICAgICAgICAvLyBjYWxjdWFsdGUgdGhlIHRpbWUgbGVmdCB0byBwbGF5IGluIG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAodGhpcy5lbGVtLmR1cmF0aW9uIC0gdGhpcy5lbGVtLmN1cnJlbnRUaW1lKSAqIDEwMDA7XG4gICAgICAgICAgICB0aGlzLmVsZW0ucGxheSgpOyAvLyBzdGFydCB0aGUgYXVkaW8gZnJvbSBjdXJyZW50IHNwb3RcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID1cbiAgICAgICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tcGF1c2VcIjtcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSAkLmkxOG4oXG4gICAgICAgICAgICAgICAgXCJtc2dfYWN0aXZlY29kZV9wYXVzZV9jdXJyZW50X2F1ZGlvXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICBcImFyaWEtbGFiZWxcIixcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9wYXVzZV9hdWRpb1wiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGxheWluZ1wiLCB0aGlzLnRvdXJOYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiBcIkF1ZGlvXCIsXG4gICAgICAgICAgICAgICAgYWN0OiBcInBsYXlcIixcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMudGhlRGl2aWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhdWRpbyB3YXMgdGhpcy5wbGF5aW5nIHBhdXNlIGl0XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucGxheWluZykge1xuICAgICAgICAgICAgdGhpcy5lbGVtLnBhdXNlKCk7IC8vIHBhdXNlIHRoZSBhdWRpb1xuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5jbGFzc05hbWUgPSBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tcGxheVwiO1xuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby50aXRsZSA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvXCIpO1xuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGxheV9wYXVzZWRfYXVkaW9cIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2F1ZGlvX3BhdXNlZFwiLCB0aGlzLnRvdXJOYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiBcIkF1ZGlvXCIsXG4gICAgICAgICAgICAgICAgYWN0OiBcInBhdXNlXCIsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcHJvY2VzcyB0aGUgbGluZXNcbiAgICBwcm9jZXNzTGluZXMoZGl2aWQsIGxudW0sIGNvbG9yKSB7XG4gICAgICAgIHZhciBjb21tYSA9IGxudW0uc3BsaXQoXCIsXCIpO1xuICAgICAgICBpZiAoY29tbWEubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZEZvckxpbmVzKGRpdmlkLCBjb21tYVtpXSwgY29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRCYWNrZ3JvdW5kRm9yTGluZXMoZGl2aWQsIGxudW0sIGNvbG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyB1bmhpZ2hsaWdodCB0aGUgbGluZXMgLSBzZXQgdGhlIGJhY2tncm91bmQgYmFjayB0byB0cmFuc3BhcmVudFxuICAgIHVuaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGxudW0pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGluZXMoZGl2aWQsIGxudW0sIFwidHJhbnNwYXJlbnRcIik7XG4gICAgfVxuICAgIC8vIGhpZ2hsaWdodCB0aGUgbGluZXMgLSBzZXQgdGhlIGJhY2tncm91bmQgdG8gYSB5ZWxsb3cgY29sb3JcbiAgICBoaWdobGlnaHRMaW5lcyhkaXZpZCwgbG51bSkge1xuICAgICAgICB0aGlzLnByb2Nlc3NMaW5lcyhkaXZpZCwgbG51bSwgXCIjZmZmZjk5XCIpO1xuICAgIH1cbiAgICAvLyBzZXQgdGhlIGJhY2tncm91bmQgdG8gdGhlIHBhc3NlZCBjb2xvclxuICAgIHNldEJhY2tncm91bmRGb3JMaW5lcyhkaXZpZCwgbG51bSwgY29sb3IpIHtcbiAgICAgICAgdmFyIGh5cGhlbiA9IGxudW0uc3BsaXQoXCItXCIpO1xuICAgICAgICB2YXIgc3RyO1xuICAgICAgICAvLyBpZiBhIHJhbmdlIG9mIGxpbmVzXG4gICAgICAgIGlmIChoeXBoZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcGFyc2VJbnQoaHlwaGVuWzBdKTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBwYXJzZUludChoeXBoZW5bMV0pICsgMTtcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7XG4gICAgICAgICAgICAgICAgLy9hbGVydChrKTtcbiAgICAgICAgICAgICAgICBzdHIgPSBcIiNcIiArIGRpdmlkICsgXCJfbFwiICsgaztcbiAgICAgICAgICAgICAgICBpZiAoJChzdHIpLnRleHQoKSAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICQoc3RyKS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIGNvbG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8kKHN0cikuZWZmZWN0KFwiaGlnaGxpZ2h0XCIse30sKGR1cioxMDAwKSs0NTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vYWxlcnQobG51bSk7XG4gICAgICAgICAgICBzdHIgPSBcIiNcIiArIGRpdmlkICsgXCJfbFwiICsgbG51bTtcbiAgICAgICAgICAgICQoc3RyKS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIGNvbG9yKTtcbiAgICAgICAgICAgIC8vJChzdHIpLmVmZmVjdChcImhpZ2hsaWdodFwiLHt9LChkdXIqMTAwMCkrNDUwMCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJ2YXIgdGVzdFN0cmluZyA9IGBTdGFydGluZyBUZXN0c1xuRXhwZWN0ZWQ6IEFuc3dlciAgICAgICAgICAgICAgICAgICBBY3R1YWw6IEFuc3dlciAgICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBtZXRob2QgcHJpbnRBbnN3ZXIoKSAgICAgICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRXhwZWN0ZWQ6IDYgbGluZShzKSBvZiB0ZXh0ICAgICAgICBBY3R1YWw6IDAgbGluZShzKSBvZiB0ZXh0ICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBtYWluIG1ldGhvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NlZDogZmFsc2VcbkhlbGxvIFdvcmxkXG5FeHBlY3RlZDogU3RyaW5nIFN0cmluZyAgICAgICAgICAgIEFjdHVhbDogU3RyaW5nIFN0cmluZyAgICAgICAgICAgIE1lc3NhZ2U6IENoZWNraW5nIEluc3RhbmNlIFZhcmlhYmxlIFR5cGUocykgICAgICAgICAgICAgICAgUGFzc2VkOiB0cnVlXG5FeHBlY3RlZDogUXVlc3Rpb24gICAgICAgICAgICAgICAgIEFjdHVhbDogUXVlc3Rpb24gICAgICAgICAgICAgICAgIE1lc3NhZ2U6IENoZWNraW5nIG1ldGhvZCBwcmludFF1ZXN0aW9uKCkgICAgICAgICAgICAgICAgICAgUGFzc2VkOiB0cnVlXG5EZWJ1Z2dpbmcgb3V0cHV0XG5Nb3JlIGRlYnVnIG91dHB1dFxuRXhwZWN0ZWQ6IDIgUHJpdmF0ZSAgICAgICAgICAgICAgICBBY3R1YWw6IDIgUHJpdmF0ZSAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBQcml2YXRlIEluc3RhbmNlIFZhcmlhYmxlKHMpICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRXhwZWN0ZWQ6IHBhc3MgICAgICAgICAgICAgICAgICAgICBBY3R1YWw6IHBhc3MgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRXhwZWN0ZWQ6IGZhaWwgICAgICAgICAgICAgICAgICAgICBBY3R1YWw6IGZhaWwgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBkZWZhdWx0IGNvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRW5kaW5nIFRlc3RzXG5Zb3UgZ290IDYgb3V0IG9mIDcgY29ycmVjdC4gODUuNzElYDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSlVuaXRUZXN0UGFyc2VyIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXQsIHBhcmVudElkKSB7XG4gICAgICAgIGxldCBwYXR0ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgIFwiRXhwZWN0ZWQ6XFxcXHMrKC4qPylBY3R1YWw6XFxcXHMrKC4qPylNZXNzYWdlOlxcXFxzKyguKj8pUGFzc2VkOlxcXFxzKyh0cnVlfGZhbHNlKVwiLFxuICAgICAgICAgICAgXCJnXCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy50ZXh0UmVzdWx0cyA9IFwiXCI7XG4gICAgICAgIGxldCBtYXRjaGVzID0gb3V0cHV0Lm1hdGNoQWxsKHBhdHQpO1xuICAgICAgICBsZXQgcGFyZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5hZGQoXCJ1bml0dGVzdC1yZXN1bHRzXCIpO1xuICAgICAgICBsZXQgdGJsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRhYmxlXCIpO1xuICAgICAgICB0YmwuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGJsKTtcbiAgICAgICAgcGFyZW50LnNldEF0dHJpYnV0ZShcImlkXCIsIGAke3BhcmVudElkfV91bml0X3Jlc3VsdHNgKTtcbiAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyXCIpO1xuICAgICAgICB0ci5pbm5lckhUTUwgPVxuICAgICAgICAgICAgJzx0aCBjbGFzcz1cImFjLWZlZWRiYWNrXCI+UmVzdWx0PC90aD48dGggY2xhc3M9XCJhYy1mZWVkYmFja1wiPkV4cGVjdGVkPC90aD48dGggY2xhc3M9XCJhYy1mZWVkYmFja1wiPkFjdHVhbDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5Ob3RlczwvdGg+JztcbiAgICAgICAgdGJsLmFwcGVuZENoaWxkKHRyKTtcbiAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBsZXQgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidHJcIik7XG4gICAgICAgICAgICBsZXQgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGRcIik7XG4gICAgICAgICAgICB0ZC5jbGFzc0xpc3QuYWRkKFwiYWMtZmVlZGJhY2tcIik7XG4gICAgICAgICAgICBpZiAobWF0Y2hbbWF0Y2gubGVuZ3RoIC0gMV0gPT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICB0ZC5pbm5lckhUTUwgPSBcIlBhc3NcIjtcbiAgICAgICAgICAgICAgICB0ZC5zdHlsZSA9XG4gICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogcmdiKDEzMSwgMjExLCAxMzApOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRkLmlubmVySFRNTCA9IFwiRmFpbFwiO1xuICAgICAgICAgICAgICAgIHRkLnN0eWxlID1cbiAgICAgICAgICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjIyLCAxNDIsIDE1MCk7IHRleHQtYWxpZ246IGNlbnRlcjtcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyLmFwcGVuZENoaWxkKHRkKTtcbiAgICAgICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG1hdGNoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiKTtcbiAgICAgICAgICAgICAgICB0ZC5pbm5lckhUTUwgPSBtYXRjaFtpXTtcbiAgICAgICAgICAgICAgICB0ZC5jbGFzc0xpc3QuYWRkKFwiYWMtZmVlZGJhY2tcIik7XG4gICAgICAgICAgICAgICAgdHIuYXBwZW5kQ2hpbGQodGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGJsLmFwcGVuZENoaWxkKHRyKTtcbiAgICAgICAgICAgIHRoaXMudGFibGUgPSBwYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLnRleHRSZXN1bHRzICs9IG1hdGNoWzBdICsgXCJcXG5cIjtcbiAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKG1hdGNoWzBdLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWF0Y2ggPSBvdXRwdXQubWF0Y2goXG4gICAgICAgICAgICAvWW91IGdvdFxccysoXFxkKykgb3V0IG9mIChcXGQrKSBjb3JyZWN0LlxccysoXFxkK1xcLlxcZCspJS9cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShtYXRjaFswXSwgXCJcIik7XG4gICAgICAgICAgICBsZXQgcGN0U3RyaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgICBwY3RTdHJpbmcuaW5uZXJIVE1MID0gbWF0Y2hbMF07XG4gICAgICAgICAgICB0aGlzLnBjdFN0cmluZyA9IHBjdFN0cmluZztcbiAgICAgICAgICAgIHRoaXMucGN0ID0gbWF0Y2hbM107XG4gICAgICAgICAgICB0aGlzLnBhc3NlZCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgdGhpcy5mYWlsZWQgPSBtYXRjaFsyXSAtIG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKFwiU3RhcnRpbmcgVGVzdHNcIiwgXCJcIik7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKFwiRW5kaW5nIFRlc3RzXCIsIFwiXCIpO1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoLyg8YnI+KSsvZywgXCI8YnI+XCIpO1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZUFsbChcIiZsdDtpbWdcIiwgXCI8aW1nXCIpO1xuICAgICAgICB0aGlzLnN0ZG91dCA9IG91dHB1dDtcbiAgICB9XG59XG5cbi8vIGxldCB4ID0gbmV3IFJlc3VsdHNUb1RhYmxlKHRlc3RTdHJpbmcpO1xuLy8gY29uc29sZS5sb2coeC5zdGRvdXQpO1xuLy8gY29uc29sZS5sb2coeC50YWJsZSk7XG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuaW1wb3J0IE1ENSBmcm9tIFwiLi9tZDUuanNcIjtcbmltcG9ydCBKVW5pdFRlc3RQYXJzZXIgZnJvbSBcIi4vZXh0cmFjdFVuaXRSZXN1bHRzLmpzXCI7XG5pbXBvcnQgXCIuLi8uLi9jb2RlbGVucy9qcy9weXR1dG9yLWVtYmVkLmJ1bmRsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdmFyIG9yaWcgPSAkKG9wdHMub3JpZykuZmluZChcInRleHRhcmVhXCIpWzBdO1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy5zdGRpbiA9ICQob3JpZykuZGF0YShcInN0ZGluXCIpO1xuICAgICAgICB0aGlzLmRhdGFmaWxlID0gJChvcmlnKS5kYXRhKFwiZGF0YWZpbGVcIik7XG4gICAgICAgIHRoaXMuc291cmNlZmlsZSA9ICQob3JpZykuZGF0YShcInNvdXJjZWZpbGVcIik7XG4gICAgICAgIHRoaXMuY29tcGlsZWFyZ3MgPSB1bmVzY2FwZUh0bWwoJChvcmlnKS5kYXRhKFwiY29tcGlsZWFyZ3NcIikpO1xuICAgICAgICB0aGlzLmxpbmthcmdzID0gdW5lc2NhcGVIdG1sKCQob3JpZykuZGF0YShcImxpbmthcmdzXCIpKTtcbiAgICAgICAgdGhpcy5ydW5hcmdzID0gdW5lc2NhcGVIdG1sKCQob3JpZykuZGF0YShcInJ1bmFyZ3NcIikpO1xuICAgICAgICB0aGlzLmludGVycHJldGVyYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJpbnRlcnByZXRlcmFyZ3NcIikpO1xuICAgICAgICB0aGlzLkFQSV9LRVkgPSBcIjY3MDMzcFY3ZVVVdnFvMDdPSkRJVjhVWjA0OWFMRUsxXCI7XG4gICAgICAgIHRoaXMuVVNFX0FQSV9LRVkgPSB0cnVlO1xuICAgICAgICB0aGlzLkpPQkVfU0VSVkVSID0gZUJvb2tDb25maWcuam9iZWhvc3QgfHwgZUJvb2tDb25maWcuaG9zdDtcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IGVCb29rQ29uZmlnLnByb3h5dXJpX3J1bnMgfHwgXCIvcnVuZXN0b25lL3Byb3h5L2pvYmVSdW5cIjtcbiAgICAgICAgdGhpcy5qb2JlUHV0RmlsZXMgPVxuICAgICAgICAgICAgZUJvb2tDb25maWcucHJveHl1cmlfZmlsZXMgfHwgXCIvcnVuZXN0b25lL3Byb3h5L2pvYmVQdXNoRmlsZS9cIjtcbiAgICAgICAgdGhpcy5qb2JlQ2hlY2tGaWxlcyA9XG4gICAgICAgICAgICBlQm9va0NvbmZpZy5wcm94eXVyaV9maWxlcyB8fCBcIi9ydW5lc3RvbmUvcHJveHkvam9iZUNoZWNrRmlsZS9cIjtcbiAgICAgICAgLy8gVE9ETzogIHNob3VsZCBhZGQgYSBwcm9wZXIgcHV0L2NoZWNrIGluIHBhdmVtZW50LnRtcGwgYXMgdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCB3aWxsIGJyZWFrIG9uIHJ1bmVzdG9uZVxuICAgICAgICB0aGlzLmRpdjJpZCA9IHt9O1xuICAgICAgICBpZiAodGhpcy5zdGRpbikge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVJbnB1dEVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNyZWF0ZUVycm9yT3V0cHV0KCk7XG4gICAgfVxuICAgIG91dHB1dGZ1bihhKSB7fVxuICAgIGNyZWF0ZUlucHV0RWxlbWVudCgpIHtcbiAgICAgICAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICBsYWJlbC5mb3IgPSB0aGlzLmRpdmlkICsgXCJfc3RkaW5cIjtcbiAgICAgICAgJChsYWJlbCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbnB1dF9wcmdcIikpO1xuICAgICAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgIGlucHV0LmlkID0gdGhpcy5kaXZpZCArIFwiX3N0ZGluXCI7XG4gICAgICAgIGlucHV0LnR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgaW5wdXQuc2l6ZSA9IFwiMzVcIjtcbiAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLnN0ZGluO1xuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgICAgIHRoaXMuc3RkaW5fZWwgPSBpbnB1dDtcbiAgICB9XG4gICAgY3JlYXRlRXJyb3JPdXRwdXQoKSB7fVxuXG4gICAgLyogIE1haW4gcnVuUHJvZyBtZXRob2QgZm9yIGxpdmVjb2RlXG4gICAgICpcbiAgICAgKi9cbiAgICBhc3luYyBydW5Qcm9nKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnJ1blNldHVwKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5zdWJtaXRUb0pvYmUoKTtcbiAgICAgICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAkLmkxOG4oYFNlcnZlciBFcnJvcjogJHtyZXMuc3RhdHVzVGV4dH1gKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcImZhaWxcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBydW5SZXN1bHRzID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0pvYmVSZXNwb25zZShydW5SZXN1bHRzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3NlcnZlcl9jb21tX2VyclwiKSArIGUudG9TdHJpbmcoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBgZmFpbDogJHtlfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwic3VjY2Vzc1wiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb3RlOlxuICAgICAqIEluIG9yZGVyIHRvIGNoZWNrIGZvciBzdXBwbGVtZW50YWwgZmlsZXMgaW4gamF2YSBhbmQgZGVhbCB3aXRoIGFzeW5jaHJvbmljaXR5XG4gICAgICogSSBzcGxpdCB0aGUgb3JpZ2luYWwgcnVuUHJvZyBpbnRvIHR3byBmdW5jdGlvbnM6IHJ1blByb2cgYW5kIHJ1blByb2dfY2FsbGJhY2tcbiAgICAgKi9cbiAgICBhc3luYyBydW5TZXR1cCgpIHtcbiAgICAgICAgdmFyIHN0ZGluO1xuICAgICAgICB2YXIgc291cmNlO1xuICAgICAgICB2YXIgc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgdmFyIHNmaWxlbWFwID0ge1xuICAgICAgICAgICAgamF2YTogXCJcIixcbiAgICAgICAgICAgIGNwcDogXCJ0ZXN0LmNwcFwiLFxuICAgICAgICAgICAgYzogXCJ0ZXN0LmNcIixcbiAgICAgICAgICAgIHB5dGhvbjM6IFwidGVzdC5weVwiLFxuICAgICAgICAgICAgcHl0aG9uMjogXCJ0ZXN0LnB5XCIsXG4gICAgICAgICAgICBvY3RhdmU6IFwib2N0YXRlc3QubVwiLFxuICAgICAgICB9O1xuICAgICAgICB2YXIgc291cmNlZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICB2YXIgdGVzdGRyaXZlcm5hbWUgPSBcIlwiO1xuICAgICAgICB2YXIgZmlsZV9jaGVja3A7XG5cbiAgICAgICAgLy8gZXh0cmFjdCB0aGUgY2xhc3MgbmFtZXMgc28gZmlsZXMgY2FuIGJlIG5hbWVkIHByb3Blcmx5XG4gICAgICAgIGlmICh0aGlzLnN1ZmZpeCAmJiB0aGlzLmxhbmd1YWdlID09IFwiamF2YVwiKSB7XG4gICAgICAgICAgICBsZXQgY2xhc3NNYXRjaCA9IG5ldyBSZWdFeHAoL3B1YmxpYyBjbGFzc1xccysoXFx3KylbXFxzK3tdLyk7XG4gICAgICAgICAgICBzb3VyY2UgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7XG4gICAgICAgICAgICBsZXQgbSA9IHNvdXJjZS5tYXRjaChjbGFzc01hdGNoKTtcbiAgICAgICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgICAgICAgc291cmNlZmlsZW5hbWUgPSBtWzFdICsgXCIuamF2YVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGJlIHVuaXQgdGVzdCBjb2RlXG4gICAgICAgICAgICBtID0gdGhpcy5zdWZmaXgubWF0Y2goY2xhc3NNYXRjaCk7XG4gICAgICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgICAgIHRlc3Rkcml2ZXJuYW1lID0gbVsxXSArIFwiLmphdmFcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvdXJjZSA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhIGlzIGNvbnZlcnRpYmxlIHRvIEJhc2U2NC4gSWYgbm90IHRoZW4gZXJyb3Igb3V0IG5vd1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYnRvYShzb3VyY2UpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhbGVydChcbiAgICAgICAgICAgICAgICBcIkVycm9yOiBCYWQgQ2hhcmFjdGVycyBpbiB0aGUgYWN0aXZlY29kZSB3aW5kb3cuIExpa2VseSBhIHF1b3RlIGNoYXJhY3RlciB0aGF0IGhhcyBiZWVuIGNvcHkvcGFzdGVkLiDwn5mBXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpO1xuXG4gICAgICAgIC8vIGFzc2VtYmxlIHBhcmFtZXRlcnMgZm9yIEpPQkVcbiAgICAgICAgdmFyIHBhcmFtbGlzdCA9IFtcbiAgICAgICAgICAgIFwiY29tcGlsZWFyZ3NcIixcbiAgICAgICAgICAgIFwibGlua2FyZ3NcIixcbiAgICAgICAgICAgIFwicnVuYXJnc1wiLFxuICAgICAgICAgICAgXCJpbnRlcnByZXRlcmFyZ3NcIixcbiAgICAgICAgICAgIFwibWVtb3J5bGltaXRcIixcbiAgICAgICAgXTtcbiAgICAgICAgdmFyIHBhcmFtb2JqID0ge307XG4gICAgICAgIGZvciAobGV0IHBhcmFtIG9mIHBhcmFtbGlzdCkge1xuICAgICAgICAgICAgaWYgKHRoaXNbcGFyYW1dKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1vYmpbcGFyYW1dID0gZXZhbCh0aGlzW3BhcmFtXSk7IC8vIG5lZWRzIGEgbGlzdFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlID09PSBcIm9jdGF2ZVwiKSB7XG4gICAgICAgICAgICBwYXJhbW9iai5tZW1vcnlsaW1pdCA9IDIwMDAwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0ZGluKSB7XG4gICAgICAgICAgICBzdGRpbiA9ICQodGhpcy5zdGRpbl9lbCkudmFsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZWZpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlZmlsZSA9IHNmaWxlbWFwW3RoaXMubGFuZ3VhZ2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgJCh0aGlzLm91dHB1dCkuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9jb21waWxpbmdfcnVubmluZ1wiKSk7XG4gICAgICAgIHZhciBmaWxlcyA9IFtdO1xuICAgICAgICB2YXIgY29udGVudCwgYmFzZTY0O1xuICAgICAgICBpZiAodGhpcy5kYXRhZmlsZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBpZHMgPSB0aGlzLmRhdGFmaWxlLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVOYW1lID0gaWRzW2ldLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZUV4dGVuc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUubGFzdEluZGV4T2YoXCIuXCIpICsgMVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGUgPT09IG51bGwgfHwgZmlsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTm8gZmlsZSB3aXRoIGdpdmVuIGlkXCIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgZmlsZSBpcyBpbiBkYlxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gdGhpcy5maWxlUmVhZGVyKGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gZmlsZS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGJlIHVuZGVmaW5lZCBhdCB0aGlzIHBvaW50IGlmIGZpbGUgaXMgYW4gaW1hZ2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZpbGVFeHRlbnNpb24gPT09IFwiamFyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBmaWxlcy5jb25jYXQodGhpcy5wYXJzZUphdmFDbGFzc2VzKGNvbnRlbnQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFtcImpwZ1wiLCBcInBuZ1wiLCBcImdpZlwiXS5pbmRleE9mKGZpbGVFeHRlbnNpb24pID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLnRvRGF0YVVSTCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NCA9IGZpbGUudG9EYXRhVVJMKFwiaW1hZ2UvXCIgKyBmaWxlRXh0ZW5zaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyaW5nKGJhc2U2NC5pbmRleE9mKFwiLFwiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBmaWxlLnNyYy5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3JjLmluZGV4T2YoXCIsXCIpICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBmaWxlTmFtZSwgY29udGVudDogYmFzZTY0IH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIGNsYXNzTmFtZSBvciB1biByZWNvZ25pemVkIGNsYXNzTmFtZSBpdCBpcyB0cmVhdGVkIGFzIGFuIGluZGl2aWR1YWwgZmlsZVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGFueSB0eXBlIG9mIGZpbGUsIC50eHQsIC5qYXZhLCAuY3N2LCBldGNcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaCh7IG5hbWU6IGZpbGVOYW1lLCBjb250ZW50OiBjb250ZW50IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBhcmUgcnVubmluZyB1bml0IHRlc3RzIHdlIG5lZWQgdG8gc3Vic3RpdHV0ZSB0aGUgdGVzdCBkcml2ZXIgZm9yIHRoZSBzdHVkZW50XG4gICAgICAgIC8vIGNvZGUgYW5kIHNlbmQgdGhlIHN0dWRlbnQgY29kZSBhcyBhIGZpbGUuICBXZSdsbCBkbyB0aGF0IGhlcmUuXG4gICAgICAgIHRoaXMuanVuaXREcml2ZXJDb2RlID0gYFxuICAgICAgICBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5KVW5pdENvcmU7XG4gICAgICAgIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJlc3VsdDtcbiAgICAgICAgaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubm90aWZpY2F0aW9uLkZhaWx1cmU7XG5cbiAgICAgICAgcHVibGljIGNsYXNzIFRlc3RSdW5uZXIge1xuICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuICAgICAgICAgICAgICAgIENvZGVUZXN0SGVscGVyLnJlc2V0RmluYWxSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IEpVbml0Q29yZS5ydW5DbGFzc2VzKCR7dGVzdGRyaXZlcm5hbWUucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgXCIuamF2YVwiLFxuICAgICAgICAgICAgICAgICAgICBcIi5jbGFzc1wiXG4gICAgICAgICAgICAgICAgKX0pO1xuICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihDb2RlVGVzdEhlbHBlci5nZXRGaW5hbFJlc3VsdHMoKSk7XG5cbiAgICAgICAgICAgICAgICBpbnQgdG90YWwgPSByZXN1bHQuZ2V0UnVuQ291bnQoKTtcbiAgICAgICAgICAgICAgICBpbnQgZmFpbHMgPSByZXN1bHQuZ2V0RmFpbHVyZUNvdW50KCk7XG4gICAgICAgICAgICAgICAgaW50IGNvcnIgID0gdG90YWwgLSBmYWlscztcbiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJZb3UgZ290IFwiICsgY29yciArIFwiIG91dCBvZiBcIiArIHRvdGFsICsgXCIgY29ycmVjdC4gXCIgKyBTdHJpbmcuZm9ybWF0KFwiJS4yZlwiLCAoMTAwLjAgKiBjb3JyIC8gdG90YWwpKSArIFwiJVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgICBpZiAodGhpcy5zdWZmaXggJiYgdGhpcy5sYW5ndWFnZSA9PSBcImphdmFcIikge1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IG5hbWU6IHNvdXJjZWZpbGVuYW1lLCBjb250ZW50OiBzb3VyY2UgfSk7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgbmFtZTogdGVzdGRyaXZlcm5hbWUsIGNvbnRlbnQ6IHRoaXMuc3VmZml4IH0pO1xuICAgICAgICAgICAgc291cmNlID0gdGhpcy5qdW5pdERyaXZlckNvZGU7XG4gICAgICAgICAgICBpZiAocGFyYW1vYmouY29tcGlsZWFyZ3MpIHtcbiAgICAgICAgICAgICAgICBwYXJhbW9iai5jb21waWxlYXJncy5wdXNoKHNvdXJjZWZpbGVuYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyYW1vYmouY29tcGlsZWFyZ3MgPSBbc291cmNlZmlsZW5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBydW5zcGVjID0ge1xuICAgICAgICAgICAgbGFuZ3VhZ2VfaWQ6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgICAgICBzb3VyY2Vjb2RlOiBzb3VyY2UsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbW9iaixcbiAgICAgICAgICAgIHNvdXJjZWZpbGVuYW1lOiB0aGlzLnNvdXJjZWZpbGUsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHN0ZGluKSB7XG4gICAgICAgICAgICBydW5zcGVjLmlucHV0ID0gc3RkaW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5qc29uX3J1bnNwZWMgPSBKU09OLnN0cmluZ2lmeSh7IHJ1bl9zcGVjOiBydW5zcGVjIH0pO1xuICAgICAgICAgICAgZmlsZV9jaGVja3AgPSBQcm9taXNlLnJlc29sdmUoXCJyZWFkeVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1bnNwZWNbXCJmaWxlX2xpc3RcIl0gPSBbXTtcbiAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcztcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IGZpbGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgdmFyIGZpbGVDb250ZW50ID0gZmlsZXNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5kaXYyaWRbZmlsZU5hbWVdID1cbiAgICAgICAgICAgICAgICAgICAgXCJydW5lc3RvbmVcIiArIE1ENShmaWxlTmFtZSArIGZpbGVDb250ZW50KTtcbiAgICAgICAgICAgICAgICBydW5zcGVjW1wiZmlsZV9saXN0XCJdLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5kaXYyaWRbZmlsZU5hbWVdLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jaGVja0ZpbGUoZmlsZXNbaV0sIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuanNvbl9ydW5zcGVjID0gSlNPTi5zdHJpbmdpZnkoeyBydW5fc3BlYzogcnVuc3BlYyB9KTtcbiAgICAgICAgICAgIHRoaXMuZGl2MmlkID0gaW5zdGFuY2UuZGl2MmlkO1xuICAgICAgICAgICAgZmlsZV9jaGVja3AgPSBQcm9taXNlLmFsbChwcm9taXNlcykuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3I6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlX2NoZWNrcDtcbiAgICB9XG5cbiAgICAvKiBTdWJtaXQgdGhlIGFzc2VtYmxlZCBqb2IgdG8gdGhlIEpPQkUgc2VydmVyIGFuZCBhd2FpdCB0aGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqL1xuICAgIGFzeW5jIHN1Ym1pdFRvSm9iZSgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmpzb25fcnVuc3BlYztcbiAgICAgICAgbGV0IGhvc3QgPSB0aGlzLkpPQkVfU0VSVkVSICsgdGhpcy5yZXNvdXJjZTtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coeyBkdXJhdGlvbjogNzAwLCBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgICQodGhpcy5lcnJEaXYpLnJlbW92ZSgpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwidmlzaWJsZVwiKTtcblxuICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICAgIFwiQ29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIFwiWC1BUEktS0VZXCI6IHRoaXMuQVBJX0tFWSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaG9zdCwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZldGNoKHJlcXVlc3QpO1xuXG4gICAgICAgIC8vLyQoXCIjXCIgKyBkaXZpZCArIFwiX2VycmluZm9cIikucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgcHJvY2Vzc0pvYmVSZXNwb25zZShyZXN1bHQpIHtcbiAgICAgICAgdmFyIGxvZ3Jlc3VsdDtcbiAgICAgICAgdmFyIG9kaXYgPSB0aGlzLm91dHB1dDtcbiAgICAgICAgdGhpcy5wYXJzZWRPdXRwdXQgPSB7fTtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICBpZiAocmVzdWx0Lm91dGNvbWUgPT09IDE1KSB7XG4gICAgICAgICAgICBsb2dyZXN1bHQgPSBcInN1Y2Nlc3NcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ3Jlc3VsdCA9IHJlc3VsdC5vdXRjb21lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXJyaW5mbyA9IGxvZ3Jlc3VsdDtcbiAgICAgICAgc3dpdGNoIChyZXN1bHQub3V0Y29tZSkge1xuICAgICAgICAgICAgY2FzZSAxNToge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkT3V0cHV0ID0gbmV3IEpVbml0VGVzdFBhcnNlcihcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0ZG91dCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXZpZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHRoaXMucGFyc2VkT3V0cHV0LnN0ZG91dCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlZE91dHB1dC5wY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZWRPdXRwdXQucGN0ID0gdGhpcy5wYXJzZWRPdXRwdXQucGFzc2VkID0gdGhpcy5wYXJzZWRPdXRwdXQuZmFpbGVkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXRfcmVzdWx0cyA9IGBwZXJjZW50OiR7dGhpcy5wYXJzZWRPdXRwdXQucGN0fTpwYXNzZWQ6JHt0aGlzLnBhcnNlZE91dHB1dC5wYXNzZWR9OmZhaWxlZDoke3RoaXMucGFyc2VkT3V0cHV0LmZhaWxlZH1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgMTE6IC8vIGNvbXBpbGVyIGVycm9yXG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3dlcmVfY29tcGlsaW5nX2VyclwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKHJlc3VsdC5jbXBpbmZvKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTI6IC8vIHJ1biB0aW1lIGVycm9yXG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHJlc3VsdC5zdGRvdXQucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGRlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKHJlc3VsdC5zdGRlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTM6IC8vIHRpbWUgbGltaXRcbiAgICAgICAgICAgICAgICAkKG9kaXYpLmh0bWwocmVzdWx0LnN0ZG91dC5yZXBsYWNlKC9cXG4vZywgXCI8YnI+XCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEpvYmVFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXhjXCIpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGRlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHJlc3VsdC5zdGRlcnIucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2VydmVyX2VyclwiKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0b2RvOiBoYW5kbGUgc2VydmVyIGJ1c3kgYW5kIHRpbWVvdXQgZXJyb3JzIHRvb1xuICAgIH1cblxuICAgIHJlbmRlckZlZWRiYWNrKCkge1xuICAgICAgICBsZXQgcmRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3RoaXMuZGl2aWR9X3VuaXRfcmVzdWx0c2ApO1xuICAgICAgICBpZiAocmRpdikge1xuICAgICAgICAgICAgcmRpdi5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJzZWRPdXRwdXQgJiYgdGhpcy5wYXJzZWRPdXRwdXQudGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMub3V0RGl2LmFwcGVuZENoaWxkKHRoaXMucGFyc2VkT3V0cHV0LnRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICByZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7dGhpcy5kaXZpZH1fdW5pdF9yZXN1bHRzYCk7XG4gICAgICAgIGlmIChyZGl2KSB7XG4gICAgICAgICAgICByZGl2LmFwcGVuZENoaWxkKHRoaXMucGFyc2VkT3V0cHV0LnBjdFN0cmluZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRKb2JlRXJyb3JNZXNzYWdlKGVycikge1xuICAgICAgICB2YXIgZXJySGVhZCA9ICQoXCI8aDM+XCIpLmh0bWwoXCJFcnJvclwiKTtcbiAgICAgICAgdmFyIGVDb250YWluZXIgPSB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmVyckRpdiA9IGVDb250YWluZXI7XG4gICAgICAgIGVDb250YWluZXIuY2xhc3NOYW1lID0gXCJlcnJvciBhbGVydCBhbGVydC1kYW5nZXJcIjtcbiAgICAgICAgZUNvbnRhaW5lci5pZCA9IHRoaXMuZGl2aWQgKyBcIl9lcnJpbmZvXCI7XG4gICAgICAgIGVDb250YWluZXIuYXBwZW5kQ2hpbGQoZXJySGVhZFswXSk7XG4gICAgICAgIHZhciBlcnJUZXh0ID0gZUNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpKTtcbiAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPSBlcnI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0byBzZWUgaWYgZmlsZSBpcyBvbiBzZXJ2ZXJcbiAgICAgKiBQbGFjZXMgaXQgb24gc2VydmVyIGlmIGl0IGlzIG5vdCBvbiBzZXJ2ZXJcbiAgICAgKiBAcGFyYW0gIHtvYmplY3R7bmFtZSwgY29udGVudHN9fSBmaWxlICAgIEZpbGUgdG8gcGxhY2Ugb24gc2VydmVyXG4gICAgICogQHBhcmFtICB7ZnVuY3Rpb259IHJlc29sdmUgcHJvbWlzZSByZXNvbHZlIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtICB7ZnVuY3Rpb259IHJlamVjdCAgcHJvbWlzZSByZWplY3QgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja0ZpbGUoZmlsZSwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBmaWxlX2lkID0gdGhpcy5kaXYyaWRbZmlsZS5uYW1lXTtcbiAgICAgICAgdmFyIHJlc291cmNlID0gdGhpcy5qb2JlQ2hlY2tGaWxlcyArIGZpbGVfaWQ7XG4gICAgICAgIHZhciBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHJlc291cmNlO1xuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiSEVBRFwiLCBob3N0LCB0cnVlKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLCBcInRleHQvcGxhaW5cIik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiWC1BUEktS0VZXCIsIHRoaXMuQVBJX0tFWSk7XG4gICAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJlcnJvciBzZW5kaW5nIGZpbGVcIiArIHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICB9O1xuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3dpdGNoICh4aHIuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDg6XG4gICAgICAgICAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRmlsZSBub3Qgb24gU2VydmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2hEYXRhRmlsZShmaWxlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQwMDpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJCYWQgUmVxdWVzdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjA0OlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZpbGUgYWxyZWFkeSBvbiBTZXJ2ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlRoaXMgY2FzZSBzaG91bGQgbmV2ZXIgaGFwcGVuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQbGFjZXMgYSBmaWxlIG9uIGEgc2VydmVyXG4gICAgICovXG4gICAgcHVzaERhdGFGaWxlKGZpbGUsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZmlsZU5hbWUgPSBmaWxlLm5hbWU7XG4gICAgICAgIHZhciBleHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUuaW5kZXhPZihcIi5cIikgKyAxKTtcbiAgICAgICAgdmFyIGZpbGVfaWQgPSB0aGlzLmRpdjJpZFtmaWxlTmFtZV07XG4gICAgICAgIHZhciBjb250ZW50cyA9IGZpbGUuY29udGVudDtcbiAgICAgICAgLy8gRmlsZSB0eXBlcyBiZWluZyB1cGxvYWRlZCB0aGF0IGNvbWUgaW4gYWxyZWFkeSBpbiBiYXNlNjQgZm9ybWF0XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gW1wiamFyXCIsIFwiemlwXCIsIFwicG5nXCIsIFwianBnXCIsIFwianBlZ1wiXTtcbiAgICAgICAgdmFyIGNvbnRlbnRzYjY0O1xuICAgICAgICBpZiAoZXh0ZW5zaW9ucy5pbmRleE9mKGV4dGVuc2lvbikgPT09IC0xKSB7XG4gICAgICAgICAgICBjb250ZW50c2I2NCA9IGJ0b2EoY29udGVudHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudHNiNjQgPSBjb250ZW50cztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF0YSA9IEpTT04uc3RyaW5naWZ5KHsgZmlsZV9jb250ZW50czogY29udGVudHNiNjQgfSk7XG4gICAgICAgIHZhciByZXNvdXJjZSA9IHRoaXMuam9iZVB1dEZpbGVzICsgZmlsZV9pZDtcbiAgICAgICAgdmFyIGhvc3QgPSB0aGlzLkpPQkVfU0VSVkVSICsgcmVzb3VyY2U7XG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJQVVRcIiwgaG9zdCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC10eXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIiwgXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQVBJLUtFWVwiLCB0aGlzLkFQSV9LRVkpO1xuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3dpdGNoICh4aHIuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRm9yYmlkZGVuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDA6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQmFkIFJlcXVlc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcInN1Y2Nlc3NmdWxseSBzZW50IGZpbGUgXCIgKyB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkZpbGUgXCIgKyBmaWxlTmFtZSArXCIsIFwiICsgZmlsZV9pZCArXCIgcGxhY2VkIG9uIHNlcnZlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRoaXMgY2FzZSBzaG91bGQgbmV2ZXIgaGFwcGVuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXJyb3Igc2VuZGluZyBmaWxlXCIgKyB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICB9O1xuICAgICAgICB4aHIuc2VuZChkYXRhKTtcbiAgICB9XG5cbiAgICBhc3luYyBzaG93Q29kZWxlbnMoKSB7XG4gICAgICAgIGxldCBjbE1lc3MgPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgICBjbE1lc3MgPSBcIkJ1aWxkaW5nIHlvdXIgdmlzdWFsaXphdGlvblwiO1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5pbm5lckhUTUwgPSBjbE1lc3M7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZWxlbnNcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIHRoaXMuY2xCdXR0b24uaW5uZXJUZXh0ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuc1wiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2wgPSB0aGlzLmNvZGVsZW5zLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChjbCkge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5yZW1vdmVDaGlsZChjbCk7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLmlubmVySFRNTCA9IGNsTWVzcztcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29kZSA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKGZhbHNlKTtcbiAgICAgICAgaWYgKGNvZGUubWF0Y2goL1N5c3RlbS5leGl0LykpIHtcbiAgICAgICAgICAgIGFsZXJ0KFxuICAgICAgICAgICAgICAgIFwiU29ycnkuLi4gU3lzdGVtLmV4aXQgYnJlYWtzIHRoZSB2aXN1YWxpemVyIHRlbXBvcmFyaWx5IHJlbW92aW5nXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlKC9TeXN0ZW0uZXhpdFxcKFxcZCtcXCk7LywgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG15VmFycyA9IHt9O1xuICAgICAgICBteVZhcnMuY29kZSA9IGNvZGU7XG4gICAgICAgIG15VmFycy5sYW5nID0gdGhpcy5sYW5ndWFnZTtcbiAgICAgICAgaWYgKHRoaXMuc3RkaW4pIHtcbiAgICAgICAgICAgIG15VmFycy5zdGRpbiA9ICQodGhpcy5zdGRpbl9lbCkudmFsKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRhcmdldERpdiA9IHRoaXMuY29kZWxlbnMuaWQ7XG5cbiAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcIi9ydW5lc3RvbmUvcHJveHkvcHl0dXRvcl90cmFjZVwiLCB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkobXlWYXJzKSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGxldCB2aXMgPSBhZGRWaXN1YWxpemVyVG9QYWdlKGRhdGEsIHRhcmdldERpdiwge1xuICAgICAgICAgICAgICAgIHN0YXJ0aW5nSW5zdHJ1Y3Rpb246IDAsXG4gICAgICAgICAgICAgICAgZWRpdENvZGVCYXNlVVJMOiBudWxsLFxuICAgICAgICAgICAgICAgIGhpZGVDb2RlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYW5nOiBteVZhcnMubGFuZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbGV0IHRhcmdldERpdkVycm9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0RGl2KTtcbiAgICAgICAgICAgIHRhcmdldERpdkVycm9yLmlubmVySFRNTCA9XG4gICAgICAgICAgICAgICAgXCJTb3JyeSwgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgeW91ciB2aXN1YWxpemF0aW9uLlwiO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJHZXQgVHJhY2UgRmFpbGVkIC0tIFwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50OiBcImNvZGVsZW5zXCIsXG4gICAgICAgICAgICBhY3Q6IFwidmlld1wiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXBlcmF0ZXMgdGV4dCBpbnRvIG11bHRpcGxlIC5qYXZhIGZpbGVzXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSB0ZXh0IFN0cmluZyB3aXRoIG11bGlwbGUgamF2YSBjbGFzc2VzIG5lZWRlZCB0byBiZSBzZXBlcmF0ZWRcbiAgICAgKiBAcmV0dXJuIHthcnJheSBvZiBvYmplY3RzfSAgLm5hbWUgZ2l2ZXMgdGhlIG5hbWUgb2YgdGhlIGphdmEgZmlsZSB3aXRoIC5qYXZhIGV4dGVuc2lvblxuICAgICAqICAgICAgICAgICAgICAgICAgIC5jb250ZW50IGdpdmVzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZVxuICAgICAqL1xuICAgIHBhcnNlSmF2YUNsYXNzZXModGV4dCkge1xuICAgICAgICB0ZXh0ID0gdGV4dC50cmltKCk7XG4gICAgICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuICAgICAgICB2YXIgc3RhY2sgPSAwO1xuICAgICAgICB2YXIgc3RhcnRJbmRleCA9IDA7XG4gICAgICAgIHZhciBjbGFzc2VzID0gW107XG4gICAgICAgIHZhciBpbXBvcnRJbmRleCA9IDA7XG4gICAgICAgIHZhciBlbmRPZkxhc3RDb21tZW50QmVmb3JlQ2xhc3NCZWdpbnMgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGFyID0gdGV4dC5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAoY2hhciA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckF0KGkpID09PSBcIi9cIikge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0ZXh0LmNoYXJBdChpKSAhPT0gXCJcXG5cIiAmJiBpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRPZkxhc3RDb21tZW50QmVmb3JlQ2xhc3NCZWdpbnMgPSBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0LmNoYXJBdChpKSA9PSBcIipcIikge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgICAgICh0ZXh0LmNoYXJBdChpKSAhPT0gXCIqXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmNoYXJBdChpICsgMSkgIT09IFwiL1wiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaSArIDEgPCB0ZXh0Lmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRPZkxhc3RDb21tZW50QmVmb3JlQ2xhc3NCZWdpbnMgPSBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0ZXh0LmNoYXJBdChpKSAhPT0gJ1wiJyAmJiBpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09IFwiJ1wiICYmIGkgPCB0ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBcIihcIikge1xuICAgICAgICAgICAgICAgIHZhciBwQ291bnQgPSAxO1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB3aGlsZSAocENvdW50ID4gMCAmJiBpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckF0KGkpID09PSBcIihcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5jaGFyQXQoaSkgPT09IFwiKVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwQ291bnQtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiB0ZXh0LmNoYXJBdChpKSA9PT0gXCJ7XCIpIHtcbiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3RhY2sgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCJ7XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2srKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckF0KGkpID09PSBcIn1cIikge1xuICAgICAgICAgICAgICAgICAgICBzdGFjay0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb3VuZCAmJiBzdGFjayA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIHZhciB3b3JkcyA9IHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhlbmRPZkxhc3RDb21tZW50QmVmb3JlQ2xhc3NCZWdpbnMsIHN0YXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgICAgICAgICAgLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB3ID0gMDsgdyA8IHdvcmRzLmxlbmd0aDsgdysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHdvcmRzW3ddO1xuICAgICAgICAgICAgICAgICAgICBpZiAod29yZHNbd10gPT09IFwiZXh0ZW5kc1wiIHx8IHdvcmRzW3ddID09PSBcImltcGxlbWVudHNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gd29yZHNbdyAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHdvcmRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudHJpbSgpICsgXCIuamF2YVwiO1xuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogdGV4dC5zdWJzdHJpbmcoaW1wb3J0SW5kZXgsIGVuZEluZGV4KSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGltcG9ydEluZGV4ID0gZW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gZW5kSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsYXNzZXM7XG4gICAgfVxufVxuZnVuY3Rpb24gdW5lc2NhcGVIdG1sKHNhZmUpIHtcbiAgICBpZiAoc2FmZSkge1xuICAgICAgICByZXR1cm4gc2FmZVxuICAgICAgICAgICAgLnJlcGxhY2UoLyZhbXA7L2csIFwiJlwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyZsdDsvZywgXCI8XCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvJmd0Oy9nLCBcIj5cIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mcXVvdDsvZywgJ1wiJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mI3gyNzsvZywgXCInXCIpO1xuICAgIH1cbn1cbiIsIi8qKlxuICpcbiAqICBNRDUgKE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSlcbiAqICBodHRwOi8vd3d3LndlYnRvb2xraXQuaW5mby9cbiAqXG4gKiovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1ENShzdHJpbmcpIHtcbiAgICBmdW5jdGlvbiBSb3RhdGVMZWZ0KGxWYWx1ZSwgaVNoaWZ0Qml0cykge1xuICAgICAgICByZXR1cm4gKGxWYWx1ZSA8PCBpU2hpZnRCaXRzKSB8IChsVmFsdWUgPj4+ICgzMiAtIGlTaGlmdEJpdHMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBBZGRVbnNpZ25lZChsWCwgbFkpIHtcbiAgICAgICAgdmFyIGxYNCwgbFk0LCBsWDgsIGxZOCwgbFJlc3VsdDtcbiAgICAgICAgbFg4ID0gbFggJiAweDgwMDAwMDAwO1xuICAgICAgICBsWTggPSBsWSAmIDB4ODAwMDAwMDA7XG4gICAgICAgIGxYNCA9IGxYICYgMHg0MDAwMDAwMDtcbiAgICAgICAgbFk0ID0gbFkgJiAweDQwMDAwMDAwO1xuICAgICAgICBsUmVzdWx0ID0gKGxYICYgMHgzZmZmZmZmZikgKyAobFkgJiAweDNmZmZmZmZmKTtcbiAgICAgICAgaWYgKGxYNCAmIGxZNCkge1xuICAgICAgICAgICAgcmV0dXJuIGxSZXN1bHQgXiAweDgwMDAwMDAwIF4gbFg4IF4gbFk4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChsWDQgfCBsWTQpIHtcbiAgICAgICAgICAgIGlmIChsUmVzdWx0ICYgMHg0MDAwMDAwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gMHhjMDAwMDAwMCBeIGxYOCBeIGxZODtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxSZXN1bHQgXiAweDQwMDAwMDAwIF4gbFg4IF4gbFk4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxSZXN1bHQgXiBsWDggXiBsWTg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBGKHgsIHksIHopIHtcbiAgICAgICAgcmV0dXJuICh4ICYgeSkgfCAofnggJiB6KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBHKHgsIHksIHopIHtcbiAgICAgICAgcmV0dXJuICh4ICYgeikgfCAoeSAmIH56KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBIKHgsIHksIHopIHtcbiAgICAgICAgcmV0dXJuIHggXiB5IF4gejtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBJKHgsIHksIHopIHtcbiAgICAgICAgcmV0dXJuIHkgXiAoeCB8IH56KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBGRihhLCBiLCBjLCBkLCB4LCBzLCBhYykge1xuICAgICAgICBhID0gQWRkVW5zaWduZWQoYSwgQWRkVW5zaWduZWQoQWRkVW5zaWduZWQoRihiLCBjLCBkKSwgeCksIGFjKSk7XG4gICAgICAgIHJldHVybiBBZGRVbnNpZ25lZChSb3RhdGVMZWZ0KGEsIHMpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBHRyhhLCBiLCBjLCBkLCB4LCBzLCBhYykge1xuICAgICAgICBhID0gQWRkVW5zaWduZWQoYSwgQWRkVW5zaWduZWQoQWRkVW5zaWduZWQoRyhiLCBjLCBkKSwgeCksIGFjKSk7XG4gICAgICAgIHJldHVybiBBZGRVbnNpZ25lZChSb3RhdGVMZWZ0KGEsIHMpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBISChhLCBiLCBjLCBkLCB4LCBzLCBhYykge1xuICAgICAgICBhID0gQWRkVW5zaWduZWQoYSwgQWRkVW5zaWduZWQoQWRkVW5zaWduZWQoSChiLCBjLCBkKSwgeCksIGFjKSk7XG4gICAgICAgIHJldHVybiBBZGRVbnNpZ25lZChSb3RhdGVMZWZ0KGEsIHMpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBJSShhLCBiLCBjLCBkLCB4LCBzLCBhYykge1xuICAgICAgICBhID0gQWRkVW5zaWduZWQoYSwgQWRkVW5zaWduZWQoQWRkVW5zaWduZWQoSShiLCBjLCBkKSwgeCksIGFjKSk7XG4gICAgICAgIHJldHVybiBBZGRVbnNpZ25lZChSb3RhdGVMZWZ0KGEsIHMpLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBDb252ZXJ0VG9Xb3JkQXJyYXkoc3RyaW5nKSB7XG4gICAgICAgIHZhciBsV29yZENvdW50O1xuICAgICAgICB2YXIgbE1lc3NhZ2VMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgICB2YXIgbE51bWJlck9mV29yZHNfdGVtcDEgPSBsTWVzc2FnZUxlbmd0aCArIDg7XG4gICAgICAgIHZhciBsTnVtYmVyT2ZXb3Jkc190ZW1wMiA9XG4gICAgICAgICAgICAobE51bWJlck9mV29yZHNfdGVtcDEgLSAobE51bWJlck9mV29yZHNfdGVtcDEgJSA2NCkpIC8gNjQ7XG4gICAgICAgIHZhciBsTnVtYmVyT2ZXb3JkcyA9IChsTnVtYmVyT2ZXb3Jkc190ZW1wMiArIDEpICogMTY7XG4gICAgICAgIHZhciBsV29yZEFycmF5ID0gQXJyYXkobE51bWJlck9mV29yZHMgLSAxKTtcbiAgICAgICAgdmFyIGxCeXRlUG9zaXRpb24gPSAwO1xuICAgICAgICB2YXIgbEJ5dGVDb3VudCA9IDA7XG4gICAgICAgIHdoaWxlIChsQnl0ZUNvdW50IDwgbE1lc3NhZ2VMZW5ndGgpIHtcbiAgICAgICAgICAgIGxXb3JkQ291bnQgPSAobEJ5dGVDb3VudCAtIChsQnl0ZUNvdW50ICUgNCkpIC8gNDtcbiAgICAgICAgICAgIGxCeXRlUG9zaXRpb24gPSAobEJ5dGVDb3VudCAlIDQpICogODtcbiAgICAgICAgICAgIGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gPVxuICAgICAgICAgICAgICAgIGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gfFxuICAgICAgICAgICAgICAgIChzdHJpbmcuY2hhckNvZGVBdChsQnl0ZUNvdW50KSA8PCBsQnl0ZVBvc2l0aW9uKTtcbiAgICAgICAgICAgIGxCeXRlQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgICBsV29yZENvdW50ID0gKGxCeXRlQ291bnQgLSAobEJ5dGVDb3VudCAlIDQpKSAvIDQ7XG4gICAgICAgIGxCeXRlUG9zaXRpb24gPSAobEJ5dGVDb3VudCAlIDQpICogODtcbiAgICAgICAgbFdvcmRBcnJheVtsV29yZENvdW50XSA9XG4gICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdIHwgKDB4ODAgPDwgbEJ5dGVQb3NpdGlvbik7XG4gICAgICAgIGxXb3JkQXJyYXlbbE51bWJlck9mV29yZHMgLSAyXSA9IGxNZXNzYWdlTGVuZ3RoIDw8IDM7XG4gICAgICAgIGxXb3JkQXJyYXlbbE51bWJlck9mV29yZHMgLSAxXSA9IGxNZXNzYWdlTGVuZ3RoID4+PiAyOTtcbiAgICAgICAgcmV0dXJuIGxXb3JkQXJyYXk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV29yZFRvSGV4KGxWYWx1ZSkge1xuICAgICAgICB2YXIgV29yZFRvSGV4VmFsdWUgPSBcIlwiLFxuICAgICAgICAgICAgV29yZFRvSGV4VmFsdWVfdGVtcCA9IFwiXCIsXG4gICAgICAgICAgICBsQnl0ZSxcbiAgICAgICAgICAgIGxDb3VudDtcbiAgICAgICAgZm9yIChsQ291bnQgPSAwOyBsQ291bnQgPD0gMzsgbENvdW50KyspIHtcbiAgICAgICAgICAgIGxCeXRlID0gKGxWYWx1ZSA+Pj4gKGxDb3VudCAqIDgpKSAmIDI1NTtcbiAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAgPSBcIjBcIiArIGxCeXRlLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlID1cbiAgICAgICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZSArXG4gICAgICAgICAgICAgICAgV29yZFRvSGV4VmFsdWVfdGVtcC5zdWJzdHIoV29yZFRvSGV4VmFsdWVfdGVtcC5sZW5ndGggLSAyLCAyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV29yZFRvSGV4VmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gVXRmOEVuY29kZShzdHJpbmcpIHtcbiAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoL1xcclxcbi9nLCBcIlxcblwiKTtcbiAgICAgICAgdmFyIHV0ZnRleHQgPSBcIlwiO1xuXG4gICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgc3RyaW5nLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KG4pO1xuXG4gICAgICAgICAgICBpZiAoYyA8IDEyOCkge1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+IDEyNyAmJiBjIDwgMjA0OCkge1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiA2KSB8IDE5Mik7XG4gICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgNjMpIHwgMTI4KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjID4+IDEyKSB8IDIyNCk7XG4gICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyA+PiA2KSAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgNjMpIHwgMTI4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1dGZ0ZXh0O1xuICAgIH1cblxuICAgIHZhciB4ID0gQXJyYXkoKTtcbiAgICB2YXIgaywgQUEsIEJCLCBDQywgREQsIGEsIGIsIGMsIGQ7XG4gICAgdmFyIFMxMSA9IDcsXG4gICAgICAgIFMxMiA9IDEyLFxuICAgICAgICBTMTMgPSAxNyxcbiAgICAgICAgUzE0ID0gMjI7XG4gICAgdmFyIFMyMSA9IDUsXG4gICAgICAgIFMyMiA9IDksXG4gICAgICAgIFMyMyA9IDE0LFxuICAgICAgICBTMjQgPSAyMDtcbiAgICB2YXIgUzMxID0gNCxcbiAgICAgICAgUzMyID0gMTEsXG4gICAgICAgIFMzMyA9IDE2LFxuICAgICAgICBTMzQgPSAyMztcbiAgICB2YXIgUzQxID0gNixcbiAgICAgICAgUzQyID0gMTAsXG4gICAgICAgIFM0MyA9IDE1LFxuICAgICAgICBTNDQgPSAyMTtcblxuICAgIHN0cmluZyA9IFV0ZjhFbmNvZGUoc3RyaW5nKTtcblxuICAgIHggPSBDb252ZXJ0VG9Xb3JkQXJyYXkoc3RyaW5nKTtcblxuICAgIGEgPSAweDY3NDUyMzAxO1xuICAgIGIgPSAweGVmY2RhYjg5O1xuICAgIGMgPSAweDk4YmFkY2ZlO1xuICAgIGQgPSAweDEwMzI1NDc2O1xuXG4gICAgZm9yIChrID0gMDsgayA8IHgubGVuZ3RoOyBrICs9IDE2KSB7XG4gICAgICAgIEFBID0gYTtcbiAgICAgICAgQkIgPSBiO1xuICAgICAgICBDQyA9IGM7XG4gICAgICAgIEREID0gZDtcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDBdLCBTMTEsIDB4ZDc2YWE0NzgpO1xuICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgMV0sIFMxMiwgMHhlOGM3Yjc1Nik7XG4gICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCB4W2sgKyAyXSwgUzEzLCAweDI0MjA3MGRiKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDNdLCBTMTQsIDB4YzFiZGNlZWUpO1xuICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgeFtrICsgNF0sIFMxMSwgMHhmNTdjMGZhZik7XG4gICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCB4W2sgKyA1XSwgUzEyLCAweDQ3ODdjNjJhKTtcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDZdLCBTMTMsIDB4YTgzMDQ2MTMpO1xuICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgeFtrICsgN10sIFMxNCwgMHhmZDQ2OTUwMSk7XG4gICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCB4W2sgKyA4XSwgUzExLCAweDY5ODA5OGQ4KTtcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDldLCBTMTIsIDB4OGI0NGY3YWYpO1xuICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgeFtrICsgMTBdLCBTMTMsIDB4ZmZmZjViYjEpO1xuICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgeFtrICsgMTFdLCBTMTQsIDB4ODk1Y2Q3YmUpO1xuICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgeFtrICsgMTJdLCBTMTEsIDB4NmI5MDExMjIpO1xuICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgMTNdLCBTMTIsIDB4ZmQ5ODcxOTMpO1xuICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgeFtrICsgMTRdLCBTMTMsIDB4YTY3OTQzOGUpO1xuICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgeFtrICsgMTVdLCBTMTQsIDB4NDliNDA4MjEpO1xuICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgeFtrICsgMV0sIFMyMSwgMHhmNjFlMjU2Mik7XG4gICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCB4W2sgKyA2XSwgUzIyLCAweGMwNDBiMzQwKTtcbiAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIHhbayArIDExXSwgUzIzLCAweDI2NWU1YTUxKTtcbiAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIHhbayArIDBdLCBTMjQsIDB4ZTliNmM3YWEpO1xuICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgeFtrICsgNV0sIFMyMSwgMHhkNjJmMTA1ZCk7XG4gICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCB4W2sgKyAxMF0sIFMyMiwgMHgyNDQxNDUzKTtcbiAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIHhbayArIDE1XSwgUzIzLCAweGQ4YTFlNjgxKTtcbiAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIHhbayArIDRdLCBTMjQsIDB4ZTdkM2ZiYzgpO1xuICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgeFtrICsgOV0sIFMyMSwgMHgyMWUxY2RlNik7XG4gICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCB4W2sgKyAxNF0sIFMyMiwgMHhjMzM3MDdkNik7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAzXSwgUzIzLCAweGY0ZDUwZDg3KTtcbiAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIHhbayArIDhdLCBTMjQsIDB4NDU1YTE0ZWQpO1xuICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgeFtrICsgMTNdLCBTMjEsIDB4YTllM2U5MDUpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMl0sIFMyMiwgMHhmY2VmYTNmOCk7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyA3XSwgUzIzLCAweDY3NmYwMmQ5KTtcbiAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIHhbayArIDEyXSwgUzI0LCAweDhkMmE0YzhhKTtcbiAgICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIHhbayArIDVdLCBTMzEsIDB4ZmZmYTM5NDIpO1xuICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgeFtrICsgOF0sIFMzMiwgMHg4NzcxZjY4MSk7XG4gICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyAxMV0sIFMzMywgMHg2ZDlkNjEyMik7XG4gICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCB4W2sgKyAxNF0sIFMzNCwgMHhmZGU1MzgwYyk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyAxXSwgUzMxLCAweGE0YmVlYTQ0KTtcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDRdLCBTMzIsIDB4NGJkZWNmYTkpO1xuICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgeFtrICsgN10sIFMzMywgMHhmNmJiNGI2MCk7XG4gICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCB4W2sgKyAxMF0sIFMzNCwgMHhiZWJmYmM3MCk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyAxM10sIFMzMSwgMHgyODliN2VjNik7XG4gICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCB4W2sgKyAwXSwgUzMyLCAweGVhYTEyN2ZhKTtcbiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIHhbayArIDNdLCBTMzMsIDB4ZDRlZjMwODUpO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgNl0sIFMzNCwgMHg0ODgxZDA1KTtcbiAgICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIHhbayArIDldLCBTMzEsIDB4ZDlkNGQwMzkpO1xuICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgeFtrICsgMTJdLCBTMzIsIDB4ZTZkYjk5ZTUpO1xuICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgeFtrICsgMTVdLCBTMzMsIDB4MWZhMjdjZjgpO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMl0sIFMzNCwgMHhjNGFjNTY2NSk7XG4gICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyAwXSwgUzQxLCAweGY0MjkyMjQ0KTtcbiAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIHhbayArIDddLCBTNDIsIDB4NDMyYWZmOTcpO1xuICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgeFtrICsgMTRdLCBTNDMsIDB4YWI5NDIzYTcpO1xuICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgeFtrICsgNV0sIFM0NCwgMHhmYzkzYTAzOSk7XG4gICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyAxMl0sIFM0MSwgMHg2NTViNTljMyk7XG4gICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCB4W2sgKyAzXSwgUzQyLCAweDhmMGNjYzkyKTtcbiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIHhbayArIDEwXSwgUzQzLCAweGZmZWZmNDdkKTtcbiAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDFdLCBTNDQsIDB4ODU4NDVkZDEpO1xuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgOF0sIFM0MSwgMHg2ZmE4N2U0Zik7XG4gICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCB4W2sgKyAxNV0sIFM0MiwgMHhmZTJjZTZlMCk7XG4gICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyA2XSwgUzQzLCAweGEzMDE0MzE0KTtcbiAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDEzXSwgUzQ0LCAweDRlMDgxMWExKTtcbiAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIHhbayArIDRdLCBTNDEsIDB4Zjc1MzdlODIpO1xuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgMTFdLCBTNDIsIDB4YmQzYWYyMzUpO1xuICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgeFtrICsgMl0sIFM0MywgMHgyYWQ3ZDJiYik7XG4gICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCB4W2sgKyA5XSwgUzQ0LCAweGViODZkMzkxKTtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFBKTtcbiAgICAgICAgYiA9IEFkZFVuc2lnbmVkKGIsIEJCKTtcbiAgICAgICAgYyA9IEFkZFVuc2lnbmVkKGMsIENDKTtcbiAgICAgICAgZCA9IEFkZFVuc2lnbmVkKGQsIEREKTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcCA9IFdvcmRUb0hleChhKSArIFdvcmRUb0hleChiKSArIFdvcmRUb0hleChjKSArIFdvcmRUb0hleChkKTtcblxuICAgIHJldHVybiB0ZW1wLnRvTG93ZXJDYXNlKCk7XG59XG4iLCJTay5idWlsdGluRmlsZXM9e1wiZmlsZXNcIjp7XCJzcmMvYnVpbHRpbi9zeXMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBiLGE9TWF0aC5wb3csYz17fSxkPVtdLGU9U2suZ2V0U3lzQXJndigpO2ZvcihiPTA7YjxlLmxlbmd0aDsrK2IpZC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlW2JdKSk7cmV0dXJuIGMuYXJndj1uZXcgU2suYnVpbHRpbnMubGlzdChkKSxjLmNvcHlyaWdodD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkNvcHlyaWdodCAyMDA5LTIwMTAgU2NvdHQgR3JhaGFtLlxcXFxuQWxsIFJpZ2h0cyBSZXNlcnZlZC5cXFxcblxcXCIpLFNrLl9fZnV0dXJlX18ucHl0aG9uMz8oYy52ZXJzaW9uPVxcXCIzLjcoaXNoKSBbU2t1bHB0XVxcXCIsYy52ZXJzaW9uX2luZm89bmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8oMyksbmV3IFNrLmJ1aWx0aW4uaW50Xyg3KV0pKTooYy52ZXJzaW9uPVxcXCIyLjcoaXNoKSBbU2t1bHB0XVxcXCIsYy52ZXJzaW9uX2luZm89bmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8oMiksbmV3IFNrLmJ1aWx0aW4uaW50Xyg3KV0pKSxjLm1heGludD1uZXcgU2suYnVpbHRpbi5pbnRfKGEoMiw1MyktMSksYy5tYXhzaXplPW5ldyBTay5idWlsdGluLmludF8oYSgyLDUzKS0xKSxjLm1vZHVsZXM9U2suc3lzbW9kdWxlcyxjLnBhdGg9U2sucmVhbHN5c3BhdGgsYy5nZXRFeGVjdXRpb25MaW1pdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT1Tay5leGVjTGltaXQ/U2suYnVpbHRpbi5ub25lLm5vbmUkOm5ldyBTay5idWlsdGluLmludF8oU2suZXhlY0xpbWl0KX0pLGMuc2V0RXhlY3V0aW9uTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtpZihudWxsPT09U2suZXhlY0xpbWl0KXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkV4ZWN1dGlvbiBsaW1pdGluZyBpcyBub3QgZW5hYmxlZFxcXCIpO3ZvaWQgMCE9PWEmJihTay5leGVjTGltaXQ9U2suYnVpbHRpbi5hc251bSQoYSkpfSksYy5yZXNldFRpbWVvdXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe1NrLmV4ZWNTdGFydD1uZXcgRGF0ZX0pLGMuZ2V0WWllbGRMaW1pdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT1Tay55aWVsZExpbWl0P1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpuZXcgU2suYnVpbHRpbi5pbnRfKFNrLnlpZWxkTGltaXQpfSksYy5zZXRZaWVsZExpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYobnVsbD09PVNrLnlpZWxkTGltaXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiWWllbGRpbmcgaXMgbm90IGVuYWJsZWRcXFwiKTt2b2lkIDAhPT1hJiYoU2sueWllbGRMaW1pdD1Tay5idWlsdGluLmFzbnVtJChhKSl9KSxjLmRlYnVnPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSksYy5fX3N0ZG91dF9fPW5ldyBTay5idWlsdGluLmZpbGUobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIvZGV2L3N0ZG91dFxcXCIpLG5ldyBTay5idWlsdGluLnN0cihcXFwid1xcXCIpKSxjLl9fc3RkaW5fXz1uZXcgU2suYnVpbHRpbi5maWxlKG5ldyBTay5idWlsdGluLnN0cihcXFwiL2Rldi9zdGRpblxcXCIpLG5ldyBTay5idWlsdGluLnN0cihcXFwiclxcXCIpKSxjLnN0ZG91dD1jLl9fc3Rkb3V0X18sYy5zdGRpbj1jLl9fc3RkaW5fXyxjfTtcIixcInNyYy9idWlsdGluL3RoaXMucHlcIjpcInMgPSBcXFwiXFxcIlxcXCJHdXIgTXJhIGJzIENsZ3ViYSwgb2wgR3Z6IENyZ3JlZlxcblxcbk9ybmhndnNoeSB2ZiBvcmdncmUgZ3VuYSBodHlsLlxcblJrY3l2cHZnIHZmIG9yZ2dyZSBndW5hIHZ6Y3l2cHZnLlxcbkZ2emN5ciB2ZiBvcmdncmUgZ3VuYSBwYnpjeXJrLlxcblBiemN5cmsgdmYgb3JnZ3JlIGd1bmEgcGJ6Y3l2cG5ncnEuXFxuU3luZyB2ZiBvcmdncmUgZ3VuYSBhcmZncnEuXFxuRmNuZWZyIHZmIG9yZ2dyZSBndW5hIHFyYWZyLlxcbkVybnFub3Z5dmdsIHBiaGFnZi5cXG5GY3Jwdm55IHBuZnJmIG5lcmEnZyBmY3Jwdm55IHJhYmh0dSBnYiBvZXJueCBndXIgZWh5cmYuXFxuTnlndWJodHUgY2VucGd2cG55dmdsIG9ybmdmIGNoZXZnbC5cXG5SZWViZWYgZnViaHlxIGFyaXJlIGNuZmYgZnZ5cmFneWwuXFxuSGF5cmZmIHJrY3l2cHZneWwgZnZ5cmFwcnEuXFxuVmEgZ3VyIHNucHIgYnMgbnpvdnRodmdsLCBlcnNoZnIgZ3VyIGdyemNnbmd2YmEgZ2IgdGhyZmYuXFxuR3VyZXIgZnViaHlxIG9yIGJhci0tIG5hcSBjZXJzcmVub3lsIGJheWwgYmFyIC0tYm9pdmJoZiBqbmwgZ2IgcWIgdmcuXFxuTnlndWJodHUgZ3VuZyBqbmwgem5sIGFiZyBvciBib2l2YmhmIG5nIHN2ZWZnIGhheXJmZiBsYmgnZXIgUWhncHUuXFxuQWJqIHZmIG9yZ2dyZSBndW5hIGFyaXJlLlxcbk55Z3ViaHR1IGFyaXJlIHZmIGJzZ3JhIG9yZ2dyZSBndW5hICpldnR1ZyogYWJqLlxcblZzIGd1ciB2emN5cnpyYWduZ3ZiYSB2ZiB1bmVxIGdiIHJrY3ludmEsIHZnJ2YgbiBvbnEgdnFybi5cXG5WcyBndXIgdnpjeXJ6cmFnbmd2YmEgdmYgcm5mbCBnYiBya2N5bnZhLCB2ZyB6bmwgb3IgbiB0YmJxIHZxcm4uXFxuQW56cmZjbnByZiBuZXIgYmFyIHViYXh2YXQgdGVybmcgdnFybiAtLSB5cmcnZiBxYiB6YmVyIGJzIGd1YmZyIVxcXCJcXFwiXFxcIlxcblxcbmQgPSB7fVxcbmZvciBjIGluICg2NSwgOTcpOlxcbiAgICBmb3IgaSBpbiByYW5nZSgyNik6XFxuICAgICAgICBkW2NocihpK2MpXSA9IGNocigoaSsxMykgJSAyNiArIGMpXFxuXFxucHJpbnQoXFxcIlxcXCIuam9pbihbZC5nZXQoYywgYykgZm9yIGMgaW4gc10pKVxcblwiLFwic3JjL2xpYi9CYXNlSFRUUFNlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQmFzZUhUVFBTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9CYXN0aW9uLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJCYXN0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvQ0dJSFRUUFNlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQ0dJSFRUUFNlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0NvbmZpZ1BhcnNlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQ29uZmlnUGFyc2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvQ29va2llLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJDb29raWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Eb2NYTUxSUENTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkRvY1hNTFJQQ1NlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0hUTUxQYXJzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkhUTUxQYXJzZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9NaW1lV3JpdGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJNaW1lV3JpdGVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvUXVldWUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlF1ZXVlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvU2ltcGxlSFRUUFNlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU2ltcGxlSFRUUFNlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1NpbXBsZVhNTFJQQ1NlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU2ltcGxlWE1MUlBDU2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvU29ja2V0U2VydmVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJTb2NrZXRTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9TdHJpbmdJTy5weVwiOlwiclxcXCJcXFwiXFxcIkZpbGUtbGlrZSBvYmplY3RzIHRoYXQgcmVhZCBmcm9tIG9yIHdyaXRlIHRvIGEgc3RyaW5nIGJ1ZmZlci5cXG5cXG5UaGlzIGltcGxlbWVudHMgKG5lYXJseSkgYWxsIHN0ZGlvIG1ldGhvZHMuXFxuXFxuZiA9IFN0cmluZ0lPKCkgICAgICAjIHJlYWR5IGZvciB3cml0aW5nXFxuZiA9IFN0cmluZ0lPKGJ1ZikgICAjIHJlYWR5IGZvciByZWFkaW5nXFxuZi5jbG9zZSgpICAgICAgICAgICAjIGV4cGxpY2l0bHkgcmVsZWFzZSByZXNvdXJjZXMgaGVsZFxcbmZsYWcgPSBmLmlzYXR0eSgpICAgIyBhbHdheXMgZmFsc2VcXG5wb3MgPSBmLnRlbGwoKSAgICAgICMgZ2V0IGN1cnJlbnQgcG9zaXRpb25cXG5mLnNlZWsocG9zKSAgICAgICAgICMgc2V0IGN1cnJlbnQgcG9zaXRpb25cXG5mLnNlZWsocG9zLCBtb2RlKSAgICMgbW9kZSAwOiBhYnNvbHV0ZTsgMTogcmVsYXRpdmU7IDI6IHJlbGF0aXZlIHRvIEVPRlxcbmJ1ZiA9IGYucmVhZCgpICAgICAgIyByZWFkIHVudGlsIEVPRlxcbmJ1ZiA9IGYucmVhZChuKSAgICAgIyByZWFkIHVwIHRvIG4gYnl0ZXNcXG5idWYgPSBmLnJlYWRsaW5lKCkgICMgcmVhZCB1bnRpbCBlbmQgb2YgbGluZSAoJ1xcXFxuJykgb3IgRU9GXFxubGlzdCA9IGYucmVhZGxpbmVzKCkjIGxpc3Qgb2YgZi5yZWFkbGluZSgpIHJlc3VsdHMgdW50aWwgRU9GXFxuZi50cnVuY2F0ZShbc2l6ZV0pICAjIHRydW5jYXRlIGZpbGUgYXQgdG8gYXQgbW9zdCBzaXplIChkZWZhdWx0OiBjdXJyZW50IHBvcylcXG5mLndyaXRlKGJ1ZikgICAgICAgICMgd3JpdGUgYXQgY3VycmVudCBwb3NpdGlvblxcbmYud3JpdGVsaW5lcyhsaXN0KSAgIyBmb3IgbGluZSBpbiBsaXN0OiBmLndyaXRlKGxpbmUpXFxuZi5nZXR2YWx1ZSgpICAgICAgICAjIHJldHVybiB3aG9sZSBmaWxlJ3MgY29udGVudHMgYXMgYSBzdHJpbmdcXG5cXG5Ob3RlczpcXG4tIFVzaW5nIGEgcmVhbCBmaWxlIGlzIG9mdGVuIGZhc3RlciAoYnV0IGxlc3MgY29udmVuaWVudCkuXFxuLSBUaGVyZSdzIGFsc28gYSBtdWNoIGZhc3RlciBpbXBsZW1lbnRhdGlvbiBpbiBDLCBjYWxsZWQgY1N0cmluZ0lPLCBidXRcXG4gIGl0J3Mgbm90IHN1YmNsYXNzYWJsZS5cXG4tIGZpbGVubygpIGlzIGxlZnQgdW5pbXBsZW1lbnRlZCBzbyB0aGF0IGNvZGUgd2hpY2ggdXNlcyBpdCB0cmlnZ2Vyc1xcbiAgYW4gZXhjZXB0aW9uIGVhcmx5Llxcbi0gU2Vla2luZyBmYXIgYmV5b25kIEVPRiBhbmQgdGhlbiB3cml0aW5nIHdpbGwgaW5zZXJ0IHJlYWwgbnVsbFxcbiAgYnl0ZXMgdGhhdCBvY2N1cHkgc3BhY2UgaW4gdGhlIGJ1ZmZlci5cXG4tIFRoZXJlJ3MgYSBzaW1wbGUgdGVzdCBzZXQgKHNlZSBlbmQgb2YgdGhpcyBmaWxlKS5cXG5cXFwiXFxcIlxcXCJcXG5cXG5fX2FsbF9fID0gW1xcXCJTdHJpbmdJT1xcXCJdXFxuXFxuZGVmIF9jb21wbGFpbl9pZmNsb3NlZChjbG9zZWQpOlxcbiAgICBpZiBjbG9zZWQ6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlXFxcIilcXG5cXG5jbGFzcyBTdHJpbmdJTzpcXG4gICAgXFxcIlxcXCJcXFwiY2xhc3MgU3RyaW5nSU8oW2J1ZmZlcl0pXFxuXFxuICAgIFdoZW4gYSBTdHJpbmdJTyBvYmplY3QgaXMgY3JlYXRlZCwgaXQgY2FuIGJlIGluaXRpYWxpemVkIHRvIGFuIGV4aXN0aW5nXFxuICAgIHN0cmluZyBieSBwYXNzaW5nIHRoZSBzdHJpbmcgdG8gdGhlIGNvbnN0cnVjdG9yLiBJZiBubyBzdHJpbmcgaXMgZ2l2ZW4sXFxuICAgIHRoZSBTdHJpbmdJTyB3aWxsIHN0YXJ0IGVtcHR5LlxcblxcbiAgICBUaGUgU3RyaW5nSU8gb2JqZWN0IGNhbiBhY2NlcHQgZWl0aGVyIFVuaWNvZGUgb3IgOC1iaXQgc3RyaW5ncywgYnV0XFxuICAgIG1peGluZyB0aGUgdHdvIG1heSB0YWtlIHNvbWUgY2FyZS4gSWYgYm90aCBhcmUgdXNlZCwgOC1iaXQgc3RyaW5ncyB0aGF0XFxuICAgIGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyA3LWJpdCBBU0NJSSAodGhhdCB1c2UgdGhlIDh0aCBiaXQpIHdpbGwgY2F1c2VcXG4gICAgYSBVbmljb2RlRXJyb3IgdG8gYmUgcmFpc2VkIHdoZW4gZ2V0dmFsdWUoKSBpcyBjYWxsZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgYnVmID0gJycpOlxcbiAgICAgICAgIyBGb3JjZSBzZWxmLmJ1ZiB0byBiZSBhIHN0cmluZyBvciB1bmljb2RlXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShidWYsIHN0cik6XFxuICAgICAgICAgICAgYnVmID0gc3RyKGJ1ZilcXG4gICAgICAgIHNlbGYuYnVmID0gYnVmXFxuICAgICAgICBzZWxmLmxlbiA9IGxlbihidWYpXFxuICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgc2VsZi5wb3MgPSAwXFxuICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlXFxuICAgICAgICBzZWxmLnNvZnRzcGFjZSA9IDBcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIG5leHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBIGZpbGUgb2JqZWN0IGlzIGl0cyBvd24gaXRlcmF0b3IsIGZvciBleGFtcGxlIGl0ZXIoZikgcmV0dXJucyBmXFxuICAgICAgICAodW5sZXNzIGYgaXMgY2xvc2VkKS4gV2hlbiBhIGZpbGUgaXMgdXNlZCBhcyBhbiBpdGVyYXRvciwgdHlwaWNhbGx5XFxuICAgICAgICBpbiBhIGZvciBsb29wIChmb3IgZXhhbXBsZSwgZm9yIGxpbmUgaW4gZjogcHJpbnQgbGluZSksIHRoZSBuZXh0KClcXG4gICAgICAgIG1ldGhvZCBpcyBjYWxsZWQgcmVwZWF0ZWRseS4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmV4dCBpbnB1dCBsaW5lLFxcbiAgICAgICAgb3IgcmFpc2VzIFN0b3BJdGVyYXRpb24gd2hlbiBFT0YgaXMgaGl0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICByID0gc2VsZi5yZWFkbGluZSgpXFxuICAgICAgICBpZiBub3QgcjpcXG4gICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uXFxuICAgICAgICByZXR1cm4gclxcblxcbiAgICBkZWYgY2xvc2Uoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGcmVlIHRoZSBtZW1vcnkgYnVmZmVyLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBub3Qgc2VsZi5jbG9zZWQ6XFxuICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlXFxuICAgICAgICAgICAgc2VsZi5idWYgPSBOb25lXFxuICAgICAgICAgICAgc2VsZi5wb3MgPSBOb25lXFxuXFxuICAgIGRlZiBpc2F0dHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm5zIEZhbHNlIGJlY2F1c2UgU3RyaW5nSU8gb2JqZWN0cyBhcmUgbm90IGNvbm5lY3RlZCB0byBhXFxuICAgICAgICB0dHktbGlrZSBkZXZpY2UuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgc2VlayhzZWxmLCBwb3MsIG1vZGUgPSAwKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB0aGUgZmlsZSdzIGN1cnJlbnQgcG9zaXRpb24uXFxuXFxuICAgICAgICBUaGUgbW9kZSBhcmd1bWVudCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gMCAoYWJzb2x1dGUgZmlsZVxcbiAgICAgICAgcG9zaXRpb25pbmcpOyBvdGhlciB2YWx1ZXMgYXJlIDEgKHNlZWsgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnRcXG4gICAgICAgIHBvc2l0aW9uKSBhbmQgMiAoc2VlayByZWxhdGl2ZSB0byB0aGUgZmlsZSdzIGVuZCkuXFxuXFxuICAgICAgICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdClcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgaWYgbW9kZSA9PSAxOlxcbiAgICAgICAgICAgIHBvcyArPSBzZWxmLnBvc1xcbiAgICAgICAgZWxpZiBtb2RlID09IDI6XFxuICAgICAgICAgICAgcG9zICs9IHNlbGYubGVuXFxuICAgICAgICBzZWxmLnBvcyA9IG1heCgwLCBwb3MpXFxuXFxuICAgIGRlZiB0ZWxsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBmaWxlJ3MgY3VycmVudCBwb3NpdGlvbi5cXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIHJldHVybiBzZWxmLnBvc1xcblxcbiAgICBkZWYgcmVhZChzZWxmLCBuID0gLTEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVhZCBhdCBtb3N0IHNpemUgYnl0ZXMgZnJvbSB0aGUgZmlsZVxcbiAgICAgICAgKGxlc3MgaWYgdGhlIHJlYWQgaGl0cyBFT0YgYmVmb3JlIG9idGFpbmluZyBzaXplIGJ5dGVzKS5cXG5cXG4gICAgICAgIElmIHRoZSBzaXplIGFyZ3VtZW50IGlzIG5lZ2F0aXZlIG9yIG9taXR0ZWQsIHJlYWQgYWxsIGRhdGEgdW50aWwgRU9GXFxuICAgICAgICBpcyByZWFjaGVkLiBUaGUgYnl0ZXMgYXJlIHJldHVybmVkIGFzIGEgc3RyaW5nIG9iamVjdC4gQW4gZW1wdHlcXG4gICAgICAgIHN0cmluZyBpcyByZXR1cm5lZCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBpbW1lZGlhdGVseS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgaWYgc2VsZi5idWZsaXN0OlxcbiAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KVxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtdXFxuICAgICAgICBpZiBuIGlzIE5vbmUgb3IgbiA8IDA6XFxuICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5sZW5cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbmV3cG9zID0gbWluKHNlbGYucG9zK24sIHNlbGYubGVuKVxcbiAgICAgICAgciA9IHNlbGYuYnVmW3NlbGYucG9zOm5ld3Bvc11cXG4gICAgICAgIHNlbGYucG9zID0gbmV3cG9zXFxuICAgICAgICByZXR1cm4gclxcblxcbiAgICBkZWYgcmVhZGxpbmUoc2VsZiwgbGVuZ3RoPU5vbmUpOlxcbiAgICAgICAgclxcXCJcXFwiXFxcIlJlYWQgb25lIGVudGlyZSBsaW5lIGZyb20gdGhlIGZpbGUuXFxuXFxuICAgICAgICBBIHRyYWlsaW5nIG5ld2xpbmUgY2hhcmFjdGVyIGlzIGtlcHQgaW4gdGhlIHN0cmluZyAoYnV0IG1heSBiZSBhYnNlbnRcXG4gICAgICAgIHdoZW4gYSBmaWxlIGVuZHMgd2l0aCBhbiBpbmNvbXBsZXRlIGxpbmUpLiBJZiB0aGUgc2l6ZSBhcmd1bWVudCBpc1xcbiAgICAgICAgcHJlc2VudCBhbmQgbm9uLW5lZ2F0aXZlLCBpdCBpcyBhIG1heGltdW0gYnl0ZSBjb3VudCAoaW5jbHVkaW5nIHRoZVxcbiAgICAgICAgdHJhaWxpbmcgbmV3bGluZSkgYW5kIGFuIGluY29tcGxldGUgbGluZSBtYXkgYmUgcmV0dXJuZWQuXFxuXFxuICAgICAgICBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgb25seSB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBpbW1lZGlhdGVseS5cXG5cXG4gICAgICAgIE5vdGU6IFVubGlrZSBzdGRpbydzIGZnZXRzKCksIHRoZSByZXR1cm5lZCBzdHJpbmcgY29udGFpbnMgbnVsbFxcbiAgICAgICAgY2hhcmFjdGVycyAoJ1xcXFwwJykgaWYgdGhleSBvY2N1cnJlZCBpbiB0aGUgaW5wdXQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdClcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgaSA9IHNlbGYuYnVmLmZpbmQoJ1xcXFxuJywgc2VsZi5wb3MpXFxuICAgICAgICBpZiBpIDwgMDpcXG4gICAgICAgICAgICBuZXdwb3MgPSBzZWxmLmxlblxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdwb3MgPSBpKzFcXG4gICAgICAgIGlmIGxlbmd0aCBpcyBub3QgTm9uZSBhbmQgbGVuZ3RoID49IDA6XFxuICAgICAgICAgICAgaWYgc2VsZi5wb3MgKyBsZW5ndGggPCBuZXdwb3M6XFxuICAgICAgICAgICAgICAgIG5ld3BvcyA9IHNlbGYucG9zICsgbGVuZ3RoXFxuICAgICAgICByID0gc2VsZi5idWZbc2VsZi5wb3M6bmV3cG9zXVxcbiAgICAgICAgc2VsZi5wb3MgPSBuZXdwb3NcXG4gICAgICAgIHJldHVybiByXFxuXFxuICAgIGRlZiByZWFkbGluZXMoc2VsZiwgc2l6ZWhpbnQgPSAwKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlYWQgdW50aWwgRU9GIHVzaW5nIHJlYWRsaW5lKCkgYW5kIHJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGVcXG4gICAgICAgIGxpbmVzIHRodXMgcmVhZC5cXG5cXG4gICAgICAgIElmIHRoZSBvcHRpb25hbCBzaXplaGludCBhcmd1bWVudCBpcyBwcmVzZW50LCBpbnN0ZWFkIG9mIHJlYWRpbmcgdXBcXG4gICAgICAgIHRvIEVPRiwgd2hvbGUgbGluZXMgdG90YWxsaW5nIGFwcHJveGltYXRlbHkgc2l6ZWhpbnQgYnl0ZXMgKG9yIG1vcmVcXG4gICAgICAgIHRvIGFjY29tbW9kYXRlIGEgZmluYWwgd2hvbGUgbGluZSkuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHRvdGFsID0gMFxcbiAgICAgICAgbGluZXMgPSBbXVxcbiAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKVxcbiAgICAgICAgd2hpbGUgbGluZTpcXG4gICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSlcXG4gICAgICAgICAgICB0b3RhbCArPSBsZW4obGluZSlcXG4gICAgICAgICAgICBpZiAwIDwgc2l6ZWhpbnQgPD0gdG90YWw6XFxuICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKVxcbiAgICAgICAgcmV0dXJuIGxpbmVzXFxuXFxuICAgIGRlZiB0cnVuY2F0ZShzZWxmLCBzaXplPU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVHJ1bmNhdGUgdGhlIGZpbGUncyBzaXplLlxcblxcbiAgICAgICAgSWYgdGhlIG9wdGlvbmFsIHNpemUgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGZpbGUgaXMgdHJ1bmNhdGVkIHRvXFxuICAgICAgICAoYXQgbW9zdCkgdGhhdCBzaXplLiBUaGUgc2l6ZSBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBwb3NpdGlvbi5cXG4gICAgICAgIFRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24gaXMgbm90IGNoYW5nZWQgdW5sZXNzIHRoZSBwb3NpdGlvblxcbiAgICAgICAgaXMgYmV5b25kIHRoZSBuZXcgZmlsZSBzaXplLlxcblxcbiAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBzaXplIGV4Y2VlZHMgdGhlIGZpbGUncyBjdXJyZW50IHNpemUsIHRoZVxcbiAgICAgICAgZmlsZSByZW1haW5zIHVuY2hhbmdlZC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgaWYgc2l6ZSBpcyBOb25lOlxcbiAgICAgICAgICAgIHNpemUgPSBzZWxmLnBvc1xcbiAgICAgICAgZWxpZiBzaXplIDwgMDpcXG4gICAgICAgICAgICByYWlzZSBJT0Vycm9yKDIyLCBcXFwiTmVnYXRpdmUgc2l6ZSBub3QgYWxsb3dlZFxcXCIpXFxuICAgICAgICBlbGlmIHNpemUgPCBzZWxmLnBvczpcXG4gICAgICAgICAgICBzZWxmLnBvcyA9IHNpemVcXG4gICAgICAgIHNlbGYuYnVmID0gc2VsZi5nZXR2YWx1ZSgpWzpzaXplXVxcbiAgICAgICAgc2VsZi5sZW4gPSBzaXplXFxuXFxuICAgIGRlZiB3cml0ZShzZWxmLCBzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIldyaXRlIGEgc3RyaW5nIHRvIHRoZSBmaWxlLlxcblxcbiAgICAgICAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBub3QgczogcmV0dXJuXFxuICAgICAgICAjIEZvcmNlIHMgdG8gYmUgYSBzdHJpbmcgb3IgdW5pY29kZVxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uocywgc3RyKTpcXG4gICAgICAgICAgICBzID0gc3RyKHMpXFxuICAgICAgICBzcG9zID0gc2VsZi5wb3NcXG4gICAgICAgIHNsZW4gPSBzZWxmLmxlblxcbiAgICAgICAgaWYgc3BvcyA9PSBzbGVuOlxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQocylcXG4gICAgICAgICAgICBzZWxmLmxlbiA9IHNlbGYucG9zID0gc3BvcyArIGxlbihzKVxcbiAgICAgICAgICAgIHJldHVyblxcbiAgICAgICAgaWYgc3BvcyA+IHNsZW46XFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0LmFwcGVuZCgnXFxcXDAnKihzcG9zIC0gc2xlbikpXFxuICAgICAgICAgICAgc2xlbiA9IHNwb3NcXG4gICAgICAgIG5ld3BvcyA9IHNwb3MgKyBsZW4ocylcXG4gICAgICAgIGlmIHNwb3MgPCBzbGVuOlxcbiAgICAgICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW3NlbGYuYnVmWzpzcG9zXSwgcywgc2VsZi5idWZbbmV3cG9zOl1dXFxuICAgICAgICAgICAgc2VsZi5idWYgPSAnJ1xcbiAgICAgICAgICAgIGlmIG5ld3BvcyA+IHNsZW46XFxuICAgICAgICAgICAgICAgIHNsZW4gPSBuZXdwb3NcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0LmFwcGVuZChzKVxcbiAgICAgICAgICAgIHNsZW4gPSBuZXdwb3NcXG4gICAgICAgIHNlbGYubGVuID0gc2xlblxcbiAgICAgICAgc2VsZi5wb3MgPSBuZXdwb3NcXG5cXG4gICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgaXRlcmFibGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiV3JpdGUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHRvIHRoZSBmaWxlLiBUaGUgc2VxdWVuY2UgY2FuIGJlIGFueVxcbiAgICAgICAgaXRlcmFibGUgb2JqZWN0IHByb2R1Y2luZyBzdHJpbmdzLCB0eXBpY2FsbHkgYSBsaXN0IG9mIHN0cmluZ3MuIFRoZXJlXFxuICAgICAgICBpcyBubyByZXR1cm4gdmFsdWUuXFxuXFxuICAgICAgICAoVGhlIG5hbWUgaXMgaW50ZW5kZWQgdG8gbWF0Y2ggcmVhZGxpbmVzKCk7IHdyaXRlbGluZXMoKSBkb2VzIG5vdCBhZGRcXG4gICAgICAgIGxpbmUgc2VwYXJhdG9ycy4pXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHdyaXRlID0gc2VsZi53cml0ZVxcbiAgICAgICAgZm9yIGxpbmUgaW4gaXRlcmFibGU6XFxuICAgICAgICAgICAgd3JpdGUobGluZSlcXG5cXG4gICAgZGVmIGZsdXNoKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRmx1c2ggdGhlIGludGVybmFsIGJ1ZmZlclxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuXFxuICAgIGRlZiBnZXR2YWx1ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgUmV0cmlldmUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgXFxcImZpbGVcXFwiIGF0IGFueSB0aW1lIGJlZm9yZVxcbiAgICAgICAgdGhlIFN0cmluZ0lPIG9iamVjdCdzIGNsb3NlKCkgbWV0aG9kIGlzIGNhbGxlZC5cXG5cXG4gICAgICAgIFRoZSBTdHJpbmdJTyBvYmplY3QgY2FuIGFjY2VwdCBlaXRoZXIgVW5pY29kZSBvciA4LWJpdCBzdHJpbmdzLFxcbiAgICAgICAgYnV0IG1peGluZyB0aGUgdHdvIG1heSB0YWtlIHNvbWUgY2FyZS4gSWYgYm90aCBhcmUgdXNlZCwgOC1iaXRcXG4gICAgICAgIHN0cmluZ3MgdGhhdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgNy1iaXQgQVNDSUkgKHRoYXQgdXNlIHRoZVxcbiAgICAgICAgOHRoIGJpdCkgd2lsbCBjYXVzZSBhIFVuaWNvZGVFcnJvciB0byBiZSByYWlzZWQgd2hlbiBnZXR2YWx1ZSgpXFxuICAgICAgICBpcyBjYWxsZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdClcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgcmV0dXJuIHNlbGYuYnVmXFxuXCIsXCJzcmMvbGliL1VzZXJEaWN0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJVc2VyRGljdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1VzZXJMaXN0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJVc2VyTGlzdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1VzZXJTdHJpbmcucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlVzZXJTdHJpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fTFdQQ29va2llSmFyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfTFdQQ29va2llSmFyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX01vemlsbGFDb29raWVKYXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9Nb3ppbGxhQ29va2llSmFyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX19mdXR1cmVfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX19mdXR1cmVfXyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19fcGhlbGxvX18uZm9vLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfX3BoZWxsb19fLmZvbyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19hYmNvbGwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9hYmNvbGwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fc3RycHRpbWUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9zdHJwdGltZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL190aHJlYWRpbmdfbG9jYWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl90aHJlYWRpbmdfbG9jYWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hYmMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFiYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FpZmMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFpZmMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hbHRhaXIvX19pbml0X18ucHlcIjpcImltcG9ydCByYW5kb21cXG5cXG50cnk6XFxuICAgIGZyb20gdmVnYV9jYWxsZXIgaW1wb3J0IHJlbmRlcl9ncmFwaFxcbmV4Y2VwdDpcXG4gICAgcHJpbnQoXFxcIk1vY2sgcmVuZGVyXFxcIilcXG5cXG4gICAgZGVmIHJlbmRlcl9ncmFwaChqcyk6XFxuICAgICAgICBwcmludChqcylcXG5cXG5cXG5jbGFzcyBDaGFydDpcXG4gICAgIyBUT0RPIGFsbG93IGRhdGEgdG8gYmUgc3BlY2lmaWVkIGFzIGEgVVJMIHRvIGEgQ1NWIG9yIERCIG9yIGpzb25cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEsIHRpdGxlPU5vbmUpOlxcbiAgICAgICAgc2VsZi50aXRsZSA9IHRpdGxlXFxuICAgICAgICBzZWxmLmRhdGFfaWQgPSByYW5kb20ucmFuZHJhbmdlKDEwMDAwMDAsIDUwMDAwMDApXFxuICAgICAgICBzZWxmLmRzbmFtZSA9IFxcXCJkYXRhLXt9XFxcIi5mb3JtYXQoc2VsZi5kYXRhX2lkKVxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBkaWN0KTpcXG4gICAgICAgICAgICBzZWxmLmRhdGEgPSBEYXRhKCoqZGF0YSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5kYXRhID0gZGF0YVxcblxcbiAgICAgICAgc2VsZi5qc29uID0ge31cXG4gICAgICAgIHNlbGYuanNvbltcXFwiJHNjaGVtYVxcXCJdID0gXFxcImh0dHBzOi8vdmVnYS5naXRodWIuaW8vc2NoZW1hL3ZlZ2EtbGl0ZS92Mi41Lmpzb25cXFwiXFxuICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFcXFwiXSA9IHt9XFxuICAgICAgICBpZiBzZWxmLnRpdGxlOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwidGl0bGVcXFwiXSA9IHNlbGYudGl0bGVcXG5cXG4gICAgICAgIHNlbGYuanNvbltcXFwiZGF0YVxcXCJdID0ge1xcXCJ2YWx1ZXNcXFwiOiBzZWxmLmRhdGEudmFsc31cXG4gICAgICAgIHNlbGYuaXNfY29tcG9zaXRlID0gRmFsc2VcXG5cXG4gICAgIyBtYXJrIGNhbiBiZSBhIHNpbXBsZSBzdHJpbmcgb3IgYSBkaWN0aW9uYXJ5XFxuICAgICMgXFxcIm1hcmtcXFwiOiB7XFxcImNvbG9yXFxcIjogXFxcImdyZWVuXFxcIiwgXFxcIm9wYWNpdHlcXFwiOiAwLjIsIFxcXCJ0eXBlXFxcIjogXFxcInJlY3RcXFwifVxcblxcbiAgICBkZWYgbWFya19qc29uKHNlbGYsIG1hcmtfdHlwZSwgKiprd2FyZ3MpOlxcbiAgICAgICAgaWYga3dhcmdzOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdID0ge31cXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXVtcXFwidHlwZVxcXCJdID0gbWFya190eXBlXFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl0udXBkYXRlKGt3YXJncylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl0gPSBtYXJrX3R5cGVcXG5cXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBtYXJrX2JhcihzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5tYXJrX2pzb24oXFxcImJhclxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19wb2ludChzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5tYXJrX2pzb24oXFxcInBvaW50XFxcIiwgKiprd2FyZ3MpXFxuXFxuICAgIGRlZiBtYXJrX2xpbmUoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJsaW5lXFxcIiwgKiprd2FyZ3MpXFxuXFxuICAgIGRlZiBtYXJrX3JlY3Qoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJyZWN0XFxcIiwgKiprd2FyZ3MpXFxuXFxuICAgIGRlZiBtYXJrX2FyZWEoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJhcmVhXFxcIiwgKiprd2FyZ3MpXFxuXFxuICAgIGRlZiBtYXJrX3RpY2soc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJ0aWNrXFxcIiwgKiprd2FyZ3MpXFxuXFxuICAgIGRlZiBlbmNvZGUoc2VsZiwgeD1cXFwiXFxcIiwgeT1cXFwiXFxcIiwgY29sb3I9XFxcIlxcXCIsIHNpemU9XFxcIlxcXCIsIHRvb2x0aXA9XFxcIlxcXCIpOlxcbiAgICAgICAgc2VsZi5lbmNvZGluZyA9IHt9XFxuICAgICAgICBpZiB4OlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoeCwgQXhpcyk6XFxuICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInhcXFwiXSA9IHgudG9Kc29uKClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ4XFxcIl0gPSBBeGlzKHgpLnRvSnNvbigpXFxuICAgICAgICBpZiB5OlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoeSwgQXhpcyk6XFxuICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInlcXFwiXSA9IHkudG9Kc29uKClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ5XFxcIl0gPSBBeGlzKHkpLnRvSnNvbigpXFxuXFxuICAgICAgICAjIFxcXCJjb2xvclxcXCI6IHtcXFwidHlwZVxcXCI6IFxcXCJub21pbmFsXFxcIiwgXFxcImZpZWxkXFxcIjogXFxcInNwZWNpZXNcXFwifVxcbiAgICAgICAgaWYgY29sb3I6XFxuICAgICAgICAgICAgZmllbGQsIHRwID0gX2dldF9uYW1lX3R5cGUoY29sb3IpXFxuICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwiY29sb3JcXFwiXSA9IGRpY3QodHlwZT10cCwgZmllbGQ9ZmllbGQpXFxuXFxuICAgICAgICAjIFxcXCJzaXplXFxcIjoge1xcXCJ0eXBlXFxcIjogXFxcInF1YW50aXRhdGl2ZVxcXCIsIFxcXCJmaWVsZFxcXCI6IFxcXCJBY2NlbGVyYXRpb25cXFwifVxcbiAgICAgICAgaWYgc2l6ZTpcXG4gICAgICAgICAgICBmaWVsZCwgdHAgPSBfZ2V0X25hbWVfdHlwZShzaXplKVxcbiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInNpemVcXFwiXSA9IGRpY3QodHlwZT10cCwgZmllbGQ9ZmllbGQpXFxuXFxuICAgICAgICBpZiB0b29sdGlwOlxcbiAgICAgICAgICAgIGZpZWxkLCB0cCA9IF9nZXRfbmFtZV90eXBlKHRvb2x0aXApXFxuICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwidG9vbHRpcFxcXCJdID0gZGljdCh0eXBlPXRwLCBmaWVsZD1maWVsZClcXG5cXG4gICAgICAgIHNlbGYuanNvbltcXFwiZW5jb2RpbmdcXFwiXSA9IHNlbGYuZW5jb2RpbmdcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBpbnRlcmFjdGl2ZShzZWxmKTpcXG4gICAgICAgIGljb25maWcgPSB7XFxuICAgICAgICAgICAgXFxcInNlbGVjdG9yMDAyXFxcIjoge1xcbiAgICAgICAgICAgICAgICBcXFwidHlwZVxcXCI6IFxcXCJpbnRlcnZhbFxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJiaW5kXFxcIjogXFxcInNjYWxlc1xcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJlbmNvZGluZ3NcXFwiOiBbXFxcInhcXFwiLCBcXFwieVxcXCJdLFxcbiAgICAgICAgICAgICAgICBcXFwib25cXFwiOiBcXFwiW21vdXNlZG93biwgd2luZG93Om1vdXNldXBdID4gd2luZG93Om1vdXNlbW92ZSFcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwidHJhbnNsYXRlXFxcIjogXFxcIlttb3VzZWRvd24sIHdpbmRvdzptb3VzZXVwXSA+IHdpbmRvdzptb3VzZW1vdmUhXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcInpvb21cXFwiOiBcXFwid2hlZWwhXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcIm1hcmtcXFwiOiB7XFxcImZpbGxcXFwiOiBcXFwiIzMzM1xcXCIsIFxcXCJmaWxsT3BhY2l0eVxcXCI6IDAuMTI1LCBcXFwic3Ryb2tlXFxcIjogXFxcIndoaXRlXFxcIn0sXFxuICAgICAgICAgICAgICAgIFxcXCJyZXNvbHZlXFxcIjogXFxcImdsb2JhbFxcXCIsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgc2VsZi5qc29uW1xcXCJzZWxlY3Rpb25cXFwiXSA9IGljb25maWdcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBkaXNwbGF5KHNlbGYpOlxcbiAgICAgICAgcmVuZGVyX2dyYXBoKHNlbGYuanNvbilcXG5cXG4gICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuYWRkX2xheWVyKG90aGVyLCBcXFwibGF5ZXJcXFwiKVxcblxcbiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICByZXR1cm4gc2VsZi5hZGRfbGF5ZXIob3RoZXIsIFxcXCJ2Y29uY2F0XFxcIilcXG5cXG4gICAgZGVmIF9fb3JfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICByZXR1cm4gc2VsZi5hZGRfbGF5ZXIob3RoZXIsIFxcXCJoY29uY2F0XFxcIilcXG5cXG4gICAgZGVmIGFkZF9sYXllcihzZWxmLCBvdGhlciwgbG5hbWUpOlxcbiAgICAgICAgIyBtdWx0bGUgbGF5ZXJzIGFyZSBhZGRlZCBieSBjb25jYXRlbmF0aW5nIHRoZSBuZXcgZWxlbWVudCB0byB0aGVcXG4gICAgICAgICMgZXhpc3RpbmcgbGF5ZXIuICBJZiB0aGUgbGF5ZXIgZG9lcyBub3QgZXhpc3QgdGhlbiBpbml0aWFsaXplXFxuICAgICAgICAjIGl0IGZyb20gc2VsZi5cXG4gICAgICAgIGlmIGxuYW1lIG5vdCBpbiBzZWxmLmpzb246XFxuICAgICAgICAgICAgc2VsZi5qc29uW2xuYW1lXSA9IFtdXFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhc2V0c1xcXCJdID0ge31cXG4gICAgICAgICAgICB0ZW1wID0ge31cXG4gICAgICAgICAgICB0ZW1wW1xcXCJkYXRhXFxcIl0gPSB7XFxcIm5hbWVcXFwiOiBzZWxmLmRzbmFtZX1cXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFzZXRzXFxcIl1bc2VsZi5kc25hbWVdID0gc2VsZi5qc29uW1xcXCJkYXRhXFxcIl1bXFxcInZhbHVlc1xcXCJdXFxuICAgICAgICAgICAgZGVsIHNlbGYuanNvbltcXFwiZGF0YVxcXCJdXFxuICAgICAgICAgICAgdGVtcFtcXFwiZW5jb2RpbmdcXFwiXSA9IHNlbGYuanNvbltcXFwiZW5jb2RpbmdcXFwiXVxcbiAgICAgICAgICAgIGRlbCBzZWxmLmpzb25bXFxcImVuY29kaW5nXFxcIl1cXG4gICAgICAgICAgICB0ZW1wW1xcXCJtYXJrXFxcIl0gPSBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXVxcbiAgICAgICAgICAgIGRlbCBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXVxcbiAgICAgICAgICAgIHNlbGYuanNvbltsbmFtZV0uYXBwZW5kKHRlbXApXFxuICAgICAgICB0ZW1wID0ge31cXG4gICAgICAgIHNlbGYuanNvbltcXFwiZGF0YXNldHNcXFwiXVtvdGhlci5kc25hbWVdID0gb3RoZXIuanNvbltcXFwiZGF0YVxcXCJdW1xcXCJ2YWx1ZXNcXFwiXVxcbiAgICAgICAgdGVtcFtcXFwiZGF0YVxcXCJdID0ge1xcXCJuYW1lXFxcIjogb3RoZXIuZHNuYW1lfVxcbiAgICAgICAgdGVtcFtcXFwiZW5jb2RpbmdcXFwiXSA9IG90aGVyLmpzb25bXFxcImVuY29kaW5nXFxcIl1cXG4gICAgICAgIHRlbXBbXFxcIm1hcmtcXFwiXSA9IG90aGVyLmpzb25bXFxcIm1hcmtcXFwiXVxcbiAgICAgICAgc2VsZi5qc29uW2xuYW1lXS5hcHBlbmQodGVtcClcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuXFxuIyAgIFxcXCJkYXRhc2V0c1xcXCI6IHtcXG4jICAgICBcXFwiZGF0YS1lNTZlNDMzNTRkOWI4ZjJhYjBkMWU5MGNmMjdjZDQ3ZlxcXCI6IFtcXG4jICAgICAgIHtcXFwiYVxcXCI6IDQsIFxcXCJiXFxcIjogMSwgXFxcImNcXFwiOiBcXFwiclxcXCJ9LFxcbiMgICAgICAge1xcXCJhXFxcIjogNSwgXFxcImJcXFwiOiAyLCBcXFwiY1xcXCI6IFxcXCJnXFxcIn0sXFxuIyAgICAgICB7XFxcImFcXFwiOiA2LCBcXFwiYlxcXCI6IDMsIFxcXCJjXFxcIjogXFxcImJcXFwifVxcbiMgICAgIF0sXFxuIyAgICAgXFxcImRhdGEtYTRjMzA0N2ExNWJmOTM4MGMyZTYxNWNmODc2NDgzNjlcXFwiOiBbXFxuIyAgICAgICB7XFxcImFcXFwiOiAxLCBcXFwiYlxcXCI6IDQsIFxcXCJjXFxcIjogXFxcInJcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDIsIFxcXCJiXFxcIjogNSwgXFxcImNcXFwiOiBcXFwiZ1xcXCJ9LFxcbiMgICAgICAge1xcXCJhXFxcIjogMywgXFxcImJcXFwiOiA2LCBcXFwiY1xcXCI6IFxcXCJiXFxcIn1cXG4jICAgICBdXFxuIyAgIH1cXG5cXG4jIFRPRE86ICBhZGQgYSByZWN0IG1hcmsgdHlwZSBmb3IgYSBoZWF0IG1hcFxcblxcblxcbmRlZiBfZ2V0X25hbWVfdHlwZShuYW1lKTpcXG4gICAgdHlwZWQgPSB7XFxcIlFcXFwiOiBcXFwicXVhbnRpdGF0aXZlXFxcIiwgXFxcIk9cXFwiOiBcXFwib3JkaW5hbFxcXCIsIFxcXCJOXFxcIjogXFxcIm5vbWluYWxcXFwiLCBcXFwiVFxcXCI6IFxcXCJ0ZW1wb3JhbFxcXCJ9XFxuICAgIG50ID0gbmFtZS5zcGxpdChcXFwiOlxcXCIpXFxuICAgIHRzdHJpbmcgPSBcXFwicXVhbnRpdGF0aXZlXFxcIlxcbiAgICBpZiBsZW4obnQpID09IDI6XFxuICAgICAgICB0c3RyaW5nID0gdHlwZWRbbnRbMV1dXFxuICAgIHJldHVybiBudFswXSwgdHN0cmluZ1xcblxcblxcbmNsYXNzIEF4aXM6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBiaW49RmFsc2UpOlxcbiAgICAgICAgc2VsZi5hZ2dyZWdhdGUgPSBOb25lXFxuICAgICAgICBzZWxmLm5hbWUsIHNlbGYudHlwZSA9IF9nZXRfbmFtZV90eXBlKG5hbWUpXFxuICAgICAgICBpZiBcXFwiKClcXFwiIGluIHNlbGYubmFtZTogICMgYWdncmVnYXRlIGZ1bmN0aW9uXFxuICAgICAgICAgICAgc2VsZi5hZ2dyZWdhdGUgPSBzZWxmLm5hbWUucmVwbGFjZShcXFwiKClcXFwiLCBcXFwiXFxcIilcXG4gICAgICAgICAgICBzZWxmLm5hbWUgPSBOb25lXFxuICAgICAgICBzZWxmLmJpbiA9IGJpblxcblxcbiAgICBkZWYgdG9Kc29uKHNlbGYpOlxcbiAgICAgICAganNvbiA9IHt9XFxuICAgICAgICBpZiBzZWxmLm5hbWU6XFxuICAgICAgICAgICAganNvbltcXFwiZmllbGRcXFwiXSA9IHNlbGYubmFtZVxcbiAgICAgICAgaWYgc2VsZi50eXBlOlxcbiAgICAgICAgICAgIGpzb25bXFxcInR5cGVcXFwiXSA9IHNlbGYudHlwZVxcbiAgICAgICAgaWYgc2VsZi5iaW46XFxuICAgICAgICAgICAganNvbltcXFwiYmluXFxcIl0gPSBUcnVlXFxuICAgICAgICBpZiBzZWxmLmFnZ3JlZ2F0ZTpcXG4gICAgICAgICAgICBqc29uW1xcXCJhZ2dyZWdhdGVcXFwiXSA9IHNlbGYuYWdncmVnYXRlXFxuXFxuICAgICAgICByZXR1cm4ganNvblxcblxcblxcbmNsYXNzIFgoQXhpcyk6XFxuICAgIHBhc3NcXG5cXG5cXG5jbGFzcyBZKEF4aXMpOlxcbiAgICBwYXNzXFxuXFxuXFxuY2xhc3MgRGF0YTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaW5wdXQgY2FuIGJlIHRoZSBmb3JtIG9mIGEgc2VyaWVzIG9mIGtleXdvcmQgYXJncyB3aGVyZVxcbiAgICAgICAgdGhlIGtleXdvcmQgaXMgdGhlIGNvbHVtbiBuYW1lLCBvciBhIHNpbmdsZSBrZXl3b3JkIGRhdGFcXG4gICAgICAgIHRoYXQgaXMgYSBsaXN0IG9mIGpzb24gc3R5bGUgcmVjb3JkcyBhcyByb3dzLlxcbiAgICAgICAgY291bGQgYWxzbyBhY2NlcHQgYSBjc3YgZmlsZT8gb3Iga2V5d29yZHMgY29sdW1ucyBhbmQgcm93c1xcbiAgICAgICAgVGhpcyBhY2NlcHRzIGEgbG90IG1vcmUgb3B0aW9ucyB0aGF0IFxcXCJyZWFsIGFsdGFpclxcXCIgdG8gbWFrZSBpdCBlYXNpZXJcXG4gICAgICAgIHRvIHdvcmsgd2l0aCBub24tRGF0YUZyYW1lIGRhdGEgc2V0cy4gIEludGVybmFsbHk6XFxuICAgICAgICBzZWxmLmtleXMgY29udGFpbnMgdGhlIGxpc3Qgb2YgY29sdW1uIG5hbWVzXFxuICAgICAgICBzZWxmLnZhbHMgaXMgYSBsaXN0IG9mIGRpY3Rpb25hcmllcyBvZiB0aGUgZm9ybSBbe2NvbDE6dmFsMSwgY29sMjp2YWwyLCAuLi4gY29sbjp2YWxufSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sMTp2YWwzLCBjb2wyOnZhbDQsIC4uLiBjb2xuOnZhbG59LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjb2wxOnZhbDUsIGNvbDI6dmFsNiwgLi4uIGNvbG46dmFsbn1dXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgICMgdG9kbzogYWNjZXB0IGEgVVJMIGFzIHRoZSBhcmd1bWVudCB0byByZWFkIGEgQ1NWIG9yIEpTT04gZmlsZVxcbiAgICAgICAgaWYgbGVuKGt3YXJncykgPT0gMSBhbmQgXFxcImRhdGFcXFwiIGluIGt3YXJnczpcXG4gICAgICAgICAgICBzZWxmLmRhdGEgPSBrd2FyZ3NbXFxcImRhdGFcXFwiXVxcbiAgICAgICAgICAgIHNlbGYua2V5cyA9IHNlbGYuZGF0YVswXS5rZXlzKClcXG4gICAgICAgICAgICBzZWxmLnZhbHMgPSBzZWxmLmRhdGFcXG4gICAgICAgIGVsaWYgbGVuKGt3YXJncykgPT0gMiBhbmQgKFxcXCJjb2x1bW5zXFxcIiBpbiBrd2FyZ3MpIGFuZCAoXFxcInJvd3NcXFwiIGluIGt3YXJncyk6XFxuICAgICAgICAgICAgc2VsZi5rZXlzID0ga3dhcmdzW1xcXCJjb2x1bW5zXFxcIl1cXG4gICAgICAgICAgICBzZWxmLnZhbHMgPSBbXVxcbiAgICAgICAgICAgIGZvciByIGluIGt3YXJnc1tcXFwicm93c1xcXCJdOlxcbiAgICAgICAgICAgICAgICBzZWxmLnZhbHMuYXBwZW5kKGRpY3QoemlwKHNlbGYua2V5cywgcikpKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBrZXlzID0ga3dhcmdzLmtleXMoKVxcbiAgICAgICAgICAgIHZhbHMgPSBbXVxcbiAgICAgICAgICAgIHByaW1hcnlfa2V5ID0gbGlzdChrZXlzKVswXVxcbiAgICAgICAgICAgIGZvciBpeCBpbiByYW5nZShsZW4oa3dhcmdzW3ByaW1hcnlfa2V5XSkpOlxcbiAgICAgICAgICAgICAgICBkID0ge31cXG4gICAgICAgICAgICAgICAgZm9yIGtleSBpbiBrZXlzOlxcbiAgICAgICAgICAgICAgICAgICAgZFtrZXldID0ga3dhcmdzW2tleV1baXhdXFxuICAgICAgICAgICAgICAgIHZhbHMuYXBwZW5kKGQpXFxuICAgICAgICAgICAgc2VsZi52YWxzID0gdmFsc1xcbiAgICAgICAgICAgIHNlbGYua2V5cyA9IGtleXNcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICAjIGhlYWRlciA9IFxcXCJcXFxcdFxcXCIuam9pbihzZWxmLmtleXMpICsgXFxcIlxcXFxuXFxcIlxcbiAgICAgICAgaGVhZGVyID0gXFxcIlxcXCJcXG4gICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzOlxcbiAgICAgICAgICAgIGhlYWRlciArPSBrZXkuY2VudGVyKDEwKSArIFxcXCIgXFxcIlxcbiAgICAgICAgaGVhZGVyICs9IFxcXCJcXFxcblxcXCJcXG4gICAgICAgIHRlbXBsYXRlID0gXFxcIlxcXCJcXG4gICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzOlxcbiAgICAgICAgICAgIHRlbXBsYXRlICs9IFxcXCJ7XFxcIiArIGtleSArIFxcXCI6IDwxMH0gXFxcIlxcbiAgICAgICAgdGVtcGxhdGUgKz0gXFxcIlxcXFxuXFxcIlxcbiAgICAgICAgcmVzID0gXFxcIlxcXCJcXG4gICAgICAgIGZvciByb3cgaW4gc2VsZi52YWxzOlxcbiAgICAgICAgICAgIHJlcyArPSB0ZW1wbGF0ZS5mb3JtYXQoKipyb3cpXFxuXFxuICAgICAgICByZXR1cm4gaGVhZGVyICsgcmVzXFxuXFxuXFxuaWYgX19uYW1lX18gPT0gXFxcIl9fbWFpbl9fXFxcIjpcXG4gICAgZCA9IERhdGEoYT1bMywgNCwgNV0sIGI9WzEsIDIsIDNdLCBjPVtcXFwiclxcXCIsIFxcXCJnXFxcIiwgXFxcImJcXFwiXSlcXG4gICAgcHJpbnQoZClcXG4gICAgcHJpbnQoXFxuICAgICAgICB0eXBlKFxcbiAgICAgICAgICAgIENoYXJ0KHtcXFwiYVxcXCI6IGxpc3QoXFxcImFiY1xcXCIpLCBcXFwiYlxcXCI6IFsxLCAyLCAzXX0pLm1hcmtfYmFyKCkuZW5jb2RlKHg9XFxcImE6TlxcXCIsIHk9XFxcImJcXFwiKVxcbiAgICAgICAgKVxcbiAgICApXFxuICAgIGFhID0gKFxcbiAgICAgICAgQ2hhcnQoRGF0YShhPVszLCA0LCA1XSwgYj1bMSwgMiwgM10sIGM9W1xcXCJyXFxcIiwgXFxcImdcXFwiLCBcXFwiYlxcXCJdKSlcXG4gICAgICAgIC5tYXJrX3BvaW50KGNvbG9yPVxcXCJyZWRcXFwiKVxcbiAgICAgICAgLmVuY29kZSh4PVxcXCJiXFxcIiwgeT1cXFwiYVxcXCIsIGNvbG9yPVxcXCJjOk9cXFwiKVxcbiAgICApXFxuICAgIHByaW50KFxcXCJhYSA9IFxcXCIsIGFhKVxcbiAgICBhYS5kaXNwbGF5KClcXG5cXG4gICAgYmIgPSAoXFxuICAgICAgICBDaGFydChEYXRhKGE9WzEsIDIsIDNdLCBiPVs0LCA1LCA2XSwgYz1bXFxcInJcXFwiLCBcXFwiZ1xcXCIsIFxcXCJiXFxcIl0pKVxcbiAgICAgICAgLm1hcmtfbGluZSgpXFxuICAgICAgICAuZW5jb2RlKHg9XFxcImJcXFwiLCB5PVxcXCJhXFxcIiwgY29sb3I9XFxcImM6T1xcXCIpXFxuICAgIClcXG4gICAgcHJpbnQoXFxcImJiID0gXFxcIiwgYmIpXFxuICAgIGJiLmRpc3BsYXkoKVxcbiAgICBwcmludChcXFwiYWErYmJcXFwiLCAoYWEgKyBiYikuZGlzcGxheSgpKVxcbiAgICAjIENoYXJ0KERhdGEoYT1bMSwyLDMsMiwyLDQsNSw1LDYsNyw4LDgsOCw4LDgsOSwwLDBdKSkubWFya19iYXIoKS5lbmNvZGUoQXhpcygnYTpRJywgYmluPVRydWUpLHk9J2NvdW50KCknKVxcblxcblxcbiMgdG9kbzogc2VlIGlmIEkgY2FuIHdvcmsgd2l0aCB0aGUgcmVwciBvZiBhbiBvYmplY3QgdG8gZ2V0IHRoZSBiZWhhdmlvciB0aGF0IGFsdGFpciBnZXRzIGluIG5vdGVib29rc1xcbiMgdG9kbzogaW1wbGVtZW50IGEgQmluIG9iamVjdCB0byBzcGVjaWZpeSBtYXhiaW5zXFxuXCIsXCJzcmMvbGliL2FsdGFpci92ZWdhX2NhbGxlci5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e19fZmlsZV9fOlxcXCIvc3JjL2xpYi92ZWdhX2NhbGxlci5qc1xcXCIsX19wYWNrYWdlX186U2suYnVpbHRpbi5ub25lLm5vbmUkLHJlbmRlcl9ncmFwaDpuZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcInJlbmRlcl9ncmFwaFxcXCIsYXJndW1lbnRzLDEsMSk7bGV0IGI9XFxcIiNcXFwiK1NrLmRpdmlkK1xcXCJfZ3JhcGhpY3NcXFwiO3RyeXt2ZWdhRW1iZWQoYixTay5mZmkucmVtYXBUb0pzKGEpLHthY3Rpb25zOiEwfSl9Y2F0Y2goYSl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uRXhjZXB0aW9uKFxcXCJFcnJvciBpbiBncmFwaCBzcGVjaWZpY2F0aW9uIHVuYWJsZSB0byByZW5kZXIgdGhlIGdyYXBoXFxcXG5cXFwiK2EubWVzc2FnZSl9fSl9O3JldHVybiBhfTtcIixcInNyYy9saWIvYW50aWdyYXZpdHkucHlcIjpcImltcG9ydCB3ZWJicm93c2VyXFxuXFxud2ViYnJvd3Nlci5vcGVuKFxcXCJodHRwczovL3hrY2QuY29tLzM1My9cXFwiKVxcblwiLFwic3JjL2xpYi9hbnlkYm0ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFueWRibSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FycmF5LmpzXCI6XCIkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9LGI9W1xcXCJjXFxcIixcXFwiYlxcXCIsXFxcIkJcXFwiLFxcXCJ1XFxcIixcXFwiaFxcXCIsXFxcIkhcXFwiLFxcXCJpXFxcIixcXFwiSVxcXCIsXFxcImxcXFwiLFxcXCJMXFxcIixcXFwiZlxcXCIsXFxcImRcXFwiXTtyZXR1cm4gYS5fX25hbWVfXz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImFycmF5XFxcIiksYS5hcnJheT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxjKXtjLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksLTE9PWIuaW5kZXhPZihTay5mZmkucmVtYXBUb0pzKGMpKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJiYWQgdHlwZWNvZGUgKG11c3QgYmUgYywgYiwgQiwgdSwgaCwgSCwgaSwgSSwgbCwgTCwgZiBvciBkKVxcXCIpO2lmKGQmJiFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJpdGVyYXRpb24gb3ZlciBub24tc2VxdWVuY2VcXFwiKTtpZihhLiRkLm1wJGFzc19zdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJ0eXBlY29kZVxcXCIpLGMpLGEuJGQubXAkYXNzX3N1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5zdHIoXFxcIl9fbW9kdWxlX19cXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImFycmF5XFxcIikpLGEudHlwZWNvZGU9Yyx2b2lkIDA9PT1kKWEuaW50ZXJuYWxJdGVyYWJsZT1uZXcgU2suYnVpbHRpbi5saXN0O2Vsc2UgaWYoZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdClhLmludGVybmFsSXRlcmFibGU9ZDtlbHNlIGZvcihhLmludGVybmFsSXRlcmFibGU9bmV3IFNrLmJ1aWx0aW4ubGlzdCxpdGVyPVNrLmFic3RyLml0ZXIoZCksaXRlbT1pdGVyLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09aXRlbTtpdGVtPWl0ZXIudHAkaXRlcm5leHQoKSlTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLmFwcGVuZCxbYS5pbnRlcm5hbEl0ZXJhYmxlLGl0ZW1dKX0pLGMuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1Tay5mZmkucmVtYXBUb0pzKGEudHlwZWNvZGUpLGM9XFxcIlxcXCI7cmV0dXJuIFNrLmZmaS5yZW1hcFRvSnMoYS5pbnRlcm5hbEl0ZXJhYmxlKS5sZW5ndGgmJihcXFwiY1xcXCI9PVNrLmZmaS5yZW1hcFRvSnMoYS50eXBlY29kZSk/Yz1cXFwiLCAnXFxcIitTay5mZmkucmVtYXBUb0pzKGEuaW50ZXJuYWxJdGVyYWJsZSkuam9pbihcXFwiXFxcIikrXFxcIidcXFwiOmM9XFxcIiwgXFxcIitTay5mZmkucmVtYXBUb0pzKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmludGVybmFsSXRlcmFibGUuX19yZXByX18sW2EuaW50ZXJuYWxJdGVyYWJsZV0pKSksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhcnJheSgnXFxcIitiK1xcXCInXFxcIitjK1xcXCIpXFxcIil9KSxjLl9fc3RyX189Yy5fX3JlcHJfXyxjLl9fZ2V0YXR0cmlidXRlX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBhLnRwJGdldGF0dHIoYil9KSxjLmFwcGVuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmludGVybmFsSXRlcmFibGUuYXBwZW5kLFthLmludGVybmFsSXRlcmFibGUsYl0pLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuZXh0ZW5kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJpdGVyYXRpb24gb3ZlciBub24tc2VxdWVuY2VcXFwiKTtmb3IoaXRlcj1Tay5hYnN0ci5pdGVyKGIpLGl0ZW09aXRlci50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWl0ZW07aXRlbT1pdGVyLnRwJGl0ZXJuZXh0KCkpU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuaW50ZXJuYWxJdGVyYWJsZS5hcHBlbmQsW2EuaW50ZXJuYWxJdGVyYWJsZSxpdGVtXSl9KX0sXFxcImFycmF5XFxcIixbXSksYX07XCIsXCJzcmMvbGliL2FzdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYXN0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYXN5bmNoYXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFzeW5jaGF0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYXN5bmNvcmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFzeW5jb3JlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYXRleGl0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhdGV4aXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hdWRpb2Rldi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYXVkaW9kZXYgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9iYXNlNjQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImJhc2U2NCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2JkYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYmRiIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmluaGV4LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJiaW5oZXggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9iaXNlY3QucHlcIjpcIlxcXCJcXFwiXFxcIkJpc2VjdGlvbiBhbGdvcml0aG1zLlxcXCJcXFwiXFxcIlxcblxcbmRlZiBpbnNvcnRfcmlnaHQoYSwgeCwgbG89MCwgaGk9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIkluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhbmQga2VlcCBpdCBzb3J0ZWQgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIElmIHggaXMgYWxyZWFkeSBpbiBhLCBpbnNlcnQgaXQgdG8gdGhlIHJpZ2h0IG9mIHRoZSByaWdodG1vc3QgeC5cXG5cXG4gICAgT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgbGVuKGEpKSBib3VuZCB0aGVcXG4gICAgc2xpY2Ugb2YgYSB0byBiZSBzZWFyY2hlZC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIGlmIGxvIDwgMDpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xvIG11c3QgYmUgbm9uLW5lZ2F0aXZlJylcXG4gICAgaWYgaGkgaXMgTm9uZTpcXG4gICAgICAgIGhpID0gbGVuKGEpXFxuICAgIHdoaWxlIGxvIDwgaGk6XFxuICAgICAgICBtaWQgPSAobG8raGkpLy8yXFxuICAgICAgICBpZiB4IDwgYVttaWRdOiBoaSA9IG1pZFxcbiAgICAgICAgZWxzZTogbG8gPSBtaWQrMVxcbiAgICBhLmluc2VydChsbywgeClcXG5cXG5kZWYgYmlzZWN0X3JpZ2h0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGluZGV4IHdoZXJlIHRvIGluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhc3N1bWluZyBhIGlzIHNvcnRlZC5cXG5cXG4gICAgVGhlIHJldHVybiB2YWx1ZSBpIGlzIHN1Y2ggdGhhdCBhbGwgZSBpbiBhWzppXSBoYXZlIGUgPD0geCwgYW5kIGFsbCBlIGluXFxuICAgIGFbaTpdIGhhdmUgZSA+IHguICBTbyBpZiB4IGFscmVhZHkgYXBwZWFycyBpbiB0aGUgbGlzdCwgYS5pbnNlcnQoeCkgd2lsbFxcbiAgICBpbnNlcnQganVzdCBhZnRlciB0aGUgcmlnaHRtb3N0IHggYWxyZWFkeSB0aGVyZS5cXG5cXG4gICAgT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgbGVuKGEpKSBib3VuZCB0aGVcXG4gICAgc2xpY2Ugb2YgYSB0byBiZSBzZWFyY2hlZC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIGlmIGxvIDwgMDpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xvIG11c3QgYmUgbm9uLW5lZ2F0aXZlJylcXG4gICAgaWYgaGkgaXMgTm9uZTpcXG4gICAgICAgIGhpID0gbGVuKGEpXFxuICAgIHdoaWxlIGxvIDwgaGk6XFxuICAgICAgICBtaWQgPSAobG8raGkpLy8yXFxuICAgICAgICBpZiB4IDwgYVttaWRdOiBoaSA9IG1pZFxcbiAgICAgICAgZWxzZTogbG8gPSBtaWQrMVxcbiAgICByZXR1cm4gbG9cXG5cXG5kZWYgaW5zb3J0X2xlZnQoYSwgeCwgbG89MCwgaGk9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIkluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhbmQga2VlcCBpdCBzb3J0ZWQgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIElmIHggaXMgYWxyZWFkeSBpbiBhLCBpbnNlcnQgaXQgdG8gdGhlIGxlZnQgb2YgdGhlIGxlZnRtb3N0IHguXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgYVttaWRdIDwgeDogbG8gPSBtaWQrMVxcbiAgICAgICAgZWxzZTogaGkgPSBtaWRcXG4gICAgYS5pbnNlcnQobG8sIHgpXFxuXFxuXFxuZGVmIGJpc2VjdF9sZWZ0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGluZGV4IHdoZXJlIHRvIGluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhc3N1bWluZyBhIGlzIHNvcnRlZC5cXG5cXG4gICAgVGhlIHJldHVybiB2YWx1ZSBpIGlzIHN1Y2ggdGhhdCBhbGwgZSBpbiBhWzppXSBoYXZlIGUgPCB4LCBhbmQgYWxsIGUgaW5cXG4gICAgYVtpOl0gaGF2ZSBlID49IHguICBTbyBpZiB4IGFscmVhZHkgYXBwZWFycyBpbiB0aGUgbGlzdCwgYS5pbnNlcnQoeCkgd2lsbFxcbiAgICBpbnNlcnQganVzdCBiZWZvcmUgdGhlIGxlZnRtb3N0IHggYWxyZWFkeSB0aGVyZS5cXG5cXG4gICAgT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgbGVuKGEpKSBib3VuZCB0aGVcXG4gICAgc2xpY2Ugb2YgYSB0byBiZSBzZWFyY2hlZC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIGlmIGxvIDwgMDpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xvIG11c3QgYmUgbm9uLW5lZ2F0aXZlJylcXG4gICAgaWYgaGkgaXMgTm9uZTpcXG4gICAgICAgIGhpID0gbGVuKGEpXFxuICAgIHdoaWxlIGxvIDwgaGk6XFxuICAgICAgICBtaWQgPSAobG8raGkpLy8yXFxuICAgICAgICBpZiBhW21pZF0gPCB4OiBsbyA9IG1pZCsxXFxuICAgICAgICBlbHNlOiBoaSA9IG1pZFxcbiAgICByZXR1cm4gbG9cXG5cXG4jIE92ZXJ3cml0ZSBhYm92ZSBkZWZpbml0aW9ucyB3aXRoIGEgZmFzdCBDIGltcGxlbWVudGF0aW9uXFxudHJ5OlxcbiAgICBmcm9tIF9iaXNlY3QgaW1wb3J0ICpcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG5cXG4jIENyZWF0ZSBhbGlhc2VzXFxuYmlzZWN0ID0gYmlzZWN0X3JpZ2h0XFxuaW5zb3J0ID0gaW5zb3J0X3JpZ2h0XFxuXCIsXCJzcmMvbGliL2JzZGRiL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJic2RkYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NQcm9maWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjUHJvZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NhbGVuZGFyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjYWxlbmRhciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NnaS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY2dpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY2dpdGIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNnaXRiIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY2h1bmsucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNodW5rIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY21kLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjbWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb2RlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb2RlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29kZWNzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb2RlY3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb2Rlb3AucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvZGVvcCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvbGxlY3Rpb25zLmpzXCI6XCJmdW5jdGlvbiAkYnVpbHRpbm1vZHVsZSgpe2NvbnN0IGE9e307cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcXFwia2V5d29yZFxcXCIsITEsITApLGI9PihhLl9pc2tleXdvcmQ9Yi4kZC5pc2tleXdvcmQsU2suaW1wb3J0TW9kdWxlKFxcXCJpdGVydG9vbHNcXFwiLCExLCEwKSksYj0+KGEuX2NoYWluPWIuJGQuY2hhaW4sYS5fc3Rhcm1hcD1iLiRkLnN0YXJtYXAsYS5fcmVwZWF0PWIuJGQucmVwZWF0LFNrLmltcG9ydE1vZHVsZShcXFwib3BlcmF0b3JcXFwiLCExLCEwKSksYj0+e2EuX2l0ZW1nZXR0ZXI9Yi4kZC5pdGVtZ2V0dGVyfSwoKT0+Y29sbGVjdGlvbnNfbW9kKGEpKX1mdW5jdGlvbiBjb2xsZWN0aW9uc19tb2QoYSl7ZnVuY3Rpb24gY291bnRlck51bWJlclNsb3QoYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKHZvaWQgMCE9PWMmJiEoYyBpbnN0YW5jZW9mIGEuQ291bnRlcikpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGQ9bmV3IGEuQ291bnRlcjtyZXR1cm4gYi5jYWxsKHRoaXMsZCxjKSxkfX1mdW5jdGlvbiBjb3VudGVySW5wbGFjZVNsb3QoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoIShjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIkNvdW50ZXIgXFxcIithK1xcXCI9IFxcXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXFxcIiBpcyBub3Qgc3VwcG9ydGVkXFxcIik7cmV0dXJuIGIuY2FsbCh0aGlzLGMpLHRoaXMua2VlcCRwb3NpdGl2ZSgpfX1mdW5jdGlvbiBuYW1lZHR1cGxlKGIsYyxkLGwsbSl7ZnVuY3Rpb24gX21ha2UoYSxiKXtyZXR1cm4gYS5wcm90b3R5cGUudHAkbmV3KFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGIpKX1mdW5jdGlvbiBfYXNkaWN0KGEpe2NvbnN0IGI9W107Zm9yKGxldCBjPTA7YzxhLl9maWVsZHMudi5sZW5ndGg7YysrKWIucHVzaChhLl9maWVsZHMudltjXSksYi5wdXNoKGEudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmRpY3QoYil9ZnVuY3Rpb24gX3JlcGxhY2UoYSxiKXthPW5ldyBTay5idWlsdGluLmRpY3QoYSk7Y29uc3QgYz1hLnRwJGdldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJwb3BcXFwiKSksZD1Tay5hYnN0ci5nYXR0cihiLG5ldyBTay5idWlsdGluLnN0cihcXFwiX21ha2VcXFwiKSksZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXksZj1lKGQsW2UoU2suYnVpbHRpbi5tYXBfLFtjLHIsYl0pXSk7aWYoYS5zcSRsZW5ndGgoKSl7Y29uc3QgYj1hLnNrJGFzYXJyYXkoKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJHb3QgdW5leHBlY3RkIGZpZWxkIG5hbWVzOiBbXFxcIitiLm1hcChhPT5cXFwiJ1xcXCIrYS4kanNzdHIoKStcXFwiJ1xcXCIpK1xcXCJdXFxcIil9cmV0dXJuIGZ9aWYoYj1iLnRwJHN0cigpLFNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5faXNrZXl3b3JkLFtiXSkpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlR5cGUgbmFtZXMgYW5kIGZpZWxkIG5hbWVzIGNhbm5vdCBiZSBhIGtleXdvcmQ6ICdcXFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYikrXFxcIidcXFwiKTtjb25zdCBuPWIuJGpzc3RyKCk7aWYoZS50ZXN0KG4pfHwhZy50ZXN0KG4pfHwhbil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBtdXN0IGJlIHZhbGlkIGlkZW50aWZpZXJzOiAnXFxcIituK1xcXCInXFxcIik7bGV0IG8scDtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKW89Yy4kanNzdHIoKS5yZXBsYWNlKGgsXFxcIiBcXFwiKS5zcGxpdChqKSwxPT1vLmxlbmd0aCYmXFxcIlxcXCI9PT1vWzBdJiYobz1bXSkscD1vLm1hcChhPT5uZXcgU2suYnVpbHRpbi5zdHIoYSkpO2Vsc2V7bz1bXSxwPVtdO2ZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpYj1iLnRwJHN0cigpLHAucHVzaChiKSxvLnB1c2goYi4kanNzdHIoKSl9bGV0IHE9bmV3IFNldDtpZihTay5taXNjZXZhbC5pc1RydWUoZCkpZm9yKGk9MDtpPG8ubGVuZ3RoO2krKykoU2subWlzY2V2YWwuaXNUcnVlKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLl9pc2tleXdvcmQsW3BbaV1dKSl8fGYudGVzdChvW2ldKXx8IWcudGVzdChvW2ldKXx8IW9baV18fHEuaGFzKG9baV0pKSYmKG9baV09XFxcIl9cXFwiK2kscFtpXT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIl9cXFwiK2kpKSxxLmFkZChvW2ldKTtlbHNlIGZvcihpPTA7aTxvLmxlbmd0aDtpKyspe2lmKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5faXNrZXl3b3JkLFtwW2ldXSkpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlR5cGUgbmFtZXMgYW5kIGZpZWxkIG5hbWVzIGNhbm5vdCBiZSBhIGtleXdvcmQ6ICdcXFwiK29baV0rXFxcIidcXFwiKTtlbHNlIGlmKGYudGVzdChvW2ldKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJGaWVsZCBuYW1lcyBjYW5ub3Qgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlOiAnXFxcIitvW2ldK1xcXCInXFxcIik7ZWxzZSBpZighZy50ZXN0KG9baV0pfHwhb1tpXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBtdXN0IGJlIHZhbGlkIGlkZW50aWZpZXJzOiAnXFxcIitvW2ldK1xcXCInXFxcIik7ZWxzZSBpZihxLmhhcyhvW2ldKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJFbmNvdW50ZXJlZCBkdXBsaWNhdGUgZmllbGQgbmFtZTogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO3EuYWRkKG9baV0pfWNvbnN0IHI9bmV3IFNrLmJ1aWx0aW4udHVwbGUocCkscz1bXTtsZXQgdD1bXTtpZighU2suYnVpbHRpbi5jaGVja05vbmUobCkpe2lmKHQ9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUobCksdC5sZW5ndGg+by5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJHb3QgbW9yZSBkZWZhdWx0IHZhbHVlcyB0aGFuIGZpZWxkIG5hbWVzXFxcIik7Zm9yKGxldCBhPTAsYj1wLmxlbmd0aC10Lmxlbmd0aDtiPHAubGVuZ3RoO2ErKyxiKyspcy5wdXNoKHBbYl0pLHMucHVzaCh0W2FdKX1jb25zdCB1PW5ldyBTay5idWlsdGluLmRpY3Qocyk7X21ha2UuY29fdmFybmFtZXM9W1xcXCJfY2xzXFxcIixcXFwiaXRlcmFibGVcXFwiXSxfYXNkaWN0LmNvX3Zhcm5hbWVzPVtcXFwic2VsZlxcXCJdLF9yZXBsYWNlLmNvX2t3YXJncz0xLF9yZXBsYWNlLmNvX3Zhcm5hbWVzPVtcXFwiX3NlbGZcXFwiXTtjb25zdCB2PXt9O2ZvcihsZXQgZT0wO2U8by5sZW5ndGg7ZSsrKXZbcFtlXS4kbWFuZ2xlZF09bmV3IFNrLmJ1aWx0aW4ucHJvcGVydHkobmV3IGEuX2l0ZW1nZXR0ZXIoW25ldyBTay5idWlsdGluLmludF8oZSldKSx2b2lkIDAsdm9pZCAwLG5ldyBTay5idWlsdGluLnN0cihcXFwiQWxpYXMgZm9yIGZpZWxkIG51bWJlciBcXFwiK2UpKTtyZXR1cm4gU2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhuLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBOYW1lZFR1cGxlKCl7fSxiYXNlOlNrLmJ1aWx0aW4udHVwbGUsc2xvdHM6e3RwJGRvYzpuK1xcXCIoXFxcIitvLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiLHRwJG5ldyhhLGIpe2E9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcIl9fbmV3X19cXFwiLG8sYSxiLHQpO2NvbnN0IGM9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIFNrLmJ1aWx0aW4udHVwbGUuY2FsbChjLGEpLGN9LCRyKCl7Y29uc3QgYT10aGlzLnYubWFwKChhLGIpPT5vW2JdK1xcXCI9XFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1xcXCIoXFxcIithLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiKX19LHByb3RvOk9iamVjdC5hc3NpZ24oe19fbW9kdWxlX186U2suYnVpbHRpbi5jaGVja05vbmUobSk/U2suZ2xvYmFscy5fX25hbWVfXzptLF9fc2xvdHNfXzpuZXcgU2suYnVpbHRpbi50dXBsZSxfZmllbGRzOnIsX2ZpZWxkX2RlZmF1bHRzOnUsX21ha2U6bmV3IFNrLmJ1aWx0aW4uY2xhc3NtZXRob2QobmV3IFNrLmJ1aWx0aW4uZnVuYyhfbWFrZSkpLF9hc2RpY3Q6bmV3IFNrLmJ1aWx0aW4uZnVuYyhfYXNkaWN0KSxfcmVwbGFjZTpuZXcgU2suYnVpbHRpbi5mdW5jKF9yZXBsYWNlKX0sdil9KX1hLl9fYWxsX189bmV3IFNrLmJ1aWx0aW4ubGlzdChbXFxcImRlcXVlXFxcIixcXFwiZGVmYXVsdGRpY3RcXFwiLFxcXCJuYW1lZHR1cGxlXFxcIixcXFwiQ291bnRlclxcXCIsXFxcIk9yZGVyZWREaWN0XFxcIl0ubWFwKGE9Pm5ldyBTay5idWlsdGluLnN0cihhKSkpLGEuZGVmYXVsdGRpY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiY29sbGVjdGlvbnMuZGVmYXVsdGRpY3RcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBkZWZhdWx0ZGljdChhLGIpe3RoaXMuZGVmYXVsdF9mYWN0b3J5PWEsU2suYnVpbHRpbi5kaWN0LmNhbGwodGhpcyxiKX0sYmFzZTpTay5idWlsdGluLmRpY3QsbWV0aG9kczp7Y29weTp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH19LF9fY29weV9fOnskbWV0aCgpe3JldHVybiB0aGlzLiRjb3B5KCl9LCRmbGFnczp7Tm9BcmdzOiEwfX0sX19taXNzaW5nX186eyRtZXRoKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMuZGVmYXVsdF9mYWN0b3J5KSl0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTtlbHNle2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMuZGVmYXVsdF9mYWN0b3J5LFtdKTtyZXR1cm4gdGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsYiksYn19LCRmbGFnczp7T25lQXJnOiEwfX19LGdldHNldHM6e2RlZmF1bHRfZmFjdG9yeTp7JGdldCgpe3JldHVybiB0aGlzLmRlZmF1bHRfZmFjdG9yeX0sJHNldChhKXthPWF8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0aGlzLmRlZmF1bHRfZmFjdG9yeT1hfX19LHNsb3RzOnt0cCRkb2M6XFxcImRlZmF1bHRkaWN0KGRlZmF1bHRfZmFjdG9yeVssIC4uLl0pIC0tPiBkaWN0IHdpdGggZGVmYXVsdCBmYWN0b3J5XFxcXG5cXFxcblRoZSBkZWZhdWx0IGZhY3RvcnkgaXMgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzIHRvIHByb2R1Y2VcXFxcbmEgbmV3IHZhbHVlIHdoZW4gYSBrZXkgaXMgbm90IHByZXNlbnQsIGluIF9fZ2V0aXRlbV9fIG9ubHkuXFxcXG5BIGRlZmF1bHRkaWN0IGNvbXBhcmVzIGVxdWFsIHRvIGEgZGljdCB3aXRoIHRoZSBzYW1lIGl0ZW1zLlxcXFxuQWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgaWYgdGhleSB3ZXJlXFxcXG5wYXNzZWQgdG8gdGhlIGRpY3QgY29uc3RydWN0b3IsIGluY2x1ZGluZyBrZXl3b3JkIGFyZ3VtZW50cy5cXFxcblxcXCIsdHAkaW5pdChhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO2lmKHZvaWQgMD09PWMpdGhpcy5kZWZhdWx0X2ZhY3Rvcnk9U2suYnVpbHRpbi5ub25lLm5vbmUkO2Vsc2UgaWYoIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShjKSYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZVxcXCIpO2Vsc2UgdGhpcy5kZWZhdWx0X2ZhY3Rvcnk9YztyZXR1cm4gU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS50cCRpbml0LmNhbGwodGhpcyxhLGIpfSwkcigpe2NvbnN0IGE9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLmRlZmF1bHRfZmFjdG9yeSksYj1Tay5idWlsdGluLmRpY3QucHJvdG90eXBlLiRyLmNhbGwodGhpcykudjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJkZWZhdWx0ZGljdChcXFwiK2ErXFxcIiwgXFxcIitiK1xcXCIpXFxcIil9fSxwcm90bzp7JGNvcHkoKXtjb25zdCBiPVtdO3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIodGhpcyksYT0+e2IucHVzaChhKSxiLnB1c2godGhpcy5tcCRzdWJzY3JpcHQoYSkpfSksbmV3IGEuZGVmYXVsdGRpY3QodGhpcy5kZWZhdWx0X2ZhY3RvcnksYil9fX0pLGEuQ291bnRlcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJDb3VudGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gQ291bnRlcigpe3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdCxTay5idWlsdGluLmRpY3QuYXBwbHkodGhpcyl9LGJhc2U6U2suYnVpbHRpbi5kaWN0LG1ldGhvZHM6e2VsZW1lbnRzOnskZmxhZ3M6e05vQXJnczohMH0sJG1ldGgoKXtjb25zdCBiPWEuX2NoYWluLnRwJGdldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJmcm9tX2l0ZXJhYmxlXFxcIikpLGM9YS5fc3Rhcm1hcCxkPWEuX3JlcGVhdCxlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheTtyZXR1cm4gZShiLFtlKGMsW2QsZSh0aGlzLnRwJGdldGF0dHIodGhpcy5zdHIkaXRlbXMpKV0pXSl9fSxtb3N0X2NvbW1vbjp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJuXFxcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4ubm9uZS5ub25lJF19LCRtZXRoKGEpe2xlbmd0aD10aGlzLnNxJGxlbmd0aCgpLFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpP2E9bGVuZ3RoOihhPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpLGE9YT5sZW5ndGg/bGVuZ3RoOjA+YT8wOmEpO2NvbnN0IGI9dGhpcy4kaXRlbXMoKS5zb3J0KChjLGEpPT5Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woY1sxXSxhWzFdLFxcXCJMdFxcXCIpPzE6U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbMV0sYVsxXSxcXFwiR3RcXFwiKT8tMTowKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiLnNsaWNlKDAsYSkubWFwKGE9Pm5ldyBTay5idWlsdGluLnR1cGxlKGEpKSl9fSx1cGRhdGU6eyRmbGFnczp7RmFzdENhbGw6ITB9LCRtZXRoKGEsYil7cmV0dXJuIFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwidXBkYXRlXFxcIixhLDAsMSksdGhpcy5jb3VudGVyJHVwZGF0ZShhLGIpfX0sc3VidHJhY3Q6eyRmbGFnczp7RmFzdENhbGw6ITB9LCRtZXRoKGEsYil7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJzdWJ0cmFjdFxcXCIsYSwwLDEpO2NvbnN0IGM9YVswXTtpZih2b2lkIDAhPT1jKWlmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpZm9yKGxldCBhPVNrLmFic3RyLml0ZXIoYyksYj1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWEudHAkaXRlcm5leHQoKSl7Y29uc3QgYT10aGlzLm1wJHN1YnNjcmlwdChiKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoYixTay5hYnN0ci5udW1iZXJCaW5PcChhLGMubXAkc3Vic2NyaXB0KGIpLFxcXCJTdWJcXFwiKSl9ZWxzZSBmb3IoaXRlcj1Tay5hYnN0ci5pdGVyKGMpLGs9aXRlci50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWs7az1pdGVyLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoayk7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGssU2suYWJzdHIubnVtYmVyQmluT3AoYSx0aGlzLiRvbmUsXFxcIlN1YlxcXCIpKX1iPWJ8fFtdO2ZvcihsZXQgYz0wO2M8Yi5sZW5ndGg7Yys9Mil7Y29uc3QgYT1uZXcgU2suYnVpbHRpbi5zdHIoYltjXSksZD10aGlzLm1wJHN1YnNjcmlwdChhKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoYSxTay5hYnN0ci5udW1iZXJCaW5PcChkLGJbYysxXSxcXFwiU3ViXFxcIikpfXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9fSxfX21pc3NpbmdfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kemVyb30sJGZsYWdzOntPbmVBcmc6ITB9fSxjb3B5OnskbWV0aCgpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5Db3VudGVyLFt0aGlzXSl9LCRmbGFnczp7Tm9BcmdzOiEwfX19LGdldHNldHM6e19fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH0sc2xvdHM6e3RwJGRvYzpcXFwiRGljdCBzdWJjbGFzcyBmb3IgY291bnRpbmcgaGFzaGFibGUgaXRlbXMuICBTb21ldGltZXMgY2FsbGVkIGEgYmFnXFxcXG4gICAgb3IgbXVsdGlzZXQuICBFbGVtZW50cyBhcmUgc3RvcmVkIGFzIGRpY3Rpb25hcnkga2V5cyBhbmQgdGhlaXIgY291bnRzXFxcXG4gICAgYXJlIHN0b3JlZCBhcyBkaWN0aW9uYXJ5IHZhbHVlcy5cXFxcblxcXFxuICAgID4+PiBjID0gQ291bnRlcignYWJjZGVhYmNkYWJjYWJhJykgICMgY291bnQgZWxlbWVudHMgZnJvbSBhIHN0cmluZ1xcXFxuXFxcXG4gICAgPj4+IGMubW9zdF9jb21tb24oMykgICAgICAgICAgICAgICAgIyB0aHJlZSBtb3N0IGNvbW1vbiBlbGVtZW50c1xcXFxuICAgIFsoJ2EnLCA1KSwgKCdiJywgNCksICgnYycsIDMpXVxcXFxuICAgID4+PiBzb3J0ZWQoYykgICAgICAgICAgICAgICAgICAgICAgICMgbGlzdCBhbGwgdW5pcXVlIGVsZW1lbnRzXFxcXG4gICAgWydhJywgJ2InLCAnYycsICdkJywgJ2UnXVxcXFxuICAgID4+PiAnJy5qb2luKHNvcnRlZChjLmVsZW1lbnRzKCkpKSAgICMgbGlzdCBlbGVtZW50cyB3aXRoIHJlcGV0aXRpb25zXFxcXG4gICAgJ2FhYWFhYmJiYmNjY2RkZSdcXFxcbiAgICA+Pj4gc3VtKGMudmFsdWVzKCkpICAgICAgICAgICAgICAgICAjIHRvdGFsIG9mIGFsbCBjb3VudHNcXFxcbiAgICAxNVxcXFxuXFxcXG4gICAgPj4+IGNbJ2EnXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb3VudCBvZiBsZXR0ZXIgJ2EnXFxcXG4gICAgNVxcXFxuICAgID4+PiBmb3IgZWxlbSBpbiAnc2hhemFtJzogICAgICAgICAgICMgdXBkYXRlIGNvdW50cyBmcm9tIGFuIGl0ZXJhYmxlXFxcXG4gICAgLi4uICAgICBjW2VsZW1dICs9IDEgICAgICAgICAgICAgICAgIyBieSBhZGRpbmcgMSB0byBlYWNoIGVsZW1lbnQncyBjb3VudFxcXFxuICAgID4+PiBjWydhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgbm93IHRoZXJlIGFyZSBzZXZlbiAnYSdcXFxcbiAgICA3XFxcXG4gICAgPj4+IGRlbCBjWydiJ10gICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgYWxsICdiJ1xcXFxuICAgID4+PiBjWydiJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgbm93IHRoZXJlIGFyZSB6ZXJvICdiJ1xcXFxuICAgIDBcXFxcblxcXFxuICAgID4+PiBkID0gQ291bnRlcignc2ltc2FsYWJpbScpICAgICAgICMgbWFrZSBhbm90aGVyIGNvdW50ZXJcXFxcbiAgICA+Pj4gYy51cGRhdGUoZCkgICAgICAgICAgICAgICAgICAgICAjIGFkZCBpbiB0aGUgc2Vjb25kIGNvdW50ZXJcXFxcbiAgICA+Pj4gY1snYSddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgbmluZSAnYSdcXFxcbiAgICA5XFxcXG5cXFxcbiAgICA+Pj4gYy5jbGVhcigpICAgICAgICAgICAgICAgICAgICAgICAjIGVtcHR5IHRoZSBjb3VudGVyXFxcXG4gICAgPj4+IGNcXFxcbiAgICBDb3VudGVyKClcXFxcblxcXFxuICAgIE5vdGU6ICBJZiBhIGNvdW50IGlzIHNldCB0byB6ZXJvIG9yIHJlZHVjZWQgdG8gemVybywgaXQgd2lsbCByZW1haW5cXFxcbiAgICBpbiB0aGUgY291bnRlciB1bnRpbCB0aGUgZW50cnkgaXMgZGVsZXRlZCBvciB0aGUgY291bnRlciBpcyBjbGVhcmVkOlxcXFxuXFxcXG4gICAgPj4+IGMgPSBDb3VudGVyKCdhYWFiYmMnKVxcXFxuICAgID4+PiBjWydiJ10gLT0gMiAgICAgICAgICAgICAgICAgICAgICMgcmVkdWNlIHRoZSBjb3VudCBvZiAnYicgYnkgdHdvXFxcXG4gICAgPj4+IGMubW9zdF9jb21tb24oKSAgICAgICAgICAgICAgICAgIyAnYicgaXMgc3RpbGwgaW4sIGJ1dCBpdHMgY291bnQgaXMgemVyb1xcXFxuICAgIFsoJ2EnLCAzKSwgKCdjJywgMSksICgnYicsIDApXVxcXFxuXFxcXG5cXFwiLHRwJGluaXQoYSxiKXtyZXR1cm4gU2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMudHBqc19uYW1lLGEsMCwxKSx0aGlzLmNvdW50ZXIkdXBkYXRlKGEsYil9LCRyKCl7Y29uc3QgYT0wPHRoaXMuc2l6ZT9Tay5idWlsdGluLmRpY3QucHJvdG90eXBlLiRyLmNhbGwodGhpcykudjpcXFwiXFxcIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1xcXCIoXFxcIithK1xcXCIpXFxcIil9LHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsbXAkYXNzX3N1YnNjcmlwdChhLGIpe3JldHVybiB2b2lkIDA9PT1iP3RoaXMubXAkbG9va3VwKGEpJiZTay5idWlsdGluLmRpY3QucHJvdG90eXBlLm1wJGFzc19zdWJzY3JpcHQuY2FsbCh0aGlzLGEsYik6U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5tcCRhc3Nfc3Vic2NyaXB0LmNhbGwodGhpcyxhLGIpfSx0cCRhc19udW1iZXI6ITAsbmIkcG9zaXRpdmU6Y291bnRlck51bWJlclNsb3QoZnVuY3Rpb24oYSl7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyx0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYixjKX0pfSksbmIkbmVnYXRpdmU6Y291bnRlck51bWJlclNsb3QoZnVuY3Rpb24oYSl7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyx0aGlzLiR6ZXJvLFxcXCJMdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYixTay5hYnN0ci5udW1iZXJCaW5PcCh0aGlzLiR6ZXJvLGMsXFxcIlN1YlxcXCIpKX0pfSksbmIkc3VidHJhY3Q6Y291bnRlck51bWJlclNsb3QoZnVuY3Rpb24oYSxiKXt0aGlzLiRpdGVtcygpLmZvckVhY2goKFtjLGRdKT0+e2NvbnN0IGU9U2suYWJzdHIubnVtYmVyQmluT3AoZCxiLm1wJHN1YnNjcmlwdChjKSxcXFwiU3ViXFxcIik7U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGUsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGMsZSl9KSxiLiRpdGVtcygpLmZvckVhY2goKFtiLGNdKT0+e3ZvaWQgMD09PXRoaXMubXAkbG9va3VwKGIpJiZTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyx0aGlzLiR6ZXJvLFxcXCJMdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYixTay5hYnN0ci5udW1iZXJCaW5PcCh0aGlzLiR6ZXJvLGMsXFxcIlN1YlxcXCIpKX0pfSksbmIkYWRkOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEsYil7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYyxkXSk9Pntjb25zdCBlPVNrLmFic3RyLm51bWJlckJpbk9wKGQsYi5tcCRzdWJzY3JpcHQoYyksXFxcIkFkZFxcXCIpO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChlLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGUpfSksYi4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pnt2b2lkIDA9PT10aGlzLm1wJGxvb2t1cChiKSYmU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsYyl9KX0pLG5iJGlucGxhY2VfYWRkOmNvdW50ZXJJbnBsYWNlU2xvdChcXFwiK1xcXCIsZnVuY3Rpb24oYSl7YS4kaXRlbXMoKS5mb3JFYWNoKChbYSxiXSk9Pntjb25zdCBjPVNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcCh0aGlzLm1wJHN1YnNjcmlwdChhKSxiLFxcXCJBZGRcXFwiKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoYSxjKX0pfSksbmIkaW5wbGFjZV9zdWJ0cmFjdDpjb3VudGVySW5wbGFjZVNsb3QoXFxcIi1cXFwiLGZ1bmN0aW9uKGEpe2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57Y29uc3QgYz1Tay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AodGhpcy5tcCRzdWJzY3JpcHQoYSksYixcXFwiU3ViXFxcIik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsYyl9KX0pLG5iJG9yOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEsYil7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYyxkXSk9Pntjb25zdCBlPWIubXAkc3Vic2NyaXB0KGMpLGY9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGQsZSxcXFwiTHRcXFwiKT9lOmQ7U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGYsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGMsZil9KSxiLiRpdGVtcygpLmZvckVhY2goKFtiLGNdKT0+e3ZvaWQgMD09PXRoaXMubXAkbG9va3VwKGIpJiZTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyx0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYixjKX0pfSksbmIkYW5kOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEsYil7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYyxkXSk9Pntjb25zdCBlPWIubXAkc3Vic2NyaXB0KGMpLGY9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGQsZSxcXFwiTHRcXFwiKT9kOmU7U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGYsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGMsZil9KX0pLG5iJGlucGxhY2VfYW5kOmNvdW50ZXJJbnBsYWNlU2xvdChcXFwiJlxcXCIsZnVuY3Rpb24oYSl7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pntjb25zdCBkPWEubXAkc3Vic2NyaXB0KGIpO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGMsXFxcIkx0XFxcIikmJnRoaXMubXAkYXNzX3N1YnNjcmlwdChiLGQpfSl9KSxuYiRpbnBsYWNlX29yOmNvdW50ZXJJbnBsYWNlU2xvdChcXFwifFxcXCIsZnVuY3Rpb24oYSl7YS4kaXRlbXMoKS5mb3JFYWNoKChbYSxiXSk9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYix0aGlzLm1wJHN1YnNjcmlwdChhKSxcXFwiR3RcXFwiKSYmdGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsYil9KX0pLG5iJHJlZmxlY3RlZF9hbmQ6bnVsbCxuYiRyZWZsZWN0ZWRfb3I6bnVsbCxuYiRyZWZsZWN0ZWRfYWRkOm51bGwsbmIkcmVmbGVjdGVkX3N1YnRyYWN0Om51bGx9LHByb3RvOntrZWVwJHBvc2l0aXZlKCl7cmV0dXJuIHRoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsdGhpcy4kemVybyxcXFwiTHRFXFxcIikmJnRoaXMubXAkYXNzX3N1YnNjcmlwdChhKX0pLHRoaXN9LCR6ZXJvOm5ldyBTay5idWlsdGluLmludF8oMCksJG9uZTpuZXcgU2suYnVpbHRpbi5pbnRfKDEpLHN0ciRpdGVtczpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIml0ZW1zXFxcIiksY291bnRlciR1cGRhdGUoYSxiKXtjb25zdCBjPWFbMF07aWYodm9pZCAwIT09YylpZighU2suYnVpbHRpbi5jaGVja01hcHBpbmcoYykpZm9yKGxldCBhPVNrLmFic3RyLml0ZXIoYyksYj1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWEudHAkaXRlcm5leHQoKSl7Y29uc3QgYT10aGlzLm1wJHN1YnNjcmlwdChiKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoYixTay5hYnN0ci5udW1iZXJCaW5PcChhLHRoaXMuJG9uZSxcXFwiQWRkXFxcIikpfWVsc2UgaWYoIXRoaXMuc3EkbGVuZ3RoKCkpdGhpcy51cGRhdGUkY29tbW9uKGEsdm9pZCAwLFxcXCJ1cGRhdGVcXFwiKTtlbHNlIGZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoYik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AoYSxjLm1wJHN1YnNjcmlwdChiKSxcXFwiQWRkXFxcIikpfWlmKGImJmIubGVuZ3RoKWlmKCF0aGlzLnNxJGxlbmd0aCgpKXRoaXMudXBkYXRlJGNvbW1vbihbXSxiLFxcXCJ1cGRhdGVcXFwiKTtlbHNlIGZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9Mil7Y29uc3QgYz1uZXcgU2suYnVpbHRpbi5zdHIoYlthXSksZD10aGlzLm1wJHN1YnNjcmlwdChjKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoYyxTay5hYnN0ci5udW1iZXJCaW5PcChkLGJbYSsxXSxcXFwiQWRkXFxcIikpfXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9fSxjbGFzc21ldGhvZHM6e2Zyb21rZXlzOnskbWV0aDpmdW5jdGlvbiBmcm9ta2V5cygpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNvdW50ZXIuZnJvbWtleXMoKSBpcyB1bmRlZmluZWQuICBVc2UgQ291bnRlcihpdGVyYWJsZSkgaW5zdGVhZC5cXFwiKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfX19fSk7Y29uc3QgYj1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIm9kaWN0X2l0ZXJhdG9yXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gb2RpY3RfaXRlcl8oYSl7dGhpcy4kaW5kZXg9MCx0aGlzLiRzZXE9YS5zayRhc2FycmF5KCksdGhpcy4kb3JpZz1hfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplLGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7YS5PcmRlcmVkRGljdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJPcmRlcmVkRGljdFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIE9yZGVyZWREaWN0KCl7cmV0dXJuIHRoaXMub3JkZXJlZGtleXM9W10sU2suYnVpbHRpbi5kaWN0LmNhbGwodGhpcyksdGhpc30sYmFzZTpTay5idWlsdGluLmRpY3Qsc2xvdHM6e3RwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaW5pdChhLGIpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiT3JkZXJlZERpY3RcXFwiLGEsMCwxKSxhLnVuc2hpZnQodGhpcykscmVzPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnVwZGF0ZSxhLGIpfSx0cCRkb2M6XFxcIkRpY3Rpb25hcnkgdGhhdCByZW1lbWJlcnMgaW5zZXJ0aW9uIG9yZGVyXFxcIiwkcigpe2xldCBhLGI7Y29uc3QgYz1bXTtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksZD1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZDtkPWIudHAkaXRlcm5leHQoKSlhPXRoaXMubXAkc3Vic2NyaXB0KGQpLHZvaWQgMD09PWEmJihhPW51bGwpLGMucHVzaChcXFwiKFxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihkKStcXFwiLCBcXFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXFxcIilcXFwiKTtyZXR1cm4gYj1jLmpvaW4oXFxcIiwgXFxcIiksMDxjLmxlbmd0aCYmKGI9XFxcIltcXFwiK2IrXFxcIl1cXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIk9yZGVyZWREaWN0KFxcXCIrYitcXFwiKVxcXCIpfSx0cCRyaWNoY29tcGFyZShiLGMpe2lmKFxcXCJFcVxcXCIhPWMmJlxcXCJOZVxcXCIhPWMpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGQ9XFxcIkVxXFxcIj09YztpZighKGIgaW5zdGFuY2VvZiBhLk9yZGVyZWREaWN0KSlyZXR1cm4gU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS50cCRyaWNoY29tcGFyZS5jYWxsKHRoaXMsYixjKTtjb25zdCBlPXRoaXMuc2l6ZSxmPWIuc2l6ZTtpZihlIT09ZilyZXR1cm4hZDtmb3IobGV0IGE9dGhpcy50cCRpdGVyKCksZT1iLnRwJGl0ZXIoKSxmPWEudHAkaXRlcm5leHQoKSxnPWUudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1mO2Y9YS50cCRpdGVybmV4dCgpLGc9ZS50cCRpdGVybmV4dCgpKXtpZighU2subWlzY2V2YWwuaXNUcnVlKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmLGcsXFxcIkVxXFxcIikpKXJldHVybiFkO2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoZiksYz1iLm1wJHN1YnNjcmlwdChnKTtpZighU2subWlzY2V2YWwuaXNUcnVlKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLGMsXFxcIkVxXFxcIikpKXJldHVybiFkfXJldHVybiBkfSxtcCRhc3Nfc3Vic2NyaXB0KGEsYil7aWYodm9pZCAwPT09Yil7Y29uc3QgYj10aGlzLnBvcCRpdGVtKGEpO2lmKHZvaWQgMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSl9ZWxzZSB0aGlzLnNldCRpdGVtKGEsYil9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGIodGhpcyl9fSxtZXRob2RzOntwb3A6eyRmbGFnczp7TmFtZWRBcmdzOltcXFwia2V5XFxcIixcXFwiZGVmYXVsdFxcXCJdLERlZmF1bHRzOltudWxsXX0sJG1ldGgoYSxiKXtyZXR1cm4gbnVsbD09PWI/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUucG9wLFt0aGlzLGFdKTpTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5wb3AsW3RoaXMsYSxiXSl9fSxwb3BpdGVtOnskZmxhZ3M6e05hbWVkQXJnczpbXFxcImxhc3RcXFwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ib29sLnRydWUkXX0sJG1ldGgoYSl7bGV0IGIsYztpZighdGhpcy5vcmRlcmVka2V5cy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoXFxcImRpY3Rpb25hcnkgaXMgZW1wdHlcXFwiKTtyZXR1cm4gYj10aGlzLm9yZGVyZWRrZXlzWzBdLFNrLm1pc2NldmFsLmlzVHJ1ZShhKSYmKGI9dGhpcy5vcmRlcmVka2V5c1t0aGlzLm9yZGVyZWRrZXlzLmxlbmd0aC0xXSksYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5wb3AsW3RoaXMsYl0pLG5ldyBTay5idWlsdGluLnR1cGxlKFtiLGNdKX19LG1vdmVfdG9fZW5kOnskZmxhZ3M6e05hbWVkQXJnczpbXFxcImtleVxcXCIsXFxcImxhc3RcXFwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ib29sLnRydWUkXX0sJG1ldGgoYSxiKXtsZXQgYyxkPS0xO2ZvcihsZXQgZT0wO2U8dGhpcy5vcmRlcmVka2V5cy5sZW5ndGg7ZSsrKWlmKGM9dGhpcy5vcmRlcmVka2V5c1tlXSxjPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiRXFcXFwiKSl7ZD1lO2JyZWFrfWlmKC0xIT09ZCl0aGlzLm9yZGVyZWRrZXlzLnNwbGljZShkLDEpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7cmV0dXJuIFNrLm1pc2NldmFsLmlzVHJ1ZShiKT90aGlzLm9yZGVyZWRrZXlzLnB1c2goYSk6dGhpcy5vcmRlcmVka2V5cy51bnNoaWZ0KGEpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fSxwcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLm9yZGVyZWRrZXlzLnNsaWNlKDApfSxzZXQkaXRlbShhLGIpe2NvbnN0IGM9dGhpcy5vcmRlcmVka2V5cy5pbmRleE9mKGEpOy0xPT1jJiZ0aGlzLm9yZGVyZWRrZXlzLnB1c2goYSksU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5zZXQkaXRlbS5jYWxsKHRoaXMsYSxiKX0scG9wJGl0ZW0oYSl7dmFyIGI9dGhpcy5vcmRlcmVka2V5cy5pbmRleE9mKGEpO2lmKC0xIT1iKXJldHVybiB0aGlzLm9yZGVyZWRrZXlzLnNwbGljZShiLDEpLFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUucG9wJGl0ZW0uY2FsbCh0aGlzLGEpfX19KSxhLmRlcXVlPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcImNvbGxlY3Rpb25zLmRlcXVlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZGVxdWUoYSxiLGMsZCxlKXt0aGlzLmhlYWQ9Y3x8MCx0aGlzLnRhaWw9ZHx8MCx0aGlzLm1hc2s9ZXx8MSx0aGlzLm1heGxlbj1iLHRoaXMudj1hfHxbLCxdfSxzbG90czp7dHAkZG9jOlxcXCJkZXF1ZShbaXRlcmFibGVbLCBtYXhsZW5dXSkgLS0+IGRlcXVlIG9iamVjdFxcXFxuXFxcXG5BIGxpc3QtbGlrZSBzZXF1ZW5jZSBvcHRpbWl6ZWQgZm9yIGRhdGEgYWNjZXNzZXMgbmVhciBpdHMgZW5kcG9pbnRzLlxcXCIsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxiKXtpZihbaXRlcmFibGUsbWF4bGVuXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiZGVxdWVcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJtYXhsZW5cXFwiXSxhLGIpLHZvaWQgMCE9PW1heGxlbiYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKG1heGxlbikpaWYobWF4bGVuPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChtYXhsZW4sU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yLFxcXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkXFxcIiksMD5tYXhsZW4pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF4bGVuIG11c3QgYmUgbm9uLW5lZ2F0aXZlXFxcIik7ZWxzZSB0aGlzLm1heGxlbj1tYXhsZW47dGhpcy4kY2xlYXIoKSx2b2lkIDAhPT1pdGVyYWJsZSYmdGhpcy4kZXh0ZW5kKGl0ZXJhYmxlKX0sdHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkcmljaGNvbXBhcmUoYixjKXt2YXIgZD1NYXRoLm1heDtpZih0aGlzPT09YiYmU2subWlzY2V2YWwub3BBbGxvd3NFcXVhbGl0eShjKSlyZXR1cm4hMDtpZighKGIgaW5zdGFuY2VvZiBhLmRlcXVlKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7Y29uc3QgZT1iLGY9dGhpcy52O2I9Yi52O2NvbnN0IGc9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2ssaD1lLnRhaWwtZS5oZWFkJmUubWFzaztsZXQgaixsPWQoZyxoKTtpZihnPT09aClmb3IobD0wO2w8ZyYmbDxoJiYoaj1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZlt0aGlzLmhlYWQrbCZ0aGlzLm1hc2tdLGJbZS5oZWFkK2wmZS5tYXNrXSxcXFwiRXFcXFwiKSwhIWopOysrbCk7aWYobD49Z3x8bD49aClzd2l0Y2goYyl7Y2FzZVxcXCJMdFxcXCI6cmV0dXJuIGc8aDtjYXNlXFxcIkx0RVxcXCI6cmV0dXJuIGc8PWg7Y2FzZVxcXCJFcVxcXCI6cmV0dXJuIGc9PT1oO2Nhc2VcXFwiTm90RXFcXFwiOnJldHVybiBnIT09aDtjYXNlXFxcIkd0XFxcIjpyZXR1cm4gZz5oO2Nhc2VcXFwiR3RFXFxcIjpyZXR1cm4gZz49aDt9cmV0dXJuXFxcIkVxXFxcIiE9PWMmJihcXFwiTm90RXFcXFwiPT09Y3x8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGZbdGhpcy5oZWFkK2wmdGhpcy5tYXNrXSxiW2UuaGVhZCtsJmUubWFza10sYykpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBjKHRoaXMpfSwkcigpe2NvbnN0IGE9W10sYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztpZih0aGlzLiRlbnRlcmVkX3JlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiWy4uLl1cXFwiKTt0aGlzLiRlbnRlcmVkX3JlcHI9ITA7Zm9yKGxldCBjPTA7YzxiO2MrKylhLnB1c2goU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnZbdGhpcy5oZWFkK2MmdGhpcy5tYXNrXSkpO2NvbnN0IGM9U2suYWJzdHIudHlwZU5hbWUodGhpcyk7cmV0dXJuIHZvaWQgMD09PXRoaXMubWF4bGVuPyh0aGlzLiRlbnRlcmVkX3JlcHI9dm9pZCAwLG5ldyBTay5idWlsdGluLnN0cihjK1xcXCIoW1xcXCIrYS5maWx0ZXIoQm9vbGVhbikuam9pbihcXFwiLCBcXFwiKStcXFwiXSlcXFwiKSk6bmV3IFNrLmJ1aWx0aW4uc3RyKGMrXFxcIihbXFxcIithLmZpbHRlcihCb29sZWFuKS5qb2luKFxcXCIsIFxcXCIpK1xcXCJdLCBtYXhsZW49XFxcIit0aGlzLm1heGxlbitcXFwiKVxcXCIpfSx0cCRhc19udW1iZXI6ITAsbmIkYm9vbCgpe3JldHVybiAwIT0odGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2spfSx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHNxJGNvbnRhaW5zKGEpe2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKWlmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkVxXFxcIikpcmV0dXJuITA7cmV0dXJuITF9LHNxJGNvbmNhdChiKXtpZighKGIgaW5zdGFuY2VvZiBhLmRlcXVlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImNhbiBvbmx5IGNvbmNhdGVuYXRlIGRlcXVlIChub3QgJ1xcXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXFxcIicpIHRvIGRlcXVlXFxcIik7Y29uc3QgYz10aGlzLiRjb3B5KCk7Zm9yKGxldCBhPWIudHAkaXRlcigpLGQ9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1hLnRwJGl0ZXJuZXh0KCkpYy4kcHVzaChkKTtyZXR1cm4gY30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrfSxzcSRyZXBlYXQoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhLFxcXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ3t0cCRuYW1lfSdcXFwiKTtjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrLGM9dGhpcy4kY29weSgpO2xldCBkOzA+PWEmJmMuJGNsZWFyKCk7Zm9yKGxldCBlPTE7ZTxhO2UrKylmb3IobGV0IGE9MDthPGI7YSsrKWQ9dGhpcy5oZWFkK2EmdGhpcy5tYXNrLGMuJHB1c2godGhpcy52W2RdKTtyZXR1cm4gY30sbXAkc3Vic2NyaXB0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSk7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztpZihhPj1ifHxhPC1iKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXFxcImRlcXVlIGluZGV4IG91dCBvZiByYW5nZVxcXCIpO2NvbnN0IGM9KDA8PWE/dGhpcy5oZWFkOnRoaXMudGFpbCkrYSZ0aGlzLm1hc2s7cmV0dXJuIHRoaXMudltjXX0sbXAkYXNzX3N1YnNjcmlwdChhLGIpe2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSk7Y29uc3QgYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztpZihhPj1jfHxhPC1jKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXFxcImRlcXVlIGluZGV4IG91dCBvZiByYW5nZVxcXCIpO3ZvaWQgMD09PWI/dGhpcy5kZWwkaXRlbShhKTp0aGlzLnNldCRpdGVtKGEsYil9LG5iJGlucGxhY2VfYWRkKGEpe2Zvcih0aGlzLm1heGxlbj12b2lkIDAsaXQ9U2suYWJzdHIuaXRlcihhKSxpPWl0LnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09aTtpPWl0LnRwJGl0ZXJuZXh0KCkpdGhpcy4kcHVzaChpKTtyZXR1cm4gdGhpc30sbmIkaW5wbGFjZV9tdWx0aXBseShhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixcXFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICd7dHAkbmFtZX0nXFxcIiksMD49YSYmdGhpcy4kY2xlYXIoKTtjb25zdCBiPXRoaXMuJGNvcHkoKSxjPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2ZvcihsZXQgZD0xO2Q8YTtkKyspZm9yKGxldCBhPTA7YTxjO2ErKyl7Y29uc3QgYz10aGlzLmhlYWQrYSZ0aGlzLm1hc2s7Yi4kcHVzaCh0aGlzLnZbY10pfXJldHVybiB0aGlzLnY9Yi52LHRoaXMuaGVhZD1iLmhlYWQsdGhpcy50YWlsPWIudGFpbCx0aGlzLm1hc2s9Yi5tYXNrLHRoaXN9fSxtZXRob2RzOnthcHBlbmQ6eyRtZXRoKGEpe3JldHVybiB0aGlzLiRwdXNoKGEpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiQWRkIGFuIGVsZW1lbnQgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRlcXVlLlxcXCJ9LGFwcGVuZGxlZnQ6eyRtZXRoKGEpe3JldHVybiB0aGlzLiRwdXNoTGVmdChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkFkZCBhbiBlbGVtZW50IHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGRlcXVlLlxcXCJ9LGNsZWFyOnskbWV0aCgpe3JldHVybiB0aGlzLiRjbGVhcigpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBkZXF1ZS5cXFwifSxfX2NvcHlfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS5cXFwifSxjb3B5OnskbWV0aCgpe3JldHVybiB0aGlzLiRjb3B5KCl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiBhIGRlcXVlLlxcXCJ9LGNvdW50OnskbWV0aChhKXtjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2xldCBjPTA7Zm9yKGxldCBkPTA7ZDxiO2QrKylTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W3RoaXMuaGVhZCtkJnRoaXMubWFza10sYSxcXFwiRXFcXFwiKSYmYysrO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELmNvdW50KHZhbHVlKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWVcXFwifSxleHRlbmQ6eyRtZXRoKGEpe3JldHVybiB0aGlzLiRleHRlbmQoYSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJFeHRlbmQgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRlcXVlIHdpdGggZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGVcXFwifSxleHRlbmRsZWZ0OnskbWV0aChhKXtmb3IoaXQ9U2suYWJzdHIuaXRlcihhKSxpPWl0LnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09aTtpPWl0LnRwJGl0ZXJuZXh0KCkpdGhpcy4kcHVzaExlZnQoaSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRXh0ZW5kIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGRlcXVlIHdpdGggZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGVcXFwifSxpbmRleDp7JG1ldGgoYSxiLGMpe2NvbnN0IGQ9dGhpcy4kaW5kZXgoYSxiLGMpO2lmKHZvaWQgMCE9PWQpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1xcXCIgaXMgbm90IGluIGRlcXVlXFxcIil9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELmluZGV4KHZhbHVlLCBbc3RhcnQsIFtzdG9wXV0pIC0+IGludGVnZXIgLS0gcmV0dXJuIGZpcnN0IGluZGV4IG9mIHZhbHVlLlxcXFxuUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlxcXCJ9LGluc2VydDp7JG1ldGgoYSxiKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXFxcImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCB7dHAkbmFtZX1cXFwiKTtjb25zdCBjPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2lmKHZvaWQgMCE9PXRoaXMubWF4bGVuJiZjPj10aGlzLm1heGxlbil0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJkZXF1ZSBhbHJlYWR5IGF0IGl0cyBtYXhpbXVtIHNpemVcXFwiKTthPmMmJihhPWMpLGE8PS1jJiYoYT0wKTtjb25zdCBkPSgwPD1hP3RoaXMuaGVhZDp0aGlzLnRhaWwpK2EmdGhpcy5tYXNrO2xldCBlPXRoaXMudGFpbDtmb3IodGhpcy50YWlsPXRoaXMudGFpbCsxJnRoaXMubWFzaztlIT09ZDspe2NvbnN0IGE9ZS0xJnRoaXMubWFzazt0aGlzLnZbZV09dGhpcy52W2FdLGU9YX1yZXR1cm4gdGhpcy52W2RdPWIsdGhpcy5oZWFkPT09dGhpcy50YWlsJiZ0aGlzLiRyZXNpemUodGhpcy52Lmxlbmd0aCx0aGlzLnYubGVuZ3RoPDwxKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELmluc2VydChpbmRleCwgb2JqZWN0KSAtLSBpbnNlcnQgb2JqZWN0IGJlZm9yZSBpbmRleFxcXCJ9LHBvcDp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kcG9wKCl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJlbW92ZSBhbmQgcmV0dXJuIHRoZSByaWdodG1vc3QgZWxlbWVudC5cXFwifSxwb3BsZWZ0OnskbWV0aCgpe3JldHVybiB0aGlzLiRwb3BMZWZ0KCl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJlbW92ZSBhbmQgcmV0dXJuIHRoZSBsZWZ0bW9zdCBlbGVtZW50LlxcXCJ9LHJlbW92ZTp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLiRpbmRleChhKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcXFwiIGlzIG5vdCBpbiBkZXF1ZVxcXCIpO2NvbnN0IGM9dGhpcy5oZWFkK2ImdGhpcy5tYXNrO2ZvcihsZXQgYj1jO2IhPT10aGlzLnRhaWw7KXtjb25zdCBhPWIrMSZ0aGlzLm1hc2s7dGhpcy52W2JdPXRoaXMudlthXSxiPWF9dGhpcy50YWlsPXRoaXMudGFpbC0xJnRoaXMubWFzazt2YXIgZD10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztkPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShkLHRoaXMudi5sZW5ndGg+Pj4xKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5yZW1vdmUodmFsdWUpIC0tIHJlbW92ZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHZhbHVlLlxcXCJ9LF9fcmV2ZXJzZWRfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IGQodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkQuX19yZXZlcnNlZF9fKCkgLS0gcmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBkZXF1ZVxcXCJ9LHJldmVyc2U6eyRtZXRoKCl7Y29uc3QgYz10aGlzLmhlYWQsZD10aGlzLnRhaWwsZT10aGlzLm1hc2ssZj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztmb3IobGV0IGc9MDtnPH5+KGYvMik7ZysrKXtjb25zdCBmPWQtZy0xJmUsYT1jK2cmZSxiPXRoaXMudltmXTt0aGlzLnZbZl09dGhpcy52W2FdLHRoaXMudlthXT1ifXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkQucmV2ZXJzZSgpIC0tIHJldmVyc2UgKklOIFBMQUNFKlxcXCJ9LHJvdGF0ZTp7JG1ldGgoYSl7YT12b2lkIDA9PT1hPzE6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtjb25zdCBjPXRoaXMuaGVhZCxkPXRoaXMudGFpbDtpZigwPT09YXx8Yz09PWQpcmV0dXJuIHRoaXM7aWYodGhpcy5oZWFkPWMtYSZ0aGlzLm1hc2ssdGhpcy50YWlsPWQtYSZ0aGlzLm1hc2ssMDxhKWZvcihsZXQgZT0xO2U8PWE7ZSsrKXtjb25zdCBmPWMtZSZ0aGlzLm1hc2ssYT1kLWUmdGhpcy5tYXNrO3RoaXMudltmXT10aGlzLnZbYV0sdGhpcy52W2FdPXZvaWQgMH1lbHNlIGZvcihsZXQgZT0wO2U+YTtlLS0pe2NvbnN0IGY9ZC1lJnRoaXMubWFzayxhPWMtZSZ0aGlzLm1hc2s7dGhpcy52W2ZdPXRoaXMudlthXSx0aGlzLnZbYV09dm9pZCAwfXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSb3RhdGUgdGhlIGRlcXVlIG4gc3RlcHMgdG8gdGhlIHJpZ2h0IChkZWZhdWx0IG49MSkuICBJZiBuIGlzIG5lZ2F0aXZlLCByb3RhdGVzIGxlZnQuXFxcIn19LGdldHNldHM6e21heGxlbjp7JGdldCgpe3JldHVybiB2b2lkIDA9PT10aGlzLm1heGxlbj9Tay5idWlsdGluLm5vbmUubm9uZSQ6bmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLm1heGxlbil9LCRkb2M6XFxcIm1heGltdW0gc2l6ZSBvZiBhIGRlcXVlIG9yIE5vbmUgaWYgdW5ib3VuZGVkXFxcIn19LHByb3RvOnskY2xlYXIoKXt0aGlzLmhlYWQ9MCx0aGlzLnRhaWw9MCx0aGlzLm1hc2s9MSx0aGlzLnY9WywsXX0sJGNvcHkoKXtyZXR1cm4gbmV3IGEuZGVxdWUodGhpcy52LnNsaWNlKDApLHRoaXMubWF4bGVuLHRoaXMuaGVhZCx0aGlzLnRhaWwsdGhpcy5tYXNrKX0sJGV4dGVuZChhKXtmb3IoaXQ9U2suYWJzdHIuaXRlcihhKSxpPWl0LnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09aTtpPWl0LnRwJGl0ZXJuZXh0KCkpdGhpcy4kcHVzaChpKX0sc2V0JGl0ZW0oYSxiKXtjb25zdCBjPSgwPD1hP3RoaXMuaGVhZDp0aGlzLnRhaWwpK2EmdGhpcy5tYXNrO3RoaXMudltjXT1ifSxkZWwkaXRlbShhKXtjb25zdCBiPSgwPD1hP3RoaXMuaGVhZDp0aGlzLnRhaWwpK2EmdGhpcy5tYXNrO2ZvcihsZXQgYz1iO2MhPT10aGlzLnRhaWw7KXtjb25zdCBhPWMrMSZ0aGlzLm1hc2s7dGhpcy52W2NdPXRoaXMudlthXSxjPWF9Y29uc3QgYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzazt0aGlzLnRhaWw9dGhpcy50YWlsLTEmdGhpcy5tYXNrLGM8dGhpcy5tYXNrPj4+MSYmdGhpcy4kcmVzaXplKGMsdGhpcy52Lmxlbmd0aD4+PjEpfSwkcHVzaChhKXt0aGlzLnZbdGhpcy50YWlsXT1hLHRoaXMudGFpbD10aGlzLnRhaWwrMSZ0aGlzLm1hc2ssdGhpcy5oZWFkPT09dGhpcy50YWlsJiZ0aGlzLiRyZXNpemUodGhpcy52Lmxlbmd0aCx0aGlzLnYubGVuZ3RoPDwxKTtjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO3JldHVybiB2b2lkIDAhPT10aGlzLm1heGxlbiYmYj50aGlzLm1heGxlbiYmdGhpcy4kcG9wTGVmdCgpLHRoaXN9LCRwdXNoTGVmdChhKXt0aGlzLmhlYWQ9dGhpcy5oZWFkLTEmdGhpcy5tYXNrLHRoaXMudlt0aGlzLmhlYWRdPWEsdGhpcy5oZWFkPT09dGhpcy50YWlsJiZ0aGlzLiRyZXNpemUodGhpcy52Lmxlbmd0aCx0aGlzLnYubGVuZ3RoPDwxKTtjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO3JldHVybiB2b2lkIDAhPT10aGlzLm1heGxlbiYmYj50aGlzLm1heGxlbiYmdGhpcy4kcG9wKCksdGhpc30sJHBvcCgpe2lmKHRoaXMuaGVhZD09PXRoaXMudGFpbCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJwb3AgZnJvbSBhbiBlbXB0eSBkZXF1ZVxcXCIpO3RoaXMudGFpbD10aGlzLnRhaWwtMSZ0aGlzLm1hc2s7Y29uc3QgYT10aGlzLnZbdGhpcy50YWlsXTt0aGlzLnZbdGhpcy50YWlsXT12b2lkIDA7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gYjx0aGlzLm1hc2s+Pj4xJiZ0aGlzLiRyZXNpemUoYix0aGlzLnYubGVuZ3RoPj4+MSksYX0sJHBvcExlZnQoKXtpZih0aGlzLmhlYWQ9PT10aGlzLnRhaWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwicG9wIGZyb20gYW4gZW1wdHkgZGVxdWVcXFwiKTtjb25zdCBhPXRoaXMudlt0aGlzLmhlYWRdO3RoaXMudlt0aGlzLmhlYWRdPXZvaWQgMCx0aGlzLmhlYWQ9dGhpcy5oZWFkKzEmdGhpcy5tYXNrO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7cmV0dXJuIGI8dGhpcy5tYXNrPj4+MSYmdGhpcy4kcmVzaXplKGIsdGhpcy52Lmxlbmd0aD4+PjEpLGF9LCRyZXNpemUoYSxiKXtjb25zdCBjPXRoaXMuaGVhZCxkPXRoaXMubWFzaztpZih0aGlzLmhlYWQ9MCx0aGlzLnRhaWw9YSx0aGlzLm1hc2s9Yi0xLDA9PT1jKXJldHVybiB2b2lkKHRoaXMudi5sZW5ndGg9Yik7Y29uc3QgZT1BcnJheShiKTtmb3IobGV0IGY9MDtmPGE7ZisrKWVbZl09dGhpcy52W2MrZiZkXTt0aGlzLnY9ZX0sJGluZGV4KGEsYixjKXtjb25zdCBkPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2I9dm9pZCAwPT09Yj8wOlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGIpLGM9Yz09PXZvaWQgMD9kOlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGMpO2NvbnN0IGU9dGhpcy5oZWFkLGY9dGhpcy5tYXNrLGc9dGhpcy52LGg9MDw9Yj9iOmI8LWQ/MDpkK2I7Yz0wPD1jP2M6YzwtZD8wOmQrYztmb3IobGV0IGQ9aDtkPGM7ZCsrKWlmKGdbZStkJmZdPT09YSlyZXR1cm4gZH0sc2skYXNhcnJheSgpe2NvbnN0IGE9W10sYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztmb3IobGV0IGM9MDtjPGI7KytjKXtjb25zdCBiPXRoaXMuaGVhZCtjJnRoaXMubWFzazthLnB1c2godGhpcy52W2JdKX1yZXR1cm4gYX19fSk7Y29uc3QgYz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIl9jb2xsZWN0aW9ucy5fZGVxdWVfaXRlcmF0b3JcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBfZGVxdWVfaXRlcmF0b3IoYSl7dGhpcy4kaW5kZXg9MCx0aGlzLmRxPWEudix0aGlzLiRsZW5ndGg9YS50YWlsLWEuaGVhZCZhLm1hc2ssdGhpcy4kaGVhZD1hLmhlYWQsdGhpcy4kdGFpbD1hLnRhaWwsdGhpcy4kbWFzaz1hLm1hc2t9LGl0ZXJuZXh0KCl7aWYoISh0aGlzLiRpbmRleD49dGhpcy4kbGVuZ3RoKSl7Y29uc3QgYT0oMDw9dGhpcy4kaW5kZXg/dGhpcy4kaGVhZDp0aGlzLiR0YWlsKSt0aGlzLiRpbmRleCZ0aGlzLiRtYXNrO3JldHVybiB0aGlzLiRpbmRleCsrLHRoaXMuZHFbYV19fSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186eyRtZXRoOmZ1bmN0aW9uIF9fbGVuZ3RoX2hpbnRfXygpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJGxlbmd0aC10aGlzLiRpbmRleCl9LCRmbGFnczp7Tm9BcmdzOiEwfX19fSksZD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIl9jb2xsZWN0aW9ucy5fZGVxdWVfcmV2ZXJzZV9pdGVyYXRvclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIF9kZXF1ZV9yZXZlcnNlX2l0ZXJhdG9yKGEpe3RoaXMuJGluZGV4PShhLnRhaWwtYS5oZWFkJmEubWFzayktMSx0aGlzLmRxPWEudix0aGlzLiRoZWFkPWEuaGVhZCx0aGlzLiRtYXNrPWEubWFza30saXRlcm5leHQoKXtpZighKDA+dGhpcy4kaW5kZXgpKXtjb25zdCBhPXRoaXMuJGhlYWQrdGhpcy4kaW5kZXgmdGhpcy4kbWFzaztyZXR1cm4gdGhpcy4kaW5kZXgtLSx0aGlzLmRxW2FdfX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmfX0pLGU9bmV3IFJlZ0V4cCgvXlswLTldLiovKSxmPW5ldyBSZWdFeHAoL15bMC05X10uKi8pLGc9bmV3IFJlZ0V4cCgvXlxcXFx3KiQvKSxoPS8sL2csaj0vXFxcXHMrLztyZXR1cm4gbmFtZWR0dXBsZS5jb19hcmdjb3VudD0yLG5hbWVkdHVwbGUuY29fa3dvbmx5YXJnY291bnQ9MyxuYW1lZHR1cGxlLiRrd2RlZnM9W1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQsU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0sbmFtZWR0dXBsZS5jb192YXJuYW1lcz1bXFxcInR5cGVuYW1lXFxcIixcXFwiZmllbGRfbmFtZXNcXFwiLFxcXCJyZW5hbWVcXFwiLFxcXCJkZWZhdWx0c1xcXCIsXFxcIm1vZHVsZVxcXCJdLGEubmFtZWR0dXBsZT1uZXcgU2suYnVpbHRpbi5mdW5jKG5hbWVkdHVwbGUpLGF9XCIsXCJzcmMvbGliL2NvbG9yc3lzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb2xvcnN5cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvbW1hbmRzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21tYW5kcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvbXBpbGVhbGwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbXBpbGVhbGwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb21waWxlci9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29tcGlsZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb25maWcvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbmZpZyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvbnRleHRsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbnRleHRsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb29raWVsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvb2tpZWxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvcHkucHlcIjpcIlxcXCJcXFwiXFxcIlxcblRoaXMgZmlsZSB3YXMgbW9kaWZpZWQgZnJvbSBDUHl0aG9uLlxcbkNvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCxcXG4yMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBBbGwgUmlnaHRzIFJlc2VydmVkXFxuXFxcIlxcXCJcXFwiXFxuaW1wb3J0IHR5cGVzXFxuY2xhc3MgRXJyb3IoRXhjZXB0aW9uKTpcXG4gICAgcGFzc1xcbmVycm9yID0gRXJyb3IgXFxuY2xhc3MgX0VtcHR5Q2xhc3M6XFxuICAgIHBhc3NcXG50cnk6XFxuICAgIGxvbmdcXG5leGNlcHQgTmFtZUVycm9yOlxcbiAgICBsb25nID0gaW50XFxuXFxuZGVmIGNvcHkoeCk6XFxuICAgIGNscyA9IHR5cGUoeClcXG4gICAgaWYgY2FsbGFibGUoeCk6XFxuICAgICAgICByZXR1cm4geFxcbiAgICBjb3BpZXIgPSBnZXRhdHRyKGNscywgXFxcIl9fY29weV9fXFxcIiwgTm9uZSlcXG4gICAgaWYgY29waWVyOlxcbiAgICAgICAgcmV0dXJuIGNvcGllcih4KVxcbiAgICBpZiBjbHMgaW4gKHR5cGUoTm9uZSksIGludCwgZmxvYXQsIGJvb2wsIHN0ciwgdHVwbGUsIHR5cGUsIGZyb3plbnNldCwgbG9uZyk6XFxuICAgICAgICByZXR1cm4geFxcbiAgICBpZiAoY2xzID09IGxpc3QpIG9yIChjbHMgPT0gZGljdCkgb3IgKGNscyA9PSBzZXQpIG9yIChjbHMgPT0gc2xpY2UpOlxcbiAgICAgICAgcmV0dXJuIGNscyh4KVxcbiAgICB0cnk6XFxuICAgICAgICBnZXRzdGF0ZSA9IGdldGF0dHIoeCwgXFxcIl9fZ2V0c3RhdGVfX1xcXCIsIE5vbmUpXFxuICAgICAgICBzZXRzdGF0ZSA9IGdldGF0dHIoeCwgXFxcIl9fc2V0c3RhdGVfX1xcXCIsIE5vbmUpXFxuICAgICAgICBpbml0YXJncyA9IGdldGF0dHIoeCwgXFxcIl9fZ2V0aW5pdGFyZ3NfX1xcXCIsIE5vbmUpXFxuICAgIGV4Y2VwdDpcXG4gICAgICAgIHJlZHVjdG9yID0gRmFsc2VcXG4gICAgaWYgZ2V0c3RhdGUgb3Igc2V0c3RhdGUgb3IgaW5pdGFyZ3M6XFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJTa3VscHQgZG9lcyBub3QgeWV0IHN1cHBvcnQgY29weWluZyB3aXRoIHVzZXItZGVmaW5lZCBfX2dldHN0YXRlX18sIF9fc2V0c3RhdGVfXyBvciBfX2dldGluaXRhcmdzX18oKVxcXCIpXFxuICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfZXhfX1xcXCIsIE5vbmUpXFxuICAgIGlmIHJlZHVjdG9yOlxcbiAgICAgICAgcnYgPSByZWR1Y3Rvcig0KVxcbiAgICBlbHNlOlxcbiAgICAgICAgcmVkdWN0b3IgPSBnZXRhdHRyKHgsIFxcXCJfX3JlZHVjZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIGlmIHJlZHVjdG9yOlxcbiAgICAgICAgICAgIHJ2ID0gcmVkdWN0b3IoKVxcbiAgICAgICAgZWxpZiBzdHIoY2xzKVsxOjZdID09IFxcXCJjbGFzc1xcXCI6XFxuICAgICAgICAgICAgY29waWVyID0gX2NvcHlfaW5zdFxcbiAgICAgICAgICAgIHJldHVybiBjb3BpZXIoeClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmFpc2UgRXJyb3IoXFxcInVuKHNoYWxsb3cpY29weWFibGUgb2JqZWN0IG9mIHR5cGUgJXNcXFwiICUgY2xzKVxcbiAgICBpZiBpc2luc3RhbmNlKHJ2LCBzdHIpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgcmV0dXJuIF9yZWNvbnN0cnVjdCh4LCBydiwgMClcXG5cXG5kZWYgX2NvcHlfaW5zdCh4KTpcXG4gICAgaWYgaGFzYXR0cih4LCAnX19jb3B5X18nKTpcXG4gICAgICAgIHJldHVybiB4Ll9fY29weV9fKClcXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRpbml0YXJnc19fJyk6XFxuICAgICAgICBhcmdzID0geC5fX2dldGluaXRhcmdzX18oKVxcbiAgICAgICAgeSA9IHguX19jbGFzc19fKCphcmdzKVxcbiAgICBlbHNlOlxcbiAgICAgICAgeSA9IF9FbXB0eUNsYXNzKClcXG4gICAgICAgIHkuX19jbGFzc19fID0geC5fX2NsYXNzX19cXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRzdGF0ZV9fJyk6XFxuICAgICAgICBzdGF0ZSA9IHguX19nZXRzdGF0ZV9fKClcXG4gICAgZWxzZTpcXG4gICAgICAgIHN0YXRlID0geC5fX2RpY3RfX1xcbiAgICBpZiBoYXNhdHRyKHksICdfX3NldHN0YXRlX18nKTpcXG4gICAgICAgIHkuX19zZXRzdGF0ZV9fKHN0YXRlKVxcbiAgICBlbHNlOlxcbiAgICAgICAgeS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpXFxuICAgIHJldHVybiB5XFxuXFxuZCA9IF9kZWVwY29weV9kaXNwYXRjaCA9IHt9XFxuXFxuZGVmIGRlZXBjb3B5KHgsIG1lbW89Tm9uZSwgX25pbD1bXSk6XFxuICAgIFxcXCJcXFwiXFxcIkRlZXAgY29weSBvcGVyYXRpb24gb24gYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLlxcbiAgICBTZWUgdGhlIG1vZHVsZSdzIF9fZG9jX18gc3RyaW5nIGZvciBtb3JlIGluZm8uXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBpZiBtZW1vIGlzIE5vbmU6XFxuICAgICAgICBtZW1vID0ge31cXG4gICAgaWR4ID0gaWQoeClcXG4gICAgeSA9IG1lbW8uZ2V0KGlkeCwgX25pbClcXG4gICAgaWYgeSBpcyBub3QgX25pbDpcXG4gICAgICAgIHJldHVybiB5XFxuICAgIGNscyA9IHR5cGUoeClcXG4gICAgdHJ5OlxcbiAgICAgICAgZ2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX2dldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgc2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX3NldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgaW5pdGFyZ3MgPSBnZXRhdHRyKHgsIFxcXCJfX2dldGluaXRhcmdzX19cXFwiLCBOb25lKVxcbiAgICBleGNlcHQ6XFxuICAgICAgICByZWR1Y3RvciA9IEZhbHNlXFxuICAgIGlmIGdldHN0YXRlIG9yIHNldHN0YXRlIG9yIGluaXRhcmdzOlxcbiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU2t1bHB0IGRvZXMgbm90IHlldCBzdXBwb3J0IGNvcHlpbmcgd2l0aCB1c2VyLWRlZmluZWQgX19nZXRzdGF0ZV9fLCBfX3NldHN0YXRlX18gb3IgX19nZXRpbml0YXJnc19fKClcXFwiKVxcbiAgICBjb3BpZXIgPSBfZGVlcGNvcHlfZGlzcGF0Y2guZ2V0KGNscylcXG4gICAgaWYgY29waWVyOlxcbiAgICAgICAgeSA9IGNvcGllcih4LCBtZW1vKVxcbiAgICBlbGlmIHN0cihjbHMpWzE6Nl0gPT0gXFxcImNsYXNzXFxcIjpcXG4gICAgICAgIGNvcGllciA9IF9kZWVwY29weV9kaXNwYXRjaFtcXFwiSW5zdGFuY2VUeXBlXFxcIl1cXG4gICAgICAgIHkgPSBjb3BpZXIoeCwgbWVtbylcXG4gICAgZWxzZTpcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBpc3NjID0gaXNzdWJjbGFzcyhjbHMsIHR5cGUpXFxuICAgICAgICBleGNlcHQgVHlwZUVycm9yOiAjIGNscyBpcyBub3QgYSBjbGFzcyAob2xkIEJvb3N0OyBzZWUgU0YgIzUwMjA4NSlcXG4gICAgICAgICAgICBpc3NjID0gMFxcbiAgICAgICAgaWYgaXNzYzpcXG4gICAgICAgICAgICB5ID0gX2RlZXBjb3B5X2F0b21pYyh4LCBtZW1vKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBjb3BpZXIgPSBnZXRhdHRyKHgsIFxcXCJfX2RlZXBjb3B5X19cXFwiLCBOb25lKVxcbiAgICAgICAgICAgIGlmIGNvcGllcjpcXG4gICAgICAgICAgICAgICAgeSA9IGNvcGllcihtZW1vKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfZXhfX1xcXCIsIE5vbmUpXFxuICAgICAgICAgICAgICAgIGlmIHJlZHVjdG9yOlxcbiAgICAgICAgICAgICAgICAgICAgcnYgPSByZWR1Y3RvcigyKVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgcmVkdWN0b3IgPSBnZXRhdHRyKHgsIFxcXCJfX3JlZHVjZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgICAgICAgICAgICAgIGlmIHJlZHVjdG9yOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gcmVkdWN0b3IoKVxcbiAgICAgICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvcihcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInVuKGRlZXApY29weWFibGUgb2JqZWN0IG9mIHR5cGUgJXNcXFwiICUgY2xzKVxcbiAgICAgICAgICAgICAgICB5ID0gX3JlY29uc3RydWN0KHgsIHJ2LCAxLCBtZW1vKVxcbiAgICBtZW1vW2lkeF0gPSB5XFxuICAgIF9rZWVwX2FsaXZlKHgsIG1lbW8pICMgTWFrZSBzdXJlIHggbGl2ZXMgYXQgbGVhc3QgYXMgbG9uZyBhcyBkXFxuICAgIHJldHVybiB5XFxuXFxuZGVmIF9kZWVwY29weV9hdG9taWMoeCwgbWVtbyk6XFxuICAgIHJldHVybiB4XFxuZFt0eXBlKE5vbmUpXSA9IF9kZWVwY29weV9hdG9taWNcXG4jIGRbdHlwZShFbGxpcHNpcyldID0gX2RlZXBjb3B5X2F0b21pY1xcbmRbdHlwZShOb3RJbXBsZW1lbnRlZCldID0gX2RlZXBjb3B5X2F0b21pY1xcbmRbaW50XSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2Zsb2F0XSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2Jvb2xdID0gX2RlZXBjb3B5X2F0b21pY1xcbmRbY29tcGxleF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW2J5dGVzXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW3N0cl0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyB0cnk6XFxuIyBkW3R5cGVzLkNvZGVUeXBlXSA9IF9kZWVwY29weV9hdG9taWNcXG4jIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjpcXG4jICAgcGFzc1xcbmRbdHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW3R5cGVzLkJ1aWx0aW5GdW5jdGlvblR5cGVdID0gX2RlZXBjb3B5X2F0b21pY1xcbmRbdHlwZXMuRnVuY3Rpb25UeXBlXSA9IF9kZWVwY29weV9hdG9taWNcXG4jIGRbd2Vha3JlZi5yZWZdID0gX2RlZXBjb3B5X2F0b21pY1xcblxcbmRlZiBfZGVlcGNvcHlfbGlzdCh4LCBtZW1vKTpcXG4gICAgeSA9IFtdXFxuICAgIG1lbW9baWQoeCldID0geVxcbiAgICBmb3IgYSBpbiB4OlxcbiAgICAgICAgeS5hcHBlbmQoZGVlcGNvcHkoYSwgbWVtbykpXFxuICAgIHJldHVybiB5XFxuZFtsaXN0XSA9IF9kZWVwY29weV9saXN0XFxuXFxuZGVmIF9kZWVwY29weV9zZXQoeCwgbWVtbyk6XFxuICAgIHJlc3VsdCA9IHNldChbXSkgICMgbWFrZSBlbXB0eSBzZXRcXG4gICAgbWVtb1tpZCh4KV0gPSByZXN1bHQgICMgcmVnaXN0ZXIgdGhpcyBzZXQgaW4gdGhlIG1lbW8gZm9yIGxvb3AgY2hlY2tpbmdcXG4gICAgZm9yIGEgaW4geDogICAjIGdvIHRocm91Z2ggZWxlbWVudHMgb2Ygc2V0XFxuICAgICAgICByZXN1bHQuYWRkKGRlZXBjb3B5KGEsIG1lbW8pKSAgIyBhZGQgdGhlIGNvcGllZCBlbGVtZW50cyBpbnRvIHRoZSBuZXcgc2V0XFxuICAgIHJldHVybiByZXN1bHQgIyByZXR1cm4gdGhlIG5ldyBzZXRcXG5kW3NldF0gPSBfZGVlcGNvcHlfc2V0XFxuXFxuZGVmIF9kZWVwY29weV9mcm96ZW5zZXQoeCwgbWVtbyk6XFxuICAgIHJlc3VsdCA9IGZyb3plbnNldChfZGVlcGNvcHlfc2V0KHgsbWVtbykpIFxcbiAgICBtZW1vW2lkKHgpXSA9IHJlc3VsdCBcXG4gICAgcmV0dXJuIHJlc3VsdFxcbmRbZnJvemVuc2V0XSA9IF9kZWVwY29weV9mcm96ZW5zZXRcXG5cXG5kZWYgX2RlZXBjb3B5X3R1cGxlKHgsIG1lbW8pOlxcbiAgICB5ID0gW2RlZXBjb3B5KGEsIG1lbW8pIGZvciBhIGluIHhdXFxuICAgICMgV2UncmUgbm90IGdvaW5nIHRvIHB1dCB0aGUgdHVwbGUgaW4gdGhlIG1lbW8sIGJ1dCBpdCdzIHN0aWxsIGltcG9ydGFudCB3ZVxcbiAgICAjIGNoZWNrIGZvciBpdCwgaW4gY2FzZSB0aGUgdHVwbGUgY29udGFpbnMgcmVjdXJzaXZlIG11dGFibGUgc3RydWN0dXJlcy5cXG4gICAgdHJ5OlxcbiAgICAgICAgcmV0dXJuIG1lbW9baWQoeCldXFxuICAgIGV4Y2VwdCBLZXlFcnJvcjpcXG4gICAgICAgIHBhc3NcXG4gICAgZm9yIGssIGogaW4gemlwKHgsIHkpOlxcbiAgICAgICAgaWYgayBpcyBub3QgajpcXG4gICAgICAgICAgICB5ID0gdHVwbGUoeSlcXG4gICAgICAgICAgICBicmVha1xcbiAgICBlbHNlOlxcbiAgICAgICAgeSA9IHhcXG4gICAgcmV0dXJuIHlcXG5kW3R1cGxlXSA9IF9kZWVwY29weV90dXBsZVxcblxcbmRlZiBfZGVlcGNvcHlfZGljdCh4LCBtZW1vKTpcXG4gICAgeSA9IHt9XFxuICAgIG1lbW9baWQoeCldID0geVxcbiAgICBmb3Iga2V5LCB2YWx1ZSBpbiB4Lml0ZW1zKCk6XFxuICAgICAgICB5W2RlZXBjb3B5KGtleSwgbWVtbyldID0gZGVlcGNvcHkodmFsdWUsIG1lbW8pXFxuICAgIHJldHVybiB5XFxuZFtkaWN0XSA9IF9kZWVwY29weV9kaWN0XFxuXFxuIyBkZWYgX2RlZXBjb3B5X21ldGhvZCh4LCBtZW1vKTogIyBDb3B5IGluc3RhbmNlIG1ldGhvZHNcXG4jICAgICB5ID0gdHlwZSh4KSh4LmltX2Z1bmMsIGRlZXBjb3B5KHguaW1fc2VsZiwgbWVtbyksIHguaW1fY2xhc3MpO1xcbiMgICAgIHJldHVybiB5XFxuZFt0eXBlcy5NZXRob2RUeXBlXSA9IF9kZWVwY29weV9hdG9taWNcXG5cXG5kZWYgX2RlZXBjb3B5X2luc3QoeCwgbWVtbyk6XFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZGVlcGNvcHlfXycpOlxcbiAgICAgICAgIHJldHVybiB4Ll9fZGVlcGNvcHlfXyhtZW1vKVxcbiAgICBpZiBoYXNhdHRyKHgsICdfX2dldGluaXRhcmdzX18nKTpcXG4gICAgICAgIGFyZ3MgPSB4Ll9fZ2V0aW5pdGFyZ3NfXygpXFxuICAgICAgICBhcmdzID0gZGVlcGNvcHkoYXJncywgbWVtbylcXG4gICAgICAgIHkgPSB4Ll9fY2xhc3NfXygqYXJncylcXG4gICAgZWxzZTpcXG4gICAgICAgIHkgPSBfRW1wdHlDbGFzcygpXFxuICAgICAgICB5Ll9fY2xhc3NfXyA9IHguX19jbGFzc19fXFxuICAgIG1lbW9baWQoeCldID0geVxcbiAgICBpZiBoYXNhdHRyKHgsICdfX2dldHN0YXRlX18nKTpcXG4gICAgICAgIHN0YXRlID0geC5fX2dldHN0YXRlX18oKVxcbiAgICBlbHNlOlxcbiAgICAgICAgc3RhdGUgPSB4Ll9fZGljdF9fXFxuICAgIHN0YXRlID0gZGVlcGNvcHkoc3RhdGUsIG1lbW8pXFxuICAgIGlmIGhhc2F0dHIoeSwgJ19fc2V0c3RhdGVfXycpOlxcbiAgICAgICAgeS5fX3NldHN0YXRlX18oc3RhdGUpXFxuICAgIGVsc2U6XFxuICAgICAgICB5Ll9fZGljdF9fLnVwZGF0ZShzdGF0ZSlcXG4gICAgICAgIHJldHVybiB5XFxuZFtcXFwiSW5zdGFuY2VUeXBlXFxcIl0gPSBfZGVlcGNvcHlfaW5zdFxcblxcbmRlZiBfa2VlcF9hbGl2ZSh4LCBtZW1vKTpcXG4gICAgXFxcIlxcXCJcXFwiS2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB4IGluIHRoZSBtZW1vLlxcbiAgICBCZWNhdXNlIHdlIHJlbWVtYmVyIG9iamVjdHMgYnkgdGhlaXIgaWQsIHdlIGhhdmVcXG4gICAgdG8gYXNzdXJlIHRoYXQgcG9zc2libHkgdGVtcG9yYXJ5IG9iamVjdHMgYXJlIGtlcHRcXG4gICAgYWxpdmUgYnkgcmVmZXJlbmNpbmcgdGhlbS5cXG4gICAgV2Ugc3RvcmUgYSByZWZlcmVuY2UgYXQgdGhlIGlkIG9mIHRoZSBtZW1vLCB3aGljaCBzaG91bGRcXG4gICAgbm9ybWFsbHkgbm90IGJlIHVzZWQgdW5sZXNzIHNvbWVvbmUgdHJpZXMgdG8gZGVlcGNvcHlcXG4gICAgdGhlIG1lbW8gaXRzZWxmLi4uXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICB0cnk6XFxuICAgICAgICBtZW1vW2lkKG1lbW8pXS5hcHBlbmQoeClcXG4gICAgZXhjZXB0IEtleUVycm9yOlxcbiAgICAgICAgIyBhaGEsIHRoaXMgaXMgdGhlIGZpcnN0IG9uZSA6LSlcXG4gICAgICAgIG1lbW9baWQobWVtbyldPVt4XVxcblxcbmRlZiBfcmVjb25zdHJ1Y3QoeCwgaW5mbywgZGVlcCwgbWVtbz1Ob25lKTpcXG4gICAgaWYgaXNpbnN0YW5jZShpbmZvLCBzdHIpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgYXNzZXJ0IGlzaW5zdGFuY2UoaW5mbywgdHVwbGUpXFxuICAgIGlmIG1lbW8gaXMgTm9uZTpcXG4gICAgICAgIG1lbW8gPSB7fVxcbiAgICBuID0gbGVuKGluZm8pXFxuICAgIGFzc2VydCBuIGluICgyLCAzLCA0LCA1KVxcbiAgICBjYWxsYWJsZSwgYXJncyA9IGluZm9bOjJdXFxuICAgIGlmIG4gPiAyOlxcbiAgICAgICAgc3RhdGUgPSBpbmZvWzJdXFxuICAgIGVsc2U6XFxuICAgICAgICBzdGF0ZSA9IE5vbmVcXG4gICAgaWYgbiA+IDM6XFxuICAgICAgICBsaXN0aXRlciA9IGluZm9bM11cXG4gICAgZWxzZTpcXG4gICAgICAgIGxpc3RpdGVyID0gTm9uZVxcbiAgICBpZiBuID4gNDpcXG4gICAgICAgIGRpY3RpdGVyID0gaW5mb1s0XVxcbiAgICBlbHNlOlxcbiAgICAgICAgZGljdGl0ZXIgPSBOb25lXFxuICAgIGlmIGRlZXA6XFxuICAgICAgICBhcmdzID0gZGVlcGNvcHkoYXJncywgbWVtbylcXG4gICAgeSA9IGNhbGxhYmxlKCphcmdzKVxcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG5cXG4gICAgaWYgc3RhdGUgaXMgbm90IE5vbmU6XFxuICAgICAgICBpZiBkZWVwOlxcbiAgICAgICAgICAgIHN0YXRlID0gZGVlcGNvcHkoc3RhdGUsIG1lbW8pXFxuICAgICAgICBpZiBoYXNhdHRyKHksICdfX3NldHN0YXRlX18nKTpcXG4gICAgICAgICAgICB5Ll9fc2V0c3RhdGVfXyhzdGF0ZSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzdGF0ZSwgdHVwbGUpIGFuZCBsZW4oc3RhdGUpID09IDI6XFxuICAgICAgICAgICAgICAgIHN0YXRlLCBzbG90c3RhdGUgPSBzdGF0ZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNsb3RzdGF0ZSA9IE5vbmVcXG4gICAgICAgICAgICBpZiBzdGF0ZSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgeS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpXFxuICAgICAgICAgICAgaWYgc2xvdHN0YXRlIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzbG90c3RhdGUuaXRlbXMoKTpcXG4gICAgICAgICAgICAgICAgICAgIHNldGF0dHIoeSwga2V5LCB2YWx1ZSlcXG5cXG4gICAgaWYgbGlzdGl0ZXIgaXMgbm90IE5vbmU6XFxuICAgICAgICBmb3IgaXRlbSBpbiBsaXN0aXRlcjpcXG4gICAgICAgICAgICBpZiBkZWVwOlxcbiAgICAgICAgICAgICAgICBpdGVtID0gZGVlcGNvcHkoaXRlbSwgbWVtbylcXG4gICAgICAgICAgICB5LmFwcGVuZChpdGVtKVxcbiAgICBpZiBkaWN0aXRlciBpcyBub3QgTm9uZTpcXG4gICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRpY3RpdGVyOlxcbiAgICAgICAgICAgIGlmIGRlZXA6XFxuICAgICAgICAgICAgICAgIGtleSA9IGRlZXBjb3B5KGtleSwgbWVtbylcXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBkZWVwY29weSh2YWx1ZSwgbWVtbylcXG4gICAgICAgICAgICB5W2tleV0gPSB2YWx1ZVxcbiAgICByZXR1cm4geVxcblxcbmRlbCBkXFxuXFxuZGVsIHR5cGVzXFxuXFxuIyBIZWxwZXIgZm9yIGluc3RhbmNlIGNyZWF0aW9uIHdpdGhvdXQgY2FsbGluZyBfX2luaXRfX1xcbmNsYXNzIF9FbXB0eUNsYXNzOlxcbiAgICBwYXNzXCIsXCJzcmMvbGliL2NvcHlfcmVnLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb3B5X3JlZyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Nzdi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY3N2IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY3R5cGVzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjdHlwZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jdHlwZXMvbWFjaG9saWIvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hY2hvbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY3Vyc2VzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjdXJzZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kYXRldGltZS5weVwiOlwiXFxcIlxcXCJcXFwiQ29uY3JldGUgZGF0ZS90aW1lIGFuZCByZWxhdGVkIHR5cGVzIC0tIHByb3RvdHlwZSBpbXBsZW1lbnRlZCBpbiBQeXRob24uXFxuXFxuU2VlIGh0dHA6Ly93d3cuem9wZS5vcmcvTWVtYmVycy9mZHJha2UvRGF0ZVRpbWVXaWtpL0Zyb250UGFnZVxcblxcblNlZSBhbHNvIGh0dHA6Ly9kaXIueWFob28uY29tL1JlZmVyZW5jZS9jYWxlbmRhcnMvXFxuXFxuRm9yIGEgcHJpbWVyIG9uIERTVCwgaW5jbHVkaW5nIG1hbnkgY3VycmVudCBEU1QgcnVsZXMsIHNlZVxcbmh0dHA6Ly93ZWJleGhpYml0cy5vcmcvZGF5bGlnaHRzYXZpbmcvXFxuXFxuRm9yIG1vcmUgYWJvdXQgRFNUIHRoYW4geW91IGV2ZXIgd2FudGVkIHRvIGtub3csIHNlZVxcbmZ0cDovL2Vsc2llLm5jaS5uaWguZ292L3B1Yi9cXG5cXG5Tb3VyY2VzIGZvciB0aW1lIHpvbmUgYW5kIERTVCBkYXRhOiBodHRwOi8vd3d3LnR3aW5zdW4uY29tL3R6L3R6LWxpbmsuaHRtXFxuXFxuVGhpcyB3YXMgb3JpZ2luYWxseSBjb3BpZWQgZnJvbSB0aGUgc2FuZGJveCBvZiB0aGUgQ1B5dGhvbiBDVlMgcmVwb3NpdG9yeS5cXG5UaGFua3MgdG8gVGltIFBldGVycyBmb3Igc3VnZ2VzdGluZyB1c2luZyBpdC5cXG5cXG5UaGlzIHdhcyB0aGVuIGNvcGllZCBmcm9tIFB5UHkgdjUuMS4wIGludG8gU2t1bHB0IGJ5IE1lcmVkeWRkIEx1ZmYsIHJlbW92aW5nXFxuJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24nIChhbmQgcmVwbGFjaW5nIGRpdmlzaW9uIG9wZXJhdG9ycyBhY2NvcmRpbmdseSlcXG5hbmQgcGlja2xlIHN1cHBvcnQgKHdoaWNoIHJlcXVpcmVzICdzdHJ1Y3QnLCB3aGljaCBTa3VscHQgZG9lcyBub3QgY3VycmVudGx5XFxuW2FzIG9mIDMxLzgvMjAxNl0gaGF2ZSlcXG5cXFwiXFxcIlxcXCJcXG5cXG5pbXBvcnQgdGltZSBhcyBfdGltZVxcbmltcG9ydCBtYXRoIGFzIF9tYXRoXFxuXFxuIyBQeXRob24gMi12cy0zIGNvbXBhdCBoYWNrXFxuaW1wb3J0IHN5c1xcbnVuaWNvZGUgPSB1bmljb2RlIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywpIGVsc2Ugc3RyXFxuXFxuX1NFTlRJTkVMID0gb2JqZWN0KClcXG5cXG5kZWYgX2NtcCh4LCB5KTpcXG4gICAgcmV0dXJuIDAgaWYgeCA9PSB5IGVsc2UgMSBpZiB4ID4geSBlbHNlIC0xXFxuXFxuZGVmIF9yb3VuZCh4KTpcXG4gICAgcmV0dXJuIGludChfbWF0aC5mbG9vcih4ICsgMC41KSBpZiB4ID49IDAuMCBlbHNlIF9tYXRoLmNlaWwoeCAtIDAuNSkpXFxuXFxuTUlOWUVBUiA9IDFcXG5NQVhZRUFSID0gOTk5OVxcbl9NSU5ZRUFSRk1UID0gMTkwMFxcblxcbl9NQVhfREVMVEFfREFZUyA9IDk5OTk5OTk5OVxcblxcbiMgVXRpbGl0eSBmdW5jdGlvbnMsIGFkYXB0ZWQgZnJvbSBQeXRob24ncyBEZW1vL2NsYXNzZXMvRGF0ZXMucHksIHdoaWNoXFxuIyBhbHNvIGFzc3VtZXMgdGhlIGN1cnJlbnQgR3JlZ29yaWFuIGNhbGVuZGFyIGluZGVmaW5pdGVseSBleHRlbmRlZCBpblxcbiMgYm90aCBkaXJlY3Rpb25zLiAgRGlmZmVyZW5jZTogIERhdGVzLnB5IGNhbGxzIEphbnVhcnkgMSBvZiB5ZWFyIDAgZGF5XFxuIyBudW1iZXIgMS4gIFRoZSBjb2RlIGhlcmUgY2FsbHMgSmFudWFyeSAxIG9mIHllYXIgMSBkYXkgbnVtYmVyIDEuICBUaGlzIGlzXFxuIyB0byBtYXRjaCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgXFxcInByb2xlcHRpYyBHcmVnb3JpYW5cXFwiIGNhbGVuZGFyIGluIERlcnNob3dpdHpcXG4jIGFuZCBSZWluZ29sZCdzIFxcXCJDYWxlbmRyaWNhbCBDYWxjdWxhdGlvbnNcXFwiLCB3aGVyZSBpdCdzIHRoZSBiYXNlIGNhbGVuZGFyXFxuIyBmb3IgYWxsIGNvbXB1dGF0aW9ucy4gIFNlZSB0aGUgYm9vayBmb3IgYWxnb3JpdGhtcyBmb3IgY29udmVydGluZyBiZXR3ZWVuXFxuIyBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWxzIGFuZCBtYW55IG90aGVyIGNhbGVuZGFyIHN5c3RlbXMuXFxuXFxuX0RBWVNfSU5fTU9OVEggPSBbLTEsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdXFxuXFxuX0RBWVNfQkVGT1JFX01PTlRIID0gWy0xXVxcbmRibSA9IDBcXG5mb3IgZGltIGluIF9EQVlTX0lOX01PTlRIWzE6XTpcXG4gICAgX0RBWVNfQkVGT1JFX01PTlRILmFwcGVuZChkYm0pXFxuICAgIGRibSArPSBkaW1cXG5kZWwgZGJtLCBkaW1cXG5cXG5kZWYgX2lzX2xlYXAoeWVhcik6XFxuICAgIFxcXCJ5ZWFyIC0+IDEgaWYgbGVhcCB5ZWFyLCBlbHNlIDAuXFxcIlxcbiAgICByZXR1cm4geWVhciAlIDQgPT0gMCBhbmQgKHllYXIgJSAxMDAgIT0gMCBvciB5ZWFyICUgNDAwID09IDApXFxuXFxuZGVmIF9kYXlzX2JlZm9yZV95ZWFyKHllYXIpOlxcbiAgICBcXFwieWVhciAtPiBudW1iZXIgb2YgZGF5cyBiZWZvcmUgSmFudWFyeSAxc3Qgb2YgeWVhci5cXFwiXFxuICAgIHkgPSB5ZWFyIC0gMVxcbiAgICByZXR1cm4geSozNjUgKyB5Ly80IC0geS8vMTAwICsgeS8vNDAwXFxuXFxuZGVmIF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKTpcXG4gICAgXFxcInllYXIsIG1vbnRoIC0+IG51bWJlciBvZiBkYXlzIGluIHRoYXQgbW9udGggaW4gdGhhdCB5ZWFyLlxcXCJcXG4gICAgYXNzZXJ0IDEgPD0gbW9udGggPD0gMTIsIG1vbnRoXFxuICAgIGlmIG1vbnRoID09IDIgYW5kIF9pc19sZWFwKHllYXIpOlxcbiAgICAgICAgcmV0dXJuIDI5XFxuICAgIHJldHVybiBfREFZU19JTl9NT05USFttb250aF1cXG5cXG5kZWYgX2RheXNfYmVmb3JlX21vbnRoKHllYXIsIG1vbnRoKTpcXG4gICAgXFxcInllYXIsIG1vbnRoIC0+IG51bWJlciBvZiBkYXlzIGluIHllYXIgcHJlY2VkaW5nIGZpcnN0IGRheSBvZiBtb250aC5cXFwiXFxuICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyLCAnbW9udGggbXVzdCBiZSBpbiAxLi4xMidcXG4gICAgcmV0dXJuIF9EQVlTX0JFRk9SRV9NT05USFttb250aF0gKyAobW9udGggPiAyIGFuZCBfaXNfbGVhcCh5ZWFyKSlcXG5cXG5kZWYgX3ltZDJvcmQoeWVhciwgbW9udGgsIGRheSk6XFxuICAgIFxcXCJ5ZWFyLCBtb250aCwgZGF5IC0+IG9yZGluYWwsIGNvbnNpZGVyaW5nIDAxLUphbi0wMDAxIGFzIGRheSAxLlxcXCJcXG4gICAgYXNzZXJ0IDEgPD0gbW9udGggPD0gMTIsICdtb250aCBtdXN0IGJlIGluIDEuLjEyJ1xcbiAgICBkaW0gPSBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aClcXG4gICAgYXNzZXJ0IDEgPD0gZGF5IDw9IGRpbSwgKCdkYXkgbXVzdCBiZSBpbiAxLi4lZCcgJSBkaW0pXFxuICAgIHJldHVybiAoX2RheXNfYmVmb3JlX3llYXIoeWVhcikgK1xcbiAgICAgICAgICAgIF9kYXlzX2JlZm9yZV9tb250aCh5ZWFyLCBtb250aCkgK1xcbiAgICAgICAgICAgIGRheSlcXG5cXG5fREk0MDBZID0gX2RheXNfYmVmb3JlX3llYXIoNDAxKSAgICAjIG51bWJlciBvZiBkYXlzIGluIDQwMCB5ZWFyc1xcbl9ESTEwMFkgPSBfZGF5c19iZWZvcmVfeWVhcigxMDEpICAgICMgICAgXFxcIiAgICBcXFwiICAgXFxcIiAgIFxcXCIgMTAwICAgXFxcIlxcbl9ESTRZICAgPSBfZGF5c19iZWZvcmVfeWVhcig1KSAgICAgICMgICAgXFxcIiAgICBcXFwiICAgXFxcIiAgIFxcXCIgICA0ICAgXFxcIlxcblxcbiMgQSA0LXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkIGdldCBmcm9tIHBhc3RpbmdcXG4jIHRvZ2V0aGVyIDQgc2luZ2xlIHllYXJzLlxcbmFzc2VydCBfREk0WSA9PSA0ICogMzY1ICsgMVxcblxcbiMgU2ltaWxhcmx5LCBhIDQwMC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZCBnZXQgZnJvbVxcbiMgcGFzdGluZyB0b2dldGhlciA0IDEwMC15ZWFyIGN5Y2xlcy5cXG5hc3NlcnQgX0RJNDAwWSA9PSA0ICogX0RJMTAwWSArIDFcXG5cXG4jIE9UT0gsIGEgMTAwLXllYXIgY3ljbGUgaGFzIG9uZSBmZXdlciBsZWFwIGRheSB0aGFuIHdlJ2QgZ2V0IGZyb21cXG4jIHBhc3RpbmcgdG9nZXRoZXIgMjUgNC15ZWFyIGN5Y2xlcy5cXG5hc3NlcnQgX0RJMTAwWSA9PSAyNSAqIF9ESTRZIC0gMVxcblxcbl9VU19QRVJfVVMgPSAxXFxuX1VTX1BFUl9NUyA9IDEwMDBcXG5fVVNfUEVSX1NFQ09ORCA9IDEwMDAwMDBcXG5fVVNfUEVSX01JTlVURSA9IDYwMDAwMDAwXFxuX1NFQ09ORFNfUEVSX0RBWSA9IDI0ICogMzYwMFxcbl9VU19QRVJfSE9VUiA9IDM2MDAwMDAwMDBcXG5fVVNfUEVSX0RBWSA9IDg2NDAwMDAwMDAwXFxuX1VTX1BFUl9XRUVLID0gNjA0ODAwMDAwMDAwXFxuXFxuZGVmIF9vcmQyeW1kKG4pOlxcbiAgICBcXFwib3JkaW5hbCAtPiAoeWVhciwgbW9udGgsIGRheSksIGNvbnNpZGVyaW5nIDAxLUphbi0wMDAxIGFzIGRheSAxLlxcXCJcXG5cXG4gICAgIyBuIGlzIGEgMS1iYXNlZCBpbmRleCwgc3RhcnRpbmcgYXQgMS1KYW4tMS4gIFRoZSBwYXR0ZXJuIG9mIGxlYXAgeWVhcnNcXG4gICAgIyByZXBlYXRzIGV4YWN0bHkgZXZlcnkgNDAwIHllYXJzLiAgVGhlIGJhc2ljIHN0cmF0ZWd5IGlzIHRvIGZpbmQgdGhlXFxuICAgICMgY2xvc2VzdCA0MDAteWVhciBib3VuZGFyeSBhdCBvciBiZWZvcmUgbiwgdGhlbiB3b3JrIHdpdGggdGhlIG9mZnNldFxcbiAgICAjIGZyb20gdGhhdCBib3VuZGFyeSB0byBuLiAgTGlmZSBpcyBtdWNoIGNsZWFyZXIgaWYgd2Ugc3VidHJhY3QgMSBmcm9tXFxuICAgICMgbiBmaXJzdCAtLSB0aGVuIHRoZSB2YWx1ZXMgb2YgbiBhdCA0MDAteWVhciBib3VuZGFyaWVzIGFyZSBleGFjdGx5XFxuICAgICMgdGhvc2UgZGl2aXNpYmxlIGJ5IF9ESTQwMFk6XFxuICAgICNcXG4gICAgIyAgICAgRCAgTSAgIFkgICAgICAgICAgICBuICAgICAgICAgICAgICBuLTFcXG4gICAgIyAgICAgLS0gLS0tIC0tLS0gICAgICAgIC0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS1cXG4gICAgIyAgICAgMzEgRGVjIC00MDAgICAgICAgIC1fREk0MDBZICAgICAgIC1fREk0MDBZIC0xXFxuICAgICMgICAgICAxIEphbiAtMzk5ICAgICAgICAgLV9ESTQwMFkgKzEgICAtX0RJNDAwWSAgICAgIDQwMC15ZWFyIGJvdW5kYXJ5XFxuICAgICMgICAgIC4uLlxcbiAgICAjICAgICAzMCBEZWMgIDAwMCAgICAgICAgLTEgICAgICAgICAgICAgLTJcXG4gICAgIyAgICAgMzEgRGVjICAwMDAgICAgICAgICAwICAgICAgICAgICAgIC0xXFxuICAgICMgICAgICAxIEphbiAgMDAxICAgICAgICAgMSAgICAgICAgICAgICAgMCAgICAgICAgICAgIDQwMC15ZWFyIGJvdW5kYXJ5XFxuICAgICMgICAgICAyIEphbiAgMDAxICAgICAgICAgMiAgICAgICAgICAgICAgMVxcbiAgICAjICAgICAgMyBKYW4gIDAwMSAgICAgICAgIDMgICAgICAgICAgICAgIDJcXG4gICAgIyAgICAgLi4uXFxuICAgICMgICAgIDMxIERlYyAgNDAwICAgICAgICAgX0RJNDAwWSAgICAgICAgX0RJNDAwWSAtMVxcbiAgICAjICAgICAgMSBKYW4gIDQwMSAgICAgICAgIF9ESTQwMFkgKzEgICAgIF9ESTQwMFkgICAgICA0MDAteWVhciBib3VuZGFyeVxcbiAgICBuIC09IDFcXG4gICAgbjQwMCwgbiA9IGRpdm1vZChuLCBfREk0MDBZKVxcbiAgICB5ZWFyID0gbjQwMCAqIDQwMCArIDEgICAjIC4uLiwgLTM5OSwgMSwgNDAxLCAuLi5cXG5cXG4gICAgIyBOb3cgbiBpcyB0aGUgKG5vbi1uZWdhdGl2ZSkgb2Zmc2V0LCBpbiBkYXlzLCBmcm9tIEphbnVhcnkgMSBvZiB5ZWFyLCB0b1xcbiAgICAjIHRoZSBkZXNpcmVkIGRhdGUuICBOb3cgY29tcHV0ZSBob3cgbWFueSAxMDAteWVhciBjeWNsZXMgcHJlY2VkZSBuLlxcbiAgICAjIE5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvciBuMTAwIHRvIGVxdWFsIDQhICBJbiB0aGF0IGNhc2UgNCBmdWxsXFxuICAgICMgMTAwLXllYXIgY3ljbGVzIHByZWNlZGUgdGhlIGRlc2lyZWQgZGF5LCB3aGljaCBpbXBsaWVzIHRoZSBkZXNpcmVkXFxuICAgICMgZGF5IGlzIERlY2VtYmVyIDMxIGF0IHRoZSBlbmQgb2YgYSA0MDAteWVhciBjeWNsZS5cXG4gICAgbjEwMCwgbiA9IGRpdm1vZChuLCBfREkxMDBZKVxcblxcbiAgICAjIE5vdyBjb21wdXRlIGhvdyBtYW55IDQteWVhciBjeWNsZXMgcHJlY2VkZSBpdC5cXG4gICAgbjQsIG4gPSBkaXZtb2QobiwgX0RJNFkpXFxuXFxuICAgICMgQW5kIG5vdyBob3cgbWFueSBzaW5nbGUgeWVhcnMuICBBZ2FpbiBuMSBjYW4gYmUgNCwgYW5kIGFnYWluIG1lYW5pbmdcXG4gICAgIyB0aGF0IHRoZSBkZXNpcmVkIGRheSBpcyBEZWNlbWJlciAzMSBhdCB0aGUgZW5kIG9mIHRoZSA0LXllYXIgY3ljbGUuXFxuICAgIG4xLCBuID0gZGl2bW9kKG4sIDM2NSlcXG5cXG4gICAgeWVhciArPSBuMTAwICogMTAwICsgbjQgKiA0ICsgbjFcXG4gICAgaWYgbjEgPT0gNCBvciBuMTAwID09IDQ6XFxuICAgICAgICBhc3NlcnQgbiA9PSAwXFxuICAgICAgICByZXR1cm4geWVhci0xLCAxMiwgMzFcXG5cXG4gICAgIyBOb3cgdGhlIHllYXIgaXMgY29ycmVjdCwgYW5kIG4gaXMgdGhlIG9mZnNldCBmcm9tIEphbnVhcnkgMS4gIFdlIGZpbmRcXG4gICAgIyB0aGUgbW9udGggdmlhIGFuIGVzdGltYXRlIHRoYXQncyBlaXRoZXIgZXhhY3Qgb3Igb25lIHRvbyBsYXJnZS5cXG4gICAgbGVhcHllYXIgPSBuMSA9PSAzIGFuZCAobjQgIT0gMjQgb3IgbjEwMCA9PSAzKVxcbiAgICBhc3NlcnQgbGVhcHllYXIgPT0gX2lzX2xlYXAoeWVhcilcXG4gICAgbW9udGggPSAobiArIDUwKSA+PiA1XFxuICAgIHByZWNlZGluZyA9IF9EQVlTX0JFRk9SRV9NT05USFttb250aF0gKyAobW9udGggPiAyIGFuZCBsZWFweWVhcilcXG4gICAgaWYgcHJlY2VkaW5nID4gbjogICMgZXN0aW1hdGUgaXMgdG9vIGxhcmdlXFxuICAgICAgICBtb250aCAtPSAxXFxuICAgICAgICBwcmVjZWRpbmcgLT0gX0RBWVNfSU5fTU9OVEhbbW9udGhdICsgKG1vbnRoID09IDIgYW5kIGxlYXB5ZWFyKVxcbiAgICBuIC09IHByZWNlZGluZ1xcbiAgICBhc3NlcnQgMCA8PSBuIDwgX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuXFxuICAgICMgTm93IHRoZSB5ZWFyIGFuZCBtb250aCBhcmUgY29ycmVjdCwgYW5kIG4gaXMgdGhlIG9mZnNldCBmcm9tIHRoZVxcbiAgICAjIHN0YXJ0IG9mIHRoYXQgbW9udGg6ICB3ZSdyZSBkb25lIVxcbiAgICByZXR1cm4geWVhciwgbW9udGgsIG4rMVxcblxcbiMgTW9udGggYW5kIGRheSBuYW1lcy4gIEZvciBsb2NhbGl6ZWQgdmVyc2lvbnMsIHNlZSB0aGUgY2FsZW5kYXIgbW9kdWxlLlxcbl9NT05USE5BTUVTID0gW05vbmUsIFxcXCJKYW5cXFwiLCBcXFwiRmViXFxcIiwgXFxcIk1hclxcXCIsIFxcXCJBcHJcXFwiLCBcXFwiTWF5XFxcIiwgXFxcIkp1blxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgXFxcIkp1bFxcXCIsIFxcXCJBdWdcXFwiLCBcXFwiU2VwXFxcIiwgXFxcIk9jdFxcXCIsIFxcXCJOb3ZcXFwiLCBcXFwiRGVjXFxcIl1cXG5fREFZTkFNRVMgPSBbTm9uZSwgXFxcIk1vblxcXCIsIFxcXCJUdWVcXFwiLCBcXFwiV2VkXFxcIiwgXFxcIlRodVxcXCIsIFxcXCJGcmlcXFwiLCBcXFwiU2F0XFxcIiwgXFxcIlN1blxcXCJdXFxuXFxuXFxuZGVmIF9idWlsZF9zdHJ1Y3RfdGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCBkc3RmbGFnKTpcXG4gICAgd2RheSA9IChfeW1kMm9yZCh5LCBtLCBkKSArIDYpICUgN1xcbiAgICBkbnVtID0gX2RheXNfYmVmb3JlX21vbnRoKHksIG0pICsgZFxcbiAgICByZXR1cm4gX3RpbWUuc3RydWN0X3RpbWUoKHksIG0sIGQsIGhoLCBtbSwgc3MsIHdkYXksIGRudW0sIGRzdGZsYWcpKVxcblxcbmRlZiBfZm9ybWF0X3RpbWUoaGgsIG1tLCBzcywgdXMpOlxcbiAgICAjIFNraXAgdHJhaWxpbmcgbWljcm9zZWNvbmRzIHdoZW4gdXM9PTAuXFxuICAgIHJlc3VsdCA9IFxcXCIlMDJkOiUwMmQ6JTAyZFxcXCIgJSAoaGgsIG1tLCBzcylcXG4gICAgaWYgdXM6XFxuICAgICAgICByZXN1bHQgKz0gXFxcIi4lMDZkXFxcIiAlIHVzXFxuICAgIHJldHVybiByZXN1bHRcXG5cXG4jIENvcnJlY3RseSBzdWJzdGl0dXRlIGZvciAleiBhbmQgJVogZXNjYXBlcyBpbiBzdHJmdGltZSBmb3JtYXRzLlxcbmRlZiBfd3JhcF9zdHJmdGltZShvYmplY3QsIGZvcm1hdCwgdGltZXR1cGxlKTpcXG4gICAgeWVhciA9IHRpbWV0dXBsZVswXVxcbiAgICBpZiB5ZWFyIDwgX01JTllFQVJGTVQ6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJ5ZWFyPSVkIGlzIGJlZm9yZSAlZDsgdGhlIGRhdGV0aW1lIHN0cmZ0aW1lKCkgXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXFwibWV0aG9kcyByZXF1aXJlIHllYXIgPj0gJWRcXFwiICVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgKHllYXIsIF9NSU5ZRUFSRk1ULCBfTUlOWUVBUkZNVCkpXFxuICAgICMgRG9uJ3QgY2FsbCB1dGNvZmZzZXQoKSBvciB0em5hbWUoKSB1bmxlc3MgYWN0dWFsbHkgbmVlZGVkLlxcbiAgICBmcmVwbGFjZSA9IE5vbmUgICMgdGhlIHN0cmluZyB0byB1c2UgZm9yICVmXFxuICAgIHpyZXBsYWNlID0gTm9uZSAgIyB0aGUgc3RyaW5nIHRvIHVzZSBmb3IgJXpcXG4gICAgWnJlcGxhY2UgPSBOb25lICAjIHRoZSBzdHJpbmcgdG8gdXNlIGZvciAlWlxcblxcbiAgICAjIFNjYW4gZm9ybWF0IGZvciAleiBhbmQgJVogZXNjYXBlcywgcmVwbGFjaW5nIGFzIG5lZWRlZC5cXG4gICAgbmV3Zm9ybWF0ID0gW11cXG4gICAgcHVzaCA9IG5ld2Zvcm1hdC5hcHBlbmRcXG4gICAgaSwgbiA9IDAsIGxlbihmb3JtYXQpXFxuICAgIHdoaWxlIGkgPCBuOlxcbiAgICAgICAgY2ggPSBmb3JtYXRbaV1cXG4gICAgICAgIGkgKz0gMVxcbiAgICAgICAgaWYgY2ggPT0gJyUnOlxcbiAgICAgICAgICAgIGlmIGkgPCBuOlxcbiAgICAgICAgICAgICAgICBjaCA9IGZvcm1hdFtpXVxcbiAgICAgICAgICAgICAgICBpICs9IDFcXG4gICAgICAgICAgICAgICAgaWYgY2ggPT0gJ2YnOlxcbiAgICAgICAgICAgICAgICAgICAgaWYgZnJlcGxhY2UgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmVwbGFjZSA9ICclMDZkJyAlIGdldGF0dHIob2JqZWN0LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWljcm9zZWNvbmQnLCAwKVxcbiAgICAgICAgICAgICAgICAgICAgbmV3Zm9ybWF0LmFwcGVuZChmcmVwbGFjZSlcXG4gICAgICAgICAgICAgICAgZWxpZiBjaCA9PSAneic6XFxuICAgICAgICAgICAgICAgICAgICBpZiB6cmVwbGFjZSBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHpyZXBsYWNlID0gXFxcIlxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgXFxcIl91dGNvZmZzZXRcXFwiKTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gb2JqZWN0Ll91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gJysnXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvZmZzZXQgPCAwOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gJy0nXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLCBtID0gZGl2bW9kKG9mZnNldCwgNjApXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6cmVwbGFjZSA9ICclYyUwMmQlMDJkJyAlIChzaWduLCBoLCBtKVxcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ICclJyBub3QgaW4genJlcGxhY2VcXG4gICAgICAgICAgICAgICAgICAgIG5ld2Zvcm1hdC5hcHBlbmQoenJlcGxhY2UpXFxuICAgICAgICAgICAgICAgIGVsaWYgY2ggPT0gJ1onOlxcbiAgICAgICAgICAgICAgICAgICAgaWYgWnJlcGxhY2UgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICBacmVwbGFjZSA9IFxcXCJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsIFxcXCJ0em5hbWVcXFwiKTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IG9iamVjdC50em5hbWUoKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdHJmdGltZSBpcyBnb2luZyB0byBoYXZlIGF0IHRoaXM6IGVzY2FwZSAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBacmVwbGFjZSA9IHMucmVwbGFjZSgnJScsICclJScpXFxuICAgICAgICAgICAgICAgICAgICBuZXdmb3JtYXQuYXBwZW5kKFpyZXBsYWNlKVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgcHVzaCgnJScpXFxuICAgICAgICAgICAgICAgICAgICBwdXNoKGNoKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHB1c2goJyUnKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBwdXNoKGNoKVxcbiAgICBuZXdmb3JtYXQgPSBcXFwiXFxcIi5qb2luKG5ld2Zvcm1hdClcXG4gICAgcmV0dXJuIF90aW1lLnN0cmZ0aW1lKG5ld2Zvcm1hdCwgdGltZXR1cGxlKVxcblxcbiMgSnVzdCByYWlzZSBUeXBlRXJyb3IgaWYgdGhlIGFyZyBpc24ndCBOb25lIG9yIGEgc3RyaW5nLlxcbmRlZiBfY2hlY2tfdHpuYW1lKG5hbWUpOlxcbiAgICBpZiBuYW1lIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShuYW1lLCBzdHIpOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0emluZm8udHpuYW1lKCkgbXVzdCByZXR1cm4gTm9uZSBvciBzdHJpbmcsIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwibm90ICclcydcXFwiICUgdHlwZShuYW1lKSlcXG5cXG4jIG5hbWUgaXMgdGhlIG9mZnNldC1wcm9kdWNpbmcgbWV0aG9kLCBcXFwidXRjb2Zmc2V0XFxcIiBvciBcXFwiZHN0XFxcIi5cXG4jIG9mZnNldCBpcyB3aGF0IGl0IHJldHVybmVkLlxcbiMgSWYgb2Zmc2V0IGlzbid0IE5vbmUgb3IgdGltZWRlbHRhLCByYWlzZXMgVHlwZUVycm9yLlxcbiMgSWYgb2Zmc2V0IGlzIE5vbmUsIHJldHVybnMgTm9uZS5cXG4jIEVsc2Ugb2Zmc2V0IGlzIGNoZWNrZWQgZm9yIGJlaW5nIGluIHJhbmdlLCBhbmQgYSB3aG9sZSAjIG9mIG1pbnV0ZXMuXFxuIyBJZiBpdCBpcywgaXRzIGludGVnZXIgdmFsdWUgaXMgcmV0dXJuZWQuICBFbHNlIFZhbHVlRXJyb3IgaXMgcmFpc2VkLlxcbmRlZiBfY2hlY2tfdXRjX29mZnNldChuYW1lLCBvZmZzZXQpOlxcbiAgICBhc3NlcnQgbmFtZSBpbiAoXFxcInV0Y29mZnNldFxcXCIsIFxcXCJkc3RcXFwiKVxcbiAgICBpZiBvZmZzZXQgaXMgTm9uZTpcXG4gICAgICAgIHJldHVyblxcbiAgICBpZiBub3QgaXNpbnN0YW5jZShvZmZzZXQsIHRpbWVkZWx0YSk6XFxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcInR6aW5mby4lcygpIG11c3QgcmV0dXJuIE5vbmUgXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJvciB0aW1lZGVsdGEsIG5vdCAnJXMnXFxcIiAlIChuYW1lLCB0eXBlKG9mZnNldCkpKVxcbiAgICBkYXlzID0gb2Zmc2V0LmRheXNcXG4gICAgaWYgZGF5cyA8IC0xIG9yIGRheXMgPiAwOlxcbiAgICAgICAgb2Zmc2V0ID0gMTQ0MCAgIyB0cmlnZ2VyIG91dC1vZi1yYW5nZVxcbiAgICBlbHNlOlxcbiAgICAgICAgc2Vjb25kcyA9IGRheXMgKiA4NjQwMCArIG9mZnNldC5zZWNvbmRzXFxuICAgICAgICBtaW51dGVzLCBzZWNvbmRzID0gZGl2bW9kKHNlY29uZHMsIDYwKVxcbiAgICAgICAgaWYgc2Vjb25kcyBvciBvZmZzZXQubWljcm9zZWNvbmRzOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcInR6aW5mby4lcygpIG11c3QgcmV0dXJuIGEgd2hvbGUgbnVtYmVyIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJvZiBtaW51dGVzXFxcIiAlIG5hbWUpXFxuICAgICAgICBvZmZzZXQgPSBtaW51dGVzXFxuICAgIGlmIG5vdCAtMTQ0MCA8IG9mZnNldCA8IDE0NDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCIlcygpPSVkLCBtdXN0IGJlIGluIC0xNDM5Li4xNDM5XFxcIiAlIChuYW1lLCBvZmZzZXQpKVxcbiAgICByZXR1cm4gb2Zmc2V0XFxuXFxuZGVmIF9jaGVja19pbnRfZmllbGQodmFsdWUpOlxcbiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBpbnQpOlxcbiAgICAgICAgcmV0dXJuIGludCh2YWx1ZSlcXG4gICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KTpcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLl9faW50X18oKVxcbiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOlxcbiAgICAgICAgICAgIHBhc3NcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgaW50KTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGludCh2YWx1ZSlcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ19faW50X18gbWV0aG9kIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlcicpXFxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2FuIGludGVnZXIgaXMgcmVxdWlyZWQnKVxcbiAgICByYWlzZSBUeXBlRXJyb3IoJ2ludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCcpXFxuXFxuZGVmIF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KTpcXG4gICAgeWVhciA9IF9jaGVja19pbnRfZmllbGQoeWVhcilcXG4gICAgbW9udGggPSBfY2hlY2tfaW50X2ZpZWxkKG1vbnRoKVxcbiAgICBkYXkgPSBfY2hlY2tfaW50X2ZpZWxkKGRheSlcXG4gICAgaWYgbm90IE1JTllFQVIgPD0geWVhciA8PSBNQVhZRUFSOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigneWVhciBtdXN0IGJlIGluICVkLi4lZCcgJSAoTUlOWUVBUiwgTUFYWUVBUiksIHllYXIpXFxuICAgIGlmIG5vdCAxIDw9IG1vbnRoIDw9IDEyOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbW9udGggbXVzdCBiZSBpbiAxLi4xMicsIG1vbnRoKVxcbiAgICBkaW0gPSBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aClcXG4gICAgaWYgbm90IDEgPD0gZGF5IDw9IGRpbTpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2RheSBtdXN0IGJlIGluIDEuLiVkJyAlIGRpbSwgZGF5KVxcbiAgICByZXR1cm4geWVhciwgbW9udGgsIGRheVxcblxcbmRlZiBfY2hlY2tfdGltZV9maWVsZHMoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kKTpcXG4gICAgaG91ciA9IF9jaGVja19pbnRfZmllbGQoaG91cilcXG4gICAgbWludXRlID0gX2NoZWNrX2ludF9maWVsZChtaW51dGUpXFxuICAgIHNlY29uZCA9IF9jaGVja19pbnRfZmllbGQoc2Vjb25kKVxcbiAgICBtaWNyb3NlY29uZCA9IF9jaGVja19pbnRfZmllbGQobWljcm9zZWNvbmQpXFxuICAgIGlmIG5vdCAwIDw9IGhvdXIgPD0gMjM6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdob3VyIG11c3QgYmUgaW4gMC4uMjMnLCBob3VyKVxcbiAgICBpZiBub3QgMCA8PSBtaW51dGUgPD0gNTk6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdtaW51dGUgbXVzdCBiZSBpbiAwLi41OScsIG1pbnV0ZSlcXG4gICAgaWYgbm90IDAgPD0gc2Vjb25kIDw9IDU5OlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignc2Vjb25kIG11c3QgYmUgaW4gMC4uNTknLCBzZWNvbmQpXFxuICAgIGlmIG5vdCAwIDw9IG1pY3Jvc2Vjb25kIDw9IDk5OTk5OTpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21pY3Jvc2Vjb25kIG11c3QgYmUgaW4gMC4uOTk5OTk5JywgbWljcm9zZWNvbmQpXFxuICAgIHJldHVybiBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmRcXG5cXG5kZWYgX2NoZWNrX3R6aW5mb19hcmcodHopOlxcbiAgICBpZiB0eiBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UodHosIHR6aW5mbyk6XFxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcInR6aW5mbyBhcmd1bWVudCBtdXN0IGJlIE5vbmUgb3Igb2YgYSB0emluZm8gc3ViY2xhc3NcXFwiKVxcblxcblxcbiMgTm90ZXMgb24gY29tcGFyaXNvbjogIEluIGdlbmVyYWwsIGRhdGV0aW1lIG1vZHVsZSBjb21wYXJpc29uIG9wZXJhdG9ycyByYWlzZVxcbiMgVHlwZUVycm9yIHdoZW4gdGhleSBkb24ndCBrbm93IGhvdyB0byBkbyBhIGNvbXBhcmlzb24gdGhlbXNlbGYuICBJZiB0aGV5XFxuIyByZXR1cm5lZCBOb3RJbXBsZW1lbnRlZCBpbnN0ZWFkLCBjb21wYXJpc29uIGNvdWxkIChzaWxlbnRseSkgZmFsbCBiYWNrIHRvXFxuIyB0aGUgZGVmYXVsdCBjb21wYXJlLW9iamVjdHMtYnktY29tcGFyaW5nLXRoZWlyLW1lbW9yeS1hZGRyZXNzZXMgc3RyYXRlZ3ksXFxuIyBhbmQgdGhhdCdzIG5vdCBoZWxwZnVsLiAgVGhlcmUgYXJlIHR3byBleGNlcHRpb25zOlxcbiNcXG4jIDEuIEZvciBkYXRlIGFuZCBkYXRldGltZSwgaWYgdGhlIG90aGVyIG9iamVjdCBoYXMgYSBcXFwidGltZXR1cGxlXFxcIiBhdHRyLFxcbiMgICAgTm90SW1wbGVtZW50ZWQgaXMgcmV0dXJuZWQuICBUaGlzIGlzIGEgaG9vayB0byBhbGxvdyBvdGhlciBraW5kcyBvZlxcbiMgICAgZGF0ZXRpbWUtbGlrZSBvYmplY3RzIGEgY2hhbmNlIHRvIGludGVyY2VwdCB0aGUgY29tcGFyaXNvbi5cXG4jXFxuIyAyLiBFbHNlIF9fZXFfXyBhbmQgX19uZV9fIHJldHVybiBGYWxzZSBhbmQgVHJ1ZSwgcmVzcGVjdGl2ZWx5LiAgVGhpcyBpc1xcbiMgICAgc28gb3BlcnRhaW9ucyBsaWtlXFxuI1xcbiMgICAgICAgIHggPT0geVxcbiMgICAgICAgIHggIT0geVxcbiMgICAgICAgIHggaW4gc2VxdWVuY2VcXG4jICAgICAgICB4IG5vdCBpbiBzZXF1ZW5jZVxcbiMgICAgICAgIGRpY3RbeF0gPSB5XFxuI1xcbiMgICAgZG9uJ3QgcmFpc2UgYW5ub3lpbmcgVHlwZUVycm9ycyBqdXN0IGJlY2F1c2UgYSBkYXRldGltZSBvYmplY3RcXG4jICAgIGlzIHBhcnQgb2YgYSBoZXRlcm9nZW5lb3VzIGNvbGxlY3Rpb24uICBJZiB0aGVyZSdzIG5vIGtub3duIHdheSB0b1xcbiMgICAgY29tcGFyZSBYIHRvIGEgZGF0ZXRpbWUsIHNheWluZyB0aGV5J3JlIG5vdCBlcXVhbCBpcyByZWFzb25hYmxlLlxcblxcbmRlZiBfY21wZXJyb3IoeCwgeSk6XFxuICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiY2FuJ3QgY29tcGFyZSAnJXMnIHRvICclcydcXFwiICUgKFxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSh4KS5fX25hbWVfXywgdHlwZSh5KS5fX25hbWVfXykpXFxuXFxuZGVmIF9ub3JtYWxpemVfcGFpcihoaSwgbG8sIGZhY3Rvcik6XFxuICAgIGlmIG5vdCAwIDw9IGxvIDw9IGZhY3Rvci0xOlxcbiAgICAgICAgaW5jLCBsbyA9IGRpdm1vZChsbywgZmFjdG9yKVxcbiAgICAgICAgaGkgKz0gaW5jXFxuICAgIHJldHVybiBoaSwgbG9cXG5cXG5kZWYgX25vcm1hbGl6ZV9kYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgaWdub3JlX292ZXJmbG93PUZhbHNlKTpcXG4gICAgIyBOb3JtYWxpemUgYWxsIHRoZSBpbnB1dHMsIGFuZCBzdG9yZSB0aGUgbm9ybWFsaXplZCB2YWx1ZXMuXFxuICAgIHNzLCB1cyA9IF9ub3JtYWxpemVfcGFpcihzcywgdXMsIDEwMDAwMDApXFxuICAgIG1tLCBzcyA9IF9ub3JtYWxpemVfcGFpcihtbSwgc3MsIDYwKVxcbiAgICBoaCwgbW0gPSBfbm9ybWFsaXplX3BhaXIoaGgsIG1tLCA2MClcXG4gICAgZCwgaGggPSBfbm9ybWFsaXplX3BhaXIoZCwgaGgsIDI0KVxcbiAgICB5LCBtLCBkID0gX25vcm1hbGl6ZV9kYXRlKHksIG0sIGQsIGlnbm9yZV9vdmVyZmxvdylcXG4gICAgcmV0dXJuIHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzXFxuXFxuZGVmIF9ub3JtYWxpemVfZGF0ZSh5ZWFyLCBtb250aCwgZGF5LCBpZ25vcmVfb3ZlcmZsb3c9RmFsc2UpOlxcbiAgICAjIFRoYXQgd2FzIGVhc3kuICBOb3cgaXQgZ2V0cyBtdWRkeTogIHRoZSBwcm9wZXIgcmFuZ2UgZm9yIGRheVxcbiAgICAjIGNhbid0IGJlIGRldGVybWluZWQgd2l0aG91dCBrbm93aW5nIHRoZSBjb3JyZWN0IG1vbnRoIGFuZCB5ZWFyLFxcbiAgICAjIGJ1dCBpZiBkYXkgaXMsIGUuZy4sIHBsdXMgb3IgbWludXMgYSBtaWxsaW9uLCB0aGUgY3VycmVudCBtb250aFxcbiAgICAjIGFuZCB5ZWFyIHZhbHVlcyBtYWtlIG5vIHNlbnNlIChhbmQgbWF5IGFsc28gYmUgb3V0IG9mIGJvdW5kc1xcbiAgICAjIHRoZW1zZWx2ZXMpLlxcbiAgICAjIFNheWluZyAxMiBtb250aHMgPT0gMSB5ZWFyIHNob3VsZCBiZSBub24tY29udHJvdmVyc2lhbC5cXG4gICAgaWYgbm90IDEgPD0gbW9udGggPD0gMTI6XFxuICAgICAgICB5ZWFyLCBtb250aCA9IF9ub3JtYWxpemVfcGFpcih5ZWFyLCBtb250aC0xLCAxMilcXG4gICAgICAgIG1vbnRoICs9IDFcXG4gICAgICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyXFxuXFxuICAgICMgTm93IG9ubHkgZGF5IGNhbiBiZSBvdXQgb2YgYm91bmRzICh5ZWFyIG1heSBhbHNvIGJlIG91dCBvZiBib3VuZHNcXG4gICAgIyBmb3IgYSBkYXRldGltZSBvYmplY3QsIGJ1dCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoYXQgaGVyZSkuXFxuICAgICMgSWYgZGF5IGlzIG91dCBvZiBib3VuZHMsIHdoYXQgdG8gZG8gaXMgYXJndWFibGUsIGJ1dCBhdCBsZWFzdCB0aGVcXG4gICAgIyBtZXRob2QgaGVyZSBpcyBwcmluY2lwbGVkIGFuZCBleHBsYWluYWJsZS5cXG4gICAgZGltID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgIGlmIG5vdCAxIDw9IGRheSA8PSBkaW06XFxuICAgICAgICAjIE1vdmUgZGF5LTEgZGF5cyBmcm9tIHRoZSBmaXJzdCBvZiB0aGUgbW9udGguICBGaXJzdCB0cnkgdG9cXG4gICAgICAgICMgZ2V0IG9mZiBjaGVhcCBpZiB3ZSdyZSBvbmx5IG9uZSBkYXkgb3V0IG9mIHJhbmdlIChhZGp1c3RtZW50c1xcbiAgICAgICAgIyBmb3IgdGltZXpvbmUgYWxvbmUgY2FuJ3QgYmUgd29yc2UgdGhhbiB0aGF0KS5cXG4gICAgICAgIGlmIGRheSA9PSAwOiAgICAjIG1vdmUgYmFjayBhIGRheVxcbiAgICAgICAgICAgIG1vbnRoIC09IDFcXG4gICAgICAgICAgICBpZiBtb250aCA+IDA6XFxuICAgICAgICAgICAgICAgIGRheSA9IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHllYXIsIG1vbnRoLCBkYXkgPSB5ZWFyLTEsIDEyLCAzMVxcbiAgICAgICAgZWxpZiBkYXkgPT0gZGltICsgMTogICAgIyBtb3ZlIGZvcndhcmQgYSBkYXlcXG4gICAgICAgICAgICBtb250aCArPSAxXFxuICAgICAgICAgICAgZGF5ID0gMVxcbiAgICAgICAgICAgIGlmIG1vbnRoID4gMTI6XFxuICAgICAgICAgICAgICAgIG1vbnRoID0gMVxcbiAgICAgICAgICAgICAgICB5ZWFyICs9IDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgb3JkaW5hbCA9IF95bWQyb3JkKHllYXIsIG1vbnRoLCAxKSArIChkYXkgLSAxKVxcbiAgICAgICAgICAgIHllYXIsIG1vbnRoLCBkYXkgPSBfb3JkMnltZChvcmRpbmFsKVxcblxcbiAgICBpZiBub3QgaWdub3JlX292ZXJmbG93IGFuZCBub3QgTUlOWUVBUiA8PSB5ZWFyIDw9IE1BWFlFQVI6XFxuICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKFxcXCJkYXRlIHZhbHVlIG91dCBvZiByYW5nZVxcXCIpXFxuICAgIHJldHVybiB5ZWFyLCBtb250aCwgZGF5XFxuXFxuZGVmIF9hY2N1bSh0YWcsIHNvZmFyLCBudW0sIGZhY3RvciwgbGVmdG92ZXIpOlxcbiAgICBpZiBpc2luc3RhbmNlKG51bSwgaW50KTpcXG4gICAgICAgIHByb2QgPSBudW0gKiBmYWN0b3JcXG4gICAgICAgIHJzdW0gPSBzb2ZhciArIHByb2RcXG4gICAgICAgIHJldHVybiByc3VtLCBsZWZ0b3ZlclxcbiAgICBpZiBpc2luc3RhbmNlKG51bSwgZmxvYXQpOlxcbiAgICAgICAgZnJhY3BhcnQsIGludHBhcnQgPSBfbWF0aC5tb2RmKG51bSlcXG4gICAgICAgIHByb2QgPSBpbnQoaW50cGFydCkgKiBmYWN0b3JcXG4gICAgICAgIHJzdW0gPSBzb2ZhciArIHByb2RcXG4gICAgICAgIGlmIGZyYWNwYXJ0ID09IDAuMDpcXG4gICAgICAgICAgICByZXR1cm4gcnN1bSwgbGVmdG92ZXJcXG4gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGZhY3RvciwgaW50KVxcbiAgICAgICAgZnJhY3BhcnQsIGludHBhcnQgPSBfbWF0aC5tb2RmKGZhY3RvciAqIGZyYWNwYXJ0KVxcbiAgICAgICAgcnN1bSArPSBpbnQoaW50cGFydClcXG4gICAgICAgIHJldHVybiByc3VtLCBsZWZ0b3ZlciArIGZyYWNwYXJ0XFxuICAgIHJhaXNlIFR5cGVFcnJvcihcXFwidW5zdXBwb3J0ZWQgdHlwZSBmb3IgdGltZWRlbHRhICVzIGNvbXBvbmVudDogJXNcXFwiICVcXG4gICAgICAgICAgICAgICAgICAgICh0YWcsIHR5cGUobnVtKSkpXFxuXFxuY2xhc3MgdGltZWRlbHRhKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIlJlcHJlc2VudCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBkYXRldGltZSBvYmplY3RzLlxcblxcbiAgICBTdXBwb3J0ZWQgb3BlcmF0b3JzOlxcblxcbiAgICAtIGFkZCwgc3VidHJhY3QgdGltZWRlbHRhXFxuICAgIC0gdW5hcnkgcGx1cywgbWludXMsIGFic1xcbiAgICAtIGNvbXBhcmUgdG8gdGltZWRlbHRhXFxuICAgIC0gbXVsdGlwbHksIGRpdmlkZSBieSBpbnQvbG9uZ1xcblxcbiAgICBJbiBhZGRpdGlvbiwgZGF0ZXRpbWUgc3VwcG9ydHMgc3VidHJhY3Rpb24gb2YgdHdvIGRhdGV0aW1lIG9iamVjdHNcXG4gICAgcmV0dXJuaW5nIGEgdGltZWRlbHRhLCBhbmQgYWRkaXRpb24gb3Igc3VidHJhY3Rpb24gb2YgYSBkYXRldGltZVxcbiAgICBhbmQgYSB0aW1lZGVsdGEgZ2l2aW5nIGEgZGF0ZXRpbWUuXFxuXFxuICAgIFJlcHJlc2VudGF0aW9uOiAoZGF5cywgc2Vjb25kcywgbWljcm9zZWNvbmRzKS4gIFdoeT8gIEJlY2F1c2UgSVxcbiAgICBmZWx0IGxpa2UgaXQuXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAnX2RheXMnLCAnX3NlY29uZHMnLCAnX21pY3Jvc2Vjb25kcycsICdfaGFzaGNvZGUnXFxuXFxuICAgIGRlZiBfX25ld19fKGNscywgZGF5cz1fU0VOVElORUwsIHNlY29uZHM9X1NFTlRJTkVMLCBtaWNyb3NlY29uZHM9X1NFTlRJTkVMLFxcbiAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHM9X1NFTlRJTkVMLCBtaW51dGVzPV9TRU5USU5FTCwgaG91cnM9X1NFTlRJTkVMLCB3ZWVrcz1fU0VOVElORUwpOlxcbiAgICAgICAgeCA9IDBcXG4gICAgICAgIGxlZnRvdmVyID0gMC4wXFxuICAgICAgICBpZiBtaWNyb3NlY29uZHMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwibWljcm9zZWNvbmRzXFxcIiwgeCwgbWljcm9zZWNvbmRzLCBfVVNfUEVSX1VTLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIG1pbGxpc2Vjb25kcyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJtaWxsaXNlY29uZHNcXFwiLCB4LCBtaWxsaXNlY29uZHMsIF9VU19QRVJfTVMsIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgc2Vjb25kcyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJzZWNvbmRzXFxcIiwgeCwgc2Vjb25kcywgX1VTX1BFUl9TRUNPTkQsIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgbWludXRlcyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJtaW51dGVzXFxcIiwgeCwgbWludXRlcywgX1VTX1BFUl9NSU5VVEUsIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgaG91cnMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwiaG91cnNcXFwiLCB4LCBob3VycywgX1VTX1BFUl9IT1VSLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIGRheXMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwiZGF5c1xcXCIsIHgsIGRheXMsIF9VU19QRVJfREFZLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIHdlZWtzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcIndlZWtzXFxcIiwgeCwgd2Vla3MsIF9VU19QRVJfV0VFSywgbGVmdG92ZXIpXFxuICAgICAgICBpZiBsZWZ0b3ZlciAhPSAwLjA6XFxuICAgICAgICAgICAgeCArPSBfcm91bmQobGVmdG92ZXIpXFxuICAgICAgICByZXR1cm4gY2xzLl9mcm9tX21pY3Jvc2Vjb25kcyh4KVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIF9mcm9tX21pY3Jvc2Vjb25kcyhjbHMsIHVzKTpcXG4gICAgICAgIHMsIHVzID0gZGl2bW9kKHVzLCBfVVNfUEVSX1NFQ09ORClcXG4gICAgICAgIGQsIHMgPSBkaXZtb2QocywgX1NFQ09ORFNfUEVSX0RBWSlcXG4gICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZShkLCBzLCB1cywgRmFsc2UpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgX2NyZWF0ZShjbHMsIGQsIHMsIHVzLCBub3JtYWxpemUpOlxcbiAgICAgICAgaWYgbm9ybWFsaXplOlxcbiAgICAgICAgICAgIHMsIHVzID0gX25vcm1hbGl6ZV9wYWlyKHMsIHVzLCAxMDAwMDAwKVxcbiAgICAgICAgICAgIGQsIHMgPSBfbm9ybWFsaXplX3BhaXIoZCwgcywgMjQqMzYwMClcXG5cXG4gICAgICAgIGlmIG5vdCAtX01BWF9ERUxUQV9EQVlTIDw9IGQgPD0gX01BWF9ERUxUQV9EQVlTOlxcbiAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoXFxcImRheXM9JWQ7IG11c3QgaGF2ZSBtYWduaXR1ZGUgPD0gJWRcXFwiICUgKGQsIF9NQVhfREVMVEFfREFZUykpXFxuXFxuICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKVxcbiAgICAgICAgc2VsZi5fZGF5cyA9IGRcXG4gICAgICAgIHNlbGYuX3NlY29uZHMgPSBzXFxuICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMgPSB1c1xcbiAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIF90b19taWNyb3NlY29uZHMoc2VsZik6XFxuICAgICAgICByZXR1cm4gKChzZWxmLl9kYXlzICogX1NFQ09ORFNfUEVSX0RBWSArIHNlbGYuX3NlY29uZHMpICogX1VTX1BFUl9TRUNPTkQgK1xcbiAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMpXFxuXFxuICAgIGRlZiBfX3JlcHJfXyhzZWxmKTpcXG4gICAgICAgIG1vZHVsZSA9IFxcXCJkYXRldGltZS5cXFwiIGlmIHNlbGYuX19jbGFzc19fIGlzIHRpbWVkZWx0YSBlbHNlIFxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9taWNyb3NlY29uZHM6XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCIlcyglZCwgJWQsICVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcylcXG4gICAgICAgIGlmIHNlbGYuX3NlY29uZHM6XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCIlcyglZCwgJWQpXFxcIiAlIChtb2R1bGUgKyBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzKVxcbiAgICAgICAgcmV0dXJuIFxcXCIlcyglZClcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLl9kYXlzKVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIG1tLCBzcyA9IGRpdm1vZChzZWxmLl9zZWNvbmRzLCA2MClcXG4gICAgICAgIGhoLCBtbSA9IGRpdm1vZChtbSwgNjApXFxuICAgICAgICBzID0gXFxcIiVkOiUwMmQ6JTAyZFxcXCIgJSAoaGgsIG1tLCBzcylcXG4gICAgICAgIGlmIHNlbGYuX2RheXM6XFxuICAgICAgICAgICAgZGVmIHBsdXJhbChuKTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIG4sIGFicyhuKSAhPSAxIGFuZCBcXFwic1xcXCIgb3IgXFxcIlxcXCJcXG4gICAgICAgICAgICBzID0gKFxcXCIlZCBkYXklcywgXFxcIiAlIHBsdXJhbChzZWxmLl9kYXlzKSkgKyBzXFxuICAgICAgICBpZiBzZWxmLl9taWNyb3NlY29uZHM6XFxuICAgICAgICAgICAgcyA9IHMgKyBcXFwiLiUwNmRcXFwiICUgc2VsZi5fbWljcm9zZWNvbmRzXFxuICAgICAgICByZXR1cm4gc1xcblxcbiAgICBkZWYgdG90YWxfc2Vjb25kcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRvdGFsIHNlY29uZHMgaW4gdGhlIGR1cmF0aW9uLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3RvX21pY3Jvc2Vjb25kcygpIC8gMTAuMCoqNlxcblxcbiAgICAjIFJlYWQtb25seSBmaWVsZCBhY2Nlc3NvcnNcXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBkYXlzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGF5c1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2RheXNcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBzZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwic2Vjb25kc1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NlY29uZHNcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtaWNyb3NlY29uZHMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaWNyb3NlY29uZHNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9taWNyb3NlY29uZHNcXG5cXG4gICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICAjIGZvciBDUHl0aG9uIGNvbXBhdGliaWxpdHksIHdlIGNhbm5vdCB1c2VcXG4gICAgICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZShzZWxmLl9kYXlzICsgb3RoZXIuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgKyBvdGhlci5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzICsgb3RoZXIuX21pY3Jvc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgICMgZm9yIENQeXRob24gY29tcGF0aWJpbGl0eSwgd2UgY2Fubm90IHVzZVxcbiAgICAgICAgICAgICMgb3VyIF9fY2xhc3NfXyBoZXJlLCBidXQgbmVlZCBhIHJlYWwgdGltZWRlbHRhXFxuICAgICAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fY3JlYXRlKHNlbGYuX2RheXMgLSBvdGhlci5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyAtIG90aGVyLl9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMgLSBvdGhlci5fbWljcm9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlKVxcbiAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuXFxuICAgIGRlZiBfX25lZ19fKHNlbGYpOlxcbiAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fY3JlYXRlKC1zZWxmLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zZWxmLl9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zZWxmLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSlcXG5cXG4gICAgZGVmIF9fcG9zX18oc2VsZik6XFxuICAgICAgICAjIGZvciBDUHl0aG9uIGNvbXBhdGliaWxpdHksIHdlIGNhbm5vdCB1c2VcXG4gICAgICAgICMgb3VyIF9fY2xhc3NfXyBoZXJlLCBidXQgbmVlZCBhIHJlYWwgdGltZWRlbHRhXFxuICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoc2VsZi5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZSlcXG5cXG4gICAgZGVmIF9fYWJzX18oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl9kYXlzIDwgMDpcXG4gICAgICAgICAgICByZXR1cm4gLXNlbGZcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIF9fbXVsX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGludCk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICB1c2VjID0gc2VsZi5fdG9fbWljcm9zZWNvbmRzKClcXG4gICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2Zyb21fbWljcm9zZWNvbmRzKHVzZWMgKiBvdGhlcilcXG5cXG4gICAgX19ybXVsX18gPSBfX211bF9fXFxuXFxuICAgIGRlZiBfX2Rpdl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBpbnQpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgdXNlYyA9IHNlbGYuX3RvX21pY3Jvc2Vjb25kcygpXFxuICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9mcm9tX21pY3Jvc2Vjb25kcyh1c2VjIC8vIG90aGVyKVxcblxcbiAgICBfX2Zsb29yZGl2X18gPSBfX2Rpdl9fXFxuXFxuICAgICMgQ29tcGFyaXNvbnMgb2YgdGltZWRlbHRhIG9iamVjdHMgd2l0aCBvdGhlci5cXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSAhPSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuXFxuICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID4gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfY21wKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpXFxuICAgICAgICByZXR1cm4gX2NtcChzZWxmLl9nZXRzdGF0ZSgpLCBvdGhlci5fZ2V0c3RhdGUoKSlcXG5cXG4gICAgZGVmIF9faGFzaF9fKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5faGFzaGNvZGUgPT0gLTE6XFxuICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKHNlbGYuX2dldHN0YXRlKCkpXFxuICAgICAgICByZXR1cm4gc2VsZi5faGFzaGNvZGVcXG5cXG4gICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIChzZWxmLl9kYXlzICE9IDAgb3JcXG4gICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyAhPSAwIG9yXFxuICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcyAhPSAwKVxcblxcbnRpbWVkZWx0YS5taW4gPSB0aW1lZGVsdGEoLV9NQVhfREVMVEFfREFZUylcXG50aW1lZGVsdGEubWF4ID0gdGltZWRlbHRhKF9NQVhfREVMVEFfREFZUywgMjQqMzYwMC0xLCAxMDAwMDAwLTEpXFxudGltZWRlbHRhLnJlc29sdXRpb24gPSB0aW1lZGVsdGEobWljcm9zZWNvbmRzPTEpXFxuXFxuY2xhc3MgZGF0ZShvYmplY3QpOlxcbiAgICBcXFwiXFxcIlxcXCJDb25jcmV0ZSBkYXRlIHR5cGUuXFxuXFxuICAgIENvbnN0cnVjdG9yczpcXG5cXG4gICAgX19uZXdfXygpXFxuICAgIGZyb210aW1lc3RhbXAoKVxcbiAgICB0b2RheSgpXFxuICAgIGZyb21vcmRpbmFsKClcXG5cXG4gICAgT3BlcmF0b3JzOlxcblxcbiAgICBfX3JlcHJfXywgX19zdHJfX1xcbiAgICBfX2NtcF9fLCBfX2hhc2hfX1xcbiAgICBfX2FkZF9fLCBfX3JhZGRfXywgX19zdWJfXyAoYWRkL3JhZGQgb25seSB3aXRoIHRpbWVkZWx0YSBhcmcpXFxuXFxuICAgIE1ldGhvZHM6XFxuXFxuICAgIHRpbWV0dXBsZSgpXFxuICAgIHRvb3JkaW5hbCgpXFxuICAgIHdlZWtkYXkoKVxcbiAgICBpc293ZWVrZGF5KCksIGlzb2NhbGVuZGFyKCksIGlzb2Zvcm1hdCgpXFxuICAgIGN0aW1lKClcXG4gICAgc3RyZnRpbWUoKVxcblxcbiAgICBQcm9wZXJ0aWVzIChyZWFkb25seSk6XFxuICAgIHllYXIsIG1vbnRoLCBkYXlcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIF9fc2xvdHNfXyA9ICdfeWVhcicsICdfbW9udGgnLCAnX2RheScsICdfaGFzaGNvZGUnXFxuXFxuICAgIGRlZiBfX25ld19fKGNscywgeWVhciwgbW9udGg9Tm9uZSwgZGF5PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29uc3RydWN0b3IuXFxuXFxuICAgICAgICBBcmd1bWVudHM6XFxuXFxuICAgICAgICB5ZWFyLCBtb250aCwgZGF5IChyZXF1aXJlZCwgYmFzZSAxKVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gX2NoZWNrX2RhdGVfZmllbGRzKHllYXIsIG1vbnRoLCBkYXkpXFxuICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKVxcbiAgICAgICAgc2VsZi5feWVhciA9IHllYXJcXG4gICAgICAgIHNlbGYuX21vbnRoID0gbW9udGhcXG4gICAgICAgIHNlbGYuX2RheSA9IGRheVxcbiAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgIyBBZGRpdGlvbmFsIGNvbnN0cnVjdG9yc1xcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIGZyb210aW1lc3RhbXAoY2xzLCB0KTpcXG4gICAgICAgIFxcXCJDb25zdHJ1Y3QgYSBkYXRlIGZyb20gYSBQT1NJWCB0aW1lc3RhbXAgKGxpa2UgdGltZS50aW1lKCkpLlxcXCJcXG4gICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MsIHdlZWtkYXksIGpkYXksIGRzdCA9IF90aW1lLmxvY2FsdGltZSh0KVxcbiAgICAgICAgcmV0dXJuIGNscyh5LCBtLCBkKVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIHRvZGF5KGNscyk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgZGF0ZSBmcm9tIHRpbWUudGltZSgpLlxcXCJcXG4gICAgICAgIHQgPSBfdGltZS50aW1lKClcXG4gICAgICAgIHJldHVybiBjbHMuZnJvbXRpbWVzdGFtcCh0KVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIGZyb21vcmRpbmFsKGNscywgbik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb250cnVjdCBhIGRhdGUgZnJvbSBhIHByb2xlcHRpYyBHcmVnb3JpYW4gb3JkaW5hbC5cXG5cXG4gICAgICAgIEphbnVhcnkgMSBvZiB5ZWFyIDEgaXMgZGF5IDEuICBPbmx5IHRoZSB5ZWFyLCBtb250aCBhbmQgZGF5IGFyZVxcbiAgICAgICAgbm9uLXplcm8gaW4gdGhlIHJlc3VsdC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgeSwgbSwgZCA9IF9vcmQyeW1kKG4pXFxuICAgICAgICByZXR1cm4gY2xzKHksIG0sIGQpXFxuXFxuICAgICMgQ29udmVyc2lvbnMgdG8gc3RyaW5nXFxuXFxuICAgIGRlZiBfX3JlcHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnZlcnQgdG8gZm9ybWFsIHN0cmluZywgZm9yIHJlcHIoKS5cXG5cXG4gICAgICAgID4+PiBkdCA9IGRhdGV0aW1lKDIwMTAsIDEsIDEpXFxuICAgICAgICA+Pj4gcmVwcihkdClcXG4gICAgICAgICdkYXRldGltZS5kYXRldGltZSgyMDEwLCAxLCAxLCAwLCAwKSdcXG5cXG4gICAgICAgID4+PiBkdCA9IGRhdGV0aW1lKDIwMTAsIDEsIDEsIHR6aW5mbz10aW1lem9uZS51dGMpXFxuICAgICAgICA+Pj4gcmVwcihkdClcXG4gICAgICAgICdkYXRldGltZS5kYXRldGltZSgyMDEwLCAxLCAxLCAwLCAwLCB0emluZm89ZGF0ZXRpbWUudGltZXpvbmUudXRjKSdcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgbW9kdWxlID0gXFxcImRhdGV0aW1lLlxcXCIgaWYgc2VsZi5fX2NsYXNzX18gaXMgZGF0ZSBlbHNlIFxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gXFxcIiVzKCVkLCAlZCwgJWQpXFxcIiAlIChtb2R1bGUgKyBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3llYXIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9tb250aCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RheSlcXG5cXG4gICAgIyBYWFggVGhlc2Ugc2hvdWxkbid0IGRlcGVuZCBvbiB0aW1lLmxvY2FsdGltZSgpLCBiZWNhdXNlIHRoYXRcXG4gICAgIyBjbGlwcyB0aGUgdXNhYmxlIGRhdGVzIHRvIFsxOTcwIC4uIDIwMzgpLiAgQXQgbGVhc3QgY3RpbWUoKSBpc1xcbiAgICAjIGVhc2lseSBkb25lIHdpdGhvdXQgdXNpbmcgc3RyZnRpbWUoKSAtLSB0aGF0J3MgYmV0dGVyIHRvbyBiZWNhdXNlXFxuICAgICMgc3RyZnRpbWUoXFxcIiVjXFxcIiwgLi4uKSBpcyBsb2NhbGUgc3BlY2lmaWMuXFxuXFxuICAgIGRlZiBjdGltZShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gY3RpbWUoKSBzdHlsZSBzdHJpbmcuXFxcIlxcbiAgICAgICAgd2Vla2RheSA9IHNlbGYudG9vcmRpbmFsKCkgJSA3IG9yIDdcXG4gICAgICAgIHJldHVybiBcXFwiJXMgJXMgJTJkIDAwOjAwOjAwICUwNGRcXFwiICUgKFxcbiAgICAgICAgICAgIF9EQVlOQU1FU1t3ZWVrZGF5XSxcXG4gICAgICAgICAgICBfTU9OVEhOQU1FU1tzZWxmLl9tb250aF0sXFxuICAgICAgICAgICAgc2VsZi5fZGF5LCBzZWxmLl95ZWFyKVxcblxcbiAgICBkZWYgc3RyZnRpbWUoc2VsZiwgZm9ybWF0KTpcXG4gICAgICAgIFxcXCJGb3JtYXQgdXNpbmcgc3RyZnRpbWUoKS5cXFwiXFxuICAgICAgICByZXR1cm4gX3dyYXBfc3RyZnRpbWUoc2VsZiwgZm9ybWF0LCBzZWxmLnRpbWV0dXBsZSgpKVxcblxcbiAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmbXQpOlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZm10LCAoc3RyLCB1bmljb2RlKSk6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiX19mb3JtYXRfXyBleHBlY3RzIHN0ciBvciB1bmljb2RlLCBub3QgJXNcXFwiICVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5fX2NsYXNzX18uX19uYW1lX18pXFxuICAgICAgICBpZiBsZW4oZm10KSAhPSAwOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnN0cmZ0aW1lKGZtdClcXG4gICAgICAgIHJldHVybiBzdHIoc2VsZilcXG5cXG4gICAgZGVmIGlzb2Zvcm1hdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgZGF0ZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIElTTy5cXG5cXG4gICAgICAgIFRoaXMgaXMgJ1lZWVktTU0tREQnLlxcblxcbiAgICAgICAgUmVmZXJlbmNlczpcXG4gICAgICAgIC0gaHR0cDovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZVxcbiAgICAgICAgLSBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvaXNvLXRpbWUuaHRtbFxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gXFxcIiUwNGQtJTAyZC0lMDJkXFxcIiAlIChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5KVxcblxcbiAgICBfX3N0cl9fID0gaXNvZm9ybWF0XFxuXFxuICAgICMgUmVhZC1vbmx5IGZpZWxkIGFjY2Vzc29yc1xcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHllYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ5ZWFyICgxLTk5OTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5feWVhclxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1vbnRoKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibW9udGggKDEtMTIpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbW9udGhcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBkYXkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJkYXkgKDEtMzEpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZGF5XFxuXFxuICAgICMgU3RhbmRhcmQgY29udmVyc2lvbnMsIF9fY21wX18sIF9faGFzaF9fIChhbmQgaGVscGVycylcXG5cXG4gICAgZGVmIHRpbWV0dXBsZShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gbG9jYWwgdGltZSB0dXBsZSBjb21wYXRpYmxlIHdpdGggdGltZS5sb2NhbHRpbWUoKS5cXFwiXFxuICAgICAgICByZXR1cm4gX2J1aWxkX3N0cnVjdF90aW1lKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIC0xKVxcblxcbiAgICBkZWYgdG9vcmRpbmFsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHByb2xlcHRpYyBHcmVnb3JpYW4gb3JkaW5hbCBmb3IgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXkuXFxuXFxuICAgICAgICBKYW51YXJ5IDEgb2YgeWVhciAxIGlzIGRheSAxLiAgT25seSB0aGUgeWVhciwgbW9udGggYW5kIGRheSB2YWx1ZXNcXG4gICAgICAgIGNvbnRyaWJ1dGUgdG8gdGhlIHJlc3VsdC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIF95bWQyb3JkKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXkpXFxuXFxuICAgIGRlZiByZXBsYWNlKHNlbGYsIHllYXI9Tm9uZSwgbW9udGg9Tm9uZSwgZGF5PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgbmV3IGRhdGUgd2l0aCBuZXcgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkcy5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHllYXIgaXMgTm9uZTpcXG4gICAgICAgICAgICB5ZWFyID0gc2VsZi5feWVhclxcbiAgICAgICAgaWYgbW9udGggaXMgTm9uZTpcXG4gICAgICAgICAgICBtb250aCA9IHNlbGYuX21vbnRoXFxuICAgICAgICBpZiBkYXkgaXMgTm9uZTpcXG4gICAgICAgICAgICBkYXkgPSBzZWxmLl9kYXlcXG4gICAgICAgIHJldHVybiBkYXRlKHllYXIsIG1vbnRoLCBkYXkpXFxuXFxuICAgICMgQ29tcGFyaXNvbnMgb2YgZGF0ZSBvYmplY3RzIHdpdGggb3RoZXIuXFxuXFxuICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPT0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpICE9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPCAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID49IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX2NtcChzZWxmLCBvdGhlcik6XFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSlcXG4gICAgICAgIHksIG0sIGQgPSBzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5XFxuICAgICAgICB5MiwgbTIsIGQyID0gb3RoZXIuX3llYXIsIG90aGVyLl9tb250aCwgb3RoZXIuX2RheVxcbiAgICAgICAgcmV0dXJuIF9jbXAoKHksIG0sIGQpLCAoeTIsIG0yLCBkMikpXFxuXFxuICAgIGRlZiBfX2hhc2hfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJIYXNoLlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX2hhc2hjb2RlID09IC0xOlxcbiAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuICAgICMgQ29tcHV0YXRpb25zXFxuXFxuICAgIGRlZiBfYWRkX3RpbWVkZWx0YShzZWxmLCBvdGhlciwgZmFjdG9yKTpcXG4gICAgICAgIHksIG0sIGQgPSBfbm9ybWFsaXplX2RhdGUoXFxuICAgICAgICAgICAgc2VsZi5feWVhcixcXG4gICAgICAgICAgICBzZWxmLl9tb250aCxcXG4gICAgICAgICAgICBzZWxmLl9kYXkgKyBvdGhlci5kYXlzICogZmFjdG9yKVxcbiAgICAgICAgcmV0dXJuIGRhdGUoeSwgbSwgZClcXG5cXG4gICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIkFkZCBhIGRhdGUgdG8gYSB0aW1lZGVsdGEuXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fYWRkX3RpbWVkZWx0YShvdGhlciwgMSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBfX3JhZGRfXyA9IF9fYWRkX19cXG5cXG4gICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU3VidHJhY3QgdHdvIGRhdGVzLCBvciBhIGRhdGUgYW5kIGEgdGltZWRlbHRhLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgZGF5czEgPSBzZWxmLnRvb3JkaW5hbCgpXFxuICAgICAgICAgICAgZGF5czIgPSBvdGhlci50b29yZGluYWwoKVxcbiAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZShkYXlzMSAtIGRheXMyLCAwLCAwLCBGYWxzZSlcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZF90aW1lZGVsdGEob3RoZXIsIC0xKVxcbiAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuXFxuICAgIGRlZiB3ZWVrZGF5KHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBkYXkgb2YgdGhlIHdlZWssIHdoZXJlIE1vbmRheSA9PSAwIC4uLiBTdW5kYXkgPT0gNi5cXFwiXFxuICAgICAgICByZXR1cm4gKHNlbGYudG9vcmRpbmFsKCkgKyA2KSAlIDdcXG5cXG4gICAgIyBEYXktb2YtdGhlLXdlZWsgYW5kIHdlZWstb2YtdGhlLXllYXIsIGFjY29yZGluZyB0byBJU09cXG5cXG4gICAgZGVmIGlzb3dlZWtkYXkoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGRheSBvZiB0aGUgd2Vlaywgd2hlcmUgTW9uZGF5ID09IDEgLi4uIFN1bmRheSA9PSA3LlxcXCJcXG4gICAgICAgICMgMS1KYW4tMDAwMSBpcyBhIE1vbmRheVxcbiAgICAgICAgcmV0dXJuIHNlbGYudG9vcmRpbmFsKCkgJSA3IG9yIDdcXG5cXG4gICAgZGVmIGlzb2NhbGVuZGFyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIElTTyB5ZWFyLCB3ZWVrIG51bWJlciwgYW5kIHdlZWtkYXkuXFxuXFxuICAgICAgICBUaGUgZmlyc3QgSVNPIHdlZWsgb2YgdGhlIHllYXIgaXMgdGhlIChNb24tU3VuKSB3ZWVrXFxuICAgICAgICBjb250YWluaW5nIHRoZSB5ZWFyJ3MgZmlyc3QgVGh1cnNkYXk7IGV2ZXJ5dGhpbmcgZWxzZSBkZXJpdmVzXFxuICAgICAgICBmcm9tIHRoYXQuXFxuXFxuICAgICAgICBUaGUgZmlyc3Qgd2VlayBpcyAxOyBNb25kYXkgaXMgMSAuLi4gU3VuZGF5IGlzIDcuXFxuXFxuICAgICAgICBJU08gY2FsZW5kYXIgYWxnb3JpdGhtIHRha2VuIGZyb21cXG4gICAgICAgIGh0dHA6Ly93d3cucGh5cy51dS5ubC9+dmdlbnQvY2FsZW5kYXIvaXNvY2FsZW5kYXIuaHRtXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHllYXIgPSBzZWxmLl95ZWFyXFxuICAgICAgICB3ZWVrMW1vbmRheSA9IF9pc293ZWVrMW1vbmRheSh5ZWFyKVxcbiAgICAgICAgdG9kYXkgPSBfeW1kMm9yZChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5KVxcbiAgICAgICAgIyBJbnRlcm5hbGx5LCB3ZWVrIGFuZCBkYXkgaGF2ZSBvcmlnaW4gMFxcbiAgICAgICAgd2VlaywgZGF5ID0gZGl2bW9kKHRvZGF5IC0gd2VlazFtb25kYXksIDcpXFxuICAgICAgICBpZiB3ZWVrIDwgMDpcXG4gICAgICAgICAgICB5ZWFyIC09IDFcXG4gICAgICAgICAgICB3ZWVrMW1vbmRheSA9IF9pc293ZWVrMW1vbmRheSh5ZWFyKVxcbiAgICAgICAgICAgIHdlZWssIGRheSA9IGRpdm1vZCh0b2RheSAtIHdlZWsxbW9uZGF5LCA3KVxcbiAgICAgICAgZWxpZiB3ZWVrID49IDUyOlxcbiAgICAgICAgICAgIGlmIHRvZGF5ID49IF9pc293ZWVrMW1vbmRheSh5ZWFyKzEpOlxcbiAgICAgICAgICAgICAgICB5ZWFyICs9IDFcXG4gICAgICAgICAgICAgICAgd2VlayA9IDBcXG4gICAgICAgIHJldHVybiB5ZWFyLCB3ZWVrKzEsIGRheSsxXFxuXFxuX2RhdGVfY2xhc3MgPSBkYXRlICAjIHNvIGZ1bmN0aW9ucyB3LyBhcmdzIG5hbWVkIFxcXCJkYXRlXFxcIiBjYW4gZ2V0IGF0IHRoZSBjbGFzc1xcblxcbmRhdGUubWluID0gZGF0ZSgxLCAxLCAxKVxcbmRhdGUubWF4ID0gZGF0ZSg5OTk5LCAxMiwgMzEpXFxuZGF0ZS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKGRheXM9MSlcXG5cXG5jbGFzcyB0emluZm8ob2JqZWN0KTpcXG4gICAgXFxcIlxcXCJcXFwiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgdGltZSB6b25lIGluZm8gY2xhc3Nlcy5cXG5cXG4gICAgU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoZSBuYW1lKCksIHV0Y29mZnNldCgpIGFuZCBkc3QoKSBtZXRob2RzLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gKClcXG5cXG4gICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6XFxuICAgICAgICBcXFwiZGF0ZXRpbWUgLT4gc3RyaW5nIG5hbWUgb2YgdGltZSB6b25lLlxcXCJcXG4gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInR6aW5mbyBzdWJjbGFzcyBtdXN0IG92ZXJyaWRlIHR6bmFtZSgpXFxcIilcXG5cXG4gICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6XFxuICAgICAgICBcXFwiZGF0ZXRpbWUgLT4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgZm9yIHdlc3Qgb2YgVVRDKVxcXCJcXG4gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInR6aW5mbyBzdWJjbGFzcyBtdXN0IG92ZXJyaWRlIHV0Y29mZnNldCgpXFxcIilcXG5cXG4gICAgZGVmIGRzdChzZWxmLCBkdCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJkYXRldGltZSAtPiBEU1Qgb2Zmc2V0IGluIG1pbnV0ZXMgZWFzdCBvZiBVVEMuXFxuXFxuICAgICAgICBSZXR1cm4gMCBpZiBEU1Qgbm90IGluIGVmZmVjdC4gIHV0Y29mZnNldCgpIG11c3QgaW5jbHVkZSB0aGUgRFNUXFxuICAgICAgICBvZmZzZXQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInR6aW5mbyBzdWJjbGFzcyBtdXN0IG92ZXJyaWRlIGRzdCgpXFxcIilcXG5cXG4gICAgZGVmIGZyb211dGMoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcImRhdGV0aW1lIGluIFVUQyAtPiBkYXRldGltZSBpbiBsb2NhbCB0aW1lLlxcXCJcXG5cXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGR0LCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJmcm9tdXRjKCkgcmVxdWlyZXMgYSBkYXRldGltZSBhcmd1bWVudFxcXCIpXFxuICAgICAgICBpZiBkdC50emluZm8gaXMgbm90IHNlbGY6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiZHQudHppbmZvIGlzIG5vdCBzZWxmXFxcIilcXG5cXG4gICAgICAgIGR0b2ZmID0gZHQudXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIGR0b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiZnJvbXV0YygpIHJlcXVpcmVzIGEgbm9uLU5vbmUgdXRjb2Zmc2V0KCkgXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInJlc3VsdFxcXCIpXFxuXFxuICAgICAgICAjIFNlZSB0aGUgbG9uZyBjb21tZW50IGJsb2NrIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlIGZvciBhblxcbiAgICAgICAgIyBleHBsYW5hdGlvbiBvZiB0aGlzIGFsZ29yaXRobS5cXG4gICAgICAgIGR0ZHN0ID0gZHQuZHN0KClcXG4gICAgICAgIGlmIGR0ZHN0IGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiZnJvbXV0YygpIHJlcXVpcmVzIGEgbm9uLU5vbmUgZHN0KCkgcmVzdWx0XFxcIilcXG4gICAgICAgIGRlbHRhID0gZHRvZmYgLSBkdGRzdFxcbiAgICAgICAgaWYgZGVsdGE6XFxuICAgICAgICAgICAgZHQgPSBkdCArIGRlbHRhXFxuICAgICAgICAgICAgZHRkc3QgPSBkdC5kc3QoKVxcbiAgICAgICAgICAgIGlmIGR0ZHN0IGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImZyb211dGMoKTogZHQuZHN0IGdhdmUgaW5jb25zaXN0ZW50IFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicmVzdWx0czsgY2Fubm90IGNvbnZlcnRcXFwiKVxcbiAgICAgICAgaWYgZHRkc3Q6XFxuICAgICAgICAgICAgcmV0dXJuIGR0ICsgZHRkc3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIGR0XFxuXFxuX3R6aW5mb19jbGFzcyA9IHR6aW5mb1xcblxcbmNsYXNzIHRpbWUob2JqZWN0KTpcXG4gICAgXFxcIlxcXCJcXFwiVGltZSB3aXRoIHRpbWUgem9uZS5cXG5cXG4gICAgQ29uc3RydWN0b3JzOlxcblxcbiAgICBfX25ld19fKClcXG5cXG4gICAgT3BlcmF0b3JzOlxcblxcbiAgICBfX3JlcHJfXywgX19zdHJfX1xcbiAgICBfX2NtcF9fLCBfX2hhc2hfX1xcblxcbiAgICBNZXRob2RzOlxcblxcbiAgICBzdHJmdGltZSgpXFxuICAgIGlzb2Zvcm1hdCgpXFxuICAgIHV0Y29mZnNldCgpXFxuICAgIHR6bmFtZSgpXFxuICAgIGRzdCgpXFxuXFxuICAgIFByb3BlcnRpZXMgKHJlYWRvbmx5KTpcXG4gICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCB0emluZm9cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIF9fc2xvdHNfXyA9ICdfaG91cicsICdfbWludXRlJywgJ19zZWNvbmQnLCAnX21pY3Jvc2Vjb25kJywgJ190emluZm8nLCAnX2hhc2hjb2RlJ1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIGhvdXI9MCwgbWludXRlPTAsIHNlY29uZD0wLCBtaWNyb3NlY29uZD0wLCB0emluZm89Tm9uZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb25zdHJ1Y3Rvci5cXG5cXG4gICAgICAgIEFyZ3VtZW50czpcXG5cXG4gICAgICAgIGhvdXIsIG1pbnV0ZSAocmVxdWlyZWQpXFxuICAgICAgICBzZWNvbmQsIG1pY3Jvc2Vjb25kIChkZWZhdWx0IHRvIHplcm8pXFxuICAgICAgICB0emluZm8gKGRlZmF1bHQgdG8gTm9uZSlcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kID0gX2NoZWNrX3RpbWVfZmllbGRzKFxcbiAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZClcXG4gICAgICAgIF9jaGVja190emluZm9fYXJnKHR6aW5mbylcXG4gICAgICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpXFxuICAgICAgICBzZWxmLl9ob3VyID0gaG91clxcbiAgICAgICAgc2VsZi5fbWludXRlID0gbWludXRlXFxuICAgICAgICBzZWxmLl9zZWNvbmQgPSBzZWNvbmRcXG4gICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kID0gbWljcm9zZWNvbmRcXG4gICAgICAgIHNlbGYuX3R6aW5mbyA9IHR6aW5mb1xcbiAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgaG91cihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImhvdXIgKDAtMjMpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faG91clxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pbnV0ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1pbnV0ZSAoMC01OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9taW51dGVcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBzZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJzZWNvbmQgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWljcm9zZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaWNyb3NlY29uZCAoMC05OTk5OTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWljcm9zZWNvbmRcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB0emluZm8oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ0aW1lem9uZSBpbmZvIG9iamVjdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3R6aW5mb1xcblxcbiAgICAjIFN0YW5kYXJkIGNvbnZlcnNpb25zLCBfX2hhc2hfXyAoYW5kIGhlbHBlcnMpXFxuXFxuICAgICMgQ29tcGFyaXNvbnMgb2YgdGltZSBvYmplY3RzIHdpdGggb3RoZXIuXFxuXFxuICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSAhPSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuXFxuICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPD0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPCAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX2NtcChzZWxmLCBvdGhlcik6XFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdGhlciwgdGltZSlcXG4gICAgICAgIG15dHogPSBzZWxmLl90emluZm9cXG4gICAgICAgIG90dHogPSBvdGhlci5fdHppbmZvXFxuICAgICAgICBteW9mZiA9IG90b2ZmID0gTm9uZVxcblxcbiAgICAgICAgaWYgbXl0eiBpcyBvdHR6OlxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbXlvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIG90b2ZmID0gb3RoZXIuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgYmFzZV9jb21wYXJlID0gbXlvZmYgPT0gb3RvZmZcXG5cXG4gICAgICAgIGlmIGJhc2VfY29tcGFyZTpcXG4gICAgICAgICAgICByZXR1cm4gX2NtcCgoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIuX2hvdXIsIG90aGVyLl9taW51dGUsIG90aGVyLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLl9taWNyb3NlY29uZCkpXFxuICAgICAgICBpZiBteW9mZiBpcyBOb25lIG9yIG90b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBjb21wYXJlIG9mZnNldC1uYWl2ZSBhbmQgb2Zmc2V0LWF3YXJlIHRpbWVzXFxcIilcXG4gICAgICAgIG15aGhtbSA9IHNlbGYuX2hvdXIgKiA2MCArIHNlbGYuX21pbnV0ZSAtIG15b2ZmXFxuICAgICAgICBvdGhobW0gPSBvdGhlci5faG91ciAqIDYwICsgb3RoZXIuX21pbnV0ZSAtIG90b2ZmXFxuICAgICAgICByZXR1cm4gX2NtcCgobXloaG1tLCBzZWxmLl9zZWNvbmQsIHNlbGYuX21pY3Jvc2Vjb25kKSxcXG4gICAgICAgICAgICAgICAgICAgIChvdGhobW0sIG90aGVyLl9zZWNvbmQsIG90aGVyLl9taWNyb3NlY29uZCkpXFxuXFxuICAgIGRlZiBfX2hhc2hfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkhhc2guXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICB0em9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgaWYgbm90IHR6b2ZmOiAgIyB6ZXJvIG9yIE5vbmVcXG4gICAgICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKHNlbGYuX2dldHN0YXRlKClbMF0pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaCwgbSA9IGRpdm1vZChzZWxmLmhvdXIgKiA2MCArIHNlbGYubWludXRlIC0gdHpvZmYsIDYwKVxcbiAgICAgICAgICAgICAgICBpZiAwIDw9IGggPCAyNDpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaCh0aW1lKGgsIG0sIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKSlcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaCgoaCwgbSwgc2VsZi5zZWNvbmQsIHNlbGYubWljcm9zZWNvbmQpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuICAgICMgQ29udmVyc2lvbiB0byBzdHJpbmdcXG5cXG4gICAgZGVmIF90enN0cihzZWxmLCBzZXA9XFxcIjpcXFwiKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBmb3JtYXR0ZWQgdGltZXpvbmUgb2Zmc2V0ICgreHg6eHgpIG9yIE5vbmUuXFxcIlxcXCJcXFwiXFxuICAgICAgICBvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgb2ZmIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGlmIG9mZiA8IDA6XFxuICAgICAgICAgICAgICAgIHNpZ24gPSBcXFwiLVxcXCJcXG4gICAgICAgICAgICAgICAgb2ZmID0gLW9mZlxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNpZ24gPSBcXFwiK1xcXCJcXG4gICAgICAgICAgICBoaCwgbW0gPSBkaXZtb2Qob2ZmLCA2MClcXG4gICAgICAgICAgICBhc3NlcnQgMCA8PSBoaCA8IDI0XFxuICAgICAgICAgICAgb2ZmID0gXFxcIiVzJTAyZCVzJTAyZFxcXCIgJSAoc2lnbiwgaGgsIHNlcCwgbW0pXFxuICAgICAgICByZXR1cm4gb2ZmXFxuXFxuICAgIGRlZiBfX3JlcHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnZlcnQgdG8gZm9ybWFsIHN0cmluZywgZm9yIHJlcHIoKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX21pY3Jvc2Vjb25kICE9IDA6XFxuICAgICAgICAgICAgcyA9IFxcXCIsICVkLCAlZFxcXCIgJSAoc2VsZi5fc2Vjb25kLCBzZWxmLl9taWNyb3NlY29uZClcXG4gICAgICAgIGVsaWYgc2VsZi5fc2Vjb25kICE9IDA6XFxuICAgICAgICAgICAgcyA9IFxcXCIsICVkXFxcIiAlIHNlbGYuX3NlY29uZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzID0gXFxcIlxcXCJcXG4gICAgICAgIG1vZHVsZSA9IFxcXCJkYXRldGltZS5cXFwiIGlmIHNlbGYuX19jbGFzc19fIGlzIHRpbWUgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgcz0gXFxcIiVzKCVkLCAlZCVzKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHMpXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgYXNzZXJ0IHNbLTE6XSA9PSBcXFwiKVxcXCJcXG4gICAgICAgICAgICBzID0gc1s6LTFdICsgXFxcIiwgdHppbmZvPSVyXFxcIiAlIHNlbGYuX3R6aW5mbyArIFxcXCIpXFxcIlxcbiAgICAgICAgcmV0dXJuIHNcXG5cXG4gICAgZGVmIGlzb2Zvcm1hdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIElTTy5cXG5cXG4gICAgICAgIFRoaXMgaXMgJ0hIOk1NOlNTLm1tbW1tbSt6ejp6eicsIG9yICdISDpNTTpTUyt6ejp6eicgaWZcXG4gICAgICAgIHNlbGYubWljcm9zZWNvbmQgPT0gMC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcyA9IF9mb3JtYXRfdGltZShzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpXFxuICAgICAgICB0eiA9IHNlbGYuX3R6c3RyKClcXG4gICAgICAgIGlmIHR6OlxcbiAgICAgICAgICAgIHMgKz0gdHpcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIF9fc3RyX18gPSBpc29mb3JtYXRcXG5cXG4gICAgZGVmIHN0cmZ0aW1lKHNlbGYsIGZvcm1hdCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGb3JtYXQgdXNpbmcgc3RyZnRpbWUoKS4gIFRoZSBkYXRlIHBhcnQgb2YgdGhlIHRpbWVzdGFtcCBwYXNzZWRcXG4gICAgICAgIHRvIHVuZGVybHlpbmcgc3RyZnRpbWUgc2hvdWxkIG5vdCBiZSB1c2VkLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIFRoZSB5ZWFyIG11c3QgYmUgPj0gX01JTllFQVJGTVQgZWxzZSBQeXRob24ncyBzdHJmdGltZSBpbXBsZW1lbnRhdGlvblxcbiAgICAgICAgIyBjYW4gcmFpc2UgYSBib2d1cyBleGNlcHRpb24uXFxuICAgICAgICB0aW1ldHVwbGUgPSAoMTkwMCwgMSwgMSxcXG4gICAgICAgICAgICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAwLCAxLCAtMSlcXG4gICAgICAgIHJldHVybiBfd3JhcF9zdHJmdGltZShzZWxmLCBmb3JtYXQsIHRpbWV0dXBsZSlcXG5cXG4gICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm10KTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZtdCwgKHN0ciwgdW5pY29kZSkpOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIl9fZm9ybWF0X18gZXhwZWN0cyBzdHIgb3IgdW5pY29kZSwgbm90ICVzXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuX19jbGFzc19fLl9fbmFtZV9fKVxcbiAgICAgICAgaWYgbGVuKGZtdCkgIT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zdHJmdGltZShmbXQpXFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYpXFxuXFxuICAgICMgVGltZXpvbmUgZnVuY3Rpb25zXFxuXFxuICAgIGRlZiB1dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWV6b25lIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDIChuZWdhdGl2ZSB3ZXN0IG9mXFxuICAgICAgICBVVEMpLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby51dGNvZmZzZXQoTm9uZSlcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJ1dGNvZmZzZXRcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX3V0Y29mZnNldChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICBkZWYgdHpuYW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBuYW1lLlxcblxcbiAgICAgICAgTm90ZSB0aGF0IHRoZSBuYW1lIGlzIDEwMCUgaW5mb3JtYXRpb25hbCAtLSB0aGVyZSdzIG5vIHJlcXVpcmVtZW50IHRoYXRcXG4gICAgICAgIGl0IG1lYW4gYW55dGhpbmcgaW4gcGFydGljdWxhci4gRm9yIGV4YW1wbGUsIFxcXCJHTVRcXFwiLCBcXFwiVVRDXFxcIiwgXFxcIi01MDBcXFwiLFxcbiAgICAgICAgXFxcIi01OjAwXFxcIiwgXFxcIkVEVFxcXCIsIFxcXCJVUy9FYXN0ZXJuXFxcIiwgXFxcIkFtZXJpY2EvTmV3IFlvcmtcXFwiIGFyZSBhbGwgdmFsaWQgcmVwbGllcy5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG5hbWUgPSBzZWxmLl90emluZm8udHpuYW1lKE5vbmUpXFxuICAgICAgICBfY2hlY2tfdHpuYW1lKG5hbWUpXFxuICAgICAgICByZXR1cm4gbmFtZVxcblxcbiAgICBkZWYgZHN0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIDAgaWYgRFNUIGlzIG5vdCBpbiBlZmZlY3QsIG9yIHRoZSBEU1Qgb2Zmc2V0IChpbiBtaW51dGVzXFxuICAgICAgICBlYXN0d2FyZCkgaWYgRFNUIGlzIGluIGVmZmVjdC5cXG5cXG4gICAgICAgIFRoaXMgaXMgcHVyZWx5IGluZm9ybWF0aW9uYWw7IHRoZSBEU1Qgb2Zmc2V0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG9cXG4gICAgICAgIHRoZSBVVEMgb2Zmc2V0IHJldHVybmVkIGJ5IHV0Y29mZnNldCgpIGlmIGFwcGxpY2FibGUsIHNvIHRoZXJlJ3Mgbm9cXG4gICAgICAgIG5lZWQgdG8gY29uc3VsdCBkc3QoKSB1bmxlc3MgeW91J3JlIGludGVyZXN0ZWQgaW4gZGlzcGxheWluZyB0aGUgRFNUXFxuICAgICAgICBpbmZvLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLmRzdChOb25lKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcImRzdFxcXCIsIG9mZnNldClcXG4gICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBvZmZzZXQgPSB0aW1lZGVsdGEuX2NyZWF0ZSgwLCBvZmZzZXQgKiA2MCwgMCwgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgIyBSZXR1cm4gYW4gaW50ZWdlciAob3IgTm9uZSkgaW5zdGVhZCBvZiBhIHRpbWVkZWx0YSAob3IgTm9uZSkuXFxuICAgIGRlZiBfZHN0KHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3QoTm9uZSlcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgIGRlZiByZXBsYWNlKHNlbGYsIGhvdXI9Tm9uZSwgbWludXRlPU5vbmUsIHNlY29uZD1Ob25lLCBtaWNyb3NlY29uZD1Ob25lLFxcbiAgICAgICAgICAgICAgICB0emluZm89VHJ1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gYSBuZXcgdGltZSB3aXRoIG5ldyB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGRzLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaG91ciBpcyBOb25lOlxcbiAgICAgICAgICAgIGhvdXIgPSBzZWxmLmhvdXJcXG4gICAgICAgIGlmIG1pbnV0ZSBpcyBOb25lOlxcbiAgICAgICAgICAgIG1pbnV0ZSA9IHNlbGYubWludXRlXFxuICAgICAgICBpZiBzZWNvbmQgaXMgTm9uZTpcXG4gICAgICAgICAgICBzZWNvbmQgPSBzZWxmLnNlY29uZFxcbiAgICAgICAgaWYgbWljcm9zZWNvbmQgaXMgTm9uZTpcXG4gICAgICAgICAgICBtaWNyb3NlY29uZCA9IHNlbGYubWljcm9zZWNvbmRcXG4gICAgICAgIGlmIHR6aW5mbyBpcyBUcnVlOlxcbiAgICAgICAgICAgIHR6aW5mbyA9IHNlbGYudHppbmZvXFxuICAgICAgICByZXR1cm4gdGltZShob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsIHR6aW5mbylcXG5cXG4gICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5zZWNvbmQgb3Igc2VsZi5taWNyb3NlY29uZDpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdXRjb2Zmc2V0KCkgb3IgMFxcbiAgICAgICAgcmV0dXJuIHNlbGYuaG91ciAqIDYwICsgc2VsZi5taW51dGUgIT0gb2Zmc2V0XFxuXFxuX3RpbWVfY2xhc3MgPSB0aW1lICAjIHNvIGZ1bmN0aW9ucyB3LyBhcmdzIG5hbWVkIFxcXCJ0aW1lXFxcIiBjYW4gZ2V0IGF0IHRoZSBjbGFzc1xcblxcbnRpbWUubWluID0gdGltZSgwLCAwLCAwKVxcbnRpbWUubWF4ID0gdGltZSgyMywgNTksIDU5LCA5OTk5OTkpXFxudGltZS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKVxcblxcbmNsYXNzIGRhdGV0aW1lKGRhdGUpOlxcbiAgICBcXFwiXFxcIlxcXCJkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5WywgaG91clssIG1pbnV0ZVssIHNlY29uZFssIG1pY3Jvc2Vjb25kWyx0emluZm9dXV1dXSlcXG5cXG4gICAgVGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgYXJndW1lbnRzIGFyZSByZXF1aXJlZC4gdHppbmZvIG1heSBiZSBOb25lLCBvciBhblxcbiAgICBpbnN0YW5jZSBvZiBhIHR6aW5mbyBzdWJjbGFzcy4gVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgbWF5IGJlIGludHMgb3IgbG9uZ3MuXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSBkYXRlLl9fc2xvdHNfXyArIHRpbWUuX19zbG90c19fXFxuXFxuICAgIGRlZiBfX25ld19fKGNscywgeWVhciwgbW9udGg9Tm9uZSwgZGF5PU5vbmUsIGhvdXI9MCwgbWludXRlPTAsIHNlY29uZD0wLFxcbiAgICAgICAgICAgICAgICBtaWNyb3NlY29uZD0wLCB0emluZm89Tm9uZSk6XFxuICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gX2NoZWNrX2RhdGVfZmllbGRzKHllYXIsIG1vbnRoLCBkYXkpXFxuICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQgPSBfY2hlY2tfdGltZV9maWVsZHMoXFxuICAgICAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kKVxcbiAgICAgICAgX2NoZWNrX3R6aW5mb19hcmcodHppbmZvKVxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX3llYXIgPSB5ZWFyXFxuICAgICAgICBzZWxmLl9tb250aCA9IG1vbnRoXFxuICAgICAgICBzZWxmLl9kYXkgPSBkYXlcXG4gICAgICAgIHNlbGYuX2hvdXIgPSBob3VyXFxuICAgICAgICBzZWxmLl9taW51dGUgPSBtaW51dGVcXG4gICAgICAgIHNlbGYuX3NlY29uZCA9IHNlY29uZFxcbiAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgPSBtaWNyb3NlY29uZFxcbiAgICAgICAgc2VsZi5fdHppbmZvID0gdHppbmZvXFxuICAgICAgICBzZWxmLl9oYXNoY29kZSA9IC0xXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICAjIFJlYWQtb25seSBmaWVsZCBhY2Nlc3NvcnNcXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBob3VyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiaG91ciAoMC0yMylcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9ob3VyXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWludXRlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWludXRlICgwLTU5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21pbnV0ZVxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHNlY29uZChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcInNlY29uZCAoMC01OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zZWNvbmRcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtaWNyb3NlY29uZChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1pY3Jvc2Vjb25kICgwLTk5OTk5OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9taWNyb3NlY29uZFxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHR6aW5mbyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcInRpbWV6b25lIGluZm8gb2JqZWN0XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fdHppbmZvXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgZnJvbXRpbWVzdGFtcChjbHMsIHRpbWVzdGFtcCwgdHo9Tm9uZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb25zdHJ1Y3QgYSBkYXRldGltZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS5cXG5cXG4gICAgICAgIEEgdGltZXpvbmUgaW5mbyBvYmplY3QgbWF5IGJlIHBhc3NlZCBpbiBhcyB3ZWxsLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY2hlY2tfdHppbmZvX2FyZyh0eilcXG4gICAgICAgIGNvbnZlcnRlciA9IF90aW1lLmxvY2FsdGltZSBpZiB0eiBpcyBOb25lIGVsc2UgX3RpbWUuZ210aW1lXFxuICAgICAgICBzZWxmID0gY2xzLl9mcm9tX3RpbWVzdGFtcChjb252ZXJ0ZXIsIHRpbWVzdGFtcCwgdHopXFxuICAgICAgICBpZiB0eiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBzZWxmID0gdHouZnJvbXV0YyhzZWxmKVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiB1dGNmcm9tdGltZXN0YW1wKGNscywgdCk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgVVRDIGRhdGV0aW1lIGZyb20gYSBQT1NJWCB0aW1lc3RhbXAgKGxpa2UgdGltZS50aW1lKCkpLlxcXCJcXG4gICAgICAgIHJldHVybiBjbHMuX2Zyb21fdGltZXN0YW1wKF90aW1lLmdtdGltZSwgdCwgTm9uZSlcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBfZnJvbV90aW1lc3RhbXAoY2xzLCBjb252ZXJ0ZXIsIHRpbWVzdGFtcCwgdHppbmZvKTpcXG4gICAgICAgIHRfZnVsbCA9IHRpbWVzdGFtcFxcbiAgICAgICAgdGltZXN0YW1wID0gaW50KF9tYXRoLmZsb29yKHRpbWVzdGFtcCkpXFxuICAgICAgICBmcmFjID0gdF9mdWxsIC0gdGltZXN0YW1wXFxuICAgICAgICB1cyA9IF9yb3VuZChmcmFjICogMWU2KVxcblxcbiAgICAgICAgIyBJZiB0aW1lc3RhbXAgaXMgbGVzcyB0aGFuIG9uZSBtaWNyb3NlY29uZCBzbWFsbGVyIHRoYW4gYVxcbiAgICAgICAgIyBmdWxsIHNlY29uZCwgdXMgY2FuIGJlIHJvdW5kZWQgdXAgdG8gMTAwMDAwMC4gIEluIHRoaXMgY2FzZSxcXG4gICAgICAgICMgcm9sbCBvdmVyIHRvIHNlY29uZHMsIG90aGVyd2lzZSwgVmFsdWVFcnJvciBpcyByYWlzZWRcXG4gICAgICAgICMgYnkgdGhlIGNvbnN0cnVjdG9yLlxcbiAgICAgICAgaWYgdXMgPT0gMTAwMDAwMDpcXG4gICAgICAgICAgICB0aW1lc3RhbXAgKz0gMVxcbiAgICAgICAgICAgIHVzID0gMFxcbiAgICAgICAgeSwgbSwgZCwgaGgsIG1tLCBzcywgd2Vla2RheSwgamRheSwgZHN0ID0gY29udmVydGVyKHRpbWVzdGFtcClcXG4gICAgICAgIHNzID0gbWluKHNzLCA1OSkgICAgIyBjbGFtcCBvdXQgbGVhcCBzZWNvbmRzIGlmIHRoZSBwbGF0Zm9ybSBoYXMgdGhlbVxcbiAgICAgICAgcmV0dXJuIGNscyh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvKVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIG5vdyhjbHMsIHR6PU5vbmUpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGV0aW1lIGZyb20gdGltZS50aW1lKCkgYW5kIG9wdGlvbmFsIHRpbWUgem9uZSBpbmZvLlxcXCJcXG4gICAgICAgIHQgPSBfdGltZS50aW1lKClcXG4gICAgICAgIHJldHVybiBjbHMuZnJvbXRpbWVzdGFtcCh0LCB0eilcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiB1dGNub3coY2xzKTpcXG4gICAgICAgIFxcXCJDb25zdHJ1Y3QgYSBVVEMgZGF0ZXRpbWUgZnJvbSB0aW1lLnRpbWUoKS5cXFwiXFxuICAgICAgICB0ID0gX3RpbWUudGltZSgpXFxuICAgICAgICByZXR1cm4gY2xzLnV0Y2Zyb210aW1lc3RhbXAodClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBjb21iaW5lKGNscywgZGF0ZSwgdGltZSk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgZGF0ZXRpbWUgZnJvbSBhIGdpdmVuIGRhdGUgYW5kIGEgZ2l2ZW4gdGltZS5cXFwiXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRlLCBfZGF0ZV9jbGFzcyk6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJkYXRlIGFyZ3VtZW50IG11c3QgYmUgYSBkYXRlIGluc3RhbmNlXFxcIilcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRpbWUsIF90aW1lX2NsYXNzKTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcInRpbWUgYXJndW1lbnQgbXVzdCBiZSBhIHRpbWUgaW5zdGFuY2VcXFwiKVxcbiAgICAgICAgcmV0dXJuIGNscyhkYXRlLnllYXIsIGRhdGUubW9udGgsIGRhdGUuZGF5LFxcbiAgICAgICAgICAgICAgICAgICB0aW1lLmhvdXIsIHRpbWUubWludXRlLCB0aW1lLnNlY29uZCwgdGltZS5taWNyb3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgdGltZS50emluZm8pXFxuXFxuICAgIGRlZiB0aW1ldHVwbGUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGxvY2FsIHRpbWUgdHVwbGUgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuXFxcIlxcbiAgICAgICAgZHN0ID0gc2VsZi5fZHN0KClcXG4gICAgICAgIGlmIGRzdCBpcyBOb25lOlxcbiAgICAgICAgICAgIGRzdCA9IC0xXFxuICAgICAgICBlbGlmIGRzdDpcXG4gICAgICAgICAgICBkc3QgPSAxXFxuICAgICAgICByZXR1cm4gX2J1aWxkX3N0cnVjdF90aW1lKHNlbGYueWVhciwgc2VsZi5tb250aCwgc2VsZi5kYXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QpXFxuXFxuICAgIGRlZiB1dGN0aW1ldHVwbGUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIFVUQyB0aW1lIHR1cGxlIGNvbXBhdGlibGUgd2l0aCB0aW1lLmdtdGltZSgpLlxcXCJcXG4gICAgICAgIHksIG0sIGQgPSBzZWxmLnllYXIsIHNlbGYubW9udGgsIHNlbGYuZGF5XFxuICAgICAgICBoaCwgbW0sIHNzID0gc2VsZi5ob3VyLCBzZWxmLm1pbnV0ZSwgc2VsZi5zZWNvbmRcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICBpZiBvZmZzZXQ6ICAjIG5laXRoZXIgTm9uZSBub3IgMFxcbiAgICAgICAgICAgIG1tIC09IG9mZnNldFxcbiAgICAgICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MsIF8gPSBfbm9ybWFsaXplX2RhdGV0aW1lKFxcbiAgICAgICAgICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCAwLCBpZ25vcmVfb3ZlcmZsb3c9VHJ1ZSlcXG4gICAgICAgIHJldHVybiBfYnVpbGRfc3RydWN0X3RpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgMClcXG5cXG4gICAgZGVmIGRhdGUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIHRoZSBkYXRlIHBhcnQuXFxcIlxcbiAgICAgICAgcmV0dXJuIGRhdGUoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG5cXG4gICAgZGVmIHRpbWUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIHRoZSB0aW1lIHBhcnQsIHdpdGggdHppbmZvIE5vbmUuXFxcIlxcbiAgICAgICAgcmV0dXJuIHRpbWUoc2VsZi5ob3VyLCBzZWxmLm1pbnV0ZSwgc2VsZi5zZWNvbmQsIHNlbGYubWljcm9zZWNvbmQpXFxuXFxuICAgIGRlZiB0aW1ldHooc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIHRoZSB0aW1lIHBhcnQsIHdpdGggc2FtZSB0emluZm8uXFxcIlxcbiAgICAgICAgcmV0dXJuIHRpbWUoc2VsZi5ob3VyLCBzZWxmLm1pbnV0ZSwgc2VsZi5zZWNvbmQsIHNlbGYubWljcm9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl90emluZm8pXFxuXFxuICAgIGRlZiByZXBsYWNlKHNlbGYsIHllYXI9Tm9uZSwgbW9udGg9Tm9uZSwgZGF5PU5vbmUsIGhvdXI9Tm9uZSxcXG4gICAgICAgICAgICAgICAgbWludXRlPU5vbmUsIHNlY29uZD1Ob25lLCBtaWNyb3NlY29uZD1Ob25lLCB0emluZm89VHJ1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gYSBuZXcgZGF0ZXRpbWUgd2l0aCBuZXcgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkcy5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHllYXIgaXMgTm9uZTpcXG4gICAgICAgICAgICB5ZWFyID0gc2VsZi55ZWFyXFxuICAgICAgICBpZiBtb250aCBpcyBOb25lOlxcbiAgICAgICAgICAgIG1vbnRoID0gc2VsZi5tb250aFxcbiAgICAgICAgaWYgZGF5IGlzIE5vbmU6XFxuICAgICAgICAgICAgZGF5ID0gc2VsZi5kYXlcXG4gICAgICAgIGlmIGhvdXIgaXMgTm9uZTpcXG4gICAgICAgICAgICBob3VyID0gc2VsZi5ob3VyXFxuICAgICAgICBpZiBtaW51dGUgaXMgTm9uZTpcXG4gICAgICAgICAgICBtaW51dGUgPSBzZWxmLm1pbnV0ZVxcbiAgICAgICAgaWYgc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgc2Vjb25kID0gc2VsZi5zZWNvbmRcXG4gICAgICAgIGlmIG1pY3Jvc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWljcm9zZWNvbmQgPSBzZWxmLm1pY3Jvc2Vjb25kXFxuICAgICAgICBpZiB0emluZm8gaXMgVHJ1ZTpcXG4gICAgICAgICAgICB0emluZm8gPSBzZWxmLnR6aW5mb1xcbiAgICAgICAgcmV0dXJuIGRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pXFxuXFxuICAgIGRlZiBhc3RpbWV6b25lKHNlbGYsIHR6KTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHR6LCB0emluZm8pOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwidHogYXJndW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB0emluZm9cXFwiKVxcblxcbiAgICAgICAgbXl0eiA9IHNlbGYudHppbmZvXFxuICAgICAgICBpZiBteXR6IGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiYXN0aW1lem9uZSgpIHJlcXVpcmVzIGFuIGF3YXJlIGRhdGV0aW1lXFxcIilcXG5cXG4gICAgICAgIGlmIHR6IGlzIG15dHo6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgICAgICMgQ29udmVydCBzZWxmIHRvIFVUQywgYW5kIGF0dGFjaCB0aGUgbmV3IHRpbWUgem9uZSBvYmplY3QuXFxuICAgICAgICBteW9mZnNldCA9IHNlbGYudXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG15b2Zmc2V0IGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiYXN0aW1lem9uZSgpIHJlcXVpcmVzIGFuIGF3YXJlIGRhdGV0aW1lXFxcIilcXG4gICAgICAgIHV0YyA9IChzZWxmIC0gbXlvZmZzZXQpLnJlcGxhY2UodHppbmZvPXR6KVxcblxcbiAgICAgICAgIyBDb252ZXJ0IGZyb20gVVRDIHRvIHR6J3MgbG9jYWwgdGltZS5cXG4gICAgICAgIHJldHVybiB0ei5mcm9tdXRjKHV0YylcXG5cXG4gICAgIyBXYXlzIHRvIHByb2R1Y2UgYSBzdHJpbmcuXFxuXFxuICAgIGRlZiBjdGltZShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gY3RpbWUoKSBzdHlsZSBzdHJpbmcuXFxcIlxcbiAgICAgICAgd2Vla2RheSA9IHNlbGYudG9vcmRpbmFsKCkgJSA3IG9yIDdcXG4gICAgICAgIHJldHVybiBcXFwiJXMgJXMgJTJkICUwMmQ6JTAyZDolMDJkICUwNGRcXFwiICUgKFxcbiAgICAgICAgICAgIF9EQVlOQU1FU1t3ZWVrZGF5XSxcXG4gICAgICAgICAgICBfTU9OVEhOQU1FU1tzZWxmLl9tb250aF0sXFxuICAgICAgICAgICAgc2VsZi5fZGF5LFxcbiAgICAgICAgICAgIHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgIHNlbGYuX3llYXIpXFxuXFxuICAgIGRlZiBpc29mb3JtYXQoc2VsZiwgc2VwPSdUJyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uXFxuXFxuICAgICAgICBUaGlzIGlzICdZWVlZLU1NLUREIEhIOk1NOlNTLm1tbW1tbScsIG9yICdZWVlZLU1NLUREIEhIOk1NOlNTJyBpZlxcbiAgICAgICAgc2VsZi5taWNyb3NlY29uZCA9PSAwLlxcblxcbiAgICAgICAgSWYgc2VsZi50emluZm8gaXMgbm90IE5vbmUsIHRoZSBVVEMgb2Zmc2V0IGlzIGFsc28gYXR0YWNoZWQsIGdpdmluZ1xcbiAgICAgICAgJ1lZWVktTU0tREQgSEg6TU06U1MubW1tbW1tK0hIOk1NJyBvciAnWVlZWS1NTS1ERCBISDpNTTpTUytISDpNTScuXFxuXFxuICAgICAgICBPcHRpb25hbCBhcmd1bWVudCBzZXAgc3BlY2lmaWVzIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiBkYXRlIGFuZFxcbiAgICAgICAgdGltZSwgZGVmYXVsdCAnVCcuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHMgPSAoXFxcIiUwNGQtJTAyZC0lMDJkJWNcXFwiICUgKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXksIHNlcCkgK1xcbiAgICAgICAgICAgICBfZm9ybWF0X3RpbWUoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCkpXFxuICAgICAgICBvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgb2ZmIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGlmIG9mZiA8IDA6XFxuICAgICAgICAgICAgICAgIHNpZ24gPSBcXFwiLVxcXCJcXG4gICAgICAgICAgICAgICAgb2ZmID0gLW9mZlxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNpZ24gPSBcXFwiK1xcXCJcXG4gICAgICAgICAgICBoaCwgbW0gPSBkaXZtb2Qob2ZmLCA2MClcXG4gICAgICAgICAgICBzICs9IFxcXCIlcyUwMmQ6JTAyZFxcXCIgJSAoc2lnbiwgaGgsIG1tKVxcbiAgICAgICAgcmV0dXJuIHNcXG5cXG4gICAgZGVmIF9fcmVwcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29udmVydCB0byBmb3JtYWwgc3RyaW5nLCBmb3IgcmVwcigpLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgTCA9IFtzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LCAgIyBUaGVzZSBhcmUgbmV2ZXIgemVyb1xcbiAgICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwgc2VsZi5fbWljcm9zZWNvbmRdXFxuICAgICAgICBpZiBMWy0xXSA9PSAwOlxcbiAgICAgICAgICAgIGRlbCBMWy0xXVxcbiAgICAgICAgaWYgTFstMV0gPT0gMDpcXG4gICAgICAgICAgICBkZWwgTFstMV1cXG4gICAgICAgIHMgPSBcXFwiLCBcXFwiLmpvaW4obWFwKHN0ciwgTCkpXFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyBkYXRldGltZSBlbHNlIFxcXCJcXFwiXFxuICAgICAgICBzID0gXFxcIiVzKCVzKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHMpXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgYXNzZXJ0IHNbLTE6XSA9PSBcXFwiKVxcXCJcXG4gICAgICAgICAgICBzID0gc1s6LTFdICsgXFxcIiwgdHppbmZvPSVyXFxcIiAlIHNlbGYuX3R6aW5mbyArIFxcXCIpXFxcIlxcbiAgICAgICAgcmV0dXJuIHNcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBcXFwiQ29udmVydCB0byBzdHJpbmcsIGZvciBzdHIoKS5cXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5pc29mb3JtYXQoc2VwPScgJylcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBzdHJwdGltZShjbHMsIGRhdGVfc3RyaW5nLCBmb3JtYXQpOlxcbiAgICAgICAgJ3N0cmluZywgZm9ybWF0IC0+IG5ldyBkYXRldGltZSBwYXJzZWQgZnJvbSBhIHN0cmluZyAobGlrZSB0aW1lLnN0cnB0aW1lKCkpLidcXG4gICAgICAgIGZyb20gX3N0cnB0aW1lIGltcG9ydCBfc3RycHRpbWVcXG4gICAgICAgICMgX3N0cnB0aW1lLl9zdHJwdGltZSByZXR1cm5zIGEgdHdvLWVsZW1lbnQgdHVwbGUuICBUaGUgZmlyc3RcXG4gICAgICAgICMgZWxlbWVudCBpcyBhIHRpbWUuc3RydWN0X3RpbWUgb2JqZWN0LiAgVGhlIHNlY29uZCBpcyB0aGVcXG4gICAgICAgICMgbWljcm9zZWNvbmRzICh3aGljaCBhcmUgbm90IGRlZmluZWQgZm9yIHRpbWUuc3RydWN0X3RpbWUpLlxcbiAgICAgICAgc3RydWN0LCBtaWNyb3MgPSBfc3RycHRpbWUoZGF0ZV9zdHJpbmcsIGZvcm1hdClcXG4gICAgICAgIHJldHVybiBjbHMoKihzdHJ1Y3RbMDo2XSArIChtaWNyb3MsKSkpXFxuXFxuICAgIGRlZiB1dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWV6b25lIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDIChuZWdhdGl2ZSB3ZXN0IG9mXFxuICAgICAgICBVVEMpLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby51dGNvZmZzZXQoc2VsZilcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJ1dGNvZmZzZXRcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX3V0Y29mZnNldChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICBkZWYgdHpuYW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBuYW1lLlxcblxcbiAgICAgICAgTm90ZSB0aGF0IHRoZSBuYW1lIGlzIDEwMCUgaW5mb3JtYXRpb25hbCAtLSB0aGVyZSdzIG5vIHJlcXVpcmVtZW50IHRoYXRcXG4gICAgICAgIGl0IG1lYW4gYW55dGhpbmcgaW4gcGFydGljdWxhci4gRm9yIGV4YW1wbGUsIFxcXCJHTVRcXFwiLCBcXFwiVVRDXFxcIiwgXFxcIi01MDBcXFwiLFxcbiAgICAgICAgXFxcIi01OjAwXFxcIiwgXFxcIkVEVFxcXCIsIFxcXCJVUy9FYXN0ZXJuXFxcIiwgXFxcIkFtZXJpY2EvTmV3IFlvcmtcXFwiIGFyZSBhbGwgdmFsaWQgcmVwbGllcy5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG5hbWUgPSBzZWxmLl90emluZm8udHpuYW1lKHNlbGYpXFxuICAgICAgICBfY2hlY2tfdHpuYW1lKG5hbWUpXFxuICAgICAgICByZXR1cm4gbmFtZVxcblxcbiAgICBkZWYgZHN0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIDAgaWYgRFNUIGlzIG5vdCBpbiBlZmZlY3QsIG9yIHRoZSBEU1Qgb2Zmc2V0IChpbiBtaW51dGVzXFxuICAgICAgICBlYXN0d2FyZCkgaWYgRFNUIGlzIGluIGVmZmVjdC5cXG5cXG4gICAgICAgIFRoaXMgaXMgcHVyZWx5IGluZm9ybWF0aW9uYWw7IHRoZSBEU1Qgb2Zmc2V0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG9cXG4gICAgICAgIHRoZSBVVEMgb2Zmc2V0IHJldHVybmVkIGJ5IHV0Y29mZnNldCgpIGlmIGFwcGxpY2FibGUsIHNvIHRoZXJlJ3Mgbm9cXG4gICAgICAgIG5lZWQgdG8gY29uc3VsdCBkc3QoKSB1bmxlc3MgeW91J3JlIGludGVyZXN0ZWQgaW4gZGlzcGxheWluZyB0aGUgRFNUXFxuICAgICAgICBpbmZvLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLmRzdChzZWxmKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcImRzdFxcXCIsIG9mZnNldClcXG4gICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBvZmZzZXQgPSB0aW1lZGVsdGEuX2NyZWF0ZSgwLCBvZmZzZXQgKiA2MCwgMCwgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgIyBSZXR1cm4gYW4gaW50ZWdlciAob3IgTm9uZSkgaW5zdGVhZCBvZiBhIHRpbWVkZWx0YSAob3IgTm9uZSkuXFxuICAgIGRlZiBfZHN0KHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3Qoc2VsZilcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgQ29tcGFyaXNvbnMgb2YgZGF0ZXRpbWUgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA9PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG5cXG4gICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPD0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lKVxcbiAgICAgICAgbXl0eiA9IHNlbGYuX3R6aW5mb1xcbiAgICAgICAgb3R0eiA9IG90aGVyLl90emluZm9cXG4gICAgICAgIG15b2ZmID0gb3RvZmYgPSBOb25lXFxuXFxuICAgICAgICBpZiBteXR6IGlzIG90dHo6XFxuICAgICAgICAgICAgYmFzZV9jb21wYXJlID0gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBteXR6IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICBteW9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgaWYgb3R0eiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgb3RvZmYgPSBvdGhlci5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICBiYXNlX2NvbXBhcmUgPSBteW9mZiA9PSBvdG9mZlxcblxcbiAgICAgICAgaWYgYmFzZV9jb21wYXJlOlxcbiAgICAgICAgICAgIHJldHVybiBfY21wKChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlci5feWVhciwgb3RoZXIuX21vbnRoLCBvdGhlci5fZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5faG91ciwgb3RoZXIuX21pbnV0ZSwgb3RoZXIuX3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuX21pY3Jvc2Vjb25kKSlcXG4gICAgICAgIGlmIG15b2ZmIGlzIE5vbmUgb3Igb3RvZmYgaXMgTm9uZTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcImNhbid0IGNvbXBhcmUgb2Zmc2V0LW5haXZlIGFuZCBvZmZzZXQtYXdhcmUgZGF0ZXRpbWVzXFxcIilcXG4gICAgICAgICMgWFhYIFdoYXQgZm9sbG93cyBjb3VsZCBiZSBkb25lIG1vcmUgZWZmaWNpZW50bHkuLi5cXG4gICAgICAgIGRpZmYgPSBzZWxmIC0gb3RoZXIgICAgICMgdGhpcyB3aWxsIHRha2Ugb2Zmc2V0cyBpbnRvIGFjY291bnRcXG4gICAgICAgIGlmIGRpZmYuZGF5cyA8IDA6XFxuICAgICAgICAgICAgcmV0dXJuIC0xXFxuICAgICAgICByZXR1cm4gZGlmZiBhbmQgMSBvciAwXFxuXFxuICAgIGRlZiBfYWRkX3RpbWVkZWx0YShzZWxmLCBvdGhlciwgZmFjdG9yKTpcXG4gICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzID0gX25vcm1hbGl6ZV9kYXRldGltZShcXG4gICAgICAgICAgICBzZWxmLl95ZWFyLFxcbiAgICAgICAgICAgIHNlbGYuX21vbnRoLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSArIG90aGVyLmRheXMgKiBmYWN0b3IsXFxuICAgICAgICAgICAgc2VsZi5faG91cixcXG4gICAgICAgICAgICBzZWxmLl9taW51dGUsXFxuICAgICAgICAgICAgc2VsZi5fc2Vjb25kICsgb3RoZXIuc2Vjb25kcyAqIGZhY3RvcixcXG4gICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCArIG90aGVyLm1pY3Jvc2Vjb25kcyAqIGZhY3RvcilcXG4gICAgICAgIHJldHVybiBkYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvPXNlbGYuX3R6aW5mbylcXG5cXG4gICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIkFkZCBhIGRhdGV0aW1lIGFuZCBhIHRpbWVkZWx0YS5cXFwiXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAxKVxcblxcbiAgICBfX3JhZGRfXyA9IF9fYWRkX19cXG5cXG4gICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlN1YnRyYWN0IHR3byBkYXRldGltZXMsIG9yIGEgZGF0ZXRpbWUgYW5kIGEgdGltZWRlbHRhLlxcXCJcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZF90aW1lZGVsdGEob3RoZXIsIC0xKVxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICAgICAgZGVsdGFfZCA9IHNlbGYudG9vcmRpbmFsKCkgLSBvdGhlci50b29yZGluYWwoKVxcbiAgICAgICAgZGVsdGFfcyA9IChzZWxmLl9ob3VyIC0gb3RoZXIuX2hvdXIpICogMzYwMCArIFxcXFxcXG4gICAgICAgICAgICAgICAgICAoc2VsZi5fbWludXRlIC0gb3RoZXIuX21pbnV0ZSkgKiA2MCArIFxcXFxcXG4gICAgICAgICAgICAgICAgICAoc2VsZi5fc2Vjb25kIC0gb3RoZXIuX3NlY29uZClcXG4gICAgICAgIGRlbHRhX3VzID0gc2VsZi5fbWljcm9zZWNvbmQgLSBvdGhlci5fbWljcm9zZWNvbmRcXG4gICAgICAgIGJhc2UgPSB0aW1lZGVsdGEuX2NyZWF0ZShkZWx0YV9kLCBkZWx0YV9zLCBkZWx0YV91cywgVHJ1ZSlcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBvdGhlci5fdHppbmZvOlxcbiAgICAgICAgICAgIHJldHVybiBiYXNlXFxuICAgICAgICBteW9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICBvdG9mZiA9IG90aGVyLl91dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgbXlvZmYgPT0gb3RvZmY6XFxuICAgICAgICAgICAgcmV0dXJuIGJhc2VcXG4gICAgICAgIGlmIG15b2ZmIGlzIE5vbmUgb3Igb3RvZmYgaXMgTm9uZTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcImNhbid0IHN1YnRyYWN0IG9mZnNldC1uYWl2ZSBhbmQgb2Zmc2V0LWF3YXJlIGRhdGV0aW1lc1xcXCIpXFxuICAgICAgICByZXR1cm4gYmFzZSArIHRpbWVkZWx0YShtaW51dGVzID0gb3RvZmYtbXlvZmYpXFxuXFxuICAgIGRlZiBfX2hhc2hfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX2hhc2hjb2RlID09IC0xOlxcbiAgICAgICAgICAgIHR6b2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICBpZiB0em9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goc2VsZi5fZ2V0c3RhdGUoKVswXSlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBkYXlzID0gX3ltZDJvcmQoc2VsZi55ZWFyLCBzZWxmLm1vbnRoLCBzZWxmLmRheSlcXG4gICAgICAgICAgICAgICAgc2Vjb25kcyA9IHNlbGYuaG91ciAqIDM2MDAgKyAoc2VsZi5taW51dGUgLSB0em9mZikgKiA2MCArIHNlbGYuc2Vjb25kXFxuICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaCh0aW1lZGVsdGEoZGF5cywgc2Vjb25kcywgc2VsZi5taWNyb3NlY29uZCkpXFxuICAgICAgICByZXR1cm4gc2VsZi5faGFzaGNvZGVcXG5cXG5cXG5cXG5kYXRldGltZS5taW4gPSBkYXRldGltZSgxLCAxLCAxKVxcbmRhdGV0aW1lLm1heCA9IGRhdGV0aW1lKDk5OTksIDEyLCAzMSwgMjMsIDU5LCA1OSwgOTk5OTk5KVxcbmRhdGV0aW1lLnJlc29sdXRpb24gPSB0aW1lZGVsdGEobWljcm9zZWNvbmRzPTEpXFxuXFxuXFxuZGVmIF9pc293ZWVrMW1vbmRheSh5ZWFyKTpcXG4gICAgIyBIZWxwZXIgdG8gY2FsY3VsYXRlIHRoZSBkYXkgbnVtYmVyIG9mIHRoZSBNb25kYXkgc3RhcnRpbmcgd2VlayAxXFxuICAgICMgWFhYIFRoaXMgY291bGQgYmUgZG9uZSBtb3JlIGVmZmljaWVudGx5XFxuICAgIFRIVVJTREFZID0gM1xcbiAgICBmaXJzdGRheSA9IF95bWQyb3JkKHllYXIsIDEsIDEpXFxuICAgIGZpcnN0d2Vla2RheSA9IChmaXJzdGRheSArIDYpICUgNyAgIyBTZWUgd2Vla2RheSgpIGFib3ZlXFxuICAgIHdlZWsxbW9uZGF5ID0gZmlyc3RkYXkgLSBmaXJzdHdlZWtkYXlcXG4gICAgaWYgZmlyc3R3ZWVrZGF5ID4gVEhVUlNEQVk6XFxuICAgICAgICB3ZWVrMW1vbmRheSArPSA3XFxuICAgIHJldHVybiB3ZWVrMW1vbmRheVxcblxcblxcXCJcXFwiXFxcIlxcblNvbWUgdGltZSB6b25lIGFsZ2VicmEuICBGb3IgYSBkYXRldGltZSB4LCBsZXRcXG4gICAgeC5uID0geCBzdHJpcHBlZCBvZiBpdHMgdGltZXpvbmUgLS0gaXRzIG5haXZlIHRpbWUuXFxuICAgIHgubyA9IHgudXRjb2Zmc2V0KCksIGFuZCBhc3N1bWluZyB0aGF0IGRvZXNuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIG9yXFxuICAgICAgICAgIHJldHVybiBOb25lXFxuICAgIHguZCA9IHguZHN0KCksIGFuZCBhc3N1bWluZyB0aGF0IGRvZXNuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIG9yXFxuICAgICAgICAgIHJldHVybiBOb25lXFxuICAgIHgucyA9IHgncyBzdGFuZGFyZCBvZmZzZXQsIHgubyAtIHguZFxcblxcbk5vdyBzb21lIGRlcml2ZWQgcnVsZXMsIHdoZXJlIGsgaXMgYSBkdXJhdGlvbiAodGltZWRlbHRhKS5cXG5cXG4xLiB4Lm8gPSB4LnMgKyB4LmRcXG4gICBUaGlzIGZvbGxvd3MgZnJvbSB0aGUgZGVmaW5pdGlvbiBvZiB4LnMuXFxuXFxuMi4gSWYgeCBhbmQgeSBoYXZlIHRoZSBzYW1lIHR6aW5mbyBtZW1iZXIsIHgucyA9IHkucy5cXG4gICBUaGlzIGlzIGFjdHVhbGx5IGEgcmVxdWlyZW1lbnQsIGFuIGFzc3VtcHRpb24gd2UgbmVlZCB0byBtYWtlIGFib3V0XFxuICAgc2FuZSB0emluZm8gY2xhc3Nlcy5cXG5cXG4zLiBUaGUgbmFpdmUgVVRDIHRpbWUgY29ycmVzcG9uZGluZyB0byB4IGlzIHgubiAtIHguby5cXG4gICBUaGlzIGlzIGFnYWluIGEgcmVxdWlyZW1lbnQgZm9yIGEgc2FuZSB0emluZm8gY2xhc3MuXFxuXFxuNC4gKHgraykucyA9IHguc1xcbiAgIFRoaXMgZm9sbG93cyBmcm9tICMyLCBhbmQgdGhhdCBkYXRpbWV0aW1ldHordGltZWRlbHRhIHByZXNlcnZlcyB0emluZm8uXFxuXFxuNS4gKHgraykubiA9IHgubiArIGtcXG4gICBBZ2FpbiBmb2xsb3dzIGZyb20gaG93IGFyaXRobWV0aWMgaXMgZGVmaW5lZC5cXG5cXG5Ob3cgd2UgY2FuIGV4cGxhaW4gdHouZnJvbXV0Yyh4KS4gIExldCdzIGFzc3VtZSBpdCdzIGFuIGludGVyZXN0aW5nIGNhc2VcXG4obWVhbmluZyB0aGF0IHRoZSB2YXJpb3VzIHR6aW5mbyBtZXRob2RzIGV4aXN0LCBhbmQgZG9uJ3QgYmxvdyB1cCBvciByZXR1cm5cXG5Ob25lIHdoZW4gY2FsbGVkKS5cXG5cXG5UaGUgZnVuY3Rpb24gd2FudHMgdG8gcmV0dXJuIGEgZGF0ZXRpbWUgeSB3aXRoIHRpbWV6b25lIHR6LCBlcXVpdmFsZW50IHRvIHguXFxueCBpcyBhbHJlYWR5IGluIFVUQy5cXG5cXG5CeSAjMywgd2Ugd2FudFxcblxcbiAgICB5Lm4gLSB5Lm8gPSB4Lm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXVxcblxcblRoZSBhbGdvcml0aG0gc3RhcnRzIGJ5IGF0dGFjaGluZyB0eiB0byB4Lm4sIGFuZCBjYWxsaW5nIHRoYXQgeS4gIFNvXFxueC5uID0geS5uIGF0IHRoZSBzdGFydC4gIFRoZW4gaXQgd2FudHMgdG8gYWRkIGEgZHVyYXRpb24gayB0byB5LCBzbyB0aGF0IFsxXVxcbmJlY29tZXMgdHJ1ZTsgaW4gZWZmZWN0LCB3ZSB3YW50IHRvIHNvbHZlIFsyXSBmb3IgazpcXG5cXG4gICAoeStrKS5uIC0gKHkraykubyA9IHgubiAgICAgICAgICAgICAgICAgICAgICBbMl1cXG5cXG5CeSAjMSwgdGhpcyBpcyB0aGUgc2FtZSBhc1xcblxcbiAgICh5K2spLm4gLSAoKHkraykucyArICh5K2spLmQpID0geC5uICAgICAgICAgIFszXVxcblxcbkJ5ICM1LCAoeStrKS5uID0geS5uICsgaywgd2hpY2ggZXF1YWxzIHgubiArIGsgYmVjYXVzZSB4Lm49eS5uIGF0IHRoZSBzdGFydC5cXG5TdWJzdGl0dXRpbmcgdGhhdCBpbnRvIFszXSxcXG5cXG4gICB4Lm4gKyBrIC0gKHkraykucyAtICh5K2spLmQgPSB4Lm47IHRoZSB4Lm4gdGVybXMgY2FuY2VsLCBsZWF2aW5nXFxuICAgayAtICh5K2spLnMgLSAoeStrKS5kID0gMDsgcmVhcnJhbmdpbmcsXFxuICAgayA9ICh5K2spLnMgLSAoeStrKS5kOyBieSAjNCwgKHkraykucyA9PSB5LnMsIHNvXFxuICAgayA9IHkucyAtICh5K2spLmRcXG5cXG5PbiB0aGUgUkhTLCAoeStrKS5kIGNhbid0IGJlIGNvbXB1dGVkIGRpcmVjdGx5LCBidXQgeS5zIGNhbiBiZSwgYW5kIHdlXFxuYXBwcm94aW1hdGUgayBieSBpZ25vcmluZyB0aGUgKHkraykuZCB0ZXJtIGF0IGZpcnN0LiAgTm90ZSB0aGF0IGsgY2FuJ3QgYmVcXG52ZXJ5IGxhcmdlLCBzaW5jZSBhbGwgb2Zmc2V0LXJldHVybmluZyBtZXRob2RzIHJldHVybiBhIGR1cmF0aW9uIG9mIG1hZ25pdHVkZVxcbmxlc3MgdGhhbiAyNCBob3Vycy4gIEZvciB0aGF0IHJlYXNvbiwgaWYgeSBpcyBmaXJtbHkgaW4gc3RkIHRpbWUsICh5K2spLmQgbXVzdFxcbmJlIDAsIHNvIGlnbm9yaW5nIGl0IGhhcyBubyBjb25zZXF1ZW5jZSB0aGVuLlxcblxcbkluIGFueSBjYXNlLCB0aGUgbmV3IHZhbHVlIGlzXFxuXFxuICAgIHogPSB5ICsgeS5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzRdXFxuXFxuSXQncyBoZWxwZnVsIHRvIHN0ZXAgYmFjayBhdCBsb29rIGF0IFs0XSBmcm9tIGEgaGlnaGVyIGxldmVsOiAgaXQncyBzaW1wbHlcXG5tYXBwaW5nIGZyb20gVVRDIHRvIHR6J3Mgc3RhbmRhcmQgdGltZS5cXG5cXG5BdCB0aGlzIHBvaW50LCBpZlxcblxcbiAgICB6Lm4gLSB6Lm8gPSB4Lm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs1XVxcblxcbndlIGhhdmUgYW4gZXF1aXZhbGVudCB0aW1lLCBhbmQgYXJlIGFsbW9zdCBkb25lLiAgVGhlIGluc2VjdXJpdHkgaGVyZSBpc1xcbmF0IHRoZSBzdGFydCBvZiBkYXlsaWdodCB0aW1lLiAgUGljdHVyZSBVUyBFYXN0ZXJuIGZvciBjb25jcmV0ZW5lc3MuICBUaGUgd2FsbFxcbnRpbWUganVtcHMgZnJvbSAxOjU5IHRvIDM6MDAsIGFuZCB3YWxsIGhvdXJzIG9mIHRoZSBmb3JtIDI6TU0gZG9uJ3QgbWFrZSBnb29kXFxuc2Vuc2UgdGhlbi4gIFRoZSBkb2NzIGFzayB0aGF0IGFuIEVhc3Rlcm4gdHppbmZvIGNsYXNzIGNvbnNpZGVyIHN1Y2ggYSB0aW1lIHRvXFxuYmUgRURUIChiZWNhdXNlIGl0J3MgXFxcImFmdGVyIDJcXFwiKSwgd2hpY2ggaXMgYSByZWR1bmRhbnQgc3BlbGxpbmcgb2YgMTpNTSBFU1RcXG5vbiB0aGUgZGF5IERTVCBzdGFydHMuICBXZSB3YW50IHRvIHJldHVybiB0aGUgMTpNTSBFU1Qgc3BlbGxpbmcgYmVjYXVzZSB0aGF0J3NcXG50aGUgb25seSBzcGVsbGluZyB0aGF0IG1ha2VzIHNlbnNlIG9uIHRoZSBsb2NhbCB3YWxsIGNsb2NrLlxcblxcbkluIGZhY3QsIGlmIFs1XSBob2xkcyBhdCB0aGlzIHBvaW50LCB3ZSBkbyBoYXZlIHRoZSBzdGFuZGFyZC10aW1lIHNwZWxsaW5nLFxcbmJ1dCB0aGF0IHRha2VzIGEgYml0IG9mIHByb29mLiAgV2UgZmlyc3QgcHJvdmUgYSBzdHJvbmdlciByZXN1bHQuICBXaGF0J3MgdGhlXFxuZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBMSFMgYW5kIFJIUyBvZiBbNV0/ICBMZXRcXG5cXG4gICAgZGlmZiA9IHgubiAtICh6Lm4gLSB6Lm8pICAgICAgICAgICAgICAgICAgICBbNl1cXG5cXG5Ob3dcXG4gICAgei5uID0gICAgICAgICAgICAgICAgICAgICAgIGJ5IFs0XVxcbiAgICAoeSArIHkucykubiA9ICAgICAgICAgICAgICAgYnkgIzVcXG4gICAgeS5uICsgeS5zID0gICAgICAgICAgICAgICAgIHNpbmNlIHkubiA9IHgublxcbiAgICB4Lm4gKyB5LnMgPSAgICAgICAgICAgICAgICAgc2luY2UgeiBhbmQgeSBhcmUgaGF2ZSB0aGUgc2FtZSB0emluZm8gbWVtYmVyLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkucyA9IHoucyBieSAjMlxcbiAgICB4Lm4gKyB6LnNcXG5cXG5QbHVnZ2luZyB0aGF0IGJhY2sgaW50byBbNl0gZ2l2ZXNcXG5cXG4gICAgZGlmZiA9XFxuICAgIHgubiAtICgoeC5uICsgei5zKSAtIHoubykgPSAgICAgZXhwYW5kaW5nXFxuICAgIHgubiAtIHgubiAtIHoucyArIHoubyA9ICAgICAgICAgY2FuY2VsbGluZ1xcbiAgICAtIHoucyArIHoubyA9ICAgICAgICAgICAgICAgICAgIGJ5ICMyXFxuICAgIHouZFxcblxcblNvIGRpZmYgPSB6LmQuXFxuXFxuSWYgWzVdIGlzIHRydWUgbm93LCBkaWZmID0gMCwgc28gei5kID0gMCB0b28sIGFuZCB3ZSBoYXZlIHRoZSBzdGFuZGFyZC10aW1lXFxuc3BlbGxpbmcgd2Ugd2FudGVkIGluIHRoZSBlbmRjYXNlIGRlc2NyaWJlZCBhYm92ZS4gIFdlJ3JlIGRvbmUuICBDb250cmFyaWx5LFxcbmlmIHouZCA9IDAsIHRoZW4gd2UgaGF2ZSBhIFVUQyBlcXVpdmFsZW50LCBhbmQgYXJlIGFsc28gZG9uZS5cXG5cXG5JZiBbNV0gaXMgbm90IHRydWUgbm93LCBkaWZmID0gei5kICE9IDAsIGFuZCB6LmQgaXMgdGhlIG9mZnNldCB3ZSBuZWVkIHRvXFxuYWRkIHRvIHogKGluIGVmZmVjdCwgeiBpcyBpbiB0eidzIHN0YW5kYXJkIHRpbWUsIGFuZCB3ZSBuZWVkIHRvIHNoaWZ0IHRoZVxcbmxvY2FsIGNsb2NrIGludG8gdHoncyBkYXlsaWdodCB0aW1lKS5cXG5cXG5MZXRcXG5cXG4gICAgeicgPSB6ICsgei5kID0geiArIGRpZmYgICAgICAgICAgICAgICAgICAgICBbN11cXG5cXG5hbmQgd2UgY2FuIGFnYWluIGFzayB3aGV0aGVyXFxuXFxuICAgIHonLm4gLSB6Jy5vID0geC5uICAgICAgICAgICAgICAgICAgICAgICAgICAgWzhdXFxuXFxuSWYgc28sIHdlJ3JlIGRvbmUuICBJZiBub3QsIHRoZSB0emluZm8gY2xhc3MgaXMgaW5zYW5lLCBhY2NvcmRpbmcgdG8gdGhlXFxuYXNzdW1wdGlvbnMgd2UndmUgbWFkZS4gIFRoaXMgYWxzbyByZXF1aXJlcyBhIGJpdCBvZiBwcm9vZi4gIEFzIGJlZm9yZSwgbGV0J3NcXG5jb21wdXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIExIUyBhbmQgUkhTIG9mIFs4XSAoYW5kIHNraXBwaW5nIHNvbWUgb2ZcXG50aGUganVzdGlmaWNhdGlvbnMgZm9yIHRoZSBraW5kcyBvZiBzdWJzdGl0dXRpb25zIHdlJ3ZlIGRvbmUgc2V2ZXJhbCB0aW1lc1xcbmFscmVhZHkpOlxcblxcbiAgICBkaWZmJyA9IHgubiAtICh6Jy5uIC0geicubykgPSAgICAgICAgICAgcmVwbGFjaW5nIHonLm4gdmlhIFs3XVxcbiAgICAgICAgICAgIHgubiAgLSAoei5uICsgZGlmZiAtIHonLm8pID0gICAgcmVwbGFjaW5nIGRpZmYgdmlhIFs2XVxcbiAgICAgICAgICAgIHgubiAtICh6Lm4gKyB4Lm4gLSAoei5uIC0gei5vKSAtIHonLm8pID1cXG4gICAgICAgICAgICB4Lm4gLSB6Lm4gLSB4Lm4gKyB6Lm4gLSB6Lm8gKyB6Jy5vID0gICAgY2FuY2VsIHgublxcbiAgICAgICAgICAgIC0gei5uICsgei5uIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICBjYW5jZWwgei5uXFxuICAgICAgICAgICAgLSB6Lm8gKyB6Jy5vID0gICAgICAgICAgICAgICAgICAgICAgIzEgdHdpY2VcXG4gICAgICAgICAgICAtei5zIC0gei5kICsgeicucyArIHonLmQgPSAgICAgICAgICB6IGFuZCB6JyBoYXZlIHNhbWUgdHppbmZvXFxuICAgICAgICAgICAgeicuZCAtIHouZFxcblxcblNvIHonIGlzIFVUQy1lcXVpdmFsZW50IHRvIHggaWZmIHonLmQgPSB6LmQgYXQgdGhpcyBwb2ludC4gIElmIHRoZXkgYXJlIGVxdWFsLFxcbndlJ3ZlIGZvdW5kIHRoZSBVVEMtZXF1aXZhbGVudCBzbyBhcmUgZG9uZS4gIEluIGZhY3QsIHdlIHN0b3Agd2l0aCBbN10gYW5kXFxucmV0dXJuIHonLCBub3QgYm90aGVyaW5nIHRvIGNvbXB1dGUgeicuZC5cXG5cXG5Ib3cgY291bGQgei5kIGFuZCB6J2QgZGlmZmVyPyAgeicgPSB6ICsgei5kIFs3XSwgc28gbWVyZWx5IG1vdmluZyB6JyBieVxcbmEgZHN0KCkgb2Zmc2V0LCBhbmQgc3RhcnRpbmcgKmZyb20qIGEgdGltZSBhbHJlYWR5IGluIERTVCAod2Uga25vdyB6LmQgIT0gMCksXFxud291bGQgaGF2ZSB0byBjaGFuZ2UgdGhlIHJlc3VsdCBkc3QoKSByZXR1cm5zOiAgd2Ugc3RhcnQgaW4gRFNULCBhbmQgbW92aW5nXFxuYSBsaXR0bGUgZnVydGhlciBpbnRvIGl0IHRha2VzIHVzIG91dCBvZiBEU1QuXFxuXFxuVGhlcmUgaXNuJ3QgYSBzYW5lIGNhc2Ugd2hlcmUgdGhpcyBjYW4gaGFwcGVuLiAgVGhlIGNsb3Nlc3QgaXQgZ2V0cyBpcyBhdFxcbnRoZSBlbmQgb2YgRFNULCB3aGVyZSB0aGVyZSdzIGFuIGhvdXIgaW4gVVRDIHdpdGggbm8gc3BlbGxpbmcgaW4gYSBoeWJyaWRcXG50emluZm8gY2xhc3MuICBJbiBVUyBFYXN0ZXJuLCB0aGF0J3MgNTpNTSBVVEMgPSAwOk1NIEVTVCA9IDE6TU0gRURULiAgRHVyaW5nXFxudGhhdCBob3VyLCBvbiBhbiBFYXN0ZXJuIGNsb2NrIDE6TU0gaXMgdGFrZW4gYXMgYmVpbmcgaW4gc3RhbmRhcmQgdGltZSAoNjpNTVxcblVUQykgYmVjYXVzZSB0aGUgZG9jcyBpbnNpc3Qgb24gdGhhdCwgYnV0IDA6TU0gaXMgdGFrZW4gYXMgYmVpbmcgaW4gZGF5bGlnaHRcXG50aW1lICg0Ok1NIFVUQykuICBUaGVyZSBpcyBubyBsb2NhbCB0aW1lIG1hcHBpbmcgdG8gNTpNTSBVVEMuICBUaGUgbG9jYWxcXG5jbG9jayBqdW1wcyBmcm9tIDE6NTkgYmFjayB0byAxOjAwIGFnYWluLCBhbmQgcmVwZWF0cyB0aGUgMTpNTSBob3VyIGluXFxuc3RhbmRhcmQgdGltZS4gIFNpbmNlIHRoYXQncyB3aGF0IHRoZSBsb2NhbCBjbG9jayAqZG9lcyosIHdlIHdhbnQgdG8gbWFwIGJvdGhcXG5VVEMgaG91cnMgNTpNTSBhbmQgNjpNTSB0byAxOk1NIEVhc3Rlcm4uICBUaGUgcmVzdWx0IGlzIGFtYmlndW91c1xcbmluIGxvY2FsIHRpbWUsIGJ1dCBzbyBpdCBnb2VzIC0tIGl0J3MgdGhlIHdheSB0aGUgbG9jYWwgY2xvY2sgd29ya3MuXFxuXFxuV2hlbiB4ID0gNTpNTSBVVEMgaXMgdGhlIGlucHV0IHRvIHRoaXMgYWxnb3JpdGhtLCB4Lm89MCwgeS5vPS01IGFuZCB5LmQ9MCxcXG5zbyB6PTA6TU0uICB6LmQ9NjAgKG1pbnV0ZXMpIHRoZW4sIHNvIFs1XSBkb2Vzbid0IGhvbGQgYW5kIHdlIGtlZXAgZ29pbmcuXFxueicgPSB6ICsgei5kID0gMTpNTSB0aGVuLCBhbmQgeicuZD0wLCBhbmQgeicuZCAtIHouZCA9IC02MCAhPSAwIHNvIFs4XVxcbihjb3JyZWN0bHkpIGNvbmNsdWRlcyB0aGF0IHonIGlzIG5vdCBVVEMtZXF1aXZhbGVudCB0byB4LlxcblxcbkJlY2F1c2Ugd2Uga25vdyB6LmQgc2FpZCB6IHdhcyBpbiBkYXlsaWdodCB0aW1lIChlbHNlIFs1XSB3b3VsZCBoYXZlIGhlbGQgYW5kXFxud2Ugd291bGQgaGF2ZSBzdG9wcGVkIHRoZW4pLCBhbmQgd2Uga25vdyB6LmQgIT0geicuZCAoZWxzZSBbOF0gd291bGQgaGF2ZSBoZWxkXFxuYW5kIHdlIGhhdmUgc3RvcHBlZCB0aGVuKSwgYW5kIHRoZXJlIGFyZSBvbmx5IDIgcG9zc2libGUgdmFsdWVzIGRzdCgpIGNhblxcbnJldHVybiBpbiBFYXN0ZXJuLCBpdCBmb2xsb3dzIHRoYXQgeicuZCBtdXN0IGJlIDAgKHdoaWNoIGl0IGlzIGluIHRoZSBleGFtcGxlLFxcbmJ1dCB0aGUgcmVhc29uaW5nIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSBleGFtcGxlIC0tIGl0IGRlcGVuZHMgb24gdGhlcmUgYmVpbmdcXG50d28gcG9zc2libGUgZHN0KCkgb3V0Y29tZXMsIG9uZSB6ZXJvIGFuZCB0aGUgb3RoZXIgbm9uLXplcm8pLiAgVGhlcmVmb3JlXFxueicgbXVzdCBiZSBpbiBzdGFuZGFyZCB0aW1lLCBhbmQgaXMgdGhlIHNwZWxsaW5nIHdlIHdhbnQgaW4gdGhpcyBjYXNlLlxcblxcbk5vdGUgYWdhaW4gdGhhdCB6JyBpcyBub3QgVVRDLWVxdWl2YWxlbnQgYXMgZmFyIGFzIHRoZSBoeWJyaWQgdHppbmZvIGNsYXNzIGlzXFxuY29uY2VybmVkIChiZWNhdXNlIGl0IHRha2VzIHonIGFzIGJlaW5nIGluIHN0YW5kYXJkIHRpbWUgcmF0aGVyIHRoYW4gdGhlXFxuZGF5bGlnaHQgdGltZSB3ZSBpbnRlbmQgaGVyZSksIGJ1dCByZXR1cm5pbmcgaXQgZ2l2ZXMgdGhlIHJlYWwtbGlmZSBcXFwibG9jYWxcXG5jbG9jayByZXBlYXRzIGFuIGhvdXJcXFwiIGJlaGF2aW9yIHdoZW4gbWFwcGluZyB0aGUgXFxcInVuc3BlbGxhYmxlXFxcIiBVVEMgaG91ciBpbnRvXFxudHouXFxuXFxuV2hlbiB0aGUgaW5wdXQgaXMgNjpNTSwgej0xOk1NIGFuZCB6LmQ9MCwgYW5kIHdlIHN0b3AgYXQgb25jZSwgYWdhaW4gd2l0aFxcbnRoZSAxOk1NIHN0YW5kYXJkIHRpbWUgc3BlbGxpbmcgd2Ugd2FudC5cXG5cXG5TbyBob3cgY2FuIHRoaXMgYnJlYWs/ICBPbmUgb2YgdGhlIGFzc3VtcHRpb25zIG11c3QgYmUgdmlvbGF0ZWQuICBUd29cXG5wb3NzaWJpbGl0aWVzOlxcblxcbjEpIFsyXSBlZmZlY3RpdmVseSBzYXlzIHRoYXQgeS5zIGlzIGludmFyaWFudCBhY3Jvc3MgYWxsIHkgYmVsb25nIHRvIGEgZ2l2ZW5cXG4gICB0aW1lIHpvbmUuICBUaGlzIGlzbid0IHRydWUgaWYsIGZvciBwb2xpdGljYWwgcmVhc29ucyBvciBjb250aW5lbnRhbCBkcmlmdCxcXG4gICBhIHJlZ2lvbiBkZWNpZGVzIHRvIGNoYW5nZSBpdHMgYmFzZSBvZmZzZXQgZnJvbSBVVEMuXFxuXFxuMikgVGhlcmUgbWF5IGJlIHZlcnNpb25zIG9mIFxcXCJkb3VibGUgZGF5bGlnaHRcXFwiIHRpbWUgd2hlcmUgdGhlIHRhaWwgZW5kIG9mXFxuICAgdGhlIGFuYWx5c2lzIGdpdmVzIHVwIGEgc3RlcCB0b28gZWFybHkuICBJIGhhdmVuJ3QgdGhvdWdodCBhYm91dCB0aGF0XFxuICAgZW5vdWdoIHRvIHNheS5cXG5cXG5JbiBhbnkgY2FzZSwgaXQncyBjbGVhciB0aGF0IHRoZSBkZWZhdWx0IGZyb211dGMoKSBpcyBzdHJvbmcgZW5vdWdoIHRvIGhhbmRsZVxcblxcXCJhbG1vc3QgYWxsXFxcIiB0aW1lIHpvbmVzOiAgc28gbG9uZyBhcyB0aGUgc3RhbmRhcmQgb2Zmc2V0IGlzIGludmFyaWFudCwgaXRcXG5kb2Vzbid0IG1hdHRlciBpZiBkYXlsaWdodCB0aW1lIHRyYW5zaXRpb24gcG9pbnRzIGNoYW5nZSBmcm9tIHllYXIgdG8geWVhciwgb3JcXG5pZiBkYXlsaWdodCB0aW1lIGlzIHNraXBwZWQgaW4gc29tZSB5ZWFyczsgaXQgZG9lc24ndCBtYXR0ZXIgaG93IGxhcmdlIG9yXFxuc21hbGwgZHN0KCkgbWF5IGdldCB3aXRoaW4gaXRzIGJvdW5kczsgYW5kIGl0IGRvZXNuJ3QgZXZlbiBtYXR0ZXIgaWYgc29tZVxcbnBlcnZlcnNlIHRpbWUgem9uZSByZXR1cm5zIGEgbmVnYXRpdmUgZHN0KCkpLiAgU28gYSBicmVha2luZyBjYXNlIG11c3QgYmVcXG5wcmV0dHkgYml6YXJyZSwgYW5kIGEgdHppbmZvIHN1YmNsYXNzIGNhbiBvdmVycmlkZSBmcm9tdXRjKCkgaWYgaXQgaXMuXFxuXFxcIlxcXCJcXFwiXFxuXCIsXCJzcmMvbGliL2RiaGFzaC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGJoYXNoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGVjaW1hbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGVjaW1hbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RpZmZsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpZmZsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaXJjYWNoZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGlyY2FjaGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaXMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Rpc3R1dGlscy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGlzdHV0aWxzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzdHV0aWxzL2NvbW1hbmQvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbW1hbmQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaXN0dXRpbHMvdGVzdHMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRlc3RzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZG9jdGVzdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZG9jdGVzdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RvY3VtZW50LmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYSxiPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcImRvY3VtZW50XFxcIil9O3JldHVybiBiLmdldEVsZW1lbnRCeUlkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS52KTtyZXR1cm4gYz9Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjXSk6U2suYnVpbHRpbi5ub25lLm5vbmUkfSksYi5jcmVhdGVFbGVtZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChhLnYpO2lmKGMpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NdKX0pLGIuZ2V0RWxlbWVudHNCeVRhZ05hbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYS52KSxkPVtdLGU9Yy5sZW5ndGgtMTswPD1lO2UtLSlkLnB1c2goU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY1tlXV0pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChkKX0pLGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEudiksZD1bXSxlPTA7ZTxjLmxlbmd0aDtlKyspZC5wdXNoKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NbZV1dKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoZCl9KSxiLmdldEVsZW1lbnRzQnlOYW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKGEudiksZD1bXSxlPTA7ZTxjLmxlbmd0aDtlKyspZC5wdXNoKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NbZV1dKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoZCl9KSxiLnF1ZXJ5U2VsZWN0b3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGEudik7cmV0dXJuIGM/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY10pOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIucXVlcnlTZWxlY3RvckFsbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGEudiksZD1bXSxlPTA7ZTxjLmxlbmd0aDtlKyspZC5wdXNoKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NbZV1dKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoZCl9KSxiLmdldEN1cnJlbnRFZGl0b3JWYWx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09U2suZGl2aWQmJnZvaWQgMCE9PXdpbmRvdy5lZExpc3Qpe2lmKFNrLmdyYWRlQ29udGFpbmVyIT1Tay5kaXZpZCl7dmFyIGE9U2suZ3JhZGVDb250YWluZXIrXFxcIiBcXFwiK1NrLmRpdmlkO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIod2luZG93LmVkTGlzdFthXS5lZGl0b3IuZ2V0VmFsdWUoKSl9cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih3aW5kb3cuZWRMaXN0W1NrLmRpdmlkXS5lZGl0b3IuZ2V0VmFsdWUoKSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXFxcIkNhbid0IGZpbmQgZWRpdG9yIGZvciB0aGlzIGRpdlxcXCIpfSksYi5jdXJyZW50RGl2PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1Tay5kaXZpZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmRpdmlkKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcXFwiVGhlcmUgaXMgbm8gdmFsdWUgc2V0IGZvciBkaXZpZFxcXCIpfSksYi5jdXJyZW50Q291cnNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1lQm9va0NvbmZpZylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGVCb29rQ29uZmlnLmNvdXJzZSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXFxcIlRoZXJlIGlzIG5vIGNvdXJzZVxcXCIpfSksYi5jdXJyZW50R3JhZGluZ0NvbnRhaW5lcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09U2suZ3JhZGVDb250YWluZXIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5ncmFkZUNvbnRhaW5lcik7aWYobnVsbCE9U2suZGl2aWQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5kaXZpZCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXFxcIlRoZXJlIGlzIG5vIHZhbHVlIHNldCBmb3IgZ3JhZGluZ1xcXCIpfSksYT1mdW5jdGlvbihhLGMpe2MuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudj1iLGEuaW5uZXJIVE1MPWIuaW5uZXJIVE1MLGEuaW5uZXJUZXh0PWIuaW5uZXJUZXh0LHZvaWQgMCE9PWIudmFsdWUmJihhLnZhbHVlPWIudmFsdWUsU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihcXFwidmFsdWVcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYS52YWx1ZSkpKSx2b2lkIDAhPT1iLmNoZWNrZWQmJihhLmNoZWNrZWQ9Yi5jaGVja2VkLFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImNoZWNrZWRcXFwiKSxTay5idWlsdGluLmJvb2woYS5jaGVja2VkKSkpLFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImlubmVySFRNTFxcXCIpLG5ldyBTay5idWlsdGluLnN0cihhLmlubmVySFRNTCkpLFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImlubmVyVGV4dFxcXCIpLG5ldyBTay5idWlsdGluLnN0cihhLmlubmVyVGV4dCkpfSksYy50cCRnZXRhdHRyPVNrLmdlbmVyaWMuZ2V0QXR0cixjLl9fc2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwiaW5uZXJIVE1MXFxcIj09PWImJihhLmlubmVySFRNTD1jLGEudi5pbm5lckhUTUw9Yy52LFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImlubmVySFRNTFxcXCIpLGMpKSxcXFwiaW5uZXJUZXh0XFxcIj09PWImJihhLmlubmVyVGV4dD1jLGEudi5pbm5lclRleHQ9Yy52LFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImlubmVyVGV4dFxcXCIpLGMpKX0pLGMuYXBwZW5kQ2hpbGQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5hcHBlbmRDaGlsZChiLnYpfSksYy5yZW1vdmVDaGlsZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnJlbW92ZUNoaWxkKGIudil9KSxjLmNsb3Nlc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe3ZhciBkPWEudi5jbG9zZXN0KGMudik7cmV0dXJuIGQ/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbZF0pOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuZ2V0Q1NTPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEudi5zdHlsZVtiLnZdKX0pLGMuc2V0Q1NTPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2Eudi5zdHlsZVtiLnZdPWMudn0pLGMuZ2V0QXR0cmlidXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnYuZ2V0QXR0cmlidXRlKGIudik7cmV0dXJuIGM/bmV3IFNrLmJ1aWx0aW4uc3RyKGMpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuc2V0QXR0cmlidXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2Eudi5zZXRBdHRyaWJ1dGUoYi52LGMudil9KSxjLmdldFByb3BlcnR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnZbYi52XTtyZXR1cm4gYz9uZXcgU2suYnVpbHRpbi5zdHIoYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfSksYy5fX3N0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIGNvbnNvbGUubG9nKGEudi50YWdOYW1lKSxuZXcgU2suYnVpbHRpbi5zdHIoYS52LnRhZ05hbWUpfSksYy5fX3JlcHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiW0RPTSBFbGVtZW50XVxcXCIpfSl9LGIuRWxlbWVudD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGIsYSxcXFwiRWxlbWVudFxcXCIsW10pLGJ9O1wiLFwic3JjL2xpYi9kdW1iZGJtLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1iZGJtIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZHVtbXlfdGhyZWFkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1teV90aHJlYWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kdW1teV90aHJlYWRpbmcucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImR1bW15X3RocmVhZGluZyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2VtYWlsL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJlbWFpbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2VtYWlsL21pbWUvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1pbWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbWFpbC90ZXN0L2RhdGEvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRhdGEgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbmNvZGluZ3MvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImVuY29kaW5ncyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ZpbGVjbXAucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZpbGVjbXAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9maWxlaW5wdXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZpbGVpbnB1dCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ZubWF0Y2gucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZubWF0Y2ggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mb3JtYXR0ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZvcm1hdHRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ZwZm9ybWF0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmcGZvcm1hdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ZyYWN0aW9ucy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnJhY3Rpb25zIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZnRwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmdHBsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mdW5jdG9vbHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZ1bmN0b29scyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2dlbmVyaWNwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJnZW5lcmljcGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2dldG9wdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2V0b3B0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZ2V0cGFzcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2V0cGFzcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2dldHRleHQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdldHRleHQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nbG9iLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJnbG9iIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZ3ppcC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ3ppcCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2hhc2hsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImhhc2hsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9oZWFwcS5weVwiOlwiXFxcIlxcXCJcXFwiSGVhcCBxdWV1ZSBhbGdvcml0aG0gKGEuay5hLiBwcmlvcml0eSBxdWV1ZSkuXFxuXFxuSGVhcHMgYXJlIGFycmF5cyBmb3Igd2hpY2ggYVtrXSA8PSBhWzIqaysxXSBhbmQgYVtrXSA8PSBhWzIqaysyXSBmb3JcXG5hbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sXFxubm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXFxucHJvcGVydHkgb2YgYSBoZWFwIGlzIHRoYXQgYVswXSBpcyBhbHdheXMgaXRzIHNtYWxsZXN0IGVsZW1lbnQuXFxuXFxuVXNhZ2U6XFxuXFxuaGVhcCA9IFtdICAgICAgICAgICAgIyBjcmVhdGVzIGFuIGVtcHR5IGhlYXBcXG5oZWFwcHVzaChoZWFwLCBpdGVtKSAjIHB1c2hlcyBhIG5ldyBpdGVtIG9uIHRoZSBoZWFwXFxuaXRlbSA9IGhlYXBwb3AoaGVhcCkgIyBwb3BzIHRoZSBzbWFsbGVzdCBpdGVtIGZyb20gdGhlIGhlYXBcXG5pdGVtID0gaGVhcFswXSAgICAgICAjIHNtYWxsZXN0IGl0ZW0gb24gdGhlIGhlYXAgd2l0aG91dCBwb3BwaW5nIGl0XFxuaGVhcGlmeSh4KSAgICAgICAgICAgIyB0cmFuc2Zvcm1zIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBsaW5lYXIgdGltZVxcbml0ZW0gPSBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKSAjIHBvcHMgYW5kIHJldHVybnMgc21hbGxlc3QgaXRlbSwgYW5kIGFkZHNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXcgaXRlbTsgdGhlIGhlYXAgc2l6ZSBpcyB1bmNoYW5nZWRcXG5cXG5PdXIgQVBJIGRpZmZlcnMgZnJvbSB0ZXh0Ym9vayBoZWFwIGFsZ29yaXRobXMgYXMgZm9sbG93czpcXG5cXG4tIFdlIHVzZSAwLWJhc2VkIGluZGV4aW5nLiAgVGhpcyBtYWtlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlXFxuICBpbmRleCBmb3IgYSBub2RlIGFuZCB0aGUgaW5kZXhlcyBmb3IgaXRzIGNoaWxkcmVuIHNsaWdodGx5IGxlc3NcXG4gIG9idmlvdXMsIGJ1dCBpcyBtb3JlIHN1aXRhYmxlIHNpbmNlIFB5dGhvbiB1c2VzIDAtYmFzZWQgaW5kZXhpbmcuXFxuXFxuLSBPdXIgaGVhcHBvcCgpIG1ldGhvZCByZXR1cm5zIHRoZSBzbWFsbGVzdCBpdGVtLCBub3QgdGhlIGxhcmdlc3QuXFxuXFxuVGhlc2UgdHdvIG1ha2UgaXQgcG9zc2libGUgdG8gdmlldyB0aGUgaGVhcCBhcyBhIHJlZ3VsYXIgUHl0aG9uIGxpc3RcXG53aXRob3V0IHN1cnByaXNlczogaGVhcFswXSBpcyB0aGUgc21hbGxlc3QgaXRlbSwgYW5kIGhlYXAuc29ydCgpXFxubWFpbnRhaW5zIHRoZSBoZWFwIGludmFyaWFudCFcXG5cXFwiXFxcIlxcXCJcXG5cXG4jIE9yaWdpbmFsIGNvZGUgYnkgS2V2aW4gTydDb25ub3IsIGF1Z21lbnRlZCBieSBUaW0gUGV0ZXJzIGFuZCBSYXltb25kIEhldHRpbmdlclxcblxcbl9fYWJvdXRfXyA9IFxcXCJcXFwiXFxcIkhlYXAgcXVldWVzXFxuXFxuW2V4cGxhbmF0aW9uIGJ5IEZyYW7Dp29pcyBQaW5hcmRdXFxuXFxuSGVhcHMgYXJlIGFycmF5cyBmb3Igd2hpY2ggYVtrXSA8PSBhWzIqaysxXSBhbmQgYVtrXSA8PSBhWzIqaysyXSBmb3JcXG5hbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sXFxubm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXFxucHJvcGVydHkgb2YgYSBoZWFwIGlzIHRoYXQgYVswXSBpcyBhbHdheXMgaXRzIHNtYWxsZXN0IGVsZW1lbnQuXFxuXFxuVGhlIHN0cmFuZ2UgaW52YXJpYW50IGFib3ZlIGlzIG1lYW50IHRvIGJlIGFuIGVmZmljaWVudCBtZW1vcnlcXG5yZXByZXNlbnRhdGlvbiBmb3IgYSB0b3VybmFtZW50LiAgVGhlIG51bWJlcnMgYmVsb3cgYXJlIGBrJywgbm90IGFba106XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwXFxuXFxuICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJcXG5cXG4gICAgICAgICAgMyAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgNSAgICAgICAgICAgICAgIDZcXG5cXG4gICAgICA3ICAgICAgIDggICAgICAgOSAgICAgICAxMCAgICAgIDExICAgICAgMTIgICAgICAxMyAgICAgIDE0XFxuXFxuICAgIDE1IDE2ICAgMTcgMTggICAxOSAyMCAgIDIxIDIyICAgMjMgMjQgICAyNSAyNiAgIDI3IDI4ICAgMjkgMzBcXG5cXG5cXG5JbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIGBrJyBpcyB0b3BwaW5nIGAyKmsrMScgYW5kIGAyKmsrMicuICBJblxcbmEgdXN1YWwgYmluYXJ5IHRvdXJuYW1lbnQgd2Ugc2VlIGluIHNwb3J0cywgZWFjaCBjZWxsIGlzIHRoZSB3aW5uZXJcXG5vdmVyIHRoZSB0d28gY2VsbHMgaXQgdG9wcywgYW5kIHdlIGNhbiB0cmFjZSB0aGUgd2lubmVyIGRvd24gdGhlIHRyZWVcXG50byBzZWUgYWxsIG9wcG9uZW50cyBzL2hlIGhhZC4gIEhvd2V2ZXIsIGluIG1hbnkgY29tcHV0ZXIgYXBwbGljYXRpb25zXFxub2Ygc3VjaCB0b3VybmFtZW50cywgd2UgZG8gbm90IG5lZWQgdG8gdHJhY2UgdGhlIGhpc3Rvcnkgb2YgYSB3aW5uZXIuXFxuVG8gYmUgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCB3aGVuIGEgd2lubmVyIGlzIHByb21vdGVkLCB3ZSB0cnkgdG9cXG5yZXBsYWNlIGl0IGJ5IHNvbWV0aGluZyBlbHNlIGF0IGEgbG93ZXIgbGV2ZWwsIGFuZCB0aGUgcnVsZSBiZWNvbWVzXFxudGhhdCBhIGNlbGwgYW5kIHRoZSB0d28gY2VsbHMgaXQgdG9wcyBjb250YWluIHRocmVlIGRpZmZlcmVudCBpdGVtcyxcXG5idXQgdGhlIHRvcCBjZWxsIFxcXCJ3aW5zXFxcIiBvdmVyIHRoZSB0d28gdG9wcGVkIGNlbGxzLlxcblxcbklmIHRoaXMgaGVhcCBpbnZhcmlhbnQgaXMgcHJvdGVjdGVkIGF0IGFsbCB0aW1lLCBpbmRleCAwIGlzIGNsZWFybHlcXG50aGUgb3ZlcmFsbCB3aW5uZXIuICBUaGUgc2ltcGxlc3QgYWxnb3JpdGhtaWMgd2F5IHRvIHJlbW92ZSBpdCBhbmRcXG5maW5kIHRoZSBcXFwibmV4dFxcXCIgd2lubmVyIGlzIHRvIG1vdmUgc29tZSBsb3NlciAobGV0J3Mgc2F5IGNlbGwgMzAgaW4gdGhlXFxuZGlhZ3JhbSBhYm92ZSkgaW50byB0aGUgMCBwb3NpdGlvbiwgYW5kIHRoZW4gcGVyY29sYXRlIHRoaXMgbmV3IDAgZG93blxcbnRoZSB0cmVlLCBleGNoYW5naW5nIHZhbHVlcywgdW50aWwgdGhlIGludmFyaWFudCBpcyByZS1lc3RhYmxpc2hlZC5cXG5UaGlzIGlzIGNsZWFybHkgbG9nYXJpdGhtaWMgb24gdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdHJlZS5cXG5CeSBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMsIHlvdSBnZXQgYW4gTyhuIGxuIG4pIHNvcnQuXFxuXFxuQSBuaWNlIGZlYXR1cmUgb2YgdGhpcyBzb3J0IGlzIHRoYXQgeW91IGNhbiBlZmZpY2llbnRseSBpbnNlcnQgbmV3XFxuaXRlbXMgd2hpbGUgdGhlIHNvcnQgaXMgZ29pbmcgb24sIHByb3ZpZGVkIHRoYXQgdGhlIGluc2VydGVkIGl0ZW1zIGFyZVxcbm5vdCBcXFwiYmV0dGVyXFxcIiB0aGFuIHRoZSBsYXN0IDAndGggZWxlbWVudCB5b3UgZXh0cmFjdGVkLiAgVGhpcyBpc1xcbmVzcGVjaWFsbHkgdXNlZnVsIGluIHNpbXVsYXRpb24gY29udGV4dHMsIHdoZXJlIHRoZSB0cmVlIGhvbGRzIGFsbFxcbmluY29taW5nIGV2ZW50cywgYW5kIHRoZSBcXFwid2luXFxcIiBjb25kaXRpb24gbWVhbnMgdGhlIHNtYWxsZXN0IHNjaGVkdWxlZFxcbnRpbWUuICBXaGVuIGFuIGV2ZW50IHNjaGVkdWxlIG90aGVyIGV2ZW50cyBmb3IgZXhlY3V0aW9uLCB0aGV5IGFyZVxcbnNjaGVkdWxlZCBpbnRvIHRoZSBmdXR1cmUsIHNvIHRoZXkgY2FuIGVhc2lseSBnbyBpbnRvIHRoZSBoZWFwLiAgU28sIGFcXG5oZWFwIGlzIGEgZ29vZCBzdHJ1Y3R1cmUgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzICh0aGlzIGlzIHdoYXQgSVxcbnVzZWQgZm9yIG15IE1JREkgc2VxdWVuY2VyIDotKS5cXG5cXG5WYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseVxcbnN0dWRpZWQsIGFuZCBoZWFwcyBhcmUgZ29vZCBmb3IgdGhpcywgYXMgdGhleSBhcmUgcmVhc29uYWJseSBzcGVlZHksXFxudGhlIHNwZWVkIGlzIGFsbW9zdCBjb25zdGFudCwgYW5kIHRoZSB3b3JzdCBjYXNlIGlzIG5vdCBtdWNoIGRpZmZlcmVudFxcbnRoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2hcXG5hcmUgbW9yZSBlZmZpY2llbnQgb3ZlcmFsbCwgeWV0IHRoZSB3b3JzdCBjYXNlcyBtaWdodCBiZSB0ZXJyaWJsZS5cXG5cXG5IZWFwcyBhcmUgYWxzbyB2ZXJ5IHVzZWZ1bCBpbiBiaWcgZGlzayBzb3J0cy4gIFlvdSBtb3N0IHByb2JhYmx5IGFsbFxcbmtub3cgdGhhdCBhIGJpZyBzb3J0IGltcGxpZXMgcHJvZHVjaW5nIFxcXCJydW5zXFxcIiAod2hpY2ggYXJlIHByZS1zb3J0ZWRcXG5zZXF1ZW5jZXMsIHdoaWNoIHNpemUgaXMgdXN1YWxseSByZWxhdGVkIHRvIHRoZSBhbW91bnQgb2YgQ1BVIG1lbW9yeSksXFxuZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlblxcbnZlcnkgY2xldmVybHkgb3JnYW5pc2VkWzFdLiAgSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGUgaW5pdGlhbFxcbnNvcnQgcHJvZHVjZXMgdGhlIGxvbmdlc3QgcnVucyBwb3NzaWJsZS4gIFRvdXJuYW1lbnRzIGFyZSBhIGdvb2Qgd2F5XFxudG8gdGhhdC4gIElmLCB1c2luZyBhbGwgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gaG9sZCBhIHRvdXJuYW1lbnQsIHlvdVxcbnJlcGxhY2UgYW5kIHBlcmNvbGF0ZSBpdGVtcyB0aGF0IGhhcHBlbiB0byBmaXQgdGhlIGN1cnJlbnQgcnVuLCB5b3UnbGxcXG5wcm9kdWNlIHJ1bnMgd2hpY2ggYXJlIHR3aWNlIHRoZSBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHJhbmRvbSBpbnB1dCxcXG5hbmQgbXVjaCBiZXR0ZXIgZm9yIGlucHV0IGZ1enppbHkgb3JkZXJlZC5cXG5cXG5Nb3Jlb3ZlciwgaWYgeW91IG91dHB1dCB0aGUgMCd0aCBpdGVtIG9uIGRpc2sgYW5kIGdldCBhbiBpbnB1dCB3aGljaFxcbm1heSBub3QgZml0IGluIHRoZSBjdXJyZW50IHRvdXJuYW1lbnQgKGJlY2F1c2UgdGhlIHZhbHVlIFxcXCJ3aW5zXFxcIiBvdmVyXFxudGhlIGxhc3Qgb3V0cHV0IHZhbHVlKSwgaXQgY2Fubm90IGZpdCBpbiB0aGUgaGVhcCwgc28gdGhlIHNpemUgb2YgdGhlXFxuaGVhcCBkZWNyZWFzZXMuICBUaGUgZnJlZWQgbWVtb3J5IGNvdWxkIGJlIGNsZXZlcmx5IHJldXNlZCBpbW1lZGlhdGVseVxcbmZvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkaW5nIGEgc2Vjb25kIGhlYXAsIHdoaWNoIGdyb3dzIGF0IGV4YWN0bHkgdGhlXFxuc2FtZSByYXRlIHRoZSBmaXJzdCBoZWFwIGlzIG1lbHRpbmcuICBXaGVuIHRoZSBmaXJzdCBoZWFwIGNvbXBsZXRlbHlcXG52YW5pc2hlcywgeW91IHN3aXRjaCBoZWFwcyBhbmQgc3RhcnQgYSBuZXcgcnVuLiAgQ2xldmVyIGFuZCBxdWl0ZVxcbmVmZmVjdGl2ZSFcXG5cXG5JbiBhIHdvcmQsIGhlYXBzIGFyZSB1c2VmdWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8ga25vdy4gIEkgdXNlIHRoZW0gaW5cXG5hIGZldyBhcHBsaWNhdGlvbnMsIGFuZCBJIHRoaW5rIGl0IGlzIGdvb2QgdG8ga2VlcCBhIGBoZWFwJyBtb2R1bGVcXG5hcm91bmQuIDotKVxcblxcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuWzFdIFRoZSBkaXNrIGJhbGFuY2luZyBhbGdvcml0aG1zIHdoaWNoIGFyZSBjdXJyZW50LCBub3dhZGF5cywgYXJlXFxubW9yZSBhbm5veWluZyB0aGFuIGNsZXZlciwgYW5kIHRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgc2Vla2luZ1xcbmNhcGFiaWxpdGllcyBvZiB0aGUgZGlza3MuICBPbiBkZXZpY2VzIHdoaWNoIGNhbm5vdCBzZWVrLCBsaWtlIGJpZ1xcbnRhcGUgZHJpdmVzLCB0aGUgc3Rvcnkgd2FzIHF1aXRlIGRpZmZlcmVudCwgYW5kIG9uZSBoYWQgdG8gYmUgdmVyeVxcbmNsZXZlciB0byBlbnN1cmUgKGZhciBpbiBhZHZhbmNlKSB0aGF0IGVhY2ggdGFwZSBtb3ZlbWVudCB3aWxsIGJlIHRoZVxcbm1vc3QgZWZmZWN0aXZlIHBvc3NpYmxlICh0aGF0IGlzLCB3aWxsIGJlc3QgcGFydGljaXBhdGUgYXRcXG5cXFwicHJvZ3Jlc3NpbmdcXFwiIHRoZSBtZXJnZSkuICBTb21lIHRhcGVzIHdlcmUgZXZlbiBhYmxlIHRvIHJlYWRcXG5iYWNrd2FyZHMsIGFuZCB0aGlzIHdhcyBhbHNvIHVzZWQgdG8gYXZvaWQgdGhlIHJld2luZGluZyB0aW1lLlxcbkJlbGlldmUgbWUsIHJlYWwgZ29vZCB0YXBlIHNvcnRzIHdlcmUgcXVpdGUgc3BlY3RhY3VsYXIgdG8gd2F0Y2ghXFxuRnJvbSBhbGwgdGltZXMsIHNvcnRpbmcgaGFzIGFsd2F5cyBiZWVuIGEgR3JlYXQgQXJ0ISA6LSlcXG5cXFwiXFxcIlxcXCJcXG5cXG5fX2FsbF9fID0gWydoZWFwcHVzaCcsICdoZWFwcG9wJywgJ2hlYXBpZnknLCAnaGVhcHJlcGxhY2UnLFxcbiAgICAgICAgICAgJ25sYXJnZXN0JywgJ25zbWFsbGVzdCcsICdoZWFwcHVzaHBvcCddXFxuXFxuZGVmIGhlYXBwdXNoKGhlYXAsIGl0ZW0pOlxcbiAgICBcXFwiXFxcIlxcXCJQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuXFxcIlxcXCJcXFwiXFxuICAgIGhlYXAuYXBwZW5kKGl0ZW0pXFxuICAgIF9zaWZ0ZG93bihoZWFwLCAwLCBsZW4oaGVhcCktMSlcXG5cXG5kZWYgaGVhcHBvcChoZWFwKTpcXG4gICAgXFxcIlxcXCJcXFwiUG9wIHRoZSBzbWFsbGVzdCBpdGVtIG9mZiB0aGUgaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxcXCJcXFwiXFxcIlxcbiAgICBsYXN0ZWx0ID0gaGVhcC5wb3AoKSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaWYgaGVhcDpcXG4gICAgICAgIHJldHVybml0ZW0gPSBoZWFwWzBdXFxuICAgICAgICBoZWFwWzBdID0gbGFzdGVsdFxcbiAgICAgICAgX3NpZnR1cChoZWFwLCAwKVxcbiAgICAgICAgcmV0dXJuIHJldHVybml0ZW1cXG4gICAgcmV0dXJuIGxhc3RlbHRcXG5cXG5kZWYgaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSk6XFxuICAgIFxcXCJcXFwiXFxcIlBvcCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHNtYWxsZXN0IHZhbHVlLCBhbmQgYWRkIHRoZSBuZXcgaXRlbS5cXG5cXG4gICAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGhlYXBwb3AoKSBmb2xsb3dlZCBieSBoZWFwcHVzaCgpLCBhbmQgY2FuIGJlXFxuICAgIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkLXNpemUgaGVhcC4gIE5vdGUgdGhhdCB0aGUgdmFsdWVcXG4gICAgcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hICBUaGF0IGNvbnN0cmFpbnMgcmVhc29uYWJsZSB1c2VzIG9mXFxuICAgIHRoaXMgcm91dGluZSB1bmxlc3Mgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgY29uZGl0aW9uYWwgcmVwbGFjZW1lbnQ6XFxuXFxuICAgICAgICBpZiBpdGVtID4gaGVhcFswXTpcXG4gICAgICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSlcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIHJldHVybml0ZW0gPSBoZWFwWzBdICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eVxcbiAgICBoZWFwWzBdID0gaXRlbVxcbiAgICBfc2lmdHVwKGhlYXAsIDApXFxuICAgIHJldHVybiByZXR1cm5pdGVtXFxuXFxuZGVmIGhlYXBwdXNocG9wKGhlYXAsIGl0ZW0pOlxcbiAgICBcXFwiXFxcIlxcXCJGYXN0IHZlcnNpb24gb2YgYSBoZWFwcHVzaCBmb2xsb3dlZCBieSBhIGhlYXBwb3AuXFxcIlxcXCJcXFwiXFxuICAgIGlmIGhlYXAgYW5kIGhlYXBbMF0gPCBpdGVtOlxcbiAgICAgICAgaXRlbSwgaGVhcFswXSA9IGhlYXBbMF0sIGl0ZW1cXG4gICAgICAgIF9zaWZ0dXAoaGVhcCwgMClcXG4gICAgcmV0dXJuIGl0ZW1cXG5cXG5kZWYgaGVhcGlmeSh4KTpcXG4gICAgXFxcIlxcXCJcXFwiVHJhbnNmb3JtIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBPKGxlbih4KSkgdGltZS5cXFwiXFxcIlxcXCJcXG4gICAgbiA9IGxlbih4KVxcbiAgICAjIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0byBsb29raW5nIGF0XFxuICAgICMgaXMgdGhlIGxhcmdlc3Qgd2l0aCBhIGNoaWxkIGluZGV4IGluLXJhbmdlLCBzbyBtdXN0IGhhdmUgMippICsgMSA8IG4sXFxuICAgICMgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMgKDIqai0xKS8yID0gai0xLzIgc29cXG4gICAgIyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYgbiBpcyBvZGQgPSAyKmorMSwgdGhpcyBpc1xcbiAgICAjICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIGFuZCB0aGF0J3MgYWdhaW4gbi8vMi0xLlxcbiAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShuLy8yKSk6XFxuICAgICAgICBfc2lmdHVwKHgsIGkpXFxuXFxuZGVmIF9oZWFwcG9wX21heChoZWFwKTpcXG4gICAgXFxcIlxcXCJcXFwiTWF4aGVhcCB2ZXJzaW9uIG9mIGEgaGVhcHBvcC5cXFwiXFxcIlxcXCJcXG4gICAgbGFzdGVsdCA9IGhlYXAucG9wKCkgICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5XFxuICAgIGlmIGhlYXA6XFxuICAgICAgICByZXR1cm5pdGVtID0gaGVhcFswXVxcbiAgICAgICAgaGVhcFswXSA9IGxhc3RlbHRcXG4gICAgICAgIF9zaWZ0dXBfbWF4KGhlYXAsIDApXFxuICAgICAgICByZXR1cm4gcmV0dXJuaXRlbVxcbiAgICByZXR1cm4gbGFzdGVsdFxcblxcbmRlZiBfaGVhcHJlcGxhY2VfbWF4KGhlYXAsIGl0ZW0pOlxcbiAgICBcXFwiXFxcIlxcXCJNYXhoZWFwIHZlcnNpb24gb2YgYSBoZWFwcG9wIGZvbGxvd2VkIGJ5IGEgaGVhcHB1c2guXFxcIlxcXCJcXFwiXFxuICAgIHJldHVybml0ZW0gPSBoZWFwWzBdICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eVxcbiAgICBoZWFwWzBdID0gaXRlbVxcbiAgICBfc2lmdHVwX21heChoZWFwLCAwKVxcbiAgICByZXR1cm4gcmV0dXJuaXRlbVxcblxcbmRlZiBfaGVhcGlmeV9tYXgoeCk6XFxuICAgIFxcXCJcXFwiXFxcIlRyYW5zZm9ybSBsaXN0IGludG8gYSBtYXhoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oeCkpIHRpbWUuXFxcIlxcXCJcXFwiXFxuICAgIG4gPSBsZW4oeClcXG4gICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2Uobi8vMikpOlxcbiAgICAgICAgX3NpZnR1cF9tYXgoeCwgaSlcXG5cXG4jICdoZWFwJyBpcyBhIGhlYXAgYXQgYWxsIGluZGljZXMgPj0gc3RhcnRwb3MsIGV4Y2VwdCBwb3NzaWJseSBmb3IgcG9zLiAgcG9zXFxuIyBpcyB0aGUgaW5kZXggb2YgYSBsZWFmIHdpdGggYSBwb3NzaWJseSBvdXQtb2Ytb3JkZXIgdmFsdWUuICBSZXN0b3JlIHRoZVxcbiMgaGVhcCBpbnZhcmlhbnQuXFxuZGVmIF9zaWZ0ZG93bihoZWFwLCBzdGFydHBvcywgcG9zKTpcXG4gICAgbmV3aXRlbSA9IGhlYXBbcG9zXVxcbiAgICAjIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nIGEgcGxhY2VcXG4gICAgIyBuZXdpdGVtIGZpdHMuXFxuICAgIHdoaWxlIHBvcyA+IHN0YXJ0cG9zOlxcbiAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDFcXG4gICAgICAgIHBhcmVudCA9IGhlYXBbcGFyZW50cG9zXVxcbiAgICAgICAgaWYgbmV3aXRlbSA8IHBhcmVudDpcXG4gICAgICAgICAgICBoZWFwW3Bvc10gPSBwYXJlbnRcXG4gICAgICAgICAgICBwb3MgPSBwYXJlbnRwb3NcXG4gICAgICAgICAgICBjb250aW51ZVxcbiAgICAgICAgYnJlYWtcXG4gICAgaGVhcFtwb3NdID0gbmV3aXRlbVxcblxcbiMgVGhlIGNoaWxkIGluZGljZXMgb2YgaGVhcCBpbmRleCBwb3MgYXJlIGFscmVhZHkgaGVhcHMsIGFuZCB3ZSB3YW50IHRvIG1ha2VcXG4jIGEgaGVhcCBhdCBpbmRleCBwb3MgdG9vLiAgV2UgZG8gdGhpcyBieSBidWJibGluZyB0aGUgc21hbGxlciBjaGlsZCBvZlxcbiMgcG9zIHVwIChhbmQgc28gb24gd2l0aCB0aGF0IGNoaWxkJ3MgY2hpbGRyZW4sIGV0YykgdW50aWwgaGl0dGluZyBhIGxlYWYsXFxuIyB0aGVuIHVzaW5nIF9zaWZ0ZG93biB0byBtb3ZlIHRoZSBvZGRiYWxsIG9yaWdpbmFsbHkgYXQgaW5kZXggcG9zIGludG8gcGxhY2UuXFxuI1xcbiMgV2UgKmNvdWxkKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgYXMgc29vbiBhcyB3ZSBmaW5kIGEgcG9zIHdoZXJlIG5ld2l0ZW0gPD1cXG4jIGJvdGggaXRzIGNoaWxkcmVuLCBidXQgdHVybnMgb3V0IHRoYXQncyBub3QgYSBnb29kIGlkZWEsIGFuZCBkZXNwaXRlIHRoYXRcXG4jIG1hbnkgYm9va3Mgd3JpdGUgdGhlIGFsZ29yaXRobSB0aGF0IHdheS4gIER1cmluZyBhIGhlYXAgcG9wLCB0aGUgbGFzdCBhcnJheVxcbiMgZWxlbWVudCBpcyBzaWZ0ZWQgaW4sIGFuZCB0aGF0IHRlbmRzIHRvIGJlIGxhcmdlLCBzbyB0aGF0IGNvbXBhcmluZyBpdFxcbiMgYWdhaW5zdCB2YWx1ZXMgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCB1c3VhbGx5IGRvZXNuJ3QgcGF5ICg9IHVzdWFsbHkgZG9lc24ndFxcbiMgZ2V0IHVzIG91dCBvZiB0aGUgbG9vcCBlYXJseSkuICBTZWUgS251dGgsIFZvbHVtZSAzLCB3aGVyZSB0aGlzIGlzXFxuIyBleHBsYWluZWQgYW5kIHF1YW50aWZpZWQgaW4gYW4gZXhlcmNpc2UuXFxuI1xcbiMgQ3V0dGluZyB0aGUgIyBvZiBjb21wYXJpc29ucyBpcyBpbXBvcnRhbnQsIHNpbmNlIHRoZXNlIHJvdXRpbmVzIGhhdmUgbm9cXG4jIHdheSB0byBleHRyYWN0IFxcXCJ0aGUgcHJpb3JpdHlcXFwiIGZyb20gYW4gYXJyYXkgZWxlbWVudCwgc28gdGhhdCBpbnRlbGxpZ2VuY2VcXG4jIGlzIGxpa2VseSB0byBiZSBoaWRpbmcgaW4gY3VzdG9tIGNvbXBhcmlzb24gbWV0aG9kcywgb3IgaW4gYXJyYXkgZWxlbWVudHNcXG4jIHN0b3JpbmcgKHByaW9yaXR5LCByZWNvcmQpIHR1cGxlcy4gIENvbXBhcmlzb25zIGFyZSB0aHVzIHBvdGVudGlhbGx5XFxuIyBleHBlbnNpdmUuXFxuI1xcbiMgT24gcmFuZG9tIGFycmF5cyBvZiBsZW5ndGggMTAwMCwgbWFraW5nIHRoaXMgY2hhbmdlIGN1dCB0aGUgbnVtYmVyIG9mXFxuIyBjb21wYXJpc29ucyBtYWRlIGJ5IGhlYXBpZnkoKSBhIGxpdHRsZSwgYW5kIHRob3NlIG1hZGUgYnkgZXhoYXVzdGl2ZVxcbiMgaGVhcHBvcCgpIGEgbG90LCBpbiBhY2NvcmQgd2l0aCB0aGVvcnkuICBIZXJlIGFyZSB0eXBpY2FsIHJlc3VsdHMgZnJvbSAzXFxuIyBydW5zICgzIGp1c3QgdG8gZGVtb25zdHJhdGUgaG93IHNtYWxsIHRoZSB2YXJpYW5jZSBpcyk6XFxuI1xcbiMgQ29tcGFyZXMgbmVlZGVkIGJ5IGhlYXBpZnkgICAgIENvbXBhcmVzIG5lZWRlZCBieSAxMDAwIGhlYXBwb3BzXFxuIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4jIDE4MzcgY3V0IHRvIDE2NjMgICAgICAgICAgICAgICAxNDk5NiBjdXQgdG8gODY4MFxcbiMgMTg1NSBjdXQgdG8gMTY1OSAgICAgICAgICAgICAgIDE0OTY2IGN1dCB0byA4Njc4XFxuIyAxODQ3IGN1dCB0byAxNjYwICAgICAgICAgICAgICAgMTUwMjQgY3V0IHRvIDg3MDNcXG4jXFxuIyBCdWlsZGluZyB0aGUgaGVhcCBieSB1c2luZyBoZWFwcHVzaCgpIDEwMDAgdGltZXMgaW5zdGVhZCByZXF1aXJlZFxcbiMgMjE5OCwgMjE0OCwgYW5kIDIyMTkgY29tcGFyZXM6ICBoZWFwaWZ5KCkgaXMgbW9yZSBlZmZpY2llbnQsIHdoZW5cXG4jIHlvdSBjYW4gdXNlIGl0LlxcbiNcXG4jIFRoZSB0b3RhbCBjb21wYXJlcyBuZWVkZWQgYnkgbGlzdC5zb3J0KCkgb24gdGhlIHNhbWUgbGlzdHMgd2VyZSA4NjI3LFxcbiMgODYyNywgYW5kIDg2MzIgKHRoaXMgc2hvdWxkIGJlIGNvbXBhcmVkIHRvIHRoZSBzdW0gb2YgaGVhcGlmeSgpIGFuZFxcbiMgaGVhcHBvcCgpIGNvbXBhcmVzKTogIGxpc3Quc29ydCgpIGlzICh1bnN1cnByaXNpbmdseSEpIG1vcmUgZWZmaWNpZW50XFxuIyBmb3Igc29ydGluZy5cXG5cXG5kZWYgX3NpZnR1cChoZWFwLCBwb3MpOlxcbiAgICBlbmRwb3MgPSBsZW4oaGVhcClcXG4gICAgc3RhcnRwb3MgPSBwb3NcXG4gICAgbmV3aXRlbSA9IGhlYXBbcG9zXVxcbiAgICAjIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi5cXG4gICAgY2hpbGRwb3MgPSAyKnBvcyArIDEgICAgIyBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvblxcbiAgICB3aGlsZSBjaGlsZHBvcyA8IGVuZHBvczpcXG4gICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuXFxuICAgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMVxcbiAgICAgICAgaWYgcmlnaHRwb3MgPCBlbmRwb3MgYW5kIG5vdCBoZWFwW2NoaWxkcG9zXSA8IGhlYXBbcmlnaHRwb3NdOlxcbiAgICAgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3NcXG4gICAgICAgICMgTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC5cXG4gICAgICAgIGhlYXBbcG9zXSA9IGhlYXBbY2hpbGRwb3NdXFxuICAgICAgICBwb3MgPSBjaGlsZHBvc1xcbiAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDFcXG4gICAgIyBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBidWJibGUgaXQgdXBcXG4gICAgIyB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS5cXG4gICAgaGVhcFtwb3NdID0gbmV3aXRlbVxcbiAgICBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcylcXG5cXG5kZWYgX3NpZnRkb3duX21heChoZWFwLCBzdGFydHBvcywgcG9zKTpcXG4gICAgJ01heGhlYXAgdmFyaWFudCBvZiBfc2lmdGRvd24nXFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZyBhIHBsYWNlXFxuICAgICMgbmV3aXRlbSBmaXRzLlxcbiAgICB3aGlsZSBwb3MgPiBzdGFydHBvczpcXG4gICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxXFxuICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc11cXG4gICAgICAgIGlmIHBhcmVudCA8IG5ld2l0ZW06XFxuICAgICAgICAgICAgaGVhcFtwb3NdID0gcGFyZW50XFxuICAgICAgICAgICAgcG9zID0gcGFyZW50cG9zXFxuICAgICAgICAgICAgY29udGludWVcXG4gICAgICAgIGJyZWFrXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG5cXG5kZWYgX3NpZnR1cF9tYXgoaGVhcCwgcG9zKTpcXG4gICAgJ01heGhlYXAgdmFyaWFudCBvZiBfc2lmdHVwJ1xcbiAgICBlbmRwb3MgPSBsZW4oaGVhcClcXG4gICAgc3RhcnRwb3MgPSBwb3NcXG4gICAgbmV3aXRlbSA9IGhlYXBbcG9zXVxcbiAgICAjIEJ1YmJsZSB1cCB0aGUgbGFyZ2VyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLlxcbiAgICBjaGlsZHBvcyA9IDIqcG9zICsgMSAgICAjIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uXFxuICAgIHdoaWxlIGNoaWxkcG9zIDwgZW5kcG9zOlxcbiAgICAgICAgIyBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2YgbGFyZ2VyIGNoaWxkLlxcbiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDFcXG4gICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgaGVhcFtyaWdodHBvc10gPCBoZWFwW2NoaWxkcG9zXTpcXG4gICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zXFxuICAgICAgICAjIE1vdmUgdGhlIGxhcmdlciBjaGlsZCB1cC5cXG4gICAgICAgIGhlYXBbcG9zXSA9IGhlYXBbY2hpbGRwb3NdXFxuICAgICAgICBwb3MgPSBjaGlsZHBvc1xcbiAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDFcXG4gICAgIyBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBidWJibGUgaXQgdXBcXG4gICAgIyB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS5cXG4gICAgaGVhcFtwb3NdID0gbmV3aXRlbVxcbiAgICBfc2lmdGRvd25fbWF4KGhlYXAsIHN0YXJ0cG9zLCBwb3MpXFxuXFxuXFxuIyBBbGdvcml0aG0gbm90ZXMgZm9yIG5sYXJnZXN0KCkgYW5kIG5zbWFsbGVzdCgpXFxuIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuI1xcbiMgTWFrZSBhIHNpbmdsZSBwYXNzIG92ZXIgdGhlIGRhdGEgd2hpbGUga2VlcGluZyB0aGUgayBtb3N0IGV4dHJlbWUgdmFsdWVzXFxuIyBpbiBhIGhlYXAuICBNZW1vcnkgY29uc3VtcHRpb24gaXMgbGltaXRlZCB0byBrZWVwaW5nIGsgdmFsdWVzIGluIGEgbGlzdC5cXG4jXFxuIyBNZWFzdXJlZCBwZXJmb3JtYW5jZSBmb3IgcmFuZG9tIGlucHV0czpcXG4jXFxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGNvbXBhcmlzb25zXFxuIyAgICBuIGlucHV0cyAgICAgay1leHRyZW1lIHZhbHVlcyAgKGF2ZXJhZ2Ugb2YgNSB0cmlhbHMpICAgJSBtb3JlIHRoYW4gbWluKClcXG4jIC0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLVxcbiMgICAgICAxLDAwMCAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgICAgMywzMTcgICAgICAgICAgICAgICAyMzEuNyVcXG4jICAgICAxMCwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAgMTQsMDQ2ICAgICAgICAgICAgICAgIDQwLjUlXFxuIyAgICAxMDAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgICAgMTA1LDc0OSAgICAgICAgICAgICAgICAgNS43JVxcbiMgIDEsMDAwLDAwMCAgICAgICAgICAgMTAwICAgICAgICAgICAgICAxLDAwNyw3NTEgICAgICAgICAgICAgICAgIDAuOCVcXG4jIDEwLDAwMCwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAxMCwwMDksNDAxICAgICAgICAgICAgICAgICAwLjElXFxuI1xcbiMgVGhlb3JldGljYWwgbnVtYmVyIG9mIGNvbXBhcmlzb25zIGZvciBrIHNtYWxsZXN0IG9mIG4gcmFuZG9tIGlucHV0czpcXG4jXFxuIyBTdGVwICAgQ29tcGFyaXNvbnMgICAgICAgICAgICAgICAgICBBY3Rpb25cXG4jIC0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgIDEgICAgIDEuNjYgKiBrICAgICAgICAgICAgICAgICAgICAgaGVhcGlmeSB0aGUgZmlyc3Qgay1pbnB1dHNcXG4jICAyICAgICBuIC0gayAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUgcmVtYWluaW5nIGVsZW1lbnRzIHRvIHRvcCBvZiBoZWFwXFxuIyAgMyAgICAgayAqICgxICsgbGcyKGspKSAqIGxuKG4vaykgICByZXBsYWNlIHRoZSB0b3Btb3N0IHZhbHVlIG9uIHRoZSBoZWFwXFxuIyAgNCAgICAgayAqIGxnMihrKSAtIChrLzIpICAgICAgICAgICBmaW5hbCBzb3J0IG9mIHRoZSBrIG1vc3QgZXh0cmVtZSB2YWx1ZXNcXG4jXFxuIyBDb21iaW5pbmcgYW5kIHNpbXBsaWZ5aW5nIGZvciBhIHJvdWdoIGVzdGltYXRlIGdpdmVzOlxcbiNcXG4jICAgICAgICBjb21wYXJpc29ucyA9IG4gKyBrICogKGxvZyhrLCAyKSAqIGxvZyhuL2spICsgbG9nKGssIDIpICsgbG9nKG4vaykpXFxuI1xcbiMgQ29tcHV0aW5nIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgZm9yIHN0ZXAgMzpcXG4jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuIyAqIEZvciB0aGUgaS10aCBuZXcgdmFsdWUgZnJvbSB0aGUgaXRlcmFibGUsIHRoZSBwcm9iYWJpbGl0eSBvZiBiZWluZyBpbiB0aGVcXG4jICAgayBtb3N0IGV4dHJlbWUgdmFsdWVzIGlzIGsvaS4gIEZvciBleGFtcGxlLCB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIDEwMXN0XFxuIyAgIHZhbHVlIHNlZW4gYmVpbmcgaW4gdGhlIDEwMCBtb3N0IGV4dHJlbWUgdmFsdWVzIGlzIDEwMC8xMDEuXFxuIyAqIElmIHRoZSB2YWx1ZSBpcyBhIG5ldyBleHRyZW1lIHZhbHVlLCB0aGUgY29zdCBvZiBpbnNlcnRpbmcgaXQgaW50byB0aGVcXG4jICAgaGVhcCBpcyAxICsgbG9nKGssIDIpLlxcbiMgKiBUaGUgcHJvYmFiaWxpdHkgdGltZXMgdGhlIGNvc3QgZ2l2ZXM6XFxuIyAgICAgICAgICAgIChrL2kpICogKDEgKyBsb2coaywgMikpXFxuIyAqIFN1bW1pbmcgYWNyb3NzIHRoZSByZW1haW5pbmcgbi1rIGVsZW1lbnRzIGdpdmVzOlxcbiMgICAgICAgICAgICBzdW0oKGsvaSkgKiAoMSArIGxvZyhrLCAyKSkgZm9yIGkgaW4gcmFuZ2UoaysxLCBuKzEpKVxcbiMgKiBUaGlzIHJlZHVjZXMgdG86XFxuIyAgICAgICAgICAgIChIKG4pIC0gSChrKSkgKiBrICogKDEgKyBsb2coaywgMikpXFxuIyAqIFdoZXJlIEgobikgaXMgdGhlIG4tdGggaGFybW9uaWMgbnVtYmVyIGVzdGltYXRlZCBieTpcXG4jICAgICAgICAgICAgZ2FtbWEgPSAwLjU3NzIxNTY2NDlcXG4jICAgICAgICAgICAgSChuKSA9IGxvZyhuLCBlKSArIGdhbW1hICsgMSAvICgyICogbilcXG4jICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYXJtb25pY19zZXJpZXNfKG1hdGhlbWF0aWNzKSNSYXRlX29mX2RpdmVyZ2VuY2VcXG4jICogU3Vic3RpdHV0aW5nIHRoZSBIKG4pIGZvcm11bGE6XFxuIyAgICAgICAgICAgIGNvbXBhcmlzb25zID0gayAqICgxICsgbG9nKGssIDIpKSAqIChsb2cobi9rLCBlKSArICgxL24gLSAxL2spIC8gMilcXG4jXFxuIyBXb3JzdC1jYXNlIGZvciBzdGVwIDM6XFxuIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuIyBJbiB0aGUgd29yc3QgY2FzZSwgdGhlIGlucHV0IGRhdGEgaXMgcmV2ZXJzZWQgc29ydGVkIHNvIHRoYXQgZXZlcnkgbmV3IGVsZW1lbnRcXG4jIG11c3QgYmUgaW5zZXJ0ZWQgaW4gdGhlIGhlYXA6XFxuI1xcbiMgICAgICAgICAgICAgY29tcGFyaXNvbnMgPSAxLjY2ICogayArIGxvZyhrLCAyKSAqIChuIC0gaylcXG4jXFxuIyBBbHRlcm5hdGl2ZSBBbGdvcml0aG1zXFxuIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuIyBPdGhlciBhbGdvcml0aG1zIHdlcmUgbm90IHVzZWQgYmVjYXVzZSB0aGV5OlxcbiMgMSkgVG9vayBtdWNoIG1vcmUgYXV4aWxpYXJ5IG1lbW9yeSxcXG4jIDIpIE1hZGUgbXVsdGlwbGUgcGFzc2VzIG92ZXIgdGhlIGRhdGEuXFxuIyAzKSBNYWRlIG1vcmUgY29tcGFyaXNvbnMgaW4gY29tbW9uIGNhc2VzIChzbWFsbCBrLCBsYXJnZSBuLCBzZW1pLXJhbmRvbSBpbnB1dCkuXFxuIyBTZWUgdGhlIG1vcmUgZGV0YWlsZWQgY29tcGFyaXNvbiBvZiBhcHByb2FjaCBhdDpcXG4jIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzU3NzU3My1jb21wYXJlLWFsZ29yaXRobXMtZm9yLWhlYXBxc21hbGxlc3RcXG5cXG5kZWYgbnNtYWxsZXN0KG4sIGl0ZXJhYmxlLCBrZXk9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIkZpbmQgdGhlIG4gc21hbGxlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LlxcblxcbiAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl1cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtaW4oKVxcbiAgICBpZiBuID09IDE6XFxuICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgICAgICBzZW50aW5lbCA9IG9iamVjdCgpXFxuICAgICAgICByZXN1bHQgPSBtaW4oaXQsIGRlZmF1bHQ9c2VudGluZWwsIGtleT1rZXkpXFxuICAgICAgICByZXR1cm4gW10gaWYgcmVzdWx0IGlzIHNlbnRpbmVsIGVsc2UgW3Jlc3VsdF1cXG5cXG4gICAgIyBXaGVuIG4+PXNpemUsIGl0J3MgZmFzdGVyIHRvIHVzZSBzb3J0ZWQoKVxcbiAgICB0cnk6XFxuICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKVxcbiAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOlxcbiAgICAgICAgcGFzc1xcbiAgICBlbHNlOlxcbiAgICAgICAgaWYgbiA+PSBzaXplOlxcbiAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXkpWzpuXVxcblxcbiAgICAjIFdoZW4ga2V5IGlzIG5vbmUsIHVzZSBzaW1wbGVyIGRlY29yYXRpb25cXG4gICAgaWYga2V5IGlzIE5vbmU6XFxuICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgICAgICAjIHB1dCB0aGUgcmFuZ2UobikgZmlyc3Qgc28gdGhhdCB6aXAoKSBkb2Vzbid0XFxuICAgICAgICAjIGNvbnN1bWUgb25lIHRvbyBtYW55IGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhdG9yXFxuICAgICAgICByZXN1bHQgPSBbKGVsZW0sIGkpIGZvciBpLCBlbGVtIGluIHppcChyYW5nZShuKSwgaXQpXVxcbiAgICAgICAgaWYgbm90IHJlc3VsdDpcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgICAgICBfaGVhcGlmeV9tYXgocmVzdWx0KVxcbiAgICAgICAgdG9wID0gcmVzdWx0WzBdWzBdXFxuICAgICAgICBvcmRlciA9IG5cXG4gICAgICAgIF9oZWFwcmVwbGFjZSA9IF9oZWFwcmVwbGFjZV9tYXhcXG4gICAgICAgIGZvciBlbGVtIGluIGl0OlxcbiAgICAgICAgICAgIGlmIGVsZW0gPCB0b3A6XFxuICAgICAgICAgICAgICAgIF9oZWFwcmVwbGFjZShyZXN1bHQsIChlbGVtLCBvcmRlcikpXFxuICAgICAgICAgICAgICAgIHRvcCwgX29yZGVyID0gcmVzdWx0WzBdXFxuICAgICAgICAgICAgICAgIG9yZGVyICs9IDFcXG4gICAgICAgIHJlc3VsdC5zb3J0KClcXG4gICAgICAgIHJldHVybiBbZWxlbSBmb3IgKGVsZW0sIG9yZGVyKSBpbiByZXN1bHRdXFxuXFxuICAgICMgR2VuZXJhbCBjYXNlLCBzbG93ZXN0IG1ldGhvZFxcbiAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgIHJlc3VsdCA9IFsoa2V5KGVsZW0pLCBpLCBlbGVtKSBmb3IgaSwgZWxlbSBpbiB6aXAocmFuZ2UobiksIGl0KV1cXG4gICAgaWYgbm90IHJlc3VsdDpcXG4gICAgICAgIHJldHVybiByZXN1bHRcXG4gICAgX2hlYXBpZnlfbWF4KHJlc3VsdClcXG4gICAgdG9wID0gcmVzdWx0WzBdWzBdXFxuICAgIG9yZGVyID0gblxcbiAgICBfaGVhcHJlcGxhY2UgPSBfaGVhcHJlcGxhY2VfbWF4XFxuICAgIGZvciBlbGVtIGluIGl0OlxcbiAgICAgICAgayA9IGtleShlbGVtKVxcbiAgICAgICAgaWYgayA8IHRvcDpcXG4gICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoaywgb3JkZXIsIGVsZW0pKVxcbiAgICAgICAgICAgIHRvcCwgX29yZGVyLCBfZWxlbSA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgIG9yZGVyICs9IDFcXG4gICAgcmVzdWx0LnNvcnQoKVxcbiAgICByZXR1cm4gW2VsZW0gZm9yIChrLCBvcmRlciwgZWxlbSkgaW4gcmVzdWx0XVxcblxcbmRlZiBubGFyZ2VzdChuLCBpdGVyYWJsZSwga2V5PU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LlxcblxcbiAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5LCByZXZlcnNlPVRydWUpWzpuXVxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgIyBTaG9ydC1jdXQgZm9yIG49PTEgaXMgdG8gdXNlIG1heCgpXFxuICAgIGlmIG4gPT0gMTpcXG4gICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSlcXG4gICAgICAgIHNlbnRpbmVsID0gb2JqZWN0KClcXG4gICAgICAgIHJlc3VsdCA9IG1heChpdCwgZGVmYXVsdD1zZW50aW5lbCwga2V5PWtleSlcXG4gICAgICAgIHJldHVybiBbXSBpZiByZXN1bHQgaXMgc2VudGluZWwgZWxzZSBbcmVzdWx0XVxcblxcbiAgICAjIFdoZW4gbj49c2l6ZSwgaXQncyBmYXN0ZXIgdG8gdXNlIHNvcnRlZCgpXFxuICAgIHRyeTpcXG4gICAgICAgIHNpemUgPSBsZW4oaXRlcmFibGUpXFxuICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6XFxuICAgICAgICBwYXNzXFxuICAgIGVsc2U6XFxuICAgICAgICBpZiBuID49IHNpemU6XFxuICAgICAgICAgICAgcmV0dXJuIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl1cXG5cXG4gICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uXFxuICAgIGlmIGtleSBpcyBOb25lOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgcmVzdWx0ID0gWyhlbGVtLCBpKSBmb3IgaSwgZWxlbSBpbiB6aXAocmFuZ2UoMCwgLW4sIC0xKSwgaXQpXVxcbiAgICAgICAgaWYgbm90IHJlc3VsdDpcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgICAgICBoZWFwaWZ5KHJlc3VsdClcXG4gICAgICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICAgICAgb3JkZXIgPSAtblxcbiAgICAgICAgX2hlYXByZXBsYWNlID0gaGVhcHJlcGxhY2VcXG4gICAgICAgIGZvciBlbGVtIGluIGl0OlxcbiAgICAgICAgICAgIGlmIHRvcCA8IGVsZW06XFxuICAgICAgICAgICAgICAgIF9oZWFwcmVwbGFjZShyZXN1bHQsIChlbGVtLCBvcmRlcikpXFxuICAgICAgICAgICAgICAgIHRvcCwgX29yZGVyID0gcmVzdWx0WzBdXFxuICAgICAgICAgICAgICAgIG9yZGVyIC09IDFcXG4gICAgICAgIHJlc3VsdC5zb3J0KHJldmVyc2U9VHJ1ZSlcXG4gICAgICAgIHJldHVybiBbZWxlbSBmb3IgKGVsZW0sIG9yZGVyKSBpbiByZXN1bHRdXFxuXFxuICAgICMgR2VuZXJhbCBjYXNlLCBzbG93ZXN0IG1ldGhvZFxcbiAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgIHJlc3VsdCA9IFsoa2V5KGVsZW0pLCBpLCBlbGVtKSBmb3IgaSwgZWxlbSBpbiB6aXAocmFuZ2UoMCwgLW4sIC0xKSwgaXQpXVxcbiAgICBpZiBub3QgcmVzdWx0OlxcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICBoZWFwaWZ5KHJlc3VsdClcXG4gICAgdG9wID0gcmVzdWx0WzBdWzBdXFxuICAgIG9yZGVyID0gLW5cXG4gICAgX2hlYXByZXBsYWNlID0gaGVhcHJlcGxhY2VcXG4gICAgZm9yIGVsZW0gaW4gaXQ6XFxuICAgICAgICBrID0ga2V5KGVsZW0pXFxuICAgICAgICBpZiB0b3AgPCBrOlxcbiAgICAgICAgICAgIF9oZWFwcmVwbGFjZShyZXN1bHQsIChrLCBvcmRlciwgZWxlbSkpXFxuICAgICAgICAgICAgdG9wLCBfb3JkZXIsIF9lbGVtID0gcmVzdWx0WzBdXFxuICAgICAgICAgICAgb3JkZXIgLT0gMVxcbiAgICByZXN1bHQuc29ydChyZXZlcnNlPVRydWUpXFxuICAgIHJldHVybiBbZWxlbSBmb3IgKGssIG9yZGVyLCBlbGVtKSBpbiByZXN1bHRdXFxuXFxuIyBJZiBhdmFpbGFibGUsIHVzZSBDIGltcGxlbWVudGF0aW9uXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgKlxcbmV4Y2VwdCBJbXBvcnRFcnJvcjpcXG4gICAgcGFzc1xcbnRyeTpcXG4gICAgZnJvbSBfaGVhcHEgaW1wb3J0IF9oZWFwcmVwbGFjZV9tYXhcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG50cnk6XFxuICAgIGZyb20gX2hlYXBxIGltcG9ydCBfaGVhcGlmeV9tYXhcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG50cnk6XFxuICAgIGZyb20gX2hlYXBxIGltcG9ydCBfaGVhcHBvcF9tYXhcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG5cXG5cXG5pZiBfX25hbWVfXyA9PSBcXFwiX19tYWluX19cXFwiOlxcblxcbiAgICBpbXBvcnQgZG9jdGVzdCAjIHByYWdtYTogbm8gY292ZXJcXG4gICAgcHJpbnQoZG9jdGVzdC50ZXN0bW9kKCkpICMgcHJhZ21hOiBubyBjb3ZlclxcblwiLFwic3JjL2xpYi9obWFjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJobWFjIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaG90c2hvdC9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaG90c2hvdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2h0bWxlbnRpdHlkZWZzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJodG1sZW50aXR5ZGVmcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2h0bWxsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImh0bWxsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9odHRwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJodHRwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaWRsZWxpYi9JY29ucy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiSWNvbnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pZGxlbGliL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpZGxlbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaWhvb2tzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpaG9va3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pbWFnZS5qc1wiOlwidmFyIEltYWdlTW9kLCRidWlsdGlubW9kdWxlO0ltYWdlTW9kfHwoSW1hZ2VNb2Q9e30sSW1hZ2VNb2QuY2FudmFzTGliPVtdKSwkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnLGg9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwiaW1hZ2VcXFwiKX07cmV0dXJuIGguSW1hZ2U9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhoLGZ1bmN0aW9uKGEsYil7dmFyIGM9TWF0aC5mbG9vcjtlPWZ1bmN0aW9uKGEpe2Eud2lkdGg9YS5pbWFnZS53aWR0aCxhLmhlaWdodD1hLmltYWdlLmhlaWdodCxhLmRlbGF5PTAsYS51cGRhdGVDb3VudD0wLGEudXBkYXRlSW50ZXJ2YWw9MSxhLmxhc3R4PTAsYS5sYXN0eT0wLGEuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGEuY2FudmFzLmhlaWdodD1hLmhlaWdodCxhLmNhbnZhcy53aWR0aD1hLndpZHRoLGEuY3R4PWEuY2FudmFzLmdldENvbnRleHQoXFxcIjJkXFxcIiksYS5jdHguZHJhd0ltYWdlKGEuaW1hZ2UsMCwwKSxhLmltYWdlZGF0YT1hLmN0eC5nZXRJbWFnZURhdGEoMCwwLGEud2lkdGgsYS5oZWlnaHQpfSxiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYztTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpO3RyeXthLmltYWdlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFNrLmZmaS5yZW1hcFRvSnMoYikpLGUoYSl9Y2F0Y2goYil7YS5pbWFnZT1udWxsfWlmKG51bGw9PWEuaW1hZ2UpcmV0dXJuIGM9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb24sYy5yZXN1bWU9ZnVuY3Rpb24oKXtpZihjLmRhdGEuZXJyb3IpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSU9FcnJvcihjLmRhdGEuZXJyb3IubWVzc2FnZSl9LGMuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTpuZXcgUHJvbWlzZShmdW5jdGlvbihjLGQpe3ZhciBmPW5ldyBJbWFnZTtmLmNyb3NzT3JpZ2luPVxcXCJcXFwiLGYub25lcnJvcj1mdW5jdGlvbigpe2QoRXJyb3IoXFxcIkZhaWxlZCB0byBsb2FkIFVSTDogXFxcIitmLnNyYykpfSxmLm9ubG9hZD1mdW5jdGlvbigpe2EuaW1hZ2U9dGhpcyxlKGEpLGMoKX0sZi5zcmM9ZyhiKX0pfSxjfSksZz1mdW5jdGlvbihhKXtsZXQgYj1Tay5mZmkucmVtYXBUb0pzKGEpO3RyeXtsZXQgYT1Tay5yZWFkKGIpLGM9Yi5zdWJzdHJpbmcoYi5sYXN0SW5kZXhPZihcXFwiLlxcXCIpKzEpO3JldHVybmBkYXRhOmltYWdlLyR7Y307YmFzZTY0LCAke2F9YH1jYXRjaChhKXtjb25zb2xlLmxvZyhgJHtifSBpcyBub3QgaW4gdGhlIGRhdGFiYXNlICR7YX1gKX12YXIgYyxkLGU9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIFNrLmltYWdlUHJveHk/U2suaW1hZ2VQcm94eTpmdW5jdGlvbihhKXtyZXR1cm4gYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJhXFxcIiksYy5ocmVmPWQsd2luZG93LmxvY2F0aW9uLmhvc3Q9PT1jLmhvc3Q/YTpTay5pbWFnZVByb3h5K1xcXCIvXFxcIithfTtyZXR1cm4gZD1Tay5mZmkucmVtYXBUb0pzKGEpLGQ9ZShkKSxkfSxmPWZ1bmN0aW9uKGEsYixjKXtpZigwPmJ8fDA+Y3x8Yj49YS53aWR0aHx8Yz49YS5oZWlnaHQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiUGl4ZWwgaW5kZXggb3V0IG9mIHJhbmdlLlxcXCIpfTt2YXIgaT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0ZGVsYXlcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSxhLmRlbGF5PVNrLmZmaS5yZW1hcFRvSnMoYiksZD1Tay5idWlsdGluLmFzbnVtJChjKSxhLnVwZGF0ZUludGVydmFsPWQ/ZDoxfTtiLnNldF9kZWxheT1uZXcgU2suYnVpbHRpbi5mdW5jKGkpLGIuc2V0RGVsYXk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKTt2YXIgaj1mdW5jdGlvbihhKXt2YXIgYixkPVtdO2ZvcihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRwaXhlbHNcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxiPTA7YjxhLmltYWdlLmhlaWdodCphLmltYWdlLndpZHRoO2IrKylkW2JdPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmdldFBpeGVsLFthLGIlYS5pbWFnZS53aWR0aCxjKGIvYS5pbWFnZS53aWR0aCldKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoZCl9O2IuZ2V0X3BpeGVscz1uZXcgU2suYnVpbHRpbi5mdW5jKGopLGIuZ2V0UGl4ZWxzPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5nZXREYXRhPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGIsZCxlLGcsaCxqLGssbD1bXTtmb3IoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0RGF0YVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLGI9MDtiPGEuaW1hZ2UuaGVpZ2h0KmEuaW1hZ2Uud2lkdGg7YisrKWQ9YiVhLmltYWdlLndpZHRoLGU9YyhiL2EuaW1hZ2Uud2lkdGgpLGYoYSxkLGUpLGs9NCplKmEud2lkdGgrNCpkLGc9YS5pbWFnZWRhdGEuZGF0YVtrXSxoPWEuaW1hZ2VkYXRhLmRhdGFbaysxXSxqPWEuaW1hZ2VkYXRhLmRhdGFbaysyXSxsW2JdPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKGcpLG5ldyBTay5idWlsdGluLmludF8oaCksbmV3IFNrLmJ1aWx0aW4uaW50XyhqKV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGwpfSk7dmFyIGs9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZyxpO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRwaXhlbFxcXCIsYXJndW1lbnRzLmxlbmd0aCwzLDMpLGI9U2suYnVpbHRpbi5hc251bSQoYiksYz1Tay5idWlsdGluLmFzbnVtJChjKSxmKGEsYixjKSxpPTQqYyphLndpZHRoKzQqYixkPWEuaW1hZ2VkYXRhLmRhdGFbaV0sZz1hLmltYWdlZGF0YS5kYXRhW2krMV0sZT1hLmltYWdlZGF0YS5kYXRhW2krMl0sU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGguUGl4ZWwsW2QsZyxlLGIsY10pfTtiLmdldF9waXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKGspLGIuZ2V0UGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKSxkPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbjtyZXR1cm4gZC5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxkLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6bmV3IFByb21pc2UoZnVuY3Rpb24oZCl7dmFyIGU9TWF0aC5tYXgsZj1NYXRoLmFicyxnPU1hdGgubWluO2EudXBkYXRlQ291bnQrKywwPT1hLnVwZGF0ZUNvdW50JWEudXBkYXRlSW50ZXJ2YWw/KGEubGFzdHgrYS51cGRhdGVJbnRlcnZhbD49YS53aWR0aD9hLmxhc3RDdHgucHV0SW1hZ2VEYXRhKGEuaW1hZ2VkYXRhLGEubGFzdFVseCxhLmxhc3RVbHksMCxhLmxhc3R5LGEud2lkdGgsMik6YS5sYXN0eSthLnVwZGF0ZUludGVydmFsPj1hLmhlaWdodD9hLmxhc3RDdHgucHV0SW1hZ2VEYXRhKGEuaW1hZ2VkYXRhLGEubGFzdFVseCxhLmxhc3RVbHksYS5sYXN0eCwwLDIsYS5oZWlnaHQpOmEubGFzdEN0eC5wdXRJbWFnZURhdGEoYS5pbWFnZWRhdGEsYS5sYXN0VWx4LGEubGFzdFVseSxnKGIsYS5sYXN0eCksZyhjLGEubGFzdHkpLGUoZihiLWEubGFzdHgpLDEpLGUoZihjLWEubGFzdHkpLDEpKSxhLmxhc3R4PWIsYS5sYXN0eT1jLDA8YS5kZWxheT93aW5kb3cuc2V0VGltZW91dChkLGEuZGVsYXkpOmQoKSk6ZCgpfSl9LGR9O3ZhciBsPWZ1bmN0aW9uKGEsYixjLGUpe3ZhciBnO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRwaXhlbFxcXCIsYXJndW1lbnRzLmxlbmd0aCw0LDQpLGI9U2suYnVpbHRpbi5hc251bSQoYiksYz1Tay5idWlsdGluLmFzbnVtJChjKSxmKGEsYixjKSxnPTQqYyphLndpZHRoKzQqYixhLmltYWdlZGF0YS5kYXRhW2ddPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldFJlZCxbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2crMV09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0R3JlZW4sW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzJdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldEJsdWUsW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzNdPTI1NSxkKGEsYixjKX07Yi5zZXRfcGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKSxiLnNldFBpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobCk7dmFyIG09ZnVuY3Rpb24oYSxiLGUpe3ZhciBnLGgsaTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0cGl4ZWxhdFxcXCIsYXJndW1lbnRzLmxlbmd0aCwzLDMpLGI9U2suYnVpbHRpbi5hc251bSQoYiksZz1iJWEuaW1hZ2Uud2lkdGgsaD1jKGIvYS5pbWFnZS53aWR0aCksZihhLGcsaCksaT00KmgqYS53aWR0aCs0KmcsYS5pbWFnZWRhdGEuZGF0YVtpXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRSZWQsW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtpKzFdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldEdyZWVuLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbaSsyXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRCbHVlLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbaSszXT0yNTUsZChhLGcsaCl9O2Iuc2V0X3BpeGVsX2F0PW5ldyBTay5idWlsdGluLmZ1bmMobSksYi5zZXRQaXhlbEF0PW5ldyBTay5idWlsdGluLmZ1bmMobSk7dmFyIG49ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGc7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInVwZGF0ZXBpeGVsXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYz1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRYLFtiXSkpLGU9U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuZ2V0WSxbYl0pKSxmKGEsYyxlKSxnPTQqZSphLndpZHRoKzQqYyxhLmltYWdlZGF0YS5kYXRhW2ddPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldFJlZCxbYl0pKSxhLmltYWdlZGF0YS5kYXRhW2crMV09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuZ2V0R3JlZW4sW2JdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzJdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldEJsdWUsW2JdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzNdPTI1NSxkKGEsYyxlKX07Yi51cGRhdGVfcGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhuKSxiLnVwZGF0ZVBpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobik7dmFyIG89ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldGhlaWdodFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLG5ldyBTay5idWlsdGluLmludF8oYS5oZWlnaHQpfTtiLmdldF9oZWlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhvKSxiLmdldEhlaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKG8pO3ZhciBwPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXR3aWR0aFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLG5ldyBTay5idWlsdGluLmludF8oYS53aWR0aCl9O2IuZ2V0X3dpZHRoPW5ldyBTay5idWlsdGluLmZ1bmMocCksYi5nZXRXaWR0aD1uZXcgU2suYnVpbHRpbi5mdW5jKHApLGIuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImhlaWdodFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGEuaGVpZ2h0KTpcXFwid2lkdGhcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEud2lkdGgpOnZvaWQgMH0pLGIuX19zZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwiaGVpZ2h0XFxcIj09PWJ8fFxcXCJ3aWR0aFxcXCI9PT1iKXRocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcXFwiQ2Fubm90IGNoYW5nZSBoZWlnaHQgb3Igd2lkdGggdGhleSBjYW4gb25seSBiZSBzZXQgb24gY3JlYXRpb25cXFwiKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcXFwiVW5rbm93biBhdHRyaWJ1dGU6IFxcXCIrYil9KSxiLmRyYXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXt2YXIgZTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZHJhd1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpLGU9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb24sZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxlLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6bmV3IFByb21pc2UoZnVuY3Rpb24oZSl7dmFyIGYsZztiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGM9U2suYnVpbHRpbi5hc251bSQoYyksZD1Tay5idWlsdGluLmFzbnVtJChkKSxmPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldFdpbixbYl0pLGc9Zi5nZXRDb250ZXh0KFxcXCIyZFxcXCIpLHZvaWQgMD09PWMmJihjPTAsZD0wKSxhLmxhc3RVbHg9YyxhLmxhc3RVbHk9ZCxhLmxhc3RDdHg9ZyxnLnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxjLGQpLDA8YS5kZWxheT93aW5kb3cuc2V0VGltZW91dChlLGEuZGVsYXkpOndpbmRvdy5zZXRUaW1lb3V0KGUsMjAwKX0pfSxlfSl9LFxcXCJJbWFnZVxcXCIsW10pLGM9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDMsMyksYS53aWR0aD1Tay5idWlsdGluLmFzbnVtJChiKSxhLmhlaWdodD1Tay5idWlsdGluLmFzbnVtJChjKSxhLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJjYW52YXNcXFwiKSxhLmN0eD1hLmNhbnZhcy5nZXRDb250ZXh0KFxcXCIyZFxcXCIpLGEuY2FudmFzLmhlaWdodD1hLmhlaWdodCxhLmNhbnZhcy53aWR0aD1hLndpZHRoLGEuaW1hZ2VkYXRhPWEuY3R4LmdldEltYWdlRGF0YSgwLDAsYS53aWR0aCxhLmhlaWdodCl9KX0saC5FbXB0eUltYWdlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxjLFxcXCJFbXB0eUltYWdlXFxcIixbaC5JbWFnZV0pLGI9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQsZSxiLGYpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDQsNiksYS5yZWQ9U2suYnVpbHRpbi5hc251bSQoYyksYS5ncmVlbj1Tay5idWlsdGluLmFzbnVtJChkKSxhLmJsdWU9U2suYnVpbHRpbi5hc251bSQoZSksYS54PVNrLmJ1aWx0aW4uYXNudW0kKGIpLGEueT1Tay5idWlsdGluLmFzbnVtJChmKX0pO3ZhciBjPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRyZWRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLmFzc2skKGEucmVkKX07Yi5nZXRfcmVkPW5ldyBTay5idWlsdGluLmZ1bmMoYyksYi5nZXRSZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhjKTt2YXIgZD1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0Z3JlZW5cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLmFzc2skKGEuZ3JlZW4pfTtiLmdldF9ncmVlbj1uZXcgU2suYnVpbHRpbi5mdW5jKGQpLGIuZ2V0R3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhkKTt2YXIgZT1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0Ymx1ZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4uYXNzayQoYS5ibHVlKX07Yi5nZXRfYmx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGUpLGIuZ2V0Qmx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGUpO3ZhciBmPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXR4XFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLngpfTtiLmdldF94PW5ldyBTay5idWlsdGluLmZ1bmMoZiksYi5nZXRYPW5ldyBTay5idWlsdGluLmZ1bmMoZik7dmFyIGc9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldHlcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLmFzc2skKGEueSl9O2IuZ2V0X3k9bmV3IFNrLmJ1aWx0aW4uZnVuYyhnKSxiLmdldFk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhnKTt2YXIgaD1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHJlZFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGEucmVkPVNrLmJ1aWx0aW4uYXNudW0kKGIpfTtiLnNldF9yZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhoKSxiLnNldFJlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGgpO3ZhciBpPWZ1bmN0aW9uKGEsYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0Z3JlZW5cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLmdyZWVuPVNrLmJ1aWx0aW4uYXNudW0kKGIpfTtiLnNldF9ncmVlbj1uZXcgU2suYnVpbHRpbi5mdW5jKGkpLGIuc2V0R3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKTt2YXIgaj1mdW5jdGlvbihhLGMpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldGJsdWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLmJsdWU9U2suYnVpbHRpbi5hc251bSQoYyl9O2Iuc2V0X2JsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhqKSxiLnNldEJsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhqKSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJyZWRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLnJlZCk6XFxcImdyZWVuXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLmdyZWVuKTpcXFwiYmx1ZVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS5ibHVlKTp2b2lkIDB9KSxiLl9fc2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9U2suZmZpLnJlbWFwVG9KcyhiKSwoXFxcInJlZFxcXCI9PT1ifHxcXFwiZ3JlZW5cXFwiPT09Ynx8XFxcImJsdWVcXFwiPT09YikmJihhW2JdPVNrLmJ1aWx0aW4uYXNudW0kKGMpKX0pO3ZhciBrPWZ1bmN0aW9uKGEsYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0eFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGEueD1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfeD1uZXcgU2suYnVpbHRpbi5mdW5jKGspLGIuc2V0WD1uZXcgU2suYnVpbHRpbi5mdW5jKGspO3ZhciBsPWZ1bmN0aW9uKGEsYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0eVxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGEueT1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfeT1uZXcgU2suYnVpbHRpbi5mdW5jKGwpLGIuc2V0WT1uZXcgU2suYnVpbHRpbi5mdW5jKGwpLGIuX19nZXRpdGVtX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLDA9PT1iKT9hLnJlZDoxPT1iP2EuZ3JlZW46Mj09Yj9hLmJsdWU6dm9pZCAwfSksYi5fX3N0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoXFxcIltcXFwiK2EucmVkK1xcXCIsXFxcIithLmdyZWVuK1xcXCIsXFxcIithLmJsdWUrXFxcIl1cXFwiKX0pLGIuZ2V0Q29sb3JUdXBsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7fSksYi5zZXRSYW5nZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS5tYXg9U2suYnVpbHRpbi5hc251bSQoYil9KX0saC5QaXhlbD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGgsYixcXFwiUGl4ZWxcXFwiLFtdKSxhPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwzKSxkPUltYWdlTW9kLmNhbnZhc0xpYltTay5jYW52YXNdLHZvaWQgMD09PWQ/KGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIiksZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChTay5jYW52YXMpLGEudGhlU2NyZWVuPWUsZi5hcHBlbmRDaGlsZChlKSxJbWFnZU1vZC5jYW52YXNMaWJbU2suY2FudmFzXT1lLEltYWdlTW9kLmNhbnZhc0xpYltTay5jYW52YXNdPWEudGhlU2NyZWVuKTooYS50aGVTY3JlZW49ZCxhLnRoZVNjcmVlbi5oZWlnaHQ9YS50aGVTY3JlZW4uaGVpZ2h0KSx2b2lkIDA9PT1iPyhTay5hdmFpbGFibGVIZWlnaHQmJihhLnRoZVNjcmVlbi5oZWlnaHQ9U2suYXZhaWxhYmxlSGVpZ2h0KSxTay5hdmFpbGFibGVXaWR0aCYmKGEudGhlU2NyZWVuLndpZHRoPVNrLmF2YWlsYWJsZVdpZHRoKSk6KGEudGhlU2NyZWVuLmhlaWdodD1jLnYsYS50aGVTY3JlZW4ud2lkdGg9Yi52KSxhLnRoZVNjcmVlbi5zdHlsZS5kaXNwbGF5PVxcXCJibG9ja1xcXCJ9KSxiLmdldFdpbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBhLnRoZVNjcmVlbn0pLGIuZXhpdG9uY2xpY2s9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnRoZVNjcmVlbi5pZDthLnRoZVNjcmVlbi5vbmNsaWNrPWZ1bmN0aW9uKCl7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikuc3R5bGUuZGlzcGxheT1cXFwibm9uZVxcXCIsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikub25jbGljaz1udWxsLGRlbGV0ZSBJbWFnZU1vZC5jYW52YXNMaWJbYl19fSl9LGguSW1hZ2VXaW49U2subWlzY2V2YWwuYnVpbGRDbGFzcyhoLGEsXFxcIkltYWdlV2luXFxcIixbXSksaH07XCIsXCJzcmMvbGliL2ltYXBsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImltYXBsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pbWdoZHIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImltZ2hkciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ltcHV0aWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImltcHV0aWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pby5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaW8gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pdGVydG9vbHMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGNvbWJpbmF0aW9uc05ldyhhLGIsYyl7bGV0IGQsZTtbZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhhLnRwJG5hbWUsW1xcXCJpdGVyYWJsZVxcXCIsXFxcInJcXFwiXSxiLGMsW10pO2NvbnN0IGY9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoZCk7aWYoZT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZSxTay5idWlsdGluLk92ZXJGbG93RXJyb3IpLDA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJyIG11c3QgYmUgbm9uLW5lZ2F0aXZlXFxcIik7aWYodGhpcz09PWEpcmV0dXJuIG5ldyBhLmNvbnN0cnVjdG9yKGYsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmNvbnN0cnVjdG9yLmNhbGwoYixmLGUpLGJ9fXZhciBhPXt9O3JldHVybiBhLmFjY3VtdWxhdGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuYWNjdW11bGF0ZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGFjY3VtdWxhdGUoYSxiLGMpe3RoaXMuaXRlcj1hLHRoaXMuZnVuYz1iLHRoaXMudG90YWw9Yyx0aGlzLnRwJGl0ZXJuZXh0PSgpPT4odGhpcy50b3RhbD1Tay5idWlsdGluLmNoZWNrTm9uZSh0aGlzLnRvdGFsKT90aGlzLml0ZXIudHAkaXRlcm5leHQoKTp0aGlzLnRvdGFsLHRoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQsdGhpcy50b3RhbCl9LGl0ZXJuZXh0KCl7bGV0IGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwIT09YSlyZXR1cm4gdGhpcy50b3RhbD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5mdW5jLFt0aGlzLnRvdGFsLGFdKSx0aGlzLnRvdGFsfSxzbG90czp7dHAkZG9jOlxcXCJhY2N1bXVsYXRlKGl0ZXJhYmxlWywgZnVuYywgaW5pdGlhbF0pIC0tPiBhY2N1bXVsYXRlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc2VyaWVzIG9mIGFjY3VtdWxhdGVkIHN1bXMgKG9yIG90aGVyIGJpbmFyeSBmdW5jdGlvbiByZXN1bHRzKS5cXFwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiYWNjdW11bGF0ZVxcXCIsYiwwLDIpO2xldFtkLGUsZl09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImFjY3VtdWxhdGVcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJmdW5jXFxcIixcXFwiaW5pdGlhbFxcXCJdLGIsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO2lmKGQ9U2suYWJzdHIuaXRlcihkKSxlPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGUpP25ldyBTay5idWlsdGluLmZ1bmMoKGMsYSk9PlNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiQWRkXFxcIikpOmUsdGhpcz09PWEuYWNjdW11bGF0ZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmFjY3VtdWxhdGUoZCxlLGYpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5hY2N1bXVsYXRlLmNhbGwoYixkLGUsZiksYn19fX0pLGEuY2hhaW49U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY2hhaW5cXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjaGFpbihhKXt0aGlzLml0ZXJhYmxlcz1hLHRoaXMuY3VycmVudF9pdD1udWxsLHRoaXMudHAkaXRlcm5leHQ9KCk9Pih0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LHRoaXMuY3VycmVudF9pdD10aGlzLml0ZXJhYmxlcy50cCRpdGVybmV4dCgpLHZvaWQgMD09PXRoaXMuY3VycmVudF9pdCk/dm9pZCh0aGlzLnRwJGl0ZXJuZXh0PSgpPT52b2lkIDApOih0aGlzLmN1cnJlbnRfaXQ9U2suYWJzdHIuaXRlcih0aGlzLmN1cnJlbnRfaXQpLHRoaXMudHAkaXRlcm5leHQoKSl9LGl0ZXJuZXh0KCl7Zm9yKGxldCBhO3ZvaWQgMD09PWE7KWlmKGE9dGhpcy5jdXJyZW50X2l0LnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09YSl7aWYodGhpcy5jdXJyZW50X2l0PXRoaXMuaXRlcmFibGVzLnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09dGhpcy5jdXJyZW50X2l0KXJldHVybiB2b2lkKHRoaXMudHAkaXRlcm5leHQ9KCk9PnZvaWQgMCk7dGhpcy5jdXJyZW50X2l0PVNrLmFic3RyLml0ZXIodGhpcy5jdXJyZW50X2l0KX1lbHNlIHJldHVybiBhfSxzbG90czp7dHAkZG9jOlxcXCJjaGFpbigqaXRlcmFibGVzKSAtLT4gY2hhaW4gb2JqZWN0XFxcXG5cXFxcblJldHVybiBhIGNoYWluIG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBlbGVtZW50cyBmcm9tIHRoZVxcXFxuZmlyc3QgaXRlcmFibGUgdW50aWwgaXQgaXMgZXhoYXVzdGVkLCB0aGVuIGVsZW1lbnRzIGZyb20gdGhlIG5leHRcXFxcbml0ZXJhYmxlLCB1bnRpbCBhbGwgb2YgdGhlIGl0ZXJhYmxlcyBhcmUgZXhoYXVzdGVkLlxcXCIsdHAkbmV3KGIsYyl7aWYoU2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiY2hhaW5cXFwiLGMpLGI9bmV3IFNrLmJ1aWx0aW4udHVwbGUoYi5zbGljZSgwKSkudHAkaXRlcigpLHRoaXM9PT1hLmNoYWluLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuY2hhaW4oYik7ZWxzZXtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmNoYWluLmNhbGwoYyxiKSxjfX19LGNsYXNzbWV0aG9kczp7ZnJvbV9pdGVyYWJsZTp7JG1ldGgoYil7Y29uc3QgYz1Tay5hYnN0ci5pdGVyKGIpO3JldHVybiBuZXcgYS5jaGFpbihjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XFxcImNoYWluLmZyb21faXRlcmFibGUoaXRlcmFibGUpIC0tPiBjaGFpbiBvYmplY3RcXFxcblxcXFxuQWx0ZXJuYXRlIGNoYWluKCkgY29uc3RydWN0b3IgdGFraW5nIGEgc2luZ2xlIGl0ZXJhYmxlIGFyZ3VtZW50XFxcXG50aGF0IGV2YWx1YXRlcyBsYXppbHkuXFxcIiwkdGV4dHNpZzpudWxsfX19KSxhLmNvbWJpbmF0aW9ucz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jb21iaW5hdGlvbnNcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjb21iaW5hdGlvbnMoYSxiKXt0aGlzLnBvb2w9YSx0aGlzLnI9Yix0aGlzLmluZGljZXM9QXJyYXkoYikuZmlsbCgpLm1hcCgoYSxiKT0+YiksdGhpcy5uPWEubGVuZ3RoLHRoaXMudHAkaXRlcm5leHQ9KCk9PntpZighKHRoaXMucj50aGlzLm4pKXJldHVybiB0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMucG9vbC5zbGljZSgwLHRoaXMucikpfX0saXRlcm5leHQoKXtsZXQgYSxiPSExO2ZvcihhPXRoaXMuci0xOzA8PWE7YS0tKWlmKHRoaXMuaW5kaWNlc1thXSE9YSt0aGlzLm4tdGhpcy5yKXtiPSEwO2JyZWFrfWlmKCFiKXJldHVybiB2b2lkKHRoaXMucj0wKTt0aGlzLmluZGljZXNbYV0rKztmb3IobGV0IGI9YSsxO2I8dGhpcy5yO2IrKyl0aGlzLmluZGljZXNbYl09dGhpcy5pbmRpY2VzW2ItMV0rMTtjb25zdCBjPXRoaXMuaW5kaWNlcy5tYXAoYT0+dGhpcy5wb29sW2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYyl9LHNsb3RzOnt0cCRkb2M6XFxcImNvbWJpbmF0aW9ucyhpdGVyYWJsZSwgcikgLS0+IGNvbWJpbmF0aW9ucyBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHN1Y2Nlc3NpdmUgci1sZW5ndGggY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIGluIHRoZSBpdGVyYWJsZS5cXFxcblxcXFxuY29tYmluYXRpb25zKHJhbmdlKDQpLCAzKSAtLT4gKDAsMSwyKSwgKDAsMSwzKSwgKDAsMiwzKSwgKDEsMiwzKVxcXCIsdHAkbmV3KGIsYyl7cmV0dXJuIGNvbWJpbmF0aW9uc05ldy5jYWxsKHRoaXMsYS5jb21iaW5hdGlvbnMucHJvdG90eXBlLGIsYyl9fX0pLGEuY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnRcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudChhLGIpe3RoaXMucG9vbD1hLHRoaXMucj1iLHRoaXMuaW5kaWNlcz1BcnJheShiKS5maWxsKDApLHRoaXMubj1hLmxlbmd0aCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYoIXRoaXMucnx8dGhpcy5uKXt0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0O2NvbnN0IGE9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShhKX19fSxpdGVybmV4dCgpe2xldCBhLGI9ITE7Zm9yKGE9dGhpcy5yLTE7MDw9YTthLS0paWYodGhpcy5pbmRpY2VzW2FdIT10aGlzLm4tMSl7Yj0hMDticmVha31pZighYilyZXR1cm4gdm9pZCh0aGlzLnI9MCk7Y29uc3QgYz10aGlzLmluZGljZXNbYV0rMTtmb3IobGV0IGI9YTtiPHRoaXMucjtiKyspdGhpcy5pbmRpY2VzW2JdPWM7Y29uc3QgZD10aGlzLmluZGljZXMubWFwKGE9PnRoaXMucG9vbFthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGQpfSxzbG90czp7dHAkZG9jOlxcXCJjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudChpdGVyYWJsZSwgcikgLS0+IGNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50IG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSByLWxlbmd0aCBjb21iaW5hdGlvbnMgb2YgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlXFxcXG5hbGxvd2luZyBpbmRpdmlkdWFsIGVsZW1lbnRzIHRvIGhhdmUgc3VjY2Vzc2l2ZSByZXBlYXRzLlxcXFxuY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoJ0FCQycsIDIpIC0tPiBBQSBBQiBBQyBCQiBCQyBDQ1xcXCIsdHAkbmV3KGIsYyl7cmV0dXJuIGNvbWJpbmF0aW9uc05ldy5jYWxsKHRoaXMsYS5jb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudC5wcm90b3R5cGUsYixjKX19fSksYS5jb21wcmVzcz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jb21wcmVzc1xcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGNvbXByZXNzKGEsYil7dGhpcy5kYXRhPWEsdGhpcy5zZWxlY3RvcnM9Yn0saXRlcm5leHQoKXtsZXQgYT10aGlzLmRhdGEudHAkaXRlcm5leHQoKSxiPXRoaXMuc2VsZWN0b3JzLnRwJGl0ZXJuZXh0KCk7Zm9yKDt2b2lkIDAhPT1hJiZ2b2lkIDAhPT1iOyl7aWYoU2subWlzY2V2YWwuaXNUcnVlKGIpKXJldHVybiBhO2E9dGhpcy5kYXRhLnRwJGl0ZXJuZXh0KCksYj10aGlzLnNlbGVjdG9ycy50cCRpdGVybmV4dCgpfX0sc2xvdHM6e3RwJGRvYzpcXFwiY29tcHJlc3MoZGF0YSwgc2VsZWN0b3JzKSAtLT4gaXRlcmF0b3Igb3ZlciBzZWxlY3RlZCBkYXRhXFxcXG5cXFxcblJldHVybiBkYXRhIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdHJ1ZSBzZWxlY3RvciBlbGVtZW50cy5cXFxcbkZvcm1zIGEgc2hvcnRlciBpdGVyYXRvciBmcm9tIHNlbGVjdGVkIGRhdGEgZWxlbWVudHMgdXNpbmcgdGhlXFxcXG5zZWxlY3RvcnMgdG8gY2hvb3NlIHRoZSBkYXRhIGVsZW1lbnRzLlxcXCIsdHAkbmV3KGIsYyl7bGV0IGQsZTtpZihbZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiY29tcHJlc3NcXFwiLFtcXFwiZGF0YVxcXCIsXFxcInNlbGVjdG9yc1xcXCJdLGIsYyxbXSksZD1Tay5hYnN0ci5pdGVyKGQpLGU9U2suYWJzdHIuaXRlcihlKSx0aGlzPT09YS5jb3VudC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmNvbXByZXNzKGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmNvbXByZXNzLmNhbGwoYixkLGUpLGJ9fX19KSxhLmNvdW50PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNvdW50XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY291bnQoYSxiKXt0aGlzLnN0YXJ0PWEsdGhpcy5zdGVwPWJ9LGl0ZXJuZXh0KCl7Y29uc3QgYT10aGlzLnN0YXJ0O3JldHVybiB0aGlzLnN0YXJ0PVNrLmFic3RyLm51bWJlckJpbk9wKHRoaXMuc3RhcnQsdGhpcy5zdGVwLFxcXCJBZGRcXFwiKSxhfSxzbG90czp7dHAkZG9jOlxcXCJjb3VudChzdGFydD0wLCBzdGVwPTEpIC0tPiBjb3VudCBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY291bnQgb2JqZWN0IHdob3NlIC5fX25leHRfXygpIG1ldGhvZCByZXR1cm5zIGNvbnNlY3V0aXZlIHZhbHVlcy5cXFxcbkVxdWl2YWxlbnQgdG86XFxcXG5cXFxcbiAgICBkZWYgY291bnQoZmlyc3R2YWw9MCwgc3RlcD0xKTpcXFxcbiAgICAgICAgeCA9IGZpcnN0dmFsXFxcXG4gICAgICAgIHdoaWxlIDE6XFxcXG4gICAgICAgICAgICB5aWVsZCB4XFxcXG4gICAgICAgICAgICB4ICs9IHN0ZXBcXFxcblxcXCIsdHAkbmV3KGIsYyl7Y29uc3RbZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiY291bnRcXFwiLFtcXFwic3RhcnRcXFwiLFxcXCJzdGVwXFxcIl0sYixjLFtuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMSldKTtpZighU2suYnVpbHRpbi5jaGVja051bWJlcihkKSYmIVNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4KGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiYSBudW1iZXIgaXMgcmVxdWlyZWRcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja051bWJlcihlKSYmIVNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4KGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiYSBudW1iZXIgaXMgcmVxdWlyZWRcXFwiKTtpZih0aGlzPT09YS5jb3VudC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmNvdW50KGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmNvdW50LmNhbGwoYixkLGUpLGJ9fSwkcigpe2NvbnN0IGE9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0YXJ0KTtsZXQgYj1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuc3RlcCk7cmV0dXJuIGI9XFxcIjFcXFwiPT09Yj9cXFwiXFxcIjpcXFwiLCBcXFwiK2IsbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1xcXCIoXFxcIithK2IrXFxcIilcXFwiKX19fSksYS5jeWNsZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jeWNsZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGN5Y2xlKGEpe3RoaXMuaXRlcj1hLHRoaXMuc2F2ZWQ9W10sdGhpcy5jb25zdW1lZD0hMSx0aGlzLmk9MCx0aGlzLmxlbmd0aH0saXRlcm5leHQoKXtsZXQgYTtpZighdGhpcy5jb25zdW1lZCl7aWYoYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKSx2b2lkIDAhPT1hKXJldHVybiB0aGlzLnNhdmVkLnB1c2goYSksYTtpZih0aGlzLmNvbnN1bWVkPSEwLHRoaXMubGVuZ3RoPXRoaXMuc2F2ZWQubGVuZ3RoLCF0aGlzLmxlbmd0aClyZXR1cm59cmV0dXJuIGE9dGhpcy5zYXZlZFt0aGlzLmldLHRoaXMuaT0odGhpcy5pKzEpJXRoaXMubGVuZ3RoLGF9LHNsb3RzOnt0cCRkb2M6XFxcImN5Y2xlKGl0ZXJhYmxlKSAtLT4gY3ljbGUgb2JqZWN0XFxcXG5cXFxcblJldHVybiBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYWJsZSB1bnRpbCBpdCBpcyBleGhhdXN0ZWQuXFxcXG5UaGVuIHJlcGVhdCB0aGUgc2VxdWVuY2UgaW5kZWZpbml0ZWx5LlxcXCIsdHAkbmV3KGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcoXFxcImN5Y2xlXFxcIixiLGMpO2NvbnN0IGQ9U2suYWJzdHIuaXRlcihiWzBdKTtpZih0aGlzPT09YS5jeWNsZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmN5Y2xlKGQpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jeWNsZS5jYWxsKGIsZCksYn19fX0pLGEuZHJvcHdoaWxlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmRyb3B3aGlsZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGRyb3B3aGlsZShhLGIpe3RoaXMucHJlZGljYXRlPWEsdGhpcy5pdGVyPWIsdGhpcy5wYXNzZWR9LGl0ZXJuZXh0KCl7bGV0IGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7Zm9yKDt2b2lkIDA9PT10aGlzLnBhc3NlZCYmdm9pZCAwIT09YTspe2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSk7aWYoIVNrLm1pc2NldmFsLmlzVHJ1ZShiKSlyZXR1cm4gdGhpcy5wYXNzZWQ9ITAsYTthPXRoaXMuaXRlci50cCRpdGVybmV4dCgpfXJldHVybiBhfSxzbG90czp7dHAkZG9jOlxcXCJkcm9wd2hpbGUocHJlZGljYXRlLCBpdGVyYWJsZSkgLS0+IGRyb3B3aGlsZSBvYmplY3RcXFxcblxcXFxuRHJvcCBpdGVtcyBmcm9tIHRoZSBpdGVyYWJsZSB3aGlsZSBwcmVkaWNhdGUoaXRlbSkgaXMgdHJ1ZS5cXFxcbkFmdGVyd2FyZHMsIHJldHVybiBldmVyeSBlbGVtZW50IHVudGlsIHRoZSBpdGVyYWJsZSBpcyBleGhhdXN0ZWQuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJkcm9wd2hpbGVcXFwiLGMpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiZHJvcHdoaWxlXFxcIixiLDIsMik7Y29uc3QgZD1iWzBdLGU9U2suYWJzdHIuaXRlcihiWzFdKTtpZih0aGlzPT09YS5kcm9wd2hpbGUucHJvdG90eXBlKXJldHVybiBuZXcgYS5kcm9wd2hpbGUoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuZHJvcHdoaWxlLmNhbGwoYixkLGUpLGJ9fX19KSxhLmZpbHRlcmZhbHNlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmZpbHRlcmZhbHNlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZmlsdGVyZmFsc2UoYSxiKXt0aGlzLnByZWRpY2F0ZT1hLHRoaXMuaXRlcj1ifSxpdGVybmV4dCgpe2xldCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMCE9PWEpe2ZvcihsZXQgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5wcmVkaWNhdGUsW2FdKTtTay5taXNjZXZhbC5pc1RydWUoYik7KXtpZihhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpLHZvaWQgMD09PWEpcmV0dXJuO2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSl9cmV0dXJuIGF9fSxzbG90czp7dHAkZG9jOlxcXCJmaWx0ZXJmYWxzZShmdW5jdGlvbiBvciBOb25lLCBzZXF1ZW5jZSkgLS0+IGZpbHRlcmZhbHNlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gdGhvc2UgaXRlbXMgb2Ygc2VxdWVuY2UgZm9yIHdoaWNoIGZ1bmN0aW9uKGl0ZW0pIGlzIGZhbHNlLlxcXFxuSWYgZnVuY3Rpb24gaXMgTm9uZSwgcmV0dXJuIHRoZSBpdGVtcyB0aGF0IGFyZSBmYWxzZS5cXFwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImZpbHRlcmZhbHNlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImZpbHRlcmZhbHNlXFxcIixiLDIsMik7Y29uc3QgZD1Tay5idWlsdGluLmNoZWNrTm9uZShiWzBdKT9Tay5idWlsdGluLmJvb2w6YlswXSxlPVNrLmFic3RyLml0ZXIoYlsxXSk7aWYodGhpcz09PWEuZmlsdGVyZmFsc2UucHJvdG90eXBlKXJldHVybiBuZXcgYS5maWx0ZXJmYWxzZShkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5maWx0ZXJmYWxzZS5jYWxsKGIsZCxlKSxifX19fSksYS5fZ3JvdXBlcj1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5fZ3JvdXBlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIF9ncm91cGVyKGEpe3RoaXMuZ3JvdXBieT1hLHRoaXMudGd0a2V5PWEudGd0a2V5LHRoaXMuaWQ9YS5pZH0saXRlcm5leHQoKXtjb25zdCBhPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCh0aGlzLmdyb3VwYnkuY3VycmtleSx0aGlzLnRndGtleSxcXFwiRXFcXFwiKTtpZih0aGlzLmdyb3VwYnkuaWQ9PT10aGlzLmlkJiZhKXtsZXQgYT10aGlzLmdyb3VwYnkuY3VycnZhbDtyZXR1cm4gdGhpcy5ncm91cGJ5LmN1cnJ2YWw9dGhpcy5ncm91cGJ5Lml0ZXIudHAkaXRlcm5leHQoKSx2b2lkIDAhPT10aGlzLmdyb3VwYnkuY3VycnZhbCYmKHRoaXMuZ3JvdXBieS5jdXJya2V5PVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmdyb3VwYnkua2V5ZixbdGhpcy5ncm91cGJ5LmN1cnJ2YWxdKSksYX19fSksYS5ncm91cGJ5PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmdyb3VwYnlcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBncm91cGJ5KGEsYil7dGhpcy5pdGVyPWEsdGhpcy5rZXlmPWIsdGhpcy5jdXJydmFsLHRoaXMuY3VycmtleT10aGlzLnRndGtleT1uZXcgU2suYnVpbHRpbi5vYmplY3QsdGhpcy5pZH0saXRlcm5leHQoKXt0aGlzLmlkPXt9O2ZvcihsZXQgYT1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5jdXJya2V5LHRoaXMudGd0a2V5LFxcXCJFcVxcXCIpO2E7KXtpZih0aGlzLmN1cnJ2YWw9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09dGhpcy5jdXJydmFsKXJldHVybjt0aGlzLmN1cnJrZXk9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMua2V5ZixbdGhpcy5jdXJydmFsXSksYT1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5jdXJya2V5LHRoaXMudGd0a2V5LFxcXCJFcVxcXCIpfXRoaXMudGd0a2V5PXRoaXMuY3VycmtleTtjb25zdCBiPW5ldyBhLl9ncm91cGVyKHRoaXMpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbdGhpcy5jdXJya2V5LGJdKX0sc2xvdHM6e3RwJGRvYzpcXFwiZ3JvdXBieShpdGVyYWJsZSwga2V5PU5vbmUpIC0+IG1ha2UgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGNvbnNlY3V0aXZlXFxcXG5rZXlzIGFuZCBncm91cHMgZnJvbSB0aGUgaXRlcmFibGUuICBJZiB0aGUga2V5IGZ1bmN0aW9uIGlzIG5vdCBzcGVjaWZpZWQgb3JcXFxcbmlzIE5vbmUsIHRoZSBlbGVtZW50IGl0c2VsZiBpcyB1c2VkIGZvciBncm91cGluZy5cXFxcblxcXCIsdHAkbmV3KGIsYyl7bGV0IGQsZTtpZihbZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiZ3JvdXBieVxcXCIsW1xcXCJpdGVyYWJsZVxcXCIsXFxcImtleVxcXCJdLGIsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkXSksZD1Tay5hYnN0ci5pdGVyKGQpLGU9U2suYnVpbHRpbi5jaGVja05vbmUoZSk/bmV3IFNrLmJ1aWx0aW4uZnVuYyhhPT5hKTplLHRoaXM9PT1hLmdyb3VwYnkucHJvdG90eXBlKXJldHVybiBuZXcgYS5ncm91cGJ5KGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmdyb3VwYnkuY2FsbChiLGQsZSksYn19fX0pLGEuaXNsaWNlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmlzbGljZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGlzbGljZShhLGIsYyxkKXt0aGlzLml0ZXI9YSx0aGlzLnByZXZpdD1iLHRoaXMuc3RvcD1jLHRoaXMuc3RlcD1kLHRoaXMudHAkaXRlcm5leHQ9KCk9PntpZih0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LHRoaXMucHJldml0Pj10aGlzLnN0b3Ape2ZvcihsZXQgYT0wO2E8dGhpcy5zdG9wO2ErKyl0aGlzLml0ZXIudHAkaXRlcm5leHQoKTtyZXR1cm59Zm9yKGxldCBhPTA7YTx0aGlzLnByZXZpdDthKyspdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJuIHRoaXMuaXRlci50cCRpdGVybmV4dCgpfX0saXRlcm5leHQoKXtpZih0aGlzLnByZXZpdCt0aGlzLnN0ZXA+PXRoaXMuc3RvcCl7Zm9yKGxldCBhPXRoaXMucHJldml0KzE7YTx0aGlzLnN0b3A7YSsrKXRoaXMucHJldml0Kz10aGlzLnN0ZXAsdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJufWZvcihsZXQgYT10aGlzLnByZXZpdCsxO2E8dGhpcy5wcmV2aXQrdGhpcy5zdGVwO2ErKyl0aGlzLml0ZXIudHAkaXRlcm5leHQoKTtyZXR1cm4gdGhpcy5wcmV2aXQrPXRoaXMuc3RlcCx0aGlzLml0ZXIudHAkaXRlcm5leHQoKX0sc2xvdHM6e3RwJGRvYzpcXFwiaXNsaWNlKGl0ZXJhYmxlLCBzdG9wKSAtLT4gaXNsaWNlIG9iamVjdFxcXFxuaXNsaWNlKGl0ZXJhYmxlLCBzdGFydCwgc3RvcFssIHN0ZXBdKSAtLT4gaXNsaWNlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYW4gaXRlcmF0b3Igd2hvc2UgbmV4dCgpIG1ldGhvZCByZXR1cm5zIHNlbGVjdGVkIHZhbHVlcyBmcm9tIGFuXFxcXG5pdGVyYWJsZS4gIElmIHN0YXJ0IGlzIHNwZWNpZmllZCwgd2lsbCBza2lwIGFsbCBwcmVjZWRpbmcgZWxlbWVudHM7XFxcXG5vdGhlcndpc2UsIHN0YXJ0IGRlZmF1bHRzIHRvIHplcm8uICBTdGVwIGRlZmF1bHRzIHRvIG9uZS4gIElmXFxcXG5zcGVjaWZpZWQgYXMgYW5vdGhlciB2YWx1ZSwgc3RlcCBkZXRlcm1pbmVzIGhvdyBtYW55IHZhbHVlcyBhcmUgXFxcXG5za2lwcGVkIGJldHdlZW4gc3VjY2Vzc2l2ZSBjYWxscy4gIFdvcmtzIGxpa2UgYSBzbGljZSgpIG9uIGEgbGlzdFxcXFxuYnV0IHJldHVybnMgYW4gaXRlcmF0b3IuXFxcIix0cCRuZXcoYixjKXt2YXIgZD1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJpc2xpY2VcXFwiLGMpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXNsaWNlXFxcIixiLDIsNCk7Y29uc3QgZT1Tay5hYnN0ci5pdGVyKGJbMF0pO2xldCBmPWJbMV0sZz1iWzJdLGg9YlszXTtpZih2b2lkIDA9PT1nPyhnPWYsZj1Tay5idWlsdGluLm5vbmUubm9uZSQsaD1Tay5idWlsdGluLm5vbmUubm9uZSQpOnZvaWQgMD09PWgmJihoPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCksIShTay5idWlsdGluLmNoZWNrTm9uZShnKXx8U2subWlzY2V2YWwuaXNJbmRleChnKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiU3RvcCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtlbHNlIGlmKGc9U2suYnVpbHRpbi5jaGVja05vbmUoZyk/ZDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZyksMD5nfHxnPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiU3RvcCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtpZighKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpfHxTay5taXNjZXZhbC5pc0luZGV4KGYpKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJJbmRpY2VzIGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLlxcXCIpO2Vsc2UgaWYoZj1Tay5idWlsdGluLmNoZWNrTm9uZShmKT8wOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChmKSwwPmZ8fGY+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJJbmRpY2VzIGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLlxcXCIpO2lmKCEoU2suYnVpbHRpbi5jaGVja05vbmUoaCl8fFNrLm1pc2NldmFsLmlzSW5kZXgoaCkpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0ZXAgZm9yIGlzbGljZSgpIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIE5vbmVcXFwiKTtlbHNlIGlmKGg9U2suYnVpbHRpbi5jaGVja05vbmUoaCk/MTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoaCksMD49aHx8aD5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0ZXAgZm9yIGlzbGljZSgpIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIE5vbmUuXFxcIik7aWYodGhpcz09PWEuaXNsaWNlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuaXNsaWNlKGUsZixnLGgpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5pc2xpY2UuY2FsbChiLGUsZixnLGgpLGJ9fX19KSxhLnBlcm11dGF0aW9ucz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5wZXJtdXRhdGlvbnNcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBwZXJtdXRhdGlvbnMoYSxiKXt0aGlzLnBvb2w9YSx0aGlzLnI9Yjtjb25zdCBjPWEubGVuZ3RoO3RoaXMuaW5kaWNlcz1BcnJheShjKS5maWxsKCkubWFwKChhLGIpPT5iKSx0aGlzLmN5Y2xlcz1BcnJheShiKS5maWxsKCkubWFwKChhLGIpPT5jLWIpLHRoaXMubj1jLHRoaXMudHAkaXRlcm5leHQ9KCk9PntpZighKHRoaXMucj50aGlzLm4pKXJldHVybiB0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMucG9vbC5zbGljZSgwLHRoaXMucikpfX0saXRlcm5leHQoKXtmb3IobGV0IGE9dGhpcy5yLTE7MDw9YTthLS0paWYodGhpcy5jeWNsZXNbYV0tLSwwPT10aGlzLmN5Y2xlc1thXSl0aGlzLmluZGljZXMucHVzaCh0aGlzLmluZGljZXMuc3BsaWNlKGEsMSlbMF0pLHRoaXMuY3ljbGVzW2FdPXRoaXMubi1hO2Vsc2V7aj10aGlzLmN5Y2xlc1thXSxbdGhpcy5pbmRpY2VzW2FdLHRoaXMuaW5kaWNlc1t0aGlzLm4tal1dPVt0aGlzLmluZGljZXNbdGhpcy5uLWpdLHRoaXMuaW5kaWNlc1thXV07Y29uc3QgYj10aGlzLmluZGljZXMubWFwKGE9PnRoaXMucG9vbFthXSkuc2xpY2UoMCx0aGlzLnIpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShiKX10aGlzLnI9MH0sc2xvdHM6e3RwJGRvYzpcXFwicGVybXV0YXRpb25zKGl0ZXJhYmxlWywgcl0pIC0tPiBwZXJtdXRhdGlvbnMgb2JqZWN0XFxcXG5cXFxcblJldHVybiBzdWNjZXNzaXZlIHItbGVuZ3RoIHBlcm11dGF0aW9ucyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUuXFxcXG5cXFxcbnBlcm11dGF0aW9ucyhyYW5nZSgzKSwgMikgLS0+ICgwLDEpLCAoMCwyKSwgKDEsMCksICgxLDIpLCAoMiwwKSwgKDIsMSlcXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7W2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcInBlcm11dGF0aW9uc1xcXCIsW1xcXCJpdGVyYWJsZVxcXCIsXFxcInJcXFwiXSxiLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO2NvbnN0IGY9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoZCk7aWYoZT1Tay5idWlsdGluLmNoZWNrTm9uZShlKT9mLmxlbmd0aDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZSxTay5idWlsdGluLk92ZXJGbG93RXJyb3IpLDA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJyIG11c3QgYmUgbm9uLW5lZ2F0aXZlXFxcIik7aWYodGhpcz09PWEucGVybXV0YXRpb25zLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEucGVybXV0YXRpb25zKGYsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnBlcm11dGF0aW9ucy5jYWxsKGIsZixlKSxifX19fSksYS5wcm9kdWN0PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLnByb2R1Y3RcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBwcm9kdWN0KGEpe3RoaXMucG9vbHM9YSx0aGlzLm49YS5sZW5ndGgsdGhpcy5pbmRpY2VzPUFycmF5KGEubGVuZ3RoKS5maWxsKDApLHRoaXMucG9vbF9zaXplcz1hLm1hcChhPT5hLmxlbmd0aCksdGhpcy50cCRpdGVybmV4dD0oKT0+e3RoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQ7Y29uc3QgYT10aGlzLmluZGljZXMubWFwKChhLGIpPT50aGlzLnBvb2xzW2JdW3RoaXMuaW5kaWNlc1tiXV0pO3JldHVybiBhLnNvbWUoYT0+dm9pZCAwPT09YSk/dm9pZCh0aGlzLm49MCk6bmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9fSxpdGVybmV4dCgpe2ZvcihsZXQgYT10aGlzLm4tMTswPD1hJiZhPHRoaXMubjspdGhpcy5pbmRpY2VzW2FdKyssdGhpcy5pbmRpY2VzW2FdPj10aGlzLnBvb2xfc2l6ZXNbYV0/KHRoaXMuaW5kaWNlc1thXT0tMSxhLS0pOmErKztpZighdGhpcy5ufHx0aGlzLmluZGljZXMuZXZlcnkoYT0+LTE9PT1hKSlyZXR1cm4gdm9pZCh0aGlzLm49MCk7ZWxzZXtjb25zdCBhPXRoaXMuaW5kaWNlcy5tYXAoKGEsYik9PnRoaXMucG9vbHNbYl1bdGhpcy5pbmRpY2VzW2JdXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGEpfX0sc2xvdHM6e3RwJGRvYzpcXFwicHJvZHVjdCgqaXRlcmFibGVzLCByZXBlYXQ9MSkgLS0+IHByb2R1Y3Qgb2JqZWN0XFxcXG5cXFxcbkNhcnRlc2lhbiBwcm9kdWN0IG9mIGlucHV0IGl0ZXJhYmxlcy4gIEVxdWl2YWxlbnQgdG8gbmVzdGVkIGZvci1sb29wcy5cXFxcblxcXFxuRm9yIGV4YW1wbGUsIHByb2R1Y3QoQSwgQikgcmV0dXJucyB0aGUgc2FtZSBhczogICgoeCx5KSBmb3IgeCBpbiBBIGZvciB5IGluIEIpLlxcXFxuVGhlIGxlZnRtb3N0IGl0ZXJhdG9ycyBhcmUgaW4gdGhlIG91dGVybW9zdCBmb3ItbG9vcCwgc28gdGhlIG91dHB1dCB0dXBsZXNcXFxcbmN5Y2xlIGluIGEgbWFubmVyIHNpbWlsYXIgdG8gYW4gb2RvbWV0ZXIgKHdpdGggdGhlIHJpZ2h0bW9zdCBlbGVtZW50IGNoYW5naW5nXFxcXG5vbiBldmVyeSBpdGVyYXRpb24pLlxcXFxuXFxcXG5UbyBjb21wdXRlIHRoZSBwcm9kdWN0IG9mIGFuIGl0ZXJhYmxlIHdpdGggaXRzZWxmLCBzcGVjaWZ5IHRoZSBudW1iZXJcXFxcbm9mIHJlcGV0aXRpb25zIHdpdGggdGhlIG9wdGlvbmFsIHJlcGVhdCBrZXl3b3JkIGFyZ3VtZW50LiBGb3IgZXhhbXBsZSxcXFxcbnByb2R1Y3QoQSwgcmVwZWF0PTQpIG1lYW5zIHRoZSBzYW1lIGFzIHByb2R1Y3QoQSwgQSwgQSwgQSkuXFxcXG5cXFxcbnByb2R1Y3QoJ2FiJywgcmFuZ2UoMykpIC0tPiAoJ2EnLDApICgnYScsMSkgKCdhJywyKSAoJ2InLDApICgnYicsMSkgKCdiJywyKVxcXFxucHJvZHVjdCgoMCwxKSwgKDAsMSksICgwLDEpKSAtLT4gKDAsMCwwKSAoMCwwLDEpICgwLDEsMCkgKDAsMSwxKSAoMSwwLDApIC4uLlxcXCIsdHAkbmV3KGIsYyl7bGV0W2RdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJwcm9kdWN0XFxcIixbXFxcInJlcGVhdFxcXCJdLFtdLGMsW25ldyBTay5idWlsdGluLmludF8oMSldKTtpZihkPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChkLFNrLmJ1aWx0aW4uT3ZlckZsb3dFcnJvciksMD5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcInJlcGVhdCBhcmd1bWVudCBjYW5ub3QgYmUgbmVnYXRpdmVcXFwiKTtjb25zdCBlPVtdO2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSsrKWUucHVzaChTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShiW2FdKSk7Y29uc3QgZj1bXS5jb25jYXQoLi4uQXJyYXkoZCkuZmlsbChlKSk7aWYodGhpcz09PWEucHJvZHVjdC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnByb2R1Y3QoZik7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnByb2R1Y3QuY2FsbChiLGYpLGJ9fX19KSxhLnJlcGVhdD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5yZXBlYXRcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiByZXBlYXQoYSxiKXt0aGlzLm9iamVjdD1hLHRoaXMudGltZXM9Yix2b2lkIDA9PT1iJiYodGhpcy50cCRpdGVybmV4dD0oKT0+dGhpcy5vYmplY3QpfSxpdGVybmV4dCgpe3JldHVybiAwPHRoaXMudGltZXMtLT90aGlzLm9iamVjdDp2b2lkIDB9LHNsb3RzOnt0cCRkb2M6XFxcInJlcGVhdChvYmplY3QgWyx0aW1lc10pIC0+IGNyZWF0ZSBhbiBpdGVyYXRvciB3aGljaCByZXR1cm5zIHRoZSBvYmplY3RcXFxcbmZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcy4gIElmIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgdGhlIG9iamVjdFxcXFxuZW5kbGVzc2x5LlxcXCIsdHAkbmV3KGIsYyl7bGV0IGQsZTtpZihbZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwicmVwZWF0XFxcIixbXFxcIm9iamVjdFxcXCIsXFxcInRpbWVzXFxcIl0sYixjLFtudWxsXSksZT1udWxsPT09ZT92b2lkIDA6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGUsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSx0aGlzPT09YS5yZXBlYXQucHJvdG90eXBlKXJldHVybiBuZXcgYS5yZXBlYXQoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEucmVwZWF0LmNhbGwoYixkLGUpLGJ9fSwkcigpe3JldHVybiBvYmplY3RfcmVwcj1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMub2JqZWN0KSx0aW1lc19yZXByPXZvaWQgMD09PXRoaXMudGltZXM/XFxcIlxcXCI6XFxcIiwgXFxcIisoMDw9dGhpcy50aW1lcz90aGlzLnRpbWVzOjApLG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrb2JqZWN0X3JlcHIrdGltZXNfcmVwcitcXFwiKVxcXCIpfX0sbWV0aG9kczp7X19sZW5naHRfaGludF9fOnskbWV0aCgpe2lmKHZvaWQgMD09PXRoaXMudGltZXMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJsZW4oKSBvZiB1bnNpemVkIG9iamVjdFxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMudGltZXMpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbH19fSksYS5zdGFybWFwPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLnN0YXJtYXBcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBzdGFybWFwKGEsYil7dGhpcy5mdW5jPWEsdGhpcy5pdGVyPWJ9LGl0ZXJuZXh0KCl7Y29uc3QgYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKTtpZih2b2lkIDA9PT1hKXJldHVybjtjb25zdCBiPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpLGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMuZnVuYyxiKTtyZXR1cm4gY30sc2xvdHM6e3RwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcInN0YXJtYXBcXFwiLFtcXFwiZnVuY1xcXCIsXFxcIml0ZXJhYmxlXFxcIl0sYixjLFtdKSxlPVNrLmFic3RyLml0ZXIoZSksZD1Tay5idWlsdGluLmNoZWNrTm9uZShkKT9Tay5idWlsdGluLmJvb2w6ZCx0aGlzPT09YS5zdGFybWFwLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuc3Rhcm1hcChkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5zdGFybWFwLmNhbGwoYixkLGUpLGJ9fX19KSxhLnRha2V3aGlsZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy50YWtld2hpbGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiB0YWtld2hpbGUoYSxiKXt0aGlzLnByZWRpY2F0ZT1hLHRoaXMuaXRlcj1ifSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwIT09YSl7Y29uc3QgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5wcmVkaWNhdGUsW2FdKTtpZihTay5taXNjZXZhbC5pc1RydWUoYikpcmV0dXJuIGE7dGhpcy50cCRpdGVybmV4dD0oKT0+dm9pZCAwfX0sc2xvdHM6e3RwJGRvYzpcXFwidGFrZXdoaWxlKHByZWRpY2F0ZSwgaXRlcmFibGUpIC0tPiB0YWtld2hpbGUgb2JqZWN0XFxcXG5cXFxcblJldHVybiBzdWNjZXNzaXZlIGVudHJpZXMgZnJvbSBhbiBpdGVyYWJsZSBhcyBsb25nIGFzIHRoZSBcXFxcbnByZWRpY2F0ZSBldmFsdWF0ZXMgdG8gdHJ1ZSBmb3IgZWFjaCBlbnRyeS5cXFwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcInRha2V3aGlsZVxcXCIsYyksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJ0YWtld2hpbGVcXFwiLGIsMiwyKTtjb25zdCBkPWJbMF0sZT1Tay5hYnN0ci5pdGVyKGJbMV0pO2lmKHRoaXM9PT1hLnRha2V3aGlsZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnRha2V3aGlsZShkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS50YWtld2hpbGUuY2FsbChiLGQsZSksYn19fX0pLGEudGVlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKX0pLGEuemlwX2xvbmdlc3Q9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuemlwX2xvbmdlc3RcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiB6aXBfbG9uZ2VzdChhLGIpe3RoaXMuaXRlcnM9YSx0aGlzLmZpbGx2YWx1ZT1iLHRoaXMuYWN0aXZlPXRoaXMuaXRlcnMubGVuZ3RofSxpdGVybmV4dCgpe2lmKCF0aGlzLmFjdGl2ZSlyZXR1cm47bGV0IGI7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPHRoaXMuaXRlcnMubGVuZ3RoO2QrKyl7aWYoYj10aGlzLml0ZXJzW2RdLnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09Yil7aWYodGhpcy5hY3RpdmUtLSwhdGhpcy5hY3RpdmUpcmV0dXJuO3RoaXMuaXRlcnNbZF09bmV3IGEucmVwZWF0KHRoaXMuZmlsbHZhbHVlKSxiPXRoaXMuZmlsbHZhbHVlfWMucHVzaChiKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYyl9LHNsb3RzOnt0cCRkb2M6XFxcInppcF9sb25nZXN0KGl0ZXIxIFssaXRlcjIgWy4uLl1dLCBbZmlsbHZhbHVlPU5vbmVdKSAtLT4gemlwX2xvbmdlc3Qgb2JqZWN0XFxcXG5cXFxcblJldHVybiBhIHppcF9sb25nZXN0IG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBhIHR1cGxlIHdoZXJlXFxcXG50aGUgaS10aCBlbGVtZW50IGNvbWVzIGZyb20gdGhlIGktdGggaXRlcmFibGUgYXJndW1lbnQuICBUaGUgLl9fbmV4dF9fKClcXFxcbm1ldGhvZCBjb250aW51ZXMgdW50aWwgdGhlIGxvbmdlc3QgaXRlcmFibGUgaW4gdGhlIGFyZ3VtZW50IHNlcXVlbmNlXFxcXG5pcyBleGhhdXN0ZWQgYW5kIHRoZW4gaXQgcmFpc2VzIFN0b3BJdGVyYXRpb24uICBXaGVuIHRoZSBzaG9ydGVyIGl0ZXJhYmxlc1xcXFxuYXJlIGV4aGF1c3RlZCwgdGhlIGZpbGx2YWx1ZSBpcyBzdWJzdGl0dXRlZCBpbiB0aGVpciBwbGFjZS4gIFRoZSBmaWxsdmFsdWVcXFxcbmRlZmF1bHRzIHRvIE5vbmUgb3IgY2FuIGJlIHNwZWNpZmllZCBieSBhIGtleXdvcmQgYXJndW1lbnQuXFxcXG5cXFwiLHRwJG5ldyhiLGMpe2NvbnN0W2RdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJ6aXBfbG9uZ2VzdFxcXCIsW1xcXCJmaWxsdmFsdWVcXFwiXSxbXSxjLFtTay5idWlsdGluLm5vbmUubm9uZSRdKSxlPVtdO2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSsrKWUucHVzaChTay5hYnN0ci5pdGVyKGJbYV0pKTtpZih0aGlzPT09YS56aXBfbG9uZ2VzdC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnppcF9sb25nZXN0KGUsZCk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnppcF9sb25nZXN0LmNhbGwoYixlLGQpLGJ9fX19KSxhLl9fZG9jX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcHl0aG9uIGl0ZXJ0b29scyBtb2R1bGUgaW4gU2t1bHB0XFxcIiksYS5fX3BhY2thZ2VfXz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpLGF9O1wiLFwic3JjL2xpYi9qc29uL19faW5pdF9fLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtcXFwidXNlIHN0cmljdFxcXCI7dmFyIGE9e30sYj1mdW5jdGlvbihhKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzKFxcXCJkdW1wc1xcXCIsYXJndW1lbnRzLDEsMS8wLCEwLCExKTt2YXIgYixjLGQsZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZj1uZXcgU2suYnVpbHRpbnMuZGljdChhKSxnPSExO3JldHVybiBiPXthc2NpaTohMCxzZXBhcmF0b3JzOntpdGVtX3NlcGFyYXRvcjpcXFwiLCBcXFwiLGtleV9zZXBhcmF0b3I6XFxcIjogXFxcIn19LGY9U2suZmZpLnJlbWFwVG9KcyhmKSxjPVNrLmZmaS5yZW1hcFRvSnMoZVswXSksXFxcImJvb2xlYW5cXFwiPT10eXBlb2YgZi5lbnN1cmVfYXNjaWkmJiExPT09Zi5lbnN1cmVfYXNjaWkmJihiLmFzY2lpPSExKSxcXFwiYm9vbGVhblxcXCI9PXR5cGVvZiBmLnNvcnRfa2V5cyYmZi5zb3J0X2tleXMmJihnPSEwKSxnfHwoYi5jbXA9ZnVuY3Rpb24oKXtyZXR1cm4gMH0pLFxcXCJvYmplY3RcXFwiPT10eXBlb2YgZi5zZXBhcmF0b3JzJiYyPT1mLnNlcGFyYXRvcnMubGVuZ3RoJiYoYi5zZXBhcmF0b3JzLml0ZW1fc2VwYXJhdG9yPWYuc2VwYXJhdG9yc1swXSxiLnNlcGFyYXRvcnMua2V5X3NlcGFyYXRvcj1mLnNlcGFyYXRvcnNbMV0pLGYuaW5kZW50JiYoYi5zcGFjZT1mLmluZGVudCksZi5kZWZhdWx0LGQ9c3RyaW5naWZ5KGMsYiksbmV3IFNrLmJ1aWx0aW4uc3RyKGQpfTtiLmNvX2t3YXJncz0hMCxhLmR1bXBzPW5ldyBTay5idWlsdGluLmZ1bmMoYik7dmFyIGM9ZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5weUNoZWNrQXJncyhcXFwibG9hZHNcXFwiLGFyZ3VtZW50cywxLDEvMCwhMCwhMSk7dmFyIGIsYyxkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxlPW5ldyBTay5idWlsdGlucy5kaWN0KGEpO3JldHVybiBlPVNrLmZmaS5yZW1hcFRvSnMoZSksYj1kWzBdLnYsYz1KU09OLnBhcnNlKGIpLFNrLmZmaS5yZW1hcFRvUHkoYyl9O3JldHVybiBjLmNvX2t3YXJncz0hMCxhLmxvYWRzPW5ldyBTay5idWlsdGluLmZ1bmMoYyksYX07KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihiLGQsZSl7ZnVuY3Rpb24gbyhoLGkpe2lmKCFkW2hdKXtpZighYltoXSl7dmFyIGY9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWkmJmYpcmV0dXJuIGYoaCwhMCk7aWYoZylyZXR1cm4gZyhoLCEwKTt2YXIgYz1uZXcgRXJyb3IoXFxcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXFxcIitoK1xcXCInXFxcIik7dGhyb3cgYy5jb2RlPVxcXCJNT0RVTEVfTk9UX0ZPVU5EXFxcIixjfXZhciBhPWRbaF09e2V4cG9ydHM6e319O2JbaF1bMF0uY2FsbChhLmV4cG9ydHMsZnVuY3Rpb24oYSl7dmFyIGM9YltoXVsxXVthXTtyZXR1cm4gbyhjfHxhKX0sYSxhLmV4cG9ydHMscixiLGQsZSl9cmV0dXJuIGRbaF0uZXhwb3J0c31mb3IodmFyIGc9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsYT0wO2E8ZS5sZW5ndGg7YSsrKW8oZVthXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpKHsxOltmdW5jdGlvbihhLGIpe3ZhciBjPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgSlNPTj9hKFxcXCJqc29uaWZ5XFxcIik6SlNPTjtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXtifHwoYj17fSksXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGImJihiPXtjbXA6Yn0pO3ZhciBmPWIuY21wJiZmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGZ1bmN0aW9uKGUsYSl7dmFyIGI9e2tleTplLHZhbHVlOmRbZV19LGY9e2tleTphLHZhbHVlOmRbYV19O3JldHVybiBjKGIsZil9fX0oYi5jbXApO3JldHVybiBmdW5jdGlvbiBzdHJpbmdpZnkoYSl7aWYoXFxcIm9iamVjdFxcXCIhPXR5cGVvZiBhfHxudWxsPT09YSlyZXR1cm4gYy5zdHJpbmdpZnkoYSk7aWYoZChhKSl7Zm9yKHZhciBiPVtdLGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goc3RyaW5naWZ5KGFbZ10pKTtyZXR1cm5cXFwiW1xcXCIrYi5qb2luKFxcXCIsXFxcIikrXFxcIl1cXFwifWZvcih2YXIgaCxqPWUoYSkuc29ydChmJiZmKGEpKSxiPVtdLGc9MDtnPGoubGVuZ3RoO2crKyloPWpbZ10sYi5wdXNoKHN0cmluZ2lmeShoKStcXFwiOlxcXCIrc3RyaW5naWZ5KGFbaF0pKTtyZXR1cm5cXFwie1xcXCIrYi5qb2luKFxcXCIsXFxcIikrXFxcIn1cXFwifShhKX07dmFyIGQ9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuXFxcIltvYmplY3QgQXJyYXldXFxcIj09PXt9LnRvU3RyaW5nLmNhbGwoYSl9LGU9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGEpe3ZhciBiPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHl8fGZ1bmN0aW9uKCl7cmV0dXJuITB9LGM9W107Zm9yKHZhciBkIGluIGEpYi5jYWxsKGEsZCkmJmMucHVzaChkKTtyZXR1cm4gY319LHtqc29uaWZ5OjJ9XSwyOltmdW5jdGlvbihhLGIsYyl7Yy5wYXJzZT1hKFxcXCIuL2xpYi9wYXJzZVxcXCIpLGMuc3RyaW5naWZ5PWEoXFxcIi4vbGliL3N0cmluZ2lmeVxcXCIpfSx7XFxcIi4vbGliL3BhcnNlXFxcIjozLFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiOjR9XSwzOltmdW5jdGlvbihhLGIpe3ZhciBkLGUsZixnLGg9eydcXFwiJzpcXFwiXFxcXFxcXCJcXFwiLFxcXCJcXFxcXFxcXFxcXCI6XFxcIlxcXFxcXFxcXFxcIixcXFwiL1xcXCI6XFxcIi9cXFwiLGI6XFxcIlxcXFxiXFxcIixmOlxcXCJcXFxcZlxcXCIsbjpcXFwiXFxcXG5cXFwiLHI6XFxcIlxcXFxyXFxcIix0OlxcXCJcXFxcdFxcXCJ9LGo9ZnVuY3Rpb24oYSl7dGhyb3d7bmFtZTpcXFwiU3ludGF4RXJyb3JcXFwiLG1lc3NhZ2U6YSxhdDpkLHRleHQ6Zn19LGs9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEhPT1lJiZqKFxcXCJFeHBlY3RlZCAnXFxcIithK1xcXCInIGluc3RlYWQgb2YgJ1xcXCIrZStcXFwiJ1xcXCIpLGU9Zi5jaGFyQXQoZCksZCs9MSxlfSxsPWZ1bmN0aW9uKCl7dmFyIGEsYj1cXFwiXFxcIjtmb3IoXFxcIi1cXFwiPT09ZSYmKGI9XFxcIi1cXFwiLGsoXFxcIi1cXFwiKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO2lmKFxcXCIuXFxcIj09PWUpZm9yKGIrPVxcXCIuXFxcIjtrKCkmJlxcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lO2lmKFxcXCJlXFxcIj09PWV8fFxcXCJFXFxcIj09PWUpZm9yKGIrPWUsaygpLChcXFwiLVxcXCI9PT1lfHxcXFwiK1xcXCI9PT1lKSYmKGIrPWUsaygpKTtcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZSxrKCk7cmV0dXJuIGE9K2IsaXNGaW5pdGUoYSk/YTp2b2lkIGooXFxcIkJhZCBudW1iZXJcXFwiKX0sbT1mdW5jdGlvbigpe3ZhciBiLGMsZCxhPVN0cmluZy5mcm9tQ2hhckNvZGUsZj1cXFwiXFxcIjtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlmb3IoO2soKTspe2lmKFxcXCJcXFxcXFxcIlxcXCI9PT1lKXJldHVybiBrKCksZjtpZihcXFwiXFxcXFxcXFxcXFwiIT09ZSlmKz1lO2Vsc2UgaWYoaygpLFxcXCJ1XFxcIj09PWUpe2ZvcihkPTAsYz0wOzQ+YyYmKGI9cGFyc2VJbnQoaygpLDE2KSwhIWlzRmluaXRlKGIpKTtjKz0xKWQ9MTYqZCtiO2YrPWEoZCl9ZWxzZSBpZihcXFwic3RyaW5nXFxcIj09dHlwZW9mIGhbZV0pZis9aFtlXTtlbHNlIGJyZWFrfWooXFxcIkJhZCBzdHJpbmdcXFwiKX0sbj1mdW5jdGlvbigpe2Zvcig7ZSYmXFxcIiBcXFwiPj1lOylrKCl9LG89ZnVuY3Rpb24oKXtzd2l0Y2goZSl7Y2FzZVxcXCJ0XFxcIjpyZXR1cm4gayhcXFwidFxcXCIpLGsoXFxcInJcXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwiZVxcXCIpLCEwO2Nhc2VcXFwiZlxcXCI6cmV0dXJuIGsoXFxcImZcXFwiKSxrKFxcXCJhXFxcIiksayhcXFwibFxcXCIpLGsoXFxcInNcXFwiKSxrKFxcXCJlXFxcIiksITE7Y2FzZVxcXCJuXFxcIjpyZXR1cm4gayhcXFwiblxcXCIpLGsoXFxcInVcXFwiKSxrKFxcXCJsXFxcIiksayhcXFwibFxcXCIpLG51bGw7fWooXFxcIlVuZXhwZWN0ZWQgJ1xcXCIrZStcXFwiJ1xcXCIpfSxwPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYoXFxcIltcXFwiPT09ZSl7aWYoayhcXFwiW1xcXCIpLG4oKSxcXFwiXVxcXCI9PT1lKXJldHVybiBrKFxcXCJdXFxcIiksYTtmb3IoO2U7KXtpZihhLnB1c2goZygpKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIGFycmF5XFxcIil9LHE9ZnVuY3Rpb24oKXt2YXIgYSxiPXt9O2lmKFxcXCJ7XFxcIj09PWUpe2lmKGsoXFxcIntcXFwiKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7Zm9yKDtlOyl7aWYoYT1tKCksbigpLGsoXFxcIjpcXFwiKSxPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChiLGEpJiZqKFxcXCJEdXBsaWNhdGUga2V5IFxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCIpLGJbYV09ZygpLG4oKSxcXFwifVxcXCI9PT1lKXJldHVybiBrKFxcXCJ9XFxcIiksYjtrKFxcXCIsXFxcIiksbigpfX1qKFxcXCJCYWQgb2JqZWN0XFxcIil9O2c9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLFxcXCJ7XFxcIj09PWU/cSgpOlxcXCJbXFxcIj09PWU/cCgpOlxcXCJcXFxcXFxcIlxcXCI9PT1lP20oKTpcXFwiLVxcXCI9PT1lP2woKTpcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZT9sKCk6bygpfSxiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXt2YXIgYztyZXR1cm4gZj1hLGQ9MCxlPVxcXCIgXFxcIixjPWcoKSxuKCksZSYmaihcXFwiU3ludGF4IGVycm9yXFxcIiksXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGI/ZnVuY3Rpb24gd2FsayhhLGMpe3ZhciBkLGUsZj1hW2NdO2lmKGYmJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgZilmb3IoZCBpbiBmKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmLGQpJiYoZT13YWxrKGYsZCksdm9pZCAwPT09ZT9kZWxldGUgZltkXTpmW2RdPWUpO3JldHVybiBiLmNhbGwoYSxjLGYpfSh7XFxcIlxcXCI6Y30sXFxcIlxcXCIpOmN9fSx7fV0sNDpbZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBxdW90ZShhKXtyZXR1cm4gZi5sYXN0SW5kZXg9MCxmLnRlc3QoYSk/XFxcIlxcXFxcXFwiXFxcIithLnJlcGxhY2UoZixmdW5jdGlvbihiKXt2YXIgYT1nW2JdO3JldHVyblxcXCJzdHJpbmdcXFwiPT10eXBlb2YgYT9hOlxcXCJcXFxcXFxcXHVcXFwiKyhcXFwiMDAwMFxcXCIrYi5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpfSkrXFxcIlxcXFxcXFwiXFxcIjpcXFwiXFxcXFxcXCJcXFwiK2ErXFxcIlxcXFxcXFwiXFxcIn1mdW5jdGlvbiBzdHIoYSxiKXt2YXIgZixnLGgsaixsLG09YyxuPWJbYV07c3dpdGNoKG4mJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgbiYmXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIG4udG9KU09OJiYobj1uLnRvSlNPTihhKSksXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGUmJihuPWUuY2FsbChiLGEsbikpLHR5cGVvZiBuKXtjYXNlXFxcInN0cmluZ1xcXCI6cmV0dXJuIHF1b3RlKG4pO2Nhc2VcXFwibnVtYmVyXFxcIjpyZXR1cm4gaXNGaW5pdGUobik/bitcXFwiXFxcIjpcXFwibnVsbFxcXCI7Y2FzZVxcXCJib29sZWFuXFxcIjpjYXNlXFxcIm51bGxcXFwiOnJldHVybiBuK1xcXCJcXFwiO2Nhc2VcXFwib2JqZWN0XFxcIjppZighbilyZXR1cm5cXFwibnVsbFxcXCI7aWYoYys9ZCxsPVtdLFxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG4pKXtmb3Ioaj1uLmxlbmd0aCxmPTA7ZjxqO2YrPTEpbFtmXT1zdHIoZixuKXx8XFxcIm51bGxcXFwiO3JldHVybiBoPTA9PT1sLmxlbmd0aD9cXFwiW11cXFwiOmM/XFxcIltcXFxcblxcXCIrYytsLmpvaW4oXFxcIixcXFxcblxcXCIrYykrXFxcIlxcXFxuXFxcIittK1xcXCJdXFxcIjpcXFwiW1xcXCIrbC5qb2luKFxcXCIsXFxcIikrXFxcIl1cXFwiLGM9bSxofWlmKGUmJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgZSlmb3Ioaj1lLmxlbmd0aCxmPTA7ZjxqO2YrPTEpZz1lW2ZdLFxcXCJzdHJpbmdcXFwiPT10eXBlb2YgZyYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7ZWxzZSBmb3IoZyBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLGcpJiYoaD1zdHIoZyxuKSxoJiZsLnB1c2gocXVvdGUoZykrKGM/XFxcIjogXFxcIjpcXFwiOlxcXCIpK2gpKTtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcInt9XFxcIjpjP1xcXCJ7XFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwifVxcXCI6XFxcIntcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIixjPW0saDt9fXZhciBjLGQsZSxmPS9bXFxcXFxcXFxcXFxcXFxcIlxcXFx4MDAtXFxcXHgxZlxcXFx4N2YtXFxcXHg5ZlxcXFx1MDBhZFxcXFx1MDYwMC1cXFxcdTA2MDRcXFxcdTA3MGZcXFxcdTE3YjRcXFxcdTE3YjVcXFxcdTIwMGMtXFxcXHUyMDBmXFxcXHUyMDI4LVxcXFx1MjAyZlxcXFx1MjA2MC1cXFxcdTIwNmZcXFxcdWZlZmZcXFxcdWZmZjAtXFxcXHVmZmZmXS9nLGc9e1xcXCJcXGJcXFwiOlxcXCJcXFxcXFxcXGJcXFwiLFxcXCJcXHRcXFwiOlxcXCJcXFxcXFxcXHRcXFwiLFxcXCJcXFxcblxcXCI6XFxcIlxcXFxcXFxcblxcXCIsXFxcIlxcZlxcXCI6XFxcIlxcXFxcXFxcZlxcXCIsXFxcIlxcXFxyXFxcIjpcXFwiXFxcXFxcXFxyXFxcIiwnXFxcIic6XFxcIlxcXFxcXFxcXFxcXFxcXCJcXFwiLFxcXCJcXFxcXFxcXFxcXCI6XFxcIlxcXFxcXFxcXFxcXFxcXFxcXFwifTtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiLGYpe3ZhciBnO2lmKGM9XFxcIlxcXCIsZD1cXFwiXFxcIixcXFwibnVtYmVyXFxcIj09dHlwZW9mIGYpZm9yKGc9MDtnPGY7Zys9MSlkKz1cXFwiIFxcXCI7ZWxzZVxcXCJzdHJpbmdcXFwiPT10eXBlb2YgZiYmKGQ9Zik7aWYoZT1iLGImJlxcXCJmdW5jdGlvblxcXCIhPXR5cGVvZiBiJiYoXFxcIm9iamVjdFxcXCIhPXR5cGVvZiBifHxcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGIubGVuZ3RoKSl0aHJvdyBuZXcgRXJyb3IoXFxcIkpTT04uc3RyaW5naWZ5XFxcIik7cmV0dXJuIHN0cihcXFwiXFxcIix7XFxcIlxcXCI6YX0pfX0se31dLDU6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpe3Rocm93IG5ldyBFcnJvcihcXFwic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFxcXCIpfWZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFxcXCIpfWZ1bmN0aW9uIHJ1blRpbWVvdXQoYSl7aWYoYz09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoYSwwKTtpZigoYz09PWRlZmF1bHRTZXRUaW1vdXR8fCFjKSYmc2V0VGltZW91dClyZXR1cm4gYz1zZXRUaW1lb3V0LHNldFRpbWVvdXQoYSwwKTt0cnl7cmV0dXJuIGMoYSwwKX1jYXRjaChiKXt0cnl7cmV0dXJuIGMuY2FsbChudWxsLGEsMCl9Y2F0Y2goYil7cmV0dXJuIGMuY2FsbCh0aGlzLGEsMCl9fX1mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQoYSl7aWYoZD09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGEpO2lmKChkPT09ZGVmYXVsdENsZWFyVGltZW91dHx8IWQpJiZjbGVhclRpbWVvdXQpcmV0dXJuIGQ9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChhKTt0cnl7cmV0dXJuIGQoYSl9Y2F0Y2goYil7dHJ5e3JldHVybiBkLmNhbGwobnVsbCxhKX1jYXRjaChiKXtyZXR1cm4gZC5jYWxsKHRoaXMsYSl9fX1mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKXtoJiZmJiYoaD0hMSxmLmxlbmd0aD9nPWYuY29uY2F0KGcpOmk9LTEsZy5sZW5ndGgmJmRyYWluUXVldWUoKSl9ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpe2lmKCFoKXt2YXIgYT1ydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7aD0hMDtmb3IodmFyIGI9Zy5sZW5ndGg7Yjspe2ZvcihmPWcsZz1bXTsrK2k8YjspZiYmZltpXS5ydW4oKTtpPS0xLGI9Zy5sZW5ndGh9Zj1udWxsLGg9ITEscnVuQ2xlYXJUaW1lb3V0KGEpfX1mdW5jdGlvbiBJdGVtKGEsYil7dGhpcy5mdW49YSx0aGlzLmFycmF5PWJ9ZnVuY3Rpb24gbm9vcCgpe312YXIgYyxkLGU9Yi5leHBvcnRzPXt9OyhmdW5jdGlvbigpe3RyeXtjPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6ZGVmYXVsdFNldFRpbW91dH1jYXRjaChhKXtjPWRlZmF1bHRTZXRUaW1vdXR9dHJ5e2Q9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6ZGVmYXVsdENsZWFyVGltZW91dH1jYXRjaChhKXtkPWRlZmF1bHRDbGVhclRpbWVvdXR9fSkoKTt2YXIgZixnPVtdLGg9ITEsaT0tMTtlLm5leHRUaWNrPWZ1bmN0aW9uKGEpe3ZhciBiPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoMTxhcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYltjLTFdPWFyZ3VtZW50c1tjXTtnLnB1c2gobmV3IEl0ZW0oYSxiKSksMSE9PWcubGVuZ3RofHxofHxydW5UaW1lb3V0KGRyYWluUXVldWUpfSxJdGVtLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxlLnRpdGxlPVxcXCJicm93c2VyXFxcIixlLmJyb3dzZXI9ITAsZS5lbnY9e30sZS5hcmd2PVtdLGUudmVyc2lvbj1cXFwiXFxcIixlLnZlcnNpb25zPXt9LGUub249bm9vcCxlLmFkZExpc3RlbmVyPW5vb3AsZS5vbmNlPW5vb3AsZS5vZmY9bm9vcCxlLnJlbW92ZUxpc3RlbmVyPW5vb3AsZS5yZW1vdmVBbGxMaXN0ZW5lcnM9bm9vcCxlLmVtaXQ9bm9vcCxlLnByZXBlbmRMaXN0ZW5lcj1ub29wLGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1ub29wLGUubGlzdGVuZXJzPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUuYmluZGluZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcXFwicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm5cXFwiL1xcXCJ9LGUuY2hkaXI9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFxcXCIpfSxlLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSx7fV0sNjpbZnVuY3Rpb24oYSxiKXsoZnVuY3Rpb24oYyl7dmFyIGQ9YShcXFwianNvbi1zdGFibGUtc3RyaW5naWZ5XFxcIik7Yy5icm93c2VyP3dpbmRvdy5zdHJpbmdpZnk9ZDpiLmV4cG9ydHM9ZH0pLmNhbGwodGhpcyxhKFxcXCJfcHJvY2Vzc1xcXCIpKX0se19wcm9jZXNzOjUsXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCI6MX1dfSx7fSxbNl0pO1wiLFwic3JjL2xpYi9qc29uL3N0cmluZ2lmeS5qc1wiOlwiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihiLGQsZSl7ZnVuY3Rpb24gbyhoLGkpe2lmKCFkW2hdKXtpZighYltoXSl7dmFyIGY9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWkmJmYpcmV0dXJuIGYoaCwhMCk7aWYoZylyZXR1cm4gZyhoLCEwKTt2YXIgYz1uZXcgRXJyb3IoXFxcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXFxcIitoK1xcXCInXFxcIik7dGhyb3cgYy5jb2RlPVxcXCJNT0RVTEVfTk9UX0ZPVU5EXFxcIixjfXZhciBhPWRbaF09e2V4cG9ydHM6e319O2JbaF1bMF0uY2FsbChhLmV4cG9ydHMsZnVuY3Rpb24oYSl7dmFyIGM9YltoXVsxXVthXTtyZXR1cm4gbyhjfHxhKX0sYSxhLmV4cG9ydHMscixiLGQsZSl9cmV0dXJuIGRbaF0uZXhwb3J0c31mb3IodmFyIGc9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsYT0wO2E8ZS5sZW5ndGg7YSsrKW8oZVthXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpKHsxOltmdW5jdGlvbihhLGIpe3ZhciBjPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgSlNPTj9hKFxcXCJqc29uaWZ5XFxcIik6SlNPTjtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXtifHwoYj17fSksXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGImJihiPXtjbXA6Yn0pO3ZhciBmPWIuY21wJiZmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGZ1bmN0aW9uKGUsYSl7dmFyIGI9e2tleTplLHZhbHVlOmRbZV19LGY9e2tleTphLHZhbHVlOmRbYV19O3JldHVybiBjKGIsZil9fX0oYi5jbXApO3JldHVybiBmdW5jdGlvbiBzdHJpbmdpZnkoYSl7aWYoXFxcIm9iamVjdFxcXCIhPXR5cGVvZiBhfHxudWxsPT09YSlyZXR1cm4gYy5zdHJpbmdpZnkoYSk7aWYoZChhKSl7Zm9yKHZhciBiPVtdLGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goc3RyaW5naWZ5KGFbZ10pKTtyZXR1cm5cXFwiW1xcXCIrYi5qb2luKFxcXCIsXFxcIikrXFxcIl1cXFwifWZvcih2YXIgaCxqPWUoYSkuc29ydChmJiZmKGEpKSxiPVtdLGc9MDtnPGoubGVuZ3RoO2crKyloPWpbZ10sYi5wdXNoKHN0cmluZ2lmeShoKStcXFwiOlxcXCIrc3RyaW5naWZ5KGFbaF0pKTtyZXR1cm5cXFwie1xcXCIrYi5qb2luKFxcXCIsXFxcIikrXFxcIn1cXFwifShhKX07dmFyIGQ9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuXFxcIltvYmplY3QgQXJyYXldXFxcIj09PXt9LnRvU3RyaW5nLmNhbGwoYSl9LGU9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGEpe3ZhciBiPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHl8fGZ1bmN0aW9uKCl7cmV0dXJuITB9LGM9W107Zm9yKHZhciBkIGluIGEpYi5jYWxsKGEsZCkmJmMucHVzaChkKTtyZXR1cm4gY319LHtqc29uaWZ5OjJ9XSwyOltmdW5jdGlvbihhLGIsYyl7Yy5wYXJzZT1hKFxcXCIuL2xpYi9wYXJzZVxcXCIpLGMuc3RyaW5naWZ5PWEoXFxcIi4vbGliL3N0cmluZ2lmeVxcXCIpfSx7XFxcIi4vbGliL3BhcnNlXFxcIjozLFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiOjR9XSwzOltmdW5jdGlvbihhLGIpe3ZhciBkLGUsZixnLGg9eydcXFwiJzpcXFwiXFxcXFxcXCJcXFwiLFxcXCJcXFxcXFxcXFxcXCI6XFxcIlxcXFxcXFxcXFxcIixcXFwiL1xcXCI6XFxcIi9cXFwiLGI6XFxcIlxcXFxiXFxcIixmOlxcXCJcXFxcZlxcXCIsbjpcXFwiXFxcXG5cXFwiLHI6XFxcIlxcXFxyXFxcIix0OlxcXCJcXFxcdFxcXCJ9LGo9ZnVuY3Rpb24oYSl7dGhyb3d7bmFtZTpcXFwiU3ludGF4RXJyb3JcXFwiLG1lc3NhZ2U6YSxhdDpkLHRleHQ6Zn19LGs9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEhPT1lJiZqKFxcXCJFeHBlY3RlZCAnXFxcIithK1xcXCInIGluc3RlYWQgb2YgJ1xcXCIrZStcXFwiJ1xcXCIpLGU9Zi5jaGFyQXQoZCksZCs9MSxlfSxsPWZ1bmN0aW9uKCl7dmFyIGEsYj1cXFwiXFxcIjtmb3IoXFxcIi1cXFwiPT09ZSYmKGI9XFxcIi1cXFwiLGsoXFxcIi1cXFwiKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO2lmKFxcXCIuXFxcIj09PWUpZm9yKGIrPVxcXCIuXFxcIjtrKCkmJlxcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lO2lmKFxcXCJlXFxcIj09PWV8fFxcXCJFXFxcIj09PWUpZm9yKGIrPWUsaygpLChcXFwiLVxcXCI9PT1lfHxcXFwiK1xcXCI9PT1lKSYmKGIrPWUsaygpKTtcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZSxrKCk7cmV0dXJuIGE9K2IsaXNGaW5pdGUoYSk/YTp2b2lkIGooXFxcIkJhZCBudW1iZXJcXFwiKX0sbT1mdW5jdGlvbigpe3ZhciBiLGMsZCxhPVN0cmluZy5mcm9tQ2hhckNvZGUsZj1cXFwiXFxcIjtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlmb3IoO2soKTspe2lmKFxcXCJcXFxcXFxcIlxcXCI9PT1lKXJldHVybiBrKCksZjtpZihcXFwiXFxcXFxcXFxcXFwiIT09ZSlmKz1lO2Vsc2UgaWYoaygpLFxcXCJ1XFxcIj09PWUpe2ZvcihkPTAsYz0wOzQ+YyYmKGI9cGFyc2VJbnQoaygpLDE2KSwhIWlzRmluaXRlKGIpKTtjKz0xKWQ9MTYqZCtiO2YrPWEoZCl9ZWxzZSBpZihcXFwic3RyaW5nXFxcIj09dHlwZW9mIGhbZV0pZis9aFtlXTtlbHNlIGJyZWFrfWooXFxcIkJhZCBzdHJpbmdcXFwiKX0sbj1mdW5jdGlvbigpe2Zvcig7ZSYmXFxcIiBcXFwiPj1lOylrKCl9LG89ZnVuY3Rpb24oKXtzd2l0Y2goZSl7Y2FzZVxcXCJ0XFxcIjpyZXR1cm4gayhcXFwidFxcXCIpLGsoXFxcInJcXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwiZVxcXCIpLCEwO2Nhc2VcXFwiZlxcXCI6cmV0dXJuIGsoXFxcImZcXFwiKSxrKFxcXCJhXFxcIiksayhcXFwibFxcXCIpLGsoXFxcInNcXFwiKSxrKFxcXCJlXFxcIiksITE7Y2FzZVxcXCJuXFxcIjpyZXR1cm4gayhcXFwiblxcXCIpLGsoXFxcInVcXFwiKSxrKFxcXCJsXFxcIiksayhcXFwibFxcXCIpLG51bGw7fWooXFxcIlVuZXhwZWN0ZWQgJ1xcXCIrZStcXFwiJ1xcXCIpfSxwPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYoXFxcIltcXFwiPT09ZSl7aWYoayhcXFwiW1xcXCIpLG4oKSxcXFwiXVxcXCI9PT1lKXJldHVybiBrKFxcXCJdXFxcIiksYTtmb3IoO2U7KXtpZihhLnB1c2goZygpKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIGFycmF5XFxcIil9LHE9ZnVuY3Rpb24oKXt2YXIgYSxiPXt9O2lmKFxcXCJ7XFxcIj09PWUpe2lmKGsoXFxcIntcXFwiKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7Zm9yKDtlOyl7aWYoYT1tKCksbigpLGsoXFxcIjpcXFwiKSxPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChiLGEpJiZqKFxcXCJEdXBsaWNhdGUga2V5IFxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCIpLGJbYV09ZygpLG4oKSxcXFwifVxcXCI9PT1lKXJldHVybiBrKFxcXCJ9XFxcIiksYjtrKFxcXCIsXFxcIiksbigpfX1qKFxcXCJCYWQgb2JqZWN0XFxcIil9O2c9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLFxcXCJ7XFxcIj09PWU/cSgpOlxcXCJbXFxcIj09PWU/cCgpOlxcXCJcXFxcXFxcIlxcXCI9PT1lP20oKTpcXFwiLVxcXCI9PT1lP2woKTpcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZT9sKCk6bygpfSxiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXt2YXIgYztyZXR1cm4gZj1hLGQ9MCxlPVxcXCIgXFxcIixjPWcoKSxuKCksZSYmaihcXFwiU3ludGF4IGVycm9yXFxcIiksXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGI/ZnVuY3Rpb24gd2FsayhhLGMpe3ZhciBkLGUsZj1hW2NdO2lmKGYmJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgZilmb3IoZCBpbiBmKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmLGQpJiYoZT13YWxrKGYsZCksdm9pZCAwPT09ZT9kZWxldGUgZltkXTpmW2RdPWUpO3JldHVybiBiLmNhbGwoYSxjLGYpfSh7XFxcIlxcXCI6Y30sXFxcIlxcXCIpOmN9fSx7fV0sNDpbZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBxdW90ZShhKXtyZXR1cm4gZi5sYXN0SW5kZXg9MCxmLnRlc3QoYSk/XFxcIlxcXFxcXFwiXFxcIithLnJlcGxhY2UoZixmdW5jdGlvbihiKXt2YXIgYT1nW2JdO3JldHVyblxcXCJzdHJpbmdcXFwiPT10eXBlb2YgYT9hOlxcXCJcXFxcXFxcXHVcXFwiKyhcXFwiMDAwMFxcXCIrYi5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpfSkrXFxcIlxcXFxcXFwiXFxcIjpcXFwiXFxcXFxcXCJcXFwiK2ErXFxcIlxcXFxcXFwiXFxcIn1mdW5jdGlvbiBzdHIoYSxiKXt2YXIgZixnLGgsaixsLG09YyxuPWJbYV07c3dpdGNoKG4mJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgbiYmXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIG4udG9KU09OJiYobj1uLnRvSlNPTihhKSksXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGUmJihuPWUuY2FsbChiLGEsbikpLHR5cGVvZiBuKXtjYXNlXFxcInN0cmluZ1xcXCI6cmV0dXJuIHF1b3RlKG4pO2Nhc2VcXFwibnVtYmVyXFxcIjpyZXR1cm4gaXNGaW5pdGUobik/bitcXFwiXFxcIjpcXFwibnVsbFxcXCI7Y2FzZVxcXCJib29sZWFuXFxcIjpjYXNlXFxcIm51bGxcXFwiOnJldHVybiBuK1xcXCJcXFwiO2Nhc2VcXFwib2JqZWN0XFxcIjppZighbilyZXR1cm5cXFwibnVsbFxcXCI7aWYoYys9ZCxsPVtdLFxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG4pKXtmb3Ioaj1uLmxlbmd0aCxmPTA7ZjxqO2YrPTEpbFtmXT1zdHIoZixuKXx8XFxcIm51bGxcXFwiO3JldHVybiBoPTA9PT1sLmxlbmd0aD9cXFwiW11cXFwiOmM/XFxcIltcXFxcblxcXCIrYytsLmpvaW4oXFxcIixcXFxcblxcXCIrYykrXFxcIlxcXFxuXFxcIittK1xcXCJdXFxcIjpcXFwiW1xcXCIrbC5qb2luKFxcXCIsXFxcIikrXFxcIl1cXFwiLGM9bSxofWlmKGUmJlxcXCJvYmplY3RcXFwiPT10eXBlb2YgZSlmb3Ioaj1lLmxlbmd0aCxmPTA7ZjxqO2YrPTEpZz1lW2ZdLFxcXCJzdHJpbmdcXFwiPT10eXBlb2YgZyYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7ZWxzZSBmb3IoZyBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLGcpJiYoaD1zdHIoZyxuKSxoJiZsLnB1c2gocXVvdGUoZykrKGM/XFxcIjogXFxcIjpcXFwiOlxcXCIpK2gpKTtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcInt9XFxcIjpjP1xcXCJ7XFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwifVxcXCI6XFxcIntcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIixjPW0saDt9fXZhciBjLGQsZSxmPS9bXFxcXFxcXFxcXFxcXFxcIlxcXFx4MDAtXFxcXHgxZlxcXFx4N2YtXFxcXHg5ZlxcXFx1MDBhZFxcXFx1MDYwMC1cXFxcdTA2MDRcXFxcdTA3MGZcXFxcdTE3YjRcXFxcdTE3YjVcXFxcdTIwMGMtXFxcXHUyMDBmXFxcXHUyMDI4LVxcXFx1MjAyZlxcXFx1MjA2MC1cXFxcdTIwNmZcXFxcdWZlZmZcXFxcdWZmZjAtXFxcXHVmZmZmXS9nLGc9e1xcXCJcXGJcXFwiOlxcXCJcXFxcXFxcXGJcXFwiLFxcXCJcXHRcXFwiOlxcXCJcXFxcXFxcXHRcXFwiLFxcXCJcXFxcblxcXCI6XFxcIlxcXFxcXFxcblxcXCIsXFxcIlxcZlxcXCI6XFxcIlxcXFxcXFxcZlxcXCIsXFxcIlxcXFxyXFxcIjpcXFwiXFxcXFxcXFxyXFxcIiwnXFxcIic6XFxcIlxcXFxcXFxcXFxcXFxcXCJcXFwiLFxcXCJcXFxcXFxcXFxcXCI6XFxcIlxcXFxcXFxcXFxcXFxcXFxcXFwifTtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiLGYpe3ZhciBnO2lmKGM9XFxcIlxcXCIsZD1cXFwiXFxcIixcXFwibnVtYmVyXFxcIj09dHlwZW9mIGYpZm9yKGc9MDtnPGY7Zys9MSlkKz1cXFwiIFxcXCI7ZWxzZVxcXCJzdHJpbmdcXFwiPT10eXBlb2YgZiYmKGQ9Zik7aWYoZT1iLGImJlxcXCJmdW5jdGlvblxcXCIhPXR5cGVvZiBiJiYoXFxcIm9iamVjdFxcXCIhPXR5cGVvZiBifHxcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGIubGVuZ3RoKSl0aHJvdyBuZXcgRXJyb3IoXFxcIkpTT04uc3RyaW5naWZ5XFxcIik7cmV0dXJuIHN0cihcXFwiXFxcIix7XFxcIlxcXCI6YX0pfX0se31dLDU6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpe3Rocm93IG5ldyBFcnJvcihcXFwic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFxcXCIpfWZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFxcXCIpfWZ1bmN0aW9uIHJ1blRpbWVvdXQoYSl7aWYoYz09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoYSwwKTtpZigoYz09PWRlZmF1bHRTZXRUaW1vdXR8fCFjKSYmc2V0VGltZW91dClyZXR1cm4gYz1zZXRUaW1lb3V0LHNldFRpbWVvdXQoYSwwKTt0cnl7cmV0dXJuIGMoYSwwKX1jYXRjaChiKXt0cnl7cmV0dXJuIGMuY2FsbChudWxsLGEsMCl9Y2F0Y2goYil7cmV0dXJuIGMuY2FsbCh0aGlzLGEsMCl9fX1mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQoYSl7aWYoZD09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGEpO2lmKChkPT09ZGVmYXVsdENsZWFyVGltZW91dHx8IWQpJiZjbGVhclRpbWVvdXQpcmV0dXJuIGQ9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChhKTt0cnl7cmV0dXJuIGQoYSl9Y2F0Y2goYil7dHJ5e3JldHVybiBkLmNhbGwobnVsbCxhKX1jYXRjaChiKXtyZXR1cm4gZC5jYWxsKHRoaXMsYSl9fX1mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKXtoJiZmJiYoaD0hMSxmLmxlbmd0aD9nPWYuY29uY2F0KGcpOmk9LTEsZy5sZW5ndGgmJmRyYWluUXVldWUoKSl9ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpe2lmKCFoKXt2YXIgYT1ydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7aD0hMDtmb3IodmFyIGI9Zy5sZW5ndGg7Yjspe2ZvcihmPWcsZz1bXTsrK2k8YjspZiYmZltpXS5ydW4oKTtpPS0xLGI9Zy5sZW5ndGh9Zj1udWxsLGg9ITEscnVuQ2xlYXJUaW1lb3V0KGEpfX1mdW5jdGlvbiBJdGVtKGEsYil7dGhpcy5mdW49YSx0aGlzLmFycmF5PWJ9ZnVuY3Rpb24gbm9vcCgpe312YXIgYyxkLGU9Yi5leHBvcnRzPXt9OyhmdW5jdGlvbigpe3RyeXtjPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6ZGVmYXVsdFNldFRpbW91dH1jYXRjaChhKXtjPWRlZmF1bHRTZXRUaW1vdXR9dHJ5e2Q9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6ZGVmYXVsdENsZWFyVGltZW91dH1jYXRjaChhKXtkPWRlZmF1bHRDbGVhclRpbWVvdXR9fSkoKTt2YXIgZixnPVtdLGg9ITEsaT0tMTtlLm5leHRUaWNrPWZ1bmN0aW9uKGEpe3ZhciBiPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoMTxhcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYltjLTFdPWFyZ3VtZW50c1tjXTtnLnB1c2gobmV3IEl0ZW0oYSxiKSksMSE9PWcubGVuZ3RofHxofHxydW5UaW1lb3V0KGRyYWluUXVldWUpfSxJdGVtLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxlLnRpdGxlPVxcXCJicm93c2VyXFxcIixlLmJyb3dzZXI9ITAsZS5lbnY9e30sZS5hcmd2PVtdLGUudmVyc2lvbj1cXFwiXFxcIixlLnZlcnNpb25zPXt9LGUub249bm9vcCxlLmFkZExpc3RlbmVyPW5vb3AsZS5vbmNlPW5vb3AsZS5vZmY9bm9vcCxlLnJlbW92ZUxpc3RlbmVyPW5vb3AsZS5yZW1vdmVBbGxMaXN0ZW5lcnM9bm9vcCxlLmVtaXQ9bm9vcCxlLnByZXBlbmRMaXN0ZW5lcj1ub29wLGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1ub29wLGUubGlzdGVuZXJzPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUuYmluZGluZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcXFwicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm5cXFwiL1xcXCJ9LGUuY2hkaXI9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFxcXCIpfSxlLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSx7fV0sNjpbZnVuY3Rpb24oYSxiKXsoZnVuY3Rpb24oYyl7dmFyIGQ9YShcXFwianNvbi1zdGFibGUtc3RyaW5naWZ5XFxcIik7Yy5icm93c2VyP3dpbmRvdy5zdHJpbmdpZnk9ZDpiLmV4cG9ydHM9ZH0pLmNhbGwodGhpcyxhKFxcXCJfcHJvY2Vzc1xcXCIpKX0se19wcm9jZXNzOjUsXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCI6MX1dfSx7fSxbNl0pO1wiLFwic3JjL2xpYi9qc29uL3Rlc3RzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZXN0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2tleXdvcmQucHlcIjpcIlxcbl9fYWxsX18gPSBbXFxcImlza2V5d29yZFxcXCIsIFxcXCJrd2xpc3RcXFwiXVxcblxcbmt3bGlzdCA9IFtcXG4jLS1zdGFydCBrZXl3b3Jkcy0tXFxuICAgICAgICAnYW5kJyxcXG4gICAgICAgICdhcycsXFxuICAgICAgICAnYXNzZXJ0JyxcXG4gICAgICAgICdicmVhaycsXFxuICAgICAgICAnY2xhc3MnLFxcbiAgICAgICAgJ2NvbnRpbnVlJyxcXG4gICAgICAgICdkZWYnLFxcbiAgICAgICAgJ2RlbCcsXFxuICAgICAgICAnZWxpZicsXFxuICAgICAgICAnZWxzZScsXFxuICAgICAgICAnZXhjZXB0JyxcXG4gICAgICAgICdleGVjJyxcXG4gICAgICAgICdmaW5hbGx5JyxcXG4gICAgICAgICdmb3InLFxcbiAgICAgICAgJ2Zyb20nLFxcbiAgICAgICAgJ2dsb2JhbCcsXFxuICAgICAgICAnaWYnLFxcbiAgICAgICAgJ2ltcG9ydCcsXFxuICAgICAgICAnaW4nLFxcbiAgICAgICAgJ2lzJyxcXG4gICAgICAgICdsYW1iZGEnLFxcbiAgICAgICAgJ25vdCcsXFxuICAgICAgICAnb3InLFxcbiAgICAgICAgJ3Bhc3MnLFxcbiAgICAgICAgJ3ByaW50JyxcXG4gICAgICAgICdyYWlzZScsXFxuICAgICAgICAncmV0dXJuJyxcXG4gICAgICAgICd0cnknLFxcbiAgICAgICAgJ3doaWxlJyxcXG4gICAgICAgICd3aXRoJyxcXG4gICAgICAgICd5aWVsZCcsXFxuIy0tZW5kIGtleXdvcmRzLS1cXG4gICAgICAgIF1cXG5cXG5pc2tleXdvcmQgPSBmcm96ZW5zZXQoa3dsaXN0KS5fX2NvbnRhaW5zX19cXG5cXG5cIixcInNyYy9saWIvbGliLWR5bmxvYWQvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImxpYi1keW5sb2FkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliLXRrL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsaWItdGsgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9saWIydG8zL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsaWIydG8zIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy9maXhlcy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZml4ZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9saWIydG8zL3BnZW4yL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwZ2VuMiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYjJ0bzMvdGVzdHMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRlc3RzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGluZWNhY2hlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsaW5lY2FjaGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9sb2NhbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImxvY2FsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xvZ2dpbmcvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImxvZ2dpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tYWNwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWNwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFjdXJsMnBhdGgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hY3VybDJwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFpbGJveC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFpbGJveCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21haWxjYXAucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1haWxjYXAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tYXJrdXBiYXNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXJrdXBiYXNlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWF0aC5qc1wiOlwiY29uc3QgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT1NYXRoLlBJLGI9TWF0aC5zcXJ0LGM9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsZD1NYXRoLkUsZT1NYXRoLmxvZyxmPU1hdGguZXhwLGc9TWF0aC5wb3csaD1NYXRoLmxvZzIsaT1OdW1iZXIuaXNGaW5pdGUsaj1NYXRoLmZsb29yLGs9TWF0aC5hYnM7Y29uc3QgbD17cGk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpLGU6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQpLHRhdTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMiphKSxuYW46bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTiksaW5mOm5ldyBTay5idWlsdGluLmZsb2F0XygxLzApfSxuPWZ1bmN0aW9uKGEpe3JldHVybiBhPWE/MD5hPy0xOjE6MD4xL2E/LTE6MSxhfSxvPTE4O3JldHVybiBTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXFxcIm1hdGhcXFwiLGwse2Fjb3M6eyRtZXRoOmZ1bmN0aW9uIGFjb3MoYSl7dmFyIGI9TWF0aC5hY29zO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGFyYyBjb3NpbmUgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguXFxcIn0sYWNvc2g6eyRtZXRoOmZ1bmN0aW9uIGFjb3NoKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYz1hK2IoYSphLTEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZShjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGludmVyc2UgaHlwZXJib2xpYyBjb3NpbmUgb2YgeC5cXFwifSxhc2luOnskbWV0aDpmdW5jdGlvbiBhc2luKGEpe3ZhciBiPU1hdGguYXNpbjtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhcmMgc2luZSAobWVhc3VyZWQgaW4gcmFkaWFucykgb2YgeC5cXFwifSxhc2luaDp7JG1ldGg6ZnVuY3Rpb24gYXNpbmgoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksYT1Tay5idWlsdGluLmFzbnVtJChhKTtjb25zdCBjPWErYihhKmErMSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhlKGMpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaW52ZXJzZSBoeXBlcmJvbGljIHNpbmUgb2YgeC5cXFwifSxhdGFuOnskbWV0aDpmdW5jdGlvbiBhdGFuKGEpe3ZhciBiPU1hdGguYXRhbjtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhcmMgdGFuZ2VudCAobWVhc3VyZWQgaW4gcmFkaWFucykgb2YgeC5cXFwifSxhdGFuMjp7JG1ldGg6ZnVuY3Rpb24gYXRhbjIoYSxiKXt2YXIgYz1NYXRoLmF0YW4yO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyhTay5idWlsdGluLmFzbnVtJChhKSxTay5idWlsdGluLmFzbnVtJChiKSkpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIHRhbmdlbnQgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHkveC5cXFxcblxcXFxuVW5saWtlIGF0YW4oeS94KSwgdGhlIHNpZ25zIG9mIGJvdGggeCBhbmQgeSBhcmUgY29uc2lkZXJlZC5cXFwifSxhdGFuaDp7JG1ldGg6ZnVuY3Rpb24gYXRhbmgoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksYT1Tay5idWlsdGluLmFzbnVtJChhKTtjb25zdCBiPSgxK2EpLygxLWEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZShiKS8yKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaW52ZXJzZSBoeXBlcmJvbGljIHRhbmdlbnQgb2YgeC5cXFwifSxjZWlsOnskbWV0aDpmdW5jdGlvbiBjZWlsKGEpe3ZhciBiPU1hdGguY2VpbDtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJcXFwiLFxcXCJyZWFsIG51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYz1Tay5idWlsdGluLmFzbnVtJChhKTtyZXR1cm4gU2suX19mdXR1cmVfXy5jZWlsX2Zsb29yX2ludD9uZXcgU2suYnVpbHRpbi5pbnRfKGIoYykpOm5ldyBTay5idWlsdGluLmZsb2F0XyhiKGMpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgY2VpbGluZyBvZiB4IGFzIGFuIEludGVncmFsLlxcXFxuXFxcXG5UaGlzIGlzIHRoZSBzbWFsbGVzdCBpbnRlZ2VyID49IHguXFxcIn0sY29weXNpZ246eyRtZXRoOmZ1bmN0aW9uIGNvcHlzaWduKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7Y29uc3QgYz1Tay5idWlsdGluLmFzbnVtJChiKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGU9bihkKSxmPW4oYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhkKihlKmYpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gYSBmbG9hdCB3aXRoIHRoZSBtYWduaXR1ZGUgKGFic29sdXRlIHZhbHVlKSBvZiB4IGJ1dCB0aGUgc2lnbiBvZiB5LlxcXFxuXFxcXG5PbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHNpZ25lZCB6ZXJvcywgY29weXNpZ24oMS4wLCAtMC4wKVxcXFxucmV0dXJucyAtMS4wLlxcXFxuXFxcIn0sY29zOnskbWV0aDpmdW5jdGlvbiBjb3MoYSl7dmFyIGI9TWF0aC5jb3M7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgY29zaW5lIG9mIHggKG1lYXN1cmVkIGluIHJhZGlhbnMpLlxcXCJ9LGNvc2g6eyRtZXRoOmZ1bmN0aW9uIGNvc2goYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksYT1Tay5idWlsdGluLmFzbnVtJChhKTtjb25zdCBiPWcoZCxhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKChiKzEvYikvMil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGh5cGVyYm9saWMgY29zaW5lIG9mIHguXFxcIn0sZGVncmVlczp7JG1ldGg6ZnVuY3Rpb24gZGVncmVlcyhiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2NvbnN0IGM9MTgwL2EqU2suYnVpbHRpbi5hc251bSQoYik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkNvbnZlcnQgYW5nbGUgeCBmcm9tIHJhZGlhbnMgdG8gZGVncmVlcy5cXFwifSxlcmY6eyRtZXRoOmZ1bmN0aW9uIGVyZigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hdGguZXJmKCkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkVycm9yIGZ1bmN0aW9uIGF0IHguXFxcIn0sZXJmYzp7JG1ldGg6ZnVuY3Rpb24gZXJmYygpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hdGguZXJmYygpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJDb21wbGVtZW50YXJ5IGVycm9yIGZ1bmN0aW9uIGF0IHguXFxcIn0sZXhwOnskbWV0aDpmdW5jdGlvbiBleHAoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9YS52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgYiYmKGI9YS5uYiRmbG9hdCgpLnYpLGI9PTEvMHx8Yj09LUluZmluaXR5fHxpc05hTihiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGYoYikpO2NvbnN0IGM9ZihiKTtpZighaXNGaW5pdGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcXFwibWF0aCByYW5nZSBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gZSByYWlzZWQgdG8gdGhlIHBvd2VyIG9mIHguXFxcIn0sZXhwbTE6eyRtZXRoOmZ1bmN0aW9uIGV4cG0xKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoLjc+ayhiKSl7Y29uc3QgYT1mKGIpO2lmKDE9PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKTtlbHNle2NvbnN0IGM9KGEtMSkqYi9lKGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9fWVsc2V7Y29uc3QgYT1mKGIpLTE7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX19LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gZXhwKHgpLTEuXFxcXG5cXFxcblRoaXMgZnVuY3Rpb24gYXZvaWRzIHRoZSBsb3NzIG9mIHByZWNpc2lvbiBpbnZvbHZlZCBpbiB0aGUgZGlyZWN0IGV2YWx1YXRpb24gb2YgZXhwKHgpLTEgZm9yIHNtYWxsIHguXFxcIn0sZmFiczp7JG1ldGg6ZnVuY3Rpb24gZmFicyhhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYj1hLnY7cmV0dXJuIEpTQkkuX19pc0JpZ0ludChiKSYmKGI9YS5uYiRmbG9hdCgpLnYpLGI9ayhiKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBmbG9hdCB4LlxcXCJ9LGZhY3RvcmlhbDp7JG1ldGg6ZnVuY3Rpb24gZmFjdG9yaWFsKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKGE9aihiKSxhIT1iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImZhY3RvcmlhbCgpIG9ubHkgYWNjZXB0cyBpbnRlZ3JhbCB2YWx1ZXNcXFwiKTtpZigwPmEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiZmFjdG9yaWFsKCkgbm90IGRlZmluZWQgZm9yIG5lZ2F0aXZlIG51bWJlcnNcXFwiKTtsZXQgYz0xO2ZvcihsZXQgYj0yO2I8PWEmJmI8PW87YisrKWMqPWI7aWYoYTw9bylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKTtjPUpTQkkuQmlnSW50KGMpO2ZvcihsZXQgYj0xOTtiPD1hO2IrKyljPUpTQkkubXVsdGlwbHkoYyxKU0JJLkJpZ0ludChiKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJGaW5kIHghLlxcXFxuXFxcXG5SYWlzZSBhIFZhbHVlRXJyb3IgaWYgeCBpcyBuZWdhdGl2ZSBvciBub24taW50ZWdyYWwuXFxcIn0sZmxvb3I6eyRtZXRoOmZ1bmN0aW9uIGZsb29yKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5fX2Z1dHVyZV9fLmNlaWxfZmxvb3JfaW50P25ldyBTay5idWlsdGluLmludF8oaihTay5idWlsdGluLmFzbnVtJChhKSkpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGZsb29yIG9mIHggYXMgYW4gSW50ZWdyYWwuXFxcXG5cXFxcblRoaXMgaXMgdGhlIGxhcmdlc3QgaW50ZWdlciA8PSB4LlxcXCJ9LGZtb2Q6eyRtZXRoOmZ1bmN0aW9uIGZtb2QoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtsZXQgYz1hLnYsZD1iLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBjJiYoYz1hLm5iJGZsb2F0KCkudiksXFxcIm51bWJlclxcXCIhPXR5cGVvZiBkJiYoZD1iLm5iJGZsb2F0KCkudiksKGQ9PTEvMHx8ZD09LUluZmluaXR5KSYmaXNGaW5pdGUoYykpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKTtjb25zdCBlPWMlZDtpZihpc05hTihlKSYmIWlzTmFOKGMpJiYhaXNOYU4oZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgeSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBmbW9kKHgsIHkpLCBhY2NvcmRpbmcgdG8gcGxhdGZvcm0gQy5cXFxcblxcXFxueCAlIHkgbWF5IGRpZmZlci5cXFwifSxmcmV4cDp7JG1ldGg6ZnVuY3Rpb24gZnJleHAoYSl7dmFyIGI9TWF0aC5tYXg7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYz1Tay5idWlsdGluLmFzbnVtJChhKSxkPVtjLDBdO2lmKDAhPT1jJiZpKGMpKXtjb25zdCBhPWsoYyk7bGV0IGU9YigtMTAyMyxqKGgoYSkpKzEpLGY9YSpnKDIsLWUpO2Zvcig7LjU+ZjspZio9MixlLS07Zm9yKDsxPD1mOylmKj0uNSxlKys7MD5jJiYoZj0tZiksZFswXT1mLGRbMV09ZX1yZXR1cm4gZFswXT1uZXcgU2suYnVpbHRpbi5mbG9hdF8oZFswXSksZFsxXT1uZXcgU2suYnVpbHRpbi5pbnRfKGRbMV0pLG5ldyBTay5idWlsdGluLnR1cGxlKGQpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBtYW50aXNzYSBhbmQgZXhwb25lbnQgb2YgeCwgYXMgcGFpciAobSwgZSkuXFxcXG5cXFxcbm0gaXMgYSBmbG9hdCBhbmQgZSBpcyBhbiBpbnQsIHN1Y2ggdGhhdCB4ID0gbSAqIDIuKiplLlxcXFxuSWYgeCBpcyAwLCBtIGFuZCBlIGFyZSBib3RoIDAuICBFbHNlIDAuNSA8PSBhYnMobSkgPCAxLjAuXFxcIn0sZnN1bTp7JG1ldGg6ZnVuY3Rpb24gZnN1bShhKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiJ1xcXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXFxcIicgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZVxcXCIpO2xldCBiPVtdO2E9U2suYWJzdHIuaXRlcihhKTtsZXQgYyxkLGU7Zm9yKGxldCBmPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1mO2Y9YS50cCRpdGVybmV4dCgpKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJcXFwiLFxcXCJyZWFsIG51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihmKSksYz0wO2xldCBhPWYudjtcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGEmJihhPWYubmIkZmxvYXQoKS52KSxmPWE7Zm9yKGxldCBhLGc9MCxoPWIubGVuZ3RoO2c8aDtnKyspe2lmKGE9YltnXSxrKGYpPGsoYSkpe2xldCBiPWY7Zj1hLGE9Yn1kPWYrYSxlPWEtKGQtZiksZSYmKGJbY109ZSxjKyspLGY9ZH1iPWIuc2xpY2UoMCxjKS5jb25jYXQoW2ZdKX1jb25zdCBmPWIucmVkdWNlKGZ1bmN0aW9uKGMsYSl7cmV0dXJuIGMrYX0sMCk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhmKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgc2VxLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGFuIGFjY3VyYXRlIGZsb2F0aW5nIHBvaW50IHN1bSBvZiB2YWx1ZXMgaW4gdGhlIGl0ZXJhYmxlIHNlcS5cXFxcblxcXFxuQXNzdW1lcyBJRUVFLTc1NCBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljLlxcXCJ9LGdhbW1hOnskbWV0aDpmdW5jdGlvbiBnYW1tYSgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hdGguZ2FtbWEoKSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiR2FtbWEgZnVuY3Rpb24gYXQgeC5cXFwifSxnY2Q6eyRtZXRoOmZ1bmN0aW9uIGdjZChjLGEpe2Z1bmN0aW9uIF9nY2QoYyxhKXtyZXR1cm4gMD09YT9jOl9nY2QoYSxjJWEpfWZ1bmN0aW9uIF9iaWdnY2QoYyxhKXtyZXR1cm4gSlNCSS5lcXVhbChhLEpTQkkuX19aRVJPKT9jOl9iaWdnY2QoYSxKU0JJLnJlbWFpbmRlcihjLGEpKX1Tay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJhXFxcIixcXFwiaW50ZWdlclxcXCIsU2suYnVpbHRpbi5jaGVja0ludChjKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYlxcXCIsXFxcImludGVnZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpO2xldCBiLGQ9U2suYnVpbHRpbi5hc251bSQoYyksZT1Tay5idWlsdGluLmFzbnVtJChhKTtyZXR1cm5cXFwibnVtYmVyXFxcIj09dHlwZW9mIGQmJlxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT8oZD1rKGQpLGU9ayhlKSxiPV9nY2QoZCxlKSxiPTA+Yj8tYjpiLG5ldyBTay5idWlsdGluLmludF8oYikpOihkPUpTQkkuQmlnSW50KGQpLGU9SlNCSS5CaWdJbnQoZSksYj1fYmlnZ2NkKGQsZSksSlNCSS5sZXNzVGhhbihiLEpTQkkuX19aRVJPKSYmKGI9SlNCSS5tdWx0aXBseShiLEpTQkkuQmlnSW50KC0xKSkpLG5ldyBTay5idWlsdGluLmludF8oYi50b1N0cmluZygpKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3Igb2YgeCBhbmQgeVxcXCJ9LGh5cG90OnskbWV0aDpmdW5jdGlvbiBoeXBvdChhLGMpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGMpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGM9U2suYnVpbHRpbi5hc251bSQoYyksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoYSphK2MqYykpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgeSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlLCBzcXJ0KHgqeCArIHkqeSkuXFxcIn0saXNjbG9zZTp7JG1ldGg6ZnVuY3Rpb24gaXNjbG9zZShjLGQpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXNjbG9zZVxcXCIsYywyLDIpLHJlbF9hYnNfdmFscz1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiaXNjbG9zZVxcXCIsW1xcXCJyZWxfdG9sXFxcIixcXFwiYWJzX3RvbFxcXCJdLFtdLGQsW25ldyBTay5idWlsdGluLmZsb2F0XygxZS05KSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oMCldKTtjb25zdCBlPWNbMF0sYT1jWzFdLGI9cmVsX2Fic192YWxzWzBdLGY9cmVsX2Fic192YWxzWzFdO1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImFcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImJcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJlbF90b2xcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImFic190b2xcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZikpO2NvbnN0IGc9U2suYnVpbHRpbi5hc251bSQoZSksaD1Tay5idWlsdGluLmFzbnVtJChhKSxpPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGo9U2suYnVpbHRpbi5hc251bSQoZik7aWYoMD5pfHwwPmopdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwidG9sZXJhbmNlcyBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2lmKGc9PWgpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtpZihnPT0xLzB8fGc9PS1JbmZpbml0eXx8aD09MS8wfHxoPT0tSW5maW5pdHkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Y29uc3QgbD1rKGgtZyksbT1sPD1rKGkqaCl8fGw8PWsoaSpnKXx8bDw9ajtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChtKX0sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCAvLCBhLCBiLCAqLCByZWxfdG9sPTFlLTA5LCBhYnNfdG9sPTAuMClcXFwiLCRkb2M6XFxcIkRldGVybWluZSB3aGV0aGVyIHR3byBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSBjbG9zZSBpbiB2YWx1ZS5cXFxcblxcXFxuICByZWxfdG9sXFxcXG4gICAgbWF4aW11bSBkaWZmZXJlbmNlIGZvciBiZWluZyBjb25zaWRlcmVkIFxcXFxcXFwiY2xvc2VcXFxcXFxcIiwgcmVsYXRpdmUgdG8gdGhlXFxcXG4gICAgbWFnbml0dWRlIG9mIHRoZSBpbnB1dCB2YWx1ZXNcXFxcbiAgYWJzX3RvbFxcXFxuICAgIG1heGltdW0gZGlmZmVyZW5jZSBmb3IgYmVpbmcgY29uc2lkZXJlZCBcXFxcXFxcImNsb3NlXFxcXFxcXCIsIHJlZ2FyZGxlc3Mgb2YgdGhlXFxcXG4gICAgbWFnbml0dWRlIG9mIHRoZSBpbnB1dCB2YWx1ZXNcXFxcblxcXFxuUmV0dXJuIFRydWUgaWYgYSBpcyBjbG9zZSBpbiB2YWx1ZSB0byBiLCBhbmQgRmFsc2Ugb3RoZXJ3aXNlLlxcXFxuXFxcXG5Gb3IgdGhlIHZhbHVlcyB0byBiZSBjb25zaWRlcmVkIGNsb3NlLCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW1cXFxcbm11c3QgYmUgc21hbGxlciB0aGFuIGF0IGxlYXN0IG9uZSBvZiB0aGUgdG9sZXJhbmNlcy5cXFxcblxcXFxuLWluZiwgaW5mIGFuZCBOYU4gYmVoYXZlIHNpbWlsYXJseSB0byB0aGUgSUVFRSA3NTQgU3RhbmRhcmQuICBUaGF0XFxcXG5pcywgTmFOIGlzIG5vdCBjbG9zZSB0byBhbnl0aGluZywgZXZlbiBpdHNlbGYuICBpbmYgYW5kIC1pbmYgYXJlXFxcXG5vbmx5IGNsb3NlIHRvIHRoZW1zZWx2ZXMuXFxcIn0saXNmaW5pdGU6eyRtZXRoOmZ1bmN0aW9uIGlzZmluaXRlKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSk/U2suYnVpbHRpbi5ib29sLnRydWUkOmlzRmluaXRlKGIpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIFRydWUgaWYgeCBpcyBuZWl0aGVyIGFuIGluZmluaXR5IG5vciBhIE5hTiwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFwifSxpc2luZjp7JG1ldGg6ZnVuY3Rpb24gaXNpbmYoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYj1Tay5idWlsdGluLmFzbnVtJChhKTtyZXR1cm4gU2suYnVpbHRpbi5jaGVja0ludChhKT9Tay5idWlsdGluLmJvb2wuZmFsc2UkOmlzRmluaXRlKGIpfHxpc05hTihiKT9Tay5idWlsdGluLmJvb2wuZmFsc2UkOlNrLmJ1aWx0aW4uYm9vbC50cnVlJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBUcnVlIGlmIHggaXMgYSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbmZpbml0eSwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFwifSxpc25hbjp7JG1ldGg6ZnVuY3Rpb24gaXNuYW4oYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYj1Tay5idWlsdGluLmFzbnVtJChhKTtyZXR1cm4gaXNOYU4oYik/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiB4IGlzIGEgTmFOIChub3QgYSBudW1iZXIpLCBhbmQgRmFsc2Ugb3RoZXJ3aXNlLlxcXCJ9LGxkZXhwOnskbWV0aDpmdW5jdGlvbiBsZGV4cChhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImlcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGIpKTtsZXQgYz1hLnY7XFxcIm51bWJlclxcXCIhPXR5cGVvZiBjJiYoYz1hLm5iJGZsb2F0KCkudik7Y29uc3QgZD1Tay5idWlsdGluLmFzbnVtJChiKTtpZihjPT0xLzB8fGM9PS1JbmZpbml0eXx8MD09Y3x8aXNOYU4oYykpcmV0dXJuIGE7Y29uc3QgZT1jKmcoMixkKTtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcXFwibWF0aCByYW5nZSBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCBpLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHggKiAoMioqaSkuXFxcXG5cXFxcblRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIGludmVyc2Ugb2YgZnJleHAoKS5cXFwifSxsZ2FtbWE6eyRtZXRoOmZ1bmN0aW9uIGxnYW1tYSgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hdGgubGdhbW1hKCkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIk5hdHVyYWwgbG9nYXJpdGhtIG9mIGFic29sdXRlIHZhbHVlIG9mIEdhbW1hIGZ1bmN0aW9uIGF0IHguXFxcIn0sbG9nOnskbWV0aDpmdW5jdGlvbiBsb2coYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgZixnLGg9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoMD49aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2lmKHZvaWQgMD09PWI/Zj1kOihTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJiYXNlXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxmPVNrLmJ1aWx0aW4uYXNudW0kKGIpKSwwPj1mKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrRmxvYXQoYSl8fGg8YylnPWUoaCkvZShmKTtlbHNle2g9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpLiRqc3N0cigpO2NvbnN0IGI9aC5sZW5ndGgsYz1wYXJzZUZsb2F0KFxcXCIwLlxcXCIraCk7Zz0oYiplKDEwKStlKGMpKS9lKGYpfXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZyl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJsb2coeCwgW2Jhc2U9ZV0pXFxcXG5SZXR1cm4gdGhlIGxvZ2FyaXRobSBvZiB4IHRvIHRoZSBnaXZlbiBiYXNlLlxcXFxuXFxcXG5JZiB0aGUgYmFzZSBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSAoYmFzZSBlKSBvZiB4LlxcXCJ9LGxvZzEwOnskbWV0aDpmdW5jdGlvbiBsb2cxMChhKXt2YXIgYj1NYXRoLmxvZzEwO1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBkLGU9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoMD5lKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrRmxvYXQoYSl8fGU8YylkPWIoZSk7ZWxzZXtlPW5ldyBTay5idWlsdGluLnN0cihhKS4kanNzdHIoKTtjb25zdCBjPWUubGVuZ3RoLGY9cGFyc2VGbG9hdChcXFwiMC5cXFwiK2UpO2Q9YytiKGYpfXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGJhc2UgMTAgbG9nYXJpdGhtIG9mIHguXFxcIn0sbG9nMXA6eyRtZXRoOmZ1bmN0aW9uIGxvZzFwKGEpe3ZhciBiPU51bWJlci5FUFNJTE9OO1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBjPWEudjtpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGMmJihjPWEubmIkZmxvYXQoKS52KSwtMT49Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2V7aWYoMD09YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpO2lmKGsoYyk8Yi8yKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyk7aWYoLS41PD1jJiYxPj1jKXtjb25zdCBhPTErYyxiPWUoYSktKGEtMS1jKS9hO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYil9ZWxzZXtjb25zdCBhPWUoMStjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfX19LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIDEreCAoYmFzZSBlKS5cXFxcblxcXFxuVGhlIHJlc3VsdCBpcyBjb21wdXRlZCBpbiBhIHdheSB3aGljaCBpcyBhY2N1cmF0ZSBmb3IgeCBuZWFyIHplcm8uXFxcIn0sbG9nMjp7JG1ldGg6ZnVuY3Rpb24gbG9nMihhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYixkPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxkPGMpYj1oKGQpO2Vsc2V7ZD1uZXcgU2suYnVpbHRpbi5zdHIoYSkuJGpzc3RyKCk7Y29uc3QgYz1kLmxlbmd0aCxlPXBhcnNlRmxvYXQoXFxcIjAuXFxcIitkKTtiPWMqaCgxMCkraChlKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBiYXNlIDIgbG9nYXJpdGhtIG9mIHguXFxcIn0sbW9kZjp7JG1ldGg6ZnVuY3Rpb24gbW9kZihhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYj1Tay5idWlsdGluLmFzbnVtJChhKTtpZighaXNGaW5pdGUoYikpe2lmKGI9PTEvMClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XygwKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYildKTtpZihiPT0tSW5maW5pdHkpcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oLTApLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKV0pO2lmKGlzTmFOKGIpKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKV0pfWNvbnN0IGM9bihiKTtiPWsoYik7Y29uc3QgZT1jKmooYiksZj1jKihiLWooYikpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGYpLG5ldyBTay5idWlsdGluLmZsb2F0XyhlKV0pfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBmcmFjdGlvbmFsIGFuZCBpbnRlZ2VyIHBhcnRzIG9mIHguXFxcXG5cXFxcbkJvdGggcmVzdWx0cyBjYXJyeSB0aGUgc2lnbiBvZiB4IGFuZCBhcmUgZmxvYXRzLlxcXCJ9LHBvdzp7JG1ldGg6ZnVuY3Rpb24gcG93KGEsYil7dmFyIGM9TnVtYmVyLmlzSW50ZWdlcjtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtsZXQgZD1hLnYsZT1iLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBkJiYoZD1hLm5iJGZsb2F0KCkudiksXFxcIm51bWJlclxcXCIhPXR5cGVvZiBlJiYoZT1iLm5iJGZsb2F0KCkudiksMD09ZCYmMD5lKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7ZWxzZXtpZigxPT1kKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oMSk7aWYoaShkKSYmaShlKSYmMD5kJiYhYyhlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoLTE9PWQmJihlPT0tSW5maW5pdHl8fGU9PTEvMCkpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygxKX1jb25zdCBmPWcoZCxlKTtpZighaShkKXx8IWkoZSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhmKTtpZihmPT0xLzB8fGY9PS1JbmZpbml0eSl0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKFxcXCJtYXRoIHJhbmdlIGVycm9yXFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhmKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4geCoqeSAoeCB0byB0aGUgcG93ZXIgb2YgeSkuXFxcIn0scmFkaWFuczp7JG1ldGg6ZnVuY3Rpb24gcmFkaWFucyhiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJkZWdcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2NvbnN0IGM9YS8xODAqU2suYnVpbHRpbi5hc251bSQoYik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkNvbnZlcnQgYW5nbGUgeCBmcm9tIGRlZ3JlZXMgdG8gcmFkaWFucy5cXFwifSxyZW1haW5kZXI6eyRtZXRoOmZ1bmN0aW9uIHJlbWFpbmRlcihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInlcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2xldCBkPWEudixlPWIudjtpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGQmJihkPWEubmIkZmxvYXQoKS52KSxcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGUmJihlPWIubmIkZmxvYXQoKS52KSxpc0Zpbml0ZShkKSYmaXNGaW5pdGUoZSkpe2xldCBhLGIsZixjLGc7aWYoMD09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2lmKGE9ayhkKSxiPWsoZSksYz1hJWIsZj1iLWMsYzxmKWc9YztlbHNlIGlmKGM+ZilnPS1mO2Vsc2V7aWYoYyE9Zil0aHJvdyBuZXcgU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcjtnPWMtMiooLjUqKGEtYyklYil9cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhuKGQpKmcpfWlmKGlzTmFOKGQpKXJldHVybiBhO2lmKGlzTmFOKGUpKXJldHVybiBiO2lmKGQ9PTEvMHx8ZD09LUluZmluaXR5KXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7aWYoZSE9MS8wJiZlIT0tSW5maW5pdHkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3I7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhkKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJEaWZmZXJlbmNlIGJldHdlZW4geCBhbmQgdGhlIGNsb3Nlc3QgaW50ZWdlciBtdWx0aXBsZSBvZiB5LlxcXFxuXFxcXG5SZXR1cm4geCAtIG4qeSB3aGVyZSBuKnkgaXMgdGhlIGNsb3Nlc3QgaW50ZWdlciBtdWx0aXBsZSBvZiB5LlxcXFxuSW4gdGhlIGNhc2Ugd2hlcmUgeCBpcyBleGFjdGx5IGhhbGZ3YXkgYmV0d2VlbiB0d28gbXVsdGlwbGVzIG9mXFxcXG55LCB0aGUgbmVhcmVzdCBldmVuIHZhbHVlIG9mIG4gaXMgdXNlZC4gVGhlIHJlc3VsdCBpcyBhbHdheXMgZXhhY3QuXFxcIn0sc2luOnskbWV0aDpmdW5jdGlvbiBzaW4oYSl7dmFyIGI9TWF0aC5zaW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgc2luZSBvZiB4IChtZWFzdXJlZCBpbiByYWRpYW5zKS5cXFwifSxzaW5oOnskbWV0aDpmdW5jdGlvbiBzaW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYj1nKGQsYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygoYi0xL2IpLzIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBoeXBlcmJvbGljIHNpbmUgb2YgeC5cXFwifSxzcXJ0OnskbWV0aDpmdW5jdGlvbiBzcXJ0KGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoMD5jKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKGMpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgc3F1YXJlIHJvb3Qgb2YgeC5cXFwifSx0YW46eyRtZXRoOmZ1bmN0aW9uIHRhbihhKXt2YXIgYj1NYXRoLnRhbjtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSB0YW5nZW50IG9mIHggKG1lYXN1cmVkIGluIHJhZGlhbnMpLlxcXCJ9LHRhbmg6eyRtZXRoOmZ1bmN0aW9uIHRhbmgoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYj1Tay5idWlsdGluLmFzbnVtJChhKTtpZigwPT09YilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpO2NvbnN0IGM9ZyhkLGIpLGU9MS9jO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oKGMtZSkvMi8oKGMrZSkvMikpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBoeXBlcmJvbGljIHRhbmdlbnQgb2YgeC5cXFwifSx0cnVuYzp7JG1ldGg6ZnVuY3Rpb24gdHJ1bmMoYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSk/YTpuZXcgU2suYnVpbHRpbi5pbnRfKDB8U2suYnVpbHRpbi5hc251bSQoYSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiVHJ1bmNhdGVzIHRoZSBSZWFsIHggdG8gdGhlIG5lYXJlc3QgSW50ZWdyYWwgdG93YXJkIDAuXFxcXG5cXFxcblVzZXMgdGhlIF9fdHJ1bmNfXyBtYWdpYyBtZXRob2QuXFxcIn19KSxsfTtcIixcInNyYy9saWIvbWQ1LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtZDUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9taGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWhsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9taW1ldG9vbHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1pbWV0b29scyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21pbWV0eXBlcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWltZXR5cGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWltaWZ5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1pZnkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tb2R1bGVmaW5kZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1vZHVsZWZpbmRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211bHRpZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibXVsdGlmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbXVsdGlwcm9jZXNzaW5nL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtdWx0aXByb2Nlc3NpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImR1bW15IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbXV0ZXgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm11dGV4IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbmV0cmMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm5ldHJjIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbmV3LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJuZXcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9ubnRwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJubnRwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbnRwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJudHBhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9udHVybDJwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJudHVybDJwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbnVtYmVycy5weVwiOlwiTnVtYmVyID0gKGludCwgZmxvYXQsIGNvbXBsZXgpXFxuSW50ZWdyYWwgPSBpbnRcXG5Db21wbGV4ID0gY29tcGxleFxcblwiLFwic3JjL2xpYi9vcGNvZGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm9wY29kZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL29wZXJhdG9yLmpzXCI6XCJmdW5jdGlvbiAkYnVpbHRpbm1vZHVsZSgpe3JldHVybiBvcGVyYXRvcj17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJvcGVyYXRvclxcXCIpLF9fZG9jX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJPcGVyYXRvciBpbnRlcmZhY2UuXFxcXG5cXFxcblRoaXMgbW9kdWxlIGV4cG9ydHMgYSBzZXQgb2YgZnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGphdmFzY3JpcHQgY29ycmVzcG9uZGluZ1xcXFxudG8gdGhlIGludHJpbnNpYyBvcGVyYXRvcnMgb2YgUHl0aG9uLiAgRm9yIGV4YW1wbGUsIG9wZXJhdG9yLmFkZCh4LCB5KVxcXFxuaXMgZXF1aXZhbGVudCB0byB0aGUgZXhwcmVzc2lvbiB4K3kuICBUaGUgZnVuY3Rpb24gbmFtZXMgYXJlIHRob3NlXFxcXG51c2VkIGZvciBzcGVjaWFsIG1ldGhvZHM7IHZhcmlhbnRzIHdpdGhvdXQgbGVhZGluZyBhbmQgdHJhaWxpbmdcXFxcbidfXycgYXJlIGFsc28gcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlLlxcXCIpLF9fYWxsX186bmV3IFNrLmJ1aWx0aW4ubGlzdChbXFxcImFic1xcXCIsXFxcImFkZFxcXCIsXFxcImFuZF9cXFwiLFxcXCJhdHRyZ2V0dGVyXFxcIixcXFwiY29uY2F0XFxcIixcXFwiY29udGFpbnNcXFwiLFxcXCJjb3VudE9mXFxcIixcXFwiZGVsaXRlbVxcXCIsXFxcImVxXFxcIixcXFwiZmxvb3JkaXZcXFwiLFxcXCJnZVxcXCIsXFxcImdldGl0ZW1cXFwiLFxcXCJndFxcXCIsXFxcImlhZGRcXFwiLFxcXCJpYW5kXFxcIixcXFwiaWNvbmNhdFxcXCIsXFxcImlmbG9vcmRpdlxcXCIsXFxcImlsc2hpZnRcXFwiLFxcXCJpbWF0bXVsXFxcIixcXFwiaW1vZFxcXCIsXFxcImltdWxcXFwiLFxcXCJpbmRleFxcXCIsXFxcImluZGV4T2ZcXFwiLFxcXCJpbnZcXFwiLFxcXCJpbnZlcnRcXFwiLFxcXCJpb3JcXFwiLFxcXCJpcG93XFxcIixcXFwiaXJzaGlmdFxcXCIsXFxcImlzX1xcXCIsXFxcImlzX25vdFxcXCIsXFxcImlzdWJcXFwiLFxcXCJpdGVtZ2V0dGVyXFxcIixcXFwiaXRydWVkaXZcXFwiLFxcXCJpeG9yXFxcIixcXFwibGVcXFwiLFxcXCJsZW5ndGhfaGludFxcXCIsXFxcImxzaGlmdFxcXCIsXFxcImx0XFxcIixcXFwibWF0bXVsXFxcIixcXFwibWV0aG9kY2FsbGVyXFxcIixcXFwibW9kXFxcIixcXFwibXVsXFxcIixcXFwibmVcXFwiLFxcXCJuZWdcXFwiLFxcXCJub3RfXFxcIixcXFwib3JfXFxcIixcXFwicG9zXFxcIixcXFwicG93XFxcIixcXFwicnNoaWZ0XFxcIixcXFwic2V0aXRlbVxcXCIsXFxcInN1YlxcXCIsXFxcInRydWVkaXZcXFwiLFxcXCJ0cnV0aFxcXCIsXFxcInhvclxcXCJdLm1hcChhPT5uZXcgU2suYnVpbHRpbi5zdHIoYSkpKX0sb3BlcmF0b3IuaXRlbWdldHRlcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJvcGVyYXRvci5pdGVtZ2V0dGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gaXRlbWdldHRlcihhKXt0aGlzLml0ZW1zPWEsdGhpcy5vbmVpdGVtPTE9PT1hLmxlbmd0aCx0aGlzLml0ZW09YVswXSx0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXcoYSxiKXtyZXR1cm4gU2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiaXRlbWdldHRlclxcXCIsYiksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJpdGVtZ2V0dGVyXFxcIixhLDEpLG5ldyBvcGVyYXRvci5pdGVtZ2V0dGVyKGEpfSx0cCRjYWxsKGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiaXRlbWdldHRlclxcXCIsYiksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJpdGVtZ2V0dGVyXFxcIixhLDEsMSk7Y29uc3QgYz1hWzBdO3JldHVybiB0aGlzLm9uZWl0ZW0/U2suYWJzdHIub2JqZWN0R2V0SXRlbShjLHRoaXMuaXRlbSwhMCk6bmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy5pdGVtcy5tYXAoYT0+U2suYWJzdHIub2JqZWN0R2V0SXRlbShjLGEpKSl9LHRwJGRvYzpcXFwiUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgZmV0Y2hlcyB0aGUgZ2l2ZW4gaXRlbShzKSBmcm9tIGl0cyBvcGVyYW5kLlxcXFxuICAgICAgICAgICAgQWZ0ZXIgZiA9IGl0ZW1nZXR0ZXIoMiksIHRoZSBjYWxsIGYocikgcmV0dXJucyByWzJdLlxcXFxuICAgICAgICAgICAgQWZ0ZXIgZyA9IGl0ZW1nZXR0ZXIoMiwgNSwgMyksIHRoZSBjYWxsIGcocikgcmV0dXJucyAoclsyXSwgcls1XSwgclszXSlcXFwiLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy50cCRuYW1lK1xcXCIoLi4uKVxcXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudHAkbmFtZStcXFwiKFxcXCIrdGhpcy5pdGVtcy5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSkuam9pbihcXFwiLCBcXFwiKStcXFwiKVxcXCI7cmV0dXJuIHRoaXMuaW4kcmVwcj0hMSxhfX19KSxvcGVyYXRvci5hdHRyZ2V0dGVyPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcIm9wZXJhdG9yLmF0dHJnZXR0ZXJcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBhdHRyZ2V0dGVyKGEpe3RoaXMuYXR0cnM9YSx0aGlzLm9uZWF0dHI9MT09PWEubGVuZ3RoLHRoaXMuYXR0cj1hWzBdLHRoaXMuaW4kcmVwcj0hMX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJG5ldyhhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImF0dHJnZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiYXR0cmdldHRlclxcXCIsYSwxKTtjb25zdCBjPVtdO2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBiPWFbZF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nXFxcIik7Yi52LmluY2x1ZGVzKFxcXCIuXFxcIik/Yy5wdXNoKGIuJGpzc3RyKCkuc3BsaXQoXFxcIi5cXFwiKS5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSk6Yy5wdXNoKFtiXSl9cmV0dXJuIG5ldyBvcGVyYXRvci5hdHRyZ2V0dGVyKGMpfSx0cCRjYWxsKGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiYXR0cmdldHRlclxcXCIsYiksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJhdHRyZ2V0dGVyXFxcIixhLDEsMSk7Y29uc3QgYz1hWzBdO2lmKHRoaXMub25lYXR0cilyZXR1cm4gdGhpcy5hdHRyLnJlZHVjZSgoYSxiKT0+U2suYWJzdHIuZ2F0dHIoYSxiKSxjKTtjb25zdCBkPXRoaXMuYXR0cnMubWFwKGE9PmEucmVkdWNlKChhLGIpPT5Tay5hYnN0ci5nYXR0cihhLGIpLGMpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoZCl9LHRwJGRvYzpcXFwiYXR0cmdldHRlcihhdHRyLCAuLi4pIC0tPiBhdHRyZ2V0dGVyIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBmZXRjaGVzIHRoZSBnaXZlbiBhdHRyaWJ1dGUocykgZnJvbSBpdHMgb3BlcmFuZC5cXFxcbkFmdGVyIGYgPSBhdHRyZ2V0dGVyKCduYW1lJyksIHRoZSBjYWxsIGYocikgcmV0dXJucyByLm5hbWUuXFxcXG5BZnRlciBnID0gYXR0cmdldHRlcignbmFtZScsICdkYXRlJyksIHRoZSBjYWxsIGcocikgcmV0dXJucyAoci5uYW1lLCByLmRhdGUpLlxcXFxuQWZ0ZXIgaCA9IGF0dHJnZXR0ZXIoJ25hbWUuZmlyc3QnLCAnbmFtZS5sYXN0JyksIHRoZSBjYWxsIGgocikgcmV0dXJuc1xcXFxuKHIubmFtZS5maXJzdCwgci5uYW1lLmxhc3QpLlxcXCIsJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnRwJG5hbWUrXFxcIiguLi4pXFxcIik7dGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy50cCRuYW1lK1xcXCIoXFxcIit0aGlzLml0ZW1zLm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKS5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIjtyZXR1cm4gdGhpcy5pbiRyZXByPSExLGF9fX0pLG9wZXJhdG9yLm1ldGhvZGNhbGxlcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJvcGVyYXRvci5tZXRob2RjYWxsZXJcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBtZXRob2RjYWxsZXIoYSxiLGMpe3RoaXMuJG5hbWU9YSx0aGlzLmFyZ3M9Yix0aGlzLmt3YXJncz1jfHxbXSx0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcIm1ldGhvZGNhbGxlclxcXCIsYSwxKTtjb25zdCBjPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nXFxcIik7cmV0dXJuIG5ldyBvcGVyYXRvci5tZXRob2RjYWxsZXIoYyxhLnNsaWNlKDEpLGIpfSx0cCRjYWxsKGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwibWV0aG9kY2FsbGVyXFxcIixiKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcIm1ldGhvZGNhbGxlclxcXCIsYSwxLDEpO2NvbnN0IGM9YVswXTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIuZ2F0dHIoYyx0aGlzLiRuYW1lLCEwKSxhPT5Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYSx0aGlzLmFyZ3MsdGhpcy5rd2FyZ3MpKX0sdHAkZG9jOlxcXCJtZXRob2RjYWxsZXIobmFtZSwgLi4uKSAtLT4gbWV0aG9kY2FsbGVyIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBjYWxscyB0aGUgZ2l2ZW4gbWV0aG9kIG9uIGl0cyBvcGVyYW5kLlxcXFxuQWZ0ZXIgZiA9IG1ldGhvZGNhbGxlcignbmFtZScpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgci5uYW1lKCkuXFxcXG5BZnRlciBnID0gbWV0aG9kY2FsbGVyKCduYW1lJywgJ2RhdGUnLCBmb289MSksIHRoZSBjYWxsIGcocikgcmV0dXJuc1xcXFxuci5uYW1lKCdkYXRlJywgZm9vPTEpLlxcXCIsJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnRwJG5hbWUrXFxcIiguLi4pXFxcIik7dGhpcy5pbiRyZXByPSEwO2xldCBhPVtTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuJG5hbWUpLC4uLnRoaXMuYXJncy5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSldO2ZvcihsZXQgYj0wO2I8dGhpcy5rd2FyZ3MubGVuZ3RoO2IrPTIpYS5wdXNoKHRoaXMua3dhcmdzW2JdK1xcXCI9XFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMua3dhcmdzW2IrMV0pKTtyZXR1cm4gYT10aGlzLnRwJG5hbWUrXFxcIihcXFwiK2Euam9pbihcXFwiLCBcXFwiKStcXFwiKVxcXCIsdGhpcy5pbiRyZXByPSExLGF9fX0pLFNrLmFic3RyLnNldFVwTW9kdWxlTWV0aG9kcyhcXFwib3BlcmF0b3JcXFwiLG9wZXJhdG9yLHtsdDp7JG1ldGg6ZnVuY3Rpb24gbHQoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkx0XFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA8IGIuXFxcIn0sbGU6eyRtZXRoOmZ1bmN0aW9uIGxlKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJMdEVcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIDw9IGIuXFxcIn0sZXE6eyRtZXRoOmZ1bmN0aW9uIGVxKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJFcVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPT0gYi5cXFwifSxuZTp7JG1ldGg6ZnVuY3Rpb24gbmUoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIk5vdEVxXFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAhPSBiLlxcXCJ9LGdlOnskbWV0aDpmdW5jdGlvbiBnZShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiR3RFXFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+PSBiLlxcXCJ9LGd0OnskbWV0aDpmdW5jdGlvbiBndChjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiR3RcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID4gYi5cXFwifSxub3RfOnskbWV0aDpmdW5jdGlvbiBub3RfKGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIk5vdFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBub3QgYS5cXFwifSx0cnV0aDp7JG1ldGg6ZnVuY3Rpb24gdHJ1dGgoYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChhKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBUcnVlIGlmIGEgaXMgdHJ1ZSwgRmFsc2Ugb3RoZXJ3aXNlLlxcXCJ9LGlzXzp7JG1ldGg6ZnVuY3Rpb24gaXNfKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJJc1xcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgaXMgYi5cXFwifSxpc19ub3Q6eyRtZXRoOmZ1bmN0aW9uIGlzX25vdChjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiSXNOb3RcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIGlzIG5vdCBiLlxcXCJ9LGFiczp7JG1ldGg6ZnVuY3Rpb24gYWJzKGEpe3JldHVybiBTay5idWlsdGluLmFicyhhKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYWJzKGEpLlxcXCJ9LGFkZDp7JG1ldGg6ZnVuY3Rpb24gYWRkKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiQWRkXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICsgYi5cXFwifSxhbmRfOnskbWV0aDpmdW5jdGlvbiBhbmRfKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiQml0QW5kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICYgYi5cXFwifSxmbG9vcmRpdjp7JG1ldGg6ZnVuY3Rpb24gZmxvb3JkaXYoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJGbG9vckRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvLyBiLlxcXCJ9LGluZGV4OnskbWV0aDpmdW5jdGlvbiBpbmRleChiKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEuX19pbmRleF9fKClcXFwifSxpbnY6eyRtZXRoOmZ1bmN0aW9uIGludihhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyVW5hcnlPcChhLFxcXCJJbnZlcnRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgfmEuXFxcIn0saW52ZXJ0OnskbWV0aDpmdW5jdGlvbiBpbnZlcnQoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiSW52ZXJ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyB+YS5cXFwifSxsc2hpZnQ6eyRtZXRoOmZ1bmN0aW9uIGxzaGlmdChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkxTaGlmdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA8PCBiLlxcXCJ9LG1vZDp7JG1ldGg6ZnVuY3Rpb24gbW9kKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiTW9kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICUgYi5cXFwifSxtdWw6eyRtZXRoOmZ1bmN0aW9uIG11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIk11bHRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKiBiLlxcXCJ9LG1hdG11bDp7JG1ldGg6ZnVuY3Rpb24gbWF0bXVsKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiTWF0TXVsdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSBAIGIuXFxcIn0sbmVnOnskbWV0aDpmdW5jdGlvbiBuZWcoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiVVN1YlxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyAtYS5cXFwifSxvcl86eyRtZXRoOmZ1bmN0aW9uIG9yXyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkJpdE9yXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIHwgYi5cXFwifSxwb3M6eyRtZXRoOmZ1bmN0aW9uIHBvcyhhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyVW5hcnlPcChhLFxcXCJVQWRkXFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzICthLlxcXCJ9LHBvdzp7JG1ldGg6ZnVuY3Rpb24gcG93KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiUG93XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICoqIGIuXFxcIn0scnNoaWZ0OnskbWV0aDpmdW5jdGlvbiByc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJSU2hpZnRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPj4gYi5cXFwifSxzdWI6eyRtZXRoOmZ1bmN0aW9uIHN1YihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIlN1YlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAtIGIuXFxcIn0sdHJ1ZWRpdjp7JG1ldGg6ZnVuY3Rpb24gZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiRGl2XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC8gYi5cXFwifSx4b3I6eyRtZXRoOmZ1bmN0aW9uIHhvcihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkJpdFhvclxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSBeIGIuXFxcIn0sY29uY2F0OnskbWV0aDpmdW5jdGlvbiBjb25jYXQoYyxhKXtyZXR1cm4gU2suYWJzdHIuc2VxdWVuY2VDb25jYXQoYyxhKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKyBiLCBmb3IgYSBhbmQgYiBzZXF1ZW5jZXMuXFxcIn0sY29udGFpbnM6eyRtZXRoOmZ1bmN0aW9uIGNvbnRhaW5zKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5hYnN0ci5zZXF1ZW5jZUNvbnRhaW5zKGMsYSkpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYiBpbiBhIChub3RlIHJldmVyc2VkIG9wZXJhbmRzKS5cXFwifSxjb3VudE9mOnskbWV0aDpmdW5jdGlvbiBjb3VudE9mKGMsYSl7cmV0dXJuIFNrLmFic3RyLnNlcXVlbmNlR2V0Q291bnRPZihjLGEpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIGIgb2NjdXJzIGluIGEuXFxcIn0sZGVsaXRlbTp7JG1ldGg6ZnVuY3Rpb24gZGVsaXRlbShjLGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5hYnN0ci5vYmplY3REZWxJdGVtKGMsYSwhMCksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBkZWwgYVtiXS5cXFwifSxnZXRpdGVtOnskbWV0aDpmdW5jdGlvbiBnZXRpdGVtKGMsYSl7cmV0dXJuIFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxhKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGFbYl0uXFxcIn0saW5kZXhPZjp7JG1ldGg6ZnVuY3Rpb24gaW5kZXhPZihjLGEpe3JldHVybiBTay5hYnN0ci5zZXF1ZW5jZUdldEluZGV4T2YoYyxhKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGZpcnN0IGluZGV4IG9mIGIgaW4gYS5cXFwifSxzZXRpdGVtOnskbWV0aDpmdW5jdGlvbiBzZXRpdGVtKGQsYSxiKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIub2JqZWN0U2V0SXRlbShkLGEsYiwhMCksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7TWluQXJnczozLE1heEFyZ3M6M30sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCBjLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhW2JdID0gYy5cXFwifSxsZW5ndGhfaGludDp7JG1ldGg6ZnVuY3Rpb24gbGVuZ3RoX2hpbnQoYSxiKXtpZih2b2lkIDA9PT1iKWI9bmV3IFNrLmJ1aWx0aW4uaW50XygwKTtlbHNlIGlmKCFTay5idWlsdGluLmNoZWNrSW50KGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiJ1xcXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXFxcIicgb2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyXFxcIik7dHJ5e3JldHVybiBTay5idWlsdGluLmxlbihhKX1jYXRjaChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLlR5cGVFcnJvcikpdGhyb3cgYX1jb25zdCBjPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kbGVuZ3RoX2hpbnQpO2lmKHZvaWQgMCE9PWMpe2NvbnN0IGE9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGMsW10pO2lmKGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJClyZXR1cm4gYjtpZighU2suYnVpbHRpbi5jaGVja0ludGVnZXIoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJfX2xlbmd0aF9oaW50X18gbXVzdCBiZSBhbiBpbnRlZ2VyLCBub3QgXFxcIitTay5hYnN0ci50eXBlTmFtZShhKSk7ZWxzZSBpZihhLm5iJGlzbmVnYXRpdmUoKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIl9fbGVuZ3RoX2hpbnRfXygpIHNob3VsZCByZXR1cm4gPj0gMFxcXCIpO3JldHVybiBhfXJldHVybiBifSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgb2JqLCBkZWZhdWx0PTAsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBvYmouXFxcXG5cXFxcblRoaXMgaXMgdXNlZnVsIGZvciBwcmVzaXppbmcgY29udGFpbmVycyB3aGVuIGJ1aWxkaW5nIGZyb20gYW4gaXRlcmFibGUuXFxcXG5cXFxcbklmIHRoZSBvYmplY3Qgc3VwcG9ydHMgbGVuKCksIHRoZSByZXN1bHQgd2lsbCBiZSBleGFjdC5cXFxcbk90aGVyd2lzZSwgaXQgbWF5IG92ZXItIG9yIHVuZGVyLWVzdGltYXRlIGJ5IGFuIGFyYml0cmFyeSBhbW91bnQuXFxcXG5UaGUgcmVzdWx0IHdpbGwgYmUgYW4gaW50ZWdlciA+PSAwLlxcXCJ9LGlhZGQ6eyRtZXRoOmZ1bmN0aW9uIGlhZGQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQWRkXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICs9IGIuXFxcIn0saWFuZDp7JG1ldGg6ZnVuY3Rpb24gaWFuZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJCaXRBbmRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgJj0gYi5cXFwifSxpY29uY2F0OnskbWV0aDpmdW5jdGlvbiBpY29uY2F0KGMsYSl7aWYodm9pZCAwIT09Yy5zcSRpbnBsYWNlX2NvbmNhdClyZXR1cm4gYy5zcSRpbnBsYWNlX2NvbmNhdChhKTtpZih2b2lkIDAhPT1jLnNxJGNvbmNhdClyZXR1cm4gYy5zcSRjb25jYXQoYSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZShjKXx8IVNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoU2suYWJzdHIudHlwZU5hbWUoYykrXFxcIiBvYmplY3QgY2FuJ3QgYmUgY29uY2F0ZW5hdGVkXFxcIik7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkFkZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArPSBiLCBmb3IgYSBhbmQgYiBzZXF1ZW5jZXMuXFxcIn0saWZsb29yZGl2OnskbWV0aDpmdW5jdGlvbiBpZmxvb3JkaXYoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiRmxvb3JEaXZcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLy89IGIuXFxcIn0saWxzaGlmdDp7JG1ldGg6ZnVuY3Rpb24gaWxzaGlmdChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJMU2hpZnRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPDw9IGIuXFxcIn0saW1vZDp7JG1ldGg6ZnVuY3Rpb24gaW1vZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJNb2RcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgJT0gYi5cXFwifSxpbXVsOnskbWV0aDpmdW5jdGlvbiBpbXVsKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIk11bHRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKj0gYi5cXFwifSxpbWF0bXVsOnskbWV0aDpmdW5jdGlvbiBpbWF0bXVsKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIk1hdE11bHRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgQD0gYi5cXFwifSxpb3I6eyRtZXRoOmZ1bmN0aW9uIGlvcihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJCaXRPclxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSB8PSBiLlxcXCJ9LGlwb3c6eyRtZXRoOmZ1bmN0aW9uIGlwb3coYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiUG93XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICoqPSBiLlxcXCJ9LGlyc2hpZnQ6eyRtZXRoOmZ1bmN0aW9uIGlyc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTFJoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID4+PSBiLlxcXCJ9LGlzdWI6eyRtZXRoOmZ1bmN0aW9uIGlzdWIoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiU3ViXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC09IGIuXFxcIn0saXRydWVkaXY6eyRtZXRoOmZ1bmN0aW9uIGlkaXYoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiRGl2XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC89IGIuXFxcIn0saXhvcjp7JG1ldGg6ZnVuY3Rpb24gaXhvcihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJCaXRYb3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgXj0gYi5cXFwifX0pLE9iamVjdC5hc3NpZ24ob3BlcmF0b3Ise19fYWJzX186b3BlcmF0b3IuYWJzLF9fYWRkX186b3BlcmF0b3IuYWRkLF9fYW5kX186b3BlcmF0b3IuYW5kLF9fY29uY2F0X186b3BlcmF0b3IuY29uY2F0LF9fY29udGFpbnNfXzpvcGVyYXRvci5jb250YWlucyxfX2RlbGl0ZW1fXzpvcGVyYXRvci5kZWxpdGVtLF9fZXFfXzpvcGVyYXRvci5lcSxfX2Zsb29yZGl2X186b3BlcmF0b3IuZmxvb3JkaXYsX19nZV9fOm9wZXJhdG9yLmdlLF9fZ2V0aXRlbV9fOm9wZXJhdG9yLmdldGl0ZW0sX19ndF9fOm9wZXJhdG9yLmd0LF9faWFkZF9fOm9wZXJhdG9yLmlhZGQsX19pYW5kX186b3BlcmF0b3IuaWFuZCxfX2ljb25jYXRfXzpvcGVyYXRvci5pY29uY2F0LF9faWZsb29yZGl2X186b3BlcmF0b3IuaWZsb29yZGl2LF9faWxzaGlmdF9fOm9wZXJhdG9yLmlsc2hpZnQsX19pbWF0bXVsX186b3BlcmF0b3IuaW1hdG11bCxfX2ltb2RfXzpvcGVyYXRvci5pbW9kLF9faW11bF9fOm9wZXJhdG9yLmltdWwsX19pbmRleF9fOm9wZXJhdG9yLmluZGV4LF9faW52X186b3BlcmF0b3IuaW52LF9faW52ZXJ0X186b3BlcmF0b3IuaW52ZXJ0LF9faW9yX186b3BlcmF0b3IuaW9yLF9faXBvd19fOm9wZXJhdG9yLmlwb3csX19pcnNoaWZ0X186b3BlcmF0b3IuaXJzaGlmdCxfX2lzdWJfXzpvcGVyYXRvci5pc3ViLF9faXRydWVkaXZfXzpvcGVyYXRvci5pdHJ1ZWRpdixfX2l4b3JfXzpvcGVyYXRvci5peG9yLF9fbGVfXzpvcGVyYXRvci5sZSxfX2xzaGlmdF9fOm9wZXJhdG9yLmxzaGlmdCxfX2x0X186b3BlcmF0b3IubHQsX19tYXRtdWxfXzpvcGVyYXRvci5tYXRtdWwsX19tb2RfXzpvcGVyYXRvci5tb2QsX19tdWxfXzpvcGVyYXRvci5tdWwsX19uZV9fOm9wZXJhdG9yLm5lLF9fbmVnX186b3BlcmF0b3IubmVnLF9fbm90X186b3BlcmF0b3Iubm90LF9fb3JfXzpvcGVyYXRvci5vcixfX3Bvc19fOm9wZXJhdG9yLnBvcyxfX3Bvd19fOm9wZXJhdG9yLnBvdyxfX3JzaGlmdF9fOm9wZXJhdG9yLnJzaGlmdCxfX3NldGl0ZW1fXzpvcGVyYXRvci5zZXRpdGVtLF9fc3ViX186b3BlcmF0b3Iuc3ViLF9fdHJ1ZWRpdl9fOm9wZXJhdG9yLnRydWVkaXYsX194b3JfXzpvcGVyYXRvci54b3IsX2FiczpTay5idWlsdGlucy5hYnMsZGl2Om9wZXJhdG9yLnRydWVkaXYsX19kaXZfXzpvcGVyYXRvci50cnVlZGl2fSksb3BlcmF0b3J9XCIsXCJzcmMvbGliL29wdHBhcnNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvcHRwYXJzZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL29zLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL29zMmVteHBhdGgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm9zMmVteHBhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wZGIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBkYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BpY2tsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGlja2xlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGlja2xldG9vbHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBpY2tsZXRvb2xzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGlwZXMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBpcGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGtndXRpbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGtndXRpbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BsYXRmb3JtLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fSxiPVxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2Ygd2luZG93JiZcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3I7cmV0dXJuIGEucHl0aG9uX2ltcGxlbWVudGF0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwicHl0aG9uX2ltcGxlbWVudGF0aW9uXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJTa3VscHRcXFwiKX0pLGEubm9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm5vZGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSksYS52ZXJzaW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwidmVyc2lvblxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnN0cihcXFwiXFxcIil9KSxhLnB5dGhvbl92ZXJzaW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwicHl0aG9uX3ZlcnNpb25cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxhPVNrLl9fZnV0dXJlX18ucHl0aG9uX3ZlcnNpb24/XFxcIjMuMi4wXFxcIjpcXFwiMi43LjBcXFwiLG5ldyBTay5idWlsdGluLnN0cihhKX0pLGEuc3lzdGVtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic3lzdGVtXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1iP3dpbmRvdy5uYXZpZ2F0b3IuYXBwQ29kZU5hbWU6XFxcIlxcXCIsbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSksYS5tYWNoaW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibWFjaGluZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLGE9Yj93aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtOlxcXCJcXFwiLG5ldyBTay5idWlsdGluLnN0cihhKX0pLGEucmVsZWFzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJlbGVhc2VcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxhPWI/d2luZG93Lm5hdmlnYXRvci5hcHBWZXJzaW9uOlxcXCJcXFwiLG5ldyBTay5idWlsdGluLnN0cihhKX0pLGEuYXJjaGl0ZWN0dXJlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiYXJjaGl0ZWN0dXJlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihcXFwiNjRiaXRcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpXSl9KSxhLnByb2Nlc3Nvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInByb2Nlc3NvclxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnN0cihcXFwiXFxcIil9KSxhfTtcIixcInNyYy9saWIvcGxhdGZvcm0ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBsYXRmb3JtIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGxpc3RsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBsaXN0bGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcG9wZW4yLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwb3BlbjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wb3BsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBvcGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Bvc2l4ZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9zaXhmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcG9zaXhwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwb3NpeHBhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wcHJpbnQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBwcmludCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Byb2Nlc3NpbmcuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBiLGMsZCxlLGYsZyxoLGE9TWF0aC5QSSxqPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcInByb2Nlc3NpbmdcXFwiKX0saz1bXSxsPSEwLG09bnVsbDtyZXR1cm4gai5wcm9jZXNzaW5nPW51bGwsai5wPW51bGwsai5YPW5ldyBTay5idWlsdGluLmludF8oMCksai5ZPW5ldyBTay5idWlsdGluLmludF8oMSksai5aPW5ldyBTay5idWlsdGluLmludF8oMiksai5SPW5ldyBTay5idWlsdGluLmludF8oMyksai5HPW5ldyBTay5idWlsdGluLmludF8oNCksai5CPW5ldyBTay5idWlsdGluLmludF8oNSksai5BPW5ldyBTay5idWlsdGluLmludF8oNiksai5VPW5ldyBTay5idWlsdGluLmludF8oNyksai5WPW5ldyBTay5idWlsdGluLmludF8oOCksai5OWD1uZXcgU2suYnVpbHRpbi5pbnRfKDkpLGouTlk9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5OWj1uZXcgU2suYnVpbHRpbi5pbnRfKDExKSxqLkVER0U9bmV3IFNrLmJ1aWx0aW4uaW50XygxMiksai5TUj1uZXcgU2suYnVpbHRpbi5pbnRfKDEzKSxqLlNHPW5ldyBTay5idWlsdGluLmludF8oMTQpLGouU0I9bmV3IFNrLmJ1aWx0aW4uaW50XygxNSksai5TQT1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLlNXPW5ldyBTay5idWlsdGluLmludF8oMTcpLGouVFg9bmV3IFNrLmJ1aWx0aW4uaW50XygxOCksai5UWT1uZXcgU2suYnVpbHRpbi5pbnRfKDE5KSxqLlRaPW5ldyBTay5idWlsdGluLmludF8oMjApLGouVlg9bmV3IFNrLmJ1aWx0aW4uaW50XygyMSksai5WWT1uZXcgU2suYnVpbHRpbi5pbnRfKDIyKSxqLlZaPW5ldyBTay5idWlsdGluLmludF8oMjMpLGouVlc9bmV3IFNrLmJ1aWx0aW4uaW50XygyNCksai5BUj1uZXcgU2suYnVpbHRpbi5pbnRfKDI1KSxqLkFHPW5ldyBTay5idWlsdGluLmludF8oMjYpLGouQUI9bmV3IFNrLmJ1aWx0aW4uaW50XygyNyksai5EUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouREc9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLkRCPW5ldyBTay5idWlsdGluLmludF8oNSksai5EQT1uZXcgU2suYnVpbHRpbi5pbnRfKDYpLGouU1BSPW5ldyBTay5idWlsdGluLmludF8oMjgpLGouU1BHPW5ldyBTay5idWlsdGluLmludF8oMjkpLGouU1BCPW5ldyBTay5idWlsdGluLmludF8oMzApLGouU0hJTkU9bmV3IFNrLmJ1aWx0aW4uaW50XygzMSksai5FUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMyKSxqLkVHPW5ldyBTay5idWlsdGluLmludF8oMzMpLGouRUI9bmV3IFNrLmJ1aWx0aW4uaW50XygzNCksai5CRUVOX0xJVD1uZXcgU2suYnVpbHRpbi5pbnRfKDM1KSxqLlZFUlRFWF9GSUVMRF9DT1VOVD1uZXcgU2suYnVpbHRpbi5pbnRfKDM2KSxqLkNFTlRFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouUkFESVVTPW5ldyBTay5idWlsdGluLmludF8oMiksai5DT1JORVJTPW5ldyBTay5idWlsdGluLmludF8oMSksai5DT1JORVI9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkRJQU1FVEVSPW5ldyBTay5idWlsdGluLmludF8oMyksai5CQVNFTElORT1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouVE9QPW5ldyBTay5idWlsdGluLmludF8oMTAxKSxqLkJPVFRPTT1uZXcgU2suYnVpbHRpbi5pbnRfKDEwMiksai5OT1JNQUw9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLk5PUk1BTElaRUQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLklNQUdFPW5ldyBTay5idWlsdGluLmludF8oMiksai5NT0RFTD1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouU0hBUEU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg1KSxqLkFNQklFTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkRJUkVDVElPTkFMPW5ldyBTay5idWlsdGluLmludF8oMSksai5TUE9UPW5ldyBTay5idWlsdGluLmludF8oMyksai5SR0I9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkFSR0I9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkhTQj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQUxQSEE9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLkNNWUs9bmV3IFNrLmJ1aWx0aW4uaW50Xyg1KSxqLlRJRkY9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLlRBUkdBPW5ldyBTay5idWlsdGluLmludF8oMSksai5KUEVHPW5ldyBTay5idWlsdGluLmludF8oMiksai5HSUY9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLk1JVEVSPW5ldyBTay5idWlsdGluLnN0cihcXFwibWl0ZXJcXFwiKSxqLkJFVkVMPW5ldyBTay5idWlsdGluLnN0cihcXFwiYmV2ZWxcXFwiKSxqLlJPVU5EPW5ldyBTay5idWlsdGluLnN0cihcXFwicm91bmRcXFwiKSxqLlNRVUFSRT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImJ1dHRcXFwiKSxqLlBST0pFQ1Q9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJzcXVhcmVcXFwiKSxqLlAyRD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouSkFWQTJEPW5ldyBTay5idWlsdGluLmludF8oMSksai5XRUJHTD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUDNEPW5ldyBTay5idWlsdGluLmludF8oMiksai5PUEVOR0w9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlBERj1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouRFhGPW5ldyBTay5idWlsdGluLmludF8oMCksai5PVEhFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouV0lORE9XUz1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouTUFYT1NYPW5ldyBTay5idWlsdGluLmludF8oMiksai5MSU5VWD1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouRVBTSUxPTj1uZXcgU2suYnVpbHRpbi5mbG9hdF8oMWUtNCksai5NQVhfRkxPQVQ9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDM0MDI4MjM1ZTMxKSxqLk1JTl9GTE9BVD1uZXcgU2suYnVpbHRpbi5mbG9hdF8oLTM0MDI4MjM1ZTMxKSxqLk1BWF9JTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygyMTQ3NDgzNjQ3KSxqLk1JTl9JTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygtMjE0NzQ4MzY0OCksai5IQUxGX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XyhhLzIpLGouVEhJUkRfUEk9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvMyksai5QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSksai5UV09fUEk9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDIqYSksai5UQVU9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDIqYSksai5RVUFSVEVSX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XyhhLzQpLGouREVHX1RPX1JBRD1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS8xODApLGouUkFEX1RPX0RFRz1uZXcgU2suYnVpbHRpbi5mbG9hdF8oMTgwL2EpLGouV0hJVEVTUEFDRT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiBcXFxcdFxcXFxuXFxcXHJcXFxcZlxcXFx4QTBcXFwiKSxqLlBPSU5UPW5ldyBTay5idWlsdGluLmludF8oMiksai5QT0lOVFM9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkxJTkU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLkxJTkVTPW5ldyBTay5idWlsdGluLmludF8oNCksai5UUklBTkdMRT1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouVFJJQU5HTEVTPW5ldyBTay5idWlsdGluLmludF8oOSksai5UUklBTkdMRV9GQU49bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksai5UUklBTkdMRV9TVFJJUD1uZXcgU2suYnVpbHRpbi5pbnRfKDEwKSxqLlFVQUQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5RVUFEUz1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLlFVQURfU1RSSVA9bmV3IFNrLmJ1aWx0aW4uaW50XygxNyksai5QT0xZR09OPW5ldyBTay5idWlsdGluLmludF8oMjApLGouUEFUSD1uZXcgU2suYnVpbHRpbi5pbnRfKDIxKSxqLlJFQ1Q9bmV3IFNrLmJ1aWx0aW4uaW50XygzMCksai5FTExJUFNFPW5ldyBTay5idWlsdGluLmludF8oMzEpLGouQVJDPW5ldyBTay5idWlsdGluLmludF8oMzIpLGouU1BIRVJFPW5ldyBTay5idWlsdGluLmludF8oNDApLGouQk9YPW5ldyBTay5idWlsdGluLmludF8oNDEpLGouR1JPVVA9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLlBSSU1JVElWRT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouR0VPTUVUUlk9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLlZFUlRFWD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouQkVaSUVSX1ZFUlRFWD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouQ1VSVkVfVkVSVEVYPW5ldyBTay5idWlsdGluLmludF8oMiksai5CUkVBSz1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQ0xPU0VTSEFQRT1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouUkVQTEFDRT1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouQkxFTkQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkFERD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouU1VCVFJBQ1Q9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLkxJR0hURVNUPW5ldyBTay5idWlsdGluLmludF8oOCksai5EQVJLRVNUPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouRElGRkVSRU5DRT1uZXcgU2suYnVpbHRpbi5pbnRfKDMyKSxqLkVYQ0xVU0lPTj1uZXcgU2suYnVpbHRpbi5pbnRfKDY0KSxqLk1VTFRJUExZPW5ldyBTay5idWlsdGluLmludF8oMTI4KSxqLlNDUkVFTj1uZXcgU2suYnVpbHRpbi5pbnRfKDI1Niksai5PVkVSTEFZPW5ldyBTay5idWlsdGluLmludF8oNTEyKSxqLkhBUkRfTElHSFQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMDI0KSxqLlNPRlRfTElHSFQ9bmV3IFNrLmJ1aWx0aW4uaW50XygyMDQ4KSxqLkRPREdFPW5ldyBTay5idWlsdGluLmludF8oNDA5Niksai5CVVJOPW5ldyBTay5idWlsdGluLmludF8oODE5Miksai5BTFBIQV9NQVNLPW5ldyBTay5idWlsdGluLmludF8oNDI3ODE5MDA4MCksai5SRURfTUFTSz1uZXcgU2suYnVpbHRpbi5pbnRfKDE2NzExNjgwKSxqLkdSRUVOX01BU0s9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2NTI4MCksai5CTFVFX01BU0s9bmV3IFNrLmJ1aWx0aW4uaW50XygyNTUpLGouQ1VTVE9NPW5ldyBTay5idWlsdGluLmludF8oMCksai5PUlRIT0dSQVBISUM9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlBFUlNQRUNUSVZFPW5ldyBTay5idWlsdGluLmludF8oMyksai5BUlJPVz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImRlZmF1bHRcXFwiKSxqLkNST1NTPW5ldyBTay5idWlsdGluLnN0cihcXFwiY3Jvc3NoYWlyXFxcIiksai5IQU5EPW5ldyBTay5idWlsdGluLnN0cihcXFwicG9pbnRlclxcXCIpLGouTU9WRT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIm1vdmVcXFwiKSxqLlRFWFQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJ0ZXh0XFxcIiksai5XQUlUPW5ldyBTay5idWlsdGluLnN0cihcXFwid2FpdFxcXCIpLGouTk9DVVJTT1I9U2suYnVpbHRpbi5hc3NrJChcXFwidXJsKCdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFQLy8vd0FBQUNINUJBRUFBQUFBTEFBQUFBQUJBQUVBQUFJQ1JBRUFPdz09JyksIGF1dG9cXFwiKSxqLkRJU0FCTEVfT1BFTkdMXzJYX1NNT09USD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouRU5BQkxFX09QRU5HTF8yWF9TTU9PVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygtMSksai5FTkFCTEVfT1BFTkdMXzRYX1NNT09USD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouRU5BQkxFX05BVElWRV9GT05UUz1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouRElTQUJMRV9ERVBUSF9URVNUPW5ldyBTay5idWlsdGluLmludF8oNCksai5FTkFCTEVfREVQVEhfVEVTVD1uZXcgU2suYnVpbHRpbi5pbnRfKC00KSxqLkVOQUJMRV9ERVBUSF9TT1JUPW5ldyBTay5idWlsdGluLmludF8oNSksai5ESVNBQkxFX0RFUFRIX1NPUlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygtNSksai5ESVNBQkxFX09QRU5HTF9FUlJPUl9SRVBPUlQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2KSxqLkVOQUJMRV9PUEVOR0xfRVJST1JfUkVQT1JUPW5ldyBTay5idWlsdGluLmludF8oLTYpLGouRU5BQkxFX0FDQ1VSQVRFX1RFWFRVUkVTPW5ldyBTay5idWlsdGluLmludF8oNyksai5ESVNBQkxFX0FDQ1VSQVRFX1RFWFRVUkVTPW5ldyBTay5idWlsdGluLmludF8oLTcpLGouSElOVF9DT1VOVD1uZXcgU2suYnVpbHRpbi5pbnRfKDEwKSxqLk9QRU49bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkNMT1NFPW5ldyBTay5idWlsdGluLmludF8oMiksai5CTFVSPW5ldyBTay5idWlsdGluLmludF8oMTEpLGouR1JBWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyKSxqLklOVkVSVD1uZXcgU2suYnVpbHRpbi5pbnRfKDEzKSxqLk9QQVFVRT1uZXcgU2suYnVpbHRpbi5pbnRfKDE0KSxqLlBPU1RFUklaRT1uZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxqLlRIUkVTSE9MRD1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLkVST0RFPW5ldyBTay5idWlsdGluLmludF8oMTcpLGouRElMQVRFPW5ldyBTay5idWlsdGluLmludF8oMTgpLGouQkFDS1NQQUNFPW5ldyBTay5idWlsdGluLmludF8oOCksai5UQUI9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLkVOVEVSPW5ldyBTay5idWlsdGluLmludF8oMTApLGouUkVUVVJOPW5ldyBTay5idWlsdGluLmludF8oMTMpLGouRVNDPW5ldyBTay5idWlsdGluLmludF8oMjcpLGouREVMRVRFPW5ldyBTay5idWlsdGluLmludF8oMTI3KSxqLkNPREVEPW5ldyBTay5idWlsdGluLmludF8oNjU1MzUpLGouU0hJRlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5DT05UUk9MPW5ldyBTay5idWlsdGluLmludF8oMTcpLGouQUxUPW5ldyBTay5idWlsdGluLmludF8oMTgpLGouQ0FQU0xLPW5ldyBTay5idWlsdGluLmludF8oMjApLGouUEdVUD1uZXcgU2suYnVpbHRpbi5pbnRfKDMzKSxqLlBHRE49bmV3IFNrLmJ1aWx0aW4uaW50XygzNCksai5FTkQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNSksai5IT01FPW5ldyBTay5idWlsdGluLmludF8oMzYpLGouTEVGVD1uZXcgU2suYnVpbHRpbi5pbnRfKDM3KSxqLlVQPW5ldyBTay5idWlsdGluLmludF8oMzgpLGouUklHSFQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzOSksai5ET1dOPW5ldyBTay5idWlsdGluLmludF8oNDApLGouRjE9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTIpLGouRjI9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTMpLGouRjM9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTQpLGouRjQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTUpLGouRjU9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTYpLGouRjY9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTcpLGouRjc9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTgpLGouRjg9bmV3IFNrLmJ1aWx0aW4uaW50XygxMTkpLGouRjk9bmV3IFNrLmJ1aWx0aW4uaW50XygxMjApLGouRjEwPW5ldyBTay5idWlsdGluLmludF8oMTIxKSxqLkYxMT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyMiksai5GMTI9bmV3IFNrLmJ1aWx0aW4uaW50XygxMjMpLGouTlVNTEs9bmV3IFNrLmJ1aWx0aW4uaW50XygxNDQpLGouTUVUQT1uZXcgU2suYnVpbHRpbi5pbnRfKDE1Nyksai5JTlNFUlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxNTUpLGouU0lOQ09TX0xFTkdUSD1uZXcgU2suYnVpbHRpbi5pbnRfKDcyMCksai5QUkVDSVNJT05CPW5ldyBTay5idWlsdGluLmludF8oMTUpLGouUFJFQ0lTSU9ORj1uZXcgU2suYnVpbHRpbi5pbnRfKDMyNzY4KSxqLlBSRUNfTUFYVkFMPW5ldyBTay5idWlsdGluLmludF8oMzI3NjcpLGouUFJFQ19BTFBIQV9TSElGVD1uZXcgU2suYnVpbHRpbi5pbnRfKDkpLGouUFJFQ19SRURfU0hJRlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLk5PUk1BTF9NT0RFX0FVVE89bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLk5PUk1BTF9NT0RFX1NIQVBFPW5ldyBTay5idWlsdGluLmludF8oMSksai5OT1JNQUxfTU9ERV9WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLk1BWF9MSUdIVFM9bmV3IFNrLmJ1aWx0aW4uaW50Xyg4KSxqLmxpbmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtqLnByb2Nlc3NpbmcubGluZShhLnYsYi52LGMudixkLnYpfSksai5lbGxpcHNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmVsbGlwc2UoYS52LGIudixjLnYsZC52KX0pLGoudGV4dD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3NpbmcudGV4dChhLnYsYi52LGMudil9KSxqLnBvaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtqLnByb2Nlc3NpbmcucG9pbnQoYS52LGIudil9KSxqLmFyYz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtqLnByb2Nlc3NpbmcuYXJjKGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGoucXVhZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7ai5wcm9jZXNzaW5nLnF1YWQoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudil9KSxqLnJlY3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZT9qLnByb2Nlc3NpbmcucmVjdChhLnYsYi52LGMudixkLnYpOmoucHJvY2Vzc2luZy5yZWN0KGEudixiLnYsYy52LGQudixlLnYpfSksai50cmlhbmdsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtqLnByb2Nlc3NpbmcudHJpYW5nbGUoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5iZXppZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxrLGwsbSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBpP2oucHJvY2Vzc2luZy5iZXppZXIoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudik6ai5wcm9jZXNzaW5nLmJlemllcihhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudixrLnYsbC52LG0udil9KSxqLmFscGhhPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmFscGhhKGEudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmFscGhhKGEudixjLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmFscGhhKGEudixjLnYsZC52KSl9KSxqLmFtYmllbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy5hbWJpZW50KGEudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5hbWJpZW50KGEudixjLnYpOmoucHJvY2Vzc2luZy5hbWJpZW50KGEudixjLnYsZC52KX0pLGouYW1iaWVudExpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcuYW1iaWVudExpZ2h0KGEudixiLnYsYy52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGU/ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudixkLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZj9qLnByb2Nlc3NpbmcuYW1iaWVudExpZ2h0KGEudixiLnYsYy52LGQudixlLnYpOmoucHJvY2Vzc2luZy5hbWJpZW50TGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5iZWdpbkNhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLmJlZ2luQ2FtZXJhKCl9KSxqLmJlZ2luU2hhcGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGEmJihhPWouUE9MWUdPTiksai5wcm9jZXNzaW5nLmJlZ2luU2hhcGUoYS52KX0pLGouYmV6aWVyRGV0YWlsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YT1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/MjA6YS52LGoucHJvY2Vzc2luZy5iZXppZXJEZXRhaWwoYSl9KSxqLmJlemllclBvaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuYmV6aWVyUG9pbnQoZS52LGEudixiLnYsYy52LGQudil9KSxqLmJlemllclRhbmdlbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihlLGEsYixjLGQpe2oucHJvY2Vzc2luZy5iZXppZXJUYW5nZW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5iZXppZXJWZXJ0ZXg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBnP2oucHJvY2Vzc2luZy5iZXppZXJWZXJ0ZXgoYS52LGIudixjLnYsZC52LGUudixmLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaD9qLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBpP2oucHJvY2Vzc2luZy5iZXppZXJWZXJ0ZXgoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudik6ai5wcm9jZXNzaW5nLmJlemllclZlcnRleChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudil9KSxqLmJsZW5kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksayl7b3RoZXIgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fG90aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/ai5wcm9jZXNzaW5nLmJsZW5kKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KTpqLnByb2Nlc3NpbmcuYmxlbmQoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52KX0pLGouYmxlbmRDb2xvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5jb2xvcixbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCldKTtyZXR1cm4gZS52PWoucHJvY2Vzc2luZy5ibGVuZENvbG9yKGEudixiLnYsZC52KSxlfSksai5icmlnaHRuZXNzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmJyaWdodG5lc3MoYS52KSk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuYnJpZ2h0bmVzcyhhLnYsYy52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5icmlnaHRuZXNzKGEudixjLnYsZC52KSl9KSxqLmNhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLmNhbWVyYSgpOmoucHJvY2Vzc2luZy5jYW1lcmEoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYpfSksai5jb25zdHJhaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuY29uc3RyYWluKGEudixiLnYsYy52KSl9KSxqLmNvcHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7b3RoZXIgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fG90aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/ai5wcm9jZXNzaW5nLmNvcHkoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudik6ai5wcm9jZXNzaW5nLmNvcHkoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYpfSksai5jcmVhdGVGb250PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEZvbnQpO3JldHVybiBlLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy5jcmVhdGVGb250KGEudixiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcuY3JlYXRlRm9udChhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLmNyZWF0ZUZvbnQoYS52LGIudixjLnYsZC52KSxlfSksai5jcmVhdGVHcmFwaGljcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBHcmFwaGljcyk7cmV0dXJuIGUudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmNyZWF0ZUdyYXBoaWNzKGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcuY3JlYXRlR3JhcGhpY3MoYS52LGIudixjLnYsZC52KSxlfSksai5jcmVhdGVJbWFnZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXt2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QSW1hZ2UpO3JldHVybiBkLnY9ai5wcm9jZXNzaW5nLmNyZWF0ZUltYWdlKGEudixiLnYsYy52KSxkfSksai5jdXJzb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP2oucHJvY2Vzc2luZy5jdXJzb3IoKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLmN1cnNvcihhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuY3Vyc29yKGEudixiLnYpOmoucHJvY2Vzc2luZy5jdXJzb3IoYS52LGIudixjLnYpfSksai5jdXJ2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGssbCxtKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGk/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2Ygaz9qLnByb2Nlc3NpbmcuY3VydmUoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgbD9qLnByb2Nlc3NpbmcuY3VydmUoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIG0/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudixsLnYpOmoucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudixrLnYsbC52LG0udil9KSxqLmN1cnZlRGV0YWlsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmN1cnZlRGV0YWlsKGEudil9KSxqLmN1cnZlUG9pbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihlLGEsYixjLGQpe2oucHJvY2Vzc2luZy5jdXJ2ZVBvaW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5jdXJ2ZVRhbmdlbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihlLGEsYixjLGQpe2oucHJvY2Vzc2luZy5jdXJ2ZVRhbmdlbnQoZS52LGEudixiLnYsYy52LGQudil9KSxqLmN1cnZlVGlnaHRuZXNzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmN1cnZlVGlnaHRuZXNzKGEudil9KSxqLmN1cnZlVmVydGV4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuY3VydmVWZXJ0ZXgoYS52LGIudik6ai5wcm9jZXNzaW5nLmN1cnZlVmVydGV4KGEudixiLnYsYy52KX0pLGouZGF5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuZGF5KCkpfSksai5kZWdyZWVzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuZGVncmVlcyhhLnYpKX0pLGouZGlyZWN0aW9uYWxMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtqLnByb2Nlc3NpbmcuZGlyZWN0aW9uYWxMaWdodChhLnYsYi52LGMudixkLnYsZS52LGYudil9KSxqLmRpc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuZGlzdChhLnYsYi52LGMudixkLnYpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGY/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5kaXN0KGEudixiLnYsYy52LGQudixlLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRpc3QoYS52LGIudixjLnYsZC52LGUudixmLnYpKX0pLGouZW1pc3NpdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5lbWlzc2l2ZShhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuZW1pc3NpdmUoYS52LGIudik6ai5wcm9jZXNzaW5nLmVtaXNzaXZlKGEudixiLnYsYy52KX0pLGouZW5kQ2FtZXJhPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcuZW5kQ2FtZXJhKCl9KSxqLmVuZFNoYXBlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP2oucHJvY2Vzc2luZy5lbmRTaGFwZSgpOmoucHJvY2Vzc2luZy5lbmRTaGFwZShhLnYpfSksai5maWx0ZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcuZmlsdGVyKGEudik6ai5wcm9jZXNzaW5nLmZpbHRlcihhLnYsYi52KX0pLGouZnJ1c3R1bT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtqLnByb2Nlc3NpbmcuZnJ1c3R1bShhLGIsYyxkLGUsZil9KSxqLmhpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcuaGludChhKX0pLGouaG91cj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmhvdXIoKSl9KSxqLmh1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmh1ZShhLnYpKX0pLGouaW1hZ2VNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmltYWdlTW9kZShhLnYpfSksai5sZXJwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmxlcnAoYS52LGIudixjLnYpKX0pLGoubGVycENvbG9yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGQpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLmNvbG9yLFtuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCksbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0pO3JldHVybiBlLnY9ai5wcm9jZXNzaW5nLmxlcnBDb2xvcihhLnYsYi52LGQudiksZX0pLGoubGlnaHRGYWxsb2ZmPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2oucHJvY2Vzc2luZy5saWdodEZhbGxvZmYoYS52LGIudixjLnYpfSksai5saWdodHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5saWdodHMoKX0pLGoubGlnaHRTcGVjdWxhcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3NpbmcubGlnaHRTcGVjdWxhcihhLnYsYi52LGMudil9KSxqLmxvYWRCeXRlcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGoucHJvY2Vzc2luZy5sb2FkQnl0ZXMoYS52KSl9KSxqLmxvYWRGb250PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEZvbnQpO3JldHVybiBiLnY9ai5wcm9jZXNzaW5nLmxvYWRGb250KGEudiksYn0pLGoubG9hZFNoYXBlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFNoYXBlU1ZHLFtuZXcgU2suYnVpbHRpbi5zdHIoXFxcInN0cmluZ1xcXCIpLGFdKTtyZXR1cm4gYn0pLGoubG9hZFN0cmluZ3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChqLnByb2Nlc3NpbmcubG9hZFN0cmluZ3MoYS52KSl9KSxqLm1hZz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGQsYSxiKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5tYWcoZC52LGEudikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubWFnKGQudixhLnYsYi52KSl9KSxqLm1hcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubWFwKGEudixiLnYsYy52LGQudixlLnYpKX0pLGoubWlsbGlzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcubWlsbGlzKCkpfSksai5taW51dGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5taW51dGUoKSl9KSxqLm1vZGVsWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5tb2RlbFgoYS52LGIudixjLnYpKX0pLGoubW9kZWxZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1vZGVsWShhLnYsYi52LGMudikpfSksai5tb2RlbFo9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubW9kZWxaKGEudixiLnYsYy52KSl9KSxqLm1vbnRoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcubW9udGgoKSl9KSxqLm5vQ3Vyc29yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3Npbmcubm9DdXJzb3IoKX0pLGoubm9pc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcubm9pc2UoYS52KSk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcubm9pc2UoYS52LGIudikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcubm9pc2UoYS52LGIudixjLnYpKX0pLGoubm9pc2VEZXRhaWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2oucHJvY2Vzc2luZy5ub2lzZURldGFpbChhLnYsYi52KX0pLGoubm9pc2VTZWVkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcubm9pc2VTZWVkKGEudikpfSksai5ub0xpZ2h0cz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vTGlnaHRzKCl9KSxqLm5vcm09bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcubm9ybShhLnYsYi52LGMudikpfSksai5ub3JtYWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLm5vcm1hbChhLnYsYi52LGMudil9KSxqLm5vVGludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vVGludCgpfSksai5vcnRobz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtqLnByb2Nlc3Npbmcub3J0aG8oYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5wZXJzcGVjdGl2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcucGVyc3BlY3RpdmUoKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKGEudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcucGVyc3BlY3RpdmUoYS52LGIudixjLnYsZC52KX0pLGoucG9pbnRMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtqLnByb2Nlc3NpbmcucG9pbnRMaWdodChhLnYsYi52LGMudixkLnYsZS52LGYudil9KSxqLnByaW50Q2FtZXJhPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcucHJpbnRDYW1lcmEoKX0pLGoucHJpbnRsbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5wcmludGxuKGEudil9KSxqLnByaW50UHJvamVjdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnByaW50UHJvamVjdGlvbigpfSksai5yYWRpYW5zPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcucmFkaWFucyhhLnYpKX0pLGoucmFuZG9tU2VlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhbmRvbVNlZWQoYS52KSl9KSxqLnJhbmRvbT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcucmFuZG9tKCkpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhbmRvbShhLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhbmRvbShhLnYsYi52KSl9KSxqLnJlcXVlc3RJbWFnZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEltYWdlKTtyZXR1cm4gYy52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcucmVxdWVzdEltYWdlKGEudik6ai5wcm9jZXNzaW5nLnJlcXVlc3RJbWFnZShhLnYsYi52KSxjfSksai5zYXR1cmF0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcuc2F0dXJhdGlvbihhLnYpKX0pLGouc2F2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zYXZlKGEudil9KSxqLnNhdmVGcmFtZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3Npbmcuc2F2ZUZyYW1lKCk6ai5wcm9jZXNzaW5nLnNhdmVGcmFtZShhLnYpfSksai5zYXZlU3RyaW5ncz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7ai5wcm9jZXNzaW5nLnNhdmVTdHJpbmdzKGEudixiLnYpfSksai5zY3JlZW5YPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNjcmVlblgoYS52LGIudixjLnYpKX0pLGouc2NyZWVuWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zY3JlZW5ZKGEudixiLnYsYy52KSl9KSxqLnNjcmVlblo9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcuc2NyZWVuWihhLnYsYi52LGMudikpfSksai5zZWNvbmQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5zZWNvbmQoKSl9KSxqLnNoYXBlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnNoYXBlKGEudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLnNoYXBlKGEudixiLnYsYy52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGU/ai5wcm9jZXNzaW5nLnNoYXBlKGEudixiLnYsYy52LGQudik6ai5wcm9jZXNzaW5nLnNoYXBlKGEudixiLnYsYy52LGQudixlLnYpfSksai5zaGFwZU1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc2hhcGVNb2RlKGEudil9KSxqLnNoaW5pbmVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zaGluaW5lc3MoYS52KX0pLGouc3BlY3VsYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5zcGVjdWxhcihhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3Npbmcuc3BlY3VsYXIoYS52LGIudik6ai5wcm9jZXNzaW5nLnNwZWN1bGFyKGEudixiLnYsYy52KX0pLGouc3BvdExpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXtqLnByb2Nlc3Npbmcuc3BvdExpZ2h0KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpfSksai5zcT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNxKGEpKX0pLGouc3RhdHVzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnN0YXR1cyhhLnYpfSksai50ZXh0QWxpZ249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcudGV4dEFsaWduKGEudik6ai5wcm9jZXNzaW5nLnRleHRBbGlnbihhLnYsYi52KX0pLGoudGV4dEFzY2VudD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcudGV4dEFzY2VudCgpKX0pLGoudGV4dERlc2NlbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnRleHREZXNjZW50KCkpfSksai50ZXh0Rm9udD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy50ZXh0Rm9udChhLnYpOmoucHJvY2Vzc2luZy50ZXh0Rm9udChhLnYsYi52KX0pLGoudGV4dExlYWRpbmc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcudGV4dExlYWRpbmcoYS52KX0pLGoudGV4dE1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcudGV4dE1vZGUoYS52KX0pLGoudGV4dFNpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcudGV4dFNpemUoYS52KX0pLGoudGV4dHVyZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy50ZXh0dXJlKGEudil9KSxqLnRleHR1cmVNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHR1cmVNb2RlKGEudil9KSxqLnRleHRXaWR0aD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnRleHRXaWR0aChhLnYpKX0pLGoudGludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcudGludChhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcudGludChhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLnRpbnQoYS52LGIudixjLnYpOmoucHJvY2Vzc2luZy50aW50KGEudixiLnYsYy52LGQudil9KSxqLnVwZGF0ZVBpeGVscz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnVwZGF0ZVBpeGVscygpfSksai52ZXJ0ZXg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcudmVydGV4KGEudixiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcudmVydGV4KGEudixiLnYsYy52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGU/ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52LGMudixkLnYpOmoucHJvY2Vzc2luZy52ZXJ0ZXgoYS52LGIudixjLnYsZC52LGUudil9KSxqLnllYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy55ZWFyKCkpfSksai5ib3g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcuYm94KGEudil9KSxqLnNwaGVyZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zcGhlcmUoYS52KX0pLGouc3BoZXJlRGV0YWlsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnNwaGVyZURldGFpbChhLnYpOmoucHJvY2Vzc2luZy5zcGhlcmVEZXRhaWwoYS52LGIudil9KSxqLmJhY2tncm91bmQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCl7XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBjJiYoYz1jLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZCYmKGQ9ZC52KSxqLnByb2Nlc3NpbmcuYmFja2dyb3VuZChhLnYsYyxkKX0pLGouZmlsbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkLGUpe1xcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBlJiYoZT1lLnYpLGoucHJvY2Vzc2luZy5maWxsKGEudixjLGQsZSl9KSxqLnN0cm9rZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkLGUpe1xcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBlJiYoZT1lLnYpLGoucHJvY2Vzc2luZy5zdHJva2UoYS52LGMsZCxlKX0pLGoubm9TdHJva2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub1N0cm9rZSgpfSksai5jb2xvck1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe2I9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiPzI1NTpiLnYsXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBjJiYoYz1jLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZCYmKGQ9ZC52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGUmJihlPWUudiksai5wcm9jZXNzaW5nLmNvbG9yTW9kZShhLnYsYixjLGQsZSl9KSxqLm5vRmlsbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vRmlsbCgpfSksai5sb29wPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtpZihudWxsPT09ai5wcm9jZXNzaW5nKXRocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcXFwibG9vcCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgcnVuKClcXFwiKTtsPSEwLGoucHJvY2Vzc2luZy5sb29wKCl9KSxqLm5vTG9vcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYobnVsbD09PWoucHJvY2Vzc2luZyl0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIm5vTG9vcCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgcnVuKClcXFwiKTtsPSExLGoucHJvY2Vzc2luZy5ub0xvb3AoKX0pLGouZnJhbWVSYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmZyYW1lUmF0ZShhLnYpfSksai53aWR0aD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouaGVpZ2h0PW5ldyBTay5idWlsdGluLmludF8oMCksai5yZW5kZXJNb2RlPWouUDJELGouc2l6ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGMmJihjPWouUDJEKSxqLnByb2Nlc3Npbmcuc2l6ZShhLnYsYi52LGMudiksai53aWR0aD1uZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy53aWR0aCksai5oZWlnaHQ9bmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuaGVpZ2h0KSxqLnJlbmRlck1vZGU9Y30pLGouZXhpdHA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5leGl0KCl9KSxqLm1vdXNlWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1vdXNlWCl9KSxqLm1vdXNlWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1vdXNlWSl9KSxqLnBtb3VzZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5wbW91c2VYKX0pLGoucG1vdXNlWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLnBtb3VzZVkpfSksai5yZWN0TW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5yZWN0TW9kZShhLnYpfSksai5zdHJva2VXZWlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3Ryb2tlV2VpZ2h0KGEudil9KSxqLnNtb290aD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnNtb290aCgpfSksai5ub1Ntb290aD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vU21vb3RoKCl9KSxqLmVsbGlwc2VNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmVsbGlwc2VNb2RlKGEudil9KSxqLnN0cm9rZUNhcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zdHJva2VDYXAoYS52KX0pLGouc3Ryb2tlSm9pbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zdHJva2VKb2luKGEudil9KSxqLnJvdGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5yb3RhdGUoYS52KX0pLGoucm90YXRlWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5yb3RhdGVYKGEudil9KSxqLnJvdGF0ZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlWShhLnYpfSksai5yb3RhdGVaPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnJvdGF0ZVooYS52KX0pLGouc2NhbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7Yj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/MTpiLnYsYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/MTpjLnYsai5wcm9jZXNzaW5nLnNjYWxlKGEudixiLGMpfSksai50cmFuc2xhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7Yj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/MTpiLnYsYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/MTpjLnYsai5wcm9jZXNzaW5nLnRyYW5zbGF0ZShhLnYsYixjKX0pLGoucG9wTWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcucG9wTWF0cml4KCl9KSxqLnB1c2hNYXRyaXg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5wdXNoTWF0cml4KCl9KSxqLmFwcGx5TWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYSxiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwLDE2KTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV09XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiW2FdPzA6YlthXS52O2oucHJvY2Vzc2luZy5hcHBseU1hdHJpeC5hcHBseShqLnByb2Nlc3NpbmcsYil9KSxqLnJlc2V0TWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcucmVzZXRNYXRyaXgoKX0pLGoucHJpbnRNYXRyaXg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5mZmkucmVtYXBUb1B5KGoucHJvY2Vzc2luZy5wcmludE1hdHJpeCgpKX0pLGoucnVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChTay5jYW52YXMpO2lmKCFhKXRocm93IG5ldyBFcnJvcihcXFwiUHJvY2Vzc2luZyBtb2R1bGU6IENhbnZhcyBlbGVtZW50IG5vdCBzcGVjaWZpZWRcXFwiKTtpZih3aW5kb3cuUHJvY2Vzc2luZy5sb2dnZXI9e2xvZzpmdW5jdGlvbihhKXtTay5taXNjZXZhbC5wcmludF8oYSl9fSxtPXdpbmRvdy5Qcm9jZXNzaW5nLmdldEluc3RhbmNlQnlJZChTay5jYW52YXMpLG0mJm0uZXhpdCgpLGoucD1uZXcgd2luZG93LlByb2Nlc3NpbmcoYSxmdW5jdGlvbiBza2V0Y2hQcm9jKGEpe2oucHJvY2Vzc2luZz1hLGEuZHJhdz1mdW5jdGlvbigpe3ZhciBiPSExO2Zvcih2YXIgYyBpbiBrKTA9PT1rW2NdLndpZHRoJiYoYj0hMCk7aWYoITA9PWIpcmV0dXJuITA9PT1sP3ZvaWQgMDp2b2lkIGEubG9vcCgpO2lmKCExPT09bCYmYS5ub0xvb3AoKSxqLmZyYW1lQ291bnQ9YS5mcmFtZUNvdW50LFNrLmdsb2JhbHMuZHJhdyl0cnl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmdsb2JhbHMuZHJhdyl9Y2F0Y2goYSl7U2sudW5jYXVnaHRFeGNlcHRpb24oYSl9fTt2YXIgYj1bXFxcInNldHVwXFxcIixcXFwibW91c2VNb3ZlZFxcXCIsXFxcIm1vdXNlQ2xpY2tlZFxcXCIsXFxcIm1vdXNlRHJhZ2dlZFxcXCIsXFxcIm1vdXNlTW92ZWRcXFwiLFxcXCJtb3VzZU91dFxcXCIsXFxcIm1vdXNlT3ZlclxcXCIsXFxcIm1vdXNlUHJlc3NlZFxcXCIsXFxcIm1vdXNlUmVsZWFzZWRcXFwiLFxcXCJrZXlQcmVzc2VkXFxcIixcXFwia2V5UmVsZWFzZWRcXFwiLFxcXCJrZXlUeXBlZFxcXCJdO2Zvcih2YXIgYyBpbiBiKVNrLmdsb2JhbHNbYltjXV0mJihhW2JbY11dPW5ldyBGdW5jdGlvbihcXFwidHJ5IHtTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suZ2xvYmFsc1snXFxcIitiW2NdK1xcXCInXSk7fSBjYXRjaChlKSB7U2sudW5jYXVnaHRFeGNlcHRpb24oZSk7fVxcXCIpKX0pLDA9PT1qLndpZHRoLnYmJjA9PT1qLmhlaWdodC52KXt2YXIgYj1hLm9mZnNldFdpZHRoLGM9YS5vZmZzZXRIZWlnaHQ7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouc2l6ZSxbbmV3IFNrLmJ1aWx0aW4uaW50XyhiKSxuZXcgU2suYnVpbHRpbi5pbnRfKGMpLGoucmVuZGVyTW9kZV0pfX0pLGc9ZnVuY3Rpb24oYSxiKXtiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJ4XFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLm1vdXNlWCk6XFxcInlcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5tb3VzZVkpOlxcXCJweFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLnBtb3VzZVgpOlxcXCJweVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLnBtb3VzZVkpOlxcXCJwcmVzc2VkXFxcIj09PWI/bmV3IFNrLmJ1aWx0aW4uYm9vbChqLnByb2Nlc3NpbmcuX19tb3VzZVByZXNzZWQpOlxcXCJidXR0b25cXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5tb3VzZUJ1dHRvbik6dm9pZCAwfSl9LGouTW91c2U9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGcsXFxcIk1vdXNlXFxcIixbXSksai5tb3VzZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5Nb3VzZSksZj1mdW5jdGlvbihhLGIpe2IuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImtleVxcXCI9PT1iKT9uZXcgU2suYnVpbHRpbi5zdHIoai5wcm9jZXNzaW5nLmtleS50b1N0cmluZygpKTpcXFwia2V5Q29kZVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmtleUNvZGUpOlxcXCJrZXlQcmVzc2VkXFxcIj09PWI/bmV3IFNrLmJ1aWx0aW4uc3RyKGoucHJvY2Vzc2luZy5rZXlQcmVzc2VkKTp2b2lkIDB9KX0sai5LZXlib2FyZD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZixcXFwiS2V5Ym9hcmRcXFwiLFtdKSxqLmtleWJvYXJkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLktleWJvYXJkKSxlPWZ1bmN0aW9uKGEsYil7Yi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwiZnJhbWVDb3VudFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5mcmFtZUNvdW50KTpcXFwiZnJhbWVSYXRlXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcuZnJhbWVSYXRlKTpcXFwiaGVpZ2h0XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcuaGVpZ2h0KTpcXFwid2lkdGhcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy53aWR0aCk6XFxcIm9ubGluZVxcXCI9PT1iP25ldyBTay5idWlsdGluLmJvb2woai5wcm9jZXNzaW5nLm9ubGluZSk6XFxcImZvY3VzZWRcXFwiPT09Yj9uZXcgU2suYnVpbHRpbi5ib29sKGoucHJvY2Vzc2luZy5mb2N1c2VkKTp2b2lkIDB9KX0sai5FbnZpcm9ubWVudD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZSxcXFwiRW52aXJvbm1lbnRcXFwiLFtdKSxqLmVudmlyb25tZW50PVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLkVudmlyb25tZW50KSxkPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EucGl4ZWxzPW51bGx9KSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJoZWlnaHRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcuaGVpZ2h0KTpcXFwid2lkdGhcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy53aWR0aCk6KFxcXCJwaXhlbHNcXFwiPT09YiYmbnVsbD09YS5waXhlbHMmJihhLnBpeGVscz1uZXcgU2suYnVpbHRpbi5saXN0KGoucHJvY2Vzc2luZy5waXhlbHMudG9BcnJheSgpKSksYS5waXhlbHMpfSl9LGouU2NyZWVuPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixkLFxcXCJTY3JlZW5cXFwiLFtdKSxqLnNjcmVlbj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5TY3JlZW4pLGoubG9hZFBpeGVscz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLmxvYWRQaXhlbHMoKX0pLGM9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxhLnY9ai5wcm9jZXNzaW5nLmNvbG9yKGIudixjLGQsZSl9KX0sai5jb2xvcj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosYyxcXFwiY29sb3JcXFwiLFtdKSxqLnJlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5yZWQoYS52KSl9KSxqLmdyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmdyZWVuKGEudikpfSksai5ibHVlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmJsdWUoYS52KSl9KSxiPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IGoucHJvY2Vzc2luZy5QSW1hZ2U6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP25ldyBqLnByb2Nlc3NpbmcuUEltYWdlKGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBqLnByb2Nlc3NpbmcuUEltYWdlKGIudixjLnYpOm5ldyBqLnByb2Nlc3NpbmcuUEltYWdlKGIudixjLnYsZC52KX0pLGIuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYud2lkdGgpOlxcXCJoZWlnaHRcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEudi5oZWlnaHQpOnZvaWQgMH0pfSxqLmxvYWRJbWFnZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWoucHJvY2Vzc2luZy5sb2FkSW1hZ2UoYS52KTtrLnB1c2goYik7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEltYWdlKTtyZXR1cm4gYy52PWIsY30pLGouaW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcuaW1hZ2UoYS52LGIudixjLnYpOmoucHJvY2Vzc2luZy5pbWFnZShhLnYsYi52LGMudixkLnYsZS52KX0pLGouZ2V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1qLnByb2Nlc3NpbmcuZ2V0KGEudixiLnYpO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5jb2xvcixbbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucmVkKGMpKSxuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ncmVlbihjKSksbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuYmx1ZShjKSldKX0pLGouc2V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2oucHJvY2Vzc2luZy5zZXQoYS52LGIudixjLnYpfSksaD1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcjpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudixjLnYpOm5ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcihiLnYsYy52LGQudil9KSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJ4XFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoYS52LngpOlxcXCJ5XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYueSk6XFxcInpcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEudi56KTp2b2lkIDB9KSxiLmdldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBiLnY9YS52LmdldCgpLGJ9KSxiLnNldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9hLnYuc2V0KGIudixjLnYpOmEudi5zZXQoYi52LGMudixkLnYpfSksYi5tYWc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChhLnYubWFnKCkpfSksYi5hZGQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LmFkZChiLnYpLGN9KSxiLnN1Yj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGMudj1hLnYuc3ViKGIudiksY30pLGIubXVsdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGMudj1hLnYubXVsdChiLnYpLGN9KSxiLmRpdj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGMudj1hLnYuZGl2KGIudiksY30pLGIuZGlzdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4uYXNzayQoYS52LmRpc3QoYi52KSl9KSxiLmRvdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9Tay5idWlsdGluLmFzc2skKGEudi5kb3QoYi52KSk6U2suYnVpbHRpbi5hc3NrJChhLnYuZG90KGIudixjLnYsZC52KSl9KSxiLmNyb3NzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYy52PWEudi5jcm9zcyhiLnYpLGN9KSxiLm5vcm1hbGl6ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5ub3JtYWxpemUoKX0pLGIubGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5saW1pdChiLnYpfSksYi5hbmdsZUJldHdlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5idWlsdGluLmFzc2skKGEudi5hbmdsZUJldHdlZW4oYi52KSl9KSxiLmFycmF5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYS52LmFycmF5KCkpfSl9LGZvbnRDbGFzcz1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IGoucHJvY2Vzc2luZy5QRm9udDpuZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52KX0pLGIubGlzdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEudi5saXN0KCkpfSl9LGdyYXBoaWNzQ2xhc3M9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3I6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcihiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudixkLnYpfSksYi5iZWdpbkRyYXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYuYmVnaW5EcmF3KCl9KSxiLmVuZERyYXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYuZW5kRHJhdygpfSl9LHNoYXBlQ2xhc3M9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9udWxsOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgai5wcm9jZXNzaW5nLlBTaGFwZVNWRyhiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBTaGFwZVNWRyhiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBTaGFwZVNWRyhiLnYsYy52LGQudil9KSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJ3aWR0aFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGEudi53aWR0aCk6XFxcImhlaWdodFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LmhlaWdodCk6dm9pZCAwfSksYi5pc1Zpc2libGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChhLnYuaXNWaXNpYmxlKCkpfSksYi5zZXRWaXNpYmxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYuc2V0VmlzaWJsZShiLnYpfSksYi5kaXNhYmxlU3R5bGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYuZGlzYWJsZVN0eWxlKCl9KSxiLmVuYWJsZVN0eWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmVuYWJsZVN0eWxlKCl9KSxiLmdldENoaWxkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnYuZ2V0Q2hpbGQoYi52KTtpZihudWxsIT1jKXt2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QU2hhcGVTVkcpO3JldHVybiBkLnY9YyxkfXJldHVybiBudWxsfSksYi50cmFuc2xhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/YS52LnRyYW5zbGF0ZShiLnYsYy52KTphLnYudHJhbnNsYXRlKGIudixjLnYsZC52KX0pLGIucm90YXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYucm90YXRlKGIudil9KSxiLnJvdGF0ZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5yb3RhdGVYKGIudil9KSxiLnJvdGF0ZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYucm90YXRlWShhbmdsZS52KX0pLGIucm90YXRlWj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5yb3RhdGVaKGFuZ2xlLnYpfSksYi5zY2FsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9hLnYuc2NhbGUoYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/YS52LnNjYWxlKGIudixjLnYpOmEudi5zY2FsZShiLnYsYy52LGQudil9KX0sai5QRm9udD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZm9udENsYXNzLFxcXCJQRm9udFxcXCIsW10pLGouUEdyYXBoaWNzPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixncmFwaGljc0NsYXNzLFxcXCJQR3JhcGhpY3NcXFwiLFtdKSxqLlBTaGFwZVNWRz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosc2hhcGVDbGFzcyxcXFwiUFNoYXBlU1ZHXFxcIixbXSksai5QVmVjdG9yPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixoLFxcXCJQVmVjdG9yXFxcIixbXSksai5QSW1hZ2U9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGIsXFxcIlBJbWFnZVxcXCIsW10pLGp9O1wiLFwic3JjL2xpYi9wcm9maWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwcm9maWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHN0YXRzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwc3RhdHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wdHkucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInB0eSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B5X2NvbXBpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInB5X2NvbXBpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weWNsYnIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInB5Y2xiciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B5ZG9jLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweWRvYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B5ZG9jX3RvcGljcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHlkb2NfdG9waWNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvX19pbml0X18ucHlcIjpcIlwiLFwic3JjL2xpYi9weXRob25kcy9iYXNpYy9fX2luaXRfXy5weVwiOlwiXFxuI19fYWxsX18gPSBbXFxcInN0YWNrXFxcIl1cXG5cXG5cXG5mcm9tIC5zdGFjayBpbXBvcnQgU3RhY2tcXG5mcm9tIC5xdWV1ZSBpbXBvcnQgUXVldWVcXG5mcm9tIC5kZXF1ZSBpbXBvcnQgRGVxdWVcXG5cXG5cXG5cIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvZGVxdWUucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jXFxuIyBkZXF1ZS5weVxcblxcblxcbmNsYXNzIERlcXVlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzRW1wdHkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcyA9PSBbXVxcblxcbiAgICBkZWYgYWRkRnJvbnQoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgYWRkUmVhcihzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiByZW1vdmVGcm9udChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiByZW1vdmVSZWFyKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKDApXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLml0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kcy9iYXNpYy9xdWV1ZS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNVxcbiNcXG4jIHF1ZXVlLnB5XFxuXFxuXFxuY2xhc3MgUXVldWU6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaXRlbXMgPSBbXVxcblxcbiAgICBkZWYgaXNFbXB0eShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBlbnF1ZXVlKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5pbnNlcnQoMCwgaXRlbSlcXG5cXG4gICAgZGVmIGRlcXVldWUoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvc3RhY2sucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jXFxuIyBzdGFjay5weVxcblxcblxcbmNsYXNzIFN0YWNrOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzRW1wdHkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcyA9PSBbXVxcblxcbiAgICBkZWYgcHVzaChzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBwb3Aoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcGVlayhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zW2xlbihzZWxmLml0ZW1zKSAtIDFdXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLml0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kcy9ncmFwaHMvX19pbml0X18ucHlcIjpcIlxcblxcbmZyb20gLmFkakdyYXBoIGltcG9ydCBHcmFwaFxcbmZyb20gLmFkakdyYXBoIGltcG9ydCBWZXJ0ZXhcXG5mcm9tIC5wcmlvcml0eVF1ZXVlIGltcG9ydCBQcmlvcml0eVF1ZXVlXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2dyYXBocy9hZGpHcmFwaC5weVwiOlwiI1xcbiMgIGFkakdyYXBoXFxuI1xcbiMgIENyZWF0ZWQgYnkgQnJhZCBNaWxsZXIgb24gMjAwNS0wMi0yNC5cXG4jICBDb3B5cmlnaHQgKGMpIDIwMDUgQnJhZCBNaWxsZXIsIERhdmlkIFJhbnVtLCBMdXRoZXIgQ29sbGVnZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cXG4jXFxuXFxuaW1wb3J0IHN5c1xcbmltcG9ydCBvc1xcbmltcG9ydCB1bml0dGVzdFxcblxcbmNsYXNzIEdyYXBoOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLnZlcnRpY2VzID0ge31cXG4gICAgICAgIHNlbGYubnVtVmVydGljZXMgPSAwXFxuICAgICAgICBcXG4gICAgZGVmIGFkZFZlcnRleChzZWxmLGtleSk6XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gc2VsZi5udW1WZXJ0aWNlcyArIDFcXG4gICAgICAgIG5ld1ZlcnRleCA9IFZlcnRleChrZXkpXFxuICAgICAgICBzZWxmLnZlcnRpY2VzW2tleV0gPSBuZXdWZXJ0ZXhcXG4gICAgICAgIHJldHVybiBuZXdWZXJ0ZXhcXG4gICAgXFxuICAgIGRlZiBnZXRWZXJ0ZXgoc2VsZixuKTpcXG4gICAgICAgIGlmIG4gaW4gc2VsZi52ZXJ0aWNlczpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi52ZXJ0aWNlc1tuXVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsbik6XFxuICAgICAgICByZXR1cm4gbiBpbiBzZWxmLnZlcnRpY2VzXFxuICAgIFxcbiAgICBkZWYgYWRkRWRnZShzZWxmLGYsdCxjb3N0PTApOlxcbiAgICAgICAgICAgIGlmIGYgbm90IGluIHNlbGYudmVydGljZXM6XFxuICAgICAgICAgICAgICAgIG52ID0gc2VsZi5hZGRWZXJ0ZXgoZilcXG4gICAgICAgICAgICBpZiB0IG5vdCBpbiBzZWxmLnZlcnRpY2VzOlxcbiAgICAgICAgICAgICAgICBudiA9IHNlbGYuYWRkVmVydGV4KHQpXFxuICAgICAgICAgICAgc2VsZi52ZXJ0aWNlc1tmXS5hZGROZWlnaGJvcihzZWxmLnZlcnRpY2VzW3RdLGNvc3QpXFxuICAgIFxcbiAgICBkZWYgZ2V0VmVydGljZXMoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGlzdChzZWxmLnZlcnRpY2VzLmtleXMoKSlcXG4gICAgICAgIFxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gaXRlcihzZWxmLnZlcnRpY2VzLnZhbHVlcygpKVxcbiAgICAgICAgICAgICAgICBcXG5jbGFzcyBWZXJ0ZXg6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLG51bSk6XFxuICAgICAgICBzZWxmLmlkID0gbnVtXFxuICAgICAgICBzZWxmLmNvbm5lY3RlZFRvID0ge31cXG4gICAgICAgIHNlbGYuY29sb3IgPSAnd2hpdGUnXFxuICAgICAgICBzZWxmLmRpc3QgPSBzeXMubWF4c2l6ZVxcbiAgICAgICAgc2VsZi5wcmVkID0gTm9uZVxcbiAgICAgICAgc2VsZi5kaXNjID0gMFxcbiAgICAgICAgc2VsZi5maW4gPSAwXFxuXFxuICAgICMgZGVmIF9fbHRfXyhzZWxmLG8pOlxcbiAgICAjICAgICByZXR1cm4gc2VsZi5pZCA8IG8uaWRcXG4gICAgXFxuICAgIGRlZiBhZGROZWlnaGJvcihzZWxmLG5icix3ZWlnaHQ9MCk6XFxuICAgICAgICBzZWxmLmNvbm5lY3RlZFRvW25icl0gPSB3ZWlnaHRcXG4gICAgICAgIFxcbiAgICBkZWYgc2V0Q29sb3Ioc2VsZixjb2xvcik6XFxuICAgICAgICBzZWxmLmNvbG9yID0gY29sb3JcXG4gICAgICAgIFxcbiAgICBkZWYgc2V0RGlzdGFuY2Uoc2VsZixkKTpcXG4gICAgICAgIHNlbGYuZGlzdCA9IGRcXG5cXG4gICAgZGVmIHNldFByZWQoc2VsZixwKTpcXG4gICAgICAgIHNlbGYucHJlZCA9IHBcXG5cXG4gICAgZGVmIHNldERpc2NvdmVyeShzZWxmLGR0aW1lKTpcXG4gICAgICAgIHNlbGYuZGlzYyA9IGR0aW1lXFxuICAgICAgICBcXG4gICAgZGVmIHNldEZpbmlzaChzZWxmLGZ0aW1lKTpcXG4gICAgICAgIHNlbGYuZmluID0gZnRpbWVcXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0RmluaXNoKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZmluXFxuICAgICAgICBcXG4gICAgZGVmIGdldERpc2NvdmVyeShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmRpc2NcXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0UHJlZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnByZWRcXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0RGlzdGFuY2Uoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5kaXN0XFxuICAgICAgICBcXG4gICAgZGVmIGdldENvbG9yKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29sb3JcXG4gICAgXFxuICAgIGRlZiBnZXRDb25uZWN0aW9ucyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3RlZFRvLmtleXMoKVxcbiAgICAgICAgXFxuICAgIGRlZiBnZXRXZWlnaHQoc2VsZixuYnIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGVkVG9bbmJyXVxcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYuaWQpICsgXFxcIjpjb2xvciBcXFwiICsgc2VsZi5jb2xvciArIFxcXCI6ZGlzYyBcXFwiICsgc3RyKHNlbGYuZGlzYykgKyBcXFwiOmZpbiBcXFwiICsgc3RyKHNlbGYuZmluKSArIFxcXCI6ZGlzdCBcXFwiICsgc3RyKHNlbGYuZGlzdCkgKyBcXFwiOnByZWQgXFxcXG5cXFxcdFtcXFwiICsgc3RyKHNlbGYucHJlZCkrIFxcXCJdXFxcXG5cXFwiXFxuICAgIFxcbiAgICBkZWYgZ2V0SWQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pZFxcblxcbmNsYXNzIGFkakdyYXBoVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOlxcbiAgICBkZWYgc2V0VXAoc2VsZik6XFxuICAgICAgICBzZWxmLnRHcmFwaCA9IEdyYXBoKClcXG4gICAgICAgIFxcbiAgICBkZWYgdGVzdE1ha2VHcmFwaChzZWxmKTpcXG4gICAgICAgIGdGaWxlID0gb3BlbihcXFwidGVzdC5kYXRcXFwiKVxcbiAgICAgICAgZm9yIGxpbmUgaW4gZ0ZpbGU6XFxuICAgICAgICAgICAgZlZlcnRleCwgdFZlcnRleCA9IGxpbmUuc3BsaXQoJ3wnKVxcbiAgICAgICAgICAgIGZWZXJ0ZXggPSBpbnQoZlZlcnRleClcXG4gICAgICAgICAgICB0VmVydGV4ID0gaW50KHRWZXJ0ZXgpXFxuICAgICAgICAgICAgc2VsZi50R3JhcGguYWRkRWRnZShmVmVydGV4LHRWZXJ0ZXgpXFxuICAgICAgICBmb3IgaSBpbiBzZWxmLnRHcmFwaDpcXG4gICAgICAgICAgICBhZGogPSBpLmdldEFkaigpXFxuICAgICAgICAgICAgZm9yIGsgaW4gYWRqOlxcbiAgICAgICAgICAgICAgICBwcmludChpLCBrKVxcblxcbiAgICAgICAgXFxuaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzpcXG4gICAgdW5pdHRlc3QubWFpbigpXFxuICAgICAgICAgICAgICBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvZ3JhcGhzL3ByaW9yaXR5UXVldWUucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jIFxcbmltcG9ydCB1bml0dGVzdFxcblxcbiMgdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgaGVhcCB0YWtlcyBrZXkgdmFsdWUgcGFpcnMsXFxuIyB3ZSB3aWxsIGFzc3VtZSB0aGF0IHRoZSBrZXlzIGFyZSBhbGwgY29tcGFyYWJsZVxcblxcbmNsYXNzIFByaW9yaXR5UXVldWU6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaGVhcEFycmF5ID0gWygwLDApXVxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IDBcXG5cXG4gICAgZGVmIGJ1aWxkSGVhcChzZWxmLGFsaXN0KTpcXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBsZW4oYWxpc3QpXFxuICAgICAgICBzZWxmLmhlYXBBcnJheSA9IFsoMCwwKV1cXG4gICAgICAgIGZvciBpIGluIGFsaXN0OlxcbiAgICAgICAgICAgIHNlbGYuaGVhcEFycmF5LmFwcGVuZChpKVxcbiAgICAgICAgaSA9IGxlbihhbGlzdCkgLy8gMiAgICAgICAgICAgIFxcbiAgICAgICAgd2hpbGUgKGkgPiAwKTpcXG4gICAgICAgICAgICBzZWxmLnBlcmNEb3duKGkpXFxuICAgICAgICAgICAgaSA9IGkgLSAxXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgIGRlZiBwZXJjRG93bihzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgKGkgKiAyKSA8PSBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIG1jID0gc2VsZi5taW5DaGlsZChpKVxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2ldWzBdID4gc2VsZi5oZWFwQXJyYXlbbWNdWzBdOlxcbiAgICAgICAgICAgICAgICB0bXAgPSBzZWxmLmhlYXBBcnJheVtpXVxcbiAgICAgICAgICAgICAgICBzZWxmLmhlYXBBcnJheVtpXSA9IHNlbGYuaGVhcEFycmF5W21jXVxcbiAgICAgICAgICAgICAgICBzZWxmLmhlYXBBcnJheVttY10gPSB0bXBcXG4gICAgICAgICAgICBpID0gbWNcXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBtaW5DaGlsZChzZWxmLGkpOlxcbiAgICAgICAgaWYgaSoyID4gc2VsZi5jdXJyZW50U2l6ZTpcXG4gICAgICAgICAgICByZXR1cm4gLTFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgaSoyICsgMSA+IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmhlYXBBcnJheVtpKjJdWzBdIDwgc2VsZi5oZWFwQXJyYXlbaSoyKzFdWzBdOlxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkqMlxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkqMisxXFxuXFxuICAgIGRlZiBwZXJjVXAoc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIGkgLy8gMiA+IDA6XFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwQXJyYXlbaV1bMF0gPCBzZWxmLmhlYXBBcnJheVtpLy8yXVswXTpcXG4gICAgICAgICAgICAgICB0bXAgPSBzZWxmLmhlYXBBcnJheVtpLy8yXVxcbiAgICAgICAgICAgICAgIHNlbGYuaGVhcEFycmF5W2kvLzJdID0gc2VsZi5oZWFwQXJyYXlbaV1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBBcnJheVtpXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBpLy8yXFxuIFxcbiAgICBkZWYgYWRkKHNlbGYsayk6XFxuICAgICAgICBzZWxmLmhlYXBBcnJheS5hcHBlbmQoaylcXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBzZWxmLmN1cnJlbnRTaXplICsgMVxcbiAgICAgICAgc2VsZi5wZXJjVXAoc2VsZi5jdXJyZW50U2l6ZSlcXG5cXG4gICAgZGVmIGRlbE1pbihzZWxmKTpcXG4gICAgICAgIHJldHZhbCA9IHNlbGYuaGVhcEFycmF5WzFdWzFdXFxuICAgICAgICBzZWxmLmhlYXBBcnJheVsxXSA9IHNlbGYuaGVhcEFycmF5W3NlbGYuY3VycmVudFNpemVdXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSAtIDFcXG4gICAgICAgIHNlbGYuaGVhcEFycmF5LnBvcCgpXFxuICAgICAgICBzZWxmLnBlcmNEb3duKDEpXFxuICAgICAgICByZXR1cm4gcmV0dmFsXFxuICAgICAgICBcXG4gICAgZGVmIGlzRW1wdHkoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmN1cnJlbnRTaXplID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBkZWNyZWFzZUtleShzZWxmLHZhbCxhbXQpOlxcbiAgICAgICAgIyB0aGlzIGlzIGEgbGl0dGxlIHdpZXJkLCBidXQgd2UgbmVlZCB0byBmaW5kIHRoZSBoZWFwIHRoaW5nIHRvIGRlY3JlYXNlIGJ5XFxuICAgICAgICAjIGxvb2tpbmcgYXQgaXRzIHZhbHVlXFxuICAgICAgICBkb25lID0gRmFsc2VcXG4gICAgICAgIGkgPSAxXFxuICAgICAgICBteUtleSA9IDBcXG4gICAgICAgIHdoaWxlIG5vdCBkb25lIGFuZCBpIDw9IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwQXJyYXlbaV1bMV0gPT0gdmFsOlxcbiAgICAgICAgICAgICAgICBkb25lID0gVHJ1ZVxcbiAgICAgICAgICAgICAgICBteUtleSA9IGlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgIGlmIG15S2V5ID4gMDpcXG4gICAgICAgICAgICBzZWxmLmhlYXBBcnJheVtteUtleV0gPSAoYW10LHNlbGYuaGVhcEFycmF5W215S2V5XVsxXSlcXG4gICAgICAgICAgICBzZWxmLnBlcmNVcChteUtleSlcXG4gICAgICAgICAgICBcXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLHZ0eCk6XFxuICAgICAgICBmb3IgcGFpciBpbiBzZWxmLmhlYXBBcnJheTpcXG4gICAgICAgICAgICBpZiBwYWlyWzFdID09IHZ0eDpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIHJldHVybiBGYWxzZVxcbiAgICAgICAgXFxuY2xhc3MgVGVzdEJpbkhlYXAodW5pdHRlc3QuVGVzdENhc2UpOlxcbiAgICBkZWYgc2V0VXAoc2VsZik6XFxuICAgICAgICBzZWxmLnRoZUhlYXAgPSBQcmlvcml0eVF1ZXVlKClcXG4gICAgICAgIHNlbGYudGhlSGVhcC5hZGQoKDIsJ3gnKSlcXG4gICAgICAgIHNlbGYudGhlSGVhcC5hZGQoKDMsJ3knKSlcXG4gICAgICAgIHNlbGYudGhlSGVhcC5hZGQoKDUsJ3onKSlcXG4gICAgICAgIHNlbGYudGhlSGVhcC5hZGQoKDYsJ2EnKSlcXG4gICAgICAgIHNlbGYudGhlSGVhcC5hZGQoKDQsJ2QnKSlcXG5cXG5cXG4gICAgZGVmIHRlc3RJbnNlcnQoc2VsZik6XFxuICAgICAgICBhc3NlcnQgc2VsZi50aGVIZWFwLmN1cnJlbnRTaXplID09IDVcXG5cXG4gICAgZGVmIHRlc3REZWxtaW4oc2VsZik6XFxuICAgICAgICBhc3NlcnQgc2VsZi50aGVIZWFwLmRlbE1pbigpID09ICd4J1xcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5kZWxNaW4oKSA9PSAneSdcXG4gICAgXFxuICAgIGRlZiB0ZXN0RGVjS2V5KHNlbGYpOlxcbiAgICAgICAgc2VsZi50aGVIZWFwLmRlY3JlYXNlS2V5KCdkJywxKVxcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5kZWxNaW4oKSA9PSAnZCdcXG4gICAgICAgIFxcbmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6XFxuICAgIHVuaXR0ZXN0Lm1haW4oKVxcblwiLFwic3JjL2xpYi9weXRob25kcy90cmVlcy9fX2luaXRfXy5weVwiOlwiXFxuZnJvbSAuYmluYXJ5VHJlZSBpbXBvcnQgQmluYXJ5VHJlZVxcbmZyb20gLmJhbGFuY2UgaW1wb3J0IEFWTFRyZWVcXG5mcm9tIC5ic3QgaW1wb3J0IEJpbmFyeVNlYXJjaFRyZWVcXG5mcm9tIC5iaW5oZWFwIGltcG9ydCBCaW5IZWFwXFxuXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JhbGFuY2UucHlcIjpcIiMhL2Jpbi9lbnYgcHl0aG9uMy4xXFxuIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNSwgMjAxMFxcbiMgXFxuXFxuZnJvbSAuYnN0IGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlLCBUcmVlTm9kZVxcblxcbmNsYXNzIEFWTFRyZWUoQmluYXJ5U2VhcmNoVHJlZSk6XFxuICAgICcnJ1xcbiAgICBBdXRob3I6ICBCcmFkIE1pbGxlclxcbiAgICBEYXRlOiAgMS8xNS8yMDA1XFxuICAgIERlc2NyaXB0aW9uOiAgSW1sZW1lbnQgYSBiaW5hcnkgc2VhcmNoIHRyZWUgd2l0aCB0aGUgZm9sbG93aW5nIGludGVyZmFjZVxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uczogIFxcbiAgICAgICAgICAgICAgICAgIF9fY29udGFpbnNfXyh5KSA8PT0+IHkgaW4geFxcbiAgICAgICAgICAgICAgICAgIF9fZ2V0aXRlbV9fKHkpIDw9PT4geFt5XVxcbiAgICAgICAgICAgICAgICAgIF9faW5pdF9fKClcXG4gICAgICAgICAgICAgICAgICBfX2xlbl9fKCkgPD09PiBsZW4oeClcXG4gICAgICAgICAgICAgICAgICBfX3NldGl0ZW1fXyhrLHYpIDw9PT4geFtrXSA9IHZcXG4gICAgICAgICAgICAgICAgICBjbGVhcigpXFxuICAgICAgICAgICAgICAgICAgZ2V0KGspXFxuICAgICAgICAgICAgICAgICAgaGFzX2tleShrKVxcbiAgICAgICAgICAgICAgICAgIGl0ZW1zKCkgXFxuICAgICAgICAgICAgICAgICAga2V5cygpIFxcbiAgICAgICAgICAgICAgICAgIHZhbHVlcygpXFxuICAgICAgICAgICAgICAgICAgcHV0KGssdilcXG4gICAgJycnXFxuXFxuXFxuICAgIGRlZiBfcHV0KHNlbGYsa2V5LHZhbCxjdXJyZW50Tm9kZSk6XFxuICAgICAgICBpZiBrZXkgPCBjdXJyZW50Tm9kZS5rZXk6XFxuICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLGN1cnJlbnROb2RlLmxlZnRDaGlsZClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQgPSBUcmVlTm9kZShrZXksdmFsLHBhcmVudD1jdXJyZW50Tm9kZSlcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVCYWxhbmNlKGN1cnJlbnROb2RlLmxlZnRDaGlsZClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaGFzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LHZhbCxjdXJyZW50Tm9kZS5yaWdodENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQgPSBUcmVlTm9kZShrZXksdmFsLHBhcmVudD1jdXJyZW50Tm9kZSlcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVCYWxhbmNlKGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpICAgICAgICAgICAgICAgIFxcblxcbiAgICBkZWYgdXBkYXRlQmFsYW5jZShzZWxmLG5vZGUpOlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlRmFjdG9yID4gMSBvciBub2RlLmJhbGFuY2VGYWN0b3IgPCAtMTpcXG4gICAgICAgICAgICBzZWxmLnJlYmFsYW5jZShub2RlKVxcbiAgICAgICAgICAgIHJldHVyblxcbiAgICAgICAgaWYgbm9kZS5wYXJlbnQgIT0gTm9uZTpcXG4gICAgICAgICAgICBpZiBub2RlLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LmJhbGFuY2VGYWN0b3IgKz0gMVxcbiAgICAgICAgICAgIGVsaWYgbm9kZS5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQuYmFsYW5jZUZhY3RvciAtPSAxXFxuXFxuICAgICAgICAgICAgaWYgbm9kZS5wYXJlbnQuYmFsYW5jZUZhY3RvciAhPSAwOlxcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUJhbGFuY2Uobm9kZS5wYXJlbnQpXFxuXFxuICAgIGRlZiByZWJhbGFuY2Uoc2VsZixub2RlKTpcXG4gICAgICAgIGlmIG5vZGUuYmFsYW5jZUZhY3RvciA8IDA6XFxuICAgICAgICAgICAgaWYgbm9kZS5yaWdodENoaWxkLmJhbGFuY2VGYWN0b3IgPiAwOlxcbiAgICAgICAgICAgICAgICAjIERvIGFuIExSIFJvdGF0aW9uXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlUmlnaHQobm9kZS5yaWdodENoaWxkKVxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUxlZnQobm9kZSlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAjIHNpbmdsZSBsZWZ0XFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlTGVmdChub2RlKVxcbiAgICAgICAgZWxpZiBub2RlLmJhbGFuY2VGYWN0b3IgPiAwOlxcbiAgICAgICAgICAgIGlmIG5vZGUubGVmdENoaWxkLmJhbGFuY2VGYWN0b3IgPCAwOlxcbiAgICAgICAgICAgICAgICAjIERvIGFuIFJMIFJvdGF0aW9uXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlTGVmdChub2RlLmxlZnRDaGlsZClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVSaWdodChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIHJpZ2h0XFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlUmlnaHQobm9kZSlcXG5cXG4gICAgZGVmIHJvdGF0ZUxlZnQoc2VsZixyb3RSb290KTpcXG4gICAgICAgIG5ld1Jvb3QgPSByb3RSb290LnJpZ2h0Q2hpbGRcXG4gICAgICAgIHJvdFJvb3QucmlnaHRDaGlsZCA9IG5ld1Jvb3QubGVmdENoaWxkXFxuICAgICAgICBpZiBuZXdSb290LmxlZnRDaGlsZCAhPSBOb25lOlxcbiAgICAgICAgICAgIG5ld1Jvb3QubGVmdENoaWxkLnBhcmVudCA9IHJvdFJvb3RcXG4gICAgICAgIG5ld1Jvb3QucGFyZW50ID0gcm90Um9vdC5wYXJlbnRcXG4gICAgICAgIGlmIHJvdFJvb3QuaXNSb290KCk6XFxuICAgICAgICAgICAgc2VsZi5yb290ID0gbmV3Um9vdFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiByb3RSb290LmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHJvdFJvb3QucGFyZW50LmxlZnRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5yaWdodENoaWxkID0gbmV3Um9vdFxcbiAgICAgICAgbmV3Um9vdC5sZWZ0Q2hpbGQgPSByb3RSb290XFxuICAgICAgICByb3RSb290LnBhcmVudCA9IG5ld1Jvb3RcXG4gICAgICAgIHJvdFJvb3QuYmFsYW5jZUZhY3RvciA9IHJvdFJvb3QuYmFsYW5jZUZhY3RvciArIDEgLSBtaW4obmV3Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcbiAgICAgICAgbmV3Um9vdC5iYWxhbmNlRmFjdG9yID0gbmV3Um9vdC5iYWxhbmNlRmFjdG9yICsgMSArIG1heChyb3RSb290LmJhbGFuY2VGYWN0b3IsIDApXFxuXFxuXFxuICAgIGRlZiByb3RhdGVSaWdodChzZWxmLHJvdFJvb3QpOlxcbiAgICAgICAgbmV3Um9vdCA9IHJvdFJvb3QubGVmdENoaWxkXFxuICAgICAgICByb3RSb290LmxlZnRDaGlsZCA9IG5ld1Jvb3QucmlnaHRDaGlsZFxcbiAgICAgICAgaWYgbmV3Um9vdC5yaWdodENoaWxkICE9IE5vbmU6XFxuICAgICAgICAgICAgbmV3Um9vdC5yaWdodENoaWxkLnBhcmVudCA9IHJvdFJvb3RcXG4gICAgICAgIG5ld1Jvb3QucGFyZW50ID0gcm90Um9vdC5wYXJlbnRcXG4gICAgICAgIGlmIHJvdFJvb3QuaXNSb290KCk6XFxuICAgICAgICAgICAgc2VsZi5yb290ID0gbmV3Um9vdFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiByb3RSb290LmlzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5yaWdodENoaWxkID0gbmV3Um9vdFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJvdFJvb3QucGFyZW50LmxlZnRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgIG5ld1Jvb3QucmlnaHRDaGlsZCA9IHJvdFJvb3RcXG4gICAgICAgIHJvdFJvb3QucGFyZW50ID0gbmV3Um9vdFxcbiAgICAgICAgcm90Um9vdC5iYWxhbmNlRmFjdG9yID0gcm90Um9vdC5iYWxhbmNlRmFjdG9yIC0gMSAtIG1heChuZXdSb290LmJhbGFuY2VGYWN0b3IsIDApXFxuICAgICAgICBuZXdSb290LmJhbGFuY2VGYWN0b3IgPSBuZXdSb290LmJhbGFuY2VGYWN0b3IgLSAxICsgbWluKHJvdFJvb3QuYmFsYW5jZUZhY3RvciwgMClcXG4gICAgICAgIFxcblwiLFwic3JjL2xpYi9weXRob25kcy90cmVlcy9iaW5hcnlUcmVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuIyBcXG5cXG5jbGFzcyBCaW5hcnlUcmVlOlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgQSByZWN1cnNpdmUgaW1wbGVtZW50YXRpb24gb2YgQmluYXJ5IFRyZWVcXG4gICAgVXNpbmcgbGlua3MgYW5kIE5vZGVzIGFwcHJvYWNoLlxcbiAgICBcXFwiXFxcIlxcXCIgICAgXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLHJvb3RPYmopOlxcbiAgICAgICAgc2VsZi5rZXkgPSByb290T2JqXFxuICAgICAgICBzZWxmLmxlZnRDaGlsZCA9IE5vbmVcXG4gICAgICAgIHNlbGYucmlnaHRDaGlsZCA9IE5vbmVcXG5cXG4gICAgZGVmIGluc2VydExlZnQoc2VsZixuZXdOb2RlKTpcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkID09IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBCaW5hcnlUcmVlKG5ld05vZGUpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHQgPSBCaW5hcnlUcmVlKG5ld05vZGUpXFxuICAgICAgICAgICAgdC5sZWZ0ID0gc2VsZi5sZWZ0Q2hpbGRcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZCA9IHRcXG4gICAgXFxuICAgIGRlZiBpbnNlcnRSaWdodChzZWxmLG5ld05vZGUpOlxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkID09IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICB0ID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgICAgIHQucmlnaHQgPSBzZWxmLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQgPSB0XFxuXFxuICAgIGRlZiBpc0xlYWYoc2VsZik6XFxuICAgICAgICByZXR1cm4gKChub3Qgc2VsZi5sZWZ0Q2hpbGQpIGFuZCAobm90IHNlbGYucmlnaHRDaGlsZCkpXFxuXFxuICAgIGRlZiBnZXRSaWdodENoaWxkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucmlnaHRDaGlsZFxcblxcbiAgICBkZWYgZ2V0TGVmdENoaWxkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubGVmdENoaWxkXFxuXFxuICAgIGRlZiBzZXRSb290VmFsKHNlbGYsb2JqKTpcXG4gICAgICAgIHNlbGYua2V5ID0gb2JqXFxuXFxuICAgIGRlZiBnZXRSb290VmFsKHNlbGYsKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmtleVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLmlub3JkZXIoKVxcbiAgICAgICAgcHJpbnQoc2VsZi5rZXkpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLmlub3JkZXIoKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQucG9zdG9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQucG9zdG9yZGVyKClcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcblxcblxcbiAgICBkZWYgcHJlb3JkZXIoc2VsZik6XFxuICAgICAgICBwcmludChzZWxmLmtleSlcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnByZW9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQucHJlb3JkZXIoKVxcblxcbiAgICBkZWYgcHJpbnRleHAoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBwcmludCgnKCcpXFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQucHJpbnRleHAoKVxcbiAgICAgICAgcHJpbnQoc2VsZi5rZXkpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnByaW50ZXhwKClcXG4gICAgICAgICAgICBwcmludCgnKScpXFxuXFxuICAgIGRlZiBwb3N0b3JkZXJldmFsKHNlbGYpOlxcbiAgICAgICAgb3BlcnMgPSB7JysnOm9wZXJhdG9yLmFkZCwgJy0nOm9wZXJhdG9yLnN1YiwgJyonOm9wZXJhdG9yLm11bCwgJy8nOm9wZXJhdG9yLnRydWVkaXZ9XFxuICAgICAgICByZXMxID0gTm9uZVxcbiAgICAgICAgcmVzMiA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgIHJlczEgPSBzZWxmLmxlZnRDaGlsZC5wb3N0b3JkZXJldmFsKCkgICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHJlczIgPSBzZWxmLnJpZ2h0Q2hpbGQucG9zdG9yZGVyZXZhbCgpICMvLyBcXFxcbGFiZWx7cGVyaWdodH1cXG4gICAgICAgIGlmIHJlczEgYW5kIHJlczI6XFxuICAgICAgICAgICAgcmV0dXJuIG9wZXJzW3NlbGYua2V5XShyZXMxLHJlczIpICMvLyBcXFxcbGFiZWx7cGVldmFsfVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5rZXlcXG5cXG5kZWYgaW5vcmRlcih0cmVlKTpcXG4gICAgaWYgdHJlZSAhPSBOb25lOlxcbiAgICAgICAgaW5vcmRlcih0cmVlLmdldExlZnRDaGlsZCgpKVxcbiAgICAgICAgcHJpbnQodHJlZS5nZXRSb290VmFsKCkpXFxuICAgICAgICBpbm9yZGVyKHRyZWUuZ2V0UmlnaHRDaGlsZCgpKVxcblxcbmRlZiBwcmludGV4cCh0cmVlKTpcXG4gICAgaWYgdHJlZS5sZWZ0Q2hpbGQ6XFxuICAgICAgICBwcmludCgnKCcpXFxuICAgICAgICBwcmludGV4cCh0cmVlLmdldExlZnRDaGlsZCgpKVxcbiAgICBwcmludCh0cmVlLmdldFJvb3RWYWwoKSlcXG4gICAgaWYgdHJlZS5yaWdodENoaWxkOlxcbiAgICAgICAgcHJpbnRleHAodHJlZS5nZXRSaWdodENoaWxkKCkpXFxuICAgICAgICBwcmludCgnKScpIFxcblxcbmRlZiBwcmludGV4cCh0cmVlKTpcXG4gICAgc1ZhbCA9IFxcXCJcXFwiXFxuICAgIGlmIHRyZWU6XFxuICAgICAgICBzVmFsID0gJygnICsgcHJpbnRleHAodHJlZS5nZXRMZWZ0Q2hpbGQoKSlcXG4gICAgICAgIHNWYWwgPSBzVmFsICsgc3RyKHRyZWUuZ2V0Um9vdFZhbCgpKVxcbiAgICAgICAgc1ZhbCA9IHNWYWwgKyBwcmludGV4cCh0cmVlLmdldFJpZ2h0Q2hpbGQoKSkgKyAnKSdcXG4gICAgcmV0dXJuIHNWYWxcXG5cXG5kZWYgcG9zdG9yZGVyZXZhbCh0cmVlKTpcXG4gICAgb3BlcnMgPSB7JysnOm9wZXJhdG9yLmFkZCwgJy0nOm9wZXJhdG9yLnN1YiwgJyonOm9wZXJhdG9yLm11bCwgJy8nOm9wZXJhdG9yLnRydWVkaXZ9XFxuICAgIHJlczEgPSBOb25lXFxuICAgIHJlczIgPSBOb25lXFxuICAgIGlmIHRyZWU6XFxuICAgICAgICByZXMxID0gcG9zdG9yZGVyZXZhbCh0cmVlLmdldExlZnRDaGlsZCgpKSAgIy8vIFxcXFxsYWJlbHtwZWxlZnR9XFxuICAgICAgICByZXMyID0gcG9zdG9yZGVyZXZhbCh0cmVlLmdldFJpZ2h0Q2hpbGQoKSkgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcnNbdHJlZS5nZXRSb290VmFsKCldKHJlczEscmVzMikgIy8vIFxcXFxsYWJlbHtwZWV2YWx9XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiB0cmVlLmdldFJvb3RWYWwoKVxcblxcbmRlZiBoZWlnaHQodHJlZSk6XFxuICAgIGlmIHRyZWUgPT0gTm9uZTpcXG4gICAgICAgIHJldHVybiAtMVxcbiAgICBlbHNlOlxcbiAgICAgICAgcmV0dXJuIDEgKyBtYXgoaGVpZ2h0KHRyZWUubGVmdENoaWxkKSxoZWlnaHQodHJlZS5yaWdodENoaWxkKSlcXG5cXG4jIHQgPSBCaW5hcnlUcmVlKDcpXFxuIyB0Lmluc2VydExlZnQoMylcXG4jIHQuaW5zZXJ0UmlnaHQoOSlcXG4jIGlub3JkZXIodClcXG4jIGltcG9ydCBvcGVyYXRvclxcbiMgeCA9IEJpbmFyeVRyZWUoJyonKVxcbiMgeC5pbnNlcnRMZWZ0KCcrJylcXG4jIGwgPSB4LmdldExlZnRDaGlsZCgpXFxuIyBsLmluc2VydExlZnQoNClcXG4jIGwuaW5zZXJ0UmlnaHQoNSlcXG4jIHguaW5zZXJ0UmlnaHQoNylcXG4jIHByaW50KHByaW50ZXhwKHgpKVxcbiMgcHJpbnQocG9zdG9yZGVyZXZhbCh4KSlcXG4jIHByaW50KGhlaWdodCh4KSlcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvYmluaGVhcC5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNVxcbiMgXFxuXFxuIyB0aGlzIGhlYXAgdGFrZXMga2V5IHZhbHVlIHBhaXJzLCB3ZSB3aWxsIGFzc3VtZSB0aGF0IHRoZSBrZXlzIGFyZSBpbnRlZ2Vyc1xcbmNsYXNzIEJpbkhlYXA6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaGVhcExpc3QgPSBbMF1cXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSAwXFxuXFxuXFxuICAgIGRlZiBidWlsZEhlYXAoc2VsZixhbGlzdCk6XFxuICAgICAgICBpID0gbGVuKGFsaXN0KSAvLyAyXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gbGVuKGFsaXN0KVxcbiAgICAgICAgc2VsZi5oZWFwTGlzdCA9IFswXSArIGFsaXN0WzpdXFxuICAgICAgICBwcmludChsZW4oc2VsZi5oZWFwTGlzdCksIGkpXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHByaW50KHNlbGYuaGVhcExpc3QsIGkpXFxuICAgICAgICAgICAgc2VsZi5wZXJjRG93bihpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgcHJpbnQoc2VsZi5oZWFwTGlzdCxpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgcGVyY0Rvd24oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi5jdXJyZW50U2l6ZTpcXG4gICAgICAgICAgICBtYyA9IHNlbGYubWluQ2hpbGQoaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBMaXN0W2ldID4gc2VsZi5oZWFwTGlzdFttY106XFxuICAgICAgICAgICAgICAgIHRtcCA9IHNlbGYuaGVhcExpc3RbaV1cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwTGlzdFtpXSA9IHNlbGYuaGVhcExpc3RbbWNdXFxuICAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbbWNdID0gdG1wXFxuICAgICAgICAgICAgaSA9IG1jXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgbWluQ2hpbGQoc2VsZixpKTpcXG4gICAgICAgIGlmIGkgKiAyICsgMSA+IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcExpc3RbaSAqIDJdIDwgc2VsZi5oZWFwTGlzdFtpICogMiArIDFdOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDIgKyAxXFxuXFxuICAgIGRlZiBwZXJjVXAoc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIGkgLy8gMiA+IDA6XFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwTGlzdFtpXSA8IHNlbGYuaGVhcExpc3RbaS8vMl06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwTGlzdFtpIC8vIDJdXFxuICAgICAgICAgICAgICAgc2VsZi5oZWFwTGlzdFtpIC8vIDJdID0gc2VsZi5oZWFwTGlzdFtpXVxcbiAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbaV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaSAvLyAyXFxuIFxcbiAgICBkZWYgaW5zZXJ0KHNlbGYsayk6XFxuICAgICAgICBzZWxmLmhlYXBMaXN0LmFwcGVuZChrKVxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IHNlbGYuY3VycmVudFNpemUgKyAxXFxuICAgICAgICBzZWxmLnBlcmNVcChzZWxmLmN1cnJlbnRTaXplKVxcblxcbiAgICBkZWYgZGVsTWluKHNlbGYpOlxcbiAgICAgICAgcmV0dmFsID0gc2VsZi5oZWFwTGlzdFsxXVxcbiAgICAgICAgc2VsZi5oZWFwTGlzdFsxXSA9IHNlbGYuaGVhcExpc3Rbc2VsZi5jdXJyZW50U2l6ZV1cXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBzZWxmLmN1cnJlbnRTaXplIC0gMVxcbiAgICAgICAgc2VsZi5oZWFwTGlzdC5wb3AoKVxcbiAgICAgICAgc2VsZi5wZXJjRG93bigxKVxcbiAgICAgICAgcmV0dXJuIHJldHZhbFxcbiAgICAgICAgXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgaWYgY3VycmVudFNpemUgPT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvYnN0LnB5XCI6XCIjIS9iaW4vZW52IHB5dGhvbjMuMVxcbiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG4jIFxcblxcbmNsYXNzIEJpbmFyeVNlYXJjaFRyZWU6XFxuICAgICcnJ1xcbiAgICBBdXRob3I6ICBCcmFkIE1pbGxlclxcbiAgICBEYXRlOiAgMS8xNS8yMDA1XFxuICAgIERlc2NyaXB0aW9uOiAgSW1sZW1lbnQgYSBiaW5hcnkgc2VhcmNoIHRyZWUgd2l0aCB0aGUgZm9sbG93aW5nIGludGVyZmFjZVxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uczogIFxcbiAgICAgICAgICAgICAgICAgIF9fY29udGFpbnNfXyh5KSA8PT0+IHkgaW4geFxcbiAgICAgICAgICAgICAgICAgIF9fZ2V0aXRlbV9fKHkpIDw9PT4geFt5XVxcbiAgICAgICAgICAgICAgICAgIF9faW5pdF9fKClcXG4gICAgICAgICAgICAgICAgICBfX2xlbl9fKCkgPD09PiBsZW4oeClcXG4gICAgICAgICAgICAgICAgICBfX3NldGl0ZW1fXyhrLHYpIDw9PT4geFtrXSA9IHZcXG4gICAgICAgICAgICAgICAgICBjbGVhcigpXFxuICAgICAgICAgICAgICAgICAgZ2V0KGspXFxuICAgICAgICAgICAgICAgICAgaXRlbXMoKSBcXG4gICAgICAgICAgICAgICAgICBrZXlzKCkgXFxuICAgICAgICAgICAgICAgICAgdmFsdWVzKClcXG4gICAgICAgICAgICAgICAgICBwdXQoayx2KVxcbiAgICAgICAgICAgICAgICAgIGluXFxuICAgICAgICAgICAgICAgICAgZGVsIDw9PT4gXFxuICAgICcnJ1xcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLnJvb3QgPSBOb25lXFxuICAgICAgICBzZWxmLnNpemUgPSAwXFxuICAgIFxcbiAgICBkZWYgcHV0KHNlbGYsa2V5LHZhbCk6XFxuICAgICAgICBpZiBzZWxmLnJvb3Q6XFxuICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsc2VsZi5yb290KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLnJvb3QgPSBUcmVlTm9kZShrZXksdmFsKVxcbiAgICAgICAgc2VsZi5zaXplID0gc2VsZi5zaXplICsgMVxcblxcbiAgICBkZWYgX3B1dChzZWxmLGtleSx2YWwsY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudE5vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LHZhbCxjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICAgICAgXFxuICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLGssdik6XFxuICAgICAgICBzZWxmLnB1dChrLHYpXFxuXFxuICAgIGRlZiBnZXQoc2VsZixrZXkpOlxcbiAgICAgICAgaWYgc2VsZi5yb290OlxcbiAgICAgICAgICAgIHJlcyA9IHNlbGYuX2dldChrZXksc2VsZi5yb290KVxcbiAgICAgICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5wYXlsb2FkXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIFxcbiAgICBkZWYgX2dldChzZWxmLGtleSxjdXJyZW50Tm9kZSk6XFxuICAgICAgICBpZiBub3QgY3VycmVudE5vZGU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIGVsaWYgY3VycmVudE5vZGUua2V5ID09IGtleTpcXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudE5vZGVcXG4gICAgICAgIGVsaWYga2V5IDwgY3VycmVudE5vZGUua2V5OlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LGN1cnJlbnROb2RlLmxlZnRDaGlsZClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldChrZXksY3VycmVudE5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICBcXG4gICAgICAgIFxcbiAgICBkZWYgX19nZXRpdGVtX18oc2VsZixrZXkpOlxcbiAgICAgICAgcmVzID0gc2VsZi5nZXQoa2V5KVxcbiAgICAgICAgaWYgcmVzOlxcbiAgICAgICAgICAgIHJldHVybiByZXNcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBrZXkgbm90IGluIHRyZWUnKVxcbiAgICAgICAgICAgIFxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsa2V5KTpcXG4gICAgICAgIGlmIHNlbGYuX2dldChrZXksc2VsZi5yb290KTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG4gICAgICAgIFxcbiAgICBkZWYgbGVuZ3RoKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuc2l6ZVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnNpemVcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucm9vdC5fX2l0ZXJfXygpXFxuICAgIFxcbiAgICBkZWYgZGVsZXRlKHNlbGYsa2V5KTpcXG4gICAgICAgIGlmIHNlbGYuc2l6ZSA+IDE6XFxuICAgICAgICAgICAgbm9kZVRvUmVtb3ZlID0gc2VsZi5fZ2V0KGtleSxzZWxmLnJvb3QpXFxuICAgICAgICAgICAgaWYgbm9kZVRvUmVtb3ZlOlxcbiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZShub2RlVG9SZW1vdmUpXFxuICAgICAgICAgICAgICAgIHNlbGYuc2l6ZSA9IHNlbGYuc2l6ZS0xXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBrZXkgbm90IGluIHRyZWUnKVxcbiAgICAgICAgZWxpZiBzZWxmLnNpemUgPT0gMSBhbmQgc2VsZi5yb290LmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgc2VsZi5yb290ID0gTm9uZVxcbiAgICAgICAgICAgIHNlbGYuc2l6ZSA9IHNlbGYuc2l6ZSAtIDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBrZXkgbm90IGluIHRyZWUnKVxcblxcbiAgICBkZWYgX19kZWxpdGVtX18oc2VsZixrZXkpOlxcbiAgICAgICAgc2VsZi5kZWxldGUoa2V5KVxcbiAgICBcXG4gICAgZGVmIHJlbW92ZShzZWxmLGN1cnJlbnROb2RlKTpcXG4gICAgICAgIGlmIGN1cnJlbnROb2RlLmlzTGVhZigpOiAjbGVhZlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlID09IGN1cnJlbnROb2RlLnBhcmVudC5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5sZWZ0Q2hpbGQgPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LnJpZ2h0Q2hpbGQgPSBOb25lXFxuICAgICAgICBlbGlmIGN1cnJlbnROb2RlLmhhc0JvdGhDaGlsZHJlbigpOiAjaW50ZXJpb3JcXG4gICAgICAgICAgICBzdWNjID0gY3VycmVudE5vZGUuZmluZFN1Y2Nlc3NvcigpXFxuICAgICAgICAgICAgc3VjYy5zcGxpY2VPdXQoKVxcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLmtleSA9IHN1Y2Mua2V5XFxuICAgICAgICAgICAgY3VycmVudE5vZGUucGF5bG9hZCA9IHN1Y2MucGF5bG9hZFxcbiAgICAgICAgZWxzZTogIyB0aGlzIG5vZGUgaGFzIG9uZSBjaGlsZFxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkLnBhcmVudCA9IGN1cnJlbnROb2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LmxlZnRDaGlsZCA9IGN1cnJlbnROb2RlLmxlZnRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnROb2RlLmlzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkLnBhcmVudCA9IGN1cnJlbnROb2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LnJpZ2h0Q2hpbGQgPSBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJlcGxhY2VOb2RlRGF0YShjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQua2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5wYXlsb2FkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5sZWZ0Q2hpbGQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQucGFyZW50ID0gY3VycmVudE5vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkID0gY3VycmVudE5vZGUucmlnaHRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnROb2RlLmlzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5yaWdodENoaWxkID0gY3VycmVudE5vZGUucmlnaHRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmVwbGFjZU5vZGVEYXRhKGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQua2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQucGF5bG9hZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLmxlZnRDaGlsZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnJpZ2h0Q2hpbGQpXFxuXFxuICAgIGRlZiBpbm9yZGVyKHNlbGYpOlxcbiAgICAgICAgc2VsZi5faW5vcmRlcihzZWxmLnJvb3QpXFxuXFxuICAgIGRlZiBfaW5vcmRlcihzZWxmLHRyZWUpOlxcbiAgICAgICAgaWYgdHJlZSAhPSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgcHJpbnQodHJlZS5rZXkpXFxuICAgICAgICAgICAgc2VsZi5faW5vcmRlcih0cmVlLnJpZ2h0Q2hpbGQpXFxuXFxuICAgIGRlZiBwb3N0b3JkZXIoc2VsZik6XFxuICAgICAgICBzZWxmLl9wb3N0b3JkZXIoc2VsZi5yb290KVxcblxcbiAgICBkZWYgX3Bvc3RvcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIGlmIHRyZWU6XFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZXIodHJlZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgcHJpbnQodHJlZS5rZXkpICAgICAgICAgICAgXFxuXFxuICAgIGRlZiBwcmVvcmRlcihzZWxmKTpcXG4gICAgICAgIHNlbGYuX3ByZW9yZGVyKHNlbGYsc2VsZi5yb290KVxcblxcbiAgICBkZWYgX3ByZW9yZGVyKHNlbGYsdHJlZSk6XFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5KSAgICAgICAgICAgIFxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVyKHRyZWUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVyKHRyZWUucmlnaHRDaGlsZClcXG5cXG4gICAgICAgICAgICAgICAgXFxuY2xhc3MgVHJlZU5vZGU6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLGtleSx2YWwsbGVmdD1Ob25lLHJpZ2h0PU5vbmUscGFyZW50PU5vbmUpOlxcbiAgICAgICAgc2VsZi5rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYucGF5bG9hZCA9IHZhbFxcbiAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBsZWZ0XFxuICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQgPSByaWdodFxcbiAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnRcXG4gICAgICAgIHNlbGYuYmFsYW5jZUZhY3RvciA9IDBcXG4gICAgICAgIFxcbiAgICBkZWYgaGFzTGVmdENoaWxkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubGVmdENoaWxkXFxuXFxuICAgIGRlZiBoYXNSaWdodENoaWxkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucmlnaHRDaGlsZFxcbiAgICBcXG4gICAgZGVmIGlzTGVmdENoaWxkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50IGFuZCBzZWxmLnBhcmVudC5sZWZ0Q2hpbGQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNSaWdodENoaWxkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50IGFuZCBzZWxmLnBhcmVudC5yaWdodENoaWxkID09IHNlbGZcXG5cXG4gICAgZGVmIGlzUm9vdChzZWxmKTpcXG4gICAgICAgIHJldHVybiBub3Qgc2VsZi5wYXJlbnRcXG5cXG4gICAgZGVmIGlzTGVhZihzZWxmKTpcXG4gICAgICAgIHJldHVybiBub3QgKHNlbGYucmlnaHRDaGlsZCBvciBzZWxmLmxlZnRDaGlsZClcXG5cXG4gICAgZGVmIGhhc0FueUNoaWxkcmVuKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucmlnaHRDaGlsZCBvciBzZWxmLmxlZnRDaGlsZFxcblxcbiAgICBkZWYgaGFzQm90aENoaWxkcmVuKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucmlnaHRDaGlsZCBhbmQgc2VsZi5sZWZ0Q2hpbGRcXG4gICAgXFxuICAgIGRlZiByZXBsYWNlTm9kZURhdGEoc2VsZixrZXksdmFsdWUsbGMscmMpOlxcbiAgICAgICAgc2VsZi5rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYucGF5bG9hZCA9IHZhbHVlXFxuICAgICAgICBzZWxmLmxlZnRDaGlsZCA9IGxjXFxuICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQgPSByY1xcbiAgICAgICAgaWYgc2VsZi5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5wYXJlbnQgPSBzZWxmXFxuICAgICAgICBpZiBzZWxmLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQucGFyZW50ID0gc2VsZlxcbiAgICAgICAgXFxuICAgIGRlZiBmaW5kU3VjY2Vzc29yKHNlbGYpOlxcbiAgICAgICAgc3VjYyA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYuaGFzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgIHN1Y2MgPSBzZWxmLnJpZ2h0Q2hpbGQuZmluZE1pbigpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYucGFyZW50OlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBzdWNjID0gc2VsZi5wYXJlbnRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJpZ2h0Q2hpbGQgPSBOb25lXFxuICAgICAgICAgICAgICAgICAgICBzdWNjID0gc2VsZi5wYXJlbnQuZmluZFN1Y2Nlc3NvcigpXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gc2VsZlxcbiAgICAgICAgcmV0dXJuIHN1Y2NcXG5cXG5cXG4gICAgZGVmIHNwbGljZU91dChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuaXNMZWFmKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5sZWZ0Q2hpbGQgPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IE5vbmVcXG4gICAgICAgIGVsaWYgc2VsZi5oYXNBbnlDaGlsZHJlbigpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LmxlZnRDaGlsZCA9IHNlbGYubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gc2VsZi5sZWZ0Q2hpbGRcXG4gICAgICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQucGFyZW50ID0gc2VsZi5wYXJlbnRcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5sZWZ0Q2hpbGQgPSBzZWxmLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJpZ2h0Q2hpbGQgPSBzZWxmLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnBhcmVudCA9IHNlbGYucGFyZW50XFxuXFxuICAgIGRlZiBmaW5kTWluKHNlbGYpOlxcbiAgICAgICAgY3VycmVudCA9IHNlbGZcXG4gICAgICAgIHdoaWxlIGN1cnJlbnQuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubGVmdENoaWxkXFxuICAgICAgICByZXR1cm4gY3VycmVudFxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUaGUgc3RhbmRhcmQgaW5vcmRlciB0cmF2ZXJzYWwgb2YgYSBiaW5hcnkgdHJlZS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGY6XFxuICAgICAgICAgICAgaWYgc2VsZi5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtXFxuICAgICAgICAgICAgeWllbGQgc2VsZi5rZXlcXG4gICAgICAgICAgICBpZiBzZWxmLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcblxcbiAgICAgICAgICAgIFxcblwiLFwic3JjL2xpYi9weXRob25kczMvX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMgaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcblxcbmZyb20gcHl0aG9uZHMzLmJhc2ljIGltcG9ydCBTdGFjaywgUXVldWUsIERlcXVlXFxuZnJvbSBweXRob25kczMuZ3JhcGhzIGltcG9ydCBHcmFwaCwgVmVydGV4XFxuZnJvbSBweXRob25kczMuc2VhcmNoaW5nIGltcG9ydCBIYXNoVGFibGVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcyBpbXBvcnQgKFxcbiAgICBCaW5hcnlUcmVlLFxcbiAgICBBVkxUcmVlLFxcbiAgICBCaW5hcnlTZWFyY2hUcmVlLFxcbiAgICBCaW5hcnlIZWFwLFxcbiAgICBQcmlvcml0eVF1ZXVlLFxcbilcXG5cXG5fX2FsbF9fID0gW1xcbiAgICBcXFwiU3RhY2tcXFwiLFxcbiAgICBcXFwiUXVldWVcXFwiLFxcbiAgICBcXFwiRGVxdWVcXFwiLFxcbiAgICBcXFwiR3JhcGhcXFwiLFxcbiAgICBcXFwiVmVydGV4XFxcIixcXG4gICAgXFxcIkhhc2hUYWJsZVxcXCIsXFxuICAgIFxcXCJCaW5hcnlUcmVlXFxcIixcXG4gICAgXFxcIkFWTFRyZWVcXFwiLFxcbiAgICBcXFwiQmluYXJ5U2VhcmNoVHJlZVxcXCIsXFxuICAgIFxcXCJCaW5hcnlIZWFwXFxcIixcXG4gICAgXFxcIkJpbmFyeVRyZWVcXFwiLFxcbiAgICBcXFwiUHJpb3JpdHlRdWV1ZVxcXCIsXFxuXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuYmFzaWMgaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLmJhc2ljLnN0YWNrIGltcG9ydCBTdGFja1xcbmZyb20gcHl0aG9uZHMzLmJhc2ljLnF1ZXVlIGltcG9ydCBRdWV1ZVxcbmZyb20gcHl0aG9uZHMzLmJhc2ljLmRlcXVlIGltcG9ydCBEZXF1ZVxcbmZyb20gcHl0aG9uZHMzLmJhc2ljLmxpbmtlZF9saXN0IGltcG9ydCBPcmRlcmVkTGlzdFxcbmZyb20gcHl0aG9uZHMzLmJhc2ljLmxpbmtlZF9saXN0IGltcG9ydCBVbm9yZGVyZWRMaXN0XFxuXFxuX19hbGxfXyA9IFtcXFwiU3RhY2tcXFwiLCBcXFwiUXVldWVcXFwiLCBcXFwiRGVxdWVcXFwiLCBcXFwiT3JkZXJlZExpc3RcXFwiLCBcXFwiVW5vcmRlcmVkTGlzdFxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9iYXNpYy9kZXF1ZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBEZXF1ZTpcXG4gICAgXFxcIlxcXCJcXFwiUXVldWUgaW1wbGVtZW50YXRpb24gYXMgYSBsaXN0XFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgZGVxdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIGRlcXVlIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faXRlbXMpXFxuXFxuICAgIGRlZiBhZGRfZnJvbnQoc2VsZiwgaXRlbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYW4gaXRlbSB0byB0aGUgZnJvbnQgb2YgdGhlIGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGFkZF9yZWFyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHJlYXIgb2YgdGhlIGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcy5pbnNlcnQoMCwgaXRlbSlcXG5cXG4gICAgZGVmIHJlbW92ZV9mcm9udChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIGZyb250IG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiByZW1vdmVfcmVhcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIHJlYXIgb2YgdGhlIGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faXRlbXMucG9wKDApXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2l0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvbGlua2VkX2xpc3QucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgTGlua2VkTGlzdE5vZGU6XFxuICAgIFxcXCJcXFwiXFxcIkEgbm9kZSBvZiBhIGxpbmtlZCBsaXN0XFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlX2RhdGEpOlxcbiAgICAgICAgc2VsZi5fZGF0YSA9IG5vZGVfZGF0YVxcbiAgICAgICAgc2VsZi5fbmV4dCA9IE5vbmVcXG5cXG4gICAgZGVmIGdldF9kYXRhKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IG5vZGUgZGF0YVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGFcXG5cXG4gICAgZGVmIHNldF9kYXRhKHNlbGYsIG5vZGVfZGF0YSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgbm9kZSBkYXRhXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9kYXRhID0gbm9kZV9kYXRhXFxuXFxuICAgIGRhdGEgPSBwcm9wZXJ0eShnZXRfZGF0YSwgc2V0X2RhdGEpXFxuXFxuICAgIGRlZiBnZXRfbmV4dChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBuZXh0IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9uZXh0XFxuXFxuICAgIGRlZiBzZXRfbmV4dChzZWxmLCBub2RlX25leHQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5leHQgbm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fbmV4dCA9IG5vZGVfbmV4dFxcblxcbiAgICBuZXh0ID0gcHJvcGVydHkoZ2V0X25leHQsIHNldF9uZXh0KVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlN0cmluZ1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLl9kYXRhKVxcblxcblxcbmNsYXNzIExpbmtlZExpc3Q6XFxuICAgIFxcXCJcXFwiXFxcIkxpbmtlZCBMaXN0IGNsYXNzIGltcGxlbWVudGF0aW9uXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhIGxpbmtlZCBsaXN0XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9oZWFkID0gTm9uZVxcbiAgICAgICAgc2VsZi5fY291bnQgPSAwXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIklzIHRoZSBsaXN0IGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faGVhZCBpcyBOb25lXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2l6ZSBvZiB0aGUgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NvdW50XFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2l6ZSBvZiB0aGUgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NvdW50XFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTGlzdCBhcyBhIHN0cmluZ1xcXCJcXFwiXFxcIlxcbiAgICAgICAgbGlzdF9zdHIgPSBcXFwiW1xcXCJcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmLl9oZWFkXFxuXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIGxpc3Rfc3RyICs9IHN0cihjdXJyZW50KVxcbiAgICAgICAgICAgIGlmIGN1cnJlbnQubmV4dDpcXG4gICAgICAgICAgICAgICAgbGlzdF9zdHIgKz0gXFxcIiwgXFxcIlxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcXG4gICAgICAgIGxpc3Rfc3RyICs9IFxcXCJdXFxcIlxcbiAgICAgICAgcmV0dXJuIGxpc3Rfc3RyXFxuXFxuICAgIGRlZiBhZGQoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhc3NcXG5cXG4gICAgZGVmIHJlbW92ZShzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcGFzc1xcblxcbiAgICBkZWYgc2VhcmNoKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNlYXJjaCBmb3IgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcGFzc1xcblxcblxcbmNsYXNzIFVub3JkZXJlZExpc3QoTGlua2VkTGlzdCk6XFxuICAgIFxcXCJcXFwiXFxcIlVub3JkZXJlZCBsaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYW4gdW5vcmRlcmVkIGxpbmtlZCBsaXN0XFxcIlxcXCJcXFwiXFxuICAgICAgICBMaW5rZWRMaXN0Ll9faW5pdF9fKHNlbGYpXFxuXFxuICAgIGRlZiBhZGQoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19ub2RlID0gTGlua2VkTGlzdE5vZGUodmFsdWUpXFxuICAgICAgICBuZXdfbm9kZS5zZXRfbmV4dChzZWxmLl9oZWFkKVxcbiAgICAgICAgc2VsZi5faGVhZCA9IG5ld19ub2RlXFxuICAgICAgICBzZWxmLl9jb3VudCA9IHNlbGYuX2NvdW50ICsgMVxcblxcbiAgICBkZWYgcmVtb3ZlKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhIG5vZGUgd2l0aCBhIHNwZWNpZmljIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZi5faGVhZFxcbiAgICAgICAgcHJldiA9IE5vbmVcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQ6XFxuICAgICAgICAgICAgaWYgY3VycmVudC5kYXRhID09IHZhbHVlOlxcbiAgICAgICAgICAgICAgICBpZiBwcmV2IGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFkID0gY3VycmVudC5uZXh0XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBjdXJyZW50Lm5leHRcXG4gICAgICAgICAgICAgICAgc2VsZi5fY291bnQgPSBzZWxmLl9jb3VudCAtIDFcXG4gICAgICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICAgICAgcHJldiA9IGN1cnJlbnRcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJ7fSBpcyBub3QgaW4gdGhlIGxpc3RcXFwiLmZvcm1hdCh2YWx1ZSkpXFxuXFxuICAgIGRlZiBzZWFyY2goc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2VhcmNoIGZvciBhIG5vZGUgd2l0aCBhIHNwZWNpZmljIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZi5faGVhZFxcblxcbiAgICAgICAgd2hpbGUgY3VycmVudDpcXG4gICAgICAgICAgICBpZiBjdXJyZW50LmRhdGEgPT0gdmFsdWU6XFxuICAgICAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuXFxuY2xhc3MgT3JkZXJlZExpc3QoTGlua2VkTGlzdCk6XFxuICAgIFxcXCJcXFwiXFxcIk9yZGVyZWQgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGFuIE9yZGVyZWQgbGlua2VkIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIExpbmtlZExpc3QuX19pbml0X18oc2VsZilcXG5cXG4gICAgZGVmIGFkZChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYSBuZXcgbm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG4gICAgICAgIHByZXYgPSBOb25lXFxuICAgICAgICBuZXdfbm9kZSA9IExpbmtlZExpc3ROb2RlKHZhbHVlKVxcblxcbiAgICAgICAgd2hpbGUgY3VycmVudCBhbmQgY3VycmVudC5kYXRhIDwgdmFsdWU6XFxuICAgICAgICAgICAgcHJldiA9IGN1cnJlbnRcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XFxuXFxuICAgICAgICBpZiBwcmV2IGlzIE5vbmU6XFxuICAgICAgICAgICAgbmV3X25vZGUubmV4dCA9IHNlbGYuX2hlYWRcXG4gICAgICAgICAgICBzZWxmLl9oZWFkID0gbmV3X25vZGVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbmV3X25vZGUubmV4dCA9IGN1cnJlbnRcXG4gICAgICAgICAgICBwcmV2Lm5leHQgPSBuZXdfbm9kZVxcbiAgICAgICAgc2VsZi5fY291bnQgPSBzZWxmLl9jb3VudCArIDFcXG5cXG4gICAgZGVmIHJlbW92ZShzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBUaGlzIGlzIGFuIGV4ZXJjaXNlXFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiBzZWFyY2goc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2VhcmNoIGZvciBhIG5vZGUgd2l0aCBhIHNwZWNpZmljIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIFRoaXMgaXMgYW4gZXhlcmNpc2VcXG4gICAgICAgIHBhc3NcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL3F1ZXVlLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIFF1ZXVlOlxcbiAgICBcXFwiXFxcIlxcXCJRdWV1ZSBpbXBsZW1lbnRhdGlvbiBhcyBhIGxpc3RcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIG5ldyBxdWV1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMgPSBbXVxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgcXVldWUgaXMgZW1wdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBub3QgYm9vbChzZWxmLl9pdGVtcylcXG5cXG4gICAgZGVmIGVucXVldWUoc2VsZiwgaXRlbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYW4gaXRlbSB0byB0aGUgcXVldWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zLmluc2VydCgwLCBpdGVtKVxcblxcbiAgICBkZWYgZGVxdWV1ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgcXVldWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5faXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9iYXNpYy9zdGFjay5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBTdGFjazpcXG4gICAgXFxcIlxcXCJcXFwiU3RhY2sgaW1wbGVtZW50YXRpb24gYXMgYSBsaXN0XFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgc3RhY2tcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIHN0YWNrIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faXRlbXMpXFxuXFxuICAgIGRlZiBwdXNoKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIHBvcChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHBlZWsoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdGhlIHZhbHVlIG9mIHRoZSB0b3AgaXRlbSBpbiB0aGUgc3RhY2tcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9pdGVtc1stMV1cXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgc3RhY2tcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5faXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9ncmFwaHMvX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuZ3JhcGhzIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy5ncmFwaHMuYWRqYWNlbmN5X2dyYXBoIGltcG9ydCBHcmFwaFxcbmZyb20gcHl0aG9uZHMzLmdyYXBocy5hZGphY2VuY3lfZ3JhcGggaW1wb3J0IFZlcnRleFxcblxcbl9fYWxsX18gPSBbXFxcIkdyYXBoXFxcIl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2dyYXBocy9hZGphY2VuY3lfZ3JhcGgucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IGhlYXBxXFxuaW1wb3J0IHN5c1xcblxcblxcbmNsYXNzIFZlcnRleDpcXG4gICAgXFxcIlxcXCJcXFwiR3JhcGggdmVydGV4IGNsYXNzXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIG5ldyB2ZXJ0ZXhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fbmVpZ2hib3JzID0ge31cXG4gICAgICAgIHNlbGYuX2NvbG9yID0gXFxcIndoaXRlXFxcIlxcbiAgICAgICAgc2VsZi5fZGlzdGFuY2UgPSBzeXMubWF4c2l6ZVxcbiAgICAgICAgc2VsZi5fcHJldmlvdXMgPSBOb25lXFxuICAgICAgICBzZWxmLl9kaXNjb3ZlcnlfdGltZSA9IDBcXG4gICAgICAgIHNlbGYuX2Nsb3NpbmdfdGltZSA9IDBcXG5cXG4gICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJMZXNzIHRoYW4gb3BlcmF0b3IgcmVxdWlyZWQgZm9yIGhlYXBpZnlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLmtleSA8IG90aGVyLmtleVxcblxcbiAgICBkZWYgZ2V0X2tleShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB2ZXJ0ZXgga2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fa2V5XFxuXFxuICAgIGtleSA9IHByb3BlcnR5KGdldF9rZXkpXFxuXFxuICAgIGRlZiBnZXRfbmVpZ2hib3Ioc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBkaXN0YW5jZSAoZWRnZSB3ZWlnaHQpIHRvIGFuIGFkamFjZW50IG5vZGUgKG5laWdoYm9yKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX25laWdoYm9ycy5nZXQob3RoZXIsIE5vbmUpXFxuXFxuICAgIGRlZiBzZXRfbmVpZ2hib3Ioc2VsZiwgb3RoZXIsIHdlaWdodD0wKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB0aGUgZGlzdGFuY2UgKGFkZCBhbiBlZGdlKSB0byBhbiBhZGphY2VudCBub2RlIChuZWlnaGJvcilcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX25laWdoYm9yc1tvdGhlcl0gPSB3ZWlnaHRcXG5cXG4gICAgZGVmIGdldF9uZWlnaGJvcnMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgYWxsIGFkamFjZW50IG5vZGVzIChuZWlnaGJvcnMpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbmVpZ2hib3JzLmtleXMoKVxcblxcbiAgICBkZWYgZ2V0X2NvbG9yKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHZlcnRleCBjb2xvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbG9yXFxuXFxuICAgIGRlZiBzZXRfY29sb3Ioc2VsZiwgY29sb3IpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHZlcnRleCBjb2xvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fY29sb3IgPSBjb2xvclxcblxcbiAgICBjb2xvciA9IHByb3BlcnR5KGdldF9jb2xvciwgc2V0X2NvbG9yKVxcblxcbiAgICBkZWYgZ2V0X2Rpc3RhbmNlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGRpc3RhbmNlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZGlzdGFuY2VcXG5cXG4gICAgZGVmIHNldF9kaXN0YW5jZShzZWxmLCBkaXN0YW5jZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgZGlzdGFuY2VcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Rpc3RhbmNlID0gZGlzdGFuY2VcXG5cXG4gICAgZGlzdGFuY2UgPSBwcm9wZXJ0eShnZXRfZGlzdGFuY2UsIHNldF9kaXN0YW5jZSlcXG5cXG4gICAgZGVmIGdldF9wcmV2aW91cyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBwcmV2aW91c1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXZpb3VzXFxuXFxuICAgIGRlZiBzZXRfcHJldmlvdXMoc2VsZiwgcHJldmlvdXMpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHByZXZpb3VzXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9wcmV2aW91cyA9IHByZXZpb3VzXFxuXFxuICAgIHByZXZpb3VzID0gcHJvcGVydHkoZ2V0X3ByZXZpb3VzLCBzZXRfcHJldmlvdXMpXFxuXFxuICAgIGRlZiBnZXRfZGlzY292ZXJ5X3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgZGlzY292ZXJ5IHRpbWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kaXNjb3ZlcnlfdGltZVxcblxcbiAgICBkZWYgc2V0X2Rpc2NvdmVyeV90aW1lKHNlbGYsIGRpc2NvdmVyeV90aW1lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBkaXNjb3ZlcnkgdGltZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fZGlzY292ZXJ5X3RpbWUgPSBkaXNjb3ZlcnlfdGltZVxcblxcbiAgICBkaXNjb3ZlcnlfdGltZSA9IHByb3BlcnR5KGdldF9kaXNjb3ZlcnlfdGltZSwgc2V0X2Rpc2NvdmVyeV90aW1lKVxcblxcbiAgICBkZWYgZ2V0X2Nsb3NpbmdfdGltZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBjbG9zaW5nIHRpbWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jbG9zaW5nX3RpbWVcXG5cXG4gICAgZGVmIHNldF9jbG9zaW5nX3RpbWUoc2VsZiwgY2xvc2luZ190aW1lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBjbG9zaW5nIHRpbWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Nsb3NpbmdfdGltZSA9IGNsb3NpbmdfdGltZVxcblxcbiAgICBjbG9zaW5nX3RpbWUgPSBwcm9wZXJ0eShnZXRfY2xvc2luZ190aW1lLCBzZXRfY2xvc2luZ190aW1lKVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBcXFwiezpeOH18ezpeOH18ezpeOH18ezpeOH18ezpeOH18IHt9XFxcIi5mb3JtYXQoXFxuICAgICAgICAgICAgc2VsZi5fa2V5LFxcbiAgICAgICAgICAgIHNlbGYuX2NvbG9yLFxcbiAgICAgICAgICAgIHNlbGYuX2Rpc3RhbmNlLFxcbiAgICAgICAgICAgIHNlbGYuX2Rpc2NvdmVyeV90aW1lLFxcbiAgICAgICAgICAgIHNlbGYuX2Nsb3NpbmdfdGltZSxcXG4gICAgICAgICAgICBzZWxmLl9wcmV2aW91cyxcXG4gICAgICAgIClcXG5cXG5cXG5jbGFzcyBHcmFwaDpcXG4gICAgXFxcIlxcXCJcXFwiR3JhcGggYXMgYW4gYWRqYWNlbmN5IG1hdHJpeFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLl92ZXJ0aWNlcyA9IHt9XFxuICAgICAgICBzZWxmLl9lZGdlcyA9IHt9XFxuICAgICAgICBzZWxmLl90aW1lID0gMFxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJdGVyYXRvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fdmVydGljZXMudmFsdWVzKCkpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR3JhcGgncyBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3ZlcnRpY2VzKVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdyYXBoJ3Mgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl92ZXJ0aWNlcylcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiaW4gb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5fdmVydGljZXNcXG5cXG4gICAgZGVmIGdldF92ZXJ0ZXgoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZpbmQgdGhlIHZlcnRleCBpbiB0aGUgZ3JhcGggbmFtZWQgdmVydF9rZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl92ZXJ0aWNlcy5nZXQoa2V5LCBOb25lKVxcblxcbiAgICBkZWYgc2V0X3ZlcnRleChzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGluc3RhbmNlIG9mIFZlcnRleCB0byB0aGUgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3ZlcnRpY2VzW2tleV0gPSBWZXJ0ZXgoa2V5KVxcblxcbiAgICBkZWYgYWRkX2VkZ2Uoc2VsZiwgZnJvbV92ZXJ0ZXgsIHRvX3ZlcnRleCwgd2VpZ2h0PTApOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgd2VpZ2h0ZWQgYW5kIGRpcmVjdGVkIGVkZ2UgdG8gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBmcm9tX3ZlcnRleCBub3QgaW4gc2VsZi5fdmVydGljZXM6XFxuICAgICAgICAgICAgc2VsZi5zZXRfdmVydGV4KGZyb21fdmVydGV4KVxcbiAgICAgICAgaWYgdG9fdmVydGV4IG5vdCBpbiBzZWxmLl92ZXJ0aWNlczpcXG4gICAgICAgICAgICBzZWxmLnNldF92ZXJ0ZXgodG9fdmVydGV4KVxcbiAgICAgICAgc2VsZi5fdmVydGljZXNbZnJvbV92ZXJ0ZXhdLnNldF9uZWlnaGJvcihzZWxmLl92ZXJ0aWNlc1t0b192ZXJ0ZXhdLCB3ZWlnaHQpXFxuICAgICAgICBzZWxmLl9lZGdlc1soZnJvbV92ZXJ0ZXgsIHRvX3ZlcnRleCldID0gd2VpZ2h0XFxuXFxuICAgIGRlZiBnZXRfdmVydGljZXMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHZlcnRpY2VzIGluIHRoZSBncmFwaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnRpY2VzLmtleXMoKVxcblxcbiAgICBkZWYgZ2V0X2VkZ2VzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBlZGdlcyBpbiB0aGUgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9lZGdlcy5rZXlzKClcXG5cXG4gICAgZGVmIHJlc2V0X2Rpc3RhbmNlcyhzZWxmLCBkZWZhdWx0X2Rpc3RhbmNlPXN5cy5tYXhzaXplKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlc2V0IGRpc3RhbmNlcyB0byB0ZXN0IERpamtzdHJhJ3NcXFwiXFxcIlxcXCJcXG4gICAgICAgIGZvciB2ZXJ0ZXggaW4gc2VsZjpcXG4gICAgICAgICAgICB2ZXJ0ZXguZGlzdGFuY2UgPSBkZWZhdWx0X2Rpc3RhbmNlXFxuXFxuICAgIGRlZiBiZnMoc2VsZiwgc3RhcnQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQnJlYWR0aCBGaXJzdCBTZWFyY2hcXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgc3RhcnQucHJldmlvdXMgPSBOb25lXFxuICAgICAgICB2ZXJ0X3F1ZXVlID0gW3N0YXJ0XVxcbiAgICAgICAgd2hpbGUgdmVydF9xdWV1ZTpcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnQgPSB2ZXJ0X3F1ZXVlLnBvcCgwKVxcbiAgICAgICAgICAgIGZvciBuZWlnaCBpbiBjdXJyZW50X3ZlcnQuZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgICAgICBpZiBuZWlnaC5jb2xvciA9PSBcXFwid2hpdGVcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgbmVpZ2guY29sb3IgPSBcXFwiZ3JheVxcXCJcXG4gICAgICAgICAgICAgICAgICAgIG5laWdoLmRpc3RhbmNlID0gY3VycmVudF92ZXJ0LmRpc3RhbmNlICsgMVxcbiAgICAgICAgICAgICAgICAgICAgbmVpZ2gucHJldmlvdXMgPSBjdXJyZW50X3ZlcnRcXG4gICAgICAgICAgICAgICAgICAgIHZlcnRfcXVldWUuYXBwZW5kKG5laWdoKVxcbiAgICAgICAgICAgIGN1cnJlbnRfdmVydC5jb2xvciA9IFxcXCJibGFja1xcXCJcXG5cXG4gICAgZGVmIGRmcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkRlcHRoIEZpcnN0IHNlYXJjaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgZm9yIHZlcnRleCBpbiBzZWxmOlxcbiAgICAgICAgICAgIGlmIHZlcnRleC5jb2xvciA9PSBcXFwid2hpdGVcXFwiOlxcbiAgICAgICAgICAgICAgICBzZWxmLmRmc192aXNpdCh2ZXJ0ZXgpXFxuXFxuICAgIGRlZiBkZnNfdmlzaXQoc2VsZiwgc3RhcnQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiREZTIGhlbHBlciBmdW5jdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnQuY29sb3IgPSBcXFwiZ3JheVxcXCJcXG4gICAgICAgIHNlbGYuX3RpbWUgPSBzZWxmLl90aW1lICsgMVxcbiAgICAgICAgc3RhcnQuZGlzY292ZXJ5X3RpbWUgPSBzZWxmLl90aW1lXFxuICAgICAgICBmb3IgbmV4dF92ZXJ0ZXggaW4gc3RhcnQuZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgIGlmIG5leHRfdmVydGV4LmNvbG9yID09IFxcXCJ3aGl0ZVxcXCI6XFxuICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LnNldF9wcmV2aW91cyhzdGFydClcXG4gICAgICAgICAgICAgICAgc2VsZi5kZnNfdmlzaXQobmV4dF92ZXJ0ZXgpXFxuICAgICAgICBzdGFydC5jb2xvciA9IFxcXCJibGFja1xcXCJcXG4gICAgICAgIHNlbGYuX3RpbWUgPSBzZWxmLl90aW1lICsgMVxcbiAgICAgICAgc3RhcnQuY2xvc2luZ190aW1lID0gc2VsZi5fdGltZVxcblxcbiAgICBkZWYgdHJhdmVyc2Uoc2VsZiwgc3JjLCBkc3QpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVHJhdmVyc2UgYSBncmFwaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcGF0aCA9IFtdXFxuICAgICAgICBjdXJyZW50ID0gc2VsZi5nZXRfdmVydGV4KGRzdClcXG4gICAgICAgIHdoaWxlIGN1cnJlbnQ6XFxuICAgICAgICAgICAgcGF0aC5hcHBlbmQoY3VycmVudClcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wcmV2aW91c1xcbiAgICAgICAgcHJpbnQoXFxuICAgICAgICAgICAgXFxcIlBhdGggZnJvbSB7fSB0byB7fSAoe30pOiB7fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoc3JjKS5rZXksXFxuICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChkc3QpLmtleSxcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGRzdCkuZGlzdGFuY2UsXFxuICAgICAgICAgICAgICAgIFxcXCIgXFxcIi5qb2luKHZlcnRleC5rZXkgZm9yIHZlcnRleCBpbiByZXZlcnNlZChwYXRoKSksXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgKVxcblxcbiAgICBkZWYgZGlqa3N0cmEoc2VsZiwgc3RhcnQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRGlqa3N0cmEncyBzaG9ydGVzdCBwYXRoIGFsZ29yaXRobVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnQuZGlzdGFuY2UgPSAwXFxuICAgICAgICBub3RfeWV0X3Zpc2l0ZWQgPSBbW3N0YXJ0LmRpc3RhbmNlLCBzdGFydF1dXFxuICAgICAgICBoZWFwcS5oZWFwaWZ5KG5vdF95ZXRfdmlzaXRlZClcXG4gICAgICAgIHdoaWxlIG5vdF95ZXRfdmlzaXRlZDpcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnRleCA9IGhlYXBxLmhlYXBwb3Aobm90X3lldF92aXNpdGVkKVsxXVxcbiAgICAgICAgICAgIGZvciBuZXh0X3ZlcnRleCBpbiBjdXJyZW50X3ZlcnRleC5nZXRfbmVpZ2hib3JzKCk6XFxuICAgICAgICAgICAgICAgIG5ld19kaXN0YW5jZSA9IGN1cnJlbnRfdmVydGV4LmRpc3RhbmNlICsgY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9yKFxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXhcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgICAgICBpZiBuZXdfZGlzdGFuY2UgPCBuZXh0X3ZlcnRleC5kaXN0YW5jZTpcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LmRpc3RhbmNlID0gbmV3X2Rpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5wcmV2aW91cyA9IGN1cnJlbnRfdmVydGV4XFxuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlXFxuICAgICAgICAgICAgICAgICAgICBmb3IgdmVydGV4IGluIG5vdF95ZXRfdmlzaXRlZDpcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiB2ZXJ0ZXhbMV0ua2V5ID09IG5leHRfdmVydGV4LmtleTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4WzBdID0gbmV4dF92ZXJ0ZXguZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfeWV0X3Zpc2l0ZWQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZVxcbiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZvdW5kOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBxLmhlYXBwdXNoKFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RfeWV0X3Zpc2l0ZWQsIFtuZXh0X3ZlcnRleC5kaXN0YW5jZSwgbmV4dF92ZXJ0ZXhdXFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxcblxcbiAgICBkZWYgYmVsbG1hbl9mb3JkKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkJlbGxtYW4tRm9yZCBzaG9ydGVzdCBwYXRoIGFsZ29yaXRobVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnQuZGlzdGFuY2UgPSAwXFxuICAgICAgICBmb3IgXyBpbiByYW5nZShsZW4oc2VsZi5fdmVydGljZXMpKTpcXG4gICAgICAgICAgICBmb3IgZWRnZSBpbiBzZWxmLl9lZGdlczpcXG4gICAgICAgICAgICAgICAgaWYgKFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMF0pLmRpc3RhbmNlICsgc2VsZi5fZWRnZXNbZWRnZV1cXG4gICAgICAgICAgICAgICAgICAgIDwgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMV0pLmRpc3RhbmNlXFxuICAgICAgICAgICAgICAgICk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkuZGlzdGFuY2UgPSAoXFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMF0pLmRpc3RhbmNlICsgc2VsZi5fZWRnZXNbZWRnZV1cXG4gICAgICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzFdKS5wcmV2aW91cyA9IHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKVxcbiAgICAgICAgZm9yIGVkZ2UgaW4gc2VsZi5fZWRnZXM6XFxuICAgICAgICAgICAgaWYgKFxcbiAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZWRnZVswXSkuZGlzdGFuY2UgKyBzZWxmLl9lZGdlc1tlZGdlXVxcbiAgICAgICAgICAgICAgICA8IHNlbGYuZ2V0X3ZlcnRleChlZGdlWzFdKS5kaXN0YW5jZVxcbiAgICAgICAgICAgICk6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIkdyYXBoIGNvbnRhaW5zIGEgbmVnYXRpdmUtd2VpZ2h0IGN5Y2xlXFxcIilcXG5cXG4gICAgZGVmIHByaW0oc2VsZiwgc3RhcnQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJpbSdzIHNwYW5uaW5nIHRyZWUgYWxnb3JpdGhtXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydC5kaXN0YW5jZSA9IDBcXG4gICAgICAgIG5vdF9pbl9hX3RyZWUgPSBbW3ZlcnRleC5kaXN0YW5jZSwgdmVydGV4XSBmb3IgdmVydGV4IGluIHNlbGZdXFxuICAgICAgICBoZWFwcS5oZWFwaWZ5KG5vdF9pbl9hX3RyZWUpXFxuICAgICAgICB3aGlsZSBub3RfaW5fYV90cmVlOlxcbiAgICAgICAgICAgIGN1cnJlbnRfdmVydGV4ID0gaGVhcHEuaGVhcHBvcChub3RfaW5fYV90cmVlKVsxXVxcbiAgICAgICAgICAgIGZvciBuZXh0X3ZlcnRleCBpbiBjdXJyZW50X3ZlcnRleC5nZXRfbmVpZ2hib3JzKCk6XFxuICAgICAgICAgICAgICAgIG5ld19kaXN0YW5jZSA9IGN1cnJlbnRfdmVydGV4LmdldF9uZWlnaGJvcihuZXh0X3ZlcnRleClcXG4gICAgICAgICAgICAgICAgaWYgKFxcbiAgICAgICAgICAgICAgICAgICAgYW55KGl0ZW1bMV0gPT0gbmV4dF92ZXJ0ZXggZm9yIGl0ZW0gaW4gbm90X2luX2FfdHJlZSlcXG4gICAgICAgICAgICAgICAgICAgIGFuZCBuZXdfZGlzdGFuY2UgPCBuZXh0X3ZlcnRleC5kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXgucHJldmlvdXMgPSBjdXJyZW50X3ZlcnRleFxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXguZGlzdGFuY2UgPSBuZXdfZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG5vdF9pbl9hX3RyZWU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXRlbVsxXSA9PSBuZXh0X3ZlcnRleDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVswXSA9IG5ld19kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwcS5oZWFwaWZ5KG5vdF9pbl9hX3RyZWUpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9pbnRyby9fX2luaXRfXy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbnB5dGhvbmRzMy5pbnRybyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuaW50cm8ub29wIGltcG9ydCBGcmFjdGlvblxcblxcbl9fYWxsX18gPSBbXFxcIkZyYWN0aW9uXFxcIl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2ludHJvL29vcC5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5kZWYgZ2NkKG51bWJlcjEsIG51bWJlcjIpOlxcbiAgICBcXFwiXFxcIlxcXCJIZWxwZXIgZnVuY3Rpb24gdG8gc2ltcGxpZnkgZnJhY3Rpb25zXFxcIlxcXCJcXFwiXFxuICAgIGlmIG5vdCBpc2luc3RhbmNlKG51bWJlcjEsIGludCkgb3Igbm90IGlzaW5zdGFuY2UobnVtYmVyMiwgaW50KTpcXG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiTnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBtdXN0IGJlIGludGVnZXJzXFxcIilcXG4gICAgd2hpbGUgbnVtYmVyMSAlIG51bWJlcjI6XFxuICAgICAgICBudW1iZXIxLCBudW1iZXIyID0gbnVtYmVyMiwgbnVtYmVyMSAlIG51bWJlcjJcXG4gICAgcmV0dXJuIG51bWJlcjJcXG5cXG5cXG5jbGFzcyBGcmFjdGlvbjpcXG4gICAgXFxcIlxcXCJcXFwiRnJhY3Rpb24gY2xhc3NcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5ld19udW1lciwgbmV3X2Rlbm9tKTpcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBjb21tb24gPSBnY2QobmV3X251bWVyLCBuZXdfZGVub20pXFxuICAgICAgICBleGNlcHQgVHlwZUVycm9yOlxcbiAgICAgICAgICAgIHJhaXNlXFxuICAgICAgICBzZWxmLl9udW1lciA9IG5ld19udW1lciAvLyBjb21tb25cXG4gICAgICAgIHNlbGYuX2Rlbm9tID0gbmV3X2Rlbm9tIC8vIGNvbW1vblxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG51bWVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IG51bWVyYXRvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX251bWVyXFxuXFxuICAgIEBudW1lci5zZXR0ZXJcXG4gICAgZGVmIHNldF9udW1lcihzZWxmLCBuZXdfbnVtZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG51bWVyYXRvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fbnVtZXIgPSBuZXdfbnVtZXJcXG5cXG4gICAgZGVmIGdldF9kZW5vbShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBkZW5pbWluYXRvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2Rlbm9tXFxuXFxuICAgIGRlZiBzZXRfZGVub20oc2VsZiwgbmV3X2Rlbm9tKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBkZW5pbWluYXRvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fZGVub20gPSBuZXdfZGVub21cXG5cXG4gICAgIyBBbm90aGVyIHdheSB0byBjcmVhdGUgYW4gYXR0cmlidXRlXFxuICAgIGRlbm9tID0gcHJvcGVydHkoZ2V0X2Rlbm9tLCBzZXRfZGVub20pXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBzdHJpbmcgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX251bWVyID4gc2VsZi5fZGVub206XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ7fSB7fS97fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICBzZWxmLl9udW1lciAvLyBzZWxmLl9kZW5vbSwgc2VsZi5fbnVtZXIgJSBzZWxmLl9kZW5vbSwgc2VsZi5fZGVub21cXG4gICAgICAgICAgICApXFxuICAgICAgICByZXR1cm4gXFxcInt9L3t9XFxcIi5mb3JtYXQoc2VsZi5fbnVtZXIsIHNlbGYuX2Rlbm9tKVxcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGcmFjdGlvbiByZXByZXNlbnRhdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCJGcmFjdGlvbih7fSwge30pXFxcIi5mb3JtYXQoc2VsZi5fbnVtZXIsIHNlbGYuX2Rlbm9tKVxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkVxdWFsaXR5IGNvbXBhcmlzb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9udW1lciAqIG90aGVyLmRlbm9tID09IG90aGVyLm51bWVyICogc2VsZi5fZGVub21cXG5cXG4gICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIHR3byBmcmFjdGlvbnNcXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19udW1lciA9IHNlbGYuX251bWVyICogb3RoZXIuZGVub20gKyBzZWxmLl9kZW5vbSAqIG90aGVyLm51bWVyXFxuICAgICAgICBuZXdfZGVub20gPSBzZWxmLl9kZW5vbSAqIG90aGVyLmRlbm9tXFxuICAgICAgICByZXR1cm4gRnJhY3Rpb24obmV3X251bWVyLCBuZXdfZGVub20pXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zZWFyY2hpbmcvX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuc2VhcmNoIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy5zZWFyY2hpbmcuaGFzaF90YWJsZSBpbXBvcnQgSGFzaFRhYmxlXFxuXFxuX19hbGxfXyA9IFtcXFwiSGFzaFRhYmxlXFxcIl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3NlYXJjaGluZy9oYXNoX3RhYmxlLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIEhhc2hUYWJsZTpcXG4gICAgXFxcIlxcXCJcXFwiSGFzaCBUYWJsZSBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZT0xNik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBoYXNoIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9zaXplID0gc2l6ZVxcbiAgICAgICAgc2VsZi5fc2xvdHMgPSBbTm9uZV0gKiBzZWxmLl9zaXplXFxuICAgICAgICBzZWxmLl9kYXRhID0gW05vbmVdICogc2VsZi5fc2l6ZVxcblxcbiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2ljIF9fZ2V0X19cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLmdldChrZXkpXFxuXFxuICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIGRhdGEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTWFnaWMgX19zZXRfX1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5wdXQoa2V5LCBkYXRhKVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2ljIF9fbGVuX19cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplIC0gc2VsZi5fc2xvdHMuY291bnQoTm9uZSlcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTWFnaW4gaW5cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5fc2xvdHNcXG5cXG4gICAgZGVmIF9oYXNoX2Z1bmN0aW9uKHNlbGYsIGtleSwgc2l6ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTaW1wbGUgaGFzaCBmdW5jdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGtleSAlIHNpemVcXG5cXG4gICAgZGVmIF9yZWhhc2goc2VsZiwgb2xkX2hhc2gsIHNpemUsIHN0ZXA9MSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTaW1wbGUgcmVoYXNoIGZ1bmN0aW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gKG9sZF9oYXNoICsgc3RlcCkgJSBzaXplXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSB0YWJsZSBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NpemUgPT0gc2VsZi5fc2xvdHMuY291bnQoTm9uZSlcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSB0YWJsZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NpemUgLSBzZWxmLl9zbG90cy5jb3VudChOb25lKVxcblxcbiAgICBkZWYgcHV0KHNlbGYsIGtleSwgZGF0YSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYW4gaXRlbSB0byB0aGUgdGFibGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGhhc2hfdmFsdWUgPSBzZWxmLl9oYXNoX2Z1bmN0aW9uKGtleSwgbGVuKHNlbGYuX3Nsb3RzKSlcXG5cXG4gICAgICAgIGlmIHNlbGYuX3Nsb3RzW2hhc2hfdmFsdWVdIGlzIE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5fc2xvdHNbaGFzaF92YWx1ZV0gPSBrZXlcXG4gICAgICAgICAgICBzZWxmLl9kYXRhW2hhc2hfdmFsdWVdID0gZGF0YVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9zbG90c1toYXNoX3ZhbHVlXSA9PSBrZXk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFbaGFzaF92YWx1ZV0gPSBkYXRhICAjIHJlcGxhY2VcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBqID0gMFxcbiAgICAgICAgICAgICAgICBuZXh0X3Nsb3QgPSBzZWxmLl9yZWhhc2goaGFzaF92YWx1ZSwgbGVuKHNlbGYuX3Nsb3RzKSwgailcXG4gICAgICAgICAgICAgICAgd2hpbGUgKFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2xvdHNbbmV4dF9zbG90XSBpcyBub3QgTm9uZVxcbiAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGYuX3Nsb3RzW25leHRfc2xvdF0gIT0ga2V5XFxuICAgICAgICAgICAgICAgICAgICBhbmQgaiA8IHNlbGYuX3NpemVcXG4gICAgICAgICAgICAgICAgKTpcXG4gICAgICAgICAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF9zbG90ID0gc2VsZi5fcmVoYXNoKGhhc2hfdmFsdWUsIGxlbihzZWxmLl9zbG90cyksIGopXFxuXFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuX3Nsb3RzW25leHRfc2xvdF0gaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3Nsb3RzW25leHRfc2xvdF0gPSBrZXlcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFbbmV4dF9zbG90XSA9IGRhdGFcXG4gICAgICAgICAgICAgICAgZWxpZiBqID09IHNlbGYuX3NpemU6XFxuICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oXFxcIkhhc2ggVGFibGUgaXMgZnVsbFxcXCIpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW25leHRfc2xvdF0gPSBkYXRhICAjIHJlcGxhY2VcXG5cXG4gICAgZGVmIGdldChzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGFuIGl0ZW0gZnJvbSB0aGUgdGFibGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0X3Nsb3QgPSBzZWxmLl9oYXNoX2Z1bmN0aW9uKGtleSwgbGVuKHNlbGYuX3Nsb3RzKSlcXG4gICAgICAgIHBvc2l0aW9uID0gc3RhcnRfc2xvdFxcbiAgICAgICAgaiA9IDBcXG5cXG4gICAgICAgIHdoaWxlIHNlbGYuX3Nsb3RzW3Bvc2l0aW9uXSBpcyBub3QgTm9uZSBhbmQgaiA8IHNlbGYuX3NpemU6XFxuICAgICAgICAgICAgaWYgc2VsZi5fc2xvdHNbcG9zaXRpb25dID09IGtleTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGFbcG9zaXRpb25dXFxuICAgICAgICAgICAgaiA9IGogKyAxXFxuICAgICAgICAgICAgcG9zaXRpb24gPSBzZWxmLl9yZWhhc2goc3RhcnRfc2xvdCwgbGVuKHNlbGYuX3Nsb3RzKSwgailcXG5cXG4gICAgICAgIHJhaXNlIEtleUVycm9yKFxcXCJ7fSBpcyBub3QgaW4gdGhlIHRhYmxlXFxcIi5mb3JtYXQoa2V5KSlcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3NvcnRpbmcvX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuc29ydGluZyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IGJ1YmJsZV9zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IHNlbGVjdF9zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IGluc2VydF9zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IHNoZWxsX3NvcnRcXG5mcm9tIHB5dGhvbmRzMy5zb3J0aW5nLnNvcnRpbmdfYWxnb3JpdGhtcyBpbXBvcnQgbWVyZ2Vfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBxdWlja19zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IGhlYXBfc29ydFxcblwiLFwic3JjL2xpYi9weXRob25kczMvc29ydGluZy9zb3J0aW5nX2FsZ29yaXRobXMucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IGhlYXBxXFxuXFxuXFxuZGVmIGJ1YmJsZV9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIkJ1YmJsZSBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIGZvciBpIGluIHJhbmdlKGxlbihsc3QpIC0gMSwgMCwgLTEpOlxcbiAgICAgICAgZXhjaGFuZ2VzID0gRmFsc2VcXG4gICAgICAgIGZvciBqIGluIHJhbmdlKGkpOlxcbiAgICAgICAgICAgIGlmIGxzdFtqXSA+IGxzdFtqICsgMV06XFxuICAgICAgICAgICAgICAgIGV4Y2hhbmdlcyA9IFRydWVcXG4gICAgICAgICAgICAgICAgbHN0W2pdLCBsc3RbaiArIDFdID0gbHN0W2ogKyAxXSwgbHN0W2pdXFxuICAgICAgICBpZiBub3QgZXhjaGFuZ2VzOlxcbiAgICAgICAgICAgIGJyZWFrXFxuXFxuXFxuZGVmIHNlbGVjdF9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIlNlbGVjdGlvbiBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIGZvciBpLCBpdGVtIGluIGVudW1lcmF0ZShsc3QpOlxcbiAgICAgICAgbWluX2lkeCA9IGxlbihsc3QpIC0gMVxcbiAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSwgbGVuKGxzdCkpOlxcbiAgICAgICAgICAgIGlmIGxzdFtqXSA8IGxzdFttaW5faWR4XTpcXG4gICAgICAgICAgICAgICAgbWluX2lkeCA9IGpcXG4gICAgICAgIGlmIG1pbl9pZHggIT0gaTpcXG4gICAgICAgICAgICBsc3RbbWluX2lkeF0sIGxzdFtpXSA9IGxzdFtpXSwgbHN0W21pbl9pZHhdXFxuXFxuXFxuZGVmIGluc2VydF9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIkluc2VydGlvbiBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihsc3QpKTpcXG4gICAgICAgIGN1cl92YWwgPSBsc3RbaV1cXG4gICAgICAgIGN1cl9wb3MgPSBpXFxuXFxuICAgICAgICB3aGlsZSBjdXJfcG9zID4gMCBhbmQgbHN0W2N1cl9wb3MgLSAxXSA+IGN1cl92YWw6XFxuICAgICAgICAgICAgbHN0W2N1cl9wb3NdID0gbHN0W2N1cl9wb3MgLSAxXVxcbiAgICAgICAgICAgIGN1cl9wb3MgPSBjdXJfcG9zIC0gMVxcbiAgICAgICAgbHN0W2N1cl9wb3NdID0gY3VyX3ZhbFxcblxcblxcbmRlZiBzaGVsbF9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIlNoZWxsIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgc3VibGlzdF9jb3VudCA9IGxlbihsc3QpIC8vIDNcXG4gICAgd2hpbGUgc3VibGlzdF9jb3VudCA+IDA6XFxuICAgICAgICBmb3IgcG9zX3N0YXJ0IGluIHJhbmdlKHN1Ymxpc3RfY291bnQpOlxcbiAgICAgICAgICAgIF9nYXBfaW5zZXJ0X3NvcnQobHN0LCBwb3Nfc3RhcnQsIHN1Ymxpc3RfY291bnQpXFxuICAgICAgICBzdWJsaXN0X2NvdW50ID0gc3VibGlzdF9jb3VudCAvLyAyXFxuXFxuXFxuZGVmIF9nYXBfaW5zZXJ0X3NvcnQobHN0LCBzdGFydCwgZ2FwKTpcXG4gICAgXFxcIlxcXCJcXFwiU2hlbGwgc29ydCBoZWxwZXIgZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgZm9yIGkgaW4gcmFuZ2Uoc3RhcnQgKyBnYXAsIGxlbihsc3QpLCBnYXApOlxcbiAgICAgICAgY3VyX3ZhbCA9IGxzdFtpXVxcbiAgICAgICAgY3VyX3BvcyA9IGlcXG4gICAgICAgIHdoaWxlIGN1cl9wb3MgPj0gZ2FwIGFuZCBsc3RbY3VyX3BvcyAtIGdhcF0gPiBjdXJfdmFsOlxcbiAgICAgICAgICAgIGxzdFtjdXJfcG9zXSA9IGxzdFtjdXJfcG9zIC0gZ2FwXVxcbiAgICAgICAgICAgIGN1cl9wb3MgPSBjdXJfcG9zIC0gZ2FwXFxuICAgICAgICBsc3RbY3VyX3Bvc10gPSBjdXJfdmFsXFxuXFxuXFxuZGVmIG1lcmdlX3NvcnQobHN0KTpcXG4gICAgXFxcIlxcXCJcXFwiTWVyZ2Ugc29ydFxcXCJcXFwiXFxcIlxcbiAgICBpZiBsZW4obHN0KSA+IDE6XFxuICAgICAgICBtaWQgPSBsZW4obHN0KSAvLyAyXFxuICAgICAgICBsZWZ0X2hhbGYgPSBsc3RbOm1pZF1cXG4gICAgICAgIHJpZ2h0X2hhbGYgPSBsc3RbbWlkOl1cXG5cXG4gICAgICAgIG1lcmdlX3NvcnQobGVmdF9oYWxmKVxcbiAgICAgICAgbWVyZ2Vfc29ydChyaWdodF9oYWxmKVxcblxcbiAgICAgICAgaSwgaiwgayA9IDAsIDAsIDBcXG4gICAgICAgIHdoaWxlIGkgPCBsZW4obGVmdF9oYWxmKSBhbmQgaiA8IGxlbihyaWdodF9oYWxmKTpcXG4gICAgICAgICAgICBpZiBsZWZ0X2hhbGZbaV0gPD0gcmlnaHRfaGFsZltqXTpcXG4gICAgICAgICAgICAgICAgbHN0W2tdID0gbGVmdF9oYWxmW2ldXFxuICAgICAgICAgICAgICAgIGkgPSBpICsgMVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGxzdFtrXSA9IHJpZ2h0X2hhbGZbal1cXG4gICAgICAgICAgICAgICAgaiA9IGogKyAxXFxuICAgICAgICAgICAgayA9IGsgKyAxXFxuXFxuICAgICAgICB3aGlsZSBpIDwgbGVuKGxlZnRfaGFsZik6XFxuICAgICAgICAgICAgbHN0W2tdID0gbGVmdF9oYWxmW2ldXFxuICAgICAgICAgICAgaSA9IGkgKyAxXFxuICAgICAgICAgICAgayA9IGsgKyAxXFxuXFxuICAgICAgICB3aGlsZSBqIDwgbGVuKHJpZ2h0X2hhbGYpOlxcbiAgICAgICAgICAgIGxzdFtrXSA9IHJpZ2h0X2hhbGZbal1cXG4gICAgICAgICAgICBqID0gaiArIDFcXG4gICAgICAgICAgICBrID0gayArIDFcXG5cXG5cXG5kZWYgcXVpY2tfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJRdWljayBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIF9xdWlja19zb3J0X2hlbHAobHN0LCAwLCBsZW4obHN0KSAtIDEpXFxuXFxuXFxuZGVmIF9xdWlja19zb3J0X2hlbHAobHN0LCBtYXJrX2wsIG1hcmtfcik6XFxuICAgIFxcXCJcXFwiXFxcIlF1aWNrIHNvcnQgaGVscGVyXFxcIlxcXCJcXFwiXFxuICAgIGlmIG1hcmtfbCA8IG1hcmtfcjpcXG4gICAgICAgIHNwbGl0ID0gX3F1aWNrX3NvcnRfcGFydChsc3QsIG1hcmtfbCwgbWFya19yKVxcbiAgICAgICAgX3F1aWNrX3NvcnRfaGVscChsc3QsIG1hcmtfbCwgc3BsaXQgLSAxKVxcbiAgICAgICAgX3F1aWNrX3NvcnRfaGVscChsc3QsIHNwbGl0ICsgMSwgbWFya19yKVxcblxcblxcbmRlZiBfcXVpY2tfc29ydF9wYXJ0KGxzdCwgbWFya19sLCBtYXJrX3IpOlxcbiAgICBcXFwiXFxcIlxcXCJRdWljayBzb3J0IHBhcnRpdGlvblxcXCJcXFwiXFxcIlxcbiAgICBwaXZvdF92YWwgPSBsc3RbbWFya19sXVxcbiAgICBtYXJrX2xfY3VyID0gbWFya19sICsgMVxcbiAgICBtYXJrX3JfY3VyID0gbWFya19yXFxuICAgIGRvbmUgPSBGYWxzZVxcblxcbiAgICB3aGlsZSBub3QgZG9uZTpcXG4gICAgICAgIHdoaWxlIG1hcmtfbF9jdXIgPD0gbWFya19yX2N1ciBhbmQgbHN0W21hcmtfbF9jdXJdIDw9IHBpdm90X3ZhbDpcXG4gICAgICAgICAgICBtYXJrX2xfY3VyID0gbWFya19sX2N1ciArIDFcXG4gICAgICAgIHdoaWxlIG1hcmtfbF9jdXIgPD0gbWFya19yX2N1ciBhbmQgbHN0W21hcmtfcl9jdXJdID49IHBpdm90X3ZhbDpcXG4gICAgICAgICAgICBtYXJrX3JfY3VyID0gbWFya19yX2N1ciAtIDFcXG4gICAgICAgIGlmIG1hcmtfcl9jdXIgPCBtYXJrX2xfY3VyOlxcbiAgICAgICAgICAgIGRvbmUgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGxzdFttYXJrX2xfY3VyXSwgbHN0W21hcmtfcl9jdXJdID0gbHN0W21hcmtfcl9jdXJdLCBsc3RbbWFya19sX2N1cl1cXG4gICAgbHN0W21hcmtfbF0sIGxzdFttYXJrX3JfY3VyXSA9IGxzdFttYXJrX3JfY3VyXSwgbHN0W21hcmtfbF1cXG5cXG4gICAgcmV0dXJuIG1hcmtfcl9jdXJcXG5cXG5cXG5kZWYgaGVhcF9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIkhlYXAgc29ydFxcXCJcXFwiXFxcIlxcbiAgICByZXMgPSBbXVxcbiAgICBoZWFwcS5oZWFwaWZ5KGxzdClcXG4gICAgd2hpbGUgbHN0OlxcbiAgICAgICAgcmVzLmFwcGVuZChoZWFwcS5oZWFwcG9wKGxzdCkpXFxuICAgIGZvciBpIGluIHJlczpcXG4gICAgICAgIGxzdC5hcHBlbmQoaSlcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3RyZWVzL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLnRyZWVzIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5hdmxfdHJlZSBpbXBvcnQgQVZMVHJlZVxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV9zZWFyY2hfdHJlZSBpbXBvcnQgQmluYXJ5U2VhcmNoVHJlZVxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV9oZWFwIGltcG9ydCBCaW5hcnlIZWFwXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3RyZWUgaW1wb3J0IEJpbmFyeVRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5wcmlvcml0eV9xdWV1ZSBpbXBvcnQgUHJpb3JpdHlRdWV1ZVxcblxcbl9fYWxsX18gPSBbXFxcIkJpbmFyeVRyZWVcXFwiLCBcXFwiQmluYXJ5SGVhcFxcXCIsIFxcXCJCaW5hcnlTZWFyY2hUcmVlXFxcIiwgXFxcIkFWTFRyZWVcXFwiLCBcXFwiUHJpb3JpdHlRdWV1ZVxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9hdmxfdHJlZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNSwgMjAxMFxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfc2VhcmNoX3RyZWUgaW1wb3J0IEJpbmFyeVNlYXJjaFRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfc2VhcmNoX3RyZWUgaW1wb3J0IEJpbmFyeVRyZWVOb2RlXFxuXFxuXFxuY2xhc3MgQVZMVHJlZU5vZGUoQmluYXJ5VHJlZU5vZGUpOlxcbiAgICBcXFwiXFxcIlxcXCJBVkwgVHJlZSBOb2RlXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXksIHZhbCwgYmFsYW5jZV9mYWN0b3IsIGxlZnQ9Tm9uZSwgcmlnaHQ9Tm9uZSwgcGFyZW50PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGFuIEFWTCB0cmVlIG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIEJpbmFyeVRyZWVOb2RlLl9faW5pdF9fKHNlbGYsIGtleSwgdmFsLCBsZWZ0LCByaWdodCwgcGFyZW50KVxcbiAgICAgICAgc2VsZi5fYmFsYW5jZV9mYWN0b3IgPSBiYWxhbmNlX2ZhY3RvclxcblxcbiAgICBkZWYgZ2V0X2JhbGFuY2VfZmFjdG9yKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBub2RlIGJhbGFuY2UgZmFjdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fYmFsYW5jZV9mYWN0b3JcXG5cXG4gICAgZGVmIHNldF9iYWxhbmNlX2ZhY3RvcihzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIG5vZGUgYmFsYW5jZSBmYWN0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2JhbGFuY2VfZmFjdG9yID0gdmFsdWVcXG5cXG4gICAgYmFsYW5jZV9mYWN0b3IgPSBwcm9wZXJ0eShnZXRfYmFsYW5jZV9mYWN0b3IsIHNldF9iYWxhbmNlX2ZhY3RvcilcXG5cXG5cXG5jbGFzcyBBVkxUcmVlKEJpbmFyeVNlYXJjaFRyZWUpOlxcbiAgICBcXFwiXFxcIlxcXCJBVkwgdHJlZSBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBuZXcgQVZMIHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIEJpbmFyeVNlYXJjaFRyZWUuX19pbml0X18oc2VsZilcXG5cXG4gICAgZGVmIHB1dChzZWxmLCBrZXksIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBuZXcgbm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fcm9vdDpcXG4gICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgc2VsZi5fcm9vdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5fcm9vdCA9IEFWTFRyZWVOb2RlKGtleSwgdmFsdWUsIDApXFxuICAgICAgICBzZWxmLl9zaXplID0gc2VsZi5fc2l6ZSArIDFcXG5cXG4gICAgZGVmIF9wdXQoc2VsZiwga2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlIHRvIHRoZSB0cmVlIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBrZXkgPCBjdXJyZW50X25vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5nZXRfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQgPSBBVkxUcmVlTm9kZShcXG4gICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIDAsIHBhcmVudD1jdXJyZW50X25vZGVcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9iYWxhbmNlKGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuZ2V0X2NoaWxkX3JpZ2h0KCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0ID0gQVZMVHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCAwLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYmFsYW5jZShjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiB1cGRhdGVfYmFsYW5jZShzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlVwZGF0ZSB0aGUgdHJlZSBiYWxhbmNlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBub2RlLmJhbGFuY2VfZmFjdG9yID4gMSBvciBub2RlLmJhbGFuY2VfZmFjdG9yIDwgLTE6XFxuICAgICAgICAgICAgc2VsZi5yZWJhbGFuY2Uobm9kZSlcXG4gICAgICAgICAgICByZXR1cm5cXG4gICAgICAgIGlmIG5vZGUucGFyZW50OlxcbiAgICAgICAgICAgIGlmIG5vZGUuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlX2ZhY3RvciArPSAxXFxuICAgICAgICAgICAgZWxpZiBub2RlLmlzX2NoaWxkX3JpZ2h0KCk6XFxuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LmJhbGFuY2VfZmFjdG9yIC09IDFcXG5cXG4gICAgICAgICAgICBpZiBub2RlLnBhcmVudC5iYWxhbmNlX2ZhY3RvciAhPSAwOlxcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9iYWxhbmNlKG5vZGUucGFyZW50KVxcblxcbiAgICBkZWYgcmViYWxhbmNlKHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmViYWxhbmNlIHRoZSB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBub2RlLmJhbGFuY2VfZmFjdG9yIDwgMDpcXG4gICAgICAgICAgICBpZiBub2RlLmNoaWxkX3JpZ2h0LmJhbGFuY2VfZmFjdG9yID4gMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBMUiBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9yaWdodChub2RlLmNoaWxkX3JpZ2h0KVxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9sZWZ0KG5vZGUpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgIyBzaW5nbGUgbGVmdFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9sZWZ0KG5vZGUpXFxuICAgICAgICBlbGlmIG5vZGUuYmFsYW5jZV9mYWN0b3IgPiAwOlxcbiAgICAgICAgICAgIGlmIG5vZGUuY2hpbGRfbGVmdC5iYWxhbmNlX2ZhY3RvciA8IDA6XFxuICAgICAgICAgICAgICAgICMgRG8gYW4gUkwgUm90YXRpb25cXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfbGVmdChub2RlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX3JpZ2h0KG5vZGUpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgIyBzaW5nbGUgcmlnaHRcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfcmlnaHQobm9kZSlcXG5cXG4gICAgZGVmIHJvdGF0ZV9sZWZ0KHNlbGYsIHJvdGF0aW9uX3Jvb3QpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTGVmdCByb3RhdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgbmV3X3Jvb3QgPSByb3RhdGlvbl9yb290LmNoaWxkX3JpZ2h0XFxuICAgICAgICByb3RhdGlvbl9yb290LmNoaWxkX3JpZ2h0ID0gbmV3X3Jvb3QuY2hpbGRfbGVmdFxcbiAgICAgICAgaWYgbmV3X3Jvb3QuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBuZXdfcm9vdC5jaGlsZF9sZWZ0LnBhcmVudCA9IHJvdGF0aW9uX3Jvb3RcXG4gICAgICAgIG5ld19yb290LnBhcmVudCA9IHJvdGF0aW9uX3Jvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RhdGlvbl9yb290LmlzX3Jvb3QoKTpcXG4gICAgICAgICAgICBzZWxmLl9yb290ID0gbmV3X3Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90YXRpb25fcm9vdC5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50LmNoaWxkX2xlZnQgPSBuZXdfcm9vdFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50LmNoaWxkX3JpZ2h0ID0gbmV3X3Jvb3RcXG4gICAgICAgIG5ld19yb290LmNoaWxkX2xlZnQgPSByb3RhdGlvbl9yb290XFxuICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudCA9IG5ld19yb290XFxuICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QuYmFsYW5jZV9mYWN0b3IgKyAxIC0gbWluKG5ld19yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcbiAgICAgICAgbmV3X3Jvb3QuYmFsYW5jZV9mYWN0b3IgPSAoXFxuICAgICAgICAgICAgbmV3X3Jvb3QuYmFsYW5jZV9mYWN0b3IgKyAxICsgbWF4KHJvdGF0aW9uX3Jvb3QuYmFsYW5jZV9mYWN0b3IsIDApXFxuICAgICAgICApXFxuXFxuICAgIGRlZiByb3RhdGVfcmlnaHQoc2VsZiwgcm90YXRpb25fcm9vdCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSaWdodCByb3RhdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgbmV3X3Jvb3QgPSByb3RhdGlvbl9yb290LmNoaWxkX2xlZnRcXG4gICAgICAgIHJvdGF0aW9uX3Jvb3QuY2hpbGRfbGVmdCA9IG5ld19yb290LmNoaWxkX3JpZ2h0XFxuICAgICAgICBpZiBuZXdfcm9vdC5jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBuZXdfcm9vdC5jaGlsZF9yaWdodC5wYXJlbnQgPSByb3RhdGlvbl9yb290XFxuICAgICAgICBuZXdfcm9vdC5wYXJlbnQgPSByb3RhdGlvbl9yb290LnBhcmVudFxcbiAgICAgICAgaWYgcm90YXRpb25fcm9vdC5pc19yb290KCk6XFxuICAgICAgICAgICAgc2VsZi5fcm9vdCA9IG5ld19yb290XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfY2hpbGRfcmlnaHQoKTpcXG4gICAgICAgICAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQuY2hpbGRfcmlnaHQgPSBuZXdfcm9vdFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50LmNoaWxkX2xlZnQgPSBuZXdfcm9vdFxcbiAgICAgICAgbmV3X3Jvb3QuY2hpbGRfcmlnaHQgPSByb3RhdGlvbl9yb290XFxuICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudCA9IG5ld19yb290XFxuICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QuYmFsYW5jZV9mYWN0b3IgLSAxIC0gbWF4KG5ld19yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcbiAgICAgICAgbmV3X3Jvb3QuYmFsYW5jZV9mYWN0b3IgPSAoXFxuICAgICAgICAgICAgbmV3X3Jvb3QuYmFsYW5jZV9mYWN0b3IgLSAxICsgbWluKHJvdGF0aW9uX3Jvb3QuYmFsYW5jZV9mYWN0b3IsIDApXFxuICAgICAgICApXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9iaW5hcnlfaGVhcC5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBCaW5hcnlIZWFwOlxcbiAgICBcXFwiXFxcIlxcXCJNaW5pbWFsIEJpbmFyeSBIZWFwXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhIGhlYXBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXAgPSBbXVxcblxcbiAgICBkZWYgX3BlcmNfdXAoc2VsZiwgY3VyX2lkeCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNb3ZlIGEgbm9kZSB1cFxcXCJcXFwiXFxcIlxcbiAgICAgICAgd2hpbGUgKGN1cl9pZHggLSAxKSAvLyAyID49IDA6XFxuICAgICAgICAgICAgcGFyZW50X2lkeCA9IChjdXJfaWR4IC0gMSkgLy8gMlxcbiAgICAgICAgICAgIGlmIHNlbGYuX2hlYXBbY3VyX2lkeF0gPCBzZWxmLl9oZWFwW3BhcmVudF9pZHhdOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLCBzZWxmLl9oZWFwW3BhcmVudF9pZHhdID0gKFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGVhcFtwYXJlbnRfaWR4XSxcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbY3VyX2lkeF0sXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICBjdXJfaWR4ID0gcGFyZW50X2lkeFxcblxcbiAgICBkZWYgX3BlcmNfZG93bihzZWxmLCBjdXJfaWR4KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1vdmUgYSBub2RlIGRvd25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHdoaWxlIDIgKiBjdXJfaWR4ICsgMSA8IGxlbihzZWxmLl9oZWFwKTpcXG4gICAgICAgICAgICBtaW5fY2hpbGRfaWR4ID0gc2VsZi5fZ2V0X21pbl9jaGlsZChjdXJfaWR4KVxcbiAgICAgICAgICAgIGlmIHNlbGYuX2hlYXBbY3VyX2lkeF0gPiBzZWxmLl9oZWFwW21pbl9jaGlsZF9pZHhdOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLCBzZWxmLl9oZWFwW21pbl9jaGlsZF9pZHhdID0gKFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGVhcFttaW5fY2hpbGRfaWR4XSxcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbY3VyX2lkeF0sXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm5cXG4gICAgICAgICAgICBjdXJfaWR4ID0gbWluX2NoaWxkX2lkeFxcblxcbiAgICBkZWYgX2dldF9taW5fY2hpbGQoc2VsZiwgcGFyZW50X2lkeCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgYSBzbWFsbGVyIGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiAyICogcGFyZW50X2lkeCArIDIgPiBsZW4oc2VsZi5faGVhcCkgLSAxOlxcbiAgICAgICAgICAgIHJldHVybiAyICogcGFyZW50X2lkeCArIDFcXG4gICAgICAgIGlmIHNlbGYuX2hlYXBbMiAqIHBhcmVudF9pZHggKyAxXSA8IHNlbGYuX2hlYXBbMiAqIHBhcmVudF9pZHggKyAyXTpcXG4gICAgICAgICAgICByZXR1cm4gMiAqIHBhcmVudF9pZHggKyAxXFxuICAgICAgICByZXR1cm4gMiAqIHBhcmVudF9pZHggKyAyXFxuXFxuICAgIGRlZiBoZWFwaWZ5KHNlbGYsIG5vdF9hX2hlYXAsIHNob3dfZGV0YWlscz1GYWxzZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJCdWlsZCBhIGhlYXAgZnJvbSBhbnkgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhcCA9IG5vdF9hX2hlYXBbOl1cXG4gICAgICAgIGN1cl9pZHggPSBsZW4oc2VsZi5faGVhcCkgLy8gMiAtIDFcXG4gICAgICAgIHdoaWxlIGN1cl9pZHggPj0gMDpcXG4gICAgICAgICAgICBzZWxmLl9wZXJjX2Rvd24oY3VyX2lkeClcXG4gICAgICAgICAgICBjdXJfaWR4ID0gY3VyX2lkeCAtIDFcXG4gICAgICAgICAgICBpZiBzaG93X2RldGFpbHM6XFxuICAgICAgICAgICAgICAgIHByaW50KHNlbGYuX2hlYXApXFxuXFxuICAgIGRlZiBpbnNlcnQoc2VsZiwgaXRlbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYSBuZXcgaXRlbVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhcC5hcHBlbmQoaXRlbSlcXG4gICAgICAgIHNlbGYuX3BlcmNfdXAobGVuKHNlbGYuX2hlYXApIC0gMSlcXG5cXG4gICAgZGVmIGRlbGV0ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbiBpdGVtXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9oZWFwWzBdLCBzZWxmLl9oZWFwWy0xXSA9IHNlbGYuX2hlYXBbLTFdLCBzZWxmLl9oZWFwWzBdXFxuICAgICAgICByZXN1bHQgPSBzZWxmLl9oZWFwLnBvcCgpXFxuICAgICAgICBzZWxmLl9wZXJjX2Rvd24oMClcXG4gICAgICAgIHJldHVybiByZXN1bHRcXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIGhlYXAgaXMgZW1wdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBub3QgYm9vbChzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBoZWFwIHNpemVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5faGVhcClcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJIZWFwIGFzIGEgc3RyaW5nXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYuX2hlYXApXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfX2NvbnRhaW5zX19pbiBtZXRob2Qgb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBpdGVtIGluIHNlbGYuX2hlYXBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3RyZWVzL2JpbmFyeV9zZWFyY2hfdHJlZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNSwgMjAxMFxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBCaW5hcnlUcmVlTm9kZTpcXG4gICAgXFxcIlxcXCJcXFwiQmluYXJ5IFRyZWUgTm9kZSBjbGFzc1xcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5LCB2YWx1ZSwgbGVmdD1Ob25lLCByaWdodD1Ob25lLCBwYXJlbnQ9Tm9uZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IFRyZWUgTm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbGVmdFxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSByaWdodFxcbiAgICAgICAgc2VsZi5fcGFyZW50ID0gcGFyZW50XFxuXFxuICAgIGRlZiBnZXRfY2hpbGRfbGVmdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbm9kZSdzIGxlZnQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9sZWZ0XFxuXFxuICAgIGRlZiBzZXRfY2hpbGRfbGVmdChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFzc2lnbiB0aGUgbm9kZSdzIGxlZnQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBub2RlXFxuXFxuICAgIGNoaWxkX2xlZnQgPSBwcm9wZXJ0eShnZXRfY2hpbGRfbGVmdCwgc2V0X2NoaWxkX2xlZnQpXFxuXFxuICAgIGRlZiBnZXRfY2hpbGRfcmlnaHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIG5vZGUncyByaWdodCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkX3JpZ2h0XFxuXFxuICAgIGRlZiBzZXRfY2hpbGRfcmlnaHQoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBc3NpZ24gdGhlIG5vZGUncyByaWdodCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSBub2RlXFxuXFxuICAgIGNoaWxkX3JpZ2h0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX3JpZ2h0LCBzZXRfY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBnZXRfcGFyZW50KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBub2RlJ3MgcGFyZW50XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fcGFyZW50XFxuXFxuICAgIGRlZiBzZXRfcGFyZW50KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQXNzaWduIHRoZSBub2RlJ3MgcGFyZW50XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9wYXJlbnQgPSBub2RlXFxuXFxuICAgIHBhcmVudCA9IHByb3BlcnR5KGdldF9wYXJlbnQsIHNldF9wYXJlbnQpXFxuXFxuICAgIGRlZiBpc19jaGlsZF9sZWZ0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaXMgYSBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9wYXJlbnQuY2hpbGRfbGVmdCA9PSBzZWxmXFxuXFxuICAgIGRlZiBpc19jaGlsZF9yaWdodChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9PSBzZWxmXFxuXFxuICAgIGRlZiBpc19yb290KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaXMgYSB0cmVlIHJvb3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBub3Qgc2VsZi5fcGFyZW50XFxuXFxuICAgIGRlZiBpc19sZWFmKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaXMgYSBsZWFmXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IChzZWxmLl9jaGlsZF9yaWdodCBvciBzZWxmLl9jaGlsZF9sZWZ0KVxcblxcbiAgICBkZWYgaGFzX2FfY2hpbGQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgbm9kZSBoYXMgYW55IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHQgb3Igc2VsZi5fY2hpbGRfbGVmdFxcblxcbiAgICBkZWYgaGFzX2NoaWxkcmVuKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaGFzIGJvdGggY2hpbGRyZW5cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9yaWdodCBhbmQgc2VsZi5fY2hpbGRfbGVmdFxcblxcbiAgICBkZWYgZ2V0X2tleShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBub2RlIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBkZWYgc2V0X2tleShzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5vZGUga2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG5cXG4gICAga2V5ID0gcHJvcGVydHkoZ2V0X2tleSwgc2V0X2tleSlcXG5cXG4gICAgZGVmIGdldF92YWx1ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBub2RlIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWVcXG5cXG4gICAgZGVmIHNldF92YWx1ZShzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgbm9kZSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZVxcblxcbiAgICB2YWx1ZSA9IHByb3BlcnR5KGdldF92YWx1ZSwgc2V0X3ZhbHVlKVxcblxcbiAgICBkZWYgcmVwbGFjZV9wYXlsb2FkKHNlbGYsIGtleSwgdmFsdWUsIGxlZnQsIHJpZ2h0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoYW5nZSBub2RlIHBheWxvYWRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZVxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IGxlZnRcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gcmlnaHRcXG4gICAgICAgIGlmIHNlbGYuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnBhcmVudCA9IHNlbGZcXG4gICAgICAgIGlmIHNlbGYuY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQucGFyZW50ID0gc2VsZlxcblxcbiAgICBkZWYgZmluZF9zdWNjZXNzb3Ioc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBub2RlJ3Mgc3VjY2Vzc29yXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdWNjZXNzb3IgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBzdWNjZXNzb3IgPSBzZWxmLl9jaGlsZF9yaWdodC5maW5kX21pbigpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYuX3BhcmVudDpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzb3IgPSBzZWxmLl9wYXJlbnRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IE5vbmVcXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NvciA9IHNlbGYuX3BhcmVudC5maW5kX3N1Y2Nlc3NvcigpXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPSBzZWxmXFxuICAgICAgICByZXR1cm4gc3VjY2Vzc29yXFxuXFxuICAgIGRlZiBmaW5kX21pbihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZpbmQgdGhlIHNtYWxsZXN0IG5vZGUgaW4gdGhlIHJpZ2h0IHN1YnRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmXFxuICAgICAgICB3aGlsZSBjdXJyZW50LmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGRfbGVmdFxcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRcXG5cXG4gICAgZGVmIHNwbGljZV9vdXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTcGxpY2Ugb3V0XFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLmlzX2xlYWYoKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX2xlZnQgPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID0gTm9uZVxcbiAgICAgICAgZWxpZiBzZWxmLmhhc19hX2NoaWxkKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID0gc2VsZi5fY2hpbGRfbGVmdFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID0gc2VsZi5fY2hpbGRfbGVmdFxcbiAgICAgICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnBhcmVudCA9IHNlbGYuX3BhcmVudFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX2xlZnQgPSBzZWxmLl9jaGlsZF9yaWdodFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID0gc2VsZi5fY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQucGFyZW50ID0gc2VsZi5fcGFyZW50XFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRoZSBzdGFuZGFyZCBpbm9yZGVyIHRyYXZlcnNhbCBvZiBhIGJpbmFyeSB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmOlxcbiAgICAgICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtXFxuICAgICAgICAgICAgeWllbGQgc2VsZi5fa2V5XFxuICAgICAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcblxcblxcbmNsYXNzIEJpbmFyeVNlYXJjaFRyZWU6XFxuICAgIFxcXCJcXFwiXFxcIkJpbmFyeSBzZWFyY2ggdHJlZSBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLl9yb290ID0gTm9uZVxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IDBcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUcmVlIHNpemVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVHJlZSBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZVxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJdGVyYXRvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3Jvb3QuX19pdGVyX18oKVxcblxcbiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIltdIGdldHRlciBvcGVyYXRvciBvdmVycmlkZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmVzdWx0ID0gc2VsZi5nZXQoa2V5KVxcbiAgICAgICAgaWYgcmVzdWx0OlxcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcXG4gICAgICAgIHJhaXNlIEtleUVycm9yKFxcXCJFcnJvciwga2V5IG5vdCBpbiB0cmVlXFxcIilcXG5cXG4gICAgZGVmIGdldF9yb290KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRyZWUgcm9vdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3Jvb3RcXG5cXG4gICAgZGVmIHNldF9yb290KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHRyZWUgcm9vdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcm9vdCA9IG5vZGVcXG5cXG4gICAgcm9vdCA9IHByb3BlcnR5KGdldF9yb290LCBzZXRfcm9vdClcXG5cXG4gICAgZGVmIGdldChzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0cmlldmUgYSB2YWx1ZSBieSB0aGUga2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2dldChrZXksIHNlbGYuX3Jvb3QpXFxuICAgICAgICAgICAgaWYgcmVzdWx0OlxcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlXFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9nZXQoc2VsZiwga2V5LCBjdXJyZW50X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0cmlldmUgYSB2YWx1ZSBieSB0aGUga2V5IChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBub3QgY3VycmVudF9ub2RlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBpZiBjdXJyZW50X25vZGUua2V5ID09IGtleTpcXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudF9ub2RlXFxuICAgICAgICBlbGlmIGtleSA8IGN1cnJlbnRfbm9kZS5rZXk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldChrZXksIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KGtleSwgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJbXSBzZXR0ZXIgb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYucHV0KGtleSwgdmFsdWUpXFxuXFxuICAgIGRlZiBwdXQoc2VsZiwga2V5LCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3Jvb3Q6XFxuICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIHNlbGYuX3Jvb3QpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBCaW5hcnlUcmVlTm9kZShrZXksIHZhbHVlKVxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgKyAxXFxuXFxuICAgIGRlZiBfcHV0KHNlbGYsIGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgbmV3IG5vZGUgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGtleSA8IGN1cnJlbnRfbm9kZS5rZXk6XFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdCA9IEJpbmFyeVRyZWVOb2RlKFxcbiAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSwgcGFyZW50PWN1cnJlbnRfbm9kZVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQgPSBCaW5hcnlUcmVlTm9kZShcXG4gICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIHBhcmVudD1jdXJyZW50X25vZGVcXG4gICAgICAgICAgICAgICAgKVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJpbiBvcGVyYXRvciBvdmVycmlkZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fZ2V0KGtleSwgc2VsZi5fcm9vdCkpXFxuXFxuICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGVsIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLmRlbGV0ZShrZXkpXFxuXFxuICAgIGRlZiBkZWxldGUoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhIG5vZGUgYnkgaXRzIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fc2l6ZSA+IDE6XFxuICAgICAgICAgICAgbm9kZV90b19yZW1vdmUgPSBzZWxmLl9nZXQoa2V5LCBzZWxmLl9yb290KVxcbiAgICAgICAgICAgIGlmIG5vZGVfdG9fcmVtb3ZlOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9kZWxldGUobm9kZV90b19yZW1vdmUpXFxuICAgICAgICAgICAgICAgIHNlbGYuX3NpemUgPSBzZWxmLl9zaXplIC0gMVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKFxcXCJFcnJvciwga2V5IG5vdCBpbiB0cmVlXFxcIilcXG4gICAgICAgIGVsaWYgc2VsZi5fc2l6ZSA9PSAxIGFuZCBzZWxmLl9yb290LmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgc2VsZi5fcm9vdCA9IE5vbmVcXG4gICAgICAgICAgICBzZWxmLl9zaXplID0gc2VsZi5fc2l6ZSAtIDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoXFxcIkVycm9yLCBrZXkgbm90IGluIHRyZWVcXFwiKVxcblxcbiAgICBkZWYgX2RlbGV0ZShzZWxmLCBjdXJyZW50X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSBieSBpdHMga2V5IChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBjdXJyZW50X25vZGUuaXNfbGVhZigpOiAgIyByZW1vdmluZyBhIGxlYWZcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUgPT0gY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNoaWxkX2xlZnQgPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9yaWdodCA9IE5vbmVcXG4gICAgICAgIGVsaWYgY3VycmVudF9ub2RlLmhhc19jaGlsZHJlbigpOiAgIyByZW1vdmluZyBhIG5vZGUgd2l0aCB0d28gY2hpbGRyZW5cXG4gICAgICAgICAgICBzdWNjZXNzb3IgPSBjdXJyZW50X25vZGUuZmluZF9zdWNjZXNzb3IoKVxcbiAgICAgICAgICAgIHN1Y2Nlc3Nvci5zcGxpY2Vfb3V0KClcXG4gICAgICAgICAgICBjdXJyZW50X25vZGUua2V5ID0gc3VjY2Vzc29yLmtleVxcbiAgICAgICAgICAgIGN1cnJlbnRfbm9kZS52YWx1ZSA9IHN1Y2Nlc3Nvci52YWx1ZVxcbiAgICAgICAgZWxzZTogICMgcmVtb3ZpbmcgYSBub2RlIHdpdGggb25lIGNoaWxkXFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmdldF9jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5wYXJlbnQgPSBjdXJyZW50X25vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNoaWxkX2xlZnQgPSBjdXJyZW50X25vZGUuY2hpbGRfbGVmdFxcbiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnRfbm9kZS5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQucGFyZW50ID0gY3VycmVudF9ub2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9yaWdodCA9IGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucmVwbGFjZV9wYXlsb2FkKFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0LmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC52YWx1ZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5jaGlsZF9sZWZ0LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0LmNoaWxkX3JpZ2h0LFxcbiAgICAgICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQucGFyZW50ID0gY3VycmVudF9ub2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0ID0gY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0XFxuICAgICAgICAgICAgICAgIGVsaWYgY3VycmVudF9ub2RlLmlzX2NoaWxkX3JpZ2h0KCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQucGFyZW50ID0gY3VycmVudF9ub2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9yaWdodCA9IGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnJlcGxhY2VfcGF5bG9hZChcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQua2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodC52YWx1ZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQuY2hpbGRfbGVmdCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQuY2hpbGRfcmlnaHQsXFxuICAgICAgICAgICAgICAgICAgICApXFxuXFxuICAgIGRlZiBpbm9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSW4tb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2lub3JkZXIoc2VsZi5fcm9vdClcXG5cXG4gICAgZGVmIF9pbm9yZGVyKHNlbGYsIHRyZWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSW4tb3JkZXIgdHJlZSB0cmF2ZXJzYWwgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHRyZWU6XFxuICAgICAgICAgICAgc2VsZi5faW5vcmRlcih0cmVlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgcHJpbnQodHJlZS5rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICAgICAgc2VsZi5faW5vcmRlcih0cmVlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgcG9zdG9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUG9zdC1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHNlbGYuX3Jvb3QpXFxuXFxuICAgIGRlZiBfcG9zdG9yZGVyKHNlbGYsIHRyZWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUG9zdC1vcmRlciB0cmVlIHRyYXZlcnNhbCAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgdHJlZTpcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZXIodHJlZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlcih0cmVlLmNoaWxkX3JpZ2h0KVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5LCBlbmQ9XFxcIiBcXFwiKVxcblxcbiAgICBkZWYgcHJlb3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQcmUtb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3ByZW9yZGVyKHNlbGYuX3Jvb3QpXFxuXFxuICAgIGRlZiBfcHJlb3JkZXIoc2VsZiwgdHJlZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQcmUtb3JkZXIgdHJlZSB0cmF2ZXJzYWwgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHRyZWU6XFxuICAgICAgICAgICAgcHJpbnQodHJlZS5rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICAgICAgc2VsZi5fcHJlb3JkZXIodHJlZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVyKHRyZWUuY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBjbGVhcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbGwgbm9kZXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHdoaWxlIHNlbGYuX3Jvb3Q6XFxuICAgICAgICAgICAgc2VsZi5kZWxldGUoc2VsZi5fcm9vdC5rZXkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9iaW5hcnlfdHJlZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5pbXBvcnQgb3BlcmF0b3JcXG5cXG5cXG5jbGFzcyBCaW5hcnlUcmVlOlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgQSByZWN1cnNpdmUgaW1wbGVtZW50YXRpb24gb2YgQmluYXJ5IFRyZWVcXG4gICAgVXNpbmcgbGlua3MgYW5kIE5vZGVzIGFwcHJvYWNoLlxcblxcbiAgICBNb2RpZmllZCB0byBhbGxvdyBmb3IgdHJlZXMgdG8gYmUgY29uc3RydWN0ZWQgZnJvbSBvdGhlciB0cmVlc1xcbiAgICByYXRoZXIgdGhhbiBhbHdheXMgY3JlYXRpbmcgYSBuZXcgdHJlZSBpbiB0aGUgaW5zZXJ0X2ZlZnQgb3IgaW5zZXJ0X3JpZ2h0XFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gTm9uZVxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSBOb25lXFxuXFxuICAgIGRlZiBnZXRfcm9vdF92YWwoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgcm9vdCBrZXkgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9rZXlcXG5cXG4gICAgZGVmIHNldF9yb290X3ZhbChzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHJvb3Qga2V5IHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG5cXG4gICAgcm9vdCA9IHByb3BlcnR5KGdldF9yb290X3ZhbCwgc2V0X3Jvb3RfdmFsKVxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX2xlZnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbGVmdCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIHNldF9jaGlsZF9sZWZ0KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IGxlZnQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBub2RlXFxuXFxuICAgIGNoaWxkX2xlZnQgPSBwcm9wZXJ0eShnZXRfY2hpbGRfbGVmdCwgc2V0X2NoaWxkX2xlZnQpXFxuXFxuICAgIGRlZiBnZXRfY2hpbGRfcmlnaHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9yaWdodFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX3JpZ2h0KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IG5vZGVcXG5cXG4gICAgY2hpbGRfcmlnaHQgPSBwcm9wZXJ0eShnZXRfY2hpbGRfcmlnaHQsIHNldF9jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIGlzX2xlYWYoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiBhIG5vZGUgaXMgbGVhZlxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIChub3Qgc2VsZi5fY2hpbGRfbGVmdCkgYW5kIChub3Qgc2VsZi5fY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBpbnNlcnRfbGVmdChzZWxmLCBuZXdfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbnNlcnQgbGVmdCBzdWJ0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKG5ld19ub2RlLCBCaW5hcnlUcmVlKTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IG5ld19ub2RlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlID0gQmluYXJ5VHJlZShuZXdfbm9kZSlcXG5cXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUuc2V0X2NoaWxkX2xlZnQoc2VsZi5fY2hpbGRfbGVmdClcXG5cXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBuZXdfc3VidHJlZVxcblxcbiAgICBkZWYgaW5zZXJ0X3JpZ2h0KHNlbGYsIG5ld19ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluc2VydCByaWdodCBzdWJ0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKG5ld19ub2RlLCBCaW5hcnlUcmVlKTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IG5ld19ub2RlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlID0gQmluYXJ5VHJlZShuZXdfbm9kZSlcXG5cXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlLnNldF9jaGlsZF9yaWdodChzZWxmLl9jaGlsZF9yaWdodClcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gbmV3X3N1YnRyZWVcXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQucHJlb3JkZXIoKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQucHJlb3JkZXIoKVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQuaW5vcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9yaWdodC5pbm9yZGVyKClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3Qtb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wb3N0b3JkZXIoKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQucG9zdG9yZGVyKClcXG4gICAgICAgIHByaW50KHNlbGYuX2tleSwgZW5kPVxcXCIgXFxcIilcXG5cXG4gICAgZGVmIHByaW50X2V4cChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByaW50IGFuIGV4cHJlc3Npb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgcHJpbnQoXFxcIihcXFwiLCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQucHJpbnRfZXhwKClcXG4gICAgICAgIHByaW50KHNlbGYuX2tleSwgZW5kPVxcXCIgXFxcIilcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnByaW50X2V4cCgpXFxuICAgICAgICAgICAgcHJpbnQoXFxcIilcXFwiLCBlbmQ9XFxcIiBcXFwiKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyX2V2YWwoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQb3N0b3JkZXIgZXZhbHVhdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgb3BlcmF0aW9ucyA9IHtcXG4gICAgICAgICAgICBcXFwiK1xcXCI6IG9wZXJhdG9yLmFkZCxcXG4gICAgICAgICAgICBcXFwiLVxcXCI6IG9wZXJhdG9yLnN1YixcXG4gICAgICAgICAgICBcXFwiKlxcXCI6IG9wZXJhdG9yLm11bCxcXG4gICAgICAgICAgICBcXFwiL1xcXCI6IG9wZXJhdG9yLnRydWVkaXYsXFxuICAgICAgICB9XFxuICAgICAgICByZXN1bHRfMSA9IE5vbmVcXG4gICAgICAgIHJlc3VsdF8yID0gTm9uZVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICByZXN1bHRfMSA9IHNlbGYuX2NoaWxkX2xlZnQucG9zdG9yZGVyX2V2YWwoKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgcmVzdWx0XzIgPSBzZWxmLl9jaGlsZF9yaWdodC5wb3N0b3JkZXJfZXZhbCgpXFxuICAgICAgICBpZiByZXN1bHRfMSBhbmQgcmVzdWx0XzI6XFxuICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbnNbc2VsZi5fa2V5XShyZXN1bHRfMSwgcmVzdWx0XzIpXFxuICAgICAgICByZXR1cm4gc2VsZi5fa2V5XFxuXFxuICAgIGRlZiBoZWlnaHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJIZWlnaHQgb2YgYSB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBub3Qgc2VsZi5fa2V5OlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBoZWlnaHRfbGVmdCA9IHNlbGYuX2NoaWxkX2xlZnQuaGVpZ2h0KClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaGVpZ2h0X2xlZnQgPSAtMVxcblxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgaGVpZ2h0X3JpZ2h0ID0gc2VsZi5fY2hpbGRfcmlnaHQuaGVpZ2h0KClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaGVpZ2h0X3JpZ2h0ID0gLTFcXG5cXG4gICAgICAgIHJldHVybiAxICsgbWF4KGhlaWdodF9sZWZ0LCBoZWlnaHRfcmlnaHQpXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2l6ZSBvZiBhIHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLnNpemUoKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvdW50IG5vZGVzIGluIGEgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IHNlbGYuX2tleTpcXG4gICAgICAgICAgICByZXR1cm4gMFxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBjaGlsZHJlbl9sZWZ0ID0gc2VsZi5fY2hpbGRfbGVmdC5zaXplKClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgY2hpbGRyZW5fbGVmdCA9IDBcXG5cXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIGNoaWxkcmVuX3JpZ2h0ID0gc2VsZi5fY2hpbGRfcmlnaHQuc2l6ZSgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNoaWxkcmVuX3JpZ2h0ID0gMFxcblxcbiAgICAgICAgcmV0dXJuIDEgKyBjaGlsZHJlbl9sZWZ0ICsgY2hpbGRyZW5fcmlnaHRcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3RyZWVzL3ByaW9yaXR5X3F1ZXVlLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV9oZWFwIGltcG9ydCBCaW5hcnlIZWFwXFxuXFxuXFxuY2xhc3MgUHJpb3JpdHlRdWV1ZShCaW5hcnlIZWFwKTpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IGhlYXAgdGFrZXMgKGtleSwgdmFsdWUpIHBhaXJzIHdoZXJlIGtleSBzaWduaWZpZXMgcHJpb3JpdHlcXG4gICAgV2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUga2V5cyBhcmUgYWxsIGNvbXBhcmFibGUuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgY2hhbmdlX3ByaW9yaXR5KHNlbGYsIG5ld19wcmlvcml0eSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hhbmdlIHRoZSBwcmlvcml0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAga2V5X3RvX21vdmUgPSAwXFxuICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5faGVhcCkpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuX2hlYXBbaV1bMV0gPT0gdmFsdWU6XFxuICAgICAgICAgICAgICAgIGtleV90b19tb3ZlID0gaVxcbiAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgaWYga2V5X3RvX21vdmUgPiAtMTpcXG4gICAgICAgICAgICBzZWxmLl9oZWFwW2tleV90b19tb3ZlXSA9IChuZXdfcHJpb3JpdHksIHNlbGYuX2hlYXBba2V5X3RvX21vdmVdWzFdKVxcbiAgICAgICAgICAgIHNlbGYuX3BlcmNfdXAoa2V5X3RvX21vdmUpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL19faW5pdF9fLnB5XCI6XCJcIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9fX2luaXRfXy5weVwiOlwiXFxuXFxuXFxuZnJvbSAuYXZsIGltcG9ydCBBcmJvbEFWTFxcbmZyb20gLmFiYiBpbXBvcnQgQXJib2xCaW5hcmlvQnVzcXVlZGFcXG5mcm9tIC5tb250aWN1bG9CaW5hcmlvIGltcG9ydCBNb250aWN1bG9CaW5hcmlvXFxuXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvYWJiLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuI1xcbiNhYmIucHlcXG5cXG5jbGFzcyBBcmJvbEJpbmFyaW9CdXNxdWVkYTpcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5yYWl6ID0gTm9uZVxcbiAgICAgICAgc2VsZi50YW1hbm8gPSAwXFxuXFxuICAgIGRlZiBhZ3JlZ2FyKHNlbGYsY2xhdmUsdmFsb3IpOlxcbiAgICAgICAgaWYgc2VsZi5yYWl6OlxcbiAgICAgICAgICAgIHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isc2VsZi5yYWl6KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLnJhaXogPSBOb2RvQXJib2woY2xhdmUsdmFsb3IpXFxuICAgICAgICBzZWxmLnRhbWFubyA9IHNlbGYudGFtYW5vICsgMVxcblxcbiAgICBkZWYgX2FncmVnYXIoc2VsZixjbGF2ZSx2YWxvcixub2RvQWN0dWFsKTpcXG4gICAgICAgIGlmIGNsYXZlIDwgbm9kb0FjdHVhbC5jbGF2ZTpcXG4gICAgICAgICAgICBpZiBub2RvQWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICBzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkbylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8gPSBOb2RvQXJib2woY2xhdmUsdmFsb3IscGFkcmU9bm9kb0FjdHVhbClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgICAgICAgIHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvRGVyZWNobylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9EZXJlY2hvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuIFxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZixjLHYpOlxcbiAgICAgICAgc2VsZi5hZ3JlZ2FyKGMsdilcXG5cXG4gICAgZGVmIG9idGVuZXIoc2VsZixjbGF2ZSk6XFxuICAgICAgICBpZiBzZWxmLnJhaXo6XFxuICAgICAgICAgICAgcmVzID0gc2VsZi5fb2J0ZW5lcihjbGF2ZSxzZWxmLnJhaXopXFxuICAgICAgICAgICAgaWYgcmVzOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmNhcmdhVXRpbFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuXFxuICAgIGRlZiBfb2J0ZW5lcihzZWxmLGNsYXZlLG5vZG9BY3R1YWwpOlxcbiAgICBcXHRpZiBub3Qgbm9kb0FjdHVhbDpcXG4gICAgXFx0ICAgIHJldHVybiBOb25lXFxuICAgIFxcdGVsaWYgbm9kb0FjdHVhbC5jbGF2ZSA9PSBjbGF2ZTpcXG4gICAgXFx0ICAgIHJldHVybiBub2RvQWN0dWFsXFxuICAgIFxcdGVsaWYgY2xhdmUgPCBub2RvQWN0dWFsLmNsYXZlOlxcbiAgICBcXHQgICAgcmV0dXJuIHNlbGYuX29idGVuZXIoY2xhdmUsbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgcmV0dXJuIHNlbGYuX29idGVuZXIoY2xhdmUsbm9kb0FjdHVhbC5oaWpvRGVyZWNobykgICAgICAgIFxcblxcbiAgICBkZWYgX19nZXRpdGVtX18oc2VsZixjbGF2ZSk6XFxuICAgICAgICByZXMgPSBzZWxmLm9idGVuZXIoY2xhdmUpIFxcbiAgICAgICAgaWYgcmVzOlxcbiAgICAgICAgICAgIHJldHVybiByZXNcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBsYSBjbGF2ZSBubyBlc3TDoSBlbiBlbCDDoXJib2wnKVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsY2xhdmUpOlxcbiAgICBcXHRpZiBzZWxmLl9vYnRlbmVyKGNsYXZlLHNlbGYucmFpeik6XFxuICAgIFxcdCAgICByZXR1cm4gVHJ1ZVxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgcmV0dXJuIEZhbHNlXFxuICAgICAgIFxcbiAgICBkZWYgbG9uZ2l0dWQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi50YW1hbm9cXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi50YW1hbm9cXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucmFpei5fX2l0ZXJfXygpXFxuXFxuICAgIGRlZiBlbGltaW5hcihzZWxmLGNsYXZlKTpcXG4gICAgICAgIGlmIHNlbGYudGFtYW5vID4gMTpcXG4gICAgICAgICAgIG5vZG9BRWxpbWluYXIgPSBzZWxmLl9vYnRlbmVyKGNsYXZlLHNlbGYucmFpeilcXG4gICAgXFx0ICAgaWYgbm9kb0FFbGltaW5hcjpcXG4gICAgXFx0ICAgICAgIHNlbGYucmVtb3Zlcihub2RvQUVsaW1pbmFyKVxcbiAgICBcXHQgICAgICAgc2VsZi50YW1hbm8gPSBzZWxmLnRhbWFuby0xXFxuICAgIFxcdCAgIGVsc2U6XFxuICAgIFxcdCAgICAgICByYWlzZSBLZXlFcnJvcignRXJyb3IsIGxhIGNsYXZlIG5vIGVzdMOhIGVuIGVsIMOhcmJvbCcpXFxuICAgICAgICBlbGlmIHNlbGYudGFtYW5vID09IDEgYW5kIHNlbGYucmFpei5jbGF2ZSA9PSBjbGF2ZTpcXG4gICAgXFx0ICAgIHNlbGYucmFpeiA9IE5vbmVcXG4gICAgXFx0ICAgIHNlbGYudGFtYW5vID0gc2VsZi50YW1hbm8gLSAxXFxuICAgICAgICBlbHNlOlxcbiAgICBcXHQgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBsYSBjbGF2ZSBubyBlc3TDoSBlbiBlbCDDoXJib2wnKVxcblxcbiAgICBkZWYgX19kZWxpdGVtX18oc2VsZixjbGF2ZSk6XFxuICAgICAgICBzZWxmLmVsaW1pbmFyKGNsYXZlKVxcblxcbiAgICBkZWYgcmVtb3ZlcihzZWxmLG5vZG9BY3R1YWwpOlxcbiAgICAgICAgaWYgbm9kb0FjdHVhbC5lc0hvamEoKTogI2hvamFcXG4gICAgICAgICAgICBpZiBub2RvQWN0dWFsID09IG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5wYWRyZS5oaWpvSXpxdWllcmRvID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgICAgICBlbGlmIG5vZG9BY3R1YWwudGllbmVBbWJvc0hpam9zKCk6ICNpbnRlcmlvclxcbiAgICAgICAgICAgIHN1YyA9IG5vZG9BY3R1YWwuZW5jb250cmFyU3VjZXNvcigpXFxuICAgICAgICAgICAgc3VjLmVtcGFsbWFyKClcXG4gICAgICAgICAgICBub2RvQWN0dWFsLmNsYXZlID0gc3VjLmNsYXZlXFxuICAgICAgICAgICAgbm9kb0FjdHVhbC5jYXJnYVV0aWwgPSBzdWMuY2FyZ2FVdGlsXFxuXFxuICAgICAgICBlbHNlOiAjIGVzdGUgbm9kbyB0aWVuZSB1biAoMSkgaGlqb1xcbiAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9JenF1aWVyZG8gPSBub2RvQWN0dWFsLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgZWxpZiBub2RvQWN0dWFsLmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5wYWRyZSA9IG5vZG9BY3R1YWwucGFkcmVcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0RlcmVjaG8gPSBub2RvQWN0dWFsLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucmVlbXBsYXphckRhdG9EZU5vZG8obm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmNsYXZlLCBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8uY2FyZ2FVdGlsLCBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8uaGlqb0l6cXVpZXJkbywgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmhpam9EZXJlY2hvKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9EZXJlY2hvLnBhZHJlID0gbm9kb0FjdHVhbC5wYWRyZVxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5wYWRyZS5oaWpvSXpxdWllcmRvID0gbm9kb0FjdHVhbC5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBlbGlmIG5vZG9BY3R1YWwuZXNIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5wYWRyZSA9IG5vZG9BY3R1YWwucGFkcmVcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0RlcmVjaG8gPSBub2RvQWN0dWFsLmhpam9EZXJlY2hvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnJlZW1wbGF6YXJEYXRvRGVOb2RvKG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8uY2xhdmUsIG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8uY2FyZ2FVdGlsLCBub2RvQWN0dWFsLmhpam9EZXJlY2hvLmhpam9JenF1aWVyZG8sIG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8uaGlqb0RlcmVjaG8pXFxuXFxuICAgIGRlZiBpbm9yZGVuKHNlbGYpOlxcbiAgICAgICAgc2VsZi5faW5vcmRlbihzZWxmLnJhaXopXFxuXFxuICAgIGRlZiBfaW5vcmRlbihzZWxmLGFyYm9sKTpcXG4gICAgICAgIGlmIGFyYm9sICE9IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5faW5vcmRlbihhcmJvbC5oaWpvSXpxdWllcmRvKVxcbiAgICAgICAgICAgIHByaW50KGFyYm9sLmNsYXZlKVxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZW4oYXJib2wuaGlqb0RlcmVjaG8pXFxuXFxuICAgIGRlZiBwb3N0b3JkZW4oc2VsZik6XFxuICAgICAgICBzZWxmLl9wb3N0b3JkZW4oc2VsZi5yYWl6KVxcblxcbiAgICBkZWYgX3Bvc3RvcmRlbihzZWxmLCBhcmJvbCk6XFxuICAgICAgICBpZiBhcmJvbDpcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZW4oYXJib2wuaGlqb0RlcmVjaG8pXFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVuKGFyYm9sLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgcHJpbnQoYXJib2wuY2xhdmUpICAgICAgICAgICAgXFxuXFxuICAgIGRlZiBwcmVvcmRlbihzZWxmKTpcXG4gICAgICAgIHNlbGYuX3ByZW9yZGVuKHNlbGYsc2VsZi5yYWl6KVxcblxcbiAgICBkZWYgX3ByZW9yZGVuKHNlbGYsYXJib2wpOlxcbiAgICAgICAgaWYgYXJib2w6XFxuICAgICAgICAgICAgcHJpbnQoYXJib2wuY2xhdmUpICAgICAgICAgICAgXFxuICAgICAgICAgICAgc2VsZi5fcHJlb3JkZW4oYXJib2wuaGlqb0l6cXVpZXJkbylcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlbihhcmJvbC5oaWpvRGVyZWNobylcXG5cXG5cXG5jbGFzcyBOb2RvQXJib2w6XFxuICAgZGVmIF9faW5pdF9fKHNlbGYsY2xhdmUsdmFsb3IsaXpxdWllcmRvPU5vbmUsZGVyZWNobz1Ob25lLHBhZHJlPU5vbmUpOlxcbiAgICAgICAgc2VsZi5jbGF2ZSA9IGNsYXZlXFxuICAgICAgICBzZWxmLmNhcmdhVXRpbCA9IHZhbG9yXFxuICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8gPSBpenF1aWVyZG9cXG4gICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBkZXJlY2hvXFxuICAgICAgICBzZWxmLnBhZHJlID0gcGFkcmVcXG4gICAgICAgIHNlbGYuZmFjdG9yRXF1aWxpYnJpbyA9IDBcXG5cXG4gICAgZGVmIHRpZW5lSGlqb0l6cXVpZXJkbyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgXFxuICAgIGRlZiB0aWVuZUhpam9EZXJlY2hvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaGlqb0RlcmVjaG9cXG5cXG4gICAgZGVmIGVzSGlqb0l6cXVpZXJkbyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhZHJlIGFuZCBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPT0gc2VsZlxcbiAgICBcXG4gICAgZGVmIGVzSGlqb0RlcmVjaG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wYWRyZSBhbmQgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9PSBzZWxmXFxuXFxuICAgIGRlZiBlc1JhaXooc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IHNlbGYucGFkcmVcXG5cXG4gICAgZGVmIGVzSG9qYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBub3QgKHNlbGYuaGlqb0RlcmVjaG8gb3Igc2VsZi5oaWpvSXpxdWllcmRvKVxcblxcbiAgICBkZWYgdGllbmVBbGd1bkhpam8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvRGVyZWNobyBvciBzZWxmLmhpam9JenF1aWVyZG9cXG5cXG4gICAgZGVmIHRpZW5lQW1ib3NIaWpvcyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvIGFuZCBzZWxmLmhpam9JenF1aWVyZG9cXG5cXG4gICAgZGVmIHJlZW1wbGF6YXJEYXRvRGVOb2RvKHNlbGYsY2xhdmUsdmFsb3IsaGl6cSxoZGVyKTpcXG4gICAgICAgIHNlbGYuY2xhdmUgPSBjbGF2ZVxcbiAgICAgICAgc2VsZi5jYXJnYVV0aWwgPSB2YWxvclxcbiAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gaGl6cVxcbiAgICAgICAgc2VsZi5oaWpvRGVyZWNobyA9IGhkZXJcXG4gICAgICAgIGlmIHNlbGYudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLnBhZHJlID0gc2VsZlxcbiAgICAgICAgaWYgc2VsZi50aWVuZUhpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5wYWRyZSA9IHNlbGYgICAgXFxuXFxuICAgIGRlZiBlbmNvbnRyYXJTdWNlc29yKHNlbGYpOlxcbiAgICAgICAgc3VjID0gTm9uZVxcbiAgICAgICAgaWYgc2VsZi50aWVuZUhpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgc3VjID0gc2VsZi5oaWpvRGVyZWNoby5lbmNvbnRyYXJNaW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLnBhZHJlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgc3VjID0gc2VsZi5wYWRyZVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IE5vbmVcXG4gICAgICAgICAgICAgICAgICAgIHN1YyA9IHNlbGYucGFkcmUuZW5jb250cmFyU3VjZXNvcigpXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9EZXJlY2hvID0gc2VsZlxcbiAgICAgICAgcmV0dXJuIHN1Y1xcblxcbiAgICBkZWYgZW1wYWxtYXIoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmVzSG9qYSgpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0l6cXVpZXJkbyA9IE5vbmVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9EZXJlY2hvID0gTm9uZVxcbiAgICAgICAgZWxpZiBzZWxmLnRpZW5lQWxndW5IaWpvKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0l6cXVpZXJkbyA9IHNlbGYuaGlqb0l6cXVpZXJkb1xcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IHNlbGYuaGlqb0l6cXVpZXJkb1xcbiAgICAgICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucGFkcmUgPSBzZWxmLnBhZHJlXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0l6cXVpZXJkbyA9IHNlbGYuaGlqb0RlcmVjaG9cXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBzZWxmLmhpam9EZXJlY2hvXFxuICAgICAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8ucGFkcmUgPSBzZWxmLnBhZHJlXFxuXFxuICAgIGRlZiBlbmNvbnRyYXJNaW4oc2VsZik6XFxuICAgICAgICBhY3R1YWwgPSBzZWxmXFxuICAgICAgICB3aGlsZSBhY3R1YWwudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgYWN0dWFsID0gYWN0dWFsLmhpam9JenF1aWVyZG9cXG4gICAgICAgIHJldHVybiBhY3R1YWxcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZjpcXG4gICAgXFx0ICAgIGlmIHNlbGYudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdCAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICBcXHRcXHQgICAgeWllbGQgZWxlbVxcbiAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xhdmVcXG4gICAgXFx0ICAgIGlmIHNlbGYudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLmhpam9EZXJlY2hvOlxcbiAgICBcXHRcXHQgICAgeWllbGQgZWxlbVxcblwiLFwic3JjL2xpYi9weXRob25lZC9hcmJvbGVzL2FyYm9sQmluYXJpby5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI2FyYm9sQmluYXJpby5weVxcblxcbmNsYXNzIEFyYm9sQmluYXJpbzpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsb2JqZXRvUmFpeik6XFxuICAgICAgICBzZWxmLmNsYXZlID0gb2JqZXRvUmFpelxcbiAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gTm9uZVxcbiAgICAgICAgc2VsZi5oaWpvRGVyZWNobyA9IE5vbmVcXG4gICAgXFxuICAgIGRlZiBpbnNlcnRhckl6cXVpZXJkbyhzZWxmLG51ZXZvTm9kbyk6XFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG8gPT0gTm9uZTpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8gPSBBcmJvbEJpbmFyaW8obnVldm9Ob2RvKVxcbiAgICAgICAgZWxzZTogIFxcbiAgICAgICAgICAgIHQgPSBBcmJvbEJpbmFyaW8obnVldm9Ob2RvKVxcbiAgICAgICAgICAgIHQuaGlqb0l6cXVpZXJkbyA9IHNlbGYuaGlqb0l6cXVpZXJkb1xcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IHRcXG5cXG4gICAgZGVmIGluc2VydGFyRGVyZWNobyhzZWxmLG51ZXZvTm9kbyk6XFxuICAgICAgICBpZiBzZWxmLmhpam9EZXJlY2hvID09IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNobyA9IEFyYm9sQmluYXJpbyhudWV2b05vZG8pXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHQgPSBBcmJvbEJpbmFyaW8obnVldm9Ob2RvKVxcbiAgICAgICAgICAgIHQuaGlqb0RlcmVjaG8gPSBzZWxmLmhpam9EZXJlY2hvXFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNobyA9IHRcXG5cXG4gICAgZGVmIGVzSG9qYShzZWxmKTpcXG4gICAgICAgIHJldHVybiAoKG5vdCBzZWxmLmhpam9JenF1aWVyZG8pIGFuZCAobm90IHNlbGYuaGlqb0RlcmVjaG8pKVxcblxcbiAgICBkZWYgb2J0ZW5lckhpam9EZXJlY2hvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaGlqb0RlcmVjaG9cXG4gICAgXFxuICAgIGRlZiBvYnRlbmVySGlqb0l6cXVpZXJkbyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgXFxuICAgIGRlZiBhc2lnbmFyVmFsb3JSYWl6KHNlbGYsb2JqKTpcXG4gICAgICAgIHNlbGYuY2xhdmUgPSBvYmpcXG5cXG4gICAgZGVmIG9idGVuZXJWYWxvclJhaXooc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5jbGF2ZVxcblxcbiAgICBkZWYgaW5vcmRlbihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8uaW5vcmRlbigpXFxuICAgICAgICBwcmludChzZWxmLmNsYXZlKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLmlub3JkZW4oKVxcblxcbiAgICBkZWYgcG9zdG9yZGVuKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5wb3N0b3JkZW4oKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnBvc3RvcmRlbigpXFxuICAgICAgICBwcmludChzZWxmLmNsYXZlKVxcblxcbiAgICBkZWYgcHJlb3JkZW4oc2VsZik6XFxuICAgICAgICBwcmludChzZWxmLmNsYXZlKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5wcmVvcmRlbigpXFxuICAgICAgICBpZiBzZWxmLmhpam9EZXJlY2hvOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8ucHJlb3JkZW4oKVxcblxcbiAgICBkZWYgaW1wcmltaXJFeHByZXNpb24oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgcHJpbnQoJygnLCBlbmQ9JyAnKVxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5pbXByaW1pckV4cHJlc2lvbigpXFxuICAgICAgICBwcmludChzZWxmLmNsYXZlLCBlbmQ9JyAnKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLmltcHJpbWlyRXhwcmVzaW9uKClcXG4gICAgICAgICAgICBwcmludCgnKScsIGVuZD0nICcpXFxuXFxuICAgIGRlZiBldmFsUG9zdG9yZGVuKHNlbGYpOlxcbiAgICAgICAgb3BlcnMgPSB7JysnOm9wZXJhdG9yLmFkZCwgJy0nOm9wZXJhdG9yLnN1YiwgJyonOm9wZXJhdG9yLm11bCwgJy8nOm9wZXJhdG9yLnRydWVkaXZ9XFxuICAgICAgICByZXMxID0gTm9uZVxcbiAgICAgICAgcmVzMiA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICByZXMxID0gc2VsZi5oaWpvSXpxdWllcmRvLmV2YWxQb3N0b3JkZW4oKSAgIy8vIFxcXFxsYWJlbHtwZWxlZnR9XFxuICAgICAgICBpZiBzZWxmLmhpam9EZXJlY2hvOlxcbiAgICAgICAgICAgIHJlczIgPSBzZWxmLmhpam9EZXJlY2hvLmV2YWxQb3N0b3JkZW4oKSAjLy8gXFxcXGxhYmVse3BlcmlnaHR9XFxuICAgICAgICBpZiByZXMxIGFuZCByZXMyOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyc1tzZWxmLmNsYXZlXShyZXMxLHJlczIpICMvLyBcXFxcbGFiZWx7cGVldmFsfVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5jbGF2ZVxcblxcbmRlZiBpbm9yZGVuKGFyYm9sKTpcXG4gICAgaWYgYXJib2wgIT0gTm9uZTpcXG4gICAgICAgIGlub3JkZW4oYXJib2wub2J0ZW5lckhpam9JenF1aWVyZG8oKSlcXG4gICAgICAgIHByaW50KGFyYm9sLm9idGVuZXJWYWxvclJhaXooKSlcXG4gICAgICAgIGlub3JkZW4oYXJib2wub2J0ZW5lckhpam9EZXJlY2hvKCkpXFxuXFxuZGVmIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sKTpcXG4gICAgaWYgYXJib2wuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgIHByaW50KCcoJywgZW5kPScgJylcXG4gICAgICAgIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpXFxuICAgIHByaW50KGFyYm9sLm9idGVuZXJWYWxvclJhaXooKSwgZW5kPScgJylcXG4gICAgaWYgYXJib2wuaGlqb0RlcmVjaG86XFxuICAgICAgICBpbXByaW1pckV4cHJlc2lvbihhcmJvbC5vYnRlbmVySGlqb0RlcmVjaG8oKSlcXG4gICAgICAgIHByaW50KCcpJywgZW5kPScgJykgXFxuXFxuZGVmIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sKTpcXG4gIHZhbG9yQ2FkZW5hID0gXFxcIlxcXCJcXG4gIGlmIGFyYm9sOlxcbiAgICAgIHZhbG9yQ2FkZW5hID0gJygnICsgaW1wcmltaXJFeHByZXNpb24oYXJib2wub2J0ZW5lckhpam9JenF1aWVyZG8oKSlcXG4gICAgICB2YWxvckNhZGVuYSA9IHZhbG9yQ2FkZW5hICsgc3RyKGFyYm9sLm9idGVuZXJWYWxvclJhaXooKSlcXG4gICAgICB2YWxvckNhZGVuYSA9IHZhbG9yQ2FkZW5hICsgaW1wcmltaXJFeHByZXNpb24oYXJib2wub2J0ZW5lckhpam9EZXJlY2hvKCkpKycpJ1xcbiAgcmV0dXJuIHZhbG9yQ2FkZW5hXFxuXFxuZGVmIGV2YWxQb3N0b3JkZW4oYXJib2wpOlxcbiAgICBvcGVyYWRvcmVzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICByZXMxID0gTm9uZVxcbiAgICByZXMyID0gTm9uZVxcbiAgICBpZiBhcmJvbDpcXG4gICAgICAgIHJlczEgPSBldmFsUG9zdG9yZGVuKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgcmVzMiA9IGV2YWxQb3N0b3JkZW4oYXJib2wub2J0ZW5lckhpam9EZXJlY2hvKCkpICAjLy8gXFxcXGxhYmVse3BlcmlnaHR9XFxuICAgICAgICBpZiByZXMxIGFuZCByZXMyOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyYWRvcmVzW2FyYm9sLm9idGVuZXJWYWxvclJhaXooKV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIGFyYm9sLm9idGVuZXJWYWxvclJhaXooKVxcblxcbmRlZiBhbHR1cmEoYXJib2wpOlxcbiAgICBpZiBhcmJvbCA9PSBOb25lOlxcbiAgICAgICAgcmV0dXJuIC0xXFxuICAgIGVsc2U6XFxuICAgICAgICByZXR1cm4gMSArIG1heChhbHR1cmEoYXJib2wuaGlqb0l6cXVpZXJkbyksYWx0dXJhKGFyYm9sLmhpam9EZXJlY2hvKSlcXG5cXG50ID0gQXJib2xCaW5hcmlvKDcpXFxudC5pbnNlcnRhckl6cXVpZXJkbygzKVxcbnQuaW5zZXJ0YXJEZXJlY2hvKDkpXFxuaW5vcmRlbih0KVxcbmltcG9ydCBvcGVyYXRvclxcbnggPSBBcmJvbEJpbmFyaW8oJyonKVxcbnguaW5zZXJ0YXJJenF1aWVyZG8oJysnKVxcbmwgPSB4Lm9idGVuZXJIaWpvSXpxdWllcmRvKClcXG5sLmluc2VydGFySXpxdWllcmRvKDQpXFxubC5pbnNlcnRhckRlcmVjaG8oNSlcXG54Lmluc2VydGFyRGVyZWNobyg3KVxcbnByaW50KGltcHJpbWlyRXhwcmVzaW9uKHgpKVxcbnByaW50KGV2YWxQb3N0b3JkZW4oeCkpXFxucHJpbnQoYWx0dXJhKHgpKVxcblwiLFwic3JjL2xpYi9weXRob25lZC9hcmJvbGVzL2F2bC5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiNcXG4jYXZsLnB5XFxuXFxuZnJvbSAuYWJiIGltcG9ydCBBcmJvbEJpbmFyaW9CdXNxdWVkYSwgTm9kb0FyYm9sXFxuXFxuY2xhc3MgQXJib2xBVkwoQXJib2xCaW5hcmlvQnVzcXVlZGEpOlxcblxcbiAgICBkZWYgX2FncmVnYXIoc2VsZixjbGF2ZSx2YWxvcixub2RvQWN0dWFsKTpcXG4gICAgXFx0aWYgY2xhdmUgPCBub2RvQWN0dWFsLmNsYXZlOlxcbiAgICBcXHQgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgXFx0XFx0c2VsZi5fYWdyZWdhcihjbGF2ZSx2YWxvcixub2RvQWN0dWFsLmhpam9JenF1aWVyZG8pXFxuICAgIFxcdCAgICBlbHNlOlxcbiAgICBcXHRcXHRub2RvQWN0dWFsLmhpam9JenF1aWVyZG8gPSBOb2RvQXJib2woY2xhdmUsdmFsb3IscGFkcmU9bm9kb0FjdHVhbClcXG4gICAgXFx0XFx0c2VsZi5hY3R1YWxpemFyRXF1aWxpYnJpbyhub2RvQWN0dWFsLmhpam9JenF1aWVyZG8pXFxuICAgIFxcdGVsc2U6XFxuICAgIFxcdCAgICBpZiBub2RvQWN0dWFsLnRpZW5lSGlqb0RlcmVjaG8oKTpcXG4gICAgXFx0XFx0c2VsZi5fYWdyZWdhcihjbGF2ZSx2YWxvcixub2RvQWN0dWFsLmhpam9EZXJlY2hvKVxcbiAgICBcXHQgICAgZWxzZTpcXG4gICAgXFx0XFx0bm9kb0FjdHVhbC5oaWpvRGVyZWNobyA9IE5vZG9BcmJvbChjbGF2ZSx2YWxvcixwYWRyZT1ub2RvQWN0dWFsKVxcbiAgICBcXHRcXHRzZWxmLmFjdHVhbGl6YXJFcXVpbGlicmlvKG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pXFxuXFxuICAgIGRlZiBhY3R1YWxpemFyRXF1aWxpYnJpbyhzZWxmLG5vZG8pOlxcbiAgICBcXHRpZiBub2RvLmZhY3RvckVxdWlsaWJyaW8gPiAxIG9yIG5vZG8uZmFjdG9yRXF1aWxpYnJpbyA8IC0xOlxcbiAgICBcXHQgICAgc2VsZi5yZWVxdWlsaWJyYXIobm9kbykgICAgXFxuICAgIFxcdCAgICByZXR1cm5cXG4gICAgXFx0aWYgbm9kby5wYWRyZSAhPSBOb25lOlxcbiAgICBcXHQgICAgaWYgbm9kby5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgXFx0XFx0ICAgIG5vZG8ucGFkcmUuZmFjdG9yRXF1aWxpYnJpbyArPSAxXFxuICAgIFxcdCAgICBlbGlmIG5vZG8uZXNIaWpvRGVyZWNobygpOlxcbiAgICBcXHRcXHQgICAgbm9kby5wYWRyZS5mYWN0b3JFcXVpbGlicmlvIC09IDFcXG5cXG4gICAgXFx0ICAgIGlmIG5vZG8ucGFkcmUuZmFjdG9yRXF1aWxpYnJpbyAhPSAwOlxcbiAgICBcXHRcXHQgICAgc2VsZi5hY3R1YWxpemFyRXF1aWxpYnJpbyhub2RvLnBhZHJlKVxcblxcbiAgICBkZWYgcmVlcXVpbGlicmFyKHNlbGYsbm9kbyk6XFxuICAgICAgICBpZiBub2RvLmZhY3RvckVxdWlsaWJyaW8gPCAwOlxcblxcdCAgICBpZiBub2RvLmhpam9EZXJlY2hvLmZhY3RvckVxdWlsaWJyaW8gPiAwOlxcblxcdCAgICAgICAgc2VsZi5yb3RhckRlcmVjaGEobm9kby5oaWpvRGVyZWNobylcXG5cXHQgICAgICAgIHNlbGYucm90YXJJenF1aWVyZGEobm9kbylcXG5cXHQgICAgZWxzZTpcXG5cXHQgICAgICAgIHNlbGYucm90YXJJenF1aWVyZGEobm9kbylcXG4gICAgICAgIGVsaWYgbm9kby5mYWN0b3JFcXVpbGlicmlvID4gMDpcXG5cXHQgICAgaWYgbm9kby5oaWpvSXpxdWllcmRvLmZhY3RvckVxdWlsaWJyaW8gPCAwOlxcblxcdCAgICAgICAgc2VsZi5yb3Rhckl6cXVpZXJkYShub2RvLmhpam9JenF1aWVyZG8pXFxuXFx0ICAgICAgICBzZWxmLnJvdGFyRGVyZWNoYShub2RvKVxcblxcdCAgICAgZWxzZTpcXG5cXHQgICAgICAgIHNlbGYucm90YXJEZXJlY2hhKG5vZG8pXFxuICAgICAgICAgICBcXG4gICAgZGVmIHJvdGFySXpxdWllcmRhKHNlbGYscm90UmFpeik6XFxuICAgIFxcdG51ZXZhUmFpeiA9IHJvdFJhaXouaGlqb0RlcmVjaG9cXG4gICAgXFx0cm90UmFpei5oaWpvRGVyZWNobyA9IG51ZXZhUmFpei5oaWpvSXpxdWllcmRvXFxuICAgIFxcdGlmIG51ZXZhUmFpei5oaWpvSXpxdWllcmRvICE9IE5vbmU6XFxuICAgIFxcdCAgICBudWV2YVJhaXouaGlqb0l6cXVpZXJkby5wYWRyZSA9IHJvdFJhaXpcXG4gICAgXFx0bnVldmFSYWl6LnBhZHJlID0gcm90UmFpei5wYWRyZVxcbiAgICBcXHRpZiByb3RSYWl6LmVzUmFpeigpOlxcbiAgICBcXHQgICAgc2VsZi5yYWl6ID0gbnVldmFSYWl6XFxuICAgIFxcdGVsc2U6XFxuICAgIFxcdCAgICBpZiByb3RSYWl6LmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICBcXHQgICAgICAgIHJvdFJhaXoucGFkcmUuaGlqb0l6cXVpZXJkbyA9IG51ZXZhUmFpelxcbiAgICBcXHQgICAgZWxzZTpcXG4gICAgXFx0ICAgIFxcdHJvdFJhaXoucGFkcmUuaGlqb0RlcmVjaG8gPSBudWV2YVJhaXpcXG4gICAgXFx0bnVldmFSYWl6Lmhpam9JenF1aWVyZG8gPSByb3RSYWl6XFxuICAgIFxcdHJvdFJhaXoucGFkcmUgPSBudWV2YVJhaXpcXG4gICAgXFx0cm90UmFpei5mYWN0b3JFcXVpbGlicmlvID0gcm90UmFpei5mYWN0b3JFcXVpbGlicmlvICsgMSAtIG1pbihudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbywgMClcXG4gICAgXFx0bnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSBudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbyArIDEgKyBtYXgocm90UmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKVxcblxcbiAgICBkZWYgcm90YXJEZXJlY2hhKHNlbGYscm90UmFpeik6XFxuICAgICAgICBudWV2YVJhaXogPSByb3RSYWl6Lmhpam9JenF1aWVyZG9cXG4gICAgICAgIHJvdFJhaXouaGlqb0l6cXVpZXJkbyA9IG51ZXZhUmFpei5oaWpvRGVyZWNob1xcbiAgICAgICAgaWYgbnVldmFSYWl6Lmhpam9EZXJlY2hvICE9IE5vbmU6XFxuICAgICAgICAgICAgbnVldmFSYWl6Lmhpam9EZXJlY2hvLnBhZHJlID0gcm90UmFpelxcbiAgICAgICAgbnVldmFSYWl6LnBhZHJlID0gcm90UmFpei5wYWRyZVxcbiAgICAgICAgaWYgcm90UmFpei5lc1JhaXooKTpcXG4gICAgICAgICAgICBzZWxmLnJhaXogPSBudWV2YVJhaXpcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90UmFpei5lc0hpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgICAgIHJvdFJhaXoucGFkcmUuaGlqb0RlcmVjaG8gPSBudWV2YVJhaXpcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RSYWl6LnBhZHJlLmhpam9JenF1aWVyZG8gPSBudWV2YVJhaXpcXG4gICAgICAgIG51ZXZhUmFpei5oaWpvRGVyZWNobyA9IHJvdFJhaXpcXG4gICAgICAgIHJvdFJhaXoucGFkcmUgPSBudWV2YVJhaXpcXG4gICAgICAgIHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyA9IHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyAtIDEgLSBtYXgobnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8sIDApXFxuICAgICAgICBudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbyA9IG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvIC0gMSArIG1pbihyb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8sIDApICBcXG5cXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9tb250aWN1bG9CaW5hcmlvLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jbW9udGljdWxvQmluYXJpby5weVxcblxcbmNsYXNzIE1vbnRpY3Vsb0JpbmFyaW86XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYubGlzdGFNb250aWN1bG8gPSBbMF1cXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gMFxcblxcbiAgICBkZWYgY29uc3RydWlyTW9udGljdWxvKHNlbGYsdW5hTGlzdGEpOlxcbiAgICAgICAgaSA9IGxlbih1bmFMaXN0YSkgLy8gMlxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBsZW4odW5hTGlzdGEpXFxuICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvID0gWzBdICsgdW5hTGlzdGFbOl1cXG4gICAgICAgIHByaW50KGxlbihzZWxmLmxpc3RhTW9udGljdWxvKSwgaSlcXG4gICAgICAgIHdoaWxlIChpID4gMCk6XFxuICAgICAgICAgICAgcHJpbnQoc2VsZi5saXN0YU1vbnRpY3VsbywgaSlcXG4gICAgICAgICAgICBzZWxmLmluZmlsdEFiYWpvKGkpXFxuICAgICAgICAgICAgaSA9IGkgLSAxXFxuICAgICAgICBwcmludChzZWxmLmxpc3RhTW9udGljdWxvLGkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgIGRlZiBpbmZpbHRBYmFqbyhzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgKGkgKiAyKSA8PSBzZWxmLnRhbWFub0FjdHVhbDpcXG4gICAgICAgICAgICBobSA9IHNlbGYuaGlqb01pbihpKVxcbiAgICAgICAgICAgIGlmIHNlbGYubGlzdGFNb250aWN1bG9baV0gPiBzZWxmLmxpc3RhTW9udGljdWxvW2htXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tpXVxcbiAgICAgICAgICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvW2ldID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tobV1cXG4gICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tobV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaG1cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBoaWpvTWluKHNlbGYsaSk6XFxuICAgICAgICBpZiBpICogMiArIDEgPiBzZWxmLnRhbWFub0FjdHVhbDpcXG4gICAgICAgICAgICByZXR1cm4gaSAqIDJcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5saXN0YU1vbnRpY3Vsb1tpICogMl0gPCBzZWxmLmxpc3RhTW9udGljdWxvW2kgKiAyICsgMV06XFxuICAgICAgICAgICAgICAgIHJldHVybiBpICogMlxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpICogMiArIDFcXG5cXG4gICAgZGVmIGluZmlsdEFycmliYShzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgaSAvLyAyID4gMDpcXG4gICAgICAgICAgICBpZiBzZWxmLmxpc3RhTW9udGljdWxvW2ldIDwgc2VsZi5saXN0YU1vbnRpY3Vsb1tpLy8yXTpcXG4gICAgICAgICAgICAgICB0bXAgPSBzZWxmLmxpc3RhTW9udGljdWxvW2kgLy8gMl1cXG4gICAgICAgICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvW2kgLy8gMl0gPSBzZWxmLmxpc3RhTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBpIC8vIDJcXG4gXFxuICAgIGRlZiBpbnNlcnRhcihzZWxmLGspOlxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsby5hcHBlbmQoaylcXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gc2VsZi50YW1hbm9BY3R1YWwgKyAxXFxuICAgICAgICBzZWxmLmluZmlsdEFycmliYShzZWxmLnRhbWFub0FjdHVhbClcXG5cXG4gICAgZGVmIGVsaW1pbmFyTWluKHNlbGYpOlxcbiAgICAgICAgdmFsb3JTYWNhZG8gPSBzZWxmLmxpc3RhTW9udGljdWxvWzFdXFxuICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvWzFdID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tzZWxmLnRhbWFub0FjdHVhbF1cXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gc2VsZi50YW1hbm9BY3R1YWwgLSAxXFxuICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvLnBvcCgpXFxuICAgICAgICBzZWxmLmluZmlsdEFiYWpvKDEpXFxuICAgICAgICByZXR1cm4gdmFsb3JTYWNhZG9cXG4gICAgICAgIFxcbiAgICBkZWYgZXN0YVZhY2lvKHNlbGYpOlxcbiAgICAgICAgaWYgdGFtYW5vQWN0dWFsID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvX19pbml0X18ucHlcIjpcIlxcbiNfX2FsbF9fID0gW1xcXCJwaWxhXFxcIl1cXG5cXG5cXG5mcm9tIC5waWxhIGltcG9ydCBQaWxhXFxuZnJvbSAuY29sYSBpbXBvcnQgQ29sYVxcbmZyb20gLmNvbGFkb2JsZSBpbXBvcnQgQ29sYURvYmxlXFxuXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvY29sYS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiNcXG4jY29sYS5weVxcblxcbmNsYXNzIENvbGE6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaXRlbXMgPSBbXVxcblxcbiAgICBkZWYgZXN0YVZhY2lhKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIGFncmVnYXIoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmluc2VydCgwLGl0ZW0pXFxuXFxuICAgIGRlZiBhdmFuemFyKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHRhbWFubyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYmFzaWNhcy9jb2xhZG9ibGUucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jIFxcbiNjb2xhZG9ibGUucHlcXG5cXG5jbGFzcyBDb2xhRG9ibGU6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaXRlbXMgPSBbXVxcblxcbiAgICBkZWYgZXN0YVZhY2lhKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIGFncmVnYXJGcmVudGUoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgYWdyZWdhckZpbmFsKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5pbnNlcnQoMCxpdGVtKVxcblxcbiAgICBkZWYgcmVtb3ZlckZyZW50ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiByZW1vdmVyRmluYWwoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoMClcXG5cXG4gICAgZGVmIHRhbWFubyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYmFzaWNhcy9waWxhLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jcGlsYS5weVxcblxcbmNsYXNzIFBpbGE6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaXRlbXMgPSBbXVxcblxcbiAgICBkZWYgZXN0YVZhY2lhKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIGluY2x1aXIoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgZXh0cmFlcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBpbnNwZWNjaW9uYXIoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtc1tsZW4oc2VsZi5pdGVtcyktMV1cXG5cXG4gICAgZGVmIHRhbWFubyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvZ3JhZm9zL19faW5pdF9fLnB5XCI6XCJcXG5cXG5mcm9tIC5ncmFmb0FkeSBpbXBvcnQgR3JhZm9cXG5mcm9tIC5ncmFmb0FkeSBpbXBvcnQgVmVydGljZVxcbmZyb20gLmNvbGFQcmlvcmlkYWQgaW1wb3J0IENvbGFQcmlvcmlkYWRcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvZ3JhZm9zL2NvbGFQcmlvcmlkYWQucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jIFxcbiNjb2xhUHJpb3JpZGFkLnB5XFxuXFxuY2xhc3MgQ29sYVByaW9yaWRhZDpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvID0gWygwLDApXVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSAwXFxuXFxuICAgIGRlZiBjb25zdHJ1aXJNb250aWN1bG8oc2VsZix1bmFMaXN0YSk6XFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IGxlbih1bmFMaXN0YSlcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3VsbyA9IFsoMCwwKV1cXG4gICAgICAgIGZvciBpIGluIHVuYUxpc3RhOlxcbiAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsby5hcHBlbmQoaSlcXG4gICAgICAgIGkgPSBsZW4odW5hTGlzdGEpIC8vIDIgICAgICAgICAgICBcXG4gICAgICAgIHdoaWxlIChpID4gMCk6XFxuICAgICAgICAgICAgc2VsZi5pbmZpbHRBYmFqbyhpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaW5maWx0QWJham8oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgaG0gPSBzZWxmLmhpam9NaW4oaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1bMF0gPiBzZWxmLmFycmVnbG9Nb250aWN1bG9baG1dWzBdOlxcbiAgICAgICAgICAgICAgICB0bXAgPSBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1cXG4gICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2htXVxcbiAgICAgICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG9baG1dID0gdG1wXFxuICAgICAgICAgICAgaSA9IGhtXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaGlqb01pbihzZWxmLGkpOlxcbiAgICAgICAgaWYgaSoyID4gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgcmV0dXJuIC0xXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGkqMiArIDEgPiBzZWxmLnRhbWFub0FjdHVhbDpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkqMlxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpKjJdWzBdIDwgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kqMisxXVswXTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjIrMVxcblxcbiAgICBkZWYgaW5maWx0QXJyaWJhKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpXVswXSA8IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpLy8yXVswXTpcXG4gICAgICAgICAgICAgICB0bXAgPSBzZWxmLmFycmVnbG9Nb250aWN1bG9baS8vMl1cXG4gICAgICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG9baS8vMl0gPSBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1cXG4gICAgICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG9baV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaS8vMlxcbiBcXG4gICAgZGVmIGluc2VydGFyKHNlbGYsayk6XFxuICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8uYXBwZW5kKGspXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsICsgMVxcbiAgICAgICAgc2VsZi5pbmZpbHRBcnJpYmEoc2VsZi50YW1hbm9BY3R1YWwpXFxuXFxuICAgIGRlZiBlbGltaW5hck1pbihzZWxmKTpcXG4gICAgICAgIHZhbG9yU2FjYWRvID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvWzFdWzFdXFxuICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG9bMV0gPSBzZWxmLmFycmVnbG9Nb250aWN1bG9bc2VsZi50YW1hbm9BY3R1YWxdXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsIC0gMVxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvLnBvcCgpXFxuICAgICAgICBzZWxmLmluZmlsdEFiYWpvKDEpXFxuICAgICAgICByZXR1cm4gdmFsb3JTYWNhZG9cXG4gICAgICAgIFxcbiAgICBkZWYgZXN0YVZhY2lhKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi50YW1hbm9BY3R1YWwgPT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIGRlY3JlbWVudGFyQ2xhdmUoc2VsZix2YWxvcixudWV2byk6XFxuICAgICAgICBoZWNobyA9IEZhbHNlXFxuICAgICAgICBpID0gMVxcbiAgICAgICAgbWlDbGF2ZSA9IDBcXG4gICAgICAgIHdoaWxlIG5vdCBoZWNobyBhbmQgaSA8PSBzZWxmLnRhbWFub0FjdHVhbDpcXG4gICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1bMV0gPT0gdmFsb3I6XFxuICAgICAgICAgICAgICAgIGhlY2hvID0gVHJ1ZVxcbiAgICAgICAgICAgICAgICBtaUNsYXZlID0gaVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGkgPSBpICsgMVxcbiAgICAgICAgaWYgbWlDbGF2ZSA+IDA6XFxuICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW21pQ2xhdmVdID0gKG51ZXZvLHNlbGYuYXJyZWdsb01vbnRpY3Vsb1ttaUNsYXZlXVsxXSlcXG4gICAgICAgICAgICBzZWxmLmluZmlsdEFycmliYShtaUNsYXZlKVxcbiAgICAgICAgICAgIFxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsdmVydGljZSk6XFxuICAgICAgICBmb3IgcGFyZWphIGluIHNlbGYuYXJyZWdsb01vbnRpY3VsbzpcXG4gICAgICAgICAgICBpZiBwYXJlamFbMV0gPT0gdmVydGljZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIHJldHVybiBGYWxzZSAgICAgXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2dyYWZvcy9ncmFmb0FkeS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiNcXG4jZ3JhZm9BZHkucHlcXG5cXG5cXG5pbXBvcnQgc3lzXFxuXFxuY2xhc3MgR3JhZm86XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYubGlzdGFWZXJ0aWNlcyA9IHt9XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gMFxcbiAgICAgICAgXFxuICAgIGRlZiBhZ3JlZ2FyVmVydGljZShzZWxmLGNsYXZlKTpcXG4gICAgICAgIHNlbGYubnVtVmVydGljZXMgPSBzZWxmLm51bVZlcnRpY2VzICsgMVxcbiAgICAgICAgbnVldm9WZXJ0aWNlID0gVmVydGljZShjbGF2ZSlcXG4gICAgICAgIHNlbGYubGlzdGFWZXJ0aWNlc1tjbGF2ZV0gPSBudWV2b1ZlcnRpY2VcXG4gICAgICAgIHJldHVybiBudWV2b1ZlcnRpY2VcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVyVmVydGljZShzZWxmLG4pOlxcbiAgICAgICAgaWYgbiBpbiBzZWxmLmxpc3RhVmVydGljZXM6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYubGlzdGFWZXJ0aWNlc1tuXVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsbik6XFxuICAgICAgICByZXR1cm4gbiBpbiBzZWxmLmxpc3RhVmVydGljZXNcXG4gICAgXFxuICAgIGRlZiBhZ3JlZ2FyQXJpc3RhKHNlbGYsZGUsYSxjb3N0bz0wKTpcXG4gICAgICAgICAgICBpZiBkZSBub3QgaW4gc2VsZi5saXN0YVZlcnRpY2VzOlxcbiAgICAgICAgICAgICAgICBudiA9IHNlbGYuYWdyZWdhclZlcnRpY2UoZGUpXFxuICAgICAgICAgICAgaWYgYSBub3QgaW4gc2VsZi5saXN0YVZlcnRpY2VzOlxcbiAgICAgICAgICAgICAgICBudiA9IHNlbGYuYWdyZWdhclZlcnRpY2UoYSlcXG4gICAgICAgICAgICBzZWxmLmxpc3RhVmVydGljZXNbZGVdLmFncmVnYXJWZWNpbm8oc2VsZi5saXN0YVZlcnRpY2VzW2FdLGNvc3RvKVxcbiAgICBcXG4gICAgZGVmIG9idGVuZXJWZXJ0aWNlcyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBsaXN0KHNlbGYubGlzdGFWZXJ0aWNlcy5rZXlzKCkpXFxuICAgICAgICBcXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5saXN0YVZlcnRpY2VzLnZhbHVlcygpKVxcbiAgICAgICAgICAgICAgICBcXG5jbGFzcyBWZXJ0aWNlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZixjbGF2ZSk6XFxuICAgICAgICBzZWxmLmlkID0gY2xhdmVcXG4gICAgICAgIHNlbGYuY29uZWN0YWRvQSA9IHt9XFxuICAgICAgICBzZWxmLmNvbG9yID0gJ2JsYW5jbydcXG4gICAgICAgIHNlbGYuZGlzdCA9IHN5cy5tYXhzaXplXFxuICAgICAgICBzZWxmLnByZWRlY2Vzb3IgPSBOb25lXFxuICAgICAgICBzZWxmLmRlc2MgPSAwXFxuICAgICAgICBzZWxmLmZpbiA9IDBcXG5cXG4gICAgIyBkZWYgX19sdF9fKHNlbGYsbyk6XFxuICAgICMgICAgIHJldHVybiBzZWxmLmlkIDwgby5pZFxcbiAgICBcXG4gICAgZGVmICBhZ3JlZ2FyVmVjaW5vKHNlbGYsdmVjaW5vLHBvbmRlcmFjaW9uPTApOlxcbiAgICAgICAgc2VsZi5jb25lY3RhZG9BW3ZlY2lub10gPSBwb25kZXJhY2lvblxcbiAgICAgICAgXFxuICAgIGRlZiBhc2lnbmFyQ29sb3Ioc2VsZixjb2xvcik6XFxuICAgICAgICBzZWxmLmNvbG9yID0gY29sb3JcXG4gICAgICAgIFxcbiAgICBkZWYgYXNpZ25hckRpc3RhbmNpYShzZWxmLGQpOlxcbiAgICAgICAgc2VsZi5kaXN0ID0gZFxcblxcbiAgICBkZWYgYXNpZ25hclByZWRlY2Vzb3Ioc2VsZixwKTpcXG4gICAgICAgIHNlbGYucHJlZGVjZXNvciA9IHBcXG5cXG4gICAgZGVmIGFzaWduYXJEZXNjdWJyaW1pZW50byhzZWxmLHRpZW1wb0Rlc2N1YnJpbWllbnRvKTpcXG4gICAgICAgIHNlbGYuZGVzYyA9IHRpZW1wb0Rlc2N1YnJpbWllbnRvXFxuICAgICAgICBcXG4gICAgZGVmIGFzaWduYXJGaW5hbGl6YWNpb24oc2VsZix0aWVtcG9GaW5hbGl6YWNpb24pOlxcbiAgICAgICAgc2VsZi5maW4gPSB0aWVtcG9GaW5hbGl6YWNpb25cXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckZpbmFsaXphY2lvbihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmZpblxcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyRGVzY3VicmltaWVudG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5kZXNjXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJQcmVkZWNlc29yKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucHJlZGVjZXNvclxcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyRGlzdGFuY2lhKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGlzdFxcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyQ29sb3Ioc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb2xvclxcbiAgICBcXG4gICAgZGVmIG9idGVuZXJDb25leGlvbmVzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29uZWN0YWRvQS5rZXlzKClcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lclBvbmRlcmFjaW9uKHNlbGYsdmVjaW5vKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbmVjdGFkb0FbdmVjaW5vXVxcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYuaWQpICsgXFxcIjpjb2xvciBcXFwiICsgc2VsZi5jb2xvciArIFxcXCI6ZGVzYyBcXFwiICsgc3RyKHNlbGYuZGVzYykgKyBcXFwiOmZpbiBcXFwiICsgc3RyKHNlbGYuZmluKSArIFxcXCI6ZGlzdGFuY2lhIFxcXCIgKyBzdHIoc2VsZi5kaXN0KSArIFxcXCI6cHJlZGVjZXNvciBcXFxcblxcXFx0W1xcXCIgKyBzdHIoc2VsZi5wcmVkZWNlc29yKSsgXFxcIl1cXFxcblxcXCJcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVySWQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pZFxcblwiLFwic3JjL2xpYi9xdW9wcmkucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInF1b3ByaSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JhbmRvbS5qc1wiOlwidmFyIE1lcnNlbm5lVHdpc3Rlcj1mdW5jdGlvbihhKXthPT1udWxsJiYoYT1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PUFycmF5KHRoaXMuTiksdGhpcy5tdGk9dGhpcy5OKzEsdGhpcy5pbml0X2dlbnJhbmQoYSl9O01lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuaW5pdF9nZW5yYW5kPWZ1bmN0aW9uKGEpe2Zvcih0aGlzLm10WzBdPWE+Pj4wLHRoaXMubXRpPTE7dGhpcy5tdGk8dGhpcy5OO3RoaXMubXRpKyspe3ZhciBhPXRoaXMubXRbdGhpcy5tdGktMV1edGhpcy5tdFt0aGlzLm10aS0xXT4+PjMwO3RoaXMubXRbdGhpcy5tdGldPSgxODEyNDMzMjUzKigoNDI5NDkwMTc2MCZhKT4+PjE2KTw8MTYpKzE4MTI0MzMyNTMqKDY1NTM1JmEpK3RoaXMubXRpLHRoaXMubXRbdGhpcy5tdGldPj4+PTB9fSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGY7Zm9yKHRoaXMuaW5pdF9nZW5yYW5kKDE5NjUwMjE4KSxkPTEsZT0wLGY9dGhpcy5OPmI/dGhpcy5OOmI7ZjtmLS0pe3ZhciBnPXRoaXMubXRbZC0xXV50aGlzLm10W2QtMV0+Pj4zMDt0aGlzLm10W2RdPSh0aGlzLm10W2RdXigxNjY0NTI1KigoNDI5NDkwMTc2MCZnKT4+PjE2KTw8MTYpKzE2NjQ1MjUqKDY1NTM1JmcpKSthW2VdK2UsdGhpcy5tdFtkXT4+Pj0wLGQrKyxlKyssZD49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxkPTEpLGU+PWImJihlPTApfWZvcihmPXRoaXMuTi0xO2Y7Zi0tKXt2YXIgZz10aGlzLm10W2QtMV1edGhpcy5tdFtkLTFdPj4+MzA7dGhpcy5tdFtkXT0odGhpcy5tdFtkXV4oMTU2NjA4Mzk0MSooKDQyOTQ5MDE3NjAmZyk+Pj4xNik8PDE2KSsxNTY2MDgzOTQxKig2NTUzNSZnKSktZCx0aGlzLm10W2RdPj4+PTAsZCsrLGQ+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sZD0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9pbnQzMj1mdW5jdGlvbigpe3ZhciBhLGI9WzAsdGhpcy5NQVRSSVhfQV07aWYodGhpcy5tdGk+PXRoaXMuTil7dmFyIGQ7Zm9yKHRoaXMubXRpPT10aGlzLk4rMSYmdGhpcy5pbml0X2dlbnJhbmQoNTQ4OSksZD0wO2Q8dGhpcy5OLXRoaXMuTTtkKyspYT10aGlzLm10W2RdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10W2QrMV0mdGhpcy5MT1dFUl9NQVNLLHRoaXMubXRbZF09dGhpcy5tdFtkK3RoaXMuTV1eYT4+PjFeYlsxJmFdO2Zvcig7ZDx0aGlzLk4tMTtkKyspYT10aGlzLm10W2RdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10W2QrMV0mdGhpcy5MT1dFUl9NQVNLLHRoaXMubXRbZF09dGhpcy5tdFtkKyh0aGlzLk0tdGhpcy5OKV1eYT4+PjFeYlsxJmFdO2E9dGhpcy5tdFt0aGlzLk4tMV0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbMF0mdGhpcy5MT1dFUl9NQVNLLHRoaXMubXRbdGhpcy5OLTFdPXRoaXMubXRbdGhpcy5NLTFdXmE+Pj4xXmJbMSZhXSx0aGlzLm10aT0wfXJldHVybiBhPXRoaXMubXRbdGhpcy5tdGkrK10sYV49YT4+PjExLGFePTI2MzY5Mjg2NDAmYTw8NyxhXj00MDIyNzMwNzUyJmE8PDE1LGFePWE+Pj4xOCxhPj4+MH0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5nZW5yYW5kX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2VucmFuZF9pbnQzMigpPj4+MX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5nZW5yYW5kX3JlYWwxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2VucmFuZF9pbnQzMigpKigxLzQyOTQ5NjcyOTUpfSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLnJhbmRvbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlbnJhbmRfaW50MzIoKSooMS80Mjk0OTY3Mjk2KX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5nZW5yYW5kX3JlYWwzPWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuZ2VucmFuZF9pbnQzMigpKy41KSooMS80Mjk0OTY3Mjk2KX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5nZW5yYW5kX3JlczUzPWZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5nZW5yYW5kX2ludDMyKCk+Pj41LGE9dGhpcy5nZW5yYW5kX2ludDMyKCk+Pj42O3JldHVybig2NzEwODg2NCpkK2EpKigxLzkwMDcxOTkyNTQ3NDA5OTIpfTt2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT1NYXRoLmxvZyxiPU1hdGguc3FydCxkPXt9LGU9bmV3IE1lcnNlbm5lVHdpc3RlcixmPXZvaWQgMDtkLnNlZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2VlZFxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLGE9U2suYnVpbHRpbi5hc251bSQoYSksZT0wPGFyZ3VtZW50cy5sZW5ndGg/bmV3IE1lcnNlbm5lVHdpc3RlcihhKTpuZXcgTWVyc2VubmVUd2lzdGVyLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGQucmFuZG9tPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwicmFuZG9tXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUuZ2VucmFuZF9yZXM1MygpKX0pO3ZhciBnPWZ1bmN0aW9uKGEpe3JldHVybiAwfGF9LGg9ZnVuY3Rpb24oYSxiLGQpe3ZhciBmLGgsaTtpZighU2suYnVpbHRpbi5jaGVja0ludChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJub24taW50ZWdlciBmaXJzdCBhcmd1bWVudCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZih2b2lkIDA9PT1iKXJldHVybiBpPWcoZS5nZW5yYW5kX3JlczUzKCkqYSksbmV3IFNrLmJ1aWx0aW4uaW50XyhpKTtpZighU2suYnVpbHRpbi5jaGVja0ludChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJub24taW50ZWdlciBzdG9wIGZvciByYW5kcmFuZ2UoKVxcXCIpO2lmKHZvaWQgMD09PWQmJihkPTEpLGY9Yi1hLDE9PWQmJjA8ZilyZXR1cm4gaT1hK2coZS5nZW5yYW5kX3JlczUzKCkqZiksbmV3IFNrLmJ1aWx0aW4uaW50XyhpKTtpZigxPT1kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImVtcHR5IHJhbmdlIGZvciByYW5kcmFuZ2UoKSAoXFxcIithK1xcXCIsIFxcXCIrYitcXFwiLCBcXFwiK2YrXFxcIilcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja0ludChkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJub24taW50ZWdlciBzdGVwIGZvciByYW5kcmFuZ2UoKVxcXCIpO2lmKDA8ZCloPWcoKGYrZC0xKS9kKTtlbHNlIGlmKDA+ZCloPWcoKGYrZCsxKS9kKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcInplcm8gc3RlcCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZigwPj1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImVtcHR5IHJhbmdlIGZvciByYW5kcmFuZ2UoKVxcXCIpO3JldHVybiBpPWErZCpnKGUuZ2VucmFuZF9yZXM1MygpKmgpLG5ldyBTay5idWlsdGluLmludF8oaSl9O2QucmFuZGludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGQsZSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJhbmRpbnRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGU9U2suYnVpbHRpbi5hc251bSQoZSksaChkLGUrMSl9KSxkLnJhbmRyYW5nZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwicmFuZHJhbmdlXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMyksYT1Tay5idWlsdGluLmFzbnVtJChhKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksaChhLGIsZCl9KSxkLnVuaWZvcm09bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihkLGYpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInVuaWZvcm1cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGY9U2suYnVpbHRpbi5hc251bSQoZik7dmFyIGc9ZS5nZW5yYW5kX3JlczUzKCk7cmV0dXJuIGM9ZCtnKihmLWQpLG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX0pLGQudHJpYW5ndWxhcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsZCxmKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ0cmlhbmd1bGFyXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwibG93XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJoaWdoXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGQpKTt2YXIgZyxoLGk7cmV0dXJuIGE9U2suYnVpbHRpbi5hc251bSQoYSksZD1Tay5idWlsdGluLmFzbnVtJChkKSxhPmQmJihpPWEsYT1kLGQ9aSksdm9pZCAwPT09Znx8Zj09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9mPShkLWEpLzI6KFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcIm1vZGVcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZikpLGY9U2suYnVpbHRpbi5hc251bSQoZikpLGc9ZS5nZW5yYW5kX3JlczUzKCksaD1nPChmLWEpLyhkLWEpP2ErYihnKihkLWEpKihmLWEpKTpkLWIoKDEtZykqKGQtYSkqKGQtZikpLG5ldyBTay5idWlsdGluLmZsb2F0XyhoKX0pO3ZhciBpPWZ1bmN0aW9uKGQsZyl7dmFyIGssbCxtLG4sbyxoPU1hdGguc2luLGk9TWF0aC5jb3Msaj1NYXRoLlBJO3JldHVybiB2b2lkIDA9PT1mPyhrPWUuZ2VucmFuZF9yZXM1MygpLGw9ZS5nZW5yYW5kX3JlczUzKCksbT1iKC0yKmEoaykpLG49MipqKmwsbz1tKmkobiksZj1tKmgobikpOihvPWYsZj12b2lkIDApLGQrZypvfTtyZXR1cm4gZC5nYXVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdhdXNzXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwibXVcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInNpZ21hXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGI9U2suYnVpbHRpbi5hc251bSQoYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGkoYSxiKSl9KSxkLm5vcm1hbHZhcmlhdGU9ZC5nYXVzcyxkLmxvZ25vcm12YXJpYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgZD1NYXRoLmV4cDtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibG9nbm9ybXZhcmlhdGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJtdVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwic2lnbWFcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpLGE9U2suYnVpbHRpbi5hc251bSQoYSksYj1Tay5idWlsdGluLmFzbnVtJChiKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZChpKGEsYikpKX0pLGQuZXhwb3ZhcmlhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJleHBvdmFyaWF0ZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImxhbWJkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO3ZhciBkPWUuZ2VucmFuZF9yZXM1MygpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oLWEoZCkvYil9KSxkLmNob2ljZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImNob2ljZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInNlcVxcXCIsXFxcInNlcXVlbmNlXFxcIixTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYSkpLHZvaWQgMCE9PWEuc3EkbGVuZ3RoKXt2YXIgYj1uZXcgU2suYnVpbHRpbi5pbnRfKGcoZS5nZW5yYW5kX3JlczUzKCkqYS5zcSRsZW5ndGgoKSkpO3JldHVybiBhLm1wJHN1YnNjcmlwdChiKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm9iamVjdCBoYXMgbm8gbGVuZ3RoXFxcIil9KSxkLnNodWZmbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzaHVmZmxlXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcInNlcXVlbmNlXFxcIixTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYSkpLGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmxpc3Qpe2NvbnN0IGg9YS52O2Zvcih2YXIgYj1oLmxlbmd0aC0xOzA8YjtiLT0xKXt2YXIgZD1nKGUuZ2VucmFuZF9yZXM1MygpKihiKzEpKSxmPWhbZF07aFtkXT1oW2JdLGhbYl09Zn19ZWxzZSBpZih2b2lkIDA9PT1hLnNxJGxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm9iamVjdCBoYXMgbm8gbGVuZ3RoXFxcIik7ZWxzZSBpZih2b2lkIDAhPT1hLm1wJGFzc19zdWJzY3JpcHQpZm9yKHZhciBkLGI9YS5zcSRsZW5ndGgoKS0xOzA8YjtiLT0xKXtkPW5ldyBTay5idWlsdGluLmludF8oZyhlLmdlbnJhbmRfcmVzNTMoKSooYisxKSkpLGI9bmV3IFNrLmJ1aWx0aW4uaW50XyhiKTt2YXIgZj1hLm1wJHN1YnNjcmlwdChkKTthLm1wJGFzc19zdWJzY3JpcHQoZCxhLm1wJHN1YnNjcmlwdChiKSksYS5tcCRhc3Nfc3Vic2NyaXB0KGIsZil9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm9iamVjdCBpcyBpbW11dGFibGVcXFwiKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSksZC5zYW1wbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBmLGcsaCxsLG0sZD1NYXRoLmZsb29yO2ZvcihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzYW1wbGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJwb3B1bGF0aW9uXFxcIixcXFwiaXRlcmFibGVcXFwiLFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwia1xcXCIsXFxcImludGVnZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQoYikpLGI9U2suYnVpbHRpbi5hc251bSQoYiksbT1bXSxoPVNrLmFic3RyLml0ZXIoYSksKGY9MCxsPWgudHAkaXRlcm5leHQoKSk7dm9pZCAwIT09bDtmKyssbD1oLnRwJGl0ZXJuZXh0KCkpZz1kKGUuZ2VucmFuZF9yZXM1MygpKihmKzEpKSxmPGI/KGc8ZiYmKG1bZl09bVtnXSksbVtnXT1sKTpnPGImJihtW2ddPWwpO2lmKGY8Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJzYW1wbGUgbGFyZ2VyIHRoYW4gcG9wdWxhdGlvblxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KG0pfSksZH07XCIsXCJzcmMvbGliL3JlLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24obmFtZSl7dmFyIHZhbGlkR3JvdXBzLGNvbnZlcnQsZ2V0RmxhZ3MsX3NwbGl0LF9maW5kYWxsLG1hdGNob2JqLF9zZWFyY2gsX21hdGNoLHJlZ2V4b2JqLG1vZD17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJyZVxcXCIpfTtyZXR1cm4gbW9kLkk9Mixtb2QuSUdOT1JFQ0FTRT0yLG1vZC5NPTgsbW9kLk1VTFRJTElORT04LHZhbGlkR3JvdXBzPVtcXFwiKD86XFxcIixcXFwiKD89XFxcIixcXFwiKD8hXFxcIl0sY29udmVydD1mdW5jdGlvbihhKXt2YXIgYixjLGQ7aWYoYz1hLm1hdGNoKC9cXFxcKFxcXFw/Li9nKSxjKWZvcihkPTA7ZDxjLmxlbmd0aDtkKyspaWYoLTE9PXZhbGlkR3JvdXBzLmluZGV4T2YoY1tkXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiRGlzYWxsb3dlZCBncm91cCBpbiBwYXR0ZXJuOiAnXFxcIitjW2RdK1xcXCInXFxcIik7cmV0dXJuIGI9YS5yZXBsYWNlKFxcXCIvXFxcXFxcXFwvZ1xcXCIsXFxcIlxcXFxcXFxcXFxcXFxcXFxcXFwiKSxiPWEucmVwbGFjZSgvKFteXFxcXFxcXFxdKXssKD8hW15cXFxcW10qXFxcXF0pL2csXFxcIiQxezAsXFxcIiksYn0sZ2V0RmxhZ3M9ZnVuY3Rpb24oYSl7dmFyIGI9XFxcImdcXFwiO3JldHVybihhJm1vZC5JR05PUkVDQVNFKT09bW9kLklHTk9SRUNBU0UmJihiKz1cXFwiaVxcXCIpLChhJm1vZC5NVUxUSUxJTkUpPT1tb2QuTVVMVElMSU5FJiYoYis9XFxcIm1cXFwiKSxifSxfc3BsaXQ9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqLGssbCxtO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNwbGl0XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJtYXhzcGxpdCBtdXN0IGJlIGEgbnVtYmVyXFxcIik7aWYodm9pZCAwPT09ZCYmKGQ9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7Zm9yKGM9U2suYnVpbHRpbi5hc251bSQoYyksZT1Tay5mZmkudW53cmFwbyhhKSxmPVNrLmZmaS51bndyYXBvKGIpLGU9Y29udmVydChlKSxnPW51bGwhPT1lLm1hdGNoKC9eXFxcXCguKlxcXFwpJC8pLGg9Z2V0RmxhZ3MoZCksaT1uZXcgUmVnRXhwKGUsaCksaj1bXSxrLGw9MCxtPTA7bnVsbCE9KGs9aS5leGVjKGYpKSYmay5pbmRleCE9PWkubGFzdEluZGV4JiYoai5wdXNoKG5ldyBTay5idWlsdGluLnN0cihmLnN1YnN0cmluZyhsLGsuaW5kZXgpKSksZyYmai5wdXNoKG5ldyBTay5idWlsdGluLnN0cihrWzBdKSksbD1pLmxhc3RJbmRleCxtKz0xLCEoYyYmbT49YykpOyk7cmV0dXJuIGoucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZi5zdWJzdHJpbmcobCkpKSxuZXcgU2suYnVpbHRpbi5saXN0KGopfSxfc3BsaXQuY29fdmFybmFtZXM9W1xcXCJwYXR0ZXJuXFxcIixcXFwic3RyaW5nXFxcIixcXFwibWF4c3BsaXRcXFwiLFxcXCJmbGFnc1xcXCJdLF9zcGxpdC4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCksbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0sbW9kLnNwbGl0PW5ldyBTay5idWlsdGluLmZ1bmMoX3NwbGl0KSxfZmluZGFsbD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxqO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImZpbmRhbGxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic3RyaW5nIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz0wKSwhU2suYnVpbHRpbi5jaGVja051bWJlcihjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZsYWdzIG11c3QgYmUgYSBudW1iZXJcXFwiKTtpZihkPVNrLmZmaS51bndyYXBvKGEpLGU9U2suZmZpLnVud3JhcG8oYiksZD1jb252ZXJ0KGQpLGY9Z2V0RmxhZ3MoYyksZz1uZXcgUmVnRXhwKGQsZiksZC5tYXRjaCgvXFxcXCQvKSl7dmFyIGs9bmV3IFJlZ0V4cCgvXFxcXG4kLyk7ZS5tYXRjaChrKSYmKGU9ZS5zbGljZSgwLC0xKSl9Zm9yKGg9W10sajtudWxsIT0oaj1nLmV4ZWMoZSkpOyl7aWYoMj5qLmxlbmd0aCloLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGpbMF0pKTtlbHNlIGlmKDI9PWoubGVuZ3RoKWgucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoalsxXSkpO2Vsc2V7Zm9yKHZhciBsPVtdLG09MTttPGoubGVuZ3RoO20rKylsLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGpbbV0pKTtoLnB1c2gobmV3IFNrLmJ1aWx0aW4udHVwbGUobCkpfWouaW5kZXg9PT1nLmxhc3RJbmRleCYmKGcubGFzdEluZGV4Kz0xKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChoKX0sX2ZpbmRhbGwuY29fdmFybmFtZXM9W1xcXCJwYXR0ZXJuXFxcIixcXFwic3RyaW5nXFxcIixcXFwiZmxhZ3NcXFwiXSxfZmluZGFsbC4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCldLG1vZC5maW5kYWxsPW5ldyBTay5idWlsdGluLmZ1bmMoX2ZpbmRhbGwpLG1hdGNob2JqPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLnRoZW1hdGNoPWIsYS5yZT1jLGEuc3RyaW5nPWQsU2suYnVpbHRpbi5ub25lLm5vbmUkfSksYi5ncm91cHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnRoZW1hdGNoLnYuc2xpY2UoMSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfSksYi5ncm91cD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7aWYoYj12b2lkIDA9PT1iPzA6U2suYnVpbHRpbi5hc251bSQoYiksYj49YS50aGVtYXRjaC52Lmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJJbmRleCBvdXQgb2YgcmFuZ2U6IFxcXCIrYik7cmV0dXJuIGEudGhlbWF0Y2gudltiXX0pfSxtb2QuTWF0Y2hPYmplY3Q9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhtb2QsbWF0Y2hvYmosXFxcIk1hdGNoT2JqZWN0XFxcIixbXSksbW9kLl9maW5kcmU9ZnVuY3Rpb24ocmVzLHN0cmluZyl7cmVzPXJlcy5yZXBsYWNlKC8oW15cXFxcXFxcXF0peywoPyFbXlxcXFxbXSpcXFxcXSkvZyxcXFwiJDF7MCxcXFwiKTt2YXIgbWF0Y2hlcyxzaXRlbSxyZXR2YWwscmU9ZXZhbChyZXMpLHBhdHQ9L1xcXFxuJC8sc3RyPVNrLmZmaS5yZW1hcFRvSnMoc3RyaW5nKTtpZihtYXRjaGVzPXN0ci5tYXRjaChwYXR0KT9zdHIuc2xpY2UoMCwtMSkubWF0Y2gocmUpOnN0ci5tYXRjaChyZSkscmV0dmFsPW5ldyBTay5idWlsdGluLmxpc3QsbnVsbD09bWF0Y2hlcylyZXR1cm4gcmV0dmFsO2Zvcih2YXIgaT0wO2k8bWF0Y2hlcy5sZW5ndGg7KytpKXNpdGVtPW5ldyBTay5idWlsdGluLnN0cihtYXRjaGVzW2ldKSxyZXR2YWwudi5wdXNoKHNpdGVtKTtyZXR1cm4gcmV0dmFsfSxfc2VhcmNoPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNlYXJjaFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwicGF0dGVybiBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzdHJpbmcgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO3JldHVybihlPVxcXCIvXFxcIithLnYucmVwbGFjZSgvXFxcXC8vZyxcXFwiXFxcXFxcXFwvXFxcIikrXFxcIi9cXFwiLGxzdD1tb2QuX2ZpbmRyZShlLGIpLDE+bHN0LnYubGVuZ3RoKT9Tay5idWlsdGluLm5vbmUubm9uZSQ6KGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG1vZC5NYXRjaE9iamVjdCxbbHN0LGEsYl0pLGQpfSxfc2VhcmNoLmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcImZsYWdzXFxcIl0sX3NlYXJjaC4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCldLG1vZC5zZWFyY2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhfc2VhcmNoKSxfbWF0Y2g9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibWF0Y2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic3RyaW5nIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz0wKSwhU2suYnVpbHRpbi5jaGVja051bWJlcihjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZsYWdzIG11c3QgYmUgYSBudW1iZXJcXFwiKTtyZXR1cm4ocGF0PVNrLmZmaS5yZW1hcFRvSnMoYSksZT1cXFwiL15cXFwiK3BhdC5yZXBsYWNlKC9cXFxcLy9nLFxcXCJcXFxcXFxcXC9cXFwiKStcXFwiL1xcXCIsbHN0PW1vZC5fZmluZHJlKGUsYiksMT5Tay5mZmkucmVtYXBUb0pzKGxzdCkubGVuZ3RoKT9Tay5idWlsdGluLm5vbmUubm9uZSQ6KGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG1vZC5NYXRjaE9iamVjdCxbbHN0LGEsYl0pLGQpfSxfbWF0Y2guY29fdmFybmFtZXM9W1xcXCJwYXR0ZXJuXFxcIixcXFwic3RyaW5nXFxcIixcXFwiZmxhZ3NcXFwiXSxfbWF0Y2guJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2QubWF0Y2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhfbWF0Y2gpLHJlZ2V4b2JqPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZyxoO2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEucmU9YixhLmZsYWdzPXZvaWQgMD09PWM/MDpjLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1cXFwicmUuY29tcGlsZSgnXFxcIitTay5mZmkucmVtYXBUb0pzKGEucmUpK1xcXCInKVxcXCI7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoYi5zdWJzdHJpbmcoMCwyMTIpKX0pLGIuX19zdHJfXz1oLGIuX19yZXByX189aCxjPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1Tay5mZmkucmVtYXBUb0pzKGEpLGU9bnVsbD09Yj8wOlNrLmZmaS5yZW1hcFRvSnMoYiksZj1udWxsPT1jP2QubGVuZ3RoOlNrLmZmaS5yZW1hcFRvSnMoYyk7cmV0dXJuXFxcIl5cXFwiPT1lJiYoZT1kLmluZGV4T2YoXFxcIlxcXFxuXFxcIikrMSksbnVsbD09PWYmJihmPWQubGVuZ3RoKSxTay5mZmkucmVtYXBUb1B5KGQuc3Vic3RyaW5nKGUsZikpfSxkPWZ1bmN0aW9uKGEsYixkLGUpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNlYXJjaFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpO3ZhciBmPWMoYixkLGUpO3JldHVybiBfc2VhcmNoKGEucmUsZixhLmZsYWdzKX0sZC5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJwb3NcXFwiLFxcXCJlbmRwb3NcXFwiXSxkLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdLGIuc2VhcmNoPW5ldyBTay5idWlsdGluLmZ1bmMoZCksZT1mdW5jdGlvbihhLGIsZCxlKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJtYXRjaFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpO3ZhciBmPWMoYixkLGUpO3JldHVybiBfbWF0Y2goYS5yZSxmLGEuZmxhZ3MpfSxlLmNvX3Zhcm5hbWVzPVtcXFwic2VsZlxcXCIsXFxcInN0cmluZ1xcXCIsXFxcInBvc1xcXCIsXFxcImVuZHBvc1xcXCJdLGUuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0sYi5tYXRjaD1uZXcgU2suYnVpbHRpbi5mdW5jKGUpLGY9ZnVuY3Rpb24oYSxiLGMpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNwbGl0XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksdm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJtYXhzcGxpdCBtdXN0IGJlIGFuIGludGVnZXJcXFwiKTtyZXR1cm4gX3NwbGl0KGEucmUsYixjLGEuZmxhZ3MpfSxmLmNvX3Zhcm5hbWVzPVtcXFwic2VsZlxcXCIsXFxcInN0cmluZ1xcXCIsXFxcIm1heHNwbGl0XFxcIl0sZi4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCldLGIuc3BsaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmKSxnPWZ1bmN0aW9uKGEsYixkLGUpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImZpbmRhbGxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KTt2YXIgZj1jKGIsZCxlKTtyZXR1cm4gX2ZpbmRhbGwoYS5yZSxmLGEuZmxhZ3MpfSxnLmNvX3Zhcm5hbWVzPVtcXFwic2VsZlxcXCIsXFxcInN0cmluZ1xcXCIsXFxcInBvc1xcXCIsXFxcImVuZHBvc1xcXCJdLGcuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0sYi5maW5kYWxsPW5ldyBTay5idWlsdGluLmZ1bmMoZyl9LG1vZC5SZWdleE9iamVjdD1Tay5taXNjZXZhbC5idWlsZENsYXNzKG1vZCxyZWdleG9iaixcXFwiUmVnZXhPYmplY3RcXFwiLFtdKSxtb2QuY29tcGlsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiY29tcGlsZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDIpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwicGF0dGVybiBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YiYmKGI9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7cmV0dXJuIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG1vZC5SZWdleE9iamVjdCxbYSxiXSksY30pLG1vZC5wdXJnZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7fSksbW9kfTtcIixcInNyYy9saWIvcmVwci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicmVwciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JlcXVlc3RzLnB5XCI6XCIjIG1vc3QgcmVzdHJpY3RlZCB2ZXJzaW9uXFxuXFxcIlxcXCJcXFwiXFxuVGhpcyBzb2x1dGlvbiB3b3JrcyBpbiBydW5lc3RvbmUgLSBob3dldmVyIGl0IGlzIG11Y2ggbW9yZSBsaW1pdGVkLlxcbkFuIGVycm9yIGRvZXMgbm90IG9jY3VyIGluIHRoZSBzYW1lIHdheSBpbiB0aGUgdGV4dGJvb2sgYXMgaXQgZG9lc1xcbmZvciB0aGUgY29tbWFuZCBsaW5lLiBTaW5jZSBIVFRQRXJyb3IgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgaW5cXG5SdW5lc3RvbmUsIEkgaGFkIHRvIGNoYW5nZSB0aGUgZXhjZXB0aW9uLlxcbkRlY29kZSBhbmQgRW5jb2RlIGFyZSBub3QgYXZhaWxhYmxlIGluIFJ1bmVzdG9uZSwgc28gdGhlcmUgbWlnaHQgYmVcXG5pc3N1ZXMgd2l0aCByZXBvbnNlcy5cXG5Eb2VzIG5vdCB1c2UgdGhlIHN0YXR1cyBhdHRyaWJ1dGUgZm9yIHVybG9wZW4sIHdvdWxkIGJlIG5pY2UgdG8gaGF2ZVxcbnRoYXQgYmFjay5cXG5Eb2VzIG5vdCB3b3JrIG9uIHJlZ3VsYXIgd2ViIHBhZ2VzIChsaWtlIGdvb2dsZSBvciB0aGUgbWljaGlnYW4gZGFpbHkpIGJlY2F1c2Ugb2YgY3Jvc3Mtc2l0ZSBzY3JpcHRpbmcgbGltaXRzLlxcblxcXCJcXFwiXFxcIlxcbmZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW5cXG5pbXBvcnQganNvblxcblxcbmNsYXNzIFJlc3BvbnNlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSwgdXJsKTpcXG4gICAgICAgIHNlbGYudGV4dCA9IGRhdGFcXG4gICAgICAgIHNlbGYudXJsID0gdXJsXFxuXFxuICAgIGRlZiBqc29uKHNlbGYpOlxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKHNlbGYudGV4dClcXG4gICAgICAgIGV4Y2VwdDpcXG4gICAgICAgICAgICByZXR1cm4ge1xcXCJlcnJvclxcXCI6IFxcXCJSZXNwb25zZSBub3QgaW50ZXJwcmV0YWJsZSBhcyBqc29uLiBUcnkgcHJpbnRpbmcgdGhlIC50ZXh0IGF0dHJpYnV0ZVxcXCJ9XFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIFxcXCI8QSBSZXNwb25zZSBvYmplY3QgZm9yIHRoZSBmb2xsb3dpbmcgcmVxdWVzdDoge30+XFxcIi5mb3JtYXQoc2VsZi51cmwpXFxuXFxuXFxudXJsX3N1YnMgPSB7XFxcIiBcXFwiOiBcXFwiK1xcXCIsXFxuICAgICAgICAgICAgXFxcIiFcXFwiOiBcXFwiJTIxXFxcIixcXG4gICAgICAgICAgICAnXFxcIic6IFxcXCIlMjJcXFwiLFxcbiAgICAgICAgICAgIFxcXCIjXFxcIjogXFxcIiUyM1xcXCIsXFxuICAgICAgICAgICAgXFxcIiRcXFwiOiBcXFwiJTI0XFxcIixcXG4gICAgICAgICAgICBcXFwiJ1xcXCI6IFxcXCIlMjdcXFwiLFxcbiAgICAgICAgICAgIFxcXCIoXFxcIjogXFxcIiUyOFxcXCIsXFxuICAgICAgICAgICAgXFxcIilcXFwiOiBcXFwiJTI5XFxcIixcXG4gICAgICAgICAgICBcXFwiKlxcXCI6IFxcXCIlMkFcXFwiLFxcbiAgICAgICAgICAgIFxcXCIrXFxcIjogXFxcIiUyQlxcXCIsXFxuICAgICAgICAgICAgXFxcIixcXFwiOiBcXFwiJTJDXFxcIixcXG4gICAgICAgICAgICBcXFwiL1xcXCI6IFxcXCIlMkZcXFwiLFxcbiAgICAgICAgICAgIFxcXCI6XFxcIjogXFxcIiUzQVxcXCIsXFxuICAgICAgICAgICAgXFxcIjtcXFwiOiBcXFwiJTNCXFxcIixcXG4gICAgICAgICAgICBcXFwiPVxcXCI6IFxcXCIlM0RcXFwiLFxcbiAgICAgICAgICAgIFxcXCI/XFxcIjogXFxcIiUzRlxcXCIsXFxuICAgICAgICAgICAgXFxcIkBcXFwiOiBcXFwiJTQwXFxcIixcXG4gICAgICAgICAgICBcXFwiW1xcXCI6IFxcXCIlNUJcXFwiLFxcbiAgICAgICAgICAgIFxcXCJdXFxcIjogXFxcIiU1RFxcXCIsXFxuICAgICAgICAgICAgfVxcblxcbmRlZiBfc3Vic3Qocywgc3Vic3RpdHV0aW9ucz11cmxfc3Vicyk6XFxuICAgIHJlcyA9IFxcXCJcXFwiXFxuICAgIGZvciBjIGluIHN0cihzKTpcXG4gICAgICAgIGlmIGMgaW4gc3Vic3RpdHV0aW9uczpcXG4gICAgICAgICAgICByZXMgKz0gc3Vic3RpdHV0aW9uc1tjXVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXMgKz0gY1xcbiAgICByZXR1cm4gcmVzXFxuXFxuXFxuZGVmIHJlcXVlc3RVUkwoYmFzZXVybCwgcGFyYW1zPXt9KTpcXG4gICAgdHJ5OlxcbiAgICAgICAgaWYgbGVuKHBhcmFtcykgPT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gYmFzZXVybFxcbiAgICAgICAgY29tcGxldGVfdXJsID0gYmFzZXVybCArIFxcXCI/XFxcIlxcbiAgICAgICAgcGFpcnMgPSBbXFxcInt9PXt9XFxcIi5mb3JtYXQoX3N1YnN0KGspLCBfc3Vic3QocGFyYW1zW2tdKSkgZm9yIGsgaW4gcGFyYW1zXVxcbiAgICAgICAgY29tcGxldGVfdXJsICs9IFxcXCImXFxcIi5qb2luKHBhaXJzKVxcbiAgICAgICAgcmV0dXJuIGNvbXBsZXRlX3VybFxcbiAgICBleGNlcHQ6XFxuICAgICAgICByZXR1cm4gTm9uZVxcblxcbmRlZiBnZXQoYmFzZXVybCwgcGFyYW1zPXt9KTpcXG4gICAgZnVsbF91cmwgPSByZXF1ZXN0VVJMKGJhc2V1cmwsIHBhcmFtcylcXG4gICAgaWYgbm90IGZ1bGxfdXJsOlxcbiAgICAgICAgdGV4dF9kYXRhID0gXFxcIjxodG1sPjxib2R5PjxoMT5pbnZhbGlkIHJlcXVlc3Q8L2gxPjwvYm9keT48L2h0bWw+XFxcIlxcbiAgICAgICAgZnVsbF91cmwgPSBcXFwiQ291bGRu4oCZdCBnZW5lcmF0ZSBhIHZhbGlkIFVSTFxcXCJcXG4gICAgZWxzZTpcXG4gICAgICAgIGRhdGEgPSB1cmxvcGVuKGZ1bGxfdXJsKVxcbiAgICAgICAgdGV4dF9kYXRhID0gZGF0YS5yZWFkKCkuc3RyaXAoKVxcbiAgICAgICAgaWYgbGVuKHRleHRfZGF0YSkgPT0gMDpcXG4gICAgICAgICAgICB0ZXh0X2RhdGEgPSBcXFwiRmFpbGVkIHRvIHJldHJpZXZlIHRoYXQgVVJMXFxcIlxcbiAgICByZXR1cm4gUmVzcG9uc2UodGV4dF9kYXRhLCBmdWxsX3VybClcIixcInNyYy9saWIvcmVxdWVzdHNfd2l0aF9jYWNoaW5nLnB5XCI6XCJpbXBvcnQgcmVxdWVzdHNcXG5pbXBvcnQganNvblxcblxcblBFUk1BTkVOVF9DQUNIRV9GTkFNRSA9IFxcXCJwZXJtYW5lbnRfY2FjaGUudHh0XFxcIlxcblRFTVBfQ0FDSEVfRk5BTUUgPSBcXFwidGhpc19wYWdlX2NhY2hlLnR4dFxcXCJcXG5cXG5kZWYgX3dyaXRlX3RvX2ZpbGUoY2FjaGUsIGZuYW1lKTpcXG4gICAgd2l0aCBvcGVuKGZuYW1lLCAndycpIGFzIG91dGZpbGU6XFxuICAgICAgICBvdXRmaWxlLndyaXRlKGpzb24uZHVtcHMoY2FjaGUsIGluZGVudD0yKSlcXG5cXG5kZWYgX3JlYWRfZnJvbV9maWxlKGZuYW1lKTpcXG4gICAgdHJ5OlxcbiAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCAncicpIGFzIGluZmlsZTpcXG4gICAgICAgICAgICByZXMgPSBpbmZpbGUucmVhZCgpXFxuICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMocmVzKVxcbiAgICBleGNlcHQ6XFxuICAgICAgICByZXR1cm4ge31cXG5cXG5kZWYgYWRkX3RvX2NhY2hlKGNhY2hlX2ZpbGUsIGNhY2hlX2tleSwgY2FjaGVfdmFsdWUpOlxcbiAgICB0ZW1wX2NhY2hlID0gX3JlYWRfZnJvbV9maWxlKGNhY2hlX2ZpbGUpXFxuICAgIHRlbXBfY2FjaGVbY2FjaGVfa2V5XSA9IGNhY2hlX3ZhbHVlXFxuICAgIF93cml0ZV90b19maWxlKHRlbXBfY2FjaGUsIGNhY2hlX2ZpbGUpXFxuXFxuZGVmIGNsZWFyX2NhY2hlKGNhY2hlX2ZpbGU9VEVNUF9DQUNIRV9GTkFNRSk6XFxuICAgIF93cml0ZV90b19maWxlKHt9LCBjYWNoZV9maWxlKVxcblxcbmRlZiBtYWtlX2NhY2hlX2tleShiYXNldXJsLCBwYXJhbXNfZCwgcHJpdmF0ZV9rZXlzPVtcXFwiYXBpX2tleVxcXCIsIFxcXCJhcGlrZXlcXFwiXSk6XFxuICAgIFxcXCJcXFwiXFxcIk1ha2VzIGEgbG9uZyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBxdWVyeS5cXG4gICAgQWxwaGFiZXRpemUgdGhlIGtleXMgZnJvbSB0aGUgcGFyYW1zIGRpY3Rpb25hcnkgc28gd2UgZ2V0IHRoZSBzYW1lIG9yZGVyIGVhY2ggdGltZS5cXG4gICAgT21pdCBrZXlzIHdpdGggcHJpdmF0ZSBpbmZvLlxcXCJcXFwiXFxcIlxcbiAgICBhbHBoYWJldGl6ZWRfa2V5cyA9IHNvcnRlZChwYXJhbXNfZC5rZXlzKCkpXFxuICAgIHJlcyA9IFtdXFxuICAgIGZvciBrIGluIGFscGhhYmV0aXplZF9rZXlzOlxcbiAgICAgICAgaWYgayBub3QgaW4gcHJpdmF0ZV9rZXlzOlxcbiAgICAgICAgICAgIHJlcy5hcHBlbmQoXFxcInt9LXt9XFxcIi5mb3JtYXQoaywgcGFyYW1zX2Rba10pKVxcbiAgICByZXR1cm4gYmFzZXVybCArIFxcXCJfXFxcIi5qb2luKHJlcylcXG5cXG5kZWYgZ2V0KGJhc2V1cmwsIHBhcmFtcz17fSwgcHJpdmF0ZV9rZXlzX3RvX2lnbm9yZT1bXFxcImFwaV9rZXlcXFwiLCBcXFwiYXBpa2V5XFxcIl0sIHBlcm1hbmVudF9jYWNoZV9maWxlPVBFUk1BTkVOVF9DQUNIRV9GTkFNRSwgdGVtcF9jYWNoZV9maWxlPVRFTVBfQ0FDSEVfRk5BTUUpOlxcbiAgICBmdWxsX3VybCA9IHJlcXVlc3RzLnJlcXVlc3RVUkwoYmFzZXVybCwgcGFyYW1zKVxcbiAgICBjYWNoZV9rZXkgPSBtYWtlX2NhY2hlX2tleShiYXNldXJsLCBwYXJhbXMsIHByaXZhdGVfa2V5c190b19pZ25vcmUpXFxuICAgICMgTG9hZCB0aGUgcGVybWFuZW50IGFuZCBwYWdlLXNwZWNpZmljIGNhY2hlcyBmcm9tIGZpbGVzXFxuICAgIHBlcm1hbmVudF9jYWNoZSA9IF9yZWFkX2Zyb21fZmlsZShwZXJtYW5lbnRfY2FjaGVfZmlsZSlcXG4gICAgdGVtcF9jYWNoZSA9IF9yZWFkX2Zyb21fZmlsZSh0ZW1wX2NhY2hlX2ZpbGUpXFxuICAgIGlmIGNhY2hlX2tleSBpbiB0ZW1wX2NhY2hlOlxcbiAgICAgICAgcHJpbnQoXFxcImZvdW5kIGluIHBhZ2Utc3BlY2lmaWMgY2FjaGVcXFwiKVxcbiAgICAgICAgIyBtYWtlIGEgUmVzcG9uc2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGV4dCBmcm9tIHRoZSBjaGFuZ2UsIGFuZCB0aGUgZnVsbF91cmwgdGhhdCB3b3VsZCBoYXZlIGJlZW4gZmV0Y2hlZFxcbiAgICAgICAgcmV0dXJuIHJlcXVlc3RzLlJlc3BvbnNlKHRlbXBfY2FjaGVbY2FjaGVfa2V5XSwgZnVsbF91cmwpXFxuICAgIGVsaWYgY2FjaGVfa2V5IGluIHBlcm1hbmVudF9jYWNoZTpcXG4gICAgICAgIHByaW50KFxcXCJmb3VuZCBpbiBwZXJtYW5lbnRfY2FjaGVcXFwiKVxcbiAgICAgICAgIyBtYWtlIGEgUmVzcG9uc2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGV4dCBmcm9tIHRoZSBjaGFuZ2UsIGFuZCB0aGUgZnVsbF91cmwgdGhhdCB3b3VsZCBoYXZlIGJlZW4gZmV0Y2hlZFxcbiAgICAgICAgcmV0dXJuIHJlcXVlc3RzLlJlc3BvbnNlKHBlcm1hbmVudF9jYWNoZVtjYWNoZV9rZXldLCBmdWxsX3VybClcXG4gICAgZWxzZTpcXG4gICAgICAgIHByaW50KFxcXCJuZXc7IGFkZGluZyB0byBjYWNoZVxcXCIpXFxuICAgICAgICAjIGFjdHVhbGx5IHJlcXVlc3QgaXRcXG4gICAgICAgIHJlc3AgPSByZXF1ZXN0cy5nZXQoYmFzZXVybCwgcGFyYW1zKVxcbiAgICAgICAgIyBzYXZlIGl0XFxuICAgICAgICBhZGRfdG9fY2FjaGUodGVtcF9jYWNoZV9maWxlLCBjYWNoZV9rZXksIHJlc3AudGV4dClcXG4gICAgICAgIHJldHVybiByZXNwXCIsXCJzcmMvbGliL3JleGVjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJyZXhlYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JmYzgyMi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicmZjODIyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcmxjb21wbGV0ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJsY29tcGxldGVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcm9ib3RwYXJzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJvYm90cGFyc2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcnVucHkucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJ1bnB5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2NoZWQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNjaGVkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2V0cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2V0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NnbWxsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNnbWxsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zaGEucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNoYSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NoZWx2ZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2hlbHZlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2hsZXgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNobGV4IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2h1dGlsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaHV0aWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zaWduYWwuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtTSUdfREZMOm5ldyBTay5idWlsdGluLmludF8oMCksU0lHX0lHTjpuZXcgU2suYnVpbHRpbi5pbnRfKDEpLENUUkxfQ19FVkVOVDpuZXcgU2suYnVpbHRpbi5pbnRfKDApLENUUkxfQlJFQUtfRVZFTlQ6bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxOU0lHOm5ldyBTay5idWlsdGluLmludF8oMjMpLFNJR0hVUDpuZXcgU2suYnVpbHRpbi5pbnRfKDEpLFNJR05JTlQ6bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxTSUdJTEw6bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxTSUdGUEU6bmV3IFNrLmJ1aWx0aW4uaW50Xyg4KSxTSUdLSUxMOm5ldyBTay5idWlsdGluLmludF8oOSksU0lHU0VHVjpuZXcgU2suYnVpbHRpbi5pbnRfKDExKSxTSUdURVJNOm5ldyBTay5idWlsdGluLmludF8oMTUpLFNJR0JSRUFLOm5ldyBTay5idWlsdGluLmludF8oMjEpLFNJR0FCUlQ6bmV3IFNrLmJ1aWx0aW4uaW50XygyMikscGF1c2U6bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInBhdXNlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCk7dmFyIGE9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247cmV0dXJuIGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sYS5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGEpe2lmKG51bGwhPVNrLnNpZ25hbHMmJlNrLnNpZ25hbHMuYWRkRXZlbnRMaXN0ZW5lcil7ZnVuY3Rpb24gaGFuZGxlU2lnbmFsKCl7U2suc2lnbmFscy5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZVNpZ25hbCksYSgpfVNrLnNpZ25hbHMuYWRkRXZlbnRMaXN0ZW5lcihoYW5kbGVTaWduYWwpfWVsc2UgY29uc29sZS53YXJuKFxcXCJzaWduYWwucGF1c2UoKSBub3Qgc3VwcG9ydGVkXFxcIiksU2subWlzY2V2YWwucHJpbnRfKFxcXCJzaWduYWwucGF1c2UoKSBub3Qgc3VwcG9ydGVkXFxcIiksYSgpfSl9LGF9KSxzaWduYWw6bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNpZ25hbC5zaWduYWwgaXMgbm90IHN1cHBvcnRlZC5cXFwiKX0pfTtyZXR1cm4gYX07XCIsXCJzcmMvbGliL3NpdGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNpdGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zbXRwZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic210cGQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zbXRwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzbXRwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc25kaGRyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzbmRoZHIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zb2NrZXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNvY2tldCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NxbGl0ZTMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNxbGl0ZTMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNyZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NyZV9jb21waWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmVfY29tcGlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NyZV9jb25zdGFudHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNyZV9jb25zdGFudHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmVfcGFyc2UucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNyZV9wYXJzZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NzbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3NsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RhdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RhdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0YXRpc3RpY3MucHlcIjpcIlxcXCJcXFwiXFxcIlxcbkJhc2ljIHN0YXRpc3RpY3MgbW9kdWxlLlxcblxcblRoaXMgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgY2FsY3VsYXRpbmcgc3RhdGlzdGljcyBvZiBkYXRhLCBpbmNsdWRpbmdcXG5hdmVyYWdlcywgdmFyaWFuY2UsIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24uXFxuXFxuQ2FsY3VsYXRpbmcgYXZlcmFnZXNcXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuRnVuY3Rpb24gICAgICAgICAgICBEZXNjcmlwdGlvblxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxubWVhbiAgICAgICAgICAgICAgICBBcml0aG1ldGljIG1lYW4gKGF2ZXJhZ2UpIG9mIGRhdGEuXFxuaGFybW9uaWNfbWVhbiAgICAgICBIYXJtb25pYyBtZWFuIG9mIGRhdGEuXFxubWVkaWFuICAgICAgICAgICAgICBNZWRpYW4gKG1pZGRsZSB2YWx1ZSkgb2YgZGF0YS5cXG5tZWRpYW5fbG93ICAgICAgICAgIExvdyBtZWRpYW4gb2YgZGF0YS5cXG5tZWRpYW5faGlnaCAgICAgICAgIEhpZ2ggbWVkaWFuIG9mIGRhdGEuXFxubWVkaWFuX2dyb3VwZWQgICAgICBNZWRpYW4sIG9yIDUwdGggcGVyY2VudGlsZSwgb2YgZ3JvdXBlZCBkYXRhLlxcbm1vZGUgICAgICAgICAgICAgICAgTW9kZSAobW9zdCBjb21tb24gdmFsdWUpIG9mIGRhdGEuXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5cXG5DYWxjdWxhdGUgdGhlIGFyaXRobWV0aWMgbWVhbiAoXFxcInRoZSBhdmVyYWdlXFxcIikgb2YgZGF0YTpcXG5cXG4+Pj4gbWVhbihbLTEuMCwgMi41LCAzLjI1LCA1Ljc1XSlcXG4yLjYyNVxcblxcblxcbkNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgbWVkaWFuIG9mIGRpc2NyZXRlIGRhdGE6XFxuXFxuPj4+IG1lZGlhbihbMiwgMywgNCwgNV0pXFxuMy41XFxuXFxuXFxuQ2FsY3VsYXRlIHRoZSBtZWRpYW4sIG9yIDUwdGggcGVyY2VudGlsZSwgb2YgZGF0YSBncm91cGVkIGludG8gY2xhc3MgaW50ZXJ2YWxzXFxuY2VudHJlZCBvbiB0aGUgZGF0YSB2YWx1ZXMgcHJvdmlkZWQuIEUuZy4gaWYgeW91ciBkYXRhIHBvaW50cyBhcmUgcm91bmRlZCB0b1xcbnRoZSBuZWFyZXN0IHdob2xlIG51bWJlcjpcXG5cXG4+Pj4gbWVkaWFuX2dyb3VwZWQoWzIsIDIsIDMsIDMsIDMsIDRdKSAgI2RvY3Rlc3Q6ICtFTExJUFNJU1xcbjIuODMzMzMzMzMzMy4uLlxcblxcblRoaXMgc2hvdWxkIGJlIGludGVycHJldGVkIGluIHRoaXMgd2F5OiB5b3UgaGF2ZSB0d28gZGF0YSBwb2ludHMgaW4gdGhlIGNsYXNzXFxuaW50ZXJ2YWwgMS41LTIuNSwgdGhyZWUgZGF0YSBwb2ludHMgaW4gdGhlIGNsYXNzIGludGVydmFsIDIuNS0zLjUsIGFuZCBvbmUgaW5cXG50aGUgY2xhc3MgaW50ZXJ2YWwgMy41LTQuNS4gVGhlIG1lZGlhbiBvZiB0aGVzZSBkYXRhIHBvaW50cyBpcyAyLjgzMzMuLi5cXG5cXG5cXG5DYWxjdWxhdGluZyB2YXJpYWJpbGl0eSBvciBzcHJlYWRcXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbkZ1bmN0aW9uICAgICAgICAgICAgRGVzY3JpcHRpb25cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbnB2YXJpYW5jZSAgICAgICAgICAgUG9wdWxhdGlvbiB2YXJpYW5jZSBvZiBkYXRhLlxcbnZhcmlhbmNlICAgICAgICAgICAgU2FtcGxlIHZhcmlhbmNlIG9mIGRhdGEuXFxucHN0ZGV2ICAgICAgICAgICAgICBQb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBkYXRhLlxcbnN0ZGV2ICAgICAgICAgICAgICAgU2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBkYXRhLlxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuXFxuQ2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2Ygc2FtcGxlIGRhdGE6XFxuXFxuPj4+IHN0ZGV2KFsyLjUsIDMuMjUsIDUuNSwgMTEuMjUsIDExLjc1XSkgICNkb2N0ZXN0OiArRUxMSVBTSVNcXG40LjM4OTYxODQzNDQ0Li4uXFxuXFxuSWYgeW91IGhhdmUgcHJldmlvdXNseSBjYWxjdWxhdGVkIHRoZSBtZWFuLCB5b3UgY2FuIHBhc3MgaXQgYXMgdGhlIG9wdGlvbmFsXFxuc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBmb3VyIFxcXCJzcHJlYWRcXFwiIGZ1bmN0aW9ucyB0byBhdm9pZCByZWNhbGN1bGF0aW5nIGl0Olxcblxcbj4+PiBkYXRhID0gWzEsIDIsIDIsIDQsIDQsIDQsIDUsIDZdXFxuPj4+IG11ID0gbWVhbihkYXRhKVxcbj4+PiBwdmFyaWFuY2UoZGF0YSwgbXUpXFxuMi41XFxuXFxuXFxuRXhjZXB0aW9uc1xcbi0tLS0tLS0tLS1cXG5cXG5BIHNpbmdsZSBleGNlcHRpb24gaXMgZGVmaW5lZDogU3RhdGlzdGljc0Vycm9yIGlzIGEgc3ViY2xhc3Mgb2YgVmFsdWVFcnJvci5cXG5cXG5cXFwiXFxcIlxcXCJcXG5cXG5fX2FsbF9fID0gWyAnU3RhdGlzdGljc0Vycm9yJyxcXG4gICAgICAgICAgICAncHN0ZGV2JywgJ3B2YXJpYW5jZScsICdzdGRldicsICd2YXJpYW5jZScsXFxuICAgICAgICAgICAgJ21lZGlhbicsICAnbWVkaWFuX2xvdycsICdtZWRpYW5faGlnaCcsICdtZWRpYW5fZ3JvdXBlZCcsXFxuICAgICAgICAgICAgJ21lYW4nLCAnbW9kZScsICdoYXJtb25pY19tZWFuJyxcXG4gICAgICAgICAgXVxcblxcbmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IENvdW50ZXJcXG5mcm9tIG1hdGggaW1wb3J0IHNxcnRcXG5cXG5kZWYgbWVhbihkYXRhKTpcXG4gICAgcmV0dXJuIHN1bShkYXRhKSAvIGxlbihkYXRhKVxcblxcbmRlZiBoYXJtb25pY19tZWFuKGRhdGEpOlxcbiAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yXFxuXFxuXFxuZGVmIG1lZGlhbihkYXRhKTpcXG4gICAgX2RhdGEgPSBzb3J0ZWQoZGF0YSlcXG4gICAgbCA9IGxlbihfZGF0YSlcXG4gICAgaWYgbCAlIDIgPT0gMDpcXG4gICAgICAgIF9tZWRpYW4gPSAoX2RhdGFbbC8vMl0gKyBfZGF0YVtsLy8yLTFdKSAvIDJcXG4gICAgZWxzZTpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yXVxcbiAgICByZXR1cm4gX21lZGlhblxcblxcbmRlZiBtZWRpYW5fbG93KGRhdGEpOlxcbiAgICBfZGF0YSA9IHNvcnRlZChkYXRhKVxcbiAgICBsID0gbGVuKF9kYXRhKVxcbiAgICBpZiBsICUgMiA9PSAwOlxcbiAgICAgICAgX21lZGlhbiA9IF9kYXRhW2wvLzItMV1cXG4gICAgZWxzZTpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yXVxcbiAgICByZXR1cm4gX21lZGlhblxcblxcblxcbmRlZiBtZWRpYW5faGlnaChkYXRhKTpcXG4gICAgX2RhdGEgPSBzb3J0ZWQoZGF0YSlcXG4gICAgbCA9IGxlbihfZGF0YSlcXG4gICAgaWYgbCAlIDIgPT0gMDpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yXVxcbiAgICBlbHNlOlxcbiAgICAgICAgX21lZGlhbiA9IF9kYXRhW2wvLzJdXFxuICAgIHJldHVybiBfbWVkaWFuXFxuXFxuXFxuZGVmIG1lZGlhbl9ncm91cGVkKGRhdGEpOlxcbiAgICByZXR1cm4gbWVkaWFuKGRhdGEpXFxuXFxuZGVmIG1vZGUoZGF0YSk6XFxuICAgIGNvdW50ZXIgPSBDb3VudGVyKGRhdGEpXFxuICAgIG1heF9jb3VudCA9IG1heChjb3VudGVyLnZhbHVlcygpKVxcbiAgICBfbW9kZSA9IFtrIGZvciBrLHYgaW4gY291bnRlci5pdGVtcygpIGlmIHYgPT0gbWF4X2NvdW50XVxcbiAgICBpZiBsZW4oX21vZGUpID4gMTpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIk5vIFVuaXF1ZSBNb2RlLCBmb3VuZCB7fSBlcXVhbGx5IGNvbW1vbiB2YWx1ZXNcXFwiLmZvcm1hdChsZW4oX21vZGUpKSlcXG4gICAgZWxzZTpcXG4gICAgICAgIHJldHVybiBfbW9kZVswXVxcblxcblxcbmRlZiB2YXJpYW5jZShkYXRhKTpcXG4gICAgYXZlcmFnZT1tZWFuKGRhdGEpXFxuICAgIF92YXJpYW5jZT0wXFxuICAgIGZvciBkIGluIGRhdGE6XFxuICAgICAgICBfdmFyaWFuY2UgKz0gKChhdmVyYWdlLWQpKioyKVxcbiAgICAgICAgZmluYWxfdmFyaWFuY2U9X3ZhcmlhbmNlL2xlbihkYXRhKVxcbiAgICByZXR1cm4gZmluYWxfdmFyaWFuY2VcXG5cXG5kZWYgcHZhcmlhbmNlKGRhdGEpOlxcbiAgICBhdmVyYWdlPW1lYW4oZGF0YSlcXG4gICAgX3ZhcmlhbmNlPTBcXG4gICAgZm9yIGQgaW4gZGF0YTpcXG4gICAgICAgIF92YXJpYW5jZSArPSAoKGF2ZXJhZ2UtZCkqKjIpXFxuICAgICAgICBmaW5hbF92YXJpYW5jZT1fdmFyaWFuY2UvbGVuKGRhdGEpXFxuICAgIHJldHVybiBmaW5hbF92YXJpYW5jZVxcblxcbmRlZiB2YXJpYW5jZShkYXRhKTpcXG4gICAgYXZlcmFnZT1tZWFuKGRhdGEpXFxuICAgIF92YXJpYW5jZT0wXFxuICAgIGZvciBkIGluIGRhdGE6XFxuICAgICAgICBfdmFyaWFuY2UgKz0gKChhdmVyYWdlLWQpKioyKVxcbiAgICAgICAgZmluYWxfdmFyaWFuY2U9X3ZhcmlhbmNlLyhsZW4oZGF0YSkgLTEpXFxuICAgIHJldHVybiBmaW5hbF92YXJpYW5jZVxcblxcbmRlZiBwc3RkZXYoZGF0YSk6XFxuICAgIHJldHVybiBzcXJ0KHB2YXJpYW5jZShkYXRhKSlcXG5cXG5kZWYgc3RkZXYoZGF0YSk6XFxuICAgIHJldHVybiBzcXJ0KHZhcmlhbmNlKGRhdGEpKVxcblxcblwiLFwic3JjL2xpYi9zdGF0dmZzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdGF0dmZzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RyaW5nLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fTtyZXR1cm4gYS5hc2NpaV9sb3dlcmNhc2U9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxcXCIpLGEuYXNjaWlfdXBwZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcXFwiKSxhLmFzY2lpX2xldHRlcnM9bmV3IFNrLmJ1aWx0aW4uc3RyKGEuYXNjaWlfbG93ZXJjYXNlLnYrYS5hc2NpaV91cHBlcmNhc2UudiksYS5sb3dlcmNhc2U9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxcXCIpLGEudXBwZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcXFwiKSxhLmxldHRlcnM9bmV3IFNrLmJ1aWx0aW4uc3RyKGEubG93ZXJjYXNlLnYrYS51cHBlcmNhc2UudiksYS5kaWdpdHM9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIwMTIzNDU2Nzg5XFxcIiksYS5oZXhkaWdpdHM9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIwMTIzNDU2Nzg5YWJjZGVmQUJDREVGXFxcIiksYS5vY3RkaWdpdHM9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIwMTIzNDU2N1xcXCIpLGEucHVuY3R1YXRpb249bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIhXFxcXFxcXCIjJCUmJygpKissLS4vOjs8PT4/QFtcXFxcXFxcXF1eX2B7fH1+XFxcIiksYS53aGl0ZXNwYWNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiXFxcXHRcXFxcblxcXFx4MEJcXFxcZlxcXFxyIFxcXCIpLGEucHJpbnRhYmxlPW5ldyBTay5idWlsdGluLnN0cihhLmRpZ2l0cy52K2EubGV0dGVycy52K2EucHVuY3R1YXRpb24uditcXFwiIFxcXFx0XFxcXG5cXFxcclxcXFx4MEJcXFxcZlxcXCIpLGEuc3BsaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiguLi5hKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5zcGxpdCxhKX0pLGEuY2FwaXRhbGl6ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi5zdHIucHJvdG90eXBlLmNhcGl0YWxpemUsW2FdKX0pLGEuam9pbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIHZvaWQgMD09PWImJihiPW5ldyBTay5idWlsdGluLnN0cihcXFwiIFxcXCIpKSxTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi5zdHIucHJvdG90eXBlLmpvaW4sW2IsYV0pfSksYS5jYXB3b3Jkcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiY2Fwd29yZHNcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInMgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWMmJihjPW5ldyBTay5idWlsdGluLnN0cihcXFwiIFxcXCIpKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInNlcCBtdXN0IGJlIGEgc3RyaW5nXFxcIik7Zm9yKHZhciBkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLnNwbGl0LFtiLGNdKS52LGU9W10sZj0wO2Y8ZC5sZW5ndGg7ZisrKXt2YXIgZz1kW2ZdLGg9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuY2FwaXRhbGl6ZSxbZ10pO2UucHVzaChoKX1yZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuam9pbixbbmV3IFNrLmJ1aWx0aW4ubGlzdChlKSxjXSl9KSxhfTtcIixcInNyYy9saWIvc3RyaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdHJpbmdvbGQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0cmluZ29sZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0cmluZ3ByZXAucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0cmluZ3ByZXAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdHJ1Y3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0cnVjdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N1YnByb2Nlc3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN1YnByb2Nlc3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdW5hdS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3VuYXUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdW5hdWRpby5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3VuYXVkaW8gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zeW1ib2wucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN5bWJvbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N5bXRhYmxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzeW10YWJsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RhYm5hbm55LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0YWJuYW5ueSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RhcmZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRhcmZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZWxuZXRsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRlbG5ldGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RlbXBmaWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZW1wZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Rlc3QvX19pbml0X18ucHlcIjpcIl9fYXV0aG9yX18gPSAnYm1pbGxlcidcXG5cXG5kZWYgdGVzdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHBsYWNlcz01KTpcXG4gICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCxpbnQpOlxcbiAgICAgICAgaWYgYWN0dWFsID09IGV4cGVjdGVkOlxcbiAgICAgICAgICAgIHByaW50KCdQYXNzJylcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICBlbGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsZmxvYXQpOlxcbiAgICAgICAgaWYgYWJzKGFjdHVhbC1leHBlY3RlZCkgPCAxMCoqKC1wbGFjZXMpOlxcbiAgICAgICAgICAgIHByaW50KCdQYXNzJylcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICBlbHNlOlxcbiAgICAgICAgaWYgYWN0dWFsID09IGV4cGVjdGVkOlxcbiAgICAgICAgICAgIHByaW50KCdQYXNzJylcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICBwcmludCgnVGVzdCBGYWlsZWQ6IGV4cGVjdGVkICcgKyBzdHIoZXhwZWN0ZWQpICsgJyBidXQgZ290ICcgKyBzdHIoYWN0dWFsKSlcXG4gICAgcmV0dXJuIEZhbHNlXFxuXFxuZGVmIHRlc3ROb3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkKTpcXG4gICAgcGFzc1xcblxcblwiLFwic3JjL2xpYi90ZXN0L2JhZF9nZXRhdHRyLnB5XCI6XCJ4ID0gMVxcblxcbl9fZ2V0YXR0cl9fID0gXFxcIlN1cnByaXNlIVxcXCJcXG5fX2Rpcl9fID0gXFxcIlN1cnByaXNlIGFnYWluIVxcXCJcXG5cIixcInNyYy9saWIvdGVzdC9iYWRfZ2V0YXR0cjIucHlcIjpcImRlZiBfX2dldGF0dHJfXygpOlxcbiAgICBcXFwiQmFkIG9uZVxcXCJcXG5cXG54ID0gMVxcblxcbmRlZiBfX2Rpcl9fKGJhZF9zaWcpOlxcbiAgICByZXR1cm4gW11cXG5cIixcInNyYy9saWIvdGVzdC9iYWRfZ2V0YXR0cjMucHlcIjpcImRlZiBfX2dldGF0dHJfXyhuYW1lKTpcXG4gICAgZ2xvYmFsIF9fZ2V0YXR0cl9fXFxuICAgIGlmIG5hbWUgIT0gJ2RlbGdldGF0dHInOlxcbiAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3JcXG4gICAgZGVsIF9fZ2V0YXR0cl9fXFxuICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yXFxuXCIsXCJzcmMvbGliL3Rlc3QvZGVjaW1hbHRlc3RkYXRhL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkZWNpbWFsdGVzdGRhdGEgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZXN0L2dvb2RfZ2V0YXR0ci5weVwiOlwieCA9IDFcXG5cXG5kZWYgX19kaXJfXygpOlxcbiAgICByZXR1cm4gWydhJywgJ2InLCAnYyddXFxuXFxuZGVmIF9fZ2V0YXR0cl9fKG5hbWUpOlxcbiAgICBpZiBuYW1lID09IFxcXCJ5b2xvXFxcIjpcXG4gICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKFxcXCJEZXByZWNhdGVkLCB1c2Ugd2hhdGV2ZXIgaW5zdGVhZFxcXCIpXFxuICAgIHJldHVybiBmXFxcIlRoZXJlIGlzIHtuYW1lfVxcXCJcXG5cXG55ID0gMlxcblwiLFwic3JjL2xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weVwiOlwiXFxcIlxcXCJcXFwiU3VwcG9ydGluZyBkZWZpbml0aW9ucyBmb3IgdGhlIFB5dGhvbiByZWdyZXNzaW9uIHRlc3RzLlxcXCJcXFwiXFxcIlxcblxcbmlmIF9fbmFtZV9fICE9ICd0ZXN0LnRlc3Rfc3VwcG9ydCc6XFxuICAgIHJhaXNlIEltcG9ydEVycm9yKCd0ZXN0X3N1cHBvcnQgbXVzdCBiZSBpbXBvcnRlZCBmcm9tIHRoZSB0ZXN0IHBhY2thZ2UnKVxcblxcbmltcG9ydCB1bml0dGVzdFxcblxcblxcbiMgZGVmIHJ1bl91bml0dGVzdCgqY2xhc3Nlcyk6XFxuIyAgICAgXFxcIlxcXCJcXFwiUnVuIHRlc3RzIGZyb20gdW5pdHRlc3QuVGVzdENhc2UtZGVyaXZlZCBjbGFzc2VzLlxcXCJcXFwiXFxcIlxcbiMgICAgIHZhbGlkX3R5cGVzID0gKHVuaXR0ZXN0LlRlc3RTdWl0ZSwgdW5pdHRlc3QuVGVzdENhc2UpXFxuIyAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKVxcbiMgICAgIGZvciBjbHMgaW4gY2xhc3NlczpcXG4jICAgICAgICAgaWYgaXNpbnN0YW5jZShjbHMsIHN0cik6XFxuIyAgICAgICAgICAgICBpZiBjbHMgaW4gc3lzLm1vZHVsZXM6XFxuIyAgICAgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5maW5kVGVzdENhc2VzKHN5cy5tb2R1bGVzW2Nsc10pKVxcbiMgICAgICAgICAgICAgZWxzZTpcXG4jICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJzdHIgYXJndW1lbnRzIG11c3QgYmUga2V5cyBpbiBzeXMubW9kdWxlc1xcXCIpXFxuIyAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShjbHMsIHZhbGlkX3R5cGVzKTpcXG4jICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QoY2xzKVxcbiMgICAgICAgICBlbHNlOlxcbiMgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoY2xzKSlcXG4jICAgICBfcnVuX3N1aXRlKHN1aXRlKVxcblxcbmRlZiBydW5fdW5pdHRlc3QoKmNsYXNzZXMpOlxcbiAgICBcXFwiXFxcIlxcXCJSdW4gdGVzdHMgZnJvbSB1bml0dGVzdC5UZXN0Q2FzZS1kZXJpdmVkIGNsYXNzZXMuXFxcIlxcXCJcXFwiXFxuICAgIGZvciBjbHMgaW4gY2xhc3NlczpcXG4gICAgICAgIHByaW50IGNsc1xcbiAgICAgICAgaWYgaXNzdWJjbGFzcyhjbHMsIHVuaXR0ZXN0LlRlc3RDYXNlKTpcXG4gICAgICAgICAgICBjbHMoKS5tYWluKClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcHJpbnQgXFxcIkRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIFxcXCIsIGNsc1xcblwiLFwic3JjL2xpYi90ZXh0d3JhcC5weVwiOlwiXFxcIlxcXCJcXFwiVGV4dCB3cmFwcGluZyBhbmQgZmlsbGluZy5cXG5cXFwiXFxcIlxcXCJcXG5cXG4jIENvcHlyaWdodCAoQykgMTk5OS0yMDAxIEdyZWdvcnkgUC4gV2FyZC5cXG4jIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi5cXG4jIFdyaXR0ZW4gYnkgR3JlZyBXYXJkIDxnd2FyZEBweXRob24ubmV0PlxcblxcbmltcG9ydCByZSwgc3RyaW5nXFxuXFxuX19hbGxfXyA9IFsnVGV4dFdyYXBwZXInLCAnd3JhcCcsICdmaWxsJywgJ2RlZGVudCcsICdpbmRlbnQnLCAnc2hvcnRlbiddXFxuXFxuIyBIYXJkY29kZSB0aGUgcmVjb2duaXplZCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gdGhlIFVTLUFTQ0lJXFxuIyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuICBUaGUgbWFpbiByZWFzb24gZm9yIGRvaW5nIHRoaXMgaXMgdGhhdFxcbiMgc29tZSBVbmljb2RlIHNwYWNlcyAobGlrZSBcXFxcdTAwYTApIGFyZSBub24tYnJlYWtpbmcgd2hpdGVzcGFjZXMuXFxuX3doaXRlc3BhY2UgPSAnXFxcXHRcXFxcblxcXFx4MGJcXFxceDBjXFxcXHIgJ1xcblxcbmNsYXNzIFRleHRXcmFwcGVyOlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgT2JqZWN0IGZvciB3cmFwcGluZy9maWxsaW5nIHRleHQuICBUaGUgcHVibGljIGludGVyZmFjZSBjb25zaXN0cyBvZlxcbiAgICB0aGUgd3JhcCgpIGFuZCBmaWxsKCkgbWV0aG9kczsgdGhlIG90aGVyIG1ldGhvZHMgYXJlIGp1c3QgdGhlcmUgZm9yXFxuICAgIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUgaW4gb3JkZXIgdG8gdHdlYWsgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLlxcbiAgICBJZiB5b3Ugd2FudCB0byBjb21wbGV0ZWx5IHJlcGxhY2UgdGhlIG1haW4gd3JhcHBpbmcgYWxnb3JpdGhtLFxcbiAgICB5b3UnbGwgcHJvYmFibHkgaGF2ZSB0byBvdmVycmlkZSBfd3JhcF9jaHVua3MoKS5cXG4gICAgU2V2ZXJhbCBpbnN0YW5jZSBhdHRyaWJ1dGVzIGNvbnRyb2wgdmFyaW91cyBhc3BlY3RzIG9mIHdyYXBwaW5nOlxcbiAgICAgIHdpZHRoIChkZWZhdWx0OiA3MClcXG4gICAgICAgIHRoZSBtYXhpbXVtIHdpZHRoIG9mIHdyYXBwZWQgbGluZXMgKHVubGVzcyBicmVha19sb25nX3dvcmRzXFxuICAgICAgICBpcyBmYWxzZSlcXG4gICAgICBpbml0aWFsX2luZGVudCAoZGVmYXVsdDogXFxcIlxcXCIpXFxuICAgICAgICBzdHJpbmcgdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgZmlyc3QgbGluZSBvZiB3cmFwcGVkXFxuICAgICAgICBvdXRwdXQuICBDb3VudHMgdG93YXJkcyB0aGUgbGluZSdzIHdpZHRoLlxcbiAgICAgIHN1YnNlcXVlbnRfaW5kZW50IChkZWZhdWx0OiBcXFwiXFxcIilcXG4gICAgICAgIHN0cmluZyB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIGFsbCBsaW5lcyBzYXZlIHRoZSBmaXJzdFxcbiAgICAgICAgb2Ygd3JhcHBlZCBvdXRwdXQ7IGFsc28gY291bnRzIHRvd2FyZHMgZWFjaCBsaW5lJ3Mgd2lkdGguXFxuICAgICAgZXhwYW5kX3RhYnMgKGRlZmF1bHQ6IHRydWUpXFxuICAgICAgICBFeHBhbmQgdGFicyBpbiBpbnB1dCB0ZXh0IHRvIHNwYWNlcyBiZWZvcmUgZnVydGhlciBwcm9jZXNzaW5nLlxcbiAgICAgICAgRWFjaCB0YWIgd2lsbCBiZWNvbWUgMCAuLiAndGFic2l6ZScgc3BhY2VzLCBkZXBlbmRpbmcgb24gaXRzIHBvc2l0aW9uXFxuICAgICAgICBpbiBpdHMgbGluZS4gIElmIGZhbHNlLCBlYWNoIHRhYiBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIGNoYXJhY3Rlci5cXG4gICAgICB0YWJzaXplIChkZWZhdWx0OiA4KVxcbiAgICAgICAgRXhwYW5kIHRhYnMgaW4gaW5wdXQgdGV4dCB0byAwIC4uICd0YWJzaXplJyBzcGFjZXMsIHVubGVzc1xcbiAgICAgICAgJ2V4cGFuZF90YWJzJyBpcyBmYWxzZS5cXG4gICAgICByZXBsYWNlX3doaXRlc3BhY2UgKGRlZmF1bHQ6IHRydWUpXFxuICAgICAgICBSZXBsYWNlIGFsbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgaW4gdGhlIGlucHV0IHRleHQgYnkgc3BhY2VzXFxuICAgICAgICBhZnRlciB0YWIgZXhwYW5zaW9uLiAgTm90ZSB0aGF0IGlmIGV4cGFuZF90YWJzIGlzIGZhbHNlIGFuZFxcbiAgICAgICAgcmVwbGFjZV93aGl0ZXNwYWNlIGlzIHRydWUsIGV2ZXJ5IHRhYiB3aWxsIGJlIGNvbnZlcnRlZCB0byBhXFxuICAgICAgICBzaW5nbGUgc3BhY2UhXFxuICAgICAgZml4X3NlbnRlbmNlX2VuZGluZ3MgKGRlZmF1bHQ6IGZhbHNlKVxcbiAgICAgICAgRW5zdXJlIHRoYXQgc2VudGVuY2UtZW5kaW5nIHB1bmN0dWF0aW9uIGlzIGFsd2F5cyBmb2xsb3dlZFxcbiAgICAgICAgYnkgdHdvIHNwYWNlcy4gIE9mZiBieSBkZWZhdWx0IGJlY2F1c2UgdGhlIGFsZ29yaXRobSBpc1xcbiAgICAgICAgKHVuYXZvaWRhYmx5KSBpbXBlcmZlY3QuXFxuICAgICAgYnJlYWtfbG9uZ193b3JkcyAoZGVmYXVsdDogdHJ1ZSlcXG4gICAgICAgIEJyZWFrIHdvcmRzIGxvbmdlciB0aGFuICd3aWR0aCcuICBJZiBmYWxzZSwgdGhvc2Ugd29yZHMgd2lsbCBub3RcXG4gICAgICAgIGJlIGJyb2tlbiwgYW5kIHNvbWUgbGluZXMgbWlnaHQgYmUgbG9uZ2VyIHRoYW4gJ3dpZHRoJy5cXG4gICAgICBicmVha19vbl9oeXBoZW5zIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgQWxsb3cgYnJlYWtpbmcgaHlwaGVuYXRlZCB3b3Jkcy4gSWYgdHJ1ZSwgd3JhcHBpbmcgd2lsbCBvY2N1clxcbiAgICAgICAgcHJlZmVyYWJseSBvbiB3aGl0ZXNwYWNlcyBhbmQgcmlnaHQgYWZ0ZXIgaHlwaGVucyBwYXJ0IG9mXFxuICAgICAgICBjb21wb3VuZCB3b3Jkcy5cXG4gICAgICBkcm9wX3doaXRlc3BhY2UgKGRlZmF1bHQ6IHRydWUpXFxuICAgICAgICBEcm9wIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBsaW5lcy5cXG4gICAgICBtYXhfbGluZXMgKGRlZmF1bHQ6IE5vbmUpXFxuICAgICAgICBUcnVuY2F0ZSB3cmFwcGVkIGxpbmVzLlxcbiAgICAgIHBsYWNlaG9sZGVyIChkZWZhdWx0OiAnIFsuLi5dJylcXG4gICAgICAgIEFwcGVuZCB0byB0aGUgbGFzdCBsaW5lIG9mIHRydW5jYXRlZCB0ZXh0LlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgdW5pY29kZV93aGl0ZXNwYWNlX3RyYW5zID0ge31cXG4gICAgIyB1c3BhY2UgPSBvcmQoJyAnKVxcbiAgICB1c3BhY2UgPSAnICdcXG4gICAgZm9yIHggaW4gX3doaXRlc3BhY2U6XFxuICAgICAgICAjIHVuaWNvZGVfd2hpdGVzcGFjZV90cmFuc1tvcmQoeCldID0gdXNwYWNlXFxuICAgICAgICB1bmljb2RlX3doaXRlc3BhY2VfdHJhbnNbeF0gPSB1c3BhY2VcXG5cXG4gICAgIyBUaGlzIGZ1bmt5IGxpdHRsZSByZWdleCBpcyBqdXN0IHRoZSB0cmljayBmb3Igc3BsaXR0aW5nXFxuICAgICMgdGV4dCB1cCBpbnRvIHdvcmQtd3JhcHBhYmxlIGNodW5rcy4gIEUuZy5cXG4gICAgIyAgIFxcXCJIZWxsbyB0aGVyZSAtLSB5b3UgZ29vZi1iYWxsLCB1c2UgdGhlIC1iIG9wdGlvbiFcXFwiXFxuICAgICMgc3BsaXRzIGludG9cXG4gICAgIyAgIEhlbGxvLyAvdGhlcmUvIC8tLS8gL3lvdS8gL2dvb2YtL2JhbGwsLyAvdXNlLyAvdGhlLyAvLWIvIC9vcHRpb24hXFxuICAgICMgKGFmdGVyIHN0cmlwcGluZyBvdXQgZW1wdHkgc3RyaW5ncykuXFxuICAgIHdvcmRzZXBfcmUgPSByZS5jb21waWxlKFxcbiAgICAgICAgcicoXFxcXHMrfCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbnkgd2hpdGVzcGFjZVxcbiAgICAgICAgcidbXlxcXFxzXFxcXHddKlxcXFx3K1teMC05XFxcXFddLSg/PVxcXFx3K1teMC05XFxcXFddKSknKSAgIyBoeXBoZW5hdGVkIHdvcmRzXFxuICAgIGVtX2Rhc2ggPSByZS5jb21waWxlKHInKFxcXFxzK3wnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IHdoaXRlc3BhY2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgcidbXlxcXFxzXFxcXHddKlxcXFx3K1teMC05XFxcXFddLSg/PVxcXFx3K1teMC05XFxcXFddKXwnICAgIyBoeXBoZW5hdGVkIHdvcmRzXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHInKD8hXiktezIsfSg/PVxcXFx3KSknKSAgICAgICAgICAgICAgICAgICAgICMgZW0tZGFzaFxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgIyBUaGlzIGxlc3MgZnVua3kgbGl0dGxlIHJlZ2V4IGp1c3Qgc3BsaXQgb24gcmVjb2duaXplZCBzcGFjZXMuIEUuZy5cXG4gICAgIyAgIFxcXCJIZWxsbyB0aGVyZSAtLSB5b3UgZ29vZi1iYWxsLCB1c2UgdGhlIC1iIG9wdGlvbiFcXFwiXFxuICAgICMgc3BsaXRzIGludG9cXG4gICAgIyAgIEhlbGxvLyAvdGhlcmUvIC8tLS8gL3lvdS8gL2dvb2YtYmFsbCwvIC91c2UvIC90aGUvIC8tYi8gL29wdGlvbiEvXFxuICAgIHdvcmRzZXBfc2ltcGxlX3JlID0gcmUuY29tcGlsZShyJyhcXFxccyspJylcXG5cXG5cXG4gICAgIyBYWFggdGhpcyBpcyBub3QgbG9jYWxlLSBvciBjaGFyc2V0LWF3YXJlIC0tIHN0cmluZy5sb3dlcmNhc2VcXG4gICAgIyBpcyBVUy1BU0NJSSBvbmx5IChhbmQgdGhlcmVmb3JlIEVuZ2xpc2gtb25seSlcXG4gICAgc2VudGVuY2VfZW5kX3JlID0gcmUuY29tcGlsZShyJ1thLXpdJyAgICAgICAgICAgICAjIGxvd2VyY2FzZSBsZXR0ZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1tcXFxcLlxcXFwhXFxcXD9dJyAgICAgICAgICAjIHNlbnRlbmNlLWVuZGluZyBwdW5jdC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1tcXFxcXFxcIlxcXFwnXT8nICAgICAgICAgICAjIG9wdGlvbmFsIGVuZC1vZi1xdW90ZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInXFxcXFonKSAgICAgICAgICAgICAgICMgZW5kIG9mIGNodW5rXFxuICAgIHNlbnRlbmNlX2VuZF9yZSA9IHInW2Etel1bXFxcXC5cXFxcIVxcXFw/XVtcXFxcXFxcIlxcXFwnXT8nXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLFxcbiAgICAgICAgICAgICAgICAgd2lkdGg9NzAsXFxuICAgICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD1cXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgIHN1YnNlcXVlbnRfaW5kZW50PVxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgZXhwYW5kX3RhYnM9VHJ1ZSxcXG4gICAgICAgICAgICAgICAgIHJlcGxhY2Vfd2hpdGVzcGFjZT1UcnVlLFxcbiAgICAgICAgICAgICAgICAgZml4X3NlbnRlbmNlX2VuZGluZ3M9RmFsc2UsXFxuICAgICAgICAgICAgICAgICBicmVha19sb25nX3dvcmRzPVRydWUsXFxuICAgICAgICAgICAgICAgICBkcm9wX3doaXRlc3BhY2U9VHJ1ZSxcXG4gICAgICAgICAgICAgICAgIGJyZWFrX29uX2h5cGhlbnM9VHJ1ZSxcXG4gICAgICAgICAgICAgICAgIHRhYnNpemU9OCxcXG4gICAgICAgICAgICAgICAgIG1heF9saW5lcz1Ob25lLFxcbiAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9JyBbLi4uXScpOlxcbiAgICAgICAgc2VsZi53aWR0aCA9IHdpZHRoXFxuICAgICAgICBzZWxmLmluaXRpYWxfaW5kZW50ID0gaW5pdGlhbF9pbmRlbnRcXG4gICAgICAgIHNlbGYuc3Vic2VxdWVudF9pbmRlbnQgPSBzdWJzZXF1ZW50X2luZGVudFxcbiAgICAgICAgc2VsZi5leHBhbmRfdGFicyA9IGV4cGFuZF90YWJzXFxuICAgICAgICBzZWxmLnJlcGxhY2Vfd2hpdGVzcGFjZSA9IHJlcGxhY2Vfd2hpdGVzcGFjZVxcbiAgICAgICAgc2VsZi5maXhfc2VudGVuY2VfZW5kaW5ncyA9IGZpeF9zZW50ZW5jZV9lbmRpbmdzXFxuICAgICAgICBzZWxmLmJyZWFrX2xvbmdfd29yZHMgPSBicmVha19sb25nX3dvcmRzXFxuICAgICAgICBzZWxmLmRyb3Bfd2hpdGVzcGFjZSA9IGRyb3Bfd2hpdGVzcGFjZVxcbiAgICAgICAgc2VsZi5icmVha19vbl9oeXBoZW5zID0gYnJlYWtfb25faHlwaGVuc1xcbiAgICAgICAgc2VsZi50YWJzaXplID0gdGFic2l6ZVxcbiAgICAgICAgc2VsZi5tYXhfbGluZXMgPSBtYXhfbGluZXNcXG4gICAgICAgIHNlbGYucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlclxcblxcblxcbiAgICAjIC0tIFByaXZhdGUgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAgICAjIChwb3NzaWJseSB1c2VmdWwgZm9yIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUpXFxuXFxuICAgIGRlZiBfbXVuZ2Vfd2hpdGVzcGFjZShzZWxmLCB0ZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl9tdW5nZV93aGl0ZXNwYWNlKHRleHQgOiBzdHJpbmcpIC0+IHN0cmluZ1xcbiAgICAgICAgTXVuZ2Ugd2hpdGVzcGFjZSBpbiB0ZXh0OiBleHBhbmQgdGFicyBhbmQgY29udmVydCBhbGwgb3RoZXJcXG4gICAgICAgIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBzcGFjZXMuICBFZy4gXFxcIiBmb29cXFxcXFxcXHRiYXJcXFxcXFxcXG5cXFxcXFxcXG5iYXpcXFwiXFxuICAgICAgICBiZWNvbWVzIFxcXCIgZm9vICAgIGJhciAgYmF6XFxcIi5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5leHBhbmRfdGFiczpcXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5leHBhbmR0YWJzKHNlbGYudGFic2l6ZSlcXG4gICAgICAgIGlmIHNlbGYucmVwbGFjZV93aGl0ZXNwYWNlOlxcbiAgICAgICAgICAgIGZvciBrZXksIHZhbCBpbiBzZWxmLnVuaWNvZGVfd2hpdGVzcGFjZV90cmFucy5pdGVtcygpOlxcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKGtleSwgdmFsKVxcbiAgICAgICAgcmV0dXJuIHRleHRcXG5cXG5cXG4gICAgZGVmIF9zcGxpdChzZWxmLCB0ZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl9zcGxpdCh0ZXh0IDogc3RyaW5nKSAtPiBbc3RyaW5nXVxcbiAgICAgICAgU3BsaXQgdGhlIHRleHQgdG8gd3JhcCBpbnRvIGluZGl2aXNpYmxlIGNodW5rcy4gIENodW5rcyBhcmVcXG4gICAgICAgIG5vdCBxdWl0ZSB0aGUgc2FtZSBhcyB3b3Jkczsgc2VlIF93cmFwX2NodW5rcygpIGZvciBmdWxsXFxuICAgICAgICBkZXRhaWxzLiAgQXMgYW4gZXhhbXBsZSwgdGhlIHRleHRcXG4gICAgICAgICAgTG9vaywgZ29vZi1iYWxsIC0tIHVzZSB0aGUgLWIgb3B0aW9uIVxcbiAgICAgICAgYnJlYWtzIGludG8gdGhlIGZvbGxvd2luZyBjaHVua3M6XFxuICAgICAgICAgICdMb29rLCcsICcgJywgJ2dvb2YtJywgJ2JhbGwnLCAnICcsICctLScsICcgJyxcXG4gICAgICAgICAgJ3VzZScsICcgJywgJ3RoZScsICcgJywgJy1iJywgJyAnLCAnb3B0aW9uISdcXG4gICAgICAgIGlmIGJyZWFrX29uX2h5cGhlbnMgaXMgVHJ1ZSwgb3IgaW46XFxuICAgICAgICAgICdMb29rLCcsICcgJywgJ2dvb2YtYmFsbCcsICcgJywgJy0tJywgJyAnLFxcbiAgICAgICAgICAndXNlJywgJyAnLCAndGhlJywgJyAnLCAnLWInLCAnICcsIG9wdGlvbiEnXFxuICAgICAgICBvdGhlcndpc2UuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuYnJlYWtfb25faHlwaGVucyBpcyBUcnVlOlxcbiAgICAgICAgICAgIGNodW5rcyA9IHNlbGYud29yZHNlcF9yZS5zcGxpdCh0ZXh0KVxcbiAgICAgICAgICAgIGlmIFxcXCItLVxcXCIgaW4gdGV4dDpcXG4gICAgICAgICAgICAgICAgY2h1bmtzID0gW2l0ZW0gXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzdWJsaXN0IGluIFtzZWxmLmVtX2Rhc2guc3BsaXQoY2h1bmspIGZvciBjaHVuayBpbiBjaHVua3NdIFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc3VibGlzdF1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgY2h1bmtzID0gc2VsZi53b3Jkc2VwX3NpbXBsZV9yZS5zcGxpdCh0ZXh0KVxcbiAgICAgICAgY2h1bmtzID0gW2MgZm9yIGMgaW4gY2h1bmtzIGlmIGNdXFxuICAgICAgICByZXR1cm4gY2h1bmtzXFxuXFxuICAgIGRlZiBfZml4X3NlbnRlbmNlX2VuZGluZ3Moc2VsZiwgY2h1bmtzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl9maXhfc2VudGVuY2VfZW5kaW5ncyhjaHVua3MgOiBbc3RyaW5nXSlcXG4gICAgICAgIENvcnJlY3QgZm9yIHNlbnRlbmNlIGVuZGluZ3MgYnVyaWVkIGluICdjaHVua3MnLiAgRWcuIHdoZW4gdGhlXFxuICAgICAgICBvcmlnaW5hbCB0ZXh0IGNvbnRhaW5zIFxcXCIuLi4gZm9vLlxcXFxcXFxcbkJhciAuLi5cXFwiLCBtdW5nZV93aGl0ZXNwYWNlKClcXG4gICAgICAgIGFuZCBzcGxpdCgpIHdpbGwgY29udmVydCB0aGF0IHRvIFsuLi4sIFxcXCJmb28uXFxcIiwgXFxcIiBcXFwiLCBcXFwiQmFyXFxcIiwgLi4uXVxcbiAgICAgICAgd2hpY2ggaGFzIG9uZSB0b28gZmV3IHNwYWNlczsgdGhpcyBtZXRob2Qgc2ltcGx5IGNoYW5nZXMgdGhlIG9uZVxcbiAgICAgICAgc3BhY2UgdG8gdHdvLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpID0gMFxcbiAgICAgICAgIyBwYXRzZWFyY2ggPSBzZWxmLnNlbnRlbmNlX2VuZF9yZS5zZWFyY2hcXG4gICAgICAgIHdoaWxlIGkgPCBsZW4oY2h1bmtzKS0xOlxcbiAgICAgICAgICAgIGlmIGNodW5rc1tpKzFdID09IFxcXCIgXFxcIiBhbmQgcmUuc2VhcmNoKHNlbGYuc2VudGVuY2VfZW5kX3JlLCBjaHVua3NbaV0pIGFuZCBjaHVua3NbaV1bLTFdIGluIFxcXCIuIT9cXFxcXFxcIlxcXFwnXFxcIjpcXG4gICAgICAgICAgICAgICAgY2h1bmtzW2krMV0gPSBcXFwiICBcXFwiXFxuICAgICAgICAgICAgICAgIGkgKz0gMlxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGkgKz0gMVxcblxcbiAgICBkZWYgX2hhbmRsZV9sb25nX3dvcmQoc2VsZiwgcmV2ZXJzZWRfY2h1bmtzLCBjdXJfbGluZSwgY3VyX2xlbiwgd2lkdGgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiX2hhbmRsZV9sb25nX3dvcmQoY2h1bmtzIDogW3N0cmluZ10sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGluZSA6IFtzdHJpbmddLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2xlbiA6IGludCwgd2lkdGggOiBpbnQpXFxuICAgICAgICBIYW5kbGUgYSBjaHVuayBvZiB0ZXh0IChtb3N0IGxpa2VseSBhIHdvcmQsIG5vdCB3aGl0ZXNwYWNlKSB0aGF0XFxuICAgICAgICBpcyB0b28gbG9uZyB0byBmaXQgaW4gYW55IGxpbmUuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgICMgRmlndXJlIG91dCB3aGVuIGluZGVudCBpcyBsYXJnZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHdpZHRoLCBhbmQgbWFrZVxcbiAgICAgICAgIyBzdXJlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaXMgc3RyaXBwZWQgb2ZmIG9uIGV2ZXJ5IHBhc3NcXG4gICAgICAgIGlmIHdpZHRoIDwgMTpcXG4gICAgICAgICAgICBzcGFjZV9sZWZ0ID0gMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzcGFjZV9sZWZ0ID0gd2lkdGggLSBjdXJfbGVuXFxuXFxuICAgICAgICAjIElmIHdlJ3JlIGFsbG93ZWQgdG8gYnJlYWsgbG9uZyB3b3JkcywgdGhlbiBkbyBzbzogcHV0IGFzIG11Y2hcXG4gICAgICAgICMgb2YgdGhlIG5leHQgY2h1bmsgb250byB0aGUgY3VycmVudCBsaW5lIGFzIHdpbGwgZml0LlxcbiAgICAgICAgaWYgc2VsZi5icmVha19sb25nX3dvcmRzOlxcbiAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChyZXZlcnNlZF9jaHVua3NbLTFdWzpzcGFjZV9sZWZ0XSlcXG4gICAgICAgICAgICByZXZlcnNlZF9jaHVua3NbLTFdID0gcmV2ZXJzZWRfY2h1bmtzWy0xXVtzcGFjZV9sZWZ0Ol1cXG5cXG4gICAgICAgICMgT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIHByZXNlcnZlIHRoZSBsb25nIHdvcmQgaW50YWN0LiAgT25seSBhZGRcXG4gICAgICAgICMgaXQgdG8gdGhlIGN1cnJlbnQgbGluZSBpZiB0aGVyZSdzIG5vdGhpbmcgYWxyZWFkeSB0aGVyZSAtLVxcbiAgICAgICAgIyB0aGF0IG1pbmltaXplcyBob3cgbXVjaCB3ZSB2aW9sYXRlIHRoZSB3aWR0aCBjb25zdHJhaW50LlxcbiAgICAgICAgZWxpZiBub3QgY3VyX2xpbmU6XFxuICAgICAgICAgICAgY3VyX2xpbmUuYXBwZW5kKHJldmVyc2VkX2NodW5rcy5wb3AoKSlcXG5cXG4gICAgICAgICMgSWYgd2UncmUgbm90IGFsbG93ZWQgdG8gYnJlYWsgbG9uZyB3b3JkcywgYW5kIHRoZXJlJ3MgYWxyZWFkeVxcbiAgICAgICAgIyB0ZXh0IG9uIHRoZSBjdXJyZW50IGxpbmUsIGRvIG5vdGhpbmcuICBOZXh0IHRpbWUgdGhyb3VnaCB0aGVcXG4gICAgICAgICMgbWFpbiBsb29wIG9mIF93cmFwX2NodW5rcygpLCB3ZSdsbCB3aW5kIHVwIGhlcmUgYWdhaW4sIGJ1dFxcbiAgICAgICAgIyBjdXJfbGVuIHdpbGwgYmUgemVybywgc28gdGhlIG5leHQgbGluZSB3aWxsIGJlIGVudGlyZWx5XFxuICAgICAgICAjIGRldm90ZWQgdG8gdGhlIGxvbmcgd29yZCB0aGF0IHdlIGNhbid0IGhhbmRsZSByaWdodCBub3cuXFxuXFxuICAgIGRlZiBfd3JhcF9jaHVua3Moc2VsZiwgY2h1bmtzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl93cmFwX2NodW5rcyhjaHVua3MgOiBbc3RyaW5nXSkgLT4gW3N0cmluZ11cXG4gICAgICAgIFdyYXAgYSBzZXF1ZW5jZSBvZiB0ZXh0IGNodW5rcyBhbmQgcmV0dXJuIGEgbGlzdCBvZiBsaW5lcyBvZlxcbiAgICAgICAgbGVuZ3RoICdzZWxmLndpZHRoJyBvciBsZXNzLiAgKElmICdicmVha19sb25nX3dvcmRzJyBpcyBmYWxzZSxcXG4gICAgICAgIHNvbWUgbGluZXMgbWF5IGJlIGxvbmdlciB0aGFuIHRoaXMuKSAgQ2h1bmtzIGNvcnJlc3BvbmQgcm91Z2hseVxcbiAgICAgICAgdG8gd29yZHMgYW5kIHRoZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlbTogZWFjaCBjaHVuayBpc1xcbiAgICAgICAgaW5kaXZpc2libGUgKG1vZHVsbyAnYnJlYWtfbG9uZ193b3JkcycpLCBidXQgYSBsaW5lIGJyZWFrIGNhblxcbiAgICAgICAgY29tZSBiZXR3ZWVuIGFueSB0d28gY2h1bmtzLiAgQ2h1bmtzIHNob3VsZCBub3QgaGF2ZSBpbnRlcm5hbFxcbiAgICAgICAgd2hpdGVzcGFjZTsgaWUuIGEgY2h1bmsgaXMgZWl0aGVyIGFsbCB3aGl0ZXNwYWNlIG9yIGEgXFxcIndvcmRcXFwiLlxcbiAgICAgICAgV2hpdGVzcGFjZSBjaHVua3Mgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mXFxuICAgICAgICBsaW5lcywgYnV0IGFwYXJ0IGZyb20gdGhhdCB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgbGluZXMgPSBbXVxcbiAgICAgICAgaWYgc2VsZi53aWR0aCA8PSAwOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImludmFsaWQgd2lkdGggJXIgKG11c3QgYmUgPiAwKVxcXCIgJSBzZWxmLndpZHRoKVxcbiAgICAgICAgaWYgc2VsZi5tYXhfbGluZXMgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgaWYgc2VsZi5tYXhfbGluZXMgPiAxOlxcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLnN1YnNlcXVlbnRfaW5kZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbml0aWFsX2luZGVudFxcbiAgICAgICAgICAgIGlmIGxlbihpbmRlbnQpICsgbGVuKHNlbGYucGxhY2Vob2xkZXIubHN0cmlwKCkpID4gc2VsZi53aWR0aDpcXG4gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwicGxhY2Vob2xkZXIgdG9vIGxhcmdlIGZvciBtYXggd2lkdGhcXFwiKVxcblxcbiAgICAgICAgIyBBcnJhbmdlIGluIHJldmVyc2Ugb3JkZXIgc28gaXRlbXMgY2FuIGJlIGVmZmljaWVudGx5IHBvcHBlZFxcbiAgICAgICAgIyBmcm9tIGEgc3RhY2sgb2YgY2h1Y2tzLlxcbiAgICAgICAgY2h1bmtzLnJldmVyc2UoKVxcblxcbiAgICAgICAgd2hpbGUgY2h1bmtzOlxcblxcbiAgICAgICAgICAgICMgU3RhcnQgdGhlIGxpc3Qgb2YgY2h1bmtzIHRoYXQgd2lsbCBtYWtlIHVwIHRoZSBjdXJyZW50IGxpbmUuXFxuICAgICAgICAgICAgIyBjdXJfbGVuIGlzIGp1c3QgdGhlIGxlbmd0aCBvZiBhbGwgdGhlIGNodW5rcyBpbiBjdXJfbGluZS5cXG4gICAgICAgICAgICBjdXJfbGluZSA9IFtdXFxuICAgICAgICAgICAgY3VyX2xlbiA9IDBcXG5cXG4gICAgICAgICAgICAjIEZpZ3VyZSBvdXQgd2hpY2ggc3RhdGljIHN0cmluZyB3aWxsIHByZWZpeCB0aGlzIGxpbmUuXFxuICAgICAgICAgICAgaWYgbGluZXM6XFxuICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuc3Vic2VxdWVudF9pbmRlbnRcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmluaXRpYWxfaW5kZW50XFxuXFxuICAgICAgICAgICAgIyBNYXhpbXVtIHdpZHRoIGZvciB0aGlzIGxpbmUuXFxuICAgICAgICAgICAgd2lkdGggPSBzZWxmLndpZHRoIC0gbGVuKGluZGVudClcXG5cXG4gICAgICAgICAgICAjIEZpcnN0IGNodW5rIG9uIGxpbmUgaXMgd2hpdGVzcGFjZSAtLSBkcm9wIGl0LCB1bmxlc3MgdGhpc1xcbiAgICAgICAgICAgICMgaXMgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0IChpZS4gbm8gbGluZXMgc3RhcnRlZCB5ZXQpLlxcbiAgICAgICAgICAgIGlmIHNlbGYuZHJvcF93aGl0ZXNwYWNlIGFuZCBjaHVua3NbLTFdLnN0cmlwKCkgPT0gJycgYW5kIGxpbmVzOlxcbiAgICAgICAgICAgICAgICBkZWwgY2h1bmtzWy0xXVxcblxcbiAgICAgICAgICAgIHdoaWxlIGNodW5rczpcXG4gICAgICAgICAgICAgICAgbCA9IGxlbihjaHVua3NbLTFdKVxcblxcbiAgICAgICAgICAgICAgICAjIENhbiBhdCBsZWFzdCBzcXVlZXplIHRoaXMgY2h1bmsgb250byB0aGUgY3VycmVudCBsaW5lLlxcbiAgICAgICAgICAgICAgICBpZiBjdXJfbGVuICsgbCA8PSB3aWR0aDpcXG4gICAgICAgICAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChjaHVua3MucG9wKCkpXFxuICAgICAgICAgICAgICAgICAgICBjdXJfbGVuICs9IGxcXG5cXG4gICAgICAgICAgICAgICAgIyBOb3BlLCB0aGlzIGxpbmUgaXMgZnVsbC5cXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXFxuXFxuICAgICAgICAgICAgIyBUaGUgY3VycmVudCBsaW5lIGlzIGZ1bGwsIGFuZCB0aGUgbmV4dCBjaHVuayBpcyB0b28gYmlnIHRvXFxuICAgICAgICAgICAgIyBmaXQgb24gKmFueSogbGluZSAobm90IGp1c3QgdGhpcyBvbmUpLlxcbiAgICAgICAgICAgIGlmIGNodW5rcyBhbmQgbGVuKGNodW5rc1stMV0pID4gd2lkdGg6XFxuICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9sb25nX3dvcmQoY2h1bmtzLCBjdXJfbGluZSwgY3VyX2xlbiwgd2lkdGgpXFxuICAgICAgICAgICAgICAgIGN1cl9sZW4gPSBzdW0obWFwKGxlbiwgY3VyX2xpbmUpKVxcblxcbiAgICAgICAgICAgICMgSWYgdGhlIGxhc3QgY2h1bmsgb24gdGhpcyBsaW5lIGlzIGFsbCB3aGl0ZXNwYWNlLCBkcm9wIGl0LlxcbiAgICAgICAgICAgIGlmIHNlbGYuZHJvcF93aGl0ZXNwYWNlIGFuZCBjdXJfbGluZSBhbmQgY3VyX2xpbmVbLTFdLnN0cmlwKCkgPT0gJyc6XFxuICAgICAgICAgICAgICAgIGN1cl9sZW4gLT0gbGVuKGN1cl9saW5lWy0xXSlcXG4gICAgICAgICAgICAgICAgZGVsIGN1cl9saW5lWy0xXVxcblxcbiAgICAgICAgICAgIGlmIGN1cl9saW5lOlxcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5tYXhfbGluZXMgaXMgTm9uZSBvclxcbiAgICAgICAgICAgICAgICAgICAgbGVuKGxpbmVzKSArIDEgPCBzZWxmLm1heF9saW5lcyBvclxcbiAgICAgICAgICAgICAgICAgICAgKG5vdCBjaHVua3Mgb3JcXG4gICAgICAgICAgICAgICAgICAgICBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmRcXG4gICAgICAgICAgICAgICAgICAgICBsZW4oY2h1bmtzKSA9PSAxIGFuZFxcbiAgICAgICAgICAgICAgICAgICAgIG5vdCBjaHVua3NbMF0uc3RyaXAoKSkgYW5kIGN1cl9sZW4gPD0gd2lkdGgpOlxcbiAgICAgICAgICAgICAgICAgICAgIyBDb252ZXJ0IGN1cnJlbnQgbGluZSBiYWNrIHRvIGEgc3RyaW5nIGFuZCBzdG9yZSBpdCBpblxcbiAgICAgICAgICAgICAgICAgICAgIyBsaXN0IG9mIGFsbCBsaW5lcyAocmV0dXJuIHZhbHVlKS5cXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChpbmRlbnQgKyAnJy5qb2luKGN1cl9saW5lKSlcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIGN1cl9saW5lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJfbGluZVstMV0uc3RyaXAoKSBhbmRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2xlbiArIGxlbihzZWxmLnBsYWNlaG9sZGVyKSA8PSB3aWR0aCk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChzZWxmLnBsYWNlaG9sZGVyKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoaW5kZW50ICsgJycuam9pbihjdXJfbGluZSkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2xlbiAtPSBsZW4oY3VyX2xpbmVbLTFdKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBjdXJfbGluZVstMV1cXG4gICAgICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZXM6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfbGluZSA9IGxpbmVzWy0xXS5yc3RyaXAoKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuKHByZXZfbGluZSkgKyBsZW4oc2VsZi5wbGFjZWhvbGRlcikgPD1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndpZHRoKTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzWy0xXSA9IHByZXZfbGluZSArIHNlbGYucGxhY2Vob2xkZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGluZGVudCArIHNlbGYucGxhY2Vob2xkZXIubHN0cmlwKCkpXFxuICAgICAgICAgICAgICAgICAgICBicmVha1xcblxcbiAgICAgICAgcmV0dXJuIGxpbmVzXFxuXFxuICAgIGRlZiBfc3BsaXRfY2h1bmtzKHNlbGYsIHRleHQpOlxcbiAgICAgICAgdGV4dCA9IHNlbGYuX211bmdlX3doaXRlc3BhY2UodGV4dClcXG4gICAgICAgIHJldHVybiBzZWxmLl9zcGxpdCh0ZXh0KVxcblxcbiAgICAjIC0tIFB1YmxpYyBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblxcbiAgICBkZWYgd3JhcChzZWxmLCB0ZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIndyYXAodGV4dCA6IHN0cmluZykgLT4gW3N0cmluZ11cXG4gICAgICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyBzbyBpdCBmaXRzIGluIGxpbmVzIG9mXFxuICAgICAgICBubyBtb3JlIHRoYW4gJ3NlbGYud2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBsaXN0IG9mIHdyYXBwZWRcXG4gICAgICAgIGxpbmVzLiAgVGFicyBpbiAndGV4dCcgYXJlIGV4cGFuZGVkIHdpdGggc3RyaW5nLmV4cGFuZHRhYnMoKSxcXG4gICAgICAgIGFuZCBhbGwgb3RoZXIgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgbmV3bGluZSkgYXJlXFxuICAgICAgICBjb252ZXJ0ZWQgdG8gc3BhY2UuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGNodW5rcyA9IHNlbGYuX3NwbGl0X2NodW5rcyh0ZXh0KVxcbiAgICAgICAgaWYgc2VsZi5maXhfc2VudGVuY2VfZW5kaW5nczpcXG4gICAgICAgICAgICBzZWxmLl9maXhfc2VudGVuY2VfZW5kaW5ncyhjaHVua3MpXFxuICAgICAgICByZXR1cm4gc2VsZi5fd3JhcF9jaHVua3MoY2h1bmtzKVxcblxcbiAgICBkZWYgZmlsbChzZWxmLCB0ZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImZpbGwodGV4dCA6IHN0cmluZykgLT4gc3RyaW5nXFxuICAgICAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgdG8gZml0IGluIGxpbmVzIG9mIG5vXFxuICAgICAgICBtb3JlIHRoYW4gJ3NlbGYud2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBuZXcgc3RyaW5nXFxuICAgICAgICBjb250YWluaW5nIHRoZSBlbnRpcmUgd3JhcHBlZCBwYXJhZ3JhcGguXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBcXFwiXFxcXG5cXFwiLmpvaW4oc2VsZi53cmFwKHRleHQpKVxcblxcblxcbiMgLS0gQ29udmVuaWVuY2UgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblxcbmRlZiB3cmFwKHRleHQsIHdpZHRoPTcwLCAqKmt3YXJncyk6XFxuICAgIFxcXCJcXFwiXFxcIldyYXAgYSBzaW5nbGUgcGFyYWdyYXBoIG9mIHRleHQsIHJldHVybmluZyBhIGxpc3Qgb2Ygd3JhcHBlZCBsaW5lcy5cXG4gICAgUmVmb3JtYXQgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gJ3RleHQnIHNvIGl0IGZpdHMgaW4gbGluZXMgb2Ygbm9cXG4gICAgbW9yZSB0aGFuICd3aWR0aCcgY29sdW1ucywgYW5kIHJldHVybiBhIGxpc3Qgb2Ygd3JhcHBlZCBsaW5lcy4gIEJ5XFxuICAgIGRlZmF1bHQsIHRhYnMgaW4gJ3RleHQnIGFyZSBleHBhbmRlZCB3aXRoIHN0cmluZy5leHBhbmR0YWJzKCksIGFuZFxcbiAgICBhbGwgb3RoZXIgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgbmV3bGluZSkgYXJlIGNvbnZlcnRlZCB0b1xcbiAgICBzcGFjZS4gIFNlZSBUZXh0V3JhcHBlciBjbGFzcyBmb3IgYXZhaWxhYmxlIGtleXdvcmQgYXJncyB0byBjdXN0b21pemVcXG4gICAgd3JhcHBpbmcgYmVoYXZpb3VyLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdyA9IFRleHRXcmFwcGVyKHdpZHRoPXdpZHRoLCAqKmt3YXJncylcXG4gICAgcmV0dXJuIHcud3JhcCh0ZXh0KVxcblxcbmRlZiBmaWxsKHRleHQsIHdpZHRoPTcwLCAqKmt3YXJncyk6XFxuICAgIFxcXCJcXFwiXFxcIkZpbGwgYSBzaW5nbGUgcGFyYWdyYXBoIG9mIHRleHQsIHJldHVybmluZyBhIG5ldyBzdHJpbmcuXFxuICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyB0byBmaXQgaW4gbGluZXMgb2Ygbm8gbW9yZVxcbiAgICB0aGFuICd3aWR0aCcgY29sdW1ucywgYW5kIHJldHVybiBhIG5ldyBzdHJpbmcgY29udGFpbmluZyB0aGUgZW50aXJlXFxuICAgIHdyYXBwZWQgcGFyYWdyYXBoLiAgQXMgd2l0aCB3cmFwKCksIHRhYnMgYXJlIGV4cGFuZGVkIGFuZCBvdGhlclxcbiAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgY29udmVydGVkIHRvIHNwYWNlLiAgU2VlIFRleHRXcmFwcGVyIGNsYXNzIGZvclxcbiAgICBhdmFpbGFibGUga2V5d29yZCBhcmdzIHRvIGN1c3RvbWl6ZSB3cmFwcGluZyBiZWhhdmlvdXIuXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICB3ID0gVGV4dFdyYXBwZXIod2lkdGg9d2lkdGgsICoqa3dhcmdzKVxcbiAgICByZXR1cm4gdy5maWxsKHRleHQpXFxuXFxuZGVmIHNob3J0ZW4odGV4dCwgd2lkdGgsICoqa3dhcmdzKTpcXG4gICAgXFxcIlxcXCJcXFwiQ29sbGFwc2UgYW5kIHRydW5jYXRlIHRoZSBnaXZlbiB0ZXh0IHRvIGZpdCBpbiB0aGUgZ2l2ZW4gd2lkdGguXFxuICAgIFRoZSB0ZXh0IGZpcnN0IGhhcyBpdHMgd2hpdGVzcGFjZSBjb2xsYXBzZWQuICBJZiBpdCB0aGVuIGZpdHMgaW5cXG4gICAgdGhlICp3aWR0aCosIGl0IGlzIHJldHVybmVkIGFzIGlzLiAgT3RoZXJ3aXNlLCBhcyBtYW55IHdvcmRzXFxuICAgIGFzIHBvc3NpYmxlIGFyZSBqb2luZWQgYW5kIHRoZW4gdGhlIHBsYWNlaG9sZGVyIGlzIGFwcGVuZGVkOjpcXG4gICAgICAgID4+PiB0ZXh0d3JhcC5zaG9ydGVuKFxcXCJIZWxsbyAgd29ybGQhXFxcIiwgd2lkdGg9MTIpXFxuICAgICAgICAnSGVsbG8gd29ybGQhJ1xcbiAgICAgICAgPj4+IHRleHR3cmFwLnNob3J0ZW4oXFxcIkhlbGxvICB3b3JsZCFcXFwiLCB3aWR0aD0xMSlcXG4gICAgICAgICdIZWxsbyBbLi4uXSdcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIHcgPSBUZXh0V3JhcHBlcih3aWR0aD13aWR0aCwgbWF4X2xpbmVzPTEsICoqa3dhcmdzKVxcbiAgICByZXR1cm4gdy5maWxsKCcgJy5qb2luKHRleHQuc3RyaXAoKS5zcGxpdCgpKSlcXG5cXG5cXG4jIC0tIExvb3NlbHkgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG4jIF93aGl0ZXNwYWNlX29ubHlfcmUgPSByZS5jb21waWxlKCdeWyBcXFxcdF0rJCcsIHJlLk1VTFRJTElORSlcXG4jIF9sZWFkaW5nX3doaXRlc3BhY2VfcmUgPSByZS5jb21waWxlKCcoXlsgXFxcXHRdKikoPzpbXiBcXFxcdFxcXFxuXSknLCByZS5NVUxUSUxJTkUpXFxuXFxuZGVmIGRlZGVudCh0ZXh0KTpcXG4gICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGFueSBjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gZXZlcnkgbGluZSBpbiBgdGV4dGAuXFxuICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gbWFrZSB0cmlwbGUtcXVvdGVkIHN0cmluZ3MgbGluZSB1cCB3aXRoIHRoZSBsZWZ0XFxuICAgIGVkZ2Ugb2YgdGhlIGRpc3BsYXksIHdoaWxlIHN0aWxsIHByZXNlbnRpbmcgdGhlbSBpbiB0aGUgc291cmNlIGNvZGVcXG4gICAgaW4gaW5kZW50ZWQgZm9ybS5cXG4gICAgTm90ZSB0aGF0IHRhYnMgYW5kIHNwYWNlcyBhcmUgYm90aCB0cmVhdGVkIGFzIHdoaXRlc3BhY2UsIGJ1dCB0aGV5XFxuICAgIGFyZSBub3QgZXF1YWw6IHRoZSBsaW5lcyBcXFwiICBoZWxsb1xcXCIgYW5kIFxcXCJcXFxcXFxcXHRoZWxsb1xcXCIgYXJlXFxuICAgIGNvbnNpZGVyZWQgdG8gaGF2ZSBubyBjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlLlxcbiAgICBFbnRpcmVseSBibGFuayBsaW5lcyBhcmUgbm9ybWFsaXplZCB0byBhIG5ld2xpbmUgY2hhcmFjdGVyLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgIyBMb29rIGZvciB0aGUgbG9uZ2VzdCBsZWFkaW5nIHN0cmluZyBvZiBzcGFjZXMgYW5kIHRhYnMgY29tbW9uIHRvXFxuICAgICMgYWxsIGxpbmVzLlxcbiAgICBtYXJnaW4gPSBOb25lXFxuXFxuICAgIGluZGVudHMgPSByZS5maW5kYWxsKHInKF5bIFxcXFx0XSopKD86W14gXFxcXHRcXFxcbl0pJyx0ZXh0LCByZS5NVUxUSUxJTkUpXFxuICAgIGZvciBpbmRlbnQgaW4gaW5kZW50czpcXG4gICAgICAgIGlmIG1hcmdpbiBpcyBOb25lOlxcbiAgICAgICAgICAgIG1hcmdpbiA9IGluZGVudFxcblxcbiAgICAgICAgIyBDdXJyZW50IGxpbmUgbW9yZSBkZWVwbHkgaW5kZW50ZWQgdGhhbiBwcmV2aW91cyB3aW5uZXI6XFxuICAgICAgICAjIG5vIGNoYW5nZSAocHJldmlvdXMgd2lubmVyIGlzIHN0aWxsIG9uIHRvcCkuXFxuICAgICAgICBlbGlmIGluZGVudC5zdGFydHN3aXRoKG1hcmdpbik6XFxuICAgICAgICAgICAgcGFzc1xcblxcbiAgICAgICAgIyBDdXJyZW50IGxpbmUgY29uc2lzdGVudCB3aXRoIGFuZCBubyBkZWVwZXIgdGhhbiBwcmV2aW91cyB3aW5uZXI6XFxuICAgICAgICAjIGl0J3MgdGhlIG5ldyB3aW5uZXIuXFxuICAgICAgICBlbGlmIG1hcmdpbi5zdGFydHN3aXRoKGluZGVudCk6XFxuICAgICAgICAgICAgbWFyZ2luID0gaW5kZW50XFxuXFxuICAgICAgICAjIEZpbmQgdGhlIGxhcmdlc3QgY29tbW9uIHdoaXRlc3BhY2UgYmV0d2VlbiBjdXJyZW50IGxpbmUgYW5kIHByZXZpb3VzXFxuICAgICAgICAjIHdpbm5lci5cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgZm9yIGksICh4LCB5KSBpbiBlbnVtZXJhdGUoemlwKG1hcmdpbiwgaW5kZW50KSk6XFxuICAgICAgICAgICAgICAgIGlmIHggIT0geTpcXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbls6aV1cXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICMgc2FuaXR5IGNoZWNrICh0ZXN0aW5nL2RlYnVnZ2luZyBvbmx5KVxcbiAgICBpZiAwIGFuZCBtYXJnaW46XFxuICAgICAgICBmb3IgbGluZSBpbiB0ZXh0LnNwbGl0KFxcXCJcXFxcblxcXCIpOlxcbiAgICAgICAgICAgIGFzc2VydCBub3QgbGluZSBvciBsaW5lLnN0YXJ0c3dpdGgobWFyZ2luKSwgXFxcXFxcbiAgICAgICAgICAgICAgICAgICBcXFwibGluZSA9ICVyLCBtYXJnaW4gPSAlclxcXCIgJSAobGluZSwgbWFyZ2luKVxcblxcbiAgICBpZiBtYXJnaW46XFxuICAgICAgICBsaW5lcyA9IFtsaW5lW2xlbihtYXJnaW4pOl0gXFxuICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0cmlwKClcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGxpbmUuc3RyaXAoKSBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdChcXFwiXFxcXG5cXFwiKV1cXG4gICAgICAgIHRleHQgPSBcXFwiXFxcXG5cXFwiLmpvaW4obGluZXMpXFxuICAgIHJldHVybiB0ZXh0XFxuXFxuXFxuZGVmIGluZGVudCh0ZXh0LCBwcmVmaXgsIHByZWRpY2F0ZT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiQWRkcyAncHJlZml4JyB0byB0aGUgYmVnaW5uaW5nIG9mIHNlbGVjdGVkIGxpbmVzIGluICd0ZXh0Jy5cXG4gICAgSWYgJ3ByZWRpY2F0ZScgaXMgcHJvdmlkZWQsICdwcmVmaXgnIHdpbGwgb25seSBiZSBhZGRlZCB0byB0aGUgbGluZXNcXG4gICAgd2hlcmUgJ3ByZWRpY2F0ZShsaW5lKScgaXMgVHJ1ZS4gSWYgJ3ByZWRpY2F0ZScgaXMgbm90IHByb3ZpZGVkLFxcbiAgICBpdCB3aWxsIGRlZmF1bHQgdG8gYWRkaW5nICdwcmVmaXgnIHRvIGFsbCBub24tZW1wdHkgbGluZXMgdGhhdCBkbyBub3RcXG4gICAgY29uc2lzdCBzb2xlbHkgb2Ygd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgaWYgcHJlZGljYXRlIGlzIE5vbmU6XFxuICAgICAgICBkZWYgcHJlZGljYXRlKGxpbmUpOlxcbiAgICAgICAgICAgIHJldHVybiBsaW5lLnN0cmlwKClcXG5cXG4gICAgZGVmIHByZWZpeGVkX2xpbmVzKCk6XFxuICAgICAgICBmb3IgbGluZSBpbiB0ZXh0LnNwbGl0bGluZXMoVHJ1ZSk6XFxuICAgICAgICAgICAgeWllbGQgKHByZWZpeCArIGxpbmUgaWYgcHJlZGljYXRlKGxpbmUpIGVsc2UgbGluZSlcXG4gICAgcmV0dXJuICcnLmpvaW4ocHJlZml4ZWRfbGluZXMoKSlcXG5cXG5cXG5pZiBfX25hbWVfXyA9PSBcXFwiX19tYWluX19cXFwiOlxcbiAgICAjcHJpbnQgZGVkZW50KFxcXCJcXFxcdGZvb1xcXFxuXFxcXHRiYXJcXFwiKVxcbiAgICAjcHJpbnQgZGVkZW50KFxcXCIgIFxcXFx0aGVsbG8gdGhlcmVcXFxcbiAgXFxcXHQgIGhvdyBhcmUgeW91P1xcXCIpXFxuICAgIHByaW50KGRlZGVudChcXFwiSGVsbG8gdGhlcmUuXFxcXG4gIFRoaXMgaXMgaW5kZW50ZWQuXFxcIikpXCIsXCJzcmMvbGliL3RoaXMucHlcIjpcIlxcbnByaW50KFxcXCJcXFwiXFxcIlxcblRoZSBaZW4gb2YgUHl0aG9uLCBieSBUaW0gUGV0ZXJzXFxuXFxuQmVhdXRpZnVsIGlzIGJldHRlciB0aGFuIHVnbHkuXFxuRXhwbGljaXQgaXMgYmV0dGVyIHRoYW4gaW1wbGljaXQuXFxuU2ltcGxlIGlzIGJldHRlciB0aGFuIGNvbXBsZXguXFxuQ29tcGxleCBpcyBiZXR0ZXIgdGhhbiBjb21wbGljYXRlZC5cXG5GbGF0IGlzIGJldHRlciB0aGFuIG5lc3RlZC5cXG5TcGFyc2UgaXMgYmV0dGVyIHRoYW4gZGVuc2UuXFxuUmVhZGFiaWxpdHkgY291bnRzLlxcblNwZWNpYWwgY2FzZXMgYXJlbid0IHNwZWNpYWwgZW5vdWdoIHRvIGJyZWFrIHRoZSBydWxlcy5cXG5BbHRob3VnaCBwcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LlxcbkVycm9ycyBzaG91bGQgbmV2ZXIgcGFzcyBzaWxlbnRseS5cXG5Vbmxlc3MgZXhwbGljaXRseSBzaWxlbmNlZC5cXG5JbiB0aGUgZmFjZSBvZiBhbWJpZ3VpdHksIHJlZnVzZSB0aGUgdGVtcHRhdGlvbiB0byBndWVzcy5cXG5UaGVyZSBzaG91bGQgYmUgb25lLS0gYW5kIHByZWZlcmFibHkgb25seSBvbmUgLS1vYnZpb3VzIHdheSB0byBkbyBpdC5cXG5BbHRob3VnaCB0aGF0IHdheSBtYXkgbm90IGJlIG9idmlvdXMgYXQgZmlyc3QgdW5sZXNzIHlvdSdyZSBEdXRjaC5cXG5Ob3cgaXMgYmV0dGVyIHRoYW4gbmV2ZXIuXFxuQWx0aG91Z2ggbmV2ZXIgaXMgb2Z0ZW4gYmV0dGVyIHRoYW4gKnJpZ2h0KiBub3cuXFxuSWYgdGhlIGltcGxlbWVudGF0aW9uIGlzIGhhcmQgdG8gZXhwbGFpbiwgaXQncyBhIGJhZCBpZGVhLlxcbklmIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBlYXN5IHRvIGV4cGxhaW4sIGl0IG1heSBiZSBhIGdvb2QgaWRlYS5cXG5OYW1lc3BhY2VzIGFyZSBvbmUgaG9ua2luZyBncmVhdCBpZGVhIC0tIGxldCdzIGRvIG1vcmUgb2YgdGhvc2UhXFxuXFxcIlxcXCJcXFwiXFxuKVxcblwiLFwic3JjL2xpYi90aHJlYWRpbmcucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRocmVhZGluZyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RpbWUuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGNoZWNrX3N0cnVjdF90aW1lKGEpe2lmKCEoYSBpbnN0YW5jZW9mIGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiUmVxdWlyZWQgYXJndW1lbnQgJ3N0cnVjdF90aW1lJyBtdXN0IGJlIG9mIHR5cGU6ICdzdHJ1Y3RfdGltZSdcXFwiKTt2YXIgYyxkPWEudi5sZW5ndGgsZT1hLnY7Zm9yKGM9MDtjPGQ7KytjKWlmKCFTay5idWlsdGluLmNoZWNrSW50KGVbY10pKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic3RydWN0X3RpbWUgbWF5IG9ubHkgY29udGFpbiBpbnRlZ2Vyc1xcXCIpO3JldHVybiEwfWZ1bmN0aW9uIHBhZExlZnQoYSxiLGQpe3ZhciBjPWEudG9TdHJpbmcoKTtyZXR1cm4gQXJyYXkoYi1jLmxlbmd0aCsxKS5qb2luKGR8fFxcXCIgXFxcIikrY31mdW5jdGlvbiBpc0xlYXBZZWFyKGEpe3JldHVybiAwPT0oMyZhKSYmKDAhPWElMTAwfHwwPT1hJTQwMCl9ZnVuY3Rpb24gZ2V0RGF5T2ZZZWFyKGEsYil7Yj1ifHwhMTt2YXIgYz1iP2EuZ2V0VVRDTW9udGgoKTphLmdldE1vbnRoKCksZD1iP2EuZ2V0VVRDRGF0ZSgpOmEuZ2V0RGF0ZSgpLGU9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF1bY10rZDtyZXR1cm4gMTxjJiZpc0xlYXBZZWFyKGI/YS5nZXRVVENGdWxsWWVhcigpOmEuZ2V0RnVsbFllYXIoKSkmJmUrKyxlfWZ1bmN0aW9uIHN0ZFRpbWV6b25lT2Zmc2V0KCl7dmFyIGE9TWF0aC5tYXgsYj1uZXcgRGF0ZSgyMDAyLDAsMSksYz1uZXcgRGF0ZSgyMDAyLDYsMSk7cmV0dXJuIGEoYi5nZXRUaW1lem9uZU9mZnNldCgpLGMuZ2V0VGltZXpvbmVPZmZzZXQoKSl9ZnVuY3Rpb24gZHN0KGEpe3JldHVybiBhLmdldFRpbWV6b25lT2Zmc2V0KCk8c3RkVGltZXpvbmVPZmZzZXQoKX1mdW5jdGlvbiB0aW1lWm9uZU5hbWUoYSl7dmFyIGIsYz0vXFxcXCgoLiopXFxcXCkvLmV4ZWMoYS50b1N0cmluZygpKTtpZihudWxsIT10aGlzLm5hdmlnYXRvciYmKGI9dGhpcy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx0aGlzLm5hdmlnYXRvci5sYW5ndWFnZSksYyYmMTxjLmxlbmd0aClyZXR1cm4gY1sxXTtpZih2b2lkIDA9PT1iKXJldHVybiBudWxsO3RyeXt2YXIgZD1hLnRvTG9jYWxlU3RyaW5nKGIse3RpbWVab25lTmFtZTpcXFwic2hvcnRcXFwifSk7cmV0dXJuIGM9ZC5zcGxpdChcXFwiIFxcXCIpLGNbYy5sZW5ndGgtMV19Y2F0Y2goYSl7cmV0dXJuIG51bGx9fWZ1bmN0aW9uIGRhdGVfdG9fc3RydWN0X3RpbWUoYSxjKXtyZXR1cm4gYz1jfHwhMSxuZXcgYihbU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDRnVsbFllYXIoKTphLmdldEZ1bGxZZWFyKCkpLFNrLmJ1aWx0aW4uYXNzayQoKGM/YS5nZXRVVENNb250aCgpOmEuZ2V0TW9udGgoKSkrMSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDRGF0ZSgpOmEuZ2V0RGF0ZSgpKSxTay5idWlsdGluLmFzc2skKGM/YS5nZXRVVENIb3VycygpOmEuZ2V0SG91cnMoKSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDTWludXRlcygpOmEuZ2V0TWludXRlcygpKSxTay5idWlsdGluLmFzc2skKGM/YS5nZXRVVENTZWNvbmRzKCk6YS5nZXRTZWNvbmRzKCkpLFNrLmJ1aWx0aW4uYXNzayQoKChjP2EuZ2V0VVRDRGF5KCk6YS5nZXREYXkoKSkrNiklNyksU2suYnVpbHRpbi5hc3NrJChnZXREYXlPZlllYXIoYSxjKSksU2suYnVpbHRpbi5hc3NrJChjPzA6ZHN0KGEpPzE6MCldKX1mdW5jdGlvbiBmcm9tX3NlY29uZHMoYSxiKXt2YXIgYz1uZXcgRGF0ZTtpZihhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzZWNzXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTt2YXIgZD1Tay5idWlsdGluLmFzbnVtJChhKTtjLnNldFRpbWUoMWUzKmQpfXJldHVybiBkYXRlX3RvX3N0cnVjdF90aW1lKGMsYil9ZnVuY3Rpb24gYXNjdGltZV9mKGEpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImFzY3RpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSwhYXx8U2suYnVpbHRpbi5jaGVja05vbmUoYSk/YT1mcm9tX3NlY29uZHMoKTohKGEgaW5zdGFuY2VvZiBiKSYmKGE9bmV3IGIoYSkpLGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlJiY5PT1hLnYubGVuZ3RoKXt2YXIgZT1bZFtTay5idWlsdGluLmFzbnVtJChhLnZbNl0pXSxjW1NrLmJ1aWx0aW4uYXNudW0kKGEudlsxXSktMV0scGFkTGVmdChTay5idWlsdGluLmFzbnVtJChhLnZbMl0pLnRvU3RyaW5nKCksMixcXFwiMFxcXCIpLHBhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzNdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKStcXFwiOlxcXCIrcGFkTGVmdChTay5idWlsdGluLmFzbnVtJChhLnZbNF0pLnRvU3RyaW5nKCksMixcXFwiMFxcXCIpK1xcXCI6XFxcIitwYWRMZWZ0KFNrLmJ1aWx0aW4uYXNudW0kKGEudls1XSkudG9TdHJpbmcoKSwyLFxcXCIwXFxcIikscGFkTGVmdChTay5idWlsdGluLmFzbnVtJChhLnZbMF0pLnRvU3RyaW5nKCksNCxcXFwiMFxcXCIpXTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGUuam9pbihcXFwiIFxcXCIpKX19ZnVuY3Rpb24gbWt0aW1lX2YoYSl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibWt0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUmJjk9PWEudi5sZW5ndGgpe3ZhciBiPW5ldyBEYXRlKFNrLmJ1aWx0aW4uYXNudW0kKGEudlswXSksU2suYnVpbHRpbi5hc251bSQoYS52WzFdKS0xLFNrLmJ1aWx0aW4uYXNudW0kKGEudlsyXSksU2suYnVpbHRpbi5hc251bSQoYS52WzNdKSxTay5idWlsdGluLmFzbnVtJChhLnZbNF0pLFNrLmJ1aWx0aW4uYXNudW0kKGEudls1XSkpO3JldHVybiBTay5idWlsdGluLmFzc2skKGIuZ2V0VGltZSgpLzFlMyx2b2lkIDApfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWt0aW1lKCkgcmVxdWlyZXMgYSBzdHJ1Y3RfdGltZSBvciA5LXR1cGxlXFxcIil9dmFyIGE9e19fcGFja2FnZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwiXFxcIil9LGI9U2suYnVpbHRpbi5tYWtlX3N0cnVjdHNlcShcXFwidGltZVxcXCIsXFxcInN0cnVjdF90aW1lXFxcIix7dG1feWVhcjpcXFwieWVhciwgZm9yIGV4YW1wbGUsIDE5OTNcXFwiLHRtX21vbjpcXFwibW9udGggb2YgeWVhciwgcmFuZ2UgWzEsIDEyXVxcXCIsdG1fbWRheTpcXFwiZGF5IG9mIG1vbnRoLCByYW5nZSBbMSwgMzFdXFxcIix0bV9ob3VyOlxcXCJob3VycywgcmFuZ2UgWzAsIDIzXVxcXCIsdG1fbWluOlxcXCJtaW51dGVzLCByYW5nZSBbMCwgNTldXFxcIix0bV9zZWM6XFxcInNlY29uZHMsIHJhbmdlIFswLCA2MV1cXFwiLHRtX3dkYXk6XFxcImRheSBvZiB3ZWVrLCByYW5nZSBbMCwgNl0sIE1vbmRheSBpcyAwXFxcIix0bV95ZGF5OlxcXCJkYXkgb2YgeWVhciwgcmFuZ2UgWzEsIDM2Nl1cXFwiLHRtX2lzZHN0OlxcXCIxIGlmIHN1bW1lciB0aW1lIGlzIGluIGVmZmVjdCwgMCBpZiBub3QsIGFuZCAtMSBpZiB1bmtub3duXFxcIn0pO2Euc3RydWN0X3RpbWU9YixhLnRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInRpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKTt2YXIgYT1EYXRlLm5vdygpO3JldHVybiB0aGlzLnBlcmZvcm1hbmNlJiZ0aGlzLnBlcmZvcm1hbmNlLm5vdyYmKGErPXBlcmZvcm1hbmNlLm5vdygpJTEpLFNrLmJ1aWx0aW4uYXNzayQoYS8xZTMsdm9pZCAwKX0pLGEuc2xlZXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2xlZXBcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJkZWxheVxcXCIsXFxcImZsb2F0XFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2subWlzY2V2YWwucHJvbWlzZVRvU3VzcGVuc2lvbihuZXcgUHJvbWlzZShmdW5jdGlvbihiKXtTay5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YihTay5idWlsdGluLm5vbmUubm9uZSQpfSwxZTMqU2suZmZpLnJlbWFwVG9KcyhhKSl9KSl9KSxhLmxvY2FsdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJsb2NhbHRpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSxmcm9tX3NlY29uZHMoYSwhMSl9KSxhLmdtdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnbXRpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSxmcm9tX3NlY29uZHMoYSwhMCl9KTt2YXIgYz1bXFxcIkphblxcXCIsXFxcIkZlYlxcXCIsXFxcIk1hclxcXCIsXFxcIkFwclxcXCIsXFxcIk1heVxcXCIsXFxcIkp1blxcXCIsXFxcIkp1bFxcXCIsXFxcIkF1Z1xcXCIsXFxcIlNlcFxcXCIsXFxcIk9jdFxcXCIsXFxcIk5vdlxcXCIsXFxcIkRlY1xcXCJdLGQ9W1xcXCJNb25cXFwiLFxcXCJUdWVcXFwiLFxcXCJXZWRcXFwiLFxcXCJUaHVcXFwiLFxcXCJGcmlcXFwiLFxcXCJTYXRcXFwiLFxcXCJTdW5cXFwiXTtyZXR1cm4gYS5hc2N0aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoYXNjdGltZV9mKSxhLmN0aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImN0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksYXNjdGltZV9mKGZyb21fc2Vjb25kcyhhKSl9KSxhLm1rdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKG1rdGltZV9mKSxhLnRpbWV6b25lPW5ldyBTay5idWlsdGluLmludF8oNjAqc3RkVGltZXpvbmVPZmZzZXQoKSksYS5hbHR6b25lPW5ldyBTay5idWlsdGluLmludF8oNjAqZnVuY3Rpb24gYWx0VGltZXpvbmVPZmZzZXQoKXt2YXIgYT1NYXRoLm1pbixiPW5ldyBEYXRlKDIwMDIsMCwxKSxjPW5ldyBEYXRlKDIwMDIsNiwxKTtyZXR1cm4gYShiLmdldFRpbWV6b25lT2Zmc2V0KCksYy5nZXRUaW1lem9uZU9mZnNldCgpKX0oKSksYS5kYXlsaWdodD1uZXcgU2suYnVpbHRpbi5pbnRfKGRzdChuZXcgRGF0ZSk/MTowKSxhLnR6bmFtZT1uZXcgU2suYnVpbHRpbi50dXBsZShmdW5jdGlvbiB0aW1lWm9uZU5hbWVzKCl7dmFyIGE9bmV3IERhdGUoMjAwMiwwLDEpLGI9bmV3IERhdGUoMjAwMiw2LDEpO3JldHVybiBkc3QoYSk/W25ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYikpLG5ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYSkpXTpbbmV3IFNrLmJ1aWx0aW4uc3RyKHRpbWVab25lTmFtZShhKSksbmV3IFNrLmJ1aWx0aW4uc3RyKHRpbWVab25lTmFtZShiKSldfSgpKSxhLmFjY2VwdDJkeWVhcj1Tay5idWlsdGluLmFzc2skKDEpLGEuY2xvY2s9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhPTA7cmV0dXJuIGE9dGhpcy5wZXJmb3JtYW5jZSYmdGhpcy5wZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCkvMWUzOm5ldyBEYXRlKCkuZ2V0VGltZSgpLzFlMyxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSl9KSxhLnN0cmZ0aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gc3RyZnRpbWVfZihhLGMpe3ZhciBkO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInN0cmZ0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMiksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmb3JtYXQgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO3JldHVybiBjPyEoYyBpbnN0YW5jZW9mIGIpJiYoYz1uZXcgYihjKSk6Yz1mcm9tX3NlY29uZHMoKSxjaGVja19zdHJ1Y3RfdGltZShjKSxkPVNrLmZmaS5yZW1hcFRvSnMoYSksU2suZmZpLnJlbWFwVG9QeShzdHJmdGltZShkLG5ldyBEYXRlKDFlMypta3RpbWVfZihjKS52KSkpfSksYS50enNldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIHR6c2V0X2YoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0aW1lLnR6c2V0KCkgaXMgbm90IHlldCBpbXBsZW1lbnRlZFxcXCIpfSksYS5zdHJwdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIHN0cnB0aW1lX2YoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzdHJwdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDIpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInN0cmluZ1xcXCIsXFxcInN0cmluZ1xcXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSksdm9pZCAwPT09Yj9iPW5ldyBTay5idWlsdGluLnN0cihcXFwiJWEgJWIgJWQgJUg6JU06JVMgJVlcXFwiKTpTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJmb3JtYXRcXFwiLFxcXCJzdHJpbmdcXFwiLFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpO2xldCBjPWRhdGVfdG9fc3RydWN0X3RpbWUoc3RycHRpbWUoU2suZmZpLnJlbWFwVG9KcyhhKSxTay5mZmkucmVtYXBUb0pzKGIpLCEwKSk7cmV0dXJuIGMudls4XT1uZXcgU2suYnVpbHRpbi5pbnRfKC0xKSxjfSksYX07XCIsXCJzcmMvbGliL3RpbWVpdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGltZWl0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdG9haWZmLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0b2FpZmYgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90b2tlbi5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e19fZmlsZV9fOlxcXCIvc3JjL2xpYi90b2tlbi5weVxcXCJ9O2NvbnN0IGI9W107Zm9yKHRva2VuIGluIFNrLnRva2VuLnRva19uYW1lKXtjb25zdCBjPVNrLnRva2VuLnRva19uYW1lW3Rva2VuXS5zbGljZSgyKSxkPXBhcnNlSW50KHRva2VuLDEwKTtiLnB1c2goU2suZmZpLnJlbWFwVG9QeShkKSksYi5wdXNoKFNrLmZmaS5yZW1hcFRvUHkoYykpLGFbY109U2suZmZpLnJlbWFwVG9QeShkKX1yZXR1cm4gYS50b2tfbmFtZT1uZXcgU2suYnVpbHRpbi5kaWN0KGIpLGEuSVNURVJNSU5BTD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJJU1RFUk1JTkFMXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2sudG9rZW4uSVNURVJNSU5BTChTay5mZmkucmVtYXBUb0pzKGEpKX0pLGEuSVNOT05URVJNSU5BTD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJJU05PTlRFUk1JTkFMXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2sudG9rZW4uSVNOT05URVJNSU5BTChTay5mZmkucmVtYXBUb0pzKGEpKX0pLGEuSVNFT0Y9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiSVNFT0ZcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay50b2tlbi5JU0VPRihTay5mZmkucmVtYXBUb0pzKGEpKX0pLGF9O1wiLFwic3JjL2xpYi90b2tlbml6ZS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e3Rva2VuaXplOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwidG9rZW5pemVcXFwiLDEsMSksU2suYnVpbHRpbi5jaGVja0Z1bmN0aW9uKGEpO2NvbnN0IGI9W107cmV0dXJuIFNrLl90b2tlbml6ZShcXFwiPHN0ZGluPlxcXCIsZnVuY3Rpb24ganNSZWFkbGluZSgpe2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEpO3JldHVybiBTay5mZmkucmVtYXBUb0pzKGIpfSxcXFwiVVRGLThcXFwiLGZ1bmN0aW9uIHJlY2VpdmVUb2tlbihhKXtiLnB1c2gobmV3IFNrLmJ1aWx0aW4udHVwbGUoW1NrLmZmaS5yZW1hcFRvUHkoYS50eXBlKSxTay5mZmkucmVtYXBUb1B5KGEuc3RyaW5nKSxuZXcgU2suYnVpbHRpbi50dXBsZShbU2suZmZpLnJlbWFwVG9QeShhLnN0YXJ0WzBdKSxTay5mZmkucmVtYXBUb1B5KGEuc3RhcnRbMV0pXSksbmV3IFNrLmJ1aWx0aW4udHVwbGUoW1NrLmZmaS5yZW1hcFRvUHkoYS5lbmRbMF0pLFNrLmZmaS5yZW1hcFRvUHkoYS5lbmRbMV0pXSksU2suZmZpLnJlbWFwVG9QeShhLmxpbmUpXSkpfSksbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0pfTtyZXR1cm4gYX07XCIsXCJzcmMvbGliL3RyYWNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0cmFjZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RyYWNlYmFjay5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHJhY2ViYWNrIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdHR5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0dHkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90dXJ0bGUuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe1xcXCJ1c2Ugc3RyaWN0XFxcIjt2YXIgZT1mdW5jdGlvbiBnZXRDb25maWd1cmVkVGFyZ2V0KCl7dmFyIGUsdDtmb3IoZT1Tay5UdXJ0bGVHcmFwaGljcyYmU2suVHVydGxlR3JhcGhpY3MudGFyZ2V0fHxcXFwidHVydGxlXFxcIix0PVxcXCJzdHJpbmdcXFwiPT10eXBlb2YgZT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKTplO3QuZmlyc3RDaGlsZDspdC5yZW1vdmVDaGlsZCh0LmZpcnN0Q2hpbGQpO3JldHVybiB0fSgpO3JldHVybiBlLnR1cnRsZUluc3RhbmNlP2UudHVydGxlSW5zdGFuY2UucmVzZXQoKTplLnR1cnRsZUluc3RhbmNlPWZ1bmN0aW9uIGdlbmVyYXRlVHVydGxlTW9kdWxlKGUpe3ZhciB0PU1hdGgucm91bmQscj1NYXRoLm1heCxuPU1hdGguc3FydCxhPU1hdGgubWluLHM9TWF0aC5hYnMsbz1NYXRoLlBJLGQ9TWF0aC5hdGFuMixfPU1hdGguc2luLGM9TWF0aC5jb3M7ZnVuY3Rpb24gZ2V0QXNzZXQoZSl7dmFyIHQ9Zy5hc3NldHMscj1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgdD90KGUpOnRbZV07cmV0dXJuXFxcInN0cmluZ1xcXCI9PXR5cGVvZiByP25ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7dmFyIGE9bmV3IEltYWdlO2Eub25sb2FkPWZ1bmN0aW9uKCl7Zy5hc3NldHNbZV09dGhpcyx0KGEpfSxhLm9uZXJyb3I9ZnVuY3Rpb24oKXtuKG5ldyBFcnJvcihcXFwiTWlzc2luZyBhc3NldDogXFxcIityKSl9LGEuc3JjPXJ9KTpuZXcgSW5zdGFudFByb21pc2Uodm9pZCAwLHIpfWZ1bmN0aW9uIEluc3RhbnRQcm9taXNlKGUsdCl7dGhpcy5sYXN0UmVzdWx0PXQsdGhpcy5sYXN0RXJyb3I9ZX1mdW5jdGlvbiBGcmFtZU1hbmFnZXIoKXt0aGlzLnJlc2V0KCl9ZnVuY3Rpb24gZ2V0RnJhbWVNYW5hZ2VyKCl7cmV0dXJuIEF8fChBPW5ldyBGcmFtZU1hbmFnZXIpLEF9ZnVuY3Rpb24gTW91c2VIYW5kbGVyKCl7dmFyIHQ9dGhpcztmb3IodmFyIHIgaW4gdGhpcy5fdGFyZ2V0PWdldFRhcmdldCgpLHRoaXMuX21hbmFnZXJzPXt9LHRoaXMuX2hhbmRsZXJzPXttb3VzZWRvd246ZnVuY3Rpb24ocil7dC5vbkV2ZW50KFxcXCJtb3VzZWRvd25cXFwiLHIpfSxtb3VzZXVwOmZ1bmN0aW9uKHIpe3Qub25FdmVudChcXFwibW91c2V1cFxcXCIscil9LG1vdXNlbW92ZTpmdW5jdGlvbihyKXt0Lm9uRXZlbnQoXFxcIm1vdXNlbW92ZVxcXCIscil9fSx0aGlzLl9oYW5kbGVycyl0aGlzLl90YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihyLHRoaXMuX2hhbmRsZXJzW3JdKX1mdW5jdGlvbiBFdmVudE1hbmFnZXIoZSx0KXt0aGlzLl90eXBlPWUsdGhpcy5fdGFyZ2V0PXQsdGhpcy5faGFuZGxlcnM9dm9pZCAwLGdldE1vdXNlSGFuZGxlcigpLmFkZE1hbmFnZXIoZSx0aGlzKX1mdW5jdGlvbiBUdXJ0bGUoZSl7aWYoZ2V0RnJhbWVNYW5hZ2VyKCkuYWRkVHVydGxlKHRoaXMpLHRoaXMuX3NjcmVlbj1nZXRTY3JlZW4oKSx0aGlzLl9tYW5hZ2Vycz17fSx0aGlzLl9zaGFwZT1lLnYsIXYuaGFzT3duUHJvcGVydHkodGhpcy5fc2hhcGUpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlNoYXBlOidcXFwiK3RoaXMuX3NoYXBlK1xcXCInIG5vdCBpbiBkZWZhdWx0IHNoYXBlLCBwbGVhc2UgY2hlY2sgc2hhcGUgYWdhaW4hXFxcIik7dGhpcy5yZXNldCgpfWZ1bmN0aW9uIFNjcmVlbigpe3ZhciBlLHQ7dGhpcy5fZnJhbWVzPTEsdGhpcy5fZGVsYXk9dm9pZCAwLHRoaXMuX2JnY29sb3I9XFxcIm5vbmVcXFwiLHRoaXMuX21vZGU9XFxcInN0YW5kYXJkXFxcIix0aGlzLl9tYW5hZ2Vycz17fSx0aGlzLl9rZXlMb2dnZXI9e30sZT0oZy53b3JsZFdpZHRofHxnLndpZHRofHxnZXRXaWR0aCgpKS8yLHQ9KGcud29ybGRIZWlnaHR8fGcuaGVpZ2h0fHxnZXRIZWlnaHQoKSkvMix0aGlzLnNldFVwV29ybGQoLWUsLXQsZSx0KX1mdW5jdGlvbiBlbnN1cmVBbm9ueW1vdXMoKXtyZXR1cm4gZnx8KGY9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHkuVHVydGxlKSksZi5pbnN0YW5jZX1mdW5jdGlvbiBnZXRUYXJnZXQoKXtyZXR1cm4gZX1mdW5jdGlvbiBnZXRTY3JlZW4oKXtyZXR1cm4gcHx8KHA9bmV3IFNjcmVlbikscH1mdW5jdGlvbiBnZXRNb3VzZUhhbmRsZXIoKXtyZXR1cm4gaHx8KGg9bmV3IE1vdXNlSGFuZGxlciksaH1mdW5jdGlvbiBnZXRXaWR0aCgpe3JldHVybiAwfChwJiZwLl93aWR0aHx8Zy53aWR0aHx8Z2V0VGFyZ2V0KCkuY2xpZW50V2lkdGh8fFQud2lkdGgpfWZ1bmN0aW9uIGdldEhlaWdodCgpe3JldHVybiAwfChwJiZwLl9oZWlnaHR8fGcuaGVpZ2h0fHxnZXRUYXJnZXQoKS5jbGllbnRIZWlnaHR8fFQuaGVpZ2h0KX1mdW5jdGlvbiBjcmVhdGVMYXllcihlLHQpe3ZhciByLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIiksYT1nZXRXaWR0aCgpLHM9Z2V0SGVpZ2h0KCksbD1nZXRUYXJnZXQoKS5maXJzdENoaWxkPy1zK1xcXCJweFxcXCI6XFxcIjBcXFwiO3JldHVybiBuLndpZHRoPWEsbi5oZWlnaHQ9cyxuLnN0eWxlLnBvc2l0aW9uPVxcXCJyZWxhdGl2ZVxcXCIsbi5zdHlsZS5kaXNwbGF5PVxcXCJibG9ja1xcXCIsbi5zdHlsZS5zZXRQcm9wZXJ0eShcXFwibWFyZ2luLXRvcFxcXCIsbCksbi5zdHlsZS5zZXRQcm9wZXJ0eShcXFwiei1pbmRleFxcXCIsZSksdCYmKG4uc3R5bGUuZGlzcGxheT1cXFwibm9uZVxcXCIpLGdldFRhcmdldCgpLmFwcGVuZENoaWxkKG4pLHI9bi5nZXRDb250ZXh0KFxcXCIyZFxcXCIpLHIubGluZUNhcD1cXFwicm91bmRcXFwiLHIubGluZUpvaW49XFxcInJvdW5kXFxcIixhcHBseVdvcmxkKGdldFNjcmVlbigpLHIpLHJ9ZnVuY3Rpb24gY2FuY2VsQW5pbWF0aW9uRnJhbWUoKXt1JiYoKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lKSh1KSx1PXZvaWQgMCksbSYmKHdpbmRvdy5jbGVhclRpbWVvdXQobSksbT12b2lkIDApfWZ1bmN0aW9uIGFwcGx5V29ybGQoZSx0KXt2YXIgcj1lLmxseCxuPWUubGx5LGE9ZS51cngscz1lLnVyeSxsPWUueFNjYWxlLGk9ZS55U2NhbGU7dCYmKGNsZWFyTGF5ZXIodCksdC5yZXN0b3JlKCksdC5zYXZlKCksdC5zY2FsZSgxL2wsMS9pKSx0LnRyYW5zbGF0ZSgtciwtcykpfWZ1bmN0aW9uIHB1c2hVbmRvKGUpe3ZhciB0LHIsbjtpZihnLmFsbG93VW5kbyYmZS5fYnVmZmVyU2l6ZSl7Zm9yKGUuX3VuZG9CdWZmZXJ8fChlLl91bmRvQnVmZmVyPVtdKTtlLl91bmRvQnVmZmVyLmxlbmd0aD5lLl9idWZmZXJTaXplOyllLl91bmRvQnVmZmVyLnNoaWZ0KCk7Zm9yKHI9e30sdD1bXFxcInhcXFwiLFxcXCJ5XFxcIixcXFwiYW5nbGVcXFwiLFxcXCJyYWRpYW5zXFxcIixcXFwiY29sb3JcXFwiLFxcXCJmaWxsXFxcIixcXFwiZG93blxcXCIsXFxcImZpbGxpbmdcXFwiLFxcXCJzaG93blxcXCIsXFxcInNoYXBlXFxcIixcXFwic2l6ZVxcXCJdLG49MDtuPHQubGVuZ3RoO24rKylyW3Rbbl1dPWVbXFxcIl9cXFwiK3Rbbl1dO3JldHVybiBlLl91bmRvQnVmZmVyLnB1c2gociksZS5hZGRVcGRhdGUoZnVuY3Rpb24oKXtyLmZpbGxCdWZmZXI9dGhpcy5maWxsQnVmZmVyP3RoaXMuZmlsbEJ1ZmZlci5zbGljZSgpOnZvaWQgMCxlLl9wYXBlciYmZS5fcGFwZXIuY2FudmFzJiYoci5pbWFnZT1lLl9wYXBlci5jYW52YXMudG9EYXRhVVJMKCkpfSwhMSl9fWZ1bmN0aW9uIHBvcFVuZG8oZSl7dmFyIHQ7aWYoZS5fYnVmZmVyU2l6ZSYmZS5fdW5kb0J1ZmZlciYmKHQ9ZS5fdW5kb0J1ZmZlci5wb3AoKSwhIXQpKXtmb3IodmFyIHIgaW4gdClcXFwiaW1hZ2VcXFwiIT1yJiZcXFwiZmlsbEJ1ZmZlclxcXCIhPT1yJiYoZVtcXFwiX1xcXCIrcl09dFtyXSk7cmV0dXJuIGUuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7dmFyIGU7dC5pbWFnZSYmKEwuc3JjPXQuaW1hZ2UsZT1MKSxjbGVhckxheWVyKHRoaXMuY29udGV4dCgpLCExLEwpLGRlbGV0ZSB0LmltYWdlfSwhMCx0KX19ZnVuY3Rpb24gcmVtb3ZlTGF5ZXIoZSl7ZSYmZS5jYW52YXMmJmUuY2FudmFzLnBhcmVudE5vZGUmJmUuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZS5jYW52YXMpfWZ1bmN0aW9uIGNsZWFyTGF5ZXIoZSx0LHIpe2UmJihlLnNhdmUoKSxlLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksdD8oZS5maWxsU3R5bGU9dCxlLmZpbGxSZWN0KDAsMCxlLmNhbnZhcy53aWR0aCxlLmNhbnZhcy5oZWlnaHQpKTplLmNsZWFyUmVjdCgwLDAsZS5jYW52YXMud2lkdGgsZS5jYW52YXMuaGVpZ2h0KSxyJiZlLmRyYXdJbWFnZShyLDAsMCksZS5yZXN0b3JlKCkpfWZ1bmN0aW9uIGRyYXdUdXJ0bGUoZSx0KXt2YXIgcixuLGEscz12W2Uuc2hhcGVdLGw9Z2V0U2NyZWVuKCksdT1nZXRXaWR0aCgpLG09Z2V0SGVpZ2h0KCkscD1sLnhTY2FsZSxnPWwueVNjYWxlO2lmKHQpe2lmKHI9YyhlLnJhZGlhbnMpL3Asbj1fKGUucmFkaWFucykvZyxhPWQobixyKS1vLzIsdC5zYXZlKCksdC50cmFuc2xhdGUoZS54LGUueSksdC5zY2FsZShwLGcpLHMubm9kZU5hbWUpe3ZhciBmPXMubmF0dXJhbFdpZHRoLGg9cy5uYXR1cmFsSGVpZ2h0O3QuZHJhd0ltYWdlKHMsMCwwLGYsaCwtZi8yLC1oLzIsZixoKX1lbHNle3Qucm90YXRlKGEpLHQuYmVnaW5QYXRoKCksdC5saW5lV2lkdGg9MSx0LnN0cm9rZVN0eWxlPWUuY29sb3IsdC5maWxsU3R5bGU9ZS5maWxsLHQubW92ZVRvKC1zWzBdWzBdLHNbMF1bMV0pO2Zvcih2YXIgJD0xOyQ8cy5sZW5ndGg7JCsrKXQubGluZVRvKC1zWyRdWzBdLHNbJF1bMV0pO3QuY2xvc2VQYXRoKCksdC5maWxsKCksdC5zdHJva2UoKX10LnJlc3RvcmUoKX19ZnVuY3Rpb24gZHJhd0RvdChlLHQpe3ZhciByPXRoaXMuY29udGV4dCgpLG49Z2V0U2NyZWVuKCksbD1uLnhTY2FsZSxpPW4ueVNjYWxlO3ImJihyLmJlZ2luUGF0aCgpLHIubW92ZVRvKHRoaXMueCx0aGlzLnkpLGUqPWEocyhsKSxzKGkpKSxyLmFyYyh0aGlzLngsdGhpcy55LGUvMiwwLFR1cnRsZS5SQURJQU5TKSxyLmNsb3NlUGF0aCgpLHIuZmlsbFN0eWxlPXR8fHRoaXMuY29sb3Isci5maWxsKCkpfWZ1bmN0aW9uIG1lYXN1cmVUZXh0KGUsdCl7cmV0dXJuIHQmJihTLmZvbnQ9dCksUy5tZWFzdXJlVGV4dChlKS53aWR0aH1mdW5jdGlvbiBkcmF3VGV4dChlLHQscil7dmFyIG49dGhpcy5jb250ZXh0KCk7biYmKG4uc2F2ZSgpLHImJihuLmZvbnQ9ciksdCYmdC5tYXRjaCgvXihsZWZ0fHJpZ2h0fGNlbnRlcikkLykmJihuLnRleHRBbGlnbj10KSxuLnNjYWxlKDEsLTEpLG4uZmlsbFN0eWxlPXRoaXMuZmlsbCxuLmZpbGxUZXh0KGUsdGhpcy54LC10aGlzLnkpLG4ucmVzdG9yZSgpKX1mdW5jdGlvbiBkcmF3TGluZShlLHQpe3ZhciByPXRoaXMuY29udGV4dCgpO3ImJih0JiYoci5iZWdpblBhdGgoKSxyLm1vdmVUbyh0aGlzLngsdGhpcy55KSksci5saW5lV2lkdGg9dGhpcy5zaXplKmdldFNjcmVlbigpLmxpbmVTY2FsZSxyLnN0cm9rZVN0eWxlPXRoaXMuY29sb3Isci5saW5lVG8oZS54LGUueSksci5zdHJva2UoKSl9ZnVuY3Rpb24gZHJhd0ZpbGwoKXt2YXIgZSx0PXRoaXMuY29udGV4dCgpLHI9dGhpcy5maWxsQnVmZmVyO2lmKHQmJnImJnIubGVuZ3RoKXtmb3IodC5zYXZlKCksdC5iZWdpblBhdGgoKSx0Lm1vdmVUbyhyWzBdLngsclswXS55KSxlPTE7ZTxyLmxlbmd0aDtlKyspdC5saW5lVG8ocltlXS54LHJbZV0ueSk7Zm9yKHQuY2xvc2VQYXRoKCksdC5maWxsU3R5bGU9dGhpcy5maWxsLHQuZmlsbCgpLGU9MTtlPHIubGVuZ3RoO2UrKylyW2VdLnN0cm9rZSYmKHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8ocltlLTFdLngscltlLTFdLnkpLHQubGluZVdpZHRoPXJbZV0uc2l6ZSpnZXRTY3JlZW4oKS5saW5lU2NhbGUsdC5zdHJva2VTdHlsZT1yW2VdLmNvbG9yLHQubGluZVRvKHJbZV0ueCxyW2VdLnkpLHQuc3Ryb2tlKCkpO3QucmVzdG9yZSgpfX1mdW5jdGlvbiBwYXJ0aWFsVHJhbnNsYXRlKGUsdCxyLG4sYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYWRkVXBkYXRlKGZ1bmN0aW9uKGUpe3RoaXMuZG93biYmZHJhd0xpbmUuY2FsbCh0aGlzLGUsbil9LGEse3g6dCx5OnJ9LG4pfX1mdW5jdGlvbiB0cmFuc2xhdGUoZSxhLGwsbyxkLF8sYyl7dmFyIHUsbT1lLl9jb21wdXRlZF9zcGVlZCxwPWdldFNjcmVlbigpLGc9cyhwLnhTY2FsZSksZj1zKHAueVNjYWxlKSxoPWEsJD1sLHc9bihvKm8qZytkKmQqZiksYj1tP3QocigxLHcvbSkpOjEsdj1nZXRGcmFtZU1hbmFnZXIoKS53aWxsUmVuZGVyTmV4dCgpP1Byb21pc2UucmVzb2x2ZSgpOm5ldyBJbnN0YW50UHJvbWlzZTtmb3IoZS5hZGRVcGRhdGUoZnVuY3Rpb24oKXt0aGlzLmZpbGxpbmcmJnRoaXMuZmlsbEJ1ZmZlci5wdXNoKHt4OnRoaXMueCx5OnRoaXMueSxzdHJva2U6dGhpcy5kb3duLGNvbG9yOnRoaXMuY29sb3Isc2l6ZTp0aGlzLnNpemV9KX0sITEpLHU9MDt1PGI7dSsrKWg9YStvL2IqKHUrMSksJD1sK2QvYioodSsxKSx2PXYudGhlbihwYXJ0aWFsVHJhbnNsYXRlKGUsaCwkLF8sbXx8IWMpKSxfPSExO3JldHVybiB2LnRoZW4oZnVuY3Rpb24oKXtyZXR1cm5bYStvLGwrZF19KX1mdW5jdGlvbiBwYXJ0aWFsUm90YXRlKGUsdCxyLG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFkZFVwZGF0ZSh2b2lkIDAsbix7YW5nbGU6dCxyYWRpYW5zOnJ9KX19ZnVuY3Rpb24gcm90YXRlKGUsbixhLGwpe3ZhciBvLGQ9ZS5fY29tcHV0ZWRfc3BlZWQsXz0zNjAqKGEvZS5fZnVsbENpcmNsZSksYz1kP3QocigxLHMoXykvZCkpOjEsdT17fSxtPWdldEZyYW1lTWFuYWdlcigpLndpbGxSZW5kZXJOZXh0KCk/UHJvbWlzZS5yZXNvbHZlKCk6bmV3IEluc3RhbnRQcm9taXNlO2ZvcihvPTA7bzxjO28rKyljYWxjdWxhdGVIZWFkaW5nKGUsbithL2MqKG8rMSksdSksbT1tLnRoZW4ocGFydGlhbFJvdGF0ZShlLHUuYW5nbGUsdS5yYWRpYW5zLGR8fCFsKSk7cmV0dXJuIG0udGhlbihmdW5jdGlvbigpe3JldHVybiBjYWxjdWxhdGVIZWFkaW5nKGUsbithKX0pfWZ1bmN0aW9uIGdldENvb3JkaW5hdGVzKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PWUmJihlLnl8fGUuX3l8fGVbMV0pfHwwLGU9ZSYmKGUueHx8ZS5feHx8ZVswXSl8fDApLHt4OmUseTp0fX1mdW5jdGlvbiBoZXhUb1JHQihlKXt2YXIgdCxyLG47cmV0dXJuKHQ9L15yZ2JhP1xcXFwoKFxcXFxkKyksKFxcXFxkKyksKFxcXFxkKykoPzosKFsuXFxcXGRdKykpP1xcXFwpJC8uZXhlYyhlKSk/KG49W3BhcnNlSW50KHRbMV0pLHBhcnNlSW50KHRbMl0pLHBhcnNlSW50KHRbM10pXSx0WzRdJiZuLnB1c2gocGFyc2VGbG9hdCh0WzRdKSkpOi9eIz9bYS1mXFxcXGRdezN9fFthLWZcXFxcZF17Nn0kL2kuZXhlYyhlKT8oND09PWUubGVuZ3RoJiYoZT1lLnJlcGxhY2UoL14jPyhbYS1mXFxcXGRdKShbYS1mXFxcXGRdKShbYS1mXFxcXGRdKSQvaSxmdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdCt0K3IrcituK259KSkscj0vXiM/KFthLWZcXFxcZF17Mn0pKFthLWZcXFxcZF17Mn0pKFthLWZcXFxcZF17Mn0pJC9pLmV4ZWMoZSksbj1bcGFyc2VJbnQoclsxXSwxNikscGFyc2VJbnQoclsyXSwxNikscGFyc2VJbnQoclszXSwxNildKTpuPWUsbn1mdW5jdGlvbiBjcmVhdGVDb2xvcihlLHQsbixzLGwpe3ZhciBvO2lmKHZvaWQgMCE9PW4mJih0PVt0LG4scyxsXSksdC5jb25zdHJ1Y3Rvcj09PUFycmF5JiZ0Lmxlbmd0aCl7aWYoMjU1PT09ZSl7Zm9yKG89MDszPm87bysrKWlmKFxcXCJudW1iZXJcXFwiPT10eXBlb2YgdFtvXSl0W29dPXIoMCxhKDI1NSxwYXJzZUludCh0W29dKSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIGNvbG9yIHNlcXVlbmNlXFxcIik7fWVsc2UgZm9yKG89MDszPm87bysrKWlmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgdFtvXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJiYWQgY29sb3Igc2VxdWVuY2VcXFwiKTtlbHNlIGlmKDE+PXRbb10pdFtvXT1yKDAsYSgyNTUscGFyc2VJbnQoMjU1KnRbb10pKSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJiYWQgY29sb3Igc2VxdWVuY2VcXFwiKTtcXFwibnVtYmVyXFxcIj09dHlwZW9mIHRbb10/KHRbM109cigwLGEoMSx0W29dKSksdD1cXFwicmdiYShcXFwiK3Quam9pbihcXFwiLFxcXCIpK1xcXCIpXFxcIik6dD1cXFwicmdiKFxcXCIrdC5zbGljZSgwLDMpLmpvaW4oXFxcIixcXFwiKStcXFwiKVxcXCJ9ZWxzZSBpZihcXFwic3RyaW5nXFxcIj09dHlwZW9mIHQmJiF0Lm1hdGNoKC9cXFxccyp1cmxcXFxccypcXFxcKC9pKSl0PXQucmVwbGFjZSgvXFxcXHMrL2csXFxcIlxcXCIpO2Vsc2UgcmV0dXJuXFxcImJsYWNrXFxcIjtyZXR1cm4gdH1mdW5jdGlvbiBjYWxjdWxhdGVIZWFkaW5nKGUsdCxyKXt2YXIgbj1lLl9hbmdsZXx8MCxhPWUuX3JhZGlhbnN8fDA7cmV0dXJuIHJ8fChyPXt9KSxcXFwibnVtYmVyXFxcIj09dHlwZW9mIHQmJihlLl9pc1JhZGlhbnM/bj1hPXQlVHVydGxlLlJBRElBTlM6ZS5fZnVsbENpcmNsZT8obj10JWUuX2Z1bGxDaXJjbGUsYT1uL2UuX2Z1bGxDaXJjbGUqVHVydGxlLlJBRElBTlMpOm49YT0wLDA+biYmKG4rPWUuX2Z1bGxDaXJjbGUsYSs9VHVydGxlLlJBRElBTlMpKSxyLmFuZ2xlPW4sci5yYWRpYW5zPWEscn1mdW5jdGlvbiBweXRob25Ub0phdmFzY3JpcHRGdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksbj1yLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShlKX0pO3JldHVyblxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgdCYmbi51bnNoaWZ0KHQpLFNrLm1pc2NldmFsLmFwcGx5QXN5bmModm9pZCAwLGUsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbikuY2F0Y2goU2sudW5jYXVnaHRFeGNlcHRpb24pfX1mdW5jdGlvbiBhZGRNb2R1bGVNZXRob2QoZSx0LHIsbil7dmFyIGEscz1yLnJlcGxhY2UoL15cXFxcJC8sXFxcIlxcXCIpLGw9cy5yZXBsYWNlKC9fXFxcXCRbYS16XStcXFxcJCQvaSxcXFwiXFxcIiksbz1lLnByb3RvdHlwZVtyXS5sZW5ndGgsZD1lLnByb3RvdHlwZVtyXS5taW5BcmdzLF89ZS5wcm90b3R5cGVbcl0uY29fdmFybmFtZXN8fFtdLGM9ZS5wcm90b3R5cGVbcl0ucmV0dXJuVHlwZSx1PWUucHJvdG90eXBlW3JdLmlzU2s7dm9pZCAwPT09ZCYmKGQ9byksYT1mdW5jdGlvbigpe3ZhciBlLHQsYSxzLF8sbT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkscD1uP24oKTptLnNoaWZ0KCkuaW5zdGFuY2U7aWYobS5sZW5ndGg8ZHx8bS5sZW5ndGg+byl0aHJvdyBfPWQ9PT1vP1xcXCJleGFjdGx5IFxcXCIrbzpcXFwiYmV0d2VlbiBcXFwiK2QrXFxcIiBhbmQgXFxcIitvLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihsK1xcXCIoKSB0YWtlcyBcXFwiK18rXFxcIiBwb3NpdGlvbmFsIGFyZ3VtZW50KHMpIChcXFwiK20ubGVuZ3RoK1xcXCIgZ2l2ZW4pXFxcIik7Zm9yKGU9bS5sZW5ndGg7MDw9LS1lOyl2b2lkIDAhPT1tW2VdJiYobVtlXT1tW2VdaW5zdGFuY2VvZiBTay5idWlsdGluLmZ1bmM/cHl0aG9uVG9KYXZhc2NyaXB0RnVuY3Rpb24obVtlXSk6bVtlXWluc3RhbmNlb2YgU2suYnVpbHRpbi5tZXRob2Q/cHl0aG9uVG9KYXZhc2NyaXB0RnVuY3Rpb24obVtlXS5pbV9mdW5jLG1bZV0uaW1fc2VsZik6bVtlXSYmbVtlXS4kZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCYmbVtlXS5pbnN0YW5jZT9tW2VdLmluc3RhbmNlOlNrLmZmaS5yZW1hcFRvSnMobVtlXSkpO3ZhciBnPW0uc2xpY2UoMCk7Zm9yKG09W10sZT1nLmxlbmd0aDswPD1lOy0tZSludWxsIT09Z1tlXSYmKG1bZV09Z1tlXSk7dHJ5e3Q9cFtyXS5hcHBseShwLG0pfWNhdGNoKHQpe3Rocm93IHdpbmRvdyYmd2luZG93LmNvbnNvbGUmJih3aW5kb3cuY29uc29sZS5sb2coXFxcIndyYXBwZWQgbWV0aG9kIGZhaWxlZFxcXCIpLHdpbmRvdy5jb25zb2xlLmxvZyh0LnN0YWNrKSksdH1yZXR1cm4gdCBpbnN0YW5jZW9mIEluc3RhbnRQcm9taXNlJiYodD10Lmxhc3RSZXN1bHQpLHQgaW5zdGFuY2VvZiBQcm9taXNlPyh0PXQuY2F0Y2goZnVuY3Rpb24odCl7dGhyb3cgd2luZG93JiZ3aW5kb3cuY29uc29sZSYmKHdpbmRvdy5jb25zb2xlLmxvZyhcXFwicHJvbWlzZSBmYWlsZWRcXFwiKSx3aW5kb3cuY29uc29sZS5sb2codC5zdGFjaykpLHR9KSxhPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uLGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXM/U2suYnVpbHRpbi5ub25lLm5vbmUkOlNrLmZmaS5yZW1hcFRvUHkocyl9LGEuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTp0LnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIHM9ZSxlfSl9LGEpOnZvaWQgMD09PXQ/U2suYnVpbHRpbi5ub25lLm5vbmUkOnU/dDpcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgYz9jKHQpOlNrLmZmaS5yZW1hcFRvUHkodCl9LGEuY29fbmFtZT1uZXcgU2suYnVpbHRpbi5zdHIobCksYS5jb192YXJuYW1lcz1fLnNsaWNlKCksYS4kZGVmYXVsdHM9W107Zm9yKHZhciBtPWQ7bTxfLmxlbmd0aDttKyspYS4kZGVmYXVsdHMucHVzaChTay5idWlsdGluLm5vbmUubm9uZSQpO258fGEuY29fdmFybmFtZXMudW5zaGlmdChcXFwic2VsZlxcXCIpLHRbc109bmV3IFNrLmJ1aWx0aW4uZnVuYyhhKX1mdW5jdGlvbiBpbml0VHVydGxlKGUsdCl7U2suYnVpbHRpbi5weUNoZWNrQXJncyhcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cywyLDMsITEsITEpLGUuaW5zdGFuY2U9bmV3IFR1cnRsZSh0KSxlLmluc3RhbmNlLnNrSW5zdGFuY2U9ZX1mdW5jdGlvbiBmb2N1c1R1cnRsZShlKXtyZXR1cm4gdm9pZCAwIT09ZSYmKHc9ISFlLHc/Z2V0VGFyZ2V0KCkuZm9jdXMoKTpnZXRUYXJnZXQoKS5ibHVyKCkpLHd9ZnVuY3Rpb24gcmVzZXRUdXJ0bGUoKXtmb3IoY2FuY2VsQW5pbWF0aW9uRnJhbWUoKSxnZXRTY3JlZW4oKS5yZXNldCgpLGdldEZyYW1lTWFuYWdlcigpLnJlc2V0KCk7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7aCYmaC5yZXNldCgpLCQ9MCxwPXZvaWQgMCxmPXZvaWQgMCxoPXZvaWQgMCxrPTB9ZnVuY3Rpb24gc3RvcFR1cnRsZSgpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKCksaCYmaC5yZXNldCgpLCQ9MCxwPXZvaWQgMCxmPXZvaWQgMCxoPXZvaWQgMCxrPTB9dmFyIHUsbSxwLGcsZixoLHk9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwidHVydGxlXFxcIil9LCQ9MCx3PSEwLGI9MWUzLzMwLHY9e30saz0wLHg9e30sVD17dGFyZ2V0OlxcXCJ0dXJ0bGVcXFwiLHdpZHRoOjQwMCxoZWlnaHQ6NDAwLHdvcmxkV2lkdGg6MCx3b3JsZEhlaWdodDowLGFuaW1hdGU6ITAsYnVmZmVyU2l6ZTowLGFsbG93VW5kbzohMCxhc3NldHM6e319O2UuaGFzQXR0cmlidXRlKFxcXCJ0YWJpbmRleFxcXCIpfHxlLnNldEF0dHJpYnV0ZShcXFwidGFiaW5kZXhcXFwiLDApLHguRkxPQVQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhlKX0seC5DT0xPUj1mdW5jdGlvbihlKXtpZihcXFwic3RyaW5nXFxcIj09dHlwZW9mIGUpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlKTtmb3IodmFyIHQ9MDszPnQ7dCsrKWVbdF09U2suYnVpbHRpbi5hc3NrJChlW3RdKTtyZXR1cm4gND09PWUubGVuZ3RoJiYoZVszXT1uZXcgU2suYnVpbHRpbi5mbG9hdF8oZVszXSkpLG5ldyBTay5idWlsdGluLnR1cGxlKGUpfSx4LlRVUlRMRV9MSVNUPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxyPTA7cjxlLmxlbmd0aDtyKyspdC5wdXNoKGVbcl0uc2tJbnN0YW5jZSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKHQpfSx2LmFycm93PVtbLTEwLDBdLFsxMCwwXSxbMCwxMF1dLHYuc3F1YXJlPVtbMTAsLTEwXSxbMTAsMTBdLFstMTAsMTBdLFstMTAsLTEwXV0sdi50cmlhbmdsZT1bWzEwLC01Ljc3XSxbMCwxMS41NV0sWy0xMCwtNS43N11dLHYuY2xhc3NpYz1bWzAsMF0sWy01LC05XSxbMCwtN10sWzUsLTldXSx2LnR1cnRsZT1bWzAsMTZdLFstMiwxNF0sWy0xLDEwXSxbLTQsN10sWy03LDldLFstOSw4XSxbLTYsNV0sWy03LDFdLFstNSwtM10sWy04LC02XSxbLTYsLThdLFstNCwtNV0sWzAsLTddLFs0LC01XSxbNiwtOF0sWzgsLTZdLFs1LC0zXSxbNywxXSxbNiw1XSxbOSw4XSxbNyw5XSxbNCw3XSxbMSwxMF0sWzIsMTRdXSx2LmNpcmNsZT1bWzEwLDBdLFs5LjUxLDMuMDldLFs4LjA5LDUuODhdLFs1Ljg4LDguMDldLFszLjA5LDkuNTFdLFswLDEwXSxbLTMuMDksOS41MV0sWy01Ljg4LDguMDldLFstOC4wOSw1Ljg4XSxbLTkuNTEsMy4wOV0sWy0xMCwwXSxbLTkuNTEsLTMuMDldLFstOC4wOSwtNS44OF0sWy01Ljg4LC04LjA5XSxbLTMuMDksLTkuNTFdLFstMCwtMTBdLFszLjA5LC05LjUxXSxbNS44OCwtOC4wOV0sWzguMDksLTUuODhdLFs5LjUxLC0zLjA5XV0sZz1mdW5jdGlvbigpe2Zvcih2YXIgZSBpbiBTay5UdXJ0bGVHcmFwaGljc3x8KFNrLlR1cnRsZUdyYXBoaWNzPXt9KSxUKVNrLlR1cnRsZUdyYXBoaWNzLmhhc093blByb3BlcnR5KGUpfHwoU2suVHVydGxlR3JhcGhpY3NbZV09VFtlXSk7cmV0dXJuIFNrLlR1cnRsZUdyYXBoaWNzfSgpLEluc3RhbnRQcm9taXNlLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKGUpe2lmKHRoaXMubGFzdEVycm9yKXJldHVybiB0aGlzO3RyeXt0aGlzLmxhc3RSZXN1bHQ9ZSh0aGlzLmxhc3RSZXN1bHQpfWNhdGNoKHQpe3RoaXMubGFzdFJlc3VsdD12b2lkIDAsdGhpcy5sYXN0RXJyb3I9dH1yZXR1cm4gdGhpcy5sYXN0UmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZT90aGlzLmxhc3RSZXN1bHQ6dGhpc30sSW5zdGFudFByb21pc2UucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKGUpe2lmKHRoaXMubGFzdEVycm9yKXRyeXt0aGlzLmxhc3RSZXN1bHQ9ZSh0aGlzLmxhc3RFcnJvciksdGhpcy5sYXN0RXJyb3I9dm9pZCAwfWNhdGNoKHQpe3RoaXMubGFzdFJlc3VsdD12b2lkIDAsdGhpcy5sYXN0RXJyb3I9dH1yZXR1cm4gdGhpcy5sYXN0UmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZT90aGlzLmxhc3RSZXN1bHQ6dGhpc307dmFyIEE7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGFuaW1hdGlvbkZyYW1lKGUpe3JldHVybiBnLmFuaW1hdGU/IWUmJnQ/dDpmdW5jdGlvbih0KXtyZXR1cm4gbT13aW5kb3cuc2V0VGltZW91dCh0LGV8fGIpLG19OmZ1bmN0aW9uKGUpe2UoKX19dmFyIHQ7KGZ1bmN0aW9uKGUpe2UmJih0PWZ1bmN0aW9uKHQpe3JldHVybiB1PWUodCl9KX0pKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpLGUud2lsbFJlbmRlck5leHQ9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9idWZmZXImJnRoaXMuX2ZyYW1lQ291bnQrMT09PXRoaXMuZnJhbWVCdWZmZXIoKSl9LGUudHVydGxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90dXJ0bGVzfSxlLmFkZFR1cnRsZT1mdW5jdGlvbihlKXt0aGlzLl90dXJ0bGVzLnB1c2goZSl9LGUucmVzZXQ9ZnVuY3Rpb24oKXtpZih0aGlzLl90dXJ0bGVzKWZvcih2YXIgZT10aGlzLl90dXJ0bGVzLmxlbmd0aDswPD0tLWU7KXRoaXMuX3R1cnRsZXNbZV0ucmVzZXQoKTt0aGlzLl90dXJ0bGVzPVtdLHRoaXMuX2ZyYW1lcz1bXSx0aGlzLl9mcmFtZUNvdW50PTAsdGhpcy5fYnVmZmVyPTEsdGhpcy5fcmF0ZT0wLHRoaXMuX2FuaW1hdGlvbkZyYW1lPWFuaW1hdGlvbkZyYW1lKCl9LGUuYWRkRnJhbWU9ZnVuY3Rpb24oZSx0KXt2YXIgcj0hMTtyZXR1cm4gdCYmKHRoaXMuX2ZyYW1lQ291bnQrPTEpLHRoaXMuZnJhbWVzKCkucHVzaChlKSxyPSFnLmFuaW1hdGV8fHRoaXMuX2J1ZmZlciYmdGhpcy5fZnJhbWVDb3VudD09PXRoaXMuZnJhbWVCdWZmZXIoKSxyP3RoaXMudXBkYXRlKCk6bmV3IEluc3RhbnRQcm9taXNlfSxlLmZyYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mcmFtZXN9LGUuZnJhbWVCdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuXFxcIm51bWJlclxcXCI9PXR5cGVvZiBlJiYodGhpcy5fYnVmZmVyPTB8ZSxlJiZlPD10aGlzLl9mcmFtZUNvdW50KT90aGlzLnVwZGF0ZSgpOnRoaXMuX2J1ZmZlcn0sZS5yZWZyZXNoSW50ZXJ2YWw9ZnVuY3Rpb24oZSl7cmV0dXJuXFxcIm51bWJlclxcXCI9PXR5cGVvZiBlJiYodGhpcy5fcmF0ZT0wfGUsdGhpcy5fYW5pbWF0aW9uRnJhbWU9YW5pbWF0aW9uRnJhbWUoZSkpLHRoaXMuX3JhdGV9LGUudXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZyYW1lcyYmdGhpcy5fZnJhbWVzLmxlbmd0aD90aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSgpOm5ldyBJbnN0YW50UHJvbWlzZX0sZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oKXt2YXIgZSx0LHI9dGhpcy5fZnJhbWVzLG49dGhpcy5fYW5pbWF0aW9uRnJhbWUsYT10aGlzLl90dXJ0bGVzLHM9Z2V0U2NyZWVuKCkuc3ByaXRlTGF5ZXIoKTtyZXR1cm4gdGhpcy5fZnJhbWVzPVtdLHRoaXMuX2ZyYW1lQ291bnQ9MCxuZXcgUHJvbWlzZShmdW5jdGlvbihsKXtuKGZ1bmN0aW9uIHBhaW50KCl7Zm9yKHQ9MDt0PHIubGVuZ3RoO3QrKylyW3RdJiZyW3RdKCk7Zm9yKGNsZWFyTGF5ZXIocyksdD0wO3Q8YS5sZW5ndGg7dCsrKWU9YVt0XSxlLmdldFN0YXRlKCkuc2hvd24mJmRyYXdUdXJ0bGUoZS5nZXRTdGF0ZSgpLHMpO2woKX0pfSl9fSkoRnJhbWVNYW5hZ2VyLnByb3RvdHlwZSksZnVuY3Rpb24oZSl7ZS5vbkV2ZW50PWZ1bmN0aW9uKHQscil7ZnVuY3Rpb24gY29tcHV0ZUNvb3JkaW5hdGVzKCl7aWYoIV8pe3ZhciB0PWdldFNjcmVlbigpLGw9dC5zcHJpdGVMYXllcigpLmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlPTB8ci5jbGllbnRYLWwubGVmdCxuPTB8ci5jbGllbnRZLWwudG9wLGE9ZSp0LnhTY2FsZSt0LmxseCxzPW4qdC55U2NhbGUrdC51cnksXz0hMH19dmFyIGUsbixhLHMsbCxvPXRoaXMuX21hbmFnZXJzW3RdLGQ9dGhpcy5fbWFuYWdlcnMubW91c2Vtb3ZlLF89ITE7aWYoKFxcXCJtb3VzZWRvd25cXFwiPT09dHx8XFxcIm1vdXNldXBcXFwiPT09dCkmJmQmJmQubGVuZ3RoKWZvcihjb21wdXRlQ29vcmRpbmF0ZXMoKSxsPWQubGVuZ3RoOzA8PS0tbDspZFtsXS50ZXN0KGUsbixhLHMpJiZkW2xdLmNhbk1vdmUoXFxcIm1vdXNlZG93blxcXCI9PT10KTtpZihvJiZvLmxlbmd0aClmb3IoY29tcHV0ZUNvb3JkaW5hdGVzKCksbD1vLmxlbmd0aDswPD0tLWw7KVxcXCJtb3VzZW1vdmVcXFwiPT09dCYmb1tsXS5jYW5Nb3ZlKCkmJm9bbF0udGVzdChlLG4sYSxzKT9vW2xdLnRyaWdnZXIoW2Esc10pOlxcXCJtb3VzZWRvd25cXFwiPT09dCYmb1tsXS50ZXN0KGUsbixhLHMpJiZvW2xdLnRyaWdnZXIoW2Esc10pfSxlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5fbWFuYWdlcnM9e319LGUuYWRkTWFuYWdlcj1mdW5jdGlvbihlLHQpe3RoaXMuX21hbmFnZXJzW2VdfHwodGhpcy5fbWFuYWdlcnNbZV09W10pLHRoaXMuX21hbmFnZXJzW2VdLnB1c2godCl9fShNb3VzZUhhbmRsZXIucHJvdG90eXBlKSxmdW5jdGlvbihlKXtlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5faGFuZGxlcnM9dm9pZCAwfSxlLmNhbk1vdmU9ZnVuY3Rpb24oZSl7cmV0dXJuISEodGhpcy5fdGFyZ2V0JiZ0aGlzLl90YXJnZXQuaGl0VGVzdCkmJih2b2lkIDAhPT1lJiYodGhpcy5fdGFyZ2V0LmhpdFRlc3QuaGl0PWUpLHRoaXMuX3RhcmdldC5oaXRUZXN0LmhpdCl9LGUudGVzdD1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdGhpcy5fdGFyZ2V0JiZ0aGlzLl90YXJnZXQuaGl0VGVzdD90aGlzLl90YXJnZXQuaGl0VGVzdChlLHQscixuKTohIXRoaXMuX3RhcmdldH0sZS50cmlnZ2VyPWZ1bmN0aW9uKGUpe3ZhciB0LHI9dGhpcy5faGFuZGxlcnM7aWYociYmci5sZW5ndGgpZm9yKHQ9MDt0PHIubGVuZ3RoO3QrKylyW3RdLmFwcGx5KHt9LGUpfSxlLmFkZEhhbmRsZXI9ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLl9oYW5kbGVycztpZighdCYmciYmci5sZW5ndGgpZm9yKDtyLnNoaWZ0KCk7KTtyZXR1cm5cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZT92b2lkKCFyJiYocj10aGlzLl9oYW5kbGVycz1bXSksci5wdXNoKGUpKTp2b2lkKHImJiFyLmxlbmd0aCYmdGhpcy5yZXNldCgpKX19KEV2ZW50TWFuYWdlci5wcm90b3R5cGUpLFR1cnRsZS5SQURJQU5TPTIqbyxmdW5jdGlvbihlKXtmdW5jdGlvbiBjaXJjbGVSb3RhdGUoZSx0LHIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFkZFVwZGF0ZSh2b2lkIDAsITEse2FuZ2xlOnQscmFkaWFuczpyfSl9fWZ1bmN0aW9uIGNpcmNsZVNlZ21lbnQoZSx0LHIsbixhLHMpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLnRyYW5zbGF0ZSh0LHIsbixhLHMsITApfX1lLmhpdFRlc3Q9ZnVuY3Rpb24oZSx0KXt2YXIgcj1nZXRTY3JlZW4oKS5oaXRUZXN0TGF5ZXIoKTtjbGVhckxheWVyKHIpLGRyYXdUdXJ0bGUodGhpcy5nZXRTdGF0ZSgpLHIpO3ZhciBuPXIuZ2V0SW1hZ2VEYXRhKGUsdCwxLDEpLmRhdGE7cmV0dXJuIG5bM118fG5bMF18fG5bMV18fG5bMl19LGUuYWRkVXBkYXRlPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10aGlzLGE9dGhpcy5nZXRTdGF0ZSgpLHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLHI/MjozKTtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkuYWRkRnJhbWUoZnVuY3Rpb24oKXtpZihlJiZlLmFwcGx5KGEscykscilmb3IodmFyIHQgaW4gcilhW3RdPXJbdF19LHQpfSxlLmdldFN0YXRlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5fc3RhdGV8fCh0aGlzLl9zdGF0ZT17eDp0aGlzLl94LHk6dGhpcy5feSxhbmdsZTp0aGlzLl9hbmdsZSxyYWRpYW5zOnRoaXMuX3JhZGlhbnMsc2hhcGU6dGhpcy5fc2hhcGUsY29sb3I6dGhpcy5fY29sb3IsZmlsbDp0aGlzLl9maWxsLGZpbGxpbmc6dGhpcy5fZmlsbGluZyxzaXplOnRoaXMuX3NpemUsc3BlZWQ6dGhpcy5fY29tcHV0ZWRfc3BlZWQsZG93bjp0aGlzLl9kb3duLHNob3duOnRoaXMuX3Nob3duLGNvbG9yTW9kZTp0aGlzLl9jb2xvck1vZGUsY29udGV4dDpmdW5jdGlvbigpe3JldHVybiBlLmdldFBhcGVyKCl9fSksdGhpcy5fc3RhdGV9LGUudHJhbnNsYXRlPWZ1bmN0aW9uKGUsdCxyLG4sYSxzKXt2YXIgbD10aGlzO3JldHVybiB0cmFuc2xhdGUodGhpcyxlLHQscixuLGEscykudGhlbihmdW5jdGlvbihlKXtsLl94PWVbMF0sbC5feT1lWzFdfSl9LGUucm90YXRlPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10aGlzO3JldHVybiByb3RhdGUodGhpcyxlLHQscikudGhlbihmdW5jdGlvbihlKXtuLl9hbmdsZT1lLmFuZ2xlLG4uX3JhZGlhbnM9ZS5yYWRpYW5zfSl9LGUucXVldWVNb3ZlQnk9ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGE9YyhyKSpuLHM9XyhyKSpuO3JldHVybiB0aGlzLnRyYW5zbGF0ZShlLHQsYSxzLCEwKX0sZS5xdWV1ZVR1cm5Ubz1mdW5jdGlvbihlLHQpe3JldHVybiB0JT10aGlzLl9mdWxsQ2lyY2xlLDA+dCYmKHQrPXRoaXMuX2Z1bGxDaXJjbGUpLHRoaXMucm90YXRlKGUsdC1lKX0sZS5nZXRNYW5hZ2VyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9tYW5hZ2Vyc1tlXXx8KHRoaXMuX21hbmFnZXJzW2VdPW5ldyBFdmVudE1hbmFnZXIoZSx0aGlzKSksdGhpcy5fbWFuYWdlcnNbZV19LGUuZ2V0UGFwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFwZXJ8fCh0aGlzLl9wYXBlcj1jcmVhdGVMYXllcigyKSl9LGUucmVzZXQ9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5feD0wLHRoaXMuX3k9MCx0aGlzLl9yYWRpYW5zPTAsdGhpcy5fYW5nbGU9MCx0aGlzLl9zaG93bj0hMCx0aGlzLl9kb3duPSEwLHRoaXMuX2NvbG9yPVxcXCJibGFja1xcXCIsdGhpcy5fZmlsbD1cXFwiYmxhY2tcXFwiLHRoaXMuX3NpemU9MSx0aGlzLl9maWxsaW5nPSExLHRoaXMuX3VuZG9CdWZmZXI9W10sdGhpcy5fc3BlZWQ9Myx0aGlzLl9jb21wdXRlZF9zcGVlZD01LHRoaXMuX2NvbG9yTW9kZT0xLHRoaXMuX3N0YXRlPXZvaWQgMCx0aGlzLl9tYW5hZ2Vycyl0aGlzLl9tYW5hZ2Vyc1tlXS5yZXNldCgpO3RoaXMuX2lzUmFkaWFucz0hMSx0aGlzLl9mdWxsQ2lyY2xlPTM2MCx0aGlzLl9idWZmZXJTaXplPVxcXCJudW1iZXJcXFwiPT10eXBlb2YgZy5idWZmZXJTaXplP2cuYnVmZmVyU2l6ZTowLHJlbW92ZUxheWVyKHRoaXMuX3BhcGVyKSx0aGlzLl9wYXBlcj12b2lkIDB9LGUuJGRlZ3JlZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBlP3MoZSk6MzYwLHRoaXMuX2lzUmFkaWFucz0hMSx0aGlzLl9hbmdsZT1lJiZ0aGlzLl9mdWxsQ2lyY2xlP3RoaXMuX2FuZ2xlL3RoaXMuX2Z1bGxDaXJjbGUqZTp0aGlzLl9yYWRpYW5zPTAsdGhpcy5fZnVsbENpcmNsZT1lLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7YW5nbGU6dGhpcy5fYW5nbGUscmFkaWFuczp0aGlzLl9yYWRpYW5zfSl9LGUuJGRlZ3JlZXMubWluQXJncz0wLGUuJGRlZ3JlZXMuY29fdmFybmFtZXM9W1xcXCJmdWxsY2lyY2xlXFxcIl0sZS4kZGVncmVlcy5yZXR1cm5UeXBlPXguRkxPQVQsZS4kcmFkaWFucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1JhZGlhbnN8fCh0aGlzLl9pc1JhZGlhbnM9ITAsdGhpcy5fYW5nbGU9dGhpcy5fcmFkaWFucyx0aGlzLl9mdWxsQ2lyY2xlPVR1cnRsZS5SQURJQU5TKSx0aGlzLl9hbmdsZX0sZS4kcmFkaWFucy5yZXR1cm5UeXBlPXguRkxPQVQsZS4kcG9zaXRpb249ZS4kcG9zPWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuJHhjb3IoKSx0aGlzLiR5Y29yKCldfSxlLiRwb3NpdGlvbi5yZXR1cm5UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGVbMF0pLG5ldyBTay5idWlsdGluLmZsb2F0XyhlWzFdKV0pfSxlLiR0b3dhcmRzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0Q29vcmRpbmF0ZXMoZSx0KSxuPW8rZCh0aGlzLl95LXIueSx0aGlzLl94LXIueCksYT1uKih0aGlzLl9mdWxsQ2lyY2xlL1R1cnRsZS5SQURJQU5TKTtyZXR1cm4gYX0sZS4kdG93YXJkcy5jb192YXJuYW1lcz1bXFxcInhcXFwiLFxcXCJ5XFxcIl0sZS4kdG93YXJkcy5taW5BcmdzPTEsZS4kdG93YXJkcy5yZXR1cm5UeXBlPXguRkxPQVQsZS4kZGlzdGFuY2U9ZnVuY3Rpb24oZSx0KXt2YXIgcj1nZXRDb29yZGluYXRlcyhlLHQpLGE9ci54LXRoaXMuX3gscz1yLnktdGhpcy5feTtyZXR1cm4gbihhKmErcypzKX0sZS4kZGlzdGFuY2UuY29fdmFybmFtZXM9W1xcXCJ4XFxcIixcXFwieVxcXCJdLGUuJGRpc3RhbmNlLm1pbkFyZ3M9MSxlLiRkaXN0YW5jZS5yZXR1cm5UeXBlPXguRkxPQVQsZS4kaGVhZGluZz1mdW5jdGlvbigpe3JldHVybiAxZS0xMz5zKHRoaXMuX2FuZ2xlKT8wOnRoaXMuX2FuZ2xlfSxlLiRoZWFkaW5nLnJldHVyblR5cGU9eC5GTE9BVCxlLiR4Y29yPWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTEzPnModGhpcy5feCk/MDp0aGlzLl94fSxlLiR4Y29yLnJldHVyblR5cGU9eC5GTE9BVCxlLiR5Y29yPWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTEzPnModGhpcy5feSk/MDp0aGlzLl95fSxlLiR5Y29yLnJldHVyblR5cGU9eC5GTE9BVCxlLiRmb3J3YXJkPWUuJGZkPWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnF1ZXVlTW92ZUJ5KHRoaXMuX3gsdGhpcy5feSx0aGlzLl9yYWRpYW5zLGUpfSxlLiRmb3J3YXJkLmNvX3Zhcm5hbWVzPWUuJGZkLmNvX3Zhcm5hbWVzPVtcXFwiZGlzdGFuY2VcXFwiXSxlLiR1bmRvPWZ1bmN0aW9uKCl7cG9wVW5kbyh0aGlzKX0sZS4kdW5kb2J1ZmZlcmVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW5kb0J1ZmZlci5sZW5ndGh9LGUuJHNldHVuZG9idWZmZXI9ZnVuY3Rpb24oZSl7dGhpcy5fYnVmZmVyU2l6ZT1cXFwibnVtYmVyXFxcIj09dHlwZW9mIGU/YShzKGUpLDFlMyk6MH0sZS4kc2V0dW5kb2J1ZmZlci5jb192YXJuYW1lcz1bXFxcInNpemVcXFwiXSxlLiRiYWNrd2FyZD1lLiRiYWNrPWUuJGJrPWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnF1ZXVlTW92ZUJ5KHRoaXMuX3gsdGhpcy5feSx0aGlzLl9yYWRpYW5zLC1lKX0sZS4kYmFja3dhcmQuY29fdmFybmFtZXM9ZS4kYmFjay5jb192YXJuYW1lcz1lLiRiay5jb192YXJuYW1lcz1bXFxcImRpc3RhbmNlXFxcIl0sZS4kZ290b18kcnckPWUuJHNldHBvcz1lLiRzZXRwb3NpdGlvbj1mdW5jdGlvbihlLHQpe3ZhciByPWdldENvb3JkaW5hdGVzKGUsdCk7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLHRoaXMudHJhbnNsYXRlKHRoaXMuX3gsdGhpcy5feSxyLngtdGhpcy5feCxyLnktdGhpcy5feSwhMCl9LGUuJGdvdG9fJHJ3JC5jb192YXJuYW1lcz1lLiRzZXRwb3MuY29fdmFybmFtZXM9ZS4kc2V0cG9zaXRpb24uY29fdmFybmFtZXM9W1xcXCJ4XFxcIixcXFwieVxcXCJdLGUuJGdvdG9fJHJ3JC5taW5BcmdzPWUuJHNldHBvcy5taW5BcmdzPWUuJHNldHBvc2l0aW9uLm1pbkFyZ3M9MSxlLiRzZXR4PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksZS10aGlzLl94LDAsITApfSxlLiRzZXR4LmNvX3Zhcm5hbWVzPVtcXFwieFxcXCJdLGUuJHNldHk9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlKHRoaXMuX3gsdGhpcy5feSwwLGUtdGhpcy5feSwhMCl9LGUuJHNldHkuY29fdmFybmFtZXM9W1xcXCJ5XFxcIl0sZS4kaG9tZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLl9hbmdsZTtyZXR1cm4gcHVzaFVuZG8odGhpcyksZS50cmFuc2xhdGUodGhpcy5feCx0aGlzLl95LC10aGlzLl94LC10aGlzLl95LCEwKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGUucXVldWVUdXJuVG8odCwwKX0pLnRoZW4oZnVuY3Rpb24oKXt9KX0sZS4kcmlnaHQ9ZS4kcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLHRoaXMucm90YXRlKHRoaXMuX2FuZ2xlLC1lKX0sZS4kcmlnaHQuY29fdmFybmFtZXM9ZS4kcnQuY29fdmFybmFtZXM9W1xcXCJhbmdsZVxcXCJdLGUuJGxlZnQ9ZS4kbHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLHRoaXMucm90YXRlKHRoaXMuX2FuZ2xlLGUpfSxlLiRsZWZ0LmNvX3Zhcm5hbWVzPWUuJGx0LmNvX3Zhcm5hbWVzPVtcXFwiYW5nbGVcXFwiXSxlLiRzZXRoZWFkaW5nPWUuJHNldGg9ZnVuY3Rpb24oZSl7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLHRoaXMucXVldWVUdXJuVG8odGhpcy5fYW5nbGUsZSl9LGUuJHNldGhlYWRpbmcuY29fdmFybmFtZXM9ZS4kc2V0aC5jb192YXJuYW1lcz1bXFxcImFuZ2xlXFxcIl0sZS4kY2lyY2xlPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbixkLHUsbSxwLGcsZixoLCQsYj10aGlzLHY9dGhpcy5feCxrPXRoaXMuX3ksVD10aGlzLl9hbmdsZSxBPXt9LEw9MS9nZXRTY3JlZW4oKS5saW5lU2NhbGUsUz0hMDtmb3IocHVzaFVuZG8odGhpcyksdm9pZCAwPT09dCYmKHQ9Yi5fZnVsbENpcmNsZSksdm9pZCAwPT09ciYmKGQ9cyh0KS9iLl9mdWxsQ2lyY2xlLHI9MSsoMHxhKDExK3MoZSpMKS82LDU5KSpkKSksdT10L3IsbT0uNSp1LHA9MiplKl8odSpvL2IuX2Z1bGxDaXJjbGUpLDA+ZT8ocD0tcCx1PS11LG09LW0sbj1ULXQpOm49VCt0LCQ9Z2V0RnJhbWVNYW5hZ2VyKCkud2lsbFJlbmRlck5leHQoKT9Qcm9taXNlLnJlc29sdmUoKTpuZXcgSW5zdGFudFByb21pc2UsVCs9bSxnPTA7ZzxyO2crKyljYWxjdWxhdGVIZWFkaW5nKGIsVCt1KmcsQSksZj1jKEEucmFkaWFucykqcCxoPV8oQS5yYWRpYW5zKSpwLCQ9JC50aGVuKGNpcmNsZVJvdGF0ZShiLEEuYW5nbGUsQS5yYWRpYW5zKSkudGhlbihjaXJjbGVTZWdtZW50KGIsdixrLGYsaCxTKSksdis9ZixrKz1oLFM9ITE7cmV0dXJuICQ9JC50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGNhbGN1bGF0ZUhlYWRpbmcoYixuLEEpLGIuX2FuZ2xlPUEuYW5nbGUsYi5fcmFkaWFucz1BLnJhZGlhbnMsYi5hZGRVcGRhdGUodm9pZCAwLCEwLEEpfSksJH0sZS4kY2lyY2xlLmNvX3Zhcm5hbWVzPVtcXFwicmFkaXVzXFxcIixcXFwiZXh0ZW50XFxcIixcXFwic3RlcHNcXFwiXSxlLiRjaXJjbGUubWluQXJncz0xLGUuJHBlbnVwPWUuJHVwPWUuJHB1PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd249ITEsdGhpcy5hZGRVcGRhdGUodm9pZCAwLCExLHtkb3duOiExfSl9LGUuJHBlbmRvd249ZS4kZG93bj1lLiRwZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3duPSEwLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7ZG93bjohMH0pfSxlLiRpc2Rvd249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG93bn0sZS4kc3BlZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5fc3BlZWQ6KHRoaXMuX3NwZWVkPXIoMCxhKDFlMyxlKSksdGhpcy5fY29tcHV0ZWRfc3BlZWQ9cigwLDIqZS0xKSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse3NwZWVkOnRoaXMuX2NvbXB1dGVkX3NwZWVkfSkpfSxlLiRzcGVlZC5taW5BcmdzPTAsZS4kc3BlZWQuY29fdmFybmFtZXM9W1xcXCJzcGVlZFxcXCJdLGUuJHBlbmNvbG9yPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB2b2lkIDA9PT1lP2hleFRvUkdCKHRoaXMuX2NvbG9yKToodGhpcy5fY29sb3I9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLGUsdCxyLG4pLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7Y29sb3I6dGhpcy5fY29sb3J9KSl9LGUuJHBlbmNvbG9yLmNvX3Zhcm5hbWVzPVtcXFwiclxcXCIsXFxcImdcXFwiLFxcXCJiXFxcIixcXFwiYVxcXCJdLGUuJHBlbmNvbG9yLm1pbkFyZ3M9MCxlLiRwZW5jb2xvci5yZXR1cm5UeXBlPXguQ09MT1IsZS4kZmlsbGNvbG9yPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB2b2lkIDA9PT1lP2hleFRvUkdCKHRoaXMuX2ZpbGwpOih0aGlzLl9maWxsPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlLHQscixuKSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se2ZpbGw6dGhpcy5fZmlsbH0pKX0sZS4kZmlsbGNvbG9yLmNvX3Zhcm5hbWVzPVtcXFwiclxcXCIsXFxcImdcXFwiLFxcXCJiXFxcIixcXFwiYVxcXCJdLGUuJGZpbGxjb2xvci5taW5BcmdzPTAsZS4kZmlsbGNvbG9yLnJldHVyblR5cGU9eC5DT0xPUixlLiRjb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9bdGhpcy4kcGVuY29sb3IoKSx0aGlzLiRmaWxsY29sb3IoKV06KHZvaWQgMD09PXR8fHZvaWQgMCE9PXI/KHRoaXMuX2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlLHQscixuKSx0aGlzLl9maWxsPXRoaXMuX2NvbG9yKToodGhpcy5fY29sb3I9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLGUpLHRoaXMuX2ZpbGw9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLHQpKSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se2NvbG9yOnRoaXMuX2NvbG9yLGZpbGw6dGhpcy5fZmlsbH0pKX0sZS4kY29sb3IubWluQXJncz0wLGUuJGNvbG9yLmNvX3Zhcm5hbWVzPVtcXFwiY29sb3JcXFwiLFxcXCJmaWxsXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRjb2xvci5yZXR1cm5UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbeC5DT0xPUihlWzBdKSx4LkNPTE9SKGVbMV0pXSl9LGUuJGZpbGw9ZnVuY3Rpb24oZSl7dGhpcztyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9maWxsaW5nOihlPSEhZSxlPT09dGhpcy5fZmlsbGluZyk/dm9pZCAwOih0aGlzLl9maWxsaW5nPWUsZT8ocHVzaFVuZG8odGhpcyksdGhpcy5hZGRVcGRhdGUodm9pZCAwLCExLHtmaWxsaW5nOiEwLGZpbGxCdWZmZXI6W3t4OnRoaXMuX3gseTp0aGlzLl95fV19KSk6KHB1c2hVbmRvKHRoaXMpLHRoaXMuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7dGhpcy5maWxsQnVmZmVyLnB1c2godGhpcyksZHJhd0ZpbGwuY2FsbCh0aGlzKX0sITAse2ZpbGxpbmc6ITEsZmlsbEJ1ZmZlcjp2b2lkIDB9KSkpfSxlLiRmaWxsLmNvX3Zhcm5hbWVzPVtcXFwiZmxhZ1xcXCJdLGUuJGZpbGwubWluQXJncz0wLGUuJGJlZ2luX2ZpbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZmlsbCghMCl9LGUuJGVuZF9maWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZpbGwoITEpfSxlLiRzdGFtcD1mdW5jdGlvbigpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLmFkZFVwZGF0ZShmdW5jdGlvbigpe2RyYXdUdXJ0bGUodGhpcyx0aGlzLmNvbnRleHQoKSl9LCEwKX0sZS4kZG90PWZ1bmN0aW9uKGUsdCxuLGwsaSl7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLGU9U2suYnVpbHRpbi5hc251bSQoZSksZT1cXFwibnVtYmVyXFxcIj09dHlwZW9mIGU/cigxLDB8cyhlKSk6cih0aGlzLl9zaXplKzQsMip0aGlzLl9zaXplKSx0PXZvaWQgMD09PXQ/dGhpcy5fY29sb3I6Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLHQsbixsLGkpLHRoaXMuYWRkVXBkYXRlKGRyYXdEb3QsITAsdm9pZCAwLGUsdCl9LGUuJGRvdC5jb192YXJuYW1lcz1bXFxcInNpemVcXFwiLFxcXCJjb2xvclxcXCIsXFxcImdcXFwiLFxcXCJiXFxcIixcXFwiYVxcXCJdLGUuJHdyaXRlPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBhLHMsbCxpLG8sZD10aGlzO3JldHVybiBwdXNoVW5kbyh0aGlzKSxlKz1cXFwiXFxcIixuJiZuLmNvbnN0cnVjdG9yPT09QXJyYXkmJihzPVxcXCJzdHJpbmdcXFwiPT10eXBlb2YgblswXT9uWzBdOlxcXCJBcmlhbFxcXCIsbD0oblsxXXx8XFxcIjEycHRcXFwiKStcXFwiXFxcIixpPVxcXCJzdHJpbmdcXFwiPT10eXBlb2YgblsyXT9uWzJdOlxcXCJub3JtYWxcXFwiLC9eXFxcXGQrJC8udGVzdChsKSYmKGwrPVxcXCJwdFxcXCIpLG49W2ksbCxzXS5qb2luKFxcXCIgXFxcIikpLHJ8fChyPVxcXCJsZWZ0XFxcIiksYT10aGlzLmFkZFVwZGF0ZShkcmF3VGV4dCwhMCx2b2lkIDAsZSxyLG4pLHQmJihcXFwibGVmdFxcXCI9PT1yfHxcXFwiY2VudGVyXFxcIj09PXIpJiYobz1tZWFzdXJlVGV4dChlLG4pLFxcXCJjZW50ZXJcXFwiPT09ciYmKG8vPTIpLGE9YS50aGVuKGZ1bmN0aW9uKCl7dmFyIGU9ZC5nZXRTdGF0ZSgpO3JldHVybiBkLnRyYW5zbGF0ZShlLngsZS55LG8sMCwhMCl9KSksYX0sZS4kd3JpdGUuY29fdmFybmFtZXM9W1xcXCJtZXNzYWdlXFxcIixcXFwibW92ZVxcXCIsXFxcImFsaWduXFxcIixcXFwiZm9udFxcXCJdLGUuJHdyaXRlLm1pbkFyZ3M9MSxlLiRwZW5zaXplPWUuJHdpZHRoPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuX3NpemU6KHRoaXMuX3NpemU9ZSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se3NpemU6ZX0pKX0sZS4kcGVuc2l6ZS5taW5BcmdzPWUuJHdpZHRoLm1pbkFyZ3M9MCxlLiRwZW5zaXplLmNvX3Zhcm5hbWVzPWUuJHdpZHRoLmNvX3Zhcm5hbWVzPVtcXFwid2lkdGhcXFwiXSxlLiRzaG93dHVydGxlPWUuJHN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nob3duPSEwLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMCx7c2hvd246ITB9KX0sZS4kaGlkZXR1cnRsZT1lLiRodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93bj0hMSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITAse3Nob3duOiExfSl9LGUuJGlzdmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93bn0sZS4kc2hhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJnZbZV0/KHRoaXMuX3NoYXBlPWUsdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtzaGFwZTplfSkpOnRoaXMuX3NoYXBlfSxlLiRzaGFwZS5taW5BcmdzPTAsZS4kc2hhcGUuY29fdmFybmFtZXM9W1xcXCJuYW1lXFxcIl0sZS4kY29sb3Jtb2RlPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuX2NvbG9yTW9kZToodGhpcy5fY29sb3JNb2RlPTI1NT09PWU/MjU1OjEsdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtjb2xvck1vZGU6dGhpcy5fY29sb3JNb2RlfSkpfSxlLiRjb2xvcm1vZGUubWluQXJncz0wLGUuJGNvbG9ybW9kZS5jb192YXJuYW1lcz1bXFxcImNtb2RlXFxcIl0sZS4kY29sb3Jtb2RlLnJldHVyblR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIDI1NT09PWU/bmV3IFNrLmJ1aWx0aW4uaW50XygyNTUpOm5ldyBTay5idWlsdGluLmZsb2F0XygxKX0sZS4kd2luZG93X3dpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kd2luZG93X3dpZHRoKCl9LGUuJHdpbmRvd19oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR3aW5kb3dfaGVpZ2h0KCl9LGUuJHRyYWNlcj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9zY3JlZW4uJHRyYWNlcihlLHQpfSxlLiR0cmFjZXIubWluQXJncz0wLGUuJHRyYWNlci5jb192YXJuYW1lcz1bXFxcIm5cXFwiLFxcXCJkZWxheVxcXCJdLGUuJHVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JlZW4uJHVwZGF0ZSgpfSxlLiRkZWxheT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiRkZWxheShlKX0sZS4kZGVsYXkubWluQXJncz0wLGUuJGRlbGF5LmNvX3Zhcm5hbWVzPVtcXFwiZGVsYXlcXFwiXSxlLiRyZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlc2V0KCksdGhpcy4kY2xlYXIoKX0sZS4kbWFpbmxvb3A9ZS4kZG9uZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JlZW4uJG1haW5sb29wKCl9LGUuJGNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7Y2xlYXJMYXllcih0aGlzLmNvbnRleHQoKSl9LCEwKX0sZS4kZG90Lm1pbkFyZ3M9MCxlLiRvbmNsaWNrPWZ1bmN0aW9uKGUsdCxyKXt0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25jbGljay5taW5BcmdzPTEsZS4kb25jbGljay5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJG9ucmVsZWFzZT1mdW5jdGlvbihlLHQscil7dGhpcy5nZXRNYW5hZ2VyKFxcXCJtb3VzZXVwXFxcIikuYWRkSGFuZGxlcihlLHIpfSxlLiRvbnJlbGVhc2UubWluQXJncz0xLGUuJG9ucmVsZWFzZS5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJG9uZHJhZz1mdW5jdGlvbihlLHQscil7dGhpcy5nZXRNYW5hZ2VyKFxcXCJtb3VzZW1vdmVcXFwiKS5hZGRIYW5kbGVyKGUscil9LGUuJG9uZHJhZy5taW5BcmdzPTEsZS4kb25kcmFnLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiYnRuXFxcIixcXFwiYWRkXFxcIl0sZS4kZ2V0c2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh5LlNjcmVlbil9LGUuJGdldHNjcmVlbi5pc1NrPSEwLGUuJGNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KHkuVHVydGxlKTtyZXR1cm4gZS5pbnN0YW5jZS5feD10aGlzLl94LGUuaW5zdGFuY2UuX3k9dGhpcy5feSxlLmluc3RhbmNlLl9hbmdsZT10aGlzLl9hbmdsZSxlLmluc3RhbmNlLl9yYWRpYW5zPXRoaXMuX3JhZGlhbnMsZS5pbnN0YW5jZS5fc2hhcGU9dGhpcy5fc2hhcGUsZS5pbnN0YW5jZS5fY29sb3I9dGhpcy5fY29sb3IsZS5pbnN0YW5jZS5fZmlsbD10aGlzLl9maWxsLGUuaW5zdGFuY2UuX2ZpbGxpbmc9dGhpcy5fZmlsbGluZyxlLmluc3RhbmNlLl9zaXplPXRoaXMuX3NpemUsZS5pbnN0YW5jZS5fY29tcHV0ZWRfc3BlZWQ9dGhpcy5fY29tcHV0ZWRfc3BlZWQsZS5pbnN0YW5jZS5fZG93bj10aGlzLl9kb3duLGUuaW5zdGFuY2UuX3Nob3duPXRoaXMuX3Nob3duLGUuaW5zdGFuY2UuX2NvbG9yTW9kZT10aGlzLl9jb2xvck1vZGUsZS5pbnN0YW5jZS5faXNSYWRpYW5zPXRoaXMuX2lzUmFkaWFucyxlLmluc3RhbmNlLl9mdWxsQ2lyY2xlPXRoaXMuX2Z1bGxDaXJjbGUsZS5pbnN0YW5jZS5fYnVmZmVyU2l6ZT10aGlzLl9idWZmZXJTaXplLGUuaW5zdGFuY2UuX3VuZG9CdWZmZXI9dGhpcy5fdW5kb0J1ZmZlcixlLl9jbG9uZWRGcm9tPXRoaXMsZX0sZS4kY2xvbmUucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gZX0sZS4kZ2V0dHVydGxlPWUuJGdldHBlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNrSW5zdGFuY2V9LGUuJGdldHR1cnRsZS5pc1NrPSEwfShUdXJ0bGUucHJvdG90eXBlKSxmdW5jdGlvbihlKXtlLnNwcml0ZUxheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZXN8fCh0aGlzLl9zcHJpdGVzPWNyZWF0ZUxheWVyKDMpKX0sZS5iZ0xheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tncm91bmR8fCh0aGlzLl9iYWNrZ3JvdW5kPWNyZWF0ZUxheWVyKDEpKX0sZS5oaXRUZXN0TGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGl0VGVzdHx8KHRoaXMuX2hpdFRlc3Q9Y3JlYXRlTGF5ZXIoMCwhMCkpfSxlLmdldE1hbmFnZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX21hbmFnZXJzW2VdfHwodGhpcy5fbWFuYWdlcnNbZV09bmV3IEV2ZW50TWFuYWdlcihlLHRoaXMpKSx0aGlzLl9tYW5hZ2Vyc1tlXX0sZS5yZXNldD1mdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLl9rZXlMaXN0ZW5lcnM9dm9pZCAwLHRoaXMuX2tleUxvZ2dlcil3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9rZXlMb2dnZXJbZV0pLHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fa2V5TG9nZ2VyW2VdKSxkZWxldGUgdGhpcy5fa2V5TG9nZ2VyW2VdO2ZvcihlIGluIHRoaXMuX2tleURvd25MaXN0ZW5lciYmKGdldFRhcmdldCgpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXFxcImtleWRvd25cXFwiLHRoaXMuX2tleURvd25MaXN0ZW5lciksdGhpcy5fa2V5RG93bkxpc3RlbmVyPXZvaWQgMCksdGhpcy5fa2V5VXBMaXN0ZW5lciYmKGdldFRhcmdldCgpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXFxcImtleXVwXFxcIix0aGlzLl9rZXlVcExpc3RlbmVyKSx0aGlzLl9rZXlVcExpc3RlbmVyPXZvaWQgMCksdGhpcy5fdGltZXImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj12b2lkIDApLHRoaXMuX21hbmFnZXJzKXRoaXMuX21hbmFnZXJzW2VdLnJlc2V0KCk7dGhpcy5fbW9kZT1cXFwic3RhbmRhcmRcXFwiLHJlbW92ZUxheWVyKHRoaXMuX3Nwcml0ZXMpLHRoaXMuX3Nwcml0ZXM9dm9pZCAwLHJlbW92ZUxheWVyKHRoaXMuX2JhY2tncm91bmQpLHRoaXMuX2JhY2tncm91bmQ9dm9pZCAwfSxlLnNldFVwV29ybGQ9ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGw9dGhpcztsLmxseD1lLGwubGx5PXQsbC51cng9cixsLnVyeT1uLGwueFNjYWxlPShyLWUpL2dldFdpZHRoKCksbC55U2NhbGU9LTEqKG4tdCkvZ2V0SGVpZ2h0KCksbC5saW5lU2NhbGU9YShzKGwueFNjYWxlKSxzKGwueVNjYWxlKSl9LGUuJHNldHVwPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiBpc05hTihwYXJzZUZsb2F0KGUpKSYmKGU9Z2V0V2lkdGgoKSksaXNOYU4ocGFyc2VGbG9hdCh0KSkmJih0PWdldEhlaWdodCgpKSwxPj1lJiYoZT1nZXRXaWR0aCgpKmUpLDE+PXQmJih0PWdldEhlaWdodCgpKnQpLHRoaXMuX3dpZHRoPWUsdGhpcy5faGVpZ2h0PXQsdGhpcy5feE9mZnNldD12b2lkIDA9PT1yfHxpc05hTihwYXJzZUludChyKSk/MDpwYXJzZUludChyKSx0aGlzLl95T2Zmc2V0PXZvaWQgMD09PW58fGlzTmFOKHBhcnNlSW50KG4pKT8wOnBhcnNlSW50KG4pLFxcXCJ3b3JsZFxcXCI9PT10aGlzLl9tb2RlP3RoaXMuX3NldHdvcmxkY29vcmRpbmF0ZXModGhpcy5sbHgsdGhpcy5sbHksdGhpcy51cngsdGhpcy51cnkpOnRoaXMuX3NldHdvcmxkY29vcmRpbmF0ZXMoLWUvMiwtdC8yLGUvMix0LzIpfSxlLiRzZXR1cC5taW5BcmdzPTAsZS4kc2V0dXAuY29fdmFybmFtZXM9W1xcXCJ3aWR0aFxcXCIsXFxcImhlaWdodFxcXCIsXFxcInN0YXJ0eFxcXCIsXFxcInN0YXJ0eVxcXCJdLGUuJHJlZ2lzdGVyX3NoYXBlPWUuJGFkZHNoYXBlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dm9pZCh2W2VdPXQpOmdldEFzc2V0KGUpLnRoZW4oZnVuY3Rpb24odCl7dltlXT10fSl9LGUuJHJlZ2lzdGVyX3NoYXBlLm1pbkFyZ3M9MSxlLiRnZXRzaGFwZXM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModil9LGUuJHRyYWNlcj1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDAhPT1lfHx2b2lkIDAhPT10PyhcXFwibnVtYmVyXFxcIj09dHlwZW9mIHQmJih0aGlzLl9kZWxheT10LGdldEZyYW1lTWFuYWdlcigpLnJlZnJlc2hJbnRlcnZhbCh0KSksXFxcIm51bWJlclxcXCI9PXR5cGVvZiBlPyh0aGlzLl9mcmFtZXM9ZSxnZXRGcmFtZU1hbmFnZXIoKS5mcmFtZUJ1ZmZlcihlKSk6dm9pZCAwKTp0aGlzLl9mcmFtZXN9LGUuJHRyYWNlci5jb192YXJuYW1lcz1bXFxcImZyYW1lc1xcXCIsXFxcImRlbGF5XFxcIl0sZS4kdHJhY2VyLm1pbkFyZ3M9MCxlLiRkZWxheT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT92b2lkIDA9PT10aGlzLl9kZWxheT9iOnRoaXMuX2RlbGF5OnRoaXMuJHRyYWNlcih2b2lkIDAsZSl9LGUuJGRlbGF5LmNvX3Zhcm5hbWVzPVtcXFwiZGVsYXlcXFwiXSxlLl9zZXR3b3JsZGNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBhPXRoaXMscz1nZXRGcmFtZU1hbmFnZXIoKS50dXJ0bGVzKCk7cmV0dXJuIHRoaXMuc2V0VXBXb3JsZChlLHQscixuKSx0aGlzLl9zcHJpdGVzJiZhcHBseVdvcmxkKHRoaXMsdGhpcy5fc3ByaXRlcyksdGhpcy5fYmFja2dyb3VuZCYmYXBwbHlXb3JsZCh0aGlzLHRoaXMuX2JhY2tncm91bmQpLHRoaXMuJGNsZWFyKCl9LGUuJHNldHdvcmxkY29vcmRpbmF0ZXM9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHRoaXMuX21vZGU9XFxcIndvcmxkXFxcIix0aGlzLl9zZXR3b3JsZGNvb3JkaW5hdGVzKGUsdCxyLG4pfSxlLiRzZXR3b3JsZGNvb3JkaW5hdGVzLmNvX3Zhcm5hbWVzPVtcXFwibGx4XFxcIixcXFwibGx5XFxcIixcXFwidXJ4XFxcIixcXFwidXJ5XFxcIl0sZS5taW5BcmdzPTQsZS4kY2xlYXI9ZS4kY2xlYXJzY3JlZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXNldCgpLHRoaXMuJHJlc2V0KCl9LGUuJHVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiBnZXRGcmFtZU1hbmFnZXIoKS51cGRhdGUoKX0sZS4kcmVzZXQ9ZS4kcmVzZXRzY3JlZW49ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9Z2V0RnJhbWVNYW5hZ2VyKCkudHVydGxlcygpO3JldHVybiBnZXRGcmFtZU1hbmFnZXIoKS5hZGRGcmFtZShmdW5jdGlvbigpe2FwcGx5V29ybGQoZSxlLl9zcHJpdGVzKSxhcHBseVdvcmxkKGUsZS5fYmFja2dyb3VuZCk7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspdFtyXS5yZXNldCgpLGFwcGx5V29ybGQoZSx0W3JdLl9wYXBlcil9LCEwKX0sZS4kd2luZG93X3dpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIGdldFdpZHRoKCl9LGUuJHdpbmRvd19oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0SGVpZ2h0KCl9LGUuJGRlbGF5Lm1pbkFyZ3M9MCxlLiR0dXJ0bGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGdldEZyYW1lTWFuYWdlcigpLnR1cnRsZXMoKX0sZS4kdHVydGxlcy5yZXR1cm5UeXBlPXguVFVSVExFX0xJU1QsZS4kYmdwaWM9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGU/KHQ9dGhpcyxnZXRBc3NldChlKS50aGVuKGZ1bmN0aW9uKGUpe2NsZWFyTGF5ZXIodC5iZ0xheWVyKCksdm9pZCAwLGUpfSkpOnRoaXMuX2JncGljfSxlLiRiZ3BpYy5taW5BcmdzPTAsZS4kYmdwaWMuY29fdmFybmFtZXM9W1xcXCJuYW1lXFxcIl0sZS4kYmdjb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9oZXhUb1JHQih0aGlzLl9iZ2NvbG9yKToodGhpcy5fYmdjb2xvcj1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdm9pZCBjbGVhckxheWVyKHRoaXMuYmdMYXllcigpLHRoaXMuX2JnY29sb3IpKX0sZS4kYmdjb2xvci5taW5BcmdzPTAsZS4kYmdjb2xvci5jb192YXJuYW1lcz1bXFxcImNvbG9yXFxcIixcXFwiZ1xcXCIsXFxcImJcXFwiLFxcXCJhXFxcIl0sZS4kYmdjb2xvci5yZXR1cm5UeXBlPXguQ09MT1IsZS4kbWFpbmxvb3A9ZS4kZG9uZT1mdW5jdGlvbigpe30sZS4kYnllPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLlR1cnRsZUdyYXBoaWNzLnJlc2V0KCl9LGUuJGV4aXRvbmNsaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V4aXRPbkNsaWNrPSEwLHRoaXMuZ2V0TWFuYWdlcihcXFwibW91c2Vkb3duXFxcIikuYWRkSGFuZGxlcihmdW5jdGlvbigpe3Jlc2V0VHVydGxlKCl9LCExKX0sZS4kb25jbGljaz1mdW5jdGlvbihlLHQscil7dGhpcy5fZXhpdE9uQ2xpY2t8fHRoaXMuZ2V0TWFuYWdlcihcXFwibW91c2Vkb3duXFxcIikuYWRkSGFuZGxlcihlLHIpfSxlLiRvbmNsaWNrLm1pbkFyZ3M9MSxlLiRvbmNsaWNrLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiYnRuXFxcIixcXFwiYWRkXFxcIl07dmFyIHQ9ezg6L15iYWNrKHNwYWNlKT8kL2ksOTovXnRhYiQvaSwxMzovXihlbnRlcnxyZXR1cm4pJC9pLDE2Oi9ec2hpZnQkL2ksMTc6L14oY3RybHxjb250cm9sKSQvaSwxODovXmFsdCQvaSwyNzovXmVzYyhhcGUpPyQvaSwzMjovXnNwYWNlJC9pLDMzOi9ecGFnZVtcXFxcc1xcXFwtXT91cCQvaSwzNDovXnBhZ2VbXFxcXHNcXFxcLV0/ZG93biQvaSwzNTovXmVuZCQvaSwzNjovXmhvbWUkL2ksMzc6L15sZWZ0KFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDM4Oi9edXAoW1xcXFxzXFxcXC1dP2Fycm93KT8kL2ksMzk6L15yaWdodChbXFxcXHNcXFxcLV0/YXJyb3cpPyQvaSw0MDovXmRvd24oW1xcXFxzXFxcXC1dP2Fycm93KT8kL2ksNDU6L15pbnNlcnQkL2ksNDY6L15kZWwoZXRlKT8kL2l9O2UuX2NyZWF0ZUtleVJlcGVhdGVyPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztyLl9rZXlMb2dnZXJbdF09d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLl9rZXlMaXN0ZW5lcnNbZV0oKSxyLl9rZXlMb2dnZXJbdF09d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7ci5fa2V5TGlzdGVuZXJzW2VdKCl9LDUwKX0sMzMzKX0sZS5fY3JlYXRlS2V5RG93bkxpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0aGlzLl9rZXlEb3duTGlzdGVuZXJ8fCh0aGlzLl9rZXlEb3duTGlzdGVuZXI9ZnVuY3Rpb24obil7dmFyIGU9U3RyaW5nLmZyb21DaGFyQ29kZTtpZihmb2N1c1R1cnRsZSgpKXt2YXIgYSxzLGw9bi5jaGFyQ29kZXx8bi5rZXlDb2RlLGk9ZShsKS50b0xvd2VyQ2FzZSgpO2lmKCFyLl9rZXlMb2dnZXJbbF0pZm9yKGEgaW4gci5fa2V5TGlzdGVuZXJzKWlmKHM9MTxhLmxlbmd0aCYmdFtsXSYmdFtsXS50ZXN0KGEpLGE9PT1pfHxzKXtyLl9rZXlMaXN0ZW5lcnNbYV0oKSxyLl9jcmVhdGVLZXlSZXBlYXRlcihhLGwpLG4ucHJldmVudERlZmF1bHQoKTticmVha319fSxnZXRUYXJnZXQoKS5hZGRFdmVudExpc3RlbmVyKFxcXCJrZXlkb3duXFxcIix0aGlzLl9rZXlEb3duTGlzdGVuZXIpKX0sZS5fY3JlYXRlS2V5VXBMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fa2V5VXBMaXN0ZW5lcnx8KHRoaXMuX2tleVVwTGlzdGVuZXI9ZnVuY3Rpb24ocil7dmFyIGU9dC5fa2V5TG9nZ2VyW3IuY2hhckNvZGV8fHIua2V5Q29kZV07dm9pZCAwIT09ZSYmKHIucHJldmVudERlZmF1bHQoKSx3aW5kb3cuY2xlYXJJbnRlcnZhbChlKSx3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLGRlbGV0ZSB0Ll9rZXlMb2dnZXJbci5jaGFyQ29kZXx8ci5rZXlDb2RlXSl9LGdldFRhcmdldCgpLmFkZEV2ZW50TGlzdGVuZXIoXFxcImtleXVwXFxcIix0aGlzLl9rZXlVcExpc3RlbmVyKSl9LGUuJGxpc3Rlbj1mdW5jdGlvbigpe3RoaXMuX2NyZWF0ZUtleVVwTGlzdGVuZXIoKSx0aGlzLl9jcmVhdGVLZXlEb3duTGlzdGVuZXIoKX0sZS4kb25rZXk9ZnVuY3Rpb24oZSx0KXtpZihcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgdCl7dmFyIHI9ZTtlPXQsdD1yfXQ9KHQrXFxcIlxcXCIpLnRvTG93ZXJDYXNlKCksZSYmXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGU/KCF0aGlzLl9rZXlMaXN0ZW5lcnMmJih0aGlzLl9rZXlMaXN0ZW5lcnM9e30pLHRoaXMuX2tleUxpc3RlbmVyc1t0XT1lKTpkZWxldGUgdGhpcy5fa2V5TGlzdGVuZXJzW3RdfSxlLiRvbmtleS5taW5BcmdzPTIsZS4kb25rZXkuY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJrZXlWYWx1ZVxcXCJdLGUuJG9uc2NyZWVuY2xpY2s9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2Vkb3duXFxcIikuYWRkSGFuZGxlcihlLHIpfSxlLiRvbnNjcmVlbmNsaWNrLm1pbkFyZ3M9MSxlLiRvbnNjcmVlbmNsaWNrLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiYnRuXFxcIixcXFwiYWRkXFxcIl0sZS4kb250aW1lcj1mdW5jdGlvbihlLHQpe3RoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9dm9pZCAwKSxlJiZcXFwibnVtYmVyXFxcIj09dHlwZW9mIHQmJih0aGlzLl90aW1lcj13aW5kb3cuc2V0VGltZW91dChlLHIoMCwwfHQpKSl9LGUuJG9udGltZXIubWluQXJncz0wLGUuJG9udGltZXIuY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJpbnRlcnZhbFxcXCJdfShTY3JlZW4ucHJvdG90eXBlKTt2YXIgTD1uZXcgSW1hZ2UsUz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJjYW52YXNcXFwiKS5nZXRDb250ZXh0KFxcXCIyZFxcXCIpO2Zvcih2YXIgQyBpbiBpbml0VHVydGxlLmNvX3Zhcm5hbWVzPVtcXFwic2VsZlxcXCIsXFxcInNoYXBlXFxcIl0saW5pdFR1cnRsZS5jb19uYW1lPW5ldyBTay5idWlsdGluLnN0cihcXFwiVHVydGxlXFxcIiksaW5pdFR1cnRsZS5jb19hcmdjb3VudD0yLGluaXRUdXJ0bGUuJGRlZmF1bHRzPVtTay5idWlsdGluLm5vbmUubm9uZSQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJjbGFzc2ljXFxcIildLFR1cnRsZS5wcm90b3R5cGUpL15cXFxcJFthLXpfXSsvLnRlc3QoQykmJmFkZE1vZHVsZU1ldGhvZChUdXJ0bGUseSxDLGVuc3VyZUFub255bW91cyk7cmV0dXJuIGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJG1haW5sb29wXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJGRvbmVcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkYnllXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJHRyYWNlclxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR1cGRhdGVcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkZGVsYXlcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkd2luZG93X3dpZHRoXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJHdpbmRvd19oZWlnaHRcXFwiLGdldFNjcmVlbikseS5UdXJ0bGU9U2subWlzY2V2YWwuYnVpbGRDbGFzcyh5LGZ1bmN0aW9uIFR1cnRsZVdyYXBwZXIoZSx0KXtmb3IodmFyIHIgaW4gdC5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGluaXRUdXJ0bGUpLFR1cnRsZS5wcm90b3R5cGUpL15cXFxcJFthLXpfXSsvLnRlc3QocikmJmFkZE1vZHVsZU1ldGhvZChUdXJ0bGUsdCxyKX0sXFxcIlR1cnRsZVxcXCIsW10pLHkuU2NyZWVuPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoeSxmdW5jdGlvbiBTY3JlZW5XcmFwcGVyKGUsdCl7Zm9yKHZhciByIGluIHQuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihlKXtlLmluc3RhbmNlPWdldFNjcmVlbigpfSksU2NyZWVuLnByb3RvdHlwZSkvXlxcXFwkW2Etel9dKy8udGVzdChyKSYmYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix0LHIpfSxcXFwiU2NyZWVuXFxcIixbXSkse3NrTW9kdWxlOnkscmVzZXQ6cmVzZXRUdXJ0bGUsc3RvcDpzdG9wVHVydGxlLGZvY3VzOmZvY3VzVHVydGxlLFR1cnRsZTpUdXJ0bGUsU2NyZWVuOlNjcmVlbn19KGUpLFNrLlR1cnRsZUdyYXBoaWNzLm1vZHVsZT1lLnR1cnRsZUluc3RhbmNlLnNrTW9kdWxlLFNrLlR1cnRsZUdyYXBoaWNzLnJlc2V0PWUudHVydGxlSW5zdGFuY2UucmVzZXQsU2suVHVydGxlR3JhcGhpY3Muc3RvcD1lLnR1cnRsZUluc3RhbmNlLnN0b3AsU2suVHVydGxlR3JhcGhpY3MuZm9jdXM9ZS50dXJ0bGVJbnN0YW5jZS5mb2N1cyxTay5UdXJ0bGVHcmFwaGljcy5yYXc9e1R1cnRsZTplLnR1cnRsZUluc3RhbmNlLlR1cnRsZSxTY3JlZW46ZS50dXJ0bGVJbnN0YW5jZS5TY3JlZW59LGUudHVydGxlSW5zdGFuY2Uuc2tNb2R1bGV9O1wiLFwic3JjL2xpYi90eXBlcy5weVwiOlwiXFxcIlxcXCJcXFwiXFxuVGhpcyBmaWxlIHdhcyBtb2RpZmllZCBmcm9tIENQeXRob24uXFxuQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLFxcbjIwMTEsIDIwMTIsIDIwMTMsIDIwMTQsIDIwMTUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb247IEFsbCBSaWdodHMgUmVzZXJ2ZWRcXG5cXFwiXFxcIlxcXCJcXG5cXFwiXFxcIlxcXCJEZWZpbmUgbmFtZXMgZm9yIGFsbCB0eXBlIHN5bWJvbHMga25vd24gaW4gdGhlIHN0YW5kYXJkIGludGVycHJldGVyLlxcblR5cGVzIHRoYXQgYXJlIHBhcnQgb2Ygb3B0aW9uYWwgbW9kdWxlcyAoZS5nLiBhcnJheSkgYXJlIG5vdCBsaXN0ZWQuXFxuXFxcIlxcXCJcXFwiXFxuaW1wb3J0IHN5c1xcblxcbiMgSXRlcmF0b3JzIGluIFB5dGhvbiBhcmVuJ3QgYSBtYXR0ZXIgb2YgdHlwZSBidXQgb2YgcHJvdG9jb2wuICBBIGxhcmdlXFxuIyBhbmQgY2hhbmdpbmcgbnVtYmVyIG9mIGJ1aWx0aW4gdHlwZXMgaW1wbGVtZW50ICpzb21lKiBmbGF2b3Igb2ZcXG4jIGl0ZXJhdG9yLiAgRG9uJ3QgY2hlY2sgdGhlIHR5cGUhICBVc2UgaGFzYXR0ciB0byBjaGVjayBmb3IgYm90aFxcbiMgXFxcIl9faXRlcl9fXFxcIiBhbmQgXFxcIm5leHRcXFwiIGF0dHJpYnV0ZXMgaW5zdGVhZC5cXG5NYXBwaW5nUHJveHlUeXBlID0gdHlwZSh0eXBlLl9fZGljdF9fKVxcbldyYXBwZXJEZXNjcmlwdG9yVHlwZSA9IHR5cGUob2JqZWN0Ll9faW5pdF9fKVxcbk1ldGhvZFdyYXBwZXJUeXBlID0gdHlwZShvYmplY3QoKS5fX3N0cl9fKVxcbk1ldGhvZERlc2NyaXB0b3JUeXBlID0gdHlwZShzdHIuam9pbilcXG5DbGFzc01ldGhvZERlc2NyaXB0b3JUeXBlID0gdHlwZShkaWN0Ll9fZGljdF9fWydmcm9ta2V5cyddKVxcblxcbk5vbmVUeXBlID0gdHlwZShOb25lKVxcblR5cGVUeXBlID0gdHlwZVxcbk9iamVjdFR5cGUgPSBvYmplY3RcXG5JbnRUeXBlID0gaW50XFxudHJ5OlxcbiAgICBMb25nVHlwZSA9IGxvbmdcXG5leGNlcHQ6IHBhc3NcXG5GbG9hdFR5cGUgPSBmbG9hdFxcbkJvb2xlYW5UeXBlID0gYm9vbFxcbnRyeTpcXG4gICAgQ29tcGxleFR5cGUgPSBjb21wbGV4XFxuZXhjZXB0IE5hbWVFcnJvcjpcXG4gICAgcGFzc1xcblN0cmluZ1R5cGUgPSBzdHJcXG5cXG4jIFN0cmluZ1R5cGVzIGlzIGFscmVhZHkgb3V0ZGF0ZWQuICBJbnN0ZWFkIG9mIHdyaXRpbmcgXFxcInR5cGUoeCkgaW5cXG4jIHR5cGVzLlN0cmluZ1R5cGVzXFxcIiwgeW91IHNob3VsZCB1c2UgXFxcImlzaW5zdGFuY2UoeCwgYmFzZXN0cmluZylcXFwiLiAgQnV0XFxuIyB3ZSBrZWVwIGFyb3VuZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjIuXFxudHJ5OlxcbiAgICBVbmljb2RlVHlwZSA9IHVuaWNvZGVcXG4gICAgU3RyaW5nVHlwZXMgPSAoU3RyaW5nVHlwZSwgVW5pY29kZVR5cGUpXFxuZXhjZXB0IE5hbWVFcnJvcjpcXG4gICAgU3RyaW5nVHlwZXMgPSAoU3RyaW5nVHlwZSwpXFxuXFxuQnVmZmVyVHlwZSA9IGJ1ZmZlclxcblxcblR1cGxlVHlwZSA9IHR1cGxlXFxuTGlzdFR5cGUgPSBsaXN0XFxuRGljdFR5cGUgPSBEaWN0aW9uYXJ5VHlwZSA9IGRpY3RcXG5cXG5kZWYgX2YoKTogcGFzc1xcbkZ1bmN0aW9uVHlwZSA9IHR5cGUoX2YpXFxuTGFtYmRhVHlwZSA9IHR5cGUobGFtYmRhOiBOb25lKSAgICAgICAgICMgU2FtZSBhcyBGdW5jdGlvblR5cGVcXG4jQ29kZVR5cGUgPSB0eXBlKF9mLmZ1bmNfY29kZSlcXG5cXG5kZWYgX2coKTpcXG4gICAgeWllbGQgMVxcbkdlbmVyYXRvclR5cGUgPSB0eXBlKF9nKCkpXFxuXFxuY2xhc3MgX0M6XFxuICAgIGRlZiBfbShzZWxmKTogcGFzc1xcbkNsYXNzVHlwZSA9IHR5cGUoX0MpXFxuVW5ib3VuZE1ldGhvZFR5cGUgPSB0eXBlKF9DLl9tKSAgICAgICAgICMgU2FtZSBhcyBNZXRob2RUeXBlXFxuX3ggPSBfQygpXFxuSW5zdGFuY2VUeXBlID0gdHlwZShfeClcXG5NZXRob2RUeXBlID0gdHlwZShfeC5fbSlcXG5CdWlsdGluRnVuY3Rpb25UeXBlID0gdHlwZShsZW4pXFxuQnVpbHRpbk1ldGhvZFR5cGUgPSB0eXBlKFtdLmFwcGVuZCkgICAgICMgU2FtZSBhcyBCdWlsdGluRnVuY3Rpb25UeXBlXFxuXFxuTW9kdWxlVHlwZSA9IHR5cGUoc3lzKVxcbkZpbGVUeXBlID0gZmlsZVxcbnRyeTpcXG4gICAgWFJhbmdlVHlwZSA9IHhyYW5nZVxcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIHBhc3NcXG5cXG4jIHRyeTpcXG4jICAgICByYWlzZSBUeXBlRXJyb3JcXG4jIGV4Y2VwdCBUeXBlRXJyb3I6XFxuIyAgICAgdGIgPSBzeXMuZXhjX2luZm8oKVsyXVxcbiMgICAgIFRyYWNlYmFja1R5cGUgPSB0eXBlKHRiKVxcbiMgICAgIEZyYW1lVHlwZSA9IHR5cGUodGIudGJfZnJhbWUpXFxuIyAgICAgZGVsIHRiXFxuXFxuU2xpY2VUeXBlID0gc2xpY2VcXG4jIEVsbGlwc2lzVHlwZSA9IHR5cGUoRWxsaXBzaXMpXFxuXFxuIyBEaWN0UHJveHlUeXBlID0gdHlwZShUeXBlVHlwZS5fX2RpY3RfXylcXG5Ob3RJbXBsZW1lbnRlZFR5cGUgPSB0eXBlKE5vdEltcGxlbWVudGVkKVxcblxcbiMgRm9yIEp5dGhvbiwgdGhlIGZvbGxvd2luZyB0d28gdHlwZXMgYXJlIGlkZW50aWNhbFxcbiMgR2V0U2V0RGVzY3JpcHRvclR5cGUgPSB0eXBlKEZ1bmN0aW9uVHlwZS5mdW5jX2NvZGUpXFxuIyBNZW1iZXJEZXNjcmlwdG9yVHlwZSA9IHR5cGUoRnVuY3Rpb25UeXBlLmZ1bmNfZ2xvYmFscylcXG5cXG5kZWwgc3lzLCBfZiwgX2csIF9DLCBfeCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm90IGZvciBleHBvcnRcXG5fX2FsbF9fID0gbGlzdChuIGZvciBuIGluIGdsb2JhbHMoKSBpZiBuWzoxXSAhPSAnXycpXFxuXCIsXCJzcmMvbGliL3VuaXR0ZXN0L19faW5pdF9fLnB5XCI6XCJfX2F1dGhvcl9fID0gJ2JtaWxsZXInXFxuJycnXFxuVGhpcyBpcyB0aGUgc3RhcnQgb2Ygc29tZXRoaW5nIHRoYXQgYmVoYXZlcyBsaWtlXFxudGhlIHVuaXR0ZXN0IG1vZHVsZSBmcm9tIGNweXRob24uXFxuXFxuJycnXFxuaW1wb3J0IHJlXFxuXFxuY2xhc3MgX0Fzc2VydFJhaXNlc0NvbnRleHQob2JqZWN0KTpcXG4gICAgXFxcIlxcXCJcXFwiQSBjb250ZXh0IG1hbmFnZXIgdXNlZCB0byBpbXBsZW1lbnQgVGVzdENhc2UuYXNzZXJ0UmFpc2VzKiBtZXRob2RzLlxcXCJcXFwiXFxcIlxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0ZWQsIHRlc3RfY2FzZSk6XFxuICAgICAgICBzZWxmLnRlc3RfY2FzZSA9IHRlc3RfY2FzZVxcbiAgICAgICAgc2VsZi5leHBlY3RlZCA9IGV4cGVjdGVkXFxuICAgICAgICBzZWxmLmV4Y2VwdGlvbiA9IE5vbmVcXG5cXG4gICAgZGVmIF9pc19zdWJ0eXBlKHNlbGYsIGV4cGVjdGVkLCBiYXNldHlwZSk6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkLCB0dXBsZSk6XFxuICAgICAgICAgICAgcmV0dXJuIGFsbChzZWxmLl9pc19zdWJ0eXBlKGUsIGJhc2V0eXBlKSBmb3IgZSBpbiBleHBlY3RlZClcXG4gICAgICAgIHJldHVybiBpc2luc3RhbmNlKGV4cGVjdGVkLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyhleHBlY3RlZCwgYmFzZXR5cGUpXFxuXFxuICAgIGRlZiBoYW5kbGUoc2VsZiwgYXJncywga3dhcmdzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgSWYgYXJncyBpcyBlbXB0eSwgYXNzZXJ0UmFpc2VzIGlzIGJlaW5nIHVzZWQgYXMgYVxcbiAgICAgICAgY29udGV4dCBtYW5hZ2VyLCBzbyByZXR1cm4gc2VsZi5cXG4gICAgICAgIElmIGFyZ3MgaXMgbm90IGVtcHR5LCBjYWxsIGEgY2FsbGFibGUgcGFzc2luZyBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkXFxuICAgICAgICBhcmd1bWVudHMuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBpZiBub3Qgc2VsZi5faXNfc3VidHlwZShzZWxmLmV4cGVjdGVkLCBCYXNlRXhjZXB0aW9uKTpcXG4gICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdhc3NlcnRSYWlzZXMoKSBhcmcgMSBtdXN0IGJlIGFuIGV4Y2VwdGlvbiB0eXBlIG9yIHR1cGxlIG9mIGV4Y2VwdGlvbiB0eXBlcycpXFxuICAgICAgICAgICAgaWYgbm90IGFyZ3M6XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICAgICAgICAgY2FsbGFibGVfb2JqID0gYXJnc1swXVxcbiAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzE6XVxcbiAgICAgICAgICAgIHdpdGggc2VsZjpcXG4gICAgICAgICAgICAgICAgY2FsbGFibGVfb2JqKCphcmdzLCAqKmt3YXJncykgXFxuXFxuICAgICAgICBmaW5hbGx5OlxcbiAgICAgICAgICAgICMgYnBvLTIzODkwOiBtYW51YWxseSBicmVhayBhIHJlZmVyZW5jZSBjeWNsZVxcbiAgICAgICAgICAgIHNlbGYgPSBOb25lXFxuXFxuICAgIGRlZiBfX2VudGVyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdGIpOlxcbiAgICAgICAgcmVzID0gVHJ1ZVxcbiAgICAgICAgZmVlZGJhY2sgPSBcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5leGNlcHRpb24gPSBleGNfdmFsdWVcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBhY3RfZXhjID0gZXhjX3R5cGUuX19uYW1lX19cXG4gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjpcXG4gICAgICAgICAgICBhY3RfZXhjID0gc3RyKGV4Y190eXBlKVxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIGV4cF9leGMgPSBzZWxmLmV4cGVjdGVkLl9fbmFtZV9fXFxuICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuICAgICAgICAgICAgZXhwX2V4YyA9IHN0cihzZWxmLmV4cGVjdGVkKVxcblxcbiAgICAgICAgaWYgZXhjX3R5cGUgaXMgTm9uZTpcXG4gICAgICAgICAgICByZXMgPSBGYWxzZVxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcInt9IG5vdCByYWlzZWRcXFwiLmZvcm1hdChleHBfZXhjKVxcbiAgICAgICAgZWxpZiBub3QgaXNzdWJjbGFzcyhleGNfdHlwZSwgc2VsZi5leHBlY3RlZCk6XFxuICAgICAgICAgICAgcmVzID0gRmFsc2VcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCB7fSBidXQgZ290IHt9XFxcIi5mb3JtYXQoZXhwX2V4YywgYWN0X2V4YylcXG5cXG4gICAgICAgIHNlbGYudGVzdF9jYXNlLmFwcGVuZFJlc3VsdChyZXMsIGFjdF9leGMsIGV4cF9leGMsIGZlZWRiYWNrKVxcbiAgICAgICAgcmV0dXJuIFRydWVcXG5cXG5cXG5jbGFzcyBUZXN0Q2FzZShvYmplY3QpOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLm51bVBhc3NlZCA9IDBcXG4gICAgICAgIHNlbGYubnVtRmFpbGVkID0gMFxcbiAgICAgICAgc2VsZi5hc3NlcnRQYXNzZWQgPSAwXFxuICAgICAgICBzZWxmLmFzc2VydEZhaWxlZCA9IDBcXG4gICAgICAgIHNlbGYudmVyYm9zaXR5ID0gMVxcbiAgICAgICAgc2VsZi50bGlzdCA9IFtdXFxuICAgICAgICB0ZXN0TmFtZXMgPSB7fVxcbiAgICAgICAgZm9yIG5hbWUgaW4gZGlyKHNlbGYpOlxcbiAgICAgICAgICAgIGlmIG5hbWVbOjRdID09ICd0ZXN0JyBhbmQgbmFtZSBub3QgaW4gdGVzdE5hbWVzOlxcbiAgICAgICAgICAgICAgICBzZWxmLnRsaXN0LmFwcGVuZChnZXRhdHRyKHNlbGYsbmFtZSkpXFxuICAgICAgICAgICAgICAgIHRlc3ROYW1lc1tuYW1lXT1UcnVlXFxuXFxuICAgIGRlZiBzZXRVcChzZWxmKTpcXG4gICAgICAgIHBhc3NcXG5cXG4gICAgZGVmIHRlYXJEb3duKHNlbGYpOlxcbiAgICAgICAgcGFzc1xcbiAgICBcXG4gICAgZGVmIGNsZWFuTmFtZShzZWxmLGZ1bmNOYW1lKTpcXG4gICAgICAgIHJldHVybiBmdW5jTmFtZS5fX2Z1bmNfXy5fX25hbWVfX1xcblxcbiAgICBkZWYgbWFpbihzZWxmKTpcXG5cXG4gICAgICAgIGZvciBmdW5jIGluIHNlbGYudGxpc3Q6XFxuICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NpdHkgPiAxOlxcbiAgICAgICAgICAgICAgICBwcmludCgnUnVubmluZyAlcycgJSBzZWxmLmNsZWFuTmFtZShmdW5jKSlcXG4gICAgICAgICAgICB0cnk6XFxuICAgICAgICAgICAgICAgIHNlbGYuc2V0VXAoKVxcbiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFBhc3NlZCA9IDBcXG4gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgPSAwXFxuICAgICAgICAgICAgICAgIGZ1bmMoKVxcbiAgICAgICAgICAgICAgICBzZWxmLnRlYXJEb3duKClcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5hc3NlcnRGYWlsZWQgPT0gMDpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYubnVtUGFzc2VkICs9IDFcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYubnVtRmFpbGVkICs9IDFcXG4gICAgICAgICAgICAgICAgICAgIHByaW50KCdUZXN0cyBmYWlsZWQgaW4gJXMgJyAlIHNlbGYuY2xlYW5OYW1lKGZ1bmMpKVxcbiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgKz0gMVxcbiAgICAgICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuICAgICAgICAgICAgICAgIHByaW50KCdUZXN0IHRocmV3IGV4Y2VwdGlvbiBpbiAlcyAoJXMpJyAlIChzZWxmLmNsZWFuTmFtZShmdW5jKSwgZSkpXFxuICAgICAgICBzZWxmLnNob3dTdW1tYXJ5KClcXG5cXG4gICAgZGVmIGFzc2VydEVxdWFsKHNlbGYsIGFjdHVhbCwgZXhwZWN0ZWQsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGFjdHVhbD09ZXhwZWN0ZWRcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGVxdWFsICVzXFxcIiAlIChzdHIoYWN0dWFsKSxzdHIoZXhwZWN0ZWQpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhY3R1YWwgLGV4cGVjdGVkLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdEVxdWFsKHNlbGYsIGFjdHVhbCwgZXhwZWN0ZWQsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGFjdHVhbCAhPSBleHBlY3RlZFxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gbm90IGVxdWFsICVzXFxcIiAlIChzdHIoYWN0dWFsKSxzdHIoZXhwZWN0ZWQpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhY3R1YWwsIGV4cGVjdGVkLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydFRydWUoc2VsZix4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBib29sKHgpIGlzIFRydWVcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIFRydWVcXFwiICUgKHN0cih4KSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgeCwgVHJ1ZSwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRGYWxzZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IG5vdCBib29sKHgpXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBGYWxzZVxcXCIgJSAoc3RyKHgpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCB4LCBGYWxzZSwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRJcyhzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSBpcyBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSB0aGUgc2FtZSBvYmplY3QgYXMgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXNOb3Qoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgaXMgbm90IGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBiZSB0aGUgc2FtZSBvYmplY3QgYXMgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXNOb25lKHNlbGYseCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0geCBpcyBOb25lXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBOb25lXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIE5vbmUsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXNOb3ROb25lKHNlbGYseCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0geCBpcyBub3QgTm9uZVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gbm90IGJlIE5vbmVcXFwiICUgKHN0cih4KSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgeCwgTm9uZSwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRJbihzZWxmLCBhLCBiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIGluIGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIGluICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdEluKHNlbGYsIGEsIGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgbm90IGluIGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBiZSBpbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRJc0luc3RhbmNlKHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBpc2luc3RhbmNlKGEsYilcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIGFuIGluc3RhbmNlIG9mICVzXFxcIiAlIChzdHIoYSksIHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RJc0luc3RhbmNlKHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBub3QgaXNpbnN0YW5jZShhLGIpXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgYW4gaW5zdGFuY2Ugb2YgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0UmVnZXgoc2VsZiwgdGV4dCwgZXhwZWN0ZWRfcmVnZXgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZhaWwgdGhlIHRlc3QgdW5sZXNzIHRoZSB0ZXh0IG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWRfcmVnZXgsIChzdHIsICkpOiAjYnl0ZXNcXG4gICAgICAgICAgICBhc3NlcnQgZXhwZWN0ZWRfcmVnZXgsIFxcXCJleHBlY3RlZF9yZWdleCBtdXN0IG5vdCBiZSBlbXB0eS5cXFwiXFxuICAgICAgICAgICAgZXhwZWN0ZWRfcmVnZXggPSByZS5jb21waWxlKGV4cGVjdGVkX3JlZ2V4KVxcbiAgICAgICAgaWYgbm90IGV4cGVjdGVkX3JlZ2V4LnNlYXJjaCh0ZXh0KTpcXG4gICAgICAgICAgICByZXMgPSBGYWxzZVxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIlJlZ2V4IGRpZG4ndCBtYXRjaDogJXIgbm90IGZvdW5kIGluICVyXFxcIiAlIChcXG4gICAgICAgICAgICAgICAgcmVwcihleHBlY3RlZF9yZWdleCksIHRleHQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJlcyA9IFRydWVcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgdGV4dCwgZXhwZWN0ZWRfcmVnZXgsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0Tm90UmVnZXgoc2VsZiwgdGV4dCwgdW5leHBlY3RlZF9yZWdleCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRmFpbCB0aGUgdGVzdCBpZiB0aGUgdGV4dCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKHVuZXhwZWN0ZWRfcmVnZXgsIChzdHIsICkpOiAjIGJ5dGVzXFxuICAgICAgICAgICAgdW5leHBlY3RlZF9yZWdleCA9IHJlLmNvbXBpbGUodW5leHBlY3RlZF9yZWdleClcXG4gICAgICAgIG1hdGNoID0gdW5leHBlY3RlZF9yZWdleC5zZWFyY2godGV4dClcXG4gICAgICAgIGlmIG1hdGNoOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gJ1JlZ2V4IG1hdGNoZWQ6ICVyIG1hdGNoZXMgJXIgaW4gJXInICUgKFxcbiAgICAgICAgICAgICAgICB0ZXh0W21hdGNoLnN0YXJ0KCkgOiBtYXRjaC5lbmQoKV0sXFxuICAgICAgICAgICAgICAgIHJlcHIodW5leHBlY3RlZF9yZWdleCksXFxuICAgICAgICAgICAgICAgIHRleHQpXFxuICAgICAgICAgICAgIyBfZm9ybWF0TWVzc2FnZSBlbnN1cmVzIHRoZSBsb25nTWVzc2FnZSBvcHRpb24gaXMgcmVzcGVjdGVkXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChub3QgYm9vbChtYXRjaCksIHRleHQsIHVuZXhwZWN0ZWRfcmVnZXgsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0QWxtb3N0RXF1YWwoc2VsZiwgYSwgYiwgcGxhY2VzPTcsIGZlZWRiYWNrPVxcXCJcXFwiLCBkZWx0YT1Ob25lKTpcXG5cXG4gICAgICAgIGlmIGRlbHRhIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIHJlcyA9IGFicyhhLWIpIDw9IGRlbHRhXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHBsYWNlcyBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICBwbGFjZXMgPSA3XFxuICAgICAgICAgICAgcmVzID0gcm91bmQoYS1iLCBwbGFjZXMpID09IDBcXG4gICAgICAgIFxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gZXF1YWwgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0Tm90QWxtb3N0RXF1YWwoc2VsZiwgYSwgYiwgcGxhY2VzPTcsIGZlZWRiYWNrPVxcXCJcXFwiLCBkZWx0YT1Ob25lKTpcXG5cXG4gICAgICAgIGlmIGRlbHRhIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIHJlcyA9IG5vdCAoYSA9PSBiKSBhbmQgYWJzKGEgLSBiKSA+IGRlbHRhXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHBsYWNlcyBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICBwbGFjZXMgPSA3XFxuXFxuICAgICAgICAgICAgcmVzID0gcm91bmQoYS1iLCBwbGFjZXMpICE9IDBcXG5cXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBlcXVhbCAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRHcmVhdGVyKHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhID4gYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgZ3JlYXRlciB0aGFuICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydEdyZWF0ZXJFcXVhbChzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA+PSBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSA+PSAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRMZXNzKHNlbGYsIGEsIGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgPCBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBsZXNzIHRoYW4gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0TGVzc0VxdWFsKHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIDw9IGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIDw9ICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFwcGVuZFJlc3VsdChzZWxmLHJlcyxhY3R1YWwsZXhwZWN0ZWQsZmVlZGJhY2spOlxcbiAgICAgICAgaWYgcmVzOlxcbiAgICAgICAgICAgIG1zZyA9ICdQYXNzJ1xcbiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UGFzc2VkICs9IDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbXNnID0gJ0ZhaWw6ICcgKyAgZmVlZGJhY2tcXG4gICAgICAgICAgICBwcmludChtc2cpXFxuICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgKz0gMVxcblxcbiAgICBkZWYgYXNzZXJ0UmFpc2VzKHNlbGYsIGV4cGVjdGVkX2V4Y2VwdGlvbiwgKmFyZ3MsICoqa3dhcmdzKTpcXG4gICAgICAgIGNvbnRleHQgPSBfQXNzZXJ0UmFpc2VzQ29udGV4dChleHBlY3RlZF9leGNlcHRpb24sIHNlbGYpXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuaGFuZGxlKGFyZ3MsIGt3YXJncylcXG4gICAgICAgIGZpbmFsbHk6XFxuICAgICAgICAgICAgIyBicG8tMjM4OTA6IG1hbnVhbGx5IGJyZWFrIGEgcmVmZXJlbmNlIGN5Y2xlXFxuICAgICAgICAgICAgY29udGV4dCA9IE5vbmVcXG5cXG4gICAgZGVmIGZhaWwoc2VsZiwgbXNnPU5vbmUpOlxcbiAgICAgICAgaWYgbXNnIGlzIE5vbmU6XFxuICAgICAgICAgICAgbXNnID0gJ0ZhaWwnXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG1zZyA9ICdGYWlsOiAnICsgbXNnXFxuICAgICAgICBwcmludChtc2cpXFxuICAgICAgICBzZWxmLmFzc2VydEZhaWxlZCArPSAxXFxuXFxuICAgIGRlZiBzaG93U3VtbWFyeShzZWxmKTpcXG4gICAgICAgIHBjdCA9IHNlbGYubnVtUGFzc2VkIC8gKHNlbGYubnVtUGFzc2VkK3NlbGYubnVtRmFpbGVkKSAqIDEwMFxcbiAgICAgICAgcHJpbnQoXFxcIlJhbiAlZCB0ZXN0cywgcGFzc2VkOiAlZCBmYWlsZWQ6ICVkXFxcXG5cXFwiICUgKHNlbGYubnVtUGFzc2VkK3NlbGYubnVtRmFpbGVkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5udW1QYXNzZWQsIHNlbGYubnVtRmFpbGVkKSlcXG5cXG5cXG5cXG5kZWYgbWFpbih2ZXJib3NpdHk9MSk6XFxuICAgIGdsb2IgPSBnbG9iYWxzKCkgIyBnbG9iYWxzKCkgc3RpbGwgbmVlZHMgd29ya1xcbiAgICBmb3IgbmFtZSBpbiBnbG9iOlxcbiAgICAgICAgaWYgdHlwZShnbG9iW25hbWVdKSA9PSB0eXBlIGFuZCBpc3N1YmNsYXNzKGdsb2JbbmFtZV0sIFRlc3RDYXNlKTpcXG4gICAgICAgICAgICB0cnk6XFxuICAgICAgICAgICAgICAgIHRjID0gZ2xvYltuYW1lXSgpXFxuICAgICAgICAgICAgICAgIHRjLnZlcmJvc2l0eSA9IHZlcmJvc2l0eVxcbiAgICAgICAgICAgICAgICB0Yy5tYWluKClcXG4gICAgICAgICAgICBleGNlcHQ6XFxuICAgICAgICAgICAgICAgIHByaW50KFxcXCJVbmNhdWdodCBFcnJvciBpbjogXFxcIiwgbmFtZSlcXG5cIixcInNyYy9saWIvdW5pdHRlc3QvZ3VpLnB5XCI6XCJpbXBvcnQgZG9jdW1lbnRcXG5mcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZVxcbmZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW5cXG5mcm9tIHRpbWUgaW1wb3J0IHNsZWVwXFxuXFxuXFxuY2xhc3MgVGVzdENhc2VHdWkoVGVzdENhc2UpOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBUZXN0Q2FzZS5fX2luaXRfXyhzZWxmKVxcbiAgICAgICAgc2VsZi5jbG9zZXN0RGl2ID0gZG9jdW1lbnQuY3VycmVudERpdigpXFxuICAgICAgICBzZWxmLmRpdmlkID0gZG9jdW1lbnQuY3VycmVudEdyYWRpbmdDb250YWluZXIoKVxcbiAgICAgICAgc2VsZi5teWRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZGl2aWQpXFxuICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpdiB0aGVuIGNyZWF0ZSBhIGR1bW15IHRvIGF2b2lkIGVycm9ycyB3aGVuIHJ1bm5pbmdcXG4gICAgICAgICMgZ3JhZGluZyBcXFwib2ZmIHNjcmVlblxcXCJcXG4gICAgICAgIGlmIHNlbGYubXlkaXYgaXMgTm9uZTpcXG4gICAgICAgICAgICBzZWxmLm15ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiZGl2XFxcIilcXG4gICAgICAgICAgICBzZWxmLm15ZGl2LnNldEF0dHJpYnV0ZShcXFwiaWRcXFwiLCBzZWxmLmRpdmlkICsgXFxcIl9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzXFxcIilcXG4gICAgICAgICAgICBzZWxmLm15ZGl2LnNldENTUyhcXFwiZGlzcGxheVxcXCIsIFxcXCJub25lXFxcIilcXG4gICAgICAgICAgICBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXFxcImJvZHlcXFwiKVswXVxcbiAgICAgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoc2VsZi5teWRpdilcXG4gICAgICAgICAgICBzZWxmLnVuaXRfcmVzdWx0c19kaXZpZCA9IHNlbGYuZGl2aWQgKyBcXFwiX29mZnNjcmVlbl91bml0X3Jlc3VsdHNcXFwiXFxuXFxuICAgICAgICByZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxmLmRpdmlkICsgXFxcIl91bml0X3Jlc3VsdHNcXFwiKVxcbiAgICAgICAgaWYgcmVzOlxcbiAgICAgICAgICAgIHNlbGYucmVzZGl2ID0gcmVzXFxuICAgICAgICAgICAgcmVzLmlubmVySFRNTCA9IFxcXCJcXFwiXFxuICAgICAgICAgICAgc2VsZi51bml0X3Jlc3VsdHNfZGl2aWQgPSBzZWxmLmRpdmlkICsgXFxcIl91bml0X3Jlc3VsdHNcXFwiXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYucmVzZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiZGl2XFxcIilcXG4gICAgICAgICAgICBzZWxmLnJlc2Rpdi5zZXRBdHRyaWJ1dGUoXFxcImlkXFxcIiwgc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIilcXG4gICAgICAgICAgICBzZWxmLnJlc2Rpdi5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcInVuaXR0ZXN0LXJlc3VsdHNcXFwiKVxcbiAgICAgICAgICAgIHNlbGYubXlkaXYuYXBwZW5kQ2hpbGQoc2VsZi5yZXNkaXYpXFxuICAgICAgICAgICAgc2VsZi51bml0X3Jlc3VsdHNfZGl2aWQgPSBzZWxmLmRpdmlkICsgXFxcIl91bml0X3Jlc3VsdHNcXFwiXFxuXFxuICAgIGRlZiBtYWluKHNlbGYpOlxcbiAgICAgICAgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRhYmxlXFxcIilcXG4gICAgICAgIHNlbGYucmVzVGFibGUgPSB0XFxuICAgICAgICB4ID0gc2VsZi5yZXNkaXYuY2xvc2VzdChcXFwiLnRpbWVkQ29tcG9uZW50XFxcIilcXG4gICAgICAgIGlmIHg6XFxuICAgICAgICAgICAgc2VsZi5pc190aW1lZCA9IFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5pc190aW1lZCA9IEZhbHNlXFxuICAgICAgICBzZWxmLnJlc2Rpdi5hcHBlbmRDaGlsZChzZWxmLnJlc1RhYmxlKVxcbiAgICAgICAgaWYgc2VsZi5pc190aW1lZDpcXG4gICAgICAgICAgICBzZWxmLnJlc2Rpdi5zZXRDU1MoXFxcImRpc3BsYXlcXFwiLCBcXFwibm9uZVxcXCIpXFxuXFxuICAgICAgICBoZWFkZXJzID0gW1xcXCJSZXN1bHRcXFwiLCBcXFwiQWN0dWFsIFZhbHVlXFxcIiwgXFxcIkV4cGVjdGVkIFZhbHVlXFxcIiwgXFxcIk5vdGVzXFxcIl1cXG4gICAgICAgIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRyXFxcIilcXG4gICAgICAgIGZvciBpdGVtIGluIGhlYWRlcnM6XFxuICAgICAgICAgICAgaGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRoXFxcIilcXG4gICAgICAgICAgICBoZWFkLnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcbiAgICAgICAgICAgIGhlYWQuaW5uZXJIVE1MID0gaXRlbVxcbiAgICAgICAgICAgIGhlYWQuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGhlYWQpXFxuICAgICAgICBzZWxmLnJlc1RhYmxlLmFwcGVuZENoaWxkKHJvdylcXG5cXG4gICAgICAgIGZvciBmdW5jIGluIHNlbGYudGxpc3Q6XFxuICAgICAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgICAgICBzZWxmLnNldFVwKClcXG4gICAgICAgICAgICAgICAgZnVuYygpXFxuICAgICAgICAgICAgICAgIHNlbGYudGVhckRvd24oKVxcbiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQoXFxcIkVycm9yXFxcIiwgTm9uZSwgTm9uZSwgc3RyKGUpLnNwbGl0KFxcXCJvbiBsaW5lXFxcIilbMF0pXFxuICAgICAgICAgICAgICAgIHNlbGYubnVtRmFpbGVkICs9IDFcXG4gICAgICAgIHNlbGYuc2hvd1N1bW1hcnkoKVxcblxcbiAgICBkZWYgZ2V0T3V0cHV0KHNlbGYpOlxcbiAgICAgICAgc2xlZXAoMC4yKVxcbiAgICAgICAgIyBzZWxmLmRpdmlkIHdpbGwgYmUgdGhlIGdyYWRpbmdXcmFwcGVyIHdoZW4gaW4gZ3JhZGluZyBtb2RlXFxuICAgICAgICBpZiBzZWxmLmNsb3Nlc3REaXYgIT0gc2VsZi5kaXZpZDpcXG4gICAgICAgICAgICBvdXRwdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxcbiAgICAgICAgICAgICAgICBcXFwiI3t9ICN7fV9zdGRvdXRcXFwiLmZvcm1hdChzZWxmLmRpdmlkLCBzZWxmLmNsb3Nlc3REaXYpXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBvdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxmLmRpdmlkICsgXFxcIl9zdGRvdXRcXFwiKVxcbiAgICAgICAgcmV0dXJuIG91dHB1dC5pbm5lclRleHRcXG5cXG4gICAgZGVmIGdldEVkaXRvclRleHQoc2VsZik6XFxuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0Q3VycmVudEVkaXRvclZhbHVlKClcXG5cXG4gICAgZGVmIGFwcGVuZFJlc3VsdChzZWxmLCByZXMsIGFjdHVhbCwgZXhwZWN0ZWQsIHBhcmFtKTpcXG4gICAgICAgIHRyaW1BY3R1YWwgPSBGYWxzZVxcbiAgICAgICAgaWYgbGVuKHN0cihhY3R1YWwpKSA+IDE1OlxcbiAgICAgICAgICAgIHRyaW1BY3R1YWwgPSBUcnVlXFxuICAgICAgICAgICAgYWN0dWFsVHlwZSA9IHR5cGUoYWN0dWFsKVxcbiAgICAgICAgdHJpbUV4cGVjdGVkID0gRmFsc2VcXG4gICAgICAgIGlmIGxlbihzdHIoZXhwZWN0ZWQpKSA+IDE1OlxcbiAgICAgICAgICAgIHRyaW1FeHBlY3RlZCA9IFRydWVcXG4gICAgICAgICAgICBleHBlY3RlZFR5cGUgPSB0eXBlKGV4cGVjdGVkKVxcbiAgICAgICAgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidHJcXFwiKVxcbiAgICAgICAgZXJyID0gRmFsc2VcXG4gICAgICAgIGlmIHJlcyA9PSBcXFwiRXJyb3JcXFwiOlxcbiAgICAgICAgICAgIGVyciA9IFRydWVcXG4gICAgICAgICAgICBtc2cgPSBcXFwiRXJyb3I6ICVzXFxcIiAlIHBhcmFtXFxuICAgICAgICAgICAgZXJyb3JEYXRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgICAgIGVycm9yRGF0YS5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBlcnJvckRhdGEuaW5uZXJIVE1MID0gXFxcIkVSUk9SXFxcIlxcbiAgICAgICAgICAgIGVycm9yRGF0YS5zZXRDU1MoXFxcImJhY2tncm91bmQtY29sb3JcXFwiLCBcXFwiI2RlOGU5NlxcXCIpXFxuICAgICAgICAgICAgZXJyb3JEYXRhLnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChlcnJvckRhdGEpXFxuICAgICAgICBlbGlmIHJlczpcXG4gICAgICAgICAgICBwYXNzZWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICAgICAgcGFzc2VkLnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcbiAgICAgICAgICAgIHBhc3NlZC5pbm5lckhUTUwgPSBcXFwiUGFzc1xcXCJcXG4gICAgICAgICAgICBwYXNzZWQuc2V0Q1NTKFxcXCJiYWNrZ3JvdW5kLWNvbG9yXFxcIiwgXFxcIiM4M2QzODJcXFwiKVxcbiAgICAgICAgICAgIHBhc3NlZC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQocGFzc2VkKVxcbiAgICAgICAgICAgIHNlbGYubnVtUGFzc2VkICs9IDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgZmFpbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgICAgICBmYWlsLnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcbiAgICAgICAgICAgIGZhaWwuaW5uZXJIVE1MID0gXFxcIkZhaWxcXFwiXFxuICAgICAgICAgICAgZmFpbC5zZXRDU1MoXFxcImJhY2tncm91bmQtY29sb3JcXFwiLCBcXFwiI2RlOGU5NlxcXCIpXFxuICAgICAgICAgICAgZmFpbC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoZmFpbClcXG4gICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuXFxuICAgICAgICBhY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICBhY3Quc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuICAgICAgICBpZiB0cmltQWN0dWFsOlxcbiAgICAgICAgICAgIGFjdEhUTUwgPSBzdHIoYWN0dWFsKVs6NV0gKyBcXFwiLi4uXFxcIiArIHN0cihhY3R1YWwpWy01Ol1cXG4gICAgICAgICAgICBpZiBhY3R1YWxUeXBlID09IHN0cjpcXG4gICAgICAgICAgICAgICAgYWN0SFRNTCA9IHJlcHIoYWN0SFRNTClcXG4gICAgICAgICAgICBhY3QuaW5uZXJIVE1MID0gYWN0SFRNTFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBhY3QuaW5uZXJIVE1MID0gcmVwcihhY3R1YWwpXFxuICAgICAgICBhY3Quc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICByb3cuYXBwZW5kQ2hpbGQoYWN0KVxcblxcbiAgICAgICAgZXhwZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgZXhwZWN0LnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcblxcbiAgICAgICAgaWYgdHJpbUV4cGVjdGVkOlxcbiAgICAgICAgICAgIGV4cGVjdGVkSFRNTCA9IHN0cihleHBlY3RlZClbOjVdICsgXFxcIi4uLlxcXCIgKyBzdHIoZXhwZWN0ZWQpWy01Ol1cXG4gICAgICAgICAgICBpZiBleHBlY3RlZFR5cGUgPT0gc3RyOlxcbiAgICAgICAgICAgICAgICBleHBlY3RlZEhUTUwgPSByZXByKGV4cGVjdGVkSFRNTClcXG4gICAgICAgICAgICBleHBlY3QuaW5uZXJIVE1MID0gZXhwZWN0ZWRIVE1MXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGV4cGVjdC5pbm5lckhUTUwgPSByZXByKGV4cGVjdGVkKVxcbiAgICAgICAgZXhwZWN0LnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKGV4cGVjdClcXG4gICAgICAgIGlucCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgIGlucC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG5cXG4gICAgICAgIGlmIGVycjpcXG4gICAgICAgICAgICBpbnAuaW5uZXJIVE1MID0gbXNnXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlucC5pbm5lckhUTUwgPSBwYXJhbVxcbiAgICAgICAgaW5wLnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKGlucClcXG5cXG4gICAgICAgIGlmIHRyaW1BY3R1YWwgb3IgdHJpbUV4cGVjdGVkOlxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImJ1dHRvblxcXCIpXFxuICAgICAgICAgICAgZXhwYW5kYnV0dG9uLmlubmVySFRNTCA9IFxcXCJFeHBhbmQgRGlmZmVyZW5jZXNcXFwiXFxuICAgICAgICAgICAgZXhwYW5kbXNnID0gXFxcIkFjdHVhbDogXFxcIiArIHN0cihhY3R1YWwpICsgXFxcIlxcXFxuRXhwZWN0ZWQ6IFxcXCIgKyBzdHIoZXhwZWN0ZWQpXFxuICAgICAgICAgICAgZXhwYW5kYnV0dG9uLnNldEF0dHJpYnV0ZShcXFwidmFsdWVcXFwiLCBleHBhbmRtc2cpXFxuICAgICAgICAgICAgZXhwYW5kYnV0dG9uLnNldEF0dHJpYnV0ZShcXFwidHlwZVxcXCIsIFxcXCJidXR0b25cXFwiKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcIm9uY2xpY2tcXFwiLCBcXFwiYWxlcnQodGhpcy52YWx1ZSlcXFwiKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImJ0biBidG4taW5mb1xcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGV4cGFuZGJ1dHRvbilcXG5cXG4gICAgICAgIHNlbGYucmVzVGFibGUuYXBwZW5kQ2hpbGQocm93KVxcblxcbiAgICBkZWYgc2hvd1N1bW1hcnkoc2VsZik6XFxuICAgICAgICBwY3QgPSBmbG9hdChzZWxmLm51bVBhc3NlZCkgLyAoc2VsZi5udW1QYXNzZWQgKyBzZWxmLm51bUZhaWxlZCkgKiAxMDBcXG4gICAgICAgIHBjdGNvcnJlY3QgPSAoXFxuICAgICAgICAgICAgXFxcInBlcmNlbnQ6XFxcIlxcbiAgICAgICAgICAgICsgc3RyKHBjdClcXG4gICAgICAgICAgICArIFxcXCI6cGFzc2VkOlxcXCJcXG4gICAgICAgICAgICArIHN0cihzZWxmLm51bVBhc3NlZClcXG4gICAgICAgICAgICArIFxcXCI6ZmFpbGVkOlxcXCJcXG4gICAgICAgICAgICArIHN0cihzZWxmLm51bUZhaWxlZClcXG4gICAgICAgIClcXG4gICAgICAgIHBUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJwXFxcIilcXG4gICAgICAgIGlmIG5vdCBzZWxmLmlzX3RpbWVkOlxcbiAgICAgICAgICAgIHBUYWcuaW5uZXJIVE1MID0gXFxcIllvdSBwYXNzZWQ6IFxcXCIgKyBzdHIocGN0KSArIFxcXCIlIG9mIHRoZSB0ZXN0c1xcXCJcXG4gICAgICAgICAgICBzZWxmLnJlc2Rpdi5hcHBlbmRDaGlsZChwVGFnKVxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIGpzZXZhbChcXFwid2luZG93LmVkTGlzdFsne30nXS5wY3RfY29ycmVjdCA9IHt9XFxcIi5mb3JtYXQoc2VsZi5jbG9zZXN0RGl2LCBwY3QpKVxcbiAgICAgICAgICAgIGpzZXZhbChcXG4gICAgICAgICAgICAgICAgXFxcIndpbmRvdy5lZExpc3RbJ3t9J10udW5pdF9yZXN1bHRzID0gJ3t9J1xcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZXN0RGl2LCBwY3Rjb3JyZWN0XFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICApXFxuICAgICAgICAgICAganNldmFsKFxcbiAgICAgICAgICAgICAgICBcXFwid2luZG93LmVkTGlzdFsne30nXS51bml0X3Jlc3VsdHNfZGl2aWQgPSAne30nXFxcIi5mb3JtYXQoXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3Nlc3REaXYsIHNlbGYubXlkaXYuZ2V0QXR0cmlidXRlKFxcXCJpZFxcXCIpXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICApXFxuXFxuICAgICAgICBleGNlcHQ6XFxuICAgICAgICAgICAgcHJpbnQoXFxuICAgICAgICAgICAgICAgIFxcXCJmYWlsZWQgdG8gZmluZCBvYmplY3QgdG8gcmVjb3JkIHVuaXR0ZXN0IHJlc3VsdHMhIHt9XFxcIi5mb3JtYXQoXFxuICAgICAgICAgICAgICAgICAgICBwY3Rjb3JyZWN0XFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICApXFxuXCIsXCJzcmMvbGliL3VybGxpYi9fX2luaXRfXy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7cmV0dXJue319O1wiLFwic3JjL2xpYi91cmxsaWIvcmVxdWVzdC9fX2luaXRfXy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e307YS5SZXNwb25zZT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLmRhdGEkPWIucmVzcG9uc2VUZXh0LGEubGluZUxpc3Q9YS5kYXRhJC5zcGxpdChcXFwiXFxcXG5cXFwiKSxhLmxpbmVMaXN0PWEubGluZUxpc3Quc2xpY2UoMCwtMSk7Zm9yKHZhciBjPTA7YzxhLmxpbmVMaXN0Lmxlbmd0aDtjKyspYS5saW5lTGlzdFtjXSs9XFxcIlxcXFxuXFxcIjthLmN1cnJlbnRMaW5lPTAsYS5wb3MkPTB9KSxiLl9fc3RyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5mZmkucmVtYXBUb1B5KFxcXCI8UmVzcG9uc2U+XFxcIil9KSxiLl9faXRlcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS5saW5lTGlzdDtyZXR1cm4gU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGluZGV4Pj10aGlzLiRsaW5lcy5sZW5ndGg/dm9pZCAwOm5ldyBTay5idWlsdGluLnN0cih0aGlzLiRsaW5lc1t0aGlzLiRpbmRleCsrXSl9LHskb2JqOmEsJGluZGV4OjAsJGxpbmVzOmJ9KX0pLGIucmVhZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7aWYoYS5jbG9zZWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVxcXCIpO3ZhciBjPWEuZGF0YSQubGVuZ3RoO3ZvaWQgMD09PWImJihiPWMpO3ZhciBkPW5ldyBTay5idWlsdGluLnN0cihhLmRhdGEkLnN1YnN0cihhLnBvcyQsYikpO3JldHVybiBhLnBvcyQrPWIsYS5wb3MkPj1jJiYoYS5wb3MkPWMpLGR9KSxiLnJlYWRsaW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9XFxcIlxcXCI7cmV0dXJuIGEuY3VycmVudExpbmU8YS5saW5lTGlzdC5sZW5ndGgmJihiPWEubGluZUxpc3RbYS5jdXJyZW50TGluZV0sYS5jdXJyZW50TGluZSsrKSxuZXcgU2suYnVpbHRpbi5zdHIoYil9KSxiLnJlYWRsaW5lcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPWEuY3VycmVudExpbmU7YzxhLmxpbmVMaXN0Lmxlbmd0aDtjKyspYi5wdXNoKG5ldyBTay5idWlsdGluLnN0cihhLmxpbmVMaXN0W2NdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9KX0sXFxcIlJlc3BvbnNlXFxcIixbXSk7dmFyIGI9ZnVuY3Rpb24oYSl7dmFyIGI7aWYoIVNrLmpzb25wU2l0ZXMpcmV0dXJuITE7Zm9yKGI9MDtiPFNrLmpzb25wU2l0ZXMubGVuZ3RoO2IrKylpZihhLnN0YXJ0c1dpdGgoU2suanNvbnBTaXRlc1tiXSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiBhLnVybG9wZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihjLGQpe3ZhciBlPWIoYy52KT9uZXcgUHJvbWlzZShmdW5jdGlvbihiLGQpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInNjcmlwdFxcXCIpO2Uuc3JjPWMuditcXFwiJmNhbGxiYWNrPVNrLmpzb25wY2FsbGJhY2tcXFwiLGUub25lcnJvcj1mdW5jdGlvbigpe2QoXFxcIkFuIGVycm9yIG9jY3VyZWQgZ2V0dGluZyB0aGUgZGF0YVxcXCIpfSxTay5qc29ucGNhbGxiYWNrPWZ1bmN0aW9uKGMpe3ZhciBkPXtyZXNwb25zZVRleHQ6SlNPTi5zdHJpbmdpZnkoYyl9O2IoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuUmVzcG9uc2UsW2RdKSl9O3RyeXtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpfWNhdGNoKGEpe2NvbnNvbGUubG9nKFxcXCJjYXVnaHQgZXJyb3IgaW4gdXJsb3BlblxcXCIrYSl9fSk6bmV3IFByb21pc2UoZnVuY3Rpb24oYil7dmFyIGU9bmV3IFhNTEh0dHBSZXF1ZXN0O2UuYWRkRXZlbnRMaXN0ZW5lcihcXFwibG9hZGVuZFxcXCIsZnVuY3Rpb24oKXtiKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlJlc3BvbnNlLFtlXSkpfSksZD8oZS5vcGVuKFxcXCJQT1NUXFxcIixjLnYpLGUuc2V0UmVxdWVzdEhlYWRlcihcXFwiQ29udGVudC10eXBlXFxcIixcXFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXFxcIiksZS5zZW5kKGQudikpOihlLm9wZW4oXFxcIkdFVFxcXCIsYy52KSxlLnNlbmQobnVsbCkpfSk7dmFyIGY9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247cmV0dXJuIGYucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHJlc29sdXRpb259LGYuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTplLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIHJlc29sdXRpb249YSxhfSxmdW5jdGlvbihhKXtyZXR1cm4gcmVzb2x1dGlvbj1cXFwiXFxcIixhfSl9LGZ9KSxhfTtcIixcInNyYy9saWIvdXJsbGliMi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXJsbGliMiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3VybHBhcnNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ1cmxwYXJzZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3VzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInVzZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91dS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91dWlkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ1dWlkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2FybmluZ3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndhcm5pbmdzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2F2ZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwid2F2ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dlYWtyZWYucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndlYWtyZWYgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93ZWJicm93c2VyLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBvcGVuX3RhYihhKXtyZXR1cm4oU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwidXJsXFxcIixcXFwic3RyaW5nXFxcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKSwhYik/U2suYnVpbHRpbi5ib29sLmZhbHNlJDooYT1hLiRqc3N0cigpLHdpbmRvdy5vcGVuKGEsXFxcIl9ibGFua1xcXCIpLFNrLmJ1aWx0aW4uYm9vbC50cnVlJCl9dmFyIGE9e30sYj1cXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHdpbmRvdyYmXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cubmF2aWdhdG9yO3JldHVybiBhLl9fbmFtZV9fPW5ldyBTay5idWlsdGluLnN0cihcXFwid2ViYnJvd3NlclxcXCIpLGEub3Blbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIG9wZW4oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5cXFwiLGFyZ3VtZW50cy5sZW5ndGgrMSwxLDMpLG9wZW5fdGFiKGEpfSksYS5vcGVuX25ldz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIG9wZW5fbmV3KGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuX25ld1xcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLG9wZW5fdGFiKGEpfSksYS5vcGVuX25ld190YWI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuX25ld190YWIoYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5fbmV3X3RhYlxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLG9wZW5fdGFiKGEpfSksYS5EZWZhdWx0QnJvd3Nlcj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24gZGZsYnJvd3NlcihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBfX2luaXRfXygpe3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KSxiLm9wZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuKGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KSxvcGVuX3RhYihiKX0pLGIub3Blbl9uZXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuX25ldyhhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuX25ld1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLG9wZW5fdGFiKGIpfSksYi5vcGVuX25ld190YWI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuX25ld190YWIoYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdfdGFiXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksb3Blbl90YWIoYil9KX0sXFxcIkRlZmF1bHRCcm93c2VyXFxcIixbXSksYS5nZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBnZXQoKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0XFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuRGVmYXVsdEJyb3dzZXIsW10pfSksYX07XCIsXCJzcmMvbGliL3dlYmJyb3dzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndlYmJyb3dzZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93ZWJnbC9fX2luaXRfXy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwid2ViZ2xcXFwiKX0sYz1mdW5jdGlvbihhKXtyZXR1cm5cXFwiPHRhYmxlIHN0eWxlPVxcXFxcXFwiYmFja2dyb3VuZC1jb2xvcjogIzhDRTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcXFxcXFxcIj48dHI+PHRkIGFsaWduPVxcXFxcXFwiY2VudGVyXFxcXFxcXCI+PGRpdiBzdHlsZT1cXFxcXFxcImRpc3BsYXk6IHRhYmxlLWNlbGw7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcXFxcXCI+PGRpdiBzdHlsZT1cXFxcXFxcIlxcXFxcXFwiPlxcXCIrYStcXFwiPC9kaXY+PC9kaXY+PC90ZD48L3RyPjwvdGFibGU+XFxcIn0sZD1cXFwiVGhpcyBwYWdlIHJlcXVpcmVzIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIFdlYkdMLjxici8+PGEgaHJlZj1cXFxcXFxcImh0dHA6Ly9nZXQud2ViZ2wub3JnXFxcXFxcXCI+Q2xpY2sgaGVyZSB0byB1cGdyYWRlIHlvdXIgYnJvd3Nlci48L2E+XFxcIixlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXFxcIndlYmdsXFxcIixcXFwiZXhwZXJpbWVudGFsLXdlYmdsXFxcIixcXFwid2Via2l0LTNkXFxcIixcXFwibW96LXdlYmdsXFxcIl0sYz1udWxsLGQ9MDtkPGIubGVuZ3RoOysrZCl7dHJ5e2M9YS5nZXRDb250ZXh0KGJbZF0pfWNhdGNoKGEpe31pZihjKWJyZWFrfWlmKGMpe2Z1bmN0aW9uIHJldHVybkZhbHNlKCl7cmV0dXJuITF9YS5vbnNlbGVjdHN0YXJ0PXJldHVybkZhbHNlLGEub25tb3VzZWRvd249cmV0dXJuRmFsc2V9cmV0dXJuIGN9LGY9ZnVuY3Rpb24oYSxmKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtpZihmfHwoZj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKFxcXCJjYW52YXNcXFwiKVswXSksIWYpcmV0dXJuIHZvaWQoZy5pbm5lckhUTUw9YyhkKSk7dmFyIGg9ZShmKTtpZighaCl7dmFyIGk9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvKFxcXFx3K1xcXFwvLio/ICkvZyksaj17fTt0cnl7Zm9yKHZhciBrPTA7azxpLmxlbmd0aDsrK2spe2Zvcih2YXIgbD1pW2tdLm1hdGNoKC8oXFxcXHcrKS9nKSxtPVtdLG49MTtuPGwubGVuZ3RoOysrbiltLnB1c2gocGFyc2VJbnQobFtuXSkpO2pbbFswXV09bX19Y2F0Y2goYSl7fWcuaW5uZXJIVE1MPWouQ2hyb21lJiYoNzxqLkNocm9tZVswXXx8Nz09ai5DaHJvbWVbMF0mJjA8ai5DaHJvbWVbMV18fDc9PWouQ2hyb21lWzBdJiYwPT1qLkNocm9tZVsxXSYmNTIxPD1qLkNocm9tZVsyXSk/YyhcXFwiSXQgZG9lc24ndCBhcHBlYXIgeW91ciBjb21wdXRlciBjYW4gc3VwcG9ydCBXZWJHTC48YnIvPjxhIGhyZWY9XFxcXFxcXCJodHRwOi8vZ2V0LndlYmdsLm9yZ1xcXFxcXFwiPkNsaWNrIGhlcmUgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9hPlxcXCIpOmMoZCl9cmV0dXJuIGh9O3JldHVybiBhLkNvbnRleHQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi52KSxkPWYoYi52LGMpO2lmKCFkKXRocm93IG5ldyBFcnJvcihcXFwiWW91ciBicm93c2VyIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IFdlYkdMLlxcXCIpO2Zvcih2YXIgZSBpbiBhLmdsPWQsZC5fX3Byb3RvX18paWYoXFxcIm51bWJlclxcXCI9PXR5cGVvZiBkLl9fcHJvdG9fX1tlXSlTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKGUpLGQuX19wcm90b19fW2VdKTtlbHNlIGlmKFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBkLl9fcHJvdG9fX1tlXSlzd2l0Y2goZSl7Y2FzZVxcXCJidWZmZXJEYXRhXFxcIjpicmVhaztjYXNlXFxcImNsZWFyQ29sb3JcXFwiOmJyZWFrO2Nhc2VcXFwiZHJhd0FycmF5c1xcXCI6YnJlYWs7Y2FzZVxcXCJnZXRBdHRyaWJMb2NhdGlvblxcXCI6YnJlYWs7Y2FzZVxcXCJnZXRVbmlmb3JtTG9jYXRpb25cXFwiOmJyZWFrO2Nhc2VcXFwic2hhZGVyU291cmNlXFxcIjpicmVhaztjYXNlXFxcInVuaWZvcm1NYXRyaXg0ZnZcXFwiOmJyZWFrO2Nhc2VcXFwidmVydGV4QXR0cmliUG9pbnRlclxcXCI6YnJlYWs7Y2FzZVxcXCJ2aWV3cG9ydFxcXCI6YnJlYWs7ZGVmYXVsdDooZnVuY3Rpb24oYil7U2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihlKSxuZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE9ZC5fX3Byb3RvX19bYl07cmV0dXJuIGEuYXBwbHkoZCxhcmd1bWVudHMpfSkpfSkoZSk7fWQuY2xlYXJDb2xvcigxMDAvMjU1LDE0OS8yNTUsMjM3LzI1NSwxKSxkLmNsZWFyKGQuQ09MT1JfQlVGRkVSX0JJVCl9KSxiLnRwJGdldGF0dHI9U2suZ2VuZXJpYy5nZXRBdHRyLGIuYnVmZmVyRGF0YT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EuZ2wuYnVmZmVyRGF0YShiLGMudixkKX0pLGIuY2xlYXJDb2xvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7YS5nbC5jbGVhckNvbG9yKFNrLmJ1aWx0aW4uYXNudW0kKGIpLFNrLmJ1aWx0aW4uYXNudW0kKGMpLFNrLmJ1aWx0aW4uYXNudW0kKGQpLFNrLmJ1aWx0aW4uYXNudW0kKGUpKX0pLGIuZ2V0QXR0cmliTG9jYXRpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEuZ2wuZ2V0QXR0cmliTG9jYXRpb24oYixjLnYpfSksYi5nZXRVbmlmb3JtTG9jYXRpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKGIsYy52KX0pLGIuc2hhZGVyU291cmNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2EuZ2wuc2hhZGVyU291cmNlKGIsYy52KX0pLGIuZHJhd0FycmF5cz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EuZ2wuZHJhd0FycmF5cyhTay5idWlsdGluLmFzbnVtJChiKSxTay5idWlsdGluLmFzbnVtJChjKSxTay5idWlsdGluLmFzbnVtJChkKSl9KSxiLnZlcnRleEF0dHJpYlBvaW50ZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnKXthLmdsLnZlcnRleEF0dHJpYlBvaW50ZXIoYixTay5idWlsdGluLmFzbnVtJChjKSxTay5idWlsdGluLmFzbnVtJChkKSxlLFNrLmJ1aWx0aW4uYXNudW0kKGYpLFNrLmJ1aWx0aW4uYXNudW0kKGcpKX0pLGIudmlld3BvcnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe2EuZ2wudmlld3BvcnQoU2suYnVpbHRpbi5hc251bSQoYiksU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCksU2suYnVpbHRpbi5hc251bSQoZSkpfSksYi51bmlmb3JtTWF0cml4NGZ2PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS5nbC51bmlmb3JtTWF0cml4NGZ2KFNrLmJ1aWx0aW4uYXNudW0kKGIpLGMsZC52KX0pLGIuc2V0RHJhd0Z1bmM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBEYXRlKCkuZ2V0VGltZSgpLGQ9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYixbYSxuZXcgRGF0ZSgpLmdldFRpbWUoKS1jXSl9LDFlMy82MCl9KX0sXFxcIkNvbnRleHRcXFwiLFtdKSxhLkZsb2F0MzJBcnJheT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBiP25ldyBGbG9hdDMyQXJyYXkoYik6bmV3IEZsb2F0MzJBcnJheShTay5mZmkucmVtYXBUb0pzKGIpKX0pLGIuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS52Lmxlbmd0aDsrK2MpYi5wdXNoKGEudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiW1xcXCIrYi5qb2luKFxcXCIsIFxcXCIpK1xcXCJdXFxcIil9KX0sXFxcIkZsb2F0MzJBcnJheVxcXCIsW10pLGEuTWF0cml4NHg0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudj1uZXcgRmxvYXQzMkFycmF5KFNrLmZmaS5yZW1hcFRvSnMoYikpfSksYi5pZGVudGl0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWEudjtiWzBdPTEsYlsxXT0wLGJbMl09MCxiWzNdPTAsYls0XT0wLGJbNV09MSxiWzZdPTAsYls3XT0wLGJbOF09MCxiWzldPTAsYlsxMF09MSxiWzExXT0wLGJbMTJdPTAsYlsxM109MCxiWzE0XT0wLGJbMTVdPTF9KSxiLnBlcnNwZWN0aXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjLGQsZSxnKXt2YXIgaD1NYXRoLnRhbixpPU1hdGguUEksaj1oKC41KmktLjUqKFNrLmJ1aWx0aW4uYXNudW0kKGMpKmkvMTgwKSksbD1Tay5idWlsdGluLmFzbnVtJChkKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGUpLG49U2suYnVpbHRpbi5hc251bSQoZyksZj0xLyhhLW4pLGs9Yi52O2tbMF09ai9sLGtbMV09MCxrWzJdPTAsa1szXT0wLGtbNF09MCxrWzVdPWosa1s2XT0wLGtbN109MCxrWzhdPTAsa1s5XT0wLGtbMTBdPShhK24pKmYsa1sxMV09LTEsa1sxMl09MCxrWzEzXT0wLGtbMTRdPTIqKGEqbipmKSxrWzE1XT0wfSksYi50cmFuc2xhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPWEudixkPVNrLmZmaS5yZW1hcFRvSnMoYik7Y1swXT0xLGNbMV09MCxjWzJdPTAsY1szXT0wLGNbNF09MCxjWzVdPTEsY1s2XT0wLGNbN109MCxjWzhdPTAsY1s5XT0wLGNbMTBdPTEsY1sxMV09MCxjWzEyXT1kWzBdLGNbMTNdPWRbMV0sY1sxNF09ZFsyXSxjWzE1XT0xfSksYi5fX3JlcHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7YzxhLnYubGVuZ3RoOysrYyliLnB1c2goYS52W2NdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJbXFxcIitiLmpvaW4oXFxcIiwgXFxcIikrXFxcIl1cXFwiKX0pfSxcXFwiTWF0cml4NHg0XFxcIixbXSksYX07XCIsXCJzcmMvbGliL3dlYmdsL21hdGguanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9O3JldHVybiBhLk1hdDQ0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihiLGMpe3ZhciBkPU1hdGguc3FydDtjLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGMubG9hZElkZW50aXR5LFthXSksYS5zdGFjaz1bXX0pLGMucHVzaD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Euc3RhY2sucHVzaChhLmVsZW1lbnRzLnNsaWNlKDApKX0pLGMucG9wPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS5lbGVtZW50cz1hLnN0YWNrLnBvcCgpfSksYy5sb2FkSWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXX0pLGMudHJhbnNmb3JtMz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yi5lbGVtZW50cztyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuVmVjMyxbZFswXSpjLngrZFs0XSpjLnkrZFs4XSpjLnosZFsxXSpjLngrZFs1XSpjLnkrZFs5XSpjLnosZFsyXSpjLngrZFs2XSpjLnkrZFsxMF0qYy56XSl9KSxjLnNjYWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEuZWxlbWVudHNbMF0qPWIsYS5lbGVtZW50c1sxXSo9YixhLmVsZW1lbnRzWzJdKj1iLGEuZWxlbWVudHNbM10qPWIsYS5lbGVtZW50c1s0XSo9YyxhLmVsZW1lbnRzWzVdKj1jLGEuZWxlbWVudHNbNl0qPWMsYS5lbGVtZW50c1s3XSo9YyxhLmVsZW1lbnRzWzhdKj1kLGEuZWxlbWVudHNbOV0qPWQsYS5lbGVtZW50c1sxMF0qPWQsYS5lbGVtZW50c1sxMV0qPWQsYX0pLGMudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEuZWxlbWVudHNbMTJdKz1hLmVsZW1lbnRzWzBdKmIrYS5lbGVtZW50c1s0XSpjK2EuZWxlbWVudHNbOF0qZCxhLmVsZW1lbnRzWzEzXSs9YS5lbGVtZW50c1sxXSpiK2EuZWxlbWVudHNbNV0qYythLmVsZW1lbnRzWzldKmQsYS5lbGVtZW50c1sxNF0rPWEuZWxlbWVudHNbMl0qYithLmVsZW1lbnRzWzZdKmMrYS5lbGVtZW50c1sxMF0qZCxhLmVsZW1lbnRzWzE1XSs9YS5lbGVtZW50c1szXSpiK2EuZWxlbWVudHNbN10qYythLmVsZW1lbnRzWzExXSpkLGF9KSxjLnJvdGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyxlLGYsZyl7dmFyIGg9TWF0aC5jb3MsaT1NYXRoLnNpbixqPU1hdGguUEksaz1kKGUqZStmKmYrZypnKSxsPWkoYypqLzE4MCksbT1oKGMqai8xODApO2lmKDA8ayl7dmFyIG4sbyxwLHEscixzLHQsdSx2LHcsQTtlLz1rLGYvPWssZy89ayxuPWUqZSxvPWYqZixwPWcqZyxxPWUqZixyPWYqZyxzPWcqZSx0PWUqbCx1PWYqbCx2PWcqbCx3PTEtbSxBPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLk1hdDQ0KSxBLmVsZW1lbnRzWzBdPXcqbittLEEuZWxlbWVudHNbMV09dypxLXYsQS5lbGVtZW50c1syXT13KnMrdSxBLmVsZW1lbnRzWzNdPTAsQS5lbGVtZW50c1s0XT13KnErdixBLmVsZW1lbnRzWzVdPXcqbyttLEEuZWxlbWVudHNbNl09dypyLXQsQS5lbGVtZW50c1s3XT0wLEEuZWxlbWVudHNbOF09dypzLXUsQS5lbGVtZW50c1s5XT13KnIrdCxBLmVsZW1lbnRzWzEwXT13KnArbSxBLmVsZW1lbnRzWzExXT0wLEEuZWxlbWVudHNbMTJdPTAsQS5lbGVtZW50c1sxM109MCxBLmVsZW1lbnRzWzE0XT0wLEEuZWxlbWVudHNbMTVdPTEsQT1BLm11bHRpcGx5KGIpLGIuZWxlbWVudHM9QS5lbGVtZW50c31yZXR1cm4gYn0pLGMubXVsdGlwbHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe2Zvcih2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5NYXQ0NCksZT0wOzQ+ZTtlKyspZC5lbGVtZW50c1s0KmUrMF09Yi5lbGVtZW50c1s0KmUrMF0qYy5lbGVtZW50c1swXStiLmVsZW1lbnRzWzQqZSsxXSpjLmVsZW1lbnRzWzRdK2IuZWxlbWVudHNbNCplKzJdKmMuZWxlbWVudHNbOF0rYi5lbGVtZW50c1s0KmUrM10qYy5lbGVtZW50c1sxMl0sZC5lbGVtZW50c1s0KmUrMV09Yi5lbGVtZW50c1s0KmUrMF0qYy5lbGVtZW50c1sxXStiLmVsZW1lbnRzWzQqZSsxXSpjLmVsZW1lbnRzWzVdK2IuZWxlbWVudHNbNCplKzJdKmMuZWxlbWVudHNbOV0rYi5lbGVtZW50c1s0KmUrM10qYy5lbGVtZW50c1sxM10sZC5lbGVtZW50c1s0KmUrMl09Yi5lbGVtZW50c1s0KmUrMF0qYy5lbGVtZW50c1syXStiLmVsZW1lbnRzWzQqZSsxXSpjLmVsZW1lbnRzWzZdK2IuZWxlbWVudHNbNCplKzJdKmMuZWxlbWVudHNbMTBdK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTRdLGQuZWxlbWVudHNbNCplKzNdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbM10rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s3XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzExXStiLmVsZW1lbnRzWzQqZSszXSpjLmVsZW1lbnRzWzE1XTtyZXR1cm4gYi5lbGVtZW50cz1kLmVsZW1lbnRzLGJ9KSxjLmxvb2tBdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyxlLGYsZyxoLGksaixrLGwpe3ZhciBtPVtjLWcsZS1oLGYtaV0sbj1kKG1bMF0qbVswXSttWzFdKm1bMV0rbVsyXSptWzJdKTtuJiYobVswXS89bixtWzFdLz1uLG1bMl0vPW4pO3ZhciBvPVtqLGssbF0scD1bXTtwWzBdPW9bMV0qbVsyXS1vWzJdKm1bMV0scFsxXT0tb1swXSptWzJdK29bMl0qbVswXSxwWzJdPW9bMF0qbVsxXS1vWzFdKm1bMF0sb1swXT1tWzFdKnBbMl0tbVsyXSpwWzFdLG9bMV09LW1bMF0qcFsyXSttWzJdKnBbMF0sb1syXT1tWzBdKnBbMV0tbVsxXSpwWzBdLG49ZChwWzBdKnBbMF0rcFsxXSpwWzFdK3BbMl0qcFsyXSksbiYmKHBbMF0vPW4scFsxXS89bixwWzJdLz1uKSxuPWQob1swXSpvWzBdK29bMV0qb1sxXStvWzJdKm9bMl0pLG4mJihvWzBdLz1uLG9bMV0vPW4sb1syXS89bik7dmFyIHE9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuTWF0NDQpO3JldHVybiBxLmVsZW1lbnRzWzBdPXBbMF0scS5lbGVtZW50c1s0XT1wWzFdLHEuZWxlbWVudHNbOF09cFsyXSxxLmVsZW1lbnRzWzEyXT0wLHEuZWxlbWVudHNbMV09b1swXSxxLmVsZW1lbnRzWzVdPW9bMV0scS5lbGVtZW50c1s5XT1vWzJdLHEuZWxlbWVudHNbMTNdPTAscS5lbGVtZW50c1syXT1tWzBdLHEuZWxlbWVudHNbNl09bVsxXSxxLmVsZW1lbnRzWzEwXT1tWzJdLHEuZWxlbWVudHNbMTRdPTAscS5lbGVtZW50c1szXT0wLHEuZWxlbWVudHNbN109MCxxLmVsZW1lbnRzWzExXT0wLHEuZWxlbWVudHNbMTVdPTEscT1xLm11bHRpcGx5KGIpLGIuZWxlbWVudHM9cS5lbGVtZW50cyxiLnRyYW5zbGF0ZSgtYywtZSwtZiksYn0pfSxcXFwiTWF0NDRcXFwiLFtdKSxhLk1hdDMzPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5sb2FkSWRlbnRpdHksW2FdKX0pLGIubG9hZElkZW50aXR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdfSl9LFxcXCJNYXQzM1xcXCIsW10pLGEuVmVjMz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYixjKXtjLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS54PWIsYS55PWMsYS56PWR9KSxjLl9fc3ViX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5WZWMzLFtiLngtYy54LGIueS1jLnksYi56LWMuel0pfSl9LFxcXCJWZWMzXFxcIixbXSksYS5jcm9zcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyl7cmV0dXJuIFNrLmFzc2VydHMuYXNzZXJ0KGIgaW5zdGFuY2VvZiBhLlZlYzMmJmMgaW5zdGFuY2VvZiBhLlZlYzMpLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlZlYzMsW2IueSpjLnotYi56KmMueSxiLnoqYy54LWIueCpjLnosYi54KmMueS1iLnkqYy54XSl9KSxhfTtcIixcInNyYy9saWIvd2ViZ2wvbWF0cml4NC5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5QSSxiPXt9LGM9bmV3IEZsb2F0MzJBcnJheSgzKSxkPW5ldyBGbG9hdDMyQXJyYXkoMyksZT1uZXcgRmxvYXQzMkFycmF5KDMpLGY9bmV3IEZsb2F0MzJBcnJheSg0KSxnPW5ldyBGbG9hdDMyQXJyYXkoNCksaD1uZXcgRmxvYXQzMkFycmF5KDQpLGk9bmV3IEZsb2F0MzJBcnJheSgxNiksaj1uZXcgRmxvYXQzMkFycmF5KDE2KSxrPW5ldyBGbG9hdDMyQXJyYXkoMTYpLGw9ZnVuY3Rpb24oYixjKXtmb3IodmFyIGE9TWF0aC5zcXJ0LGQ9MCxlPWMubGVuZ3RoLGY9MDtmPGU7KytmKWQrPWNbZl0qY1tmXTtpZihkPWEoZCksMWUtNTxkKWZvcih2YXIgZj0wO2Y8ZTsrK2YpYltmXT1jW2ZdL2Q7ZWxzZSBmb3IodmFyIGY9MDtmPGU7KytmKWJbZl09MDtyZXR1cm4gYn0sbT1mdW5jdGlvbihjLGQsYSl7cmV0dXJuIGNbMF09ZFsxXSphWzJdLWRbMl0qYVsxXSxjWzFdPWRbMl0qYVswXS1kWzBdKmFbMl0sY1syXT1kWzBdKmFbMV0tZFsxXSphWzBdLGN9LG49ZnVuY3Rpb24oYyxkLGEpe2Zvcih2YXIgYj1kLmxlbmd0aCxlPTA7ZTxiOysrZSljW2VdPWRbZV0tYVtlXTtyZXR1cm4gY30sbz1mdW5jdGlvbihjLGEpe3JldHVybiBjWzBdKmFbMF0rY1sxXSphWzFdK2NbMl0qYVsyXX07cmV0dXJuIGIubG9va0F0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGYsZyl7dmFyIGg9YyxpPWQsaj1sKGgsbihoLGIudixmLnYpKSxrPWwoaSxtKGksZy52LGopKSxwPW0oZSxqLGspLHE9YS52O3JldHVybiBxWzBdPWtbMF0scVsxXT1wWzBdLHFbMl09alswXSxxWzNdPTAscVs0XT1rWzFdLHFbNV09cFsxXSxxWzZdPWpbMV0scVs3XT0wLHFbOF09a1syXSxxWzldPXBbMl0scVsxMF09alsyXSxxWzExXT0wLHFbMTJdPS1vKGssYi52KSxxWzEzXT0tbyhwLGIudikscVsxNF09LW8oaixiLnYpLHFbMTVdPTEsYX0pLGIucGVyc3BlY3RpdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZCxlLGcpe3ZhciBoPU1hdGgudGFuLGk9aCguNSphLS41KihjKmEvMTgwKSksZj0xLyhlLWcpLGo9Yi52O3JldHVybiBqWzBdPWkvZCxqWzFdPTAsalsyXT0wLGpbM109MCxqWzRdPTAsals1XT1pLGpbNl09MCxqWzddPTAsals4XT0wLGpbOV09MCxqWzEwXT0oZStnKSpmLGpbMTFdPS0xLGpbMTJdPTAsalsxM109MCxqWzE0XT0yKihlKmcqZiksalsxNV09MCxifSksYi5yb3RhdGlvblk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGQpe3ZhciBlPU1hdGguc2luLGY9TWF0aC5jb3MsZz1iLnYsaD1mKGQqYS8xODApLGM9ZShkKmEvMTgwKTtyZXR1cm4gZ1swXT1oLGdbMV09MCxnWzJdPS1jLGdbM109MCxnWzRdPTAsZ1s1XT0xLGdbNl09MCxnWzddPTAsZ1s4XT1jLGdbOV09MCxnWzEwXT1oLGdbMTFdPTAsZ1sxMl09MCxnWzEzXT0wLGdbMTRdPTAsZ1sxNV09MSxifSksYi5pZGVudGl0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWEudjtyZXR1cm4gYlswXT0xLGJbMV09MCxiWzJdPTAsYlszXT0wLGJbNF09MCxiWzVdPTEsYls2XT0wLGJbN109MCxiWzhdPTAsYls5XT0wLGJbMTBdPTEsYlsxMV09MCxiWzEyXT0wLGJbMTNdPTAsYlsxNF09MCxiWzE1XT0xLGF9KSxiLm11bD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGMsZCxlKXt2YXIgZj1jLnYsZz1kLnYsYT1lLnYsYj1nWzBdLGg9Z1sxXSxpPWdbMl0saj1nWzNdLGs9Z1s0XSxsPWdbNV0sbT1nWzZdLG49Z1s3XSxvPWdbOF0scD1nWzldLHE9Z1sxMF0scj1nWzExXSxzPWdbMTJdLHQ9Z1sxM10sdT1nWzE0XSx2PWdbMTVdLHc9YVswXSx4PWFbMV0seT1hWzJdLHo9YVszXSxBPWFbNF0sQj1hWzVdLEM9YVs2XSxEPWFbN10sRT1hWzhdLEY9YVs5XSxHPWFbMTBdLEg9YVsxMV0sST1hWzEyXSxKPWFbMTNdLEs9YVsxNF0sTD1hWzE1XTtyZXR1cm4gZlswXT1iKncraCpBK2kqRStqKkksZlsxXT1iKngraCpCK2kqRitqKkosZlsyXT1iKnkraCpDK2kqRytqKkssZlszXT1iKnoraCpEK2kqSCtqKkwsZls0XT1rKncrbCpBK20qRStuKkksZls1XT1rKngrbCpCK20qRituKkosZls2XT1rKnkrbCpDK20qRytuKkssZls3XT1rKnorbCpEK20qSCtuKkwsZls4XT1vKncrcCpBK3EqRStyKkksZls5XT1vKngrcCpCK3EqRityKkosZlsxMF09byp5K3AqQytxKkcrcipLLGZbMTFdPW8qeitwKkQrcSpIK3IqTCxmWzEyXT1zKncrdCpBK3UqRSt2KkksZlsxM109cyp4K3QqQit1KkYrdipKLGZbMTRdPXMqeSt0KkMrdSpHK3YqSyxmWzE1XT1zKnordCpEK3UqSCt2KkwsY30pLGIuaW52ZXJ0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnYsZT1iLnYsZj1lWzBdLGc9ZVsxXSxoPWVbMl0saT1lWzNdLGo9ZVs0XSxrPWVbNV0sbD1lWzZdLG09ZVs3XSxuPWVbOF0sbz1lWzldLHA9ZVsxMF0scT1lWzExXSxyPWVbMTJdLHM9ZVsxM10sdD1lWzE0XSx1PWVbMTVdLHY9cCp1LHc9dCpxLHg9bCp1LHk9dCptLHo9bCpxLEE9cCptLEI9aCp1LEM9dCppLEQ9aCpxLEU9cCppLEY9aCptLEc9bCppLEg9bipzLEk9cipvLEo9aipzLEs9ciprLEw9aipvLE09biprLE49ZipzLE89cipnLFA9ZipvLFE9bipnLFI9ZiprLFM9aipnLFQ9diprK3kqbyt6KnMtKHcqayt4Km8rQSpzKSxVPXcqZytCKm8rRSpzLSh2KmcrQypvK0QqcyksVj14KmcrQyprK0Yqcy0oeSpnK0IqaytHKnMpLFc9QSpnK0QqaytHKm8tKHoqZytFKmsrRipvKSxYPTEvKGYqVCtqKlUrbipWK3IqVyk7cmV0dXJuIGNbMF09WCpULGNbMV09WCpVLGNbMl09WCpWLGNbM109WCpXLGNbNF09WCoodypqK3gqbitBKnItKHYqait5Km4reipyKSksY1s1XT1YKih2KmYrQypuK0Qqci0odypmK0IqbitFKnIpKSxjWzZdPVgqKHkqZitCKmorRypyLSh4KmYrQypqK0YqcikpLGNbN109WCooeipmK0UqaitGKm4tKEEqZitEKmorRypuKSksY1s4XT1YKihIKm0rSypxK0wqdS0oSSptK0oqcStNKnUpKSxjWzldPVgqKEkqaStOKnErUSp1LShIKmkrTypxK1AqdSkpLGNbMTBdPVgqKEoqaStPKm0rUip1LShLKmkrTiptK1MqdSkpLGNbMTFdPVgqKE0qaStQKm0rUypxLShMKmkrUSptK1IqcSkpLGNbMTJdPVgqKEoqcCtNKnQrSSpsLShMKnQrSCpsK0sqcCkpLGNbMTNdPVgqKFAqdCtIKmgrTypwLShOKnArUSp0K0kqaCkpLGNbMTRdPVgqKE4qbCtTKnQrSypoLShSKnQrSipoK08qbCkpLGNbMTVdPVgqKFIqcCtMKmgrUSpsLShQKmwrUypwK00qaCkpLGF9KSxiLnRyYW5zcG9zZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEudixkPWIudixlPTA7ND5lOysrZSlmb3IodmFyIGY9MDs0PmY7KytmKWNbNCplK2ZdPWRbNCpmK2VdO3JldHVybiBjfSksYn07XCIsXCJzcmMvbGliL3dlYmdsL21vZGVscy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ZnVuY3Rpb24oYSxjKXt2YXIgZD1jfHxnbC5BUlJBWV9CVUZGRVIsZT1nbC5jcmVhdGVCdWZmZXIoKTtpZih0aGlzLnRhcmdldD1kLHRoaXMuYnVmPWUsdGhpcy5zZXQoYSksdGhpcy5udW1Db21wb25lbnRzXz1hLm51bUNvbXBvbmVudHMsdGhpcy5udW1FbGVtZW50c189YS5udW1FbGVtZW50cyx0aGlzLnRvdGFsQ29tcG9uZW50c189dGhpcy5udW1Db21wb25lbnRzXyp0aGlzLm51bUVsZW1lbnRzXyxhLmJ1ZmZlciBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSl0aGlzLnR5cGVfPWdsLkZMT0FUO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5KXRoaXMudHlwZV89Z2wuVU5TSUdORURfQllURTtlbHNlIGlmKGEuYnVmZmVyIGluc3RhbmNlb2YgSW50OEFycmF5KXRoaXMudHlwZV89Z2wuX0JZVEU7ZWxzZSBpZihhLmJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KXRoaXMudHlwZV89Z2wuVU5TSUdORURfU0hPUlQ7ZWxzZSBpZihhLmJ1ZmZlciBpbnN0YW5jZW9mIEludDE2QXJyYXkpdGhpcy50eXBlXz1nbC5TSE9SVDtlbHNlIHRocm93XFxcInVuaGFuZGxlZCB0eXBlOlxcXCIrdHlwZW9mIGEuYnVmZmVyfTtyZXR1cm4gZC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGEpe2dsLmJpbmRCdWZmZXIodGhpcy50YXJnZXQsdGhpcy5idWYpLGdsLmJ1ZmZlckRhdGEodGhpcy50YXJnZXQsYS5idWZmZXIsZ2wuU1RBVElDX0RSQVcpfSxkLnByb3RvdHlwZS50eXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZV99LGQucHJvdG90eXBlLm51bUNvbXBvbmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5udW1Db21wb25lbnRzX30sZC5wcm90b3R5cGUubnVtRWxlbWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5udW1FbGVtZW50c199LGQucHJvdG90eXBlLnRvdGFsQ29tcG9uZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvdGFsQ29tcG9uZW50c199LGQucHJvdG90eXBlLmJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1Zn0sZC5wcm90b3R5cGUuc3RyaWRlPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGQucHJvdG90eXBlLm9mZnNldD1mdW5jdGlvbigpe3JldHVybiAwfSxjLk1vZGVsPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYyxmdW5jdGlvbihjLGUpe2UuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihjLGUsZixnKXtjLmJ1ZmZlcnM9e307dmFyIGg9ZnVuY3Rpb24oYSxlKXt2YXIgZj1cXFwiaW5kaWNlc1xcXCI9PWE/Z2wuRUxFTUVOVF9BUlJBWV9CVUZGRVI6Z2wuQVJSQVlfQlVGRkVSO2I9Yy5idWZmZXJzW2FdLGI/Yi5zZXQoZSk6Yj1uZXcgZChlLGYpLGMuYnVmZmVyc1thXT1ifTtmb3IoYSBpbiBmKWgoYSxmW2FdKTt2YXIgaT17fSxqPTA7Zm9yKHZhciBrIGluIGcpaVtrXT1qKys7Yy5tb2RlPWdsLlRSSUFOR0xFUyxjLnRleHR1cmVzPWcudixjLnRleHR1cmVVbml0cz1pLGMuc2hhZGVyPWV9KSxlLmRyYXdQcmVwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgZD1hLnNoYWRlcixlPWEuYnVmZmVycyxmPWEudGV4dHVyZXM7Zm9yKHZhciBnIGluIGM9U2suZmZpLnJlbWFwVG9KcyhjKSxTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZC51c2UsW2RdKSxlKXt2YXIgaD1lW2ddO2lmKFxcXCJpbmRpY2VzXFxcIj09ZylnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLGguYnVmZmVyKCkpO2Vsc2V7dmFyIGk9ZC5hdHRyaWJbZ107aSYmaShoKX19Zm9yKHZhciBqIGluIGYpe3ZhciBrPWEudGV4dHVyZVVuaXRzW2pdO2Quc2V0VW5pZm9ybSRpbXBsKGQsdGV4dHVlcixrKSxmW2pdLmJpbmRUb1VuaXQoayl9Zm9yKHZhciBsIGluIGMpZC5zZXRVbmlmb3JtJGltcGwoZCxsLGNbbF0pfSksZS5kcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWEuc2hhZGVyO2Zvcih1bmlmb3JtIGluIGM9U2suZmZpLnJlbWFwVG9KcyhjKSxjKWUuc2V0VW5pZm9ybSRpbXBsKGUsdW5pZm9ybSxjW3VuaWZvcm1dKTtpZihkKWZvcih2YXIgZiBpbiBkKXt2YXIgZz1hLnRleHR1cmVVbml0c1tmXTtlLnNldFVuaWZvcm0kaW1wbChlLGYsZyksZFtmXS5iaW5kVG9Vbml0KGcpfXZhciBoPWEuYnVmZmVycztnbC5kcmF3RWxlbWVudHMoYS5tb2RlLGguaW5kaWNlcy50b3RhbENvbXBvbmVudHMoKSxnbC5VTlNJR05FRF9TSE9SVCwwKX0pfSxcXFwiTW9kZWxcXFwiLFtdKSxjfTtcIixcInNyYy9saWIvd2ViZ2wvcHJpbWl0aXZlcy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e30sYj1mdW5jdGlvbihhLGIsYyl7Yz1jfHxcXFwiRmxvYXQzMkFycmF5XFxcIjt2YXIgZD13aW5kb3dbY107Yi5sZW5ndGg/KHRoaXMuYnVmZmVyPW5ldyBkKGIpLGI9dGhpcy5idWZmZXIubGVuZ3RoL2EsdGhpcy5jdXJzb3I9Yik6KHRoaXMuYnVmZmVyPW5ldyBkKGEqYiksdGhpcy5jdXJzb3I9MCksdGhpcy5udW1Db21wb25lbnRzPWEsdGhpcy5udW1FbGVtZW50cz1iLHRoaXMudHlwZT1jfTtyZXR1cm4gYi5wcm90b3R5cGUuc3RyaWRlPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGIucHJvdG90eXBlLm9mZnNldD1mdW5jdGlvbigpe3JldHVybiAwfSxiLnByb3RvdHlwZS5nZXRFbGVtZW50PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hKnRoaXMubnVtQ29tcG9uZW50cyxjPVtdLGQ9MDtkPHRoaXMubnVtQ29tcG9uZW50czsrK2QpYy5wdXNoKHRoaXMuYnVmZmVyW2IrZF0pO3JldHVybiBjfSxiLnByb3RvdHlwZS5zZXRFbGVtZW50PWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWEqdGhpcy5udW1Db21wb25lbnRzLGQ9MDtkPHRoaXMubnVtQ29tcG9uZW50czsrK2QpdGhpcy5idWZmZXJbYytkXT1iW2RdfSxiLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBhPW5ldyBiKHRoaXMubnVtQ29tcG9uZW50cyx0aGlzLm51bUVsZW1lbnRzLHRoaXMudHlwZSk7cmV0dXJuIGEucHVzaEFycmF5KHRoaXMpLGF9LGIucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oYSl7dGhpcy5zZXRFbGVtZW50KHRoaXMuY3Vyc29yKyssYSl9LGIucHJvdG90eXBlLnB1c2hBcnJheT1mdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPGEubnVtRWxlbWVudHM7KytiKXRoaXMucHVzaChhLmdldEVsZW1lbnQoYikpfSxiLnByb3RvdHlwZS5wdXNoQXJyYXlXaXRoT2Zmc2V0PWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9MDtkPGEubnVtRWxlbWVudHM7KytkKXtjPWEuZ2V0RWxlbWVudChkKTtmb3IodmFyIGU9MDtlPGIubGVuZ3RoOysrZSljW2VdKz1iW2VdO3RoaXMucHVzaChjKX19LGIucHJvdG90eXBlLmNvbXB1dGVFeHRlbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPU1hdGgubWF4LGI9TWF0aC5taW4sYyxkPXRoaXMubnVtRWxlbWVudHMsZT10aGlzLm51bUNvbXBvbmVudHMsZj10aGlzLmdldEVsZW1lbnQoMCksZz10aGlzLmdldEVsZW1lbnQoMCksaD0xO2g8ZDsrK2gpe2M9dGhpcy5nZXRFbGVtZW50KGgpO2Zvcih2YXIgaT0wO2k8ZTsrK2kpZltpXT1iKGZbaV0sY1tpXSksZ1tpXT1hKGdbaV0sY1tpXSl9cmV0dXJue21pbjpmLG1heDpnfX0sYS5jcmVhdGVDdWJlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBjLGQ9W1szLDcsNSwxXSxbMCw0LDYsMl0sWzYsNywzLDJdLFswLDEsNSw0XSxbNSw3LDYsNF0sWzIsMywxLDBdXSxlPWEvMixnPVtbLWUsLWUsLWVdLFsrZSwtZSwtZV0sWy1lLCtlLC1lXSxbK2UsK2UsLWVdLFstZSwtZSwrZV0sWytlLC1lLCtlXSxbLWUsK2UsK2VdLFsrZSwrZSwrZV1dLGg9W1sxLDAsMF0sWy0xLDAsMF0sWzAsMSwwXSxbMCwtMSwwXSxbMCwwLDFdLFswLDAsLTFdXSxpPVtbMCwwXSxbMSwwXSxbMSwxXSxbMCwxXV0saj0yNCxrPW5ldyBiKDMsaiksbD1uZXcgYigzLGopLG09bmV3IGIoMixqKSxuPW5ldyBiKDMsMTIsXFxcIlVpbnQxNkFycmF5XFxcIiksbz0wOzY+bzsrK28pe2M9ZFtvXTtmb3IodmFyIHA9MDs0PnA7KytwKXt2YXIgcT1nW2NbcF1dLHI9aFtvXSxzPWlbcF07ay5wdXNoKHEpLGwucHVzaChyKSxtLnB1c2gocyl9dmFyIHQ9NCpvO24ucHVzaChbdCswLHQrMSx0KzJdKSxuLnB1c2goW3QrMCx0KzIsdCszXSl9cmV0dXJue3Bvc2l0aW9uOmssbm9ybWFsOmwsdGV4Q29vcmQ6bSxpbmRpY2VzOm59fSksYX07XCIsXCJzcmMvbGliL3doaWNoZGIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndoaWNoZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93c2dpcmVmL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3c2dpcmVmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveGRybGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ4ZHJsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInhtbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbC9kb20vX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRvbSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbC9ldHJlZS9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZXRyZWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvcGFyc2Vycy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGFyc2VycyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbC9zYXgvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNheCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieG1sbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1scnBjbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ4bWxycGNsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi96aXBmaWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ6aXBmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIn19IiwiKGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO3ZhciAkanNjb21wPSRqc2NvbXB8fHt9OyRqc2NvbXAuc2NvcGU9e307JGpzY29tcC5BU1NVTUVfRVM1PSExOyRqc2NvbXAuQVNTVU1FX05PX05BVElWRV9NQVA9ITE7JGpzY29tcC5BU1NVTUVfTk9fTkFUSVZFX1NFVD0hMTskanNjb21wLlNJTVBMRV9GUk9VTkRfUE9MWUZJTEw9ITE7JGpzY29tcC5kZWZpbmVQcm9wZXJ0eT0kanNjb21wLkFTU1VNRV9FUzV8fFwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihtLHEsYSl7bSE9QXJyYXkucHJvdG90eXBlJiZtIT1PYmplY3QucHJvdG90eXBlJiYobVtxXT1hLnZhbHVlKX07JGpzY29tcC5nZXRHbG9iYWw9ZnVuY3Rpb24obSl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09bT9tOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWwmJm51bGwhPWdsb2JhbD9nbG9iYWw6bX07JGpzY29tcC5nbG9iYWw9JGpzY29tcC5nZXRHbG9iYWwodGhpcyk7XG4kanNjb21wLnBvbHlmaWxsPWZ1bmN0aW9uKG0scSxhLGMpe2lmKHEpe2E9JGpzY29tcC5nbG9iYWw7bT1tLnNwbGl0KFwiLlwiKTtmb3IoYz0wO2M8bS5sZW5ndGgtMTtjKyspe3ZhciBiPW1bY107YiBpbiBhfHwoYVtiXT17fSk7YT1hW2JdfW09bVttLmxlbmd0aC0xXTtjPWFbbV07cT1xKGMpO3EhPWMmJm51bGwhPXEmJiRqc2NvbXAuZGVmaW5lUHJvcGVydHkoYSxtLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6cX0pfX07JGpzY29tcC5wb2x5ZmlsbChcIkFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1wiLGZ1bmN0aW9uKG0pe3JldHVybiBtP206ZnVuY3Rpb24obSxhKXt2YXIgYz10aGlzO2MgaW5zdGFuY2VvZiBTdHJpbmcmJihjPVN0cmluZyhjKSk7dmFyIGI9Yy5sZW5ndGg7YT1hfHwwO2ZvcigwPmEmJihhPU1hdGgubWF4KGErYiwwKSk7YTxiO2ErKyl7dmFyIGU9Y1thXTtpZihlPT09bXx8T2JqZWN0LmlzKGUsbSkpcmV0dXJuITB9cmV0dXJuITF9fSxcImVzN1wiLFwiZXMzXCIpO1xuJGpzY29tcC5vd25zPWZ1bmN0aW9uKG0scSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtLHEpfTskanNjb21wLnBvbHlmaWxsKFwiT2JqZWN0LmVudHJpZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0pe3ZhciBhPVtdLGM7Zm9yKGMgaW4gbSkkanNjb21wLm93bnMobSxjKSYmYS5wdXNoKFtjLG1bY11dKTtyZXR1cm4gYX19LFwiZXM4XCIsXCJlczNcIik7XG4kanNjb21wLmNoZWNrU3RyaW5nQXJncz1mdW5jdGlvbihtLHEsYSl7aWYobnVsbD09bSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlICd0aGlzJyB2YWx1ZSBmb3IgU3RyaW5nLnByb3RvdHlwZS5cIithK1wiIG11c3Qgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkXCIpO2lmKHEgaW5zdGFuY2VvZiBSZWdFeHApdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZpcnN0IGFyZ3VtZW50IHRvIFN0cmluZy5wcm90b3R5cGUuXCIrYStcIiBtdXN0IG5vdCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvblwiKTtyZXR1cm4gbStcIlwifTskanNjb21wLnN0cmluZ1BhZGRpbmc9ZnVuY3Rpb24obSxxKXttPXZvaWQgMCE9PW0/U3RyaW5nKG0pOlwiIFwiO3JldHVybiAwPHEmJm0/bS5yZXBlYXQoTWF0aC5jZWlsKHEvbS5sZW5ndGgpKS5zdWJzdHJpbmcoMCxxKTpcIlwifTtcbiRqc2NvbXAucG9seWZpbGwoXCJTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0XCIsZnVuY3Rpb24obSl7cmV0dXJuIG0/bTpmdW5jdGlvbihtLGEpe3ZhciBjPSRqc2NvbXAuY2hlY2tTdHJpbmdBcmdzKHRoaXMsbnVsbCxcInBhZFN0YXJ0XCIpO3JldHVybiAkanNjb21wLnN0cmluZ1BhZGRpbmcoYSxtLWMubGVuZ3RoKStjfX0sXCJlczhcIixcImVzM1wiKTskanNjb21wLnBvbHlmaWxsKFwiT2JqZWN0LnZhbHVlc1wiLGZ1bmN0aW9uKG0pe3JldHVybiBtP206ZnVuY3Rpb24obSl7dmFyIGE9W10sYztmb3IoYyBpbiBtKSRqc2NvbXAub3ducyhtLGMpJiZhLnB1c2gobVtjXSk7cmV0dXJuIGF9fSxcImVzOFwiLFwiZXMzXCIpOyRqc2NvbXAuYXJyYXlJdGVyYXRvckltcGw9ZnVuY3Rpb24obSl7dmFyIHE9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcTxtLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTptW3ErK119Ontkb25lOiEwfX19OyRqc2NvbXAuYXJyYXlJdGVyYXRvcj1mdW5jdGlvbihtKXtyZXR1cm57bmV4dDokanNjb21wLmFycmF5SXRlcmF0b3JJbXBsKG0pfX07XG4kanNjb21wLlNZTUJPTF9QUkVGSVg9XCJqc2NvbXBfc3ltYm9sX1wiOyRqc2NvbXAuaW5pdFN5bWJvbD1mdW5jdGlvbigpeyRqc2NvbXAuaW5pdFN5bWJvbD1mdW5jdGlvbigpe307JGpzY29tcC5nbG9iYWwuU3ltYm9sfHwoJGpzY29tcC5nbG9iYWwuU3ltYm9sPSRqc2NvbXAuU3ltYm9sKX07JGpzY29tcC5TeW1ib2xDbGFzcz1mdW5jdGlvbihtLHEpe3RoaXMuJGpzY29tcCRzeW1ib2wkaWRfPW07JGpzY29tcC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiZGVzY3JpcHRpb25cIix7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnF9KX07JGpzY29tcC5TeW1ib2xDbGFzcy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kanNjb21wJHN5bWJvbCRpZF99O1xuJGpzY29tcC5TeW1ib2w9ZnVuY3Rpb24oKXtmdW5jdGlvbiBtKGEpe2lmKHRoaXMgaW5zdGFuY2VvZiBtKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3JcIik7cmV0dXJuIG5ldyAkanNjb21wLlN5bWJvbENsYXNzKCRqc2NvbXAuU1lNQk9MX1BSRUZJWCsoYXx8XCJcIikrXCJfXCIrcSsrLGEpfXZhciBxPTA7cmV0dXJuIG19KCk7XG4kanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcj1mdW5jdGlvbigpeyRqc2NvbXAuaW5pdFN5bWJvbCgpO3ZhciBtPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5pdGVyYXRvcjttfHwobT0kanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3I9JGpzY29tcC5nbG9iYWwuU3ltYm9sKFwiU3ltYm9sLml0ZXJhdG9yXCIpKTtcImZ1bmN0aW9uXCIhPXR5cGVvZiBBcnJheS5wcm90b3R5cGVbbV0mJiRqc2NvbXAuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLG0se2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiAkanNjb21wLml0ZXJhdG9yUHJvdG90eXBlKCRqc2NvbXAuYXJyYXlJdGVyYXRvckltcGwodGhpcykpfX0pOyRqc2NvbXAuaW5pdFN5bWJvbEl0ZXJhdG9yPWZ1bmN0aW9uKCl7fX07XG4kanNjb21wLmluaXRTeW1ib2xBc3luY0l0ZXJhdG9yPWZ1bmN0aW9uKCl7JGpzY29tcC5pbml0U3ltYm9sKCk7dmFyIG09JGpzY29tcC5nbG9iYWwuU3ltYm9sLmFzeW5jSXRlcmF0b3I7bXx8KG09JGpzY29tcC5nbG9iYWwuU3ltYm9sLmFzeW5jSXRlcmF0b3I9JGpzY29tcC5nbG9iYWwuU3ltYm9sKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3JcIikpOyRqc2NvbXAuaW5pdFN5bWJvbEFzeW5jSXRlcmF0b3I9ZnVuY3Rpb24oKXt9fTskanNjb21wLml0ZXJhdG9yUHJvdG90eXBlPWZ1bmN0aW9uKG0peyRqc2NvbXAuaW5pdFN5bWJvbEl0ZXJhdG9yKCk7bT17bmV4dDptfTttWyRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307cmV0dXJuIG19O1xuJGpzY29tcC5pdGVyYXRvckZyb21BcnJheT1mdW5jdGlvbihtLHEpeyRqc2NvbXAuaW5pdFN5bWJvbEl0ZXJhdG9yKCk7bSBpbnN0YW5jZW9mIFN0cmluZyYmKG0rPVwiXCIpO3ZhciBhPTAsYz17bmV4dDpmdW5jdGlvbigpe2lmKGE8bS5sZW5ndGgpe3ZhciBiPWErKztyZXR1cm57dmFsdWU6cShiLG1bYl0pLGRvbmU6ITF9fWMubmV4dD1mdW5jdGlvbigpe3JldHVybntkb25lOiEwLHZhbHVlOnZvaWQgMH19O3JldHVybiBjLm5leHQoKX19O2NbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiBjfTtyZXR1cm4gY307JGpzY29tcC5wb2x5ZmlsbChcIkFycmF5LnByb3RvdHlwZS52YWx1ZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKCl7cmV0dXJuICRqc2NvbXAuaXRlcmF0b3JGcm9tQXJyYXkodGhpcyxmdW5jdGlvbihtLGEpe3JldHVybiBhfSl9fSxcImVzOFwiLFwiZXMzXCIpO1xuKGZ1bmN0aW9uKG0pe2Z1bmN0aW9uIHEoYyl7aWYoYVtjXSlyZXR1cm4gYVtjXS5leHBvcnRzO3ZhciBiPWFbY109e2k6YyxsOiExLGV4cG9ydHM6e319O21bY10uY2FsbChiLmV4cG9ydHMsYixiLmV4cG9ydHMscSk7Yi5sPSEwO3JldHVybiBiLmV4cG9ydHN9dmFyIGE9e307cS5tPW07cS5jPWE7cS5kPWZ1bmN0aW9uKGEsYixlKXtxLm8oYSxiKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7ZW51bWVyYWJsZTohMCxnZXQ6ZX0pfTtxLnI9ZnVuY3Rpb24oYSl7XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9O3EudD1mdW5jdGlvbihhLGIpe2ImMSYmKGE9cShhKSk7aWYoYiY4fHxiJjQmJlwib2JqZWN0XCI9PT10eXBlb2YgYSYmYSYmYS5fX2VzTW9kdWxlKXJldHVybiBhO1xudmFyIGM9T2JqZWN0LmNyZWF0ZShudWxsKTtxLnIoYyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsXCJkZWZhdWx0XCIse2VudW1lcmFibGU6ITAsdmFsdWU6YX0pO2lmKGImMiYmXCJzdHJpbmdcIiE9dHlwZW9mIGEpZm9yKHZhciBmIGluIGEpcS5kKGMsZixmdW5jdGlvbihiKXtyZXR1cm4gYVtiXX0uYmluZChudWxsLGYpKTtyZXR1cm4gY307cS5uPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJmEuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBhW1wiZGVmYXVsdFwiXX06ZnVuY3Rpb24oKXtyZXR1cm4gYX07cS5kKGIsXCJhXCIsYik7cmV0dXJuIGJ9O3Eubz1mdW5jdGlvbihhLGIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxiKX07cS5wPVwiXCI7cmV0dXJuIHEocS5zPTEpfSkoW2Z1bmN0aW9uKG0scSl7cT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtxPXF8fChuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSkoKX1jYXRjaChhKXtcIm9iamVjdFwiPT09XG50eXBlb2Ygd2luZG93JiYocT13aW5kb3cpfW0uZXhwb3J0cz1xfSxmdW5jdGlvbihtLHEsYSl7YSgyKTtTay5nbG9iYWwuc3RyZnRpbWU9YSgzKTtTay5nbG9iYWwuc3RycHRpbWU9YSg0KTthKDUpO2EoNyk7YSg5KTthKDEwKTthKDExKTthKDEyKTthKDEzKTthKDE0KTthKDE1KTthKDE2KTthKDE3KTthKDE4KTtbU2suYnVpbHRpbi5vYmplY3QsU2suYnVpbHRpbi50eXBlXS5mb3JFYWNoKGE9PntTay5hYnN0ci5zZXRVcFNsb3RzKGEpO1NrLmFic3RyLnNldFVwTWV0aG9kcyhhKTtTay5hYnN0ci5zZXRVcEdldFNldHMoYSl9KTthKDE5KTthKDIwKTthKDIxKTtbU2suYnVpbHRpbi5zdHIsU2suYnVpbHRpbi5ub25lLFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQsU2suYnVpbHRpbi5vYmplY3RdLmZvckVhY2goYT0+e2E9YS5wcm90b3R5cGU7YS5fX2RvY19fPWEuaGFzT3duUHJvcGVydHkoXCJ0cCRkb2NcIik/bmV3IFNrLmJ1aWx0aW4uc3RyKGEudHAkZG9jKTpTay5idWlsdGluLm5vbmUubm9uZSR9KTtcbmEoMjIpO2EoMjMpO2EoMjQpO2EoMjUpO2EoMjYpO2EoMjcpO2EoMjgpO2EoMjkpO2EoMzEpO2EoMzIpO2EoMzMpO2EoMzQpO2EoMzUpO2EoMzYpO2EoMzcpO2EoMzgpO2EoMzkpO2EoNDApO2EoNDEpO2EoNDIpO2EoNDMpO2EoNDQpO2EoNDUpO2EoNDYpO2EoNDcpO2EoNDgpO2EoNDkpO2EoNTApO2EoNTEpO2EoNTIpO2EoNTMpO2EoNTQpO2EoNTUpO2EoNTYpO2EoNTcpO2EoNTgpO2EoNTkpO2EoNjApO2EoNjEpO2EoNjIpO2EoNjMpO2EoNjQpO2EoNjUpfSxmdW5jdGlvbihtLHEsYSl7KGZ1bmN0aW9uKGEpe3ZhciBiPXtidWlsZDp7Z2l0aGFzaDpcIjM0ODQ3ZWM3NWNlMjEyNzQxMzkzODI3MjU4MDY1MDEwMDQ2MzI4MTlcIixkYXRlOlwiMjAyMS0wNi0wN1QxNTo0NjowMC44MDRaXCJ9fTtiLmdsb2JhbD1cInVuZGVmaW5lZFwiIT09dHlwZW9mIGE/YTpcInVuZGVmaW5lZFwiIT09dHlwZW9mIHNlbGY/c2VsZjpcInVuZGVmaW5lZFwiIT09dHlwZW9mIHdpbmRvdz93aW5kb3c6e307Yi5leHBvcnRTeW1ib2w9XG5mdW5jdGlvbihhLGMpe2E9YS5zcGxpdChcIi5cIik7dmFyIGU9Yi5nbG9iYWwsZjtmb3IoZj0wO2Y8YS5sZW5ndGgtMTtmKyspe3ZhciBkPWFbZl07ZT1lLmhhc093blByb3BlcnR5KGQpP2VbZF06ZVtkXT17fX1cInVuZGVmaW5lZFwiIT09dHlwZW9mIGMmJihkPWFbZl0sZVtkXT1jKX07Yi5pc0FycmF5TGlrZT1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIEFycmF5fHxhJiZhLmxlbmd0aCYmXCJudW1iZXJcIj09dHlwZW9mIGEubGVuZ3RoPyEwOiExfTtiLmpzX2JlYXV0aWZ5PWZ1bmN0aW9uKGEpe3JldHVybiBhfTtiLmV4cG9ydFN5bWJvbChcIlNrXCIsYik7Yi5leHBvcnRTeW1ib2woXCJTay5nbG9iYWxcIixiLmdsb2JhbCk7Yi5leHBvcnRTeW1ib2woXCJTay5idWlsZFwiLGIuYnVpbGQpO2IuZXhwb3J0U3ltYm9sKFwiU2suZXhwb3J0U3ltYm9sXCIsYi5leHBvcnRTeW1ib2wpO2IuZXhwb3J0U3ltYm9sKFwiU2suaXNBcnJheUxpa2VcIixiLmlzQXJyYXlMaWtlKTtiLmV4cG9ydFN5bWJvbChcIlNrLmpzX2JlYXV0aWZ5XCIsXG5iLmpzX2JlYXV0aWZ5KX0pLmNhbGwodGhpcyxhKDApKX0sZnVuY3Rpb24obSxxKXsoZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGssbixBKXtmdW5jdGlvbiBwKGEsZCxrLGcpe2Zvcih2YXIgeT1cIlwiLG49bnVsbCx2PSExLEw9YS5sZW5ndGgsRz0hMSxFPTA7RTxMO0UrKyl7dmFyIEE9YS5jaGFyQ29kZUF0KEUpO2lmKCEwPT09dilpZig0NT09PUEpbj1cIlwiO2Vsc2UgaWYoOTU9PT1BKW49XCIgXCI7ZWxzZSBpZig0OD09PUEpbj1cIjBcIjtlbHNlIGlmKDU4PT09QSlHJiZoKFwiW1dBUk5JTkddIGRldGVjdGVkIHVzZSBvZiB1bnN1cHBvcnRlZCAlOjogb3IgJTo6OiBtb2RpZmllcnMgdG8gc3RyZnRpbWVcIiksRz0hMDtlbHNle3N3aXRjaChBKXtjYXNlIDM3OnkrPVwiJVwiO2JyZWFrO2Nhc2UgNjU6eSs9ay5kYXlzW2QuZ2V0RGF5KCldO2JyZWFrO2Nhc2UgNjY6eSs9ay5tb250aHNbZC5nZXRNb250aCgpXTticmVhaztjYXNlIDY3OnkrPWMoTWF0aC5mbG9vcihkLmdldEZ1bGxZZWFyKCkvMTAwKSxuKTtcbmJyZWFrO2Nhc2UgNjg6eSs9cChrLmZvcm1hdHMuRCxkLGssZyk7YnJlYWs7Y2FzZSA3MDp5Kz1wKGsuZm9ybWF0cy5GLGQsayxnKTticmVhaztjYXNlIDcyOnkrPWMoZC5nZXRIb3VycygpLG4pO2JyZWFrO2Nhc2UgNzM6eSs9YyhlKGQuZ2V0SG91cnMoKSksbik7YnJlYWs7Y2FzZSA3Njp5Kz1iKE1hdGguZmxvb3IoZyUxRTMpKTticmVhaztjYXNlIDc3OnkrPWMoZC5nZXRNaW51dGVzKCksbik7YnJlYWs7Y2FzZSA4MDp5Kz0xMj5kLmdldEhvdXJzKCk/ay5hbTprLnBtO2JyZWFrO2Nhc2UgODI6eSs9cChrLmZvcm1hdHMuUixkLGssZyk7YnJlYWs7Y2FzZSA4Mzp5Kz1jKGQuZ2V0U2Vjb25kcygpLG4pO2JyZWFrO2Nhc2UgODQ6eSs9cChrLmZvcm1hdHMuVCxkLGssZyk7YnJlYWs7Y2FzZSA4NTp5Kz1jKGYoZCxcInN1bmRheVwiKSxuKTticmVhaztjYXNlIDg3OnkrPWMoZihkLFwibW9uZGF5XCIpLG4pO2JyZWFrO2Nhc2UgODg6eSs9cChrLmZvcm1hdHMuWCxkLGssZyk7YnJlYWs7Y2FzZSA4OTp5Kz1cbmQuZ2V0RnVsbFllYXIoKTticmVhaztjYXNlIDkwOkQmJjA9PT1CP3krPVwiR01UXCI6KG49ZC50b1N0cmluZygpLm1hdGNoKC9cXCgoW1xcd1xcc10rKVxcKS8pLHkrPW4mJm5bMV18fFwiXCIpO2JyZWFrO2Nhc2UgOTc6eSs9ay5zaG9ydERheXNbZC5nZXREYXkoKV07YnJlYWs7Y2FzZSA5ODp5Kz1rLnNob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07YnJlYWs7Y2FzZSA5OTp5Kz1wKGsuZm9ybWF0cy5jLGQsayxnKTticmVhaztjYXNlIDEwMDp5Kz1jKGQuZ2V0RGF0ZSgpLG4pO2JyZWFrO2Nhc2UgMTAxOnkrPWMoZC5nZXREYXRlKCksbnVsbD09bj9cIiBcIjpuKTticmVhaztjYXNlIDEwNDp5Kz1rLnNob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07YnJlYWs7Y2FzZSAxMDY6bj1uZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksMCwxKTtuPU1hdGguY2VpbCgoZC5nZXRUaW1lKCktbi5nZXRUaW1lKCkpLzg2NEU1KTt5Kz1iKG4pO2JyZWFrO2Nhc2UgMTA3OnkrPWMoZC5nZXRIb3VycygpLG51bGw9PW4/XCIgXCI6bik7XG5icmVhaztjYXNlIDEwODp5Kz1jKGUoZC5nZXRIb3VycygpKSxudWxsPT1uP1wiIFwiOm4pO2JyZWFrO2Nhc2UgMTA5OnkrPWMoZC5nZXRNb250aCgpKzEsbik7YnJlYWs7Y2FzZSAxMTA6eSs9XCJcXG5cIjticmVhaztjYXNlIDExMTpuPWQuZ2V0RGF0ZSgpO3k9ay5vcmRpbmFsU3VmZml4ZXM/eSsoU3RyaW5nKG4pKyhrLm9yZGluYWxTdWZmaXhlc1tuLTFdfHxsKG4pKSk6eSsoU3RyaW5nKG4pK2wobikpO2JyZWFrO2Nhc2UgMTEyOnkrPTEyPmQuZ2V0SG91cnMoKT9rLkFNOmsuUE07YnJlYWs7Y2FzZSAxMTQ6eSs9cChrLmZvcm1hdHMucixkLGssZyk7YnJlYWs7Y2FzZSAxMTU6eSs9TWF0aC5mbG9vcihnLzFFMyk7YnJlYWs7Y2FzZSAxMTY6eSs9XCJcXHRcIjticmVhaztjYXNlIDExNzpuPWQuZ2V0RGF5KCk7eSs9MD09PW4/NzpuO2JyZWFrO2Nhc2UgMTE4OnkrPXAoay5mb3JtYXRzLnYsZCxrLGcpO2JyZWFrO2Nhc2UgMTE5OnkrPWQuZ2V0RGF5KCk7YnJlYWs7Y2FzZSAxMjA6eSs9cChrLmZvcm1hdHMueCxcbmQsayxnKTticmVhaztjYXNlIDEyMTp5Kz0oXCJcIitkLmdldEZ1bGxZZWFyKCkpLnNsaWNlKDIpO2JyZWFrO2Nhc2UgMTIyOkQmJjA9PT1CP3krPUc/XCIrMDA6MDBcIjpcIiswMDAwXCI6KG49MCE9PUI/Qi82RTQ6LWQuZ2V0VGltZXpvbmVPZmZzZXQoKSx2PUc/XCI6XCI6XCJcIixBPU1hdGguYWJzKG4lNjApLHkrPSgwPm4/XCItXCI6XCIrXCIpK2MoTWF0aC5mbG9vcihNYXRoLmFicyhuLzYwKSkpK3YrYyhBKSk7YnJlYWs7ZGVmYXVsdDp2JiYoeSs9XCIlXCIpLHkrPWFbRV19bj1udWxsO3Y9ITF9ZWxzZSAzNz09PUE/dj0hMDp5Kz1hW0VdfXJldHVybiB5fXZhciB2PWt8fGcsQj1ufHwwLEQ9QXx8ITEsRT0wLHUsbT1mdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBkPWIuZ2V0VGltZSgpO2lmKEQpe3ZhciBjPTZFNCooYi5nZXRUaW1lem9uZU9mZnNldCgpfHwwKTtiPW5ldyBEYXRlKGQrYytCKTs2RTQqKGIuZ2V0VGltZXpvbmVPZmZzZXQoKXx8MCkhPT1jJiYoYj02RTQqKGIuZ2V0VGltZXpvbmVPZmZzZXQoKXx8XG4wKSxiPW5ldyBEYXRlKGQrYitCKSl9fWVsc2UgZD1EYXRlLm5vdygpLGQ+RT8oRT1kLHU9bmV3IERhdGUoRSksZD1FLEQmJih1PW5ldyBEYXRlKEUrNkU0Kih1LmdldFRpbWV6b25lT2Zmc2V0KCl8fDApK0IpKSk6ZD1FLGI9dTtyZXR1cm4gcChhLGIsdixkKX07bS5sb2NhbGl6ZT1mdW5jdGlvbihiKXtyZXR1cm4gbmV3IGEoYnx8dixCLEQpfTttLmxvY2FsaXplQnlJZGVudGlmaWVyPWZ1bmN0aW9uKGEpe3ZhciBiPWRbYV07cmV0dXJuIGI/bS5sb2NhbGl6ZShiKTooaCgnW1dBUk5JTkddIE5vIGxvY2FsZSBmb3VuZCB3aXRoIGlkZW50aWZpZXIgXCInK2ErJ1wiLicpLG0pfTttLnRpbWV6b25lPWZ1bmN0aW9uKGIpe3ZhciBkPUIsYz1ELGU9dHlwZW9mIGI7aWYoXCJudW1iZXJcIj09PWV8fFwic3RyaW5nXCI9PT1lKWM9ITAsXCJzdHJpbmdcIj09PWU/KGQ9XCItXCI9PT1iWzBdPy0xOjEsZT1wYXJzZUludChiLnNsaWNlKDEsMyksMTApLGI9cGFyc2VJbnQoYi5zbGljZSgzLDUpLDEwKSxkPWQqKDYwKlxuZStiKSo2RTQpOlwibnVtYmVyXCI9PT1lJiYoZD02RTQqYik7cmV0dXJuIG5ldyBhKHYsZCxjKX07bS51dGM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGEodixCLCEwKX07cmV0dXJuIG19ZnVuY3Rpb24gYyhhLGIpe2lmKFwiXCI9PT1ifHw5PGEpcmV0dXJuIGE7bnVsbD09YiYmKGI9XCIwXCIpO3JldHVybiBiK2F9ZnVuY3Rpb24gYihhKXtyZXR1cm4gOTk8YT9hOjk8YT9cIjBcIithOlwiMDBcIithfWZ1bmN0aW9uIGUoYSl7cmV0dXJuIDA9PT1hPzEyOjEyPGE/YS0xMjphfWZ1bmN0aW9uIGYoYSxiKXtiPWJ8fFwic3VuZGF5XCI7dmFyIGQ9YS5nZXREYXkoKTtcIm1vbmRheVwiPT09YiYmKDA9PT1kP2Q9NjpkLS0pO2I9RGF0ZS5VVEMoYS5nZXRGdWxsWWVhcigpLDAsMSk7YT1EYXRlLlVUQyhhLmdldEZ1bGxZZWFyKCksYS5nZXRNb250aCgpLGEuZ2V0RGF0ZSgpKTtyZXR1cm4gTWF0aC5mbG9vcigoTWF0aC5mbG9vcigoYS1iKS84NjRFNSkrNy1kKS83KX1mdW5jdGlvbiBsKGEpe3ZhciBiPWElMTA7YSU9MTAwO1xuaWYoMTE8PWEmJjEzPj1hfHwwPT09Ynx8NDw9YilyZXR1cm5cInRoXCI7c3dpdGNoKGIpe2Nhc2UgMTpyZXR1cm5cInN0XCI7Y2FzZSAyOnJldHVyblwibmRcIjtjYXNlIDM6cmV0dXJuXCJyZFwifX1mdW5jdGlvbiBoKGEpe1widW5kZWZpbmVkXCIhPT10eXBlb2YgY29uc29sZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oYSl9dmFyIGQ9e2RlX0RFOntkYXlzOlwiU29ubnRhZyBNb250YWcgRGllbnN0YWcgTWl0dHdvY2ggRG9ubmVyc3RhZyBGcmVpdGFnIFNhbXN0YWdcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiU28gTW8gRGkgTWkgRG8gRnIgU2FcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiSmFudWFyIEZlYnJ1YXIgTVxcdTAwZTRyeiBBcHJpbCBNYWkgSnVuaSBKdWxpIEF1Z3VzdCBTZXB0ZW1iZXIgT2t0b2JlciBOb3ZlbWJlciBEZXplbWJlclwiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIkphbiBGZWIgTVxcdTAwZTRyIEFwciBNYWkgSnVuIEp1bCBBdWcgU2VwIE9rdCBOb3YgRGV6XCIuc3BsaXQoXCIgXCIpLFxuQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC4lbS4lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0sZW5fQ0E6e2RheXM6XCJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheVwiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJTdW4gTW9uIFR1ZSBXZWQgVGh1IEZyaSBTYXRcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiSmFudWFyeSBGZWJydWFyeSBNYXJjaCBBcHJpbCBNYXkgSnVuZSBKdWx5IEF1Z3VzdCBTZXB0ZW1iZXIgT2N0b2JlciBOb3ZlbWJlciBEZWNlbWJlclwiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLG9yZGluYWxTdWZmaXhlczpcInN0IG5kIHJkIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHN0IG5kIHJkIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHN0XCIuc3BsaXQoXCIgXCIpLFxuQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlclwiLHg6XCIlRFwifX0sZW5fVVM6e2RheXM6XCJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheVwiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJTdW4gTW9uIFR1ZSBXZWQgVGh1IEZyaSBTYXRcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiSmFudWFyeSBGZWJydWFyeSBNYXJjaCBBcHJpbCBNYXkgSnVuZSBKdWx5IEF1Z3VzdCBTZXB0ZW1iZXIgT2N0b2JlciBOb3ZlbWJlciBEZWNlbWJlclwiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLG9yZGluYWxTdWZmaXhlczpcInN0IG5kIHJkIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHN0IG5kIHJkIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHN0XCIuc3BsaXQoXCIgXCIpLFxuQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlbS8lZC8leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlclwiLHg6XCIlRFwifX0sZXNfTVg6e2RheXM6XCJkb21pbmdvIGx1bmVzIG1hcnRlcyBtaVxcdTAwZTlyY29sZXMganVldmVzIHZpZXJuZXMgc1xcdTAwZTFiYWRvXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcImRvbSBsdW4gbWFyIG1pXFx1MDBlOSBqdWUgdmllIHNcXHUwMGUxYlwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJlbmVybztmZWJyZXJvO21hcnpvO2FicmlsO21heW87anVuaW87anVsaW87YWdvc3RvO3NlcHRpZW1icmU7b2N0dWJyZTtub3ZpZW1icmU7IGRpY2llbWJyZVwiLnNwbGl0KFwiO1wiKSxzaG9ydE1vbnRoczpcImVuZSBmZWIgbWFyIGFiciBtYXkganVuIGp1bCBhZ28gc2VwIG9jdCBub3YgZGljXCIuc3BsaXQoXCIgXCIpLEFNOlwiQU1cIixQTTpcIlBNXCIsXG5hbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0sZnJfRlI6e2RheXM6XCJkaW1hbmNoZSBsdW5kaSBtYXJkaSBtZXJjcmVkaSBqZXVkaSB2ZW5kcmVkaSBzYW1lZGlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiZGltLiBsdW4uIG1hci4gbWVyLiBqZXUuIHZlbi4gc2FtLlwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW52aWVyIGZcXHUwMGU5dnJpZXIgbWFycyBhdnJpbCBtYWkganVpbiBqdWlsbGV0IGFvXFx1MDBmYnQgc2VwdGVtYnJlIG9jdG9icmUgbm92ZW1icmUgZFxcdTAwZTljZW1icmVcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJqYW52LiBmXFx1MDBlOXZyLiBtYXJzIGF2cmlsIG1haSBqdWluIGp1aWwuIGFvXFx1MDBmYnQgc2VwdC4gb2N0LiBub3YuIGRcXHUwMGU5Yy5cIi5zcGxpdChcIiBcIiksQU06XCJBTVwiLFxuUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsRDpcIiVkLyVtLyVZXCIsRjpcIiVZLSVtLSVkXCIsUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSxpdF9JVDp7ZGF5czpcImRvbWVuaWNhIGx1bmVkXFx1MDBlYyBtYXJ0ZWRcXHUwMGVjIG1lcmNvbGVkXFx1MDBlYyBnaW92ZWRcXHUwMGVjIHZlbmVyZFxcdTAwZWMgc2FiYXRvXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcImRvbSBsdW4gbWFyIG1lciBnaW8gdmVuIHNhYlwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJnZW5uYWlvIGZlYmJyYWlvIG1hcnpvIGFwcmlsZSBtYWdnaW8gZ2l1Z25vIGx1Z2xpbyBhZ29zdG8gc2V0dGVtYnJlIG90dG9icmUgbm92ZW1icmUgZGljZW1icmVcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJwciBtYWcgZ2l1IGx1ZyBhZ28gc2V0IG90dCBub3YgZGljXCIuc3BsaXQoXCIgXCIpLEFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLFxucG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0sbmxfTkw6e2RheXM6XCJ6b25kYWcgbWFhbmRhZyBkaW5zZGFnIHdvZW5zZGFnIGRvbmRlcmRhZyB2cmlqZGFnIHphdGVyZGFnXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcInpvIG1hIGRpIHdvIGRvIHZyIHphXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcImphbnVhcmkgZmVicnVhcmkgbWFhcnQgYXByaWwgbWVpIGp1bmkganVsaSBhdWd1c3R1cyBzZXB0ZW1iZXIgb2t0b2JlciBub3ZlbWJlciBkZWNlbWJlclwiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcImphbiBmZWIgbXJ0IGFwciBtZWkganVuIGp1bCBhdWcgc2VwIG9rdCBub3YgZGVjXCIuc3BsaXQoXCIgXCIpLEFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixcbkQ6XCIlZC0lbS0leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0scHRfQlI6e2RheXM6XCJkb21pbmdvIHNlZ3VuZGEgdGVyXFx1MDBlN2EgcXVhcnRhIHF1aW50YSBzZXh0YSBzXFx1MDBlMWJhZG9cIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiRG9tIFNlZyBUZXIgUXVhIFF1aSBTZXggU1xcdTAwZTFiXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcImphbmVpcm8gZmV2ZXJlaXJvIG1hclxcdTAwZTdvIGFicmlsIG1haW8ganVuaG8ganVsaG8gYWdvc3RvIHNldGVtYnJvIG91dHVicm8gbm92ZW1icm8gZGV6ZW1icm9cIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmV2IE1hciBBYnIgTWFpIEp1biBKdWwgQWdvIFNldCBPdXQgTm92IERlelwiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsRDpcIiVkLSVtLSVZXCIsRjpcIiVZLSVtLSVkXCIsXG5SOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LHJ1X1JVOntkYXlzOlwiXFx1MDQxMlxcdTA0M2VcXHUwNDQxXFx1MDQzYVxcdTA0NDBcXHUwNDM1XFx1MDQ0MVxcdTA0MzVcXHUwNDNkXFx1MDQ0Y1xcdTA0MzUgXFx1MDQxZlxcdTA0M2VcXHUwNDNkXFx1MDQzNVxcdTA0MzRcXHUwNDM1XFx1MDQzYlxcdTA0NGNcXHUwNDNkXFx1MDQzOFxcdTA0M2EgXFx1MDQxMlxcdTA0NDJcXHUwNDNlXFx1MDQ0MFxcdTA0M2RcXHUwNDM4XFx1MDQzYSBcXHUwNDIxXFx1MDQ0MFxcdTA0MzVcXHUwNDM0XFx1MDQzMCBcXHUwNDI3XFx1MDQzNVxcdTA0NDJcXHUwNDMyXFx1MDQzNVxcdTA0NDBcXHUwNDMzIFxcdTA0MWZcXHUwNDRmXFx1MDQ0MlxcdTA0M2RcXHUwNDM4XFx1MDQ0NlxcdTA0MzAgXFx1MDQyMVxcdTA0NDNcXHUwNDMxXFx1MDQzMVxcdTA0M2VcXHUwNDQyXFx1MDQzMFwiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJcXHUwNDEyXFx1MDQ0MSBcXHUwNDFmXFx1MDQzZCBcXHUwNDEyXFx1MDQ0MiBcXHUwNDIxXFx1MDQ0MCBcXHUwNDI3XFx1MDQ0MiBcXHUwNDFmXFx1MDQ0MiBcXHUwNDIxXFx1MDQzMVwiLnNwbGl0KFwiIFwiKSxcbm1vbnRoczpcIlxcdTA0MmZcXHUwNDNkXFx1MDQzMlxcdTA0MzBcXHUwNDQwXFx1MDQ0YyBcXHUwNDI0XFx1MDQzNVxcdTA0MzJcXHUwNDQwXFx1MDQzMFxcdTA0M2JcXHUwNDRjIFxcdTA0MWNcXHUwNDMwXFx1MDQ0MFxcdTA0NDIgXFx1MDQxMFxcdTA0M2ZcXHUwNDQwXFx1MDQzNVxcdTA0M2JcXHUwNDRjIFxcdTA0MWNcXHUwNDMwXFx1MDQzOSBcXHUwNDE4XFx1MDQ0ZVxcdTA0M2RcXHUwNDRjIFxcdTA0MThcXHUwNDRlXFx1MDQzYlxcdTA0NGMgXFx1MDQxMFxcdTA0MzJcXHUwNDMzXFx1MDQ0M1xcdTA0NDFcXHUwNDQyIFxcdTA0MjFcXHUwNDM1XFx1MDQzZFxcdTA0NDJcXHUwNDRmXFx1MDQzMVxcdTA0NDBcXHUwNDRjIFxcdTA0MWVcXHUwNDNhXFx1MDQ0MlxcdTA0NGZcXHUwNDMxXFx1MDQ0MFxcdTA0NGMgXFx1MDQxZFxcdTA0M2VcXHUwNDRmXFx1MDQzMVxcdTA0NDBcXHUwNDRjIFxcdTA0MTRcXHUwNDM1XFx1MDQzYVxcdTA0MzBcXHUwNDMxXFx1MDQ0MFxcdTA0NGNcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJcXHUwNDRmXFx1MDQzZFxcdTA0MzIgXFx1MDQ0NFxcdTA0MzVcXHUwNDMyIFxcdTA0M2NcXHUwNDMwXFx1MDQ0MCBcXHUwNDMwXFx1MDQzZlxcdTA0NDAgXFx1MDQzY1xcdTA0MzBcXHUwNDM5IFxcdTA0MzhcXHUwNDRlXFx1MDQzZCBcXHUwNDM4XFx1MDQ0ZVxcdTA0M2IgXFx1MDQzMFxcdTA0MzJcXHUwNDMzIFxcdTA0NDFcXHUwNDM1XFx1MDQzZCBcXHUwNDNlXFx1MDQzYVxcdTA0NDIgXFx1MDQzZFxcdTA0M2VcXHUwNDRmIFxcdTA0MzRcXHUwNDM1XFx1MDQzYVwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVhcIixEOlwiJWQuJW0uJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LHRyX1RSOntkYXlzOlwiUGF6YXIgUGF6YXJ0ZXNpIFNhbFxcdTAxMzEgXFx1MDBjN2FyXFx1MDE1ZmFtYmEgUGVyXFx1MDE1ZmVtYmUgQ3VtYSBDdW1hcnRlc2lcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiUGF6IFB6dCBTYWwgXFx1MDBjN3JcXHUwMTVmIFByXFx1MDE1ZiBDdW0gQ3RzXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIk9jYWsgXFx1MDE1ZXViYXQgTWFydCBOaXNhbiBNYXlcXHUwMTMxcyBIYXppcmFuIFRlbW11eiBBXFx1MDExZnVzdG9zIEV5bFxcdTAwZmNsIEVraW0gS2FzXFx1MDEzMW0gQXJhbFxcdTAxMzFrXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiT2NhIFxcdTAxNWV1YiBNYXIgTmlzIE1heSBIYXogVGVtIEFcXHUwMTFmdSBFeWwgRWtpIEthcyBBcmFcIi5zcGxpdChcIiBcIiksXG5BTTpcIlxcdTAwZDZcXHUwMGQ2XCIsUE06XCJcXHUwMGQ2U1wiLGFtOlwiXFx1MDBkNlxcdTAwZDZcIixwbTpcIlxcdTAwZDZTXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsRDpcIiVkLSVtLSVZXCIsRjpcIiVZLSVtLSVkXCIsUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSx6aF9DTjp7ZGF5czpcIlxcdTY2MWZcXHU2NzFmXFx1NjVlNSBcXHU2NjFmXFx1NjcxZlxcdTRlMDAgXFx1NjYxZlxcdTY3MWZcXHU0ZThjIFxcdTY2MWZcXHU2NzFmXFx1NGUwOSBcXHU2NjFmXFx1NjcxZlxcdTU2ZGIgXFx1NjYxZlxcdTY3MWZcXHU0ZTk0IFxcdTY2MWZcXHU2NzFmXFx1NTE2ZFwiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJcXHU2NWU1XFx1NGUwMFxcdTRlOGNcXHU0ZTA5XFx1NTZkYlxcdTRlOTRcXHU1MTZkXCIuc3BsaXQoXCJcIiksbW9udGhzOlwiXFx1NGUwMFxcdTY3MDhcXHU0ZWZkIFxcdTRlOGNcXHU2NzA4XFx1NGVmZCBcXHU0ZTA5XFx1NjcwOFxcdTRlZmQgXFx1NTZkYlxcdTY3MDhcXHU0ZWZkIFxcdTRlOTRcXHU2NzA4XFx1NGVmZCBcXHU1MTZkXFx1NjcwOFxcdTRlZmQgXFx1NGUwM1xcdTY3MDhcXHU0ZWZkIFxcdTUxNmJcXHU2NzA4XFx1NGVmZCBcXHU0ZTVkXFx1NjcwOFxcdTRlZmQgXFx1NTM0MVxcdTY3MDhcXHU0ZWZkIFxcdTUzNDFcXHU0ZTAwXFx1NjcwOFxcdTRlZmQgXFx1NTM0MVxcdTRlOGNcXHU2NzA4XFx1NGVmZFwiLnNwbGl0KFwiIFwiKSxcbnNob3J0TW9udGhzOlwiXFx1NGUwMFxcdTY3MDggXFx1NGU4Y1xcdTY3MDggXFx1NGUwOVxcdTY3MDggXFx1NTZkYlxcdTY3MDggXFx1NGU5NFxcdTY3MDggXFx1NTE2ZFxcdTY3MDggXFx1NGUwM1xcdTY3MDggXFx1NTE2YlxcdTY3MDggXFx1NGU1ZFxcdTY3MDggXFx1NTM0MVxcdTY3MDggXFx1NTM0MVxcdTRlMDBcXHU2NzA4IFxcdTUzNDFcXHU0ZThjXFx1NjcwOFwiLnNwbGl0KFwiIFwiKSxBTTpcIlxcdTRlMGFcXHU1MzQ4XCIsUE06XCJcXHU0ZTBiXFx1NTM0OFwiLGFtOlwiXFx1NGUwYVxcdTUzNDhcIixwbTpcIlxcdTRlMGJcXHU1MzQ4XCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsRDpcIiVkLyVtLyV5XCIsRjpcIiVZLSVtLSVkXCIsUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVyXCIseDpcIiVEXCJ9fX0sZz1kLmVuX1VTLG49bmV3IGEoZywwLCExKTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIG0pdmFyIGs9bS5leHBvcnRzPW47ZWxzZSBrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN8fCgwLGV2YWwpKFwidGhpc1wiKX0oKSxcbmsuc3RyZnRpbWU9bjtcImZ1bmN0aW9uXCIhPT10eXBlb2YgRGF0ZS5ub3cmJihEYXRlLm5vdz1mdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX0pfSkoKX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbigpe3ZhciBhPWZ1bmN0aW9uKGIsYyxmKXtyZXR1cm4gYS5wYXJzZShiLGMsZil9O2EudmVyc2lvbj1cIjAuMC4xXCI7KG0uZXhwb3J0cz1hKS5zdHJwdGltZT1hO2EubG9jYWxlPXthOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLEE6XCJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheVwiLnNwbGl0KFwiIFwiKSxiOlwiSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWNcIi5zcGxpdChcIiBcIiksQjpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksZjpcIkphbi4gRmViLiBNYXIuIEFwci4gTWF5IEp1bi4gSnVsLiBBdWcuIFNlcC4gT2N0LiBOb3YuIERlYy5cIi5zcGxpdChcIiBcIiksXG5jOlwiJVktJW0tJWQgJUg6JU06JVNcIixQOltcImFtXCIsXCJwbVwiXSxyOlwiJUk6JU06JVMgJXBcIix4OlwiJW0vJWQvJXlcIixYOlwiJUg6JU06JVNcIixkYXk6W1wiWWVzdGVyZGF5XCIsXCJUb2RheVwiLFwiVG9tb3Jyb3dcIl0sYmc6XCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlY1wiLnNwbGl0KFwiIFwiKSxCZzpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksZmc6XCJKYW4uIEZlYi4gTWFyLiBBcHIuIE1heSBKdW4uIEp1bC4gQXVnLiBTZXAuIE9jdC4gTm92LiBEZWMuXCIuc3BsaXQoXCIgXCIpLERhdGVfZEJZX3llYXJfaW5fSE06XCIlI0IgJS1kLCAlWSBhdCAlLUg6JU1cIixEYXRlX2RCWV95ZWFyOlwiJSNCICUtZCwgJVlcIixEYXRlX2RCWTpcIiUjQiAlLWQsICVZXCIsRGF0ZV9BZEJZOlwiJUEsICUjQiAlLWQsICVZXCIsRGF0ZV9kQkE6XCIlI0IgJS1kLCAlQVwiLFxuRGF0ZV9kZl9pbl9ITTpcIiUjZiwgJS1kIGF0ICUtSDolTVwiLERhdGVfZGZZOlwiJS1kICUjZiAlWVwiLERhdGVfZEJfaW5fSE06XCIlI0IgJS1kIGF0ICUtSDolTVwiLERhdGVfZGY6XCIlLWQgJSNmXCJ9OyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYyxlLGYsaCxsKXtjPVN0cmluZyhjKTtlPVN0cmluZyhlKTtjPWMucmVwbGFjZSgvXlsjXzBcXF5cXC0hfl0rLyxcIlwiKTtmPWRbY107aWYoIWYpcmV0dXJuIGE7dmFyIGs9ITE7LTE9PT1lLmluZGV4T2YoXCIhXCIpJiYxPT09Yy5sZW5ndGgmJigtMTxlLmluZGV4T2YoXCJ+XCIpfHwtMTxcImJCZlwiLmluZGV4T2YoYykmJi8lWzBcXC1fXT9kW1xcc10rJC8udGVzdChsLnN1YnN0cigwLGgpKSkmJihrPSEwKTtpZigoXCJJXCI9PT1jfHxcImxcIj09PWMpJiYhLyVbcFBdLy50ZXN0KGwpKXRocm93IEVycm9yKFwiVW5kZWZpbmVkIEFNL1BNXCIpO3N3aXRjaCh0eXBlb2YgZil7Y2FzZSBcImZ1bmN0aW9uXCI6cmV0dXJuIGYoKTtjYXNlIFwic3RyaW5nXCI6cmV0dXJuIGY7Y2FzZSBcIm9iamVjdFwiOnJldHVybiBiLm1ha2UucHVzaChbZi5tYWtlLFxuZSxrXSksXCIoXCIrZi5yZWcrXCIpXCI7ZGVmYXVsdDpyZXR1cm4gYX19ZnVuY3Rpb24gYyhhLGIpe2E9U3RyaW5nKGEpO2I9U3RyaW5nKGIpO3JldHVybi0xIT09Yi5pbmRleE9mKFwiI1wiKT9hLnN1YnN0cigwLDEpLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHIoMSk6LTEhPT1iLmluZGV4T2YoXCJeXCIpP2Euc3Vic3RyKDAsMSkrYS5zdWJzdHIoMSkudG9Mb3dlckNhc2UoKTphfXZhciBsPUFycmF5LnByb3RvdHlwZS5pbmRleE9mfHxmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5sZW5ndGgsZD0wO2Q8Yjspe2lmKGE9PXRoaXNbZF0pcmV0dXJuIGQ7ZCsrfXJldHVybi0xfSxoPWEubG9jYWxlLGQ9e1wiJVwiOlwiXFxcXCVcIixhOlwiXFxcXFMrXCIsQTpcIlxcXFxTK1wiLGI6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiLGQsZSl7Yj1sLmNhbGwoZT9oLmJnOmguYixjKGIsZCkpO2lmKC0xPT09YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGIpO3JldHVybiEwfX0saDp7cmVnOlwiXFxcXFMrXCIsbWFrZTpmdW5jdGlvbihhLFxuYixkLGUpe2I9bC5jYWxsKGU/aC5iZzpoLmIsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LEI6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiLGQsZSl7Yj1sLmNhbGwoZT9oLkJnOmguQixjKGIsZCkpO2lmKC0xPT09YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGIpO3JldHVybiEwfX0sZjp7cmVnOlwiXFxcXFMrXCIsbWFrZTpmdW5jdGlvbihhLGIsZCxlKXtiPWwuY2FsbChlP2guZmc6aC5mLGMoYixkKSk7aWYoLTE9PT1iKXJldHVybiExO2Euc2V0VVRDTW9udGgoYik7cmV0dXJuITB9fSxnOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigwPmJ8fDk5PGIpcmV0dXJuITE7Yis9MTAwKnBhcnNlSW50KChuZXcgRGF0ZSkuZ2V0VVRDRnVsbFllYXIoKS8xMDAsMTApO2Euc2V0VVRDRnVsbFllYXIoYik7cmV0dXJuITB9fSxHOntyZWc6XCJcXFxcZHs0fVwiLG1ha2U6ZnVuY3Rpb24oYSxcbmIpe2I9cGFyc2VJbnQoYiwxMCk7YS5zZXRVVENGdWxsWWVhcihiKTtyZXR1cm4hMH19LGQ6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDE+Ynx8MzE8YilyZXR1cm4hMTthLnNldFVUQ0RhdGUoYik7cmV0dXJuITB9fSxlOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDMxPGIpcmV0dXJuITE7YS5zZXRVVENEYXRlKGIpO3JldHVybiEwfX0sSDp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHwyMzxiKXJldHVybiExO2Euc2V0VVRDSG91cnMoYik7cmV0dXJuITB9fSxJOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrYik7cmV0dXJuITB9fSxtOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixcbm1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDE+Ynx8MTI8YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGItMSk7cmV0dXJuITB9fSxNOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigwPmJ8fDU5PGIpcmV0dXJuITE7YS5zZXRVVENNaW51dGVzKGIpO3JldHVybiEwfX0sbjpcIlxcXFxuXCIscDp7cmVnOlwiXFxcXFMrXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9bC5jYWxsKGguUCxiLnRvTG93ZXJDYXNlKCkpO2lmKC0xPT09YilyZXR1cm4hMTsxPT09YiYmYS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrMTIpO3JldHVybiEwfX0sUDp7cmVnOlwiXFxcXFMrXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9bC5jYWxsKGguUCxiLnRvTG93ZXJDYXNlKCkpO2lmKC0xPT09YilyZXR1cm4hMTsxPT09YiYmYS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrMTIpO3JldHVybiEwfX0sUzp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLFxuYil7Yj1wYXJzZUludChiLDEwKTtpZigwPmJ8fDYwPGIpcmV0dXJuITE7YS5zZXRVVENTZWNvbmRzKGIpO3JldHVybiEwfX0sdDpcIlxcXFx0XCIsdTpcIlxcXFxkXCIsVTpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLHc6XCJcXFxcZFwiLFc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIix5OntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigwPmJ8fDk5PGIpcmV0dXJuITE7Yis9MTAwKnBhcnNlSW50KChuZXcgRGF0ZSkuZ2V0VVRDRnVsbFllYXIoKS8xMDAsMTApO2Euc2V0VVRDRnVsbFllYXIoYik7cmV0dXJuITB9fSxZOntyZWc6XCJcXFxcZHs0fVwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2Euc2V0VVRDRnVsbFllYXIoYik7cmV0dXJuITB9fSx6OntyZWc6XCJbK1xcXFwtXVxcXFxkezR9XCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9Yi5tYXRjaCgvXihbK1xcLV0pKFxcZHsyfSkoXFxkezJ9KSQvKTtpZighYilyZXR1cm4hMTt2YXIgZD02RTQqKDYwKnBhcnNlSW50KGJbMl0sMTApK1xucGFyc2VJbnQoYlszXSwxMCkpO1wiK1wiPT09YlsxXSYmKGQ9LWQpO2Euc2V0VGltZShhLmdldFRpbWUoKStkKTtyZXR1cm4hMH19LGw6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDE+Ynx8MTI8YilyZXR1cm4hMTthLnNldFVUQ0hvdXJzKGEuZ2V0VVRDSG91cnMoKStiKTtyZXR1cm4hMH19LHM6e3JlZzpcIlxcXFxkK1wiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2Euc2V0VGltZSgxRTMqYik7cmV0dXJuITB9fSxjOmguYyxyOmgucixSOlwiJUg6JU1cIixUOlwiJUg6JU06JVNcIix4OmgueCxYOmguWCxEOlwiJW0vJWQvJXlcIixGOlwiJVktJW0tJWRcIixEYXRlX2lzbzpcIiVZLSVtLSVkVCVIOiVNOiVTXCIsRGF0ZV9kQllfeWVhcl9pbl9ITTpoLkRhdGVfZEJZX3llYXJfaW5fSE0sRGF0ZV9kQllfeWVhcjpoLkRhdGVfZEJZX3llYXIsRGF0ZV9kQlk6aC5EYXRlX2RCWSxEYXRlX2RCQTpoLkRhdGVfZEJBLERhdGVfQWRCWTpoLkRhdGVfQWRCWSxcbkRhdGVfZGZfaW5fSE06aC5EYXRlX2RmX2luX0hNLERhdGVfZGZZOmguRGF0ZV9kZlksRGF0ZV9kQl9pbl9ITTpoLkRhdGVfZEJfaW5fSE0sRGF0ZV9kbVlfX2RvdDpcIiVkLiVtLiVZXCIsRGF0ZV9kZjpoLkRhdGVfZGYsRGF0ZV9GVDpcIiVGICVUXCIsRGF0ZV9kbVlfX21pbnVzOlwiJWQtJW0tJVlcIn07YS5wYXJzZT1mdW5jdGlvbihhLGQsYyl7YT1TdHJpbmcoYSk7ZD1TdHJpbmcoZCk7Zm9yKHZhciBlPTU7LyUoRGF0ZV9bYS16QS1aMC05X10rfFtjREZyUlR4WF0pL2cudGVzdChkKSYmZTspZD1kLnJlcGxhY2UoLyUoRGF0ZV9bYS16QS1aMC05X10rfFtjREZyUlR4WF0pLyxiKSxlLS07Yi5tYWtlPVtdO2Q9ZC5yZXBsYWNlKC8lKChbI1xcXiF+XXswLDJ9KVthQWJCZmhdfChbMFxcLV9dPylbZGVnSEltTVNWV3lsXXxbR25wUHR1VXdZelpzJV0pL2csYik7YT1hLm1hdGNoKG5ldyBSZWdFeHAoZCkpO2lmKCFhfHwhYi5tYWtlLmxlbmd0aClyZXR1cm4gbnVsbDtkPW5ldyBEYXRlKERhdGUuVVRDKDAsXG4wKSk7ZT0wO2Zvcih2YXIgaz1iLm1ha2UubGVuZ3RoO2U8aztlKyspe3ZhciBmPWIubWFrZVtlXTtpZighZlswXShkLGFbZSsxXSxmWzFdLGZbMl0pKXJldHVybiBudWxsfWMmJmQuc2V0VGltZShkLmdldFRpbWUoKSs2RTQqZC5nZXRUaW1lem9uZU9mZnNldCgpKTtyZXR1cm4gZH19KShhKX0pKCl9LGZ1bmN0aW9uKG0scSxhKXttPWEoNik7Y29uc3QgYz1Tay5nbG9iYWwuSlNCST12b2lkIDAhPT1Tay5nbG9iYWwuQmlnSW50P3t9Om07aWYodm9pZCAwPT09U2suZ2xvYmFsLkJpZ0ludCl7Y29uc3QgYT1jLl9faXNCaWdJbnQ7Yy5fX2lzQmlnSW50PWE/Yj0+bnVsbCE9PWImJmEoYik6YT0+YSBpbnN0YW5jZW9mIGM7Yy5wb3dlcm1vZD0oYSxiLGwpPT57Y29uc3QgZT1jLkJpZ0ludCgxKTtsZXQgZD1lO2ZvcihiPWMuZ3JlYXRlclRoYW4oYixjLl9fWkVSTyk/YjpjLnVuYXJ5TWludXMoYik7Yy5ncmVhdGVyVGhhbihiLGMuX19aRVJPKTspYy5iaXR3aXNlQW5kKGIsZSkmJihkPWMucmVtYWluZGVyKGMubXVsdGlwbHkoZCxcbmEpLGwpKSxiPWMuc2lnbmVkUmlnaHRTaGlmdChiLGUpLGE9Yy5yZW1haW5kZXIoYy5tdWx0aXBseShhLGEpLGwpO3JldHVybiBkfX1lbHNlIE9iamVjdC5hc3NpZ24oYyx7QmlnSW50OlNrLmdsb2JhbC5CaWdJbnQsdG9OdW1iZXI6YT0+TnVtYmVyKGEpLHRvU3RyaW5nOmE9PmEudG9TdHJpbmcoKSxfX2lzQmlnSW50OmE9PlwiYmlnaW50XCI9PT10eXBlb2YgYSx1bmFyeU1pbnVzOmE9Pi1hLGJpdHdpc2VOb3Q6YT0+fmEsYml0d2lzZUFuZDooYSxjKT0+YSZjLGJpdHdpc2VPcjooYSxjKT0+YXxjLGJpdHdpc2VYb3I6KGEsYyk9PmFeYyxleHBvbmVudGlhdGU6KGEsZSk9Pntjb25zdCBiPWMuQmlnSW50KDEpO2xldCBsPWI7Zm9yKGU9ZT5jLl9fWkVSTz9lOi1lO2U+Yy5fX1pFUk87KWUmYiYmKGwqPWEpLGU+Pj1iLGEqPWE7cmV0dXJuIGx9LHBvd2VybW9kOihhLGUsZik9Pntjb25zdCBiPWMuQmlnSW50KDEpO2xldCBoPWI7Zm9yKGU9ZT5jLl9fWkVSTz9lOi1lO2U+Yy5fX1pFUk87KWUmXG5iJiYoaD1oKmElZiksZT4+PWIsYT1hKmElZjtyZXR1cm4gaH0sbXVsdGlwbHk6KGEsYyk9PmEqYyxkaXZpZGU6KGEsYyk9PmEvYyxyZW1haW5kZXI6KGEsYyk9PmElYyxhZGQ6KGEsYyk9PmErYyxzdWJ0cmFjdDooYSxjKT0+YS1jLGxlZnRTaGlmdDooYSxjKT0+YTw8YyxzaWduZWRSaWdodFNoaWZ0OihhLGMpPT5hPj5jLHVuc2lnbmVkUmlnaHRTaGlmdDooYSxjKT0+YT4+PmMsbGVzc1RoYW46KGEsYyk9PmE8YyxsZXNzVGhhbk9yRXF1YWw6KGEsYyk9PmE8PWMsZ3JlYXRlclRoYW46KGEsYyk9PmE+YyxncmVhdGVyVGhhbk9yRXF1YWw6KGEsYyk9PmE+PWMsZXF1YWw6KGEsYyk9PmE9PT1jLG5vdEVxdWFsOihhLGMpPT5hIT09Y30pO2MuX19aRVJPPWMuQmlnSW50KDApO2MuX19NQVhfU0FGRT1jLkJpZ0ludChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7Yy5fX01JTl9TQUZFPWMuQmlnSW50KC1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7Yy5udW1iZXJJZlNhZmU9YT0+Yy5sZXNzVGhhbihhLFxuYy5fX01BWF9TQUZFKSYmYy5ncmVhdGVyVGhhbihhLGMuX19NSU5fU0FGRSk/Yy50b051bWJlcihhKTphfSxmdW5jdGlvbihtLHEsYSl7KGZ1bmN0aW9uKGEsYil7bS5leHBvcnRzPWIoKX0pKHRoaXMsZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe1wiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtyZXR1cm4gYT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBhfSxhKGIpfWZ1bmN0aW9uIGIoYSxiKXtmb3IodmFyIGQsYz0wO2M8Yi5sZW5ndGg7YysrKWQ9YltjXSxkLmVudW1lcmFibGU9ZC5lbnVtZXJhYmxlfHwhMSxkLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBkJiYoZC53cml0YWJsZT1cbiEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxkLmtleSxkKX1mdW5jdGlvbiBlKGEsZCxjKXtyZXR1cm4gZCYmYihhLnByb3RvdHlwZSxkKSxjJiZiKGEsYyksYX1mdW5jdGlvbiBmKGEsYil7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgYiYmbnVsbCE9PWIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYiYmYi5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTphLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KTtiJiZoKGEsYil9ZnVuY3Rpb24gbChhKXtyZXR1cm4gbD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKGEpe3JldHVybiBhLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpfSxsKGEpfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm4gaD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKGEsXG5iKXtyZXR1cm4gYS5fX3Byb3RvX189YixhfSxoKGEsYil9ZnVuY3Rpb24gZCgpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2goRCl7cmV0dXJuITF9fWZ1bmN0aW9uIGcoKXtyZXR1cm4gZz1kKCk/UmVmbGVjdC5jb25zdHJ1Y3Q6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPVtudWxsXTtjLnB1c2guYXBwbHkoYyxiKTthPW5ldyAoRnVuY3Rpb24uYmluZC5hcHBseShhLGMpKTtyZXR1cm4gZCYmaChhLGQucHJvdG90eXBlKSxhfSxnLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBuKGEpe3ZhciBiPVwiZnVuY3Rpb25cIj09dHlwZW9mIE1hcD9uZXcgTWFwOnZvaWQgMDtcbnJldHVybiBuPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoKXtyZXR1cm4gZyhhLGFyZ3VtZW50cyxsKHRoaXMpLmNvbnN0cnVjdG9yKX1pZihudWxsPT09YXx8LTE9PT1GdW5jdGlvbi50b1N0cmluZy5jYWxsKGEpLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpKXJldHVybiBhO2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGEpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBiKXtpZihiLmhhcyhhKSlyZXR1cm4gYi5nZXQoYSk7Yi5zZXQoYSxkKX1yZXR1cm4gZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksaChkLGEpfSxuKGEpfWZ1bmN0aW9uIGsoYSl7dmFyIGI9ZCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWwoYSk7aWYoYil7dmFyIGM9XG5sKHRoaXMpLmNvbnN0cnVjdG9yO2Q9UmVmbGVjdC5jb25zdHJ1Y3QoZCxhcmd1bWVudHMsYyl9ZWxzZSBkPWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCFkfHxcIm9iamVjdFwiIT10eXBlb2YgZCYmXCJmdW5jdGlvblwiIT10eXBlb2YgZCl7aWYodm9pZCAwPT09dGhpcyl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7ZD10aGlzfXJldHVybiBkfX1mdW5jdGlvbiBwKGEsYil7aWYoYSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGEpcmV0dXJuIHUoYSxiKTt2YXIgZD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkuc2xpY2UoOCwtMSk7cmV0dXJuXCJPYmplY3RcIj09PWQmJmEuY29uc3RydWN0b3ImJihkPWEuY29uc3RydWN0b3IubmFtZSksXCJNYXBcIj09PWR8fFwiU2V0XCI9PT1kP0FycmF5LmZyb20oYSk6XCJBcmd1bWVudHNcIj09PWR8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGQpP1xudShhLGIpOnZvaWQgMH19ZnVuY3Rpb24gdShhLGIpeyhudWxsPT1ifHxiPmEubGVuZ3RoKSYmKGI9YS5sZW5ndGgpO2Zvcih2YXIgZD0wLGM9QXJyYXkoYik7ZDxiO2QrKyljW2RdPWFbZF07cmV0dXJuIGN9ZnVuY3Rpb24gQShhLGIpe3ZhciBkO2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PWFbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheShhKXx8KGQ9cChhKSl8fGImJmEmJlwibnVtYmVyXCI9PXR5cGVvZiBhLmxlbmd0aCl7ZCYmKGE9ZCk7dmFyIGM9MDtiPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpiLG46ZnVuY3Rpb24oKXtyZXR1cm4gYz49YS5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOmFbYysrXX19LGU6ZnVuY3Rpb24oYSl7dGhyb3cgYTt9LGY6Yn19dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufXZhciBlLGs9ITAsZj0hMTtyZXR1cm57czpmdW5jdGlvbigpe2Q9YVtTeW1ib2wuaXRlcmF0b3JdKCl9LG46ZnVuY3Rpb24oKXt2YXIgYT1kLm5leHQoKTtyZXR1cm4gaz1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtmPSEwO2U9YX0sZjpmdW5jdGlvbigpe3RyeXtrfHxudWxsPT1kLnJldHVybnx8ZC5yZXR1cm4oKX1maW5hbGx5e2lmKGYpdGhyb3cgZTt9fX19dmFyIHQ9TWF0aC5pbXVsLHY9TWF0aC5jbHozMixCPWZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoYSxiKXt2YXIgYztpZighKHRoaXMgaW5zdGFuY2VvZiBkKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO2lmKGE+ZC5fX2tNYXhMZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXhpbXVtIEJpZ0ludCBzaXplIGV4Y2VlZGVkXCIpO3JldHVybiBjPWguY2FsbCh0aGlzLGEpLGMuc2lnbj1iLGN9dmFyIGM9TWF0aC5hYnMsZz1NYXRoLm1heDtmKGQsYik7dmFyIGg9ayhkKTtcbnJldHVybiBlKGQsW3trZXk6XCJ0b0RlYnVnU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYSxiPVtcIkJpZ0ludFtcIl0sZD1BKHRoaXMpO3RyeXtmb3IoZC5zKCk7IShhPWQubigpKS5kb25lOyl7dmFyIGM9YS52YWx1ZTtiLnB1c2goKGM/KGM+Pj4wKS50b1N0cmluZygxNik6YykrXCIsIFwiKX19Y2F0Y2goUCl7ZC5lKFApfWZpbmFsbHl7ZC5mKCl9cmV0dXJuIGIucHVzaChcIl1cIiksYi5qb2luKFwiXCIpfX0se2tleTpcInRvU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT0wPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MTA7aWYoMj5hfHwzNjxhKXRocm93IG5ldyBSYW5nZUVycm9yKFwidG9TdHJpbmcoKSByYWRpeCBhcmd1bWVudCBtdXN0IGJlIGJldHdlZW4gMiBhbmQgMzZcIik7cmV0dXJuIDA9PT10aGlzLmxlbmd0aD9cIjBcIjowPT0oYSZhLTEpP2QuX190b1N0cmluZ0Jhc2VQb3dlck9mVHdvKHRoaXMsYSk6ZC5fX3RvU3RyaW5nR2VuZXJpYyh0aGlzLFxuYSwhMSl9fSx7a2V5OlwiX19jb3B5XCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9bmV3IGQodGhpcy5sZW5ndGgsdGhpcy5zaWduKSxiPTA7Yjx0aGlzLmxlbmd0aDtiKyspYVtiXT10aGlzW2JdO3JldHVybiBhfX0se2tleTpcIl9fdHJpbVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMubGVuZ3RoLGI9dGhpc1thLTFdOzA9PT1iOylhLS0sYj10aGlzW2EtMV0sdGhpcy5wb3AoKTtyZXR1cm4gMD09PWEmJih0aGlzLnNpZ249ITEpLHRoaXN9fSx7a2V5OlwiX19pbml0aWFsaXplRGlnaXRzXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMubGVuZ3RoO2ErKyl0aGlzW2FdPTB9fSx7a2V5OlwiX19jbHptc2RcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkLl9fY2x6MzIodGhpc1t0aGlzLmxlbmd0aC0xXSl9fSx7a2V5OlwiX19pbnBsYWNlTXVsdGlwbHlBZGRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7Yz50aGlzLmxlbmd0aCYmKGM9dGhpcy5sZW5ndGgpO3ZhciBlPVxuNjU1MzUmYTthPj4+PTE2O3ZhciBrPTAsZj02NTUzNSZiO2I+Pj49MTY7Zm9yKHZhciBnPTA7ZzxjO2crKyl7dmFyIGg9dGhpcy5fX2RpZ2l0KGcpLHA9NjU1MzUmaCxsPWg+Pj4xNjtoPWQuX19pbXVsKHAsZSk7cD1kLl9faW11bChwLGEpO3ZhciB2PWQuX19pbXVsKGwsZSk7bD1kLl9faW11bChsLGEpO3ZhciB5PWYrKDY1NTM1JmgpO2g9YitrKyh5Pj4+MTYpKyhoPj4+MTYpKyg2NTUzNSZwKSsoNjU1MzUmdik7Zj0ocD4+PjE2KSsodj4+PjE2KSsoNjU1MzUmbCkrKGg+Pj4xNik7az1mPj4+MTY7ZiY9NjU1MzU7Yj1sPj4+MTY7dGhpcy5fX3NldERpZ2l0KGcsNjU1MzUmeXxoPDwxNil9aWYoMCE9PWt8fDAhPT1mfHwwIT09Yil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTt9fSx7a2V5OlwiX19pbnBsYWNlQWRkXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGQpe2Zvcih2YXIgYyxlPTAsaz0wO2s8ZDtrKyspYz10aGlzLl9faGFsZkRpZ2l0KGIraykrYS5fX2hhbGZEaWdpdChrKStcbmUsZT1jPj4+MTYsdGhpcy5fX3NldEhhbGZEaWdpdChiK2ssYyk7cmV0dXJuIGV9fSx7a2V5OlwiX19pbnBsYWNlU3ViXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPTA7aWYoMSZiKXtiPj49MTtmb3IodmFyIGU9dGhpcy5fX2RpZ2l0KGIpLGs9NjU1MzUmZSxmPTA7ZjxkLTE+Pj4xO2YrKyl7dmFyIGc9YS5fX2RpZ2l0KGYpO2U9KGU+Pj4xNiktKDY1NTM1JmcpLWM7Yz0xJmU+Pj4xNjt0aGlzLl9fc2V0RGlnaXQoYitmLGU8PDE2fDY1NTM1JmspO2U9dGhpcy5fX2RpZ2l0KGIrZisxKTtrPSg2NTUzNSZlKS0oZz4+PjE2KS1jO2M9MSZrPj4+MTZ9Zz1hLl9fZGlnaXQoZik7dmFyIGg9KGU+Pj4xNiktKDY1NTM1JmcpLWM7Yz0xJmg+Pj4xNjt0aGlzLl9fc2V0RGlnaXQoYitmLGg8PDE2fDY1NTM1JmspO2lmKGIrZisxPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm91dCBvZiBib3VuZHNcIik7MD09KDEmZCkmJihlPXRoaXMuX19kaWdpdChiK2YrMSksaz0oNjU1MzUmXG5lKS0oZz4+PjE2KS1jLGM9MSZrPj4+MTYsdGhpcy5fX3NldERpZ2l0KGIrYS5sZW5ndGgsNDI5NDkwMTc2MCZlfDY1NTM1JmspKX1lbHNle2I+Pj0xO2ZvcihrPTA7azxhLmxlbmd0aC0xO2srKyllPXRoaXMuX19kaWdpdChiK2spLGc9YS5fX2RpZ2l0KGspLGY9KDY1NTM1JmUpLSg2NTUzNSZnKS1jLGM9MSZmPj4+MTYsZT0oZT4+PjE2KS0oZz4+PjE2KS1jLGM9MSZlPj4+MTYsdGhpcy5fX3NldERpZ2l0KGIrayxlPDwxNnw2NTUzNSZmKTtmPXRoaXMuX19kaWdpdChiK2spO2E9YS5fX2RpZ2l0KGspO2U9KDY1NTM1JmYpLSg2NTUzNSZhKS1jO2M9MSZlPj4+MTY7Zz0wOzA9PSgxJmQpJiYoZz0oZj4+PjE2KS0oYT4+PjE2KS1jLGM9MSZnPj4+MTYpO3RoaXMuX19zZXREaWdpdChiK2ssZzw8MTZ8NjU1MzUmZSl9cmV0dXJuIGN9fSx7a2V5OlwiX19pbnBsYWNlUmlnaHRTaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe2lmKDAhPT1hKXtmb3IodmFyIGIsZD10aGlzLl9fZGlnaXQoMCk+Pj5hLFxuYz10aGlzLmxlbmd0aC0xLGU9MDtlPGM7ZSsrKWI9dGhpcy5fX2RpZ2l0KGUrMSksdGhpcy5fX3NldERpZ2l0KGUsYjw8MzItYXxkKSxkPWI+Pj5hO3RoaXMuX19zZXREaWdpdChjLGQpfX19LHtrZXk6XCJfX2RpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXNbYV19fSx7a2V5OlwiX191bnNpZ25lZERpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXNbYV0+Pj4wfX0se2tleTpcIl9fc2V0RGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3RoaXNbYV09MHxifX0se2tleTpcIl9fc2V0RGlnaXRHcm93XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt0aGlzW2FdPTB8Yn19LHtrZXk6XCJfX2hhbGZEaWdpdExlbmd0aFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZW5ndGg7cmV0dXJuIDY1NTM1Pj10aGlzLl9fdW5zaWduZWREaWdpdChhLTEpPzIqYS0xOjIqYX19LHtrZXk6XCJfX2hhbGZEaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiA2NTUzNSZ0aGlzW2E+Pj4xXT4+PlxuKCgxJmEpPDw0KX19LHtrZXk6XCJfX3NldEhhbGZEaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YT4+PjEsYz10aGlzLl9fZGlnaXQoZCk7dGhpcy5fX3NldERpZ2l0KGQsMSZhPzY1NTM1JmN8Yjw8MTY6NDI5NDkwMTc2MCZjfDY1NTM1JmIpfX1dLFt7a2V5OlwiQmlnSW50XCIsdmFsdWU6ZnVuY3Rpb24oYil7dmFyIGM9TWF0aC5mbG9vcixlPU51bWJlci5pc0Zpbml0ZTtpZihcIm51bWJlclwiPT10eXBlb2YgYil7aWYoMD09PWIpcmV0dXJuIGQuX196ZXJvKCk7aWYoKDB8Yik9PT1iKXJldHVybiAwPmI/ZC5fX29uZURpZ2l0KC1iLCEwKTpkLl9fb25lRGlnaXQoYiwhMSk7aWYoIWUoYil8fGMoYikhPT1iKXRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIG51bWJlciBcIitiK1wiIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gQmlnSW50IGJlY2F1c2UgaXQgaXMgbm90IGFuIGludGVnZXJcIik7cmV0dXJuIGQuX19mcm9tRG91YmxlKGIpfWlmKFwic3RyaW5nXCI9PXR5cGVvZiBiKXtjPWQuX19mcm9tU3RyaW5nKGIpO1xuaWYobnVsbD09PWMpdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQ2Fubm90IGNvbnZlcnQgXCIrYitcIiB0byBhIEJpZ0ludFwiKTtyZXR1cm4gY31pZihcImJvb2xlYW5cIj09dHlwZW9mIGIpcmV0dXJuITA9PT1iP2QuX19vbmVEaWdpdCgxLCExKTpkLl9femVybygpO2lmKFwib2JqZWN0XCI9PT1hKGIpKXtpZihiLmNvbnN0cnVjdG9yPT09ZClyZXR1cm4gYjtiPWQuX190b1ByaW1pdGl2ZShiKTtyZXR1cm4gZC5CaWdJbnQoYil9dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IFwiK2IrXCIgdG8gYSBCaWdJbnRcIik7fX0se2tleTpcInRvTnVtYmVyXCIsdmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5sZW5ndGg7aWYoMD09PWIpcmV0dXJuIDA7aWYoMT09PWIpe3ZhciBjPWEuX191bnNpZ25lZERpZ2l0KDApO3JldHVybiBhLnNpZ24/LWM6Y312YXIgZT1hLl9fZGlnaXQoYi0xKSxrPWQuX19jbHozMihlKTtjPTMyKmItaztpZigxMDI0PGMpcmV0dXJuIGEuc2lnbj8tSW5maW5pdHk6MS8wOy0tYztcbnZhciBmPWItMSxnPWsrMTtrPSgzMj09PWc/MDplPDxnKT4+PjEyO3ZhciBoPWctMTI7Yj0xMjw9Zz8wOmU8PDIwK2c7Zz0yMCtnOzA8aCYmMDxmJiYoZi0tLGU9YS5fX2RpZ2l0KGYpLGt8PWU+Pj4zMi1oLGI9ZTw8aCxnPWgpOzA8ZyYmMDxmJiYoZi0tLGU9YS5fX2RpZ2l0KGYpLGJ8PWU+Pj4zMi1nLGctPTMyKTtlPWQuX19kZWNpZGVSb3VuZGluZyhhLGcsZixlKTtpZigoMT09PWV8fDA9PT1lJiYxPT0oMSZiKSkmJihiPWIrMT4+PjAsMD09PWImJihrKyssMCE9az4+PjIwJiYoaz0wLGMrKywxMDIzPGMpKSkpcmV0dXJuIGEuc2lnbj8tSW5maW5pdHk6MS8wO2E9YS5zaWduPy0yMTQ3NDgzNjQ4OjA7cmV0dXJuIGM9YysxMDIzPDwyMCxkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdPWF8Y3xrLGQuX19rQml0Q29udmVyc2lvbkludHNbMF09YixkLl9fa0JpdENvbnZlcnNpb25Eb3VibGVbMF19fSx7a2V5OlwidW5hcnlNaW51c1wiLHZhbHVlOmZ1bmN0aW9uKGEpe2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtcbnZhciBiPWEuX19jb3B5KCk7cmV0dXJuIGIuc2lnbj0hYS5zaWduLGJ9fSx7a2V5OlwiYml0d2lzZU5vdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnNpZ24/ZC5fX2Fic29sdXRlU3ViT25lKGEpLl9fdHJpbSgpOmQuX19hYnNvbHV0ZUFkZE9uZShhLCEwKX19LHtrZXk6XCJleHBvbmVudGlhdGVcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKGIuc2lnbil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkV4cG9uZW50IG11c3QgYmUgcG9zaXRpdmVcIik7aWYoMD09PWIubGVuZ3RoKXJldHVybiBkLl9fb25lRGlnaXQoMSwhMSk7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDE9PT1hLmxlbmd0aCYmMT09PWEuX19kaWdpdCgwKSlyZXR1cm4gYS5zaWduJiYwPT0oMSZiLl9fZGlnaXQoMCkpP2QudW5hcnlNaW51cyhhKTphO2lmKDE8Yi5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCaWdJbnQgdG9vIGJpZ1wiKTtiPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iKXJldHVybiBhO2lmKGI+PVxuZC5fX2tNYXhMZW5ndGhCaXRzKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQmlnSW50IHRvbyBiaWdcIik7aWYoMT09PWEubGVuZ3RoJiYyPT09YS5fX2RpZ2l0KDApKXt2YXIgYz0xKyhiPj4+NSk7YT1uZXcgZChjLGEuc2lnbiYmMCE9KDEmYikpO2EuX19pbml0aWFsaXplRGlnaXRzKCk7cmV0dXJuIGEuX19zZXREaWdpdChjLTEsMTw8KDMxJmIpKSxhfWM9bnVsbDt2YXIgZT1hOzAhPSgxJmIpJiYoYz1hKTtmb3IoYj4+PTE7MCE9PWI7Yj4+PTEpZT1kLm11bHRpcGx5KGUsZSksMCE9KDEmYikmJihudWxsPT09Yz9jPWU6Yz1kLm11bHRpcGx5KGMsZSkpO3JldHVybiBjfX0se2tleTpcIm11bHRpcGx5XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGE7aWYoMD09PWIubGVuZ3RoKXJldHVybiBiO3ZhciBjPWEubGVuZ3RoK2IubGVuZ3RoOzMyPD1hLl9fY2x6bXNkKCkrYi5fX2Nsem1zZCgpJiZjLS07Yz1uZXcgZChjLGEuc2lnbiE9PWIuc2lnbik7Yy5fX2luaXRpYWxpemVEaWdpdHMoKTtcbmZvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQuX19tdWx0aXBseUFjY3VtdWxhdGUoYixhLl9fZGlnaXQoZSksYyxlKTtyZXR1cm4gYy5fX3RyaW0oKX19LHtrZXk6XCJkaXZpZGVcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKDA9PT1iLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkRpdmlzaW9uIGJ5IHplcm9cIik7aWYoMD5kLl9fYWJzb2x1dGVDb21wYXJlKGEsYikpcmV0dXJuIGQuX196ZXJvKCk7dmFyIGM9YS5zaWduIT09Yi5zaWduLGU9Yi5fX3Vuc2lnbmVkRGlnaXQoMCk7aWYoMT09PWIubGVuZ3RoJiY2NTUzNT49ZSl7aWYoMT09PWUpcmV0dXJuIGM9PT1hLnNpZ24/YTpkLnVuYXJ5TWludXMoYSk7YT1kLl9fYWJzb2x1dGVEaXZTbWFsbChhLGUsbnVsbCl9ZWxzZSBhPWQuX19hYnNvbHV0ZURpdkxhcmdlKGEsYiwhMCwhMSk7cmV0dXJuIGEuc2lnbj1jLGEuX190cmltKCl9fSx7a2V5OlwicmVtYWluZGVyXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEaXZpc2lvbiBieSB6ZXJvXCIpO1xuaWYoMD5kLl9fYWJzb2x1dGVDb21wYXJlKGEsYikpcmV0dXJuIGE7dmFyIGM9Yi5fX3Vuc2lnbmVkRGlnaXQoMCk7aWYoMT09PWIubGVuZ3RoJiY2NTUzNT49Yyl7aWYoMT09PWMpcmV0dXJuIGQuX196ZXJvKCk7Yj1kLl9fYWJzb2x1dGVNb2RTbWFsbChhLGMpO3JldHVybiAwPT09Yj9kLl9femVybygpOmQuX19vbmVEaWdpdChiLGEuc2lnbil9Yj1kLl9fYWJzb2x1dGVEaXZMYXJnZShhLGIsITEsITApO3JldHVybiBiLnNpZ249YS5zaWduLGIuX190cmltKCl9fSx7a2V5OlwiYWRkXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnNpZ247cmV0dXJuIGM9PT1iLnNpZ24/ZC5fX2Fic29sdXRlQWRkKGEsYixjKTowPD1kLl9fYWJzb2x1dGVDb21wYXJlKGEsYik/ZC5fX2Fic29sdXRlU3ViKGEsYixjKTpkLl9fYWJzb2x1dGVTdWIoYixhLCFjKX19LHtrZXk6XCJzdWJ0cmFjdFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zaWduO3JldHVybiBjPT09Yi5zaWduPzA8PWQuX19hYnNvbHV0ZUNvbXBhcmUoYSxcbmIpP2QuX19hYnNvbHV0ZVN1YihhLGIsYyk6ZC5fX2Fic29sdXRlU3ViKGIsYSwhYyk6ZC5fX2Fic29sdXRlQWRkKGEsYixjKX19LHtrZXk6XCJsZWZ0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPT09Yi5sZW5ndGh8fDA9PT1hLmxlbmd0aD9hOmIuc2lnbj9kLl9fcmlnaHRTaGlmdEJ5QWJzb2x1dGUoYSxiKTpkLl9fbGVmdFNoaWZ0QnlBYnNvbHV0ZShhLGIpfX0se2tleTpcInNpZ25lZFJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPT09Yi5sZW5ndGh8fDA9PT1hLmxlbmd0aD9hOmIuc2lnbj9kLl9fbGVmdFNoaWZ0QnlBYnNvbHV0ZShhLGIpOmQuX19yaWdodFNoaWZ0QnlBYnNvbHV0ZShhLGIpfX0se2tleTpcInVuc2lnbmVkUmlnaHRTaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkJpZ0ludHMgaGF2ZSBubyB1bnNpZ25lZCByaWdodCBzaGlmdDsgdXNlID4+IGluc3RlYWRcIik7fX0se2tleTpcImxlc3NUaGFuXCIsXG52YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPmQuX19jb21wYXJlVG9CaWdJbnQoYSxiKX19LHtrZXk6XCJsZXNzVGhhbk9yRXF1YWxcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPj1kLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwiZ3JlYXRlclRoYW5cIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKX19LHtrZXk6XCJncmVhdGVyVGhhbk9yRXF1YWxcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPD1kLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwiZXF1YWxcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKGEuc2lnbiE9PWIuc2lnbnx8YS5sZW5ndGghPT1iLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKylpZihhLl9fZGlnaXQoZCkhPT1iLl9fZGlnaXQoZCkpcmV0dXJuITE7cmV0dXJuITB9fSx7a2V5Olwibm90RXF1YWxcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiFkLmVxdWFsKGEsXG5iKX19LHtrZXk6XCJiaXR3aXNlQW5kXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZighYS5zaWduJiYhYi5zaWduKXJldHVybiBkLl9fYWJzb2x1dGVBbmQoYSxiKS5fX3RyaW0oKTtpZihhLnNpZ24mJmIuc2lnbil7dmFyIGM9ZyhhLmxlbmd0aCxiLmxlbmd0aCkrMTthPWQuX19hYnNvbHV0ZVN1Yk9uZShhLGMpO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIpO3JldHVybiBhPWQuX19hYnNvbHV0ZU9yKGEsYixhKSxkLl9fYWJzb2x1dGVBZGRPbmUoYSwhMCxhKS5fX3RyaW0oKX1hLnNpZ24mJihiPVtiLGFdLGE9YlswXSxiPWJbMV0pO3JldHVybiBkLl9fYWJzb2x1dGVBbmROb3QoYSxkLl9fYWJzb2x1dGVTdWJPbmUoYikpLl9fdHJpbSgpfX0se2tleTpcImJpdHdpc2VYb3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKCFhLnNpZ24mJiFiLnNpZ24pcmV0dXJuIGQuX19hYnNvbHV0ZVhvcihhLGIpLl9fdHJpbSgpO2lmKGEuc2lnbiYmYi5zaWduKXt2YXIgYz1nKGEubGVuZ3RoLGIubGVuZ3RoKTthPVxuZC5fX2Fic29sdXRlU3ViT25lKGEsYyk7Yj1kLl9fYWJzb2x1dGVTdWJPbmUoYik7cmV0dXJuIGQuX19hYnNvbHV0ZVhvcihhLGIsYSkuX190cmltKCl9Yz1nKGEubGVuZ3RoLGIubGVuZ3RoKSsxO2Euc2lnbiYmKGI9W2IsYV0sYT1iWzBdLGI9YlsxXSk7Yj1kLl9fYWJzb2x1dGVTdWJPbmUoYixjKTtyZXR1cm4gYj1kLl9fYWJzb2x1dGVYb3IoYixhLGIpLGQuX19hYnNvbHV0ZUFkZE9uZShiLCEwLGIpLl9fdHJpbSgpfX0se2tleTpcImJpdHdpc2VPclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZyhhLmxlbmd0aCxiLmxlbmd0aCk7aWYoIWEuc2lnbiYmIWIuc2lnbilyZXR1cm4gZC5fX2Fic29sdXRlT3IoYSxiKS5fX3RyaW0oKTtpZihhLnNpZ24mJmIuc2lnbilyZXR1cm4gYT1kLl9fYWJzb2x1dGVTdWJPbmUoYSxjKSxiPWQuX19hYnNvbHV0ZVN1Yk9uZShiKSxhPWQuX19hYnNvbHV0ZUFuZChhLGIsYSksZC5fX2Fic29sdXRlQWRkT25lKGEsITAsYSkuX190cmltKCk7YS5zaWduJiZcbihiPVtiLGFdLGE9YlswXSxiPWJbMV0pO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIsYyk7cmV0dXJuIGI9ZC5fX2Fic29sdXRlQW5kTm90KGIsYSxiKSxkLl9fYWJzb2x1dGVBZGRPbmUoYiwhMCxiKS5fX3RyaW0oKX19LHtrZXk6XCJhc0ludE5cIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYjtpZigwPT09YSlyZXR1cm4gZC5fX3plcm8oKTtpZihhPj1kLl9fa01heExlbmd0aEJpdHMpcmV0dXJuIGI7dmFyIGM9YSszMT4+PjU7aWYoYi5sZW5ndGg8YylyZXR1cm4gYjt2YXIgZT1iLl9fdW5zaWduZWREaWdpdChjLTEpLGs9MTw8KDMxJmEtMSk7aWYoYi5sZW5ndGg9PT1jJiZlPGspcmV0dXJuIGI7aWYoKGUmaykhPT1rKXJldHVybiBkLl9fdHJ1bmNhdGVUb05CaXRzKGEsYik7aWYoIWIuc2lnbilyZXR1cm4gZC5fX3RydW5jYXRlQW5kU3ViRnJvbVBvd2VyT2ZUd28oYSxiLCEwKTtpZigwPT0oZSZrLTEpKXtmb3IodmFyIGY9Yy0yOzA8PWY7Zi0tKWlmKDAhPT1cbmIuX19kaWdpdChmKSlyZXR1cm4gZC5fX3RydW5jYXRlQW5kU3ViRnJvbVBvd2VyT2ZUd28oYSxiLCExKTtyZXR1cm4gYi5sZW5ndGg9PT1jJiZlPT09az9iOmQuX190cnVuY2F0ZVRvTkJpdHMoYSxiKX1yZXR1cm4gZC5fX3RydW5jYXRlQW5kU3ViRnJvbVBvd2VyT2ZUd28oYSxiLCExKX19LHtrZXk6XCJhc1VpbnROXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGI7aWYoMD09PWEpcmV0dXJuIGQuX196ZXJvKCk7aWYoYi5zaWduKXtpZihhPmQuX19rTWF4TGVuZ3RoQml0cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO3JldHVybiBkLl9fdHJ1bmNhdGVBbmRTdWJGcm9tUG93ZXJPZlR3byhhLGIsITEpfWlmKGE+PWQuX19rTWF4TGVuZ3RoQml0cylyZXR1cm4gYjt2YXIgYz1hKzMxPj4+NTtpZihiLmxlbmd0aDxjKXJldHVybiBiO3ZhciBlPTMxJmE7cmV0dXJuIGIubGVuZ3RoIT1jfHwwIT09ZSYmMCE9Yi5fX2RpZ2l0KGMtMSk+Pj5cbmU/ZC5fX3RydW5jYXRlVG9OQml0cyhhLGIpOmJ9fSx7a2V5OlwiQUREXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihhPWQuX190b1ByaW1pdGl2ZShhKSxiPWQuX190b1ByaW1pdGl2ZShiKSxcInN0cmluZ1wiPT10eXBlb2YgYSlyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgYiYmKGI9Yi50b1N0cmluZygpKSxhK2I7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGIpcmV0dXJuIGEudG9TdHJpbmcoKStiO2lmKGE9ZC5fX3RvTnVtZXJpYyhhKSxiPWQuX190b051bWVyaWMoYiksZC5fX2lzQmlnSW50KGEpJiZkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuYWRkKGEsYik7aWYoXCJudW1iZXJcIj09dHlwZW9mIGEmJlwibnVtYmVyXCI9PXR5cGVvZiBiKXJldHVybiBhK2I7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBtaXggQmlnSW50IGFuZCBvdGhlciB0eXBlcywgdXNlIGV4cGxpY2l0IGNvbnZlcnNpb25zXCIpO319LHtrZXk6XCJMVFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYixcbjApfX0se2tleTpcIkxFXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZC5fX2NvbXBhcmUoYSxiLDEpfX0se2tleTpcIkdUXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZC5fX2NvbXBhcmUoYSxiLDIpfX0se2tleTpcIkdFXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZC5fX2NvbXBhcmUoYSxiLDMpfX0se2tleTpcIkVRXCIsdmFsdWU6ZnVuY3Rpb24oYixjKXtmb3IoOzspe2lmKGQuX19pc0JpZ0ludChiKSlyZXR1cm4gZC5fX2lzQmlnSW50KGMpP2QuZXF1YWwoYixjKTpkLkVRKGMsYik7aWYoXCJudW1iZXJcIj09dHlwZW9mIGIpe2lmKGQuX19pc0JpZ0ludChjKSlyZXR1cm4gZC5fX2VxdWFsVG9OdW1iZXIoYyxiKTtpZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwic3RyaW5nXCI9PXR5cGVvZiBiKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuIGI9ZC5fX2Zyb21TdHJpbmcoYiksbnVsbCE9PWImJmQuZXF1YWwoYixjKTtcbmlmKFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBiPT1jO2M9ZC5fX3RvUHJpbWl0aXZlKGMpfWVsc2UgaWYoXCJib29sZWFuXCI9PXR5cGVvZiBiKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuIGQuX19lcXVhbFRvTnVtYmVyKGMsK2IpO2lmKFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBiPT1jO2M9ZC5fX3RvUHJpbWl0aXZlKGMpfWVsc2UgaWYoXCJzeW1ib2xcIj09PWEoYikpe2lmKGQuX19pc0JpZ0ludChjKSlyZXR1cm4hMTtpZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwib2JqZWN0XCI9PT1hKGIpKXtpZihcIm9iamVjdFwiPT09YShjKSYmYy5jb25zdHJ1Y3RvciE9PWQpcmV0dXJuIGI9PWM7Yj1kLl9fdG9QcmltaXRpdmUoYil9ZWxzZSByZXR1cm4gYj09Y319fSx7a2V5OlwiTkVcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiFkLkVRKGEsYil9fSx7a2V5OlwiX196ZXJvXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGQoMCwhMSl9fSxcbntrZXk6XCJfX29uZURpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtiPW5ldyBkKDEsYik7cmV0dXJuIGIuX19zZXREaWdpdCgwLGEpLGJ9fSx7a2V5OlwiX19kZWNpZGVSb3VuZGluZ1wiLHZhbHVlOmZ1bmN0aW9uKGEsYixkLGMpe2lmKDA8YilyZXR1cm4tMTtpZigwPmIpYj0tYi0xO2Vsc2V7aWYoMD09PWQpcmV0dXJuLTE7ZC0tO2M9YS5fX2RpZ2l0KGQpO2I9MzF9Yj0xPDxiO2lmKDA9PShjJmIpKXJldHVybi0xO2lmKC0tYiwwIT0oYyZiKSlyZXR1cm4gMTtmb3IoOzA8ZDspaWYoZC0tLDAhPT1hLl9fZGlnaXQoZCkpcmV0dXJuIDE7cmV0dXJuIDB9fSx7a2V5OlwiX19mcm9tRG91YmxlXCIsdmFsdWU6ZnVuY3Rpb24oYSl7ZC5fX2tCaXRDb252ZXJzaW9uRG91YmxlWzBdPWE7dmFyIGI9KDIwNDcmZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT4+PjIwKS0xMDIzO3ZhciBjPShiPj4+NSkrMTthPW5ldyBkKGMsMD5hKTt2YXIgZT0xMDQ4NTc1JmQuX19rQml0Q29udmVyc2lvbkludHNbMV18MTA0ODU3Nixcbms9ZC5fX2tCaXRDb252ZXJzaW9uSW50c1swXTtiJj0zMTtpZigyMD5iKXt2YXIgZj0yMC1iO3ZhciBnPWYrMzI7Yj1lPj4+ZjtlPWU8PDMyLWZ8az4+PmY7azw8PTMyLWZ9ZWxzZSAyMD09PWI/KGc9MzIsYj1lLGU9ayk6KGY9Yi0yMCxnPTMyLWYsYj1lPDxmfGs+Pj4zMi1mLGU9azw8Zik7YS5fX3NldERpZ2l0KGMtMSxiKTtmb3IoYy09MjswPD1jO2MtLSkwPGc/KGctPTMyLGI9ZSxlPWspOmI9MCxhLl9fc2V0RGlnaXQoYyxiKTtyZXR1cm4gYS5fX3RyaW0oKX19LHtrZXk6XCJfX2lzV2hpdGVzcGFjZVwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiEhKDEzPj1hJiY5PD1hKXx8KDE1OT49YT8zMj09YToxMzEwNzE+PWE/MTYwPT1hfHw1NzYwPT1hOjE5NjYwNz49YT8oYSY9MTMxMDcxLDEwPj1hfHw0MD09YXx8NDE9PWF8fDQ3PT1hfHw5NT09YXx8NDA5Nj09YSk6NjUyNzk9PWEpfX0se2tleTpcIl9fZnJvbVN0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTE8YXJndW1lbnRzLmxlbmd0aCYmXG52b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAsYz0wLGU9YS5sZW5ndGgsaz0wO2lmKGs9PT1lKXJldHVybiBkLl9femVybygpO2Zvcih2YXIgZj1hLmNoYXJDb2RlQXQoayk7ZC5fX2lzV2hpdGVzcGFjZShmKTspe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7Zj1hLmNoYXJDb2RlQXQoayl9aWYoNDM9PT1mKXtpZigrK2s9PT1lKXJldHVybiBudWxsO2Y9YS5jaGFyQ29kZUF0KGspO2M9MX1lbHNlIGlmKDQ1PT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKTtjPS0xfWlmKDA9PT1iKXtpZihiPTEwLDQ4PT09Zil7aWYoKytrPT09ZSlyZXR1cm4gZC5fX3plcm8oKTtpZihmPWEuY2hhckNvZGVBdChrKSw4OD09PWZ8fDEyMD09PWYpe2lmKGI9MTYsKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKX1lbHNlIGlmKDc5PT09Znx8MTExPT09Zil7aWYoYj04LCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9ZWxzZSBpZig2Nj09PVxuZnx8OTg9PT1mKXtpZihiPTIsKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKX19fWVsc2UgaWYoMTY9PT1iJiY0OD09PWYpe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7aWYoZj1hLmNoYXJDb2RlQXQoayksODg9PT1mfHwxMjA9PT1mKXtpZigrK2s9PT1lKXJldHVybiBudWxsO2Y9YS5jaGFyQ29kZUF0KGspfX1mb3IoOzQ4PT09Zjspe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7Zj1hLmNoYXJDb2RlQXQoayl9dmFyIGc9ZS1rLGg9ZC5fX2tNYXhCaXRzUGVyQ2hhcltiXSxwPWQuX19rQml0c1BlckNoYXJUYWJsZU11bHRpcGxpZXItMTtpZihnPjEwNzM3NDE4MjQvaClyZXR1cm4gbnVsbDtnPW5ldyBkKChoKmcrcD4+PmQuX19rQml0c1BlckNoYXJUYWJsZVNoaWZ0KSszMT4+PjUsITEpO3ZhciBsPTEwPmI/YjoxMCx2PTEwPGI/Yi0xMDowO2lmKDA9PShiJmItMSkpe2g+Pj1kLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdDt2YXIgQj1bXSxuPVtdLEE9XG4hMTtkb3tmb3IodmFyIEQsdT1wPTA7Oyl7aWYoZi00OD4+PjA8bClEPWYtNDg7ZWxzZSBpZigoMzJ8ZiktOTc+Pj4wPHYpRD0oMzJ8ZiktODc7ZWxzZXtBPSEwO2JyZWFrfWlmKHUrPWgscD1wPDxofEQsKytrPT09ZSl7QT0hMDticmVha31pZihmPWEuY2hhckNvZGVBdChrKSwzMjx1K2gpYnJlYWt9Qi5wdXNoKHApO24ucHVzaCh1KX13aGlsZSghQSk7ZC5fX2ZpbGxGcm9tUGFydHMoZyxCLG4pfWVsc2V7Zy5fX2luaXRpYWxpemVEaWdpdHMoKTtCPSExO249MDtkb3tBPTA7Zm9yKEQ9MTs7KXtpZihmLTQ4Pj4+MDxsKXA9Zi00ODtlbHNlIGlmKCgzMnxmKS05Nz4+PjA8dilwPSgzMnxmKS04NztlbHNle0I9ITA7YnJlYWt9dT1EKmI7aWYoNDI5NDk2NzI5NTx1KWJyZWFrO2lmKEQ9dSxBPUEqYitwLG4rKywrK2s9PT1lKXtCPSEwO2JyZWFrfWY9YS5jaGFyQ29kZUF0KGspfXA9MzIqZC5fX2tCaXRzUGVyQ2hhclRhYmxlTXVsdGlwbGllci0xO2cuX19pbnBsYWNlTXVsdGlwbHlBZGQoRCxcbkEsaCpuK3A+Pj5kLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdCs1KX13aGlsZSghQil9aWYoayE9PWUpe2lmKCFkLl9faXNXaGl0ZXNwYWNlKGYpKXJldHVybiBudWxsO2ZvcihrKys7azxlO2srKylpZihmPWEuY2hhckNvZGVBdChrKSwhZC5fX2lzV2hpdGVzcGFjZShmKSlyZXR1cm4gbnVsbH1yZXR1cm4gMCE9PWMmJjEwIT09Yj9udWxsOihnLnNpZ249LTE9PT1jLGcuX190cmltKCkpfX0se2tleTpcIl9fZmlsbEZyb21QYXJ0c1wiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXtmb3IodmFyIGM9MCxlPTAsaz0wLGY9Yi5sZW5ndGgtMTswPD1mO2YtLSl7dmFyIGc9YltmXSxoPWRbZl07ZXw9Zzw8aztrKz1oOzMyPT09az8oYS5fX3NldERpZ2l0KGMrKyxlKSxrPTAsZT0wKTozMjxrJiYoYS5fX3NldERpZ2l0KGMrKyxlKSxrLT0zMixlPWc+Pj5oLWspfWlmKDAhPT1lKXtpZihjPj1hLmxlbmd0aCl0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTthLl9fc2V0RGlnaXQoYysrLGUpfWZvcig7YzxcbmEubGVuZ3RoO2MrKylhLl9fc2V0RGlnaXQoYywwKX19LHtrZXk6XCJfX3RvU3RyaW5nQmFzZVBvd2VyT2ZUd29cIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGU9Yi0xO2U9KDg1JmU+Pj4xKSsoODUmZSk7ZT0oNTEmZT4+PjIpKyg1MSZlKTtlPSgxNSZlPj4+NCkrKDE1JmUpOy0tYjt2YXIgaz1hLl9fZGlnaXQoYy0xKSxmPWQuX19jbHozMihrKSxnPTB8KDMyKmMtZitlLTEpL2U7aWYoYS5zaWduJiZnKyssMjY4NDM1NDU2PGcpdGhyb3cgRXJyb3IoXCJzdHJpbmcgdG9vIGxvbmdcIik7Zj1BcnJheShnKTstLWc7Zm9yKHZhciBoPTAscD0wLGw9MDtsPGMtMTtsKyspe3ZhciB2PWEuX19kaWdpdChsKTtoPShofHY8PHApJmI7ZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2hdO3A9ZS1wO2g9dj4+PnA7Zm9yKHA9MzItcDtwPj1lOylmW2ctLV09ZC5fX2tDb252ZXJzaW9uQ2hhcnNbaCZiXSxoPj4+PWUscC09ZX1mW2ctLV09ZC5fX2tDb252ZXJzaW9uQ2hhcnNbKGh8azw8XG5wKSZiXTtmb3IoaD1rPj4+ZS1wOzAhPT1oOylmW2ctLV09ZC5fX2tDb252ZXJzaW9uQ2hhcnNbaCZiXSxoPj4+PWU7aWYoYS5zaWduJiYoZltnLS1dPVwiLVwiKSwtMSE9PWcpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7cmV0dXJuIGYuam9pbihcIlwiKX19LHtrZXk6XCJfX3RvU3RyaW5nR2VuZXJpY1wiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT1hLmxlbmd0aDtpZigwPT09ZSlyZXR1cm5cIlwiO2lmKDE9PT1lKXJldHVybiBiPWEuX191bnNpZ25lZERpZ2l0KDApLnRvU3RyaW5nKGIpLCExPT09YyYmYS5zaWduJiYoYj1cIi1cIitiKSxiO3ZhciBrPTMyKmUtZC5fX2NsejMyKGEuX19kaWdpdChlLTEpKTtlPWQuX19rTWF4Qml0c1BlckNoYXJbYl0tMTtrKj1kLl9fa0JpdHNQZXJDaGFyVGFibGVNdWx0aXBsaWVyO2U9KDB8KGsrKGUtMSkpL2UpKzE+PjE7az1kLmV4cG9uZW50aWF0ZShkLl9fb25lRGlnaXQoYiwhMSksZC5fX29uZURpZ2l0KGUsITEpKTt2YXIgZj1rLl9fdW5zaWduZWREaWdpdCgwKTtcbmlmKDE9PT1rLmxlbmd0aCYmNjU1MzU+PWYpe2s9bmV3IGQoYS5sZW5ndGgsITEpO2suX19pbml0aWFsaXplRGlnaXRzKCk7dmFyIGc9MDtmb3IodmFyIGg9MiphLmxlbmd0aC0xOzA8PWg7aC0tKWc9Zzw8MTZ8YS5fX2hhbGZEaWdpdChoKSxrLl9fc2V0SGFsZkRpZ2l0KGgsMHxnL2YpLGc9MHxnJWY7Zj1nLnRvU3RyaW5nKGIpfWVsc2UgZj1kLl9fYWJzb2x1dGVEaXZMYXJnZShhLGssITAsITApLGs9Zi5xdW90aWVudCxmPWYucmVtYWluZGVyLl9fdHJpbSgpLGY9ZC5fX3RvU3RyaW5nR2VuZXJpYyhmLGIsITApO2suX190cmltKCk7Zm9yKGI9ZC5fX3RvU3RyaW5nR2VuZXJpYyhrLGIsITApO2YubGVuZ3RoPGU7KWY9XCIwXCIrZjtyZXR1cm4hMT09PWMmJmEuc2lnbiYmKGI9XCItXCIrYiksYitmfX0se2tleTpcIl9fdW5lcXVhbFNpZ25cIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYT8tMToxfX0se2tleTpcIl9fYWJzb2x1dGVHcmVhdGVyXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/XG4tMToxfX0se2tleTpcIl9fYWJzb2x1dGVMZXNzXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/MTotMX19LHtrZXk6XCJfX2NvbXBhcmVUb0JpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zaWduO2lmKGMhPT1iLnNpZ24pcmV0dXJuIGQuX191bmVxdWFsU2lnbihjKTthPWQuX19hYnNvbHV0ZUNvbXBhcmUoYSxiKTtyZXR1cm4gMDxhP2QuX19hYnNvbHV0ZUdyZWF0ZXIoYyk6MD5hP2QuX19hYnNvbHV0ZUxlc3MoYyk6MH19LHtrZXk6XCJfX2NvbXBhcmVUb051bWJlclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMXxiKXt2YXIgZT1hLnNpZ24saz0wPmI7aWYoZSE9PWspcmV0dXJuIGQuX191bmVxdWFsU2lnbihlKTtpZigwPT09YS5sZW5ndGgpe2lmKGspdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7cmV0dXJuIDA9PT1iPzA6LTF9aWYoMTxhLmxlbmd0aClyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihlKTtiPWMoYik7YT1hLl9fdW5zaWduZWREaWdpdCgwKTtcbnJldHVybiBhPmI/ZC5fX2Fic29sdXRlR3JlYXRlcihlKTphPGI/ZC5fX2Fic29sdXRlTGVzcyhlKTowfXJldHVybiBkLl9fY29tcGFyZVRvRG91YmxlKGEsYil9fSx7a2V5OlwiX19jb21wYXJlVG9Eb3VibGVcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKGIhPT1iKXJldHVybiBiO2lmKGI9PT0xLzApcmV0dXJuLTE7aWYoLUluZmluaXR5PT09YilyZXR1cm4gMTt2YXIgYz1hLnNpZ247aWYoYyE9PTA+YilyZXR1cm4gZC5fX3VuZXF1YWxTaWduKGMpO2lmKDA9PT1iKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnOiBzaG91bGQgYmUgaGFuZGxlZCBlbHNld2hlcmVcIik7aWYoMD09PWEubGVuZ3RoKXJldHVybi0xO2QuX19rQml0Q29udmVyc2lvbkRvdWJsZVswXT1iO2I9MjA0NyZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdPj4+MjA7aWYoMjA0Nz09Yil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1ZzogaGFuZGxlZCBlbHNld2hlcmVcIik7dmFyIGU9Yi0xMDIzO2lmKDA+ZSlyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtcbmI9YS5sZW5ndGg7dmFyIGs9YS5fX2RpZ2l0KGItMSksZj1kLl9fY2x6MzIoayksZz0zMipiLWY7ZSs9MTtpZihnPGUpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyk7aWYoZz5lKXJldHVybiBkLl9fYWJzb2x1dGVHcmVhdGVyKGMpO2U9MTA0ODU3NnwxMDQ4NTc1JmQuX19rQml0Q29udmVyc2lvbkludHNbMV07dmFyIGg9ZC5fX2tCaXRDb252ZXJzaW9uSW50c1swXTtmPTMxLWY7aWYoZiE9PShnLTEpJTMxKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO2lmKDIwPmYpe3ZhciBwPTIwLWY7Zj1wKzMyO2c9ZT4+PnA7ZT1lPDwzMi1wfGg+Pj5wO2g8PD0zMi1wfWVsc2UgMjA9PT1mPyhmPTMyLGc9ZSxlPWgpOihwPWYtMjAsZj0zMi1wLGc9ZTw8cHxoPj4+MzItcCxlPWg8PHApO2lmKGs+Pj49MCxnPj4+PTAsaz5nKXJldHVybiBkLl9fYWJzb2x1dGVHcmVhdGVyKGMpO2lmKGs8ZylyZXR1cm4gZC5fX2Fic29sdXRlTGVzcyhjKTtmb3IoYi09MjswPD1iO2ItLSl7MDxmPyhmLT1cbjMyLGc9ZT4+PjAsZT1oLGg9MCk6Zz0wO2s9YS5fX3Vuc2lnbmVkRGlnaXQoYik7aWYoaz5nKXJldHVybiBkLl9fYWJzb2x1dGVHcmVhdGVyKGMpO2lmKGs8ZylyZXR1cm4gZC5fX2Fic29sdXRlTGVzcyhjKX1pZigwIT09ZXx8MCE9PWgpe2lmKDA9PT1mKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiBkLl9fYWJzb2x1dGVMZXNzKGMpfXJldHVybiAwfX0se2tleTpcIl9fZXF1YWxUb051bWJlclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGJ8MD09PWI/MD09PWI/MD09PWEubGVuZ3RoOjE9PT1hLmxlbmd0aCYmYS5zaWduPT09MD5iJiZhLl9fdW5zaWduZWREaWdpdCgwKT09PWMoYik6MD09PWQuX19jb21wYXJlVG9Eb3VibGUoYSxiKX19LHtrZXk6XCJfX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2xcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3N3aXRjaChiKXtjYXNlIDA6cmV0dXJuIDA+YTtjYXNlIDE6cmV0dXJuIDA+PWE7Y2FzZSAyOnJldHVybiAwPGE7Y2FzZSAzOnJldHVybiAwPD1cbmF9dGhyb3cgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTt9fSx7a2V5OlwiX19jb21wYXJlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe2lmKGE9ZC5fX3RvUHJpbWl0aXZlKGEpLGI9ZC5fX3RvUHJpbWl0aXZlKGIpLFwic3RyaW5nXCI9PXR5cGVvZiBhJiZcInN0cmluZ1wiPT10eXBlb2YgYilzd2l0Y2goYyl7Y2FzZSAwOnJldHVybiBhPGI7Y2FzZSAxOnJldHVybiBhPD1iO2Nhc2UgMjpyZXR1cm4gYT5iO2Nhc2UgMzpyZXR1cm4gYT49Yn1pZihkLl9faXNCaWdJbnQoYSkmJlwic3RyaW5nXCI9PXR5cGVvZiBiKXJldHVybiBiPWQuX19mcm9tU3RyaW5nKGIpLG51bGwhPT1iJiZkLl9fY29tcGFyaXNvblJlc3VsdFRvQm9vbChkLl9fY29tcGFyZVRvQmlnSW50KGEsYiksYyk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGEmJmQuX19pc0JpZ0ludChiKSlyZXR1cm4gYT1kLl9fZnJvbVN0cmluZyhhKSxudWxsIT09YSYmZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpLGMpO1xuaWYoYT1kLl9fdG9OdW1lcmljKGEpLGI9ZC5fX3RvTnVtZXJpYyhiKSxkLl9faXNCaWdJbnQoYSkpe2lmKGQuX19pc0JpZ0ludChiKSlyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpLGMpO2lmKFwibnVtYmVyXCIhPXR5cGVvZiBiKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiBkLl9fY29tcGFyaXNvblJlc3VsdFRvQm9vbChkLl9fY29tcGFyZVRvTnVtYmVyKGEsYiksYyl9aWYoXCJudW1iZXJcIiE9dHlwZW9mIGEpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7aWYoZC5fX2lzQmlnSW50KGIpKXJldHVybiBkLl9fY29tcGFyaXNvblJlc3VsdFRvQm9vbChkLl9fY29tcGFyZVRvTnVtYmVyKGIsYSksMl5jKTtpZihcIm51bWJlclwiIT10eXBlb2YgYil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gMD09PWM/YTxiOjE9PT1jP2E8PWI6Mj09PWM/YT5iOjM9PT1jP2E+PWI6XG52b2lkIDB9fSx7a2V5OlwiX19hYnNvbHV0ZUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtpZihhLmxlbmd0aDxiLmxlbmd0aClyZXR1cm4gZC5fX2Fic29sdXRlQWRkKGIsYSxjKTtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGE7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhLnNpZ249PT1jP2E6ZC51bmFyeU1pbnVzKGEpO3ZhciBlPWEubGVuZ3RoOygwPT09YS5fX2Nsem1zZCgpfHxiLmxlbmd0aD09PWEubGVuZ3RoJiYwPT09Yi5fX2Nsem1zZCgpKSYmZSsrO2M9bmV3IGQoZSxjKTtmb3IodmFyIGs9ZT0wO2s8Yi5sZW5ndGg7aysrKXt2YXIgZj1iLl9fZGlnaXQoayksZz1hLl9fZGlnaXQoayksaD0oNjU1MzUmZykrKDY1NTM1JmYpK2U7Zj0oZz4+PjE2KSsoZj4+PjE2KSsoaD4+PjE2KTtlPWY+Pj4xNjtjLl9fc2V0RGlnaXQoayw2NTUzNSZofGY8PDE2KX1mb3IoO2s8YS5sZW5ndGg7aysrKWg9YS5fX2RpZ2l0KGspLGI9KDY1NTM1JmgpK2UsaD0oaD4+PjE2KSsoYj4+PjE2KSxlPWg+Pj5cbjE2LGMuX19zZXREaWdpdChrLDY1NTM1JmJ8aDw8MTYpO3JldHVybiBrPGMubGVuZ3RoJiZjLl9fc2V0RGlnaXQoayxlKSxjLl9fdHJpbSgpfX0se2tleTpcIl9fYWJzb2x1dGVTdWJcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYS5zaWduPT09Yz9hOmQudW5hcnlNaW51cyhhKTtjPW5ldyBkKGEubGVuZ3RoLGMpO2Zvcih2YXIgZT0wLGs9MDtrPGIubGVuZ3RoO2srKyl7dmFyIGY9YS5fX2RpZ2l0KGspLGc9Yi5fX2RpZ2l0KGspLGg9KDY1NTM1JmYpLSg2NTUzNSZnKS1lO2U9MSZoPj4+MTY7Zj0oZj4+PjE2KS0oZz4+PjE2KS1lO2U9MSZmPj4+MTY7Yy5fX3NldERpZ2l0KGssNjU1MzUmaHxmPDwxNil9Zm9yKDtrPGEubGVuZ3RoO2srKyloPWEuX19kaWdpdChrKSxiPSg2NTUzNSZoKS1lLGU9MSZiPj4+MTYsaD0oaD4+PjE2KS1lLGU9MSZoPj4+MTYsYy5fX3NldERpZ2l0KGssNjU1MzUmYnxoPDwxNik7XG5yZXR1cm4gYy5fX3RyaW0oKX19LHtrZXk6XCJfX2Fic29sdXRlQWRkT25lXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoO251bGw9PT1jP2M9bmV3IGQoZSxiKTpjLnNpZ249Yjtmb3IodmFyIGssZj0hMCxnPTA7ZzxlO2crKyl7aWYoaz1hLl9fZGlnaXQoZyksZilmPS0xPT09ayxrPTB8aysxO2MuX19zZXREaWdpdChnLGspfXJldHVybiBmJiZjLl9fc2V0RGlnaXRHcm93KGUsMSksY319LHtrZXk6XCJfX2Fic29sdXRlU3ViT25lXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aDtiPWJ8fGM7Zm9yKHZhciBlLGs9bmV3IGQoYiwhMSksZj0hMCxnPTA7ZzxjO2crKyl7aWYoZT1hLl9fZGlnaXQoZyksZilmPTA9PT1lLGU9MHxlLTE7ay5fX3NldERpZ2l0KGcsZSl9aWYoZil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtmb3IoYT1jO2E8XG5iO2ErKylrLl9fc2V0RGlnaXQoYSwwKTtyZXR1cm4ga319LHtrZXk6XCJfX2Fic29sdXRlQW5kXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2U8ayYmKGY9ZSxlPWEsYT1iLGI9ZSk7ZT1mO251bGw9PT1jP2M9bmV3IGQoZSwhMSk6ZT1jLmxlbmd0aDtmb3Ioaz0wO2s8ZjtrKyspYy5fX3NldERpZ2l0KGssYS5fX2RpZ2l0KGspJmIuX19kaWdpdChrKSk7Zm9yKDtrPGU7aysrKWMuX19zZXREaWdpdChrLDApO3JldHVybiBjfX0se2tleTpcIl9fYWJzb2x1dGVBbmROb3RcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLGU9YS5sZW5ndGgsaz1iLmxlbmd0aCxmPWs7ZTxrJiYoZj1lKTtrPWU7bnVsbD09PWM/Yz1uZXcgZChrLCExKTpcbms9Yy5sZW5ndGg7Zm9yKHZhciBnPTA7ZzxmO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZykmfmIuX19kaWdpdChnKSk7Zm9yKDtnPGU7ZysrKWMuX19zZXREaWdpdChnLGEuX19kaWdpdChnKSk7Zm9yKDtnPGs7ZysrKWMuX19zZXREaWdpdChnLDApO3JldHVybiBjfX0se2tleTpcIl9fYWJzb2x1dGVPclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aCxrPWIubGVuZ3RoLGY9aztpZihlPGspe2Y9ZTt2YXIgZz1hO2E9YjtlPWs7Yj1nfWs9ZTtudWxsPT09Yz9jPW5ldyBkKGssITEpOms9Yy5sZW5ndGg7Zm9yKGc9MDtnPGY7ZysrKWMuX19zZXREaWdpdChnLGEuX19kaWdpdChnKXxiLl9fZGlnaXQoZykpO2Zvcig7ZzxlO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZykpO2Zvcig7ZzxrO2crKyljLl9fc2V0RGlnaXQoZywwKTtyZXR1cm4gY319LFxue2tleTpcIl9fYWJzb2x1dGVYb3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLGU9YS5sZW5ndGgsaz1iLmxlbmd0aCxmPWs7aWYoZTxrKXtmPWU7dmFyIGc9YTthPWI7ZT1rO2I9Z31rPWU7bnVsbD09PWM/Yz1uZXcgZChrLCExKTprPWMubGVuZ3RoO2ZvcihnPTA7ZzxmO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZyleYi5fX2RpZ2l0KGcpKTtmb3IoO2c8ZTtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpKTtmb3IoO2c8aztnKyspYy5fX3NldERpZ2l0KGcsMCk7cmV0dXJuIGN9fSx7a2V5OlwiX19hYnNvbHV0ZUNvbXBhcmVcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPWEubGVuZ3RoLWIubGVuZ3RoO2lmKDAhPWQpcmV0dXJuIGQ7Zm9yKGQ9YS5sZW5ndGgtMTswPD1kJiZhLl9fZGlnaXQoZCk9PT1iLl9fZGlnaXQoZCk7KWQtLTtyZXR1cm4gMD5kPzA6YS5fX3Vuc2lnbmVkRGlnaXQoZCk+XG5iLl9fdW5zaWduZWREaWdpdChkKT8xOi0xfX0se2tleTpcIl9fbXVsdGlwbHlBY2N1bXVsYXRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMsZSl7aWYoMCE9PWIpe2Zvcih2YXIgaz02NTUzNSZiLGY9Yj4+PjE2LGc9Yj0wLGg9MCxwPTA7cDxhLmxlbmd0aDtwKyssZSsrKXt2YXIgbD1jLl9fZGlnaXQoZSksdj02NTUzNSZsO2w+Pj49MTY7dmFyIEI9YS5fX2RpZ2l0KHApLG49NjU1MzUmQixBPUI+Pj4xNjtCPWQuX19pbXVsKG4sayk7bj1kLl9faW11bChuLGYpO3ZhciBEPWQuX19pbXVsKEEsayk7QT1kLl9faW11bChBLGYpO3YrPWcrKDY1NTM1JkIpO2wrPWgrYisodj4+PjE2KSsoQj4+PjE2KSsoNjU1MzUmbikrKDY1NTM1JkQpO2I9bD4+PjE2O2c9KG4+Pj4xNikrKEQ+Pj4xNikrKDY1NTM1JkEpK2I7Yj1nPj4+MTY7ZyY9NjU1MzU7aD1BPj4+MTY7bD02NTUzNSZ2fGw8PDE2O2MuX19zZXREaWdpdChlLGwpfWZvcig7MCE9PWJ8fDAhPT1nfHwwIT09aDtlKyspaz1jLl9fZGlnaXQoZSksYT1cbig2NTUzNSZrKStnLGs9KGs+Pj4xNikrKGE+Pj4xNikraCtiLGg9Zz0wLGI9az4+PjE2LGs9NjU1MzUmYXxrPDwxNixjLl9fc2V0RGlnaXQoZSxrKX19fSx7a2V5OlwiX19pbnRlcm5hbE11bHRpcGx5QWRkXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMsZSxrKXtmb3IodmFyIGY9MCxnPTA7ZzxlO2crKyl7dmFyIGg9YS5fX2RpZ2l0KGcpLHA9ZC5fX2ltdWwoNjU1MzUmaCxiKSxsPSg2NTUzNSZwKStmK2M7Yz1sPj4+MTY7Zj1kLl9faW11bChoPj4+MTYsYik7cD0oNjU1MzUmZikrKHA+Pj4xNikrYztjPXA+Pj4xNjtmPj4+PTE2O2suX19zZXREaWdpdChnLHA8PDE2fDY1NTM1JmwpfWlmKGsubGVuZ3RoPmUpZm9yKGsuX19zZXREaWdpdChlKyssYytmKTtlPGsubGVuZ3RoOylrLl9fc2V0RGlnaXQoZSsrLDApO2Vsc2UgaWYoMCE9PWMrZil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTt9fSx7a2V5OlwiX19hYnNvbHV0ZURpdlNtYWxsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe251bGw9PT1cbmMmJihjPW5ldyBkKGEubGVuZ3RoLCExKSk7Zm9yKHZhciBlPTAsaz0yKmEubGVuZ3RoLTE7MDw9aztrLT0yKXtlPShlPDwxNnxhLl9faGFsZkRpZ2l0KGspKT4+PjA7dmFyIGY9MHxlL2I7ZT0wfGUlYjtlPShlPDwxNnxhLl9faGFsZkRpZ2l0KGstMSkpPj4+MDt2YXIgZz0wfGUvYjtlPTB8ZSViO2MuX19zZXREaWdpdChrPj4+MSxmPDwxNnxnKX1yZXR1cm4gY319LHtrZXk6XCJfX2Fic29sdXRlTW9kU21hbGxcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTA7Zm9yKHZhciBjPTIqYS5sZW5ndGgtMTswPD1jO2MtLSlkPShkPDwxNnxhLl9faGFsZkRpZ2l0KGMpKT4+PjAsZD0wfGQlYjtyZXR1cm4gZH19LHtrZXk6XCJfX2Fic29sdXRlRGl2TGFyZ2VcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyxlKXt2YXIgaz1iLl9faGFsZkRpZ2l0TGVuZ3RoKCksZj1iLmxlbmd0aCxnPWEuX19oYWxmRGlnaXRMZW5ndGgoKS1rLGg9bnVsbDtjJiYoaD1uZXcgZChnKzI+Pj4xLCExKSxoLl9faW5pdGlhbGl6ZURpZ2l0cygpKTtcbnZhciBwPW5ldyBkKGsrMj4+PjEsITEpO3AuX19pbml0aWFsaXplRGlnaXRzKCk7dmFyIGw9ZC5fX2NsejE2KGIuX19oYWxmRGlnaXQoay0xKSk7MDxsJiYoYj1kLl9fc3BlY2lhbExlZnRTaGlmdChiLGwsMCkpO2E9ZC5fX3NwZWNpYWxMZWZ0U2hpZnQoYSxsLDEpO2Zvcih2YXIgdj1iLl9faGFsZkRpZ2l0KGstMSksQj0wOzA8PWc7Zy0tKXt2YXIgbj02NTUzNSxBPWEuX19oYWxmRGlnaXQoZytrKTtpZihBIT09dil7QT0oQTw8MTZ8YS5fX2hhbGZEaWdpdChnK2stMSkpPj4+MDtuPTB8QS92O0E9MHxBJXY7Zm9yKHZhciBEPWIuX19oYWxmRGlnaXQoay0yKSx1PWEuX19oYWxmRGlnaXQoZytrLTIpO2QuX19pbXVsKG4sRCk+Pj4wPihBPDwxNnx1KT4+PjAmJihuLS0sQSs9diwhKDY1NTM1PEEpKTspO31kLl9faW50ZXJuYWxNdWx0aXBseUFkZChiLG4sMCxmLHApO0E9YS5fX2lucGxhY2VTdWIocCxnLGsrMSk7MCE9PUEmJihBPWEuX19pbnBsYWNlQWRkKGIsZyxrKSxhLl9fc2V0SGFsZkRpZ2l0KGcrXG5rLGEuX19oYWxmRGlnaXQoZytrKStBKSxuLS0pO2MmJigxJmc/Qj1uPDwxNjpoLl9fc2V0RGlnaXQoZz4+PjEsQnxuKSl9cmV0dXJuIGU/KGEuX19pbnBsYWNlUmlnaHRTaGlmdChsKSxjP3txdW90aWVudDpoLHJlbWFpbmRlcjphfTphKTpjP2g6dm9pZCAwfX0se2tleTpcIl9fY2x6MTZcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gZC5fX2NsejMyKGEpLTE2fX0se2tleTpcIl9fc3BlY2lhbExlZnRTaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT1hLmxlbmd0aCxrPW5ldyBkKGUrYywhMSk7aWYoMD09PWIpe2ZvcihiPTA7YjxlO2IrKylrLl9fc2V0RGlnaXQoYixhLl9fZGlnaXQoYikpO3JldHVybiAwPGMmJmsuX19zZXREaWdpdChlLDApLGt9Zm9yKHZhciBmLGc9MCxoPTA7aDxlO2grKylmPWEuX19kaWdpdChoKSxrLl9fc2V0RGlnaXQoaCxmPDxifGcpLGc9Zj4+PjMyLWI7cmV0dXJuIDA8YyYmay5fX3NldERpZ2l0KGUsZyksa319LHtrZXk6XCJfX2xlZnRTaGlmdEJ5QWJzb2x1dGVcIixcbnZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZC5fX3RvU2hpZnRBbW91bnQoYik7aWYoMD5jKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQmlnSW50IHRvbyBiaWdcIik7Yj1jPj4+NTt2YXIgZT0zMSZjLGs9YS5sZW5ndGgsZj0wIT09ZSYmMCE9YS5fX2RpZ2l0KGstMSk+Pj4zMi1lLGc9aytiKyhmPzE6MCk7Yz1uZXcgZChnLGEuc2lnbik7aWYoMD09PWUpe2ZvcihlPTA7ZTxiO2UrKyljLl9fc2V0RGlnaXQoZSwwKTtmb3IoO2U8ZztlKyspYy5fX3NldERpZ2l0KGUsYS5fX2RpZ2l0KGUtYikpfWVsc2V7Zm9yKHZhciBoPWc9MDtoPGI7aCsrKWMuX19zZXREaWdpdChoLDApO2Zvcih2YXIgcD0wO3A8aztwKyspaD1hLl9fZGlnaXQocCksYy5fX3NldERpZ2l0KHArYixoPDxlfGcpLGc9aD4+PjMyLWU7aWYoZiljLl9fc2V0RGlnaXQoaytiLGcpO2Vsc2UgaWYoMCE9PWcpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7fXJldHVybiBjLl9fdHJpbSgpfX0se2tleTpcIl9fcmlnaHRTaGlmdEJ5QWJzb2x1dGVcIixcbnZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZT1hLnNpZ24saz1kLl9fdG9TaGlmdEFtb3VudChiKTtpZigwPmspcmV0dXJuIGQuX19yaWdodFNoaWZ0QnlNYXhpbXVtKGUpO2I9az4+PjU7dmFyIGY9MzEmayxnPWMtYjtpZigwPj1nKXJldHVybiBkLl9fcmlnaHRTaGlmdEJ5TWF4aW11bShlKTtrPSExO2lmKGUpaWYoMCE9KGEuX19kaWdpdChiKSYoMTw8ZiktMSkpaz0hMDtlbHNlIGZvcih2YXIgaD0wO2g8YjtoKyspaWYoMCE9PWEuX19kaWdpdChoKSl7az0hMDticmVha31rJiYwPT09ZiYmMD09fmEuX19kaWdpdChjLTEpJiZnKys7ZT1uZXcgZChnLGUpO2lmKDA9PT1mKWZvcihmPWI7ZjxjO2YrKyllLl9fc2V0RGlnaXQoZi1iLGEuX19kaWdpdChmKSk7ZWxzZXtnPWEuX19kaWdpdChiKT4+PmY7aD1jLWItMTtmb3IodmFyIHA9MDtwPGg7cCsrKWM9YS5fX2RpZ2l0KHArYisxKSxlLl9fc2V0RGlnaXQocCxjPDwzMi1mfGcpLGc9Yz4+PmY7ZS5fX3NldERpZ2l0KGgsZyl9cmV0dXJuIGsmJlxuKGU9ZC5fX2Fic29sdXRlQWRkT25lKGUsITAsZSkpLGUuX190cmltKCl9fSx7a2V5OlwiX19yaWdodFNoaWZ0QnlNYXhpbXVtXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ZC5fX29uZURpZ2l0KDEsITApOmQuX196ZXJvKCl9fSx7a2V5OlwiX190b1NoaWZ0QW1vdW50XCIsdmFsdWU6ZnVuY3Rpb24oYSl7aWYoMTxhLmxlbmd0aClyZXR1cm4tMTthPWEuX191bnNpZ25lZERpZ2l0KDApO3JldHVybiBhPmQuX19rTWF4TGVuZ3RoQml0cz8tMTphfX0se2tleTpcIl9fdG9QcmltaXRpdmVcIix2YWx1ZTpmdW5jdGlvbihiKXt2YXIgYz0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06XCJkZWZhdWx0XCI7aWYoXCJvYmplY3RcIiE9PWEoYil8fGIuY29uc3RydWN0b3I9PT1kKXJldHVybiBiO3ZhciBlPWJbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihlKXtjPWUoYyk7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGM7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59aWYoYz1iLnZhbHVlT2YpaWYoYz1jLmNhbGwoYiksXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGM7aWYoYz1iLnRvU3RyaW5nKWlmKGM9Yy5jYWxsKGIpLFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO319LHtrZXk6XCJfX3RvTnVtZXJpY1wiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBkLl9faXNCaWdJbnQoYSk/YTorYX19LHtrZXk6XCJfX2lzQmlnSW50XCIsdmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuXCJvYmplY3RcIj09PWEoYikmJmIuY29uc3RydWN0b3I9PT1kfX0se2tleTpcIl9fdHJ1bmNhdGVUb05CaXRzXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hKzMxPj4+NSxlPW5ldyBkKGMsYi5zaWduKTstLWM7Zm9yKHZhciBrPTA7azxjO2srKyllLl9fc2V0RGlnaXQoayxiLl9fZGlnaXQoaykpO2I9Yi5fX2RpZ2l0KGMpOzAhPSgzMSZhKSYmKGE9MzItKDMxJmEpLGI9Yjw8YT4+PlxuYSk7cmV0dXJuIGUuX19zZXREaWdpdChjLGIpLGUuX190cmltKCl9fSx7a2V5OlwiX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPU1hdGgubWluLGs9YSszMT4+PjU7Yz1uZXcgZChrLGMpO3ZhciBmPTA7LS1rO3ZhciBnPTA7Zm9yKGU9ZShrLGIubGVuZ3RoKTtmPGU7ZisrKXt2YXIgaD1iLl9fZGlnaXQoZikscD0tKDY1NTM1JmgpLWc7Zz0xJnA+Pj4xNjtoPS0oaD4+PjE2KS1nO2c9MSZoPj4+MTY7Yy5fX3NldERpZ2l0KGYsNjU1MzUmcHxoPDwxNil9Zm9yKDtmPGs7ZisrKWMuX19zZXREaWdpdChmLDB8LWcpO2I9azxiLmxlbmd0aD9iLl9fZGlnaXQoayk6MDthJj0zMTswPT09YT8oZz0tKDY1NTM1JmIpLWcsZz02NTUzNSZnfC0oYj4+PjE2KS0oMSZnPj4+MTYpPDwxNik6KGE9MzItYSxiPWI8PGE+Pj5hLGE9MTw8MzItYSxnPSg2NTUzNSZhKS0oNjU1MzUmYiktZyxnPSg2NTUzNSZnfChhPj4+MTYpLShiPj4+MTYpLSgxJmc+Pj5cbjE2KTw8MTYpJmEtMSk7cmV0dXJuIGMuX19zZXREaWdpdChrLGcpLGMuX190cmltKCl9fSx7a2V5OlwiX19kaWdpdFBvd1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPTE7MDxiOykxJmImJihkKj1hKSxiPj4+PTEsYSo9YTtyZXR1cm4gZH19XSksZH0obihBcnJheSkpO3JldHVybiBCLl9fa01heExlbmd0aD0zMzU1NDQzMixCLl9fa01heExlbmd0aEJpdHM9Qi5fX2tNYXhMZW5ndGg8PDUsQi5fX2tNYXhCaXRzUGVyQ2hhcj1bMCwwLDMyLDUxLDY0LDc1LDgzLDkwLDk2LDEwMiwxMDcsMTExLDExNSwxMTksMTIyLDEyNiwxMjgsMTMxLDEzNCwxMzYsMTM5LDE0MSwxNDMsMTQ1LDE0NywxNDksMTUxLDE1MywxNTQsMTU2LDE1OCwxNTksMTYwLDE2MiwxNjMsMTY1LDE2Nl0sQi5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQ9NSxCLl9fa0JpdHNQZXJDaGFyVGFibGVNdWx0aXBsaWVyPTE8PEIuX19rQml0c1BlckNoYXJUYWJsZVNoaWZ0LEIuX19rQ29udmVyc2lvbkNoYXJzPVwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCIuc3BsaXQoXCJcIiksXG5CLl9fa0JpdENvbnZlcnNpb25CdWZmZXI9bmV3IEFycmF5QnVmZmVyKDgpLEIuX19rQml0Q29udmVyc2lvbkRvdWJsZT1uZXcgRmxvYXQ2NEFycmF5KEIuX19rQml0Q29udmVyc2lvbkJ1ZmZlciksQi5fX2tCaXRDb252ZXJzaW9uSW50cz1uZXcgSW50MzJBcnJheShCLl9fa0JpdENvbnZlcnNpb25CdWZmZXIpLEIuX19jbHozMj12fHxmdW5jdGlvbihhKXt2YXIgYj1NYXRoLkxOMixkPU1hdGgubG9nO3JldHVybiAwPT09YT8zMjowfDMxLSgwfGQoYT4+PjApL2IpfSxCLl9faW11bD10fHxmdW5jdGlvbihhLGIpe3JldHVybiAwfGEqYn0sQn0pfSxmdW5jdGlvbihtLHEsYSl7KGZ1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZShhKXtkZWxldGUgdFthXX1mdW5jdGlvbiBmKGEpe2lmKHYpc2V0VGltZW91dChmLDAsYSk7ZWxzZXt2YXIgYj10W2FdO2lmKGIpe3Y9ITA7dHJ5e3ZhciBkPWIuY2FsbGJhY2ssaz1iLmFyZ3M7c3dpdGNoKGsubGVuZ3RoKXtjYXNlIDA6ZCgpO1xuYnJlYWs7Y2FzZSAxOmQoa1swXSk7YnJlYWs7Y2FzZSAyOmQoa1swXSxrWzFdKTticmVhaztjYXNlIDM6ZChrWzBdLGtbMV0sa1syXSk7YnJlYWs7ZGVmYXVsdDpkLmFwcGx5KGMsayl9fWZpbmFsbHl7ZShhKSx2PSExfX19fWZ1bmN0aW9uIGQoKXtEPWZ1bmN0aW9uKGEpe2IubmV4dFRpY2soZnVuY3Rpb24oKXtmKGEpfSl9fWZ1bmN0aW9uIGcoKXtpZihhLnBvc3RNZXNzYWdlJiYhYS5pbXBvcnRTY3JpcHRzKXt2YXIgYj0hMCxkPWEub25tZXNzYWdlO2Eub25tZXNzYWdlPWZ1bmN0aW9uKCl7Yj0hMX07YS5wb3N0TWVzc2FnZShcIlwiLFwiKlwiKTthLm9ubWVzc2FnZT1kO3JldHVybiBifX1mdW5jdGlvbiBuKCl7dmFyIGI9XCJzZXRJbW1lZGlhdGUkXCIrTWF0aC5yYW5kb20oKStcIiRcIixkPWZ1bmN0aW9uKGQpe2Quc291cmNlPT09YSYmXCJzdHJpbmdcIj09PXR5cGVvZiBkLmRhdGEmJjA9PT1kLmRhdGEuaW5kZXhPZihiKSYmZigrZC5kYXRhLnNsaWNlKGIubGVuZ3RoKSl9O2EuYWRkRXZlbnRMaXN0ZW5lcj9cbmEuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIixkLCExKTphLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsZCk7RD1mdW5jdGlvbihkKXthLnBvc3RNZXNzYWdlKGIrZCxcIipcIil9fWZ1bmN0aW9uIGsoKXt2YXIgYT1uZXcgTWVzc2FnZUNoYW5uZWw7YS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24oYSl7ZihhLmRhdGEpfTtEPWZ1bmN0aW9uKGIpe2EucG9ydDIucG9zdE1lc3NhZ2UoYil9fWZ1bmN0aW9uIHAoKXt2YXIgYT1CLmRvY3VtZW50RWxlbWVudDtEPWZ1bmN0aW9uKGIpe3ZhciBkPUIuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtkLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2YoYik7ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDthLnJlbW92ZUNoaWxkKGQpO2Q9bnVsbH07YS5hcHBlbmRDaGlsZChkKX19ZnVuY3Rpb24gdSgpe0Q9ZnVuY3Rpb24oYSl7c2V0VGltZW91dChmLDAsYSl9fWlmKCFhLnNldEltbWVkaWF0ZSl7dmFyIEE9MSx0PXt9LHY9ITEsQj1hLmRvY3VtZW50LFxuRCxFPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpO0U9RSYmRS5zZXRUaW1lb3V0P0U6YTtcIltvYmplY3QgcHJvY2Vzc11cIj09PXt9LnRvU3RyaW5nLmNhbGwoYS5wcm9jZXNzKT9kKCk6ZygpP24oKTphLk1lc3NhZ2VDaGFubmVsP2soKTpCJiZcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiaW4gQi5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpP3AoKTp1KCk7RS5zZXRJbW1lZGlhdGU9ZnVuY3Rpb24oYSl7XCJmdW5jdGlvblwiIT09dHlwZW9mIGEmJihhPW5ldyBGdW5jdGlvbihcIlwiK2EpKTtmb3IodmFyIGI9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxkPTA7ZDxiLmxlbmd0aDtkKyspYltkXT1hcmd1bWVudHNbZCsxXTt0W0FdPXtjYWxsYmFjazphLGFyZ3M6Yn07RChBKTtyZXR1cm4gQSsrfTtFLmNsZWFySW1tZWRpYXRlPWV9fSkoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBzZWxmP1widW5kZWZpbmVkXCI9PT10eXBlb2YgYT90aGlzOmE6c2VsZil9KS5jYWxsKHRoaXMsXG5hKDApLGEoOCkpfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoKXt0aHJvdyBFcnJvcihcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIik7fWZ1bmN0aW9uIGMoKXt0aHJvdyBFcnJvcihcImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFwiKTt9ZnVuY3Rpb24gYihiKXtpZihnPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChiLDApO2lmKChnPT09YXx8IWcpJiZzZXRUaW1lb3V0KXJldHVybiBnPXNldFRpbWVvdXQsc2V0VGltZW91dChiLDApO3RyeXtyZXR1cm4gZyhiLDApfWNhdGNoKHYpe3RyeXtyZXR1cm4gZy5jYWxsKG51bGwsYiwwKX1jYXRjaChCKXtyZXR1cm4gZy5jYWxsKHRoaXMsYiwwKX19fWZ1bmN0aW9uIGUoYSl7aWYobj09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGEpO2lmKChuPT09Y3x8IW4pJiZjbGVhclRpbWVvdXQpcmV0dXJuIG49Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChhKTt0cnl7cmV0dXJuIG4oYSl9Y2F0Y2godil7dHJ5e3JldHVybiBuLmNhbGwobnVsbCxcbmEpfWNhdGNoKEIpe3JldHVybiBuLmNhbGwodGhpcyxhKX19fWZ1bmN0aW9uIGYoKXtwJiZ1JiYocD0hMSx1Lmxlbmd0aD9rPXUuY29uY2F0KGspOkE9LTEsay5sZW5ndGgmJmwoKSl9ZnVuY3Rpb24gbCgpe2lmKCFwKXt2YXIgYT1iKGYpO3A9ITA7Zm9yKHZhciBkPWsubGVuZ3RoO2Q7KXt1PWs7Zm9yKGs9W107KytBPGQ7KXUmJnVbQV0ucnVuKCk7QT0tMTtkPWsubGVuZ3RofXU9bnVsbDtwPSExO2UoYSl9fWZ1bmN0aW9uIGgoYSxiKXt0aGlzLmZ1bj1hO3RoaXMuYXJyYXk9Yn1mdW5jdGlvbiBkKCl7fW09bS5leHBvcnRzPXt9O3RyeXt2YXIgZz1cImZ1bmN0aW9uXCI9PT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmF9Y2F0Y2godCl7Zz1hfXRyeXt2YXIgbj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDpjfWNhdGNoKHQpe249Y312YXIgaz1bXSxwPSExLHUsQT0tMTttLm5leHRUaWNrPWZ1bmN0aW9uKGEpe3ZhciBkPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtXG4xKTtpZigxPGFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKylkW2MtMV09YXJndW1lbnRzW2NdO2sucHVzaChuZXcgaChhLGQpKTsxIT09ay5sZW5ndGh8fHB8fGIobCl9O2gucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O20udGl0bGU9XCJicm93c2VyXCI7bS5icm93c2VyPSEwO20uZW52PXt9O20uYXJndj1bXTttLnZlcnNpb249XCJcIjttLnZlcnNpb25zPXt9O20ub249ZDttLmFkZExpc3RlbmVyPWQ7bS5vbmNlPWQ7bS5vZmY9ZDttLnJlbW92ZUxpc3RlbmVyPWQ7bS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZDttLmVtaXQ9ZDttLnByZXBlbmRMaXN0ZW5lcj1kO20ucHJlcGVuZE9uY2VMaXN0ZW5lcj1kO20ubGlzdGVuZXJzPWZ1bmN0aW9uKGEpe3JldHVybltdfTttLmJpbmRpbmc9ZnVuY3Rpb24oYSl7dGhyb3cgRXJyb3IoXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFwiKTt9O20uY3dkPVxuZnVuY3Rpb24oKXtyZXR1cm5cIi9cIn07bS5jaGRpcj1mdW5jdGlvbihhKXt0aHJvdyBFcnJvcihcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFwiKTt9O20udW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH19LGZ1bmN0aW9uKG0scSl7U2suYXNzZXJ0cz17fTtTay5hc3NlcnRzLmFzc2VydD1mdW5jdGlvbihhLGMpe3JldHVybiBhfTtTay5leHBvcnRTeW1ib2woXCJTay5hc3NlcnRzLmFzc2VydFwiLFNrLmFzc2VydHMuYXNzZXJ0KTtTay5hc3NlcnRzLmZhaWw9ZnVuY3Rpb24oYSl7fTtTay5leHBvcnRTeW1ib2woXCJTay5hc3NlcnRzLmZhaWxcIixTay5hc3NlcnRzLmZhaWwpfSxmdW5jdGlvbihtLHEpe1NrLmJvb2xfY2hlY2s9ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDA9PT1hfHxudWxsPT09YXx8XCJib29sZWFuXCIhPT10eXBlb2YgYSl0aHJvdyBFcnJvcihcIm11c3Qgc3BlY2lmeSBcIitjK1wiIGFuZCBpdCBtdXN0IGJlIGEgYm9vbGVhblwiKTt9O1NrLnB5dGhvbjI9e3ByaW50X2Z1bmN0aW9uOiExLFxuZGl2aXNpb246ITEsYWJzb2x1dGVfaW1wb3J0Om51bGwsdW5pY29kZV9saXRlcmFsczohMSxweXRob24zOiExLGNsYXNzX3JlcHI6ITEsaW5oZXJpdF9mcm9tX29iamVjdDohMSxzdXBlcl9hcmdzOiExLG9jdGFsX251bWJlcl9saXRlcmFsOiExLGJhbmtlcnNfcm91bmRpbmc6ITEscHl0aG9uX3ZlcnNpb246ITEsZHVuZGVyX3JvdW5kOiExLGV4Y2VwdGlvbnM6ITEsbm9fbG9uZ190eXBlOiExLGNlaWxfZmxvb3JfaW50OiExLHNpbGVudF9vY3RhbF9saXRlcmFsOiEwfTtTay5weXRob24zPXtwcmludF9mdW5jdGlvbjohMCxkaXZpc2lvbjohMCxhYnNvbHV0ZV9pbXBvcnQ6bnVsbCx1bmljb2RlX2xpdGVyYWxzOiEwLHB5dGhvbjM6ITAsY2xhc3NfcmVwcjohMCxpbmhlcml0X2Zyb21fb2JqZWN0OiEwLHN1cGVyX2FyZ3M6ITAsb2N0YWxfbnVtYmVyX2xpdGVyYWw6ITAsYmFua2Vyc19yb3VuZGluZzohMCxweXRob25fdmVyc2lvbjohMCxkdW5kZXJfcm91bmQ6ITAsZXhjZXB0aW9uczohMCxcbm5vX2xvbmdfdHlwZTohMCxjZWlsX2Zsb29yX2ludDohMCxzaWxlbnRfb2N0YWxfbGl0ZXJhbDohMX07U2suY29uZmlndXJlPWZ1bmN0aW9uKGEpe1NrLm91dHB1dD1hLm91dHB1dHx8U2sub3V0cHV0O1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5vdXRwdXQpO1NrLmZpbGV3cml0ZXI9YS5maWxld3JpdGVyfHxTay5maWxld3JpdGVyO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5maWxld3JpdGVyKTtTay5kZWJ1Z291dD1hLmRlYnVnb3V0fHxTay5kZWJ1Z291dDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZGVidWdvdXQpO1NrLnVuY2F1Z2h0RXhjZXB0aW9uPWEudW5jYXVnaHRFeGNlcHRpb258fFNrLnVuY2F1Z2h0RXhjZXB0aW9uO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay51bmNhdWdodEV4Y2VwdGlvbik7U2sucmVhZD1hLnJlYWR8fFNrLnJlYWQ7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09XG50eXBlb2YgU2sucmVhZCk7U2subm9ucmVhZG9wZW49YS5ub25yZWFkb3Blbnx8ITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2subm9ucmVhZG9wZW4pO1NrLmZpbGVvcGVuPWEuZmlsZW9wZW58fHZvaWQgMDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZW9wZW58fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgU2suZmlsZW9wZW4pO1NrLmZpbGV3cml0ZT1hLmZpbGV3cml0ZXx8dm9pZCAwO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5maWxld3JpdGV8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlKTtTay50aW1lb3V0TXNnPWEudGltZW91dE1zZ3x8U2sudGltZW91dE1zZztTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sudGltZW91dE1zZyk7U2suZXhwb3J0U3ltYm9sKFwiU2sudGltZW91dE1zZ1wiLFNrLnRpbWVvdXRNc2cpO1NrLnN5c2FyZ3Y9YS5zeXNhcmd2fHxcblNrLnN5c2FyZ3Y7U2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoU2suc3lzYXJndikpO1NrLl9fZnV0dXJlX189YS5fX2Z1dHVyZV9ffHxTay5weXRob24zO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5wcmludF9mdW5jdGlvbixcIlNrLl9fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmRpdmlzaW9uLFwiU2suX19mdXR1cmVfXy5kaXZpc2lvblwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18udW5pY29kZV9saXRlcmFscyxcIlNrLl9fZnV0dXJlX18udW5pY29kZV9saXRlcmFsc1wiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uY2xhc3NfcmVwcixcIlNrLl9fZnV0dXJlX18uY2xhc3NfcmVwclwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uaW5oZXJpdF9mcm9tX29iamVjdCxcIlNrLl9fZnV0dXJlX18uaW5oZXJpdF9mcm9tX29iamVjdFwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uc3VwZXJfYXJncyxcblwiU2suX19mdXR1cmVfXy5zdXBlcl9hcmdzXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5vY3RhbF9udW1iZXJfbGl0ZXJhbCxcIlNrLl9fZnV0dXJlX18ub2N0YWxfbnVtYmVyX2xpdGVyYWxcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmJhbmtlcnNfcm91bmRpbmcsXCJTay5fX2Z1dHVyZV9fLmJhbmtlcnNfcm91bmRpbmdcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnB5dGhvbl92ZXJzaW9uLFwiU2suX19mdXR1cmVfXy5weXRob25fdmVyc2lvblwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kLFwiU2suX19mdXR1cmVfXy5kdW5kZXJfcm91bmRcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmV4Y2VwdGlvbnMsXCJTay5fX2Z1dHVyZV9fLmV4Y2VwdGlvbnNcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLm5vX2xvbmdfdHlwZSxcIlNrLl9fZnV0dXJlX18ubm9fbG9uZ190eXBlXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5jZWlsX2Zsb29yX2ludCxcblwiU2suX19mdXR1cmVfXy5jZWlsX2Zsb29yX2ludFwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uc2lsZW50X29jdGFsX2xpdGVyYWwsXCJTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsXCIpO1NrLmltYWdlUHJveHk9YS5pbWFnZVByb3h5fHxcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8zMjB4XCI7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBTay5pbWFnZVByb3h5fHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suaW1hZ2VQcm94eSk7U2suaW5wdXRmdW49YS5pbnB1dGZ1bnx8U2suaW5wdXRmdW47U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmlucHV0ZnVuKTtTay5pbnB1dGZ1blRha2VzUHJvbXB0PWEuaW5wdXRmdW5UYWtlc1Byb21wdHx8ITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2suaW5wdXRmdW5UYWtlc1Byb21wdCk7U2sucmV0YWluR2xvYmFscz1hLnJldGFpbmdsb2JhbHN8fGEucmV0YWluR2xvYmFsc3x8XG4hMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5yZXRhaW5HbG9iYWxzKTtTay5kZWJ1Z2dpbmc9YS5kZWJ1Z2dpbmd8fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLmRlYnVnZ2luZyk7U2sua2lsbGFibGVXaGlsZT1hLmtpbGxhYmxlV2hpbGV8fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLmtpbGxhYmxlV2hpbGUpO1NrLmtpbGxhYmxlRm9yPWEua2lsbGFibGVGb3J8fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLmtpbGxhYmxlRm9yKTtTay5zaWduYWxzPWEuc2lnbmFscztTay5zaWduYWxzPSEwPT09U2suc2lnbmFscz97bGlzdGVuZXJzOltdLGFkZEV2ZW50TGlzdGVuZXIoYSl7U2suc2lnbmFscy5saXN0ZW5lcnMucHVzaChhKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcihhKXthPVNrLnNpZ25hbHMubGlzdGVuZXJzLmluZGV4T2YoYSk7MDw9YSYmU2suc2lnbmFscy5saXN0ZW5lcnMuc3BsaWNlKGEsXG4xKX0sc2lnbmFsKGEsYil7Zm9yKHZhciBjPTA7YzxTay5zaWduYWxzLmxpc3RlbmVycy5sZW5ndGg7YysrKVNrLnNpZ25hbHMubGlzdGVuZXJzW2NdLmNhbGwobnVsbCxhLGIpfX06bnVsbDtTay5hc3NlcnRzLmFzc2VydChcIm9iamVjdFwiPT09dHlwZW9mIFNrLnNpZ25hbHMpO1NrLmJyZWFrcG9pbnRzPWEuYnJlYWtwb2ludHN8fGZ1bmN0aW9uKCl7cmV0dXJuITB9O1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5icmVha3BvaW50cyk7U2suc2V0VGltZW91dD1hLnNldFRpbWVvdXQ7dm9pZCAwPT09U2suc2V0VGltZW91dCYmKFNrLnNldFRpbWVvdXQ9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/ZnVuY3Rpb24oYSxiKXtzZXRUaW1lb3V0KGEsYil9OmZ1bmN0aW9uKGEsYil7YSgpfSk7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLnNldFRpbWVvdXQpO1wiZXhlY0xpbWl0XCJpbiBhJiYoU2suZXhlY0xpbWl0PWEuZXhlY0xpbWl0KTtcblwieWllbGRMaW1pdFwiaW4gYSYmKFNrLnlpZWxkTGltaXQ9YS55aWVsZExpbWl0KTthLnN5c3BhdGgmJihTay5zeXNwYXRoPWEuc3lzcGF0aCxTay5hc3NlcnRzLmFzc2VydChTay5pc0FycmF5TGlrZShTay5zeXNwYXRoKSksU2sucmVhbHN5c3BhdGg9dm9pZCAwLFNrLnN5c21vZHVsZXM9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSkpO1NrLm1pc2NldmFsLnNvZnRzcGFjZV89ITE7U2suc3dpdGNoX3ZlcnNpb24oU2suX19mdXR1cmVfXy5weXRob24zKTtTay5idWlsdGluLnN0ci4kbmV4dD1Tay5fX2Z1dHVyZV9fLnB5dGhvbjM/bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZXh0X19cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwibmV4dFwiKTtTay5zZXR1cE9wZXJhdG9ycyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpO1NrLnNldHVwRHVuZGVyTWV0aG9kcyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpO1NrLnNldHVwT2JqZWN0cyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpO1NrLnRva2VuLnNldHVwVG9rZW5zKFNrLl9fZnV0dXJlX18ucHl0aG9uMyl9O1xuU2suZXhwb3J0U3ltYm9sKFwiU2suY29uZmlndXJlXCIsU2suY29uZmlndXJlKTtTay51bmNhdWdodEV4Y2VwdGlvbj1mdW5jdGlvbihhKXt0aHJvdyBhO307U2sudW5jYXVnaHRFeGNlcHRpb249ZnVuY3Rpb24oYSl7dGhyb3cgYTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnVuY2F1Z2h0RXhjZXB0aW9uXCIsU2sudW5jYXVnaHRFeGNlcHRpb24pO1NrLnRpbWVvdXRNc2c9ZnVuY3Rpb24oKXtyZXR1cm5cIlByb2dyYW0gZXhjZWVkZWQgcnVuIHRpbWUgbGltaXQuXCJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnRpbWVvdXRNc2dcIixTay50aW1lb3V0TXNnKTtTay5leGVjTGltaXQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1NrLnlpZWxkTGltaXQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1NrLm91dHB1dD1mdW5jdGlvbihhKXt9O1NrLnJlYWQ9ZnVuY3Rpb24oYSl7aWYodm9pZCAwPT09U2suYnVpbHRpbkZpbGVzKXRocm93XCJza3VscHQtc3RkbGliLmpzIGhhcyBub3QgYmVlbiBsb2FkZWRcIjtpZih2b2lkIDA9PT1cblNrLmJ1aWx0aW5GaWxlcy5maWxlc1thXSl0aHJvd1wiRmlsZSBub3QgZm91bmQ6ICdcIithK1wiJ1wiO3JldHVybiBTay5idWlsdGluRmlsZXMuZmlsZXNbYV19O1NrLnN5c2FyZ3Y9W107U2suZ2V0U3lzQXJndj1mdW5jdGlvbigpe3JldHVybiBTay5zeXNhcmd2fTtTay5leHBvcnRTeW1ib2woXCJTay5nZXRTeXNBcmd2XCIsU2suZ2V0U3lzQXJndik7U2suc3lzcGF0aD1bXTtTay5pbkJyb3dzZXI9dm9pZCAwIT09U2suZ2xvYmFsLmRvY3VtZW50O1NrLmRlYnVnb3V0PWZ1bmN0aW9uKGEpe307KGZ1bmN0aW9uKCl7dm9pZCAwIT09U2suZ2xvYmFsLndyaXRlPyhTay5vdXRwdXQ9U2suZ2xvYmFsLndyaXRlLFNrLmZpbGV3cml0ZXI9U2suZ2xvYmFsLndyaXRlKTp2b2lkIDAhPT1Tay5nbG9iYWwuY29uc29sZSYmdm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUubG9nPyhTay5vdXRwdXQ9ZnVuY3Rpb24oYSl7U2suZ2xvYmFsLmNvbnNvbGUubG9nKGEpfSxTay5maWxld3JpdGVyPVNrLm91dHB1dCk6XG52b2lkIDAhPT1Tay5nbG9iYWwucHJpbnQmJihTay5vdXRwdXQ9U2suZ2xvYmFsLnByaW50LFNrLmZpbGV3cml0ZXI9U2sub3V0cHV0KTt2b2lkIDAhPT1Tay5nbG9iYWwuY29uc29sZSYmdm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUubG9nP1NrLmRlYnVnb3V0PWZ1bmN0aW9uKGEpe1NrLmdsb2JhbC5jb25zb2xlLmxvZyhhKX06dm9pZCAwIT09U2suZ2xvYmFsLnByaW50JiYoU2suZGVidWdvdXQ9U2suZ2xvYmFsLnByaW50KX0pKCk7U2suaW5wdXRmdW49ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5wcm9tcHQoYSl9O1NrLnNldHVwX21ldGhvZF9tYXBwaW5ncz1mdW5jdGlvbigpe307U2suc2V0dXBEaWN0SXRlcmF0b3JzPWZ1bmN0aW9uKGEpe307U2suc3dpdGNoX3ZlcnNpb249ZnVuY3Rpb24oYSl7Y29uc3QgYz17ZmxvYXRfOnttZXRob2RfbmFtZXM6W1wiX19yb3VuZF9fXCJdLDI6WyExXSwzOlshMF19LGludF86e21ldGhvZF9uYW1lczpbXCJfX3JvdW5kX19cIl0sMjpbITFdLDM6WyEwXX0sXG5saXN0OnttZXRob2RfbmFtZXM6W1wiY2xlYXJcIixcImNvcHlcIixcInNvcnRcIl0sMjpbITEsITEsITBdLDM6WyEwLCEwLCEwXX0sZGljdDp7bWV0aG9kX25hbWVzOltcImhhc19rZXlcIixcImtleXNcIixcIml0ZW1zXCIsXCJ2YWx1ZXNcIl0sMjpbITAsITAsITAsITBdLDM6WyExLCEwLCEwLCEwXX19O2ZvcihsZXQgbCBpbiBjKXtjb25zdCBoPVNrLmJ1aWx0aW5bbF0sZD1jW2xdLm1ldGhvZF9uYW1lczt2YXIgYj1jW2xdWzNdO2lmKGEmJnZvaWQgMD09PWgucHkzJG1ldGhvZHMpYnJlYWs7ZWxzZSBpZih2b2lkIDA9PT1oLnB5MyRtZXRob2RzKXtoLnB5MyRtZXRob2RzPXt9O2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1kW2VdO2JbZV0mJihoLnB5MyRtZXRob2RzW2ZdPWgucHJvdG90eXBlW2ZdLmQkZGVmKX19YT9lPWgucHkzJG1ldGhvZHM6KGI9Y1tsXVsyXSxlPWgucHkyJG1ldGhvZHMpO2ZvcihmPTA7ZjxkLmxlbmd0aDtmKyspe2NvbnN0IGE9ZFtmXTtkZWxldGUgaC5wcm90b3R5cGVbYV07XG5iW2ZdJiYoaC5wcm90b3R5cGVbYV09bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IoaCxlW2FdKSl9fX07U2suZXhwb3J0U3ltYm9sKFwiU2suX19mdXR1cmVfX1wiLFNrLl9fZnV0dXJlX18pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmlucHV0ZnVuXCIsU2suaW5wdXRmdW4pfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIHRoaXMucHJvdG90eXBlW2EuJG1hbmdsZWRdfWZ1bmN0aW9uIGMoYSl7YT1hLiRtYW5nbGVkO2NvbnN0IGI9dGhpcy5wcm90b3R5cGUudHAkbXJvO2ZvcihsZXQgZD0wO2Q8Yi5sZW5ndGg7KytkKXtjb25zdCBjPWJbZF0ucHJvdG90eXBlO2lmKGMuaGFzT3duUHJvcGVydHkoYSkpcmV0dXJuIGNbYV19fWZ1bmN0aW9uIGIoYixmLGgsayl7Y29uc3QgZD1lKGgpLGc9Zi5wcm90b3R5cGU7U2suYWJzdHIuc2V0VXBJbmhlcml0YW5jZShiLGYsZCxrKTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhnLHtzayRwcm90b3R5cGljYWw6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfSxcbnRwJGJhc2VzOnt2YWx1ZTpoLHdyaXRhYmxlOiEwfSx0cCRtcm86e3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9LGhwJHR5cGU6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfX0pO2cudHAkbXJvPWYuJGJ1aWxkTVJPKCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZix7JHR5cGVMb29rdXA6e3ZhbHVlOmcuc2skcHJvdG90eXBpY2FsP2E6Yyx3cml0YWJsZTohMH0sc2ska2xhc3M6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfX0pfWZ1bmN0aW9uIGUoYSl7ZnVuY3Rpb24gYihhKXtyZXR1cm4gdm9pZCAwPT09YS5zayRrbGFzcz9hOmIoYS5wcm90b3R5cGUudHAkYmFzZSl9MD09PWEubGVuZ3RoJiZhLnB1c2goU2suYnVpbHRpbi5vYmplY3QpO2xldCBkLGMsZSxmO2ZvcihsZXQgaz0wO2s8YS5sZW5ndGg7aysrKXtmPWFba107aWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhmKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYXNlcyBtdXN0IGJlICd0eXBlJyBvYmplY3RzXCIpO2lmKCExPT09XG5mLnNrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzcyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlICdcIitmLnByb3RvdHlwZS50cCRuYW1lK1wiJyBpcyBub3QgYW4gYWNjZXB0YWJsZSBiYXNlIHR5cGVcIik7ZT1iKGYpO2lmKHZvaWQgMD09PWMpYz1lLGQ9ZjtlbHNlIGlmKCFjLiRpc1N1YlR5cGUoZSkpaWYoZS4kaXNTdWJUeXBlKGMpKWM9ZSxkPWY7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtdWx0aXBsZSBiYXNlcyBoYXZlIGluc3RhbmNlIGxheW91dCBjb25mbGljdHNcIik7fXJldHVybiBkfWZ1bmN0aW9uIGYoYSl7Zm9yKDtudWxsIT09YS5wcm90b3R5cGUudHAkYmFzZTspe2lmKHZvaWQgMD09PWEuc2ska2xhc3MmJmEucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwiX19kaWN0X19cIikpcmV0dXJuIGE9YS5wcm90b3R5cGUuX19kaWN0X18sU2suYnVpbHRpbi5jaGVja0RhdGFEZXNjcihhKT9hOnZvaWQgMDthPWEucHJvdG90eXBlLnRwJGJhc2V9fVxuZnVuY3Rpb24gbChhLGIsYyl7aWYodm9pZCAwPT09YS5zayRrbGFzcyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBzZXQgXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIi5cIitjLiRqc3N0cigpKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGRlbGV0ZSBcIithLnByb3RvdHlwZS50cCRuYW1lK1wiLlwiK2MuJGpzc3RyKCkpO312b2lkIDA9PT1Tay5idWlsdGluJiYoU2suYnVpbHRpbj17fSk7U2suYnVpbHRpbi50eXBlPWZ1bmN0aW9uKGEpe3RoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR5cGUmJlNrLmFzc2VydHMuZmFpbChcImNhbGxpbmcgbmV3IFNrLmJ1aWx0aW4udHlwZSBpcyBub3Qgc2FmZVwiKTtyZXR1cm4gYS5vYiR0eXBlfTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhTay5idWlsdGluLnR5cGUucHJvdG90eXBlLHtjYWxsOnt2YWx1ZTpGdW5jdGlvbi5wcm90b3R5cGUuY2FsbH0sYXBwbHk6e3ZhbHVlOkZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseX0sXG50cCRzbG90czp7dmFsdWU6e3RwJGRvYzpcInR5cGUob2JqZWN0X29yX25hbWUsIGJhc2VzLCBkaWN0KVxcbnR5cGUob2JqZWN0KSAtPiB0aGUgb2JqZWN0J3MgdHlwZVxcbnR5cGUobmFtZSwgYmFzZXMsIGRpY3QpIC0+IGEgbmV3IHR5cGVcIix0cCRjYWxsOmZ1bmN0aW9uKGEsYil7aWYodGhpcz09PVNrLmJ1aWx0aW4udHlwZSl7aWYoMT09PWEubGVuZ3RoJiYodm9pZCAwPT09Ynx8IWIubGVuZ3RoKSlyZXR1cm4gYVswXS5vYiR0eXBlO2lmKDMhPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgdGFrZXMgMSBvciAzIGFyZ3VtZW50c1wiKTt9bGV0IGQ9dGhpcy5wcm90b3R5cGUudHAkbmV3KGEsYik7aWYoZC4kaXNTdXNwZW5zaW9uKXJldHVybiBTay5taXNjZXZhbC5jaGFpbihkLGM9PntkPWM7aWYoZC5vYiR0eXBlLiRpc1N1YlR5cGUodGhpcykpcmV0dXJuIGQudHAkaW5pdChhLGIpfSwoKT0+ZCk7aWYoZC5vYiR0eXBlLiRpc1N1YlR5cGUodGhpcykpe2NvbnN0IGM9XG5kLnRwJGluaXQoYSxiKTtyZXR1cm4gdm9pZCAwIT09YyYmYy4kaXNTdXNwZW5zaW9uP1NrLm1pc2NldmFsLmNoYWluKGMsKCk9PmQpOmR9cmV0dXJuIGR9LHRwJG5ldzpmdW5jdGlvbihhLGMpe2lmKDMhPT1hLmxlbmd0aCl7aWYoMT09PWEubGVuZ3RoJiYodm9pZCAwPT09Y3x8IWMubGVuZ3RoKSlyZXR1cm4gYVswXS5vYiR0eXBlO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR5cGUoKSB0YWtlcyAxIG9yIDMgYXJndW1lbnRzXCIpO31sZXQgZDtjPWFbMF07ZD1hWzFdO2E9YVsyXTtpZihcImRpY3RcIiE9PWEudHAkbmFtZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgYXJndW1lbnQgMyBtdXN0IGJlIGRpY3QsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIGFyZ3VtZW50IDEgbXVzdCBiZSBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShjKSk7XG5jPWMuJGpzc3RyKCk7aWYoXCJ0dXBsZVwiIT09ZC50cCRuYW1lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR5cGUoKSBhcmd1bWVudCAyIG11c3QgYmUgdHVwbGUsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShkKSk7ZD1kLnNrJGFzYXJyYXkoKTtjb25zdCBlPWZ1bmN0aW9uKCl7dGhpcy4kZD1uZXcgU2suYnVpbHRpbi5kaWN0fTtiKGMsZSxkLHRoaXMuY29uc3RydWN0b3IpO1NrLmdsb2JhbHMmJihlLnByb3RvdHlwZS5fX21vZHVsZV9fPVNrLmdsb2JhbHMuX19uYW1lX18pO2UucHJvdG90eXBlLl9fZG9jX189U2suYnVpbHRpbi5ub25lLm5vbmUkO3ZvaWQgMD09PWUuJHR5cGVMb29rdXAoU2suYnVpbHRpbi5zdHIuJGRpY3QpJiYoZS5wcm90b3R5cGUuX19kaWN0X189bmV3IFNrLmJ1aWx0aW4uZ2V0c2V0X2Rlc2NyaXB0b3IoZSxoKSk7YS4kaXRlbXMoKS5mb3JFYWNoKChbYSxiXSk9PntlLnByb3RvdHlwZVthLiRtYW5nbGVkXT1ifSk7ZS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJfX25ld19fXCIpJiZcbihhPWUucHJvdG90eXBlLl9fbmV3X18sYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZnVuYyYmKGUucHJvdG90eXBlLl9fbmV3X189bmV3IFNrLmJ1aWx0aW4uc3RhdGljbWV0aG9kKGEpKSk7ZS4kYWxsb2NhdGVTbG90cygpO3JldHVybiBlfSx0cCRnZXRhdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dGhpcy5vYiR0eXBlO2NvbnN0IGM9ZC4kdHlwZUxvb2t1cChhKTtsZXQgZTtpZih2b2lkIDAhPT1jJiYoZT1jLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1lJiZ2b2lkIDAhPT1jLnRwJGRlc2NyX3NldCkpcmV0dXJuIGI9ZS5jYWxsKGMsdGhpcyxkLGIpO2E9dGhpcy4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1hKXJldHVybiBkPWEudHAkZGVzY3JfZ2V0LHZvaWQgMCE9PWQ/Yj1kLmNhbGwoYSxudWxsLHRoaXMsYik6YTtpZih2b2lkIDAhPT1lKXJldHVybiBiPWUuY2FsbChjLHRoaXMsZCxiKTtpZih2b2lkIDAhPT1jKXJldHVybiBjfSx0cCRzZXRhdHRyOmZ1bmN0aW9uKGEsYixjKXtpZighdGhpcy5zayRrbGFzcyl7aWYodm9pZCAwIT09XG5iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHNldCBhdHRyaWJ1dGVzIG9mIGJ1aWx0LWluL2V4dGVuc2lvbiB0eXBlICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJ1wiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBkZWxldGUgYXR0cmlidXRlcyBvbiB0eXBlIG9iamVjdCAnXCIrdGhpcy5wcm90b3R5cGUudHAkbmFtZStcIidcIik7fWNvbnN0IGQ9dGhpcy5vYiR0eXBlLiR0eXBlTG9va3VwKGEpO2lmKHZvaWQgMCE9PWQpe2NvbnN0IGE9ZC50cCRkZXNjcl9zZXQ7aWYoYSlyZXR1cm4gYS5jYWxsKGQsdGhpcyxiLGMpfWM9YS4kbWFuZ2xlZDtpZih2b2lkIDA9PT1iKWlmKGI9dGhpcy5wcm90b3R5cGUsYi5oYXNPd25Qcm9wZXJ0eShjKSlkZWxldGUgYltjXSxhPVNrLmR1bmRlclRvU2t1bHB0W2NdLHZvaWQgMCE9PWEmJihkZWxldGUgdGhpcy5wcm90b3R5cGVbYV0sYi5zayRwcm90b3R5cGljYWx8fHRoaXMuJGFsbG9jYXRlR2V0dGVyU2xvdChjKSk7XG5lbHNlIHRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwidHlwZSBvYmplY3QgJ1wiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInIGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2EuJGpzc3RyKCkrXCInXCIpO2Vsc2UgdGhpcy5wcm90b3R5cGVbY109YixjIGluIFNrLmR1bmRlclRvU2t1bHB0JiZ0aGlzLiRhbGxvY2F0ZVNsb3QoYyxiKX0sJHI6ZnVuY3Rpb24oKXtsZXQgYT10aGlzLnByb3RvdHlwZS5fX21vZHVsZV9fLGI9XCJcIixjPVwiY2xhc3NcIjthJiZTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpP2I9YS52K1wiLlwiOmE9bnVsbDthfHx0aGlzLnNrJGtsYXNzfHxTay5fX2Z1dHVyZV9fLmNsYXNzX3JlcHJ8fChjPVwidHlwZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPFwiK2MrXCIgJ1wiK2IrdGhpcy5wcm90b3R5cGUudHAkbmFtZStcIic+XCIpfX0sd3JpdGFibGU6ITB9LHRwJG1ldGhvZHM6e3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9LHRwJGdldHNldHM6e3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9LFxuc2skdHlwZTp7dmFsdWU6ITB9LCRpc1N1YlR5cGU6e3ZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzPT09YXx8dGhpcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBhfHwhdGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsJiZ0aGlzLnByb3RvdHlwZS50cCRtcm8uaW5jbHVkZXMoYSl9fSwkYWxsb2NhdGVTbG90Ont2YWx1ZTpmdW5jdGlvbihhLGIpe2E9U2suc2xvdHNbYV07Y29uc3QgYz1hLiRzbG90X25hbWUsZD10aGlzLnByb3RvdHlwZTtkLmhhc093blByb3BlcnR5KGMpJiZkZWxldGUgZFtjXTtkW2NdPWEuJHNsb3RfZnVuYyhiKX19LCRhbGxvY2F0ZVNsb3RzOnt2YWx1ZTpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5wcm90b3R5cGU7dGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsP09iamVjdC5rZXlzKGEpLmZvckVhY2goYj0+e2IgaW4gU2suc2xvdHMmJnRoaXMuJGFsbG9jYXRlU2xvdChiLGFbYl0pfSk6T2JqZWN0LmtleXMoU2suc2xvdHMpLmZvckVhY2goYj0+e2EuaGFzT3duUHJvcGVydHkoYik/XG50aGlzLiRhbGxvY2F0ZVNsb3QoYixhW2JdKTp0aGlzLiRhbGxvY2F0ZUdldHRlclNsb3QoYil9KX19LCRhbGxvY2F0ZUdldHRlclNsb3Q6e3ZhbHVlOmZ1bmN0aW9uKGEpe2NvbnN0IGI9U2suc2xvdHNbYV0uJHNsb3RfbmFtZSxjPXRoaXMucHJvdG90eXBlO2MuaGFzT3duUHJvcGVydHkoYil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLGIse2NvbmZpZ3VyYWJsZTohMCxnZXQoKXtjb25zdCBhPWMudHAkbXJvO2ZvcihsZXQgYz0xO2M8YS5sZW5ndGg7YysrKXtjb25zdCBkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYVtjXS5wcm90b3R5cGUsYik7aWYodm9pZCAwIT09ZCYmZC52YWx1ZSlyZXR1cm4gZC52YWx1ZX19fSl9fSwkdHlwZUxvb2t1cDp7dmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbD90aGlzLnByb3RvdHlwZVthLiRtYW5nbGVkXTpjLmNhbGwodGhpcyxhKX0sd3JpdGFibGU6ITB9LCRtcm9NZXJnZTp7dmFsdWU6ZnVuY3Rpb24oYSl7dGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsPVxuITA7bGV0IGI7Y29uc3QgYz1bXTtmb3IoOzspe2ZvcihiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBkPWFbYl07aWYoMCE9PWQubGVuZ3RoKWJyZWFrfWlmKGI9PT1hLmxlbmd0aClyZXR1cm4gYzt2YXIgZT1bXTtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWlmKGQ9YVtiXSwwIT09ZC5sZW5ndGgpe2NvbnN0IGI9ZFswXTtkPTA7YTpmb3IoO2Q8YS5sZW5ndGg7KytkKXtjb25zdCBjPWFbZF07Zm9yKGxldCBhPTE7YTxjLmxlbmd0aDsrK2EpaWYoY1thXT09PWIpYnJlYWsgYX1kPT09YS5sZW5ndGgmJmUucHVzaChiKX1pZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiSW5jb25zaXN0ZW50IHByZWNlZGVuY2VzIGluIHR5cGUgaGllcmFyY2h5XCIpO2U9ZVswXTtjLmxlbmd0aCYmdGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoY1tjLmxlbmd0aC0xXS5wcm90b3R5cGUpIT09ZS5wcm90b3R5cGUmJih0aGlzLnByb3RvdHlwZS5zayRwcm90b3R5cGljYWw9XG4hMSk7Yy5wdXNoKGUpO2ZvcihiPTA7YjxhLmxlbmd0aDsrK2IpZD1hW2JdLDA8ZC5sZW5ndGgmJmRbMF09PT1lJiZkLnNwbGljZSgwLDEpfX19LCRidWlsZE1STzp7dmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBhPVtbdGhpc11dLGI9dGhpcy5wcm90b3R5cGUudHAkYmFzZXM7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDsrK2MpYS5wdXNoKFsuLi5iW2NdLnByb3RvdHlwZS50cCRtcm9dKTtjPVtdO2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7KythKWMucHVzaChiW2FdKTthLnB1c2goYyk7cmV0dXJuIHRoaXMuJG1yb01lcmdlKGEpfX0sc2skYXR0ckVycm9yOnt2YWx1ZSgpe3JldHVyblwidHlwZSBvYmplY3QgJ1wiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInXCJ9LHdyaXRhYmxlOiEwfX0pO1NrLmJ1aWx0aW4udHlwZS5wcm90b3R5cGUudHAkZ2V0c2V0cz17X19iYXNlX186eyRnZXQoKXtyZXR1cm4gdGhpcy5wcm90b3R5cGUudHAkYmFzZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19iYXNlc19fOnskZ2V0KCl7dm9pZCAwPT09XG50aGlzLnNrJHR1cGxlX2Jhc2VzJiYodGhpcy5zayR0dXBsZV9iYXNlcz1uZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnByb3RvdHlwZS50cCRiYXNlcykpO3JldHVybiB0aGlzLnNrJHR1cGxlX2Jhc2VzfX0sX19tcm9fXzp7JGdldCgpe3ZvaWQgMD09PXRoaXMuc2skdHVwbGVfbXJvJiYodGhpcy5zayR0dXBsZV9tcm89bmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy5wcm90b3R5cGUudHAkbXJvKSk7cmV0dXJuIHRoaXMuc2skdHVwbGVfbXJvfX0sX19kaWN0X186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5KHRoaXMucHJvdG90eXBlKX19LF9fZG9jX186eyRnZXQoKXtjb25zdCBhPXRoaXMuJHR5cGVMb29rdXAoU2suYnVpbHRpbi5zdHIuJGRvYyk7cmV0dXJuIGE/dm9pZCAwIT09YS50cCRkZXNjcl9nZXQ/dGhpcz09PVNrLmJ1aWx0aW4udHlwZT9uZXcgU2suYnVpbHRpbi5zdHIodGhpcy5wcm90b3R5cGUudHAkZG9jKTphLnRwJGRlc2NyX2dldChudWxsLFxudGhpcyk6dGhpcy5wcm90b3R5cGUuX19kb2NfXzpTay5idWlsdGluLm5vbmUubm9uZSR9LCRzZXQoYSl7bCh0aGlzLGEsU2suYnVpbHRpbi5zdHIuJGRvYyk7dGhpcy5wcm90b3R5cGUuX19kb2NfXz1hfX0sX19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMucHJvdG90eXBlLnRwJG5hbWUpfSwkc2V0KGEpe2wodGhpcyxhLFNrLmJ1aWx0aW4uc3RyLiRuYW1lKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4gb25seSBhc3NpZ24gc3RyaW5nIHRvIFwiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCIuX19uYW1lX18sIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO3RoaXMucHJvdG90eXBlLnRwJG5hbWU9YS4kanNzdHIoKX19LF9fbW9kdWxlX186eyRnZXQoKXtsZXQgYT10aGlzLnByb3RvdHlwZS5fX21vZHVsZV9fO3JldHVybiBhJiZhLm9iJHR5cGUhPT1Tay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yP1xuYTpuZXcgU2suYnVpbHRpbi5zdHIoXCJidWlsdGluc1wiKX0sJHNldChhKXtsKHRoaXMsYSxTay5idWlsdGluLnN0ci4kbW9kdWxlKTt0aGlzLnByb3RvdHlwZS5fX21vZHVsZV9fPWF9fX07U2suYnVpbHRpbi50eXBlLnByb3RvdHlwZS50cCRtZXRob2RzPXttcm86eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kYnVpbGRNUk8oKSl9LCRmbGFnczp7Tm9BcmdzOiEwfX0sX19kaXJfXzp7JG1ldGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2EgaW4gU2sucmVzZXJ2ZWRXb3Jkc198fChhPVNrLnVuZml4UmVzZXJ2ZWQoYSksLTEhPT1hLmluZGV4T2YoXCIkXCIpfHxiLmhhcyhhKXx8KGIuYWRkKGEpLGMucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYSkpKSl9Y29uc3QgYj1uZXcgU2V0LGM9W107aWYodGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsKWZvcih2YXIgZSBpbiB0aGlzLnByb3RvdHlwZSlhKGUpO2Vsc2V7ZT10aGlzLnByb3RvdHlwZS50cCRtcm87Zm9yKGxldCBiPVxuMDtiPGUubGVuZ3RoO2IrKyl7Y29uc3QgYz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlW2JdLnByb3RvdHlwZSk7Zm9yKGxldCBiPTA7YjxjLmxlbmd0aDtiKyspYShjW2JdKX19cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiU3BlY2lhbGl6ZWQgX19kaXJfXyBpbXBsZW1lbnRhdGlvbiBmb3IgdHlwZXMuXCJ9fTtjb25zdCBoPXskZ2V0KCl7Y29uc3QgYT1mKHRoaXMub2IkdHlwZSk7cmV0dXJuIHZvaWQgMCE9PWE/YS50cCRkZXNjcl9nZXQodGhpcyx0aGlzLm9iJHR5cGUpOlNrLmdlbmVyaWMuZ2V0U2V0RGljdC4kZ2V0LmNhbGwodGhpcyl9LCRzZXQoYSl7Y29uc3QgYj1mKHRoaXMub2IkdHlwZSk7cmV0dXJuIHZvaWQgMCE9PWI/Yi50cCRkZXNjcl9zZXQodGhpcyxhKTpTay5nZW5lcmljLmdldFNldERpY3QuJHNldC5jYWxsKHRoaXMsYSl9LCRkb2M6XCJkaWN0aW9uYXJ5IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMgKGlmIGRlZmluZWQpXCIsXG4kbmFtZTpcIl9fZGljdF9fXCJ9fSxmdW5jdGlvbihtLHEpe1NrLmdlbmVyaWM9e307U2suZ2VuZXJpYy5nZXRBdHRyPWZ1bmN0aW9uKGEsYyl7bGV0IGI7Y29uc3QgZT10aGlzLm9iJHR5cGUsZj1lLiR0eXBlTG9va3VwKGEpO2lmKHZvaWQgMCE9PWYmJihiPWYudHAkZGVzY3JfZ2V0LHZvaWQgMCE9PWImJnZvaWQgMCE9PWYudHAkZGVzY3Jfc2V0KSlyZXR1cm4gYi5jYWxsKGYsdGhpcyxlLGMpO2NvbnN0IGw9dGhpcy4kZDtpZih2b2lkIDAhPT1sJiYoYT1sLnF1aWNrJGxvb2t1cChhKSx2b2lkIDAhPT1hKSlyZXR1cm4gYTtpZih2b2lkIDAhPT1iKXJldHVybiBiLmNhbGwoZix0aGlzLGUsYyk7aWYodm9pZCAwIT09ZilyZXR1cm4gZn07U2suZXhwb3J0U3ltYm9sKFwiU2suZ2VuZXJpYy5nZXRBdHRyXCIsU2suZ2VuZXJpYy5nZXRBdHRyKTtTay5nZW5lcmljLnNldEF0dHI9ZnVuY3Rpb24oYSxjLGIpe3ZhciBlPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1lJiZudWxsIT09XG5lKXtjb25zdCBhPWUudHAkZGVzY3Jfc2V0O2lmKGEpcmV0dXJuIGEuY2FsbChlLHRoaXMsYyxiKX1iPXRoaXMuJGQ7aWYodm9pZCAwIT09YilpZihiLm1wJGFzc19zdWJzY3JpcHQpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGIubXAkYXNzX3N1YnNjcmlwdChhLGMpO3RyeXtyZXR1cm4gYi5tcCRhc3Nfc3Vic2NyaXB0KGEpfWNhdGNoKGYpe2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLktleUVycm9yKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnXCIrYS4kanNzdHIoKStcIidcIik7dGhyb3cgZjt9fWVsc2UgaWYoXCJvYmplY3RcIj09PXR5cGVvZiBiKXtlPWEuJG1hbmdsZWQ7aWYodm9pZCAwIT09Yyl7YltlXT1jO3JldHVybn1pZih2b2lkIDAhPT1iW2VdKXtkZWxldGUgYltlXTtyZXR1cm59fXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKHRoaXMuc2skYXR0ckVycm9yKCkrXG5cIiBoYXMgbm8gYXR0cmlidXRlICdcIithLiRqc3N0cigpK1wiJ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmdlbmVyaWMuc2V0QXR0clwiLFNrLmdlbmVyaWMuc2V0QXR0cik7U2suZ2VuZXJpYy5uZXc9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGMsYil7aWYodGhpcy5jb25zdHJ1Y3Rvcj09PWEpcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yO2M9bmV3IHRoaXMuY29uc3RydWN0b3I7YS5jYWxsKGMpO3JldHVybiBjfX07U2suZ2VuZXJpYy5uZXdNZXRob2REZWY9eyRtZXRoKGEsYyl7Y29uc3QgYj10aGlzLnByb3RvdHlwZTtpZigxPmEubGVuZ3RoKXRocm93IGE9Yi50cCRuYW1lLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiLl9fbmV3X18oKTogbm90IGVub3VnaCBhcmd1bWVudHNcIik7dmFyIGU9YS5zaGlmdCgpO2lmKHZvaWQgMD09PWUuc2skdHlwZSl0aHJvdyBhPWIudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIl9fbmV3X18oWCk6IFggaXMgbm90IGEgdHlwZSBvYmplY3QgKFwiK1xuU2suYWJzdHIudHlwZU5hbWUoZSkrXCIpXCIpO2lmKCFlLiRpc1N1YlR5cGUodGhpcykpdGhyb3cgYT1iLnRwJG5hbWUsZT1lLnByb3RvdHlwZS50cCRuYW1lLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiLl9fbmV3X18oXCIrZStcIik6IFwiK2UrXCIgaXMgbm90IGEgc3VidHlwZSBvZiBcIithKTtjb25zdCBmPWUucHJvdG90eXBlLnNrJHN0YXRpY05ldy5wcm90b3R5cGU7aWYoZi50cCRuZXchPT1iLnRwJG5ldyl0aHJvdyBhPWIudHAkbmFtZSxlPWUucHJvdG90eXBlLnRwJG5hbWUsbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIuX19uZXdfXyhcIitlK1wiKSBpcyBub3Qgc2FmZSwgdXNlIFwiK2YudHAkbmFtZStcIi5fX25ld19fKClcIik7cmV0dXJuIGIudHAkbmV3LmNhbGwoZS5wcm90b3R5cGUsYSxjKX0sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6XCIoJHR5cGUsICphcmdzLCAqKmt3YXJncylcIiwkbmFtZTpcIl9fbmV3X19cIn07U2suZ2VuZXJpYy5zZWxmSXRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtcblNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXlDaGVja1NpemU9ZnVuY3Rpb24oKXtpZih0aGlzLiRzZXEubGVuZ3RoIT09dGhpcy4kb3JpZy5nZXQkc2l6ZSgpKXtjb25zdCBhPXRoaXMudHAkbmFtZS5zcGxpdChcIl9cIilbMF07dGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKGErXCIgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb25cIik7fWlmKCEodGhpcy4kaW5kZXg+PXRoaXMuJHNlcS5sZW5ndGgpKXJldHVybiB0aGlzLiRzZXFbdGhpcy4kaW5kZXgrK119O1NrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXk9ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXTt2b2lkIDA9PT1hJiYodGhpcy50cCRpdGVybmV4dD0oKT0+e30pO3JldHVybiBhfTtTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmPXskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJHNlcS5sZW5ndGgtdGhpcy4kaW5kZXgpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfX07U2suZ2VuZXJpYy5pdGVyUmV2ZXJzZUxlbmd0aEhpbnRNZXRob2REZWY9eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy4kaW5kZXgpfSwkZmxhZ3M6e05vQXJnczohMH19O1NrLmdlbmVyaWMuZ2V0U2V0RGljdD17JGdldCgpe3JldHVybiB0aGlzLiRkfSwkc2V0KGEpe2lmKHZvaWQgMD09PWEpdGhpcy4kZD1uZXcgU2suYnVpbHRpbi5kaWN0O2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCl0aGlzLiRkPWE7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2RpY3RfXyBtdXN0IGJlIHNldCB0byBhIGRpY3Rpb25hcnksIG5vdCBhICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fSwkZG9jOlwiZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKVwiLCRuYW1lOlwiX19kaWN0X19cIn07U2suZ2VuZXJpYy5zZXFDb21wYXJlPWZ1bmN0aW9uKGEsXG5jKXtpZih0aGlzPT09YSYmU2subWlzY2V2YWwub3BBbGxvd3NFcXVhbGl0eShjKSlyZXR1cm4hMDtpZighKGEgaW5zdGFuY2VvZiB0aGlzLnNrJGJ1aWx0aW5CYXNlKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7Y29uc3QgYj10aGlzLnY7YT1hLnY7bGV0IGU7aWYoYi5sZW5ndGghPT1hLmxlbmd0aCYmKFwiRXFcIj09PWN8fFwiTm90RXFcIj09PWMpKXJldHVyblwiRXFcIj09PWM/ITE6ITA7Zm9yKGU9MDtlPGIubGVuZ3RoJiZlPGEubGVuZ3RoJiYoYltlXT09PWFbZV18fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiW2VdLGFbZV0sXCJFcVwiKSk7KytlKTtjb25zdCBmPWIubGVuZ3RoLGw9YS5sZW5ndGg7aWYoZT49Znx8ZT49bClzd2l0Y2goYyl7Y2FzZSBcIkx0XCI6cmV0dXJuIGY8bDtjYXNlIFwiTHRFXCI6cmV0dXJuIGY8PWw7Y2FzZSBcIkVxXCI6cmV0dXJuIGY9PT1sO2Nhc2UgXCJOb3RFcVwiOnJldHVybiBmIT09bDtjYXNlIFwiR3RcIjpyZXR1cm4gZj5cbmw7Y2FzZSBcIkd0RVwiOnJldHVybiBmPj1sO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKCl9cmV0dXJuXCJFcVwiPT09Yz8hMTpcIk5vdEVxXCI9PT1jPyEwOlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiW2VdLGFbZV0sYyl9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3M9ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe2M9Yy5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9SW5maW5pdHkpO2YmJi0tYztsJiYtLWM7aWYoYzxifHxjPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChiPT09ZT9hK1wiKCkgdGFrZXMgZXhhY3RseSBcIitiK1wiIGFyZ3VtZW50c1wiOmM8Yj9hK1wiKCkgdGFrZXMgYXQgbGVhc3QgXCIrYitcIiBhcmd1bWVudHNcIjowPGI/YStcIigpIHRha2VzIGF0IG1vc3QgXCIrZStcIiBhcmd1bWVudHNcIjphK1wiKCkgdGFrZXMgbm8gYXJndW1lbnRzXCIpKyhcIiAoXCIrYytcIiBnaXZlbilcIikpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5weUNoZWNrQXJnc1wiLFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3MpO1xuU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbj1mdW5jdGlvbihhLGMsYixlLGYsbCl7dm9pZCAwPT09ZSYmKGU9SW5maW5pdHkpO2YmJi0tYztsJiYtLWM7aWYoYzxifHxjPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChiPT09ZT9hK1wiKCkgdGFrZXMgZXhhY3RseSBcIitiK1wiIGFyZ3VtZW50c1wiOmM8Yj9hK1wiKCkgdGFrZXMgYXQgbGVhc3QgXCIrYitcIiBhcmd1bWVudHNcIjphK1wiKCkgdGFrZXMgYXQgbW9zdCBcIitlK1wiIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2MrXCIgZ2l2ZW4pXCIpKTt9O1NrLmJ1aWx0aW4ucHlDaGVja1R5cGU9ZnVuY3Rpb24oYSxjLGIpe2lmKCFiKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiIG11c3QgYmUgYSBcIitjKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ucHlDaGVja1R5cGVcIixTay5idWlsdGluLnB5Q2hlY2tUeXBlKTtTay5idWlsdGluLmNoZWNrU2VxdWVuY2U9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJnZvaWQgMCE9PWEubXAkc3Vic2NyaXB0fTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZVwiLFNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZSk7U2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hPyExOmEudHAkaXRlcj92b2lkIDAhPT1hLnRwJGl0ZXIoKS50cCRpdGVybmV4dDp2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlXCIsU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKTtTay5idWlsdGluLmNoZWNrQ2FsbGFibGU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJnZvaWQgMCE9PWEudHAkY2FsbH07U2suYnVpbHRpbi5jaGVja051bWJlcj1mdW5jdGlvbihhKXtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGF8fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrTnVtYmVyXCIsXG5Tay5idWlsdGluLmNoZWNrTnVtYmVyKTtTay5idWlsdGluLmNoZWNrQ29tcGxleD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uY29tcGxleH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0NvbXBsZXhcIixTay5idWlsdGluLmNoZWNrQ29tcGxleCk7U2suYnVpbHRpbi5jaGVja0ludD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8XCJudW1iZXJcIj09PXR5cGVvZiBhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrSW50XCIsU2suYnVpbHRpbi5jaGVja0ludCk7U2suYnVpbHRpbi5jaGVja0Zsb2F0PWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF99O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tGbG9hdFwiLFNrLmJ1aWx0aW4uY2hlY2tGbG9hdCk7U2suYnVpbHRpbi5jaGVja1N0cmluZz1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0cn07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja1N0cmluZ1wiLFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcpO1NrLmJ1aWx0aW4uY2hlY2tCeXRlcz1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXN9O1NrLmJ1aWx0aW4uY2hlY2tDbGFzcz1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHlwZX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0NsYXNzXCIsU2suYnVpbHRpbi5jaGVja0NsYXNzKTtTay5idWlsdGluLmNoZWNrQm9vbD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYm9vbH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0Jvb2xcIixTay5idWlsdGluLmNoZWNrQm9vbCk7U2suYnVpbHRpbi5jaGVja05vbmU9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSR9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tOb25lXCIsXG5Tay5idWlsdGluLmNoZWNrTm9uZSk7U2suYnVpbHRpbi5jaGVja0Z1bmN0aW9uPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLnRwJGNhbGx9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvblwiLFNrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbik7U2suYnVpbHRpbi5jaGVja0RhdGFEZXNjcj1mdW5jdGlvbihhKXtyZXR1cm4gYSYmdm9pZCAwIT09YS50cCRkZXNjcl9zZXR9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3JcIixTay5idWlsdGluLmNoZWNrRGF0YURlc2NyKTtTay5idWlsdGluLmNoZWNrQW55U2V0PWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zZXR8fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZyb3plbnNldH07U2suYnVpbHRpbi5jaGVja01hcHBpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3R8fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eXx8XG5udWxsIT1hJiZ2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdCYmdm9pZCAwIT09U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRrZXlzKX19LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIpe3N3aXRjaChiKXtjYXNlIFwiQWRkXCI6cmV0dXJuIGEubmIkYWRkO2Nhc2UgXCJTdWJcIjpyZXR1cm4gYS5uYiRzdWJ0cmFjdDtjYXNlIFwiTXVsdFwiOnJldHVybiBhLm5iJG11bHRpcGx5O2Nhc2UgXCJNYXRNdWx0XCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBhLm5iJG1hdHJpeF9tdWx0aXBseTtjYXNlIFwiRGl2XCI6cmV0dXJuIGEubmIkZGl2aWRlO2Nhc2UgXCJGbG9vckRpdlwiOnJldHVybiBhLm5iJGZsb29yX2RpdmlkZTtjYXNlIFwiTW9kXCI6cmV0dXJuIGEubmIkcmVtYWluZGVyO2Nhc2UgXCJEaXZNb2RcIjpyZXR1cm4gYS5uYiRkaXZtb2Q7Y2FzZSBcIlBvd1wiOnJldHVybiBhLm5iJHBvd2VyO2Nhc2UgXCJMU2hpZnRcIjpyZXR1cm4gYS5uYiRsc2hpZnQ7Y2FzZSBcIlJTaGlmdFwiOnJldHVybiBhLm5iJHJzaGlmdDtcbmNhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRhbmQ7Y2FzZSBcIkJpdFhvclwiOnJldHVybiBhLm5iJHhvcjtjYXNlIFwiQml0T3JcIjpyZXR1cm4gYS5uYiRvcn19ZnVuY3Rpb24gYyhhLGIpe3N3aXRjaChiKXtjYXNlIFwiQWRkXCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX2FkZDtjYXNlIFwiU3ViXCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX3N1YnRyYWN0O2Nhc2UgXCJNdWx0XCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX211bHRpcGx5O2Nhc2UgXCJNYXRNdWx0XCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBhLm5iJHJlZmxlY3RlZF9tYXRyaXhfbXVsdGlwbHk7Y2FzZSBcIkRpdlwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9kaXZpZGU7Y2FzZSBcIkZsb29yRGl2XCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX2Zsb29yX2RpdmlkZTtjYXNlIFwiTW9kXCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX3JlbWFpbmRlcjtjYXNlIFwiRGl2TW9kXCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX2Rpdm1vZDtjYXNlIFwiUG93XCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX3Bvd2VyO1xuY2FzZSBcIkxTaGlmdFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9sc2hpZnQ7Y2FzZSBcIlJTaGlmdFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9yc2hpZnQ7Y2FzZSBcIkJpdEFuZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9hbmQ7Y2FzZSBcIkJpdFhvclwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF94b3I7Y2FzZSBcIkJpdE9yXCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX29yfX1mdW5jdGlvbiBiKGEsYil7c3dpdGNoKGIpe2Nhc2UgXCJBZGRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2FkZDtjYXNlIFwiU3ViXCI6cmV0dXJuIGEubmIkaW5wbGFjZV9zdWJ0cmFjdDtjYXNlIFwiTXVsdFwiOnJldHVybiBhLm5iJGlucGxhY2VfbXVsdGlwbHk7Y2FzZSBcIk1hdE11bHRcIjppZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpcmV0dXJuIGEubmIkaW5wbGFjZV9tYXRyaXhfbXVsdGlwbHk7Y2FzZSBcIkRpdlwiOnJldHVybiBhLm5iJGlucGxhY2VfZGl2aWRlO2Nhc2UgXCJGbG9vckRpdlwiOnJldHVybiBhLm5iJGlucGxhY2VfZmxvb3JfZGl2aWRlO1xuY2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJGlucGxhY2VfcmVtYWluZGVyO2Nhc2UgXCJQb3dcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3Bvd2VyO2Nhc2UgXCJMU2hpZnRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2xzaGlmdDtjYXNlIFwiUlNoaWZ0XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9yc2hpZnQ7Y2FzZSBcIkJpdEFuZFwiOnJldHVybiBhLm5iJGlucGxhY2VfYW5kO2Nhc2UgXCJCaXRPclwiOnJldHVybiBhLm5iJGlucGxhY2Vfb3I7Y2FzZSBcIkJpdFhvclwiOnJldHVybiBhLm5iJGlucGxhY2VfeG9yfX1mdW5jdGlvbiBlKGIsZCxlKXt2YXIgaz1kLmNvbnN0cnVjdG9yLGY9Yi5jb25zdHJ1Y3RvcjtpZihrPWshPT1mJiZ2b2lkIDA9PT1rLnNrJGJhc2VDbGFzcyYmZCBpbnN0YW5jZW9mIGYpaWYoZj1jKGQsZSksdm9pZCAwIT09ZiYmZiE9PWMoYixlKSYmKGY9Zi5jYWxsKGQsYiksZiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSlyZXR1cm4gZjtmPWEoYixlKTtpZih2b2lkIDAhPT1cbmYmJihmPWYuY2FsbChiLGQpLGYhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCl8fCFrJiYoZj1jKGQsZSksdm9pZCAwIT09ZiYmKGY9Zi5jYWxsKGQsYiksZiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSkpcmV0dXJuIGZ9ZnVuY3Rpb24gZihhKXtuLmZvckVhY2goKFtiLGNdKT0+e2FbY109ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHAkcmljaGNvbXBhcmUoYSxiKX19KX1mdW5jdGlvbiBsKGEpe2NvbnN0IGI9U2sucmVmbGVjdGVkTnVtYmVyU2xvdHM7T2JqZWN0LmtleXMoYikuZm9yRWFjaChjPT57aWYodm9pZCAwIT09YVtjXSl7Y29uc3QgZD1iW2NdLGU9ZC5yZWZsZWN0ZWQsZj1hW2VdO3ZvaWQgMCE9PWY/bnVsbD09PWYmJmRlbGV0ZSBhW2VdOmFbZV09ZC5zbG90fHxhW2NdfX0pfWZ1bmN0aW9uIGgoYSl7Y29uc3QgYj1Tay5zZXF1ZW5jZUFuZE1hcHBpbmdTbG90cztPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGM9Plxue3ZvaWQgMCE9PWFbY10mJmJbY10uZm9yRWFjaChiPT57YVtiXT1hW2NdfSl9KX1Tay5hYnN0cj17fTtTay5hYnN0ci50eXBlTmFtZT1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmdm9pZCAwIT09YS50cCRuYW1lP2EudHAkbmFtZTpcIjxpbnZhbGlkIHR5cGU+XCJ9O2NvbnN0IGQ9e0FkZDpcIitcIixTdWI6XCItXCIsTXVsdDpcIipcIixNYXRNdWx0OlwiQFwiLERpdjpcIi9cIixGbG9vckRpdjpcIi8vXCIsTW9kOlwiJVwiLERpdk1vZDpcImRpdm1vZCgpXCIsUG93OlwiKiogb3IgcG93KClcIixMU2hpZnQ6XCI8PFwiLFJTaGlmdDpcIj4+XCIsQml0QW5kOlwiJlwiLEJpdFhvcjpcIl5cIixCaXRPcjpcInxcIn0sZz17VUFkZDpcIitcIixVU3ViOlwiLVwiLEludmVydDpcIn5cIn07U2suYWJzdHIubnVtYmVyQmluT3A9ZnVuY3Rpb24oYSxiLGMpe3ZhciBmO2lmKCEoZj1lKGEsYixjKSkpdGhyb3cgYT1Tay5hYnN0ci50eXBlTmFtZShhKSxiPVNrLmFic3RyLnR5cGVOYW1lKGIpLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgXCIrXG5kW2NdK1wiOiAnXCIrYStcIicgYW5kICdcIitiK1wiJ1wiKTtyZXR1cm4gZn07U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIubnVtYmVyQmluT3BcIixTay5hYnN0ci5udW1iZXJCaW5PcCk7U2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wPWZ1bmN0aW9uKGEsYyxmKXthOnt2YXIgaz1iKGEsZik7aWYodm9pZCAwIT09ayYmKGs9ay5jYWxsKGEsYyksayE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSlicmVhayBhO2s9ZShhLGMsZil9aWYoIWspdGhyb3cgYT1Tay5hYnN0ci50eXBlTmFtZShhKSxjPVNrLmFic3RyLnR5cGVOYW1lKGMpLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgXCIrZFtmXStcIj06ICdcIithK1wiJyBhbmQgJ1wiK2MrXCInXCIpO3JldHVybiBrfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3BcIixTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3ApO1NrLmFic3RyLm51bWJlclVuYXJ5T3A9XG5mdW5jdGlvbihhLGIpe2lmKFwiTm90XCI9PT1iKXJldHVybiBTay5taXNjZXZhbC5pc1RydWUoYSk/U2suYnVpbHRpbi5ib29sLmZhbHNlJDpTay5idWlsdGluLmJvb2wudHJ1ZSQ7Yjp7c3dpdGNoKGIpe2Nhc2UgXCJVU3ViXCI6dmFyIGM9YS5uYiRuZWdhdGl2ZTticmVhayBiO2Nhc2UgXCJVQWRkXCI6Yz1hLm5iJHBvc2l0aXZlO2JyZWFrIGI7Y2FzZSBcIkludmVydFwiOmM9YS5uYiRpbnZlcnQ7YnJlYWsgYn1jPXZvaWQgMH1jPXZvaWQgMCE9PWM/Yy5jYWxsKGEpOnZvaWQgMDtpZighYyl0aHJvdyBhPVNrLmFic3RyLnR5cGVOYW1lKGEpLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IFwiK2dbYl0rXCI6ICdcIithK1wiJ1wiKTtyZXR1cm4gY307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIubnVtYmVyVW5hcnlPcFwiLFNrLmFic3RyLm51bWJlclVuYXJ5T3ApO1NrLmFic3RyLmZpeFNlcUluZGV4Xz1mdW5jdGlvbihhLGIpe2I9U2suYnVpbHRpbi5hc251bSQoYik7XG4wPmImJmEuc3EkbGVuZ3RoJiYoYis9YS5zcSRsZW5ndGgoKSk7cmV0dXJuIGJ9O1NrLmFic3RyLnNlcXVlbmNlQ29udGFpbnM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEuc3EkY29udGFpbnMpcmV0dXJuIGEuc3EkY29udGFpbnMoYixjKTthPVNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLGIsXCJFcVwiKT9uZXcgU2subWlzY2V2YWwuQnJlYWsoITApOiExfSwhMSk7cmV0dXJuIGM/YTpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYSl9O1NrLmFic3RyLnNlcXVlbmNlQ29uY2F0PWZ1bmN0aW9uKGEsYil7aWYoYS5zcSRjb25jYXQpcmV0dXJuIGEuc3EkY29uY2F0KGIpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZFwiKTt9O1NrLmFic3RyLnNlcXVlbmNlR2V0SW5kZXhPZj1cbmZ1bmN0aW9uKGEsYil7aWYoYS5pbmRleClyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuaW5kZXgsW2EsYl0pO2xldCBjPTA7Zm9yKGxldCBkPVNrLmFic3RyLml0ZXIoYSksZT1kLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZTtlPWQudHAkaXRlcm5leHQoKSl7aWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsZSxcIkVxXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpO2MrPTF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInNlcXVlbmNlLmluZGV4KHgpOiB4IG5vdCBpbiBzZXF1ZW5jZVwiKTt9O1NrLmFic3RyLnNlcXVlbmNlR2V0Q291bnRPZj1mdW5jdGlvbihhLGIpe2lmKGEuY291bnQpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmNvdW50LFthLGJdKTtsZXQgYz0wO2ZvcihsZXQgZD1Tay5hYnN0ci5pdGVyKGEpLGU9ZC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWU7ZT1kLnRwJGl0ZXJuZXh0KCkpU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsXG5lLFwiRXFcIikmJihjKz0xKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKX07U2suYWJzdHIuc2VxdWVuY2VHZXRJdGVtPWZ1bmN0aW9uKGEsYixjKXtcIm51bWJlclwiPT09dHlwZW9mIGImJihiPW5ldyBTay5idWlsdGluLmludF8oYikpO3JldHVybiBTay5hYnN0ci5vYmplY3RHZXRJdGVtKGEsYixjKX07U2suYWJzdHIuc2VxdWVuY2VTZXRJdGVtPWZ1bmN0aW9uKGEsYixjLGQpe1wibnVtYmVyXCI9PT10eXBlb2YgYiYmKGI9bmV3IFNrLmJ1aWx0aW4uaW50XyhiKSk7cmV0dXJuIFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYSxiLGMsZCl9O1NrLmFic3RyLnNlcXVlbmNlRGVsSXRlbT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIFNrLmFic3RyLm9iamVjdERlbEl0ZW0oYSxiLGMpfTtTay5hYnN0ci5zZXF1ZW5jZUdldFNsaWNlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGIsYykpfTtTay5hYnN0ci5zZXF1ZW5jZURlbFNsaWNlPVxuZnVuY3Rpb24oYSxiLGMpe3JldHVybiBTay5hYnN0ci5vYmplY3REZWxJdGVtKGEsbmV3IFNrLmJ1aWx0aW4uc2xpY2UoYixjKSl9O1NrLmFic3RyLnNlcXVlbmNlU2V0U2xpY2U9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5zbGljZShiLGMpKX07U2suYWJzdHIuc2VxdWVuY2VVbnBhY2s9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW5ub3QgdW5wYWNrIG5vbi1pdGVyYWJsZSBcIitTay5hYnN0ci50eXBlTmFtZShhKStcIiBvYmplY3RcIik7Y29uc3QgZT1Tay5hYnN0ci5pdGVyKGEpLGY9W107bGV0IGs9MCxnOzA8YiYmKGc9U2subWlzY2V2YWwuaXRlckZvcihlLGE9PntmLnB1c2goYSk7aWYoKytrPT09YilyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrfSkpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihnLFxuKCk9PntpZihmLmxlbmd0aDxiKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJub3QgZW5vdWdoIHZhbHVlcyB0byB1bnBhY2sgKGV4cGVjdGVkIGF0IGxlYXN0IFwiK2MrXCIsIGdvdCBcIitmLmxlbmd0aCtcIilcIik7aWYoIWQpcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGUudHAkaXRlcm5leHQoITApLGE9PntpZih2b2lkIDAhPT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJ0b28gbWFueSB2YWx1ZXMgdG8gdW5wYWNrIChleHBlY3RlZCBcIitiK1wiKVwiKTtyZXR1cm4gZn0pO2NvbnN0IGE9W107cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoZSxiPT57YS5wdXNoKGIpfSksKCk9Pntjb25zdCBkPWEubGVuZ3RoK2ItYztpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5vdCBlbm91Z2ggdmFsdWVzIHRvIHVucGFjayAoZXhwZWN0ZWQgYXQgbGVhc3QgXCIrYytcIiwgZ290IFwiKyhjK2QpK1wiKVwiKTtmLnB1c2gobmV3IFNrLmJ1aWx0aW4ubGlzdChhLnNsaWNlKDAsXG5kKSkpO2YucHVzaCguLi5hLnNsaWNlKGQpKTtyZXR1cm4gZn0pfSl9O1NrLmFic3RyLm1hcHBpbmdVbnBhY2tJbnRvS2V5d29yZEFycmF5PWZ1bmN0aW9uKGEsYixjKXtpZihiIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KWIuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsZF0pPT57aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChjLiRxdWFsbmFtZT9jLiRxdWFsbmFtZStcIigpIFwiOlwiXCIpK1wia2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzXCIpO2EucHVzaChiLnYpO2EucHVzaChkKX0pO2Vsc2V7dmFyIGQ9U2suYWJzdHIubG9va3VwU3BlY2lhbChiLFNrLmJ1aWx0aW4uc3RyLiRrZXlzKTtpZih2b2lkIDA9PT1kKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIk9iamVjdCBpcyBub3QgYSBtYXBwaW5nXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCksZD0+U2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGQpLFxuZD0+e2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYy4kcXVhbG5hbWU/Yy4kcXVhbG5hbWUrXCIoKSBcIjpcIlwiKStcImtleXdvcmRzIG11c3QgYmUgc3RyaW5nc1wiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYi5tcCRzdWJzY3JpcHQoZCwhMCksYj0+e2EucHVzaChkLnYpO2EucHVzaChiKX0pfSkpfX07U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3M9ZnVuY3Rpb24oYSxiLGMsZCxlKXtkPWR8fFtdO3ZhciBmPWMubGVuZ3RoK2QubGVuZ3RoLzI7aWYoZj5iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGV4cGVjdGVkIGF0IG1vc3QgXCIrYi5sZW5ndGgrXCIgYXJndW1lbnRzIChcIitmK1wiIGdpdmVuKVwiKTtpZihkLmxlbmd0aHx8dm9pZCAwIT09ZSl7aWYoZj09PWIubGVuZ3RoJiYhZC5sZW5ndGgpcmV0dXJuIGM7aWYoMD09PWYmJmIubGVuZ3RoPT09KGUmJmUubGVuZ3RoKSlyZXR1cm4gZX1lbHNlIHJldHVybiBjO1xuYz1jLnNsaWNlKDApO2ZvcihmPTA7ZjxkLmxlbmd0aDtmKz0yKXtjb25zdCBlPWRbZl0saz1kW2YrMV0sZz1iLmluZGV4T2YoZSk7aWYoMDw9Zyl7aWYodm9pZCAwIT09Y1tnXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGFyZ3VtZW50ICdcIitlK1wiJ1wiKTtjW2ddPWt9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJ1wiK2UrXCInXCIpO31pZihlKXtkPWIubGVuZ3RoO2ZvcihmPWQtMTswPD1mO2YtLSl2b2lkIDA9PT1jW2ZdJiYoY1tmXT1lW2UubGVuZ3RoLTEtKGQtMS1mKV0pO2I9Yi5maWx0ZXIoKGEsYik9PnZvaWQgMD09PWNbYl0pO2lmKGIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgbWlzc2luZyBcIitiLmxlbmd0aCtcIiByZXF1aXJlZCBwb3NpdGlvbmFsIGFyZ3VtZW50czogXCIrYi5qb2luKFwiLCBcIikpO1xufXJldHVybiBjfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJnc1wiLFNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKTtTay5hYnN0ci5jaGVja05vS3dhcmdzPWZ1bmN0aW9uKGEsYil7aWYoYiYmYi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50c1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3NcIixTay5hYnN0ci5jaGVja05vS3dhcmdzKTtTay5hYnN0ci5jaGVja05vQXJncz1mdW5jdGlvbihhLGIsYyl7aWYoYj1iLmxlbmd0aCsoYz9jLmxlbmd0aDowKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIHRha2VzIG5vIGFyZ3VtZW50cyAoXCIrYitcIiBnaXZlbilcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja05vQXJnc1wiLFNrLmFic3RyLmNoZWNrTm9BcmdzKTtTay5hYnN0ci5jaGVja09uZUFyZz1cbmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKGEsYyk7aWYoMSE9PWIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKFwiK2IubGVuZ3RoK1wiIGdpdmVuKVwiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmNoZWNrT25lQXJnXCIsU2suYWJzdHIuY2hlY2tPbmVBcmcpO1NrLmFic3RyLmNoZWNrQXJnc0xlbj1mdW5jdGlvbihhLGIsYyxkKXtiPWIubGVuZ3RoO3ZvaWQgMD09PWQmJihkPUluZmluaXR5KTtpZihiPGN8fGI+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoKGM9PT1kP2ErXCIoKSB0YWtlcyBleGFjdGx5IFwiK2MrXCIgYXJndW1lbnRzXCI6YjxjP2ErXCIoKSB0YWtlcyBhdCBsZWFzdCBcIitjK1wiIGFyZ3VtZW50c1wiOmErXCIoKSB0YWtlcyBhdCBtb3N0IFwiK2QrXCIgYXJndW1lbnRzXCIpKyhcIiAoXCIrYitcIiBnaXZlbilcIikpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY2hlY2tBcmdzTGVuXCIsXG5Tay5hYnN0ci5jaGVja0FyZ3NMZW4pO1NrLmFic3RyLm9iamVjdEZvcm1hdD1mdW5jdGlvbihhLGIpe2E9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRmb3JtYXQpO2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW2JdKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2Zvcm1hdF9fIG11c3QgcmV0dXJuIGEgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYikpO3JldHVybiBifTtTay5hYnN0ci5vYmplY3RIYXNoPWZ1bmN0aW9uKGEpe2NvbnN0IGI9YS50cCRoYXNoO2lmKHZvaWQgMCE9PWIpe2lmKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuaGFzaGFibGUgdHlwZTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTtyZXR1cm4gYS50cCRoYXNoKCl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgSmF2YXNjcmlwdCB0eXBlXCIpO1xufTtTay5hYnN0ci5vYmplY3RBZGQ9ZnVuY3Rpb24oYSxiKXtpZihhLm5iJGFkZClyZXR1cm4gYS5uYiRhZGQoYik7YT1Tay5hYnN0ci50eXBlTmFtZShhKTtiPVNrLmFic3RyLnR5cGVOYW1lKGIpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgKzogJ1wiK2ErXCInIGFuZCAnXCIrYitcIidcIik7fTtTay5hYnN0ci5vYmplY3ROZWdhdGl2ZT1mdW5jdGlvbihhKXtpZihhLm5iJG5lZ2F0aXZlKXJldHVybiBhLm5iJG5lZ2F0aXZlKCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgLTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt9O1NrLmFic3RyLm9iamVjdFBvc2l0aXZlPWZ1bmN0aW9uKGEpe2lmKGEubmIkcG9zaXRpdmUpcmV0dXJuIGEubmIkcG9zaXRpdmUoKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSArOiAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fTtTay5hYnN0ci5vYmplY3REZWxJdGVtPWZ1bmN0aW9uKGEsYixjKXtpZihhLm1wJGFzc19zdWJzY3JpcHQpcmV0dXJuIGEubXAkYXNzX3N1YnNjcmlwdChiLHZvaWQgMCxjKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb25cIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5vYmplY3REZWxJdGVtXCIsU2suYWJzdHIub2JqZWN0RGVsSXRlbSk7U2suYWJzdHIub2JqZWN0R2V0SXRlbT1mdW5jdGlvbihhLGIsYyl7aWYoYS5tcCRzdWJzY3JpcHQpcmV0dXJuIGEubXAkc3Vic2NyaXB0KGIsYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBkb2VzIG5vdCBzdXBwb3J0IGluZGV4aW5nXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIub2JqZWN0R2V0SXRlbVwiLFxuU2suYWJzdHIub2JqZWN0R2V0SXRlbSk7U2suYWJzdHIub2JqZWN0U2V0SXRlbT1mdW5jdGlvbihhLGIsYyxkKXtpZihhLm1wJGFzc19zdWJzY3JpcHQpcmV0dXJuIGEubXAkYXNzX3N1YnNjcmlwdChiLGMsZCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudFwiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm9iamVjdFNldEl0ZW1cIixTay5hYnN0ci5vYmplY3RTZXRJdGVtKTtTay5hYnN0ci5nYXR0cj1mdW5jdGlvbihhLGIsYyl7Yz1hLnRwJGdldGF0dHIoYixjKTtpZih2b2lkIDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEuc2skYXR0ckVycm9yKCkrXCIgaGFzIG5vIGF0dHJpYnV0ZSAnXCIrYi4kanNzdHIoKStcIidcIik7cmV0dXJuIGMuJGlzU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5jaGFpbihjLGZ1bmN0aW9uKGMpe2lmKHZvaWQgMD09PVxuYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihhLnNrJGF0dHJFcnJvcigpK1wiIGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2IuJGpzc3RyKCkrXCInXCIpO3JldHVybiBjfSk6Y307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuZ2F0dHJcIixTay5hYnN0ci5nYXR0cik7U2suYWJzdHIuc2F0dHI9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEudHAkc2V0YXR0cihiLGMsZCl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLnNhdHRyXCIsU2suYWJzdHIuc2F0dHIpO1NrLmFic3RyLml0ZXJuZXh0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEudHAkaXRlcm5leHQoYil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLml0ZXJuZXh0XCIsU2suYWJzdHIuaXRlcm5leHQpO1NrLmFic3RyLml0ZXI9ZnVuY3Rpb24oYSl7aWYoYS50cCRpdGVyKXthPWEudHAkaXRlcigpO2lmKGEudHAkaXRlcm5leHQpcmV0dXJuIGE7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaXRlcigpIHJldHVybmVkIG5vbi1pdGVyYXRvciBvZiB0eXBlICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt9aWYoYS5tcCRzdWJzY3JpcHQpcmV0dXJuIG5ldyBTay5idWlsdGluLnNlcV9pdGVyXyhhKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5pdGVyXCIsU2suYWJzdHIuaXRlcik7U2suYWJzdHIubG9va3VwU3BlY2lhbD1mdW5jdGlvbihhLGIpe3ZhciBjPWEub2IkdHlwZTtpZih2b2lkIDA9PT1jKVNrLmFzc2VydHMuZmFpbChcImphdmFzY3JpcHQgb2JqZWN0IHNlbnQgdG8gbG9va3VwU3BlY2lhbFwiKTtlbHNlIGlmKGI9Yy4kdHlwZUxvb2t1cChiKSx2b2lkIDAhPT1iKXJldHVybiB2b2lkIDAhPT1iLnRwJGRlc2NyX2dldCYmKGI9Yi50cCRkZXNjcl9nZXQoYSxjKSksYn07U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIubG9va3VwU3BlY2lhbFwiLFNrLmFic3RyLmxvb2t1cFNwZWNpYWwpO1xuU2suYWJzdHIudHlwZUxvb2t1cD1mdW5jdGlvbihhLGIpe2I9YS4kdHlwZUxvb2t1cChiKTtyZXR1cm4gdm9pZCAwIT09YiYmYi50cCRkZXNjcl9nZXQ/Yi50cCRkZXNjcl9nZXQobnVsbCxhKTpifTtTay5hYnN0ci5tYXJrVW5oYXNoYWJsZT1mdW5jdGlvbihhKXthPWEucHJvdG90eXBlO2EuX19oYXNoX189U2suYnVpbHRpbi5ub25lLm5vbmUkO2EudHAkaGFzaD1Tay5idWlsdGluLm5vbmUubm9uZSR9O1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2U9ZnVuY3Rpb24oYSxiLGMsZCl7ZD1kfHxTay5idWlsdGluLnR5cGU7Yz12b2lkIDA9PT1jP1NrLmJ1aWx0aW4ub2JqZWN0OmM7Y29uc3QgZT1udWxsIT09Yz9jLnByb3RvdHlwZTpudWxsO09iamVjdC5zZXRQcm90b3R5cGVPZihiLGQucHJvdG90eXBlKTtPYmplY3Quc2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUsZSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYi5wcm90b3R5cGUse3NrJG9iamVjdDp7dmFsdWU6Yix3cml0YWJsZTohMH0sXG5vYiR0eXBlOnt2YWx1ZTpiLHdyaXRhYmxlOiEwfSx0cCRuYW1lOnt2YWx1ZTphLHdyaXRhYmxlOiEwfSx0cCRiYXNlOnt2YWx1ZTpjLHdyaXRhYmxlOiEwfX0pfTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm89ZnVuY3Rpb24oYSl7bGV0IGI9YS5wcm90b3R5cGUudHAkYmFzZTtjb25zdCBjPW51bGw9PT1iP1tdOltiXTtpZihiPT09U2suYnVpbHRpbi5vYmplY3R8fG51bGw9PT1iKU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwic2skYmFzZUNsYXNzXCIse3ZhbHVlOiEwLHdyaXRhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEucHJvdG90eXBlLFwic2skYnVpbHRpbkJhc2VcIix7dmFsdWU6YSx3cml0YWJsZTohMH0pO2NvbnN0IGQ9W2FdO2Zvcig7bnVsbCE9PWI7KWQucHVzaChiKSxiPWIucHJvdG90eXBlLnRwJGJhc2U7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYS5wcm90b3R5cGUse3NrJHByb3RvdHlwaWNhbDp7dmFsdWU6ITAsd3JpdGFibGU6ITB9LHRwJGJhc2VzOnt2YWx1ZTpjLFxud3JpdGFibGU6ITB9LHRwJG1ybzp7dmFsdWU6ZCx3cml0YWJsZTohMH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxcIiR0eXBlTG9va3VwXCIse3ZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZVthLiRtYW5nbGVkXX0sd3JpdGFibGU6ITB9KX07U2suYWJzdHIuc2V0VXBHZXRTZXRzPWZ1bmN0aW9uKGEsYil7aWYodm9pZCAwIT09U2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcil7dmFyIGM9YS5wcm90b3R5cGU7Yj1ifHxjLnRwJGdldHNldHN8fHt9O09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtiLGRdKT0+e2QuJG5hbWU9YjtjW2JdPW5ldyBTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yKGEsZCl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxcInRwJGdldHNldHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07U2suYWJzdHIuc2V0VXBNZXRob2RzPWZ1bmN0aW9uKGEsYil7aWYodm9pZCAwIT09U2suYnVpbHRpbi5tZXRob2RfZGVzY3JpcHRvcil7dmFyIGM9XG5hLnByb3RvdHlwZTtiPWJ8fGMudHAkbWV0aG9kc3x8e307T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2IsZF0pPT57ZC4kbmFtZT1iO2NbYl09bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IoYSxkKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwidHAkbWV0aG9kc1wiLHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSl9fTtTay5hYnN0ci5zZXRVcENsYXNzTWV0aG9kcz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcil7dmFyIGM9YS5wcm90b3R5cGU7Yj1ifHxjLnRwJGNsYXNzbWV0aG9kc3x8e307T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2IsZF0pPT57ZC4kbmFtZT1iO2NbYl09bmV3IFNrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcihhLGQpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsXCJ0cCRjbGFzc21ldGhvZHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07Y29uc3Qgbj1PYmplY3QuZW50cmllcyh7RXE6XCJvYiRlcVwiLFxuTm90RXE6XCJvYiRuZVwiLEd0Olwib2IkZ3RcIixHdEU6XCJvYiRnZVwiLEx0Olwib2IkbHRcIixMdEU6XCJvYiRsZVwifSk7U2suYWJzdHIuc2V0VXBTbG90cz1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYixjKXtlW2JdPW5ldyBTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcihhLFNrLnNsb3RzW2JdLGMpfWZ1bmN0aW9uIGQoYSxiKXtcInN0cmluZ1wiPT09dHlwZW9mIGE/YyhhLGIpOmEuZm9yRWFjaChhPT57YyhhLGIpfSl9aWYodm9pZCAwIT09U2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3Ipe3ZhciBlPWEucHJvdG90eXBlO2I9Ynx8ZS50cCRzbG90c3x8e307Yi50cCRuZXc9PT1Tay5nZW5lcmljLm5ldyYmKGIudHAkbmV3PVNrLmdlbmVyaWMubmV3KGEpKTtiLnRwJHJpY2hjb21wYXJlJiZmKGIpO2IudHAkYXNfbnVtYmVyJiZsKGIpO2IudHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZyYmaChiKTtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbYSxiXSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcbmEse3ZhbHVlOmIsd3JpdGFibGU6ITB9KX0pO2IudHAkbmV3JiYoZS5fX25ld19fPW5ldyBTay5idWlsdGluLnNrX21ldGhvZChTay5nZW5lcmljLm5ld01ldGhvZERlZixhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInNrJHN0YXRpY05ld1wiLHt2YWx1ZTphLHdyaXRhYmxlOiEwfSkpO1NrLnN1YlNsb3RzLm1haW5fc2xvdHMuZm9yRWFjaCgoW2EsY10pPT57YT1iW2FdO3ZvaWQgMCE9PWEmJmQoYyxhKX0pO3ZhciBnPWIudHAkaGFzaDt2b2lkIDAhPT1nJiYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGc/YyhcIl9faGFzaF9fXCIsZyk6Zz09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9lLl9faGFzaF9fPWc6U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCB0cCRoYXNoXCIpKTtiLnRwJGFzX251bWJlciYmU2suc3ViU2xvdHMubnVtYmVyX3Nsb3RzLmZvckVhY2goKFthLGNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTtiLnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmcmJlNrLnN1YlNsb3RzLnNlcXVlbmNlX2FuZF9tYXBwaW5nX3Nsb3RzLmZvckVhY2goKFthLFxuY10pPT57YT1iW2FdO3ZvaWQgMCE9PWEmJmQoYyxhKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwidHAkc2xvdHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcz1mdW5jdGlvbihhLGIpe2I9Ynx8e307U2suYXNzZXJ0cy5hc3NlcnQoYi5oYXNPd25Qcm9wZXJ0eShcImNvbnN0cnVjdG9yXCIpLFwiQSBjb25zdHJ1Y3RvciBpcyByZXF1aXJlZCB0byBidWlsZCBhIG5hdGl2ZSBjbGFzc1wiKTtsZXQgYz1iLmNvbnN0cnVjdG9yO2lmKGEuaW5jbHVkZXMoXCIuXCIpKXt2YXIgZD1hLnNwbGl0KFwiLlwiKTthPWQucG9wKCk7ZD1kLmpvaW4oXCIuXCIpfVNrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoYSxjLGIuYmFzZSxiLm1ldGEpO1NrLmFic3RyLnNldFVwQnVpbHRpbk1ybyhjKTtjb25zdCBlPWMucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUse3RwJHNsb3RzOnt2YWx1ZTpiLnNsb3RzLHdyaXRhYmxlOiEwfSx0cCRnZXRzZXRzOnt2YWx1ZTpiLmdldHNldHMsXG53cml0YWJsZTohMH0sdHAkbWV0aG9kczp7dmFsdWU6Yi5tZXRob2RzLHdyaXRhYmxlOiEwfSx0cCRjbGFzc21ldGhvZHM6e3ZhbHVlOmIuY2xhc3NtZXRob2RzLHdyaXRhYmxlOiEwfX0pO1NrLmFic3RyLnNldFVwU2xvdHMoYyxiLnNsb3RzfHx7fSk7U2suYWJzdHIuc2V0VXBNZXRob2RzKGMsYi5tZXRob2RzKTtTay5hYnN0ci5zZXRVcEdldFNldHMoYyxiLmdldHNldHMpO1NrLmFic3RyLnNldFVwQ2xhc3NNZXRob2RzKGMsYi5jbGFzc21ldGhvZHMpO3ZvaWQgMCE9PWQmJihlLl9fbW9kdWxlX189bmV3IFNrLmJ1aWx0aW4uc3RyKGQpKTtPYmplY3QuZW50cmllcyhiLnByb3RvfHx7fSkuZm9yRWFjaCgoW2EsYl0pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsYSx7dmFsdWU6Yix3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEoYS5pbmNsdWRlcyhcIiRcIil8fGEgaW4gT2JqZWN0LnByb3RvdHlwZSl9KX0pO09iamVjdC5lbnRyaWVzKGIuZmxhZ3N8fHt9KS5mb3JFYWNoKChbYSxiXSk9Plxue09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLGEse3ZhbHVlOmIsd3JpdGFibGU6ITB9KX0pO3ZvaWQgMCE9PVNrLmJ1aWx0aW4uc3RyJiZlLmhhc093blByb3BlcnR5KFwidHAkZG9jXCIpJiYhZS5oYXNPd25Qcm9wZXJ0eShcIl9fZG9jX19cIikmJihhPWUudHAkZG9jfHxudWxsLGUuX19kb2NfXz1cInN0cmluZ1wiPT09dHlwZW9mIGE/bmV3IFNrLmJ1aWx0aW4uc3RyKGEpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7cmV0dXJuIGN9O1NrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcz1mdW5jdGlvbihhLGIpe1NrLmFzc2VydHMuYXNzZXJ0KGIuaGFzT3duUHJvcGVydHkoXCJjb25zdHJ1Y3RvclwiKSxcIm11c3QgcHJvdmlkZSBhIGNvbnN0cnVjdG9yXCIpO2Iuc2xvdHM9Yi5zbG90c3x8e307Yi5zbG90cy50cCRpdGVyPVNrLmdlbmVyaWMuc2VsZkl0ZXI7Yi5zbG90cy50cCRpdGVybmV4dD1iLnNsb3RzLnRwJGl0ZXJuZXh0fHxiLml0ZXJuZXh0O2Iuc2xvdHMudHAkZ2V0YXR0cj1iLnNsb3RzLnRwJGdldGF0dHJ8fFxuU2suZ2VuZXJpYy5nZXRBdHRyO2E9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhhLGIpO1NrLmFic3RyLmJ1aWx0JGl0ZXJhdG9ycy5wdXNoKGEpO3JldHVybiBhfTtTay5hYnN0ci5idWlsdCRpdGVyYXRvcnM9W107U2suYWJzdHIuc2V0VXBNb2R1bGVNZXRob2RzPWZ1bmN0aW9uKGEsYixjKXtPYmplY3QuZW50cmllcyhjKS5mb3JFYWNoKChbYyxkXSk9PntkLiRuYW1lPWQuJG5hbWV8fGM7YltjXT1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoZCxudWxsLGEpfSl9O1NrLmFic3RyLnN1cGVyQ29uc3RydWN0b3I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKTthLnByb3RvdHlwZS50cCRiYXNlLmFwcGx5KGIsZCl9fSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9bmV3IE1hcDtTay5idWlsdGluLm9iamVjdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwib2JqZWN0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mXG5Tay5idWlsdGluLm9iamVjdCxcImJhZCBjYWxsIHRvIG9iamVjdCwgdXNlICduZXcnXCIpfSxiYXNlOm51bGwsc2xvdHM6e3RwJG5ldyhhLGIpe2lmKGEubGVuZ3RofHxiJiZiLmxlbmd0aCl7aWYodGhpcy50cCRuZXchPT1Tay5idWlsdGluLm9iamVjdC5wcm90b3R5cGUudHAkbmV3KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9iamVjdC5fX25ld19fKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSB0eXBlIHRvIGluc3RhbnRpYXRlKVwiKTtpZih0aGlzLnRwJGluaXQ9PT1Tay5idWlsdGluLm9iamVjdC5wcm90b3R5cGUudHAkaW5pdCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIoKSB0YWtlcyBubyBhcmd1bWVudHNcIik7fXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcn0sdHAkaW5pdChhLGIpe2lmKGEubGVuZ3RofHxiJiZiLmxlbmd0aCl7aWYodGhpcy50cCRpbml0IT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJGluaXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib2JqZWN0Ll9faW5pdF9fKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSBpbnN0YW5jZSB0byBpbml0aWFsaXplKVwiKTtcbmlmKHRoaXMudHAkbmV3PT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJG5ldyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIuX19pbml0X18oKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAodGhlIGluc3RhbmNlIHRvIGluaXRpYWxpemUpXCIpO319LHRwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJHNldGF0dHI6U2suZ2VuZXJpYy5zZXRBdHRyLCRyKCl7Y29uc3QgYT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKHRoaXMsU2suYnVpbHRpbi5zdHIuJG1vZHVsZSk7bGV0IGI9XCJcIjthJiZTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpJiYoYj1hLnYrXCIuXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8XCIrYitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIiBvYmplY3Q+XCIpfSx0cCRzdHIoKXtyZXR1cm4gdGhpcy4kcigpfSx0cCRoYXNoKCl7bGV0IGM9YS5nZXQodGhpcyk7aWYodm9pZCAwIT09YylyZXR1cm4gYztcbmM9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSLU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLzIpO2Euc2V0KHRoaXMsYyk7cmV0dXJuIGN9LHRwJHJpY2hjb21wYXJlKGEsYil7c3dpdGNoKGIpe2Nhc2UgXCJFcVwiOmE9dGhpcz09PWF8fFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2JyZWFrO2Nhc2UgXCJOb3RFcVwiOmE9dGhpcy50cCRyaWNoY29tcGFyZShhLFwiRXFcIik7YSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkJiYoYT0hU2subWlzY2V2YWwuaXNUcnVlKGEpKTticmVhaztkZWZhdWx0OmE9U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9cmV0dXJuIGF9LHRwJGRvYzpcIlRoZSBtb3N0IGJhc2UgdHlwZVwifSxnZXRzZXRzOntfX2NsYXNzX186eyRnZXQoKXtyZXR1cm4gdGhpcy5vYiR0eXBlfSwkc2V0KGEpe2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgZGVsZXRlIF9fY2xhc3NfXyBhdHRyaWJ1dGVcIik7XG5pZighU2suYnVpbHRpbi5jaGVja0NsYXNzKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fY2xhc3NfXyBtdXN0IGJlIHNldCB0byBhIGNsYXNzLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3RcIik7Y29uc3QgYj10aGlzLm9iJHR5cGU7aWYoIShiLiRpc1N1YlR5cGUoU2suYnVpbHRpbi5tb2R1bGUpJiZhLiRpc1N1YlR5cGUoU2suYnVpbHRpbi5tb2R1bGUpfHx2b2lkIDAhPT1iLnNrJGtsYXNzJiZ2b2lkIDAhPT1hLnNrJGtsYXNzKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCIgX19jbGFzc19fIGFzc2lnbm1lbnQgb25seSBzdXBwb3J0ZWQgZm9yIGhlYXAgdHlwZXMgb3IgTW9kdWxlVHlwZSBzdWJjbGFzc2VzXCIpO2lmKGEucHJvdG90eXBlLnNrJGJ1aWx0aW5CYXNlIT09dGhpcy5zayRidWlsdGluQmFzZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2NsYXNzX18gYXNzaWdubWVudDogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1xuXCInIG9iamVjdCBsYXlvdXQgZGlmZmVycyBmcm9tICdcIithLnByb3RvdHlwZS50cCRuYW1lK1wiJ1wiKTtPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxhLnByb3RvdHlwZSl9LCRkb2M6XCJ0aGUgb2JqZWN0J3MgY2xhc3NcIn19LG1ldGhvZHM6e19fZGlyX186eyRtZXRoOmZ1bmN0aW9uKCl7bGV0IGE9W107aWYodGhpcy4kZClpZih0aGlzLiRkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KWE9dGhpcy4kZC5zayRhc2FycmF5KCk7ZWxzZSBmb3IodmFyIGIgaW4gdGhpcy4kZClhLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGIpKTtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLnR5cGUucHJvdG90eXBlLl9fZGlyX18sW3RoaXMub2IkdHlwZV0pO2EucHVzaCguLi5iLnYpO2Iudj1hO3JldHVybiBifSwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIkRlZmF1bHQgZGlyKCkgaW1wbGVtZW50YXRpb24uXCJ9LF9fZm9ybWF0X186eyRtZXRoKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpe2lmKGE9XG5Tay5mZmkucmVtYXBUb0pzKGEpLFwiXCIhPT1hKXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJmb3JtYXQgc3BlYyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO31lbHNle2lmKFNrLl9fZnV0dXJlX18uZXhjZXB0aW9ucyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQoKSBhcmd1bWVudCAyIG11c3QgYmUgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZvcm1hdCBleHBlY3RzIGFyZyAyIHRvIGJlIHN0cmluZyBvciB1bmljb2RlLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO31yZXR1cm4gdGhpcy50cCRzdHIoKX0sJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJEZWZhdWx0IG9iamVjdCBmb3JtYXR0ZXIuXCJ9fSxwcm90bzp7dmFsdWVPZjpPYmplY3QucHJvdG90eXBlLnZhbHVlT2YsdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cCRzdHIoKS52fSxoYXNPd25Qcm9wZXJ0eTpPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxuaHAkdHlwZTp2b2lkIDAsc2skYXR0ckVycm9yKCl7cmV0dXJuXCInXCIrdGhpcy50cCRuYW1lK1wiJyBvYmplY3RcIn19fSk7U2suYWJzdHIuc2V0VXBJbmhlcml0YW5jZShcInR5cGVcIixTay5idWlsdGluLnR5cGUsU2suYnVpbHRpbi5vYmplY3QpO1NrLmFic3RyLnNldFVwQnVpbHRpbk1ybyhTay5idWlsdGluLnR5cGUpfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuJG5hbWUsYixjKTthPXRoaXMuY2FsbChhKTtyZXR1cm4gdm9pZCAwPT09YT9Tay5idWlsdGluLm5vbmUubm9uZSQ6YX1mdW5jdGlvbiBjKGEsYixjKXtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLiRuYW1lLGIsYyk7YT10aGlzLmNhbGwoYSxiWzBdKTtyZXR1cm4gdm9pZCAwPT09YT9Tay5idWlsdGluLm5vbmUubm9uZSQ6YX1mdW5jdGlvbiBiKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuJG5hbWUsXG5iLDEsMik7YT10aGlzLmNhbGwoYSwuLi5iKTtyZXR1cm4gdm9pZCAwPT09YT9Tay5idWlsdGluLm5vbmUubm9uZSQ6YX1mdW5jdGlvbiBlKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuJG5hbWUsYiwyLDIpO3RoaXMuY2FsbChhLGJbMF0sYlsxXSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH1mdW5jdGlvbiBmKGEsYixkKXthPWMuY2FsbCh0aGlzLGEsYixkKTtyZXR1cm4gYT09PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkP2E6bmV3IFNrLmJ1aWx0aW4uYm9vbChhKX1mdW5jdGlvbiBsKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtjPWEuY2FsbCh0aGlzLGMsZCxlKTtyZXR1cm4gYihjKX19ZnVuY3Rpb24gaChhKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBiPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLFxuW10pfX1mdW5jdGlvbiBkKGEsYixjLGQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZj1lLnRwJGRlc2NyX2dldD9lLnRwJGRlc2NyX2dldCh0aGlzKTplO2Y9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGYsW10pO2lmKCFiKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiIHNob3VsZCByZXR1cm4gXCIrYytcIiAocmV0dXJuZWQgXCIrU2suYWJzdHIudHlwZU5hbWUoZikrXCIpXCIpO3JldHVybiB2b2lkIDAhPT1kP2QoZik6Zn19fWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGMsW2JdKX19ZnVuY3Rpb24gbihhLGIpe2xldCBjPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChTay5idWlsdGluLnN0ci4kZ2V0YXR0cmlidXRlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3IpcmV0dXJuIGMuZCR3cmFwcGVkLmNhbGwodGhpcyxcbmEsYik7Yy50cCRkZXNjcl9nZXQmJihjPWMudHAkZGVzY3JfZ2V0KHRoaXMpKTtjb25zdCBkPVNrLm1pc2NldmFsLnRyeUNhdGNoKCgpPT5Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbYV0pLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKSl0aHJvdyBhO30pO3JldHVybiBiP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfWZ1bmN0aW9uIGsoYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXtyZXR1cm4gZnVuY3Rpb24oZCxlLGYpe2xldCBnO3ZvaWQgMD09PWU/KGc9YixjPW51bGwpOmc9YTtsZXQgaD10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAobmV3IFNrLmJ1aWx0aW4uc3RyKGcpKTtpZihoIGluc3RhbmNlb2YgU2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3IpcmV0dXJuIGguZCR3cmFwcGVkLmNhbGwodGhpcyxkLGUpO2gudHAkZGVzY3JfZ2V0JiYoaD1oLnRwJGRlc2NyX2dldCh0aGlzKSk7XG5pZih2b2lkIDAhPT1oKWQ9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGgsdm9pZCAwPT09ZT9bZF06W2QsZV0pO2Vsc2V7aWYoYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCInIG9iamVjdCBcIitjKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihnKTt9cmV0dXJuIGY/ZDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coZCl9fX1mdW5jdGlvbiBwKGEsYil7bGV0IGM9YS5vYiR0eXBlO2Zvcig7YyYmdm9pZCAwIT09Yy5zayRrbGFzczspYz1jLnByb3RvdHlwZS50cCRiYXNlO2lmKGMmJmMucHJvdG90eXBlLnRwJHNldGF0dHIhPT1iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGFwcGx5IHRoaXMgXCIrYi4kbmFtZStcIiB0byBcIitTay5hYnN0ci50eXBlTmFtZShhKStcIiBvYmplY3RcIik7fVNrLnNsb3RzPU9iamVjdC5jcmVhdGUobnVsbCk7XG5tPVNrLnNsb3RzO1NrLnNsb3RzLl9faW5pdF9fPXskbmFtZTpcIl9faW5pdF9fXCIsJHNsb3RfbmFtZTpcInRwJGluaXRcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLGIsYyk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIsYT0+e2lmKCFTay5idWlsdGluLmNoZWNrTm9uZShhKSYmdm9pZCAwIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2luaXRfXygpIHNob3VsZCByZXR1cm4gTm9uZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9KX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhbGwoYSxiLGMpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqYXJncywgKiprd2FyZ3MpXCIsJGZsYWdzOntGYXN0Q2FsbDohMH0sJGRvYzpcIkluaXRpYWxpemUgc2VsZi4gIFNlZSBoZWxwKHR5cGUoc2VsZikpIGZvciBhY2N1cmF0ZSBzaWduYXR1cmUuXCJ9O1xubS5fX25ld19fPXskbmFtZTpcIl9fbmV3X19cIiwkc2xvdF9uYW1lOlwidHAkbmV3XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtjb25zdCBiPWZ1bmN0aW9uKGIsYyl7bGV0IGQ9YTthLnRwJGRlc2NyX2dldCYmKGQ9YS50cCRkZXNjcl9nZXQobnVsbCx0aGlzLmNvbnN0cnVjdG9yKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFt0aGlzLmNvbnN0cnVjdG9yLC4uLmJdLGMpfTtiLnNrJHN0YXRpY19uZXc9ITE7cmV0dXJuIGJ9LCR3cmFwcGVyOm51bGwsJHRleHRzaWc6XCIoJHNlbGYsIC8sICphcmdzLCAqKmt3YXJncylcIiwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkZG9jOlwiQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgb2JqZWN0LlwifTttLl9fY2FsbF9fPXskbmFtZTpcIl9fY2FsbF9fXCIsJHNsb3RfbmFtZTpcInRwJGNhbGxcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6XG5hO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxiLGMpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe2E9YS50cCRjYWxsKGIsYyk7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqYXJncywgKiprd2FyZ3MpXCIsJGZsYWdzOntGYXN0Q2FsbDohMH0sJGRvYzpcIkNhbGwgc2VsZiBhcyBhIGZ1bmN0aW9uLlwifTttLl9fcmVwcl9fPXskbmFtZTpcIl9fcmVwcl9fXCIsJHNsb3RfbmFtZTpcIiRyXCIsJHNsb3RfZnVuYzpkKFwiX19yZXByX19cIixTay5idWlsdGluLmNoZWNrU3RyaW5nLFwic3RyXCIpLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJSZXR1cm4gcmVwcihzZWxmKS5cIn07bS5fX3N0cl9fPXskbmFtZTpcIl9fc3RyX19cIiwkc2xvdF9uYW1lOlwidHAkc3RyXCIsJHNsb3RfZnVuYzpkKFwiX19zdHJfX1wiLFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcsXG5cInN0clwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHN0cihzZWxmKS5cIn07dmFyIHU9ZChcIl9faGFzaF9fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiLGE9PlwibnVtYmVyXCI9PT10eXBlb2YgYS52P2EudjphLnRwJGhhc2goKSk7bS5fX2hhc2hfXz17JG5hbWU6XCJfX2hhc2hfX1wiLCRzbG90X25hbWU6XCJ0cCRoYXNoXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gYT09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9Tay5idWlsdGluLm5vbmUubm9uZSQ6dShhKX0sJHdyYXBwZXI6bChhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIGhhc2goc2VsZikuXCJ9O20uX19nZXRhdHRyaWJ1dGVfXz17JG5hbWU6XCJfX2dldGF0dHJpYnV0ZV9fXCIsJHNsb3RfbmFtZTpcInRwJGdldGF0dHJcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihhLFxuYil7bGV0IGM9dGhpcy5vYiR0eXBlLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRnZXRhdHRyKTtpZih2b2lkIDA9PT1jKXJldHVybiBuLmNhbGwodGhpcyxhLGIpO2NvbnN0IGQ9U2subWlzY2V2YWwuY2hhaW4obi5jYWxsKHRoaXMsYSxiKSxiPT5Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+e2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7Yy50cCRkZXNjcl9nZXQmJihjPWMudHAkZGVzY3JfZ2V0KHRoaXMpKTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW2FdKX0sZnVuY3Rpb24oYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KSk7cmV0dXJuIGI/ZDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coZCl9fSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy4kbmFtZSxiLGMpO2I9YlswXTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGIpK1wiJ1wiKTtjPXRoaXMuY2FsbChhLGIpO2lmKHZvaWQgMD09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgaGFzIG5vIGF0dHJpYnV0ZSBcIitiLiRqc3N0cigpKTtyZXR1cm4gY30sJHRleHRzaWc6XCIoJHNlbGYsIG5hbWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gZ2V0YXR0cihzZWxmLCBuYW1lKS5cIn07bS5fX2dldGF0dHJfXz17JG5hbWU6XCJfX2dldGF0dHJfX1wiLCRzbG90X25hbWU6XCJ0cCRnZXRhdHRyXCIsJHNsb3RfZnVuYzptLl9fZ2V0YXR0cmlidXRlX18uJHNsb3RfZnVuYywkd3JhcHBlcjpudWxsLCR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGdldGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19zZXRhdHRyX189eyRuYW1lOlwiX19zZXRhdHRyX19cIiwkc2xvdF9uYW1lOlwidHAkc2V0YXR0clwiLCRzbG90X2Z1bmM6ayhcIl9fc2V0YXR0cl9fXCIsXG5cIl9fZGVsYXR0cl9fXCIpLCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuJG5hbWUsYiwyLDIpO3AoYSx0aGlzKTt0aGlzLmNhbGwoYSxiWzBdLGJbMV0pO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCRkb2M6XCJJbXBsZW1lbnQgc2V0YXR0cihzZWxmLCBuYW1lLCB2YWx1ZSkuXCJ9O20uX19kZWxhdHRyX189eyRuYW1lOlwiX19kZWxhdHRyX19cIiwkc2xvdF9uYW1lOlwidHAkc2V0YXR0clwiLCRzbG90X2Z1bmM6bS5fX3NldGF0dHJfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLiRuYW1lLGIsYyk7cChhLHRoaXMpO3RoaXMuY2FsbChhLGJbMF0pO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LFxuJHRleHRzaWc6XCIoJHNlbGYsIG5hbWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgZGVsYXR0cihzZWxmLCBuYW1lKS5cIn07bS5fX2dldF9fPXskbmFtZTpcIl9fZ2V0X19cIiwkc2xvdF9uYW1lOlwidHAkZGVzY3JfZ2V0XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe251bGw9PT1iJiYoYj1Tay5idWlsdGluLm5vbmUubm9uZSQpO251bGw9PWMmJihjPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7Y29uc3QgZT1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO2I9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGUsW2IsY10pO3JldHVybiBkP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy4kbmFtZSxjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4odGhpcy4kbmFtZSxcbmIsMSwyKTtjPWJbMF07Yj1iWzFdO2M9PT1Tay5idWlsdGluLm5vbmUubm9uZSQmJihjPW51bGwpO2I9PT1Tay5idWlsdGluLm5vbmUubm9uZSQmJihiPW51bGwpO2lmKG51bGw9PT1iJiZudWxsPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2dldF9fKE5vbmUsIE5vbmUpIGlzIGludmFsaWRcIik7cmV0dXJuIHRoaXMuY2FsbChhLGMsYil9LCR0ZXh0c2lnOlwiKCRzZWxmLCBpbnN0YW5jZSwgb3duZXIsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkZG9jOlwiUmV0dXJuIGFuIGF0dHJpYnV0ZSBvZiBpbnN0YW5jZSwgd2hpY2ggaXMgb2YgdHlwZSBvd25lci5cIn07bS5fX3NldF9fPXskbmFtZTpcIl9fc2V0X19cIiwkc2xvdF9uYW1lOlwidHAkZGVzY3Jfc2V0XCIsJHNsb3RfZnVuYzprKFwiX19zZXRfX1wiLFwiX19kZWxldGVfX1wiKSwkd3JhcHBlcjplLCR0ZXh0c2lnOlwiKCRzZWxmLCBpbnN0YW5jZSwgdmFsdWUsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSxcbiRkb2M6XCJTZXQgYW4gYXR0cmlidXRlIG9mIGluc3RhbmNlIHRvIHZhbHVlLlwifTttLl9fZGVsZXRlX189eyRuYW1lOlwiX19kZWxldGVfX1wiLCRzbG90X25hbWU6XCJ0cCRkZXNjcl9zZXRcIiwkc2xvdF9mdW5jOm0uX19zZXRfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGluc3RhbmNlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiRGVsZXRlIGFuIGF0dHJpYnV0ZSBvZiBpbnN0YW5jZS5cIn07bS5fX2VxX189eyRuYW1lOlwiX19lcV9fXCIsJHNsb3RfbmFtZTpcIm9iJGVxXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGY9PXZhbHVlLlwifTttLl9fZ2VfXz17JG5hbWU6XCJfX2dlX19cIiwkc2xvdF9uYW1lOlwib2IkZ2VcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6ZiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LFxuJGRvYzpcIlJldHVybiBzZWxmPj12YWx1ZS5cIn07bS5fX2d0X189eyRuYW1lOlwiX19ndF9fXCIsJHNsb3RfbmFtZTpcIm9iJGd0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGY+dmFsdWUuXCJ9O20uX19sZV9fPXskbmFtZTpcIl9fbGVfX1wiLCRzbG90X25hbWU6XCJvYiRsZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPD12YWx1ZS5cIn07bS5fX2x0X189eyRuYW1lOlwiX19sdF9fXCIsJHNsb3RfbmFtZTpcIm9iJGx0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGY8dmFsdWUuXCJ9O20uX19uZV9fPXskbmFtZTpcIl9fbmVfX1wiLCRzbG90X25hbWU6XCJvYiRuZVwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYhPXZhbHVlLlwifTttLl9faXRlcl9fPXskbmFtZTpcIl9faXRlcl9fXCIsJHNsb3RfbmFtZTpcInRwJGl0ZXJcIiwkc2xvdF9mdW5jOmgsJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIkltcGxlbWVudCBpdGVyKHNlbGYpLlwifTttLl9fbmV4dF9fPXskbmFtZTpcIl9fbmV4dF9fXCIsJHNsb3RfbmFtZTpcInRwJGl0ZXJuZXh0XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7Y29uc3QgYz1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphLGQ9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFtdKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uKSl0aHJvdyBhO1xufSk7cmV0dXJuIGI/ZDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coZCl9fSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3ModGhpcy4kbmFtZSxiLGMpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLnRwJGl0ZXJuZXh0KCEwKSxhPT57aWYodm9pZCAwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uO3JldHVybiBhfSl9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiSW1wbGVtZW50IG5leHQoc2VsZikuXCJ9O20uX19sZW5fXz17JG5hbWU6XCJfX2xlbl9fXCIsJHNsb3RfbmFtZTpcInNxJGxlbmd0aFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtpZihiKXJldHVybiBiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFtdKSxTay5taXNjZXZhbC5jaGFpbihiLFxuYT0+U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSkpO2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGMsW10pO3JldHVybiBTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKX19LCR3cmFwcGVyOmwoYSxhPT5uZXcgU2suYnVpbHRpbi5pbnRfKGEpKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBsZW4oc2VsZikuXCJ9O20uX19jb250YWluc19fPXskbmFtZTpcIl9fY29udGFpbnNfX1wiLCRzbG90X25hbWU6XCJzcSRjb250YWluc1wiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO2I9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW2JdKTtiPVNrLm1pc2NldmFsLmNoYWluKGIsYT0+U2subWlzY2V2YWwuaXNUcnVlKGEpKTtyZXR1cm4gYi4kaXNTdXNwZW5zaW9uP2M/YjpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYik6XG5ifX0sJHdyYXBwZXI6bChjLGE9Pm5ldyBTay5idWlsdGluLmJvb2woYSkpLCR0ZXh0c2lnOlwiKCRzZWxmLCBrZXksIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4ga2V5IGluIHNlbGYuXCJ9O20uX19nZXRpdGVtX189eyRuYW1lOlwiX19nZXRpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkc3Vic2NyaXB0XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7Yj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxbYl0pO3JldHVybiBjP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfX0sJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwga2V5LCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZba2V5XS5cIn07bS5fX3NldGl0ZW1fXz17JG5hbWU6XCJfX3NldGl0ZW1fX1wiLCRzbG90X25hbWU6XCJtcCRhc3Nfc3Vic2NyaXB0XCIsXG4kc2xvdF9mdW5jOmsoXCJfX3NldGl0ZW1fX1wiLFwiX19kZWxpdGVtX19cIixcImRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50XCIpLCR3cmFwcGVyOmUsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgdmFsdWUsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkZG9jOlwiU2V0IHNlbGZba2V5XSB0byB2YWx1ZS5cIn07bS5fX2RlbGl0ZW1fXz17JG5hbWU6XCJfX2RlbGl0ZW1fX1wiLCRzbG90X25hbWU6XCJtcCRhc3Nfc3Vic2NyaXB0XCIsJHNsb3RfZnVuYzptLl9fc2V0aXRlbV9fLiRzbG90X2Z1bmMsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwga2V5LCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiRGVsZXRlIHNlbGZba2V5XS5cIn07bS5fX2FkZF9fPXskbmFtZTpcIl9fYWRkX19cIiwkc2xvdF9uYW1lOlwibmIkYWRkXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYrdmFsdWUuXCJ9O1xubS5fX3JhZGRfXz17JG5hbWU6XCJfX3JhZGRfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfYWRkXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlK3NlbGYuXCJ9O20uX19pYWRkX189eyRuYW1lOlwiX19pYWRkX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9hZGRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZis9dmFsdWUuXCJ9O20uX19zdWJfXz17JG5hbWU6XCJfX3N1Yl9fXCIsJHNsb3RfbmFtZTpcIm5iJHN1YnRyYWN0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYtdmFsdWUuXCJ9O20uX19yc3ViX189eyRuYW1lOlwiX19yc3ViX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3N1YnRyYWN0XCIsXG4kc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWUtc2VsZi5cIn07bS5fX2ltdWxfXz17JG5hbWU6XCJfX2ltdWxfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX211bHRpcGx5XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYqPXZhbHVlLlwifTttLl9fbXVsX189eyRuYW1lOlwiX19tdWxfX1wiLCRzbG90X25hbWU6XCJuYiRtdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmKnZhbHVlLlwifTttLl9fcm11bF9fPXskbmFtZTpcIl9fcm11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLFxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlKnNlbGYuXCJ9O20uX19pc3ViX189eyRuYW1lOlwiX19pc3ViX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9zdWJ0cmFjdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmLT12YWx1ZS5cIn07bS5fX21vZF9fPXskbmFtZTpcIl9fbW9kX19cIiwkc2xvdF9uYW1lOlwibmIkcmVtYWluZGVyXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYldmFsdWUuXCJ9O20uX19ybW9kX189eyRuYW1lOlwiX19ybW9kX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3JlbWFpbmRlclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIixcbiRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlJXNlbGYuXCJ9O20uX19pbW9kX189eyRuYW1lOlwiX19pbW9kX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9yZW1haW5kZXJcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgdmFsdWUlPXNlbGYuXCJ9O20uX19kaXZtb2RfXz17JG5hbWU6XCJfX2Rpdm1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGRpdm1vZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBkaXZtb2Qoc2VsZiwgdmFsdWUpLlwifTttLl9fcmRpdm1vZF9fPXskbmFtZTpcIl9fcmRpdm1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9kaXZtb2RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LFxuJGRvYzpcIlJldHVybiBkaXZtb2QodmFsdWUsIHNlbGYpXCJ9O20uX19wb3NfXz17JG5hbWU6XCJfX3Bvc19fXCIsJHNsb3RfbmFtZTpcIm5iJHBvc2l0aXZlXCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCIrc2VsZlwifTttLl9fbmVnX189eyRuYW1lOlwiX19uZWdfX1wiLCRzbG90X25hbWU6XCJuYiRuZWdhdGl2ZVwiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiLXNlbGZcIn07bS5fX2Fic19fPXskbmFtZTpcIl9fYWJzX19cIiwkc2xvdF9uYW1lOlwibmIkYWJzXCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJhYnMoc2VsZilcIn07bS5fX2Jvb2xfXz17JG5hbWU6XCJfX2Jvb2xfX1wiLCRzbG90X25hbWU6XCJuYiRib29sXCIsJHNsb3RfZnVuYzpkKFwiX19ib29sX19cIixcblNrLmJ1aWx0aW4uY2hlY2tCb29sLFwiYm9vbFwiLGE9PjAhPT1hLnYpLCR3cmFwcGVyOmwoYSxhPT5uZXcgU2suYnVpbHRpbi5ib29sKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcInNlbGYgIT0gMFwifTttLl9faW52ZXJ0X189eyRuYW1lOlwiX19pbnZlcnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnZlcnRcIiwkc2xvdF9mdW5jOmgsJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIn5zZWxmXCJ9O20uX19sc2hpZnRfXz17JG5hbWU6XCJfX2xzaGlmdF9fXCIsJHNsb3RfbmFtZTpcIm5iJGxzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPDx2YWx1ZS5cIn07bS5fX3Jsc2hpZnRfXz17JG5hbWU6XCJfX3Jsc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfbHNoaWZ0XCIsJHNsb3RfZnVuYzpnLFxuJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWU8PHNlbGYuXCJ9O20uX19yc2hpZnRfXz17JG5hbWU6XCJfX3JzaGlmdF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPj52YWx1ZS5cIn07bS5fX3Jyc2hpZnRfXz17JG5hbWU6XCJfX3Jyc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfcnNoaWZ0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlPj5zZWxmLlwifTttLl9faWxzaGlmdF9fPXskbmFtZTpcIl9faWxzaGlmdF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfbHNoaWZ0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsXG4kdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZjw8PXZhbHVlLlwifTttLl9faXJzaGlmdF9fPXskbmFtZTpcIl9faXJzaGlmdF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfcnNoaWZ0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGY9Pj52YWx1ZS5cIn07bS5fX2FuZF9fPXskbmFtZTpcIl9fYW5kX19cIiwkc2xvdF9uYW1lOlwibmIkYW5kXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYmdmFsdWUuXCJ9O20uX19yYW5kX189eyRuYW1lOlwiX19yYW5kX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmZWxjdGVkX2FuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIixcbiRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlJnNlbGYuXCJ9O20uX19pYW5kX189eyRuYW1lOlwiX19pYW5kX19cIiwkc2xvdF9uYW1lOlwibmIkYW5kXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYmPXZhbHVlLlwifTttLl9feG9yX189eyRuYW1lOlwiX194b3JfX1wiLCRzbG90X25hbWU6XCJuYiR4b3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZl52YWx1ZS5cIn07bS5fX3J4b3JfXz17JG5hbWU6XCJfX3J4b3JfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfeG9yXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlXnNlbGYuXCJ9O1xubS5fX2l4b3JfXz17JG5hbWU6XCJfX2l4b3JfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX3hvclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmXj12YWx1ZS5cIn07bS5fX29yX189eyRuYW1lOlwiX19vcl9fXCIsJHNsb3RfbmFtZTpcIm5iJG9yXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZ8dmFsdWUuXCJ9O20uX19yb3JfXz17JG5hbWU6XCJfX3Jvcl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9vclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZXxzZWxmLlwifTttLl9faW9yX189eyRuYW1lOlwiX19pb3JfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX29yXCIsXG4kc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZnw9dmFsdWUuXCJ9O20uX19pbnRfXz17JG5hbWU6XCJfX2ludF9fXCIsJHNsb3RfbmFtZTpcIm5iJGludFwiLCRzbG90X2Z1bmM6ZChcIl9faW50X19cIixTay5idWlsdGluLmNoZWNrSW50LFwiaW50XCIpLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJpbnQoc2VsZilcIn07bS5fX2Zsb2F0X189eyRuYW1lOlwiX19mbG9hdF9fXCIsJHNsb3RfbmFtZTpcIm5iJGZsb2F0XCIsJHNsb3RfZnVuYzpkKFwiX19mbG9hdF9fXCIsU2suYnVpbHRpbi5jaGVja0Zsb2F0LFwiZmxvYXRcIiksJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcImZsb2F0KHNlbGYpXCJ9O20uX19mbG9vcmRpdl9fPXskbmFtZTpcIl9fZmxvb3JkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRmbG9vcl9kaXZpZGVcIixcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmLy92YWx1ZS5cIn07bS5fX3JmbG9vcmRpdl9fPXskbmFtZTpcIl9fcmZsb29yZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2Zsb29yX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZS8vc2VsZi5cIn07bS5fX2lmbG9vcmRpdl9fPXskbmFtZTpcIl9faWZsb29yZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9mbG9vcl9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi8vPXZhbHVlLlwifTttLl9fdHJ1ZWRpdl9fPXskbmFtZTpcIl9fdHJ1ZWRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJGRpdmlkZVwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYvdmFsdWUuXCJ9O20uX19ydHJ1ZWRpdl9fPXskbmFtZTpcIl9fcnRydWVkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlL3NlbGYuXCJ9O20uX19pdHJ1ZWRpdl9fPXskbmFtZTpcIl9faXRydWVkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmLz12YWx1ZS5cIn07bS5fX2luZGV4X189eyRuYW1lOlwiX19pbmRleF9fXCIsJHNsb3RfbmFtZTpcIm5iJGluZGV4XCIsJHNsb3RfZnVuYzpkKFwiX19pbmRleF9fXCIsXG5Tay5idWlsdGluLmNoZWNrSW50LFwiaW50XCIsYT0+YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZiBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciwgaWYgc2VsZiBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIGFuIGluZGV4IGludG8gYSBsaXN0LlwifTttLl9fcG93X189eyRuYW1lOlwiX19wb3dfX1wiLCRzbG90X25hbWU6XCJuYiRwb3dlclwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO3JldHVybiB2b2lkIDA9PWM/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQsW2JdKTpTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZCxbYixjXSl9fSwkd3JhcHBlcjpiLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgbW9kPU5vbmUsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjEsXG5NYXhBcmdzOjJ9LCRkb2M6XCJSZXR1cm4gcG93KHNlbGYsIHZhbHVlLCBtb2QpLlwifTttLl9fcnBvd19fPXskbmFtZTpcIl9fcnBvd19fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9wb3dlclwiLCRzbG90X2Z1bmM6bS5fX3Bvd19fLiRzbG90X2Z1bmMsJHdyYXBwZXI6YiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIG1vZD1Ob25lLCAvKVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJGRvYzpcIlJldHVybiBwb3codmFsdWUsIHNlbGYsIG1vZCkuXCJ9O20uX19pcG93X189eyRuYW1lOlwiX19pcG93X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9wb3dlclwiLCRzbG90X2Z1bmM6bS5fX3Bvd19fLiRzbG90X2Z1bmMsJHdyYXBwZXI6YiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIG1vZD1Ob25lLCAvKVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJGRvYzpcIkltcGxlbWVudCAqKj1cIn07bS5fX21hdG11bF9fPXskbmFtZTpcIl9fbWF0bXVsX19cIiwkc2xvdF9uYW1lOlwibmIkbWF0cml4X211bHRpcGx5XCIsXG4kc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZkB2YWx1ZS5cIn07bS5fX3JtYXRtdWxfXz17JG5hbWU6XCJfX3JtYXRtdWxfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlQHNlbGYuXCJ9O20uX19pbWF0bXVsX189eyRuYW1lOlwiX19pbWF0bXVsX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9tYXRyaXhfbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZkA9dmFsdWUuXCJ9O20uX19sb25nX189eyRuYW1lOlwiX19sb25nX19cIiwkc2xvdF9uYW1lOlwibmIkbG9uZ1wiLFxuJHNsb3RfZnVuYzpkKFwiX19sb25nX19cIixTay5idWlsdGluLmNoZWNrSW50LFwiaW50XCIpLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJpbnQoc2VsZilcIn07dmFyIEEsdD17bmV4dDp7JG5hbWU6XCJuZXh0XCIsJHNsb3RfbmFtZTpcInRwJGl0ZXJuZXh0XCIsJHNsb3RfZnVuYzptLl9fbmV4dF9fLiRzbG90X2Z1bmMsJHdyYXBwZXI6bS5fX25leHRfXy4kd3JhcHBlciwkdGV4dHNpZzptLl9fbmV4dF9fLiR0ZXh0c2lnLCRmbGFnczptLl9fbmV4dF9fLiRmbGFnc30sX19ub256ZXJvX186eyRuYW1lOlwiX19ub256ZXJvX19cIiwkc2xvdF9uYW1lOlwibmIkYm9vbFwiLCRzbG90X2Z1bmM6ZChcIl9fbm9uemVyb19fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiLGE9PjAhPT1hLnYpLCR3cmFwcGVyOmwoYSxhPT5uZXcgU2suYnVpbHRpbi5ib29sKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcInguX19ub256ZXJvX18oKSA8PT0+IHggIT0gMFwifSxcbl9fZGl2X186eyRuYW1lOlwiX19kaXZfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgb3RoZXIvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwieC5fX2Rpdl9fKHkpIDw9PT4geC95XCJ9LF9fcmRpdl9fOnskbmFtZTpcIl9fcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgb3RoZXIvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwieC5fX3JkaXZfXyh5KSA8PT0+IHgveVwifSxfX2lkaXZfXzp7JG5hbWU6XCJfX2lkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCBvdGhlci8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJpbXBsZW1lbnQgc2VsZiAvPSBvdGhlclwifX07U2suc3ViU2xvdHM9e21haW5fc2xvdHM6T2JqZWN0LmVudHJpZXMoe3RwJGluaXQ6XCJfX2luaXRfX1wiLFxudHAkY2FsbDpcIl9fY2FsbF9fXCIsJHI6XCJfX3JlcHJfX1wiLHRwJHN0cjpcIl9fc3RyX19cIix0cCRnZXRhdHRyOlwiX19nZXRhdHRyaWJ1dGVfX1wiLHRwJHNldGF0dHI6W1wiX19zZXRhdHRyX19cIixcIl9fZGVsYXR0cl9fXCJdLG9iJGVxOlwiX19lcV9fXCIsb2IkbmU6XCJfX25lX19cIixvYiRsdDpcIl9fbHRfX1wiLG9iJGxlOlwiX19sZV9fXCIsb2IkZ3Q6XCJfX2d0X19cIixvYiRnZTpcIl9fZ2VfX1wiLHRwJGRlc2NyX2dldDpcIl9fZ2V0X19cIix0cCRkZXNjcl9zZXQ6W1wiX19zZXRfX1wiLFwiX19kZWxldGVfX1wiXSx0cCRpdGVyOlwiX19pdGVyX19cIix0cCRpdGVybmV4dDpcIl9fbmV4dF9fXCJ9KSxudW1iZXJfc2xvdHM6T2JqZWN0LmVudHJpZXMoe25iJGFiczpcIl9fYWJzX19cIixuYiRuZWdhdGl2ZTpcIl9fbmVnX19cIixuYiRwb3NpdGl2ZTpcIl9fcG9zX19cIixuYiRpbnQ6XCJfX2ludF9fXCIsbmIkbG9uZzpcIl9fbG9uZ19fXCIsbmIkZmxvYXQ6XCJfX2Zsb2F0X19cIixuYiRhZGQ6XCJfX2FkZF9fXCIsbmIkcmVmbGVjdGVkX2FkZDpcIl9fcmFkZF9fXCIsXG5uYiRpbnBsYWNlX2FkZDpcIl9faWFkZF9fXCIsbmIkc3VidHJhY3Q6XCJfX3N1Yl9fXCIsbmIkcmVmbGVjdGVkX3N1YnRyYWN0OlwiX19yc3ViX19cIixuYiRpbnBsYWNlX3N1YnRyYWN0OlwiX19pc3ViX19cIixuYiRtdWx0aXBseTpcIl9fbXVsX19cIixuYiRyZWZsZWN0ZWRfbXVsdGlwbHk6XCJfX3JtdWxfX1wiLG5iJGlucGxhY2VfbXVsdGlwbHk6XCJfX2ltdWxfX1wiLG5iJGZsb29yX2RpdmlkZTpcIl9fZmxvb3JkaXZfX1wiLG5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGU6XCJfX3JmbG9vcmRpdl9fXCIsbmIkaW5wbGFjZV9mbG9vcl9kaXZpZGU6XCJfX2lmbG9vcmRpdl9fXCIsbmIkaW52ZXJ0OlwiX19pbnZlcnRfX1wiLG5iJHJlbWFpbmRlcjpcIl9fbW9kX19cIixuYiRyZWZsZWN0ZWRfcmVtYWluZGVyOlwiX19ybW9kX19cIixuYiRpbnBsYWNlX3JlbWFpbmRlcjpcIl9faW1vZF9fXCIsbmIkZGl2bW9kOlwiX19kaXZtb2RfX1wiLG5iJHJlZmxlY3RlZF9kaXZtb2Q6XCJfX3JkaXZtb2RfX1wiLG5iJHBvd2VyOlwiX19wb3dfX1wiLG5iJHJlZmxlY3RlZF9wb3dlcjpcIl9fcnBvd19fXCIsXG5uYiRpbnBsYWNlX3Bvd2VyOlwiX19pcG93X19cIixuYiRkaXZpZGU6XCJfX3RydWVkaXZfX1wiLG5iJHJlZmxlY3RlZF9kaXZpZGU6XCJfX3J0cnVlZGl2X19cIixuYiRpbnBsYWNlX2RpdmlkZTpcIl9faXRydWVkaXZfX1wiLG5iJGJvb2w6XCJfX2Jvb2xfX1wiLG5iJGFuZDpcIl9fYW5kX19cIixuYiRyZWZsZWN0ZWRfYW5kOlwiX19yYW5kX19cIixuYiRpbnBsYWNlX2FuZDpcIl9faWFuZF9fXCIsbmIkb3I6XCJfX29yX19cIixuYiRyZWZsZWN0ZWRfb3I6XCJfX3Jvcl9fXCIsbmIkaW5wbGFjZV9vcjpcIl9faW9yX19cIixuYiR4b3I6XCJfX3hvcl9fXCIsbmIkcmVmbGVjdGVkX3hvcjpcIl9fcnhvcl9fXCIsbmIkaW5wbGFjZV94b3I6XCJfX2l4b3JfX1wiLG5iJGxzaGlmdDpcIl9fbHNoaWZ0X19cIixuYiRyZWZsZWN0ZWRfbHNoaWZ0OlwiX19ybHNoaWZ0X19cIixuYiRyc2hpZnQ6XCJfX3JzaGlmdF9fXCIsbmIkcmVmbGVjdGVkX3JzaGlmdDpcIl9fcnJzaGlmdF9fXCIsbmIkaW5wbGFjZV9sc2hpZnQ6XCJfX2lsc2hpZnRfX1wiLG5iJGlucGxhY2VfcnNoaWZ0OlwiX19pcnNoaWZ0X19cIixcbm5iJG1hdHJpeF9tdWx0aXBseTpcIl9fbWF0bXVsX19cIixuYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5OlwiX19ybWF0bXVsX19cIixuYiRpbnBsYWNlX21hdHJpeF9tdWx0aXBseTpcIl9faW1hdG11bF9fXCJ9KSxzZXF1ZW5jZV9hbmRfbWFwcGluZ19zbG90czpPYmplY3QuZW50cmllcyh7c3EkbGVuZ3RoOlwiX19sZW5fX1wiLHNxJGNvbnRhaW5zOlwiX19jb250YWluc19fXCIsbXAkc3Vic2NyaXB0OlwiX19nZXRpdGVtX19cIixtcCRhc3Nfc3Vic2NyaXB0OltcIl9fc2V0aXRlbV9fXCIsXCJfX2RlbGl0ZW1fX1wiXSxuYiRhZGQ6XCJfX2FkZF9fXCIsbmIkbXVsdGlwbHk6XCJfX211bF9fXCIsbmIkcmVmbGVjdGVkX211bHRpcGx5OlwiX19ybXVsX19cIixuYiRpbnBsYWNlX2FkZDpcIl9faWFkZF9fXCIsbmIkaW5wbGFjZV9tdWx0aXBseTpcIl9faW11bF9fXCJ9KX07U2sucmVmbGVjdGVkTnVtYmVyU2xvdHM9e25iJGFkZDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2FkZFwifSxuYiRzdWJ0cmFjdDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX3N1YnRyYWN0XCIsXG5zbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJHN1YnRyYWN0KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkbXVsdGlwbHk6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9tdWx0aXBseVwifSxuYiRkaXZpZGU6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9kaXZpZGVcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGRpdmlkZSh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJGZsb29yX2RpdmlkZTp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2Zsb29yX2RpdmlkZVwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkZmxvb3JfZGl2aWRlKHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sXG5uYiRyZW1haW5kZXI6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9yZW1haW5kZXJcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJHJlbWFpbmRlcih0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJGRpdm1vZDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2Rpdm1vZFwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkZGl2bW9kKHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkcG93ZXI6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9wb3dlclwiLHNsb3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRwb3dlcih0aGlzLGIpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkYW5kOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfYW5kXCJ9LFxubmIkb3I6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9vclwifSxuYiR4b3I6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF94b3JcIn0sbmIkbHNoaWZ0OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfbHNoaWZ0XCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRsc2hpZnQodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRyc2hpZnQ6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9yc2hpZnRcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJHJzaGlmdCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJG1hdHJpeF9tdWx0aXBseTp7cmVmbGVjdGVkOlwibmIkcmVmbGV4dGVkX21hdHJpeF9tdWx0aXBseVwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP1xuYS5uYiRtYXRyaXhfbXVsdGlwbHkodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fX07U2suc2VxdWVuY2VBbmRNYXBwaW5nU2xvdHM9e3NxJGNvbmNhdDpbXCJuYiRhZGRcIl0sc3EkcmVwZWF0OltcIm5iJG11bHRpcGx5XCIsXCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIl0sbXAkbGVuZ3RoOltcInNxJGxlbmd0aFwiXSxzcSRpbnBsYWNlX3JlcGVhdDpbXCJuYiRpbnBsYWNlX211bHRpcGx5XCJdLHNxJGlucGxhY2VfY29uY2F0OltcIm5iJGlucGxhY2VfYWRkXCJdfTtTay5kdW5kZXJUb1NrdWxwdD17X19yZXByX186XCIkclwiLF9fc3RyX186XCJ0cCRzdHJcIixfX2luaXRfXzpcInRwJGluaXRcIixfX25ld19fOlwidHAkbmV3XCIsX19oYXNoX186XCJ0cCRoYXNoXCIsX19jYWxsX186XCJ0cCRjYWxsXCIsX19pdGVyX186XCJ0cCRpdGVyXCIsX19uZXh0X186XCJ0cCRpdGVybmV4dFwiLF9fZXFfXzpcIm9iJGVxXCIsX19uZV9fOlwib2IkbmVcIixfX2x0X186XCJvYiRsdFwiLF9fbGVfXzpcIm9iJGxlXCIsXG5fX2d0X186XCJvYiRndFwiLF9fZ2VfXzpcIm9iJGdlXCIsX19hYnNfXzpcIm5iJGFic1wiLF9fbmVnX186XCJuYiRuZWdhdGl2ZVwiLF9fcG9zX186XCJuYiRwb3NpdGl2ZVwiLF9faW50X186XCJuYiRpbnRcIixfX2Zsb2F0X186XCJuYiRmbG9hdFwiLF9fYWRkX186XCJuYiRhZGRcIixfX3JhZGRfXzpcIm5iJHJlZmxlY3RlZF9hZGRcIixfX2lhZGRfXzpcIm5iJGlucGxhY2VfYWRkXCIsX19zdWJfXzpcIm5iJHN1YnRyYWN0XCIsX19yc3ViX186XCJuYiRyZWZsZWN0ZWRfc3VidHJhY3RcIixfX2lzdWJfXzpcIm5iJGlucGxhY2Vfc3VidHJhY3RcIixfX211bF9fOlwibmIkbXVsdGlwbHlcIixfX3JtdWxfXzpcIm5iJHJlZmxlY3RlZF9tdWx0aXBseVwiLF9faW11bF9fOlwibmIkaW5wbGFjZV9tdWx0aXBseVwiLF9fdHJ1ZWRpdl9fOlwibmIkZGl2aWRlXCIsX19ydHJ1ZWRpdl9fOlwibmIkcmVmbGVjdGVkX2RpdmlkZVwiLF9faXRydWVkaXZfXzpcIm5iJGlucGxhY2VfZGl2aWRlXCIsX19mbG9vcmRpdl9fOlwibmIkZmxvb3JfZGl2aWRlXCIsX19yZmxvb3JkaXZfXzpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIixcbl9faWZsb29yZGl2X186XCJuYiRpbnBsYWNlX2Zsb29yX2RpdmlkZVwiLF9faW52ZXJ0X186XCJuYiRpbnZlcnRcIixfX21vZF9fOlwibmIkcmVtYWluZGVyXCIsX19ybW9kX186XCJuYiRyZWZsZWN0ZWRfcmVtYWluZGVyXCIsX19pbW9kX186XCJuYiRpbnBsYWNlX3JlbWFpbmRlclwiLF9fZGl2bW9kX186XCJuYiRkaXZtb2RcIixfX3JkaXZtb2RfXzpcIm5iJHJlZmxlY3RlZF9kaXZtb2RcIixfX3Bvd19fOlwibmIkcG93ZXJcIixfX3Jwb3dfXzpcIm5iJHJlZmxlY3RlZF9wb3dlclwiLF9faXBvd19fOlwibmIkaW5wbGFjZV9wb3dlclwiLF9fYm9vbF9fOlwibmIkYm9vbFwiLF9fbG9uZ19fOlwibmIkbG9uZ1wiLF9fbHNoaWZ0X186XCJuYiRsc2hpZnRcIixfX3Jsc2hpZnRfXzpcIm5iJHJlZmxlY3RlZF9sc2hpZnRcIixfX2lsc2hpZnRfXzpcIm5iJGlucGxhY2VfbHNoaWZ0XCIsX19yc2hpZnRfXzpcIm5iJHJzaGlmdFwiLF9fcnJzaGlmdF9fOlwibmIkcmVmbGVjdGVkX3JzaGlmdFwiLF9faXJzaGlmdF9fOlwibmIkaW5wbGFjZV9yc2hpZnRcIixcbl9fYW5kX186XCJuYiRhbmRcIixfX3JhbmRfXzpcIm5iJHJlZmxlY3RlZF9hbmRcIixfX2lhbmRfXzpcIm5iJGlucGxhY2VfYW5kXCIsX19vcl9fOlwibmIkb3JcIixfX3Jvcl9fOlwibmIkcmVmbGVjdGVkX29yXCIsX19pb3JfXzpcIm5iJGlucGxhY2Vfb3JcIixfX3hvcl9fOlwibmIkeG9yXCIsX19yeG9yX186XCJuYiRyZWZsZWN0ZWRfeG9yXCIsX19peG9yX186XCJuYiRpbnBsYWNlX3hvclwiLF9fbWF0bXVsX186XCJuYiRtYXRyaXhfbXVsdGlwbHlcIixfX3JtYXRtdWxfXzpcIm5iJHJlZmxlY3RlZF9tYXRyaXhfbXVsdGlwbHlcIixfX2ltYXRtdWxfXzpcIm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5XCIsX19nZXRfXzpcInRwJGRlc2NyX2dldFwiLF9fc2V0X186XCJ0cCRkZXNjcl9zZXRcIixfX2RlbGV0ZV9fOlwidHAkZGVzY3Jfc2V0XCIsX19nZXRhdHRyaWJ1dGVfXzpcInRwJGdldGF0dHJcIixfX2dldGF0dHJfXzpcInRwJGdldGF0dHJcIixfX3NldGF0dHJfXzpcInRwJHNldGF0dHJcIixfX2RlbGF0dHJfXzpcInRwJHNldGF0dHJcIixfX2xlbl9fOlwic3EkbGVuZ3RoXCIsXG5fX2NvbnRhaW5zX186XCJzcSRjb250YWluc1wiLF9fZ2V0aXRlbV9fOlwibXAkc3Vic2NyaXB0XCIsX19zZXRpdGVtX186XCJtcCRhc3Nfc3Vic2NyaXB0XCIsX19kZWxpdGVtX186XCJtcCRhc3Nfc3Vic2NyaXB0XCJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnNldHVwRHVuZGVyTWV0aG9kc1wiLFNrLnNldHVwRHVuZGVyTWV0aG9kcyk7U2suc2V0dXBEdW5kZXJNZXRob2RzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiLGMpe2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBlPWFbZF0ucHJvdG90eXBlO2UuaGFzT3duUHJvcGVydHkoYyl8fChlW2NdPWVbYl0sZGVsZXRlIGVbYl0pfX12YXIgYz1Tay5zbG90cztpZighYXx8dm9pZCAwIT09QSl7dmFyIGQ9U2suYWJzdHIuYnVpbHQkaXRlcmF0b3JzLGU9W1NrLmJ1aWx0aW4uaW50XyxTay5idWlsdGluLmxuZyxTay5idWlsdGluLmZsb2F0XyxTay5idWlsdGluLmNvbXBsZXhdLGY9U2suc3ViU2xvdHMubnVtYmVyX3Nsb3RzLGc9U2suc3ViU2xvdHMubWFpbl9zbG90cyxcbmg9Zy5maW5kSW5kZXgoYT0+XCJ0cCRpdGVybmV4dFwiPT09YVswXSksaz1mLmZpbmRJbmRleChhPT5cIm5iJGJvb2xcIj09PWFbMF0pLGw9U2suZHVuZGVyVG9Ta3VscHQ7aWYoYSl7bC5fX2Jvb2xfXz1cIm5iJGJvb2xcIjtsLl9fbmV4dF9fPVwidHAkaXRlcm5leHRcIjtkZWxldGUgbC5fX25vbnplcm9fXztkZWxldGUgbC5fX2Rpdl9fO2RlbGV0ZSBsLl9fcmRpdl9fO2RlbGV0ZSBsLl9faWRpdl9fO2RlbGV0ZSBsLm5leHQ7Zm9yKGxldCBhIGluIEEpY1thXT1BW2FdO2ZvcihsZXQgYSBpbiB0KWRlbGV0ZSBjW2FdO2ZvcihhPTA7YTxlLmxlbmd0aDthKyspYz1lW2FdLnByb3RvdHlwZSxkZWxldGUgYy5fX2Rpdl9fLGRlbGV0ZSBjLl9fcmRpdl9fO2dbaF1bMV09XCJfX25leHRfX1wiO2Zba11bMV09XCJfX2Jvb2xfX1wiO2IoZCxcIm5leHRcIixcIl9fbmV4dF9fXCIpO2IoZSxcIl9fYm9vbF9fXCIsXCJfX25vbnplcm9fX1wiKX1lbHNle3ZvaWQgMD09PUEmJihjLnB5MyRzbG90cz17X19uZXh0X186Yy5fX25leHRfX30sXG5BPWMucHkzJHNsb3RzKTtsLm5leHQ9XCJ0cCRpdGVybmV4dFwiO2wuX19ub256ZXJvX189XCJuYiRib29sXCI7bC5fX2Rpdl9fPVwibmIkZGl2aWRlXCI7bC5fX3JkaXZfXz1cIm5iJHJlZmxlY3RlZF9kaXZpZGVcIjtsLl9faWRpdl9fPVwibmIkaW5wbGFjZV9kaXZpZGVcIjtkZWxldGUgbC5fX2Jvb2xfXztkZWxldGUgbC5fX25leHRfXztmb3IobGV0IGEgaW4gdCljW2FdPXRbYV07Zm9yKGxldCBhIGluIEEpZGVsZXRlIGNbYV07Z1toXVsxXT1cIm5leHRcIjtmW2tdWzFdPVwiX19ub256ZXJvX19cIjtiKGQsXCJfX25leHRfX1wiLFwibmV4dFwiKTtiKGUsXCJfX25vbnplcm9fX1wiLFwiX19ib29sX19cIik7Zm9yKGQ9MDtkPGUubGVuZ3RoO2QrKylmPWVbZF0sZz1mLnByb3RvdHlwZSxnLmhhc093blByb3BlcnR5KFwiX19kaXZfX1wiKXx8KGcuX19kaXZfXz1uZXcgU2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3IoZix0Ll9fZGl2X18sZy5uYiRkaXZpZGUpLGcuX19yZGl2X189bmV3IFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKGYsXG50Ll9fcmRpdl9fLFNrLnJlZmxlY3RlZE51bWJlclNsb3RzLm5iJGRpdmlkZS5zbG90KSl9fX19LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGgsZCl7cmV0dXJuIFNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoYSx7Y29uc3RydWN0b3I6ZC5jb25zdHJ1Y3RvcixzbG90czpPYmplY3QuYXNzaWduKHt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0ciwkcjplfSxkLnNsb3RzKSxnZXRzZXRzOk9iamVjdC5hc3NpZ24oZC5nZXRzZXRzfHx7fSxmKSxwcm90bzpPYmplY3QuYXNzaWduKGQucHJvdG98fHt9LHtkJHJlcHJfbmFtZTpofHxhLGQkY2hlY2s6YyxkJHNldF9jaGVjazpifSksZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KX1mdW5jdGlvbiBjKGEpe2lmKG51bGw9PWEpcmV0dXJuIHRoaXM7aWYoIWEub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMuZCR0eXBlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcblwiJyByZXF1aXJlcyBhICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IGJ1dCByZWNlaXZlZCBhICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0XCIpO31mdW5jdGlvbiBiKGEpe2lmKCFhLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3RcIik7fWZ1bmN0aW9uIGUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPFwiK3RoaXMuZCRyZXByX25hbWUrXCIgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdHM+XCIpfWNvbnN0IGY9e19fZG9jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5kJGRlZi4kZG9jP1xubmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuZCRkZWYuJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19vYmpjbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCR0eXBlfX0sX19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuZCRuYW1lKX19fTttPXtfX3RleHRfc2lnbmF0dXJlX186eyRnZXQoKXtyZXR1cm4gdGhpcy5kJGRlZi4kdGV4dHNpZz9uZXcgU2suYnVpbHRpbi5zdHIodGhpcy5kJGRlZi4kdGV4dHNpZyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfX19O1NrLmJ1aWx0aW4uZ2V0c2V0X2Rlc2NyaXB0b3I9YShcImdldHNldF9kZXNjcmlwdG9yXCIsdm9pZCAwLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMuZCRkZWY9Yjt0aGlzLiRnZXQ9Yi4kZ2V0O3RoaXMuJHNldD1iLiRzZXQ7dGhpcy5kJHR5cGU9YTt0aGlzLmQkbmFtZT1iLiRuYW1lfSxzbG90czp7dHAkZGVzY3JfZ2V0KGEsYil7aWYoYj10aGlzLmQkY2hlY2soYSkpcmV0dXJuIGI7XG5pZih2b2lkIDAhPT10aGlzLiRnZXQpcmV0dXJuIHRoaXMuJGdldC5jYWxsKGEpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiZ2V0c2V0X2Rlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdHMgaXMgbm90IHJlYWRhYmxlXCIpO30sdHAkZGVzY3Jfc2V0KGEsYil7dGhpcy5kJHNldF9jaGVjayhhKTtpZih2b2lkIDAhPT10aGlzLiRzZXQpcmV0dXJuIHRoaXMuJHNldC5jYWxsKGEsYik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCJhdHRyaWJ1dGUgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdHMgaXMgcmVhZG9ubHlcIik7fX19KTtTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yPWEoXCJtZXRob2RfZGVzY3JpcHRvclwiLFwibWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7dGhpcy5kJGRlZj1cbmI7dGhpcy4kbWV0aD1iLiRtZXRoO3RoaXMuZCR0eXBlPWE7dGhpcy5kJG5hbWU9Yi4kbmFtZXx8XCI8bmF0aXZlIEpTPlwiO3RoaXMuJGZsYWdzPWE9Yi4kZmxhZ3N8fHt9O2EuRmFzdENhbGwmJmEuTm9Ld2FyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZEZhc3RDYWxsTm9Ld2FyZ3M6YS5GYXN0Q2FsbD90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aG9kRmFzdENhbGw6YS5Ob0FyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZENhbGxOb0FyZ3M6YS5PbmVBcmc/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZENhbGxPbmVBcmc6YS5OYW1lZEFyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZENhbGxOYW1lZEFyZ3M6dm9pZCAwIT09YS5NaW5BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsTWluQXJnczoodGhpcy5mdW5jX2NvZGU9Yi4kbWV0aCx0aGlzLnRwJGNhbGw9dGhpcy4kZGVmYXVsdENhbGwsdGhpcy4kbWVtb2lzZUZsYWdzPVNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUuJG1lbW9pc2VGbGFncyxcbnRoaXMuJHJlc29sdmVBcmdzPVNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUuJHJlc29sdmVBcmdzKX0sc2xvdHM6e3RwJGNhbGwoYSxiKXtyZXR1cm4gdGhpcy50cCRjYWxsKGEsYil9LHRwJGRlc2NyX2dldChhLGIpe2xldCBjO3JldHVybihjPXRoaXMuZCRjaGVjayhhKSk/YzpuZXcgU2suYnVpbHRpbi5za19tZXRob2QodGhpcy5kJGRlZixhKX19LGdldHNldHM6bSxwcm90bzp7JG1ldGhvZEZhc3RDYWxsKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMsYSxiKX0sJG1ldGhvZEZhc3RDYWxsTm9Ld2FyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy5kJG5hbWUsYik7cmV0dXJuIHRoaXMuJG1ldGguY2FsbChjLGEpfSwkbWV0aG9kQ2FsbE5vQXJncyhhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7U2suYWJzdHIuY2hlY2tOb0FyZ3ModGhpcy5kJG5hbWUsXG5hLGIpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYyl9LCRtZXRob2RDYWxsT25lQXJnKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLmQkbmFtZSxhLGIpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYyxhWzBdKX0sJG1ldGhvZENhbGxOYW1lZEFyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO2E9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3ModGhpcy5kJG5hbWUsdGhpcy4kZmxhZ3MuTmFtZWRBcmdzLGEsYix0aGlzLiRmbGFncy5EZWZhdWx0cyk7cmV0dXJuIHRoaXMuJG1ldGguY2FsbChjLC4uLmEpfSwkbWV0aG9kQ2FsbE1pbkFyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy5kJG5hbWUsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuZCRuYW1lLGEsdGhpcy4kZmxhZ3MuTWluQXJncyxcbnRoaXMuJGZsYWdzLk1heEFyZ3MpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYywuLi5hKX0sJGRlZmF1bHRDYWxsKGEsYil7dGhpcy5tJGNoZWNrc2VsZihhWzBdKTtyZXR1cm4gU2suYnVpbHRpbi5mdW5jLnByb3RvdHlwZS50cCRjYWxsLmNhbGwodGhpcyxhLGIpfSxtJGNoZWNrc2VsZihhKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBuZWVkcyBhbiBhcmd1bWVudFwiKTt0aGlzLmQkY2hlY2soYSl9fX0pO1NrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yPWEoXCJ3cmFwcGVyX2Rlc2NyaXB0b3JcIixcInNsb3Qgd3JhcHBlclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIsYyl7dGhpcy5kJGRlZj1iO3RoaXMuZCR0eXBlPWE7dGhpcy5kJG5hbWU9Yy4kbmFtZT1iLiRuYW1lO3RoaXMuZCR3cmFwcGVkPWN9LHNsb3RzOnt0cCRkZXNjcl9nZXQoYSxcbmIpe2xldCBjO3JldHVybihjPXRoaXMuZCRjaGVjayhhKSk/YzpuZXcgU2suYnVpbHRpbi5tZXRob2Rfd3JhcHBlcih0aGlzLGEpfSx0cCRjYWxsKGEsYil7aWYoMT5hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcIik7Y29uc3QgYz1hLnNoaWZ0KCk7aWYoIWMub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMuZCR0eXBlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgcmVxdWlyZXMgYSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBidXQgcmVjZWl2ZWQgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInXCIpO3JldHVybiB0aGlzLnJhdyRjYWxsKGMsYSxiKX19LHByb3RvOntyYXckY2FsbChhLGIsYyl7dGhpcy5kJHdyYXBwZWQuJG5hbWU9XG50aGlzLmQkbmFtZTtyZXR1cm4gdGhpcy5kJGRlZi4kd3JhcHBlci5jYWxsKHRoaXMuZCR3cmFwcGVkLGEsYixjKX19fSk7U2suYnVpbHRpbi5tZXRob2Rfd3JhcHBlcj1hKFwibWV0aG9kX3dyYXBwZXJcIix2b2lkIDAse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7dGhpcy5tJGRlc2NyPWE7dGhpcy5tJHNlbGY9Yjt0aGlzLmQkZGVmPWEuZCRkZWY7dGhpcy5kJG5hbWU9YS5kJG5hbWU7dGhpcy5kJHR5cGU9YS5kJHR5cGV9LHNsb3RzOnt0cCRjYWxsKGEsYil7cmV0dXJuIHRoaXMubSRkZXNjci5yYXckY2FsbCh0aGlzLm0kc2VsZixhLGIpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKFwiRXFcIiE9PWImJlwiTm90RXFcIiE9PWJ8fCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXIpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPXRoaXMubSRzZWxmPT09YS5tJHNlbGYmJnRoaXMubSRkZXNjcj09PWEubSRkZXNjcjtyZXR1cm5cIkVxXCI9PT1cbmI/YTohYX0sJHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPG1ldGhvZC13cmFwcGVyICdcIit0aGlzLmQkbmFtZStcIicgb2YgXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy5tJHNlbGYpK1wiIG9iamVjdD5cIil9fSxnZXRzZXRzOntfX3NlbGZfXzp7JGdldCgpe3JldHVybiB0aGlzLm0kc2VsZn19fX0pO1NrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcj1hKFwiY2xhc3NtZXRob2RfZGVzY3JpcHRvclwiLFwibWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7dGhpcy5kJGRlZj1iO3RoaXMuJG1ldGg9Yi4kbWV0aDt0aGlzLmQkdHlwZT1hO3RoaXMuZCRuYW1lPWIuJG5hbWV8fFwiPG5hdGl2ZSBKUz5cIn0sc2xvdHM6e3RwJGNhbGwoYSxiKXtpZigxPmEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBuZWVkcyBhbiBhcmd1bWVudFwiKTtcbmNvbnN0IGM9YS5zaGlmdCgpO3JldHVybiB0aGlzLnRwJGRlc2NyX2dldChudWxsLGMpLnRwJGNhbGwoYSxiKX0sdHAkZGVzY3JfZ2V0KGEsYixjKXtpZih2b2lkIDA9PT1iKWlmKG51bGwhPT1hKWI9Ynx8YS5vYiR0eXBlO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIGZvciB0eXBlICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgbmVlZHMgYW4gb2JqZWN0IG9yIGEgdHlwZVwiKTtpZihiLm9iJHR5cGUhPT1Tay5idWlsdGluLnR5cGUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIGZvciB0eXBlICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgbmVlZHMgYSB0eXBlIG5vdCBhICdcIitTay5hYnN0ci50eXBlTmFtZShiKStcIicgYXMgYXJnIDJcIik7aWYoIWIuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrXG50aGlzLmQkbmFtZStcIicgcmVxdWlyZXMgYSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBidXQgcmVjZWl2ZWQgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXCInIG9iamVjdFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHRoaXMuZCRkZWYsYil9fSxnZXRzZXRzOm19KTtbU2suYnVpbHRpbi5tZXRob2RfZGVzY3JpcHRvcixTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yLFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yLFNrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXIsU2suYnVpbHRpbi5jbGFzc21ldGhvZF9kZXNjcmlwdG9yXS5mb3JFYWNoKGE9PntTay5hYnN0ci5zZXRVcFNsb3RzKGEpO1NrLmFic3RyLnNldFVwTWV0aG9kcyhhKTtTay5hYnN0ci5zZXRVcEdldFNldHMoYSl9KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnNrX21ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiYnVpbHRpbl9mdW5jdGlvbl9vcl9tZXRob2RcIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYil7dGhpcy4kbWV0aD1hLiRtZXRoLmJpbmQoYyk7dGhpcy4kZG9jPWEuJGRvYzt0aGlzLiRzZWxmPWN8fG51bGw7dGhpcy4kbW9kdWxlPWI/bmV3IFNrLmJ1aWx0aW4uc3RyKGIpOm51bGw7dGhpcy4kbmFtZT1hLiRuYW1lfHxhLiRtZXRoLm5hbWV8fFwiPG5hdGl2ZSBKUz5cIjt0aGlzLm0kZGVmPWE7dGhpcy4kdGV4dHNpZz1hLiR0ZXh0c2lnO3RoaXMuJGZsYWdzPWE9YS4kZmxhZ3N8fHt9O2EuRmFzdENhbGwmJmEuTm9Ld2FyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGZhc3RDYWxsTm9Ld2FyZ3M6YS5GYXN0Q2FsbD90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aDphLk5vQXJncz90aGlzLnRwJGNhbGw9dGhpcy4kY2FsbE5vQXJnczphLk9uZUFyZz90aGlzLnRwJGNhbGw9dGhpcy4kY2FsbE9uZUFyZzphLk5hbWVkQXJncz90aGlzLnRwJGNhbGw9dGhpcy4kY2FsbE5hbWVkQXJnczp2b2lkIDAhPT1hLk1pbkFyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxNaW5BcmdzOlxuKHRoaXMuZnVuY19jb2RlPXRoaXMuJG1ldGgsdGhpcy50cCRjYWxsPXRoaXMuJGRlZmF1bHRDYWxsTWV0aG9kKX0scHJvdG86eyRmYXN0Q2FsbE5vS3dhcmdzKGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO3JldHVybiB0aGlzLiRtZXRoKGEpfSwkY2FsbE5vQXJncyhhLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuJG5hbWUsYSxjKTtyZXR1cm4gdGhpcy4kbWV0aCgpfSwkY2FsbE9uZUFyZyhhLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKHRoaXMuJG5hbWUsYSxjKTtyZXR1cm4gdGhpcy4kbWV0aChhWzBdKX0sJGNhbGxOYW1lZEFyZ3MoYSxjKXthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKHRoaXMuJG5hbWUsdGhpcy4kZmxhZ3MuTmFtZWRBcmdzLGEsYyx0aGlzLiRmbGFncy5EZWZhdWx0cyk7cmV0dXJuIHRoaXMuJG1ldGgoLi4uYSl9LCRjYWxsTWluQXJncyhhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy4kbmFtZSxjKTtcblNrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGEsdGhpcy4kZmxhZ3MuTWluQXJncyx0aGlzLiRmbGFncy5NYXhBcmdzKTtyZXR1cm4gdGhpcy4kbWV0aCguLi5hKX0sJGRlZmF1bHRDYWxsTWV0aG9kKGEsYyl7cmV0dXJuIG51bGwhPT10aGlzLiRzZWxmP1NrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsW3RoaXMuJHNlbGYsLi4uYV0sYyk6U2suYnVpbHRpbi5mdW5jLnByb3RvdHlwZS50cCRjYWxsLmNhbGwodGhpcyxhLGMpfSwkbWVtb2lzZUZsYWdzKCl7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUuJG1lbW9pc2VGbGFncy5jYWxsKHRoaXMpfSwkcmVzb2x2ZUFyZ3MoKXtyZXR1cm4gU2suYnVpbHRpbi5mdW5jLnByb3RvdHlwZS4kcmVzb2x2ZUFyZ3MuY2FsbCh0aGlzKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0ciwkcigpe3JldHVybiBudWxsPT09XG50aGlzLiRzZWxmP25ldyBTay5idWlsdGluLnN0cihcIjxidWlsdC1pbiBmdW5jdGlvbiBcIit0aGlzLiRuYW1lK1wiPlwiKTpuZXcgU2suYnVpbHRpbi5zdHIoXCI8YnVpbHQtaW4gbWV0aG9kIFwiK3RoaXMuJG5hbWUrXCIgb2YgXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy4kc2VsZikrXCIgb2JqZWN0PlwiKX0sdHAkY2FsbChhLGMpe3JldHVybiB0aGlzLnRwJGNhbGwoYSxjKX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihcIkVxXCIhPT1jJiZcIk5vdEVxXCIhPT1jfHwhKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNrX21ldGhvZCkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2E9dGhpcy4kc2VsZj09PWEuJHNlbGYmJnRoaXMubSRkZWYuJG1ldGg9PT1hLm0kZGVmLiRtZXRoO3JldHVyblwiRXFcIj09PWM/YTohYX19LGdldHNldHM6e19fbW9kdWxlX186eyRnZXQoKXtyZXR1cm4gdGhpcy4kbW9kdWxlfHxTay5idWlsdGluLm5vbmUubm9uZSR9LCRzZXQoYSl7dGhpcy4kbW9kdWxlPVxuYT1hfHxTay5idWlsdGluLm5vbmUubm9uZSR9fSxfX2RvY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJGRvYz9uZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kZG9jKTpTay5idWlsdGluLm5vbmUubm9uZSR9fSxfX25hbWVfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kbmFtZSl9fSxfX3RleHRfc2lnbmF0dXJlX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJHRleHRzaWcpfX0sX19zZWxmX186eyRnZXQoKXtyZXR1cm4gdGhpcy4kc2VsZnx8U2suc3lzTW9kdWxlcy5tcCRsb29rdXAodGhpcy4kbW9kdWxlKXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX19fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5ub25lPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOb25lVHlwZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LHNsb3RzOnt0cCRuZXcoYSxjKXtTay5hYnN0ci5jaGVja05vQXJncyhcIk5vbmVUeXBlXCIsXG5hLGMpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIk5vbmVcIil9LHRwJGFzX251bWJlcjohMCxuYiRib29sKCl7cmV0dXJuITF9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4ubm9uZS5ub25lJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4ubm9uZS5wcm90b3R5cGUse3Y6e3ZhbHVlOm51bGwsZW51bWVyYWJsZTohMH19KTtTay5idWlsdGluLk5vdEltcGxlbWVudGVkPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOb3RJbXBsZW1lbnRlZFR5cGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9LHNsb3RzOnskcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJOb3RJbXBsZW1lbnRlZFwiKX0sdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3MoXCJOb3RJbXBsZW1lbnRlZFR5cGVcIixcbmEsYyk7cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQucHJvdG90eXBlLHt2Ont2YWx1ZTpudWxsLGVudW1lcmFibGU6ITB9fSl9LGZ1bmN0aW9uKG0scSl7Y29uc3QgYT0vXig/OiguKT8oWzw+PVxcXl0pKT8oW1xcK1xcLVxcc10pPygjKT8oMCk/KFxcZCspPygsKT8oPzpcXC4oXFxkKykpPyhbYmNkZUVmRmdHbm9zeFglXSk/JC87U2suZm9ybWF0dGluZz17fTtsZXQgYz1mdW5jdGlvbihhLGIsYyxlKXtTay5hc3NlcnRzLmFzc2VydChcInN0cmluZ1wiPT09dHlwZW9mIGIpO2lmKGFbNl0pe3ZhciBkPXBhcnNlSW50KGFbNl0sMTApO2U9YVsyXXx8KGFbNV0/XCI9XCI6ZT9cIj5cIjpcIjxcIik7bGV0IGY9ZC0oYi5sZW5ndGgrKGM/Yy5sZW5ndGg6MCkpO1xuaWYoMD49ZilyZXR1cm4gYjtkPShhWzFdfHwoYVs1XT9cIjBcIjpcIiBcIikpLnJlcGVhdChmKTtzd2l0Y2goZSl7Y2FzZSBcIj1cIjppZihcInNcIj09PWFbOV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIic9JyBhbGlnbm1lbnQgbm90IGFsbG93ZWQgaW4gc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJcIik7cmV0dXJuIGMrZCtiO2Nhc2UgXCI+XCI6cmV0dXJuIGQrYytiO2Nhc2UgXCI8XCI6cmV0dXJuIGMrYitkO2Nhc2UgXCJeXCI6cmV0dXJuIGE9TWF0aC5mbG9vcihmLzIpLGQuc3Vic3RyaW5nKDAsYSkrYytiK2Quc3Vic3RyaW5nKGEpfX1yZXR1cm4gYytifSxiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/XCItXCI6XCIrXCI9PT1hWzNdP1wiK1wiOlwiIFwiPT09YVszXT9cIiBcIjpcIlwifSxlPWZ1bmN0aW9uKGEsZSxkKXtTay5hc3NlcnRzLmFzc2VydChlIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxlIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmcpO2lmKGFbOF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlByZWNpc2lvbiBub3QgYWxsb3dlZCBpbiBpbnRlZ2VyIGZvcm1hdFwiKTtcbmxldCBmPWUuc3RyJChkLCExKTtlPWUubmIkaXNuZWdhdGl2ZSgpO2U9YihhLGUpO2FbNF0mJigxNj09PWQ/ZSs9XCIweFwiOjg9PT1kP2UrPVwiMG9cIjoyPT09ZCYmKGUrPVwiMGJcIikpO1wiWFwiPT09YVs5XSYmKGY9Zi50b1VwcGVyQ2FzZSgpKTtcIm5cIj09PWFbOV0/Zj0oK2YpLnRvTG9jYWxlU3RyaW5nKCk6YVs3XSYmKGQ9Zi50b1N0cmluZygpLnNwbGl0KFwiLlwiKSxkWzBdPWRbMF0ucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZyxcIixcIiksZj1kLmpvaW4oXCIuXCIpKTtyZXR1cm4gYyhhLGYsZSwhMCl9LGY9ZnVuY3Rpb24oZixoLGQpe2lmKCFoKXJldHVybiBmLnN0ciQoMTAsITApO2g9aC5tYXRjaChhKTtpZighaCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSW52YWxpZCBmb3JtYXQgc3BlY2lmaWVyXCIpO3ZhciBnPWhbOV07Z3x8KGc9ZD9cImdcIjpcImRcIik7aWYoLTE9PShkP1wiZkZlRWdHJVwiOlwiYmNkb3hYbmZGZUVnRyVcIikuaW5kZXhPZihnKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiVW5rbm93biBmb3JtYXQgY29kZSAnXCIrXG5oWzldK1wiJyBmb3Igb2JqZWN0IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiJ1wiKTtzd2l0Y2goZyl7Y2FzZSBcImRcIjpjYXNlIFwiblwiOnJldHVybiBlKGgsZiwxMCk7Y2FzZSBcInhcIjpjYXNlIFwiWFwiOnJldHVybiBlKGgsZiwxNik7Y2FzZSBcIm9cIjpyZXR1cm4gZShoLGYsOCk7Y2FzZSBcImJcIjpyZXR1cm4gZShoLGYsMik7Y2FzZSBcImNcIjppZihoWzNdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJTaWduIG5vdCBhbGxvd2VkIHdpdGggaW50ZWdlciBmb3JtYXQgc3BlY2lmaWVyICdjJ1wiKTtpZihoWzRdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBbHRlcm5hdGUgZm9ybSBub3QgYWxsb3dlZCB3aXRoIGludGVnZXIgZm9ybWF0IHNwZWNpZmllciAnYydcIik7aWYoaFs3XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQ2Fubm90IHNwZWNpZnkgJywnIHdpdGggJ2MnXCIpO2lmKGhbOF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5ICcsJyB3aXRoICdjJ1wiKTtcbnJldHVybiBjKGgsU3RyaW5nLmZyb21Db2RlUG9pbnQoU2suYnVpbHRpbi5hc251bSQoZikpLFwiXCIsITApO2Nhc2UgXCJmXCI6Y2FzZSBcIkZcIjpjYXNlIFwiZVwiOmNhc2UgXCJFXCI6Y2FzZSBcImdcIjpjYXNlIFwiR1wiOntpZihoWzRdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBbHRlcm5hdGUgZm9ybSAoIykgbm90IGFsbG93ZWQgaW4gZmxvYXQgZm9ybWF0IHNwZWNpZmllclwiKTtkPVNrLmJ1aWx0aW4uYXNudW0kKGYpO1wic3RyaW5nXCI9PT10eXBlb2YgZCYmKGQ9TnVtYmVyKGQpKTtpZihJbmZpbml0eT09PWQpcmV0dXJuIGMoaCxcImluZlwiLFwiXCIsITApO2lmKC1JbmZpbml0eT09PWQpcmV0dXJuIGMoaCxcImluZlwiLFwiLVwiLCEwKTtpZihpc05hTihkKSlyZXR1cm4gYyhoLFwibmFuXCIsXCJcIiwhMCk7Zj0hMTswPmQmJihkPS1kLGY9ITApO3ZhciBsPVtcInRvRXhwb25lbnRpYWxcIixcInRvRml4ZWRcIixcInRvUHJlY2lzaW9uXCJdW1wiZWZnXCIuaW5kZXhPZihnLnRvTG93ZXJDYXNlKCkpXTtsZXQgYT1oWzhdP1xucGFyc2VJbnQoaFs4XSwxMCk6NjtkPWRbbF0oYSk7LTEhPT1cIkVGR1wiLmluZGV4T2YoZykmJihkPWQudG9VcHBlckNhc2UoKSk7aWYoXCJnXCI9PT1nLnRvTG93ZXJDYXNlKCl8fCFoWzldKXtpZihsPWQubWF0Y2goL1xcLihcXGQqWzEtOV0pPygwKykkLykpe2xldCBbLGEsYl09bDtkPWQuc2xpY2UoMCxhPy1iLmxlbmd0aDotKGIubGVuZ3RoKzEpKX0tMSE9ZC5pbmRleE9mKFwiLlwiKXx8aFs5XXx8KGQrPVwiLjBcIil9XCJlXCI9PT1nLnRvTG93ZXJDYXNlKCkmJihkPWQucmVwbGFjZSgvXihbLStdP1swLTldKlxcLj9bMC05XStbZUVdWy0rXT8pKFswLTldKT8kLyxcIiQxMCQyXCIpKTtoWzddJiYoZz1kLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpLGdbMF09Z1swXS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLFwiLFwiKSxkPWcuam9pbihcIi5cIikpO3JldHVybiBjKGgsZCxiKGgsZiksITApfWNhc2UgXCIlXCI6aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIHdpdGggZm9ybWF0IHNwZWNpZmllciAnJSdcIik7XG5mPVNrLmJ1aWx0aW4uYXNudW0kKGYpO1wic3RyaW5nXCI9PT10eXBlb2YgZiYmKGY9TnVtYmVyKGYpKTtpZihJbmZpbml0eT09PWYpcmV0dXJuIGMoaCxcImluZiVcIixcIlwiLCEwKTtpZigtSW5maW5pdHk9PT1mKXJldHVybiBjKGgsXCJpbmYlXCIsXCItXCIsITApO2lmKGlzTmFOKGYpKXJldHVybiBjKGgsXCJuYW4lXCIsXCJcIiwhMCk7Zz0hMTswPmYmJihmPS1mLGc9ITApO2Q9aFs4XT9wYXJzZUludChoWzhdLDEwKTo2O2Y9KDEwMCpmKS50b0ZpeGVkKGQpK1wiJVwiO3JldHVybiBjKGgsZixiKGgsZyksITApO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gZm9ybWF0IGNvZGUgJ1wiK2hbOV0rXCInXCIpO319O1NrLmZvcm1hdHRpbmcubWtOdW1iZXJfX2Zvcm1hdF9fPWE9PmZ1bmN0aW9uKGIpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZvcm1hdCgpIGFyZ3VtZW50IDIgbXVzdCBiZSBzdHIsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGIpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGYodGhpcyxiLiRqc3N0cigpLGEpKX07U2suZm9ybWF0dGluZy5mb3JtYXQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fFtdO2NvbnN0IGM9e307Zm9yKGxldCBhPTA7YTxiLmxlbmd0aDthKz0yKWNbYlthXV09YlthKzFdO2ZvcihsZXQgYiBpbiBhKWNbYl09YVtiXTtsZXQgZT0wO2E9dGhpcy52LnJlcGxhY2UoL3soKCg/OlxcZCspfCg/OlxcdyspKT8oKD86XFwuKFxcdyspKXwoPzpcXFsoKD86XFxkKyl8KD86XFx3KykpXFxdKT8pKT8oPzohKFtyc10pKT8oPzo6KFtefV0qKSk/fS9nLGZ1bmN0aW9uKGEsYixkLGYsZyxoLGwsQixELG0pe2xldCBrO2lmKHZvaWQgMCE9PWgmJlwiXCIhPT1oKWE9Y1tkXSxrPWEuY29uc3RydWN0b3I9PT1BcnJheT9hW2hdOi9eXFxkKyQvLnRlc3QoaCk/U2suYWJzdHIub2JqZWN0R2V0SXRlbShhLG5ldyBTay5idWlsdGluLmludF8ocGFyc2VJbnQoaCwxMCkpLCExKTpTay5hYnN0ci5vYmplY3RHZXRJdGVtKGEsXG5uZXcgU2suYnVpbHRpbi5zdHIoaCksITEpLGUrKztlbHNlIGlmKHZvaWQgMCE9PWcmJlwiXCIhPT1nKWs9U2suYWJzdHIuZ2F0dHIoY1tkfHxlKytdLG5ldyBTay5idWlsdGluLnN0cihnKSk7ZWxzZSBpZih2b2lkIDAhPT1kJiZcIlwiIT09ZClrPWNbZF07ZWxzZSBpZih2b2lkIDA9PT1ifHxcIlwiPT09YilrPWNbZV0sZSsrO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRffHxiIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmd8fC9eXFxkKyQvLnRlc3QoYikpaz1jW2JdLGUrKztpZihcInNcIj09PWwpaz1uZXcgU2suYnVpbHRpbi5zdHIoayk7ZWxzZSBpZihcInJcIj09PWwpaz1Tay5idWlsdGluLnJlcHIoayk7ZWxzZSBpZihcIlwiIT09bCYmdm9pZCAwIT09bCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiVW5rbm93biBjb252ZXJzaW9uIHNwZWNpZmllciBcIitsKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0Rm9ybWF0KGssXG5uZXcgU2suYnVpbHRpbi5zdHIoQikpLiRqc3N0cigpfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX07U2suZm9ybWF0dGluZy5mb3JtYXRTdHJpbmc9ZnVuY3Rpb24oYil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZm9ybWF0KCkgYXJndW1lbnQgMiBtdXN0IGJlIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpKTtiPWIuJGpzc3RyKCkubWF0Y2goYSk7aWYoYls5XSYmXCJzXCIhPT1iWzldKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJVbmtub3duIGZvcm1hdCBjb2RlICdcIitiWzldK1wiJyBmb3Igb2JqZWN0IG9mIHR5cGUgJ3N0cidcIik7aWYoYlszXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiU2lnbiBub3QgYWxsb3dlZCBpbiBzdHJpbmcgZm9ybWF0IHNwZWNpZmllclwiKTtpZihiWzRdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBbHRlcm5hdGUgZm9ybSAoIykgbm90IGFsbG93ZWQgd2l0aCBzdHJpbmcgZm9ybWF0IHNwZWNpZmllclwiKTtcbmlmKGJbN10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5ICcsJyB3aXRoICdzJ1wiKTtsZXQgZT10aGlzLnY7Yls4XSYmKGU9ZS5zdWJzdHJpbmcoMCxiWzhdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihjKGIsZSxcIlwiLCExKSl9fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSl7bGV0IGI7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyliPWEuY2hhckF0KGQpLGsudGVzdChiKT9jLnB1c2goYik6XCJcXFxcMDAwXCI9PT1iP2MucHVzaChcIlxcXFwwMDBcIik6Yy5wdXNoKFwiXFxcXFwiK2IpO3JldHVybiBjLmpvaW4oXCJcIil9ZnVuY3Rpb24gYyhhLGIsYyl7Yj1Tay5idWlsdGluLmNoZWNrTm9uZShiKT9udWxsOmEuZ2V0JHRndChiKTtpZihudWxsIT09YiYmIWIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJlbXB0eSBzZXBhcmF0b3JcIik7YT1hLnY7dmFyIGQ9MDtpZihudWxsPT09Yil7dmFyIGU9L1tcXHNcXHhhMF0rL2c7XG5kPWEubGVuZ3RoO2E9YS5yZXBsYWNlKHUsXCJcIik7ZC09YS5sZW5ndGh9ZWxzZSBlPWIucmVwbGFjZShwLFwiXFxcXCQxXCIpLGU9bmV3IFJlZ0V4cChlLFwiZ1wiKTtjb25zdCBmPVtdO2xldCBnPTAsaz0wLGg7Zm9yKGM9MD5jP0luZmluaXR5OmM7bnVsbCE9KGg9ZS5leGVjKGEpKSYmazxjJiZoLmluZGV4IT09ZS5sYXN0SW5kZXg7KWYucHVzaChnK2QpLGYucHVzaChoLmluZGV4K2QpLGc9ZS5sYXN0SW5kZXgsays9MTtpZihudWxsIT09Ynx8YS5sZW5ndGgtZylmLnB1c2goZytkKSxmLnB1c2goYS5sZW5ndGgrZCk7cmV0dXJuIGZ9ZnVuY3Rpb24gYihiLGMpe3JldHVybiBmdW5jdGlvbihkKXtpZih2b2lkIDA9PT1kfHxTay5idWlsdGluLmNoZWNrTm9uZShkKSlkPWI7ZWxzZSBpZihkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpZD1hKGQudiksZD1uZXcgUmVnRXhwKGMoZCksXCJnXCIpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3RyaXAgYXJnIG11c3QgYmUgTm9uZSBvciBzdHJcIik7XG5yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5yZXBsYWNlKGQsXCJcIikpfX1mdW5jdGlvbiBlKGEpe3JldHVybiBmdW5jdGlvbihiKXtiPXRoaXMuZ2V0JHRndChiKTtjb25zdCBjPXRoaXMudjtsZXQgZDtpZihhKXtpZihkPWMubGFzdEluZGV4T2YoYiksMD5kKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpLG5ldyBTay5idWlsdGluLnN0cihcIlwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYyldKX1lbHNlIGlmKGQ9Yy5pbmRleE9mKGIpLDA+ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihjKSxuZXcgU2suYnVpbHRpbi5zdHIoXCJcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoYy5zdWJzdHJpbmcoMCxkKSksbmV3IFNrLmJ1aWx0aW4uc3RyKGIpLG5ldyBTay5idWlsdGluLnN0cihjLnN1YnN0cmluZyhkK2IubGVuZ3RoKSldKX19XG5mdW5jdGlvbiBmKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7Yz1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYyxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKHZvaWQgMD09PWQpZD1cIiBcIjtlbHNlIGlmKGQgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0ciYmMT09PWQuc3EkbGVuZ3RoKCkpZD1kLnY7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0aGUgZmlsbCBjaGFyYWN0ZXIgbXVzdCBiZSBhIHN0ciBvZiBsZW5ndGggMVwiKTtjb25zdCBlPXRoaXMuc3EkbGVuZ3RoKCk7bGV0IGY7aWYoZT49YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudik7aWYoYilyZXR1cm4gZj1kLnJlcGVhdChNYXRoLmZsb29yKChjLWUpLzIpKSxmPWYrdGhpcy52K2YsKGMtZSklMiYmKGYrPWQpLG5ldyBTay5idWlsdGluLnN0cihmKTtmPWQucmVwZWF0KGMtZSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhP2YrdGhpcy52OnRoaXMuditmKX19ZnVuY3Rpb24gbChhLFxuYixjKXsoe3N0YXJ0OmIsZW5kOmN9PVNrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0KGEsYixjKSk7aWYoYS4kaGFzQXN0cmFsQ29kZVBvaW50cygpKXtjb25zdCBkPWEuY29kZXBvaW50c1tiXTtiPXZvaWQgMD09PWQ/YithLnYubGVuZ3RoLWEuY29kZXBvaW50cy5sZW5ndGg6ZDtjPWEuY29kZXBvaW50c1tjXTtjPXZvaWQgMD09PWM/YS52Lmxlbmd0aDpjfXJldHVybntzdGFydDpiLGVuZDpjfX1mdW5jdGlvbiBoKGEpe3JldHVybiBmdW5jdGlvbihiLGMsZCl7Yj10aGlzLmdldCR0Z3QoYik7KHtzdGFydDpjLGVuZDpkfT1sKHRoaXMsYyxkKSk7aWYoZDxjKXJldHVybi0xO2QtPWIubGVuZ3RoO2I9YT90aGlzLnYubGFzdEluZGV4T2YoYixkKTp0aGlzLnYuaW5kZXhPZihiLGMpO2I9Yj49YyYmYjw9ZD9iOi0xO2lmKHRoaXMuY29kZXBvaW50cyl7ZD10aGlzLnNxJGxlbmd0aCgpO2M9LTE7Zm9yKGxldCBhPTA7YTxkO2ErKyliPT10aGlzLmNvZGVwb2ludHNbYV0mJihjPWEpfWVsc2UgYz1cbmI7cmV0dXJuIGN9fWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyxkLGUpe2lmKCEoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyfHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIgZmlyc3QgYXJnIG11c3QgYmUgc3RyIG9yIGEgdHVwbGUgb2Ygc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpOyh7c3RhcnQ6ZCxlbmQ6ZX09bCh0aGlzLGQsZSkpO2lmKGQ+ZSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtkPXRoaXMudi5zbGljZShkLGUpO2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKXtmb3IobGV0IGU9U2suYWJzdHIuaXRlcihjKSxmPWUudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1mO2Y9ZS50cCRpdGVybmV4dCgpKXtpZighKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHVwbGUgZm9yIFwiK2ErXCIgbXVzdCBvbmx5IGNvbnRhaW4gc3RyLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShmKSk7aWYoYihkLGYudikpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJH1yZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJH1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChiKGQsYy52KSl9fXZhciBnPS9eWzAtOSEjX10vLG49T2JqZWN0LmNyZWF0ZShudWxsKTtTay5idWlsdGluLnN0cj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3RyXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cixcImJhZCBjYWxsIHRvIHN0ciAtIHVzZSAnbmV3J1wiKTtpZihcInN0cmluZ1wiIT09dHlwZW9mIGEpaWYodm9pZCAwPT09YSlhPVwiXCI7ZWxzZSBpZihudWxsPT09YSlhPVwiTm9uZVwiO2Vsc2V7aWYodm9pZCAwIT09YS50cCRzdHIpcmV0dXJuIGEudHAkc3RyKCk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWE9TnVtYmVyLmlzRmluaXRlKGEpP1N0cmluZyhhKTpTdHJpbmcoYSkucmVwbGFjZShcIkluZmluaXR5XCIsXG5cImluZlwiKS5yZXBsYWNlKFwiTmFOXCIsXCJuYW5cIik7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb3VsZCBub3QgY29udmVydCBvYmplY3Qgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIHRvIHN0clwiKTt9dmFyIGI9blthXTtpZih2b2lkIDAhPT1iKXJldHVybiBiO25bYV09dGhpcztiPXZvaWQgMD09PXRbYV0/YTphK1wiXyRydyRcIjt0aGlzLiRtYW5nbGVkPWI7dGhpcy4kc2F2ZWRLZXlIYXNoPWEucmVwbGFjZShnLFwiISQmXCIpO3RoaXMudj1hfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRkb2M6XCJzdHIob2JqZWN0PScnKSAtPiBzdHJcXG5zdHIoYnl0ZXNfb3JfYnVmZmVyWywgZW5jb2RpbmdbLCBlcnJvcnNdXSkgLT4gc3RyXFxuXFxuQ3JlYXRlIGEgbmV3IHN0cmluZyBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0LiBJZiBlbmNvZGluZyBvclxcbmVycm9ycyBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIG9iamVjdCBtdXN0IGV4cG9zZSBhIGRhdGEgYnVmZmVyXFxudGhhdCB3aWxsIGJlIGRlY29kZWQgdXNpbmcgdGhlIGdpdmVuIGVuY29kaW5nIGFuZCBlcnJvciBoYW5kbGVyLlxcbk90aGVyd2lzZSwgcmV0dXJucyB0aGUgcmVzdWx0IG9mIG9iamVjdC5fX3N0cl9fKCkgKGlmIGRlZmluZWQpXFxub3IgcmVwcihvYmplY3QpLlxcbmVuY29kaW5nIGRlZmF1bHRzIHRvIHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKS5cXG5lcnJvcnMgZGVmYXVsdHMgdG8gJ3N0cmljdCcuXCIsXG50cCRuZXcoYSxiKXtiPWJ8fFtdO2lmKHRoaXMhPT1Tay5idWlsdGluLnN0ci5wcm90b3R5cGUpcmV0dXJuIHRoaXMuJHN1YnR5cGVfbmV3KGEsYik7aWYoMT49YS5sZW5ndGgmJiFiLmxlbmd0aClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGFbMF0pO2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMyl7Y29uc3QgW2MsZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcInN0clwiLFtcIm9iamVjdFwiLFwiZW5jb2RpbmdcIixcImVycm9yc1wiXSxhLGIpO2lmKHZvaWQgMD09PWN8fHZvaWQgMD09PWQmJnZvaWQgMD09PWUpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihjKTtTay5idWlsdGluLmJ5dGVzLmNoZWNrJGVuY29kZUFyZ3MoXCJzdHJcIixkLGUpO2lmKCFTay5idWlsdGluLmNoZWNrQnl0ZXMoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVjb2RpbmcgdG8gc3RyOiBuZWVkIGEgYnl0ZXMtbGlrZSBvYmplY3QsIFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiIGZvdW5kXCIpO1xucmV0dXJuIFNrLmJ1aWx0aW4uYnl0ZXMuJGRlY29kZS5jYWxsKGMsZCxlKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHIgdGFrZXMgYXQgbW9zdCBvbmUgYXJndW1lbnQgKFwiKyhhLmxlbmd0aCtiLmxlbmd0aCkrXCIgZ2l2ZW4pXCIpO30sJHIoKXtsZXQgYT1cIidcIjstMSE9PXRoaXMudi5pbmRleE9mKFwiJ1wiKSYmLTE9PT10aGlzLnYuaW5kZXhPZignXCInKSYmKGE9J1wiJyk7Y29uc3QgYj10aGlzLnYubGVuZ3RoO2xldCBjPWE7Zm9yKGxldCBmPTA7ZjxiO2YrKyl7dmFyIGQ9dGhpcy52LmNoYXJBdChmKTt2YXIgZT10aGlzLnYuY2hhckNvZGVBdChmKTtkPT09YXx8XCJcXFxcXCI9PT1kP2MrPVwiXFxcXFwiK2Q6XCJcXHRcIj09PWQ/Yys9XCJcXFxcdFwiOlwiXFxuXCI9PT1kP2MrPVwiXFxcXG5cIjpcIlxcclwiPT09ZD9jKz1cIlxcXFxyXCI6KDI1NTxlJiY1NTI5Nj5lfHw1NzM0NDw9ZSkmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yys9XCJcXFxcdVwiKyhcIjAwMFwiK2UudG9TdHJpbmcoMTYpKS5zbGljZSgtNCk6NTUyOTY8PWUmJlxuIVNrLl9fZnV0dXJlX18ucHl0aG9uMz8oZD10aGlzLnYuY29kZVBvaW50QXQoZiksZisrLGQ9ZC50b1N0cmluZygxNiksZT1cIjAwMDAwMDBcIitkLnRvU3RyaW5nKDE2KSxjPTQ8ZC5sZW5ndGg/YysoXCJcXFxcVVwiK2Uuc2xpY2UoLTgpKTpjKyhcIlxcXFx1XCIrZS5zbGljZSgtNCkpKToyNTU8ZSYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMz9jKz1cIlxcXFx1ZmZmZFwiOlwiIFwiPmR8fDEyNzw9ZSYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMz8oZD1kLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLDI+ZC5sZW5ndGgmJihkPVwiMFwiK2QpLGMrPVwiXFxcXHhcIitkKTpjKz1kfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYythKX0sdHAkc3RyKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnN0cj90aGlzOm5ldyBTay5idWlsdGluLnN0cih0aGlzLnYpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBBKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7XG5zd2l0Y2goYil7Y2FzZSBcIkx0XCI6cmV0dXJuIHRoaXMudjxhLnY7Y2FzZSBcIkx0RVwiOnJldHVybiB0aGlzLnY8PWEudjtjYXNlIFwiRXFcIjpyZXR1cm4gdGhpcy52PT09YS52O2Nhc2UgXCJOb3RFcVwiOnJldHVybiB0aGlzLnYhPT1hLnY7Y2FzZSBcIkd0XCI6cmV0dXJuIHRoaXMudj5hLnY7Y2FzZSBcIkd0RVwiOnJldHVybiB0aGlzLnY+PWEudn19LG1wJHN1YnNjcmlwdChhKXtsZXQgYjtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Yj10aGlzLnNxJGxlbmd0aCgpOzA+YSYmKGErPWIpO2lmKDA+YXx8YT49Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFwic3RyaW5nIGluZGV4IG91dCBvZiByYW5nZVwiKTtyZXR1cm4gdGhpcy5jb2RlcG9pbnRzP25ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyaW5nKHRoaXMuY29kZXBvaW50c1thXSx0aGlzLmNvZGVwb2ludHNbYSsxXSkpOlxubmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5jaGFyQXQoYSkpfWlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNsaWNlKXtsZXQgYz1cIlwiO2I9dGhpcy5zcSRsZW5ndGgoKTt0aGlzLmNvZGVwb2ludHM/YS5zc3NpdGVyJChiLGE9PntjKz10aGlzLnYuc3Vic3RyaW5nKHRoaXMuY29kZXBvaW50c1thXSx0aGlzLmNvZGVwb2ludHNbYSsxXSl9KTphLnNzc2l0ZXIkKGIsYT0+e2MrPXRoaXMudi5jaGFyQXQoYSl9KTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInN0cmluZyBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy4kaGFzQXN0cmFsQ29kZVBvaW50cygpP3RoaXMuY29kZXBvaW50cy5sZW5ndGg6dGhpcy52Lmxlbmd0aH0sc3EkY29uY2F0KGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW5ub3QgY29uY2F0ZW5hdGUgJ3N0cicgYW5kICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3RzXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52K2Eudil9LHNxJHJlcGVhdChhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoYSp0aGlzLnYubGVuZ3RoPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7bGV0IGI9XCJcIjtmb3IobGV0IGM9MDtjPGE7YysrKWIrPXRoaXMudjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGIpfSxzcSRjb250YWlucyhhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ2luIDxzdHJpbmc+JyByZXF1aXJlcyBzdHJpbmcgYXMgbGVmdCBvcGVyYW5kIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpKTtyZXR1cm4tMSE9PXRoaXMudi5pbmRleE9mKGEudil9LHRwJGFzX251bWJlcjohMCxuYiRyZW1haW5kZXI6ZnVuY3Rpb24oYSl7dmFyIGI7Y29uc3QgYz10aGlzLnNrJGJ1aWx0aW5CYXNlO2EuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnR1cGxlfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tYXBwaW5ncHJveHl8fChhPW5ldyBTay5idWlsdGluLnR1cGxlKFthXSkpO3ZhciBkPTA7dmFyIGU9dGhpcy4kanNzdHIoKS5yZXBsYWNlKC8lKFxcKFthLXpBLVowLTldK1xcKSk/KFsjMCArXFwtXSspPyhcXCp8WzAtOV0rKT8oXFwuKFxcKnxbMC05XSspKT9baGxMXT8oW2Rpb3V4WGVFZkZnR2Nyc2IlXSkvZyxmdW5jdGlvbihlLGYsZyxrLGgsbCxwKXt2YXIgbixCLEEsdixMO2s9U2suYnVpbHRpbi5hc251bSQoayk7aD1Tay5idWlsdGluLmFzbnVtJChoKTt2b2lkIDAhPT1mJiZcIlwiIT09Znx8XCIlXCI9PXB8fChuPVxuZCsrKTtcIlwiPT09aCYmKGg9dm9pZCAwKTt2YXIgdD1CPUE9dj1MPSExO2cmJigtMSE9PWcuaW5kZXhPZihcIi1cIik/dj0hMDotMSE9PWcuaW5kZXhPZihcIjBcIikmJihMPSEwKSwtMSE9PWcuaW5kZXhPZihcIitcIik/Qj0hMDotMSE9PWcuaW5kZXhPZihcIiBcIikmJihBPSEwKSx0PS0xIT09Zy5pbmRleE9mKFwiI1wiKSk7aCYmKGg9cGFyc2VJbnQoaC5zdWJzdHIoMSksMTApKTtnPWZ1bmN0aW9uKGEsYil7dmFyIGM7Yj1Tay5idWlsdGluLmFzbnVtJChiKTt2YXIgZD0hMTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpezA+YSYmKGE9LWEsZD0hMCk7dmFyIGU9YS50b1N0cmluZyhiKX1lbHNlIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0Xz8oZT1hLnN0ciQoYiwhMSksMjxlLmxlbmd0aCYmXCIuMFwiPT09ZS5zdWJzdHIoLTIpJiYoZT1lLnN1YnN0cigwLGUubGVuZ3RoLTIpKSxkPWEubmIkaXNuZWdhdGl2ZSgpKTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfPyhlPWEuc3RyJChiLCExKSxkPVxuYS5uYiRpc25lZ2F0aXZlKCkpOmEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZyYmKGU9YS5zdHIkKGIsITEpLGQ9YS5uYiRpc25lZ2F0aXZlKCkpO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWUsXCJ1bmhhbmRsZWQgbnVtYmVyIGZvcm1hdFwiKTthPSExO2lmKGgpZm9yKGM9ZS5sZW5ndGg7YzxoOysrYyllPVwiMFwiK2UsYT0hMDtjPVwiXCI7ZD9jPVwiLVwiOkI/Yz1cIitcIitjOkEmJihjPVwiIFwiK2MpO3QmJigxNj09PWI/Yys9XCIweFwiOjghPT1ifHxhfHxcIjBcIj09PWV8fChjKz1cIjBcIikpO3JldHVybltjLGVdfTtlPWZ1bmN0aW9uKGEpe3ZhciBiPWFbMF07YT1hWzFdO2lmKGspe2s9cGFyc2VJbnQoaywxMCk7dmFyIGM9YS5sZW5ndGgrYi5sZW5ndGg7aWYoTClmb3IoO2M8azsrK2MpYT1cIjBcIithO2Vsc2UgaWYodil7Zm9yKDtjPGs7KytjKWErPVwiIFwiO1NrLl9fZnV0dXJlX18ucHl0aG9uMyYmKGErPWIsYj1cIlwiKX1lbHNlIGZvcig7YzxrOysrYyliPVwiIFwiK2J9cmV0dXJuIGIrYX07aWYoYS5jb25zdHJ1Y3Rvcj09PVxuU2suYnVpbHRpbi50dXBsZSlmPWEudltuXTtlbHNlIGlmKHZvaWQgMCE9PWEubXAkc3Vic2NyaXB0JiZ2b2lkIDAhPT1mKWY9Zi5zdWJzdHJpbmcoMSxmLmxlbmd0aC0xKSxmPWEubXAkc3Vic2NyaXB0KG5ldyBjKGYpKTtlbHNlIGlmKGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmRpY3R8fGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmxpc3QpZj1hO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoYS50cCRuYW1lK1wiIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJ21wJHN1YnNjcmlwdCdcIik7aWYoXCJkXCI9PT1wfHxcImlcIj09PXApe3ZhciB1PWcoZiwxMCk7aWYodm9pZCAwPT09dVsxXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCIlXCIrcCtcIiBmb3JtYXQ6IGEgbnVtYmVyIGlzIHJlcXVpcmVkLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoZikpO3A9dVsxXTt1WzFdPS0xIT09cC5pbmRleE9mKFwiLlwiKT9wYXJzZUludChwLDEwKS50b1N0cmluZygpOlxucDtyZXR1cm4gZSh1KX1pZihcIm9cIj09PXApcmV0dXJuIGUoZyhmLDgpKTtpZihcInhcIj09PXApcmV0dXJuIGUoZyhmLDE2KSk7aWYoXCJYXCI9PT1wKXJldHVybiBlKGcoZiwxNikpLnRvVXBwZXJDYXNlKCk7aWYoXCJmXCI9PT1wfHxcIkZcIj09PXB8fFwiZVwiPT09cHx8XCJFXCI9PT1wfHxcImdcIj09PXB8fFwiR1wiPT09cCl7dT1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIHUmJih1PU51bWJlcih1KSk7aWYoSW5maW5pdHk9PT11KXJldHVyblwiaW5mXCI7aWYoLUluZmluaXR5PT09dSlyZXR1cm5cIi1pbmZcIjtpZihpc05hTih1KSlyZXR1cm5cIm5hblwiO249W1widG9FeHBvbmVudGlhbFwiLFwidG9GaXhlZFwiLFwidG9QcmVjaXNpb25cIl1bXCJlZmdcIi5pbmRleE9mKHAudG9Mb3dlckNhc2UoKSldO2lmKHZvaWQgMD09PWh8fFwiXCI9PT1oKWlmKFwiZVwiPT09cHx8XCJFXCI9PT1wKWg9NjtlbHNlIGlmKFwiZlwiPT09cHx8XCJGXCI9PT1wKWg9U2suX19mdXR1cmVfXy5weXRob24zPzY6NztuPXVbbl0oaCk7U2suYnVpbHRpbi5jaGVja0Zsb2F0KGYpJiZcbjA9PT11JiYtSW5maW5pdHk9PT0xL3UmJihuPVwiLVwiK24pO1NrLl9fZnV0dXJlX18ucHl0aG9uMyYmKDc8PW4ubGVuZ3RoJiZcIjAuMDAwMFwiPT1uLnNsaWNlKDAsNikmJihiPXBhcnNlRmxvYXQobiksbj1iLnRvRXhwb25lbnRpYWwoKSksXCItXCI9PW4uY2hhckF0KG4ubGVuZ3RoLTIpJiYobj1uLnNsaWNlKDAsbi5sZW5ndGgtMSkrXCIwXCIrbi5jaGFyQXQobi5sZW5ndGgtMSkpKTstMSE9PVwiRUZHXCIuaW5kZXhPZihwKSYmKG49bi50b1VwcGVyQ2FzZSgpKTtyZXR1cm4gZShbXCJcIixuXSl9aWYoXCJjXCI9PT1wKXtpZihcIm51bWJlclwiPT09dHlwZW9mIGYpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZik7aWYoZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8ZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGYudik7aWYoZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGYuc3RyJCgxMCxcbiExKVswXSk7aWYoZi5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uc3RyKXJldHVybiBmLnYuc3Vic3RyKDAsMSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTt9aWYoXCJyXCI9PT1wKXJldHVybiBwPVNrLmJ1aWx0aW4ucmVwcihmKSxoP3Audi5zdWJzdHIoMCxoKTpwLnY7aWYoXCJzXCI9PT1wJiZjPT09U2suYnVpbHRpbi5zdHIpe3A9bmV3IFNrLmJ1aWx0aW4uc3RyKGYpO3A9cC4kanNzdHIoKTtpZihoKXJldHVybiBwLnN1YnN0cigwLGgpO2smJihwPWUoW1wiIFwiLHBdKSk7cmV0dXJuIHB9aWYoXCJiXCI9PT1wfHxcInNcIj09PXApe2lmKGM9PT1Tay5idWlsdGluLnN0cil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwidW5zdXBwb3J0ZWQgZm9ybWF0IGNoYXJhY3RlciAnYidcIik7aWYoIShmIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcykmJnZvaWQgMD09PSh1PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoZixTay5idWlsdGluLnN0ci4kYnl0ZXMpKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCIlYiByZXF1aXJlcyBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCBvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIF9fYnl0ZXNfXywgbm90ICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGYpK1wiJ1wiKTt2b2lkIDAhPT11JiYoZj1uZXcgU2suYnVpbHRpbi5ieXRlcyhmKSk7cD1mLiRqc3N0cigpO2lmKGgpcmV0dXJuIHAuc3Vic3RyKDAsaCk7ayYmKHA9ZShbXCIgXCIscF0pKTtyZXR1cm4gcH1pZihcIiVcIj09PXApcmV0dXJuXCIlXCJ9KTtyZXR1cm4gbmV3IGMoZSl9fSxwcm90bzp7dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy52fSwkc3VidHlwZV9uZXcoYSxiKXtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2E9U2suYnVpbHRpbi5zdHIucHJvdG90eXBlLnRwJG5ldyhhLGIpO2MuJG1hbmdsZWQ9YS4kbWFuZ2xlZDtjLiRzYXZlZEtleUhhc2g9YS4kc2F2ZWRLZXlIYXNoO2Mudj1hLnY7cmV0dXJuIGN9LCRqc3N0cigpe3JldHVybiB0aGlzLnZ9LCRoYXNBc3RyYWxDb2RlUG9pbnRzKCl7aWYobnVsbD09PXRoaXMuY29kZXBvaW50cylyZXR1cm4hMTtpZih2b2lkIDAhPT10aGlzLmNvZGVwb2ludHMpcmV0dXJuITA7Zm9yKHZhciBhPTA7YTx0aGlzLnYubGVuZ3RoO2ErKyl7bGV0IGI9XG50aGlzLnYuY2hhckNvZGVBdChhKTtpZig1NTI5Njw9YiYmNTczNDQ+Yil7dGhpcy5jb2RlcG9pbnRzPVtdO2ZvcihhPTA7YTx0aGlzLnYubGVuZ3RoO2ErKyl0aGlzLmNvZGVwb2ludHMucHVzaChhKSxiPXRoaXMudi5jaGFyQ29kZUF0KGEpLDU1Mjk2PD1iJiY1NjMyMD5iJiZhKys7cmV0dXJuITB9fXRoaXMuY29kZXBvaW50cz1udWxsO3JldHVybiExfSxzayRhc2FycmF5KCl7Y29uc3QgYT1bXTtpZih0aGlzLiRoYXNBc3RyYWxDb2RlUG9pbnRzKCkpe3ZhciBiPXRoaXMuY29kZXBvaW50cztmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zdWJzdHJpbmcoYltjXSxiW2MrMV0pKSl9ZWxzZSBmb3IoYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnZbYl0pKTtyZXR1cm4gYX0sZmluZCRsZWZ0OmgoITEpLGZpbmQkcmlnaHQ6aCghMCksZ2V0JHRndChhKXtpZihhIGluc3RhbmNlb2ZcblNrLmJ1aWx0aW4uc3RyKXJldHVybiBhLnY7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYSBzdHIgaW5zdGFuY2UgaXMgcmVxdWlyZWQgbm90ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fX0sbWV0aG9kczp7ZW5jb2RlOnskbWV0aDpmdW5jdGlvbihhLGIpeyh7ZW5jb2Rpbmc6YSxlcnJvcnM6Yn09U2suYnVpbHRpbi5ieXRlcy5jaGVjayRlbmNvZGVBcmdzKFwiZW5jb2RlXCIsYSxiKSk7YT1Tay5idWlsdGluLmJ5dGVzLnN0ciRlbmNvZGUodGhpcyxhLGIpO3JldHVybiBTay5fX2Z1dHVyZV9fLnB5dGhvbjM/YTpuZXcgU2suYnVpbHRpbi5zdHIoYS4kanNzdHIoKSl9LCRmbGFnczp7TmFtZWRBcmdzOltcImVuY29kaW5nXCIsXCJlcnJvcnNcIl19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBlbmNvZGluZz0ndXRmLTgnLCBlcnJvcnM9J3N0cmljdCcpXCIsJGRvYzpcIkVuY29kZSB0aGUgc3RyaW5nIHVzaW5nIHRoZSBjb2RlYyByZWdpc3RlcmVkIGZvciBlbmNvZGluZy5cXG5cXG4gIGVuY29kaW5nXFxuICAgIFRoZSBlbmNvZGluZyBpbiB3aGljaCB0byBlbmNvZGUgdGhlIHN0cmluZy5cXG4gIGVycm9yc1xcbiAgICBUaGUgZXJyb3IgaGFuZGxpbmcgc2NoZW1lIHRvIHVzZSBmb3IgZW5jb2RpbmcgZXJyb3JzLlxcbiAgICBUaGUgZGVmYXVsdCBpcyAnc3RyaWN0JyBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGFcXG4gICAgVW5pY29kZUVuY29kZUVycm9yLiAgT3RoZXIgcG9zc2libGUgdmFsdWVzIGFyZSAnaWdub3JlJywgJ3JlcGxhY2UnIGFuZFxcbiAgICAneG1sY2hhcnJlZnJlcGxhY2UnIGFzIHdlbGwgYXMgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJlZCB3aXRoXFxuICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvciB0aGF0IGNhbiBoYW5kbGUgVW5pY29kZUVuY29kZUVycm9ycy5cIn0sXG5yZXBsYWNlOnskbWV0aChiLGMsZCl7Yj10aGlzLmdldCR0Z3QoYik7Yz10aGlzLmdldCR0Z3QoYyk7ZD12b2lkIDA9PT1kPy0xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChkLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Yj1uZXcgUmVnRXhwKGEoYiksXCJnXCIpO2lmKDA+ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5yZXBsYWNlKGIsYykpO2xldCBlPTA7Yj10aGlzLnYucmVwbGFjZShiLGE9PmUrKzxkP2M6YSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkc2VsZiwgb2xkLCBuZXcsIGNvdW50PS0xLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IHdpdGggYWxsIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyBvbGQgcmVwbGFjZWQgYnkgbmV3LlxcblxcbiAgY291bnRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgdG8gcmVwbGFjZS5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcy5cXG5cXG5JZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgY291bnQgaXMgZ2l2ZW4sIG9ubHkgdGhlIGZpcnN0IGNvdW50IG9jY3VycmVuY2VzIGFyZVxcbnJlcGxhY2VkLlwifSxcbnNwbGl0OnskbWV0aDpmdW5jdGlvbihhLGIpe2I9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGIsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTthPWModGhpcyxhLGIpO2I9W107Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyaW5nKGFbY10sYVsrK2NdKSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyBzZXAgYXMgdGhlIGRlbGltaXRlciBzdHJpbmcuXFxuXFxuICBzZXBcXG4gICAgVGhlIGRlbGltaXRlciBhY2NvcmRpbmcgd2hpY2ggdG8gc3BsaXQgdGhlIHN0cmluZy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IGFjY29yZGluZyB0byBhbnkgd2hpdGVzcGFjZSxcXG4gICAgYW5kIGRpc2NhcmQgZW1wdHkgc3RyaW5ncyBmcm9tIHRoZSByZXN1bHQuXFxuICBtYXhzcGxpdFxcbiAgICBNYXhpbXVtIG51bWJlciBvZiBzcGxpdHMgdG8gZG8uXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgbm8gbGltaXQuXCJ9LFxucnNwbGl0OnskbWV0aDpmdW5jdGlvbihhLGIpe2I9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGIsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTthPWModGhpcyxhLC0xKTt2YXIgZD0wPmI/MDoyKihhLmxlbmd0aC8yLWIpO2I9W107Zm9yKDA+PWQ/ZD0wOmIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnNsaWNlKDAsYVtkLTFdKSkpO2Q8YS5sZW5ndGg7ZCsrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cmluZyhhW2RdLGFbKytkXSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wic2VwXCIsXCJtYXhzcGxpdFwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLC0xXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcIiwkZG9jOlwiUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgc2VwIGFzIHRoZSBkZWxpbWl0ZXIgc3RyaW5nLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBzdHJpbmcuXFxuICAgIE5vbmUgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBzcGxpdCBhY2NvcmRpbmcgdG8gYW55IHdoaXRlc3BhY2UsXFxuICAgIGFuZCBkaXNjYXJkIGVtcHR5IHN0cmluZ3MgZnJvbSB0aGUgcmVzdWx0LlxcbiAgbWF4c3BsaXRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygc3BsaXRzIHRvIGRvLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIG5vIGxpbWl0LlxcblxcblNwbGl0cyBhcmUgZG9uZSBzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgYW5kIHdvcmtpbmcgdG8gdGhlIGZyb250LlwifSxcbmpvaW46eyRtZXRoKGEpe2NvbnN0IGI9W107cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcXVlbmNlIGl0ZW0gXCIrYi5sZW5ndGgrXCI6IGV4cGVjdGVkIHN0ciwgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgZm91bmRcIik7Yi5wdXNoKGEudil9KSwoKT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGIuam9pbih0aGlzLnYpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgaXRlcmFibGUsIC8pXCIsJGRvYzpcIkNvbmNhdGVuYXRlIGFueSBudW1iZXIgb2Ygc3RyaW5ncy5cXG5cXG5UaGUgc3RyaW5nIHdob3NlIG1ldGhvZCBpcyBjYWxsZWQgaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbiBlYWNoIGdpdmVuIHN0cmluZy5cXG5UaGUgcmVzdWx0IGlzIHJldHVybmVkIGFzIGEgbmV3IHN0cmluZy5cXG5cXG5FeGFtcGxlOiAnLicuam9pbihbJ2FiJywgJ3BxJywgJ3JzJ10pIC0+ICdhYi5wcS5ycydcIn0sXG5jYXBpdGFsaXplOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3RoaXMudi5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjYXBpdGFsaXplZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuXFxuXFxuTW9yZSBzcGVjaWZpY2FsbHksIG1ha2UgdGhlIGZpcnN0IGNoYXJhY3RlciBoYXZlIHVwcGVyIGNhc2UgYW5kIHRoZSByZXN0IGxvd2VyXFxuY2FzZS5cIn0sdGl0bGU6eyRtZXRoOmZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLnYucmVwbGFjZSgvW2Etel1bYS16XSovZ2ksYT0+YVswXS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoZXJlIGVhY2ggd29yZCBpcyB0aXRsZWNhc2VkLlxcblxcbk1vcmUgc3BlY2lmaWNhbGx5LCB3b3JkcyBzdGFydCB3aXRoIHVwcGVyY2FzZWQgY2hhcmFjdGVycyBhbmQgYWxsIHJlbWFpbmluZ1xcbmNhc2VkIGNoYXJhY3RlcnMgaGF2ZSBsb3dlciBjYXNlLlwifSxcbmNlbnRlcjp7JG1ldGg6ZighMSwhMCksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIGZpbGxjaGFyPScgJywgLylcIiwkZG9jOlwiUmV0dXJuIGEgY2VudGVyZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sY291bnQ6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZ2V0JHRndChhKTsoe3N0YXJ0OmIsZW5kOmN9PWwodGhpcyxiLGMpKTtpZihjPGIpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oMCk7YT1hLnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLFwiXFxcXCQmXCIpO2E9bmV3IFJlZ0V4cChhLFwiZ1wiKTtyZXR1cm4oYj10aGlzLnYuc2xpY2UoYixjKS5tYXRjaChhKSk/bmV3IFNrLmJ1aWx0aW4uaW50XyhiLmxlbmd0aCk6bmV3IFNrLmJ1aWx0aW4uaW50XygwKX0sJGZsYWdzOntNaW5BcmdzOjEsXG5NYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlMuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyBzdWIgaW5cXG5zdHJpbmcgU1tzdGFydDplbmRdLiAgT3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlXFxuaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXCJ9LGV4cGFuZHRhYnM6eyRtZXRoOmZ1bmN0aW9uKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpYT1Tay5idWlsdGluLmFzbnVtJChhKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWQsIGdvdCB0eXBlXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2NvbnN0IGI9QXJyYXkoYSsxKS5qb2luKFwiIFwiKSxjPXRoaXMudi5yZXBsYWNlKC8oW15cXHJcXG5cXHRdKilcXHQvZywoYyxkKT0+ZCtiLnNsaWNlKGQubGVuZ3RoJWEpKTtcbnJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyl9LCRmbGFnczp7TmFtZWRBcmdzOltcInRhYnNpemVcIl0sRGVmYXVsdHM6WzhdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgdGFic2l6ZT04KVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgZXhwYW5kZWQgdXNpbmcgc3BhY2VzLlxcblxcbklmIHRhYnNpemUgaXMgbm90IGdpdmVuLCBhIHRhYiBzaXplIG9mIDggY2hhcmFjdGVycyBpcyBhc3N1bWVkLlwifSxmaW5kOnskbWV0aDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJGxlZnQoYSxiLGMpKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0sXG5wYXJ0aXRpb246eyRtZXRoOmUoITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIHN0cmluZyBpbnRvIHRocmVlIHBhcnRzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IuXFxuXFxuVGhpcyB3aWxsIHNlYXJjaCBmb3IgdGhlIHNlcGFyYXRvciBpbiB0aGUgc3RyaW5nLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBmb3VuZCxcXG5yZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yXFxuaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuXFxuXFxuSWYgdGhlIHNlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHN0cmluZ1xcbmFuZCB0d28gZW1wdHkgc3RyaW5ncy5cIn0saW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRsZWZ0KGEsYixjKTtpZigtMT09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInN1YnN0cmluZyBub3QgZm91bmRcIik7XG5yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIFMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCwgXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QgZm91bmQuXCJ9LGxqdXN0OnskbWV0aDpmKCExLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCB3aWR0aCwgZmlsbGNoYXI9JyAnLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBsZWZ0LWp1c3RpZmllZCBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLlxcblxcblBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLlwifSxcbmxvd2VyOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvTG93ZXJDYXNlKCkpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlwifSxsc3RyaXA6eyRtZXRoOmIoL15cXHMrL2csYT0+XCJeW1wiK2ErXCJdK1wiKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBjaGFycz1Ob25lLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZC5cXG5cXG5JZiBjaGFycyBpcyBnaXZlbiBhbmQgbm90IE5vbmUsIHJlbW92ZSBjaGFyYWN0ZXJzIGluIGNoYXJzIGluc3RlYWQuXCJ9LHJmaW5kOnskbWV0aChhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJHJpZ2h0KGEsYixjKSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sXG4kdGV4dHNpZzpudWxsLCRkb2M6XCJTLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBTIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJldHVybiAtMSBvbiBmYWlsdXJlLlwifSxyaW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRyaWdodChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzdHJpbmcgbm90IGZvdW5kXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlMucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBTIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QgZm91bmQuXCJ9LFxucmp1c3Q6eyRtZXRoOmYoITAsITEpLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJHNlbGYsIHdpZHRoLCBmaWxsY2hhcj0nICcsIC8pXCIsJGRvYzpcIlJldHVybiBhIHJpZ2h0LWp1c3RpZmllZCBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLlxcblxcblBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLlwifSxyc3RyaXA6eyRtZXRoOmIoL1xccyskL2csYT0+XCJbXCIrYStcIl0rJFwiKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBjaGFycz1Ob25lLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuXFxuXFxuSWYgY2hhcnMgaXMgZ2l2ZW4gYW5kIG5vdCBOb25lLCByZW1vdmUgY2hhcmFjdGVycyBpbiBjaGFycyBpbnN0ZWFkLlwifSxycGFydGl0aW9uOnskbWV0aDplKCEwKSwkZmxhZ3M6e09uZUFyZzohMH0sXG4kdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIHN0cmluZyBpbnRvIHRocmVlIHBhcnRzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IuXFxuXFxuVGhpcyB3aWxsIHNlYXJjaCBmb3IgdGhlIHNlcGFyYXRvciBpbiB0aGUgc3RyaW5nLCBzdGFydGluZyBhdCB0aGUgZW5kLiBJZlxcbnRoZSBzZXBhcmF0b3IgaXMgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZVxcbnNlcGFyYXRvciwgdGhlIHNlcGFyYXRvciBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciBpdC5cXG5cXG5JZiB0aGUgc2VwYXJhdG9yIGlzIG5vdCBmb3VuZCwgcmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5nc1xcbmFuZCB0aGUgb3JpZ2luYWwgc3RyaW5nLlwifSxzcGxpdGxpbmVzOnskbWV0aDpmdW5jdGlvbihhKXthPVNrLm1pc2NldmFsLmlzVHJ1ZShhKTtjb25zdCBiPXRoaXMudixjPVtdLGQ9Yi5sZW5ndGg7dmFyIGU9XG4wO2ZvcihsZXQgZz0wO2c8ZDtnKyspe3ZhciBmPWIuY2hhckF0KGcpO2lmKFwiXFxuXCI9PT1iLmNoYXJBdChnKzEpJiZcIlxcclwiPT09ZilmPWcrMixlPWIuc2xpY2UoZSxmKSxhfHwoZT1lLnJlcGxhY2UoLyhcXHJ8XFxuKS9nLFwiXCIpKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGUpKSxlPWY7ZWxzZSBpZihcIlxcblwiPT09ZiYmXCJcXHJcIiE9PWIuY2hhckF0KGctMSl8fFwiXFxyXCI9PT1mKWY9ZysxLGU9Yi5zbGljZShlLGYpLGF8fChlPWUucmVwbGFjZSgvKFxccnxcXG4pL2csXCJcIikpLGMucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZSkpLGU9Zn1lPGQmJihlPWIuc2xpY2UoZSxkKSxhfHwoZT1lLnJlcGxhY2UoLyhcXHJ8XFxuKS9nLFwiXCIpKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGUpKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYyl9LCRmbGFnczp7TmFtZWRBcmdzOltcImtlZXBlbmRzXCJdLERlZmF1bHRzOlshMV19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBrZWVwZW5kcz1GYWxzZSlcIiwkZG9jOlwiUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgbGluZSBib3VuZGFyaWVzLlxcblxcbkxpbmUgYnJlYWtzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0IHVubGVzcyBrZWVwZW5kcyBpcyBnaXZlbiBhbmRcXG50cnVlLlwifSxcbnN0cmlwOnskbWV0aDpiKC9eXFxzK3xcXHMrJC9nLGE9PlwiXltcIithK1wiXSt8W1wiK2ErXCJdKyRcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSByZW1vdmUuXFxuXFxuSWYgY2hhcnMgaXMgZ2l2ZW4gYW5kIG5vdCBOb25lLCByZW1vdmUgY2hhcmFjdGVycyBpbiBjaGFycyBpbnN0ZWFkLlwifSxzd2FwY2FzZTp7JG1ldGgoKXtjb25zdCBhPXRoaXMudi5yZXBsYWNlKC9bYS16XS9naSxhPT57Y29uc3QgYj1hLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGI9PT1hP2EudG9VcHBlckNhc2UoKTpifSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJDb252ZXJ0IHVwcGVyY2FzZSBjaGFyYWN0ZXJzIHRvIGxvd2VyY2FzZSBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgdG8gdXBwZXJjYXNlLlwifSxcbnVwcGVyOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvVXBwZXJDYXNlKCkpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLlwifSxzdGFydHN3aXRoOnskbWV0aDpkKFwic3RhcnRzd2l0aFwiLChhLGIpPT4wPT09YS5pbmRleE9mKGIpKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlMuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgUyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxcbldpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgUyBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cXG5XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgUyBhdCB0aGF0IHBvc2l0aW9uLlxcbnByZWZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHN0cmluZ3MgdG8gdHJ5LlwifSxcbmVuZHN3aXRoOnskbWV0aDpkKFwiZW5kc3dpdGhcIiwoYSxiKT0+LTEhPT1hLmluZGV4T2YoYixhLmxlbmd0aC1iLmxlbmd0aCkpLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgUyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBzdWZmaXgsIEZhbHNlIG90aGVyd2lzZS5cXG5XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IFMgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXFxuV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi5cXG5zdWZmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdHJpbmdzIHRvIHRyeS5cIn0saXNhc2NpaTp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCgvXltcXHgwMC1cXHg3Rl0qJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIEFTQ0lJLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQVNDSUkgY2hhcmFjdGVycyBoYXZlIGNvZGUgcG9pbnRzIGluIHRoZSByYW5nZSBVKzAwMDAtVSswMDdGLlxcbkVtcHR5IHN0cmluZyBpcyBBU0NJSSB0b28uXCJ9LGlzbG93ZXI6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wodGhpcy52Lmxlbmd0aCYmL1thLXpdLy50ZXN0KHRoaXMudikmJiEvW0EtWl0vLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIGxvd2VyY2FzZSBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBsb3dlcmNhc2UgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgbG93ZXJjYXNlIGFuZFxcbnRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXG5pc3VwcGVyOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJiEvW2Etel0vLnRlc3QodGhpcy52KSYmL1tBLVpdLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYW4gdXBwZXJjYXNlIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkEgc3RyaW5nIGlzIHVwcGVyY2FzZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1cHBlcmNhc2UgYW5kXFxudGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSxpc3RpdGxlOnskbWV0aDpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy52O2xldCBiPSExLGM9ITEsZDtmb3IobGV0IGU9MDtlPGEubGVuZ3RoO2UrKylpZihkPWEuY2hhckF0KGUpLCEvW2Etel0vLnRlc3QoZCkmJi9bQS1aXS8udGVzdChkKSl7aWYoYylyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtcbmI9Yz0hMH1lbHNlIGlmKC9bYS16XS8udGVzdChkKSYmIS9bQS1aXS8udGVzdChkKSl7aWYoIWMpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Yj0hMH1lbHNlIGM9ITE7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYil9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHRpdGxlLWNhc2VkIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkluIGEgdGl0bGUtY2FzZWQgc3RyaW5nLCB1cHBlci0gYW5kIHRpdGxlLWNhc2UgY2hhcmFjdGVycyBtYXkgb25seVxcbmZvbGxvdyB1bmNhc2VkIGNoYXJhY3RlcnMgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIG9ubHkgY2FzZWQgb25lcy5cIn0saXNzcGFjZTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCgvXlxccyskLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsXG4kZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHdoaXRlc3BhY2Ugc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgd2hpdGVzcGFjZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB3aGl0ZXNwYWNlIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0saXNkaWdpdDp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCgvXlxcZCskLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBkaWdpdCBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBhIGRpZ2l0IHN0cmluZyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgYW5kIHRoZXJlXFxuaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSxcbmlzbnVtZXJpYzp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1teMC05XS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgbnVtZXJpYyBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBudW1lcmljIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIG51bWVyaWMgYW5kIHRoZXJlIGlzIGF0XFxubGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSxpc2FscGhhOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJiEvW15hLXpBLVpdLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYW4gYWxwaGFiZXRpYyBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBhbHBoYWJldGljIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhYmV0aWMgYW5kIHRoZXJlXFxuaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSxcbmlzYWxudW06eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wodGhpcy52Lmxlbmd0aCYmIS9bXmEtekEtWjAtOV0vLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhbiBhbHBoYS1udW1lcmljIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkEgc3RyaW5nIGlzIGFscGhhLW51bWVyaWMgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGEtbnVtZXJpYyBhbmRcXG50aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LHpmaWxsOnskbWV0aDpmdW5jdGlvbihhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7bGV0IGI9XCJcIjthLT10aGlzLnYubGVuZ3RoO2NvbnN0IGM9XCIrXCI9PT10aGlzLnZbMF18fFwiLVwiPT09dGhpcy52WzBdPzE6MDtcbmZvcihsZXQgYz0wO2M8YTtjKyspYis9XCIwXCI7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyKDAsYykrYit0aGlzLnYuc3Vic3RyKGMpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCB3aWR0aCwgLylcIiwkZG9jOlwiUGFkIGEgbnVtZXJpYyBzdHJpbmcgd2l0aCB6ZXJvcyBvbiB0aGUgbGVmdCwgdG8gZmlsbCBhIGZpZWxkIG9mIHRoZSBnaXZlbiB3aWR0aC5cXG5cXG5UaGUgc3RyaW5nIGlzIG5ldmVyIHRydW5jYXRlZC5cIn0sZm9ybWF0OnskbWV0aDpTay5mb3JtYXR0aW5nLmZvcm1hdCwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmZvcm1hdCgqYXJncywgKiprd2FyZ3MpIC0+IHN0clxcblxcblJldHVybiBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIFMsIHVzaW5nIHN1YnN0aXR1dGlvbnMgZnJvbSBhcmdzIGFuZCBrd2FyZ3MuXFxuVGhlIHN1YnN0aXR1dGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgYnJhY2VzICgneycgYW5kICd9JykuXCJ9LFxuX19mb3JtYXRfXzp7JG1ldGg6U2suZm9ybWF0dGluZy5mb3JtYXRTdHJpbmcsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBmb3JtYXRfc3BlYywgLylcIiwkZG9jOlwiUmV0dXJuIGEgZm9ybWF0dGVkIHZlcnNpb24gb2YgdGhlIHN0cmluZyBhcyBkZXNjcmliZWQgYnkgZm9ybWF0X3NwZWMuXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6bnVsbH19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5zdHJcIixTay5idWlsdGluLnN0cik7dmFyIGs9L15bQS1aYS16MC05XSskLyxwPS8oWy4qKz89fFxcXFxcXC8oKVxcW1xcXVxce1xcfV4kXSkvZyx1PS9eW1xcc1xceGEwXSsvO1NrLmJ1aWx0aW4uc3RyLiRweTJkZWNvZGU9bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IoU2suYnVpbHRpbi5zdHIseyRuYW1lOlwiZGVjb2RlXCIsXG4kbWV0aChhLGIpe2NvbnN0IGM9bmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtyZXR1cm4gU2suYnVpbHRpbi5ieXRlcy4kZGVjb2RlLmNhbGwoYyxhLGIpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJlbmNvZGluZ1wiLFwiZXJyb3JzXCJdfX0pO3ZhciBBPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInN0cl9pdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO2EuJGhhc0FzdHJhbENvZGVQb2ludHMoKT8odGhpcy4kc2VxPWEuY29kZXBvaW50cyx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57Y29uc3QgYj10aGlzLiRzZXFbdGhpcy4kaW5kZXhdO2lmKHZvaWQgMCE9PWIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhLnYuc3Vic3RyaW5nKGIsdGhpcy4kc2VxWysrdGhpcy4kaW5kZXhdKSl9KToodGhpcy4kc2VxPWEudix0aGlzLnRwJGl0ZXJuZXh0PSgpPT57Y29uc3QgYT10aGlzLiRzZXFbdGhpcy4kaW5kZXgrK107aWYodm9pZCAwIT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSl9LFxuaXRlcm5leHQoKXtyZXR1cm4gdGhpcy50cCRpdGVybmV4dCgpfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KSx0PXthYnN0cmFjdDohMCxhczohMCxib29sZWFuOiEwLGJyZWFrOiEwLGJ5dGU6ITAsY2FzZTohMCxjYXRjaDohMCxjaGFyOiEwLGNsYXNzOiEwLGNvbnRpbnVlOiEwLGNvbnN0OiEwLGRlYnVnZ2VyOiEwLGRlZmF1bHQ6ITAsZGVsZXRlOiEwLGRvOiEwLGRvdWJsZTohMCxlbHNlOiEwLGVudW06ITAsZXhwb3J0OiEwLGV4dGVuZHM6ITAsZmFsc2U6ITAsZmluYWw6ITAsZmluYWxseTohMCxmbG9hdDohMCxmb3I6ITAsZnVuY3Rpb246ITAsZ290bzohMCxpZjohMCxpbXBsZW1lbnRzOiEwLGltcG9ydDohMCxpbjohMCxpbnN0YW5jZW9mOiEwLGludDohMCxpbnRlcmZhY2U6ITAsaXM6ITAsbG9uZzohMCxuYW1lc3BhY2U6ITAsXG5uYXRpdmU6ITAsbmV3OiEwLG51bGw6ITAscGFja2FnZTohMCxwcml2YXRlOiEwLHByb3RlY3RlZDohMCxwdWJsaWM6ITAscmV0dXJuOiEwLHNob3J0OiEwLHN0YXRpYzohMCxzdXBlcjohMCxzd2l0Y2g6ITAsc3luY2hyb25pemVkOiEwLHRoaXM6ITAsdGhyb3c6ITAsdGhyb3dzOiEwLHRyYW5zaWVudDohMCx0cnVlOiEwLHRyeTohMCx0eXBlb2Y6ITAsdXNlOiEwLHZhcjohMCx2b2lkOiEwLHZvbGF0aWxlOiEwLHdoaWxlOiEwLHdpdGg6ITAsY29uc3RydWN0b3I6ITAsX19kZWZpbmVHZXR0ZXJfXzohMCxfX2RlZmluZVNldHRlcl9fOiEwLGFwcGx5OiEwLGFyZ3VtZW50czohMCxjYWxsOiEwLGNhbGxlcjohMCxldmFsOiEwLGhhc093blByb3BlcnR5OiEwLGlzUHJvdG90eXBlT2Y6ITAsX19sb29rdXBHZXR0ZXJfXzohMCxfX2xvb2t1cFNldHRlcl9fOiEwLF9fbm9TdWNoTWV0aG9kX186ITAscHJvcGVydHlJc0VudW1lcmFibGU6ITAscHJvdG90eXBlOiEwLHRvU291cmNlOiEwLHRvTG9jYWxlU3RyaW5nOiEwLFxudG9TdHJpbmc6ITAsdW53YXRjaDohMCx2YWx1ZU9mOiEwLHdhdGNoOiEwLGxlbmd0aDohMCxuYW1lOiEwfTtTay5idWlsdGluLnN0ci5yZXNlcnZlZFdvcmRzXz10fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZnVuYz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZnVuY3Rpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZnVuYyxcImJ1aWx0aW4gZnVuYyBzaG91bGQgYmUgY2FsbGVkIGFzIGEgY2xhc3Mgd2l0aCBgbmV3YFwiKTt0aGlzLmZ1bmNfY29kZT1hO3RoaXMuZnVuY19nbG9iYWxzPWN8fG51bGw7dGhpcy4kbmFtZT1hLmNvX25hbWUmJmEuY29fbmFtZS52fHxhLm5hbWV8fFwiPG5hdGl2ZSBKUz5cIjt0aGlzLiRkPVNrLmJ1aWx0aW4uZGljdD9uZXcgU2suYnVpbHRpbi5kaWN0OnZvaWQgMDt0aGlzLiRkb2M9YS4kZG9jO3RoaXMuJG1vZHVsZT1Tay5nbG9iYWxzJiZTay5nbG9iYWxzLl9fbmFtZV9ffHxcblNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLiRxdWFsbmFtZT1hLmNvX3F1YWxuYW1lJiZhLmNvX3F1YWxuYW1lLnZ8fHRoaXMuJG5hbWU7aWYodm9pZCAwIT09ZSlmb3IobGV0IGEgaW4gZSliW2FdPWVbYV07dGhpcy5mdW5jX2Nsb3N1cmU9Yjt0aGlzLiRtZW1vaXNlRmxhZ3MoKTt0aGlzLm1lbW9pc2VkPWEuY29fZmFzdGNhbGx8fG51bGw7dGhpcy50cCRjYWxsPWEuY29fZmFzdGNhbGw/YS5iaW5kKHRoaXMpOlNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5iaW5kKHRoaXMpfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkZGVzY3JfZ2V0KGEsYyl7cmV0dXJuIG51bGw9PT1hP3RoaXM6bmV3IFNrLmJ1aWx0aW4ubWV0aG9kKHRoaXMsYSl9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxmdW5jdGlvbiBcIit0aGlzLiRxdWFsbmFtZStcIj5cIil9LHRwJGNhbGwoYSxjKXt0aGlzLm1lbW9pc2VkfHwodGhpcy4kbWVtb2lzZUZsYWdzKCksXG50aGlzLm1lbW9pc2VkPSEwKTtpZih2b2lkIDA9PT10aGlzLmNvX2FyZ2NvdW50JiZ2b2lkIDA9PT10aGlzLmNvX3Zhcm5hbWVzJiYhdGhpcy5jb19rd2FyZ3MmJiF0aGlzLmZ1bmNfY2xvc3VyZSl7aWYoYyYmMCE9PWMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7cmV0dXJuIHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGEpfWE9dGhpcy4kcmVzb2x2ZUFyZ3MoYSxjKTt0aGlzLmZ1bmNfY2xvc3VyZSYmYS5wdXNoKHRoaXMuZnVuY19jbG9zdXJlKTtyZXR1cm4gdGhpcy5mdW5jX2NvZGUuYXBwbHkodGhpcy5mdW5jX2dsb2JhbHMsYSl9fSxnZXRzZXRzOntfX25hbWVfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kbmFtZSl9LCRzZXQoYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19uYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0XCIpO1xudGhpcy4kbmFtZT1hLiRqc3N0cigpfX0sX19xdWFsbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLiRxdWFsbmFtZSl9LCRzZXQoYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19xdWFsbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdFwiKTt0aGlzLiRxdWFsbmFtZT1hLiRqc3N0cigpfX0sX19kaWN0X186U2suZ2VuZXJpYy5nZXRTZXREaWN0LF9fZGVmYXVsdHNfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLiRkZWZhdWx0cyl9fSxfX2RvY19fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLiRkb2MpfX19LHByb3RvOnskbWVtb2lzZUZsYWdzKCl7dGhpcy5jb192YXJuYW1lcz10aGlzLmZ1bmNfY29kZS5jb192YXJuYW1lczt0aGlzLmNvX2FyZ2NvdW50PXRoaXMuZnVuY19jb2RlLmNvX2FyZ2NvdW50O3ZvaWQgMD09PVxudGhpcy5jb19hcmdjb3VudCYmdGhpcy5jb192YXJuYW1lcyYmKHRoaXMuY29fYXJnY291bnQ9dGhpcy5jb19hcmdjb3VudD10aGlzLmNvX3Zhcm5hbWVzLmxlbmd0aCk7dGhpcy5jb19rd29ubHlhcmdjb3VudD10aGlzLmZ1bmNfY29kZS5jb19rd29ubHlhcmdjb3VudHx8MDt0aGlzLmNvX3ZhcmFyZ3M9dGhpcy5mdW5jX2NvZGUuY29fdmFyYXJnczt0aGlzLmNvX2t3YXJncz10aGlzLmZ1bmNfY29kZS5jb19rd2FyZ3M7dGhpcy4kZGVmYXVsdHM9dGhpcy5mdW5jX2NvZGUuJGRlZmF1bHRzfHxbXTt0aGlzLiRrd2RlZnM9dGhpcy5mdW5jX2NvZGUuJGt3ZGVmc3x8W119LCRyZXNvbHZlQXJnczpmdW5jdGlvbihhLGMpe3ZhciBiPXRoaXMuY29fYXJnY291bnQ7dm9pZCAwPT09YiYmKGI9dGhpcy5jb192YXJuYW1lcz90aGlzLmNvX3Zhcm5hbWVzLmxlbmd0aDphLmxlbmd0aCk7dmFyIGU9dGhpcy5jb192YXJuYW1lc3x8W10sZj10aGlzLmNvX2t3b25seWFyZ2NvdW50fHwwO2xldCBsPWIrXG5mO2lmKCEoMCE9PWZ8fHRoaXMuY29fa3dhcmdzfHxjJiYwIT09Yy5sZW5ndGh8fHRoaXMuY29fdmFyYXJncykpe2lmKGEubGVuZ3RoPT1iKXJldHVybiBhO2lmKDA9PT1hLmxlbmd0aCYmdGhpcy4kZGVmYXVsdHMmJnRoaXMuJGRlZmF1bHRzLmxlbmd0aD09PWIpe2ZvcihlPTA7ZSE9dGhpcy4kZGVmYXVsdHMubGVuZ3RoO2UrKylhW2VdPXRoaXMuJGRlZmF1bHRzW2VdO3JldHVybiBhfX1sZXQgaDt0aGlzLmNvX2t3YXJncyYmKGg9W10pO3ZhciBkPWEubGVuZ3RoO2xldCBnPWEubGVuZ3RoPD1iP2E6YS5zbGljZSgwLGIpO2lmKHRoaXMuY29fdmFyYXJncylhPWEubGVuZ3RoPmcubGVuZ3RoP2Euc2xpY2UoZy5sZW5ndGgpOltdLGdbbF09bmV3IFNrLmJ1aWx0aW4udHVwbGUoYSk7ZWxzZSBpZihkPmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSB0YWtlcyBcIitiK1wiIHBvc2l0aW9uYWwgYXJndW1lbnRcIisoMT09Yj9cIlwiOlwic1wiKStcIiBidXQgXCIrZCsoMT09XG5kP1wiIHdhcyBcIjpcIiB3ZXJlIFwiKStcIiBnaXZlblwiKTtpZihjKXtpZih0aGlzLmZ1bmNfY29kZS5ub19rdyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzXCIpO2ZvcihhPTA7YTxjLmxlbmd0aDthKz0yKXtkPWNbYV07dmFyIG49Y1thKzFdLGs9ZS5pbmRleE9mKGQpO2lmKDA8PWspe2lmKHZvaWQgMCE9PWdba10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBhcmd1bWVudCAnXCIrZCtcIidcIik7Z1trXT1ufWVsc2UgaWYoaCloLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGQpLG4pO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdcIitkK1wiJ1wiKTt9fWM9dGhpcy4kZGVmYXVsdHN8fFtdO2E9MDtkPVtdO249ITE7Zm9yKGs9Yi1jLmxlbmd0aDthPFxuazthKyspdm9pZCAwPT09Z1thXSYmKGQucHVzaChlW2FdKSx2b2lkIDA9PT1lW2FdJiYobj0hMCkpO2lmKDAhPWQubGVuZ3RoJiYodGhpcy5jb19hcmdjb3VudHx8dGhpcy5jb192YXJuYW1lcykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSBtaXNzaW5nIFwiK2QubGVuZ3RoK1wiIHJlcXVpcmVkIGFyZ3VtZW50XCIrKDE9PWQubGVuZ3RoP1wiXCI6XCJzXCIpKyhuP1wiXCI6XCI6IFwiK2Quam9pbihcIiwgXCIpKSk7Zm9yKDthPGI7YSsrKXZvaWQgMD09PWdbYV0mJihnW2FdPWNbYS1rXSk7aWYoMDxmKXtmPVtdO2M9dGhpcy4ka3dkZWZzO2ZvcihhPWI7YTxsO2ErKyl2b2lkIDA9PT1nW2FdJiYodm9pZCAwIT09Y1thLWJdP2dbYV09Y1thLWJdOmYucHVzaChlW2FdKSk7aWYoMCE9PWYubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgbWlzc2luZyBcIitmLmxlbmd0aCtcIiByZXF1aXJlZCBrZXl3b3JkIGFyZ3VtZW50XCIrKDE9PVxuZi5sZW5ndGg/XCJcIjpcInNcIikrXCI6IFwiK2Yuam9pbihcIiwgXCIpKTt9aWYodGhpcy5mdW5jX2Nsb3N1cmUmJmUpZm9yKGI9Zy5sZW5ndGg7YjxlLmxlbmd0aDtiKyspZy5wdXNoKHZvaWQgMCk7aCYmZy51bnNoaWZ0KGgpO3JldHVybiBnfX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmFzbnVtJD1mdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YXx8bnVsbD09PWF8fFwibnVtYmVyXCI9PT10eXBlb2YgYT9hOmEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8/XCJudW1iZXJcIj09PXR5cGVvZiBhLnY/YS52OmEudi50b1N0cmluZygpOmEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0Xz9hLnY6YT09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9udWxsOmF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uYXNudW0kXCIsU2suYnVpbHRpbi5hc251bSQpO1NrLmJ1aWx0aW4uYXNzayQ9ZnVuY3Rpb24oYSl7cmV0dXJuIDA9PT1hJTE/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSl9O1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5hc3NrJFwiLFNrLmJ1aWx0aW4uYXNzayQpO1NrLmJ1aWx0aW4uYXNudW0kbm9mbG9hdD1mdW5jdGlvbihhKXtpZih2b2lkIDA9PT1hfHxudWxsPT09YSlyZXR1cm4gYTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpYT1hLnRvU3RyaW5nKCk7ZWxzZSBpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKWE9YS52LnRvU3RyaW5nKCk7ZWxzZSBpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8pYT1hLnYudG9TdHJpbmcoKTtlbHNle2lmKGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpcmV0dXJuIG51bGw7cmV0dXJufWlmKDA+YS5pbmRleE9mKFwiLlwiKSYmMD5hLmluZGV4T2YoXCJlXCIpJiYwPmEuaW5kZXhPZihcIkVcIikpcmV0dXJuIGE7dmFyIGI9MDtpZigwPD1hLmluZGV4T2YoXCJlXCIpKXt2YXIgYz1hLnN1YnN0cigwLGEuaW5kZXhPZihcImVcIikpO2I9YS5zdWJzdHIoYS5pbmRleE9mKFwiZVwiKSsxKX1lbHNlIDA8PWEuaW5kZXhPZihcIkVcIik/XG4oYz1hLnN1YnN0cigwLGEuaW5kZXhPZihcImVcIikpLGI9YS5zdWJzdHIoYS5pbmRleE9mKFwiRVwiKSsxKSk6Yz1hO2I9cGFyc2VJbnQoYiwxMCk7YT1jLmluZGV4T2YoXCIuXCIpO2lmKDA+YSl7aWYoMDw9Yil7Zm9yKDswPGItLTspYys9XCIwXCI7cmV0dXJuIGN9cmV0dXJuIGMubGVuZ3RoPi1iP2Muc3Vic3RyKDAsYy5sZW5ndGgrYik6MH1jPTA9PT1hP2Muc3Vic3RyKDEpOmE8Yy5sZW5ndGg/Yy5zdWJzdHIoMCxhKStjLnN1YnN0cihhKzEpOmMuc3Vic3RyKDAsYSk7Zm9yKGErPWI7YT5jLmxlbmd0aDspYys9XCIwXCI7cmV0dXJuIGM9MD49YT8wOmMuc3Vic3RyKDAsYSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uYXNudW0kbm9mbG9hdFwiLFNrLmJ1aWx0aW4uYXNudW0kbm9mbG9hdCk7U2suYnVpbHRpbi5yb3VuZD1mdW5jdGlvbihhLGMpe2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYSBmbG9hdCBpcyByZXF1aXJlZFwiKTtpZighU2suX19mdXR1cmVfXy5kdW5kZXJfcm91bmQpe2lmKCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7XG5pZihhLnJvdW5kJClyZXR1cm4gYS5yb3VuZCQoYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgaW5zdGFuY2UgaGFzIG5vIGF0dHJpYnV0ZSAnX19mbG9hdF9fJ1wiKTt9aWYodm9pZCAwIT09YyYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGMpJiYhU2subWlzY2V2YWwuaXNJbmRleChjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXhcIik7YT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJHJvdW5kKTtpZih2b2lkIDAhPT1hKXJldHVybiB2b2lkIDAhPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtjXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW10pO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7fTtTay5idWlsdGluLmxlbj1cbmZ1bmN0aW9uKGEpe2lmKGEuc3EkbGVuZ3RoKWE9YS5zcSRsZW5ndGgoITApO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib2JqZWN0IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBoYXMgbm8gbGVuKClcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsYT0+bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSl9O1NrLmJ1aWx0aW4ubWluPWZ1bmN0aW9uKGEsYyl7bGV0IGI7Y29uc3QgZT1hLmxlbmd0aDtpZighZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtaW4gZXhwZWN0ZWQgMSBhcmd1bWVudCwgZ290IDBcIik7Y29uc3QgW2gsZF09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJtaW5cIixbXCJkZWZhdWx0XCIsXCJrZXlcIl0sW10sYyxbbnVsbCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtpZigxPGUmJm51bGwhPT1oKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGEgZGVmYXVsdCBmb3IgbWluKCkgd2l0aCBtdWx0aXBsZSBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKTtcbmI9MT09ZT9Tay5hYnN0ci5pdGVyKGFbMF0pOlNrLmFic3RyLml0ZXIobmV3IFNrLmJ1aWx0aW4udHVwbGUoYSkpO2lmKCFTay5idWlsdGluLmNoZWNrTm9uZShkKSYmIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoZCkrXCInIG9iamVjdCBpcyBub3QgY2FsbGFibGVcIik7bGV0IGc7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoITApLGE9PntnPWE7aWYodm9pZCAwIT09ZylyZXR1cm4gU2suYnVpbHRpbi5jaGVja05vbmUoZCk/U2subWlzY2V2YWwuaXRlckZvcihiLGE9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxnLFwiTHRcIikmJihnPWEpfSk6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW2ddKSxhPT5Tay5taXNjZXZhbC5pdGVyRm9yKGIsYj0+U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsXG5bYl0pLGM9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFwiTHRcIikmJihnPWIsYT1jKX0pKSl9LCgpPT57aWYodm9pZCAwPT09Zyl7aWYobnVsbD09PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm1pbigpIGFyZyBpcyBhbiBlbXB0eSBzZXF1ZW5jZVwiKTtnPWh9cmV0dXJuIGd9KX07U2suYnVpbHRpbi5tYXg9ZnVuY3Rpb24oYSxjKXtsZXQgYjtjb25zdCBlPWEubGVuZ3RoO2lmKCFlKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm1heCBleHBlY3RlZCAxIGFyZ3VtZW50LCBnb3QgMFwiKTtjb25zdCBbaCxkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcIm1pblwiLFtcImRlZmF1bHRcIixcImtleVwiXSxbXSxjLFtudWxsLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO2lmKDE8ZSYmbnVsbCE9PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiQ2Fubm90IHNwZWNpZnkgYSBkZWZhdWx0IGZvciBtYXgoKSB3aXRoIG11bHRpcGxlIHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpO1xuYj0xPT09ZT9Tay5hYnN0ci5pdGVyKGFbMF0pOlNrLmFic3RyLml0ZXIobmV3IFNrLmJ1aWx0aW4udHVwbGUoYSkpO2lmKCFTay5idWlsdGluLmNoZWNrTm9uZShkKSYmIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoZCkrXCInIG9iamVjdCBpcyBub3QgY2FsbGFibGVcIik7bGV0IGc7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoITApLGE9PntnPWE7aWYodm9pZCAwIT09ZylyZXR1cm4gU2suYnVpbHRpbi5jaGVja05vbmUoZCk/U2subWlzY2V2YWwuaXRlckZvcihiLGE9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxnLFwiR3RcIikmJihnPWEpfSk6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW2ddKSxhPT5Tay5taXNjZXZhbC5pdGVyRm9yKGIsYj0+U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsXG5bYl0pLGM9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFwiR3RcIikmJihnPWIsYT1jKX0pKSl9LCgpPT57aWYodm9pZCAwPT09Zyl7aWYobnVsbD09PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm1pbigpIGFyZyBpcyBhbiBlbXB0eSBzZXF1ZW5jZVwiKTtnPWh9cmV0dXJuIGd9KX07U2suYnVpbHRpbi5taW4uY29fZmFzdGNhbGw9U2suYnVpbHRpbi5tYXguY29fZmFzdGNhbGw9MTtTay5idWlsdGluLmFueT1mdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGZ1bmN0aW9uKGEpe2lmKFNrLm1pc2NldmFsLmlzVHJ1ZShhKSlyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKFNrLmJ1aWx0aW4uYm9vbC50cnVlJCl9KSxhPT5hfHxTay5idWlsdGluLmJvb2wuZmFsc2UkKX07U2suYnVpbHRpbi5hbGw9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxcbmZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc1RydWUoYSkpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhTay5idWlsdGluLmJvb2wuZmFsc2UkKX0pLGE9PmF8fFNrLmJ1aWx0aW4uYm9vbC50cnVlJCl9O1NrLmJ1aWx0aW4uc3VtPWZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gYigpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKGQsYT0+e2lmKGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmludF8pZz1nLm5iJGFkZChhKTtlbHNle2lmKGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmZsb2F0XylyZXR1cm4gZz1nLm5iJGZsb2F0KCkubmIkYWRkKGEpLG5ldyBTay5taXNjZXZhbC5CcmVhayhcImZsb2F0XCIpO2c9U2suYWJzdHIubnVtYmVyQmluT3AoZyxhLFwiQWRkXCIpO3JldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJzbG93XCIpfX0pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihkLGE9PntpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5mbG9hdF98fFxuYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50XylnPWcubmIkYWRkKGEpO2Vsc2UgcmV0dXJuIGc9U2suYWJzdHIubnVtYmVyQmluT3AoZyxhLFwiQWRkXCIpLG5ldyBTay5taXNjZXZhbC5CcmVhayhcInNsb3dcIil9KX1mdW5jdGlvbiBoKCl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoZCxhPT57Zz1Tay5hYnN0ci5udW1iZXJCaW5PcChnLGEsXCJBZGRcIil9KX1jb25zdCBkPVNrLmFic3RyLml0ZXIoYSk7aWYodm9pZCAwPT09Yyl2YXIgZz1uZXcgU2suYnVpbHRpbi5pbnRfKDApO2Vsc2V7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdW0oKSBjYW4ndCBzdW0gc3RyaW5ncyBbdXNlICcnLmpvaW4oc2VxKSBpbnN0ZWFkXVwiKTtnPWN9YT12b2lkIDA9PT1jfHxjLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5pbnRfP2IoKTpjLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5mbG9hdF8/XCJmbG9hdFwiOlwic2xvd1wiO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLFxuYT0+XCJmbG9hdFwiPT09YT9lKCk6YSxhPT57aWYoXCJzbG93XCI9PT1hKXJldHVybiBoKCl9LCgpPT5nKX07U2suYnVpbHRpbi56aXA9ZnVuY3Rpb24oKXt2YXIgYSxjO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KFtdKTt2YXIgZj1bXTtmb3IoYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspaWYoU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGFyZ3VtZW50c1tjXSkpZi5wdXNoKFNrLmFic3RyLml0ZXIoYXJndW1lbnRzW2NdKSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhcmd1bWVudCBcIitjK1wiIG11c3Qgc3VwcG9ydCBpdGVyYXRpb25cIik7dmFyIGw9W107Zm9yKGE9ITE7IWE7KXt2YXIgaD1bXTtmb3IoYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspe3ZhciBkPWZbY10udHAkaXRlcm5leHQoKTtpZih2b2lkIDA9PT1kKXthPSEwO2JyZWFrfWgucHVzaChkKX1hfHxsLnB1c2gobmV3IFNrLmJ1aWx0aW4udHVwbGUoaCkpfXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGwpfTtcblNrLmJ1aWx0aW4uYWJzPWZ1bmN0aW9uKGEpe2lmKGEubmIkYWJzKXJldHVybiBhLm5iJGFicygpO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJiYWQgb3BlcmFuZCB0eXBlIGZvciBhYnMoKTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt9O1NrLmJ1aWx0aW4uZmFicz1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5hYnMoYSl9O1NrLmJ1aWx0aW4ub3JkPWZ1bmN0aW9uKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpe2lmKDEhPT1hLnYubGVuZ3RoJiYxIT09YS5zcSRsZW5ndGgoKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvcmQoKSBleHBlY3RlZCBhIGNoYXJhY3RlciwgYnV0IHN0cmluZyBvZiBsZW5ndGggXCIrYS52Lmxlbmd0aCtcIiBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhLnYuY29kZVBvaW50QXQoMCkpfWlmKFNrLmJ1aWx0aW4uY2hlY2tCeXRlcyhhKSl7aWYoMSE9PWEuc3EkbGVuZ3RoKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib3JkKCkgZXhwZWN0ZWQgYSBjaGFyYWN0ZXIsIGJ1dCBzdHJpbmcgb2YgbGVuZ3RoIFwiK1xuYS52Lmxlbmd0aCtcIiBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhLnZbMF0pfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9yZCgpIGV4cGVjdGVkIGEgc3RyaW5nIG9mIGxlbmd0aCAxLCBidXQgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgZm91bmRcIik7fTtTay5idWlsdGluLmNocj1mdW5jdGlvbihhKXtpZighU2suYnVpbHRpbi5jaGVja0ludChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkXCIpO2E9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoU2suX19mdXR1cmVfXy5weXRob24zKXtpZigwPmF8fDExMTQxMTI8PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNocigpIGFyZyBub3QgaW4gcmFuZ2UoMHgxMTAwMDApXCIpO31lbHNlIGlmKDA+YXx8MjU2PD1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjaHIoKSBhcmcgbm90IGluIHJhbmdlKDI1NilcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTdHJpbmcuZnJvbUNvZGVQb2ludChhKSl9O1xuU2suYnVpbHRpbi51bmljaHI9ZnVuY3Rpb24oYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTthPVNrLmJ1aWx0aW4uYXNudW0kKGEpO3RyeXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFN0cmluZy5mcm9tQ29kZVBvaW50KGEpKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKGUubWVzc2FnZSk7dGhyb3cgZTt9fTtTay5idWlsdGluLmludDJzdHJfPWZ1bmN0aW9uKGEsYyxmKXtsZXQgYjthLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHwoYT1hLm5iJGluZGV4KCkpO2I9YS52O2xldCBlPWIudG9TdHJpbmcoYyk7ZT1hLm5iJGlzbmVnYXRpdmUoKT9cIi1cIitmK2Uuc2xpY2UoMSk6ZitlOzIhPT1jJiYhU2suX19mdXR1cmVfXy5weXRob24zJiZcbihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmd8fEpTQkkuX19pc0JpZ0ludChiKSkmJihlKz1cIkxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlKX07U2suYnVpbHRpbi5oZXg9ZnVuY3Rpb24oYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaGV4KCkgYXJndW1lbnQgY2FuJ3QgYmUgY29udmVydGVkIHRvIGhleFwiKTtyZXR1cm4gU2suYnVpbHRpbi5pbnQyc3RyXyhhLDE2LFwiMHhcIil9O1NrLmJ1aWx0aW4ub2N0PWZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9jdCgpIGFyZ3VtZW50IGNhbid0IGJlIGNvbnZlcnRlZCB0byBoZXhcIik7cmV0dXJuIFNrLl9fZnV0dXJlX18ub2N0YWxfbnVtYmVyX2xpdGVyYWw/U2suYnVpbHRpbi5pbnQyc3RyXyhhLDgsXCIwb1wiKTpTay5idWlsdGluLmludDJzdHJfKGEsOCxcIjBcIil9O1NrLmJ1aWx0aW4uYmluPVxuZnVuY3Rpb24oYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgY2FuJ3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXhcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50MnN0cl8oYSwyLFwiMGJcIil9O1NrLmJ1aWx0aW4uZGlyPWZ1bmN0aW9uKGEpe2lmKHZvaWQgMCE9PWEpcmV0dXJuIGE9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRkaXIpLFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShhLFtdKSxhPT5Tay5idWlsdGluLnNvcnRlZChhKSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcInNrdWxwdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBkaXIgd2l0aCBubyBhcmdzXCIpO307U2suYnVpbHRpbi5yZXByPWZ1bmN0aW9uKGEpe3JldHVybiBhLiRyKCl9O1NrLmJ1aWx0aW4uYXNjaWk9XG5mdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYS4kcigpLGE9PntsZXQgYixjO2ZvcihjPTA7YzxhLnYubGVuZ3RoO2MrKylpZigxMjc8PWEudi5jaGFyQ29kZUF0KGMpKXtiPWEudi5zdWJzdHIoMCxjKTticmVha31pZighYilyZXR1cm4gYTtmb3IoO2M8YS52Lmxlbmd0aDtjKyspe3ZhciBlPWEudi5jaGFyQXQoYyksZD1hLnYuY2hhckNvZGVBdChjKTsxMjc8ZCYmMjU1Pj1kPyhlPWQudG9TdHJpbmcoMTYpLDI+ZS5sZW5ndGgmJihlPVwiMFwiK2UpLGIrPVwiXFxcXHhcIitlKToxMjc8ZCYmNTUyOTY+ZHx8NTczNDQ8PWQ/Yis9XCJcXFxcdVwiKyhcIjAwMFwiK2QudG9TdHJpbmcoMTYpKS5zbGljZSgtNCk6NTUyOTY8PWQ/KGU9YS52LmNvZGVQb2ludEF0KGMpLGMrKyxlPWUudG9TdHJpbmcoMTYpLGQ9XCIwMDAwMDAwXCIrZS50b1N0cmluZygxNiksYj00PGUubGVuZ3RoP2IrKFwiXFxcXFVcIitkLnNsaWNlKC04KSk6YisoXCJcXFxcdVwiK2Quc2xpY2UoLTQpKSk6Yis9ZX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGIpfSl9O1xuU2suYnVpbHRpbi5vcGVuPWZ1bmN0aW9uKGEsYyxmKXt2b2lkIDA9PT1jJiYoYz1uZXcgU2suYnVpbHRpbi5zdHIoXCJyXCIpKTtpZigvXFwrLy50ZXN0KGMudikpdGhyb3dcInRvZG87IGhhdmVuJ3QgaW1wbGVtZW50ZWQgcmVhZC93cml0ZSBtb2RlXCI7aWYoKFwid1wiPT09Yy52fHxcIndiXCI9PT1jLnZ8fFwiYVwiPT09Yy52fHxcImFiXCI9PT1jLnYpJiYhU2subm9ucmVhZG9wZW4pdGhyb3dcInRvZG87IGhhdmVuJ3QgaW1wbGVtZW50ZWQgbm9uLXJlYWQgb3BlbnNcIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmlsZShhLGMsZil9O1NrLmJ1aWx0aW4uaXNpbnN0YW5jZT1mdW5jdGlvbihhLGMpe2lmKCEoU2suYnVpbHRpbi5jaGVja0NsYXNzKGMpfHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaXNpbnN0YW5jZSgpIGFyZyAyIG11c3QgYmUgYSBjbGFzcywgdHlwZSwgb3IgdHVwbGUgb2YgY2xhc3NlcyBhbmQgdHlwZXNcIik7dmFyIGI9YS5vYiR0eXBlO1xuaWYoYj09PWMpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKSl7aWYoYi4kaXNTdWJUeXBlKGMpKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7YT1hLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGNsYXNzKTtyZXR1cm4gYSE9YiYmU2suYnVpbHRpbi5jaGVja0NsYXNzKGEpJiZhLiRpc1N1YlR5cGUoYyk/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9Zm9yKGI9MDtiPGMudi5sZW5ndGg7KytiKWlmKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzaW5zdGFuY2UoYSxjLnZbYl0pKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO3JldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkfTtTay5idWlsdGluLmhhc2g9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oU2suYWJzdHIub2JqZWN0SGFzaChhKSl9O1NrLmJ1aWx0aW4uZ2V0YXR0cj1mdW5jdGlvbihhLFxuYyxmKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZ1wiKTtjb25zdCBiPVNrLm1pc2NldmFsLnRyeUNhdGNoKCgpPT5hLnRwJGdldGF0dHIoYywhMCksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIsYj0+e2lmKHZvaWQgMD09PWIpe2lmKHZvaWQgMCE9PWYpcmV0dXJuIGY7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoYS5zayRhdHRyRXJyb3IoKStcIiBoYXMgbm8gYXR0cmlidXRlIFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYykpO31yZXR1cm4gYn0pfTtTay5idWlsdGluLnNldGF0dHI9ZnVuY3Rpb24oYSxjLGYpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nXCIpO1xucmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEudHAkc2V0YXR0cihjLGYsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfTtTay5idWlsdGluLnJhd19pbnB1dD1mdW5jdGlvbihhKXt2YXIgYj1hP2E6XCJcIjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suaW1wb3J0TW9kdWxlKFwic3lzXCIsITEsITApLGZ1bmN0aW9uKGEpe3JldHVybiBTay5pbnB1dGZ1blRha2VzUHJvbXB0P1NrLmJ1aWx0aW4uZmlsZS4kcmVhZGxpbmUoYS4kZC5zdGRpbixudWxsLGIpOlNrLm1pc2NldmFsLmNoYWluKHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYS4kZC5zdGRvdXQud3JpdGUsW2EuJGQuc3Rkb3V0LG5ldyBTay5idWlsdGluLnN0cihiKV0pfSxmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYS4kZC5zdGRpbi5yZWFkbGluZSxbYS4kZC5zdGRpbl0pfSl9KX07U2suYnVpbHRpbi5pbnB1dD1cblNrLmJ1aWx0aW4ucmF3X2lucHV0O1NrLmJ1aWx0aW4uanNldmFsPWZ1bmN0aW9uKGEpe2E9U2suZ2xvYmFsLmV2YWwoU2suZmZpLnJlbWFwVG9KcyhhKSk7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoYSl9O1NrLmJ1aWx0aW4uanNtaWxsaXM9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oXCJqc21pbGxpcyBpcyBkZXByZWNhdGVkXCIpO3JldHVybihuZXcgRGF0ZSkudmFsdWVPZigpfTtTay5idWlsdGluLmV2YWxfPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImV2YWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4ubWFwPWZ1bmN0aW9uKGEsYyl7dmFyIGI9W10sZSxoO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXCJtYXBcIixhcmd1bWVudHMubGVuZ3RoLDIpO2lmKDI8YXJndW1lbnRzLmxlbmd0aCl7dmFyIGQ9W107dmFyIGc9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykuc2xpY2UoMSk7Zm9yKGg9XG4wO2g8Zy5sZW5ndGg7aCsrKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGdbaF0pKXt2YXIgbj1wYXJzZUludChoLDEwKSsyO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFyZ3VtZW50IFwiK24rXCIgdG8gbWFwKCkgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvblwiKTt9Z1toXT1Tay5hYnN0ci5pdGVyKGdbaF0pfWZvcig7Oyl7dmFyIGs9W107Zm9yKGg9ZT0wO2g8Zy5sZW5ndGg7aCsrKW49Z1toXS50cCRpdGVybmV4dCgpLHZvaWQgMD09PW4/KGsucHVzaChTay5idWlsdGluLm5vbmUubm9uZSQpLGUrKyk6ay5wdXNoKG4pO2lmKGUhPT1nLmxlbmd0aClkLnB1c2goayk7ZWxzZSBicmVha31jPW5ldyBTay5idWlsdGluLmxpc3QoZCl9aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihjKSxcbmZ1bmN0aW9uKGMpe2lmKGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpYyBpbnN0YW5jZW9mIEFycmF5JiYoYz1uZXcgU2suYnVpbHRpbi50dXBsZShjKSksYi5wdXNoKGMpO2Vsc2UgcmV0dXJuIGMgaW5zdGFuY2VvZiBBcnJheXx8KGM9W2NdKSxTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYSxjKSxmdW5jdGlvbihhKXtiLnB1c2goYSl9KX0pLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9KX07U2suYnVpbHRpbi5yZWR1Y2U9ZnVuY3Rpb24oYSxjLGYpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO2M9U2suYWJzdHIuaXRlcihjKTtpZih2b2lkIDA9PT1mJiYoZj1jLnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09ZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwicmVkdWNlKCkgb2YgZW1wdHkgc2VxdWVuY2Ugd2l0aCBubyBpbml0aWFsIHZhbHVlXCIpO1xudmFyIGI9Zjtmb3IoZj1jLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWMudHAkaXRlcm5leHQoKSliPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiLGZdKTtyZXR1cm4gYn07U2suYnVpbHRpbi5zb3J0ZWQ9ZnVuY3Rpb24oYSxjLGYsbCl7YT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT57YT1uZXcgU2suYnVpbHRpbi5saXN0KGEpO2EubGlzdCRzb3J0KGMsZixsKTtyZXR1cm4gYX0pfTtTay5idWlsdGluLmZpbHRlcj1mdW5jdGlvbihhLGMpe3ZhciBiO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXCJmaWx0ZXJcIixhcmd1bWVudHMubGVuZ3RoLDIsMik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcIik7dmFyIGU9ZnVuY3Rpb24oKXtyZXR1cm5bXX07XG52YXIgaD1mdW5jdGlvbihhLGIpe2EucHVzaChiKTtyZXR1cm4gYX07dmFyIGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYSl9O2Mub2IkdHlwZT09PVNrLmJ1aWx0aW4uc3RyPyhlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIlwiKX0saD1mdW5jdGlvbihhLGIpe3JldHVybiBhLnNxJGNvbmNhdChiKX0sZD1mdW5jdGlvbihhKXtyZXR1cm4gYX0pOmMub2IkdHlwZT09PVNrLmJ1aWx0aW4udHVwbGUmJihkPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShhKX0pO3ZhciBnPWUoKTt2YXIgbj1Tay5hYnN0ci5pdGVyKGMpO2ZvcihiPW4udHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9bi50cCRpdGVybmV4dCgpKWU9YT09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9uZXcgU2suYnVpbHRpbi5ib29sKGIpOlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiXSksU2subWlzY2V2YWwuaXNUcnVlKGUpJiYoZz1oKGcsYikpO1xucmV0dXJuIGQoZyl9O1NrLmJ1aWx0aW4uaGFzYXR0cj1mdW5jdGlvbihhLGMpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImhhc2F0dHIoKTogYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmdcIik7Y29uc3QgYj1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+YS50cCRnZXRhdHRyKGMsITApLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKSl0aHJvdyBhO30pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGE9PnZvaWQgMD09PWE/U2suYnVpbHRpbi5ib29sLmZhbHNlJDpTay5idWlsdGluLmJvb2wudHJ1ZSQpfTtTay5idWlsdGluLnBvdz1mdW5jdGlvbihhLGMsZil7aWYodm9pZCAwPT09Znx8U2suYnVpbHRpbi5jaGVja05vbmUoZikpcmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGEsYyxcIlBvd1wiKTtpZighKFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkmJlNrLmJ1aWx0aW4uY2hlY2tJbnQoYykmJlxuU2suYnVpbHRpbi5jaGVja0ludChmKSkpe2lmKFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8U2suYnVpbHRpbi5jaGVja0NvbXBsZXgoYSkpcmV0dXJuIGEubmIkcG93ZXIoYyxmKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICoqIG9yIHBvdygpOiAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInLCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInLCAnXCIrU2suYWJzdHIudHlwZU5hbWUoZikrXCInXCIpO31yZXR1cm4gYS5uYiRwb3dlcihjLGYpfTtTay5idWlsdGluLnF1aXQ9ZnVuY3Rpb24oYSl7YT0obmV3IFNrLmJ1aWx0aW4uc3RyKGEpKS52O3Rocm93IG5ldyBTay5idWlsdGluLlN5c3RlbUV4aXQoYSk7fTtTay5idWlsdGluLmlzc3ViY2xhc3M9ZnVuY3Rpb24oYSxjKXtpZighU2suYnVpbHRpbi5jaGVja0NsYXNzKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzc3ViY2xhc3MoKSBhcmcgMSBtdXN0IGJlIGEgY2xhc3NcIik7XG52YXIgYj1Tay5idWlsdGluLmNoZWNrQ2xhc3MoYyk7aWYoIShifHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaXNzdWJjbGFzcygpIGFyZyAyIG11c3QgYmUgYSBjbGFzcyBvciB0dXBsZSBvZiBjbGFzc2VzXCIpO2lmKGIpcmV0dXJuIGEuJGlzU3ViVHlwZShjKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJDtmb3IoYj0wO2I8Yy52Lmxlbmd0aDsrK2IpaWYoU2subWlzY2V2YWwuaXNUcnVlKFNrLmJ1aWx0aW4uaXNzdWJjbGFzcyhhLGMudltiXSkpKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9O1NrLmJ1aWx0aW4uZ2xvYmFscz1mdW5jdGlvbigpe3ZhciBhLGM9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7Zm9yKGEgaW4gU2suZ2xvYmFscyl7dmFyIGY9U2sudW5maXhSZXNlcnZlZChhKTtjLm1wJGFzc19zdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLFxuU2suZ2xvYmFsc1thXSl9cmV0dXJuIGN9O1NrLmJ1aWx0aW4uZGl2bW9kPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGEsYyxcIkRpdk1vZFwiKX07U2suYnVpbHRpbi5mb3JtYXQ9ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz1Tay5idWlsdGluLnN0ci4kZW1wdHlzdHIpO3JldHVybiBTay5hYnN0ci5vYmplY3RGb3JtYXQoYSxjKX07Y29uc3QgYT1uZXcgTWFwO2xldCBjPTA7U2suYnVpbHRpbi5pZD1mdW5jdGlvbihiKXtjb25zdCBlPWEuZ2V0KGIpO2lmKHZvaWQgMCE9PWUpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZSk7YS5zZXQoYixjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKyspfTtTay5idWlsdGluLmJ5dGVhcnJheT1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJieXRlYXJyYXkgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uY2FsbGFibGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShhKT9cblNrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfTtTay5idWlsdGluLmRlbGF0dHI9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gU2suYnVpbHRpbi5zZXRhdHRyKGEsYyx2b2lkIDApfTtTay5idWlsdGluLmV4ZWNmaWxlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImV4ZWNmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmhlbHA9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiaGVscCBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5pdGVyPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP1NrLmFic3RyLml0ZXIoYSk6U2suYWJzdHIuaXRlcihuZXcgU2suYnVpbHRpbi5jYWxsYWJsZV9pdGVyXyhhLGMpKX07U2suYnVpbHRpbi5sb2NhbHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwibG9jYWxzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1NrLmJ1aWx0aW4ubWVtb3J5dmlldz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJtZW1vcnl2aWV3IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLm5leHRfPWZ1bmN0aW9uKGEsYyl7aWYoIWEudHAkaXRlcm5leHQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGFuIGl0ZXJhdG9yXCIpO2E9YS50cCRpdGVybmV4dCgpO2lmKHZvaWQgMD09PWEpe2lmKGMpcmV0dXJuIGM7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbjt9cmV0dXJuIGF9O1NrLmJ1aWx0aW4ucmVsb2FkPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcInJlbG9hZCBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi52YXJzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcInZhcnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07U2suYnVpbHRpbi5hcHBseV89ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiYXBwbHkgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uYnVmZmVyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImJ1ZmZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5jb2VyY2U9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiY29lcmNlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmludGVybj1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJpbnRlcm4gaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiQmFzZUV4Y2VwdGlvblwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb24sXCJiYWQgY2FsbCB0byBleGNlcHRpb24gY29uc3RydWN0b3IsIHVzZSAnbmV3J1wiKTtsZXQgYz1hWzBdO1wic3RyaW5nXCI9PT10eXBlb2YgYyYmKGM9bmV3IFNrLmJ1aWx0aW4uc3RyKGMpKTt0aGlzLmFyZ3M9bmV3IFNrLmJ1aWx0aW4udHVwbGUoYz9bY106W10pO3RoaXMudHJhY2ViYWNrPVtdO3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdDszPD1hLmxlbmd0aCYmdGhpcy50cmFjZWJhY2sucHVzaCh7bGluZW5vOmFbMl0sZmlsZW5hbWU6YVsxXXx8XCI8dW5rbm93bj5cIn0pfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkZG9jOlwiQ29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zXCIsdHAkbmV3KGEsYyl7dGhpcy5ocCR0eXBlPyhjPW5ldyB0aGlzLmNvbnN0cnVjdG9yLFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbi5jYWxsKGMpKTpcbmM9bmV3IHRoaXMuY29uc3RydWN0b3I7Yy5hcmdzPW5ldyBTay5idWlsdGluLnR1cGxlKGEuc2xpY2UoKSk7cmV0dXJuIGN9LHRwJGluaXQoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpLGMpfSwkcigpe2xldCBhPXRoaXMudHAkbmFtZTthKz1cIihcIit0aGlzLmFyZ3Mudi5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSkuam9pbihcIiwgXCIpK1wiKVwiO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LHRwJHN0cigpe3JldHVybiAxPj10aGlzLmFyZ3Mudi5sZW5ndGg/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuYXJncy52WzBdKTp0aGlzLmFyZ3MuJHIoKX19LGdldHNldHM6e2FyZ3M6eyRnZXQoKXtyZXR1cm4gdGhpcy5hcmdzfX0sX19kaWN0X186U2suZ2VuZXJpYy5nZXRTZXREaWN0fSxwcm90bzp7dG9TdHJpbmcoKXtsZXQgYT10aGlzLnRwJG5hbWU7YSs9XCI6IFwiK3RoaXMudHAkc3RyKCkudjtyZXR1cm4gYT0wIT09dGhpcy50cmFjZWJhY2subGVuZ3RoP1xuYSsoXCIgb24gbGluZSBcIit0aGlzLnRyYWNlYmFja1swXS5saW5lbm8pOmErXCIgYXQgPHVua25vd24+XCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvblwiLFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbik7U2suYnVpbHRpbi5FeGNlcHRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkV4Y2VwdGlvblwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkJhc2VFeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkV4Y2VwdGlvblwiLFNrLmJ1aWx0aW4uRXhjZXB0aW9uKTtTay5idWlsdGluLkFzc2VydGlvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJBc3NlcnRpb25FcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkFzc2VydGlvbkVycm9yXCIsU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcik7U2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiQXR0cmlidXRlRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uSW1wb3J0RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkltcG9ydEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLkluZGVudGF0aW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkluZGVudGF0aW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxcbmEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5JbmRleEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJbmRleEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLkxvb2t1cEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJMb29rdXBFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5LZXlFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiS2V5RXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5Mb29rdXBFcnJvci5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uTG9va3VwRXJyb3J9KTtTay5idWlsdGluLk5hbWVFcnJvcj1cblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOYW1lRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uVW5ib3VuZExvY2FsRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlVuYm91bmRMb2NhbEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLk92ZXJmbG93RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIk92ZXJmbG93RXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uU3ludGF4RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN5bnRheEVycm9yXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uUnVudGltZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJSdW50aW1lRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uUnVudGltZUVycm9yXCIsU2suYnVpbHRpbi5SdW50aW1lRXJyb3IpO1NrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJTdXNwZW5zaW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yXCIsXG5Tay5idWlsdGluLlN1c3BlbnNpb25FcnJvcik7U2suYnVpbHRpbi5TeXN0ZW1FeGl0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJTeXN0ZW1FeGl0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uU3lzdGVtRXhpdFwiLFNrLmJ1aWx0aW4uU3lzdGVtRXhpdCk7U2suYnVpbHRpbi5UeXBlRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlR5cGVFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5UeXBlRXJyb3JcIixTay5idWlsdGluLlR5cGVFcnJvcik7U2suYnVpbHRpbi5WYWx1ZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJWYWx1ZUVycm9yXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uVmFsdWVFcnJvclwiLFNrLmJ1aWx0aW4uVmFsdWVFcnJvcik7U2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiWmVyb0RpdmlzaW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uVGltZUxpbWl0RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlRpbWVMaW1pdEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlRpbWVMaW1pdEVycm9yXCIsXG5Tay5idWlsdGluLlRpbWVMaW1pdEVycm9yKTtTay5idWlsdGluLklPRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIklPRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uSU9FcnJvclwiLFNrLmJ1aWx0aW4uSU9FcnJvcik7U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOb3RJbXBsZW1lbnRlZEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3JcIixTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IpO1NrLmJ1aWx0aW4uTmVnYXRpdmVQb3dlckVycm9yPVxuU2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIk5lZ2F0aXZlUG93ZXJFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3JcIixTay5idWlsdGluLk5lZ2F0aXZlUG93ZXJFcnJvcik7U2suYnVpbHRpbi5FeHRlcm5hbEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJFeHRlcm5hbEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe3RoaXMubmF0aXZlRXJyb3I9YVswXTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyh0aGlzLm5hdGl2ZUVycm9yKSYmKGFbMF09dGhpcy5uYXRpdmVFcnJvci50b1N0cmluZygpLGFbMF0uc3RhcnRzV2l0aChcIlJhbmdlRXJyb3I6IE1heGltdW0gY2FsbFwiKSkpcmV0dXJuIGFbMF09XCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLFxubmV3IFNrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3IoLi4uYSk7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvclwiLFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcik7U2suYnVpbHRpbi5SZWN1cnNpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiUmVjdXJzaW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5SdW50aW1lRXJyb3IuYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3JcIixTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yKTtTay5idWlsdGluLk9wZXJhdGlvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJPcGVyYXRpb25FcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLFxuYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLk9wZXJhdGlvbkVycm9yXCIsU2suYnVpbHRpbi5PcGVyYXRpb25FcnJvcik7U2suYnVpbHRpbi5TeXN0ZW1FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3lzdGVtRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uU3lzdGVtRXJyb3JcIixTay5idWlsdGluLlN5c3RlbUVycm9yKTtTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVW5pY29kZURlY29kZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvclwiLFxuU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IpO1NrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJVbmljb2RlRW5jb2RlRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yXCIsU2suYnVpbHRpbi5Vbmljb2RlRW5jb2RlRXJyb3IpO1NrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3RvcEl0ZXJhdGlvblwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uXCIsU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uKTtcblNrLmJ1aWx0aW4uZ2V0RXhjSW5mbz1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2Eub2IkdHlwZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkLGEsU2suYnVpbHRpbi5ub25lLm5vbmUkXSl9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubWV0aG9kPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJtZXRob2RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tZXRob2QsXCJiYWQgY2FsbCB0byBtZXRob2QgY29uc3RydWN0b3IsIHVzZSAnbmV3J1wiKTt0aGlzLmltX2Z1bmM9YTt0aGlzLmltX3NlbGY9Yzt0aGlzLmltX2NhbGw9YS50cCRjYWxsfSxzbG90czp7JHIoKXtsZXQgYT10aGlzLmltX2Z1bmMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kcXVhbG5hbWUpfHx0aGlzLmltX2Z1bmMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbmFtZSk7YT1hJiZhLnZ8fFwiP1wiO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8Ym91bmQgbWV0aG9kIFwiK1xuYStcIiBvZiBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuaW1fc2VsZikrXCI+XCIpfSx0cCRoYXNoKCl7Y29uc3QgYT1Tay5hYnN0ci5vYmplY3RIYXNoKHRoaXMuaW1fc2VsZiksYz1Tay5hYnN0ci5vYmplY3RIYXNoKHRoaXMuaW1fZnVuYyk7cmV0dXJuIGErY30sdHAkY2FsbChhLGMpe3ZhciBiPXRoaXMuaW1fY2FsbDtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzLmltX2Z1bmMpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2E9W3RoaXMuaW1fc2VsZiwuLi5hXTtyZXR1cm4gYi5jYWxsKHRoaXMuaW1fZnVuYyxhLGMpfSx0cCRuZXcoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwibWV0aG9kXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwibWV0aG9kXCIsYSwyLDIpO2M9YVswXTthPWFbMV07aWYoIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlXCIpO1xuaWYoU2suYnVpbHRpbi5jaGVja05vbmUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2VsZiBtdXN0IG5vdCBiZSBOb25lXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5tZXRob2QoYyxhKX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihcIkVxXCIhPWMmJlwiTm90RXFcIiE9Y3x8IShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tZXRob2QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtsZXQgYjt0cnl7Yj1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5pbV9zZWxmLGEuaW1fc2VsZixcIkVxXCIsITEpJiZ0aGlzLmltX2Z1bmM9PWEuaW1fZnVuY31jYXRjaChlKXtiPSExfXJldHVyblwiRXFcIj09Yz9iOiFifSx0cCRkZXNjcl9nZXQoYSxjKXtyZXR1cm4gdGhpc30sdHAkZ2V0YXR0cihhLGMpe2NvbnN0IGI9U2suYWJzdHIubG9va3VwU3BlY2lhbCh0aGlzLGEpO3JldHVybiB2b2lkIDAhPT1iP2I6dGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoYSxcbmMpfX0sZ2V0c2V0czp7X19mdW5jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5pbV9mdW5jfX0sX19zZWxmX186eyRnZXQoKXtyZXR1cm4gdGhpcy5pbV9zZWxmfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLmltX2Z1bmMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kZG9jKX19fSxmbGFnczp7c2skc3VpdGFibGVfYXNfYmFzZV9jbGFzczohMX19KX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2lmKG51bGwhPT1hJiZ2b2lkIDAhPT1hKXtpZihhLm5iJGluZGV4KXJldHVybiBhLm5iJGluZGV4KCk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpKXJldHVybiBhfX1mdW5jdGlvbiBjKGIsYyl7Y29uc3QgZT1hKGIpO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGU7Yz0oY3x8XCIne3RwJG5hbWV9JyBvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGludGVnZXJcIikucmVwbGFjZShcInt0cCRuYW1lfVwiLFNrLmFic3RyLnR5cGVOYW1lKGIpKTtcbnRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihjKTt9U2subWlzY2V2YWw9e307U2subWlzY2V2YWwuU3VzcGVuc2lvbj1mdW5jdGlvbihhLGMsZil7dGhpcy4kaXNTdXNwZW5zaW9uPSEwO3ZvaWQgMCE9PWEmJnZvaWQgMCE9PWMmJih0aGlzLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBhKGMucmVzdW1lKCkpfSk7dGhpcy5jaGlsZD1jO3RoaXMub3B0aW9uYWw9dm9pZCAwIT09YyYmYy5vcHRpb25hbDt0aGlzLmRhdGE9dm9pZCAwPT09ZiYmdm9pZCAwIT09Yz9jLmRhdGE6Zn07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuU3VzcGVuc2lvblwiLFNrLm1pc2NldmFsLlN1c3BlbnNpb24pO1NrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdz1mdW5jdGlvbihhLGMpe2Zvcig7YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb247KXtpZighYS5vcHRpb25hbCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TdXNwZW5zaW9uRXJyb3IoY3x8XCJDYW5ub3QgY2FsbCBhIGZ1bmN0aW9uIHRoYXQgYmxvY2tzIG9yIHN1c3BlbmRzIGhlcmVcIik7XG5hPWEucmVzdW1lKCl9cmV0dXJuIGF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvd1wiLFNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyk7U2subWlzY2V2YWwuaXNJbmRleD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWEmJih2b2lkIDAhPT1hLm5iJGluZGV4fHxcIm51bWJlclwiPT09dHlwZW9mIGEmJk51bWJlci5pc0ludGVnZXIoYSkpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5pc0luZGV4XCIsU2subWlzY2V2YWwuaXNJbmRleCk7U2subWlzY2V2YWwuYXNJbmRleD1hO1NrLm1pc2NldmFsLmFzSW5kZXhTaXplZD1mdW5jdGlvbihhLGUsZil7Zj1jKGEsZik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBmKXJldHVybiBmO2lmKG51bGw9PWUpcmV0dXJuIEpTQkkubGVzc1RoYW4oZixKU0JJLl9fWkVSTyk/LU51bWJlci5NQVhfU0FGRV9JTlRFR0VSOk51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xudGhyb3cgbmV3IGUoXCJjYW5ub3QgZml0ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgaW50byBhbiBpbmRleC1zaXplZCBpbnRlZ2VyXCIpO307U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3c9YztTay5taXNjZXZhbC5hcHBseVNsaWNlPWZ1bmN0aW9uKGEsYyxmLGwpe3JldHVybiBTay5hYnN0ci5vYmplY3RHZXRJdGVtKGEsbmV3IFNrLmJ1aWx0aW4uc2xpY2UoYyxmLG51bGwpLGwpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hcHBseVNsaWNlXCIsU2subWlzY2V2YWwuYXBwbHlTbGljZSk7U2subWlzY2V2YWwuYXNzaWduU2xpY2U9ZnVuY3Rpb24oYSxjLGYsbCxoKXtjPW5ldyBTay5idWlsdGluLnNsaWNlKGMsZik7cmV0dXJuIG51bGw9PT1sP1NrLmFic3RyLm9iamVjdERlbEl0ZW0oYSxjKTpTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsYyxsLGgpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hc3NpZ25TbGljZVwiLFNrLm1pc2NldmFsLmFzc2lnblNsaWNlKTtcblNrLm1pc2NldmFsLmFycmF5RnJvbUFyZ3VtZW50cz1mdW5jdGlvbihhKXt2YXIgYjtpZigxIT1hLmxlbmd0aClyZXR1cm4gYTt2YXIgYz1hWzBdO2MgaW5zdGFuY2VvZiBTay5idWlsdGluLnNldD9jPWMudHAkaXRlcigpLiRvYmo6YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCYmKGM9U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5rZXlzLmZ1bmNfY29kZShjKSk7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdHx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpcmV0dXJuIGMudjtpZihTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpe2E9W107Yz1Tay5hYnN0ci5pdGVyKGMpO2ZvcihiPWMudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9Yy50cCRpdGVybmV4dCgpKWEucHVzaChiKTtyZXR1cm4gYX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHNcIixcblNrLm1pc2NldmFsLmFycmF5RnJvbUFyZ3VtZW50cyk7U2subWlzY2V2YWwuaXRlcmF0b3I9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLnRwJGl0ZXJuZXh0PWM/YTpmdW5jdGlvbihiKXtsZXQgYz1hKCk7cmV0dXJuIGJ8fCFjLiRpc1N1c3BlbnNpb24/YzpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9fSxpdGVybmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cCRpdGVybmV4dChhKX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5taXNjZXZhbC5zd2FwcGVkT3BfPXtFcTpcIkVxXCIsTm90RXE6XCJOb3RFcVwiLEx0OlwiR3RcIixMdEU6XCJHdEVcIixHdDpcIkx0XCIsR3RFOlwiTHRFXCJ9O1NrLm1pc2NldmFsLm9wU3ltYm9scz17RXE6XCI9PVwiLE5vdEVxOlwiIT1cIixMdDpcIjxcIixMdEU6XCI8PVwiLEd0OlwiPlwiLEd0RTpcIj49XCIsSXM6XCJpc1wiLElzTm90OlwiaXMgbm90XCIsXG5Jbl86XCJpblwiLE5vdEluOlwibm90IGluXCJ9O1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbD1mdW5jdGlvbihhLGMsZixsKXtTay5hc3NlcnRzLmFzc2VydChhLnNrJG9iamVjdCYmYy5zayRvYmplY3QsXCJKUyBvYmplY3QgcGFzc2VkIHRvIHJpY2hDb21wYXJlQm9vbFwiKTt2YXIgYjt2YXIgZD1hLm9iJHR5cGU7dmFyIGU9Yy5vYiR0eXBlLG49ZSE9PWQmJnZvaWQgMD09PWUuc2skYmFzZUNsYXNzJiZlLiRpc1N1YlR5cGUoZCk7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyYmZCE9PWUmJihcIkd0RVwiPT09Znx8XCJHdFwiPT09Znx8XCJMdEVcIj09PWZ8fFwiTHRcIj09PWYpKXt2YXIgaz1bU2suYnVpbHRpbi5mbG9hdF8sU2suYnVpbHRpbi5pbnRfLFNrLmJ1aWx0aW4ubG5nLFNrLmJ1aWx0aW4uYm9vbF0scD1bU2suYnVpbHRpbi5kaWN0LFNrLmJ1aWx0aW4uZW51bWVyYXRlLFNrLmJ1aWx0aW4uZmlsdGVyXyxTay5idWlsdGluLmxpc3QsU2suYnVpbHRpbi5tYXBfLFNrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW4udHVwbGUsXG5Tay5idWlsdGluLnppcF9dO2NvbnN0IGI9ay5pbmRleE9mKGQpLGc9cC5pbmRleE9mKGQpO2s9ay5pbmRleE9mKGUpO3A9cC5pbmRleE9mKGUpO2lmKGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiEwO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMDtjYXNlIFwiR3RcIjpyZXR1cm4hMTtjYXNlIFwiR3RFXCI6cmV0dXJuITF9aWYoYz09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJClzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuITE7Y2FzZSBcIkx0RVwiOnJldHVybiExO2Nhc2UgXCJHdFwiOnJldHVybiEwO2Nhc2UgXCJHdEVcIjpyZXR1cm4hMH1pZigtMSE9PWImJi0xIT09cClzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuITA7Y2FzZSBcIkx0RVwiOnJldHVybiEwO2Nhc2UgXCJHdFwiOnJldHVybiExO2Nhc2UgXCJHdEVcIjpyZXR1cm4hMX1pZigtMSE9PWcmJi0xIT09aylzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuITE7Y2FzZSBcIkx0RVwiOnJldHVybiExO2Nhc2UgXCJHdFwiOnJldHVybiEwO1xuY2FzZSBcIkd0RVwiOnJldHVybiEwfWlmKC0xIT09ZyYmLTEhPT1wKXN3aXRjaChmKXtjYXNlIFwiTHRcIjpyZXR1cm4gZzxwO2Nhc2UgXCJMdEVcIjpyZXR1cm4gZzw9cDtjYXNlIFwiR3RcIjpyZXR1cm4gZz5wO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZz49cH19aWYoXCJJc1wiPT09Zil7aWYoZD09PWUpe2lmKGE9PT1jKXJldHVybiEwO2lmKGQ9PT1Tay5idWlsdGluLmZsb2F0XylyZXR1cm4gYS52PT09Yy52O2lmKGQ9PT1Tay5idWlsdGluLmludF8pcmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhLnYmJlwibnVtYmVyXCI9PT10eXBlb2YgYS52P2Eudj09PWMudjpKU0JJLmVxdWFsKEpTQkkuQmlnSW50KGEudiksSlNCSS5CaWdJbnQoYy52KSl9cmV0dXJuITF9aWYoXCJJc05vdFwiPT09ZilyZXR1cm4gZCE9PWU/ITA6ZD09PVNrLmJ1aWx0aW4uZmxvYXRfP2EudiE9PWMudjpkPT09U2suYnVpbHRpbi5pbnRfP1wibnVtYmVyXCI9PT10eXBlb2YgYS52JiZcIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnYhPT1jLnY6SlNCSS5ub3RFcXVhbChKU0JJLkJpZ0ludChhLnYpLFxuSlNCSS5CaWdJbnQoYy52KSk6YSE9PWM7aWYoXCJJblwiPT09ZilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEsbCksU2subWlzY2V2YWwuaXNUcnVlKTtpZihcIk5vdEluXCI9PT1mKXJldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5hYnN0ci5zZXF1ZW5jZUNvbnRhaW5zKGMsYSxsKSxmdW5jdGlvbihhKXtyZXR1cm4hU2subWlzY2V2YWwuaXNUcnVlKGEpfSk7ZT17RXE6XCJvYiRlcVwiLE5vdEVxOlwib2IkbmVcIixHdDpcIm9iJGd0XCIsR3RFOlwib2IkZ2VcIixMdDpcIm9iJGx0XCIsTHRFOlwib2IkbGVcIn07ZD1lW2ZdO2lmKG4mJihsPWVbU2subWlzY2V2YWwuc3dhcHBlZE9wX1tmXV0sY1tsXSE9PWFbbF0mJihiPWNbbF0oYSkpIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpfHwoYj1hW2RdKGMpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfHwhbiYmKGw9ZVtTay5taXNjZXZhbC5zd2FwcGVkT3BfW2ZdXSxcbihiPWNbbF0oYSkpIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpKXJldHVybiBTay5taXNjZXZhbC5pc1RydWUoYik7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl7aWYobj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGNtcCkpdHJ5e2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG4sW2NdKTtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO2lmKFwiRXFcIj09PWYpcmV0dXJuIDA9PT1iO2lmKFwiTm90RXFcIj09PWYpcmV0dXJuIDAhPT1iO2lmKFwiTHRcIj09PWYpcmV0dXJuIDA+YjtpZihcIkd0XCI9PT1mKXJldHVybiAwPGI7aWYoXCJMdEVcIj09PWYpcmV0dXJuIDA+PWI7aWYoXCJHdEVcIj09PWYpcmV0dXJuIDA8PWJ9aWYoYiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50XCIpO1xufWNhdGNoKHUpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50XCIpO31pZihuPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYyxTay5idWlsdGluLnN0ci4kY21wKSl0cnl7Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkobixbYV0pO2lmKFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpe2I9U2suYnVpbHRpbi5hc251bSQoYik7aWYoXCJFcVwiPT09ZilyZXR1cm4gMD09PWI7aWYoXCJOb3RFcVwiPT09ZilyZXR1cm4gMCE9PWI7aWYoXCJMdFwiPT09ZilyZXR1cm4gMDxiO2lmKFwiR3RcIj09PWYpcmV0dXJuIDA+YjtpZihcIkx0RVwiPT09ZilyZXR1cm4gMDw9YjtpZihcIkd0RVwiPT09ZilyZXR1cm4gMD49Yn1pZihiIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGFyaXNvbiBkaWQgbm90IHJldHVybiBhbiBpbnRcIik7fWNhdGNoKHUpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50XCIpO1xufWlmKGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQmJmM9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpe2lmKFwiRXFcIj09PWYpcmV0dXJuIGEudj09PWMudjtpZihcIk5vdEVxXCI9PT1mKXJldHVybiBhLnYhPT1jLnY7aWYoXCJHdFwiPT09ZilyZXR1cm4gYS52PmMudjtpZihcIkd0RVwiPT09ZilyZXR1cm4gYS52Pj1jLnY7aWYoXCJMdFwiPT09ZilyZXR1cm4gYS52PGMudjtpZihcIkx0RVwiPT09ZilyZXR1cm4gYS52PD1jLnZ9fWlmKFwiRXFcIj09PWYpcmV0dXJuIGE9PT1jO2lmKFwiTm90RXFcIj09PWYpcmV0dXJuIGEhPT1jO2E9U2suYWJzdHIudHlwZU5hbWUoYSk7Yz1Tay5hYnN0ci50eXBlTmFtZShjKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2subWlzY2V2YWwub3BTeW1ib2xzW2ZdK1wiJyBub3Qgc3VwcG9ydGVkIGJldHdlZW4gaW5zdGFuY2VzIG9mICdcIithK1wiJyBhbmQgJ1wiK2MrXCInXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sXCIsU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKTtcblNrLm1pc2NldmFsLm9iamVjdFJlcHI9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YSxcInRyeWluZyB0byByZXByIHVuZGVmaW5lZFwiKTtpZihudWxsIT09YSYmYS4kcilyZXR1cm4gYS4kcigpLnY7dHJ5e3JldHVybihuZXcgU2suYnVpbHRpbi5zdHIoYSkpLnZ9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uVHlwZUVycm9yKXJldHVyblwiPHVua25vd24+XCI7dGhyb3cgZTt9fTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5vYmplY3RSZXByXCIsU2subWlzY2V2YWwub2JqZWN0UmVwcik7U2subWlzY2V2YWwub3BBbGxvd3NFcXVhbGl0eT1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSBcIkx0RVwiOmNhc2UgXCJFcVwiOmNhc2UgXCJHdEVcIjpyZXR1cm4hMH1yZXR1cm4hMX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwub3BBbGxvd3NFcXVhbGl0eVwiLFNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkpO1NrLm1pc2NldmFsLmlzVHJ1ZT1mdW5jdGlvbihhKXtyZXR1cm4hMD09PVxuYXx8YT09PVNrLmJ1aWx0aW4uYm9vbC50cnVlJD8hMDohMT09PWF8fGE9PT1Tay5idWlsdGluLmJvb2wuZmFsc2UkfHxudWxsPT09YXx8dm9pZCAwPT09YT8hMTphLm5iJGJvb2w/YS5uYiRib29sKCk6YS5zcSRsZW5ndGg/MCE9PWEuc3EkbGVuZ3RoKCk6ISFhfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5pc1RydWVcIixTay5taXNjZXZhbC5pc1RydWUpO1NrLm1pc2NldmFsLnNvZnRzcGFjZV89ITE7U2subWlzY2V2YWwucHJpbnRfPWZ1bmN0aW9uKGEpe1NrLm1pc2NldmFsLnNvZnRzcGFjZV8mJihcIlxcblwiIT09YSYmU2sub3V0cHV0KFwiIFwiKSxTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExKTt2YXIgYj1uZXcgU2suYnVpbHRpbi5zdHIoYSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcInN5c1wiLCExLCEwKSxmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHkoYS4kZC5zdGRvdXQud3JpdGUsdm9pZCAwLHZvaWQgMCx2b2lkIDAsW2EuJGQuc3Rkb3V0LFxuYl0pfSxmdW5jdGlvbigpe3ZhciBhOyhhPTA9PT1iLnYubGVuZ3RoKXx8KGE9Yi52W2Iudi5sZW5ndGgtMV0sYT0hKFwiXFxuXCI9PT1hfHxcIlxcdFwiPT09YXx8XCJcXHJcIj09PWEpKTtpZihhfHxcIiBcIj09PWIudltiLnYubGVuZ3RoLTFdKVNrLm1pc2NldmFsLnNvZnRzcGFjZV89ITB9KX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwucHJpbnRfXCIsU2subWlzY2V2YWwucHJpbnRfKTtTay5taXNjZXZhbC5sb2FkbmFtZT1mdW5jdGlvbihhLGMpe2M9Y1thXTtpZih2b2lkIDAhPT1jKXJldHVybiBjO2M9U2suYnVpbHRpbnNbYV07aWYodm9pZCAwIT09YylyZXR1cm4gYzt0aHJvdyBuZXcgU2suYnVpbHRpbi5OYW1lRXJyb3IoXCJuYW1lICdcIitTay51bmZpeFJlc2VydmVkKGEpK1wiJyBpcyBub3QgZGVmaW5lZFwiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmxvYWRuYW1lXCIsU2subWlzY2V2YWwubG9hZG5hbWUpO1NrLm1pc2NldmFsLmNhbGw9ZnVuY3Rpb24oYSxjLGYsbCxoKXtoPVxuQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDQpO3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLGMsZixsLGgpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsXCIsU2subWlzY2V2YWwuY2FsbCk7U2subWlzY2V2YWwuY2FsbEFzeW5jPWZ1bmN0aW9uKGEsYyxmLGwsaCxkKXtkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyw1KTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlBc3luYyhhLGMsZixsLGgsZCl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxBc3luY1wiLFNrLm1pc2NldmFsLmNhbGxBc3luYyk7U2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZD1mdW5jdGlvbihhLGMsZixsLGgpe2g9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDQpO3JldHVybiBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChhLGMsZixsLGgpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsT3JTdXNwZW5kXCIsXG5Tay5taXNjZXZhbC5jYWxsT3JTdXNwZW5kKTtTay5taXNjZXZhbC5jYWxsc2ltPWZ1bmN0aW9uKGEsYyl7Yz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5KGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAsYyl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1cIixTay5taXNjZXZhbC5jYWxsc2ltKTtTay5taXNjZXZhbC5jYWxsc2ltQXJyYXk9ZnVuY3Rpb24oYSxjLGYpe2M9Y3x8W107cmV0dXJuIFNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYSxjLGYpKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbHNpbUFycmF5XCIsU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KTtTay5taXNjZXZhbC5jYWxsc2ltQXN5bmM9ZnVuY3Rpb24oYSxjLGYpe2Y9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLFxuMik7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5QXN5bmMoYSxjLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGYpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltQXN5bmNcIixTay5taXNjZXZhbC5jYWxsc2ltQXN5bmMpO1NrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmQ9ZnVuY3Rpb24oYSxjKXtjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYSx2b2lkIDAsdm9pZCAwLHZvaWQgMCxjKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZFwiLFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmQpO1NrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheT1mdW5jdGlvbihhLGMsZil7Yz1jfHxbXTtyZXR1cm4gdm9pZCAwIT09YSYmYS50cCRjYWxsP2EudHAkY2FsbChjLGYpOlNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKGEsdm9pZCAwLHZvaWQgMCxmLFxuYyl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheVwiLFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSk7U2subWlzY2V2YWwuYXBwbHk9ZnVuY3Rpb24oYSxjLGYsbCxoKXthPVNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKGEsYyxmLGwsaCk7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uP1NrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhhKTphfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hcHBseVwiLFNrLm1pc2NldmFsLmFwcGx5KTtTay5taXNjZXZhbC5hc3luY1RvUHJvbWlzZT1mdW5jdGlvbihhLGMpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihiLGUpe3RyeXsoZnVuY3Rpb24gZyhhKXt0cnl7Zm9yKHZhciBkPWZ1bmN0aW9uKCl7dHJ5e2coYS5yZXN1bWUoKSl9Y2F0Y2godCl7ZSh0KX19LGY9ZnVuY3Rpb24oYil7dHJ5e2EuZGF0YS5yZXN1bHQ9YixcbmQoKX1jYXRjaCh2KXtlKHYpfX0scD1mdW5jdGlvbihiKXt0cnl7YS5kYXRhLmVycm9yPWIsZCgpfWNhdGNoKHYpe2Uodil9fTthIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbjspe3ZhciBsPWMmJihjW2EuZGF0YS50eXBlXXx8Y1tcIipcIl0pO2lmKGwpe3ZhciBBPWwoYSk7aWYoQSl7QS50aGVuKGcsZSk7cmV0dXJufX1pZihcIlNrLnByb21pc2VcIj09YS5kYXRhLnR5cGUpe2EuZGF0YS5wcm9taXNlLnRoZW4oZixwKTtyZXR1cm59aWYoXCJTay55aWVsZFwiPT1hLmRhdGEudHlwZSl7U2suZ2xvYmFsLnNldEltbWVkaWF0ZShkKTtyZXR1cm59aWYoXCJTay5kZWxheVwiPT1hLmRhdGEudHlwZSl7U2suZ2xvYmFsLnNldEltbWVkaWF0ZShkKTtyZXR1cm59aWYoYS5vcHRpb25hbClhPWEucmVzdW1lKCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5TdXNwZW5zaW9uRXJyb3IoXCJVbmhhbmRsZWQgbm9uLW9wdGlvbmFsIHN1c3BlbnNpb24gb2YgdHlwZSAnXCIrYS5kYXRhLnR5cGUrXCInXCIpO1xufWIoYSl9Y2F0Y2godCl7ZSh0KX19KShhKCkpfWNhdGNoKGgpe2UoaCl9fSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlXCIsU2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2UpO1NrLm1pc2NldmFsLmFwcGx5QXN5bmM9ZnVuY3Rpb24oYSxjLGYsbCxoLGQpe3JldHVybiBTay5taXNjZXZhbC5hc3luY1RvUHJvbWlzZShmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChjLGYsbCxoLGQpfSxhKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlBc3luY1wiLFNrLm1pc2NldmFsLmFwcGx5QXN5bmMpO1NrLm1pc2NldmFsLmNoYWluPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBiPTEsZT1hLGgsZDs7KXtpZihiPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBlO2lmKGUmJmUuJGlzU3VzcGVuc2lvbilicmVhaztlPWFyZ3VtZW50c1tiXShlKTtiKyt9ZD1BcnJheShhcmd1bWVudHMubGVuZ3RoLWIpO2ZvcihoPTA7aDxhcmd1bWVudHMubGVuZ3RoLVxuYjtoKyspZFtoXT1hcmd1bWVudHNbYitoXTtoPTA7cmV0dXJuIGZ1bmN0aW9uIGsoYSl7Zm9yKDtoPGQubGVuZ3RoOyl7aWYoYSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKGssYSk7YT1kW2hdKGEpO2grK31yZXR1cm4gYX0oZSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNoYWluXCIsU2subWlzY2V2YWwuY2hhaW4pO1NrLm1pc2NldmFsLnRyeUNhdGNoPWZ1bmN0aW9uKGEsYyl7dHJ5e3ZhciBiPWEoKX1jYXRjaChsKXtyZXR1cm4gYyhsKX1yZXR1cm4gYiBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24/KGE9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb24odm9pZCAwLGIpLGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLm1pc2NldmFsLnRyeUNhdGNoKGIucmVzdW1lLGMpfSxhKTpifTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC50cnlDYXRjaFwiLFNrLm1pc2NldmFsLnRyeUNhdGNoKTtcblNrLm1pc2NldmFsLml0ZXJGb3I9ZnVuY3Rpb24oYSxjLGYpe3ZhciBiPWYsZT1mdW5jdGlvbihjKXtiPWM7cmV0dXJuIGMgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5CcmVhaz9jOmEudHAkaXRlcm5leHQoITApfTtyZXR1cm4gZnVuY3Rpb24gbihhKXtmb3IoO3ZvaWQgMCE9PWE7KXtpZihhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbilyZXR1cm4gbmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb24obixhKTtpZihhPT09U2subWlzY2V2YWwuQnJlYWt8fGEgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5CcmVhaylyZXR1cm4gYS5iclZhbHVlO2E9U2subWlzY2V2YWwuY2hhaW4oYyhhLGIpLGUpfXJldHVybiBifShhLnRwJGl0ZXJuZXh0KCEwKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLml0ZXJGb3JcIixTay5taXNjZXZhbC5pdGVyRm9yKTtTay5taXNjZXZhbC5pdGVyQXJyYXk9ZnVuY3Rpb24oYSxjLGYpe1NrLmFzc2VydHMuYXNzZXJ0KEFycmF5LmlzQXJyYXkoYSksXG5cIml0ZXJBcmdzIHJlcXVpcmVzIGFuIGFycmF5XCIpO2xldCBiPTA7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3Ioe3RwJGl0ZXJuZXh0OigpPT5hW2IrK119LGMsZil9O1NrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlPWZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwPT09YSlyZXR1cm5bXTtpZih2b2lkIDA9PT1hLmhwJHR5cGUmJnZvaWQgMCE9PWEuc2skYXNhcnJheSlyZXR1cm4gYS5zayRhc2FycmF5KCk7Y29uc3QgYj1bXTthPVNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57Yi5wdXNoKGEpfSksKCk9PmIpO3JldHVybiBjP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpfTtTay5taXNjZXZhbC5CcmVhaz1mdW5jdGlvbihhKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5CcmVhaykpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhhKTt0aGlzLmJyVmFsdWU9YX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuQnJlYWtcIixcblNrLm1pc2NldmFsLkJyZWFrKTtTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZD1mdW5jdGlvbihhLGMsZixsLGgpe3ZhciBiO2lmKG51bGw9PWF8fGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBhJiZ2b2lkIDA9PT1hLnRwJGNhbGwmJihhPW5ldyBTay5idWlsdGluLmZ1bmMoYSkpO3ZhciBlPWEudHAkY2FsbDtpZih2b2lkIDAhPT1lKXtpZihmKWZvcihmPWYudHAkaXRlcigpLGI9Zi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1mLnRwJGl0ZXJuZXh0KCkpaC5wdXNoKGIpO2lmKGMpZm9yKGY9U2suYWJzdHIuaXRlcihjKSxiPWYudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9Zi50cCRpdGVybmV4dCgpKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJGdW5jdGlvbiBrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3NcIik7XG5sLnB1c2goYi52KTtsLnB1c2goU2suYWJzdHIub2JqZWN0R2V0SXRlbShjLGIsITEpKX1yZXR1cm4gZS5jYWxsKGEsaCxsLGMpfWU9YS5fX2NhbGxfXztpZih2b2lkIDAhPT1lKXJldHVybiBoLnVuc2hpZnQoYSksU2subWlzY2V2YWwuYXBwbHkoZSxjLGYsbCxoKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBpcyBub3QgY2FsbGFibGVcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZFwiLFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKTtTay5taXNjZXZhbC5wcm9taXNlVG9TdXNwZW5zaW9uPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO2IucmVzdW1lPWZ1bmN0aW9uKCl7aWYoYi5kYXRhLmVycm9yKXRocm93IGIuZGF0YS5lcnJvcjtyZXR1cm4gYi5kYXRhLnJlc3VsdH07Yi5kYXRhPXt0eXBlOlwiU2sucHJvbWlzZVwiLHByb21pc2U6YX07cmV0dXJuIGJ9O1xuU2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwucHJvbWlzZVRvU3VzcGVuc2lvblwiLFNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb24pO1NrLm1pc2NldmFsLmJ1aWxkQ2xhc3M9ZnVuY3Rpb24oYSxjLGYsbCxoKXt2YXIgYj1Tay5idWlsdGluLnR5cGUsZT17fTtjKGEsZSx2b2lkIDA9PT1oP3t9OmgpO2EuX19uYW1lX18mJihlLl9fbW9kdWxlX189YS5fX25hbWVfXyk7YT1uZXcgU2suYnVpbHRpbi5zdHIoZik7bD1uZXcgU2suYnVpbHRpbi50dXBsZShsKTtjPVtdO2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJihjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKG4pKSxjLnB1c2goZVtuXSkpO2M9bmV3IFNrLmJ1aWx0aW4uZGljdChjKTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW2EsbCxjXSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmJ1aWxkQ2xhc3NcIixTay5taXNjZXZhbC5idWlsZENsYXNzKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmNhbGxhYmxlX2l0ZXJfPVxuU2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiY2FsbGFibGVfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXtpZighU2suYnVpbHRpbi5jaGVja0NhbGxhYmxlKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIml0ZXIodiwgdyk6IHYgbXVzdCBiZSBjYWxsYWJsZVwiKTt0aGlzLiRjYWxsYWJsZT1hO3RoaXMuJHNlbnRpbmVsPWM7dGhpcy4kZmxhZz0hMX0saXRlcm5leHQoYSl7aWYoITAhPT10aGlzLiRmbGFnKXtpZihhKXJldHVybiBhPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLiRjYWxsYWJsZSxbXSksU2subWlzY2V2YWwuY2hhaW4oYSxhPT57aWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsdGhpcy4kc2VudGluZWwsXCJFcVwiLCEwKSl0aGlzLiRmbGFnPSEwO2Vsc2UgcmV0dXJuIGF9KTthPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLiRjYWxsYWJsZSxbXSk7aWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsXG50aGlzLiRzZW50aW5lbCxcIkVxXCIsITEpKXRoaXMuJGZsYWc9ITA7ZWxzZSByZXR1cm4gYX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suYnVpbHRpbi5zZXFfaXRlcl89U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YX0saXRlcm5leHQoYSl7bGV0IGM7Yz1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+dGhpcy4kc2VxLm1wJHN1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJGluZGV4KyspLGEpLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkluZGV4RXJyb3J8fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLlN0b3BJdGVyYXRpb24pKXRocm93IGE7fSk7cmV0dXJuIGE/YzpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzp7JGZsYWdzOntOb0FyZ3M6ITB9LFxuJG1ldGgoKXtpZih0aGlzLiRzZXEuc3EkbGVuZ3RoKXJldHVybiB0aGlzLiRzZXEuc3EkbGVuZ3RoKCktdGhpcy4kaW5kZXg7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImxlbiBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMuJHNlcSkpO319fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2FsbGFibGVfaXRlcl9cIixTay5idWlsdGluLmNhbGxhYmxlX2l0ZXJfKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmxpc3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImxpc3RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5saXN0LFwiYmFkIGNhbGwgdG8gbGlzdCwgdXNlICduZXcnIHdpdGggYW4gQXJyYXkgb2YgcHl0aG9uIG9iamVjdHNcIik7XG50aGlzLnY9YTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJGRvYzpcIkJ1aWx0LWluIG11dGFibGUgc2VxdWVuY2UuXFxuXFxuSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbmV3IGVtcHR5IGxpc3QuXFxuVGhlIGFyZ3VtZW50IG11c3QgYmUgYW4gaXRlcmFibGUgaWYgc3BlY2lmaWVkLlwiLHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcImxpc3RcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJsaXN0XCIsYSwwLDEpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhWzBdLCEwKSxhPT57dGhpcy52PWF9KX0sJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIlsuLi5dXCIpO1xudGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy52Lm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTt0aGlzLmluJHJlcHI9ITE7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIltcIithLmpvaW4oXCIsIFwiKStcIl1cIil9LHRwJHJpY2hjb21wYXJlOlNrLmdlbmVyaWMuc2VxQ29tcGFyZSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBhKHRoaXMpfSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy52Lmxlbmd0aH0sc3EkY29uY2F0KGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgY29uY2F0ZW5hdGUgbGlzdCB0byBsaXN0XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMudi5jb25jYXQoYS52KSl9LHNxJGNvbnRhaW5zKGEpe2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKWlmKGM9PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxcbmEsXCJFcVwiKSlyZXR1cm4hMDtyZXR1cm4hMX0sc3EkcmVwZWF0KGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZihhKnRoaXMudi5sZW5ndGg+TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcjtjb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YTtjKyspZm9yKGxldCBhPTA7YTx0aGlzLnYubGVuZ3RoO2ErKyliLnB1c2godGhpcy52W2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpcmV0dXJuIGE9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKSxcbmE9dGhpcy5saXN0JGluUmFuZ2UoYSxcImxpc3QgaW5kZXggb3V0IG9mIHJhbmdlXCIpLHRoaXMudlthXTtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7Y29uc3QgYj1bXTthLnNzc2l0ZXIkKHRoaXMudi5sZW5ndGgsYT0+e2IucHVzaCh0aGlzLnZbYV0pfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sbXAkYXNzX3N1YnNjcmlwdChhLGMpe3ZvaWQgMD09PWM/dGhpcy5kZWwkc3Vic2NyaXB0KGEpOnRoaXMuYXNzJHN1YnNjcmlwdChhLGMpfSxzcSRpbnBsYWNlX2NvbmNhdChhKXtyZXR1cm4gYT09PXRoaXM/KHRoaXMudi5wdXNoKC4uLnRoaXMudiksdGhpcyk6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9Pnt0aGlzLnYucHVzaChhKX0pLFxuKCk9PnRoaXMpfSxzcSRpbnBsYWNlX3JlcGVhdChhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Y29uc3QgYj10aGlzLnYubGVuZ3RoO2lmKDA+PWEpdGhpcy52Lmxlbmd0aD0wO2Vsc2UgaWYoYSpiPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7Zm9yKGxldCBjPTE7YzxhO2MrKylmb3IobGV0IGE9MDthPGI7YSsrKXRoaXMudi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIHRoaXN9fSxtZXRob2RzOntfX3JldmVyc2VkX186eyRtZXRoKCl7cmV0dXJuIG5ldyBjKHRoaXMpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsXG4kZG9jOlwiUmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBsaXN0LlwifSxjbGVhcjp7JG1ldGgoKXt0aGlzLnYubGVuZ3RoPTA7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZW1vdmUgYWxsIGl0ZW1zIGZyb20gbGlzdC5cIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYuc2xpY2UoMCkpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGUgbGlzdC5cIn0sYXBwZW5kOnskbWV0aChhKXt0aGlzLnYucHVzaChhKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIG9iamVjdCwgLylcIiwkZG9jOlwiQXBwZW5kIG9iamVjdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlwifSxpbnNlcnQ6eyRtZXRoKGEsXG5jKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7KHtzdGFydDphfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGEpKTt0aGlzLnYuc3BsaWNlKGEsMCxjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCBpbmRleCwgb2JqZWN0LCAvKVwiLCRkb2M6XCJJbnNlcnQgb2JqZWN0IGJlZm9yZSBpbmRleC5cIn0sZXh0ZW5kOnskbWV0aChhKXtyZXR1cm4gYT09PXRoaXM/KHRoaXMudi5wdXNoKC4uLnRoaXMudiksU2suYnVpbHRpbi5ub25lLm5vbmUkKTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMudi5wdXNoKGEpfSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgaXRlcmFibGUsIC8pXCIsJGRvYzpcIkV4dGVuZCBsaXN0IGJ5IGFwcGVuZGluZyBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYWJsZS5cIn0sXG5wb3A6eyRtZXRoKGEpe2E9dm9pZCAwPT09YT90aGlzLnYubGVuZ3RoLTE6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTthPXRoaXMubGlzdCRpblJhbmdlKGEsXCJwb3AgaW5kZXggb3V0IG9mIHJhbmdlXCIpO2NvbnN0IGI9dGhpcy52W2FdO3RoaXMudi5zcGxpY2UoYSwxKTtyZXR1cm4gYn0sJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5kZXg9LTEsIC8pXCIsJGRvYzpcIlJlbW92ZSBhbmQgcmV0dXJuIGl0ZW0gYXQgaW5kZXggKGRlZmF1bHQgbGFzdCkuXFxuXFxuUmFpc2VzIEluZGV4RXJyb3IgaWYgbGlzdCBpcyBlbXB0eSBvciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXCJ9LHJlbW92ZTp7JG1ldGgoYSl7YT10aGlzLmxpc3QkaW5kZXhPZihhKTtpZigtMT09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImxpc3QucmVtb3ZlKHgpOiB4IG5vdCBpbiBsaXN0XCIpO3RoaXMudi5zcGxpY2UoYSxcbjEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGRvYzpcIlJlbW92ZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHZhbHVlLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cIn0sc29ydDp7JG1ldGgoYSxjKXtpZihhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzb3J0KCkgdGFrZXMgbm8gcG9zaXRpb25hbCBhcmd1bWVudHNcIik7Y29uc3QgW2IsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJzb3J0XCIsW1wia2V5XCIsXCJyZXZlcnNlXCJdLGEsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSRdKTtyZXR1cm4gdGhpcy5saXN0JHNvcnQodm9pZCAwLGIsZSl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqLCBrZXk9Tm9uZSwgcmV2ZXJzZT1GYWxzZSlcIixcbiRkb2M6XCJTdGFibGUgc29ydCAqSU4gUExBQ0UqLlwifSxpbmRleDp7JG1ldGgoYSxjLGYpe2lmKHZvaWQgMCE9PWMmJiFTay5taXNjZXZhbC5pc0luZGV4KGMpfHx2b2lkIDAhPT1mJiYhU2subWlzY2V2YWwuaXNJbmRleChmKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpO2M9dGhpcy5saXN0JGluZGV4T2YoYSxjLGYpO2lmKC0xPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXCIgaXMgbm90IGluIGxpc3RcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBzdGFydD0wLCBzdG9wPXN5cy5tYXhzaXplLCAvKVwiLCRkb2M6XCJSZXR1cm4gZmlyc3QgaW5kZXggb2YgdmFsdWUuXFxuXFxuUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifSxcbmNvdW50OnskbWV0aChhKXtsZXQgYj0wO2NvbnN0IGM9dGhpcy52Lmxlbmd0aDtmb3IobGV0IGU9MDtlPGM7ZSsrKWlmKHRoaXMudltlXT09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCh0aGlzLnZbZV0sYSxcIkVxXCIpKWIrPTE7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGRvYzpcIlJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWUuXCJ9LHJldmVyc2U6eyRtZXRoKCl7dGhpcy5saXN0JHJldmVyc2UoKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldmVyc2UgKklOIFBMQUNFKi5cIn19LHByb3RvOntzayRhc2FycmF5KCl7cmV0dXJuIHRoaXMudi5zbGljZSgwKX0sbGlzdCRzb3J0OmZ1bmN0aW9uKGEsYyxmKXtjb25zdCBiPW51bGwhPWMmJmMhPT1Tay5idWlsdGluLm5vbmUubm9uZSQ7XG52YXIgZT1udWxsIT1hJiZhIT09U2suYnVpbHRpbi5ub25lLm5vbmUkO2xldCBkO2lmKHZvaWQgMD09PWYpZD0hMTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tJbnQoZikpZD1Tay5taXNjZXZhbC5pc1RydWUoZik7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkXCIpO2Y9bmV3IFNrLmJ1aWx0aW4udGltU29ydCh0aGlzKTt0aGlzLnY9W107Y29uc3QgZz1uZXcgU2suYnVpbHRpbi5pbnRfKDApO2lmKGIpe2YubHQ9ZT9mdW5jdGlvbihiLGMpe2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW2JbMF0sY1swXV0pO3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYixnLFwiTHRcIil9OmZ1bmN0aW9uKGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhWzBdLGJbMF0sXCJMdFwiKX07Zm9yKGxldCBhPTA7YTxmLmxpc3RsZW5ndGg7YSsrKXtlPWYubGlzdC52W2FdO2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGMsXG5bZV0pO2YubGlzdC52W2FdPVtiLGVdfX1lbHNlIGUmJihmLmx0PWZ1bmN0aW9uKGIsYyl7Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYixjXSk7cmV0dXJuIFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLGcsXCJMdFwiKX0pO2QmJmYubGlzdC5saXN0JHJldmVyc2UoKTtmLnNvcnQoKTtkJiZmLmxpc3QubGlzdCRyZXZlcnNlKCk7aWYoYilmb3IoYz0wO2M8Zi5saXN0bGVuZ3RoO2MrKyllPWYubGlzdC52W2NdWzFdLGYubGlzdC52W2NdPWU7Yz0wPHRoaXMuc3EkbGVuZ3RoKCk7dGhpcy52PWYubGlzdC52O2lmKGMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImxpc3QgbW9kaWZpZWQgZHVyaW5nIHNvcnRcIik7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sbGlzdCRpblJhbmdlKGEsYyl7MD5hJiYoYSs9dGhpcy52Lmxlbmd0aCk7aWYoMDw9YSYmYTx0aGlzLnYubGVuZ3RoKXJldHVybiBhO3Rocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoYyk7XG59LGxpc3QkaW5kZXhPZihhLGMsZil7Zm9yKHtzdGFydDpjLGVuZDpmfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGMsZik7YzxmJiZjPHRoaXMudi5sZW5ndGg7YysrKWlmKHRoaXMudltjXT09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCh0aGlzLnZbY10sYSxcIkVxXCIpKXJldHVybiBjO3JldHVybi0xfSxsaXN0JHJldmVyc2UoKXt0aGlzLnYucmV2ZXJzZSgpfSxhc3Mkc3Vic2NyaXB0KGEsYyl7aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl0aGlzLmFzcyRpbmRleChhLGMpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IHtzdGFydDpiLHN0b3A6ZSxzdGVwOmh9PWEuc2xpY2UkaW5kaWNlcyh0aGlzLnYubGVuZ3RoKTsxPT09aD90aGlzLmFzcyRzbGljZShiLGUsYyk6dGhpcy5hc3MkZXh0X3NsaWNlKGEsYyl9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpKTt9LGFzcyRpbmRleChhLGMpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKTthPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3RoaXMudlthXT1jfSxhc3Mkc2xpY2UoYSxjLGYpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgYXNzaWduIGFuIGl0ZXJhYmxlXCIpO2Y9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoZik7dGhpcy52LnNwbGljZShhLGMtYSwuLi5mKX0sYXNzJGV4dF9zbGljZShhLGMpe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2goYSl9KTtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm11c3QgYXNzaWduIGl0ZXJhYmxlIHRvIGV4dGVuZGVkIHNsaWNlXCIpO1xuYT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShjKTtpZihiLmxlbmd0aCE9PWEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJhdHRlbXB0IHRvIGFzc2lnbiBzZXF1ZW5jZSBvZiBzaXplIFwiK2EubGVuZ3RoK1wiIHRvIGV4dGVuZGVkIHNsaWNlIG9mIHNpemUgXCIrYi5sZW5ndGgpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy52LnNwbGljZShiW2NdLDEsYVtjXSl9LGRlbCRzdWJzY3JpcHQoYSl7aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl0aGlzLmRlbCRpbmRleChhKTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNsaWNlKXtjb25zdCB7c3RhcnQ6YixzdG9wOmMsc3RlcDpsfT1hLnNsaWNlJGluZGljZXModGhpcy52Lmxlbmd0aCk7MT09PWw/dGhpcy5kZWwkc2xpY2UoYixjKTp0aGlzLmRlbCRleHRfc2xpY2UoYSwwPGw/MTowKX1lbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKSk7fSxkZWwkaW5kZXgoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLkluZGV4RXJyb3IpO2E9dGhpcy5saXN0JGluUmFuZ2UoYSxcImxpc3QgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2VcIik7dGhpcy52LnNwbGljZShhLDEpfSxkZWwkc2xpY2UoYSxjKXt0aGlzLnYuc3BsaWNlKGEsYy1hKX0sZGVsJGV4dF9zbGljZShhLGMpe2xldCBiPTA7YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9Pnt0aGlzLnYuc3BsaWNlKGEtYiwxKTtiKz1jfSl9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ubGlzdFwiLFNrLmJ1aWx0aW4ubGlzdCk7U2suYnVpbHRpbi5saXN0LnB5MiRtZXRob2RzPXtzb3J0OnskbmFtZTpcInNvcnRcIiwkbWV0aChhLGMpe2NvbnN0IFtiLGUsaF09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJzb3J0XCIsW1wiY21wXCIsXCJrZXlcIixcInJldmVyc2VcIl0sYSxjLFtTay5idWlsdGluLm5vbmUubm9uZSQsXG5Tay5idWlsdGluLm5vbmUubm9uZSQsU2suYnVpbHRpbi5ib29sLmZhbHNlJF0pO3JldHVybiB0aGlzLmxpc3Qkc29ydChiLGUsaCl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBjbXA9Tm9uZSwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpXCIsJGRvYzpcIlN0YWJsZSBzb3J0ICpJTiBQTEFDRSouXCJ9fTt2YXIgYT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJsaXN0X2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEudn0saXRlcm5leHQ6U2suZ2VuZXJpYy5pdGVyTmV4dFdpdGhBcnJheSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KSxjPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImxpc3RfcmV2ZXJzZWl0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PVxuYS52Lmxlbmd0aC0xO3RoaXMuJHNlcT1hLnZ9LGl0ZXJuZXh0KCl7Y29uc3QgYT10aGlzLiRzZXFbdGhpcy4kaW5kZXgtLV07aWYodm9pZCAwPT09YSl0aGlzLnRwJGl0ZXJuZXh0PSgpPT57fTtlbHNlIHJldHVybiBhfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyUmV2ZXJzZUxlbmd0aEhpbnRNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9LGZ1bmN0aW9uKG0scSxhKXtmdW5jdGlvbiBjKGEpe3ZhciBiPWEucmVwbGFjZShGLFwiXCIpLnJlcGxhY2UoTSxcIl9cIikudG9Mb3dlckNhc2UoKTtiPUVbYl07cmV0dXJuIHZvaWQgMD09PWI/YTpifWZ1bmN0aW9uIGIoYSxiLGMpe2lmKHZvaWQgMD09PWIpYj1cInV0Zi04XCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKWI9Yi4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgYXJndW1lbnQgXCIrKFwiYnl0ZXNzdHJcIi5pbmNsdWRlcyhhKT9cbjI6MSkrXCIgbXVzdCBiZSBzdHIgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpKTtpZih2b2lkIDA9PT1jKWM9XCJzdHJpY3RcIjtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpYz1jLiRqc3N0cigpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBhcmd1bWVudCBcIisoXCJieXRlc3N0clwiLmluY2x1ZGVzKGEpPzM6MikrXCIgbXVzdCBiZSBzdHIgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTtyZXR1cm57ZW5jb2Rpbmc6YixlcnJvcnM6Y319ZnVuY3Rpb24gZShhLGIsZCl7YT1hLiRqc3N0cigpO2I9YyhiKTtpZihcInN0cmljdFwiIT09ZCYmXCJpZ25vcmVcIiE9PWQmJlwicmVwbGFjZVwiIT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiJ1wiK2QrXCInIGVycm9yIGhhbmRsaW5nIG5vdCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcIik7aWYoXCJhc2NpaVwiPT09Yil7Yj1bXTtmb3IoZSBpbiBhKXtjb25zdCBjPWEuY2hhckNvZGVBdChlKTtcbmlmKDEyNzxjKXtpZihcInN0cmljdFwiPT09ZCl0aHJvdyBkPWYoYyksbmV3IFNrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yKFwiJ2FzY2lpJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVyICdcIitkK1wiJyBpbiBwb3NpdGlvbiBcIitlK1wiOiBvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpXCIpO1wicmVwbGFjZVwiPT09ZCYmYi5wdXNoKDYzKX1lbHNlIGIucHVzaChjKX12YXIgZT1uZXcgVWludDhBcnJheShiKX1lbHNlIGlmKFwidXRmLThcIj09PWIpZT1WLmVuY29kZShhKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLkxvb2t1cEVycm9yKFwidW5rbm93biBlbmNvZGluZzogXCIrYik7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGUpfWZ1bmN0aW9uIGYoYSl7dmFyIGI9MjY1Pj1hP1wiXFxcXHhcIjpcIlxcXFx1XCI7YT1hLnRvU3RyaW5nKDE2KTszPT09YS5sZW5ndGgmJihhPWEuc2xpY2UoMSwzKSk7cmV0dXJuIGE9MT09PWEubGVuZ3RoP2IrXCIwXCIrYTpiK2F9ZnVuY3Rpb24gbChhLGQpeyh7ZW5jb2Rpbmc6YSxcbmVycm9yczpkfT1iKFwiZGVjb2RlXCIsYSxkKSk7YT1jKGEpO2lmKFwic3RyaWN0XCIhPT1kJiZcImlnbm9yZVwiIT09ZCYmXCJyZXBsYWNlXCIhPT1kKXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCInXCIrZCtcIicgZXJyb3IgaGFuZGxpbmcgbm90IGltcGxlbWVudGVkIGluIFNrdWxwdFwiKTtpZihcImFzY2lpXCI9PT1hKXthPXRoaXMudjt2YXIgZT1cIlwiO2ZvcihsZXQgYj0wO2I8YS5sZW5ndGg7YisrKXtjb25zdCBjPWFbYl07aWYoMTI3PGMpe2lmKFwic3RyaWN0XCI9PT1kKXRocm93IG5ldyBTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcihcIidhc2NpaScgY29kZWMgY2FuJ3QgZGVjb2RlIGJ5dGUgMHhcIitjLnRvU3RyaW5nKDE2KStcIiBpbiBwb3NpdGlvbiBcIitiK1wiOiBvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpXCIpO1wicmVwbGFjZVwiPT09ZCYmKGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoNjU1MzMpKX1lbHNlIGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoYyl9YT1lfWVsc2UgaWYoXCJ1dGYtOFwiPT09XG5hKWE6aWYoYT10aGlzLnYsZT1kLGQ9eS5kZWNvZGUoYSksXCJyZXBsYWNlXCI9PT1lKWE9ZDtlbHNle2lmKFwic3RyaWN0XCI9PT1lKXtlPWQuaW5kZXhPZihcIlxcdWZmZmRcIik7aWYoLTE9PT1lKXthPWQ7YnJlYWsgYX10aHJvdyBuZXcgU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IoXCIndXRmLTgnIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4XCIrYVtlXS50b1N0cmluZygxNikrXCIgaW4gcG9zaXRpb24gXCIrZStcIjogaW52YWxpZCBzdGFydCBieXRlXCIpO31hPWQucmVwbGFjZSgvXFx1ZmZmZC9nLFwiXCIpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTG9va3VwRXJyb3IoXCJ1bmtub3duIGVuY29kaW5nOiBcIithKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyxkLGUpe2lmKCEoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXN8fGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcblwiIGZpcnN0IGFyZyBtdXN0IGJlIGJ5dGVzIG9yIGEgdHVwbGUgb2YgYnl0ZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShjKSk7KHtzdGFydDpkLGVuZDplfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGQsZSkpO2lmKGU8ZClyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtkPXRoaXMudi5zdWJhcnJheShkLGUpO2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKXtmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxlPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1lO2U9YS50cCRpdGVybmV4dCgpKWlmKGU9dGhpcy5nZXQkcmF3KGUpLGIoZCxlKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO3JldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkfXJldHVybiBiKGQsYy52KT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gZChhKXtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpO1xuKHtzdGFydDpjLGVuZDpkfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGMsZCkpO3JldHVybiBkPGM/LTE6XCJudW1iZXJcIj09PXR5cGVvZiBiPyhiPWE/dGhpcy52Lmxhc3RJbmRleE9mKGIsZC0xKTp0aGlzLnYuaW5kZXhPZihiLGMpLGI+PWMmJmI8ZD9iOi0xKTphP3RoaXMuZmluZCRzdWJyaWdodChiLGMsZCk6dGhpcy5maW5kJHN1YmxlZnQoYixjLGQpfX1mdW5jdGlvbiBnKGEpe3JldHVybiBmdW5jdGlvbihiKXtiPXRoaXMuZ2V0JHJhdyhiKTtsZXQgYztpZihhKXtpZihjPXRoaXMuZmluZCRzdWJyaWdodChiLDAsdGhpcy52Lmxlbmd0aCksMD5jKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uYnl0ZXMsbmV3IFNrLmJ1aWx0aW4uYnl0ZXMsdGhpc10pfWVsc2UgaWYoYz10aGlzLmZpbmQkc3VibGVmdChiLDAsdGhpcy52Lmxlbmd0aCksMD5jKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbdGhpcyxuZXcgU2suYnVpbHRpbi5ieXRlcyxcbm5ldyBTay5idWlsdGluLmJ5dGVzXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxjKSksbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYiksbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGMrYi5sZW5ndGgpKV0pfX1mdW5jdGlvbiBuKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe3ZhciBkPXZvaWQgMD09PWN8fGM9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bmV3IFVpbnQ4QXJyYXkoWzksMTAsMTEsMTIsMTMsMzIsMTMzXSk6dGhpcy5nZXQkcmF3KGMpO2M9MDt2YXIgZT10aGlzLnYubGVuZ3RoO2lmKGEpZm9yKDtjPGUmJmQuaW5jbHVkZXModGhpcy52W2NdKTspYysrO2lmKGIpZm9yKDtlPmMmJmQuaW5jbHVkZXModGhpcy52W2UtMV0pOyllLS07ZD1uZXcgVWludDhBcnJheShlLWMpO2ZvcihlPTA7ZTxkLmxlbmd0aDtlKyspZFtlXT10aGlzLnZbZStjXTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoZCl9fVxuZnVuY3Rpb24gayhhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQsZSl7aWYodm9pZCAwPT09ZSllPTMyO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMmJjE9PWUudi5sZW5ndGgpZT1lLnZbMF07ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGFyZ3VtZW50IDIgbXVzdCBiZSBhIGJ5dGUgc3RyaW5nIG9mIGxlbmd0aCAxLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoZSkpO2NvbnN0IGY9dGhpcy52Lmxlbmd0aDtkPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChkLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoZDw9ZilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtjb25zdCBnPW5ldyBVaW50OEFycmF5KGQpO2xldCBrLGg7Yz8oaz1NYXRoLmZsb29yKChkLWYpLzIpLGg9KGQtZiklMj9rKzE6ayk6Yj8oaz1kLWYsaD0wKTooaz0wLGg9ZC1mKTtnLmZpbGwoZSwwLGspO2ZvcihsZXQgYT0wO2E8ZjthKyspZ1thK2tdPXRoaXMudlthXTtcbmcuZmlsbChlLGQtaCk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGcpfX1mdW5jdGlvbiBwKGEpe3JldHVybiA5PD1hJiYxMz49YXx8MzI9PT1hfWZ1bmN0aW9uIHUoYSl7cmV0dXJuIDk3PD1hJiYxMjI+PWF9ZnVuY3Rpb24gQShhKXtyZXR1cm4gNjU8PWEmJjkwPj1hfWZ1bmN0aW9uIHQoYSl7cmV0dXJuIDQ4PD1hJiY1Nz49YX1mdW5jdGlvbiB2KGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnYubGVuZ3RoP2I/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6dGhpcy52LmV2ZXJ5KGI9PmEoYikpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfX1mdW5jdGlvbiBCKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7bGV0IGM9ITE7Zm9yKGxldCBkPTA7ZDx0aGlzLnYubGVuZ3RoO2QrKyl7aWYoYih0aGlzLnZbZF0pKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkOyFjJiZhKHRoaXMudltkXSkmJlxuKGM9ITApfXJldHVybiBjP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfX1mdW5jdGlvbiBEKGEpe3JldHVybiBmdW5jdGlvbigpe2NvbnN0IGI9bmV3IFVpbnQ4QXJyYXkodGhpcy52Lmxlbmd0aCk7Zm9yKGxldCBjPTA7Yzx0aGlzLnYubGVuZ3RoO2MrKyliW2NdPWEodGhpcy52W2NdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYil9fWEoMzApO2NvbnN0IEU9e3V0ZjpcInV0Zi04XCIsdXRmODpcInV0Zi04XCIsdXRmXzg6XCJ1dGYtOFwiLGFzY2lpOlwiYXNjaWlcIn07dmFyIEY9L1xccysvZyxNPS9bXy1dKy9nO2NvbnN0IFY9bmV3IFRleHRFbmNvZGVyLHk9bmV3IFRleHREZWNvZGVyO1NrLmJ1aWx0aW4uYnl0ZXM9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImJ5dGVzXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJieXRlcyBpcyBhIGNvbnN0cnVjdG9yIHVzZSAnbmV3J1wiKTtcbmlmKHZvaWQgMD09PWEpdGhpcy52PW5ldyBVaW50OEFycmF5O2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpdGhpcy52PWE7ZWxzZSBpZihBcnJheS5pc0FycmF5KGEpKVNrLmFzc2VydHMuYXNzZXJ0KGEuZXZlcnkoYT0+MDw9YSYmMjU1Pj1hKSxcImJhZCBpbnRlcm5hbCBjYWxsIHRvIGJ5dGVzIHdpdGggYXJyYXlcIiksdGhpcy52PW5ldyBVaW50OEFycmF5KGEpO2Vsc2UgaWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXtsZXQgYjtjb25zdCBjPW5ldyBVaW50OEFycmF5KGEubGVuZ3RoKSxkPWEubGVuZ3RoO2ZvcihsZXQgZT0wO2U8ZDtlKyspe2I9YS5jaGFyQ29kZUF0KGUpO2lmKDI1NTxiKXRocm93IG5ldyBTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcihcImludmFsaWQgc3RyaW5nIGF0IGluZGV4IFwiK2UrXCIgKHBvc3NpYmx5IGNvbnRhaW5zIGEgdW5pY29kZSBjaGFyYWN0ZXIpXCIpO2NbZV09Yn10aGlzLnY9Y31lbHNlIGlmKFwibnVtYmVyXCI9PT10eXBlb2YgYSl0aGlzLnY9XG5uZXcgVWludDhBcnJheShhKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImJhZCBhcmd1bWVudCB0byBieXRlcyBjb25zdHJ1Y3RvclwiKTt9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRkb2M6XCJieXRlcyhpdGVyYWJsZV9vZl9pbnRzKSAtPiBieXRlc1xcbmJ5dGVzKHN0cmluZywgZW5jb2RpbmdbLCBlcnJvcnNdKSAtPiBieXRlc1xcbmJ5dGVzKGJ5dGVzX29yX2J1ZmZlcikgLT4gaW1tdXRhYmxlIGNvcHkgb2YgYnl0ZXNfb3JfYnVmZmVyXFxuYnl0ZXMoaW50KSAtPiBieXRlcyBvYmplY3Qgb2Ygc2l6ZSBnaXZlbiBieSB0aGUgcGFyYW1ldGVyIGluaXRpYWxpemVkIHdpdGggbnVsbCBieXRlc1xcbmJ5dGVzKCkgLT4gZW1wdHkgYnl0ZXMgb2JqZWN0XFxuXFxuQ29uc3RydWN0IGFuIGltbXV0YWJsZSBhcnJheSBvZiBieXRlcyBmcm9tOlxcbiAgLSBhbiBpdGVyYWJsZSB5aWVsZGluZyBpbnRlZ2VycyBpbiByYW5nZSgyNTYpXFxuICAtIGEgdGV4dCBzdHJpbmcgZW5jb2RlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nXFxuICAtIGFueSBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSBidWZmZXIgQVBJLlxcbiAgLSBhbiBpbnRlZ2VyXCIsXG50cCRuZXcoYSxjKXtpZih0aGlzIT09U2suYnVpbHRpbi5ieXRlcy5wcm90b3R5cGUpcmV0dXJuIHRoaXMuJHN1YnR5cGVfbmV3KGEsYyk7Yz1jfHxbXTtpZigxPj1hLmxlbmd0aCYmMD09PStjLmxlbmd0aClhPWFbMF07ZWxzZXtbYSxkLGNdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiYnl0ZXNcIixbbnVsbCxcInB5U291cmNlXCIsXCJlcnJvcnNcIl0sYSxjKTsoe2VuY29kaW5nOmQsZXJyb3JzOmN9PWIoXCJieXRlc1wiLGQsYykpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImVuY29kaW5nIG9yIGVycm9ycyB3aXRob3V0IGEgc3RyaW5nIGFyZ3VtZW50XCIpO3JldHVybiBlKGEsZCxjKX1pZih2b2lkIDA9PT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcztpZih2b2lkIDAhPT0oYz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGJ5dGVzKSkpe3ZhciBkPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFxuW10pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihkLGE9PntpZighU2suYnVpbHRpbi5jaGVja0J5dGVzKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fYnl0ZXNfXyByZXR1cm5lZCBub24tYnl0ZXMgKHR5cGUgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIpXCIpO3JldHVybiBhfSl9aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl7ZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKDA+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibmVnYXRpdmUgY291bnRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGQpfWlmKFNrLmJ1aWx0aW4uY2hlY2tCeXRlcyhhKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYS52KTtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInN0cmluZyBhcmd1bWVudCB3aXRob3V0IGFuIGVuY29kaW5nXCIpO2lmKFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhKSl7bGV0IGI9XG5bXTtkPVNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSk7aWYoMD5hfHwyNTU8YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiYnl0ZXMgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpXCIpO2IucHVzaChhKX0pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihkLCgpPT5uZXcgU2suYnVpbHRpbi5ieXRlcyhiKSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNvbnZlcnQgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaW50byBieXRlc1wiKTt9LCRyKCl7bGV0IGEsYj1cIidcIjtjb25zdCBjPS0xIT09dGhpcy52LmluZGV4T2YoMzQpO2xldCBkPVwiXCI7Zm9yKGxldCBlPTA7ZTx0aGlzLnYubGVuZ3RoO2UrKylpZihhPXRoaXMudltlXSw5PmF8fDEwPGEmJjEzPmF8fDEzPGEmJjMyPmF8fDEyNjxhKWQrPWYoYSk7ZWxzZSBpZig5PT09YXx8MTA9PT1hfHwxMz09PWF8fDM5PT09XG5hfHw5Mj09PWEpc3dpdGNoKGEpe2Nhc2UgOTpkKz1cIlxcXFx0XCI7YnJlYWs7Y2FzZSAxMDpkKz1cIlxcXFxuXCI7YnJlYWs7Y2FzZSAxMzpkKz1cIlxcXFxyXCI7YnJlYWs7Y2FzZSAzOTpjP2QrPVwiXFxcXCdcIjooZCs9XCInXCIsYj0nXCInKTticmVhaztjYXNlIDkyOmQrPVwiXFxcXFxcXFxcIn1lbHNlIGQrPVN0cmluZy5mcm9tQ2hhckNvZGUoYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcImJcIitiK2QrYil9LHRwJHN0cigpe3JldHVybiB0aGlzLiRyKCl9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IEcodGhpcyl9LHRwJHJpY2hjb21wYXJlKGEsYil7aWYodGhpcz09PWEmJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYikpcmV0dXJuITA7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcykpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGM9dGhpcy52O2E9YS52O2lmKGMubGVuZ3RoIT09YS5sZW5ndGgmJihcIkVxXCI9PT1ifHxcIk5vdEVxXCI9PT1iKSlyZXR1cm5cIkVxXCI9PT1cbmI/ITE6ITA7bGV0IGQ7Y29uc3QgZT1NYXRoLm1pbihjLmxlbmd0aCxhLmxlbmd0aCk7Zm9yKGQ9MDtkPGUmJmNbZF09PT1hW2RdO2QrKyk7c3dpdGNoKGIpe2Nhc2UgXCJMdFwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg8YS5sZW5ndGh8fGNbZF08YVtkXTtjYXNlIFwiTHRFXCI6cmV0dXJuIGQ9PT1lJiZjLmxlbmd0aDw9YS5sZW5ndGh8fGNbZF08PWFbZF07Y2FzZSBcIkVxXCI6cmV0dXJuIGQ9PT1lO2Nhc2UgXCJOb3RFcVwiOnJldHVybiBkPGU7Y2FzZSBcIkd0XCI6cmV0dXJuIGQ9PT1lJiZjLmxlbmd0aD5hLmxlbmd0aHx8Y1tkXT5hW2RdO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZD09PWUmJmMubGVuZ3RoPj1hLmxlbmd0aHx8Y1tkXT49YVtkXX19LHRwJGhhc2goKXtyZXR1cm4obmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJGpzc3RyKCkpKS50cCRoYXNoKCl9LHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2xldCBiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFxuU2suYnVpbHRpbi5JbmRleEVycm9yKTtpZih2b2lkIDAhPT1iKXswPmImJihiPXRoaXMudi5sZW5ndGgrYik7aWYoMD5ifHxiPj10aGlzLnYubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXCJpbmRleCBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy52W2JdKX19ZWxzZSBpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7Y29uc3QgYj1bXTthLnNzc2l0ZXIkKHRoaXMudi5sZW5ndGgsYT0+e2IucHVzaCh0aGlzLnZbYV0pfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKG5ldyBVaW50OEFycmF5KGIpKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJieXRlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy52Lmxlbmd0aH0sc3EkY29uY2F0KGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGNvbmNhdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIHRvIGJ5dGVzXCIpO2NvbnN0IGI9bmV3IFVpbnQ4QXJyYXkodGhpcy52Lmxlbmd0aCthLnYubGVuZ3RoKTtsZXQgYztmb3IoYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspYltjXT10aGlzLnZbY107Zm9yKGxldCBkPTA7ZDxhLnYubGVuZ3RoO2QrKyxjKyspYltjXT1hLnZbZF07cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSxzcSRyZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2NvbnN0IGI9YSp0aGlzLnYubGVuZ3RoO2lmKGI+TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcjtpZigwPj1cbmEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzO2E9bmV3IFVpbnQ4QXJyYXkoYik7bGV0IGM9MDtmb3IoO2M8YjspZm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhW2MrK109dGhpcy52W2JdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhhKX0sc3EkY29udGFpbnMoYSl7cmV0dXJuLTEhPT10aGlzLmZpbmQkbGVmdChhKX0sdHAkYXNfbnVtYmVyOiEwLG5iJHJlbWFpbmRlcjpTay5idWlsdGluLnN0ci5wcm90b3R5cGUubmIkcmVtYWluZGVyfSxwcm90bzp7JGpzc3RyKCl7bGV0IGE9XCJcIjtmb3IobGV0IGI9MDtiPHRoaXMudi5sZW5ndGg7YisrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy52W2JdKTtyZXR1cm4gYX0sZ2V0JHRndChhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcylyZXR1cm4gYS52O2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSxcImFyZ3VtZW50IHNob3VsZCBiZSBpbnRlZ2VyIG9yIGJ5dGVzLWxpa2Ugb2JqZWN0LCBub3Qge3RwJG5hbWV9XCIpO1xuaWYoMD5hfHwyNTU8YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiYnl0ZXMgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpXCIpO3JldHVybiBhfSxnZXQkcmF3KGEpe2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKXJldHVybiBhLnY7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYSBieXRlcy1saWtlIG9iamVjdCBpcyByZXF1aXJlZCwgbm90ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fSxnZXQkc3BsaXRBcmdzOmZ1bmN0aW9uKGEsYil7Yj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYixTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9MD5iP0luZmluaXR5OmI7YT1Tay5idWlsdGluLmNoZWNrTm9uZShhKT9udWxsOnRoaXMuZ2V0JHJhdyhhKTtpZihudWxsIT09YSYmIWEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJlbXB0eSBzZXBhcmF0b3JcIik7cmV0dXJue3NlcDphLG1heHNwbGl0OmJ9fSxmaW5kJGxlZnQ6ZCghMSksXG5maW5kJHJpZ2h0OmQoITApLGZpbmQkc3VibGVmdDpmdW5jdGlvbihhLGIsYyl7Yz1jLWEubGVuZ3RoKzE7bGV0IGQ9Yjtmb3IoO2Q8Yzspe2lmKGEuZXZlcnkoKGEsYik9PmE9PT10aGlzLnZbZCtiXSkpcmV0dXJuIGQ7ZCsrfXJldHVybi0xfSxmaW5kJHN1YnJpZ2h0KGEsYixjKXtsZXQgZD1jLWEubGVuZ3RoO2Zvcig7ZD49Yjspe2lmKGEuZXZlcnkoKGEsYik9PmE9PT10aGlzLnZbZCtiXSkpcmV0dXJuIGQ7ZC0tfXJldHVybi0xfSwkc3VidHlwZV9uZXcoYSxiKXtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2E9U2suYnVpbHRpbi5ieXRlcy5wcm90b3R5cGUudHAkbmV3KGEsYik7Yy52PWEudjtyZXR1cm4gY30sc2skYXNhcnJheSgpe2NvbnN0IGE9W107dGhpcy52LmZvckVhY2goYj0+e2EucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGIpKX0pO3JldHVybiBhfX0sZmxhZ3M6e3N0ciRlbmNvZGU6ZSwkZGVjb2RlOmwsY2hlY2skZW5jb2RlQXJnczpifSxtZXRob2RzOntfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KSl9LFxuJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpudWxsfSxjYXBpdGFsaXplOnskbWV0aCgpe2NvbnN0IGE9dGhpcy52Lmxlbmd0aDtpZigwPT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtjb25zdCBiPW5ldyBVaW50OEFycmF5KGEpO2xldCBjPXRoaXMudlswXTtiWzBdPXUoYyk/Yy0zMjpjO2ZvcihsZXQgZD0xO2Q8YTtkKyspYz10aGlzLnZbZF0sYltkXT1BKGMpP2MrMzI6YztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYil9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmNhcGl0YWxpemUoKSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gYSBjb3B5IG9mIEIgd2l0aCBvbmx5IGl0cyBmaXJzdCBjaGFyYWN0ZXIgY2FwaXRhbGl6ZWQgKEFTQ0lJKVxcbmFuZCB0aGUgcmVzdCBsb3dlci1jYXNlZC5cIn0sY2VudGVyOnskbWV0aDprKFwiY2VudGVyXCIsITEsITApLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCxcbiRkb2M6XCJCLmNlbnRlcih3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIEIgY2VudGVyZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiAgUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sY291bnQ6eyRtZXRoKGEsYixjKXthPXRoaXMuZ2V0JHRndChhKTsoe3N0YXJ0OmIsZW5kOmN9PVNrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0KHRoaXMsYixjKSk7bGV0IGQ9MDtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpZm9yKDtiPGM7YisrKXRoaXMudltiXT09PWEmJmQrKztlbHNle2M9Yy1hLmxlbmd0aCsxO2ZvcihsZXQgZT1iO2U8YztlKyspYS5ldmVyeSgoYSxiKT0+YT09PXRoaXMudltlK2JdKSYmKGQrKyxlKz1hLmxlbmd0aC0xKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhkKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzZWN0aW9uIHN1YiBpblxcbmJ5dGVzIEJbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZFxcbmFzIGluIHNsaWNlIG5vdGF0aW9uLlwifSxcbmRlY29kZTp7JG1ldGg6bCwkZmxhZ3M6e05hbWVkQXJnczpbXCJlbmNvZGluZ1wiLFwiZXJyb3JzXCJdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSdzdHJpY3QnKVwiLCRkb2M6XCJEZWNvZGUgdGhlIGJ5dGVzIHVzaW5nIHRoZSBjb2RlYyByZWdpc3RlcmVkIGZvciBlbmNvZGluZy5cXG5cXG4gIGVuY29kaW5nXFxuICAgIFRoZSBlbmNvZGluZyB3aXRoIHdoaWNoIHRvIGRlY29kZSB0aGUgYnl0ZXMuXFxuICBlcnJvcnNcXG4gICAgVGhlIGVycm9yIGhhbmRsaW5nIHNjaGVtZSB0byB1c2UgZm9yIHRoZSBoYW5kbGluZyBvZiBkZWNvZGluZyBlcnJvcnMuXFxuICAgIFRoZSBkZWZhdWx0IGlzICdzdHJpY3QnIG1lYW5pbmcgdGhhdCBkZWNvZGluZyBlcnJvcnMgcmFpc2UgYVxcbiAgICBVbmljb2RlRGVjb2RlRXJyb3IuIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgJ2lnbm9yZScgYW5kICdyZXBsYWNlJ1xcbiAgICBhcyB3ZWxsIGFzIGFueSBvdGhlciBuYW1lIHJlZ2lzdGVyZWQgd2l0aCBjb2RlY3MucmVnaXN0ZXJfZXJyb3IgdGhhdFxcbiAgICBjYW4gaGFuZGxlIFVuaWNvZGVEZWNvZGVFcnJvcnMuXCJ9LFxuZW5kc3dpdGg6eyRtZXRoOmgoXCJlbmRzd2l0aFwiLChhLGIpPT57Y29uc3QgYz1hLmxlbmd0aC1iLmxlbmd0aDtyZXR1cm4gMDw9YyYmYi5ldmVyeSgoYixkKT0+Yj09PWFbYytkXSl9KSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXFxuV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxcbldpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBCIGF0IHRoYXQgcG9zaXRpb24uXFxuc3VmZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgYnl0ZXMgdG8gdHJ5LlwifSxleHBhbmR0YWJzOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixcImFuIGludGVnZXIgaXMgcmVxdWlyZWQgKGdvdCB0eXBlIHt0cCRuYW19KVwiKTtcbmNvbnN0IGI9W107bGV0IGM9MDtmb3IobGV0IGU9MDtlPHRoaXMudi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnZbZV07OT09PWQ/KGQ9YS1jJWEsYi5wdXNoKC4uLkFycmF5KGQpLmZpbGwoMzIpKSxjKz1kKToxMD09PWR8fDEzPT09ZD8oYi5wdXNoKGQpLGM9MCk6KGIucHVzaChkKSxjKyspfXJldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhuZXcgVWludDhBcnJheShiKSl9LCRmbGFnczp7TmFtZWRBcmdzOltcInRhYnNpemVcIl0sRGVmYXVsdHM6WzhdfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmV4cGFuZHRhYnModGFic2l6ZT04KSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gYSBjb3B5IG9mIEIgd2hlcmUgYWxsIHRhYiBjaGFyYWN0ZXJzIGFyZSBleHBhbmRlZCB1c2luZyBzcGFjZXMuXFxuSWYgdGFic2l6ZSBpcyBub3QgZ2l2ZW4sIGEgdGFiIHNpemUgb2YgOCBjaGFyYWN0ZXJzIGlzIGFzc3VtZWQuXCJ9LGZpbmQ6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLmZpbmQkbGVmdChhLFxuYixjKSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJldHVybiAtMSBvbiBmYWlsdXJlLlwifSxoZXg6eyRtZXRoKCl7bGV0IGE9XCJcIjtmb3IobGV0IGI9MDtiPHRoaXMudi5sZW5ndGg7YisrKWErPXRoaXMudltiXS50b1N0cmluZygxNikucGFkU3RhcnQoMixcIjBcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaGV4KCkgLT4gc3RyaW5nXFxuXFxuQ3JlYXRlIGEgc3RyaW5nIG9mIGhleGFkZWNpbWFsIG51bWJlcnMgZnJvbSBhIGJ5dGVzIG9iamVjdC5cXG5FeGFtcGxlOiBiJ1xcXFx4YjlcXFxceDAxXFxcXHhlZicuaGV4KCkgLT4gJ2I5MDFlZicuXCJ9LFxuaW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRsZWZ0KGEsYixjKTtpZigtMT09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInN1YnNlY3Rpb24gbm90IGZvdW5kXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzZWN0aW9uIHN1YiBpcyBmb3VuZCxcXG5zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gQltzdGFydCxlbmRdLiAgT3B0aW9uYWxcXG5hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXFxuXFxuUmFpc2VzIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic2VjdGlvbiBpcyBub3QgZm91bmQuXCJ9LGlzYWxudW06eyRtZXRoOnYoYT0+dChhKXx8XG51KGEpfHxBKGEpKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2FsbnVtKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIGFscGhhbnVtZXJpY1xcbmFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0saXNhbHBoYTp7JG1ldGg6dihhPT42NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzYWxwaGEoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gQiBhcmUgYWxwaGFiZXRpY1xcbmFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0saXNhc2NpaTp7JG1ldGg6dihhPT4wPD1hJiYxMjc+PWEsITApLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzYXNjaWkoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgQiBpcyBlbXB0eSBvciBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBBU0NJSSxcXG5GYWxzZSBvdGhlcndpc2UuXCJ9LFxuaXNkaWdpdDp7JG1ldGg6dih0KSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2RpZ2l0KCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIGRpZ2l0c1xcbmFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0saXNsb3dlcjp7JG1ldGg6Qih1LEEpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzbG93ZXIoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgaW4gQiBhcmUgbG93ZXJjYXNlIGFuZCB0aGVyZSBpc1xcbmF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIgaW4gQiwgRmFsc2Ugb3RoZXJ3aXNlLlwifSxpc3NwYWNlOnskbWV0aDp2KHApLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzc3BhY2UoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gQiBhcmUgd2hpdGVzcGFjZVxcbmFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0sXG5pc3RpdGxlOnskbWV0aDpmdW5jdGlvbigpe2xldCBhPSExLGI9ITE7Zm9yKGxldCBjPTA7Yzx0aGlzLnYubGVuZ3RoO2MrKyl7Y29uc3QgZD10aGlzLnZbY107aWYoQShkKSl7aWYoYSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtiPWE9ITB9ZWxzZSBpZih1KGQpKXtpZighYSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtiPSEwfWVsc2UgYT0hMX1yZXR1cm4gYj9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXN0aXRsZSgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBCIGlzIGEgdGl0bGVjYXNlZCBzdHJpbmcgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZVxcbmNoYXJhY3RlciBpbiBCLCBpLmUuIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5IGZvbGxvdyB1bmNhc2VkXFxuY2hhcmFjdGVycyBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgb25seSBjYXNlZCBvbmVzLiBSZXR1cm4gRmFsc2VcXG5vdGhlcndpc2UuXCJ9LFxuaXN1cHBlcjp7JG1ldGg6QihBLHUpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzdXBwZXIoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgaW4gQiBhcmUgdXBwZXJjYXNlIGFuZCB0aGVyZSBpc1xcbmF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIgaW4gQiwgRmFsc2Ugb3RoZXJ3aXNlLlwifSxqb2luOnskbWV0aChhKXtjb25zdCBiPVtdO2xldCBjPTA7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2VxdWVuY2UgaXRlbSBcIitjK1wiOiBleHBlY3RlZCBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCBcIitTay5hYnN0ci50eXBlTmFtZShhKStcIiBmb3VuZFwiKTtjKys7Yi5sZW5ndGgmJmIucHVzaCguLi50aGlzLnYpO2IucHVzaCguLi5hLnYpfSksXG4oKT0+bmV3IFNrLmJ1aWx0aW4uYnl0ZXMobmV3IFVpbnQ4QXJyYXkoYikpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBpdGVyYWJsZV9vZl9ieXRlcywgLylcIiwkZG9jOlwiQ29uY2F0ZW5hdGUgYW55IG51bWJlciBvZiBieXRlcyBvYmplY3RzLlxcblxcblRoZSBieXRlcyB3aG9zZSBtZXRob2QgaXMgY2FsbGVkIGlzIGluc2VydGVkIGluIGJldHdlZW4gZWFjaCBwYWlyLlxcblxcblRoZSByZXN1bHQgaXMgcmV0dXJuZWQgYXMgYSBuZXcgYnl0ZXMgb2JqZWN0LlxcblxcbkV4YW1wbGU6IGInLicuam9pbihbYidhYicsIGIncHEnLCBiJ3JzJ10pIC0+IGInYWIucHEucnMnLlwifSxsanVzdDp7JG1ldGg6ayhcImxqdXN0XCIsITEsITEpLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIEIgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiBQYWRkaW5nIGlzXFxuZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLlwifSxcbmxvd2VyOnskbWV0aDpEKGE9PkEoYSk/YSszMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5sb3dlcigpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIGFsbCBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuXCJ9LGxzdHJpcDp7JG1ldGg6bighMCwhMSksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgYnl0ZXM9Tm9uZSwgLylcIiwkZG9jOlwiU3RyaXAgbGVhZGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIGxlYWRpbmcgIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LHBhcnRpdGlvbjp7JG1ldGg6ZyghMSksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBzZXAsIC8pXCIsJGRvYzpcIlBhcnRpdGlvbiB0aGUgYnl0ZXMgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3Igc2VwIGluIHRoZSBieXRlcy4gSWYgdGhlIHNlcGFyYXRvciBpcyBmb3VuZCxcXG5yZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yXFxuaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuXFxuXFxuSWYgdGhlIHNlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGJ5dGVzXFxub2JqZWN0IGFuZCB0d28gZW1wdHkgYnl0ZXMgb2JqZWN0cy5cIn0sXG5yZXBsYWNlOnskbWV0aChhLGIsYyl7YT10aGlzLmdldCRyYXcoYSk7Yj10aGlzLmdldCRyYXcoYik7Yz12b2lkIDA9PT1jPy0xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChjLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Yz0wPmM/SW5maW5pdHk6Yztjb25zdCBkPVtdO2xldCBlPTA7Zm9yKHZhciBmPTA7Zjx0aGlzLnYubGVuZ3RoJiZlPGM7KXtjb25zdCBjPXRoaXMuZmluZCRzdWJsZWZ0KGEsZix0aGlzLnYubGVuZ3RoKTtpZigtMT09PWMpYnJlYWs7Zm9yKDtmPGM7ZisrKWQucHVzaCh0aGlzLnZbZl0pO2QucHVzaCguLi5iKTtmPWMrYS5sZW5ndGg7ZSsrfWZvcihmO2Y8dGhpcy52Lmxlbmd0aDtmKyspZC5wdXNoKHRoaXMudltmXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKG5ldyBVaW50OEFycmF5KGQpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkc2VsZiwgb2xkLCBuZXcsIGNvdW50PS0xLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IHdpdGggYWxsIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyBvbGQgcmVwbGFjZWQgYnkgbmV3LlxcblxcbiAgY291bnRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgdG8gcmVwbGFjZS5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcy5cXG5cXG5JZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgY291bnQgaXMgZ2l2ZW4sIG9ubHkgdGhlIGZpcnN0IGNvdW50IG9jY3VycmVuY2VzIGFyZVxcbnJlcGxhY2VkLlwifSxcbnJmaW5kOnskbWV0aChhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJHJpZ2h0KGEsYixjKSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzZWN0aW9uIHN1YiBpcyBmb3VuZCxcXG5zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gQltzdGFydCxlbmRdLiAgT3B0aW9uYWxcXG5hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXFxuXFxuUmV0dXJuIC0xIG9uIGZhaWx1cmUuXCJ9LHJpbmRleDp7JG1ldGg6ZnVuY3Rpb24oYSxiLGMpe2E9dGhpcy5maW5kJHJpZ2h0KGEsYixjKTtpZigtMT09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInN1YnNlY3Rpb24gbm90IGZvdW5kXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEpfSxcbiRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJhaXNlIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic2VjdGlvbiBpcyBub3QgZm91bmQuXCJ9LHJqdXN0OnskbWV0aDprKFwicmp1c3RcIiwhMCwhMSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnJqdXN0KHdpZHRoWywgZmlsbGNoYXJdKSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gQiByaWdodCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiBQYWRkaW5nIGlzXFxuZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpXCJ9LFxucnBhcnRpdGlvbjp7JG1ldGg6ZyghMCksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBzZXAsIC8pXCIsJGRvYzpcIlBhcnRpdGlvbiB0aGUgYnl0ZXMgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3Igc2VwIGluIHRoZSBieXRlcywgc3RhcnRpbmcgYXQgdGhlIGVuZC4gSWZcXG50aGUgc2VwYXJhdG9yIGlzIGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGVcXG5zZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuXFxuXFxuSWYgdGhlIHNlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IGJ5dGVzXFxub2JqZWN0cyBhbmQgdGhlIG9yaWdpbmFsIGJ5dGVzIG9iamVjdC5cIn0scnNwbGl0OnskbWV0aDpmdW5jdGlvbihhLGIpeyh7c2VwOmEsXG5tYXhzcGxpdDpifT10aGlzLmdldCRzcGxpdEFyZ3MoYSxiKSk7Y29uc3QgYz1bXTtsZXQgZD0wLGU9dGhpcy52Lmxlbmd0aDtpZihudWxsIT09YSl7Zm9yKDswPD1lJiZkPGI7KXtjb25zdCBiPXRoaXMuZmluZCRzdWJyaWdodChhLDAsZSk7aWYoLTE9PT1iKWJyZWFrO2MucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYithLmxlbmd0aCxlKSkpO2U9YjtkKyt9Yy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheSgwLGUpKSl9ZWxzZXtmb3IoZS0tO2Q8Yjspe2Zvcig7cCh0aGlzLnZbZV0pOyllLS07aWYoMD5lKWJyZWFrO2E9ZSsxO2ZvcihlLS07MDw9ZSYmIXAodGhpcy52W2VdKTspZS0tO2MucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoZSsxLGEpKSk7ZCsrfWlmKDA8PWUpe2Zvcig7cCh0aGlzLnZbZV0pOyllLS07MDw9ZSYmYy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheSgwLFxuZSsxKSkpfX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChjLnJldmVyc2UoKSl9LCRmbGFnczp7TmFtZWRBcmdzOltcInNlcFwiLFwibWF4c3BsaXRcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4ubm9uZS5ub25lJCwtMV19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIHNlY3Rpb25zIGluIHRoZSBieXRlcywgdXNpbmcgc2VwIGFzIHRoZSBkZWxpbWl0ZXIuXFxuXFxuICBzZXBcXG4gICAgVGhlIGRlbGltaXRlciBhY2NvcmRpbmcgd2hpY2ggdG8gc3BsaXQgdGhlIGJ5dGVzLlxcbiAgICBOb25lICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgc3BsaXQgb24gQVNDSUkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXFxuICAgIChzcGFjZSwgdGFiLCByZXR1cm4sIG5ld2xpbmUsIGZvcm1mZWVkLCB2ZXJ0aWNhbCB0YWIpLlxcbiAgbWF4c3BsaXRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygc3BsaXRzIHRvIGRvLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIG5vIGxpbWl0LlxcblxcblNwbGl0dGluZyBpcyBkb25lIHN0YXJ0aW5nIGF0IHRoZSBlbmQgb2YgdGhlIGJ5dGVzIGFuZCB3b3JraW5nIHRvIHRoZSBmcm9udC5cIn0sXG5yc3RyaXA6eyRtZXRoOm4oITEsITApLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGJ5dGVzPU5vbmUsIC8pXCIsJGRvYzpcIlN0cmlwIHRyYWlsaW5nIGJ5dGVzIGNvbnRhaW5lZCBpbiB0aGUgYXJndW1lbnQuXFxuXFxuSWYgdGhlIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgTm9uZSwgc3RyaXAgdHJhaWxpbmcgQVNDSUkgd2hpdGVzcGFjZS5cIn0sc3BsaXQ6eyRtZXRoOmZ1bmN0aW9uKGEsYil7KHtzZXA6YSxtYXhzcGxpdDpifT10aGlzLmdldCRzcGxpdEFyZ3MoYSxiKSk7Y29uc3QgYz1bXSxkPXRoaXMudi5sZW5ndGg7bGV0IGU9MCxmPTA7aWYobnVsbCE9PWEpe2Zvcig7ZjxkJiZlPGI7KXtjb25zdCBiPXRoaXMuZmluZCRzdWJsZWZ0KGEsZixkKTtpZigtMT09PWIpYnJlYWs7Yy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLGIpKSk7Zj1iK2EubGVuZ3RoO2UrK31jLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGYsXG5kKSkpfWVsc2V7Zm9yKDtlPGI7KXtmb3IoO3AodGhpcy52W2ZdKTspZisrO2lmKGY9PT1kKWJyZWFrO2E9Zjtmb3IoZisrO2Y8ZCYmIXAodGhpcy52W2ZdKTspZisrO2MucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYSxmKSkpO2UrK31pZihmPGQpe2Zvcig7cCh0aGlzLnZbZl0pOylmKys7ZjxkJiZjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGYsZCkpKX19cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYyl9LCRmbGFnczp7TmFtZWRBcmdzOltcInNlcFwiLFwibWF4c3BsaXRcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4ubm9uZS5ub25lJCwtMV19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIHNlY3Rpb25zIGluIHRoZSBieXRlcywgdXNpbmcgc2VwIGFzIHRoZSBkZWxpbWl0ZXIuXFxuXFxuICBzZXBcXG4gICAgVGhlIGRlbGltaXRlciBhY2NvcmRpbmcgd2hpY2ggdG8gc3BsaXQgdGhlIGJ5dGVzLlxcbiAgICBOb25lICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgc3BsaXQgb24gQVNDSUkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXFxuICAgIChzcGFjZSwgdGFiLCByZXR1cm4sIG5ld2xpbmUsIGZvcm1mZWVkLCB2ZXJ0aWNhbCB0YWIpLlxcbiAgbWF4c3BsaXRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygc3BsaXRzIHRvIGRvLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIG5vIGxpbWl0LlwifSxcbnNwbGl0bGluZXM6eyRtZXRoKGEpe2E9U2subWlzY2V2YWwuaXNUcnVlKGEpO2NvbnN0IGI9W107bGV0IGM9MDtsZXQgZD0wO2NvbnN0IGU9dGhpcy52Lmxlbmd0aDtmb3IoO2Q8ZTspe3ZhciBmPXRoaXMudltkXTtpZigxMz09PWYpe2NvbnN0IGU9MTA9PT10aGlzLnZbZCsxXTtmPWE/ZT9kKzI6ZCsxOmQ7Yi5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShjLGYpKSk7ZD1jPWU/ZCsyOmQrMX1lbHNlIDEwPT09Zj8oZj1hP2QrMTpkLGIucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYyxmKSkpLGQ9Yz1kKzEpOmQrK31jPGUmJmIucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYyxlKSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJrZWVwZW5kc1wiXSxEZWZhdWx0czpbITFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywga2VlcGVuZHM9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBieXRlcywgYnJlYWtpbmcgYXQgbGluZSBib3VuZGFyaWVzLlxcblxcbkxpbmUgYnJlYWtzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0IHVubGVzcyBrZWVwZW5kcyBpcyBnaXZlbiBhbmRcXG50cnVlLlwifSxcbnN0YXJ0c3dpdGg6eyRtZXRoOmgoXCJzdGFydHN3aXRoXCIsKGEsYik9PmIubGVuZ3RoPD1hLmxlbmd0aCYmYi5ldmVyeSgoYixjKT0+Yj09PWFbY10pKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgQiBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxcbldpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cXG5XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxcbnByZWZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS5cIn0sc3RyaXA6eyRtZXRoOm4oITAsITApLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGJ5dGVzPU5vbmUsIC8pXCIsJGRvYzpcIlN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGJ5dGVzIGNvbnRhaW5lZCBpbiB0aGUgYXJndW1lbnQuXFxuXFxuSWYgdGhlIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgTm9uZSwgc3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgQVNDSUkgd2hpdGVzcGFjZS5cIn0sXG5zd2FwY2FzZTp7JG1ldGg6RChhPT5BKGEpP2ErMzI6dShhKT9hLTMyOmEpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnN3YXBjYXNlKCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdpdGggdXBwZXJjYXNlIEFTQ0lJIGNoYXJhY3RlcnMgY29udmVydGVkXFxudG8gbG93ZXJjYXNlIEFTQ0lJIGFuZCB2aWNlIHZlcnNhLlwifSx0aXRsZTp7JG1ldGgoKXtjb25zdCBhPXRoaXMudi5sZW5ndGgsYj1uZXcgVWludDhBcnJheShhKTtsZXQgYz0hMTtmb3IobGV0IGQ9MDtkPGE7ZCsrKXtjb25zdCBhPXRoaXMudltkXTtBKGEpPyhiW2RdPWM/YSszMjphLGM9ITApOnUoYSk/KGJbZF09Yz9hOmEtMzIsYz0hMCk6KGJbZF09YSxjPSExKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYil9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnRpdGxlKCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgdGl0bGVjYXNlZCB2ZXJzaW9uIG9mIEIsIGkuZS4gQVNDSUkgd29yZHMgc3RhcnQgd2l0aCB1cHBlcmNhc2VcXG5jaGFyYWN0ZXJzLCBhbGwgcmVtYWluaW5nIGNhc2VkIGNoYXJhY3RlcnMgaGF2ZSBsb3dlcmNhc2UuXCJ9LFxudXBwZXI6eyRtZXRoOkQoYT0+dShhKT9hLTMyOmEpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnVwcGVyKCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdpdGggYWxsIEFTQ0lJIGNoYXJhY3RlcnMgY29udmVydGVkIHRvIHVwcGVyY2FzZS5cIn0semZpbGw6eyRtZXRoKGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKTtjb25zdCBiPWEtdGhpcy52Lmxlbmd0aDtpZigwPj1iKXJldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYpO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkoYSk7bGV0IGQ9MCxlO2lmKDQzPT09dGhpcy52WzBdfHw0NT09PXRoaXMudlswXSljWzBdPXRoaXMudlswXSxkKys7Yy5maWxsKDQ4LGQsZCtiKTtlPWQ7Zm9yKGQrPWI7ZDxhO2QrKyxlKyspY1tkXT10aGlzLnZbZV07cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCxcbiRkb2M6XCJCLnpmaWxsKHdpZHRoKSAtPiBjb3B5IG9mIEJcXG5cXG5QYWQgYSBudW1lcmljIHN0cmluZyBCIHdpdGggemVyb3Mgb24gdGhlIGxlZnQsIHRvIGZpbGwgYSBmaWVsZFxcbm9mIHRoZSBzcGVjaWZpZWQgd2lkdGguICBCIGlzIG5ldmVyIHRydW5jYXRlZC5cIn19LGNsYXNzbWV0aG9kczp7ZnJvbWhleDp7JG1ldGg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmb3IobGV0IGM9ZjtjPGI7Yys9Mil7bGV0IGI9YS5zdWJzdHIoYywyKTtpZighZC50ZXN0KGIpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJub24taGV4YWRlY2ltYWwgbnVtYmVyIGZvdW5kIGluIGZyb21oZXgoKSBhcmcgYXQgcG9zaXRpb24gXCIrKGMrMSkpO2UucHVzaChwYXJzZUludChiLDE2KSl9fWlmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZyb21oZXgoKSBhcmd1bWVudCBtdXN0IGJlIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTtcbmE9YS4kanNzdHIoKTtjb25zdCBjPS9cXHMrL2csZD0vXlthYmNkZWZBQkNERUYwMTIzNDU2Nzg5XXsyfSQvLGU9W107bGV0IGY9MCxnO2Zvcig7bnVsbCE9PShnPWMuZXhlYyhhKSk7KWIoZy5pbmRleCksZj1jLmxhc3RJbmRleDtiKGEubGVuZ3RoKTtyZXR1cm4gbmV3IHRoaXMoZSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkdHlwZSwgc3RyaW5nLCAvKVwiLCRkb2M6XCJDcmVhdGUgYSBieXRlcyBvYmplY3QgZnJvbSBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBudW1iZXJzLlxcblxcblNwYWNlcyBiZXR3ZWVuIHR3byBudW1iZXJzIGFyZSBhY2NlcHRlZC5cXG5FeGFtcGxlOiBieXRlcy5mcm9taGV4KCdCOSAwMUVGJykgLT4gYidcXFxcXFxcXHhiOVxcXFxcXFxceDAxXFxcXFxcXFx4ZWYnLlwifX19KTt2YXIgRz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJieXRlc19pdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO3RoaXMuJHNlcT1hLnZ9LGl0ZXJuZXh0KCl7Y29uc3QgYT1cbnRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXTtpZih2b2lkIDAhPT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEpfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmJ5dGVzXCIsU2suYnVpbHRpbi5ieXRlcyl9LGZ1bmN0aW9uKG0scSxhKXsoZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXt9ZnVuY3Rpb24gYygpe312YXIgbD1TdHJpbmcuZnJvbUNoYXJDb2RlLGg9e30udG9TdHJpbmcsZD1oLmNhbGwoYS5TaGFyZWRBcnJheUJ1ZmZlciksZz1oKCksbj1hLlVpbnQ4QXJyYXksaz1ufHxBcnJheSxwPW4/QXJyYXlCdWZmZXI6ayx1PXAuaXNWaWV3fHxmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJsZW5ndGhcImluIGF9LEE9aC5jYWxsKHAucHJvdG90eXBlKTtwPWMucHJvdG90eXBlO1xudmFyIHQ9YS5UZXh0RW5jb2RlcixtPW5ldyAobj9VaW50MTZBcnJheTprKSgzMik7Yi5wcm90b3R5cGUuZGVjb2RlPWZ1bmN0aW9uKGEpe2lmKCF1KGEpKXt2YXIgYj1oLmNhbGwoYSk7aWYoYiE9PUEmJmIhPT1kJiZiIT09Zyl0aHJvdyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gZXhlY3V0ZSAnZGVjb2RlJyBvbiAnVGV4dERlY29kZXInOiBUaGUgcHJvdmlkZWQgdmFsdWUgaXMgbm90IG9mIHR5cGUgJyhBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcpJ1wiKTthPW4/bmV3IGsoYSk6YXx8W119Zm9yKHZhciBjPWI9XCJcIixlPTAsZj1hLmxlbmd0aHwwLHA9Zi0zMnwwLEIsdCx2PTAscT0wLFAsUT0wLFU9LTE7ZTxmOyl7Zm9yKEI9ZTw9cD8zMjpmLWV8MDtRPEI7ZT1lKzF8MCxRPVErMXwwKXt0PWFbZV0mMjU1O3N3aXRjaCh0Pj40KXtjYXNlIDE1OlA9YVtlPWUrMXwwXSYyNTU7aWYoMiE9PVA+PjZ8fDI0Nzx0KXtlPWUtMXwwO2JyZWFrfXY9KHQmNyk8PDZ8UCY2MztxPTU7dD0yNTY7Y2FzZSAxNDpQPVxuYVtlPWUrMXwwXSYyNTUsdjw8PTYsdnw9KHQmMTUpPDw2fFAmNjMscT0yPT09UD4+Nj9xKzR8MDoyNCx0PXQrMjU2Jjc2ODtjYXNlIDEzOmNhc2UgMTI6UD1hW2U9ZSsxfDBdJjI1NSx2PDw9Nix2fD0odCYzMSk8PDZ8UCY2MyxxPXErN3wwLGU8ZiYmMj09PVA+PjYmJnY+PnEmJjExMTQxMTI+dj8odD12LHY9di02NTUzNnwwLDA8PXYmJihVPSh2Pj4xMCkrNTUyOTZ8MCx0PSh2JjEwMjMpKzU2MzIwfDAsMzE+UT8obVtRXT1VLFE9USsxfDAsVT0tMSk6KFA9VSxVPXQsdD1QKSkpOih0Pj49OCxlPWUtdC0xfDAsdD02NTUzMyksdj1xPTAsQj1lPD1wPzMyOmYtZXwwO2RlZmF1bHQ6bVtRXT10O2NvbnRpbnVlO2Nhc2UgMTE6Y2FzZSAxMDpjYXNlIDk6Y2FzZSA4On1tW1FdPTY1NTMzfWMrPWwobVswXSxtWzFdLG1bMl0sbVszXSxtWzRdLG1bNV0sbVs2XSxtWzddLG1bOF0sbVs5XSxtWzEwXSxtWzExXSxtWzEyXSxtWzEzXSxtWzE0XSxtWzE1XSxtWzE2XSxtWzE3XSxtWzE4XSxtWzE5XSxtWzIwXSxcbm1bMjFdLG1bMjJdLG1bMjNdLG1bMjRdLG1bMjVdLG1bMjZdLG1bMjddLG1bMjhdLG1bMjldLG1bMzBdLG1bMzFdKTszMj5RJiYoYz1jLnNsaWNlKDAsUS0zMnwwKSk7aWYoZTxmKXtpZihtWzBdPVUsUT1+VT4+PjMxLFU9LTEsYy5sZW5ndGg8Yi5sZW5ndGgpY29udGludWV9ZWxzZS0xIT09VSYmKGMrPWwoVSkpO2IrPWM7Yz1cIlwifXJldHVybiBifTtwLmVuY29kZT1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/XCJcIjpcIlwiK2E7dmFyIGI9YS5sZW5ndGh8MCxjPW5ldyBrKChiPDwxKSs4fDApLGQsZT0wLGY9IW47Zm9yKGQ9MDtkPGI7ZD1kKzF8MCxlPWUrMXwwKXt2YXIgZz1hLmNoYXJDb2RlQXQoZCl8MDtpZigxMjc+PWcpY1tlXT1nO2Vsc2V7aWYoMjA0Nz49ZyljW2VdPTE5MnxnPj42O2Vsc2V7YTp7aWYoNTUyOTY8PWcpaWYoNTYzMTk+PWcpe3ZhciBoPWEuY2hhckNvZGVBdChkPWQrMXwwKXwwO2lmKDU2MzIwPD1oJiY1NzM0Mz49aCl7Zz0oZzw8MTApK2gtNTY2MTM4ODh8MDtpZig2NTUzNTxcbmcpe2NbZV09MjQwfGc+PjE4O2NbZT1lKzF8MF09MTI4fGc+PjEyJjYzO2NbZT1lKzF8MF09MTI4fGc+PjYmNjM7Y1tlPWUrMXwwXT0xMjh8ZyY2Mztjb250aW51ZX1icmVhayBhfWc9NjU1MzN9ZWxzZSA1NzM0Mz49ZyYmKGc9NjU1MzMpOyFmJiZkPDwxPGUmJmQ8PDE8KGUtN3wwKSYmKGY9ITAsaD1uZXcgaygzKmIpLGguc2V0KGMpLGM9aCl9Y1tlXT0yMjR8Zz4+MTI7Y1tlPWUrMXwwXT0xMjh8Zz4+NiY2M31jW2U9ZSsxfDBdPTEyOHxnJjYzfX1yZXR1cm4gbj9jLnN1YmFycmF5KDAsZSk6Yy5zbGljZSgwLGUpfTt0fHwoYS5UZXh0RGVjb2Rlcj1iLGEuVGV4dEVuY29kZXI9Yyl9KShcInVuZGVmaW5lZFwiPT10eXBlb2YgYT9cInVuZGVmaW5lZFwiPT10eXBlb2Ygc2VsZj90aGlzOnNlbGY6YSl9KS5jYWxsKHRoaXMsYSgwKSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi50dXBsZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwidHVwbGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09XG5hP2E9W106QXJyYXkuaXNBcnJheShhKXx8KGE9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSkpO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlLFwiYmFkIGNhbGwgdG8gdHVwbGUsIHVzZSAnbmV3JyB3aXRoIGFuIEFycmF5IG9mIHB5dGhvbiBvYmplY3RzXCIpO3RoaXMudj1hO3RoaXMuaW4kcmVwcj0hMX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkZG9jOlwiQnVpbHQtaW4gaW1tdXRhYmxlIHNlcXVlbmNlLlxcblxcbklmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgcmV0dXJucyBhbiBlbXB0eSB0dXBsZS5cXG5JZiBpdGVyYWJsZSBpcyBzcGVjaWZpZWQgdGhlIHR1cGxlIGlzIGluaXRpYWxpemVkIGZyb20gaXRlcmFibGUncyBpdGVtcy5cXG5cXG5JZiB0aGUgYXJndW1lbnQgaXMgYSB0dXBsZSwgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc2FtZSBvYmplY3QuXCIsXG4kcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiKC4uLilcIik7dGhpcy5pbiRyZXByPSEwO2xldCBhPXRoaXMudi5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7dGhpcy5pbiRyZXByPSExO2E9YS5qb2luKFwiLCBcIik7MT09PXRoaXMudi5sZW5ndGgmJihhKz1cIixcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIihcIithK1wiKVwiKX0sdHAkbmV3KGEsYil7aWYodGhpcyE9PVNrLmJ1aWx0aW4udHVwbGUucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGIpO1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJ0dXBsZVwiLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInR1cGxlXCIsYSwwLDEpO2E9YVswXTtyZXR1cm4gdm9pZCAwPT09YT9uZXcgU2suYnVpbHRpbi50dXBsZShbXSk6YS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4udHVwbGU/YTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLFxuITApLGE9Pm5ldyBTay5idWlsdGluLnR1cGxlKGEpKX0sdHAkaGFzaCgpe2xldCBhLGI9MzQzMDAwOCxlPTEwMDAwMDM7Y29uc3QgZj10aGlzLnYubGVuZ3RoO2ZvcihsZXQgYz0wO2M8ZjsrK2Mpe2E9U2suYWJzdHIub2JqZWN0SGFzaCh0aGlzLnZbY10pO2lmKC0xPT09YSlyZXR1cm4tMTtiPShiXmEpKmU7ZSs9ODI1MjArZitmfWIrPTk3NTMxOy0xPT09YiYmKGI9LTIpO3JldHVybiBifDB9LHRwJHJpY2hjb21wYXJlOlNrLmdlbmVyaWMuc2VxQ29tcGFyZSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBhKHRoaXMpfSxtcCRzdWJzY3JpcHQoYSl7aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSk7MD5hJiYoYT10aGlzLnYubGVuZ3RoK2EpO2lmKDA+YXx8YT49dGhpcy52Lmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFwidHVwbGUgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiB0aGlzLnZbYV19aWYoYSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnNsaWNlKXtjb25zdCBiPVtdO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57Yi5wdXNoKHRoaXMudlthXSl9KTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYil9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHVwbGUgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIHNsaWNlcywgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLnYubGVuZ3RofSxzcSRyZXBlYXQoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKDE9PT1hJiZ0aGlzLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi50dXBsZSlyZXR1cm4gdGhpcztjb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YTtjKyspZm9yKGxldCBhPTA7YTx0aGlzLnYubGVuZ3RoO2ErKyliLnB1c2godGhpcy52W2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYil9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgY29uY2F0ZW5hdGUgdHVwbGUgKG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInKSB0byB0dXBsZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy52LmNvbmNhdChhLnYpKX0sc3EkY29udGFpbnMoYSl7Zm9yKGxldCBiPXRoaXMudHAkaXRlcigpLGM9Yi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWM7Yz1iLnRwJGl0ZXJuZXh0KCkpaWYoYz09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXCJFcVwiKSlyZXR1cm4hMDtyZXR1cm4hMX19LHByb3RvOnskc3VidHlwZV9uZXcoYSxiKXtiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2E9U2suYnVpbHRpbi50dXBsZS5wcm90b3R5cGUudHAkbmV3KGEpO2Iudj1hLnY7cmV0dXJuIGJ9LHNrJGFzYXJyYXkoKXtyZXR1cm4gdGhpcy52LnNsaWNlKDApfX0sbWV0aG9kczp7X19nZXRuZXdhcmdzX186eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMudi5zbGljZSgwKSl9LFxuJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6bnVsbH0saW5kZXg6eyRtZXRoKGEsYixlKXtpZih2b2lkIDAhPT1iJiYhU2subWlzY2V2YWwuaXNJbmRleChiKXx8dm9pZCAwIT09ZSYmIVNrLm1pc2NldmFsLmlzSW5kZXgoZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKTsoe3N0YXJ0OmIsZW5kOmV9PVNrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0KHRoaXMsYixlKSk7Y29uc3QgYz10aGlzLnY7Zm9yKDtiPGU7YisrKWlmKGNbYl09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woY1tiXSxhLFwiRXFcIikpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInR1cGxlLmluZGV4KHgpOiB4IG5vdCBpbiB0dXBsZVwiKTt9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sXG4kdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIHN0YXJ0PTAsIHN0b3A9c3lzLm1heHNpemUsIC8pXCIsJGRvYzpcIlJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZS5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuXCJ9LGNvdW50OnskbWV0aChhKXtjb25zdCBiPXRoaXMudi5sZW5ndGgsYz10aGlzLnY7bGV0IGY9MDtmb3IobGV0IGU9MDtlPGI7KytlKWlmKGNbZV09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woY1tlXSxhLFwiRXFcIikpZis9MTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhmKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZG9jOlwiUmV0dXJuIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB2YWx1ZS5cIn19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi50dXBsZVwiLFNrLmJ1aWx0aW4udHVwbGUpO3ZhciBhPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInR1cGxlX2l0ZXJhdG9yXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS5zayRhc2FycmF5KCl9LGl0ZXJuZXh0OlNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXksbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhKXtsZXQgYj1hLiRzYXZlZEtleUhhc2g7cmV0dXJuIHZvaWQgMCE9PWI/YjpiPVNrLmFic3RyLm9iamVjdEhhc2goYSl9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc2V0KFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKX1mdW5jdGlvbiBiKGEsYil7Zm9yKGxldCBjPVNrLmFic3RyLml0ZXIoYSksZD1jLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZDtkPWMudHAkaXRlcm5leHQoKSlpZighU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhiLFxuZCkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZShhLGIsZCl7Y29uc3QgZT17Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7aWYoMSE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNyZWF0ZSAnXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCInIGluc3RhbmNlc1wiKTt0aGlzLmRpY3Q9YTt0aGlzLmluJHJlcHI9ITF9fTtlLnNsb3RzPU9iamVjdC5hc3NpZ24oYixoKTtlLm1ldGhvZHM9e2lzZGlzam9pbnQ6eyRtZXRoKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi5pc2Rpc2pvaW50LiRtZXRoLmNhbGwoYixhKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSB2aWV3IGFuZCB0aGUgZ2l2ZW4gaXRlcmFibGUgaGF2ZSBhIG51bGwgaW50ZXJzZWN0aW9uLlwifSxfX3JldmVyc2VkX186eyRtZXRoOmQsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgZGljdCBrZXlzLlwifX07XG5lLmZsYWdzPXtzayRhY2NlcHRhYmxlX2FzX2Jhc2U6ITF9O1wiZGljdF92YWx1ZXNcIj09PWEmJihkZWxldGUgZS5zbG90cy50cCRhc19udW1iZXIsZGVsZXRlIGUuc2xvdHMudHAkcmljaGNvbXBhcmUpO3JldHVybiBTay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKGEsZSl9ZnVuY3Rpb24gZihhLGIsYyl7cmV0dXJuIFNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhhLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO3RoaXMuJG9yaWc9YTt0aGlzLnRwJGl0ZXJuZXh0PSgpPT57dGhpcy4kc2VxPWEuJGl0ZW1zKCk7dGhpcy4kdmVyc2lvbj1hLiR2ZXJzaW9uO2MmJih0aGlzLiRzZXE9dGhpcy4kc2VxLnJldmVyc2UoKSk7dGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dDtyZXR1cm4gdGhpcy50cCRpdGVybmV4dCgpfX0saXRlcm5leHQ6YixtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sXG5mbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfSxwcm90bzp7bmV4dCRpdGVtOmx9fSl9ZnVuY3Rpb24gbCgpe2lmKHRoaXMuJHZlcnNpb24hPT10aGlzLiRvcmlnLiR2ZXJzaW9uKXtpZih0aGlzLiRsZW4hPT10aGlzLiRvcmlnLmdldCRzaXplKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKFwiZGljdCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvblwiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5SdW50aW1lRXJyb3IoXCJkaWN0aW9uYXJ5IGtleXMgY2hhbmdlZCBkdXJpbmcgaXRlcmF0aW9uXCIpO31yZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfVNrLmJ1aWx0aW4uZGljdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZGljdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1bXSk7U2suYXNzZXJ0cy5hc3NlcnQoQXJyYXkuaXNBcnJheShhKSYmMD09PWEubGVuZ3RoJTImJnRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QsXG5cImJhZCBjYWxsIHRvIGRpY3QgY29uc3RydWN0b3JcIik7dGhpcy5zaXplPTA7dGhpcy5lbnRyaWVzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5idWNrZXRzPXt9O2ZvcihsZXQgYj0wO2I8YS5sZW5ndGg7Yis9Mil0aGlzLnNldCRpdGVtKGFbYl0sYVtiKzFdKTt0aGlzLmluJHJlcHI9ITE7dGhpcy4kdmVyc2lvbj0wfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRhc19udW1iZXI6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkZG9jOlwiZGljdCgpIC0+IG5ldyBlbXB0eSBkaWN0aW9uYXJ5XFxuZGljdChtYXBwaW5nKSAtPiBuZXcgZGljdGlvbmFyeSBpbml0aWFsaXplZCBmcm9tIGEgbWFwcGluZyBvYmplY3Qnc1xcbiAgICAoa2V5LCB2YWx1ZSkgcGFpcnNcXG5kaWN0KGl0ZXJhYmxlKSAtPiBuZXcgZGljdGlvbmFyeSBpbml0aWFsaXplZCBhcyBpZiB2aWE6XFxuICAgIGQgPSB7fVxcbiAgICBmb3IgaywgdiBpbiBpdGVyYWJsZTpcXG4gICAgICAgIGRba10gPSB2XFxuZGljdCgqKmt3YXJncykgLT4gbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbmFtZT12YWx1ZSBwYWlyc1xcbiAgICBpbiB0aGUga2V5d29yZCBhcmd1bWVudCBsaXN0LiAgRm9yIGV4YW1wbGU6ICBkaWN0KG9uZT0xLCB0d289MilcIixcbiRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJ7Li4ufVwiKTt0aGlzLmluJHJlcHI9ITA7Y29uc3QgYT10aGlzLiRpdGVtcygpLm1hcCgoW2EsYl0pPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiOiBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGIpKTt0aGlzLmluJHJlcHI9ITE7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIntcIithLmpvaW4oXCIsIFwiKStcIn1cIil9LHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYil7cmV0dXJuIHRoaXMudXBkYXRlJGNvbW1vbihhLGIsXCJkaWN0XCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBrKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLGIpe2xldCBjO2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCl8fFwiRXFcIiE9PWImJlwiTm90RXFcIiE9PWIpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2lmKGE9PT10aGlzKWM9ITA7ZWxzZSBpZih0aGlzLnNpemUhPT1cbmEuc2l6ZSljPSExO2Vsc2V7bGV0IGI7Yz10aGlzLiRpdGVtcygpLmV2ZXJ5KChbYyxkXSk9PntiPWEubXAkbG9va3VwKGMpO3JldHVybiB2b2lkIDAhPT1iJiYoYj09PWR8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGIsXCJFcVwiKSl9KX1yZXR1cm5cIkVxXCI9PT1iP2M6IWN9LG5iJG9yKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGI9dGhpcy5kaWN0JGNvcHkoKTtiLmRpY3QkbWVyZ2UoYSk7cmV0dXJuIGJ9LG5iJHJlZmxlY3RlZF9vcihhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPWEuZGljdCRjb3B5KCk7YS5kaWN0JG1lcmdlKHRoaXMpO3JldHVybiBhfSxuYiRpbnBsYWNlX29yKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZSRvbmVhcmcoYSksXG4oKT0+dGhpcyl9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmdldCRzaXplKCl9LHNxJGNvbnRhaW5zKGEpe3JldHVybiB2b2lkIDAhPT10aGlzLm1wJGxvb2t1cChhKX0sbXAkc3Vic2NyaXB0KGEsYil7dmFyIGM9dGhpcy5tcCRsb29rdXAoYSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztjPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwodGhpcyxTay5idWlsdGluLnN0ci4kbWlzc2luZyk7aWYodm9pZCAwIT09YylyZXR1cm4gYT1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbYV0pLGI/YTpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7fSxtcCRhc3Nfc3Vic2NyaXB0KGEsYil7aWYodm9pZCAwPT09Yil7aWYodm9pZCAwPT09dGhpcy5wb3AkaXRlbShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihhKTt9ZWxzZSB0aGlzLnNldCRpdGVtKGEsYil9fSxtZXRob2RzOntfX3JldmVyc2VkX186eyRtZXRoKCl7cmV0dXJuIG5ldyBBKHRoaXMpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Qga2V5cy5cIn0sZ2V0OnskbWV0aChhLGIpe3JldHVybiB0aGlzLm1wJGxvb2t1cChhKXx8Ynx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSB2YWx1ZSBmb3Iga2V5IGlmIGtleSBpcyBpbiB0aGUgZGljdGlvbmFyeSwgZWxzZSBkZWZhdWx0LlwifSxzZXRkZWZhdWx0OnskbWV0aChiLGMpe2xldCBkO2NvbnN0IGU9YShiKTtkPVwic3RyaW5nXCI9PT10eXBlb2YgZT90aGlzLmVudHJpZXNbZV06dGhpcy5nZXQkYnVja2V0X2l0ZW0oYixlKTtpZih2b2lkIDAhPT1kKXJldHVybiBkWzFdO2M9Y3x8U2suYnVpbHRpbi5ub25lLm5vbmUkO1wic3RyaW5nXCI9PT10eXBlb2YgZT90aGlzLmVudHJpZXNbZV09W2IsY106XG50aGlzLnNldCRidWNrZXRfaXRlbShiLGMsZSk7dGhpcy5zaXplKys7dGhpcy4kdmVyc2lvbisrO3JldHVybiBjfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSwgLylcIiwkZG9jOlwiSW5zZXJ0IGtleSB3aXRoIGEgdmFsdWUgb2YgZGVmYXVsdCBpZiBrZXkgaXMgbm90IGluIHRoZSBkaWN0aW9uYXJ5LlxcblxcblJldHVybiB0aGUgdmFsdWUgZm9yIGtleSBpZiBrZXkgaXMgaW4gdGhlIGRpY3Rpb25hcnksIGVsc2UgZGVmYXVsdC5cIn0scG9wOnskbWV0aChhLGIpe2NvbnN0IGM9dGhpcy5wb3AkaXRlbShhKTtpZih2b2lkIDAhPT1jKXJldHVybiBjWzFdO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7fSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQucG9wKGtbLGRdKSAtPiB2LCByZW1vdmUgc3BlY2lmaWVkIGtleSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLlxcbklmIGtleSBpcyBub3QgZm91bmQsIGQgaXMgcmV0dXJuZWQgaWYgZ2l2ZW4sIG90aGVyd2lzZSBLZXlFcnJvciBpcyByYWlzZWRcIn0sXG5wb3BpdGVtOnskbWV0aCgpe2NvbnN0IGE9dGhpcy5nZXQkc2l6ZSgpO2lmKDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKFwicG9waXRlbSgpOiBkaWN0aW9uYXJ5IGlzIGVtcHR5XCIpO2NvbnN0IFtiLGNdPXRoaXMuJGl0ZW1zKClbYS0xXTt0aGlzLnBvcCRpdGVtKGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbYixjXSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnBvcGl0ZW0oKSAtPiAoaywgdiksIHJlbW92ZSBhbmQgcmV0dXJuIHNvbWUgKGtleSwgdmFsdWUpIHBhaXIgYXMgYVxcbjItdHVwbGU7IGJ1dCByYWlzZSBLZXlFcnJvciBpZiBEIGlzIGVtcHR5LlwifSxrZXlzOnskbWV0aCgpe3JldHVybiBuZXcgZCh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQua2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGtleXNcIn0saXRlbXM6eyRtZXRoKCl7cmV0dXJuIG5ldyBuKHRoaXMpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELml0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3MgaXRlbXNcIn0sdmFsdWVzOnskbWV0aCgpe3JldHVybiBuZXcgZyh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQudmFsdWVzKCkgLT4gYW4gb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIHZhbHVlc1wifSx1cGRhdGU6eyRtZXRoKGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKHRoaXMudXBkYXRlJGNvbW1vbihhLGIsXCJ1cGRhdGVcIiksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQudXBkYXRlKFtFLCBdKipGKSAtPiBOb25lLiAgVXBkYXRlIEQgZnJvbSBkaWN0L2l0ZXJhYmxlIEUgYW5kIEYuXFxuSWYgRSBpcyBwcmVzZW50IGFuZCBoYXMgYSAua2V5cygpIG1ldGhvZCwgdGhlbiBkb2VzOiAgZm9yIGsgaW4gRTogRFtrXSA9IEVba11cXG5JZiBFIGlzIHByZXNlbnQgYW5kIGxhY2tzIGEgLmtleXMoKSBtZXRob2QsIHRoZW4gZG9lczogIGZvciBrLCB2IGluIEU6IERba10gPSB2XFxuSW4gZWl0aGVyIGNhc2UsIHRoaXMgaXMgZm9sbG93ZWQgYnk6IGZvciBrIGluIEY6ICBEW2tdID0gRltrXVwifSxcbmNsZWFyOnskbWV0aCgpe3RoaXMuc2l6ZT0wO3RoaXMuJHZlcnNpb24rKzt0aGlzLmVudHJpZXM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmJ1Y2tldHM9e319LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmNsZWFyKCkgLT4gTm9uZS4gIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSBELlwifSxjb3B5OnskbWV0aCgpe3JldHVybiB0aGlzLmRpY3QkY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5jb3B5KCkgLT4gYSBzaGFsbG93IGNvcHkgb2YgRFwifX0sY2xhc3NtZXRob2RzOntmcm9ta2V5czp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPWJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtsZXQgYz10aGlzPT09U2suYnVpbHRpbi5kaWN0P25ldyB0aGlzOnRoaXMudHAkY2FsbChbXSxbXSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGMsZD0+e2M9ZDtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PlxuYy5tcCRhc3Nfc3Vic2NyaXB0KGEsYiwhMCkpfSwoKT0+Yyl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJHR5cGUsIGl0ZXJhYmxlLCB2YWx1ZT1Ob25lLCAvKVwiLCRkb2M6XCJDcmVhdGUgYSBuZXcgZGljdGlvbmFyeSB3aXRoIGtleXMgZnJvbSBpdGVyYWJsZSBhbmQgdmFsdWVzIHNldCB0byB2YWx1ZS5cIn19LHByb3RvOntxdWljayRsb29rdXA6ZnVuY3Rpb24oYSl7YT10aGlzLmVudHJpZXNbYS4kc2F2ZWRLZXlIYXNoXTtpZih2b2lkIDAhPT1hKXJldHVybiBhWzFdfSxtcCRsb29rdXA6ZnVuY3Rpb24oYil7Y29uc3QgYz1hKGIpO2I9XCJzdHJpbmdcIj09PXR5cGVvZiBjP3RoaXMuZW50cmllc1tjXTp0aGlzLmdldCRidWNrZXRfaXRlbShiLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGJbMV19LGdldCRzaXplKCl7cmV0dXJuIHRoaXMuc2l6ZX0sc2skYXNhcnJheSgpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZW50cmllcykubWFwKGE9PmFbMF0pfSx1cGRhdGUkY29tbW9uOmZ1bmN0aW9uKGEsXG5iLGMpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihjLGEsMCwxKTthPWFbMF07bGV0IGQ7dm9pZCAwIT09YSYmKGQ9dGhpcy51cGRhdGUkb25lYXJnKGEpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCwoKT0+e2lmKGIpZm9yKGxldCBhPTA7YTxiLmxlbmd0aDthKz0yKXRoaXMuc2V0JGl0ZW0obmV3IFNrLmJ1aWx0aW4uc3RyKGJbYV0pLGJbYSsxXSl9KX0sdXBkYXRlJG9uZWFyZyhhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdHx8dm9pZCAwIT09U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRrZXlzKT90aGlzLmRpY3QkbWVyZ2UoYSk6dGhpcy5kaWN0JG1lcmdlX3NlcShhKX0sZGljdCRjb3B5KCl7Y29uc3QgYT1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTthLnNpemU9dGhpcy5zaXplO3ZhciBiPU9iamVjdC5lbnRyaWVzKHRoaXMuZW50cmllcyk7Zm9yKHZhciBjIGluIGIpe3ZhciBkPWJbY11bMV07YS5lbnRyaWVzW2JbY11bMF1dPVtkWzBdLFxuZFsxXV19Zm9yKGxldCBlIGluIHRoaXMuYnVja2V0cylmb3IoYz10aGlzLmJ1Y2tldHNbZV0sYS5idWNrZXRzW2VdPWI9W10sZD0wO2Q8Yy5sZW5ndGg7ZCsrKWIucHVzaChhLmVudHJpZXNbXCIjXCIrZStcIl9cIitkXSk7cmV0dXJuIGF9LCRpdGVtcygpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZW50cmllcyl9LHNldCRpdGVtOmZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hKGIpO2xldCBlO1wic3RyaW5nXCI9PT10eXBlb2YgZD8oZT10aGlzLmVudHJpZXNbZF0sdm9pZCAwPT09ZT8odGhpcy5lbnRyaWVzW2RdPVtiLGNdLHRoaXMuc2l6ZSsrLHRoaXMuJHZlcnNpb24rKyk6ZVsxXT1jKTooZT10aGlzLmdldCRidWNrZXRfaXRlbShiLGQpLHZvaWQgMD09PWU/KHRoaXMuc2V0JGJ1Y2tldF9pdGVtKGIsYyxkKSx0aGlzLnNpemUrKyx0aGlzLiR2ZXJzaW9uKyspOmVbMV09Yyl9LGdldCRidWNrZXRfaXRlbTpmdW5jdGlvbihhLGIpe2I9dGhpcy5idWNrZXRzW2JdO2lmKHZvaWQgMCE9PWIpZm9yKGxldCBkPVxuMDtkPGIubGVuZ3RoO2QrKyl7dmFyIGM9YltkXTtpZih2b2lkIDAhPT1jJiYoY1swXT09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLGNbMF0sXCJFcVwiKSkpcmV0dXJuIGN9fSxwb3AkYnVja2V0X2l0ZW06ZnVuY3Rpb24oYSxiKXtjb25zdCBjPXRoaXMuYnVja2V0c1tiXTtsZXQgZDtpZih2b2lkIDAhPT1jKWZvcihsZXQgZT0wO2U8Yy5sZW5ndGg7ZSsrKWlmKGQ9Y1tlXSx2b2lkIDAhPT1kJiYoZFswXT09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLGRbMF0sXCJFcVwiKSkpcmV0dXJuIGRlbGV0ZSB0aGlzLmVudHJpZXNbXCIjXCIrYitcIl9cIitlXSxjW2VdPXZvaWQgMCxjLmV2ZXJ5KGE9PnZvaWQgMD09PWEpJiZkZWxldGUgdGhpcy5idWNrZXRzW2JdLGR9LHNldCRidWNrZXRfaXRlbTpmdW5jdGlvbihhLGIsYyl7bGV0IGQ9dGhpcy5idWNrZXRzW2NdO2E9W2EsYl07dm9pZCAwPT09ZD8odGhpcy5idWNrZXRzW2NdPVthXSxjPVwiI1wiK2MrXCJfMFwiKTooYj1kLmluZGV4T2Yodm9pZCAwKSxcbi0xIT09Yj8oYz1cIiNcIitjK1wiX1wiK2IsZFtiXT1hKTooYz1cIiNcIitjK1wiX1wiK2QubGVuZ3RoLGQucHVzaChhKSkpO3RoaXMuZW50cmllc1tjXT1hfSxwb3AkaXRlbTpmdW5jdGlvbihiKXtjb25zdCBjPWEoYik7XCJzdHJpbmdcIj09PXR5cGVvZiBjPyhiPXRoaXMuZW50cmllc1tjXSxkZWxldGUgdGhpcy5lbnRyaWVzW2NdKTpiPXRoaXMucG9wJGJ1Y2tldF9pdGVtKGIsYyk7aWYodm9pZCAwIT09YilyZXR1cm4gdGhpcy5zaXplLS0sdGhpcy4kdmVyc2lvbisrLGJ9LGRpY3QkbWVyZ2U6ZnVuY3Rpb24oYSl7aWYoYS50cCRpdGVyPT09U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS50cCRpdGVyKXt2YXIgYj1hLnRwJGl0ZXIoKTtmb3IobGV0IGM9Yi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWM7Yz1iLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGI9YS5tcCRzdWJzY3JpcHQoYyk7dGhpcy5zZXQkaXRlbShjLGIpfX1lbHNlIHJldHVybiBiPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyksXG5Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYixbXSksYj0+U2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGIpLGI9PlNrLm1pc2NldmFsLmNoYWluKGEubXAkc3Vic2NyaXB0KGIsITApLGE9Pnt0aGlzLnNldCRpdGVtKGIsYSl9KSkpfSxkaWN0JG1lcmdlX3NlcTpmdW5jdGlvbihhKXtsZXQgYj0wO3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNvbnZlcnQgZGljdGlvbmFyeSB1cGRhdGUgc2VxdWVuY2UgZWxlbWVudCAjXCIrYitcIiB0byBhIHNlcXVlbmNlXCIpO2E9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSk7aWYoMiE9PWEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJkaWN0aW9uYXJ5IHVwZGF0ZSBzZXF1ZW5jZSBlbGVtZW50ICNcIitcbmIrXCIgaGFzIGxlbmd0aCBcIithLmxlbmd0aCtcIjsgMiBpcyByZXF1aXJlZFwiKTt0aGlzLnNldCRpdGVtKGFbMF0sYVsxXSk7YisrfSl9fX0pO2NvbnN0IGg9e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX251bWJlcjohMCx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCIuLi5cIik7dGhpcy5pbiRyZXByPSEwO2xldCBhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKHRoaXMpO2E9YS5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIoW1wiK2Euam9pbihcIiwgXCIpK1wiXSlcIil9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoIShTay5idWlsdGluLmNoZWNrQW55U2V0KGEpfHxhIGluc3RhbmNlb2YgZHx8XG5hIGluc3RhbmNlb2YgbikpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGU9dGhpcy5zcSRsZW5ndGgoKSxmPWEuc3EkbGVuZ3RoKCk7c3dpdGNoKGMpe2Nhc2UgXCJOb3RFcVwiOmNhc2UgXCJFcVwiOmxldCBkO3RoaXM9PT1hP2Q9ITA6ZT09PWYmJihkPWIodGhpcyxhKSk7cmV0dXJuXCJOb3RFcVwiPT09Yz8hZDpkO2Nhc2UgXCJMdFwiOnJldHVybiBlPGYmJmIodGhpcyxhKTtjYXNlIFwiTHRFXCI6cmV0dXJuIGU8PWYmJmIodGhpcyxhKTtjYXNlIFwiR3RcIjpyZXR1cm4gZT5mJiZiKGEsdGhpcyk7Y2FzZSBcIkd0RVwiOnJldHVybiBlPj1mJiZiKGEsdGhpcyl9fSxuYiRzdWJ0cmFjdChhKXtjb25zdCBiPWModGhpcyk7cmV0dXJuIGIuZGlmZmVyZW5jZS4kbWV0aC5jYWxsKGIsYSl9LG5iJGFuZChhKXtjb25zdCBiPWModGhpcyk7cmV0dXJuIGIuaW50ZXJzZWN0aW9uLiRtZXRoLmNhbGwoYixhKX0sbmIkb3IoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLnVuaW9uLiRtZXRoLmNhbGwoYixcbmEpfSxuYiR4b3IoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLnN5bW1ldHJpY19kaWZmZXJlbmNlLiRtZXRoLmNhbGwoYixhKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMuZGljdC5nZXQkc2l6ZSgpfX07dmFyIGQ9ZShcImRpY3Rfa2V5c1wiLHtzcSRjb250YWlucyhhKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5kaWN0Lm1wJGxvb2t1cChhKX0sdHAkaXRlcigpe3JldHVybiBuZXcgayh0aGlzLmRpY3QpfX0sZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEEodGhpcy5kaWN0KX0pLGc9ZShcImRpY3RfdmFsdWVzXCIse3RwJGl0ZXIoKXtyZXR1cm4gbmV3IHUodGhpcy5kaWN0KX19LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2KHRoaXMuZGljdCl9KSxuPWUoXCJkaWN0X2l0ZW1zXCIse3NxJGNvbnRhaW5zKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUmJjI9PT1hLnNxJGxlbmd0aCgpKSlyZXR1cm4hMTt2YXIgYj1hLm1wJHN1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5pbnRfKDApKTtcbmE9YS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50XygxKSk7Yj10aGlzLmRpY3QubXAkbG9va3VwKGIpO3JldHVybiB2b2lkIDA9PT1iPyExOmI9PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYixhLFwiRXFcIil9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IHAodGhpcy5kaWN0KX19LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KHRoaXMuZGljdCl9KSxrPWYoXCJkaWN0X2tleWl0ZXJhdG9yXCIsZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMubmV4dCRpdGVtKCk7cmV0dXJuIGEmJmFbMF19KSxwPWYoXCJkaWN0X2l0ZW1pdGVyYXRvclwiLGZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLm5leHQkaXRlbSgpO3JldHVybiBhJiZuZXcgU2suYnVpbHRpbi50dXBsZShbYVswXSxhWzFdXSl9KSx1PWYoXCJkaWN0X3ZhbHVlaXRlcmF0b3JcIixmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5uZXh0JGl0ZW0oKTtyZXR1cm4gYSYmYVsxXX0pLEE9ZihcImRpY3RfcmV2ZXJzZWtleWl0ZXJhdG9yXCIsay5wcm90b3R5cGUudHAkaXRlcm5leHQsXG4hMCksdD1mKFwiZGljdF9yZXZlcnNlaXRlbWl0ZXJhdG9yXCIscC5wcm90b3R5cGUudHAkaXRlcm5leHQsITApLHY9ZihcImRpY3RfcmV2ZXJzZXZhbHVlaXRlcmF0b3JcIix1LnByb3RvdHlwZS50cCRpdGVybmV4dCwhMCk7U2suYnVpbHRpbi5kaWN0LnB5MiRtZXRob2RzPXtoYXNfa2V5OnskbmFtZTpcImhhc19rZXlcIiwkZmxhZ3M6e09uZUFyZzohMH0sJG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wodGhpcy5zcSRjb250YWlucyhhKSl9LCRkb2M6XCJELmhhc19rZXkoaykgLT4gVHJ1ZSBpZiBEIGhhcyBhIGtleSBrLCBlbHNlIEZhbHNlXCJ9LGtleXM6eyRuYW1lOlwia2V5c1wiLCRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy5zayRhc2FycmF5KCkpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5rZXlzKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3Mga2V5c1wifSxpdGVtczp7JG5hbWU6XCJpdGVtc1wiLFxuJG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLiRpdGVtcygpLm1hcCgoW2EsYl0pPT5uZXcgU2suYnVpbHRpbi50dXBsZShbYSxiXSkpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuaXRlbXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBpdGVtc1wifSx2YWx1ZXM6eyRuYW1lOlwidmFsdWVzXCIsJG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLiRpdGVtcygpLm1hcCgoWyxhXSk9PmEpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQudmFsdWVzKCkgLT4gYW4gb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIHZhbHVlc1wifX19LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEse2VudHJpZXM6e2dldDooKT0+e2NvbnN0IGE9T2JqZWN0LmNyZWF0ZShudWxsKTtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbYixcbmNdKT0+e2I9U2sudW5maXhSZXNlcnZlZChiKTtiLmluY2x1ZGVzKFwiJFwiKXx8KGI9bmV3IFNrLmJ1aWx0aW4uc3RyKGIpLGFbYi4kc2F2ZWRLZXlIYXNoXT1bYixjXSl9KTtyZXR1cm4gYX0sY29uZmlndXJhYmxlOiEwfSxzaXplOntnZXQ6KCk9Pk9iamVjdC5rZXlzKGIpLm1hcChhPT5Tay51bmZpeFJlc2VydmVkKGEpKS5maWx0ZXIoYT0+IWEuaW5jbHVkZXMoXCIkXCIpKS5sZW5ndGgsY29uZmlndXJhYmxlOiEwfX0pfVNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJtYXBwaW5ncHJveHlcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYyl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5LFwiYmFkIGNhbGwgdG8gbWFwcGluZyBwcm94eSwgdXNlICduZXcnXCIpO3RoaXMubWFwcGluZz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTt2b2lkIDAhPT1jJiZhKHRoaXMubWFwcGluZyxjKX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLFxudHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwibWFwcGluZ3Byb3h5XCIsYik7U2suYWJzdHIuY2hlY2tPbmVBcmcoXCJtYXBwaW5ncHJveHlcIixhLGIpO2E9YVswXTtpZighU2suYnVpbHRpbi5jaGVja01hcHBpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibWFwcGluZ3Byb3h5KCkgYXJndW1lbnQgbXVzdCBiZSBhIG1hcHBpbmcsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7Yj1uZXcgU2suYnVpbHRpbi5tYXBwaW5ncHJveHk7Yi5tYXBwaW5nPWE7cmV0dXJuIGJ9LHRwJHJpY2hjb21wYXJlKGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCh0aGlzLm1hcHBpbmcsYSxiKX0sdHAkc3RyKCl7cmV0dXJuIHRoaXMubWFwcGluZy50cCRzdHIoKX0sJHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwibWFwcGluZ3Byb3h5KFwiK1xuU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLm1hcHBpbmcpK1wiKVwiKX0sbXAkc3Vic2NyaXB0KGEsYil7cmV0dXJuIHRoaXMubWFwcGluZy5tcCRzdWJzY3JpcHQoYSxiKX0sc3EkY29udGFpbnMoYSl7cmV0dXJuIHRoaXMubWFwcGluZy5zcSRjb250YWlucyhhKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMubWFwcGluZy5zcSRsZW5ndGgoKX0sdHAkaXRlcigpe3JldHVybiB0aGlzLm1hcHBpbmcudHAkaXRlcigpfSx0cCRhc19udW1iZXI6ITAsbmIkb3IoYSl7YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5JiYoYT1hLm1hcHBpbmcpO3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcCh0aGlzLm1hcHBpbmcsYSxcIkJpdE9yXCIpfSxuYiRyZWZsZWN0ZWRfb3IoYSl7YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5JiYoYT1hLm1hcHBpbmcpO3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLHRoaXMubWFwcGluZyxcIkJpdE9yXCIpfSxuYiRpbnBsYWNlX29yKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIid8PScgaXMgbm90IHN1cHBvcnRlZCBieSBcIitcblNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiOyB1c2UgJ3wnIGluc3RlYWRcIik7fX0sbWV0aG9kczp7Z2V0OnskbWV0aChhLGIpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5tYXBwaW5nLnRwJGdldGF0dHIodGhpcy5zdHIkZ2V0KSxhLGIpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmdldChrWyxkXSkgLT4gRFtrXSBpZiBrIGluIEQsIGVsc2UgZC4gIGQgZGVmYXVsdHMgdG8gTm9uZS5cIn0sa2V5czp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGtleXMpLFtdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQua2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGtleXNcIn0saXRlbXM6eyRtZXRoKCl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLm1hcHBpbmcudHAkZ2V0YXR0cih0aGlzLnN0ciRpdGVtcyksXG5bXSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELml0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3MgaXRlbXNcIn0sdmFsdWVzOnskbWV0aCgpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5tYXBwaW5nLnRwJGdldGF0dHIodGhpcy5zdHIkdmFsdWVzKSxbXSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIHZhbHVlc1wifSxjb3B5OnskbWV0aCgpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5tYXBwaW5nLnRwJGdldGF0dHIodGhpcy5zdHIkY29weSksW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5jb3B5KCkgLT4gYSBzaGFsbG93IGNvcHkgb2YgRFwifX0scHJvdG86e3N0ciRnZXQ6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiZ2V0XCIpLFxuc3RyJGNvcHk6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiY29weVwiKSxzdHIka2V5czpuZXcgU2suYnVpbHRpbi5zdHIoXCJrZXlzXCIpLHN0ciRpdGVtczpuZXcgU2suYnVpbHRpbi5zdHIoXCJpdGVtc1wiKSxzdHIkdmFsdWVzOm5ldyBTay5idWlsdGluLnN0cihcInZhbHVlc1wiKSxtcCRsb29rdXAoYSl7cmV0dXJuIHRoaXMubWFwcGluZy5tcCRsb29rdXAoYSl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ucHJvcGVydHk9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInByb3BlcnR5XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyxiLGUpe3RoaXMucHJvcCRnZXQ9YXx8U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMucHJvcCRzZXQ9Y3x8U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMucHJvcCRkZWw9Ynx8U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMucHJvcCRkb2M9ZXx8YSYmYS4kZG9jfHxTay5idWlsdGluLm5vbmUubm9uZSR9LFxuc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYyl7YT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcInByb3BlcnR5XCIsW1wiZmdldFwiLFwiZnNldFwiLFwiZmRlbFwiLFwiZG9jXCJdLGEsYyxBcnJheSg0KS5maWxsKFNrLmJ1aWx0aW4ubm9uZS5ub25lJCkpO3RoaXMucHJvcCRnZXQ9YVswXTt0aGlzLnByb3Akc2V0PWFbMV07dGhpcy5wcm9wJGRlbD1hWzJdO1NrLmJ1aWx0aW4uY2hlY2tOb25lKGFbM10pP1NrLmJ1aWx0aW4uY2hlY2tOb25lKGFbMF0pfHwodGhpcy5wcm9wJGRvYz1hWzBdLiRkb2N8fGFbM10pOnRoaXMucHJvcCRkb2M9YVszXX0sdHAkZG9jOlwiUHJvcGVydHkgYXR0cmlidXRlLlxcblxcbiAgZmdldFxcbiAgICBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBnZXR0aW5nIGFuIGF0dHJpYnV0ZSB2YWx1ZVxcbiAgZnNldFxcbiAgICBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBzZXR0aW5nIGFuIGF0dHJpYnV0ZSB2YWx1ZVxcbiAgZmRlbFxcbiAgICBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBkZWwnaW5nIGFuIGF0dHJpYnV0ZVxcbiAgZG9jXFxuICAgIGRvY3N0cmluZ1xcblxcblR5cGljYWwgdXNlIGlzIHRvIGRlZmluZSBhIG1hbmFnZWQgYXR0cmlidXRlIHg6XFxuXFxuY2xhc3MgQyhvYmplY3QpOlxcbiAgICBkZWYgZ2V0eChzZWxmKTogcmV0dXJuIHNlbGYuX3hcXG4gICAgZGVmIHNldHgoc2VsZiwgdmFsdWUpOiBzZWxmLl94ID0gdmFsdWVcXG4gICAgZGVmIGRlbHgoc2VsZik6IGRlbCBzZWxmLl94XFxuICAgIHggPSBwcm9wZXJ0eShnZXR4LCBzZXR4LCBkZWx4LCAnSSdtIHRoZSAneCcgcHJvcGVydHkuJylcXG5cXG5EZWNvcmF0b3JzIG1ha2UgZGVmaW5pbmcgbmV3IHByb3BlcnRpZXMgb3IgbW9kaWZ5aW5nIGV4aXN0aW5nIG9uZXMgZWFzeTpcXG5cXG5jbGFzcyBDKG9iamVjdCk6XFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgeChzZWxmKTpcXG4gICAgICAgICdJIGFtIHRoZSAneCcgcHJvcGVydHkuJ1xcbiAgICAgICAgcmV0dXJuIHNlbGYuX3hcXG4gICAgQHguc2V0dGVyXFxuICAgIGRlZiB4KHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIHNlbGYuX3ggPSB2YWx1ZVxcbiAgICBAeC5kZWxldGVyXFxuICAgIGRlZiB4KHNlbGYpOlxcbiAgICAgICAgZGVsIHNlbGYuX3hcIixcbnRwJGRlc2NyX2dldChhLGMpe2lmKG51bGw9PT1hKXJldHVybiB0aGlzO2lmKHZvaWQgMD09PXRoaXMucHJvcCRnZXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCJ1bnJlYWRhYmxlIGF0dHJpYnV0ZVwiKTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KHRoaXMucHJvcCRnZXQsW2FdKX0sdHAkZGVzY3Jfc2V0KGEsYyl7bGV0IGI7Yj1udWxsPT1jP3RoaXMucHJvcCRkZWw6dGhpcy5wcm9wJHNldDtpZihTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcImNhbid0IFwiKyhudWxsPT1jP1wiZGVsZXRlXCI6XCJzZXRcIikrXCIgYXR0cmlidXRlXCIpO2lmKCFiLnRwJGNhbGwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1wiJyBpcyBub3QgY2FsbGFibGVcIik7cmV0dXJuIG51bGw9PWM/Yi50cCRjYWxsKFthXSk6Yi50cCRjYWxsKFthLGNdKX19LFxubWV0aG9kczp7Z2V0dGVyOnskbWV0aChhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ucHJvcGVydHkoYSx0aGlzLnByb3Akc2V0LHRoaXMucHJvcCRkZWwsdGhpcy5wcm9wJGRvYyl9LCRmbGFnczp7T25lQXJnOiEwfX0sc2V0dGVyOnskbWV0aChhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ucHJvcGVydHkodGhpcy5wcm9wJGdldCxhLHRoaXMucHJvcCRkZWwsdGhpcy5wcm9wJGRvYyl9LCRmbGFnczp7T25lQXJnOiEwfX0sZGVsZXRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KHRoaXMucHJvcCRnZXQsdGhpcy5wcm9wJHNldCxhLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19fSxnZXRzZXRzOntmZ2V0OnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvcCRnZXR9fSxmc2V0OnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvcCRzZXR9fSxmZGVsOnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvcCRkZWx9fSxfX2RvY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvcCRkb2N9LFxuJHNldChhKXt0aGlzLnByb3AkZG9jPWE9YXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX19fSk7U2suYnVpbHRpbi5jbGFzc21ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiY2xhc3NtZXRob2RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5jbSRjYWxsYWJsZT1hO3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdH0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcImNsYXNzbWV0aG9kXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwiY2xhc3NtZXRob2RcIixhLDEsMSk7dGhpcy5jbSRjYWxsYWJsZT1hWzBdfSx0cCRkb2M6XCJjbGFzc21ldGhvZChmdW5jdGlvbikgLT4gbWV0aG9kXFxuXFxuQ29udmVydCBhIGZ1bmN0aW9uIHRvIGJlIGEgY2xhc3MgbWV0aG9kLlxcblxcbkEgY2xhc3MgbWV0aG9kIHJlY2VpdmVzIHRoZSBjbGFzcyBhcyBpbXBsaWNpdCBmaXJzdCBhcmd1bWVudCxcXG5qdXN0IGxpa2UgYW4gaW5zdGFuY2UgbWV0aG9kIHJlY2VpdmVzIHRoZSBpbnN0YW5jZS5cXG5UbyBkZWNsYXJlIGEgY2xhc3MgbWV0aG9kLCB1c2UgdGhpcyBpZGlvbTpcXG5cXG4gIGNsYXNzIEM6XFxuICAgICAgQGNsYXNzbWV0aG9kXFxuICAgICAgZGVmIGYoY2xzLCBhcmcxLCBhcmcyLCAuLi4pOlxcbiAgICAgICAgICAuLi5cXG5cXG5JdCBjYW4gYmUgY2FsbGVkIGVpdGhlciBvbiB0aGUgY2xhc3MgKGUuZy4gQy5mKCkpIG9yIG9uIGFuIGluc3RhbmNlXFxuKGUuZy4gQygpLmYoKSkuICBUaGUgaW5zdGFuY2UgaXMgaWdub3JlZCBleGNlcHQgZm9yIGl0cyBjbGFzcy5cXG5JZiBhIGNsYXNzIG1ldGhvZCBpcyBjYWxsZWQgZm9yIGEgZGVyaXZlZCBjbGFzcywgdGhlIGRlcml2ZWQgY2xhc3NcXG5vYmplY3QgaXMgcGFzc2VkIGFzIHRoZSBpbXBsaWVkIGZpcnN0IGFyZ3VtZW50LlxcblxcbkNsYXNzIG1ldGhvZHMgYXJlIGRpZmZlcmVudCB0aGFuIEMrKyBvciBKYXZhIHN0YXRpYyBtZXRob2RzLlxcbklmIHlvdSB3YW50IHRob3NlLCBzZWUgdGhlIHN0YXRpY21ldGhvZCBidWlsdGluLlwiLFxudHAkZGVzY3JfZ2V0KGEsYyl7Y29uc3QgYj10aGlzLmNtJGNhbGxhYmxlO2lmKHZvaWQgMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKFwidW5pbml0aWFsaXplZCBjbGFzc21ldGhvZCBvYmplY3RcIik7dm9pZCAwPT09YyYmKGM9YS5vYiR0eXBlKTtyZXR1cm4oYT1iLnRwJGRlc2NyX2dldCk/YS5jYWxsKGIsYyk6bmV3IFNrLmJ1aWx0aW4ubWV0aG9kKGIsYyl9fSxnZXRzZXRzOntfX2Z1bmNfXzp7JGdldCgpe3JldHVybiB0aGlzLmNtJGNhbGxhYmxlfX0sX19kaWN0X186U2suZ2VuZXJpYy5nZXRTZXREaWN0fX0pO1NrLmJ1aWx0aW4uc3RhdGljbWV0aG9kPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJzdGF0aWNtZXRob2RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5zbSRjYWxsYWJsZT1hO3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdH0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJG5ldzpTay5nZW5lcmljLm5ldyxcbnRwJGluaXQoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic3RhdGljbWV0aG9kXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic3RhdGljbWV0aG9kXCIsYSwxLDEpO3RoaXMuc20kY2FsbGFibGU9YVswXX0sdHAkZG9jOlwic3RhdGljbWV0aG9kKGZ1bmN0aW9uKSAtPiBtZXRob2RcXG5cXG5Db252ZXJ0IGEgZnVuY3Rpb24gdG8gYmUgYSBzdGF0aWMgbWV0aG9kLlxcblxcbkEgc3RhdGljIG1ldGhvZCBkb2VzIG5vdCByZWNlaXZlIGFuIGltcGxpY2l0IGZpcnN0IGFyZ3VtZW50LlxcblRvIGRlY2xhcmUgYSBzdGF0aWMgbWV0aG9kLCB1c2UgdGhpcyBpZGlvbTpcXG5cXG4gICAgIGNsYXNzIEM6XFxuICAgICAgICAgQHN0YXRpY21ldGhvZFxcbiAgICAgICAgIGRlZiBmKGFyZzEsIGFyZzIsIC4uLik6XFxuICAgICAgICAgICAgIC4uLlxcblxcbkl0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIG9uIHRoZSBjbGFzcyAoZS5nLiBDLmYoKSkgb3Igb24gYW4gaW5zdGFuY2VcXG4oZS5nLiBDKCkuZigpKS4gIFRoZSBpbnN0YW5jZSBpcyBpZ25vcmVkIGV4Y2VwdCBmb3IgaXRzIGNsYXNzLlxcblxcblN0YXRpYyBtZXRob2RzIGluIFB5dGhvbiBhcmUgc2ltaWxhciB0byB0aG9zZSBmb3VuZCBpbiBKYXZhIG9yIEMrKy5cXG5Gb3IgYSBtb3JlIGFkdmFuY2VkIGNvbmNlcHQsIHNlZSB0aGUgY2xhc3NtZXRob2QgYnVpbHRpbi5cIixcbnRwJGRlc2NyX2dldChhLGMpe2lmKHZvaWQgMD09PXRoaXMuc20kY2FsbGFibGUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKFwidW5pbml0aWFsaXplZCBzdGF0aWNtZXRob2Qgb2JqZWN0XCIpO3JldHVybiB0aGlzLnNtJGNhbGxhYmxlfX0sZ2V0c2V0czp7X19mdW5jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5zbSRjYWxsYWJsZX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH19KX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBlPXRoaXMudjtjPWMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGUmJlwibnVtYmVyXCI9PT10eXBlb2YgYyl7Y29uc3QgYj1hKGUsYyk7aWYoZChiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX1lPW4oZSk7Yz1uKGMpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIoZSxjKSl9cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1cbmZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xyl7bGV0IGQ9dGhpcy52O2M9Yy52O2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZCYmXCJudW1iZXJcIj09PXR5cGVvZiBjKXJldHVybiBhKGQsYyk7ZD1uKGQpO2M9bihjKTtyZXR1cm4gYihkLGMpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19ZnVuY3Rpb24gYihhLGIpe3JldHVybiBmdW5jdGlvbigpe2NvbnN0IGM9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYz9uZXcgU2suYnVpbHRpbi5pbnRfKGEoYykpOm5ldyBTay5idWlsdGluLmludF8oYihjKSl9fWZ1bmN0aW9uIGUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnYpfWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xyl7bGV0IGQ9dGhpcy52O2M9Yy52O2lmKDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yKFwiaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1wiKTtcbmlmKFwibnVtYmVyXCI9PT10eXBlb2YgZCYmXCJudW1iZXJcIj09PXR5cGVvZiBjKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEoZCxjKSk7ZD1uKGQpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLm51bWJlcklmU2FmZShiKGQsYykpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGwoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xyl7bGV0IGQ9dGhpcy52O2M9Yy52O2lmKDA9PT1kKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMudik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBjKXtpZigwPmMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5lZ2F0aXZlIHNoaWZ0IGNvdW50XCIpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZCl7Y29uc3QgYj1hKGQsYyk7aWYodm9pZCAwIT09YilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX1jPUpTQkkuQmlnSW50KGMpfWVsc2UgaWYoSlNCSS5sZXNzVGhhbihKU0JJLkJpZ0ludCgwKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5lZ2F0aXZlIHNoaWZ0IGNvdW50XCIpO1xuZD1uKGQpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIoZCxjKSl9cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe3ZhciBkPXRoaXMudjtjPWMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gZD1hKGQsYyksMD5kJiYoZCs9NDI5NDk2NzI5NiksbmV3IFNrLmJ1aWx0aW4uaW50XyhkKTtkPW4oZCk7Yz1uKGMpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkubnVtYmVySWZTYWZlKGIoZCxjKSkpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19ZnVuY3Rpb24gZChhKXtyZXR1cm4gYTw9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVImJmE+PS1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1mdW5jdGlvbiBnKGEpe3JldHVybiBhPD1cbk51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZhPj0tTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI/K2E6SlNCSS5CaWdJbnQoYSl9ZnVuY3Rpb24gbihhKXtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGE/SlNCSS5CaWdJbnQoYSk6YX1Tay5idWlsdGluLmludF89U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImludFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfLFwiYmFkIGNhbGwgdG8gaW50IHVzZSAnbmV3J1wiKTtsZXQgYjtpZihcIm51bWJlclwiPT09dHlwZW9mIGF8fEpTQkkuX19pc0JpZ0ludChhKSliPWE7ZWxzZSBpZih2b2lkIDA9PT1hKWI9MDtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSliPWcoYSk7ZWxzZXtpZihhLm5iJGludClyZXR1cm4gYS5uYiRpbnQoKTtTay5hc3NlcnRzLmZhaWwoXCJiYWQgYXJndW1lbnQgdG8gaW50IGNvbnN0cnVjdG9yXCIpfXRoaXMudj1ifSxzbG90czp7dHAkYXNfbnVtYmVyOiEwLFxudHAkZG9jOlwiaW50KHg9MCkgLT4gaW50ZWdlclxcbmludCh4LCBiYXNlPTEwKSAtPiBpbnRlZ2VyXFxuXFxuQ29udmVydCBhIG51bWJlciBvciBzdHJpbmcgdG8gYW4gaW50ZWdlciwgb3IgcmV0dXJuIDAgaWYgbm8gYXJndW1lbnRzXFxuYXJlIGdpdmVuLiAgSWYgeCBpcyBhIG51bWJlciwgcmV0dXJuIHguX19pbnRfXygpLiAgRm9yIGZsb2F0aW5nIHBvaW50XFxubnVtYmVycywgdGhpcyB0cnVuY2F0ZXMgdG93YXJkcyB6ZXJvLlxcblxcbklmIHggaXMgbm90IGEgbnVtYmVyIG9yIGlmIGJhc2UgaXMgZ2l2ZW4sIHRoZW4geCBtdXN0IGJlIGEgc3RyaW5nLFxcbmJ5dGVzLCBvciBieXRlYXJyYXkgaW5zdGFuY2UgcmVwcmVzZW50aW5nIGFuIGludGVnZXIgbGl0ZXJhbCBpbiB0aGVcXG5naXZlbiBiYXNlLiAgVGhlIGxpdGVyYWwgY2FuIGJlIHByZWNlZGVkIGJ5ICcrJyBvciAnLScgYW5kIGJlIHN1cnJvdW5kZWRcXG5ieSB3aGl0ZXNwYWNlLiAgVGhlIGJhc2UgZGVmYXVsdHMgdG8gMTAuICBWYWxpZCBiYXNlcyBhcmUgMCBhbmQgMi0zNi5cXG5CYXNlIDAgbWVhbnMgdG8gaW50ZXJwcmV0IHRoZSBiYXNlIGZyb20gdGhlIHN0cmluZyBhcyBhbiBpbnRlZ2VyIGxpdGVyYWwuXFxuPj4+IGludCgnMGIxMDAnLCBiYXNlPTApXFxuNFwiLFxuJHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b1N0cmluZygpKX0sdHAkaGFzaCgpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT9hOkpTQkkudG9OdW1iZXIoSlNCSS5yZW1haW5kZXIoYSxKU0JJLl9fTUFYX1NBRkUpKX0sdHAkbmV3KGEsYil7MT09PWEubGVuZ3RoKyhiP2IubGVuZ3RoOjApPyhiPWFbMF0sYT1Tay5idWlsdGluLm5vbmUubm9uZSQpOihhPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiaW50XCIsW251bGwsXCJiYXNlXCJdLGEsYixbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdKSxiPWFbMF0sYT1hWzFdKTthPWEhPT1Tay5idWlsdGluLm5vbmUubm9uZSQ/U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSk6bnVsbDtpZihiIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpbnVsbD09PWEmJihhPTEwKSxiPW5ldyBTay5idWlsdGluLmludF8oU2suc3RyMm51bWJlcihiLnYsXG5hKSk7ZWxzZXtpZihudWxsIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpbnQoKSBjYW4ndCBjb252ZXJ0IG5vbi1zdHJpbmcgd2l0aCBleHBsaWNpdCBiYXNlXCIpO2lmKGIubmIkaW50KWI9Yi5uYiRpbnQoKTtlbHNlIGlmKGE9U2suYWJzdHIubG9va3VwU3BlY2lhbChiLFNrLmJ1aWx0aW4uc3RyLiR0cnVuYykpe2E9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW10pO2lmKCFTay5idWlsdGluLmNoZWNrSW50KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihTay5idWlsdGluLnN0ci4kdHJ1bmMuJGpzc3RyKCkrXCIgcmV0dXJuZWQgbm9uLUludGVncmFsICh0eXBlIFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1wiKVwiKTtiPW5ldyBTay5idWlsdGluLmludF8oYS52KX1lbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImludCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIGEgYnl0ZXMtbGlrZSBvYmplY3Qgb3IgYSBudW1iZXIsIG5vdCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShiKStcIidcIik7fWlmKHRoaXM9PT1Tay5idWlsdGluLmludF8ucHJvdG90eXBlKXJldHVybiBiO2E9bmV3IHRoaXMuY29uc3RydWN0b3I7YS52PWIudjtyZXR1cm4gYX0sdHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsb2IkZXE6YygoYSxiKT0+YT09YixKU0JJLmVxdWFsKSxvYiRuZTpjKChhLGIpPT5hIT1iLEpTQkkubm90RXF1YWwpLG9iJGd0OmMoKGEsYik9PmE+YixKU0JJLmdyZWF0ZXJUaGFuKSxvYiRnZTpjKChhLGIpPT5hPj1iLEpTQkkuZ3JlYXRlclRoYW5PckVxdWFsKSxvYiRsdDpjKChhLGIpPT5hPGIsSlNCSS5sZXNzVGhhbiksb2IkbGU6YygoYSxiKT0+YTw9YixKU0JJLmxlc3NUaGFuT3JFcXVhbCksbmIkaW50OmUsbmIkaW5kZXgoKXtyZXR1cm4gdGhpcy52fSxuYiRmbG9hdCgpe3ZhciBhPXRoaXMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKTthPXBhcnNlRmxvYXQoSlNCSS50b051bWJlcihhKSk7XG5pZihJbmZpbml0eT09PWF8fC1JbmZpbml0eT09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcImludCB0b28gbGFyZ2UgdG8gY29udmVydCB0byBmbG9hdFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfSxuYiRpc25lZ2F0aXZlKCl7Y29uc3QgYT10aGlzLnY7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhPzA+YTpKU0JJLmxlc3NUaGFuKGEsSlNCSS5fX1pFUk8pfSxuYiRpc3Bvc2l0aXZlKCl7Y29uc3QgYT10aGlzLnY7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhPzA+YTpKU0JJLmdyZWF0ZXJUaGFuT3JFcXVhbChhLEpTQkkuX19aRVJPKX0sbmIkYm9vbCgpe3JldHVybiAwIT09dGhpcy52fSxuYiRwb3NpdGl2ZTplLG5iJG5lZ2F0aXZlOmIoYT0+LWEsSlNCSS51bmFyeU1pbnVzKSxuYiRhZGQ6YSgoYSxiKT0+YStiLChhLGIpPT5KU0JJLm51bWJlcklmU2FmZShKU0JJLmFkZChhLGIpKSksbmIkc3VidHJhY3Q6YSgoYSxiKT0+YS1iLChhLGIpPT5cbkpTQkkubnVtYmVySWZTYWZlKEpTQkkuc3VidHJhY3QoYSxiKSkpLG5iJG11bHRpcGx5OmEoKGEsYik9PmEqYixKU0JJLm11bHRpcGx5KSxuYiRkaXZpZGUoYSl7cmV0dXJuIFNrLl9fZnV0dXJlX18uZGl2aXNpb24/dGhpcy5uYiRmbG9hdCgpLm5iJGRpdmlkZShhKTp0aGlzLm5iJGZsb29yX2RpdmlkZShhKX0sbmIkZmxvb3JfZGl2aWRlOmYoKGEsYik9Pk1hdGguZmxvb3IoYS9iKSxKU0JJLmRpdmlkZSksbmIkcmVtYWluZGVyOmYoKGEsYik9PmEtTWF0aC5mbG9vcihhL2IpKmIsSlNCSS5yZW1haW5kZXIpLG5iJGRpdm1vZChhKXtjb25zdCBiPXRoaXMubmIkZmxvb3JfZGl2aWRlKGEpO2E9dGhpcy5uYiRyZW1haW5kZXIoYSk7cmV0dXJuIGI9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJHx8YT09PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkP1NrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkOm5ldyBTay5idWlsdGluLnR1cGxlKFtiLFxuYV0pfSxuYiRhbmQ6aCgoYSxiKT0+YSZiLEpTQkkuYml0d2lzZUFuZCksbmIkb3I6aCgoYSxiKT0+YXxiLEpTQkkuYml0d2lzZU9yKSxuYiR4b3I6aCgoYSxiKT0+YV5iLEpTQkkuYml0d2lzZVhvciksbmIkYWJzOmIoTWF0aC5hYnMsYT0+SlNCSS5sZXNzVGhhbihhLEpTQkkuX19aRVJPKT9KU0JJLnVuYXJ5TWludXMoYSk6YSksbmIkbHNoaWZ0OmwoKGEsYik9PntpZig1Mz5iJiYoYT0yKmEqcFtiXSxkKGEpKSlyZXR1cm4gYX0sSlNCSS5sZWZ0U2hpZnQpLG5iJHJzaGlmdDpsKChhLGIpPT57Y29uc3QgYz1hPj5iO3JldHVybiAwPGEmJjA+Yz9jJk1hdGgucG93KDIsMzItYiktMTpjfSwoYSxiKT0+SlNCSS5udW1iZXJJZlNhZmUoSlNCSS5zaWduZWRSaWdodFNoaWZ0KGEsYikpKSxuYiRpbnZlcnQ6YihhPT5+YSxKU0JJLmJpdHdpc2VOb3QpLG5iJHBvd2VyKGEsYil7bGV0IGM7dm9pZCAwIT09YiYmU2suYnVpbHRpbi5jaGVja05vbmUoYikmJihiPXZvaWQgMCk7aWYoYSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLmludF8mJih2b2lkIDA9PT1ifHxiIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKSl7bGV0IGU9dGhpcy52LGY9YS52O2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZSYmXCJudW1iZXJcIj09PXR5cGVvZiBmKXtjb25zdCBhPU1hdGgucG93KGUsZik7aWYoZChhKSYmKGM9MD5mP25ldyBTay5idWlsdGluLmZsb2F0XyhhKTpuZXcgU2suYnVpbHRpbi5pbnRfKGEpLHZvaWQgMD09PWIpKXJldHVybiBjfWlmKHZvaWQgMCE9PWIpe2lmKGEubmIkaXNuZWdhdGl2ZSgpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJwb3coKSAybmQgYXJndW1lbnQgY2Fubm90IGJlIG5lZ2F0aXZlIHdoZW4gM3JkIGFyZ3VtZW50IHNwZWNpZmllZFwiKTtpZigwPT09Yi52KXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJwb3coKSAzcmQgYXJndW1lbnQgY2Fubm90IGJlIDBcIik7cmV0dXJuIHZvaWQgMCE9PWM/Yy5uYiRyZW1haW5kZXIoYik6bmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLnBvd2VybW9kKG4oZSksXG5uKGYpLG4oYi52KSkpfXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkuZXhwb25lbnRpYXRlKG4oZSksbihmKSkpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH0sbmIkbG9uZygpe3JldHVybiBuZXcgU2suYnVpbHRpbi5sbmcodGhpcy52KX19LGdldHNldHM6e3JlYWw6eyRnZXQ6ZSwkZG9jOlwidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyXCJ9LGltYWc6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XygwKX0sJGRvYzpcInRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyXCJ9fSxtZXRob2RzOntjb25qdWdhdGU6eyRtZXRoOmUsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybnMgc2VsZiwgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGFueSBpbnQuXCJ9LGJpdF9sZW5ndGg6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oU2suYnVpbHRpbi5iaW4odGhpcykuc3EkbGVuZ3RoKCktXG4yKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJOdW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVwcmVzZW50IHNlbGYgaW4gYmluYXJ5Llxcblxcbj4+PiBiaW4oMzcpXFxuJzBiMTAwMTAxJ1xcbj4+PiAoMzcpLmJpdF9sZW5ndGgoKVxcbjZcIn0sdG9fYnl0ZXM6eyRtZXRoKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XCIpO30sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGxlbmd0aCwgYnl0ZW9yZGVyLCAqLCBzaWduZWQ9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhbiBhcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYW4gaW50ZWdlci5cXG5cXG4gIGxlbmd0aFxcbiAgICBMZW5ndGggb2YgYnl0ZXMgb2JqZWN0IHRvIHVzZS4gIEFuIE92ZXJmbG93RXJyb3IgaXMgcmFpc2VkIGlmIHRoZVxcbiAgICBpbnRlZ2VyIGlzIG5vdCByZXByZXNlbnRhYmxlIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcy5cXG4gIGJ5dGVvcmRlclxcbiAgICBUaGUgYnl0ZSBvcmRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgaW50ZWdlci4gIElmIGJ5dGVvcmRlciBpcyAnYmlnJyxcXG4gICAgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBieXRlIGFycmF5LiAgSWZcXG4gICAgYnl0ZW9yZGVyIGlzICdsaXR0bGUnLCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGlzIGF0IHRoZSBlbmQgb2YgdGhlXFxuICAgIGJ5dGUgYXJyYXkuICBUbyByZXF1ZXN0IHRoZSBuYXRpdmUgYnl0ZSBvcmRlciBvZiB0aGUgaG9zdCBzeXN0ZW0sIHVzZVxcbiAgICBgc3lzLmJ5dGVvcmRlcicgYXMgdGhlIGJ5dGUgb3JkZXIgdmFsdWUuXFxuICBzaWduZWRcXG4gICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHR3bydzIGNvbXBsZW1lbnQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGludGVnZXIuXFxuICAgIElmIHNpZ25lZCBpcyBGYWxzZSBhbmQgYSBuZWdhdGl2ZSBpbnRlZ2VyIGlzIGdpdmVuLCBhbiBPdmVyZmxvd0Vycm9yXFxuICAgIGlzIHJhaXNlZC5cIn0sXG5fX3RydW5jX186eyRtZXRoOmUsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlRydW5jYXRpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuXCJ9LF9fZmxvb3JfXzp7JG1ldGg6ZSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRmxvb3JpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuXCJ9LF9fY2VpbF9fOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJDZWlsaW5nIG9mIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlwifSxfX3JvdW5kX186eyRtZXRoKGEpe3JldHVybiB0aGlzLnJvdW5kJChhKX0sJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSb3VuZGluZyBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi5cXG5Sb3VuZGluZyB3aXRoIGFuIG5kaWdpdHMgYXJndW1lbnQgYWxzbyByZXR1cm5zIGFuIGludGVnZXIuXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnYpXSl9LFxuJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6U2suYnVpbHRpbi5ub25lLm5vbmUkfSxfX2Zvcm1hdF9fOnskbWV0aDpTay5mb3JtYXR0aW5nLm1rTnVtYmVyX19mb3JtYXRfXyghMSksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBmb3JtYXRfc3BlYywgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LHByb3RvOntzdHIkKGEsYil7YT12b2lkIDA9PT1hfHwxMD09PWE/dGhpcy52LnRvU3RyaW5nKCk6dGhpcy52LnRvU3RyaW5nKGEpO2J8fHZvaWQgMD09PWJ8fFwiLVwiPT09YVswXSYmKGE9YS5zdWJzdHJpbmcoMSkpO3JldHVybiBhfSxyb3VuZCQoYSl7YT12b2lkIDA9PT1hPzA6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpO3ZhciBiPXRoaXMudixjPU1hdGgucG93KDEwLC1hKTtpZigwPGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBiJiZTay5fX2Z1dHVyZV9fLmJhbmtlcnNfcm91bmRpbmcpcmV0dXJuIGE9XG5iL2MsYj1NYXRoLnJvdW5kKGEpLG5ldyBTay5idWlsdGluLmludF8oKC41PT09KDA8YT9hOi1hKSUxPzA9PT1iJTI/YjpiLTE6YikqYyk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBiKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKE1hdGgucm91bmQoYi9jKSpjKTt7Yz1KU0JJLkJpZ0ludCgxMCpjKTthPUpTQkkuQmlnSW50KDEwKTtiPUpTQkkuZGl2aWRlKGIsYyk7Y29uc3QgZD1KU0JJLmRpdmlkZShiLGEpLGU9SlNCSS5zdWJ0cmFjdChiLEpTQkkubXVsdGlwbHkoYSxkKSk7NT5KU0JJLnRvTnVtYmVyKGUpP2I9SlNCSS5tdWx0aXBseShKU0JJLm11bHRpcGx5KGQsYSksYyk6SlNCSS5tdWx0aXBseShKU0JJLm11bHRpcGx5KEpTQkkuYWRkKGQsSlNCSS5CaWdJbnQoMSksYSksYykpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5pbnRfXCIsU2suYnVpbHRpbi5pbnRfKTtjb25zdCBrPS9fKD89W15fXSkvZztTay5zdHIybnVtYmVyPVxuZnVuY3Rpb24oYSxiKXt2YXIgYz1hLGU9ITEsZjthPWEucmVwbGFjZSgvXlxccyt8XFxzKyQvZyxcIlwiKTtcIi1cIj09PWEuY2hhckF0KDApJiYoZT0hMCxhPWEuc3Vic3RyaW5nKDEpKTtcIitcIj09PWEuY2hhckF0KDApJiYoYT1hLnN1YnN0cmluZygxKSk7aWYobnVsbD09PWJ8fHZvaWQgMD09PWIpYj0xMDtpZigoMj5ifHwzNjxiKSYmMCE9PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludCgpIGJhc2UgbXVzdCBiZSA+PSAyIGFuZCA8PSAzNlwiKTtcInN0cmluZ1wiPT09dHlwZW9mIGImJihiPU51bWJlcihiKSk7aWYoXCIweFwiPT09YS5zdWJzdHJpbmcoMCwyKS50b0xvd2VyQ2FzZSgpKWlmKDE2PT09Ynx8MD09PWIpYT1hLnN1YnN0cmluZygyKSxiPTE2O2Vsc2V7aWYoMzQ+Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO31lbHNlIGlmKFwiMGJcIj09PWEuc3Vic3RyaW5nKDAsXG4yKS50b0xvd2VyQ2FzZSgpKWlmKDI9PT1ifHwwPT09YilhPWEuc3Vic3RyaW5nKDIpLGI9MjtlbHNle2lmKDEyPmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBvXCI9PT1hLnN1YnN0cmluZygwLDIpLnRvTG93ZXJDYXNlKCkpaWYoOD09PWJ8fDA9PT1iKWE9YS5zdWJzdHJpbmcoMiksYj04O2Vsc2V7aWYoMjU+Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO31lbHNlIGlmKFwiMFwiPT09YS5jaGFyQXQoMCkpe2lmKFwiMFwiPT09YSlyZXR1cm4gMDtpZig4PT09Ynx8MD09PWIpYj04fTA9PT1iJiYoYj0xMCk7aWYoLTEhPT1hLmluZGV4T2YoXCJfXCIpKXtpZigtMSE9PWEuaW5kZXhPZihcIl9fXCIpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitcbmIrXCI6ICdcIitjK1wiJ1wiKTthPTEwIT09Yj9hLnJlcGxhY2UoayxcIlwiKTphLmNoYXJBdCgwKSthLnN1YnN0cmluZygxKS5yZXBsYWNlKGssXCJcIil9aWYoMD09PWEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7Zm9yKGY9MDtmPGEubGVuZ3RoO2YrPTEpe3ZhciBnPWEuY2hhckNvZGVBdChmKTt2YXIgaD1iOzQ4PD1nJiY1Nz49Zz9oPWctNDg6NjU8PWcmJjkwPj1nP2g9Zy02NSsxMDo5Nzw9ZyYmMTIyPj1nJiYoaD1nLTk3KzEwKTtpZihoPj1iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7fWUmJihhPVwiLVwiK2EpO2g9cGFyc2VJbnQoYSxiKTtpZihkKGgpKXJldHVybiBoO2M9ITE7XCItXCI9PT1hWzBdJiYoYz0hMCxhPWEuc3Vic3RyaW5nKDEpKTtiPUpTQkkuQmlnSW50KGIpO1xuZT1KU0JJLkJpZ0ludCgxKTtmPUpTQkkuQmlnSW50KDApO2ZvcihnPWEubGVuZ3RoLTE7MDw9ZztnLS0paD1hLmNoYXJDb2RlQXQoZyksNDg8PWgmJjU3Pj1oP2gtPTQ4OjY1PD1oJiY5MD49aD9oPWgtNjUrMTA6OTc8PWgmJjEyMj49aCYmKGg9aC05NysxMCksaD1KU0JJLm11bHRpcGx5KEpTQkkuQmlnSW50KGgpLGUpLGY9SlNCSS5hZGQoZixoKSxlPUpTQkkubXVsdGlwbHkoZSxiKTtjJiYoZj1KU0JJLm11bHRpcGx5KGYsSlNCSS5CaWdJbnQoLTEpKSk7cmV0dXJuIGE9Zn07U2suYnVpbHRpbi5pbnRfLnB5MiRtZXRob2RzPXt9O1NrLmxvbmdGcm9tU3RyPWZ1bmN0aW9uKGEsYil7aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGcoYSkpO2E9U2suc3RyMm51bWJlcihhLGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5sbmcoYSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmxvbmdGcm9tU3RyXCIsU2subG9uZ0Zyb21TdHIpO1NrLmJ1aWx0aW4uaW50Xy53aXRoaW5UaHJlc2hvbGQ9XG5kO1NrLmJ1aWx0aW4uaW50Xy5zdHJpbmdUb051bWJlck9yQmlnPWc7Y29uc3QgcD1bLjUsMSwyLDQsOCwxNiwzMiw2NCwxMjgsMjU2LDUxMiwxMDI0LDIwNDgsNDA5Niw4MTkyLDE2Mzg0LDMyNzY4LDY1NTM2LDEzMTA3MiwyNjIxNDQsNTI0Mjg4LDEwNDg1NzYsMjA5NzE1Miw0MTk0MzA0LDgzODg2MDgsMTY3NzcyMTYsMzM1NTQ0MzIsNjcxMDg4NjQsMTM0MjE3NzI4LDI2ODQzNTQ1Niw1MzY4NzA5MTIsMTA3Mzc0MTgyNCwyMTQ3NDgzNjQ4LDQyOTQ5NjcyOTYsODU4OTkzNDU5MiwxNzE3OTg2OTE4NCwzNDM1OTczODM2OCw2ODcxOTQ3NjczNiwxMzc0Mzg5NTM0NzIsMjc0ODc3OTA2OTQ0LDU0OTc1NTgxMzg4OCwxMDk5NTExNjI3Nzc2LDIxOTkwMjMyNTU1NTIsNDM5ODA0NjUxMTEwNCw4Nzk2MDkzMDIyMjA4LDE3NTkyMTg2MDQ0NDE2LDM1MTg0MzcyMDg4ODMyLDcwMzY4NzQ0MTc3NjY0LDB4ODAwMDAwMDAwMDAwLDI4MTQ3NDk3NjcxMDY1Niw1NjI5NDk5NTM0MjEzMTIsMHg0MDAwMDAwMDAwMDAwLFxuMHg4MDAwMDAwMDAwMDAwLDQ1MDM1OTk2MjczNzA0OTYsOTAwNzE5OTI1NDc0MDk5Ml07U2suYnVpbHRpbi5sbmc9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImxvbmdcIix7YmFzZTpTay5idWlsdGluLmludF8sY29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5pbnRfLmNhbGwodGhpcyxhKX0sc2xvdHM6eyRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKStcIkxcIil9LHRwJGFzX251bWJlcjohMCxuYiRuZWdhdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5sbmcodS5uYiRuZWdhdGl2ZS5jYWxsKHRoaXMpLnYpfSxuYiRwb3NpdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5sbmcodS5uYiRwb3NpdGl2ZS5jYWxsKHRoaXMpLnYpfX19KTtjb25zdCB1PVNrLmJ1aWx0aW4uaW50Xy5wcm90b3R5cGV9LGZ1bmN0aW9uKG0scSl7Y29uc3QgYT1Tay5idWlsdGluLmludF8ucHJvdG90eXBlO1NrLmJ1aWx0aW4uYm9vbD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiYm9vbFwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5pc1RydWUoYSk/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9LGJhc2U6U2suYnVpbHRpbi5pbnRfLHNsb3RzOnt0cCRkb2M6XCJib29sKHgpIC0+IGJvb2xcXG5cXG5SZXR1cm5zIFRydWUgd2hlbiB0aGUgYXJndW1lbnQgeCBpcyB0cnVlLCBGYWxzZSBvdGhlcndpc2UuXFxuVGhlIGJ1aWx0aW5zIFRydWUgYW5kIEZhbHNlIGFyZSB0aGUgb25seSB0d28gaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBib29sLlxcblRoZSBjbGFzcyBib29sIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGNsYXNzIGludCwgYW5kIGNhbm5vdCBiZSBzdWJjbGFzc2VkLlwiLHRwJG5ldyhhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJib29sXCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwiYm9vbFwiLGEsMCwxKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChhWzBdKX0sJHIoKXtyZXR1cm4gdGhpcy52P3RoaXMuc3RyJFRydWU6XG50aGlzLnN0ciRGYWxzZX0sdHAkYXNfbnVtYmVyOiEwLG5iJGFuZChjKXtyZXR1cm4gYy5vYiR0eXBlPT09U2suYnVpbHRpbi5ib29sP25ldyBTay5idWlsdGluLmJvb2wodGhpcy52JmMudik6YS5uYiRhbmQuY2FsbCh0aGlzLGMpfSxuYiRvcihjKXtyZXR1cm4gYy5vYiR0eXBlPT09U2suYnVpbHRpbi5ib29sP25ldyBTay5idWlsdGluLmJvb2wodGhpcy52fGMudik6YS5uYiRvci5jYWxsKHRoaXMsYyl9LG5iJHhvcihjKXtyZXR1cm4gYy5vYiR0eXBlPT09U2suYnVpbHRpbi5ib29sP25ldyBTay5idWlsdGluLmJvb2wodGhpcy52XmMudik6YS5uYiR4b3IuY2FsbCh0aGlzLGMpfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX0sbWV0aG9kczp7X19mb3JtYXRfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kcigpfSwkZmxhZ3M6e09uZUFyZzohMH19fSxwcm90bzp7c3RyJEZhbHNlOm5ldyBTay5idWlsdGluLnN0cihcIkZhbHNlXCIpLHN0ciRUcnVlOm5ldyBTay5idWlsdGluLnN0cihcIlRydWVcIil9fSk7XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmJvb2xcIixTay5idWlsdGluLmJvb2wpO1NrLmJ1aWx0aW4uYm9vbC50cnVlJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4uYm9vbC5wcm90b3R5cGUse3Y6e3ZhbHVlOjEsZW51bWVyYWJsZTohMH19KTtTay5idWlsdGluLmJvb2wuZmFsc2UkPU9iamVjdC5jcmVhdGUoU2suYnVpbHRpbi5ib29sLnByb3RvdHlwZSx7djp7dmFsdWU6MCxlbnVtZXJhYmxlOiEwfX0pfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMudil9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7Y29uc3QgYz10aGlzLnY7Yj1iLnY7aWYoXCJudW1iZXJcIiE9PXR5cGVvZiBiKWlmKEpTQkkuX19pc0JpZ0ludChiKSl7aWYoYj1wYXJzZUZsb2F0KEpTQkkudG9OdW1iZXIoYikpLEluZmluaXR5PT1ifHwtSW5maW5pdHk9PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcImludCB0b28gbGFyZ2UgdG8gY29udmVydCB0byBmbG9hdFwiKTtcbn1lbHNlIHJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtyZXR1cm4gYShjLGIpfX1mdW5jdGlvbiBiKGEpe2NvbnN0IGI9YyhhKTtyZXR1cm4gZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jJiYhU2suYnVpbHRpbi5jaGVja05vbmUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwicG93KCkgM3JkIGFyZ3VtZW50IG5vdCBhbGxvd2VkIHVubGVzcyBhbGwgYXJndW1lbnRzIGFyZSBpbnRlZ2Vyc1wiKTtyZXR1cm4gYi5jYWxsKHRoaXMsYSl9fWZ1bmN0aW9uIGUoYSxiKXtpZigwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7cmV0dXJuIEluZmluaXR5PT09YT9JbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik6MD5iP25ldyBTay5idWlsdGluLmZsb2F0XygtSW5maW5pdHkpOm5ldyBTay5idWlsdGluLmZsb2F0XyhJbmZpbml0eSk6XG4tSW5maW5pdHk9PT1hP0luZmluaXR5PT09Ynx8LUluZmluaXR5PT09YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oTmFOKTowPmI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKEluZmluaXR5KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oLUluZmluaXR5KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYS9iKX1mdW5jdGlvbiBmKGEsYil7aWYoSW5maW5pdHk9PT1hfHwtSW5maW5pdHk9PT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oTmFOKTtpZigwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7cmV0dXJuIEluZmluaXR5PT09Yj8wPmE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0xKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMCk6LUluZmluaXR5PT09Yj8wPmF8fDAhPT1hP25ldyBTay5idWlsdGluLmZsb2F0XygwKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oLTEpOm5ldyBTay5idWlsdGluLmZsb2F0XyhNYXRoLmZsb29yKGEvXG5iKSl9ZnVuY3Rpb24gbChhLGIpe2lmKDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yKFwiaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1wiKTtpZigwPT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApO2lmKEluZmluaXR5PT09YilyZXR1cm4gSW5maW5pdHk9PT1hfHwtSW5maW5pdHk9PT10aGlzLnY/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik6MDxhP25ldyBTay5idWlsdGluLmZsb2F0XyhhKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oSW5maW5pdHkpO2xldCBjPWElYjswPmE/MDxiJiYwPmMmJihjKz1iKTowPmImJjAhPT1jJiYoYys9Yik7MD09PWMmJigwPmI/Yz0tMDotSW5maW5pdHk9PT1JbmZpbml0eS9jJiYoYz0wKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX1mdW5jdGlvbiBoKGEsYil7aWYoMD5hJiYwIT09YiUxKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBudW1iZXIgY2Fubm90IGJlIHJhaXNlZCB0byBhIGZyYWN0aW9uYWwgcG93ZXJcIik7XG5pZigwPT09YSYmMD5iKXRocm93IG5ldyBTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yKFwiMC4wIGNhbm5vdCBiZSByYWlzZWQgdG8gYSBuZWdhdGl2ZSBwb3dlclwiKTtjb25zdCBjPU1hdGgucG93KGEsYik7aWYoSW5maW5pdHk9PT1NYXRoLmFicyhjKSYmSW5maW5pdHkhPT1NYXRoLmFicyhhKSYmSW5maW5pdHkhPT1NYXRoLmFicyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKFwiTnVtZXJpY2FsIHJlc3VsdCBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX1jb25zdCBkPU9iamVjdC5jcmVhdGUobnVsbCx7SW5maW5pdHk6e3ZhbHVlOjMxNDE1OX0sXCItSW5maW5pdHlcIjp7dmFsdWU6LTMxNDE1OX0sTmFOOnt2YWx1ZTowfX0pO1NrLmJ1aWx0aW4uZmxvYXRfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJmbG9hdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8sXG5cImJhZCBjYWxsIHRvIGZsb2F0IHVzZSAnbmV3J1wiKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpdGhpcy52PWE7ZWxzZSBpZih2b2lkIDA9PT1hKXRoaXMudj0wO2Vsc2UgaWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXRoaXMudj1wYXJzZUZsb2F0KGEpO2Vsc2V7aWYoYS5uYiRmbG9hdClyZXR1cm4gYS5uYiRmbG9hdCgpO1NrLmFzc2VydHMuZmFpbChcImJhZCBhcmd1bWVudCB0byBmbG9hdCBjb25zdHJ1Y3RvclwiKX19LHNsb3RzOnt0cCRnZXR0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfbnVtYmVyOiEwLHRwJGRvYzpcIkNvbnZlcnQgYSBzdHJpbmcgb3IgbnVtYmVyIHRvIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBpZiBwb3NzaWJsZS5cIix0cCRoYXNoKCl7Y29uc3QgYT10aGlzLnY7bGV0IGI9ZFthXTtpZih2b2lkIDAhPT1iKXJldHVybiBiO2I9TnVtYmVyLmlzSW50ZWdlcihhKT90aGlzLm5iJGludCgpLnRwJGhhc2goKTpNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVItXG5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUi8yKTtyZXR1cm4gZFt0aGlzLnZdPWJ9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnN0ciQoMTAsITApKX0sdHAkbmV3KGEsYil7aWYoYiYmYi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZmxvYXQoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50c1wiKTtpZihhJiYxPGEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZsb2F0IGV4cGVjdGVkIGF0IG1vc3QgMSBhcmd1bWVudHMsIGdvdCBcIithLmxlbmd0aCk7YT1hWzBdO2lmKHZvaWQgMD09PWEpdmFyIGM9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApO2Vsc2UgaWYoYS5uYiRmbG9hdCljPWEubmIkZmxvYXQoKTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpe2M9YS52O2E9YztpZigtMSE9PWMuaW5kZXhPZihcIl9cIikpe2lmKGcudGVzdChjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGZsb2F0OiAnXCIrXG5jK1wiJ1wiKTthPWMuY2hhckF0KDApK2Muc3Vic3RyaW5nKDEpLnJlcGxhY2UobixcIlwiKX1pZihjLm1hdGNoKC9eLWluZiQvaSkpdmFyIGQ9LUluZmluaXR5O2Vsc2UgYy5tYXRjaCgvXlsrXT9pbmYkL2kpP2Q9SW5maW5pdHk6Yy5tYXRjaCgvXlstK10/bmFuJC9pKT9kPU5hTjppc05hTihhKXx8KGQ9cGFyc2VGbG9hdChhKSxOdW1iZXIuaXNOYU4oZCkmJihkPXZvaWQgMCkpO2lmKHZvaWQgMD09PWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byBmbG9hdDogXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihuZXcgU2suYnVpbHRpbi5zdHIoYykpKTtjPW5ldyBTay5idWlsdGluLmZsb2F0XyhkKX1pZih2b2lkIDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZsb2F0KCkgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhIG51bWJlclwiKTtpZih0aGlzPT09U2suYnVpbHRpbi5mbG9hdF8ucHJvdG90eXBlKXJldHVybiBjO1xuZD1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtkLnY9Yy52O3JldHVybiBkfSxuYiRpbnQoKXtsZXQgYT10aGlzLnY7YT0wPmE/TWF0aC5jZWlsKGEpOk1hdGguZmxvb3IoYSk7aWYoIU51bWJlci5pc0ludGVnZXIoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNhbm5vdCBjb252ZXJ0IGZsb2F0IFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcykrXCIgdG8gaW50ZWdlclwiKTtyZXR1cm4gU2suYnVpbHRpbi5pbnRfLndpdGhpblRocmVzaG9sZChhKT9uZXcgU2suYnVpbHRpbi5pbnRfKGEpOm5ldyBTay5idWlsdGluLmludF8oSlNCSS5CaWdJbnQoYSkpfSxuYiRmbG9hdDphLG5iJGxvbmcoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHRoaXMubmIkaW50KCkudil9LG5iJGFkZDpjKChhLGIpPT5uZXcgU2suYnVpbHRpbi5mbG9hdF8oYStiKSksbmIkc3VidHJhY3Q6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEtYikpLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpjKChhLFxuYik9Pm5ldyBTay5idWlsdGluLmZsb2F0XyhiLWEpKSxuYiRtdWx0aXBseTpjKChhLGIpPT5uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSpiKSksbmIkZGl2aWRlOmMoZSksbmIkcmVmbGVjdGVkX2RpdmlkZTpjKChhLGIpPT5lKGIsYSkpLG5iJGZsb29yX2RpdmlkZTpjKGYpLG5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGU6YygoYSxiKT0+ZihiLGEpKSxuYiRyZW1haW5kZXI6YyhsKSxuYiRyZWZsZWN0ZWRfcmVtYWluZGVyOmMoKGEsYik9PmwoYixhKSksbmIkZGl2bW9kOmMoKGEsYik9Pm5ldyBTay5idWlsdGluLnR1cGxlKFtmKGEsYiksbChhLGIpXSkpLG5iJHJlZmxlY3RlZF9kaXZtb2Q6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4udHVwbGUoW2YoYixhKSxsKGIsYSldKSksbmIkcG93ZXI6YihoKSxuYiRyZWZsZWN0ZWRfcG93ZXI6YigoYSxiKT0+aChiLGEpKSxuYiRhYnMoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKHRoaXMudikpfSxuYiRuZWdhdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oLXRoaXMudil9LFxubmIkcG9zaXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMudil9LG5iJGJvb2woKXtyZXR1cm4gMCE9PXRoaXMudn0sbmIkaXNuZWdhdGl2ZSgpe3JldHVybiAwPnRoaXMudn0sbmIkaXNwb3NpdGl2ZSgpe3JldHVybiAwPD10aGlzLnZ9LG9iJGVxOmMoKGEsYik9PmE9PWIpLG9iJG5lOmMoKGEsYik9PmEhPWIpLG9iJGd0OmMoKGEsYik9PmE+Yiksb2IkZ2U6YygoYSxiKT0+YT49Yiksb2IkbHQ6YygoYSxiKT0+YTxiKSxvYiRsZTpjKChhLGIpPT5hPD1iKX0sZ2V0c2V0czp7cmVhbDp7JGdldDphLCRkb2M6XCJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn0saW1hZzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oMCl9LCRkb2M6XCJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifX0sbWV0aG9kczp7Y29uanVnYXRlOnskbWV0aDphLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgZmxvYXQuXCJ9LFxuX190cnVuY19fOnskbWV0aCgpe3JldHVybiB0aGlzLm5iJGludCgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgSW50ZWdyYWwgY2xvc2VzdCB0byB4IGJldHdlZW4gMCBhbmQgeC5cIn0sX19yb3VuZF9fOnskbWV0aChhKXtyZXR1cm4gdGhpcy5yb3VuZCQoYSl9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIG5kaWdpdHM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBJbnRlZ3JhbCBjbG9zZXN0IHRvIHgsIHJvdW5kaW5nIGhhbGYgdG93YXJkIGV2ZW4uXFxuXFxuV2hlbiBhbiBhcmd1bWVudCBpcyBwYXNzZWQsIHdvcmsgbGlrZSBidWlsdC1pbiByb3VuZCh4LCBuZGlnaXRzKS5cIn0saXNfaW50ZWdlcjp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChOdW1iZXIuaXNJbnRlZ2VyKHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsXG4kZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIGZsb2F0IGlzIGFuIGludGVnZXIuXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbdGhpc10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9LF9fZm9ybWF0X186eyRtZXRoOlNrLmZvcm1hdHRpbmcubWtOdW1iZXJfX2Zvcm1hdF9fKCEwKSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGZvcm1hdF9zcGVjLCAvKVwiLCRkb2M6U2suYnVpbHRpbi5ub25lLm5vbmUkfX19KTtjb25zdCBnPS9fW2VFXXxbZUVdX3xcXC5ffF9cXC58WystXV98X18vLG49L18oPz1bXl9dKS9nO1NrLmJ1aWx0aW4uZmxvYXRfLlB5RmxvYXRfQ2hlY2s9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/ITE6U2suYnVpbHRpbi5jaGVja051bWJlcihhKXx8U2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxhLm9iJHR5cGUuJGlzU3ViVHlwZShTay5idWlsdGluLmZsb2F0Xyk/XG4hMDohMX07U2suYnVpbHRpbi5mbG9hdF8ucHJvdG90eXBlLnRvRml4ZWQ9ZnVuY3Rpb24oYSl7YT1Tay5idWlsdGluLmFzbnVtJChhKTtyZXR1cm4gdGhpcy52LnRvRml4ZWQoYSl9O1NrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZS5yb3VuZCQ9ZnVuY3Rpb24oYSl7dmFyIGI9U2suYnVpbHRpbi5hc251bSQodGhpcyk7dmFyIGM9dm9pZCAwPT09YT8wOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTtpZihTay5fX2Z1dHVyZV9fLmJhbmtlcnNfcm91bmRpbmcpe2IqPU1hdGgucG93KDEwLGMpO3ZhciBkPU1hdGgucm91bmQoYik7Yz0oLjU9PT0oMDxiP2I6LWIpJTE/MD09PWQlMj9kOmQtMTpkKS9NYXRoLnBvdygxMCxjKTtyZXR1cm4gdm9pZCAwPT09YT9uZXcgU2suYnVpbHRpbi5pbnRfKGMpOm5ldyBTay5idWlsdGluLmZsb2F0XyhjKX1hPU1hdGgucG93KDEwLGMpO2M9TWF0aC5yb3VuZChiKmEpL2E7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX07U2suYnVpbHRpbi5mbG9hdF8ucHJvdG90eXBlLnN0ciQ9XG5mdW5jdGlvbihhLGIpe2lmKGlzTmFOKHRoaXMudikpcmV0dXJuXCJuYW5cIjt2b2lkIDA9PT1iJiYoYj0hMCk7aWYoSW5maW5pdHk9PXRoaXMudilyZXR1cm5cImluZlwiO2lmKC1JbmZpbml0eT09dGhpcy52JiZiKXJldHVyblwiLWluZlwiO2lmKC1JbmZpbml0eT09dGhpcy52JiYhYilyZXR1cm5cImluZlwiO2I9Yj90aGlzLnY6TWF0aC5hYnModGhpcy52KTtpZih2b2lkIDA9PT1hfHwxMD09PWEpe3ZhciBjPVNrLl9fZnV0dXJlX18ucHl0aG9uMz9iLnRvUHJlY2lzaW9uKDE2KTpiLnRvUHJlY2lzaW9uKDEyKTt2YXIgZD1jLmluZGV4T2YoXCIuXCIpO2E9Yi50b1N0cmluZygpLnNsaWNlKDAsZCk7ZD1iLnRvU3RyaW5nKCkuc2xpY2UoZCk7YS5tYXRjaCgvXi0/MCQvKSYmZC5zbGljZSgxKS5tYXRjaCgvXjB7NCx9LykmJihjPTEyPmMubGVuZ3RoP2IudG9FeHBvbmVudGlhbCgpOmIudG9FeHBvbmVudGlhbCgxMSkpO2lmKDA+Yy5pbmRleE9mKFwiZVwiKSYmMDw9Yy5pbmRleE9mKFwiLlwiKSl7Zm9yKDtcIjBcIj09XG5jLmNoYXJBdChjLmxlbmd0aC0xKTspYz1jLnN1YnN0cmluZygwLGMubGVuZ3RoLTEpO1wiLlwiPT1jLmNoYXJBdChjLmxlbmd0aC0xKSYmKGMrPVwiMFwiKX1jPWMucmVwbGFjZSgvXFwuMCtlLyxcImVcIixcImlcIik7Yz1jLnJlcGxhY2UoLyhlWy0rXSkoWzEtOV0pJC8sXCIkMTAkMlwiKTtjPWMucmVwbGFjZSgvMCsoZS4qKS8sXCIkMVwiKX1lbHNlIGM9Yi50b1N0cmluZyhhKTswPT09dGhpcy52JiYtSW5maW5pdHk9PT0xL3RoaXMudiYmKGM9XCItXCIrYyk7MD5jLmluZGV4T2YoXCIuXCIpJiYwPmMuaW5kZXhPZihcIkVcIikmJjA+Yy5pbmRleE9mKFwiZVwiKSYmKGMrPVwiLjBcIik7cmV0dXJuIGN9O1NrLmJ1aWx0aW4uZmxvYXRfLnB5MiRtZXRob2RzPXt9fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSl7bGV0IGI9YS52O2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYilyZXR1cm4gYjthLm5iJGZsb2F0JiYoYj1hLm5iJGZsb2F0KCkpO2lmKHZvaWQgMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYSBmbG9hdCBpcyByZXF1aXJlZFwiKTtcbnJldHVybiBiLnZ9ZnVuY3Rpb24gYyhhLGIsYyl7aWYoYz09PVNrLmJ1aWx0aW4uY29tcGxleC5wcm90b3R5cGUpcmV0dXJuIG5ldyBTay5idWlsdGluLmNvbXBsZXgoYSxiKTtjPW5ldyBjLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4uY29tcGxleC5jYWxsKGMsYSxiKTtyZXR1cm4gY31mdW5jdGlvbiBiKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2NvbnN0IGQ9dGhpcy5yZWFsLGU9dGhpcy5pbWFnO3ZhciBmPWMucmVhbDtjb25zdCBnPWMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGYpYz1jLmltYWc7ZWxzZSBpZihcIm51bWJlclwiPT09dHlwZW9mIGcpZj1nLGM9MDtlbHNlIGlmKEpTQkkuX19pc0JpZ0ludChnKSl7aWYodm9pZCAwPT09Yil7aWYoZj1wYXJzZUZsb2F0KEpTQkkudG9OdW1iZXIoZykpLEluZmluaXR5PT1mfHwtSW5maW5pdHk9PWYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcImludCB0b28gbGFyZ2UgdG8gY29udmVydCB0byBmbG9hdFwiKTt9ZWxzZSBmPVxuZy50b1N0cmluZygpO2M9MH1lbHNlIHJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtyZXR1cm4gYShkLGUsZixjKX19ZnVuY3Rpb24gZShhLGIsYyxkKXt2YXIgZT1NYXRoLmFicyhjKTtjb25zdCBmPU1hdGguYWJzKGQpO2lmKGU+PWYpe2lmKDA9PT1lKXRocm93IG5ldyBTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yKFwiY29tcGxleCBkaXZpc2lvbiBieSB6ZXJvXCIpO2U9ZC9jO2MrPWQqZTtkPShhK2IqZSkvYzthPShiLWEqZSkvY31lbHNlIGY+PWU/KGU9Yy9kLGM9YyplK2QsU2suYXNzZXJ0cy5hc3NlcnQoMCE9PWQpLGQ9KGEqZStiKS9jLGE9KGIqZS1hKS9jKTphPWQ9TmFOO3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KGQsYSl9ZnVuY3Rpb24gZihhLGIsYyxkKXtpZigwPT09YyYmMD09PWQpe2Q9MTt2YXIgZT0wfWVsc2UgaWYoMD09PWEmJjA9PT1iKXtpZigwIT09ZHx8MD5jKXRocm93IG5ldyBTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yKFwiY29tcGxleCBkaXZpc2lvbiBieSB6ZXJvXCIpO1xuZT1kPTB9ZWxzZXtjb25zdCBmPU1hdGguaHlwb3QoYSxiKTtlPU1hdGgucG93KGYsYyk7YT1NYXRoLmF0YW4yKGIsYSk7Yyo9YTswIT09ZCYmKGUvPU1hdGguZXhwKGEqZCksYys9ZCpNYXRoLmxvZyhmKSk7ZD1lKk1hdGguY29zKGMpO2UqPU1hdGguc2luKGMpfXJldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KGQsZSl9ZnVuY3Rpb24gbChhLGIsYyl7bGV0IGQ9MTt2YXIgZT1uZXcgU2suYnVpbHRpbi5jb21wbGV4KDEsMCk7Zm9yKGE9bmV3IFNrLmJ1aWx0aW4uY29tcGxleChhLGIpOzA8ZCYmYz49ZDspYyZkJiYoZT1uZXcgU2suYnVpbHRpbi5jb21wbGV4KGUucmVhbCphLnJlYWwtZS5pbWFnKmEuaW1hZyxlLnJlYWwqYS5pbWFnK2EucmVhbCplLmltYWcpKSxkPDw9MSxhPW5ldyBTay5idWlsdGluLmNvbXBsZXgoYS5yZWFsKmEucmVhbC1hLmltYWcqYS5pbWFnLDIqYS5yZWFsKmEuaW1hZyk7cmV0dXJuIGV9ZnVuY3Rpb24gaChhLGIsYyxkLGUpe2U9ITE7c3dpdGNoKGIpe2Nhc2UgXCJlXCI6Y2FzZSBcImZcIjpjYXNlIFwiZ1wiOmJyZWFrO1xuY2FzZSBcIkVcIjplPSEwO2I9XCJlXCI7YnJlYWs7Y2FzZSBcIkZcIjplPSEwO2I9XCJmXCI7YnJlYWs7Y2FzZSBcInJcIjppZigwIT09Yyl0aHJvdyBFcnJvcihcIkJhZCBpbnRlcm5hbGwgY2FsbFwiKTtjPTE3O2I9XCJnXCI7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihcIkJhZCBpbnRlcm5hbGwgY2FsbFwiKTt9aWYoaXNOYU4oYSkpYT1cIm5hblwiO2Vsc2UgaWYoSW5maW5pdHk9PT1hKWE9XCJpbmZcIjtlbHNlIGlmKC1JbmZpbml0eT09PWEpYT1cIi1pbmZcIjtlbHNle2QmaC5QeV9EVFNGX0FERF9ET1RfMCYmKGI9XCJnXCIpO3ZhciBmPVwiJVwiKyhkJmguUHlfRFRTRl9BTFQ/XCIjXCI6XCJcIik7bnVsbCE9YyYmKGY9ZitcIi5cIitjKTtmPW5ldyBTay5idWlsdGluLnN0cihmK2IpO2E9Zi5uYiRyZW1haW5kZXIobmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpKTthPWEudn1kJmguUHlfRFRTRl9TSUdOJiZcIi1cIiE9PWFbMF0mJihhPVwiK1wiK2EpO2UmJihhPWEudG9VcHBlckNhc2UoKSk7cmV0dXJuIGF9U2suYnVpbHRpbi5jb21wbGV4PVxuU2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImNvbXBsZXhcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5jb21wbGV4LFwiYmFkIGNhbGwgdG8gY29tcGxleCBjb25zdHJ1Y3RvciwgdXNlICduZXcnXCIpO3RoaXMucmVhbD1hO3RoaXMuaW1hZz1ifSxzbG90czp7dHAkYXNfbnVtYmVyOiEwLHRwJGRvYzpcIkNyZWF0ZSBhIGNvbXBsZXggbnVtYmVyIGZyb20gYSByZWFsIHBhcnQgYW5kIGFuIG9wdGlvbmFsIGltYWdpbmFyeSBwYXJ0LlxcblxcblRoaXMgaXMgZXF1aXZhbGVudCB0byAocmVhbCArIGltYWcqMWopIHdoZXJlIGltYWcgZGVmYXVsdHMgdG8gMC5cIix0cCRoYXNoKCl7dmFyIGE9KG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnJlYWwpKS50cCRoYXNoKCk7YT0xMDAzKihuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5pbWFnKSkudHAkaGFzaCgpK2E7cmV0dXJuIFNrLmJ1aWx0aW4uaW50Xy53aXRoaW5UaHJlc2hvbGQoYSk/XG5hOihuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkuQmlnSW50KGEpKSkudHAkaGFzaCgpfSx0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXcoYixlKXtiPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiY29tcGxleFwiLFtcInJlYWxcIixcImltYWdcIl0sYixlLFtudWxsLG51bGxdKTt7dmFyIGY9YlsxXSxnO2xldCBrPWU9ITE7dmFyIGg9YlswXTtpZihudWxsIT1oJiZoLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5jb21wbGV4JiZudWxsPT1mKWU9aDtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoaCkpe2lmKG51bGwhPWYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGxleCgpIGNhbid0IHRha2Ugc2Vjb25kIGFyZyBpZiBmaXJzdCBpcyBhIHN0cmluZ1wiKTtlPVNrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcoaCx0aGlzKX1lbHNle2lmKG51bGwhPWYmJlNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGxleCgpIHNlY29uZCBhcmcgY2FuJ3QgYmUgYSBzdHJpbmdcIik7XG5udWxsPT1oP2I9bnVsbDooYj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGgsU2suYnVpbHRpbi5zdHIuJGNvbXBsZXgpLGI9dm9pZCAwIT09Yj9Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYixbXSk6bnVsbCk7aWYobnVsbCE9YiYmYiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXtpZighZChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2NvbXBsZXhfXyBzaG91bGQgcmV0dXJuIGEgY29tcGxleCBvYmplY3RcIik7aD1ifWlmKG51bGwhPWgmJnZvaWQgMD09PWgubmIkZmxvYXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGxleCgpIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBudW1iZXIsIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoaCkrXCInXCIpO2lmKG51bGwhPWYmJnZvaWQgMD09PWYubmIkZmxvYXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGxleCgpIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyLCBub3QgJ1wiK1xuU2suYWJzdHIudHlwZU5hbWUoaCkrXCInXCIpO251bGw9PWg/aD1iPTA6ZChoKT8oYj1oLnJlYWwsaD1oLmltYWcsZT0hMCk6KGI9YShoKSxoPTApO251bGw9PWY/Zj1nPTA6ZChmKT8oZz1mLnJlYWwsZj1mLmltYWcsaz0hMCk6KGc9YShmKSxmPTApOyEwPT09ayYmKGItPWYpOyEwPT09ZSYmKGcrPWgpO2U9YyhiLGcsdGhpcyl9fXJldHVybiBlfSx0cCRyaWNoY29tcGFyZShhLGMpe2lmKFwiRXFcIiE9PWMmJlwiTm90RXFcIiE9PWMpe2lmKFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSl8fGQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzXCIpO3JldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH1yZXR1cm4gYihmdW5jdGlvbihhLGIsZCxlKXthPWE9PWQmJmI9PWU7cmV0dXJuXCJFcVwiPT09Yz9hOiFhfSwhMCkuY2FsbCh0aGlzLGEpfSwkcigpe3t2YXIgYSxcbmI7bGV0IGU9YT1cIlwiO3ZhciBjPXRoaXMucmVhbDt2YXIgZD10aGlzLmltYWc7aWYoYj0wPT09YyliPTE9PShjPzA+Yz8tMToxOjA+MS9jPy0xOjEpO2I/KGM9XCJcIixiPWgoZCxcImdcIixudWxsLDAsbnVsbCkpOihjPWE9aChjLFwiZ1wiLG51bGwsMCxudWxsKSxiPWgoZCxcImdcIixudWxsLGguUHlfRFRTRl9TSUdOLG51bGwpLDA9PT1kJiYtSW5maW5pdHk9PT0xL2QmJmImJlwiLVwiIT09YlswXSYmKGI9XCItXCIrYiksYT1cIihcIixlPVwiKVwiKTtkPW5ldyBTay5idWlsdGluLnN0cihcIlwiK2ErYytiK1wialwiK2UpfXJldHVybiBkfSxuYiRpbnQoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gaW50XCIpO30sbmIkbG9uZygpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGNvbnZlcnQgY29tcGxleCB0byBsb25nXCIpO30sbmIkZmxvYXQoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gZmxvYXRcIik7XG59LG5iJHBvc2l0aXZlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmNvbXBsZXgodGhpcy5yZWFsLHRoaXMuaW1hZyl9LG5iJG5lZ2F0aXZlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmNvbXBsZXgoLXRoaXMucmVhbCwtdGhpcy5pbWFnKX0sbmIkYm9vbCgpe3JldHVybiB0aGlzLnJlYWx8fHRoaXMuaW1hZ30sbmIkYWRkOmIoKGEsYixjLGQpPT5uZXcgU2suYnVpbHRpbi5jb21wbGV4KGErYyxiK2QpKSxuYiRzdWJ0cmFjdDpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChhLWMsYi1kKSksbmIkcmVmbGVjdGVkX3N1YnRyYWN0OmIoKGEsYixjLGQpPT5uZXcgU2suYnVpbHRpbi5jb21wbGV4KGMtYSxkLWIpKSxuYiRtdWx0aXBseTpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChjKmEtZCpiLGEqZCtiKmMpKSxuYiRkaXZpZGU6YihlKSxuYiRyZWZsZWN0ZWRfZGl2aWRlOmIoKGEsYixjLGQpPT5lKGMsZCxhLGIpKSxuYiRmbG9vcl9kaXZpZGUoYSl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgdGFrZSBmbG9vciBvZiBjb21wbGV4IG51bWJlci5cIik7XG59LG5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGUoYSl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgdGFrZSBmbG9vciBvZiBjb21wbGV4IG51bWJlci5cIik7fSxuYiRyZW1haW5kZXIoYSl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbW9kIGNvbXBsZXggbnVtYmVycy5cIik7fSxuYiRyZWZsZWN0ZWRfcmVtYWluZGVyKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG1vZCBjb21wbGV4IG51bWJlcnMuXCIpO30sbmIkZGl2bW9kKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb3IgbW9kIG9mIGNvbXBsZXggbnVtYmVyLlwiKTt9LG5iJHBvd2VyKGEsYil7aWYobnVsbCE9YiYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb21wbGV4IG1vZHVsb1wiKTtyZXR1cm4gay5jYWxsKHRoaXMsYSl9LG5iJGFicygpe3ZhciBhPVxudGhpcy5yZWFsO2NvbnN0IGI9dGhpcy5pbWFnO2lmKCFOdW1iZXIuaXNGaW5pdGUoYSl8fCFOdW1iZXIuaXNGaW5pdGUoYikpcmV0dXJuIEluZmluaXR5PT09YXx8LUluZmluaXR5PT09YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oTWF0aC5hYnMoYSkpOkluZmluaXR5PT09Ynx8LUluZmluaXR5PT09Yj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oTWF0aC5hYnMoYikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pO2E9TWF0aC5oeXBvdChhLGIpO2lmKCFOdW1iZXIuaXNGaW5pdGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcImFic29sdXRlIHZhbHVlIHRvbyBsYXJnZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfX0sZ2V0c2V0czp7cmVhbDp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5yZWFsKX0sJGRvYzpcInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifSxpbWFnOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLmltYWcpfSxcbiRkb2M6XCJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifX0sbWV0aG9kczp7Y29uanVnYXRlOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KHRoaXMucmVhbCwtdGhpcy5pbWFnKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcImNvbXBsZXguY29uanVnYXRlKCkgLT4gY29tcGxleFxcblxcblJldHVybiB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgaXRzIGFyZ3VtZW50LiAoMy00aikuY29uanVnYXRlKCkgPT0gMys0ai5cIn0sX19nZXRuZXdhcmdzX186eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5yZWFsKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5pbWFnKV0pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sX19mb3JtYXRfXzp7JG1ldGgoYSl7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiX19mb3JtYXRfXyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIGNvbXBsZXggdHlwZS5cIik7XG50aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2Zvcm1hdF9fIHJlcXVpcmVzIHN0clwiKTt9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJjb21wbGV4Ll9fZm9ybWF0X18oKSAtPiBzdHJcXG5cXG5Db252ZXJ0IHRvIGEgc3RyaW5nIGFjY29yZGluZyB0byBmb3JtYXRfc3BlYy5cIn19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jb21wbGV4XCIsU2suYnVpbHRpbi5jb21wbGV4KTtjb25zdCBkPVNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4LGc9L19bZUVdfFtlRV1ffFxcLl98X1xcLnxbKy1dX3xfanxqXy8sbj0vXyg/PVteX10pL2c7U2suYnVpbHRpbi5jb21wbGV4LmNvbXBsZXhfc3VidHlwZV9mcm9tX3N0cmluZz1mdW5jdGlvbihhLGIpe2I9Ynx8U2suYnVpbHRpbi5jb21wbGV4LnByb3RvdHlwZTt2YXIgZD0wLGU9MCxmPSExO2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpYT1Tay5mZmkucmVtYXBUb0pzKGEpO2Vsc2UgaWYoXCJzdHJpbmdcIiE9PVxudHlwZW9mIGEpdGhyb3cgbmV3IFR5cGVFcnJvcihcInByb3ZpZGVkIHVuc3VwcG9ydGVkIHN0cmluZy1hbGlrZSBhcmd1bWVudFwiKTtpZigtMSE9PWEuaW5kZXhPZihcIlxceDAwXCIpfHwwPT09YS5sZW5ndGh8fFwiXCI9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb21wbGV4KCkgYXJnIGlzIGEgbWFsZm9ybWVkIHN0cmluZ1wiKTt2YXIgaD0wO2E9YS5yZXBsYWNlKC9pbmZ8aW5maW5pdHkvZ2ksXCJJbmZpbml0eVwiKTtmb3IoYT1hLnJlcGxhY2UoL25hbi9naSxcIk5hTlwiKTtcIiBcIj09PWFbaF07KWgrKztpZihcIihcIj09PWFbaF0pZm9yKGY9ITAsaCsrO1wiIFwiPT09YVtoXTspaCsrO2lmKC0xIT09YS5pbmRleE9mKFwiX1wiKSl7aWYoZy50ZXN0KGEpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gY29tcGxleDogJ1wiK2ErXCInXCIpO2E9YS5jaGFyQXQoMCkrYS5zdWJzdHJpbmcoMSkucmVwbGFjZShuLFwiXCIpfXZhciBrPS9eKD86WystXT8oPzooPzooPzpcXGQqXFwuXFxkKyl8KD86XFxkK1xcLj8pKSg/OltlRV1bKy1dP1xcZCspP3xOYU58SW5maW5pdHkpKS87XG52YXIgbD1hLnN1YnN0cihoKTt2YXIgcD1sLm1hdGNoKGspO2lmKG51bGwhPT1wKWlmKGgrPXBbMF0ubGVuZ3RoLFwialwiPT09YVtoXXx8XCJKXCI9PT1hW2hdKWU9cGFyc2VGbG9hdChwWzBdKSxoKys7ZWxzZSBpZihcIitcIj09PWFbaF18fFwiLVwiPT09YVtoXSl7ZD1wYXJzZUZsb2F0KHBbMF0pO3A9YS5zdWJzdHIoaCkubWF0Y2goayk7bnVsbCE9PXA/KGU9cGFyc2VGbG9hdChwWzBdKSxoKz1wWzBdLmxlbmd0aCk6KGU9XCIrXCI9PT1hW2hdPzE6LTEsaCsrKTtpZihcImpcIiE9PWFbaF0mJlwiSlwiIT09YVtoXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCgpIGFyZyBpcyBtYWxmb3JtZWQgc3RyaW5nXCIpO2grK31lbHNlIGQ9cGFyc2VGbG9hdChwWzBdKTtlbHNlIHA9cD1sLm1hdGNoKC9eKFsrLV0/W2pKXSkvKSxudWxsIT09cCYmKGU9MT09PXBbMF0ubGVuZ3RoPzE6XCIrXCI9PT1wWzBdWzBdPzE6LTEsaCs9cFswXS5sZW5ndGgpO2Zvcig7XCIgXCI9PT1hW2hdOyloKys7aWYoZil7aWYoXCIpXCIhPT1cbmFbaF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtmb3IoaCsrO1wiIFwiPT09YVtoXTspaCsrfWlmKGEubGVuZ3RoIT09aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCgpIGFyZyBpcyBtYWxmb3JtZWQgc3RyaW5nXCIpO3JldHVybiBjKGQsZSxiKX07Y29uc3Qgaz1iKChhLGIsYyxkKT0+e2NvbnN0IGc9Y3wwO3JldHVybiAwPT09ZCYmYz09PWc/KDEwMDxnfHwtMTAwPmc/YT1mKGEsYixnLDApOjA8Zz9hPWwoYSxiLGcpOihhPWwoYSxiLC1nKSxhPWUoMSwwLGEucmVhbCxhLmltYWcpKSxhKTpmKGEsYixjLGQpfSk7aC5QeV9EVFNGX1NJR049MTtoLlB5X0RUU0ZfQUREX0RPVF8wPTI7aC5QeV9EVFNGX0FMVD00O2guUHlfRFRTVF9GSU5JVEU9MDtoLlB5X0RUU1RfSU5GSU5JVEU9MTtoLlB5X0RUU1RfTkFOPTJ9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5zbGljZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic2xpY2VcIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYil7dm9pZCAwPT09YyYmdm9pZCAwPT09YiYmKGM9YSxhPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt2b2lkIDA9PT1iJiYoYj1Tay5idWlsdGluLm5vbmUubm9uZSQpO3RoaXMuc3RhcnQ9YTt0aGlzLnN0b3A9Yzt0aGlzLnN0ZXA9Yn0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRvYzpcInNsaWNlKHN0b3ApXFxuc2xpY2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSlcXG5cXG5DcmVhdGUgYSBzbGljZSBvYmplY3QuICBUaGlzIGlzIHVzZWQgZm9yIGV4dGVuZGVkIHNsaWNpbmcgKGUuZy4gYVswOjEwOjJdKS5cIix0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRuZXcoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic2xpY2VcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJzbGljZVwiLGEsMSwzKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc2xpY2UoLi4uYSl9LFxuJHIoKXtjb25zdCBhPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5zdGFydCksYz1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuc3RvcCksYj1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuc3RlcCk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcInNsaWNlKFwiK2ErXCIsIFwiK2MrXCIsIFwiK2IrXCIpXCIpfSx0cCRyaWNoY29tcGFyZShhLGMpe2lmKGEub2IkdHlwZSE9PVNrLmJ1aWx0aW4uc2xpY2UpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGI9bmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXMuc3RhcnQsdGhpcy5zdG9wLHRoaXMuc3RlcF0pO2E9bmV3IFNrLmJ1aWx0aW4udHVwbGUoW2Euc3RhcnQsYS5zdG9wLGEuc3RlcF0pO3JldHVybiBiLnRwJHJpY2hjb21wYXJlKGEsYyl9fSxnZXRzZXRzOntzdGFydDp7JGdldCgpe3JldHVybiB0aGlzLnN0YXJ0fX0sc3RlcDp7JGdldCgpe3JldHVybiB0aGlzLnN0ZXB9fSxzdG9wOnskZ2V0KCl7cmV0dXJuIHRoaXMuc3RvcH19fSxcbm1ldGhvZHM6e2luZGljZXM6eyRtZXRoOmZ1bmN0aW9uKGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigwPmEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibGVuZ3RoIHNob3VsZCBub3QgYmUgbmVnYXRpdmVcIik7Y29uc3Qge3N0YXJ0OmMsc3RvcDpiLHN0ZXA6ZX09dGhpcy5zbGljZSRpbmRpY2VzKGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50XyhjKSxuZXcgU2suYnVpbHRpbi5pbnRfKGIpLG5ldyBTay5idWlsdGluLmludF8oZSldKX0sJGRvYzpcIlMuaW5kaWNlcyhsZW4pIC0+IChzdGFydCwgc3RvcCwgc3RyaWRlKVxcblxcbkFzc3VtaW5nIGEgc2VxdWVuY2Ugb2YgbGVuZ3RoIGxlbiwgY2FsY3VsYXRlIHRoZSBzdGFydCBhbmQgc3RvcFxcbmluZGljZXMsIGFuZCB0aGUgc3RyaWRlIGxlbmd0aCBvZiB0aGUgZXh0ZW5kZWQgc2xpY2UgZGVzY3JpYmVkIGJ5XFxuUy4gT3V0IG9mIGJvdW5kcyBpbmRpY2VzIGFyZSBjbGlwcGVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCB0aGVcXG5oYW5kbGluZyBvZiBub3JtYWwgc2xpY2VzLlwiLFxuJHRleHRzaWc6bnVsbCwkZmxhZ3M6e09uZUFyZzohMH19fSxwcm90bzp7c2xpY2UkYXNfaW5kaWNlcyhhKXtsZXQgYzt2YXIgYj1hP2E9PlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLG51bGwsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgTm9uZSBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik6YT0+U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSxcInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBOb25lIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKTtpZihTay5idWlsdGluLmNoZWNrTm9uZSh0aGlzLnN0ZXApKWM9MTtlbHNlIGlmKGM9Yih0aGlzLnN0ZXApLDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzbGljZSBzdGVwIGNhbm5vdCBiZSB6ZXJvXCIpO2E9U2suYnVpbHRpbi5jaGVja05vbmUodGhpcy5zdGFydCk/bnVsbDpiKHRoaXMuc3RhcnQpO2I9U2suYnVpbHRpbi5jaGVja05vbmUodGhpcy5zdG9wKT9udWxsOlxuYih0aGlzLnN0b3ApO3JldHVybntzdGFydDphLHN0b3A6YixzdGVwOmN9fSwkd3J0KGEsYyxiLGUsZil7Zj1mP2I9PkpTQkkuX19pc0JpZ0ludChiKT9KU0JJLmFkZChiLEpTQkkuQmlnSW50KGEpKTpiK2E6Yj0+YithOzA8ZT8obnVsbD09PWM/Yz0wOjA+YyYmKGM9ZihjKSwwPmMmJihjPTApKSxudWxsPT09Yj9iPWE6Yj5hP2I9YTowPmImJihiPWYoYikpKToobnVsbD09PWM/Yz1hLTE6Yz49YT9jPWEtMTowPmMmJihjPWYoYykpLG51bGw9PT1iP2I9LTE6MD5iJiYoYj1mKGIpLDA+YiYmKGI9LTEpKSk7cmV0dXJue3N0YXJ0OmMsc3RvcDpiLHN0ZXA6ZX19LHNsaWNlJGluZGljZXMoYSxjKXtsZXQge3N0YXJ0OmIsc3RvcDplLHN0ZXA6Zn09dGhpcy5zbGljZSRhc19pbmRpY2VzKCEwLGMpO3JldHVybiB0aGlzLiR3cnQoYSxiLGUsZixjKX0sc3NzaXRlciQoYSxjKXtsZXQge3N0YXJ0OmIsc3RvcDplLHN0ZXA6Zn09dGhpcy5zbGljZSRpbmRpY2VzKGEsITApO2lmKDA8Zilmb3IoYT1iO2E8XG5lO2ErPWYpYyhhKTtlbHNlIGZvcihhPWI7YT5lO2ErPWYpYyhhKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQ9ZnVuY3Rpb24oYSxjLGIpe2E9YS5zcSRsZW5ndGgoKTt2b2lkIDA9PT1jfHxTay5idWlsdGluLmNoZWNrTm9uZShjKT9jPTA6KGM9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGMsbnVsbCxcInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIiksMD5jJiYoYys9YSwwPmMmJihjPTApKSk7dm9pZCAwPT09Ynx8U2suYnVpbHRpbi5jaGVja05vbmUoYik/Yj1hOihiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLG51bGwsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpLDA+Yj8oYis9YSwwPmImJihiPTApKTpiPmEmJihiPWEpKTtyZXR1cm57c3RhcnQ6YyxlbmQ6Yn19fSxmdW5jdGlvbihtLFxucSl7ZnVuY3Rpb24gYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tBbnlTZXQoYik/YS5jYWxsKHRoaXMsYik6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGMoYSl7YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2V0JiZhLnRwJGhhc2g9PT1Tay5idWlsdGluLm5vbmUubm9uZSQmJihhPW5ldyBTay5idWlsdGluLmZyb3plbnNldChTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSkpO3JldHVybiBhfW09e307U2suYnVpbHRpbi5zZXQ9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInNldFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hP2E9W106QXJyYXkuaXNBcnJheShhKXx8KGE9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSkpO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLnNldCxcIkJhZCBjYWxsIHRvIHNldCAtIG11c3QgYmUgY2FsbGVkIHdpdGggYW4gQXJyYXkgYW5kICduZXcnXCIpO1xuY29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSksYi5wdXNoKCEwKTt0aGlzLnY9bmV3IFNrLmJ1aWx0aW4uZGljdChiKTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19udW1iZXI6ITAsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRkb2M6XCJzZXQoKSAtPiBuZXcgZW1wdHkgc2V0IG9iamVjdFxcbnNldChpdGVyYWJsZSkgLT4gbmV3IHNldCBvYmplY3RcXG5cXG5CdWlsZCBhbiB1bm9yZGVyZWQgY29sbGVjdGlvbiBvZiB1bmlxdWUgZWxlbWVudHMuXCIsdHAkaW5pdChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJzZXRcIixiKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJzZXRcIixhLDAsMSk7dGhpcy5zZXQkY2xlYXIoKTtyZXR1cm4oYT1hWzBdKSYmdGhpcy5zZXQkdXBkYXRlKGEpfSx0cCRuZXc6U2suZ2VuZXJpYy5uZXcsXG4kcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKC4uLilcIik7dGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy5zayRhc2FycmF5KCkubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3RoaXMuaW4kcmVwcj0hMTtyZXR1cm4gU2suX19mdXR1cmVfXy5weXRob24zPzA9PT1hLmxlbmd0aD9uZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIoKVwiKTp0aGlzLm9iJHR5cGUhPT1Tay5idWlsdGluLnNldD9uZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIoe1wiK2Euam9pbihcIiwgXCIpK1wifSlcIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwie1wiK2Euam9pbihcIiwgXCIpK1wifVwiKTpuZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIoW1wiK2Euam9pbihcIiwgXCIpK1wiXSlcIil9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGIodGhpcyl9LHRwJHJpY2hjb21wYXJlKGEsXG5iKXtpZighU2suYnVpbHRpbi5jaGVja0FueVNldChhKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7c3dpdGNoKGIpe2Nhc2UgXCJOb3RFcVwiOmNhc2UgXCJFcVwiOnJldHVybiBhPXRoaXM9PT1hPyEwOnRoaXMuZ2V0JHNpemUoKSE9PWEuZ2V0JHNpemUoKT8hMTpTay5taXNjZXZhbC5pc1RydWUodGhpcy5zZXQkaXNzdWJzZXQoYSkpLFwiRXFcIj09PWI/YTohYTtjYXNlIFwiTHRFXCI6cmV0dXJuIHRoaXM9PT1hfHxTay5taXNjZXZhbC5pc1RydWUodGhpcy5zZXQkaXNzdWJzZXQoYSkpO2Nhc2UgXCJHdEVcIjpyZXR1cm4gdGhpcz09PWF8fFNrLm1pc2NldmFsLmlzVHJ1ZShhLnNldCRpc3N1YnNldCh0aGlzKSk7Y2FzZSBcIkx0XCI6cmV0dXJuIHRoaXMuZ2V0JHNpemUoKTxhLmdldCRzaXplKCkmJlNrLm1pc2NldmFsLmlzVHJ1ZSh0aGlzLnNldCRpc3N1YnNldChhKSk7Y2FzZSBcIkd0XCI6cmV0dXJuIHRoaXMuZ2V0JHNpemUoKT5hLmdldCRzaXplKCkmJlNrLm1pc2NldmFsLmlzVHJ1ZShhLnNldCRpc3N1YnNldCh0aGlzKSl9fSxcbm5iJHN1YnRyYWN0OmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGlmZmVyZW5jZS4kbWV0aC5jYWxsKHRoaXMsYSl9KSxuYiRhbmQ6YShmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pbnRlcnNlY3Rpb24uJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkb3I6YShmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy51bmlvbi4kbWV0aC5jYWxsKHRoaXMsYSl9KSxuYiR4b3I6YShmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zeW1tZXRyaWNfZGlmZmVyZW5jZS4kbWV0aC5jYWxsKHRoaXMsYSl9KSxuYiRpbnBsYWNlX3N1YnRyYWN0OmEoZnVuY3Rpb24oYSl7YT09PXRoaXMmJihhPWEuc2V0JGNvcHkoKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKHRoaXMuZGlmZmVyZW5jZV91cGRhdGUuJG1ldGguY2FsbCh0aGlzLGEpLCgpPT50aGlzKX0pLG5iJGlucGxhY2VfYW5kOmEoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKHRoaXMuaW50ZXJzZWN0aW9uX3VwZGF0ZS4kbWV0aC5jYWxsKHRoaXMsXG5hKSwoKT0+dGhpcyl9KSxuYiRpbnBsYWNlX29yOmEoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKHRoaXMudXBkYXRlLiRtZXRoLmNhbGwodGhpcyxhKSwoKT0+dGhpcyl9KSxuYiRpbnBsYWNlX3hvcjphKGZ1bmN0aW9uKGEpe2E9PT10aGlzJiYoYT1hLnNldCRjb3B5KCkpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZS4kbWV0aC5jYWxsKHRoaXMsYSksKCk9PnRoaXMpfSksc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMuZ2V0JHNpemUoKX0sc3EkY29udGFpbnMoYSl7YT1jKGEpO3JldHVybiB0aGlzLnYuc3EkY29udGFpbnMoYSl9fSxtZXRob2RzOnthZGQ6eyRtZXRoKGEpe3RoaXMuc2V0JGFkZChhKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQWRkIGFuIGVsZW1lbnQgdG8gYSBzZXQuXFxuXFxuVGhpcyBoYXMgbm8gZWZmZWN0IGlmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgcHJlc2VudC5cIn0sXG5jbGVhcjp7JG1ldGgoKXt0aGlzLnNldCRjbGVhcigpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBzZXQuXCJ9LGNvcHk6eyRtZXRoKCl7cmV0dXJuIHRoaXMuc2V0JGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiBhIHNldC5cIn0sZGlzY2FyZDp7JG1ldGgoYSl7YT1jKGEpO3RoaXMuc2V0JGRpc2NhcmQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlbW92ZSBhbiBlbGVtZW50IGZyb20gYSBzZXQgaWYgaXQgaXMgYSBtZW1iZXIuXFxuXFxuSWYgdGhlIGVsZW1lbnQgaXMgbm90IGEgbWVtYmVyLCBkbyBub3RoaW5nLlwifSxkaWZmZXJlbmNlOnskbWV0aCguLi5hKXtjb25zdCBiPXRoaXMuc2V0JGNvcHkoKTtcbnJldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT5iLnNldCRkaWZmZXJlbmNlX3VwZGF0ZShhKSksKCk9PmIpfSwkZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBvciBtb3JlIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiB0aGlzIHNldCBidXQgbm90IHRoZSBvdGhlcnMuKVwifSxkaWZmZXJlbmNlX3VwZGF0ZTp7JG1ldGgoLi4uYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLGE9PnRoaXMuc2V0JGRpZmZlcmVuY2VfdXBkYXRlKGEpKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlbW92ZSBhbGwgZWxlbWVudHMgb2YgYW5vdGhlciBzZXQgZnJvbSB0aGlzIHNldC5cIn0saW50ZXJzZWN0aW9uOnskbWV0aCguLi5hKXtyZXR1cm4gdGhpcy5zZXQkaW50ZXJzZWN0aW9uX211bHRpKC4uLmEpfSxcbiRmbGFnczp7TWluQXJnczowfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gdGhlIGludGVyc2VjdGlvbiBvZiB0d28gc2V0cyBhcyBhIG5ldyBzZXQuXFxuXFxuKGkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGJvdGggc2V0cy4pXCJ9LGludGVyc2VjdGlvbl91cGRhdGU6eyRtZXRoKC4uLmEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnNldCRpbnRlcnNlY3Rpb25fbXVsdGkoLi4uYSksYT0+e3RoaXMuc3dhcCRib2RpZXMoYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pfSwkZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiVXBkYXRlIGEgc2V0IHdpdGggdGhlIGludGVyc2VjdGlvbiBvZiBpdHNlbGYgYW5kIGFub3RoZXIuXCJ9LGlzZGlzam9pbnQ6eyRtZXRoKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKHRoaXMuc3EkY29udGFpbnMoYSkpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhTay5idWlsdGluLmJvb2wuZmFsc2UkKX0pLFxuYT0+YXx8U2suYnVpbHRpbi5ib29sLnRydWUkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiBUcnVlIGlmIHR3byBzZXRzIGhhdmUgYSBudWxsIGludGVyc2VjdGlvbi5cIn0saXNzdWJzZXQ6eyRtZXRoKGEpe1NrLmJ1aWx0aW4uY2hlY2tBbnlTZXQoYSl8fChhPXRoaXMuc2V0JG1ha2VfYmFzZXR5cGUoYSkpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLGE9PnRoaXMuc2V0JGlzc3Vic2V0KGEpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlcG9ydCB3aGV0aGVyIGFub3RoZXIgc2V0IGNvbnRhaW5zIHRoaXMgc2V0LlwifSxpc3N1cGVyc2V0OnskbWV0aChhKXtTay5idWlsdGluLmNoZWNrQW55U2V0KGEpfHwoYT10aGlzLnNldCRtYWtlX2Jhc2V0eXBlKGEpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT5hLnNldCRpc3N1YnNldCh0aGlzKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLFxuJGRvYzpcIlJlcG9ydCB3aGV0aGVyIHRoaXMgc2V0IGNvbnRhaW5zIGFub3RoZXIgc2V0LlwifSxwb3A6eyRtZXRoKCl7aWYoMD09PXRoaXMuZ2V0JHNpemUoKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihcInBvcCBmcm9tIGFuIGVtcHR5IHNldFwiKTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMudi5wb3BpdGVtLFt0aGlzLnZdKS52WzBdfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmVtb3ZlIGFuZCByZXR1cm4gYW4gYXJiaXRyYXJ5IHNldCBlbGVtZW50LlxcblJhaXNlcyBLZXlFcnJvciBpZiB0aGUgc2V0IGlzIGVtcHR5LlwifSxyZW1vdmU6eyRtZXRoKGEpe2NvbnN0IGI9YyhhKTtpZih0aGlzLnYubXAkbG9va3VwKGIpKXJldHVybiB0aGlzLnYubXAkYXNzX3N1YnNjcmlwdChiKSxTay5idWlsdGluLm5vbmUubm9uZSQ7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCxcbiRkb2M6XCJSZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgc2V0OyBpdCBtdXN0IGJlIGEgbWVtYmVyLlxcblxcbklmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgcmFpc2UgYSBLZXlFcnJvci5cIn0sc3ltbWV0cmljX2RpZmZlcmVuY2U6eyRtZXRoKGEpe2xldCBiO3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnNldCRtYWtlX2Jhc2V0eXBlKGEpLGE9PntiPWE7cmV0dXJuIGIuc2V0JHN5bW1ldHJpY19kaWZmX3VwZGF0ZSh0aGlzKX0sKCk9PmIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiB0d28gc2V0cyBhcyBhIG5ldyBzZXQuXFxuXFxuKGkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGV4YWN0bHkgb25lIG9mIHRoZSBzZXRzLilcIn0sc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlOnskbWV0aChhKXtTay5idWlsdGluLmNoZWNrQW55U2V0KGEpfHwoYT10aGlzLnNldCRtYWtlX2Jhc2V0eXBlKGEpKTtcbnJldHVybiBTay5taXNjZXZhbC5jaGFpbihhLGE9PnRoaXMuc2V0JHN5bW1ldHJpY19kaWZmX3VwZGF0ZShhKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiBpdHNlbGYgYW5kIGFub3RoZXIuXCJ9LHVuaW9uOnskbWV0aCguLi5hKXtjb25zdCBiPXRoaXMuc2V0JGNvcHkoKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KGEsYT0+Yi5zZXQkdXBkYXRlKGEpKSwoKT0+Yil9LCRmbGFnczp7TWluQXJnczowfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gdGhlIHVuaW9uIG9mIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBlaXRoZXIgc2V0LilcIn0sdXBkYXRlOnskbWV0aCguLi5hKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KGEsXG5hPT50aGlzLnNldCR1cGRhdGUoYSkpLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiVXBkYXRlIGEgc2V0IHdpdGggdGhlIHVuaW9uIG9mIGl0c2VsZiBhbmQgb3RoZXJzLlwifX0scHJvdG86T2JqZWN0LmFzc2lnbihtLHtzayRhc2FycmF5KCl7cmV0dXJuIHRoaXMudi5zayRhc2FycmF5KCl9LGdldCRzaXplKCl7cmV0dXJuIHRoaXMudi5zcSRsZW5ndGgoKX0sc2V0JGFkZChhKXt0aGlzLnYubXAkYXNzX3N1YnNjcmlwdChhLCEwKX0sc2V0JG1ha2VfYmFzZXR5cGUoYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEsITApLGE9Pm5ldyB0aGlzLnNrJGJ1aWx0aW5CYXNlKGEpKX0sc2V0JGRpc2NhcmQoYSl7cmV0dXJuIHRoaXMudi5wb3AkaXRlbShhKX0sc2V0JGNsZWFyKCl7dGhpcy52PW5ldyBTay5idWlsdGluLmRpY3QoW10pfSxzZXQkY29weSgpe2NvbnN0IGE9XG5uZXcgdGhpcy5zayRidWlsdGluQmFzZTthLnY9dGhpcy52LmRpY3QkY29weSgpO3JldHVybiBhfSxzZXQkZGlmZmVyZW5jZV91cGRhdGUoYSl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy5zZXQkZGlzY2FyZChhKX0pfSxzZXQkaW50ZXJzZWN0aW9uKGEpe2NvbnN0IGI9bmV3IHRoaXMuc2skYnVpbHRpbkJhc2U7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy5zcSRjb250YWlucyhhKSYmYi5zZXQkYWRkKGEpfSksKCk9PmIpfSxzZXQkaW50ZXJzZWN0aW9uX211bHRpKC4uLmEpe2lmKCFhLmxlbmd0aClyZXR1cm4gdGhpcy5zZXQkY29weSgpO2xldCBiPXRoaXM7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLGE9PlNrLm1pc2NldmFsLmNoYWluKGIuc2V0JGludGVyc2VjdGlvbihhKSxhPT57Yj1hfSkpLCgpPT5iKX0sXG5zZXQkaXNzdWJzZXQoYSl7Y29uc3QgYj10aGlzLmdldCRzaXplKCksYz1hLmdldCRzaXplKCk7aWYoYj5jKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKWlmKCFhLnNxJGNvbnRhaW5zKGMpKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO3JldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSR9LHNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUoYSl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dm9pZCAwPT09dGhpcy5zZXQkZGlzY2FyZChhKSYmdGhpcy5zZXQkYWRkKGEpfSl9LHNldCR1cGRhdGUoYSl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy5zZXQkYWRkKGEpfSl9LHN3YXAkYm9kaWVzKGEpe3RoaXMudj1hLnZ9fSl9KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLnNldFwiLFxuU2suYnVpbHRpbi5zZXQpO3E9U2suYnVpbHRpbi5zZXQucHJvdG90eXBlO1NrLmJ1aWx0aW4uZnJvemVuc2V0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJmcm96ZW5zZXRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9W10pO1NrLmFzc2VydHMuYXNzZXJ0KEFycmF5LmlzQXJyYXkoYSkmJnRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmZyb3plbnNldCxcImJhZCBjYWxsIHRvIGZyb3plbiBzZXQgLSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIEFycmF5IGFuZCAnbmV3J1wiKTtjb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKSxiLnB1c2goITApO3RoaXMudj1uZXcgU2suYnVpbHRpbi5kaWN0KGIpO3RoaXMuaW4kcmVwcj0hMX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX251bWJlcjohMCx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGRvYzpcImZyb3plbnNldCgpIC0+IGVtcHR5IGZyb3plbnNldCBvYmplY3RcXG5mcm96ZW5zZXQoaXRlcmFibGUpIC0+IGZyb3plbnNldCBvYmplY3RcXG5cXG5CdWlsZCBhbiBpbW11dGFibGUgdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2YgdW5pcXVlIGVsZW1lbnRzLlwiLFxudHAkaGFzaCgpe2xldCBhPTE5Mjc4NjgyMzc7Y29uc3QgYj10aGlzLnNrJGFzYXJyYXkoKTthKj1iLmxlbmd0aCsxO2ZvcihsZXQgYz0wO2M8Yi5sZW5ndGg7YysrKXtjb25zdCBlPVNrLmFic3RyLm9iamVjdEhhc2goYltjXSk7YV49MzY0NDc5ODE2NyooZV5lPDwxNl44OTg2OTc0Nyl9cmV0dXJuIDY5MDY5KmErOTA3MTMzOTIzfSx0cCRuZXcoYSxiKXtpZih0aGlzIT09U2suYnVpbHRpbi5mcm96ZW5zZXQucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGIpO1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJmcm96ZW5zZXRcIixiKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJmcm96ZW5zZXRcIixhLDAsMSk7YT1hWzBdO3JldHVybiB2b2lkIDAhPT1hJiZhLm9iJHR5cGU9PT1Tay5idWlsdGluLmZyb3plbnNldD9hOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEsITApLGE9PmEubGVuZ3RoP25ldyBTay5idWlsdGluLmZyb3plbnNldChhKTpcblNrLmJ1aWx0aW4uZnJvemVuc2V0LiRlbXB0eXNldCl9LCRyOnEuJHIsdHAkaXRlcjpxLnRwJGl0ZXIsdHAkcmljaGNvbXBhcmU6cS50cCRyaWNoY29tcGFyZSxuYiRzdWJ0cmFjdDpxLm5iJHN1YnRyYWN0LG5iJGFuZDpxLm5iJGFuZCxuYiRvcjpxLm5iJG9yLG5iJHhvcjpxLm5iJHhvcixzcSRsZW5ndGg6cS5zcSRsZW5ndGgsc3EkY29udGFpbnM6cS5zcSRjb250YWluc30sbWV0aG9kczp7Y29weTpPYmplY3QuYXNzaWduKHt9LHEuY29weS5kJGRlZix7JG1ldGgoKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvcj09PXRoaXMuc2skYnVpbHRpbkJhc2U/dGhpczpuZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQodGhpcy5zayRhc2FycmF5KCkpfX0pLGRpZmZlcmVuY2U6cS5kaWZmZXJlbmNlLmQkZGVmLGludGVyc2VjdGlvbjpxLmludGVyc2VjdGlvbi5kJGRlZixpc2Rpc2pvaW50OnEuaXNkaXNqb2ludC5kJGRlZixpc3N1YnNldDpxLmlzc3Vic2V0LmQkZGVmLGlzc3VwZXJzZXQ6cS5pc3N1cGVyc2V0LmQkZGVmLFxuc3ltbWV0cmljX2RpZmZlcmVuY2U6cS5zeW1tZXRyaWNfZGlmZmVyZW5jZS5kJGRlZix1bmlvbjpxLnVuaW9uLmQkZGVmfSxwcm90bzpPYmplY3QuYXNzaWduKHskc3VidHlwZV9uZXcoYSxiKXtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5idWlsdGluLmZyb3plbnNldC5wcm90b3R5cGUudHAkbmV3KGEpLGE9PntjLnY9YS52O3JldHVybiBjfSl9fSxtKX0pO1NrLmJ1aWx0aW4uZnJvemVuc2V0LiRlbXB0eXNldD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4uZnJvemVuc2V0LnByb3RvdHlwZSx7djp7dmFsdWU6bmV3IFNrLmJ1aWx0aW4uZGljdChbXSksZW51bWVyYWJsZTohMH0saW4kcmVwcjp7dmFsdWU6ITEsZW51bWVyYWJsZTohMH19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmZyb3plbnNldFwiLFNrLmJ1aWx0aW4uZnJvemVuc2V0KTt2YXIgYj1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJzZXRfaXRlcmF0b3JcIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO3RoaXMuJHNlcT1hLnNrJGFzYXJyYXkoKTt0aGlzLiRvcmlnPWF9LGl0ZXJuZXh0OlNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXlDaGVja1NpemUsbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5wcmludD1mdW5jdGlvbihhLGMpe2xldCBbYixlLGZdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwicHJpbnRcIixbXCJzZXBcIixcImVuZFwiLFwiZmlsZVwiLFwiZmx1c2hcIl0sW10sYyk7aWYodm9pZCAwPT09Ynx8U2suYnVpbHRpbi5jaGVja05vbmUoYikpYj1cIiBcIjtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpYj1iLiRqc3N0cigpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2VwIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZywgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoYikpO2lmKHZvaWQgMD09PWV8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGUpKWU9XCJcXG5cIjtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoZSkpZT1lLiRqc3N0cigpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZW5kIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZywgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGUpKTtsZXQgbDtpZih2b2lkIDAhPT1mJiYhU2suYnVpbHRpbi5jaGVja05vbmUoZikmJihsPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoZixTay5idWlsdGluLnN0ci4kd3JpdGUpLHZvaWQgMD09PWwpKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnd3JpdGUnXCIpO2NvbnN0IGg9bmV3IFNrLmJ1aWx0aW4uc3RyKGEubWFwKGE9PihuZXcgU2suYnVpbHRpbi5zdHIoYSkpLnRvU3RyaW5nKCkpLmpvaW4oYikrZSk7XG5pZih2b2lkIDAhPT1sKVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShsLFtoXSk7ZWxzZSByZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suaW1wb3J0TW9kdWxlKFwic3lzXCIsITEsITApLGE9PihsPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYS4kZC5zdGRvdXQsU2suYnVpbHRpbi5zdHIuJHdyaXRlKSkmJlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShsLFtoXSkpfTtTay5idWlsdGluLnByaW50LmNvX2Zhc3RjYWxsPTF9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5tb2R1bGU9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIm1vZHVsZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMuJGQ9e319LHNsb3RzOnt0cCRkb2M6XCJDcmVhdGUgYSBtb2R1bGUgb2JqZWN0LlxcblxcblRoZSBuYW1lIG11c3QgYmUgYSBzdHJpbmc7IHRoZSBvcHRpb25hbCBkb2MgYXJndW1lbnQgY2FuIGhhdmUgYW55IHR5cGUuXCIsdHAkZ2V0YXR0cihhLGMpe3ZhciBiPXRoaXMuJGRbYS4kbWFuZ2xlZF07XG5pZih2b2lkIDAhPT1iKXJldHVybiBiO2I9dGhpcy5vYiR0eXBlLiR0eXBlTG9va3VwKGEpO2lmKHZvaWQgMCE9PWIpe2NvbnN0IGE9Yi50cCRkZXNjcl9nZXQ7cmV0dXJuIGE/YS5jYWxsKGIsdGhpcyx0aGlzLm9iJHR5cGUsYyk6Yn1jb25zdCBlPXRoaXMuJGQuX19nZXRhdHRyX187aWYodm9pZCAwIT09ZSlyZXR1cm4gYj1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGUsW2FdKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KSxjP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfSx0cCRzZXRhdHRyOlNrLmdlbmVyaWMuc2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe2NvbnN0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwibW9kdWxlXCIsW1wibmFtZVwiLFwiZG9jXCJdLGEsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkXSk7XG5Tay5idWlsdGluLnB5Q2hlY2tUeXBlKFwibW9kdWxlXCIsXCJzdHJpbmdcIixiKTt0aGlzLmluaXQkZGljdChiLGUpfSwkcigpe2xldCBhPXRoaXMuZ2V0JG5hbWUoKTtpZih2b2lkIDAhPT1hKXt2YXIgYz10aGlzLmdldCRtb2RfcmVwcmYoKTtpZih2b2lkIDAhPT1jKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbdGhpc10pfWE9dm9pZCAwPT09YT9cIic/J1wiOmE7Yz10aGlzLmZyb20kZmlsZSgpO2M9dm9pZCAwPT09Yz90aGlzLmVtcHR5X29yJGxvYWRlcigpOmM7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxtb2R1bGUgXCIrYStjK1wiPlwiKX19LGdldHNldHM6e19fZGljdF9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLm1hcHBpbmdwcm94eSh0aGlzLiRkKX19fSxtZXRob2RzOntfX2Rpcl9fOnskbWV0aCgpe2NvbnN0IGE9dGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRkaWN0KTtpZighU2suYnVpbHRpbi5jaGVja01hcHBpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19kaWN0X18gaXMgbm90IGEgZGljdGlvbmFyeVwiKTtcbmNvbnN0IGM9YS5tcCRsb29rdXAoU2suYnVpbHRpbi5zdHIuJGRpcik7cmV0dXJuIHZvaWQgMCE9PWM/U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW10pOm5ldyBTay5idWlsdGluLmxpc3QoU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSkpfSwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIl9fZGlyX18oKSAtPiBsaXN0XFxuc3BlY2lhbGl6ZWQgZGlyKCkgaW1wbGVtZW50YXRpb25cIn19LHByb3RvOntpbml0JGRpY3QoYSxjKXt0aGlzLiRkLl9fbmFtZV9fPWE7dGhpcy4kZC5fX2RvY19fPWM7dGhpcy4kZC5fX3BhY2thZ2VfXz1Tay5idWlsdGluLm5vbmUubm9uZSQ7dGhpcy4kZC5fX3NwZWNfXz1Tay5idWlsdGluLm5vbmUubm9uZSQ7dGhpcy4kZC5fX2xvYWRlcl9fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sc2skYXR0ckVycm9yKCl7Y29uc3QgYT10aGlzLmdldCRuYW1lKCk7cmV0dXJuIHZvaWQgMD09PWE/XCJtb2R1bGVcIjpcIm1vZHVsZSBcIithfSxnZXQkbmFtZSgpe2NvbnN0IGE9XG50aGlzLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJG5hbWUpO3JldHVybiBhJiZTay5taXNjZXZhbC5vYmplY3RSZXByKGEpfSxmcm9tJGZpbGUoKXtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kZmlsZSk7cmV0dXJuIGEmJlwiIGZyb20gXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKX0sZW1wdHlfb3IkbG9hZGVyKCl7aWYodGhpcy4kanMmJnRoaXMuJGpzLmluY2x1ZGVzKFwiJGJ1aWx0aW5tb2R1bGVcIikpcmV0dXJuXCIgKGJ1aWx0LWluKVwiO2NvbnN0IGE9dGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRsb2FkZXIpO3JldHVybiB2b2lkIDA9PT1hfHxTay5idWlsdGluLmNoZWNrTm9uZShhKT9cIlwiOlwiIChcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiKVwifSxnZXQkbW9kX3JlcHJmKCl7Y29uc3QgYT10aGlzLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGxvYWRlcik7cmV0dXJuIGEmJmEudHAkZ2V0YXR0cih0aGlzLnN0ciRtb2RfcmVwcil9LFxuc3RyJG1vZF9yZXByOm5ldyBTay5idWlsdGluLnN0cihcIm1vZHVsZV9yZXByXCIpfX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ubW9kdWxlXCIsU2suYnVpbHRpbi5tb2R1bGUpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc3RydWN0c2VxX3R5cGVzPXt9O1NrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXE9ZnVuY3Rpb24oYSxjLGIsZSl7Y29uc3QgZj1hK1wiLlwiK2MsbD1bXTthPVtdO2ZvcihsZXQgYyBpbiBiKWwucHVzaChjKSxhLnB1c2goYltjXSk7Yj17fTtmb3IobGV0IGM9MDtjPGwubGVuZ3RoO2MrKyliW2xbY11dPXskZ2V0KCl7cmV0dXJuIHRoaXMudltjXX0sJGRvYzphW2NdfTt2YXIgaD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKGYse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KChBcnJheS5pc0FycmF5KGEpfHx2b2lkIDA9PT1hKSYmdGhpcyBpbnN0YW5jZW9mIGgpO1NrLmJ1aWx0aW4udHVwbGUuY2FsbCh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4udHVwbGUsXG5zbG90czp7dHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tPbmVBcmcoZixhLGIpO2I9W107YT1hWzBdO2ZvcihsZXQgYz1Tay5hYnN0ci5pdGVyKGEpLGQ9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1jLnRwJGl0ZXJuZXh0KCkpYi5wdXNoKGQpO2lmKGIubGVuZ3RoIT1sLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoZitcIigpIHRha2VzIGEgXCIrbC5sZW5ndGgrXCItc2VxdWVuY2UgKFwiK2IubGVuZ3RoK1wiLXNlcXVlbmNlIGdpdmVuKVwiKTtyZXR1cm4gbmV3IGgoYil9LHRwJGRvYzplP2U6U2suYnVpbHRpbi5ub25lLm5vbmUkLCRyKCl7dmFyIGE7aWYoMD09PXRoaXMudi5sZW5ndGgpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihmK1wiKClcIik7dmFyIGI9W107Zm9yKGE9MDthPHRoaXMudi5sZW5ndGg7KythKWJbYV09bFthXStcIj1cIitTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMudlthXSk7YT1iLmpvaW4oXCIsIFwiKTsxPT09dGhpcy52Lmxlbmd0aCYmKGErPVxuXCIsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZitcIihcIithK1wiKVwiKX19LG1ldGhvZHM6e19fcmVkdWNlX186eyRtZXRoKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIl9fcmVkdWNlX18gaXMgbm90IGltcGxlbWVudGVkXCIpO30sJGZsYWdzOntOb0FyZ3M6ITB9fX0sZ2V0c2V0czpiLHByb3RvOntudW1fc2VxdWVuY2VfZmllbGRzOm5ldyBTay5idWlsdGluLmludF8obC5sZW5ndGgpfX0pO3JldHVybiBofTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLm1ha2Vfc3RydWN0c2VxXCIsU2suYnVpbHRpbi5tYWtlX3N0cnVjdHNlcSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5nZW5lcmF0b3I9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiZ2VuZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyxiLGUsZil7dmFyIGw7aWYoYSl7aWYoISh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5nZW5lcmF0b3IpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJiYWQgaW50ZXJuYWwgY2FsbCB0byBnZW5lcmF0b3IsIHVzZSAnbmV3J1wiKTtcbnRoaXMuZnVuY19jb2RlPWE7dGhpcy5mdW5jX2dsb2JhbHM9Y3x8bnVsbDt0aGlzLmdpJHJ1bm5pbmc9ITE7dGhpcy5naSRyZXN1bWVhdD0wO3RoaXMuZ2kkc2VudHZhbHVlPXZvaWQgMDt0aGlzLmdpJGxvY2Fscz17fTt0aGlzLmdpJGNlbGxzPXt9O2lmKDA8Yi5sZW5ndGgpZm9yKGM9MDtjPGEuY29fdmFybmFtZXMubGVuZ3RoOysrYyl0aGlzLmdpJGxvY2Fsc1thLmNvX3Zhcm5hbWVzW2NdXT1iW2NdO2lmKHZvaWQgMCE9PWYpZm9yKGwgaW4gZillW2xdPWZbbF07dGhpcy5mdW5jX2Nsb3N1cmU9ZX19LHNsb3RzOnskcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8Z2VuZXJhdG9yIG9iamVjdCBcIit0aGlzLmZ1bmNfY29kZS5jb19uYW1lLnYrXCI+XCIpfX0saXRlcm5leHQoYSxjKXt2YXIgYj10aGlzO3RoaXMuZ2kkcnVubmluZz0hMDt2b2lkIDA9PT1jJiYoYz1Tay5idWlsdGluLm5vbmUubm9uZSQpO3RoaXMuZ2kkc2VudHZhbHVlPWM7Yz1bdGhpc107dGhpcy5mdW5jX2Nsb3N1cmUmJlxuYy5wdXNoKHRoaXMuZnVuY19jbG9zdXJlKTtyZXR1cm4gZnVuY3Rpb24gbChjKXtpZihjIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbil7aWYoYSlyZXR1cm4gbmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb24obCxjKTtjPVNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX1iLmdpJHJ1bm5pbmc9ITE7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09Yyk7aWYoYyE9PVNrLmJ1aWx0aW4ubm9uZS5ub25lJClyZXR1cm4gYi5naSRyZXN1bWVhdD1jWzBdLGM9Y1sxXX0odGhpcy5mdW5jX2NvZGUuYXBwbHkodGhpcy5mdW5jX2dsb2JhbHMsYykpfSxtZXRob2RzOntzZW5kOnskbWV0aChhKXtyZXR1cm4gdGhpcy50cCRpdGVybmV4dCghMCxhKX0sJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJzZW5kKGFyZykgLT4gc2VuZCAnYXJnJyBpbnRvIGdlbmVyYXRvcixcXG5yZXR1cm4gbmV4dCB5aWVsZGVkIHZhbHVlIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24uXCJ9fX0pO1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5nZW5lcmF0b3JcIixTay5idWlsdGluLmdlbmVyYXRvcik7U2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yPWZ1bmN0aW9uKGEsYyl7dmFyIGIsZT1uZXcgU2suYnVpbHRpbi5nZW5lcmF0b3IobnVsbCxudWxsLG51bGwpO2UudHAkaXRlcm5leHQ9YTtmb3IoYiBpbiBjKWMuaGFzT3duUHJvcGVydHkoYikmJihlW2JdPWNbYl0pO3JldHVybiBlfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLm1ha2VHZW5lcmF0b3JcIixTay5idWlsdGluLm1ha2VHZW5lcmF0b3IpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZmlsZT1mdW5jdGlvbihhLGMsYil7dmFyIGU7aWYoISh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5maWxlKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmlsZShhLGMsYik7dGhpcy5tb2RlPWM7dGhpcy5uYW1lPVNrLmZmaS5yZW1hcFRvSnMoYSk7dGhpcy5jbG9zZWQ9ITE7aWYoXCIvZGV2L3N0ZG91dFwiPT09dGhpcy5uYW1lKXRoaXMuZGF0YSQ9XG5Tay5idWlsdGluLm5vbmUubm9uZSQsdGhpcy5maWxlbm89MTtlbHNlIGlmKFwiL2Rldi9zdGRpblwiPT09dGhpcy5uYW1lKXRoaXMuZmlsZW5vPTA7ZWxzZSBpZihcIi9kZXYvc3RkZXJyXCI9PT10aGlzLm5hbWUpdGhpcy5maWxlbm89MjtlbHNle2lmKFwid1wiPT09U2suZmZpLnJlbWFwVG9Kcyh0aGlzLm1vZGUpKXRoaXMuZmlsZW5vPVNrLmJ1aWx0aW4uZmlsZS5jdXJyZW50RmlsZW5vKys7ZWxzZSBmb3IoZSBpbiB0aGlzLmZpbGVubz1Tay5pbkJyb3dzZXI/MTA6MTEsdGhpcy5kYXRhJD1Tay5yZWFkKGEudiksdGhpcy5saW5lTGlzdD10aGlzLmRhdGEkLnNwbGl0KFwiXFxuXCIpLHRoaXMubGluZUxpc3Q9dGhpcy5saW5lTGlzdC5zbGljZSgwLC0xKSx0aGlzLmxpbmVMaXN0KXRoaXMubGluZUxpc3RbZV0rPVwiXFxuXCI7dGhpcy5jdXJyZW50TGluZT0wfXRoaXMucG9zJD0wO1NrLmZpbGVvcGVuJiYxMDw9dGhpcy5maWxlbm8mJlNrLmZpbGVvcGVuKHRoaXMpO3JldHVybiB0aGlzfTtTay5idWlsdGluLmZpbGUuY3VycmVudEZpbGVubz1cbjEyO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoXCJmaWxlXCIsU2suYnVpbHRpbi5maWxlLFNrLmJ1aWx0aW4ub2JqZWN0KTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm8oU2suYnVpbHRpbi5maWxlKTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLiRyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIisodGhpcy5jbG9zZWQ/XCJjbG9zZWRcIjpcIm9wZW5cIikrXCJmaWxlICdcIit0aGlzLm5hbWUrXCInLCBtb2RlICdcIitTay5mZmkucmVtYXBUb0pzKHRoaXMubW9kZSkrXCInPlwiKX07U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS50cCRpdGVyPWZ1bmN0aW9uKCl7dmFyIGE9e3RwJGl0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sJG9iajp0aGlzLCRpbmRleDp0aGlzLmN1cnJlbnRMaW5lLCRsaW5lczp0aGlzLmxpbmVMaXN0LHRwJGl0ZXJuZXh0OmZ1bmN0aW9uKCl7aWYoIShhLiRpbmRleD49YS4kbGluZXMubGVuZ3RoKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEuJGxpbmVzW2EuJGluZGV4KytdKX19O1xucmV0dXJuIGF9O1NrLmFic3RyLnNldFVwU2xvdHMoU2suYnVpbHRpbi5maWxlKTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLl9fZW50ZXJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBhfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5fX2V4aXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5jbG9zZSxbYV0pfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5jbG9zZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuY2xvc2VkPSEwO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLmZsdXNoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7fSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5maWxlbm89bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5maWxlbm99KTtcblNrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuaXNhdHR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuITF9KTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLnJlYWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe3ZhciBiPWEuZGF0YSQubGVuZ3RoO2lmKGEuY2xvc2VkKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlXCIpO3ZhciBlPXZvaWQgMD09PWM/YjpTay5mZmkucmVtYXBUb0pzKGMpO2U9bmV3IFNrLmJ1aWx0aW4uc3RyKGEuZGF0YSQuc3Vic3RyKGEucG9zJCxlKSk7YS5wb3MkPXZvaWQgMD09PWM/YjphLnBvcyQrU2suZmZpLnJlbWFwVG9KcyhjKTthLnBvcyQ+PWImJihhLnBvcyQ9Yik7cmV0dXJuIGV9KTtTay5idWlsdGluLmZpbGUuJHJlYWRsaW5lPWZ1bmN0aW9uKGEsYyxiKXtpZigwPT09YS5maWxlbm8pe2E9U2suZmZpLnJlbWFwVG9KcyhiKTthPVNrLmlucHV0ZnVuKGE/XG5hOlwiXCIpO2lmKGEgaW5zdGFuY2VvZiBQcm9taXNlfHxhJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYS50aGVuKXt2YXIgZT1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbjtlLnJlc3VtZT1mdW5jdGlvbigpe2lmKGUuZGF0YS5lcnJvcil0aHJvdyBlLmRhdGEuZXJyb3I7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlLmRhdGEucmVzdWx0KX07ZS5kYXRhPXt0eXBlOlwiU2sucHJvbWlzZVwiLHByb21pc2U6YX07cmV0dXJuIGV9cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX1jPVwiXCI7YS5jdXJyZW50TGluZTxhLmxpbmVMaXN0Lmxlbmd0aCYmKGM9YS5saW5lTGlzdFthLmN1cnJlbnRMaW5lXSxhLmN1cnJlbnRMaW5lKyspO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyl9O1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUucmVhZGxpbmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe3JldHVybiBTay5idWlsdGluLmZpbGUuJHJlYWRsaW5lKGEsYyx2b2lkIDApfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5yZWFkbGluZXM9XG5uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7aWYoMD09PWEuZmlsZW5vKXJldHVybiBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwicmVhZGxpbmVzIGlucyd0IGltcGxlbWVudGVkIGJlY2F1c2UgdGhlIHdlYiBkb2Vzbid0IHN1cHBvcnQgQ3RybCtEXCIpO3ZhciBiPVtdO2ZvcihjPWEuY3VycmVudExpbmU7YzxhLmxpbmVMaXN0Lmxlbmd0aDtjKyspYi5wdXNoKG5ldyBTay5idWlsdGluLnN0cihhLmxpbmVMaXN0W2NdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9KTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLnNlZWs9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsYil7Yz1Tay5mZmkucmVtYXBUb0pzKGMpO3ZvaWQgMD09PWImJihiPTApOzA9PT1iP2EucG9zJD1jOjE9PWI/YS5wb3MkPWEuZGF0YSQubGVuZ3RoK2M6Mj09YiYmKGEucG9zJD1hLmRhdGEkLmxlbmd0aCtjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSk7XG5Tay5idWlsdGluLmZpbGUucHJvdG90eXBlLnRlbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShhLnBvcyQpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS50cnVuY2F0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5mYWlsKCl9KTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLndyaXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgYj1Tay5mZmkucmVtYXBUb0pzKGEubW9kZSk7U2suZmZpLnJlbWFwVG9KcyhjKTtpZihcIndcIj09PWJ8fFwid2JcIj09PWJ8fFwiYVwiPT09Ynx8XCJhYlwiPT09YilpZihTay5maWxld3JpdGUpe2lmKGEuY2xvc2VkKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlXCIpOzE9PT1hLmZpbGVubz9Tay5vdXRwdXQoU2suZmZpLnJlbWFwVG9KcyhjKSk6U2suZmlsZXdyaXRlKGEsYyl9ZWxzZSAxPT09XG5hLmZpbGVubz9Tay5vdXRwdXQoU2suZmZpLnJlbWFwVG9KcyhjKSk6U2suYXNzZXJ0cy5mYWlsKCk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZmlsZVwiLFNrLmJ1aWx0aW4uZmlsZSl9LGZ1bmN0aW9uKG0scSl7U2suZmZpPVNrLmZmaXx8e307U2suZmZpLnJlbWFwVG9QeT1mdW5jdGlvbihhKXt2YXIgYztpZihudWxsPT09YXx8XCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSQ7aWYoYS5vYiR0eXBlfHxhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbilyZXR1cm4gYTtpZihcIltvYmplY3QgQXJyYXldXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkpe3ZhciBiPVtdO2ZvcihjPTA7YzxhLmxlbmd0aDsrK2MpYi5wdXNoKFNrLmZmaS5yZW1hcFRvUHkoYVtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfWlmKFwib2JqZWN0XCI9PT10eXBlb2YgYSl7Yj1cbltdO2ZvcihjIGluIGEpYi5wdXNoKFNrLmZmaS5yZW1hcFRvUHkoYykpLGIucHVzaChTay5mZmkucmVtYXBUb1B5KGFbY10pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZGljdChiKX1pZihcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpcmV0dXJuIFNrLmJ1aWx0aW4uYXNzayQoYSk7aWYoXCJib29sZWFuXCI9PT10eXBlb2YgYSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChhKTtpZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIGEpcmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZnVuYyhhKTtTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgcmVtYXAgdHlwZSBcIit0eXBlb2YgYSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5yZW1hcFRvUHlcIixTay5mZmkucmVtYXBUb1B5KTtTay5mZmkucmVtYXBUb0pzPWZ1bmN0aW9uKGEpe3ZhciBjLFxuYjtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KXt2YXIgZT17fTthLiRpdGVtcygpLmZvckVhY2goKFthLGNdKT0+e2I9U2suZmZpLnJlbWFwVG9KcyhhKTtlW2JdPVNrLmZmaS5yZW1hcFRvSnMoYyl9KTtyZXR1cm4gZX1pZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5saXN0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7ZT1bXTtmb3IoYz0wO2M8YS52Lmxlbmd0aDsrK2MpZS5wdXNoKFNrLmZmaS5yZW1hcFRvSnMoYS52W2NdKSk7cmV0dXJuIGV9aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYm9vbClyZXR1cm4gYS52PyEwOiExO2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKXJldHVybiBTay5idWlsdGluLmFzbnVtJChhKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGF8fFwiYm9vbGVhblwiPT09dHlwZW9mIGF8fFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gYTtcbmlmKHZvaWQgMCE9PWEpcmV0dXJuIGEudn07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnJlbWFwVG9Kc1wiLFNrLmZmaS5yZW1hcFRvSnMpO1NrLmZmaS5jYWxsYmFjaz1mdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9hOmZ1bmN0aW9uKCl7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5KGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5jYWxsYmFja1wiLFNrLmZmaS5jYWxsYmFjayk7U2suZmZpLnN0ZHdyYXA9ZnVuY3Rpb24oYSxjKXthPW5ldyBhO2Eudj1jO3JldHVybiBhfTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkuc3Rkd3JhcFwiLFNrLmZmaS5zdGR3cmFwKTtTay5mZmkuYmFzaWN3cmFwPWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKXJldHVybiBTay5idWlsdGluLmFzbnVtJChhKTtcbmlmKFwibnVtYmVyXCI9PT10eXBlb2YgYXx8XCJib29sZWFuXCI9PT10eXBlb2YgYSlyZXR1cm4gYTtpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKTtTay5hc3NlcnRzLmZhaWwoXCJ1bmV4cGVjdGVkIHR5cGUgZm9yIGJhc2ljd3JhcFwiKX07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLmJhc2ljd3JhcFwiLFNrLmZmaS5iYXNpY3dyYXApO1NrLmZmaS51bndyYXBvPWZ1bmN0aW9uKGEpe2lmKHZvaWQgMCE9PWEpcmV0dXJuIGEudn07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnVud3JhcG9cIixTay5mZmkudW53cmFwbyk7U2suZmZpLnVud3JhcG49ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hP251bGw6YS52fTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkudW53cmFwblwiLFNrLmZmaS51bndyYXBuKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixlKXthPXZvaWQgMD09PWE/YTpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhKTtiPXZvaWQgMD09PVxuYj9iOlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGIpO2U9dm9pZCAwPT09ZT9lOlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGUpO2lmKHZvaWQgMD09PWImJnZvaWQgMD09PWUpYj1hLGE9MCxlPTE7ZWxzZSBpZih2b2lkIDA9PT1lKWU9MTtlbHNlIGlmKDA9PT1lKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJyYW5nZSgpIHN0ZXAgYXJndW1lbnQgbXVzdCBub3QgYmUgemVyb1wiKTtjb25zdCBkPVtdO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSYmXCJudW1iZXJcIj09PXR5cGVvZiBiJiZcIm51bWJlclwiPT09dHlwZW9mIGUpaWYoMDxlKWZvcih2YXIgZj1hO2Y8YjtmKz1lKWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGYpKTtlbHNlIGZvcihmPWE7Zj5iO2YrPWUpZC5wdXNoKG5ldyBTay5idWlsdGluLmludF8oZikpO2Vsc2V7YT1mPUpTQkkuQmlnSW50KGEpO2U9SlNCSS5CaWdJbnQoZSk7Yj1KU0JJLkJpZ0ludChiKTtpZihKU0JJLmdyZWF0ZXJUaGFuKGUsSlNCSS5fX1pFUk8pKWZvcig7SlNCSS5sZXNzVGhhbihmLFxuYik7KWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGMoZikpKSxmPUpTQkkuYWRkKGYsZSk7ZWxzZSBmb3IoO0pTQkkuZ3JlYXRlclRoYW4oZixiKTspZC5wdXNoKG5ldyBTay5idWlsdGluLmludF8oYyhmKSkpLGY9SlNCSS5hZGQoZixlKTthPWMoYSk7ZT1jKGUpO2I9YyhiKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ucmFuZ2VfKGEsYixlLGQpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIEpTQkkubGVzc1RoYW4oYSxKU0JJLl9fTUFYX1NBRkUpJiZKU0JJLmdyZWF0ZXJUaGFuKGEsSlNCSS5fX01JTl9TQUZFKT9KU0JJLnRvTnVtYmVyKGEpOmF9U2suYnVpbHRpbi5yYW5nZV89U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInJhbmdlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuc3RhcnQ9YTt0aGlzLnN0b3A9Yjt0aGlzLnN0ZXA9Yzt0aGlzLnY9ZH0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsXG50cCRkb2M6XCJyYW5nZShzdG9wKSAtPiByYW5nZSBvYmplY3RcXG5yYW5nZShzdGFydCwgc3RvcFssIHN0ZXBdKSAtPiByYW5nZSBvYmplY3RcXG5cXG5SZXR1cm4gYW4gb2JqZWN0IHRoYXQgcHJvZHVjZXMgYSBzZXF1ZW5jZSBvZiBpbnRlZ2VycyBmcm9tIHN0YXJ0IChpbmNsdXNpdmUpXFxudG8gc3RvcCAoZXhjbHVzaXZlKSBieSBzdGVwLiAgcmFuZ2UoaSwgaikgcHJvZHVjZXMgaSwgaSsxLCBpKzIsIC4uLiwgai0xLlxcbnN0YXJ0IGRlZmF1bHRzIHRvIDAsIGFuZCBzdG9wIGlzIG9taXR0ZWQhICByYW5nZSg0KSBwcm9kdWNlcyAwLCAxLCAyLCAzLlxcblRoZXNlIGFyZSBleGFjdGx5IHRoZSB2YWxpZCBpbmRpY2VzIGZvciBhIGxpc3Qgb2YgNCBlbGVtZW50cy5cXG5XaGVuIHN0ZXAgaXMgZ2l2ZW4sIGl0IHNwZWNpZmllcyB0aGUgaW5jcmVtZW50IChvciBkZWNyZW1lbnQpLlwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJyYW5nZVwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInJhbmdlXCIsXG5iLDEsMyk7cmV0dXJuIGEoYlswXSxiWzFdLGJbMl0pfSwkcigpe2xldCBhPVwicmFuZ2UoXCIrdGhpcy5zdGFydCtcIiwgXCIrdGhpcy5zdG9wOzEhPXRoaXMuc3RlcCYmKGErPVwiLCBcIit0aGlzLnN0ZXApO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYStcIilcIil9LHRwJHJpY2hjb21wYXJlKGEsYil7aWYoXCJFcVwiIT09YiYmXCJOb3RFcVwiIT09Ynx8YS5vYiR0eXBlIT09U2suYnVpbHRpbi5yYW5nZV8pcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2E9bmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYpO3JldHVybihuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMudikpLnRwJHJpY2hjb21wYXJlKGEsYil9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGIodGhpcyl9LG5iJGJvb2woKXtyZXR1cm4gMCE9PXRoaXMudi5sZW5ndGh9LHNxJGNvbnRhaW5zKGEpe2NvbnN0IGI9dGhpcy52O2ZvcihsZXQgYz0wO2M8Yi5sZW5ndGg7YysrKWlmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLFxuYltjXSxcIkVxXCIpKXJldHVybiEwO3JldHVybiExfSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy52Lmxlbmd0aH0sbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpOzA+YSYmKGE9dGhpcy52Lmxlbmd0aCthKTtpZigwPmF8fGE+PXRoaXMudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcInJhbmdlIG9iamVjdCBpbmRleCBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIHRoaXMudlthXX1pZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5zbGljZSl7Y29uc3QgYj1bXSxjPXRoaXMudjthLnNzc2l0ZXIkKGMubGVuZ3RoLGE9PntiLnB1c2goY1thXSl9KTtsZXQge3N0YXJ0OmQsc3RvcDplLHN0ZXA6Zn09YS5zbGljZSRpbmRpY2VzKGMubGVuZ3RoKTtkPVNrLm1pc2NldmFsLmFzSW5kZXgoY1tkXSl8fHRoaXMuc3RhcnQ7ZT1Tay5taXNjZXZhbC5hc0luZGV4KGNbZV0pfHx0aGlzLnN0b3A7Zj1cblwibnVtYmVyXCI9PT10eXBlb2YgdGhpcy5zdGVwP2YqdGhpcy5zdGVwOkpTQkkubXVsdGlwbHkodGhpcy5zdGVwLEpTQkkuQmlnSW50KGYpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ucmFuZ2VfKGQsZSxmLGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInJhbmdlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fX0sZ2V0c2V0czp7c3RhcnQ6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnN0YXJ0KX19LHN0ZXA6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnN0ZXApfX0sc3RvcDp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuc3RvcCl9fX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgZSh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiBhIHJldmVyc2UgaXRlcmF0b3IuXCJ9LFxuY291bnQ6eyRtZXRoKGEpe2xldCBiPTA7Zm9yKGxldCBjPTA7Yzx0aGlzLnYubGVuZ3RoO2MrKylTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSx0aGlzLnZbY10sXCJFcVwiKSYmYisrO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwicmFuZ2VvYmplY3QuY291bnQodmFsdWUpIC0+IGludGVnZXIgLS0gcmV0dXJuIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB2YWx1ZVwifSxpbmRleDp7JG1ldGgoYSl7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSx0aGlzLnZbYl0sXCJFcVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXCJpcyBub3QgaW4gcmFuZ2VcIik7fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwicmFuZ2VvYmplY3QuaW5kZXgodmFsdWUsIFtzdGFydCwgW3N0b3BdXSkgLT4gaW50ZWdlciAtLSByZXR1cm4gaW5kZXggb2YgdmFsdWUuXFxuUmFpc2UgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuXCJ9fSxcbnByb3RvOntzayRhc2FycmF5KCl7cmV0dXJuIHRoaXMudi5zbGljZSgwKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7dmFyIGI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwicmFuZ2VfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe3JldHVybiB0aGlzLiRzZXFbdGhpcy4kaW5kZXgrK119LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pLGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwicmFuZ2VfcmV2ZXJzZWl0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJHNlcT1hLnY7dGhpcy4kaW5kZXg9dGhpcy4kc2VxLmxlbmd0aC0xfSxpdGVybmV4dCgpe3JldHVybiB0aGlzLiRzZXFbdGhpcy4kaW5kZXgtLV19LFxubWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4ucmFuZ2U9U2suYnVpbHRpbi54cmFuZ2U9ZnVuY3Rpb24oYixjLGUpe2I9YShiLGMsZSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYi52KX19LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5lbnVtZXJhdGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiZW51bWVyYXRlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7aWYoISh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5lbnVtZXJhdGUpKXRocm93IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ2VudW1lcmF0ZSc6IFBsZWFzZSB1c2UgdGhlICduZXcnIG9wZXJhdG9yXCIpO3RoaXMuJGl0ZXJhYmxlPWE7dGhpcy4kaW5kZXg9YztyZXR1cm4gdGhpc30saXRlcm5leHQoYSl7Y29uc3QgYz1Tay5taXNjZXZhbC5jaGFpbih0aGlzLiRpdGVyYWJsZS50cCRpdGVybmV4dChhKSxcbmE9PntpZih2b2lkIDAhPT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpbmRleCsrKSxhXSl9KTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX0sc2xvdHM6e3RwJGRvYzpcIlJldHVybiBhbiBlbnVtZXJhdGUgb2JqZWN0LlxcblxcbiAgaXRlcmFibGVcXG4gICAgYW4gb2JqZWN0IHN1cHBvcnRpbmcgaXRlcmF0aW9uXFxuXFxuVGhlIGVudW1lcmF0ZSBvYmplY3QgeWllbGRzIHBhaXJzIGNvbnRhaW5pbmcgYSBjb3VudCAoZnJvbSBzdGFydCwgd2hpY2hcXG5kZWZhdWx0cyB0byB6ZXJvKSBhbmQgYSB2YWx1ZSB5aWVsZGVkIGJ5IHRoZSBpdGVyYWJsZSBhcmd1bWVudC5cXG5cXG5lbnVtZXJhdGUgaXMgdXNlZnVsIGZvciBvYnRhaW5pbmcgYW4gaW5kZXhlZCBsaXN0OlxcbiAgICAoMCwgc2VxWzBdKSwgKDEsIHNlcVsxXSksICgyLCBzZXFbMl0pLCAuLi5cIix0cCRuZXcoYSxjKXtsZXQgW2IsXG5lXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImVudW1lcmF0ZVwiLFtcIml0ZXJhYmxlXCIsXCJzdGFydFwiXSxhLGMsW25ldyBTay5idWlsdGluLmludF8oMCldKTtiPVNrLmFic3RyLml0ZXIoYik7ZT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhlKTtpZih0aGlzPT09U2suYnVpbHRpbi5lbnVtZXJhdGUucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5lbnVtZXJhdGUoYixlKTthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4uZW51bWVyYXRlLmNhbGwoYSxiLGUpO3JldHVybiBhfX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmVudW1lcmF0ZVwiLFNrLmJ1aWx0aW4uZW51bWVyYXRlKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZpbHRlcl89U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiZmlsdGVyXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy4kZnVuYz1hO3RoaXMuJGl0ZXJhYmxlPWN9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9XG5Tay5taXNjZXZhbC5pdGVyRm9yKHRoaXMuJGl0ZXJhYmxlLGE9PlNrLm1pc2NldmFsLmNoYWluKHRoaXMuY2hlY2skZmlsdGVyKGEpLGE9PmE/bmV3IFNrLm1pc2NldmFsLkJyZWFrKGEpOnZvaWQgMCkpO3JldHVybiBhP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfSxzbG90czp7dHAkZG9jOlwiUmV0dXJuIGFuIGl0ZXJhdG9yIHlpZWxkaW5nIHRob3NlIGl0ZW1zIG9mIGl0ZXJhYmxlIGZvciB3aGljaCBmdW5jdGlvbihpdGVtKVxcbmlzIHRydWUuIElmIGZ1bmN0aW9uIGlzIE5vbmUsIHJldHVybiB0aGUgaXRlbXMgdGhhdCBhcmUgdHJ1ZS5cIix0cCRuZXcoYSxjKXtsZXQgW2IsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJmaWx0ZXJcIixbXCJwcmVkaWNhdGVcIixcIml0ZXJhYmxlXCJdLGEsYyxbXSk7Yj1Tay5idWlsdGluLmNoZWNrTm9uZShiKT9udWxsOmI7ZT1Tay5hYnN0ci5pdGVyKGUpO2lmKHRoaXM9PT1Tay5idWlsdGluLmZpbHRlcl8ucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5maWx0ZXJfKGIsXG5lKTthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4uZmlsdGVyXy5jYWxsKGEsYixlKTtyZXR1cm4gYX19LHByb3RvOntjaGVjayRmaWx0ZXIoYSl7bGV0IGM7Yz1udWxsPT09dGhpcy4kZnVuYz9hOlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLiRmdW5jLFthXSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGMsYj0+U2subWlzY2V2YWwuaXNUcnVlKGIpP2E6dm9pZCAwKX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5maWx0ZXJfXCIsU2suYnVpbHRpbi5maWx0ZXJfKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLm1hcF89U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwibWFwXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy4kZnVuYz1hO3RoaXMuJGl0ZXJzPWN9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9W10sYj1Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkodGhpcy4kaXRlcnMsYj0+U2subWlzY2V2YWwuY2hhaW4oYi50cCRpdGVybmV4dChhKSxcbmE9PntpZih2b2lkIDA9PT1hKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoITApO2MucHVzaChhKX0pKSxhPT5hP3ZvaWQgMDpTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkodGhpcy4kZnVuYyxjKSk7cmV0dXJuIGE/YjpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYil9LHNsb3RzOnt0cCRkb2M6XCJtYXAoZnVuYywgKml0ZXJhYmxlcykgLS1cXHgzZSBtYXAgb2JqZWN0XFxuXFxuTWFrZSBhbiBpdGVyYXRvciB0aGF0IGNvbXB1dGVzIHRoZSBmdW5jdGlvbiB1c2luZyBhcmd1bWVudHMgZnJvbVxcbmVhY2ggb2YgdGhlIGl0ZXJhYmxlcy4gIFN0b3BzIHdoZW4gdGhlIHNob3J0ZXN0IGl0ZXJhYmxlIGlzIGV4aGF1c3RlZC5cIix0cCRuZXcoYSxjKXt0aGlzPT09U2suYnVpbHRpbi5tYXBfLnByb3RvdHlwZSYmU2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1hcFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcIm1hcFwiLGEsMik7Yz1hWzBdO2NvbnN0IGI9XG5bXTtmb3IobGV0IGM9MTtjPGEubGVuZ3RoO2MrKyliLnB1c2goU2suYWJzdHIuaXRlcihhW2NdKSk7aWYodGhpcz09PVNrLmJ1aWx0aW4ubWFwXy5wcm90b3R5cGUpcmV0dXJuIG5ldyBTay5idWlsdGluLm1hcF8oYyxiKTthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4ubWFwXy5jYWxsKGEsYyxiKTtyZXR1cm4gYX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYXBfXCIsU2suYnVpbHRpbi5tYXBfKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnJldmVyc2VkPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInJldmVyc2VkXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGlkeD1hLnNxJGxlbmd0aCgpLTE7dGhpcy4kc2VxPWE7cmV0dXJuIHRoaXN9LGl0ZXJuZXh0KGEpe2lmKCEoMD50aGlzLiRpZHgpKXt2YXIgYz1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+U2suYWJzdHIub2JqZWN0R2V0SXRlbSh0aGlzLiRzZXEsbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpZHgtLSksXG5hKSxhPT57aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uSW5kZXhFcnJvcil0aGlzLiRpZHg9LTE7ZWxzZSB0aHJvdyBhO30pO3JldHVybiBhP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfX0sc2xvdHM6e3RwJGRvYzpcIlJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBzZXF1ZW5jZS5cIix0cCRuZXcoYSxjKXt0aGlzPT09U2suYnVpbHRpbi5yZXZlcnNlZC5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJyZXZlcnNlZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInJldmVyc2VkXCIsYSwxLDEpO2E9YVswXTtjPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kcmV2ZXJzZWQpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtpZighU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpfHx2b2lkIDA9PT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsXG5Tay5idWlsdGluLnN0ci4kbGVuKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBpcyBub3QgYSBzZXF1ZW5jZVwiKTtpZih0aGlzPT09U2suYnVpbHRpbi5yZXZlcnNlZC5wcm90b3R5cGUpcmV0dXJuIG5ldyBTay5idWlsdGluLnJldmVyc2VkKGEpO2M9bmV3IHRoaXMuY29uc3RydWN0b3I7U2suYnVpbHRpbi5yZXZlcnNlZC5jYWxsKGMsYSk7cmV0dXJuIGN9fSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PXRoaXMuJGlkeD9uZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJGlkeCk6bmV3IFNrLmJ1aWx0aW4uaW50XygwKX0sJGZsYWdzOntOb0FyZ3M6ITB9fX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnppcF89U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiemlwXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGl0ZXJzPWE7MD09PWEubGVuZ3RoJiZcbih0aGlzLnRwJGl0ZXJuZXh0PSgpPT57fSl9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9W10sYj1Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkodGhpcy4kaXRlcnMsYj0+U2subWlzY2V2YWwuY2hhaW4oYi50cCRpdGVybmV4dChhKSxhPT57aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTtjLnB1c2goYSl9KSksYT0+YT92b2lkIDA6bmV3IFNrLmJ1aWx0aW4udHVwbGUoYykpO3JldHVybiBhP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfSxzbG90czp7dHAkZG9jOlwiemlwKGl0ZXIxIFssaXRlcjIgWy4uLl1dKSAtLVxceDNlIHppcCBvYmplY3RcXG5cXG5SZXR1cm4gYSB6aXAgb2JqZWN0IHdob3NlIC5fX25leHRfXygpIG1ldGhvZCByZXR1cm5zIGEgdHVwbGUgd2hlcmVcXG50aGUgaS10aCBlbGVtZW50IGNvbWVzIGZyb20gdGhlIGktdGggaXRlcmFibGUgYXJndW1lbnQuICBUaGUgLl9fbmV4dF9fKClcXG5tZXRob2QgY29udGludWVzIHVudGlsIHRoZSBzaG9ydGVzdCBpdGVyYWJsZSBpbiB0aGUgYXJndW1lbnQgc2VxdWVuY2VcXG5pcyBleGhhdXN0ZWQgYW5kIHRoZW4gaXQgcmFpc2VzIFN0b3BJdGVyYXRpb24uXCIsXG50cCRuZXcoYSxjKXt0aGlzPT09U2suYnVpbHRpbi56aXBfLnByb3RvdHlwZSYmU2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInppcFwiLGMpO2M9W107Zm9yKGxldCBiPTA7YjxhLmxlbmd0aDtiKyspdHJ5e2MucHVzaChTay5hYnN0ci5pdGVyKGFbYl0pKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgU2suYnVpbHRpbi5UeXBlRXJyb3IpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiemlwIGFyZ3VtZW50ICNcIisoYisxKStcIiBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uXCIpO3Rocm93IGU7fWlmKHRoaXM9PT1Tay5idWlsdGluLnppcF8ucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi56aXBfKGMpO2E9bmV3IHRoaXMuY29uc3RydWN0b3I7U2suYnVpbHRpbi56aXBfLmNhbGwoYSxjKTtyZXR1cm4gYX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi56aXBfXCIsU2suYnVpbHRpbi56aXBfKX0sZnVuY3Rpb24obSxxKXt2YXIgYT17VF9FTkRNQVJLRVI6MCxUX05BTUU6MSxcblRfTlVNQkVSOjIsVF9TVFJJTkc6MyxUX05FV0xJTkU6NCxUX0lOREVOVDo1LFRfREVERU5UOjYsVF9MUEFSOjcsVF9SUEFSOjgsVF9MU1FCOjksVF9SU1FCOjEwLFRfQ09MT046MTEsVF9DT01NQToxMixUX1NFTUk6MTMsVF9QTFVTOjE0LFRfTUlOVVM6MTUsVF9TVEFSOjE2LFRfU0xBU0g6MTcsVF9WQkFSOjE4LFRfQU1QRVI6MTksVF9MRVNTOjIwLFRfR1JFQVRFUjoyMSxUX0VRVUFMOjIyLFRfRE9UOjIzLFRfUEVSQ0VOVDoyNCxUX0xCUkFDRToyNSxUX1JCUkFDRToyNixUX0VRRVFVQUw6MjcsVF9OT1RFUVVBTDoyOCxUX0xFU1NFUVVBTDoyOSxUX0dSRUFURVJFUVVBTDozMCxUX1RJTERFOjMxLFRfQ0lSQ1VNRkxFWDozMixUX0xFRlRTSElGVDozMyxUX1JJR0hUU0hJRlQ6MzQsVF9ET1VCTEVTVEFSOjM1LFRfUExVU0VRVUFMOjM2LFRfTUlORVFVQUw6MzcsVF9TVEFSRVFVQUw6MzgsVF9TTEFTSEVRVUFMOjM5LFRfUEVSQ0VOVEVRVUFMOjQwLFRfQU1QRVJFUVVBTDo0MSxUX1ZCQVJFUVVBTDo0MixcblRfQ0lSQ1VNRkxFWEVRVUFMOjQzLFRfTEVGVFNISUZURVFVQUw6NDQsVF9SSUdIVFNISUZURVFVQUw6NDUsVF9ET1VCTEVTVEFSRVFVQUw6NDYsVF9ET1VCTEVTTEFTSDo0NyxUX0RPVUJMRVNMQVNIRVFVQUw6NDgsVF9BVDo0OSxUX0FURVFVQUw6NTAsVF9SQVJST1c6NTEsVF9FTExJUFNJUzo1MixUX09QOjUzLFRfQVdBSVQ6NTQsVF9BU1lOQzo1NSxUX0VSUk9SVE9LRU46NTYsVF9OVF9PRkZTRVQ6MjU2LFRfTl9UT0tFTlM6NjAsVF9DT01NRU5UOjU3LFRfTkw6NTgsVF9FTkNPRElORzo1OX07bT17XCIhPVwiOmEuVF9OT1RFUVVBTCxcIiVcIjphLlRfUEVSQ0VOVCxcIiU9XCI6YS5UX1BFUkNFTlRFUVVBTCxcIiZcIjphLlRfQU1QRVIsXCImPVwiOmEuVF9BTVBFUkVRVUFMLFwiKFwiOmEuVF9MUEFSLFwiKVwiOmEuVF9SUEFSLFwiKlwiOmEuVF9TVEFSLFwiKipcIjphLlRfRE9VQkxFU1RBUixcIioqPVwiOmEuVF9ET1VCTEVTVEFSRVFVQUwsXCIqPVwiOmEuVF9TVEFSRVFVQUwsXCIrXCI6YS5UX1BMVVMsXCIrPVwiOmEuVF9QTFVTRVFVQUwsXG5cIixcIjphLlRfQ09NTUEsXCItXCI6YS5UX01JTlVTLFwiLT1cIjphLlRfTUlORVFVQUwsXCItPlwiOmEuVF9SQVJST1csXCIuXCI6YS5UX0RPVCxcIi4uLlwiOmEuVF9FTExJUFNJUyxcIi9cIjphLlRfU0xBU0gsXCIvL1wiOmEuVF9ET1VCTEVTTEFTSCxcIi8vPVwiOmEuVF9ET1VCTEVTTEFTSEVRVUFMLFwiLz1cIjphLlRfU0xBU0hFUVVBTCxcIjpcIjphLlRfQ09MT04sXCI7XCI6YS5UX1NFTUksXCI8XCI6YS5UX0xFU1MsXCI8PFwiOmEuVF9MRUZUU0hJRlQsXCI8PD1cIjphLlRfTEVGVFNISUZURVFVQUwsXCI8PVwiOmEuVF9MRVNTRVFVQUwsXCI9XCI6YS5UX0VRVUFMLFwiPT1cIjphLlRfRVFFUVVBTCxcIj5cIjphLlRfR1JFQVRFUixcIj49XCI6YS5UX0dSRUFURVJFUVVBTCxcIj4+XCI6YS5UX1JJR0hUU0hJRlQsXCI+Pj1cIjphLlRfUklHSFRTSElGVEVRVUFMLFwiQFwiOmEuVF9BVCxcIkA9XCI6YS5UX0FURVFVQUwsXCJbXCI6YS5UX0xTUUIsXCJdXCI6YS5UX1JTUUIsXCJeXCI6YS5UX0NJUkNVTUZMRVgsXCJePVwiOmEuVF9DSVJDVU1GTEVYRVFVQUwsXCJ7XCI6YS5UX0xCUkFDRSxcblwifFwiOmEuVF9WQkFSLFwifD1cIjphLlRfVkJBUkVRVUFMLFwifVwiOmEuVF9SQlJBQ0UsXCJ+XCI6YS5UX1RJTERFfTt2YXIgYz17fTsoZnVuY3Rpb24oKXtmb3IodmFyIGIgaW4gYSljW2FbYl1dPWJ9KSgpO1tcInRva19uYW1lXCIsXCJJU1RFUk1JTkFMXCIsXCJJU05PTlRFUk1JTkFMXCIsXCJJU0VPRlwiXS5jb25jYXQoT2JqZWN0LmtleXMoYykubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBjW2FdfSkpO1NrLnRva2VuPXt9O1NrLnRva2VuLnRva2Vucz1hO1NrLnRva2VuLnRva19uYW1lPWM7U2sudG9rZW4uRVhBQ1RfVE9LRU5fVFlQRVM9bTtTay50b2tlbi5JU1RFUk1JTkFMPWZ1bmN0aW9uKGIpe3JldHVybiBiPGEuVF9OVF9PRkZTRVR9O1NrLnRva2VuLklTTk9OVEVSTUlOQUw9ZnVuY3Rpb24oYil7cmV0dXJuIGI+PWEuVF9OVF9PRkZTRVR9O1NrLnRva2VuLklTRU9GPWZ1bmN0aW9uKGIpe3JldHVybiBiPT1hLlRfRU5ETUFSS0VSfTtTay5leHBvcnRTeW1ib2woXCJTay50b2tlblwiLFNrLnRva2VuKTtTay5leHBvcnRTeW1ib2woXCJTay50b2tlbi50b2tlbnNcIixcblNrLnRva2VuLnRva2Vucyk7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4udG9rX25hbWVcIixTay50b2tlbi50b2tfbmFtZSk7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4uRVhBQ1RfVE9LRU5fVFlQRVNcIik7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4uSVNURVJNSU5BTFwiLFNrLnRva2VuLklTVEVSTUlOQUwpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLklTTk9OVEVSTUlOQUxcIixTay50b2tlbi5JU05PTlRFUk1JTkFMKTtTay5leHBvcnRTeW1ib2woXCJTay50b2tlbi5JU0VPRlwiLFNrLnRva2VuLklTRU9GKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjLGQsZSl7dGhpcy50eXBlPWE7dGhpcy5zdHJpbmc9Yjt0aGlzLnN0YXJ0PWM7dGhpcy5lbmQ9ZDt0aGlzLmxpbmU9ZX1mdW5jdGlvbiBjKGEpe3JldHVyblwiKFwiK0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbihcInxcIikrXCIpXCJ9ZnVuY3Rpb24gYihhKXtyZXR1cm4gYy5hcHBseShudWxsLGFyZ3VtZW50cykrXG5cIj9cIn1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoO2MtLTspaWYoYVtjXT09PWIpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gZigpe3JldHVyblwiIEZSIFJGIEJyIEJSIEZyIHIgQiBSIGIgYlIgZiByYiByQiBGIFJmIFUgckYgdSBSQiBiciBmUiBmciByZiBSYlwiLnNwbGl0KFwiIFwiKX1mdW5jdGlvbiBsKGEpe2E/ZGVsZXRlIFNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW1wiPD5cIl06U2sudG9rZW4uRVhBQ1RfVE9LRU5fVFlQRVNbXCI8PlwiXT1Tay50b2tlbi50b2tlbnMuVF9OT1RFUVVBTDt0PU9iamVjdC5rZXlzKFNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTKS5zb3J0KCk7dj1jLmFwcGx5KHRoaXMsdC5yZXZlcnNlKCkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhJiZrLnRlc3QoYSk/YS5yZXBsYWNlKG4sXCJcXFxcJCZcIik6YX0pKTtCPWMoXCJcXFxccj9cXFxcblwiLHYpfXZhciBoPVNrLnRva2VuLnRva2Vucztjb25zdCBkPVNrLmJ1aWx0aW4uU3ludGF4RXJyb3IsZz1Tay5idWlsdGluLlN5bnRheEVycm9yO1xuYS5wcm90b3R5cGUuZXhhY3RfdHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGU9PWguVF9PUCYmdGhpcy5zdHJpbmcgaW4gU2sudG9rZW4uRVhBQ1RfVE9LRU5fVFlQRVM/U2sudG9rZW4uRVhBQ1RfVE9LRU5fVFlQRVNbdGhpcy5zdHJpbmddOnRoaXMudHlwZX07dmFyIG49L1tcXFxcXiQuKis/KClbXFxde318XS9nLGs9UmVnRXhwKG4uc291cmNlKTtjb25zdCBwPWZ1bmN0aW9uKCl7dmFyIGE9YyhcIltBLVpdXCIsXCJbYS16XVwiLFwiW1xcXFx1ezEwQjk5fS1cXFxcdXsxMEI5Q31cXFxcdXsxMTJBOX1cXFxcdXsxMTVEQ30tXFxcXHV7MTE1RER9XFxcXHUwMzRGXFxcXHUxMTVGLVxcXFx1MTE2MFxcXFx1MTdCNC1cXFxcdTE3QjVcXFxcdTIwNjVcXFxcdTMxNjRcXFxcdUZGQTBcXFxcdUZGRjAtXFxcXHVGRkY4XFxcXHV7RTAwMDB9XFxcXHV7RTAwMDJ9LVxcXFx1e0UwMDFGfVxcXFx1e0UwMDgwfS1cXFxcdXtFMDBGRn1cXFxcdXtFMDFGMH0tXFxcXHV7RTBGRkZ9XFxcXHV7MTEyQTl9XFxcXHUwMEQ3XVwiLFwiW1xcXFx1MDJCMC1cXFxcdTAyQzFcXFxcdTAyQzYtXFxcXHUwMkQxXFxcXHUwMkUwLVxcXFx1MDJFNFxcXFx1MDJFQ1xcXFx1MDJFRVxcXFx1MDM3NFxcXFx1MDM3QVxcXFx1MDU1OVxcXFx1MDZFNS1cXFxcdTA2RTZcXFxcdTA3RjQtXFxcXHUwN0Y1XFxcXHUwOTcxXFxcXHUxQzc4LVxcXFx1MUM3RFxcXFx1MUQyQy1cXFxcdTFENkFcXFxcdTFERkQtXFxcXHUxREZGXFxcXHUyRTJGXFxcXHUzMEZDXFxcXHVBNjdGXFxcXHVBNjlDLVxcXFx1QTY5RFxcXFx1QTcxNy1cXFxcdUE3MUZcXFxcdUE3ODhcXFxcdUE3RjgtXFxcXHVBN0Y5XFxcXHVBQjVDLVxcXFx1QUI1RlxcXFx1RkY3MFxcXFx1RkY5RS1cXFxcdUZGOUZcXFxcdXsxNkY5M30tXFxcXHV7MTZGOUZ9XFxcXHUwMkQwLVxcXFx1MDJEMVxcXFx1MDY0MFxcXFx1MDdGQVxcXFx1MEU0NlxcXFx1MEVDNlxcXFx1MTg0M1xcXFx1MUFBN1xcXFx1MUM3QlxcXFx1MzAwNVxcXFx1MzAzMS1cXFxcdTMwMzVcXFxcdTMwOUQtXFxcXHUzMDlFXFxcXHUzMEZDLVxcXFx1MzBGRVxcXFx1QTAxNVxcXFx1QTYwQ1xcXFx1QTlDRlxcXFx1QTlFNlxcXFx1QUE3MFxcXFx1QUFERFxcXFx1QUFGMy1cXFxcdUFBRjRcXFxcdUZGNzBcXFxcdXsxNkI0Mn0tXFxcXHV7MTZCNDN9XFxcXHV7MTZGRTB9LVxcXFx1ezE2RkUxfVxcXFx1MDJCMC1cXFxcdTAyQjhcXFxcdTAyQzAtXFxcXHUwMkMxXFxcXHUwMkUwLVxcXFx1MDJFNFxcXFx1MDM3QVxcXFx1MUQyQy1cXFxcdTFENkFcXFxcdTFENzhcXFxcdTFEOUItXFxcXHUxREJGXFxcXHUyMDcxXFxcXHUyMDdGXFxcXHUyMDkwLVxcXFx1MjA5Q1xcXFx1MkM3Qy1cXFxcdTJDN0RcXFxcdUE2OUMtXFxcXHVBNjlEXFxcXHVBNzcwXFxcXHVBN0Y4LVxcXFx1QTdGOVxcXFx1QUI1Qy1cXFxcdUFCNUZcXFxcdUZGOUUtXFxcXHVGRjlGXFxcXHUwMkIyXFxcXHUxRDYyXFxcXHUxREE0XFxcXHUxREE4XFxcXHUyMDcxXFxcXHUyQzdDXFxcXHUyRTE4LVxcXFx1MkUxOVxcXFx1MkUyRl1cIixcblwiW1xcXFx1MjEzNS1cXFxcdTIxMzhcXFxcdXsxRUUwMH0tXFxcXHV7MUVFMDN9XFxcXHV7MUVFMDV9LVxcXFx1ezFFRTFGfVxcXFx1ezFFRTIxfS1cXFxcdXsxRUUyMn1cXFxcdXsxRUUyNH1cXFxcdXsxRUUyN31cXFxcdXsxRUUyOX0tXFxcXHV7MUVFMzJ9XFxcXHV7MUVFMzR9LVxcXFx1ezFFRTM3fVxcXFx1ezFFRTM5fVxcXFx1ezFFRTNCfVxcXFx1ezFFRTQyfVxcXFx1ezFFRTQ3fVxcXFx1ezFFRTQ5fVxcXFx1ezFFRTRCfVxcXFx1ezFFRTREfS1cXFxcdXsxRUU0Rn1cXFxcdXsxRUU1MX0tXFxcXHV7MUVFNTJ9XFxcXHV7MUVFNTR9XFxcXHV7MUVFNTd9XFxcXHV7MUVFNTl9XFxcXHV7MUVFNUJ9XFxcXHV7MUVFNUR9XFxcXHV7MUVFNUZ9XFxcXHV7MUVFNjF9LVxcXFx1ezFFRTYyfVxcXFx1ezFFRTY0fVxcXFx1ezFFRTY3fS1cXFxcdXsxRUU2QX1cXFxcdXsxRUU2Q30tXFxcXHV7MUVFNzJ9XFxcXHV7MUVFNzR9LVxcXFx1ezFFRTc3fVxcXFx1ezFFRTc5fS1cXFxcdXsxRUU3Q31cXFxcdXsxRUU3RX1cXFxcdXsxRUU4MH0tXFxcXHV7MUVFODl9XFxcXHV7MUVFOEJ9LVxcXFx1ezFFRTlCfVxcXFx1ezFFRUExfS1cXFxcdXsxRUVBM31cXFxcdXsxRUVBNX0tXFxcXHV7MUVFQTl9XFxcXHV7MUVFQUJ9LVxcXFx1ezFFRUJCfVxcXFx1MzAwNlxcXFx1MzQwMC1cXFxcdTREQjVcXFxcdTRFMDAtXFxcXHU5RkVGXFxcXHVGOTAwLVxcXFx1RkE2RFxcXFx1RkE3MC1cXFxcdUZBRDlcXFxcdXsxNzAwMH0tXFxcXHV7MTg3RjF9XFxcXHV7MTg4MDB9LVxcXFx1ezE4QUYyfVxcXFx1ezFCMTcwfS1cXFxcdXsxQjJGQn1cXFxcdXsyMDAwMH0tXFxcXHV7MkE2RDZ9XFxcXHV7MkE3MDB9LVxcXFx1ezJCNzM0fVxcXFx1ezJCNzQwfS1cXFxcdXsyQjgxRH1cXFxcdXsyQjgyMH0tXFxcXHV7MkNFQTF9XFxcXHV7MkNFQjB9LVxcXFx1ezJFQkUwfVxcXFx1ezJGODAwfS1cXFxcdXsyRkExRH1cXFxcdUFBQzBcXFxcdUFBQzJcXFxcdUZFMjAtXFxcXHVGRTJGXFxcXHV7MTBEMjJ9LVxcXFx1ezEwRDIzfVxcXFx1ezExMzVEfVxcXFx1MDBBQVxcXFx1MDBCQVxcXFx1MzQwMC1cXFxcdTREQjVcXFxcdTRFMDAtXFxcXHU5RkVGXFxcXHVGQTBFLVxcXFx1RkEwRlxcXFx1RkExMVxcXFx1RkExMy1cXFxcdUZBMTRcXFxcdUZBMUZcXFxcdUZBMjFcXFxcdUZBMjMtXFxcXHVGQTI0XFxcXHVGQTI3LVxcXFx1RkEyOVxcXFx1ezIwMDAwfS1cXFxcdXsyQTZENn1cXFxcdXsyQTcwMH0tXFxcXHV7MkI3MzR9XFxcXHV7MkI3NDB9LVxcXFx1ezJCODFEfVxcXFx1ezJCODIwfS1cXFxcdXsyQ0VBMX1cXFxcdXsyQ0VCMH0tXFxcXHV7MkVCRTB9XFxcXHUxMTVGLVxcXFx1MTE2MFxcXFx1MzE2NFxcXFx1RkZBMFxcXFx1MDY3M1xcXFx1MTdBMy1cXFxcdTE3QTRcXFxcdTBFNDAtXFxcXHUwRTQ0XFxcXHUwRUMwLVxcXFx1MEVDNFxcXFx1MTlCNS1cXFxcdTE5QjdcXFxcdTE5QkFcXFxcdUFBQjUtXFxcXHVBQUI2XFxcXHVBQUI5XFxcXHVBQUJCLVxcXFx1QUFCQ11cIixcblwiW1xcXFx1MzAwN1xcXFx1MzAyMS1cXFxcdTMwMjlcXFxcdTMwMzgtXFxcXHUzMDNBXFxcXHUyMTcwLVxcXFx1MjE3RlxcXFx1MjE2MC1cXFxcdTIxNkZdXCIsXCJfXCIsXCJbXFxcXHUxODg1LVxcXFx1MTg4NlxcXFx1MjExOFxcXFx1MjEyRVxcXFx1MzA5Qi1cXFxcdTMwOUNdXCIpLGI9YyhhLFwiW1xcXFx1MTA0QS1cXFxcdTEwNEJcXFxcdTEwMkItXFxcXHUxMDJDXFxcXHUxMDJELVxcXFx1MTAzMFxcXFx1MTAzMVxcXFx1MTAzMi1cXFxcdTEwMzZcXFxcdTEwMzhcXFxcdTEwM0ItXFxcXHUxMDNDXFxcXHUxMDNELVxcXFx1MTAzRVxcXFx1MTA1Ni1cXFxcdTEwNTdcXFxcdTEwNTgtXFxcXHUxMDU5XFxcXHUxMDVFLVxcXFx1MTA2MFxcXFx1MTA2MlxcXFx1MTA2Ny1cXFxcdTEwNjhcXFxcdTEwNzEtXFxcXHUxMDc0XFxcXHUxMDgyXFxcXHUxMDgzLVxcXFx1MTA4NFxcXFx1MTA4NS1cXFxcdTEwODZcXFxcdTEwOUNcXFxcdTEwOURcXFxcdTEwMzdcXFxcdTEwMzktXFxcXHUxMDNBXFxcXHUxMDg3LVxcXFx1MTA4Q1xcXFx1MTA4RFxcXFx1MTA4RlxcXFx1MTA5QS1cXFxcdTEwOUJcXFxcdUE5RTVcXFxcdUFBN0JcXFxcdUFBN0NcXFxcdUFBN0RcXFxcdUE5RTZcXFxcdUFBNzBcXFxcdTEwNEEtXFxcXHUxMDRCXVwiLFwiW1xcXFx1MDkwM1xcXFx1MDkzQlxcXFx1MDkzRS1cXFxcdTA5NDBcXFxcdTA5NDktXFxcXHUwOTRDXFxcXHUwOTRFLVxcXFx1MDk0RlxcXFx1MDk4Mi1cXFxcdTA5ODNcXFxcdTA5QkUtXFxcXHUwOUMwXFxcXHUwOUM3LVxcXFx1MDlDOFxcXFx1MDlDQi1cXFxcdTA5Q0NcXFxcdTA5RDdcXFxcdTBBMDNcXFxcdTBBM0UtXFxcXHUwQTQwXFxcXHUwQTgzXFxcXHUwQUJFLVxcXFx1MEFDMFxcXFx1MEFDOVxcXFx1MEFDQi1cXFxcdTBBQ0NcXFxcdTBCMDItXFxcXHUwQjAzXFxcXHUwQjNFXFxcXHUwQjQwXFxcXHUwQjQ3LVxcXFx1MEI0OFxcXFx1MEI0Qi1cXFxcdTBCNENcXFxcdTBCNTdcXFxcdTBCQkUtXFxcXHUwQkJGXFxcXHUwQkMxLVxcXFx1MEJDMlxcXFx1MEJDNi1cXFxcdTBCQzhcXFxcdTBCQ0EtXFxcXHUwQkNDXFxcXHUwQkQ3XFxcXHUwQzAxLVxcXFx1MEMwM1xcXFx1MEM0MS1cXFxcdTBDNDRcXFxcdTBDODItXFxcXHUwQzgzXFxcXHUwQ0JFXFxcXHUwQ0MwLVxcXFx1MENDNFxcXFx1MENDNy1cXFxcdTBDQzhcXFxcdTBDQ0EtXFxcXHUwQ0NCXFxcXHUwQ0Q1LVxcXFx1MENENlxcXFx1MEQwMi1cXFxcdTBEMDNcXFxcdTBEM0UtXFxcXHUwRDQwXFxcXHUwRDQ2LVxcXFx1MEQ0OFxcXFx1MEQ0QS1cXFxcdTBENENcXFxcdTBENTdcXFxcdTBEODItXFxcXHUwRDgzXFxcXHUwRENGLVxcXFx1MEREMVxcXFx1MEREOC1cXFxcdTBEREZcXFxcdTBERjItXFxcXHUwREYzXFxcXHUwRjdGXFxcXHUxMDJCLVxcXFx1MTAyQ1xcXFx1MTAzMVxcXFx1MTAzOFxcXFx1MTAzQi1cXFxcdTEwM0NcXFxcdTEwNTYtXFxcXHUxMDU3XFxcXHUxMDYyXFxcXHUxMDY3LVxcXFx1MTA2OFxcXFx1MTA4My1cXFxcdTEwODRcXFxcdTEwOUNcXFxcdTE3QjZcXFxcdTE3QkUtXFxcXHUxN0M1XFxcXHUxN0M3LVxcXFx1MTdDOFxcXFx1MTkyMy1cXFxcdTE5MjZcXFxcdTE5MjktXFxcXHUxOTJCXFxcXHUxOTMwLVxcXFx1MTkzMVxcXFx1MTkzMy1cXFxcdTE5MzhcXFxcdTFBMTktXFxcXHUxQTFBXFxcXHUxQTU1XFxcXHUxQTU3XFxcXHUxQTYxXFxcXHUxQTYzLVxcXFx1MUE2NFxcXFx1MUE2RC1cXFxcdTFBNzJcXFxcdTFCMDRcXFxcdTFCMzVcXFxcdTFCM0JcXFxcdTFCM0QtXFxcXHUxQjQxXFxcXHUxQjQzXFxcXHUxQjgyXFxcXHUxQkExXFxcXHUxQkE2LVxcXFx1MUJBN1xcXFx1MUJFN1xcXFx1MUJFQS1cXFxcdTFCRUNcXFxcdTFCRUVcXFxcdTFDMjQtXFxcXHUxQzJCXFxcXHUxQzM0LVxcXFx1MUMzNVxcXFx1MUNGMi1cXFxcdTFDRjNcXFxcdUE4MjMtXFxcXHVBODI0XFxcXHVBODI3XFxcXHVBODgwLVxcXFx1QTg4MVxcXFx1QThCNC1cXFxcdUE4QzNcXFxcdUE5NTJcXFxcdUE5ODNcXFxcdUE5QjQtXFxcXHVBOUI1XFxcXHVBOUJBLVxcXFx1QTlCQlxcXFx1QTlCRC1cXFxcdUE5QkZcXFxcdUFBMkYtXFxcXHVBQTMwXFxcXHVBQTMzLVxcXFx1QUEzNFxcXFx1QUE0RFxcXFx1QUFFQlxcXFx1QUFFRS1cXFxcdUFBRUZcXFxcdUFBRjVcXFxcdUFCRTMtXFxcXHVBQkU0XFxcXHVBQkU2LVxcXFx1QUJFN1xcXFx1QUJFOS1cXFxcdUFCRUFcXFxcdXsxMTAwMH1cXFxcdXsxMTAwMn1cXFxcdXsxMTA4Mn1cXFxcdXsxMTBCMH0tXFxcXHV7MTEwQjJ9XFxcXHV7MTEwQjd9LVxcXFx1ezExMEI4fVxcXFx1ezExMTJDfVxcXFx1ezExMTQ1fS1cXFxcdXsxMTE0Nn1cXFxcdXsxMTE4Mn1cXFxcdXsxMTFCM30tXFxcXHV7MTExQjV9XFxcXHV7MTExQkZ9XFxcXHV7MTEyMkN9LVxcXFx1ezExMjJFfVxcXFx1ezExMjMyfS1cXFxcdXsxMTIzM31cXFxcdXsxMTJFMH0tXFxcXHV7MTEyRTJ9XFxcXHV7MTEzMDJ9LVxcXFx1ezExMzAzfVxcXFx1ezExMzNFfS1cXFxcdXsxMTMzRn1cXFxcdXsxMTM0MX0tXFxcXHV7MTEzNDR9XFxcXHV7MTEzNDd9LVxcXFx1ezExMzQ4fVxcXFx1ezExMzRCfS1cXFxcdXsxMTM0Q31cXFxcdXsxMTM1N31cXFxcdXsxMTM2Mn0tXFxcXHV7MTEzNjN9XFxcXHV7MTE0MzV9LVxcXFx1ezExNDM3fVxcXFx1ezExNDQwfS1cXFxcdXsxMTQ0MX1cXFxcdXsxMTQ0NX1cXFxcdXsxMTRCMH0tXFxcXHV7MTE0QjJ9XFxcXHV7MTE0Qjl9XFxcXHV7MTE0QkJ9LVxcXFx1ezExNEJFfVxcXFx1ezExNEMxfVxcXFx1ezExNUFGfS1cXFxcdXsxMTVCMX1cXFxcdXsxMTVCOH0tXFxcXHV7MTE1QkJ9XFxcXHV7MTE1QkV9XFxcXHV7MTE2MzB9LVxcXFx1ezExNjMyfVxcXFx1ezExNjNCfS1cXFxcdXsxMTYzQ31cXFxcdXsxMTYzRX1cXFxcdXsxMTZBQ31cXFxcdXsxMTZBRX0tXFxcXHV7MTE2QUZ9XFxcXHV7MTE3MjB9LVxcXFx1ezExNzIxfVxcXFx1ezExNzI2fVxcXFx1ezExODJDfS1cXFxcdXsxMTgyRX1cXFxcdXsxMTgzOH1cXFxcdXsxMUEzOX1cXFxcdXsxMUE1N30tXFxcXHV7MTFBNTh9XFxcXHV7MTFBOTd9XFxcXHV7MTFDMkZ9XFxcXHV7MTFDM0V9XFxcXHV7MTFDQTl9XFxcXHV7MTFDQjF9XFxcXHV7MTFDQjR9XFxcXHV7MTFEOEF9LVxcXFx1ezExRDhFfVxcXFx1ezExRDkzfS1cXFxcdXsxMUQ5NH1cXFxcdXsxMUQ5Nn1cXFxcdXsxMUVGNX0tXFxcXHV7MTFFRjZ9XFxcXHV7MTZGNTF9LVxcXFx1ezE2RjdFfVxcXFx1MEYzRS1cXFxcdTBGM0ZcXFxcdTEwODctXFxcXHUxMDhDXFxcXHUxMDhGXFxcXHUxMDlBLVxcXFx1MTA5QlxcXFx1MUI0NFxcXFx1MUJBQVxcXFx1MUNFMVxcXFx1MUNGN1xcXFx1MzAyRS1cXFxcdTMwMkZcXFxcdUE5NTNcXFxcdUE5QzBcXFxcdUFBN0JcXFxcdUFBN0RcXFxcdUFCRUNcXFxcdXsxMTFDMH1cXFxcdXsxMTIzNX1cXFxcdXsxMTM0RH1cXFxcdXsxMTZCNn1cXFxcdXsxRDE2RH0tXFxcXHV7MUQxNzJ9XFxcXHUwOUJFXFxcXHUwOUQ3XFxcXHUwQjNFXFxcXHUwQjU3XFxcXHUwQkJFXFxcXHUwQkQ3XFxcXHUwQ0MyXFxcXHUwQ0Q1LVxcXFx1MENENlxcXFx1MEQzRVxcXFx1MEQ1N1xcXFx1MERDRlxcXFx1MERERlxcXFx1MzAyRS1cXFxcdTMwMkZcXFxcdXsxMTMzRX1cXFxcdXsxMTM1N31cXFxcdXsxMTRCMH1cXFxcdXsxMTRCRH1cXFxcdXsxMTVBRn1cXFxcdXsxRDE2NX1cXFxcdXsxRDE2RX0tXFxcXHV7MUQxNzJ9XVwiLFxuXCJbXFxcXHV7MUQ3Q0V9LVxcXFx1ezFEN0ZGfVxcXFx1RkYxMC1cXFxcdUZGMTldXCIsXCJcXFxcdTIwNDBcIixcIltcXFxcdTAwQjdcXFxcdTAzODdcXFxcdTEzNjktXFxcXHUxMzcxXFxcXHUxOURBXVwiKTtpZighMT09PVJlZ0V4cCgpLnVuaWNvZGUpcmV0dXJuIG5ldyBSZWdFeHAoXCJeXCIrYStcIitcIitiK1wiKiRcIixcInVcIik7YT1jKFwiW0EtWl1cIixcIlthLXpdXCIsXCJfXCIpO2I9YyhhLFwiWzAtOV1cIik7cmV0dXJuIG5ldyBSZWdFeHAoXCJeXCIrYStcIitcIitiK1wiKiRcIil9KCk7KGZ1bmN0aW9uKGEpe3JldHVybiBjLmFwcGx5KG51bGwsYXJndW1lbnRzKStcIipcIn0pKFwiXFxcXFxcXFxcXFxccj9cXFxcblsgXFxcXGZcXFxcdF0qXCIpO2IoXCIjW15cXFxcclxcXFxuXSpcIik7bT1jKFwiWzAtOV0oPzpfP1swLTldKSpcXFxcLig/OlswLTldKD86Xz9bMC05XSkqKT9cIixcIlxcXFwuWzAtOV0oPzpfP1swLTldKSpcIikrYihcIltlRV1bLStdP1swLTldKD86Xz9bMC05XSkqXCIpO3ZhciB1PWMobSxcIlswLTldKD86Xz9bMC05XSkqW2VFXVstK10/WzAtOV0oPzpfP1swLTldKSpcIiksQT1jKFwiWzAtOV0oPzpfP1swLTldKSpbakpdXCIsXG51K1wiW2pKXVwiKTttPWMuYXBwbHkobnVsbCxmKCkpO3E9YyhtK1wiJycnXCIsbSsnXCJcIlwiJyk7YyhtK1wiJ1teXFxcXG4nXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXFxcXG4nXFxcXFxcXFxdKikqJ1wiLG0rJ1wiW15cXFxcblwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXFxcXG5cIlxcXFxcXFxcXSopKlwiJyk7dmFyIHQsdixCO2woITApO1NrLnRva2VuLnNldHVwVG9rZW5zPWw7dmFyIEQ9YyhtK1wiJ1teXFxcXG4nXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXFxcXG4nXFxcXFxcXFxdKikqXCIrYyhcIidcIixcIlxcXFxcXFxcXFxcXHI/XFxcXG5cIiksbSsnXCJbXlxcXFxuXCJcXFxcXFxcXF0qKD86XFxcXFxcXFwuW15cXFxcblwiXFxcXFxcXFxdKikqJytjKCdcIicsXCJcXFxcXFxcXFxcXFxyP1xcXFxuXCIpKSxFPWMoXCJcXFxcXFxcXFxcXFxyP1xcXFxufCRcIixcIiNbXlxcXFxyXFxcXG5dKlwiLHEpLEY9e307bT1mKCk7Zm9yKGxldCBhIG9mIG0pRlthK1wiJ1wiXT1cIl5bXidcXFxcXFxcXF0qKD86XFxcXFxcXFwuW14nXFxcXFxcXFxdKikqJ1wiLEZbYSsnXCInXT0nXlteXCJcXFxcXFxcXF0qKD86XFxcXFxcXFwuW15cIlxcXFxcXFxcXSopKlwiJyxGW2ErXCInJydcIl09XCJeW14nXFxcXFxcXFxdKig/Oig/OlxcXFxcXFxcLnwnKD8hJycpKVteJ1xcXFxcXFxcXSopKicnJ1wiLFxuRlthKydcIlwiXCInXT0nXlteXCJcXFxcXFxcXF0qKD86KD86XFxcXFxcXFwufFwiKD8hXCJcIikpW15cIlxcXFxcXFxcXSopKlwiXCJcIic7bGV0IE09W10sVj1bXTtmb3IobGV0IGEgb2YgbSlNLnB1c2goYSsnXCInKSxNLnB1c2goYStcIidcIiksVi5wdXNoKGErJ1wiXCJcIicpLFYucHVzaChhK1wiJycnXCIpO1NrLl90b2tlbml6ZT1mdW5jdGlvbihiLGYsayxuKXt2YXIgbD1Tay5fX2Z1dHVyZV9fLnB5dGhvbjM/XCJcIjpcIig/Okw/KVwiO2w9YyhcIjBbeFhdKD86Xz9bMC05YS1mQS1GXSkrXCIrbCxcIjBbYkJdKD86Xz9bMDFdKStcIitsLFNrLl9fZnV0dXJlX18uc2lsZW50X29jdGFsX2xpdGVyYWw/XCIwKFtvT10/KSg/Ol8/WzAtN10pK1wiK2w6XCIwKFtvT10pKD86Xz9bMC03XSkrXCIrbCxcIig/OjAoPzpfPzApKnxbMS05XSg/Ol8/WzAtOV0pKilcIitsKTtsPWMoQSx1LGwpO2w9XCJbIFxcXFxmXFxcXHRdKlwiK2MoRSxsLEIsRCxcIlxcXFx3K1wiKTtsPW5ldyBSZWdFeHAobCk7dmFyIG09MCx0PTAscT0wLHY9XCJcIix5PTAsRz1udWxsLEw9WzBdLEgsVD12b2lkIDAsXG5YPXZvaWQgMCxJLFI7dm9pZCAwIT09ayYmKFwidXRmLTgtc2lnXCI9PWsmJihrPVwidXRmLThcIiksbihuZXcgYShoLlRfRU5DT0RJTkcsayxbMCwwXSxbMCwwXSxcIlwiKSkpO2Zvcih2YXIgQz1rPVwiXCI7Oyl7dHJ5e2s9QyxDPWYoKX1jYXRjaChPKXtDPVwiXCJ9bSs9MTt2YXIgdz0wLE49Qy5sZW5ndGg7aWYodil7aWYoIUMpdGhyb3cgbmV3IGQoXCJFT0YgaW4gbXVsdGktbGluZSBzdHJpbmdcIixiLFhbMF0sWFsxXSk7VC5sYXN0SW5kZXg9MDt2YXIgcj1ULmV4ZWMoQyk7aWYocil3PUk9clswXS5sZW5ndGgsbihuZXcgYShoLlRfU1RSSU5HLHYrQy5zdWJzdHJpbmcoMCxJKSxYLFttLEldLEcrQykpLHY9XCJcIix5PTAsRz1udWxsO2Vsc2V7eSYmXCJcXFxcXFxuXCIhPT1DLnN1YnN0cmluZyhDLmxlbmd0aC0yKSYmXCJcXFxcXFxyXFxuXCIhPT1DLnN1YnN0cmluZyhDLmxlbmd0aC0zKT8obihuZXcgYShoLlRfRVJST1JUT0tFTix2K0MsWCxbbSxDLmxlbmd0aF0sRykpLHY9XCJcIixHPW51bGwpOih2Kz1DLEcrPUMpO2NvbnRpbnVlfX1lbHNlIGlmKDAhPVxudHx8cSl7aWYoIUMpdGhyb3cgbmV3IGQoXCJFT0YgaW4gbXVsdGktbGluZSBzdGF0ZW1lbnRcIixiLG0sMCk7cT0wfWVsc2V7aWYoIUMpYnJlYWs7Zm9yKEg9MDt3PE47KXtpZihcIiBcIj09Q1t3XSlIKz0xO2Vsc2UgaWYoXCJcXHRcIj09Q1t3XSlIPTgqTWF0aC5mbG9vcihILzgrMSk7ZWxzZSBpZihcIlxcZlwiPT1DW3ddKUg9MDtlbHNlIGJyZWFrO3crPTF9aWYodz09TilicmVhaztpZihlKFwiI1xcclxcblwiLENbd10pKXtpZihcIiNcIj09Q1t3XSl7SD1DLnN1YnN0cmluZyh3KTtmb3IoTj1ILmxlbmd0aDswPE4mJi0xIT09XCJcXHJcXG5cIi5pbmRleE9mKEguY2hhckF0KE4tMSkpOy0tTik7Tj1ILnN1YnN0cmluZygwLE4pO24obmV3IGEoaC5UX0NPTU1FTlQsTixbbSx3XSxbbSx3K04ubGVuZ3RoXSxDKSk7dys9Ti5sZW5ndGh9bihuZXcgYShoLlRfTkwsQy5zdWJzdHJpbmcodyksW20sd10sW20sQy5sZW5ndGhdLEMpKTtjb250aW51ZX1IPkxbTC5sZW5ndGgtMV0mJihMLnB1c2goSCksbihuZXcgYShoLlRfSU5ERU5ULFxuQy5zdWJzdHJpbmcodyksW20sMF0sW20sd10sQykpKTtmb3IoO0g8TFtMLmxlbmd0aC0xXTspe2lmKCFlKEwsSCkpdGhyb3cgbmV3IGcoXCJ1bmluZGVudCBkb2VzIG5vdCBtYXRjaCBhbnkgb3V0ZXIgaW5kZW50YXRpb24gbGV2ZWxcIixiLG0sdyk7TD1MLnNsaWNlKDAsLTEpO24obmV3IGEoaC5UX0RFREVOVCxcIlwiLFttLHddLFttLHddLEMpKX19Zm9yKDt3PE47KXtmb3IoSD1DLmNoYXJBdCh3KTtcIiBcIj09PUh8fFwiXFxmXCI9PT1IfHxcIlxcdFwiPT09SDspdys9MSxIPUMuY2hhckF0KHcpO2lmKFI9bC5leGVjKEMuc3Vic3RyaW5nKHcpKSl7aWYoSD13LEk9SCtSWzFdLmxlbmd0aCxSPVttLEhdLHI9W20sSV0sdz1JLEghPUkpe0k9Qy5zdWJzdHJpbmcoSCxJKTt2YXIgej1DW0hdO2lmKGUoXCIwMTIzNDU2Nzg5XCIseil8fFwiLlwiPT16JiZcIi5cIiE9SSYmXCIuLi5cIiE9SSluKG5ldyBhKGguVF9OVU1CRVIsSSxSLHIsQykpO2Vsc2UgaWYoZShcIlxcclxcblwiLHopKTA8dD9uKG5ldyBhKGguVF9OTCxJLFIscixDKSk6XG5uKG5ldyBhKGguVF9ORVdMSU5FLEksUixyLEMpKTtlbHNlIGlmKFwiI1wiPT16KW4obmV3IGEoaC5UX0NPTU1FTlQsSSxSLHIsQykpO2Vsc2UgaWYoZShWLEkpKWlmKFQ9UmVnRXhwKEZbSV0pLHI9VC5leGVjKEMuc3Vic3RyaW5nKHcpKSl3PXJbMF0ubGVuZ3RoK3csST1DLnN1YnN0cmluZyhILHcpLG4obmV3IGEoaC5UX1NUUklORyxJLFIsW20sd10sQykpO2Vsc2V7WD1bbSxIXTt2PUMuc3Vic3RyaW5nKEgpO0c9QzticmVha31lbHNlIGlmKGUoTSx6KXx8ZShNLEkuc3Vic3RyaW5nKDAsMikpfHxlKE0sSS5zdWJzdHJpbmcoMCwzKSkpaWYoXCJcXG5cIj09SVtJLmxlbmd0aC0xXSl7WD1bbSxIXTtUPVJlZ0V4cChGW3pdfHxGW0lbMV1dfHxGW0lbMl1dKTt2PUMuc3Vic3RyaW5nKEgpO3k9MTtHPUM7YnJlYWt9ZWxzZSBuKG5ldyBhKGguVF9TVFJJTkcsSSxSLHIsQykpO2Vsc2UgSD16Lm5vcm1hbGl6ZShcIk5GS0NcIikscC50ZXN0KEgpP24obmV3IGEoaC5UX05BTUUsSSxSLHIsQykpOlwiXFxcXFwiPT1cbno/cT0xOihlKFwiKFt7XCIseik/dCs9MTplKFwiKV19XCIseikmJi0tdCxuKG5ldyBhKGguVF9PUCxJLFIscixDKSkpfX1lbHNlIG4obmV3IGEoaC5UX0VSUk9SVE9LRU4sQ1t3XSxbbSx3XSxbbSx3KzFdLEMpKSx3Kz0xfX1rJiYhZShcIlxcclxcblwiLGtbay5sZW5ndGgtMV0pJiZuKG5ldyBhKGguVF9ORVdMSU5FLFwiXCIsW20tMSxrLmxlbmd0aF0sW20tMSxrLmxlbmd0aCsxXSxcIlwiKSk7Zm9yKHZhciBaIGluIEwuc2xpY2UoMSkpbihuZXcgYShoLlRfREVERU5ULFwiXCIsW20sMF0sW20sMF0sXCJcIikpO24obmV3IGEoaC5UX0VORE1BUktFUixcIlwiLFttLDBdLFttLDBdLFwiXCIpKX07U2suZXhwb3J0U3ltYm9sKFwiU2suX3Rva2VuaXplXCIsU2suX3Rva2VuaXplKX0sZnVuY3Rpb24obSxxKXtTay5PcE1hcD17XCIoXCI6U2sudG9rZW4udG9rZW5zLlRfTFBBUixcIilcIjpTay50b2tlbi50b2tlbnMuVF9SUEFSLFwiW1wiOlNrLnRva2VuLnRva2Vucy5UX0xTUUIsXCJdXCI6U2sudG9rZW4udG9rZW5zLlRfUlNRQixcIjpcIjpTay50b2tlbi50b2tlbnMuVF9DT0xPTixcblwiLFwiOlNrLnRva2VuLnRva2Vucy5UX0NPTU1BLFwiO1wiOlNrLnRva2VuLnRva2Vucy5UX1NFTUksXCIrXCI6U2sudG9rZW4udG9rZW5zLlRfUExVUyxcIi1cIjpTay50b2tlbi50b2tlbnMuVF9NSU5VUyxcIipcIjpTay50b2tlbi50b2tlbnMuVF9TVEFSLFwiL1wiOlNrLnRva2VuLnRva2Vucy5UX1NMQVNILFwifFwiOlNrLnRva2VuLnRva2Vucy5UX1ZCQVIsXCImXCI6U2sudG9rZW4udG9rZW5zLlRfQU1QRVIsXCI8XCI6U2sudG9rZW4udG9rZW5zLlRfTEVTUyxcIj5cIjpTay50b2tlbi50b2tlbnMuVF9HUkVBVEVSLFwiPVwiOlNrLnRva2VuLnRva2Vucy5UX0VRVUFMLFwiLlwiOlNrLnRva2VuLnRva2Vucy5UX0RPVCxcIiVcIjpTay50b2tlbi50b2tlbnMuVF9QRVJDRU5ULFwiYFwiOlNrLnRva2VuLnRva2Vucy5UX0JBQ0tRVU9URSxcIntcIjpTay50b2tlbi50b2tlbnMuVF9MQlJBQ0UsXCJ9XCI6U2sudG9rZW4udG9rZW5zLlRfUkJSQUNFLFwiQFwiOlNrLnRva2VuLnRva2Vucy5UX0FULFwiQD1cIjpTay50b2tlbi50b2tlbnMuVF9BVEVRVUFMLFxuXCI9PVwiOlNrLnRva2VuLnRva2Vucy5UX0VRRVFVQUwsXCIhPVwiOlNrLnRva2VuLnRva2Vucy5UX05PVEVRVUFMLFwiPD5cIjpTay50b2tlbi50b2tlbnMuVF9OT1RFUVVBTCxcIjw9XCI6U2sudG9rZW4udG9rZW5zLlRfTEVTU0VRVUFMLFwiPj1cIjpTay50b2tlbi50b2tlbnMuVF9HUkVBVEVSRVFVQUwsXCJ+XCI6U2sudG9rZW4udG9rZW5zLlRfVElMREUsXCJeXCI6U2sudG9rZW4udG9rZW5zLlRfQ0lSQ1VNRkxFWCxcIjw8XCI6U2sudG9rZW4udG9rZW5zLlRfTEVGVFNISUZULFwiPj5cIjpTay50b2tlbi50b2tlbnMuVF9SSUdIVFNISUZULFwiKipcIjpTay50b2tlbi50b2tlbnMuVF9ET1VCTEVTVEFSLFwiKz1cIjpTay50b2tlbi50b2tlbnMuVF9QTFVTRVFVQUwsXCItPVwiOlNrLnRva2VuLnRva2Vucy5UX01JTkVRVUFMLFwiKj1cIjpTay50b2tlbi50b2tlbnMuVF9TVEFSRVFVQUwsXCIvPVwiOlNrLnRva2VuLnRva2Vucy5UX1NMQVNIRVFVQUwsXCIlPVwiOlNrLnRva2VuLnRva2Vucy5UX1BFUkNFTlRFUVVBTCxcIiY9XCI6U2sudG9rZW4udG9rZW5zLlRfQU1QRVJFUVVBTCxcblwifD1cIjpTay50b2tlbi50b2tlbnMuVF9WQkFSRVFVQUwsXCJePVwiOlNrLnRva2VuLnRva2Vucy5UX0NJUkNVTUZMRVhFUVVBTCxcIjw8PVwiOlNrLnRva2VuLnRva2Vucy5UX0xFRlRTSElGVEVRVUFMLFwiPj49XCI6U2sudG9rZW4udG9rZW5zLlRfUklHSFRTSElGVEVRVUFMLFwiKio9XCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU1RBUkVRVUFMLFwiLy9cIjpTay50b2tlbi50b2tlbnMuVF9ET1VCTEVTTEFTSCxcIi8vPVwiOlNrLnRva2VuLnRva2Vucy5UX0RPVUJMRVNMQVNIRVFVQUwsXCItPlwiOlNrLnRva2VuLnRva2Vucy5UX1JBUlJPVyxcIi4uLlwiOlNrLnRva2VuLnRva2Vucy5UX0VMTElQU0lTfTtTay5QYXJzZVRhYmxlcz17c3ltOnthbmRfZXhwcjoyNTcsYW5kX3Rlc3Q6MjU4LGFubmFzc2lnbjoyNTksYXJnbGlzdDoyNjAsYXJndW1lbnQ6MjYxLGFyaXRoX2V4cHI6MjYyLGFzc2VydF9zdG10OjI2Myxhc3luY19mdW5jZGVmOjI2NCxhc3luY19zdG10OjI2NSxhdG9tOjI2NixhdG9tX2V4cHI6MjY3LFxuYXVnYXNzaWduOjI2OCxicmVha19zdG10OjI2OSxjbGFzc2RlZjoyNzAsY29tcF9mb3I6MjcxLGNvbXBfaWY6MjcyLGNvbXBfaXRlcjoyNzMsY29tcF9vcDoyNzQsY29tcGFyaXNvbjoyNzUsY29tcG91bmRfc3RtdDoyNzYsY29udGludWVfc3RtdDoyNzcsZGVidWdnZXJfc3RtdDoyNzgsZGVjb3JhdGVkOjI3OSxkZWNvcmF0b3I6MjgwLGRlY29yYXRvcnM6MjgxLGRlbF9zdG10OjI4MixkaWN0b3JzZXRtYWtlcjoyODMsZG90dGVkX2FzX25hbWU6Mjg0LGRvdHRlZF9hc19uYW1lczoyODUsZG90dGVkX25hbWU6Mjg2LGVuY29kaW5nX2RlY2w6Mjg3LGV2YWxfaW5wdXQ6Mjg4LGV4Y2VwdF9jbGF1c2U6Mjg5LGV4cHI6MjkwLGV4cHJfc3RtdDoyOTEsZXhwcmxpc3Q6MjkyLGZhY3RvcjoyOTMsZmlsZV9pbnB1dDoyOTQsZmxvd19zdG10OjI5NSxmb3Jfc3RtdDoyOTYsZnVuY2RlZjoyOTcsZ2xvYmFsX3N0bXQ6Mjk4LGlmX3N0bXQ6Mjk5LGltcG9ydF9hc19uYW1lOjMwMCxpbXBvcnRfYXNfbmFtZXM6MzAxLFxuaW1wb3J0X2Zyb206MzAyLGltcG9ydF9uYW1lOjMwMyxpbXBvcnRfc3RtdDozMDQsbGFtYmRlZjozMDUsbGFtYmRlZl9ub2NvbmQ6MzA2LG5vbmxvY2FsX3N0bXQ6MzA3LG5vdF90ZXN0OjMwOCxvcl90ZXN0OjMwOSxwYXJhbWV0ZXJzOjMxMCxwYXNzX3N0bXQ6MzExLHBvd2VyOjMxMixwcmludF9zdG10OjMxMyxyYWlzZV9zdG10OjMxNCxyZXR1cm5fc3RtdDozMTUsc2hpZnRfZXhwcjozMTYsc2ltcGxlX3N0bXQ6MzE3LHNpbmdsZV9pbnB1dDoyNTYsc2xpY2VvcDozMTgsc21hbGxfc3RtdDozMTksc3Rhcl9leHByOjMyMCxzdG10OjMyMSxzdWJzY3JpcHQ6MzIyLHN1YnNjcmlwdGxpc3Q6MzIzLHN1aXRlOjMyNCx0ZXJtOjMyNSx0ZXN0OjMyNix0ZXN0X25vY29uZDozMjcsdGVzdGxpc3Q6MzI4LHRlc3RsaXN0X2NvbXA6MzI5LHRlc3RsaXN0X3N0YXJfZXhwcjozMzAsdGZwZGVmOjMzMSx0cmFpbGVyOjMzMix0cnlfc3RtdDozMzMsdHlwZWRhcmdzbGlzdDozMzQsdmFyYXJnc2xpc3Q6MzM1LFxudmZwZGVmOjMzNix3aGlsZV9zdG10OjMzNyx3aXRoX2l0ZW06MzM4LHdpdGhfc3RtdDozMzkseG9yX2V4cHI6MzQwLHlpZWxkX2FyZzozNDEseWllbGRfZXhwcjozNDIseWllbGRfc3RtdDozNDN9LG51bWJlcjJzeW1ib2w6ezI1NjpcInNpbmdsZV9pbnB1dFwiLDI1NzpcImFuZF9leHByXCIsMjU4OlwiYW5kX3Rlc3RcIiwyNTk6XCJhbm5hc3NpZ25cIiwyNjA6XCJhcmdsaXN0XCIsMjYxOlwiYXJndW1lbnRcIiwyNjI6XCJhcml0aF9leHByXCIsMjYzOlwiYXNzZXJ0X3N0bXRcIiwyNjQ6XCJhc3luY19mdW5jZGVmXCIsMjY1OlwiYXN5bmNfc3RtdFwiLDI2NjpcImF0b21cIiwyNjc6XCJhdG9tX2V4cHJcIiwyNjg6XCJhdWdhc3NpZ25cIiwyNjk6XCJicmVha19zdG10XCIsMjcwOlwiY2xhc3NkZWZcIiwyNzE6XCJjb21wX2ZvclwiLDI3MjpcImNvbXBfaWZcIiwyNzM6XCJjb21wX2l0ZXJcIiwyNzQ6XCJjb21wX29wXCIsMjc1OlwiY29tcGFyaXNvblwiLDI3NjpcImNvbXBvdW5kX3N0bXRcIiwyNzc6XCJjb250aW51ZV9zdG10XCIsMjc4OlwiZGVidWdnZXJfc3RtdFwiLFxuMjc5OlwiZGVjb3JhdGVkXCIsMjgwOlwiZGVjb3JhdG9yXCIsMjgxOlwiZGVjb3JhdG9yc1wiLDI4MjpcImRlbF9zdG10XCIsMjgzOlwiZGljdG9yc2V0bWFrZXJcIiwyODQ6XCJkb3R0ZWRfYXNfbmFtZVwiLDI4NTpcImRvdHRlZF9hc19uYW1lc1wiLDI4NjpcImRvdHRlZF9uYW1lXCIsMjg3OlwiZW5jb2RpbmdfZGVjbFwiLDI4ODpcImV2YWxfaW5wdXRcIiwyODk6XCJleGNlcHRfY2xhdXNlXCIsMjkwOlwiZXhwclwiLDI5MTpcImV4cHJfc3RtdFwiLDI5MjpcImV4cHJsaXN0XCIsMjkzOlwiZmFjdG9yXCIsMjk0OlwiZmlsZV9pbnB1dFwiLDI5NTpcImZsb3dfc3RtdFwiLDI5NjpcImZvcl9zdG10XCIsMjk3OlwiZnVuY2RlZlwiLDI5ODpcImdsb2JhbF9zdG10XCIsMjk5OlwiaWZfc3RtdFwiLDMwMDpcImltcG9ydF9hc19uYW1lXCIsMzAxOlwiaW1wb3J0X2FzX25hbWVzXCIsMzAyOlwiaW1wb3J0X2Zyb21cIiwzMDM6XCJpbXBvcnRfbmFtZVwiLDMwNDpcImltcG9ydF9zdG10XCIsMzA1OlwibGFtYmRlZlwiLDMwNjpcImxhbWJkZWZfbm9jb25kXCIsMzA3Olwibm9ubG9jYWxfc3RtdFwiLFxuMzA4Olwibm90X3Rlc3RcIiwzMDk6XCJvcl90ZXN0XCIsMzEwOlwicGFyYW1ldGVyc1wiLDMxMTpcInBhc3Nfc3RtdFwiLDMxMjpcInBvd2VyXCIsMzEzOlwicHJpbnRfc3RtdFwiLDMxNDpcInJhaXNlX3N0bXRcIiwzMTU6XCJyZXR1cm5fc3RtdFwiLDMxNjpcInNoaWZ0X2V4cHJcIiwzMTc6XCJzaW1wbGVfc3RtdFwiLDMxODpcInNsaWNlb3BcIiwzMTk6XCJzbWFsbF9zdG10XCIsMzIwOlwic3Rhcl9leHByXCIsMzIxOlwic3RtdFwiLDMyMjpcInN1YnNjcmlwdFwiLDMyMzpcInN1YnNjcmlwdGxpc3RcIiwzMjQ6XCJzdWl0ZVwiLDMyNTpcInRlcm1cIiwzMjY6XCJ0ZXN0XCIsMzI3OlwidGVzdF9ub2NvbmRcIiwzMjg6XCJ0ZXN0bGlzdFwiLDMyOTpcInRlc3RsaXN0X2NvbXBcIiwzMzA6XCJ0ZXN0bGlzdF9zdGFyX2V4cHJcIiwzMzE6XCJ0ZnBkZWZcIiwzMzI6XCJ0cmFpbGVyXCIsMzMzOlwidHJ5X3N0bXRcIiwzMzQ6XCJ0eXBlZGFyZ3NsaXN0XCIsMzM1OlwidmFyYXJnc2xpc3RcIiwzMzY6XCJ2ZnBkZWZcIiwzMzc6XCJ3aGlsZV9zdG10XCIsMzM4Olwid2l0aF9pdGVtXCIsMzM5Olwid2l0aF9zdG10XCIsXG4zNDA6XCJ4b3JfZXhwclwiLDM0MTpcInlpZWxkX2FyZ1wiLDM0MjpcInlpZWxkX2V4cHJcIiwzNDM6XCJ5aWVsZF9zdG10XCJ9LGRmYXM6ezI1NjpbW1tbMSwxXSxbMiwxXSxbMywyXV0sW1swLDFdXSxbWzIsMV1dXSx7MjoxLDQ6MSw1OjEsNjoxLDc6MSw4OjEsOToxLDEwOjEsMTE6MSwxMjoxLDEzOjEsMTQ6MSwxNToxLDE2OjEsMTc6MSwxODoxLDE5OjEsMjA6MSwyMToxLDIyOjEsMjM6MSwyNDoxLDI1OjEsMjY6MSwyNzoxLDI4OjEsMjk6MSwzMDoxLDMxOjEsMzI6MSwzMzoxLDM0OjEsMzU6MSwzNjoxLDM3OjEsMzg6MSwzOToxLDQwOjEsNDE6MSw0MjoxLDQzOjF9XSwyNTc6W1tbWzQ0LDFdXSxbWzQ1LDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI1ODpbW1tbNDYsMV1dLFtbNDcsMF0sWzAsMV1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSxcbjM1OjEsMzg6MSw0MzoxfV0sMjU5OltbW1s0OCwxXV0sW1s0OSwyXV0sW1s1MCwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sezQ4OjF9XSwyNjA6W1tbWzUxLDFdXSxbWzUyLDJdLFswLDFdXSxbWzUxLDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyNjE6W1tbWzQ5LDFdLFsxNSwyXSxbNTMsMl1dLFtbNTAsMl0sWzU0LDNdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNTM6MX1dLDI2MjpbW1tbNTUsMV1dLFtbMzAsMF0sWzQzLDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI2MzpbW1tbMjQsMV1dLFtbNDksXG4yXV0sW1s1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sezI0OjF9XSwyNjQ6W1tbWzEwLDFdXSxbWzU2LDJdXSxbWzAsMl1dXSx7MTA6MX1dLDI2NTpbW1tbMTAsMV1dLFtbNTcsMl0sWzU2LDJdLFs1OCwyXV0sW1swLDJdXV0sezEwOjF9XSwyNjY6W1tbWzYsMV0sWzI1LDFdLFszMywxXSxbOSwxXSxbMTEsMV0sWzEyLDJdLFszNSwzXSxbMzgsNF0sWzE5LDFdLFs3LDVdXSxbWzAsMV1dLFtbNTksMV0sWzYwLDZdXSxbWzYxLDFdLFs2Miw3XSxbNjMsN11dLFtbNjQsMV0sWzYzLDhdXSxbWzcsNV0sWzAsNV1dLFtbNTksMV1dLFtbNjEsMV1dLFtbNjQsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjU6MSwzMzoxLDM1OjEsMzg6MX1dLDI2NzpbW1tbMjksMV0sWzY1LDJdXSxbWzY1LDJdXSxbWzY2LDJdLFswLDJdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDI1OjEsMjk6MSwzMzoxLDM1OjEsMzg6MX1dLDI2ODpbW1tbNjcsMV0sWzY4LDFdLFs2OSwxXSxcbls3MCwxXSxbNzEsMV0sWzcyLDFdLFs3MywxXSxbNzQsMV0sWzc1LDFdLFs3NiwxXSxbNzcsMV0sWzc4LDFdLFs3OSwxXV0sW1swLDFdXV0sezY3OjEsNjg6MSw2OToxLDcwOjEsNzE6MSw3MjoxLDczOjEsNzQ6MSw3NToxLDc2OjEsNzc6MSw3ODoxLDc5OjF9XSwyNjk6W1tbWzM5LDFdXSxbWzAsMV1dXSx7Mzk6MX1dLDI3MDpbW1tbMTMsMV1dLFtbMjUsMl1dLFtbNDgsM10sWzM1LDRdXSxbWzgwLDVdXSxbWzYxLDZdLFs4MSw3XV0sW1swLDVdXSxbWzQ4LDNdXSxbWzYxLDZdXV0sezEzOjF9XSwyNzE6W1tbWzEwLDFdLFszNCwyXV0sW1szNCwyXV0sW1s4MiwzXV0sW1s4Myw0XV0sW1s4NCw1XV0sW1s4NSw2XSxbMCw1XV0sW1swLDZdXV0sezEwOjEsMzQ6MX1dLDI3MjpbW1tbMzcsMV1dLFtbODYsMl1dLFtbODUsM10sWzAsMl1dLFtbMCwzXV1dLHszNzoxfV0sMjczOltbW1s4NywxXSxbNTQsMV1dLFtbMCwxXV1dLHsxMDoxLDM0OjEsMzc6MX1dLDI3NDpbW1tbODgsMV0sWzg5LDFdLFxuWzgsMl0sWzkwLDFdLFs4OCwxXSxbODMsMV0sWzkxLDFdLFs5MiwzXSxbOTMsMV0sWzk0LDFdXSxbWzAsMV1dLFtbODMsMV1dLFtbOCwxXSxbMCwzXV1dLHs4OjEsODM6MSw4ODoxLDg5OjEsOTA6MSw5MToxLDkyOjEsOTM6MSw5NDoxfV0sMjc1OltbW1s5NSwxXV0sW1s5NiwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNzY6W1tbWzk3LDFdLFs5OCwxXSxbNTgsMV0sWzk5LDFdLFs1NywxXSxbMTAwLDFdLFs1NiwxXSxbMTAxLDFdLFsxMDIsMV1dLFtbMCwxXV1dLHs0OjEsMTA6MSwxMzoxLDIwOjEsMjE6MSwzNDoxLDM3OjEsNDE6MSw0MjoxfV0sMjc3OltbW1s0MCwxXV0sW1swLDFdXV0sezQwOjF9XSwyNzg6W1tbWzE3LDFdXSxbWzAsMV1dXSx7MTc6MX1dLDI3OTpbW1tbMTAzLDFdXSxbWzU2LDJdLFsxMDQsMl0sWzk5LDJdXSxbWzAsMl1dXSx7NDE6MX1dLDI4MDpbW1tbNDEsMV1dLFxuW1sxMDUsMl1dLFtbMiw0XSxbMzUsM11dLFtbNjEsNV0sWzgxLDZdXSxbWzAsNF1dLFtbMiw0XV0sW1s2MSw1XV1dLHs0MToxfV0sMjgxOltbW1sxMDYsMV1dLFtbMTA2LDFdLFswLDFdXV0sezQxOjF9XSwyODI6W1tbWzI3LDFdXSxbWzgyLDJdXSxbWzAsMl1dXSx7Mjc6MX1dLDI4MzpbW1tbNDksMV0sWzEwNywyXSxbNTMsM11dLFtbNDgsNF0sWzU0LDVdLFs1Miw2XSxbMCwxXV0sW1s1NCw1XSxbNTIsNl0sWzAsMl1dLFtbOTUsN11dLFtbNDksN11dLFtbMCw1XV0sW1s0OSw4XSxbMTA3LDhdLFswLDZdXSxbWzU0LDVdLFs1Miw5XSxbMCw3XV0sW1s1Miw2XSxbMCw4XV0sW1s0OSwxMF0sWzUzLDExXSxbMCw5XV0sW1s0OCwxMl1dLFtbOTUsMTNdXSxbWzQ5LDEzXV0sW1s1Miw5XSxbMCwxM11dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNTM6MX1dLDI4NDpbW1tbMTA1LDFdXSxbWzEwOCxcbjJdLFswLDFdXSxbWzI1LDNdXSxbWzAsM11dXSx7MjU6MX1dLDI4NTpbW1tbMTA5LDFdXSxbWzUyLDBdLFswLDFdXV0sezI1OjF9XSwyODY6W1tbWzI1LDFdXSxbWzExMCwwXSxbMCwxXV1dLHsyNToxfV0sMjg3OltbW1syNSwxXV0sW1swLDFdXV0sezI1OjF9XSwyODg6W1tbWzExMSwxXV0sW1syLDFdLFsxMTIsMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyODk6W1tbWzExMywxXV0sW1s0OSwyXSxbMCwxXV0sW1sxMDgsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzAsNF1dXSx7MTEzOjF9XSwyOTA6W1tbWzExNCwxXV0sW1sxMTUsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjkxOltbW1sxMTYsMV1dLFtbMTE3LDJdLFs1MCwzXSxbMTE4LDRdLFswLDFdXSxbWzExMSxcbjRdLFs2Miw0XV0sW1sxMTYsNV0sWzYyLDVdXSxbWzAsNF1dLFtbNTAsM10sWzAsNV1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTI6W1tbWzk1LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbOTUsMV0sWzEwNywxXSxbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI5MzpbW1tbMTE5LDJdLFszMCwxXSxbMjIsMV0sWzQzLDFdXSxbWzEyMCwyXV0sW1swLDJdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI5NDpbW1tbMiwwXSxbMTEyLDFdLFsxMjEsMF1dLFtbMCwxXV1dLHsyOjEsNDoxLDU6MSw2OjEsNzoxLDg6MSw5OjEsMTA6MSwxMToxLDEyOjEsMTM6MSwxNDoxLDE1OjEsMTY6MSxcbjE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxLDExMjoxfV0sMjk1OltbW1sxMjIsMV0sWzEyMywxXSxbMTI0LDFdLFsxMjUsMV0sWzEyNiwxXV0sW1swLDFdXV0sezU6MSwyMzoxLDMxOjEsMzk6MSw0MDoxfV0sMjk2OltbW1szNCwxXV0sW1s4MiwyXV0sW1s4MywzXV0sW1sxMTEsNF1dLFtbNDgsNV1dLFtbODAsNl1dLFtbMTI3LDddLFswLDZdXSxbWzQ4LDhdXSxbWzgwLDldXSxbWzAsOV1dXSx7MzQ6MX1dLDI5NzpbW1tbNCwxXV0sW1syNSwyXV0sW1sxMjgsM11dLFtbNDgsNF0sWzEyOSw1XV0sW1s4MCw2XV0sW1s0OSw3XV0sW1swLDZdXSxbWzQ4LDRdXV0sezQ6MX1dLDI5ODpbW1tbMjYsMV1dLFtbMjUsMl1dLFtbNTIsMV0sWzAsMl1dXSx7MjY6MX1dLDI5OTpbW1tbMzcsMV1dLFtbNDksMl1dLFxuW1s0OCwzXV0sW1s4MCw0XV0sW1sxMjcsNV0sWzEzMCwxXSxbMCw0XV0sW1s0OCw2XV0sW1s4MCw3XV0sW1swLDddXV0sezM3OjF9XSwzMDA6W1tbWzI1LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sezI1OjF9XSwzMDE6W1tbWzEzMSwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxMzEsMV0sWzAsMl1dXSx7MjU6MX1dLDMwMjpbW1tbMzYsMV1dLFtbMTA1LDJdLFsxOSwzXSxbMTEwLDNdXSxbWzMyLDRdXSxbWzEwNSwyXSxbMTksM10sWzMyLDRdLFsxMTAsM11dLFtbMTMyLDVdLFsxNSw1XSxbMzUsNl1dLFtbMCw1XV0sW1sxMzIsN11dLFtbNjEsNV1dXSx7MzY6MX1dLDMwMzpbW1tbMzIsMV1dLFtbMTMzLDJdXSxbWzAsMl1dXSx7MzI6MX1dLDMwNDpbW1tbMTM0LDFdLFsxMzUsMV1dLFtbMCwxXV1dLHszMjoxLDM2OjF9XSwzMDU6W1tbWzE0LDFdXSxbWzQ4LDJdLFsxMzYsM11dLFtbNDksNF1dLFtbNDgsMl1dLFtbMCw0XV1dLHsxNDoxfV0sMzA2OltbW1sxNCwxXV0sXG5bWzQ4LDJdLFsxMzYsM11dLFtbODYsNF1dLFtbNDgsMl1dLFtbMCw0XV1dLHsxNDoxfV0sMzA3OltbW1sxOCwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLHsxODoxfV0sMzA4OltbW1s4LDFdLFsxMzcsMl1dLFtbNDYsMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzA5OltbW1sxMzgsMV1dLFtbMTM5LDBdLFswLDFdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMTA6W1tbWzM1LDFdXSxbWzYxLDJdLFsxNDAsM11dLFtbMCwyXV0sW1s2MSwyXV1dLHszNToxfV0sMzExOltbW1syOCwxXV0sW1swLDFdXV0sezI4OjF9XSwzMTI6W1tbWzE0MSwxXV0sW1s1MywyXSxbMCwxXV0sW1sxMjAsM11dLFtbMCwzXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyNToxLDI5OjEsMzM6MSxcbjM1OjEsMzg6MX1dLDMxMzpbW1tbMTYsMV1dLFtbNDksMl0sWzE0MiwzXSxbMCwxXV0sW1s1Miw0XSxbMCwyXV0sW1s0OSw1XV0sW1s0OSwyXSxbMCw0XV0sW1s1Miw2XSxbMCw1XV0sW1s0OSw3XV0sW1s1Miw4XSxbMCw3XV0sW1s0OSw3XSxbMCw4XV1dLHsxNjoxfV0sMzE0OltbW1s1LDFdXSxbWzQ5LDJdLFswLDFdXSxbWzM2LDNdLFs1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1s1Miw1XSxbMCw0XV0sW1s0OSw2XV0sW1swLDZdXV0sezU6MX1dLDMxNTpbW1tbMjMsMV1dLFtbMTExLDJdLFswLDFdXSxbWzAsMl1dXSx7MjM6MX1dLDMxNjpbW1tbMTQzLDFdXSxbWzE0NCwwXSxbMTQyLDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMxNzpbW1tbMTQ1LDFdXSxbWzIsMl0sWzE0NiwzXV0sW1swLDJdXSxbWzE0NSwxXSxbMiwyXV1dLHs1OjEsNjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLFxuMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIyOjEsMjM6MSwyNDoxLDI1OjEsMjY6MSwyNzoxLDI4OjEsMjk6MSwzMDoxLDMxOjEsMzI6MSwzMzoxLDM1OjEsMzY6MSwzODoxLDM5OjEsNDA6MSw0MzoxfV0sMzE4OltbW1s0OCwxXV0sW1s0OSwyXSxbMCwxXV0sW1swLDJdXV0sezQ4OjF9XSwzMTk6W1tbWzE0NywxXSxbMTQ4LDFdLFsxNDksMV0sWzE1MCwxXSxbMTUxLDFdLFsxNTIsMV0sWzE1MywxXSxbMTU0LDFdLFsxNTUsMV0sWzE1NiwxXV0sW1swLDFdXV0sezU6MSw2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIyOjEsMjM6MSwyNDoxLDI1OjEsMjY6MSwyNzoxLDI4OjEsMjk6MSwzMDoxLDMxOjEsMzI6MSwzMzoxLDM1OjEsMzY6MSwzODoxLDM5OjEsNDA6MSw0MzoxfV0sMzIwOltbW1sxNSwxXV0sW1s5NSwyXV0sW1swLDJdXV0sezE1OjF9XSwzMjE6W1tbWzEsMV0sWzMsMV1dLFtbMCwxXV1dLHs0OjEsNToxLDY6MSw3OjEsXG44OjEsOToxLDEwOjEsMTE6MSwxMjoxLDEzOjEsMTQ6MSwxNToxLDE2OjEsMTc6MSwxODoxLDE5OjEsMjA6MSwyMToxLDIyOjEsMjM6MSwyNDoxLDI1OjEsMjY6MSwyNzoxLDI4OjEsMjk6MSwzMDoxLDMxOjEsMzI6MSwzMzoxLDM0OjEsMzU6MSwzNjoxLDM3OjEsMzg6MSwzOToxLDQwOjEsNDE6MSw0MjoxLDQzOjF9XSwzMjI6W1tbWzQ5LDFdLFs0OCwyXV0sW1s0OCwyXSxbMCwxXV0sW1s0OSwzXSxbMTU3LDRdLFswLDJdXSxbWzE1Nyw0XSxbMCwzXV0sW1swLDRdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MSw0ODoxfV0sMzIzOltbW1sxNTgsMV1dLFtbNTIsMl0sWzAsMV1dLFtbMTU4LDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MSw0ODoxfV0sMzI0OltbW1sxLDFdLFsyLDJdXSxcbltbMCwxXV0sW1sxNTksM11dLFtbMTIxLDRdXSxbWzE2MCwxXSxbMTIxLDRdXV0sezI6MSw1OjEsNjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMyNTpbW1tbMTIwLDFdXSxbWzE2MSwwXSxbMTUsMF0sWzE2MiwwXSxbNDEsMF0sWzE2MywwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMjY6W1tbWzg0LDFdLFsxNjQsMl1dLFtbMzcsM10sWzAsMV1dLFtbMCwyXV0sW1s4NCw0XV0sW1sxMjcsNV1dLFtbNDksMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI3OltbW1sxNjUsXG4xXSxbODQsMV1dLFtbMCwxXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMjg6W1tbWzQ5LDFdXSxbWzUyLDJdLFswLDFdXSxbWzQ5LDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMyOTpbW1tbNDksMV0sWzEwNywxXV0sW1s1NCwyXSxbNTIsM10sWzAsMV1dLFtbMCwyXV0sW1s0OSw0XSxbMTA3LDRdLFswLDNdXSxbWzUyLDNdLFswLDRdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzMwOltbW1s0OSwxXSxbMTA3LDFdXSxbWzUyLDJdLFswLDFdXSxbWzQ5LDFdLFsxMDcsMV0sWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTk6MSxcbjIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzMTpbW1tbMjUsMV1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM11dLFtbMCwzXV1dLHsyNToxfV0sMzMyOltbW1szNSwxXSxbMTEwLDJdLFszOCwzXV0sW1s2MSw0XSxbODEsNV1dLFtbMjUsNF1dLFtbMTY2LDZdXSxbWzAsNF1dLFtbNjEsNF1dLFtbNjQsNF1dXSx7MzU6MSwzODoxLDExMDoxfV0sMzMzOltbW1syMCwxXV0sW1s0OCwyXV0sW1s4MCwzXV0sW1sxNjcsNF0sWzE2OCw1XV0sW1s0OCw2XV0sW1s0OCw3XV0sW1s4MCw4XV0sW1s4MCw5XV0sW1sxNjcsNF0sWzEyNywxMF0sWzE2OCw1XSxbMCw4XV0sW1swLDldXSxbWzQ4LDExXV0sW1s4MCwxMl1dLFtbMTY4LDVdLFswLDEyXV1dLHsyMDoxfV0sMzM0OltbW1sxNSwxXSxbMTY5LDJdLFs1MywzXV0sW1sxNjksNF0sWzUyLDVdLFswLDFdXSxbWzUwLDZdLFs1Miw3XSxbMCwyXV0sW1sxNjksOF1dLFtbNTIsNV0sWzAsNF1dLFtbMTY5LDldLFs1MywzXSxbMCxcbjVdXSxbWzQ5LDEwXV0sW1sxNSwxMV0sWzE2OSwyXSxbNTMsM10sWzAsN11dLFtbNTIsMTJdLFswLDhdXSxbWzUwLDEzXSxbNTIsNV0sWzAsOV1dLFtbNTIsN10sWzAsMTBdXSxbWzE2OSwxNF0sWzUyLDE1XSxbMCwxMV1dLFtbMCwxMl1dLFtbNDksNF1dLFtbNTIsMTVdLFswLDE0XV0sW1sxNjksMTZdLFs1MywzXSxbMCwxNV1dLFtbNTAsMTddLFs1MiwxNV0sWzAsMTZdXSxbWzQ5LDE0XV1dLHsxNToxLDI1OjEsNTM6MX1dLDMzNTpbW1tbMTUsMV0sWzUzLDJdLFsxNzAsM11dLFtbMTcwLDVdLFs1Miw0XSxbMCwxXV0sW1sxNzAsNl1dLFtbNTAsN10sWzUyLDhdLFswLDNdXSxbWzUzLDJdLFsxNzAsOV0sWzAsNF1dLFtbNTIsNF0sWzAsNV1dLFtbNTIsMTBdLFswLDZdXSxbWzQ5LDExXV0sW1sxNSwxMl0sWzUzLDJdLFsxNzAsM10sWzAsOF1dLFtbNTAsMTNdLFs1Miw0XSxbMCw5XV0sW1swLDEwXV0sW1s1Miw4XSxbMCwxMV1dLFtbNTIsMTVdLFsxNzAsMTRdLFswLDEyXV0sW1s0OSw1XV0sXG5bWzUyLDE1XSxbMCwxNF1dLFtbNTMsMl0sWzE3MCwxNl0sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSx7MTU6MSwyNToxLDUzOjF9XSwzMzY6W1tbWzI1LDFdXSxbWzAsMV1dXSx7MjU6MX1dLDMzNzpbW1tbMjEsMV1dLFtbNDksMl1dLFtbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSx7MjE6MX1dLDMzODpbW1tbNDksMV1dLFtbMTA4LDJdLFswLDFdXSxbWzk1LDNdXSxbWzAsM11dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzM5OltbW1s0MiwxXV0sW1sxNzEsMl1dLFtbNDgsM10sWzUyLDFdXSxbWzgwLDRdXSxbWzAsNF1dXSx7NDI6MX1dLDM0MDpbW1tbMTcyLDFdXSxbWzE3MywwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsXG4zNToxLDM4OjEsNDM6MX1dLDM0MTpbW1tbMTExLDJdLFszNiwxXV0sW1s0OSwyXV0sW1swLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM2OjEsMzg6MSw0MzoxfV0sMzQyOltbW1szMSwxXV0sW1sxNzQsMl0sWzAsMV1dLFtbMCwyXV1dLHszMToxfV0sMzQzOltbW1s2MiwxXV0sW1swLDFdXV0sezMxOjF9XX0sc3RhdGVzOltbW1sxLDFdLFsyLDFdLFszLDJdXSxbWzAsMV1dLFtbMiwxXV1dLFtbWzQ0LDFdXSxbWzQ1LDBdLFswLDFdXV0sW1tbNDYsMV1dLFtbNDcsMF0sWzAsMV1dXSxbW1s0OCwxXV0sW1s0OSwyXV0sW1s1MCwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sW1tbNTEsMV1dLFtbNTIsMl0sWzAsMV1dLFtbNTEsMV0sWzAsMl1dXSxbW1s0OSwxXSxbMTUsMl0sWzUzLDJdXSxbWzUwLDJdLFs1NCwzXSxbMCwxXV0sW1s0OSwzXV0sW1swLDNdXV0sW1tbNTUsMV1dLFtbMzAsMF0sWzQzLDBdLFxuWzAsMV1dXSxbW1syNCwxXV0sW1s0OSwyXV0sW1s1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sW1tbMTAsMV1dLFtbNTYsMl1dLFtbMCwyXV1dLFtbWzEwLDFdXSxbWzU3LDJdLFs1NiwyXSxbNTgsMl1dLFtbMCwyXV1dLFtbWzYsMV0sWzI1LDFdLFszMywxXSxbOSwxXSxbMTEsMV0sWzEyLDJdLFszNSwzXSxbMzgsNF0sWzE5LDFdLFs3LDVdXSxbWzAsMV1dLFtbNTksMV0sWzYwLDZdXSxbWzYxLDFdLFs2Miw3XSxbNjMsN11dLFtbNjQsMV0sWzYzLDhdXSxbWzcsNV0sWzAsNV1dLFtbNTksMV1dLFtbNjEsMV1dLFtbNjQsMV1dXSxbW1syOSwxXSxbNjUsMl1dLFtbNjUsMl1dLFtbNjYsMl0sWzAsMl1dXSxbW1s2NywxXSxbNjgsMV0sWzY5LDFdLFs3MCwxXSxbNzEsMV0sWzcyLDFdLFs3MywxXSxbNzQsMV0sWzc1LDFdLFs3NiwxXSxbNzcsMV0sWzc4LDFdLFs3OSwxXV0sW1swLDFdXV0sW1tbMzksMV1dLFtbMCwxXV1dLFtbWzEzLDFdXSxbWzI1LDJdXSxbWzQ4LDNdLFszNSw0XV0sXG5bWzgwLDVdXSxbWzYxLDZdLFs4MSw3XV0sW1swLDVdXSxbWzQ4LDNdXSxbWzYxLDZdXV0sW1tbMTAsMV0sWzM0LDJdXSxbWzM0LDJdXSxbWzgyLDNdXSxbWzgzLDRdXSxbWzg0LDVdXSxbWzg1LDZdLFswLDVdXSxbWzAsNl1dXSxbW1szNywxXV0sW1s4NiwyXV0sW1s4NSwzXSxbMCwyXV0sW1swLDNdXV0sW1tbODcsMV0sWzU0LDFdXSxbWzAsMV1dXSxbW1s4OCwxXSxbODksMV0sWzgsMl0sWzkwLDFdLFs4OCwxXSxbODMsMV0sWzkxLDFdLFs5MiwzXSxbOTMsMV0sWzk0LDFdXSxbWzAsMV1dLFtbODMsMV1dLFtbOCwxXSxbMCwzXV1dLFtbWzk1LDFdXSxbWzk2LDBdLFswLDFdXV0sW1tbOTcsMV0sWzk4LDFdLFs1OCwxXSxbOTksMV0sWzU3LDFdLFsxMDAsMV0sWzU2LDFdLFsxMDEsMV0sWzEwMiwxXV0sW1swLDFdXV0sW1tbNDAsMV1dLFtbMCwxXV1dLFtbWzE3LDFdXSxbWzAsMV1dXSxbW1sxMDMsMV1dLFtbNTYsMl0sWzEwNCwyXSxbOTksMl1dLFtbMCwyXV1dLFtbWzQxLDFdXSxbWzEwNSxcbjJdXSxbWzIsNF0sWzM1LDNdXSxbWzYxLDVdLFs4MSw2XV0sW1swLDRdXSxbWzIsNF1dLFtbNjEsNV1dXSxbW1sxMDYsMV1dLFtbMTA2LDFdLFswLDFdXV0sW1tbMjcsMV1dLFtbODIsMl1dLFtbMCwyXV1dLFtbWzQ5LDFdLFsxMDcsMl0sWzUzLDNdXSxbWzQ4LDRdLFs1NCw1XSxbNTIsNl0sWzAsMV1dLFtbNTQsNV0sWzUyLDZdLFswLDJdXSxbWzk1LDddXSxbWzQ5LDddXSxbWzAsNV1dLFtbNDksOF0sWzEwNyw4XSxbMCw2XV0sW1s1NCw1XSxbNTIsOV0sWzAsN11dLFtbNTIsNl0sWzAsOF1dLFtbNDksMTBdLFs1MywxMV0sWzAsOV1dLFtbNDgsMTJdXSxbWzk1LDEzXV0sW1s0OSwxM11dLFtbNTIsOV0sWzAsMTNdXV0sW1tbMTA1LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sW1tbMTA5LDFdXSxbWzUyLDBdLFswLDFdXV0sW1tbMjUsMV1dLFtbMTEwLDBdLFswLDFdXV0sW1tbMjUsMV1dLFtbMCwxXV1dLFtbWzExMSwxXV0sW1syLDFdLFsxMTIsMl1dLFtbMCwyXV1dLFxuW1tbMTEzLDFdXSxbWzQ5LDJdLFswLDFdXSxbWzEwOCwzXSxbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLFtbWzExNCwxXV0sW1sxMTUsMF0sWzAsMV1dXSxbW1sxMTYsMV1dLFtbMTE3LDJdLFs1MCwzXSxbMTE4LDRdLFswLDFdXSxbWzExMSw0XSxbNjIsNF1dLFtbMTE2LDVdLFs2Miw1XV0sW1swLDRdXSxbWzUwLDNdLFswLDVdXV0sW1tbOTUsMV0sWzEwNywxXV0sW1s1MiwyXSxbMCwxXV0sW1s5NSwxXSxbMTA3LDFdLFswLDJdXV0sW1tbMTE5LDJdLFszMCwxXSxbMjIsMV0sWzQzLDFdXSxbWzEyMCwyXV0sW1swLDJdXV0sW1tbMiwwXSxbMTEyLDFdLFsxMjEsMF1dLFtbMCwxXV1dLFtbWzEyMiwxXSxbMTIzLDFdLFsxMjQsMV0sWzEyNSwxXSxbMTI2LDFdXSxbWzAsMV1dXSxbW1szNCwxXV0sW1s4MiwyXV0sW1s4MywzXV0sW1sxMTEsNF1dLFtbNDgsNV1dLFtbODAsNl1dLFtbMTI3LDddLFswLDZdXSxbWzQ4LDhdXSxbWzgwLDldXSxbWzAsOV1dXSxbW1s0LDFdXSxbWzI1LFxuMl1dLFtbMTI4LDNdXSxbWzQ4LDRdLFsxMjksNV1dLFtbODAsNl1dLFtbNDksN11dLFtbMCw2XV0sW1s0OCw0XV1dLFtbWzI2LDFdXSxbWzI1LDJdXSxbWzUyLDFdLFswLDJdXV0sW1tbMzcsMV1dLFtbNDksMl1dLFtbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFsxMzAsMV0sWzAsNF1dLFtbNDgsNl1dLFtbODAsN11dLFtbMCw3XV1dLFtbWzI1LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sW1tbMTMxLDFdXSxbWzUyLDJdLFswLDFdXSxbWzEzMSwxXSxbMCwyXV1dLFtbWzM2LDFdXSxbWzEwNSwyXSxbMTksM10sWzExMCwzXV0sW1szMiw0XV0sW1sxMDUsMl0sWzE5LDNdLFszMiw0XSxbMTEwLDNdXSxbWzEzMiw1XSxbMTUsNV0sWzM1LDZdXSxbWzAsNV1dLFtbMTMyLDddXSxbWzYxLDVdXV0sW1tbMzIsMV1dLFtbMTMzLDJdXSxbWzAsMl1dXSxbW1sxMzQsMV0sWzEzNSwxXV0sW1swLDFdXV0sW1tbMTQsMV1dLFtbNDgsMl0sWzEzNiwzXV0sW1s0OSw0XV0sW1s0OCxcbjJdXSxbWzAsNF1dXSxbW1sxNCwxXV0sW1s0OCwyXSxbMTM2LDNdXSxbWzg2LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSxbW1sxOCwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLFtbWzgsMV0sWzEzNywyXV0sW1s0NiwyXV0sW1swLDJdXV0sW1tbMTM4LDFdXSxbWzEzOSwwXSxbMCwxXV1dLFtbWzM1LDFdXSxbWzYxLDJdLFsxNDAsM11dLFtbMCwyXV0sW1s2MSwyXV1dLFtbWzI4LDFdXSxbWzAsMV1dXSxbW1sxNDEsMV1dLFtbNTMsMl0sWzAsMV1dLFtbMTIwLDNdXSxbWzAsM11dXSxbW1sxNiwxXV0sW1s0OSwyXSxbMTQyLDNdLFswLDFdXSxbWzUyLDRdLFswLDJdXSxbWzQ5LDVdXSxbWzQ5LDJdLFswLDRdXSxbWzUyLDZdLFswLDVdXSxbWzQ5LDddXSxbWzUyLDhdLFswLDddXSxbWzQ5LDddLFswLDhdXV0sW1tbNSwxXV0sW1s0OSwyXSxbMCwxXV0sW1szNiwzXSxbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbNTIsNV0sWzAsNF1dLFtbNDksNl1dLFtbMCw2XV1dLFtbWzIzLDFdXSxbWzExMSxcbjJdLFswLDFdXSxbWzAsMl1dXSxbW1sxNDMsMV1dLFtbMTQ0LDBdLFsxNDIsMF0sWzAsMV1dXSxbW1sxNDUsMV1dLFtbMiwyXSxbMTQ2LDNdXSxbWzAsMl1dLFtbMTQ1LDFdLFsyLDJdXV0sW1tbNDgsMV1dLFtbNDksMl0sWzAsMV1dLFtbMCwyXV1dLFtbWzE0NywxXSxbMTQ4LDFdLFsxNDksMV0sWzE1MCwxXSxbMTUxLDFdLFsxNTIsMV0sWzE1MywxXSxbMTU0LDFdLFsxNTUsMV0sWzE1NiwxXV0sW1swLDFdXV0sW1tbMTUsMV1dLFtbOTUsMl1dLFtbMCwyXV1dLFtbWzEsMV0sWzMsMV1dLFtbMCwxXV1dLFtbWzQ5LDFdLFs0OCwyXV0sW1s0OCwyXSxbMCwxXV0sW1s0OSwzXSxbMTU3LDRdLFswLDJdXSxbWzE1Nyw0XSxbMCwzXV0sW1swLDRdXV0sW1tbMTU4LDFdXSxbWzUyLDJdLFswLDFdXSxbWzE1OCwxXSxbMCwyXV1dLFtbWzEsMV0sWzIsMl1dLFtbMCwxXV0sW1sxNTksM11dLFtbMTIxLDRdXSxbWzE2MCwxXSxbMTIxLDRdXV0sW1tbMTIwLDFdXSxbWzE2MSwwXSxbMTUsMF0sWzE2MixcbjBdLFs0MSwwXSxbMTYzLDBdLFswLDFdXV0sW1tbODQsMV0sWzE2NCwyXV0sW1szNywzXSxbMCwxXV0sW1swLDJdXSxbWzg0LDRdXSxbWzEyNyw1XV0sW1s0OSwyXV1dLFtbWzE2NSwxXSxbODQsMV1dLFtbMCwxXV1dLFtbWzQ5LDFdXSxbWzUyLDJdLFswLDFdXSxbWzQ5LDFdLFswLDJdXV0sW1tbNDksMV0sWzEwNywxXV0sW1s1NCwyXSxbNTIsM10sWzAsMV1dLFtbMCwyXV0sW1s0OSw0XSxbMTA3LDRdLFswLDNdXSxbWzUyLDNdLFswLDRdXV0sW1tbNDksMV0sWzEwNywxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMTA3LDFdLFswLDJdXV0sW1tbMjUsMV1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM11dLFtbMCwzXV1dLFtbWzM1LDFdLFsxMTAsMl0sWzM4LDNdXSxbWzYxLDRdLFs4MSw1XV0sW1syNSw0XV0sW1sxNjYsNl1dLFtbMCw0XV0sW1s2MSw0XV0sW1s2NCw0XV1dLFtbWzIwLDFdXSxbWzQ4LDJdXSxbWzgwLDNdXSxbWzE2Nyw0XSxbMTY4LDVdXSxbWzQ4LDZdXSxbWzQ4LDddXSxcbltbODAsOF1dLFtbODAsOV1dLFtbMTY3LDRdLFsxMjcsMTBdLFsxNjgsNV0sWzAsOF1dLFtbMCw5XV0sW1s0OCwxMV1dLFtbODAsMTJdXSxbWzE2OCw1XSxbMCwxMl1dXSxbW1sxNSwxXSxbMTY5LDJdLFs1MywzXV0sW1sxNjksNF0sWzUyLDVdLFswLDFdXSxbWzUwLDZdLFs1Miw3XSxbMCwyXV0sW1sxNjksOF1dLFtbNTIsNV0sWzAsNF1dLFtbMTY5LDldLFs1MywzXSxbMCw1XV0sW1s0OSwxMF1dLFtbMTUsMTFdLFsxNjksMl0sWzUzLDNdLFswLDddXSxbWzUyLDEyXSxbMCw4XV0sW1s1MCwxM10sWzUyLDVdLFswLDldXSxbWzUyLDddLFswLDEwXV0sW1sxNjksMTRdLFs1MiwxNV0sWzAsMTFdXSxbWzAsMTJdXSxbWzQ5LDRdXSxbWzUyLDE1XSxbMCwxNF1dLFtbMTY5LDE2XSxbNTMsM10sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSxbW1sxNSwxXSxbNTMsMl0sWzE3MCwzXV0sW1sxNzAsNV0sWzUyLDRdLFswLDFdXSxbWzE3MCw2XV0sW1s1MCw3XSxbNTIsXG44XSxbMCwzXV0sW1s1MywyXSxbMTcwLDldLFswLDRdXSxbWzUyLDRdLFswLDVdXSxbWzUyLDEwXSxbMCw2XV0sW1s0OSwxMV1dLFtbMTUsMTJdLFs1MywyXSxbMTcwLDNdLFswLDhdXSxbWzUwLDEzXSxbNTIsNF0sWzAsOV1dLFtbMCwxMF1dLFtbNTIsOF0sWzAsMTFdXSxbWzUyLDE1XSxbMTcwLDE0XSxbMCwxMl1dLFtbNDksNV1dLFtbNTIsMTVdLFswLDE0XV0sW1s1MywyXSxbMTcwLDE2XSxbMCwxNV1dLFtbNTAsMTddLFs1MiwxNV0sWzAsMTZdXSxbWzQ5LDE0XV1dLFtbWzI1LDFdXSxbWzAsMV1dXSxbW1syMSwxXV0sW1s0OSwyXV0sW1s0OCwzXV0sW1s4MCw0XV0sW1sxMjcsNV0sWzAsNF1dLFtbNDgsNl1dLFtbODAsN11dLFtbMCw3XV1dLFtbWzQ5LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1s5NSwzXV0sW1swLDNdXV0sW1tbNDIsMV1dLFtbMTcxLDJdXSxbWzQ4LDNdLFs1MiwxXV0sW1s4MCw0XV0sW1swLDRdXV0sW1tbMTcyLDFdXSxbWzE3MywwXSxbMCwxXV1dLFtbWzExMSwyXSxcblszNiwxXV0sW1s0OSwyXV0sW1swLDJdXV0sW1tbMzEsMV1dLFtbMTc0LDJdLFswLDFdXSxbWzAsMl1dXSxbW1s2MiwxXV0sW1swLDFdXV1dLGxhYmVsczpbWzAsXCJFTVBUWVwiXSxbMzE3LG51bGxdLFs0LG51bGxdLFsyNzYsbnVsbF0sWzEsXCJkZWZcIl0sWzEsXCJyYWlzZVwiXSxbMSxcIlRydWVcIl0sWzMsbnVsbF0sWzEsXCJub3RcIl0sWzEsXCJudWxsXCJdLFs1NSxudWxsXSxbMixudWxsXSxbMjUsbnVsbF0sWzEsXCJjbGFzc1wiXSxbMSxcImxhbWJkYVwiXSxbMTYsbnVsbF0sWzEsXCJwcmludFwiXSxbMSxcImRlYnVnZ2VyXCJdLFsxLFwibm9ubG9jYWxcIl0sWzUyLG51bGxdLFsxLFwidHJ5XCJdLFsxLFwid2hpbGVcIl0sWzMxLG51bGxdLFsxLFwicmV0dXJuXCJdLFsxLFwiYXNzZXJ0XCJdLFsxLG51bGxdLFsxLFwiZ2xvYmFsXCJdLFsxLFwiZGVsXCJdLFsxLFwicGFzc1wiXSxbNTQsbnVsbF0sWzE1LG51bGxdLFsxLFwieWllbGRcIl0sWzEsXCJpbXBvcnRcIl0sWzEsXCJGYWxzZVwiXSxbMSxcImZvclwiXSxbNyxudWxsXSxbMSxcImZyb21cIl0sWzEsXG5cImlmXCJdLFs5LG51bGxdLFsxLFwiYnJlYWtcIl0sWzEsXCJjb250aW51ZVwiXSxbNDksbnVsbF0sWzEsXCJ3aXRoXCJdLFsxNCxudWxsXSxbMzE2LG51bGxdLFsxOSxudWxsXSxbMzA4LG51bGxdLFsxLFwiYW5kXCJdLFsxMSxudWxsXSxbMzI2LG51bGxdLFsyMixudWxsXSxbMjYxLG51bGxdLFsxMixudWxsXSxbMzUsbnVsbF0sWzI3MSxudWxsXSxbMzI1LG51bGxdLFsyOTcsbnVsbF0sWzMzOSxudWxsXSxbMjk2LG51bGxdLFsyNixudWxsXSxbMjgzLG51bGxdLFs4LG51bGxdLFszNDIsbnVsbF0sWzMyOSxudWxsXSxbMTAsbnVsbF0sWzI2NixudWxsXSxbMzMyLG51bGxdLFs0NSxudWxsXSxbMzgsbnVsbF0sWzQwLG51bGxdLFs1MCxudWxsXSxbNDYsbnVsbF0sWzQxLG51bGxdLFs0MixudWxsXSxbMzYsbnVsbF0sWzQzLG51bGxdLFs0OCxudWxsXSxbNDQsbnVsbF0sWzM3LG51bGxdLFszOSxudWxsXSxbMzI0LG51bGxdLFsyNjAsbnVsbF0sWzI5MixudWxsXSxbMSxcImluXCJdLFszMDksbnVsbF0sWzI3Myxcbm51bGxdLFszMjcsbnVsbF0sWzI3MixudWxsXSxbMjgsbnVsbF0sWzIxLG51bGxdLFsyNyxudWxsXSxbMjksbnVsbF0sWzEsXCJpc1wiXSxbMzAsbnVsbF0sWzIwLG51bGxdLFsyOTAsbnVsbF0sWzI3NCxudWxsXSxbMzMzLG51bGxdLFsyOTksbnVsbF0sWzI3MCxudWxsXSxbMzM3LG51bGxdLFsyNzksbnVsbF0sWzI2NSxudWxsXSxbMjgxLG51bGxdLFsyNjQsbnVsbF0sWzI4NixudWxsXSxbMjgwLG51bGxdLFszMjAsbnVsbF0sWzEsXCJhc1wiXSxbMjg0LG51bGxdLFsyMyxudWxsXSxbMzI4LG51bGxdLFswLG51bGxdLFsxLFwiZXhjZXB0XCJdLFszNDAsbnVsbF0sWzE4LG51bGxdLFszMzAsbnVsbF0sWzI2OCxudWxsXSxbMjU5LG51bGxdLFszMTIsbnVsbF0sWzI5MyxudWxsXSxbMzIxLG51bGxdLFsyNjksbnVsbF0sWzI3NyxudWxsXSxbMzE0LG51bGxdLFszMTUsbnVsbF0sWzM0MyxudWxsXSxbMSxcImVsc2VcIl0sWzMxMCxudWxsXSxbNTEsbnVsbF0sWzEsXCJlbGlmXCJdLFszMDAsbnVsbF0sWzMwMSxcbm51bGxdLFsyODUsbnVsbF0sWzMwMyxudWxsXSxbMzAyLG51bGxdLFszMzUsbnVsbF0sWzI3NSxudWxsXSxbMjU4LG51bGxdLFsxLFwib3JcIl0sWzMzNCxudWxsXSxbMjY3LG51bGxdLFszNCxudWxsXSxbMjYyLG51bGxdLFszMyxudWxsXSxbMzE5LG51bGxdLFsxMyxudWxsXSxbMjk1LG51bGxdLFsyNjMsbnVsbF0sWzI5MSxudWxsXSxbMzExLG51bGxdLFszMDcsbnVsbF0sWzMxMyxudWxsXSxbMjgyLG51bGxdLFsyOTgsbnVsbF0sWzMwNCxudWxsXSxbMjc4LG51bGxdLFszMTgsbnVsbF0sWzMyMixudWxsXSxbNSxudWxsXSxbNixudWxsXSxbNDcsbnVsbF0sWzE3LG51bGxdLFsyNCxudWxsXSxbMzA1LG51bGxdLFszMDYsbnVsbF0sWzMyMyxudWxsXSxbMjg5LG51bGxdLFsxLFwiZmluYWxseVwiXSxbMzMxLG51bGxdLFszMzYsbnVsbF0sWzMzOCxudWxsXSxbMjU3LG51bGxdLFszMixudWxsXSxbMzQxLG51bGxdXSxrZXl3b3Jkczp7RmFsc2U6MzMsXCJudWxsXCI6OSxUcnVlOjYsYW5kOjQ3LFxuYXM6MTA4LGFzc2VydDoyNCxcImJyZWFrXCI6MzksXCJjbGFzc1wiOjEzLFwiY29udGludWVcIjo0MCxcImRlYnVnZ2VyXCI6MTcsZGVmOjQsZGVsOjI3LGVsaWY6MTMwLFwiZWxzZVwiOjEyNyxleGNlcHQ6MTEzLFwiZmluYWxseVwiOjE2OCxcImZvclwiOjM0LGZyb206MzYsZ2xvYmFsOjI2LFwiaWZcIjozNyxcImltcG9ydFwiOjMyLFwiaW5cIjo4Myxpczo5MixsYW1iZGE6MTQsbm9ubG9jYWw6MTgsbm90Ojgsb3I6MTM5LHBhc3M6MjgscHJpbnQ6MTYscmFpc2U6NSxcInJldHVyblwiOjIzLFwidHJ5XCI6MjAsXCJ3aGlsZVwiOjIxLFwid2l0aFwiOjQyLHlpZWxkOjMxfSx0b2tlbnM6ezA6MTEyLDE6MjUsMjoxMSwzOjcsNDoyLDU6MTU5LDY6MTYwLDc6MzUsODo2MSw5OjM4LDEwOjY0LDExOjQ4LDEyOjUyLDEzOjE0NiwxNDo0MywxNTozMCwxNjoxNSwxNzoxNjIsMTg6MTE1LDE5OjQ1LDIwOjk0LDIxOjg5LDIyOjUwLDIzOjExMCwyNDoxNjMsMjU6MTIsMjY6NTksMjc6OTAsMjg6ODgsMjk6OTEsMzA6OTMsMzE6MjIsMzI6MTczLFxuMzM6MTQ0LDM0OjE0MiwzNTo1MywzNjo3NCwzNzo3OCwzODo2OCwzOTo3OSw0MDo2OSw0MTo3Miw0Mjo3Myw0Mzo3NSw0NDo3Nyw0NTo2Nyw0Njo3MSw0NzoxNjEsNDg6NzYsNDk6NDEsNTA6NzAsNTE6MTI5LDUyOjE5LDU0OjI5LDU1OjEwfSxzdGFydDoyNTZ9fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLmZpbGVuYW1lPWE7dGhpcy5ncmFtbWFyPWM7dGhpcy5wX2ZsYWdzPTA7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gYyhiLGMpe3ZvaWQgMD09PWMmJihjPVwiZmlsZV9pbnB1dFwiKTtiPW5ldyBhKGIsU2suUGFyc2VUYWJsZXMpO1wiZmlsZV9pbnB1dFwiPT09Yz9iLnNldHVwKFNrLlBhcnNlVGFibGVzLnN5bS5maWxlX2lucHV0KTpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvO1wiKTtyZXR1cm4gYn1hLkZVVFVSRV9QUklOVF9GVU5DVElPTj1cInByaW50X2Z1bmN0aW9uXCI7YS5GVVRVUkVfVU5JQ09ERV9MSVRFUkFMUz1cInVuaWNvZGVfbGl0ZXJhbHNcIjthLkZVVFVSRV9ESVZJU0lPTj1cblwiZGl2aXNpb25cIjthLkZVVFVSRV9BQlNPTFVURV9JTVBPUlQ9XCJhYnNvbHV0ZV9pbXBvcnRcIjthLkZVVFVSRV9XSVRIX1NUQVRFTUVOVD1cIndpdGhfc3RhdGVtZW50XCI7YS5GVVRVUkVfTkVTVEVEX1NDT1BFUz1cIm5lc3RlZF9zY29wZXNcIjthLkZVVFVSRV9HRU5FUkFUT1JTPVwiZ2VuZXJhdG9yc1wiO2EuQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OPTY1NTM2O2EuQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFM9MTMxMDcyO2EuQ09fRlVUVVJFX0RJVklTT049ODE5MjthLkNPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQ9MTYzODQ7YS5DT19GVVRVUkVfV0lUSF9TVEFURU1FTlQ9MzI3Njg7YS5wcm90b3R5cGUuc2V0dXA9ZnVuY3Rpb24oYSl7YT1hfHx0aGlzLmdyYW1tYXIuc3RhcnQ7dGhpcy5zdGFjaz1be2RmYTp0aGlzLmdyYW1tYXIuZGZhc1thXSxzdGF0ZTowLG5vZGU6e3R5cGU6YSx2YWx1ZTpudWxsLGNvbnRleHQ6bnVsbCxjaGlsZHJlbjpbXX19XTt0aGlzLnVzZWRfbmFtZXM9e319O2EucHJvdG90eXBlLmFkZHRva2VuPVxuZnVuY3Rpb24oYSxjLGYpe3ZhciBiLGU9dGhpcy5jbGFzc2lmeShhLGMsZik7YTpmb3IoOzspe3ZhciBkPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV07dmFyIGc9ZC5kZmFbMF07dmFyIG49Z1tkLnN0YXRlXTtmb3IoYj0wO2I8bi5sZW5ndGg7KytiKXt2YXIgaz1uW2JdWzBdO3ZhciBwPW5bYl1bMV07dmFyIG09dGhpcy5ncmFtbWFyLmxhYmVsc1trXVswXTtpZihlPT09ayl7U2suYXNzZXJ0cy5hc3NlcnQoMjU2Pm0pO3RoaXMuc2hpZnQoYSxjLHAsZik7Zm9yKGY9cDsxPT09Z1tmXS5sZW5ndGgmJjA9PT1nW2ZdWzBdWzBdJiZnW2ZdWzBdWzFdPT09Zjspe3RoaXMucG9wKCk7aWYoMD09PXRoaXMuc3RhY2subGVuZ3RoKXJldHVybiEwO2Q9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXTtmPWQuc3RhdGU7Zz1kLmRmYVswXX1yZXR1cm4hMX1pZigyNTY8PW0mJihrPXRoaXMuZ3JhbW1hci5kZmFzW21dLGs9a1sxXSxrLmhhc093blByb3BlcnR5KGUpKSl7dGhpcy5wdXNoKG0sXG50aGlzLmdyYW1tYXIuZGZhc1ttXSxwLGYpO2NvbnRpbnVlIGF9fWI6e2c9WzAsZC5zdGF0ZV07Zm9yKGQ9bi5sZW5ndGg7ZC0tOylpZihuW2RdWzBdPT09Z1swXSYmbltkXVsxXT09PWdbMV0pe249ITA7YnJlYWsgYn1uPSExfWlmKG4pe2lmKHRoaXMucG9wKCksMD09PXRoaXMuc3RhY2subGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwidG9vIG11Y2ggaW5wdXRcIix0aGlzLmZpbGVuYW1lKTt9ZWxzZSB0aHJvdyBhPWZbMF1bMF0sbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJiYWQgaW5wdXRcIix0aGlzLmZpbGVuYW1lLGEsZik7fX07YS5wcm90b3R5cGUuY2xhc3NpZnk9ZnVuY3Rpb24oYixjLGYpe2lmKGI9PT1Tay50b2tlbi50b2tlbnMuVF9OQU1FKXt0aGlzLnVzZWRfbmFtZXNbY109ITA7dmFyIGU9dGhpcy5ncmFtbWFyLmtleXdvcmRzLmhhc093blByb3BlcnR5KGMpJiZ0aGlzLmdyYW1tYXIua2V5d29yZHNbY107XCJwcmludFwiPT09YyYmKHRoaXMucF9mbGFncyZcbmEuQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OfHwhMD09PVNrLl9fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb24pJiYoZT0hMSk7aWYoZSlyZXR1cm4gZX1lPXRoaXMuZ3JhbW1hci50b2tlbnMuaGFzT3duUHJvcGVydHkoYikmJnRoaXMuZ3JhbW1hci50b2tlbnNbYl07aWYoIWUpe2M9XCIjXCIrYjtmb3IobGV0IGEgaW4gU2sudG9rZW4udG9rZW5zKWlmKFNrLnRva2VuLnRva2Vuc1thXT09Yil7Yz1hO2JyZWFrfXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYmFkIHRva2VuIFwiK2MsdGhpcy5maWxlbmFtZSxmWzBdWzBdLGYpO31yZXR1cm4gZX07YS5wcm90b3R5cGUuc2hpZnQ9ZnVuY3Rpb24oYSxjLGYsbCl7dmFyIGI9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5kZmEsZD10aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLm5vZGU7ZC5jaGlsZHJlbi5wdXNoKHt0eXBlOmEsdmFsdWU6YyxsaW5lbm86bFswXVswXSxjb2xfb2Zmc2V0OmxbMF1bMV0sY2hpbGRyZW46bnVsbH0pO1xudGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXT17ZGZhOmIsc3RhdGU6Zixub2RlOmR9fTthLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEsYyxmLGwpe2E9e3R5cGU6YSx2YWx1ZTpudWxsLGxpbmVubzpsWzBdWzBdLGNvbF9vZmZzZXQ6bFswXVsxXSxjaGlsZHJlbjpbXX07dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXT17ZGZhOnRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV0uZGZhLHN0YXRlOmYsbm9kZTp0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLm5vZGV9O3RoaXMuc3RhY2sucHVzaCh7ZGZhOmMsc3RhdGU6MCxub2RlOmF9KX07YS5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zdGFjay5wb3AoKS5ub2RlO2lmKGEpaWYoMCE9PXRoaXMuc3RhY2subGVuZ3RoKXt2YXIgYz10aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLm5vZGU7Yy5jaGlsZHJlbi5wdXNoKGEpfWVsc2UgdGhpcy5yb290bm9kZT1hLHRoaXMucm9vdG5vZGUudXNlZF9uYW1lcz1cbnRoaXMudXNlZF9uYW1lc307U2sucGFyc2U9ZnVuY3Rpb24oYSxlKXt2YXIgYj1Tay50b2tlbi50b2tlbnMuVF9DT01NRU5ULGw9U2sudG9rZW4udG9rZW5zLlRfTkwsaD1Tay50b2tlbi50b2tlbnMuVF9PUCxkPVNrLnRva2VuLnRva2Vucy5UX0VORE1BUktFUixnPVNrLnRva2VuLnRva2Vucy5UX0VOQ09ESU5HLG49ITEsaz1jKGEpO1NrLl90b2tlbml6ZShhLGZ1bmN0aW9uKGEpe3ZhciBiPWEuc3BsaXQoXCJcXG5cIikucmV2ZXJzZSgpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYStcIlxcblwifSk7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoMD09PWIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcIkVPRlwiKTtyZXR1cm4gYi5wb3AoKX19KGUpLFwidXRmLThcIixmdW5jdGlvbihhKXt2YXIgYz1udWxsO2EudHlwZSE9PWImJmEudHlwZSE9PWwmJmEudHlwZSE9PWcmJihhLnR5cGU9PT1oJiYoYz1Tay5PcE1hcFthLnN0cmluZ10pLGsuYWRkdG9rZW4oY3x8YS50eXBlLGEuc3RyaW5nLFxuW2Euc3RhcnQsYS5lbmQsYS5saW5lXSksYS50eXBlPT09ZCYmKG49ITApKX0pO2lmKCFuKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW5jb21wbGV0ZSBpbnB1dFwiLHRoaXMuZmlsZW5hbWUpO3JldHVybntjc3Q6ay5yb290bm9kZSxmbGFnczprLnBfZmxhZ3N9fTtTay5wYXJzZVRyZWVEdW1wPWZ1bmN0aW9uKGEsYyl7dmFyIGI7Yz1jfHxcIlwiO3ZhciBlPVwiXCIrYztpZigyNTY8PWEudHlwZSlmb3IoZSs9U2suUGFyc2VUYWJsZXMubnVtYmVyMnN5bWJvbFthLnR5cGVdK1wiXFxuXCIsYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7KytiKWUrPVNrLnBhcnNlVHJlZUR1bXAoYS5jaGlsZHJlbltiXSxjK1wiICBcIik7ZWxzZSBlKz1Tay50b2tlbi50b2tfbmFtZVthLnR5cGVdK1wiOiBcIisobmV3IFNrLmJ1aWx0aW4uc3RyKGEudmFsdWUpKS4kcigpLnYrXCJcXG5cIjtyZXR1cm4gZX07U2suZXhwb3J0U3ltYm9sKFwiU2suUGFyc2VyXCIsYSk7U2suZXhwb3J0U3ltYm9sKFwiU2sucGFyc2VcIixTay5wYXJzZSk7XG5Tay5leHBvcnRTeW1ib2woXCJTay5wYXJzZVRyZWVEdW1wXCIsU2sucGFyc2VUcmVlRHVtcCl9LGZ1bmN0aW9uKG0scSl7U2suYXN0bm9kZXM9e307U2suYXN0bm9kZXMuTG9hZD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuU3RvcmU9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkRlbD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQXVnTG9hZD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQXVnU3RvcmU9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlBhcmFtPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5BbmQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk9yPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5BZGQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlN1Yj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTXVsdD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTWF0TXVsdD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuRGl2PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Nb2Q9ZnVuY3Rpb24oKXt9O1xuU2suYXN0bm9kZXMuUG93PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5MU2hpZnQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlJTaGlmdD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQml0T3I9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkJpdFhvcj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQml0QW5kPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5GbG9vckRpdj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuSW52ZXJ0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Ob3Q9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlVBZGQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlVTdWI9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkVxPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Ob3RFcT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTHQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkx0RT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuR3Q9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkd0RT1cbmZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Jcz1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuSXNOb3Q9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkluPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Ob3RJbj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTW9kdWxlPWZ1bmN0aW9uKGEsYyl7dGhpcy5ib2R5PWE7dGhpcy5kb2NzdHJpbmc9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSW50ZXJhY3RpdmU9ZnVuY3Rpb24oYSl7dGhpcy5ib2R5PWE7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkV4cHJlc3Npb249ZnVuY3Rpb24oYSl7dGhpcy5ib2R5PWE7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlN1aXRlPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZj1mdW5jdGlvbihhLGMsYixlLGYsbCxoLGQpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1oJiZ2b2lkIDAhPT1oKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZCYmdm9pZCAwIT09XG5kKTt0aGlzLm5hbWU9YTt0aGlzLmFyZ3M9Yzt0aGlzLmJvZHk9Yjt0aGlzLmRlY29yYXRvcl9saXN0PWU7dGhpcy5yZXR1cm5zPWY7dGhpcy5kb2NzdHJpbmc9bDt0aGlzLmxpbmVubz1oO3RoaXMuY29sX29mZnNldD1kO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmPWZ1bmN0aW9uKGEsYyxiLGUsZixsLGgsZCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWgmJnZvaWQgMCE9PWgpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1kJiZ2b2lkIDAhPT1kKTt0aGlzLm5hbWU9YTt0aGlzLmFyZ3M9Yzt0aGlzLmJvZHk9Yjt0aGlzLmRlY29yYXRvcl9saXN0PWU7dGhpcy5yZXR1cm5zPWY7dGhpcy5kb2NzdHJpbmc9bDt0aGlzLmxpbmVubz1oO3RoaXMuY29sX29mZnNldD1kO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5DbGFzc0RlZj1mdW5jdGlvbihhLGMsYixlLGYsbCxoLGQpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1oJiZ2b2lkIDAhPT1oKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5kJiZ2b2lkIDAhPT1kKTt0aGlzLm5hbWU9YTt0aGlzLmJhc2VzPWM7dGhpcy5rZXl3b3Jkcz1iO3RoaXMuYm9keT1lO3RoaXMuZGVjb3JhdG9yX2xpc3Q9Zjt0aGlzLmRvY3N0cmluZz1sO3RoaXMubGluZW5vPWg7dGhpcy5jb2xfb2Zmc2V0PWQ7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlJldHVybj1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRGVsZXRlPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudGFyZ2V0cz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFzc2lnbj1cbmZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy50YXJnZXRzPWE7dGhpcy52YWx1ZT1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkF1Z0Fzc2lnbj1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50YXJnZXQ9YTt0aGlzLm9wPWM7dGhpcy52YWx1ZT1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFubkFzc2lnbj1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLnRhcmdldD1cbmE7dGhpcy5hbm5vdGF0aW9uPWM7dGhpcy52YWx1ZT1iO3RoaXMuc2ltcGxlPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRm9yPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWwmJnZvaWQgMCE9PWwpO3RoaXMudGFyZ2V0PWE7dGhpcy5pdGVyPWM7dGhpcy5ib2R5PWI7dGhpcy5vcmVsc2U9ZTt0aGlzLmxpbmVubz1mO3RoaXMuY29sX29mZnNldD1sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3luY0Zvcj1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLnRhcmdldD1hO3RoaXMuaXRlcj1jO3RoaXMuYm9keT1iO3RoaXMub3JlbHNlPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9XG5sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5XaGlsZT1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50ZXN0PWE7dGhpcy5ib2R5PWM7dGhpcy5vcmVsc2U9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JZj1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50ZXN0PWE7dGhpcy5ib2R5PWM7dGhpcy5vcmVsc2U9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5XaXRoPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5lJiZ2b2lkIDAhPT1lKTt0aGlzLml0ZW1zPWE7dGhpcy5ib2R5PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXN5bmNXaXRoPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5pdGVtcz1hO3RoaXMuYm9keT1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlJhaXNlPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWwmJnZvaWQgMCE9PWwpO3RoaXMuZXhjPWE7dGhpcy5jYXVzZT1jO3RoaXMuaW5zdD1iO3RoaXMudGJhY2s9ZTt0aGlzLmxpbmVubz1mO3RoaXMuY29sX29mZnNldD1sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Ucnk9XG5mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLmJvZHk9YTt0aGlzLmhhbmRsZXJzPWM7dGhpcy5vcmVsc2U9Yjt0aGlzLmZpbmFsYm9keT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PWw7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFzc2VydD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMudGVzdD1hO3RoaXMubXNnPWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSW1wb3J0PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PVxuYik7dGhpcy5uYW1lcz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkltcG9ydEZyb209ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMubW9kdWxlPWE7dGhpcy5uYW1lcz1jO3RoaXMubGV2ZWw9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5HbG9iYWw9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy5uYW1lcz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk5vbmxvY2FsPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy5uYW1lcz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkV4cHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlBhc3M9ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YSYmdm9pZCAwIT09YSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJyZWFrPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWEmJnZvaWQgMCE9PVxuYSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbnRpbnVlPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWEmJnZvaWQgMCE9PWEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5QcmludD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5kZXN0PWE7dGhpcy52YWx1ZXM9Yzt0aGlzLm5sPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRGVidWdnZXI9ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5hJiZ2b2lkIDAhPT1hKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7dGhpcy5saW5lbm89YTt0aGlzLmNvbF9vZmZzZXQ9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQm9vbE9wPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5vcD1hO3RoaXMudmFsdWVzPWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQmluT3A9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMubGVmdD1hO3RoaXMub3A9Yzt0aGlzLnJpZ2h0PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuVW5hcnlPcD1cbmZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5vcD1hO3RoaXMub3BlcmFuZD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkxhbWJkYT1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuYXJncz1hO3RoaXMuYm9keT1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLklmRXhwPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnRlc3Q9YTt0aGlzLmJvZHk9Yzt0aGlzLm9yZWxzZT1cbmI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRGljdD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMua2V5cz1hO3RoaXMudmFsdWVzPWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU2V0PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMuZWx0cz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkxpc3RDb21wPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdD1hO3RoaXMuZ2VuZXJhdG9ycz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlNldENvbXA9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdD1hO3RoaXMuZ2VuZXJhdG9ycz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRpY3RDb21wPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLmtleT1hO3RoaXMudmFsdWU9Yzt0aGlzLmdlbmVyYXRvcnM9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA9XG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuZWx0PWE7dGhpcy5nZW5lcmF0b3JzPWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXdhaXQ9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLllpZWxkPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1cbmI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLllpZWxkRnJvbT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ29tcGFyZT1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5sZWZ0PWE7dGhpcy5vcHM9Yzt0aGlzLmNvbXBhcmF0b3JzPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ2FsbD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmXG52b2lkIDAhPT1mKTt0aGlzLmZ1bmM9YTt0aGlzLmFyZ3M9Yzt0aGlzLmtleXdvcmRzPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTnVtPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubj1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlN0cj1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZT1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1cbmUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnZhbHVlPWE7dGhpcy5jb252ZXJzaW9uPWM7dGhpcy5mb3JtYXRfc3BlYz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkpvaW5lZFN0cj1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlcz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJ5dGVzPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMucz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk5hbWVDb25zdGFudD1cbmZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FbGxpcHNpcz1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1hKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7dGhpcy5saW5lbm89YTt0aGlzLmNvbF9vZmZzZXQ9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ29uc3RhbnQ9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkF0dHJpYnV0ZT1cbmZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnZhbHVlPWE7dGhpcy5hdHRyPWM7dGhpcy5jdHg9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdWJzY3JpcHQ9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudmFsdWU9YTt0aGlzLnNsaWNlPWM7dGhpcy5jdHg9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdGFycmVkPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7XG50aGlzLnZhbHVlPWE7dGhpcy5jdHg9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5OYW1lPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5pZD1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTGlzdD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuZWx0cz1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuVHVwbGU9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PVxuYik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuZWx0cz1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU2xpY2U9ZnVuY3Rpb24oYSxjLGIpe3RoaXMubG93ZXI9YTt0aGlzLnVwcGVyPWM7dGhpcy5zdGVwPWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkV4dFNsaWNlPWZ1bmN0aW9uKGEpe3RoaXMuZGltcz1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JbmRleD1mdW5jdGlvbihhKXt0aGlzLnZhbHVlPWE7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLmNvbXByZWhlbnNpb249ZnVuY3Rpb24oYSxjLGIsZSl7dGhpcy50YXJnZXQ9YTt0aGlzLml0ZXI9Yzt0aGlzLmlmcz1iO3RoaXMuaXNfYXN5bmM9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlcj1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1cbmUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnR5cGU9YTt0aGlzLm5hbWU9Yzt0aGlzLmJvZHk9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5hcmd1bWVudHNfPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXt0aGlzLmFyZ3M9YTt0aGlzLnZhcmFyZz1jO3RoaXMua3dvbmx5YXJncz1iO3RoaXMua3dfZGVmYXVsdHM9ZTt0aGlzLmt3YXJnPWY7dGhpcy5kZWZhdWx0cz1sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5hcmc9ZnVuY3Rpb24gYShhLGMpe3RoaXMuYXJnPWE7dGhpcy5hbm5vdGF0aW9uPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLmtleXdvcmQ9ZnVuY3Rpb24oYSxjKXt0aGlzLmFyZz1hO3RoaXMudmFsdWU9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuYWxpYXM9ZnVuY3Rpb24oYSxjKXt0aGlzLm5hbWU9YTt0aGlzLmFzbmFtZT1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy53aXRoaXRlbT1cbmZ1bmN0aW9uKGEsYyl7dGhpcy5jb250ZXh0X2V4cHI9YTt0aGlzLm9wdGlvbmFsX3ZhcnM9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTW9kdWxlLnByb3RvdHlwZS5fYXN0bmFtZT1cIk1vZHVsZVwiO1NrLmFzdG5vZGVzLk1vZHVsZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJkb2NzdHJpbmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kb2NzdHJpbmd9XTtTay5hc3Rub2Rlcy5JbnRlcmFjdGl2ZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbnRlcmFjdGl2ZVwiO1NrLmFzdG5vZGVzLkludGVyYWN0aXZlLnByb3RvdHlwZS5fZmllbGRzPVtcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fV07U2suYXN0bm9kZXMuRXhwcmVzc2lvbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJFeHByZXNzaW9uXCI7U2suYXN0bm9kZXMuRXhwcmVzc2lvbi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLlN1aXRlLnByb3RvdHlwZS5fYXN0bmFtZT1cblwiU3VpdGVcIjtTay5hc3Rub2Rlcy5TdWl0ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmLnByb3RvdHlwZS5fYXN0bmFtZT1cIkZ1bmN0aW9uRGVmXCI7U2suYXN0bm9kZXMuRnVuY3Rpb25EZWYucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ3N9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZGVjb3JhdG9yX2xpc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZWNvcmF0b3JfbGlzdH0sXCJyZXR1cm5zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEucmV0dXJuc30sXCJkb2NzdHJpbmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kb2NzdHJpbmd9XTtTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFzeW5jRnVuY3Rpb25EZWZcIjtTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmLnByb3RvdHlwZS5fZmllbGRzPVxuW1wibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ3N9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZGVjb3JhdG9yX2xpc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZWNvcmF0b3JfbGlzdH0sXCJyZXR1cm5zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEucmV0dXJuc30sXCJkb2NzdHJpbmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kb2NzdHJpbmd9XTtTay5hc3Rub2Rlcy5DbGFzc0RlZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJDbGFzc0RlZlwiO1NrLmFzdG5vZGVzLkNsYXNzRGVmLnByb3RvdHlwZS5fZmllbGRzPVtcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImJhc2VzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYmFzZXN9LFwia2V5d29yZHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl3b3Jkc30sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJkZWNvcmF0b3JfbGlzdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRlY29yYXRvcl9saXN0fSxcblwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuUmV0dXJuLnByb3RvdHlwZS5fYXN0bmFtZT1cIlJldHVyblwiO1NrLmFzdG5vZGVzLlJldHVybi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuRGVsZXRlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkRlbGV0ZVwiO1NrLmFzdG5vZGVzLkRlbGV0ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0c31dO1NrLmFzdG5vZGVzLkFzc2lnbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3NpZ25cIjtTay5hc3Rub2Rlcy5Bc3NpZ24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldHN9LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkF1Z0Fzc2lnbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBdWdBc3NpZ25cIjtcblNrLmFzdG5vZGVzLkF1Z0Fzc2lnbi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFwib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQW5uQXNzaWduLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFubkFzc2lnblwiO1NrLmFzdG5vZGVzLkFubkFzc2lnbi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFwiYW5ub3RhdGlvblwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFubm90YXRpb259LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX0sXCJzaW1wbGVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zaW1wbGV9XTtTay5hc3Rub2Rlcy5Gb3IucHJvdG90eXBlLl9hc3RuYW1lPVwiRm9yXCI7U2suYXN0bm9kZXMuRm9yLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXG5cIml0ZXJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pdGVyfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcIm9yZWxzZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9yZWxzZX1dO1NrLmFzdG5vZGVzLkFzeW5jRm9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFzeW5jRm9yXCI7U2suYXN0bm9kZXMuQXN5bmNGb3IucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcIml0ZXJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pdGVyfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcIm9yZWxzZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9yZWxzZX1dO1NrLmFzdG5vZGVzLldoaWxlLnByb3RvdHlwZS5fYXN0bmFtZT1cIldoaWxlXCI7U2suYXN0bm9kZXMuV2hpbGUucHJvdG90eXBlLl9maWVsZHM9W1widGVzdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRlc3R9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwib3JlbHNlXCIsXG5mdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5JZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJJZlwiO1NrLmFzdG5vZGVzLklmLnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50ZXN0fSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcIm9yZWxzZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9yZWxzZX1dO1NrLmFzdG5vZGVzLldpdGgucHJvdG90eXBlLl9hc3RuYW1lPVwiV2l0aFwiO1NrLmFzdG5vZGVzLldpdGgucHJvdG90eXBlLl9maWVsZHM9W1wiaXRlbXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pdGVtc30sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLkFzeW5jV2l0aC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3luY1dpdGhcIjtTay5hc3Rub2Rlcy5Bc3luY1dpdGgucHJvdG90eXBlLl9maWVsZHM9W1wiaXRlbXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pdGVtc30sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1xuU2suYXN0bm9kZXMuUmFpc2UucHJvdG90eXBlLl9hc3RuYW1lPVwiUmFpc2VcIjtTay5hc3Rub2Rlcy5SYWlzZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJleGNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5leGN9LFwiY2F1c2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jYXVzZX0sXCJpbnN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5zdH0sXCJ0YmFja1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRiYWNrfV07U2suYXN0bm9kZXMuVHJ5LnByb3RvdHlwZS5fYXN0bmFtZT1cIlRyeVwiO1NrLmFzdG5vZGVzLlRyeS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJoYW5kbGVyc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmhhbmRsZXJzfSxcIm9yZWxzZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9yZWxzZX0sXCJmaW5hbGJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5maW5hbGJvZHl9XTtTay5hc3Rub2Rlcy5Bc3NlcnQucHJvdG90eXBlLl9hc3RuYW1lPVwiQXNzZXJ0XCI7XG5Tay5hc3Rub2Rlcy5Bc3NlcnQucHJvdG90eXBlLl9maWVsZHM9W1widGVzdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRlc3R9LFwibXNnXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubXNnfV07U2suYXN0bm9kZXMuSW1wb3J0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkltcG9ydFwiO1NrLmFzdG5vZGVzLkltcG9ydC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuSW1wb3J0RnJvbS5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbXBvcnRGcm9tXCI7U2suYXN0bm9kZXMuSW1wb3J0RnJvbS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJtb2R1bGVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5tb2R1bGV9LFwibmFtZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lc30sXCJsZXZlbFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmxldmVsfV07U2suYXN0bm9kZXMuR2xvYmFsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkdsb2JhbFwiO1NrLmFzdG5vZGVzLkdsb2JhbC5wcm90b3R5cGUuX2ZpZWxkcz1cbltcIm5hbWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZXN9XTtTay5hc3Rub2Rlcy5Ob25sb2NhbC5wcm90b3R5cGUuX2FzdG5hbWU9XCJOb25sb2NhbFwiO1NrLmFzdG5vZGVzLk5vbmxvY2FsLnByb3RvdHlwZS5fZmllbGRzPVtcIm5hbWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZXN9XTtTay5hc3Rub2Rlcy5FeHByLnByb3RvdHlwZS5fYXN0bmFtZT1cIkV4cHJcIjtTay5hc3Rub2Rlcy5FeHByLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5QYXNzLnByb3RvdHlwZS5fYXN0bmFtZT1cIlBhc3NcIjtTay5hc3Rub2Rlcy5QYXNzLnByb3RvdHlwZS5fZmllbGRzPVtdO1NrLmFzdG5vZGVzLkJyZWFrLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJyZWFrXCI7U2suYXN0bm9kZXMuQnJlYWsucHJvdG90eXBlLl9maWVsZHM9W107U2suYXN0bm9kZXMuQ29udGludWUucHJvdG90eXBlLl9hc3RuYW1lPVwiQ29udGludWVcIjtTay5hc3Rub2Rlcy5Db250aW51ZS5wcm90b3R5cGUuX2ZpZWxkcz1cbltdO1NrLmFzdG5vZGVzLlByaW50LnByb3RvdHlwZS5fYXN0bmFtZT1cIlByaW50XCI7U2suYXN0bm9kZXMuUHJpbnQucHJvdG90eXBlLl9maWVsZHM9W1wiZGVzdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRlc3R9LFwidmFsdWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWVzfSxcIm5sXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmx9XTtTay5hc3Rub2Rlcy5EZWJ1Z2dlci5wcm90b3R5cGUuX2FzdG5hbWU9XCJEZWJ1Z2dlclwiO1NrLmFzdG5vZGVzLkRlYnVnZ2VyLnByb3RvdHlwZS5fZmllbGRzPVtdO1NrLmFzdG5vZGVzLkJvb2xPcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJCb29sT3BcIjtTay5hc3Rub2Rlcy5Cb29sT3AucHJvdG90eXBlLl9maWVsZHM9W1wib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJ2YWx1ZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZXN9XTtTay5hc3Rub2Rlcy5CaW5PcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaW5PcFwiO1NrLmFzdG5vZGVzLkJpbk9wLnByb3RvdHlwZS5fZmllbGRzPVxuW1wibGVmdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmxlZnR9LFwib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJyaWdodFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnJpZ2h0fV07U2suYXN0bm9kZXMuVW5hcnlPcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJVbmFyeU9wXCI7U2suYXN0bm9kZXMuVW5hcnlPcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJvcFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9wfSxcIm9wZXJhbmRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcGVyYW5kfV07U2suYXN0bm9kZXMuTGFtYmRhLnByb3RvdHlwZS5fYXN0bmFtZT1cIkxhbWJkYVwiO1NrLmFzdG5vZGVzLkxhbWJkYS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJhcmdzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnc30sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLklmRXhwLnByb3RvdHlwZS5fYXN0bmFtZT1cIklmRXhwXCI7U2suYXN0bm9kZXMuSWZFeHAucHJvdG90eXBlLl9maWVsZHM9W1widGVzdFwiLFxuZnVuY3Rpb24oYSl7cmV0dXJuIGEudGVzdH0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5EaWN0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkRpY3RcIjtTay5hc3Rub2Rlcy5EaWN0LnByb3RvdHlwZS5fZmllbGRzPVtcImtleXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXlzfSxcInZhbHVlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlc31dO1NrLmFzdG5vZGVzLlNldC5wcm90b3R5cGUuX2FzdG5hbWU9XCJTZXRcIjtTay5hc3Rub2Rlcy5TZXQucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmVsdHN9XTtTay5hc3Rub2Rlcy5MaXN0Q29tcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJMaXN0Q29tcFwiO1NrLmFzdG5vZGVzLkxpc3RDb21wLnByb3RvdHlwZS5fZmllbGRzPVtcImVsdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmVsdH0sXCJnZW5lcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2VuZXJhdG9yc31dO1xuU2suYXN0bm9kZXMuU2V0Q29tcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJTZXRDb21wXCI7U2suYXN0bm9kZXMuU2V0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHR9LFwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtTay5hc3Rub2Rlcy5EaWN0Q29tcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJEaWN0Q29tcFwiO1NrLmFzdG5vZGVzLkRpY3RDb21wLnByb3RvdHlwZS5fZmllbGRzPVtcImtleVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmtleX0sXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImdlbmVyYXRvcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5nZW5lcmF0b3JzfV07U2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwLnByb3RvdHlwZS5fYXN0bmFtZT1cIkdlbmVyYXRvckV4cFwiO1NrLmFzdG5vZGVzLkdlbmVyYXRvckV4cC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHR9LFxuXCJnZW5lcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2VuZXJhdG9yc31dO1NrLmFzdG5vZGVzLkF3YWl0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkF3YWl0XCI7U2suYXN0bm9kZXMuQXdhaXQucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLllpZWxkLnByb3RvdHlwZS5fYXN0bmFtZT1cIllpZWxkXCI7U2suYXN0bm9kZXMuWWllbGQucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLllpZWxkRnJvbS5wcm90b3R5cGUuX2FzdG5hbWU9XCJZaWVsZEZyb21cIjtTay5hc3Rub2Rlcy5ZaWVsZEZyb20ucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkNvbXBhcmUucHJvdG90eXBlLl9hc3RuYW1lPVwiQ29tcGFyZVwiO1NrLmFzdG5vZGVzLkNvbXBhcmUucHJvdG90eXBlLl9maWVsZHM9XG5bXCJsZWZ0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVmdH0sXCJvcHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcHN9LFwiY29tcGFyYXRvcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jb21wYXJhdG9yc31dO1NrLmFzdG5vZGVzLkNhbGwucHJvdG90eXBlLl9hc3RuYW1lPVwiQ2FsbFwiO1NrLmFzdG5vZGVzLkNhbGwucHJvdG90eXBlLl9maWVsZHM9W1wiZnVuY1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmZ1bmN9LFwiYXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ3N9LFwia2V5d29yZHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl3b3Jkc31dO1NrLmFzdG5vZGVzLk51bS5wcm90b3R5cGUuX2FzdG5hbWU9XCJOdW1cIjtTay5hc3Rub2Rlcy5OdW0ucHJvdG90eXBlLl9maWVsZHM9W1wiblwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm59XTtTay5hc3Rub2Rlcy5TdHIucHJvdG90eXBlLl9hc3RuYW1lPVwiU3RyXCI7U2suYXN0bm9kZXMuU3RyLnByb3RvdHlwZS5fZmllbGRzPVtcInNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zfV07XG5Tay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJGb3JtYXR0ZWRWYWx1ZVwiO1NrLmFzdG5vZGVzLkZvcm1hdHRlZFZhbHVlLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwiY29udmVyc2lvblwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbnZlcnNpb259LFwiZm9ybWF0X3NwZWNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5mb3JtYXRfc3BlY31dO1NrLmFzdG5vZGVzLkpvaW5lZFN0ci5wcm90b3R5cGUuX2FzdG5hbWU9XCJKb2luZWRTdHJcIjtTay5hc3Rub2Rlcy5Kb2luZWRTdHIucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWVzfV07U2suYXN0bm9kZXMuQnl0ZXMucHJvdG90eXBlLl9hc3RuYW1lPVwiQnl0ZXNcIjtTay5hc3Rub2Rlcy5CeXRlcy5wcm90b3R5cGUuX2ZpZWxkcz1bXCJzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc31dO1NrLmFzdG5vZGVzLk5hbWVDb25zdGFudC5wcm90b3R5cGUuX2FzdG5hbWU9XG5cIk5hbWVDb25zdGFudFwiO1NrLmFzdG5vZGVzLk5hbWVDb25zdGFudC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuRWxsaXBzaXMucHJvdG90eXBlLl9hc3RuYW1lPVwiRWxsaXBzaXNcIjtTay5hc3Rub2Rlcy5FbGxpcHNpcy5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5Db25zdGFudC5wcm90b3R5cGUuX2FzdG5hbWU9XCJDb25zdGFudFwiO1NrLmFzdG5vZGVzLkNvbnN0YW50LnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5BdHRyaWJ1dGUucHJvdG90eXBlLl9hc3RuYW1lPVwiQXR0cmlidXRlXCI7U2suYXN0bm9kZXMuQXR0cmlidXRlLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwiYXR0clwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmF0dHJ9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07XG5Tay5hc3Rub2Rlcy5TdWJzY3JpcHQucHJvdG90eXBlLl9hc3RuYW1lPVwiU3Vic2NyaXB0XCI7U2suYXN0bm9kZXMuU3Vic2NyaXB0LnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwic2xpY2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zbGljZX0sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5TdGFycmVkLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0YXJyZWRcIjtTay5hc3Rub2Rlcy5TdGFycmVkLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuTmFtZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJOYW1lXCI7U2suYXN0bm9kZXMuTmFtZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJpZFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmlkfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1NrLmFzdG5vZGVzLkxpc3QucHJvdG90eXBlLl9hc3RuYW1lPVxuXCJMaXN0XCI7U2suYXN0bm9kZXMuTGlzdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0c30sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5UdXBsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJUdXBsZVwiO1NrLmFzdG5vZGVzLlR1cGxlLnByb3RvdHlwZS5fZmllbGRzPVtcImVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHRzfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1NrLmFzdG5vZGVzLkxvYWQucHJvdG90eXBlLl9hc3RuYW1lPVwiTG9hZFwiO1NrLmFzdG5vZGVzLkxvYWQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuU3RvcmUucHJvdG90eXBlLl9hc3RuYW1lPVwiU3RvcmVcIjtTay5hc3Rub2Rlcy5TdG9yZS5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5EZWwucHJvdG90eXBlLl9hc3RuYW1lPVwiRGVsXCI7U2suYXN0bm9kZXMuRGVsLnByb3RvdHlwZS5faXNlbnVtPSEwO1xuU2suYXN0bm9kZXMuQXVnTG9hZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBdWdMb2FkXCI7U2suYXN0bm9kZXMuQXVnTG9hZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5BdWdTdG9yZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJBdWdTdG9yZVwiO1NrLmFzdG5vZGVzLkF1Z1N0b3JlLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlBhcmFtLnByb3RvdHlwZS5fYXN0bmFtZT1cIlBhcmFtXCI7U2suYXN0bm9kZXMuUGFyYW0ucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuU2xpY2UucHJvdG90eXBlLl9hc3RuYW1lPVwiU2xpY2VcIjtTay5hc3Rub2Rlcy5TbGljZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJsb3dlclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmxvd2VyfSxcInVwcGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudXBwZXJ9LFwic3RlcFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnN0ZXB9XTtTay5hc3Rub2Rlcy5FeHRTbGljZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJFeHRTbGljZVwiO1xuU2suYXN0bm9kZXMuRXh0U2xpY2UucHJvdG90eXBlLl9maWVsZHM9W1wiZGltc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRpbXN9XTtTay5hc3Rub2Rlcy5JbmRleC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbmRleFwiO1NrLmFzdG5vZGVzLkluZGV4LnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5BbmQucHJvdG90eXBlLl9hc3RuYW1lPVwiQW5kXCI7U2suYXN0bm9kZXMuQW5kLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIk9yXCI7U2suYXN0bm9kZXMuT3IucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQWRkLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFkZFwiO1NrLmFzdG5vZGVzLkFkZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5TdWIucHJvdG90eXBlLl9hc3RuYW1lPVwiU3ViXCI7U2suYXN0bm9kZXMuU3ViLnByb3RvdHlwZS5faXNlbnVtPSEwO1xuU2suYXN0bm9kZXMuTXVsdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNdWx0XCI7U2suYXN0bm9kZXMuTXVsdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5NYXRNdWx0LnByb3RvdHlwZS5fYXN0bmFtZT1cIk1hdE11bHRcIjtTay5hc3Rub2Rlcy5NYXRNdWx0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkRpdi5wcm90b3R5cGUuX2FzdG5hbWU9XCJEaXZcIjtTay5hc3Rub2Rlcy5EaXYucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTW9kLnByb3RvdHlwZS5fYXN0bmFtZT1cIk1vZFwiO1NrLmFzdG5vZGVzLk1vZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Qb3cucHJvdG90eXBlLl9hc3RuYW1lPVwiUG93XCI7U2suYXN0bm9kZXMuUG93LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkxTaGlmdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJMU2hpZnRcIjtTay5hc3Rub2Rlcy5MU2hpZnQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuUlNoaWZ0LnByb3RvdHlwZS5fYXN0bmFtZT1cblwiUlNoaWZ0XCI7U2suYXN0bm9kZXMuUlNoaWZ0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkJpdE9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJpdE9yXCI7U2suYXN0bm9kZXMuQml0T3IucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQml0WG9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJpdFhvclwiO1NrLmFzdG5vZGVzLkJpdFhvci5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5CaXRBbmQucHJvdG90eXBlLl9hc3RuYW1lPVwiQml0QW5kXCI7U2suYXN0bm9kZXMuQml0QW5kLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkZsb29yRGl2LnByb3RvdHlwZS5fYXN0bmFtZT1cIkZsb29yRGl2XCI7U2suYXN0bm9kZXMuRmxvb3JEaXYucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuSW52ZXJ0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkludmVydFwiO1NrLmFzdG5vZGVzLkludmVydC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Ob3QucHJvdG90eXBlLl9hc3RuYW1lPVxuXCJOb3RcIjtTay5hc3Rub2Rlcy5Ob3QucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuVUFkZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJVQWRkXCI7U2suYXN0bm9kZXMuVUFkZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5VU3ViLnByb3RvdHlwZS5fYXN0bmFtZT1cIlVTdWJcIjtTay5hc3Rub2Rlcy5VU3ViLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkVxLnByb3RvdHlwZS5fYXN0bmFtZT1cIkVxXCI7U2suYXN0bm9kZXMuRXEucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTm90RXEucHJvdG90eXBlLl9hc3RuYW1lPVwiTm90RXFcIjtTay5hc3Rub2Rlcy5Ob3RFcS5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJMdFwiO1NrLmFzdG5vZGVzLkx0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkx0RS5wcm90b3R5cGUuX2FzdG5hbWU9XCJMdEVcIjtTay5hc3Rub2Rlcy5MdEUucHJvdG90eXBlLl9pc2VudW09XG4hMDtTay5hc3Rub2Rlcy5HdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHdFwiO1NrLmFzdG5vZGVzLkd0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkd0RS5wcm90b3R5cGUuX2FzdG5hbWU9XCJHdEVcIjtTay5hc3Rub2Rlcy5HdEUucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuSXMucHJvdG90eXBlLl9hc3RuYW1lPVwiSXNcIjtTay5hc3Rub2Rlcy5Jcy5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Jc05vdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJc05vdFwiO1NrLmFzdG5vZGVzLklzTm90LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkluLnByb3RvdHlwZS5fYXN0bmFtZT1cIkluXCI7U2suYXN0bm9kZXMuSW4ucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTm90SW4ucHJvdG90eXBlLl9hc3RuYW1lPVwiTm90SW5cIjtTay5hc3Rub2Rlcy5Ob3RJbi5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uLnByb3RvdHlwZS5fYXN0bmFtZT1cblwiY29tcHJlaGVuc2lvblwiO1NrLmFzdG5vZGVzLmNvbXByZWhlbnNpb24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcIml0ZXJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pdGVyfSxcImlmc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmlmc30sXCJpc19hc3luY1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmlzX2FzeW5jfV07U2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlci5wcm90b3R5cGUuX2FzdG5hbWU9XCJFeGNlcHRIYW5kbGVyXCI7U2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0eXBlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZX0sXCJuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLmFyZ3VtZW50c18ucHJvdG90eXBlLl9hc3RuYW1lPVwiYXJndW1lbnRzXCI7U2suYXN0bm9kZXMuYXJndW1lbnRzXy5wcm90b3R5cGUuX2ZpZWxkcz1cbltcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcInZhcmFyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhcmFyZ30sXCJrd29ubHlhcmdzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua3dvbmx5YXJnc30sXCJrd19kZWZhdWx0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3X2RlZmF1bHRzfSxcImt3YXJnXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua3dhcmd9LFwiZGVmYXVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZWZhdWx0c31dO1NrLmFzdG5vZGVzLmFyZy5wcm90b3R5cGUuX2FzdG5hbWU9XCJhcmdcIjtTay5hc3Rub2Rlcy5hcmcucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnfSxcImFubm90YXRpb25cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hbm5vdGF0aW9ufV07U2suYXN0bm9kZXMua2V5d29yZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJrZXl3b3JkXCI7U2suYXN0bm9kZXMua2V5d29yZC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJhcmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmd9LFxuXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuYWxpYXMucHJvdG90eXBlLl9hc3RuYW1lPVwiYWxpYXNcIjtTay5hc3Rub2Rlcy5hbGlhcy5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0sXCJhc25hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hc25hbWV9XTtTay5hc3Rub2Rlcy53aXRoaXRlbS5wcm90b3R5cGUuX2FzdG5hbWU9XCJ3aXRoaXRlbVwiO1NrLmFzdG5vZGVzLndpdGhpdGVtLnByb3RvdHlwZS5fZmllbGRzPVtcImNvbnRleHRfZXhwclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbnRleHRfZXhwcn0sXCJvcHRpb25hbF92YXJzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B0aW9uYWxfdmFyc31dO1NrLmV4cG9ydFN5bWJvbChcIlNrLmFzdG5vZGVzXCIsU2suYXN0bm9kZXMpfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMuY19lbmNvZGluZz1hO3RoaXMuY19maWxlbmFtZT1iO3RoaXMuY19mbGFncz1cbmN8fDB9ZnVuY3Rpb24gYyhhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwibm9kZSBtdXN0IGJlIGRlZmluZWRcIik7cmV0dXJuIG51bGw9PT1hLmNoaWxkcmVuPzA6YS5jaGlsZHJlbi5sZW5ndGh9ZnVuY3Rpb24gYihhLGIpe1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJub2RlIG11c3QgYmUgZGVmaW5lZFwiKTtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1iLFwiaW5kZXggb2YgY2hpbGQgbXVzdCBiZSBzcGVjaWZpZWRcIik7cmV0dXJuIGEuY2hpbGRyZW5bYl19ZnVuY3Rpb24gZShhLGIpe1NrLmFzc2VydHMuYXNzZXJ0KGEudHlwZT09PWIsXCJub2RlIHdhc24ndCBleHBlY3RlZCB0eXBlXCIpfWZ1bmN0aW9uIGYoYSxiLGMpe3Rocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKGMsYS5jX2ZpbGVuYW1lLGIubGluZW5vKTt9ZnVuY3Rpb24gbChhKXtTay5hc3NlcnRzLmFzc2VydChcInN0cmluZ1wiPT09dHlwZW9mIGEsXCJleHBlY3Rpbmcgc3RyaW5nLCBnb3QgXCIrdHlwZW9mIGEpO1xucmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBoKGEpe3ZhciBkLGU7c3dpdGNoKGEudHlwZSl7Y2FzZSByLnNpbmdsZV9pbnB1dDppZihiKGEsMCkudHlwZT09PXouVF9ORVdMSU5FKWJyZWFrO2Vsc2UgcmV0dXJuIGgoYihhLDApKTtjYXNlIHIuZmlsZV9pbnB1dDpmb3IoZD1lPTA7ZDxjKGEpOysrZCl7dmFyIGY9YihhLGQpO2YudHlwZT09PXIuc3RtdCYmKGUrPWgoZikpfXJldHVybiBlO2Nhc2Ugci5zdG10OnJldHVybiBoKGIoYSwwKSk7Y2FzZSByLmNvbXBvdW5kX3N0bXQ6cmV0dXJuIDE7Y2FzZSByLnNpbXBsZV9zdG10OnJldHVybiBNYXRoLmZsb29yKGMoYSkvMik7Y2FzZSByLnN1aXRlOmlmKDE9PT1jKGEpKXJldHVybiBoKGIoYSwwKSk7ZT0wO2ZvcihkPTI7ZDxjKGEpLTE7KytkKWUrPWgoYihhLGQpKTtyZXR1cm4gZTtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcIk5vbi1zdGF0ZW1lbnQgZm91bmRcIil9cmV0dXJuIDB9ZnVuY3Rpb24gZChhLGIsYyxkKXtjIGluc3RhbmNlb2ZcblNrLmJ1aWx0aW4uc3RyJiYoYz1jLnYpO2lmKFwiTm9uZVwiPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFzc2lnbm1lbnQgdG8gTm9uZVwiLGEuY19maWxlbmFtZSxkKTtpZihcIlRydWVcIj09PWN8fFwiRmFsc2VcIj09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIFRydWUgb3IgRmFsc2UgaXMgZm9yYmlkZGVuXCIsYS5jX2ZpbGVuYW1lLGQpO31mdW5jdGlvbiBnKGEsYixjLGUpe3ZhciBmO1NrLmFzc2VydHMuYXNzZXJ0KGMhPT1Tay5hc3Rub2Rlcy5BdWdTdG9yZSYmYyE9PVNrLmFzdG5vZGVzLkF1Z0xvYWQsXCJjb250ZXh0IG5vdCBBdWdTdG9yZSBvciBBdWdMb2FkXCIpO3ZhciBoPWY9bnVsbDtzd2l0Y2goYi5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5BdHRyaWJ1dGU6Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOmM9PT1Tay5hc3Rub2Rlcy5TdG9yZSYmZChhLGUsYi5hdHRyLGUubGluZW5vKTtiLmN0eD1jO2JyZWFrO1xuY2FzZSBTay5hc3Rub2Rlcy5TdGFycmVkOmIuY3R4PWM7ZyhhLGIudmFsdWUsYyxlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDpiLmN0eD1jO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDpiLmN0eD1jO2Y9Yi5lbHRzO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuVHVwbGU6aWYoMD09PWIuZWx0cy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJjYW4ndCBhc3NpZ24gdG8gKClcIixhLmNfZmlsZW5hbWUsZS5saW5lbm8pO2IuY3R4PWM7Zj1iLmVsdHM7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MYW1iZGE6aD1cImxhbWJkYVwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ2FsbDpoPVwiZnVuY3Rpb24gY2FsbFwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQm9vbE9wOmNhc2UgU2suYXN0bm9kZXMuQmluT3A6Y2FzZSBTay5hc3Rub2Rlcy5VbmFyeU9wOmg9XCJvcGVyYXRvclwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwOmg9XCJnZW5lcmF0b3IgZXhwcmVzc2lvblwiO1xuYnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5ZaWVsZDpoPVwieWllbGQgZXhwcmVzc2lvblwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdENvbXA6aD1cImxpc3QgY29tcHJlaGVuc2lvblwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU2V0Q29tcDpoPVwic2V0IGNvbXByZWhlbnNpb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3RDb21wOmg9XCJkaWN0IGNvbXByZWhlbnNpb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3Q6Y2FzZSBTay5hc3Rub2Rlcy5TZXQ6Y2FzZSBTay5hc3Rub2Rlcy5OdW06Y2FzZSBTay5hc3Rub2Rlcy5TdHI6aD1cImxpdGVyYWxcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudDpoPVwiVHJ1ZSwgRmFsc2Ugb3IgTm9uZVwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ29tcGFyZTpoPVwiY29tcGFyaXNvblwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmVwcjpoPVwicmVwclwiO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuSWZFeHA6aD1cImNvbmRpdGlvbmFsIGV4cHJlc3Npb25cIjtcbmJyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGV4cHJlc3Npb24gaW4gYXNzaWdubWVudFwiKX1pZihoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgXCIrKGM9PT1Tay5hc3Rub2Rlcy5TdG9yZT9cImFzc2lnbiB0b1wiOlwiZGVsZXRlXCIpK1wiIFwiK2gsYS5jX2ZpbGVuYW1lLGUubGluZW5vKTtpZihmKWZvcihiPTA7YjxmLmxlbmd0aDsrK2IpZyhhLGZbYl0sYyxlKX1mdW5jdGlvbiBuKGEpe2lmKHZvaWQgMD09PU9bYS50eXBlXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImludmFsaWQgc3ludGF4XCIsYS50eXBlLGEubGluZW5vKTtyZXR1cm4gT1thLnR5cGVdfWZ1bmN0aW9uIGsoYSxiKXtyZXR1cm4gYS52YWx1ZT9uZXcgU2suYnVpbHRpbi5zdHIoYS52YWx1ZSk6bmV3IFNrLmJ1aWx0aW4uc3RyKGEpfWZ1bmN0aW9uIHAoYSxkKXtlKGQsci5jb21wX29wKTtpZigxPT09YyhkKSlzd2l0Y2goZD1iKGQsMCksZC50eXBlKXtjYXNlIHouVF9MRVNTOnJldHVybiBTay5hc3Rub2Rlcy5MdDtcbmNhc2Ugei5UX0dSRUFURVI6cmV0dXJuIFNrLmFzdG5vZGVzLkd0O2Nhc2Ugei5UX0VRRVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLkVxO2Nhc2Ugei5UX0xFU1NFUVVBTDpyZXR1cm4gU2suYXN0bm9kZXMuTHRFO2Nhc2Ugei5UX0dSRUFURVJFUVVBTDpyZXR1cm4gU2suYXN0bm9kZXMuR3RFO2Nhc2Ugei5UX05PVEVRVUFMOnJldHVybiBTay5hc3Rub2Rlcy5Ob3RFcTtjYXNlIHouVF9OQU1FOmlmKFwiaW5cIj09PWQudmFsdWUpcmV0dXJuIFNrLmFzdG5vZGVzLkluO2lmKFwiaXNcIj09PWQudmFsdWUpcmV0dXJuIFNrLmFzdG5vZGVzLklzfWVsc2UgaWYoMj09PWMoZCkmJmIoZCwwKS50eXBlPT09ei5UX05BTUUpe2lmKFwiaW5cIj09PWIoZCwxKS52YWx1ZSlyZXR1cm4gU2suYXN0bm9kZXMuTm90SW47aWYoXCJpc1wiPT09YihkLDApLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5Jc05vdH1Tay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIGNvbXBfb3BcIil9ZnVuY3Rpb24gdShhLGIpe2EmJihhLmxpbmVubz1cbmIubGluZW5vLGEuY29sX29mZnNldD1iLmNvbF9vZmZzZXQsYS5lbmRfbGluZW5vPWIuZW5kX2xpbmVubyxhLmVuZF9jb2xfb2Zmc2V0PWIuZW5kX2NvbF9vZmZzZXQpO3JldHVybiBhfWZ1bmN0aW9uIEEoYSxkKXt2YXIgZSxmPVtdO1NrLmFzc2VydHMuYXNzZXJ0KGQudHlwZT09PXIudGVzdGxpc3R8fGQudHlwZT09PXIudGVzdGxpc3Rfc3Rhcl9leHByfHxkLnR5cGU9PT1yLmxpc3RtYWtlcnx8ZC50eXBlPT09ci50ZXN0bGlzdF9jb21wfHxkLnR5cGU9PT1yLnRlc3RsaXN0X3NhZmV8fGQudHlwZT09PXIudGVzdGxpc3QxLFwibm9kZSB0eXBlIG11c3QgYmUgbGlzdGxpa2VcIik7Zm9yKGU9MDtlPGMoZCk7ZSs9MilTay5hc3NlcnRzLmFzc2VydChiKGQsZSkudHlwZT09PXIudGVzdHx8YihkLGUpLnR5cGU9PT1yLm9sZF90ZXN0fHxiKGQsZSkudHlwZT09PXIuc3Rhcl9leHByKSxmW2UvMl09dyhhLGIoZCxlKSk7cmV0dXJuIGZ9ZnVuY3Rpb24gdChhLGQpe3ZhciBmO2UoZCxyLnN1aXRlKTtcbnZhciBnPVtdO3ZhciBrPTA7aWYoYihkLDApLnR5cGU9PT1yLnNpbXBsZV9zdG10KXtkPWIoZCwwKTt2YXIgeD1jKGQpLTE7YihkLHgtMSkudHlwZT09PXouVF9TRU1JJiYtLXg7Zm9yKGY9MDtmPHg7Zis9MilnW2srK109TihhLGIoZCxmKSl9ZWxzZSBmb3IoZj0yO2Y8YyhkKS0xOysrZil7eD1iKGQsZik7ZSh4LHIuc3RtdCk7dmFyIG49aCh4KTtpZigxPT09bilnW2srK109TihhLHgpO2Vsc2UgZm9yKHg9Yih4LDApLGUoeCxyLnNpbXBsZV9zdG10KSxuPTA7bjxjKHgpO24rPTIpe2lmKDA9PT1jKGIoeCxuKSkpe1NrLmFzc2VydHMuYXNzZXJ0KG4rMT09PWMoeCkpO2JyZWFrfWdbaysrXT1OKGEsYih4LG4pKX19U2suYXNzZXJ0cy5hc3NlcnQoaz09PWgoZCkpO3JldHVybiBnfWZ1bmN0aW9uIHYoYSxkLGYpe3ZhciBoO2UoZCxyLmV4cHJsaXN0KTt2YXIgaz1bXTtmb3IoaD0wO2g8YyhkKTtoKz0yKXt2YXIgeD13KGEsYihkLGgpKTtrW2gvMl09eDtmJiZnKGEseCxmLGIoZCxoKSl9cmV0dXJuIGt9XG5mdW5jdGlvbiBCKGEsZCl7YTpmb3IoOzspc3dpdGNoKGQudHlwZSl7Y2FzZSByLmltcG9ydF9hc19uYW1lOmE9bnVsbDt2YXIgZT1sKGIoZCwwKS52YWx1ZSk7Mz09PWMoZCkmJihhPWIoZCwyKS52YWx1ZSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hbGlhcyhlLG51bGw9PWE/bnVsbDpsKGEpKTtjYXNlIHIuZG90dGVkX2FzX25hbWU6aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9ZWxzZSByZXR1cm4gYT1CKGEsYihkLDApKSxTay5hc3NlcnRzLmFzc2VydCghYS5hc25hbWUpLGEuYXNuYW1lPWwoYihkLDIpLnZhbHVlKSxhO2Nhc2Ugci5kb3R0ZWRfbmFtZTppZigxPT09YyhkKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLmFsaWFzKGwoYihkLDApLnZhbHVlKSxudWxsKTthPVwiXCI7Zm9yKGU9MDtlPGMoZCk7ZSs9MilhKz1iKGQsZSkudmFsdWUrXCIuXCI7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hbGlhcyhsKGEuc3Vic3RyKDAsYS5sZW5ndGgtMSkpLG51bGwpO2Nhc2Ugei5UX1NUQVI6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hbGlhcyhsKFwiKlwiKSxcbm51bGwpO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ1bmV4cGVjdGVkIGltcG9ydCBuYW1lXCIsYS5jX2ZpbGVuYW1lLGQubGluZW5vKTt9fWZ1bmN0aW9uIEQoYSxiKXtTay5hc3NlcnRzLmFzc2VydChiLnR5cGU9PXIudGVzdGxpc3RfY29tcHx8Yi50eXBlPT1yLmFyZ3VtZW50KTtyZXR1cm4gYWEoYSxiLDApfWZ1bmN0aW9uIEUoYSxkKXtpZihiKGQsMCkudHlwZT09PXouVF9NSU5VUyYmMj09PWMoZCkpe3ZhciBlPWIoZCwxKTtpZihlLnR5cGU9PT1yLmZhY3RvciYmMT09PWMoZSkmJihlPWIoZSwwKSxlLnR5cGU9PT1yLnBvd2VyJiYxPT09YyhlKSkpe3ZhciBmPWIoZSwwKTtpZihmLnR5cGU9PT1yLmF0b20mJihlPWIoZiwwKSxlLnR5cGU9PT16LlRfTlVNQkVSKSlyZXR1cm4gZS52YWx1ZT1cIi1cIitlLnZhbHVlLFIoYSxmKX19YT13KGEsYihkLDEpKTtzd2l0Y2goYihkLDApLnR5cGUpe2Nhc2Ugei5UX1BMVVM6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5VbmFyeU9wKFNrLmFzdG5vZGVzLlVBZGQsXG5hLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSB6LlRfTUlOVVM6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5VbmFyeU9wKFNrLmFzdG5vZGVzLlVTdWIsYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX1RJTERFOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5JbnZlcnQsYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpfVNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBmYWN0b3JcIil9ZnVuY3Rpb24gRihhLGcsaCxrKXt2YXIgeCxuLGw7ZShnLHIuYXJnbGlzdCk7Zm9yKHg9bD1uPTA7eDxjKGcpO3grKyl7dmFyIHA9YihnLHgpO3AudHlwZT09ci5hcmd1bWVudCYmKDE9PWMocCk/bisrOmIocCwxKS50eXBlPT1yLmNvbXBfZm9yPyhuKyssa3x8ZihhLHAsXCJpbnZhbGlkIHN5bnRheFwiKSwxPGMoZykmJmYoYSxwLFwiR2VuZXJhdG9yIGV4cHJlc3Npb24gbXVzdCBiZSBwYXJlbnRoZXNpemVkXCIpKTpiKHAsMCkudHlwZT09ei5UX1NUQVI/bisrOmwrKyl9dmFyIFM9XG5bXTt2YXIgbT1bXTtmb3IoeD1rPWw9bj0wO3g8YyhnKTt4KyspaWYocD1iKGcseCkscC50eXBlPT1yLmFyZ3VtZW50KXt2YXIgSj1iKHAsMCk7aWYoMT09YyhwKSl7bCYmKGs/ZihhLEosXCJwb3NpdGlvbmFsIGFyZ3VtZW50IGZvbGxvd3Mga2V5d29yZCBhcmd1bWVudCB1bnBhY2tpbmdcIik6ZihhLEosXCJwb3NpdGlvbmFsIGFyZ3VtZW50IGZvbGxvd3Mga2V5d29yZCBhcmd1bWVudFwiKSk7dmFyIEs9dyhhLEopO2lmKCFLKXJldHVybiBudWxsO1NbbisrXT1LfWVsc2UgaWYoSi50eXBlPT16LlRfU1RBUil7aWYoaylyZXR1cm4gZihhLEosXCJpdGVyYWJsZSBhcmd1bWVudCB1bnBhY2tpbmcgZm9sbG93cyBrZXl3b3JkIGFyZ3VtZW50IHVucGFja2luZ1wiKSxudWxsO0s9dyhhLGIocCwxKSk7aWYoIUspcmV0dXJuIG51bGw7cD1uZXcgU2suYXN0bm9kZXMuU3RhcnJlZChLLFNrLmFzdG5vZGVzLkxvYWQsSi5saW5lbm8sSi5jb2xfb2Zmc2V0KTtTW24rK109cH1lbHNlIGlmKEoudHlwZT09ei5UX0RPVUJMRVNUQVIpe3grKztcbks9dyhhLGIocCwxKSk7aWYoIUspcmV0dXJuIG51bGw7cD1uZXcgU2suYXN0bm9kZXMua2V5d29yZChudWxsLEspO21bbCsrXT1wO2srK31lbHNlIGlmKGIocCwxKS50eXBlPT1yLmNvbXBfZm9yKXtLPUQoYSxwKTtpZighSylyZXR1cm4gbnVsbDtTW24rK109S31lbHNle3ZhciB1O0s9dyhhLEopO2lmKCFLKXJldHVybiBudWxsO2lmKEsuY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5MYW1iZGEpcmV0dXJuIGYoYSxKLFwibGFtYmRhIGNhbm5vdCBjb250YWluIGFzc2lnbm1lbnRcIiksbnVsbDtpZihLLmNvbnN0cnVjdG9yIT09U2suYXN0bm9kZXMuTmFtZSlyZXR1cm4gZihhLEosXCJrZXl3b3JkIGNhbid0IGJlIGFuIGV4cHJlc3Npb25cIiksbnVsbDtpZihkKGEsSy5pZCxwLDEpKXJldHVybiBudWxsO3ZhciBBPUsuaWQ7Zm9yKHU9MDt1PGw7dSsrKWlmKChLPW1bdV0uYXJnKSYmSz09PUEpcmV0dXJuIGYoYSxKLFwia2V5d29yZCBhcmd1bWVudCByZXBlYXRlZFwiKSxudWxsO0s9dyhhLGIocCxcbjIpKTtpZighSylyZXR1cm4gbnVsbDtwPW5ldyBTay5hc3Rub2Rlcy5rZXl3b3JkKEEsSyk7bVtsKytdPXB9fXJldHVybiBuZXcgU2suYXN0bm9kZXMuQ2FsbChoLFMsbSxoLmxpbmVubyxoLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIE0oYSxkLGYpe2UoZCxyLnRyYWlsZXIpO2lmKGIoZCwwKS50eXBlPT16LlRfTFBBUilyZXR1cm4gMj09YyhkKT9uZXcgU2suYXN0bm9kZXMuQ2FsbChmLG51bGwsbnVsbCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOkYoYSxiKGQsMSksZiwhMCk7aWYoYihkLDApLnR5cGU9PXouVF9ET1Qpe3ZhciBnPWsoYihkLDEpKTtyZXR1cm4gZz9uZXcgU2suYXN0bm9kZXMuQXR0cmlidXRlKGYsZyxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk6bnVsbH1lKGIoZCwwKSx6LlRfTFNRQik7ZShiKGQsMiksei5UX1JTUUIpO2Q9YihkLDEpO2lmKDE9PWMoZCkpcmV0dXJuKGc9SShhLGIoZCwwKSkpP25ldyBTay5hc3Rub2Rlcy5TdWJzY3JpcHQoZixnLFxuU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOm51bGw7dmFyIGgsbj0xLHg9W107Zm9yKGg9MDtoPGMoZCk7aCs9Mil7Zz1JKGEsYihkLGgpKTtpZighZylyZXR1cm4gbnVsbDtnLmtpbmQhPVouSW5kZXhfa2luZCYmKG49MCk7eFtoLzJdPWd9aWYoIW4pcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5TdWJzY3JpcHQoZixuZXcgU2suYXN0bm9kZXMuRXh0U2xpY2UoeCksU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2E9W107Zm9yKGg9MDtoPHgubGVuZ3RoOysraClnPXhbaF0sU2suYXNzZXJ0cy5hc3NlcnQoZy5raW5kPT1aLkluZGV4X2tpbmQmJmcudi5JbmRleC52YWx1ZSksYVtoXT1nLnYuSW5kZXgudmFsdWU7Zz1uZXcgU2suYXN0bm9kZXMuVHVwbGUoYSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5TdWJzY3JpcHQoZixuZXcgU2suYXN0bm9kZXMuSW5kZXgoZyksU2suYXN0bm9kZXMuTG9hZCxcbmQubGluZW5vLGQuY29sX29mZnNldCl9ZnVuY3Rpb24gVihhLGQpe2UoZCxyLmZsb3dfc3RtdCk7dmFyIGc9YihkLDApO3N3aXRjaChnLnR5cGUpe2Nhc2Ugci5icmVha19zdG10OnJldHVybiBuZXcgU2suYXN0bm9kZXMuQnJlYWsoZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtjYXNlIHIuY29udGludWVfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNvbnRpbnVlKGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7Y2FzZSByLnlpZWxkX3N0bXQ6cmV0dXJuKGE9dyhhLGIoZywwKSkpP25ldyBTay5hc3Rub2Rlcy5FeHByKGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpudWxsO2Nhc2Ugci5yZXR1cm5fc3RtdDppZigxPT1jKGcpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuUmV0dXJuKG51bGwsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxcbmQuZW5kX2NvbF9vZmZzZXQpO3ZhciBoPVcoYSxiKGcsMSkpO3JldHVybiBoP25ldyBTay5hc3Rub2Rlcy5SZXR1cm4oaCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOm51bGw7Y2FzZSByLnJhaXNlX3N0bXQ6aWYoMT09YyhnKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlJhaXNlKG51bGwsbnVsbCxudWxsLG51bGwsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtpZigyPD1jKGcpKXt2YXIgaz1udWxsO2g9dyhhLGIoZywxKSk7dmFyIG49bnVsbCx4PW51bGw7ND09YyhnKSYmXCJmcm9tXCI9PWIoZywyKS52YWx1ZT8oU2suX19mdXR1cmVfXy5weXRob24zfHxmKGEsYihnLDIpLFwicmFpc2UgLi4uIGZyb20gLi4uIGlzIG5vdCBhdmFpbGFibGUgaW4gUHl0aG9uIDJcIiksaz13KGEsYihnLDMpKSk6NDw9YyhnKSYmXCIsXCI9PWIoZywyKS52YWx1ZSYmKFNrLl9fZnV0dXJlX18ucHl0aG9uMyYmZihhLFxuZCxcIk9sZCByYWlzZSBzeW50YXggaXMgbm90IGF2YWlsYWJsZSBpbiBQeXRob24gM1wiKSxuPXcoYSxiKGcsMykpLDY9PWMoZykmJih4PXcoYSxiKGcsNSkpKSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5SYWlzZShoLGssbix4LGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCl9ZGVmYXVsdDpyZXR1cm4gU2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCBmbG93X3N0bXQ6IFwiLGcudHlwZSksbnVsbH19ZnVuY3Rpb24geShhLGUpe3ZhciBmPW51bGw7U2suYXNzZXJ0cy5hc3NlcnQoZS50eXBlPT09ci50ZnBkZWZ8fGUudHlwZT09PXIudmZwZGVmKTt2YXIgZz1iKGUsMCk7ZChhLGcsZy52YWx1ZSxnLmxpbmVubyk7Zz1sKGcudmFsdWUpOzM9PWMoZSkmJmIoZSwxKS50eXBlPT09ei5UX0NPTE9OJiYoZj13KGEsYihlLDIpKSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hcmcoZyxmLGUubGluZW5vLGUuY29sX29mZnNldCl9ZnVuY3Rpb24gRyhhLFxuZSxnLGgsayl7dmFyIG49Zyx4PTA7aHx8ZihhLGIoZSxnKSxcIm5hbWVkIGFyZ3VtZW50cyBtdXN0IGZvbGxvdyBiYXJlICpcIik7Zm9yKFNrLmFzc2VydHMuYXNzZXJ0KGspO248YyhlKTspe3ZhciBwPWIoZSxuKTtzd2l0Y2gocC50eXBlKXtjYXNlIHIudmZwZGVmOmNhc2Ugci50ZnBkZWY6bisxPGMoZSkmJmIoZSxuKzEpLnR5cGU9PXouVF9FUVVBTD8oa1t4XT13KGEsYihlLG4rMikpLG4rPTIpOmtbeF09bnVsbDt2YXIgbT0zPT1jKHApP3coYSxiKHAsMikpOm51bGw7cD1iKHAsMCk7ZChhLHAscC52YWx1ZSxwLmxpbmVubyk7Zz1sKHAudmFsdWUpO2hbeCsrXT1uZXcgU2suYXN0bm9kZXMuYXJnKGcsbSxwLmxpbmVubyxwLmNvbF9vZmZzZXQpO24rPTI7YnJlYWs7Y2FzZSB6LlRfRE9VQkxFU1RBUjpyZXR1cm4gbjtkZWZhdWx0OmYoYSxwLFwidW5leHBlY3RlZCBub2RlXCIpfX1yZXR1cm4gbn1mdW5jdGlvbiBMKGEsZCl7dmFyIGUsZixnLGg9W10saz1bXSxuPVtdLHg9W10sbD1udWxsLFxucD1udWxsO2lmKGQudHlwZT09PXIucGFyYW1ldGVycyl7aWYoMj09PWMoZCkpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hcmd1bWVudHNfKFtdLG51bGwsW10sW10sbnVsbCxbXSk7ZD1iKGQsMSl9U2suYXNzZXJ0cy5hc3NlcnQoZC50eXBlPT09ci52YXJhcmdzbGlzdHx8ZC50eXBlPT09ci50eXBlZGFyZ3NsaXN0KTtmb3IoZT1mPWc9MDtnPGMoZCk7KXt2YXIgbT1iKGQsZyk7c3dpdGNoKG0udHlwZSl7Y2FzZSByLnRmcGRlZjpjYXNlIHIudmZwZGVmOmlmKGcrMTxjKGQpJiZiKGQsZysxKS50eXBlPT16LlRfRVFVQUwpe2tbZisrXT13KGEsYihkLGcrMikpO2crPTI7dmFyIEo9MX1lbHNlIGlmKEopdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJub24tZGVmYXVsdCBhcmd1bWVudCBmb2xsb3dzIGRlZmF1bHQgYXJndW1lbnRcIixhLmNfZmlsZW5hbWUsZC5saW5lbm8pO2hbZSsrXT15KGEsbSk7Zys9MjticmVhaztjYXNlIHouVF9TVEFSOmlmKGcrMT49YyhkKXx8ZysyPT1cbmMoZCkmJmIoZCxnKzEpLnR5cGU9PXouVF9DT01NQSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm5hbWVkIGFyZ3VtZW50cyBtdXN0IGZvbGxvdyBiYXJlICpcIixhLmNfZmlsZW5hbWUsZC5saW5lbm8pO209YihkLGcrMSk7bS50eXBlPT16LlRfQ09NTUE/KGcrPTIsZz1HKGEsZCxnLG4seCkpOihsPXkoYSxtKSxnKz0zLGc8YyhkKSYmKGIoZCxnKS50eXBlPT1yLnRmcGRlZnx8YihkLGcpLnR5cGU9PXIudmZwZGVmKSYmKGc9RyhhLGQsZyxuLHgpKSk7YnJlYWs7Y2FzZSB6LlRfRE9VQkxFU1RBUjptPWIoZCxnKzEpO1NrLmFzc2VydHMuYXNzZXJ0KG0udHlwZT09ci50ZnBkZWZ8fG0udHlwZT09ci52ZnBkZWYpO3A9eShhLG0pO2crPTM7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmV4cGVjdGVkIG5vZGUgaW4gdmFyYXJnc2xpc3RcIik7cmV0dXJufX1yZXR1cm4gbmV3IFNrLmFzdG5vZGVzLmFyZ3VtZW50c18oaCxsLG4seCxwLGspfWZ1bmN0aW9uIFQoYSxcbmcsaCxuKXt2YXIgeD1uP2IoZywxKTpnLGw9bnVsbCxwPTEsbT1udWxsO2lmKG4mJjU+YS5jX2ZlYXR1cmVfdmVyc2lvbilyZXR1cm4gZihhLHgsXCJBc3luYyBmdW5jdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIFB5dGhvbiAzLjUgYW5kIGdyZWF0ZXJcIiksbnVsbDtlKHgsci5mdW5jZGVmKTt2YXIgUz1rKGIoeCxwKSk7aWYoZChhLFMsYih4LHApLDApKXJldHVybiBudWxsO3ZhciBKPUwoYSxiKHgscCsxKSk7aWYoIUopcmV0dXJuIG51bGw7aWYoYih4LHArMikudHlwZT09ei5UX1JBUlJPVyl7bD13KGEsYih4LHArMykpO2lmKCFsKXJldHVybiBudWxsO3ArPTJ9aWYoYih4LHArMykudHlwZT09ei5UX1RZUEVfQ09NTUVOVCl7bT16LlRfTkVXX1RZUEVfQ09NTUVOVChiKHgscCszKSk7aWYoIW0pcmV0dXJuIG51bGw7cCs9MX12YXIgSz10KGEsYih4LHArMykpO2lmKCFLKXJldHVybiBudWxsO2lmKDE8YyhiKHgscCszKSkmJihwPWIoYih4LHArMyksMSkscC50eXBlPT16LlRfVFlQRV9DT01NRU5UKSl7aWYobnVsbCE9XG5tKXJldHVybiBmKGEseCxcIkNhbm5vdCBoYXZlIHR3byB0eXBlIGNvbW1lbnRzIG9uIGRlZlwiKSxudWxsO209ei5UX05FV19UWVBFX0NPTU1FTlQocCk7aWYoIW0pcmV0dXJuIG51bGx9cmV0dXJuIG4/bmV3IFNrLmFzdG5vZGVzLkFzeW5jRnVuY3Rpb25EZWYoUyxKLEssaCxsLG0sZy5saW5lbm8sZy5jb2xfb2Zmc2V0LHZvaWQgMCx2b2lkIDApOm5ldyBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZihTLEosSyxoLGwsbSx4LmxpbmVubyx4LmNvbF9vZmZzZXQsdm9pZCAwLHZvaWQgMCl9ZnVuY3Rpb24gUChhLGYsZyl7ZShmLHIuY2xhc3NkZWYpO2lmKDQ9PWMoZikpe3ZhciBoPXQoYSxiKGYsMykpO3ZhciBuPWsoYihmLDEpLnZhbHVlKTtkKGEsYihmLDMpLG4sZi5saW5lbm8pO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQ2xhc3NEZWYobixbXSxbXSxoLGcsbnVsbCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWlmKGIoZiwzKS50eXBlPT09ei5UX1JQQVIpcmV0dXJuIGg9dChhLGIoZiw1KSksbj1cbmsoYihmLDEpLnZhbHVlKSxkKGEsYihmLDMpLG4sYihmLDMpLmxpbmVubyksbmV3IFNrLmFzdG5vZGVzLkNsYXNzRGVmKG4sW10sW10saCxnLG51bGwsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtuPWsoYihmLDEpKTtuPW5ldyBTay5hc3Rub2Rlcy5OYW1lKG4sU2suYXN0bm9kZXMuTG9hZCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpO3ZhciBsPUYoYSxiKGYsMyksbiwhMSk7aD10KGEsYihmLDYpKTtuPWsoYihmLDEpLnZhbHVlKTtkKGEsYihmLDEpLG4sYihmLDEpLmxpbmVubyk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5DbGFzc0RlZihuLGwuYXJncyxsLmtleXdvcmRzLGgsZyxudWxsLGYubGluZW5vLGYuY29sX29mZnNldCl9ZnVuY3Rpb24gUShhLGQpe2Z1bmN0aW9uIGYoYSxkKXtmb3IoYT0wOzspe2UoZCxyLmNvbXBfaXRlcik7aWYoYihkLDApLnR5cGU9PT1yLmNvbXBfZm9yKXJldHVybiBhO2Q9YihkLDApO2UoZCxyLmNvbXBfaWYpO2ErKztpZigyPT09YyhkKSlyZXR1cm4gYTtkPVxuYihkLDIpfX12YXIgZzt2YXIgaD1mdW5jdGlvbihhLGQpe2E9MDthOmZvcig7Oyl7YSsrO2UoZCxyLmNvbXBfZm9yKTtpZig1PT09YyhkKSlkPWIoZCw0KTtlbHNlIHJldHVybiBhO2I6Zm9yKDs7KXtlKGQsci5jb21wX2l0ZXIpO2Q9YihkLDApO2lmKGQudHlwZT09PXIuY29tcF9mb3IpY29udGludWUgYTtlbHNlIGlmKGQudHlwZT09PXIuY29tcF9pZilpZigzPT09YyhkKSl7ZD1iKGQsMik7Y29udGludWUgYn1lbHNlIHJldHVybiBhO2JyZWFrfWJyZWFrfVNrLmFzc2VydHMuZmFpbChcImxvZ2ljIGVycm9yIGluIGNvdW50Q29tcEZvcnNcIil9KGEsZCk7dmFyIGs9W107Zm9yKGc9MDtnPGg7KytnKXtlKGQsci5jb21wX2Zvcik7dmFyIG49YihkLDEpO3ZhciBsPXYoYSxuLFNrLmFzdG5vZGVzLlN0b3JlKTt2YXIgcD13KGEsYihkLDMpKTt2YXIgeD0xPT09YyhuKT9uZXcgU2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbihsWzBdLHAsW10pOm5ldyBTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uKG5ldyBTay5hc3Rub2Rlcy5UdXBsZShsLFxuU2suYXN0bm9kZXMuU3RvcmUsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KSxwLFtdKTtpZig1PT09YyhkKSl7ZD1iKGQsNCk7dmFyIG09ZihhLGQpO249W107Zm9yKGw9MDtsPG07KytsKWUoZCxyLmNvbXBfaXRlciksZD1iKGQsMCksZShkLHIuY29tcF9pZikscD13KGEsYihkLDEpKSxuW2xdPXAsMz09PWMoZCkmJihkPWIoZCwyKSk7ZC50eXBlPT09ci5jb21wX2l0ZXImJihkPWIoZCwwKSk7eC5pZnM9bn1rW2ddPXh9cmV0dXJuIGt9ZnVuY3Rpb24gVShhLGQpe3ZhciBmPVtdO2E6e3ZhciBnPWQ7dmFyIGg9MDtiOmZvcig7Oyl7dmFyIGs9MDtoKys7ZShnLHIuY29tcF9mb3IpO2IoZywwKS50eXBlPT16LlRfQVNZTkMmJihrPTEpO2lmKGMoZyk9PTUraylnPWIoZyw0K2spO2Vsc2UgYnJlYWsgYTtjOmZvcig7Oyl7ZShnLHIuY29tcF9pdGVyKTtnPWIoZywwKTtpZihnLnR5cGU9PT1yLmNvbXBfZm9yKWNvbnRpbnVlIGI7ZWxzZSBpZihnLnR5cGU9PT1yLmNvbXBfaWYpaWYoMz09PWMoZykpe2c9XG5iKGcsMik7Y29udGludWUgY31lbHNlIGJyZWFrIGE7YnJlYWt9YnJlYWt9aD12b2lkIDB9Zm9yKGc9MDtnPGg7ZysrKXt2YXIgbj0wO2IoZCwwKS50eXBlPT16LlRfQVNZTkMmJihuPTEpO3ZhciBsPWIoZCwxK24pO3ZhciBwPXYoYSxsLFNrLmFzdG5vZGVzLlN0b3JlKTtpZighcClyZXR1cm4gbnVsbDtrPXcoYSxiKGQsMytuKSk7aWYoIWspcmV0dXJuIG51bGw7dmFyIHg9cFswXTtwPTE9PWMobCk/bmV3IFNrLmFzdG5vZGVzLmNvbXByZWhlbnNpb24oeCxrLG51bGwsbik6bmV3IFNrLmFzdG5vZGVzLmNvbXByZWhlbnNpb24obmV3IFNrLmFzdG5vZGVzLlR1cGxlKHAsU2suYXN0bm9kZXMuU3RvcmUseC5saW5lbm8seC5jb2xfb2Zmc2V0LGwuZW5kX2xpbmVubyxsLmVuZF9jb2xfb2Zmc2V0KSxrLG51bGwsbik7aWYoYyhkKT09NStuKXt4PVtdO2Q9YihkLDQrbik7YTpmb3Ioaz1kLG49MDs7KXtlKGssci5jb21wX2l0ZXIpO2lmKGIoaywwKS50eXBlPT1yLmNvbXBfZm9yKXtsPW47YnJlYWsgYX1rPVxuYihrLDApO2UoayxyLmNvbXBfaWYpO24rKztpZigyPT1jKGspKXtsPW47YnJlYWsgYX1rPWIoaywyKX1pZigtMT09bClyZXR1cm4gbnVsbDtmb3Iobj0wO248bDtuKyspe2UoZCxyLmNvbXBfaXRlcik7ZD1iKGQsMCk7ZShkLHIuY29tcF9pZik7az13KGEsYihkLDEpKTtpZighaylyZXR1cm4gbnVsbDt4W25dPWs7Mz09YyhkKSYmKGQ9YihkLDIpKX1kLnR5cGU9PXIuY29tcF9pdGVyJiYoZD1iKGQsMCkpO3AuaWZzPXh9ZltnXT1wfXJldHVybiBmfWZ1bmN0aW9uIGFhKGEsZCxlKXtTay5hc3NlcnRzLmFzc2VydCgxPGMoZCkpO3ZhciBnPWIoZCwwKTt2YXIgaD13KGEsZyk7aWYoaC5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0YXJyZWQpcmV0dXJuIGYoYSxnLFwiaXRlcmFibGUgdW5wYWNraW5nIGNhbm5vdCBiZSB1c2VkIGluIGNvbXByZWhlbnNpb25cIiksbnVsbDthPVUoYSxiKGQsMSkpO3JldHVybiAwPT1lP25ldyBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHAoaCxhLGQubGluZW5vLFxuZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KToxPT1lP25ldyBTay5hc3Rub2Rlcy5MaXN0Q29tcChoLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KToyPT1lP25ldyBTay5hc3Rub2Rlcy5TZXRDb21wKGgsYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOm51bGx9ZnVuY3Rpb24gY2EoYSxjKXtlKGMsci5hdWdhc3NpZ24pO2M9YihjLDApO3N3aXRjaChjLnZhbHVlLmNoYXJBdCgwKSl7Y2FzZSBcIitcIjpyZXR1cm4gU2suYXN0bm9kZXMuQWRkO2Nhc2UgXCItXCI6cmV0dXJuIFNrLmFzdG5vZGVzLlN1YjtjYXNlIFwiL1wiOnJldHVyblwiL1wiPT09Yy52YWx1ZS5jaGFyQXQoMSk/U2suYXN0bm9kZXMuRmxvb3JEaXY6U2suYXN0bm9kZXMuRGl2O2Nhc2UgXCIlXCI6cmV0dXJuIFNrLmFzdG5vZGVzLk1vZDtjYXNlIFwiPFwiOnJldHVybiBTay5hc3Rub2Rlcy5MU2hpZnQ7Y2FzZSBcIj5cIjpyZXR1cm4gU2suYXN0bm9kZXMuUlNoaWZ0O1xuY2FzZSBcIiZcIjpyZXR1cm4gU2suYXN0bm9kZXMuQml0QW5kO2Nhc2UgXCJeXCI6cmV0dXJuIFNrLmFzdG5vZGVzLkJpdFhvcjtjYXNlIFwifFwiOnJldHVybiBTay5hc3Rub2Rlcy5CaXRPcjtjYXNlIFwiKlwiOnJldHVyblwiKlwiPT09Yy52YWx1ZS5jaGFyQXQoMSk/U2suYXN0bm9kZXMuUG93OlNrLmFzdG5vZGVzLk11bHQ7Y2FzZSBcIkBcIjppZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpcmV0dXJuIFNrLmFzdG5vZGVzLk1hdE11bHQ7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIGF1Z2Fzc2lnblwiKX19ZnVuY3Rpb24gVyhhLGQpe1NrLmFzc2VydHMuYXNzZXJ0KDA8YyhkKSk7ZC50eXBlPT09ci50ZXN0bGlzdF9jb21wPzE8YyhkKSYmU2suYXNzZXJ0cy5hc3NlcnQoYihkLDEpLnR5cGUhPT1yLmNvbXBfZm9yKTpTay5hc3NlcnRzLmFzc2VydChkLnR5cGU9PT1yLnRlc3RsaXN0fHxkLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcik7cmV0dXJuIDE9PT1jKGQpP3coYSxiKGQsMCkpOm5ldyBTay5hc3Rub2Rlcy5UdXBsZShBKGEsXG5kKSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCl9ZnVuY3Rpb24gZGEoYSxmKXtlKGYsci5leHByX3N0bXQpO2lmKDE9PT1jKGYpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuRXhwcihXKGEsYihmLDApKSxmLmxpbmVubyxmLmNvbF9vZmZzZXQpO2lmKGIoZiwxKS50eXBlPT09ci5hdWdhc3NpZ24pe3ZhciBoPWIoZiwwKTt2YXIgaz1XKGEsaCk7ZyhhLGssU2suYXN0bm9kZXMuU3RvcmUsaCk7c3dpdGNoKGsuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuTmFtZTp2YXIgbj1rLmlkO2QoYSxoLG4sZi5saW5lbm8pO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOmNhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwOnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXVnbWVudGVkIGFzc2lnbm1lbnQgdG8gZ2VuZXJhdG9yIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlXCIsYS5jX2ZpbGVuYW1lLFxuZi5saW5lbm8pO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhdWdtZW50ZWQgYXNzaWdubWVudCB0byB5aWVsZCBleHByZXNzaW9uIG5vdCBwb3NzaWJsZVwiLGEuY19maWxlbmFtZSxmLmxpbmVubyk7ZGVmYXVsdDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImlsbGVnYWwgZXhwcmVzc2lvbiBmb3IgYXVnbWVudGVkIGFzc2lnbm1lbnRcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO31oPWIoZiwyKTtuPWgudHlwZT09PXIudGVzdGxpc3Q/VyhhLGgpOncoYSxoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkF1Z0Fzc2lnbihrLGNhKGEsYihmLDEpKSxuLGYubGluZW5vLGYuY29sX29mZnNldCl9aWYoYihmLDEpLnR5cGU9PT1yLmFubmFzc2lnbil7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIkFubm90YXRlZCBhc3NpZ25tZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDJcIixcbmEuY19maWxlbmFtZSxmLmxpbmVubyk7aD1iKGYsMCk7dmFyIGw9YihmLDEpO3ZhciBwPTE7Zm9yKGs9aDsxPT1jKGspOylrPWIoaywwKTswPGMoaykmJmIoaywwKS50eXBlPT16LlRfTFBBUiYmKHA9MCk7az1XKGEsaCk7c3dpdGNoKGsuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuTmFtZTpuPWsuaWQ7ZChhLGgsbixmLmxpbmVubyk7ZyhhLGssU2suYXN0bm9kZXMuU3RvcmUsaCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5BdHRyaWJ1dGU6bj1rLmF0dHI7ZChhLGgsbixmLmxpbmVubyk7ZyhhLGssU2suYXN0bm9kZXMuU3RvcmUsaCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6ZyhhLGssU2suYXN0bm9kZXMuU3RvcmUsaCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwib25seSBzaW5nbGUgdGFyZ2V0IChub3QgbGlzdCkgY2FuIGJlIGFubm90YXRlZFwiLGEuY19maWxlbmFtZSxmLmxpbmVubyk7XG5jYXNlIFNrLmFzdG5vZGVzLlR1cGxlOnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwib25seSBzaW5nbGUgdGFyZ2V0IChub3QgdHVwbGUpIGNhbiBiZSBhbm5vdGF0ZWRcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbGxlZ2FsIHRhcmdldCBmb3IgYW5ub3RhdGlvblwiLGEuY19maWxlbmFtZSxmLmxpbmVubyk7fWsuY29uc3RydWN0b3IhPVNrLmFzdG5vZGVzLk5hbWUmJihwPTApO2g9YihsLDEpO249dyhhLGgpO2lmKDI9PWMobCkpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Bbm5Bc3NpZ24oayxuLG51bGwscCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpO2g9YihsLDMpO2E9dyhhLGgpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQW5uQXNzaWduKGssbixhLHAsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KX1lKGIoZiwxKSx6LlRfRVFVQUwpO3A9W107Zm9yKGs9MDtrPGMoZiktMjtrKz0yKXtoPWIoZixrKTtpZihoLnR5cGU9PT1cbnIueWllbGRfZXhwcil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFzc2lnbm1lbnQgdG8geWllbGQgZXhwcmVzc2lvbiBub3QgcG9zc2libGVcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO2g9VyhhLGgpO2coYSxoLFNrLmFzdG5vZGVzLlN0b3JlLGIoZixrKSk7cFtrLzJdPWh9aD1iKGYsYyhmKS0xKTthPWgudHlwZT09PXIudGVzdGxpc3Rfc3Rhcl9leHByP1coYSxoKTp3KGEsaCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Bc3NpZ24ocCxhLGYubGluZW5vLGYuY29sX29mZnNldCl9ZnVuY3Rpb24gZWEoYSxiLGMsZCxlKXtTay5hc3NlcnRzLmFzc2VydChjPj1iKTtTay5hc3NlcnRzLmFzc2VydChcIntcIj09YS5jaGFyQXQoYi0xKSk7U2suYXNzZXJ0cy5hc3NlcnQoXCJ9XCI9PWEuY2hhckF0KGMpfHxcIiFcIj09YS5jaGFyQXQoYyl8fFwiOlwiPT1hLmNoYXJBdChjKSk7YT1hLnN1YnN0cmluZyhiLGMpOy9eXFxzKiQvLnRlc3QoYSkmJmYoZCxlLFwiZi1zdHJpbmc6IGVtcHR5IGV4cHJlc3Npb24gbm90IGFsbG93ZWRcIik7XG50cnl7bGV0IGI9U2sucGFyc2UoXCI8ZnN0cmluZz5cIixcIihcIithK1wiKVwiKTt2YXIgZz1Tay5hc3RGcm9tUGFyc2UoYi5jc3QsXCI8ZnN0cmluZz5cIixiLmZsYWdzKX1jYXRjaChZKXt0aHJvdyBZLnRyYWNlYmFjayYmWS50cmFjZWJhY2tbMF0mJihnPVkudHJhY2ViYWNrWzBdLGcubGluZW5vPShnLmxpbmVub3x8MSktMStlLmxpbmVubyxnLmZpbGVuYW1lPWQuY19maWxlbmFtZSksWTt9U2suYXNzZXJ0cy5hc3NlcnQoMT09Zy5ib2R5Lmxlbmd0aCYmZy5ib2R5WzBdLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuRXhwcik7cmV0dXJuIGcuYm9keVswXS52YWx1ZX1mdW5jdGlvbiBIKGEsYixjLGQsZSxnLGgpe1NrLmFzc2VydHMuYXNzZXJ0KFwie1wiPT1hLmNoYXJBdChiKSk7YisrO3ZhciBrPWI7bGV0IG49bnVsbCxsPTAscD0wLG0seCxTPSgpPT5mKGcsaCxcImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nXCIpO2ZvcihTay5hc3NlcnRzLmFzc2VydChiPD1jKTtiPGM7YisrKXtsZXQgZD1hLmNoYXJBdChiKTtcblwiXFxcXFwiPT1kJiZmKGcsaCxcImYtc3RyaW5nIGV4cHJlc3Npb24gcGFydCBjYW5ub3QgaW5jbHVkZSBhIGJhY2tzbGFzaFwiKTtpZihuKWQ9PW4mJigzPT1sP2IrMjxjJiZhLmNoYXJBdChiKzEpPT1kJiZhLmNoYXJBdChiKzIpPT1kJiYoYis9MixuPWw9MCk6bD1uPTApO2Vsc2UgaWYoXCInXCI9PWR8fCdcIic9PWQpYisyPGMmJmEuY2hhckF0KGIrMSk9PWQmJmEuY2hhckF0KGIrMik9PWQ/KGw9MyxiKz0yKTpsPTEsbj1kO2Vsc2UgaWYoXCJbXCI9PWR8fFwie1wiPT1kfHxcIihcIj09ZClwKys7ZWxzZSBpZigwIT1wJiYoXCJdXCI9PWR8fFwifVwiPT1kfHxcIilcIj09ZCkpcC0tO2Vsc2UgaWYoXCIjXCI9PWQpZihnLGgsXCJmLXN0cmluZyBleHByZXNzaW9uIHBhcnQgY2Fubm90IGluY2x1ZGUgJyMnXCIpO2Vsc2UgaWYoISgwIT1wfHxcIiFcIiE9ZCYmXCI6XCIhPWQmJlwifVwiIT1kfHxcIiFcIj09ZCYmYisxPGMmJlwiPVwiPT1hLmNoYXJBdChiKzEpKSlicmVha31uJiZmKGcsaCxcImYtc3RyaW5nOiB1bnRlcm1pbmF0ZWQgc3RyaW5nXCIpO1xucCYmZihnLGgsXCJmLXN0cmluZzogbWlzbWF0Y2hlZCAnKCcsICd7Jywgb3IgJ1snXCIpO2s9ZWEoYSxrLGIsZyxoKTtcIiFcIj09YS5jaGFyQXQoYikmJihiKyssYj49YyYmUygpLHg9YS5jaGFyQXQoYiksYisrLFwic1wiIT14JiZcInJcIiE9eCYmXCJhXCIhPXgmJmYoZyxoLFwiZi1zdHJpbmc6IGludmFsaWQgY29udmVyc2lvbiBjaGFyYWN0ZXI6IGV4cGVjdGVkICdzJywgJ3InLCBvciAnYSdcIikpO2I+PWMmJlMoKTtcIjpcIj09YS5jaGFyQXQoYikmJihiKyssYj49YyYmUygpLFttLGJdPWJhKGEsYixjLGQsZSsxLGcsaCkpOyhiPj1jfHxcIn1cIiE9YS5jaGFyQXQoYikpJiZTKCk7YisrO3JldHVybltuZXcgU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWUoayx4LG0saC5saW5lbm8saC5jb2xfb2Zmc2V0KSxiXX1mdW5jdGlvbiBiYShhLGIsYyxkLGUsZixnKXtsZXQgaD1bXSxrPWE9PntpZigtMSE9PWEuaW5kZXhPZihcIn1cIikpe2lmKC8oXnxbXn1dKX0ofX0pKigkfFtefV0pLy50ZXN0KGEpKXRocm93IG5ldyBTeW50YXhFcnJvcihcImYtc3RyaW5nOiBzaW5nbGUgJ30nIGlzIG5vdCBhbGxvd2VkXCIsXG5nLmxpbmVubyxnLmNvbF9vZmZzZXQpO2E9YS5yZXBsYWNlKC99fS9nLFwifVwiKX1oLnB1c2gobmV3IFNrLmFzdG5vZGVzLlN0cihuZXcgU2suYnVpbHRpbi5zdHIoYSksZy5saW5lbm8sZy5jb2xfb2Zmc2V0LGYuZW5kX2xpbmVubyxnLmVuZF9jb2xfb2Zmc2V0KSl9O2Zvcig7YjxjOyl7bGV0IG49YS5pbmRleE9mKFwie1wiLGIpO2lmKDAhPT1lKXtsZXQgZD1hLmluZGV4T2YoXCJ9XCIsYik7LTEhPT1kJiYoLTE9PT1uP2M9ZDpuPmQmJihuPS0xLGM9ZCkpfWlmKC0xPT09bil7ayhhLnN1YnN0cmluZyhiLGMpKTtiPWM7YnJlYWt9ZWxzZSBpZihuKzE8YyYmXCJ7XCI9PT1hLmNoYXJBdChuKzEpKWsoYS5zdWJzdHJpbmcoYixuKzEpKSxiPW4rMjtlbHNle2soYS5zdWJzdHJpbmcoYixuKSk7Yj1uO2xldCBbbCxwXT1IKGEsbixjLGQsZSxmLGcpO2gucHVzaChsKTtiPXB9fXJldHVybltuZXcgU2suYXN0bm9kZXMuSm9pbmVkU3RyKGgsZy5saW5lbm8sZy5jb2xfb2Zmc2V0KSxiXX1mdW5jdGlvbiBYKGEsXG5iLGMpe3ZhciBkPWIuY2hhckF0KGIubGVuZ3RoLTEpO2lmKC0xIT09Yi5pbmRleE9mKFwiX1wiKSl7aWYoZmEudGVzdChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImludmFsaWQgc3ludGF4XCIsYS5jX2ZpbGVuYW1lLGMpO2lmKGhhLnRlc3QoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIGRlY2ltYWwgbGl0ZXJhbFwiLGEuY19maWxlbmFtZSxjKTtiPWIucmVwbGFjZShpYSxcIlwiKX1pZihcImpcIj09PWR8fFwiSlwiPT09ZClyZXR1cm4gU2suYnVpbHRpbi5jb21wbGV4LmNvbXBsZXhfc3VidHlwZV9mcm9tX3N0cmluZyhiKTtpZihcImxcIj09PWR8fFwiTFwiPT09ZClyZXR1cm4gU2subG9uZ0Zyb21TdHIoYi5zdWJzdHIoMCxiLmxlbmd0aC0xKSwwKTtpZigtMSE9PWIuaW5kZXhPZihcIi5cIikpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhwYXJzZUZsb2F0KGIpKTtjPWI7YT0hMTtcIi1cIj09PWIuY2hhckF0KDApJiYoYz1iLnN1YnN0cigxKSxhPVxuITApO2lmKFwiMFwiIT09Yy5jaGFyQXQoMCl8fFwieFwiIT09Yy5jaGFyQXQoMSkmJlwiWFwiIT09Yy5jaGFyQXQoMSkpe2lmKC0xIT09Yi5pbmRleE9mKFwiZVwiKXx8LTEhPT1iLmluZGV4T2YoXCJFXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8ocGFyc2VGbG9hdChiKSk7aWYoXCIwXCIhPT1jLmNoYXJBdCgwKXx8XCJiXCIhPT1jLmNoYXJBdCgxKSYmXCJCXCIhPT1jLmNoYXJBdCgxKSlpZihcIjBcIj09PWMuY2hhckF0KDApKWlmKFwiMFwiPT09YyljPTA7ZWxzZXtjPWMuc3Vic3RyaW5nKDEpO2lmKFwib1wiPT09Yy5jaGFyQXQoMCl8fFwiT1wiPT09Yy5jaGFyQXQoMCkpYz1jLnN1YnN0cmluZygxKTtjPXBhcnNlSW50KGMsOCl9ZWxzZSBjPXBhcnNlSW50KGMsMTApO2Vsc2UgYz1jLnN1YnN0cmluZygyKSxjPXBhcnNlSW50KGMsMil9ZWxzZSBjPWMuc3Vic3RyaW5nKDIpLGM9cGFyc2VJbnQoYywxNik7cmV0dXJuIGM+TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVImJk1hdGguZmxvb3IoYyk9PT1jJiYtMT09PWIuaW5kZXhPZihcImVcIikmJlxuLTE9PT1iLmluZGV4T2YoXCJFXCIpP1NrLmxvbmdGcm9tU3RyKGIsMCk6YT9uZXcgU2suYnVpbHRpbi5pbnRfKC1jKTpuZXcgU2suYnVpbHRpbi5pbnRfKGMpfWZ1bmN0aW9uIEkoYSxkKXt2YXIgZixnO2UoZCxyLnN1YnNjcmlwdCk7dmFyIGg9YihkLDApO3ZhciBrPWY9Zz1udWxsO2lmKGgudHlwZT09PXouVF9ET1QpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5FbGxpcHNpcztpZigxPT09YyhkKSYmaC50eXBlPT09ci50ZXN0KXJldHVybiBuZXcgU2suYXN0bm9kZXMuSW5kZXgodyhhLGgpKTtoLnR5cGU9PT1yLnRlc3QmJihnPXcoYSxoKSk7aC50eXBlPT09ei5UX0NPTE9OPzE8YyhkKSYmKGg9YihkLDEpLGgudHlwZT09PXIudGVzdCYmKGY9dyhhLGgpKSk6MjxjKGQpJiYoaD1iKGQsMiksaC50eXBlPT09ci50ZXN0JiYoZj13KGEsaCkpKTtoPWIoZCxjKGQpLTEpO2gudHlwZT09PXIuc2xpY2VvcCYmKDE9PT1jKGgpPyhoPWIoaCwwKSxrPW5ldyBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQoU2suYnVpbHRpbi5ub25lLm5vbmUkLFxuU2suYXN0bm9kZXMuTG9hZCxoLmxpbmVubyxoLmNvbF9vZmZzZXQpKTooaD1iKGgsMSksaC50eXBlPT09ci50ZXN0JiYoaz13KGEsaCkpKSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5TbGljZShnLGYsayl9ZnVuY3Rpb24gUihhLGQpe3ZhciBnPWIoZCwwKTtzd2l0Y2goZy50eXBlKXtjYXNlIHouVF9OQU1FOnZhciBoPWcudmFsdWU7aWYoNDw9aC5sZW5ndGgmJjU+PWgubGVuZ3RoKXtpZihcIk5vbmVcIj09PWgpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQoU2suYnVpbHRpbi5ub25lLm5vbmUkLGQubGluZW5vLGQuY29sX29mZnNldCk7aWYoXCJUcnVlXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4uYm9vbC50cnVlJCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2lmKFwiRmFsc2VcIj09PWgpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQoU2suYnVpbHRpbi5ib29sLmZhbHNlJCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpfWE9XG5rKGgsYSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5OYW1lKGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO2Nhc2Ugei5UX1NUUklORzpnPVtdO2Zvcih2YXIgbj0wO248YyhkKTsrK24pe3ZhciBwPWIoZCxuKS52YWx1ZTt2YXIgbT1hO3ZhciB4PWIoZCxuKTt2YXIgdD1wO3ZhciBxPXQuY2hhckF0KDApO2Zvcih2YXIgSj0hMSx2PXA9ITE7Oyl7aWYoXCJ1XCIhPT1xJiZcIlVcIiE9PXEpaWYoXCJyXCI9PT1xfHxcIlJcIj09PXEpSj0hMDtlbHNlIGlmKFwiYlwiPT09cXx8XCJCXCI9PT1xKXY9ITA7ZWxzZSBpZihcImZcIj09PXF8fFwiRlwiPT09cSlwPSEwO2Vsc2UgYnJlYWs7dD10LnN1YnN0cigxKTtxPXQuY2hhckF0KDApfVNrLmFzc2VydHMuYXNzZXJ0KFwiJ1wiPT09cXx8J1wiJz09PXEmJnQuY2hhckF0KHQubGVuZ3RoLTEpPT09cSk7dD10LnN1YnN0cigxLHQubGVuZ3RoLTIpOzQ8PXQubGVuZ3RoJiZ0LmNoYXJBdCgwKT09PXEmJlxudC5jaGFyQXQoMSk9PT1xJiYoU2suYXNzZXJ0cy5hc3NlcnQodC5jaGFyQXQodC5sZW5ndGgtMSk9PT1xJiZ0LmNoYXJBdCh0Lmxlbmd0aC0yKT09PXEpLHQ9dC5zdWJzdHIoMix0Lmxlbmd0aC00KSk7aWYoSnx8LTE9PT10LmluZGV4T2YoXCJcXFxcXCIpKXtpZih2KWZvcihxPTA7cTx0Lmxlbmd0aDtxKyspMTI3PHQuY2hhckNvZGVBdChxKSYmZihtLHgsXCJieXRlcyBjYW4gb25seSBjb250YWluIEFTQ0lJIGxpdGVyYWwgY2hhcmFjdGVyc1wiKTttPVtsKHQpLHAsdl19ZWxzZXtKPXQ7dmFyIEI9Si5sZW5ndGgseT1cIlwiO2Zvcih0PTA7dDxCOysrdClxPUouY2hhckF0KHQpLFwiXFxcXFwiPT09cT8oKyt0LHE9Si5jaGFyQXQodCksXCJuXCI9PT1xP3krPVwiXFxuXCI6XCJcXFxcXCI9PT1xP3krPVwiXFxcXFwiOlwidFwiPT09cT95Kz1cIlxcdFwiOlwiclwiPT09cT95Kz1cIlxcclwiOlwiYlwiPT09cT95Kz1cIlxcYlwiOlwiZlwiPT09cT95Kz1cIlxcZlwiOlwidlwiPT09cT95Kz1cIlxcdlwiOlwiMFwiPT09cT95Kz1cIlxceDAwXCI6J1wiJz09PXE/eSs9J1wiJzpcIidcIj09PXE/XG55Kz1cIidcIjpcIlxcblwiIT09cSYmKFwieFwiPT09cT8odCsyPj1CJiZmKG0seCxcIlRydW5jYXRlZCBcXFxceE5OIGVzY2FwZVwiKSx5Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KEouc3Vic3RyKHQrMSwyKSwxNikpLHQrPTIpOnZ8fFwidVwiIT09cT92fHxcIlVcIiE9PXE/eSs9XCJcXFxcXCIrcToodCs4Pj1CJiZmKG0seCxcIlRydW5jYXRlZCBcXFxcVVhYWFhYWFhYIGVzY2FwZVwiKSx5Kz1TdHJpbmcuZnJvbUNvZGVQb2ludChwYXJzZUludChKLnN1YnN0cih0KzEsOCksMTYpKSx0Kz04KToodCs0Pj1CJiZmKG0seCxcIlRydW5jYXRlZCBcXFxcdVhYWFggZXNjYXBlXCIpLHkrPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoSi5zdWJzdHIodCsxLDQpLDE2KSksdCs9NCkpKTp2JiYxMjc8cS5jaGFyQ29kZUF0KDApP2YobSx4LFwiYnl0ZXMgY2FuIG9ubHkgY29udGFpbiBBU0NJSSBsaXRlcmFsIGNoYXJhY3RlcnNcIik6eSs9cTttPXk7bT1bbChtKSxwLHZdfXA9bTttPXBbMF07eD1wWzFdO3A9cFsyXTswIT1uJiZcbmghPT1wJiZmKGEsZCxcImNhbm5vdCBtaXggYnl0ZXMgYW5kIG5vbmJ5dGVzIGxpdGVyYWxzXCIpO2g9cDtpZih4KXtpZighU2suX19mdXR1cmVfXy5weXRob24zKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBzdHJpbmcgKGYtc3RyaW5ncyBhcmUgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMilcIixhLmNfZmlsZW5hbWUsYihkLG4pLmxpbmVubyk7dmFyIEY9bS4kanNzdHIoKTtbRl09YmEoRiwwLEYubGVuZ3RoLCExLDAsYSxiKGQsbikpO2cucHVzaC5hcHBseShnLEYudmFsdWVzKTtGPW51bGx9ZWxzZSBGP0Yucz1GLnMuc3EkY29uY2F0KG0pOihGPW5ldyAoaD9Tay5hc3Rub2Rlcy5CeXRlczpTay5hc3Rub2Rlcy5TdHIpKG0sZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGEuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KSxnLnB1c2goRikpfWQ9MT09PWcubGVuZ3RoJiZnWzBdLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RyP2dbMF06bmV3IFNrLmFzdG5vZGVzLkpvaW5lZFN0cihnLFxuZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGEuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtyZXR1cm4gZDtjYXNlIHouVF9OVU1CRVI6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5OdW0oWChhLGcudmFsdWUsZC5saW5lbm8pLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSB6LlRfRUxMSVBTSVM6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5FbGxpcHNpcyhkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO2Nhc2Ugei5UX0xQQVI6cmV0dXJuIGc9YihkLDEpLGcudHlwZT09ei5UX1JQQVI/bmV3IFNrLmFzdG5vZGVzLlR1cGxlKFtdLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpnLnR5cGU9PXIueWllbGRfZXhwcj93KGEsZyk6MT09YyhnKT9XKGEsZyk6YihnLDEpLnR5cGU9PXIuY29tcF9mb3I/dShEKGEsZyksZCk6dShXKGEsZyksZCk7Y2FzZSB6LlRfTFNRQjpnPVxuYihkLDEpO2lmKGcudHlwZT09ei5UX1JTUUIpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5MaXN0KFtdLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtlKGcsci50ZXN0bGlzdF9jb21wKTtpZigxPT1jKGcpfHxiKGcsMSkudHlwZT09ei5UX0NPTU1BKXJldHVybihhPUEoYSxnKSk/bmV3IFNrLmFzdG5vZGVzLkxpc3QoYSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6bnVsbDtoPWc7U2suYXNzZXJ0cy5hc3NlcnQoaC50eXBlPT1yLnRlc3RsaXN0X2NvbXApO2E9YWEoYSxoLDEpO3JldHVybiB1KGEsZCk7Y2FzZSB6LlRfTEJSQUNFOmc9YihkLDEpO2lmKGcudHlwZT09ei5UX1JCUkFDRSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkRpY3QobnVsbCxudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7XG5oPWIoZywwKS50eXBlPT16LlRfRE9VQkxFU1RBUjtpZigxPT1jKGcpfHwxPGMoZykmJmIoZywxKS50eXBlPT16LlRfQ09NTUEpe2g9ZztuPVtdO1NrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09PXIuZGljdG9yc2V0bWFrZXIpO2ZvcihnPTA7ZzxjKGgpO2crPTIpRj13KGEsYihoLGcpKSxuW2cvMl09RjthPW5ldyBTay5hc3Rub2Rlcy5TZXQobixoLmxpbmVubyxoLmNvbF9vZmZzZXQpfWVsc2UgaWYoMTxjKGcpJiZiKGcsMSkudHlwZT09ci5jb21wX2ZvciloPWcsU2suYXNzZXJ0cy5hc3NlcnQoaC50eXBlPT09ci5kaWN0b3JzZXRtYWtlciksU2suYXNzZXJ0cy5hc3NlcnQoMTxjKGgpKSxnPXcoYSxiKGgsMCkpLGE9UShhLGIoaCwxKSksYT1uZXcgU2suYXN0bm9kZXMuU2V0Q29tcChnLGEsaC5saW5lbm8saC5jb2xfb2Zmc2V0KTtlbHNlIGlmKGMoZyk+My1oJiZiKGcsMy1oKS50eXBlPT1yLmNvbXBfZm9yKXtpZihoKXJldHVybiBmKGEsZCxcImRpY3QgdW5wYWNraW5nIGNhbm5vdCBiZSB1c2VkIGluIGRpY3QgY29tcHJlaGVuc2lvblwiKSxcbm51bGw7aD1nO1NrLmFzc2VydHMuYXNzZXJ0KDM8YyhoKSk7ZShiKGgsMSksei5UX0NPTE9OKTtnPXcoYSxiKGgsMCkpO249dyhhLGIoaCwyKSk7YT1RKGEsYihoLDMpKTthPW5ldyBTay5hc3Rub2Rlcy5EaWN0Q29tcChnLG4sYSxoLmxpbmVubyxoLmNvbF9vZmZzZXQpfWVsc2V7aD1nO249W107Rj1bXTtmb3IocD1nPTA7cDxjKGgpO3ArKyltPWEseD1oLHY9cCxiKHgsdikudHlwZT09ei5UX0RPVUJMRVNUQVI/KFNrLmFzc2VydHMuYXNzZXJ0KDI8PWMoeCktdikscD13KG0sYih4LHYrMSkpLG09e2tleTpudWxsLHZhbHVlOnAsaTp2KzJ9KTooU2suYXNzZXJ0cy5hc3NlcnQoMzw9Yyh4KS12KSwocD13KG0sYih4LHYpKSk/KHQ9cCxlKGIoeCx2KzEpLHouVF9DT0xPTiksbT0ocD13KG0sYih4LHYrMikpKT97a2V5OnQsdmFsdWU6cCxpOnYrM306ITEpOm09MCkscD1tLmksbltnXT1tLmtleSxGW2ddPW0udmFsdWUsZysrO2E9bmV3IFNrLmFzdG5vZGVzLkRpY3QobixGLGgubGluZW5vLFxuaC5jb2xfb2Zmc2V0LGguZW5kX2xpbmVubyxoLmVuZF9jb2xfb2Zmc2V0KX1yZXR1cm4gdShhLGQpO2RlZmF1bHQ6cmV0dXJuIFNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBhdG9tIFwiK2cudHlwZSksbnVsbH19ZnVuY3Rpb24gQyhhLGQpe3ZhciBnLGY9MDtlKGQsci5hdG9tX2V4cHIpO3ZhciBoPWMoZCk7YihkLDApLnR5cGU9PT16LlRfQVdBSVQmJihmPTEsU2suYXNzZXJ0cy5hc3NlcnQoMTxoKSk7dmFyIGs9UihhLGIoZCxmKSk7aWYoIWspcmV0dXJuIG51bGw7aWYoMT09PWgpcmV0dXJuIGs7aWYoZiYmMj09PWgpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Bd2FpdChrLGQubGluZW5vLGQuY29sX29mZnNldCk7Zm9yKGc9ZisxO2c8aDtnKyspe3ZhciBuPWIoZCxnKTtpZihuLnR5cGUhPT1yLnRyYWlsZXIpYnJlYWs7bj1NKGEsbixrKTtpZighbilyZXR1cm4gbnVsbDtuLmxpbmVubz1rLmxpbmVubztuLmNvbF9vZmZzZXQ9ay5jb2xfb2Zmc2V0O2s9bn1yZXR1cm4gZj9uZXcgU2suYXN0bm9kZXMuQXdhaXQoayxcbmQubGluZSxkLmNvbF9vZmZzZXQpOmt9ZnVuY3Rpb24gdyhhLGQpe2E6Zm9yKDs7KXtzd2l0Y2goZC50eXBlKXtjYXNlIHIudGVzdDpjYXNlIHIudGVzdF9ub2NvbmQ6aWYoYihkLDApLnR5cGU9PT1yLmxhbWJkZWZ8fGIoZCwwKS50eXBlPT09ci5sYW1iZGVmX25vY29uZCl7dmFyIGc9YihkLDApOzM9PT1jKGcpPyhkPW5ldyBTay5hc3Rub2Rlcy5hcmd1bWVudHNfKFtdLG51bGwsbnVsbCxbXSksYT13KGEsYihnLDIpKSk6KGQ9TChhLGIoZywxKSksYT13KGEsYihnLDMpKSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5MYW1iZGEoZCxhLGcubGluZW5vLGcuY29sX29mZnNldCl9aWYoMTxjKGQpKXJldHVybiBTay5hc3NlcnRzLmFzc2VydCg1PT09YyhkKSksbmV3IFNrLmFzdG5vZGVzLklmRXhwKHcoYSxiKGQsMikpLHcoYSxiKGQsMCkpLHcoYSxiKGQsNCkpLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLm9yX3Rlc3Q6Y2FzZSByLmFuZF90ZXN0OmlmKDE9PT1jKGQpKXtkPWIoZCxcbjApO2NvbnRpbnVlIGF9dmFyIGY9W107Zm9yKGc9MDtnPGMoZCk7Zys9MilmW2cvMl09dyhhLGIoZCxnKSk7aWYoXCJhbmRcIj09PWIoZCwxKS52YWx1ZSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkJvb2xPcChTay5hc3Rub2Rlcy5BbmQsZixkLmxpbmVubyxkLmNvbF9vZmZzZXQpO1NrLmFzc2VydHMuYXNzZXJ0KFwib3JcIj09PWIoZCwxKS52YWx1ZSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Cb29sT3AoU2suYXN0bm9kZXMuT3IsZixkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5ub3RfdGVzdDppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX1lbHNlIHJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5Ob3QsdyhhLGIoZCwxKSksZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIuY29tcGFyaXNvbjppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX1lbHNle3ZhciBoPVtdO2Y9W107Zm9yKGc9MTtnPGMoZCk7Zys9MiloWyhnLTEpLzJdPVxucChhLGIoZCxnKSksZlsoZy0xKS8yXT13KGEsYihkLGcrMSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQ29tcGFyZSh3KGEsYihkLDApKSxoLGYsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1jYXNlIHIuc3Rhcl9leHByOnJldHVybiBlKGQsci5zdGFyX2V4cHIpLG5ldyBTay5hc3Rub2Rlcy5TdGFycmVkKHcoYSxiKGQsMSkpLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIuZXhwcjpjYXNlIHIueG9yX2V4cHI6Y2FzZSByLmFuZF9leHByOmNhc2Ugci5zaGlmdF9leHByOmNhc2Ugci5hcml0aF9leHByOmNhc2Ugci50ZXJtOmlmKDE9PT1jKGQpKXtkPWIoZCwwKTtjb250aW51ZSBhfXZhciBrPWQsbD1uZXcgU2suYXN0bm9kZXMuQmluT3AodyhhLGIoaywwKSksbihiKGssMSkpLHcoYSxiKGssMikpLGsubGluZW5vLGsuY29sX29mZnNldCksbT0oYyhrKS0xKS8yO2ZvcihkPTE7ZDxtOysrZClnPWIoaywyKmQrMSksZj1uKGcpLGg9dyhhLGIoaywyKmQrXG4yKSksbD1uZXcgU2suYXN0bm9kZXMuQmluT3AobCxmLGgsZy5saW5lbm8sZy5jb2xfb2Zmc2V0KTtyZXR1cm4gbDtjYXNlIHIueWllbGRfZXhwcjpyZXR1cm4gZj0hMSxoPW51bGwsMTxjKGQpJiYoZz1iKGQsMSkpLGcmJihoPWIoZyxjKGcpLTEpLDI9PWMoZyk/KGY9ITAsaD13KGEsaCkpOmg9VyhhLGgpKSxmP25ldyBTay5hc3Rub2Rlcy5ZaWVsZEZyb20oaCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOm5ldyBTay5hc3Rub2Rlcy5ZaWVsZChoLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmZhY3RvcjppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX1yZXR1cm4gRShhLGQpO2Nhc2Ugci5wb3dlcjpyZXR1cm4gZz1kLGUoZyxyLnBvd2VyKSxkPUMoYSxiKGcsMCkpLDEhPT1jKGcpJiZiKGcsYyhnKS0xKS50eXBlPT09ci5mYWN0b3ImJihhPXcoYSxiKGcsYyhnKS0xKSksZD1uZXcgU2suYXN0bm9kZXMuQmluT3AoZCxTay5hc3Rub2Rlcy5Qb3csYSxnLmxpbmVubyxnLmNvbF9vZmZzZXQpKSxcbmQ7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgZXhwclwiLFwibi50eXBlOiAlZFwiLGQudHlwZSl9YnJlYWt9fWZ1bmN0aW9uIE4oYSxkKXtkLnR5cGU9PT1yLnN0bXQmJihTay5hc3NlcnRzLmFzc2VydCgxPT09YyhkKSksZD1iKGQsMCkpO2QudHlwZT09PXIuc2ltcGxlX3N0bXQmJihTay5hc3NlcnRzLmFzc2VydCgxPT09aChkKSksZD1iKGQsMCkpO2lmKGQudHlwZT09PXIuc21hbGxfc3RtdClzd2l0Y2goZD1iKGQsMCksZC50eXBlKXtjYXNlIHIuZXhwcl9zdG10OnJldHVybiBkYShhLGQpO2Nhc2Ugci5kZWxfc3RtdDp2YXIgaz1kO2UoayxyLmRlbF9zdG10KTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkRlbGV0ZSh2KGEsYihrLDEpLFNrLmFzdG5vZGVzLkRlbCksay5saW5lbm8say5jb2xfb2Zmc2V0KTtjYXNlIHIucGFzc19zdG10OnJldHVybiBuZXcgU2suYXN0bm9kZXMuUGFzcyhkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5mbG93X3N0bXQ6cmV0dXJuIFYoYSxcbmQpO2Nhc2Ugci5pbXBvcnRfc3RtdDp2YXIgbj1kLHA7ZShuLHIuaW1wb3J0X3N0bXQpO3ZhciBtPW4ubGluZW5vO2Q9bi5jb2xfb2Zmc2V0O249YihuLDApO2lmKG4udHlwZT09PXIuaW1wb3J0X25hbWUpe249YihuLDEpO2UobixyLmRvdHRlZF9hc19uYW1lcyk7dmFyIHE9W107Zm9yKHA9MDtwPGMobik7cCs9MilxW3AvMl09QihhLGIobixwKSk7YT1uZXcgU2suYXN0bm9kZXMuSW1wb3J0KHEsbSxkKX1lbHNlIGlmKG4udHlwZT09PXIuaW1wb3J0X2Zyb20pe3ZhciB1PW51bGw7az0wO2ZvcihxPTE7cTxjKG4pOysrcSlpZihiKG4scSkudHlwZT09PXIuZG90dGVkX25hbWUpe3U9QihhLGIobixxKSk7cSsrO2JyZWFrfWVsc2UgaWYoYihuLHEpLnR5cGU9PT16LlRfRE9UKWsrKztlbHNlIGlmKGIobixxKS50eXBlPT09ei5UX0VMTElQU0lTKWsrPTM7ZWxzZSBicmVhazsrK3E7c3dpdGNoKGIobixxKS50eXBlKXtjYXNlIHouVF9TVEFSOm49YihuLHEpO2JyZWFrO2Nhc2Ugei5UX0xQQVI6bj1cbmIobixxKzEpO2Mobik7YnJlYWs7Y2FzZSByLmltcG9ydF9hc19uYW1lczpuPWIobixxKTtxPWMobik7aWYoMD09PXElMil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInRyYWlsaW5nIGNvbW1hIG5vdCBhbGxvd2VkIHdpdGhvdXQgc3Vycm91bmRpbmcgcGFyZW50aGVzZXNcIixhLmNfZmlsZW5hbWUsbi5saW5lbm8pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJVbmV4cGVjdGVkIG5vZGUtdHlwZSBpbiBmcm9tLWltcG9ydFwiLGEuY19maWxlbmFtZSxuLmxpbmVubyk7fXE9W107aWYobi50eXBlPT09ei5UX1NUQVIpcVswXT1CKGEsbik7ZWxzZSBmb3IocD0wO3A8YyhuKTtwKz0yKXFbcC8yXT1CKGEsYihuLHApKTthPXU/dS5uYW1lLnY6XCJcIjthPW5ldyBTay5hc3Rub2Rlcy5JbXBvcnRGcm9tKGwoYSkscSxrLG0sZCl9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInVua25vd24gaW1wb3J0IHN0YXRlbWVudFwiLFxuYS5jX2ZpbGVuYW1lLG4ubGluZW5vKTtyZXR1cm4gYTtjYXNlIHIuZ2xvYmFsX3N0bXQ6YT1kO2Q9W107ZShhLHIuZ2xvYmFsX3N0bXQpO2ZvcihrPTE7azxjKGEpO2srPTIpZFsoay0xKS8yXT1sKGIoYSxrKS52YWx1ZSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5HbG9iYWwoZCxhLmxpbmVubyxhLmNvbF9vZmZzZXQpO2Nhc2Ugci5ub25sb2NhbF9zdG10OmYoYSxkLFwiTm90IGltcGxlbWVudGVkOiBub25sb2NhbFwiKTticmVhaztjYXNlIHIuYXNzZXJ0X3N0bXQ6cmV0dXJuIGs9ZCxlKGssci5hc3NlcnRfc3RtdCksMj09PWMoayk/YT1uZXcgU2suYXN0bm9kZXMuQXNzZXJ0KHcoYSxiKGssMSkpLG51bGwsay5saW5lbm8say5jb2xfb2Zmc2V0KTo0PT09YyhrKT9hPW5ldyBTay5hc3Rub2Rlcy5Bc3NlcnQodyhhLGIoaywxKSksdyhhLGIoaywzKSksay5saW5lbm8say5jb2xfb2Zmc2V0KTooU2suYXNzZXJ0cy5mYWlsKFwiaW1wcm9wZXIgbnVtYmVyIG9mIHBhcnRzIHRvIGFzc2VydCBzdG10XCIpLFxuYT12b2lkIDApLGE7Y2FzZSByLnByaW50X3N0bXQ6az1kO1NrLl9fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb24mJmYoYSxrLFwiTWlzc2luZyBwYXJlbnRoZXNlcyBpbiBjYWxsIHRvICdwcmludCdcIik7bj0xO209bnVsbDtlKGssci5wcmludF9zdG10KTsyPD1jKGspJiZiKGssMSkudHlwZT09PXouVF9SSUdIVFNISUZUJiYobT13KGEsYihrLDIpKSxuPTQpO2Q9W107Zm9yKHU9MDtuPGMoayk7bis9MiwrK3UpZFt1XT13KGEsYihrLG4pKTthPWIoayxjKGspLTEpLnR5cGU9PT16LlRfQ09NTUE/ITE6ITA7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5QcmludChtLGQsYSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Nhc2Ugci5kZWJ1Z2dlcl9zdG10OnJldHVybiBuZXcgU2suYXN0bm9kZXMuRGVidWdnZXIoZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBzbWFsbF9zdG10XCIpfWVsc2Ugc3dpdGNoKGs9YihkLDApLGUoZCxyLmNvbXBvdW5kX3N0bXQpLFxuay50eXBlKXtjYXNlIHIuaWZfc3RtdDplKGssci5pZl9zdG10KTtpZig0PT09YyhrKSlhPW5ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxbXSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Vsc2UgaWYoZD1iKGssNCkudmFsdWUuY2hhckF0KDIpLFwic1wiPT09ZClhPW5ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLDEpKSx0KGEsYihrLDMpKSx0KGEsYihrLDYpKSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Vsc2UgaWYoXCJpXCI9PT1kKXttPWMoayktNDtuPSExO2Q9W107YihrLG0rMSkudHlwZT09PXouVF9OQU1FJiZcInNcIj09PWIoayxtKzEpLnZhbHVlLmNoYXJBdCgyKSYmKG49ITAsbS09Myk7bS89NDtuJiYoZD1bbmV3IFNrLmFzdG5vZGVzLklmKHcoYSxiKGssYyhrKS02KSksdChhLGIoayxjKGspLTQpKSx0KGEsYihrLGMoayktMSkpLGIoayxjKGspLTYpLmxpbmVubyxiKGssYyhrKS02KS5jb2xfb2Zmc2V0KV0sbS0tKTtmb3IodT0wO3U8bTsrK3Upbj01KzQqXG4obS11LTEpLGQ9W25ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLG4pKSx0KGEsYihrLG4rMikpLGQsYihrLG4pLmxpbmVubyxiKGssbikuY29sX29mZnNldCldO2E9bmV3IFNrLmFzdG5vZGVzLklmKHcoYSxiKGssMSkpLHQoYSxiKGssMykpLGQsay5saW5lbm8say5jb2xfb2Zmc2V0KX1lbHNlIFNrLmFzc2VydHMuZmFpbChcInVuZXhwZWN0ZWQgdG9rZW4gaW4gJ2lmJyBzdGF0ZW1lbnRcIiksYT12b2lkIDA7cmV0dXJuIGE7Y2FzZSByLndoaWxlX3N0bXQ6cmV0dXJuIGUoayxyLndoaWxlX3N0bXQpLDQ9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLldoaWxlKHcoYSxiKGssMSkpLHQoYSxiKGssMykpLFtdLGsubGluZW5vLGsuY29sX29mZnNldCk6Nz09PWMoayk/YT1uZXcgU2suYXN0bm9kZXMuV2hpbGUodyhhLGIoaywxKSksdChhLGIoaywzKSksdChhLGIoayw2KSksay5saW5lbm8say5jb2xfb2Zmc2V0KTooU2suYXNzZXJ0cy5mYWlsKFwid3JvbmcgbnVtYmVyIG9mIHRva2VucyBmb3IgJ3doaWxlJyBzdG10XCIpLFxuYT12b2lkIDApLGE7Y2FzZSByLmZvcl9zdG10OnJldHVybiBkPVtdLGUoayxyLmZvcl9zdG10KSw5PT09YyhrKSYmKGQ9dChhLGIoayw4KSkpLG49YihrLDEpLG09dihhLG4sU2suYXN0bm9kZXMuU3RvcmUpLG09MT09PWMobik/bVswXTpuZXcgU2suYXN0bm9kZXMuVHVwbGUobSxTay5hc3Rub2Rlcy5TdG9yZSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpLG5ldyBTay5hc3Rub2Rlcy5Gb3IobSxXKGEsYihrLDMpKSx0KGEsYihrLDUpKSxkLGsubGluZW5vLGsuY29sX29mZnNldCk7Y2FzZSByLnRyeV9zdG10OmQ9W107cD1jKGspO209KHAtMykvMzt1PVtdO3E9bnVsbDtlKGssci50cnlfc3RtdCk7bj10KGEsYihrLDIpKTtpZihiKGsscC0zKS50eXBlPT09ei5UX05BTUUpXCJmaW5hbGx5XCI9PT1iKGsscC0zKS52YWx1ZT8oOTw9cCYmYihrLHAtNikudHlwZT09PXouVF9OQU1FJiYodT10KGEsYihrLHAtNCkpLG0tLSkscT10KGEsYihrLHAtMSkpKTp1PXQoYSxiKGsscC0xKSksbS0tO2Vsc2UgaWYoYihrLFxucC0zKS50eXBlIT09ci5leGNlcHRfY2xhdXNlKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibWFsZm9ybWVkICd0cnknIHN0YXRlbWVudFwiLGEuY19maWxlbmFtZSxrLmxpbmVubyk7aWYoMDxtKWZvcihwPTA7cDxtO3ArKyl7dmFyIEE9cDt2YXIgeD1hLHk9YihrLDMrMypwKSxEPWIoayw1KzMqcCk7ZSh5LHIuZXhjZXB0X2NsYXVzZSk7ZShELHIuc3VpdGUpO2lmKDE9PT1jKHkpKXZhciBFPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKG51bGwsbnVsbCx0KHgsRCkseS5saW5lbm8seS5jb2xfb2Zmc2V0KTtlbHNlIDI9PT1jKHkpP0U9bmV3IFNrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIodyh4LGIoeSwxKSksbnVsbCx0KHgsRCkseS5saW5lbm8seS5jb2xfb2Zmc2V0KTo0PT09Yyh5KT8oU2suX19mdXR1cmVfXy5weXRob24zJiZcIixcIj09Yih5LDIpLnZhbHVlJiZmKHgseSxcIk9sZC1zdHlsZSAnZXhjZXB0JyBjbGF1c2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAzXCIpLFxudyh4LGIoeSwxKSksRT13KHgsYih5LDMpKSxnKHgsRSxTay5hc3Rub2Rlcy5TdG9yZSxiKHksMykpLEU9bmV3IFNrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIodyh4LGIoeSwxKSksRSx0KHgsRCkseS5saW5lbm8seS5jb2xfb2Zmc2V0KSk6KFNrLmFzc2VydHMuZmFpbChcIndyb25nIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgZXhjZXB0IGNsYXVzZVwiKSxFPXZvaWQgMCk7ZFtBXT1FfVNrLmFzc2VydHMuYXNzZXJ0KCEhcXx8MCE9ZC5sZW5ndGgpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuVHJ5KG4sZCx1LHEsay5saW5lbm8say5jb2xfb2Zmc2V0KTtjYXNlIHIud2l0aF9zdG10OmQ9W107ZShrLHIud2l0aF9zdG10KTtmb3IobT0xO208YyhrKS0yO20rPTIpbj12b2lkIDAscT1hLHA9YihrLG0pLGUocCxyLndpdGhfaXRlbSksdT13KHEsYihwLDApKSwzPT1jKHApJiYobj13KHEsYihwLDIpKSxnKHEsbixTay5hc3Rub2Rlcy5TdG9yZSxwKSksbj1uZXcgU2suYXN0bm9kZXMud2l0aGl0ZW0odSxcbm4pLGRbKG0tMSkvMl09bjthPXQoYSxiKGssYyhrKS0xKSk7YT1uZXcgU2suYXN0bm9kZXMuV2l0aChkLGEsay5saW5lbm8say5jb2xfb2Zmc2V0KTtyZXR1cm4gYTtjYXNlIHIuZnVuY2RlZjpyZXR1cm4gVChhLGssW10sITEpO2Nhc2Ugci5jbGFzc2RlZjpyZXR1cm4gUChhLGssW10pO2Nhc2Ugci5kZWNvcmF0ZWQ6bT1udWxsO2UoayxyLmRlY29yYXRlZCk7bj1iKGssMCk7ZShuLHIuZGVjb3JhdG9ycyk7ZD1bXTtmb3IodT0wO3U8YyhuKTsrK3Upe3E9ZDtwPXU7QT1hO0U9YihuLHUpO2UoRSxyLmRlY29yYXRvcik7ZShiKEUsMCksei5UX0FUKTtlKGIoRSxjKEUpLTEpLHouVF9ORVdMSU5FKTt2YXIgQyxHPWIoRSwxKTtlKEcsci5kb3R0ZWRfbmFtZSk7eD1HLmxpbmVubzt5PUcuY29sX29mZnNldDtEPWwoYihHLDApLnZhbHVlKTt2YXIgTT1uZXcgU2suYXN0bm9kZXMuTmFtZShELFNrLmFzdG5vZGVzLkxvYWQseCx5KTtmb3IoQz0yO0M8YyhHKTtDKz0yKUQ9bChiKEcsQykudmFsdWUpLFxuTT1uZXcgU2suYXN0bm9kZXMuQXR0cmlidXRlKE0sRCxTay5hc3Rub2Rlcy5Mb2FkLHgseSk7eD1NO0E9Mz09PWMoRSk/eDo1PT09YyhFKT9uZXcgU2suYXN0bm9kZXMuQ2FsbCh4LFtdLFtdLG51bGwsbnVsbCxFLmxpbmVubyxFLmNvbF9vZmZzZXQpOkYoQSxiKEUsMykseCk7cVtwXT1BfVNrLmFzc2VydHMuYXNzZXJ0KGIoaywxKS50eXBlPT1yLmZ1bmNkZWZ8fGIoaywxKS50eXBlPT1yLmFzeW5jX2Z1bmNkZWZ8fGIoaywxKS50eXBlPT1yLmNsYXNzZGVmKTtiKGssMSkudHlwZT09ci5mdW5jZGVmPyhtPWIoaywxKSxtPVQoYSxtLGQsITEpKTpiKGssMSkudHlwZT09ci5jbGFzc2RlZj9tPVAoYSxiKGssMSksZCk6YihrLDEpLnR5cGU9PXIuYXN5bmNfZnVuY2RlZiYmKG09YihrLDEpLGUobSxyLmFzeW5jX2Z1bmNkZWYpLGUoYihtLDApLHouVF9OQU1FKSxTay5hc3NlcnRzLmFzc2VydCgoXCJhc3luY1wiPT09YihtLDApKS52YWx1ZSksZShiKG0sMSksci5mdW5jZGVmKSxtPVQoYSxtLGQsXG4hMCkpO20mJihtLmxpbmVubz1rLmxpbmVubyxtLmNvbF9vZmZzZXQ9ay5jb2xfb2Zmc2V0KTtyZXR1cm4gbTtjYXNlIHIuYXN5bmNfc3RtdDpmKGEsayxcIk5vdCBpbXBsZW1lbnRlZDogYXN5bmNcIik7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmFzc2VydChcInVuaGFuZGxlZCBjb21wb3VuZF9zdG10XCIpfX12YXIgcj1Tay5QYXJzZVRhYmxlcy5zeW0sej1Tay50b2tlbi50b2tlbnMsWj17U2xpY2Vfa2luZDoxLEV4dFNsaWNlX2tpbmQ6MixJbmRleF9raW5kOjN9LE89e307T1t6LlRfVkJBUl09U2suYXN0bm9kZXMuQml0T3I7T1t6LlRfQ0lSQ1VNRkxFWF09U2suYXN0bm9kZXMuQml0WG9yO09bei5UX0FNUEVSXT1Tay5hc3Rub2Rlcy5CaXRBbmQ7T1t6LlRfTEVGVFNISUZUXT1Tay5hc3Rub2Rlcy5MU2hpZnQ7T1t6LlRfUklHSFRTSElGVF09U2suYXN0bm9kZXMuUlNoaWZ0O09bei5UX1BMVVNdPVNrLmFzdG5vZGVzLkFkZDtPW3ouVF9NSU5VU109U2suYXN0bm9kZXMuU3ViO09bei5UX1NUQVJdPVxuU2suYXN0bm9kZXMuTXVsdDtPW3ouVF9TTEFTSF09U2suYXN0bm9kZXMuRGl2O09bei5UX0RPVUJMRVNMQVNIXT1Tay5hc3Rub2Rlcy5GbG9vckRpdjtPW3ouVF9QRVJDRU5UXT1Tay5hc3Rub2Rlcy5Nb2Q7U2suc2V0dXBPcGVyYXRvcnM9ZnVuY3Rpb24oYSl7YT9PW3ouVF9BVF09U2suYXN0bm9kZXMuTWF0TXVsdDpPW3ouVF9BVF0mJmRlbGV0ZSBPW3ouVF9BVF19O1NrLmV4cG9ydFN5bWJvbChcIlNrLnNldHVwT3BlcmF0b3JzXCIsU2suc2V0dXBPcGVyYXRvcnMpO2NvbnN0IGZhPS9fW2VFXXxbZUVdX3xcXC5ffGpfLyxoYT0vX1xcLnxbKy1dX3xeMF9cXER8X2ovLGlhPS9fKD89W15fXSkvZztTay5hc3RGcm9tUGFyc2U9ZnVuY3Rpb24oZCxnLGYpe3ZhciBrLG49bmV3IGEoXCJ1dGYtOFwiLGcsZikscD1bXSxsPTA7c3dpdGNoKGQudHlwZSl7Y2FzZSByLmZpbGVfaW5wdXQ6Zm9yKGs9MDtrPGMoZCktMTsrK2spe3ZhciBtPWIoZCxrKTtpZihkLnR5cGUhPT16LlRfTkVXTElORSlpZihlKG0sci5zdG10KSxcbmY9aChtKSwxPT09ZilwW2wrK109TihuLG0pO2Vsc2UgZm9yKG09YihtLDApLGUobSxyLnNpbXBsZV9zdG10KSxnPTA7ZzxmOysrZylwW2wrK109TihuLGIobSwyKmcpKX1yZXR1cm4gbmV3IFNrLmFzdG5vZGVzLk1vZHVsZShwKTtjYXNlIHIuZXZhbF9pbnB1dDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvO1wiKTtjYXNlIHIuc2luZ2xlX2lucHV0OlNrLmFzc2VydHMuZmFpbChcInRvZG87XCIpO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIil9fTtTay5hc3REdW1wPWZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKGEpe3ZhciBiLGM9XCJcIjtmb3IoYj0wO2I8YTsrK2IpYys9XCIgXCI7cmV0dXJuIGN9LGM9ZnVuY3Rpb24oYSxkKXt2YXIgZTtpZihudWxsPT09YSlyZXR1cm4gZCtcIk5vbmVcIjtpZihhLnByb3RvdHlwZSYmdm9pZCAwIT09YS5wcm90b3R5cGUuX2FzdG5hbWUmJmEucHJvdG90eXBlLl9pc2VudW0pcmV0dXJuIGQrYS5wcm90b3R5cGUuX2FzdG5hbWUrXCIoKVwiO2lmKHZvaWQgMCE9PVxuYS5fYXN0bmFtZSl7dmFyIGc9YihhLl9hc3RuYW1lLmxlbmd0aCsxKTt2YXIgZj1bXTtmb3IoZT0wO2U8YS5fZmllbGRzLmxlbmd0aDtlKz0yKXt2YXIgaD1hLl9maWVsZHNbZV07dmFyIGs9YS5fZmllbGRzW2UrMV0oYSk7dmFyIG49YihoLmxlbmd0aCsxKTtmLnB1c2goW2gsYyhrLGQrZytuKV0pfWs9W107Zm9yKGU9MDtlPGYubGVuZ3RoOysrZSluPWZbZV0say5wdXNoKG5bMF0rXCI9XCIrblsxXS5yZXBsYWNlKC9eXFxzKy8sXCJcIikpO2U9ay5qb2luKFwiLFxcblwiK2QrZyk7cmV0dXJuIGQrYS5fYXN0bmFtZStcIihcIitlK1wiKVwifWlmKFNrLmlzQXJyYXlMaWtlKGEpKXtnPVtdO2ZvcihlPTA7ZTxhLmxlbmd0aDsrK2UpZj1hW2VdLGcucHVzaChjKGYsZCtcIiBcIikpO2E9Zy5qb2luKFwiLFxcblwiKTtyZXR1cm4gZCtcIltcIithLnJlcGxhY2UoL15cXHMrLyxcIlwiKStcIl1cIn1hPSEwPT09YT9cIlRydWVcIjohMT09PWE/XCJGYWxzZVwiOmEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZz9hLnRwJHN0cigpLnY6YSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0cj9hLiRyKCkudjpcIlwiK2E7cmV0dXJuIGQrYX07cmV0dXJuIGMoYSxcIlwiKX07U2suZXhwb3J0U3ltYm9sKFwiU2suYXN0RnJvbVBhcnNlXCIsU2suYXN0RnJvbVBhcnNlKTtTay5leHBvcnRTeW1ib2woXCJTay5hc3REdW1wXCIsU2suYXN0RHVtcCl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsYyl7dGhpcy5fX25hbWU9YTt0aGlzLl9fZmxhZ3M9Yjt0aGlzLl9fc2NvcGU9Yj4+MTEmNzt0aGlzLl9fbmFtZXNwYWNlcz1jfHxbXX1mdW5jdGlvbiBjKGEsYixjLGUsZil7dGhpcy5zeW1GbGFncz17fTt0aGlzLm5hbWU9Yjt0aGlzLnZhcm5hbWVzPVtdO3RoaXMuY2hpbGRyZW49W107dGhpcy5ibG9ja1R5cGU9Yzt0aGlzLnJldHVybnNWYWx1ZT10aGlzLnZhcmtleXdvcmRzPXRoaXMudmFyYXJncz10aGlzLmdlbmVyYXRvcj10aGlzLmNoaWxkSGFzRnJlZT10aGlzLmhhc0ZyZWU9dGhpcy5pc05lc3RlZD0hMTt0aGlzLmxpbmVubz1mO3RoaXMudGFibGU9YTthLmN1ciYmXG4oYS5jdXIubmVzdGVkfHxcImZ1bmN0aW9uXCI9PT1hLmN1ci5ibG9ja1R5cGUpJiYodGhpcy5pc05lc3RlZD0hMCk7ZS5zY29wZUlkPWwrKzthLnN0c3NbZS5zY29wZUlkXT10aGlzO3RoaXMuc3ltYm9scz17fX1mdW5jdGlvbiBiKGEpe3RoaXMuZmlsZW5hbWU9YTt0aGlzLnRvcD10aGlzLmN1cj1udWxsO3RoaXMuc3RhY2s9W107dGhpcy5jdXJDbGFzcz10aGlzLmdsb2JhbD1udWxsO3RoaXMudG1wbmFtZT0wO3RoaXMuc3Rzcz17fX1mdW5jdGlvbiBlKGEsYil7dmFyIGM7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhKGJbY10pfWZ1bmN0aW9uIGYoYSxiKXtmb3IodmFyIGMgaW4gYilhW2NdPWJbY119U2suZXhwb3J0U3ltYm9sKFwiU2suU1lNVEFCX0NPTlNUU1wiLHtERUZfR0xPQkFMOjEsREVGX0xPQ0FMOjIsREVGX1BBUkFNOjQsVVNFOjgsREVGX1NUQVI6MTYsREVGX0RPVUJMRVNUQVI6MzIsREVGX0lOVFVQTEU6NjQsREVGX0ZSRUU6MTI4LERFRl9GUkVFX0dMT0JBTDoyNTYsREVGX0ZSRUVfQ0xBU1M6NTEyLFxuREVGX0lNUE9SVDoxMDI0LERFRl9CT1VORDoxMDMwLFNDT1BFX09GRjoxMSxTQ09QRV9NQVNLOjcsTE9DQUw6MSxHTE9CQUxfRVhQTElDSVQ6MixHTE9CQUxfSU1QTElDSVQ6MyxGUkVFOjQsQ0VMTDo1LE9QVF9JTVBPUlRfU1RBUjoxLE9QVF9FWEVDOjIsT1BUX0JBUkVfRVhFQzo0LE9QVF9UT1BMRVZFTDo4LEdFTkVSQVRPUjoyLEdFTkVSQVRPUl9FWFBSRVNTSU9OOjIsTW9kdWxlQmxvY2s6XCJtb2R1bGVcIixGdW5jdGlvbkJsb2NrOlwiZnVuY3Rpb25cIixDbGFzc0Jsb2NrOlwiY2xhc3NcIn0pO2EucHJvdG90eXBlLmdldF9uYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19uYW1lfTthLnByb3RvdHlwZS5pc19yZWZlcmVuY2VkPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjgpfTthLnByb3RvdHlwZS5pc19wYXJhbWV0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmNCl9O2EucHJvdG90eXBlLmlzX2dsb2JhbD1mdW5jdGlvbigpe3JldHVybiAzPT09dGhpcy5fX3Njb3BlfHxcbjI9PXRoaXMuX19zY29wZX07YS5wcm90b3R5cGUuaXNfZGVjbGFyZWRfZ2xvYmFsPWZ1bmN0aW9uKCl7cmV0dXJuIDI9PXRoaXMuX19zY29wZX07YS5wcm90b3R5cGUuaXNfbG9jYWw9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmMTAzMCl9O2EucHJvdG90eXBlLmlzX2ZyZWU9ZnVuY3Rpb24oKXtyZXR1cm4gND09dGhpcy5fX3Njb3BlfTthLnByb3RvdHlwZS5pc19pbXBvcnRlZD1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMuX19mbGFncyYxMDI0KX07YS5wcm90b3R5cGUuaXNfYXNzaWduZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmMil9O2EucHJvdG90eXBlLmlzX25hbWVzcGFjZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZXNwYWNlcyYmMDx0aGlzLl9fbmFtZXNwYWNlcy5sZW5ndGh9O2EucHJvdG90eXBlLmdldF9uYW1lc3BhY2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19uYW1lc3BhY2VzfTt2YXIgbD0wO2MucHJvdG90eXBlLmdldF90eXBlPVxuZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ibG9ja1R5cGV9O2MucHJvdG90eXBlLmdldF9uYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZX07Yy5wcm90b3R5cGUuZ2V0X2xpbmVubz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxpbmVub307Yy5wcm90b3R5cGUuaXNfbmVzdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOZXN0ZWR9O2MucHJvdG90eXBlLmhhc19jaGlsZHJlbj1mdW5jdGlvbigpe3JldHVybiAwPHRoaXMuY2hpbGRyZW4ubGVuZ3RofTtjLnByb3RvdHlwZS5nZXRfaWRlbnRpZmllcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oKXtyZXR1cm4hMH0pfTtjLnByb3RvdHlwZS5sb29rdXA9ZnVuY3Rpb24oYil7aWYodGhpcy5zeW1ib2xzLmhhc093blByb3BlcnR5KGIpKWI9dGhpcy5zeW1ib2xzW2JdO2Vsc2V7dmFyIGM9dGhpcy5zeW1GbGFnc1tiXTt2YXIgZT10aGlzLl9fY2hlY2tfY2hpbGRyZW4oYik7Yj10aGlzLnN5bWJvbHNbYl09XG5uZXcgYShiLGMsZSl9cmV0dXJuIGJ9O2MucHJvdG90eXBlLl9fY2hlY2tfY2hpbGRyZW49ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoYj0wO2I8dGhpcy5jaGlsZHJlbi5sZW5ndGg7KytiKXt2YXIgZT10aGlzLmNoaWxkcmVuW2JdO2UubmFtZT09PWEmJmMucHVzaChlKX1yZXR1cm4gY307Yy5wcm90b3R5cGUuX2lkZW50c01hdGNoaW5nPWZ1bmN0aW9uKGEpe3ZhciBiLGM9W107Zm9yKGIgaW4gdGhpcy5zeW1GbGFncyl0aGlzLnN5bUZsYWdzLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuc3ltRmxhZ3NbYl0pJiZjLnB1c2goYik7Yy5zb3J0KCk7cmV0dXJuIGN9O2MucHJvdG90eXBlLmdldF9wYXJhbWV0ZXJzPWZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT10aGlzLmdldF90eXBlKCksXCJnZXRfcGFyYW1ldGVycyBvbmx5IHZhbGlkIGZvciBmdW5jdGlvbiBzY29wZXNcIik7dGhpcy5fZnVuY1BhcmFtc3x8KHRoaXMuX2Z1bmNQYXJhbXM9dGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oYSl7cmV0dXJuIGEmXG40fSkpO3JldHVybiB0aGlzLl9mdW5jUGFyYW1zfTtjLnByb3RvdHlwZS5nZXRfbG9jYWxzPWZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT10aGlzLmdldF90eXBlKCksXCJnZXRfbG9jYWxzIG9ubHkgdmFsaWQgZm9yIGZ1bmN0aW9uIHNjb3Blc1wiKTt0aGlzLl9mdW5jTG9jYWxzfHwodGhpcy5fZnVuY0xvY2Fscz10aGlzLl9pZGVudHNNYXRjaGluZyhmdW5jdGlvbihhKXtyZXR1cm4gYSYxMDMwfSkpO3JldHVybiB0aGlzLl9mdW5jTG9jYWxzfTtjLnByb3RvdHlwZS5nZXRfZ2xvYmFscz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X2dsb2JhbHMgb25seSB2YWxpZCBmb3IgZnVuY3Rpb24gc2NvcGVzXCIpO3RoaXMuX2Z1bmNHbG9iYWxzfHwodGhpcy5fZnVuY0dsb2JhbHM9dGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oYSl7YT1hPj4xMSY3O3JldHVybiAzPT1hfHwyPT1hfSkpO3JldHVybiB0aGlzLl9mdW5jR2xvYmFsc307XG5jLnByb3RvdHlwZS5nZXRfZnJlZXM9ZnVuY3Rpb24oKXtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9mcmVlcyBvbmx5IHZhbGlkIGZvciBmdW5jdGlvbiBzY29wZXNcIik7dGhpcy5fZnVuY0ZyZWVzfHwodGhpcy5fZnVuY0ZyZWVzPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe3JldHVybiA0PT0oYT4+MTEmNyl9KSk7cmV0dXJuIHRoaXMuX2Z1bmNGcmVlc307Yy5wcm90b3R5cGUuZ2V0X21ldGhvZHM9ZnVuY3Rpb24oKXt2YXIgYTtTay5hc3NlcnRzLmFzc2VydChcImNsYXNzXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9tZXRob2RzIG9ubHkgdmFsaWQgZm9yIGNsYXNzIHNjb3Blc1wiKTtpZighdGhpcy5fY2xhc3NNZXRob2RzKXt2YXIgYj1bXTtmb3IoYT0wO2E8dGhpcy5jaGlsZHJlbi5sZW5ndGg7KythKWIucHVzaCh0aGlzLmNoaWxkcmVuW2FdLm5hbWUpO2Iuc29ydCgpO3RoaXMuX2NsYXNzTWV0aG9kcz1ifXJldHVybiB0aGlzLl9jbGFzc01ldGhvZHN9O1xuYy5wcm90b3R5cGUuZ2V0U2NvcGU9ZnVuY3Rpb24oYSl7YT10aGlzLnN5bUZsYWdzW2FdO3JldHVybiB2b2lkIDA9PT1hPzA6YT4+MTEmN307Yi5wcm90b3R5cGUuZ2V0U3RzRm9yQXN0PWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEuc2NvcGVJZCxcImFzdCB3YXNuJ3QgYWRkZWQgdG8gc3Q/XCIpO2E9dGhpcy5zdHNzW2Euc2NvcGVJZF07U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YSxcInVua25vd24gc3ltIHRhYiBlbnRyeVwiKTtyZXR1cm4gYX07Yi5wcm90b3R5cGUuU0VRU3RtdD1mdW5jdGlvbihhKXt2YXIgYixjO2lmKG51bGwhPT1hKXtTay5hc3NlcnRzLmFzc2VydChTay5pc0FycmF5TGlrZShhKSxcIlNFUTogbm9kZXMgaXNuJ3QgYXJyYXk/IGdvdCBcIithLnRvU3RyaW5nKCkpO3ZhciBlPWEubGVuZ3RoO2ZvcihjPTA7YzxlOysrYykoYj1hW2NdKSYmdGhpcy52aXNpdFN0bXQoYil9fTtiLnByb3RvdHlwZS5TRVFFeHByPWZ1bmN0aW9uKGEpe3ZhciBiLFxuYztpZihudWxsIT09YSl7U2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoYSksXCJTRVE6IG5vZGVzIGlzbid0IGFycmF5PyBnb3QgXCIrYS50b1N0cmluZygpKTt2YXIgZT1hLmxlbmd0aDtmb3IoYz0wO2M8ZTsrK2MpKGI9YVtjXSkmJnRoaXMudmlzaXRFeHByKGIpfX07Yi5wcm90b3R5cGUuZW50ZXJCbG9jaz1mdW5jdGlvbihhLGIsZSxmKXthPVNrLmZpeFJlc2VydmVkKGEpO3ZhciBkPW51bGw7dGhpcy5jdXImJihkPXRoaXMuY3VyLHRoaXMuc3RhY2sucHVzaCh0aGlzLmN1cikpO3RoaXMuY3VyPW5ldyBjKHRoaXMsYSxiLGUsZik7XCJ0b3BcIj09PWEmJih0aGlzLmdsb2JhbD10aGlzLmN1ci5zeW1GbGFncyk7ZCYmZC5jaGlsZHJlbi5wdXNoKHRoaXMuY3VyKX07Yi5wcm90b3R5cGUuZXhpdEJsb2NrPWZ1bmN0aW9uKCl7dGhpcy5jdXI9bnVsbDswPHRoaXMuc3RhY2subGVuZ3RoJiYodGhpcy5jdXI9dGhpcy5zdGFjay5wb3AoKSl9O2IucHJvdG90eXBlLnZpc2l0UGFyYW1zPVxuZnVuY3Rpb24oYSxiKXt2YXIgYztmb3IoYz0wO2M8YS5sZW5ndGg7KytjKWlmKGI9YVtjXSxiLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuYXJnKXRoaXMuYWRkRGVmKGIuYXJnLDQsYi5saW5lbm8pO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIGV4cHJlc3Npb24gaW4gcGFyYW1ldGVyIGxpc3RcIix0aGlzLmZpbGVuYW1lKTt9O2IucHJvdG90eXBlLnZpc2l0QXJndW1lbnRzPWZ1bmN0aW9uKGEsYil7YS5hcmdzJiZ0aGlzLnZpc2l0UGFyYW1zKGEuYXJncywhMCk7YS5rd29ubHlhcmdzJiZ0aGlzLnZpc2l0UGFyYW1zKGEua3dvbmx5YXJncywhMCk7YS52YXJhcmcmJih0aGlzLmFkZERlZihhLnZhcmFyZy5hcmcsNCxiKSx0aGlzLmN1ci52YXJhcmdzPSEwKTthLmt3YXJnJiYodGhpcy5hZGREZWYoYS5rd2FyZy5hcmcsNCxiKSx0aGlzLmN1ci52YXJrZXl3b3Jkcz0hMCl9O2IucHJvdG90eXBlLm5ld1RtcG5hbWU9ZnVuY3Rpb24oYSl7dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKFwiX1tcIitcbisrdGhpcy50bXBuYW1lK1wiXVwiKSwyLGEpfTtiLnByb3RvdHlwZS5hZGREZWY9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVNrLm1hbmdsZU5hbWUodGhpcy5jdXJDbGFzcyxhKS52O2Q9U2suZml4UmVzZXJ2ZWQoZCk7dmFyIGU9dGhpcy5jdXIuc3ltRmxhZ3NbZF07aWYodm9pZCAwIT09ZSl7aWYoYiY0JiZlJjQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJkdXBsaWNhdGUgYXJndW1lbnQgJ1wiK2EuditcIicgaW4gZnVuY3Rpb24gZGVmaW5pdGlvblwiLHRoaXMuZmlsZW5hbWUsYyk7ZXw9Yn1lbHNlIGU9Yjt0aGlzLmN1ci5zeW1GbGFnc1tkXT1lO2ImND90aGlzLmN1ci52YXJuYW1lcy5wdXNoKGQpOmImMSYmKGU9YixhPXRoaXMuZ2xvYmFsW2RdLHZvaWQgMCE9PWEmJihlfD1hKSx0aGlzLmdsb2JhbFtkXT1lKX07Yi5wcm90b3R5cGUudmlzaXRTbGljZT1mdW5jdGlvbihhKXt2YXIgYjtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5TbGljZTphLmxvd2VyJiZcbnRoaXMudmlzaXRFeHByKGEubG93ZXIpO2EudXBwZXImJnRoaXMudmlzaXRFeHByKGEudXBwZXIpO2Euc3RlcCYmdGhpcy52aXNpdEV4cHIoYS5zdGVwKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4dFNsaWNlOmZvcihiPTA7YjxhLmRpbXMubGVuZ3RoOysrYil0aGlzLnZpc2l0U2xpY2UoYS5kaW1zW2JdKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkluZGV4OnRoaXMudmlzaXRFeHByKGEudmFsdWUpfX07Yi5wcm90b3R5cGUudmlzaXRTdG10PWZ1bmN0aW9uKGEpe3ZhciBiO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJ2aXNpdFN0bXQgY2FsbGVkIHdpdGggdW5kZWZpbmVkXCIpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmOnRoaXMuYWRkRGVmKGEubmFtZSwyLGEubGluZW5vKTthLmFyZ3MuZGVmYXVsdHMmJnRoaXMuU0VRRXhwcihhLmFyZ3MuZGVmYXVsdHMpO2EuZGVjb3JhdG9yX2xpc3QmJnRoaXMuU0VRRXhwcihhLmRlY29yYXRvcl9saXN0KTtcbnRoaXMuZW50ZXJCbG9jayhhLm5hbWUudixcImZ1bmN0aW9uXCIsYSxhLmxpbmVubyk7dGhpcy52aXNpdEFyZ3VtZW50cyhhLmFyZ3MsYS5saW5lbm8pO3RoaXMuU0VRU3RtdChhLmJvZHkpO3RoaXMuZXhpdEJsb2NrKCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5DbGFzc0RlZjp0aGlzLmFkZERlZihhLm5hbWUsMixhLmxpbmVubyk7dGhpcy5TRVFFeHByKGEuYmFzZXMpO2EuZGVjb3JhdG9yX2xpc3QmJnRoaXMuU0VRRXhwcihhLmRlY29yYXRvcl9saXN0KTt0aGlzLmVudGVyQmxvY2soYS5uYW1lLnYsXCJjbGFzc1wiLGEsYS5saW5lbm8pO3RoaXMuY3VyQ2xhc3M9YS5uYW1lO3RoaXMuU0VRU3RtdChhLmJvZHkpO3RoaXMuZXhpdEJsb2NrKCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5SZXR1cm46aWYoYS52YWx1ZSYmKHRoaXMudmlzaXRFeHByKGEudmFsdWUpLHRoaXMuY3VyLnJldHVybnNWYWx1ZT0hMCx0aGlzLmN1ci5nZW5lcmF0b3IpKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiJ3JldHVybicgd2l0aCBhcmd1bWVudCBpbnNpZGUgZ2VuZXJhdG9yXCIsXG50aGlzLmZpbGVuYW1lKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbGV0ZTp0aGlzLlNFUUV4cHIoYS50YXJnZXRzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkFzc2lnbjp0aGlzLlNFUUV4cHIoYS50YXJnZXRzKTt0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkFubkFzc2lnbjppZihhLnRhcmdldC5jb25zdHJ1Y3Rvcj09U2suYXN0bm9kZXMuTmFtZSl7dmFyIGM9YS50YXJnZXQ7dmFyIGY9U2subWFuZ2xlTmFtZSh0aGlzLmN1ckNsYXNzLGMuaWQpLnY7Zj1Tay5maXhSZXNlcnZlZChmKTtjPXRoaXMuY3VyLnN5bUZsYWdzW2ZdO2lmKGMmMjA0OSYmdGhpcy5nbG9iYWwhPXRoaXMuY3VyLnN5bUZsYWdzJiZhLnNpbXBsZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFubm90YXRlZCBuYW1lICdcIitmK1wiJyBjYW4ndCBiZSBnbG9iYWxcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTthLnNpbXBsZT90aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoZiksXG40MDk4LGEubGluZW5vKTphLnZhbHVlJiZ0aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoZiksMixhLmxpbmVubyl9ZWxzZSB0aGlzLnZpc2l0RXhwcihhLnRhcmdldCk7dGhpcy52aXNpdEV4cHIoYS5hbm5vdGF0aW9uKTthLnZhbHVlJiZ0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF1Z0Fzc2lnbjp0aGlzLnZpc2l0RXhwcihhLnRhcmdldCk7dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5QcmludDphLmRlc3QmJnRoaXMudmlzaXRFeHByKGEuZGVzdCk7dGhpcy5TRVFFeHByKGEudmFsdWVzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkZvcjp0aGlzLnZpc2l0RXhwcihhLnRhcmdldCk7dGhpcy52aXNpdEV4cHIoYS5pdGVyKTt0aGlzLlNFUVN0bXQoYS5ib2R5KTthLm9yZWxzZSYmdGhpcy5TRVFTdG10KGEub3JlbHNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLldoaWxlOnRoaXMudmlzaXRFeHByKGEudGVzdCk7XG50aGlzLlNFUVN0bXQoYS5ib2R5KTthLm9yZWxzZSYmdGhpcy5TRVFTdG10KGEub3JlbHNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmOnRoaXMudmlzaXRFeHByKGEudGVzdCk7dGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5SYWlzZTphLmV4YyYmKHRoaXMudmlzaXRFeHByKGEuZXhjKSxhLmluc3QmJih0aGlzLnZpc2l0RXhwcihhLmluc3QpLGEudGJhY2smJnRoaXMudmlzaXRFeHByKGEudGJhY2spKSxhLmNhdXNlJiZ0aGlzLnZpc2l0RXhwcihhLmNhdXNlKSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NlcnQ6dGhpcy52aXNpdEV4cHIoYS50ZXN0KTthLm1zZyYmdGhpcy52aXNpdEV4cHIoYS5tc2cpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuSW1wb3J0OmNhc2UgU2suYXN0bm9kZXMuSW1wb3J0RnJvbTp0aGlzLnZpc2l0QWxpYXMoYS5uYW1lcyxhLmxpbmVubyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5HbG9iYWw6dmFyIGs9XG5hLm5hbWVzLmxlbmd0aDtmb3IoYj0wO2I8azsrK2Ipe2Y9U2subWFuZ2xlTmFtZSh0aGlzLmN1ckNsYXNzLGEubmFtZXNbYl0pLnY7Zj1Tay5maXhSZXNlcnZlZChmKTtjPXRoaXMuY3VyLnN5bUZsYWdzW2ZdO2lmKGMmMTApe2lmKGMmMil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm5hbWUgJ1wiK2YrXCInIGlzIGFzc2lnbmVkIHRvIGJlZm9yZSBnbG9iYWwgZGVjbGFyYXRpb25cIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm5hbWUgJ1wiK2YrXCInIGlzIHVzZWQgcHJpb3IgdG8gZ2xvYmFsIGRlY2xhcmF0aW9uXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7fXRoaXMuYWRkRGVmKG5ldyBTay5idWlsdGluLnN0cihmKSwxLGEubGluZW5vKX1icmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4cHI6dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5QYXNzOmNhc2UgU2suYXN0bm9kZXMuQnJlYWs6Y2FzZSBTay5hc3Rub2Rlcy5Db250aW51ZTpjYXNlIFNrLmFzdG5vZGVzLkRlYnVnZ2VyOmJyZWFrO1xuY2FzZSBTay5hc3Rub2Rlcy5XaXRoOmUodGhpcy52aXNpdF93aXRoaXRlbS5iaW5kKHRoaXMpLGEuaXRlbXMpO2UodGhpcy52aXNpdFN0bXQuYmluZCh0aGlzKSxhLmJvZHkpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuVHJ5OnRoaXMuU0VRU3RtdChhLmJvZHkpO3RoaXMudmlzaXRFeGNlcHRoYW5kbGVycyhhLmhhbmRsZXJzKTt0aGlzLlNFUVN0bXQoYS5vcmVsc2UpO3RoaXMuU0VRU3RtdChhLmZpbmFsYm9keSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJVbmhhbmRsZWQgdHlwZSBcIithLmNvbnN0cnVjdG9yLm5hbWUrXCIgaW4gdmlzaXRTdG10XCIpfX07Yi5wcm90b3R5cGUudmlzaXRfd2l0aGl0ZW09ZnVuY3Rpb24oYSl7dGhpcy52aXNpdEV4cHIoYS5jb250ZXh0X2V4cHIpO2Eub3B0aW9uYWxfdmFycyYmdGhpcy52aXNpdEV4cHIoYS5vcHRpb25hbF92YXJzKX07Yi5wcm90b3R5cGUudmlzaXRFeHByPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PVxuYSxcInZpc2l0RXhwciBjYWxsZWQgd2l0aCB1bmRlZmluZWRcIik7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuQm9vbE9wOnRoaXMuU0VRRXhwcihhLnZhbHVlcyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5CaW5PcDp0aGlzLnZpc2l0RXhwcihhLmxlZnQpO3RoaXMudmlzaXRFeHByKGEucmlnaHQpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuVW5hcnlPcDp0aGlzLnZpc2l0RXhwcihhLm9wZXJhbmQpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGFtYmRhOnRoaXMuYWRkRGVmKG5ldyBTay5idWlsdGluLnN0cihcImxhbWJkYVwiKSwyLGEubGluZW5vKTthLmFyZ3MuZGVmYXVsdHMmJnRoaXMuU0VRRXhwcihhLmFyZ3MuZGVmYXVsdHMpO3RoaXMuZW50ZXJCbG9jayhcImxhbWJkYVwiLFwiZnVuY3Rpb25cIixhLGEubGluZW5vKTt0aGlzLnZpc2l0QXJndW1lbnRzKGEuYXJncyxhLmxpbmVubyk7dGhpcy52aXNpdEV4cHIoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuSWZFeHA6dGhpcy52aXNpdEV4cHIoYS50ZXN0KTtcbnRoaXMudmlzaXRFeHByKGEuYm9keSk7dGhpcy52aXNpdEV4cHIoYS5vcmVsc2UpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGljdDp0aGlzLlNFUUV4cHIoYS5rZXlzKTt0aGlzLlNFUUV4cHIoYS52YWx1ZXMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGljdENvbXA6Y2FzZSBTay5hc3Rub2Rlcy5TZXRDb21wOnRoaXMudmlzaXRDb21wcmVoZW5zaW9uKGEuZ2VuZXJhdG9ycywwKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOnRoaXMubmV3VG1wbmFtZShhLmxpbmVubyk7dGhpcy52aXNpdEV4cHIoYS5lbHQpO3RoaXMudmlzaXRDb21wcmVoZW5zaW9uKGEuZ2VuZXJhdG9ycywwKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDp0aGlzLnZpc2l0R2VuZXhwKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6YS52YWx1ZSYmdGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7dGhpcy5jdXIuZ2VuZXJhdG9yPSEwO2lmKHRoaXMuY3VyLnJldHVybnNWYWx1ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidyZXR1cm4nIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvclwiLFxudGhpcy5maWxlbmFtZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Db21wYXJlOnRoaXMudmlzaXRFeHByKGEubGVmdCk7dGhpcy5TRVFFeHByKGEuY29tcGFyYXRvcnMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ2FsbDp0aGlzLnZpc2l0RXhwcihhLmZ1bmMpO2lmKGEuYXJncylmb3IobGV0IGIgb2YgYS5hcmdzKWIuY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkP3RoaXMudmlzaXRFeHByKGIudmFsdWUpOnRoaXMudmlzaXRFeHByKGIpO2lmKGEua2V5d29yZHMpZm9yKGxldCBiIG9mIGEua2V5d29yZHMpdGhpcy52aXNpdEV4cHIoYi52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OdW06Y2FzZSBTay5hc3Rub2Rlcy5TdHI6Y2FzZSBTay5hc3Rub2Rlcy5CeXRlczpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkpvaW5lZFN0cjpmb3IobGV0IGIgb2YgYS52YWx1ZXMpdGhpcy52aXNpdEV4cHIoYik7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZTp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTtcbmEuZm9ybWF0X3NwZWMmJnRoaXMudmlzaXRFeHByKGEuZm9ybWF0X3NwZWMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OnRoaXMudmlzaXRFeHByKGEudmFsdWUpO3RoaXMudmlzaXRTbGljZShhLnNsaWNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLk5hbWU6dGhpcy5hZGREZWYoYS5pZCxhLmN0eD09PVNrLmFzdG5vZGVzLkxvYWQ/ODoyLGEubGluZW5vKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3Q6Y2FzZSBTay5hc3Rub2Rlcy5UdXBsZTpjYXNlIFNrLmFzdG5vZGVzLlNldDp0aGlzLlNFUUV4cHIoYS5lbHRzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlN0YXJyZWQ6dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJVbmhhbmRsZWQgdHlwZSBcIithLmNvbnN0cnVjdG9yLm5hbWUrXG5cIiBpbiB2aXNpdEV4cHJcIil9fTtiLnByb3RvdHlwZS52aXNpdENvbXByZWhlbnNpb249ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPWEubGVuZ3RoO2ZvcihjPWI7YzxkOysrYyliPWFbY10sdGhpcy52aXNpdEV4cHIoYi50YXJnZXQpLHRoaXMudmlzaXRFeHByKGIuaXRlciksdGhpcy5TRVFFeHByKGIuaWZzKX07Yi5wcm90b3R5cGUudmlzaXRBbGlhcz1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7Zm9yKGQ9MDtkPGEubGVuZ3RoOysrZCl7dmFyIGU9YVtkXTt2YXIgZj1jPW51bGw9PT1lLmFzbmFtZT9lLm5hbWUudjplLmFzbmFtZS52O2U9Yy5pbmRleE9mKFwiLlwiKTstMSE9PWUmJihmPWMuc3Vic3RyKDAsZSkpO2lmKFwiKlwiIT09Yyl0aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoZiksMTAyNCxiKTtlbHNlIGlmKFwibW9kdWxlXCIhPT10aGlzLmN1ci5ibG9ja1R5cGUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbXBvcnQgKiBvbmx5IGFsbG93ZWQgYXQgbW9kdWxlIGxldmVsXCIsXG50aGlzLmZpbGVuYW1lKTt9fTtiLnByb3RvdHlwZS52aXNpdEdlbmV4cD1mdW5jdGlvbihhKXt2YXIgYj1hLmdlbmVyYXRvcnNbMF07dGhpcy52aXNpdEV4cHIoYi5pdGVyKTt0aGlzLmVudGVyQmxvY2soXCJnZW5leHByXCIsXCJmdW5jdGlvblwiLGEsYS5saW5lbm8pO3RoaXMuY3VyLmdlbmVyYXRvcj0hMDt0aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoXCIuMFwiKSw0LGEubGluZW5vKTt0aGlzLnZpc2l0RXhwcihiLnRhcmdldCk7dGhpcy5TRVFFeHByKGIuaWZzKTt0aGlzLnZpc2l0Q29tcHJlaGVuc2lvbihhLmdlbmVyYXRvcnMsMSk7dGhpcy52aXNpdEV4cHIoYS5lbHQpO3RoaXMuZXhpdEJsb2NrKCl9O2IucHJvdG90eXBlLnZpc2l0RXhjZXB0aGFuZGxlcnM9ZnVuY3Rpb24oYSl7dmFyIGIsYztmb3IoYj0wO2M9YVtiXTsrK2IpYy50eXBlJiZ0aGlzLnZpc2l0RXhwcihjLnR5cGUpLGMubmFtZSYmdGhpcy52aXNpdEV4cHIoYy5uYW1lKSx0aGlzLlNFUVN0bXQoYy5ib2R5KX07Yi5wcm90b3R5cGUuYW5hbHl6ZUJsb2NrPVxuZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGQ9e307dmFyIGc9e30saD17fSxuPXt9LGw9e307XCJjbGFzc1wiPT1hLmJsb2NrVHlwZSYmKGYoaCxlKSxiJiZmKG4sYikpO2ZvcihxIGluIGEuc3ltRmxhZ3Mpe3ZhciBtPWEuc3ltRmxhZ3NbcV07dGhpcy5hbmFseXplTmFtZShhLGcscSxtLGIsZCxjLGUpfVwiY2xhc3NcIiE9PWEuYmxvY2tUeXBlJiYoXCJmdW5jdGlvblwiPT09YS5ibG9ja1R5cGUmJmYobixkKSxiJiZmKG4sYiksZihoLGUpKTtkPXt9O3ZhciBxPWEuY2hpbGRyZW4ubGVuZ3RoO2ZvcihtPTA7bTxxOysrbSlpZihlPWEuY2hpbGRyZW5bbV0sdGhpcy5hbmFseXplQ2hpbGRCbG9jayhlLG4sbCxoLGQpLGUuaGFzRnJlZXx8ZS5jaGlsZEhhc0ZyZWUpYS5jaGlsZEhhc0ZyZWU9ITA7ZihsLGQpO1wiZnVuY3Rpb25cIj09PWEuYmxvY2tUeXBlJiZ0aGlzLmFuYWx5emVDZWxscyhnLGwpO2I9dGhpcy51cGRhdGVTeW1ib2xzKGEuc3ltRmxhZ3MsZyxiLGwsXCJjbGFzc1wiPT09YS5ibG9ja1R5cGUpO1xuYS5oYXNGcmVlPWEuaGFzRnJlZXx8YjtmKGMsbCl9O2IucHJvdG90eXBlLmFuYWx5emVDaGlsZEJsb2NrPWZ1bmN0aW9uKGEsYixjLGUsayl7dmFyIGQ9e307ZihkLGIpO2I9e307ZihiLGMpO2M9e307ZihjLGUpO3RoaXMuYW5hbHl6ZUJsb2NrKGEsZCxiLGMpO2YoayxiKX07Yi5wcm90b3R5cGUuYW5hbHl6ZUNlbGxzPWZ1bmN0aW9uKGEsYil7dmFyIGM7Zm9yKGMgaW4gYSl7dmFyIGQ9YVtjXTsxPT09ZCYmdm9pZCAwIT09YltjXSYmKGFbY109NSxkZWxldGUgYltjXSl9fTtiLnByb3RvdHlwZS51cGRhdGVTeW1ib2xzPWZ1bmN0aW9uKGEsYixjLGUsZil7dmFyIGQsZz0hMTtmb3IoZCBpbiBhKXt2YXIgaz1hW2RdO3ZhciBoPWJbZF07a3w9aDw8MTE7YVtkXT1rfWZvcihkIGluIGUpYj1hW2RdLHZvaWQgMCE9PWI/ZiYmYiYxMDMxJiYoYnw9NTEyLGFbZF09Yik6dm9pZCAwIT09Y1tkXSYmKGFbZF09ODE5MixnPSEwKTtyZXR1cm4gZ307Yi5wcm90b3R5cGUuYW5hbHl6ZU5hbWU9ZnVuY3Rpb24oYSxcbmIsYyxlLGYscCxsLG0pe2lmKGUmMSl7aWYoZSY0KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibmFtZSAnXCIrYytcIicgaXMgbG9jYWwgYW5kIGdsb2JhbFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2JbY109MjttW2NdPW51bGw7ZiYmdm9pZCAwIT09ZltjXSYmZGVsZXRlIGZbY119ZWxzZSBlJjEwMzA/KGJbY109MSxwW2NdPW51bGwsZGVsZXRlIG1bY10pOmYmJnZvaWQgMCE9PWZbY10/KGJbY109NCxhLmhhc0ZyZWU9ITAsbFtjXT1udWxsKToobSYmdm9pZCAwIT09bVtjXXx8IWEuaXNOZXN0ZWR8fChhLmhhc0ZyZWU9ITApLGJbY109Myl9O2IucHJvdG90eXBlLmFuYWx5emU9ZnVuY3Rpb24oKXt0aGlzLmFuYWx5emVCbG9jayh0aGlzLnRvcCxudWxsLHt9LHt9KX07U2suc3ltYm9sdGFibGU9ZnVuY3Rpb24oYSxjKXt2YXIgZD1uZXcgYihjKTtkLmVudGVyQmxvY2soXCJ0b3BcIixcIm1vZHVsZVwiLGEsMCk7ZC50b3A9ZC5jdXI7Zm9yKGM9MDtjPGEuYm9keS5sZW5ndGg7KytjKWQudmlzaXRTdG10KGEuYm9keVtjXSk7XG5kLmV4aXRCbG9jaygpO2QuYW5hbHl6ZSgpO3JldHVybiBkfTtTay5kdW1wU3ltdGFiPWZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKGEpe3JldHVybiBhP1wiVHJ1ZVwiOlwiRmFsc2VcIn0sYz1mdW5jdGlvbihhKXt2YXIgYixjPVtdO2ZvcihiPTA7YjxhLmxlbmd0aDsrK2IpYy5wdXNoKChuZXcgU2suYnVpbHRpbi5zdHIoYVtiXSkpLiRyKCkudik7cmV0dXJuXCJbXCIrYy5qb2luKFwiLCBcIikrXCJdXCJ9LGU9ZnVuY3Rpb24oYSxkKXt2YXIgZixnO3ZvaWQgMD09PWQmJihkPVwiXCIpO3ZhciBrPWQrXCJTeW1fdHlwZTogXCIrYS5nZXRfdHlwZSgpK1wiXFxuXCI7ays9ZCtcIlN5bV9uYW1lOiBcIithLmdldF9uYW1lKCkrXCJcXG5cIjtrKz1kK1wiU3ltX2xpbmVubzogXCIrYS5nZXRfbGluZW5vKCkrXCJcXG5cIjtrKz1kK1wiU3ltX25lc3RlZDogXCIrYihhLmlzX25lc3RlZCgpKStcIlxcblwiO2srPWQrXCJTeW1faGFzY2hpbGRyZW46IFwiK2IoYS5oYXNfY2hpbGRyZW4oKSkrXCJcXG5cIjtcImNsYXNzXCI9PT1hLmdldF90eXBlKCk/ays9ZCtcblwiQ2xhc3NfbWV0aG9kczogXCIrYyhhLmdldF9tZXRob2RzKCkpK1wiXFxuXCI6XCJmdW5jdGlvblwiPT09YS5nZXRfdHlwZSgpJiYoays9ZCtcIkZ1bmNfcGFyYW1zOiBcIitjKGEuZ2V0X3BhcmFtZXRlcnMoKSkrXCJcXG5cIixrKz1kK1wiRnVuY19sb2NhbHM6IFwiK2MoYS5nZXRfbG9jYWxzKCkpK1wiXFxuXCIsays9ZCtcIkZ1bmNfZ2xvYmFsczogXCIrYyhhLmdldF9nbG9iYWxzKCkpK1wiXFxuXCIsays9ZCtcIkZ1bmNfZnJlZXM6IFwiK2MoYS5nZXRfZnJlZXMoKSkrXCJcXG5cIik7ays9ZCtcIi0tIElkZW50aWZpZXJzIC0tXFxuXCI7dmFyIGg9YS5nZXRfaWRlbnRpZmllcnMoKTt2YXIgbj1oLmxlbmd0aDtmb3IoZz0wO2c8bjsrK2cpe3ZhciBsPWEubG9va3VwKGhbZ10pO2srPWQrXCJuYW1lOiBcIitsLmdldF9uYW1lKCkrXCJcXG5cIjtrKz1kK1wiICBpc19yZWZlcmVuY2VkOiBcIitiKGwuaXNfcmVmZXJlbmNlZCgpKStcIlxcblwiO2srPWQrXCIgIGlzX2ltcG9ydGVkOiBcIitiKGwuaXNfaW1wb3J0ZWQoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19wYXJhbWV0ZXI6IFwiK1xuYihsLmlzX3BhcmFtZXRlcigpKStcIlxcblwiO2srPWQrXCIgIGlzX2dsb2JhbDogXCIrYihsLmlzX2dsb2JhbCgpKStcIlxcblwiO2srPWQrXCIgIGlzX2RlY2xhcmVkX2dsb2JhbDogXCIrYihsLmlzX2RlY2xhcmVkX2dsb2JhbCgpKStcIlxcblwiO2srPWQrXCIgIGlzX2xvY2FsOiBcIitiKGwuaXNfbG9jYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19mcmVlOiBcIitiKGwuaXNfZnJlZSgpKStcIlxcblwiO2srPWQrXCIgIGlzX2Fzc2lnbmVkOiBcIitiKGwuaXNfYXNzaWduZWQoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19uYW1lc3BhY2U6IFwiK2IobC5pc19uYW1lc3BhY2UoKSkrXCJcXG5cIjt2YXIgbT1sLmdldF9uYW1lc3BhY2VzKCk7dmFyIHA9bS5sZW5ndGg7ays9ZCtcIiAgbmFtZXNwYWNlczogW1xcblwiO3ZhciBxPVtdO2ZvcihmPTA7ZjxwOysrZilsPW1bZl0scS5wdXNoKGUobCxkK1wiICAgIFwiKSk7ays9cS5qb2luKFwiXFxuXCIpO2srPWQrXCIgIF1cXG5cIn1yZXR1cm4ga307cmV0dXJuIGUoYS50b3AsXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnN5bWJvbHRhYmxlXCIsXG5Tay5zeW1ib2x0YWJsZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suZHVtcFN5bXRhYlwiLFNrLmR1bXBTeW10YWIpfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMsZSxmKXt0aGlzLmZpbGVuYW1lPWE7dGhpcy5zdD1iO3RoaXMuZmxhZ3M9Yzt0aGlzLmNhblN1c3BlbmQ9ZTt0aGlzLmludGVyYWN0aXZlPSExO3RoaXMubmVzdGxldmVsPTA7dGhpcy51PW51bGw7dGhpcy5zdGFjaz1bXTt0aGlzLnJlc3VsdD1bXTt0aGlzLmFsbFVuaXRzPVtdO3RoaXMuc291cmNlPWY/Zi5zcGxpdChcIlxcblwiKTohMX1mdW5jdGlvbiBjKCl7dGhpcy5uYW1lPXRoaXMuc3RlPW51bGw7dGhpcy5kb2VzU3VzcGVuZD10aGlzLmNhblN1c3BlbmQ9ITE7dGhpcy5wcml2YXRlXz1udWxsO3RoaXMubGluZW5vPXRoaXMuZmlyc3RsaW5lbm89MDt0aGlzLmxpbmVub1NldD0hMTt0aGlzLmxvY2FsbmFtZXM9W107dGhpcy5sb2NhbHRlbXBzPVtdO3RoaXMudGVtcHNUb1NhdmU9W107dGhpcy5ibG9ja251bT0wO3RoaXMuYmxvY2tzPVxuW107dGhpcy5jdXJibG9jaz0wO3RoaXMuY29uc3RzPXt9O3RoaXMuc2NvcGVuYW1lPW51bGw7dGhpcy5zdWZmaXhDb2RlPXRoaXMuc3dpdGNoQ29kZT10aGlzLnZhckRlY2xzQ29kZT10aGlzLnByZWZpeENvZGU9XCJcIjt0aGlzLmJyZWFrQmxvY2tzPVtdO3RoaXMuY29udGludWVCbG9ja3M9W107dGhpcy5leGNlcHRCbG9ja3M9W107dGhpcy5maW5hbGx5QmxvY2tzPVtdfWZ1bmN0aW9uIGIoYSl7cmV0dXJuIHZvaWQgMD09PWhbYV0/YTphK1wiXyRydyRcIn1mdW5jdGlvbiBlKGEsYil7dmFyIGM9Yi52O2lmKG51bGw9PT1hfHxudWxsPT09Y3x8XCJfXCIhPT1jLmNoYXJBdCgwKXx8XCJfXCIhPT1jLmNoYXJBdCgxKXx8XCJfXCI9PT1jLmNoYXJBdChjLmxlbmd0aC0xKSYmXCJfXCI9PT1jLmNoYXJBdChjLmxlbmd0aC0yKSlyZXR1cm4gYjt2YXIgZD1hLnY7ZC5yZXBsYWNlKC9fL2csXCJcIik7aWYoXCJcIj09PWQpcmV0dXJuIGI7ZD1hLnY7ZC5yZXBsYWNlKC9eXyovLFwiXCIpO3JldHVybiBkPW5ldyBTay5idWlsdGluLnN0cihcIl9cIitcbmQrYyl9ZnVuY3Rpb24gZihhKXtsZXQgYj0nXCInO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKXtsZXQgZD1hLmNoYXJDb2RlQXQoYyk7Yj0xMD09ZD9iK1wiXFxcXG5cIjo5Mj09ZD9iK1wiXFxcXFxcXFxcIjozND09ZHx8MzI+ZHx8MTI3PD1kJiYyNTY+ZD9iKyhcIlxcXFx4XCIrKFwiMFwiK2QudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTIpKToyNTY8PWQ/YisoXCJcXFxcdVwiKyhcIjAwMFwiK2QudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTQpKTpiK2EuY2hhckF0KGMpfXJldHVybiBiKydcIid9dmFyIGw7U2suZ2Vuc3ltY291bnQ9MDtjLnByb3RvdHlwZS5hY3RpdmF0ZVNjb3BlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztsPWZ1bmN0aW9uKCl7dmFyIGIsYz1hLmJsb2Nrc1thLmN1cmJsb2NrXTtpZihudWxsPT09Yy5fbmV4dClmb3IoYj0wO2I8YXJndW1lbnRzLmxlbmd0aDsrK2IpYy5wdXNoKGFyZ3VtZW50c1tiXSl9fTthLnByb3RvdHlwZS5nZXRTb3VyY2VMaW5lPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMuc291cmNlKTtcbnJldHVybiB0aGlzLnNvdXJjZVthLTFdfTthLnByb3RvdHlwZS5hbm5vdGF0ZVNvdXJjZT1mdW5jdGlvbihhKXt2YXIgYjtpZih0aGlzLnNvdXJjZSl7dmFyIGM9YS5saW5lbm87dmFyIGQ9YS5jb2xfb2Zmc2V0O2woXCJcXG4vL1xcbi8vIGxpbmUgXCIsYyxcIjpcXG4vLyBcIix0aGlzLmdldFNvdXJjZUxpbmUoYyksXCJcXG4vLyBcIik7Zm9yKGI9MDtiPGQ7KytiKWwoXCIgXCIpO2woXCJeXFxuLy9cXG5cIik7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YS5saW5lbm8mJnZvaWQgMCE9PWEuY29sX29mZnNldCk7bChcIiRjdXJyTGluZU5vID0gXCIsYyxcIjtcXG4kY3VyckNvbE5vID0gXCIsZCxcIjtcXG5cXG5cIil9fTthLnByb3RvdHlwZS5nZW5zeW09ZnVuY3Rpb24oYSl7cmV0dXJuIGE9XCIkXCIrKGF8fFwiXCIpK1NrLmdlbnN5bWNvdW50Kyt9O2EucHJvdG90eXBlLm5pY2VOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdlbnN5bShhLnJlcGxhY2UoXCI8XCIsXCJcIikucmVwbGFjZShcIj5cIixcIlwiKS5yZXBsYWNlKFwiIFwiLFwiX1wiKSl9O1xudmFyIGg9U2suYnVpbHRpbi5zdHIucmVzZXJ2ZWRXb3Jkc187YS5wcm90b3R5cGUubWFrZUNvbnN0YW50PWZ1bmN0aW9uKGEpe3ZhciBiLGM9XCJcIjtmb3IoYj0wO2I8YXJndW1lbnRzLmxlbmd0aDsrK2IpYys9YXJndW1lbnRzW2JdO2ZvcihkIGluIHRoaXMudS5jb25zdHMpaWYodGhpcy51LmNvbnN0cy5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9dGhpcy51LmNvbnN0c1tkXSxiPT1jKSlyZXR1cm4gZDt2YXIgZD10aGlzLnUuc2NvcGVuYW1lK1wiLlwiK3RoaXMuZ2Vuc3ltKFwiY29uc3RcIik7dGhpcy51LmNvbnN0c1tkXT1jO3JldHVybiBkfTthLnByb3RvdHlwZS5fZ3I9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPXRoaXMuZ2Vuc3ltKGEpO3RoaXMudS5sb2NhbHRlbXBzLnB1c2goZCk7bChcInZhciBcIixkLFwiPVwiKTtmb3IoYz0xO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpbChhcmd1bWVudHNbY10pO2woXCI7XCIpO3JldHVybiBkfTthLnByb3RvdHlwZS5vdXRwdXRJbnRlcnJ1cHRUZXN0PWZ1bmN0aW9uKCl7dmFyIGE9XG5cIlwiO2lmKG51bGwhPT1Tay5leGVjTGltaXR8fG51bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZClhKz1cInZhciAkZGF0ZU5vdyA9IERhdGUubm93KCk7XCIsbnVsbCE9PVNrLmV4ZWNMaW1pdCYmKGErPVwiaWYgKCRkYXRlTm93IC0gU2suZXhlY1N0YXJ0ID4gU2suZXhlY0xpbWl0KSB7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVGltZUxpbWl0RXJyb3IoU2sudGltZW91dE1zZygpKX1cIiksbnVsbCE9PVNrLnlpZWxkTGltaXQmJnRoaXMudS5jYW5TdXNwZW5kJiYoYT1hK1wiaWYgKCRkYXRlTm93IC0gU2subGFzdFlpZWxkID4gU2sueWllbGRMaW1pdCkge1wiKyhcInZhciAkc3VzcCA9ICRzYXZlU3VzcGVuc2lvbih7ZGF0YToge3R5cGU6ICdTay55aWVsZCd9LCByZXN1bWU6IGZ1bmN0aW9uKCkge319LCAnXCIrdGhpcy5maWxlbmFtZStcIicsJGN1cnJMaW5lTm8sJGN1cnJDb2xObyk7XCIpLGErPVwiJHN1c3AuJGJsayA9ICRibGs7JHN1c3Aub3B0aW9uYWwgPSB0cnVlO3JldHVybiAkc3VzcDt9XCIsXG50aGlzLnUuZG9lc1N1c3BlbmQ9ITApO3JldHVybiBhfTthLnByb3RvdHlwZS5fanVtcGZhbHNlPWZ1bmN0aW9uKGEsYil7YT10aGlzLl9ncihcImpmYWxzZVwiLFwiKFwiLGEsXCI9PT1mYWxzZXx8IVNrLm1pc2NldmFsLmlzVHJ1ZShcIixhLFwiKSlcIik7bChcImlmKFwiLGEsXCIpey8qdGVzdCBmYWlsZWQgKi8kYmxrPVwiLGIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXB1bmRlZj1mdW5jdGlvbihhLGIpe2woXCJpZihcIixhLFwiPT09dW5kZWZpbmVkKXskYmxrPVwiLGIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXBub3R1bmRlZj1mdW5jdGlvbihhLGIpe2woXCJpZihcIixhLFwiIT09dW5kZWZpbmVkKXskYmxrPVwiLGIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXB0cnVlPWZ1bmN0aW9uKGEsYil7YT10aGlzLl9ncihcImp0cnVlXCIsXCIoXCIsYSxcIj09PXRydWV8fFNrLm1pc2NldmFsLmlzVHJ1ZShcIixhLFwiKSlcIik7bChcImlmKFwiLGEsXCIpey8qdGVzdCBwYXNzZWQgKi8kYmxrPVwiLFxuYixcIjtjb250aW51ZTt9XCIpfTthLnByb3RvdHlwZS5fanVtcD1mdW5jdGlvbihhKXtudWxsPT09dGhpcy51LmJsb2Nrc1t0aGlzLnUuY3VyYmxvY2tdLl9uZXh0JiYobChcIiRibGs9XCIsYSxcIjtcIiksdGhpcy51LmJsb2Nrc1t0aGlzLnUuY3VyYmxvY2tdLl9uZXh0PWEpfTthLnByb3RvdHlwZS5fY2hlY2tTdXNwZW5zaW9uPWZ1bmN0aW9uKGEpe2lmKHRoaXMudS5jYW5TdXNwZW5kKXt2YXIgYj10aGlzLm5ld0Jsb2NrKFwiZnVuY3Rpb24gcmV0dXJuIG9yIHJlc3VtZSBzdXNwZW5zaW9uXCIpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTthPWF8fHtsaW5lbm86XCIkY3VyckxpbmVOb1wiLGNvbF9vZmZzZXQ6XCIkY3VyckNvbE5vXCJ9O2woXCJpZiAoJHJldCAmJiAkcmV0LiRpc1N1c3BlbnNpb24pIHsgcmV0dXJuICRzYXZlU3VzcGVuc2lvbigkcmV0LCdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpOyB9XCIpO3RoaXMudS5kb2VzU3VzcGVuZD0hMDtcbnRoaXMudS50ZW1wc1RvU2F2ZT10aGlzLnUudGVtcHNUb1NhdmUuY29uY2F0KHRoaXMudS5sb2NhbHRlbXBzKX1lbHNlIGwoXCJpZiAoJHJldCAmJiAkcmV0LiRpc1N1c3BlbnNpb24pIHsgJHJldCA9IFNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdygkcmV0KTsgfVwiKX07YS5wcm90b3R5cGUuY3VucGFja3N0YXJzdG9hcnJheT1mdW5jdGlvbihhLGIpe2lmKCFhfHwwPT1hLmxlbmd0aClyZXR1cm5cIltdXCI7bGV0IGM9ITE7Zm9yKGxldCBkIG9mIGEpe2lmKGImJmMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJFeHRlbmRlZCBhcmd1bWVudCB1bnBhY2tpbmcgaXMgbm90IHBlcm1pdHRlZCBpbiBQeXRob24gMlwiKTtkLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZCYmKGM9ITApfWlmKGMpe2I9dGhpcy5fZ3IoXCJ1bnBhY2tcIixcIltdXCIpO2ZvcihsZXQgYyBvZiBhKWMuY29uc3RydWN0b3IhPT1Tay5hc3Rub2Rlcy5TdGFycmVkP2woYixcblwiLnB1c2goXCIsdGhpcy52ZXhwcihjKSxcIik7XCIpOihsKFwiJHJldCA9IFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihcIix0aGlzLnZleHByKGMudmFsdWUpLFwiKSwgZnVuY3Rpb24oZSkgeyBcIixiLFwiLnB1c2goZSk7IH0pO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKSk7cmV0dXJuIGJ9cmV0dXJuXCJbXCIrYS5tYXAoYT0+dGhpcy52ZXhwcihhKSkuam9pbihcIixcIikrXCJdXCJ9O2EucHJvdG90eXBlLmN0dXBsZWxpc3RvcnNldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7U2suYXNzZXJ0cy5hc3NlcnQoXCJ0dXBsZVwiPT09Y3x8XCJsaXN0XCI9PT1jfHxcInNldFwiPT09Yyk7dmFyIGU9ITE7Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7ZCsrKWlmKGEuZWx0c1tkXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0YXJyZWQpe2U9ITA7dmFyIGY9ZDticmVha31pZihhLmN0eD09PVNrLmFzdG5vZGVzLlN0b3JlKXtpZihlKXtpZighU2suX19mdXR1cmVfXy5weXRob24zKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXNzaWdubWVudCB1bnBhY2tpbmcgd2l0aCBzdGFycyBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIsXG50aGlzLmZpbGVuYW1lLGEubGluZW5vKTtmb3IoZD1mKzE7ZDxhLmVsdHMubGVuZ3RoO2QrKylpZihhLmVsdHNbZF0uY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibXVsdGlwbGUgc3RhcnJlZCBleHByZXNzaW9ucyBpbiBhc3NpZ25tZW50XCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7fWM9ZT9mOmEuZWx0cy5sZW5ndGg7bChcIiRyZXQgPSBTay5hYnN0ci5zZXF1ZW5jZVVucGFjayhcIitiK1wiLFwiK2MrXCIsXCIrKGU/YS5lbHRzLmxlbmd0aC0xOmMpK1wiLCBcIitlK1wiKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKCk7Yj10aGlzLl9ncihcIml0ZW1zXCIsXCIkcmV0XCIpO2ZvcihkPTA7ZDxhLmVsdHMubGVuZ3RoOysrZClkPT09Zj90aGlzLnZleHByKGEuZWx0c1tkXS52YWx1ZSxiK1wiW1wiK2QrXCJdXCIpOnRoaXMudmV4cHIoYS5lbHRzW2RdLGIrXCJbXCIrZCtcIl1cIil9ZWxzZSBpZihhLmN0eD09PVNrLmFzdG5vZGVzLkxvYWR8fFwic2V0XCI9PT1cbmMpe2lmKGUpe2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJMaXN0IHBhY2tpbmcgd2l0aCBzdGFycyBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO3JldHVybiB0aGlzLl9ncihcImxvYWRcIitjLFwibmV3IFNrLmJ1aWx0aW5zWydcIixjLFwiJ10oXCIsdGhpcy5jdW5wYWNrc3RhcnN0b2FycmF5KGEuZWx0cyksXCIpXCIpfWlmKFwidHVwbGVcIj09PWMpe2U9ITA7Yj1bXTtmb3IoZD0wO2Q8YS5lbHRzLmxlbmd0aDsrK2QpZj10aGlzLnZleHByKGEuZWx0c1tkXSksZSYmLTE9PWYuaW5kZXhPZihcIiRjb25zdFwiKSYmKGU9ITEpLGIucHVzaChmKTtpZihlKXJldHVybiB0aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLnR1cGxlKFtcIitiK1wiXSlcIik7Zm9yKGQ9MDtkPGIubGVuZ3RoOysrZCliW2RdPXRoaXMuX2dyKFwiZWxlbVwiLGJbZF0pO3JldHVybiB0aGlzLl9ncihcImxvYWRcIitjLFwibmV3IFNrLmJ1aWx0aW5zWydcIixjLFwiJ10oW1wiLFxuYixcIl0pXCIpfWI9W107Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7KytkKWIucHVzaCh0aGlzLl9ncihcImVsZW1cIix0aGlzLnZleHByKGEuZWx0c1tkXSkpKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFtcIixiLFwiXSlcIil9fTthLnByb3RvdHlwZS5jZGljdD1mdW5jdGlvbihhKXt2YXIgYjt2YXIgYz1bXTtpZihudWxsIT09YS5rZXlzKWZvcihTay5hc3NlcnRzLmFzc2VydChhLnZhbHVlcy5sZW5ndGg9PT1hLmtleXMubGVuZ3RoKSxiPTA7YjxhLnZhbHVlcy5sZW5ndGg7KytiKXt2YXIgZD10aGlzLnZleHByKGEudmFsdWVzW2JdKTtjLnB1c2godGhpcy52ZXhwcihhLmtleXNbYl0pKTtjLnB1c2goZCl9cmV0dXJuIHRoaXMuX2dyKFwibG9hZGRpY3RcIixcIm5ldyBTay5idWlsdGluc1snZGljdCddKFtcIixjLFwiXSlcIil9O2EucHJvdG90eXBlLmNsaXN0Y29tcD1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuTGlzdENvbXApO1xudmFyIGI9dGhpcy5fZ3IoXCJfY29tcHJcIixcIm5ldyBTay5idWlsdGluc1snbGlzdCddKFtdKVwiKTtyZXR1cm4gdGhpcy5jY29tcGdlbihcImxpc3RcIixiLGEuZ2VuZXJhdG9ycywwLGEuZWx0LG51bGwsYSl9O2EucHJvdG90eXBlLmNkaWN0Y29tcD1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuRGljdENvbXApO3ZhciBiPXRoaXMuX2dyKFwiX2Rjb21wclwiLFwibmV3IFNrLmJ1aWx0aW5zLmRpY3QoW10pXCIpO3JldHVybiB0aGlzLmNjb21wZ2VuKFwiZGljdFwiLGIsYS5nZW5lcmF0b3JzLDAsYS52YWx1ZSxhLmtleSxhKX07YS5wcm90b3R5cGUuY3NldGNvbXA9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLlNldENvbXApO3ZhciBiPXRoaXMuX2dyKFwiX3NldGNvbXByXCIsXCJuZXcgU2suYnVpbHRpbnMuc2V0KFtdKVwiKTtyZXR1cm4gdGhpcy5jY29tcGdlbihcInNldFwiLGIsYS5nZW5lcmF0b3JzLDAsXG5hLmVsdCxudWxsLGEpfTthLnByb3RvdHlwZS5jY29tcGdlbj1mdW5jdGlvbihhLGIsYyxlLGYsaCxtKXt2YXIgZD10aGlzLm5ld0Jsb2NrKGErXCIgY29tcCBzdGFydFwiKSxnPXRoaXMubmV3QmxvY2soYStcIiBjb21wIHNraXBcIiksaz10aGlzLm5ld0Jsb2NrKGErXCIgY29tcCBhbmNob3JcIiksbj1jW2VdLHA9dGhpcy52ZXhwcihuLml0ZXIpO3A9dGhpcy5fZ3IoXCJpdGVyXCIsXCJTay5hYnN0ci5pdGVyKFwiLHAsXCIpXCIpO3ZhciBxO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhkKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLHAsXCIsIHRydWUpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24obSk7cD10aGlzLl9ncihcIm5leHRcIixcIiRyZXRcIik7dGhpcy5fanVtcHVuZGVmKHAsayk7dGhpcy52ZXhwcihuLnRhcmdldCxwKTt2YXIgdT1uLmlmcz9uLmlmcy5sZW5ndGg6MDtmb3IocT0wO3E8dTsrK3EpcD10aGlzLnZleHByKG4uaWZzW3FdKSx0aGlzLl9qdW1wZmFsc2UocCxkKTsrK2U8Yy5sZW5ndGgmJlxudGhpcy5jY29tcGdlbihhLGIsYyxlLGYsaCxtKTtlPj1jLmxlbmd0aCYmKGM9dGhpcy52ZXhwcihmKSxcImRpY3RcIj09PWE/KGE9dGhpcy52ZXhwcihoKSxsKGIsXCIubXAkYXNzX3N1YnNjcmlwdChcIixhLFwiLFwiLGMsXCIpO1wiKSk6XCJsaXN0XCI9PT1hP2woYixcIi52LnB1c2goXCIsYyxcIik7XCIpOlwic2V0XCI9PT1hJiZsKGIsXCIudi5tcCRhc3Nfc3Vic2NyaXB0KFwiLGMsXCIsIHRydWUpO1wiKSx0aGlzLl9qdW1wKGcpLHRoaXMuc2V0QmxvY2soZykpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhrKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY3lpZWxkPWZ1bmN0aW9uKGEpe2lmKHRoaXMudS5zdGUuYmxvY2tUeXBlIT09U2suU1lNVEFCX0NPTlNUUy5GdW5jdGlvbkJsb2NrKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiJ3lpZWxkJyBvdXRzaWRlIGZ1bmN0aW9uXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7dmFyIGI9XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjthLnZhbHVlJiYoYj10aGlzLnZleHByKGEudmFsdWUpKTtcbmE9dGhpcy5uZXdCbG9jayhcImFmdGVyIHlpZWxkXCIpO2woXCJyZXR1cm4gWy8qcmVzdW1lKi9cIixhLFwiLC8qcmV0Ki9cIixiLFwiXTtcIik7dGhpcy5zZXRCbG9jayhhKTtyZXR1cm5cIiRnZW4uZ2kkc2VudHZhbHVlXCJ9O2EucHJvdG90eXBlLmNjb21wYXJlPWZ1bmN0aW9uKGEpe3ZhciBiO1NrLmFzc2VydHMuYXNzZXJ0KGEub3BzLmxlbmd0aD09PWEuY29tcGFyYXRvcnMubGVuZ3RoKTt2YXIgYz10aGlzLnZleHByKGEubGVmdCk7dmFyIGQ9YS5vcHMubGVuZ3RoO3ZhciBlPXRoaXMubmV3QmxvY2soXCJkb25lXCIpO3ZhciBmPXRoaXMuX2dyKFwiY29tcGFyZXJlc1wiLFwibnVsbFwiKTtmb3IoYj0wO2I8ZDsrK2Ipe3ZhciBoPXRoaXMudmV4cHIoYS5jb21wYXJhdG9yc1tiXSk7bChcIiRyZXQgPSBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKFwiLGMsXCIsXCIsaCxcIiwnXCIsYS5vcHNbYl0ucHJvdG90eXBlLl9hc3RuYW1lLFwiJywgdHJ1ZSkpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7XG5sKGYsXCI9JHJldDtcIik7dGhpcy5fanVtcGZhbHNlKFwiJHJldFwiLGUpO2M9aH10aGlzLl9qdW1wKGUpO3RoaXMuc2V0QmxvY2soZSk7cmV0dXJuIGZ9O2EucHJvdG90eXBlLmNjYWxsPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmV4cHIoYS5mdW5jKTtsZXQgYz10aGlzLmN1bnBhY2tzdGFyc3RvYXJyYXkoYS5hcmdzLCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpO3ZhciBkPVwidW5kZWZpbmVkXCI7aWYoYS5rZXl3b3JkcyYmMDxhLmtleXdvcmRzLmxlbmd0aCl7bGV0IGM9ITE7ZD1bXTtmb3IobGV0IGIgb2YgYS5rZXl3b3Jkcyl7aWYoYyYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJBZHZhbmNlZCB1bnBhY2tpbmcgb2YgZnVuY3Rpb24gYXJndW1lbnRzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDJcIik7Yi5hcmc/KGQucHVzaChcIidcIitiLmFyZy52K1wiJ1wiKSxkLnB1c2godGhpcy52ZXhwcihiLnZhbHVlKSkpOmM9ITB9ZD1cIltcIitkLmpvaW4oXCIsXCIpK1xuXCJdXCI7aWYoYyl7ZD10aGlzLl9ncihcImtleXdvcmRBcmdzXCIsZCk7Zm9yKGxldCBjIG9mIGEua2V5d29yZHMpYy5hcmd8fChsKFwiJHJldCA9IFNrLmFic3RyLm1hcHBpbmdVbnBhY2tJbnRvS2V5d29yZEFycmF5KFwiLGQsXCIsXCIsdGhpcy52ZXhwcihjLnZhbHVlKSxcIixcIixiLFwiKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCkpfX1Tay5fX2Z1dHVyZV9fLnN1cGVyX2FyZ3MmJmEuZnVuYy5pZCYmXCJzdXBlclwiPT09YS5mdW5jLmlkLnYmJlwiW11cIj09PWMmJihsKCdpZiAodHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgfHwgc2VsZi50b1N0cmluZygpLmluZGV4T2YoXCJXaW5kb3dcIikgPiAwKSB7IHRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInN1cGVyKCk6IG5vIGFyZ3VtZW50c1wiKSB9OycpLGM9XCJbJGdibC5fX2NsYXNzX18sc2VsZl1cIik7bChcIiRyZXQgPSAoXCIsYixcIi50cCRjYWxsKT9cIixiLFwiLnRwJGNhbGwoXCIsYyxcIixcIixkLFwiKSA6IFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKFwiLFxuYixcIix1bmRlZmluZWQsdW5kZWZpbmVkLFwiLGQsXCIsXCIsYyxcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtyZXR1cm4gdGhpcy5fZ3IoXCJjYWxsXCIsXCIkcmV0XCIpfTthLnByb3RvdHlwZS5jc2xpY2U9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLlNsaWNlKTtpZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe3ZhciBiPWEubG93ZXI/dGhpcy52ZXhwcihhLmxvd2VyKTpcIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiO3ZhciBjPWEudXBwZXI/dGhpcy52ZXhwcihhLnVwcGVyKTpcIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwifWVsc2UgYj1hLmxvd2VyP3RoaXMudmV4cHIoYS5sb3dlcik6YS5zdGVwP1wiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI6XCJuZXcgU2suYnVpbHRpbi5pbnRfKDApXCIsYz1hLnVwcGVyP3RoaXMudmV4cHIoYS51cHBlcik6YS5zdGVwP1wiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI6XCJuZXcgU2suYnVpbHRpbi5pbnRfKDIxNDc0ODM2NDcpXCI7XG5hPWEuc3RlcD90aGlzLnZleHByKGEuc3RlcCk6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjtyZXR1cm4gdGhpcy5fZ3IoXCJzbGljZVwiLFwibmV3IFNrLmJ1aWx0aW5zWydzbGljZSddKFwiLGIsXCIsXCIsYyxcIixcIixhLFwiKVwiKX07YS5wcm90b3R5cGUuZXNsaWNlPWZ1bmN0aW9uKGEpe3ZhciBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBBcnJheSk7dmFyIGM9W107Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2godGhpcy52c2xpY2VzdWIoYVtiXSkpO3JldHVybiB0aGlzLl9ncihcImV4dHNsaWNlXCIsXCJuZXcgU2suYnVpbHRpbnNbJ3R1cGxlJ10oW1wiLGMsXCJdKVwiKX07YS5wcm90b3R5cGUudnNsaWNlc3ViPWZ1bmN0aW9uKGEpe3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkluZGV4OnZhciBiPXRoaXMudmV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TbGljZTpiPXRoaXMuY3NsaWNlKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRWxsaXBzaXM6U2suYXNzZXJ0cy5mYWlsKFwidG9kbyBjb21waWxlLmpzIEVsbGlwc2lzO1wiKTtcbmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRXh0U2xpY2U6Yj10aGlzLmVzbGljZShhLmRpbXMpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBzdWJzY3JpcHQga2luZFwiKX1yZXR1cm4gYn07YS5wcm90b3R5cGUudnNsaWNlPWZ1bmN0aW9uKGEsYixjLGUpe2E9dGhpcy52c2xpY2VzdWIoYSk7cmV0dXJuIHRoaXMuY2hhbmRsZXN1YnNjcihiLGMsYSxlKX07YS5wcm90b3R5cGUuY2hhbmRsZXN1YnNjcj1mdW5jdGlvbihhLGIsYyxlKXtpZihhPT09U2suYXN0bm9kZXMuTG9hZHx8YT09PVNrLmFzdG5vZGVzLkF1Z0xvYWQpcmV0dXJuIGwoXCIkcmV0ID0gU2suYWJzdHIub2JqZWN0R2V0SXRlbShcIixiLFwiLFwiLGMsXCIsIHRydWUpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKSx0aGlzLl9ncihcImxzdWJzY3JcIixcIiRyZXRcIik7YT09PVNrLmFzdG5vZGVzLlN0b3JlfHxhPT09U2suYXN0bm9kZXMuQXVnU3RvcmU/KGwoXCIkcmV0ID0gU2suYWJzdHIub2JqZWN0U2V0SXRlbShcIixcbmIsXCIsXCIsYyxcIixcIixlLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCkpOmE9PT1Tay5hc3Rub2Rlcy5EZWw/bChcIlNrLmFic3RyLm9iamVjdERlbEl0ZW0oXCIsYixcIixcIixjLFwiKTtcIik6U2suYXNzZXJ0cy5mYWlsKFwiaGFuZGxlc3Vic2NyIGZhaWxcIil9O2EucHJvdG90eXBlLmNib29sb3A9ZnVuY3Rpb24oYSl7dmFyIGIsYztTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuQm9vbE9wKTt2YXIgZD1hLm9wPT09U2suYXN0bm9kZXMuQW5kP3RoaXMuX2p1bXBmYWxzZTp0aGlzLl9qdW1wdHJ1ZTt2YXIgZT10aGlzLm5ld0Jsb2NrKFwiZW5kIG9mIGJvb2xvcFwiKTt2YXIgZj1hLnZhbHVlczt2YXIgaD1mLmxlbmd0aDtmb3IoYj0wO2I8aDsrK2IpYT10aGlzLnZleHByKGZbYl0pLDA9PT1iJiYoYz10aGlzLl9ncihcImJvb2xvcHN1Y2NcIixhKSksbChjLFwiPVwiLGEsXCI7XCIpLGQuY2FsbCh0aGlzLGEsZSk7dGhpcy5fanVtcChlKTt0aGlzLnNldEJsb2NrKGUpO1xucmV0dXJuIGN9O2EucHJvdG90eXBlLmNqb2luZWRzdHI9ZnVuY3Rpb24oYSl7bGV0IGI7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkpvaW5lZFN0cik7Zm9yKGxldCBjIG9mIGEudmFsdWVzKWE9dGhpcy52ZXhwcihjKSxiP2woYixcIj1cIixiLFwiLnNxJGNvbmNhdChcIixhLFwiKTtcIik6Yj10aGlzLl9ncihcImpvaW5lZHN0clwiLGEpO2J8fChiPVwiU2suYnVpbHRpbi5zdHIuJGVtcHR5c3RyXCIpO3JldHVybiBifTthLnByb3RvdHlwZS5jZm9ybWF0dGVkdmFsdWU9ZnVuY3Rpb24oYSl7bGV0IGI9dGhpcy52ZXhwcihhLnZhbHVlKTtzd2l0Y2goYS5jb252ZXJzaW9uKXtjYXNlIFwic1wiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwibmV3IFNrLmJ1aWx0aW4uc3RyKFwiLGIsXCIpXCIpO2JyZWFrO2Nhc2UgXCJhXCI6Yj10aGlzLl9ncihcInZhbHVlXCIsXCJTay5idWlsdGluLmFzY2lpKFwiLGIsXCIpXCIpO2JyZWFrO2Nhc2UgXCJyXCI6Yj10aGlzLl9ncihcInZhbHVlXCIsXCJTay5idWlsdGluLnJlcHIoXCIsXG5iLFwiKVwiKX1hPWEuZm9ybWF0X3NwZWM/dGhpcy52ZXhwcihhLmZvcm1hdF9zcGVjKTpcIlNrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0clwiO3JldHVybiB0aGlzLl9ncihcImZvcm1hdHRlZFwiLFwiU2suYWJzdHIub2JqZWN0Rm9ybWF0KFwiK2IrXCIsXCIrYStcIilcIil9O2EucHJvdG90eXBlLnZleHByPWZ1bmN0aW9uKGEsYixjLGspe3ZhciBkO2EubGluZW5vPnRoaXMudS5saW5lbm8mJih0aGlzLnUubGluZW5vPWEubGluZW5vLHRoaXMudS5saW5lbm9TZXQ9ITEpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDpyZXR1cm4gdGhpcy5jYm9vbG9wKGEpO2Nhc2UgU2suYXN0bm9kZXMuQmluT3A6cmV0dXJuIHRoaXMuX2dyKFwiYmlub3BcIixcIlNrLmFic3RyLm51bWJlckJpbk9wKFwiLHRoaXMudmV4cHIoYS5sZWZ0KSxcIixcIix0aGlzLnZleHByKGEucmlnaHQpLFwiLCdcIixhLm9wLnByb3RvdHlwZS5fYXN0bmFtZSxcIicpXCIpO2Nhc2UgU2suYXN0bm9kZXMuVW5hcnlPcDpyZXR1cm4gdGhpcy5fZ3IoXCJ1bmFyeW9wXCIsXG5cIlNrLmFic3RyLm51bWJlclVuYXJ5T3AoXCIsdGhpcy52ZXhwcihhLm9wZXJhbmQpLFwiLCdcIixhLm9wLnByb3RvdHlwZS5fYXN0bmFtZSxcIicpXCIpO2Nhc2UgU2suYXN0bm9kZXMuTGFtYmRhOnJldHVybiB0aGlzLmNsYW1iZGEoYSk7Y2FzZSBTay5hc3Rub2Rlcy5JZkV4cDpyZXR1cm4gdGhpcy5jaWZleHAoYSk7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0OnJldHVybiB0aGlzLmNkaWN0KGEpO2Nhc2UgU2suYXN0bm9kZXMuTGlzdENvbXA6cmV0dXJuIHRoaXMuY2xpc3Rjb21wKGEpO2Nhc2UgU2suYXN0bm9kZXMuRGljdENvbXA6cmV0dXJuIHRoaXMuY2RpY3Rjb21wKGEpO2Nhc2UgU2suYXN0bm9kZXMuU2V0Q29tcDpyZXR1cm4gdGhpcy5jc2V0Y29tcChhKTtjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDpyZXR1cm4gdGhpcy5jZ2VuZXhwKGEpO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6cmV0dXJuIHRoaXMuY3lpZWxkKGEpO2Nhc2UgU2suYXN0bm9kZXMuQ29tcGFyZTpyZXR1cm4gdGhpcy5jY29tcGFyZShhKTtcbmNhc2UgU2suYXN0bm9kZXMuQ2FsbDpyZXR1cm4gYj10aGlzLmNjYWxsKGEpLHRoaXMuYW5ub3RhdGVTb3VyY2UoYSksYjtjYXNlIFNrLmFzdG5vZGVzLk51bTppZihcIm51bWJlclwiPT09dHlwZW9mIGEubilyZXR1cm4gYS5uO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKXJldHVybiB0aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLmxuZygnXCIrYS5uLnYudG9TdHJpbmcoKStcIicpXCIpO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XylyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGEubi52P3RoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uaW50XyhcIithLm4uditcIilcIik6dGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5pbnRfKCdcIithLm4udi50b1N0cmluZygpK1wiJylcIik7aWYoYS5uIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGE9MD09PWEubi52JiYtSW5maW5pdHk9PT0xL2Eubi52P1wiLTBcIjphLm4udix0aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLmZsb2F0XyhcIitcbmErXCIpXCIpO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uY29tcGxleClyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5jb21wbGV4KFwiKygwPT09YS5uLnJlYWwmJi1JbmZpbml0eT09PTEvYS5uLnJlYWw/XCItMFwiOmEubi5yZWFsKStcIiwgXCIrKDA9PT1hLm4uaW1hZyYmLUluZmluaXR5PT09MS9hLm4uaW1hZz9cIi0wXCI6YS5uLmltYWcpK1wiKVwiKTtTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgTnVtIHR5cGVcIik7Y2FzZSBTay5hc3Rub2Rlcy5CeXRlczppZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2I9W107YT1hLnMuJGpzc3RyKCk7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYS5jaGFyQ29kZUF0KGMpKTtyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5ieXRlcyhbXCIsYi5qb2luKFwiLCBcIiksXCJdKVwiKX1jYXNlIFNrLmFzdG5vZGVzLlN0cjpyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5zdHIoXCIsXG5mKGEucy4kanNzdHIoKSksXCIpXCIpO2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOmEuY3R4IT09U2suYXN0bm9kZXMuQXVnTG9hZCYmYS5jdHghPT1Tay5hc3Rub2Rlcy5BdWdTdG9yZSYmKGQ9dGhpcy52ZXhwcihhLnZhbHVlKSk7az1hLmF0dHIuJHIoKS52O2s9ay5zdWJzdHJpbmcoMSxrLmxlbmd0aC0xKTtrPWUodGhpcy51LnByaXZhdGVfLG5ldyBTay5idWlsdGluLnN0cihrKSkudjtrPXRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uc3RyKCdcIitrK1wiJylcIik7c3dpdGNoKGEuY3R4KXtjYXNlIFNrLmFzdG5vZGVzLkF1Z0xvYWQ6cmV0dXJuIGwoXCIkcmV0ID0gXCIsYyxcIi50cCRnZXRhdHRyKFwiLGssXCIsIHRydWUpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oYSksbChcIlxcbmlmICgkcmV0ID09PSB1bmRlZmluZWQpIHtcIiksbChcIlxcbnRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiLGMsJy5zayRhdHRyRXJyb3IoKSArIFwiIGhhcyBubyBhdHRyaWJ1dGUgXFwnXCIgKyAnLFxuaywnLiRqc3N0cigpICsgXCJcXCdcIik7JyksbChcIlxcbn07XCIpLHRoaXMuX2dyKFwibGF0dHJcIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOnJldHVybiBsKFwiJHJldCA9IFwiLGQsXCIudHAkZ2V0YXR0cihcIixrLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpLGwoXCJcXG5pZiAoJHJldCA9PT0gdW5kZWZpbmVkKSB7XCIpLGwoXCJcXG50aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIixkLCcuc2skYXR0ckVycm9yKCkgKyBcIiBoYXMgbm8gYXR0cmlidXRlIFxcJ1wiICsgJyxrLCcuJGpzc3RyKCkgKyBcIlxcJ1wiKTsnKSxsKFwiXFxufTtcIiksdGhpcy5fZ3IoXCJsYXR0clwiLFwiJHJldFwiKTtjYXNlIFNrLmFzdG5vZGVzLkF1Z1N0b3JlOmwoXCIkcmV0ID0gdW5kZWZpbmVkO1wiKTtsKFwiaWYoXCIsYixcIiE9PXVuZGVmaW5lZCl7XCIpO2woXCIkcmV0ID0gXCIsYyxcIi50cCRzZXRhdHRyKFwiLGssXCIsXCIsYixcIiwgdHJ1ZSk7XCIpO2woXCJ9XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztcbmNhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChcIiRyZXQgPSBcIixkLFwiLnRwJHNldGF0dHIoXCIsayxcIixcIixiLFwiLCB0cnVlKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVsOmwoXCIkcmV0ID0gXCIsZCxcIi50cCRzZXRhdHRyKFwiLGssXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgYXR0cmlidXRlIGV4cHJlc3Npb25cIil9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6c3dpdGNoKGEuY3R4KXtjYXNlIFNrLmFzdG5vZGVzLkF1Z0xvYWQ6cmV0dXJuIGwoXCIkcmV0ID0gU2suYWJzdHIub2JqZWN0R2V0SXRlbShcIixjLFwiLFwiLGssXCIsIHRydWUpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oYSksdGhpcy5fZ3IoXCJnaXRlbVwiLFwiJHJldFwiKTtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTpjYXNlIFNrLmFzdG5vZGVzLkRlbDpyZXR1cm4gdGhpcy52c2xpY2UoYS5zbGljZSxcbmEuY3R4LHRoaXMudmV4cHIoYS52YWx1ZSksYik7Y2FzZSBTay5hc3Rub2Rlcy5BdWdTdG9yZTpsKFwiJHJldD11bmRlZmluZWQ7XCIpO2woXCJpZihcIixiLFwiIT09dW5kZWZpbmVkKXtcIik7bChcIiRyZXQ9U2suYWJzdHIub2JqZWN0U2V0SXRlbShcIixjLFwiLFwiLGssXCIsXCIsYixcIiwgdHJ1ZSlcIik7bChcIn1cIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBzdWJzY3JpcHQgZXhwcmVzc2lvblwiKX1icmVhaztjYXNlIFNrLmFzdG5vZGVzLk5hbWU6cmV0dXJuIHRoaXMubmFtZW9wKGEuaWQsYS5jdHgsYik7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6aWYoYS5jdHg9PT1Tay5hc3Rub2Rlcy5TdG9yZXx8YS5jdHg9PT1Tay5hc3Rub2Rlcy5BdWdTdG9yZXx8YS5jdHg9PT1Tay5hc3Rub2Rlcy5EZWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJjYW4gbm90IGFzc2lnbiB0byBhIGNvbnN0YW50IG5hbWVcIik7XG5zd2l0Y2goYS52YWx1ZSl7Y2FzZSBTay5idWlsdGluLm5vbmUubm9uZSQ6cmV0dXJuXCJTay5idWlsdGluLm5vbmUubm9uZSRcIjtjYXNlIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDpyZXR1cm5cIlNrLmJ1aWx0aW4uYm9vbC50cnVlJFwiO2Nhc2UgU2suYnVpbHRpbi5ib29sLmZhbHNlJDpyZXR1cm5cIlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSRcIjtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgbmFtZWQgY29uc3RhbnRcIil9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0OnJldHVybiB0aGlzLmN0dXBsZWxpc3RvcnNldChhLGIsXCJsaXN0XCIpO2Nhc2UgU2suYXN0bm9kZXMuVHVwbGU6cmV0dXJuIHRoaXMuY3R1cGxlbGlzdG9yc2V0KGEsYixcInR1cGxlXCIpO2Nhc2UgU2suYXN0bm9kZXMuU2V0OnJldHVybiB0aGlzLmN0dXBsZWxpc3RvcnNldChhLGIsXCJzZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5TdGFycmVkOnN3aXRjaChhLmN0eCl7Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInN0YXJyZWQgYXNzaWdubWVudCB0YXJnZXQgbXVzdCBiZSBpbiBhIGxpc3Qgb3IgdHVwbGVcIixcbnRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJjYW4ndCB1c2Ugc3RhcnJlZCBleHByZXNzaW9uIGhlcmVcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTt9Y2FzZSBTay5hc3Rub2Rlcy5Kb2luZWRTdHI6cmV0dXJuIHRoaXMuY2pvaW5lZHN0cihhKTtjYXNlIFNrLmFzdG5vZGVzLkZvcm1hdHRlZFZhbHVlOnJldHVybiB0aGlzLmNmb3JtYXR0ZWR2YWx1ZShhKTtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlIFwiK2EuY29uc3RydWN0b3IubmFtZStcIiB2ZXhwclwiKX19O2EucHJvdG90eXBlLnZzZXFleHByPWZ1bmN0aW9uKGEsYil7dmFyIGM7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwPT09Ynx8YS5sZW5ndGg9PT1iLmxlbmd0aCk7dmFyIGQ9W107Zm9yKGM9MDtjPGEubGVuZ3RoOysrYylkLnB1c2godGhpcy52ZXhwcihhW2NdLHZvaWQgMD09PWI/dm9pZCAwOmJbY10pKTtyZXR1cm4gZH07YS5wcm90b3R5cGUuY2F1Z2Fzc2lnbj1cbmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5BdWdBc3NpZ24pO3ZhciBiPWEudGFyZ2V0O3N3aXRjaChiLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTp2YXIgYz10aGlzLnZleHByKGIudmFsdWUpO2I9bmV3IFNrLmFzdG5vZGVzLkF0dHJpYnV0ZShiLnZhbHVlLGIuYXR0cixTay5hc3Rub2Rlcy5BdWdMb2FkLGIubGluZW5vLGIuY29sX29mZnNldCk7dmFyIGQ9dGhpcy52ZXhwcihiLHZvaWQgMCxjKTt2YXIgZT10aGlzLnZleHByKGEudmFsdWUpO2E9dGhpcy5fZ3IoXCJpbnBsYmlub3BhdHRyXCIsXCJTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoXCIsZCxcIixcIixlLFwiLCdcIixhLm9wLnByb3RvdHlwZS5fYXN0bmFtZSxcIicpXCIpO2IuY3R4PVNrLmFzdG5vZGVzLkF1Z1N0b3JlO3JldHVybiB0aGlzLnZleHByKGIsYSxjKTtjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDpjPXRoaXMudmV4cHIoYi52YWx1ZSk7dmFyIGY9XG50aGlzLnZzbGljZXN1YihiLnNsaWNlKTtiPW5ldyBTay5hc3Rub2Rlcy5TdWJzY3JpcHQoYi52YWx1ZSxmLFNrLmFzdG5vZGVzLkF1Z0xvYWQsYi5saW5lbm8sYi5jb2xfb2Zmc2V0KTtkPXRoaXMudmV4cHIoYix2b2lkIDAsYyxmKTtlPXRoaXMudmV4cHIoYS52YWx1ZSk7YT10aGlzLl9ncihcImlucGxiaW5vcHN1YnNjclwiLFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKFwiLGQsXCIsXCIsZSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtiLmN0eD1Tay5hc3Rub2Rlcy5BdWdTdG9yZTtyZXR1cm4gdGhpcy52ZXhwcihiLGEsYyxmKTtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6cmV0dXJuIGM9dGhpcy5uYW1lb3AoYi5pZCxTay5hc3Rub2Rlcy5Mb2FkKSxlPXRoaXMudmV4cHIoYS52YWx1ZSksYT10aGlzLl9ncihcImlucGxiaW5vcFwiLFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKFwiLGMsXCIsXCIsZSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKSx0aGlzLm5hbWVvcChiLmlkLFxuU2suYXN0bm9kZXMuU3RvcmUsYSk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBpbiBhdWdhc3NpZ25cIil9fTthLnByb3RvdHlwZS5leHByQ29uc3RhbnQ9ZnVuY3Rpb24oYSl7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuTnVtOnJldHVybiBTay5taXNjZXZhbC5pc1RydWUoYS5uKT8xOjA7Y2FzZSBTay5hc3Rub2Rlcy5TdHI6cmV0dXJuIFNrLm1pc2NldmFsLmlzVHJ1ZShhLnMpPzE6MDtkZWZhdWx0OnJldHVybi0xfX07YS5wcm90b3R5cGUubmV3QmxvY2s9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy51LmJsb2NrbnVtKys7dGhpcy51LmJsb2Nrc1tiXT1bXTt0aGlzLnUuYmxvY2tzW2JdLl9uYW1lPWF8fFwiPHVubmFtZWQ+XCI7dGhpcy51LmJsb2Nrc1tiXS5fbmV4dD1udWxsO3JldHVybiBifTthLnByb3RvdHlwZS5zZXRCbG9jaz1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgwPD1hJiZhPHRoaXMudS5ibG9ja251bSk7dGhpcy51LmN1cmJsb2NrPVxuYX07YS5wcm90b3R5cGUucHVzaEJyZWFrQmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5icmVha0Jsb2Nrcy5wdXNoKGEpfTthLnByb3RvdHlwZS5wb3BCcmVha0Jsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmJyZWFrQmxvY2tzLnBvcCgpfTthLnByb3RvdHlwZS5wdXNoQ29udGludWVCbG9jaz1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgwPD1hJiZhPHRoaXMudS5ibG9ja251bSk7dGhpcy51LmNvbnRpbnVlQmxvY2tzLnB1c2goYSl9O2EucHJvdG90eXBlLnBvcENvbnRpbnVlQmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnUuY29udGludWVCbG9ja3MucG9wKCl9O2EucHJvdG90eXBlLnB1c2hFeGNlcHRCbG9jaz1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgwPD1hJiZhPHRoaXMudS5ibG9ja251bSk7dGhpcy51LmV4Y2VwdEJsb2Nrcy5wdXNoKGEpfTthLnByb3RvdHlwZS5wb3BFeGNlcHRCbG9jaz1mdW5jdGlvbigpe3RoaXMudS5leGNlcHRCbG9ja3MucG9wKCl9O1xuYS5wcm90b3R5cGUucHVzaEZpbmFsbHlCbG9jaz1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgwPD1hJiZhPHRoaXMudS5ibG9ja251bSk7U2suYXNzZXJ0cy5hc3NlcnQodGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aD09PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgpO3RoaXMudS5maW5hbGx5QmxvY2tzLnB1c2goe2JsazphLGJyZWFrRGVwdGg6dGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aH0pfTthLnByb3RvdHlwZS5wb3BGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnUuZmluYWxseUJsb2Nrcy5wb3AoKX07YS5wcm90b3R5cGUucGVla0ZpbmFsbHlCbG9jaz1mdW5jdGlvbigpe3JldHVybiAwPHRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aD90aGlzLnUuZmluYWxseUJsb2Nrc1t0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGgtMV06dm9pZCAwfTthLnByb3RvdHlwZS5zZXR1cEV4Y2VwdD1mdW5jdGlvbihhKXtsKFwiJGV4Yy5wdXNoKFwiLGEsXCIpO1wiKX07YS5wcm90b3R5cGUuZW5kRXhjZXB0PVxuZnVuY3Rpb24oKXtsKFwiJGV4Yy5wb3AoKTtcIil9O2EucHJvdG90eXBlLm91dHB1dExvY2Fscz1mdW5jdGlvbihhKXt2YXIgYixjPXt9O2ZvcihiPTA7YS5hcmduYW1lcyYmYjxhLmFyZ25hbWVzLmxlbmd0aDsrK2IpY1thLmFyZ25hbWVzW2JdXT0hMDthLmxvY2FsbmFtZXMuc29ydCgpO3ZhciBkPVtdO2ZvcihiPTA7YjxhLmxvY2FsbmFtZXMubGVuZ3RoOysrYil7dmFyIGU9YS5sb2NhbG5hbWVzW2JdO3ZvaWQgMD09PWNbZV0mJihkLnB1c2goZSksY1tlXT0hMCl9cmV0dXJuIDA8ZC5sZW5ndGg/XCJ2YXIgXCIrZC5qb2luKFwiLFwiKStcIjsgLyogbG9jYWxzICovXCI6XCJcIn07YS5wcm90b3R5cGUub3V0cHV0U3VzcGVuc2lvbkhlbHBlcnM9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPWEubG9jYWxuYW1lcy5jb25jYXQoYS50ZW1wc1RvU2F2ZSksZT17fSxmPWEuc3RlLmJsb2NrVHlwZT09PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayYmYS5zdGUuY2hpbGRIYXNGcmVlLGg9KDA8ZC5sZW5ndGg/XG5cInZhciBcIitkLmpvaW4oXCIsXCIpK1wiO1wiOlwiXCIpK1widmFyICR3YWtlRnJvbVN1c3BlbnNpb24gPSBmdW5jdGlvbigpIHt2YXIgc3VzcCA9IFwiK2Euc2NvcGVuYW1lK1wiLiR3YWtpbmdTdXNwZW5zaW9uOyBcIithLnNjb3BlbmFtZStcIi4kd2FraW5nU3VzcGVuc2lvbiA9IHVuZGVmaW5lZDskYmxrPXN1c3AuJGJsazsgJGxvYz1zdXNwLiRsb2M7ICRnYmw9c3VzcC4kZ2JsOyAkZXhjPXN1c3AuJGV4YzsgJGVycj1zdXNwLiRlcnI7ICRwb3N0ZmluYWxseT1zdXNwLiRwb3N0ZmluYWxseTskY3VyckxpbmVObz1zdXNwLiRsaW5lbm87ICRjdXJyQ29sTm89c3VzcC4kY29sbm87IFNrLmxhc3RZaWVsZD1EYXRlLm5vdygpO1wiKyhmP1wiJGNlbGw9c3VzcC4kY2VsbDtcIjpcIlwiKTtmb3IoYj0wO2I8ZC5sZW5ndGg7YisrKXt2YXIgbD1kW2JdO3ZvaWQgMD09PWVbbF0mJihoKz1sK1wiPXN1c3AuJHRtcHMuXCIrbCtcIjtcIixlW2xdPSEwKX1oKz1cInRyeSB7ICRyZXQ9c3VzcC5jaGlsZC5yZXN1bWUoKTsgfSBjYXRjaChlcnIpIHsgaWYgKCEoZXJyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uKSkgeyBlcnIgPSBuZXcgU2suYnVpbHRpbi5FeHRlcm5hbEVycm9yKGVycik7IH0gZXJyLnRyYWNlYmFjay5wdXNoKHtsaW5lbm86ICRjdXJyTGluZU5vLCBjb2xubzogJGN1cnJDb2xObywgZmlsZW5hbWU6ICdcIitcbnRoaXMuZmlsZW5hbWUrXCInfSk7IGlmKCRleGMubGVuZ3RoPjApIHsgJGVycj1lcnI7ICRibGs9JGV4Yy5wb3AoKTsgfSBlbHNlIHsgdGhyb3cgZXJyOyB9IH19O1wiO2grPVwidmFyICRzYXZlU3VzcGVuc2lvbiA9IGZ1bmN0aW9uKCRjaGlsZCwgJGZpbGVuYW1lLCAkbGluZW5vLCAkY29sbm8pIHt2YXIgc3VzcCA9IG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKCk7IHN1c3AuY2hpbGQ9JGNoaWxkO3N1c3AucmVzdW1lPWZ1bmN0aW9uKCl7XCIrYS5zY29wZW5hbWUrXCIuJHdha2luZ1N1c3BlbnNpb249c3VzcDsgcmV0dXJuIFwiK2Euc2NvcGVuYW1lK1wiKFwiKyhhLnN0ZS5nZW5lcmF0b3I/XCIkZ2VuXCI6XCJcIikrXCIpOyB9O3N1c3AuZGF0YT1zdXNwLmNoaWxkLmRhdGE7c3VzcC4kYmxrPSRibGs7c3VzcC4kbG9jPSRsb2M7c3VzcC4kZ2JsPSRnYmw7c3VzcC4kZXhjPSRleGM7c3VzcC4kZXJyPSRlcnI7c3VzcC4kcG9zdGZpbmFsbHk9JHBvc3RmaW5hbGx5O3N1c3AuJGZpbGVuYW1lPSRmaWxlbmFtZTtzdXNwLiRsaW5lbm89JGxpbmVubztzdXNwLiRjb2xubz0kY29sbm87c3VzcC5vcHRpb25hbD1zdXNwLmNoaWxkLm9wdGlvbmFsO1wiK1xuKGY/XCJzdXNwLiRjZWxsPSRjZWxsO1wiOlwiXCIpO2U9e307Zm9yKGI9MDtiPGQubGVuZ3RoO2IrKylsPWRbYl0sdm9pZCAwPT09ZVtsXSYmKGMucHVzaCgnXCInK2wrJ1wiOicrbCksZVtsXT0hMCk7cmV0dXJuIGgrPVwic3VzcC4kdG1wcz17XCIrYy5qb2luKFwiLFwiKStcIn07cmV0dXJuIHN1c3A7fTtcIn07YS5wcm90b3R5cGUub3V0cHV0QWxsVW5pdHM9ZnVuY3Rpb24oKXt2YXIgYSxiLGM9XCJcIjtmb3IoYj0wO2I8dGhpcy5hbGxVbml0cy5sZW5ndGg7KytiKXt2YXIgZT10aGlzLmFsbFVuaXRzW2JdO2MrPWUucHJlZml4Q29kZTtjKz10aGlzLm91dHB1dExvY2FscyhlKTtlLmRvZXNTdXNwZW5kJiYoYys9dGhpcy5vdXRwdXRTdXNwZW5zaW9uSGVscGVycyhlKSk7Yys9ZS52YXJEZWNsc0NvZGU7Yys9ZS5zd2l0Y2hDb2RlO3ZhciBmPWUuYmxvY2tzO3ZhciBoPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGE9MDthPGYubGVuZ3RoOysrYSl7dmFyIGw9YTtpZighKGwgaW4gaCkpZm9yKDs7KWlmKGhbbF09XG4hMCxjKz1cImNhc2UgXCIrbCtcIjogLyogLS0tIFwiK2ZbbF0uX25hbWUrXCIgLS0tICovXCIsYys9ZltsXS5qb2luKFwiXCIpLG51bGwhPT1mW2xdLl9uZXh0KWlmKGZbbF0uX25leHQgaW4gaCl7Yys9XCIvKiBqdW1wICovIGNvbnRpbnVlO1wiO2JyZWFrfWVsc2UgYys9XCIvKiBhbGxvd2luZyBjYXNlIGZhbGx0aHJvdWdoICovXCIsbD1mW2xdLl9uZXh0O2Vsc2V7Yys9XCJ0aHJvdyBuZXcgU2suYnVpbHRpbi5TeXN0ZW1FcnJvcignaW50ZXJuYWwgZXJyb3I6IHVudGVybWluYXRlZCBibG9jaycpO1wiO2JyZWFrfX1jKz1lLnN1ZmZpeENvZGV9cmV0dXJuIGN9O2EucHJvdG90eXBlLmNpZj1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuSWYpO3ZhciBjPXRoaXMuZXhwckNvbnN0YW50KGEudGVzdCk7aWYoMD09PWMpYS5vcmVsc2UmJjA8YS5vcmVsc2UubGVuZ3RoJiZ0aGlzLnZzZXFzdG10KGEub3JlbHNlKTtlbHNlIGlmKDE9PT1jKXRoaXMudnNlcXN0bXQoYS5ib2R5KTtcbmVsc2V7dmFyIGQ9dGhpcy5uZXdCbG9jayhcImVuZCBvZiBpZlwiKTthLm9yZWxzZSYmMDxhLm9yZWxzZS5sZW5ndGgmJihiPXRoaXMubmV3QmxvY2soXCJuZXh0IGJyYW5jaCBvZiBpZlwiKSk7Yz10aGlzLnZleHByKGEudGVzdCk7YS5vcmVsc2UmJjA8YS5vcmVsc2UubGVuZ3RoPyh0aGlzLl9qdW1wZmFsc2UoYyxiKSx0aGlzLnZzZXFzdG10KGEuYm9keSksdGhpcy5fanVtcChkKSx0aGlzLnNldEJsb2NrKGIpLHRoaXMudnNlcXN0bXQoYS5vcmVsc2UpKToodGhpcy5fanVtcGZhbHNlKGMsZCksdGhpcy52c2Vxc3RtdChhLmJvZHkpKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCl9fTthLnByb3RvdHlwZS5jd2hpbGU9ZnVuY3Rpb24oYSl7aWYoMD09PXRoaXMuZXhwckNvbnN0YW50KGEudGVzdCkpYS5vcmVsc2UmJnRoaXMudnNlcXN0bXQoYS5vcmVsc2UpO2Vsc2V7dmFyIGI9dGhpcy5uZXdCbG9jayhcIndoaWxlIHRlc3RcIik7dGhpcy5fanVtcChiKTt0aGlzLnNldEJsb2NrKGIpO1xudmFyIGM9dGhpcy5uZXdCbG9jayhcImFmdGVyIHdoaWxlXCIpO3ZhciBkPTA8YS5vcmVsc2UubGVuZ3RoP3RoaXMubmV3QmxvY2soXCJ3aGlsZSBvcmVsc2VcIik6bnVsbDt2YXIgZT10aGlzLm5ld0Jsb2NrKFwid2hpbGUgYm9keVwiKTt0aGlzLmFubm90YXRlU291cmNlKGEpO3RoaXMuX2p1bXBmYWxzZSh0aGlzLnZleHByKGEudGVzdCksZD9kOmMpO3RoaXMuX2p1bXAoZSk7dGhpcy5wdXNoQnJlYWtCbG9jayhjKTt0aGlzLnB1c2hDb250aW51ZUJsb2NrKGIpO3RoaXMuc2V0QmxvY2soZSk7KFNrLmRlYnVnZ2luZ3x8U2sua2lsbGFibGVXaGlsZSkmJnRoaXMudS5jYW5TdXNwZW5kJiYoZT10aGlzLm5ld0Jsb2NrKFwiZGVidWcgYnJlYWtwb2ludCBmb3IgbGluZSBcIithLmxpbmVubyksbChcImlmIChTay5icmVha3BvaW50cygnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKSkge1wiLFwidmFyICRzdXNwID0gJHNhdmVTdXNwZW5zaW9uKHtkYXRhOiB7dHlwZTogJ1NrLmRlbGF5J30sIHJlc3VtZTogZnVuY3Rpb24oKSB7fX0sICdcIitcbnRoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIik7XCIsXCIkc3VzcC4kYmxrID0gXCIrZStcIjtcIixcIiRzdXNwLm9wdGlvbmFsID0gdHJ1ZTtcIixcInJldHVybiAkc3VzcDtcIixcIn1cIiksdGhpcy5fanVtcChlKSx0aGlzLnNldEJsb2NrKGUpLHRoaXMudS5kb2VzU3VzcGVuZD0hMCk7dGhpcy52c2Vxc3RtdChhLmJvZHkpO3RoaXMuX2p1bXAoYik7dGhpcy5wb3BDb250aW51ZUJsb2NrKCk7dGhpcy5wb3BCcmVha0Jsb2NrKCk7MDxhLm9yZWxzZS5sZW5ndGgmJih0aGlzLnNldEJsb2NrKGQpLHRoaXMudnNlcXN0bXQoYS5vcmVsc2UpLHRoaXMuX2p1bXAoYykpO3RoaXMuc2V0QmxvY2soYyl9fTthLnByb3RvdHlwZS5jZm9yPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmV3QmxvY2soXCJmb3Igc3RhcnRcIiksYz10aGlzLm5ld0Jsb2NrKFwiZm9yIGNsZWFudXBcIiksZD10aGlzLm5ld0Jsb2NrKFwiZm9yIGVuZFwiKTt0aGlzLnB1c2hCcmVha0Jsb2NrKGQpO3RoaXMucHVzaENvbnRpbnVlQmxvY2soYik7XG52YXIgZT10aGlzLnZleHByKGEuaXRlcik7aWYodGhpcy51LnN0ZS5nZW5lcmF0b3Ipe3ZhciBmPVwiJGxvYy5cIit0aGlzLmdlbnN5bShcIml0ZXJcIik7bChmLFwiPVNrLmFic3RyLml0ZXIoXCIsZSxcIik7XCIpfWVsc2UgZj10aGlzLl9ncihcIml0ZXJcIixcIlNrLmFic3RyLml0ZXIoXCIsZSxcIilcIiksdGhpcy51LnRlbXBzVG9TYXZlLnB1c2goZik7dGhpcy5fanVtcChiKTt0aGlzLnNldEJsb2NrKGIpO2woXCIkcmV0ID0gU2suYWJzdHIuaXRlcm5leHQoXCIsZix0aGlzLnUuY2FuU3VzcGVuZD9cIiwgdHJ1ZVwiOlwiLCBmYWxzZVwiLFwiKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2Y9dGhpcy5fZ3IoXCJuZXh0XCIsXCIkcmV0XCIpO3RoaXMuX2p1bXB1bmRlZihmLGMpO3RoaXMudmV4cHIoYS50YXJnZXQsZik7KFNrLmRlYnVnZ2luZ3x8U2sua2lsbGFibGVGb3IpJiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGY9dGhpcy5uZXdCbG9jayhcImRlYnVnIGJyZWFrcG9pbnQgZm9yIGxpbmUgXCIrYS5saW5lbm8pLGwoXCJpZiAoU2suYnJlYWtwb2ludHMoJ1wiK1xudGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKSkge1wiLFwidmFyICRzdXNwID0gJHNhdmVTdXNwZW5zaW9uKHtkYXRhOiB7dHlwZTogJ1NrLmRlbGF5J30sIHJlc3VtZTogZnVuY3Rpb24oKSB7fX0sICdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2YrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpLHRoaXMuX2p1bXAoZiksdGhpcy5zZXRCbG9jayhmKSx0aGlzLnUuZG9lc1N1c3BlbmQ9ITApO3RoaXMudnNlcXN0bXQoYS5ib2R5KTt0aGlzLl9qdW1wKGIpO3RoaXMuc2V0QmxvY2soYyk7dGhpcy5wb3BDb250aW51ZUJsb2NrKCk7dGhpcy5wb3BCcmVha0Jsb2NrKCk7dGhpcy52c2Vxc3RtdChhLm9yZWxzZSk7dGhpcy5fanVtcChkKTt0aGlzLnNldEJsb2NrKGQpfTthLnByb3RvdHlwZS5jcmFpc2U9ZnVuY3Rpb24oYSl7aWYoYS5leGMpe3ZhciBiPVxudGhpcy5fZ3IoXCJleGNcIix0aGlzLnZleHByKGEuZXhjKSksYz10aGlzLm5ld0Jsb2NrKFwiZXhjZXB0aW9uIG5vdyBpbnN0YW50aWF0ZWRcIiksZD10aGlzLl9ncihcImlzY2xhc3NcIixiK1wiLnByb3RvdHlwZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvblwiKTt0aGlzLl9qdW1wZmFsc2UoZCxjKTthLmluc3Q/KGQ9dGhpcy5fZ3IoXCJpbnN0XCIsdGhpcy52ZXhwcihhLmluc3QpKSxsKFwiaWYoIShcIixkLFwiIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpIHtcIixkLFwiPSBuZXcgU2suYnVpbHRpbi50dXBsZShbXCIsZCxcIl0pO1wiLFwifVwiKSxsKFwiJHJldCA9IFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShcIixiLFwiLFwiLGQsXCIudik7XCIpKTpsKFwiJHJldCA9IFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmQoXCIsYixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtsKGIsXCI9JHJldDtcIik7dGhpcy5fanVtcChjKTt0aGlzLnNldEJsb2NrKGMpO2woXCJpZiAoXCIsYixcblwiIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uKSB7dGhyb3cgXCIsYixcIjt9IGVsc2Uge3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcignZXhjZXB0aW9ucyBtdXN0IGRlcml2ZSBmcm9tIEJhc2VFeGNlcHRpb24nKTt9O1wiKX1lbHNlIGwoXCJ0aHJvdyAkZXJyO1wiKX07YS5wcm90b3R5cGUub3V0cHV0RmluYWxseUNhc2NhZGU9ZnVuY3Rpb24oYSl7aWYoMD09dGhpcy51LmZpbmFsbHlCbG9ja3MubGVuZ3RoKWwoXCJpZigkcG9zdGZpbmFsbHkhPT11bmRlZmluZWQpIHsgaWYgKCRwb3N0ZmluYWxseS5yZXR1cm5pbmcpIHsgcmV0dXJuICRwb3N0ZmluYWxseS5yZXR1cm5pbmc7IH0gZWxzZSB7ICRibGs9JHBvc3RmaW5hbGx5LmdvdG9CbG9jazsgJHBvc3RmaW5hbGx5PXVuZGVmaW5lZDsgY29udGludWU7IH0gfVwiKTtlbHNle3ZhciBiPXRoaXMucGVla0ZpbmFsbHlCbG9jaygpO2woXCJpZigkcG9zdGZpbmFsbHkhPT11bmRlZmluZWQpIHtcIixcImlmICgkcG9zdGZpbmFsbHkucmV0dXJuaW5nXCIsXG5iLmJyZWFrRGVwdGg9PWEuYnJlYWtEZXB0aD9cInx8ICRwb3N0ZmluYWxseS5pc0JyZWFrXCI6XCJcIixcIikge1wiLFwiJGJsaz1cIixiLmJsayxcIjtjb250aW51ZTtcIixcIn0gZWxzZSB7XCIsXCIkYmxrPSRwb3N0ZmluYWxseS5nb3RvQmxvY2s7JHBvc3RmaW5hbGx5PXVuZGVmaW5lZDtjb250aW51ZTtcIixcIn1cIixcIn1cIil9fTthLnByb3RvdHlwZS5jdHJ5PWZ1bmN0aW9uKGEpe3ZhciBiLGM9YS5oYW5kbGVycy5sZW5ndGg7aWYoYS5maW5hbGJvZHkpe3ZhciBkPXRoaXMubmV3QmxvY2soXCJmaW5hbGJvZHlcIik7dmFyIGU9dGhpcy5uZXdCbG9jayhcImZpbmFsZXhoXCIpO3ZhciBmPXRoaXMuX2dyKFwiZmluYWxseV9yZXJhaXNlXCIsXCJ1bmRlZmluZWRcIik7dGhpcy51LnRlbXBzVG9TYXZlLnB1c2goZik7dGhpcy5wdXNoRmluYWxseUJsb2NrKGQpO3ZhciBoPXRoaXMucGVla0ZpbmFsbHlCbG9jaygpO3RoaXMuc2V0dXBFeGNlcHQoZSl9dmFyIG09W107Zm9yKGI9MDtiPGM7KytiKW0ucHVzaCh0aGlzLm5ld0Jsb2NrKFwiZXhjZXB0X1wiK1xuYitcIl9cIikpO3ZhciBxPXRoaXMubmV3QmxvY2soXCJ1bmhhbmRsZWRcIik7dmFyIEI9dGhpcy5uZXdCbG9jayhcIm9yZWxzZVwiKTt2YXIgRD10aGlzLm5ld0Jsb2NrKFwiZW5kXCIpOzAhPW0ubGVuZ3RoJiZ0aGlzLnNldHVwRXhjZXB0KG1bMF0pO3RoaXMudnNlcXN0bXQoYS5ib2R5KTswIT1tLmxlbmd0aCYmdGhpcy5lbmRFeGNlcHQoKTt0aGlzLl9qdW1wKEIpO2ZvcihiPTA7YjxjOysrYil7dGhpcy5zZXRCbG9jayhtW2JdKTt2YXIgRT1hLmhhbmRsZXJzW2JdO2lmKCFFLnR5cGUmJmI8Yy0xKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiZGVmYXVsdCAnZXhjZXB0OicgbXVzdCBiZSBsYXN0XCIsdGhpcy5maWxlbmFtZSxFLmxpbmVubyk7aWYoRS50eXBlKXt2YXIgRj10aGlzLnZleHByKEUudHlwZSk7dmFyIE09Yj09Yy0xP3E6bVtiKzFdO0Y9dGhpcy5fZ3IoXCJpbnN0YW5jZVwiLFwiU2subWlzY2V2YWwuaXNUcnVlKFNrLmJ1aWx0aW4uaXNpbnN0YW5jZSgkZXJyLCBcIixGLFwiKSlcIik7XG50aGlzLl9qdW1wZmFsc2UoRixNKX1FLm5hbWUmJnRoaXMudmV4cHIoRS5uYW1lLFwiJGVyclwiKTt0aGlzLnZzZXFzdG10KEUuYm9keSk7dGhpcy5fanVtcChEKX10aGlzLnNldEJsb2NrKHEpO2woXCJ0aHJvdyAkZXJyO1wiKTt0aGlzLnNldEJsb2NrKEIpO3RoaXMudnNlcXN0bXQoYS5vcmVsc2UpO3RoaXMuX2p1bXAoRCk7dGhpcy5zZXRCbG9jayhEKTthLmZpbmFsYm9keSYmKHRoaXMuZW5kRXhjZXB0KCksdGhpcy5fanVtcChkKSx0aGlzLnNldEJsb2NrKGUpLGwoZixcIj0kZXJyO1wiKSx0aGlzLl9qdW1wKGQpLHRoaXMuc2V0QmxvY2soZCksdGhpcy5wb3BGaW5hbGx5QmxvY2soKSx0aGlzLnZzZXFzdG10KGEuZmluYWxib2R5KSxsKFwiaWYoXCIsZixcIiE9PXVuZGVmaW5lZCkgeyB0aHJvdyBcIixmLFwiO31cIiksdGhpcy5vdXRwdXRGaW5hbGx5Q2FzY2FkZShoKSl9O2EucHJvdG90eXBlLmN3aXRoPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5uZXdCbG9jayhcIndpdGhleGhcIiksZD10aGlzLm5ld0Jsb2NrKFwid2l0aHRpZHl1cFwiKSxcbmU9dGhpcy5uZXdCbG9jayhcIndpdGhjYXJyeW9uXCIpO3ZhciBmPXRoaXMuX2dyKFwibWdyXCIsdGhpcy52ZXhwcihhLml0ZW1zW2JdLmNvbnRleHRfZXhwcikpO2woXCIkcmV0ID0gU2suYWJzdHIubG9va3VwU3BlY2lhbChcIixmLFwiLFNrLmJ1aWx0aW4uc3RyLiRleGl0KTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO3ZhciBnPXRoaXMuX2dyKFwiZXhpdFwiLFwiJHJldFwiKTt0aGlzLnUudGVtcHNUb1NhdmUucHVzaChnKTtsKFwiJHJldCA9IFNrLmFic3RyLmxvb2t1cFNwZWNpYWwoXCIsZixcIixTay5idWlsdGluLnN0ci4kZW50ZXIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoJHJldCk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtmPXRoaXMuX2dyKFwidmFsdWVcIixcIiRyZXRcIik7dGhpcy5wdXNoRmluYWxseUJsb2NrKGQpO3ZhciBoPXRoaXMudS5maW5hbGx5QmxvY2tzW3RoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aC1cbjFdO3RoaXMuc2V0dXBFeGNlcHQoYyk7YS5pdGVtc1tiXS5vcHRpb25hbF92YXJzJiZ0aGlzLm5hbWVvcChhLml0ZW1zW2JdLm9wdGlvbmFsX3ZhcnMuaWQsU2suYXN0bm9kZXMuU3RvcmUsZik7YisxPGEuaXRlbXMubGVuZ3RoP3RoaXMuY3dpdGgoYSxiKzEpOnRoaXMudnNlcXN0bXQoYS5ib2R5KTt0aGlzLmVuZEV4Y2VwdCgpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhjKTtsKFwiJHJldCA9IFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKFwiLGcsXCIsdW5kZWZpbmVkLFNrLmJ1aWx0aW4uZ2V0RXhjSW5mbygkZXJyKSx1bmRlZmluZWQsW10pO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7dGhpcy5fanVtcHRydWUoXCIkcmV0XCIsZSk7bChcInRocm93ICRlcnI7XCIpO3RoaXMuc2V0QmxvY2soZCk7dGhpcy5wb3BGaW5hbGx5QmxvY2soKTtsKFwiJHJldCA9IFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShcIixnLFwiLFtTay5idWlsdGluLm5vbmUubm9uZSQsU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO1wiKTtcbnRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt0aGlzLm91dHB1dEZpbmFsbHlDYXNjYWRlKGgpO3RoaXMuX2p1bXAoZSk7dGhpcy5zZXRCbG9jayhlKX07YS5wcm90b3R5cGUuY2Fzc2VydD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnZleHByKGEudGVzdCksYz10aGlzLm5ld0Jsb2NrKFwiZW5kXCIpO3RoaXMuX2p1bXB0cnVlKGIsYyk7bChcInRocm93IG5ldyBTay5idWlsdGluLkFzc2VydGlvbkVycm9yKFwiLGEubXNnP3RoaXMudmV4cHIoYS5tc2cpOlwiXCIsXCIpO1wiKTt0aGlzLnNldEJsb2NrKGMpfTthLnByb3RvdHlwZS5jaW1wb3J0YXM9ZnVuY3Rpb24oYSxiLGMpe2E9YS52O3ZhciBkPWEuaW5kZXhPZihcIi5cIiksZT1jO2lmKC0xIT09ZClmb3IoYT1hLnN1YnN0cihkKzEpOy0xIT09ZDspZD1hLmluZGV4T2YoXCIuXCIpLGM9LTEhPT1kP2Euc3Vic3RyKDAsZCk6YSxlPXRoaXMuX2dyKFwibGF0dHJcIixcIlNrLmFic3RyLmdhdHRyKFwiLGUsXCIsIG5ldyBTay5idWlsdGluLnN0cignXCIsYyxcIicpKVwiKSxhPVxuYS5zdWJzdHIoZCsxKTtyZXR1cm4gdGhpcy5uYW1lb3AoYixTay5hc3Rub2Rlcy5TdG9yZSxlKX07YS5wcm90b3R5cGUuY2ltcG9ydD1mdW5jdGlvbihhKXt2YXIgYixjPWEubmFtZXMubGVuZ3RoO2ZvcihiPTA7YjxjOysrYil7dmFyIGQ9YS5uYW1lc1tiXTtsKFwiJHJldCA9IFNrLmJ1aWx0aW4uX19pbXBvcnRfXyhcIixkLm5hbWUuJHIoKS52LFwiLCRnYmwsJGxvYyxbXSxcIixTay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydD8wOi0xLFwiKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO3ZhciBlPXRoaXMuX2dyKFwibW9kdWxlXCIsXCIkcmV0XCIpO2lmKGQuYXNuYW1lKXRoaXMuY2ltcG9ydGFzKGQubmFtZSxkLmFzbmFtZSxlKTtlbHNle3ZhciBmPWQubmFtZTtkPWYudi5pbmRleE9mKFwiLlwiKTstMSE9PWQmJihmPW5ldyBTay5idWlsdGluLnN0cihmLnYuc3Vic3RyKDAsZCkpKTt0aGlzLm5hbWVvcChmLFNrLmFzdG5vZGVzLlN0b3JlLGUpfX19O2EucHJvdG90eXBlLmNmcm9taW1wb3J0PVxuZnVuY3Rpb24oYSl7dmFyIGMsZD1hLm5hbWVzLmxlbmd0aDt2YXIgZT1bXTt2YXIgZj1hLmxldmVsOzAhPWZ8fFNrLl9fZnV0dXJlX18uYWJzb2x1dGVfaW1wb3J0fHwoZj0tMSk7Zm9yKGM9MDtjPGQ7KytjKWVbY109XCInXCIrYihhLm5hbWVzW2NdLm5hbWUudikrXCInXCI7bChcIiRyZXQgPSBTay5idWlsdGluLl9faW1wb3J0X18oXCIsYS5tb2R1bGUuJHIoKS52LFwiLCRnYmwsJGxvYyxbXCIsZSxcIl0sXCIsZixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtmPXRoaXMuX2dyKFwibW9kdWxlXCIsXCIkcmV0XCIpO2ZvcihjPTA7YzxkOysrYyl7ZT1hLm5hbWVzW2NdO3ZhciBoPVwiJ1wiK2UubmFtZS52K1wiJ1wiO2lmKDA9PT1jJiZcIipcIj09PWUubmFtZS52KXtTay5hc3NlcnRzLmFzc2VydCgxPT09ZCk7bChcIlNrLmltcG9ydFN0YXIoXCIsZixcIiwkbG9jLCAkZ2JsKTtcIik7YnJlYWt9dmFyIG09dGhpcy5fZ3IoXCJpdGVtXCIsXCJTay5hYnN0ci5nYXR0cihcIixmLFwiLCBuZXcgU2suYnVpbHRpbi5zdHIoXCIsaCxcblwiKSwgdW5kZWZpbmVkKVwiKTtoPWUubmFtZTtlLmFzbmFtZSYmKGg9ZS5hc25hbWUpO3RoaXMubmFtZW9wKGgsU2suYXN0bm9kZXMuU3RvcmUsbSl9fTthLnByb3RvdHlwZS5idWlsZGNvZGVvYmo9ZnVuY3Rpb24oYSxjLGYsayxoLG0pe3ZhciBkPVtdLGc9W10sbj1bXSxwPVtdLHE9bnVsbCx1PW51bGw7ZiYmKGc9dGhpcy52c2VxZXhwcihmKSk7ayYmay5kZWZhdWx0cyYmKG49dGhpcy52c2VxZXhwcihrLmRlZmF1bHRzKSk7ayYmay5rd19kZWZhdWx0cyYmKHA9ay5rd19kZWZhdWx0cy5tYXAoYT0+YT90aGlzLnZleHByKGEpOlwidW5kZWZpbmVkXCIpKTtrJiZrLnZhcmFyZyYmKHE9ay52YXJhcmcpO2smJmsua3dhcmcmJih1PWsua3dhcmcpO2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJmsmJmsua3dvbmx5YXJncyYmMCE9ay5rd29ubHlhcmdzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIktleXdvcmQtb25seSBhcmd1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDJcIik7XG52YXIgRj10aGlzLmVudGVyU2NvcGUoYyxhLGEubGluZW5vLHRoaXMuY2FuU3VzcGVuZCk7Zj10aGlzLnUuc3RlLmdlbmVyYXRvcjt2YXIgTT10aGlzLnUuc3RlLmhhc0ZyZWU7dmFyIFY9dGhpcy51LnN0ZS5jaGlsZEhhc0ZyZWU7dmFyIHk9dGhpcy5uZXdCbG9jayhcImNvZGVvYmogZW50cnlcIik7dGhpcy51LnByZWZpeENvZGU9XCJ2YXIgXCIrRitcIj0oZnVuY3Rpb24gXCIrdGhpcy5uaWNlTmFtZShjLnYpK1wiJChcIjt2YXIgRz1bXTtpZihmKXtpZih1KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKGMuditcIigpOiBrZXl3b3JkIGFyZ3VtZW50cyBpbiBnZW5lcmF0b3JzIG5vdCBzdXBwb3J0ZWRcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtpZihxKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKGMuditcIigpOiB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIGluIGdlbmVyYXRvcnMgbm90IHN1cHBvcnRlZFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO0cucHVzaChcIiRnZW5cIil9ZWxzZXt1JiZcbihHLnB1c2goXCIka3dhXCIpLHRoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKFwiJGt3YVwiKSk7Zm9yKGE9MDtrJiZhPGsuYXJncy5sZW5ndGg7KythKUcucHVzaCh0aGlzLm5hbWVvcChrLmFyZ3NbYV0uYXJnLFNrLmFzdG5vZGVzLlBhcmFtKSk7Zm9yKGE9MDtrJiZrLmt3b25seWFyZ3MmJmE8ay5rd29ubHlhcmdzLmxlbmd0aDsrK2EpRy5wdXNoKHRoaXMubmFtZW9wKGsua3dvbmx5YXJnc1thXS5hcmcsU2suYXN0bm9kZXMuUGFyYW0pKTtxJiZHLnB1c2godGhpcy5uYW1lb3Aoay52YXJhcmcuYXJnLFNrLmFzdG5vZGVzLlBhcmFtKSl9bGV0IEw9IWY7TSYmKEx8fEcucHVzaChcIiRmcmVlXCIpLHRoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKFwiJGZyZWVcIikpO3RoaXMudS5wcmVmaXhDb2RlPUw/dGhpcy51LnByZWZpeENvZGUrXCIkcG9zYXJncywka3dhcmdzXCI6dGhpcy51LnByZWZpeENvZGUrRy5qb2luKFwiLFwiKTt0aGlzLnUucHJlZml4Q29kZSs9XCIpe1wiO2YmJih0aGlzLnUucHJlZml4Q29kZSs9XCJcXG4vLyBnZW5lcmF0b3JcXG5cIik7XG5NJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gaGFzIGZyZWVcXG5cIik7ViYmKHRoaXMudS5wcmVmaXhDb2RlKz1cIlxcbi8vIGhhcyBjZWxsXFxuXCIpO0wmJih0aGlzLnUucHJlZml4Q29kZSs9XCJcXG4vLyBmYXN0IGNhbGxcXG5cIik7dmFyIFQ9XCJ7fVwiO2YmJih5PVwiJGdlbi5naSRyZXN1bWVhdFwiLFQ9XCIkZ2VuLmdpJGxvY2Fsc1wiKTthPVwiLCRjZWxsPXt9XCI7ViYmZiYmKGE9XCIsJGNlbGw9JGdlbi5naSRjZWxsc1wiKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cInZhciAkYmxrPVwiK3krXCIsJGV4Yz1bXSwkbG9jPVwiK1QrYStcIiwkZ2JsPVwiKyhMP1widGhpcyAmJiB0aGlzLmZ1bmNfZ2xvYmFsc1wiOlwidGhpc1wiKSsoTCYmTT9cIiwkZnJlZT10aGlzICYmIHRoaXMuZnVuY19jbG9zdXJlXCI6XCJcIikrXCIsJGVycj11bmRlZmluZWQsJHJldD11bmRlZmluZWQsJHBvc3RmaW5hbGx5PXVuZGVmaW5lZCwkY3VyckxpbmVObz11bmRlZmluZWQsJGN1cnJDb2xObz11bmRlZmluZWQ7XCI7bnVsbCE9PVNrLmV4ZWNMaW1pdCYmKHRoaXMudS52YXJEZWNsc0NvZGUrPVxuXCJpZiAodHlwZW9mIFNrLmV4ZWNTdGFydCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5leGVjU3RhcnQgPSBEYXRlLm5vdygpfVwiKTtudWxsIT09U2sueWllbGRMaW1pdCYmdGhpcy51LmNhblN1c3BlbmQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmICh0eXBlb2YgU2subGFzdFlpZWxkID09PSAndW5kZWZpbmVkJykge1NrLmxhc3RZaWVsZCA9IERhdGUubm93KCl9XCIpO3RoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYgKFwiK0YrXCIuJHdha2luZ1N1c3BlbnNpb24hPT11bmRlZmluZWQpIHsgJHdha2VGcm9tU3VzcGVuc2lvbigpOyB9IGVsc2Uge1wiO2lmKEwpe3RoaXMudS52YXJEZWNsc0NvZGU9dXx8cXx8ayYmay5rd29ubHlhcmdzJiYwIT09ay5rd29ubHlhcmdzLmxlbmd0aD90aGlzLnUudmFyRGVjbHNDb2RlK1wiXFxudmFyICRhcmdzID0gdGhpcy4kcmVzb2x2ZUFyZ3MoJHBvc2FyZ3MsJGt3YXJncylcXG5cIjp0aGlzLnUudmFyRGVjbHNDb2RlKyhcInZhciAkYXJncyA9ICgoISRrd2FyZ3MgfHwgJGt3YXJncy5sZW5ndGg9PT0wKSAmJiAkcG9zYXJncy5sZW5ndGg9PT1cIitcbkcubGVuZ3RoK1wiKSA/ICRwb3NhcmdzIDogdGhpcy4kcmVzb2x2ZUFyZ3MoJHBvc2FyZ3MsJGt3YXJncylcIik7Zm9yKGE9MDthPEcubGVuZ3RoO2ErKyl0aGlzLnUudmFyRGVjbHNDb2RlKz1cIixcIitHW2FdK1wiPSRhcmdzW1wiK2ErXCJdXCI7dGhpcy51LnZhckRlY2xzQ29kZSs9XCI7XFxuXCJ9aWYoZiYmMDxuLmxlbmd0aClmb3IoeT1rLmFyZ3MubGVuZ3RoLW4ubGVuZ3RoLGE9MDthPG4ubGVuZ3RoOysrYSlHPXRoaXMubmFtZW9wKGsuYXJnc1thK3ldLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSksdGhpcy51LnZhckRlY2xzQ29kZSs9XCJpZihcIitHK1wiPT09dW5kZWZpbmVkKVwiK0crXCI9XCIrRitcIi4kZGVmYXVsdHNbXCIrYStcIl07XCI7Zm9yKGE9MDtrJiZhPGsuYXJncy5sZW5ndGg7KythKUc9ay5hcmdzW2FdLmFyZyx0aGlzLmlzQ2VsbChHKSYmKEc9YihlKHRoaXMudS5wcml2YXRlXyxHKS52KSx0aGlzLnUudmFyRGVjbHNDb2RlKz1cIiRjZWxsLlwiK0crXCI9XCIrRytcIjtcIik7Zm9yKGE9MDtrJiZrLmt3b25seWFyZ3MmJlxuYTxrLmt3b25seWFyZ3MubGVuZ3RoOysrYSlHPWsua3dvbmx5YXJnc1thXS5hcmcsdGhpcy5pc0NlbGwoRykmJihHPWIoZSh0aGlzLnUucHJpdmF0ZV8sRykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIitHK1wiPVwiK0crXCI7XCIpO3EmJnRoaXMuaXNDZWxsKHEuYXJnKSYmKGE9YihlKHRoaXMudS5wcml2YXRlXyxxLmFyZykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIithK1wiPVwiK2ErXCI7XCIpO3UmJih0aGlzLnUubG9jYWxuYW1lcy5wdXNoKHUuYXJnLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPXUuYXJnLnYrXCI9bmV3IFNrLmJ1aWx0aW5zWydkaWN0J10oJGt3YSk7XCIsdGhpcy5pc0NlbGwodS5hcmcpJiYoYT1iKGUodGhpcy51LnByaXZhdGVfLHUuYXJnKS52KSx0aGlzLnUudmFyRGVjbHNDb2RlKz1cIiRjZWxsLlwiK2ErXCI9XCIrYStcIjtcIikpO3RoaXMudS52YXJEZWNsc0NvZGUrPVwifVwiO1NrLl9fZnV0dXJlX18ucHl0aG9uMyYmbSYmKHRoaXMudS52YXJEZWNsc0NvZGUrPVxuXCIkZ2JsLl9fY2xhc3NfXz0kZ2JsLlwiK20uditcIjtcIik7dGhpcy51LnN3aXRjaENvZGU9XCJ3aGlsZSh0cnVlKXt0cnl7XCI7dGhpcy51LnN3aXRjaENvZGUrPXRoaXMub3V0cHV0SW50ZXJydXB0VGVzdCgpO3RoaXMudS5zd2l0Y2hDb2RlKz1cInN3aXRjaCgkYmxrKXtcIjt0aGlzLnUuc3VmZml4Q29kZT1cIn0gfWNhdGNoKGVycil7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrdGhpcy5maWxlbmFtZStcIid9KTsgaWYgKCRleGMubGVuZ3RoPjApIHsgJGVyciA9IGVycjsgJGJsaz0kZXhjLnBvcCgpOyBjb250aW51ZTsgfSBlbHNlIHsgdGhyb3cgZXJyOyB9fSB9fSk7XCI7aC5jYWxsKHRoaXMsRik7aWYoayl7Zm9yKGxldCBhIG9mIGsuYXJncylkLnB1c2goYS5hcmcudik7XG5mb3IobGV0IGEgb2Ygay5rd29ubHlhcmdzfHxbXSlkLnB1c2goYS5hcmcudik7dGhpcy51LmFyZ25hbWVzPWR9dGhpcy5leGl0U2NvcGUoKTswPG4ubGVuZ3RoJiZsKEYsXCIuJGRlZmF1bHRzPVtcIixuLmpvaW4oXCIsXCIpLFwiXTtcIik7ayYmay5rd29ubHlhcmdzJiYwPGsua3dvbmx5YXJncy5sZW5ndGgmJihsKEYsXCIuY29fYXJnY291bnQ9XCIsay5hcmdzLmxlbmd0aCxcIjtcIiksbChGLFwiLmNvX2t3b25seWFyZ2NvdW50PVwiLGsua3dvbmx5YXJncy5sZW5ndGgsXCI7XCIpLGwoRixcIi4ka3dkZWZzPVtcIixwLmpvaW4oXCIsXCIpLFwiXTtcIikpOzA8ZC5sZW5ndGg/bChGLFwiLmNvX3Zhcm5hbWVzPVsnXCIsZC5qb2luKFwiJywnXCIpLFwiJ107XCIpOmwoRixcIi5jb192YXJuYW1lcz1bXTtcIik7dSYmbChGLFwiLmNvX2t3YXJncz0xO1wiKTtxJiZsKEYsXCIuY29fdmFyYXJncz0xO1wiKTtmfHxsKEYsXCIuY29fZmFzdGNhbGw9MTtcIik7aD1cIlwiO00mJihoPVwiLCRjZWxsXCIsKG09dGhpcy51LnN0ZS5oYXNGcmVlKSYmKGgrPVwiLCRmcmVlXCIpKTtcbmlmKGYpcmV0dXJuIGsmJjA8ay5hcmdzLmxlbmd0aD90aGlzLl9ncihcImdlbmVyXCIsXCJuZXcgU2suYnVpbHRpbnNbJ2Z1bmN0aW9uJ10oKGZ1bmN0aW9uKCl7dmFyICRvcmlnYXJncz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIlwiLGMudiwnXCIsYXJndW1lbnRzLmxlbmd0aCwnLGsuYXJncy5sZW5ndGgtbi5sZW5ndGgsXCIsXCIsay5hcmdzLmxlbmd0aCxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluc1snZ2VuZXJhdG9yJ10oXCIsRixcIiwkZ2JsLCRvcmlnYXJnc1wiLGgsXCIpO30pKVwiKTp0aGlzLl9ncihcImdlbmVyXCIsXCJuZXcgU2suYnVpbHRpbnNbJ2Z1bmN0aW9uJ10oKGZ1bmN0aW9uKCl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiXCIsYy52LFwiXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCk7cmV0dXJuIG5ldyBTay5idWlsdGluc1snZ2VuZXJhdG9yJ10oXCIsRixcIiwkZ2JsLFtdXCIsaCxcIik7fSkpXCIpO2lmKDA8Zy5sZW5ndGgpe2woXCIkcmV0ID0gbmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKFwiLFxuRixcIiwkZ2JsXCIsaCxcIik7XCIpO2ZvcihsZXQgYSBvZiBnLnJldmVyc2UoKSlsKFwiJHJldCA9IFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShcIixhLFwiLFskcmV0XSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpO3JldHVybiB0aGlzLl9ncihcImZ1bmNvYmpcIixcIiRyZXRcIil9cmV0dXJuIHRoaXMuX2dyKFwiZnVuY29ialwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKFwiLEYsXCIsJGdibFwiLGgsXCIpXCIpfTthLnByb3RvdHlwZS5jZnVuY3Rpb249ZnVuY3Rpb24oYSxiKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuRnVuY3Rpb25EZWYpO2I9dGhpcy5idWlsZGNvZGVvYmooYSxhLm5hbWUsYS5kZWNvcmF0b3JfbGlzdCxhLmFyZ3MsZnVuY3Rpb24oYil7dGhpcy52c2Vxc3RtdChhLmJvZHkpO2woXCJyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO1wiKX0sYik7dGhpcy5uYW1lb3AoYS5uYW1lLFNrLmFzdG5vZGVzLlN0b3JlLGIpfTthLnByb3RvdHlwZS5jbGFtYmRhPVxuZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkxhbWJkYSk7cmV0dXJuIHRoaXMuYnVpbGRjb2Rlb2JqKGEsbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGxhbWJkYT5cIiksbnVsbCxhLmFyZ3MsZnVuY3Rpb24oYil7Yj10aGlzLnZleHByKGEuYm9keSk7bChcInJldHVybiBcIixiLFwiO1wiKX0pfTthLnByb3RvdHlwZS5jaWZleHA9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5uZXdCbG9jayhcIm5leHQgb2YgaWZleHBcIiksYz10aGlzLm5ld0Jsb2NrKFwiZW5kIG9mIGlmZXhwXCIpLGQ9dGhpcy5fZ3IoXCJyZXNcIixcIm51bGxcIiksZT10aGlzLnZleHByKGEudGVzdCk7dGhpcy5fanVtcGZhbHNlKGUsYik7bChkLFwiPVwiLHRoaXMudmV4cHIoYS5ib2R5KSxcIjtcIik7dGhpcy5fanVtcChjKTt0aGlzLnNldEJsb2NrKGIpO2woZCxcIj1cIix0aGlzLnZleHByKGEub3JlbHNlKSxcIjtcIik7dGhpcy5fanVtcChjKTt0aGlzLnNldEJsb2NrKGMpO3JldHVybiBkfTthLnByb3RvdHlwZS5jZ2VuZXhwZ2VuPVxuZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMubmV3QmxvY2soXCJzdGFydCBmb3IgXCIrYiksZT10aGlzLm5ld0Jsb2NrKFwic2tpcCBmb3IgXCIrYik7dGhpcy5uZXdCbG9jayhcImlmIGNsZWFudXAgZm9yIFwiK2IpO3ZhciBmPXRoaXMubmV3QmxvY2soXCJlbmQgZm9yIFwiK2IpLGc9YVtiXTtpZigwPT09Yil2YXIgaD1cIiRsb2MuJGl0ZXIwXCI7ZWxzZXt2YXIgbT10aGlzLnZleHByKGcuaXRlcik7aD1cIiRsb2MuXCIrdGhpcy5nZW5zeW0oXCJpdGVyXCIpO2woaCxcIj1cIixcIlNrLmFic3RyLml0ZXIoXCIsbSxcIik7XCIpfXRoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhkKTt0aGlzLmFubm90YXRlU291cmNlKGMpO2woXCIkcmV0ID0gU2suYWJzdHIuaXRlcm5leHQoXCIsaCx0aGlzLnUuY2FuU3VzcGVuZD9cIiwgdHJ1ZVwiOlwiLCBmYWxzZVwiLFwiKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGMpO209dGhpcy5fZ3IoXCJuZXh0XCIsXCIkcmV0XCIpO3RoaXMuX2p1bXB1bmRlZihtLGYpO3RoaXMudmV4cHIoZy50YXJnZXQsXG5tKTt2YXIgbj1nLmlmcz9nLmlmcy5sZW5ndGg6MDtmb3IoaD0wO2g8bjsrK2gpdGhpcy5hbm5vdGF0ZVNvdXJjZShnLmlmc1toXSksbT10aGlzLnZleHByKGcuaWZzW2hdKSx0aGlzLl9qdW1wZmFsc2UobSxkKTsrK2I8YS5sZW5ndGgmJnRoaXMuY2dlbmV4cGdlbihhLGIsYyk7Yj49YS5sZW5ndGgmJih0aGlzLmFubm90YXRlU291cmNlKGMpLGE9dGhpcy52ZXhwcihjKSxsKFwicmV0dXJuIFtcIixlLFwiLypyZXN1bWUqLyxcIixhLFwiLypyZXQqL107XCIpLHRoaXMuc2V0QmxvY2soZSkpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhmKTsxPT09YiYmbChcInJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSQ7XCIpfTthLnByb3RvdHlwZS5jZ2VuZXhwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYnVpbGRjb2Rlb2JqKGEsbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGdlbmV4cHI+XCIpLG51bGwsbnVsbCxmdW5jdGlvbihiKXt0aGlzLmNnZW5leHBnZW4oYS5nZW5lcmF0b3JzLDAsYS5lbHQpfSk7Yj10aGlzLl9ncihcImdlbmVyXCIsXG5cIlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShcIixiLFwiKTtcIik7bChiLFwiLmdpJGxvY2Fscy4kaXRlcjA9U2suYWJzdHIuaXRlcihcIix0aGlzLnZleHByKGEuZ2VuZXJhdG9yc1swXS5pdGVyKSxcIik7XCIpO3JldHVybiBifTthLnByb3RvdHlwZS5jY2xhc3M9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkNsYXNzRGVmKTt2YXIgYj10aGlzLnZzZXFleHByKGEuZGVjb3JhdG9yX2xpc3QpO3ZhciBjPXRoaXMudnNlcWV4cHIoYS5iYXNlcyk7dmFyIGQ9dGhpcy5lbnRlclNjb3BlKGEubmFtZSxhLGEubGluZW5vKTt2YXIgZT10aGlzLm5ld0Jsb2NrKFwiY2xhc3MgZW50cnlcIik7dGhpcy51LnByZWZpeENvZGU9XCJ2YXIgXCIrZCtcIj0oZnVuY3Rpb24gJFwiK2EubmFtZS52K1wiJGNsYXNzX291dGVyKCRnbG9iYWxzLCRsb2NhbHMsJGNlbGwpe3ZhciAkZ2JsPSRnbG9iYWxzLCRsb2M9JGxvY2FsczskZnJlZT0kZ2xvYmFscztcIjt0aGlzLnUuc3dpdGNoQ29kZSs9XG5cIihmdW5jdGlvbiAkXCIrYS5uYW1lLnYrXCIkX2Nsb3N1cmUoJGNlbGwpe1wiO3RoaXMudS5zd2l0Y2hDb2RlKz1cInZhciAkYmxrPVwiK2UrXCIsJGV4Yz1bXSwkcmV0PXVuZGVmaW5lZCwkcG9zdGZpbmFsbHk9dW5kZWZpbmVkLCRjdXJyTGluZU5vPXVuZGVmaW5lZCwkY3VyckNvbE5vPXVuZGVmaW5lZDtcIjtudWxsIT09U2suZXhlY0xpbWl0JiYodGhpcy51LnN3aXRjaENvZGUrPVwiaWYgKHR5cGVvZiBTay5leGVjU3RhcnQgPT09ICd1bmRlZmluZWQnKSB7U2suZXhlY1N0YXJ0ID0gRGF0ZS5ub3coKX1cIik7bnVsbCE9PVNrLnlpZWxkTGltaXQmJnRoaXMudS5jYW5TdXNwZW5kJiYodGhpcy51LnN3aXRjaENvZGUrPVwiaWYgKHR5cGVvZiBTay5sYXN0WWllbGQgPT09ICd1bmRlZmluZWQnKSB7U2subGFzdFlpZWxkID0gRGF0ZS5ub3coKX1cIik7dGhpcy51LnN3aXRjaENvZGUrPVwid2hpbGUodHJ1ZSl7dHJ5e1wiO3RoaXMudS5zd2l0Y2hDb2RlKz10aGlzLm91dHB1dEludGVycnVwdFRlc3QoKTt0aGlzLnUuc3dpdGNoQ29kZSs9XG5cInN3aXRjaCgkYmxrKXtcIjt0aGlzLnUuc3VmZml4Q29kZT1cIn19Y2F0Y2goZXJyKXsgaWYgKCEoZXJyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uKSkgeyBlcnIgPSBuZXcgU2suYnVpbHRpbi5FeHRlcm5hbEVycm9yKGVycik7IH0gZXJyLnRyYWNlYmFjay5wdXNoKHtsaW5lbm86ICRjdXJyTGluZU5vLCBjb2xubzogJGN1cnJDb2xObywgZmlsZW5hbWU6ICdcIit0aGlzLmZpbGVuYW1lK1wiJ30pOyBpZiAoJGV4Yy5sZW5ndGg+MCkgeyAkZXJyID0gZXJyOyAkYmxrPSRleGMucG9wKCk7IGNvbnRpbnVlOyB9IGVsc2UgeyB0aHJvdyBlcnI7IH19fVwiO3RoaXMudS5zdWZmaXhDb2RlKz1cIn0pLmNhbGwobnVsbCwgJGNlbGwpO30pO1wiO3RoaXMudS5wcml2YXRlXz1hLm5hbWU7dGhpcy5jYm9keShhLmJvZHksYS5uYW1lKTtsKFwicmV0dXJuO1wiKTt0aGlzLmV4aXRTY29wZSgpO2woXCIkcmV0ID0gU2subWlzY2V2YWwuYnVpbGRDbGFzcygkZ2JsLFwiLGQsXCIsXCIsYS5uYW1lLiRyKCkudixcblwiLFtcIixjLFwiXSwgJGNlbGwpO1wiKTtmb3IobGV0IGEgb2YgYilsKFwiJHJldCA9IFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShcIixhLFwiLCBbJHJldF0pO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKTt0aGlzLm5hbWVvcChhLm5hbWUsU2suYXN0bm9kZXMuU3RvcmUsXCIkcmV0XCIpfTthLnByb3RvdHlwZS5jY29udGludWU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZWVrRmluYWxseUJsb2NrKCk7aWYoMD09dGhpcy51LmNvbnRpbnVlQmxvY2tzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidjb250aW51ZScgb3V0c2lkZSBsb29wXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YT10aGlzLnUuY29udGludWVCbG9ja3NbdGhpcy51LmNvbnRpbnVlQmxvY2tzLmxlbmd0aC0xXTtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnUuYnJlYWtCbG9ja3MubGVuZ3RoPT09dGhpcy51LmNvbnRpbnVlQmxvY2tzLmxlbmd0aCk7YiYmYi5icmVha0RlcHRoPT10aGlzLnUuY29udGludWVCbG9ja3MubGVuZ3RoP1xubChcIiRwb3N0ZmluYWxseT17aXNCcmVhazp0cnVlLGdvdG9CbG9jazpcIixhLFwifTtcIik6dGhpcy5fanVtcChhKX07YS5wcm90b3R5cGUuY2JyZWFrPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGVla0ZpbmFsbHlCbG9jaygpO2lmKDA9PT10aGlzLnUuYnJlYWtCbG9ja3MubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiJ2JyZWFrJyBvdXRzaWRlIGxvb3BcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTthPXRoaXMudS5icmVha0Jsb2Nrc1t0aGlzLnUuYnJlYWtCbG9ja3MubGVuZ3RoLTFdO2ImJmIuYnJlYWtEZXB0aD09dGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aD9sKFwiJHBvc3RmaW5hbGx5PXtpc0JyZWFrOnRydWUsZ290b0Jsb2NrOlwiLGEsXCJ9O1wiKTp0aGlzLl9qdW1wKGEpfTthLnByb3RvdHlwZS52c3RtdD1mdW5jdGlvbihhLGIpe3RoaXMudS5saW5lbm89YS5saW5lbm87dGhpcy51LmxpbmVub1NldD0hMTt0aGlzLnUubG9jYWx0ZW1wcz1bXTtpZihTay5kZWJ1Z2dpbmcmJlxudGhpcy51LmNhblN1c3BlbmQpe3ZhciBjPXRoaXMubmV3QmxvY2soXCJkZWJ1ZyBicmVha3BvaW50IGZvciBsaW5lIFwiK2EubGluZW5vKTtsKFwiaWYgKFNrLmJyZWFrcG9pbnRzKCdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpKSB7XCIsXCJ2YXIgJHN1c3AgPSAkc2F2ZVN1c3BlbnNpb24oe2RhdGE6IHt0eXBlOiAnU2suZGVidWcnfSwgcmVzdW1lOiBmdW5jdGlvbigpIHt9fSwgJ1wiK3RoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIik7XCIsXCIkc3VzcC4kYmxrID0gXCIrYytcIjtcIixcIiRzdXNwLm9wdGlvbmFsID0gdHJ1ZTtcIixcInJldHVybiAkc3VzcDtcIixcIn1cIik7dGhpcy5fanVtcChjKTt0aGlzLnNldEJsb2NrKGMpO3RoaXMudS5kb2VzU3VzcGVuZD0hMH10aGlzLmFubm90YXRlU291cmNlKGEpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmOnRoaXMuY2Z1bmN0aW9uKGEsYik7XG5icmVhaztjYXNlIFNrLmFzdG5vZGVzLkNsYXNzRGVmOnRoaXMuY2NsYXNzKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmV0dXJuOmlmKHRoaXMudS5zdGUuYmxvY2tUeXBlIT09U2suU1lNVEFCX0NPTlNUUy5GdW5jdGlvbkJsb2NrKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiJ3JldHVybicgb3V0c2lkZSBmdW5jdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2M9YS52YWx1ZT90aGlzLnZleHByKGEudmFsdWUpOlwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7MD09dGhpcy51LmZpbmFsbHlCbG9ja3MubGVuZ3RoP2woXCJyZXR1cm4gXCIsYyxcIjtcIik6KGwoXCIkcG9zdGZpbmFsbHk9e3JldHVybmluZzpcIixjLFwifTtcIiksdGhpcy5fanVtcCh0aGlzLnBlZWtGaW5hbGx5QmxvY2soKS5ibGspKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbGV0ZTp0aGlzLnZzZXFleHByKGEudGFyZ2V0cyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NpZ246dmFyIGQ9YS50YXJnZXRzLmxlbmd0aDtcbmM9dGhpcy52ZXhwcihhLnZhbHVlKTtmb3IoYj0wO2I8ZDsrK2IpdGhpcy52ZXhwcihhLnRhcmdldHNbYl0sYyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bbm5Bc3NpZ246Yz10aGlzLnZleHByKGEudmFsdWUpO3RoaXMudmV4cHIoYS50YXJnZXQsYyk7dGhpcy52ZXhwcihhLmFubm90YXRpb24pO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXVnQXNzaWduOnJldHVybiB0aGlzLmNhdWdhc3NpZ24oYSk7Y2FzZSBTay5hc3Rub2Rlcy5QcmludDp0aGlzLmNwcmludChhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkZvcjpyZXR1cm4gdGhpcy5jZm9yKGEpO2Nhc2UgU2suYXN0bm9kZXMuV2hpbGU6cmV0dXJuIHRoaXMuY3doaWxlKGEpO2Nhc2UgU2suYXN0bm9kZXMuSWY6cmV0dXJuIHRoaXMuY2lmKGEpO2Nhc2UgU2suYXN0bm9kZXMuUmFpc2U6cmV0dXJuIHRoaXMuY3JhaXNlKGEpO2Nhc2UgU2suYXN0bm9kZXMuVHJ5OnJldHVybiB0aGlzLmN0cnkoYSk7Y2FzZSBTay5hc3Rub2Rlcy5XaXRoOnJldHVybiB0aGlzLmN3aXRoKGEsXG4wKTtjYXNlIFNrLmFzdG5vZGVzLkFzc2VydDpyZXR1cm4gdGhpcy5jYXNzZXJ0KGEpO2Nhc2UgU2suYXN0bm9kZXMuSW1wb3J0OnJldHVybiB0aGlzLmNpbXBvcnQoYSk7Y2FzZSBTay5hc3Rub2Rlcy5JbXBvcnRGcm9tOnJldHVybiB0aGlzLmNmcm9taW1wb3J0KGEpO2Nhc2UgU2suYXN0bm9kZXMuR2xvYmFsOmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRXhwcjp0aGlzLnZleHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFzczpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkJyZWFrOnRoaXMuY2JyZWFrKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ29udGludWU6dGhpcy5jY29udGludWUoYSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWJ1Z2dlcjpsKFwiZGVidWdnZXI7XCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gdnN0bXQ6IFwiK0pTT04uc3RyaW5naWZ5KGEpKX19O2EucHJvdG90eXBlLnZzZXFzdG10PWZ1bmN0aW9uKGEpe3ZhciBiO1xuZm9yKGI9MDtiPGEubGVuZ3RoOysrYil0aGlzLnZzdG10KGFbYl0pfTthLnByb3RvdHlwZS5pc0NlbGw9ZnVuY3Rpb24oYSl7YT1iKGUodGhpcy51LnByaXZhdGVfLGEpLnYpO3JldHVybiB0aGlzLnUuc3RlLmdldFNjb3BlKGEpPT09U2suU1lNVEFCX0NPTlNUUy5DRUxMfTthLnByb3RvdHlwZS5uYW1lb3A9ZnVuY3Rpb24oYSxjLGYpe2lmKChjPT09U2suYXN0bm9kZXMuU3RvcmV8fGM9PT1Tay5hc3Rub2Rlcy5BdWdTdG9yZXx8Yz09PVNrLmFzdG5vZGVzLkRlbCkmJlwiX19kZWJ1Z19fXCI9PT1hLnYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJjYW4gbm90IGFzc2lnbiB0byBfX2RlYnVnX19cIix0aGlzLmZpbGVuYW1lLHRoaXMudS5saW5lbm8pO1NrLmFzc2VydHMuYXNzZXJ0KFwiTm9uZVwiIT09YS52KTtpZihcIk5vdEltcGxlbWVudGVkXCI9PT1hLnYpcmV0dXJuXCJTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJFwiO3ZhciBkPWUodGhpcy51LnByaXZhdGVfLFxuYSkudjtkPWIoZCk7dmFyIGc9Mzt2YXIgaD10aGlzLnUuc3RlLmdldFNjb3BlKGQpO3ZhciBtPW51bGw7c3dpdGNoKGgpe2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5GUkVFOm09XCIkZnJlZVwiO2c9MjticmVhaztjYXNlIFNrLlNZTVRBQl9DT05TVFMuQ0VMTDptPVwiJGNlbGxcIjtnPTI7YnJlYWs7Y2FzZSBTay5TWU1UQUJfQ09OU1RTLkxPQ0FMOnRoaXMudS5zdGUuYmxvY2tUeXBlIT09U2suU1lNVEFCX0NPTlNUUy5GdW5jdGlvbkJsb2NrfHx0aGlzLnUuc3RlLmdlbmVyYXRvcnx8KGc9MCk7YnJlYWs7Y2FzZSBTay5TWU1UQUJfQ09OU1RTLkdMT0JBTF9JTVBMSUNJVDp0aGlzLnUuc3RlLmJsb2NrVHlwZT09PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayYmKGc9MSk7YnJlYWs7Y2FzZSBTay5TWU1UQUJfQ09OU1RTLkdMT0JBTF9FWFBMSUNJVDpnPTF9U2suYXNzZXJ0cy5hc3NlcnQoaHx8XCJfXCI9PT1hLnYuY2hhckF0KDEpKTthPWQ7dGhpcy51LnN0ZS5nZW5lcmF0b3J8fHRoaXMudS5zdGUuYmxvY2tUeXBlIT09XG5Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2s/ZD1cIiRsb2MuXCIrZDooMD09PWd8fDM9PT1nKSYmdGhpcy51LmxvY2FsbmFtZXMucHVzaChkKTtzd2l0Y2goZyl7Y2FzZSAwOnN3aXRjaChjKXtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6Y2FzZSBTay5hc3Rub2Rlcy5QYXJhbTpyZXR1cm4gbChcImlmIChcIixkLFwiID09PSB1bmRlZmluZWQpIHsgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVW5ib3VuZExvY2FsRXJyb3IoJ2xvY2FsIHZhcmlhYmxlIFxcXFwnXCIsZCxcIlxcXFwnIHJlZmVyZW5jZWQgYmVmb3JlIGFzc2lnbm1lbnQnKTsgfVxcblwiKSxkO2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChkLFwiPVwiLGYsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVsOmwoXCJkZWxldGUgXCIsZCxcIjtcIik7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWRcIil9YnJlYWs7Y2FzZSAzOnN3aXRjaChjKXtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6cmV0dXJuIHRoaXMuX2dyKFwibG9hZG5hbWVcIixkLFxuXCIhPT11bmRlZmluZWQ/XCIsZCxcIjpTay5taXNjZXZhbC5sb2FkbmFtZSgnXCIsYSxcIicsJGdibCk7XCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChkLFwiPVwiLGYsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVsOmwoXCJkZWxldGUgXCIsZCxcIjtcIik7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5QYXJhbTpyZXR1cm4gZDtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZFwiKX1icmVhaztjYXNlIDE6c3dpdGNoKGMpe2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkZ2JsXCIsXCJTay5taXNjZXZhbC5sb2FkbmFtZSgnXCIsYSxcIicsJGdibClcIik7Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTpsKFwiJGdibC5cIixhLFwiPVwiLGYsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVsOmwoXCJkZWxldGUgJGdibC5cIixhKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlIGluIG5hbWUgb3BfZ2xvYmFsXCIpfWJyZWFrO2Nhc2UgMjpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOnJldHVybiBtK1xuXCIuXCIrYTtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwobSxcIi5cIixhLFwiPVwiLGYsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFyYW06cmV0dXJuIGE7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBpbiBuYW1lIG9wX2RlcmVmXCIpfWJyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2VcIil9fTthLnByb3RvdHlwZS5lbnRlclNjb3BlPWZ1bmN0aW9uKGEsYixlLGYpe3ZhciBkPW5ldyBjO2Quc3RlPXRoaXMuc3QuZ2V0U3RzRm9yQXN0KGIpO2QubmFtZT1hO2QuZmlyc3RsaW5lbm89ZTtkLmNhblN1c3BlbmQ9Znx8ITE7dGhpcy51JiZ0aGlzLnUucHJpdmF0ZV8mJihkLnByaXZhdGVfPXRoaXMudS5wcml2YXRlXyk7dGhpcy5zdGFjay5wdXNoKHRoaXMudSk7dGhpcy5hbGxVbml0cy5wdXNoKGQpO2E9dGhpcy5nZW5zeW0oXCJzY29wZVwiKTtkLnNjb3BlbmFtZT1hO3RoaXMudT1kO3RoaXMudS5hY3RpdmF0ZVNjb3BlKCk7dGhpcy5uZXN0bGV2ZWwrKztcbnJldHVybiBhfTthLnByb3RvdHlwZS5leGl0U2NvcGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnU7dGhpcy5uZXN0bGV2ZWwtLTsodGhpcy51PTA8PXRoaXMuc3RhY2subGVuZ3RoLTE/dGhpcy5zdGFjay5wb3AoKTpudWxsKSYmdGhpcy51LmFjdGl2YXRlU2NvcGUoKTtpZihcIjxtb2R1bGU+XCIhPT1hLm5hbWUudil7dmFyIGI9YS5uYW1lLiRyKCkudjtiPWIuc3Vic3RyaW5nKDEsYi5sZW5ndGgtMSk7bChhLnNjb3BlbmFtZSxcIi5jb19uYW1lPW5ldyBTay5idWlsdGluc1snc3RyJ10oJ1wiLGIsXCInKTtcIik7dGhpcy5zdGFjay5sZW5ndGgmJlwiY2xhc3NcIj09dGhpcy51LnN0ZS5ibG9ja1R5cGUmJmwoYS5zY29wZW5hbWUsXCIuY29fcXVhbG5hbWU9bmV3IFNrLmJ1aWx0aW5zWydzdHInXSgnXCIrdGhpcy51Lm5hbWUuditcIi5cIitiK1wiJyk7XCIpfWZvcih2YXIgYyBpbiBhLmNvbnN0cylhLmNvbnN0cy5oYXNPd25Qcm9wZXJ0eShjKSYmKGEuc3VmZml4Q29kZSs9YytcIiA9IFwiK2EuY29uc3RzW2NdK1wiO1wiKX07XG5hLnByb3RvdHlwZS5jYm9keT1mdW5jdGlvbihhLGIpe3ZhciBjO2ZvcihjPTA7YzxhLmxlbmd0aDsrK2MpdGhpcy52c3RtdChhW2NdLGIpfTthLnByb3RvdHlwZS5jcHJpbnQ9ZnVuY3Rpb24oYSl7dmFyIGI7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLlByaW50KTthLmRlc3QmJnRoaXMudmV4cHIoYS5kZXN0KTt2YXIgYz1hLnZhbHVlcy5sZW5ndGg7Zm9yKGI9MDtiPGM7KytiKWwoXCIkcmV0ID0gU2subWlzY2V2YWwucHJpbnRfKFwiLFwibmV3IFNrLmJ1aWx0aW5zWydzdHInXShcIix0aGlzLnZleHByKGEudmFsdWVzW2JdKSxcIikudik7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTthLm5sJiYobChcIiRyZXQgPSBTay5taXNjZXZhbC5wcmludF8oXCIsJ1wiXFxcXG5cIik7JyksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpKX07YS5wcm90b3R5cGUuY21vZD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmVudGVyU2NvcGUobmV3IFNrLmJ1aWx0aW4uc3RyKFwiPG1vZHVsZT5cIiksXG5hLDAsdGhpcy5jYW5TdXNwZW5kKSxjPXRoaXMubmV3QmxvY2soXCJtb2R1bGUgZW50cnlcIik7dGhpcy51LnByZWZpeENvZGU9XCJ2YXIgXCIrYitcIj0oZnVuY3Rpb24oJGZvcmNlZ2JsKXtcIjt0aGlzLnUudmFyRGVjbHNDb2RlPVwidmFyICRnYmwgPSAkZm9yY2VnYmwgfHwge30sICRibGs9XCIrYytcIiwkZXhjPVtdLCRsb2M9JGdibCwkY2VsbD17fSwkZXJyPXVuZGVmaW5lZDskbG9jLl9fZmlsZV9fPW5ldyBTay5idWlsdGlucy5zdHIoJ1wiK3RoaXMuZmlsZW5hbWUrXCInKTt2YXIgJHJldD11bmRlZmluZWQsJHBvc3RmaW5hbGx5PXVuZGVmaW5lZCwkY3VyckxpbmVObz11bmRlZmluZWQsJGN1cnJDb2xObz11bmRlZmluZWQ7XCI7bnVsbCE9PVNrLmV4ZWNMaW1pdCYmKHRoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYgKHR5cGVvZiBTay5leGVjU3RhcnQgPT09ICd1bmRlZmluZWQnKSB7U2suZXhlY1N0YXJ0ID0gRGF0ZS5ub3coKX1cIik7bnVsbCE9PVNrLnlpZWxkTGltaXQmJnRoaXMudS5jYW5TdXNwZW5kJiZcbih0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmICh0eXBlb2YgU2subGFzdFlpZWxkID09PSAndW5kZWZpbmVkJykge1NrLmxhc3RZaWVsZCA9IERhdGUubm93KCl9XCIpO3RoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYgKFwiK2IrXCIuJHdha2luZ1N1c3BlbnNpb24hPT11bmRlZmluZWQpIHsgJHdha2VGcm9tU3VzcGVuc2lvbigpOyB9aWYgKFNrLnJldGFpbkdsb2JhbHMpIHsgICAgaWYgKFNrLmdsb2JhbHMpIHsgJGdibCA9IFNrLmdsb2JhbHM7IFNrLmdsb2JhbHMgPSAkZ2JsOyAkbG9jID0gJGdibDsgfSAgICBpZiAoU2suZ2xvYmFscykgeyAkZ2JsID0gU2suZ2xvYmFsczsgU2suZ2xvYmFscyA9ICRnYmw7ICRsb2MgPSAkZ2JsOyAkbG9jLl9fZmlsZV9fPW5ldyBTay5idWlsdGlucy5zdHIoJ1wiK3RoaXMuZmlsZW5hbWUrXCInKTt9ICAgIGVsc2UgeyBTay5nbG9iYWxzID0gJGdibDsgfX0gZWxzZSB7IFNrLmdsb2JhbHMgPSAkZ2JsOyB9XCI7dGhpcy51LnN3aXRjaENvZGU9XCJ3aGlsZSh0cnVlKXt0cnl7XCI7XG50aGlzLnUuc3dpdGNoQ29kZSs9dGhpcy5vdXRwdXRJbnRlcnJ1cHRUZXN0KCk7dGhpcy51LnN3aXRjaENvZGUrPVwic3dpdGNoKCRibGspe1wiO3RoaXMudS5zdWZmaXhDb2RlPVwifVwiO3RoaXMudS5zdWZmaXhDb2RlKz1cIn1jYXRjaChlcnIpeyBpZiAoIShlcnIgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb24pKSB7IGVyciA9IG5ldyBTay5idWlsdGluLkV4dGVybmFsRXJyb3IoZXJyKTsgfSBlcnIudHJhY2ViYWNrLnB1c2goe2xpbmVubzogJGN1cnJMaW5lTm8sIGNvbG5vOiAkY3VyckNvbE5vLCBmaWxlbmFtZTogJ1wiK3RoaXMuZmlsZW5hbWUrXCInfSk7IGlmICgkZXhjLmxlbmd0aD4wKSB7ICRlcnIgPSBlcnI7ICRibGs9JGV4Yy5wb3AoKTsgY29udGludWU7IH0gZWxzZSB7IHRocm93IGVycjsgfX0gfSB9KTtcIjtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5Nb2R1bGU6dGhpcy5jYm9keShhLmJvZHkpO2woXCJyZXR1cm4gJGxvYztcIik7YnJlYWs7XG5kZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInRvZG87IHVuaGFuZGxlZCBjYXNlIGluIGNvbXBpbGVyTW9kXCIpfXRoaXMuZXhpdFNjb3BlKCk7dGhpcy5yZXN1bHQucHVzaCh0aGlzLm91dHB1dEFsbFVuaXRzKCkpO3JldHVybiBifTtTay5jb21waWxlPWZ1bmN0aW9uKGIsYyxlLGYpe2U9U2suX19mdXR1cmVfXztTay5fX2Z1dHVyZV9fPU9iamVjdC5jcmVhdGUoU2suX19mdXR1cmVfXyk7dmFyIGQ9U2sucGFyc2UoYyxiKSxnPVNrLmFzdEZyb21QYXJzZShkLmNzdCxjLGQuZmxhZ3MpO2Q9ZC5mbGFnczt2YXIgaD1Tay5zeW1ib2x0YWJsZShnLGMpO2I9bmV3IGEoYyxoLGQsZixiKTtjPWIuY21vZChnKTtTay5fX2Z1dHVyZV9fPWU7cmV0dXJue2Z1bmNuYW1lOlwiJGNvbXBpbGVkbW9kXCIsY29kZTpcIiRjb21waWxlZG1vZCA9IGZ1bmN0aW9uKCkge1wiK2IucmVzdWx0LmpvaW4oXCJcIikrXCJcXG5yZXR1cm4gXCIrYytcIjt9KCk7XCJ9fTtTay5leHBvcnRTeW1ib2woXCJTay5jb21waWxlXCIsU2suY29tcGlsZSk7XG5Tay5yZXNldENvbXBpbGVyPWZ1bmN0aW9uKCl7U2suZ2Vuc3ltY291bnQ9MH07U2suZXhwb3J0U3ltYm9sKFwiU2sucmVzZXRDb21waWxlclwiLFNrLnJlc2V0Q29tcGlsZXIpO1NrLmZpeFJlc2VydmVkPWI7U2suZXhwb3J0U3ltYm9sKFwiU2suZml4UmVzZXJ2ZWRcIixTay5maXhSZXNlcnZlZCk7U2sudW5maXhSZXNlcnZlZD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9fXFwkcndcXCQkLyxcIlwiKX07U2suZXhwb3J0U3ltYm9sKFwiU2sudW5maXhSZXNlcnZlZFwiLFNrLnVuZml4UmVzZXJ2ZWQpO1NrLm1hbmdsZU5hbWU9ZTtTay5leHBvcnRTeW1ib2woXCJTay5tYW5nbGVOYW1lXCIsU2subWFuZ2xlTmFtZSk7U2sucmVzZXJ2ZWRXb3Jkc189aDtTay5leHBvcnRTeW1ib2woXCJTay5yZXNlcnZlZFdvcmRzX1wiLFNrLnJlc2VydmVkV29yZHNfKX0sZnVuY3Rpb24obSxxKXtTay5zeXNtb2R1bGVzPW5ldyBTay5idWlsdGluLmRpY3QoW10pO1NrLnJlYWxzeXNwYXRoPXZvaWQgMDtTay5pbXBvcnRTZWFyY2hQYXRoRm9yTmFtZT1cbmZ1bmN0aW9uKGEsYyxiKXt2YXIgZT1hLnJlcGxhY2UoL1xcLi9nLFwiL1wiKSxmPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLnRyeUNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLnJlYWQoYSl9LGZ1bmN0aW9uKGEpe30pLGZ1bmN0aW9uKGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayh7ZmlsZW5hbWU6YSxjb2RlOmMscGFja2FnZVBhdGg6Yn0pfSl9O3ZvaWQgMD09PWImJihiPVNrLnJlYWxzeXNwYXRoKTtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihiLnRwJGl0ZXIoKSxmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZihhLnYrXCIvXCIrZStjLCExKSxmdW5jdGlvbihiKXtyZXR1cm4gYj9iOmYoYS52K1wiL1wiK2UrXCIvX19pbml0X19cIitjLGEuditcIi9cIitlKX0pfSl9O1NrLmltcG9ydFNldFVwUGF0aD1mdW5jdGlvbihhKXtpZighU2sucmVhbHN5c3BhdGgpe3ZhciBjPVtuZXcgU2suYnVpbHRpbi5zdHIoXCJzcmMvYnVpbHRpblwiKSxcbm5ldyBTay5idWlsdGluLnN0cihcInNyYy9saWJcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFwiLlwiKV07Zm9yKGE9MDthPFNrLnN5c3BhdGgubGVuZ3RoOysrYSljLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKFNrLnN5c3BhdGhbYV0pKTtTay5yZWFsc3lzcGF0aD1uZXcgU2suYnVpbHRpbi5saXN0KGMpfX07U2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfPWZ1bmN0aW9uKGEsYyxiLGUsZixsLGgpe3ZhciBkLGcsbSxrLHA9bnVsbCxxPXZvaWQgMCE9PWY/Zi50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRuYW1lKTp2b2lkIDAsQT12b2lkIDAhPT1xP3EuditcIi5cIjpcIlwiLHQ9dm9pZCAwIT09Zj9mLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJHBhdGgpOnZvaWQgMDtTay5pbXBvcnRTZXRVcFBhdGgoaCk7aWYoZiYmIXEpe2lmKGwpcmV0dXJuO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBdHRlbXB0ZWQgdG8gaW1wb3J0IHJlbGF0aXZlIHRvIGludmFsaWQgcGFja2FnZSAobm8gbmFtZSlcIik7XG59dm9pZCAwPT09YiYmKGI9QSthKTt2YXIgdj1hLnNwbGl0KFwiLlwiKTtpZigxPHYubGVuZ3RoKXt2YXIgQj12LnNsaWNlKDAsdi5sZW5ndGgtMSkuam9pbihcIi5cIik7cD1Tay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oQixjLHZvaWQgMCx2b2lkIDAsZixsLGgpfXZhciBEPVNrLm1pc2NldmFsLmNoYWluKHAsZnVuY3Rpb24obil7cD1uO2c9U2suc3lzbW9kdWxlcy5xdWljayRsb29rdXAobmV3IFNrLmJ1aWx0aW4uc3RyKGIpKTtyZXR1cm4gdm9pZCAwIT09Zz9wfHxnOlNrLm1pc2NldmFsLmNoYWluKHZvaWQgMCxmdW5jdGlvbigpe3ZhciBiPWE7aWYoMTx2Lmxlbmd0aCl7aWYoIXApcmV0dXJuO209U2suc3lzbW9kdWxlcy5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKEErQikpO2I9dlt2Lmxlbmd0aC0xXTt0PW0udHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kcGF0aCl9az1uZXcgU2suYnVpbHRpbi5tb2R1bGU7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBlKXtkPWErXCIucHlcIjt2YXIgYz1cblNrLmNvbXBpbGUoZSxkLFwiZXhlY1wiLGgpfWVsc2UgYz1Tay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXtpZihTay5vbkJlZm9yZUltcG9ydCYmXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLm9uQmVmb3JlSW1wb3J0KXJldHVybiBTay5vbkJlZm9yZUltcG9ydChhKX0sZnVuY3Rpb24oYyl7aWYoITE9PT1jKXRocm93IG5ldyBTay5idWlsdGluLkltcG9ydEVycm9yKFwiSW1wb3J0aW5nIFwiK2ErXCIgaXMgbm90IGFsbG93ZWRcIik7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBjKXRocm93IG5ldyBTay5idWlsdGluLkltcG9ydEVycm9yKGMpO3JldHVybiBTay5pbXBvcnRTZWFyY2hQYXRoRm9yTmFtZShiLFwiLmpzXCIsdCl9LGZ1bmN0aW9uKGEpe3JldHVybiBhP3tmdW5jbmFtZTpcIiRidWlsdGlubW9kdWxlXCIsY29kZTphLmNvZGUsZmlsZW5hbWU6YS5maWxlbmFtZSxwYWNrYWdlUGF0aDphLnBhY2thZ2VQYXRofTpTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRTZWFyY2hQYXRoRm9yTmFtZShiLFxuXCIucHlcIix0KSxmdW5jdGlvbihiKXtpZihhPWIpcmV0dXJuIFNrLmNvbXBpbGUoYS5jb2RlLGEuZmlsZW5hbWUsXCJleGVjXCIsaCl9LGZ1bmN0aW9uKGIpe2lmKGIpcmV0dXJuIGIucGFja2FnZVBhdGg9YS5wYWNrYWdlUGF0aCxifSl9KTtyZXR1cm4gY30sZnVuY3Rpb24oYSl7aWYoYSl7U2suc3lzbW9kdWxlcy5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihiKSxrKTt2YXIgZT1rLiRqcz1hLmNvZGU7bnVsbD09ZCYmKGQ9YS5maWxlbmFtZSk7bnVsbCE9U2suZGF0ZVNldCYmU2suZGF0ZVNldHx8KGU9XCJTay5leGVjU3RhcnQgPSBTay5sYXN0WWllbGQgPSBuZXcgRGF0ZSgpO1xcblwiK2EuY29kZSxTay5kYXRlU2V0PSEwKTtpZihjKXt2YXIgZj1mdW5jdGlvbihhKXt2YXIgYixjPVNrLmpzX2JlYXV0aWZ5KGEpLnNwbGl0KFwiXFxuXCIpO2ZvcihiPTE7Yjw9Yy5sZW5ndGg7KytiKXt2YXIgZD0oXCJcIitiKS5sZW5ndGg7Zm9yKGE9XCJcIjs1PmQ7KytkKWErPVwiIFwiO2NbYi0xXT1cIi8qIFwiK1xuYStiK1wiICovIFwiK2NbYi0xXX1yZXR1cm4gYy5qb2luKFwiXFxuXCIpfTtlPWYoZSk7U2suZGVidWdvdXQoZSl9ZSs9XCJcXG5cIithLmZ1bmNuYW1lK1wiO1wiO2U9U2suZ2xvYmFsLmV2YWwoZSk7ay4kZD17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKGIpLF9fZG9jX186U2suYnVpbHRpbi5ub25lLm5vbmUkLF9fcGFja2FnZV9fOmEucGFja2FnZVBhdGg/bmV3IFNrLmJ1aWx0aW4uc3RyKGIpOkI/bmV3IFNrLmJ1aWx0aW4uc3RyKEErQik6cT9xOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH07YS5wYWNrYWdlUGF0aCYmKGsuJGQuX19wYXRoX189bmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihhLnBhY2thZ2VQYXRoKV0pKTtyZXR1cm4gZShrLiRkKX19LGZ1bmN0aW9uKGIpe3ZhciBjO2lmKHZvaWQgMD09PWIpe2lmKGwmJiFwKXJldHVybjt0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihcIk5vIG1vZHVsZSBuYW1lZCBcIithKTt9aWYoYiE9PWsuJGQpe2ZvcihjIGluIGsuJGQpYltjXXx8XG4oYltjXT1rLiRkW2NdKTtrLiRkPWJ9aWYoU2sub25BZnRlckltcG9ydCYmXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLm9uQWZ0ZXJJbXBvcnQpdHJ5e1NrLm9uQWZ0ZXJJbXBvcnQoYSl9Y2F0Y2goVil7fWlmKHApcmV0dXJuIG0udHAkc2V0YXR0cihuZXcgU2suYnVpbHRpbi5zdHIodlt2Lmxlbmd0aC0xXSksaykscDtmJiZmLnRwJHNldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKGEpLGspO3JldHVybiBrfSl9KTtyZXR1cm4gaD9EOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhEKX07U2suaW1wb3J0TW9kdWxlPWZ1bmN0aW9uKGEsYyxiKXtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCwhMSxiKX07U2suaW1wb3J0TWFpbj1mdW5jdGlvbihhLGMsYil7U2suZGF0ZVNldD0hMTtTay5maWxlc0xvYWRlZD0hMTtTay5zeXNtb2R1bGVzPW5ldyBTay5idWlsdGluLmRpY3QoW10pO1NrLnJlYWxzeXNwYXRoPVxudm9pZCAwO1NrLnJlc2V0Q29tcGlsZXIoKTtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fbWFpbl9fXCIsdm9pZCAwLHZvaWQgMCwhMSxiKX07U2suaW1wb3J0TWFpbldpdGhCb2R5PWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmRhdGVTZXQ9ITE7U2suZmlsZXNMb2FkZWQ9ITE7U2suc3lzbW9kdWxlcz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTtTay5yZWFsc3lzcGF0aD12b2lkIDA7U2sucmVzZXRDb21waWxlcigpO3JldHVybiBTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSxjLFwiX19tYWluX19cIixiLHZvaWQgMCwhMSxlKX07U2suaW1wb3J0QnVpbHRpbldpdGhCb2R5PWZ1bmN0aW9uKGEsYyxiLGUpe3JldHVybiBTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSxjLFwiX19idWlsdGluX18uXCIrYSxiLHZvaWQgMCwhMSxlKX07U2suYnVpbHRpbi5fX2ltcG9ydF9fPWZ1bmN0aW9uKGEsYyxiLGUsZil7dmFyIGw9U2suZ2xvYmFscyxoO3ZvaWQgMD09PWYmJihmPVNrLl9fZnV0dXJlX18uYWJzb2x1dGVfaW1wb3J0P1xuMDotMSk7aWYoMCE9PWYmJmMuX19wYWNrYWdlX18mJmMuX19wYWNrYWdlX18hPT1Tay5idWlsdGluLm5vbmUubm9uZSQpe2lmKChoPWMuX19wYWNrYWdlX18udikmJjA8Zil7Yz1oLnNwbGl0KFwiLlwiKTtpZihmLTE+PWMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGJleW9uZCB0b3BsZXZlbCBwYWNrYWdlXCIpO2MubGVuZ3RoLT1mLTE7aD1jLmpvaW4oXCIuXCIpfXZhciBkPVNrLnN5c21vZHVsZXMucXVpY2skbG9va3VwKG5ldyBTay5idWlsdGluLnN0cihoKSl9aWYoMDxmJiZ2b2lkIDA9PT1kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGluIG5vbi1wYWNrYWdlXCIpO2Euc3BsaXQoXCIuXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXtpZigwIT09ZiYmdm9pZCAwIT09ZClyZXR1cm5cIlwiPT09YT9kOlNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLFxudm9pZCAwLGgrXCIuXCIrYSx2b2lkIDAsZCwtMT09ZiwhMCl9LGZ1bmN0aW9uKGIpe3JldHVybiB2b2lkIDA9PT1iPyhoPWQ9dm9pZCAwLFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCwhMSwhMCkpOmJ9LGZ1bmN0aW9uKGIpe2lmKGUmJjAhPT1lLmxlbmd0aCl7dmFyIGM7dmFyIGQ9U2suc3lzbW9kdWxlcy5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKChofHxcIlwiKSsoaCYmYT9cIi5cIjpcIlwiKSthKSk7Zm9yKGI9MDtiPGUubGVuZ3RoO2IrKyl7dmFyIGY9ZVtiXTtcIipcIiE9ZiYmdm9pZCAwPT09ZC50cCRnZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihmKSkmJihjPVNrLm1pc2NldmFsLmNoYWluKGMsU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfLmJpbmQobnVsbCxmLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGQsITAsITApKSl9cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGMsZnVuY3Rpb24oKXtTay5hc3NlcnRzLmFzc2VydChkKTtyZXR1cm4gZH0pfXJldHVybiBifSxcbmZ1bmN0aW9uKGEpe2whPT1Tay5nbG9iYWxzJiYoU2suZ2xvYmFscz1sKTtyZXR1cm4gYX0pfTtTay5pbXBvcnRTdGFyPWZ1bmN0aW9uKGEsYyxiKXtpZihiPWEudHAkZ2V0YXR0cihuZXcgU2suYnVpbHRpbi5zdHIoXCJfX2FsbF9fXCIpKSlmb3IobGV0IGU9U2suYWJzdHIuaXRlcihiKSxmPWUudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1mO2Y9ZS50cCRpdGVybmV4dCgpKWNbZi52XT1Tay5hYnN0ci5nYXR0cihhLGYpO2Vsc2V7Yj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhLiRkKTtmb3IobGV0IGUgaW4gYilcIl9cIiE9YltlXS5jaGFyQXQoMCkmJihjW2JbZV1dPWEuJGRbYltlXV0pfX07U2suZXhwb3J0U3ltYm9sKFwiU2suaW1wb3J0TWFpblwiLFNrLmltcG9ydE1haW4pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydE1haW5XaXRoQm9keVwiLFNrLmltcG9ydE1haW5XaXRoQm9keSk7U2suZXhwb3J0U3ltYm9sKFwiU2suaW1wb3J0QnVpbHRpbldpdGhCb2R5XCIsU2suaW1wb3J0QnVpbHRpbldpdGhCb2R5KTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uX19pbXBvcnRfX1wiLFNrLmJ1aWx0aW4uX19pbXBvcnRfXyk7U2suZXhwb3J0U3ltYm9sKFwiU2suaW1wb3J0U3RhclwiLFNrLmltcG9ydFN0YXIpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4udGltU29ydD1mdW5jdGlvbihhLGMpe3RoaXMubGlzdD1uZXcgU2suYnVpbHRpbi5saXN0KGEudik7dGhpcy5NSU5fR0FMTE9QPTc7dGhpcy5saXN0bGVuZ3RoPWM/YzphLnNxJGxlbmd0aCgpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLmx0PWZ1bmN0aW9uKGEsYyl7cmV0dXJuIFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLGMsXCJMdFwiKX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5sZT1mdW5jdGlvbihhLGMpe3JldHVybiF0aGlzLmx0KGMsYSl9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUuc2V0aXRlbT1mdW5jdGlvbihhLGMpe3RoaXMubGlzdC52W2FdPWN9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUuYmluYXJ5X3NvcnQ9XG5mdW5jdGlvbihhLGMpe3ZhciBiO2ZvcihiPWEuYmFzZStjO2I8YS5iYXNlK2EubGVuO2IrKyl7dmFyIGU9YS5iYXNlO3ZhciBmPWI7Zm9yKGM9YS5nZXRpdGVtKGYpO2U8Zjspe3ZhciBsPWUrKGYtZT4+MSk7dGhpcy5sdChjLGEuZ2V0aXRlbShsKSk/Zj1sOmU9bCsxfVNrLmFzc2VydHMuYXNzZXJ0KGU9PT1mKTtmb3IobD1iO2w+ZTtsLS0pYS5zZXRpdGVtKGwsYS5nZXRpdGVtKGwtMSkpO2Euc2V0aXRlbShlLGMpfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5jb3VudF9ydW49ZnVuY3Rpb24oYSl7dmFyIGM7aWYoMT49YS5sZW4pe3ZhciBiPWEubGVuO3ZhciBlPSExfWVsc2UgaWYoYj0yLHRoaXMubHQoYS5nZXRpdGVtKGEuYmFzZSsxKSxhLmdldGl0ZW0oYS5iYXNlKSkpZm9yKGU9ITAsYz1hLmJhc2UrMjtjPGEuYmFzZSthLmxlbjtjKyspaWYodGhpcy5sdChhLmdldGl0ZW0oYyksYS5nZXRpdGVtKGMtMSkpKWIrKztlbHNlIGJyZWFrO2Vsc2UgZm9yKGU9ITEsYz1hLmJhc2UrXG4yO2M8YS5iYXNlK2EubGVuJiYhdGhpcy5sdChhLmdldGl0ZW0oYyksYS5nZXRpdGVtKGMtMSkpO2MrKyliKys7cmV0dXJue3J1bjpuZXcgU2suYnVpbHRpbi5saXN0U2xpY2UoYS5saXN0LGEuYmFzZSxiKSxkZXNjZW5kaW5nOmV9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLnNvcnQ9ZnVuY3Rpb24oKXt2YXIgYSxjPW5ldyBTay5idWlsdGluLmxpc3RTbGljZSh0aGlzLmxpc3QsMCx0aGlzLmxpc3RsZW5ndGgpO2lmKCEoMj5jLmxlbikpe3RoaXMubWVyZ2VfaW5pdCgpO2ZvcihhPXRoaXMubWVyZ2VfY29tcHV0ZV9taW5ydW4oYy5sZW4pOzA8Yy5sZW47KXt2YXIgYj10aGlzLmNvdW50X3J1bihjKTtiLmRlc2NlbmRpbmcmJmIucnVuLnJldmVyc2UoKTtpZihiLnJ1bi5sZW48YSl7dmFyIGU9Yi5ydW4ubGVuO2IucnVuLmxlbj1hPGMubGVuP2E6Yy5sZW47dGhpcy5iaW5hcnlfc29ydChiLnJ1bixlKX1jLmFkdmFuY2UoYi5ydW4ubGVuKTt0aGlzLnBlbmRpbmcucHVzaChiLnJ1bik7XG50aGlzLm1lcmdlX2NvbGxhcHNlKCl9U2suYXNzZXJ0cy5hc3NlcnQoYy5iYXNlPT10aGlzLmxpc3RsZW5ndGgpO3RoaXMubWVyZ2VfZm9yY2VfY29sbGFwc2UoKTtTay5hc3NlcnRzLmFzc2VydCgxPT10aGlzLnBlbmRpbmcubGVuZ3RoKTtTay5hc3NlcnRzLmFzc2VydCgwPT09dGhpcy5wZW5kaW5nWzBdLmJhc2UpO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMucGVuZGluZ1swXS5sZW49PXRoaXMubGlzdGxlbmd0aCl9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLmdhbGxvcD1mdW5jdGlvbihhLGMsYixlKXt2YXIgZjtTay5hc3NlcnRzLmFzc2VydCgwPD1iJiZiPGMubGVuKTt2YXIgbD10aGlzO2U9ZT9mdW5jdGlvbihhLGIpe3JldHVybiBsLmxlKGEsYil9OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGwubHQoYSxiKX07dmFyIGg9Yy5iYXNlK2I7dmFyIGQ9MDt2YXIgZz0xO2lmKGUoYy5nZXRpdGVtKGgpLGEpKXtmb3IoZj1jLmxlbi1iO2c8ZjspaWYoZShjLmdldGl0ZW0oaCtnKSxcbmEpKXtkPWc7dHJ5e2c9KGc8PDEpKzF9Y2F0Y2gobil7Zz1mfX1lbHNlIGJyZWFrO2c+ZiYmKGc9Zik7ZCs9YjtnKz1ifWVsc2V7Zm9yKGY9YisxO2c8ZiYmIWUoYy5nZXRpdGVtKGgtZyksYSk7KXtkPWc7dHJ5e2c9KGc8PDEpKzF9Y2F0Y2gobil7Zz1mfX1nPmYmJihnPWYpO2g9Yi1kO2Q9Yi1nO2c9aH1Tay5hc3NlcnRzLmFzc2VydCgtMTw9ZDxnPD1jLmxlbik7Zm9yKGQrPTE7ZDxnOyliPWQrKGctZD4+MSksZShjLmdldGl0ZW0oYy5iYXNlK2IpLGEpP2Q9YisxOmc9YjtTay5hc3NlcnRzLmFzc2VydChkPT1nKTtyZXR1cm4gZ307U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5tZXJnZV9pbml0PWZ1bmN0aW9uKCl7dGhpcy5taW5fZ2FsbG9wPXRoaXMuTUlOX0dBTExPUDt0aGlzLnBlbmRpbmc9W119O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfbG89ZnVuY3Rpb24oYSxjKXt2YXIgYixlLGY7U2suYXNzZXJ0cy5hc3NlcnQoMDxhLmxlbiYmMDxjLmxlbiYmYS5iYXNlK1xuYS5sZW49PWMuYmFzZSk7dmFyIGw9dGhpcy5taW5fZ2FsbG9wO3ZhciBoPWEuYmFzZTthPWEuY29weWl0ZW1zKCk7dHJ5e2lmKHRoaXMuc2V0aXRlbShoLGMucG9wbGVmdCgpKSxoKyssMSE9YS5sZW4mJjAhPT1jLmxlbilmb3IoOzspe2ZvcihlPWI9MDs7KWlmKHRoaXMubHQoYy5nZXRpdGVtKGMuYmFzZSksYS5nZXRpdGVtKGEuYmFzZSkpKXt0aGlzLnNldGl0ZW0oaCxjLnBvcGxlZnQoKSk7aCsrO2lmKDA9PT1jLmxlbilyZXR1cm47ZSsrO2I9MDtpZihlPj1sKWJyZWFrfWVsc2V7dGhpcy5zZXRpdGVtKGgsYS5wb3BsZWZ0KCkpO2grKztpZigxPT1hLmxlbilyZXR1cm47YisrO2U9MDtpZihiPj1sKWJyZWFrfWZvcihsKz0xOzspe3RoaXMubWluX2dhbGxvcD1sLT0xPGw7Yj10aGlzLmdhbGxvcChjLmdldGl0ZW0oYy5iYXNlKSxhLDAsITApO2ZvcihmPWEuYmFzZTtmPGEuYmFzZStiO2YrKyl0aGlzLnNldGl0ZW0oaCxhLmdldGl0ZW0oZikpLGgrKzthLmFkdmFuY2UoYik7aWYoMT49XG5hLmxlbilyZXR1cm47dGhpcy5zZXRpdGVtKGgsYy5wb3BsZWZ0KCkpO2grKztpZigwPT09Yy5sZW4pcmV0dXJuO2U9dGhpcy5nYWxsb3AoYS5nZXRpdGVtKGEuYmFzZSksYywwLCExKTtmb3IoZj1jLmJhc2U7ZjxjLmJhc2UrZTtmKyspdGhpcy5zZXRpdGVtKGgsYy5nZXRpdGVtKGYpKSxoKys7Yy5hZHZhbmNlKGUpO2lmKDA9PT1jLmxlbilyZXR1cm47dGhpcy5zZXRpdGVtKGgsYS5wb3BsZWZ0KCkpO2grKztpZigxPT1hLmxlbilyZXR1cm47aWYoYjx0aGlzLk1JTl9HQUxMT1AmJmU8dGhpcy5NSU5fR0FMTE9QKWJyZWFrO2wrKzt0aGlzLm1pbl9nYWxsb3A9bH19fWZpbmFsbHl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YS5sZW4mJjA8PWMubGVuKTtmb3IoZj1jLmJhc2U7ZjxjLmJhc2UrYy5sZW47ZisrKXRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSksaCsrO2ZvcihmPWEuYmFzZTtmPGEuYmFzZSthLmxlbjtmKyspdGhpcy5zZXRpdGVtKGgsYS5nZXRpdGVtKGYpKSxoKyt9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2hpPVxuZnVuY3Rpb24oYSxjKXt2YXIgYixlLGY7U2suYXNzZXJ0cy5hc3NlcnQoMDxhLmxlbiYmMDxjLmxlbiYmYS5iYXNlK2EubGVuPT1jLmJhc2UpO3ZhciBsPXRoaXMubWluX2dhbGxvcDt2YXIgaD1jLmJhc2UrYy5sZW47Yz1jLmNvcHlpdGVtcygpO3RyeXtpZihoLS0sdGhpcy5zZXRpdGVtKGgsYS5wb3ByaWdodCgpKSwwIT09YS5sZW4mJjEhPWMubGVuKWZvcig7Oyl7Zm9yKGU9Yj0wOzspe3ZhciBkPWEuZ2V0aXRlbShhLmJhc2UrYS5sZW4tMSk7dmFyIGc9Yy5nZXRpdGVtKGMuYmFzZStjLmxlbi0xKTtpZih0aGlzLmx0KGcsZCkpe2gtLTt0aGlzLnNldGl0ZW0oaCxkKTthLmxlbi0tO2lmKDA9PT1hLmxlbilyZXR1cm47YisrO2U9MDtpZihiPj1sKWJyZWFrfWVsc2V7aC0tO3RoaXMuc2V0aXRlbShoLGcpO2MubGVuLS07aWYoMT09Yy5sZW4pcmV0dXJuO2UrKztiPTA7aWYoZT49bClicmVha319Zm9yKGwrPTE7Oyl7dGhpcy5taW5fZ2FsbG9wPWwtPTE8bDtnPWMuZ2V0aXRlbShjLmJhc2UrXG5jLmxlbi0xKTt2YXIgbT10aGlzLmdhbGxvcChnLGEsYS5sZW4tMSwhMCk7Yj1hLmxlbi1tO2ZvcihmPWEuYmFzZSthLmxlbi0xO2Y+YS5iYXNlK20tMTtmLS0paC0tLHRoaXMuc2V0aXRlbShoLGEuZ2V0aXRlbShmKSk7YS5sZW4tPWI7aWYoMD09PWEubGVuKXJldHVybjtoLS07dGhpcy5zZXRpdGVtKGgsYy5wb3ByaWdodCgpKTtpZigxPT1jLmxlbilyZXR1cm47ZD1hLmdldGl0ZW0oYS5iYXNlK2EubGVuLTEpO209dGhpcy5nYWxsb3AoZCxjLGMubGVuLTEsITEpO2U9Yy5sZW4tbTtmb3IoZj1jLmJhc2UrYy5sZW4tMTtmPmMuYmFzZSttLTE7Zi0tKWgtLSx0aGlzLnNldGl0ZW0oaCxjLmdldGl0ZW0oZikpO2MubGVuLT1lO2lmKDE+PWMubGVuKXJldHVybjtoLS07dGhpcy5zZXRpdGVtKGgsYS5wb3ByaWdodCgpKTtpZigwPT09YS5sZW4pcmV0dXJuO2lmKGI8dGhpcy5NSU5fR0FMTE9QJiZlPHRoaXMuTUlOX0dBTExPUClicmVhaztsKys7dGhpcy5taW5fZ2FsbG9wPWx9fX1maW5hbGx5e1NrLmFzc2VydHMuYXNzZXJ0KDA8PVxuYS5sZW4mJjA8PWMubGVuKTtmb3IoZj1hLmJhc2UrYS5sZW4tMTtmPmEuYmFzZS0xO2YtLSloLS0sdGhpcy5zZXRpdGVtKGgsYS5nZXRpdGVtKGYpKTtmb3IoZj1jLmJhc2UrYy5sZW4tMTtmPmMuYmFzZS0xO2YtLSloLS0sdGhpcy5zZXRpdGVtKGgsYy5nZXRpdGVtKGYpKX19O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfYXQ9ZnVuY3Rpb24oYSl7MD5hJiYoYT10aGlzLnBlbmRpbmcubGVuZ3RoK2EpO3ZhciBjPXRoaXMucGVuZGluZ1thXTt2YXIgYj10aGlzLnBlbmRpbmdbYSsxXTtTay5hc3NlcnRzLmFzc2VydCgwPGMubGVuJiYwPGIubGVuKTtTay5hc3NlcnRzLmFzc2VydChjLmJhc2UrYy5sZW49PWIuYmFzZSk7dGhpcy5wZW5kaW5nW2FdPW5ldyBTay5idWlsdGluLmxpc3RTbGljZSh0aGlzLmxpc3QsYy5iYXNlLGMubGVuK2IubGVuKTt0aGlzLnBlbmRpbmcuc3BsaWNlKGErMSwxKTthPXRoaXMuZ2FsbG9wKGIuZ2V0aXRlbShiLmJhc2UpLGMsMCwhMCk7Yy5hZHZhbmNlKGEpO1xuMCE9PWMubGVuJiYoYi5sZW49dGhpcy5nYWxsb3AoYy5nZXRpdGVtKGMuYmFzZStjLmxlbi0xKSxiLGIubGVuLTEsITEpLDAhPT1iLmxlbiYmKGMubGVuPD1iLmxlbj90aGlzLm1lcmdlX2xvKGMsYik6dGhpcy5tZXJnZV9oaShjLGIpKSl9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfY29sbGFwc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5wZW5kaW5nOzE8YS5sZW5ndGg7KWlmKDM8PWEubGVuZ3RoJiZhW2EubGVuZ3RoLTNdLmxlbjw9YVthLmxlbmd0aC0yXS5sZW4rYVthLmxlbmd0aC0xXS5sZW4pYVthLmxlbmd0aC0zXS5sZW48YVthLmxlbmd0aC0xXS5sZW4/dGhpcy5tZXJnZV9hdCgtMyk6dGhpcy5tZXJnZV9hdCgtMik7ZWxzZSBpZihhW2EubGVuZ3RoLTJdLmxlbjw9YVthLmxlbmd0aC0xXS5sZW4pdGhpcy5tZXJnZV9hdCgtMik7ZWxzZSBicmVha307U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5tZXJnZV9mb3JjZV9jb2xsYXBzZT1mdW5jdGlvbigpe2Zvcih2YXIgYT1cbnRoaXMucGVuZGluZzsxPGEubGVuZ3RoOykzPD1hLmxlbmd0aCYmYVthLmxlbmd0aC0zXS5sZW48YVthLmxlbmd0aC0xXS5sZW4/dGhpcy5tZXJnZV9hdCgtMyk6dGhpcy5tZXJnZV9hdCgtMil9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfY29tcHV0ZV9taW5ydW49ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7NjQ8PWE7KWN8PWEmMSxhPj49MTtyZXR1cm4gYStjfTtTay5idWlsdGluLmxpc3RTbGljZT1mdW5jdGlvbihhLGMsYil7dGhpcy5saXN0PWE7dGhpcy5iYXNlPWM7dGhpcy5sZW49Yn07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLmNvcHlpdGVtcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYmFzZSxjPXRoaXMuYmFzZSt0aGlzLmxlbjtTay5hc3NlcnRzLmFzc2VydCgwPD1hPD1jKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdFNsaWNlKG5ldyBTay5idWlsdGluLmxpc3QodGhpcy5saXN0LnYuc2xpY2UoYSxjKSksMCx0aGlzLmxlbil9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5hZHZhbmNlPVxuZnVuY3Rpb24oYSl7dGhpcy5iYXNlKz1hO3RoaXMubGVuLT1hO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMuYmFzZTw9dGhpcy5saXN0LnNxJGxlbmd0aCgpKX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLmdldGl0ZW09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubGlzdC52W2FdfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUuc2V0aXRlbT1mdW5jdGlvbihhLGMpe3RoaXMubGlzdC52W2FdPWN9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5wb3BsZWZ0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5saXN0LnZbdGhpcy5iYXNlXTt0aGlzLmJhc2UrKzt0aGlzLmxlbi0tO3JldHVybiBhfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUucG9wcmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLmxlbi0tO3JldHVybiB0aGlzLmxpc3Qudlt0aGlzLmJhc2UrdGhpcy5sZW5dfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2Zvcih2YXIgYSxcbmMsYj10aGlzLmxpc3QsZT10aGlzLmJhc2UsZj1lK3RoaXMubGVuLTE7ZTxmOylhPWIudltmXSxjPWIudltlXSxiLnZbZV09YSxiLnZbZl09YyxlKyssZi0tfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmxpc3RTbGljZVwiLFNrLmJ1aWx0aW4ubGlzdFNsaWNlKTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLnRpbVNvcnRcIixTay5idWlsdGluLnRpbVNvcnQpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc3VwZXJfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJzdXBlclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLnN1cGVyXyxcImJhZCBjYWxsIHRvIHN1cGVyLCB1c2UgJ25ldydcIik7dGhpcy50eXBlPWE7dGhpcy5vYmo9YztpZih2b2lkIDAhPT1hJiYhU2suYnVpbHRpbi5jaGVja0NsYXNzKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm11c3QgYmUgdHlwZSwgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoYSkpO3RoaXMub2JqX3R5cGU9dm9pZCAwIT09dGhpcy5vYmo/dGhpcy4kc3VwZXJjaGVjayhhLHRoaXMub2JqKTpudWxsfSxzbG90czp7dHAkZG9jOlwic3VwZXIoKSAtPiBzYW1lIGFzIHN1cGVyKF9fY2xhc3NfXywgPGZpcnN0IGFyZ3VtZW50PilcXG5zdXBlcih0eXBlKSAtPiB1bmJvdW5kIHN1cGVyIG9iamVjdFxcbnN1cGVyKHR5cGUsIG9iaikgLT4gYm91bmQgc3VwZXIgb2JqZWN0OyByZXF1aXJlcyBpc2luc3RhbmNlKG9iaiwgdHlwZSlcXG5zdXBlcih0eXBlLCB0eXBlMikgLT4gYm91bmQgc3VwZXIgb2JqZWN0OyByZXF1aXJlcyBpc3N1YmNsYXNzKHR5cGUyLCB0eXBlKVxcblR5cGljYWwgdXNlIHRvIGNhbGwgYSBjb29wZXJhdGl2ZSBzdXBlcmNsYXNzIG1ldGhvZDpcXG5jbGFzcyBDKEIpOlxcbiAgICBkZWYgbWV0aChzZWxmLCBhcmcpOlxcbiAgICAgICAgc3VwZXIoKS5tZXRoKGFyZylcXG5UaGlzIHdvcmtzIGZvciBjbGFzcyBtZXRob2RzIHRvbzpcXG5jbGFzcyBDKEIpOlxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIGNtZXRoKGNscywgYXJnKTpcXG4gICAgICAgIHN1cGVyKCkuY21ldGgoYXJnKVxcblwiLFxudHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic3VwZXJcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJzdXBlclwiLGEsMSwyKTtjPWFbMF07YT1hWzFdO2lmKCFTay5idWlsdGluLmNoZWNrQ2xhc3MoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibXVzdCBiZSB0eXBlLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpO3RoaXMub2JqPWE7dGhpcy50eXBlPWM7bnVsbCE9dGhpcy5vYmomJih0aGlzLm9ial90eXBlPXRoaXMuJHN1cGVyY2hlY2soYyx0aGlzLm9iaikpfSwkcigpe3JldHVybiB0aGlzLm9iaj9uZXcgU2suYnVpbHRpbi5zdHIoXCI8c3VwZXI6IDxjbGFzcyAnXCIrdGhpcy50eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJz4sIDxcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzLm9iaikrXCIgb2JqZWN0Pj5cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPHN1cGVyOiA8Y2xhc3MgJ1wiK3RoaXMudHlwZS5wcm90b3R5cGUudHAkbmFtZStcblwiJz4sIE5VTEw+XCIpfSx0cCRnZXRhdHRyKGEsYyl7bGV0IGI9dGhpcy5vYmpfdHlwZTtpZihudWxsPT1iKXJldHVybiBTay5nZW5lcmljLmdldEF0dHIuY2FsbCh0aGlzLGEsYyk7dmFyIGU9Yi5wcm90b3R5cGUudHAkbXJvO2NvbnN0IGY9ZS5sZW5ndGg7aWYoYT09PVNrLmJ1aWx0aW4uc3RyLiRjbGFzcylyZXR1cm4gU2suZ2VuZXJpYy5nZXRBdHRyLmNhbGwodGhpcyxhLGMpO2xldCBsO2ZvcihsPTA7bCsxPGYmJnRoaXMudHlwZSE9PWVbbF07bCsrKTtsKys7aWYobD49ZilyZXR1cm4gU2suZ2VuZXJpYy5nZXRBdHRyLmNhbGwodGhpcyxhLGMpO2E9YS4kbWFuZ2xlZDtsZXQgaDtmb3IoO2w8Zjspe2M9ZVtsXS5wcm90b3R5cGU7Yy5oYXNPd25Qcm9wZXJ0eShhKSYmKGg9Y1thXSk7aWYodm9pZCAwIT09aClyZXR1cm4gZT1oLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1lJiYoaD1lLmNhbGwoaCx0aGlzLm9iaj09PWI/bnVsbDp0aGlzLm9iaixiKSksaDtsKyt9fSx0cCRkZXNjcl9nZXQoYSxcbmMpe2lmKG51bGw9PT1hfHxudWxsIT10aGlzLm9iailyZXR1cm4gdGhpcztpZih0aGlzLm9iJHR5cGUhPT1Tay5idWlsdGluLnN1cGVyXylyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KHRoaXMub2IkdHlwZSxbdGhpcy50eXBlLGFdKTt7Yz10aGlzLiRzdXBlcmNoZWNrKHRoaXMudHlwZSxhKTtjb25zdCBiPW5ldyBTay5idWlsdGluLnN1cGVyXztiLnR5cGU9dGhpcy50eXBlO2Iub2JqPWE7Yi5vYmpfdHlwZT1jO3JldHVybiBifX19LGdldHNldHM6e19fdGhpc2NsYXNzX186eyRnZXQoKXtyZXR1cm4gdGhpcy50eXBlfSwkZG9jOlwidGhlIGNsYXNzIGludm9raW5nIHN1cGVyKClcIn0sX19zZWxmX186eyRnZXQoKXtyZXR1cm4gdGhpcy5vYmp8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGRvYzpcInRoZSBpbnN0YW5jZSBpbnZva2luZyBzdXBlcigpOyBtYXkgYmUgTm9uZVwifSxfX3NlbGZfY2xhc3NfXzp7JGdldCgpe3JldHVybiB0aGlzLm9ial90eXBlfHxTay5idWlsdGluLm5vbmUubm9uZSR9LFxuJGRvYzpcInRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSBpbnZva2luZyBzdXBlcigpOyBtYXkgYmUgTm9uZVwifX0scHJvdG86eyRzdXBlcmNoZWNrKGEsYyl7aWYoU2suYnVpbHRpbi5jaGVja0NsYXNzKGMpJiZjLiRpc1N1YlR5cGUoYSkpcmV0dXJuIGM7aWYoYy5vYiR0eXBlLiRpc1N1YlR5cGUoYSkpcmV0dXJuIGMub2IkdHlwZTt7Y29uc3QgYj1jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGNsYXNzKTtpZih2b2lkIDAhPT1iJiZiIT09Yy5vYiR0eXBlJiZTay5idWlsdGluLmNoZWNrQ2xhc3MoYikmJmIuJGlzU3ViVHlwZShhKSlyZXR1cm4gYn10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdXBlcih0eXBlLCBvYmopOiBvYmogbXVzdCBiZSBhbiBpbnN0YW5jZSBvciBzdWJ0eXBlIG9mIHR5cGVcIik7fX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGlucz17cm91bmQ6bnVsbCxsZW46bnVsbCxtaW46bnVsbCxtYXg6bnVsbCxzdW06bnVsbCxhYnM6bnVsbCxmYWJzOm51bGwsXG5vcmQ6bnVsbCxjaHI6bnVsbCxoZXg6bnVsbCxvY3Q6bnVsbCxiaW46bnVsbCxkaXI6bnVsbCxyZXByOm51bGwsb3BlbjpudWxsLGlzaW5zdGFuY2U6bnVsbCxoYXNoOm51bGwsZ2V0YXR0cjpudWxsLGhhc2F0dHI6bnVsbCxpZDpudWxsLHJlZHVjZTpuZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4ucmVkdWNlKSxzb3J0ZWQ6bnVsbCxhbnk6bnVsbCxhbGw6bnVsbCxlbnVtZXJhdGU6U2suYnVpbHRpbi5lbnVtZXJhdGUsZmlsdGVyOlNrLmJ1aWx0aW4uZmlsdGVyXyxtYXA6U2suYnVpbHRpbi5tYXBfLHJhbmdlOlNrLmJ1aWx0aW4ucmFuZ2VfLHJldmVyc2VkOlNrLmJ1aWx0aW4ucmV2ZXJzZWQsemlwOlNrLmJ1aWx0aW4uemlwXyxCYXNlRXhjZXB0aW9uOlNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbixBdHRyaWJ1dGVFcnJvcjpTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yLFZhbHVlRXJyb3I6U2suYnVpbHRpbi5WYWx1ZUVycm9yLEV4Y2VwdGlvbjpTay5idWlsdGluLkV4Y2VwdGlvbixcblplcm9EaXZpc2lvbkVycm9yOlNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IsQXNzZXJ0aW9uRXJyb3I6U2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcixJbXBvcnRFcnJvcjpTay5idWlsdGluLkltcG9ydEVycm9yLEluZGVudGF0aW9uRXJyb3I6U2suYnVpbHRpbi5JbmRlbnRhdGlvbkVycm9yLEluZGV4RXJyb3I6U2suYnVpbHRpbi5JbmRleEVycm9yLExvb2t1cEVycm9yOlNrLmJ1aWx0aW4uTG9va3VwRXJyb3IsS2V5RXJyb3I6U2suYnVpbHRpbi5LZXlFcnJvcixUeXBlRXJyb3I6U2suYnVpbHRpbi5UeXBlRXJyb3IsVW5pY29kZURlY29kZUVycm9yOlNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yLFVuaWNvZGVFbmNvZGVFcnJvcjpTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcixOYW1lRXJyb3I6U2suYnVpbHRpbi5OYW1lRXJyb3IsSU9FcnJvcjpTay5idWlsdGluLklPRXJyb3IsTm90SW1wbGVtZW50ZWRFcnJvcjpTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IsXG5TeXN0ZW1FeGl0OlNrLmJ1aWx0aW4uU3lzdGVtRXhpdCxPdmVyZmxvd0Vycm9yOlNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixPcGVyYXRpb25FcnJvcjpTay5idWlsdGluLk9wZXJhdGlvbkVycm9yLE5lZ2F0aXZlUG93ZXJFcnJvcjpTay5idWlsdGluLk5lZ2F0aXZlUG93ZXJFcnJvcixSdW50aW1lRXJyb3I6U2suYnVpbHRpbi5SdW50aW1lRXJyb3IsUmVjdXJzaW9uRXJyb3I6U2suYnVpbHRpbi5SZWN1cnNpb25FcnJvcixTdG9wSXRlcmF0aW9uOlNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbixTeW50YXhFcnJvcjpTay5idWlsdGluLlN5bnRheEVycm9yLFN5c3RlbUVycm9yOlNrLmJ1aWx0aW4uU3lzdGVtRXJyb3IsZmxvYXRfJHJ3JDpTay5idWlsdGluLmZsb2F0XyxpbnRfJHJ3JDpTay5idWlsdGluLmludF8sYm9vbDpTay5idWlsdGluLmJvb2wsY29tcGxleDpTay5idWlsdGluLmNvbXBsZXgsZGljdDpTay5idWlsdGluLmRpY3QsZmlsZTpTay5idWlsdGluLmZpbGUsZnJvemVuc2V0OlNrLmJ1aWx0aW4uZnJvemVuc2V0LFxuXCJmdW5jdGlvblwiOlNrLmJ1aWx0aW4uZnVuYyxnZW5lcmF0b3I6U2suYnVpbHRpbi5nZW5lcmF0b3IsbGlzdDpTay5idWlsdGluLmxpc3QsbG9uZ18kcnckOlNrLmJ1aWx0aW4ubG5nLG1ldGhvZDpTay5idWlsdGluLm1ldGhvZCxvYmplY3Q6U2suYnVpbHRpbi5vYmplY3Qsc2xpY2U6U2suYnVpbHRpbi5zbGljZSxzdHI6U2suYnVpbHRpbi5zdHIsc2V0OlNrLmJ1aWx0aW4uc2V0LHR1cGxlOlNrLmJ1aWx0aW4udHVwbGUsdHlwZTpTay5idWlsdGluLnR5cGUsaW5wdXQ6bnVsbCxyYXdfaW5wdXQ6bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLnJhd19pbnB1dCksc2V0YXR0cjpudWxsLGpzZXZhbDpTay5idWlsdGluLmpzZXZhbCxqc21pbGxpczpTay5idWlsdGluLmpzbWlsbGlzLHF1aXQ6bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLnF1aXQpLGV4aXQ6bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLnF1aXQpLHByaW50Om51bGwsZGl2bW9kOm51bGwsZm9ybWF0Om51bGwsXG5nbG9iYWxzOm51bGwsaXNzdWJjbGFzczpudWxsLGl0ZXI6bnVsbCxleGVjZmlsZTpTay5idWlsdGluLmV4ZWNmaWxlLGhlbHA6U2suYnVpbHRpbi5oZWxwLG1lbW9yeXZpZXc6U2suYnVpbHRpbi5tZW1vcnl2aWV3LHJlbG9hZDpTay5idWlsdGluLnJlbG9hZCxzdXBlcl8kcnckOlNrLmJ1aWx0aW4uc3VwZXJfLHVuaWNocjpTay5idWlsdGluLnVuaWNocix2YXJzOlNrLmJ1aWx0aW4udmFycyxhcHBseV8kcnckOlNrLmJ1aWx0aW4uYXBwbHlfLGJ1ZmZlcjpTay5idWlsdGluLmJ1ZmZlcixjb2VyY2U6U2suYnVpbHRpbi5jb2VyY2UsaW50ZXJuOlNrLmJ1aWx0aW4uaW50ZXJuLHByb3BlcnR5OlNrLmJ1aWx0aW4ucHJvcGVydHksY2xhc3NtZXRob2Q6U2suYnVpbHRpbi5jbGFzc21ldGhvZCxzdGF0aWNtZXRob2Q6U2suYnVpbHRpbi5zdGF0aWNtZXRob2R9O1NrLmFic3RyLnNldFVwTW9kdWxlTWV0aG9kcyhcImJ1aWx0aW5zXCIsU2suYnVpbHRpbnMse19faW1wb3J0X186eyRtZXRoOlNrLmJ1aWx0aW4uX19pbXBvcnRfXyxcbiRmbGFnczp7TmFtZWRBcmdzOltcIm5hbWVcIixcImdsb2JhbHNcIixcImxvY2Fsc1wiLFwiZnJvbWxpc3RcIixcImxldmVsXCJdfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJfX2ltcG9ydF9fKG5hbWUsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUsIGZyb21saXN0PSgpLCBsZXZlbD0wKSAtPiBtb2R1bGVcXG5cXG5JbXBvcnQgYSBtb2R1bGUuIEJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBtZWFudCBmb3IgdXNlIGJ5IHRoZSBQeXRob25cXG5pbnRlcnByZXRlciBhbmQgbm90IGZvciBnZW5lcmFsIHVzZSwgaXQgaXMgYmV0dGVyIHRvIHVzZVxcbmltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkgdG8gcHJvZ3JhbW1hdGljYWxseSBpbXBvcnQgYSBtb2R1bGUuXFxuXFxuVGhlIGdsb2JhbHMgYXJndW1lbnQgaXMgb25seSB1c2VkIHRvIGRldGVybWluZSB0aGUgY29udGV4dDtcXG50aGV5IGFyZSBub3QgbW9kaWZpZWQuICBUaGUgbG9jYWxzIGFyZ3VtZW50IGlzIHVudXNlZC4gIFRoZSBmcm9tbGlzdFxcbnNob3VsZCBiZSBhIGxpc3Qgb2YgbmFtZXMgdG8gZW11bGF0ZSBgYGZyb20gbmFtZSBpbXBvcnQgLi4uJycsIG9yIGFuXFxuZW1wdHkgbGlzdCB0byBlbXVsYXRlIGBgaW1wb3J0IG5hbWUnJy5cXG5XaGVuIGltcG9ydGluZyBhIG1vZHVsZSBmcm9tIGEgcGFja2FnZSwgbm90ZSB0aGF0IF9faW1wb3J0X18oJ0EuQicsIC4uLilcXG5yZXR1cm5zIHBhY2thZ2UgQSB3aGVuIGZyb21saXN0IGlzIGVtcHR5LCBidXQgaXRzIHN1Ym1vZHVsZSBCIHdoZW5cXG5mcm9tbGlzdCBpcyBub3QgZW1wdHkuICBUaGUgbGV2ZWwgYXJndW1lbnQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0b1xcbnBlcmZvcm0gYWJzb2x1dGUgb3IgcmVsYXRpdmUgaW1wb3J0czogMCBpcyBhYnNvbHV0ZSwgd2hpbGUgYSBwb3NpdGl2ZSBudW1iZXJcXG5pcyB0aGUgbnVtYmVyIG9mIHBhcmVudCBkaXJlY3RvcmllcyB0byBzZWFyY2ggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbW9kdWxlLlwifSxcbmFiczp7JG1ldGg6U2suYnVpbHRpbi5hYnMsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHgsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50LlwifSxhbGw6eyRtZXRoOlNrLmJ1aWx0aW4uYWxsLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgYm9vbCh4KSBpcyBUcnVlIGZvciBhbGwgdmFsdWVzIHggaW4gdGhlIGl0ZXJhYmxlLlxcblxcbklmIHRoZSBpdGVyYWJsZSBpcyBlbXB0eSwgcmV0dXJuIFRydWUuXCJ9LGFueTp7JG1ldGg6U2suYnVpbHRpbi5hbnksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiBib29sKHgpIGlzIFRydWUgZm9yIGFueSB4IGluIHRoZSBpdGVyYWJsZS5cXG5cXG5JZiB0aGUgaXRlcmFibGUgaXMgZW1wdHksIHJldHVybiBGYWxzZS5cIn0sXG5hc2NpaTp7JG1ldGg6U2suYnVpbHRpbi5hc2NpaSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCAvKVwiLCRkb2M6XCJSZXR1cm4gYW4gQVNDSUktb25seSByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuXFxuXFxuQXMgcmVwcigpLCByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiBhblxcbm9iamVjdCwgYnV0IGVzY2FwZSB0aGUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyByZXR1cm5lZCBieVxcbnJlcHIoKSB1c2luZyBcXFxcXFxcXHgsIFxcXFxcXFxcdSBvciBcXFxcXFxcXFUgZXNjYXBlcy4gVGhpcyBnZW5lcmF0ZXMgYSBzdHJpbmcgc2ltaWxhclxcbnRvIHRoYXQgcmV0dXJuZWQgYnkgcmVwcigpIGluIFB5dGhvbiAyLlwifSxiaW46eyRtZXRoOlNrLmJ1aWx0aW4uYmluLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBudW1iZXIsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IGJpbigyNzk2MjAyKVxcbiAgICcwYjEwMTAxMDEwMTAxMDEwMTAxMDEwMTAnXCJ9LFxuY2FsbGFibGU6eyRtZXRoOlNrLmJ1aWx0aW4uY2FsbGFibGUsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHdoZXRoZXIgdGhlIG9iamVjdCBpcyBjYWxsYWJsZSAoaS5lLiwgc29tZSBraW5kIG9mIGZ1bmN0aW9uKS5cXG5cXG5Ob3RlIHRoYXQgY2xhc3NlcyBhcmUgY2FsbGFibGUsIGFzIGFyZSBpbnN0YW5jZXMgb2YgY2xhc3NlcyB3aXRoIGFcXG5fX2NhbGxfXygpIG1ldGhvZC5cIn0sY2hyOnskbWV0aDpTay5idWlsdGluLmNociwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgVW5pY29kZSBzdHJpbmcgb2Ygb25lIGNoYXJhY3RlciB3aXRoIG9yZGluYWwgaTsgMCA8PSBpIDw9IDB4MTBmZmZmLlwifSxkZWxhdHRyOnskbWV0aDpTay5idWlsdGluLmRlbGF0dHIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIG5hbWUsIC8pXCIsXG4kZG9jOlwiRGVsZXRlcyB0aGUgbmFtZWQgYXR0cmlidXRlIGZyb20gdGhlIGdpdmVuIG9iamVjdC5cXG5cXG5kZWxhdHRyKHgsICd5JykgaXMgZXF1aXZhbGVudCB0byBgYGRlbCB4LnknJ1wifSxkaXI6eyRtZXRoOlNrLmJ1aWx0aW4uZGlyLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiZGlyKFtvYmplY3RdKSAtPiBsaXN0IG9mIHN0cmluZ3NcXG5cXG5JZiBjYWxsZWQgd2l0aG91dCBhbiBhcmd1bWVudCwgcmV0dXJuIHRoZSBuYW1lcyBpbiB0aGUgY3VycmVudCBzY29wZS5cXG5FbHNlLCByZXR1cm4gYW4gYWxwaGFiZXRpemVkIGxpc3Qgb2YgbmFtZXMgY29tcHJpc2luZyAoc29tZSBvZikgdGhlIGF0dHJpYnV0ZXNcXG5vZiB0aGUgZ2l2ZW4gb2JqZWN0LCBhbmQgb2YgYXR0cmlidXRlcyByZWFjaGFibGUgZnJvbSBpdC5cXG5JZiB0aGUgb2JqZWN0IHN1cHBsaWVzIGEgbWV0aG9kIG5hbWVkIF9fZGlyX18sIGl0IHdpbGwgYmUgdXNlZDsgb3RoZXJ3aXNlXFxudGhlIGRlZmF1bHQgZGlyKCkgbG9naWMgaXMgdXNlZCBhbmQgcmV0dXJuczpcXG4gIGZvciBhIG1vZHVsZSBvYmplY3Q6IHRoZSBtb2R1bGUncyBhdHRyaWJ1dGVzLlxcbiAgZm9yIGEgY2xhc3Mgb2JqZWN0OiAgaXRzIGF0dHJpYnV0ZXMsIGFuZCByZWN1cnNpdmVseSB0aGUgYXR0cmlidXRlc1xcbiAgICBvZiBpdHMgYmFzZXMuXFxuICBmb3IgYW55IG90aGVyIG9iamVjdDogaXRzIGF0dHJpYnV0ZXMsIGl0cyBjbGFzcydzIGF0dHJpYnV0ZXMsIGFuZFxcbiAgICByZWN1cnNpdmVseSB0aGUgYXR0cmlidXRlcyBvZiBpdHMgY2xhc3MncyBiYXNlIGNsYXNzZXMuXCJ9LFxuZGl2bW9kOnskbWV0aDpTay5idWlsdGluLmRpdm1vZCwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHgsIHksIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgdHVwbGUgKHgvL3ksIHgleSkuICBJbnZhcmlhbnQ6IGRpdip5ICsgbW9kID09IHguXCJ9LGV2YWxfJHJ3JDp7JG5hbWU6XCJldmFsXCIsJG1ldGg6U2suYnVpbHRpbi5ldmFsXywkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHNvdXJjZSwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSwgLylcIiwkZG9jOlwiRXZhbHVhdGUgdGhlIGdpdmVuIHNvdXJjZSBpbiB0aGUgY29udGV4dCBvZiBnbG9iYWxzIGFuZCBsb2NhbHMuXFxuXFxuVGhlIHNvdXJjZSBtYXkgYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgUHl0aG9uIGV4cHJlc3Npb25cXG5vciBhIGNvZGUgb2JqZWN0IGFzIHJldHVybmVkIGJ5IGNvbXBpbGUoKS5cXG5UaGUgZ2xvYmFscyBtdXN0IGJlIGEgZGljdGlvbmFyeSBhbmQgbG9jYWxzIGNhbiBiZSBhbnkgbWFwcGluZyxcXG5kZWZhdWx0aW5nIHRvIHRoZSBjdXJyZW50IGdsb2JhbHMgYW5kIGxvY2Fscy5cXG5JZiBvbmx5IGdsb2JhbHMgaXMgZ2l2ZW4sIGxvY2FscyBkZWZhdWx0cyB0byBpdC5cIn0sXG5mb3JtYXQ6eyRtZXRoOlNrLmJ1aWx0aW4uZm9ybWF0LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgdmFsdWUsIGZvcm1hdF9zcGVjPScnLCAvKVwiLCRkb2M6XCJSZXR1cm4gdmFsdWUuX19mb3JtYXRfXyhmb3JtYXRfc3BlYylcXG5cXG5mb3JtYXRfc3BlYyBkZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLlxcblNlZSB0aGUgRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSBzZWN0aW9uIG9mIGhlbHAoJ0ZPUk1BVFRJTkcnKSBmb3JcXG5kZXRhaWxzLlwifSxnZXRhdHRyOnskbWV0aDpTay5idWlsdGluLmdldGF0dHIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJnZXRhdHRyKG9iamVjdCwgbmFtZVssIGRlZmF1bHRdKSAtPiB2YWx1ZVxcblxcbkdldCBhIG5hbWVkIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdDsgZ2V0YXR0cih4LCAneScpIGlzIGVxdWl2YWxlbnQgdG8geC55LlxcbldoZW4gYSBkZWZhdWx0IGFyZ3VtZW50IGlzIGdpdmVuLCBpdCBpcyByZXR1cm5lZCB3aGVuIHRoZSBhdHRyaWJ1dGUgZG9lc24ndFxcbmV4aXN0OyB3aXRob3V0IGl0LCBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGluIHRoYXQgY2FzZS5cIn0sXG5nbG9iYWxzOnskbWV0aDpTay5idWlsdGluLmdsb2JhbHMsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjdXJyZW50IHNjb3BlJ3MgZ2xvYmFsIHZhcmlhYmxlcy5cXG5cXG5OT1RFOiBVcGRhdGVzIHRvIHRoaXMgZGljdGlvbmFyeSAqd2lsbCogYWZmZWN0IG5hbWUgbG9va3VwcyBpbiB0aGUgY3VycmVudFxcbmdsb2JhbCBzY29wZSBhbmQgdmljZS12ZXJzYS5cIn0saGFzYXR0cjp7JG1ldGg6U2suYnVpbHRpbi5oYXNhdHRyLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCBuYW1lLCAvKVwiLCRkb2M6XCJSZXR1cm4gd2hldGhlciB0aGUgb2JqZWN0IGhhcyBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cXG5cXG5UaGlzIGlzIGRvbmUgYnkgY2FsbGluZyBnZXRhdHRyKG9iaiwgbmFtZSkgYW5kIGNhdGNoaW5nIEF0dHJpYnV0ZUVycm9yLlwifSxcbmhhc2g6eyRtZXRoOlNrLmJ1aWx0aW4uaGFzaCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBnaXZlbiBvYmplY3QuXFxuXFxuVHdvIG9iamVjdHMgdGhhdCBjb21wYXJlIGVxdWFsIG11c3QgYWxzbyBoYXZlIHRoZSBzYW1lIGhhc2ggdmFsdWUsIGJ1dCB0aGVcXG5yZXZlcnNlIGlzIG5vdCBuZWNlc3NhcmlseSB0cnVlLlwifSxoZXg6eyRtZXRoOlNrLmJ1aWx0aW4uaGV4LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBudW1iZXIsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlci5cXG5cXG4gICA+Pj4gaGV4KDEyNjQ4NDMwKVxcbiAgICcweGMwZmZlZSdcIn0saWQ6eyRtZXRoOlNrLmJ1aWx0aW4uaWQsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBpZGVudGl0eSBvZiBhbiBvYmplY3QuXFxuXFxuVGhpcyBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBhbW9uZyBzaW11bHRhbmVvdXNseSBleGlzdGluZyBvYmplY3RzLlxcbihDUHl0aG9uIHVzZXMgdGhlIG9iamVjdCdzIG1lbW9yeSBhZGRyZXNzLilcIn0sXG5pbnB1dDp7JG1ldGg6U2suYnVpbHRpbi5pbnB1dCwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHByb21wdD1Ob25lLCAvKVwiLCRkb2M6XCJSZWFkIGEgc3RyaW5nIGZyb20gc3RhbmRhcmQgaW5wdXQuICBUaGUgdHJhaWxpbmcgbmV3bGluZSBpcyBzdHJpcHBlZC5cXG5cXG5UaGUgcHJvbXB0IHN0cmluZywgaWYgZ2l2ZW4sIGlzIHByaW50ZWQgdG8gc3RhbmRhcmQgb3V0cHV0IHdpdGhvdXQgYVxcbnRyYWlsaW5nIG5ld2xpbmUgYmVmb3JlIHJlYWRpbmcgaW5wdXQuXFxuXFxuSWYgdGhlIHVzZXIgaGl0cyBFT0YgKCpuaXg6IEN0cmwtRCwgV2luZG93czogQ3RybC1aK1JldHVybiksIHJhaXNlIEVPRkVycm9yLlxcbk9uICpuaXggc3lzdGVtcywgcmVhZGxpbmUgaXMgdXNlZCBpZiBhdmFpbGFibGUuXCJ9LGlzaW5zdGFuY2U6eyRtZXRoOlNrLmJ1aWx0aW4uaXNpbnN0YW5jZSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgY2xhc3Nfb3JfdHVwbGUsIC8pXCIsXG4kZG9jOlwiUmV0dXJuIHdoZXRoZXIgYW4gb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3Mgb3Igb2YgYSBzdWJjbGFzcyB0aGVyZW9mLlxcblxcbkEgdHVwbGUsIGFzIGluIGBgaXNpbnN0YW5jZSh4LCAoQSwgQiwgLi4uKSlgYCwgbWF5IGJlIGdpdmVuIGFzIHRoZSB0YXJnZXQgdG9cXG5jaGVjayBhZ2FpbnN0LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYGBpc2luc3RhbmNlKHgsIEEpIG9yIGlzaW5zdGFuY2UoeCwgQilcXG5vciAuLi5gYCBldGMuXCJ9LGlzc3ViY2xhc3M6eyRtZXRoOlNrLmJ1aWx0aW4uaXNzdWJjbGFzcywkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGNscywgY2xhc3Nfb3JfdHVwbGUsIC8pXCIsJGRvYzpcIlJldHVybiB3aGV0aGVyICdjbHMnIGlzIGEgZGVyaXZlZCBmcm9tIGFub3RoZXIgY2xhc3Mgb3IgaXMgdGhlIHNhbWUgY2xhc3MuXFxuXFxuQSB0dXBsZSwgYXMgaW4gYGBpc3N1YmNsYXNzKHgsIChBLCBCLCAuLi4pKWBgLCBtYXkgYmUgZ2l2ZW4gYXMgdGhlIHRhcmdldCB0b1xcbmNoZWNrIGFnYWluc3QuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYGlzc3ViY2xhc3MoeCwgQSkgb3IgaXNzdWJjbGFzcyh4LCBCKVxcbm9yIC4uLmBgIGV0Yy5cIn0sXG5pdGVyOnskbWV0aDpTay5idWlsdGluLml0ZXIsJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSAvKVwiLCRkb2M6XCJpdGVyKGl0ZXJhYmxlKSAtPiBpdGVyYXRvclxcbml0ZXIoY2FsbGFibGUsIHNlbnRpbmVsKSAtPiBpdGVyYXRvclxcblxcbkdldCBhbiBpdGVyYXRvciBmcm9tIGFuIG9iamVjdC4gIEluIHRoZSBmaXJzdCBmb3JtLCB0aGUgYXJndW1lbnQgbXVzdFxcbnN1cHBseSBpdHMgb3duIGl0ZXJhdG9yLCBvciBiZSBhIHNlcXVlbmNlLlxcbkluIHRoZSBzZWNvbmQgZm9ybSwgdGhlIGNhbGxhYmxlIGlzIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIHRoZSBzZW50aW5lbC5cIn0sbGVuOnskbWV0aDpTay5idWlsdGluLmxlbiwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIGNvbnRhaW5lci5cIn0sbG9jYWxzOnskbWV0aDpTay5idWlsdGluLmxvY2FscyxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc2NvcGUncyBsb2NhbCB2YXJpYWJsZXMuXFxuXFxuTk9URTogV2hldGhlciBvciBub3QgdXBkYXRlcyB0byB0aGlzIGRpY3Rpb25hcnkgd2lsbCBhZmZlY3QgbmFtZSBsb29rdXBzIGluXFxudGhlIGxvY2FsIHNjb3BlIGFuZCB2aWNlLXZlcnNhIGlzICppbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQqIGFuZCBub3RcXG5jb3ZlcmVkIGJ5IGFueSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBndWFyYW50ZWVzLlwifSxtYXg6eyRtZXRoOlNrLmJ1aWx0aW4ubWF4LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIm1heChpdGVyYWJsZSwgKlssIGRlZmF1bHQ9b2JqLCBrZXk9ZnVuY10pIC0+IHZhbHVlXFxubWF4KGFyZzEsIGFyZzIsICphcmdzLCAqWywga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcblxcbldpdGggYSBzaW5nbGUgaXRlcmFibGUgYXJndW1lbnQsIHJldHVybiBpdHMgYmlnZ2VzdCBpdGVtLiBUaGVcXG5kZWZhdWx0IGtleXdvcmQtb25seSBhcmd1bWVudCBzcGVjaWZpZXMgYW4gb2JqZWN0IHRvIHJldHVybiBpZlxcbnRoZSBwcm92aWRlZCBpdGVyYWJsZSBpcyBlbXB0eS5cXG5XaXRoIHR3byBvciBtb3JlIGFyZ3VtZW50cywgcmV0dXJuIHRoZSBsYXJnZXN0IGFyZ3VtZW50LlwifSxcbm1pbjp7JG1ldGg6U2suYnVpbHRpbi5taW4sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwibWluKGl0ZXJhYmxlLCAqWywgZGVmYXVsdD1vYmosIGtleT1mdW5jXSkgLT4gdmFsdWVcXG5taW4oYXJnMSwgYXJnMiwgKmFyZ3MsICpbLCBrZXk9ZnVuY10pIC0+IHZhbHVlXFxuXFxuV2l0aCBhIHNpbmdsZSBpdGVyYWJsZSBhcmd1bWVudCwgcmV0dXJuIGl0cyBzbWFsbGVzdCBpdGVtLiBUaGVcXG5kZWZhdWx0IGtleXdvcmQtb25seSBhcmd1bWVudCBzcGVjaWZpZXMgYW4gb2JqZWN0IHRvIHJldHVybiBpZlxcbnRoZSBwcm92aWRlZCBpdGVyYWJsZSBpcyBlbXB0eS5cXG5XaXRoIHR3byBvciBtb3JlIGFyZ3VtZW50cywgcmV0dXJuIHRoZSBzbWFsbGVzdCBhcmd1bWVudC5cIn0sbmV4dDp7JG5hbWU6XCJuZXh0XCIsJG1ldGg6U2suYnVpbHRpbi5uZXh0XywkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIm5leHQoaXRlcmF0b3JbLCBkZWZhdWx0XSlcXG5cXG5SZXR1cm4gdGhlIG5leHQgaXRlbSBmcm9tIHRoZSBpdGVyYXRvci4gSWYgZGVmYXVsdCBpcyBnaXZlbiBhbmQgdGhlIGl0ZXJhdG9yXFxuaXMgZXhoYXVzdGVkLCBpdCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIHJhaXNpbmcgU3RvcEl0ZXJhdGlvbi5cIn0sXG5vY3Q6eyRtZXRoOlNrLmJ1aWx0aW4ub2N0LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBudW1iZXIsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgb2N0YWwgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlci5cXG5cXG4gICA+Pj4gb2N0KDM0MjM5MSlcXG4gICAnMG8xMjM0NTY3J1wifSxvcGVuOnskbWV0aDpTay5idWlsdGluLm9wZW4sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJvcGVuKG5hbWVbLCBtb2RlWywgYnVmZmVyaW5nXV0pIC0+IGZpbGUgb2JqZWN0XFxuXFxuT3BlbiBhIGZpbGUgdXNpbmcgdGhlIGZpbGUoKSB0eXBlLCByZXR1cm5zIGEgZmlsZSBvYmplY3QuICBUaGlzIGlzIHRoZVxcbnByZWZlcnJlZCB3YXkgdG8gb3BlbiBhIGZpbGUuICBTZWUgZmlsZS5fX2RvY19fIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLlwifSxvcmQ6eyRtZXRoOlNrLmJ1aWx0aW4ub3JkLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBjLCAvKVwiLFxuJGRvYzpcIlJldHVybiB0aGUgVW5pY29kZSBjb2RlIHBvaW50IGZvciBhIG9uZS1jaGFyYWN0ZXIgc3RyaW5nLlwifSxwb3c6eyRtZXRoOlNrLmJ1aWx0aW4ucG93LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJG1vZHVsZSwgeCwgeSwgej1Ob25lLCAvKVwiLCRkb2M6XCJFcXVpdmFsZW50IHRvIHgqKnkgKHdpdGggdHdvIGFyZ3VtZW50cykgb3IgeCoqeSAlIHogKHdpdGggdGhyZWUgYXJndW1lbnRzKVxcblxcblNvbWUgdHlwZXMsIHN1Y2ggYXMgaW50cywgYXJlIGFibGUgdG8gdXNlIGEgbW9yZSBlZmZpY2llbnQgYWxnb3JpdGhtIHdoZW5cXG5pbnZva2VkIHVzaW5nIHRoZSB0aHJlZSBhcmd1bWVudCBmb3JtLlwifSxwcmludDp7JG1ldGg6U2suYnVpbHRpbi5wcmludCwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJwcmludCh2YWx1ZSwgLi4uLCBzZXA9JyAnLCBlbmQ9J1xcXFxuJywgZmlsZT1zeXMuc3Rkb3V0LCBmbHVzaD1GYWxzZSlcXG5cXG5QcmludHMgdGhlIHZhbHVlcyB0byBhIHN0cmVhbSwgb3IgdG8gc3lzLnN0ZG91dCBieSBkZWZhdWx0Llxcbk9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOlxcbmZpbGU6ICBhIGZpbGUtbGlrZSBvYmplY3QgKHN0cmVhbSk7IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHN5cy5zdGRvdXQuXFxuc2VwOiAgIHN0cmluZyBpbnNlcnRlZCBiZXR3ZWVuIHZhbHVlcywgZGVmYXVsdCBhIHNwYWNlLlxcbmVuZDogICBzdHJpbmcgYXBwZW5kZWQgYWZ0ZXIgdGhlIGxhc3QgdmFsdWUsIGRlZmF1bHQgYSBuZXdsaW5lLlxcbmZsdXNoOiB3aGV0aGVyIHRvIGZvcmNpYmx5IGZsdXNoIHRoZSBzdHJlYW0uXCJ9LFxucmVwcjp7JG1ldGg6U2suYnVpbHRpbi5yZXByLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LlxcblxcbkZvciBtYW55IG9iamVjdCB0eXBlcywgaW5jbHVkaW5nIG1vc3QgYnVpbHRpbnMsIGV2YWwocmVwcihvYmopKSA9PSBvYmouXCJ9LHJvdW5kOnskbWV0aDpTay5idWlsdGluLnJvdW5kLCRmbGFnczp7TmFtZWRBcmdzOltcIm51bWJlclwiLFwibmRpZ2l0c1wiXX0sJHRleHRzaWc6XCIoJG1vZHVsZSwgLywgbnVtYmVyLCBuZGlnaXRzPU5vbmUpXCIsJGRvYzpcIlJvdW5kIGEgbnVtYmVyIHRvIGEgZ2l2ZW4gcHJlY2lzaW9uIGluIGRlY2ltYWwgZGlnaXRzLlxcblxcblRoZSByZXR1cm4gdmFsdWUgaXMgYW4gaW50ZWdlciBpZiBuZGlnaXRzIGlzIG9taXR0ZWQgb3IgTm9uZS4gIE90aGVyd2lzZVxcbnRoZSByZXR1cm4gdmFsdWUgaGFzIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG51bWJlci4gIG5kaWdpdHMgbWF5IGJlIG5lZ2F0aXZlLlwifSxcbnNldGF0dHI6eyRtZXRoOlNrLmJ1aWx0aW4uc2V0YXR0ciwkZmxhZ3M6e01pbkFyZ3M6MyxNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgbmFtZSwgdmFsdWUsIC8pXCIsJGRvYzpcIlNldHMgdGhlIG5hbWVkIGF0dHJpYnV0ZSBvbiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuXFxuXFxuc2V0YXR0cih4LCAneScsIHYpIGlzIGVxdWl2YWxlbnQgdG8gYGB4LnkgPSB2JydcIn0sc29ydGVkOnskbWV0aDpTay5idWlsdGluLnNvcnRlZCwkZmxhZ3M6e05hbWVkQXJnczpbbnVsbCxcImNtcFwiLFwia2V5XCIsXCJyZXZlcnNlXCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSRdfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLywgKiwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgYWxsIGl0ZW1zIGZyb20gdGhlIGl0ZXJhYmxlIGluIGFzY2VuZGluZyBvcmRlci5cXG5cXG5BIGN1c3RvbSBrZXkgZnVuY3Rpb24gY2FuIGJlIHN1cHBsaWVkIHRvIGN1c3RvbWl6ZSB0aGUgc29ydCBvcmRlciwgYW5kIHRoZVxcbnJldmVyc2UgZmxhZyBjYW4gYmUgc2V0IHRvIHJlcXVlc3QgdGhlIHJlc3VsdCBpbiBkZXNjZW5kaW5nIG9yZGVyLlwifSxcbnN1bTp7JG1ldGg6U2suYnVpbHRpbi5zdW0sJGZsYWdzOntOYW1lZEFyZ3M6W251bGwsXCJzdGFydFwiXSxEZWZhdWx0czpbbmV3IFNrLmJ1aWx0aW4uaW50XygwKV19LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGl0ZXJhYmxlLCAvLCBzdGFydD0wKVwiLCRkb2M6XCJSZXR1cm4gdGhlIHN1bSBvZiBhICdzdGFydCcgdmFsdWUgKGRlZmF1bHQ6IDApIHBsdXMgYW4gaXRlcmFibGUgb2YgbnVtYmVyc1xcblxcbldoZW4gdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LCByZXR1cm4gdGhlIHN0YXJ0IHZhbHVlLlxcblRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgc3BlY2lmaWNhbGx5IGZvciB1c2Ugd2l0aCBudW1lcmljIHZhbHVlcyBhbmQgbWF5XFxucmVqZWN0IG5vbi1udW1lcmljIHR5cGVzLlwifSx2YXJzOnskbWV0aDpTay5idWlsdGluLnZhcnMsJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJ2YXJzKFtvYmplY3RdKSAtPiBkaWN0aW9uYXJ5XFxuXFxuV2l0aG91dCBhcmd1bWVudHMsIGVxdWl2YWxlbnQgdG8gbG9jYWxzKCkuXFxuV2l0aCBhbiBhcmd1bWVudCwgZXF1aXZhbGVudCB0byBvYmplY3QuX19kaWN0X18uXCJ9fSk7XG5Tay5zZXR1cE9iamVjdHM9ZnVuY3Rpb24oYSl7YT8oU2suYnVpbHRpbnMuZmlsdGVyPVNrLmJ1aWx0aW4uZmlsdGVyXyxTay5idWlsdGlucy5tYXA9U2suYnVpbHRpbi5tYXBfLFNrLmJ1aWx0aW5zLnppcD1Tay5idWlsdGluLnppcF8sU2suYnVpbHRpbnMucmFuZ2U9U2suYnVpbHRpbi5yYW5nZV8sZGVsZXRlIFNrLmJ1aWx0aW5zLnhyYW5nZSxkZWxldGUgU2suYnVpbHRpbnMuU3RhbmRhcmRFcnJvcixkZWxldGUgU2suYnVpbHRpbnMudW5pY29kZSxkZWxldGUgU2suYnVpbHRpbnMuYmFzZXN0cmluZyxkZWxldGUgU2suYnVpbHRpbnMubG9uZ18kcnckLFNrLmJ1aWx0aW4uaW50Xy5wcm90b3R5cGUuJHI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b1N0cmluZygpKX0sZGVsZXRlIFNrLmJ1aWx0aW4uaW50Xy5wcm90b3R5cGUudHAkc3RyLGRlbGV0ZSBTay5idWlsdGluLmJvb2wucHJvdG90eXBlLnRwJHN0cixkZWxldGUgU2suYnVpbHRpbnMucmF3X2lucHV0LFxuZGVsZXRlIFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5kZWNvZGUsU2suYnVpbHRpbnMuYnl0ZXM9U2suYnVpbHRpbi5ieXRlcyxTay5idWlsdGlucy5hc2NpaT1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoeyRtZXRoOlNrLmJ1aWx0aW4uYXNjaWksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIGFuIEFTQ0lJLW9ubHkgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LlxcblxcbkFzIHJlcHIoKSwgcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgYW5cXG5vYmplY3QsIGJ1dCBlc2NhcGUgdGhlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnlcXG5yZXByKCkgdXNpbmcgXFxcXFxcXFx4LCBcXFxcXFxcXHUgb3IgXFxcXFxcXFxVIGVzY2FwZXMuIFRoaXMgZ2VuZXJhdGVzIGEgc3RyaW5nIHNpbWlsYXJcXG50byB0aGF0IHJldHVybmVkIGJ5IHJlcHIoKSBpbiBQeXRob24gMi5cIn0sXG5udWxsLFwiYnVpbHRpbnNcIikpOihTay5idWlsdGlucy5yYW5nZT1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoeyRtZXRoOlNrLmJ1aWx0aW4ucmFuZ2UsJG5hbWU6XCJyYW5nZVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M319LHZvaWQgMCxcImJ1aWx0aW5zXCIpLFNrLmJ1aWx0aW5zLnhyYW5nZT1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoeyRtZXRoOlNrLmJ1aWx0aW4ueHJhbmdlLCRuYW1lOlwieHJhbmdlXCIsJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfX0sbnVsbCxcImJ1aWx0aW5zXCIpLFNrLmJ1aWx0aW5zLmZpbHRlcj1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4uZmlsdGVyKSxTay5idWlsdGlucy5tYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLm1hcCksU2suYnVpbHRpbnMuemlwPW5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi56aXApLFNrLmJ1aWx0aW5zLlN0YW5kYXJkRXJyb3I9U2suYnVpbHRpbi5FeGNlcHRpb24sU2suYnVpbHRpbnMudW5pY29kZT1cblNrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW5zLmJhc2VzdHJpbmc9U2suYnVpbHRpbi5zdHIsU2suYnVpbHRpbnMubG9uZ18kcnckPVNrLmJ1aWx0aW4ubG5nLFNrLmJ1aWx0aW4uaW50Xy5wcm90b3R5cGUuJHI9ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGE/bmV3IFNrLmJ1aWx0aW4uc3RyKGEudG9TdHJpbmcoKSk6bmV3IFNrLmJ1aWx0aW4uc3RyKGEudG9TdHJpbmcoKStcIkxcIil9LFNrLmJ1aWx0aW4uaW50Xy5wcm90b3R5cGUudHAkc3RyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKSl9LFNrLmJ1aWx0aW4uYm9vbC5wcm90b3R5cGUudHAkc3RyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHIoKX0sU2suYnVpbHRpbnMucmF3X2lucHV0PW5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5yYXdfaW5wdXQpLFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5kZWNvZGU9U2suYnVpbHRpbi5zdHIuJHB5MmRlY29kZSxcbmRlbGV0ZSBTay5idWlsdGlucy5ieXRlcyxkZWxldGUgU2suYnVpbHRpbnMuYXNjaWkpfTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cE9iamVjdHNcIixTay5zZXR1cE9iamVjdHMpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW5zXCIsU2suYnVpbHRpbnMpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc3RyLiRlbXB0eT1uZXcgU2suYnVpbHRpbi5zdHIoXCJcIik7U2suYnVpbHRpbi5zdHIuJGVtcHR5c3RyPVNrLmJ1aWx0aW4uc3RyLiRlbXB0eTtTay5idWlsdGluLnN0ci4kdXRmOD1uZXcgU2suYnVpbHRpbi5zdHIoXCJ1dGYtOFwiKTtTay5idWlsdGluLnN0ci4kYXNjaWk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiYXNjaWlcIik7U2suYnVpbHRpbi5zdHIuJGRlZmF1bHRfZmFjdG9yeT1uZXcgU2suYnVpbHRpbi5zdHIoXCJkZWZhdWx0X2ZhY3RvcnlcIik7U2suYnVpbHRpbi5zdHIuJGltYWc9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiaW1hZ1wiKTtTay5idWlsdGluLnN0ci4kcmVhbD1uZXcgU2suYnVpbHRpbi5zdHIoXCJyZWFsXCIpO1xuU2suYnVpbHRpbi5zdHIuJGFicz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2Fic19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRieXRlcz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2J5dGVzX19cIik7U2suYnVpbHRpbi5zdHIuJGNhbGw9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19jYWxsX19cIik7U2suYnVpbHRpbi5zdHIuJGNsYXNzPW5ldyBTay5idWlsdGluLnN0cihcIl9fY2xhc3NfX1wiKTtTay5idWlsdGluLnN0ci4kY21wPW5ldyBTay5idWlsdGluLnN0cihcIl9fY21wX19cIik7U2suYnVpbHRpbi5zdHIuJGNvbXBsZXg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19jb21wbGV4X19cIik7U2suYnVpbHRpbi5zdHIuJGNvbnRhaW5zPW5ldyBTay5idWlsdGluLnN0cihcIl9fY29udGFpbnNfX1wiKTtTay5idWlsdGluLnN0ci4kY29weT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NvcHlfX1wiKTtTay5idWlsdGluLnN0ci4kZGljdD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2RpY3RfX1wiKTtTay5idWlsdGluLnN0ci4kZGlyPVxubmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19kaXJfX1wiKTtTay5idWlsdGluLnN0ci4kZG9jPW5ldyBTay5idWlsdGluLnN0cihcIl9fZG9jX19cIik7U2suYnVpbHRpbi5zdHIuJGVudGVyPW5ldyBTay5idWlsdGluLnN0cihcIl9fZW50ZXJfX1wiKTtTay5idWlsdGluLnN0ci4kZXE9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19lcV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRleGl0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZXhpdF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpbmRleD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2luZGV4X19cIik7U2suYnVpbHRpbi5zdHIuJGluaXQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pbml0X19cIik7U2suYnVpbHRpbi5zdHIuJGludF89bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pbnRfX1wiKTtTay5idWlsdGluLnN0ci4kaXRlcj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2l0ZXJfX1wiKTtTay5idWlsdGluLnN0ci4kZmlsZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2ZpbGVfX1wiKTtTay5idWlsdGluLnN0ci4kZmxvYXRfPVxubmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19mbG9hdF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRmb3JtYXQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19mb3JtYXRfX1wiKTtTay5idWlsdGluLnN0ci4kZ2U9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19nZV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRnZXRhdHRyPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2V0YXR0cl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRnZXRhdHRyaWJ1dGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19nZXRhdHRyaWJ1dGVfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0aXRlbT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2dldGl0ZW1fX1wiKTtTay5idWlsdGluLnN0ci4kZ3Q9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19ndF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRrZXlzPW5ldyBTay5idWlsdGluLnN0cihcImtleXNcIik7U2suYnVpbHRpbi5zdHIuJGxlPW5ldyBTay5idWlsdGluLnN0cihcIl9fbGVfX1wiKTtTay5idWlsdGluLnN0ci4kbGVuPW5ldyBTay5idWlsdGluLnN0cihcIl9fbGVuX19cIik7XG5Tay5idWlsdGluLnN0ci4kbGVuZ3RoX2hpbnQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19sZW5ndGhfaGludF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRsb2FkZXI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19sb2FkZXJfX1wiKTtTay5idWlsdGluLnN0ci4kbHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19sdF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRtb2R1bGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19tb2R1bGVfX1wiKTtTay5idWlsdGluLnN0ci4kbWlzc2luZz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX21pc3NpbmdfX1wiKTtTay5idWlsdGluLnN0ci4kbmFtZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX25hbWVfX1wiKTtTay5idWlsdGluLnN0ci4kbmU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRuZXc9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZXdfX1wiKTtTay5idWlsdGluLnN0ci4kbmV4dD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX25leHRfX1wiKTtTay5idWlsdGluLnN0ci4kcGF0aD1cbm5ldyBTay5idWlsdGluLnN0cihcIl9fcGF0aF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRxdWFsbmFtZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3F1YWxuYW1lX19cIik7U2suYnVpbHRpbi5zdHIuJHJlcHI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19yZXByX19cIik7U2suYnVpbHRpbi5zdHIuJHJldmVyc2VkPW5ldyBTay5idWlsdGluLnN0cihcIl9fcmV2ZXJzZWRfX1wiKTtTay5idWlsdGluLnN0ci4kcm91bmQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19yb3VuZF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRzZXRhdHRyPW5ldyBTay5idWlsdGluLnN0cihcIl9fc2V0YXR0cl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRzZXRpdGVtPW5ldyBTay5idWlsdGluLnN0cihcIl9fc2V0aXRlbV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRzdHI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19zdHJfX1wiKTtTay5idWlsdGluLnN0ci4kdHJ1bmM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX190cnVuY19fXCIpO1NrLmJ1aWx0aW4uc3RyLiR3cml0ZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJ3cml0ZVwiKTtcblNrLm1pc2NldmFsLm9wMm1ldGhvZF89e0VxOlNrLmJ1aWx0aW4uc3RyLiRlcSxOb3RFcTpTay5idWlsdGluLnN0ci4kbmUsR3Q6U2suYnVpbHRpbi5zdHIuJGd0LEd0RTpTay5idWlsdGluLnN0ci4kZ2UsTHQ6U2suYnVpbHRpbi5zdHIuJGx0LEx0RTpTay5idWlsdGluLnN0ci4kbGV9fV0pO30pLmNhbGwodGhpcyB8fCB3aW5kb3cpXG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNrdWxwdC5taW4uanMubWFwIiwiLypcblRoZSBUaW1lZEFjdGl2ZWNvZGUgY2xhc3NlcyBhcmUgYSBncmVhdCBleGFtcGxlIG9mIHdoZXJlIG11bHRpcGxlIGluaGVyaXRhbmNlIHdvdWxkIGJlIHVzZWZ1bFxuQnV0IHNpbmNlIEphdmFzY3JpcHQgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZSB3ZSB1c2UgdGhlIG1peGluIHBhdHRlcm4uXG5cbiovXG5pbXBvcnQgTGl2ZUNvZGUgZnJvbSBcIi4vbGl2ZWNvZGVcIjtcbmltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlXCI7XG5pbXBvcnQgSlNBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfanNcIjtcbmltcG9ydCBIVE1MQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2h0bWxcIjtcbmltcG9ydCBTUUxBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfc3FsXCI7XG5pbXBvcnQgQnJ5dGhvbkFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9icnl0aG9uLmpzXCI7XG5cbnZhciBUaW1lZEFjdGl2ZUNvZGVNaXhpbiA9IHtcbiAgICB0aW1lZEluaXQ6IGFzeW5jIGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICAgIHRoaXMuaXNUaW1lZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaGlkZUJ1dHRvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRIaXN0b3J5U2NydWJiZXIodHJ1ZSk7IC8vIHBvc2l0aW9uIGxhc3RcbiAgICAgICAgdGhpcy5uZWVkc1JlaW5pdGlhbGl6YXRpb24gPSB0cnVlOyAvLyB0aGUgcnVuIGJ1dHRvbiBjbGljayBsaXN0ZW5lciBuZWVkcyB0byBiZSByZWluaXRpYWxpemVkXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmNsYXNzTGlzdC5hZGQoXCJ0aW1lZENvbXBvbmVudFwiKTtcbiAgICAgICAgd2luZG93LmVkTGlzdFt0aGlzLmRpdmlkXSA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBoaWRlQnV0dG9uczogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnV0dG9uTGlzdCA9IFtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUJ1dHRvbixcbiAgICAgICAgICAgIHRoaXMubG9hZEJ1dHRvbixcbiAgICAgICAgICAgIHRoaXMuZ3JhZGVCdXR0b24sXG4gICAgICAgICAgICB0aGlzLnNob3dIaWRlQnV0dCxcbiAgICAgICAgICAgIHRoaXMuY29hY2hCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmF0QnV0dG9uLFxuICAgICAgICBdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1dHRvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChidXR0b25MaXN0W2ldICE9PSB1bmRlZmluZWQgJiYgYnV0dG9uTGlzdFtpXSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAkKGJ1dHRvbkxpc3RbaV0pLmhpZGUoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBiamUgLSBub3QgbmVlZGVkIGFueW1vcmVcbiAgICByZW5kZXJUaW1lZEljb246IGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgLy8gcmVuZGVycyB0aGUgY2xvY2sgaWNvbiBvbiB0aW1lZCBjb21wb25lbnRzLiAgICBUaGUgY29tcG9uZW50IHBhcmFtZXRlclxuICAgICAgICAvLyBpcyB0aGUgZWxlbWVudCB0aGF0IHRoZSBpY29uIHNob3VsZCBiZSBhcHBlbmRlZCB0by5cbiAgICAgICAgdmFyIHRpbWVJY29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIHRpbWVJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgICAgJCh0aW1lSWNvbikuYXR0cih7XG4gICAgICAgICAgICBzcmM6IFwiLi4vX3N0YXRpYy9jbG9jay5wbmdcIixcbiAgICAgICAgICAgIHN0eWxlOiBcIndpZHRoOjE1cHg7aGVpZ2h0OjE1cHhcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRpbWVJY29uRGl2LmNsYXNzTmFtZSA9IFwidGltZVRpcFwiO1xuICAgICAgICB0aW1lSWNvbkRpdi50aXRsZSA9IFwiXCI7XG4gICAgICAgIHRpbWVJY29uRGl2LmFwcGVuZENoaWxkKHRpbWVJY29uKTtcbiAgICAgICAgJChjb21wb25lbnQpLnByZXBlbmQodGltZUljb25EaXYpO1xuICAgIH0sXG5cbiAgICBjaGVja0NvcnJlY3RUaW1lZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBwY3RfY29ycmVjdCBpcyBzZXQgYnkgdGhlIHVuaXR0ZXN0L2d1aS5weSBtb2R1bGUgaW4gc2t1bHB0LlxuICAgICAgICAvLyBpdCByZWxpZXMgb24gZmluZGluZyB0aGlzIG9iamVjdCBpbiB0aGUgZWRMaXN0XG4gICAgICAgIGlmICh0aGlzLmlzQW5zd2VyZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBjdF9jb3JyZWN0ID49IDEwMC4wKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiVFwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJGXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJJXCI7IC8vIHdlIGlnbm9yZSB0aGlzIGluIHRoZSBncmFkaW5nIGlmIG5vIHVuaXR0ZXN0c1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGhpZGVGZWVkYmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpO1xuICAgIH0sXG5cbiAgICByZWluaXRpYWxpemVMaXN0ZW5lcnM6IGZ1bmN0aW9uICh0YWtlbikge1xuICAgICAgICBpZiAoIXRoaXMucnVuQnV0dG9uLm9uY2xpY2spIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVhdHRhY2hpbmcgcnVuYnV0dG9uaGFuZGxlclwiKTtcbiAgICAgICAgICAgIHRoaXMucnVuQnV0dG9uLm9uY2xpY2sgPSB0aGlzLnJ1bkJ1dHRvbkhhbmRlci5iaW5kKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgICQodGhpcy5jb2RlRGl2KS5zaG93KCk7XG4gICAgICAgIHRoaXMucnVuQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICQodGhpcy5jb2RlRGl2KS5yZW1vdmVDbGFzcyhcImFjLWRpc2FibGVkXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5yZWZyZXNoKCk7XG4gICAgICAgICQodGhpcy5oaXN0QnV0dG9uKS5jbGljayh0aGlzLmFkZEhpc3RvcnlTY3J1YmJlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yeVNjcnViYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoe1xuICAgICAgICAgICAgICAgIG1heDogdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICAgICAgICAgIHNsaWRlOiB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRha2VuKSB7XG4gICAgICAgICAgICAkKGAjJHt0aGlzLmRpdmlkfV91bml0X3Jlc3VsdHNgKS5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9LFxufTtcblxuZXhwb3J0IGNsYXNzIFRpbWVkTGl2ZUNvZGUgZXh0ZW5kcyBMaXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuXG5PYmplY3QuYXNzaWduKFRpbWVkTGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZEFjdGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLnRpbWVkSW5pdENvbXBsZXRlID0gdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxuXG4gICAgLy8gZm9yIHRpbWVkIGV4YW1zIHdlIG5lZWQgdG8gY2FsbCBydW5Qcm9nIGFuZCB0ZWxsIGl0IHRoYXQgdGhlcmUgaXNcbiAgICAvLyBubyBHVUkgZm9yIHNsaWRlcnMgb3Igb3RoZXIgdGhpbmdzLlxuICAgIC8vIHRoZSBhbnN3ZXJzLlxuICAgIGFzeW5jIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgbGV0IG5vVUkgPSB0cnVlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRpbWVkSW5pdENvbXBsZXRlO1xuICAgICAgICBpZiAodGhpcy5pc0Fuc3dlcmVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1blByb2cobm9VSSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5PYmplY3QuYXNzaWduKFRpbWVkQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcblxuZXhwb3J0IGNsYXNzIFRpbWVkSlNBY3RpdmVDb2RlIGV4dGVuZHMgSlNBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLnRpbWVkSW5pdChvcHRzKTtcbiAgICB9XG59XG5PYmplY3QuYXNzaWduKFRpbWVkSlNBY3RpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuXG5leHBvcnQgY2xhc3MgVGltZWRIVE1MQWN0aXZlQ29kZSBleHRlbmRzIEhUTUxBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLnRpbWVkSW5pdChvcHRzKTtcbiAgICB9XG59XG5PYmplY3QuYXNzaWduKFRpbWVkSFRNTEFjdGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZFNRTEFjdGl2ZUNvZGUgZXh0ZW5kcyBTUUxBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLnRpbWVkSW5pdChvcHRzKTtcbiAgICB9XG59XG5PYmplY3QuYXNzaWduKFRpbWVkU1FMQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcblxuZXhwb3J0IGNsYXNzIFRpbWVkQnJ5dGhvbkFjdGl2ZUNvZGUgZXh0ZW5kcyBCcnl0aG9uQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZEJyeXRob25BY3RpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuIiwiLypcblxuaGlnaGxpZ2h0IHY0XG5cbkhpZ2hsaWdodHMgYXJiaXRyYXJ5IHRlcm1zLlxuXG48aHR0cDovL2pvaGFubmJ1cmthcmQuZGUvYmxvZy9wcm9ncmFtbWluZy9qYXZhc2NyaXB0L2hpZ2hsaWdodC1qYXZhc2NyaXB0LXRleHQtaGlnbGlnaHRpbmctanF1ZXJ5LXBsdWdpbi5odG1sPlxuXG5NSVQgbGljZW5zZS5cblxuSm9oYW5uIEJ1cmthcmRcbjxodHRwOi8vam9oYW5uYnVya2FyZC5kZT5cbjxtYWlsdG86amJAZWFpby5jb20+XG5cbiovXG5cbmpRdWVyeS5mbi5oaWdobGlnaHQgPSBmdW5jdGlvbihwYXQpIHtcbiBmdW5jdGlvbiBpbm5lckhpZ2hsaWdodChub2RlLCBwYXQpIHtcbiAgdmFyIHNraXAgPSAwO1xuICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7XG4gICB2YXIgcG9zID0gbm9kZS5kYXRhLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihwYXQpO1xuICAgaWYgKHBvcyA+PSAwKSB7XG4gICAgdmFyIHNwYW5ub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHNwYW5ub2RlLmNsYXNzTmFtZSA9ICdoaWdobGlnaHQnO1xuICAgIHZhciBtaWRkbGViaXQgPSBub2RlLnNwbGl0VGV4dChwb3MpO1xuICAgIHZhciBlbmRiaXQgPSBtaWRkbGViaXQuc3BsaXRUZXh0KHBhdC5sZW5ndGgpO1xuICAgIHZhciBtaWRkbGVjbG9uZSA9IG1pZGRsZWJpdC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgc3Bhbm5vZGUuYXBwZW5kQ2hpbGQobWlkZGxlY2xvbmUpO1xuICAgIG1pZGRsZWJpdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChzcGFubm9kZSwgbWlkZGxlYml0KTtcbiAgICBza2lwID0gMTtcbiAgIH1cbiAgfVxuICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5jaGlsZE5vZGVzICYmICEvKHNjcmlwdHxzdHlsZSkvaS50ZXN0KG5vZGUudGFnTmFtZSkpIHtcbiAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgaSArPSBpbm5lckhpZ2hsaWdodChub2RlLmNoaWxkTm9kZXNbaV0sIHBhdCk7XG4gICB9XG4gIH1cbiAgcmV0dXJuIHNraXA7XG4gfVxuIHJldHVybiB0aGlzLmxlbmd0aCAmJiBwYXQgJiYgcGF0Lmxlbmd0aCA/IHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgaW5uZXJIaWdobGlnaHQodGhpcywgcGF0LnRvVXBwZXJDYXNlKCkpO1xuIH0pIDogdGhpcztcbn07XG5cbmpRdWVyeS5mbi5yZW1vdmVIaWdobGlnaHQgPSBmdW5jdGlvbigpIHtcbiByZXR1cm4gdGhpcy5maW5kKFwic3Bhbi5oaWdobGlnaHRcIikuZWFjaChmdW5jdGlvbigpIHtcbiAgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQubm9kZU5hbWU7XG4gIHdpdGggKHRoaXMucGFyZW50Tm9kZSkge1xuICAgcmVwbGFjZUNoaWxkKHRoaXMuZmlyc3RDaGlsZCwgdGhpcyk7XG4gICBub3JtYWxpemUoKTtcbiAgfVxuIH0pLmVuZCgpO1xufTtcbiIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvY3NzL2FjdGl2ZWNvZGUuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvL2hvbWUvcmVrL1J1bmVzdG9uZUNvbXBvbmVudHMvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGV8c3luY3wvXlxcLlxcLy4qJC8iLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2Nzcy9hY3RpdmVjb2RlLmNzcz8xZDExIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY2ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGUtaTE4bi5lbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS1pMThuLnB0LWJyLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlLWkxOG4uc3ItQ3lybC5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZV9icnl0aG9uLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlX2h0bWwuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfanMuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfc3FsLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hdWRpb3RvdXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2V4dHJhY3RVbml0UmVzdWx0cy5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvbGl2ZWNvZGUuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL21kNS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0LXN0ZGxpYi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0Lm1pbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvdGltZWRfYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnkuaGlnaGxpZ2h0LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8Y3J5cHRvIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8ZnMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy9pZ25vcmVkfC9ob21lL3Jlay9SdW5lc3RvbmVDb21wb25lbnRzL25vZGVfbW9kdWxlcy9zcWwuanMvZGlzdHxwYXRoIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfGZzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfG5vZGUtZmV0Y2giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUM0SDtBQUM3QjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0EsMERBQTBELG9CQUFvQix3QkFBd0IsdUJBQXVCLG1CQUFtQixvQkFBb0IsNkJBQTZCLHNDQUFzQywyQ0FBMkMsOENBQThDLDBCQUEwQiwrQkFBK0Isa0NBQWtDLDBCQUEwQixrQkFBa0IsR0FBRyxzQkFBc0Isb0JBQW9CLHlCQUF5QixhQUFhLGNBQWMsa0JBQWtCLGtCQUFrQix1QkFBdUIsR0FBRywwQkFBMEIsb0JBQW9CLHlCQUF5QixtQkFBbUIsa0JBQWtCLDJDQUEyQyxrQkFBa0IsbUJBQW1CLEdBQUcsaUJBQWlCLHlCQUF5QixHQUFHLGFBQWEsdUJBQXVCLDRCQUE0Qix5QkFBeUIsaUJBQWlCLG1CQUFtQixpQkFBaUIsZ0JBQWdCLEdBQUcsaUJBQWlCLHlCQUF5Qix5QkFBeUIsd0JBQXdCLHVCQUF1QixrQkFBa0IsR0FBRyxzQ0FBc0MsdUJBQXVCLHdCQUF3Qix5QkFBeUIseUJBQXlCLEdBQUcsMkJBQTJCLHdCQUF3QixHQUFHLGdCQUFnQixvQkFBb0IsdUJBQXVCLGdDQUFnQyxHQUFHLGtCQUFrQixrQ0FBa0MsR0FBRyxpQkFBaUIseUJBQXlCLHdCQUF3QixHQUFHLHNCQUFzQiwwQkFBMEIsR0FBRyxrQkFBa0IsMkNBQTJDLHlCQUF5Qix3QkFBd0Isa0JBQWtCLEdBQUcsaUJBQWlCLGdDQUFnQyx5QkFBeUIsc0JBQXNCLHdCQUF3QixxQkFBcUIsR0FBRyx3QkFBd0IsOEJBQThCLEdBQUcsOEJBQThCLGlDQUFpQyxHQUFHLG9CQUFvQixpQ0FBaUMsR0FBRyxrQkFBa0IsMkJBQTJCLEdB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFFRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7QUMvTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0pBQXdKO0FBQ3hKO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7OztBQ3JIRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4SEFBOEg7QUFDOUg7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7Ozs7Ozs7Ozs7O0FDckhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUVnRDtBQUN0QjtBQUNOO0FBQ0c7QUFDRTtBQUNGO0FBQ007QUFDTjtBQUNZO0FBQ1o7QUFDYztBQUNkO0FBQ0k7QUFDRTtBQUNUO0FBQ007QUFDZDtBQUNHO0FBQzVCO0FBQytCO0FBQy9CO0FBQ0EsbUJBQW1CLGdEQUFLOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ08seUJBQXlCLGdFQUFhO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxXQUFXO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EscUJBQXFCLGlEQUFVOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULDhDQUE4QyxFQUFFO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrREFBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxtQkFBbUI7QUFDakUsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsV0FBVztBQUN4QztBQUNBO0FBQ0Esd0JBQXdCLFdBQVc7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxNQUFNO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxHQUFHLEtBQUssUUFBUSxNQUFNLE1BQU07QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsV0FBVztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJHQUEyRztBQUMzRztBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsT0FBTyxHQUFHLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esa0ZBQWtGLFlBQVk7QUFDOUY7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGtCQUFrQjtBQUM3QztBQUNBO0FBQ0EsU0FBUztB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsYUFBYTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsbUJBQW1CO0FBQzFDOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QXVCLHdCQUF3QixtQkFBbUIsOEJBQThCLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLDZFQUE2RSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxnU0FBZ1MsTUFBTSxLQUFLLE1BQU0sd0xBQXdMLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU07QUFDcDlCLHFCQUFxQixNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSx1RUFBdUUsTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLGlDQUFpQyxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0saUlBQWlJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU07QUFDeGpDLDRxREFBNHFELE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFB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OztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDRCQUE0QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7Ozs7Ozs7Ozs7QUNwREEsZTs7Ozs7Ozs7OztBQ0FBLGU7Ozs7Ozs7Ozs7QUNBQSxlOzs7Ozs7Ozs7O0FDQUEsZTs7Ozs7Ozs7OztBQ0FBLGUiLCJmaWxlIjoibm9kZV9tb2R1bGVzX21vbWVudF9sb2NhbGVfc3luY19yZWN1cnNpdmVfLXJ1bmVzdG9uZV9hY3RpdmVjb2RlX2pzX2FjZmFjdG9yeV9qcy5idW5kbGUuanM/dj05MDM3MTNjYjUyY2ZkOTgyZWVlOCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLm1vZGFsLXByb2ZpbGUge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBtaW4taGVpZ2h0OiAzMDBweDtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgd2lkdGg6IDcwMHB4O1xcbiAgICBwYWRkaW5nOiAyNXB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZmZmO1xcbiAgICBib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICAtbW96LWJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIC13ZWJraXQtYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIGJhY2tncm91bmQ6ICNmMmYyZjI7XFxuICAgIHotaW5kZXg6IDUwO1xcbn1cXG5cXG4ubW9kYWwtbGlnaHRzb3V0IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDA7XFxuICAgIGxlZnQ6IDA7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICB6LWluZGV4OiAyNTtcXG4gICAgYmFja2dyb3VuZDogIzAwMDtcXG59XFxuXFxuLm1vZGFsLWNsb3NlLXByb2ZpbGUge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGhlaWdodDogNDNweDtcXG4gICAgd2lkdGg6IDQzcHg7XFxuICAgIC8qYmFja2dyb3VuZC1pbWFnZTogdXJsKCdjbG9zZS5wbmcnKTsgKi9cXG4gICAgdG9wOiAxcHg7XFxuICAgIHJpZ2h0OiAwLjVweDtcXG59XFxuXFxuLmFjX2FjdGlvbnMge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcblxcbi5hY19zZXAge1xcbiAgICBiYWNrZ3JvdW5kOiAjMDAwO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG1hcmdpbjogLTE1cHggMTBweDtcXG4gICAgd2lkdGg6IDFweDtcXG4gICAgaGVpZ2h0OiAzNXB4O1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBib3JkZXI6IDA7XFxufVxcblxcbi5hY19zZWN0aW9uIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xcbiAgICBjbGVhcjogYm90aDtcXG59XFxuXFxuLmFjX3NlY3Rpb24gPiAqOm5vdCguYWNfc2VjdGlvbikge1xcbiAgICBtYXgtd2lkdGg6IDUwMHB0O1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5hY19zZWN0aW9uIC5jbGVhcmZpeCB7XFxuICAgIHBvc2l0aW9uOiBpbml0aWFsO1xcbn1cXG5cXG4uYWNfb3V0cHV0IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgbWF4LXdpZHRoOiA0NTBweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXG59XFxuLmFjX291dHB1dCBwcmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyYXk7XFxufVxcblxcbi5hY19jYXB0aW9uIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuXFxuLmFjX2NhcHRpb25fdGV4dCB7XFxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxufVxcblxcbi5hY19xdWVzdGlvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjQsIDIzNiwgMjE3KTtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcXG4gICAgbWFyZ2luOiA1cHg7XFxufVxcblxcbi5hY3RpdmVfb3V0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RjZGNkYztcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtaW4td2lkdGg6IDIwZW07XFxuICAgIG1heC1oZWlnaHQ6IDMwMHB4O1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG59XFxuXFxuLnZpc2libGUtYWMtY2FudmFzIHtcXG4gICAgYm9yZGVyOiAycHggc29saWQgYmxhY2s7XFxufVxcblxcbi5hY19zZWN0aW9uID4gLmNvbC1tZC0xMiB7XFxuICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uZnVsbF93aWR0aCBvbCB7XFxuICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uYWMtZGlzYWJsZWQge1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuXFxuLmFjLWZlZWRiYWNrIHtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XFxuICAgIHBhZGRpbmc6IDNweDtcXG59XFxuXFxuLmFjX3NxbF9yZXN1bHQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyZXk7XFxuICAgIHBhZGRpbmc6IDEwcHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG59XFxuXFxuLmFjX3NxbF9yZXN1bHRfc3VjY2VzcyB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBjb2xvcjogZ3JlZW47XFxuICAgIGJvcmRlcjogMHB4O1xcbiAgICBwYWRkaW5nOiAwcHg7XFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgIG1pbi1oZWlnaHQ6IDBweCAhaW1wb3J0YW50O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdF9mYWlsdXJlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiByZWQ7XFxuICAgIGJvcmRlcjogMHB4O1xcbiAgICBwYWRkaW5nOiAwcHg7XFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgIG1pbi1oZWlnaHQ6IDBweCAhaW1wb3J0YW50O1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9jc3MvYWN0aXZlY29kZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxhQUFhO0lBQ2IsaUJBQWlCO0lBQ2pCLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osYUFBYTtJQUNiLHNCQUFzQjtJQUN0QiwrQkFBK0I7SUFDL0Isb0NBQW9DO0lBQ3BDLHVDQUF1QztJQUN2QyxtQkFBbUI7SUFDbkIsd0JBQXdCO0lBQ3hCLDJCQUEyQjtJQUMzQixtQkFBbUI7SUFDbkIsV0FBVztBQUNmOztBQUVBO0lBQ0ksYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixNQUFNO0lBQ04sT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osV0FBVztJQUNYLHVDQUF1QztJQUN2QyxRQUFRO0lBQ1IsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixxQkFBcUI7SUFDckIsa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVixZQUFZO0lBQ1osVUFBVTtJQUNWLFNBQVM7QUFDYjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLGdCQUFnQjtJQUNoQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLHlCQUF5QjtBQUM3QjtBQUNBO0lBQ0ksMkJBQTJCO0FBQy9COztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLG9DQUFvQztJQUNwQyxrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksb0JBQW9CO0FBQ3hCOztBQUVBO0lBQ0ksdUJBQXVCO0lBQ3ZCLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSwyQkFBMkI7SUFDM0IsYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSw2QkFBNkI7SUFDN0IsWUFBWTtJQUNaLFdBQVc7SUFDWCxZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQiwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSw2QkFBNkI7SUFDN0IsVUFBVTtJQUNWLFdBQVc7SUFDWCxZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQiwwQkFBMEI7QUFDOUJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLm1vZGFsLXByb2ZpbGUge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBtaW4taGVpZ2h0OiAzMDBweDtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgd2lkdGg6IDcwMHB4O1xcbiAgICBwYWRkaW5nOiAyNXB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZmZmO1xcbiAgICBib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICAtbW96LWJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIC13ZWJraXQtYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIGJhY2tncm91bmQ6ICNmMmYyZjI7XFxuICAgIHotaW5kZXg6IDUwO1xcbn1cXG5cXG4ubW9kYWwtbGlnaHRzb3V0IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDA7XFxuICAgIGxlZnQ6IDA7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICB6LWluZGV4OiAyNTtcXG4gICAgYmFja2dyb3VuZDogIzAwMDtcXG59XFxuXFxuLm1vZGFsLWNsb3NlLXByb2ZpbGUge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGhlaWdodDogNDNweDtcXG4gICAgd2lkdGg6IDQzcHg7XFxuICAgIC8qYmFja2dyb3VuZC1pbWFnZTogdXJsKCdjbG9zZS5wbmcnKTsgKi9cXG4gICAgdG9wOiAxcHg7XFxuICAgIHJpZ2h0OiAwLjVweDtcXG59XFxuXFxuLmFjX2FjdGlvbnMge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcblxcbi5hY19zZXAge1xcbiAgICBiYWNrZ3JvdW5kOiAjMDAwO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG1hcmdpbjogLTE1cHggMTBweDtcXG4gICAgd2lkdGg6IDFweDtcXG4gICAgaGVpZ2h0OiAzNXB4O1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBib3JkZXI6IDA7XFxufVxcblxcbi5hY19zZWN0aW9uIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xcbiAgICBjbGVhcjogYm90aDtcXG59XFxuXFxuLmFjX3NlY3Rpb24gPiAqOm5vdCguYWNfc2VjdGlvbikge1xcbiAgICBtYXgtd2lkdGg6IDUwMHB0O1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5hY19zZWN0aW9uIC5jbGVhcmZpeCB7XFxuICAgIHBvc2l0aW9uOiBpbml0aWFsO1xcbn1cXG5cXG4uYWNfb3V0cHV0IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgbWF4LXdpZHRoOiA0NTBweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXG59XFxuLmFjX291dHB1dCBwcmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyYXk7XFxufVxcblxcbi5hY19jYXB0aW9uIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuXFxuLmFjX2NhcHRpb25fdGV4dCB7XFxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxufVxcblxcbi5hY19xdWVzdGlvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjQsIDIzNiwgMjE3KTtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcXG4gICAgbWFyZ2luOiA1cHg7XFxufVxcblxcbi5hY3RpdmVfb3V0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RjZGNkYztcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtaW4td2lkdGg6IDIwZW07XFxuICAgIG1heC1oZWlnaHQ6IDMwMHB4O1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG59XFxuXFxuLnZpc2libGUtYWMtY2FudmFzIHtcXG4gICAgYm9yZGVyOiAycHggc29saWQgYmxhY2s7XFxufVxcblxcbi5hY19zZWN0aW9uID4gLmNvbC1tZC0xMiB7XFxuICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uZnVsbF93aWR0aCBvbCB7XFxuICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uYWMtZGlzYWJsZWQge1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuXFxuLmFjLWZlZWRiYWNrIHtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XFxuICAgIHBhZGRpbmc6IDNweDtcXG59XFxuXFxuLmFjX3NxbF9yZXN1bHQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyZXk7XFxuICAgIHBhZGRpbmc6IDEwcHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG59XFxuXFxuLmFjX3NxbF9yZXN1bHRfc3VjY2VzcyB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBjb2xvcjogZ3JlZW47XFxuICAgIGJvcmRlcjogMHB4O1xcbiAgICBwYWRkaW5nOiAwcHg7XFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgIG1pbi1oZWlnaHQ6IDBweCAhaW1wb3J0YW50O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdF9mYWlsdXJlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiByZWQ7XFxuICAgIGJvcmRlcjogMHB4O1xcbiAgICBwYWRkaW5nOiAwcHg7XFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgIG1pbi1oZWlnaHQ6IDBweCAhaW1wb3J0YW50O1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2FmXCI6IDQyNzg2LFxuXHRcIi4vYWYuanNcIjogNDI3ODYsXG5cdFwiLi9hclwiOiAzMDg2Nyxcblx0XCIuL2FyLWR6XCI6IDE0MTMwLFxuXHRcIi4vYXItZHouanNcIjogMTQxMzAsXG5cdFwiLi9hci1rd1wiOiA5NjEzNSxcblx0XCIuL2FyLWt3LmpzXCI6IDk2MTM1LFxuXHRcIi4vYXItbHlcIjogNTY0NDAsXG5cdFwiLi9hci1seS5qc1wiOiA1NjQ0MCxcblx0XCIuL2FyLW1hXCI6IDQ3NzAyLFxuXHRcIi4vYXItbWEuanNcIjogNDc3MDIsXG5cdFwiLi9hci1zYVwiOiAxNjA0MCxcblx0XCIuL2FyLXNhLmpzXCI6IDE2MDQwLFxuXHRcIi4vYXItdG5cIjogMzcxMDAsXG5cdFwiLi9hci10bi5qc1wiOiAzNzEwMCxcblx0XCIuL2FyLmpzXCI6IDMwODY3LFxuXHRcIi4vYXpcIjogMzEwODMsXG5cdFwiLi9hei5qc1wiOiAzMTA4Myxcblx0XCIuL2JlXCI6IDk4MDgsXG5cdFwiLi9iZS5qc1wiOiA5ODA4LFxuXHRcIi4vYmdcIjogNjgzMzgsXG5cdFwiLi9iZy5qc1wiOiA2ODMzOCxcblx0XCIuL2JtXCI6IDY3NDM4LFxuXHRcIi4vYm0uanNcIjogNjc0MzgsXG5cdFwiLi9iblwiOiA4OTA1LFxuXHRcIi4vYm4uanNcIjogODkwNSxcblx0XCIuL2JvXCI6IDExNTYwLFxuXHRcIi4vYm8uanNcIjogMTE1NjAsXG5cdFwiLi9iclwiOiAxMjc4LFxuXHRcIi4vYnIuanNcIjogMTI3OCxcblx0XCIuL2JzXCI6IDgwNjIyLFxuXHRcIi4vYnMuanNcIjogODA2MjIsXG5cdFwiLi9jYVwiOiAyNDY4LFxuXHRcIi4vY2EuanNcIjogMjQ2OCxcblx0XCIuL2NzXCI6IDU4MjIsXG5cdFwiLi9jcy5qc1wiOiA1ODIyLFxuXHRcIi4vY3ZcIjogNTA4NzcsXG5cdFwiLi9jdi5qc1wiOiA1MDg3Nyxcblx0XCIuL2N5XCI6IDQ3MzczLFxuXHRcIi4vY3kuanNcIjogNDczNzMsXG5cdFwiLi9kYVwiOiAyNDc4MCxcblx0XCIuL2RhLmpzXCI6IDI0NzgwLFxuXHRcIi4vZGVcIjogNTk3NDAsXG5cdFwiLi9kZS1hdFwiOiA2MDIxNyxcblx0XCIuL2RlLWF0LmpzXCI6IDYwMjE3LFxuXHRcIi4vZGUtY2hcIjogNjA4OTQsXG5cdFwiLi9kZS1jaC5qc1wiOiA2MDg5NCxcblx0XCIuL2RlLmpzXCI6IDU5NzQwLFxuXHRcIi4vZHZcIjogNTMwMCxcblx0XCIuL2R2LmpzXCI6IDUzMDAsXG5cdFwiLi9lbFwiOiA1MDgzNyxcblx0XCIuL2VsLmpzXCI6IDUwODM3LFxuXHRcIi4vZW4tYXVcIjogNzgzNDgsXG5cdFwiLi9lbi1hdS5qc1wiOiA3ODM0OCxcblx0XCIuL2VuLWNhXCI6IDc3OTI1LFxuXHRcIi4vZW4tY2EuanNcIjogNzc5MjUsXG5cdFwiLi9lbi1nYlwiOiAyMjI0Myxcblx0XCIuL2VuLWdiLmpzXCI6IDIyMjQzLFxuXHRcIi4vZW4taWVcIjogNDY0MzYsXG5cdFwiLi9lbi1pZS5qc1wiOiA0NjQzNixcblx0XCIuL2VuLW56XCI6IDc2MzE5LFxuXHRcIi4vZW4tbnouanNcIjogNzYzMTksXG5cdFwiLi9lb1wiOiA5MjkxNSxcblx0XCIuL2VvLmpzXCI6IDkyOTE1LFxuXHRcIi4vZXNcIjogNTU2NTUsXG5cdFwiLi9lcy1kb1wiOiA1NTI1MSxcblx0XCIuL2VzLWRvLmpzXCI6IDU1MjUxLFxuXHRcIi4vZXMtdXNcIjogNzExNDYsXG5cdFwiLi9lcy11cy5qc1wiOiA3MTE0Nixcblx0XCIuL2VzLmpzXCI6IDU1NjU1LFxuXHRcIi4vZXRcIjogNTYwMyxcblx0XCIuL2V0LmpzXCI6IDU2MDMsXG5cdFwiLi9ldVwiOiA3Nzc2Myxcblx0XCIuL2V1LmpzXCI6IDc3NzYzLFxuXHRcIi4vZmFcIjogNzY5NTksXG5cdFwiLi9mYS5qc1wiOiA3Njk1OSxcblx0XCIuL2ZpXCI6IDExODk3LFxuXHRcIi4vZmkuanNcIjogMTE4OTcsXG5cdFwiLi9mb1wiOiA5NDY5NCxcblx0XCIuL2ZvLmpzXCI6IDk0Njk0LFxuXHRcIi4vZnJcIjogOTQ0NzAsXG5cdFwiLi9mci1jYVwiOiA2MzA0OSxcblx0XCIuL2ZyLWNhLmpzXCI6IDYzMDQ5LFxuXHRcIi4vZnItY2hcIjogNTIzMzAsXG5cdFwiLi9mci1jaC5qc1wiOiA1MjMzMCxcblx0XCIuL2ZyLmpzXCI6IDk0NDcwLFxuXHRcIi4vZnlcIjogNTA0NCxcblx0XCIuL2Z5LmpzXCI6IDUwNDQsXG5cdFwiLi9nZFwiOiAyMTAxLFxuXHRcIi4vZ2QuanNcIjogMjEwMSxcblx0XCIuL2dsXCI6IDM4Nzk0LFxuXHRcIi4vZ2wuanNcIjogMzg3OTQsXG5cdFwiLi9nb20tbGF0blwiOiAyMzE2OCxcblx0XCIuL2dvbS1sYXRuLmpzXCI6IDIzMTY4LFxuXHRcIi4vZ3VcIjogOTUzNDksXG5cdFwiLi9ndS5qc1wiOiA5NTM0OSxcblx0XCIuL2hlXCI6IDI0MjA2LFxuXHRcIi4vaGUuanNcIjogMjQyMDYsXG5cdFwiLi9oaVwiOiAzMDA5NCxcblx0XCIuL2hpLmpzXCI6IDMwMDk0LFxuXHRcIi4vaHJcIjogMzAzMTYsXG5cdFwiLi9oci5qc1wiOiAzMDMxNixcblx0XCIuL2h1XCI6IDIyMTM4LFxuXHRcIi4vaHUuanNcIjogMjIxMzgsXG5cdFwiLi9oeS1hbVwiOiAxMTQyMyxcblx0XCIuL2h5LWFtLmpzXCI6IDExNDIzLFxuXHRcIi4vaWRcIjogMjkyMTgsXG5cdFwiLi9pZC5qc1wiOiAyOTIxOCxcblx0XCIuL2lzXCI6IDkwMTM1LFxuXHRcIi4vaXMuanNcIjogOTAxMzUsXG5cdFwiLi9pdFwiOiA5MDYyNixcblx0XCIuL2l0LmpzXCI6IDkwNjI2LFxuXHRcIi4vamFcIjogMzkxODMsXG5cdFwiLi9qYS5qc1wiOiAzOTE4Myxcblx0XCIuL2p2XCI6IDI0Mjg2LFxuXHRcIi4vanYuanNcIjogMjQyODYsXG5cdFwiLi9rYVwiOiA0MDQxNSxcblx0XCIuL2thLmpzXCI6IDQwNDE1LFxuXHRcIi4va2tcIjogNDc3NzIsXG5cdFwiLi9ray5qc1wiOiA0Nzc3Mixcblx0XCIuL2ttXCI6IDE4NzU4LFxuXHRcIi4va20uanNcIjogMTg3NTgsXG5cdFwiLi9rblwiOiA3OTI4Mixcblx0XCIuL2tuLmpzXCI6IDc5MjgyLFxuXHRcIi4va29cIjogMzM3MzAsXG5cdFwiLi9rby5qc1wiOiAzMzczMCxcblx0XCIuL2t5XCI6IDMzMjkxLFxuXHRcIi4va3kuanNcIjogMzMyOTEsXG5cdFwiLi9sYlwiOiAzNjg0MSxcblx0XCIuL2xiLmpzXCI6IDM2ODQxLFxuXHRcIi4vbG9cIjogNTU0NjYsXG5cdFwiLi9sby5qc1wiOiA1NTQ2Nixcblx0XCIuL2x0XCI6IDU3MDEwLFxuXHRcIi4vbHQuanNcIjogNTcwMTAsXG5cdFwiLi9sdlwiOiAzNzU5NSxcblx0XCIuL2x2LmpzXCI6IDM3NTk1LFxuXHRcIi4vbWVcIjogMzk4NjEsXG5cdFwiLi9tZS5qc1wiOiAzOTg2MSxcblx0XCIuL21pXCI6IDM1NDkzLFxuXHRcIi4vbWkuanNcIjogMzU0OTMsXG5cdFwiLi9ta1wiOiA5NTk2Nixcblx0XCIuL21rLmpzXCI6IDk1OTY2LFxuXHRcIi4vbWxcIjogODczNDEsXG5cdFwiLi9tbC5qc1wiOiA4NzM0MSxcblx0XCIuL21yXCI6IDEwMzcwLFxuXHRcIi4vbXIuanNcIjogMTAzNzAsXG5cdFwiLi9tc1wiOiA5ODQ3LFxuXHRcIi4vbXMtbXlcIjogNDEyMzcsXG5cdFwiLi9tcy1teS5qc1wiOiA0MTIzNyxcblx0XCIuL21zLmpzXCI6IDk4NDcsXG5cdFwiLi9tdFwiOiA3MjEyNixcblx0XCIuL210LmpzXCI6IDcyMTI2LFxuXHRcIi4vbXlcIjogNTYxNjUsXG5cdFwiLi9teS5qc1wiOiA1NjE2NSxcblx0XCIuL25iXCI6IDY0OTI0LFxuXHRcIi4vbmIuanNcIjogNjQ5MjQsXG5cdFwiLi9uZVwiOiAxNjc0NCxcblx0XCIuL25lLmpzXCI6IDE2NzQ0LFxuXHRcIi4vbmxcIjogOTM5MDEsXG5cdFwiLi9ubC1iZVwiOiA1OTgxNCxcblx0XCIuL25sLWJlLmpzXCI6IDU5ODE0LFxuXHRcIi4vbmwuanNcIjogOTM5MDEsXG5cdFwiLi9ublwiOiA4Mzg3Nyxcblx0XCIuL25uLmpzXCI6IDgzODc3LFxuXHRcIi4vcGEtaW5cIjogMTU4NTgsXG5cdFwiLi9wYS1pbi5qc1wiOiAxNTg1OCxcblx0XCIuL3BsXCI6IDY0NDk1LFxuXHRcIi4vcGwuanNcIjogNjQ0OTUsXG5cdFwiLi9wdFwiOiA4OTUyMCxcblx0XCIuL3B0LWJyXCI6IDU3OTcxLFxuXHRcIi4vcHQtYnIuanNcIjogNTc5NzEsXG5cdFwiLi9wdC5qc1wiOiA4OTUyMCxcblx0XCIuL3JvXCI6IDk2NDU5LFxuXHRcIi4vcm8uanNcIjogOTY0NTksXG5cdFwiLi9ydVwiOiAyMTc5Myxcblx0XCIuL3J1LmpzXCI6IDIxNzkzLFxuXHRcIi4vc2RcIjogNDA5NTAsXG5cdFwiLi9zZC5qc1wiOiA0MDk1MCxcblx0XCIuL3NlXCI6IDEwNDkwLFxuXHRcIi4vc2UuanNcIjogMTA0OTAsXG5cdFwiLi9zaVwiOiA5MDEyNCxcblx0XCIuL3NpLmpzXCI6IDkwMTI0LFxuXHRcIi4vc2tcIjogNjQyNDksXG5cdFwiLi9zay5qc1wiOiA2NDI0OSxcblx0XCIuL3NsXCI6IDE0OTg1LFxuXHRcIi4vc2wuanNcIjogMTQ5ODUsXG5cdFwiLi9zcVwiOiA1MTEwNCxcblx0XCIuL3NxLmpzXCI6IDUxMTA0LFxuXHRcIi4vc3JcIjogNDkxMzEsXG5cdFwiLi9zci1jeXJsXCI6IDEzNzA5LFxuXHRcIi4vc3ItY3lybC5qc1wiOiAxMzcwOSxcblx0XCIuL3NyLmpzXCI6IDQ5MTMxLFxuXHRcIi4vc3NcIjogODU4OTMsXG5cdFwiLi9zcy5qc1wiOiA4NTg5Myxcblx0XCIuL3N2XCI6IDk4NzYwLFxuXHRcIi4vc3YuanNcIjogOTg3NjAsXG5cdFwiLi9zd1wiOiA5MTE3Mixcblx0XCIuL3N3LmpzXCI6IDkxMTcyLFxuXHRcIi4vdGFcIjogMjczMzMsXG5cdFwiLi90YS5qc1wiOiAyNzMzMyxcblx0XCIuL3RlXCI6IDIzMTEwLFxuXHRcIi4vdGUuanNcIjogMjMxMTAsXG5cdFwiLi90ZXRcIjogNTIwOTUsXG5cdFwiLi90ZXQuanNcIjogNTIwOTUsXG5cdFwiLi90aFwiOiA5MDQxLFxuXHRcIi4vdGguanNcIjogOTA0MSxcblx0XCIuL3RsLXBoXCI6IDc1NzY4LFxuXHRcIi4vdGwtcGguanNcIjogNzU3NjgsXG5cdFwiLi90bGhcIjogODk0NDQsXG5cdFwiLi90bGguanNcIjogODk0NDQsXG5cdFwiLi90clwiOiA3MjM5Nyxcblx0XCIuL3RyLmpzXCI6IDcyMzk3LFxuXHRcIi4vdHpsXCI6IDI4MjU0LFxuXHRcIi4vdHpsLmpzXCI6IDI4MjU0LFxuXHRcIi4vdHptXCI6IDUxMTA2LFxuXHRcIi4vdHptLWxhdG5cIjogMzA2OTksXG5cdFwiLi90em0tbGF0bi5qc1wiOiAzMDY5OSxcblx0XCIuL3R6bS5qc1wiOiA1MTEwNixcblx0XCIuL3VrXCI6IDY3NjkxLFxuXHRcIi4vdWsuanNcIjogNjc2OTEsXG5cdFwiLi91clwiOiAxMzc5NSxcblx0XCIuL3VyLmpzXCI6IDEzNzk1LFxuXHRcIi4vdXpcIjogNjc5MSxcblx0XCIuL3V6LWxhdG5cIjogNjA1ODgsXG5cdFwiLi91ei1sYXRuLmpzXCI6IDYwNTg4LFxuXHRcIi4vdXouanNcIjogNjc5MSxcblx0XCIuL3ZpXCI6IDY1NjY2LFxuXHRcIi4vdmkuanNcIjogNjU2NjYsXG5cdFwiLi94LXBzZXVkb1wiOiAxNDM3OCxcblx0XCIuL3gtcHNldWRvLmpzXCI6IDE0Mzc4LFxuXHRcIi4veW9cIjogNzU4MDUsXG5cdFwiLi95by5qc1wiOiA3NTgwNSxcblx0XCIuL3poLWNuXCI6IDgzODM5LFxuXHRcIi4vemgtY24uanNcIjogODM4MzksXG5cdFwiLi96aC1oa1wiOiA1NTcyNixcblx0XCIuL3poLWhrLmpzXCI6IDU1NzI2LFxuXHRcIi4vemgtdHdcIjogNzQxNTIsXG5cdFwiLi96aC10dy5qc1wiOiA3NDE1MlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IDQ2NzAwOyIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vYWN0aXZlY29kZS5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuaW1wb3J0IEpTQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2pzLmpzXCI7XG5pbXBvcnQgSFRNTEFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9odG1sLmpzXCI7XG5pbXBvcnQgU1FMQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX3NxbC5qc1wiO1xuaW1wb3J0IEJyeXRob25BY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfYnJ5dGhvbi5qc1wiO1xuaW1wb3J0IExpdmVDb2RlIGZyb20gXCIuL2xpdmVjb2RlLmpzXCI7XG5pbXBvcnQge1xuICAgIFRpbWVkQWN0aXZlQ29kZSxcbiAgICBUaW1lZExpdmVDb2RlLFxuICAgIFRpbWVkSlNBY3RpdmVDb2RlLFxuICAgIFRpbWVkSFRNTEFjdGl2ZUNvZGUsXG4gICAgVGltZWRTUUxBY3RpdmVDb2RlLFxuICAgIFRpbWVkQnJ5dGhvbkFjdGl2ZUNvZGUsXG59IGZyb20gXCIuL3RpbWVkX2FjdGl2ZWNvZGVcIjtcbmltcG9ydCBcIi4uLy4uL2NvbW1vbi9qcy9qcXVlcnkuaGlnaGxpZ2h0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFDRmFjdG9yeSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZm9vID0gXCJiYXJcIjtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUFjdGl2ZUNvZGUob3JpZywgbGFuZywgYWRkb3B0cykge1xuICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgIG9yaWc6IG9yaWcsXG4gICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMsXG4gICAgICAgICAgICBweXRob24zOiBlQm9va0NvbmZpZy5weXRob24zLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoYWRkb3B0cykge1xuICAgICAgICAgICAgZm9yICh2YXIgYXR0cm5hbWUgaW4gYWRkb3B0cykge1xuICAgICAgICAgICAgICAgIG9wdHNbYXR0cm5hbWVdID0gYWRkb3B0c1thdHRybmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGFuZyA9ICQob3B0cy5vcmlnKS5maW5kKFwiW2RhdGEtbGFuZ11cIikuZGF0YShcImxhbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRleHRfYXJlYSA9ICQob3B0cy5vcmlnKS5maW5kKFwidGV4dGFyZWFcIilbMF1cbiAgICAgICAgdmFyIHB5dGhvbjNfaW50ZXJwcmV0ZXIgPSAkKHRleHRfYXJlYSkuYXR0cihcImRhdGEtcHl0aG9uM19pbnRlcnByZXRlclwiKTtcbiAgICAgICAgdmFyIG91dHB1dF9oZWlnaHQgPSAkKHRleHRfYXJlYSkuYXR0cihcImRhdGEtb3V0cHV0X2hlaWdodFwiKTtcbiAgICAgICAgaWYgKG9wdHMudGltZWQgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYocHl0aG9uM19pbnRlcnByZXRlcj09PVwiYnJ5dGhvblwiKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkQnJ5dGhvbkFjdGl2ZUNvZGUob3B0cyk7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGFuZyA9PT0gXCJweXRob25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBsYW5nID09PSBcImphdmFcIiB8fFxuICAgICAgICAgICAgICAgIGxhbmcgPT09IFwiY3BwXCIgfHxcbiAgICAgICAgICAgICAgICBsYW5nID09PSBcImNcIiB8fFxuICAgICAgICAgICAgICAgIGxhbmcgPT09IFwicHl0aG9uM1wiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkTGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwiamF2YXNjcmlwdFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEpTQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJodG1sbWl4ZWRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRIVE1MQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJzcWxcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRTUUxBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICgobGFuZyA9PT1cInB5dGhvbjNcIikgJiYgKHB5dGhvbjNfaW50ZXJwcmV0ZXIgPT09IFwiYnJ5dGhvblwiKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCcnl0aG9uQWN0aXZlQ29kZShvcHRzKTsgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGxhbmcgPT09IFwiamF2YXNjcmlwdFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKU0FjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwiaHRtbG1peGVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhUTUxBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcInNxbFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTUUxBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBbXCJqYXZhXCIsIFwiY3BwXCIsIFwiY1wiLCBcInB5dGhvbjNcIiwgXCJweXRob24yXCIsIFwib2N0YXZlXCJdLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgIGxhbmdcbiAgICAgICAgICAgICAgICApID4gLTFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaXMgcHl0aG9uXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHVzZWQgYnkgd2ViMnB5IGNvbnRyb2xsZXIocylcbiAgICBzdGF0aWMgYWRkQWN0aXZlQ29kZVRvRGl2KG91dGVyZGl2aWQsIGFjZGl2aWQsIHNpZCwgaW5pdGlhbGNvZGUsIGxhbmd1YWdlKSB7XG4gICAgICAgIHZhciB0aGVwcmUsIG5ld2FjO1xuICAgICAgICB2YXIgYWNkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhY2RpdmlkKTtcbiAgICAgICAgJChhY2RpdikuZW1wdHkoKTtcbiAgICAgICAgdGhlcHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICB0aGVwcmVbXCJkYXRhLWNvbXBvbmVudFwiXSA9IFwiYWN0aXZlY29kZVwiO1xuICAgICAgICB0aGVwcmUuaWQgPSBvdXRlcmRpdmlkO1xuICAgICAgICAkKHRoZXByZSkuZGF0YShcImxhbmdcIiwgbGFuZ3VhZ2UpO1xuICAgICAgICAkKGFjZGl2KS5hcHBlbmQodGhlcHJlKTtcbiAgICAgICAgdmFyIG9wdHMgPSB7XG4gICAgICAgICAgICBvcmlnOiB0aGVwcmUsXG4gICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGFkZG9wdHMgPSB7XG4gICAgICAgICAgICBzaWQ6IHNpZCxcbiAgICAgICAgICAgIGdyYWRlcmFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGxhbmd1YWdlID09PSBcImh0bWxtaXhlZFwiKSB7XG4gICAgICAgICAgICBhZGRvcHRzW1widmVydGljYWxcIl0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG5ld2FjID0gQUNGYWN0b3J5LmNyZWF0ZUFjdGl2ZUNvZGUodGhlcHJlLCBsYW5ndWFnZSwgYWRkb3B0cyk7XG4gICAgICAgIHZhciBzYXZlZGl2ID0gbmV3YWMuZGl2aWQ7XG4gICAgICAgIG5ld2FjLmRpdmlkID0gc2F2ZWRpdjtcbiAgICAgICAgbmV3YWMuZWRpdG9yLnNldFNpemUoNTAwLCAzMDApO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG5ld2FjLmVkaXRvci5yZWZyZXNoKCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVBY3RpdmVDb2RlRnJvbU9wdHMob3B0cykge1xuICAgICAgICByZXR1cm4gQUNGYWN0b3J5LmNyZWF0ZUFjdGl2ZUNvZGUob3B0cy5vcmlnLCBvcHRzLmxhbmcsIG9wdHMpO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlU2NyYXRjaEFjdGl2ZWNvZGUoKSB7XG4gICAgICAgIC8qIHNldCB1cCB0aGUgc2NyYXRjaCBBY3RpdmVjb2RlIGVkaXRvciBpbiB0aGUgc2VhcmNoIG1lbnUgKi9cbiAgICAgICAgLy8gdXNlIHRoZSBVUkwgdG8gYXNzaWduIGEgZGl2aWQgLSBlYWNoIHBhZ2Ugc2hvdWxkIGhhdmUgYSB1bmlxdWUgQWN0aXZlY29kZSBibG9jayBpZC5cbiAgICAgICAgLy8gUmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgVVJMIGJ1dCB0aGUgY291cnNlIGFuZCBwYWdlIG5hbWVcbiAgICAgICAgLy8gdG9kbzogIHRoaXMgY291bGQgcHJvYmFibHkgYmUgZWxpbWluYXRlZCBhbmQgc2ltcGx5IG1vdmVkIHRvIHRoZSB0ZW1wbGF0ZSBmaWxlXG5cbiAgICAgICAgaWYgKGVCb29rQ29uZmlnLmVuYWJsZVNjcmF0Y2hBQyA9PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBkaXZpZCA9IGVCb29rQ29uZmlnLmNvdXJzZSArIFwiX3NjcmF0Y2hfYWNcIjtcbiAgICAgICAgZGl2aWQgPSBkaXZpZC5yZXBsYWNlKC9bIy5dL2csIFwiXCIpOyAvLyBpbiBjYXNlIGJvb2sgdGl0bGUgaGFzIGNoYXJhY3RlcnMgdGhhdCB3aWxsIG1lc3MgdXAgb3VyIHNlbGVjdG9yc1xuICAgICAgICBlQm9va0NvbmZpZy5zY3JhdGNoRGl2ID0gZGl2aWQ7XG4gICAgICAgIGxldCBzdGRpbiA9IFwiXCI7XG4gICAgICAgIHZhciBsYW5nID0gZUJvb2tDb25maWcuYWNEZWZhdWx0TGFuZ3VhZ2VcbiAgICAgICAgICAgID8gZUJvb2tDb25maWcuYWNEZWZhdWx0TGFuZ3VhZ2VcbiAgICAgICAgICAgIDogXCJweXRob25cIjtcbiAgICAgICAgaWYgKGxhbmcgPT09IFwiamF2YVwiIHx8IGxhbmcgPT09IFwiY3BwXCIgfHwgbGFuZyA9PT0gXCJweXRob24zXCIpIHtcbiAgICAgICAgICAgIHN0ZGluID0gYGRhdGEtc3RkaW49XCJ0ZXh0IGZvciBzdGRpblwiYDtcbiAgICAgICAgfVxuICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgSFRNTFxuICAgICAgICB2YXIgaHRtbCA9IGA8ZGl2IGlkPVwiYWNfbW9kYWxfJHtkaXZpZH1cIiBjbGFzcz1cIm1vZGFsIGZhZGVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBzY3JhdGNoLWFjLW1vZGFsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPlNjcmF0Y2ggQWN0aXZlQ29kZTwvaDQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtY29tcG9uZW50PVwiYWN0aXZlY29kZVwiIGlkPSR7ZGl2aWR9PlxuICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ke2RpdmlkfV9xdWVzdGlvbiBjbGFzcz1cImFjX3F1ZXN0aW9uXCI+PHA+VXNlIHRoaXMgYXJlYSBmb3Igd3JpdGluZyBjb2RlIG9yIHRha2luZyBub3Rlcy48L3A+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgZGF0YS1jb2RlbGVucz1cInRydWVcIiBkYXRhLWxhbmc9XCIke2xhbmd9XCIgJHtzdGRpbn0+XG5cblxuXG5cbiAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHZhciBlbCA9ICQoaHRtbCk7XG4gICAgICAgICQoXCJib2R5XCIpLmFwcGVuZChlbCk7XG4gICAgICAgIGVsLm9uKFwic2hvd24uYnMubW9kYWwgc2hvdy5icy5tb2RhbFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBlbC5maW5kKFwiLkNvZGVNaXJyb3JcIikuZWFjaChmdW5jdGlvbiAoaSwgZSkge1xuICAgICAgICAgICAgICAgIGUuQ29kZU1pcnJvci5yZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgZS5Db2RlTWlycm9yLmZvY3VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b2dnbGVTY3JhdGNoQWN0aXZlY29kZSgpIHtcbiAgICAgICAgdmFyIGRpdmlkID0gXCJhY19tb2RhbF9cIiArIGVCb29rQ29uZmlnLnNjcmF0Y2hEaXY7XG4gICAgICAgIHZhciBkaXYgPSAkKFwiI1wiICsgZGl2aWQpO1xuICAgICAgICAkKGAjJHtlQm9va0NvbmZpZy5zY3JhdGNoRGl2fWApLnJlbW92ZUNsYXNzKFwiYWNfc2VjdGlvblwiKTtcbiAgICAgICAgZGl2Lm1vZGFsKFwidG9nZ2xlXCIpO1xuICAgIH1cbn1cblxuLy9cbi8vIFBhZ2UgSW5pdGlhbGl6YXRpb25cbi8vXG5cbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIiwgZnVuY3Rpb24gKCkge1xuICAgIEFDRmFjdG9yeS5jcmVhdGVTY3JhdGNoQWN0aXZlY29kZSgpO1xuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9YWN0aXZlY29kZV1cIikuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoXCJbZGF0YS1jb21wb25lbnQ9dGltZWRBc3Nlc3NtZW50XVwiKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBlbGVtZW50IGV4aXN0cyB3aXRoaW4gYSB0aW1lZCBjb21wb25lbnQsIGRvbid0IHJlbmRlciBpdCBoZXJlXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5lZExpc3RbdGhpcy5pZF0gPSBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKFwidGV4dGFyZWFcIikuZGF0YShcImxhbmdcIilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJlbmRlcmluZyBBY3RpdmVjb2RlIFByb2JsZW0gJHt0aGlzLmlkfVxuICAgICAgICAgICAgICAgIERldGFpbHM6ICR7ZXJyfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGxvZ2dlZG91dCkge1xuICAgICAgICBmb3IgKGxldCBrIGluIHdpbmRvdy5lZExpc3QpIHtcbiAgICAgICAgICAgIHdpbmRvdy5lZExpc3Rba10uZGlzYWJsZVNhdmVMb2FkKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBrIGluIHdpbmRvdy5lZExpc3QpIHtcbiAgICAgICAgICAgIHdpbmRvdy5lZExpc3Rba10uZW5hYmxlU2F2ZUxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5pZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xufVxuXG53aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkuYWN0aXZlY29kZSA9IEFDRmFjdG9yeS5jcmVhdGVBY3RpdmVDb2RlRnJvbU9wdHM7XG5cbi8vIFRoaXMgaXMgdGhlIGVhc2llc3Qgd2F5IHRvIGV4cG9zZSB0aGlzIG91dHNpZGUgdGhlIG1vZHVsZS5cbndpbmRvdy5BQ0ZhY3RvcnkgPSBBQ0ZhY3Rvcnk7XG5cbi8vIFRoaXMgc2VlbXMgYSBiaXQgaGFja3kgYW5kIHBvc3NpYmx5IGJyaXR0bGUsIGJ1dCBpdHMgaGFyZCB0byBrbm93IGhvdyBsb25nIGl0IHdpbGwgdGFrZSB0b1xuLy8gZmlndXJlIG91dCB0aGUgbG9naW4vbG9nb3V0IHN0YXR1cyBvZiB0aGUgdXNlci4gIFNvbWV0aW1lcyBpdHMgaW1tZWRpYXRlLCBhbmQgc29tZXRpbWVzIGl0c1xuLy8gbG9uZy4gIFNvIHRvIGJlIHNhZmUgd2UnbGwgZG8gaXQgYm90aCB3YXlzLi5cbnZhciBsb2dnZWRvdXQ7XG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ291dFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgbG9nZ2Vkb3V0ID0gdHJ1ZTtcbn0pO1xuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dvdXRcIiwgZnVuY3Rpb24gKCkge1xuICAgIGZvciAobGV0IGsgaW4gd2luZG93LmVkTGlzdCkge1xuICAgICAgICBpZiAod2luZG93LmVkTGlzdC5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgd2luZG93LmVkTGlzdFtrXS5kaXNhYmxlU2F2ZUxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiJC5pMThuKCkubG9hZCh7XG4gICAgZW46IHtcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZF9oaXN0b3J5OiBcIkxvYWQgSGlzdG9yeVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyOiBcIkF1ZGlvIFRvdXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGVkX2NvZGU6IFwiTG9hZGVkIHlvdXIgc2F2ZWQgY29kZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fc2F2ZWRfY29kZTogXCJObyBzYXZlZCBjb2RlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ydW5fY29kZTogXCJSdW5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19mZWVkYmFjazogXCJTaG93IEZlZWRiYWNrXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZTogXCJTaG93IENvZGVcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlOiBcIkhpZGUgQ29kZVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVsZW5zOiBcIlNob3cgQ29kZUxlbnNcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuczogXCJTaG93IGluIENvZGVMZW5zXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZWxlbnM6IFwiSGlkZSBDb2RlbGVuc1wiLFxuXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhcnNlX2Vycm9yOlxuICAgICAgICAgICAgXCJBIHBhcnNlIGVycm9yIG1lYW5zIHRoYXQgUHl0aG9uIGRvZXMgbm90IHVuZGVyc3RhbmQgdGhlIHN5bnRheCBvbiB0aGUgbGluZSB0aGUgZXJyb3IgbWVzc2FnZSBwb2ludHMgb3V0LiBDb21tb24gZXhhbXBsZXMgYXJlIGZvcmdldHRpbmcgY29tbWFzIGJldGV3ZWVuIGFyZ3VtZW50cyBvciBmb3JnZXR0aW5nIGEgOiBvbiBhIGZvciBzdGF0ZW1lbnRcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGFyc2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUbyBmaXggYSBwYXJzZSBlcnJvciB5b3UganVzdCBuZWVkIHRvIGxvb2sgY2FyZWZ1bGx5IGF0IHRoZSBsaW5lIHdpdGggdGhlIGVycm9yIGFuZCBwb3NzaWJseSB0aGUgbGluZSBiZWZvcmUgaXQuICBNYWtlIHN1cmUgaXQgY29uZm9ybXMgdG8gYWxsIG9mIFB5dGhvbidzIHJ1bGVzLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yOlxuICAgICAgICAgICAgXCJUeXBlIGVycm9ycyBtb3N0IG9mdGVuIG9jY3VyIHdoZW4gYW4gZXhwcmVzc2lvbiB0cmllcyB0byBjb21iaW5lIHR3byBvYmplY3RzIHdpdGggdHlwZXMgdGhhdCBzaG91bGQgbm90IGJlIGNvbWJpbmVkLiAgTGlrZSByYWlzaW5nIGEgc3RyaW5nIHRvIGEgcG93ZXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRvIGZpeCBhIHR5cGUgZXJyb3IgeW91IHdpbGwgbW9zdCBsaWtlbHkgbmVlZCB0byB0cmFjZSB0aHJvdWdoIHlvdXIgY29kZSBhbmQgbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgdHlwZXMgeW91IGV4cGVjdCB0aGVtIHRvIGhhdmUuICBJdCBtYXkgYmUgaGVscGZ1bCB0byBwcmludCBvdXQgZWFjaCB2YXJpYWJsZSBhbG9uZyB0aGUgd2F5IHRvIGJlIHN1cmUgaXRzIHZhbHVlIGlzIHdoYXQgeW91IHRoaW5rIGl0IHNob3VsZCBiZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcjpcbiAgICAgICAgICAgIFwiQSBuYW1lIGVycm9yIGFsbW9zdCBhbHdheXMgbWVhbnMgdGhhdCB5b3UgaGF2ZSB1c2VkIGEgdmFyaWFibGUgYmVmb3JlIGl0IGhhcyBhIHZhbHVlLiAgT2Z0ZW4gdGhpcyBtYXkgYmUgYSBzaW1wbGUgdHlwbywgc28gY2hlY2sgdGhlIHNwZWxsaW5nIGNhcmVmdWxseS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZWNrIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgYXNzaWdubWVudCBzdGF0ZW1lbnRzIGFuZCB5b3VyIGZ1bmN0aW9uIGNhbGxzLCB0aGlzIGlzIHRoZSBtb3N0IGxpa2VseSBwbGFjZSBmb3IgYSBOYW1lRXJyb3IgdG8gYmUgZm91bmQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yOlxuICAgICAgICAgICAgXCJBIFZhbHVlRXJyb3IgbW9zdCBvZnRlbiBvY2N1cnMgd2hlbiB5b3UgcGFzcyBhIHBhcmFtZXRlciB0byBhIGZ1bmN0aW9uIGFuZCB0aGUgZnVuY3Rpb24gaXMgZXhwZWN0aW5nIG9uZSB0eXBlIGFuZCB5b3UgcGFzcyBhbm90aGVyLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRoZSBlcnJvciBtZXNzYWdlIGdpdmVzIHlvdSBhIHByZXR0eSBnb29kIGhpbnQgYWJvdXQgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGFzIHdlbGwgYXMgdGhlIHZhbHVlIHRoYXQgaXMgaW5jb3JyZWN0LiBMb29rIGF0IHRoZSBlcnJvciBtZXNzYWdlIGNsb3NlbHkgYW5kIHRoZW4gdHJhY2UgYmFjayB0byB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgcHJvYmxlbWF0aWMgdmFsdWUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBlcnJvciBtZXNzYWdlIGlzIHRlbGxpbmcgeW91IHRoYXQgdGhlIG9iamVjdCBvbiB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIGRvdCwgZG9lcyBub3QgaGF2ZSB0aGUgYXR0cmlidXRlIG9yIG1ldGhvZCBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUaGUgbW9zdCBjb21tb24gdmFyaWFudCBvZiB0aGlzIG1lc3NhZ2UgaXMgdGhhdCB0aGUgb2JqZWN0IHVuZGVmaW5lZCBkb2VzIG5vdCBoYXZlIGF0dHJpYnV0ZSBYLiAgVGhpcyB0ZWxscyB5b3UgdGhhdCB0aGUgb2JqZWN0IG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgZG90IGlzIG5vdCB3aGF0IHlvdSB0aGluay4gVHJhY2UgdGhlIHZhcmlhYmxlIGJhY2sgYW5kIHByaW50IGl0IG91dCBpbiB2YXJpb3VzIHBsYWNlcyB1bnRpbCB5b3UgZGlzY292ZXIgd2hlcmUgaXQgYmVjb21lcyB1bmRlZmluZWQuICBPdGhlcndpc2UgY2hlY2sgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBkb3QgZm9yIGEgdHlwby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdG9rZW5fZXJyb3I6XG4gICAgICAgICAgICBcIk1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBlcnJvciBpbmRpY2F0ZXMgdGhhdCB5b3UgaGF2ZSBmb3Jnb3R0ZW4gYSByaWdodCBwYXJlbnRoZXNpcyBvciBoYXZlIGZvcmdvdHRlbiB0byBjbG9zZSBhIHBhaXIgb2YgcXVvdGVzLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZWNrIGVhY2ggbGluZSBvZiB5b3VyIHByb2dyYW0gYW5kIG1ha2Ugc3VyZSB0aGF0IHlvdXIgcGFyZW50aGVzaXMgYXJlIGJhbGFuY2VkLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yOlxuICAgICAgICAgICAgXCJZb3VyIHByb2dyYW0gaXMgcnVubmluZyB0b28gbG9uZy4gIE1vc3QgcHJvZ3JhbXMgaW4gdGhpcyBib29rIHNob3VsZCBydW4gaW4gbGVzcyB0aGFuIDEwIHNlY29uZHMgZWFzaWx5LiBUaGlzIHByb2JhYmx5IGluZGljYXRlcyB5b3VyIHByb2dyYW0gaXMgaW4gYW4gaW5maW5pdGUgbG9vcC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkFkZCBzb21lIHByaW50IHN0YXRlbWVudHMgdG8gZmlndXJlIG91dCBpZiB5b3VyIHByb2dyYW0gaXMgaW4gYW4gaW5maW50ZSBsb29wLiAgSWYgaXQgaXMgbm90IHlvdSBjYW4gaW5jcmVhc2UgdGhlIHJ1biB0aW1lIHdpdGggc3lzLnNldEV4ZWN1dGlvbkxpbWl0KG1zZWNzKVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yOlxuICAgICAgICAgICAgXCJZb3VyIHByb2dyYW0gaXMgcnVubmluZyBmb3IgdG9vIGxvbmcuICBNb3N0IHByb2dyYW1zIGluIHRoaXMgYm9vayBzaG91bGQgcnVuIGluIGxlc3MgdGhhbiAzMCBzZWNvbmRzIGVhc2lseS4gVGhpcyBwcm9iYWJseSBpbmRpY2F0ZXMgeW91ciBwcm9ncmFtIGlzIGluIGFuIGluZmluaXRlIGxvb3AuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJBZGQgc29tZSBwcmludCBzdGF0ZW1lbnRzIHRvIGZpZ3VyZSBvdXQgaWYgeW91ciBwcm9ncmFtIGlzIGluIGFuIGluZmludGUgbG9vcC4gIElmIGl0IGlzIG5vdCB5b3UgY2FuIGluY3JlYXNlIHRoZSBydW4gdGltZSB3aXRoIHN5cy5zZXRFeGVjdXRpb25MaW1pdChtc2VjcylcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIG1lc3NhZ2UgaW5kaWNhdGVzIHRoYXQgUHl0aG9uIGNhbid0IGZpZ3VyZSBvdXQgdGhlIHN5bnRheCBvZiBhIHBhcnRpY3VsYXIgc3RhdGVtZW50LiAgU29tZSBleGFtcGxlcyBhcmUgYXNzaWduaW5nIHRvIGEgbGl0ZXJhbCwgb3IgYSBmdW5jdGlvbiBjYWxsXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZWNrIHlvdXIgYXNzaWdubWVudCBzdGF0ZW1lbnRzIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIGFzc2lnbm1lbnQgaXMgYSB2YXJpYWJsZSwgbm90IGEgbGl0ZXJhbCBvciBhIGZ1bmN0aW9uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgbWVzc2FnZSBpbmRpY2F0ZXMgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBhY2Nlc3MgYW4gZWxlbWVudCBvZiBhIGRpY3Rpb25hcnksIGJ1dCB0aGUgZGljdGlvbmFyeSBkb2VzIG5vdCBoYXZlIHRoYXQgdGhlIGtleSB5b3UgYXJlIHVzaW5nLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJZb3UgbWF5IGhhdmUgYSB0eXBvIGluIHRoZSBuYW1lIG9mIHlvdXIga2V5LiAgSXQgaXMgYWxzbyBnb29kIHByYWN0aWNlIHRvIGNoZWNrIGlmIHRoZSBrZXkgZXhpc3RzIHVzaW5nIGEgc3RhdGVtZW50IGxpa2UgaWYga2V5IGluIG15ZGljdC4gIFlvdSBjYW4gYWxzbyB1c2UgbXlkaWN0LmdldChrZXksZGVmYXVsdHZhbHVlKSBzbyB0aGF0IGlmIHRoZSBrZXkgaXMgbm90IGluIHRoZSBkaWN0aW9uYXJ5IHlvdSBnZXQgdGhlIGRlZmF1bHQgdmFsdWUgaW5zdGVhZCBvZiBhbiBlcnJvci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgbWVzc2FnZSBtZWFucyB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGluZGV4IHBhc3QgdGhlIGVuZCBvZiBhIHN0cmluZyBvciBhIGxpc3QuICBGb3IgZXhhbXBsZSBpZiB5b3VyIGxpc3QgaGFzIDMgdGhpbmdzIGluIGl0IGFuZCB5b3UgdHJ5IHRvIGFjY2VzcyB0aGUgaXRlbSBhdCBwb3NpdGlvbiAzIG9yIG1vcmUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUmVtZW1iZXIgdGhhdCB0aGUgZmlyc3QgaXRlbSBpbiBhIGxpc3Qgb3Igc3RyaW5nIGlzIGF0IGluZGV4IHBvc2l0aW9uIDAsIHF1aXRlIG9mdGVuIHRoaXMgbWVzc2FnZSBjb21lcyBhYm91dCBiZWNhdXNlIHlvdSBhcmUgb2ZmIGJ5IG9uZS4gIFJlbWVtYmVyIGluIGEgbGlzdCBvZiBsZW5ndGggMyB0aGUgbGFzdCBsZWdhbCBpbmRleCBpcyAyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcjogXCJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yX2ZpeDogXCJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGVzIHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gaW1wb3J0IGEgbW9kdWxlIHRoYXQgZG9lcyBub3QgZXhpc3RcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiT25lIHByb2JsZW0gbWF5IHNpbXBseSBiZSB0aGF0IHlvdSBoYXZlIGEgdHlwby4gIEl0IG1heSBhbHNvIGJlIHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gaW1wb3J0IGEgbW9kdWxlIHRoYXQgZXhpc3RzIGluICdyZWFsJyBQeXRob24sIGJ1dCBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGJvb2suICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBwbGVhc2Ugc3VibWl0IGEgZmVhdHVyZSByZXF1ZXN0IHRvIGhhdmUgdGhlIG1vZHVsZSBhZGRlZC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIGlzIG1vc3QgbGlrZWx5IGFuIGludGVybmFsIGVycm9yLCBwYXJ0aWN1bGFybHkgaWYgdGhlIG1lc3NhZ2UgcmVmZXJlbmNlcyB0aGUgY29uc29sZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVHJ5IHJlZnJlc2hpbmcgdGhlIHdlYnBhZ2UsIGFuZCBpZiB0aGUgZXJyb3IgY29udGludWVzLCBzdWJtaXQgYSBidWcgcmVwb3J0IGFsb25nIHdpdGggeW91ciBjb2RlXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgdGVsbHMgeW91IHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gZGl2aWRlIGJ5IDAuIFR5cGljYWxseSB0aGlzIGlzIGJlY2F1c2UgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBpbiB0aGUgZGVub21pbmF0b3Igb2YgYSBkaXZpc2lvbiBleHByZXNzaW9uIGhhcyB0aGUgdmFsdWUgMFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiWW91IG1heSBuZWVkIHRvIHByb3RlY3QgYWdhaW5zdCBkaXZpZGluZyBieSAwIHdpdGggYW4gaWYgc3RhdG1lbnQsIG9yIHlvdSBtYXkgbmVlZCB0byByZXhhbWluZSB5b3VyIGFzc3VtcHRpb25zIGFib3V0IHRoZSBsZWdhbCB2YWx1ZXMgb2YgdmFyaWFibGVzLCBpdCBjb3VsZCBiZSBhbiBlYXJsaWVyIHN0YXRtZW50IHRoYXQgaXMgdW5leHBlY3RlZGx5IGFzc2lnbmluZyBhIHZhbHVlIG9mIHplcm8gdG8gdGhlIHZhcmlhYmxlIGluIHF1ZXN0aW9uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBtZXNzYWdlIGFsbW9zdCBhbHdheXMgc2hvd3MgdXAgaW4gdGhlIGZvcm0gb2YgTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVGhpcyBhbHdheXMgb2NjdXJzIHdoZW4gYSBmdW5jdGlvbiBjYWxscyBpdHNlbGYuICBJdHMgcHJldHR5IGxpa2VseSB0aGF0IHlvdSBhcmUgbm90IGRvaW5nIHRoaXMgb24gcHVycG9zZS4gRXhjZXB0IGluIHRoZSBjaGFwdGVyIG9uIHJlY3Vyc2lvbi4gIElmIHlvdSBhcmUgaW4gdGhhdCBjaGFwdGVyIHRoZW4gaXRzIGxpa2VseSB5b3UgaGF2ZW4ndCBpZGVudGlmaWVkIGEgZ29vZCBiYXNlIGNhc2UuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yOlxuICAgICAgICAgICAgXCJBbiBJbnRlcm5hbCBlcnJvciBtYXkgbWVhbiB0aGF0IHlvdSd2ZSB0cmlnZ2VyZWQgYSBidWcgaW4gb3VyIFB5dGhvblwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlJlcG9ydCB0aGlzIGVycm9yLCBhbG9uZyB3aXRoIHlvdXIgY29kZSBhcyBhIGJ1Zy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgZXJyb3Igb2NjdXJzIHdoZW4geW91IGhhdmUgbm90IGluZGVudGVkIHlvdXIgY29kZSBwcm9wZXJseS4gIFRoaXMgaXMgbW9zdCBsaWtlbHkgdG8gaGFwcGVuIGFzIHBhcnQgb2YgYW4gaWYsIGZvciwgd2hpbGUgb3IgZGVmIHN0YXRlbWVudC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVjayB5b3VyIGlmLCBkZWYsIGZvciwgYW5kIHdoaWxlIHN0YXRlbWVudHMgdG8gYmUgc3VyZSB0aGUgbGluZXMgYXJlIHByb3Blcmx5IGluZGVudGVkIGJlbmVhdGggdGhlbS4gIEFub3RoZXIgc291cmNlIG9mIHRoaXMgZXJyb3IgY29tZXMgZnJvbSBjb3B5aW5nIGFuZCBwYXN0aW5nIGNvZGUgd2hlcmUgeW91IGhhdmUgYWNjaWRlbnRhbGx5IGxlZnQgc29tZSBiaXRzIG9mIGNvZGUgbHlpbmcgYXJvdW5kIHRoYXQgZG9uJ3QgYmVsb25nIHRoZXJlIGFueW1vcmUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBlcnJvciBvY2N1cnMgd2hlbiB5b3UgdHJ5IHRvIHVzZSBhIGJ1aWx0aW4gZnVuY3Rpb24gb2YgUHl0aG9uIHRoYXQgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIGluIHRoaXMgaW4tYnJvd3NlciB2ZXJzaW9uIG9mIFB5dGhvbi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiRm9yIG5vdyB0aGUgb25seSB3YXkgdG8gZml4IHRoaXMgaXMgdG8gbm90IHVzZSB0aGUgZnVuY3Rpb24uICBUaGVyZSBtYXkgYmUgd29ya2Fyb3VuZHMuICBJZiB5b3UgcmVhbGx5IG5lZWQgdGhpcyBidWlsdGluIGZ1bmN0aW9uIHRoZW4gZmlsZSBhIGJ1ZyByZXBvcnQgYW5kIHRlbGwgdXMgaG93IHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSB0aGUgZnVuY3Rpb24uXCIsXG5cbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZmlsZV9ub3RfZm91bmQ6IFwiRmlsZSBub3QgZm91bmQ6ICckMSdcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fZmlsZV9vcl9kaXI6XG4gICAgICAgICAgICBcIltFcnJubyAyXSBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5OiAnJDEnXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N0YXJ0aW5nOiBcIkNsaWNrIHRoZSBwbGF5IGJ1dHRvbiB0byBiZWdpbiB0aGUgJDFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGxheWluZzogXCJQbGF5aW5nIHRoZSAkMVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkaW5nX2F1ZGlvOlxuICAgICAgICAgICAgXCJMb2FkaW5nIGF1ZGlvLiAgUGxlYXNlIHdhaXQuICAgSWYgdGhlIHRvdXIgZG9lc24ndCBzdGFydCBzb29uIGNsaWNrIG9uIHRoZSBsZWZ0bW9zdCBjb250cm9sIGJ1dHRvbiAoUGxheSBmaXJzdCBhdWRpbyBpbiB0b3VyKVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXVzZV9jdXJyZW50X2F1ZGlvOiBcIlBhdXNlIGN1cnJlbnQgYXVkaW9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGF1c2VfYXVkaW86IFwiUGF1c2UgYXVkaW9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGxheV9wYXVzZWRfYXVkaW86IFwiUGxheSBwYXVzZWQgYXVkaW9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fcGF1c2VkOlxuICAgICAgICAgICAgXCJUaGUgJDEgaGFzIGJlZW4gcGF1c2VkLiBDbGljayBvbiB0aGUgcGxheSBidXR0b24gdG8gcmVzdW1lIHRoZSB0b3VyLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnB1dF9wcmc6IFwiSW5wdXQgZm9yIFByb2dyYW1cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfd2VyZV9jb21waWxpbmdfZXJyOlxuICAgICAgICAgICAgXCJUaGVyZSB3ZXJlIGVycm9ycyBjb21waWxpbmcgeW91ciBjb2RlLiBTZWUgYmVsb3cuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXhjOiBcIlRpbWUgTGltaXQgRXhjZWVkZWQgb24geW91ciBwcm9ncmFtXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NlcnZlcl9lcnI6IFwiQSBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQ6ICQxICQyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2NvbXBpbGluZ19ydW5uaW5nOlxuICAgICAgICAgICAgXCJDb21waWxpbmcgYW5kIFJ1bm5pbmcgeW91ciBDb2RlIE5vdy4uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfY29tbV9lcnI6IFwiRXJyb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBzZXJ2ZXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NhdmVfcnVuOiBcIlNhdmUgJiBSdW5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVuZGVyOiBcIlNhdmUgJiBSZW5kZXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJBbiBhc3NlcnRpb24gZXJyb3IgaGFwcGVucyB3aGVuIHB5dGhvbiBlbmNvdW50ZXJzIGFuIGFzc2VydGlvbiBzdGF0ZW1lbnQuICBQeXRob24gZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIHRvIHRoZSByaWdodCBvZiB0aGUgd29yZCBhc3NlcnQ7IGlmIHRoYXQgZXhwcmVzc2lvbiBpcyBUcnVlIGV2ZXJ5dGhpbmcgaXMgZmluZSBhbmQgdGhlIHByb2dyYW0gY29udGludWVzLiAgSWYgdGhlIGV4cHJlc3Npb24gaXMgRmFsc2UgUHl0aG9uIHJhaXNlcyBhbiBlcnJvciBhbmQgc3RvcHMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZWNrIHRoZSBleHByZXNzaW9uIHRvIHRoZSByaWdodCBvZiBhc3NlcnQuICBUaGUgZXhwcmVzc2lvbiBpcyBGYWxzZSBhbmQgeW91IHdpbGwgbmVlZCB0byBkZXRlcm1pbmUgd2h5IHRoYXQgaXMuICBZb3UgbWF5IHdhbnQgdG8gc2ltcGx5IHByaW50IG91dCB0aGUgaW5kaXZpZHVhbCBwYXJ0cyBvZiB0aGUgZXhwcmVzc2lvbiB0byB1bmRlcnN0YW5kIHdoeSBpdCBpcyBldmFsdWF0aW5nIHRvIEZhbHNlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkX2RiOiBcIkxvYWRpbmcgREIuLi5cIixcbiAgICB9LFxufSk7XG4iLCIkLmkxOG4oKS5sb2FkKHtcbiAgICBcInB0LWJyXCI6IHtcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZF9oaXN0b3J5OiBcIkNhcnJlZ2FyIGhpc3TDs3JpY29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fdG91cjogXCJUb3VyIGRlIMOhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkZWRfY29kZTogXCJDw7NkaWdvIHNhbHZvIGNhcnJlZ2Fkby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fc2F2ZWRfY29kZTogXCJOw6NvIGjDoSBjw7NkaWdvIHNhbHZvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ydW5fY29kZTogXCJFeGVjdXRhclwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2ZlZWRiYWNrOiBcIkV4aWJpciBGZWVkYmFja3NcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlOiBcIk1vc3RyYXIgQ8OzZGlnb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGU6IFwiT2N1bHRhciBDw7NkaWdvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZWxlbnM6IFwiTW9zdHJhciBDb2RlTGVuc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zOiBcIk1vc3RyYXIgZW0gQ29kZUxlbnNcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlbGVuczogXCJPY3VsdGFyIENvZGVsZW5zXCIsXG5cbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGFyc2VfZXJyb3I6XG4gICAgICAgICAgICBcIlVtIGVycm8gZGUgUGFyc2Ugc2lnbmlmaWNhIHF1ZSBQeXRob24gbsOjbyBlbnRlbmRlIGEgc2ludGF4ZSBkYSBsaW5oYSBxdWUgYSBtZW5zYWdlbSBkZSBlcnJvIGFwb250YS4gRXhlbXBsb3MgY29tdW5zIHPDo28gZXNxdWVjZXIgdsOtcmd1bGFzIGVudHJlIGFyZ3VtZW50b3Mgb3UgZXNxdWVjZXIgJzonIGVtIHVtIGNvbWFuZG8gZm9yLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXJzZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlBhcmEgY29ycmlnaXIgdW0gZXJybyBkZSBQYXJzZSwgdm9jw6ogc8OzIHByZWNpc2Egb2xoYXIgY3VpZGFkb3NhbWVudGUgYSBsaW5oYSBjb20gbyBlcnJvIGUgcG9zc2l2ZWxtZW50ZSBhIGxpbmhhIGFudGVzIGRlbGEuIFRlbmhhIGNlcnRlemEgcXVlIGVzdMOjbyBkZSBhY29yZG8gY29tIHRvZGFzIGFzIHJlZ3JhcyBkZSBQeXRob24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3I6XG4gICAgICAgICAgICBcIkVycm9zIGRlIHRpcGFnZW0gb2NvcnJlbSBtYWlzIGZyZXF1ZW50ZW1lbnRlIHF1YW5kbyB1bWEgZXhwcmVzc8OjbyB0ZW50YSBjb21iaW5hciBkb2lzIG9iamV0b3MgY29tIHRpcG9zIHF1ZSBuw6NvIGRldmVyaWFtIHNlciBjb21iaW5hZG9zLiBDb21vIGVsZXZhciB1bWEgU3RyaW5nIGEgdW1hIHBvdMOqbmNpYS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlBhcmEgY29ycmlnaXIgdW0gZXJybyBkZSB0aXBhZ2VtIHZvY8OqIHByb3ZhdmVsbWVudGUgcHJlY2lzYXLDoSBwZXJjb3JyZXIgc2V1IGPDs2RpZ28gZSB0ZXIgY2VydGV6YSBkZSBxdWUgYXMgdmFyacOhdmVpcyBwb3NzdWVtIG9zIHRpcG9zIHF1ZSB2b2PDqiBlc3BlcmEgcXVlIGVsYXMgdGVuaGFtLiBQb2RlIHNlciDDunRpbCBpbXByaW1pciBjYWRhIHZhcmnDoXZlbCBhbyBsb25nbyBkbyBjYW1pbmhvIHBhcmEgY2hlY2FyIHNlIGVsYXMgcG9zc3VlbSBvIHZhbG9yIHF1ZSB2b2PDqiBhY2hhIHF1ZSBkZXZlcmlhbSB0ZXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3I6XG4gICAgICAgICAgICBcIlVtIGVycm8gZGUgbm9tZSBxdWFzZSBzZW1wcmUgc2lnbmlmaWNhIHF1ZSB2b2PDqiB1c291IHVtYSB2YXJpw6F2ZWwgYW50ZXMgZGVsYSB0ZXIgdW0gdmFsb3IuIEZyZXF1ZW50ZW1lbnRlIGlzc28gcG9kZSBzZXIgdW0gZXJybyBkZSBkaWdpdGHDp8OjbywgZW50w6NvIGNoZXF1ZSBhIG9ydG9ncmFmaWEgY3VpZGFkb3NhbWVudGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVxdWUgbyBsYWRvIGRpcmVpdG8gZGFzIGF0cmlidWnDp8O1ZXMgZSBzdWFzIGNoYW1hZGFzIGRlIGZ1bsOnw7Vlcywgc8OjbyBvcyBsdWdhcmVzIG1haXMgcHJvdsOhdmVpcyBkZSBlbmNvbnRyYXIgdW0gZXJybyBkZSBub21lLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBkZSB2YWxvciBvY29ycmUgbWFpcyBmcmVxdWVudGVtZW50ZSBxdWFuZG8gdW1hIGZ1bsOnw6NvIGVzdMOhIGVzcGVyYW5kbyB1bSB0aXBvIG1hcyB2b2PDqiBwYXNzYSB1bSBwYXLDom1ldHJvIGRlIG91dHJvIHRpcG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQSBtZW5zYWdlbSBkZSBlcnJvIHRlIGTDoSB1bWEgYm9hIGRpY2Egc29icmUgbyBub21lIGRhIGZ1bsOnw6NvIGUgbyB2YWxvciBpbmNvcnJldG8uIExlaWEgYXRlbnRhbWVudGUgYSBtZW5zYWdlbSBkZSBlcnJvIGUgdm9sdGUgw6AgdmFyacOhdmVsIHF1ZSBjb250w6ltIG8gdmFsb3IgcHJvYmxlbcOhdGljby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yOlxuICAgICAgICAgICAgXCJFc3NhIG1lbnNhZ2VtIGRlIGVycm8gZXN0w6EgdGUgZGl6ZW5kbyBxdWUgbyBvYmpldG8gZG8gbGFkbyBlc3F1ZXJkbyBkbyBwb250byBuw6NvIHRlbSBvIGF0cmlidXRvIG91IG3DqXRvZG8gZG8gc2V1IGxhZG8gZGlyZWl0by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQSB2YXJpYW50ZSBtYWlzIGNvbXVtIGRlc3NhIG1lbnNhZ2VtIMOpIHF1ZSBvIG9iamV0byBpbmRlZmluaWRvIG7Do28gdGVtIG8gYXRyaWJ1dG8gWC4gSXNzbyBkaXogcXVlIG8gb2JqZXRvIGRvIGxhZG8gZXNxdWVyZG8gZG8gcG9udG8gbsOjbyDDqSBvIHF1ZSB2b2PDqiBwZW5zYS4gUmFzdHJlaWUgZXNzYSB2YXJpw6F2ZWwgZSBpbXByaW1hLWEgZW0gdsOhcmlvcyBsdWdhcmVzIGF0w6kgZGVzY29icmlyIG9uZGUgZWxhIHNlIHRvcm5hIGluZGVmaW5pZGEuIENhc28gY29udHLDoXJpbywgY2hlcXVlIHNlIGjDoSBlcnJvIGRlIGRpZ2l0YcOnw6NvIG5vIGF0cmlidXRvIGRvIGxhZG8gZGlyZWl0byBkbyBwb250by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdG9rZW5fZXJyb3I6XG4gICAgICAgICAgICBcIk5hIG1haW9yaWEgZGFzIHZlemVzIGVzdGUgZXJybyBpbmRpY2EgcXVlIHZvY8OqIGVzcXVlY2V1IGRlIGZlY2hhciB1bSBwYXLDqm50ZXNlcyBvdSBhc3Bhcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdG9rZW5fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVxdWUgY2FkYSBsaW5oYSBkbyBzZXUgcHJvZ3JhbWEgZSBjZXJ0aWZpcXVlLXNlIGRlIHF1ZSB0b2RvcyBvcyBwYXLDqm50ZXNlcyBlc3TDo28gZmVjaGFkb3MuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3I6XG4gICAgICAgICAgICBcIlNldSBwcm9ncmFtYSBlc3TDoSBkZW1vcmFuZG8gbXVpdG8uIE9zIHByb2dyYW1hcyBkZXN0ZSBsaXZybyBkZXZlcmlhbSByb2RhciBlbSBtZW5vcyBkZSAxMCBzZWd1bmRvcy4gSXNzbyBwcm92YXZlbG1lbnRlIGluZGljYSBxdWUgc2V1IHByb2dyYW1hIGVzdMOhIGVtIHVtIGxvb3AgaW5maW5pdG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJJbXByaW1hIG1lbnNhZ2VucyBlbSBhbGd1bWFzIGxpbmhhcyBwYXJhIGRlc2NvYnJpciBzZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by4gQ2FzbyBuw6NvIGVzdGVqYSwgdm9jw6ogcG9kZSBhdW1lbnRhciBvIHRlbXBvIGxpbWl0ZSBkZSBleGVjdcOnw6NvIGNvbSBvIGNvbWFuZG8gc3lzLnNldEV4ZWN1dGlvbkxpbWl0KG1zKVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yOlxuICAgICAgICAgICAgXCJTZXUgcHJvZ3JhbWEgZXN0w6EgZGVtb3JhbmRvIG11aXRvLiBPcyBwcm9ncmFtYXMgZGVzdGUgbGl2cm8gZGV2ZXJpYW0gcm9kYXIgZW0gbWVub3MgZGUgMzAgc2VndW5kb3MuIElzc28gcHJvdmF2ZWxtZW50ZSBpbmRpY2EgcXVlIHNldSBwcm9ncmFtYSBlc3TDoSBlbSB1bSBsb29wIGluZmluaXRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiSW1wcmltYSBtZW5zYWdlbnMgZW0gYWxndW1hcyBsaW5oYXMgcGFyYSBkZXNjb2JyaXIgc2Ugc2V1IHByb2dyYW1hIGVzdMOhIGVtIHVtIGxvb3AgaW5maW5pdG8uIENhc28gbsOjbyBlc3RlamEsIHZvY8OqIHBvZGUgYXVtZW50YXIgbyB0ZW1wbyBsaW1pdGUgZGUgZXhlY3XDp8OjbyBjb20gbyBjb21hbmRvIHN5cy5zZXRFeGVjdXRpb25MaW1pdChtcylcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIGluZGljYSBxdWUgUHl0aG9uIG7Do28gZW50ZW5kZXUgYSBzaW50YXhlIGRlIHVtIGNvbWFuZG8uIEFsZ3VucyBleGVtcGxvcyBzw6NvIGF0cmlidWnDp8OjbyBkZSB1bSBsaXRlcmFsLCBvdSB1bWEgY2hhbWFkYSBkZSBmdW7Dp8Ojb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVxdWUgYXMgYXRyaWJ1acOnw7VlcyBkZSBzZXUgcHJvZ3JhbWEgZSBjZXJ0aWZpcXVlLXNlIGRlIHF1ZSBvIGxhZG8gZXNxdWVyZG8gw6kgdW1hIHZhcmnDoXZlbCwgZSBuw6NvIHVtIGxpdGVyYWwgb3UgZnVuw6fDo28uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0YSBtZW5zYWdlbSBpbmRpY2EgcXVlIHZvY8OqIGVzdMOhIHRlbnRhbmRvIGFjZXNzYXIgdW0gZWxlbWVudG8gY3VqYSBjaGF2ZSBuw6NvIGV4aXN0ZSBubyBkaWNpb27DoXJpby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVm9jw6ogcG9kZSB0ZXIgdW0gZXJybyBkZSBkaWdpdGHDp8OjbyBubyBub21lIGRhIHN1YSBjaGF2ZS4gw4kgdW1hIGJvYSBwcsOhdGljYSBjaGVjYXIgc2UgYSBjaGF2ZSBleGlzdGUgdXNhbmRvIHVtIGNvbWFuZG8gJ2lmIChjaGF2ZSkgaW4gbWV1X2RpY2lvbmFyaW8nLiBWb2PDqiB0YW1iw6ltIHBvZGUgdXNhciBvIGNvbWFuZG8gJ21ldV9kaWNpb25hcmlvLmdldChjaGF2ZSwgdmFsb3JQYWRyw6NvKScgcGFyYSBvYnRlciBvIHZhbG9yIHBhZHLDo28gYW8gaW52w6lzIGRlIHVtIGVycm8gY2FzbyBhIGNoYXZlIG7Do28gZXhpc3RhLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcjpcbiAgICAgICAgICAgIFwiVm9jw6ogZXN0w6EgdGVudGFuZG8gYWNlc3NhciB1bSDDrW5kaWNlIGFsw6ltIGRvIGZpbmFsIGRlIHVtYSBzdHJpbmcgb3UgbGlzdGEuIFBvciBleGVtcGxvLCBzZSBzdWEgbGlzdGEgcG9zc3VpIDMgZWxlbWVudG9zIG5lbGEgZSB2b2PDqiB0ZW50YSBhY2Vzc2FyIG8gaXRlbSBuYSBwb3Npw6fDo28gMyBvdSBtYWlzLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkxlbWJyZS1zZSBxdWUgbyBwcmltZWlybyBlbGVtZW50byBkZSB1bWEgbGlzdGEgb3Ugc3RyaW5nIGVzdMOhIG5vIMOtbmRpY2UgMCwgbm9ybWFsbWVudGUgZXN0YSBtZW5zYWdlbSDDqSBleGliaWRhIHBvcnF1ZSB2b2PDqiBlcnJvdSBvIMOtbmRpY2UgcG9yIDEuIEVtIHVtYSBsaXN0YSBkZSB0YW1hbmhvIDMsIG8gw7psdGltbyDDrW5kaWNlIHbDoWxpZG8gw6kgMlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV91cmlfZXJyb3I6IFwiXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcl9maXg6IFwiXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0YSBtZW5zYWdlbSBpbmRpY2EgcXVlIHZvY8OqIGVzdMOhIHRlbnRhbmRvIGltcG9ydGFyIHVtIG3Ds2R1bG8gcXVlIG7Do28gZXhpc3RlXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlVtIHByb2JsZW1hIHBvZGUgc2VyIGFwZW5hcyB1bSBlcnJvIGRlIGRpZ2l0YcOnw6NvLiBUYW1iw6ltIHBvZGUgc2VyIHF1ZSB2b2PDqiBlc3TDoSB0ZW50YW5kbyBpbXBvcnRhciB1bSBtw7NkdWxvIHF1ZSBleGlzdGUgZW0gUHl0aG9uICdyZWFsJywgbWFzIG7Do28gZXhpc3RlIG5lc3RlIGxpdnJvLiBTZSBlc3RlIMOpIG8gY2FzbywgcG9yIGZhdm9yIGVudmllIHVtIHBlZGlkbyBwYXJhIHRlciBlc3NlIG3Ds2R1bG8gYWRpY2lvbmFkby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yOlxuICAgICAgICAgICAgXCJJc3NvIHBhcmVjZSBzZXIgdW0gZXJybyBpbnRlcm5vLCBlc3BlY2lhbG1lbnRlIHNlIGEgbWVuc2FnZW0gZmF6IHJlZmVyw6puY2lhIGFvIGNvbnNvbGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRlbnRlIGF0dWFsaXphciBhIHDDoWdpbmEuIFNlIG8gZXJybyBwZXJzaXN0aXIsIGVudmllIHVtIHJlbGF0w7NyaW8gZGUgYnVnIGp1bnRvIGNvbSBzZXUgY8OzZGlnb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJJc3NvIGRpeiBxdWUgdm9jw6ogZXN0w6EgdGVudGFuZG8gZGl2aWRpciBwb3IgMC4gTm9ybWFsbWVudGUgw6kgcG9ycXVlIG8gdmFsb3IgZGEgdmFyacOhdmVsIG5vIGRlbm9taW5hZG9yIGRlIHVtYSBkaXZpc8OjbyB0ZW0gbyB2YWxvciAwXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJWb2PDqiBwb2RlIHByb3RlZ2VyIGNvbnRyYSBkaXZpZGlyIHBvciAwIGNvbSB1bSBjb21hbmRvICdpZicsIG91IHZvY8OqIHBvZGUgcHJlY2lzYXIgcmVhdmFsaWFyIHN1YXMgc3Vwb3Npw6fDtWVzIHNvYnJlIG9zIHZhbG9yZXMgZGFzIHZhcmnDoXZlaXMsIHBvaXMgdW0gY29tYW5kbyBhbnRlcmlvciBwb2RlIHRlciBpbmVzcGVyYWRhbWVudGUgYXRyaWJ1w61kbyBvIHZhbG9yIDAgYSBlc3NhIHZhcmnDoXZlbC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGEgbWVuc2FnZW0gcXVhc2Ugc2VtcHJlIGFwYXJlY2UgbmEgZm9ybWEgZGUgJ1RhbWFuaG8gbcOheGltbyBkYSBwaWxoYSBkZSBjaGFtYWRhcyBleGNlZGlkbycuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiSXNzbyBzZW1wcmUgb2NvcnJlIHF1YW5kbyB1bWEgZnVuw6fDo28gY2hhbWEgZWxhIG1lc21hLiBQcm92YXZlbG1lbnRlIHZvY8OqIG7Do28gZXN0w6EgZmF6ZW5kbyBpc3NvIGRlIHByb3DDs3NpdG8sIGV4Y2V0byBubyBjYXDDrXR1bG8gc29icmUgcmVjdXJzw6NvLiBTZSB2b2PDqiBlc3TDoSBuZXNzZSBjYXDDrXR1bG8sIGVudMOjbyBwcm92YXZlbG1lbnRlIGFpbmRhIG7Do28gaWRlbnRpZmljb3UgdW0gYm9tIGNhc28gYmFzZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3I6XG4gICAgICAgICAgICBcIlVtIGVycm8gaW50ZXJubyBwb2RlIHNpZ25pZmljYXIgcXVlIHZvY8OqIGRlc2VuY2FkZW91IHVtIGJ1ZyBubyBub3NzbyBQeXRob25cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJSZXBvcnRlIGVzdGUgZXJybyBjb21vIHVtIGJ1ZywganVudGFtZW50ZSBjb20gc2V1IGPDs2RpZ29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGUgZXJybyBvY29ycmUgcXVhbmRvIHZvY8OqIG7Do28gaW5kZW50b3Ugc2V1IGPDs2RpZ28gZGV2aWRhbWVudGUuIElzc28gw6kgbWFpcyBwcm92w6F2ZWwgZGUgb2NvcnJlciBjb21vIHBhcnRlIGRlIHVtIGNvbWFuZG8gaWYsIGZvciwgd2hpbGUgb3UgZGVmLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBzZXVzIGNvbWFuZG9zIGlmLCBkZWYsIGZvciBlIHdoaWxlIHBhcmEgdGVyIGNlcnRlemEgZGUgcXVlIGFzIGxpbmhhcyBlc3TDo28gZGV2aWRhbWVudGUgaW5kZW50YWRhcyBhYmFpeG8gZGVsYXMuIE91dHJhIGZvbnRlIGRlc3RlIGVycm8gw6kgY29waWFyIGUgY29sYXIgY8OzZGlnbyBlbSBxdWUgdm9jw6ogYWNpZGVudGFsbWVudGUgZGVpeG91IHJlc3RvcyBkZSBjw7NkaWdvIHF1ZSBuw6NvIHBlcnRlbmNlbSBtYWlzIGFsaS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RlIGVycm8gb2NvcnJlIHF1YW5kbyB2b2PDqiB0ZW50YSB1c2FyIHVtYSBmdW7Dp8OjbyBlbWJ1dGlkYSBkZSBQeXRob24gcXVlIG7Do28gZm9pIGltcGxlbWVudGFkYSBuZXN0YSB2ZXJzw6NvIGJyb3dzZXIgZGUgUHl0aG9uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJQb3IgZW5xdWFudG8gYSDDum5pY2EgbWFuZWlyYSBkZSBjb25zZXJ0YXIgaXNzbyDDqSBuw6NvIHVzYW5kbyBhIGZ1bsOnw6NvLiBQb2RlbSBoYXZlciBzb2x1w6fDtWVzIGFsdGVybmF0aXZhcy4gU2Ugdm9jw6ogcmVhbG1lbnRlIHByZWNpc2EgZGVzdGEgZnVuw6fDo28gZW1idXRpZGEsIGVudmllLW5vcyB1bSByZWxhdMOzcmlvIGRlIGJ1ZyBlIGRpZ2FjIG9tbyBlc3TDoSB0ZW50YW5kbyB1c2FyIGEgZnVuw6fDo28uXCIsXG5cbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZmlsZV9ub3RfZm91bmQ6IFwiQXJxdWl2byBuw6NvIGVuY29udHJhZG86ICckMSdcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fZmlsZV9vcl9kaXI6XG4gICAgICAgICAgICBcIltFcnJvIG7CuiAyXSBBcnF1aXZvIG91IGRpcmV0w7NyaW8gaW5leGlzdGVudGU6ICckMSdcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3RhcnRpbmc6IFwiQ2xpcXVlIG5vIGJvdMOjbyBkZSBleGVjdcOnw6NvIHBhcmEgY29tZcOnYXIgJDFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGxheWluZzogXCJFeGVjdXRhbmRvICQxXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRpbmdfYXVkaW86XG4gICAgICAgICAgICBcIkNhcnJlZ2FuZG8gw6F1ZGlvLiBQb3IgZmF2b3IsIGVzcGVyZS4gU2UgbyB0b3VyIG7Do28gY29tZcOnYXIgbG9nbywgY2xpcXVlIGVtICdTdG9wIFRvdXInIGUgdGVudGUgbm92YW1lbnRlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXVzZV9jdXJyZW50X2F1ZGlvOiBcIlBhdXNhciDDoXVkaW8gYXR1YWxcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGF1c2VfYXVkaW86IFwiUGF1c2FyIMOhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5X3BhdXNlZF9hdWRpbzogXCJSZXByb2R1emlyIMOhdWRpbyBwYXVzYWRvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F1ZGlvX3BhdXNlZDpcbiAgICAgICAgICAgIFwiJDEgZm9pIHBhdXNhZG8uIENsaXF1ZSBubyBib3TDo28gZGUgZXhlY3XDp8OjbyBwYXJhIHJldG9tYXIgbyB0b3VyLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnB1dF9wcmc6IFwiRW50cmFkYSBwYXJhIG8gcHJvZ3JhbWFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfd2VyZV9jb21waWxpbmdfZXJyOlxuICAgICAgICAgICAgXCJIb3V2ZXJhbSBlcnJvcyBhbyBjb21waWxhciBzZXUgY8OzZGlnby4gVmVqYSBhYmFpeG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXhjOiBcIkxpbWl0ZSBkZSB0ZW1wbyBleGNlZGlkbyBubyBzZXUgcHJvZ3JhbWFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2VydmVyX2VycjogXCJVbSBlcnJvIGRlIHNlcnZpZG9yIG9jb3JyZXU6ICQxICQyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2NvbXBpbGluZ19ydW5uaW5nOlxuICAgICAgICAgICAgXCJDb21waWxhbmRvIGUgZXhlY3V0YW5kbyBzZXUgY8OzZGlnby4uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfY29tbV9lcnI6IFwiRXJybyBhbyBjb211bmljYXIgY29tIG8gc2Vydmlkb3IuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NhdmVfcnVuOiBcIlNhbHZhciAmIEV4ZWN1dGFyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlbmRlcjogXCJTYWx2YXIgJiBSZW5kZXJpemFyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBkZSBhc3NlcsOnw6NvIG9jb3JyZSBxdWFuZG8gcHl0aG9uIGVuY29udHJhIHVtIGNvbWFuZG8gJ2Fzc2VydCcuIFB5dGhvbiBhdmFsaWEgYSBleHByZXNzw6NvIGRvIGxhZG8gZGlyZWl0bzsgc2Ugw6kgdmVyZGFkZWlyYSwgbyBwcm9ncmFtYSBjb250aW51YSBub3JtYWxtZW50ZS4gU2Ugw6kgZmFsc2EsIHB5dGhvbiBnZXJhIHVtIGVycm8gZSBwYXJhIGEgZXhlY3XDp8Ojby5cIiAsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBhIGV4cHJlc3PDo28gZG8gbGFkbyBkaXJlaXRvIGRlICdhc3NlcnQnLiBFc3NhIGV4cHJlc3PDo28gw6kgZmFsc2EgZSDDqSBwcmVjaXNvIHZlcmlmaWNhciBvIG1vdGl2by4gVm9jw6ogcG9kZSBxdWVyZXIgaW1wcmltaXIgY2FkYSBwYXJ0ZSBkYSBleHByZXNzw6NvIGUgZW50ZW5kZXIgcG9ycXVlIMOpIGZhbHNhLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkX2RiOiBcIkNhcnJlZ2FuZG8gYmFuY28gZGUgZGFkb3MuLi5cIixcbiAgICB9LFxufSk7XG4iLCIkLmkxOG4oKS5sb2FkKHtcbiAgICBcInNyLUN5cmxcIjoge1xuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkX2hpc3Rvcnk6IFwi0KPRh9C40YLQsNGYINC40YHRgtC+0YDQuNGY0YNcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fdG91cjogXCLQkNGD0LTQuNC+INGC0YPRgNCwXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRlZF9jb2RlOiBcItCS0LDRiCDQuNC30LLQvtGA0L3QuCDQutC+0LQg0ZjQtSDRg9GH0LjRgtCw0L0uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vX3NhdmVkX2NvZGU6IFwi0J3QtSDQv9C+0YHRgtC+0ZjQuCDRgdC90LjQvNGZ0LXQvSDQutC+0LQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3J1bl9jb2RlOiBcItCf0L7QutGA0LXQvdC4INC/0YDQvtCz0YDQsNC8XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfZmVlZGJhY2s6IFwi0J/RgNC40LrQsNC20Lgg0YDQtdC30YPQu9GC0LDRglwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGU6IFwi0J/RgNC40LrQsNC20Lgg0LrQvtC0XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZTogXCLQl9Cw0YLQstC+0YDQuCDQutC+0LRcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlbGVuczogXCLQmtC+0YDQsNC6INC/0L4g0LrQvtGA0LDQulwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zOiBcItCa0L7RgNCw0Log0L/QviDQutC+0YDQsNC6XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZWxlbnM6IFwi0JfQsNGC0LLQvtGA0Lgg0LrQvtGA0LDQuiDQv9C+INC60L7RgNCw0LpcIixcblxuICAgICAgICBtc2dfc2N0aXZlY29kZV9wYXJzZV9lcnJvcjpcbiAgICAgICAgICAgIFwi0KHQuNC90YLQsNC60YHQvdCwINCz0YDQtdGI0LrQsCAocGFyc2UgZXJyb3IpINC30L3QsNGH0Lgg0LTQsCDQn9Cw0ZjRgtC+0L0g0L3QtSDRgNCw0LfRg9C80LUg0YHQuNC90YLQsNC60YHRgyDRgyDQu9C40L3QuNGY0Lgg0LrQvtCz0LAg0L3QsCDQutC+0ZjRgyDQv9C+0YDRg9C60LAg0L4g0LPRgNC10YjRhtC4INGD0LrQsNC30YPRmNC1LiDQotC40L/QuNGH0L3QuCDQv9GA0LjQvNC10YDQuCDQvtCy0LDQutCy0LUg0LPRgNC10YjQutC1INGB0YMg0LfQsNCx0L7RgNCw0LLQu9GY0LXQvdCwINC00LLQvtGC0LDRh9C60LAg0LrQvtC0ICdpZicg0LjQu9C4ICdmb3InINC40YHQutCw0LfQsCDQuNC70Lgg0LfQsNCx0L7RgNCw0LLRmdC10L3QsCDQt9Cw0L/QtdGC0LAg0LjQt9C80LXRktGDINCw0YDQs9GD0LzQtdC90LDRgtCwINC60L7QtCDQv9C+0LfQuNCy0LAg0YTRg9C90LrRhtC40ZjQtVwiLFxuICAgICAgICBtc2dfc2N0aXZlY29kZV9wYXJzZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcItCU0LAg0LHQuNGB0YLQtSDQuNGB0L/RgNCw0LLQuNC70Lgg0YHQuNC90YLQsNC60YHQvdGDINCz0YDQtdGI0LrRgyDRgtGA0LXQsdCwINC/0LDQttGa0LjQstC+INC00LAg0L/QvtCz0LvQtdC00LDRgtC1INC70LjQvdC40ZjRgyDQuNC30LLQvtGA0L3QvtCzINC60L7QtNCwINC90LAg0LrQvtGY0YMg0YPQutCw0LfRg9GY0LUg0L/QvtGA0YPQs9CwINC+INCz0YDQtdGI0YbQuCDQuCDQvNC+0LbQtNCwINC/0YDQtdGC0YXQvtC00L3RgyDQu9C40L3QuNC90YMg0LjQt9Cy0L7RgNC90L7QsyDQutC+0LTQsC4g0J/RgNC+0LLQtdGA0LjRgtC1INC00LAg0LvQuCDRgdGDINC/0L7RiNGC0L7QstCw0L3QsCDRgdCy0LAg0YHQuNC90YLQsNC60YHQvdCwINC/0YDQsNCy0LjQu9CwINCf0LDRmNGC0L7QvdCwLlwiLFxuICAgIH0sXG59KTtcbiIsIi8qKlxuICpcbiAqIENyZWF0ZWQgYnkgYm1pbGxlciBvbiAzLzE5LzE1LlxuICovXG4vKiBEZWZpbmUgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgRVNMaW50ICovXG4vKiBnbG9iYWwgU2sgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZS5qc1wiO1xuaW1wb3J0IEF1ZGlvVG91ciBmcm9tIFwiLi9hdWRpb3RvdXIuanNcIjtcbmltcG9ydCBcIi4vYWN0aXZlY29kZS1pMThuLmVuLmpzXCI7XG5pbXBvcnQgXCIuL2FjdGl2ZWNvZGUtaTE4bi5wdC1ici5qc1wiO1xuaW1wb3J0IFwiLi9hY3RpdmVjb2RlLWkxOG4uc3ItQ3lybC5qc1wiO1xuaW1wb3J0IENvZGVNaXJyb3IgZnJvbSBcImNvZGVtaXJyb3JcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9weXRob24vcHl0aG9uLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvY3NzL2Nzcy5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS94bWwveG1sLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvc3FsL3NxbC5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL2NsaWtlL2NsaWtlLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvb2N0YXZlL29jdGF2ZS5qc1wiO1xuaW1wb3J0IFwiLi8uLi9jc3MvYWN0aXZlY29kZS5jc3NcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbGliL2NvZGVtaXJyb3IuY3NzXCI7XG5pbXBvcnQgXCIuL3NrdWxwdC5taW4uanNcIjtcbmltcG9ydCBcIi4vc2t1bHB0LXN0ZGxpYi5qc1wiO1xuLy8gVXNlZCBieSBTa3VscHQuXG5pbXBvcnQgZW1iZWQgZnJvbSBcInZlZ2EtZW1iZWRcIjtcbi8vIEFkYXB0IGZvciB1c2Ugb3V0c2lkZSB3ZWJwYWNrIC0tIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWVtYmVkLlxud2luZG93LnZlZ2FFbWJlZCA9IGVtYmVkO1xuXG52YXIgaXNNb3VzZURvd24gPSBmYWxzZTtcbmRvY3VtZW50Lm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKCkge1xuICAgIGlzTW91c2VEb3duID0gdHJ1ZTtcbn07XG5cbmRvY3VtZW50Lm9ubW91c2V1cCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpc01vdXNlRG93biA9IGZhbHNlO1xufTtcbndpbmRvdy5lZExpc3QgPSB7fTtcblxudmFyIHNvY2tldCwgY29ubmVjdGlvbiwgZG9jO1xudmFyIGNoYXRjb2Rlc1NlcnZlciA9IFwiY2hhdC5jb2Rlc1wiO1xuXG4vLyBzZXBhcmF0ZSBpbnRvIGNvbnN0cnVjdG9yIGFuZCBpbml0XG5leHBvcnQgY2xhc3MgQWN0aXZlQ29kZSBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHZhciBzdWZmU3RhcnQ7XG4gICAgICAgIHZhciBvcmlnID0gJChvcHRzLm9yaWcpLmZpbmQoXCJ0ZXh0YXJlYVwiKVswXTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBvcHRzLm9yaWc7XG4gICAgICAgIHRoaXMudXNlUnVuZXN0b25lU2VydmljZXMgPSBvcHRzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzO1xuICAgICAgICB0aGlzLnB5dGhvbjMgPSBvcHRzLnB5dGhvbjM7XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCA9IG9wdHMudmVydGljYWw7XG4gICAgICAgIHRoaXMub3JpZ0VsZW0gPSBvcmlnO1xuICAgICAgICB0aGlzLm9yaWdUZXh0ID0gdGhpcy5vcmlnRWxlbS50ZXh0Q29udGVudDtcbiAgICAgICAgdGhpcy5kaXZpZCA9IG9wdHMub3JpZy5pZDtcbiAgICAgICAgdGhpcy5jb2RlID0gJChvcmlnKS50ZXh0KCkgfHwgXCJcXG5cXG5cXG5cXG5cXG5cIjtcbiAgICAgICAgdGhpcy5sYW5ndWFnZSA9ICQob3JpZykuZGF0YShcImxhbmdcIik7XG4gICAgICAgIHRoaXMudGltZWxpbWl0ID0gJChvcmlnKS5kYXRhKFwidGltZWxpbWl0XCIpO1xuICAgICAgICB0aGlzLmluY2x1ZGVzID0gJChvcmlnKS5kYXRhKFwiaW5jbHVkZVwiKTtcbiAgICAgICAgdGhpcy5oaWRlY29kZSA9ICQob3JpZykuZGF0YShcImhpZGVjb2RlXCIpO1xuICAgICAgICB0aGlzLmNoYXRjb2RlcyA9ICQob3JpZykuZGF0YShcImNoYXRjb2Rlc1wiKTtcbiAgICAgICAgdGhpcy5oaWRlaGlzdG9yeSA9ICQob3JpZykuZGF0YShcImhpZGVoaXN0b3J5XCIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gJChvcHRzLm9yaWcpLmZpbmQoYCMke3RoaXMuZGl2aWR9X3F1ZXN0aW9uYClbMF07XG4gICAgICAgIHRoaXMudGllID0gJChvcmlnKS5kYXRhKFwidGllXCIpO1xuICAgICAgICB0aGlzLmRidXJsID0gJChvcmlnKS5kYXRhKFwiZGJ1cmxcIik7XG4gICAgICAgIHRoaXMucHl0aG9uM19pbnRlcnByZXRlciA9ICQob3JpZykuZGF0YShcInB5dGhvbjNfaW50ZXJwcmV0ZXJcIik7XG4gICAgICAgIHRoaXMub3V0cHV0X2hlaWdodCA9ICQob3JpZykuZGF0YShcIm91dHB1dF9oZWlnaHRcIik7XG4gICAgICAgIHRoaXMucnVuQnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbmFibGVkb3dubG9hZCA9ICQob3JpZykuZGF0YShcImVuYWJsZWRvd25sb2FkXCIpO1xuICAgICAgICB0aGlzLmRvd25sb2FkQnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZXNldEJ1dHRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuc2F2ZUJ1dHRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubG9hZEJ1dHRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYgPSBudWxsO1xuICAgICAgICB0aGlzLnBhcnRuZXIgPSBcIlwiO1xuICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICBpZiAoIWVCb29rQ29uZmlnLmFsbG93X3BhaXJzIHx8ICQob3JpZykuZGF0YShcIm5vcGFpclwiKSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVQYXJ0bmVyID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZVBhcnRuZXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gY3JlYXRlIHByZSBmb3Igb3V0cHV0XG4gICAgICAgIHRoaXMuZ3JhcGhpY3MgPSBudWxsOyAvLyBjcmVhdGUgZGl2IGZvciB0dXJ0bGUgZ3JhcGhpY3NcbiAgICAgICAgdGhpcy5jb2RlY29hY2ggPSBudWxsO1xuICAgICAgICB0aGlzLmNvZGVsZW5zID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb250cm9sRGl2ID0gbnVsbDtcbiAgICAgICAgdGhpcy5oaXN0b3J5U2NydWJiZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnRpbWVzdGFtcHMgPSBbXCJPcmlnaW5hbFwiXTtcbiAgICAgICAgdGhpcy5hdXRvcnVuID0gJChvcmlnKS5kYXRhKFwiYXV0b3J1blwiKTtcbiAgICAgICAgaWYgKHRoaXMuY2hhdGNvZGVzICYmIGVCb29rQ29uZmlnLmVuYWJsZV9jaGF0Y29kZXMpIHtcbiAgICAgICAgICAgIGlmICghc29ja2V0KSB7XG4gICAgICAgICAgICAgICAgc29ja2V0ID0gbmV3IFdlYlNvY2tldChcIndzczovL1wiICsgY2hhdGNvZGVzU2VydmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgd2luZG93LnNoYXJlZGIuQ29ubmVjdGlvbihzb2NrZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgICAgICBkb2MgPSBjb25uZWN0aW9uLmdldChcImNoYXRjb2Rlc1wiLCBcImNoYW5uZWxzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdyYWRlcmFjdGl2ZSB8fCB0aGlzLmlzVGltZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZWNvZGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmNsdWRlcykge1xuICAgICAgICAgICAgdGhpcy5pbmNsdWRlcyA9IHRoaXMuaW5jbHVkZXMuc3BsaXQoL1xccysvKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJlZml4RW5kID0gdGhpcy5jb2RlLmluZGV4T2YoXCJeXl5eXCIpO1xuICAgICAgICBpZiAocHJlZml4RW5kID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucHJlZml4ID0gdGhpcy5jb2RlLnN1YnN0cmluZygwLCBwcmVmaXhFbmQpO1xuICAgICAgICAgICAgdGhpcy5jb2RlID0gdGhpcy5jb2RlLnN1YnN0cmluZyhwcmVmaXhFbmQgKyA1KTtcbiAgICAgICAgfVxuICAgICAgICBzdWZmU3RhcnQgPSB0aGlzLmNvZGUuaW5kZXhPZihcIj09PT1cIik7XG4gICAgICAgIGlmIChzdWZmU3RhcnQgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5zdWZmaXggPSB0aGlzLmNvZGUuc3Vic3RyaW5nKHN1ZmZTdGFydCArIDUpO1xuICAgICAgICAgICAgdGhpcy5jb2RlID0gdGhpcy5jb2RlLnN1YnN0cmluZygwLCBzdWZmU3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlzdG9yeSA9IFt0aGlzLmNvZGVdO1xuICAgICAgICB0aGlzLmNyZWF0ZUVkaXRvcigpO1xuICAgICAgICB0aGlzLmNyZWF0ZU91dHB1dCgpO1xuICAgICAgICB0aGlzLmNyZWF0ZUNvbnRyb2xzKCk7XG4gICAgICAgIGlmICgkKG9yaWcpLmRhdGEoXCJjYXB0aW9uXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmNhcHRpb24gPSAkKG9yaWcpLmRhdGEoXCJjYXB0aW9uXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYXB0aW9uID0gXCJBY3RpdmVDb2RlXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRDYXB0aW9uKFwicnVuZXN0b25lXCIpO1xuICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLnJlZnJlc2goKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIDEwMDBcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuYXV0b3J1bikge1xuICAgICAgICAgICAgLy8gU2ltdWxhdGUgcHJlc3NpbmcgdGhlIHJ1biBidXR0b24sIHNpbmNlIHRoaXMgd2lsbCBhbHNvIHByZXZlbnQgdGhlIHVzZXIgZnJvbSBjbGlja2luZyBpdCB1bnRpbCB0aGUgaW5pdGlhbCBydW4gaXMgY29tcGxldGUsIGFuZCBhbHNvIGhlbHAgdGhlIHVzZXIgdW5kZXJzdGFuZCB3aHkgdGhleSdyZSB3YWl0aW5nLlxuICAgICAgICAgICAgJChkb2N1bWVudCkucmVhZHkodGhpcy5ydW5CdXR0b25IYW5kbGVyLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kaWNhdGVfY29tcG9uZW50X3JlYWR5KCk7XG4gICAgfVxuXG4gICAgY3JlYXRlRWRpdG9yKGluZGV4KSB7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2YXIgbGlua2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGxpbmtkaXYuaWQgPSB0aGlzLmRpdmlkLnJlcGxhY2UoL18vZywgXCItXCIpLnRvTG93ZXJDYXNlKCk7IC8vIDpyZWY6IGNoYW5nZXMgXyB0byAtIHNvIGFkZCB0aGlzIGFzIGEgdGFyZ2V0XG4gICAgICAgICQodGhpcy5vdXRlckRpdikuYWRkQ2xhc3MoXCJhY19zZWN0aW9uIGFsZXJ0IGFsZXJ0LXdhcm5pbmdcIik7XG4gICAgICAgIHZhciBjb2RlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjb2RlRGl2KS5hZGRDbGFzcyhcImFjX2NvZGVfZGl2IGNvbC1tZC0xMlwiKTtcbiAgICAgICAgdGhpcy5jb2RlRGl2ID0gY29kZURpdjtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5sYW5nID0gdGhpcy5sYW5ndWFnZTtcbiAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5yZXBsYWNlV2l0aCh0aGlzLm91dGVyRGl2KTtcbiAgICAgICAgaWYgKGxpbmtkaXYuaWQgIT09IHRoaXMuZGl2aWQpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlICdleHRyYScgdGFyZ2V0IGlmIHRoZXkgbWF0Y2guXG4gICAgICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGxpbmtkaXYpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY29kZURpdik7XG4gICAgICAgIHZhciBlZG1vZGUgPSB0aGlzLm91dGVyRGl2Lmxhbmc7XG4gICAgICAgIGlmIChlZG1vZGUgPT09IFwic3FsXCIpIHtcbiAgICAgICAgICAgIGVkbW9kZSA9IFwidGV4dC94LXNxbFwiO1xuICAgICAgICB9IGVsc2UgaWYgKGVkbW9kZSA9PT0gXCJqYXZhXCIpIHtcbiAgICAgICAgICAgIGVkbW9kZSA9IFwidGV4dC94LWphdmFcIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwiY3BwXCIpIHtcbiAgICAgICAgICAgIGVkbW9kZSA9IFwidGV4dC94LWMrK3NyY1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGVkbW9kZSA9PT0gXCJjXCIpIHtcbiAgICAgICAgICAgIGVkbW9kZSA9IFwidGV4dC94LWNzcmNcIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwicHl0aG9uM1wiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInB5dGhvblwiO1xuICAgICAgICB9IGVsc2UgaWYgKGVkbW9kZSA9PT0gXCJvY3RhdmVcIiB8fCBlZG1vZGUgPT09IFwiTUFUTEFCXCIpIHtcbiAgICAgICAgICAgIGVkbW9kZSA9IFwidGV4dC94LW9jdGF2ZVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5kaXZpZCkgIT09IG51bGwpXG4gICAgICAgICAgICB0aGlzLmNvZGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmRpdmlkKTtcblxuICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNvZGUsXG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcbiAgICAgICAgICAgIG1vZGU6IGVkbW9kZSxcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXG4gICAgICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLFxuICAgICAgICAgICAgYXV0b01hdGNoUGFyZW5zOiB0cnVlLFxuICAgICAgICAgICAgZXh0cmFLZXlzOiB7XG4gICAgICAgICAgICAgICAgVGFiOiBcImluZGVudE1vcmVcIixcbiAgICAgICAgICAgICAgICBcIlNoaWZ0LVRhYlwiOiBcImluZGVudExlc3NcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IoY29kZURpdixvcHRzICk7XG4gICAgICAgIFxuICAgICAgICAvLyBNYWtlIHRoZSBlZGl0b3IgcmVzaXphYmxlXG4gICAgICAgICQoZWRpdG9yLmdldFdyYXBwZXJFbGVtZW50KCkpLnJlc2l6YWJsZSh7XG4gICAgICAgICAgICByZXNpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0U2l6ZSgkKHRoaXMpLndpZHRoKCksICQodGhpcykuaGVpZ2h0KCkpO1xuICAgICAgICAgICAgICAgIGVkaXRvci5yZWZyZXNoKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZ2l2ZSB0aGUgdXNlciBhIHZpc3VhbCBjdWUgdGhhdCB0aGV5IGhhdmUgY2hhbmdlZCBidXQgbm90IHNhdmVkXG4gICAgICAgIGVkaXRvci5vbihcbiAgICAgICAgICAgIFwiY2hhbmdlXCIsXG4gICAgICAgICAgICBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5hY0VkaXRFdmVudCA9PSBmYWxzZSB8fFxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuYWNFZGl0RXZlbnQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnRzIGNhbiBjb21lIGJlZm9yZSBhbnkgcmVhbCBjaGFuZ2VzIGZvciB2YXJpb3VzIHJlYXNvbnMsIHNvbWUgdW5rbm93blxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGF2b2lkcyB1bm5lY2NzYXJ5IGxvZyBldmVudHMgYW5kIHVwZGF0ZXMgdG8gdGhlIGFjdGl2aXR5IGNvdW50ZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3JpZ1RleHQgPT09IGVkaXRvci5nZXRWYWx1ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgJChlZGl0b3IuZ2V0V3JhcHBlckVsZW1lbnQoKSkuY3NzKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItdG9wXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjJweCBzb2xpZCAjYjQzMjMyXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgJChlZGl0b3IuZ2V0V3JhcHBlckVsZW1lbnQoKSkuY3NzKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItYm90dG9tXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjJweCBzb2xpZCAjYjQzMjMyXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Fuc3dlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwiYWN0aXZlY29kZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0OiBcImVkaXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVkaXRvci5hY0VkaXRFdmVudCA9IHRydWU7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTsgLy8gdXNlIGJpbmQgdG8gcHJlc2VydmUgKnRoaXMqIGluc2lkZSB0aGUgb24gaGFuZGxlci5cbiAgICAgICAgLy9Tb2x2aW5nIEtleWJvYXJkIFRyYXAgb2YgQWN0aXZlQ29kZTogSWYgdXNlciB1c2UgdGFiIGZvciBuYXZpZ2F0aW9uIG91dHNpZGUgb2YgQWN0aXZlQ29kZSwgdGhlbiBjaGFuZ2UgdGFiIGJlaGF2aW9yIGluIEFjdGl2ZUNvZGUgdG8gZW5hYmxlIHRhYiB1c2VyIHRvIHRhYiBvdXQgb2YgdGhlIHRleHRhcmVhXG4gICAgICAgICQod2luZG93KS5rZXlkb3duKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSA/IGUua2V5Q29kZSA6IGUud2hpY2g7XG4gICAgICAgICAgICBpZiAoY29kZSA9PSA5ICYmICQoXCJ0ZXh0YXJlYTpmb2N1c1wiKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0T3B0aW9uKFwiZXh0cmFLZXlzXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgVGFiOiBmdW5jdGlvbiAoY20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdChcIi50YWItY29udGVudFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0U2libGluZy5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBcIlNoaWZ0LVRhYlwiOiBmdW5jdGlvbiAoY20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdChcIi50YWItY29udGVudFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmV2aW91c1NpYmxpbmcuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yO1xuICAgICAgICBpZiAodGhpcy5oaWRlY29kZSkge1xuICAgICAgICAgICAgJCh0aGlzLmNvZGVEaXYpLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuQnV0dG9uSGFuZGxlcigpIHtcbiAgICAgICAgLy8gRGlzYWJsZSB0aGUgcnVuIGJ1dHRvbiB1bnRpbCB0aGUgcnVuIGlzIGZpbmlzaGVkLiAgICBcbiAgICAgICAgdGhpcy5ydW5CdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5Qcm9nKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGB0aGVyZSB3YXMgYW4gZXJyb3IgJHtlfSBydW5uaW5nIHRoZSBjb2RlYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9nUmVzdWx0cykge1xuICAgICAgICAgICAgdGhpcy5sb2dDdXJyZW50QW5zd2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXJGZWVkYmFjaygpO1xuICAgICAgICAvLyBUaGUgcnVuIGlzIGZpbmlzaGVkOyByZS1lbmFibGUgdGhlIGJ1dHRvbi5cbiAgICAgICAgdGhpcy5ydW5CdXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjcmVhdGVDb250cm9scygpIHtcbiAgICAgICAgdmFyIGN0cmxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2YXIgYnV0dDtcbiAgICAgICAgJChjdHJsRGl2KS5hZGRDbGFzcyhcImFjX2FjdGlvbnNcIik7XG4gICAgICAgICQoY3RybERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtMTJcIik7XG4gICAgICAgIC8vIFJ1blxuICAgICAgICBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3J1bl9jb2RlXCIpKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBidG4tc3VjY2VzcyBydW4tYnV0dG9uXCIpO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICB0aGlzLnJ1bkJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiYWRkaW5nIGNsaWNrIGZ1bmN0aW9uIGZvciBydW5cIik7XG4gICAgICAgIHRoaXMucnVuQnV0dG9uLm9uY2xpY2sgPSB0aGlzLnJ1bkJ1dHRvbkhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcblxuICAgICAgICB0aGlzLmFkZFJlc2V0QnV0dG9uKGN0cmxEaXYpO1xuXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZWRvd25sb2FkIHx8IGVCb29rQ29uZmlnLmRvd25sb2Fkc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRG93bmxvYWRCdXR0b24oY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmhpZGVjb2RlICYmICF0aGlzLmhpZGVoaXN0b3J5KSB7XG4gICAgICAgICAgICB0aGlzLmFkZEhpc3RvcnlCdXR0b24oY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcImdyYWRlYnV0dG9uXCIpICYmICF0aGlzLmdyYWRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRGZWVkYmFja0J1dHRvbihjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaG93L0hpZGUgQ29kZVxuICAgICAgICBpZiAodGhpcy5oaWRlY29kZSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVIaWRlU2hvdyhjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb2RlTGVuc1xuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiY29kZWxlbnNcIikgJiYgIXRoaXMuZ3JhZGVyYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUNvZGVMZW5zKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEF1ZGlvIFRvdXJcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcImF1ZGlvXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUF1ZGlvVG91cnMoY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVCb29rQ29uZmlnLmlzSW5zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVJbnN0cnVjdG9yU2hhcmluZyhjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbmFibGVQYXJ0bmVyKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwUGFydG5lcihjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGF0Y29kZXMgJiYgZUJvb2tDb25maWcuZW5hYmxlX2NoYXRjb2Rlcykge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVDaGF0Q29kZXMoY3RybERpdik7XG4gICAgICAgIH1cblxuICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLnByZXBlbmQoY3RybERpdik7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoJCh0aGlzLnF1ZXN0aW9uKS5odG1sKCkubWF0Y2goL15cXHMrJC8pKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnF1ZXN0aW9uKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5wcmVwZW5kKHRoaXMucXVlc3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbERpdiA9IGN0cmxEaXY7XG4gICAgfVxuXG4gICAgYWRkRmVlZGJhY2tCdXR0b24oY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJhY19vcHQgYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19mZWVkYmFja1wiKSk7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLmdyYWRlQnV0dG9uID0gYnV0dDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgJChidXR0KS5jbGljayh0aGlzLmNyZWF0ZUdyYWRlU3VtbWFyeS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBhZGRIaXN0b3J5QnV0dG9uKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbG9hZF9oaXN0b3J5XCIpKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgdGhpcy5oaXN0QnV0dG9uID0gYnV0dDtcbiAgICAgICAgJChidXR0KS5jbGljayh0aGlzLmFkZEhpc3RvcnlTY3J1YmJlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgaWYgKHRoaXMuZ3JhZGVyYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEhpc3RvcnlTY3J1YmJlcih0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZERvd25sb2FkQnV0dG9uKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoXCJEb3dubG9hZFwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBzYXZlLWJ1dHRvblwiKTtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgdGhpcy5kb3dubG9hZEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5kb3dubG9hZEZpbGUuYmluZCh0aGlzLCB0aGlzLmxhbmd1YWdlKSk7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgfVxuXG4gICAgYWRkUmVzZXRCdXR0b24oY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkudGV4dChcIlJlc2V0XCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uID0gYnV0dDtcbiAgICAgICAgJChidXR0KS5jbGljayh0aGlzLnJlc2V0Q29kZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBlbmFibGVIaWRlU2hvdyhjdHJsRGl2KSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJhY19vcHQgYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlXCIpKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgIHRoaXMuc2hvd0hpZGVCdXR0ID0gYnV0dDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgJChidXR0KS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMuY29kZURpdikudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlzdG9yeVNjcnViYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRIaXN0b3J5U2NydWJiZXIodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlci5wYXJlbnRFbGVtZW50KS50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuc2hvd0hpZGVCdXR0KS50ZXh0KCkgPT1cbiAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlXCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5zaG93SGlkZUJ1dHQpLnRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVcIilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuc2hvd0hpZGVCdXR0KS50ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlXCIpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGVuYWJsZUNvZGVMZW5zKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZWxlbnNcIikpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgdGhpcy5jbEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5zaG93Q29kZWxlbnMuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgZW5hYmxlQXVkaW9Ub3VycyhjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyXCIpKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgIHRoaXMuYXRCdXR0b24gPSBidXR0O1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIG5ldyBBdWRpb1RvdXIoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiYXVkaW9cIilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZW5hYmxlSW5zdHJ1Y3RvclNoYXJpbmcoY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gYnRuLWluZm9cIik7XG4gICAgICAgICQoYnV0dCkudGV4dChcIlNoYXJlIENvZGVcIik7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICB0aGlzLnNoYXJlQnV0dCA9IGJ1dHQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgICQoYnV0dCkuY2xpY2soXG4gICAgICAgICAgICBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhY29uZmlybShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiWW91IGFyZSBhYm91dCB0byBzaGFyZSB0aGlzIGNvZGUgd2l0aCBBTEwgb2YgeW91ciBzdHVkZW50cy4gIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT9cIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpdmlkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICBsYW5nOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcbiAgICAgICAgICAgICAgICAgICAgZUJvb2tDb25maWcuYWpheFVSTCArIFwiYnJvYWRjYXN0X2NvZGUuanNvblwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBsZXQgcG9zdF9wcm9taXNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGF3YWl0IHBvc3RfcHJvbWlzZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy5tZXNzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChgU2hhcmVkIENvZGUgd2l0aCAke3N0YXR1cy5zaGFyZV9jb3VudH0gc3R1ZGVudHNgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChcIlNoYXJpbmcgRmFpbGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNldHVwUGFydG5lcihjdHJsRGl2KSB7XG4gICAgICAgIHZhciBjaGVja1BhcnRuZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgIGNoZWNrUGFydG5lci50eXBlID0gXCJjaGVja2JveFwiO1xuICAgICAgICBjaGVja1BhcnRuZXIuaWQgPSBgJHt0aGlzLmRpdmlkfV9wYXJ0YDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChjaGVja1BhcnRuZXIpO1xuICAgICAgICB2YXIgcGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICBwbGFiZWwuZm9yID0gYCR7dGhpcy5kaXZpZH1fcGFydGA7XG4gICAgICAgICQocGxhYmVsKS50ZXh0KFwiUGFpcj9cIik7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQocGxhYmVsKTtcbiAgICAgICAgJChjaGVja1BhcnRuZXIpLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcnRuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICQocGFydG5lclRleHRCb3gpLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgcGFydG5lclRleHRCb3gudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAkKHBsYWJlbCkudGV4dChcIlBhaXI/XCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWRBZ3JlZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFydG5lckFncmVlXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRpZEFncmVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWRBZ3JlZSA9IGNvbmZpcm0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJQYWlyIFByb2dyYW1taW5nIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgY29uc2VudCBvZiB5b3VyIGluc3RydWN0b3IuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIllvdXIgcGFydG5lciBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBtZW1iZXIgb2YgdGhlIGNsYXNzIGFuZCBoYXZlIGFncmVlZCB0byBwYWlyIHdpdGggeW91LlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJCeSBjbGlja2luZyBPSyB5b3UgY2VydGlmeSB0aGF0IGJvdGggb2YgdGhlc2UgY29uZGl0aW9ucyBoYXZlIGJlZW4gbWV0LlwiXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZEFncmVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJwYXJ0bmVyQWdyZWVcIiwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgJChwbGFiZWwpLnRleHQoXCJ3aXRoOiBcIik7XG4gICAgICAgICAgICAgICAgICAgICQocGFydG5lclRleHRCb3gpLnNob3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIHBhcnRuZXJUZXh0Qm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBwYXJ0bmVyVGV4dEJveC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQocGFydG5lclRleHRCb3gpO1xuICAgICAgICAkKHBhcnRuZXJUZXh0Qm94KS5oaWRlKCk7XG4gICAgICAgICQocGFydG5lclRleHRCb3gpLmNoYW5nZShcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnRuZXIgPSBwYXJ0bmVyVGV4dEJveC52YWx1ZTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgb2Jzb2xldGUuICBOb3Qgc3VyZSBpZiBhbnlvbmUgYXQgTWljaGlnYW4gd2lsbCBjb21lIGJhY2tcbiAgICAvLyB0byB3b3JraW5nIG9uIHRoaXMgYWdhaW4uXG4gICAgZW5hYmxlQ2hhdENvZGVzKGN0cmxEaXYpIHtcbiAgICAgICAgdmFyIGNoYXRCYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2YXIgY2hhbm5lbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgdmFyIHRvcGljID0gd2luZG93LmxvY2F0aW9uLmhvc3QgKyBcIi1cIiArIHRoaXMuZGl2aWQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoY2hhdEJhcik7XG4gICAgICAgICQoY2hhdEJhcikudGV4dChcIkNoYXQ6IFwiKTtcbiAgICAgICAgJChjaGF0QmFyKS5hcHBlbmQoY2hhbm5lbHMpO1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KFwiQ3JlYXRlIENoYW5uZWxcIik7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0YXJnZXRcIiwgXCJfYmxhbmtcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcbiAgICAgICAgICAgIFwiaHJlZlwiLFxuICAgICAgICAgICAgXCJodHRwOi8vXCIgK1xuICAgICAgICAgICAgICAgIGNoYXRjb2Rlc1NlcnZlciArXG4gICAgICAgICAgICAgICAgXCIvbmV3P1wiICtcbiAgICAgICAgICAgICAgICAkLnBhcmFtKHtcbiAgICAgICAgICAgICAgICAgICAgdG9waWM6IHdpbmRvdy5sb2NhdGlvbi5ob3N0ICsgXCItXCIgKyB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICBsYW5nOiBcIlB5dGhvblwiLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2hhdEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgIGNoYXRCYXIuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgIHZhciB1cGRhdGVDaGF0Q29kZXNDaGFubmVscyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gZG9jLmRhdGE7XG4gICAgICAgICAgICB2YXIgaSA9IDE7XG4gICAgICAgICAgICAkKGNoYW5uZWxzKS5odG1sKFwiXCIpO1xuICAgICAgICAgICAgZGF0YVtcImNoYW5uZWxzXCJdLmZvckVhY2goZnVuY3Rpb24gKGNoYW5uZWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWwuYXJjaGl2ZWQgJiYgdG9waWMgPT09IGNoYW5uZWwudG9waWMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmsgPSAkKFwiPGEgLz5cIik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBocmVmID1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaHR0cDovL1wiICsgY2hhdGNvZGVzU2VydmVyICsgXCIvXCIgKyBjaGFubmVsLmNoYW5uZWxOYW1lO1xuICAgICAgICAgICAgICAgICAgICBsaW5rLmF0dHIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogaHJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxpbmsudGV4dChcIiBcIiArIGNoYW5uZWwuY2hhbm5lbE5hbWUgKyBcIihcIiArIGkgKyBcIikgXCIpO1xuICAgICAgICAgICAgICAgICAgICAkKGNoYW5uZWxzKS5hcHBlbmQobGluayk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgJChjaGFubmVscykudGV4dChcIihubyBhY3RpdmUgY29udmVyc3RhdGlvbnMgb24gdGhpcyBwcm9ibGVtKVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZG9jLnN1YnNjcmliZSh1cGRhdGVDaGF0Q29kZXNDaGFubmVscyk7XG4gICAgICAgIGRvYy5vbihcIm9wXCIsIHVwZGF0ZUNoYXRDb2Rlc0NoYW5uZWxzKTtcbiAgICB9XG5cbiAgICBlbmFibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zYXZlX3J1blwiKSk7XG4gICAgfVxuXG4gICAgLy8gQWN0aXZlY29kZSAtLSBJZiB0aGUgY29kZSBoYXMgbm90IGNoYW5nZWQgd3J0IHRoZSBzY3J1YmJlciBwb3NpdGlvbiB2YWx1ZSB0aGVuIGRvbid0IHNhdmUgdGhlIGNvZGUgb3IgcmVwb3NpdGlvbiB0aGUgc2NydWJiZXJcbiAgICAvLyAgLS0gc3RpbGwgY2FsbCBydW5sb2csIGJ1dCBhZGQgYSBwYXJhbWV0ZXIgdG8gbm90IHNhdmUgdGhlIGNvZGVcbiAgICAvLyBhZGQgYW4gaW5pdGlhbCBsb2FkIGhpc3RvcnkgYnV0dG9uXG4gICAgLy8gaWYgdGhlcmUgaXMgbm8gZWRpdCB0aGVuIHRoZXJlIGlzIG5vIGFwcGVuZCAgIHRvX3NhdmUgKFRydWUvRmFsc2UpXG4gICAgYXN5bmMgYWRkSGlzdG9yeVNjcnViYmVyKHBvc19sYXN0KSB7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdmFyIHJlcURhdGEgPSB7XG4gICAgICAgICAgICBhY2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5zaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVxRGF0YVtcInNpZFwiXSA9IHRoaXMuc2lkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwiYmVmb3JlIGdldCBoaXN0XCIpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlQm9va0NvbmZpZy5wcmFjdGljZV9tb2RlIHx8XG4gICAgICAgICAgICAodGhpcy5pc1RpbWVkICYmICF0aGlzLmFzc2Vzc21lbnRUYWtlbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRpbWVkIGFuZCBhbHJlYWR5IHRha2VuIHdlIHNob3VsZCByZXN0b3JlIGhpc3RvcnkgaW5mb1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJTY3J1YmJlcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChlQm9va0NvbmZpZy5hamF4VVJMICsgXCJnZXRoaXN0Lmpzb25cIiwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXFEYXRhKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhpc3RvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkgPSB0aGlzLmhpc3RvcnkuY29uY2F0KGRhdGEuaGlzdG9yeSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHQgaW4gZGF0YS50aW1lc3RhbXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVzdGFtcHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShkYXRhLnRpbWVzdGFtcHNbdF0pLnRvTG9jYWxlU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ1bmFibGUgdG8gZmV0Y2ggaGlzdG9yeVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVuZGVyU2NydWJiZXIocG9zX2xhc3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcInN1Y2Nlc3NcIjtcbiAgICB9XG5cbiAgICByZW5kZXJTY3J1YmJlcihwb3NfbGFzdCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIm1ha2luZyBhIG5ldyBzY3J1YmJlclwiKTtcbiAgICAgICAgdmFyIHNjcnViYmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChzY3J1YmJlckRpdikuY3NzKFwiZGlzcGxheVwiLCBcImlubGluZS1ibG9ja1wiKTtcbiAgICAgICAgJChzY3J1YmJlckRpdikuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKHNjcnViYmVyRGl2KS5jc3MoXCJtYXJnaW4tcmlnaHRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKHNjcnViYmVyRGl2KS5jc3Moe1xuICAgICAgICAgICAgXCJtaW4td2lkdGhcIjogXCIyMDBweFwiLFxuICAgICAgICAgICAgXCJtYXgtd2lkdGhcIjogXCIzMDBweFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHNjcnViYmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy50aW1lc3RhbXBQID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHRoaXMuc2xpZGVpdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuaGlzdG9yeVskKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKV0pO1xuICAgICAgICAgICAgdmFyIGN1clZhbCA9IHRoaXMudGltZXN0YW1wc1skKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKV07XG4gICAgICAgICAgICBsZXQgcG9zID0gJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIik7XG4gICAgICAgICAgICBsZXQgb3V0T2YgPSB0aGlzLmhpc3RvcnkubGVuZ3RoO1xuICAgICAgICAgICAgJCh0aGlzLnRpbWVzdGFtcFApLnRleHQoYCR7Y3VyVmFsfSAtICR7cG9zICsgMX0gb2YgJHtvdXRPZn1gKTtcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJhY3RpdmVjb2RlXCIsXG4gICAgICAgICAgICAgICAgYWN0OiBcInNsaWRlOlwiICsgY3VyVmFsLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAkKHNjcnViYmVyKS5zbGlkZXIoe1xuICAgICAgICAgICAgbWF4OiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSxcbiAgICAgICAgfSk7XG4gICAgICAgICQoc2NydWJiZXIpLmNzcyhcIm1hcmdpblwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoc2NydWJiZXIpLm9uKFwic2xpZGVcIiwgdGhpcy5zbGlkZWl0LmJpbmQodGhpcykpO1xuICAgICAgICAkKHNjcnViYmVyKS5vbihcInNsaWRlY2hhbmdlXCIsIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpKTtcbiAgICAgICAgc2NydWJiZXJEaXYuYXBwZW5kQ2hpbGQoc2NydWJiZXIpO1xuICAgICAgICBzY3J1YmJlckRpdi5hcHBlbmRDaGlsZCh0aGlzLnRpbWVzdGFtcFApO1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGRlYWRsaW5lIHNldCB0aGVuIHBvc2l0aW9uIHRoZSBzY3J1YmJlciBhdCB0aGUgbGFzdCBzdWJtaXNzaW9uXG4gICAgICAgIC8vIHByaW9yIHRvIHRoZSBkZWFkbGluZVxuICAgICAgICBpZiAodGhpcy5kZWFkbGluZSkge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHdoaWxlIChpIDwgdGhpcy5oaXN0b3J5Lmxlbmd0aCAmJiAhZG9uZSkge1xuICAgICAgICAgICAgICAgIGlmIChuZXcgRGF0ZSh0aGlzLnRpbWVzdGFtcHNbaV0pID4gdGhpcy5kZWFkbGluZSkge1xuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSA9IGkgLSAxO1xuICAgICAgICAgICAgc2NydWJiZXIudmFsdWUgPSBNYXRoLm1heChpLCAwKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuaGlzdG9yeVtzY3J1YmJlci52YWx1ZV0pO1xuICAgICAgICAgICAgJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIiwgc2NydWJiZXIudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc19sYXN0KSB7XG4gICAgICAgICAgICBzY3J1YmJlci52YWx1ZSA9IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodGhpcy5oaXN0b3J5W3NjcnViYmVyLnZhbHVlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY3J1YmJlci52YWx1ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvcyA9ICQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpO1xuICAgICAgICBsZXQgb3V0T2YgPSB0aGlzLmhpc3RvcnkubGVuZ3RoO1xuICAgICAgICBsZXQgdHMgPSB0aGlzLnRpbWVzdGFtcHNbJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIildO1xuICAgICAgICAkKHRoaXMudGltZXN0YW1wUCkudGV4dChgJHt0c30gLSAke3BvcyArIDF9IG9mICR7b3V0T2Z9YCk7XG4gICAgICAgICQodGhpcy5oaXN0QnV0dG9uKS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5oaXN0QnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5oaXN0b3J5U2NydWJiZXIgPSBzY3J1YmJlcjtcbiAgICAgICAgJChzY3J1YmJlckRpdikuaW5zZXJ0QWZ0ZXIodGhpcy5ydW5CdXR0b24pO1xuICAgIH0gLy8gZW5kIGRlZmluaXRpb24gb2YgaGVscGVyXG5cbiAgICBjcmVhdGVPdXRwdXQoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHBhcmVudCBkaXYgd2l0aCB0d28gZWxlbWVudHM6ICBwcmUgZm9yIHN0YW5kYXJkIG91dHB1dCBhbmQgYSBkaXZcbiAgICAgICAgLy8gdG8gaG9sZCB0dXJ0bGUgZ3JhcGhpY3Mgb3V0cHV0LiAgV2UgdXNlIGEgZGl2IGluIGNhc2UgdGhlIHR1cnRsZSBjaGFuZ2VzIGZyb21cbiAgICAgICAgLy8gdXNpbmcgYSBjYW52YXMgdG8gdXNpbmcgc29tZSBvdGhlciBlbGVtZW50IGxpa2Ugc3ZnIGluIHRoZSBmdXR1cmUuXG4gICAgICAgIHZhciBvdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJhY19vdXRwdXQgY29sLW1kLTEyXCIpO1xuICAgICAgICB0aGlzLm91dERpdiA9IG91dERpdjtcbiAgICAgICAgdGhpcy5vdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICB0aGlzLm91dHB1dC5pZCA9IHRoaXMuZGl2aWQgKyBcIl9zdGRvdXRcIjtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICAgICAgdGhpcy5ncmFwaGljcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZ3JhcGhpY3MuaWQgPSB0aGlzLmRpdmlkICsgXCJfZ3JhcGhpY3NcIjtcbiAgICAgICAgJCh0aGlzLmdyYXBoaWNzKS5hZGRDbGFzcyhcImFjLWNhbnZhc1wiKTtcbiAgICAgICAgLy8gVGhpcyBiaXQgb2YgbWFnaWMgYWRkcyBhbiBldmVudCB3aGljaCB3YWl0cyBmb3IgYSBjYW52YXMgY2hpbGQgdG8gYmUgY3JlYXRlZCBvbiBvdXJcbiAgICAgICAgLy8gbmV3bHkgY3JlYXRlZCBkaXYuICBXaGVuIGEgY2FudmFzIGNoaWxkIGlzIGFkZGVkIHdlIGFkZCBhIG5ldyBjbGFzcyBzbyB0aGF0IHRoZSB2aXNpYmxlXG4gICAgICAgIC8vIGNhbnZhcyBjYW4gYmUgc3R5bGVkIGluIENTUy4gIFdoaWNoIGEgdGhlIG1vbWVudCBtZWFucyBqdXN0IGFkZGluZyBhIGJvcmRlci5cbiAgICAgICAgJCh0aGlzLmdyYXBoaWNzKS5vbihcbiAgICAgICAgICAgIFwiRE9NTm9kZUluc2VydGVkXCIsXG4gICAgICAgICAgICBcImNhbnZhc1wiLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICQodGhpcy5ncmFwaGljcykuYWRkQ2xhc3MoXCJ2aXNpYmxlLWFjLWNhbnZhc1wiKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICB2YXIgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgICAgICBvdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5vdXRwdXQpO1xuICAgICAgICBvdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5ncmFwaGljcyk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQob3V0RGl2KTtcbiAgICAgICAgdmFyIGxlbnNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBsZW5zRGl2LmlkID0gYCR7dGhpcy5kaXZpZH1fY29kZWxlbnNgO1xuICAgICAgICAkKGxlbnNEaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xuICAgICAgICAkKGxlbnNEaXYpLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgICAgICB0aGlzLmNvZGVsZW5zID0gbGVuc0RpdjtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsZW5zRGl2KTtcbiAgICAgICAgdmFyIGNvYWNoRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjb2FjaERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtMTJcIik7XG4gICAgICAgICQoY29hY2hEaXYpLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgICAgICB0aGlzLmNvZGVjb2FjaCA9IGNvYWNoRGl2O1xuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNvYWNoRGl2KTtcbiAgICAgICAgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgIH1cblxuICAgIGRpc2FibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnNhdmVCdXR0b24pLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5zYXZlQnV0dG9uKS5hdHRyKFwidGl0bGVcIiwgXCJMb2dpbiB0byBzYXZlIHlvdXIgY29kZVwiKTtcbiAgICAgICAgJCh0aGlzLmxvYWRCdXR0b24pLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5sb2FkQnV0dG9uKS5hdHRyKFwidGl0bGVcIiwgXCJMb2dpbiB0byBsb2FkIHlvdXIgY29kZVwiKTtcbiAgICB9XG5cbiAgICBkb3dubG9hZEZpbGUobGFuZykge1xuICAgICAgICB2YXIgZm5iID0gdGhpcy5kaXZpZDtcbiAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgZmlsZU5hbWUgPVxuICAgICAgICAgICAgZm5iICtcbiAgICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICAgIGRcbiAgICAgICAgICAgICAgICAudG9KU09OKClcbiAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEwKSAvLyByZXZlcnNlIGRhdGUgZm9ybWF0XG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiLVwiKVxuICAgICAgICAgICAgICAgIC5qb2luKFwiXCIpICtcbiAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgIGxhbmd1YWdlRXh0ZW5zaW9uc1tsYW5nXTtcbiAgICAgICAgdmFyIGNvZGUgPSB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpO1xuICAgICAgICBpZiAoXCJCbG9iXCIgaW4gd2luZG93KSB7XG4gICAgICAgICAgICB2YXIgdGV4dFRvV3JpdGUgPSBjb2RlLnJlcGxhY2UoL1xcbi9nLCBcIlxcclxcblwiKTtcbiAgICAgICAgICAgIHZhciB0ZXh0RmlsZUFzQmxvYiA9IG5ldyBCbG9iKFt0ZXh0VG9Xcml0ZV0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKFwibXNTYXZlT3JPcGVuQmxvYlwiIGluIG5hdmlnYXRvcikge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKHRleHRGaWxlQXNCbG9iLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBkb3dubG9hZExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuZG93bmxvYWQgPSBmaWxlTmFtZTtcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuaW5uZXJIVE1MID0gXCJEb3dubG9hZCBGaWxlXCI7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLmhyZWYgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCh0ZXh0RmlsZUFzQmxvYik7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvd25sb2FkTGluayk7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGVydChcIllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBIVE1MNSBCbG9iLlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q29kZSgpIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5kaXZpZCk7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGVHcmFkZVN1bW1hcnkoKSB7XG4gICAgICAgIC8vIGdldCBncmFkZSBhbmQgY29tbWVudHMgZm9yIHRoaXMgYXNzaWdubWVudFxuICAgICAgICAvLyBnZXQgc3VtbWFyeSBvZiBhbGwgZ3JhZGVzIGZvciB0aGlzIHN0dWRlbnRcbiAgICAgICAgLy8gZGlzcGxheSBncmFkZXMgaW4gbW9kYWwgd2luZG93XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcImdldGFzc2lnbm1lbnRncmFkZVwiLCB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG4gICAgICAgIGxldCByZXBvcnQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHZhciBib2R5O1xuICAgICAgICAvLyBjaGVjayBmb3IgcmVwb3J0WydtZXNzYWdlJ11cbiAgICAgICAgaWYgKHJlcG9ydCkge1xuICAgICAgICAgICAgaWYgKHJlcG9ydFtcInZlcnNpb25cIl0gPT0gMikge1xuICAgICAgICAgICAgICAgIC8vIG5ldyB2ZXJzaW9uOyB3b3VsZCBiZSBiZXR0ZXIgdG8gZW1iZWQgdGhpcyBpbiBIVE1MIGZvciB0aGUgYWN0aXZlY29kZVxuICAgICAgICAgICAgICAgIGJvZHkgPVxuICAgICAgICAgICAgICAgICAgICBcIjxoND5HcmFkZSBSZXBvcnQ8L2g0PlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCI8cD5UaGlzIHF1ZXN0aW9uOiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydFtcImdyYWRlXCJdO1xuICAgICAgICAgICAgICAgIGlmIChyZXBvcnRbXCJyZWxlYXNlZFwiXSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IFwiIG91dCBvZiBcIiArIHJlcG9ydFtcIm1heFwiXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm9keSArPSBcIjwvcD4gPHA+XCI7XG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydFtcInJlbGVhc2VkXCJdID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gXCJQcmVsaW1pbmFyeSBDb21tZW50czogXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJvZHkgKz0gcmVwb3J0W1wiY29tbWVudFwiXSArIFwiPC9wPlwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBib2R5ID1cbiAgICAgICAgICAgICAgICAgICAgXCI8aDQ+R3JhZGUgUmVwb3J0PC9oND5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+VGhpcyBhc3NpZ25tZW50OiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydFtcImdyYWRlXCJdICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L3A+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIjxwPlwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiY29tbWVudFwiXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9wPlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCI8cD5OdW1iZXIgb2YgZ3JhZGVkIGFzc2lnbm1lbnRzOiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydFtcImNvdW50XCJdICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L3A+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIjxwPkF2ZXJhZ2Ugc2NvcmU6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiYXZnXCJdICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L3A+XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib2R5ID0gXCI8aDQ+VGhlIHNlcnZlciBkaWQgbm90IHJldHVybiBhbnkgZ3JhZGUgaW5mb3JtYXRpb248L2g0PlwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBodG1sID0gYDxkaXYgY2xhc3M9XCJtb2RhbCBmYWRlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIGNvbXBhcmUtbW9kYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPkFzc2lnbm1lbnQgRmVlZGJhY2s8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke2JvZHl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgdmFyIGVsID0gJChodG1sKTtcbiAgICAgICAgZWwubW9kYWwoKTtcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvd0NvZGVsZW5zKCkge1xuICAgICAgICBpZiAodGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZWxlbnNcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIHRoaXMuY2xCdXR0b24uaW5uZXJUZXh0ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuc1wiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2wgPSB0aGlzLmNvZGVsZW5zLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChjbCkge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5yZW1vdmVDaGlsZChjbCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGUgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7XG4gICAgICAgIHZhciBteVZhcnMgPSB7fTtcbiAgICAgICAgbXlWYXJzLmNvZGUgPSBjb2RlO1xuICAgICAgICBteVZhcnMub3JpZ2luID0gXCJvcHQtZnJvbnRlbmQuanNcIjtcbiAgICAgICAgbXlWYXJzLmN1bXVsYXRpdmUgPSBmYWxzZTtcbiAgICAgICAgbXlWYXJzLmhlYXBQcmltaXRpdmVzID0gZmFsc2U7XG4gICAgICAgIG15VmFycy5kcmF3UGFyZW50UG9pbnRlcnMgPSBmYWxzZTtcbiAgICAgICAgbXlWYXJzLnRleHRSZWZlcmVuY2VzID0gZmFsc2U7XG4gICAgICAgIG15VmFycy5zaG93T25seU91dHB1dHMgPSBmYWxzZTtcbiAgICAgICAgbXlWYXJzLnJhd0lucHV0THN0SlNPTiA9IEpTT04uc3RyaW5naWZ5KFtdKTtcbiAgICAgICAgaWYgKHRoaXMubGFuZ3VhZ2UgPT0gXCJweXRob25cIikge1xuICAgICAgICAgICAgaWYgKHRoaXMucHl0aG9uMykge1xuICAgICAgICAgICAgICAgIG15VmFycy5weSA9IDM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG15VmFycy5weSA9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYW5nYXVnZSA9PSBcImphdmFzY3JpcHRcIikge1xuICAgICAgICAgICAgbXlWYXJzLnB5ID0gXCJqc1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXlWYXJzLnB5ID0gdGhpcy5sYW5ndWFnZTtcbiAgICAgICAgfVxuICAgICAgICBteVZhcnMuY3VySW5zdHIgPSAwO1xuICAgICAgICBteVZhcnMuY29kZURpdldpZHRoID0gMzUwO1xuICAgICAgICBteVZhcnMuY29kZURpdkhlaWdodCA9IDQwMDtcbiAgICAgICAgdmFyIHNyY1VSTCA9IFwiaHR0cHM6Ly9weXRob250dXRvci5jb20vaWZyYW1lLWVtYmVkLmh0bWxcIjtcbiAgICAgICAgdmFyIHNyY1ZhcnMgPSAkLnBhcmFtKG15VmFycyk7XG4gICAgICAgIHZhciBlbWJlZFVybFN0ciA9IGAke3NyY1VSTH0jJHtzcmNWYXJzfWA7XG4gICAgICAgIHZhciBteUlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcImlkXCIsIHRoaXMuZGl2aWQgKyBcIl9jb2RlbGVuc1wiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCI4MDBcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjUwMFwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJkaXNwbGF5OmJsb2NrXCIpO1xuICAgICAgICBteUlmcmFtZS5zdHlsZS5iYWNrZ3JvdW5kID0gXCIjZmZmXCI7XG4gICAgICAgIC8vbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwic3JjXCIsc3JjVVJMKVxuICAgICAgICBteUlmcmFtZS5zcmMgPSBlbWJlZFVybFN0cjtcbiAgICAgICAgdGhpcy5jb2RlbGVucy5hcHBlbmRDaGlsZChteUlmcmFtZSk7XG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50OiBcImNvZGVsZW5zXCIsXG4gICAgICAgICAgICBhY3Q6IFwidmlld1wiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gPGlmcmFtZSBpZD1cIiUoZGl2aWQpc19jb2RlbGVuc1wiIHdpZHRoPVwiODAwXCIgaGVpZ2h0PVwiNTAwXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrXCJzcmM9XCIjXCI+XG4gICAgLy8gPC9pZnJhbWU+XG4gICAgc2hvd0NvZGVDb2FjaCgpIHtcbiAgICAgICAgdmFyIG15SWZyYW1lO1xuICAgICAgICB2YXIgc3JjVVJMO1xuICAgICAgICB2YXIgY2w7XG4gICAgICAgIHZhciBkaXZfaWQgPSB0aGlzLmRpdmlkO1xuICAgICAgICBpZiAodGhpcy5jb2RlY29hY2ggPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWNvYWNoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRoaXMuY29kZWNvYWNoLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIH1cbiAgICAgICAgY2wgPSB0aGlzLmNvZGVjb2FjaC5maXJzdENoaWxkO1xuICAgICAgICBpZiAoY2wpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWNvYWNoLnJlbW92ZUNoaWxkKGNsKTtcbiAgICAgICAgfVxuICAgICAgICBzcmNVUkwgPSBlQm9va0NvbmZpZy5hcHAgKyBcIi9hZG1pbi9kaWZmdmlld2VyP2RpdmlkPVwiICsgZGl2X2lkO1xuICAgICAgICBteUlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcImlkXCIsIGRpdl9pZCArIFwiX2NvYWNoXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBcIjgwMHB4XCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgXCI1MDBweFwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJkaXNwbGF5OmJsb2NrXCIpO1xuICAgICAgICBteUlmcmFtZS5zdHlsZS5iYWNrZ3JvdW5kID0gXCIjZmZmXCI7XG4gICAgICAgIG15SWZyYW1lLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XG4gICAgICAgIG15SWZyYW1lLnNyYyA9IHNyY1VSTDtcbiAgICAgICAgdGhpcy5jb2RlY29hY2guYXBwZW5kQ2hpbGQobXlJZnJhbWUpO1xuICAgICAgICAkKHRoaXMuY29kZWNvYWNoKS5zaG93KCk7XG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50OiBcImNvYWNoXCIsXG4gICAgICAgICAgICBhY3Q6IFwidmlld1wiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0b2dnbGVFZGl0b3JWaXNpYmlsaXR5KCkge31cblxuICAgIGFkZEVycm9yTWVzc2FnZShlcnIpIHtcbiAgICAgICAgLy8gQWRkIHRoZSBlcnJvciBtZXNzYWdlXG4gICAgICAgIHRoaXMuZXJyTGFzdFJ1biA9IHRydWU7XG4gICAgICAgIHZhciBlcnJIZWFkID0gJChcIjxoMz5cIikuaHRtbChcIkVycm9yXCIpO1xuICAgICAgICB0aGlzLmVDb250YWluZXIgPSB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmVDb250YWluZXIuY2xhc3NOYW1lID0gXCJlcnJvciBhbGVydCBhbGVydC1kYW5nZXJcIjtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmlkID0gdGhpcy5kaXZpZCArIFwiX2VycmluZm9cIjtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKGVyckhlYWRbMF0pO1xuICAgICAgICB2YXIgZXJyVGV4dCA9IHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIilcbiAgICAgICAgKTtcbiAgICAgICAgLy8gQnV0LCBhZGp1c3QgdGhlIGxpbmUgbnVtYmVycy4gIElmIHRoZSBsaW5lIG51bWJlciBpcyA8PSBwcmV0ZXh0TGluZXMgdGhlbiBpdCBpcyBpbiBpbmNsdWRlZCBjb2RlXG4gICAgICAgIC8vIGlmIGl0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGluY2x1ZGVkIGxpbmVzIGJ1dCBsZXNzIHRoYW4gdGhlIHByZXRleHQgKyBjdXJyZW50IGVkaXRvciB0aGVuIGl0IGlzIGluIHRoZSBzdHVkZW50IGNvZGUuXG4gICAgICAgIC8vIGFkanVzdCB0aGUgbGluZSBudW1iZXIgd2UgZGlzcGxheSBieSBlbGltaW5hdGluZyB0aGUgcHJlLWluY2x1ZGVkIGNvZGUuXG4gICAgICAgIGlmIChlcnIudHJhY2ViYWNrLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JMaW5lID0gZXJyLnRyYWNlYmFja1swXS5saW5lbm87XG4gICAgICAgICAgICBpZiAoZXJyb3JMaW5lIDw9IHRoaXMucHJldGV4dExpbmVzKSB7XG4gICAgICAgICAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPVxuICAgICAgICAgICAgICAgICAgICBcIkFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBoaWRkZW4sIGluY2x1ZGVkIGNvZGUuIFNvcnJ5IHdlIGNhbid0IGdpdmUgeW91IGEgbW9yZSBoZWxwZnVsIGVycm9yIG1lc3NhZ2VcIjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yTGluZSA+IHRoaXMucHJvZ0xpbmVzICsgdGhpcy5wcmV0ZXh0TGluZXMpIHtcbiAgICAgICAgICAgICAgICBlcnJUZXh0LmlubmVySFRNTCA9IGBBbiBlcnJvciBvY2N1cnJlZCBhZnRlciB0aGUgZW5kIG9mIHlvdXIgY29kZS5cbk9uZSBwb3NzaWJsZSByZWFzb24gaXMgdGhhdCB5b3UgaGF2ZSBhbiB1bmNsb3NlZCBwYXJlbnRoZXNpcyBvciBzdHJpbmcuXG5Bbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGhpZGRlbiB0ZXN0IGNvZGUuXG5ZZXQgYW5vdGhlciBpcyB0aGF0IHRoZXJlIGlzIGFuIGludGVybmFsIGVycm9yLiAgVGhlIGludGVybmFsIGVycm9yIG1lc3NhZ2UgaXM6ICR7ZXJyLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXRleHRMaW5lcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyLnRyYWNlYmFja1swXS5saW5lbm8gPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnRyYWNlYmFja1swXS5saW5lbm8gLSB0aGlzLnByZXRleHRMaW5lcyArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJTdHJpbmcgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgdmFyIHRvID0gZXJyU3RyaW5nLmluZGV4T2YoXCI6XCIpO1xuICAgICAgICB2YXIgZXJyTmFtZSA9IGVyclN0cmluZy5zdWJzdHJpbmcoMCwgdG8pO1xuICAgICAgICBlcnJUZXh0LmlubmVySFRNTCA9IGVyclN0cmluZztcbiAgICAgICAgJCh0aGlzLmVDb250YWluZXIpLmFwcGVuZChcIjxoMz5EZXNjcmlwdGlvbjwvaDM+XCIpO1xuICAgICAgICB2YXIgZXJyRGVzYyA9IHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSk7XG4gICAgICAgIGVyckRlc2MuaW5uZXJIVE1MID0gZXJyb3JUZXh0W2Vyck5hbWVdO1xuICAgICAgICAkKHRoaXMuZUNvbnRhaW5lcikuYXBwZW5kKFwiPGgzPlRvIEZpeDwvaDM+XCIpO1xuICAgICAgICB2YXIgZXJyRml4ID0gdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpKTtcbiAgICAgICAgZXJyRml4LmlubmVySFRNTCA9IGVycm9yVGV4dFtlcnJOYW1lICsgXCJGaXhcIl07XG4gICAgICAgIHZhciBtb3JlSW5mbyA9IFwiLi4vRXJyb3JIZWxwL1wiICsgZXJyTmFtZS50b0xvd2VyQ2FzZSgpICsgXCIuaHRtbFwiO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiUnVudGltZSBFcnJvcjogXCIgKyBlcnIudG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIHNldFRpbWVMaW1pdCh0aW1lcikge1xuICAgICAgICB2YXIgdGltZWxpbWl0ID0gdGhpcy50aW1lbGltaXQ7XG4gICAgICAgIGlmICh0aW1lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aW1lbGltaXQgPSB0aW1lcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgZXhlY0xpbWl0IGluIG1pbGxpc2Vjb25kcyAgLS0gZm9yIHN0dWRlbnQgcHJvamVjdHMgc2V0IHRoaXMgdG9cbiAgICAgICAgLy8gMjUgc2Vjb25kcyAtLSBqdXN0IGxlc3MgdGhhbiBDaHJvbWUncyBvd24gdGltZXIuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuY29kZS5pbmRleE9mKFwib250aW1lclwiKSA+IC0xIHx8XG4gICAgICAgICAgICB0aGlzLmNvZGUuaW5kZXhPZihcIm9uY2xpY2tcIikgPiAtMSB8fFxuICAgICAgICAgICAgdGhpcy5jb2RlLmluZGV4T2YoXCJvbmtleVwiKSA+IC0xIHx8XG4gICAgICAgICAgICB0aGlzLmNvZGUuaW5kZXhPZihcInNldERlbGF5XCIpID4gLTFcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBTay5leGVjTGltaXQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRpbWVsaW1pdCA9PT0gXCJvZmZcIikge1xuICAgICAgICAgICAgICAgIFNrLmV4ZWNMaW1pdCA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVsaW1pdCkge1xuICAgICAgICAgICAgICAgIFNrLmV4ZWNMaW1pdCA9IHRpbWVsaW1pdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgU2suZXhlY0xpbWl0ID0gMjUwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnVpbHRpblJlYWQoeCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBTay5idWlsdGluRmlsZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgU2suYnVpbHRpbkZpbGVzW1wiZmlsZXNcIl1beF0gPT09IHVuZGVmaW5lZFxuICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9maWxlX25vdF9mb3VuZFwiLCB4KTtcbiAgICAgICAgcmV0dXJuIFNrLmJ1aWx0aW5GaWxlc1tcImZpbGVzXCJdW3hdO1xuICAgIH1cbiAgICBmaWxlUmVhZGVyKGRpdmlkKSB7XG4gICAgICAgIGxldCBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGl2aWQpO1xuICAgICAgICBsZXQgZGF0YSA9IFwiXCI7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBpZiAoZWxlbSA9PSBudWxsICYmIFNrLmJ1aWx0aW5GaWxlcy5maWxlcy5oYXNPd25Qcm9wZXJ0eShkaXZpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBTay5idWlsdGluRmlsZXNbXCJmaWxlc1wiXVtkaXZpZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0cnkgcmVtb3RlIGZpbGUgdW5sZXNzIGl0IGVuZHMgd2l0aCAuanMgb3IgLnB5IC0tIG90aGVyd2lzZSB3ZSdsbCBhc2sgdGhlIHNlcnZlciBmb3IgYWxsXG4gICAgICAgICAgICAvLyBraW5kcyBvZiBtb2R1bGVzIHRoYXQgd2UgYXJlIHRyeWluZyB0byBpbXBvcnRcbiAgICAgICAgICAgIGlmICghKGRpdmlkLmVuZHNXaXRoKFwiLmpzXCIpIHx8IGRpdmlkLmVuZHNXaXRoKFwiLnB5XCIpKSkge1xuICAgICAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBgL3J1bmVzdG9uZS9hamF4L2dldF9kYXRhZmlsZT9jb3Vyc2VfaWQ9JHtlQm9va0NvbmZpZy5jb3Vyc2V9JmFjaWQ9JHtkaXZpZH1gLFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShkYXRhKS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtID09IG51bGwgJiYgcmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2suYnVpbHRpbi5JT0Vycm9yKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX25vX2ZpbGVfb3JfZGlyXCIsIGRpdmlkKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJ0ZXh0YXJlYVwiKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGVsZW0udmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBlbGVtLnRleHRDb250ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBvdXRwdXRmdW4odGV4dCkge1xuICAgICAgICAvLyBibm0gcHl0aG9uIDNcbiAgICAgICAgdmFyIHB5U3RyID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJbXCIgKyB4LmpvaW4oXCIsIFwiKSArIFwiXVwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHggPSB0ZXh0O1xuICAgICAgICBpZiAoIXRoaXMucHl0aG9uMykge1xuICAgICAgICAgICAgaWYgKHguY2hhckF0KDApID09IFwiKFwiKSB7XG4gICAgICAgICAgICAgICAgeCA9IHguc2xpY2UoMSwgLTEpO1xuICAgICAgICAgICAgICAgIHggPSBcIltcIiArIHggKyBcIl1cIjtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeGwgPSBldmFsKHgpO1xuICAgICAgICAgICAgICAgICAgICB4bCA9IHhsLm1hcChweVN0cik7XG4gICAgICAgICAgICAgICAgICAgIHggPSB4bC5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XG4gICAgICAgIHRleHQgPSB4O1xuICAgICAgICB0ZXh0ID0gdGV4dFxuICAgICAgICAgICAgLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXG4vZywgXCI8YnIvPlwiKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm91dHB1dCkuYXBwZW5kKHRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZmlsZXdyaXRlcihmb2JqLCBieXRlcykge1xuICAgICAgICBsZXQgZmlsZWNvbXBvbmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvYmoubmFtZSk7XG4gICAgICAgIGlmICghZmlsZWNvbXBvbmVudCkge1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAkKGNvbnRhaW5lcikuYWRkQ2xhc3MoXCJydW5lc3RvbmVcIik7XG4gICAgICAgICAgICBsZXQgdGFiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICQodGFiKS5hZGRDbGFzcyhcImRhdGFmaWxlX2NhcHRpb25cIik7XG4gICAgICAgICAgICB0YWIuaW5uZXJIVE1MID0gYERhdGEgZmlsZTogPGNvZGU+JHtmb2JqLm5hbWV9PC9jb2RlPmA7XG4gICAgICAgICAgICBmaWxlY29tcG9uZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICAgICAgZmlsZWNvbXBvbmVudC5yb3dzID0gMTA7XG4gICAgICAgICAgICBmaWxlY29tcG9uZW50LmNvbHMgPSA1MDtcbiAgICAgICAgICAgIGZpbGVjb21wb25lbnQuaWQgPSBmb2JqLm5hbWU7XG4gICAgICAgICAgICAkKGZpbGVjb21wb25lbnQpLmNzcyhcIm1hcmdpbi1ib3R0b21cIiwgXCI1cHhcIik7XG4gICAgICAgICAgICAkKGZpbGVjb21wb25lbnQpLmFkZENsYXNzKFwiYWNfb3V0cHV0XCIpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYik7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZmlsZWNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZm9iai5wb3MkID09IDApIHtcbiAgICAgICAgICAgICAgICAkKGZpbGVjb21wb25lbnQpLnZhbChcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgY3VycmVudCA9ICQoZmlsZWNvbXBvbmVudCkudmFsKCk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50ICsgYnl0ZXMudjtcbiAgICAgICAgJChmaWxlY29tcG9uZW50KS52YWwoY3VycmVudCk7XG4gICAgICAgICQoZmlsZWNvbXBvbmVudCkuY3NzKFwiZGlzcGxheVwiLCBcImJsb2NrXCIpO1xuICAgICAgICBmb2JqLnBvcyQgPSBjdXJyZW50Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQubGVuZ3RoO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEluY2x1ZGVkQ29kZShkaXZpZCkge1xuICAgICAgICBpZiAod2luZG93LmVkTGlzdFtkaXZpZF0pIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZWRMaXN0W2RpdmlkXS5lZGl0b3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoXG4gICAgICAgICAgICAgICAgYC9ydW5lc3RvbmUvYWpheC9nZXRfZGF0YWZpbGU/Y291cnNlX2lkPSR7ZUJvb2tDb25maWcuY291cnNlfSZhY2lkPSR7ZGl2aWR9YCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IHdyZXN1bHQgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGxldCBvYmogPSBhd2FpdCB3cmVzdWx0Lmpzb24oKTtcbiAgICAgICAgICAgIHJldHVybiBvYmouZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGJ1aWxkUHJvZyh1c2VTdWZmaXgpIHtcbiAgICAgICAgLy8gYXNzZW1ibGUgY29kZSBmcm9tIHByZWZpeCwgc3VmZml4LCBhbmQgZWRpdG9yIGZvciBydW5uaW5nLlxuICAgICAgICB2YXIgcHJldGV4dDtcbiAgICAgICAgdmFyIHByb2cgPSB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpICsgXCJcXG5cIjtcbiAgICAgICAgaWYgKHRoaXMucHJlZml4KSB7XG4gICAgICAgICAgICBwcm9nID0gdGhpcy5wcmVmaXggKyBwcm9nO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldGV4dCA9IFwiXCI7XG4gICAgICAgIHRoaXMucHJldGV4dExpbmVzID0gMDtcbiAgICAgICAgdGhpcy5wcm9nTGluZXMgPSBwcm9nLm1hdGNoKC9cXG4vZykubGVuZ3RoICsgMTtcbiAgICAgICAgaWYgKHRoaXMuaW5jbHVkZXMpIHtcbiAgICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgaW5jbHVkZXMsIGluLW9yZGVyIHByZXBlbmRpbmcgdG8gcHJvZ1xuICAgICAgICAgICAgcHJldGV4dCA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMuaW5jbHVkZXMubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgaUNvZGUgPSBhd2FpdCB0aGlzLmdldEluY2x1ZGVkQ29kZSh0aGlzLmluY2x1ZGVzW3hdKTtcbiAgICAgICAgICAgICAgICBwcmV0ZXh0ID0gcHJldGV4dCArIGlDb2RlICsgXCJcXG5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJldGV4dCA9IHByZXRleHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV0ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV0ZXh0TGluZXMgPSAodGhpcy5wcmV0ZXh0Lm1hdGNoKC9cXG4vZykgfHwgXCJcIikubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvZyA9IHByZXRleHQgKyBwcm9nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2VTdWZmaXggJiYgdGhpcy5zdWZmaXgpIHtcbiAgICAgICAgICAgIHByb2cgPSBwcm9nICsgdGhpcy5zdWZmaXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwcm9nKTtcbiAgICB9XG5cbiAgICBhc3luYyBtYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yeVNjcnViYmVyID09PSBudWxsICYmICF0aGlzLmF1dG9ydW4pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5oaXN0b3J5U2NydWJiZXIgJiZcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeVskKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKV0gIT1cbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpXG4gICAgICAgICkge1xuICAgICAgICAgICAgc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRoaXMuZWRpdG9yLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgdGhpcy50aW1lc3RhbXBzLnB1c2gobmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpKTtcbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcbiAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgIFwibWF4XCIsXG4gICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXG4gICAgICAgICAgICAgICAgXCJvcHRpb25cIixcbiAgICAgICAgICAgICAgICBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNsaWRlaXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNhdmVDb2RlID0gXCJGYWxzZVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciA9PSBudWxsKSB7XG4gICAgICAgICAgICBzYXZlQ29kZSA9IFwiRmFsc2VcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2F2ZUNvZGU7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tDdXJyZW50QW5zd2VyKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5Qcm9nKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBlcnJvciBydW5uaW5nIGNvZGUgJHtlfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9nQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgbGFuZzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgICAgIGVycmluZm86IHRoaXMuZXJyaW5mbyxcbiAgICAgICAgICAgIHRvX3NhdmU6IHRoaXMuc2F2ZUNvZGUsXG4gICAgICAgICAgICBwcmVmaXg6IHRoaXMucHJldGV4dCxcbiAgICAgICAgICAgIHN1ZmZpeDogdGhpcy5zdWZmaXgsXG4gICAgICAgICAgICBwYXJ0bmVyOiB0aGlzLnBhcnRuZXIsXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmRpdmlkLCBkYXRhWydjb2RlJ10pO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5sb2dSdW5FdmVudChkYXRhKTsgLy8gTG9nIHRoZSBydW4gZXZlbnRcbiAgICAgICAgLy8gSWYgdW5pdCB0ZXN0cyB3ZXJlIHJ1biB0aGVyZSB3aWxsIGJlIGEgdW5pdF9yZXN1bHRzXG4gICAgICAgIGlmICh0aGlzLnVuaXRfcmVzdWx0cykge1xuICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgIGFjdDogdGhpcy51bml0X3Jlc3VsdHMsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBcInVuaXR0ZXN0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckZlZWRiYWNrKCkge1xuICAgICAgICAvLyBUaGUgcHl0aG9uIHVuaXQgdGVzdCBjb2RlIGJ1aWxkcyB0aGUgdGFibGUgYXMgaXQgaXMgcnVubmluZyB0aGUgdGVzdHNcbiAgICAgICAgLy8gSW4gXCJub3JtYWxcIiB1c2FnZSB0aGlzIGlzIGRpc3BsYXllZCBpbW1lZGlhdGVseS5cbiAgICAgICAgLy8gSG93ZXZlciBpbiBleGFtIG1vZGUgd2UgbWFrZSBhIGRpdiB3aGljaCBpcyBvZmZzY3JlZW5cbiAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzX2RpdmlkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy51bml0X3Jlc3VsdHNfZGl2aWQuaW5kZXhPZihcIl9vZmZzY3JlZW5fXCIpID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCB1ckRpdmlkID0gYCR7dGhpcy5kaXZpZH1fb2Zmc2NyZWVuX3VuaXRfcmVzdWx0c2A7XG4gICAgICAgICAgICAgICAgbGV0IHVuaXRGZWVkYmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHVyRGl2aWQpO1xuICAgICAgICAgICAgICAgIGxldCB0bXAgPSBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHVuaXRGZWVkYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcy5vdXRlckRpdikuZmluZChgIyR7dXJEaXZpZH1gKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRtcCA9ICQodGhpcy5vdXRlckRpdikuZmluZChgIyR7dXJEaXZpZH1gKVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKHRtcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQodG1wKS5zaG93KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB1ckRpdmlkID0gdGhpcy5kaXZpZCArIFwiX3VuaXRfcmVzdWx0c1wiO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfWApLmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5vdXRlckRpdikuZmluZChgIyR7dXJEaXZpZH1fb2Zmc2NyZWVuX3VuaXRfcmVzdWx0c2ApXG4gICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoID09IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVyUmVzdWx0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHVyRGl2aWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKHVyUmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogcnVuUHJvZyBoYXMgc2V2ZXJhbCBhc3luYyBlbGVtZW50cyB0byBpdC5cbiAgICAgKiAxLiBTa3VscHQgcnVucyB0aGUgcHl0aG9uIHByb2dyYW0gYXN5bmNocm9ub3VzbHlcbiAgICAgKiAyLiBUaGUgaGlzdG9yeSBpcyByZXN0b3JlZCBhc3luY2hyb25vdXNseVxuICAgICAqIDMuIExvZ2dpbmcgaXMgYXN5bmNocm9ub3VzXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBza3VscHQgUHJvbWlzZSBhbmQgc28gdGhlIHByb21pc2Ugd2lsbCByZXNvbHZlIHdoZW4gc2t1bHB0IGlzIGZpbmlzaGVkLlxuICAgICAqIHdoZW4gZmluaXNoZWQgdGhpcy51bml0X3Jlc3VsdHMgd2lsbCBjb250YWluIHRoZSByZXN1bHRzIG9mIGFueSB1bml0IHRlc3RzIHRoYXQgaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKiBUaGUgdGFibGUgb2YgcmVzdWx0cyBpcyBjb25zdHJ1Y3RlZCBhbmQgYWRkZWQgdG8gdGhlIERPTSBieSB0aGUgcHl0aG9uIHVuaXR0ZXN0Lmd1aSBtb2R1bGUgaW4gc2t1bHB0LlxuICAgICAqXG4gICAgICovXG4gICAgYXN5bmMgcnVuUHJvZyhub1VJLCBsb2dSZXN1bHRzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwic3RhcnRpbmcgcnVuUHJvZ1wiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2dSZXN1bHRzID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gbG9nUmVzdWx0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5vVUkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBub1VJID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICB3aGlsZSAoJChgIyR7dGhpcy5kaXZpZH1fZXJyaW5mb2ApLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICQoYCMke3RoaXMuZGl2aWR9X2VycmluZm9gKS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyQodGhpcy5lQ29udGFpbmVyKS5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHRoaXMuY29kZWxlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNsQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgU2suY29uZmlndXJlKHtcbiAgICAgICAgICAgIG91dHB1dDogdGhpcy5vdXRwdXRmdW4uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHJlYWQ6IHRoaXMuZmlsZVJlYWRlcixcbiAgICAgICAgICAgIGZpbGV3cml0ZTogdGhpcy5maWxld3JpdGVyLmJpbmQodGhpcyksXG4gICAgICAgICAgICBfX2Z1dHVyZV9fOiBTay5weXRob24zLFxuICAgICAgICAgICAgbm9ucmVhZG9wZW46IHRydWUsXG4gICAgICAgICAgICAvLyAgICAgICAgcHl0aG9uMzogdGhpcy5weXRob24zLFxuICAgICAgICAgICAgaW1hZ2VQcm94eTogXCJodHRwOi8vaW1hZ2UucnVuZXN0b25lLmFjYWRlbXk6ODA4MC8zMjB4XCIsXG4gICAgICAgICAgICBpbnB1dGZ1blRha2VzUHJvbXB0OiB0cnVlLFxuICAgICAgICAgICAganNvbnBTaXRlczogW1wiaHR0cHM6Ly9pdHVuZXMuYXBwbGUuY29tXCJdLFxuICAgICAgICB9KTtcbiAgICAgICAgU2suZGl2aWQgPSB0aGlzLmRpdmlkO1xuICAgICAgICBTay5sb2dSZXN1bHRzID0gbG9nUmVzdWx0cztcblxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmRpdmlkLHRoaXMuY29kZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZ3JhZGVyYWN0aXZlICYmIHRoaXMub3V0ZXJEaXYuY2xvc2VzdChcIi5sb2FkaW5nXCIpKSB7XG4gICAgICAgICAgICBTay5ncmFkZUNvbnRhaW5lciA9IHRoaXMub3V0ZXJEaXYuY2xvc2VzdChcIi5sb2FkaW5nXCIpLmlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2suZ3JhZGVDb250YWluZXIgPSB0aGlzLmRpdmlkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VGltZUxpbWl0KCk7XG4gICAgICAgIChTay5UdXJ0bGVHcmFwaGljcyB8fCAoU2suVHVydGxlR3JhcGhpY3MgPSB7fSkpLnRhcmdldCA9IHRoaXMuZ3JhcGhpY3M7XG4gICAgICAgIFNrLmNhbnZhcyA9IHRoaXMuZ3JhcGhpY3MuaWQ7IC8vdG9kbzogZ2V0IHJpZCBvZiB0aGlzIGhlcmUgYW5kIGluIGltYWdlXG4gICAgICAgIGlmICghbm9VSSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHRoaXMuc2F2ZUNvZGUpO1xuICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5vZmYoXCJzbGlkZWNoYW5nZVwiKTtcbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImRpc2FibGVcIik7XG4gICAgICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogNzAwLFxuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBTay5taXNjZXZhbC5hc3luY1RvUHJvbWlzZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNrLmltcG9ydE1haW5XaXRoQm9keShcIjxzdGRpbj5cIiwgZmFsc2UsIHByb2csIHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIW5vVUkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zbGlkZWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzbGlkZWNoYW5nZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZWl0LmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwiZW5hYmxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lcnJMYXN0UnVuID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmVycmluZm8gPSBcInN1Y2Nlc3NcIjtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoIW5vVUkpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5vbihcbiAgICAgICAgICAgICAgICAgICAgXCJzbGlkZWNoYW5nZVwiLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwiZW5hYmxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lcnJpbmZvID0gZXJyLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuYWxsVmlzdWFsaXplcnMgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICQuZWFjaCh3aW5kb3cuYWxsVmlzdWFsaXplcnMsIGZ1bmN0aW9uIChpLCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucmVkcmF3Q29ubmVjdG9ycygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzYWJsZUludGVyYWN0aW9uKCkge1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5oaWRlKCk7XG4gICAgICAgICQodGhpcy5jb2RlRGl2KS5hZGRDbGFzcyhcImFjLWRpc2FibGVkXCIpO1xuICAgIH1cbn1cblxudmFyIGxhbmd1YWdlRXh0ZW5zaW9ucyA9IHtcbiAgICBweXRob246IFwicHlcIixcbiAgICBodG1sOiBcImh0bWxcIixcbiAgICBqYXZhc2NyaXB0OiBcImpzXCIsXG4gICAgamF2YTogXCJqYXZhXCIsXG4gICAgcHl0aG9uMjogXCJweVwiLFxuICAgIHB5dGhvbjM6IFwicHlcIixcbiAgICBjcHA6IFwiY3BwXCIsXG4gICAgYzogXCJjXCIsXG4gICAgc3FsOiBcInNxbFwiLFxuICAgIG9jdGF2ZTogXCJtXCIsXG59O1xuXG52YXIgZXJyb3JUZXh0ID0ge307XG5cbmVycm9yVGV4dC5QYXJzZUVycm9yID0gJC5pMThuKFwibXNnX3NjdGl2ZWNvZGVfcGFyc2VfZXJyb3JcIik7XG5lcnJvclRleHQuUGFyc2VFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5UeXBlRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlR5cGVFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0Lk5hbWVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3JcIik7XG5lcnJvclRleHQuTmFtZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuVmFsdWVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlZhbHVlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuQXR0cmlidXRlRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3JcIik7XG5lcnJvclRleHQuQXR0cmlidXRlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlRva2VuRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvclwiKTtcbmVycm9yVGV4dC5Ub2tlbkVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdG9rZW5fZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlRpbWVMaW1pdEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvclwiKTtcbmVycm9yVGV4dC5UaW1lTGltaXRFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvclwiKTtcbmVycm9yVGV4dC5FcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlN5bnRheEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yXCIpO1xuZXJyb3JUZXh0LlN5bnRheEVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5JbmRleEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3JcIik7XG5lcnJvclRleHQuSW5kZXhFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5VUklFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvclwiKTtcbmVycm9yVGV4dC5VUklFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuSW1wb3J0RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3JcIik7XG5lcnJvclRleHQuSW1wb3J0RXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlJlZmVyZW5jZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlJlZmVyZW5jZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5aZXJvRGl2aXNpb25FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3JcIik7XG5lcnJvclRleHQuWmVyb0RpdmlzaW9uRXJyb3JGaXggPSAkLmkxOG4oXG4gICAgXCJtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yX2ZpeFwiXG4pO1xuZXJyb3JUZXh0LlJhbmdlRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvclwiKTtcbmVycm9yVGV4dC5SYW5nZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkludGVybmFsRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvclwiKTtcbmVycm9yVGV4dC5JbnRlcm5hbEVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkluZGVudGF0aW9uRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvclwiKTtcbmVycm9yVGV4dC5JbmRlbnRhdGlvbkVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0Lk5vdEltcGxlbWVudGVkRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3JcIik7XG5lcnJvclRleHQuTm90SW1wbGVtZW50ZWRFcnJvckZpeCA9ICQuaTE4bihcbiAgICBcIm1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcl9maXhcIlxuKTtcbmVycm9yVGV4dC5LZXlFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2tleV9lcnJvclwiKTtcbmVycm9yVGV4dC5LZXlFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuQXNzZXJ0aW9uRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3JcIik7XG5lcnJvclRleHQuQXNzZXJ0aW9uRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3JfZml4XCIpO1xuXG5TdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGwgPSBmdW5jdGlvbiAodGFyZ2V0LCByZXBsYWNlbWVudCkge1xuICAgIHJldHVybiB0aGlzLnNwbGl0KHRhcmdldCkuam9pbihyZXBsYWNlbWVudCk7XG59O1xuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnJ5dGhvbkFjdGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICBvcHRzLmFsaWduVmVydGljYWwgPSB0cnVlO1xuICAgICAgICB0aGlzLnB5dGhvbjNfaW50ZXJwcmV0ZXIgPSAkKG9yaWcpLmRhdGEoXCJweXRob24zX2ludGVycHJldGVyXCIpO1xuICAgICAgICB0aGlzLm91dHB1dF9oZWlnaHQgPSAkKG9yaWcpLmRhdGEoXCJvdXRwdXRfaGVpZ2h0XCIpO1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KFwiUmVuZGVyXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmNvZGUpO1xuICAgIH1cblxuICAgIGFzeW5jIHJ1blByb2coKSB7XG4gICAgICAgIHZhciBwcm9nID0gYXdhaXQgdGhpcy5idWlsZFByb2codHJ1ZSk7XG4gICAgICAgIGxldCBzYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICBpZiAoIXRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgICAgJCh0aGlzLmNvZGVEaXYpLnN3aXRjaENsYXNzKFwiY29sLW1kLTEyXCIsIFwiY29sLW1kLTZcIiwge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dERpdikuc2hvdyh7IGR1cmF0aW9uOiA3MDAsIHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgcHJvZyA9IGBcbiAgICAgICAgPGh0bWw+XG4gICAgICAgIDxoZWFkPlxuICAgICAgICAgICAgPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9icnl0aG9uQDMuOS41L2JyeXRob24ubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgICAgICAgICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2JyeXRob25AMy45LjUvYnJ5dGhvbl9zdGRsaWIubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2hpZ2hsaWdodC5qcy8xMS4wLjEvc3R5bGVzL2RlZmF1bHQubWluLmNzc1wiPlxuICAgICAgICAgICAgPHNjcmlwdCBzcmM9XCIvL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9oaWdobGlnaHQuanMvMTEuMC4xL2hpZ2hsaWdodC5taW4uanNcIj48L3NjcmlwdD5cbiAgICAgICAgICAgIDxzdHlsZT5cbiAgICAgICAgICAgICAgICBodG1sLCBib2R5e1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IG1heC1jb250ZW50OyB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLmNvbnRhaW5lci1wcmV7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOyBmb250LXNpemU6IDEzcHg7IGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQzOyBib3JkZXI6IDFweCBzb2xpZCAjY2NjOyBib3JkZXItcmFkaXVzOiA0cHg7IHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkOyBib3R0b206IDBweDsgd2lkdGg6IDk0JTsgbWF4LXdpZHRoOiA5NiU7IG1heC1oZWlnaHQ6IDIwMHB4OyBvdmVyZmxvdzogYXV0bzsgY2xlYXI6IGJvdGg7IHJlc2l6ZTogYm90aDsgdHJhbnNmb3JtOiBzY2FsZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBzdGlja3k7IHBhZGRpbmc6IDEycHg7IHRyYW5zZm9ybTogc2NhbGUoMSwgLTEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2Rle1xuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOyBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9zdHlsZT5cbiAgICAgICAgPC9oZWFkPlxuICAgICAgICA8Ym9keSBvbmxvYWQ9J2JyeXRob24oKSc+XG4gICAgICAgICAgICA8c2NyaXB0IHR5cGU9J3RleHQvcHl0aG9uJz5cbmltcG9ydCBzeXNcbmZyb20gYnJvd3NlciBpbXBvcnQgZG9jdW1lbnQsIGh0bWxcbmltcG9ydCB0cmFjZWJhY2tcbnByZUVsZW0gPSBodG1sLlBSRSgpXG5sb2dnZXIgPSBodG1sLkNPREUoKVxuY29udGFpbmVyID0gaHRtbC5ESVYoKVxuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjb250YWluZXItcHJlXCIpXG5wcmVFbGVtIDw9IGxvZ2dlclxuY29udGFpbmVyIDw9IHByZUVsZW1cbmNsYXNzIE5ld091dDpcbiAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6XG4gICAgICAgIGxvZ2dlci5pbm5lckhUTUwgKz0gc3RyKGRhdGEpXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCJcbnN5cy5zdGRlcnIgPSBzeXMuc3Rkb3V0ID0gTmV3T3V0KClcbmRlZiBteV9leGVjKGNvZGUpOlxuICAgIHRyeTpcbiAgICAgICAgZXhlYyhjb2RlLCBsb2NhbHMoKSlcbiAgICAgICAgb3V0X2hlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0XCIpXG4gICAgICAgIG91dF9oZWFkZXIuaW5uZXJIVE1MID0gXCJPdXRwdXRcIlxuICAgICAgICBvdXRfaGVhZGVyLnN0eWxlLmZvbnQgPSBcIjI0cHggJ0FyaWFsJ1wiXG4gICAgICAgIGxvZ2dlci5jbGFzc0xpc3QuYWRkKFwicGxhaW50ZXh0XCIpXG4gICAgICAgIHByZUVsZW0ucHJlcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpXG4gICAgICAgIHByZUVsZW0ucHJlcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpXG4gICAgICAgIHByZUVsZW0ucHJlcGVuZChvdXRfaGVhZGVyKVxuICAgICAgICBkb2N1bWVudCA8PSBjb250YWluZXJcbiAgICBleGNlcHQgU3ludGF4RXJyb3IgYXMgZXJyOlxuICAgICAgICBlcnJvcl9jbGFzcyA9IGVyci5fX2NsYXNzX18uX19uYW1lX19cbiAgICAgICAgZGV0YWlsID0gZXJyLmFyZ3NbMF1cbiAgICAgICAgbGluZV9udW1iZXIgPSBmXCJhdCBsaW5lIHtlcnIubGluZW5vfVwiXG4gICAgZXhjZXB0IEJhc2VFeGNlcHRpb24gYXMgZXJyOlxuICAgICAgICBlcnJvcl9jbGFzcyA9IGVyci5fX2NsYXNzX18uX19uYW1lX19cbiAgICAgICAgZGV0YWlsID0gZXJyLmFyZ3NbMF1cbiAgICAgICAgY2wsIGV4YywgdGIgPSBzeXMuZXhjX2luZm8oKVxuICAgICAgICAjIFdoZW4gZXJyb3JzIGRvbid0IHNwZWNpZnkgYSBsaW5lXG4gICAgICAgIHRyeTpcbiAgICAgICAgICAgIGxpbmVfbnVtYmVyID0gZlwiYXQgbGluZSB7dHJhY2ViYWNrLmV4dHJhY3RfdGIodGIpWy0xXVsxXX1cIlxuICAgICAgICBleGNlcHQ6XG4gICAgICAgICAgICBsaW5lX251bWJlciA9IFwiXCJcbiAgICBlbHNlOlxuICAgICAgICByZXR1cm5cbiAgICBcbiAgICAjIFRoaXMgaXMgb25seSBkb25lIGlmIGFuIEV4Y2VwdGlvbiB3YXMgY2F0Y2hlZFxuICAgIHJlc3VsdCA9IGZcIid7ZXJyb3JfY2xhc3N9Jzoge2RldGFpbH0ge2xpbmVfbnVtYmVyfVwiXG4gICAgcHJpbnQocmVzdWx0KVxuICAgICMgU3R5bGluZyB0aGUgcHJlIGVsZW1lbnQgZm9yIGVycm9yXG4gICAgZXJyb3JfaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImgzXCIpXG4gICAgZXJyb3JfaGVhZGVyLmlubmVySFRNTCA9IFwiRXJyb3JcIlxuICAgIGVycm9yX2hlYWRlci5zdHlsZS5mb250ID0gXCIyNHB4ICdBcmlhbCdcIlxuICAgIHByZUVsZW0ucHJlcGVuZChlcnJvcl9oZWFkZXIpXG4gICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiI2YyZGVkZVwiXG4gICAgY29udGFpbmVyLnN0eWxlLmJvcmRlciA9IFwiMXB4IHNvbGlkICNlYmNjZDFcIlxuICAgIGxvZ2dlci5jbGFzc0xpc3QuYWRkKFwicGxhaW50ZXh0XCIpXG4gICAgZG9jdW1lbnQgPD0gY29udGFpbmVyXG5teV9wcm9nID0gJHtKU09OLnN0cmluZ2lmeShwcm9nKX1cbm15X2V4ZWMobXlfcHJvZylcbmRvY3VtZW50IDw9IGh0bWwuU0NSSVBUKFwiaGxqcy5oaWdobGlnaHRBbGwoKTtcIilcbmRvY3VtZW50IDw9IGh0bWwuU0NSSVBUKFwibGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250YWluZXItcHJlJyk7IGxldCBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0OyBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBTdHJpbmcoaGVpZ2h0KSsncHgnO1wiKVxuICAgICAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgIDwvYm9keT5cbiAgICAgICAgPC9odG1sPlxuICAgICAgICBgO1xuICAgICAgICB0aGlzLm91dHB1dC5zcmNkb2MgPSBwcm9nO1xuICAgIH1cblxuICAgIGNyZWF0ZU91dHB1dCgpIHtcbiAgICAgICAgdGhpcy5hbGlnblZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgdmFyIG91dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImFjX291dHB1dFwiKTtcbiAgICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiY29sLW1kLTVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vdXRwdXRfaGVpZ2h0ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRfaGVpZ2h0ID0gXCI0MDBweFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vdXREaXYgPSBvdXREaXY7XG4gICAgICAgIHRoaXMub3V0cHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBcIndoaXRlXCIpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpO1xuICAgICAgICAvLyAkKHRoaXMub3V0cHV0KS5jc3MoXCJoZWlnaHRcIiwgJCh0aGlzLm91dHB1dF9oZWlnaHQpKTtcbiAgICAgICAgdGhpcy5vdXRwdXQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5vdXRwdXRfaGVpZ2h0O1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ3aWR0aFwiLCBcIjEwMCVcIik7XG4gICAgICAgIG91dERpdi5hcHBlbmRDaGlsZCh0aGlzLm91dHB1dCk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQob3V0RGl2KTtcbiAgICAgICAgdmFyIGNsZWFyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjbGVhckRpdikuY3NzKFwiY2xlYXJcIiwgXCJib3RoXCIpOyAvLyBuZWVkZWQgdG8gbWFrZSBwYXJlbnQgZGl2IHJlc2l6ZSBwcm9wZXJseVxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNsZWFyRGl2KTtcbiAgICB9XG4gICAgZW5hYmxlU2F2ZUxvYWQoKSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmVuZGVyXCIpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIVE1MQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIG9wdHMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHRoaXMuY29kZSA9ICQoXCI8dGV4dGFyZWEgLz5cIikuaHRtbCh0aGlzLm9yaWdFbGVtLmlubmVySFRNTCkudGV4dCgpO1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KFwiUmVuZGVyXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmNvZGUpO1xuICAgIH1cblxuICAgIGFzeW5jIHJ1blByb2coKSB7XG4gICAgICAgIHZhciBwcm9nID0gYXdhaXQgdGhpcy5idWlsZFByb2codHJ1ZSk7XG4gICAgICAgIGxldCBzYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICBpZiAoIXRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgICAgJCh0aGlzLmNvZGVEaXYpLnN3aXRjaENsYXNzKFwiY29sLW1kLTEyXCIsIFwiY29sLW1kLTZcIiwge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dERpdikuc2hvdyh7IGR1cmF0aW9uOiA3MDAsIHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgcHJvZyA9XG4gICAgICAgICAgICBcIjxzY3JpcHQgdHlwZT10ZXh0L2phdmFzY3JpcHQ+d2luZG93Lm9uZXJyb3IgPSBmdW5jdGlvbihtc2csdXJsLGxpbmUpIHthbGVydChtc2crJyBvbiBsaW5lOiAnK2xpbmUpO307PC9zY3JpcHQ+XCIgK1xuICAgICAgICAgICAgcHJvZztcbiAgICAgICAgdGhpcy5vdXRwdXQuc3JjZG9jID0gcHJvZztcbiAgICB9XG5cbiAgICBjcmVhdGVPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHZhciBvdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJhY19vdXRwdXRcIik7XG4gICAgICAgIGlmICh0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC01XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0RGl2ID0gb3V0RGl2O1xuICAgICAgICB0aGlzLm91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJ3aGl0ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwiaGVpZ2h0XCIsIFwiNDAwcHhcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcIndpZHRoXCIsIFwiMTAwJVwiKTtcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMub3V0cHV0KTtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChvdXREaXYpO1xuICAgICAgICB2YXIgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgIH1cbiAgICBlbmFibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZW5kZXJcIikpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpTQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgfVxuICAgIG91dHB1dGZ1bihhKSB7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xuICAgICAgICB2YXIgc3RyID0gXCJbXCI7XG4gICAgICAgIGlmICh0eXBlb2YgYSA9PSBcIm9iamVjdFwiICYmIGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhW2ldID09IFwib2JqZWN0XCIgJiYgYVtpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IChpID09IDAgPyBcIlwiIDogXCIgXCIpICsgXCJbXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYVtpXS5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbaV1bal0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqID09IGFbaV0ubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiXVwiICsgKGkgPT0gYS5sZW5ndGggLSAxID8gXCJdXCIgOiBcIixcIikgKyBcIlxcblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCIsIFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Ugc3RyICs9IGFbaV0gKyAoaSA9PSBhLmxlbmd0aCAtIDEgPyBcIl1cIiA6IFwiLCBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0ciA9IEpTT04uc3RyaW5naWZ5KGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHN0ciA9IGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgdmFyIHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHZhciB3cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIF90aGlzLm91dHB1dC5pbm5lckhUTUwgKz0gX3RoaXMub3V0cHV0ZnVuKHN0cik7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB3cml0ZWxuID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgaWYgKCFzdHIpIHN0ciA9IFwiXCI7XG4gICAgICAgICAgICBfdGhpcy5vdXRwdXQuaW5uZXJIVE1MICs9IF90aGlzLm91dHB1dGZ1bihzdHIpICsgXCI8YnIgLz5cIjtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcbiAgICAgICAgJCh0aGlzLmVDb250YWluZXIpLnJlbW92ZSgpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXZhbChwcm9nKTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IFwic3VjY2Vzc1wiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yTWVzc2FnZShlKTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRFcnJvck1lc3NhZ2UoZXJyKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgZXJyb3IgbWVzc2FnZVxuICAgICAgICB0aGlzLmVyckxhc3RSdW4gPSB0cnVlO1xuICAgICAgICB2YXIgZXJySGVhZCA9ICQoXCI8aDM+XCIpLmh0bWwoXCJFcnJvclwiKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZXJyb3IgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5pZCA9IHRoaXMuZGl2aWQgKyBcIl9lcnJpbmZvXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChlcnJIZWFkWzBdKTtcbiAgICAgICAgdmFyIGVyclRleHQgPSB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpXG4gICAgICAgICk7XG4gICAgICAgIHZhciBlcnJTdHJpbmcgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPSBlcnJTdHJpbmc7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUnVudGltZSBFcnJvcjogXCIgKyBlcnIudG9TdHJpbmcoKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcbmltcG9ydCBIYW5kc29udGFibGUgZnJvbSBcImhhbmRzb250YWJsZVwiO1xuaW1wb3J0ICdoYW5kc29udGFibGUvZGlzdC9oYW5kc29udGFibGUuZnVsbC5jc3MnO1xuaW1wb3J0IGluaXRTcWxKcyBmcm9tIFwic3FsLmpzL2Rpc3Qvc3FsLXdhc20uanNcIjtcblxudmFyIGFsbERidXJscyA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTUUxBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgLy8gIGZucHJlZml4IHNldHMgdGhlIHBhdGggdG8gbG9hZCB0aGUgc3FsLXdhc20ud2FzbSBmaWxlXG4gICAgICAgIHZhciBib29rcHJlZml4O1xuICAgICAgICB2YXIgZm5wcmVmaXg7XG4gICAgICAgIGlmIChlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcykge1xuICAgICAgICAgICAgYm9va3ByZWZpeCA9IGAke2VCb29rQ29uZmlnLmFwcH0vYm9va3MvcHVibGlzaGVkLyR7ZUJvb2tDb25maWcuYmFzZWNvdXJzZX1gO1xuICAgICAgICAgICAgZm5wcmVmaXggPSBib29rcHJlZml4ICsgXCIvX3N0YXRpY1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYm9va3ByZWZpeCA9IFwiXCI7XG4gICAgICAgICAgICBmbnByZWZpeCA9IFwiL19zdGF0aWNcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIGxvY2F0ZUZpbGU6IChmaWxlbmFtZSkgPT4gYCR7Zm5wcmVmaXh9LyR7ZmlsZW5hbWV9YCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zaG93TGFzdCA9ICQodGhpcy5vcmlnRWxlbSkuZGF0YShcInNob3dsYXN0c3FsXCIpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGluaXRTcWxKcyh0aGlzLmNvbmZpZykudGhlbihmdW5jdGlvbiAoU1FMKSB7XG4gICAgICAgICAgICAvLyBzZXQgdXAgY2FsbCB0byBsb2FkIGRhdGFiYXNlIGFzeW5jaHJvbm91c2x5IGlmIGdpdmVuXG4gICAgICAgICAgICBpZiAoc2VsZi5kYnVybCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLmRidXJsLnN0YXJ0c1dpdGgoXCIvX3N0YXRpY1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmRidXJsID0gYCR7Ym9va3ByZWZpeH0ke3NlbGYuZGJ1cmx9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgbGV0IGJ1dHRvblRleHQgPSAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9sb2FkX2RiXCIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIShzZWxmLmRidXJsIGluIGFsbERidXJscykpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImxvYWRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHhXYWl0Rm9yOiBqUXVlcnkuRGVmZXJyZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnN0YXR1cyA9PSBcImxvYWRpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnhXYWl0Rm9yLmRvbmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0uZGJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYiA9IG5ldyBTUUwuRGF0YWJhc2UoYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLmRiKTtcbiAgICAgICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL2xlcm9jaGEvY2hpbm9vay1kYXRhYmFzZS9yYXcvbWFzdGVyL0NoaW5vb2tEYXRhYmFzZS9EYXRhU291cmNlcy9DaGlub29rX1NxbGl0ZS5zcWxpdGVcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBzZWxmLmRidXJsLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdUludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKHVJbnQ4QXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5kYiA9IHVJbnQ4QXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5zdGF0dXMgPSBcInJlYWR5XCI7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS54V2FpdEZvci5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRzIGlzIG5vdyBbe2NvbHVtbnM6Wydjb2wxJywnY29sMicsLi4uXSwgdmFsdWVzOltbZmlyc3Qgcm93XSwgW3NlY29uZCByb3ddLCAuLi5dfV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBydW5Qcm9nKG5vVUksIGxvZ1Jlc3VsdHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2dSZXN1bHRzID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gbG9nUmVzdWx0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5vVUkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBub1VJID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgYW55IG9sZCByZXN1bHRzXG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgbGV0IGRpdmlkID0gdGhpcy5kaXZpZCArIFwiX3NxbF9vdXRcIjtcbiAgICAgICAgbGV0IHJlc3BEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZpZCk7XG4gICAgICAgIGlmIChyZXNwRGl2KSB7XG4gICAgICAgICAgICByZXNwRGl2LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQocmVzcERpdik7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcIlwiKTtcbiAgICAgICAgLy8gUnVuIHRoaXMgcXVlcnlcbiAgICAgICAgbGV0IHF1ZXJ5ID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpOyAvLyBmYWxzZSAtLT4gRG8gbm90IGluY2x1ZGUgc3VmZml4XG4gICAgICAgIGlmICghdGhpcy5kYikge1xuICAgICAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcbiAgICAgICAgICAgICAgICBgRXJyb3I6IERhdGFiYXNlIG5vdCBpbml0aWFsaXplZCEgREJVUkw6ICR7dGhpcy5kYnVybH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGl0ID0gdGhpcy5kYi5pdGVyYXRlU3RhdGVtZW50cyhxdWVyeSk7XG4gICAgICAgIHRoaXMucmVzdWx0cyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIGl0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbHVtbnMgPSBzdGF0ZW1lbnQuZ2V0Q29sdW1uTmFtZXMoKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRhdGEhIHByb2JhYmx5IGEgU0VMRUNUXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGF0ZW1lbnQuc3RlcCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goc3RhdGVtZW50LmdldCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd2NvdW50OiBkYXRhLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5zcWwgPSBzdGF0ZW1lbnQuZ2V0Tm9ybWFsaXplZFNRTCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJlZml4ID0gbnNxbC5zdWJzdHIoMCwgNikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LnN0ZXAoKTsgLy8gZXhlY3V0ZSB0aGUgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVjdCBJTlNFUlQvVVBEQVRFL0RFTEVURSB0byBnaXZlIGZyaWVuZGx5IGZlZWRiYWNrXG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIHJvd3MgbW9kaWZpZWQgLSB1bmZvcnR1bmF0ZWx5LCB0aGlzIHdvbid0IGNhdGNoIHN1Y2ggcXVlcmllc1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IHVzZSBDVEVzLiAgVGhlcmUgc2VlbXMgdG8gYmUgbm8gcmVsaWFibGUgd2F5IG9mIGtub3dpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhIFNRTGl0ZSBxdWVyeSBhY3R1YWxseSBtb2RpZmllZCBkYXRhLlxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPT09IFwiaW5zZXJ0XCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9PT0gXCJ1cGRhdGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID09PSBcImRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBwcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Y291bnQ6IHRoaXMuZGIuZ2V0Um93c01vZGlmaWVkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHsgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHN0YXR1czogXCJmYWlsdXJlXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHNxbDogaXQuZ2V0UmVtYWluaW5nU1FMKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcImZhaWx1cmVcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIk5vIHF1ZXJpZXMgc3VibWl0dGVkLlwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHRoaXMuc2F2ZUNvZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVpdCkge1xuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9uKFxuICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImVuYWJsZVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byB1cGRhdGUgc2NydWJiZXIgJHtlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHJlc3BEaXYuaWQgPSBkaXZpZDtcbiAgICAgICAgdGhpcy5vdXREaXYuYXBwZW5kQ2hpbGQocmVzcERpdik7XG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coKTtcbiAgICAgICAgLy8gU29tZXRpbWVzIHdlIGRvbid0IHdhbnQgdG8gc2hvdyBhIGJ1bmNoIG9mIGludGVybWVkaWF0ZSByZXN1bHRzXG4gICAgICAgIC8vIGxpa2Ugd2hlbiB3ZSBhcmUgaW5jbHVkaW5nIGEgYnVuY2ggb2YgcHJldmlvdXMgc3RhdGVtZW50cyBmcm9tXG4gICAgICAgIC8vIG90aGVyIGFjdGl2ZWNvZGVzIEluIHRoYXQgY2FzZSB0aGUgc2hvd2xhc3RzcWwgZmxhZyBjYW4gYmUgc2V0XG4gICAgICAgIC8vIHNvIHdlIG9ubHkgc2hvdyB0aGUgbGFzdCByZXN1bHRcbiAgICAgICAgbGV0IHJlc3VsdEFycmF5ID0gdGhpcy5yZXN1bHRzO1xuICAgICAgICBpZiAodGhpcy5zaG93TGFzdCkge1xuICAgICAgICAgICAgcmVzdWx0QXJyYXkgPSB0aGlzLnJlc3VsdHMuc2xpY2UoLTEpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHIgb2YgcmVzdWx0QXJyYXkpIHtcbiAgICAgICAgICAgIGxldCBzZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHNlY3Rpb24uc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0XCIpO1xuICAgICAgICAgICAgcmVzcERpdi5hcHBlbmRDaGlsZChzZWN0aW9uKTtcbiAgICAgICAgICAgIGlmIChyLnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoci5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWJsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQodGFibGVEaXYpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF4SGVpZ2h0ID0gMzUwO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0QXJyYXkubGVuZ3RoID4gMSkgbWF4SGVpZ2h0ID0gMjAwOyAvLyBtYXggaGVpZ2h0IHNtYWxsZXIgaWYgbG90cyBvZiByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRhYmxlKHIsIHRhYmxlRGl2LCBtYXhIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBybXNnID0gci5yb3djb3VudCAhPT0gMSA/IFwiIHJvd3MgXCIgOiBcIiByb3cgXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2cgPSBcIlwiICsgci5yb3djb3VudCArIHJtc2cgKyBcInJldHVybmVkXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyLnJvd2NvdW50ID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBtc2cgKyBcIiAob25seSBmaXJzdCAxMDAgcm93cyBkaXNwbGF5ZWQpXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbXNnID0gbXNnICsgXCIuXCI7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnJvd2NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlQm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wID0gci5vcGVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIG9wID0gb3AgKyAob3AuY2hhckF0KG9wLmxlbmd0aCAtIDEpID09PSBcImVcIiA/IFwiZC5cIiA6IFwiZWQuXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm1zZyA9IHIucm93Y291bnQgIT09IDEgPyBcIiByb3dzIFwiIDogXCIgcm93IFwiO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnRleHRDb250ZW50ID0gXCJcIiArIHIucm93Y291bnQgKyBybXNnICsgb3A7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnRleHRDb250ZW50ID0gXCJPcGVyYXRpb24gc3VjY2VlZGVkLlwiO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiYWNfc3FsX3Jlc3VsdF9zdWNjZXNzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSByLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRfZmFpbHVyZVwiKTtcbiAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm93IGhhbmRsZSBhdXRvZ3JhZGluZ1xuICAgICAgICBpZiAodGhpcy5zdWZmaXgpIHtcbiAgICAgICAgICAgIHRoaXMudGVzdFJlc3VsdCA9IHRoaXMuYXV0b2dyYWRlKFxuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0c1t0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcImRvbmVcIik7XG4gICAgfVxuXG4gICAgbG9nQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgdGhpcy5sb2dSdW5FdmVudCh7XG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgbGFuZzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgICAgIGVycmluZm86IHRoaXMucmVzdWx0c1t0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMV0uc3RhdHVzLFxuICAgICAgICAgICAgdG9fc2F2ZTogdGhpcy5zYXZlQ29kZSxcbiAgICAgICAgICAgIHByZWZpeDogdGhpcy5wcmV0ZXh0LFxuICAgICAgICAgICAgc3VmZml4OiB0aGlzLnN1ZmZpeCxcbiAgICAgICAgICAgIHBhcnRuZXI6IHRoaXMucGFydG5lcixcbiAgICAgICAgfSk7IC8vIExvZyB0aGUgcnVuIGV2ZW50XG5cbiAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwidW5pdHRlc3RcIixcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgY291cnNlOiBlQm9va0NvbmZpZy5jb3Vyc2UsXG4gICAgICAgICAgICAgICAgYWN0OiB0aGlzLnVuaXRfcmVzdWx0cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQodGhpcy50ZXN0UmVzdWx0KTtcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXV0b2dyYWRlKHJlc3VsdF90YWJsZSkge1xuICAgICAgICB2YXIgdGVzdHMgPSB0aGlzLnN1ZmZpeC5zcGxpdCgvXFxuLyk7XG4gICAgICAgIHRoaXMucGFzc2VkID0gMDtcbiAgICAgICAgdGhpcy5mYWlsZWQgPSAwO1xuICAgICAgICAvLyBUZXN0cyBzaG91bGQgYmUgb2YgdGhlIGZvcm1cbiAgICAgICAgLy8gYXNzZXJ0IHJvdyxjb2wgb3BlciB2YWx1ZSBmb3IgZXhhbXBsZVxuICAgICAgICAvLyBhc3NlcnQgNCw0ID09IDNcbiAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIHRlc3RzID0gdGVzdHMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gcy5pbmRleE9mKFwiYXNzZXJ0XCIpID4gLTE7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCB0ZXN0IG9mIHRlc3RzKSB7XG4gICAgICAgICAgICBsZXQgd2xpc3QgPSB0ZXN0LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICB3bGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgbGV0IGxvYyA9IHdsaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgb3BlciA9IHdsaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSB3bGlzdC5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGxldCBbcm93LCBjb2xdID0gbG9jLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnRlc3RPbmVBc3NlcnQoXG4gICAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICAgIGNvbCxcbiAgICAgICAgICAgICAgICBvcGVyLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkLFxuICAgICAgICAgICAgICAgIHJlc3VsdF90YWJsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwY3QgPSAoMTAwICogdGhpcy5wYXNzZWQpIC8gKHRoaXMucGFzc2VkICsgdGhpcy5mYWlsZWQpO1xuICAgICAgICBwY3QgPSBwY3QudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogMiB9KTtcbiAgICAgICAgcmVzdWx0ICs9IGBZb3UgcGFzc2VkICR7dGhpcy5wYXNzZWR9IG91dCBvZiAke1xuICAgICAgICAgICAgdGhpcy5wYXNzZWQgKyB0aGlzLmZhaWxlZFxuICAgICAgICB9IHRlc3RzIGZvciAke3BjdH0lYDtcbiAgICAgICAgdGhpcy51bml0X3Jlc3VsdHMgPSBgcGVyY2VudDoke3BjdH06cGFzc2VkOiR7dGhpcy5wYXNzZWR9OmZhaWxlZDoke3RoaXMuZmFpbGVkfWA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRlc3RPbmVBc3NlcnQocm93LCBjb2wsIG9wZXIsIGV4cGVjdGVkLCByZXN1bHRfdGFibGUpIHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHJvdyBhbmQgY29sIGFyZSBpbiBib3VuZHNcbiAgICAgICAgbGV0IGFjdHVhbDtcbiAgICAgICAgbGV0IG91dHB1dCA9IFwiXCI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhY3R1YWwgPSByZXN1bHRfdGFibGUudmFsdWVzW3Jvd11bY29sXTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgb3V0cHV0ID0gYEZhaWxlZCBOb3QgZW5vdWdoIGRhdGEgdG8gY2hlY2sgcm93ICR7cm93fSBvciBjb2x1bW4gJHtjb2x9YDtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlcmF0b3JzID0ge1xuICAgICAgICAgICAgXCI9PVwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID09IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiIT1cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSAhPSBvcGVyYW5kMjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIj5cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSA+IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiPFwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID4gb3BlcmFuZDI7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmVzID0gb3BlcmF0b3JzW29wZXJdKGFjdHVhbCwgZXhwZWN0ZWQpO1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgUGFzczogJHthY3R1YWx9ICR7b3Blcn0gJHtleHBlY3RlZH0gaW4gcm93ICR7cm93fSBjb2x1bW4gJHtyZXN1bHRfdGFibGUuY29sdW1uc1tjb2xdfWA7XG4gICAgICAgICAgICB0aGlzLnBhc3NlZCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0ID0gYEZhaWxlZCAke2FjdHVhbH0gJHtvcGVyfSAke2V4cGVjdGVkfSBpbiByb3cgJHtyb3d9IGNvbHVtbiAke3Jlc3VsdF90YWJsZS5jb2x1bW5zW2NvbF19YDtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhYmxlKHRhYmxlRGF0YSwgY29udGFpbmVyLCBtYXhIZWlnaHQpIHtcbiAgICBsZXQgZGF0YSA9IHRhYmxlRGF0YS52YWx1ZXM7XG4gICAgbGV0IHRyaW1Sb3dzID0gdW5kZWZpbmVkO1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBrbHVkZ2U6IG5vIGNvbHVtbiBoZWFkZXJzIHdpbGwgc2hvdyB1cCB1bmxlc3Mgd2UgZG8gdGhpc1xuICAgICAgICBkYXRhID0gW3RhYmxlRGF0YS5jb2x1bW5zLm1hcCgoZSkgPT4gbnVsbCldO1xuICAgICAgICB0cmltUm93cyA9IFswXTtcbiAgICB9XG5cbiAgICB2YXIgaG90ID0gbmV3IEhhbmRzb250YWJsZShjb250YWluZXIsIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgdHJpbVJvd3M6IHRyaW1Sb3dzLFxuICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgIGhlaWdodDogbWF4SGVpZ2h0LFxuICAgICAgICBhdXRvUm93U2l6ZTogdHJ1ZSxcbiAgICAgICAgYXV0b0NvbHVtblNpemU6IHsgdXNlSGVhZGVyczogdHJ1ZSB9LFxuICAgICAgICByb3dIZWFkZXJzOiBmYWxzZSxcbiAgICAgICAgY29sSGVhZGVyczogdGFibGVEYXRhLmNvbHVtbnMsXG4gICAgICAgIGVkaXRvcjogZmFsc2UsXG4gICAgICAgIG1heFJvd3M6IDEwMCxcbiAgICAgICAgZmlsdGVyczogZmFsc2UsXG4gICAgICAgIGRyb3Bkb3duTWVudTogZmFsc2UsXG4gICAgICAgIGxpY2Vuc2VLZXk6IFwibm9uLWNvbW1lcmNpYWwtYW5kLWV2YWx1YXRpb25cIixcbiAgICB9KTtcblxuICAgIC8vIGNhbGN1bGF0ZSBhY3R1YWwgaGVpZ2h0IGFuZCByZXNpemVcbiAgICBsZXQgYWN0dWFsSGVpZ2h0ID0gNDA7IC8vIGhlYWRlciBoZWlnaHQgKyBzbWFsbCBtYXJnaW5cbiAgICBpZiAodGFibGVEYXRhLnZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYWN0dWFsSGVpZ2h0ID0gYWN0dWFsSGVpZ2h0ICsgaG90LmdldFJvd0hlaWdodChpKTtcbiAgICAgICAgICAgIGlmIChhY3R1YWxIZWlnaHQgPiBtYXhIZWlnaHQpIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG90LnVwZGF0ZVNldHRpbmdzKHsgaGVpZ2h0OiBhY3R1YWxIZWlnaHQgfSk7XG5cbiAgICByZXR1cm4gaG90O1xufVxuIiwiaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XG5cbi8vIGZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIGF1ZGlvIHRvdXJzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdWRpb1RvdXIgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihkaXZpZCwgY29kZSwgYm51bSwgYXVkaW9fdGV4dCkge1xuICAgICAgICAvLyBCdWcgRml4OiBJZiBhIGNsYXNzIGV4dGVuZHMgYW5vdGhlciBjbGFzcywgdGhpcyBpcyB1bmRlZmluZWQgVU5USUwgc3VwZXIgaXMgY2FsbGVkXG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYXVkaW9fdG91ciA9IG51bGw7XG4gICAgICAgIHRoaXMuYXVkaW9fY29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMud2luZG93Y29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBudWxsO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy50b3VyQnV0dG9ucyA9IFtdO1xuICAgICAgICB0aGlzLmVsZW0gPSBudWxsOyAvLyBjdXJyZW50IGF1ZGlvIGVsZW1lbnQgcGxheWluZ1xuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IG51bGw7IC8vIGN1cnJlbnQgaW5kZXhcbiAgICAgICAgdGhpcy5sZW4gPSBudWxsOyAvLyBjdXJyZW50IGxlbmd0aCBvZiBhdWRpbyBmaWxlcyBmb3IgdG91clxuICAgICAgICB0aGlzLmJ1dHRvbkNvdW50ID0gbnVsbDsgLy8gbnVtYmVyIG9mIGF1ZGlvIHRvdXIgYnV0dG9uc1xuICAgICAgICB0aGlzLmFuYW1lID0gbnVsbDsgLy8gdGhlIGF1ZGlvIGZpbGUgbmFtZVxuICAgICAgICB0aGlzLmFoYXNoID0gbnVsbDsgLy8gaGFzaCBvZiB0aGUgYXVkaW8gZmlsZSBuYW1lIHRvIHRoZSBsaW5lcyB0byBoaWdobGlnaHRcbiAgICAgICAgdGhpcy50aGVEaXZpZCA9IG51bGw7IC8vIGRpdiBpZFxuICAgICAgICB0aGlzLmFmaWxlID0gbnVsbDsgLy8gZmlsZSBuYW1lIGZvciBhdWRpb1xuICAgICAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTsgLy8gZmxhZyB0byBzYXkgaWYgcGxheWluZyBvciBub3RcbiAgICAgICAgdGhpcy50b3VyTmFtZSA9IFwiXCI7XG4gICAgICAgIC8vIFJlcGxhY2luZyBoYXMgYmVlbiBkb25lIGhlcmUgdG8gbWFrZSBzdXJlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgY29kZSBhcmUgZGlzcGxheWVkIGNvcnJlY3RseVxuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKmRvdWJsZXEqXCIsICdcIicpO1xuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKnNpbmdsZXEqXCIsIFwiJ1wiKTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZUFsbChcIipvcGVuKlwiLCBcIihcIik7XG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2VBbGwoXCIqY2xvc2UqXCIsIFwiKVwiKTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZUFsbChcIipubGluZSpcIiwgXCI8YnIvPlwiKTtcbiAgICAgICAgdmFyIGNvZGVBcnJheSA9IGNvZGUuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIHZhciBhdWRpb19oYXNoID0gW107XG4gICAgICAgIHZhciBidmFsID0gW107XG4gICAgICAgIHZhciBhdHlwZSA9IGF1ZGlvX3RleHQucmVwbGFjZUFsbChcIipkb3VibGVxKlwiLCAnXCInKTtcbiAgICAgICAgdmFyIGF1ZGlvX3R5cGUgPSBhdHlwZS5zcGxpdChcIiphdHlwZSpcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXVkaW9fdHlwZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGF1ZGlvX2hhc2hbaV0gPSBhdWRpb190eXBlW2ldO1xuICAgICAgICAgICAgdmFyIGF3b3JkID0gYXVkaW9fdHlwZVtpXS5zcGxpdChcIjtcIik7XG4gICAgICAgICAgICBidmFsLnB1c2goYXdvcmRbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmaXJzdCA9XG4gICAgICAgICAgICBcIjxwcmU+PGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgXCJfbDEnPlwiICtcbiAgICAgICAgICAgIFwiMS4gICBcIiArXG4gICAgICAgICAgICBjb2RlQXJyYXlbMF0gK1xuICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgdmFyIG51bV9saW5lcyA9IGNvZGVBcnJheS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbnVtX2xpbmVzOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpIDwgOSkge1xuICAgICAgICAgICAgICAgIGZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgK1xuICAgICAgICAgICAgICAgICAgICBcIjxkaXYgaWQ9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgICAgICAgICBcIl9sXCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCInPlwiICtcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwiLiAgIFwiICtcbiAgICAgICAgICAgICAgICAgICAgY29kZUFycmF5W2ldICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDk5KSB7XG4gICAgICAgICAgICAgICAgZmlyc3QgPVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCArXG4gICAgICAgICAgICAgICAgICAgIFwiPGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgICAgICAgICBkaXZpZCArXG4gICAgICAgICAgICAgICAgICAgIFwiX2xcIiArXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICBcIic+XCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCIuICBcIiArXG4gICAgICAgICAgICAgICAgICAgIGNvZGVBcnJheVtpXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgK1xuICAgICAgICAgICAgICAgICAgICBcIjxkaXYgaWQ9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgICAgICAgICBcIl9sXCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCInPlwiICtcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwiLiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGNvZGVBcnJheVtpXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3QgPSBmaXJzdCArIFwiPC9wcmU+XCI7XG4gICAgICAgIC8vbGF5aW5nIG91dCB0aGUgSFRNTCBjb250ZW50XG4gICAgICAgIHZhciBiY291bnQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF1ZGlvX3R5cGUubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbmV3QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgICAgIG5ld0J1dHRvbi5jbGFzc05hbWUgPSBcImJ0biBidG4tc3VjY2Vzc1wiO1xuICAgICAgICAgICAgbmV3QnV0dG9uLmlubmVySFRNTCA9IGJ2YWxbaV0ucmVwbGFjZSgvXFxcIi9nLCBcIlwiKTtcbiAgICAgICAgICAgIHRoaXMudG91ckJ1dHRvbnMucHVzaChuZXdCdXR0b24pO1xuICAgICAgICAgICAgYmNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdWRpb190b3VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5hdWRpb190b3VyLmFsaWduID0gXCJjZW50ZXJcIjtcbiAgICAgICAgdGhpcy5hdWRpb19jb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgIHRoaXMud2luZG93Y29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMud2luZG93Y29kZS5hbGlnbiA9IFwibGVmdFwiO1xuICAgICAgICAkKHRoaXMud2luZG93Y29kZSkuaHRtbChmaXJzdCk7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5jbGFzc05hbWUgPVxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLWZhc3QtYmFja3dhcmRcIjtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tc3RlcC1iYWNrd2FyZFwiO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9IFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1wYXVzZVwiO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uY2xhc3NOYW1lID1cbiAgICAgICAgICAgIFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1zdGVwLWZvcndhcmRcIjtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tZmFzdC1mb3J3YXJkXCI7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0OiAyMnB4OyB3aWR0aDogMjVweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tcmlnaHQ6MnB4O1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0OiAyMnB4OyB3aWR0aDogMjVweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tcmlnaHQ6MnB4O1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubGFzdF9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBcImhlaWdodDogMjJweDsgd2lkdGg6IDI1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXJpZ2h0OjJweDtcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLm5hbWUgPSBcImZpcnN0X2F1ZGlvXCI7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby5uYW1lID0gXCJwcmV2X2F1ZGlvXCI7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8ubmFtZSA9IFwicGF1c2VfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLm5hbWUgPSBcIm5leHRfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLm5hbWUgPSBcImxhc3RfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby50aXRsZSA9IFwiUGxheSBmaXJzdCBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby50aXRsZSA9IFwiUGxheSBwcmV2aW91cyBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSBcIlBhdXNlIGN1cnJlbnQgYXVkaW9cIjtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnRpdGxlID0gXCJQbGF5IG5leHQgYXVkaW8gaW4gdG91clwiO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8udGl0bGUgPSBcIlBsYXkgbGFzdCBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIlBsYXkgZmlyc3QgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiLFxuICAgICAgICAgICAgXCJQbGF5IHByZXZpb3VzIGF1ZGlvIGluIHRvdXJcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQYXVzZSBhdWRpb1wiKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQbGF5IG5leHQgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQbGF5IGxhc3QgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuc3RhdHVzLmNsYXNzTmFtZSA9IFwiYWxlcnQgYWxlcnQtaW5mb1wiO1xuICAgICAgICB0aGlzLnN0YXR1cy5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImRpc3BsYXk6IG5vbmU7XCIpO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5zdG9wX2J1dHRvbi5jbGFzc05hbWUgPSBcImJ0biBidG4tZGVmYXVsdFwiO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uLmlubmVySFRNTCA9IFwiU3RvcCB0b3VyXCI7XG4gICAgICAgICQodGhpcy5hdWRpb190b3VyKS5hcHBlbmQoXG4gICAgICAgICAgICB0aGlzLmF1ZGlvX2NvZGUsXG4gICAgICAgICAgICB0aGlzLndpbmRvd2NvZGUsXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIiksXG4gICAgICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpbyxcbiAgICAgICAgICAgIHRoaXMubmV4dF9hdWRpbyxcbiAgICAgICAgICAgIHRoaXMubGFzdF9hdWRpbyxcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSxcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzLFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpLFxuICAgICAgICAgICAgdGhpcy50b3VyQnV0dG9ucyxcbiAgICAgICAgICAgIHRoaXMuc3RvcF9idXR0b25cbiAgICAgICAgKTtcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX2NvZGVfZGl2XCIpLmFwcGVuZCh0aGlzLmF1ZGlvX3RvdXIpO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuYWNfY29kZV9kaXZcIikuY3NzKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuQ29kZU1pcnJvci5jbS1zLWRlZmF1bHQudWktcmVzaXphYmxlXCIpLmhpZGUoKTtcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX29wdC5idG4uYnRuLWRlZmF1bHQ6bGFzdC1jaGlsZFwiKS5oaWRlKCk7XG4gICAgICAgICQodGhpcy5zdG9wX2J1dHRvbikuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW0ucGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgICAgICBhY3Q6IFwiY2xvc2VXaW5kb3dcIixcbiAgICAgICAgICAgICAgICAgICAgZGl2X2lkOiBkaXZpZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAkKHRoaXMuYXVkaW9fdG91cikucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAgICAgXCIjXCIgKyBkaXZpZCArIFwiIC5Db2RlTWlycm9yLmNtLXMtZGVmYXVsdC51aS1yZXNpemFibGVcIlxuICAgICAgICAgICAgICAgICkuc2hvdygpO1xuICAgICAgICAgICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19vcHQuYnRuLmJ0bi1kZWZhdWx0Omxhc3QtY2hpbGRcIikuc2hvdygpO1xuICAgICAgICAgICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19jb2RlX2RpdlwiKS5jc3MoXCJ3aWR0aFwiLCBcIlwiKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMF0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFswXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMV0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFsxXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMl0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFsyXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbM10pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFszXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbNF0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFs0XSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdEF1ZGlvKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjbGljayB0byBnbyB0byB0aGUgbmV4dCBhdWRpb1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2QXVkaW8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIHBhdXNlIG9yIHBsYXkgdGhlIGF1ZGlvXG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZUFuZFBsYXlBdWRpbyhkaXZpZCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjbGljayB0byBnbyB0byB0aGUgbmV4dCBhdWRpb1xuICAgICAgICAkKHRoaXMubmV4dF9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0QXVkaW8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RBdWRpbygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIC8vIG1ha2UgdGhlIGltYWdlIGJ1dHRvbnMgbG9vayBkaXNhYmxlZFxuICAgICAgICAkKHRoaXMuZmlyc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICB9XG4gICAgdG91cihkaXZpZCwgYXVkaW9fdHlwZSwgYmNvdW50KSB7XG4gICAgICAgIC8vIHNldCBnbG9iYWxzXG4gICAgICAgIHRoaXMuYnV0dG9uQ291bnQgPSBiY291bnQ7XG4gICAgICAgIHRoaXMudGhlRGl2aWQgPSBkaXZpZDtcbiAgICAgICAgdGhpcy5zdGF0dXMuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi10b3A6IDdweDsgbWFyZ2luLWJvdHRvbTogM3B4O1wiXG4gICAgICAgICk7XG4gICAgICAgIC8vIGVuYWJsZSBwcmV2LCBwYXVzZS9wbGF5IGFuZCBuZXh0IGJ1dHRvbnMgYW5kIG1ha2UgdmlzaWJsZVxuICAgICAgICAkKHRoaXMuZmlyc3RfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgLy8gZGlzYWJsZSB0b3VyIGJ1dHRvbnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiY291bnQ7IGkrKylcbiAgICAgICAgICAgICQodGhpcy50b3VyQnV0dG9uc1tpXSkuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgIHZhciBhdHlwZSA9IGF1ZGlvX3R5cGUuc3BsaXQoXCI7XCIpO1xuICAgICAgICB2YXIgbmFtZSA9IGF0eXBlWzBdLnJlcGxhY2VBbGwoJ1wiJywgXCIgXCIpO1xuICAgICAgICB0aGlzLnRvdXJOYW1lID0gbmFtZTtcbiAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zdGFydGluZ1wiLCBuYW1lKSk7XG4gICAgICAgIC8vbG9nIHRvdXIgdHlwZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7IGV2ZW50OiBcIkF1ZGlvXCIsIGFjdDogbmFtZSwgZGl2X2lkOiBkaXZpZCB9KTtcbiAgICAgICAgdmFyIG1heCA9IGF0eXBlLmxlbmd0aDtcbiAgICAgICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgICAgIHRoaXMuYWhhc2ggPSBbXTtcbiAgICAgICAgdGhpcy5hbmFtZSA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbWF4IC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGVtcCA9IGF0eXBlW2ldLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgIHZhciB0ZW1wX2xpbmUgPSB0ZW1wWzBdO1xuICAgICAgICAgICAgdmFyIHRlbXBfYW5hbWUgPSB0ZW1wWzFdO1xuICAgICAgICAgICAgdmFyIGFrZXkgPSB0ZW1wX2FuYW1lLnN1YnN0cmluZygxLCB0ZW1wX2FuYW1lLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgbG51bXMgPSB0ZW1wX2xpbmUuc3Vic3RyaW5nKDEsIHRlbXBfbGluZS5sZW5ndGgpO1xuICAgICAgICAgICAgLy9hbGVydChcImFrZXk6XCIrYWtleStcImxudW06XCIrbG51bXMpO1xuICAgICAgICAgICAgLy8gc3RyKz1cIjxhdWRpbyBpZD1cIitha2V5K1wiIHByZWxvYWQ9J2F1dG8nPjxzb3VyY2Ugc3JjPSdodHRwOi8vaWNlLXdlYi5jYy5nYXRlY2guZWR1L2NlMjEvYXVkaW8vXCIrXG4gICAgICAgICAgICAvLyBha2V5K1wiLm1wMycgdHlwZT0nYXVkaW8vbXBlZyc+PHNvdXJjZSBzcmM9J2h0dHA6Ly9pY2Utd2ViLmNjLmdhdGVjaC5lZHUvY2UyMS9hdWRpby9cIitha2V5K1xuICAgICAgICAgICAgLy8gXCIub2dnJyB0eXBlPSdhdWRpby9vZ2cnPllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhdWRpbyB0YWc8L2F1ZGlvPlwiO1xuICAgICAgICAgICAgLy92YXIgZGlyID1cbiAgICAgICAgICAgIC8vICAgIFwiaHR0cDovL21lZGlhLmludGVyYWN0aXZlcHl0aG9uLm9yZy9cIiArXG4gICAgICAgICAgICAvLyAgICBlQm9va0NvbmZpZy5iYXNlY291cnNlLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICAgICAgLy8gICAgXCIvYXVkaW8vXCI7XG4gICAgICAgICAgICB2YXIgZGlyID0gXCIuLi9fc3RhdGljL2F1ZGlvL1wiXG4gICAgICAgICAgICBzdHIgKz0gXCI8YXVkaW8gaWQ9XCIgKyBha2V5ICsgXCIgcHJlbG9hZD0nYXV0bycgPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLndhdicgdHlwZT0nYXVkaW8vd2F2Jz5cIjtcbiAgICAgICAgICAgIHN0ciArPSBcIjxzb3VyY2Ugc3JjPSdcIiArIGRpciArIGFrZXkgKyBcIi5tcDMnIHR5cGU9J2F1ZGlvL21wZWcnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLndhdicgdHlwZT0nYXVkaW8vd2F2Jz5cIjtcbiAgICAgICAgICAgIHN0ciArPSBcIjxzb3VyY2Ugc3JjPSdcIiArIGRpciArIGFrZXkgKyBcIi5tcDMnIHR5cGU9J2F1ZGlvL21wZWcnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPGJyIC8+WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGF1ZGlvIHRhZzwvYXVkaW8+XCI7XG4gICAgICAgICAgICB0aGlzLmFoYXNoW2FrZXldID0gbG51bXM7XG4gICAgICAgICAgICB0aGlzLmFuYW1lLnB1c2goYWtleSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLmF1ZGlvX2NvZGUpLmh0bWwoc3RyKTtcbiAgICAgICAgdGhpcy5sZW4gPSB0aGlzLmFuYW1lLmxlbmd0aDsgLy8gc2V0IHRoZSBudW1iZXIgb2YgYXVkaW8gZmlsZSBpbiB0aGUgdG91clxuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgfVxuICAgIGhhbmRsZVBsYXlpbmcoKSB7XG4gICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpO1xuICAgICAgICAvLyB1bmJpbmQgY3VycmVudCBlbmRlZFxuICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkudW5iaW5kKFwiZW5kZWRcIik7XG4gICAgICAgIC8vIHVuaGlnaGxpZ2h0IHRoZSBwcmV2IGxpbmVzXG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRMaW5lcyhcbiAgICAgICAgICAgIHRoaXMudGhlRGl2aWQsXG4gICAgICAgICAgICB0aGlzLmFoYXNoW3RoaXMuYW5hbWVbdGhpcy5jdXJySW5kZXhdXVxuICAgICAgICApO1xuICAgIH1cbiAgICBmaXJzdEF1ZGlvKCkge1xuICAgICAgICAvLyBpZiBhdWRpbyBpcyB0aGlzLnBsYXlpbmcgaGFuZGxlIGl0XG4gICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgIGFjdDogXCJmaXJzdFwiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gbW92ZSB0byB0aGUgZmlyc3QgYXVkaW9cbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSAwO1xuICAgICAgICAvLyBzdGFydCBhdCB0aGUgZmlyc3QgYXVkaW9cbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICB9XG4gICAgcHJldkF1ZGlvKCkge1xuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIGF1ZGlvXG4gICAgICAgIGlmICh0aGlzLmN1cnJJbmRleCA+IDApIHtcbiAgICAgICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgICAgICBhY3Q6IFwicHJldlwiLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbW92ZSB0byBwcmV2aW91cyB0byB0aGUgY3VycmVudCAoYnV0IHRoZSBjdXJyZW50IGluZGV4IGhhcyBtb3ZlZCB0byB0aGUgbmV4dClcbiAgICAgICAgICAgIHRoaXMuY3VyckluZGV4ID0gdGhpcy5jdXJySW5kZXggLSAxO1xuICAgICAgICAgICAgLy8gc3RhcnQgYXQgdGhlIHByZXYgYXVkaW9cbiAgICAgICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dEF1ZGlvKCkge1xuICAgICAgICAvLyBpZiBhdWRpbyBpcyB0aGlzLnBsYXlpbmcgaGFuZGxlIGl0XG4gICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgIGFjdDogXCJuZXh0XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMudGhlRGl2aWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpZiBub3QgYXQgdGhlIGVuZFxuICAgICAgICBpZiAodGhpcy5jdXJySW5kZXggPCB0aGlzLmxlbiAtIDEpIHtcbiAgICAgICAgICAgIC8vIHN0YXJ0IGF0IHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICAgICB0aGlzLmN1cnJJbmRleCA9IHRoaXMuY3VyckluZGV4ICsgMTtcbiAgICAgICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJySW5kZXggPT0gdGhpcy5sZW4gLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVRvdXJFbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsYXN0QXVkaW8oKSB7XG4gICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgdGhpcy5oYW5kbGVQbGF5aW5nKCk7XG4gICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgYWN0OiBcImxhc3RcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG1vdmUgdG8gdGhlIGxhc3QgYXVkaW9cbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSB0aGlzLmxlbiAtIDE7XG4gICAgICAgIC8vIHN0YXJ0IGF0IGxhc3RcbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICB9XG4gICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIGN1cnJlbnQgaW5kZXhcbiAgICBwbGF5Q3VyckluZGV4QXVkaW8oKSB7XG4gICAgICAgIC8vIHNldCB0aGlzLnBsYXlpbmcgdG8gZmFsc2VcbiAgICAgICAgdGhpcy5wbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIC8vIHBsYXkgdGhlIGN1cnJlbnQgYXVkaW8gYW5kIGhpZ2hsaWdodCB0aGUgbGluZXNcbiAgICAgICAgdGhpcy5wbGF5YXVkaW8odGhpcy5jdXJySW5kZXgsIHRoaXMuYW5hbWUsIHRoaXMudGhlRGl2aWQsIHRoaXMuYWhhc2gpO1xuICAgIH1cbiAgICAvLyBoYW5kbGUgdGhlIGVuZCBvZiB0aGUgdG91clxuICAgIGhhbmRsZVRvdXJFbmQoKSB7XG4gICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoXCJUaGUgXCIgKyB0aGlzLnRvdXJOYW1lICsgXCIgaGFzIGVuZGVkLlwiKTtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5jbGFzc05hbWUgPSBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tcGF1c2VcIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby50aXRsZSA9IFwiUGF1c2UgYXVkaW9cIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiUGF1c2UgYXVkaW9cIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAvLyBlbmFibGUgdGhlIHRvdXIgYnV0dG9uc1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuYnV0dG9uQ291bnQ7IGorKylcbiAgICAgICAgICAgICQodGhpcy50b3VyQnV0dG9uc1tqXSkucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgIH1cbiAgICAvLyBvbmx5IGNhbGwgdGhpcyBvbmUgYWZ0ZXIgdGhlIGZpcnN0IHRpbWVcbiAgICBvdXRlckF1ZGlvKCkge1xuICAgICAgICAvLyB1bmJpbmQgZW5kZWRcbiAgICAgICAgJChcIiNcIiArIHRoaXMuYWZpbGUpLnVuYmluZChcImVuZGVkXCIpO1xuICAgICAgICAvLyBzZXQgdGhpcy5wbGF5aW5nIHRvIGZhbHNlXG4gICAgICAgIHRoaXMucGxheWluZyA9IGZhbHNlO1xuICAgICAgICAvLyB1bmhpZ2hsaWdodCBwcmV2aW91cyBsaW5lcyBmcm9tIHRoZSBsYXN0IGF1ZGlvXG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRMaW5lcyhcbiAgICAgICAgICAgIHRoaXMudGhlRGl2aWQsXG4gICAgICAgICAgICB0aGlzLmFoYXNoW3RoaXMuYW5hbWVbdGhpcy5jdXJySW5kZXhdXVxuICAgICAgICApO1xuICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHRoaXMuY3VyckluZGV4IHRvIHBvaW50IHRvIHRoZSBuZXh0IG9uZVxuICAgICAgICB0aGlzLmN1cnJJbmRleCsrO1xuICAgICAgICAvLyBpZiB0aGUgZW5kIG9mIHRoZSB0b3VyIHJlc2V0IHRoZSBidXR0b25zXG4gICAgICAgIGlmICh0aGlzLmN1cnJJbmRleCA9PSB0aGlzLmxlbikge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVUb3VyRW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBub3QgZG9uZSB5ZXQgc28gcGxheSB0aGUgbmV4dCBhdWRpb1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBsYXkgdGhlIGF1ZGlvIGF0IHRoZSBjdXJyZW50IGluZGV4XG4gICAgICAgICAgICB0aGlzLnBsYXlDdXJySW5kZXhBdWRpbygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHBsYXkgdGhlIGF1ZGlvIG5vdyB0aGF0IGl0IGlzIHJlYWR5XG4gICAgcGxheVdoZW5SZWFkeShhZmlsZSwgZGl2aWQsIGFoYXNoKSB7XG4gICAgICAgIC8vIHVuYmluZCBjdXJyZW50XG4gICAgICAgICQoXCIjXCIgKyBhZmlsZSkudW5iaW5kKFwiY2FucGxheXRocm91Z2hcIik7XG4gICAgICAgIHRoaXMuZWxlbS5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgIHRoaXMucGxheWluZyA9IHRydWU7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJpbiBwbGF5V2hlblJlYWR5IFwiICsgZWxlbS5kdXJhdGlvbik7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGFoYXNoW2FmaWxlXSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID09PVxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlpbmdcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKFwiI1wiICsgYWZpbGUpLmJpbmQoXG4gICAgICAgICAgICAgICAgXCJlbmRlZFwiLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRlckF1ZGlvKCk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5lbGVtLnBsYXkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQoXCIjXCIgKyBhZmlsZSkuYmluZChcbiAgICAgICAgICAgICAgICBcImVuZGVkXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGVyQXVkaW8oKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBpIGFuZCBzZXQgdGhlIGR1cmF0aW9uIGFuZCBoaWdobGlnaHQgdGhlIGxpbmVzXG4gICAgcGxheWF1ZGlvKGksIGFuYW1lLCBkaXZpZCwgYWhhc2gpIHtcbiAgICAgICAgdGhpcy5hZmlsZSA9IGFuYW1lW2ldO1xuICAgICAgICB0aGlzLmVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmFmaWxlKTtcbiAgICAgICAgLy8gaWYgdGhpcyBpc24ndCByZWFkeSB0byBwbGF5IHlldCAtIG5vIGR1cmF0aW9uIHlldCB0aGVuIHdhaXRcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImluIHBsYXlhdWRpbyBcIiArIGVsZW0uZHVyYXRpb24pO1xuICAgICAgICBpZiAoaXNOYU4odGhpcy5lbGVtLmR1cmF0aW9uKSB8fCB0aGlzLmVsZW0uZHVyYXRpb24gPT0gMCkge1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBzdGF0dXNcbiAgICAgICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbG9hZGluZ19hdWRpb1wiKSk7XG4gICAgICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkuYmluZChcbiAgICAgICAgICAgICAgICBcImNhbnBsYXl0aHJvdWdoXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlXaGVuUmVhZHkodGhpcy5hZmlsZSwgZGl2aWQsIGFoYXNoKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IGlzIHJlYWR5IHNvIHBsYXkgaXRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlXaGVuUmVhZHkodGhpcy5hZmlsZSwgZGl2aWQsIGFoYXNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBwYXVzZSBpZiB0aGlzLnBsYXlpbmcgYW5kIHBsYXkgaWYgcGF1c2VkXG4gICAgcGF1c2VBbmRQbGF5QXVkaW8oZGl2aWQpIHtcbiAgICAgICAgdmFyIGJ0biA9IHRoaXMucGF1c2VfYXVkaW87XG4gICAgICAgIC8vIGlmIHBhdXNlZCBhbmQgY2xpY2tlZCB0aGVuIGNvbnRpbnVlIGZyb20gY3VycmVudFxuICAgICAgICBpZiAodGhpcy5lbGVtLnBhdXNlZCkge1xuICAgICAgICAgICAgLy8gY2FsY3VhbHRlIHRoZSB0aW1lIGxlZnQgdG8gcGxheSBpbiBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gKHRoaXMuZWxlbS5kdXJhdGlvbiAtIHRoaXMuZWxlbS5jdXJyZW50VGltZSkgKiAxMDAwO1xuICAgICAgICAgICAgdGhpcy5lbGVtLnBsYXkoKTsgLy8gc3RhcnQgdGhlIGF1ZGlvIGZyb20gY3VycmVudCBzcG90XG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCI7XG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnRpdGxlID0gJC5pMThuKFxuICAgICAgICAgICAgICAgIFwibXNnX2FjdGl2ZWNvZGVfcGF1c2VfY3VycmVudF9hdWRpb1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGF1c2VfYXVkaW9cIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlpbmdcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJwbGF5XCIsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYXVkaW8gd2FzIHRoaXMucGxheWluZyBwYXVzZSBpdFxuICAgICAgICBlbHNlIGlmICh0aGlzLnBsYXlpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpOyAvLyBwYXVzZSB0aGUgYXVkaW9cbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID0gXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBsYXlcIjtcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9wbGF5X3BhdXNlZF9hdWRpb1wiKTtcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiLFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbChcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hdWRpb19wYXVzZWRcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJwYXVzZVwiLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHByb2Nlc3MgdGhlIGxpbmVzXG4gICAgcHJvY2Vzc0xpbmVzKGRpdmlkLCBsbnVtLCBjb2xvcikge1xuICAgICAgICB2YXIgY29tbWEgPSBsbnVtLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgaWYgKGNvbW1hLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEJhY2tncm91bmRGb3JMaW5lcyhkaXZpZCwgY29tbWFbaV0sIGNvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZEZvckxpbmVzKGRpdmlkLCBsbnVtLCBjb2xvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gdW5oaWdobGlnaHQgdGhlIGxpbmVzIC0gc2V0IHRoZSBiYWNrZ3JvdW5kIGJhY2sgdG8gdHJhbnNwYXJlbnRcbiAgICB1bmhpZ2hsaWdodExpbmVzKGRpdmlkLCBsbnVtKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpbmVzKGRpdmlkLCBsbnVtLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIH1cbiAgICAvLyBoaWdobGlnaHQgdGhlIGxpbmVzIC0gc2V0IHRoZSBiYWNrZ3JvdW5kIHRvIGEgeWVsbG93IGNvbG9yXG4gICAgaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGxudW0pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGluZXMoZGl2aWQsIGxudW0sIFwiI2ZmZmY5OVwiKTtcbiAgICB9XG4gICAgLy8gc2V0IHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBwYXNzZWQgY29sb3JcbiAgICBzZXRCYWNrZ3JvdW5kRm9yTGluZXMoZGl2aWQsIGxudW0sIGNvbG9yKSB7XG4gICAgICAgIHZhciBoeXBoZW4gPSBsbnVtLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgdmFyIHN0cjtcbiAgICAgICAgLy8gaWYgYSByYW5nZSBvZiBsaW5lc1xuICAgICAgICBpZiAoaHlwaGVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHBhcnNlSW50KGh5cGhlblswXSk7XG4gICAgICAgICAgICB2YXIgZW5kID0gcGFyc2VJbnQoaHlwaGVuWzFdKSArIDE7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gc3RhcnQ7IGsgPCBlbmQ7IGsrKykge1xuICAgICAgICAgICAgICAgIC8vYWxlcnQoayk7XG4gICAgICAgICAgICAgICAgc3RyID0gXCIjXCIgKyBkaXZpZCArIFwiX2xcIiArIGs7XG4gICAgICAgICAgICAgICAgaWYgKCQoc3RyKS50ZXh0KCkgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAkKHN0cikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBjb2xvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vJChzdHIpLmVmZmVjdChcImhpZ2hsaWdodFwiLHt9LChkdXIqMTAwMCkrNDUwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL2FsZXJ0KGxudW0pO1xuICAgICAgICAgICAgc3RyID0gXCIjXCIgKyBkaXZpZCArIFwiX2xcIiArIGxudW07XG4gICAgICAgICAgICAkKHN0cikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBjb2xvcik7XG4gICAgICAgICAgICAvLyQoc3RyKS5lZmZlY3QoXCJoaWdobGlnaHRcIix7fSwoZHVyKjEwMDApKzQ1MDApO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIHRlc3RTdHJpbmcgPSBgU3RhcnRpbmcgVGVzdHNcbkV4cGVjdGVkOiBBbnN3ZXIgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBBbnN3ZXIgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgbWV0aG9kIHByaW50QW5zd2VyKCkgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiA2IGxpbmUocykgb2YgdGV4dCAgICAgICAgQWN0dWFsOiAwIGxpbmUocykgb2YgdGV4dCAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgbWFpbiBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IGZhbHNlXG5IZWxsbyBXb3JsZFxuRXhwZWN0ZWQ6IFN0cmluZyBTdHJpbmcgICAgICAgICAgICBBY3R1YWw6IFN0cmluZyBTdHJpbmcgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBJbnN0YW5jZSBWYXJpYWJsZSBUeXBlKHMpICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRXhwZWN0ZWQ6IFF1ZXN0aW9uICAgICAgICAgICAgICAgICBBY3R1YWw6IFF1ZXN0aW9uICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBtZXRob2QgcHJpbnRRdWVzdGlvbigpICAgICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRGVidWdnaW5nIG91dHB1dFxuTW9yZSBkZWJ1ZyBvdXRwdXRcbkV4cGVjdGVkOiAyIFByaXZhdGUgICAgICAgICAgICAgICAgQWN0dWFsOiAyIFByaXZhdGUgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgUHJpdmF0ZSBJbnN0YW5jZSBWYXJpYWJsZShzKSAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiBwYXNzICAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBwYXNzICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiBmYWlsICAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBmYWlsICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkVuZGluZyBUZXN0c1xuWW91IGdvdCA2IG91dCBvZiA3IGNvcnJlY3QuIDg1LjcxJWA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpVbml0VGVzdFBhcnNlciB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0LCBwYXJlbnRJZCkge1xuICAgICAgICBsZXQgcGF0dCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICBcIkV4cGVjdGVkOlxcXFxzKyguKj8pQWN0dWFsOlxcXFxzKyguKj8pTWVzc2FnZTpcXFxccysoLio/KVBhc3NlZDpcXFxccysodHJ1ZXxmYWxzZSlcIixcbiAgICAgICAgICAgIFwiZ1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudGV4dFJlc3VsdHMgPSBcIlwiO1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IG91dHB1dC5tYXRjaEFsbChwYXR0KTtcbiAgICAgICAgbGV0IHBhcmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHBhcmVudC5jbGFzc0xpc3QuYWRkKFwidW5pdHRlc3QtcmVzdWx0c1wiKTtcbiAgICAgICAgbGV0IHRibCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiKTtcbiAgICAgICAgdGJsLmNsYXNzTGlzdC5hZGQoXCJhYy1mZWVkYmFja1wiKTtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHRibCk7XG4gICAgICAgIHBhcmVudC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBgJHtwYXJlbnRJZH1fdW5pdF9yZXN1bHRzYCk7XG4gICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0clwiKTtcbiAgICAgICAgdHIuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICc8dGggY2xhc3M9XCJhYy1mZWVkYmFja1wiPlJlc3VsdDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5FeHBlY3RlZDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5BY3R1YWw8L3RoPjx0aCBjbGFzcz1cImFjLWZlZWRiYWNrXCI+Tm90ZXM8L3RoPic7XG4gICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XG4gICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyXCIpO1xuICAgICAgICAgICAgbGV0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRkXCIpO1xuICAgICAgICAgICAgdGQuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xuICAgICAgICAgICAgaWYgKG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdID09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgdGQuaW5uZXJIVE1MID0gXCJQYXNzXCI7XG4gICAgICAgICAgICAgICAgdGQuc3R5bGUgPVxuICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3I6IHJnYigxMzEsIDIxMSwgMTMwKTsgdGV4dC1hbGlnbjogY2VudGVyO1wiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZC5pbm5lckhUTUwgPSBcIkZhaWxcIjtcbiAgICAgICAgICAgICAgICB0ZC5zdHlsZSA9XG4gICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyMiwgMTQyLCAxNTApOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZCk7XG4gICAgICAgICAgICB0YmwuYXBwZW5kQ2hpbGQodHIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGRcIik7XG4gICAgICAgICAgICAgICAgdGQuaW5uZXJIVE1MID0gbWF0Y2hbaV07XG4gICAgICAgICAgICAgICAgdGQuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xuICAgICAgICAgICAgICAgIHRyLmFwcGVuZENoaWxkKHRkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XG4gICAgICAgICAgICB0aGlzLnRhYmxlID0gcGFyZW50O1xuICAgICAgICAgICAgdGhpcy50ZXh0UmVzdWx0cyArPSBtYXRjaFswXSArIFwiXFxuXCI7XG4gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShtYXRjaFswXSwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hdGNoID0gb3V0cHV0Lm1hdGNoKFxuICAgICAgICAgICAgL1lvdSBnb3RcXHMrKFxcZCspIG91dCBvZiAoXFxkKykgY29ycmVjdC5cXHMrKFxcZCtcXC5cXGQrKSUvXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UobWF0Y2hbMF0sIFwiXCIpO1xuICAgICAgICAgICAgbGV0IHBjdFN0cmluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgcGN0U3RyaW5nLmlubmVySFRNTCA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgdGhpcy5wY3RTdHJpbmcgPSBwY3RTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLnBjdCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgdGhpcy5wYXNzZWQgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkID0gbWF0Y2hbMl0gLSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShcIlN0YXJ0aW5nIFRlc3RzXCIsIFwiXCIpO1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShcIkVuZGluZyBUZXN0c1wiLCBcIlwiKTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIik7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKC8oPGJyPikrL2csIFwiPGJyPlwiKTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2VBbGwoXCImbHQ7aW1nXCIsIFwiPGltZ1wiKTtcbiAgICAgICAgdGhpcy5zdGRvdXQgPSBvdXRwdXQ7XG4gICAgfVxufVxuXG4vLyBsZXQgeCA9IG5ldyBSZXN1bHRzVG9UYWJsZSh0ZXN0U3RyaW5nKTtcbi8vIGNvbnNvbGUubG9nKHguc3Rkb3V0KTtcbi8vIGNvbnNvbGUubG9nKHgudGFibGUpO1xuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcbmltcG9ydCBNRDUgZnJvbSBcIi4vbWQ1LmpzXCI7XG5pbXBvcnQgSlVuaXRUZXN0UGFyc2VyIGZyb20gXCIuL2V4dHJhY3RVbml0UmVzdWx0cy5qc1wiO1xuaW1wb3J0IFwiLi4vLi4vY29kZWxlbnMvanMvcHl0dXRvci1lbWJlZC5idW5kbGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHZhciBvcmlnID0gJChvcHRzLm9yaWcpLmZpbmQoXCJ0ZXh0YXJlYVwiKVswXTtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuc3RkaW4gPSAkKG9yaWcpLmRhdGEoXCJzdGRpblwiKTtcbiAgICAgICAgdGhpcy5kYXRhZmlsZSA9ICQob3JpZykuZGF0YShcImRhdGFmaWxlXCIpO1xuICAgICAgICB0aGlzLnNvdXJjZWZpbGUgPSAkKG9yaWcpLmRhdGEoXCJzb3VyY2VmaWxlXCIpO1xuICAgICAgICB0aGlzLmNvbXBpbGVhcmdzID0gdW5lc2NhcGVIdG1sKCQob3JpZykuZGF0YShcImNvbXBpbGVhcmdzXCIpKTtcbiAgICAgICAgdGhpcy5saW5rYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJsaW5rYXJnc1wiKSk7XG4gICAgICAgIHRoaXMucnVuYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJydW5hcmdzXCIpKTtcbiAgICAgICAgdGhpcy5pbnRlcnByZXRlcmFyZ3MgPSB1bmVzY2FwZUh0bWwoJChvcmlnKS5kYXRhKFwiaW50ZXJwcmV0ZXJhcmdzXCIpKTtcbiAgICAgICAgdGhpcy5BUElfS0VZID0gXCI2NzAzM3BWN2VVVXZxbzA3T0pESVY4VVowNDlhTEVLMVwiO1xuICAgICAgICB0aGlzLlVTRV9BUElfS0VZID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5KT0JFX1NFUlZFUiA9IGVCb29rQ29uZmlnLmpvYmVob3N0IHx8IGVCb29rQ29uZmlnLmhvc3Q7XG4gICAgICAgIHRoaXMucmVzb3VyY2UgPSBlQm9va0NvbmZpZy5wcm94eXVyaV9ydW5zIHx8IFwiL3J1bmVzdG9uZS9wcm94eS9qb2JlUnVuXCI7XG4gICAgICAgIHRoaXMuam9iZVB1dEZpbGVzID1cbiAgICAgICAgICAgIGVCb29rQ29uZmlnLnByb3h5dXJpX2ZpbGVzIHx8IFwiL3J1bmVzdG9uZS9wcm94eS9qb2JlUHVzaEZpbGUvXCI7XG4gICAgICAgIHRoaXMuam9iZUNoZWNrRmlsZXMgPVxuICAgICAgICAgICAgZUJvb2tDb25maWcucHJveHl1cmlfZmlsZXMgfHwgXCIvcnVuZXN0b25lL3Byb3h5L2pvYmVDaGVja0ZpbGUvXCI7XG4gICAgICAgIC8vIFRPRE86ICBzaG91bGQgYWRkIGEgcHJvcGVyIHB1dC9jaGVjayBpbiBwYXZlbWVudC50bXBsIGFzIHRoaXMgaXMgbWlzbGVhZGluZyBhbmQgd2lsbCBicmVhayBvbiBydW5lc3RvbmVcbiAgICAgICAgdGhpcy5kaXYyaWQgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMuc3RkaW4pIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5wdXRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVFcnJvck91dHB1dCgpO1xuICAgIH1cbiAgICBvdXRwdXRmdW4oYSkge31cbiAgICBjcmVhdGVJbnB1dEVsZW1lbnQoKSB7XG4gICAgICAgIHZhciBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgbGFiZWwuZm9yID0gdGhpcy5kaXZpZCArIFwiX3N0ZGluXCI7XG4gICAgICAgICQobGFiZWwpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5wdXRfcHJnXCIpKTtcbiAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBpbnB1dC5pZCA9IHRoaXMuZGl2aWQgKyBcIl9zdGRpblwiO1xuICAgICAgICBpbnB1dC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGlucHV0LnNpemUgPSBcIjM1XCI7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5zdGRpbjtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsYWJlbCk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuICAgICAgICB0aGlzLnN0ZGluX2VsID0gaW5wdXQ7XG4gICAgfVxuICAgIGNyZWF0ZUVycm9yT3V0cHV0KCkge31cblxuICAgIC8qICBNYWluIHJ1blByb2cgbWV0aG9kIGZvciBsaXZlY29kZVxuICAgICAqXG4gICAgICovXG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5TZXR1cCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VG9Kb2JlKCk7XG4gICAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgJC5pMThuKGBTZXJ2ZXIgRXJyb3I6ICR7cmVzLnN0YXR1c1RleHR9YClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJmYWlsXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcnVuUmVzdWx0cyA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NKb2JlUmVzcG9uc2UocnVuUmVzdWx0cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfY29tbV9lcnJcIikgKyBlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gYGZhaWw6ICR7ZX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcInN1Y2Nlc3NcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90ZTpcbiAgICAgKiBJbiBvcmRlciB0byBjaGVjayBmb3Igc3VwcGxlbWVudGFsIGZpbGVzIGluIGphdmEgYW5kIGRlYWwgd2l0aCBhc3luY2hyb25pY2l0eVxuICAgICAqIEkgc3BsaXQgdGhlIG9yaWdpbmFsIHJ1blByb2cgaW50byB0d28gZnVuY3Rpb25zOiBydW5Qcm9nIGFuZCBydW5Qcm9nX2NhbGxiYWNrXG4gICAgICovXG4gICAgYXN5bmMgcnVuU2V0dXAoKSB7XG4gICAgICAgIHZhciBzdGRpbjtcbiAgICAgICAgdmFyIHNvdXJjZTtcbiAgICAgICAgdmFyIHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHZhciBzZmlsZW1hcCA9IHtcbiAgICAgICAgICAgIGphdmE6IFwiXCIsXG4gICAgICAgICAgICBjcHA6IFwidGVzdC5jcHBcIixcbiAgICAgICAgICAgIGM6IFwidGVzdC5jXCIsXG4gICAgICAgICAgICBweXRob24zOiBcInRlc3QucHlcIixcbiAgICAgICAgICAgIHB5dGhvbjI6IFwidGVzdC5weVwiLFxuICAgICAgICAgICAgb2N0YXZlOiBcIm9jdGF0ZXN0Lm1cIixcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHNvdXJjZWZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIHRlc3Rkcml2ZXJuYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIGZpbGVfY2hlY2twO1xuXG4gICAgICAgIC8vIGV4dHJhY3QgdGhlIGNsYXNzIG5hbWVzIHNvIGZpbGVzIGNhbiBiZSBuYW1lZCBwcm9wZXJseVxuICAgICAgICBpZiAodGhpcy5zdWZmaXggJiYgdGhpcy5sYW5ndWFnZSA9PSBcImphdmFcIikge1xuICAgICAgICAgICAgbGV0IGNsYXNzTWF0Y2ggPSBuZXcgUmVnRXhwKC9wdWJsaWMgY2xhc3NcXHMrKFxcdyspW1xccyt7XS8pO1xuICAgICAgICAgICAgc291cmNlID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpO1xuICAgICAgICAgICAgbGV0IG0gPSBzb3VyY2UubWF0Y2goY2xhc3NNYXRjaCk7XG4gICAgICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZWZpbGVuYW1lID0gbVsxXSArIFwiLmphdmFcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSB1bml0IHRlc3QgY29kZVxuICAgICAgICAgICAgbSA9IHRoaXMuc3VmZml4Lm1hdGNoKGNsYXNzTWF0Y2gpO1xuICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICB0ZXN0ZHJpdmVybmFtZSA9IG1bMV0gKyBcIi5qYXZhXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YSBpcyBjb252ZXJ0aWJsZSB0byBCYXNlNjQuIElmIG5vdCB0aGVuIGVycm9yIG91dCBub3dcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGJ0b2Eoc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYWxlcnQoXG4gICAgICAgICAgICAgICAgXCJFcnJvcjogQmFkIENoYXJhY3RlcnMgaW4gdGhlIGFjdGl2ZWNvZGUgd2luZG93LiBMaWtlbHkgYSBxdW90ZSBjaGFyYWN0ZXIgdGhhdCBoYXMgYmVlbiBjb3B5L3Bhc3RlZC4g8J+ZgVwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcblxuICAgICAgICAvLyBhc3NlbWJsZSBwYXJhbWV0ZXJzIGZvciBKT0JFXG4gICAgICAgIHZhciBwYXJhbWxpc3QgPSBbXG4gICAgICAgICAgICBcImNvbXBpbGVhcmdzXCIsXG4gICAgICAgICAgICBcImxpbmthcmdzXCIsXG4gICAgICAgICAgICBcInJ1bmFyZ3NcIixcbiAgICAgICAgICAgIFwiaW50ZXJwcmV0ZXJhcmdzXCIsXG4gICAgICAgICAgICBcIm1lbW9yeWxpbWl0XCIsXG4gICAgICAgIF07XG4gICAgICAgIHZhciBwYXJhbW9iaiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBwYXJhbSBvZiBwYXJhbWxpc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW3BhcmFtXSkge1xuICAgICAgICAgICAgICAgIHBhcmFtb2JqW3BhcmFtXSA9IGV2YWwodGhpc1twYXJhbV0pOyAvLyBuZWVkcyBhIGxpc3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sYW5ndWFnZSA9PT0gXCJvY3RhdmVcIikge1xuICAgICAgICAgICAgcGFyYW1vYmoubWVtb3J5bGltaXQgPSAyMDAwMDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGRpbikge1xuICAgICAgICAgICAgc3RkaW4gPSAkKHRoaXMuc3RkaW5fZWwpLnZhbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VmaWxlKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZWZpbGUgPSBzZmlsZW1hcFt0aGlzLmxhbmd1YWdlXTtcbiAgICAgICAgfVxuXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmdcIikpO1xuICAgICAgICB2YXIgZmlsZXMgPSBbXTtcbiAgICAgICAgdmFyIGNvbnRlbnQsIGJhc2U2NDtcbiAgICAgICAgaWYgKHRoaXMuZGF0YWZpbGUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgaWRzID0gdGhpcy5kYXRhZmlsZS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBmaWxlTmFtZSA9IGlkc1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLmxhc3RJbmRleE9mKFwiLlwiKSArIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlID09PSBudWxsIHx8IGZpbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5vIGZpbGUgd2l0aCBnaXZlbiBpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGZpbGUgaXMgaW4gZGJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IHRoaXMuZmlsZVJlYWRlcihmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGZpbGUudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1heSBiZSB1bmRlZmluZWQgYXQgdGhpcyBwb2ludCBpZiBmaWxlIGlzIGFuIGltYWdlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09PSBcImphclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzID0gZmlsZXMuY29uY2F0KHRoaXMucGFyc2VKYXZhQ2xhc3Nlcyhjb250ZW50KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChbXCJqcGdcIiwgXCJwbmdcIiwgXCJnaWZcIl0uaW5kZXhPZihmaWxlRXh0ZW5zaW9uKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS50b0RhdGFVUkwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBmaWxlLnRvRGF0YVVSTChcImltYWdlL1wiICsgZmlsZUV4dGVuc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gYmFzZTY0LnN1YnN0cmluZyhiYXNlNjQuaW5kZXhPZihcIixcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gZmlsZS5zcmMuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnNyYy5pbmRleE9mKFwiLFwiKSArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKHsgbmFtZTogZmlsZU5hbWUsIGNvbnRlbnQ6IGJhc2U2NCB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBubyBjbGFzc05hbWUgb3IgdW4gcmVjb2duaXplZCBjbGFzc05hbWUgaXQgaXMgdHJlYXRlZCBhcyBhbiBpbmRpdmlkdWFsIGZpbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBhbnkgdHlwZSBvZiBmaWxlLCAudHh0LCAuamF2YSwgLmNzdiwgZXRjXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBmaWxlTmFtZSwgY29udGVudDogY29udGVudCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgYXJlIHJ1bm5pbmcgdW5pdCB0ZXN0cyB3ZSBuZWVkIHRvIHN1YnN0aXR1dGUgdGhlIHRlc3QgZHJpdmVyIGZvciB0aGUgc3R1ZGVudFxuICAgICAgICAvLyBjb2RlIGFuZCBzZW5kIHRoZSBzdHVkZW50IGNvZGUgYXMgYSBmaWxlLiAgV2UnbGwgZG8gdGhhdCBoZXJlLlxuICAgICAgICB0aGlzLmp1bml0RHJpdmVyQ29kZSA9IGBcbiAgICAgICAgaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuSlVuaXRDb3JlO1xuICAgICAgICBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SZXN1bHQ7XG4gICAgICAgIGltcG9ydCBvcmcuanVuaXQucnVubmVyLm5vdGlmaWNhdGlvbi5GYWlsdXJlO1xuXG4gICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0UnVubmVyIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBDb2RlVGVzdEhlbHBlci5yZXNldEZpbmFsUmVzdWx0cygpO1xuICAgICAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBKVW5pdENvcmUucnVuQ2xhc3Nlcygke3Rlc3Rkcml2ZXJuYW1lLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIFwiLmphdmFcIixcbiAgICAgICAgICAgICAgICAgICAgXCIuY2xhc3NcIlxuICAgICAgICAgICAgICAgICl9KTtcbiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQ29kZVRlc3RIZWxwZXIuZ2V0RmluYWxSZXN1bHRzKCkpO1xuXG4gICAgICAgICAgICAgICAgaW50IHRvdGFsID0gcmVzdWx0LmdldFJ1bkNvdW50KCk7XG4gICAgICAgICAgICAgICAgaW50IGZhaWxzID0gcmVzdWx0LmdldEZhaWx1cmVDb3VudCgpO1xuICAgICAgICAgICAgICAgIGludCBjb3JyICA9IHRvdGFsIC0gZmFpbHM7XG4gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiWW91IGdvdCBcIiArIGNvcnIgKyBcIiBvdXQgb2YgXCIgKyB0b3RhbCArIFwiIGNvcnJlY3QuIFwiICsgU3RyaW5nLmZvcm1hdChcIiUuMmZcIiwgKDEwMC4wICogY29yciAvIHRvdGFsKSkgKyBcIiVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgaWYgKHRoaXMuc3VmZml4ICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJqYXZhXCIpIHtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBzb3VyY2VmaWxlbmFtZSwgY29udGVudDogc291cmNlIH0pO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IG5hbWU6IHRlc3Rkcml2ZXJuYW1lLCBjb250ZW50OiB0aGlzLnN1ZmZpeCB9KTtcbiAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMuanVuaXREcml2ZXJDb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmFtb2JqLmNvbXBpbGVhcmdzKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1vYmouY29tcGlsZWFyZ3MucHVzaChzb3VyY2VmaWxlbmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmFtb2JqLmNvbXBpbGVhcmdzID0gW3NvdXJjZWZpbGVuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcnVuc3BlYyA9IHtcbiAgICAgICAgICAgIGxhbmd1YWdlX2lkOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgc291cmNlY29kZTogc291cmNlLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1vYmosXG4gICAgICAgICAgICBzb3VyY2VmaWxlbmFtZTogdGhpcy5zb3VyY2VmaWxlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzdGRpbikge1xuICAgICAgICAgICAgcnVuc3BlYy5pbnB1dCA9IHN0ZGluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuanNvbl9ydW5zcGVjID0gSlNPTi5zdHJpbmdpZnkoeyBydW5fc3BlYzogcnVuc3BlYyB9KTtcbiAgICAgICAgICAgIGZpbGVfY2hlY2twID0gUHJvbWlzZS5yZXNvbHZlKFwicmVhZHlcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW5zcGVjW1wiZmlsZV9saXN0XCJdID0gW107XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSBmaWxlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBmaWxlQ29udGVudCA9IGZpbGVzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuZGl2MmlkW2ZpbGVOYW1lXSA9XG4gICAgICAgICAgICAgICAgICAgIFwicnVuZXN0b25lXCIgKyBNRDUoZmlsZU5hbWUgKyBmaWxlQ29udGVudCk7XG4gICAgICAgICAgICAgICAgcnVuc3BlY1tcImZpbGVfbGlzdFwiXS5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuZGl2MmlkW2ZpbGVOYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY2hlY2tGaWxlKGZpbGVzW2ldLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmpzb25fcnVuc3BlYyA9IEpTT04uc3RyaW5naWZ5KHsgcnVuX3NwZWM6IHJ1bnNwZWMgfSk7XG4gICAgICAgICAgICB0aGlzLmRpdjJpZCA9IGluc3RhbmNlLmRpdjJpZDtcbiAgICAgICAgICAgIGZpbGVfY2hlY2twID0gUHJvbWlzZS5hbGwocHJvbWlzZXMpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yOiBcIiArIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZV9jaGVja3A7XG4gICAgfVxuXG4gICAgLyogU3VibWl0IHRoZSBhc3NlbWJsZWQgam9iIHRvIHRoZSBKT0JFIHNlcnZlciBhbmQgYXdhaXQgdGhlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKi9cbiAgICBhc3luYyBzdWJtaXRUb0pvYmUoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5qc29uX3J1bnNwZWM7XG4gICAgICAgIGxldCBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHRoaXMucmVzb3VyY2U7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICAkKHRoaXMuZXJyRGl2KS5yZW1vdmUoKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICBcIkNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICBcIlgtQVBJLUtFWVwiOiB0aGlzLkFQSV9LRVksXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGhvc3QsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmZXRjaChyZXF1ZXN0KTtcblxuICAgICAgICAvLy8kKFwiI1wiICsgZGl2aWQgKyBcIl9lcnJpbmZvXCIpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHByb2Nlc3NKb2JlUmVzcG9uc2UocmVzdWx0KSB7XG4gICAgICAgIHZhciBsb2dyZXN1bHQ7XG4gICAgICAgIHZhciBvZGl2ID0gdGhpcy5vdXRwdXQ7XG4gICAgICAgIHRoaXMucGFyc2VkT3V0cHV0ID0ge307XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgaWYgKHJlc3VsdC5vdXRjb21lID09PSAxNSkge1xuICAgICAgICAgICAgbG9ncmVzdWx0ID0gXCJzdWNjZXNzXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dyZXN1bHQgPSByZXN1bHQub3V0Y29tZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVycmluZm8gPSBsb2dyZXN1bHQ7XG4gICAgICAgIHN3aXRjaCAocmVzdWx0Lm91dGNvbWUpIHtcbiAgICAgICAgICAgIGNhc2UgMTU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZE91dHB1dCA9IG5ldyBKVW5pdFRlc3RQYXJzZXIoXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGRvdXQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGl2aWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbCh0aGlzLnBhcnNlZE91dHB1dC5zdGRvdXQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJzZWRPdXRwdXQucGN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkT3V0cHV0LnBjdCA9IHRoaXMucGFyc2VkT3V0cHV0LnBhc3NlZCA9IHRoaXMucGFyc2VkT3V0cHV0LmZhaWxlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bml0X3Jlc3VsdHMgPSBgcGVyY2VudDoke3RoaXMucGFyc2VkT3V0cHV0LnBjdH06cGFzc2VkOiR7dGhpcy5wYXJzZWRPdXRwdXQucGFzc2VkfTpmYWlsZWQ6JHt0aGlzLnBhcnNlZE91dHB1dC5mYWlsZWR9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIDExOiAvLyBjb21waWxlciBlcnJvclxuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV93ZXJlX2NvbXBpbGluZ19lcnJcIikpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShyZXN1bHQuY21waW5mbyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEyOiAvLyBydW4gdGltZSBlcnJvclxuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbChyZXN1bHQuc3Rkb3V0LnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIikpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShyZXN1bHQuc3RkZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEzOiAvLyB0aW1lIGxpbWl0XG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHJlc3VsdC5zdGRvdXQucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2V4Y1wiKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICQob2RpdikuaHRtbChyZXN1bHQuc3RkZXJyLnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3NlcnZlcl9lcnJcIilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdG9kbzogaGFuZGxlIHNlcnZlciBidXN5IGFuZCB0aW1lb3V0IGVycm9ycyB0b29cbiAgICB9XG5cbiAgICByZW5kZXJGZWVkYmFjaygpIHtcbiAgICAgICAgbGV0IHJkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHt0aGlzLmRpdmlkfV91bml0X3Jlc3VsdHNgKTtcbiAgICAgICAgaWYgKHJkaXYpIHtcbiAgICAgICAgICAgIHJkaXYucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFyc2VkT3V0cHV0ICYmIHRoaXMucGFyc2VkT3V0cHV0LnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLm91dERpdi5hcHBlbmRDaGlsZCh0aGlzLnBhcnNlZE91dHB1dC50YWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3RoaXMuZGl2aWR9X3VuaXRfcmVzdWx0c2ApO1xuICAgICAgICBpZiAocmRpdikge1xuICAgICAgICAgICAgcmRpdi5hcHBlbmRDaGlsZCh0aGlzLnBhcnNlZE91dHB1dC5wY3RTdHJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkSm9iZUVycm9yTWVzc2FnZShlcnIpIHtcbiAgICAgICAgdmFyIGVyckhlYWQgPSAkKFwiPGgzPlwiKS5odG1sKFwiRXJyb3JcIik7XG4gICAgICAgIHZhciBlQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lcnJEaXYgPSBlQ29udGFpbmVyO1xuICAgICAgICBlQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZXJyb3IgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7XG4gICAgICAgIGVDb250YWluZXIuaWQgPSB0aGlzLmRpdmlkICsgXCJfZXJyaW5mb1wiO1xuICAgICAgICBlQ29udGFpbmVyLmFwcGVuZENoaWxkKGVyckhlYWRbMF0pO1xuICAgICAgICB2YXIgZXJyVGV4dCA9IGVDb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKSk7XG4gICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gZXJyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIGZpbGUgaXMgb24gc2VydmVyXG4gICAgICogUGxhY2VzIGl0IG9uIHNlcnZlciBpZiBpdCBpcyBub3Qgb24gc2VydmVyXG4gICAgICogQHBhcmFtICB7b2JqZWN0e25hbWUsIGNvbnRlbnRzfX0gZmlsZSAgICBGaWxlIHRvIHBsYWNlIG9uIHNlcnZlclxuICAgICAqIEBwYXJhbSAge2Z1bmN0aW9ufSByZXNvbHZlIHByb21pc2UgcmVzb2x2ZSBmdW5jdGlvblxuICAgICAqIEBwYXJhbSAge2Z1bmN0aW9ufSByZWplY3QgIHByb21pc2UgcmVqZWN0IGZ1bmN0aW9uXG4gICAgICovXG4gICAgY2hlY2tGaWxlKGZpbGUsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZmlsZV9pZCA9IHRoaXMuZGl2MmlkW2ZpbGUubmFtZV07XG4gICAgICAgIHZhciByZXNvdXJjZSA9IHRoaXMuam9iZUNoZWNrRmlsZXMgKyBmaWxlX2lkO1xuICAgICAgICB2YXIgaG9zdCA9IHRoaXMuSk9CRV9TRVJWRVIgKyByZXNvdXJjZTtcbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkhFQURcIiwgaG9zdCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC10eXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIiwgXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQVBJLUtFWVwiLCB0aGlzLkFQSV9LRVkpO1xuICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXJyb3Igc2VuZGluZyBmaWxlXCIgKyB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoeGhyLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNhc2UgMjA4OlxuICAgICAgICAgICAgICAgIGNhc2UgNDA0OlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZpbGUgbm90IG9uIFNlcnZlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoRGF0YUZpbGUoZmlsZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDA6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQmFkIFJlcXVlc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGaWxlIGFscmVhZHkgb24gU2VydmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGxhY2VzIGEgZmlsZSBvbiBhIHNlcnZlclxuICAgICAqL1xuICAgIHB1c2hEYXRhRmlsZShmaWxlLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lO1xuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmluZGV4T2YoXCIuXCIpICsgMSk7XG4gICAgICAgIHZhciBmaWxlX2lkID0gdGhpcy5kaXYyaWRbZmlsZU5hbWVdO1xuICAgICAgICB2YXIgY29udGVudHMgPSBmaWxlLmNvbnRlbnQ7XG4gICAgICAgIC8vIEZpbGUgdHlwZXMgYmVpbmcgdXBsb2FkZWQgdGhhdCBjb21lIGluIGFscmVhZHkgaW4gYmFzZTY0IGZvcm1hdFxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IFtcImphclwiLCBcInppcFwiLCBcInBuZ1wiLCBcImpwZ1wiLCBcImpwZWdcIl07XG4gICAgICAgIHZhciBjb250ZW50c2I2NDtcbiAgICAgICAgaWYgKGV4dGVuc2lvbnMuaW5kZXhPZihleHRlbnNpb24pID09PSAtMSkge1xuICAgICAgICAgICAgY29udGVudHNiNjQgPSBidG9hKGNvbnRlbnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnRzYjY0ID0gY29udGVudHM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnN0cmluZ2lmeSh7IGZpbGVfY29udGVudHM6IGNvbnRlbnRzYjY0IH0pO1xuICAgICAgICB2YXIgcmVzb3VyY2UgPSB0aGlzLmpvYmVQdXRGaWxlcyArIGZpbGVfaWQ7XG4gICAgICAgIHZhciBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHJlc291cmNlO1xuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiUFVUXCIsIGhvc3QsIHRydWUpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQWNjZXB0XCIsIFwidGV4dC9wbGFpblwiKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLUFQSS1LRVlcIiwgdGhpcy5BUElfS0VZKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoeGhyLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZvcmJpZGRlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDAwOlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkJhZCBSZXF1ZXN0XCIpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDQ6XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJzdWNjZXNzZnVsbHkgc2VudCBmaWxlIFwiICsgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJGaWxlIFwiICsgZmlsZU5hbWUgK1wiLCBcIiArIGZpbGVfaWQgK1wiIHBsYWNlZCBvbiBzZXJ2ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVycm9yIHNlbmRpbmcgZmlsZVwiICsgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLnNlbmQoZGF0YSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvd0NvZGVsZW5zKCkge1xuICAgICAgICBsZXQgY2xNZXNzID0gXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgY2xNZXNzID0gXCJCdWlsZGluZyB5b3VyIHZpc3VhbGl6YXRpb25cIjtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuaW5uZXJIVE1MID0gY2xNZXNzO1xuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnNcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsID0gdGhpcy5jb2RlbGVucy5maXJzdENoaWxkO1xuICAgICAgICBpZiAoY2wpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMucmVtb3ZlQ2hpbGQoY2wpO1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5pbm5lckhUTUwgPSBjbE1lc3M7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGUgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7XG4gICAgICAgIGlmIChjb2RlLm1hdGNoKC9TeXN0ZW0uZXhpdC8pKSB7XG4gICAgICAgICAgICBhbGVydChcbiAgICAgICAgICAgICAgICBcIlNvcnJ5Li4uIFN5c3RlbS5leGl0IGJyZWFrcyB0aGUgdmlzdWFsaXplciB0ZW1wb3JhcmlseSByZW1vdmluZ1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZSgvU3lzdGVtLmV4aXRcXChcXGQrXFwpOy8sIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBteVZhcnMgPSB7fTtcbiAgICAgICAgbXlWYXJzLmNvZGUgPSBjb2RlO1xuICAgICAgICBteVZhcnMubGFuZyA9IHRoaXMubGFuZ3VhZ2U7XG4gICAgICAgIGlmICh0aGlzLnN0ZGluKSB7XG4gICAgICAgICAgICBteVZhcnMuc3RkaW4gPSAkKHRoaXMuc3RkaW5fZWwpLnZhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0YXJnZXREaXYgPSB0aGlzLmNvZGVsZW5zLmlkO1xuXG4gICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoXCIvcnVuZXN0b25lL3Byb3h5L3B5dHV0b3JfdHJhY2VcIiwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG15VmFycyksXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBsZXQgdmlzID0gYWRkVmlzdWFsaXplclRvUGFnZShkYXRhLCB0YXJnZXREaXYsIHtcbiAgICAgICAgICAgICAgICBzdGFydGluZ0luc3RydWN0aW9uOiAwLFxuICAgICAgICAgICAgICAgIGVkaXRDb2RlQmFzZVVSTDogbnVsbCxcbiAgICAgICAgICAgICAgICBoaWRlQ29kZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFuZzogbXlWYXJzLmxhbmcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxldCB0YXJnZXREaXZFcnJvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldERpdik7XG4gICAgICAgICAgICB0YXJnZXREaXZFcnJvci5pbm5lckhUTUwgPVxuICAgICAgICAgICAgICAgIFwiU29ycnksIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIHlvdXIgdmlzdWFsaXphdGlvbi5cIjtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2V0IFRyYWNlIEZhaWxlZCAtLSBcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJjb2RlbGVuc1wiLFxuICAgICAgICAgICAgYWN0OiBcInZpZXdcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VwZXJhdGVzIHRleHQgaW50byBtdWx0aXBsZSAuamF2YSBmaWxlc1xuICAgICAqIEBwYXJhbSAge1N0cmluZ30gdGV4dCBTdHJpbmcgd2l0aCBtdWxpcGxlIGphdmEgY2xhc3NlcyBuZWVkZWQgdG8gYmUgc2VwZXJhdGVkXG4gICAgICogQHJldHVybiB7YXJyYXkgb2Ygb2JqZWN0c30gIC5uYW1lIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBqYXZhIGZpbGUgd2l0aCAuamF2YSBleHRlbnNpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAuY29udGVudCBnaXZlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVcbiAgICAgKi9cbiAgICBwYXJzZUphdmFDbGFzc2VzKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xuICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHN0YWNrID0gMDtcbiAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICB2YXIgY2xhc3NlcyA9IFtdO1xuICAgICAgICB2YXIgaW1wb3J0SW5kZXggPSAwO1xuICAgICAgICB2YXIgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hhciA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09IFwiXFxuXCIgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5jaGFyQXQoaSkgPT0gXCIqXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGV4dC5jaGFyQXQoaSkgIT09IFwiKlwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5jaGFyQXQoaSArIDEpICE9PSBcIi9cIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKyAxIDwgdGV4dC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09ICdcIicgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRleHQuY2hhckF0KGkpICE9PSBcIidcIiAmJiBpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcENvdW50ID0gMTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBDb3VudCA+IDAgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQuY2hhckF0KGkpID09PSBcIilcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50LS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQgJiYgdGV4dC5jaGFyQXQoaSkgPT09IFwie1wiKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT09IFwie1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YWNrKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCJ9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2stLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm91bmQgJiYgc3RhY2sgPT09IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSBpICsgMTtcbiAgICAgICAgICAgICAgICB2YXIgd29yZHMgPSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zLCBzdGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdyA9IDA7IHcgPCB3b3Jkcy5sZW5ndGg7IHcrKykge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB3b3Jkc1t3XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRzW3ddID09PSBcImV4dGVuZHNcIiB8fCB3b3Jkc1t3XSA9PT0gXCJpbXBsZW1lbnRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHdvcmRzW3cgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHcgPSB3b3Jkcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRyaW0oKSArIFwiLmphdmFcIjtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQuc3Vic3RyaW5nKGltcG9ydEluZGV4LCBlbmRJbmRleCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpbXBvcnRJbmRleCA9IGVuZEluZGV4O1xuICAgICAgICAgICAgICAgIGVuZE9mTGFzdENvbW1lbnRCZWZvcmVDbGFzc0JlZ2lucyA9IGVuZEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGFzc2VzO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVuZXNjYXBlSHRtbChzYWZlKSB7XG4gICAgaWYgKHNhZmUpIHtcbiAgICAgICAgcmV0dXJuIHNhZmVcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mYW1wOy9nLCBcIiZcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mbHQ7L2csIFwiPFwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyZndDsvZywgXCI+XCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvJnF1b3Q7L2csICdcIicpXG4gICAgICAgICAgICAucmVwbGFjZSgvJiN4Mjc7L2csIFwiJ1wiKTtcbiAgICB9XG59XG4iLCIvKipcbiAqXG4gKiAgTUQ1IChNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0pXG4gKiAgaHR0cDovL3d3dy53ZWJ0b29sa2l0LmluZm8vXG4gKlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNRDUoc3RyaW5nKSB7XG4gICAgZnVuY3Rpb24gUm90YXRlTGVmdChsVmFsdWUsIGlTaGlmdEJpdHMpIHtcbiAgICAgICAgcmV0dXJuIChsVmFsdWUgPDwgaVNoaWZ0Qml0cykgfCAobFZhbHVlID4+PiAoMzIgLSBpU2hpZnRCaXRzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQWRkVW5zaWduZWQobFgsIGxZKSB7XG4gICAgICAgIHZhciBsWDQsIGxZNCwgbFg4LCBsWTgsIGxSZXN1bHQ7XG4gICAgICAgIGxYOCA9IGxYICYgMHg4MDAwMDAwMDtcbiAgICAgICAgbFk4ID0gbFkgJiAweDgwMDAwMDAwO1xuICAgICAgICBsWDQgPSBsWCAmIDB4NDAwMDAwMDA7XG4gICAgICAgIGxZNCA9IGxZICYgMHg0MDAwMDAwMDtcbiAgICAgICAgbFJlc3VsdCA9IChsWCAmIDB4M2ZmZmZmZmYpICsgKGxZICYgMHgzZmZmZmZmZik7XG4gICAgICAgIGlmIChsWDQgJiBsWTQpIHtcbiAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gMHg4MDAwMDAwMCBeIGxYOCBeIGxZODtcbiAgICAgICAgfVxuICAgICAgICBpZiAobFg0IHwgbFk0KSB7XG4gICAgICAgICAgICBpZiAobFJlc3VsdCAmIDB4NDAwMDAwMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbFJlc3VsdCBeIDB4YzAwMDAwMDAgXiBsWDggXiBsWTg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gMHg0MDAwMDAwMCBeIGxYOCBeIGxZODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gbFg4IF4gbFk4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRih4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiAoeCAmIHkpIHwgKH54ICYgeik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRyh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiB+eik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSCh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSSh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiB5IF4gKHggfCB+eik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRkYoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEYoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gR0coYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEcoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSEgoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEgoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSUkoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEkoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ29udmVydFRvV29yZEFycmF5KHN0cmluZykge1xuICAgICAgICB2YXIgbFdvcmRDb3VudDtcbiAgICAgICAgdmFyIGxNZXNzYWdlTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgdmFyIGxOdW1iZXJPZldvcmRzX3RlbXAxID0gbE1lc3NhZ2VMZW5ndGggKyA4O1xuICAgICAgICB2YXIgbE51bWJlck9mV29yZHNfdGVtcDIgPVxuICAgICAgICAgICAgKGxOdW1iZXJPZldvcmRzX3RlbXAxIC0gKGxOdW1iZXJPZldvcmRzX3RlbXAxICUgNjQpKSAvIDY0O1xuICAgICAgICB2YXIgbE51bWJlck9mV29yZHMgPSAobE51bWJlck9mV29yZHNfdGVtcDIgKyAxKSAqIDE2O1xuICAgICAgICB2YXIgbFdvcmRBcnJheSA9IEFycmF5KGxOdW1iZXJPZldvcmRzIC0gMSk7XG4gICAgICAgIHZhciBsQnl0ZVBvc2l0aW9uID0gMDtcbiAgICAgICAgdmFyIGxCeXRlQ291bnQgPSAwO1xuICAgICAgICB3aGlsZSAobEJ5dGVDb3VudCA8IGxNZXNzYWdlTGVuZ3RoKSB7XG4gICAgICAgICAgICBsV29yZENvdW50ID0gKGxCeXRlQ291bnQgLSAobEJ5dGVDb3VudCAlIDQpKSAvIDQ7XG4gICAgICAgICAgICBsQnl0ZVBvc2l0aW9uID0gKGxCeXRlQ291bnQgJSA0KSAqIDg7XG4gICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdID1cbiAgICAgICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdIHxcbiAgICAgICAgICAgICAgICAoc3RyaW5nLmNoYXJDb2RlQXQobEJ5dGVDb3VudCkgPDwgbEJ5dGVQb3NpdGlvbik7XG4gICAgICAgICAgICBsQnl0ZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgbFdvcmRDb3VudCA9IChsQnl0ZUNvdW50IC0gKGxCeXRlQ291bnQgJSA0KSkgLyA0O1xuICAgICAgICBsQnl0ZVBvc2l0aW9uID0gKGxCeXRlQ291bnQgJSA0KSAqIDg7XG4gICAgICAgIGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gPVxuICAgICAgICAgICAgbFdvcmRBcnJheVtsV29yZENvdW50XSB8ICgweDgwIDw8IGxCeXRlUG9zaXRpb24pO1xuICAgICAgICBsV29yZEFycmF5W2xOdW1iZXJPZldvcmRzIC0gMl0gPSBsTWVzc2FnZUxlbmd0aCA8PCAzO1xuICAgICAgICBsV29yZEFycmF5W2xOdW1iZXJPZldvcmRzIC0gMV0gPSBsTWVzc2FnZUxlbmd0aCA+Pj4gMjk7XG4gICAgICAgIHJldHVybiBsV29yZEFycmF5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFdvcmRUb0hleChsVmFsdWUpIHtcbiAgICAgICAgdmFyIFdvcmRUb0hleFZhbHVlID0gXCJcIixcbiAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAgPSBcIlwiLFxuICAgICAgICAgICAgbEJ5dGUsXG4gICAgICAgICAgICBsQ291bnQ7XG4gICAgICAgIGZvciAobENvdW50ID0gMDsgbENvdW50IDw9IDM7IGxDb3VudCsrKSB7XG4gICAgICAgICAgICBsQnl0ZSA9IChsVmFsdWUgPj4+IChsQ291bnQgKiA4KSkgJiAyNTU7XG4gICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZV90ZW1wID0gXCIwXCIgKyBsQnl0ZS50b1N0cmluZygxNik7XG4gICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZSA9XG4gICAgICAgICAgICAgICAgV29yZFRvSGV4VmFsdWUgK1xuICAgICAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAuc3Vic3RyKFdvcmRUb0hleFZhbHVlX3RlbXAubGVuZ3RoIC0gMiwgMik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdvcmRUb0hleFZhbHVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFV0ZjhFbmNvZGUoc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXHJcXG4vZywgXCJcXG5cIik7XG4gICAgICAgIHZhciB1dGZ0ZXh0ID0gXCJcIjtcblxuICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHN0cmluZy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChuKTtcblxuICAgICAgICAgICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPiAxMjcgJiYgYyA8IDIwNDgpIHtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgPj4gNikgfCAxOTIpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiAxMikgfCAyMjQpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgPj4gNikgJiA2MykgfCAxMjgpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXRmdGV4dDtcbiAgICB9XG5cbiAgICB2YXIgeCA9IEFycmF5KCk7XG4gICAgdmFyIGssIEFBLCBCQiwgQ0MsIERELCBhLCBiLCBjLCBkO1xuICAgIHZhciBTMTEgPSA3LFxuICAgICAgICBTMTIgPSAxMixcbiAgICAgICAgUzEzID0gMTcsXG4gICAgICAgIFMxNCA9IDIyO1xuICAgIHZhciBTMjEgPSA1LFxuICAgICAgICBTMjIgPSA5LFxuICAgICAgICBTMjMgPSAxNCxcbiAgICAgICAgUzI0ID0gMjA7XG4gICAgdmFyIFMzMSA9IDQsXG4gICAgICAgIFMzMiA9IDExLFxuICAgICAgICBTMzMgPSAxNixcbiAgICAgICAgUzM0ID0gMjM7XG4gICAgdmFyIFM0MSA9IDYsXG4gICAgICAgIFM0MiA9IDEwLFxuICAgICAgICBTNDMgPSAxNSxcbiAgICAgICAgUzQ0ID0gMjE7XG5cbiAgICBzdHJpbmcgPSBVdGY4RW5jb2RlKHN0cmluZyk7XG5cbiAgICB4ID0gQ29udmVydFRvV29yZEFycmF5KHN0cmluZyk7XG5cbiAgICBhID0gMHg2NzQ1MjMwMTtcbiAgICBiID0gMHhlZmNkYWI4OTtcbiAgICBjID0gMHg5OGJhZGNmZTtcbiAgICBkID0gMHgxMDMyNTQ3NjtcblxuICAgIGZvciAoayA9IDA7IGsgPCB4Lmxlbmd0aDsgayArPSAxNikge1xuICAgICAgICBBQSA9IGE7XG4gICAgICAgIEJCID0gYjtcbiAgICAgICAgQ0MgPSBjO1xuICAgICAgICBERCA9IGQ7XG4gICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCB4W2sgKyAwXSwgUzExLCAweGQ3NmFhNDc4KTtcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDFdLCBTMTIsIDB4ZThjN2I3NTYpO1xuICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgeFtrICsgMl0sIFMxMywgMHgyNDIwNzBkYik7XG4gICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCB4W2sgKyAzXSwgUzE0LCAweGMxYmRjZWVlKTtcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDRdLCBTMTEsIDB4ZjU3YzBmYWYpO1xuICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgNV0sIFMxMiwgMHg0Nzg3YzYyYSk7XG4gICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCB4W2sgKyA2XSwgUzEzLCAweGE4MzA0NjEzKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDddLCBTMTQsIDB4ZmQ0Njk1MDEpO1xuICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgeFtrICsgOF0sIFMxMSwgMHg2OTgwOThkOCk7XG4gICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCB4W2sgKyA5XSwgUzEyLCAweDhiNDRmN2FmKTtcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDEwXSwgUzEzLCAweGZmZmY1YmIxKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDExXSwgUzE0LCAweDg5NWNkN2JlKTtcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDEyXSwgUzExLCAweDZiOTAxMTIyKTtcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDEzXSwgUzEyLCAweGZkOTg3MTkzKTtcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDE0XSwgUzEzLCAweGE2Nzk0MzhlKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDE1XSwgUzE0LCAweDQ5YjQwODIxKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDFdLCBTMjEsIDB4ZjYxZTI1NjIpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgNl0sIFMyMiwgMHhjMDQwYjM0MCk7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAxMV0sIFMyMywgMHgyNjVlNWE1MSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyAwXSwgUzI0LCAweGU5YjZjN2FhKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDVdLCBTMjEsIDB4ZDYyZjEwNWQpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMTBdLCBTMjIsIDB4MjQ0MTQ1Myk7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAxNV0sIFMyMywgMHhkOGExZTY4MSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyA0XSwgUzI0LCAweGU3ZDNmYmM4KTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDldLCBTMjEsIDB4MjFlMWNkZTYpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMTRdLCBTMjIsIDB4YzMzNzA3ZDYpO1xuICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgeFtrICsgM10sIFMyMywgMHhmNGQ1MGQ4Nyk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyA4XSwgUzI0LCAweDQ1NWExNGVkKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDEzXSwgUzIxLCAweGE5ZTNlOTA1KTtcbiAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIHhbayArIDJdLCBTMjIsIDB4ZmNlZmEzZjgpO1xuICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgeFtrICsgN10sIFMyMywgMHg2NzZmMDJkOSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyAxMl0sIFMyNCwgMHg4ZDJhNGM4YSk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyA1XSwgUzMxLCAweGZmZmEzOTQyKTtcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDhdLCBTMzIsIDB4ODc3MWY2ODEpO1xuICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgeFtrICsgMTFdLCBTMzMsIDB4NmQ5ZDYxMjIpO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMTRdLCBTMzQsIDB4ZmRlNTM4MGMpO1xuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgMV0sIFMzMSwgMHhhNGJlZWE0NCk7XG4gICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCB4W2sgKyA0XSwgUzMyLCAweDRiZGVjZmE5KTtcbiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIHhbayArIDddLCBTMzMsIDB4ZjZiYjRiNjApO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMTBdLCBTMzQsIDB4YmViZmJjNzApO1xuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgMTNdLCBTMzEsIDB4Mjg5YjdlYzYpO1xuICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgeFtrICsgMF0sIFMzMiwgMHhlYWExMjdmYSk7XG4gICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyAzXSwgUzMzLCAweGQ0ZWYzMDg1KTtcbiAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIHhbayArIDZdLCBTMzQsIDB4NDg4MWQwNSk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyA5XSwgUzMxLCAweGQ5ZDRkMDM5KTtcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDEyXSwgUzMyLCAweGU2ZGI5OWU1KTtcbiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIHhbayArIDE1XSwgUzMzLCAweDFmYTI3Y2Y4KTtcbiAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIHhbayArIDJdLCBTMzQsIDB4YzRhYzU2NjUpO1xuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgMF0sIFM0MSwgMHhmNDI5MjI0NCk7XG4gICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCB4W2sgKyA3XSwgUzQyLCAweDQzMmFmZjk3KTtcbiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIHhbayArIDE0XSwgUzQzLCAweGFiOTQyM2E3KTtcbiAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDVdLCBTNDQsIDB4ZmM5M2EwMzkpO1xuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgMTJdLCBTNDEsIDB4NjU1YjU5YzMpO1xuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgM10sIFM0MiwgMHg4ZjBjY2M5Mik7XG4gICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyAxMF0sIFM0MywgMHhmZmVmZjQ3ZCk7XG4gICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCB4W2sgKyAxXSwgUzQ0LCAweDg1ODQ1ZGQxKTtcbiAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIHhbayArIDhdLCBTNDEsIDB4NmZhODdlNGYpO1xuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgMTVdLCBTNDIsIDB4ZmUyY2U2ZTApO1xuICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgeFtrICsgNl0sIFM0MywgMHhhMzAxNDMxNCk7XG4gICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCB4W2sgKyAxM10sIFM0NCwgMHg0ZTA4MTFhMSk7XG4gICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyA0XSwgUzQxLCAweGY3NTM3ZTgyKTtcbiAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIHhbayArIDExXSwgUzQyLCAweGJkM2FmMjM1KTtcbiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIHhbayArIDJdLCBTNDMsIDB4MmFkN2QyYmIpO1xuICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgeFtrICsgOV0sIFM0NCwgMHhlYjg2ZDM5MSk7XG4gICAgICAgIGEgPSBBZGRVbnNpZ25lZChhLCBBQSk7XG4gICAgICAgIGIgPSBBZGRVbnNpZ25lZChiLCBCQik7XG4gICAgICAgIGMgPSBBZGRVbnNpZ25lZChjLCBDQyk7XG4gICAgICAgIGQgPSBBZGRVbnNpZ25lZChkLCBERCk7XG4gICAgfVxuXG4gICAgdmFyIHRlbXAgPSBXb3JkVG9IZXgoYSkgKyBXb3JkVG9IZXgoYikgKyBXb3JkVG9IZXgoYykgKyBXb3JkVG9IZXgoZCk7XG5cbiAgICByZXR1cm4gdGVtcC50b0xvd2VyQ2FzZSgpO1xufVxuIiwiU2suYnVpbHRpbkZpbGVzPXtcImZpbGVzXCI6e1wic3JjL2J1aWx0aW4vc3lzLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYixhPU1hdGgucG93LGM9e30sZD1bXSxlPVNrLmdldFN5c0FyZ3YoKTtmb3IoYj0wO2I8ZS5sZW5ndGg7KytiKWQucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZVtiXSkpO3JldHVybiBjLmFyZ3Y9bmV3IFNrLmJ1aWx0aW5zLmxpc3QoZCksYy5jb3B5cmlnaHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJDb3B5cmlnaHQgMjAwOS0yMDEwIFNjb3R0IEdyYWhhbS5cXFxcbkFsbCBSaWdodHMgUmVzZXJ2ZWQuXFxcXG5cXFwiKSxTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGMudmVyc2lvbj1cXFwiMy43KGlzaCkgW1NrdWxwdF1cXFwiLGMudmVyc2lvbl9pbmZvPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKDMpLG5ldyBTay5idWlsdGluLmludF8oNyldKSk6KGMudmVyc2lvbj1cXFwiMi43KGlzaCkgW1NrdWxwdF1cXFwiLGMudmVyc2lvbl9pbmZvPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKDIpLG5ldyBTay5idWlsdGluLmludF8oNyldKSksYy5tYXhpbnQ9bmV3IFNrLmJ1aWx0aW4uaW50XyhhKDIsNTMpLTEpLGMubWF4c2l6ZT1uZXcgU2suYnVpbHRpbi5pbnRfKGEoMiw1MyktMSksYy5tb2R1bGVzPVNrLnN5c21vZHVsZXMsYy5wYXRoPVNrLnJlYWxzeXNwYXRoLGMuZ2V0RXhlY3V0aW9uTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBudWxsPT09U2suZXhlY0xpbWl0P1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmV4ZWNMaW1pdCl9KSxjLnNldEV4ZWN1dGlvbkxpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYobnVsbD09PVNrLmV4ZWNMaW1pdCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJFeGVjdXRpb24gbGltaXRpbmcgaXMgbm90IGVuYWJsZWRcXFwiKTt2b2lkIDAhPT1hJiYoU2suZXhlY0xpbWl0PVNrLmJ1aWx0aW4uYXNudW0kKGEpKX0pLGMucmVzZXRUaW1lb3V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5leGVjU3RhcnQ9bmV3IERhdGV9KSxjLmdldFlpZWxkTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBudWxsPT09U2sueWllbGRMaW1pdD9Tay5idWlsdGluLm5vbmUubm9uZSQ6bmV3IFNrLmJ1aWx0aW4uaW50XyhTay55aWVsZExpbWl0KX0pLGMuc2V0WWllbGRMaW1pdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2lmKG51bGw9PT1Tay55aWVsZExpbWl0KXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIllpZWxkaW5nIGlzIG5vdCBlbmFibGVkXFxcIik7dm9pZCAwIT09YSYmKFNrLnlpZWxkTGltaXQ9U2suYnVpbHRpbi5hc251bSQoYSkpfSksYy5kZWJ1Zz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuX19zdGRvdXRfXz1uZXcgU2suYnVpbHRpbi5maWxlKG5ldyBTay5idWlsdGluLnN0cihcXFwiL2Rldi9zdGRvdXRcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIndcXFwiKSksYy5fX3N0ZGluX189bmV3IFNrLmJ1aWx0aW4uZmlsZShuZXcgU2suYnVpbHRpbi5zdHIoXFxcIi9kZXYvc3RkaW5cXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcInJcXFwiKSksYy5zdGRvdXQ9Yy5fX3N0ZG91dF9fLGMuc3RkaW49Yy5fX3N0ZGluX18sY307XCIsXCJzcmMvYnVpbHRpbi90aGlzLnB5XCI6XCJzID0gXFxcIlxcXCJcXFwiR3VyIE1yYSBicyBDbGd1YmEsIG9sIEd2eiBDcmdyZWZcXG5cXG5Pcm5oZ3ZzaHkgdmYgb3JnZ3JlIGd1bmEgaHR5bC5cXG5Sa2N5dnB2ZyB2ZiBvcmdncmUgZ3VuYSB2emN5dnB2Zy5cXG5GdnpjeXIgdmYgb3JnZ3JlIGd1bmEgcGJ6Y3lyay5cXG5QYnpjeXJrIHZmIG9yZ2dyZSBndW5hIHBiemN5dnBuZ3JxLlxcblN5bmcgdmYgb3JnZ3JlIGd1bmEgYXJmZ3JxLlxcbkZjbmVmciB2ZiBvcmdncmUgZ3VuYSBxcmFmci5cXG5Fcm5xbm92eXZnbCBwYmhhZ2YuXFxuRmNycHZueSBwbmZyZiBuZXJhJ2cgZmNycHZueSByYWJodHUgZ2Igb2VybnggZ3VyIGVoeXJmLlxcbk55Z3ViaHR1IGNlbnBndnBueXZnbCBvcm5nZiBjaGV2Z2wuXFxuUmVlYmVmIGZ1Ymh5cSBhcmlyZSBjbmZmIGZ2eXJhZ3lsLlxcbkhheXJmZiBya2N5dnB2Z3lsIGZ2eXJhcHJxLlxcblZhIGd1ciBzbnByIGJzIG56b3Z0aHZnbCwgZXJzaGZyIGd1ciBncnpjZ25ndmJhIGdiIHRocmZmLlxcbkd1cmVyIGZ1Ymh5cSBvciBiYXItLSBuYXEgY2Vyc3Jlbm95bCBiYXlsIGJhciAtLWJvaXZiaGYgam5sIGdiIHFiIHZnLlxcbk55Z3ViaHR1IGd1bmcgam5sIHpubCBhYmcgb3IgYm9pdmJoZiBuZyBzdmVmZyBoYXlyZmYgbGJoJ2VyIFFoZ3B1LlxcbkFiaiB2ZiBvcmdncmUgZ3VuYSBhcmlyZS5cXG5OeWd1Ymh0dSBhcmlyZSB2ZiBic2dyYSBvcmdncmUgZ3VuYSAqZXZ0dWcqIGFiai5cXG5WcyBndXIgdnpjeXJ6cmFnbmd2YmEgdmYgdW5lcSBnYiBya2N5bnZhLCB2ZydmIG4gb25xIHZxcm4uXFxuVnMgZ3VyIHZ6Y3lyenJhZ25ndmJhIHZmIHJuZmwgZ2IgcmtjeW52YSwgdmcgem5sIG9yIG4gdGJicSB2cXJuLlxcbkFuenJmY25wcmYgbmVyIGJhciB1YmF4dmF0IHRlcm5nIHZxcm4gLS0geXJnJ2YgcWIgemJlciBicyBndWJmciFcXFwiXFxcIlxcXCJcXG5cXG5kID0ge31cXG5mb3IgYyBpbiAoNjUsIDk3KTpcXG4gICAgZm9yIGkgaW4gcmFuZ2UoMjYpOlxcbiAgICAgICAgZFtjaHIoaStjKV0gPSBjaHIoKGkrMTMpICUgMjYgKyBjKVxcblxcbnByaW50KFxcXCJcXFwiLmpvaW4oW2QuZ2V0KGMsIGMpIGZvciBjIGluIHNdKSlcXG5cIixcInNyYy9saWIvQmFzZUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkJhc2VIVFRQU2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvQmFzdGlvbi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQmFzdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0NHSUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNHSUhUVFBTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Db25maWdQYXJzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNvbmZpZ1BhcnNlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0Nvb2tpZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQ29va2llIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvRG9jWE1MUlBDU2VydmVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJEb2NYTUxSUENTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9IVE1MUGFyc2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJIVE1MUGFyc2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvTWltZVdyaXRlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiTWltZVdyaXRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1F1ZXVlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJRdWV1ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1NpbXBsZUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNpbXBsZUhUVFBTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9TaW1wbGVYTUxSUENTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNpbXBsZVhNTFJQQ1NlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1NvY2tldFNlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU29ja2V0U2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvU3RyaW5nSU8ucHlcIjpcInJcXFwiXFxcIlxcXCJGaWxlLWxpa2Ugb2JqZWN0cyB0aGF0IHJlYWQgZnJvbSBvciB3cml0ZSB0byBhIHN0cmluZyBidWZmZXIuXFxuXFxuVGhpcyBpbXBsZW1lbnRzIChuZWFybHkpIGFsbCBzdGRpbyBtZXRob2RzLlxcblxcbmYgPSBTdHJpbmdJTygpICAgICAgIyByZWFkeSBmb3Igd3JpdGluZ1xcbmYgPSBTdHJpbmdJTyhidWYpICAgIyByZWFkeSBmb3IgcmVhZGluZ1xcbmYuY2xvc2UoKSAgICAgICAgICAgIyBleHBsaWNpdGx5IHJlbGVhc2UgcmVzb3VyY2VzIGhlbGRcXG5mbGFnID0gZi5pc2F0dHkoKSAgICMgYWx3YXlzIGZhbHNlXFxucG9zID0gZi50ZWxsKCkgICAgICAjIGdldCBjdXJyZW50IHBvc2l0aW9uXFxuZi5zZWVrKHBvcykgICAgICAgICAjIHNldCBjdXJyZW50IHBvc2l0aW9uXFxuZi5zZWVrKHBvcywgbW9kZSkgICAjIG1vZGUgMDogYWJzb2x1dGU7IDE6IHJlbGF0aXZlOyAyOiByZWxhdGl2ZSB0byBFT0ZcXG5idWYgPSBmLnJlYWQoKSAgICAgICMgcmVhZCB1bnRpbCBFT0ZcXG5idWYgPSBmLnJlYWQobikgICAgICMgcmVhZCB1cCB0byBuIGJ5dGVzXFxuYnVmID0gZi5yZWFkbGluZSgpICAjIHJlYWQgdW50aWwgZW5kIG9mIGxpbmUgKCdcXFxcbicpIG9yIEVPRlxcbmxpc3QgPSBmLnJlYWRsaW5lcygpIyBsaXN0IG9mIGYucmVhZGxpbmUoKSByZXN1bHRzIHVudGlsIEVPRlxcbmYudHJ1bmNhdGUoW3NpemVdKSAgIyB0cnVuY2F0ZSBmaWxlIGF0IHRvIGF0IG1vc3Qgc2l6ZSAoZGVmYXVsdDogY3VycmVudCBwb3MpXFxuZi53cml0ZShidWYpICAgICAgICAjIHdyaXRlIGF0IGN1cnJlbnQgcG9zaXRpb25cXG5mLndyaXRlbGluZXMobGlzdCkgICMgZm9yIGxpbmUgaW4gbGlzdDogZi53cml0ZShsaW5lKVxcbmYuZ2V0dmFsdWUoKSAgICAgICAgIyByZXR1cm4gd2hvbGUgZmlsZSdzIGNvbnRlbnRzIGFzIGEgc3RyaW5nXFxuXFxuTm90ZXM6XFxuLSBVc2luZyBhIHJlYWwgZmlsZSBpcyBvZnRlbiBmYXN0ZXIgKGJ1dCBsZXNzIGNvbnZlbmllbnQpLlxcbi0gVGhlcmUncyBhbHNvIGEgbXVjaCBmYXN0ZXIgaW1wbGVtZW50YXRpb24gaW4gQywgY2FsbGVkIGNTdHJpbmdJTywgYnV0XFxuICBpdCdzIG5vdCBzdWJjbGFzc2FibGUuXFxuLSBmaWxlbm8oKSBpcyBsZWZ0IHVuaW1wbGVtZW50ZWQgc28gdGhhdCBjb2RlIHdoaWNoIHVzZXMgaXQgdHJpZ2dlcnNcXG4gIGFuIGV4Y2VwdGlvbiBlYXJseS5cXG4tIFNlZWtpbmcgZmFyIGJleW9uZCBFT0YgYW5kIHRoZW4gd3JpdGluZyB3aWxsIGluc2VydCByZWFsIG51bGxcXG4gIGJ5dGVzIHRoYXQgb2NjdXB5IHNwYWNlIGluIHRoZSBidWZmZXIuXFxuLSBUaGVyZSdzIGEgc2ltcGxlIHRlc3Qgc2V0IChzZWUgZW5kIG9mIHRoaXMgZmlsZSkuXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFtcXFwiU3RyaW5nSU9cXFwiXVxcblxcbmRlZiBfY29tcGxhaW5faWZjbG9zZWQoY2xvc2VkKTpcXG4gICAgaWYgY2xvc2VkOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVxcXCIpXFxuXFxuY2xhc3MgU3RyaW5nSU86XFxuICAgIFxcXCJcXFwiXFxcImNsYXNzIFN0cmluZ0lPKFtidWZmZXJdKVxcblxcbiAgICBXaGVuIGEgU3RyaW5nSU8gb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IGNhbiBiZSBpbml0aWFsaXplZCB0byBhbiBleGlzdGluZ1xcbiAgICBzdHJpbmcgYnkgcGFzc2luZyB0aGUgc3RyaW5nIHRvIHRoZSBjb25zdHJ1Y3Rvci4gSWYgbm8gc3RyaW5nIGlzIGdpdmVuLFxcbiAgICB0aGUgU3RyaW5nSU8gd2lsbCBzdGFydCBlbXB0eS5cXG5cXG4gICAgVGhlIFN0cmluZ0lPIG9iamVjdCBjYW4gYWNjZXB0IGVpdGhlciBVbmljb2RlIG9yIDgtYml0IHN0cmluZ3MsIGJ1dFxcbiAgICBtaXhpbmcgdGhlIHR3byBtYXkgdGFrZSBzb21lIGNhcmUuIElmIGJvdGggYXJlIHVzZWQsIDgtYml0IHN0cmluZ3MgdGhhdFxcbiAgICBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgNy1iaXQgQVNDSUkgKHRoYXQgdXNlIHRoZSA4dGggYml0KSB3aWxsIGNhdXNlXFxuICAgIGEgVW5pY29kZUVycm9yIHRvIGJlIHJhaXNlZCB3aGVuIGdldHZhbHVlKCkgaXMgY2FsbGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1ZiA9ICcnKTpcXG4gICAgICAgICMgRm9yY2Ugc2VsZi5idWYgdG8gYmUgYSBzdHJpbmcgb3IgdW5pY29kZVxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVmLCBzdHIpOlxcbiAgICAgICAgICAgIGJ1ZiA9IHN0cihidWYpXFxuICAgICAgICBzZWxmLmJ1ZiA9IGJ1ZlxcbiAgICAgICAgc2VsZi5sZW4gPSBsZW4oYnVmKVxcbiAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIHNlbGYucG9zID0gMFxcbiAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZVxcbiAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSAwXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBuZXh0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQSBmaWxlIG9iamVjdCBpcyBpdHMgb3duIGl0ZXJhdG9yLCBmb3IgZXhhbXBsZSBpdGVyKGYpIHJldHVybnMgZlxcbiAgICAgICAgKHVubGVzcyBmIGlzIGNsb3NlZCkuIFdoZW4gYSBmaWxlIGlzIHVzZWQgYXMgYW4gaXRlcmF0b3IsIHR5cGljYWxseVxcbiAgICAgICAgaW4gYSBmb3IgbG9vcCAoZm9yIGV4YW1wbGUsIGZvciBsaW5lIGluIGY6IHByaW50IGxpbmUpLCB0aGUgbmV4dCgpXFxuICAgICAgICBtZXRob2QgaXMgY2FsbGVkIHJlcGVhdGVkbHkuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5leHQgaW5wdXQgbGluZSxcXG4gICAgICAgIG9yIHJhaXNlcyBTdG9wSXRlcmF0aW9uIHdoZW4gRU9GIGlzIGhpdC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgciA9IHNlbGYucmVhZGxpbmUoKVxcbiAgICAgICAgaWYgbm90IHI6XFxuICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvblxcbiAgICAgICAgcmV0dXJuIHJcXG5cXG4gICAgZGVmIGNsb3NlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRnJlZSB0aGUgbWVtb3J5IGJ1ZmZlci5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOlxcbiAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZVxcbiAgICAgICAgICAgIHNlbGYuYnVmID0gTm9uZVxcbiAgICAgICAgICAgIHNlbGYucG9zID0gTm9uZVxcblxcbiAgICBkZWYgaXNhdHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJucyBGYWxzZSBiZWNhdXNlIFN0cmluZ0lPIG9iamVjdHMgYXJlIG5vdCBjb25uZWN0ZWQgdG8gYVxcbiAgICAgICAgdHR5LWxpa2UgZGV2aWNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIHNlZWsoc2VsZiwgcG9zLCBtb2RlID0gMCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIGZpbGUncyBjdXJyZW50IHBvc2l0aW9uLlxcblxcbiAgICAgICAgVGhlIG1vZGUgYXJndW1lbnQgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIDAgKGFic29sdXRlIGZpbGVcXG4gICAgICAgIHBvc2l0aW9uaW5nKTsgb3RoZXIgdmFsdWVzIGFyZSAxIChzZWVrIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50XFxuICAgICAgICBwb3NpdGlvbikgYW5kIDIgKHNlZWsgcmVsYXRpdmUgdG8gdGhlIGZpbGUncyBlbmQpLlxcblxcbiAgICAgICAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIGlmIG1vZGUgPT0gMTpcXG4gICAgICAgICAgICBwb3MgKz0gc2VsZi5wb3NcXG4gICAgICAgIGVsaWYgbW9kZSA9PSAyOlxcbiAgICAgICAgICAgIHBvcyArPSBzZWxmLmxlblxcbiAgICAgICAgc2VsZi5wb3MgPSBtYXgoMCwgcG9zKVxcblxcbiAgICBkZWYgdGVsbChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgZmlsZSdzIGN1cnJlbnQgcG9zaXRpb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICByZXR1cm4gc2VsZi5wb3NcXG5cXG4gICAgZGVmIHJlYWQoc2VsZiwgbiA9IC0xKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlYWQgYXQgbW9zdCBzaXplIGJ5dGVzIGZyb20gdGhlIGZpbGVcXG4gICAgICAgIChsZXNzIGlmIHRoZSByZWFkIGhpdHMgRU9GIGJlZm9yZSBvYnRhaW5pbmcgc2l6ZSBieXRlcykuXFxuXFxuICAgICAgICBJZiB0aGUgc2l6ZSBhcmd1bWVudCBpcyBuZWdhdGl2ZSBvciBvbWl0dGVkLCByZWFkIGFsbCBkYXRhIHVudGlsIEVPRlxcbiAgICAgICAgaXMgcmVhY2hlZC4gVGhlIGJ5dGVzIGFyZSByZXR1cm5lZCBhcyBhIHN0cmluZyBvYmplY3QuIEFuIGVtcHR5XFxuICAgICAgICBzdHJpbmcgaXMgcmV0dXJuZWQgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgaW1tZWRpYXRlbHkuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdClcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgaWYgbiBpcyBOb25lIG9yIG4gPCAwOlxcbiAgICAgICAgICAgIG5ld3BvcyA9IHNlbGYubGVuXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld3BvcyA9IG1pbihzZWxmLnBvcytuLCBzZWxmLmxlbilcXG4gICAgICAgIHIgPSBzZWxmLmJ1ZltzZWxmLnBvczpuZXdwb3NdXFxuICAgICAgICBzZWxmLnBvcyA9IG5ld3Bvc1xcbiAgICAgICAgcmV0dXJuIHJcXG5cXG4gICAgZGVmIHJlYWRsaW5lKHNlbGYsIGxlbmd0aD1Ob25lKTpcXG4gICAgICAgIHJcXFwiXFxcIlxcXCJSZWFkIG9uZSBlbnRpcmUgbGluZSBmcm9tIHRoZSBmaWxlLlxcblxcbiAgICAgICAgQSB0cmFpbGluZyBuZXdsaW5lIGNoYXJhY3RlciBpcyBrZXB0IGluIHRoZSBzdHJpbmcgKGJ1dCBtYXkgYmUgYWJzZW50XFxuICAgICAgICB3aGVuIGEgZmlsZSBlbmRzIHdpdGggYW4gaW5jb21wbGV0ZSBsaW5lKS4gSWYgdGhlIHNpemUgYXJndW1lbnQgaXNcXG4gICAgICAgIHByZXNlbnQgYW5kIG5vbi1uZWdhdGl2ZSwgaXQgaXMgYSBtYXhpbXVtIGJ5dGUgY291bnQgKGluY2x1ZGluZyB0aGVcXG4gICAgICAgIHRyYWlsaW5nIG5ld2xpbmUpIGFuZCBhbiBpbmNvbXBsZXRlIGxpbmUgbWF5IGJlIHJldHVybmVkLlxcblxcbiAgICAgICAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIG9ubHkgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgaW1tZWRpYXRlbHkuXFxuXFxuICAgICAgICBOb3RlOiBVbmxpa2Ugc3RkaW8ncyBmZ2V0cygpLCB0aGUgcmV0dXJuZWQgc3RyaW5nIGNvbnRhaW5zIG51bGxcXG4gICAgICAgIGNoYXJhY3RlcnMgKCdcXFxcMCcpIGlmIHRoZXkgb2NjdXJyZWQgaW4gdGhlIGlucHV0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIGkgPSBzZWxmLmJ1Zi5maW5kKCdcXFxcbicsIHNlbGYucG9zKVxcbiAgICAgICAgaWYgaSA8IDA6XFxuICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5sZW5cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbmV3cG9zID0gaSsxXFxuICAgICAgICBpZiBsZW5ndGggaXMgbm90IE5vbmUgYW5kIGxlbmd0aCA+PSAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYucG9zICsgbGVuZ3RoIDwgbmV3cG9zOlxcbiAgICAgICAgICAgICAgICBuZXdwb3MgPSBzZWxmLnBvcyArIGxlbmd0aFxcbiAgICAgICAgciA9IHNlbGYuYnVmW3NlbGYucG9zOm5ld3Bvc11cXG4gICAgICAgIHNlbGYucG9zID0gbmV3cG9zXFxuICAgICAgICByZXR1cm4gclxcblxcbiAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemVoaW50ID0gMCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZWFkIHVudGlsIEVPRiB1c2luZyByZWFkbGluZSgpIGFuZCByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlXFxuICAgICAgICBsaW5lcyB0aHVzIHJlYWQuXFxuXFxuICAgICAgICBJZiB0aGUgb3B0aW9uYWwgc2l6ZWhpbnQgYXJndW1lbnQgaXMgcHJlc2VudCwgaW5zdGVhZCBvZiByZWFkaW5nIHVwXFxuICAgICAgICB0byBFT0YsIHdob2xlIGxpbmVzIHRvdGFsbGluZyBhcHByb3hpbWF0ZWx5IHNpemVoaW50IGJ5dGVzIChvciBtb3JlXFxuICAgICAgICB0byBhY2NvbW1vZGF0ZSBhIGZpbmFsIHdob2xlIGxpbmUpLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB0b3RhbCA9IDBcXG4gICAgICAgIGxpbmVzID0gW11cXG4gICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKClcXG4gICAgICAgIHdoaWxlIGxpbmU6XFxuICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpXFxuICAgICAgICAgICAgdG90YWwgKz0gbGVuKGxpbmUpXFxuICAgICAgICAgICAgaWYgMCA8IHNpemVoaW50IDw9IHRvdGFsOlxcbiAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKClcXG4gICAgICAgIHJldHVybiBsaW5lc1xcblxcbiAgICBkZWYgdHJ1bmNhdGUoc2VsZiwgc2l6ZT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRydW5jYXRlIHRoZSBmaWxlJ3Mgc2l6ZS5cXG5cXG4gICAgICAgIElmIHRoZSBvcHRpb25hbCBzaXplIGFyZ3VtZW50IGlzIHByZXNlbnQsIHRoZSBmaWxlIGlzIHRydW5jYXRlZCB0b1xcbiAgICAgICAgKGF0IG1vc3QpIHRoYXQgc2l6ZS4gVGhlIHNpemUgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uXFxuICAgICAgICBUaGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkIHVubGVzcyB0aGUgcG9zaXRpb25cXG4gICAgICAgIGlzIGJleW9uZCB0aGUgbmV3IGZpbGUgc2l6ZS5cXG5cXG4gICAgICAgIElmIHRoZSBzcGVjaWZpZWQgc2l6ZSBleGNlZWRzIHRoZSBmaWxlJ3MgY3VycmVudCBzaXplLCB0aGVcXG4gICAgICAgIGZpbGUgcmVtYWlucyB1bmNoYW5nZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNpemUgaXMgTm9uZTpcXG4gICAgICAgICAgICBzaXplID0gc2VsZi5wb3NcXG4gICAgICAgIGVsaWYgc2l6ZSA8IDA6XFxuICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigyMiwgXFxcIk5lZ2F0aXZlIHNpemUgbm90IGFsbG93ZWRcXFwiKVxcbiAgICAgICAgZWxpZiBzaXplIDwgc2VsZi5wb3M6XFxuICAgICAgICAgICAgc2VsZi5wb3MgPSBzaXplXFxuICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuZ2V0dmFsdWUoKVs6c2l6ZV1cXG4gICAgICAgIHNlbGYubGVuID0gc2l6ZVxcblxcbiAgICBkZWYgd3JpdGUoc2VsZiwgcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJXcml0ZSBhIHN0cmluZyB0byB0aGUgZmlsZS5cXG5cXG4gICAgICAgIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgaWYgbm90IHM6IHJldHVyblxcbiAgICAgICAgIyBGb3JjZSBzIHRvIGJlIGEgc3RyaW5nIG9yIHVuaWNvZGVcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHN0cik6XFxuICAgICAgICAgICAgcyA9IHN0cihzKVxcbiAgICAgICAgc3BvcyA9IHNlbGYucG9zXFxuICAgICAgICBzbGVuID0gc2VsZi5sZW5cXG4gICAgICAgIGlmIHNwb3MgPT0gc2xlbjpcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKHMpXFxuICAgICAgICAgICAgc2VsZi5sZW4gPSBzZWxmLnBvcyA9IHNwb3MgKyBsZW4ocylcXG4gICAgICAgICAgICByZXR1cm5cXG4gICAgICAgIGlmIHNwb3MgPiBzbGVuOlxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQoJ1xcXFwwJyooc3BvcyAtIHNsZW4pKVxcbiAgICAgICAgICAgIHNsZW4gPSBzcG9zXFxuICAgICAgICBuZXdwb3MgPSBzcG9zICsgbGVuKHMpXFxuICAgICAgICBpZiBzcG9zIDwgc2xlbjpcXG4gICAgICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KVxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtzZWxmLmJ1Zls6c3Bvc10sIHMsIHNlbGYuYnVmW25ld3BvczpdXVxcbiAgICAgICAgICAgIHNlbGYuYnVmID0gJydcXG4gICAgICAgICAgICBpZiBuZXdwb3MgPiBzbGVuOlxcbiAgICAgICAgICAgICAgICBzbGVuID0gbmV3cG9zXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQocylcXG4gICAgICAgICAgICBzbGVuID0gbmV3cG9zXFxuICAgICAgICBzZWxmLmxlbiA9IHNsZW5cXG4gICAgICAgIHNlbGYucG9zID0gbmV3cG9zXFxuXFxuICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGl0ZXJhYmxlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIldyaXRlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB0byB0aGUgZmlsZS4gVGhlIHNlcXVlbmNlIGNhbiBiZSBhbnlcXG4gICAgICAgIGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgc3RyaW5ncywgdHlwaWNhbGx5IGEgbGlzdCBvZiBzdHJpbmdzLiBUaGVyZVxcbiAgICAgICAgaXMgbm8gcmV0dXJuIHZhbHVlLlxcblxcbiAgICAgICAgKFRoZSBuYW1lIGlzIGludGVuZGVkIHRvIG1hdGNoIHJlYWRsaW5lcygpOyB3cml0ZWxpbmVzKCkgZG9lcyBub3QgYWRkXFxuICAgICAgICBsaW5lIHNlcGFyYXRvcnMuKVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGVcXG4gICAgICAgIGZvciBsaW5lIGluIGl0ZXJhYmxlOlxcbiAgICAgICAgICAgIHdyaXRlKGxpbmUpXFxuXFxuICAgIGRlZiBmbHVzaChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZsdXNoIHRoZSBpbnRlcm5hbCBidWZmZXJcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcblxcbiAgICBkZWYgZ2V0dmFsdWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIFJldHJpZXZlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIFxcXCJmaWxlXFxcIiBhdCBhbnkgdGltZSBiZWZvcmVcXG4gICAgICAgIHRoZSBTdHJpbmdJTyBvYmplY3QncyBjbG9zZSgpIG1ldGhvZCBpcyBjYWxsZWQuXFxuXFxuICAgICAgICBUaGUgU3RyaW5nSU8gb2JqZWN0IGNhbiBhY2NlcHQgZWl0aGVyIFVuaWNvZGUgb3IgOC1iaXQgc3RyaW5ncyxcXG4gICAgICAgIGJ1dCBtaXhpbmcgdGhlIHR3byBtYXkgdGFrZSBzb21lIGNhcmUuIElmIGJvdGggYXJlIHVzZWQsIDgtYml0XFxuICAgICAgICBzdHJpbmdzIHRoYXQgY2Fubm90IGJlIGludGVycHJldGVkIGFzIDctYml0IEFTQ0lJICh0aGF0IHVzZSB0aGVcXG4gICAgICAgIDh0aCBiaXQpIHdpbGwgY2F1c2UgYSBVbmljb2RlRXJyb3IgdG8gYmUgcmFpc2VkIHdoZW4gZ2V0dmFsdWUoKVxcbiAgICAgICAgaXMgY2FsbGVkLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIHJldHVybiBzZWxmLmJ1ZlxcblwiLFwic3JjL2xpYi9Vc2VyRGljdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiVXNlckRpY3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Vc2VyTGlzdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiVXNlckxpc3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Vc2VyU3RyaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJVc2VyU3RyaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX0xXUENvb2tpZUphci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX0xXUENvb2tpZUphciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19Nb3ppbGxhQ29va2llSmFyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfTW96aWxsYUNvb2tpZUphciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19fZnV0dXJlX18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9fZnV0dXJlX18gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fX3BoZWxsb19fLmZvby5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX19waGVsbG9fXy5mb28gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fYWJjb2xsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfYWJjb2xsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX3N0cnB0aW1lLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfc3RycHRpbWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fdGhyZWFkaW5nX2xvY2FsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfdGhyZWFkaW5nX2xvY2FsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYWJjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhYmMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9haWZjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhaWZjIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYWx0YWlyL19faW5pdF9fLnB5XCI6XCJpbXBvcnQgcmFuZG9tXFxuXFxudHJ5OlxcbiAgICBmcm9tIHZlZ2FfY2FsbGVyIGltcG9ydCByZW5kZXJfZ3JhcGhcXG5leGNlcHQ6XFxuICAgIHByaW50KFxcXCJNb2NrIHJlbmRlclxcXCIpXFxuXFxuICAgIGRlZiByZW5kZXJfZ3JhcGgoanMpOlxcbiAgICAgICAgcHJpbnQoanMpXFxuXFxuXFxuY2xhc3MgQ2hhcnQ6XFxuICAgICMgVE9ETyBhbGxvdyBkYXRhIHRvIGJlIHNwZWNpZmllZCBhcyBhIFVSTCB0byBhIENTViBvciBEQiBvciBqc29uXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCB0aXRsZT1Ob25lKTpcXG4gICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZVxcbiAgICAgICAgc2VsZi5kYXRhX2lkID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwMDAwLCA1MDAwMDAwKVxcbiAgICAgICAgc2VsZi5kc25hbWUgPSBcXFwiZGF0YS17fVxcXCIuZm9ybWF0KHNlbGYuZGF0YV9pZClcXG4gICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6XFxuICAgICAgICAgICAgc2VsZi5kYXRhID0gRGF0YSgqKmRhdGEpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGFcXG5cXG4gICAgICAgIHNlbGYuanNvbiA9IHt9XFxuICAgICAgICBzZWxmLmpzb25bXFxcIiRzY2hlbWFcXFwiXSA9IFxcXCJodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3NjaGVtYS92ZWdhLWxpdGUvdjIuNS5qc29uXFxcIlxcbiAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhXFxcIl0gPSB7fVxcbiAgICAgICAgaWYgc2VsZi50aXRsZTpcXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcInRpdGxlXFxcIl0gPSBzZWxmLnRpdGxlXFxuXFxuICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFcXFwiXSA9IHtcXFwidmFsdWVzXFxcIjogc2VsZi5kYXRhLnZhbHN9XFxuICAgICAgICBzZWxmLmlzX2NvbXBvc2l0ZSA9IEZhbHNlXFxuXFxuICAgICMgbWFyayBjYW4gYmUgYSBzaW1wbGUgc3RyaW5nIG9yIGEgZGljdGlvbmFyeVxcbiAgICAjIFxcXCJtYXJrXFxcIjoge1xcXCJjb2xvclxcXCI6IFxcXCJncmVlblxcXCIsIFxcXCJvcGFjaXR5XFxcIjogMC4yLCBcXFwidHlwZVxcXCI6IFxcXCJyZWN0XFxcIn1cXG5cXG4gICAgZGVmIG1hcmtfanNvbihzZWxmLCBtYXJrX3R5cGUsICoqa3dhcmdzKTpcXG4gICAgICAgIGlmIGt3YXJnczpcXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXSA9IHt9XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1bXFxcInR5cGVcXFwiXSA9IG1hcmtfdHlwZVxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdLnVwZGF0ZShrd2FyZ3MpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdID0gbWFya190eXBlXFxuXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgbWFya19iYXIoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJiYXJcXFwiLCAqKmt3YXJncylcXG5cXG4gICAgZGVmIG1hcmtfcG9pbnQoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJwb2ludFxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19saW5lKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwibGluZVxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19yZWN0KHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwicmVjdFxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19hcmVhKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwiYXJlYVxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya190aWNrKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwidGlja1xcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgZW5jb2RlKHNlbGYsIHg9XFxcIlxcXCIsIHk9XFxcIlxcXCIsIGNvbG9yPVxcXCJcXFwiLCBzaXplPVxcXCJcXFwiLCB0b29sdGlwPVxcXCJcXFwiKTpcXG4gICAgICAgIHNlbGYuZW5jb2RpbmcgPSB7fVxcbiAgICAgICAgaWYgeDpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHgsIEF4aXMpOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ4XFxcIl0gPSB4LnRvSnNvbigpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwieFxcXCJdID0gQXhpcyh4KS50b0pzb24oKVxcbiAgICAgICAgaWYgeTpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHksIEF4aXMpOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ5XFxcIl0gPSB5LnRvSnNvbigpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwieVxcXCJdID0gQXhpcyh5KS50b0pzb24oKVxcblxcbiAgICAgICAgIyBcXFwiY29sb3JcXFwiOiB7XFxcInR5cGVcXFwiOiBcXFwibm9taW5hbFxcXCIsIFxcXCJmaWVsZFxcXCI6IFxcXCJzcGVjaWVzXFxcIn1cXG4gICAgICAgIGlmIGNvbG9yOlxcbiAgICAgICAgICAgIGZpZWxkLCB0cCA9IF9nZXRfbmFtZV90eXBlKGNvbG9yKVxcbiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcImNvbG9yXFxcIl0gPSBkaWN0KHR5cGU9dHAsIGZpZWxkPWZpZWxkKVxcblxcbiAgICAgICAgIyBcXFwic2l6ZVxcXCI6IHtcXFwidHlwZVxcXCI6IFxcXCJxdWFudGl0YXRpdmVcXFwiLCBcXFwiZmllbGRcXFwiOiBcXFwiQWNjZWxlcmF0aW9uXFxcIn1cXG4gICAgICAgIGlmIHNpemU6XFxuICAgICAgICAgICAgZmllbGQsIHRwID0gX2dldF9uYW1lX3R5cGUoc2l6ZSlcXG4gICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJzaXplXFxcIl0gPSBkaWN0KHR5cGU9dHAsIGZpZWxkPWZpZWxkKVxcblxcbiAgICAgICAgaWYgdG9vbHRpcDpcXG4gICAgICAgICAgICBmaWVsZCwgdHAgPSBfZ2V0X25hbWVfdHlwZSh0b29sdGlwKVxcbiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInRvb2x0aXBcXFwiXSA9IGRpY3QodHlwZT10cCwgZmllbGQ9ZmllbGQpXFxuXFxuICAgICAgICBzZWxmLmpzb25bXFxcImVuY29kaW5nXFxcIl0gPSBzZWxmLmVuY29kaW5nXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgaW50ZXJhY3RpdmUoc2VsZik6XFxuICAgICAgICBpY29uZmlnID0ge1xcbiAgICAgICAgICAgIFxcXCJzZWxlY3RvcjAwMlxcXCI6IHtcXG4gICAgICAgICAgICAgICAgXFxcInR5cGVcXFwiOiBcXFwiaW50ZXJ2YWxcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiYmluZFxcXCI6IFxcXCJzY2FsZXNcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiZW5jb2RpbmdzXFxcIjogW1xcXCJ4XFxcIiwgXFxcInlcXFwiXSxcXG4gICAgICAgICAgICAgICAgXFxcIm9uXFxcIjogXFxcIlttb3VzZWRvd24sIHdpbmRvdzptb3VzZXVwXSA+IHdpbmRvdzptb3VzZW1vdmUhXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcInRyYW5zbGF0ZVxcXCI6IFxcXCJbbW91c2Vkb3duLCB3aW5kb3c6bW91c2V1cF0gPiB3aW5kb3c6bW91c2Vtb3ZlIVxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJ6b29tXFxcIjogXFxcIndoZWVsIVxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJtYXJrXFxcIjoge1xcXCJmaWxsXFxcIjogXFxcIiMzMzNcXFwiLCBcXFwiZmlsbE9wYWNpdHlcXFwiOiAwLjEyNSwgXFxcInN0cm9rZVxcXCI6IFxcXCJ3aGl0ZVxcXCJ9LFxcbiAgICAgICAgICAgICAgICBcXFwicmVzb2x2ZVxcXCI6IFxcXCJnbG9iYWxcXFwiLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHNlbGYuanNvbltcXFwic2VsZWN0aW9uXFxcIl0gPSBpY29uZmlnXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgZGlzcGxheShzZWxmKTpcXG4gICAgICAgIHJlbmRlcl9ncmFwaChzZWxmLmpzb24pXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmFkZF9sYXllcihvdGhlciwgXFxcImxheWVyXFxcIilcXG5cXG4gICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuYWRkX2xheWVyKG90aGVyLCBcXFwidmNvbmNhdFxcXCIpXFxuXFxuICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuYWRkX2xheWVyKG90aGVyLCBcXFwiaGNvbmNhdFxcXCIpXFxuXFxuICAgIGRlZiBhZGRfbGF5ZXIoc2VsZiwgb3RoZXIsIGxuYW1lKTpcXG4gICAgICAgICMgbXVsdGxlIGxheWVycyBhcmUgYWRkZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgbmV3IGVsZW1lbnQgdG8gdGhlXFxuICAgICAgICAjIGV4aXN0aW5nIGxheWVyLiAgSWYgdGhlIGxheWVyIGRvZXMgbm90IGV4aXN0IHRoZW4gaW5pdGlhbGl6ZVxcbiAgICAgICAgIyBpdCBmcm9tIHNlbGYuXFxuICAgICAgICBpZiBsbmFtZSBub3QgaW4gc2VsZi5qc29uOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltsbmFtZV0gPSBbXVxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwiZGF0YXNldHNcXFwiXSA9IHt9XFxuICAgICAgICAgICAgdGVtcCA9IHt9XFxuICAgICAgICAgICAgdGVtcFtcXFwiZGF0YVxcXCJdID0ge1xcXCJuYW1lXFxcIjogc2VsZi5kc25hbWV9XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhc2V0c1xcXCJdW3NlbGYuZHNuYW1lXSA9IHNlbGYuanNvbltcXFwiZGF0YVxcXCJdW1xcXCJ2YWx1ZXNcXFwiXVxcbiAgICAgICAgICAgIGRlbCBzZWxmLmpzb25bXFxcImRhdGFcXFwiXVxcbiAgICAgICAgICAgIHRlbXBbXFxcImVuY29kaW5nXFxcIl0gPSBzZWxmLmpzb25bXFxcImVuY29kaW5nXFxcIl1cXG4gICAgICAgICAgICBkZWwgc2VsZi5qc29uW1xcXCJlbmNvZGluZ1xcXCJdXFxuICAgICAgICAgICAgdGVtcFtcXFwibWFya1xcXCJdID0gc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgICAgICBkZWwgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgICAgICBzZWxmLmpzb25bbG5hbWVdLmFwcGVuZCh0ZW1wKVxcbiAgICAgICAgdGVtcCA9IHt9XFxuICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFzZXRzXFxcIl1bb3RoZXIuZHNuYW1lXSA9IG90aGVyLmpzb25bXFxcImRhdGFcXFwiXVtcXFwidmFsdWVzXFxcIl1cXG4gICAgICAgIHRlbXBbXFxcImRhdGFcXFwiXSA9IHtcXFwibmFtZVxcXCI6IG90aGVyLmRzbmFtZX1cXG4gICAgICAgIHRlbXBbXFxcImVuY29kaW5nXFxcIl0gPSBvdGhlci5qc29uW1xcXCJlbmNvZGluZ1xcXCJdXFxuICAgICAgICB0ZW1wW1xcXCJtYXJrXFxcIl0gPSBvdGhlci5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgIHNlbGYuanNvbltsbmFtZV0uYXBwZW5kKHRlbXApXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcblxcbiMgICBcXFwiZGF0YXNldHNcXFwiOiB7XFxuIyAgICAgXFxcImRhdGEtZTU2ZTQzMzU0ZDliOGYyYWIwZDFlOTBjZjI3Y2Q0N2ZcXFwiOiBbXFxuIyAgICAgICB7XFxcImFcXFwiOiA0LCBcXFwiYlxcXCI6IDEsIFxcXCJjXFxcIjogXFxcInJcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDUsIFxcXCJiXFxcIjogMiwgXFxcImNcXFwiOiBcXFwiZ1xcXCJ9LFxcbiMgICAgICAge1xcXCJhXFxcIjogNiwgXFxcImJcXFwiOiAzLCBcXFwiY1xcXCI6IFxcXCJiXFxcIn1cXG4jICAgICBdLFxcbiMgICAgIFxcXCJkYXRhLWE0YzMwNDdhMTViZjkzODBjMmU2MTVjZjg3NjQ4MzY5XFxcIjogW1xcbiMgICAgICAge1xcXCJhXFxcIjogMSwgXFxcImJcXFwiOiA0LCBcXFwiY1xcXCI6IFxcXCJyXFxcIn0sXFxuIyAgICAgICB7XFxcImFcXFwiOiAyLCBcXFwiYlxcXCI6IDUsIFxcXCJjXFxcIjogXFxcImdcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDMsIFxcXCJiXFxcIjogNiwgXFxcImNcXFwiOiBcXFwiYlxcXCJ9XFxuIyAgICAgXVxcbiMgICB9XFxuXFxuIyBUT0RPOiAgYWRkIGEgcmVjdCBtYXJrIHR5cGUgZm9yIGEgaGVhdCBtYXBcXG5cXG5cXG5kZWYgX2dldF9uYW1lX3R5cGUobmFtZSk6XFxuICAgIHR5cGVkID0ge1xcXCJRXFxcIjogXFxcInF1YW50aXRhdGl2ZVxcXCIsIFxcXCJPXFxcIjogXFxcIm9yZGluYWxcXFwiLCBcXFwiTlxcXCI6IFxcXCJub21pbmFsXFxcIiwgXFxcIlRcXFwiOiBcXFwidGVtcG9yYWxcXFwifVxcbiAgICBudCA9IG5hbWUuc3BsaXQoXFxcIjpcXFwiKVxcbiAgICB0c3RyaW5nID0gXFxcInF1YW50aXRhdGl2ZVxcXCJcXG4gICAgaWYgbGVuKG50KSA9PSAyOlxcbiAgICAgICAgdHN0cmluZyA9IHR5cGVkW250WzFdXVxcbiAgICByZXR1cm4gbnRbMF0sIHRzdHJpbmdcXG5cXG5cXG5jbGFzcyBBeGlzOlxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgYmluPUZhbHNlKTpcXG4gICAgICAgIHNlbGYuYWdncmVnYXRlID0gTm9uZVxcbiAgICAgICAgc2VsZi5uYW1lLCBzZWxmLnR5cGUgPSBfZ2V0X25hbWVfdHlwZShuYW1lKVxcbiAgICAgICAgaWYgXFxcIigpXFxcIiBpbiBzZWxmLm5hbWU6ICAjIGFnZ3JlZ2F0ZSBmdW5jdGlvblxcbiAgICAgICAgICAgIHNlbGYuYWdncmVnYXRlID0gc2VsZi5uYW1lLnJlcGxhY2UoXFxcIigpXFxcIiwgXFxcIlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZVxcbiAgICAgICAgc2VsZi5iaW4gPSBiaW5cXG5cXG4gICAgZGVmIHRvSnNvbihzZWxmKTpcXG4gICAgICAgIGpzb24gPSB7fVxcbiAgICAgICAgaWYgc2VsZi5uYW1lOlxcbiAgICAgICAgICAgIGpzb25bXFxcImZpZWxkXFxcIl0gPSBzZWxmLm5hbWVcXG4gICAgICAgIGlmIHNlbGYudHlwZTpcXG4gICAgICAgICAgICBqc29uW1xcXCJ0eXBlXFxcIl0gPSBzZWxmLnR5cGVcXG4gICAgICAgIGlmIHNlbGYuYmluOlxcbiAgICAgICAgICAgIGpzb25bXFxcImJpblxcXCJdID0gVHJ1ZVxcbiAgICAgICAgaWYgc2VsZi5hZ2dyZWdhdGU6XFxuICAgICAgICAgICAganNvbltcXFwiYWdncmVnYXRlXFxcIl0gPSBzZWxmLmFnZ3JlZ2F0ZVxcblxcbiAgICAgICAgcmV0dXJuIGpzb25cXG5cXG5cXG5jbGFzcyBYKEF4aXMpOlxcbiAgICBwYXNzXFxuXFxuXFxuY2xhc3MgWShBeGlzKTpcXG4gICAgcGFzc1xcblxcblxcbmNsYXNzIERhdGE6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlucHV0IGNhbiBiZSB0aGUgZm9ybSBvZiBhIHNlcmllcyBvZiBrZXl3b3JkIGFyZ3Mgd2hlcmVcXG4gICAgICAgIHRoZSBrZXl3b3JkIGlzIHRoZSBjb2x1bW4gbmFtZSwgb3IgYSBzaW5nbGUga2V5d29yZCBkYXRhXFxuICAgICAgICB0aGF0IGlzIGEgbGlzdCBvZiBqc29uIHN0eWxlIHJlY29yZHMgYXMgcm93cy5cXG4gICAgICAgIGNvdWxkIGFsc28gYWNjZXB0IGEgY3N2IGZpbGU/IG9yIGtleXdvcmRzIGNvbHVtbnMgYW5kIHJvd3NcXG4gICAgICAgIFRoaXMgYWNjZXB0cyBhIGxvdCBtb3JlIG9wdGlvbnMgdGhhdCBcXFwicmVhbCBhbHRhaXJcXFwiIHRvIG1ha2UgaXQgZWFzaWVyXFxuICAgICAgICB0byB3b3JrIHdpdGggbm9uLURhdGFGcmFtZSBkYXRhIHNldHMuICBJbnRlcm5hbGx5OlxcbiAgICAgICAgc2VsZi5rZXlzIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGNvbHVtbiBuYW1lc1xcbiAgICAgICAgc2VsZi52YWxzIGlzIGEgbGlzdCBvZiBkaWN0aW9uYXJpZXMgb2YgdGhlIGZvcm0gW3tjb2wxOnZhbDEsIGNvbDI6dmFsMiwgLi4uIGNvbG46dmFsbn0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbDE6dmFsMywgY29sMjp2YWw0LCAuLi4gY29sbjp2YWxufSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sMTp2YWw1LCBjb2wyOnZhbDYsIC4uLiBjb2xuOnZhbG59XVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIHRvZG86IGFjY2VwdCBhIFVSTCBhcyB0aGUgYXJndW1lbnQgdG8gcmVhZCBhIENTViBvciBKU09OIGZpbGVcXG4gICAgICAgIGlmIGxlbihrd2FyZ3MpID09IDEgYW5kIFxcXCJkYXRhXFxcIiBpbiBrd2FyZ3M6XFxuICAgICAgICAgICAgc2VsZi5kYXRhID0ga3dhcmdzW1xcXCJkYXRhXFxcIl1cXG4gICAgICAgICAgICBzZWxmLmtleXMgPSBzZWxmLmRhdGFbMF0ua2V5cygpXFxuICAgICAgICAgICAgc2VsZi52YWxzID0gc2VsZi5kYXRhXFxuICAgICAgICBlbGlmIGxlbihrd2FyZ3MpID09IDIgYW5kIChcXFwiY29sdW1uc1xcXCIgaW4ga3dhcmdzKSBhbmQgKFxcXCJyb3dzXFxcIiBpbiBrd2FyZ3MpOlxcbiAgICAgICAgICAgIHNlbGYua2V5cyA9IGt3YXJnc1tcXFwiY29sdW1uc1xcXCJdXFxuICAgICAgICAgICAgc2VsZi52YWxzID0gW11cXG4gICAgICAgICAgICBmb3IgciBpbiBrd2FyZ3NbXFxcInJvd3NcXFwiXTpcXG4gICAgICAgICAgICAgICAgc2VsZi52YWxzLmFwcGVuZChkaWN0KHppcChzZWxmLmtleXMsIHIpKSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAga2V5cyA9IGt3YXJncy5rZXlzKClcXG4gICAgICAgICAgICB2YWxzID0gW11cXG4gICAgICAgICAgICBwcmltYXJ5X2tleSA9IGxpc3Qoa2V5cylbMF1cXG4gICAgICAgICAgICBmb3IgaXggaW4gcmFuZ2UobGVuKGt3YXJnc1twcmltYXJ5X2tleV0pKTpcXG4gICAgICAgICAgICAgICAgZCA9IHt9XFxuICAgICAgICAgICAgICAgIGZvciBrZXkgaW4ga2V5czpcXG4gICAgICAgICAgICAgICAgICAgIGRba2V5XSA9IGt3YXJnc1trZXldW2l4XVxcbiAgICAgICAgICAgICAgICB2YWxzLmFwcGVuZChkKVxcbiAgICAgICAgICAgIHNlbGYudmFscyA9IHZhbHNcXG4gICAgICAgICAgICBzZWxmLmtleXMgPSBrZXlzXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgIyBoZWFkZXIgPSBcXFwiXFxcXHRcXFwiLmpvaW4oc2VsZi5rZXlzKSArIFxcXCJcXFxcblxcXCJcXG4gICAgICAgIGhlYWRlciA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5czpcXG4gICAgICAgICAgICBoZWFkZXIgKz0ga2V5LmNlbnRlcigxMCkgKyBcXFwiIFxcXCJcXG4gICAgICAgIGhlYWRlciArPSBcXFwiXFxcXG5cXFwiXFxuICAgICAgICB0ZW1wbGF0ZSA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5czpcXG4gICAgICAgICAgICB0ZW1wbGF0ZSArPSBcXFwie1xcXCIgKyBrZXkgKyBcXFwiOiA8MTB9IFxcXCJcXG4gICAgICAgIHRlbXBsYXRlICs9IFxcXCJcXFxcblxcXCJcXG4gICAgICAgIHJlcyA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Igcm93IGluIHNlbGYudmFsczpcXG4gICAgICAgICAgICByZXMgKz0gdGVtcGxhdGUuZm9ybWF0KCoqcm93KVxcblxcbiAgICAgICAgcmV0dXJuIGhlYWRlciArIHJlc1xcblxcblxcbmlmIF9fbmFtZV9fID09IFxcXCJfX21haW5fX1xcXCI6XFxuICAgIGQgPSBEYXRhKGE9WzMsIDQsIDVdLCBiPVsxLCAyLCAzXSwgYz1bXFxcInJcXFwiLCBcXFwiZ1xcXCIsIFxcXCJiXFxcIl0pXFxuICAgIHByaW50KGQpXFxuICAgIHByaW50KFxcbiAgICAgICAgdHlwZShcXG4gICAgICAgICAgICBDaGFydCh7XFxcImFcXFwiOiBsaXN0KFxcXCJhYmNcXFwiKSwgXFxcImJcXFwiOiBbMSwgMiwgM119KS5tYXJrX2JhcigpLmVuY29kZSh4PVxcXCJhOk5cXFwiLCB5PVxcXCJiXFxcIilcXG4gICAgICAgIClcXG4gICAgKVxcbiAgICBhYSA9IChcXG4gICAgICAgIENoYXJ0KERhdGEoYT1bMywgNCwgNV0sIGI9WzEsIDIsIDNdLCBjPVtcXFwiclxcXCIsIFxcXCJnXFxcIiwgXFxcImJcXFwiXSkpXFxuICAgICAgICAubWFya19wb2ludChjb2xvcj1cXFwicmVkXFxcIilcXG4gICAgICAgIC5lbmNvZGUoeD1cXFwiYlxcXCIsIHk9XFxcImFcXFwiLCBjb2xvcj1cXFwiYzpPXFxcIilcXG4gICAgKVxcbiAgICBwcmludChcXFwiYWEgPSBcXFwiLCBhYSlcXG4gICAgYWEuZGlzcGxheSgpXFxuXFxuICAgIGJiID0gKFxcbiAgICAgICAgQ2hhcnQoRGF0YShhPVsxLCAyLCAzXSwgYj1bNCwgNSwgNl0sIGM9W1xcXCJyXFxcIiwgXFxcImdcXFwiLCBcXFwiYlxcXCJdKSlcXG4gICAgICAgIC5tYXJrX2xpbmUoKVxcbiAgICAgICAgLmVuY29kZSh4PVxcXCJiXFxcIiwgeT1cXFwiYVxcXCIsIGNvbG9yPVxcXCJjOk9cXFwiKVxcbiAgICApXFxuICAgIHByaW50KFxcXCJiYiA9IFxcXCIsIGJiKVxcbiAgICBiYi5kaXNwbGF5KClcXG4gICAgcHJpbnQoXFxcImFhK2JiXFxcIiwgKGFhICsgYmIpLmRpc3BsYXkoKSlcXG4gICAgIyBDaGFydChEYXRhKGE9WzEsMiwzLDIsMiw0LDUsNSw2LDcsOCw4LDgsOCw4LDksMCwwXSkpLm1hcmtfYmFyKCkuZW5jb2RlKEF4aXMoJ2E6UScsIGJpbj1UcnVlKSx5PSdjb3VudCgpJylcXG5cXG5cXG4jIHRvZG86IHNlZSBpZiBJIGNhbiB3b3JrIHdpdGggdGhlIHJlcHIgb2YgYW4gb2JqZWN0IHRvIGdldCB0aGUgYmVoYXZpb3IgdGhhdCBhbHRhaXIgZ2V0cyBpbiBub3RlYm9va3NcXG4jIHRvZG86IGltcGxlbWVudCBhIEJpbiBvYmplY3QgdG8gc3BlY2lmaXkgbWF4Ymluc1xcblwiLFwic3JjL2xpYi9hbHRhaXIvdmVnYV9jYWxsZXIuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX2ZpbGVfXzpcXFwiL3NyYy9saWIvdmVnYV9jYWxsZXIuanNcXFwiLF9fcGFja2FnZV9fOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCxyZW5kZXJfZ3JhcGg6bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzKFxcXCJyZW5kZXJfZ3JhcGhcXFwiLGFyZ3VtZW50cywxLDEpO2xldCBiPVxcXCIjXFxcIitTay5kaXZpZCtcXFwiX2dyYXBoaWNzXFxcIjt0cnl7dmVnYUVtYmVkKGIsU2suZmZpLnJlbWFwVG9KcyhhKSx7YWN0aW9uczohMH0pfWNhdGNoKGEpe3Rocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcXFwiRXJyb3IgaW4gZ3JhcGggc3BlY2lmaWNhdGlvbiB1bmFibGUgdG8gcmVuZGVyIHRoZSBncmFwaFxcXFxuXFxcIithLm1lc3NhZ2UpfX0pfTtyZXR1cm4gYX07XCIsXCJzcmMvbGliL2FudGlncmF2aXR5LnB5XCI6XCJpbXBvcnQgd2ViYnJvd3NlclxcblxcbndlYmJyb3dzZXIub3BlbihcXFwiaHR0cHM6Ly94a2NkLmNvbS8zNTMvXFxcIilcXG5cIixcInNyYy9saWIvYW55ZGJtLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhbnlkYm0gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hcnJheS5qc1wiOlwiJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fSxiPVtcXFwiY1xcXCIsXFxcImJcXFwiLFxcXCJCXFxcIixcXFwidVxcXCIsXFxcImhcXFwiLFxcXCJIXFxcIixcXFwiaVxcXCIsXFxcIklcXFwiLFxcXCJsXFxcIixcXFwiTFxcXCIsXFxcImZcXFwiLFxcXCJkXFxcIl07cmV0dXJuIGEuX19uYW1lX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhcnJheVxcXCIpLGEuYXJyYXk9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYyl7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLC0xPT1iLmluZGV4T2YoU2suZmZpLnJlbWFwVG9KcyhjKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIHR5cGVjb2RlIChtdXN0IGJlIGMsIGIsIEIsIHUsIGgsIEgsIGksIEksIGwsIEwsIGYgb3IgZClcXFwiKTtpZihkJiYhU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlXFxcIik7aWYoYS4kZC5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihcXFwidHlwZWNvZGVcXFwiKSxjKSxhLiRkLm1wJGFzc19zdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJfX21vZHVsZV9fXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhcnJheVxcXCIpKSxhLnR5cGVjb2RlPWMsdm9pZCAwPT09ZClhLmludGVybmFsSXRlcmFibGU9bmV3IFNrLmJ1aWx0aW4ubGlzdDtlbHNlIGlmKGQgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3QpYS5pbnRlcm5hbEl0ZXJhYmxlPWQ7ZWxzZSBmb3IoYS5pbnRlcm5hbEl0ZXJhYmxlPW5ldyBTay5idWlsdGluLmxpc3QsaXRlcj1Tay5hYnN0ci5pdGVyKGQpLGl0ZW09aXRlci50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWl0ZW07aXRlbT1pdGVyLnRwJGl0ZXJuZXh0KCkpU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuaW50ZXJuYWxJdGVyYWJsZS5hcHBlbmQsW2EuaW50ZXJuYWxJdGVyYWJsZSxpdGVtXSl9KSxjLl9fcmVwcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9U2suZmZpLnJlbWFwVG9KcyhhLnR5cGVjb2RlKSxjPVxcXCJcXFwiO3JldHVybiBTay5mZmkucmVtYXBUb0pzKGEuaW50ZXJuYWxJdGVyYWJsZSkubGVuZ3RoJiYoXFxcImNcXFwiPT1Tay5mZmkucmVtYXBUb0pzKGEudHlwZWNvZGUpP2M9XFxcIiwgJ1xcXCIrU2suZmZpLnJlbWFwVG9KcyhhLmludGVybmFsSXRlcmFibGUpLmpvaW4oXFxcIlxcXCIpK1xcXCInXFxcIjpjPVxcXCIsIFxcXCIrU2suZmZpLnJlbWFwVG9KcyhTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLl9fcmVwcl9fLFthLmludGVybmFsSXRlcmFibGVdKSkpLG5ldyBTay5idWlsdGluLnN0cihcXFwiYXJyYXkoJ1xcXCIrYitcXFwiJ1xcXCIrYytcXFwiKVxcXCIpfSksYy5fX3N0cl9fPWMuX19yZXByX18sYy5fX2dldGF0dHJpYnV0ZV9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS50cCRnZXRhdHRyKGIpfSksYy5hcHBlbmQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLmFwcGVuZCxbYS5pbnRlcm5hbEl0ZXJhYmxlLGJdKSxTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLmV4dGVuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSwhU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlXFxcIik7Zm9yKGl0ZXI9U2suYWJzdHIuaXRlcihiKSxpdGVtPWl0ZXIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1pdGVtO2l0ZW09aXRlci50cCRpdGVybmV4dCgpKVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmludGVybmFsSXRlcmFibGUuYXBwZW5kLFthLmludGVybmFsSXRlcmFibGUsaXRlbV0pfSl9LFxcXCJhcnJheVxcXCIsW10pLGF9O1wiLFwic3JjL2xpYi9hc3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFzdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FzeW5jaGF0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhc3luY2hhdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FzeW5jb3JlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhc3luY29yZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2F0ZXhpdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYXRleGl0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYXVkaW9kZXYucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImF1ZGlvZGV2IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmFzZTY0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJiYXNlNjQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9iZGIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImJkYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2JpbmhleC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYmluaGV4IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmlzZWN0LnB5XCI6XCJcXFwiXFxcIlxcXCJCaXNlY3Rpb24gYWxnb3JpdGhtcy5cXFwiXFxcIlxcXCJcXG5cXG5kZWYgaW5zb3J0X3JpZ2h0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxcblxcbiAgICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSByaWdodCBvZiB0aGUgcmlnaHRtb3N0IHguXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgeCA8IGFbbWlkXTogaGkgPSBtaWRcXG4gICAgICAgIGVsc2U6IGxvID0gbWlkKzFcXG4gICAgYS5pbnNlcnQobG8sIHgpXFxuXFxuZGVmIGJpc2VjdF9yaWdodChhLCB4LCBsbz0wLCBoaT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0byBpbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIFRoZSByZXR1cm4gdmFsdWUgaSBpcyBzdWNoIHRoYXQgYWxsIGUgaW4gYVs6aV0gaGF2ZSBlIDw9IHgsIGFuZCBhbGwgZSBpblxcbiAgICBhW2k6XSBoYXZlIGUgPiB4LiAgU28gaWYgeCBhbHJlYWR5IGFwcGVhcnMgaW4gdGhlIGxpc3QsIGEuaW5zZXJ0KHgpIHdpbGxcXG4gICAgaW5zZXJ0IGp1c3QgYWZ0ZXIgdGhlIHJpZ2h0bW9zdCB4IGFscmVhZHkgdGhlcmUuXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgeCA8IGFbbWlkXTogaGkgPSBtaWRcXG4gICAgICAgIGVsc2U6IGxvID0gbWlkKzFcXG4gICAgcmV0dXJuIGxvXFxuXFxuZGVmIGluc29ydF9sZWZ0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxcblxcbiAgICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSBsZWZ0IG9mIHRoZSBsZWZ0bW9zdCB4LlxcblxcbiAgICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBsZW4oYSkpIGJvdW5kIHRoZVxcbiAgICBzbGljZSBvZiBhIHRvIGJlIHNlYXJjaGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgaWYgbG8gPCAwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKVxcbiAgICBpZiBoaSBpcyBOb25lOlxcbiAgICAgICAgaGkgPSBsZW4oYSlcXG4gICAgd2hpbGUgbG8gPCBoaTpcXG4gICAgICAgIG1pZCA9IChsbytoaSkvLzJcXG4gICAgICAgIGlmIGFbbWlkXSA8IHg6IGxvID0gbWlkKzFcXG4gICAgICAgIGVsc2U6IGhpID0gbWlkXFxuICAgIGEuaW5zZXJ0KGxvLCB4KVxcblxcblxcbmRlZiBiaXNlY3RfbGVmdChhLCB4LCBsbz0wLCBoaT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0byBpbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIFRoZSByZXR1cm4gdmFsdWUgaSBpcyBzdWNoIHRoYXQgYWxsIGUgaW4gYVs6aV0gaGF2ZSBlIDwgeCwgYW5kIGFsbCBlIGluXFxuICAgIGFbaTpdIGhhdmUgZSA+PSB4LiAgU28gaWYgeCBhbHJlYWR5IGFwcGVhcnMgaW4gdGhlIGxpc3QsIGEuaW5zZXJ0KHgpIHdpbGxcXG4gICAgaW5zZXJ0IGp1c3QgYmVmb3JlIHRoZSBsZWZ0bW9zdCB4IGFscmVhZHkgdGhlcmUuXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgYVttaWRdIDwgeDogbG8gPSBtaWQrMVxcbiAgICAgICAgZWxzZTogaGkgPSBtaWRcXG4gICAgcmV0dXJuIGxvXFxuXFxuIyBPdmVyd3JpdGUgYWJvdmUgZGVmaW5pdGlvbnMgd2l0aCBhIGZhc3QgQyBpbXBsZW1lbnRhdGlvblxcbnRyeTpcXG4gICAgZnJvbSBfYmlzZWN0IGltcG9ydCAqXFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxuXFxuIyBDcmVhdGUgYWxpYXNlc1xcbmJpc2VjdCA9IGJpc2VjdF9yaWdodFxcbmluc29ydCA9IGluc29ydF9yaWdodFxcblwiLFwic3JjL2xpYi9ic2RkYi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYnNkZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jUHJvZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY1Byb2ZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jYWxlbmRhci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY2FsZW5kYXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jZ2kucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNnaSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NnaXRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjZ2l0YiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NodW5rLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjaHVuayBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NtZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY21kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29kZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29kZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvZGVjcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29kZWNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29kZW9wLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb2Rlb3AgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb2xsZWN0aW9ucy5qc1wiOlwiZnVuY3Rpb24gJGJ1aWx0aW5tb2R1bGUoKXtjb25zdCBhPXt9O3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRNb2R1bGUoXFxcImtleXdvcmRcXFwiLCExLCEwKSxiPT4oYS5faXNrZXl3b3JkPWIuJGQuaXNrZXl3b3JkLFNrLmltcG9ydE1vZHVsZShcXFwiaXRlcnRvb2xzXFxcIiwhMSwhMCkpLGI9PihhLl9jaGFpbj1iLiRkLmNoYWluLGEuX3N0YXJtYXA9Yi4kZC5zdGFybWFwLGEuX3JlcGVhdD1iLiRkLnJlcGVhdCxTay5pbXBvcnRNb2R1bGUoXFxcIm9wZXJhdG9yXFxcIiwhMSwhMCkpLGI9PnthLl9pdGVtZ2V0dGVyPWIuJGQuaXRlbWdldHRlcn0sKCk9PmNvbGxlY3Rpb25zX21vZChhKSl9ZnVuY3Rpb24gY29sbGVjdGlvbnNfbW9kKGEpe2Z1bmN0aW9uIGNvdW50ZXJOdW1iZXJTbG90KGIpe3JldHVybiBmdW5jdGlvbihjKXtpZih2b2lkIDAhPT1jJiYhKGMgaW5zdGFuY2VvZiBhLkNvdW50ZXIpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBkPW5ldyBhLkNvdW50ZXI7cmV0dXJuIGIuY2FsbCh0aGlzLGQsYyksZH19ZnVuY3Rpb24gY291bnRlcklucGxhY2VTbG90KGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKCEoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJDb3VudGVyIFxcXCIrYStcXFwiPSBcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1xcXCIgaXMgbm90IHN1cHBvcnRlZFxcXCIpO3JldHVybiBiLmNhbGwodGhpcyxjKSx0aGlzLmtlZXAkcG9zaXRpdmUoKX19ZnVuY3Rpb24gbmFtZWR0dXBsZShiLGMsZCxsLG0pe2Z1bmN0aW9uIF9tYWtlKGEsYil7cmV0dXJuIGEucHJvdG90eXBlLnRwJG5ldyhTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShiKSl9ZnVuY3Rpb24gX2FzZGljdChhKXtjb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YS5fZmllbGRzLnYubGVuZ3RoO2MrKyliLnB1c2goYS5fZmllbGRzLnZbY10pLGIucHVzaChhLnZbY10pO3JldHVybiBuZXcgU2suYnVpbHRpbi5kaWN0KGIpfWZ1bmN0aW9uIF9yZXBsYWNlKGEsYil7YT1uZXcgU2suYnVpbHRpbi5kaWN0KGEpO2NvbnN0IGM9YS50cCRnZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihcXFwicG9wXFxcIikpLGQ9U2suYWJzdHIuZ2F0dHIoYixuZXcgU2suYnVpbHRpbi5zdHIoXFxcIl9tYWtlXFxcIikpLGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5LGY9ZShkLFtlKFNrLmJ1aWx0aW4ubWFwXyxbYyxyLGJdKV0pO2lmKGEuc3EkbGVuZ3RoKCkpe2NvbnN0IGI9YS5zayRhc2FycmF5KCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiR290IHVuZXhwZWN0ZCBmaWVsZCBuYW1lczogW1xcXCIrYi5tYXAoYT0+XFxcIidcXFwiK2EuJGpzc3RyKCkrXFxcIidcXFwiKStcXFwiXVxcXCIpfXJldHVybiBmfWlmKGI9Yi50cCRzdHIoKSxTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuX2lza2V5d29yZCxbYl0pKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW5ub3QgYmUgYSBrZXl3b3JkOiAnXFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGIpK1xcXCInXFxcIik7Y29uc3Qgbj1iLiRqc3N0cigpO2lmKGUudGVzdChuKXx8IWcudGVzdChuKXx8IW4pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgbXVzdCBiZSB2YWxpZCBpZGVudGlmaWVyczogJ1xcXCIrbitcXFwiJ1xcXCIpO2xldCBvLHA7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSlvPWMuJGpzc3RyKCkucmVwbGFjZShoLFxcXCIgXFxcIikuc3BsaXQoaiksMT09by5sZW5ndGgmJlxcXCJcXFwiPT09b1swXSYmKG89W10pLHA9by5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKTtlbHNle289W10scD1bXTtmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxiPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9YS50cCRpdGVybmV4dCgpKWI9Yi50cCRzdHIoKSxwLnB1c2goYiksby5wdXNoKGIuJGpzc3RyKCkpfWxldCBxPW5ldyBTZXQ7aWYoU2subWlzY2V2YWwuaXNUcnVlKGQpKWZvcihpPTA7aTxvLmxlbmd0aDtpKyspKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5faXNrZXl3b3JkLFtwW2ldXSkpfHxmLnRlc3Qob1tpXSl8fCFnLnRlc3Qob1tpXSl8fCFvW2ldfHxxLmhhcyhvW2ldKSkmJihvW2ldPVxcXCJfXFxcIitpLHBbaV09bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJfXFxcIitpKSkscS5hZGQob1tpXSk7ZWxzZSBmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXtpZihTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuX2lza2V5d29yZCxbcFtpXV0pKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW5ub3QgYmUgYSBrZXl3b3JkOiAnXFxcIitvW2ldK1xcXCInXFxcIik7ZWxzZSBpZihmLnRlc3Qob1tpXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiRmllbGQgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZTogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO2Vsc2UgaWYoIWcudGVzdChvW2ldKXx8IW9baV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgbXVzdCBiZSB2YWxpZCBpZGVudGlmaWVyczogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO2Vsc2UgaWYocS5oYXMob1tpXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiRW5jb3VudGVyZWQgZHVwbGljYXRlIGZpZWxkIG5hbWU6ICdcXFwiK29baV0rXFxcIidcXFwiKTtxLmFkZChvW2ldKX1jb25zdCByPW5ldyBTay5idWlsdGluLnR1cGxlKHApLHM9W107bGV0IHQ9W107aWYoIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGwpKXtpZih0PVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGwpLHQubGVuZ3RoPm8ubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiR290IG1vcmUgZGVmYXVsdCB2YWx1ZXMgdGhhbiBmaWVsZCBuYW1lc1xcXCIpO2ZvcihsZXQgYT0wLGI9cC5sZW5ndGgtdC5sZW5ndGg7YjxwLmxlbmd0aDthKyssYisrKXMucHVzaChwW2JdKSxzLnB1c2godFthXSl9Y29uc3QgdT1uZXcgU2suYnVpbHRpbi5kaWN0KHMpO19tYWtlLmNvX3Zhcm5hbWVzPVtcXFwiX2Nsc1xcXCIsXFxcIml0ZXJhYmxlXFxcIl0sX2FzZGljdC5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiXSxfcmVwbGFjZS5jb19rd2FyZ3M9MSxfcmVwbGFjZS5jb192YXJuYW1lcz1bXFxcIl9zZWxmXFxcIl07Y29uc3Qgdj17fTtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl2W3BbZV0uJG1hbmdsZWRdPW5ldyBTay5idWlsdGluLnByb3BlcnR5KG5ldyBhLl9pdGVtZ2V0dGVyKFtuZXcgU2suYnVpbHRpbi5pbnRfKGUpXSksdm9pZCAwLHZvaWQgMCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFsaWFzIGZvciBmaWVsZCBudW1iZXIgXFxcIitlKSk7cmV0dXJuIFNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3Mobix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gTmFtZWRUdXBsZSgpe30sYmFzZTpTay5idWlsdGluLnR1cGxlLHNsb3RzOnt0cCRkb2M6bitcXFwiKFxcXCIrby5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIix0cCRuZXcoYSxiKXthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJfX25ld19fXFxcIixvLGEsYix0KTtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBTay5idWlsdGluLnR1cGxlLmNhbGwoYyxhKSxjfSwkcigpe2NvbnN0IGE9dGhpcy52Lm1hcCgoYSxiKT0+b1tiXStcXFwiPVxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYS5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIil9fSxwcm90bzpPYmplY3QuYXNzaWduKHtfX21vZHVsZV9fOlNrLmJ1aWx0aW4uY2hlY2tOb25lKG0pP1NrLmdsb2JhbHMuX19uYW1lX186bSxfX3Nsb3RzX186bmV3IFNrLmJ1aWx0aW4udHVwbGUsX2ZpZWxkczpyLF9maWVsZF9kZWZhdWx0czp1LF9tYWtlOm5ldyBTay5idWlsdGluLmNsYXNzbWV0aG9kKG5ldyBTay5idWlsdGluLmZ1bmMoX21ha2UpKSxfYXNkaWN0Om5ldyBTay5idWlsdGluLmZ1bmMoX2FzZGljdCksX3JlcGxhY2U6bmV3IFNrLmJ1aWx0aW4uZnVuYyhfcmVwbGFjZSl9LHYpfSl9YS5fX2FsbF9fPW5ldyBTay5idWlsdGluLmxpc3QoW1xcXCJkZXF1ZVxcXCIsXFxcImRlZmF1bHRkaWN0XFxcIixcXFwibmFtZWR0dXBsZVxcXCIsXFxcIkNvdW50ZXJcXFwiLFxcXCJPcmRlcmVkRGljdFxcXCJdLm1hcChhPT5uZXcgU2suYnVpbHRpbi5zdHIoYSkpKSxhLmRlZmF1bHRkaWN0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZGVmYXVsdGRpY3QoYSxiKXt0aGlzLmRlZmF1bHRfZmFjdG9yeT1hLFNrLmJ1aWx0aW4uZGljdC5jYWxsKHRoaXMsYil9LGJhc2U6U2suYnVpbHRpbi5kaWN0LG1ldGhvZHM6e2NvcHk6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9fSxfX2NvcHlfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH19LF9fbWlzc2luZ19fOnskbWV0aChhKXtpZihTay5idWlsdGluLmNoZWNrTm9uZSh0aGlzLmRlZmF1bHRfZmFjdG9yeSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7ZWxzZXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmRlZmF1bHRfZmFjdG9yeSxbXSk7cmV0dXJuIHRoaXMubXAkYXNzX3N1YnNjcmlwdChhLGIpLGJ9fSwkZmxhZ3M6e09uZUFyZzohMH19fSxnZXRzZXRzOntkZWZhdWx0X2ZhY3Rvcnk6eyRnZXQoKXtyZXR1cm4gdGhpcy5kZWZhdWx0X2ZhY3Rvcnl9LCRzZXQoYSl7YT1hfHxTay5idWlsdGluLm5vbmUubm9uZSQsdGhpcy5kZWZhdWx0X2ZhY3Rvcnk9YX19fSxzbG90czp7dHAkZG9jOlxcXCJkZWZhdWx0ZGljdChkZWZhdWx0X2ZhY3RvcnlbLCAuLi5dKSAtLT4gZGljdCB3aXRoIGRlZmF1bHQgZmFjdG9yeVxcXFxuXFxcXG5UaGUgZGVmYXVsdCBmYWN0b3J5IGlzIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cyB0byBwcm9kdWNlXFxcXG5hIG5ldyB2YWx1ZSB3aGVuIGEga2V5IGlzIG5vdCBwcmVzZW50LCBpbiBfX2dldGl0ZW1fXyBvbmx5LlxcXFxuQSBkZWZhdWx0ZGljdCBjb21wYXJlcyBlcXVhbCB0byBhIGRpY3Qgd2l0aCB0aGUgc2FtZSBpdGVtcy5cXFxcbkFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGlmIHRoZXkgd2VyZVxcXFxucGFzc2VkIHRvIHRoZSBkaWN0IGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcga2V5d29yZCBhcmd1bWVudHMuXFxcXG5cXFwiLHRwJGluaXQoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTtpZih2b2lkIDA9PT1jKXRoaXMuZGVmYXVsdF9mYWN0b3J5PVNrLmJ1aWx0aW4ubm9uZS5ub25lJDtlbHNlIGlmKCFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYykmJiFTay5idWlsdGluLmNoZWNrTm9uZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGVcXFwiKTtlbHNlIHRoaXMuZGVmYXVsdF9mYWN0b3J5PWM7cmV0dXJuIFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkaW5pdC5jYWxsKHRoaXMsYSxiKX0sJHIoKXtjb25zdCBhPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5kZWZhdWx0X2ZhY3RvcnkpLGI9U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS4kci5jYWxsKHRoaXMpLnY7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiZGVmYXVsdGRpY3QoXFxcIithK1xcXCIsIFxcXCIrYitcXFwiKVxcXCIpfX0scHJvdG86eyRjb3B5KCl7Y29uc3QgYj1bXTtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKHRoaXMpLGE9PntiLnB1c2goYSksYi5wdXNoKHRoaXMubXAkc3Vic2NyaXB0KGEpKX0pLG5ldyBhLmRlZmF1bHRkaWN0KHRoaXMuZGVmYXVsdF9mYWN0b3J5LGIpfX19KSxhLkNvdW50ZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiQ291bnRlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIENvdW50ZXIoKXt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3QsU2suYnVpbHRpbi5kaWN0LmFwcGx5KHRoaXMpfSxiYXNlOlNrLmJ1aWx0aW4uZGljdCxtZXRob2RzOntlbGVtZW50czp7JGZsYWdzOntOb0FyZ3M6ITB9LCRtZXRoKCl7Y29uc3QgYj1hLl9jaGFpbi50cCRnZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihcXFwiZnJvbV9pdGVyYWJsZVxcXCIpKSxjPWEuX3N0YXJtYXAsZD1hLl9yZXBlYXQsZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXk7cmV0dXJuIGUoYixbZShjLFtkLGUodGhpcy50cCRnZXRhdHRyKHRoaXMuc3RyJGl0ZW1zKSldKV0pfX0sbW9zdF9jb21tb246eyRmbGFnczp7TmFtZWRBcmdzOltcXFwiblxcXCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSRdfSwkbWV0aChhKXtsZW5ndGg9dGhpcy5zcSRsZW5ndGgoKSxTay5idWlsdGluLmNoZWNrTm9uZShhKT9hPWxlbmd0aDooYT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhKSxhPWE+bGVuZ3RoP2xlbmd0aDowPmE/MDphKTtjb25zdCBiPXRoaXMuJGl0ZW1zKCkuc29ydCgoYyxhKT0+U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbMV0sYVsxXSxcXFwiTHRcXFwiKT8xOlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjWzFdLGFbMV0sXFxcIkd0XFxcIik/LTE6MCk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYi5zbGljZSgwLGEpLm1hcChhPT5uZXcgU2suYnVpbHRpbi50dXBsZShhKSkpfX0sdXBkYXRlOnskZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkbWV0aChhLGIpe3JldHVybiBTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcInVwZGF0ZVxcXCIsYSwwLDEpLHRoaXMuY291bnRlciR1cGRhdGUoYSxiKX19LHN1YnRyYWN0OnskZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkbWV0aChhLGIpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwic3VidHJhY3RcXFwiLGEsMCwxKTtjb25zdCBjPWFbMF07aWYodm9pZCAwIT09YylpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KWZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoYik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AoYSxjLm1wJHN1YnNjcmlwdChiKSxcXFwiU3ViXFxcIikpfWVsc2UgZm9yKGl0ZXI9U2suYWJzdHIuaXRlcihjKSxrPWl0ZXIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1rO2s9aXRlci50cCRpdGVybmV4dCgpKXtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGspO3RoaXMubXAkYXNzX3N1YnNjcmlwdChrLFNrLmFic3RyLm51bWJlckJpbk9wKGEsdGhpcy4kb25lLFxcXCJTdWJcXFwiKSl9Yj1ifHxbXTtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrPTIpe2NvbnN0IGE9bmV3IFNrLmJ1aWx0aW4uc3RyKGJbY10pLGQ9dGhpcy5tcCRzdWJzY3JpcHQoYSk7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsU2suYWJzdHIubnVtYmVyQmluT3AoZCxiW2MrMV0sXFxcIlN1YlxcXCIpKX1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19taXNzaW5nX186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHplcm99LCRmbGFnczp7T25lQXJnOiEwfX0sY29weTp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuQ291bnRlcixbdGhpc10pfSwkZmxhZ3M6e05vQXJnczohMH19fSxnZXRzZXRzOntfX2RpY3RfXzpTay5nZW5lcmljLmdldFNldERpY3R9LHNsb3RzOnt0cCRkb2M6XFxcIkRpY3Qgc3ViY2xhc3MgZm9yIGNvdW50aW5nIGhhc2hhYmxlIGl0ZW1zLiAgU29tZXRpbWVzIGNhbGxlZCBhIGJhZ1xcXFxuICAgIG9yIG11bHRpc2V0LiAgRWxlbWVudHMgYXJlIHN0b3JlZCBhcyBkaWN0aW9uYXJ5IGtleXMgYW5kIHRoZWlyIGNvdW50c1xcXFxuICAgIGFyZSBzdG9yZWQgYXMgZGljdGlvbmFyeSB2YWx1ZXMuXFxcXG5cXFxcbiAgICA+Pj4gYyA9IENvdW50ZXIoJ2FiY2RlYWJjZGFiY2FiYScpICAjIGNvdW50IGVsZW1lbnRzIGZyb20gYSBzdHJpbmdcXFxcblxcXFxuICAgID4+PiBjLm1vc3RfY29tbW9uKDMpICAgICAgICAgICAgICAgICMgdGhyZWUgbW9zdCBjb21tb24gZWxlbWVudHNcXFxcbiAgICBbKCdhJywgNSksICgnYicsIDQpLCAoJ2MnLCAzKV1cXFxcbiAgICA+Pj4gc29ydGVkKGMpICAgICAgICAgICAgICAgICAgICAgICAjIGxpc3QgYWxsIHVuaXF1ZSBlbGVtZW50c1xcXFxuICAgIFsnYScsICdiJywgJ2MnLCAnZCcsICdlJ11cXFxcbiAgICA+Pj4gJycuam9pbihzb3J0ZWQoYy5lbGVtZW50cygpKSkgICAjIGxpc3QgZWxlbWVudHMgd2l0aCByZXBldGl0aW9uc1xcXFxuICAgICdhYWFhYWJiYmJjY2NkZGUnXFxcXG4gICAgPj4+IHN1bShjLnZhbHVlcygpKSAgICAgICAgICAgICAgICAgIyB0b3RhbCBvZiBhbGwgY291bnRzXFxcXG4gICAgMTVcXFxcblxcXFxuICAgID4+PiBjWydhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgY291bnQgb2YgbGV0dGVyICdhJ1xcXFxuICAgIDVcXFxcbiAgICA+Pj4gZm9yIGVsZW0gaW4gJ3NoYXphbSc6ICAgICAgICAgICAjIHVwZGF0ZSBjb3VudHMgZnJvbSBhbiBpdGVyYWJsZVxcXFxuICAgIC4uLiAgICAgY1tlbGVtXSArPSAxICAgICAgICAgICAgICAgICMgYnkgYWRkaW5nIDEgdG8gZWFjaCBlbGVtZW50J3MgY291bnRcXFxcbiAgICA+Pj4gY1snYSddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgc2V2ZW4gJ2EnXFxcXG4gICAgN1xcXFxuICAgID4+PiBkZWwgY1snYiddICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGFsbCAnYidcXFxcbiAgICA+Pj4gY1snYiddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgemVybyAnYidcXFxcbiAgICAwXFxcXG5cXFxcbiAgICA+Pj4gZCA9IENvdW50ZXIoJ3NpbXNhbGFiaW0nKSAgICAgICAjIG1ha2UgYW5vdGhlciBjb3VudGVyXFxcXG4gICAgPj4+IGMudXBkYXRlKGQpICAgICAgICAgICAgICAgICAgICAgIyBhZGQgaW4gdGhlIHNlY29uZCBjb3VudGVyXFxcXG4gICAgPj4+IGNbJ2EnXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3cgdGhlcmUgYXJlIG5pbmUgJ2EnXFxcXG4gICAgOVxcXFxuXFxcXG4gICAgPj4+IGMuY2xlYXIoKSAgICAgICAgICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgY291bnRlclxcXFxuICAgID4+PiBjXFxcXG4gICAgQ291bnRlcigpXFxcXG5cXFxcbiAgICBOb3RlOiAgSWYgYSBjb3VudCBpcyBzZXQgdG8gemVybyBvciByZWR1Y2VkIHRvIHplcm8sIGl0IHdpbGwgcmVtYWluXFxcXG4gICAgaW4gdGhlIGNvdW50ZXIgdW50aWwgdGhlIGVudHJ5IGlzIGRlbGV0ZWQgb3IgdGhlIGNvdW50ZXIgaXMgY2xlYXJlZDpcXFxcblxcXFxuICAgID4+PiBjID0gQ291bnRlcignYWFhYmJjJylcXFxcbiAgICA+Pj4gY1snYiddIC09IDIgICAgICAgICAgICAgICAgICAgICAjIHJlZHVjZSB0aGUgY291bnQgb2YgJ2InIGJ5IHR3b1xcXFxuICAgID4+PiBjLm1vc3RfY29tbW9uKCkgICAgICAgICAgICAgICAgICMgJ2InIGlzIHN0aWxsIGluLCBidXQgaXRzIGNvdW50IGlzIHplcm9cXFxcbiAgICBbKCdhJywgMyksICgnYycsIDEpLCAoJ2InLCAwKV1cXFxcblxcXFxuXFxcIix0cCRpbml0KGEsYil7cmV0dXJuIFNrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLnRwanNfbmFtZSxhLDAsMSksdGhpcy5jb3VudGVyJHVwZGF0ZShhLGIpfSwkcigpe2NvbnN0IGE9MDx0aGlzLnNpemU/U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS4kci5jYWxsKHRoaXMpLnY6XFxcIlxcXCI7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYStcXFwiKVxcXCIpfSx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLG1wJGFzc19zdWJzY3JpcHQoYSxiKXtyZXR1cm4gdm9pZCAwPT09Yj90aGlzLm1wJGxvb2t1cChhKSYmU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5tcCRhc3Nfc3Vic2NyaXB0LmNhbGwodGhpcyxhLGIpOlNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUubXAkYXNzX3N1YnNjcmlwdC5jYWxsKHRoaXMsYSxiKX0sdHAkYXNfbnVtYmVyOiEwLG5iJHBvc2l0aXZlOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsYyl9KX0pLG5iJG5lZ2F0aXZlOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiTHRcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy4kemVybyxjLFxcXCJTdWJcXFwiKSl9KX0pLG5iJHN1YnRyYWN0OmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEsYil7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYyxkXSk9Pntjb25zdCBlPVNrLmFic3RyLm51bWJlckJpbk9wKGQsYi5tcCRzdWJzY3JpcHQoYyksXFxcIlN1YlxcXCIpO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChlLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGUpfSksYi4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pnt2b2lkIDA9PT10aGlzLm1wJGxvb2t1cChiKSYmU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiTHRcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy4kemVybyxjLFxcXCJTdWJcXFwiKSl9KX0pLG5iJGFkZDpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1Tay5hYnN0ci5udW1iZXJCaW5PcChkLGIubXAkc3Vic2NyaXB0KGMpLFxcXCJBZGRcXFwiKTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZSx0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYyxlKX0pLGIuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57dm9pZCAwPT09dGhpcy5tcCRsb29rdXAoYikmJlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChiLGMpfSl9KSxuYiRpbnBsYWNlX2FkZDpjb3VudGVySW5wbGFjZVNsb3QoXFxcIitcXFwiLGZ1bmN0aW9uKGEpe2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57Y29uc3QgYz1Tay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AodGhpcy5tcCRzdWJzY3JpcHQoYSksYixcXFwiQWRkXFxcIik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsYyl9KX0pLG5iJGlucGxhY2Vfc3VidHJhY3Q6Y291bnRlcklucGxhY2VTbG90KFxcXCItXFxcIixmdW5jdGlvbihhKXthLiRpdGVtcygpLmZvckVhY2goKFthLGJdKT0+e2NvbnN0IGM9U2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKHRoaXMubXAkc3Vic2NyaXB0KGEpLGIsXFxcIlN1YlxcXCIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChhLGMpfSl9KSxuYiRvcjpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1iLm1wJHN1YnNjcmlwdChjKSxmPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGUsXFxcIkx0XFxcIik/ZTpkO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGYpfSksYi4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pnt2b2lkIDA9PT10aGlzLm1wJGxvb2t1cChiKSYmU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsYyl9KX0pLG5iJGFuZDpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1iLm1wJHN1YnNjcmlwdChjKSxmPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGUsXFxcIkx0XFxcIik/ZDplO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGYpfSl9KSxuYiRpbnBsYWNlX2FuZDpjb3VudGVySW5wbGFjZVNsb3QoXFxcIiZcXFwiLGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57Y29uc3QgZD1hLm1wJHN1YnNjcmlwdChiKTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZCxjLFxcXCJMdFxcXCIpJiZ0aGlzLm1wJGFzc19zdWJzY3JpcHQoYixkKX0pfSksbmIkaW5wbGFjZV9vcjpjb3VudGVySW5wbGFjZVNsb3QoXFxcInxcXFwiLGZ1bmN0aW9uKGEpe2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsdGhpcy5tcCRzdWJzY3JpcHQoYSksXFxcIkd0XFxcIikmJnRoaXMubXAkYXNzX3N1YnNjcmlwdChhLGIpfSl9KSxuYiRyZWZsZWN0ZWRfYW5kOm51bGwsbmIkcmVmbGVjdGVkX29yOm51bGwsbmIkcmVmbGVjdGVkX2FkZDpudWxsLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpudWxsfSxwcm90bzp7a2VlcCRwb3NpdGl2ZSgpe3JldHVybiB0aGlzLiRpdGVtcygpLmZvckVhY2goKFthLGJdKT0+e1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLHRoaXMuJHplcm8sXFxcIkx0RVxcXCIpJiZ0aGlzLm1wJGFzc19zdWJzY3JpcHQoYSl9KSx0aGlzfSwkemVybzpuZXcgU2suYnVpbHRpbi5pbnRfKDApLCRvbmU6bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxzdHIkaXRlbXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpdGVtc1xcXCIpLGNvdW50ZXIkdXBkYXRlKGEsYil7Y29uc3QgYz1hWzBdO2lmKHZvaWQgMCE9PWMpaWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGMpKWZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoYik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AoYSx0aGlzLiRvbmUsXFxcIkFkZFxcXCIpKX1lbHNlIGlmKCF0aGlzLnNxJGxlbmd0aCgpKXRoaXMudXBkYXRlJGNvbW1vbihhLHZvaWQgMCxcXFwidXBkYXRlXFxcIik7ZWxzZSBmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxiPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9YS50cCRpdGVybmV4dCgpKXtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChiLFNrLmFic3RyLm51bWJlckJpbk9wKGEsYy5tcCRzdWJzY3JpcHQoYiksXFxcIkFkZFxcXCIpKX1pZihiJiZiLmxlbmd0aClpZighdGhpcy5zcSRsZW5ndGgoKSl0aGlzLnVwZGF0ZSRjb21tb24oW10sYixcXFwidXBkYXRlXFxcIik7ZWxzZSBmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErPTIpe2NvbnN0IGM9bmV3IFNrLmJ1aWx0aW4uc3RyKGJbYV0pLGQ9dGhpcy5tcCRzdWJzY3JpcHQoYyk7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGMsU2suYWJzdHIubnVtYmVyQmluT3AoZCxiW2ErMV0sXFxcIkFkZFxcXCIpKX1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfX0sY2xhc3NtZXRob2RzOntmcm9ta2V5czp7JG1ldGg6ZnVuY3Rpb24gZnJvbWtleXMoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJDb3VudGVyLmZyb21rZXlzKCkgaXMgdW5kZWZpbmVkLiAgVXNlIENvdW50ZXIoaXRlcmFibGUpIGluc3RlYWQuXFxcIil9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn19fX0pO2NvbnN0IGI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJvZGljdF9pdGVyYXRvclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIG9kaWN0X2l0ZXJfKGEpe3RoaXMuJGluZGV4PTAsdGhpcy4kc2VxPWEuc2skYXNhcnJheSgpLHRoaXMuJG9yaWc9YX0saXRlcm5leHQ6U2suZ2VuZXJpYy5pdGVyTmV4dFdpdGhBcnJheUNoZWNrU2l6ZSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO2EuT3JkZXJlZERpY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiT3JkZXJlZERpY3RcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBPcmRlcmVkRGljdCgpe3JldHVybiB0aGlzLm9yZGVyZWRrZXlzPVtdLFNrLmJ1aWx0aW4uZGljdC5jYWxsKHRoaXMpLHRoaXN9LGJhc2U6U2suYnVpbHRpbi5kaWN0LHNsb3RzOnt0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGluaXQoYSxiKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcIk9yZGVyZWREaWN0XFxcIixhLDAsMSksYS51bnNoaWZ0KHRoaXMpLHJlcz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy51cGRhdGUsYSxiKX0sdHAkZG9jOlxcXCJEaWN0aW9uYXJ5IHRoYXQgcmVtZW1iZXJzIGluc2VydGlvbiBvcmRlclxcXCIsJHIoKXtsZXQgYSxiO2NvbnN0IGM9W107Zm9yKGxldCBiPXRoaXMudHAkaXRlcigpLGQ9Yi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1iLnRwJGl0ZXJuZXh0KCkpYT10aGlzLm1wJHN1YnNjcmlwdChkKSx2b2lkIDA9PT1hJiYoYT1udWxsKSxjLnB1c2goXFxcIihcXFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoZCkrXFxcIiwgXFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1xcXCIpXFxcIik7cmV0dXJuIGI9Yy5qb2luKFxcXCIsIFxcXCIpLDA8Yy5sZW5ndGgmJihiPVxcXCJbXFxcIitiK1xcXCJdXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJPcmRlcmVkRGljdChcXFwiK2IrXFxcIilcXFwiKX0sdHAkcmljaGNvbXBhcmUoYixjKXtpZihcXFwiRXFcXFwiIT1jJiZcXFwiTmVcXFwiIT1jKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBkPVxcXCJFcVxcXCI9PWM7aWYoIShiIGluc3RhbmNlb2YgYS5PcmRlcmVkRGljdCkpcmV0dXJuIFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkcmljaGNvbXBhcmUuY2FsbCh0aGlzLGIsYyk7Y29uc3QgZT10aGlzLnNpemUsZj1iLnNpemU7aWYoZSE9PWYpcmV0dXJuIWQ7Zm9yKGxldCBhPXRoaXMudHAkaXRlcigpLGU9Yi50cCRpdGVyKCksZj1hLnRwJGl0ZXJuZXh0KCksZz1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWEudHAkaXRlcm5leHQoKSxnPWUudHAkaXRlcm5leHQoKSl7aWYoIVNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZixnLFxcXCJFcVxcXCIpKSlyZXR1cm4hZDtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGYpLGM9Yi5tcCRzdWJzY3JpcHQoZyk7aWYoIVNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjLFxcXCJFcVxcXCIpKSlyZXR1cm4hZH1yZXR1cm4gZH0sbXAkYXNzX3N1YnNjcmlwdChhLGIpe2lmKHZvaWQgMD09PWIpe2NvbnN0IGI9dGhpcy5wb3AkaXRlbShhKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpfWVsc2UgdGhpcy5zZXQkaXRlbShhLGIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfX0sbWV0aG9kczp7cG9wOnskZmxhZ3M6e05hbWVkQXJnczpbXFxcImtleVxcXCIsXFxcImRlZmF1bHRcXFwiXSxEZWZhdWx0czpbbnVsbF19LCRtZXRoKGEsYil7cmV0dXJuIG51bGw9PT1iP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnBvcCxbdGhpcyxhXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUucG9wLFt0aGlzLGEsYl0pfX0scG9waXRlbTp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJsYXN0XFxcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4uYm9vbC50cnVlJF19LCRtZXRoKGEpe2xldCBiLGM7aWYoIXRoaXMub3JkZXJlZGtleXMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKFxcXCJkaWN0aW9uYXJ5IGlzIGVtcHR5XFxcIik7cmV0dXJuIGI9dGhpcy5vcmRlcmVka2V5c1swXSxTay5taXNjZXZhbC5pc1RydWUoYSkmJihiPXRoaXMub3JkZXJlZGtleXNbdGhpcy5vcmRlcmVka2V5cy5sZW5ndGgtMV0pLGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucG9wLFt0aGlzLGJdKSxuZXcgU2suYnVpbHRpbi50dXBsZShbYixjXSl9fSxtb3ZlX3RvX2VuZDp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJrZXlcXFwiLFxcXCJsYXN0XFxcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4uYm9vbC50cnVlJF19LCRtZXRoKGEsYil7bGV0IGMsZD0tMTtmb3IobGV0IGU9MDtlPHRoaXMub3JkZXJlZGtleXMubGVuZ3RoO2UrKylpZihjPXRoaXMub3JkZXJlZGtleXNbZV0sYz09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkVxXFxcIikpe2Q9ZTticmVha31pZigtMSE9PWQpdGhpcy5vcmRlcmVka2V5cy5zcGxpY2UoZCwxKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO3JldHVybiBTay5taXNjZXZhbC5pc1RydWUoYik/dGhpcy5vcmRlcmVka2V5cy5wdXNoKGEpOnRoaXMub3JkZXJlZGtleXMudW5zaGlmdChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9fX0scHJvdG86e3NrJGFzYXJyYXkoKXtyZXR1cm4gdGhpcy5vcmRlcmVka2V5cy5zbGljZSgwKX0sc2V0JGl0ZW0oYSxiKXtjb25zdCBjPXRoaXMub3JkZXJlZGtleXMuaW5kZXhPZihhKTstMT09YyYmdGhpcy5vcmRlcmVka2V5cy5wdXNoKGEpLFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUuc2V0JGl0ZW0uY2FsbCh0aGlzLGEsYil9LHBvcCRpdGVtKGEpe3ZhciBiPXRoaXMub3JkZXJlZGtleXMuaW5kZXhPZihhKTtpZigtMSE9YilyZXR1cm4gdGhpcy5vcmRlcmVka2V5cy5zcGxpY2UoYiwxKSxTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnBvcCRpdGVtLmNhbGwodGhpcyxhKX19fSksYS5kZXF1ZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJjb2xsZWN0aW9ucy5kZXF1ZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGRlcXVlKGEsYixjLGQsZSl7dGhpcy5oZWFkPWN8fDAsdGhpcy50YWlsPWR8fDAsdGhpcy5tYXNrPWV8fDEsdGhpcy5tYXhsZW49Yix0aGlzLnY9YXx8WywsXX0sc2xvdHM6e3RwJGRvYzpcXFwiZGVxdWUoW2l0ZXJhYmxlWywgbWF4bGVuXV0pIC0tPiBkZXF1ZSBvYmplY3RcXFxcblxcXFxuQSBsaXN0LWxpa2Ugc2VxdWVuY2Ugb3B0aW1pemVkIGZvciBkYXRhIGFjY2Vzc2VzIG5lYXIgaXRzIGVuZHBvaW50cy5cXFwiLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYil7aWYoW2l0ZXJhYmxlLG1heGxlbl09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImRlcXVlXFxcIixbXFxcIml0ZXJhYmxlXFxcIixcXFwibWF4bGVuXFxcIl0sYSxiKSx2b2lkIDAhPT1tYXhsZW4mJiFTay5idWlsdGluLmNoZWNrTm9uZShtYXhsZW4pKWlmKG1heGxlbj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQobWF4bGVuLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixcXFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFxcXCIpLDA+bWF4bGVuKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1heGxlbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2Vsc2UgdGhpcy5tYXhsZW49bWF4bGVuO3RoaXMuJGNsZWFyKCksdm9pZCAwIT09aXRlcmFibGUmJnRoaXMuJGV4dGVuZChpdGVyYWJsZSl9LHRwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJHJpY2hjb21wYXJlKGIsYyl7dmFyIGQ9TWF0aC5tYXg7aWYodGhpcz09PWImJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYykpcmV0dXJuITA7aWYoIShiIGluc3RhbmNlb2YgYS5kZXF1ZSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGU9YixmPXRoaXMudjtiPWIudjtjb25zdCBnPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrLGg9ZS50YWlsLWUuaGVhZCZlLm1hc2s7bGV0IGosbD1kKGcsaCk7aWYoZz09PWgpZm9yKGw9MDtsPGcmJmw8aCYmKGo9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGZbdGhpcy5oZWFkK2wmdGhpcy5tYXNrXSxiW2UuaGVhZCtsJmUubWFza10sXFxcIkVxXFxcIiksISFqKTsrK2wpO2lmKGw+PWd8fGw+PWgpc3dpdGNoKGMpe2Nhc2VcXFwiTHRcXFwiOnJldHVybiBnPGg7Y2FzZVxcXCJMdEVcXFwiOnJldHVybiBnPD1oO2Nhc2VcXFwiRXFcXFwiOnJldHVybiBnPT09aDtjYXNlXFxcIk5vdEVxXFxcIjpyZXR1cm4gZyE9PWg7Y2FzZVxcXCJHdFxcXCI6cmV0dXJuIGc+aDtjYXNlXFxcIkd0RVxcXCI6cmV0dXJuIGc+PWg7fXJldHVyblxcXCJFcVxcXCIhPT1jJiYoXFxcIk5vdEVxXFxcIj09PWN8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmW3RoaXMuaGVhZCtsJnRoaXMubWFza10sYltlLmhlYWQrbCZlLm1hc2tdLGMpKX0sdHAkaXRlcigpe3JldHVybiBuZXcgYyh0aGlzKX0sJHIoKXtjb25zdCBhPVtdLGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYodGhpcy4kZW50ZXJlZF9yZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlsuLi5dXFxcIik7dGhpcy4kZW50ZXJlZF9yZXByPSEwO2ZvcihsZXQgYz0wO2M8YjtjKyspYS5wdXNoKFNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy52W3RoaXMuaGVhZCtjJnRoaXMubWFza10pKTtjb25zdCBjPVNrLmFic3RyLnR5cGVOYW1lKHRoaXMpO3JldHVybiB2b2lkIDA9PT10aGlzLm1heGxlbj8odGhpcy4kZW50ZXJlZF9yZXByPXZvaWQgMCxuZXcgU2suYnVpbHRpbi5zdHIoYytcXFwiKFtcXFwiK2EuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXFxcIiwgXFxcIikrXFxcIl0pXFxcIikpOm5ldyBTay5idWlsdGluLnN0cihjK1xcXCIoW1xcXCIrYS5maWx0ZXIoQm9vbGVhbikuam9pbihcXFwiLCBcXFwiKStcXFwiXSwgbWF4bGVuPVxcXCIrdGhpcy5tYXhsZW4rXFxcIilcXFwiKX0sdHAkYXNfbnVtYmVyOiEwLG5iJGJvb2woKXtyZXR1cm4gMCE9KHRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrKX0sdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCxzcSRjb250YWlucyhhKXtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJFcVxcXCIpKXJldHVybiEwO3JldHVybiExfSxzcSRjb25jYXQoYil7aWYoIShiIGluc3RhbmNlb2YgYS5kZXF1ZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJjYW4gb25seSBjb25jYXRlbmF0ZSBkZXF1ZSAobm90ICdcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1xcXCInKSB0byBkZXF1ZVxcXCIpO2NvbnN0IGM9dGhpcy4kY29weSgpO2ZvcihsZXQgYT1iLnRwJGl0ZXIoKSxkPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1kO2Q9YS50cCRpdGVybmV4dCgpKWMuJHB1c2goZCk7cmV0dXJuIGN9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFza30sc3EkcmVwZWF0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSxcXFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICd7dHAkbmFtZX0nXFxcIik7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzayxjPXRoaXMuJGNvcHkoKTtsZXQgZDswPj1hJiZjLiRjbGVhcigpO2ZvcihsZXQgZT0xO2U8YTtlKyspZm9yKGxldCBhPTA7YTxiO2ErKylkPXRoaXMuaGVhZCthJnRoaXMubWFzayxjLiRwdXNoKHRoaXMudltkXSk7cmV0dXJuIGN9LG1wJHN1YnNjcmlwdChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYoYT49Ynx8YTwtYil0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2VcXFwiKTtjb25zdCBjPSgwPD1hP3RoaXMuaGVhZDp0aGlzLnRhaWwpK2EmdGhpcy5tYXNrO3JldHVybiB0aGlzLnZbY119LG1wJGFzc19zdWJzY3JpcHQoYSxiKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpO2NvbnN0IGM9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYoYT49Y3x8YTwtYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2VcXFwiKTt2b2lkIDA9PT1iP3RoaXMuZGVsJGl0ZW0oYSk6dGhpcy5zZXQkaXRlbShhLGIpfSxuYiRpbnBsYWNlX2FkZChhKXtmb3IodGhpcy5tYXhsZW49dm9pZCAwLGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2goaSk7cmV0dXJuIHRoaXN9LG5iJGlucGxhY2VfbXVsdGlwbHkoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IsXFxcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAne3RwJG5hbWV9J1xcXCIpLDA+PWEmJnRoaXMuJGNsZWFyKCk7Y29uc3QgYj10aGlzLiRjb3B5KCksYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztmb3IobGV0IGQ9MTtkPGE7ZCsrKWZvcihsZXQgYT0wO2E8YzthKyspe2NvbnN0IGM9dGhpcy5oZWFkK2EmdGhpcy5tYXNrO2IuJHB1c2godGhpcy52W2NdKX1yZXR1cm4gdGhpcy52PWIudix0aGlzLmhlYWQ9Yi5oZWFkLHRoaXMudGFpbD1iLnRhaWwsdGhpcy5tYXNrPWIubWFzayx0aGlzfX0sbWV0aG9kczp7YXBwZW5kOnskbWV0aChhKXtyZXR1cm4gdGhpcy4kcHVzaChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkFkZCBhbiBlbGVtZW50IHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZS5cXFwifSxhcHBlbmRsZWZ0OnskbWV0aChhKXtyZXR1cm4gdGhpcy4kcHVzaExlZnQoYSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJBZGQgYW4gZWxlbWVudCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZS5cXFwifSxjbGVhcjp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY2xlYXIoKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgZGVxdWUuXFxcIn0sX19jb3B5X186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgZGVxdWUuXFxcIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS5cXFwifSxjb3VudDp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztsZXQgYz0wO2ZvcihsZXQgZD0wO2Q8YjtkKyspU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMudlt0aGlzLmhlYWQrZCZ0aGlzLm1hc2tdLGEsXFxcIkVxXFxcIikmJmMrKztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5jb3VudCh2YWx1ZSkgLT4gaW50ZWdlciAtLSByZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHZhbHVlXFxcIn0sZXh0ZW5kOnskbWV0aChhKXtyZXR1cm4gdGhpcy4kZXh0ZW5kKGEpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRXh0ZW5kIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZSB3aXRoIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlXFxcIn0sZXh0ZW5kbGVmdDp7JG1ldGgoYSl7Zm9yKGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2hMZWZ0KGkpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkV4dGVuZCB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZSB3aXRoIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlXFxcIn0saW5kZXg6eyRtZXRoKGEsYixjKXtjb25zdCBkPXRoaXMuJGluZGV4KGEsYixjKTtpZih2b2lkIDAhPT1kKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGQpO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcXFwiIGlzIG5vdCBpbiBkZXF1ZVxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5pbmRleCh2YWx1ZSwgW3N0YXJ0LCBbc3RvcF1dKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZS5cXFxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cXFwifSxpbnNlcnQ6eyRtZXRoKGEsYil7YT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhLFxcXCJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3Qge3RwJG5hbWV9XFxcIik7Y29uc3QgYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztpZih2b2lkIDAhPT10aGlzLm1heGxlbiYmYz49dGhpcy5tYXhsZW4pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwiZGVxdWUgYWxyZWFkeSBhdCBpdHMgbWF4aW11bSBzaXplXFxcIik7YT5jJiYoYT1jKSxhPD0tYyYmKGE9MCk7Y29uc3QgZD0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzaztsZXQgZT10aGlzLnRhaWw7Zm9yKHRoaXMudGFpbD10aGlzLnRhaWwrMSZ0aGlzLm1hc2s7ZSE9PWQ7KXtjb25zdCBhPWUtMSZ0aGlzLm1hc2s7dGhpcy52W2VdPXRoaXMudlthXSxlPWF9cmV0dXJuIHRoaXMudltkXT1iLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5pbnNlcnQoaW5kZXgsIG9iamVjdCkgLS0gaW5zZXJ0IG9iamVjdCBiZWZvcmUgaW5kZXhcXFwifSxwb3A6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHBvcCgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZW1vdmUgYW5kIHJldHVybiB0aGUgcmlnaHRtb3N0IGVsZW1lbnQuXFxcIn0scG9wbGVmdDp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kcG9wTGVmdCgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZW1vdmUgYW5kIHJldHVybiB0aGUgbGVmdG1vc3QgZWxlbWVudC5cXFwifSxyZW1vdmU6eyRtZXRoKGEpe2NvbnN0IGI9dGhpcy4kaW5kZXgoYSk7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXFxcIiBpcyBub3QgaW4gZGVxdWVcXFwiKTtjb25zdCBjPXRoaXMuaGVhZCtiJnRoaXMubWFzaztmb3IobGV0IGI9YztiIT09dGhpcy50YWlsOyl7Y29uc3QgYT1iKzEmdGhpcy5tYXNrO3RoaXMudltiXT10aGlzLnZbYV0sYj1hfXRoaXMudGFpbD10aGlzLnRhaWwtMSZ0aGlzLm1hc2s7dmFyIGQ9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7ZDx0aGlzLm1hc2s+Pj4xJiZ0aGlzLiRyZXNpemUoZCx0aGlzLnYubGVuZ3RoPj4+MSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkQucmVtb3ZlKHZhbHVlKSAtLSByZW1vdmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB2YWx1ZS5cXFwifSxfX3JldmVyc2VkX186eyRtZXRoKCl7cmV0dXJuIG5ldyBkKHRoaXMpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELl9fcmV2ZXJzZWRfXygpIC0tIHJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWVcXFwifSxyZXZlcnNlOnskbWV0aCgpe2NvbnN0IGM9dGhpcy5oZWFkLGQ9dGhpcy50YWlsLGU9dGhpcy5tYXNrLGY9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7Zm9yKGxldCBnPTA7Zzx+fihmLzIpO2crKyl7Y29uc3QgZj1kLWctMSZlLGE9YytnJmUsYj10aGlzLnZbZl07dGhpcy52W2ZdPXRoaXMudlthXSx0aGlzLnZbYV09Yn1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELnJldmVyc2UoKSAtLSByZXZlcnNlICpJTiBQTEFDRSpcXFwifSxyb3RhdGU6eyRtZXRoKGEpe2E9dm9pZCAwPT09YT8xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Y29uc3QgYz10aGlzLmhlYWQsZD10aGlzLnRhaWw7aWYoMD09PWF8fGM9PT1kKXJldHVybiB0aGlzO2lmKHRoaXMuaGVhZD1jLWEmdGhpcy5tYXNrLHRoaXMudGFpbD1kLWEmdGhpcy5tYXNrLDA8YSlmb3IobGV0IGU9MTtlPD1hO2UrKyl7Y29uc3QgZj1jLWUmdGhpcy5tYXNrLGE9ZC1lJnRoaXMubWFzazt0aGlzLnZbZl09dGhpcy52W2FdLHRoaXMudlthXT12b2lkIDB9ZWxzZSBmb3IobGV0IGU9MDtlPmE7ZS0tKXtjb25zdCBmPWQtZSZ0aGlzLm1hc2ssYT1jLWUmdGhpcy5tYXNrO3RoaXMudltmXT10aGlzLnZbYV0sdGhpcy52W2FdPXZvaWQgMH1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUm90YXRlIHRoZSBkZXF1ZSBuIHN0ZXBzIHRvIHRoZSByaWdodCAoZGVmYXVsdCBuPTEpLiAgSWYgbiBpcyBuZWdhdGl2ZSwgcm90YXRlcyBsZWZ0LlxcXCJ9fSxnZXRzZXRzOnttYXhsZW46eyRnZXQoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5tYXhsZW4/U2suYnVpbHRpbi5ub25lLm5vbmUkOm5ldyBTay5idWlsdGluLmludF8odGhpcy5tYXhsZW4pfSwkZG9jOlxcXCJtYXhpbXVtIHNpemUgb2YgYSBkZXF1ZSBvciBOb25lIGlmIHVuYm91bmRlZFxcXCJ9fSxwcm90bzp7JGNsZWFyKCl7dGhpcy5oZWFkPTAsdGhpcy50YWlsPTAsdGhpcy5tYXNrPTEsdGhpcy52PVssLF19LCRjb3B5KCl7cmV0dXJuIG5ldyBhLmRlcXVlKHRoaXMudi5zbGljZSgwKSx0aGlzLm1heGxlbix0aGlzLmhlYWQsdGhpcy50YWlsLHRoaXMubWFzayl9LCRleHRlbmQoYSl7Zm9yKGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2goaSl9LHNldCRpdGVtKGEsYil7Y29uc3QgYz0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzazt0aGlzLnZbY109Yn0sZGVsJGl0ZW0oYSl7Y29uc3QgYj0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzaztmb3IobGV0IGM9YjtjIT09dGhpcy50YWlsOyl7Y29uc3QgYT1jKzEmdGhpcy5tYXNrO3RoaXMudltjXT10aGlzLnZbYV0sYz1hfWNvbnN0IGM9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7dGhpcy50YWlsPXRoaXMudGFpbC0xJnRoaXMubWFzayxjPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShjLHRoaXMudi5sZW5ndGg+Pj4xKX0sJHB1c2goYSl7dGhpcy52W3RoaXMudGFpbF09YSx0aGlzLnRhaWw9dGhpcy50YWlsKzEmdGhpcy5tYXNrLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSk7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gdm9pZCAwIT09dGhpcy5tYXhsZW4mJmI+dGhpcy5tYXhsZW4mJnRoaXMuJHBvcExlZnQoKSx0aGlzfSwkcHVzaExlZnQoYSl7dGhpcy5oZWFkPXRoaXMuaGVhZC0xJnRoaXMubWFzayx0aGlzLnZbdGhpcy5oZWFkXT1hLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSk7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gdm9pZCAwIT09dGhpcy5tYXhsZW4mJmI+dGhpcy5tYXhsZW4mJnRoaXMuJHBvcCgpLHRoaXN9LCRwb3AoKXtpZih0aGlzLmhlYWQ9PT10aGlzLnRhaWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwicG9wIGZyb20gYW4gZW1wdHkgZGVxdWVcXFwiKTt0aGlzLnRhaWw9dGhpcy50YWlsLTEmdGhpcy5tYXNrO2NvbnN0IGE9dGhpcy52W3RoaXMudGFpbF07dGhpcy52W3RoaXMudGFpbF09dm9pZCAwO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7cmV0dXJuIGI8dGhpcy5tYXNrPj4+MSYmdGhpcy4kcmVzaXplKGIsdGhpcy52Lmxlbmd0aD4+PjEpLGF9LCRwb3BMZWZ0KCl7aWYodGhpcy5oZWFkPT09dGhpcy50YWlsKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXFxcInBvcCBmcm9tIGFuIGVtcHR5IGRlcXVlXFxcIik7Y29uc3QgYT10aGlzLnZbdGhpcy5oZWFkXTt0aGlzLnZbdGhpcy5oZWFkXT12b2lkIDAsdGhpcy5oZWFkPXRoaXMuaGVhZCsxJnRoaXMubWFzaztjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO3JldHVybiBiPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShiLHRoaXMudi5sZW5ndGg+Pj4xKSxhfSwkcmVzaXplKGEsYil7Y29uc3QgYz10aGlzLmhlYWQsZD10aGlzLm1hc2s7aWYodGhpcy5oZWFkPTAsdGhpcy50YWlsPWEsdGhpcy5tYXNrPWItMSwwPT09YylyZXR1cm4gdm9pZCh0aGlzLnYubGVuZ3RoPWIpO2NvbnN0IGU9QXJyYXkoYik7Zm9yKGxldCBmPTA7ZjxhO2YrKyllW2ZdPXRoaXMudltjK2YmZF07dGhpcy52PWV9LCRpbmRleChhLGIsYyl7Y29uc3QgZD10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztiPXZvaWQgMD09PWI/MDpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKSxjPWM9PT12b2lkIDA/ZDpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhjKTtjb25zdCBlPXRoaXMuaGVhZCxmPXRoaXMubWFzayxnPXRoaXMudixoPTA8PWI/YjpiPC1kPzA6ZCtiO2M9MDw9Yz9jOmM8LWQ/MDpkK2M7Zm9yKGxldCBkPWg7ZDxjO2QrKylpZihnW2UrZCZmXT09PWEpcmV0dXJuIGR9LHNrJGFzYXJyYXkoKXtjb25zdCBhPVtdLGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7Zm9yKGxldCBjPTA7YzxiOysrYyl7Y29uc3QgYj10aGlzLmhlYWQrYyZ0aGlzLm1hc2s7YS5wdXNoKHRoaXMudltiXSl9cmV0dXJuIGF9fX0pO2NvbnN0IGM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJfY29sbGVjdGlvbnMuX2RlcXVlX2l0ZXJhdG9yXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gX2RlcXVlX2l0ZXJhdG9yKGEpe3RoaXMuJGluZGV4PTAsdGhpcy5kcT1hLnYsdGhpcy4kbGVuZ3RoPWEudGFpbC1hLmhlYWQmYS5tYXNrLHRoaXMuJGhlYWQ9YS5oZWFkLHRoaXMuJHRhaWw9YS50YWlsLHRoaXMuJG1hc2s9YS5tYXNrfSxpdGVybmV4dCgpe2lmKCEodGhpcy4kaW5kZXg+PXRoaXMuJGxlbmd0aCkpe2NvbnN0IGE9KDA8PXRoaXMuJGluZGV4P3RoaXMuJGhlYWQ6dGhpcy4kdGFpbCkrdGhpcy4kaW5kZXgmdGhpcy4kbWFzaztyZXR1cm4gdGhpcy4kaW5kZXgrKyx0aGlzLmRxW2FdfX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOnskbWV0aDpmdW5jdGlvbiBfX2xlbmd0aF9oaW50X18oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRsZW5ndGgtdGhpcy4kaW5kZXgpfSwkZmxhZ3M6e05vQXJnczohMH19fX0pLGQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJfY29sbGVjdGlvbnMuX2RlcXVlX3JldmVyc2VfaXRlcmF0b3JcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBfZGVxdWVfcmV2ZXJzZV9pdGVyYXRvcihhKXt0aGlzLiRpbmRleD0oYS50YWlsLWEuaGVhZCZhLm1hc2spLTEsdGhpcy5kcT1hLnYsdGhpcy4kaGVhZD1hLmhlYWQsdGhpcy4kbWFzaz1hLm1hc2t9LGl0ZXJuZXh0KCl7aWYoISgwPnRoaXMuJGluZGV4KSl7Y29uc3QgYT10aGlzLiRoZWFkK3RoaXMuJGluZGV4JnRoaXMuJG1hc2s7cmV0dXJuIHRoaXMuJGluZGV4LS0sdGhpcy5kcVthXX19LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZn19KSxlPW5ldyBSZWdFeHAoL15bMC05XS4qLyksZj1uZXcgUmVnRXhwKC9eWzAtOV9dLiovKSxnPW5ldyBSZWdFeHAoL15cXFxcdyokLyksaD0vLC9nLGo9L1xcXFxzKy87cmV0dXJuIG5hbWVkdHVwbGUuY29fYXJnY291bnQ9MixuYW1lZHR1cGxlLmNvX2t3b25seWFyZ2NvdW50PTMsbmFtZWR0dXBsZS4ka3dkZWZzPVtTay5idWlsdGluLmJvb2wuZmFsc2UkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdLG5hbWVkdHVwbGUuY29fdmFybmFtZXM9W1xcXCJ0eXBlbmFtZVxcXCIsXFxcImZpZWxkX25hbWVzXFxcIixcXFwicmVuYW1lXFxcIixcXFwiZGVmYXVsdHNcXFwiLFxcXCJtb2R1bGVcXFwiXSxhLm5hbWVkdHVwbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhuYW1lZHR1cGxlKSxhfVwiLFwic3JjL2xpYi9jb2xvcnN5cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29sb3JzeXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb21tYW5kcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29tbWFuZHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb21waWxlYWxsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21waWxlYWxsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29tcGlsZXIvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbXBpbGVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29uZmlnL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb25maWcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb250ZXh0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb250ZXh0bGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29va2llbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb29raWVsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb3B5LnB5XCI6XCJcXFwiXFxcIlxcXCJcXG5UaGlzIGZpbGUgd2FzIG1vZGlmaWVkIGZyb20gQ1B5dGhvbi5cXG5Db3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsXFxuMjAxMSwgMjAxMiwgMjAxMywgMjAxNCwgMjAxNSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjsgQWxsIFJpZ2h0cyBSZXNlcnZlZFxcblxcXCJcXFwiXFxcIlxcbmltcG9ydCB0eXBlc1xcbmNsYXNzIEVycm9yKEV4Y2VwdGlvbik6XFxuICAgIHBhc3NcXG5lcnJvciA9IEVycm9yIFxcbmNsYXNzIF9FbXB0eUNsYXNzOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBsb25nXFxuZXhjZXB0IE5hbWVFcnJvcjpcXG4gICAgbG9uZyA9IGludFxcblxcbmRlZiBjb3B5KHgpOlxcbiAgICBjbHMgPSB0eXBlKHgpXFxuICAgIGlmIGNhbGxhYmxlKHgpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgY29waWVyID0gZ2V0YXR0cihjbHMsIFxcXCJfX2NvcHlfX1xcXCIsIE5vbmUpXFxuICAgIGlmIGNvcGllcjpcXG4gICAgICAgIHJldHVybiBjb3BpZXIoeClcXG4gICAgaWYgY2xzIGluICh0eXBlKE5vbmUpLCBpbnQsIGZsb2F0LCBib29sLCBzdHIsIHR1cGxlLCB0eXBlLCBmcm96ZW5zZXQsIGxvbmcpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgaWYgKGNscyA9PSBsaXN0KSBvciAoY2xzID09IGRpY3QpIG9yIChjbHMgPT0gc2V0KSBvciAoY2xzID09IHNsaWNlKTpcXG4gICAgICAgIHJldHVybiBjbHMoeClcXG4gICAgdHJ5OlxcbiAgICAgICAgZ2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX2dldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgc2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX3NldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgaW5pdGFyZ3MgPSBnZXRhdHRyKHgsIFxcXCJfX2dldGluaXRhcmdzX19cXFwiLCBOb25lKVxcbiAgICBleGNlcHQ6XFxuICAgICAgICByZWR1Y3RvciA9IEZhbHNlXFxuICAgIGlmIGdldHN0YXRlIG9yIHNldHN0YXRlIG9yIGluaXRhcmdzOlxcbiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU2t1bHB0IGRvZXMgbm90IHlldCBzdXBwb3J0IGNvcHlpbmcgd2l0aCB1c2VyLWRlZmluZWQgX19nZXRzdGF0ZV9fLCBfX3NldHN0YXRlX18gb3IgX19nZXRpbml0YXJnc19fKClcXFwiKVxcbiAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgXFxcIl9fcmVkdWNlX2V4X19cXFwiLCBOb25lKVxcbiAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgIHJ2ID0gcmVkdWN0b3IoNClcXG4gICAgZWxzZTpcXG4gICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfX1xcXCIsIE5vbmUpXFxuICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICBydiA9IHJlZHVjdG9yKClcXG4gICAgICAgIGVsaWYgc3RyKGNscylbMTo2XSA9PSBcXFwiY2xhc3NcXFwiOlxcbiAgICAgICAgICAgIGNvcGllciA9IF9jb3B5X2luc3RcXG4gICAgICAgICAgICByZXR1cm4gY29waWVyKHgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEVycm9yKFxcXCJ1bihzaGFsbG93KWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzXFxcIiAlIGNscylcXG4gICAgaWYgaXNpbnN0YW5jZShydiwgc3RyKTpcXG4gICAgICAgIHJldHVybiB4XFxuICAgIHJldHVybiBfcmVjb25zdHJ1Y3QoeCwgcnYsIDApXFxuXFxuZGVmIF9jb3B5X2luc3QoeCk6XFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fY29weV9fJyk6XFxuICAgICAgICByZXR1cm4geC5fX2NvcHlfXygpXFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0aW5pdGFyZ3NfXycpOlxcbiAgICAgICAgYXJncyA9IHguX19nZXRpbml0YXJnc19fKClcXG4gICAgICAgIHkgPSB4Ll9fY2xhc3NfXygqYXJncylcXG4gICAgZWxzZTpcXG4gICAgICAgIHkgPSBfRW1wdHlDbGFzcygpXFxuICAgICAgICB5Ll9fY2xhc3NfXyA9IHguX19jbGFzc19fXFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0c3RhdGVfXycpOlxcbiAgICAgICAgc3RhdGUgPSB4Ll9fZ2V0c3RhdGVfXygpXFxuICAgIGVsc2U6XFxuICAgICAgICBzdGF0ZSA9IHguX19kaWN0X19cXG4gICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6XFxuICAgICAgICB5Ll9fc2V0c3RhdGVfXyhzdGF0ZSlcXG4gICAgZWxzZTpcXG4gICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKVxcbiAgICByZXR1cm4geVxcblxcbmQgPSBfZGVlcGNvcHlfZGlzcGF0Y2ggPSB7fVxcblxcbmRlZiBkZWVwY29weSh4LCBtZW1vPU5vbmUsIF9uaWw9W10pOlxcbiAgICBcXFwiXFxcIlxcXCJEZWVwIGNvcHkgb3BlcmF0aW9uIG9uIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy5cXG4gICAgU2VlIHRoZSBtb2R1bGUncyBfX2RvY19fIHN0cmluZyBmb3IgbW9yZSBpbmZvLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgaWYgbWVtbyBpcyBOb25lOlxcbiAgICAgICAgbWVtbyA9IHt9XFxuICAgIGlkeCA9IGlkKHgpXFxuICAgIHkgPSBtZW1vLmdldChpZHgsIF9uaWwpXFxuICAgIGlmIHkgaXMgbm90IF9uaWw6XFxuICAgICAgICByZXR1cm4geVxcbiAgICBjbHMgPSB0eXBlKHgpXFxuICAgIHRyeTpcXG4gICAgICAgIGdldHN0YXRlID0gZ2V0YXR0cih4LCBcXFwiX19nZXRzdGF0ZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIHNldHN0YXRlID0gZ2V0YXR0cih4LCBcXFwiX19zZXRzdGF0ZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIGluaXRhcmdzID0gZ2V0YXR0cih4LCBcXFwiX19nZXRpbml0YXJnc19fXFxcIiwgTm9uZSlcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmVkdWN0b3IgPSBGYWxzZVxcbiAgICBpZiBnZXRzdGF0ZSBvciBzZXRzdGF0ZSBvciBpbml0YXJnczpcXG4gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNrdWxwdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBjb3B5aW5nIHdpdGggdXNlci1kZWZpbmVkIF9fZ2V0c3RhdGVfXywgX19zZXRzdGF0ZV9fIG9yIF9fZ2V0aW5pdGFyZ3NfXygpXFxcIilcXG4gICAgY29waWVyID0gX2RlZXBjb3B5X2Rpc3BhdGNoLmdldChjbHMpXFxuICAgIGlmIGNvcGllcjpcXG4gICAgICAgIHkgPSBjb3BpZXIoeCwgbWVtbylcXG4gICAgZWxpZiBzdHIoY2xzKVsxOjZdID09IFxcXCJjbGFzc1xcXCI6XFxuICAgICAgICBjb3BpZXIgPSBfZGVlcGNvcHlfZGlzcGF0Y2hbXFxcIkluc3RhbmNlVHlwZVxcXCJdXFxuICAgICAgICB5ID0gY29waWVyKHgsIG1lbW8pXFxuICAgIGVsc2U6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgaXNzYyA9IGlzc3ViY2xhc3MoY2xzLCB0eXBlKVxcbiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogIyBjbHMgaXMgbm90IGEgY2xhc3MgKG9sZCBCb29zdDsgc2VlIFNGICM1MDIwODUpXFxuICAgICAgICAgICAgaXNzYyA9IDBcXG4gICAgICAgIGlmIGlzc2M6XFxuICAgICAgICAgICAgeSA9IF9kZWVwY29weV9hdG9taWMoeCwgbWVtbylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgY29waWVyID0gZ2V0YXR0cih4LCBcXFwiX19kZWVwY29weV9fXFxcIiwgTm9uZSlcXG4gICAgICAgICAgICBpZiBjb3BpZXI6XFxuICAgICAgICAgICAgICAgIHkgPSBjb3BpZXIobWVtbylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgXFxcIl9fcmVkdWNlX2V4X19cXFwiLCBOb25lKVxcbiAgICAgICAgICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICAgICAgICAgIHJ2ID0gcmVkdWN0b3IoMilcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfX1xcXCIsIE5vbmUpXFxuICAgICAgICAgICAgICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICAgICAgICAgICAgICBydiA9IHJlZHVjdG9yKClcXG4gICAgICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1bihkZWVwKWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzXFxcIiAlIGNscylcXG4gICAgICAgICAgICAgICAgeSA9IF9yZWNvbnN0cnVjdCh4LCBydiwgMSwgbWVtbylcXG4gICAgbWVtb1tpZHhdID0geVxcbiAgICBfa2VlcF9hbGl2ZSh4LCBtZW1vKSAjIE1ha2Ugc3VyZSB4IGxpdmVzIGF0IGxlYXN0IGFzIGxvbmcgYXMgZFxcbiAgICByZXR1cm4geVxcblxcbmRlZiBfZGVlcGNvcHlfYXRvbWljKHgsIG1lbW8pOlxcbiAgICByZXR1cm4geFxcbmRbdHlwZShOb25lKV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW3R5cGUoRWxsaXBzaXMpXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW3R5cGUoTm90SW1wbGVtZW50ZWQpXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2ludF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtmbG9hdF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtib29sXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2NvbXBsZXhdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZFtieXRlc10gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtzdHJdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgdHJ5OlxcbiMgZFt0eXBlcy5Db2RlVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuIyAgIHBhc3NcXG5kW3R5cGVdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZFt0eXBlcy5CdWlsdGluRnVuY3Rpb25UeXBlXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW3R5cGVzLkZ1bmN0aW9uVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW3dlYWtyZWYucmVmXSA9IF9kZWVwY29weV9hdG9taWNcXG5cXG5kZWYgX2RlZXBjb3B5X2xpc3QoeCwgbWVtbyk6XFxuICAgIHkgPSBbXVxcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgZm9yIGEgaW4geDpcXG4gICAgICAgIHkuYXBwZW5kKGRlZXBjb3B5KGEsIG1lbW8pKVxcbiAgICByZXR1cm4geVxcbmRbbGlzdF0gPSBfZGVlcGNvcHlfbGlzdFxcblxcbmRlZiBfZGVlcGNvcHlfc2V0KHgsIG1lbW8pOlxcbiAgICByZXN1bHQgPSBzZXQoW10pICAjIG1ha2UgZW1wdHkgc2V0XFxuICAgIG1lbW9baWQoeCldID0gcmVzdWx0ICAjIHJlZ2lzdGVyIHRoaXMgc2V0IGluIHRoZSBtZW1vIGZvciBsb29wIGNoZWNraW5nXFxuICAgIGZvciBhIGluIHg6ICAgIyBnbyB0aHJvdWdoIGVsZW1lbnRzIG9mIHNldFxcbiAgICAgICAgcmVzdWx0LmFkZChkZWVwY29weShhLCBtZW1vKSkgICMgYWRkIHRoZSBjb3BpZWQgZWxlbWVudHMgaW50byB0aGUgbmV3IHNldFxcbiAgICByZXR1cm4gcmVzdWx0ICMgcmV0dXJuIHRoZSBuZXcgc2V0XFxuZFtzZXRdID0gX2RlZXBjb3B5X3NldFxcblxcbmRlZiBfZGVlcGNvcHlfZnJvemVuc2V0KHgsIG1lbW8pOlxcbiAgICByZXN1bHQgPSBmcm96ZW5zZXQoX2RlZXBjb3B5X3NldCh4LG1lbW8pKSBcXG4gICAgbWVtb1tpZCh4KV0gPSByZXN1bHQgXFxuICAgIHJldHVybiByZXN1bHRcXG5kW2Zyb3plbnNldF0gPSBfZGVlcGNvcHlfZnJvemVuc2V0XFxuXFxuZGVmIF9kZWVwY29weV90dXBsZSh4LCBtZW1vKTpcXG4gICAgeSA9IFtkZWVwY29weShhLCBtZW1vKSBmb3IgYSBpbiB4XVxcbiAgICAjIFdlJ3JlIG5vdCBnb2luZyB0byBwdXQgdGhlIHR1cGxlIGluIHRoZSBtZW1vLCBidXQgaXQncyBzdGlsbCBpbXBvcnRhbnQgd2VcXG4gICAgIyBjaGVjayBmb3IgaXQsIGluIGNhc2UgdGhlIHR1cGxlIGNvbnRhaW5zIHJlY3Vyc2l2ZSBtdXRhYmxlIHN0cnVjdHVyZXMuXFxuICAgIHRyeTpcXG4gICAgICAgIHJldHVybiBtZW1vW2lkKHgpXVxcbiAgICBleGNlcHQgS2V5RXJyb3I6XFxuICAgICAgICBwYXNzXFxuICAgIGZvciBrLCBqIGluIHppcCh4LCB5KTpcXG4gICAgICAgIGlmIGsgaXMgbm90IGo6XFxuICAgICAgICAgICAgeSA9IHR1cGxlKHkpXFxuICAgICAgICAgICAgYnJlYWtcXG4gICAgZWxzZTpcXG4gICAgICAgIHkgPSB4XFxuICAgIHJldHVybiB5XFxuZFt0dXBsZV0gPSBfZGVlcGNvcHlfdHVwbGVcXG5cXG5kZWYgX2RlZXBjb3B5X2RpY3QoeCwgbWVtbyk6XFxuICAgIHkgPSB7fVxcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgZm9yIGtleSwgdmFsdWUgaW4geC5pdGVtcygpOlxcbiAgICAgICAgeVtkZWVwY29weShrZXksIG1lbW8pXSA9IGRlZXBjb3B5KHZhbHVlLCBtZW1vKVxcbiAgICByZXR1cm4geVxcbmRbZGljdF0gPSBfZGVlcGNvcHlfZGljdFxcblxcbiMgZGVmIF9kZWVwY29weV9tZXRob2QoeCwgbWVtbyk6ICMgQ29weSBpbnN0YW5jZSBtZXRob2RzXFxuIyAgICAgeSA9IHR5cGUoeCkoeC5pbV9mdW5jLCBkZWVwY29weSh4LmltX3NlbGYsIG1lbW8pLCB4LmltX2NsYXNzKTtcXG4jICAgICByZXR1cm4geVxcbmRbdHlwZXMuTWV0aG9kVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuXFxuZGVmIF9kZWVwY29weV9pbnN0KHgsIG1lbW8pOlxcbiAgICBpZiBoYXNhdHRyKHgsICdfX2RlZXBjb3B5X18nKTpcXG4gICAgICAgICByZXR1cm4geC5fX2RlZXBjb3B5X18obWVtbylcXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRpbml0YXJnc19fJyk6XFxuICAgICAgICBhcmdzID0geC5fX2dldGluaXRhcmdzX18oKVxcbiAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pXFxuICAgICAgICB5ID0geC5fX2NsYXNzX18oKmFyZ3MpXFxuICAgIGVsc2U6XFxuICAgICAgICB5ID0gX0VtcHR5Q2xhc3MoKVxcbiAgICAgICAgeS5fX2NsYXNzX18gPSB4Ll9fY2xhc3NfX1xcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRzdGF0ZV9fJyk6XFxuICAgICAgICBzdGF0ZSA9IHguX19nZXRzdGF0ZV9fKClcXG4gICAgZWxzZTpcXG4gICAgICAgIHN0YXRlID0geC5fX2RpY3RfX1xcbiAgICBzdGF0ZSA9IGRlZXBjb3B5KHN0YXRlLCBtZW1vKVxcbiAgICBpZiBoYXNhdHRyKHksICdfX3NldHN0YXRlX18nKTpcXG4gICAgICAgIHkuX19zZXRzdGF0ZV9fKHN0YXRlKVxcbiAgICBlbHNlOlxcbiAgICAgICAgeS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpXFxuICAgICAgICByZXR1cm4geVxcbmRbXFxcIkluc3RhbmNlVHlwZVxcXCJdID0gX2RlZXBjb3B5X2luc3RcXG5cXG5kZWYgX2tlZXBfYWxpdmUoeCwgbWVtbyk6XFxuICAgIFxcXCJcXFwiXFxcIktlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgeCBpbiB0aGUgbWVtby5cXG4gICAgQmVjYXVzZSB3ZSByZW1lbWJlciBvYmplY3RzIGJ5IHRoZWlyIGlkLCB3ZSBoYXZlXFxuICAgIHRvIGFzc3VyZSB0aGF0IHBvc3NpYmx5IHRlbXBvcmFyeSBvYmplY3RzIGFyZSBrZXB0XFxuICAgIGFsaXZlIGJ5IHJlZmVyZW5jaW5nIHRoZW0uXFxuICAgIFdlIHN0b3JlIGEgcmVmZXJlbmNlIGF0IHRoZSBpZCBvZiB0aGUgbWVtbywgd2hpY2ggc2hvdWxkXFxuICAgIG5vcm1hbGx5IG5vdCBiZSB1c2VkIHVubGVzcyBzb21lb25lIHRyaWVzIHRvIGRlZXBjb3B5XFxuICAgIHRoZSBtZW1vIGl0c2VsZi4uLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdHJ5OlxcbiAgICAgICAgbWVtb1tpZChtZW1vKV0uYXBwZW5kKHgpXFxuICAgIGV4Y2VwdCBLZXlFcnJvcjpcXG4gICAgICAgICMgYWhhLCB0aGlzIGlzIHRoZSBmaXJzdCBvbmUgOi0pXFxuICAgICAgICBtZW1vW2lkKG1lbW8pXT1beF1cXG5cXG5kZWYgX3JlY29uc3RydWN0KHgsIGluZm8sIGRlZXAsIG1lbW89Tm9uZSk6XFxuICAgIGlmIGlzaW5zdGFuY2UoaW5mbywgc3RyKTpcXG4gICAgICAgIHJldHVybiB4XFxuICAgIGFzc2VydCBpc2luc3RhbmNlKGluZm8sIHR1cGxlKVxcbiAgICBpZiBtZW1vIGlzIE5vbmU6XFxuICAgICAgICBtZW1vID0ge31cXG4gICAgbiA9IGxlbihpbmZvKVxcbiAgICBhc3NlcnQgbiBpbiAoMiwgMywgNCwgNSlcXG4gICAgY2FsbGFibGUsIGFyZ3MgPSBpbmZvWzoyXVxcbiAgICBpZiBuID4gMjpcXG4gICAgICAgIHN0YXRlID0gaW5mb1syXVxcbiAgICBlbHNlOlxcbiAgICAgICAgc3RhdGUgPSBOb25lXFxuICAgIGlmIG4gPiAzOlxcbiAgICAgICAgbGlzdGl0ZXIgPSBpbmZvWzNdXFxuICAgIGVsc2U6XFxuICAgICAgICBsaXN0aXRlciA9IE5vbmVcXG4gICAgaWYgbiA+IDQ6XFxuICAgICAgICBkaWN0aXRlciA9IGluZm9bNF1cXG4gICAgZWxzZTpcXG4gICAgICAgIGRpY3RpdGVyID0gTm9uZVxcbiAgICBpZiBkZWVwOlxcbiAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pXFxuICAgIHkgPSBjYWxsYWJsZSgqYXJncylcXG4gICAgbWVtb1tpZCh4KV0gPSB5XFxuXFxuICAgIGlmIHN0YXRlIGlzIG5vdCBOb25lOlxcbiAgICAgICAgaWYgZGVlcDpcXG4gICAgICAgICAgICBzdGF0ZSA9IGRlZXBjb3B5KHN0YXRlLCBtZW1vKVxcbiAgICAgICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6XFxuICAgICAgICAgICAgeS5fX3NldHN0YXRlX18oc3RhdGUpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RhdGUsIHR1cGxlKSBhbmQgbGVuKHN0YXRlKSA9PSAyOlxcbiAgICAgICAgICAgICAgICBzdGF0ZSwgc2xvdHN0YXRlID0gc3RhdGVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzbG90c3RhdGUgPSBOb25lXFxuICAgICAgICAgICAgaWYgc3RhdGUgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKVxcbiAgICAgICAgICAgIGlmIHNsb3RzdGF0ZSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2xvdHN0YXRlLml0ZW1zKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHksIGtleSwgdmFsdWUpXFxuXFxuICAgIGlmIGxpc3RpdGVyIGlzIG5vdCBOb25lOlxcbiAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdGl0ZXI6XFxuICAgICAgICAgICAgaWYgZGVlcDpcXG4gICAgICAgICAgICAgICAgaXRlbSA9IGRlZXBjb3B5KGl0ZW0sIG1lbW8pXFxuICAgICAgICAgICAgeS5hcHBlbmQoaXRlbSlcXG4gICAgaWYgZGljdGl0ZXIgaXMgbm90IE5vbmU6XFxuICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aXRlcjpcXG4gICAgICAgICAgICBpZiBkZWVwOlxcbiAgICAgICAgICAgICAgICBrZXkgPSBkZWVwY29weShrZXksIG1lbW8pXFxuICAgICAgICAgICAgICAgIHZhbHVlID0gZGVlcGNvcHkodmFsdWUsIG1lbW8pXFxuICAgICAgICAgICAgeVtrZXldID0gdmFsdWVcXG4gICAgcmV0dXJuIHlcXG5cXG5kZWwgZFxcblxcbmRlbCB0eXBlc1xcblxcbiMgSGVscGVyIGZvciBpbnN0YW5jZSBjcmVhdGlvbiB3aXRob3V0IGNhbGxpbmcgX19pbml0X19cXG5jbGFzcyBfRW1wdHlDbGFzczpcXG4gICAgcGFzc1wiLFwic3JjL2xpYi9jb3B5X3JlZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29weV9yZWcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jc3YucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNzdiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2N0eXBlcy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY3R5cGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWNob2xpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2N1cnNlcy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY3Vyc2VzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGF0ZXRpbWUucHlcIjpcIlxcXCJcXFwiXFxcIkNvbmNyZXRlIGRhdGUvdGltZSBhbmQgcmVsYXRlZCB0eXBlcyAtLSBwcm90b3R5cGUgaW1wbGVtZW50ZWQgaW4gUHl0aG9uLlxcblxcblNlZSBodHRwOi8vd3d3LnpvcGUub3JnL01lbWJlcnMvZmRyYWtlL0RhdGVUaW1lV2lraS9Gcm9udFBhZ2VcXG5cXG5TZWUgYWxzbyBodHRwOi8vZGlyLnlhaG9vLmNvbS9SZWZlcmVuY2UvY2FsZW5kYXJzL1xcblxcbkZvciBhIHByaW1lciBvbiBEU1QsIGluY2x1ZGluZyBtYW55IGN1cnJlbnQgRFNUIHJ1bGVzLCBzZWVcXG5odHRwOi8vd2ViZXhoaWJpdHMub3JnL2RheWxpZ2h0c2F2aW5nL1xcblxcbkZvciBtb3JlIGFib3V0IERTVCB0aGFuIHlvdSBldmVyIHdhbnRlZCB0byBrbm93LCBzZWVcXG5mdHA6Ly9lbHNpZS5uY2kubmloLmdvdi9wdWIvXFxuXFxuU291cmNlcyBmb3IgdGltZSB6b25lIGFuZCBEU1QgZGF0YTogaHR0cDovL3d3dy50d2luc3VuLmNvbS90ei90ei1saW5rLmh0bVxcblxcblRoaXMgd2FzIG9yaWdpbmFsbHkgY29waWVkIGZyb20gdGhlIHNhbmRib3ggb2YgdGhlIENQeXRob24gQ1ZTIHJlcG9zaXRvcnkuXFxuVGhhbmtzIHRvIFRpbSBQZXRlcnMgZm9yIHN1Z2dlc3RpbmcgdXNpbmcgaXQuXFxuXFxuVGhpcyB3YXMgdGhlbiBjb3BpZWQgZnJvbSBQeVB5IHY1LjEuMCBpbnRvIFNrdWxwdCBieSBNZXJlZHlkZCBMdWZmLCByZW1vdmluZ1xcbidmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uJyAoYW5kIHJlcGxhY2luZyBkaXZpc2lvbiBvcGVyYXRvcnMgYWNjb3JkaW5nbHkpXFxuYW5kIHBpY2tsZSBzdXBwb3J0ICh3aGljaCByZXF1aXJlcyAnc3RydWN0Jywgd2hpY2ggU2t1bHB0IGRvZXMgbm90IGN1cnJlbnRseVxcblthcyBvZiAzMS84LzIwMTZdIGhhdmUpXFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IHRpbWUgYXMgX3RpbWVcXG5pbXBvcnQgbWF0aCBhcyBfbWF0aFxcblxcbiMgUHl0aG9uIDItdnMtMyBjb21wYXQgaGFja1xcbmltcG9ydCBzeXNcXG51bmljb2RlID0gdW5pY29kZSBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsKSBlbHNlIHN0clxcblxcbl9TRU5USU5FTCA9IG9iamVjdCgpXFxuXFxuZGVmIF9jbXAoeCwgeSk6XFxuICAgIHJldHVybiAwIGlmIHggPT0geSBlbHNlIDEgaWYgeCA+IHkgZWxzZSAtMVxcblxcbmRlZiBfcm91bmQoeCk6XFxuICAgIHJldHVybiBpbnQoX21hdGguZmxvb3IoeCArIDAuNSkgaWYgeCA+PSAwLjAgZWxzZSBfbWF0aC5jZWlsKHggLSAwLjUpKVxcblxcbk1JTllFQVIgPSAxXFxuTUFYWUVBUiA9IDk5OTlcXG5fTUlOWUVBUkZNVCA9IDE5MDBcXG5cXG5fTUFYX0RFTFRBX0RBWVMgPSA5OTk5OTk5OTlcXG5cXG4jIFV0aWxpdHkgZnVuY3Rpb25zLCBhZGFwdGVkIGZyb20gUHl0aG9uJ3MgRGVtby9jbGFzc2VzL0RhdGVzLnB5LCB3aGljaFxcbiMgYWxzbyBhc3N1bWVzIHRoZSBjdXJyZW50IEdyZWdvcmlhbiBjYWxlbmRhciBpbmRlZmluaXRlbHkgZXh0ZW5kZWQgaW5cXG4jIGJvdGggZGlyZWN0aW9ucy4gIERpZmZlcmVuY2U6ICBEYXRlcy5weSBjYWxscyBKYW51YXJ5IDEgb2YgeWVhciAwIGRheVxcbiMgbnVtYmVyIDEuICBUaGUgY29kZSBoZXJlIGNhbGxzIEphbnVhcnkgMSBvZiB5ZWFyIDEgZGF5IG51bWJlciAxLiAgVGhpcyBpc1xcbiMgdG8gbWF0Y2ggdGhlIGRlZmluaXRpb24gb2YgdGhlIFxcXCJwcm9sZXB0aWMgR3JlZ29yaWFuXFxcIiBjYWxlbmRhciBpbiBEZXJzaG93aXR6XFxuIyBhbmQgUmVpbmdvbGQncyBcXFwiQ2FsZW5kcmljYWwgQ2FsY3VsYXRpb25zXFxcIiwgd2hlcmUgaXQncyB0aGUgYmFzZSBjYWxlbmRhclxcbiMgZm9yIGFsbCBjb21wdXRhdGlvbnMuICBTZWUgdGhlIGJvb2sgZm9yIGFsZ29yaXRobXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlblxcbiMgcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFscyBhbmQgbWFueSBvdGhlciBjYWxlbmRhciBzeXN0ZW1zLlxcblxcbl9EQVlTX0lOX01PTlRIID0gWy0xLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXVxcblxcbl9EQVlTX0JFRk9SRV9NT05USCA9IFstMV1cXG5kYm0gPSAwXFxuZm9yIGRpbSBpbiBfREFZU19JTl9NT05USFsxOl06XFxuICAgIF9EQVlTX0JFRk9SRV9NT05USC5hcHBlbmQoZGJtKVxcbiAgICBkYm0gKz0gZGltXFxuZGVsIGRibSwgZGltXFxuXFxuZGVmIF9pc19sZWFwKHllYXIpOlxcbiAgICBcXFwieWVhciAtPiAxIGlmIGxlYXAgeWVhciwgZWxzZSAwLlxcXCJcXG4gICAgcmV0dXJuIHllYXIgJSA0ID09IDAgYW5kICh5ZWFyICUgMTAwICE9IDAgb3IgeWVhciAlIDQwMCA9PSAwKVxcblxcbmRlZiBfZGF5c19iZWZvcmVfeWVhcih5ZWFyKTpcXG4gICAgXFxcInllYXIgLT4gbnVtYmVyIG9mIGRheXMgYmVmb3JlIEphbnVhcnkgMXN0IG9mIHllYXIuXFxcIlxcbiAgICB5ID0geWVhciAtIDFcXG4gICAgcmV0dXJuIHkqMzY1ICsgeS8vNCAtIHkvLzEwMCArIHkvLzQwMFxcblxcbmRlZiBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aCk6XFxuICAgIFxcXCJ5ZWFyLCBtb250aCAtPiBudW1iZXIgb2YgZGF5cyBpbiB0aGF0IG1vbnRoIGluIHRoYXQgeWVhci5cXFwiXFxuICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyLCBtb250aFxcbiAgICBpZiBtb250aCA9PSAyIGFuZCBfaXNfbGVhcCh5ZWFyKTpcXG4gICAgICAgIHJldHVybiAyOVxcbiAgICByZXR1cm4gX0RBWVNfSU5fTU9OVEhbbW9udGhdXFxuXFxuZGVmIF9kYXlzX2JlZm9yZV9tb250aCh5ZWFyLCBtb250aCk6XFxuICAgIFxcXCJ5ZWFyLCBtb250aCAtPiBudW1iZXIgb2YgZGF5cyBpbiB5ZWFyIHByZWNlZGluZyBmaXJzdCBkYXkgb2YgbW9udGguXFxcIlxcbiAgICBhc3NlcnQgMSA8PSBtb250aCA8PSAxMiwgJ21vbnRoIG11c3QgYmUgaW4gMS4uMTInXFxuICAgIHJldHVybiBfREFZU19CRUZPUkVfTU9OVEhbbW9udGhdICsgKG1vbnRoID4gMiBhbmQgX2lzX2xlYXAoeWVhcikpXFxuXFxuZGVmIF95bWQyb3JkKHllYXIsIG1vbnRoLCBkYXkpOlxcbiAgICBcXFwieWVhciwgbW9udGgsIGRheSAtPiBvcmRpbmFsLCBjb25zaWRlcmluZyAwMS1KYW4tMDAwMSBhcyBkYXkgMS5cXFwiXFxuICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyLCAnbW9udGggbXVzdCBiZSBpbiAxLi4xMidcXG4gICAgZGltID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgIGFzc2VydCAxIDw9IGRheSA8PSBkaW0sICgnZGF5IG11c3QgYmUgaW4gMS4uJWQnICUgZGltKVxcbiAgICByZXR1cm4gKF9kYXlzX2JlZm9yZV95ZWFyKHllYXIpICtcXG4gICAgICAgICAgICBfZGF5c19iZWZvcmVfbW9udGgoeWVhciwgbW9udGgpICtcXG4gICAgICAgICAgICBkYXkpXFxuXFxuX0RJNDAwWSA9IF9kYXlzX2JlZm9yZV95ZWFyKDQwMSkgICAgIyBudW1iZXIgb2YgZGF5cyBpbiA0MDAgeWVhcnNcXG5fREkxMDBZID0gX2RheXNfYmVmb3JlX3llYXIoMTAxKSAgICAjICAgIFxcXCIgICAgXFxcIiAgIFxcXCIgICBcXFwiIDEwMCAgIFxcXCJcXG5fREk0WSAgID0gX2RheXNfYmVmb3JlX3llYXIoNSkgICAgICAjICAgIFxcXCIgICAgXFxcIiAgIFxcXCIgICBcXFwiICAgNCAgIFxcXCJcXG5cXG4jIEEgNC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZCBnZXQgZnJvbSBwYXN0aW5nXFxuIyB0b2dldGhlciA0IHNpbmdsZSB5ZWFycy5cXG5hc3NlcnQgX0RJNFkgPT0gNCAqIDM2NSArIDFcXG5cXG4jIFNpbWlsYXJseSwgYSA0MDAteWVhciBjeWNsZSBoYXMgYW4gZXh0cmEgbGVhcCBkYXkgb3ZlciB3aGF0IHdlJ2QgZ2V0IGZyb21cXG4jIHBhc3RpbmcgdG9nZXRoZXIgNCAxMDAteWVhciBjeWNsZXMuXFxuYXNzZXJ0IF9ESTQwMFkgPT0gNCAqIF9ESTEwMFkgKyAxXFxuXFxuIyBPVE9ILCBhIDEwMC15ZWFyIGN5Y2xlIGhhcyBvbmUgZmV3ZXIgbGVhcCBkYXkgdGhhbiB3ZSdkIGdldCBmcm9tXFxuIyBwYXN0aW5nIHRvZ2V0aGVyIDI1IDQteWVhciBjeWNsZXMuXFxuYXNzZXJ0IF9ESTEwMFkgPT0gMjUgKiBfREk0WSAtIDFcXG5cXG5fVVNfUEVSX1VTID0gMVxcbl9VU19QRVJfTVMgPSAxMDAwXFxuX1VTX1BFUl9TRUNPTkQgPSAxMDAwMDAwXFxuX1VTX1BFUl9NSU5VVEUgPSA2MDAwMDAwMFxcbl9TRUNPTkRTX1BFUl9EQVkgPSAyNCAqIDM2MDBcXG5fVVNfUEVSX0hPVVIgPSAzNjAwMDAwMDAwXFxuX1VTX1BFUl9EQVkgPSA4NjQwMDAwMDAwMFxcbl9VU19QRVJfV0VFSyA9IDYwNDgwMDAwMDAwMFxcblxcbmRlZiBfb3JkMnltZChuKTpcXG4gICAgXFxcIm9yZGluYWwgLT4gKHllYXIsIG1vbnRoLCBkYXkpLCBjb25zaWRlcmluZyAwMS1KYW4tMDAwMSBhcyBkYXkgMS5cXFwiXFxuXFxuICAgICMgbiBpcyBhIDEtYmFzZWQgaW5kZXgsIHN0YXJ0aW5nIGF0IDEtSmFuLTEuICBUaGUgcGF0dGVybiBvZiBsZWFwIHllYXJzXFxuICAgICMgcmVwZWF0cyBleGFjdGx5IGV2ZXJ5IDQwMCB5ZWFycy4gIFRoZSBiYXNpYyBzdHJhdGVneSBpcyB0byBmaW5kIHRoZVxcbiAgICAjIGNsb3Nlc3QgNDAwLXllYXIgYm91bmRhcnkgYXQgb3IgYmVmb3JlIG4sIHRoZW4gd29yayB3aXRoIHRoZSBvZmZzZXRcXG4gICAgIyBmcm9tIHRoYXQgYm91bmRhcnkgdG8gbi4gIExpZmUgaXMgbXVjaCBjbGVhcmVyIGlmIHdlIHN1YnRyYWN0IDEgZnJvbVxcbiAgICAjIG4gZmlyc3QgLS0gdGhlbiB0aGUgdmFsdWVzIG9mIG4gYXQgNDAwLXllYXIgYm91bmRhcmllcyBhcmUgZXhhY3RseVxcbiAgICAjIHRob3NlIGRpdmlzaWJsZSBieSBfREk0MDBZOlxcbiAgICAjXFxuICAgICMgICAgIEQgIE0gICBZICAgICAgICAgICAgbiAgICAgICAgICAgICAgbi0xXFxuICAgICMgICAgIC0tIC0tLSAtLS0tICAgICAgICAtLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tXFxuICAgICMgICAgIDMxIERlYyAtNDAwICAgICAgICAtX0RJNDAwWSAgICAgICAtX0RJNDAwWSAtMVxcbiAgICAjICAgICAgMSBKYW4gLTM5OSAgICAgICAgIC1fREk0MDBZICsxICAgLV9ESTQwMFkgICAgICA0MDAteWVhciBib3VuZGFyeVxcbiAgICAjICAgICAuLi5cXG4gICAgIyAgICAgMzAgRGVjICAwMDAgICAgICAgIC0xICAgICAgICAgICAgIC0yXFxuICAgICMgICAgIDMxIERlYyAgMDAwICAgICAgICAgMCAgICAgICAgICAgICAtMVxcbiAgICAjICAgICAgMSBKYW4gIDAwMSAgICAgICAgIDEgICAgICAgICAgICAgIDAgICAgICAgICAgICA0MDAteWVhciBib3VuZGFyeVxcbiAgICAjICAgICAgMiBKYW4gIDAwMSAgICAgICAgIDIgICAgICAgICAgICAgIDFcXG4gICAgIyAgICAgIDMgSmFuICAwMDEgICAgICAgICAzICAgICAgICAgICAgICAyXFxuICAgICMgICAgIC4uLlxcbiAgICAjICAgICAzMSBEZWMgIDQwMCAgICAgICAgIF9ESTQwMFkgICAgICAgIF9ESTQwMFkgLTFcXG4gICAgIyAgICAgIDEgSmFuICA0MDEgICAgICAgICBfREk0MDBZICsxICAgICBfREk0MDBZICAgICAgNDAwLXllYXIgYm91bmRhcnlcXG4gICAgbiAtPSAxXFxuICAgIG40MDAsIG4gPSBkaXZtb2QobiwgX0RJNDAwWSlcXG4gICAgeWVhciA9IG40MDAgKiA0MDAgKyAxICAgIyAuLi4sIC0zOTksIDEsIDQwMSwgLi4uXFxuXFxuICAgICMgTm93IG4gaXMgdGhlIChub24tbmVnYXRpdmUpIG9mZnNldCwgaW4gZGF5cywgZnJvbSBKYW51YXJ5IDEgb2YgeWVhciwgdG9cXG4gICAgIyB0aGUgZGVzaXJlZCBkYXRlLiAgTm93IGNvbXB1dGUgaG93IG1hbnkgMTAwLXllYXIgY3ljbGVzIHByZWNlZGUgbi5cXG4gICAgIyBOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgbjEwMCB0byBlcXVhbCA0ISAgSW4gdGhhdCBjYXNlIDQgZnVsbFxcbiAgICAjIDEwMC15ZWFyIGN5Y2xlcyBwcmVjZWRlIHRoZSBkZXNpcmVkIGRheSwgd2hpY2ggaW1wbGllcyB0aGUgZGVzaXJlZFxcbiAgICAjIGRheSBpcyBEZWNlbWJlciAzMSBhdCB0aGUgZW5kIG9mIGEgNDAwLXllYXIgY3ljbGUuXFxuICAgIG4xMDAsIG4gPSBkaXZtb2QobiwgX0RJMTAwWSlcXG5cXG4gICAgIyBOb3cgY29tcHV0ZSBob3cgbWFueSA0LXllYXIgY3ljbGVzIHByZWNlZGUgaXQuXFxuICAgIG40LCBuID0gZGl2bW9kKG4sIF9ESTRZKVxcblxcbiAgICAjIEFuZCBub3cgaG93IG1hbnkgc2luZ2xlIHllYXJzLiAgQWdhaW4gbjEgY2FuIGJlIDQsIGFuZCBhZ2FpbiBtZWFuaW5nXFxuICAgICMgdGhhdCB0aGUgZGVzaXJlZCBkYXkgaXMgRGVjZW1iZXIgMzEgYXQgdGhlIGVuZCBvZiB0aGUgNC15ZWFyIGN5Y2xlLlxcbiAgICBuMSwgbiA9IGRpdm1vZChuLCAzNjUpXFxuXFxuICAgIHllYXIgKz0gbjEwMCAqIDEwMCArIG40ICogNCArIG4xXFxuICAgIGlmIG4xID09IDQgb3IgbjEwMCA9PSA0OlxcbiAgICAgICAgYXNzZXJ0IG4gPT0gMFxcbiAgICAgICAgcmV0dXJuIHllYXItMSwgMTIsIDMxXFxuXFxuICAgICMgTm93IHRoZSB5ZWFyIGlzIGNvcnJlY3QsIGFuZCBuIGlzIHRoZSBvZmZzZXQgZnJvbSBKYW51YXJ5IDEuICBXZSBmaW5kXFxuICAgICMgdGhlIG1vbnRoIHZpYSBhbiBlc3RpbWF0ZSB0aGF0J3MgZWl0aGVyIGV4YWN0IG9yIG9uZSB0b28gbGFyZ2UuXFxuICAgIGxlYXB5ZWFyID0gbjEgPT0gMyBhbmQgKG40ICE9IDI0IG9yIG4xMDAgPT0gMylcXG4gICAgYXNzZXJ0IGxlYXB5ZWFyID09IF9pc19sZWFwKHllYXIpXFxuICAgIG1vbnRoID0gKG4gKyA1MCkgPj4gNVxcbiAgICBwcmVjZWRpbmcgPSBfREFZU19CRUZPUkVfTU9OVEhbbW9udGhdICsgKG1vbnRoID4gMiBhbmQgbGVhcHllYXIpXFxuICAgIGlmIHByZWNlZGluZyA+IG46ICAjIGVzdGltYXRlIGlzIHRvbyBsYXJnZVxcbiAgICAgICAgbW9udGggLT0gMVxcbiAgICAgICAgcHJlY2VkaW5nIC09IF9EQVlTX0lOX01PTlRIW21vbnRoXSArIChtb250aCA9PSAyIGFuZCBsZWFweWVhcilcXG4gICAgbiAtPSBwcmVjZWRpbmdcXG4gICAgYXNzZXJ0IDAgPD0gbiA8IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcblxcbiAgICAjIE5vdyB0aGUgeWVhciBhbmQgbW9udGggYXJlIGNvcnJlY3QsIGFuZCBuIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGVcXG4gICAgIyBzdGFydCBvZiB0aGF0IG1vbnRoOiAgd2UncmUgZG9uZSFcXG4gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBuKzFcXG5cXG4jIE1vbnRoIGFuZCBkYXkgbmFtZXMuICBGb3IgbG9jYWxpemVkIHZlcnNpb25zLCBzZWUgdGhlIGNhbGVuZGFyIG1vZHVsZS5cXG5fTU9OVEhOQU1FUyA9IFtOb25lLCBcXFwiSmFuXFxcIiwgXFxcIkZlYlxcXCIsIFxcXCJNYXJcXFwiLCBcXFwiQXByXFxcIiwgXFxcIk1heVxcXCIsIFxcXCJKdW5cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgIFxcXCJKdWxcXFwiLCBcXFwiQXVnXFxcIiwgXFxcIlNlcFxcXCIsIFxcXCJPY3RcXFwiLCBcXFwiTm92XFxcIiwgXFxcIkRlY1xcXCJdXFxuX0RBWU5BTUVTID0gW05vbmUsIFxcXCJNb25cXFwiLCBcXFwiVHVlXFxcIiwgXFxcIldlZFxcXCIsIFxcXCJUaHVcXFwiLCBcXFwiRnJpXFxcIiwgXFxcIlNhdFxcXCIsIFxcXCJTdW5cXFwiXVxcblxcblxcbmRlZiBfYnVpbGRfc3RydWN0X3RpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgZHN0ZmxhZyk6XFxuICAgIHdkYXkgPSAoX3ltZDJvcmQoeSwgbSwgZCkgKyA2KSAlIDdcXG4gICAgZG51bSA9IF9kYXlzX2JlZm9yZV9tb250aCh5LCBtKSArIGRcXG4gICAgcmV0dXJuIF90aW1lLnN0cnVjdF90aW1lKCh5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZGF5LCBkbnVtLCBkc3RmbGFnKSlcXG5cXG5kZWYgX2Zvcm1hdF90aW1lKGhoLCBtbSwgc3MsIHVzKTpcXG4gICAgIyBTa2lwIHRyYWlsaW5nIG1pY3Jvc2Vjb25kcyB3aGVuIHVzPT0wLlxcbiAgICByZXN1bHQgPSBcXFwiJTAyZDolMDJkOiUwMmRcXFwiICUgKGhoLCBtbSwgc3MpXFxuICAgIGlmIHVzOlxcbiAgICAgICAgcmVzdWx0ICs9IFxcXCIuJTA2ZFxcXCIgJSB1c1xcbiAgICByZXR1cm4gcmVzdWx0XFxuXFxuIyBDb3JyZWN0bHkgc3Vic3RpdHV0ZSBmb3IgJXogYW5kICVaIGVzY2FwZXMgaW4gc3RyZnRpbWUgZm9ybWF0cy5cXG5kZWYgX3dyYXBfc3RyZnRpbWUob2JqZWN0LCBmb3JtYXQsIHRpbWV0dXBsZSk6XFxuICAgIHllYXIgPSB0aW1ldHVwbGVbMF1cXG4gICAgaWYgeWVhciA8IF9NSU5ZRUFSRk1UOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwieWVhcj0lZCBpcyBiZWZvcmUgJWQ7IHRoZSBkYXRldGltZSBzdHJmdGltZSgpIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm1ldGhvZHMgcmVxdWlyZSB5ZWFyID49ICVkXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICh5ZWFyLCBfTUlOWUVBUkZNVCwgX01JTllFQVJGTVQpKVxcbiAgICAjIERvbid0IGNhbGwgdXRjb2Zmc2V0KCkgb3IgdHpuYW1lKCkgdW5sZXNzIGFjdHVhbGx5IG5lZWRlZC5cXG4gICAgZnJlcGxhY2UgPSBOb25lICAjIHRoZSBzdHJpbmcgdG8gdXNlIGZvciAlZlxcbiAgICB6cmVwbGFjZSA9IE5vbmUgICMgdGhlIHN0cmluZyB0byB1c2UgZm9yICV6XFxuICAgIFpyZXBsYWNlID0gTm9uZSAgIyB0aGUgc3RyaW5nIHRvIHVzZSBmb3IgJVpcXG5cXG4gICAgIyBTY2FuIGZvcm1hdCBmb3IgJXogYW5kICVaIGVzY2FwZXMsIHJlcGxhY2luZyBhcyBuZWVkZWQuXFxuICAgIG5ld2Zvcm1hdCA9IFtdXFxuICAgIHB1c2ggPSBuZXdmb3JtYXQuYXBwZW5kXFxuICAgIGksIG4gPSAwLCBsZW4oZm9ybWF0KVxcbiAgICB3aGlsZSBpIDwgbjpcXG4gICAgICAgIGNoID0gZm9ybWF0W2ldXFxuICAgICAgICBpICs9IDFcXG4gICAgICAgIGlmIGNoID09ICclJzpcXG4gICAgICAgICAgICBpZiBpIDwgbjpcXG4gICAgICAgICAgICAgICAgY2ggPSBmb3JtYXRbaV1cXG4gICAgICAgICAgICAgICAgaSArPSAxXFxuICAgICAgICAgICAgICAgIGlmIGNoID09ICdmJzpcXG4gICAgICAgICAgICAgICAgICAgIGlmIGZyZXBsYWNlIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgZnJlcGxhY2UgPSAnJTA2ZCcgJSBnZXRhdHRyKG9iamVjdCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pY3Jvc2Vjb25kJywgMClcXG4gICAgICAgICAgICAgICAgICAgIG5ld2Zvcm1hdC5hcHBlbmQoZnJlcGxhY2UpXFxuICAgICAgICAgICAgICAgIGVsaWYgY2ggPT0gJ3onOlxcbiAgICAgICAgICAgICAgICAgICAgaWYgenJlcGxhY2UgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICB6cmVwbGFjZSA9IFxcXCJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsIFxcXCJfdXRjb2Zmc2V0XFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9iamVjdC5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICcrJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2Zmc2V0IDwgMDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICctJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwgbSA9IGRpdm1vZChvZmZzZXQsIDYwKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenJlcGxhY2UgPSAnJWMlMDJkJTAyZCcgJSAoc2lnbiwgaCwgbSlcXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAnJScgbm90IGluIHpyZXBsYWNlXFxuICAgICAgICAgICAgICAgICAgICBuZXdmb3JtYXQuYXBwZW5kKHpyZXBsYWNlKVxcbiAgICAgICAgICAgICAgICBlbGlmIGNoID09ICdaJzpcXG4gICAgICAgICAgICAgICAgICAgIGlmIFpyZXBsYWNlIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgWnJlcGxhY2UgPSBcXFwiXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCBcXFwidHpuYW1lXFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBvYmplY3QudHpuYW1lKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcyBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RyZnRpbWUgaXMgZ29pbmcgdG8gaGF2ZSBhdCB0aGlzOiBlc2NhcGUgJVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWnJlcGxhY2UgPSBzLnJlcGxhY2UoJyUnLCAnJSUnKVxcbiAgICAgICAgICAgICAgICAgICAgbmV3Zm9ybWF0LmFwcGVuZChacmVwbGFjZSlcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHB1c2goJyUnKVxcbiAgICAgICAgICAgICAgICAgICAgcHVzaChjaClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBwdXNoKCclJylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcHVzaChjaClcXG4gICAgbmV3Zm9ybWF0ID0gXFxcIlxcXCIuam9pbihuZXdmb3JtYXQpXFxuICAgIHJldHVybiBfdGltZS5zdHJmdGltZShuZXdmb3JtYXQsIHRpbWV0dXBsZSlcXG5cXG4jIEp1c3QgcmFpc2UgVHlwZUVycm9yIGlmIHRoZSBhcmcgaXNuJ3QgTm9uZSBvciBhIHN0cmluZy5cXG5kZWYgX2NoZWNrX3R6bmFtZShuYW1lKTpcXG4gICAgaWYgbmFtZSBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UobmFtZSwgc3RyKTpcXG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwidHppbmZvLnR6bmFtZSgpIG11c3QgcmV0dXJuIE5vbmUgb3Igc3RyaW5nLCBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm5vdCAnJXMnXFxcIiAlIHR5cGUobmFtZSkpXFxuXFxuIyBuYW1lIGlzIHRoZSBvZmZzZXQtcHJvZHVjaW5nIG1ldGhvZCwgXFxcInV0Y29mZnNldFxcXCIgb3IgXFxcImRzdFxcXCIuXFxuIyBvZmZzZXQgaXMgd2hhdCBpdCByZXR1cm5lZC5cXG4jIElmIG9mZnNldCBpc24ndCBOb25lIG9yIHRpbWVkZWx0YSwgcmFpc2VzIFR5cGVFcnJvci5cXG4jIElmIG9mZnNldCBpcyBOb25lLCByZXR1cm5zIE5vbmUuXFxuIyBFbHNlIG9mZnNldCBpcyBjaGVja2VkIGZvciBiZWluZyBpbiByYW5nZSwgYW5kIGEgd2hvbGUgIyBvZiBtaW51dGVzLlxcbiMgSWYgaXQgaXMsIGl0cyBpbnRlZ2VyIHZhbHVlIGlzIHJldHVybmVkLiAgRWxzZSBWYWx1ZUVycm9yIGlzIHJhaXNlZC5cXG5kZWYgX2NoZWNrX3V0Y19vZmZzZXQobmFtZSwgb2Zmc2V0KTpcXG4gICAgYXNzZXJ0IG5hbWUgaW4gKFxcXCJ1dGNvZmZzZXRcXFwiLCBcXFwiZHN0XFxcIilcXG4gICAgaWYgb2Zmc2V0IGlzIE5vbmU6XFxuICAgICAgICByZXR1cm5cXG4gICAgaWYgbm90IGlzaW5zdGFuY2Uob2Zmc2V0LCB0aW1lZGVsdGEpOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBOb25lIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwib3IgdGltZWRlbHRhLCBub3QgJyVzJ1xcXCIgJSAobmFtZSwgdHlwZShvZmZzZXQpKSlcXG4gICAgZGF5cyA9IG9mZnNldC5kYXlzXFxuICAgIGlmIGRheXMgPCAtMSBvciBkYXlzID4gMDpcXG4gICAgICAgIG9mZnNldCA9IDE0NDAgICMgdHJpZ2dlciBvdXQtb2YtcmFuZ2VcXG4gICAgZWxzZTpcXG4gICAgICAgIHNlY29uZHMgPSBkYXlzICogODY0MDAgKyBvZmZzZXQuc2Vjb25kc1xcbiAgICAgICAgbWludXRlcywgc2Vjb25kcyA9IGRpdm1vZChzZWNvbmRzLCA2MClcXG4gICAgICAgIGlmIHNlY29uZHMgb3Igb2Zmc2V0Lm1pY3Jvc2Vjb25kczpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBhIHdob2xlIG51bWJlciBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwib2YgbWludXRlc1xcXCIgJSBuYW1lKVxcbiAgICAgICAgb2Zmc2V0ID0gbWludXRlc1xcbiAgICBpZiBub3QgLTE0NDAgPCBvZmZzZXQgPCAxNDQwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiJXMoKT0lZCwgbXVzdCBiZSBpbiAtMTQzOS4uMTQzOVxcXCIgJSAobmFtZSwgb2Zmc2V0KSlcXG4gICAgcmV0dXJuIG9mZnNldFxcblxcbmRlZiBfY2hlY2tfaW50X2ZpZWxkKHZhbHVlKTpcXG4gICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgaW50KTpcXG4gICAgICAgIHJldHVybiBpbnQodmFsdWUpXFxuICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBmbG9hdCk6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5fX2ludF9fKClcXG4gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjpcXG4gICAgICAgICAgICBwYXNzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGludCk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpbnQodmFsdWUpXFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdfX2ludF9fIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGludGVnZXInKVxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkJylcXG4gICAgcmFpc2UgVHlwZUVycm9yKCdpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQnKVxcblxcbmRlZiBfY2hlY2tfZGF0ZV9maWVsZHMoeWVhciwgbW9udGgsIGRheSk6XFxuICAgIHllYXIgPSBfY2hlY2tfaW50X2ZpZWxkKHllYXIpXFxuICAgIG1vbnRoID0gX2NoZWNrX2ludF9maWVsZChtb250aClcXG4gICAgZGF5ID0gX2NoZWNrX2ludF9maWVsZChkYXkpXFxuICAgIGlmIG5vdCBNSU5ZRUFSIDw9IHllYXIgPD0gTUFYWUVBUjpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3llYXIgbXVzdCBiZSBpbiAlZC4uJWQnICUgKE1JTllFQVIsIE1BWFlFQVIpLCB5ZWFyKVxcbiAgICBpZiBub3QgMSA8PSBtb250aCA8PSAxMjpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21vbnRoIG11c3QgYmUgaW4gMS4uMTInLCBtb250aClcXG4gICAgZGltID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgIGlmIG5vdCAxIDw9IGRheSA8PSBkaW06XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdkYXkgbXVzdCBiZSBpbiAxLi4lZCcgJSBkaW0sIGRheSlcXG4gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBkYXlcXG5cXG5kZWYgX2NoZWNrX3RpbWVfZmllbGRzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCk6XFxuICAgIGhvdXIgPSBfY2hlY2tfaW50X2ZpZWxkKGhvdXIpXFxuICAgIG1pbnV0ZSA9IF9jaGVja19pbnRfZmllbGQobWludXRlKVxcbiAgICBzZWNvbmQgPSBfY2hlY2tfaW50X2ZpZWxkKHNlY29uZClcXG4gICAgbWljcm9zZWNvbmQgPSBfY2hlY2tfaW50X2ZpZWxkKG1pY3Jvc2Vjb25kKVxcbiAgICBpZiBub3QgMCA8PSBob3VyIDw9IDIzOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaG91ciBtdXN0IGJlIGluIDAuLjIzJywgaG91cilcXG4gICAgaWYgbm90IDAgPD0gbWludXRlIDw9IDU5OlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbWludXRlIG11c3QgYmUgaW4gMC4uNTknLCBtaW51dGUpXFxuICAgIGlmIG5vdCAwIDw9IHNlY29uZCA8PSA1OTpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3NlY29uZCBtdXN0IGJlIGluIDAuLjU5Jywgc2Vjb25kKVxcbiAgICBpZiBub3QgMCA8PSBtaWNyb3NlY29uZCA8PSA5OTk5OTk6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdtaWNyb3NlY29uZCBtdXN0IGJlIGluIDAuLjk5OTk5OScsIG1pY3Jvc2Vjb25kKVxcbiAgICByZXR1cm4gaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kXFxuXFxuZGVmIF9jaGVja190emluZm9fYXJnKHR6KTpcXG4gICAgaWYgdHogaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKHR6LCB0emluZm8pOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0emluZm8gYXJndW1lbnQgbXVzdCBiZSBOb25lIG9yIG9mIGEgdHppbmZvIHN1YmNsYXNzXFxcIilcXG5cXG5cXG4jIE5vdGVzIG9uIGNvbXBhcmlzb246ICBJbiBnZW5lcmFsLCBkYXRldGltZSBtb2R1bGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgcmFpc2VcXG4jIFR5cGVFcnJvciB3aGVuIHRoZXkgZG9uJ3Qga25vdyBob3cgdG8gZG8gYSBjb21wYXJpc29uIHRoZW1zZWxmLiAgSWYgdGhleVxcbiMgcmV0dXJuZWQgTm90SW1wbGVtZW50ZWQgaW5zdGVhZCwgY29tcGFyaXNvbiBjb3VsZCAoc2lsZW50bHkpIGZhbGwgYmFjayB0b1xcbiMgdGhlIGRlZmF1bHQgY29tcGFyZS1vYmplY3RzLWJ5LWNvbXBhcmluZy10aGVpci1tZW1vcnktYWRkcmVzc2VzIHN0cmF0ZWd5LFxcbiMgYW5kIHRoYXQncyBub3QgaGVscGZ1bC4gIFRoZXJlIGFyZSB0d28gZXhjZXB0aW9uczpcXG4jXFxuIyAxLiBGb3IgZGF0ZSBhbmQgZGF0ZXRpbWUsIGlmIHRoZSBvdGhlciBvYmplY3QgaGFzIGEgXFxcInRpbWV0dXBsZVxcXCIgYXR0cixcXG4jICAgIE5vdEltcGxlbWVudGVkIGlzIHJldHVybmVkLiAgVGhpcyBpcyBhIGhvb2sgdG8gYWxsb3cgb3RoZXIga2luZHMgb2ZcXG4jICAgIGRhdGV0aW1lLWxpa2Ugb2JqZWN0cyBhIGNoYW5jZSB0byBpbnRlcmNlcHQgdGhlIGNvbXBhcmlzb24uXFxuI1xcbiMgMi4gRWxzZSBfX2VxX18gYW5kIF9fbmVfXyByZXR1cm4gRmFsc2UgYW5kIFRydWUsIHJlc3BlY3RpdmVseS4gIFRoaXMgaXNcXG4jICAgIHNvIG9wZXJ0YWlvbnMgbGlrZVxcbiNcXG4jICAgICAgICB4ID09IHlcXG4jICAgICAgICB4ICE9IHlcXG4jICAgICAgICB4IGluIHNlcXVlbmNlXFxuIyAgICAgICAgeCBub3QgaW4gc2VxdWVuY2VcXG4jICAgICAgICBkaWN0W3hdID0geVxcbiNcXG4jICAgIGRvbid0IHJhaXNlIGFubm95aW5nIFR5cGVFcnJvcnMganVzdCBiZWNhdXNlIGEgZGF0ZXRpbWUgb2JqZWN0XFxuIyAgICBpcyBwYXJ0IG9mIGEgaGV0ZXJvZ2VuZW91cyBjb2xsZWN0aW9uLiAgSWYgdGhlcmUncyBubyBrbm93biB3YXkgdG9cXG4jICAgIGNvbXBhcmUgWCB0byBhIGRhdGV0aW1lLCBzYXlpbmcgdGhleSdyZSBub3QgZXF1YWwgaXMgcmVhc29uYWJsZS5cXG5cXG5kZWYgX2NtcGVycm9yKHgsIHkpOlxcbiAgICByYWlzZSBUeXBlRXJyb3IoXFxcImNhbid0IGNvbXBhcmUgJyVzJyB0byAnJXMnXFxcIiAlIChcXG4gICAgICAgICAgICAgICAgICAgIHR5cGUoeCkuX19uYW1lX18sIHR5cGUoeSkuX19uYW1lX18pKVxcblxcbmRlZiBfbm9ybWFsaXplX3BhaXIoaGksIGxvLCBmYWN0b3IpOlxcbiAgICBpZiBub3QgMCA8PSBsbyA8PSBmYWN0b3ItMTpcXG4gICAgICAgIGluYywgbG8gPSBkaXZtb2QobG8sIGZhY3RvcilcXG4gICAgICAgIGhpICs9IGluY1xcbiAgICByZXR1cm4gaGksIGxvXFxuXFxuZGVmIF9ub3JtYWxpemVfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIGlnbm9yZV9vdmVyZmxvdz1GYWxzZSk6XFxuICAgICMgTm9ybWFsaXplIGFsbCB0aGUgaW5wdXRzLCBhbmQgc3RvcmUgdGhlIG5vcm1hbGl6ZWQgdmFsdWVzLlxcbiAgICBzcywgdXMgPSBfbm9ybWFsaXplX3BhaXIoc3MsIHVzLCAxMDAwMDAwKVxcbiAgICBtbSwgc3MgPSBfbm9ybWFsaXplX3BhaXIobW0sIHNzLCA2MClcXG4gICAgaGgsIG1tID0gX25vcm1hbGl6ZV9wYWlyKGhoLCBtbSwgNjApXFxuICAgIGQsIGhoID0gX25vcm1hbGl6ZV9wYWlyKGQsIGhoLCAyNClcXG4gICAgeSwgbSwgZCA9IF9ub3JtYWxpemVfZGF0ZSh5LCBtLCBkLCBpZ25vcmVfb3ZlcmZsb3cpXFxuICAgIHJldHVybiB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1c1xcblxcbmRlZiBfbm9ybWFsaXplX2RhdGUoeWVhciwgbW9udGgsIGRheSwgaWdub3JlX292ZXJmbG93PUZhbHNlKTpcXG4gICAgIyBUaGF0IHdhcyBlYXN5LiAgTm93IGl0IGdldHMgbXVkZHk6ICB0aGUgcHJvcGVyIHJhbmdlIGZvciBkYXlcXG4gICAgIyBjYW4ndCBiZSBkZXRlcm1pbmVkIHdpdGhvdXQga25vd2luZyB0aGUgY29ycmVjdCBtb250aCBhbmQgeWVhcixcXG4gICAgIyBidXQgaWYgZGF5IGlzLCBlLmcuLCBwbHVzIG9yIG1pbnVzIGEgbWlsbGlvbiwgdGhlIGN1cnJlbnQgbW9udGhcXG4gICAgIyBhbmQgeWVhciB2YWx1ZXMgbWFrZSBubyBzZW5zZSAoYW5kIG1heSBhbHNvIGJlIG91dCBvZiBib3VuZHNcXG4gICAgIyB0aGVtc2VsdmVzKS5cXG4gICAgIyBTYXlpbmcgMTIgbW9udGhzID09IDEgeWVhciBzaG91bGQgYmUgbm9uLWNvbnRyb3ZlcnNpYWwuXFxuICAgIGlmIG5vdCAxIDw9IG1vbnRoIDw9IDEyOlxcbiAgICAgICAgeWVhciwgbW9udGggPSBfbm9ybWFsaXplX3BhaXIoeWVhciwgbW9udGgtMSwgMTIpXFxuICAgICAgICBtb250aCArPSAxXFxuICAgICAgICBhc3NlcnQgMSA8PSBtb250aCA8PSAxMlxcblxcbiAgICAjIE5vdyBvbmx5IGRheSBjYW4gYmUgb3V0IG9mIGJvdW5kcyAoeWVhciBtYXkgYWxzbyBiZSBvdXQgb2YgYm91bmRzXFxuICAgICMgZm9yIGEgZGF0ZXRpbWUgb2JqZWN0LCBidXQgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGF0IGhlcmUpLlxcbiAgICAjIElmIGRheSBpcyBvdXQgb2YgYm91bmRzLCB3aGF0IHRvIGRvIGlzIGFyZ3VhYmxlLCBidXQgYXQgbGVhc3QgdGhlXFxuICAgICMgbWV0aG9kIGhlcmUgaXMgcHJpbmNpcGxlZCBhbmQgZXhwbGFpbmFibGUuXFxuICAgIGRpbSA9IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcbiAgICBpZiBub3QgMSA8PSBkYXkgPD0gZGltOlxcbiAgICAgICAgIyBNb3ZlIGRheS0xIGRheXMgZnJvbSB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoLiAgRmlyc3QgdHJ5IHRvXFxuICAgICAgICAjIGdldCBvZmYgY2hlYXAgaWYgd2UncmUgb25seSBvbmUgZGF5IG91dCBvZiByYW5nZSAoYWRqdXN0bWVudHNcXG4gICAgICAgICMgZm9yIHRpbWV6b25lIGFsb25lIGNhbid0IGJlIHdvcnNlIHRoYW4gdGhhdCkuXFxuICAgICAgICBpZiBkYXkgPT0gMDogICAgIyBtb3ZlIGJhY2sgYSBkYXlcXG4gICAgICAgICAgICBtb250aCAtPSAxXFxuICAgICAgICAgICAgaWYgbW9udGggPiAwOlxcbiAgICAgICAgICAgICAgICBkYXkgPSBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0geWVhci0xLCAxMiwgMzFcXG4gICAgICAgIGVsaWYgZGF5ID09IGRpbSArIDE6ICAgICMgbW92ZSBmb3J3YXJkIGEgZGF5XFxuICAgICAgICAgICAgbW9udGggKz0gMVxcbiAgICAgICAgICAgIGRheSA9IDFcXG4gICAgICAgICAgICBpZiBtb250aCA+IDEyOlxcbiAgICAgICAgICAgICAgICBtb250aCA9IDFcXG4gICAgICAgICAgICAgICAgeWVhciArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG9yZGluYWwgPSBfeW1kMm9yZCh5ZWFyLCBtb250aCwgMSkgKyAoZGF5IC0gMSlcXG4gICAgICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gX29yZDJ5bWQob3JkaW5hbClcXG5cXG4gICAgaWYgbm90IGlnbm9yZV9vdmVyZmxvdyBhbmQgbm90IE1JTllFQVIgPD0geWVhciA8PSBNQVhZRUFSOlxcbiAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcihcXFwiZGF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2VcXFwiKVxcbiAgICByZXR1cm4geWVhciwgbW9udGgsIGRheVxcblxcbmRlZiBfYWNjdW0odGFnLCBzb2ZhciwgbnVtLCBmYWN0b3IsIGxlZnRvdmVyKTpcXG4gICAgaWYgaXNpbnN0YW5jZShudW0sIGludCk6XFxuICAgICAgICBwcm9kID0gbnVtICogZmFjdG9yXFxuICAgICAgICByc3VtID0gc29mYXIgKyBwcm9kXFxuICAgICAgICByZXR1cm4gcnN1bSwgbGVmdG92ZXJcXG4gICAgaWYgaXNpbnN0YW5jZShudW0sIGZsb2F0KTpcXG4gICAgICAgIGZyYWNwYXJ0LCBpbnRwYXJ0ID0gX21hdGgubW9kZihudW0pXFxuICAgICAgICBwcm9kID0gaW50KGludHBhcnQpICogZmFjdG9yXFxuICAgICAgICByc3VtID0gc29mYXIgKyBwcm9kXFxuICAgICAgICBpZiBmcmFjcGFydCA9PSAwLjA6XFxuICAgICAgICAgICAgcmV0dXJuIHJzdW0sIGxlZnRvdmVyXFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShmYWN0b3IsIGludClcXG4gICAgICAgIGZyYWNwYXJ0LCBpbnRwYXJ0ID0gX21hdGgubW9kZihmYWN0b3IgKiBmcmFjcGFydClcXG4gICAgICAgIHJzdW0gKz0gaW50KGludHBhcnQpXFxuICAgICAgICByZXR1cm4gcnN1bSwgbGVmdG92ZXIgKyBmcmFjcGFydFxcbiAgICByYWlzZSBUeXBlRXJyb3IoXFxcInVuc3VwcG9ydGVkIHR5cGUgZm9yIHRpbWVkZWx0YSAlcyBjb21wb25lbnQ6ICVzXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAodGFnLCB0eXBlKG51bSkpKVxcblxcbmNsYXNzIHRpbWVkZWx0YShvYmplY3QpOlxcbiAgICBcXFwiXFxcIlxcXCJSZXByZXNlbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgb2JqZWN0cy5cXG5cXG4gICAgU3VwcG9ydGVkIG9wZXJhdG9yczpcXG5cXG4gICAgLSBhZGQsIHN1YnRyYWN0IHRpbWVkZWx0YVxcbiAgICAtIHVuYXJ5IHBsdXMsIG1pbnVzLCBhYnNcXG4gICAgLSBjb21wYXJlIHRvIHRpbWVkZWx0YVxcbiAgICAtIG11bHRpcGx5LCBkaXZpZGUgYnkgaW50L2xvbmdcXG5cXG4gICAgSW4gYWRkaXRpb24sIGRhdGV0aW1lIHN1cHBvcnRzIHN1YnRyYWN0aW9uIG9mIHR3byBkYXRldGltZSBvYmplY3RzXFxuICAgIHJldHVybmluZyBhIHRpbWVkZWx0YSwgYW5kIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uIG9mIGEgZGF0ZXRpbWVcXG4gICAgYW5kIGEgdGltZWRlbHRhIGdpdmluZyBhIGRhdGV0aW1lLlxcblxcbiAgICBSZXByZXNlbnRhdGlvbjogKGRheXMsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcykuICBXaHk/ICBCZWNhdXNlIElcXG4gICAgZmVsdCBsaWtlIGl0LlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gJ19kYXlzJywgJ19zZWNvbmRzJywgJ19taWNyb3NlY29uZHMnLCAnX2hhc2hjb2RlJ1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIGRheXM9X1NFTlRJTkVMLCBzZWNvbmRzPV9TRU5USU5FTCwgbWljcm9zZWNvbmRzPV9TRU5USU5FTCxcXG4gICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzPV9TRU5USU5FTCwgbWludXRlcz1fU0VOVElORUwsIGhvdXJzPV9TRU5USU5FTCwgd2Vla3M9X1NFTlRJTkVMKTpcXG4gICAgICAgIHggPSAwXFxuICAgICAgICBsZWZ0b3ZlciA9IDAuMFxcbiAgICAgICAgaWYgbWljcm9zZWNvbmRzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcIm1pY3Jvc2Vjb25kc1xcXCIsIHgsIG1pY3Jvc2Vjb25kcywgX1VTX1BFUl9VUywgbGVmdG92ZXIpXFxuICAgICAgICBpZiBtaWxsaXNlY29uZHMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwibWlsbGlzZWNvbmRzXFxcIiwgeCwgbWlsbGlzZWNvbmRzLCBfVVNfUEVSX01TLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIHNlY29uZHMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwic2Vjb25kc1xcXCIsIHgsIHNlY29uZHMsIF9VU19QRVJfU0VDT05ELCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIG1pbnV0ZXMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwibWludXRlc1xcXCIsIHgsIG1pbnV0ZXMsIF9VU19QRVJfTUlOVVRFLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIGhvdXJzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcImhvdXJzXFxcIiwgeCwgaG91cnMsIF9VU19QRVJfSE9VUiwgbGVmdG92ZXIpXFxuICAgICAgICBpZiBkYXlzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcImRheXNcXFwiLCB4LCBkYXlzLCBfVVNfUEVSX0RBWSwgbGVmdG92ZXIpXFxuICAgICAgICBpZiB3ZWVrcyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJ3ZWVrc1xcXCIsIHgsIHdlZWtzLCBfVVNfUEVSX1dFRUssIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgbGVmdG92ZXIgIT0gMC4wOlxcbiAgICAgICAgICAgIHggKz0gX3JvdW5kKGxlZnRvdmVyKVxcbiAgICAgICAgcmV0dXJuIGNscy5fZnJvbV9taWNyb3NlY29uZHMoeClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBfZnJvbV9taWNyb3NlY29uZHMoY2xzLCB1cyk6XFxuICAgICAgICBzLCB1cyA9IGRpdm1vZCh1cywgX1VTX1BFUl9TRUNPTkQpXFxuICAgICAgICBkLCBzID0gZGl2bW9kKHMsIF9TRUNPTkRTX1BFUl9EQVkpXFxuICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGUoZCwgcywgdXMsIEZhbHNlKVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIF9jcmVhdGUoY2xzLCBkLCBzLCB1cywgbm9ybWFsaXplKTpcXG4gICAgICAgIGlmIG5vcm1hbGl6ZTpcXG4gICAgICAgICAgICBzLCB1cyA9IF9ub3JtYWxpemVfcGFpcihzLCB1cywgMTAwMDAwMClcXG4gICAgICAgICAgICBkLCBzID0gX25vcm1hbGl6ZV9wYWlyKGQsIHMsIDI0KjM2MDApXFxuXFxuICAgICAgICBpZiBub3QgLV9NQVhfREVMVEFfREFZUyA8PSBkIDw9IF9NQVhfREVMVEFfREFZUzpcXG4gICAgICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKFxcXCJkYXlzPSVkOyBtdXN0IGhhdmUgbWFnbml0dWRlIDw9ICVkXFxcIiAlIChkLCBfTUFYX0RFTFRBX0RBWVMpKVxcblxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX2RheXMgPSBkXFxuICAgICAgICBzZWxmLl9zZWNvbmRzID0gc1xcbiAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzID0gdXNcXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBfdG9fbWljcm9zZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuICgoc2VsZi5fZGF5cyAqIF9TRUNPTkRTX1BFUl9EQVkgKyBzZWxmLl9zZWNvbmRzKSAqIF9VU19QRVJfU0VDT05EICtcXG4gICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzKVxcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyB0aW1lZGVsdGEgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fbWljcm9zZWNvbmRzOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwiJXMoJWQsICVkLCAlZClcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMpXFxuICAgICAgICBpZiBzZWxmLl9zZWNvbmRzOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwiJXMoJWQsICVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcylcXG4gICAgICAgIHJldHVybiBcXFwiJXMoJWQpXFxcIiAlIChtb2R1bGUgKyBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fZGF5cylcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBtbSwgc3MgPSBkaXZtb2Qoc2VsZi5fc2Vjb25kcywgNjApXFxuICAgICAgICBoaCwgbW0gPSBkaXZtb2QobW0sIDYwKVxcbiAgICAgICAgcyA9IFxcXCIlZDolMDJkOiUwMmRcXFwiICUgKGhoLCBtbSwgc3MpXFxuICAgICAgICBpZiBzZWxmLl9kYXlzOlxcbiAgICAgICAgICAgIGRlZiBwbHVyYWwobik6XFxuICAgICAgICAgICAgICAgIHJldHVybiBuLCBhYnMobikgIT0gMSBhbmQgXFxcInNcXFwiIG9yIFxcXCJcXFwiXFxuICAgICAgICAgICAgcyA9IChcXFwiJWQgZGF5JXMsIFxcXCIgJSBwbHVyYWwoc2VsZi5fZGF5cykpICsgc1xcbiAgICAgICAgaWYgc2VsZi5fbWljcm9zZWNvbmRzOlxcbiAgICAgICAgICAgIHMgPSBzICsgXFxcIi4lMDZkXFxcIiAlIHNlbGYuX21pY3Jvc2Vjb25kc1xcbiAgICAgICAgcmV0dXJuIHNcXG5cXG4gICAgZGVmIHRvdGFsX3NlY29uZHMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUb3RhbCBzZWNvbmRzIGluIHRoZSBkdXJhdGlvbi5cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl90b19taWNyb3NlY29uZHMoKSAvIDEwLjAqKjZcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgZGF5cyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImRheXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kYXlzXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgc2Vjb25kcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcInNlY29uZHNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zZWNvbmRzXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWljcm9zZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWljcm9zZWNvbmRzXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWljcm9zZWNvbmRzXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAgICAgIyBvdXIgX19jbGFzc19fIGhlcmUsIGJ1dCBuZWVkIGEgcmVhbCB0aW1lZGVsdGFcXG4gICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoc2VsZi5fZGF5cyArIG90aGVyLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzICsgb3RoZXIuX3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcyArIG90aGVyLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpXFxuICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICAjIGZvciBDUHl0aG9uIGNvbXBhdGliaWxpdHksIHdlIGNhbm5vdCB1c2VcXG4gICAgICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZShzZWxmLl9kYXlzIC0gb3RoZXIuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgLSBvdGhlci5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzIC0gb3RoZXIuX21pY3Jvc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBkZWYgX19uZWdfXyhzZWxmKTpcXG4gICAgICAgICMgZm9yIENQeXRob24gY29tcGF0aWJpbGl0eSwgd2UgY2Fubm90IHVzZVxcbiAgICAgICAgIyBvdXIgX19jbGFzc19fIGhlcmUsIGJ1dCBuZWVkIGEgcmVhbCB0aW1lZGVsdGFcXG4gICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZSgtc2VsZi5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5fbWljcm9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpXFxuXFxuICAgIGRlZiBfX3Bvc19fKHNlbGYpOlxcbiAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fY3JlYXRlKHNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UpXFxuXFxuICAgIGRlZiBfX2Fic19fKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5fZGF5cyA8IDA6XFxuICAgICAgICAgICAgcmV0dXJuIC1zZWxmXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBfX211bF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBpbnQpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgdXNlYyA9IHNlbGYuX3RvX21pY3Jvc2Vjb25kcygpXFxuICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9mcm9tX21pY3Jvc2Vjb25kcyh1c2VjICogb3RoZXIpXFxuXFxuICAgIF9fcm11bF9fID0gX19tdWxfX1xcblxcbiAgICBkZWYgX19kaXZfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgaW50KTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIHVzZWMgPSBzZWxmLl90b19taWNyb3NlY29uZHMoKVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fZnJvbV9taWNyb3NlY29uZHModXNlYyAvLyBvdGhlcilcXG5cXG4gICAgX19mbG9vcmRpdl9fID0gX19kaXZfX1xcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIHRpbWVkZWx0YSBvYmplY3RzIHdpdGggb3RoZXIuXFxuXFxuICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA9PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPD0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX2NtcChzZWxmLCBvdGhlcik6XFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKVxcbiAgICAgICAgcmV0dXJuIF9jbXAoc2VsZi5fZ2V0c3RhdGUoKSwgb3RoZXIuX2dldHN0YXRlKCkpXFxuXFxuICAgIGRlZiBfX2hhc2hfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX2hhc2hjb2RlID09IC0xOlxcbiAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiAoc2VsZi5fZGF5cyAhPSAwIG9yXFxuICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgIT0gMCBvclxcbiAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMgIT0gMClcXG5cXG50aW1lZGVsdGEubWluID0gdGltZWRlbHRhKC1fTUFYX0RFTFRBX0RBWVMpXFxudGltZWRlbHRhLm1heCA9IHRpbWVkZWx0YShfTUFYX0RFTFRBX0RBWVMsIDI0KjM2MDAtMSwgMTAwMDAwMC0xKVxcbnRpbWVkZWx0YS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKVxcblxcbmNsYXNzIGRhdGUob2JqZWN0KTpcXG4gICAgXFxcIlxcXCJcXFwiQ29uY3JldGUgZGF0ZSB0eXBlLlxcblxcbiAgICBDb25zdHJ1Y3RvcnM6XFxuXFxuICAgIF9fbmV3X18oKVxcbiAgICBmcm9tdGltZXN0YW1wKClcXG4gICAgdG9kYXkoKVxcbiAgICBmcm9tb3JkaW5hbCgpXFxuXFxuICAgIE9wZXJhdG9yczpcXG5cXG4gICAgX19yZXByX18sIF9fc3RyX19cXG4gICAgX19jbXBfXywgX19oYXNoX19cXG4gICAgX19hZGRfXywgX19yYWRkX18sIF9fc3ViX18gKGFkZC9yYWRkIG9ubHkgd2l0aCB0aW1lZGVsdGEgYXJnKVxcblxcbiAgICBNZXRob2RzOlxcblxcbiAgICB0aW1ldHVwbGUoKVxcbiAgICB0b29yZGluYWwoKVxcbiAgICB3ZWVrZGF5KClcXG4gICAgaXNvd2Vla2RheSgpLCBpc29jYWxlbmRhcigpLCBpc29mb3JtYXQoKVxcbiAgICBjdGltZSgpXFxuICAgIHN0cmZ0aW1lKClcXG5cXG4gICAgUHJvcGVydGllcyAocmVhZG9ubHkpOlxcbiAgICB5ZWFyLCBtb250aCwgZGF5XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAnX3llYXInLCAnX21vbnRoJywgJ19kYXknLCAnX2hhc2hjb2RlJ1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIHllYXIsIG1vbnRoPU5vbmUsIGRheT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnN0cnVjdG9yLlxcblxcbiAgICAgICAgQXJndW1lbnRzOlxcblxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSAocmVxdWlyZWQsIGJhc2UgMSlcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KVxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX3llYXIgPSB5ZWFyXFxuICAgICAgICBzZWxmLl9tb250aCA9IG1vbnRoXFxuICAgICAgICBzZWxmLl9kYXkgPSBkYXlcXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICMgQWRkaXRpb25hbCBjb25zdHJ1Y3RvcnNcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBmcm9tdGltZXN0YW1wKGNscywgdCk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgZGF0ZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS5cXFwiXFxuICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZWVrZGF5LCBqZGF5LCBkc3QgPSBfdGltZS5sb2NhbHRpbWUodClcXG4gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiB0b2RheShjbHMpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGUgZnJvbSB0aW1lLnRpbWUoKS5cXFwiXFxuICAgICAgICB0ID0gX3RpbWUudGltZSgpXFxuICAgICAgICByZXR1cm4gY2xzLmZyb210aW1lc3RhbXAodClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBmcm9tb3JkaW5hbChjbHMsIG4pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29udHJ1Y3QgYSBkYXRlIGZyb20gYSBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwuXFxuXFxuICAgICAgICBKYW51YXJ5IDEgb2YgeWVhciAxIGlzIGRheSAxLiAgT25seSB0aGUgeWVhciwgbW9udGggYW5kIGRheSBhcmVcXG4gICAgICAgIG5vbi16ZXJvIGluIHRoZSByZXN1bHQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHksIG0sIGQgPSBfb3JkMnltZChuKVxcbiAgICAgICAgcmV0dXJuIGNscyh5LCBtLCBkKVxcblxcbiAgICAjIENvbnZlcnNpb25zIHRvIHN0cmluZ1xcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb252ZXJ0IHRvIGZvcm1hbCBzdHJpbmcsIGZvciByZXByKCkuXFxuXFxuICAgICAgICA+Pj4gZHQgPSBkYXRldGltZSgyMDEwLCAxLCAxKVxcbiAgICAgICAgPj4+IHJlcHIoZHQpXFxuICAgICAgICAnZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgMSwgMSwgMCwgMCknXFxuXFxuICAgICAgICA+Pj4gZHQgPSBkYXRldGltZSgyMDEwLCAxLCAxLCB0emluZm89dGltZXpvbmUudXRjKVxcbiAgICAgICAgPj4+IHJlcHIoZHQpXFxuICAgICAgICAnZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgMSwgMSwgMCwgMCwgdHppbmZvPWRhdGV0aW1lLnRpbWV6b25lLnV0YyknXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIG1vZHVsZSA9IFxcXCJkYXRldGltZS5cXFwiIGlmIHNlbGYuX19jbGFzc19fIGlzIGRhdGUgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCIlcyglZCwgJWQsICVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl95ZWFyLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbW9udGgsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXkpXFxuXFxuICAgICMgWFhYIFRoZXNlIHNob3VsZG4ndCBkZXBlbmQgb24gdGltZS5sb2NhbHRpbWUoKSwgYmVjYXVzZSB0aGF0XFxuICAgICMgY2xpcHMgdGhlIHVzYWJsZSBkYXRlcyB0byBbMTk3MCAuLiAyMDM4KS4gIEF0IGxlYXN0IGN0aW1lKCkgaXNcXG4gICAgIyBlYXNpbHkgZG9uZSB3aXRob3V0IHVzaW5nIHN0cmZ0aW1lKCkgLS0gdGhhdCdzIGJldHRlciB0b28gYmVjYXVzZVxcbiAgICAjIHN0cmZ0aW1lKFxcXCIlY1xcXCIsIC4uLikgaXMgbG9jYWxlIHNwZWNpZmljLlxcblxcbiAgICBkZWYgY3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLlxcXCJcXG4gICAgICAgIHdlZWtkYXkgPSBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuICAgICAgICByZXR1cm4gXFxcIiVzICVzICUyZCAwMDowMDowMCAlMDRkXFxcIiAlIChcXG4gICAgICAgICAgICBfREFZTkFNRVNbd2Vla2RheV0sXFxuICAgICAgICAgICAgX01PTlRITkFNRVNbc2VsZi5fbW9udGhdLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSwgc2VsZi5feWVhcilcXG5cXG4gICAgZGVmIHN0cmZ0aW1lKHNlbGYsIGZvcm1hdCk6XFxuICAgICAgICBcXFwiRm9ybWF0IHVzaW5nIHN0cmZ0aW1lKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIF93cmFwX3N0cmZ0aW1lKHNlbGYsIGZvcm1hdCwgc2VsZi50aW1ldHVwbGUoKSlcXG5cXG4gICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm10KTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZtdCwgKHN0ciwgdW5pY29kZSkpOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIl9fZm9ybWF0X18gZXhwZWN0cyBzdHIgb3IgdW5pY29kZSwgbm90ICVzXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuX19jbGFzc19fLl9fbmFtZV9fKVxcbiAgICAgICAgaWYgbGVuKGZtdCkgIT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zdHJmdGltZShmbXQpXFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYpXFxuXFxuICAgIGRlZiBpc29mb3JtYXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGRhdGUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uXFxuXFxuICAgICAgICBUaGlzIGlzICdZWVlZLU1NLUREJy5cXG5cXG4gICAgICAgIFJlZmVyZW5jZXM6XFxuICAgICAgICAtIGh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWVcXG4gICAgICAgIC0gaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L2lzby10aW1lLmh0bWxcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCIlMDRkLSUwMmQtJTAyZFxcXCIgJSAoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG5cXG4gICAgX19zdHJfXyA9IGlzb2Zvcm1hdFxcblxcbiAgICAjIFJlYWQtb25seSBmaWVsZCBhY2Nlc3NvcnNcXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB5ZWFyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwieWVhciAoMS05OTk5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3llYXJcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtb250aChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1vbnRoICgxLTEyKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21vbnRoXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgZGF5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGF5ICgxLTMxKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2RheVxcblxcbiAgICAjIFN0YW5kYXJkIGNvbnZlcnNpb25zLCBfX2NtcF9fLCBfX2hhc2hfXyAoYW5kIGhlbHBlcnMpXFxuXFxuICAgIGRlZiB0aW1ldHVwbGUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGxvY2FsIHRpbWUgdHVwbGUgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIF9idWlsZF9zdHJ1Y3RfdGltZShzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAtMSlcXG5cXG4gICAgZGVmIHRvb3JkaW5hbChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwgZm9yIHRoZSB5ZWFyLCBtb250aCBhbmQgZGF5LlxcblxcbiAgICAgICAgSmFudWFyeSAxIG9mIHllYXIgMSBpcyBkYXkgMS4gIE9ubHkgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgdmFsdWVzXFxuICAgICAgICBjb250cmlidXRlIHRvIHRoZSByZXN1bHQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBfeW1kMm9yZChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5KVxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCB5ZWFyPU5vbmUsIG1vbnRoPU5vbmUsIGRheT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBhIG5ldyBkYXRlIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB5ZWFyIGlzIE5vbmU6XFxuICAgICAgICAgICAgeWVhciA9IHNlbGYuX3llYXJcXG4gICAgICAgIGlmIG1vbnRoIGlzIE5vbmU6XFxuICAgICAgICAgICAgbW9udGggPSBzZWxmLl9tb250aFxcbiAgICAgICAgaWYgZGF5IGlzIE5vbmU6XFxuICAgICAgICAgICAgZGF5ID0gc2VsZi5fZGF5XFxuICAgICAgICByZXR1cm4gZGF0ZSh5ZWFyLCBtb250aCwgZGF5KVxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIGRhdGUgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSAhPSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG5cXG4gICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID4gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpXFxuICAgICAgICB5LCBtLCBkID0gc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheVxcbiAgICAgICAgeTIsIG0yLCBkMiA9IG90aGVyLl95ZWFyLCBvdGhlci5fbW9udGgsIG90aGVyLl9kYXlcXG4gICAgICAgIHJldHVybiBfY21wKCh5LCBtLCBkKSwgKHkyLCBtMiwgZDIpKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBcXFwiSGFzaC5cXFwiXFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goc2VsZi5fZ2V0c3RhdGUoKSlcXG4gICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZVxcblxcbiAgICAjIENvbXB1dGF0aW9uc1xcblxcbiAgICBkZWYgX2FkZF90aW1lZGVsdGEoc2VsZiwgb3RoZXIsIGZhY3Rvcik6XFxuICAgICAgICB5LCBtLCBkID0gX25vcm1hbGl6ZV9kYXRlKFxcbiAgICAgICAgICAgIHNlbGYuX3llYXIsXFxuICAgICAgICAgICAgc2VsZi5fbW9udGgsXFxuICAgICAgICAgICAgc2VsZi5fZGF5ICsgb3RoZXIuZGF5cyAqIGZhY3RvcilcXG4gICAgICAgIHJldHVybiBkYXRlKHksIG0sIGQpXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJBZGQgYSBkYXRlIHRvIGEgdGltZWRlbHRhLlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZF90aW1lZGVsdGEob3RoZXIsIDEpXFxuICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgX19yYWRkX18gPSBfX2FkZF9fXFxuXFxuICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlN1YnRyYWN0IHR3byBkYXRlcywgb3IgYSBkYXRlIGFuZCBhIHRpbWVkZWx0YS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIGRheXMxID0gc2VsZi50b29yZGluYWwoKVxcbiAgICAgICAgICAgIGRheXMyID0gb3RoZXIudG9vcmRpbmFsKClcXG4gICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoZGF5czEgLSBkYXlzMiwgMCwgMCwgRmFsc2UpXFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAtMSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBkZWYgd2Vla2RheShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gZGF5IG9mIHRoZSB3ZWVrLCB3aGVyZSBNb25kYXkgPT0gMCAuLi4gU3VuZGF5ID09IDYuXFxcIlxcbiAgICAgICAgcmV0dXJuIChzZWxmLnRvb3JkaW5hbCgpICsgNikgJSA3XFxuXFxuICAgICMgRGF5LW9mLXRoZS13ZWVrIGFuZCB3ZWVrLW9mLXRoZS15ZWFyLCBhY2NvcmRpbmcgdG8gSVNPXFxuXFxuICAgIGRlZiBpc293ZWVrZGF5KHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBkYXkgb2YgdGhlIHdlZWssIHdoZXJlIE1vbmRheSA9PSAxIC4uLiBTdW5kYXkgPT0gNy5cXFwiXFxuICAgICAgICAjIDEtSmFuLTAwMDEgaXMgYSBNb25kYXlcXG4gICAgICAgIHJldHVybiBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuXFxuICAgIGRlZiBpc29jYWxlbmRhcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyBJU08geWVhciwgd2VlayBudW1iZXIsIGFuZCB3ZWVrZGF5LlxcblxcbiAgICAgICAgVGhlIGZpcnN0IElTTyB3ZWVrIG9mIHRoZSB5ZWFyIGlzIHRoZSAoTW9uLVN1bikgd2Vla1xcbiAgICAgICAgY29udGFpbmluZyB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5OyBldmVyeXRoaW5nIGVsc2UgZGVyaXZlc1xcbiAgICAgICAgZnJvbSB0aGF0LlxcblxcbiAgICAgICAgVGhlIGZpcnN0IHdlZWsgaXMgMTsgTW9uZGF5IGlzIDEgLi4uIFN1bmRheSBpcyA3LlxcblxcbiAgICAgICAgSVNPIGNhbGVuZGFyIGFsZ29yaXRobSB0YWtlbiBmcm9tXFxuICAgICAgICBodHRwOi8vd3d3LnBoeXMudXUubmwvfnZnZW50L2NhbGVuZGFyL2lzb2NhbGVuZGFyLmh0bVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB5ZWFyID0gc2VsZi5feWVhclxcbiAgICAgICAgd2VlazFtb25kYXkgPSBfaXNvd2VlazFtb25kYXkoeWVhcilcXG4gICAgICAgIHRvZGF5ID0gX3ltZDJvcmQoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG4gICAgICAgICMgSW50ZXJuYWxseSwgd2VlayBhbmQgZGF5IGhhdmUgb3JpZ2luIDBcXG4gICAgICAgIHdlZWssIGRheSA9IGRpdm1vZCh0b2RheSAtIHdlZWsxbW9uZGF5LCA3KVxcbiAgICAgICAgaWYgd2VlayA8IDA6XFxuICAgICAgICAgICAgeWVhciAtPSAxXFxuICAgICAgICAgICAgd2VlazFtb25kYXkgPSBfaXNvd2VlazFtb25kYXkoeWVhcilcXG4gICAgICAgICAgICB3ZWVrLCBkYXkgPSBkaXZtb2QodG9kYXkgLSB3ZWVrMW1vbmRheSwgNylcXG4gICAgICAgIGVsaWYgd2VlayA+PSA1MjpcXG4gICAgICAgICAgICBpZiB0b2RheSA+PSBfaXNvd2VlazFtb25kYXkoeWVhcisxKTpcXG4gICAgICAgICAgICAgICAgeWVhciArPSAxXFxuICAgICAgICAgICAgICAgIHdlZWsgPSAwXFxuICAgICAgICByZXR1cm4geWVhciwgd2VlaysxLCBkYXkrMVxcblxcbl9kYXRlX2NsYXNzID0gZGF0ZSAgIyBzbyBmdW5jdGlvbnMgdy8gYXJncyBuYW1lZCBcXFwiZGF0ZVxcXCIgY2FuIGdldCBhdCB0aGUgY2xhc3NcXG5cXG5kYXRlLm1pbiA9IGRhdGUoMSwgMSwgMSlcXG5kYXRlLm1heCA9IGRhdGUoOTk5OSwgMTIsIDMxKVxcbmRhdGUucmVzb2x1dGlvbiA9IHRpbWVkZWx0YShkYXlzPTEpXFxuXFxuY2xhc3MgdHppbmZvKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRpbWUgem9uZSBpbmZvIGNsYXNzZXMuXFxuXFxuICAgIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGUgbmFtZSgpLCB1dGNvZmZzZXQoKSBhbmQgZHN0KCkgbWV0aG9kcy5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIF9fc2xvdHNfXyA9ICgpXFxuXFxuICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcImRhdGV0aW1lIC0+IHN0cmluZyBuYW1lIG9mIHRpbWUgem9uZS5cXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSB0em5hbWUoKVxcXCIpXFxuXFxuICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcImRhdGV0aW1lIC0+IG1pbnV0ZXMgZWFzdCBvZiBVVEMgKG5lZ2F0aXZlIGZvciB3ZXN0IG9mIFVUQylcXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSB1dGNvZmZzZXQoKVxcXCIpXFxuXFxuICAgIGRlZiBkc3Qoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGF0ZXRpbWUgLT4gRFNUIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDLlxcblxcbiAgICAgICAgUmV0dXJuIDAgaWYgRFNUIG5vdCBpbiBlZmZlY3QuICB1dGNvZmZzZXQoKSBtdXN0IGluY2x1ZGUgdGhlIERTVFxcbiAgICAgICAgb2Zmc2V0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSBkc3QoKVxcXCIpXFxuXFxuICAgIGRlZiBmcm9tdXRjKHNlbGYsIGR0KTpcXG4gICAgICAgIFxcXCJkYXRldGltZSBpbiBVVEMgLT4gZGF0ZXRpbWUgaW4gbG9jYWwgdGltZS5cXFwiXFxuXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkdCwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiZnJvbXV0YygpIHJlcXVpcmVzIGEgZGF0ZXRpbWUgYXJndW1lbnRcXFwiKVxcbiAgICAgICAgaWYgZHQudHppbmZvIGlzIG5vdCBzZWxmOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImR0LnR6aW5mbyBpcyBub3Qgc2VsZlxcXCIpXFxuXFxuICAgICAgICBkdG9mZiA9IGR0LnV0Y29mZnNldCgpXFxuICAgICAgICBpZiBkdG9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImZyb211dGMoKSByZXF1aXJlcyBhIG5vbi1Ob25lIHV0Y29mZnNldCgpIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJyZXN1bHRcXFwiKVxcblxcbiAgICAgICAgIyBTZWUgdGhlIGxvbmcgY29tbWVudCBibG9jayBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgYW5cXG4gICAgICAgICMgZXhwbGFuYXRpb24gb2YgdGhpcyBhbGdvcml0aG0uXFxuICAgICAgICBkdGRzdCA9IGR0LmRzdCgpXFxuICAgICAgICBpZiBkdGRzdCBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImZyb211dGMoKSByZXF1aXJlcyBhIG5vbi1Ob25lIGRzdCgpIHJlc3VsdFxcXCIpXFxuICAgICAgICBkZWx0YSA9IGR0b2ZmIC0gZHRkc3RcXG4gICAgICAgIGlmIGRlbHRhOlxcbiAgICAgICAgICAgIGR0ID0gZHQgKyBkZWx0YVxcbiAgICAgICAgICAgIGR0ZHN0ID0gZHQuZHN0KClcXG4gICAgICAgICAgICBpZiBkdGRzdCBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJmcm9tdXRjKCk6IGR0LmRzdCBnYXZlIGluY29uc2lzdGVudCBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInJlc3VsdHM7IGNhbm5vdCBjb252ZXJ0XFxcIilcXG4gICAgICAgIGlmIGR0ZHN0OlxcbiAgICAgICAgICAgIHJldHVybiBkdCArIGR0ZHN0XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBkdFxcblxcbl90emluZm9fY2xhc3MgPSB0emluZm9cXG5cXG5jbGFzcyB0aW1lKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIlRpbWUgd2l0aCB0aW1lIHpvbmUuXFxuXFxuICAgIENvbnN0cnVjdG9yczpcXG5cXG4gICAgX19uZXdfXygpXFxuXFxuICAgIE9wZXJhdG9yczpcXG5cXG4gICAgX19yZXByX18sIF9fc3RyX19cXG4gICAgX19jbXBfXywgX19oYXNoX19cXG5cXG4gICAgTWV0aG9kczpcXG5cXG4gICAgc3RyZnRpbWUoKVxcbiAgICBpc29mb3JtYXQoKVxcbiAgICB1dGNvZmZzZXQoKVxcbiAgICB0em5hbWUoKVxcbiAgICBkc3QoKVxcblxcbiAgICBQcm9wZXJ0aWVzIChyZWFkb25seSk6XFxuICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgdHppbmZvXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAnX2hvdXInLCAnX21pbnV0ZScsICdfc2Vjb25kJywgJ19taWNyb3NlY29uZCcsICdfdHppbmZvJywgJ19oYXNoY29kZSdcXG5cXG4gICAgZGVmIF9fbmV3X18oY2xzLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29uc3RydWN0b3IuXFxuXFxuICAgICAgICBBcmd1bWVudHM6XFxuXFxuICAgICAgICBob3VyLCBtaW51dGUgKHJlcXVpcmVkKVxcbiAgICAgICAgc2Vjb25kLCBtaWNyb3NlY29uZCAoZGVmYXVsdCB0byB6ZXJvKVxcbiAgICAgICAgdHppbmZvIChkZWZhdWx0IHRvIE5vbmUpXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCA9IF9jaGVja190aW1lX2ZpZWxkcyhcXG4gICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQpXFxuICAgICAgICBfY2hlY2tfdHppbmZvX2FyZyh0emluZm8pXFxuICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKVxcbiAgICAgICAgc2VsZi5faG91ciA9IGhvdXJcXG4gICAgICAgIHNlbGYuX21pbnV0ZSA9IG1pbnV0ZVxcbiAgICAgICAgc2VsZi5fc2Vjb25kID0gc2Vjb25kXFxuICAgICAgICBzZWxmLl9taWNyb3NlY29uZCA9IG1pY3Jvc2Vjb25kXFxuICAgICAgICBzZWxmLl90emluZm8gPSB0emluZm9cXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICMgUmVhZC1vbmx5IGZpZWxkIGFjY2Vzc29yc1xcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIGhvdXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJob3VyICgwLTIzKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hvdXJcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtaW51dGUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaW51dGUgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWludXRlXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgc2Vjb25kKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwic2Vjb25kICgwLTU5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NlY29uZFxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pY3Jvc2Vjb25kKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWljcm9zZWNvbmQgKDAtOTk5OTk5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21pY3Jvc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgdHppbmZvKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwidGltZXpvbmUgaW5mbyBvYmplY3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl90emluZm9cXG5cXG4gICAgIyBTdGFuZGFyZCBjb252ZXJzaW9ucywgX19oYXNoX18gKGFuZCBoZWxwZXJzKVxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIHRpbWUgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpXFxuICAgICAgICBteXR6ID0gc2VsZi5fdHppbmZvXFxuICAgICAgICBvdHR6ID0gb3RoZXIuX3R6aW5mb1xcbiAgICAgICAgbXlvZmYgPSBvdG9mZiA9IE5vbmVcXG5cXG4gICAgICAgIGlmIG15dHogaXMgb3R0ejpcXG4gICAgICAgICAgICBiYXNlX2NvbXBhcmUgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG15b2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICBvdG9mZiA9IG90aGVyLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IG15b2ZmID09IG90b2ZmXFxuXFxuICAgICAgICBpZiBiYXNlX2NvbXBhcmU6XFxuICAgICAgICAgICAgcmV0dXJuIF9jbXAoKHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyLl9ob3VyLCBvdGhlci5fbWludXRlLCBvdGhlci5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5fbWljcm9zZWNvbmQpKVxcbiAgICAgICAgaWYgbXlvZmYgaXMgTm9uZSBvciBvdG9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kIG9mZnNldC1hd2FyZSB0aW1lc1xcXCIpXFxuICAgICAgICBteWhobW0gPSBzZWxmLl9ob3VyICogNjAgKyBzZWxmLl9taW51dGUgLSBteW9mZlxcbiAgICAgICAgb3RoaG1tID0gb3RoZXIuX2hvdXIgKiA2MCArIG90aGVyLl9taW51dGUgLSBvdG9mZlxcbiAgICAgICAgcmV0dXJuIF9jbXAoKG15aGhtbSwgc2VsZi5fc2Vjb25kLCBzZWxmLl9taWNyb3NlY29uZCksXFxuICAgICAgICAgICAgICAgICAgICAob3RoaG1tLCBvdGhlci5fc2Vjb25kLCBvdGhlci5fbWljcm9zZWNvbmQpKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJIYXNoLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5faGFzaGNvZGUgPT0gLTE6XFxuICAgICAgICAgICAgdHpvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGlmIG5vdCB0em9mZjogICMgemVybyBvciBOb25lXFxuICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpWzBdKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGgsIG0gPSBkaXZtb2Qoc2VsZi5ob3VyICogNjAgKyBzZWxmLm1pbnV0ZSAtIHR6b2ZmLCA2MClcXG4gICAgICAgICAgICAgICAgaWYgMCA8PSBoIDwgMjQ6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2godGltZShoLCBtLCBzZWxmLnNlY29uZCwgc2VsZi5taWNyb3NlY29uZCkpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goKGgsIG0sIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKSlcXG4gICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZVxcblxcbiAgICAjIENvbnZlcnNpb24gdG8gc3RyaW5nXFxuXFxuICAgIGRlZiBfdHpzdHIoc2VsZiwgc2VwPVxcXCI6XFxcIik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gZm9ybWF0dGVkIHRpbWV6b25lIG9mZnNldCAoK3h4Onh4KSBvciBOb25lLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgb2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG9mZiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBpZiBvZmYgPCAwOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIi1cXFwiXFxuICAgICAgICAgICAgICAgIG9mZiA9IC1vZmZcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIitcXFwiXFxuICAgICAgICAgICAgaGgsIG1tID0gZGl2bW9kKG9mZiwgNjApXFxuICAgICAgICAgICAgYXNzZXJ0IDAgPD0gaGggPCAyNFxcbiAgICAgICAgICAgIG9mZiA9IFxcXCIlcyUwMmQlcyUwMmRcXFwiICUgKHNpZ24sIGhoLCBzZXAsIG1tKVxcbiAgICAgICAgcmV0dXJuIG9mZlxcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb252ZXJ0IHRvIGZvcm1hbCBzdHJpbmcsIGZvciByZXByKCkuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9taWNyb3NlY29uZCAhPSAwOlxcbiAgICAgICAgICAgIHMgPSBcXFwiLCAlZCwgJWRcXFwiICUgKHNlbGYuX3NlY29uZCwgc2VsZi5fbWljcm9zZWNvbmQpXFxuICAgICAgICBlbGlmIHNlbGYuX3NlY29uZCAhPSAwOlxcbiAgICAgICAgICAgIHMgPSBcXFwiLCAlZFxcXCIgJSBzZWxmLl9zZWNvbmRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcyA9IFxcXCJcXFwiXFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyB0aW1lIGVsc2UgXFxcIlxcXCJcXG4gICAgICAgIHM9IFxcXCIlcyglZCwgJWQlcylcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzKVxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGFzc2VydCBzWy0xOl0gPT0gXFxcIilcXFwiXFxuICAgICAgICAgICAgcyA9IHNbOi0xXSArIFxcXCIsIHR6aW5mbz0lclxcXCIgJSBzZWxmLl90emluZm8gKyBcXFwiKVxcXCJcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBpc29mb3JtYXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uXFxuXFxuICAgICAgICBUaGlzIGlzICdISDpNTTpTUy5tbW1tbW0reno6enonLCBvciAnSEg6TU06U1Mreno6enonIGlmXFxuICAgICAgICBzZWxmLm1pY3Jvc2Vjb25kID09IDAuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHMgPSBfZm9ybWF0X3RpbWUoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKVxcbiAgICAgICAgdHogPSBzZWxmLl90enN0cigpXFxuICAgICAgICBpZiB0ejpcXG4gICAgICAgICAgICBzICs9IHR6XFxuICAgICAgICByZXR1cm4gc1xcblxcbiAgICBfX3N0cl9fID0gaXNvZm9ybWF0XFxuXFxuICAgIGRlZiBzdHJmdGltZShzZWxmLCBmb3JtYXQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRm9ybWF0IHVzaW5nIHN0cmZ0aW1lKCkuICBUaGUgZGF0ZSBwYXJ0IG9mIHRoZSB0aW1lc3RhbXAgcGFzc2VkXFxuICAgICAgICB0byB1bmRlcmx5aW5nIHN0cmZ0aW1lIHNob3VsZCBub3QgYmUgdXNlZC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBUaGUgeWVhciBtdXN0IGJlID49IF9NSU5ZRUFSRk1UIGVsc2UgUHl0aG9uJ3Mgc3RyZnRpbWUgaW1wbGVtZW50YXRpb25cXG4gICAgICAgICMgY2FuIHJhaXNlIGEgYm9ndXMgZXhjZXB0aW9uLlxcbiAgICAgICAgdGltZXR1cGxlID0gKDE5MDAsIDEsIDEsXFxuICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgMCwgMSwgLTEpXFxuICAgICAgICByZXR1cm4gX3dyYXBfc3RyZnRpbWUoc2VsZiwgZm9ybWF0LCB0aW1ldHVwbGUpXFxuXFxuICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZtdCk6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmbXQsIChzdHIsIHVuaWNvZGUpKTpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJfX2Zvcm1hdF9fIGV4cGVjdHMgc3RyIG9yIHVuaWNvZGUsIG5vdCAlc1xcXCIgJVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10Ll9fY2xhc3NfXy5fX25hbWVfXylcXG4gICAgICAgIGlmIGxlbihmbXQpICE9IDA6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RyZnRpbWUoZm10KVxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmKVxcblxcbiAgICAjIFRpbWV6b25lIGZ1bmN0aW9uc1xcblxcbiAgICBkZWYgdXRjb2Zmc2V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgd2VzdCBvZlxcbiAgICAgICAgVVRDKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YS5fY3JlYXRlKDAsIG9mZnNldCAqIDYwLCAwLCBUcnVlKVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIFJldHVybiBhbiBpbnRlZ2VyIChvciBOb25lKSBpbnN0ZWFkIG9mIGEgdGltZWRlbHRhIChvciBOb25lKS5cXG4gICAgZGVmIF91dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLnV0Y29mZnNldChOb25lKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcInV0Y29mZnNldFxcXCIsIG9mZnNldClcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgZGVmIHR6bmFtZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZXpvbmUgbmFtZS5cXG5cXG4gICAgICAgIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyAxMDAlIGluZm9ybWF0aW9uYWwgLS0gdGhlcmUncyBubyByZXF1aXJlbWVudCB0aGF0XFxuICAgICAgICBpdCBtZWFuIGFueXRoaW5nIGluIHBhcnRpY3VsYXIuIEZvciBleGFtcGxlLCBcXFwiR01UXFxcIiwgXFxcIlVUQ1xcXCIsIFxcXCItNTAwXFxcIixcXG4gICAgICAgIFxcXCItNTowMFxcXCIsIFxcXCJFRFRcXFwiLCBcXFwiVVMvRWFzdGVyblxcXCIsIFxcXCJBbWVyaWNhL05ldyBZb3JrXFxcIiBhcmUgYWxsIHZhbGlkIHJlcGxpZXMuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBuYW1lID0gc2VsZi5fdHppbmZvLnR6bmFtZShOb25lKVxcbiAgICAgICAgX2NoZWNrX3R6bmFtZShuYW1lKVxcbiAgICAgICAgcmV0dXJuIG5hbWVcXG5cXG4gICAgZGVmIGRzdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiAwIGlmIERTVCBpcyBub3QgaW4gZWZmZWN0LCBvciB0aGUgRFNUIG9mZnNldCAoaW4gbWludXRlc1xcbiAgICAgICAgZWFzdHdhcmQpIGlmIERTVCBpcyBpbiBlZmZlY3QuXFxuXFxuICAgICAgICBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsOyB0aGUgRFNUIG9mZnNldCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvXFxuICAgICAgICB0aGUgVVRDIG9mZnNldCByZXR1cm5lZCBieSB1dGNvZmZzZXQoKSBpZiBhcHBsaWNhYmxlLCBzbyB0aGVyZSdzIG5vXFxuICAgICAgICBuZWVkIHRvIGNvbnN1bHQgZHN0KCkgdW5sZXNzIHlvdSdyZSBpbnRlcmVzdGVkIGluIGRpc3BsYXlpbmcgdGhlIERTVFxcbiAgICAgICAgaW5mby5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3QoTm9uZSlcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX2RzdChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8uZHN0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwiZHN0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCBob3VyPU5vbmUsIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSxcXG4gICAgICAgICAgICAgICAgdHppbmZvPVRydWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgbmV3IHRpbWUgd2l0aCBuZXcgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkcy5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGhvdXIgaXMgTm9uZTpcXG4gICAgICAgICAgICBob3VyID0gc2VsZi5ob3VyXFxuICAgICAgICBpZiBtaW51dGUgaXMgTm9uZTpcXG4gICAgICAgICAgICBtaW51dGUgPSBzZWxmLm1pbnV0ZVxcbiAgICAgICAgaWYgc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgc2Vjb25kID0gc2VsZi5zZWNvbmRcXG4gICAgICAgIGlmIG1pY3Jvc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWljcm9zZWNvbmQgPSBzZWxmLm1pY3Jvc2Vjb25kXFxuICAgICAgICBpZiB0emluZm8gaXMgVHJ1ZTpcXG4gICAgICAgICAgICB0emluZm8gPSBzZWxmLnR6aW5mb1xcbiAgICAgICAgcmV0dXJuIHRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCB0emluZm8pXFxuXFxuICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuc2Vjb25kIG9yIHNlbGYubWljcm9zZWNvbmQ6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3V0Y29mZnNldCgpIG9yIDBcXG4gICAgICAgIHJldHVybiBzZWxmLmhvdXIgKiA2MCArIHNlbGYubWludXRlICE9IG9mZnNldFxcblxcbl90aW1lX2NsYXNzID0gdGltZSAgIyBzbyBmdW5jdGlvbnMgdy8gYXJncyBuYW1lZCBcXFwidGltZVxcXCIgY2FuIGdldCBhdCB0aGUgY2xhc3NcXG5cXG50aW1lLm1pbiA9IHRpbWUoMCwgMCwgMClcXG50aW1lLm1heCA9IHRpbWUoMjMsIDU5LCA1OSwgOTk5OTk5KVxcbnRpbWUucmVzb2x1dGlvbiA9IHRpbWVkZWx0YShtaWNyb3NlY29uZHM9MSlcXG5cXG5jbGFzcyBkYXRldGltZShkYXRlKTpcXG4gICAgXFxcIlxcXCJcXFwiZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheVssIGhvdXJbLCBtaW51dGVbLCBzZWNvbmRbLCBtaWNyb3NlY29uZFssdHppbmZvXV1dXV0pXFxuXFxuICAgIFRoZSB5ZWFyLCBtb250aCBhbmQgZGF5IGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQuIHR6aW5mbyBtYXkgYmUgTm9uZSwgb3IgYW5cXG4gICAgaW5zdGFuY2Ugb2YgYSB0emluZm8gc3ViY2xhc3MuIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIG1heSBiZSBpbnRzIG9yIGxvbmdzLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gZGF0ZS5fX3Nsb3RzX18gKyB0aW1lLl9fc2xvdHNfX1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIHllYXIsIG1vbnRoPU5vbmUsIGRheT1Ob25lLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCxcXG4gICAgICAgICAgICAgICAgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUpOlxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KVxcbiAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kID0gX2NoZWNrX3RpbWVfZmllbGRzKFxcbiAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZClcXG4gICAgICAgIF9jaGVja190emluZm9fYXJnKHR6aW5mbylcXG4gICAgICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpXFxuICAgICAgICBzZWxmLl95ZWFyID0geWVhclxcbiAgICAgICAgc2VsZi5fbW9udGggPSBtb250aFxcbiAgICAgICAgc2VsZi5fZGF5ID0gZGF5XFxuICAgICAgICBzZWxmLl9ob3VyID0gaG91clxcbiAgICAgICAgc2VsZi5fbWludXRlID0gbWludXRlXFxuICAgICAgICBzZWxmLl9zZWNvbmQgPSBzZWNvbmRcXG4gICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kID0gbWljcm9zZWNvbmRcXG4gICAgICAgIHNlbGYuX3R6aW5mbyA9IHR6aW5mb1xcbiAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgaG91cihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImhvdXIgKDAtMjMpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faG91clxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pbnV0ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1pbnV0ZSAoMC01OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9taW51dGVcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBzZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJzZWNvbmQgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWljcm9zZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaWNyb3NlY29uZCAoMC05OTk5OTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWljcm9zZWNvbmRcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB0emluZm8oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ0aW1lem9uZSBpbmZvIG9iamVjdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3R6aW5mb1xcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIGZyb210aW1lc3RhbXAoY2xzLCB0aW1lc3RhbXAsIHR6PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29uc3RydWN0IGEgZGF0ZXRpbWUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAobGlrZSB0aW1lLnRpbWUoKSkuXFxuXFxuICAgICAgICBBIHRpbWV6b25lIGluZm8gb2JqZWN0IG1heSBiZSBwYXNzZWQgaW4gYXMgd2VsbC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NoZWNrX3R6aW5mb19hcmcodHopXFxuICAgICAgICBjb252ZXJ0ZXIgPSBfdGltZS5sb2NhbHRpbWUgaWYgdHogaXMgTm9uZSBlbHNlIF90aW1lLmdtdGltZVxcbiAgICAgICAgc2VsZiA9IGNscy5fZnJvbV90aW1lc3RhbXAoY29udmVydGVyLCB0aW1lc3RhbXAsIHR6KVxcbiAgICAgICAgaWYgdHogaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgc2VsZiA9IHR6LmZyb211dGMoc2VsZilcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgdXRjZnJvbXRpbWVzdGFtcChjbHMsIHQpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIFVUQyBkYXRldGltZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS5cXFwiXFxuICAgICAgICByZXR1cm4gY2xzLl9mcm9tX3RpbWVzdGFtcChfdGltZS5nbXRpbWUsIHQsIE5vbmUpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgX2Zyb21fdGltZXN0YW1wKGNscywgY29udmVydGVyLCB0aW1lc3RhbXAsIHR6aW5mbyk6XFxuICAgICAgICB0X2Z1bGwgPSB0aW1lc3RhbXBcXG4gICAgICAgIHRpbWVzdGFtcCA9IGludChfbWF0aC5mbG9vcih0aW1lc3RhbXApKVxcbiAgICAgICAgZnJhYyA9IHRfZnVsbCAtIHRpbWVzdGFtcFxcbiAgICAgICAgdXMgPSBfcm91bmQoZnJhYyAqIDFlNilcXG5cXG4gICAgICAgICMgSWYgdGltZXN0YW1wIGlzIGxlc3MgdGhhbiBvbmUgbWljcm9zZWNvbmQgc21hbGxlciB0aGFuIGFcXG4gICAgICAgICMgZnVsbCBzZWNvbmQsIHVzIGNhbiBiZSByb3VuZGVkIHVwIHRvIDEwMDAwMDAuICBJbiB0aGlzIGNhc2UsXFxuICAgICAgICAjIHJvbGwgb3ZlciB0byBzZWNvbmRzLCBvdGhlcndpc2UsIFZhbHVlRXJyb3IgaXMgcmFpc2VkXFxuICAgICAgICAjIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cXG4gICAgICAgIGlmIHVzID09IDEwMDAwMDA6XFxuICAgICAgICAgICAgdGltZXN0YW1wICs9IDFcXG4gICAgICAgICAgICB1cyA9IDBcXG4gICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MsIHdlZWtkYXksIGpkYXksIGRzdCA9IGNvbnZlcnRlcih0aW1lc3RhbXApXFxuICAgICAgICBzcyA9IG1pbihzcywgNTkpICAgICMgY2xhbXAgb3V0IGxlYXAgc2Vjb25kcyBpZiB0aGUgcGxhdGZvcm0gaGFzIHRoZW1cXG4gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbylcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBub3coY2xzLCB0ej1Ob25lKTpcXG4gICAgICAgIFxcXCJDb25zdHJ1Y3QgYSBkYXRldGltZSBmcm9tIHRpbWUudGltZSgpIGFuZCBvcHRpb25hbCB0aW1lIHpvbmUgaW5mby5cXFwiXFxuICAgICAgICB0ID0gX3RpbWUudGltZSgpXFxuICAgICAgICByZXR1cm4gY2xzLmZyb210aW1lc3RhbXAodCwgdHopXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgdXRjbm93KGNscyk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgVVRDIGRhdGV0aW1lIGZyb20gdGltZS50aW1lKCkuXFxcIlxcbiAgICAgICAgdCA9IF90aW1lLnRpbWUoKVxcbiAgICAgICAgcmV0dXJuIGNscy51dGNmcm9tdGltZXN0YW1wKHQpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgY29tYmluZShjbHMsIGRhdGUsIHRpbWUpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGV0aW1lIGZyb20gYSBnaXZlbiBkYXRlIGFuZCBhIGdpdmVuIHRpbWUuXFxcIlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0ZSwgX2RhdGVfY2xhc3MpOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiZGF0ZSBhcmd1bWVudCBtdXN0IGJlIGEgZGF0ZSBpbnN0YW5jZVxcXCIpXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0aW1lLCBfdGltZV9jbGFzcyk6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0aW1lIGFyZ3VtZW50IG11c3QgYmUgYSB0aW1lIGluc3RhbmNlXFxcIilcXG4gICAgICAgIHJldHVybiBjbHMoZGF0ZS55ZWFyLCBkYXRlLm1vbnRoLCBkYXRlLmRheSxcXG4gICAgICAgICAgICAgICAgICAgdGltZS5ob3VyLCB0aW1lLm1pbnV0ZSwgdGltZS5zZWNvbmQsIHRpbWUubWljcm9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgIHRpbWUudHppbmZvKVxcblxcbiAgICBkZWYgdGltZXR1cGxlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBsb2NhbCB0aW1lIHR1cGxlIGNvbXBhdGlibGUgd2l0aCB0aW1lLmxvY2FsdGltZSgpLlxcXCJcXG4gICAgICAgIGRzdCA9IHNlbGYuX2RzdCgpXFxuICAgICAgICBpZiBkc3QgaXMgTm9uZTpcXG4gICAgICAgICAgICBkc3QgPSAtMVxcbiAgICAgICAgZWxpZiBkc3Q6XFxuICAgICAgICAgICAgZHN0ID0gMVxcbiAgICAgICAgcmV0dXJuIF9idWlsZF9zdHJ1Y3RfdGltZShzZWxmLnllYXIsIHNlbGYubW9udGgsIHNlbGYuZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvdXIsIHNlbGYubWludXRlLCBzZWxmLnNlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0KVxcblxcbiAgICBkZWYgdXRjdGltZXR1cGxlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBVVEMgdGltZSB0dXBsZSBjb21wYXRpYmxlIHdpdGggdGltZS5nbXRpbWUoKS5cXFwiXFxuICAgICAgICB5LCBtLCBkID0gc2VsZi55ZWFyLCBzZWxmLm1vbnRoLCBzZWxmLmRheVxcbiAgICAgICAgaGgsIG1tLCBzcyA9IHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgb2Zmc2V0OiAgIyBuZWl0aGVyIE5vbmUgbm9yIDBcXG4gICAgICAgICAgICBtbSAtPSBvZmZzZXRcXG4gICAgICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCBfID0gX25vcm1hbGl6ZV9kYXRldGltZShcXG4gICAgICAgICAgICAgICAgeSwgbSwgZCwgaGgsIG1tLCBzcywgMCwgaWdub3JlX292ZXJmbG93PVRydWUpXFxuICAgICAgICByZXR1cm4gX2J1aWxkX3N0cnVjdF90aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIDApXFxuXFxuICAgIGRlZiBkYXRlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgZGF0ZSBwYXJ0LlxcXCJcXG4gICAgICAgIHJldHVybiBkYXRlKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXkpXFxuXFxuICAgIGRlZiB0aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgdGltZSBwYXJ0LCB3aXRoIHR6aW5mbyBOb25lLlxcXCJcXG4gICAgICAgIHJldHVybiB0aW1lKHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKVxcblxcbiAgICBkZWYgdGltZXR6KHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgdGltZSBwYXJ0LCB3aXRoIHNhbWUgdHppbmZvLlxcXCJcXG4gICAgICAgIHJldHVybiB0aW1lKHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHppbmZvKVxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCB5ZWFyPU5vbmUsIG1vbnRoPU5vbmUsIGRheT1Ob25lLCBob3VyPU5vbmUsXFxuICAgICAgICAgICAgICAgIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSwgdHppbmZvPVRydWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgbmV3IGRhdGV0aW1lIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB5ZWFyIGlzIE5vbmU6XFxuICAgICAgICAgICAgeWVhciA9IHNlbGYueWVhclxcbiAgICAgICAgaWYgbW9udGggaXMgTm9uZTpcXG4gICAgICAgICAgICBtb250aCA9IHNlbGYubW9udGhcXG4gICAgICAgIGlmIGRheSBpcyBOb25lOlxcbiAgICAgICAgICAgIGRheSA9IHNlbGYuZGF5XFxuICAgICAgICBpZiBob3VyIGlzIE5vbmU6XFxuICAgICAgICAgICAgaG91ciA9IHNlbGYuaG91clxcbiAgICAgICAgaWYgbWludXRlIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWludXRlID0gc2VsZi5taW51dGVcXG4gICAgICAgIGlmIHNlY29uZCBpcyBOb25lOlxcbiAgICAgICAgICAgIHNlY29uZCA9IHNlbGYuc2Vjb25kXFxuICAgICAgICBpZiBtaWNyb3NlY29uZCBpcyBOb25lOlxcbiAgICAgICAgICAgIG1pY3Jvc2Vjb25kID0gc2VsZi5taWNyb3NlY29uZFxcbiAgICAgICAgaWYgdHppbmZvIGlzIFRydWU6XFxuICAgICAgICAgICAgdHppbmZvID0gc2VsZi50emluZm9cXG4gICAgICAgIHJldHVybiBkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKVxcblxcbiAgICBkZWYgYXN0aW1lem9uZShzZWxmLCB0eik6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0eiwgdHppbmZvKTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcInR6IGFyZ3VtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgdHppbmZvXFxcIilcXG5cXG4gICAgICAgIG15dHogPSBzZWxmLnR6aW5mb1xcbiAgICAgICAgaWYgbXl0eiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImFzdGltZXpvbmUoKSByZXF1aXJlcyBhbiBhd2FyZSBkYXRldGltZVxcXCIpXFxuXFxuICAgICAgICBpZiB0eiBpcyBteXR6OlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICAgICAjIENvbnZlcnQgc2VsZiB0byBVVEMsIGFuZCBhdHRhY2ggdGhlIG5ldyB0aW1lIHpvbmUgb2JqZWN0LlxcbiAgICAgICAgbXlvZmZzZXQgPSBzZWxmLnV0Y29mZnNldCgpXFxuICAgICAgICBpZiBteW9mZnNldCBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImFzdGltZXpvbmUoKSByZXF1aXJlcyBhbiBhd2FyZSBkYXRldGltZVxcXCIpXFxuICAgICAgICB1dGMgPSAoc2VsZiAtIG15b2Zmc2V0KS5yZXBsYWNlKHR6aW5mbz10eilcXG5cXG4gICAgICAgICMgQ29udmVydCBmcm9tIFVUQyB0byB0eidzIGxvY2FsIHRpbWUuXFxuICAgICAgICByZXR1cm4gdHouZnJvbXV0Yyh1dGMpXFxuXFxuICAgICMgV2F5cyB0byBwcm9kdWNlIGEgc3RyaW5nLlxcblxcbiAgICBkZWYgY3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLlxcXCJcXG4gICAgICAgIHdlZWtkYXkgPSBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuICAgICAgICByZXR1cm4gXFxcIiVzICVzICUyZCAlMDJkOiUwMmQ6JTAyZCAlMDRkXFxcIiAlIChcXG4gICAgICAgICAgICBfREFZTkFNRVNbd2Vla2RheV0sXFxuICAgICAgICAgICAgX01PTlRITkFNRVNbc2VsZi5fbW9udGhdLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSxcXG4gICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICBzZWxmLl95ZWFyKVxcblxcbiAgICBkZWYgaXNvZm9ybWF0KHNlbGYsIHNlcD0nVCcpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gSVNPLlxcblxcbiAgICAgICAgVGhpcyBpcyAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0nLCBvciAnWVlZWS1NTS1ERCBISDpNTTpTUycgaWZcXG4gICAgICAgIHNlbGYubWljcm9zZWNvbmQgPT0gMC5cXG5cXG4gICAgICAgIElmIHNlbGYudHppbmZvIGlzIG5vdCBOb25lLCB0aGUgVVRDIG9mZnNldCBpcyBhbHNvIGF0dGFjaGVkLCBnaXZpbmdcXG4gICAgICAgICdZWVlZLU1NLUREIEhIOk1NOlNTLm1tbW1tbStISDpNTScgb3IgJ1lZWVktTU0tREQgSEg6TU06U1MrSEg6TU0nLlxcblxcbiAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQgc2VwIHNwZWNpZmllcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gZGF0ZSBhbmRcXG4gICAgICAgIHRpbWUsIGRlZmF1bHQgJ1QnLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBzID0gKFxcXCIlMDRkLSUwMmQtJTAyZCVjXFxcIiAlIChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LCBzZXApICtcXG4gICAgICAgICAgICAgX2Zvcm1hdF90aW1lKHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpKVxcbiAgICAgICAgb2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG9mZiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBpZiBvZmYgPCAwOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIi1cXFwiXFxuICAgICAgICAgICAgICAgIG9mZiA9IC1vZmZcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIitcXFwiXFxuICAgICAgICAgICAgaGgsIG1tID0gZGl2bW9kKG9mZiwgNjApXFxuICAgICAgICAgICAgcyArPSBcXFwiJXMlMDJkOiUwMmRcXFwiICUgKHNpZ24sIGhoLCBtbSlcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBfX3JlcHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnZlcnQgdG8gZm9ybWFsIHN0cmluZywgZm9yIHJlcHIoKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIEwgPSBbc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSwgICMgVGhlc2UgYXJlIG5ldmVyIHplcm9cXG4gICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsIHNlbGYuX21pY3Jvc2Vjb25kXVxcbiAgICAgICAgaWYgTFstMV0gPT0gMDpcXG4gICAgICAgICAgICBkZWwgTFstMV1cXG4gICAgICAgIGlmIExbLTFdID09IDA6XFxuICAgICAgICAgICAgZGVsIExbLTFdXFxuICAgICAgICBzID0gXFxcIiwgXFxcIi5qb2luKG1hcChzdHIsIEwpKVxcbiAgICAgICAgbW9kdWxlID0gXFxcImRhdGV0aW1lLlxcXCIgaWYgc2VsZi5fX2NsYXNzX18gaXMgZGF0ZXRpbWUgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgcyA9IFxcXCIlcyglcylcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzKVxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGFzc2VydCBzWy0xOl0gPT0gXFxcIilcXFwiXFxuICAgICAgICAgICAgcyA9IHNbOi0xXSArIFxcXCIsIHR6aW5mbz0lclxcXCIgJSBzZWxmLl90emluZm8gKyBcXFwiKVxcXCJcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIkNvbnZlcnQgdG8gc3RyaW5nLCBmb3Igc3RyKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXNvZm9ybWF0KHNlcD0nICcpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgc3RycHRpbWUoY2xzLCBkYXRlX3N0cmluZywgZm9ybWF0KTpcXG4gICAgICAgICdzdHJpbmcsIGZvcm1hdCAtPiBuZXcgZGF0ZXRpbWUgcGFyc2VkIGZyb20gYSBzdHJpbmcgKGxpa2UgdGltZS5zdHJwdGltZSgpKS4nXFxuICAgICAgICBmcm9tIF9zdHJwdGltZSBpbXBvcnQgX3N0cnB0aW1lXFxuICAgICAgICAjIF9zdHJwdGltZS5fc3RycHRpbWUgcmV0dXJucyBhIHR3by1lbGVtZW50IHR1cGxlLiAgVGhlIGZpcnN0XFxuICAgICAgICAjIGVsZW1lbnQgaXMgYSB0aW1lLnN0cnVjdF90aW1lIG9iamVjdC4gIFRoZSBzZWNvbmQgaXMgdGhlXFxuICAgICAgICAjIG1pY3Jvc2Vjb25kcyAod2hpY2ggYXJlIG5vdCBkZWZpbmVkIGZvciB0aW1lLnN0cnVjdF90aW1lKS5cXG4gICAgICAgIHN0cnVjdCwgbWljcm9zID0gX3N0cnB0aW1lKGRhdGVfc3RyaW5nLCBmb3JtYXQpXFxuICAgICAgICByZXR1cm4gY2xzKCooc3RydWN0WzA6Nl0gKyAobWljcm9zLCkpKVxcblxcbiAgICBkZWYgdXRjb2Zmc2V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgd2VzdCBvZlxcbiAgICAgICAgVVRDKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YS5fY3JlYXRlKDAsIG9mZnNldCAqIDYwLCAwLCBUcnVlKVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIFJldHVybiBhbiBpbnRlZ2VyIChvciBOb25lKSBpbnN0ZWFkIG9mIGEgdGltZWRlbHRhIChvciBOb25lKS5cXG4gICAgZGVmIF91dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLnV0Y29mZnNldChzZWxmKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcInV0Y29mZnNldFxcXCIsIG9mZnNldClcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgZGVmIHR6bmFtZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZXpvbmUgbmFtZS5cXG5cXG4gICAgICAgIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyAxMDAlIGluZm9ybWF0aW9uYWwgLS0gdGhlcmUncyBubyByZXF1aXJlbWVudCB0aGF0XFxuICAgICAgICBpdCBtZWFuIGFueXRoaW5nIGluIHBhcnRpY3VsYXIuIEZvciBleGFtcGxlLCBcXFwiR01UXFxcIiwgXFxcIlVUQ1xcXCIsIFxcXCItNTAwXFxcIixcXG4gICAgICAgIFxcXCItNTowMFxcXCIsIFxcXCJFRFRcXFwiLCBcXFwiVVMvRWFzdGVyblxcXCIsIFxcXCJBbWVyaWNhL05ldyBZb3JrXFxcIiBhcmUgYWxsIHZhbGlkIHJlcGxpZXMuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBuYW1lID0gc2VsZi5fdHppbmZvLnR6bmFtZShzZWxmKVxcbiAgICAgICAgX2NoZWNrX3R6bmFtZShuYW1lKVxcbiAgICAgICAgcmV0dXJuIG5hbWVcXG5cXG4gICAgZGVmIGRzdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiAwIGlmIERTVCBpcyBub3QgaW4gZWZmZWN0LCBvciB0aGUgRFNUIG9mZnNldCAoaW4gbWludXRlc1xcbiAgICAgICAgZWFzdHdhcmQpIGlmIERTVCBpcyBpbiBlZmZlY3QuXFxuXFxuICAgICAgICBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsOyB0aGUgRFNUIG9mZnNldCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvXFxuICAgICAgICB0aGUgVVRDIG9mZnNldCByZXR1cm5lZCBieSB1dGNvZmZzZXQoKSBpZiBhcHBsaWNhYmxlLCBzbyB0aGVyZSdzIG5vXFxuICAgICAgICBuZWVkIHRvIGNvbnN1bHQgZHN0KCkgdW5sZXNzIHlvdSdyZSBpbnRlcmVzdGVkIGluIGRpc3BsYXlpbmcgdGhlIERTVFxcbiAgICAgICAgaW5mby5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3Qoc2VsZilcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX2RzdChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8uZHN0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwiZHN0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIGRhdGV0aW1lIG9iamVjdHMgd2l0aCBvdGhlci5cXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPT0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpICE9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuXFxuICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPCAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID49IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfY21wKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSlcXG4gICAgICAgIG15dHogPSBzZWxmLl90emluZm9cXG4gICAgICAgIG90dHogPSBvdGhlci5fdHppbmZvXFxuICAgICAgICBteW9mZiA9IG90b2ZmID0gTm9uZVxcblxcbiAgICAgICAgaWYgbXl0eiBpcyBvdHR6OlxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgbXl0eiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgbXlvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGlmIG90dHogaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgIG90b2ZmID0gb3RoZXIuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgYmFzZV9jb21wYXJlID0gbXlvZmYgPT0gb3RvZmZcXG5cXG4gICAgICAgIGlmIGJhc2VfY29tcGFyZTpcXG4gICAgICAgICAgICByZXR1cm4gX2NtcCgoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIuX3llYXIsIG90aGVyLl9tb250aCwgb3RoZXIuX2RheSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuX2hvdXIsIG90aGVyLl9taW51dGUsIG90aGVyLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLl9taWNyb3NlY29uZCkpXFxuICAgICAgICBpZiBteW9mZiBpcyBOb25lIG9yIG90b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBjb21wYXJlIG9mZnNldC1uYWl2ZSBhbmQgb2Zmc2V0LWF3YXJlIGRhdGV0aW1lc1xcXCIpXFxuICAgICAgICAjIFhYWCBXaGF0IGZvbGxvd3MgY291bGQgYmUgZG9uZSBtb3JlIGVmZmljaWVudGx5Li4uXFxuICAgICAgICBkaWZmID0gc2VsZiAtIG90aGVyICAgICAjIHRoaXMgd2lsbCB0YWtlIG9mZnNldHMgaW50byBhY2NvdW50XFxuICAgICAgICBpZiBkaWZmLmRheXMgPCAwOlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgcmV0dXJuIGRpZmYgYW5kIDEgb3IgMFxcblxcbiAgICBkZWYgX2FkZF90aW1lZGVsdGEoc2VsZiwgb3RoZXIsIGZhY3Rvcik6XFxuICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cyA9IF9ub3JtYWxpemVfZGF0ZXRpbWUoXFxuICAgICAgICAgICAgc2VsZi5feWVhcixcXG4gICAgICAgICAgICBzZWxmLl9tb250aCxcXG4gICAgICAgICAgICBzZWxmLl9kYXkgKyBvdGhlci5kYXlzICogZmFjdG9yLFxcbiAgICAgICAgICAgIHNlbGYuX2hvdXIsXFxuICAgICAgICAgICAgc2VsZi5fbWludXRlLFxcbiAgICAgICAgICAgIHNlbGYuX3NlY29uZCArIG90aGVyLnNlY29uZHMgKiBmYWN0b3IsXFxuICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgKyBvdGhlci5taWNyb3NlY29uZHMgKiBmYWN0b3IpXFxuICAgICAgICByZXR1cm4gZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbz1zZWxmLl90emluZm8pXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJBZGQgYSBkYXRldGltZSBhbmQgYSB0aW1lZGVsdGEuXFxcIlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICByZXR1cm4gc2VsZi5fYWRkX3RpbWVkZWx0YShvdGhlciwgMSlcXG5cXG4gICAgX19yYWRkX18gPSBfX2FkZF9fXFxuXFxuICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJTdWJ0cmFjdCB0d28gZGF0ZXRpbWVzLCBvciBhIGRhdGV0aW1lIGFuZCBhIHRpbWVkZWx0YS5cXFwiXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAtMSlcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgICAgIGRlbHRhX2QgPSBzZWxmLnRvb3JkaW5hbCgpIC0gb3RoZXIudG9vcmRpbmFsKClcXG4gICAgICAgIGRlbHRhX3MgPSAoc2VsZi5faG91ciAtIG90aGVyLl9ob3VyKSAqIDM2MDAgKyBcXFxcXFxuICAgICAgICAgICAgICAgICAgKHNlbGYuX21pbnV0ZSAtIG90aGVyLl9taW51dGUpICogNjAgKyBcXFxcXFxuICAgICAgICAgICAgICAgICAgKHNlbGYuX3NlY29uZCAtIG90aGVyLl9zZWNvbmQpXFxuICAgICAgICBkZWx0YV91cyA9IHNlbGYuX21pY3Jvc2Vjb25kIC0gb3RoZXIuX21pY3Jvc2Vjb25kXFxuICAgICAgICBiYXNlID0gdGltZWRlbHRhLl9jcmVhdGUoZGVsdGFfZCwgZGVsdGFfcywgZGVsdGFfdXMsIFRydWUpXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgb3RoZXIuX3R6aW5mbzpcXG4gICAgICAgICAgICByZXR1cm4gYmFzZVxcbiAgICAgICAgbXlvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgb3RvZmYgPSBvdGhlci5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG15b2ZmID09IG90b2ZmOlxcbiAgICAgICAgICAgIHJldHVybiBiYXNlXFxuICAgICAgICBpZiBteW9mZiBpcyBOb25lIG9yIG90b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBzdWJ0cmFjdCBvZmZzZXQtbmFpdmUgYW5kIG9mZnNldC1hd2FyZSBkYXRldGltZXNcXFwiKVxcbiAgICAgICAgcmV0dXJuIGJhc2UgKyB0aW1lZGVsdGEobWludXRlcyA9IG90b2ZmLW15b2ZmKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICB0em9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgaWYgdHpvZmYgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKHNlbGYuX2dldHN0YXRlKClbMF0pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgZGF5cyA9IF95bWQyb3JkKHNlbGYueWVhciwgc2VsZi5tb250aCwgc2VsZi5kYXkpXFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPSBzZWxmLmhvdXIgKiAzNjAwICsgKHNlbGYubWludXRlIC0gdHpvZmYpICogNjAgKyBzZWxmLnNlY29uZFxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2godGltZWRlbHRhKGRheXMsIHNlY29uZHMsIHNlbGYubWljcm9zZWNvbmQpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuXFxuXFxuZGF0ZXRpbWUubWluID0gZGF0ZXRpbWUoMSwgMSwgMSlcXG5kYXRldGltZS5tYXggPSBkYXRldGltZSg5OTk5LCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTk5OSlcXG5kYXRldGltZS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKVxcblxcblxcbmRlZiBfaXNvd2VlazFtb25kYXkoeWVhcik6XFxuICAgICMgSGVscGVyIHRvIGNhbGN1bGF0ZSB0aGUgZGF5IG51bWJlciBvZiB0aGUgTW9uZGF5IHN0YXJ0aW5nIHdlZWsgMVxcbiAgICAjIFhYWCBUaGlzIGNvdWxkIGJlIGRvbmUgbW9yZSBlZmZpY2llbnRseVxcbiAgICBUSFVSU0RBWSA9IDNcXG4gICAgZmlyc3RkYXkgPSBfeW1kMm9yZCh5ZWFyLCAxLCAxKVxcbiAgICBmaXJzdHdlZWtkYXkgPSAoZmlyc3RkYXkgKyA2KSAlIDcgICMgU2VlIHdlZWtkYXkoKSBhYm92ZVxcbiAgICB3ZWVrMW1vbmRheSA9IGZpcnN0ZGF5IC0gZmlyc3R3ZWVrZGF5XFxuICAgIGlmIGZpcnN0d2Vla2RheSA+IFRIVVJTREFZOlxcbiAgICAgICAgd2VlazFtb25kYXkgKz0gN1xcbiAgICByZXR1cm4gd2VlazFtb25kYXlcXG5cXG5cXFwiXFxcIlxcXCJcXG5Tb21lIHRpbWUgem9uZSBhbGdlYnJhLiAgRm9yIGEgZGF0ZXRpbWUgeCwgbGV0XFxuICAgIHgubiA9IHggc3RyaXBwZWQgb2YgaXRzIHRpbWV6b25lIC0tIGl0cyBuYWl2ZSB0aW1lLlxcbiAgICB4Lm8gPSB4LnV0Y29mZnNldCgpLCBhbmQgYXNzdW1pbmcgdGhhdCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvclxcbiAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICB4LmQgPSB4LmRzdCgpLCBhbmQgYXNzdW1pbmcgdGhhdCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvclxcbiAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICB4LnMgPSB4J3Mgc3RhbmRhcmQgb2Zmc2V0LCB4Lm8gLSB4LmRcXG5cXG5Ob3cgc29tZSBkZXJpdmVkIHJ1bGVzLCB3aGVyZSBrIGlzIGEgZHVyYXRpb24gKHRpbWVkZWx0YSkuXFxuXFxuMS4geC5vID0geC5zICsgeC5kXFxuICAgVGhpcyBmb2xsb3dzIGZyb20gdGhlIGRlZmluaXRpb24gb2YgeC5zLlxcblxcbjIuIElmIHggYW5kIHkgaGF2ZSB0aGUgc2FtZSB0emluZm8gbWVtYmVyLCB4LnMgPSB5LnMuXFxuICAgVGhpcyBpcyBhY3R1YWxseSBhIHJlcXVpcmVtZW50LCBhbiBhc3N1bXB0aW9uIHdlIG5lZWQgdG8gbWFrZSBhYm91dFxcbiAgIHNhbmUgdHppbmZvIGNsYXNzZXMuXFxuXFxuMy4gVGhlIG5haXZlIFVUQyB0aW1lIGNvcnJlc3BvbmRpbmcgdG8geCBpcyB4Lm4gLSB4Lm8uXFxuICAgVGhpcyBpcyBhZ2FpbiBhIHJlcXVpcmVtZW50IGZvciBhIHNhbmUgdHppbmZvIGNsYXNzLlxcblxcbjQuICh4K2spLnMgPSB4LnNcXG4gICBUaGlzIGZvbGxvd3MgZnJvbSAjMiwgYW5kIHRoYXQgZGF0aW1ldGltZXR6K3RpbWVkZWx0YSBwcmVzZXJ2ZXMgdHppbmZvLlxcblxcbjUuICh4K2spLm4gPSB4Lm4gKyBrXFxuICAgQWdhaW4gZm9sbG93cyBmcm9tIGhvdyBhcml0aG1ldGljIGlzIGRlZmluZWQuXFxuXFxuTm93IHdlIGNhbiBleHBsYWluIHR6LmZyb211dGMoeCkuICBMZXQncyBhc3N1bWUgaXQncyBhbiBpbnRlcmVzdGluZyBjYXNlXFxuKG1lYW5pbmcgdGhhdCB0aGUgdmFyaW91cyB0emluZm8gbWV0aG9kcyBleGlzdCwgYW5kIGRvbid0IGJsb3cgdXAgb3IgcmV0dXJuXFxuTm9uZSB3aGVuIGNhbGxlZCkuXFxuXFxuVGhlIGZ1bmN0aW9uIHdhbnRzIHRvIHJldHVybiBhIGRhdGV0aW1lIHkgd2l0aCB0aW1lem9uZSB0eiwgZXF1aXZhbGVudCB0byB4LlxcbnggaXMgYWxyZWFkeSBpbiBVVEMuXFxuXFxuQnkgIzMsIHdlIHdhbnRcXG5cXG4gICAgeS5uIC0geS5vID0geC5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV1cXG5cXG5UaGUgYWxnb3JpdGhtIHN0YXJ0cyBieSBhdHRhY2hpbmcgdHogdG8geC5uLCBhbmQgY2FsbGluZyB0aGF0IHkuICBTb1xcbngubiA9IHkubiBhdCB0aGUgc3RhcnQuICBUaGVuIGl0IHdhbnRzIHRvIGFkZCBhIGR1cmF0aW9uIGsgdG8geSwgc28gdGhhdCBbMV1cXG5iZWNvbWVzIHRydWU7IGluIGVmZmVjdCwgd2Ugd2FudCB0byBzb2x2ZSBbMl0gZm9yIGs6XFxuXFxuICAgKHkraykubiAtICh5K2spLm8gPSB4Lm4gICAgICAgICAgICAgICAgICAgICAgWzJdXFxuXFxuQnkgIzEsIHRoaXMgaXMgdGhlIHNhbWUgYXNcXG5cXG4gICAoeStrKS5uIC0gKCh5K2spLnMgKyAoeStrKS5kKSA9IHgubiAgICAgICAgICBbM11cXG5cXG5CeSAjNSwgKHkraykubiA9IHkubiArIGssIHdoaWNoIGVxdWFscyB4Lm4gKyBrIGJlY2F1c2UgeC5uPXkubiBhdCB0aGUgc3RhcnQuXFxuU3Vic3RpdHV0aW5nIHRoYXQgaW50byBbM10sXFxuXFxuICAgeC5uICsgayAtICh5K2spLnMgLSAoeStrKS5kID0geC5uOyB0aGUgeC5uIHRlcm1zIGNhbmNlbCwgbGVhdmluZ1xcbiAgIGsgLSAoeStrKS5zIC0gKHkraykuZCA9IDA7IHJlYXJyYW5naW5nLFxcbiAgIGsgPSAoeStrKS5zIC0gKHkraykuZDsgYnkgIzQsICh5K2spLnMgPT0geS5zLCBzb1xcbiAgIGsgPSB5LnMgLSAoeStrKS5kXFxuXFxuT24gdGhlIFJIUywgKHkraykuZCBjYW4ndCBiZSBjb21wdXRlZCBkaXJlY3RseSwgYnV0IHkucyBjYW4gYmUsIGFuZCB3ZVxcbmFwcHJveGltYXRlIGsgYnkgaWdub3JpbmcgdGhlICh5K2spLmQgdGVybSBhdCBmaXJzdC4gIE5vdGUgdGhhdCBrIGNhbid0IGJlXFxudmVyeSBsYXJnZSwgc2luY2UgYWxsIG9mZnNldC1yZXR1cm5pbmcgbWV0aG9kcyByZXR1cm4gYSBkdXJhdGlvbiBvZiBtYWduaXR1ZGVcXG5sZXNzIHRoYW4gMjQgaG91cnMuICBGb3IgdGhhdCByZWFzb24sIGlmIHkgaXMgZmlybWx5IGluIHN0ZCB0aW1lLCAoeStrKS5kIG11c3RcXG5iZSAwLCBzbyBpZ25vcmluZyBpdCBoYXMgbm8gY29uc2VxdWVuY2UgdGhlbi5cXG5cXG5JbiBhbnkgY2FzZSwgdGhlIG5ldyB2YWx1ZSBpc1xcblxcbiAgICB6ID0geSArIHkucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0XVxcblxcbkl0J3MgaGVscGZ1bCB0byBzdGVwIGJhY2sgYXQgbG9vayBhdCBbNF0gZnJvbSBhIGhpZ2hlciBsZXZlbDogIGl0J3Mgc2ltcGx5XFxubWFwcGluZyBmcm9tIFVUQyB0byB0eidzIHN0YW5kYXJkIHRpbWUuXFxuXFxuQXQgdGhpcyBwb2ludCwgaWZcXG5cXG4gICAgei5uIC0gei5vID0geC5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNV1cXG5cXG53ZSBoYXZlIGFuIGVxdWl2YWxlbnQgdGltZSwgYW5kIGFyZSBhbG1vc3QgZG9uZS4gIFRoZSBpbnNlY3VyaXR5IGhlcmUgaXNcXG5hdCB0aGUgc3RhcnQgb2YgZGF5bGlnaHQgdGltZS4gIFBpY3R1cmUgVVMgRWFzdGVybiBmb3IgY29uY3JldGVuZXNzLiAgVGhlIHdhbGxcXG50aW1lIGp1bXBzIGZyb20gMTo1OSB0byAzOjAwLCBhbmQgd2FsbCBob3VycyBvZiB0aGUgZm9ybSAyOk1NIGRvbid0IG1ha2UgZ29vZFxcbnNlbnNlIHRoZW4uICBUaGUgZG9jcyBhc2sgdGhhdCBhbiBFYXN0ZXJuIHR6aW5mbyBjbGFzcyBjb25zaWRlciBzdWNoIGEgdGltZSB0b1xcbmJlIEVEVCAoYmVjYXVzZSBpdCdzIFxcXCJhZnRlciAyXFxcIiksIHdoaWNoIGlzIGEgcmVkdW5kYW50IHNwZWxsaW5nIG9mIDE6TU0gRVNUXFxub24gdGhlIGRheSBEU1Qgc3RhcnRzLiAgV2Ugd2FudCB0byByZXR1cm4gdGhlIDE6TU0gRVNUIHNwZWxsaW5nIGJlY2F1c2UgdGhhdCdzXFxudGhlIG9ubHkgc3BlbGxpbmcgdGhhdCBtYWtlcyBzZW5zZSBvbiB0aGUgbG9jYWwgd2FsbCBjbG9jay5cXG5cXG5JbiBmYWN0LCBpZiBbNV0gaG9sZHMgYXQgdGhpcyBwb2ludCwgd2UgZG8gaGF2ZSB0aGUgc3RhbmRhcmQtdGltZSBzcGVsbGluZyxcXG5idXQgdGhhdCB0YWtlcyBhIGJpdCBvZiBwcm9vZi4gIFdlIGZpcnN0IHByb3ZlIGEgc3Ryb25nZXIgcmVzdWx0LiAgV2hhdCdzIHRoZVxcbmRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgTEhTIGFuZCBSSFMgb2YgWzVdPyAgTGV0XFxuXFxuICAgIGRpZmYgPSB4Lm4gLSAoei5uIC0gei5vKSAgICAgICAgICAgICAgICAgICAgWzZdXFxuXFxuTm93XFxuICAgIHoubiA9ICAgICAgICAgICAgICAgICAgICAgICBieSBbNF1cXG4gICAgKHkgKyB5LnMpLm4gPSAgICAgICAgICAgICAgIGJ5ICM1XFxuICAgIHkubiArIHkucyA9ICAgICAgICAgICAgICAgICBzaW5jZSB5Lm4gPSB4Lm5cXG4gICAgeC5uICsgeS5zID0gICAgICAgICAgICAgICAgIHNpbmNlIHogYW5kIHkgYXJlIGhhdmUgdGhlIHNhbWUgdHppbmZvIG1lbWJlcixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LnMgPSB6LnMgYnkgIzJcXG4gICAgeC5uICsgei5zXFxuXFxuUGx1Z2dpbmcgdGhhdCBiYWNrIGludG8gWzZdIGdpdmVzXFxuXFxuICAgIGRpZmYgPVxcbiAgICB4Lm4gLSAoKHgubiArIHoucykgLSB6Lm8pID0gICAgIGV4cGFuZGluZ1xcbiAgICB4Lm4gLSB4Lm4gLSB6LnMgKyB6Lm8gPSAgICAgICAgIGNhbmNlbGxpbmdcXG4gICAgLSB6LnMgKyB6Lm8gPSAgICAgICAgICAgICAgICAgICBieSAjMlxcbiAgICB6LmRcXG5cXG5TbyBkaWZmID0gei5kLlxcblxcbklmIFs1XSBpcyB0cnVlIG5vdywgZGlmZiA9IDAsIHNvIHouZCA9IDAgdG9vLCBhbmQgd2UgaGF2ZSB0aGUgc3RhbmRhcmQtdGltZVxcbnNwZWxsaW5nIHdlIHdhbnRlZCBpbiB0aGUgZW5kY2FzZSBkZXNjcmliZWQgYWJvdmUuICBXZSdyZSBkb25lLiAgQ29udHJhcmlseSxcXG5pZiB6LmQgPSAwLCB0aGVuIHdlIGhhdmUgYSBVVEMgZXF1aXZhbGVudCwgYW5kIGFyZSBhbHNvIGRvbmUuXFxuXFxuSWYgWzVdIGlzIG5vdCB0cnVlIG5vdywgZGlmZiA9IHouZCAhPSAwLCBhbmQgei5kIGlzIHRoZSBvZmZzZXQgd2UgbmVlZCB0b1xcbmFkZCB0byB6IChpbiBlZmZlY3QsIHogaXMgaW4gdHoncyBzdGFuZGFyZCB0aW1lLCBhbmQgd2UgbmVlZCB0byBzaGlmdCB0aGVcXG5sb2NhbCBjbG9jayBpbnRvIHR6J3MgZGF5bGlnaHQgdGltZSkuXFxuXFxuTGV0XFxuXFxuICAgIHonID0geiArIHouZCA9IHogKyBkaWZmICAgICAgICAgICAgICAgICAgICAgWzddXFxuXFxuYW5kIHdlIGNhbiBhZ2FpbiBhc2sgd2hldGhlclxcblxcbiAgICB6Jy5uIC0geicubyA9IHgubiAgICAgICAgICAgICAgICAgICAgICAgICAgIFs4XVxcblxcbklmIHNvLCB3ZSdyZSBkb25lLiAgSWYgbm90LCB0aGUgdHppbmZvIGNsYXNzIGlzIGluc2FuZSwgYWNjb3JkaW5nIHRvIHRoZVxcbmFzc3VtcHRpb25zIHdlJ3ZlIG1hZGUuICBUaGlzIGFsc28gcmVxdWlyZXMgYSBiaXQgb2YgcHJvb2YuICBBcyBiZWZvcmUsIGxldCdzXFxuY29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBMSFMgYW5kIFJIUyBvZiBbOF0gKGFuZCBza2lwcGluZyBzb21lIG9mXFxudGhlIGp1c3RpZmljYXRpb25zIGZvciB0aGUga2luZHMgb2Ygc3Vic3RpdHV0aW9ucyB3ZSd2ZSBkb25lIHNldmVyYWwgdGltZXNcXG5hbHJlYWR5KTpcXG5cXG4gICAgZGlmZicgPSB4Lm4gLSAoeicubiAtIHonLm8pID0gICAgICAgICAgIHJlcGxhY2luZyB6Jy5uIHZpYSBbN11cXG4gICAgICAgICAgICB4Lm4gIC0gKHoubiArIGRpZmYgLSB6Jy5vKSA9ICAgIHJlcGxhY2luZyBkaWZmIHZpYSBbNl1cXG4gICAgICAgICAgICB4Lm4gLSAoei5uICsgeC5uIC0gKHoubiAtIHoubykgLSB6Jy5vKSA9XFxuICAgICAgICAgICAgeC5uIC0gei5uIC0geC5uICsgei5uIC0gei5vICsgeicubyA9ICAgIGNhbmNlbCB4Lm5cXG4gICAgICAgICAgICAtIHoubiArIHoubiAtIHoubyArIHonLm8gPSAgICAgICAgICAgICAgY2FuY2VsIHoublxcbiAgICAgICAgICAgIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICAgICAgICAgICMxIHR3aWNlXFxuICAgICAgICAgICAgLXoucyAtIHouZCArIHonLnMgKyB6Jy5kID0gICAgICAgICAgeiBhbmQgeicgaGF2ZSBzYW1lIHR6aW5mb1xcbiAgICAgICAgICAgIHonLmQgLSB6LmRcXG5cXG5TbyB6JyBpcyBVVEMtZXF1aXZhbGVudCB0byB4IGlmZiB6Jy5kID0gei5kIGF0IHRoaXMgcG9pbnQuICBJZiB0aGV5IGFyZSBlcXVhbCxcXG53ZSd2ZSBmb3VuZCB0aGUgVVRDLWVxdWl2YWxlbnQgc28gYXJlIGRvbmUuICBJbiBmYWN0LCB3ZSBzdG9wIHdpdGggWzddIGFuZFxcbnJldHVybiB6Jywgbm90IGJvdGhlcmluZyB0byBjb21wdXRlIHonLmQuXFxuXFxuSG93IGNvdWxkIHouZCBhbmQgeidkIGRpZmZlcj8gIHonID0geiArIHouZCBbN10sIHNvIG1lcmVseSBtb3ZpbmcgeicgYnlcXG5hIGRzdCgpIG9mZnNldCwgYW5kIHN0YXJ0aW5nICpmcm9tKiBhIHRpbWUgYWxyZWFkeSBpbiBEU1QgKHdlIGtub3cgei5kICE9IDApLFxcbndvdWxkIGhhdmUgdG8gY2hhbmdlIHRoZSByZXN1bHQgZHN0KCkgcmV0dXJuczogIHdlIHN0YXJ0IGluIERTVCwgYW5kIG1vdmluZ1xcbmEgbGl0dGxlIGZ1cnRoZXIgaW50byBpdCB0YWtlcyB1cyBvdXQgb2YgRFNULlxcblxcblRoZXJlIGlzbid0IGEgc2FuZSBjYXNlIHdoZXJlIHRoaXMgY2FuIGhhcHBlbi4gIFRoZSBjbG9zZXN0IGl0IGdldHMgaXMgYXRcXG50aGUgZW5kIG9mIERTVCwgd2hlcmUgdGhlcmUncyBhbiBob3VyIGluIFVUQyB3aXRoIG5vIHNwZWxsaW5nIGluIGEgaHlicmlkXFxudHppbmZvIGNsYXNzLiAgSW4gVVMgRWFzdGVybiwgdGhhdCdzIDU6TU0gVVRDID0gMDpNTSBFU1QgPSAxOk1NIEVEVC4gIER1cmluZ1xcbnRoYXQgaG91ciwgb24gYW4gRWFzdGVybiBjbG9jayAxOk1NIGlzIHRha2VuIGFzIGJlaW5nIGluIHN0YW5kYXJkIHRpbWUgKDY6TU1cXG5VVEMpIGJlY2F1c2UgdGhlIGRvY3MgaW5zaXN0IG9uIHRoYXQsIGJ1dCAwOk1NIGlzIHRha2VuIGFzIGJlaW5nIGluIGRheWxpZ2h0XFxudGltZSAoNDpNTSBVVEMpLiAgVGhlcmUgaXMgbm8gbG9jYWwgdGltZSBtYXBwaW5nIHRvIDU6TU0gVVRDLiAgVGhlIGxvY2FsXFxuY2xvY2sganVtcHMgZnJvbSAxOjU5IGJhY2sgdG8gMTowMCBhZ2FpbiwgYW5kIHJlcGVhdHMgdGhlIDE6TU0gaG91ciBpblxcbnN0YW5kYXJkIHRpbWUuICBTaW5jZSB0aGF0J3Mgd2hhdCB0aGUgbG9jYWwgY2xvY2sgKmRvZXMqLCB3ZSB3YW50IHRvIG1hcCBib3RoXFxuVVRDIGhvdXJzIDU6TU0gYW5kIDY6TU0gdG8gMTpNTSBFYXN0ZXJuLiAgVGhlIHJlc3VsdCBpcyBhbWJpZ3VvdXNcXG5pbiBsb2NhbCB0aW1lLCBidXQgc28gaXQgZ29lcyAtLSBpdCdzIHRoZSB3YXkgdGhlIGxvY2FsIGNsb2NrIHdvcmtzLlxcblxcbldoZW4geCA9IDU6TU0gVVRDIGlzIHRoZSBpbnB1dCB0byB0aGlzIGFsZ29yaXRobSwgeC5vPTAsIHkubz0tNSBhbmQgeS5kPTAsXFxuc28gej0wOk1NLiAgei5kPTYwIChtaW51dGVzKSB0aGVuLCBzbyBbNV0gZG9lc24ndCBob2xkIGFuZCB3ZSBrZWVwIGdvaW5nLlxcbnonID0geiArIHouZCA9IDE6TU0gdGhlbiwgYW5kIHonLmQ9MCwgYW5kIHonLmQgLSB6LmQgPSAtNjAgIT0gMCBzbyBbOF1cXG4oY29ycmVjdGx5KSBjb25jbHVkZXMgdGhhdCB6JyBpcyBub3QgVVRDLWVxdWl2YWxlbnQgdG8geC5cXG5cXG5CZWNhdXNlIHdlIGtub3cgei5kIHNhaWQgeiB3YXMgaW4gZGF5bGlnaHQgdGltZSAoZWxzZSBbNV0gd291bGQgaGF2ZSBoZWxkIGFuZFxcbndlIHdvdWxkIGhhdmUgc3RvcHBlZCB0aGVuKSwgYW5kIHdlIGtub3cgei5kICE9IHonLmQgKGVsc2UgWzhdIHdvdWxkIGhhdmUgaGVsZFxcbmFuZCB3ZSBoYXZlIHN0b3BwZWQgdGhlbiksIGFuZCB0aGVyZSBhcmUgb25seSAyIHBvc3NpYmxlIHZhbHVlcyBkc3QoKSBjYW5cXG5yZXR1cm4gaW4gRWFzdGVybiwgaXQgZm9sbG93cyB0aGF0IHonLmQgbXVzdCBiZSAwICh3aGljaCBpdCBpcyBpbiB0aGUgZXhhbXBsZSxcXG5idXQgdGhlIHJlYXNvbmluZyBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgZXhhbXBsZSAtLSBpdCBkZXBlbmRzIG9uIHRoZXJlIGJlaW5nXFxudHdvIHBvc3NpYmxlIGRzdCgpIG91dGNvbWVzLCBvbmUgemVybyBhbmQgdGhlIG90aGVyIG5vbi16ZXJvKS4gIFRoZXJlZm9yZVxcbnonIG11c3QgYmUgaW4gc3RhbmRhcmQgdGltZSwgYW5kIGlzIHRoZSBzcGVsbGluZyB3ZSB3YW50IGluIHRoaXMgY2FzZS5cXG5cXG5Ob3RlIGFnYWluIHRoYXQgeicgaXMgbm90IFVUQy1lcXVpdmFsZW50IGFzIGZhciBhcyB0aGUgaHlicmlkIHR6aW5mbyBjbGFzcyBpc1xcbmNvbmNlcm5lZCAoYmVjYXVzZSBpdCB0YWtlcyB6JyBhcyBiZWluZyBpbiBzdGFuZGFyZCB0aW1lIHJhdGhlciB0aGFuIHRoZVxcbmRheWxpZ2h0IHRpbWUgd2UgaW50ZW5kIGhlcmUpLCBidXQgcmV0dXJuaW5nIGl0IGdpdmVzIHRoZSByZWFsLWxpZmUgXFxcImxvY2FsXFxuY2xvY2sgcmVwZWF0cyBhbiBob3VyXFxcIiBiZWhhdmlvciB3aGVuIG1hcHBpbmcgdGhlIFxcXCJ1bnNwZWxsYWJsZVxcXCIgVVRDIGhvdXIgaW50b1xcbnR6LlxcblxcbldoZW4gdGhlIGlucHV0IGlzIDY6TU0sIHo9MTpNTSBhbmQgei5kPTAsIGFuZCB3ZSBzdG9wIGF0IG9uY2UsIGFnYWluIHdpdGhcXG50aGUgMTpNTSBzdGFuZGFyZCB0aW1lIHNwZWxsaW5nIHdlIHdhbnQuXFxuXFxuU28gaG93IGNhbiB0aGlzIGJyZWFrPyAgT25lIG9mIHRoZSBhc3N1bXB0aW9ucyBtdXN0IGJlIHZpb2xhdGVkLiAgVHdvXFxucG9zc2liaWxpdGllczpcXG5cXG4xKSBbMl0gZWZmZWN0aXZlbHkgc2F5cyB0aGF0IHkucyBpcyBpbnZhcmlhbnQgYWNyb3NzIGFsbCB5IGJlbG9uZyB0byBhIGdpdmVuXFxuICAgdGltZSB6b25lLiAgVGhpcyBpc24ndCB0cnVlIGlmLCBmb3IgcG9saXRpY2FsIHJlYXNvbnMgb3IgY29udGluZW50YWwgZHJpZnQsXFxuICAgYSByZWdpb24gZGVjaWRlcyB0byBjaGFuZ2UgaXRzIGJhc2Ugb2Zmc2V0IGZyb20gVVRDLlxcblxcbjIpIFRoZXJlIG1heSBiZSB2ZXJzaW9ucyBvZiBcXFwiZG91YmxlIGRheWxpZ2h0XFxcIiB0aW1lIHdoZXJlIHRoZSB0YWlsIGVuZCBvZlxcbiAgIHRoZSBhbmFseXNpcyBnaXZlcyB1cCBhIHN0ZXAgdG9vIGVhcmx5LiAgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgdGhhdFxcbiAgIGVub3VnaCB0byBzYXkuXFxuXFxuSW4gYW55IGNhc2UsIGl0J3MgY2xlYXIgdGhhdCB0aGUgZGVmYXVsdCBmcm9tdXRjKCkgaXMgc3Ryb25nIGVub3VnaCB0byBoYW5kbGVcXG5cXFwiYWxtb3N0IGFsbFxcXCIgdGltZSB6b25lczogIHNvIGxvbmcgYXMgdGhlIHN0YW5kYXJkIG9mZnNldCBpcyBpbnZhcmlhbnQsIGl0XFxuZG9lc24ndCBtYXR0ZXIgaWYgZGF5bGlnaHQgdGltZSB0cmFuc2l0aW9uIHBvaW50cyBjaGFuZ2UgZnJvbSB5ZWFyIHRvIHllYXIsIG9yXFxuaWYgZGF5bGlnaHQgdGltZSBpcyBza2lwcGVkIGluIHNvbWUgeWVhcnM7IGl0IGRvZXNuJ3QgbWF0dGVyIGhvdyBsYXJnZSBvclxcbnNtYWxsIGRzdCgpIG1heSBnZXQgd2l0aGluIGl0cyBib3VuZHM7IGFuZCBpdCBkb2Vzbid0IGV2ZW4gbWF0dGVyIGlmIHNvbWVcXG5wZXJ2ZXJzZSB0aW1lIHpvbmUgcmV0dXJucyBhIG5lZ2F0aXZlIGRzdCgpKS4gIFNvIGEgYnJlYWtpbmcgY2FzZSBtdXN0IGJlXFxucHJldHR5IGJpemFycmUsIGFuZCBhIHR6aW5mbyBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgZnJvbXV0YygpIGlmIGl0IGlzLlxcblxcXCJcXFwiXFxcIlxcblwiLFwic3JjL2xpYi9kYmhhc2gucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRiaGFzaCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RlY2ltYWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRlY2ltYWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaWZmbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkaWZmbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlyY2FjaGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpcmNhY2hlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaXN0dXRpbHMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpc3R1dGlscyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Rpc3R1dGlscy9jb21tYW5kL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21tYW5kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZXN0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RvY3Rlc3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRvY3Rlc3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kb2N1bWVudC5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGEsYj17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJkb2N1bWVudFxcXCIpfTtyZXR1cm4gYi5nZXRFbGVtZW50QnlJZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEudik7cmV0dXJuIGM/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY10pOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIuY3JlYXRlRWxlbWVudD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYS52KTtpZihjKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjXSl9KSxiLmdldEVsZW1lbnRzQnlUYWdOYW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGEudiksZD1bXSxlPWMubGVuZ3RoLTE7MDw9ZTtlLS0pZC5wdXNoKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NbZV1dKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoZCl9KSxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5nZXRFbGVtZW50c0J5TmFtZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5xdWVyeVNlbGVjdG9yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhLnYpO3JldHVybiBjP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NdKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxiLnF1ZXJ5U2VsZWN0b3JBbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5nZXRDdXJyZW50RWRpdG9yVmFsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKHZvaWQgMCE9PVNrLmRpdmlkJiZ2b2lkIDAhPT13aW5kb3cuZWRMaXN0KXtpZihTay5ncmFkZUNvbnRhaW5lciE9U2suZGl2aWQpe3ZhciBhPVNrLmdyYWRlQ29udGFpbmVyK1xcXCIgXFxcIitTay5kaXZpZDtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHdpbmRvdy5lZExpc3RbYV0uZWRpdG9yLmdldFZhbHVlKCkpfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIod2luZG93LmVkTGlzdFtTay5kaXZpZF0uZWRpdG9yLmdldFZhbHVlKCkpfXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJDYW4ndCBmaW5kIGVkaXRvciBmb3IgdGhpcyBkaXZcXFwiKX0pLGIuY3VycmVudERpdj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09U2suZGl2aWQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5kaXZpZCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXFxcIlRoZXJlIGlzIG5vIHZhbHVlIHNldCBmb3IgZGl2aWRcXFwiKX0pLGIuY3VycmVudENvdXJzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09ZUJvb2tDb25maWcpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlQm9va0NvbmZpZy5jb3Vyc2UpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJUaGVyZSBpcyBubyBjb3Vyc2VcXFwiKX0pLGIuY3VycmVudEdyYWRpbmdDb250YWluZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKHZvaWQgMCE9PVNrLmdyYWRlQ29udGFpbmVyKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suZ3JhZGVDb250YWluZXIpO2lmKG51bGwhPVNrLmRpdmlkKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suZGl2aWQpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJUaGVyZSBpcyBubyB2YWx1ZSBzZXQgZm9yIGdyYWRpbmdcXFwiKX0pLGE9ZnVuY3Rpb24oYSxjKXtjLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9YixhLmlubmVySFRNTD1iLmlubmVySFRNTCxhLmlubmVyVGV4dD1iLmlubmVyVGV4dCx2b2lkIDAhPT1iLnZhbHVlJiYoYS52YWx1ZT1iLnZhbHVlLFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcInZhbHVlXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKGEudmFsdWUpKSksdm9pZCAwIT09Yi5jaGVja2VkJiYoYS5jaGVja2VkPWIuY2hlY2tlZCxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJjaGVja2VkXFxcIiksU2suYnVpbHRpbi5ib29sKGEuY2hlY2tlZCkpKSxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lckhUTUxcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYS5pbm5lckhUTUwpKSxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lclRleHRcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYS5pbm5lclRleHQpKX0pLGMudHAkZ2V0YXR0cj1Tay5nZW5lcmljLmdldEF0dHIsYy5fX3NldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImlubmVySFRNTFxcXCI9PT1iJiYoYS5pbm5lckhUTUw9YyxhLnYuaW5uZXJIVE1MPWMudixTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lckhUTUxcXFwiKSxjKSksXFxcImlubmVyVGV4dFxcXCI9PT1iJiYoYS5pbm5lclRleHQ9YyxhLnYuaW5uZXJUZXh0PWMudixTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lclRleHRcXFwiKSxjKSl9KSxjLmFwcGVuZENoaWxkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYuYXBwZW5kQ2hpbGQoYi52KX0pLGMucmVtb3ZlQ2hpbGQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5yZW1vdmVDaGlsZChiLnYpfSksYy5jbG9zZXN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgZD1hLnYuY2xvc2VzdChjLnYpO3JldHVybiBkP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2RdKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLmdldENTUz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhLnYuc3R5bGVbYi52XSl9KSxjLnNldENTUz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLnYuc3R5bGVbYi52XT1jLnZ9KSxjLmdldEF0dHJpYnV0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LmdldEF0dHJpYnV0ZShiLnYpO3JldHVybiBjP25ldyBTay5idWlsdGluLnN0cihjKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLnNldEF0dHJpYnV0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLnYuc2V0QXR0cmlidXRlKGIudixjLnYpfSksYy5nZXRQcm9wZXJ0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52W2Iudl07cmV0dXJuIGM/bmV3IFNrLmJ1aWx0aW4uc3RyKGMpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuX19zdHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBjb25zb2xlLmxvZyhhLnYudGFnTmFtZSksbmV3IFNrLmJ1aWx0aW4uc3RyKGEudi50YWdOYW1lKX0pLGMuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIltET00gRWxlbWVudF1cXFwiKX0pfSxiLkVsZW1lbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhiLGEsXFxcIkVsZW1lbnRcXFwiLFtdKSxifTtcIixcInNyYy9saWIvZHVtYmRibS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZHVtYmRibSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2R1bW15X3RocmVhZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZHVtbXlfdGhyZWFkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZHVtbXlfdGhyZWFkaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1teV90aHJlYWRpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbWFpbC9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZW1haWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbWFpbC9taW1lL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1lIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZW1haWwvdGVzdC9kYXRhL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkYXRhIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZW5jb2RpbmdzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJlbmNvZGluZ3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9maWxlY21wLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmaWxlY21wIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZmlsZWlucHV0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmaWxlaW5wdXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mbm1hdGNoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmbm1hdGNoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZm9ybWF0dGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmb3JtYXR0ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mcGZvcm1hdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnBmb3JtYXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mcmFjdGlvbnMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZyYWN0aW9ucyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Z0cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnRwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZnVuY3Rvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmdW5jdG9vbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZW5lcmljcGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2VuZXJpY3BhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZXRvcHQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdldG9wdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2dldHBhc3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdldHBhc3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZXR0ZXh0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJnZXR0ZXh0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZ2xvYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2xvYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2d6aXAucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImd6aXAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9oYXNobGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJoYXNobGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaGVhcHEucHlcIjpcIlxcXCJcXFwiXFxcIkhlYXAgcXVldWUgYWxnb3JpdGhtIChhLmsuYS4gcHJpb3JpdHkgcXVldWUpLlxcblxcbkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXFxuYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxcbm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZ1xcbnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxcblxcblVzYWdlOlxcblxcbmhlYXAgPSBbXSAgICAgICAgICAgICMgY3JlYXRlcyBhbiBlbXB0eSBoZWFwXFxuaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcFxcbml0ZW0gPSBoZWFwcG9wKGhlYXApICMgcG9wcyB0aGUgc21hbGxlc3QgaXRlbSBmcm9tIHRoZSBoZWFwXFxuaXRlbSA9IGhlYXBbMF0gICAgICAgIyBzbWFsbGVzdCBpdGVtIG9uIHRoZSBoZWFwIHdpdGhvdXQgcG9wcGluZyBpdFxcbmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWVcXG5pdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkgIyBwb3BzIGFuZCByZXR1cm5zIHNtYWxsZXN0IGl0ZW0sIGFuZCBhZGRzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmV3IGl0ZW07IHRoZSBoZWFwIHNpemUgaXMgdW5jaGFuZ2VkXFxuXFxuT3VyIEFQSSBkaWZmZXJzIGZyb20gdGV4dGJvb2sgaGVhcCBhbGdvcml0aG1zIGFzIGZvbGxvd3M6XFxuXFxuLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZVxcbiAgaW5kZXggZm9yIGEgbm9kZSBhbmQgdGhlIGluZGV4ZXMgZm9yIGl0cyBjaGlsZHJlbiBzbGlnaHRseSBsZXNzXFxuICBvYnZpb3VzLCBidXQgaXMgbW9yZSBzdWl0YWJsZSBzaW5jZSBQeXRob24gdXNlcyAwLWJhc2VkIGluZGV4aW5nLlxcblxcbi0gT3VyIGhlYXBwb3AoKSBtZXRob2QgcmV0dXJucyB0aGUgc21hbGxlc3QgaXRlbSwgbm90IHRoZSBsYXJnZXN0LlxcblxcblRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0XFxud2l0aG91dCBzdXJwcmlzZXM6IGhlYXBbMF0gaXMgdGhlIHNtYWxsZXN0IGl0ZW0sIGFuZCBoZWFwLnNvcnQoKVxcbm1haW50YWlucyB0aGUgaGVhcCBpbnZhcmlhbnQhXFxuXFxcIlxcXCJcXFwiXFxuXFxuIyBPcmlnaW5hbCBjb2RlIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycyBhbmQgUmF5bW9uZCBIZXR0aW5nZXJcXG5cXG5fX2Fib3V0X18gPSBcXFwiXFxcIlxcXCJIZWFwIHF1ZXVlc1xcblxcbltleHBsYW5hdGlvbiBieSBGcmFuw6dvaXMgUGluYXJkXVxcblxcbkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXFxuYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxcbm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZ1xcbnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxcblxcblRoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5XFxucmVwcmVzZW50YXRpb24gZm9yIGEgdG91cm5hbWVudC4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSBgaycsIG5vdCBhW2tdOlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMFxcblxcbiAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXFxuXFxuICAgICAgICAgIDMgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICA2XFxuXFxuICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNFxcblxcbiAgICAxNSAxNiAgIDE3IDE4ICAgMTkgMjAgICAyMSAyMiAgIDIzIDI0ICAgMjUgMjYgICAyNyAyOCAgIDI5IDMwXFxuXFxuXFxuSW4gdGhlIHRyZWUgYWJvdmUsIGVhY2ggY2VsbCBgaycgaXMgdG9wcGluZyBgMiprKzEnIGFuZCBgMiprKzInLiAgSW5cXG5hIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyXFxub3ZlciB0aGUgdHdvIGNlbGxzIGl0IHRvcHMsIGFuZCB3ZSBjYW4gdHJhY2UgdGhlIHdpbm5lciBkb3duIHRoZSB0cmVlXFxudG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9uc1xcbm9mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLlxcblRvIGJlIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgd2hlbiBhIHdpbm5lciBpcyBwcm9tb3RlZCwgd2UgdHJ5IHRvXFxucmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lc1xcbnRoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsXFxuYnV0IHRoZSB0b3AgY2VsbCBcXFwid2luc1xcXCIgb3ZlciB0aGUgdHdvIHRvcHBlZCBjZWxscy5cXG5cXG5JZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5XFxudGhlIG92ZXJhbGwgd2lubmVyLiAgVGhlIHNpbXBsZXN0IGFsZ29yaXRobWljIHdheSB0byByZW1vdmUgaXQgYW5kXFxuZmluZCB0aGUgXFxcIm5leHRcXFwiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZVxcbmRpYWdyYW0gYWJvdmUpIGludG8gdGhlIDAgcG9zaXRpb24sIGFuZCB0aGVuIHBlcmNvbGF0ZSB0aGlzIG5ldyAwIGRvd25cXG50aGUgdHJlZSwgZXhjaGFuZ2luZyB2YWx1ZXMsIHVudGlsIHRoZSBpbnZhcmlhbnQgaXMgcmUtZXN0YWJsaXNoZWQuXFxuVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuXFxuQnkgaXRlcmF0aW5nIG92ZXIgYWxsIGl0ZW1zLCB5b3UgZ2V0IGFuIE8obiBsbiBuKSBzb3J0LlxcblxcbkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ld1xcbml0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmVcXG5ub3QgXFxcImJldHRlclxcXCIgdGhhbiB0aGUgbGFzdCAwJ3RoIGVsZW1lbnQgeW91IGV4dHJhY3RlZC4gIFRoaXMgaXNcXG5lc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGxcXG5pbmNvbWluZyBldmVudHMsIGFuZCB0aGUgXFxcIndpblxcXCIgY29uZGl0aW9uIG1lYW5zIHRoZSBzbWFsbGVzdCBzY2hlZHVsZWRcXG50aW1lLiAgV2hlbiBhbiBldmVudCBzY2hlZHVsZSBvdGhlciBldmVudHMgZm9yIGV4ZWN1dGlvbiwgdGhleSBhcmVcXG5zY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhXFxuaGVhcCBpcyBhIGdvb2Qgc3RydWN0dXJlIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyAodGhpcyBpcyB3aGF0IElcXG51c2VkIGZvciBteSBNSURJIHNlcXVlbmNlciA6LSkuXFxuXFxuVmFyaW91cyBzdHJ1Y3R1cmVzIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyBoYXZlIGJlZW4gZXh0ZW5zaXZlbHlcXG5zdHVkaWVkLCBhbmQgaGVhcHMgYXJlIGdvb2QgZm9yIHRoaXMsIGFzIHRoZXkgYXJlIHJlYXNvbmFibHkgc3BlZWR5LFxcbnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnRcXG50aGFuIHRoZSBhdmVyYWdlIGNhc2UuICBIb3dldmVyLCB0aGVyZSBhcmUgb3RoZXIgcmVwcmVzZW50YXRpb25zIHdoaWNoXFxuYXJlIG1vcmUgZWZmaWNpZW50IG92ZXJhbGwsIHlldCB0aGUgd29yc3QgY2FzZXMgbWlnaHQgYmUgdGVycmlibGUuXFxuXFxuSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGxcXG5rbm93IHRoYXQgYSBiaWcgc29ydCBpbXBsaWVzIHByb2R1Y2luZyBcXFwicnVuc1xcXCIgKHdoaWNoIGFyZSBwcmUtc29ydGVkXFxuc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLFxcbmZvbGxvd2VkIGJ5IGEgbWVyZ2luZyBwYXNzZXMgZm9yIHRoZXNlIHJ1bnMsIHdoaWNoIG1lcmdpbmcgaXMgb2Z0ZW5cXG52ZXJ5IGNsZXZlcmx5IG9yZ2FuaXNlZFsxXS4gIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlIGluaXRpYWxcXG5zb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheVxcbnRvIHRoYXQuICBJZiwgdXNpbmcgYWxsIHRoZSBtZW1vcnkgYXZhaWxhYmxlIHRvIGhvbGQgYSB0b3VybmFtZW50LCB5b3VcXG5yZXBsYWNlIGFuZCBwZXJjb2xhdGUgaXRlbXMgdGhhdCBoYXBwZW4gdG8gZml0IHRoZSBjdXJyZW50IHJ1biwgeW91J2xsXFxucHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsXFxuYW5kIG11Y2ggYmV0dGVyIGZvciBpbnB1dCBmdXp6aWx5IG9yZGVyZWQuXFxuXFxuTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2hcXG5tYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSBcXFwid2luc1xcXCIgb3ZlclxcbnRoZSBsYXN0IG91dHB1dCB2YWx1ZSksIGl0IGNhbm5vdCBmaXQgaW4gdGhlIGhlYXAsIHNvIHRoZSBzaXplIG9mIHRoZVxcbmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHlcXG5mb3IgcHJvZ3Jlc3NpdmVseSBidWlsZGluZyBhIHNlY29uZCBoZWFwLCB3aGljaCBncm93cyBhdCBleGFjdGx5IHRoZVxcbnNhbWUgcmF0ZSB0aGUgZmlyc3QgaGVhcCBpcyBtZWx0aW5nLiAgV2hlbiB0aGUgZmlyc3QgaGVhcCBjb21wbGV0ZWx5XFxudmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGVcXG5lZmZlY3RpdmUhXFxuXFxuSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluXFxuYSBmZXcgYXBwbGljYXRpb25zLCBhbmQgSSB0aGluayBpdCBpcyBnb29kIHRvIGtlZXAgYSBgaGVhcCcgbW9kdWxlXFxuYXJvdW5kLiA6LSlcXG5cXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblsxXSBUaGUgZGlzayBiYWxhbmNpbmcgYWxnb3JpdGhtcyB3aGljaCBhcmUgY3VycmVudCwgbm93YWRheXMsIGFyZVxcbm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmdcXG5jYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWdcXG50YXBlIGRyaXZlcywgdGhlIHN0b3J5IHdhcyBxdWl0ZSBkaWZmZXJlbnQsIGFuZCBvbmUgaGFkIHRvIGJlIHZlcnlcXG5jbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGVcXG5tb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0XFxuXFxcInByb2dyZXNzaW5nXFxcIiB0aGUgbWVyZ2UpLiAgU29tZSB0YXBlcyB3ZXJlIGV2ZW4gYWJsZSB0byByZWFkXFxuYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS5cXG5CZWxpZXZlIG1lLCByZWFsIGdvb2QgdGFwZSBzb3J0cyB3ZXJlIHF1aXRlIHNwZWN0YWN1bGFyIHRvIHdhdGNoIVxcbkZyb20gYWxsIHRpbWVzLCBzb3J0aW5nIGhhcyBhbHdheXMgYmVlbiBhIEdyZWF0IEFydCEgOi0pXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFsnaGVhcHB1c2gnLCAnaGVhcHBvcCcsICdoZWFwaWZ5JywgJ2hlYXByZXBsYWNlJyxcXG4gICAgICAgICAgICdubGFyZ2VzdCcsICduc21hbGxlc3QnLCAnaGVhcHB1c2hwb3AnXVxcblxcbmRlZiBoZWFwcHVzaChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxcXCJcXFwiXFxcIlxcbiAgICBoZWFwLmFwcGVuZChpdGVtKVxcbiAgICBfc2lmdGRvd24oaGVhcCwgMCwgbGVuKGhlYXApLTEpXFxuXFxuZGVmIGhlYXBwb3AoaGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC5cXFwiXFxcIlxcXCJcXG4gICAgbGFzdGVsdCA9IGhlYXAucG9wKCkgICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5XFxuICAgIGlmIGhlYXA6XFxuICAgICAgICByZXR1cm5pdGVtID0gaGVhcFswXVxcbiAgICAgICAgaGVhcFswXSA9IGxhc3RlbHRcXG4gICAgICAgIF9zaWZ0dXAoaGVhcCwgMClcXG4gICAgICAgIHJldHVybiByZXR1cm5pdGVtXFxuICAgIHJldHVybiBsYXN0ZWx0XFxuXFxuZGVmIGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pOlxcbiAgICBcXFwiXFxcIlxcXCJQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uXFxuXFxuICAgIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBoZWFwcG9wKCkgZm9sbG93ZWQgYnkgaGVhcHB1c2goKSwgYW5kIGNhbiBiZVxcbiAgICBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgYSBmaXhlZC1zaXplIGhlYXAuICBOb3RlIHRoYXQgdGhlIHZhbHVlXFxuICAgIHJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZlxcbiAgICB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OlxcblxcbiAgICAgICAgaWYgaXRlbSA+IGhlYXBbMF06XFxuICAgICAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaGVhcFswXSA9IGl0ZW1cXG4gICAgX3NpZnR1cChoZWFwLCAwKVxcbiAgICByZXR1cm4gcmV0dXJuaXRlbVxcblxcbmRlZiBoZWFwcHVzaHBvcChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiRmFzdCB2ZXJzaW9uIG9mIGEgaGVhcHB1c2ggZm9sbG93ZWQgYnkgYSBoZWFwcG9wLlxcXCJcXFwiXFxcIlxcbiAgICBpZiBoZWFwIGFuZCBoZWFwWzBdIDwgaXRlbTpcXG4gICAgICAgIGl0ZW0sIGhlYXBbMF0gPSBoZWFwWzBdLCBpdGVtXFxuICAgICAgICBfc2lmdHVwKGhlYXAsIDApXFxuICAgIHJldHVybiBpdGVtXFxuXFxuZGVmIGhlYXBpZnkoeCk6XFxuICAgIFxcXCJcXFwiXFxcIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oeCkpIHRpbWUuXFxcIlxcXCJcXFwiXFxuICAgIG4gPSBsZW4oeClcXG4gICAgIyBUcmFuc2Zvcm0gYm90dG9tLXVwLiAgVGhlIGxhcmdlc3QgaW5kZXggdGhlcmUncyBhbnkgcG9pbnQgdG8gbG9va2luZyBhdFxcbiAgICAjIGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdCBoYXZlIDIqaSArIDEgPCBuLFxcbiAgICAjIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzICgyKmotMSkvMiA9IGotMS8yIHNvXFxuICAgICMgai0xIGlzIHRoZSBsYXJnZXN0LCB3aGljaCBpcyBuLy8yIC0gMS4gIElmIG4gaXMgb2RkID0gMipqKzEsIHRoaXMgaXNcXG4gICAgIyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LCBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS5cXG4gICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2Uobi8vMikpOlxcbiAgICAgICAgX3NpZnR1cCh4LCBpKVxcblxcbmRlZiBfaGVhcHBvcF9tYXgoaGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIk1heGhlYXAgdmVyc2lvbiBvZiBhIGhlYXBwb3AuXFxcIlxcXCJcXFwiXFxuICAgIGxhc3RlbHQgPSBoZWFwLnBvcCgpICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eVxcbiAgICBpZiBoZWFwOlxcbiAgICAgICAgcmV0dXJuaXRlbSA9IGhlYXBbMF1cXG4gICAgICAgIGhlYXBbMF0gPSBsYXN0ZWx0XFxuICAgICAgICBfc2lmdHVwX21heChoZWFwLCAwKVxcbiAgICAgICAgcmV0dXJuIHJldHVybml0ZW1cXG4gICAgcmV0dXJuIGxhc3RlbHRcXG5cXG5kZWYgX2hlYXByZXBsYWNlX21heChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiTWF4aGVhcCB2ZXJzaW9uIG9mIGEgaGVhcHBvcCBmb2xsb3dlZCBieSBhIGhlYXBwdXNoLlxcXCJcXFwiXFxcIlxcbiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaGVhcFswXSA9IGl0ZW1cXG4gICAgX3NpZnR1cF9tYXgoaGVhcCwgMClcXG4gICAgcmV0dXJuIHJldHVybml0ZW1cXG5cXG5kZWYgX2hlYXBpZnlfbWF4KHgpOlxcbiAgICBcXFwiXFxcIlxcXCJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgbWF4aGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKHgpKSB0aW1lLlxcXCJcXFwiXFxcIlxcbiAgICBuID0gbGVuKHgpXFxuICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKG4vLzIpKTpcXG4gICAgICAgIF9zaWZ0dXBfbWF4KHgsIGkpXFxuXFxuIyAnaGVhcCcgaXMgYSBoZWFwIGF0IGFsbCBpbmRpY2VzID49IHN0YXJ0cG9zLCBleGNlcHQgcG9zc2libHkgZm9yIHBvcy4gIHBvc1xcbiMgaXMgdGhlIGluZGV4IG9mIGEgbGVhZiB3aXRoIGEgcG9zc2libHkgb3V0LW9mLW9yZGVyIHZhbHVlLiAgUmVzdG9yZSB0aGVcXG4jIGhlYXAgaW52YXJpYW50LlxcbmRlZiBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcyk6XFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZyBhIHBsYWNlXFxuICAgICMgbmV3aXRlbSBmaXRzLlxcbiAgICB3aGlsZSBwb3MgPiBzdGFydHBvczpcXG4gICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxXFxuICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc11cXG4gICAgICAgIGlmIG5ld2l0ZW0gPCBwYXJlbnQ6XFxuICAgICAgICAgICAgaGVhcFtwb3NdID0gcGFyZW50XFxuICAgICAgICAgICAgcG9zID0gcGFyZW50cG9zXFxuICAgICAgICAgICAgY29udGludWVcXG4gICAgICAgIGJyZWFrXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG5cXG4jIFRoZSBjaGlsZCBpbmRpY2VzIG9mIGhlYXAgaW5kZXggcG9zIGFyZSBhbHJlYWR5IGhlYXBzLCBhbmQgd2Ugd2FudCB0byBtYWtlXFxuIyBhIGhlYXAgYXQgaW5kZXggcG9zIHRvby4gIFdlIGRvIHRoaXMgYnkgYnViYmxpbmcgdGhlIHNtYWxsZXIgY2hpbGQgb2ZcXG4jIHBvcyB1cCAoYW5kIHNvIG9uIHdpdGggdGhhdCBjaGlsZCdzIGNoaWxkcmVuLCBldGMpIHVudGlsIGhpdHRpbmcgYSBsZWFmLFxcbiMgdGhlbiB1c2luZyBfc2lmdGRvd24gdG8gbW92ZSB0aGUgb2RkYmFsbCBvcmlnaW5hbGx5IGF0IGluZGV4IHBvcyBpbnRvIHBsYWNlLlxcbiNcXG4jIFdlICpjb3VsZCogYnJlYWsgb3V0IG9mIHRoZSBsb29wIGFzIHNvb24gYXMgd2UgZmluZCBhIHBvcyB3aGVyZSBuZXdpdGVtIDw9XFxuIyBib3RoIGl0cyBjaGlsZHJlbiwgYnV0IHR1cm5zIG91dCB0aGF0J3Mgbm90IGEgZ29vZCBpZGVhLCBhbmQgZGVzcGl0ZSB0aGF0XFxuIyBtYW55IGJvb2tzIHdyaXRlIHRoZSBhbGdvcml0aG0gdGhhdCB3YXkuICBEdXJpbmcgYSBoZWFwIHBvcCwgdGhlIGxhc3QgYXJyYXlcXG4jIGVsZW1lbnQgaXMgc2lmdGVkIGluLCBhbmQgdGhhdCB0ZW5kcyB0byBiZSBsYXJnZSwgc28gdGhhdCBjb21wYXJpbmcgaXRcXG4jIGFnYWluc3QgdmFsdWVzIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgdXN1YWxseSBkb2Vzbid0IHBheSAoPSB1c3VhbGx5IGRvZXNuJ3RcXG4jIGdldCB1cyBvdXQgb2YgdGhlIGxvb3AgZWFybHkpLiAgU2VlIEtudXRoLCBWb2x1bWUgMywgd2hlcmUgdGhpcyBpc1xcbiMgZXhwbGFpbmVkIGFuZCBxdWFudGlmaWVkIGluIGFuIGV4ZXJjaXNlLlxcbiNcXG4jIEN1dHRpbmcgdGhlICMgb2YgY29tcGFyaXNvbnMgaXMgaW1wb3J0YW50LCBzaW5jZSB0aGVzZSByb3V0aW5lcyBoYXZlIG5vXFxuIyB3YXkgdG8gZXh0cmFjdCBcXFwidGhlIHByaW9yaXR5XFxcIiBmcm9tIGFuIGFycmF5IGVsZW1lbnQsIHNvIHRoYXQgaW50ZWxsaWdlbmNlXFxuIyBpcyBsaWtlbHkgdG8gYmUgaGlkaW5nIGluIGN1c3RvbSBjb21wYXJpc29uIG1ldGhvZHMsIG9yIGluIGFycmF5IGVsZW1lbnRzXFxuIyBzdG9yaW5nIChwcmlvcml0eSwgcmVjb3JkKSB0dXBsZXMuICBDb21wYXJpc29ucyBhcmUgdGh1cyBwb3RlbnRpYWxseVxcbiMgZXhwZW5zaXZlLlxcbiNcXG4jIE9uIHJhbmRvbSBhcnJheXMgb2YgbGVuZ3RoIDEwMDAsIG1ha2luZyB0aGlzIGNoYW5nZSBjdXQgdGhlIG51bWJlciBvZlxcbiMgY29tcGFyaXNvbnMgbWFkZSBieSBoZWFwaWZ5KCkgYSBsaXR0bGUsIGFuZCB0aG9zZSBtYWRlIGJ5IGV4aGF1c3RpdmVcXG4jIGhlYXBwb3AoKSBhIGxvdCwgaW4gYWNjb3JkIHdpdGggdGhlb3J5LiAgSGVyZSBhcmUgdHlwaWNhbCByZXN1bHRzIGZyb20gM1xcbiMgcnVucyAoMyBqdXN0IHRvIGRlbW9uc3RyYXRlIGhvdyBzbWFsbCB0aGUgdmFyaWFuY2UgaXMpOlxcbiNcXG4jIENvbXBhcmVzIG5lZWRlZCBieSBoZWFwaWZ5ICAgICBDb21wYXJlcyBuZWVkZWQgYnkgMTAwMCBoZWFwcG9wc1xcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuIyAxODM3IGN1dCB0byAxNjYzICAgICAgICAgICAgICAgMTQ5OTYgY3V0IHRvIDg2ODBcXG4jIDE4NTUgY3V0IHRvIDE2NTkgICAgICAgICAgICAgICAxNDk2NiBjdXQgdG8gODY3OFxcbiMgMTg0NyBjdXQgdG8gMTY2MCAgICAgICAgICAgICAgIDE1MDI0IGN1dCB0byA4NzAzXFxuI1xcbiMgQnVpbGRpbmcgdGhlIGhlYXAgYnkgdXNpbmcgaGVhcHB1c2goKSAxMDAwIHRpbWVzIGluc3RlYWQgcmVxdWlyZWRcXG4jIDIxOTgsIDIxNDgsIGFuZCAyMjE5IGNvbXBhcmVzOiAgaGVhcGlmeSgpIGlzIG1vcmUgZWZmaWNpZW50LCB3aGVuXFxuIyB5b3UgY2FuIHVzZSBpdC5cXG4jXFxuIyBUaGUgdG90YWwgY29tcGFyZXMgbmVlZGVkIGJ5IGxpc3Quc29ydCgpIG9uIHRoZSBzYW1lIGxpc3RzIHdlcmUgODYyNyxcXG4jIDg2MjcsIGFuZCA4NjMyICh0aGlzIHNob3VsZCBiZSBjb21wYXJlZCB0byB0aGUgc3VtIG9mIGhlYXBpZnkoKSBhbmRcXG4jIGhlYXBwb3AoKSBjb21wYXJlcyk6ICBsaXN0LnNvcnQoKSBpcyAodW5zdXJwcmlzaW5nbHkhKSBtb3JlIGVmZmljaWVudFxcbiMgZm9yIHNvcnRpbmcuXFxuXFxuZGVmIF9zaWZ0dXAoaGVhcCwgcG9zKTpcXG4gICAgZW5kcG9zID0gbGVuKGhlYXApXFxuICAgIHN0YXJ0cG9zID0gcG9zXFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuXFxuICAgIGNoaWxkcG9zID0gMipwb3MgKyAxICAgICMgbGVmdG1vc3QgY2hpbGQgcG9zaXRpb25cXG4gICAgd2hpbGUgY2hpbGRwb3MgPCBlbmRwb3M6XFxuICAgICAgICAjIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLlxcbiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDFcXG4gICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgaGVhcFtjaGlsZHBvc10gPCBoZWFwW3JpZ2h0cG9zXTpcXG4gICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zXFxuICAgICAgICAjIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuXFxuICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXVxcbiAgICAgICAgcG9zID0gY2hpbGRwb3NcXG4gICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxXFxuICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwXFxuICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG4gICAgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpXFxuXFxuZGVmIF9zaWZ0ZG93bl9tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcyk6XFxuICAgICdNYXhoZWFwIHZhcmlhbnQgb2YgX3NpZnRkb3duJ1xcbiAgICBuZXdpdGVtID0gaGVhcFtwb3NdXFxuICAgICMgRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcgYSBwbGFjZVxcbiAgICAjIG5ld2l0ZW0gZml0cy5cXG4gICAgd2hpbGUgcG9zID4gc3RhcnRwb3M6XFxuICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMVxcbiAgICAgICAgcGFyZW50ID0gaGVhcFtwYXJlbnRwb3NdXFxuICAgICAgICBpZiBwYXJlbnQgPCBuZXdpdGVtOlxcbiAgICAgICAgICAgIGhlYXBbcG9zXSA9IHBhcmVudFxcbiAgICAgICAgICAgIHBvcyA9IHBhcmVudHBvc1xcbiAgICAgICAgICAgIGNvbnRpbnVlXFxuICAgICAgICBicmVha1xcbiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtXFxuXFxuZGVmIF9zaWZ0dXBfbWF4KGhlYXAsIHBvcyk6XFxuICAgICdNYXhoZWFwIHZhcmlhbnQgb2YgX3NpZnR1cCdcXG4gICAgZW5kcG9zID0gbGVuKGhlYXApXFxuICAgIHN0YXJ0cG9zID0gcG9zXFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBCdWJibGUgdXAgdGhlIGxhcmdlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi5cXG4gICAgY2hpbGRwb3MgPSAyKnBvcyArIDEgICAgIyBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvblxcbiAgICB3aGlsZSBjaGlsZHBvcyA8IGVuZHBvczpcXG4gICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIGxhcmdlciBjaGlsZC5cXG4gICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxXFxuICAgICAgICBpZiByaWdodHBvcyA8IGVuZHBvcyBhbmQgbm90IGhlYXBbcmlnaHRwb3NdIDwgaGVhcFtjaGlsZHBvc106XFxuICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvc1xcbiAgICAgICAgIyBNb3ZlIHRoZSBsYXJnZXIgY2hpbGQgdXAuXFxuICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXVxcbiAgICAgICAgcG9zID0gY2hpbGRwb3NcXG4gICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxXFxuICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwXFxuICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG4gICAgX3NpZnRkb3duX21heChoZWFwLCBzdGFydHBvcywgcG9zKVxcblxcblxcbiMgQWxnb3JpdGhtIG5vdGVzIGZvciBubGFyZ2VzdCgpIGFuZCBuc21hbGxlc3QoKVxcbiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbiNcXG4jIE1ha2UgYSBzaW5nbGUgcGFzcyBvdmVyIHRoZSBkYXRhIHdoaWxlIGtlZXBpbmcgdGhlIGsgbW9zdCBleHRyZW1lIHZhbHVlc1xcbiMgaW4gYSBoZWFwLiAgTWVtb3J5IGNvbnN1bXB0aW9uIGlzIGxpbWl0ZWQgdG8ga2VlcGluZyBrIHZhbHVlcyBpbiBhIGxpc3QuXFxuI1xcbiMgTWVhc3VyZWQgcGVyZm9ybWFuY2UgZm9yIHJhbmRvbSBpbnB1dHM6XFxuI1xcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBjb21wYXJpc29uc1xcbiMgICAgbiBpbnB1dHMgICAgIGstZXh0cmVtZSB2YWx1ZXMgIChhdmVyYWdlIG9mIDUgdHJpYWxzKSAgICUgbW9yZSB0aGFuIG1pbigpXFxuIyAtLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS1cXG4jICAgICAgMSwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAgIDMsMzE3ICAgICAgICAgICAgICAgMjMxLjclXFxuIyAgICAgMTAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgICAgIDE0LDA0NiAgICAgICAgICAgICAgICA0MC41JVxcbiMgICAgMTAwLDAwMCAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgIDEwNSw3NDkgICAgICAgICAgICAgICAgIDUuNyVcXG4jICAxLDAwMCwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgMSwwMDcsNzUxICAgICAgICAgICAgICAgICAwLjglXFxuIyAxMCwwMDAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgMTAsMDA5LDQwMSAgICAgICAgICAgICAgICAgMC4xJVxcbiNcXG4jIFRoZW9yZXRpY2FsIG51bWJlciBvZiBjb21wYXJpc29ucyBmb3IgayBzbWFsbGVzdCBvZiBuIHJhbmRvbSBpbnB1dHM6XFxuI1xcbiMgU3RlcCAgIENvbXBhcmlzb25zICAgICAgICAgICAgICAgICAgQWN0aW9uXFxuIyAtLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4jICAxICAgICAxLjY2ICogayAgICAgICAgICAgICAgICAgICAgIGhlYXBpZnkgdGhlIGZpcnN0IGstaW5wdXRzXFxuIyAgMiAgICAgbiAtIGsgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlIHJlbWFpbmluZyBlbGVtZW50cyB0byB0b3Agb2YgaGVhcFxcbiMgIDMgICAgIGsgKiAoMSArIGxnMihrKSkgKiBsbihuL2spICAgcmVwbGFjZSB0aGUgdG9wbW9zdCB2YWx1ZSBvbiB0aGUgaGVhcFxcbiMgIDQgICAgIGsgKiBsZzIoaykgLSAoay8yKSAgICAgICAgICAgZmluYWwgc29ydCBvZiB0aGUgayBtb3N0IGV4dHJlbWUgdmFsdWVzXFxuI1xcbiMgQ29tYmluaW5nIGFuZCBzaW1wbGlmeWluZyBmb3IgYSByb3VnaCBlc3RpbWF0ZSBnaXZlczpcXG4jXFxuIyAgICAgICAgY29tcGFyaXNvbnMgPSBuICsgayAqIChsb2coaywgMikgKiBsb2cobi9rKSArIGxvZyhrLCAyKSArIGxvZyhuL2spKVxcbiNcXG4jIENvbXB1dGluZyB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIGZvciBzdGVwIDM6XFxuIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgKiBGb3IgdGhlIGktdGggbmV3IHZhbHVlIGZyb20gdGhlIGl0ZXJhYmxlLCB0aGUgcHJvYmFiaWxpdHkgb2YgYmVpbmcgaW4gdGhlXFxuIyAgIGsgbW9zdCBleHRyZW1lIHZhbHVlcyBpcyBrL2kuICBGb3IgZXhhbXBsZSwgdGhlIHByb2JhYmlsaXR5IG9mIHRoZSAxMDFzdFxcbiMgICB2YWx1ZSBzZWVuIGJlaW5nIGluIHRoZSAxMDAgbW9zdCBleHRyZW1lIHZhbHVlcyBpcyAxMDAvMTAxLlxcbiMgKiBJZiB0aGUgdmFsdWUgaXMgYSBuZXcgZXh0cmVtZSB2YWx1ZSwgdGhlIGNvc3Qgb2YgaW5zZXJ0aW5nIGl0IGludG8gdGhlXFxuIyAgIGhlYXAgaXMgMSArIGxvZyhrLCAyKS5cXG4jICogVGhlIHByb2JhYmlsaXR5IHRpbWVzIHRoZSBjb3N0IGdpdmVzOlxcbiMgICAgICAgICAgICAoay9pKSAqICgxICsgbG9nKGssIDIpKVxcbiMgKiBTdW1taW5nIGFjcm9zcyB0aGUgcmVtYWluaW5nIG4tayBlbGVtZW50cyBnaXZlczpcXG4jICAgICAgICAgICAgc3VtKChrL2kpICogKDEgKyBsb2coaywgMikpIGZvciBpIGluIHJhbmdlKGsrMSwgbisxKSlcXG4jICogVGhpcyByZWR1Y2VzIHRvOlxcbiMgICAgICAgICAgICAoSChuKSAtIEgoaykpICogayAqICgxICsgbG9nKGssIDIpKVxcbiMgKiBXaGVyZSBIKG4pIGlzIHRoZSBuLXRoIGhhcm1vbmljIG51bWJlciBlc3RpbWF0ZWQgYnk6XFxuIyAgICAgICAgICAgIGdhbW1hID0gMC41NzcyMTU2NjQ5XFxuIyAgICAgICAgICAgIEgobikgPSBsb2cobiwgZSkgKyBnYW1tYSArIDEgLyAoMiAqIG4pXFxuIyAgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFybW9uaWNfc2VyaWVzXyhtYXRoZW1hdGljcykjUmF0ZV9vZl9kaXZlcmdlbmNlXFxuIyAqIFN1YnN0aXR1dGluZyB0aGUgSChuKSBmb3JtdWxhOlxcbiMgICAgICAgICAgICBjb21wYXJpc29ucyA9IGsgKiAoMSArIGxvZyhrLCAyKSkgKiAobG9nKG4vaywgZSkgKyAoMS9uIC0gMS9rKSAvIDIpXFxuI1xcbiMgV29yc3QtY2FzZSBmb3Igc3RlcCAzOlxcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgSW4gdGhlIHdvcnN0IGNhc2UsIHRoZSBpbnB1dCBkYXRhIGlzIHJldmVyc2VkIHNvcnRlZCBzbyB0aGF0IGV2ZXJ5IG5ldyBlbGVtZW50XFxuIyBtdXN0IGJlIGluc2VydGVkIGluIHRoZSBoZWFwOlxcbiNcXG4jICAgICAgICAgICAgIGNvbXBhcmlzb25zID0gMS42NiAqIGsgKyBsb2coaywgMikgKiAobiAtIGspXFxuI1xcbiMgQWx0ZXJuYXRpdmUgQWxnb3JpdGhtc1xcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgT3RoZXIgYWxnb3JpdGhtcyB3ZXJlIG5vdCB1c2VkIGJlY2F1c2UgdGhleTpcXG4jIDEpIFRvb2sgbXVjaCBtb3JlIGF1eGlsaWFyeSBtZW1vcnksXFxuIyAyKSBNYWRlIG11bHRpcGxlIHBhc3NlcyBvdmVyIHRoZSBkYXRhLlxcbiMgMykgTWFkZSBtb3JlIGNvbXBhcmlzb25zIGluIGNvbW1vbiBjYXNlcyAoc21hbGwgaywgbGFyZ2Ugbiwgc2VtaS1yYW5kb20gaW5wdXQpLlxcbiMgU2VlIHRoZSBtb3JlIGRldGFpbGVkIGNvbXBhcmlzb24gb2YgYXBwcm9hY2ggYXQ6XFxuIyBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy81Nzc1NzMtY29tcGFyZS1hbGdvcml0aG1zLWZvci1oZWFwcXNtYWxsZXN0XFxuXFxuZGVmIG5zbWFsbGVzdChuLCBpdGVyYWJsZSwga2V5PU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cXG5cXG4gICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSlbOm5dXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICAjIFNob3J0LWN1dCBmb3Igbj09MSBpcyB0byB1c2UgbWluKClcXG4gICAgaWYgbiA9PSAxOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgc2VudGluZWwgPSBvYmplY3QoKVxcbiAgICAgICAgcmVzdWx0ID0gbWluKGl0LCBkZWZhdWx0PXNlbnRpbmVsLCBrZXk9a2V5KVxcbiAgICAgICAgcmV0dXJuIFtdIGlmIHJlc3VsdCBpcyBzZW50aW5lbCBlbHNlIFtyZXN1bHRdXFxuXFxuICAgICMgV2hlbiBuPj1zaXplLCBpdCdzIGZhc3RlciB0byB1c2Ugc29ydGVkKClcXG4gICAgdHJ5OlxcbiAgICAgICAgc2l6ZSA9IGxlbihpdGVyYWJsZSlcXG4gICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKTpcXG4gICAgICAgIHBhc3NcXG4gICAgZWxzZTpcXG4gICAgICAgIGlmIG4gPj0gc2l6ZTpcXG4gICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl1cXG5cXG4gICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uXFxuICAgIGlmIGtleSBpcyBOb25lOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgIyBwdXQgdGhlIHJhbmdlKG4pIGZpcnN0IHNvIHRoYXQgemlwKCkgZG9lc24ndFxcbiAgICAgICAgIyBjb25zdW1lIG9uZSB0b28gbWFueSBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYXRvclxcbiAgICAgICAgcmVzdWx0ID0gWyhlbGVtLCBpKSBmb3IgaSwgZWxlbSBpbiB6aXAocmFuZ2UobiksIGl0KV1cXG4gICAgICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICAgICAgX2hlYXBpZnlfbWF4KHJlc3VsdClcXG4gICAgICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICAgICAgb3JkZXIgPSBuXFxuICAgICAgICBfaGVhcHJlcGxhY2UgPSBfaGVhcHJlcGxhY2VfbWF4XFxuICAgICAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgICAgICBpZiBlbGVtIDwgdG9wOlxcbiAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoZWxlbSwgb3JkZXIpKVxcbiAgICAgICAgICAgICAgICB0b3AsIF9vcmRlciA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgICAgICBvcmRlciArPSAxXFxuICAgICAgICByZXN1bHQuc29ydCgpXFxuICAgICAgICByZXR1cm4gW2VsZW0gZm9yIChlbGVtLCBvcmRlcikgaW4gcmVzdWx0XVxcblxcbiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2RcXG4gICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICByZXN1bHQgPSBbKGtleShlbGVtKSwgaSwgZWxlbSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKG4pLCBpdCldXFxuICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgIF9oZWFwaWZ5X21heChyZXN1bHQpXFxuICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICBvcmRlciA9IG5cXG4gICAgX2hlYXByZXBsYWNlID0gX2hlYXByZXBsYWNlX21heFxcbiAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgIGsgPSBrZXkoZWxlbSlcXG4gICAgICAgIGlmIGsgPCB0b3A6XFxuICAgICAgICAgICAgX2hlYXByZXBsYWNlKHJlc3VsdCwgKGssIG9yZGVyLCBlbGVtKSlcXG4gICAgICAgICAgICB0b3AsIF9vcmRlciwgX2VsZW0gPSByZXN1bHRbMF1cXG4gICAgICAgICAgICBvcmRlciArPSAxXFxuICAgIHJlc3VsdC5zb3J0KClcXG4gICAgcmV0dXJuIFtlbGVtIGZvciAoaywgb3JkZXIsIGVsZW0pIGluIHJlc3VsdF1cXG5cXG5kZWYgbmxhcmdlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cXG5cXG4gICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl1cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtYXgoKVxcbiAgICBpZiBuID09IDE6XFxuICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgICAgICBzZW50aW5lbCA9IG9iamVjdCgpXFxuICAgICAgICByZXN1bHQgPSBtYXgoaXQsIGRlZmF1bHQ9c2VudGluZWwsIGtleT1rZXkpXFxuICAgICAgICByZXR1cm4gW10gaWYgcmVzdWx0IGlzIHNlbnRpbmVsIGVsc2UgW3Jlc3VsdF1cXG5cXG4gICAgIyBXaGVuIG4+PXNpemUsIGl0J3MgZmFzdGVyIHRvIHVzZSBzb3J0ZWQoKVxcbiAgICB0cnk6XFxuICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKVxcbiAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOlxcbiAgICAgICAgcGFzc1xcbiAgICBlbHNlOlxcbiAgICAgICAgaWYgbiA+PSBzaXplOlxcbiAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXksIHJldmVyc2U9VHJ1ZSlbOm5dXFxuXFxuICAgICMgV2hlbiBrZXkgaXMgbm9uZSwgdXNlIHNpbXBsZXIgZGVjb3JhdGlvblxcbiAgICBpZiBrZXkgaXMgTm9uZTpcXG4gICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSlcXG4gICAgICAgIHJlc3VsdCA9IFsoZWxlbSwgaSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKDAsIC1uLCAtMSksIGl0KV1cXG4gICAgICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICAgICAgaGVhcGlmeShyZXN1bHQpXFxuICAgICAgICB0b3AgPSByZXN1bHRbMF1bMF1cXG4gICAgICAgIG9yZGVyID0gLW5cXG4gICAgICAgIF9oZWFwcmVwbGFjZSA9IGhlYXByZXBsYWNlXFxuICAgICAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgICAgICBpZiB0b3AgPCBlbGVtOlxcbiAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoZWxlbSwgb3JkZXIpKVxcbiAgICAgICAgICAgICAgICB0b3AsIF9vcmRlciA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgICAgICBvcmRlciAtPSAxXFxuICAgICAgICByZXN1bHQuc29ydChyZXZlcnNlPVRydWUpXFxuICAgICAgICByZXR1cm4gW2VsZW0gZm9yIChlbGVtLCBvcmRlcikgaW4gcmVzdWx0XVxcblxcbiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2RcXG4gICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICByZXN1bHQgPSBbKGtleShlbGVtKSwgaSwgZWxlbSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKDAsIC1uLCAtMSksIGl0KV1cXG4gICAgaWYgbm90IHJlc3VsdDpcXG4gICAgICAgIHJldHVybiByZXN1bHRcXG4gICAgaGVhcGlmeShyZXN1bHQpXFxuICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICBvcmRlciA9IC1uXFxuICAgIF9oZWFwcmVwbGFjZSA9IGhlYXByZXBsYWNlXFxuICAgIGZvciBlbGVtIGluIGl0OlxcbiAgICAgICAgayA9IGtleShlbGVtKVxcbiAgICAgICAgaWYgdG9wIDwgazpcXG4gICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoaywgb3JkZXIsIGVsZW0pKVxcbiAgICAgICAgICAgIHRvcCwgX29yZGVyLCBfZWxlbSA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgIG9yZGVyIC09IDFcXG4gICAgcmVzdWx0LnNvcnQocmV2ZXJzZT1UcnVlKVxcbiAgICByZXR1cm4gW2VsZW0gZm9yIChrLCBvcmRlciwgZWxlbSkgaW4gcmVzdWx0XVxcblxcbiMgSWYgYXZhaWxhYmxlLCB1c2UgQyBpbXBsZW1lbnRhdGlvblxcbnRyeTpcXG4gICAgZnJvbSBfaGVhcHEgaW1wb3J0ICpcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG50cnk6XFxuICAgIGZyb20gX2hlYXBxIGltcG9ydCBfaGVhcHJlcGxhY2VfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgX2hlYXBpZnlfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgX2hlYXBwb3BfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxuXFxuXFxuaWYgX19uYW1lX18gPT0gXFxcIl9fbWFpbl9fXFxcIjpcXG5cXG4gICAgaW1wb3J0IGRvY3Rlc3QgIyBwcmFnbWE6IG5vIGNvdmVyXFxuICAgIHByaW50KGRvY3Rlc3QudGVzdG1vZCgpKSAjIHByYWdtYTogbm8gY292ZXJcXG5cIixcInNyYy9saWIvaG1hYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaG1hYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2hvdHNob3QvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImhvdHNob3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9odG1sZW50aXR5ZGVmcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaHRtbGVudGl0eWRlZnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9odG1sbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJodG1sbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaHR0cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaHR0cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2lkbGVsaWIvSWNvbnMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkljb25zIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaWRsZWxpYi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaWRsZWxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2lob29rcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaWhvb2tzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW1hZ2UuanNcIjpcInZhciBJbWFnZU1vZCwkYnVpbHRpbm1vZHVsZTtJbWFnZU1vZHx8KEltYWdlTW9kPXt9LEltYWdlTW9kLmNhbnZhc0xpYj1bXSksJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZyxoPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcImltYWdlXFxcIil9O3JldHVybiBoLkltYWdlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxmdW5jdGlvbihhLGIpe3ZhciBjPU1hdGguZmxvb3I7ZT1mdW5jdGlvbihhKXthLndpZHRoPWEuaW1hZ2Uud2lkdGgsYS5oZWlnaHQ9YS5pbWFnZS5oZWlnaHQsYS5kZWxheT0wLGEudXBkYXRlQ291bnQ9MCxhLnVwZGF0ZUludGVydmFsPTEsYS5sYXN0eD0wLGEubGFzdHk9MCxhLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJjYW52YXNcXFwiKSxhLmNhbnZhcy5oZWlnaHQ9YS5oZWlnaHQsYS5jYW52YXMud2lkdGg9YS53aWR0aCxhLmN0eD1hLmNhbnZhcy5nZXRDb250ZXh0KFxcXCIyZFxcXCIpLGEuY3R4LmRyYXdJbWFnZShhLmltYWdlLDAsMCksYS5pbWFnZWRhdGE9YS5jdHguZ2V0SW1hZ2VEYXRhKDAsMCxhLndpZHRoLGEuaGVpZ2h0KX0sYi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKTt0cnl7YS5pbWFnZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChTay5mZmkucmVtYXBUb0pzKGIpKSxlKGEpfWNhdGNoKGIpe2EuaW1hZ2U9bnVsbH1pZihudWxsPT1hLmltYWdlKXJldHVybiBjPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uLGMucmVzdW1lPWZ1bmN0aW9uKCl7aWYoYy5kYXRhLmVycm9yKXRocm93IG5ldyBTay5idWlsdGluLklPRXJyb3IoYy5kYXRhLmVycm9yLm1lc3NhZ2UpfSxjLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6bmV3IFByb21pc2UoZnVuY3Rpb24oYyxkKXt2YXIgZj1uZXcgSW1hZ2U7Zi5jcm9zc09yaWdpbj1cXFwiXFxcIixmLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKEVycm9yKFxcXCJGYWlsZWQgdG8gbG9hZCBVUkw6IFxcXCIrZi5zcmMpKX0sZi5vbmxvYWQ9ZnVuY3Rpb24oKXthLmltYWdlPXRoaXMsZShhKSxjKCl9LGYuc3JjPWcoYil9KX0sY30pLGc9ZnVuY3Rpb24oYSl7bGV0IGI9U2suZmZpLnJlbWFwVG9KcyhhKTt0cnl7bGV0IGE9U2sucmVhZChiKSxjPWIuc3Vic3RyaW5nKGIubGFzdEluZGV4T2YoXFxcIi5cXFwiKSsxKTtyZXR1cm5gZGF0YTppbWFnZS8ke2N9O2Jhc2U2NCwgJHthfWB9Y2F0Y2goYSl7Y29uc29sZS5sb2coYCR7Yn0gaXMgbm90IGluIHRoZSBkYXRhYmFzZSAke2F9YCl9dmFyIGMsZCxlPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBTay5pbWFnZVByb3h5P1NrLmltYWdlUHJveHk6ZnVuY3Rpb24oYSl7cmV0dXJuIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiYVxcXCIpLGMuaHJlZj1kLHdpbmRvdy5sb2NhdGlvbi5ob3N0PT09Yy5ob3N0P2E6U2suaW1hZ2VQcm94eStcXFwiL1xcXCIrYX07cmV0dXJuIGQ9U2suZmZpLnJlbWFwVG9KcyhhKSxkPWUoZCksZH0sZj1mdW5jdGlvbihhLGIsYyl7aWYoMD5ifHwwPmN8fGI+PWEud2lkdGh8fGM+PWEuaGVpZ2h0KXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlBpeGVsIGluZGV4IG91dCBvZiByYW5nZS5cXFwiKX07dmFyIGk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldGRlbGF5XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksYS5kZWxheT1Tay5mZmkucmVtYXBUb0pzKGIpLGQ9U2suYnVpbHRpbi5hc251bSQoYyksYS51cGRhdGVJbnRlcnZhbD1kP2Q6MX07Yi5zZXRfZGVsYXk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKSxiLnNldERlbGF5PW5ldyBTay5idWlsdGluLmZ1bmMoaSk7dmFyIGo9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXTtmb3IoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cGl4ZWxzXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksYj0wO2I8YS5pbWFnZS5oZWlnaHQqYS5pbWFnZS53aWR0aDtiKyspZFtiXT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5nZXRQaXhlbCxbYSxiJWEuaW1hZ2Uud2lkdGgsYyhiL2EuaW1hZ2Uud2lkdGgpXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGQpfTtiLmdldF9waXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhqKSxiLmdldFBpeGVscz1uZXcgU2suYnVpbHRpbi5mdW5jKGopLGIuZ2V0RGF0YT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxnLGgsaixrLGw9W107Zm9yKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldERhdGFcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxiPTA7YjxhLmltYWdlLmhlaWdodCphLmltYWdlLndpZHRoO2IrKylkPWIlYS5pbWFnZS53aWR0aCxlPWMoYi9hLmltYWdlLndpZHRoKSxmKGEsZCxlKSxrPTQqZSphLndpZHRoKzQqZCxnPWEuaW1hZ2VkYXRhLmRhdGFba10saD1hLmltYWdlZGF0YS5kYXRhW2srMV0saj1hLmltYWdlZGF0YS5kYXRhW2srMl0sbFtiXT1uZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50XyhnKSxuZXcgU2suYnVpbHRpbi5pbnRfKGgpLG5ldyBTay5idWlsdGluLmludF8oaildKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChsKX0pO3ZhciBrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGcsaTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cGl4ZWxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMywzKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGM9U2suYnVpbHRpbi5hc251bSQoYyksZihhLGIsYyksaT00KmMqYS53aWR0aCs0KmIsZD1hLmltYWdlZGF0YS5kYXRhW2ldLGc9YS5pbWFnZWRhdGEuZGF0YVtpKzFdLGU9YS5pbWFnZWRhdGEuZGF0YVtpKzJdLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShoLlBpeGVsLFtkLGcsZSxiLGNdKX07Yi5nZXRfcGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKSxiLmdldFBpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMoayksZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247cmV0dXJuIGQucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sZC5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGQpe3ZhciBlPU1hdGgubWF4LGY9TWF0aC5hYnMsZz1NYXRoLm1pbjthLnVwZGF0ZUNvdW50KyssMD09YS51cGRhdGVDb3VudCVhLnVwZGF0ZUludGVydmFsPyhhLmxhc3R4K2EudXBkYXRlSW50ZXJ2YWw+PWEud2lkdGg/YS5sYXN0Q3R4LnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxhLmxhc3RVbHgsYS5sYXN0VWx5LDAsYS5sYXN0eSxhLndpZHRoLDIpOmEubGFzdHkrYS51cGRhdGVJbnRlcnZhbD49YS5oZWlnaHQ/YS5sYXN0Q3R4LnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxhLmxhc3RVbHgsYS5sYXN0VWx5LGEubGFzdHgsMCwyLGEuaGVpZ2h0KTphLmxhc3RDdHgucHV0SW1hZ2VEYXRhKGEuaW1hZ2VkYXRhLGEubGFzdFVseCxhLmxhc3RVbHksZyhiLGEubGFzdHgpLGcoYyxhLmxhc3R5KSxlKGYoYi1hLmxhc3R4KSwxKSxlKGYoYy1hLmxhc3R5KSwxKSksYS5sYXN0eD1iLGEubGFzdHk9YywwPGEuZGVsYXk/d2luZG93LnNldFRpbWVvdXQoZCxhLmRlbGF5KTpkKCkpOmQoKX0pfSxkfTt2YXIgbD1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZztyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0cGl4ZWxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsNCw0KSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGM9U2suYnVpbHRpbi5hc251bSQoYyksZihhLGIsYyksZz00KmMqYS53aWR0aCs0KmIsYS5pbWFnZWRhdGEuZGF0YVtnXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRSZWQsW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzFdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldEdyZWVuLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZysyXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRCbHVlLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZyszXT0yNTUsZChhLGIsYyl9O2Iuc2V0X3BpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobCksYi5zZXRQaXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKGwpO3ZhciBtPWZ1bmN0aW9uKGEsYixlKXt2YXIgZyxoLGk7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHBpeGVsYXRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMywzKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGc9YiVhLmltYWdlLndpZHRoLGg9YyhiL2EuaW1hZ2Uud2lkdGgpLGYoYSxnLGgpLGk9NCpoKmEud2lkdGgrNCpnLGEuaW1hZ2VkYXRhLmRhdGFbaV09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0UmVkLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbaSsxXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRHcmVlbixbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2krMl09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0Qmx1ZSxbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2krM109MjU1LGQoYSxnLGgpfTtiLnNldF9waXhlbF9hdD1uZXcgU2suYnVpbHRpbi5mdW5jKG0pLGIuc2V0UGl4ZWxBdD1uZXcgU2suYnVpbHRpbi5mdW5jKG0pO3ZhciBuPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxnO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ1cGRhdGVwaXhlbFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGM9U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuZ2V0WCxbYl0pKSxlPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldFksW2JdKSksZihhLGMsZSksZz00KmUqYS53aWR0aCs0KmMsYS5pbWFnZWRhdGEuZGF0YVtnXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRSZWQsW2JdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzFdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldEdyZWVuLFtiXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZysyXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRCbHVlLFtiXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZyszXT0yNTUsZChhLGMsZSl9O2IudXBkYXRlX3BpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobiksYi51cGRhdGVQaXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKG4pO3ZhciBvPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRoZWlnaHRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxuZXcgU2suYnVpbHRpbi5pbnRfKGEuaGVpZ2h0KX07Yi5nZXRfaGVpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMobyksYi5nZXRIZWlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhvKTt2YXIgcD1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0d2lkdGhcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxuZXcgU2suYnVpbHRpbi5pbnRfKGEud2lkdGgpfTtiLmdldF93aWR0aD1uZXcgU2suYnVpbHRpbi5mdW5jKHApLGIuZ2V0V2lkdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhwKSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJoZWlnaHRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLndpZHRoKTp2b2lkIDB9KSxiLl9fc2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtpZihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImhlaWdodFxcXCI9PT1ifHxcXFwid2lkdGhcXFwiPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIkNhbm5vdCBjaGFuZ2UgaGVpZ2h0IG9yIHdpZHRoIHRoZXkgY2FuIG9ubHkgYmUgc2V0IG9uIGNyZWF0aW9uXFxcIik7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIlVua25vd24gYXR0cmlidXRlOiBcXFwiK2IpfSksYi5kcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImRyYXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KSxlPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uLGUucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sZS5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3ZhciBmLGc7Yj1Tay5idWlsdGluLmFzbnVtJChiKSxjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksZj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRXaW4sW2JdKSxnPWYuZ2V0Q29udGV4dChcXFwiMmRcXFwiKSx2b2lkIDA9PT1jJiYoYz0wLGQ9MCksYS5sYXN0VWx4PWMsYS5sYXN0VWx5PWQsYS5sYXN0Q3R4PWcsZy5wdXRJbWFnZURhdGEoYS5pbWFnZWRhdGEsYyxkKSwwPGEuZGVsYXk/d2luZG93LnNldFRpbWVvdXQoZSxhLmRlbGF5KTp3aW5kb3cuc2V0VGltZW91dChlLDIwMCl9KX0sZX0pfSxcXFwiSW1hZ2VcXFwiLFtdKSxjPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwzLDMpLGEud2lkdGg9U2suYnVpbHRpbi5hc251bSQoYiksYS5oZWlnaHQ9U2suYnVpbHRpbi5hc251bSQoYyksYS5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIiksYS5jdHg9YS5jYW52YXMuZ2V0Q29udGV4dChcXFwiMmRcXFwiKSxhLmNhbnZhcy5oZWlnaHQ9YS5oZWlnaHQsYS5jYW52YXMud2lkdGg9YS53aWR0aCxhLmltYWdlZGF0YT1hLmN0eC5nZXRJbWFnZURhdGEoMCwwLGEud2lkdGgsYS5oZWlnaHQpfSl9LGguRW1wdHlJbWFnZT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGgsYyxcXFwiRW1wdHlJbWFnZVxcXCIsW2guSW1hZ2VdKSxiPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkLGUsYixmKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCw0LDYpLGEucmVkPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGEuZ3JlZW49U2suYnVpbHRpbi5hc251bSQoZCksYS5ibHVlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGEueD1Tay5idWlsdGluLmFzbnVtJChiKSxhLnk9U2suYnVpbHRpbi5hc251bSQoZil9KTt2YXIgYz1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cmVkXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLnJlZCl9O2IuZ2V0X3JlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGMpLGIuZ2V0UmVkPW5ldyBTay5idWlsdGluLmZ1bmMoYyk7dmFyIGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldGdyZWVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLmdyZWVuKX07Yi5nZXRfZ3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhkKSxiLmdldEdyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZCk7dmFyIGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldGJsdWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLmFzc2skKGEuYmx1ZSl9O2IuZ2V0X2JsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKSxiLmdldEJsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKTt2YXIgZj1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0eFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4uYXNzayQoYS54KX07Yi5nZXRfeD1uZXcgU2suYnVpbHRpbi5mdW5jKGYpLGIuZ2V0WD1uZXcgU2suYnVpbHRpbi5mdW5jKGYpO3ZhciBnPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXR5XFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLnkpfTtiLmdldF95PW5ldyBTay5idWlsdGluLmZ1bmMoZyksYi5nZXRZPW5ldyBTay5idWlsdGluLmZ1bmMoZyk7dmFyIGg9ZnVuY3Rpb24oYSxiKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRyZWRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLnJlZD1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfcmVkPW5ldyBTay5idWlsdGluLmZ1bmMoaCksYi5zZXRSZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhoKTt2YXIgaT1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldGdyZWVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS5ncmVlbj1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfZ3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKSxiLnNldEdyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoaSk7dmFyIGo9ZnVuY3Rpb24oYSxjKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRibHVlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS5ibHVlPVNrLmJ1aWx0aW4uYXNudW0kKGMpfTtiLnNldF9ibHVlPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5zZXRCbHVlPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwicmVkXFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoYS5yZWQpOlxcXCJncmVlblxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS5ncmVlbik6XFxcImJsdWVcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEuYmx1ZSk6dm9pZCAwfSksYi5fX3NldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtiPVNrLmZmaS5yZW1hcFRvSnMoYiksKFxcXCJyZWRcXFwiPT09Ynx8XFxcImdyZWVuXFxcIj09PWJ8fFxcXCJibHVlXFxcIj09PWIpJiYoYVtiXT1Tay5idWlsdGluLmFzbnVtJChjKSl9KTt2YXIgaz1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHhcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLng9U2suYnVpbHRpbi5hc251bSQoYil9O2Iuc2V0X3g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKSxiLnNldFg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKTt2YXIgbD1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHlcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLnk9U2suYnVpbHRpbi5hc251bSQoYil9O2Iuc2V0X3k9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKSxiLnNldFk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKSxiLl9fZ2V0aXRlbV9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5idWlsdGluLmFzbnVtJChiKSwwPT09Yik/YS5yZWQ6MT09Yj9hLmdyZWVuOjI9PWI/YS5ibHVlOnZvaWQgMH0pLGIuX19zdHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5mZmkucmVtYXBUb1B5KFxcXCJbXFxcIithLnJlZCtcXFwiLFxcXCIrYS5ncmVlbitcXFwiLFxcXCIrYS5ibHVlK1xcXCJdXFxcIil9KSxiLmdldENvbG9yVHVwbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe30pLGIuc2V0UmFuZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2EubWF4PVNrLmJ1aWx0aW4uYXNudW0kKGIpfSl9LGguUGl4ZWw9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhoLGIsXFxcIlBpeGVsXFxcIixbXSksYT1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMyksZD1JbWFnZU1vZC5jYW52YXNMaWJbU2suY2FudmFzXSx2b2lkIDA9PT1kPyhlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU2suY2FudmFzKSxhLnRoZVNjcmVlbj1lLGYuYXBwZW5kQ2hpbGQoZSksSW1hZ2VNb2QuY2FudmFzTGliW1NrLmNhbnZhc109ZSxJbWFnZU1vZC5jYW52YXNMaWJbU2suY2FudmFzXT1hLnRoZVNjcmVlbik6KGEudGhlU2NyZWVuPWQsYS50aGVTY3JlZW4uaGVpZ2h0PWEudGhlU2NyZWVuLmhlaWdodCksdm9pZCAwPT09Yj8oU2suYXZhaWxhYmxlSGVpZ2h0JiYoYS50aGVTY3JlZW4uaGVpZ2h0PVNrLmF2YWlsYWJsZUhlaWdodCksU2suYXZhaWxhYmxlV2lkdGgmJihhLnRoZVNjcmVlbi53aWR0aD1Tay5hdmFpbGFibGVXaWR0aCkpOihhLnRoZVNjcmVlbi5oZWlnaHQ9Yy52LGEudGhlU2NyZWVuLndpZHRoPWIudiksYS50aGVTY3JlZW4uc3R5bGUuZGlzcGxheT1cXFwiYmxvY2tcXFwifSksYi5nZXRXaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gYS50aGVTY3JlZW59KSxiLmV4aXRvbmNsaWNrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS50aGVTY3JlZW4uaWQ7YS50aGVTY3JlZW4ub25jbGljaz1mdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpLnN0eWxlLmRpc3BsYXk9XFxcIm5vbmVcXFwiLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpLm9uY2xpY2s9bnVsbCxkZWxldGUgSW1hZ2VNb2QuY2FudmFzTGliW2JdfX0pfSxoLkltYWdlV2luPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxhLFxcXCJJbWFnZVdpblxcXCIsW10pLGh9O1wiLFwic3JjL2xpYi9pbWFwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbWFwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW1naGRyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbWdoZHIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pbXB1dGlsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbXB1dGlsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW8ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImlvIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaXRlcnRvb2xzLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjb21iaW5hdGlvbnNOZXcoYSxiLGMpe2xldCBkLGU7W2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoYS50cCRuYW1lLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJyXFxcIl0sYixjLFtdKTtjb25zdCBmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGQpO2lmKGU9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGUsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSwwPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2lmKHRoaXM9PT1hKXJldHVybiBuZXcgYS5jb25zdHJ1Y3RvcihmLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb25zdHJ1Y3Rvci5jYWxsKGIsZixlKSxifX12YXIgYT17fTtyZXR1cm4gYS5hY2N1bXVsYXRlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmFjY3VtdWxhdGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBhY2N1bXVsYXRlKGEsYixjKXt0aGlzLml0ZXI9YSx0aGlzLmZ1bmM9Yix0aGlzLnRvdGFsPWMsdGhpcy50cCRpdGVybmV4dD0oKT0+KHRoaXMudG90YWw9U2suYnVpbHRpbi5jaGVja05vbmUodGhpcy50b3RhbCk/dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk6dGhpcy50b3RhbCx0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LHRoaXMudG90YWwpfSxpdGVybmV4dCgpe2xldCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMCE9PWEpcmV0dXJuIHRoaXMudG90YWw9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMuZnVuYyxbdGhpcy50b3RhbCxhXSksdGhpcy50b3RhbH0sc2xvdHM6e3RwJGRvYzpcXFwiYWNjdW11bGF0ZShpdGVyYWJsZVssIGZ1bmMsIGluaXRpYWxdKSAtLT4gYWNjdW11bGF0ZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHNlcmllcyBvZiBhY2N1bXVsYXRlZCBzdW1zIChvciBvdGhlciBiaW5hcnkgZnVuY3Rpb24gcmVzdWx0cykuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImFjY3VtdWxhdGVcXFwiLGIsMCwyKTtsZXRbZCxlLGZdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJhY2N1bXVsYXRlXFxcIixbXFxcIml0ZXJhYmxlXFxcIixcXFwiZnVuY1xcXCIsXFxcImluaXRpYWxcXFwiXSxiLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtpZihkPVNrLmFic3RyLml0ZXIoZCksZT1Tay5idWlsdGluLmNoZWNrTm9uZShlKT9uZXcgU2suYnVpbHRpbi5mdW5jKChjLGEpPT5Tay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkFkZFxcXCIpKTplLHRoaXM9PT1hLmFjY3VtdWxhdGUucHJvdG90eXBlKXJldHVybiBuZXcgYS5hY2N1bXVsYXRlKGQsZSxmKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuYWNjdW11bGF0ZS5jYWxsKGIsZCxlLGYpLGJ9fX19KSxhLmNoYWluPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNoYWluXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY2hhaW4oYSl7dGhpcy5pdGVyYWJsZXM9YSx0aGlzLmN1cnJlbnRfaXQ9bnVsbCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT4odGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCx0aGlzLmN1cnJlbnRfaXQ9dGhpcy5pdGVyYWJsZXMudHAkaXRlcm5leHQoKSx2b2lkIDA9PT10aGlzLmN1cnJlbnRfaXQpP3ZvaWQodGhpcy50cCRpdGVybmV4dD0oKT0+dm9pZCAwKToodGhpcy5jdXJyZW50X2l0PVNrLmFic3RyLml0ZXIodGhpcy5jdXJyZW50X2l0KSx0aGlzLnRwJGl0ZXJuZXh0KCkpfSxpdGVybmV4dCgpe2ZvcihsZXQgYTt2b2lkIDA9PT1hOylpZihhPXRoaXMuY3VycmVudF9pdC50cCRpdGVybmV4dCgpLHZvaWQgMD09PWEpe2lmKHRoaXMuY3VycmVudF9pdD10aGlzLml0ZXJhYmxlcy50cCRpdGVybmV4dCgpLHZvaWQgMD09PXRoaXMuY3VycmVudF9pdClyZXR1cm4gdm9pZCh0aGlzLnRwJGl0ZXJuZXh0PSgpPT52b2lkIDApO3RoaXMuY3VycmVudF9pdD1Tay5hYnN0ci5pdGVyKHRoaXMuY3VycmVudF9pdCl9ZWxzZSByZXR1cm4gYX0sc2xvdHM6e3RwJGRvYzpcXFwiY2hhaW4oKml0ZXJhYmxlcykgLS0+IGNoYWluIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSBjaGFpbiBvYmplY3Qgd2hvc2UgLl9fbmV4dF9fKCkgbWV0aG9kIHJldHVybnMgZWxlbWVudHMgZnJvbSB0aGVcXFxcbmZpcnN0IGl0ZXJhYmxlIHVudGlsIGl0IGlzIGV4aGF1c3RlZCwgdGhlbiBlbGVtZW50cyBmcm9tIHRoZSBuZXh0XFxcXG5pdGVyYWJsZSwgdW50aWwgYWxsIG9mIHRoZSBpdGVyYWJsZXMgYXJlIGV4aGF1c3RlZC5cXFwiLHRwJG5ldyhiLGMpe2lmKFNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImNoYWluXFxcIixjKSxiPW5ldyBTay5idWlsdGluLnR1cGxlKGIuc2xpY2UoMCkpLnRwJGl0ZXIoKSx0aGlzPT09YS5jaGFpbi5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmNoYWluKGIpO2Vsc2V7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jaGFpbi5jYWxsKGMsYiksY319fSxjbGFzc21ldGhvZHM6e2Zyb21faXRlcmFibGU6eyRtZXRoKGIpe2NvbnN0IGM9U2suYWJzdHIuaXRlcihiKTtyZXR1cm4gbmV3IGEuY2hhaW4oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlxcXCJjaGFpbi5mcm9tX2l0ZXJhYmxlKGl0ZXJhYmxlKSAtLT4gY2hhaW4gb2JqZWN0XFxcXG5cXFxcbkFsdGVybmF0ZSBjaGFpbigpIGNvbnN0cnVjdG9yIHRha2luZyBhIHNpbmdsZSBpdGVyYWJsZSBhcmd1bWVudFxcXFxudGhhdCBldmFsdWF0ZXMgbGF6aWx5LlxcXCIsJHRleHRzaWc6bnVsbH19fSksYS5jb21iaW5hdGlvbnM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY29tYmluYXRpb25zXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY29tYmluYXRpb25zKGEsYil7dGhpcy5wb29sPWEsdGhpcy5yPWIsdGhpcy5pbmRpY2VzPUFycmF5KGIpLmZpbGwoKS5tYXAoKGEsYik9PmIpLHRoaXMubj1hLmxlbmd0aCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYoISh0aGlzLnI+dGhpcy5uKSlyZXR1cm4gdGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCxuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnBvb2wuc2xpY2UoMCx0aGlzLnIpKX19LGl0ZXJuZXh0KCl7bGV0IGEsYj0hMTtmb3IoYT10aGlzLnItMTswPD1hO2EtLSlpZih0aGlzLmluZGljZXNbYV0hPWErdGhpcy5uLXRoaXMucil7Yj0hMDticmVha31pZighYilyZXR1cm4gdm9pZCh0aGlzLnI9MCk7dGhpcy5pbmRpY2VzW2FdKys7Zm9yKGxldCBiPWErMTtiPHRoaXMucjtiKyspdGhpcy5pbmRpY2VzW2JdPXRoaXMuaW5kaWNlc1tiLTFdKzE7Y29uc3QgYz10aGlzLmluZGljZXMubWFwKGE9PnRoaXMucG9vbFthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGMpfSxzbG90czp7dHAkZG9jOlxcXCJjb21iaW5hdGlvbnMoaXRlcmFibGUsIHIpIC0tPiBjb21iaW5hdGlvbnMgb2JqZWN0XFxcXG5cXFxcblJldHVybiBzdWNjZXNzaXZlIHItbGVuZ3RoIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUuXFxcXG5cXFxcbmNvbWJpbmF0aW9ucyhyYW5nZSg0KSwgMykgLS0+ICgwLDEsMiksICgwLDEsMyksICgwLDIsMyksICgxLDIsMylcXFwiLHRwJG5ldyhiLGMpe3JldHVybiBjb21iaW5hdGlvbnNOZXcuY2FsbCh0aGlzLGEuY29tYmluYXRpb25zLnByb3RvdHlwZSxiLGMpfX19KSxhLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoYSxiKXt0aGlzLnBvb2w9YSx0aGlzLnI9Yix0aGlzLmluZGljZXM9QXJyYXkoYikuZmlsbCgwKSx0aGlzLm49YS5sZW5ndGgsdGhpcy50cCRpdGVybmV4dD0oKT0+e2lmKCF0aGlzLnJ8fHRoaXMubil7dGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dDtjb25zdCBhPXRoaXMuaW5kaWNlcy5tYXAoYT0+dGhpcy5wb29sW2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9fX0saXRlcm5leHQoKXtsZXQgYSxiPSExO2ZvcihhPXRoaXMuci0xOzA8PWE7YS0tKWlmKHRoaXMuaW5kaWNlc1thXSE9dGhpcy5uLTEpe2I9ITA7YnJlYWt9aWYoIWIpcmV0dXJuIHZvaWQodGhpcy5yPTApO2NvbnN0IGM9dGhpcy5pbmRpY2VzW2FdKzE7Zm9yKGxldCBiPWE7Yjx0aGlzLnI7YisrKXRoaXMuaW5kaWNlc1tiXT1jO2NvbnN0IGQ9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShkKX0sc2xvdHM6e3RwJGRvYzpcXFwiY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoaXRlcmFibGUsIHIpIC0tPiBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudCBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHN1Y2Nlc3NpdmUgci1sZW5ndGggY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIGluIHRoZSBpdGVyYWJsZVxcXFxuYWxsb3dpbmcgaW5kaXZpZHVhbCBlbGVtZW50cyB0byBoYXZlIHN1Y2Nlc3NpdmUgcmVwZWF0cy5cXFxcbmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KCdBQkMnLCAyKSAtLT4gQUEgQUIgQUMgQkIgQkMgQ0NcXFwiLHRwJG5ldyhiLGMpe3JldHVybiBjb21iaW5hdGlvbnNOZXcuY2FsbCh0aGlzLGEuY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQucHJvdG90eXBlLGIsYyl9fX0pLGEuY29tcHJlc3M9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY29tcHJlc3NcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjb21wcmVzcyhhLGIpe3RoaXMuZGF0YT1hLHRoaXMuc2VsZWN0b3JzPWJ9LGl0ZXJuZXh0KCl7bGV0IGE9dGhpcy5kYXRhLnRwJGl0ZXJuZXh0KCksYj10aGlzLnNlbGVjdG9ycy50cCRpdGVybmV4dCgpO2Zvcig7dm9pZCAwIT09YSYmdm9pZCAwIT09Yjspe2lmKFNrLm1pc2NldmFsLmlzVHJ1ZShiKSlyZXR1cm4gYTthPXRoaXMuZGF0YS50cCRpdGVybmV4dCgpLGI9dGhpcy5zZWxlY3RvcnMudHAkaXRlcm5leHQoKX19LHNsb3RzOnt0cCRkb2M6XFxcImNvbXByZXNzKGRhdGEsIHNlbGVjdG9ycykgLS0+IGl0ZXJhdG9yIG92ZXIgc2VsZWN0ZWQgZGF0YVxcXFxuXFxcXG5SZXR1cm4gZGF0YSBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRydWUgc2VsZWN0b3IgZWxlbWVudHMuXFxcXG5Gb3JtcyBhIHNob3J0ZXIgaXRlcmF0b3IgZnJvbSBzZWxlY3RlZCBkYXRhIGVsZW1lbnRzIHVzaW5nIHRoZVxcXFxuc2VsZWN0b3JzIHRvIGNob29zZSB0aGUgZGF0YSBlbGVtZW50cy5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImNvbXByZXNzXFxcIixbXFxcImRhdGFcXFwiLFxcXCJzZWxlY3RvcnNcXFwiXSxiLGMsW10pLGQ9U2suYWJzdHIuaXRlcihkKSxlPVNrLmFic3RyLml0ZXIoZSksdGhpcz09PWEuY291bnQucHJvdG90eXBlKXJldHVybiBuZXcgYS5jb21wcmVzcyhkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb21wcmVzcy5jYWxsKGIsZCxlKSxifX19fSksYS5jb3VudD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jb3VudFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGNvdW50KGEsYil7dGhpcy5zdGFydD1hLHRoaXMuc3RlcD1ifSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy5zdGFydDtyZXR1cm4gdGhpcy5zdGFydD1Tay5hYnN0ci5udW1iZXJCaW5PcCh0aGlzLnN0YXJ0LHRoaXMuc3RlcCxcXFwiQWRkXFxcIiksYX0sc2xvdHM6e3RwJGRvYzpcXFwiY291bnQoc3RhcnQ9MCwgc3RlcD0xKSAtLT4gY291bnQgb2JqZWN0XFxcXG5cXFxcblJldHVybiBhIGNvdW50IG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBjb25zZWN1dGl2ZSB2YWx1ZXMuXFxcXG5FcXVpdmFsZW50IHRvOlxcXFxuXFxcXG4gICAgZGVmIGNvdW50KGZpcnN0dmFsPTAsIHN0ZXA9MSk6XFxcXG4gICAgICAgIHggPSBmaXJzdHZhbFxcXFxuICAgICAgICB3aGlsZSAxOlxcXFxuICAgICAgICAgICAgeWllbGQgeFxcXFxuICAgICAgICAgICAgeCArPSBzdGVwXFxcXG5cXFwiLHRwJG5ldyhiLGMpe2NvbnN0W2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImNvdW50XFxcIixbXFxcInN0YXJ0XFxcIixcXFwic3RlcFxcXCJdLGIsYyxbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDEpXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZCkmJiFTay5idWlsdGluLmNoZWNrQ29tcGxleChkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImEgbnVtYmVyIGlzIHJlcXVpcmVkXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZSkmJiFTay5idWlsdGluLmNoZWNrQ29tcGxleChlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImEgbnVtYmVyIGlzIHJlcXVpcmVkXFxcIik7aWYodGhpcz09PWEuY291bnQucHJvdG90eXBlKXJldHVybiBuZXcgYS5jb3VudChkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb3VudC5jYWxsKGIsZCxlKSxifX0sJHIoKXtjb25zdCBhPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5zdGFydCk7bGV0IGI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0ZXApO3JldHVybiBiPVxcXCIxXFxcIj09PWI/XFxcIlxcXCI6XFxcIiwgXFxcIitiLG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYStiK1xcXCIpXFxcIil9fX0pLGEuY3ljbGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY3ljbGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjeWNsZShhKXt0aGlzLml0ZXI9YSx0aGlzLnNhdmVkPVtdLHRoaXMuY29uc3VtZWQ9ITEsdGhpcy5pPTAsdGhpcy5sZW5ndGh9LGl0ZXJuZXh0KCl7bGV0IGE7aWYoIXRoaXMuY29uc3VtZWQpe2lmKGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwIT09YSlyZXR1cm4gdGhpcy5zYXZlZC5wdXNoKGEpLGE7aWYodGhpcy5jb25zdW1lZD0hMCx0aGlzLmxlbmd0aD10aGlzLnNhdmVkLmxlbmd0aCwhdGhpcy5sZW5ndGgpcmV0dXJufXJldHVybiBhPXRoaXMuc2F2ZWRbdGhpcy5pXSx0aGlzLmk9KHRoaXMuaSsxKSV0aGlzLmxlbmd0aCxhfSxzbG90czp7dHAkZG9jOlxcXCJjeWNsZShpdGVyYWJsZSkgLS0+IGN5Y2xlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUgdW50aWwgaXQgaXMgZXhoYXVzdGVkLlxcXFxuVGhlbiByZXBlYXQgdGhlIHNlcXVlbmNlIGluZGVmaW5pdGVseS5cXFwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKFxcXCJjeWNsZVxcXCIsYixjKTtjb25zdCBkPVNrLmFic3RyLml0ZXIoYlswXSk7aWYodGhpcz09PWEuY3ljbGUucHJvdG90eXBlKXJldHVybiBuZXcgYS5jeWNsZShkKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuY3ljbGUuY2FsbChiLGQpLGJ9fX19KSxhLmRyb3B3aGlsZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5kcm9wd2hpbGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBkcm9wd2hpbGUoYSxiKXt0aGlzLnByZWRpY2F0ZT1hLHRoaXMuaXRlcj1iLHRoaXMucGFzc2VkfSxpdGVybmV4dCgpe2xldCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2Zvcig7dm9pZCAwPT09dGhpcy5wYXNzZWQmJnZvaWQgMCE9PWE7KXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnByZWRpY2F0ZSxbYV0pO2lmKCFTay5taXNjZXZhbC5pc1RydWUoYikpcmV0dXJuIHRoaXMucGFzc2VkPSEwLGE7YT10aGlzLml0ZXIudHAkaXRlcm5leHQoKX1yZXR1cm4gYX0sc2xvdHM6e3RwJGRvYzpcXFwiZHJvcHdoaWxlKHByZWRpY2F0ZSwgaXRlcmFibGUpIC0tPiBkcm9wd2hpbGUgb2JqZWN0XFxcXG5cXFxcbkRyb3AgaXRlbXMgZnJvbSB0aGUgaXRlcmFibGUgd2hpbGUgcHJlZGljYXRlKGl0ZW0pIGlzIHRydWUuXFxcXG5BZnRlcndhcmRzLCByZXR1cm4gZXZlcnkgZWxlbWVudCB1bnRpbCB0aGUgaXRlcmFibGUgaXMgZXhoYXVzdGVkLlxcXCIsdHAkbmV3KGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiZHJvcHdoaWxlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImRyb3B3aGlsZVxcXCIsYiwyLDIpO2NvbnN0IGQ9YlswXSxlPVNrLmFic3RyLml0ZXIoYlsxXSk7aWYodGhpcz09PWEuZHJvcHdoaWxlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZHJvcHdoaWxlKGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmRyb3B3aGlsZS5jYWxsKGIsZCxlKSxifX19fSksYS5maWx0ZXJmYWxzZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5maWx0ZXJmYWxzZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGZpbHRlcmZhbHNlKGEsYil7dGhpcy5wcmVkaWNhdGU9YSx0aGlzLml0ZXI9Yn0saXRlcm5leHQoKXtsZXQgYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKTtpZih2b2lkIDAhPT1hKXtmb3IobGV0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSk7U2subWlzY2V2YWwuaXNUcnVlKGIpOyl7aWYoYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKSx2b2lkIDA9PT1hKXJldHVybjtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnByZWRpY2F0ZSxbYV0pfXJldHVybiBhfX0sc2xvdHM6e3RwJGRvYzpcXFwiZmlsdGVyZmFsc2UoZnVuY3Rpb24gb3IgTm9uZSwgc2VxdWVuY2UpIC0tPiBmaWx0ZXJmYWxzZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHRob3NlIGl0ZW1zIG9mIHNlcXVlbmNlIGZvciB3aGljaCBmdW5jdGlvbihpdGVtKSBpcyBmYWxzZS5cXFxcbklmIGZ1bmN0aW9uIGlzIE5vbmUsIHJldHVybiB0aGUgaXRlbXMgdGhhdCBhcmUgZmFsc2UuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJmaWx0ZXJmYWxzZVxcXCIsYyksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJmaWx0ZXJmYWxzZVxcXCIsYiwyLDIpO2NvbnN0IGQ9U2suYnVpbHRpbi5jaGVja05vbmUoYlswXSk/U2suYnVpbHRpbi5ib29sOmJbMF0sZT1Tay5hYnN0ci5pdGVyKGJbMV0pO2lmKHRoaXM9PT1hLmZpbHRlcmZhbHNlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZmlsdGVyZmFsc2UoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuZmlsdGVyZmFsc2UuY2FsbChiLGQsZSksYn19fX0pLGEuX2dyb3VwZXI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuX2dyb3VwZXJcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBfZ3JvdXBlcihhKXt0aGlzLmdyb3VwYnk9YSx0aGlzLnRndGtleT1hLnRndGtleSx0aGlzLmlkPWEuaWR9LGl0ZXJuZXh0KCl7Y29uc3QgYT1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5ncm91cGJ5LmN1cnJrZXksdGhpcy50Z3RrZXksXFxcIkVxXFxcIik7aWYodGhpcy5ncm91cGJ5LmlkPT09dGhpcy5pZCYmYSl7bGV0IGE9dGhpcy5ncm91cGJ5LmN1cnJ2YWw7cmV0dXJuIHRoaXMuZ3JvdXBieS5jdXJydmFsPXRoaXMuZ3JvdXBieS5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwIT09dGhpcy5ncm91cGJ5LmN1cnJ2YWwmJih0aGlzLmdyb3VwYnkuY3VycmtleT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5ncm91cGJ5LmtleWYsW3RoaXMuZ3JvdXBieS5jdXJydmFsXSkpLGF9fX0pLGEuZ3JvdXBieT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5ncm91cGJ5XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZ3JvdXBieShhLGIpe3RoaXMuaXRlcj1hLHRoaXMua2V5Zj1iLHRoaXMuY3VycnZhbCx0aGlzLmN1cnJrZXk9dGhpcy50Z3RrZXk9bmV3IFNrLmJ1aWx0aW4ub2JqZWN0LHRoaXMuaWR9LGl0ZXJuZXh0KCl7dGhpcy5pZD17fTtmb3IobGV0IGE9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuY3VycmtleSx0aGlzLnRndGtleSxcXFwiRXFcXFwiKTthOyl7aWYodGhpcy5jdXJydmFsPXRoaXMuaXRlci50cCRpdGVybmV4dCgpLHZvaWQgMD09PXRoaXMuY3VycnZhbClyZXR1cm47dGhpcy5jdXJya2V5PVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmtleWYsW3RoaXMuY3VycnZhbF0pLGE9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuY3VycmtleSx0aGlzLnRndGtleSxcXFwiRXFcXFwiKX10aGlzLnRndGtleT10aGlzLmN1cnJrZXk7Y29uc3QgYj1uZXcgYS5fZ3JvdXBlcih0aGlzKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXMuY3VycmtleSxiXSl9LHNsb3RzOnt0cCRkb2M6XFxcImdyb3VwYnkoaXRlcmFibGUsIGtleT1Ob25lKSAtPiBtYWtlIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBjb25zZWN1dGl2ZVxcXFxua2V5cyBhbmQgZ3JvdXBzIGZyb20gdGhlIGl0ZXJhYmxlLiAgSWYgdGhlIGtleSBmdW5jdGlvbiBpcyBub3Qgc3BlY2lmaWVkIG9yXFxcXG5pcyBOb25lLCB0aGUgZWxlbWVudCBpdHNlbGYgaXMgdXNlZCBmb3IgZ3JvdXBpbmcuXFxcXG5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImdyb3VwYnlcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJrZXlcXFwiXSxiLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pLGQ9U2suYWJzdHIuaXRlcihkKSxlPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGUpP25ldyBTay5idWlsdGluLmZ1bmMoYT0+YSk6ZSx0aGlzPT09YS5ncm91cGJ5LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZ3JvdXBieShkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5ncm91cGJ5LmNhbGwoYixkLGUpLGJ9fX19KSxhLmlzbGljZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5pc2xpY2VcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBpc2xpY2UoYSxiLGMsZCl7dGhpcy5pdGVyPWEsdGhpcy5wcmV2aXQ9Yix0aGlzLnN0b3A9Yyx0aGlzLnN0ZXA9ZCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYodGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCx0aGlzLnByZXZpdD49dGhpcy5zdG9wKXtmb3IobGV0IGE9MDthPHRoaXMuc3RvcDthKyspdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJufWZvcihsZXQgYT0wO2E8dGhpcy5wcmV2aXQ7YSsrKXRoaXMuaXRlci50cCRpdGVybmV4dCgpO3JldHVybiB0aGlzLml0ZXIudHAkaXRlcm5leHQoKX19LGl0ZXJuZXh0KCl7aWYodGhpcy5wcmV2aXQrdGhpcy5zdGVwPj10aGlzLnN0b3Ape2ZvcihsZXQgYT10aGlzLnByZXZpdCsxO2E8dGhpcy5zdG9wO2ErKyl0aGlzLnByZXZpdCs9dGhpcy5zdGVwLHRoaXMuaXRlci50cCRpdGVybmV4dCgpO3JldHVybn1mb3IobGV0IGE9dGhpcy5wcmV2aXQrMTthPHRoaXMucHJldml0K3RoaXMuc3RlcDthKyspdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJuIHRoaXMucHJldml0Kz10aGlzLnN0ZXAsdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCl9LHNsb3RzOnt0cCRkb2M6XFxcImlzbGljZShpdGVyYWJsZSwgc3RvcCkgLS0+IGlzbGljZSBvYmplY3RcXFxcbmlzbGljZShpdGVyYWJsZSwgc3RhcnQsIHN0b3BbLCBzdGVwXSkgLS0+IGlzbGljZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGFuIGl0ZXJhdG9yIHdob3NlIG5leHQoKSBtZXRob2QgcmV0dXJucyBzZWxlY3RlZCB2YWx1ZXMgZnJvbSBhblxcXFxuaXRlcmFibGUuICBJZiBzdGFydCBpcyBzcGVjaWZpZWQsIHdpbGwgc2tpcCBhbGwgcHJlY2VkaW5nIGVsZW1lbnRzO1xcXFxub3RoZXJ3aXNlLCBzdGFydCBkZWZhdWx0cyB0byB6ZXJvLiAgU3RlcCBkZWZhdWx0cyB0byBvbmUuICBJZlxcXFxuc3BlY2lmaWVkIGFzIGFub3RoZXIgdmFsdWUsIHN0ZXAgZGV0ZXJtaW5lcyBob3cgbWFueSB2YWx1ZXMgYXJlIFxcXFxuc2tpcHBlZCBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMuICBXb3JrcyBsaWtlIGEgc2xpY2UoKSBvbiBhIGxpc3RcXFxcbmJ1dCByZXR1cm5zIGFuIGl0ZXJhdG9yLlxcXCIsdHAkbmV3KGIsYyl7dmFyIGQ9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiaXNsaWNlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImlzbGljZVxcXCIsYiwyLDQpO2NvbnN0IGU9U2suYWJzdHIuaXRlcihiWzBdKTtsZXQgZj1iWzFdLGc9YlsyXSxoPWJbM107aWYodm9pZCAwPT09Zz8oZz1mLGY9U2suYnVpbHRpbi5ub25lLm5vbmUkLGg9U2suYnVpbHRpbi5ub25lLm5vbmUkKTp2b2lkIDA9PT1oJiYoaD1Tay5idWlsdGluLm5vbmUubm9uZSQpLCEoU2suYnVpbHRpbi5jaGVja05vbmUoZyl8fFNrLm1pc2NldmFsLmlzSW5kZXgoZykpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0b3AgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuXFxcIik7ZWxzZSBpZihnPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGcpP2Q6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGcpLDA+Z3x8Zz5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0b3AgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuXFxcIik7aWYoIShTay5idWlsdGluLmNoZWNrTm9uZShmKXx8U2subWlzY2V2YWwuaXNJbmRleChmKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtlbHNlIGlmKGY9U2suYnVpbHRpbi5jaGVja05vbmUoZik/MDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZiksMD5mfHxmPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtpZighKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGgpfHxTay5taXNjZXZhbC5pc0luZGV4KGgpKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTdGVwIGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciBOb25lXFxcIik7ZWxzZSBpZihoPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGgpPzE6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGgpLDA+PWh8fGg+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTdGVwIGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciBOb25lLlxcXCIpO2lmKHRoaXM9PT1hLmlzbGljZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmlzbGljZShlLGYsZyxoKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuaXNsaWNlLmNhbGwoYixlLGYsZyxoKSxifX19fSksYS5wZXJtdXRhdGlvbnM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMucGVybXV0YXRpb25zXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcGVybXV0YXRpb25zKGEsYil7dGhpcy5wb29sPWEsdGhpcy5yPWI7Y29uc3QgYz1hLmxlbmd0aDt0aGlzLmluZGljZXM9QXJyYXkoYykuZmlsbCgpLm1hcCgoYSxiKT0+YiksdGhpcy5jeWNsZXM9QXJyYXkoYikuZmlsbCgpLm1hcCgoYSxiKT0+Yy1iKSx0aGlzLm49Yyx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYoISh0aGlzLnI+dGhpcy5uKSlyZXR1cm4gdGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCxuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnBvb2wuc2xpY2UoMCx0aGlzLnIpKX19LGl0ZXJuZXh0KCl7Zm9yKGxldCBhPXRoaXMuci0xOzA8PWE7YS0tKWlmKHRoaXMuY3ljbGVzW2FdLS0sMD09dGhpcy5jeWNsZXNbYV0pdGhpcy5pbmRpY2VzLnB1c2godGhpcy5pbmRpY2VzLnNwbGljZShhLDEpWzBdKSx0aGlzLmN5Y2xlc1thXT10aGlzLm4tYTtlbHNle2o9dGhpcy5jeWNsZXNbYV0sW3RoaXMuaW5kaWNlc1thXSx0aGlzLmluZGljZXNbdGhpcy5uLWpdXT1bdGhpcy5pbmRpY2VzW3RoaXMubi1qXSx0aGlzLmluZGljZXNbYV1dO2NvbnN0IGI9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pLnNsaWNlKDAsdGhpcy5yKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYil9dGhpcy5yPTB9LHNsb3RzOnt0cCRkb2M6XFxcInBlcm11dGF0aW9ucyhpdGVyYWJsZVssIHJdKSAtLT4gcGVybXV0YXRpb25zIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSByLWxlbmd0aCBwZXJtdXRhdGlvbnMgb2YgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlLlxcXFxuXFxcXG5wZXJtdXRhdGlvbnMocmFuZ2UoMyksIDIpIC0tPiAoMCwxKSwgKDAsMiksICgxLDApLCAoMSwyKSwgKDIsMCksICgyLDEpXFxcIix0cCRuZXcoYixjKXtsZXQgZCxlO1tkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJwZXJtdXRhdGlvbnNcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJyXFxcIl0sYixjLFtTay5idWlsdGluLm5vbmUubm9uZSRdKTtjb25zdCBmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGQpO2lmKGU9U2suYnVpbHRpbi5jaGVja05vbmUoZSk/Zi5sZW5ndGg6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGUsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSwwPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2lmKHRoaXM9PT1hLnBlcm11dGF0aW9ucy5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnBlcm11dGF0aW9ucyhmLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5wZXJtdXRhdGlvbnMuY2FsbChiLGYsZSksYn19fX0pLGEucHJvZHVjdD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5wcm9kdWN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcHJvZHVjdChhKXt0aGlzLnBvb2xzPWEsdGhpcy5uPWEubGVuZ3RoLHRoaXMuaW5kaWNlcz1BcnJheShhLmxlbmd0aCkuZmlsbCgwKSx0aGlzLnBvb2xfc2l6ZXM9YS5tYXAoYT0+YS5sZW5ndGgpLHRoaXMudHAkaXRlcm5leHQ9KCk9Pnt0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0O2NvbnN0IGE9dGhpcy5pbmRpY2VzLm1hcCgoYSxiKT0+dGhpcy5wb29sc1tiXVt0aGlzLmluZGljZXNbYl1dKTtyZXR1cm4gYS5zb21lKGE9PnZvaWQgMD09PWEpP3ZvaWQodGhpcy5uPTApOm5ldyBTay5idWlsdGluLnR1cGxlKGEpfX0saXRlcm5leHQoKXtmb3IobGV0IGE9dGhpcy5uLTE7MDw9YSYmYTx0aGlzLm47KXRoaXMuaW5kaWNlc1thXSsrLHRoaXMuaW5kaWNlc1thXT49dGhpcy5wb29sX3NpemVzW2FdPyh0aGlzLmluZGljZXNbYV09LTEsYS0tKTphKys7aWYoIXRoaXMubnx8dGhpcy5pbmRpY2VzLmV2ZXJ5KGE9Pi0xPT09YSkpcmV0dXJuIHZvaWQodGhpcy5uPTApO2Vsc2V7Y29uc3QgYT10aGlzLmluZGljZXMubWFwKChhLGIpPT50aGlzLnBvb2xzW2JdW3RoaXMuaW5kaWNlc1tiXV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShhKX19LHNsb3RzOnt0cCRkb2M6XFxcInByb2R1Y3QoKml0ZXJhYmxlcywgcmVwZWF0PTEpIC0tPiBwcm9kdWN0IG9iamVjdFxcXFxuXFxcXG5DYXJ0ZXNpYW4gcHJvZHVjdCBvZiBpbnB1dCBpdGVyYWJsZXMuICBFcXVpdmFsZW50IHRvIG5lc3RlZCBmb3ItbG9vcHMuXFxcXG5cXFxcbkZvciBleGFtcGxlLCBwcm9kdWN0KEEsIEIpIHJldHVybnMgdGhlIHNhbWUgYXM6ICAoKHgseSkgZm9yIHggaW4gQSBmb3IgeSBpbiBCKS5cXFxcblRoZSBsZWZ0bW9zdCBpdGVyYXRvcnMgYXJlIGluIHRoZSBvdXRlcm1vc3QgZm9yLWxvb3AsIHNvIHRoZSBvdXRwdXQgdHVwbGVzXFxcXG5jeWNsZSBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIGFuIG9kb21ldGVyICh3aXRoIHRoZSByaWdodG1vc3QgZWxlbWVudCBjaGFuZ2luZ1xcXFxub24gZXZlcnkgaXRlcmF0aW9uKS5cXFxcblxcXFxuVG8gY29tcHV0ZSB0aGUgcHJvZHVjdCBvZiBhbiBpdGVyYWJsZSB3aXRoIGl0c2VsZiwgc3BlY2lmeSB0aGUgbnVtYmVyXFxcXG5vZiByZXBldGl0aW9ucyB3aXRoIHRoZSBvcHRpb25hbCByZXBlYXQga2V5d29yZCBhcmd1bWVudC4gRm9yIGV4YW1wbGUsXFxcXG5wcm9kdWN0KEEsIHJlcGVhdD00KSBtZWFucyB0aGUgc2FtZSBhcyBwcm9kdWN0KEEsIEEsIEEsIEEpLlxcXFxuXFxcXG5wcm9kdWN0KCdhYicsIHJhbmdlKDMpKSAtLT4gKCdhJywwKSAoJ2EnLDEpICgnYScsMikgKCdiJywwKSAoJ2InLDEpICgnYicsMilcXFxcbnByb2R1Y3QoKDAsMSksICgwLDEpLCAoMCwxKSkgLS0+ICgwLDAsMCkgKDAsMCwxKSAoMCwxLDApICgwLDEsMSkgKDEsMCwwKSAuLi5cXFwiLHRwJG5ldyhiLGMpe2xldFtkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwicHJvZHVjdFxcXCIsW1xcXCJyZXBlYXRcXFwiXSxbXSxjLFtuZXcgU2suYnVpbHRpbi5pbnRfKDEpXSk7aWYoZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJGbG93RXJyb3IpLDA+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJyZXBlYXQgYXJndW1lbnQgY2Fubm90IGJlIG5lZ2F0aXZlXFxcIik7Y29uc3QgZT1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErKyllLnB1c2goU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYlthXSkpO2NvbnN0IGY9W10uY29uY2F0KC4uLkFycmF5KGQpLmZpbGwoZSkpO2lmKHRoaXM9PT1hLnByb2R1Y3QucHJvdG90eXBlKXJldHVybiBuZXcgYS5wcm9kdWN0KGYpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5wcm9kdWN0LmNhbGwoYixmKSxifX19fSksYS5yZXBlYXQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMucmVwZWF0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcmVwZWF0KGEsYil7dGhpcy5vYmplY3Q9YSx0aGlzLnRpbWVzPWIsdm9pZCAwPT09YiYmKHRoaXMudHAkaXRlcm5leHQ9KCk9PnRoaXMub2JqZWN0KX0saXRlcm5leHQoKXtyZXR1cm4gMDx0aGlzLnRpbWVzLS0/dGhpcy5vYmplY3Q6dm9pZCAwfSxzbG90czp7dHAkZG9jOlxcXCJyZXBlYXQob2JqZWN0IFssdGltZXNdKSAtPiBjcmVhdGUgYW4gaXRlcmF0b3Igd2hpY2ggcmV0dXJucyB0aGUgb2JqZWN0XFxcXG5mb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMuICBJZiBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBvYmplY3RcXFxcbmVuZGxlc3NseS5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcInJlcGVhdFxcXCIsW1xcXCJvYmplY3RcXFwiLFxcXCJ0aW1lc1xcXCJdLGIsYyxbbnVsbF0pLGU9bnVsbD09PWU/dm9pZCAwOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChlLFNrLmJ1aWx0aW4uT3ZlckZsb3dFcnJvciksdGhpcz09PWEucmVwZWF0LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEucmVwZWF0KGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnJlcGVhdC5jYWxsKGIsZCxlKSxifX0sJHIoKXtyZXR1cm4gb2JqZWN0X3JlcHI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLm9iamVjdCksdGltZXNfcmVwcj12b2lkIDA9PT10aGlzLnRpbWVzP1xcXCJcXFwiOlxcXCIsIFxcXCIrKDA8PXRoaXMudGltZXM/dGhpcy50aW1lczowKSxuZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXFxcIihcXFwiK29iamVjdF9yZXByK3RpbWVzX3JlcHIrXFxcIilcXFwiKX19LG1ldGhvZHM6e19fbGVuZ2h0X2hpbnRfXzp7JG1ldGgoKXtpZih2b2lkIDA9PT10aGlzLnRpbWVzKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibGVuKCkgb2YgdW5zaXplZCBvYmplY3RcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnRpbWVzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGx9fX0pLGEuc3Rhcm1hcD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5zdGFybWFwXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gc3Rhcm1hcChhLGIpe3RoaXMuZnVuYz1hLHRoaXMuaXRlcj1ifSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwPT09YSlyZXR1cm47Y29uc3QgYj1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSxjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmZ1bmMsYik7cmV0dXJuIGN9LHNsb3RzOnt0cCRuZXcoYixjKXtsZXQgZCxlO2lmKFtkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJzdGFybWFwXFxcIixbXFxcImZ1bmNcXFwiLFxcXCJpdGVyYWJsZVxcXCJdLGIsYyxbXSksZT1Tay5hYnN0ci5pdGVyKGUpLGQ9U2suYnVpbHRpbi5jaGVja05vbmUoZCk/U2suYnVpbHRpbi5ib29sOmQsdGhpcz09PWEuc3Rhcm1hcC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnN0YXJtYXAoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuc3Rhcm1hcC5jYWxsKGIsZCxlKSxifX19fSksYS50YWtld2hpbGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMudGFrZXdoaWxlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gdGFrZXdoaWxlKGEsYil7dGhpcy5wcmVkaWNhdGU9YSx0aGlzLml0ZXI9Yn0saXRlcm5leHQoKXtjb25zdCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMCE9PWEpe2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSk7aWYoU2subWlzY2V2YWwuaXNUcnVlKGIpKXJldHVybiBhO3RoaXMudHAkaXRlcm5leHQ9KCk9PnZvaWQgMH19LHNsb3RzOnt0cCRkb2M6XFxcInRha2V3aGlsZShwcmVkaWNhdGUsIGl0ZXJhYmxlKSAtLT4gdGFrZXdoaWxlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSBlbnRyaWVzIGZyb20gYW4gaXRlcmFibGUgYXMgbG9uZyBhcyB0aGUgXFxcXG5wcmVkaWNhdGUgZXZhbHVhdGVzIHRvIHRydWUgZm9yIGVhY2ggZW50cnkuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJ0YWtld2hpbGVcXFwiLGMpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwidGFrZXdoaWxlXFxcIixiLDIsMik7Y29uc3QgZD1iWzBdLGU9U2suYWJzdHIuaXRlcihiWzFdKTtpZih0aGlzPT09YS50YWtld2hpbGUucHJvdG90eXBlKXJldHVybiBuZXcgYS50YWtld2hpbGUoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEudGFrZXdoaWxlLmNhbGwoYixkLGUpLGJ9fX19KSxhLnRlZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9KSxhLnppcF9sb25nZXN0PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLnppcF9sb25nZXN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gemlwX2xvbmdlc3QoYSxiKXt0aGlzLml0ZXJzPWEsdGhpcy5maWxsdmFsdWU9Yix0aGlzLmFjdGl2ZT10aGlzLml0ZXJzLmxlbmd0aH0saXRlcm5leHQoKXtpZighdGhpcy5hY3RpdmUpcmV0dXJuO2xldCBiO2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDx0aGlzLml0ZXJzLmxlbmd0aDtkKyspe2lmKGI9dGhpcy5pdGVyc1tkXS50cCRpdGVybmV4dCgpLHZvaWQgMD09PWIpe2lmKHRoaXMuYWN0aXZlLS0sIXRoaXMuYWN0aXZlKXJldHVybjt0aGlzLml0ZXJzW2RdPW5ldyBhLnJlcGVhdCh0aGlzLmZpbGx2YWx1ZSksYj10aGlzLmZpbGx2YWx1ZX1jLnB1c2goYil9cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGMpfSxzbG90czp7dHAkZG9jOlxcXCJ6aXBfbG9uZ2VzdChpdGVyMSBbLGl0ZXIyIFsuLi5dXSwgW2ZpbGx2YWx1ZT1Ob25lXSkgLS0+IHppcF9sb25nZXN0IG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSB6aXBfbG9uZ2VzdCBvYmplY3Qgd2hvc2UgLl9fbmV4dF9fKCkgbWV0aG9kIHJldHVybnMgYSB0dXBsZSB3aGVyZVxcXFxudGhlIGktdGggZWxlbWVudCBjb21lcyBmcm9tIHRoZSBpLXRoIGl0ZXJhYmxlIGFyZ3VtZW50LiAgVGhlIC5fX25leHRfXygpXFxcXG5tZXRob2QgY29udGludWVzIHVudGlsIHRoZSBsb25nZXN0IGl0ZXJhYmxlIGluIHRoZSBhcmd1bWVudCBzZXF1ZW5jZVxcXFxuaXMgZXhoYXVzdGVkIGFuZCB0aGVuIGl0IHJhaXNlcyBTdG9wSXRlcmF0aW9uLiAgV2hlbiB0aGUgc2hvcnRlciBpdGVyYWJsZXNcXFxcbmFyZSBleGhhdXN0ZWQsIHRoZSBmaWxsdmFsdWUgaXMgc3Vic3RpdHV0ZWQgaW4gdGhlaXIgcGxhY2UuICBUaGUgZmlsbHZhbHVlXFxcXG5kZWZhdWx0cyB0byBOb25lIG9yIGNhbiBiZSBzcGVjaWZpZWQgYnkgYSBrZXl3b3JkIGFyZ3VtZW50LlxcXFxuXFxcIix0cCRuZXcoYixjKXtjb25zdFtkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiemlwX2xvbmdlc3RcXFwiLFtcXFwiZmlsbHZhbHVlXFxcIl0sW10sYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkXSksZT1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErKyllLnB1c2goU2suYWJzdHIuaXRlcihiW2FdKSk7aWYodGhpcz09PWEuemlwX2xvbmdlc3QucHJvdG90eXBlKXJldHVybiBuZXcgYS56aXBfbG9uZ2VzdChlLGQpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS56aXBfbG9uZ2VzdC5jYWxsKGIsZSxkKSxifX19fSksYS5fX2RvY19fPW5ldyBTay5idWlsdGluLnN0cihcXFwiQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHB5dGhvbiBpdGVydG9vbHMgbW9kdWxlIGluIFNrdWxwdFxcXCIpLGEuX19wYWNrYWdlX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKSxhfTtcIixcInNyYy9saWIvanNvbi9fX2luaXRfXy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7XFxcInVzZSBzdHJpY3RcXFwiO3ZhciBhPXt9LGI9ZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5weUNoZWNrQXJncyhcXFwiZHVtcHNcXFwiLGFyZ3VtZW50cywxLDEvMCwhMCwhMSk7dmFyIGIsYyxkLGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGY9bmV3IFNrLmJ1aWx0aW5zLmRpY3QoYSksZz0hMTtyZXR1cm4gYj17YXNjaWk6ITAsc2VwYXJhdG9yczp7aXRlbV9zZXBhcmF0b3I6XFxcIiwgXFxcIixrZXlfc2VwYXJhdG9yOlxcXCI6IFxcXCJ9fSxmPVNrLmZmaS5yZW1hcFRvSnMoZiksYz1Tay5mZmkucmVtYXBUb0pzKGVbMF0pLFxcXCJib29sZWFuXFxcIj09dHlwZW9mIGYuZW5zdXJlX2FzY2lpJiYhMT09PWYuZW5zdXJlX2FzY2lpJiYoYi5hc2NpaT0hMSksXFxcImJvb2xlYW5cXFwiPT10eXBlb2YgZi5zb3J0X2tleXMmJmYuc29ydF9rZXlzJiYoZz0hMCksZ3x8KGIuY21wPWZ1bmN0aW9uKCl7cmV0dXJuIDB9KSxcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYuc2VwYXJhdG9ycyYmMj09Zi5zZXBhcmF0b3JzLmxlbmd0aCYmKGIuc2VwYXJhdG9ycy5pdGVtX3NlcGFyYXRvcj1mLnNlcGFyYXRvcnNbMF0sYi5zZXBhcmF0b3JzLmtleV9zZXBhcmF0b3I9Zi5zZXBhcmF0b3JzWzFdKSxmLmluZGVudCYmKGIuc3BhY2U9Zi5pbmRlbnQpLGYuZGVmYXVsdCxkPXN0cmluZ2lmeShjLGIpLG5ldyBTay5idWlsdGluLnN0cihkKX07Yi5jb19rd2FyZ3M9ITAsYS5kdW1wcz1uZXcgU2suYnVpbHRpbi5mdW5jKGIpO3ZhciBjPWZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcImxvYWRzXFxcIixhcmd1bWVudHMsMSwxLzAsITAsITEpO3ZhciBiLGMsZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZT1uZXcgU2suYnVpbHRpbnMuZGljdChhKTtyZXR1cm4gZT1Tay5mZmkucmVtYXBUb0pzKGUpLGI9ZFswXS52LGM9SlNPTi5wYXJzZShiKSxTay5mZmkucmVtYXBUb1B5KGMpfTtyZXR1cm4gYy5jb19rd2FyZ3M9ITAsYS5sb2Fkcz1uZXcgU2suYnVpbHRpbi5mdW5jKGMpLGF9OyhmdW5jdGlvbigpe2Z1bmN0aW9uIHIoYixkLGUpe2Z1bmN0aW9uIG8oaCxpKXtpZighZFtoXSl7aWYoIWJbaF0pe3ZhciBmPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFpJiZmKXJldHVybiBmKGgsITApO2lmKGcpcmV0dXJuIGcoaCwhMCk7dmFyIGM9bmV3IEVycm9yKFxcXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1xcXCIraCtcXFwiJ1xcXCIpO3Rocm93IGMuY29kZT1cXFwiTU9EVUxFX05PVF9GT1VORFxcXCIsY312YXIgYT1kW2hdPXtleHBvcnRzOnt9fTtiW2hdWzBdLmNhbGwoYS5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbaF1bMV1bYV07cmV0dXJuIG8oY3x8YSl9LGEsYS5leHBvcnRzLHIsYixkLGUpfXJldHVybiBkW2hdLmV4cG9ydHN9Zm9yKHZhciBnPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPGUubGVuZ3RoO2ErKylvKGVbYV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24oYSxiKXt2YXIgYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIEpTT04/YShcXFwianNvbmlmeVxcXCIpOkpTT047Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7Ynx8KGI9e30pLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiJiYoYj17Y21wOmJ9KTt2YXIgZj1iLmNtcCYmZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihlLGEpe3ZhciBiPXtrZXk6ZSx2YWx1ZTpkW2VdfSxmPXtrZXk6YSx2YWx1ZTpkW2FdfTtyZXR1cm4gYyhiLGYpfX19KGIuY21wKTtyZXR1cm4gZnVuY3Rpb24gc3RyaW5naWZ5KGEpe2lmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYXx8bnVsbD09PWEpcmV0dXJuIGMuc3RyaW5naWZ5KGEpO2lmKGQoYSkpe2Zvcih2YXIgYj1bXSxnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKHN0cmluZ2lmeShhW2ddKSk7cmV0dXJuXFxcIltcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIn1mb3IodmFyIGgsaj1lKGEpLnNvcnQoZiYmZihhKSksYj1bXSxnPTA7ZzxqLmxlbmd0aDtnKyspaD1qW2ddLGIucHVzaChzdHJpbmdpZnkoaCkrXFxcIjpcXFwiK3N0cmluZ2lmeShhW2hdKSk7cmV0dXJuXFxcIntcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIn0oYSl9O3ZhciBkPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVyblxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT17fS50b1N0cmluZy5jYWxsKGEpfSxlPU9iamVjdC5rZXlzfHxmdW5jdGlvbihhKXt2YXIgYj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5fHxmdW5jdGlvbigpe3JldHVybiEwfSxjPVtdO2Zvcih2YXIgZCBpbiBhKWIuY2FsbChhLGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9fSx7anNvbmlmeToyfV0sMjpbZnVuY3Rpb24oYSxiLGMpe2MucGFyc2U9YShcXFwiLi9saWIvcGFyc2VcXFwiKSxjLnN0cmluZ2lmeT1hKFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiKX0se1xcXCIuL2xpYi9wYXJzZVxcXCI6MyxcXFwiLi9saWIvc3RyaW5naWZ5XFxcIjo0fV0sMzpbZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGYsZyxoPXsnXFxcIic6XFxcIlxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXCIsXFxcIi9cXFwiOlxcXCIvXFxcIixiOlxcXCJcXFxcYlxcXCIsZjpcXFwiXFxcXGZcXFwiLG46XFxcIlxcXFxuXFxcIixyOlxcXCJcXFxcclxcXCIsdDpcXFwiXFxcXHRcXFwifSxqPWZ1bmN0aW9uKGEpe3Rocm93e25hbWU6XFxcIlN5bnRheEVycm9yXFxcIixtZXNzYWdlOmEsYXQ6ZCx0ZXh0OmZ9fSxrPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIT09ZSYmaihcXFwiRXhwZWN0ZWQgJ1xcXCIrYStcXFwiJyBpbnN0ZWFkIG9mICdcXFwiK2UrXFxcIidcXFwiKSxlPWYuY2hhckF0KGQpLGQrPTEsZX0sbD1mdW5jdGlvbigpe3ZhciBhLGI9XFxcIlxcXCI7Zm9yKFxcXCItXFxcIj09PWUmJihiPVxcXCItXFxcIixrKFxcXCItXFxcIikpO1xcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lLGsoKTtpZihcXFwiLlxcXCI9PT1lKWZvcihiKz1cXFwiLlxcXCI7aygpJiZcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZTtpZihcXFwiZVxcXCI9PT1lfHxcXFwiRVxcXCI9PT1lKWZvcihiKz1lLGsoKSwoXFxcIi1cXFwiPT09ZXx8XFxcIitcXFwiPT09ZSkmJihiKz1lLGsoKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO3JldHVybiBhPStiLGlzRmluaXRlKGEpP2E6dm9pZCBqKFxcXCJCYWQgbnVtYmVyXFxcIil9LG09ZnVuY3Rpb24oKXt2YXIgYixjLGQsYT1TdHJpbmcuZnJvbUNoYXJDb2RlLGY9XFxcIlxcXCI7aWYoXFxcIlxcXFxcXFwiXFxcIj09PWUpZm9yKDtrKCk7KXtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlyZXR1cm4gaygpLGY7aWYoXFxcIlxcXFxcXFxcXFxcIiE9PWUpZis9ZTtlbHNlIGlmKGsoKSxcXFwidVxcXCI9PT1lKXtmb3IoZD0wLGM9MDs0PmMmJihiPXBhcnNlSW50KGsoKSwxNiksISFpc0Zpbml0ZShiKSk7Yys9MSlkPTE2KmQrYjtmKz1hKGQpfWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBoW2VdKWYrPWhbZV07ZWxzZSBicmVha31qKFxcXCJCYWQgc3RyaW5nXFxcIil9LG49ZnVuY3Rpb24oKXtmb3IoO2UmJlxcXCIgXFxcIj49ZTspaygpfSxvPWZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2VcXFwidFxcXCI6cmV0dXJuIGsoXFxcInRcXFwiKSxrKFxcXCJyXFxcIiksayhcXFwidVxcXCIpLGsoXFxcImVcXFwiKSwhMDtjYXNlXFxcImZcXFwiOnJldHVybiBrKFxcXCJmXFxcIiksayhcXFwiYVxcXCIpLGsoXFxcImxcXFwiKSxrKFxcXCJzXFxcIiksayhcXFwiZVxcXCIpLCExO2Nhc2VcXFwiblxcXCI6cmV0dXJuIGsoXFxcIm5cXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwibFxcXCIpLGsoXFxcImxcXFwiKSxudWxsO31qKFxcXCJVbmV4cGVjdGVkICdcXFwiK2UrXFxcIidcXFwiKX0scD1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKFxcXCJbXFxcIj09PWUpe2lmKGsoXFxcIltcXFwiKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7Zm9yKDtlOyl7aWYoYS5wdXNoKGcoKSksbigpLFxcXCJdXFxcIj09PWUpcmV0dXJuIGsoXFxcIl1cXFwiKSxhO2soXFxcIixcXFwiKSxuKCl9fWooXFxcIkJhZCBhcnJheVxcXCIpfSxxPWZ1bmN0aW9uKCl7dmFyIGEsYj17fTtpZihcXFwie1xcXCI9PT1lKXtpZihrKFxcXCJ7XFxcIiksbigpLFxcXCJ9XFxcIj09PWUpcmV0dXJuIGsoXFxcIn1cXFwiKSxiO2Zvcig7ZTspe2lmKGE9bSgpLG4oKSxrKFxcXCI6XFxcIiksT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYixhKSYmaihcXFwiRHVwbGljYXRlIGtleSBcXFxcXFxcIlxcXCIrYStcXFwiXFxcXFxcXCJcXFwiKSxiW2FdPWcoKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIG9iamVjdFxcXCIpfTtnPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKSxcXFwie1xcXCI9PT1lP3EoKTpcXFwiW1xcXCI9PT1lP3AoKTpcXFwiXFxcXFxcXCJcXFwiPT09ZT9tKCk6XFxcIi1cXFwiPT09ZT9sKCk6XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU/bCgpOm8oKX0sYi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM7cmV0dXJuIGY9YSxkPTAsZT1cXFwiIFxcXCIsYz1nKCksbigpLGUmJmooXFxcIlN5bnRheCBlcnJvclxcXCIpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiP2Z1bmN0aW9uIHdhbGsoYSxjKXt2YXIgZCxlLGY9YVtjXTtpZihmJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYpZm9yKGQgaW4gZilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZixkKSYmKGU9d2FsayhmLGQpLHZvaWQgMD09PWU/ZGVsZXRlIGZbZF06ZltkXT1lKTtyZXR1cm4gYi5jYWxsKGEsYyxmKX0oe1xcXCJcXFwiOmN9LFxcXCJcXFwiKTpjfX0se31dLDQ6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gcXVvdGUoYSl7cmV0dXJuIGYubGFzdEluZGV4PTAsZi50ZXN0KGEpP1xcXCJcXFxcXFxcIlxcXCIrYS5yZXBsYWNlKGYsZnVuY3Rpb24oYil7dmFyIGE9Z1tiXTtyZXR1cm5cXFwic3RyaW5nXFxcIj09dHlwZW9mIGE/YTpcXFwiXFxcXFxcXFx1XFxcIisoXFxcIjAwMDBcXFwiK2IuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KX0pK1xcXCJcXFxcXFxcIlxcXCI6XFxcIlxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCJ9ZnVuY3Rpb24gc3RyKGEsYil7dmFyIGYsZyxoLGosbCxtPWMsbj1iW2FdO3N3aXRjaChuJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIG4mJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBuLnRvSlNPTiYmKG49bi50b0pTT04oYSkpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlJiYobj1lLmNhbGwoYixhLG4pKSx0eXBlb2Ygbil7Y2FzZVxcXCJzdHJpbmdcXFwiOnJldHVybiBxdW90ZShuKTtjYXNlXFxcIm51bWJlclxcXCI6cmV0dXJuIGlzRmluaXRlKG4pP24rXFxcIlxcXCI6XFxcIm51bGxcXFwiO2Nhc2VcXFwiYm9vbGVhblxcXCI6Y2FzZVxcXCJudWxsXFxcIjpyZXR1cm4gbitcXFwiXFxcIjtjYXNlXFxcIm9iamVjdFxcXCI6aWYoIW4pcmV0dXJuXFxcIm51bGxcXFwiO2lmKGMrPWQsbD1bXSxcXFwiW29iamVjdCBBcnJheV1cXFwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKSl7Zm9yKGo9bi5sZW5ndGgsZj0wO2Y8ajtmKz0xKWxbZl09c3RyKGYsbil8fFxcXCJudWxsXFxcIjtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcIltdXFxcIjpjP1xcXCJbXFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwiXVxcXCI6XFxcIltcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIixjPW0saH1pZihlJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGUpZm9yKGo9ZS5sZW5ndGgsZj0wO2Y8ajtmKz0xKWc9ZVtmXSxcXFwic3RyaW5nXFxcIj09dHlwZW9mIGcmJihoPXN0cihnLG4pLGgmJmwucHVzaChxdW90ZShnKSsoYz9cXFwiOiBcXFwiOlxcXCI6XFxcIikraCkpO2Vsc2UgZm9yKGcgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixnKSYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7cmV0dXJuIGg9MD09PWwubGVuZ3RoP1xcXCJ7fVxcXCI6Yz9cXFwie1xcXFxuXFxcIitjK2wuam9pbihcXFwiLFxcXFxuXFxcIitjKStcXFwiXFxcXG5cXFwiK20rXFxcIn1cXFwiOlxcXCJ7XFxcIitsLmpvaW4oXFxcIixcXFwiKStcXFwifVxcXCIsYz1tLGg7fX12YXIgYyxkLGUsZj0vW1xcXFxcXFxcXFxcXFxcXCJcXFxceDAwLVxcXFx4MWZcXFxceDdmLVxcXFx4OWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl0vZyxnPXtcXFwiXFxiXFxcIjpcXFwiXFxcXFxcXFxiXFxcIixcXFwiXFx0XFxcIjpcXFwiXFxcXFxcXFx0XFxcIixcXFwiXFxcXG5cXFwiOlxcXCJcXFxcXFxcXG5cXFwiLFxcXCJcXGZcXFwiOlxcXCJcXFxcXFxcXGZcXFwiLFxcXCJcXFxcclxcXCI6XFxcIlxcXFxcXFxcclxcXCIsJ1xcXCInOlxcXCJcXFxcXFxcXFxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIn07Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixmKXt2YXIgZztpZihjPVxcXCJcXFwiLGQ9XFxcIlxcXCIsXFxcIm51bWJlclxcXCI9PXR5cGVvZiBmKWZvcihnPTA7ZzxmO2crPTEpZCs9XFxcIiBcXFwiO2Vsc2VcXFwic3RyaW5nXFxcIj09dHlwZW9mIGYmJihkPWYpO2lmKGU9YixiJiZcXFwiZnVuY3Rpb25cXFwiIT10eXBlb2YgYiYmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYnx8XFxcIm51bWJlclxcXCIhPXR5cGVvZiBiLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKFxcXCJKU09OLnN0cmluZ2lmeVxcXCIpO3JldHVybiBzdHIoXFxcIlxcXCIse1xcXCJcXFwiOmF9KX19LHt9XSw1OltmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCl7dGhyb3cgbmV3IEVycm9yKFxcXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBydW5UaW1lb3V0KGEpe2lmKGM9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGEsMCk7aWYoKGM9PT1kZWZhdWx0U2V0VGltb3V0fHwhYykmJnNldFRpbWVvdXQpcmV0dXJuIGM9c2V0VGltZW91dCxzZXRUaW1lb3V0KGEsMCk7dHJ5e3JldHVybiBjKGEsMCl9Y2F0Y2goYil7dHJ5e3JldHVybiBjLmNhbGwobnVsbCxhLDApfWNhdGNoKGIpe3JldHVybiBjLmNhbGwodGhpcyxhLDApfX19ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KGEpe2lmKGQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigoZD09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFkKSYmY2xlYXJUaW1lb3V0KXJldHVybiBkPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBkKGEpfWNhdGNoKGIpe3RyeXtyZXR1cm4gZC5jYWxsKG51bGwsYSl9Y2F0Y2goYil7cmV0dXJuIGQuY2FsbCh0aGlzLGEpfX19ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7aCYmZiYmKGg9ITEsZi5sZW5ndGg/Zz1mLmNvbmNhdChnKTppPS0xLGcubGVuZ3RoJiZkcmFpblF1ZXVlKCkpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighaCl7dmFyIGE9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2g9ITA7Zm9yKHZhciBiPWcubGVuZ3RoO2I7KXtmb3IoZj1nLGc9W107KytpPGI7KWYmJmZbaV0ucnVuKCk7aT0tMSxiPWcubGVuZ3RofWY9bnVsbCxoPSExLHJ1bkNsZWFyVGltZW91dChhKX19ZnVuY3Rpb24gSXRlbShhLGIpe3RoaXMuZnVuPWEsdGhpcy5hcnJheT1ifWZ1bmN0aW9uIG5vb3AoKXt9dmFyIGMsZCxlPWIuZXhwb3J0cz17fTsoZnVuY3Rpb24oKXt0cnl7Yz1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmRlZmF1bHRTZXRUaW1vdXR9Y2F0Y2goYSl7Yz1kZWZhdWx0U2V0VGltb3V0fXRyeXtkPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2goYSl7ZD1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0pKCk7dmFyIGYsZz1bXSxoPSExLGk9LTE7ZS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgYj1BcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKDE8YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWJbYy0xXT1hcmd1bWVudHNbY107Zy5wdXNoKG5ldyBJdGVtKGEsYikpLDEhPT1nLmxlbmd0aHx8aHx8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZS50aXRsZT1cXFwiYnJvd3NlclxcXCIsZS5icm93c2VyPSEwLGUuZW52PXt9LGUuYXJndj1bXSxlLnZlcnNpb249XFxcIlxcXCIsZS52ZXJzaW9ucz17fSxlLm9uPW5vb3AsZS5hZGRMaXN0ZW5lcj1ub29wLGUub25jZT1ub29wLGUub2ZmPW5vb3AsZS5yZW1vdmVMaXN0ZW5lcj1ub29wLGUucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3AsZS5lbWl0PW5vb3AsZS5wcmVwZW5kTGlzdGVuZXI9bm9vcCxlLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcCxlLmxpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybltdfSxlLmJpbmRpbmc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXFxcIil9LGUuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuXFxcIi9cXFwifSxlLmNoZGlyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFxcXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0se31dLDY6W2Z1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKGMpe3ZhciBkPWEoXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCIpO2MuYnJvd3Nlcj93aW5kb3cuc3RyaW5naWZ5PWQ6Yi5leHBvcnRzPWR9KS5jYWxsKHRoaXMsYShcXFwiX3Byb2Nlc3NcXFwiKSl9LHtfcHJvY2Vzczo1LFxcXCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcXFwiOjF9XX0se30sWzZdKTtcIixcInNyYy9saWIvanNvbi9zdHJpbmdpZnkuanNcIjpcIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoYixkLGUpe2Z1bmN0aW9uIG8oaCxpKXtpZighZFtoXSl7aWYoIWJbaF0pe3ZhciBmPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFpJiZmKXJldHVybiBmKGgsITApO2lmKGcpcmV0dXJuIGcoaCwhMCk7dmFyIGM9bmV3IEVycm9yKFxcXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1xcXCIraCtcXFwiJ1xcXCIpO3Rocm93IGMuY29kZT1cXFwiTU9EVUxFX05PVF9GT1VORFxcXCIsY312YXIgYT1kW2hdPXtleHBvcnRzOnt9fTtiW2hdWzBdLmNhbGwoYS5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbaF1bMV1bYV07cmV0dXJuIG8oY3x8YSl9LGEsYS5leHBvcnRzLHIsYixkLGUpfXJldHVybiBkW2hdLmV4cG9ydHN9Zm9yKHZhciBnPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPGUubGVuZ3RoO2ErKylvKGVbYV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24oYSxiKXt2YXIgYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIEpTT04/YShcXFwianNvbmlmeVxcXCIpOkpTT047Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7Ynx8KGI9e30pLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiJiYoYj17Y21wOmJ9KTt2YXIgZj1iLmNtcCYmZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihlLGEpe3ZhciBiPXtrZXk6ZSx2YWx1ZTpkW2VdfSxmPXtrZXk6YSx2YWx1ZTpkW2FdfTtyZXR1cm4gYyhiLGYpfX19KGIuY21wKTtyZXR1cm4gZnVuY3Rpb24gc3RyaW5naWZ5KGEpe2lmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYXx8bnVsbD09PWEpcmV0dXJuIGMuc3RyaW5naWZ5KGEpO2lmKGQoYSkpe2Zvcih2YXIgYj1bXSxnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKHN0cmluZ2lmeShhW2ddKSk7cmV0dXJuXFxcIltcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIn1mb3IodmFyIGgsaj1lKGEpLnNvcnQoZiYmZihhKSksYj1bXSxnPTA7ZzxqLmxlbmd0aDtnKyspaD1qW2ddLGIucHVzaChzdHJpbmdpZnkoaCkrXFxcIjpcXFwiK3N0cmluZ2lmeShhW2hdKSk7cmV0dXJuXFxcIntcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIn0oYSl9O3ZhciBkPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVyblxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT17fS50b1N0cmluZy5jYWxsKGEpfSxlPU9iamVjdC5rZXlzfHxmdW5jdGlvbihhKXt2YXIgYj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5fHxmdW5jdGlvbigpe3JldHVybiEwfSxjPVtdO2Zvcih2YXIgZCBpbiBhKWIuY2FsbChhLGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9fSx7anNvbmlmeToyfV0sMjpbZnVuY3Rpb24oYSxiLGMpe2MucGFyc2U9YShcXFwiLi9saWIvcGFyc2VcXFwiKSxjLnN0cmluZ2lmeT1hKFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiKX0se1xcXCIuL2xpYi9wYXJzZVxcXCI6MyxcXFwiLi9saWIvc3RyaW5naWZ5XFxcIjo0fV0sMzpbZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGYsZyxoPXsnXFxcIic6XFxcIlxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXCIsXFxcIi9cXFwiOlxcXCIvXFxcIixiOlxcXCJcXFxcYlxcXCIsZjpcXFwiXFxcXGZcXFwiLG46XFxcIlxcXFxuXFxcIixyOlxcXCJcXFxcclxcXCIsdDpcXFwiXFxcXHRcXFwifSxqPWZ1bmN0aW9uKGEpe3Rocm93e25hbWU6XFxcIlN5bnRheEVycm9yXFxcIixtZXNzYWdlOmEsYXQ6ZCx0ZXh0OmZ9fSxrPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIT09ZSYmaihcXFwiRXhwZWN0ZWQgJ1xcXCIrYStcXFwiJyBpbnN0ZWFkIG9mICdcXFwiK2UrXFxcIidcXFwiKSxlPWYuY2hhckF0KGQpLGQrPTEsZX0sbD1mdW5jdGlvbigpe3ZhciBhLGI9XFxcIlxcXCI7Zm9yKFxcXCItXFxcIj09PWUmJihiPVxcXCItXFxcIixrKFxcXCItXFxcIikpO1xcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lLGsoKTtpZihcXFwiLlxcXCI9PT1lKWZvcihiKz1cXFwiLlxcXCI7aygpJiZcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZTtpZihcXFwiZVxcXCI9PT1lfHxcXFwiRVxcXCI9PT1lKWZvcihiKz1lLGsoKSwoXFxcIi1cXFwiPT09ZXx8XFxcIitcXFwiPT09ZSkmJihiKz1lLGsoKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO3JldHVybiBhPStiLGlzRmluaXRlKGEpP2E6dm9pZCBqKFxcXCJCYWQgbnVtYmVyXFxcIil9LG09ZnVuY3Rpb24oKXt2YXIgYixjLGQsYT1TdHJpbmcuZnJvbUNoYXJDb2RlLGY9XFxcIlxcXCI7aWYoXFxcIlxcXFxcXFwiXFxcIj09PWUpZm9yKDtrKCk7KXtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlyZXR1cm4gaygpLGY7aWYoXFxcIlxcXFxcXFxcXFxcIiE9PWUpZis9ZTtlbHNlIGlmKGsoKSxcXFwidVxcXCI9PT1lKXtmb3IoZD0wLGM9MDs0PmMmJihiPXBhcnNlSW50KGsoKSwxNiksISFpc0Zpbml0ZShiKSk7Yys9MSlkPTE2KmQrYjtmKz1hKGQpfWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBoW2VdKWYrPWhbZV07ZWxzZSBicmVha31qKFxcXCJCYWQgc3RyaW5nXFxcIil9LG49ZnVuY3Rpb24oKXtmb3IoO2UmJlxcXCIgXFxcIj49ZTspaygpfSxvPWZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2VcXFwidFxcXCI6cmV0dXJuIGsoXFxcInRcXFwiKSxrKFxcXCJyXFxcIiksayhcXFwidVxcXCIpLGsoXFxcImVcXFwiKSwhMDtjYXNlXFxcImZcXFwiOnJldHVybiBrKFxcXCJmXFxcIiksayhcXFwiYVxcXCIpLGsoXFxcImxcXFwiKSxrKFxcXCJzXFxcIiksayhcXFwiZVxcXCIpLCExO2Nhc2VcXFwiblxcXCI6cmV0dXJuIGsoXFxcIm5cXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwibFxcXCIpLGsoXFxcImxcXFwiKSxudWxsO31qKFxcXCJVbmV4cGVjdGVkICdcXFwiK2UrXFxcIidcXFwiKX0scD1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKFxcXCJbXFxcIj09PWUpe2lmKGsoXFxcIltcXFwiKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7Zm9yKDtlOyl7aWYoYS5wdXNoKGcoKSksbigpLFxcXCJdXFxcIj09PWUpcmV0dXJuIGsoXFxcIl1cXFwiKSxhO2soXFxcIixcXFwiKSxuKCl9fWooXFxcIkJhZCBhcnJheVxcXCIpfSxxPWZ1bmN0aW9uKCl7dmFyIGEsYj17fTtpZihcXFwie1xcXCI9PT1lKXtpZihrKFxcXCJ7XFxcIiksbigpLFxcXCJ9XFxcIj09PWUpcmV0dXJuIGsoXFxcIn1cXFwiKSxiO2Zvcig7ZTspe2lmKGE9bSgpLG4oKSxrKFxcXCI6XFxcIiksT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYixhKSYmaihcXFwiRHVwbGljYXRlIGtleSBcXFxcXFxcIlxcXCIrYStcXFwiXFxcXFxcXCJcXFwiKSxiW2FdPWcoKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIG9iamVjdFxcXCIpfTtnPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKSxcXFwie1xcXCI9PT1lP3EoKTpcXFwiW1xcXCI9PT1lP3AoKTpcXFwiXFxcXFxcXCJcXFwiPT09ZT9tKCk6XFxcIi1cXFwiPT09ZT9sKCk6XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU/bCgpOm8oKX0sYi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM7cmV0dXJuIGY9YSxkPTAsZT1cXFwiIFxcXCIsYz1nKCksbigpLGUmJmooXFxcIlN5bnRheCBlcnJvclxcXCIpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiP2Z1bmN0aW9uIHdhbGsoYSxjKXt2YXIgZCxlLGY9YVtjXTtpZihmJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYpZm9yKGQgaW4gZilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZixkKSYmKGU9d2FsayhmLGQpLHZvaWQgMD09PWU/ZGVsZXRlIGZbZF06ZltkXT1lKTtyZXR1cm4gYi5jYWxsKGEsYyxmKX0oe1xcXCJcXFwiOmN9LFxcXCJcXFwiKTpjfX0se31dLDQ6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gcXVvdGUoYSl7cmV0dXJuIGYubGFzdEluZGV4PTAsZi50ZXN0KGEpP1xcXCJcXFxcXFxcIlxcXCIrYS5yZXBsYWNlKGYsZnVuY3Rpb24oYil7dmFyIGE9Z1tiXTtyZXR1cm5cXFwic3RyaW5nXFxcIj09dHlwZW9mIGE/YTpcXFwiXFxcXFxcXFx1XFxcIisoXFxcIjAwMDBcXFwiK2IuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KX0pK1xcXCJcXFxcXFxcIlxcXCI6XFxcIlxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCJ9ZnVuY3Rpb24gc3RyKGEsYil7dmFyIGYsZyxoLGosbCxtPWMsbj1iW2FdO3N3aXRjaChuJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIG4mJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBuLnRvSlNPTiYmKG49bi50b0pTT04oYSkpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlJiYobj1lLmNhbGwoYixhLG4pKSx0eXBlb2Ygbil7Y2FzZVxcXCJzdHJpbmdcXFwiOnJldHVybiBxdW90ZShuKTtjYXNlXFxcIm51bWJlclxcXCI6cmV0dXJuIGlzRmluaXRlKG4pP24rXFxcIlxcXCI6XFxcIm51bGxcXFwiO2Nhc2VcXFwiYm9vbGVhblxcXCI6Y2FzZVxcXCJudWxsXFxcIjpyZXR1cm4gbitcXFwiXFxcIjtjYXNlXFxcIm9iamVjdFxcXCI6aWYoIW4pcmV0dXJuXFxcIm51bGxcXFwiO2lmKGMrPWQsbD1bXSxcXFwiW29iamVjdCBBcnJheV1cXFwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKSl7Zm9yKGo9bi5sZW5ndGgsZj0wO2Y8ajtmKz0xKWxbZl09c3RyKGYsbil8fFxcXCJudWxsXFxcIjtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcIltdXFxcIjpjP1xcXCJbXFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwiXVxcXCI6XFxcIltcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIixjPW0saH1pZihlJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGUpZm9yKGo9ZS5sZW5ndGgsZj0wO2Y8ajtmKz0xKWc9ZVtmXSxcXFwic3RyaW5nXFxcIj09dHlwZW9mIGcmJihoPXN0cihnLG4pLGgmJmwucHVzaChxdW90ZShnKSsoYz9cXFwiOiBcXFwiOlxcXCI6XFxcIikraCkpO2Vsc2UgZm9yKGcgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixnKSYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7cmV0dXJuIGg9MD09PWwubGVuZ3RoP1xcXCJ7fVxcXCI6Yz9cXFwie1xcXFxuXFxcIitjK2wuam9pbihcXFwiLFxcXFxuXFxcIitjKStcXFwiXFxcXG5cXFwiK20rXFxcIn1cXFwiOlxcXCJ7XFxcIitsLmpvaW4oXFxcIixcXFwiKStcXFwifVxcXCIsYz1tLGg7fX12YXIgYyxkLGUsZj0vW1xcXFxcXFxcXFxcXFxcXCJcXFxceDAwLVxcXFx4MWZcXFxceDdmLVxcXFx4OWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl0vZyxnPXtcXFwiXFxiXFxcIjpcXFwiXFxcXFxcXFxiXFxcIixcXFwiXFx0XFxcIjpcXFwiXFxcXFxcXFx0XFxcIixcXFwiXFxcXG5cXFwiOlxcXCJcXFxcXFxcXG5cXFwiLFxcXCJcXGZcXFwiOlxcXCJcXFxcXFxcXGZcXFwiLFxcXCJcXFxcclxcXCI6XFxcIlxcXFxcXFxcclxcXCIsJ1xcXCInOlxcXCJcXFxcXFxcXFxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIn07Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixmKXt2YXIgZztpZihjPVxcXCJcXFwiLGQ9XFxcIlxcXCIsXFxcIm51bWJlclxcXCI9PXR5cGVvZiBmKWZvcihnPTA7ZzxmO2crPTEpZCs9XFxcIiBcXFwiO2Vsc2VcXFwic3RyaW5nXFxcIj09dHlwZW9mIGYmJihkPWYpO2lmKGU9YixiJiZcXFwiZnVuY3Rpb25cXFwiIT10eXBlb2YgYiYmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYnx8XFxcIm51bWJlclxcXCIhPXR5cGVvZiBiLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKFxcXCJKU09OLnN0cmluZ2lmeVxcXCIpO3JldHVybiBzdHIoXFxcIlxcXCIse1xcXCJcXFwiOmF9KX19LHt9XSw1OltmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCl7dGhyb3cgbmV3IEVycm9yKFxcXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBydW5UaW1lb3V0KGEpe2lmKGM9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGEsMCk7aWYoKGM9PT1kZWZhdWx0U2V0VGltb3V0fHwhYykmJnNldFRpbWVvdXQpcmV0dXJuIGM9c2V0VGltZW91dCxzZXRUaW1lb3V0KGEsMCk7dHJ5e3JldHVybiBjKGEsMCl9Y2F0Y2goYil7dHJ5e3JldHVybiBjLmNhbGwobnVsbCxhLDApfWNhdGNoKGIpe3JldHVybiBjLmNhbGwodGhpcyxhLDApfX19ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KGEpe2lmKGQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigoZD09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFkKSYmY2xlYXJUaW1lb3V0KXJldHVybiBkPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBkKGEpfWNhdGNoKGIpe3RyeXtyZXR1cm4gZC5jYWxsKG51bGwsYSl9Y2F0Y2goYil7cmV0dXJuIGQuY2FsbCh0aGlzLGEpfX19ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7aCYmZiYmKGg9ITEsZi5sZW5ndGg/Zz1mLmNvbmNhdChnKTppPS0xLGcubGVuZ3RoJiZkcmFpblF1ZXVlKCkpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighaCl7dmFyIGE9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2g9ITA7Zm9yKHZhciBiPWcubGVuZ3RoO2I7KXtmb3IoZj1nLGc9W107KytpPGI7KWYmJmZbaV0ucnVuKCk7aT0tMSxiPWcubGVuZ3RofWY9bnVsbCxoPSExLHJ1bkNsZWFyVGltZW91dChhKX19ZnVuY3Rpb24gSXRlbShhLGIpe3RoaXMuZnVuPWEsdGhpcy5hcnJheT1ifWZ1bmN0aW9uIG5vb3AoKXt9dmFyIGMsZCxlPWIuZXhwb3J0cz17fTsoZnVuY3Rpb24oKXt0cnl7Yz1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmRlZmF1bHRTZXRUaW1vdXR9Y2F0Y2goYSl7Yz1kZWZhdWx0U2V0VGltb3V0fXRyeXtkPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2goYSl7ZD1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0pKCk7dmFyIGYsZz1bXSxoPSExLGk9LTE7ZS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgYj1BcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKDE8YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWJbYy0xXT1hcmd1bWVudHNbY107Zy5wdXNoKG5ldyBJdGVtKGEsYikpLDEhPT1nLmxlbmd0aHx8aHx8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZS50aXRsZT1cXFwiYnJvd3NlclxcXCIsZS5icm93c2VyPSEwLGUuZW52PXt9LGUuYXJndj1bXSxlLnZlcnNpb249XFxcIlxcXCIsZS52ZXJzaW9ucz17fSxlLm9uPW5vb3AsZS5hZGRMaXN0ZW5lcj1ub29wLGUub25jZT1ub29wLGUub2ZmPW5vb3AsZS5yZW1vdmVMaXN0ZW5lcj1ub29wLGUucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3AsZS5lbWl0PW5vb3AsZS5wcmVwZW5kTGlzdGVuZXI9bm9vcCxlLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcCxlLmxpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybltdfSxlLmJpbmRpbmc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXFxcIil9LGUuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuXFxcIi9cXFwifSxlLmNoZGlyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFxcXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0se31dLDY6W2Z1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKGMpe3ZhciBkPWEoXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCIpO2MuYnJvd3Nlcj93aW5kb3cuc3RyaW5naWZ5PWQ6Yi5leHBvcnRzPWR9KS5jYWxsKHRoaXMsYShcXFwiX3Byb2Nlc3NcXFwiKSl9LHtfcHJvY2Vzczo1LFxcXCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcXFwiOjF9XX0se30sWzZdKTtcIixcInNyYy9saWIvanNvbi90ZXN0cy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVzdHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9rZXl3b3JkLnB5XCI6XCJcXG5fX2FsbF9fID0gW1xcXCJpc2tleXdvcmRcXFwiLCBcXFwia3dsaXN0XFxcIl1cXG5cXG5rd2xpc3QgPSBbXFxuIy0tc3RhcnQga2V5d29yZHMtLVxcbiAgICAgICAgJ2FuZCcsXFxuICAgICAgICAnYXMnLFxcbiAgICAgICAgJ2Fzc2VydCcsXFxuICAgICAgICAnYnJlYWsnLFxcbiAgICAgICAgJ2NsYXNzJyxcXG4gICAgICAgICdjb250aW51ZScsXFxuICAgICAgICAnZGVmJyxcXG4gICAgICAgICdkZWwnLFxcbiAgICAgICAgJ2VsaWYnLFxcbiAgICAgICAgJ2Vsc2UnLFxcbiAgICAgICAgJ2V4Y2VwdCcsXFxuICAgICAgICAnZXhlYycsXFxuICAgICAgICAnZmluYWxseScsXFxuICAgICAgICAnZm9yJyxcXG4gICAgICAgICdmcm9tJyxcXG4gICAgICAgICdnbG9iYWwnLFxcbiAgICAgICAgJ2lmJyxcXG4gICAgICAgICdpbXBvcnQnLFxcbiAgICAgICAgJ2luJyxcXG4gICAgICAgICdpcycsXFxuICAgICAgICAnbGFtYmRhJyxcXG4gICAgICAgICdub3QnLFxcbiAgICAgICAgJ29yJyxcXG4gICAgICAgICdwYXNzJyxcXG4gICAgICAgICdwcmludCcsXFxuICAgICAgICAncmFpc2UnLFxcbiAgICAgICAgJ3JldHVybicsXFxuICAgICAgICAndHJ5JyxcXG4gICAgICAgICd3aGlsZScsXFxuICAgICAgICAnd2l0aCcsXFxuICAgICAgICAneWllbGQnLFxcbiMtLWVuZCBrZXl3b3Jkcy0tXFxuICAgICAgICBdXFxuXFxuaXNrZXl3b3JkID0gZnJvemVuc2V0KGt3bGlzdCkuX19jb250YWluc19fXFxuXFxuXCIsXCJzcmMvbGliL2xpYi1keW5sb2FkL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsaWItZHlubG9hZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYi10ay9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGliLXRrIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGliMnRvMyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYjJ0bzMvZml4ZXMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZpeGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy9wZ2VuMi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGdlbjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9saWIydG8zL3Rlc3RzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZXN0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpbmVjYWNoZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGluZWNhY2hlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbG9jYWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsb2NhbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9sb2dnaW5nL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsb2dnaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFjcGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFjcGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21hY3VybDJwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWN1cmwycGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21haWxib3gucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1haWxib3ggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tYWlsY2FwLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWlsY2FwIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFya3VwYmFzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFya3VwYmFzZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21hdGguanNcIjpcImNvbnN0ICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5QSSxiPU1hdGguc3FydCxjPU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLGQ9TWF0aC5FLGU9TWF0aC5sb2csZj1NYXRoLmV4cCxnPU1hdGgucG93LGg9TWF0aC5sb2cyLGk9TnVtYmVyLmlzRmluaXRlLGo9TWF0aC5mbG9vcixrPU1hdGguYWJzO2NvbnN0IGw9e3BpOm5ldyBTay5idWlsdGluLmZsb2F0XyhhKSxlOm5ldyBTay5idWlsdGluLmZsb2F0XyhkKSx0YXU6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDIqYSksbmFuOm5ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pLGluZjpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMS8wKX0sbj1mdW5jdGlvbihhKXtyZXR1cm4gYT1hPzA+YT8tMToxOjA+MS9hPy0xOjEsYX0sbz0xODtyZXR1cm4gU2suYWJzdHIuc2V0VXBNb2R1bGVNZXRob2RzKFxcXCJtYXRoXFxcIixsLHthY29zOnskbWV0aDpmdW5jdGlvbiBhY29zKGEpe3ZhciBiPU1hdGguYWNvcztyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhcmMgY29zaW5lIChtZWFzdXJlZCBpbiByYWRpYW5zKSBvZiB4LlxcXCJ9LGFjb3NoOnskbWV0aDpmdW5jdGlvbiBhY29zaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGM9YStiKGEqYS0xKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUoYykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zaW5lIG9mIHguXFxcIn0sYXNpbjp7JG1ldGg6ZnVuY3Rpb24gYXNpbihhKXt2YXIgYj1NYXRoLmFzaW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIHNpbmUgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguXFxcIn0sYXNpbmg6eyRtZXRoOmZ1bmN0aW9uIGFzaW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYz1hK2IoYSphKzEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZShjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGludmVyc2UgaHlwZXJib2xpYyBzaW5lIG9mIHguXFxcIn0sYXRhbjp7JG1ldGg6ZnVuY3Rpb24gYXRhbihhKXt2YXIgYj1NYXRoLmF0YW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIHRhbmdlbnQgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguXFxcIn0sYXRhbjI6eyRtZXRoOmZ1bmN0aW9uIGF0YW4yKGEsYil7dmFyIGM9TWF0aC5hdGFuMjtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMoU2suYnVpbHRpbi5hc251bSQoYSksU2suYnVpbHRpbi5hc251bSQoYikpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHksIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGFyYyB0YW5nZW50IChtZWFzdXJlZCBpbiByYWRpYW5zKSBvZiB5L3guXFxcXG5cXFxcblVubGlrZSBhdGFuKHkveCksIHRoZSBzaWducyBvZiBib3RoIHggYW5kIHkgYXJlIGNvbnNpZGVyZWQuXFxcIn0sYXRhbmg6eyRtZXRoOmZ1bmN0aW9uIGF0YW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYj0oMSthKS8oMS1hKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUoYikvMil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGludmVyc2UgaHlwZXJib2xpYyB0YW5nZW50IG9mIHguXFxcIn0sY2VpbDp7JG1ldGg6ZnVuY3Rpb24gY2VpbChhKXt2YXIgYj1NYXRoLmNlaWw7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiXFxcIixcXFwicmVhbCBudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIFNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnQ/bmV3IFNrLmJ1aWx0aW4uaW50XyhiKGMpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGNlaWxpbmcgb2YgeCBhcyBhbiBJbnRlZ3JhbC5cXFxcblxcXFxuVGhpcyBpcyB0aGUgc21hbGxlc3QgaW50ZWdlciA+PSB4LlxcXCJ9LGNvcHlzaWduOnskbWV0aDpmdW5jdGlvbiBjb3B5c2lnbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInlcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYiksZD1Tay5idWlsdGluLmFzbnVtJChhKSxlPW4oZCksZj1uKGMpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCooZSpmKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGEgZmxvYXQgd2l0aCB0aGUgbWFnbml0dWRlIChhYnNvbHV0ZSB2YWx1ZSkgb2YgeCBidXQgdGhlIHNpZ24gb2YgeS5cXFxcblxcXFxuT24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBzaWduZWQgemVyb3MsIGNvcHlzaWduKDEuMCwgLTAuMClcXFxcbnJldHVybnMgLTEuMC5cXFxcblxcXCJ9LGNvczp7JG1ldGg6ZnVuY3Rpb24gY29zKGEpe3ZhciBiPU1hdGguY29zO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGNvc2luZSBvZiB4IChtZWFzdXJlZCBpbiByYWRpYW5zKS5cXFwifSxjb3NoOnskbWV0aDpmdW5jdGlvbiBjb3NoKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYj1nKGQsYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygoYisxL2IpLzIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBoeXBlcmJvbGljIGNvc2luZSBvZiB4LlxcXCJ9LGRlZ3JlZXM6eyRtZXRoOmZ1bmN0aW9uIGRlZ3JlZXMoYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtjb25zdCBjPTE4MC9hKlNrLmJ1aWx0aW4uYXNudW0kKGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJDb252ZXJ0IGFuZ2xlIHggZnJvbSByYWRpYW5zIHRvIGRlZ3JlZXMuXFxcIn0sZXJmOnskbWV0aDpmdW5jdGlvbiBlcmYoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmVyZigpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJFcnJvciBmdW5jdGlvbiBhdCB4LlxcXCJ9LGVyZmM6eyRtZXRoOmZ1bmN0aW9uIGVyZmMoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmVyZmMoKSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiQ29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbiBhdCB4LlxcXCJ9LGV4cDp7JG1ldGg6ZnVuY3Rpb24gZXhwKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBiPWEudjtpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGImJihiPWEubmIkZmxvYXQoKS52KSxiPT0xLzB8fGI9PS1JbmZpbml0eXx8aXNOYU4oYikpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhmKGIpKTtjb25zdCBjPWYoYik7aWYoIWlzRmluaXRlKGMpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXFxcIm1hdGggcmFuZ2UgZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiB4LlxcXCJ9LGV4cG0xOnskbWV0aDpmdW5jdGlvbiBleHBtMShhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKC43PmsoYikpe2NvbnN0IGE9ZihiKTtpZigxPT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYik7ZWxzZXtjb25zdCBjPShhLTEpKmIvZShhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfX1lbHNle2NvbnN0IGE9ZihiKS0xO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSl9fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGV4cCh4KS0xLlxcXFxuXFxcXG5UaGlzIGZ1bmN0aW9uIGF2b2lkcyB0aGUgbG9zcyBvZiBwcmVjaXNpb24gaW52b2x2ZWQgaW4gdGhlIGRpcmVjdCBldmFsdWF0aW9uIG9mIGV4cCh4KS0xIGZvciBzbWFsbCB4LlxcXCJ9LGZhYnM6eyRtZXRoOmZ1bmN0aW9uIGZhYnMoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9YS52O3JldHVybiBKU0JJLl9faXNCaWdJbnQoYikmJihiPWEubmIkZmxvYXQoKS52KSxiPWsoYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZmxvYXQgeC5cXFwifSxmYWN0b3JpYWw6eyRtZXRoOmZ1bmN0aW9uIGZhY3RvcmlhbChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYj1Tay5idWlsdGluLmFzbnVtJChhKTtpZihhPWooYiksYSE9Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJmYWN0b3JpYWwoKSBvbmx5IGFjY2VwdHMgaW50ZWdyYWwgdmFsdWVzXFxcIik7aWYoMD5hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImZhY3RvcmlhbCgpIG5vdCBkZWZpbmVkIGZvciBuZWdhdGl2ZSBudW1iZXJzXFxcIik7bGV0IGM9MTtmb3IobGV0IGI9MjtiPD1hJiZiPD1vO2IrKyljKj1iO2lmKGE8PW8pcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyk7Yz1KU0JJLkJpZ0ludChjKTtmb3IobGV0IGI9MTk7Yjw9YTtiKyspYz1KU0JJLm11bHRpcGx5KGMsSlNCSS5CaWdJbnQoYikpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiRmluZCB4IS5cXFxcblxcXFxuUmFpc2UgYSBWYWx1ZUVycm9yIGlmIHggaXMgbmVnYXRpdmUgb3Igbm9uLWludGVncmFsLlxcXCJ9LGZsb29yOnskbWV0aDpmdW5jdGlvbiBmbG9vcihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suX19mdXR1cmVfXy5jZWlsX2Zsb29yX2ludD9uZXcgU2suYnVpbHRpbi5pbnRfKGooU2suYnVpbHRpbi5hc251bSQoYSkpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oaihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBmbG9vciBvZiB4IGFzIGFuIEludGVncmFsLlxcXFxuXFxcXG5UaGlzIGlzIHRoZSBsYXJnZXN0IGludGVnZXIgPD0geC5cXFwifSxmbW9kOnskbWV0aDpmdW5jdGlvbiBmbW9kKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7bGV0IGM9YS52LGQ9Yi52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgYyYmKGM9YS5uYiRmbG9hdCgpLnYpLFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZCYmKGQ9Yi5uYiRmbG9hdCgpLnYpLChkPT0xLzB8fGQ9PS1JbmZpbml0eSkmJmlzRmluaXRlKGMpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyk7Y29uc3QgZT1jJWQ7aWYoaXNOYU4oZSkmJiFpc05hTihjKSYmIWlzTmFOKGQpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhlKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gZm1vZCh4LCB5KSwgYWNjb3JkaW5nIHRvIHBsYXRmb3JtIEMuXFxcXG5cXFxcbnggJSB5IG1heSBkaWZmZXIuXFxcIn0sZnJleHA6eyRtZXRoOmZ1bmN0aW9uIGZyZXhwKGEpe3ZhciBiPU1hdGgubWF4O1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYSksZD1bYywwXTtpZigwIT09YyYmaShjKSl7Y29uc3QgYT1rKGMpO2xldCBlPWIoLTEwMjMsaihoKGEpKSsxKSxmPWEqZygyLC1lKTtmb3IoOy41PmY7KWYqPTIsZS0tO2Zvcig7MTw9ZjspZio9LjUsZSsrOzA+YyYmKGY9LWYpLGRbMF09ZixkWzFdPWV9cmV0dXJuIGRbMF09bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGRbMF0pLGRbMV09bmV3IFNrLmJ1aWx0aW4uaW50XyhkWzFdKSxuZXcgU2suYnVpbHRpbi50dXBsZShkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgbWFudGlzc2EgYW5kIGV4cG9uZW50IG9mIHgsIGFzIHBhaXIgKG0sIGUpLlxcXFxuXFxcXG5tIGlzIGEgZmxvYXQgYW5kIGUgaXMgYW4gaW50LCBzdWNoIHRoYXQgeCA9IG0gKiAyLioqZS5cXFxcbklmIHggaXMgMCwgbSBhbmQgZSBhcmUgYm90aCAwLiAgRWxzZSAwLjUgPD0gYWJzKG0pIDwgMS4wLlxcXCJ9LGZzdW06eyRtZXRoOmZ1bmN0aW9uIGZzdW0oYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIidcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1xcXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcXFwiKTtsZXQgYj1bXTthPVNrLmFic3RyLml0ZXIoYSk7bGV0IGMsZCxlO2ZvcihsZXQgZj1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWEudHAkaXRlcm5leHQoKSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiXFxcIixcXFwicmVhbCBudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZikpLGM9MDtsZXQgYT1mLnY7XFxcIm51bWJlclxcXCIhPXR5cGVvZiBhJiYoYT1mLm5iJGZsb2F0KCkudiksZj1hO2ZvcihsZXQgYSxnPTAsaD1iLmxlbmd0aDtnPGg7ZysrKXtpZihhPWJbZ10sayhmKTxrKGEpKXtsZXQgYj1mO2Y9YSxhPWJ9ZD1mK2EsZT1hLShkLWYpLGUmJihiW2NdPWUsYysrKSxmPWR9Yj1iLnNsaWNlKDAsYykuY29uY2F0KFtmXSl9Y29uc3QgZj1iLnJlZHVjZShmdW5jdGlvbihjLGEpe3JldHVybiBjK2F9LDApO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHNlcSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBhbiBhY2N1cmF0ZSBmbG9hdGluZyBwb2ludCBzdW0gb2YgdmFsdWVzIGluIHRoZSBpdGVyYWJsZSBzZXEuXFxcXG5cXFxcbkFzc3VtZXMgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy5cXFwifSxnYW1tYTp7JG1ldGg6ZnVuY3Rpb24gZ2FtbWEoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmdhbW1hKCkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkdhbW1hIGZ1bmN0aW9uIGF0IHguXFxcIn0sZ2NkOnskbWV0aDpmdW5jdGlvbiBnY2QoYyxhKXtmdW5jdGlvbiBfZ2NkKGMsYSl7cmV0dXJuIDA9PWE/YzpfZ2NkKGEsYyVhKX1mdW5jdGlvbiBfYmlnZ2NkKGMsYSl7cmV0dXJuIEpTQkkuZXF1YWwoYSxKU0JJLl9fWkVSTyk/YzpfYmlnZ2NkKGEsSlNCSS5yZW1haW5kZXIoYyxhKSl9U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYVxcXCIsXFxcImludGVnZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQoYykpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImJcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGEpKTtsZXQgYixkPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGU9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuXFxcIm51bWJlclxcXCI9PXR5cGVvZiBkJiZcXFwibnVtYmVyXFxcIj09dHlwZW9mIGU/KGQ9ayhkKSxlPWsoZSksYj1fZ2NkKGQsZSksYj0wPmI/LWI6YixuZXcgU2suYnVpbHRpbi5pbnRfKGIpKTooZD1KU0JJLkJpZ0ludChkKSxlPUpTQkkuQmlnSW50KGUpLGI9X2JpZ2djZChkLGUpLEpTQkkubGVzc1RoYW4oYixKU0JJLl9fWkVSTykmJihiPUpTQkkubXVsdGlwbHkoYixKU0JJLkJpZ0ludCgtMSkpKSxuZXcgU2suYnVpbHRpbi5pbnRfKGIudG9TdHJpbmcoKSkpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgeSwgLylcXFwiLCRkb2M6XFxcImdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHggYW5kIHlcXFwifSxoeXBvdDp7JG1ldGg6ZnVuY3Rpb24gaHlwb3QoYSxjKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihjKSksYT1Tay5idWlsdGluLmFzbnVtJChhKSxjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKGEqYStjKmMpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSwgc3FydCh4KnggKyB5KnkpLlxcXCJ9LGlzY2xvc2U6eyRtZXRoOmZ1bmN0aW9uIGlzY2xvc2UoYyxkKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImlzY2xvc2VcXFwiLGMsMiwyKSxyZWxfYWJzX3ZhbHM9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImlzY2xvc2VcXFwiLFtcXFwicmVsX3RvbFxcXCIsXFxcImFic190b2xcXFwiXSxbXSxkLFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oMWUtOSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApXSk7Y29uc3QgZT1jWzBdLGE9Y1sxXSxiPXJlbF9hYnNfdmFsc1swXSxmPXJlbF9hYnNfdmFsc1sxXTtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJhXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGUpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJiXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyZWxfdG9sXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJhYnNfdG9sXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGYpKTtjb25zdCBnPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGg9U2suYnVpbHRpbi5hc251bSQoYSksaT1Tay5idWlsdGluLmFzbnVtJChiKSxqPVNrLmJ1aWx0aW4uYXNudW0kKGYpO2lmKDA+aXx8MD5qKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcInRvbGVyYW5jZXMgbXVzdCBiZSBub24tbmVnYXRpdmVcXFwiKTtpZihnPT1oKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7aWYoZz09MS8wfHxnPT0tSW5maW5pdHl8fGg9PTEvMHx8aD09LUluZmluaXR5KXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2NvbnN0IGw9ayhoLWcpLG09bDw9ayhpKmgpfHxsPD1rKGkqZyl8fGw8PWo7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wobSl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgLywgYSwgYiwgKiwgcmVsX3RvbD0xZS0wOSwgYWJzX3RvbD0wLjApXFxcIiwkZG9jOlxcXCJEZXRlcm1pbmUgd2hldGhlciB0d28gZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUgY2xvc2UgaW4gdmFsdWUuXFxcXG5cXFxcbiAgcmVsX3RvbFxcXFxuICAgIG1heGltdW0gZGlmZmVyZW5jZSBmb3IgYmVpbmcgY29uc2lkZXJlZCBcXFxcXFxcImNsb3NlXFxcXFxcXCIsIHJlbGF0aXZlIHRvIHRoZVxcXFxuICAgIG1hZ25pdHVkZSBvZiB0aGUgaW5wdXQgdmFsdWVzXFxcXG4gIGFic190b2xcXFxcbiAgICBtYXhpbXVtIGRpZmZlcmVuY2UgZm9yIGJlaW5nIGNvbnNpZGVyZWQgXFxcXFxcXCJjbG9zZVxcXFxcXFwiLCByZWdhcmRsZXNzIG9mIHRoZVxcXFxuICAgIG1hZ25pdHVkZSBvZiB0aGUgaW5wdXQgdmFsdWVzXFxcXG5cXFxcblJldHVybiBUcnVlIGlmIGEgaXMgY2xvc2UgaW4gdmFsdWUgdG8gYiwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFxcblxcXFxuRm9yIHRoZSB2YWx1ZXMgdG8gYmUgY29uc2lkZXJlZCBjbG9zZSwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtXFxcXG5tdXN0IGJlIHNtYWxsZXIgdGhhbiBhdCBsZWFzdCBvbmUgb2YgdGhlIHRvbGVyYW5jZXMuXFxcXG5cXFxcbi1pbmYsIGluZiBhbmQgTmFOIGJlaGF2ZSBzaW1pbGFybHkgdG8gdGhlIElFRUUgNzU0IFN0YW5kYXJkLiAgVGhhdFxcXFxuaXMsIE5hTiBpcyBub3QgY2xvc2UgdG8gYW55dGhpbmcsIGV2ZW4gaXRzZWxmLiAgaW5mIGFuZCAtaW5mIGFyZVxcXFxub25seSBjbG9zZSB0byB0aGVtc2VsdmVzLlxcXCJ9LGlzZmluaXRlOnskbWV0aDpmdW5jdGlvbiBpc2Zpbml0ZShhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO3JldHVybiBTay5idWlsdGluLmNoZWNrSW50KGEpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDppc0Zpbml0ZShiKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBUcnVlIGlmIHggaXMgbmVpdGhlciBhbiBpbmZpbml0eSBub3IgYSBOYU4sIGFuZCBGYWxzZSBvdGhlcndpc2UuXFxcIn0saXNpbmY6eyRtZXRoOmZ1bmN0aW9uIGlzaW5mKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSk/U2suYnVpbHRpbi5ib29sLmZhbHNlJDppc0Zpbml0ZShiKXx8aXNOYU4oYik/U2suYnVpbHRpbi5ib29sLmZhbHNlJDpTay5idWlsdGluLmJvb2wudHJ1ZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiB4IGlzIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW5maW5pdHksIGFuZCBGYWxzZSBvdGhlcndpc2UuXFxcIn0saXNuYW46eyRtZXRoOmZ1bmN0aW9uIGlzbmFuKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIGlzTmFOKGIpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIFRydWUgaWYgeCBpcyBhIE5hTiAobm90IGEgbnVtYmVyKSwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFwifSxsZGV4cDp7JG1ldGg6ZnVuY3Rpb24gbGRleHAoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJpXFxcIixcXFwiaW50ZWdlclxcXCIsU2suYnVpbHRpbi5jaGVja0ludChiKSk7bGV0IGM9YS52O1xcXCJudW1iZXJcXFwiIT10eXBlb2YgYyYmKGM9YS5uYiRmbG9hdCgpLnYpO2NvbnN0IGQ9U2suYnVpbHRpbi5hc251bSQoYik7aWYoYz09MS8wfHxjPT0tSW5maW5pdHl8fDA9PWN8fGlzTmFOKGMpKXJldHVybiBhO2NvbnN0IGU9YypnKDIsZCk7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXFxcIm1hdGggcmFuZ2UgZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgaSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB4ICogKDIqKmkpLlxcXFxuXFxcXG5UaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBpbnZlcnNlIG9mIGZyZXhwKCkuXFxcIn0sbGdhbW1hOnskbWV0aDpmdW5jdGlvbiBsZ2FtbWEoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmxnYW1tYSgpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJOYXR1cmFsIGxvZ2FyaXRobSBvZiBhYnNvbHV0ZSB2YWx1ZSBvZiBHYW1tYSBmdW5jdGlvbiBhdCB4LlxcXCJ9LGxvZzp7JG1ldGg6ZnVuY3Rpb24gbG9nKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGYsZyxoPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtpZih2b2lkIDA9PT1iP2Y9ZDooU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYmFzZVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksZj1Tay5idWlsdGluLmFzbnVtJChiKSksMD49Zil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxoPGMpZz1lKGgpL2UoZik7ZWxzZXtoPW5ldyBTay5idWlsdGluLnN0cihhKS4kanNzdHIoKTtjb25zdCBiPWgubGVuZ3RoLGM9cGFyc2VGbG9hdChcXFwiMC5cXFwiK2gpO2c9KGIqZSgxMCkrZShjKSkvZShmKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGcpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwibG9nKHgsIFtiYXNlPWVdKVxcXFxuUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgeCB0byB0aGUgZ2l2ZW4gYmFzZS5cXFxcblxcXFxuSWYgdGhlIGJhc2Ugbm90IHNwZWNpZmllZCwgcmV0dXJucyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gKGJhc2UgZSkgb2YgeC5cXFwifSxsb2cxMDp7JG1ldGg6ZnVuY3Rpb24gbG9nMTAoYSl7dmFyIGI9TWF0aC5sb2cxMDtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgZCxlPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxlPGMpZD1iKGUpO2Vsc2V7ZT1uZXcgU2suYnVpbHRpbi5zdHIoYSkuJGpzc3RyKCk7Y29uc3QgYz1lLmxlbmd0aCxmPXBhcnNlRmxvYXQoXFxcIjAuXFxcIitlKTtkPWMrYihmKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBiYXNlIDEwIGxvZ2FyaXRobSBvZiB4LlxcXCJ9LGxvZzFwOnskbWV0aDpmdW5jdGlvbiBsb2cxcChhKXt2YXIgYj1OdW1iZXIuRVBTSUxPTjtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYz1hLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBjJiYoYz1hLm5iJGZsb2F0KCkudiksLTE+PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNle2lmKDA9PWMpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKTtpZihrKGMpPGIvMilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpO2lmKC0uNTw9YyYmMT49Yyl7Y29uc3QgYT0xK2MsYj1lKGEpLShhLTEtYykvYTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpfWVsc2V7Y29uc3QgYT1lKDErYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX19fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiAxK3ggKGJhc2UgZSkuXFxcXG5cXFxcblRoZSByZXN1bHQgaXMgY29tcHV0ZWQgaW4gYSB3YXkgd2hpY2ggaXMgYWNjdXJhdGUgZm9yIHggbmVhciB6ZXJvLlxcXCJ9LGxvZzI6eyRtZXRoOmZ1bmN0aW9uIGxvZzIoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGIsZD1Tay5idWlsdGluLmFzbnVtJChhKTtpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8ZDxjKWI9aChkKTtlbHNle2Q9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpLiRqc3N0cigpO2NvbnN0IGM9ZC5sZW5ndGgsZT1wYXJzZUZsb2F0KFxcXCIwLlxcXCIrZCk7Yj1jKmgoMTApK2goZSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYmFzZSAyIGxvZ2FyaXRobSBvZiB4LlxcXCJ9LG1vZGY6eyRtZXRoOmZ1bmN0aW9uIG1vZGYoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoIWlzRmluaXRlKGIpKXtpZihiPT0xLzApcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oMCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpXSk7aWYoYj09LUluZmluaXR5KXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0wKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYildKTtpZihpc05hTihiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhiKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYildKX1jb25zdCBjPW4oYik7Yj1rKGIpO2NvbnN0IGU9YypqKGIpLGY9YyooYi1qKGIpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhmKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSldKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgZnJhY3Rpb25hbCBhbmQgaW50ZWdlciBwYXJ0cyBvZiB4LlxcXFxuXFxcXG5Cb3RoIHJlc3VsdHMgY2FycnkgdGhlIHNpZ24gb2YgeCBhbmQgYXJlIGZsb2F0cy5cXFwifSxwb3c6eyRtZXRoOmZ1bmN0aW9uIHBvdyhhLGIpe3ZhciBjPU51bWJlci5pc0ludGVnZXI7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7bGV0IGQ9YS52LGU9Yi52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZCYmKGQ9YS5uYiRmbG9hdCgpLnYpLFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZSYmKGU9Yi5uYiRmbG9hdCgpLnYpLDA9PWQmJjA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2V7aWYoMT09ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDEpO2lmKGkoZCkmJmkoZSkmJjA+ZCYmIWMoZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNlIGlmKC0xPT1kJiYoZT09LUluZmluaXR5fHxlPT0xLzApKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oMSl9Y29uc3QgZj1nKGQsZSk7aWYoIWkoZCl8fCFpKGUpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZik7aWYoZj09MS8wfHxmPT0tSW5maW5pdHkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcXFwibWF0aCByYW5nZSBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHgqKnkgKHggdG8gdGhlIHBvd2VyIG9mIHkpLlxcXCJ9LHJhZGlhbnM6eyRtZXRoOmZ1bmN0aW9uIHJhZGlhbnMoYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZGVnXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtjb25zdCBjPWEvMTgwKlNrLmJ1aWx0aW4uYXNudW0kKGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJDb252ZXJ0IGFuZ2xlIHggZnJvbSBkZWdyZWVzIHRvIHJhZGlhbnMuXFxcIn0scmVtYWluZGVyOnskbWV0aDpmdW5jdGlvbiByZW1haW5kZXIoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtsZXQgZD1hLnYsZT1iLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBkJiYoZD1hLm5iJGZsb2F0KCkudiksXFxcIm51bWJlclxcXCIhPXR5cGVvZiBlJiYoZT1iLm5iJGZsb2F0KCkudiksaXNGaW5pdGUoZCkmJmlzRmluaXRlKGUpKXtsZXQgYSxiLGYsYyxnO2lmKDA9PWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtpZihhPWsoZCksYj1rKGUpLGM9YSViLGY9Yi1jLGM8ZilnPWM7ZWxzZSBpZihjPmYpZz0tZjtlbHNle2lmKGMhPWYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3I7Zz1jLTIqKC41KihhLWMpJWIpfXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8obihkKSpnKX1pZihpc05hTihkKSlyZXR1cm4gYTtpZihpc05hTihlKSlyZXR1cm4gYjtpZihkPT0xLzB8fGQ9PS1JbmZpbml0eSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2lmKGUhPTEvMCYmZSE9LUluZmluaXR5KXRocm93IG5ldyBTay5idWlsdGluLkFzc2VydGlvbkVycm9yO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiRGlmZmVyZW5jZSBiZXR3ZWVuIHggYW5kIHRoZSBjbG9zZXN0IGludGVnZXIgbXVsdGlwbGUgb2YgeS5cXFxcblxcXFxuUmV0dXJuIHggLSBuKnkgd2hlcmUgbip5IGlzIHRoZSBjbG9zZXN0IGludGVnZXIgbXVsdGlwbGUgb2YgeS5cXFxcbkluIHRoZSBjYXNlIHdoZXJlIHggaXMgZXhhY3RseSBoYWxmd2F5IGJldHdlZW4gdHdvIG11bHRpcGxlcyBvZlxcXFxueSwgdGhlIG5lYXJlc3QgZXZlbiB2YWx1ZSBvZiBuIGlzIHVzZWQuIFRoZSByZXN1bHQgaXMgYWx3YXlzIGV4YWN0LlxcXCJ9LHNpbjp7JG1ldGg6ZnVuY3Rpb24gc2luKGEpe3ZhciBiPU1hdGguc2luO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIHNpbmUgb2YgeCAobWVhc3VyZWQgaW4gcmFkaWFucykuXFxcIn0sc2luaDp7JG1ldGg6ZnVuY3Rpb24gc2luaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGI9ZyhkLGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oKGItMS9iKS8yKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaHlwZXJib2xpYyBzaW5lIG9mIHguXFxcIn0sc3FydDp7JG1ldGg6ZnVuY3Rpb24gc3FydChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBjPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIHguXFxcIn0sdGFuOnskbWV0aDpmdW5jdGlvbiB0YW4oYSl7dmFyIGI9TWF0aC50YW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgdGFuZ2VudCBvZiB4IChtZWFzdXJlZCBpbiByYWRpYW5zKS5cXFwifSx0YW5oOnskbWV0aDpmdW5jdGlvbiB0YW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoMD09PWIpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKTtjb25zdCBjPWcoZCxiKSxlPTEvYztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKChjLWUpLzIvKChjK2UpLzIpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIHguXFxcIn0sdHJ1bmM6eyRtZXRoOmZ1bmN0aW9uIHRydW5jKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLmNoZWNrSW50KGEpP2E6bmV3IFNrLmJ1aWx0aW4uaW50XygwfFNrLmJ1aWx0aW4uYXNudW0kKGEpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlRydW5jYXRlcyB0aGUgUmVhbCB4IHRvIHRoZSBuZWFyZXN0IEludGVncmFsIHRvd2FyZCAwLlxcXFxuXFxcXG5Vc2VzIHRoZSBfX3RydW5jX18gbWFnaWMgbWV0aG9kLlxcXCJ9fSksbH07XCIsXCJzcmMvbGliL21kNS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWQ1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWhsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1obGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWltZXRvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1ldG9vbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9taW1ldHlwZXMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1pbWV0eXBlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21pbWlmeS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWltaWZ5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbW9kdWxlZmluZGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtb2R1bGVmaW5kZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tdWx0aWZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm11bHRpZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211bHRpcHJvY2Vzc2luZy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibXVsdGlwcm9jZXNzaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbXVsdGlwcm9jZXNzaW5nL2R1bW15L19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1teSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211dGV4LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtdXRleCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL25ldHJjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJuZXRyYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL25ldy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibmV3IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbm50cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibm50cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL250cGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibnRwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbnR1cmwycGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibnR1cmwycGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL251bWJlcnMucHlcIjpcIk51bWJlciA9IChpbnQsIGZsb2F0LCBjb21wbGV4KVxcbkludGVncmFsID0gaW50XFxuQ29tcGxleCA9IGNvbXBsZXhcXG5cIixcInNyYy9saWIvb3Bjb2RlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvcGNvZGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vcGVyYXRvci5qc1wiOlwiZnVuY3Rpb24gJGJ1aWx0aW5tb2R1bGUoKXtyZXR1cm4gb3BlcmF0b3I9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwib3BlcmF0b3JcXFwiKSxfX2RvY19fOm5ldyBTay5idWlsdGluLnN0cihcXFwiT3BlcmF0b3IgaW50ZXJmYWNlLlxcXFxuXFxcXG5UaGlzIG1vZHVsZSBleHBvcnRzIGEgc2V0IG9mIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBqYXZhc2NyaXB0IGNvcnJlc3BvbmRpbmdcXFxcbnRvIHRoZSBpbnRyaW5zaWMgb3BlcmF0b3JzIG9mIFB5dGhvbi4gIEZvciBleGFtcGxlLCBvcGVyYXRvci5hZGQoeCwgeSlcXFxcbmlzIGVxdWl2YWxlbnQgdG8gdGhlIGV4cHJlc3Npb24geCt5LiAgVGhlIGZ1bmN0aW9uIG5hbWVzIGFyZSB0aG9zZVxcXFxudXNlZCBmb3Igc3BlY2lhbCBtZXRob2RzOyB2YXJpYW50cyB3aXRob3V0IGxlYWRpbmcgYW5kIHRyYWlsaW5nXFxcXG4nX18nIGFyZSBhbHNvIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZS5cXFwiKSxfX2FsbF9fOm5ldyBTay5idWlsdGluLmxpc3QoW1xcXCJhYnNcXFwiLFxcXCJhZGRcXFwiLFxcXCJhbmRfXFxcIixcXFwiYXR0cmdldHRlclxcXCIsXFxcImNvbmNhdFxcXCIsXFxcImNvbnRhaW5zXFxcIixcXFwiY291bnRPZlxcXCIsXFxcImRlbGl0ZW1cXFwiLFxcXCJlcVxcXCIsXFxcImZsb29yZGl2XFxcIixcXFwiZ2VcXFwiLFxcXCJnZXRpdGVtXFxcIixcXFwiZ3RcXFwiLFxcXCJpYWRkXFxcIixcXFwiaWFuZFxcXCIsXFxcImljb25jYXRcXFwiLFxcXCJpZmxvb3JkaXZcXFwiLFxcXCJpbHNoaWZ0XFxcIixcXFwiaW1hdG11bFxcXCIsXFxcImltb2RcXFwiLFxcXCJpbXVsXFxcIixcXFwiaW5kZXhcXFwiLFxcXCJpbmRleE9mXFxcIixcXFwiaW52XFxcIixcXFwiaW52ZXJ0XFxcIixcXFwiaW9yXFxcIixcXFwiaXBvd1xcXCIsXFxcImlyc2hpZnRcXFwiLFxcXCJpc19cXFwiLFxcXCJpc19ub3RcXFwiLFxcXCJpc3ViXFxcIixcXFwiaXRlbWdldHRlclxcXCIsXFxcIml0cnVlZGl2XFxcIixcXFwiaXhvclxcXCIsXFxcImxlXFxcIixcXFwibGVuZ3RoX2hpbnRcXFwiLFxcXCJsc2hpZnRcXFwiLFxcXCJsdFxcXCIsXFxcIm1hdG11bFxcXCIsXFxcIm1ldGhvZGNhbGxlclxcXCIsXFxcIm1vZFxcXCIsXFxcIm11bFxcXCIsXFxcIm5lXFxcIixcXFwibmVnXFxcIixcXFwibm90X1xcXCIsXFxcIm9yX1xcXCIsXFxcInBvc1xcXCIsXFxcInBvd1xcXCIsXFxcInJzaGlmdFxcXCIsXFxcInNldGl0ZW1cXFwiLFxcXCJzdWJcXFwiLFxcXCJ0cnVlZGl2XFxcIixcXFwidHJ1dGhcXFwiLFxcXCJ4b3JcXFwiXS5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSl9LG9wZXJhdG9yLml0ZW1nZXR0ZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwib3BlcmF0b3IuaXRlbWdldHRlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGl0ZW1nZXR0ZXIoYSl7dGhpcy5pdGVtcz1hLHRoaXMub25laXRlbT0xPT09YS5sZW5ndGgsdGhpcy5pdGVtPWFbMF0sdGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGEsYil7cmV0dXJuIFNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIml0ZW1nZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXRlbWdldHRlclxcXCIsYSwxKSxuZXcgb3BlcmF0b3IuaXRlbWdldHRlcihhKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIml0ZW1nZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXRlbWdldHRlclxcXCIsYSwxLDEpO2NvbnN0IGM9YVswXTtyZXR1cm4gdGhpcy5vbmVpdGVtP1NrLmFic3RyLm9iamVjdEdldEl0ZW0oYyx0aGlzLml0ZW0sITApOm5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMuaXRlbXMubWFwKGE9PlNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxhKSkpfSx0cCRkb2M6XFxcIlJldHVybiBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGZldGNoZXMgdGhlIGdpdmVuIGl0ZW0ocykgZnJvbSBpdHMgb3BlcmFuZC5cXFxcbiAgICAgICAgICAgIEFmdGVyIGYgPSBpdGVtZ2V0dGVyKDIpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgclsyXS5cXFxcbiAgICAgICAgICAgIEFmdGVyIGcgPSBpdGVtZ2V0dGVyKDIsIDUsIDMpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHJbMl0sIHJbNV0sIHJbM10pXFxcIiwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudHAkbmFtZStcXFwiKC4uLilcXFwiKTt0aGlzLmluJHJlcHI9ITA7Y29uc3QgYT10aGlzLnRwJG5hbWUrXFxcIihcXFwiK3RoaXMuaXRlbXMubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiO3JldHVybiB0aGlzLmluJHJlcHI9ITEsYX19fSksb3BlcmF0b3IuYXR0cmdldHRlcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJvcGVyYXRvci5hdHRyZ2V0dGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gYXR0cmdldHRlcihhKXt0aGlzLmF0dHJzPWEsdGhpcy5vbmVhdHRyPTE9PT1hLmxlbmd0aCx0aGlzLmF0dHI9YVswXSx0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJhdHRyZ2V0dGVyXFxcIixiKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImF0dHJnZXR0ZXJcXFwiLGEsMSk7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgYj1hW2RdO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2Iudi5pbmNsdWRlcyhcXFwiLlxcXCIpP2MucHVzaChiLiRqc3N0cigpLnNwbGl0KFxcXCIuXFxcIikubWFwKGE9Pm5ldyBTay5idWlsdGluLnN0cihhKSkpOmMucHVzaChbYl0pfXJldHVybiBuZXcgb3BlcmF0b3IuYXR0cmdldHRlcihjKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImF0dHJnZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiYXR0cmdldHRlclxcXCIsYSwxLDEpO2NvbnN0IGM9YVswXTtpZih0aGlzLm9uZWF0dHIpcmV0dXJuIHRoaXMuYXR0ci5yZWR1Y2UoKGEsYik9PlNrLmFic3RyLmdhdHRyKGEsYiksYyk7Y29uc3QgZD10aGlzLmF0dHJzLm1hcChhPT5hLnJlZHVjZSgoYSxiKT0+U2suYWJzdHIuZ2F0dHIoYSxiKSxjKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGQpfSx0cCRkb2M6XFxcImF0dHJnZXR0ZXIoYXR0ciwgLi4uKSAtLT4gYXR0cmdldHRlciBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgZmV0Y2hlcyB0aGUgZ2l2ZW4gYXR0cmlidXRlKHMpIGZyb20gaXRzIG9wZXJhbmQuXFxcXG5BZnRlciBmID0gYXR0cmdldHRlcignbmFtZScpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgci5uYW1lLlxcXFxuQWZ0ZXIgZyA9IGF0dHJnZXR0ZXIoJ25hbWUnLCAnZGF0ZScpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHIubmFtZSwgci5kYXRlKS5cXFxcbkFmdGVyIGggPSBhdHRyZ2V0dGVyKCduYW1lLmZpcnN0JywgJ25hbWUubGFzdCcpLCB0aGUgY2FsbCBoKHIpIHJldHVybnNcXFxcbihyLm5hbWUuZmlyc3QsIHIubmFtZS5sYXN0KS5cXFwiLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy50cCRuYW1lK1xcXCIoLi4uKVxcXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudHAkbmFtZStcXFwiKFxcXCIrdGhpcy5pdGVtcy5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSkuam9pbihcXFwiLCBcXFwiKStcXFwiKVxcXCI7cmV0dXJuIHRoaXMuaW4kcmVwcj0hMSxhfX19KSxvcGVyYXRvci5tZXRob2RjYWxsZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwib3BlcmF0b3IubWV0aG9kY2FsbGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gbWV0aG9kY2FsbGVyKGEsYixjKXt0aGlzLiRuYW1lPWEsdGhpcy5hcmdzPWIsdGhpcy5rd2FyZ3M9Y3x8W10sdGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJtZXRob2RjYWxsZXJcXFwiLGEsMSk7Y29uc3QgYz1hWzBdO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO3JldHVybiBuZXcgb3BlcmF0b3IubWV0aG9kY2FsbGVyKGMsYS5zbGljZSgxKSxiKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIm1ldGhvZGNhbGxlclxcXCIsYiksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJtZXRob2RjYWxsZXJcXFwiLGEsMSwxKTtjb25zdCBjPWFbMF07cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLmdhdHRyKGMsdGhpcy4kbmFtZSwhMCksYT0+U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsdGhpcy5hcmdzLHRoaXMua3dhcmdzKSl9LHRwJGRvYzpcXFwibWV0aG9kY2FsbGVyKG5hbWUsIC4uLikgLS0+IG1ldGhvZGNhbGxlciBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgY2FsbHMgdGhlIGdpdmVuIG1ldGhvZCBvbiBpdHMgb3BlcmFuZC5cXFxcbkFmdGVyIGYgPSBtZXRob2RjYWxsZXIoJ25hbWUnKSwgdGhlIGNhbGwgZihyKSByZXR1cm5zIHIubmFtZSgpLlxcXFxuQWZ0ZXIgZyA9IG1ldGhvZGNhbGxlcignbmFtZScsICdkYXRlJywgZm9vPTEpLCB0aGUgY2FsbCBnKHIpIHJldHVybnNcXFxcbnIubmFtZSgnZGF0ZScsIGZvbz0xKS5cXFwiLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy50cCRuYW1lK1xcXCIoLi4uKVxcXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT1bU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLiRuYW1lKSwuLi50aGlzLmFyZ3MubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpXTtmb3IobGV0IGI9MDtiPHRoaXMua3dhcmdzLmxlbmd0aDtiKz0yKWEucHVzaCh0aGlzLmt3YXJnc1tiXStcXFwiPVxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLmt3YXJnc1tiKzFdKSk7cmV0dXJuIGE9dGhpcy50cCRuYW1lK1xcXCIoXFxcIithLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiLHRoaXMuaW4kcmVwcj0hMSxhfX19KSxTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXFxcIm9wZXJhdG9yXFxcIixvcGVyYXRvcix7bHQ6eyRtZXRoOmZ1bmN0aW9uIGx0KGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJMdFxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPCBiLlxcXCJ9LGxlOnskbWV0aDpmdW5jdGlvbiBsZShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiTHRFXFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA8PSBiLlxcXCJ9LGVxOnskbWV0aDpmdW5jdGlvbiBlcShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiRXFcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID09IGIuXFxcIn0sbmU6eyRtZXRoOmZ1bmN0aW9uIG5lKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJOb3RFcVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgIT0gYi5cXFwifSxnZTp7JG1ldGg6ZnVuY3Rpb24gZ2UoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkd0RVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPj0gYi5cXFwifSxndDp7JG1ldGg6ZnVuY3Rpb24gZ3QoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkd0XFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+IGIuXFxcIn0sbm90Xzp7JG1ldGg6ZnVuY3Rpb24gbm90XyhhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyVW5hcnlPcChhLFxcXCJOb3RcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgbm90IGEuXFxcIn0sdHJ1dGg6eyRtZXRoOmZ1bmN0aW9uIHRydXRoKGEpe3JldHVybiBTay5idWlsdGluLmJvb2woYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiBhIGlzIHRydWUsIEZhbHNlIG90aGVyd2lzZS5cXFwifSxpc186eyRtZXRoOmZ1bmN0aW9uIGlzXyhjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiSXNcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIGlzIGIuXFxcIn0saXNfbm90OnskbWV0aDpmdW5jdGlvbiBpc19ub3QoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIklzTm90XFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSBpcyBub3QgYi5cXFwifSxhYnM6eyRtZXRoOmZ1bmN0aW9uIGFicyhhKXtyZXR1cm4gU2suYnVpbHRpbi5hYnMoYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGFicyhhKS5cXFwifSxhZGQ6eyRtZXRoOmZ1bmN0aW9uIGFkZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkFkZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArIGIuXFxcIn0sYW5kXzp7JG1ldGg6ZnVuY3Rpb24gYW5kXyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkJpdEFuZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAmIGIuXFxcIn0sZmxvb3JkaXY6eyRtZXRoOmZ1bmN0aW9uIGZsb29yZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiRmxvb3JEaXZcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLy8gYi5cXFwifSxpbmRleDp7JG1ldGg6ZnVuY3Rpb24gaW5kZXgoYil7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oU2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYikpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhLl9faW5kZXhfXygpXFxcIn0saW52OnskbWV0aDpmdW5jdGlvbiBpbnYoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiSW52ZXJ0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIH5hLlxcXCJ9LGludmVydDp7JG1ldGg6ZnVuY3Rpb24gaW52ZXJ0KGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIkludmVydFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgfmEuXFxcIn0sbHNoaWZ0OnskbWV0aDpmdW5jdGlvbiBsc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJMU2hpZnRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPDwgYi5cXFwifSxtb2Q6eyRtZXRoOmZ1bmN0aW9uIG1vZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIk1vZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAlIGIuXFxcIn0sbXVsOnskbWV0aDpmdW5jdGlvbiBtdWwoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICogYi5cXFwifSxtYXRtdWw6eyRtZXRoOmZ1bmN0aW9uIG1hdG11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIk1hdE11bHRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgQCBiLlxcXCJ9LG5lZzp7JG1ldGg6ZnVuY3Rpb24gbmVnKGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIlVTdWJcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgLWEuXFxcIn0sb3JfOnskbWV0aDpmdW5jdGlvbiBvcl8oYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJCaXRPclxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSB8IGIuXFxcIn0scG9zOnskbWV0aDpmdW5jdGlvbiBwb3MoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiVUFkZFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyArYS5cXFwifSxwb3c6eyRtZXRoOmZ1bmN0aW9uIHBvdyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIlBvd1xcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAqKiBiLlxcXCJ9LHJzaGlmdDp7JG1ldGg6ZnVuY3Rpb24gcnNoaWZ0KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiUlNoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID4+IGIuXFxcIn0sc3ViOnskbWV0aDpmdW5jdGlvbiBzdWIoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJTdWJcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLSBiLlxcXCJ9LHRydWVkaXY6eyRtZXRoOmZ1bmN0aW9uIGRpdihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvIGIuXFxcIn0seG9yOnskbWV0aDpmdW5jdGlvbiB4b3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJCaXRYb3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgXiBiLlxcXCJ9LGNvbmNhdDp7JG1ldGg6ZnVuY3Rpb24gY29uY2F0KGMsYSl7cmV0dXJuIFNrLmFic3RyLnNlcXVlbmNlQ29uY2F0KGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICsgYiwgZm9yIGEgYW5kIGIgc2VxdWVuY2VzLlxcXCJ9LGNvbnRhaW5zOnskbWV0aDpmdW5jdGlvbiBjb250YWlucyhjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGIgaW4gYSAobm90ZSByZXZlcnNlZCBvcGVyYW5kcykuXFxcIn0sY291bnRPZjp7JG1ldGg6ZnVuY3Rpb24gY291bnRPZihjLGEpe3JldHVybiBTay5hYnN0ci5zZXF1ZW5jZUdldENvdW50T2YoYyxhKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBiIG9jY3VycyBpbiBhLlxcXCJ9LGRlbGl0ZW06eyRtZXRoOmZ1bmN0aW9uIGRlbGl0ZW0oYyxhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIub2JqZWN0RGVsSXRlbShjLGEsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgZGVsIGFbYl0uXFxcIn0sZ2V0aXRlbTp7JG1ldGg6ZnVuY3Rpb24gZ2V0aXRlbShjLGEpe3JldHVybiBTay5hYnN0ci5vYmplY3RHZXRJdGVtKGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhW2JdLlxcXCJ9LGluZGV4T2Y6eyRtZXRoOmZ1bmN0aW9uIGluZGV4T2YoYyxhKXtyZXR1cm4gU2suYWJzdHIuc2VxdWVuY2VHZXRJbmRleE9mKGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBvZiBiIGluIGEuXFxcIn0sc2V0aXRlbTp7JG1ldGg6ZnVuY3Rpb24gc2V0aXRlbShkLGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLm9iamVjdFNldEl0ZW0oZCxhLGIsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MyxNYXhBcmdzOjN9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgYywgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYVtiXSA9IGMuXFxcIn0sbGVuZ3RoX2hpbnQ6eyRtZXRoOmZ1bmN0aW9uIGxlbmd0aF9oaW50KGEsYil7aWYodm9pZCAwPT09YiliPW5ldyBTay5idWlsdGluLmludF8oMCk7ZWxzZSBpZighU2suYnVpbHRpbi5jaGVja0ludChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIidcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1xcXCInIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlclxcXCIpO3RyeXtyZXR1cm4gU2suYnVpbHRpbi5sZW4oYSl9Y2F0Y2goYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5UeXBlRXJyb3IpKXRocm93IGF9Y29uc3QgYz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGxlbmd0aF9oaW50KTtpZih2b2lkIDAhPT1jKXtjb25zdCBhPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtpZihhPT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpcmV0dXJuIGI7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnRlZ2VyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiX19sZW5ndGhfaGludF9fIG11c3QgYmUgYW4gaW50ZWdlciwgbm90IFxcXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2Vsc2UgaWYoYS5uYiRpc25lZ2F0aXZlKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJfX2xlbmd0aF9oaW50X18oKSBzaG91bGQgcmV0dXJuID49IDBcXFwiKTtyZXR1cm4gYX1yZXR1cm4gYn0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIG9iaiwgZGVmYXVsdD0wLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gb2JqLlxcXFxuXFxcXG5UaGlzIGlzIHVzZWZ1bCBmb3IgcHJlc2l6aW5nIGNvbnRhaW5lcnMgd2hlbiBidWlsZGluZyBmcm9tIGFuIGl0ZXJhYmxlLlxcXFxuXFxcXG5JZiB0aGUgb2JqZWN0IHN1cHBvcnRzIGxlbigpLCB0aGUgcmVzdWx0IHdpbGwgYmUgZXhhY3QuXFxcXG5PdGhlcndpc2UsIGl0IG1heSBvdmVyLSBvciB1bmRlci1lc3RpbWF0ZSBieSBhbiBhcmJpdHJhcnkgYW1vdW50LlxcXFxuVGhlIHJlc3VsdCB3aWxsIGJlIGFuIGludGVnZXIgPj0gMC5cXFwifSxpYWRkOnskbWV0aDpmdW5jdGlvbiBpYWRkKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkFkZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArPSBiLlxcXCJ9LGlhbmQ6eyRtZXRoOmZ1bmN0aW9uIGlhbmQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0QW5kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICY9IGIuXFxcIn0saWNvbmNhdDp7JG1ldGg6ZnVuY3Rpb24gaWNvbmNhdChjLGEpe2lmKHZvaWQgMCE9PWMuc3EkaW5wbGFjZV9jb25jYXQpcmV0dXJuIGMuc3EkaW5wbGFjZV9jb25jYXQoYSk7aWYodm9pZCAwIT09Yy5zcSRjb25jYXQpcmV0dXJuIGMuc3EkY29uY2F0KGEpO2lmKCFTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYyl8fCFTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGMpK1xcXCIgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZFxcXCIpO3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJBZGRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKz0gYiwgZm9yIGEgYW5kIGIgc2VxdWVuY2VzLlxcXCJ9LGlmbG9vcmRpdjp7JG1ldGg6ZnVuY3Rpb24gaWZsb29yZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkZsb29yRGl2XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC8vPSBiLlxcXCJ9LGlsc2hpZnQ6eyRtZXRoOmZ1bmN0aW9uIGlsc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTFNoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIDw8PSBiLlxcXCJ9LGltb2Q6eyRtZXRoOmZ1bmN0aW9uIGltb2QoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTW9kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICU9IGIuXFxcIn0saW11bDp7JG1ldGg6ZnVuY3Rpb24gaW11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICo9IGIuXFxcIn0saW1hdG11bDp7JG1ldGg6ZnVuY3Rpb24gaW1hdG11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJNYXRNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIEA9IGIuXFxcIn0saW9yOnskbWV0aDpmdW5jdGlvbiBpb3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0T3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgfD0gYi5cXFwifSxpcG93OnskbWV0aDpmdW5jdGlvbiBpcG93KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIlBvd1xcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAqKj0gYi5cXFwifSxpcnNoaWZ0OnskbWV0aDpmdW5jdGlvbiBpcnNoaWZ0KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkxSaGlmdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+Pj0gYi5cXFwifSxpc3ViOnskbWV0aDpmdW5jdGlvbiBpc3ViKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIlN1YlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAtPSBiLlxcXCJ9LGl0cnVlZGl2OnskbWV0aDpmdW5jdGlvbiBpZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvPSBiLlxcXCJ9LGl4b3I6eyRtZXRoOmZ1bmN0aW9uIGl4b3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0WG9yXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIF49IGIuXFxcIn19KSxPYmplY3QuYXNzaWduKG9wZXJhdG9yLHtfX2Fic19fOm9wZXJhdG9yLmFicyxfX2FkZF9fOm9wZXJhdG9yLmFkZCxfX2FuZF9fOm9wZXJhdG9yLmFuZCxfX2NvbmNhdF9fOm9wZXJhdG9yLmNvbmNhdCxfX2NvbnRhaW5zX186b3BlcmF0b3IuY29udGFpbnMsX19kZWxpdGVtX186b3BlcmF0b3IuZGVsaXRlbSxfX2VxX186b3BlcmF0b3IuZXEsX19mbG9vcmRpdl9fOm9wZXJhdG9yLmZsb29yZGl2LF9fZ2VfXzpvcGVyYXRvci5nZSxfX2dldGl0ZW1fXzpvcGVyYXRvci5nZXRpdGVtLF9fZ3RfXzpvcGVyYXRvci5ndCxfX2lhZGRfXzpvcGVyYXRvci5pYWRkLF9faWFuZF9fOm9wZXJhdG9yLmlhbmQsX19pY29uY2F0X186b3BlcmF0b3IuaWNvbmNhdCxfX2lmbG9vcmRpdl9fOm9wZXJhdG9yLmlmbG9vcmRpdixfX2lsc2hpZnRfXzpvcGVyYXRvci5pbHNoaWZ0LF9faW1hdG11bF9fOm9wZXJhdG9yLmltYXRtdWwsX19pbW9kX186b3BlcmF0b3IuaW1vZCxfX2ltdWxfXzpvcGVyYXRvci5pbXVsLF9faW5kZXhfXzpvcGVyYXRvci5pbmRleCxfX2ludl9fOm9wZXJhdG9yLmludixfX2ludmVydF9fOm9wZXJhdG9yLmludmVydCxfX2lvcl9fOm9wZXJhdG9yLmlvcixfX2lwb3dfXzpvcGVyYXRvci5pcG93LF9faXJzaGlmdF9fOm9wZXJhdG9yLmlyc2hpZnQsX19pc3ViX186b3BlcmF0b3IuaXN1YixfX2l0cnVlZGl2X186b3BlcmF0b3IuaXRydWVkaXYsX19peG9yX186b3BlcmF0b3IuaXhvcixfX2xlX186b3BlcmF0b3IubGUsX19sc2hpZnRfXzpvcGVyYXRvci5sc2hpZnQsX19sdF9fOm9wZXJhdG9yLmx0LF9fbWF0bXVsX186b3BlcmF0b3IubWF0bXVsLF9fbW9kX186b3BlcmF0b3IubW9kLF9fbXVsX186b3BlcmF0b3IubXVsLF9fbmVfXzpvcGVyYXRvci5uZSxfX25lZ19fOm9wZXJhdG9yLm5lZyxfX25vdF9fOm9wZXJhdG9yLm5vdCxfX29yX186b3BlcmF0b3Iub3IsX19wb3NfXzpvcGVyYXRvci5wb3MsX19wb3dfXzpvcGVyYXRvci5wb3csX19yc2hpZnRfXzpvcGVyYXRvci5yc2hpZnQsX19zZXRpdGVtX186b3BlcmF0b3Iuc2V0aXRlbSxfX3N1Yl9fOm9wZXJhdG9yLnN1YixfX3RydWVkaXZfXzpvcGVyYXRvci50cnVlZGl2LF9feG9yX186b3BlcmF0b3IueG9yLF9hYnM6U2suYnVpbHRpbnMuYWJzLGRpdjpvcGVyYXRvci50cnVlZGl2LF9fZGl2X186b3BlcmF0b3IudHJ1ZWRpdn0pLG9wZXJhdG9yfVwiLFwic3JjL2xpYi9vcHRwYXJzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwib3B0cGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwib3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vczJlbXhwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvczJlbXhwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9waWNrbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBpY2tsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BpY2tsZXRvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwaWNrbGV0b29scyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BpcGVzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwaXBlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BrZ3V0aWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBrZ3V0aWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wbGF0Zm9ybS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e30sYj1cXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHdpbmRvdyYmXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cubmF2aWdhdG9yO3JldHVybiBhLnB5dGhvbl9pbXBsZW1lbnRhdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInB5dGhvbl9pbXBsZW1lbnRhdGlvblxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnN0cihcXFwiU2t1bHB0XFxcIil9KSxhLm5vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJub2RlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKX0pLGEudmVyc2lvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInZlcnNpb25cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSksYS5weXRob25fdmVyc2lvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInB5dGhvbl92ZXJzaW9uXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1Tay5fX2Z1dHVyZV9fLnB5dGhvbl92ZXJzaW9uP1xcXCIzLjIuMFxcXCI6XFxcIjIuNy4wXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLnN5c3RlbT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInN5c3RlbVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLGE9Yj93aW5kb3cubmF2aWdhdG9yLmFwcENvZGVOYW1lOlxcXCJcXFwiLG5ldyBTay5idWlsdGluLnN0cihhKX0pLGEubWFjaGluZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1hY2hpbmVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxhPWI/d2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybTpcXFwiXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLnJlbGVhc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJyZWxlYXNlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1iP3dpbmRvdy5uYXZpZ2F0b3IuYXBwVmVyc2lvbjpcXFwiXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLmFyY2hpdGVjdHVyZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImFyY2hpdGVjdHVyZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoXFxcIjY0Yml0XFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKV0pfSksYS5wcm9jZXNzb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJwcm9jZXNzb3JcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSksYX07XCIsXCJzcmMvbGliL3BsYXRmb3JtLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwbGF0Zm9ybSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BsaXN0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwbGlzdGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BvcGVuMi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9wZW4yIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcG9wbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwb3BsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wb3NpeGZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBvc2l4ZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Bvc2l4cGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9zaXhwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHByaW50LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwcHJpbnQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wcm9jZXNzaW5nLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaCxhPU1hdGguUEksaj17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJwcm9jZXNzaW5nXFxcIil9LGs9W10sbD0hMCxtPW51bGw7cmV0dXJuIGoucHJvY2Vzc2luZz1udWxsLGoucD1udWxsLGouWD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouRz1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouQj1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouQT1uZXcgU2suYnVpbHRpbi5pbnRfKDYpLGouVT1uZXcgU2suYnVpbHRpbi5pbnRfKDcpLGouVj1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouTlg9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLk5ZPW5ldyBTay5idWlsdGluLmludF8oMTApLGouTlo9bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksai5FREdFPW5ldyBTay5idWlsdGluLmludF8oMTIpLGouU1I9bmV3IFNrLmJ1aWx0aW4uaW50XygxMyksai5TRz1uZXcgU2suYnVpbHRpbi5pbnRfKDE0KSxqLlNCPW5ldyBTay5idWlsdGluLmludF8oMTUpLGouU0E9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5TVz1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLlRYPW5ldyBTay5idWlsdGluLmludF8oMTgpLGouVFk9bmV3IFNrLmJ1aWx0aW4uaW50XygxOSksai5UWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlZYPW5ldyBTay5idWlsdGluLmludF8oMjEpLGouVlk9bmV3IFNrLmJ1aWx0aW4uaW50XygyMiksai5WWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIzKSxqLlZXPW5ldyBTay5idWlsdGluLmludF8oMjQpLGouQVI9bmV3IFNrLmJ1aWx0aW4uaW50XygyNSksai5BRz1uZXcgU2suYnVpbHRpbi5pbnRfKDI2KSxqLkFCPW5ldyBTay5idWlsdGluLmludF8oMjcpLGouRFI9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkRHPW5ldyBTay5idWlsdGluLmludF8oNCksai5EQj1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouREE9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2KSxqLlNQUj1uZXcgU2suYnVpbHRpbi5pbnRfKDI4KSxqLlNQRz1uZXcgU2suYnVpbHRpbi5pbnRfKDI5KSxqLlNQQj1uZXcgU2suYnVpbHRpbi5pbnRfKDMwKSxqLlNISU5FPW5ldyBTay5idWlsdGluLmludF8oMzEpLGouRVI9bmV3IFNrLmJ1aWx0aW4uaW50XygzMiksai5FRz1uZXcgU2suYnVpbHRpbi5pbnRfKDMzKSxqLkVCPW5ldyBTay5idWlsdGluLmludF8oMzQpLGouQkVFTl9MSVQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNSksai5WRVJURVhfRklFTERfQ09VTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNiksai5DRU5URVI9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLlJBRElVUz1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQ09STkVSUz1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouQ09STkVSPW5ldyBTay5idWlsdGluLmludF8oMCksai5ESUFNRVRFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQkFTRUxJTkU9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLlRPUD1uZXcgU2suYnVpbHRpbi5pbnRfKDEwMSksai5CT1RUT009bmV3IFNrLmJ1aWx0aW4uaW50XygxMDIpLGouTk9STUFMPW5ldyBTay5idWlsdGluLmludF8oMSksai5OT1JNQUxJWkVEPW5ldyBTay5idWlsdGluLmludF8oMSksai5JTUFHRT1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouTU9ERUw9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLlNIQVBFPW5ldyBTay5idWlsdGluLmludF8oNSksai5BTUJJRU5UPW5ldyBTay5idWlsdGluLmludF8oMCksai5ESVJFQ1RJT05BTD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouU1BPVD1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouUkdCPW5ldyBTay5idWlsdGluLmludF8oMSksai5BUkdCPW5ldyBTay5idWlsdGluLmludF8oMiksai5IU0I9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkFMUEhBPW5ldyBTay5idWlsdGluLmludF8oNCksai5DTVlLPW5ldyBTay5idWlsdGluLmludF8oNSksai5USUZGPW5ldyBTay5idWlsdGluLmludF8oMCksai5UQVJHQT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouSlBFRz1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouR0lGPW5ldyBTay5idWlsdGluLmludF8oMyksai5NSVRFUj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIm1pdGVyXFxcIiksai5CRVZFTD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImJldmVsXFxcIiksai5ST1VORD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcInJvdW5kXFxcIiksai5TUVVBUkU9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJidXR0XFxcIiksai5QUk9KRUNUPW5ldyBTay5idWlsdGluLnN0cihcXFwic3F1YXJlXFxcIiksai5QMkQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkpBVkEyRD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouV0VCR0w9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlAzRD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouT1BFTkdMPW5ldyBTay5idWlsdGluLmludF8oMiksai5QREY9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkRYRj1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouT1RIRVI9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLldJTkRPV1M9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLk1BWE9TWD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouTElOVVg9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkVQU0lMT049bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDFlLTQpLGouTUFYX0ZMT0FUPW5ldyBTay5idWlsdGluLmZsb2F0XygzNDAyODIzNWUzMSksai5NSU5fRkxPQVQ9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0zNDAyODIzNWUzMSksai5NQVhfSU5UPW5ldyBTay5idWlsdGluLmludF8oMjE0NzQ4MzY0Nyksai5NSU5fSU5UPW5ldyBTay5idWlsdGluLmludF8oLTIxNDc0ODM2NDgpLGouSEFMRl9QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS8yKSxqLlRISVJEX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XyhhLzMpLGouUEk9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpLGouVFdPX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XygyKmEpLGouVEFVPW5ldyBTay5idWlsdGluLmZsb2F0XygyKmEpLGouUVVBUlRFUl9QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS80KSxqLkRFR19UT19SQUQ9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvMTgwKSxqLlJBRF9UT19ERUc9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDE4MC9hKSxqLldISVRFU1BBQ0U9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIgXFxcXHRcXFxcblxcXFxyXFxcXGZcXFxceEEwXFxcIiksai5QT0lOVD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUE9JTlRTPW5ldyBTay5idWlsdGluLmludF8oMiksai5MSU5FPW5ldyBTay5idWlsdGluLmludF8oNCksai5MSU5FUz1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouVFJJQU5HTEU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg4KSxqLlRSSUFOR0xFUz1uZXcgU2suYnVpbHRpbi5pbnRfKDkpLGouVFJJQU5HTEVfRkFOPW5ldyBTay5idWlsdGluLmludF8oMTEpLGouVFJJQU5HTEVfU1RSSVA9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5RVUFEPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouUVVBRFM9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5RVUFEX1NUUklQPW5ldyBTay5idWlsdGluLmludF8oMTcpLGouUE9MWUdPTj1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlBBVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygyMSksai5SRUNUPW5ldyBTay5idWlsdGluLmludF8oMzApLGouRUxMSVBTRT1uZXcgU2suYnVpbHRpbi5pbnRfKDMxKSxqLkFSQz1uZXcgU2suYnVpbHRpbi5pbnRfKDMyKSxqLlNQSEVSRT1uZXcgU2suYnVpbHRpbi5pbnRfKDQwKSxqLkJPWD1uZXcgU2suYnVpbHRpbi5pbnRfKDQxKSxqLkdST1VQPW5ldyBTay5idWlsdGluLmludF8oMCksai5QUklNSVRJVkU9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkdFT01FVFJZPW5ldyBTay5idWlsdGluLmludF8oMyksai5WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkJFWklFUl9WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkNVUlZFX1ZFUlRFWD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQlJFQUs9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkNMT1NFU0hBUEU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLlJFUExBQ0U9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkJMRU5EPW5ldyBTay5idWlsdGluLmludF8oMSksai5BREQ9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlNVQlRSQUNUPW5ldyBTay5idWlsdGluLmludF8oNCksai5MSUdIVEVTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouREFSS0VTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLkRJRkZFUkVOQ0U9bmV3IFNrLmJ1aWx0aW4uaW50XygzMiksai5FWENMVVNJT049bmV3IFNrLmJ1aWx0aW4uaW50Xyg2NCksai5NVUxUSVBMWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyOCksai5TQ1JFRU49bmV3IFNrLmJ1aWx0aW4uaW50XygyNTYpLGouT1ZFUkxBWT1uZXcgU2suYnVpbHRpbi5pbnRfKDUxMiksai5IQVJEX0xJR0hUPW5ldyBTay5idWlsdGluLmludF8oMTAyNCksai5TT0ZUX0xJR0hUPW5ldyBTay5idWlsdGluLmludF8oMjA0OCksai5ET0RHRT1uZXcgU2suYnVpbHRpbi5pbnRfKDQwOTYpLGouQlVSTj1uZXcgU2suYnVpbHRpbi5pbnRfKDgxOTIpLGouQUxQSEFfTUFTSz1uZXcgU2suYnVpbHRpbi5pbnRfKDQyNzgxOTAwODApLGouUkVEX01BU0s9bmV3IFNrLmJ1aWx0aW4uaW50XygxNjcxMTY4MCksai5HUkVFTl9NQVNLPW5ldyBTay5idWlsdGluLmludF8oNjUyODApLGouQkxVRV9NQVNLPW5ldyBTay5idWlsdGluLmludF8oMjU1KSxqLkNVU1RPTT1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouT1JUSE9HUkFQSElDPW5ldyBTay5idWlsdGluLmludF8oMiksai5QRVJTUEVDVElWRT1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQVJST1c9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJkZWZhdWx0XFxcIiksai5DUk9TUz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImNyb3NzaGFpclxcXCIpLGouSEFORD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcInBvaW50ZXJcXFwiKSxqLk1PVkU9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJtb3ZlXFxcIiksai5URVhUPW5ldyBTay5idWlsdGluLnN0cihcXFwidGV4dFxcXCIpLGouV0FJVD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIndhaXRcXFwiKSxqLk5PQ1VSU09SPVNrLmJ1aWx0aW4uYXNzayQoXFxcInVybCgnZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBUC8vL3dBQUFDSDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUNSQUVBT3c9PScpLCBhdXRvXFxcIiksai5ESVNBQkxFX09QRU5HTF8yWF9TTU9PVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkVOQUJMRV9PUEVOR0xfMlhfU01PT1RIPW5ldyBTay5idWlsdGluLmludF8oLTEpLGouRU5BQkxFX09QRU5HTF80WF9TTU9PVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkVOQUJMRV9OQVRJVkVfRk9OVFM9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkRJU0FCTEVfREVQVEhfVEVTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouRU5BQkxFX0RFUFRIX1RFU1Q9bmV3IFNrLmJ1aWx0aW4uaW50XygtNCksai5FTkFCTEVfREVQVEhfU09SVD1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouRElTQUJMRV9ERVBUSF9TT1JUPW5ldyBTay5idWlsdGluLmludF8oLTUpLGouRElTQUJMRV9PUEVOR0xfRVJST1JfUkVQT1JUPW5ldyBTay5idWlsdGluLmludF8oNiksai5FTkFCTEVfT1BFTkdMX0VSUk9SX1JFUE9SVD1uZXcgU2suYnVpbHRpbi5pbnRfKC02KSxqLkVOQUJMRV9BQ0NVUkFURV9URVhUVVJFUz1uZXcgU2suYnVpbHRpbi5pbnRfKDcpLGouRElTQUJMRV9BQ0NVUkFURV9URVhUVVJFUz1uZXcgU2suYnVpbHRpbi5pbnRfKC03KSxqLkhJTlRfQ09VTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5PUEVOPW5ldyBTay5idWlsdGluLmludF8oMSksai5DTE9TRT1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQkxVUj1uZXcgU2suYnVpbHRpbi5pbnRfKDExKSxqLkdSQVk9bmV3IFNrLmJ1aWx0aW4uaW50XygxMiksai5JTlZFUlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMyksai5PUEFRVUU9bmV3IFNrLmJ1aWx0aW4uaW50XygxNCksai5QT1NURVJJWkU9bmV3IFNrLmJ1aWx0aW4uaW50XygxNSksai5USFJFU0hPTEQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5FUk9ERT1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLkRJTEFURT1uZXcgU2suYnVpbHRpbi5pbnRfKDE4KSxqLkJBQ0tTUEFDRT1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouVEFCPW5ldyBTay5idWlsdGluLmludF8oOSksai5FTlRFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDEwKSxqLlJFVFVSTj1uZXcgU2suYnVpbHRpbi5pbnRfKDEzKSxqLkVTQz1uZXcgU2suYnVpbHRpbi5pbnRfKDI3KSxqLkRFTEVURT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyNyksai5DT0RFRD1uZXcgU2suYnVpbHRpbi5pbnRfKDY1NTM1KSxqLlNISUZUPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouQ09OVFJPTD1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLkFMVD1uZXcgU2suYnVpbHRpbi5pbnRfKDE4KSxqLkNBUFNMSz1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlBHVVA9bmV3IFNrLmJ1aWx0aW4uaW50XygzMyksai5QR0ROPW5ldyBTay5idWlsdGluLmludF8oMzQpLGouRU5EPW5ldyBTay5idWlsdGluLmludF8oMzUpLGouSE9NRT1uZXcgU2suYnVpbHRpbi5pbnRfKDM2KSxqLkxFRlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNyksai5VUD1uZXcgU2suYnVpbHRpbi5pbnRfKDM4KSxqLlJJR0hUPW5ldyBTay5idWlsdGluLmludF8oMzkpLGouRE9XTj1uZXcgU2suYnVpbHRpbi5pbnRfKDQwKSxqLkYxPW5ldyBTay5idWlsdGluLmludF8oMTEyKSxqLkYyPW5ldyBTay5idWlsdGluLmludF8oMTEzKSxqLkYzPW5ldyBTay5idWlsdGluLmludF8oMTE0KSxqLkY0PW5ldyBTay5idWlsdGluLmludF8oMTE1KSxqLkY1PW5ldyBTay5idWlsdGluLmludF8oMTE2KSxqLkY2PW5ldyBTay5idWlsdGluLmludF8oMTE3KSxqLkY3PW5ldyBTay5idWlsdGluLmludF8oMTE4KSxqLkY4PW5ldyBTay5idWlsdGluLmludF8oMTE5KSxqLkY5PW5ldyBTay5idWlsdGluLmludF8oMTIwKSxqLkYxMD1uZXcgU2suYnVpbHRpbi5pbnRfKDEyMSksai5GMTE9bmV3IFNrLmJ1aWx0aW4uaW50XygxMjIpLGouRjEyPW5ldyBTay5idWlsdGluLmludF8oMTIzKSxqLk5VTUxLPW5ldyBTay5idWlsdGluLmludF8oMTQ0KSxqLk1FVEE9bmV3IFNrLmJ1aWx0aW4uaW50XygxNTcpLGouSU5TRVJUPW5ldyBTay5idWlsdGluLmludF8oMTU1KSxqLlNJTkNPU19MRU5HVEg9bmV3IFNrLmJ1aWx0aW4uaW50Xyg3MjApLGouUFJFQ0lTSU9OQj1uZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxqLlBSRUNJU0lPTkY9bmV3IFNrLmJ1aWx0aW4uaW50XygzMjc2OCksai5QUkVDX01BWFZBTD1uZXcgU2suYnVpbHRpbi5pbnRfKDMyNzY3KSxqLlBSRUNfQUxQSEFfU0hJRlQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLlBSRUNfUkVEX1NISUZUPW5ldyBTay5idWlsdGluLmludF8oMSksai5OT1JNQUxfTU9ERV9BVVRPPW5ldyBTay5idWlsdGluLmludF8oMCksai5OT1JNQUxfTU9ERV9TSEFQRT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouTk9STUFMX01PREVfVkVSVEVYPW5ldyBTay5idWlsdGluLmludF8oMiksai5NQVhfTElHSFRTPW5ldyBTay5idWlsdGluLmludF8oOCksai5saW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmxpbmUoYS52LGIudixjLnYsZC52KX0pLGouZWxsaXBzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2oucHJvY2Vzc2luZy5lbGxpcHNlKGEudixiLnYsYy52LGQudil9KSxqLnRleHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLnRleHQoYS52LGIudixjLnYpfSksai5wb2ludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7ai5wcm9jZXNzaW5nLnBvaW50KGEudixiLnYpfSksai5hcmM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmFyYyhhLnYsYi52LGMudixkLnYsZS52LGYudil9KSxqLnF1YWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe2oucHJvY2Vzc2luZy5xdWFkKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpfSksai5yZWN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGU/ai5wcm9jZXNzaW5nLnJlY3QoYS52LGIudixjLnYsZC52KTpqLnByb2Nlc3NpbmcucmVjdChhLnYsYi52LGMudixkLnYsZS52KX0pLGoudHJpYW5nbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLnRyaWFuZ2xlKGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGouYmV6aWVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksayxsLG0pe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaT9qLnByb2Nlc3NpbmcuYmV6aWVyKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5iZXppZXIoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52LGwudixtLnYpfSksai5hbHBoYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYsYy52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYsYy52LGQudikpfSksai5hbWJpZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuYW1iaWVudChhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcuYW1iaWVudChhLnYsYy52KTpqLnByb2Nlc3NpbmcuYW1iaWVudChhLnYsYy52LGQudil9KSxqLmFtYmllbnRMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy5hbWJpZW50TGlnaHQoYS52LGIudixjLnYsZC52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGY/ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudixkLnYsZS52KTpqLnByb2Nlc3NpbmcuYW1iaWVudExpZ2h0KGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGouYmVnaW5DYW1lcmE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5iZWdpbkNhbWVyYSgpfSksai5iZWdpblNoYXBlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhJiYoYT1qLlBPTFlHT04pLGoucHJvY2Vzc2luZy5iZWdpblNoYXBlKGEudil9KSxqLmJlemllckRldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2E9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhPzIwOmEudixqLnByb2Nlc3NpbmcuYmV6aWVyRGV0YWlsKGEpfSksai5iZXppZXJQb2ludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGUsYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmJlemllclBvaW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5iZXppZXJUYW5nZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuYmV6aWVyVGFuZ2VudChlLnYsYS52LGIudixjLnYsZC52KX0pLGouYmV6aWVyVmVydGV4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZz9qLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGg/ai5wcm9jZXNzaW5nLmJlemllclZlcnRleChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaT9qLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5iZXppZXJWZXJ0ZXgoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYpfSksai5ibGVuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGspe290aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxvdGhlciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfP2oucHJvY2Vzc2luZy5ibGVuZChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudik6ai5wcm9jZXNzaW5nLmJsZW5kKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudil9KSxqLmJsZW5kQ29sb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsZCl7dmFyIGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouY29sb3IsW25ldyBTay5idWlsdGluLmludF8oMCksbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApXSk7cmV0dXJuIGUudj1qLnByb2Nlc3NpbmcuYmxlbmRDb2xvcihhLnYsYi52LGQudiksZX0pLGouYnJpZ2h0bmVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5icmlnaHRuZXNzKGEudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmJyaWdodG5lc3MoYS52LGMudikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuYnJpZ2h0bmVzcyhhLnYsYy52LGQudikpfSksai5jYW1lcmE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP2oucHJvY2Vzc2luZy5jYW1lcmEoKTpqLnByb2Nlc3NpbmcuY2FtZXJhKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KX0pLGouY29uc3RyYWluPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmNvbnN0cmFpbihhLnYsYi52LGMudikpfSksai5jb3B5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe290aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxvdGhlciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfP2oucHJvY2Vzc2luZy5jb3B5KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5jb3B5KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KX0pLGouY3JlYXRlRm9udD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBGb250KTtyZXR1cm4gZS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuY3JlYXRlRm9udChhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmNyZWF0ZUZvbnQoYS52LGIudixjLnYpOmoucHJvY2Vzc2luZy5jcmVhdGVGb250KGEudixiLnYsYy52LGQudiksZX0pLGouY3JlYXRlR3JhcGhpY3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QR3JhcGhpY3MpO3JldHVybiBlLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5jcmVhdGVHcmFwaGljcyhhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLmNyZWF0ZUdyYXBoaWNzKGEudixiLnYsYy52LGQudiksZX0pLGouY3JlYXRlSW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7dmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEltYWdlKTtyZXR1cm4gZC52PWoucHJvY2Vzc2luZy5jcmVhdGVJbWFnZShhLnYsYi52LGMudiksZH0pLGouY3Vyc29yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcuY3Vyc29yKCk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5jdXJzb3IoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmN1cnNvcihhLnYsYi52KTpqLnByb2Nlc3NpbmcuY3Vyc29yKGEudixiLnYsYy52KX0pLGouY3VydmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxrLGwsbSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBpP2oucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGs/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGw/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBtP2oucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudixrLnYsbC52KTpqLnByb2Nlc3NpbmcuY3VydmUoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52LGwudixtLnYpfSksai5jdXJ2ZURldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5jdXJ2ZURldGFpbChhLnYpfSksai5jdXJ2ZVBvaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuY3VydmVQb2ludChlLnYsYS52LGIudixjLnYsZC52KX0pLGouY3VydmVUYW5nZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuY3VydmVUYW5nZW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5jdXJ2ZVRpZ2h0bmVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5jdXJ2ZVRpZ2h0bmVzcyhhLnYpfSksai5jdXJ2ZVZlcnRleD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmN1cnZlVmVydGV4KGEudixiLnYpOmoucHJvY2Vzc2luZy5jdXJ2ZVZlcnRleChhLnYsYi52LGMudil9KSxqLmRheT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmRheSgpKX0pLGouZGVncmVlcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRlZ3JlZXMoYS52KSl9KSxqLmRpcmVjdGlvbmFsTGlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmRpcmVjdGlvbmFsTGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5kaXN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRpc3QoYS52LGIudixjLnYsZC52KSk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBmP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuZGlzdChhLnYsYi52LGMudixkLnYsZS52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5kaXN0KGEudixiLnYsYy52LGQudixlLnYsZi52KSl9KSxqLmVtaXNzaXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcuZW1pc3NpdmUoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmVtaXNzaXZlKGEudixiLnYpOmoucHJvY2Vzc2luZy5lbWlzc2l2ZShhLnYsYi52LGMudil9KSxqLmVuZENhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLmVuZENhbWVyYSgpfSksai5lbmRTaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcuZW5kU2hhcGUoKTpqLnByb2Nlc3NpbmcuZW5kU2hhcGUoYS52KX0pLGouZmlsdGVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLmZpbHRlcihhLnYpOmoucHJvY2Vzc2luZy5maWx0ZXIoYS52LGIudil9KSxqLmZydXN0dW09bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmZydXN0dW0oYSxiLGMsZCxlLGYpfSksai5oaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmhpbnQoYSl9KSxqLmhvdXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ob3VyKCkpfSksai5odWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5odWUoYS52KSl9KSxqLmltYWdlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5pbWFnZU1vZGUoYS52KX0pLGoubGVycD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5sZXJwKGEudixiLnYsYy52KSl9KSxqLmxlcnBDb2xvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5jb2xvcixbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCldKTtyZXR1cm4gZS52PWoucHJvY2Vzc2luZy5sZXJwQ29sb3IoYS52LGIudixkLnYpLGV9KSxqLmxpZ2h0RmFsbG9mZj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3NpbmcubGlnaHRGYWxsb2ZmKGEudixiLnYsYy52KX0pLGoubGlnaHRzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcubGlnaHRzKCl9KSxqLmxpZ2h0U3BlY3VsYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLmxpZ2h0U3BlY3VsYXIoYS52LGIudixjLnYpfSksai5sb2FkQnl0ZXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChqLnByb2Nlc3NpbmcubG9hZEJ5dGVzKGEudikpfSksai5sb2FkRm9udD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBGb250KTtyZXR1cm4gYi52PWoucHJvY2Vzc2luZy5sb2FkRm9udChhLnYpLGJ9KSxqLmxvYWRTaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBTaGFwZVNWRyxbbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJzdHJpbmdcXFwiKSxhXSk7cmV0dXJuIGJ9KSxqLmxvYWRTdHJpbmdzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3Qoai5wcm9jZXNzaW5nLmxvYWRTdHJpbmdzKGEudikpfSksai5tYWc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihkLGEsYil7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubWFnKGQudixhLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1hZyhkLnYsYS52LGIudikpfSksai5tYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1hcChhLnYsYi52LGMudixkLnYsZS52KSl9KSxqLm1pbGxpcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1pbGxpcygpKX0pLGoubWludXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcubWludXRlKCkpfSksai5tb2RlbFg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubW9kZWxYKGEudixiLnYsYy52KSl9KSxqLm1vZGVsWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5tb2RlbFkoYS52LGIudixjLnYpKX0pLGoubW9kZWxaPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1vZGVsWihhLnYsYi52LGMudikpfSksai5tb250aD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1vbnRoKCkpfSksai5ub0N1cnNvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vQ3Vyc29yKCl9KSxqLm5vaXNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudixiLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudixiLnYsYy52KSl9KSxqLm5vaXNlRGV0YWlsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtqLnByb2Nlc3Npbmcubm9pc2VEZXRhaWwoYS52LGIudil9KSxqLm5vaXNlU2VlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlU2VlZChhLnYpKX0pLGoubm9MaWdodHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub0xpZ2h0cygpfSksai5ub3JtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vcm0oYS52LGIudixjLnYpKX0pLGoubm9ybWFsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2oucHJvY2Vzc2luZy5ub3JtYWwoYS52LGIudixjLnYpfSksai5ub1RpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub1RpbnQoKX0pLGoub3J0aG89bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLm9ydGhvKGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGoucGVyc3BlY3RpdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKCk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcucGVyc3BlY3RpdmUoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKGEudixiLnYsYy52LGQudil9KSxqLnBvaW50TGlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLnBvaW50TGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5wcmludENhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnByaW50Q2FtZXJhKCl9KSxqLnByaW50bG49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcucHJpbnRsbihhLnYpfSksai5wcmludFByb2plY3Rpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5wcmludFByb2plY3Rpb24oKX0pLGoucmFkaWFucz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhZGlhbnMoYS52KSl9KSxqLnJhbmRvbVNlZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb21TZWVkKGEudikpfSksai5yYW5kb209bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhbmRvbSgpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb20oYS52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb20oYS52LGIudikpfSksai5yZXF1ZXN0SW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBJbWFnZSk7cmV0dXJuIGMudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnJlcXVlc3RJbWFnZShhLnYpOmoucHJvY2Vzc2luZy5yZXF1ZXN0SW1hZ2UoYS52LGIudiksY30pLGouc2F0dXJhdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNhdHVyYXRpb24oYS52KSl9KSxqLnNhdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc2F2ZShhLnYpfSksai5zYXZlRnJhbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLnNhdmVGcmFtZSgpOmoucHJvY2Vzc2luZy5zYXZlRnJhbWUoYS52KX0pLGouc2F2ZVN0cmluZ3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2oucHJvY2Vzc2luZy5zYXZlU3RyaW5ncyhhLnYsYi52KX0pLGouc2NyZWVuWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zY3JlZW5YKGEudixiLnYsYy52KSl9KSxqLnNjcmVlblk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcuc2NyZWVuWShhLnYsYi52LGMudikpfSksai5zY3JlZW5aPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNjcmVlblooYS52LGIudixjLnYpKX0pLGouc2Vjb25kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3Npbmcuc2Vjb25kKCkpfSksai5zaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5zaGFwZShhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3Npbmcuc2hhcGUoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudixkLnYpOmoucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudixkLnYsZS52KX0pLGouc2hhcGVNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnNoYXBlTW9kZShhLnYpfSksai5zaGluaW5lc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc2hpbmluZXNzKGEudil9KSxqLnNwZWN1bGFyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3Npbmcuc3BlY3VsYXIoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnNwZWN1bGFyKGEudixiLnYpOmoucHJvY2Vzc2luZy5zcGVjdWxhcihhLnYsYi52LGMudil9KSxqLnNwb3RMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7ai5wcm9jZXNzaW5nLnNwb3RMaWdodChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KX0pLGouc3E9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zcShhKSl9KSxqLnN0YXR1cz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zdGF0dXMoYS52KX0pLGoudGV4dEFsaWduPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnRleHRBbGlnbihhLnYpOmoucHJvY2Vzc2luZy50ZXh0QWxpZ24oYS52LGIudil9KSxqLnRleHRBc2NlbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnRleHRBc2NlbnQoKSl9KSxqLnRleHREZXNjZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy50ZXh0RGVzY2VudCgpKX0pLGoudGV4dEZvbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcudGV4dEZvbnQoYS52KTpqLnByb2Nlc3NpbmcudGV4dEZvbnQoYS52LGIudil9KSxqLnRleHRMZWFkaW5nPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRMZWFkaW5nKGEudil9KSxqLnRleHRNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRNb2RlKGEudil9KSxqLnRleHRTaXplPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRTaXplKGEudil9KSxqLnRleHR1cmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcudGV4dHVyZShhLnYpfSksai50ZXh0dXJlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy50ZXh0dXJlTW9kZShhLnYpfSksai50ZXh0V2lkdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy50ZXh0V2lkdGgoYS52KSl9KSxqLnRpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnRpbnQoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnRpbnQoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy50aW50KGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcudGludChhLnYsYi52LGMudixkLnYpfSksai51cGRhdGVQaXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy51cGRhdGVQaXhlbHMoKX0pLGoudmVydGV4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy52ZXJ0ZXgoYS52LGIudixjLnYsZC52KTpqLnByb2Nlc3NpbmcudmVydGV4KGEudixiLnYsYy52LGQudixlLnYpfSksai55ZWFyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcueWVhcigpKX0pLGouYm94PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmJveChhLnYpfSksai5zcGhlcmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3BoZXJlKGEudil9KSxqLnNwaGVyZURldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5zcGhlcmVEZXRhaWwoYS52KTpqLnByb2Nlc3Npbmcuc3BoZXJlRGV0YWlsKGEudixiLnYpfSksai5iYWNrZ3JvdW5kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe1xcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksai5wcm9jZXNzaW5nLmJhY2tncm91bmQoYS52LGMsZCl9KSxqLmZpbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxqLnByb2Nlc3NpbmcuZmlsbChhLnYsYyxkLGUpfSksai5zdHJva2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxqLnByb2Nlc3Npbmcuc3Ryb2tlKGEudixjLGQsZSl9KSxqLm5vU3Ryb2tlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3Npbmcubm9TdHJva2UoKX0pLGouY29sb3JNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtiPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj8yNTU6Yi52LFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBlJiYoZT1lLnYpLGoucHJvY2Vzc2luZy5jb2xvck1vZGUoYS52LGIsYyxkLGUpfSksai5ub0ZpbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub0ZpbGwoKX0pLGoubG9vcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYobnVsbD09PWoucHJvY2Vzc2luZyl0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcImxvb3AoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJ1bigpXFxcIik7bD0hMCxqLnByb2Nlc3NpbmcubG9vcCgpfSksai5ub0xvb3A9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKG51bGw9PT1qLnByb2Nlc3NpbmcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uRXhjZXB0aW9uKFxcXCJub0xvb3AoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJ1bigpXFxcIik7bD0hMSxqLnByb2Nlc3Npbmcubm9Mb29wKCl9KSxqLmZyYW1lUmF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5mcmFtZVJhdGUoYS52KX0pLGoud2lkdGg9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLmhlaWdodD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGoucmVuZGVyTW9kZT1qLlAyRCxqLnNpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjJiYoYz1qLlAyRCksai5wcm9jZXNzaW5nLnNpemUoYS52LGIudixjLnYpLGoud2lkdGg9bmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3Npbmcud2lkdGgpLGouaGVpZ2h0PW5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmhlaWdodCksai5yZW5kZXJNb2RlPWN9KSxqLmV4aXRwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcuZXhpdCgpfSksai5tb3VzZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5tb3VzZVgpfSksai5tb3VzZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5tb3VzZVkpfSksai5wbW91c2VYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucG1vdXNlWCl9KSxqLnBtb3VzZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5wbW91c2VZKX0pLGoucmVjdE1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcucmVjdE1vZGUoYS52KX0pLGouc3Ryb2tlV2VpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnN0cm9rZVdlaWdodChhLnYpfSksai5zbW9vdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5zbW9vdGgoKX0pLGoubm9TbW9vdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub1Ntb290aCgpfSksai5lbGxpcHNlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5lbGxpcHNlTW9kZShhLnYpfSksai5zdHJva2VDYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3Ryb2tlQ2FwKGEudil9KSxqLnN0cm9rZUpvaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3Ryb2tlSm9pbihhLnYpfSksai5yb3RhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlKGEudil9KSxqLnJvdGF0ZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlWChhLnYpfSksai5yb3RhdGVZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnJvdGF0ZVkoYS52KX0pLGoucm90YXRlWj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5yb3RhdGVaKGEudil9KSxqLnNjYWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiPzE6Yi52LGM9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjPzE6Yy52LGoucHJvY2Vzc2luZy5zY2FsZShhLnYsYixjKX0pLGoudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiPzE6Yi52LGM9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjPzE6Yy52LGoucHJvY2Vzc2luZy50cmFuc2xhdGUoYS52LGIsYyl9KSxqLnBvcE1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnBvcE1hdHJpeCgpfSksai5wdXNoTWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcucHVzaE1hdHJpeCgpfSksai5hcHBseU1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGEsYj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCwxNik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYlthXT8wOmJbYV0udjtqLnByb2Nlc3NpbmcuYXBwbHlNYXRyaXguYXBwbHkoai5wcm9jZXNzaW5nLGIpfSksai5yZXNldE1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnJlc2V0TWF0cml4KCl9KSxqLnByaW50TWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShqLnByb2Nlc3NpbmcucHJpbnRNYXRyaXgoKSl9KSxqLnJ1bj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU2suY2FudmFzKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoXFxcIlByb2Nlc3NpbmcgbW9kdWxlOiBDYW52YXMgZWxlbWVudCBub3Qgc3BlY2lmaWVkXFxcIik7aWYod2luZG93LlByb2Nlc3NpbmcubG9nZ2VyPXtsb2c6ZnVuY3Rpb24oYSl7U2subWlzY2V2YWwucHJpbnRfKGEpfX0sbT13aW5kb3cuUHJvY2Vzc2luZy5nZXRJbnN0YW5jZUJ5SWQoU2suY2FudmFzKSxtJiZtLmV4aXQoKSxqLnA9bmV3IHdpbmRvdy5Qcm9jZXNzaW5nKGEsZnVuY3Rpb24gc2tldGNoUHJvYyhhKXtqLnByb2Nlc3Npbmc9YSxhLmRyYXc9ZnVuY3Rpb24oKXt2YXIgYj0hMTtmb3IodmFyIGMgaW4gaykwPT09a1tjXS53aWR0aCYmKGI9ITApO2lmKCEwPT1iKXJldHVybiEwPT09bD92b2lkIDA6dm9pZCBhLmxvb3AoKTtpZighMT09PWwmJmEubm9Mb29wKCksai5mcmFtZUNvdW50PWEuZnJhbWVDb3VudCxTay5nbG9iYWxzLmRyYXcpdHJ5e1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5nbG9iYWxzLmRyYXcpfWNhdGNoKGEpe1NrLnVuY2F1Z2h0RXhjZXB0aW9uKGEpfX07dmFyIGI9W1xcXCJzZXR1cFxcXCIsXFxcIm1vdXNlTW92ZWRcXFwiLFxcXCJtb3VzZUNsaWNrZWRcXFwiLFxcXCJtb3VzZURyYWdnZWRcXFwiLFxcXCJtb3VzZU1vdmVkXFxcIixcXFwibW91c2VPdXRcXFwiLFxcXCJtb3VzZU92ZXJcXFwiLFxcXCJtb3VzZVByZXNzZWRcXFwiLFxcXCJtb3VzZVJlbGVhc2VkXFxcIixcXFwia2V5UHJlc3NlZFxcXCIsXFxcImtleVJlbGVhc2VkXFxcIixcXFwia2V5VHlwZWRcXFwiXTtmb3IodmFyIGMgaW4gYilTay5nbG9iYWxzW2JbY11dJiYoYVtiW2NdXT1uZXcgRnVuY3Rpb24oXFxcInRyeSB7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmdsb2JhbHNbJ1xcXCIrYltjXStcXFwiJ10pO30gY2F0Y2goZSkge1NrLnVuY2F1Z2h0RXhjZXB0aW9uKGUpO31cXFwiKSl9KSwwPT09ai53aWR0aC52JiYwPT09ai5oZWlnaHQudil7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLnNpemUsW25ldyBTay5idWlsdGluLmludF8oYiksbmV3IFNrLmJ1aWx0aW4uaW50XyhjKSxqLnJlbmRlck1vZGVdKX19KSxnPWZ1bmN0aW9uKGEsYil7Yi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwieFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5tb3VzZVgpOlxcXCJ5XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcubW91c2VZKTpcXFwicHhcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5wbW91c2VYKTpcXFwicHlcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5wbW91c2VZKTpcXFwicHJlc3NlZFxcXCI9PT1iP25ldyBTay5idWlsdGluLmJvb2woai5wcm9jZXNzaW5nLl9fbW91c2VQcmVzc2VkKTpcXFwiYnV0dG9uXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcubW91c2VCdXR0b24pOnZvaWQgMH0pfSxqLk1vdXNlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixnLFxcXCJNb3VzZVxcXCIsW10pLGoubW91c2U9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouTW91c2UpLGY9ZnVuY3Rpb24oYSxiKXtiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJrZXlcXFwiPT09Yik/bmV3IFNrLmJ1aWx0aW4uc3RyKGoucHJvY2Vzc2luZy5rZXkudG9TdHJpbmcoKSk6XFxcImtleUNvZGVcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5rZXlDb2RlKTpcXFwia2V5UHJlc3NlZFxcXCI9PT1iP25ldyBTay5idWlsdGluLnN0cihqLnByb2Nlc3Npbmcua2V5UHJlc3NlZCk6dm9pZCAwfSl9LGouS2V5Ym9hcmQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGYsXFxcIktleWJvYXJkXFxcIixbXSksai5rZXlib2FyZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5LZXlib2FyZCksZT1mdW5jdGlvbihhLGIpe2IuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImZyYW1lQ291bnRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcuZnJhbWVDb3VudCk6XFxcImZyYW1lUmF0ZVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmZyYW1lUmF0ZSk6XFxcImhlaWdodFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3Npbmcud2lkdGgpOlxcXCJvbmxpbmVcXFwiPT09Yj9uZXcgU2suYnVpbHRpbi5ib29sKGoucHJvY2Vzc2luZy5vbmxpbmUpOlxcXCJmb2N1c2VkXFxcIj09PWI/bmV3IFNrLmJ1aWx0aW4uYm9vbChqLnByb2Nlc3NpbmcuZm9jdXNlZCk6dm9pZCAwfSl9LGouRW52aXJvbm1lbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGUsXFxcIkVudmlyb25tZW50XFxcIixbXSksai5lbnZpcm9ubWVudD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5FbnZpcm9ubWVudCksZD1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnBpeGVscz1udWxsfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwiaGVpZ2h0XFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3Npbmcud2lkdGgpOihcXFwicGl4ZWxzXFxcIj09PWImJm51bGw9PWEucGl4ZWxzJiYoYS5waXhlbHM9bmV3IFNrLmJ1aWx0aW4ubGlzdChqLnByb2Nlc3NpbmcucGl4ZWxzLnRvQXJyYXkoKSkpLGEucGl4ZWxzKX0pfSxqLlNjcmVlbj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZCxcXFwiU2NyZWVuXFxcIixbXSksai5zY3JlZW49U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouU2NyZWVuKSxqLmxvYWRQaXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5sb2FkUGl4ZWxzKCl9KSxjPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBjJiYoYz1jLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZCYmKGQ9ZC52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGUmJihlPWUudiksYS52PWoucHJvY2Vzc2luZy5jb2xvcihiLnYsYyxkLGUpfSl9LGouY29sb3I9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGMsXFxcImNvbG9yXFxcIixbXSksai5yZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucmVkKGEudikpfSksai5ncmVlbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ncmVlbihhLnYpKX0pLGouYmx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ibHVlKGEudikpfSksYj1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUEltYWdlOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYsYy52LGQudil9KSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJ3aWR0aFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LndpZHRoKTpcXFwiaGVpZ2h0XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYuaGVpZ2h0KTp2b2lkIDB9KX0sai5sb2FkSW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1qLnByb2Nlc3NpbmcubG9hZEltYWdlKGEudik7ay5wdXNoKGIpO3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBJbWFnZSk7cmV0dXJuIGMudj1iLGN9KSxqLmltYWdlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmltYWdlKGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcuaW1hZ2UoYS52LGIudixjLnYsZC52LGUudil9KSxqLmdldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9ai5wcm9jZXNzaW5nLmdldChhLnYsYi52KTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouY29sb3IsW25ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLnJlZChjKSksbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuZ3JlZW4oYykpLG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmJsdWUoYykpXSl9KSxqLnNldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3Npbmcuc2V0KGEudixiLnYsYy52KX0pLGg9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3I6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcihiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudixkLnYpfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwieFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGEudi54KTpcXFwieVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LnkpOlxcXCJ6XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYueik6dm9pZCAwfSksYi5nZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYi52PWEudi5nZXQoKSxifSksYi5zZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/YS52LnNldChiLnYsYy52KTphLnYuc2V0KGIudixjLnYsZC52KX0pLGIubWFnPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYXNzayQoYS52Lm1hZygpKX0pLGIuYWRkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYy52PWEudi5hZGQoYi52KSxjfSksYi5zdWI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LnN1YihiLnYpLGN9KSxiLm11bHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52Lm11bHQoYi52KSxjfSksYi5kaXY9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LmRpdihiLnYpLGN9KSxiLmRpc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5idWlsdGluLmFzc2skKGEudi5kaXN0KGIudikpfSksYi5kb3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/U2suYnVpbHRpbi5hc3NrJChhLnYuZG90KGIudikpOlNrLmJ1aWx0aW4uYXNzayQoYS52LmRvdChiLnYsYy52LGQudikpfSksYi5jcm9zcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGMudj1hLnYuY3Jvc3MoYi52KSxjfSksYi5ub3JtYWxpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYubm9ybWFsaXplKCl9KSxiLmxpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYubGltaXQoYi52KX0pLGIuYW5nbGVCZXR3ZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChhLnYuYW5nbGVCZXR3ZWVuKGIudikpfSksYi5hcnJheT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEudi5hcnJheSgpKX0pfSxmb250Q2xhc3M9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUEZvbnQ6bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudil9KSxiLmxpc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYubGlzdCgpKX0pfSxncmFwaGljc0NsYXNzPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudik6bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudixjLnYsZC52KX0pLGIuYmVnaW5EcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmJlZ2luRHJhdygpfSksYi5lbmREcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmVuZERyYXcoKX0pfSxzaGFwZUNsYXNzPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bnVsbDpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52LGMudik6bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52LGMudixkLnYpfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwid2lkdGhcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLnYud2lkdGgpOlxcXCJoZWlnaHRcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEudi5oZWlnaHQpOnZvaWQgMH0pLGIuaXNWaXNpYmxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYS52LmlzVmlzaWJsZSgpKX0pLGIuc2V0VmlzaWJsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnNldFZpc2libGUoYi52KX0pLGIuZGlzYWJsZVN0eWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmRpc2FibGVTdHlsZSgpfSksYi5lbmFibGVTdHlsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5lbmFibGVTdHlsZSgpfSksYi5nZXRDaGlsZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LmdldENoaWxkKGIudik7aWYobnVsbCE9Yyl7dmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFNoYXBlU1ZHKTtyZXR1cm4gZC52PWMsZH1yZXR1cm4gbnVsbH0pLGIudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2Eudi50cmFuc2xhdGUoYi52LGMudik6YS52LnRyYW5zbGF0ZShiLnYsYy52LGQudil9KSxiLnJvdGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnJvdGF0ZShiLnYpfSksYi5yb3RhdGVYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYucm90YXRlWChiLnYpfSksYi5yb3RhdGVZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LnJvdGF0ZVkoYW5nbGUudil9KSxiLnJvdGF0ZVo9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYucm90YXRlWihhbmdsZS52KX0pLGIuc2NhbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/YS52LnNjYWxlKGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2Eudi5zY2FsZShiLnYsYy52KTphLnYuc2NhbGUoYi52LGMudixkLnYpfSl9LGouUEZvbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGZvbnRDbGFzcyxcXFwiUEZvbnRcXFwiLFtdKSxqLlBHcmFwaGljcz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZ3JhcGhpY3NDbGFzcyxcXFwiUEdyYXBoaWNzXFxcIixbXSksai5QU2hhcGVTVkc9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLHNoYXBlQ2xhc3MsXFxcIlBTaGFwZVNWR1xcXCIsW10pLGouUFZlY3Rvcj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosaCxcXFwiUFZlY3RvclxcXCIsW10pLGouUEltYWdlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixiLFxcXCJQSW1hZ2VcXFwiLFtdKSxqfTtcIixcInNyYy9saWIvcHJvZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHJvZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BzdGF0cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHN0YXRzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHR5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwdHkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weV9jb21waWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweV9jb21waWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHljbGJyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweWNsYnIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weWRvYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHlkb2MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weWRvY190b3BpY3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInB5ZG9jX3RvcGljcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL19faW5pdF9fLnB5XCI6XCJcIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvX19pbml0X18ucHlcIjpcIlxcbiNfX2FsbF9fID0gW1xcXCJzdGFja1xcXCJdXFxuXFxuXFxuZnJvbSAuc3RhY2sgaW1wb3J0IFN0YWNrXFxuZnJvbSAucXVldWUgaW1wb3J0IFF1ZXVlXFxuZnJvbSAuZGVxdWUgaW1wb3J0IERlcXVlXFxuXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2Jhc2ljL2RlcXVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuI1xcbiMgZGVxdWUucHlcXG5cXG5cXG5jbGFzcyBEZXF1ZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIGFkZEZyb250KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGFkZFJlYXIoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmluc2VydCgwLCBpdGVtKVxcblxcbiAgICBkZWYgcmVtb3ZlRnJvbnQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlUmVhcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgwKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvcXVldWUucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jXFxuIyBxdWV1ZS5weVxcblxcblxcbmNsYXNzIFF1ZXVlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzRW1wdHkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcyA9PSBbXVxcblxcbiAgICBkZWYgZW5xdWV1ZShzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiBkZXF1ZXVlKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2Jhc2ljL3N0YWNrLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuI1xcbiMgc3RhY2sucHlcXG5cXG5cXG5jbGFzcyBTdGFjazpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIHB1c2goc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgcG9wKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHBlZWsoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtc1tsZW4oc2VsZi5pdGVtcykgLSAxXVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvZ3JhcGhzL19faW5pdF9fLnB5XCI6XCJcXG5cXG5mcm9tIC5hZGpHcmFwaCBpbXBvcnQgR3JhcGhcXG5mcm9tIC5hZGpHcmFwaCBpbXBvcnQgVmVydGV4XFxuZnJvbSAucHJpb3JpdHlRdWV1ZSBpbXBvcnQgUHJpb3JpdHlRdWV1ZVxcblwiLFwic3JjL2xpYi9weXRob25kcy9ncmFwaHMvYWRqR3JhcGgucHlcIjpcIiNcXG4jICBhZGpHcmFwaFxcbiNcXG4jICBDcmVhdGVkIGJ5IEJyYWQgTWlsbGVyIG9uIDIwMDUtMDItMjQuXFxuIyAgQ29weXJpZ2h0IChjKSAyMDA1IEJyYWQgTWlsbGVyLCBEYXZpZCBSYW51bSwgTHV0aGVyIENvbGxlZ2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXFxuI1xcblxcbmltcG9ydCBzeXNcXG5pbXBvcnQgb3NcXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG5jbGFzcyBHcmFwaDpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi52ZXJ0aWNlcyA9IHt9XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gMFxcbiAgICAgICAgXFxuICAgIGRlZiBhZGRWZXJ0ZXgoc2VsZixrZXkpOlxcbiAgICAgICAgc2VsZi5udW1WZXJ0aWNlcyA9IHNlbGYubnVtVmVydGljZXMgKyAxXFxuICAgICAgICBuZXdWZXJ0ZXggPSBWZXJ0ZXgoa2V5KVxcbiAgICAgICAgc2VsZi52ZXJ0aWNlc1trZXldID0gbmV3VmVydGV4XFxuICAgICAgICByZXR1cm4gbmV3VmVydGV4XFxuICAgIFxcbiAgICBkZWYgZ2V0VmVydGV4KHNlbGYsbik6XFxuICAgICAgICBpZiBuIGluIHNlbGYudmVydGljZXM6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYudmVydGljZXNbbl1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLG4pOlxcbiAgICAgICAgcmV0dXJuIG4gaW4gc2VsZi52ZXJ0aWNlc1xcbiAgICBcXG4gICAgZGVmIGFkZEVkZ2Uoc2VsZixmLHQsY29zdD0wKTpcXG4gICAgICAgICAgICBpZiBmIG5vdCBpbiBzZWxmLnZlcnRpY2VzOlxcbiAgICAgICAgICAgICAgICBudiA9IHNlbGYuYWRkVmVydGV4KGYpXFxuICAgICAgICAgICAgaWYgdCBub3QgaW4gc2VsZi52ZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFkZFZlcnRleCh0KVxcbiAgICAgICAgICAgIHNlbGYudmVydGljZXNbZl0uYWRkTmVpZ2hib3Ioc2VsZi52ZXJ0aWNlc1t0XSxjb3N0KVxcbiAgICBcXG4gICAgZGVmIGdldFZlcnRpY2VzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi52ZXJ0aWNlcy5rZXlzKCkpXFxuICAgICAgICBcXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi52ZXJ0aWNlcy52YWx1ZXMoKSlcXG4gICAgICAgICAgICAgICAgXFxuY2xhc3MgVmVydGV4OlxcbiAgICBkZWYgX19pbml0X18oc2VsZixudW0pOlxcbiAgICAgICAgc2VsZi5pZCA9IG51bVxcbiAgICAgICAgc2VsZi5jb25uZWN0ZWRUbyA9IHt9XFxuICAgICAgICBzZWxmLmNvbG9yID0gJ3doaXRlJ1xcbiAgICAgICAgc2VsZi5kaXN0ID0gc3lzLm1heHNpemVcXG4gICAgICAgIHNlbGYucHJlZCA9IE5vbmVcXG4gICAgICAgIHNlbGYuZGlzYyA9IDBcXG4gICAgICAgIHNlbGYuZmluID0gMFxcblxcbiAgICAjIGRlZiBfX2x0X18oc2VsZixvKTpcXG4gICAgIyAgICAgcmV0dXJuIHNlbGYuaWQgPCBvLmlkXFxuICAgIFxcbiAgICBkZWYgYWRkTmVpZ2hib3Ioc2VsZixuYnIsd2VpZ2h0PTApOlxcbiAgICAgICAgc2VsZi5jb25uZWN0ZWRUb1tuYnJdID0gd2VpZ2h0XFxuICAgICAgICBcXG4gICAgZGVmIHNldENvbG9yKHNlbGYsY29sb3IpOlxcbiAgICAgICAgc2VsZi5jb2xvciA9IGNvbG9yXFxuICAgICAgICBcXG4gICAgZGVmIHNldERpc3RhbmNlKHNlbGYsZCk6XFxuICAgICAgICBzZWxmLmRpc3QgPSBkXFxuXFxuICAgIGRlZiBzZXRQcmVkKHNlbGYscCk6XFxuICAgICAgICBzZWxmLnByZWQgPSBwXFxuXFxuICAgIGRlZiBzZXREaXNjb3Zlcnkoc2VsZixkdGltZSk6XFxuICAgICAgICBzZWxmLmRpc2MgPSBkdGltZVxcbiAgICAgICAgXFxuICAgIGRlZiBzZXRGaW5pc2goc2VsZixmdGltZSk6XFxuICAgICAgICBzZWxmLmZpbiA9IGZ0aW1lXFxuICAgICAgICBcXG4gICAgZGVmIGdldEZpbmlzaChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmZpblxcbiAgICAgICAgXFxuICAgIGRlZiBnZXREaXNjb3Zlcnkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5kaXNjXFxuICAgICAgICBcXG4gICAgZGVmIGdldFByZWQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wcmVkXFxuICAgICAgICBcXG4gICAgZGVmIGdldERpc3RhbmNlKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGlzdFxcbiAgICAgICAgXFxuICAgIGRlZiBnZXRDb2xvcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbG9yXFxuICAgIFxcbiAgICBkZWYgZ2V0Q29ubmVjdGlvbnMoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0ZWRUby5rZXlzKClcXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0V2VpZ2h0KHNlbGYsbmJyKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3RlZFRvW25icl1cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLmlkKSArIFxcXCI6Y29sb3IgXFxcIiArIHNlbGYuY29sb3IgKyBcXFwiOmRpc2MgXFxcIiArIHN0cihzZWxmLmRpc2MpICsgXFxcIjpmaW4gXFxcIiArIHN0cihzZWxmLmZpbikgKyBcXFwiOmRpc3QgXFxcIiArIHN0cihzZWxmLmRpc3QpICsgXFxcIjpwcmVkIFxcXFxuXFxcXHRbXFxcIiArIHN0cihzZWxmLnByZWQpKyBcXFwiXVxcXFxuXFxcIlxcbiAgICBcXG4gICAgZGVmIGdldElkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaWRcXG5cXG5jbGFzcyBhZGpHcmFwaFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKTpcXG4gICAgZGVmIHNldFVwKHNlbGYpOlxcbiAgICAgICAgc2VsZi50R3JhcGggPSBHcmFwaCgpXFxuICAgICAgICBcXG4gICAgZGVmIHRlc3RNYWtlR3JhcGgoc2VsZik6XFxuICAgICAgICBnRmlsZSA9IG9wZW4oXFxcInRlc3QuZGF0XFxcIilcXG4gICAgICAgIGZvciBsaW5lIGluIGdGaWxlOlxcbiAgICAgICAgICAgIGZWZXJ0ZXgsIHRWZXJ0ZXggPSBsaW5lLnNwbGl0KCd8JylcXG4gICAgICAgICAgICBmVmVydGV4ID0gaW50KGZWZXJ0ZXgpXFxuICAgICAgICAgICAgdFZlcnRleCA9IGludCh0VmVydGV4KVxcbiAgICAgICAgICAgIHNlbGYudEdyYXBoLmFkZEVkZ2UoZlZlcnRleCx0VmVydGV4KVxcbiAgICAgICAgZm9yIGkgaW4gc2VsZi50R3JhcGg6XFxuICAgICAgICAgICAgYWRqID0gaS5nZXRBZGooKVxcbiAgICAgICAgICAgIGZvciBrIGluIGFkajpcXG4gICAgICAgICAgICAgICAgcHJpbnQoaSwgaylcXG5cXG4gICAgICAgIFxcbmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6XFxuICAgIHVuaXR0ZXN0Lm1haW4oKVxcbiAgICAgICAgICAgICAgXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2dyYXBocy9wcmlvcml0eVF1ZXVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuIyBcXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG4jIHRoaXMgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IGhlYXAgdGFrZXMga2V5IHZhbHVlIHBhaXJzLFxcbiMgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUga2V5cyBhcmUgYWxsIGNvbXBhcmFibGVcXG5cXG5jbGFzcyBQcmlvcml0eVF1ZXVlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmhlYXBBcnJheSA9IFsoMCwwKV1cXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSAwXFxuXFxuICAgIGRlZiBidWlsZEhlYXAoc2VsZixhbGlzdCk6XFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gbGVuKGFsaXN0KVxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXkgPSBbKDAsMCldXFxuICAgICAgICBmb3IgaSBpbiBhbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmhlYXBBcnJheS5hcHBlbmQoaSlcXG4gICAgICAgIGkgPSBsZW4oYWxpc3QpIC8vIDIgICAgICAgICAgICBcXG4gICAgICAgIHdoaWxlIChpID4gMCk6XFxuICAgICAgICAgICAgc2VsZi5wZXJjRG93bihpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgcGVyY0Rvd24oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi5jdXJyZW50U2l6ZTpcXG4gICAgICAgICAgICBtYyA9IHNlbGYubWluQ2hpbGQoaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBBcnJheVtpXVswXSA+IHNlbGYuaGVhcEFycmF5W21jXVswXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwQXJyYXlbaV1cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbaV0gPSBzZWxmLmhlYXBBcnJheVttY11cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbbWNdID0gdG1wXFxuICAgICAgICAgICAgaSA9IG1jXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgbWluQ2hpbGQoc2VsZixpKTpcXG4gICAgICAgIGlmIGkqMiA+IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgcmV0dXJuIC0xXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGkqMiArIDEgPiBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSoyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5oZWFwQXJyYXlbaSoyXVswXSA8IHNlbGYuaGVhcEFycmF5W2kqMisxXVswXTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjIrMVxcblxcbiAgICBkZWYgcGVyY1VwKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2ldWzBdIDwgc2VsZi5oZWFwQXJyYXlbaS8vMl1bMF06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwQXJyYXlbaS8vMl1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBBcnJheVtpLy8yXSA9IHNlbGYuaGVhcEFycmF5W2ldXFxuICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbaV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaS8vMlxcbiBcXG4gICAgZGVmIGFkZChzZWxmLGspOlxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXkuYXBwZW5kKGspXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSArIDFcXG4gICAgICAgIHNlbGYucGVyY1VwKHNlbGYuY3VycmVudFNpemUpXFxuXFxuICAgIGRlZiBkZWxNaW4oc2VsZik6XFxuICAgICAgICByZXR2YWwgPSBzZWxmLmhlYXBBcnJheVsxXVsxXVxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXlbMV0gPSBzZWxmLmhlYXBBcnJheVtzZWxmLmN1cnJlbnRTaXplXVxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IHNlbGYuY3VycmVudFNpemUgLSAxXFxuICAgICAgICBzZWxmLmhlYXBBcnJheS5wb3AoKVxcbiAgICAgICAgc2VsZi5wZXJjRG93bigxKVxcbiAgICAgICAgcmV0dXJuIHJldHZhbFxcbiAgICAgICAgXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5jdXJyZW50U2l6ZSA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgZGVjcmVhc2VLZXkoc2VsZix2YWwsYW10KTpcXG4gICAgICAgICMgdGhpcyBpcyBhIGxpdHRsZSB3aWVyZCwgYnV0IHdlIG5lZWQgdG8gZmluZCB0aGUgaGVhcCB0aGluZyB0byBkZWNyZWFzZSBieVxcbiAgICAgICAgIyBsb29raW5nIGF0IGl0cyB2YWx1ZVxcbiAgICAgICAgZG9uZSA9IEZhbHNlXFxuICAgICAgICBpID0gMVxcbiAgICAgICAgbXlLZXkgPSAwXFxuICAgICAgICB3aGlsZSBub3QgZG9uZSBhbmQgaSA8PSBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2ldWzFdID09IHZhbDpcXG4gICAgICAgICAgICAgICAgZG9uZSA9IFRydWVcXG4gICAgICAgICAgICAgICAgbXlLZXkgPSBpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaSA9IGkgKyAxXFxuICAgICAgICBpZiBteUtleSA+IDA6XFxuICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbbXlLZXldID0gKGFtdCxzZWxmLmhlYXBBcnJheVtteUtleV1bMV0pXFxuICAgICAgICAgICAgc2VsZi5wZXJjVXAobXlLZXkpXFxuICAgICAgICAgICAgXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZix2dHgpOlxcbiAgICAgICAgZm9yIHBhaXIgaW4gc2VsZi5oZWFwQXJyYXk6XFxuICAgICAgICAgICAgaWYgcGFpclsxXSA9PSB2dHg6XFxuICAgICAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICByZXR1cm4gRmFsc2VcXG4gICAgICAgIFxcbmNsYXNzIFRlc3RCaW5IZWFwKHVuaXR0ZXN0LlRlc3RDYXNlKTpcXG4gICAgZGVmIHNldFVwKHNlbGYpOlxcbiAgICAgICAgc2VsZi50aGVIZWFwID0gUHJpb3JpdHlRdWV1ZSgpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCgyLCd4JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCgzLCd5JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg1LCd6JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg2LCdhJykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg0LCdkJykpXFxuXFxuXFxuICAgIGRlZiB0ZXN0SW5zZXJ0KHNlbGYpOlxcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5jdXJyZW50U2l6ZSA9PSA1XFxuXFxuICAgIGRlZiB0ZXN0RGVsbWluKHNlbGYpOlxcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5kZWxNaW4oKSA9PSAneCdcXG4gICAgICAgIGFzc2VydCBzZWxmLnRoZUhlYXAuZGVsTWluKCkgPT0gJ3knXFxuICAgIFxcbiAgICBkZWYgdGVzdERlY0tleShzZWxmKTpcXG4gICAgICAgIHNlbGYudGhlSGVhcC5kZWNyZWFzZUtleSgnZCcsMSlcXG4gICAgICAgIGFzc2VydCBzZWxmLnRoZUhlYXAuZGVsTWluKCkgPT0gJ2QnXFxuICAgICAgICBcXG5pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOlxcbiAgICB1bml0dGVzdC5tYWluKClcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvX19pbml0X18ucHlcIjpcIlxcbmZyb20gLmJpbmFyeVRyZWUgaW1wb3J0IEJpbmFyeVRyZWVcXG5mcm9tIC5iYWxhbmNlIGltcG9ydCBBVkxUcmVlXFxuZnJvbSAuYnN0IGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlXFxuZnJvbSAuYmluaGVhcCBpbXBvcnQgQmluSGVhcFxcblxcblxcblwiLFwic3JjL2xpYi9weXRob25kcy90cmVlcy9iYWxhbmNlLnB5XCI6XCIjIS9iaW4vZW52IHB5dGhvbjMuMVxcbiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG4jIFxcblxcbmZyb20gLmJzdCBpbXBvcnQgQmluYXJ5U2VhcmNoVHJlZSwgVHJlZU5vZGVcXG5cXG5jbGFzcyBBVkxUcmVlKEJpbmFyeVNlYXJjaFRyZWUpOlxcbiAgICAnJydcXG4gICAgQXV0aG9yOiAgQnJhZCBNaWxsZXJcXG4gICAgRGF0ZTogIDEvMTUvMjAwNVxcbiAgICBEZXNjcmlwdGlvbjogIEltbGVtZW50IGEgYmluYXJ5IHNlYXJjaCB0cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VcXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbnM6ICBcXG4gICAgICAgICAgICAgICAgICBfX2NvbnRhaW5zX18oeSkgPD09PiB5IGluIHhcXG4gICAgICAgICAgICAgICAgICBfX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV1cXG4gICAgICAgICAgICAgICAgICBfX2luaXRfXygpXFxuICAgICAgICAgICAgICAgICAgX19sZW5fXygpIDw9PT4gbGVuKHgpXFxuICAgICAgICAgICAgICAgICAgX19zZXRpdGVtX18oayx2KSA8PT0+IHhba10gPSB2XFxuICAgICAgICAgICAgICAgICAgY2xlYXIoKVxcbiAgICAgICAgICAgICAgICAgIGdldChrKVxcbiAgICAgICAgICAgICAgICAgIGhhc19rZXkoaylcXG4gICAgICAgICAgICAgICAgICBpdGVtcygpIFxcbiAgICAgICAgICAgICAgICAgIGtleXMoKSBcXG4gICAgICAgICAgICAgICAgICB2YWx1ZXMoKVxcbiAgICAgICAgICAgICAgICAgIHB1dChrLHYpXFxuICAgICcnJ1xcblxcblxcbiAgICBkZWYgX3B1dChzZWxmLGtleSx2YWwsY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudE5vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LHZhbCxjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQmFsYW5jZShjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQmFsYW5jZShjdXJyZW50Tm9kZS5yaWdodENoaWxkKSAgICAgICAgICAgICAgICBcXG5cXG4gICAgZGVmIHVwZGF0ZUJhbGFuY2Uoc2VsZixub2RlKTpcXG4gICAgICAgIGlmIG5vZGUuYmFsYW5jZUZhY3RvciA+IDEgb3Igbm9kZS5iYWxhbmNlRmFjdG9yIDwgLTE6XFxuICAgICAgICAgICAgc2VsZi5yZWJhbGFuY2Uobm9kZSlcXG4gICAgICAgICAgICByZXR1cm5cXG4gICAgICAgIGlmIG5vZGUucGFyZW50ICE9IE5vbmU6XFxuICAgICAgICAgICAgaWYgbm9kZS5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlRmFjdG9yICs9IDFcXG4gICAgICAgICAgICBlbGlmIG5vZGUuaXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LmJhbGFuY2VGYWN0b3IgLT0gMVxcblxcbiAgICAgICAgICAgIGlmIG5vZGUucGFyZW50LmJhbGFuY2VGYWN0b3IgIT0gMDpcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVCYWxhbmNlKG5vZGUucGFyZW50KVxcblxcbiAgICBkZWYgcmViYWxhbmNlKHNlbGYsbm9kZSk6XFxuICAgICAgICBpZiBub2RlLmJhbGFuY2VGYWN0b3IgPCAwOlxcbiAgICAgICAgICAgIGlmIG5vZGUucmlnaHRDaGlsZC5iYWxhbmNlRmFjdG9yID4gMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBMUiBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZVJpZ2h0KG5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVMZWZ0KG5vZGUpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgIyBzaW5nbGUgbGVmdFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUxlZnQobm9kZSlcXG4gICAgICAgIGVsaWYgbm9kZS5iYWxhbmNlRmFjdG9yID4gMDpcXG4gICAgICAgICAgICBpZiBub2RlLmxlZnRDaGlsZC5iYWxhbmNlRmFjdG9yIDwgMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBSTCBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUxlZnQobm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlUmlnaHQobm9kZSlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAjIHNpbmdsZSByaWdodFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZVJpZ2h0KG5vZGUpXFxuXFxuICAgIGRlZiByb3RhdGVMZWZ0KHNlbGYscm90Um9vdCk6XFxuICAgICAgICBuZXdSb290ID0gcm90Um9vdC5yaWdodENoaWxkXFxuICAgICAgICByb3RSb290LnJpZ2h0Q2hpbGQgPSBuZXdSb290LmxlZnRDaGlsZFxcbiAgICAgICAgaWYgbmV3Um9vdC5sZWZ0Q2hpbGQgIT0gTm9uZTpcXG4gICAgICAgICAgICBuZXdSb290LmxlZnRDaGlsZC5wYXJlbnQgPSByb3RSb290XFxuICAgICAgICBuZXdSb290LnBhcmVudCA9IHJvdFJvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RSb290LmlzUm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IG5ld1Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90Um9vdC5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5sZWZ0Q2hpbGQgPSBuZXdSb290XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90Um9vdC5wYXJlbnQucmlnaHRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgIG5ld1Jvb3QubGVmdENoaWxkID0gcm90Um9vdFxcbiAgICAgICAgcm90Um9vdC5wYXJlbnQgPSBuZXdSb290XFxuICAgICAgICByb3RSb290LmJhbGFuY2VGYWN0b3IgPSByb3RSb290LmJhbGFuY2VGYWN0b3IgKyAxIC0gbWluKG5ld1Jvb3QuYmFsYW5jZUZhY3RvciwgMClcXG4gICAgICAgIG5ld1Jvb3QuYmFsYW5jZUZhY3RvciA9IG5ld1Jvb3QuYmFsYW5jZUZhY3RvciArIDEgKyBtYXgocm90Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcblxcblxcbiAgICBkZWYgcm90YXRlUmlnaHQoc2VsZixyb3RSb290KTpcXG4gICAgICAgIG5ld1Jvb3QgPSByb3RSb290LmxlZnRDaGlsZFxcbiAgICAgICAgcm90Um9vdC5sZWZ0Q2hpbGQgPSBuZXdSb290LnJpZ2h0Q2hpbGRcXG4gICAgICAgIGlmIG5ld1Jvb3QucmlnaHRDaGlsZCAhPSBOb25lOlxcbiAgICAgICAgICAgIG5ld1Jvb3QucmlnaHRDaGlsZC5wYXJlbnQgPSByb3RSb290XFxuICAgICAgICBuZXdSb290LnBhcmVudCA9IHJvdFJvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RSb290LmlzUm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IG5ld1Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90Um9vdC5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgcm90Um9vdC5wYXJlbnQucmlnaHRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5sZWZ0Q2hpbGQgPSBuZXdSb290XFxuICAgICAgICBuZXdSb290LnJpZ2h0Q2hpbGQgPSByb3RSb290XFxuICAgICAgICByb3RSb290LnBhcmVudCA9IG5ld1Jvb3RcXG4gICAgICAgIHJvdFJvb3QuYmFsYW5jZUZhY3RvciA9IHJvdFJvb3QuYmFsYW5jZUZhY3RvciAtIDEgLSBtYXgobmV3Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcbiAgICAgICAgbmV3Um9vdC5iYWxhbmNlRmFjdG9yID0gbmV3Um9vdC5iYWxhbmNlRmFjdG9yIC0gMSArIG1pbihyb3RSb290LmJhbGFuY2VGYWN0b3IsIDApXFxuICAgICAgICBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvYmluYXJ5VHJlZS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNVxcbiMgXFxuXFxuY2xhc3MgQmluYXJ5VHJlZTpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIEEgcmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIEJpbmFyeSBUcmVlXFxuICAgIFVzaW5nIGxpbmtzIGFuZCBOb2RlcyBhcHByb2FjaC5cXG4gICAgXFxcIlxcXCJcXFwiICAgIFxcbiAgICBkZWYgX19pbml0X18oc2VsZixyb290T2JqKTpcXG4gICAgICAgIHNlbGYua2V5ID0gcm9vdE9ialxcbiAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBOb25lXFxuICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQgPSBOb25lXFxuXFxuICAgIGRlZiBpbnNlcnRMZWZ0KHNlbGYsbmV3Tm9kZSk6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZCA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICB0ID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgICAgIHQubGVmdCA9IHNlbGYubGVmdENoaWxkXFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSB0XFxuICAgIFxcbiAgICBkZWYgaW5zZXJ0UmlnaHQoc2VsZixuZXdOb2RlKTpcXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZCA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZCA9IEJpbmFyeVRyZWUobmV3Tm9kZSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgdCA9IEJpbmFyeVRyZWUobmV3Tm9kZSlcXG4gICAgICAgICAgICB0LnJpZ2h0ID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkID0gdFxcblxcbiAgICBkZWYgaXNMZWFmKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuICgobm90IHNlbGYubGVmdENoaWxkKSBhbmQgKG5vdCBzZWxmLnJpZ2h0Q2hpbGQpKVxcblxcbiAgICBkZWYgZ2V0UmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGRcXG5cXG4gICAgZGVmIGdldExlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmxlZnRDaGlsZFxcblxcbiAgICBkZWYgc2V0Um9vdFZhbChzZWxmLG9iaik6XFxuICAgICAgICBzZWxmLmtleSA9IG9ialxcblxcbiAgICBkZWYgZ2V0Um9vdFZhbChzZWxmLCk6XFxuICAgICAgICByZXR1cm4gc2VsZi5rZXlcXG5cXG4gICAgZGVmIGlub3JkZXIoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5pbm9yZGVyKClcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5pbm9yZGVyKClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnBvc3RvcmRlcigpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnBvc3RvcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLmtleSlcXG5cXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgcHJpbnQoc2VsZi5rZXkpXFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5wcmVvcmRlcigpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnByZW9yZGVyKClcXG5cXG4gICAgZGVmIHByaW50ZXhwKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgcHJpbnQoJygnKVxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnByaW50ZXhwKClcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wcmludGV4cCgpXFxuICAgICAgICAgICAgcHJpbnQoJyknKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyZXZhbChzZWxmKTpcXG4gICAgICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICAgICAgcmVzMSA9IE5vbmVcXG4gICAgICAgIHJlczIgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICByZXMxID0gc2VsZi5sZWZ0Q2hpbGQucG9zdG9yZGVyZXZhbCgpICAjLy8gXFxcXGxhYmVse3BlbGVmdH1cXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICByZXMyID0gc2VsZi5yaWdodENoaWxkLnBvc3RvcmRlcmV2YWwoKSAjLy8gXFxcXGxhYmVse3BlcmlnaHR9XFxuICAgICAgICBpZiByZXMxIGFuZCByZXMyOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyc1tzZWxmLmtleV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYua2V5XFxuXFxuZGVmIGlub3JkZXIodHJlZSk6XFxuICAgIGlmIHRyZWUgIT0gTm9uZTpcXG4gICAgICAgIGlub3JkZXIodHJlZS5nZXRMZWZ0Q2hpbGQoKSlcXG4gICAgICAgIHByaW50KHRyZWUuZ2V0Um9vdFZhbCgpKVxcbiAgICAgICAgaW5vcmRlcih0cmVlLmdldFJpZ2h0Q2hpbGQoKSlcXG5cXG5kZWYgcHJpbnRleHAodHJlZSk6XFxuICAgIGlmIHRyZWUubGVmdENoaWxkOlxcbiAgICAgICAgcHJpbnQoJygnKVxcbiAgICAgICAgcHJpbnRleHAodHJlZS5nZXRMZWZ0Q2hpbGQoKSlcXG4gICAgcHJpbnQodHJlZS5nZXRSb290VmFsKCkpXFxuICAgIGlmIHRyZWUucmlnaHRDaGlsZDpcXG4gICAgICAgIHByaW50ZXhwKHRyZWUuZ2V0UmlnaHRDaGlsZCgpKVxcbiAgICAgICAgcHJpbnQoJyknKSBcXG5cXG5kZWYgcHJpbnRleHAodHJlZSk6XFxuICAgIHNWYWwgPSBcXFwiXFxcIlxcbiAgICBpZiB0cmVlOlxcbiAgICAgICAgc1ZhbCA9ICcoJyArIHByaW50ZXhwKHRyZWUuZ2V0TGVmdENoaWxkKCkpXFxuICAgICAgICBzVmFsID0gc1ZhbCArIHN0cih0cmVlLmdldFJvb3RWYWwoKSlcXG4gICAgICAgIHNWYWwgPSBzVmFsICsgcHJpbnRleHAodHJlZS5nZXRSaWdodENoaWxkKCkpICsgJyknXFxuICAgIHJldHVybiBzVmFsXFxuXFxuZGVmIHBvc3RvcmRlcmV2YWwodHJlZSk6XFxuICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICByZXMxID0gTm9uZVxcbiAgICByZXMyID0gTm9uZVxcbiAgICBpZiB0cmVlOlxcbiAgICAgICAgcmVzMSA9IHBvc3RvcmRlcmV2YWwodHJlZS5nZXRMZWZ0Q2hpbGQoKSkgICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgcmVzMiA9IHBvc3RvcmRlcmV2YWwodHJlZS5nZXRSaWdodENoaWxkKCkpICMvLyBcXFxcbGFiZWx7cGVyaWdodH1cXG4gICAgICAgIGlmIHJlczEgYW5kIHJlczI6XFxuICAgICAgICAgICAgcmV0dXJuIG9wZXJzW3RyZWUuZ2V0Um9vdFZhbCgpXShyZXMxLHJlczIpICMvLyBcXFxcbGFiZWx7cGVldmFsfVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gdHJlZS5nZXRSb290VmFsKClcXG5cXG5kZWYgaGVpZ2h0KHRyZWUpOlxcbiAgICBpZiB0cmVlID09IE5vbmU6XFxuICAgICAgICByZXR1cm4gLTFcXG4gICAgZWxzZTpcXG4gICAgICAgIHJldHVybiAxICsgbWF4KGhlaWdodCh0cmVlLmxlZnRDaGlsZCksaGVpZ2h0KHRyZWUucmlnaHRDaGlsZCkpXFxuXFxuIyB0ID0gQmluYXJ5VHJlZSg3KVxcbiMgdC5pbnNlcnRMZWZ0KDMpXFxuIyB0Lmluc2VydFJpZ2h0KDkpXFxuIyBpbm9yZGVyKHQpXFxuIyBpbXBvcnQgb3BlcmF0b3JcXG4jIHggPSBCaW5hcnlUcmVlKCcqJylcXG4jIHguaW5zZXJ0TGVmdCgnKycpXFxuIyBsID0geC5nZXRMZWZ0Q2hpbGQoKVxcbiMgbC5pbnNlcnRMZWZ0KDQpXFxuIyBsLmluc2VydFJpZ2h0KDUpXFxuIyB4Lmluc2VydFJpZ2h0KDcpXFxuIyBwcmludChwcmludGV4cCh4KSlcXG4jIHByaW50KHBvc3RvcmRlcmV2YWwoeCkpXFxuIyBwcmludChoZWlnaHQoeCkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JpbmhlYXAucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jIFxcblxcbiMgdGhpcyBoZWFwIHRha2VzIGtleSB2YWx1ZSBwYWlycywgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUga2V5cyBhcmUgaW50ZWdlcnNcXG5jbGFzcyBCaW5IZWFwOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmhlYXBMaXN0ID0gWzBdXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gMFxcblxcblxcbiAgICBkZWYgYnVpbGRIZWFwKHNlbGYsYWxpc3QpOlxcbiAgICAgICAgaSA9IGxlbihhbGlzdCkgLy8gMlxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IGxlbihhbGlzdClcXG4gICAgICAgIHNlbGYuaGVhcExpc3QgPSBbMF0gKyBhbGlzdFs6XVxcbiAgICAgICAgcHJpbnQobGVuKHNlbGYuaGVhcExpc3QpLCBpKVxcbiAgICAgICAgd2hpbGUgKGkgPiAwKTpcXG4gICAgICAgICAgICBwcmludChzZWxmLmhlYXBMaXN0LCBpKVxcbiAgICAgICAgICAgIHNlbGYucGVyY0Rvd24oaSlcXG4gICAgICAgICAgICBpID0gaSAtIDFcXG4gICAgICAgIHByaW50KHNlbGYuaGVhcExpc3QsaSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgZGVmIHBlcmNEb3duKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSAoaSAqIDIpIDw9IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgbWMgPSBzZWxmLm1pbkNoaWxkKGkpXFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwTGlzdFtpXSA+IHNlbGYuaGVhcExpc3RbbWNdOlxcbiAgICAgICAgICAgICAgICB0bXAgPSBzZWxmLmhlYXBMaXN0W2ldXFxuICAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbaV0gPSBzZWxmLmhlYXBMaXN0W21jXVxcbiAgICAgICAgICAgICAgICBzZWxmLmhlYXBMaXN0W21jXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBtY1xcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIG1pbkNoaWxkKHNlbGYsaSk6XFxuICAgICAgICBpZiBpICogMiArIDEgPiBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIHJldHVybiBpICogMlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBMaXN0W2kgKiAyXSA8IHNlbGYuaGVhcExpc3RbaSAqIDIgKyAxXTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKiAyICsgMVxcblxcbiAgICBkZWYgcGVyY1VwKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcExpc3RbaV0gPCBzZWxmLmhlYXBMaXN0W2kvLzJdOlxcbiAgICAgICAgICAgICAgIHRtcCA9IHNlbGYuaGVhcExpc3RbaSAvLyAyXVxcbiAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbaSAvLyAyXSA9IHNlbGYuaGVhcExpc3RbaV1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBMaXN0W2ldID0gdG1wXFxuICAgICAgICAgICAgaSA9IGkgLy8gMlxcbiBcXG4gICAgZGVmIGluc2VydChzZWxmLGspOlxcbiAgICAgICAgc2VsZi5oZWFwTGlzdC5hcHBlbmQoaylcXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBzZWxmLmN1cnJlbnRTaXplICsgMVxcbiAgICAgICAgc2VsZi5wZXJjVXAoc2VsZi5jdXJyZW50U2l6ZSlcXG5cXG4gICAgZGVmIGRlbE1pbihzZWxmKTpcXG4gICAgICAgIHJldHZhbCA9IHNlbGYuaGVhcExpc3RbMV1cXG4gICAgICAgIHNlbGYuaGVhcExpc3RbMV0gPSBzZWxmLmhlYXBMaXN0W3NlbGYuY3VycmVudFNpemVdXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSAtIDFcXG4gICAgICAgIHNlbGYuaGVhcExpc3QucG9wKClcXG4gICAgICAgIHNlbGYucGVyY0Rvd24oMSlcXG4gICAgICAgIHJldHVybiByZXR2YWxcXG4gICAgICAgIFxcbiAgICBkZWYgaXNFbXB0eShzZWxmKTpcXG4gICAgICAgIGlmIGN1cnJlbnRTaXplID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JzdC5weVwiOlwiIyEvYmluL2VudiBweXRob24zLjFcXG4jIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1LCAyMDEwXFxuIyBcXG5cXG5jbGFzcyBCaW5hcnlTZWFyY2hUcmVlOlxcbiAgICAnJydcXG4gICAgQXV0aG9yOiAgQnJhZCBNaWxsZXJcXG4gICAgRGF0ZTogIDEvMTUvMjAwNVxcbiAgICBEZXNjcmlwdGlvbjogIEltbGVtZW50IGEgYmluYXJ5IHNlYXJjaCB0cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VcXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbnM6ICBcXG4gICAgICAgICAgICAgICAgICBfX2NvbnRhaW5zX18oeSkgPD09PiB5IGluIHhcXG4gICAgICAgICAgICAgICAgICBfX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV1cXG4gICAgICAgICAgICAgICAgICBfX2luaXRfXygpXFxuICAgICAgICAgICAgICAgICAgX19sZW5fXygpIDw9PT4gbGVuKHgpXFxuICAgICAgICAgICAgICAgICAgX19zZXRpdGVtX18oayx2KSA8PT0+IHhba10gPSB2XFxuICAgICAgICAgICAgICAgICAgY2xlYXIoKVxcbiAgICAgICAgICAgICAgICAgIGdldChrKVxcbiAgICAgICAgICAgICAgICAgIGl0ZW1zKCkgXFxuICAgICAgICAgICAgICAgICAga2V5cygpIFxcbiAgICAgICAgICAgICAgICAgIHZhbHVlcygpXFxuICAgICAgICAgICAgICAgICAgcHV0KGssdilcXG4gICAgICAgICAgICAgICAgICBpblxcbiAgICAgICAgICAgICAgICAgIGRlbCA8PT0+IFxcbiAgICAnJydcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5yb290ID0gTm9uZVxcbiAgICAgICAgc2VsZi5zaXplID0gMFxcbiAgICBcXG4gICAgZGVmIHB1dChzZWxmLGtleSx2YWwpOlxcbiAgICAgICAgaWYgc2VsZi5yb290OlxcbiAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLHNlbGYucm9vdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5yb290ID0gVHJlZU5vZGUoa2V5LHZhbClcXG4gICAgICAgIHNlbGYuc2l6ZSA9IHNlbGYuc2l6ZSArIDFcXG5cXG4gICAgZGVmIF9wdXQoc2VsZixrZXksdmFsLGN1cnJlbnROb2RlKTpcXG4gICAgICAgIGlmIGtleSA8IGN1cnJlbnROb2RlLmtleTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZCA9IFRyZWVOb2RlKGtleSx2YWwscGFyZW50PWN1cnJlbnROb2RlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZCA9IFRyZWVOb2RlKGtleSx2YWwscGFyZW50PWN1cnJlbnROb2RlKVxcbiAgICAgICAgICAgIFxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZixrLHYpOlxcbiAgICAgICAgc2VsZi5wdXQoayx2KVxcblxcbiAgICBkZWYgZ2V0KHNlbGYsa2V5KTpcXG4gICAgICAgIGlmIHNlbGYucm9vdDpcXG4gICAgICAgICAgICByZXMgPSBzZWxmLl9nZXQoa2V5LHNlbGYucm9vdClcXG4gICAgICAgICAgICBpZiByZXM6XFxuICAgICAgICAgICAgICAgIHJldHVybiByZXMucGF5bG9hZFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBcXG4gICAgZGVmIF9nZXQoc2VsZixrZXksY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYgbm90IGN1cnJlbnROb2RlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbGlmIGN1cnJlbnROb2RlLmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlXFxuICAgICAgICBlbGlmIGtleSA8IGN1cnJlbnROb2RlLmtleTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KGtleSxjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgXFxuICAgICAgICBcXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsa2V5KTpcXG4gICAgICAgIHJlcyA9IHNlbGYuZ2V0KGtleSlcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICByZXR1cm4gcmVzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG4gICAgICAgICAgICBcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGtleSk6XFxuICAgICAgICBpZiBzZWxmLl9nZXQoa2V5LHNlbGYucm9vdCk6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuICAgICAgICBcXG4gICAgZGVmIGxlbmd0aChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnNpemVcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5zaXplXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJvb3QuX19pdGVyX18oKVxcbiAgICBcXG4gICAgZGVmIGRlbGV0ZShzZWxmLGtleSk6XFxuICAgICAgICBpZiBzZWxmLnNpemUgPiAxOlxcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZSA9IHNlbGYuX2dldChrZXksc2VsZi5yb290KVxcbiAgICAgICAgICAgIGlmIG5vZGVUb1JlbW92ZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5yZW1vdmUobm9kZVRvUmVtb3ZlKVxcbiAgICAgICAgICAgICAgICBzZWxmLnNpemUgPSBzZWxmLnNpemUtMVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG4gICAgICAgIGVsaWYgc2VsZi5zaXplID09IDEgYW5kIHNlbGYucm9vdC5rZXkgPT0ga2V5OlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IE5vbmVcXG4gICAgICAgICAgICBzZWxmLnNpemUgPSBzZWxmLnNpemUgLSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG5cXG4gICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsa2V5KTpcXG4gICAgICAgIHNlbGYuZGVsZXRlKGtleSlcXG4gICAgXFxuICAgIGRlZiByZW1vdmUoc2VsZixjdXJyZW50Tm9kZSk6XFxuICAgICAgICBpZiBjdXJyZW50Tm9kZS5pc0xlYWYoKTogI2xlYWZcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZSA9PSBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5yaWdodENoaWxkID0gTm9uZVxcbiAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5oYXNCb3RoQ2hpbGRyZW4oKTogI2ludGVyaW9yXFxuICAgICAgICAgICAgc3VjYyA9IGN1cnJlbnROb2RlLmZpbmRTdWNjZXNzb3IoKVxcbiAgICAgICAgICAgIHN1Y2Muc3BsaWNlT3V0KClcXG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5rZXkgPSBzdWNjLmtleVxcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnBheWxvYWQgPSBzdWNjLnBheWxvYWRcXG4gICAgICAgIGVsc2U6ICMgdGhpcyBub2RlIGhhcyBvbmUgY2hpbGRcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5sZWZ0Q2hpbGQgPSBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5yaWdodENoaWxkID0gY3VycmVudE5vZGUubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yZXBsYWNlTm9kZURhdGEoY3VycmVudE5vZGUubGVmdENoaWxkLmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQucGF5bG9hZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQubGVmdENoaWxkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5yaWdodENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnBhcmVudCA9IGN1cnJlbnROb2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LmxlZnRDaGlsZCA9IGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQucGFyZW50ID0gY3VycmVudE5vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQucmlnaHRDaGlsZCA9IGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJlcGxhY2VOb2RlRGF0YShjdXJyZW50Tm9kZS5yaWdodENoaWxkLmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnBheWxvYWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5sZWZ0Q2hpbGQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5yaWdodENoaWxkKVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIHNlbGYuX2lub3JkZXIoc2VsZi5yb290KVxcblxcbiAgICBkZWYgX2lub3JkZXIoc2VsZix0cmVlKTpcXG4gICAgICAgIGlmIHRyZWUgIT0gTm9uZTpcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVyKHRyZWUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5KVxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5yaWdodENoaWxkKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHNlbGYucm9vdClcXG5cXG4gICAgZGVmIF9wb3N0b3JkZXIoc2VsZiwgdHJlZSk6XFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlcih0cmVlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5KSAgICAgICAgICAgIFxcblxcbiAgICBkZWYgcHJlb3JkZXIoc2VsZik6XFxuICAgICAgICBzZWxmLl9wcmVvcmRlcihzZWxmLHNlbGYucm9vdClcXG5cXG4gICAgZGVmIF9wcmVvcmRlcihzZWxmLHRyZWUpOlxcbiAgICAgICAgaWYgdHJlZTpcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSkgICAgICAgICAgICBcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLmxlZnRDaGlsZClcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLnJpZ2h0Q2hpbGQpXFxuXFxuICAgICAgICAgICAgICAgIFxcbmNsYXNzIFRyZWVOb2RlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZixrZXksdmFsLGxlZnQ9Tm9uZSxyaWdodD1Ob25lLHBhcmVudD1Ob25lKTpcXG4gICAgICAgIHNlbGYua2V5ID0ga2V5XFxuICAgICAgICBzZWxmLnBheWxvYWQgPSB2YWxcXG4gICAgICAgIHNlbGYubGVmdENoaWxkID0gbGVmdFxcbiAgICAgICAgc2VsZi5yaWdodENoaWxkID0gcmlnaHRcXG4gICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50XFxuICAgICAgICBzZWxmLmJhbGFuY2VGYWN0b3IgPSAwXFxuICAgICAgICBcXG4gICAgZGVmIGhhc0xlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmxlZnRDaGlsZFxcblxcbiAgICBkZWYgaGFzUmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGRcXG4gICAgXFxuICAgIGRlZiBpc0xlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhcmVudCBhbmQgc2VsZi5wYXJlbnQubGVmdENoaWxkID09IHNlbGZcXG5cXG4gICAgZGVmIGlzUmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhcmVudCBhbmQgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9PSBzZWxmXFxuXFxuICAgIGRlZiBpc1Jvb3Qoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IHNlbGYucGFyZW50XFxuXFxuICAgIGRlZiBpc0xlYWYoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IChzZWxmLnJpZ2h0Q2hpbGQgb3Igc2VsZi5sZWZ0Q2hpbGQpXFxuXFxuICAgIGRlZiBoYXNBbnlDaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGQgb3Igc2VsZi5sZWZ0Q2hpbGRcXG5cXG4gICAgZGVmIGhhc0JvdGhDaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGQgYW5kIHNlbGYubGVmdENoaWxkXFxuICAgIFxcbiAgICBkZWYgcmVwbGFjZU5vZGVEYXRhKHNlbGYsa2V5LHZhbHVlLGxjLHJjKTpcXG4gICAgICAgIHNlbGYua2V5ID0ga2V5XFxuICAgICAgICBzZWxmLnBheWxvYWQgPSB2YWx1ZVxcbiAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBsY1xcbiAgICAgICAgc2VsZi5yaWdodENoaWxkID0gcmNcXG4gICAgICAgIGlmIHNlbGYuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQucGFyZW50ID0gc2VsZlxcbiAgICAgICAgaWYgc2VsZi5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnBhcmVudCA9IHNlbGZcXG4gICAgICAgIFxcbiAgICBkZWYgZmluZFN1Y2Nlc3NvcihzZWxmKTpcXG4gICAgICAgIHN1Y2MgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICBzdWNjID0gc2VsZi5yaWdodENoaWxkLmZpbmRNaW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLnBhcmVudDpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc3VjYyA9IHNlbGYucGFyZW50XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgICAgICAgICAgc3VjYyA9IHNlbGYucGFyZW50LmZpbmRTdWNjZXNzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IHNlbGZcXG4gICAgICAgIHJldHVybiBzdWNjXFxuXFxuXFxuICAgIGRlZiBzcGxpY2VPdXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmlzTGVhZigpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQubGVmdENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJpZ2h0Q2hpbGQgPSBOb25lXFxuICAgICAgICBlbGlmIHNlbGYuaGFzQW55Q2hpbGRyZW4oKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5sZWZ0Q2hpbGQgPSBzZWxmLmxlZnRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IHNlbGYubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnBhcmVudCA9IHNlbGYucGFyZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQubGVmdENoaWxkID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wYXJlbnQgPSBzZWxmLnBhcmVudFxcblxcbiAgICBkZWYgZmluZE1pbihzZWxmKTpcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmXFxuICAgICAgICB3aGlsZSBjdXJyZW50Lmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmxlZnRDaGlsZFxcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVGhlIHN0YW5kYXJkIGlub3JkZXIgdHJhdmVyc2FsIG9mIGEgYmluYXJ5IHRyZWUuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcbiAgICAgICAgICAgIHlpZWxkIHNlbGYua2V5XFxuICAgICAgICAgICAgaWYgc2VsZi5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1cXG5cXG4gICAgICAgICAgICBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5cXG5mcm9tIHB5dGhvbmRzMy5iYXNpYyBpbXBvcnQgU3RhY2ssIFF1ZXVlLCBEZXF1ZVxcbmZyb20gcHl0aG9uZHMzLmdyYXBocyBpbXBvcnQgR3JhcGgsIFZlcnRleFxcbmZyb20gcHl0aG9uZHMzLnNlYXJjaGluZyBpbXBvcnQgSGFzaFRhYmxlXFxuZnJvbSBweXRob25kczMudHJlZXMgaW1wb3J0IChcXG4gICAgQmluYXJ5VHJlZSxcXG4gICAgQVZMVHJlZSxcXG4gICAgQmluYXJ5U2VhcmNoVHJlZSxcXG4gICAgQmluYXJ5SGVhcCxcXG4gICAgUHJpb3JpdHlRdWV1ZSxcXG4pXFxuXFxuX19hbGxfXyA9IFtcXG4gICAgXFxcIlN0YWNrXFxcIixcXG4gICAgXFxcIlF1ZXVlXFxcIixcXG4gICAgXFxcIkRlcXVlXFxcIixcXG4gICAgXFxcIkdyYXBoXFxcIixcXG4gICAgXFxcIlZlcnRleFxcXCIsXFxuICAgIFxcXCJIYXNoVGFibGVcXFwiLFxcbiAgICBcXFwiQmluYXJ5VHJlZVxcXCIsXFxuICAgIFxcXCJBVkxUcmVlXFxcIixcXG4gICAgXFxcIkJpbmFyeVNlYXJjaFRyZWVcXFwiLFxcbiAgICBcXFwiQmluYXJ5SGVhcFxcXCIsXFxuICAgIFxcXCJCaW5hcnlUcmVlXFxcIixcXG4gICAgXFxcIlByaW9yaXR5UXVldWVcXFwiLFxcbl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLmJhc2ljIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5zdGFjayBpbXBvcnQgU3RhY2tcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5xdWV1ZSBpbXBvcnQgUXVldWVcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5kZXF1ZSBpbXBvcnQgRGVxdWVcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5saW5rZWRfbGlzdCBpbXBvcnQgT3JkZXJlZExpc3RcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5saW5rZWRfbGlzdCBpbXBvcnQgVW5vcmRlcmVkTGlzdFxcblxcbl9fYWxsX18gPSBbXFxcIlN0YWNrXFxcIiwgXFxcIlF1ZXVlXFxcIiwgXFxcIkRlcXVlXFxcIiwgXFxcIk9yZGVyZWRMaXN0XFxcIiwgXFxcIlVub3JkZXJlZExpc3RcXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvZGVxdWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgRGVxdWU6XFxuICAgIFxcXCJcXFwiXFxcIlF1ZXVlIGltcGxlbWVudGF0aW9uIGFzIGEgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBkZXF1ZSBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX2l0ZW1zKVxcblxcbiAgICBkZWYgYWRkX2Zyb250KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIGZyb250IG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBhZGRfcmVhcihzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSByZWFyIG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiByZW1vdmVfZnJvbnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBmcm9udCBvZiB0aGUgZGVxdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlX3JlYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSByZWFyIG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgwKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL2xpbmtlZF9saXN0LnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIExpbmtlZExpc3ROb2RlOlxcbiAgICBcXFwiXFxcIlxcXCJBIG5vZGUgb2YgYSBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZV9kYXRhKTpcXG4gICAgICAgIHNlbGYuX2RhdGEgPSBub2RlX2RhdGFcXG4gICAgICAgIHNlbGYuX25leHQgPSBOb25lXFxuXFxuICAgIGRlZiBnZXRfZGF0YShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBub2RlIGRhdGFcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kYXRhXFxuXFxuICAgIGRlZiBzZXRfZGF0YShzZWxmLCBub2RlX2RhdGEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5vZGUgZGF0YVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fZGF0YSA9IG5vZGVfZGF0YVxcblxcbiAgICBkYXRhID0gcHJvcGVydHkoZ2V0X2RhdGEsIHNldF9kYXRhKVxcblxcbiAgICBkZWYgZ2V0X25leHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbmV4dCBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbmV4dFxcblxcbiAgICBkZWYgc2V0X25leHQoc2VsZiwgbm9kZV9uZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBuZXh0IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX25leHQgPSBub2RlX25leHRcXG5cXG4gICAgbmV4dCA9IHByb3BlcnR5KGdldF9uZXh0LCBzZXRfbmV4dClcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTdHJpbmdcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzdHIoc2VsZi5fZGF0YSlcXG5cXG5cXG5jbGFzcyBMaW5rZWRMaXN0OlxcbiAgICBcXFwiXFxcIlxcXCJMaW5rZWQgTGlzdCBjbGFzcyBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhZCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX2NvdW50ID0gMFxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJcyB0aGUgbGlzdCBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hlYWQgaXMgTm9uZVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgdGhlIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb3VudFxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgdGhlIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb3VudFxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkxpc3QgYXMgYSBzdHJpbmdcXFwiXFxcIlxcXCJcXG4gICAgICAgIGxpc3Rfc3RyID0gXFxcIltcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZi5faGVhZFxcblxcbiAgICAgICAgd2hpbGUgY3VycmVudDpcXG4gICAgICAgICAgICBsaXN0X3N0ciArPSBzdHIoY3VycmVudClcXG4gICAgICAgICAgICBpZiBjdXJyZW50Lm5leHQ6XFxuICAgICAgICAgICAgICAgIGxpc3Rfc3RyICs9IFxcXCIsIFxcXCJcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XFxuICAgICAgICBsaXN0X3N0ciArPSBcXFwiXVxcXCJcXG4gICAgICAgIHJldHVybiBsaXN0X3N0clxcblxcbiAgICBkZWYgYWRkKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhc3NcXG5cXG4gICAgZGVmIHNlYXJjaChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZWFyY2ggZm9yIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhc3NcXG5cXG5cXG5jbGFzcyBVbm9yZGVyZWRMaXN0KExpbmtlZExpc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJVbm9yZGVyZWQgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGFuIHVub3JkZXJlZCBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgTGlua2VkTGlzdC5fX2luaXRfXyhzZWxmKVxcblxcbiAgICBkZWYgYWRkKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBuZXdfbm9kZSA9IExpbmtlZExpc3ROb2RlKHZhbHVlKVxcbiAgICAgICAgbmV3X25vZGUuc2V0X25leHQoc2VsZi5faGVhZClcXG4gICAgICAgIHNlbGYuX2hlYWQgPSBuZXdfbm9kZVxcbiAgICAgICAgc2VsZi5fY291bnQgPSBzZWxmLl9jb3VudCArIDFcXG5cXG4gICAgZGVmIHJlbW92ZShzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG4gICAgICAgIHByZXYgPSBOb25lXFxuXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnQuZGF0YSA9PSB2YWx1ZTpcXG4gICAgICAgICAgICAgICAgaWYgcHJldiBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGVhZCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gY3VycmVudC5uZXh0XFxuICAgICAgICAgICAgICAgIHNlbGYuX2NvdW50ID0gc2VsZi5fY291bnQgLSAxXFxuICAgICAgICAgICAgICAgIHJldHVyblxcbiAgICAgICAgICAgIHByZXYgPSBjdXJyZW50XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwie30gaXMgbm90IGluIHRoZSBsaXN0XFxcIi5mb3JtYXQodmFsdWUpKVxcblxcbiAgICBkZWYgc2VhcmNoKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNlYXJjaCBmb3IgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQ6XFxuICAgICAgICAgICAgaWYgY3VycmVudC5kYXRhID09IHZhbHVlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcXG4gICAgICAgIHJldHVybiBGYWxzZVxcblxcblxcbmNsYXNzIE9yZGVyZWRMaXN0KExpbmtlZExpc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJPcmRlcmVkIGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhbiBPcmRlcmVkIGxpbmtlZCBsaXN0XFxcIlxcXCJcXFwiXFxuICAgICAgICBMaW5rZWRMaXN0Ll9faW5pdF9fKHNlbGYpXFxuXFxuICAgIGRlZiBhZGQoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmLl9oZWFkXFxuICAgICAgICBwcmV2ID0gTm9uZVxcbiAgICAgICAgbmV3X25vZGUgPSBMaW5rZWRMaXN0Tm9kZSh2YWx1ZSlcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQgYW5kIGN1cnJlbnQuZGF0YSA8IHZhbHVlOlxcbiAgICAgICAgICAgIHByZXYgPSBjdXJyZW50XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcblxcbiAgICAgICAgaWYgcHJldiBpcyBOb25lOlxcbiAgICAgICAgICAgIG5ld19ub2RlLm5leHQgPSBzZWxmLl9oZWFkXFxuICAgICAgICAgICAgc2VsZi5faGVhZCA9IG5ld19ub2RlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld19ub2RlLm5leHQgPSBjdXJyZW50XFxuICAgICAgICAgICAgcHJldi5uZXh0ID0gbmV3X25vZGVcXG4gICAgICAgIHNlbGYuX2NvdW50ID0gc2VsZi5fY291bnQgKyAxXFxuXFxuICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgICMgVGhpcyBpcyBhbiBleGVyY2lzZVxcbiAgICAgICAgcGFzc1xcblxcbiAgICBkZWYgc2VhcmNoKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNlYXJjaCBmb3IgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBUaGlzIGlzIGFuIGV4ZXJjaXNlXFxuICAgICAgICBwYXNzXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9iYXNpYy9xdWV1ZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBRdWV1ZTpcXG4gICAgXFxcIlxcXCJcXFwiUXVldWUgaW1wbGVtZW50YXRpb24gYXMgYSBsaXN0XFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgcXVldWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faXRlbXMpXFxuXFxuICAgIGRlZiBlbnF1ZXVlKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcy5pbnNlcnQoMCwgaXRlbSlcXG5cXG4gICAgZGVmIGRlcXVldWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBxdWV1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2l0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvc3RhY2sucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgU3RhY2s6XFxuICAgIFxcXCJcXFwiXFxcIlN0YWNrIGltcGxlbWVudGF0aW9uIGFzIGEgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBzdGFjayBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX2l0ZW1zKVxcblxcbiAgICBkZWYgcHVzaChzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBwb3Aoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBwZWVrKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSB2YWx1ZSBvZiB0aGUgdG9wIGl0ZW0gaW4gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faXRlbXNbLTFdXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2l0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvZ3JhcGhzL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLmdyYXBocyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuZ3JhcGhzLmFkamFjZW5jeV9ncmFwaCBpbXBvcnQgR3JhcGhcXG5mcm9tIHB5dGhvbmRzMy5ncmFwaHMuYWRqYWNlbmN5X2dyYXBoIGltcG9ydCBWZXJ0ZXhcXG5cXG5fX2FsbF9fID0gW1xcXCJHcmFwaFxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9ncmFwaHMvYWRqYWNlbmN5X2dyYXBoLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmltcG9ydCBoZWFwcVxcbmltcG9ydCBzeXNcXG5cXG5cXG5jbGFzcyBWZXJ0ZXg6XFxuICAgIFxcXCJcXFwiXFxcIkdyYXBoIHZlcnRleCBjbGFzc1xcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgdmVydGV4XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYuX25laWdoYm9ycyA9IHt9XFxuICAgICAgICBzZWxmLl9jb2xvciA9IFxcXCJ3aGl0ZVxcXCJcXG4gICAgICAgIHNlbGYuX2Rpc3RhbmNlID0gc3lzLm1heHNpemVcXG4gICAgICAgIHNlbGYuX3ByZXZpb3VzID0gTm9uZVxcbiAgICAgICAgc2VsZi5fZGlzY292ZXJ5X3RpbWUgPSAwXFxuICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUgPSAwXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTGVzcyB0aGFuIG9wZXJhdG9yIHJlcXVpcmVkIGZvciBoZWFwaWZ5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5rZXkgPCBvdGhlci5rZXlcXG5cXG4gICAgZGVmIGdldF9rZXkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdmVydGV4IGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBrZXkgPSBwcm9wZXJ0eShnZXRfa2V5KVxcblxcbiAgICBkZWYgZ2V0X25laWdoYm9yKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgZGlzdGFuY2UgKGVkZ2Ugd2VpZ2h0KSB0byBhbiBhZGphY2VudCBub2RlIChuZWlnaGJvcilcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9uZWlnaGJvcnMuZ2V0KG90aGVyLCBOb25lKVxcblxcbiAgICBkZWYgc2V0X25laWdoYm9yKHNlbGYsIG90aGVyLCB3ZWlnaHQ9MCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIGRpc3RhbmNlIChhZGQgYW4gZWRnZSkgdG8gYW4gYWRqYWNlbnQgbm9kZSAobmVpZ2hib3IpXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9uZWlnaGJvcnNbb3RoZXJdID0gd2VpZ2h0XFxuXFxuICAgIGRlZiBnZXRfbmVpZ2hib3JzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGFsbCBhZGphY2VudCBub2RlcyAobmVpZ2hib3JzKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX25laWdoYm9ycy5rZXlzKClcXG5cXG4gICAgZGVmIGdldF9jb2xvcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB2ZXJ0ZXggY29sb3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb2xvclxcblxcbiAgICBkZWYgc2V0X2NvbG9yKHNlbGYsIGNvbG9yKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB2ZXJ0ZXggY29sb3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NvbG9yID0gY29sb3JcXG5cXG4gICAgY29sb3IgPSBwcm9wZXJ0eShnZXRfY29sb3IsIHNldF9jb2xvcilcXG5cXG4gICAgZGVmIGdldF9kaXN0YW5jZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBkaXN0YW5jZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3RhbmNlXFxuXFxuICAgIGRlZiBzZXRfZGlzdGFuY2Uoc2VsZiwgZGlzdGFuY2UpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IGRpc3RhbmNlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9kaXN0YW5jZSA9IGRpc3RhbmNlXFxuXFxuICAgIGRpc3RhbmNlID0gcHJvcGVydHkoZ2V0X2Rpc3RhbmNlLCBzZXRfZGlzdGFuY2UpXFxuXFxuICAgIGRlZiBnZXRfcHJldmlvdXMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgcHJldmlvdXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9wcmV2aW91c1xcblxcbiAgICBkZWYgc2V0X3ByZXZpb3VzKHNlbGYsIHByZXZpb3VzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBwcmV2aW91c1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcHJldmlvdXMgPSBwcmV2aW91c1xcblxcbiAgICBwcmV2aW91cyA9IHByb3BlcnR5KGdldF9wcmV2aW91cywgc2V0X3ByZXZpb3VzKVxcblxcbiAgICBkZWYgZ2V0X2Rpc2NvdmVyeV90aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGRpc2NvdmVyeSB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZGlzY292ZXJ5X3RpbWVcXG5cXG4gICAgZGVmIHNldF9kaXNjb3ZlcnlfdGltZShzZWxmLCBkaXNjb3ZlcnlfdGltZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgZGlzY292ZXJ5IHRpbWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Rpc2NvdmVyeV90aW1lID0gZGlzY292ZXJ5X3RpbWVcXG5cXG4gICAgZGlzY292ZXJ5X3RpbWUgPSBwcm9wZXJ0eShnZXRfZGlzY292ZXJ5X3RpbWUsIHNldF9kaXNjb3ZlcnlfdGltZSlcXG5cXG4gICAgZGVmIGdldF9jbG9zaW5nX3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgY2xvc2luZyB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2xvc2luZ190aW1lXFxuXFxuICAgIGRlZiBzZXRfY2xvc2luZ190aW1lKHNlbGYsIGNsb3NpbmdfdGltZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgY2xvc2luZyB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUgPSBjbG9zaW5nX3RpbWVcXG5cXG4gICAgY2xvc2luZ190aW1lID0gcHJvcGVydHkoZ2V0X2Nsb3NpbmdfdGltZSwgc2V0X2Nsb3NpbmdfdGltZSlcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gXFxcIns6Xjh9fHs6Xjh9fHs6Xjh9fHs6Xjh9fHs6Xjh9fCB7fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgIHNlbGYuX2tleSxcXG4gICAgICAgICAgICBzZWxmLl9jb2xvcixcXG4gICAgICAgICAgICBzZWxmLl9kaXN0YW5jZSxcXG4gICAgICAgICAgICBzZWxmLl9kaXNjb3ZlcnlfdGltZSxcXG4gICAgICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUsXFxuICAgICAgICAgICAgc2VsZi5fcHJldmlvdXMsXFxuICAgICAgICApXFxuXFxuXFxuY2xhc3MgR3JhcGg6XFxuICAgIFxcXCJcXFwiXFxcIkdyYXBoIGFzIGFuIGFkamFjZW5jeSBtYXRyaXhcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fdmVydGljZXMgPSB7fVxcbiAgICAgICAgc2VsZi5fZWRnZXMgPSB7fVxcbiAgICAgICAgc2VsZi5fdGltZSA9IDBcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSXRlcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3ZlcnRpY2VzLnZhbHVlcygpKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdyYXBoJ3Mgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl92ZXJ0aWNlcylcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHcmFwaCdzIHNpemVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5fdmVydGljZXMpXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImluIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3ZlcnRpY2VzXFxuXFxuICAgIGRlZiBnZXRfdmVydGV4KHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSB2ZXJ0ZXggaW4gdGhlIGdyYXBoIG5hbWVkIHZlcnRfa2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fdmVydGljZXMuZ2V0KGtleSwgTm9uZSlcXG5cXG4gICAgZGVmIHNldF92ZXJ0ZXgoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpbnN0YW5jZSBvZiBWZXJ0ZXggdG8gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl92ZXJ0aWNlc1trZXldID0gVmVydGV4KGtleSlcXG5cXG4gICAgZGVmIGFkZF9lZGdlKHNlbGYsIGZyb21fdmVydGV4LCB0b192ZXJ0ZXgsIHdlaWdodD0wKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIHdlaWdodGVkIGFuZCBkaXJlY3RlZCBlZGdlIHRvIHRoZSBncmFwaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgZnJvbV92ZXJ0ZXggbm90IGluIHNlbGYuX3ZlcnRpY2VzOlxcbiAgICAgICAgICAgIHNlbGYuc2V0X3ZlcnRleChmcm9tX3ZlcnRleClcXG4gICAgICAgIGlmIHRvX3ZlcnRleCBub3QgaW4gc2VsZi5fdmVydGljZXM6XFxuICAgICAgICAgICAgc2VsZi5zZXRfdmVydGV4KHRvX3ZlcnRleClcXG4gICAgICAgIHNlbGYuX3ZlcnRpY2VzW2Zyb21fdmVydGV4XS5zZXRfbmVpZ2hib3Ioc2VsZi5fdmVydGljZXNbdG9fdmVydGV4XSwgd2VpZ2h0KVxcbiAgICAgICAgc2VsZi5fZWRnZXNbKGZyb21fdmVydGV4LCB0b192ZXJ0ZXgpXSA9IHdlaWdodFxcblxcbiAgICBkZWYgZ2V0X3ZlcnRpY2VzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCB2ZXJ0aWNlcyBpbiB0aGUgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl92ZXJ0aWNlcy5rZXlzKClcXG5cXG4gICAgZGVmIGdldF9lZGdlcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbGlzdCBvZiBhbGwgZWRnZXMgaW4gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZWRnZXMua2V5cygpXFxuXFxuICAgIGRlZiByZXNldF9kaXN0YW5jZXMoc2VsZiwgZGVmYXVsdF9kaXN0YW5jZT1zeXMubWF4c2l6ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXNldCBkaXN0YW5jZXMgdG8gdGVzdCBEaWprc3RyYSdzXFxcIlxcXCJcXFwiXFxuICAgICAgICBmb3IgdmVydGV4IGluIHNlbGY6XFxuICAgICAgICAgICAgdmVydGV4LmRpc3RhbmNlID0gZGVmYXVsdF9kaXN0YW5jZVxcblxcbiAgICBkZWYgYmZzKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkJyZWFkdGggRmlyc3QgU2VhcmNoXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydC5kaXN0YW5jZSA9IDBcXG4gICAgICAgIHN0YXJ0LnByZXZpb3VzID0gTm9uZVxcbiAgICAgICAgdmVydF9xdWV1ZSA9IFtzdGFydF1cXG4gICAgICAgIHdoaWxlIHZlcnRfcXVldWU6XFxuICAgICAgICAgICAgY3VycmVudF92ZXJ0ID0gdmVydF9xdWV1ZS5wb3AoMClcXG4gICAgICAgICAgICBmb3IgbmVpZ2ggaW4gY3VycmVudF92ZXJ0LmdldF9uZWlnaGJvcnMoKTpcXG4gICAgICAgICAgICAgICAgaWYgbmVpZ2guY29sb3IgPT0gXFxcIndoaXRlXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgIG5laWdoLmNvbG9yID0gXFxcImdyYXlcXFwiXFxuICAgICAgICAgICAgICAgICAgICBuZWlnaC5kaXN0YW5jZSA9IGN1cnJlbnRfdmVydC5kaXN0YW5jZSArIDFcXG4gICAgICAgICAgICAgICAgICAgIG5laWdoLnByZXZpb3VzID0gY3VycmVudF92ZXJ0XFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0X3F1ZXVlLmFwcGVuZChuZWlnaClcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnQuY29sb3IgPSBcXFwiYmxhY2tcXFwiXFxuXFxuICAgIGRlZiBkZnMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJEZXB0aCBGaXJzdCBzZWFyY2hcXFwiXFxcIlxcXCJcXG4gICAgICAgIGZvciB2ZXJ0ZXggaW4gc2VsZjpcXG4gICAgICAgICAgICBpZiB2ZXJ0ZXguY29sb3IgPT0gXFxcIndoaXRlXFxcIjpcXG4gICAgICAgICAgICAgICAgc2VsZi5kZnNfdmlzaXQodmVydGV4KVxcblxcbiAgICBkZWYgZGZzX3Zpc2l0KHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkRGUyBoZWxwZXIgZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmNvbG9yID0gXFxcImdyYXlcXFwiXFxuICAgICAgICBzZWxmLl90aW1lID0gc2VsZi5fdGltZSArIDFcXG4gICAgICAgIHN0YXJ0LmRpc2NvdmVyeV90aW1lID0gc2VsZi5fdGltZVxcbiAgICAgICAgZm9yIG5leHRfdmVydGV4IGluIHN0YXJ0LmdldF9uZWlnaGJvcnMoKTpcXG4gICAgICAgICAgICBpZiBuZXh0X3ZlcnRleC5jb2xvciA9PSBcXFwid2hpdGVcXFwiOlxcbiAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5zZXRfcHJldmlvdXMoc3RhcnQpXFxuICAgICAgICAgICAgICAgIHNlbGYuZGZzX3Zpc2l0KG5leHRfdmVydGV4KVxcbiAgICAgICAgc3RhcnQuY29sb3IgPSBcXFwiYmxhY2tcXFwiXFxuICAgICAgICBzZWxmLl90aW1lID0gc2VsZi5fdGltZSArIDFcXG4gICAgICAgIHN0YXJ0LmNsb3NpbmdfdGltZSA9IHNlbGYuX3RpbWVcXG5cXG4gICAgZGVmIHRyYXZlcnNlKHNlbGYsIHNyYywgZHN0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRyYXZlcnNlIGEgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhdGggPSBbXVxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuZ2V0X3ZlcnRleChkc3QpXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIHBhdGguYXBwZW5kKGN1cnJlbnQpXFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucHJldmlvdXNcXG4gICAgICAgIHByaW50KFxcbiAgICAgICAgICAgIFxcXCJQYXRoIGZyb20ge30gdG8ge30gKHt9KToge31cXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KHNyYykua2V5LFxcbiAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZHN0KS5rZXksXFxuICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChkc3QpLmRpc3RhbmNlLFxcbiAgICAgICAgICAgICAgICBcXFwiIFxcXCIuam9pbih2ZXJ0ZXgua2V5IGZvciB2ZXJ0ZXggaW4gcmV2ZXJzZWQocGF0aCkpLFxcbiAgICAgICAgICAgIClcXG4gICAgICAgIClcXG5cXG4gICAgZGVmIGRpamtzdHJhKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkRpamtzdHJhJ3Mgc2hvcnRlc3QgcGF0aCBhbGdvcml0aG1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgbm90X3lldF92aXNpdGVkID0gW1tzdGFydC5kaXN0YW5jZSwgc3RhcnRdXVxcbiAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfeWV0X3Zpc2l0ZWQpXFxuICAgICAgICB3aGlsZSBub3RfeWV0X3Zpc2l0ZWQ6XFxuICAgICAgICAgICAgY3VycmVudF92ZXJ0ZXggPSBoZWFwcS5oZWFwcG9wKG5vdF95ZXRfdmlzaXRlZClbMV1cXG4gICAgICAgICAgICBmb3IgbmV4dF92ZXJ0ZXggaW4gY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgICAgICBuZXdfZGlzdGFuY2UgPSBjdXJyZW50X3ZlcnRleC5kaXN0YW5jZSArIGN1cnJlbnRfdmVydGV4LmdldF9uZWlnaGJvcihcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4XFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgaWYgbmV3X2Rpc3RhbmNlIDwgbmV4dF92ZXJ0ZXguZGlzdGFuY2U6XFxuICAgICAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5kaXN0YW5jZSA9IG5ld19kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXgucHJldmlvdXMgPSBjdXJyZW50X3ZlcnRleFxcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBGYWxzZVxcbiAgICAgICAgICAgICAgICAgICAgZm9yIHZlcnRleCBpbiBub3RfeWV0X3Zpc2l0ZWQ6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmVydGV4WzFdLmtleSA9PSBuZXh0X3ZlcnRleC5rZXk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleFswXSA9IG5leHRfdmVydGV4LmRpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBxLmhlYXBpZnkobm90X3lldF92aXNpdGVkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWVcXG4gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmb3VuZDpcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFwcS5oZWFwcHVzaChcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90X3lldF92aXNpdGVkLCBbbmV4dF92ZXJ0ZXguZGlzdGFuY2UsIG5leHRfdmVydGV4XVxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcXG5cXG4gICAgZGVmIGJlbGxtYW5fZm9yZChzZWxmLCBzdGFydCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJCZWxsbWFuLUZvcmQgc2hvcnRlc3QgcGF0aCBhbGdvcml0aG1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgZm9yIF8gaW4gcmFuZ2UobGVuKHNlbGYuX3ZlcnRpY2VzKSk6XFxuICAgICAgICAgICAgZm9yIGVkZ2UgaW4gc2VsZi5fZWRnZXM6XFxuICAgICAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKS5kaXN0YW5jZSArIHNlbGYuX2VkZ2VzW2VkZ2VdXFxuICAgICAgICAgICAgICAgICAgICA8IHNlbGYuZ2V0X3ZlcnRleChlZGdlWzFdKS5kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMV0pLmRpc3RhbmNlID0gKFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKS5kaXN0YW5jZSArIHNlbGYuX2VkZ2VzW2VkZ2VdXFxuICAgICAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkucHJldmlvdXMgPSBzZWxmLmdldF92ZXJ0ZXgoZWRnZVswXSlcXG4gICAgICAgIGZvciBlZGdlIGluIHNlbGYuX2VkZ2VzOlxcbiAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMF0pLmRpc3RhbmNlICsgc2VsZi5fZWRnZXNbZWRnZV1cXG4gICAgICAgICAgICAgICAgPCBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkuZGlzdGFuY2VcXG4gICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJHcmFwaCBjb250YWlucyBhIG5lZ2F0aXZlLXdlaWdodCBjeWNsZVxcXCIpXFxuXFxuICAgIGRlZiBwcmltKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByaW0ncyBzcGFubmluZyB0cmVlIGFsZ29yaXRobVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnQuZGlzdGFuY2UgPSAwXFxuICAgICAgICBub3RfaW5fYV90cmVlID0gW1t2ZXJ0ZXguZGlzdGFuY2UsIHZlcnRleF0gZm9yIHZlcnRleCBpbiBzZWxmXVxcbiAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfaW5fYV90cmVlKVxcbiAgICAgICAgd2hpbGUgbm90X2luX2FfdHJlZTpcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnRleCA9IGhlYXBxLmhlYXBwb3Aobm90X2luX2FfdHJlZSlbMV1cXG4gICAgICAgICAgICBmb3IgbmV4dF92ZXJ0ZXggaW4gY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgICAgICBuZXdfZGlzdGFuY2UgPSBjdXJyZW50X3ZlcnRleC5nZXRfbmVpZ2hib3IobmV4dF92ZXJ0ZXgpXFxuICAgICAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgICAgIGFueShpdGVtWzFdID09IG5leHRfdmVydGV4IGZvciBpdGVtIGluIG5vdF9pbl9hX3RyZWUpXFxuICAgICAgICAgICAgICAgICAgICBhbmQgbmV3X2Rpc3RhbmNlIDwgbmV4dF92ZXJ0ZXguZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgKTpcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LnByZXZpb3VzID0gY3VycmVudF92ZXJ0ZXhcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LmRpc3RhbmNlID0gbmV3X2Rpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBub3RfaW5fYV90cmVlOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0ZW1bMV0gPT0gbmV4dF92ZXJ0ZXg6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bMF0gPSBuZXdfZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfaW5fYV90cmVlKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcblwiLFwic3JjL2xpYi9weXRob25kczMvaW50cm8vX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuaW50cm8gaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLmludHJvLm9vcCBpbXBvcnQgRnJhY3Rpb25cXG5cXG5fX2FsbF9fID0gW1xcXCJGcmFjdGlvblxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9pbnRyby9vb3AucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuZGVmIGdjZChudW1iZXIxLCBudW1iZXIyKTpcXG4gICAgXFxcIlxcXCJcXFwiSGVscGVyIGZ1bmN0aW9uIHRvIHNpbXBsaWZ5IGZyYWN0aW9uc1xcXCJcXFwiXFxcIlxcbiAgICBpZiBub3QgaXNpbnN0YW5jZShudW1iZXIxLCBpbnQpIG9yIG5vdCBpc2luc3RhbmNlKG51bWJlcjIsIGludCk6XFxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcIk51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgbXVzdCBiZSBpbnRlZ2Vyc1xcXCIpXFxuICAgIHdoaWxlIG51bWJlcjEgJSBudW1iZXIyOlxcbiAgICAgICAgbnVtYmVyMSwgbnVtYmVyMiA9IG51bWJlcjIsIG51bWJlcjEgJSBudW1iZXIyXFxuICAgIHJldHVybiBudW1iZXIyXFxuXFxuXFxuY2xhc3MgRnJhY3Rpb246XFxuICAgIFxcXCJcXFwiXFxcIkZyYWN0aW9uIGNsYXNzXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuZXdfbnVtZXIsIG5ld19kZW5vbSk6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgY29tbW9uID0gZ2NkKG5ld19udW1lciwgbmV3X2Rlbm9tKVxcbiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjpcXG4gICAgICAgICAgICByYWlzZVxcbiAgICAgICAgc2VsZi5fbnVtZXIgPSBuZXdfbnVtZXIgLy8gY29tbW9uXFxuICAgICAgICBzZWxmLl9kZW5vbSA9IG5ld19kZW5vbSAvLyBjb21tb25cXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBudW1lcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBudW1lcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9udW1lclxcblxcbiAgICBAbnVtZXIuc2V0dGVyXFxuICAgIGRlZiBzZXRfbnVtZXIoc2VsZiwgbmV3X251bWVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBudW1lcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX251bWVyID0gbmV3X251bWVyXFxuXFxuICAgIGRlZiBnZXRfZGVub20oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgZGVuaW1pbmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kZW5vbVxcblxcbiAgICBkZWYgc2V0X2Rlbm9tKHNlbGYsIG5ld19kZW5vbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgZGVuaW1pbmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Rlbm9tID0gbmV3X2Rlbm9tXFxuXFxuICAgICMgQW5vdGhlciB3YXkgdG8gY3JlYXRlIGFuIGF0dHJpYnV0ZVxcbiAgICBkZW5vbSA9IHByb3BlcnR5KGdldF9kZW5vbSwgc2V0X2Rlbm9tKVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgc3RyaW5nIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9udW1lciA+IHNlbGYuX2Rlbm9tOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwie30ge30ve31cXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgc2VsZi5fbnVtZXIgLy8gc2VsZi5fZGVub20sIHNlbGYuX251bWVyICUgc2VsZi5fZGVub20sIHNlbGYuX2Rlbm9tXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgcmV0dXJuIFxcXCJ7fS97fVxcXCIuZm9ybWF0KHNlbGYuX251bWVyLCBzZWxmLl9kZW5vbSlcXG5cXG4gICAgZGVmIF9fcmVwcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRnJhY3Rpb24gcmVwcmVzZW50YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBcXFwiRnJhY3Rpb24oe30sIHt9KVxcXCIuZm9ybWF0KHNlbGYuX251bWVyLCBzZWxmLl9kZW5vbSlcXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJFcXVhbGl0eSBjb21wYXJpc29uXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbnVtZXIgKiBvdGhlci5kZW5vbSA9PSBvdGhlci5udW1lciAqIHNlbGYuX2Rlbm9tXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCB0d28gZnJhY3Rpb25zXFxcIlxcXCJcXFwiXFxuICAgICAgICBuZXdfbnVtZXIgPSBzZWxmLl9udW1lciAqIG90aGVyLmRlbm9tICsgc2VsZi5fZGVub20gKiBvdGhlci5udW1lclxcbiAgICAgICAgbmV3X2Rlbm9tID0gc2VsZi5fZGVub20gKiBvdGhlci5kZW5vbVxcbiAgICAgICAgcmV0dXJuIEZyYWN0aW9uKG5ld19udW1lciwgbmV3X2Rlbm9tKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvc2VhcmNoaW5nL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLnNlYXJjaCBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuc2VhcmNoaW5nLmhhc2hfdGFibGUgaW1wb3J0IEhhc2hUYWJsZVxcblxcbl9fYWxsX18gPSBbXFxcIkhhc2hUYWJsZVxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zZWFyY2hpbmcvaGFzaF90YWJsZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBIYXNoVGFibGU6XFxuICAgIFxcXCJcXFwiXFxcIkhhc2ggVGFibGUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemU9MTYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGEgaGFzaCB0YWJsZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IHNpemVcXG4gICAgICAgIHNlbGYuX3Nsb3RzID0gW05vbmVdICogc2VsZi5fc2l6ZVxcbiAgICAgICAgc2VsZi5fZGF0YSA9IFtOb25lXSAqIHNlbGYuX3NpemVcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNYWdpYyBfX2dldF9fXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5nZXQoa2V5KVxcblxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBkYXRhKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2ljIF9fc2V0X19cXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYucHV0KGtleSwgZGF0YSlcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNYWdpYyBfX2xlbl9fXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZSAtIHNlbGYuX3Nsb3RzLmNvdW50KE5vbmUpXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2luIGluXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3Nsb3RzXFxuXFxuICAgIGRlZiBfaGFzaF9mdW5jdGlvbihzZWxmLCBrZXksIHNpemUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2ltcGxlIGhhc2ggZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBrZXkgJSBzaXplXFxuXFxuICAgIGRlZiBfcmVoYXNoKHNlbGYsIG9sZF9oYXNoLCBzaXplLCBzdGVwPTEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2ltcGxlIHJlaGFzaCBmdW5jdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIChvbGRfaGFzaCArIHN0ZXApICUgc2l6ZVxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgdGFibGUgaXMgZW1wdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplID09IHNlbGYuX3Nsb3RzLmNvdW50KE5vbmUpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdGFibGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplIC0gc2VsZi5fc2xvdHMuY291bnQoTm9uZSlcXG5cXG4gICAgZGVmIHB1dChzZWxmLCBrZXksIGRhdGEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICBoYXNoX3ZhbHVlID0gc2VsZi5faGFzaF9mdW5jdGlvbihrZXksIGxlbihzZWxmLl9zbG90cykpXFxuXFxuICAgICAgICBpZiBzZWxmLl9zbG90c1toYXNoX3ZhbHVlXSBpcyBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuX3Nsb3RzW2hhc2hfdmFsdWVdID0ga2V5XFxuICAgICAgICAgICAgc2VsZi5fZGF0YVtoYXNoX3ZhbHVlXSA9IGRhdGFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5fc2xvdHNbaGFzaF92YWx1ZV0gPT0ga2V5OlxcbiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW2hhc2hfdmFsdWVdID0gZGF0YSAgIyByZXBsYWNlXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaiA9IDBcXG4gICAgICAgICAgICAgICAgbmV4dF9zbG90ID0gc2VsZi5fcmVoYXNoKGhhc2hfdmFsdWUsIGxlbihzZWxmLl9zbG90cyksIGopXFxuICAgICAgICAgICAgICAgIHdoaWxlIChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3Nsb3RzW25leHRfc2xvdF0gaXMgbm90IE5vbmVcXG4gICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdICE9IGtleVxcbiAgICAgICAgICAgICAgICAgICAgYW5kIGogPCBzZWxmLl9zaXplXFxuICAgICAgICAgICAgICAgICk6XFxuICAgICAgICAgICAgICAgICAgICBqID0gaiArIDFcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfc2xvdCA9IHNlbGYuX3JlaGFzaChoYXNoX3ZhbHVlLCBsZW4oc2VsZi5fc2xvdHMpLCBqKVxcblxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdID0ga2V5XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW25leHRfc2xvdF0gPSBkYXRhXFxuICAgICAgICAgICAgICAgIGVsaWYgaiA9PSBzZWxmLl9zaXplOlxcbiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKFxcXCJIYXNoIFRhYmxlIGlzIGZ1bGxcXFwiKVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YVtuZXh0X3Nsb3RdID0gZGF0YSAgIyByZXBsYWNlXFxuXFxuICAgIGRlZiBnZXQoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBhbiBpdGVtIGZyb20gdGhlIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydF9zbG90ID0gc2VsZi5faGFzaF9mdW5jdGlvbihrZXksIGxlbihzZWxmLl9zbG90cykpXFxuICAgICAgICBwb3NpdGlvbiA9IHN0YXJ0X3Nsb3RcXG4gICAgICAgIGogPSAwXFxuXFxuICAgICAgICB3aGlsZSBzZWxmLl9zbG90c1twb3NpdGlvbl0gaXMgbm90IE5vbmUgYW5kIGogPCBzZWxmLl9zaXplOlxcbiAgICAgICAgICAgIGlmIHNlbGYuX3Nsb3RzW3Bvc2l0aW9uXSA9PSBrZXk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYXRhW3Bvc2l0aW9uXVxcbiAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgIHBvc2l0aW9uID0gc2VsZi5fcmVoYXNoKHN0YXJ0X3Nsb3QsIGxlbihzZWxmLl9zbG90cyksIGopXFxuXFxuICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwie30gaXMgbm90IGluIHRoZSB0YWJsZVxcXCIuZm9ybWF0KGtleSkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zb3J0aW5nL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLnNvcnRpbmcgaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBidWJibGVfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBzZWxlY3Rfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBpbnNlcnRfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBzaGVsbF9zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IG1lcmdlX3NvcnRcXG5mcm9tIHB5dGhvbmRzMy5zb3J0aW5nLnNvcnRpbmdfYWxnb3JpdGhtcyBpbXBvcnQgcXVpY2tfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBoZWFwX3NvcnRcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3NvcnRpbmcvc29ydGluZ19hbGdvcml0aG1zLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmltcG9ydCBoZWFwcVxcblxcblxcbmRlZiBidWJibGVfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJCdWJibGUgc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSBpbiByYW5nZShsZW4obHN0KSAtIDEsIDAsIC0xKTpcXG4gICAgICAgIGV4Y2hhbmdlcyA9IEZhbHNlXFxuICAgICAgICBmb3IgaiBpbiByYW5nZShpKTpcXG4gICAgICAgICAgICBpZiBsc3Rbal0gPiBsc3RbaiArIDFdOlxcbiAgICAgICAgICAgICAgICBleGNoYW5nZXMgPSBUcnVlXFxuICAgICAgICAgICAgICAgIGxzdFtqXSwgbHN0W2ogKyAxXSA9IGxzdFtqICsgMV0sIGxzdFtqXVxcbiAgICAgICAgaWYgbm90IGV4Y2hhbmdlczpcXG4gICAgICAgICAgICBicmVha1xcblxcblxcbmRlZiBzZWxlY3Rfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJTZWxlY3Rpb24gc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUobHN0KTpcXG4gICAgICAgIG1pbl9pZHggPSBsZW4obHN0KSAtIDFcXG4gICAgICAgIGZvciBqIGluIHJhbmdlKGksIGxlbihsc3QpKTpcXG4gICAgICAgICAgICBpZiBsc3Rbal0gPCBsc3RbbWluX2lkeF06XFxuICAgICAgICAgICAgICAgIG1pbl9pZHggPSBqXFxuICAgICAgICBpZiBtaW5faWR4ICE9IGk6XFxuICAgICAgICAgICAgbHN0W21pbl9pZHhdLCBsc3RbaV0gPSBsc3RbaV0sIGxzdFttaW5faWR4XVxcblxcblxcbmRlZiBpbnNlcnRfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnRpb24gc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obHN0KSk6XFxuICAgICAgICBjdXJfdmFsID0gbHN0W2ldXFxuICAgICAgICBjdXJfcG9zID0gaVxcblxcbiAgICAgICAgd2hpbGUgY3VyX3BvcyA+IDAgYW5kIGxzdFtjdXJfcG9zIC0gMV0gPiBjdXJfdmFsOlxcbiAgICAgICAgICAgIGxzdFtjdXJfcG9zXSA9IGxzdFtjdXJfcG9zIC0gMV1cXG4gICAgICAgICAgICBjdXJfcG9zID0gY3VyX3BvcyAtIDFcXG4gICAgICAgIGxzdFtjdXJfcG9zXSA9IGN1cl92YWxcXG5cXG5cXG5kZWYgc2hlbGxfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJTaGVsbCBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIHN1Ymxpc3RfY291bnQgPSBsZW4obHN0KSAvLyAzXFxuICAgIHdoaWxlIHN1Ymxpc3RfY291bnQgPiAwOlxcbiAgICAgICAgZm9yIHBvc19zdGFydCBpbiByYW5nZShzdWJsaXN0X2NvdW50KTpcXG4gICAgICAgICAgICBfZ2FwX2luc2VydF9zb3J0KGxzdCwgcG9zX3N0YXJ0LCBzdWJsaXN0X2NvdW50KVxcbiAgICAgICAgc3VibGlzdF9jb3VudCA9IHN1Ymxpc3RfY291bnQgLy8gMlxcblxcblxcbmRlZiBfZ2FwX2luc2VydF9zb3J0KGxzdCwgc3RhcnQsIGdhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlNoZWxsIHNvcnQgaGVscGVyIGZ1bmN0aW9uXFxcIlxcXCJcXFwiXFxuICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0ICsgZ2FwLCBsZW4obHN0KSwgZ2FwKTpcXG4gICAgICAgIGN1cl92YWwgPSBsc3RbaV1cXG4gICAgICAgIGN1cl9wb3MgPSBpXFxuICAgICAgICB3aGlsZSBjdXJfcG9zID49IGdhcCBhbmQgbHN0W2N1cl9wb3MgLSBnYXBdID4gY3VyX3ZhbDpcXG4gICAgICAgICAgICBsc3RbY3VyX3Bvc10gPSBsc3RbY3VyX3BvcyAtIGdhcF1cXG4gICAgICAgICAgICBjdXJfcG9zID0gY3VyX3BvcyAtIGdhcFxcbiAgICAgICAgbHN0W2N1cl9wb3NdID0gY3VyX3ZhbFxcblxcblxcbmRlZiBtZXJnZV9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIk1lcmdlIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgaWYgbGVuKGxzdCkgPiAxOlxcbiAgICAgICAgbWlkID0gbGVuKGxzdCkgLy8gMlxcbiAgICAgICAgbGVmdF9oYWxmID0gbHN0WzptaWRdXFxuICAgICAgICByaWdodF9oYWxmID0gbHN0W21pZDpdXFxuXFxuICAgICAgICBtZXJnZV9zb3J0KGxlZnRfaGFsZilcXG4gICAgICAgIG1lcmdlX3NvcnQocmlnaHRfaGFsZilcXG5cXG4gICAgICAgIGksIGosIGsgPSAwLCAwLCAwXFxuICAgICAgICB3aGlsZSBpIDwgbGVuKGxlZnRfaGFsZikgYW5kIGogPCBsZW4ocmlnaHRfaGFsZik6XFxuICAgICAgICAgICAgaWYgbGVmdF9oYWxmW2ldIDw9IHJpZ2h0X2hhbGZbal06XFxuICAgICAgICAgICAgICAgIGxzdFtrXSA9IGxlZnRfaGFsZltpXVxcbiAgICAgICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBsc3Rba10gPSByaWdodF9oYWxmW2pdXFxuICAgICAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgIGsgPSBrICsgMVxcblxcbiAgICAgICAgd2hpbGUgaSA8IGxlbihsZWZ0X2hhbGYpOlxcbiAgICAgICAgICAgIGxzdFtrXSA9IGxlZnRfaGFsZltpXVxcbiAgICAgICAgICAgIGkgPSBpICsgMVxcbiAgICAgICAgICAgIGsgPSBrICsgMVxcblxcbiAgICAgICAgd2hpbGUgaiA8IGxlbihyaWdodF9oYWxmKTpcXG4gICAgICAgICAgICBsc3Rba10gPSByaWdodF9oYWxmW2pdXFxuICAgICAgICAgICAgaiA9IGogKyAxXFxuICAgICAgICAgICAgayA9IGsgKyAxXFxuXFxuXFxuZGVmIHF1aWNrX3NvcnQobHN0KTpcXG4gICAgXFxcIlxcXCJcXFwiUXVpY2sgc29ydFxcXCJcXFwiXFxcIlxcbiAgICBfcXVpY2tfc29ydF9oZWxwKGxzdCwgMCwgbGVuKGxzdCkgLSAxKVxcblxcblxcbmRlZiBfcXVpY2tfc29ydF9oZWxwKGxzdCwgbWFya19sLCBtYXJrX3IpOlxcbiAgICBcXFwiXFxcIlxcXCJRdWljayBzb3J0IGhlbHBlclxcXCJcXFwiXFxcIlxcbiAgICBpZiBtYXJrX2wgPCBtYXJrX3I6XFxuICAgICAgICBzcGxpdCA9IF9xdWlja19zb3J0X3BhcnQobHN0LCBtYXJrX2wsIG1hcmtfcilcXG4gICAgICAgIF9xdWlja19zb3J0X2hlbHAobHN0LCBtYXJrX2wsIHNwbGl0IC0gMSlcXG4gICAgICAgIF9xdWlja19zb3J0X2hlbHAobHN0LCBzcGxpdCArIDEsIG1hcmtfcilcXG5cXG5cXG5kZWYgX3F1aWNrX3NvcnRfcGFydChsc3QsIG1hcmtfbCwgbWFya19yKTpcXG4gICAgXFxcIlxcXCJcXFwiUXVpY2sgc29ydCBwYXJ0aXRpb25cXFwiXFxcIlxcXCJcXG4gICAgcGl2b3RfdmFsID0gbHN0W21hcmtfbF1cXG4gICAgbWFya19sX2N1ciA9IG1hcmtfbCArIDFcXG4gICAgbWFya19yX2N1ciA9IG1hcmtfclxcbiAgICBkb25lID0gRmFsc2VcXG5cXG4gICAgd2hpbGUgbm90IGRvbmU6XFxuICAgICAgICB3aGlsZSBtYXJrX2xfY3VyIDw9IG1hcmtfcl9jdXIgYW5kIGxzdFttYXJrX2xfY3VyXSA8PSBwaXZvdF92YWw6XFxuICAgICAgICAgICAgbWFya19sX2N1ciA9IG1hcmtfbF9jdXIgKyAxXFxuICAgICAgICB3aGlsZSBtYXJrX2xfY3VyIDw9IG1hcmtfcl9jdXIgYW5kIGxzdFttYXJrX3JfY3VyXSA+PSBwaXZvdF92YWw6XFxuICAgICAgICAgICAgbWFya19yX2N1ciA9IG1hcmtfcl9jdXIgLSAxXFxuICAgICAgICBpZiBtYXJrX3JfY3VyIDwgbWFya19sX2N1cjpcXG4gICAgICAgICAgICBkb25lID0gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBsc3RbbWFya19sX2N1cl0sIGxzdFttYXJrX3JfY3VyXSA9IGxzdFttYXJrX3JfY3VyXSwgbHN0W21hcmtfbF9jdXJdXFxuICAgIGxzdFttYXJrX2xdLCBsc3RbbWFya19yX2N1cl0gPSBsc3RbbWFya19yX2N1cl0sIGxzdFttYXJrX2xdXFxuXFxuICAgIHJldHVybiBtYXJrX3JfY3VyXFxuXFxuXFxuZGVmIGhlYXBfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJIZWFwIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgcmVzID0gW11cXG4gICAgaGVhcHEuaGVhcGlmeShsc3QpXFxuICAgIHdoaWxlIGxzdDpcXG4gICAgICAgIHJlcy5hcHBlbmQoaGVhcHEuaGVhcHBvcChsc3QpKVxcbiAgICBmb3IgaSBpbiByZXM6XFxuICAgICAgICBsc3QuYXBwZW5kKGkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9fX2luaXRfXy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbnB5dGhvbmRzMy50cmVlcyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMudHJlZXMuYXZsX3RyZWUgaW1wb3J0IEFWTFRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfc2VhcmNoX3RyZWUgaW1wb3J0IEJpbmFyeVNlYXJjaFRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfaGVhcCBpbXBvcnQgQmluYXJ5SGVhcFxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV90cmVlIGltcG9ydCBCaW5hcnlUcmVlXFxuZnJvbSBweXRob25kczMudHJlZXMucHJpb3JpdHlfcXVldWUgaW1wb3J0IFByaW9yaXR5UXVldWVcXG5cXG5fX2FsbF9fID0gW1xcXCJCaW5hcnlUcmVlXFxcIiwgXFxcIkJpbmFyeUhlYXBcXFwiLCBcXFwiQmluYXJ5U2VhcmNoVHJlZVxcXCIsIFxcXCJBVkxUcmVlXFxcIiwgXFxcIlByaW9yaXR5UXVldWVcXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYXZsX3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3NlYXJjaF90cmVlIGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3NlYXJjaF90cmVlIGltcG9ydCBCaW5hcnlUcmVlTm9kZVxcblxcblxcbmNsYXNzIEFWTFRyZWVOb2RlKEJpbmFyeVRyZWVOb2RlKTpcXG4gICAgXFxcIlxcXCJcXFwiQVZMIFRyZWUgTm9kZVxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5LCB2YWwsIGJhbGFuY2VfZmFjdG9yLCBsZWZ0PU5vbmUsIHJpZ2h0PU5vbmUsIHBhcmVudD1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhbiBBVkwgdHJlZSBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBCaW5hcnlUcmVlTm9kZS5fX2luaXRfXyhzZWxmLCBrZXksIHZhbCwgbGVmdCwgcmlnaHQsIHBhcmVudClcXG4gICAgICAgIHNlbGYuX2JhbGFuY2VfZmFjdG9yID0gYmFsYW5jZV9mYWN0b3JcXG5cXG4gICAgZGVmIGdldF9iYWxhbmNlX2ZhY3RvcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgbm9kZSBiYWxhbmNlIGZhY3RvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2JhbGFuY2VfZmFjdG9yXFxuXFxuICAgIGRlZiBzZXRfYmFsYW5jZV9mYWN0b3Ioc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHRoZSBub2RlIGJhbGFuY2UgZmFjdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9iYWxhbmNlX2ZhY3RvciA9IHZhbHVlXFxuXFxuICAgIGJhbGFuY2VfZmFjdG9yID0gcHJvcGVydHkoZ2V0X2JhbGFuY2VfZmFjdG9yLCBzZXRfYmFsYW5jZV9mYWN0b3IpXFxuXFxuXFxuY2xhc3MgQVZMVHJlZShCaW5hcnlTZWFyY2hUcmVlKTpcXG4gICAgXFxcIlxcXCJcXFwiQVZMIHRyZWUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGEgbmV3IEFWTCB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBCaW5hcnlTZWFyY2hUcmVlLl9faW5pdF9fKHNlbGYpXFxuXFxuICAgIGRlZiBwdXQoc2VsZiwga2V5LCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3Jvb3Q6XFxuICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIHNlbGYuX3Jvb3QpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBBVkxUcmVlTm9kZShrZXksIHZhbHVlLCAwKVxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgKyAxXFxuXFxuICAgIGRlZiBfcHV0KHNlbGYsIGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYSBuZXcgbm9kZSB0byB0aGUgdHJlZSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudF9ub2RlLmtleTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuZ2V0X2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0ID0gQVZMVHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCAwLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYmFsYW5jZShjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmdldF9jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodCA9IEFWTFRyZWVOb2RlKFxcbiAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSwgMCwgcGFyZW50PWN1cnJlbnRfbm9kZVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2JhbGFuY2UoY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgdXBkYXRlX2JhbGFuY2Uoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJVcGRhdGUgdGhlIHRyZWUgYmFsYW5jZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlX2ZhY3RvciA+IDEgb3Igbm9kZS5iYWxhbmNlX2ZhY3RvciA8IC0xOlxcbiAgICAgICAgICAgIHNlbGYucmViYWxhbmNlKG5vZGUpXFxuICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICBpZiBub2RlLnBhcmVudDpcXG4gICAgICAgICAgICBpZiBub2RlLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQuYmFsYW5jZV9mYWN0b3IgKz0gMVxcbiAgICAgICAgICAgIGVsaWYgbm9kZS5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlX2ZhY3RvciAtPSAxXFxuXFxuICAgICAgICAgICAgaWYgbm9kZS5wYXJlbnQuYmFsYW5jZV9mYWN0b3IgIT0gMDpcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYmFsYW5jZShub2RlLnBhcmVudClcXG5cXG4gICAgZGVmIHJlYmFsYW5jZShzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlYmFsYW5jZSB0aGUgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlX2ZhY3RvciA8IDA6XFxuICAgICAgICAgICAgaWYgbm9kZS5jaGlsZF9yaWdodC5iYWxhbmNlX2ZhY3RvciA+IDA6XFxuICAgICAgICAgICAgICAgICMgRG8gYW4gTFIgUm90YXRpb25cXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfcmlnaHQobm9kZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfbGVmdChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIGxlZnRcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfbGVmdChub2RlKVxcbiAgICAgICAgZWxpZiBub2RlLmJhbGFuY2VfZmFjdG9yID4gMDpcXG4gICAgICAgICAgICBpZiBub2RlLmNoaWxkX2xlZnQuYmFsYW5jZV9mYWN0b3IgPCAwOlxcbiAgICAgICAgICAgICAgICAjIERvIGFuIFJMIFJvdGF0aW9uXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX2xlZnQobm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9yaWdodChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIHJpZ2h0XFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX3JpZ2h0KG5vZGUpXFxuXFxuICAgIGRlZiByb3RhdGVfbGVmdChzZWxmLCByb3RhdGlvbl9yb290KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkxlZnQgcm90YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19yb290ID0gcm90YXRpb25fcm9vdC5jaGlsZF9yaWdodFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5jaGlsZF9yaWdodCA9IG5ld19yb290LmNoaWxkX2xlZnRcXG4gICAgICAgIGlmIG5ld19yb290LmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgbmV3X3Jvb3QuY2hpbGRfbGVmdC5wYXJlbnQgPSByb3RhdGlvbl9yb290XFxuICAgICAgICBuZXdfcm9vdC5wYXJlbnQgPSByb3RhdGlvbl9yb290LnBhcmVudFxcbiAgICAgICAgaWYgcm90YXRpb25fcm9vdC5pc19yb290KCk6XFxuICAgICAgICAgICAgc2VsZi5fcm9vdCA9IG5ld19yb290XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9sZWZ0ID0gbmV3X3Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9yaWdodCA9IG5ld19yb290XFxuICAgICAgICBuZXdfcm9vdC5jaGlsZF9sZWZ0ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQgPSBuZXdfcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciA9IChcXG4gICAgICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yICsgMSAtIG1pbihuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciwgMClcXG4gICAgICAgIClcXG4gICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yICsgMSArIG1heChyb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcblxcbiAgICBkZWYgcm90YXRlX3JpZ2h0KHNlbGYsIHJvdGF0aW9uX3Jvb3QpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmlnaHQgcm90YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19yb290ID0gcm90YXRpb25fcm9vdC5jaGlsZF9sZWZ0XFxuICAgICAgICByb3RhdGlvbl9yb290LmNoaWxkX2xlZnQgPSBuZXdfcm9vdC5jaGlsZF9yaWdodFxcbiAgICAgICAgaWYgbmV3X3Jvb3QuY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgbmV3X3Jvb3QuY2hpbGRfcmlnaHQucGFyZW50ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgbmV3X3Jvb3QucGFyZW50ID0gcm90YXRpb25fcm9vdC5wYXJlbnRcXG4gICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfcm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBuZXdfcm9vdFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiByb3RhdGlvbl9yb290LmlzX2NoaWxkX3JpZ2h0KCk6XFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50LmNoaWxkX3JpZ2h0ID0gbmV3X3Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9sZWZ0ID0gbmV3X3Jvb3RcXG4gICAgICAgIG5ld19yb290LmNoaWxkX3JpZ2h0ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQgPSBuZXdfcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciA9IChcXG4gICAgICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yIC0gMSAtIG1heChuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciwgMClcXG4gICAgICAgIClcXG4gICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yIC0gMSArIG1pbihyb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYmluYXJ5X2hlYXAucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgQmluYXJ5SGVhcDpcXG4gICAgXFxcIlxcXCJcXFwiTWluaW1hbCBCaW5hcnkgSGVhcFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBoZWFwXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9oZWFwID0gW11cXG5cXG4gICAgZGVmIF9wZXJjX3VwKHNlbGYsIGN1cl9pZHgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTW92ZSBhIG5vZGUgdXBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHdoaWxlIChjdXJfaWR4IC0gMSkgLy8gMiA+PSAwOlxcbiAgICAgICAgICAgIHBhcmVudF9pZHggPSAoY3VyX2lkeCAtIDEpIC8vIDJcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2N1cl9pZHhdIDwgc2VsZi5faGVhcFtwYXJlbnRfaWR4XTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGVhcFtjdXJfaWR4XSwgc2VsZi5faGVhcFtwYXJlbnRfaWR4XSA9IChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbcGFyZW50X2lkeF0sXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgY3VyX2lkeCA9IHBhcmVudF9pZHhcXG5cXG4gICAgZGVmIF9wZXJjX2Rvd24oc2VsZiwgY3VyX2lkeCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNb3ZlIGEgbm9kZSBkb3duXFxcIlxcXCJcXFwiXFxuICAgICAgICB3aGlsZSAyICogY3VyX2lkeCArIDEgPCBsZW4oc2VsZi5faGVhcCk6XFxuICAgICAgICAgICAgbWluX2NoaWxkX2lkeCA9IHNlbGYuX2dldF9taW5fY2hpbGQoY3VyX2lkeClcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2N1cl9pZHhdID4gc2VsZi5faGVhcFttaW5fY2hpbGRfaWR4XTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGVhcFtjdXJfaWR4XSwgc2VsZi5faGVhcFttaW5fY2hpbGRfaWR4XSA9IChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbbWluX2NoaWxkX2lkeF0sXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICAgICAgY3VyX2lkeCA9IG1pbl9jaGlsZF9pZHhcXG5cXG4gICAgZGVmIF9nZXRfbWluX2NoaWxkKHNlbGYsIHBhcmVudF9pZHgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGEgc21hbGxlciBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgMiAqIHBhcmVudF9pZHggKyAyID4gbGVuKHNlbGYuX2hlYXApIC0gMTpcXG4gICAgICAgICAgICByZXR1cm4gMiAqIHBhcmVudF9pZHggKyAxXFxuICAgICAgICBpZiBzZWxmLl9oZWFwWzIgKiBwYXJlbnRfaWR4ICsgMV0gPCBzZWxmLl9oZWFwWzIgKiBwYXJlbnRfaWR4ICsgMl06XFxuICAgICAgICAgICAgcmV0dXJuIDIgKiBwYXJlbnRfaWR4ICsgMVxcbiAgICAgICAgcmV0dXJuIDIgKiBwYXJlbnRfaWR4ICsgMlxcblxcbiAgICBkZWYgaGVhcGlmeShzZWxmLCBub3RfYV9oZWFwLCBzaG93X2RldGFpbHM9RmFsc2UpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQnVpbGQgYSBoZWFwIGZyb20gYW55IGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXAgPSBub3RfYV9oZWFwWzpdXFxuICAgICAgICBjdXJfaWR4ID0gbGVuKHNlbGYuX2hlYXApIC8vIDIgLSAxXFxuICAgICAgICB3aGlsZSBjdXJfaWR4ID49IDA6XFxuICAgICAgICAgICAgc2VsZi5fcGVyY19kb3duKGN1cl9pZHgpXFxuICAgICAgICAgICAgY3VyX2lkeCA9IGN1cl9pZHggLSAxXFxuICAgICAgICAgICAgaWYgc2hvd19kZXRhaWxzOlxcbiAgICAgICAgICAgICAgICBwcmludChzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgaW5zZXJ0KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IGl0ZW1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXAuYXBwZW5kKGl0ZW0pXFxuICAgICAgICBzZWxmLl9wZXJjX3VwKGxlbihzZWxmLl9oZWFwKSAtIDEpXFxuXFxuICAgIGRlZiBkZWxldGUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhcFswXSwgc2VsZi5faGVhcFstMV0gPSBzZWxmLl9oZWFwWy0xXSwgc2VsZi5faGVhcFswXVxcbiAgICAgICAgcmVzdWx0ID0gc2VsZi5faGVhcC5wb3AoKVxcbiAgICAgICAgc2VsZi5fcGVyY19kb3duKDApXFxuICAgICAgICByZXR1cm4gcmVzdWx0XFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBoZWFwIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faGVhcClcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgaGVhcCBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2hlYXApXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSGVhcCBhcyBhIHN0cmluZ1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiX19jb250YWluc19faW4gbWV0aG9kIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gaXRlbSBpbiBzZWxmLl9oZWFwXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9iaW5hcnlfc2VhcmNoX3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgQmluYXJ5VHJlZU5vZGU6XFxuICAgIFxcXCJcXFwiXFxcIkJpbmFyeSBUcmVlIE5vZGUgY2xhc3NcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgdmFsdWUsIGxlZnQ9Tm9uZSwgcmlnaHQ9Tm9uZSwgcGFyZW50PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIG5ldyBUcmVlIE5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZVxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IGxlZnRcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gcmlnaHRcXG4gICAgICAgIHNlbGYuX3BhcmVudCA9IHBhcmVudFxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX2xlZnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIG5vZGUncyBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfbGVmdFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX2xlZnQoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBc3NpZ24gdGhlIG5vZGUncyBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9sZWZ0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX2xlZnQsIHNldF9jaGlsZF9sZWZ0KVxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX3JpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBub2RlJ3MgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9yaWdodFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX3JpZ2h0KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQXNzaWduIHRoZSBub2RlJ3MgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9yaWdodCA9IHByb3BlcnR5KGdldF9jaGlsZF9yaWdodCwgc2V0X2NoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgZ2V0X3BhcmVudChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbm9kZSdzIHBhcmVudFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgc2V0X3BhcmVudChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFzc2lnbiB0aGUgbm9kZSdzIHBhcmVudFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcGFyZW50ID0gbm9kZVxcblxcbiAgICBwYXJlbnQgPSBwcm9wZXJ0eShnZXRfcGFyZW50LCBzZXRfcGFyZW50KVxcblxcbiAgICBkZWYgaXNfY2hpbGRfbGVmdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgbGVmdCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudCBhbmQgc2VsZi5fcGFyZW50LmNoaWxkX2xlZnQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNfY2hpbGRfcmlnaHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgbm9kZSBpcyBhIHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNfcm9vdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgdHJlZSByb290XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgaXNfbGVhZihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgbGVhZlxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZi5fY2hpbGRfcmlnaHQgb3Igc2VsZi5fY2hpbGRfbGVmdClcXG5cXG4gICAgZGVmIGhhc19hX2NoaWxkKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaGFzIGFueSBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkX3JpZ2h0IG9yIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIGhhc19jaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGhhcyBib3RoIGNoaWxkcmVuXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHQgYW5kIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIGdldF9rZXkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbm9kZSBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9rZXlcXG5cXG4gICAgZGVmIHNldF9rZXkoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBub2RlIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuXFxuICAgIGtleSA9IHByb3BlcnR5KGdldF9rZXksIHNldF9rZXkpXFxuXFxuICAgIGRlZiBnZXRfdmFsdWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbm9kZSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlXFxuXFxuICAgIGRlZiBzZXRfdmFsdWUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5vZGUgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWVcXG5cXG4gICAgdmFsdWUgPSBwcm9wZXJ0eShnZXRfdmFsdWUsIHNldF92YWx1ZSlcXG5cXG4gICAgZGVmIHJlcGxhY2VfcGF5bG9hZChzZWxmLCBrZXksIHZhbHVlLCBsZWZ0LCByaWdodCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGFuZ2Ugbm9kZSBwYXlsb2FkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWVcXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBsZWZ0XFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IHJpZ2h0XFxuICAgICAgICBpZiBzZWxmLmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wYXJlbnQgPSBzZWxmXFxuICAgICAgICBpZiBzZWxmLmNoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBhcmVudCA9IHNlbGZcXG5cXG4gICAgZGVmIGZpbmRfc3VjY2Vzc29yKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgbm9kZSdzIHN1Y2Nlc3NvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3VjY2Vzc29yID0gTm9uZVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc3VjY2Vzc29yID0gc2VsZi5fY2hpbGRfcmlnaHQuZmluZF9taW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9wYXJlbnQ6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc29yID0gc2VsZi5fcGFyZW50XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPSBOb25lXFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzb3IgPSBzZWxmLl9wYXJlbnQuZmluZF9zdWNjZXNzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID0gc2VsZlxcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NvclxcblxcbiAgICBkZWYgZmluZF9taW4oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBzbWFsbGVzdCBub2RlIGluIHRoZSByaWdodCBzdWJ0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZlxcbiAgICAgICAgd2hpbGUgY3VycmVudC5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkX2xlZnRcXG4gICAgICAgIHJldHVybiBjdXJyZW50XFxuXFxuICAgIGRlZiBzcGxpY2Vfb3V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU3BsaWNlIG91dFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5pc19sZWFmKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IE5vbmVcXG4gICAgICAgIGVsaWYgc2VsZi5oYXNfYV9jaGlsZCgpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfbGVmdCA9IHNlbGYuX2NoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IHNlbGYuX2NoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wYXJlbnQgPSBzZWxmLl9wYXJlbnRcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID0gc2VsZi5fY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0XFxuICAgICAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBhcmVudCA9IHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUaGUgc3RhbmRhcmQgaW5vcmRlciB0cmF2ZXJzYWwgb2YgYSBiaW5hcnkgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZjpcXG4gICAgICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcbiAgICAgICAgICAgIHlpZWxkIHNlbGYuX2tleVxcbiAgICAgICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1cXG5cXG5cXG5jbGFzcyBCaW5hcnlTZWFyY2hUcmVlOlxcbiAgICBcXFwiXFxcIlxcXCJCaW5hcnkgc2VhcmNoIHRyZWUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcm9vdCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX3NpemUgPSAwXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVHJlZSBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRyZWUgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NpemVcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSXRlcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9yb290Ll9faXRlcl9fKClcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJbXSBnZXR0ZXIgb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJlc3VsdCA9IHNlbGYuZ2V0KGtleSlcXG4gICAgICAgIGlmIHJlc3VsdDpcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwiRXJyb3IsIGtleSBub3QgaW4gdHJlZVxcXCIpXFxuXFxuICAgIGRlZiBnZXRfcm9vdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0cmVlIHJvb3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9yb290XFxuXFxuICAgIGRlZiBzZXRfcm9vdChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB0cmVlIHJvb3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3Jvb3QgPSBub2RlXFxuXFxuICAgIHJvb3QgPSBwcm9wZXJ0eShnZXRfcm9vdCwgc2V0X3Jvb3QpXFxuXFxuICAgIGRlZiBnZXQoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHJpZXZlIGEgdmFsdWUgYnkgdGhlIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fcm9vdDpcXG4gICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9nZXQoa2V5LCBzZWxmLl9yb290KVxcbiAgICAgICAgICAgIGlmIHJlc3VsdDpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZVxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuXFxuICAgIGRlZiBfZ2V0KHNlbGYsIGtleSwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHJpZXZlIGEgdmFsdWUgYnkgdGhlIGtleSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IGN1cnJlbnRfbm9kZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgaWYgY3VycmVudF9ub2RlLmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRfbm9kZVxcbiAgICAgICAgZWxpZiBrZXkgPCBjdXJyZW50X25vZGUua2V5OlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LCBjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldChrZXksIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiW10gc2V0dGVyIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLnB1dChrZXksIHZhbHVlKVxcblxcbiAgICBkZWYgcHV0KHNlbGYsIGtleSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBzZWxmLl9yb290KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLl9yb290ID0gQmluYXJ5VHJlZU5vZGUoa2V5LCB2YWx1ZSlcXG4gICAgICAgIHNlbGYuX3NpemUgPSBzZWxmLl9zaXplICsgMVxcblxcbiAgICBkZWYgX3B1dChzZWxmLCBrZXksIHZhbHVlLCBjdXJyZW50X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIG5ldyBub2RlIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBrZXkgPCBjdXJyZW50X25vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQgPSBCaW5hcnlUcmVlTm9kZShcXG4gICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIHBhcmVudD1jdXJyZW50X25vZGVcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0ID0gQmluYXJ5VHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiaW4gb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBib29sKHNlbGYuX2dldChrZXksIHNlbGYuX3Jvb3QpKVxcblxcbiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImRlbCBvcGVyYXRvciBvdmVycmlkZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5kZWxldGUoa2V5KVxcblxcbiAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIGJ5IGl0cyBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3NpemUgPiAxOlxcbiAgICAgICAgICAgIG5vZGVfdG9fcmVtb3ZlID0gc2VsZi5fZ2V0KGtleSwgc2VsZi5fcm9vdClcXG4gICAgICAgICAgICBpZiBub2RlX3RvX3JlbW92ZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fZGVsZXRlKG5vZGVfdG9fcmVtb3ZlKVxcbiAgICAgICAgICAgICAgICBzZWxmLl9zaXplID0gc2VsZi5fc2l6ZSAtIDFcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwiRXJyb3IsIGtleSBub3QgaW4gdHJlZVxcXCIpXFxuICAgICAgICBlbGlmIHNlbGYuX3NpemUgPT0gMSBhbmQgc2VsZi5fcm9vdC5rZXkgPT0ga2V5OlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBOb25lXFxuICAgICAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgLSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKFxcXCJFcnJvciwga2V5IG5vdCBpbiB0cmVlXFxcIilcXG5cXG4gICAgZGVmIF9kZWxldGUoc2VsZiwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhIG5vZGUgYnkgaXRzIGtleSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgY3VycmVudF9ub2RlLmlzX2xlYWYoKTogICMgcmVtb3ZpbmcgYSBsZWFmXFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlID09IGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0ID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBOb25lXFxuICAgICAgICBlbGlmIGN1cnJlbnRfbm9kZS5oYXNfY2hpbGRyZW4oKTogICMgcmVtb3ZpbmcgYSBub2RlIHdpdGggdHdvIGNoaWxkcmVuXFxuICAgICAgICAgICAgc3VjY2Vzc29yID0gY3VycmVudF9ub2RlLmZpbmRfc3VjY2Vzc29yKClcXG4gICAgICAgICAgICBzdWNjZXNzb3Iuc3BsaWNlX291dCgpXFxuICAgICAgICAgICAgY3VycmVudF9ub2RlLmtleSA9IHN1Y2Nlc3Nvci5rZXlcXG4gICAgICAgICAgICBjdXJyZW50X25vZGUudmFsdWUgPSBzdWNjZXNzb3IudmFsdWVcXG4gICAgICAgIGVsc2U6ICAjIHJlbW92aW5nIGEgbm9kZSB3aXRoIG9uZSBjaGlsZFxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5nZXRfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQucGFyZW50ID0gY3VycmVudF9ub2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0ID0gY3VycmVudF9ub2RlLmNoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfcmlnaHQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBjdXJyZW50X25vZGUuY2hpbGRfbGVmdFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnJlcGxhY2VfcGF5bG9hZChcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5rZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQudmFsdWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQuY2hpbGRfbGVmdCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5jaGlsZF9yaWdodCxcXG4gICAgICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfbGVmdCA9IGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodFxcbiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnRfbm9kZS5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5yZXBsYWNlX3BheWxvYWQoXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQudmFsdWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmNoaWxkX2xlZnQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmNoaWxkX3JpZ2h0LFxcbiAgICAgICAgICAgICAgICAgICAgKVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pbm9yZGVyKHNlbGYuX3Jvb3QpXFxuXFxuICAgIGRlZiBfaW5vcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluLW9yZGVyIHRyZWUgdHJhdmVyc2FsIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3Qtb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3Bvc3RvcmRlcihzZWxmLl9yb290KVxcblxcbiAgICBkZWYgX3Bvc3RvcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3Qtb3JkZXIgdHJlZSB0cmF2ZXJzYWwgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHRyZWU6XFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZXIodHJlZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSwgZW5kPVxcXCIgXFxcIilcXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9wcmVvcmRlcihzZWxmLl9yb290KVxcblxcbiAgICBkZWYgX3ByZW9yZGVyKHNlbGYsIHRyZWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVyKHRyZWUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgY2xlYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYWxsIG5vZGVzXFxcIlxcXCJcXFwiXFxuICAgICAgICB3aGlsZSBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHNlbGYuZGVsZXRlKHNlbGYuX3Jvb3Qua2V5KVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYmluYXJ5X3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IG9wZXJhdG9yXFxuXFxuXFxuY2xhc3MgQmluYXJ5VHJlZTpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIEEgcmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIEJpbmFyeSBUcmVlXFxuICAgIFVzaW5nIGxpbmtzIGFuZCBOb2RlcyBhcHByb2FjaC5cXG5cXG4gICAgTW9kaWZpZWQgdG8gYWxsb3cgZm9yIHRyZWVzIHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gb3RoZXIgdHJlZXNcXG4gICAgcmF0aGVyIHRoYW4gYWx3YXlzIGNyZWF0aW5nIGEgbmV3IHRyZWUgaW4gdGhlIGluc2VydF9mZWZ0IG9yIGluc2VydF9yaWdodFxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gTm9uZVxcblxcbiAgICBkZWYgZ2V0X3Jvb3RfdmFsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHJvb3Qga2V5IHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fa2V5XFxuXFxuICAgIGRlZiBzZXRfcm9vdF92YWwoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCByb290IGtleSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuXFxuICAgIHJvb3QgPSBwcm9wZXJ0eShnZXRfcm9vdF92YWwsIHNldF9yb290X3ZhbClcXG5cXG4gICAgZGVmIGdldF9jaGlsZF9sZWZ0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGxlZnQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9sZWZ0XFxuXFxuICAgIGRlZiBzZXRfY2hpbGRfbGVmdChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9sZWZ0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX2xlZnQsIHNldF9jaGlsZF9sZWZ0KVxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX3JpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHRcXG5cXG4gICAgZGVmIHNldF9jaGlsZF9yaWdodChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCByaWdodCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSBub2RlXFxuXFxuICAgIGNoaWxkX3JpZ2h0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX3JpZ2h0LCBzZXRfY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBpc19sZWFmKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgYSBub2RlIGlzIGxlYWZcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiAobm90IHNlbGYuX2NoaWxkX2xlZnQpIGFuZCAobm90IHNlbGYuX2NoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgaW5zZXJ0X2xlZnQoc2VsZiwgbmV3X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSW5zZXJ0IGxlZnQgc3VidHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShuZXdfbm9kZSwgQmluYXJ5VHJlZSk6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUgPSBuZXdfbm9kZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IEJpbmFyeVRyZWUobmV3X25vZGUpXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlLnNldF9jaGlsZF9sZWZ0KHNlbGYuX2NoaWxkX2xlZnQpXFxuXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbmV3X3N1YnRyZWVcXG5cXG4gICAgZGVmIGluc2VydF9yaWdodChzZWxmLCBuZXdfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbnNlcnQgcmlnaHQgc3VidHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShuZXdfbm9kZSwgQmluYXJ5VHJlZSk6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUgPSBuZXdfbm9kZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IEJpbmFyeVRyZWUobmV3X25vZGUpXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZS5zZXRfY2hpbGRfcmlnaHQoc2VsZi5fY2hpbGRfcmlnaHQpXFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IG5ld19zdWJ0cmVlXFxuXFxuICAgIGRlZiBwcmVvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByZS1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcHJpbnQoc2VsZi5fa2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnByZW9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnByZW9yZGVyKClcXG5cXG4gICAgZGVmIGlub3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbi1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0Lmlub3JkZXIoKVxcbiAgICAgICAgcHJpbnQoc2VsZi5fa2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQuaW5vcmRlcigpXFxuXFxuICAgIGRlZiBwb3N0b3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQb3N0LW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQucG9zdG9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBvc3RvcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuXFxuICAgIGRlZiBwcmludF9leHAoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQcmludCBhbiBleHByZXNzaW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHByaW50KFxcXCIoXFxcIiwgZW5kPVxcXCIgXFxcIilcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnByaW50X2V4cCgpXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9yaWdodC5wcmludF9leHAoKVxcbiAgICAgICAgICAgIHByaW50KFxcXCIpXFxcIiwgZW5kPVxcXCIgXFxcIilcXG5cXG4gICAgZGVmIHBvc3RvcmRlcl9ldmFsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUG9zdG9yZGVyIGV2YWx1YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG9wZXJhdGlvbnMgPSB7XFxuICAgICAgICAgICAgXFxcIitcXFwiOiBvcGVyYXRvci5hZGQsXFxuICAgICAgICAgICAgXFxcIi1cXFwiOiBvcGVyYXRvci5zdWIsXFxuICAgICAgICAgICAgXFxcIipcXFwiOiBvcGVyYXRvci5tdWwsXFxuICAgICAgICAgICAgXFxcIi9cXFwiOiBvcGVyYXRvci50cnVlZGl2LFxcbiAgICAgICAgfVxcbiAgICAgICAgcmVzdWx0XzEgPSBOb25lXFxuICAgICAgICByZXN1bHRfMiA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgcmVzdWx0XzEgPSBzZWxmLl9jaGlsZF9sZWZ0LnBvc3RvcmRlcl9ldmFsKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHJlc3VsdF8yID0gc2VsZi5fY2hpbGRfcmlnaHQucG9zdG9yZGVyX2V2YWwoKVxcbiAgICAgICAgaWYgcmVzdWx0XzEgYW5kIHJlc3VsdF8yOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25zW3NlbGYuX2tleV0ocmVzdWx0XzEsIHJlc3VsdF8yKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBkZWYgaGVpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSGVpZ2h0IG9mIGEgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IHNlbGYuX2tleTpcXG4gICAgICAgICAgICByZXR1cm4gLTFcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgaGVpZ2h0X2xlZnQgPSBzZWxmLl9jaGlsZF9sZWZ0LmhlaWdodCgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGhlaWdodF9sZWZ0ID0gLTFcXG5cXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIGhlaWdodF9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0LmhlaWdodCgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGhlaWdodF9yaWdodCA9IC0xXFxuXFxuICAgICAgICByZXR1cm4gMSArIG1heChoZWlnaHRfbGVmdCwgaGVpZ2h0X3JpZ2h0KVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgYSB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5zaXplKClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb3VudCBub2RlcyBpbiBhIHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIG5vdCBzZWxmLl9rZXk6XFxuICAgICAgICAgICAgcmV0dXJuIDBcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgY2hpbGRyZW5fbGVmdCA9IHNlbGYuX2NoaWxkX2xlZnQuc2l6ZSgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNoaWxkcmVuX2xlZnQgPSAwXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBjaGlsZHJlbl9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0LnNpemUoKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBjaGlsZHJlbl9yaWdodCA9IDBcXG5cXG4gICAgICAgIHJldHVybiAxICsgY2hpbGRyZW5fbGVmdCArIGNoaWxkcmVuX3JpZ2h0XFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9wcmlvcml0eV9xdWV1ZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfaGVhcCBpbXBvcnQgQmluYXJ5SGVhcFxcblxcblxcbmNsYXNzIFByaW9yaXR5UXVldWUoQmluYXJ5SGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBoZWFwIHRha2VzIChrZXksIHZhbHVlKSBwYWlycyB3aGVyZSBrZXkgc2lnbmlmaWVzIHByaW9yaXR5XFxuICAgIFdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGtleXMgYXJlIGFsbCBjb21wYXJhYmxlLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIGNoYW5nZV9wcmlvcml0eShzZWxmLCBuZXdfcHJpb3JpdHksIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoYW5nZSB0aGUgcHJpb3JpdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIGtleV90b19tb3ZlID0gMFxcbiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuX2hlYXApKTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2ldWzFdID09IHZhbHVlOlxcbiAgICAgICAgICAgICAgICBrZXlfdG9fbW92ZSA9IGlcXG4gICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgIGlmIGtleV90b19tb3ZlID4gLTE6XFxuICAgICAgICAgICAgc2VsZi5faGVhcFtrZXlfdG9fbW92ZV0gPSAobmV3X3ByaW9yaXR5LCBzZWxmLl9oZWFwW2tleV90b19tb3ZlXVsxXSlcXG4gICAgICAgICAgICBzZWxmLl9wZXJjX3VwKGtleV90b19tb3ZlKVxcblwiLFwic3JjL2xpYi9weXRob25lZC9fX2luaXRfXy5weVwiOlwiXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvX19pbml0X18ucHlcIjpcIlxcblxcblxcbmZyb20gLmF2bCBpbXBvcnQgQXJib2xBVkxcXG5mcm9tIC5hYmIgaW1wb3J0IEFyYm9sQmluYXJpb0J1c3F1ZWRhXFxuZnJvbSAubW9udGljdWxvQmluYXJpbyBpbXBvcnQgTW9udGljdWxvQmluYXJpb1xcblxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9hcmJvbGVzL2FiYi5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiNcXG4jYWJiLnB5XFxuXFxuY2xhc3MgQXJib2xCaW5hcmlvQnVzcXVlZGE6XFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYucmFpeiA9IE5vbmVcXG4gICAgICAgIHNlbGYudGFtYW5vID0gMFxcblxcbiAgICBkZWYgYWdyZWdhcihzZWxmLGNsYXZlLHZhbG9yKTpcXG4gICAgICAgIGlmIHNlbGYucmFpejpcXG4gICAgICAgICAgICBzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLHNlbGYucmFpeilcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5yYWl6ID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yKVxcbiAgICAgICAgc2VsZi50YW1hbm8gPSBzZWxmLnRhbWFubyArIDFcXG5cXG4gICAgZGVmIF9hZ3JlZ2FyKHNlbGYsY2xhdmUsdmFsb3Isbm9kb0FjdHVhbCk6XFxuICAgICAgICBpZiBjbGF2ZSA8IG5vZG9BY3R1YWwuY2xhdmU6XFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgc2VsZi5fYWdyZWdhcihjbGF2ZSx2YWxvcixub2RvQWN0dWFsLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICAgICBzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvRGVyZWNobyA9IE5vZG9BcmJvbChjbGF2ZSx2YWxvcixwYWRyZT1ub2RvQWN0dWFsKVxcbiBcXG4gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsYyx2KTpcXG4gICAgICAgIHNlbGYuYWdyZWdhcihjLHYpXFxuXFxuICAgIGRlZiBvYnRlbmVyKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgaWYgc2VsZi5yYWl6OlxcbiAgICAgICAgICAgIHJlcyA9IHNlbGYuX29idGVuZXIoY2xhdmUsc2VsZi5yYWl6KVxcbiAgICAgICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5jYXJnYVV0aWxcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcblxcbiAgICBkZWYgX29idGVuZXIoc2VsZixjbGF2ZSxub2RvQWN0dWFsKTpcXG4gICAgXFx0aWYgbm90IG5vZG9BY3R1YWw6XFxuICAgIFxcdCAgICByZXR1cm4gTm9uZVxcbiAgICBcXHRlbGlmIG5vZG9BY3R1YWwuY2xhdmUgPT0gY2xhdmU6XFxuICAgIFxcdCAgICByZXR1cm4gbm9kb0FjdHVhbFxcbiAgICBcXHRlbGlmIGNsYXZlIDwgbm9kb0FjdHVhbC5jbGF2ZTpcXG4gICAgXFx0ICAgIHJldHVybiBzZWxmLl9vYnRlbmVyKGNsYXZlLG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkbylcXG4gICAgXFx0ZWxzZTpcXG4gICAgXFx0ICAgIHJldHVybiBzZWxmLl9vYnRlbmVyKGNsYXZlLG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pICAgICAgICBcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgcmVzID0gc2VsZi5vYnRlbmVyKGNsYXZlKSBcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICByZXR1cm4gcmVzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwgbGEgY2xhdmUgbm8gZXN0w6EgZW4gZWwgw6FyYm9sJylcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGNsYXZlKTpcXG4gICAgXFx0aWYgc2VsZi5fb2J0ZW5lcihjbGF2ZSxzZWxmLnJhaXopOlxcbiAgICBcXHQgICAgcmV0dXJuIFRydWVcXG4gICAgXFx0ZWxzZTpcXG4gICAgXFx0ICAgIHJldHVybiBGYWxzZVxcbiAgICAgICBcXG4gICAgZGVmIGxvbmdpdHVkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYudGFtYW5vXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYudGFtYW5vXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJhaXouX19pdGVyX18oKVxcblxcbiAgICBkZWYgZWxpbWluYXIoc2VsZixjbGF2ZSk6XFxuICAgICAgICBpZiBzZWxmLnRhbWFubyA+IDE6XFxuICAgICAgICAgICBub2RvQUVsaW1pbmFyID0gc2VsZi5fb2J0ZW5lcihjbGF2ZSxzZWxmLnJhaXopXFxuICAgIFxcdCAgIGlmIG5vZG9BRWxpbWluYXI6XFxuICAgIFxcdCAgICAgICBzZWxmLnJlbW92ZXIobm9kb0FFbGltaW5hcilcXG4gICAgXFx0ICAgICAgIHNlbGYudGFtYW5vID0gc2VsZi50YW1hbm8tMVxcbiAgICBcXHQgICBlbHNlOlxcbiAgICBcXHQgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBsYSBjbGF2ZSBubyBlc3TDoSBlbiBlbCDDoXJib2wnKVxcbiAgICAgICAgZWxpZiBzZWxmLnRhbWFubyA9PSAxIGFuZCBzZWxmLnJhaXouY2xhdmUgPT0gY2xhdmU6XFxuICAgIFxcdCAgICBzZWxmLnJhaXogPSBOb25lXFxuICAgIFxcdCAgICBzZWxmLnRhbWFubyA9IHNlbGYudGFtYW5vIC0gMVxcbiAgICAgICAgZWxzZTpcXG4gICAgXFx0ICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwgbGEgY2xhdmUgbm8gZXN0w6EgZW4gZWwgw6FyYm9sJylcXG5cXG4gICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgc2VsZi5lbGltaW5hcihjbGF2ZSlcXG5cXG4gICAgZGVmIHJlbW92ZXIoc2VsZixub2RvQWN0dWFsKTpcXG4gICAgICAgIGlmIG5vZG9BY3R1YWwuZXNIb2phKCk6ICNob2phXFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbCA9PSBub2RvQWN0dWFsLnBhZHJlLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbyA9IE5vbmVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gTm9uZVxcbiAgICAgICAgZWxpZiBub2RvQWN0dWFsLnRpZW5lQW1ib3NIaWpvcygpOiAjaW50ZXJpb3JcXG4gICAgICAgICAgICBzdWMgPSBub2RvQWN0dWFsLmVuY29udHJhclN1Y2Vzb3IoKVxcbiAgICAgICAgICAgIHN1Yy5lbXBhbG1hcigpXFxuICAgICAgICAgICAgbm9kb0FjdHVhbC5jbGF2ZSA9IHN1Yy5jbGF2ZVxcbiAgICAgICAgICAgIG5vZG9BY3R1YWwuY2FyZ2FVdGlsID0gc3VjLmNhcmdhVXRpbFxcblxcbiAgICAgICAgZWxzZTogIyBlc3RlIG5vZG8gdGllbmUgdW4gKDEpIGhpam9cXG4gICAgICAgICAgICBpZiBub2RvQWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICBpZiBub2RvQWN0dWFsLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLnBhZHJlID0gbm9kb0FjdHVhbC5wYWRyZVxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5wYWRyZS5oaWpvSXpxdWllcmRvID0gbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgICAgIGVsaWYgbm9kb0FjdHVhbC5lc0hpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnJlZW1wbGF6YXJEYXRvRGVOb2RvKG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5jbGF2ZSwgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmNhcmdhVXRpbCwgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmhpam9JenF1aWVyZG8sIG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5oaWpvRGVyZWNobylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBub2RvQWN0dWFsLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5wYWRyZSA9IG5vZG9BY3R1YWwucGFkcmVcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbyA9IG5vZG9BY3R1YWwuaGlqb0RlcmVjaG9cXG4gICAgICAgICAgICAgICAgZWxpZiBub2RvQWN0dWFsLmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gbm9kb0FjdHVhbC5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5yZWVtcGxhemFyRGF0b0RlTm9kbyhub2RvQWN0dWFsLmhpam9EZXJlY2hvLmNsYXZlLCBub2RvQWN0dWFsLmhpam9EZXJlY2hvLmNhcmdhVXRpbCwgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5oaWpvSXpxdWllcmRvLCBub2RvQWN0dWFsLmhpam9EZXJlY2hvLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgaW5vcmRlbihzZWxmKTpcXG4gICAgICAgIHNlbGYuX2lub3JkZW4oc2VsZi5yYWl6KVxcblxcbiAgICBkZWYgX2lub3JkZW4oc2VsZixhcmJvbCk6XFxuICAgICAgICBpZiBhcmJvbCAhPSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZW4oYXJib2wuaGlqb0l6cXVpZXJkbylcXG4gICAgICAgICAgICBwcmludChhcmJvbC5jbGF2ZSlcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVuKGFyYm9sLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgcG9zdG9yZGVuKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcG9zdG9yZGVuKHNlbGYucmFpeilcXG5cXG4gICAgZGVmIF9wb3N0b3JkZW4oc2VsZiwgYXJib2wpOlxcbiAgICAgICAgaWYgYXJib2w6XFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVuKGFyYm9sLmhpam9EZXJlY2hvKVxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlbihhcmJvbC5oaWpvSXpxdWllcmRvKVxcbiAgICAgICAgICAgIHByaW50KGFyYm9sLmNsYXZlKSAgICAgICAgICAgIFxcblxcbiAgICBkZWYgcHJlb3JkZW4oc2VsZik6XFxuICAgICAgICBzZWxmLl9wcmVvcmRlbihzZWxmLHNlbGYucmFpeilcXG5cXG4gICAgZGVmIF9wcmVvcmRlbihzZWxmLGFyYm9sKTpcXG4gICAgICAgIGlmIGFyYm9sOlxcbiAgICAgICAgICAgIHByaW50KGFyYm9sLmNsYXZlKSAgICAgICAgICAgIFxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVuKGFyYm9sLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgc2VsZi5fcHJlb3JkZW4oYXJib2wuaGlqb0RlcmVjaG8pXFxuXFxuXFxuY2xhc3MgTm9kb0FyYm9sOlxcbiAgIGRlZiBfX2luaXRfXyhzZWxmLGNsYXZlLHZhbG9yLGl6cXVpZXJkbz1Ob25lLGRlcmVjaG89Tm9uZSxwYWRyZT1Ob25lKTpcXG4gICAgICAgIHNlbGYuY2xhdmUgPSBjbGF2ZVxcbiAgICAgICAgc2VsZi5jYXJnYVV0aWwgPSB2YWxvclxcbiAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gaXpxdWllcmRvXFxuICAgICAgICBzZWxmLmhpam9EZXJlY2hvID0gZGVyZWNob1xcbiAgICAgICAgc2VsZi5wYWRyZSA9IHBhZHJlXFxuICAgICAgICBzZWxmLmZhY3RvckVxdWlsaWJyaW8gPSAwXFxuXFxuICAgIGRlZiB0aWVuZUhpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgICAgIFxcbiAgICBkZWYgdGllbmVIaWpvRGVyZWNobyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvXFxuXFxuICAgIGRlZiBlc0hpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wYWRyZSBhbmQgc2VsZi5wYWRyZS5oaWpvSXpxdWllcmRvID09IHNlbGZcXG4gICAgXFxuICAgIGRlZiBlc0hpam9EZXJlY2hvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucGFkcmUgYW5kIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPT0gc2VsZlxcblxcbiAgICBkZWYgZXNSYWl6KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnBhZHJlXFxuXFxuICAgIGRlZiBlc0hvamEoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IChzZWxmLmhpam9EZXJlY2hvIG9yIHNlbGYuaGlqb0l6cXVpZXJkbylcXG5cXG4gICAgZGVmIHRpZW5lQWxndW5IaWpvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaGlqb0RlcmVjaG8gb3Igc2VsZi5oaWpvSXpxdWllcmRvXFxuXFxuICAgIGRlZiB0aWVuZUFtYm9zSGlqb3Moc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvRGVyZWNobyBhbmQgc2VsZi5oaWpvSXpxdWllcmRvXFxuXFxuICAgIGRlZiByZWVtcGxhemFyRGF0b0RlTm9kbyhzZWxmLGNsYXZlLHZhbG9yLGhpenEsaGRlcik6XFxuICAgICAgICBzZWxmLmNsYXZlID0gY2xhdmVcXG4gICAgICAgIHNlbGYuY2FyZ2FVdGlsID0gdmFsb3JcXG4gICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IGhpenFcXG4gICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBoZGVyXFxuICAgICAgICBpZiBzZWxmLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5wYWRyZSA9IHNlbGZcXG4gICAgICAgIGlmIHNlbGYudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8ucGFkcmUgPSBzZWxmICAgIFxcblxcbiAgICBkZWYgZW5jb250cmFyU3VjZXNvcihzZWxmKTpcXG4gICAgICAgIHN1YyA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgIHN1YyA9IHNlbGYuaGlqb0RlcmVjaG8uZW5jb250cmFyTWluKClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5wYWRyZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIHN1YyA9IHNlbGYucGFkcmVcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgICAgICAgICAgICAgICAgICBzdWMgPSBzZWxmLnBhZHJlLmVuY29udHJhclN1Y2Vzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IHNlbGZcXG4gICAgICAgIHJldHVybiBzdWNcXG5cXG4gICAgZGVmIGVtcGFsbWFyKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5lc0hvamEoKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IE5vbmVcXG4gICAgICAgIGVsaWYgc2VsZi50aWVuZUFsZ3VuSGlqbygpOlxcbiAgICAgICAgICAgIGlmIHNlbGYudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLnBhZHJlID0gc2VsZi5wYWRyZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9EZXJlY2hvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9EZXJlY2hvID0gc2VsZi5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnBhZHJlID0gc2VsZi5wYWRyZVxcblxcbiAgICBkZWYgZW5jb250cmFyTWluKHNlbGYpOlxcbiAgICAgICAgYWN0dWFsID0gc2VsZlxcbiAgICAgICAgd2hpbGUgYWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgIGFjdHVhbCA9IGFjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICByZXR1cm4gYWN0dWFsXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGY6XFxuICAgIFxcdCAgICBpZiBzZWxmLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICBcXHQgICAgICAgIGZvciBlbGVtIGluIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgXFx0XFx0ICAgIHlpZWxkIGVsZW1cXG4gICAgICAgICAgICB5aWVsZCBzZWxmLmNsYXZlXFxuICAgIFxcdCAgICBpZiBzZWxmLnRpZW5lSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgXFx0XFx0ICAgIHlpZWxkIGVsZW1cXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9hcmJvbEJpbmFyaW8ucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jIFxcbiNhcmJvbEJpbmFyaW8ucHlcXG5cXG5jbGFzcyBBcmJvbEJpbmFyaW86XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLG9iamV0b1JhaXopOlxcbiAgICAgICAgc2VsZi5jbGF2ZSA9IG9iamV0b1JhaXpcXG4gICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IE5vbmVcXG4gICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgIFxcbiAgICBkZWYgaW5zZXJ0YXJJenF1aWVyZG8oc2VsZixudWV2b05vZG8pOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvID09IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgIGVsc2U6ICBcXG4gICAgICAgICAgICB0ID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgICAgICB0Lmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8gPSB0XFxuXFxuICAgIGRlZiBpbnNlcnRhckRlcmVjaG8oc2VsZixudWV2b05vZG8pOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobyA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBBcmJvbEJpbmFyaW8obnVldm9Ob2RvKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICB0ID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgICAgICB0Lmhpam9EZXJlY2hvID0gc2VsZi5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSB0XFxuXFxuICAgIGRlZiBlc0hvamEoc2VsZik6XFxuICAgICAgICByZXR1cm4gKChub3Qgc2VsZi5oaWpvSXpxdWllcmRvKSBhbmQgKG5vdCBzZWxmLmhpam9EZXJlY2hvKSlcXG5cXG4gICAgZGVmIG9idGVuZXJIaWpvRGVyZWNobyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lckhpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgIFxcbiAgICBkZWYgYXNpZ25hclZhbG9yUmFpeihzZWxmLG9iaik6XFxuICAgICAgICBzZWxmLmNsYXZlID0gb2JqXFxuXFxuICAgIGRlZiBvYnRlbmVyVmFsb3JSYWl6KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY2xhdmVcXG5cXG4gICAgZGVmIGlub3JkZW4oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLmlub3JkZW4oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5pbm9yZGVuKClcXG5cXG4gICAgZGVmIHBvc3RvcmRlbihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucG9zdG9yZGVuKClcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5wb3N0b3JkZW4oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG5cXG4gICAgZGVmIHByZW9yZGVuKHNlbGYpOlxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucHJlb3JkZW4oKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnByZW9yZGVuKClcXG5cXG4gICAgZGVmIGltcHJpbWlyRXhwcmVzaW9uKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgICAgIHByaW50KCcoJywgZW5kPScgJylcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8uaW1wcmltaXJFeHByZXNpb24oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSwgZW5kPScgJylcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5pbXByaW1pckV4cHJlc2lvbigpXFxuICAgICAgICAgICAgcHJpbnQoJyknLCBlbmQ9JyAnKVxcblxcbiAgICBkZWYgZXZhbFBvc3RvcmRlbihzZWxmKTpcXG4gICAgICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICAgICAgcmVzMSA9IE5vbmVcXG4gICAgICAgIHJlczIgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgcmVzMSA9IHNlbGYuaGlqb0l6cXVpZXJkby5ldmFsUG9zdG9yZGVuKCkgICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICByZXMyID0gc2VsZi5oaWpvRGVyZWNoby5ldmFsUG9zdG9yZGVuKCkgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcnNbc2VsZi5jbGF2ZV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2xhdmVcXG5cXG5kZWYgaW5vcmRlbihhcmJvbCk6XFxuICAgIGlmIGFyYm9sICE9IE5vbmU6XFxuICAgICAgICBpbm9yZGVuKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpXFxuICAgICAgICBwcmludChhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCkpXFxuICAgICAgICBpbm9yZGVuKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKVxcblxcbmRlZiBpbXByaW1pckV4cHJlc2lvbihhcmJvbCk6XFxuICAgIGlmIGFyYm9sLmhpam9JenF1aWVyZG86XFxuICAgICAgICBwcmludCgnKCcsIGVuZD0nICcpXFxuICAgICAgICBpbXByaW1pckV4cHJlc2lvbihhcmJvbC5vYnRlbmVySGlqb0l6cXVpZXJkbygpKVxcbiAgICBwcmludChhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCksIGVuZD0nICcpXFxuICAgIGlmIGFyYm9sLmhpam9EZXJlY2hvOlxcbiAgICAgICAgaW1wcmltaXJFeHByZXNpb24oYXJib2wub2J0ZW5lckhpam9EZXJlY2hvKCkpXFxuICAgICAgICBwcmludCgnKScsIGVuZD0nICcpIFxcblxcbmRlZiBpbXByaW1pckV4cHJlc2lvbihhcmJvbCk6XFxuICB2YWxvckNhZGVuYSA9IFxcXCJcXFwiXFxuICBpZiBhcmJvbDpcXG4gICAgICB2YWxvckNhZGVuYSA9ICcoJyArIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpXFxuICAgICAgdmFsb3JDYWRlbmEgPSB2YWxvckNhZGVuYSArIHN0cihhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCkpXFxuICAgICAgdmFsb3JDYWRlbmEgPSB2YWxvckNhZGVuYSArIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKSsnKSdcXG4gIHJldHVybiB2YWxvckNhZGVuYVxcblxcbmRlZiBldmFsUG9zdG9yZGVuKGFyYm9sKTpcXG4gICAgb3BlcmFkb3JlcyA9IHsnKyc6b3BlcmF0b3IuYWRkLCAnLSc6b3BlcmF0b3Iuc3ViLCAnKic6b3BlcmF0b3IubXVsLCAnLyc6b3BlcmF0b3IudHJ1ZWRpdn1cXG4gICAgcmVzMSA9IE5vbmVcXG4gICAgcmVzMiA9IE5vbmVcXG4gICAgaWYgYXJib2w6XFxuICAgICAgICByZXMxID0gZXZhbFBvc3RvcmRlbihhcmJvbC5vYnRlbmVySGlqb0l6cXVpZXJkbygpKSAjLy8gXFxcXGxhYmVse3BlbGVmdH1cXG4gICAgICAgIHJlczIgPSBldmFsUG9zdG9yZGVuKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKSAgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcmFkb3Jlc1thcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCldKHJlczEscmVzMikgIy8vIFxcXFxsYWJlbHtwZWV2YWx9XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KClcXG5cXG5kZWYgYWx0dXJhKGFyYm9sKTpcXG4gICAgaWYgYXJib2wgPT0gTm9uZTpcXG4gICAgICAgIHJldHVybiAtMVxcbiAgICBlbHNlOlxcbiAgICAgICAgcmV0dXJuIDEgKyBtYXgoYWx0dXJhKGFyYm9sLmhpam9JenF1aWVyZG8pLGFsdHVyYShhcmJvbC5oaWpvRGVyZWNobykpXFxuXFxudCA9IEFyYm9sQmluYXJpbyg3KVxcbnQuaW5zZXJ0YXJJenF1aWVyZG8oMylcXG50Lmluc2VydGFyRGVyZWNobyg5KVxcbmlub3JkZW4odClcXG5pbXBvcnQgb3BlcmF0b3JcXG54ID0gQXJib2xCaW5hcmlvKCcqJylcXG54Lmluc2VydGFySXpxdWllcmRvKCcrJylcXG5sID0geC5vYnRlbmVySGlqb0l6cXVpZXJkbygpXFxubC5pbnNlcnRhckl6cXVpZXJkbyg0KVxcbmwuaW5zZXJ0YXJEZXJlY2hvKDUpXFxueC5pbnNlcnRhckRlcmVjaG8oNylcXG5wcmludChpbXByaW1pckV4cHJlc2lvbih4KSlcXG5wcmludChldmFsUG9zdG9yZGVuKHgpKVxcbnByaW50KGFsdHVyYSh4KSlcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9hdmwucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2F2bC5weVxcblxcbmZyb20gLmFiYiBpbXBvcnQgQXJib2xCaW5hcmlvQnVzcXVlZGEsIE5vZG9BcmJvbFxcblxcbmNsYXNzIEFyYm9sQVZMKEFyYm9sQmluYXJpb0J1c3F1ZWRhKTpcXG5cXG4gICAgZGVmIF9hZ3JlZ2FyKHNlbGYsY2xhdmUsdmFsb3Isbm9kb0FjdHVhbCk6XFxuICAgIFxcdGlmIGNsYXZlIDwgbm9kb0FjdHVhbC5jbGF2ZTpcXG4gICAgXFx0ICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdFxcdHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICBcXHQgICAgZWxzZTpcXG4gICAgXFx0XFx0bm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuICAgIFxcdFxcdHNlbGYuYWN0dWFsaXphckVxdWlsaWJyaW8obm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9EZXJlY2hvKCk6XFxuICAgIFxcdFxcdHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvRGVyZWNobylcXG4gICAgXFx0ICAgIGVsc2U6XFxuICAgIFxcdFxcdG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8gPSBOb2RvQXJib2woY2xhdmUsdmFsb3IscGFkcmU9bm9kb0FjdHVhbClcXG4gICAgXFx0XFx0c2VsZi5hY3R1YWxpemFyRXF1aWxpYnJpbyhub2RvQWN0dWFsLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgYWN0dWFsaXphckVxdWlsaWJyaW8oc2VsZixub2RvKTpcXG4gICAgXFx0aWYgbm9kby5mYWN0b3JFcXVpbGlicmlvID4gMSBvciBub2RvLmZhY3RvckVxdWlsaWJyaW8gPCAtMTpcXG4gICAgXFx0ICAgIHNlbGYucmVlcXVpbGlicmFyKG5vZG8pICAgIFxcbiAgICBcXHQgICAgcmV0dXJuXFxuICAgIFxcdGlmIG5vZG8ucGFkcmUgIT0gTm9uZTpcXG4gICAgXFx0ICAgIGlmIG5vZG8uZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdFxcdCAgICBub2RvLnBhZHJlLmZhY3RvckVxdWlsaWJyaW8gKz0gMVxcbiAgICBcXHQgICAgZWxpZiBub2RvLmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgXFx0XFx0ICAgIG5vZG8ucGFkcmUuZmFjdG9yRXF1aWxpYnJpbyAtPSAxXFxuXFxuICAgIFxcdCAgICBpZiBub2RvLnBhZHJlLmZhY3RvckVxdWlsaWJyaW8gIT0gMDpcXG4gICAgXFx0XFx0ICAgIHNlbGYuYWN0dWFsaXphckVxdWlsaWJyaW8obm9kby5wYWRyZSlcXG5cXG4gICAgZGVmIHJlZXF1aWxpYnJhcihzZWxmLG5vZG8pOlxcbiAgICAgICAgaWYgbm9kby5mYWN0b3JFcXVpbGlicmlvIDwgMDpcXG5cXHQgICAgaWYgbm9kby5oaWpvRGVyZWNoby5mYWN0b3JFcXVpbGlicmlvID4gMDpcXG5cXHQgICAgICAgIHNlbGYucm90YXJEZXJlY2hhKG5vZG8uaGlqb0RlcmVjaG8pXFxuXFx0ICAgICAgICBzZWxmLnJvdGFySXpxdWllcmRhKG5vZG8pXFxuXFx0ICAgIGVsc2U6XFxuXFx0ICAgICAgICBzZWxmLnJvdGFySXpxdWllcmRhKG5vZG8pXFxuICAgICAgICBlbGlmIG5vZG8uZmFjdG9yRXF1aWxpYnJpbyA+IDA6XFxuXFx0ICAgIGlmIG5vZG8uaGlqb0l6cXVpZXJkby5mYWN0b3JFcXVpbGlicmlvIDwgMDpcXG5cXHQgICAgICAgIHNlbGYucm90YXJJenF1aWVyZGEobm9kby5oaWpvSXpxdWllcmRvKVxcblxcdCAgICAgICAgc2VsZi5yb3RhckRlcmVjaGEobm9kbylcXG5cXHQgICAgIGVsc2U6XFxuXFx0ICAgICAgICBzZWxmLnJvdGFyRGVyZWNoYShub2RvKVxcbiAgICAgICAgICAgXFxuICAgIGRlZiByb3Rhckl6cXVpZXJkYShzZWxmLHJvdFJhaXopOlxcbiAgICBcXHRudWV2YVJhaXogPSByb3RSYWl6Lmhpam9EZXJlY2hvXFxuICAgIFxcdHJvdFJhaXouaGlqb0RlcmVjaG8gPSBudWV2YVJhaXouaGlqb0l6cXVpZXJkb1xcbiAgICBcXHRpZiBudWV2YVJhaXouaGlqb0l6cXVpZXJkbyAhPSBOb25lOlxcbiAgICBcXHQgICAgbnVldmFSYWl6Lmhpam9JenF1aWVyZG8ucGFkcmUgPSByb3RSYWl6XFxuICAgIFxcdG51ZXZhUmFpei5wYWRyZSA9IHJvdFJhaXoucGFkcmVcXG4gICAgXFx0aWYgcm90UmFpei5lc1JhaXooKTpcXG4gICAgXFx0ICAgIHNlbGYucmFpeiA9IG51ZXZhUmFpelxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgaWYgcm90UmFpei5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgXFx0ICAgICAgICByb3RSYWl6LnBhZHJlLmhpam9JenF1aWVyZG8gPSBudWV2YVJhaXpcXG4gICAgXFx0ICAgIGVsc2U6XFxuICAgIFxcdCAgICBcXHRyb3RSYWl6LnBhZHJlLmhpam9EZXJlY2hvID0gbnVldmFSYWl6XFxuICAgIFxcdG51ZXZhUmFpei5oaWpvSXpxdWllcmRvID0gcm90UmFpelxcbiAgICBcXHRyb3RSYWl6LnBhZHJlID0gbnVldmFSYWl6XFxuICAgIFxcdHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyA9IHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyArIDEgLSBtaW4obnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8sIDApXFxuICAgIFxcdG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvID0gbnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gKyAxICsgbWF4KHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbywgMClcXG5cXG4gICAgZGVmIHJvdGFyRGVyZWNoYShzZWxmLHJvdFJhaXopOlxcbiAgICAgICAgbnVldmFSYWl6ID0gcm90UmFpei5oaWpvSXpxdWllcmRvXFxuICAgICAgICByb3RSYWl6Lmhpam9JenF1aWVyZG8gPSBudWV2YVJhaXouaGlqb0RlcmVjaG9cXG4gICAgICAgIGlmIG51ZXZhUmFpei5oaWpvRGVyZWNobyAhPSBOb25lOlxcbiAgICAgICAgICAgIG51ZXZhUmFpei5oaWpvRGVyZWNoby5wYWRyZSA9IHJvdFJhaXpcXG4gICAgICAgIG51ZXZhUmFpei5wYWRyZSA9IHJvdFJhaXoucGFkcmVcXG4gICAgICAgIGlmIHJvdFJhaXouZXNSYWl6KCk6XFxuICAgICAgICAgICAgc2VsZi5yYWl6ID0gbnVldmFSYWl6XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdFJhaXouZXNIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICByb3RSYWl6LnBhZHJlLmhpam9EZXJlY2hvID0gbnVldmFSYWl6XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90UmFpei5wYWRyZS5oaWpvSXpxdWllcmRvID0gbnVldmFSYWl6XFxuICAgICAgICBudWV2YVJhaXouaGlqb0RlcmVjaG8gPSByb3RSYWl6XFxuICAgICAgICByb3RSYWl6LnBhZHJlID0gbnVldmFSYWl6XFxuICAgICAgICByb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSByb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8gLSAxIC0gbWF4KG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKVxcbiAgICAgICAgbnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSBudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbyAtIDEgKyBtaW4ocm90UmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKSAgXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvbW9udGljdWxvQmluYXJpby5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI21vbnRpY3Vsb0JpbmFyaW8ucHlcXG5cXG5jbGFzcyBNb250aWN1bG9CaW5hcmlvOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvID0gWzBdXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IDBcXG5cXG4gICAgZGVmIGNvbnN0cnVpck1vbnRpY3VsbyhzZWxmLHVuYUxpc3RhKTpcXG4gICAgICAgIGkgPSBsZW4odW5hTGlzdGEpIC8vIDJcXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gbGVuKHVuYUxpc3RhKVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3VsbyA9IFswXSArIHVuYUxpc3RhWzpdXFxuICAgICAgICBwcmludChsZW4oc2VsZi5saXN0YU1vbnRpY3VsbyksIGkpXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHByaW50KHNlbGYubGlzdGFNb250aWN1bG8sIGkpXFxuICAgICAgICAgICAgc2VsZi5pbmZpbHRBYmFqbyhpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgcHJpbnQoc2VsZi5saXN0YU1vbnRpY3VsbyxpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaW5maWx0QWJham8oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgaG0gPSBzZWxmLmhpam9NaW4oaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmxpc3RhTW9udGljdWxvW2ldID4gc2VsZi5saXN0YU1vbnRpY3Vsb1tobV06XFxuICAgICAgICAgICAgICAgIHRtcCA9IHNlbGYubGlzdGFNb250aWN1bG9baV1cXG4gICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA9IHNlbGYubGlzdGFNb250aWN1bG9baG1dXFxuICAgICAgICAgICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9baG1dID0gdG1wXFxuICAgICAgICAgICAgaSA9IGhtXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaGlqb01pbihzZWxmLGkpOlxcbiAgICAgICAgaWYgaSAqIDIgKyAxID4gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYubGlzdGFNb250aWN1bG9baSAqIDJdIDwgc2VsZi5saXN0YU1vbnRpY3Vsb1tpICogMiArIDFdOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDIgKyAxXFxuXFxuICAgIGRlZiBpbmZpbHRBcnJpYmEoc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIGkgLy8gMiA+IDA6XFxuICAgICAgICAgICAgaWYgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA8IHNlbGYubGlzdGFNb250aWN1bG9baS8vMl06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tpIC8vIDJdXFxuICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tpIC8vIDJdID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tpXVxcbiAgICAgICAgICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9baV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaSAvLyAyXFxuIFxcbiAgICBkZWYgaW5zZXJ0YXIoc2VsZixrKTpcXG4gICAgICAgIHNlbGYubGlzdGFNb250aWN1bG8uYXBwZW5kKGspXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsICsgMVxcbiAgICAgICAgc2VsZi5pbmZpbHRBcnJpYmEoc2VsZi50YW1hbm9BY3R1YWwpXFxuXFxuICAgIGRlZiBlbGltaW5hck1pbihzZWxmKTpcXG4gICAgICAgIHZhbG9yU2FjYWRvID0gc2VsZi5saXN0YU1vbnRpY3Vsb1sxXVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1sxXSA9IHNlbGYubGlzdGFNb250aWN1bG9bc2VsZi50YW1hbm9BY3R1YWxdXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsIC0gMVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsby5wb3AoKVxcbiAgICAgICAgc2VsZi5pbmZpbHRBYmFqbygxKVxcbiAgICAgICAgcmV0dXJuIHZhbG9yU2FjYWRvXFxuICAgICAgICBcXG4gICAgZGVmIGVzdGFWYWNpbyhzZWxmKTpcXG4gICAgICAgIGlmIHRhbWFub0FjdHVhbCA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblwiLFwic3JjL2xpYi9weXRob25lZC9iYXNpY2FzL19faW5pdF9fLnB5XCI6XCJcXG4jX19hbGxfXyA9IFtcXFwicGlsYVxcXCJdXFxuXFxuXFxuZnJvbSAucGlsYSBpbXBvcnQgUGlsYVxcbmZyb20gLmNvbGEgaW1wb3J0IENvbGFcXG5mcm9tIC5jb2xhZG9ibGUgaW1wb3J0IENvbGFEb2JsZVxcblxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9iYXNpY2FzL2NvbGEucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2NvbGEucHlcXG5cXG5jbGFzcyBDb2xhOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBhZ3JlZ2FyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5pbnNlcnQoMCxpdGVtKVxcblxcbiAgICBkZWYgYXZhbnphcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvY29sYWRvYmxlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jY29sYWRvYmxlLnB5XFxuXFxuY2xhc3MgQ29sYURvYmxlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBhZ3JlZ2FyRnJlbnRlKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGFncmVnYXJGaW5hbChzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsaXRlbSlcXG5cXG4gICAgZGVmIHJlbW92ZXJGcmVudGUoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlckZpbmFsKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKDApXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvcGlsYS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI3BpbGEucHlcXG5cXG5jbGFzcyBQaWxhOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBpbmNsdWlyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGV4dHJhZXIoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgaW5zcGVjY2lvbmFyKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXNbbGVuKHNlbGYuaXRlbXMpLTFdXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2dyYWZvcy9fX2luaXRfXy5weVwiOlwiXFxuXFxuZnJvbSAuZ3JhZm9BZHkgaW1wb3J0IEdyYWZvXFxuZnJvbSAuZ3JhZm9BZHkgaW1wb3J0IFZlcnRpY2VcXG5mcm9tIC5jb2xhUHJpb3JpZGFkIGltcG9ydCBDb2xhUHJpb3JpZGFkXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2dyYWZvcy9jb2xhUHJpb3JpZGFkLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jY29sYVByaW9yaWRhZC5weVxcblxcbmNsYXNzIENvbGFQcmlvcmlkYWQ6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3VsbyA9IFsoMCwwKV1cXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gMFxcblxcbiAgICBkZWYgY29uc3RydWlyTW9udGljdWxvKHNlbGYsdW5hTGlzdGEpOlxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBsZW4odW5hTGlzdGEpXFxuICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8gPSBbKDAsMCldXFxuICAgICAgICBmb3IgaSBpbiB1bmFMaXN0YTpcXG4gICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8uYXBwZW5kKGkpXFxuICAgICAgICBpID0gbGVuKHVuYUxpc3RhKSAvLyAyICAgICAgICAgICAgXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHNlbGYuaW5maWx0QWJham8oaSlcXG4gICAgICAgICAgICBpID0gaSAtIDFcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgZGVmIGluZmlsdEFiYWpvKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSAoaSAqIDIpIDw9IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIGhtID0gc2VsZi5oaWpvTWluKGkpXFxuICAgICAgICAgICAgaWYgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldWzBdID4gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2htXVswXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpXSA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tobV1cXG4gICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2htXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBobVxcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIGhpam9NaW4oc2VsZixpKTpcXG4gICAgICAgIGlmIGkqMiA+IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBpKjIgKyAxID4gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baSoyXVswXSA8IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpKjIrMV1bMF06XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSoyXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSoyKzFcXG5cXG4gICAgZGVmIGluZmlsdEFycmliYShzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgaSAvLyAyID4gMDpcXG4gICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1bMF0gPCBzZWxmLmFycmVnbG9Nb250aWN1bG9baS8vMl1bMF06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kvLzJdXFxuICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kvLzJdID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldID0gdG1wXFxuICAgICAgICAgICAgaSA9IGkvLzJcXG4gXFxuICAgIGRlZiBpbnNlcnRhcihzZWxmLGspOlxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvLmFwcGVuZChrKVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBzZWxmLnRhbWFub0FjdHVhbCArIDFcXG4gICAgICAgIHNlbGYuaW5maWx0QXJyaWJhKHNlbGYudGFtYW5vQWN0dWFsKVxcblxcbiAgICBkZWYgZWxpbWluYXJNaW4oc2VsZik6XFxuICAgICAgICB2YWxvclNhY2FkbyA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1sxXVsxXVxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvWzFdID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW3NlbGYudGFtYW5vQWN0dWFsXVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBzZWxmLnRhbWFub0FjdHVhbCAtIDFcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsby5wb3AoKVxcbiAgICAgICAgc2VsZi5pbmZpbHRBYmFqbygxKVxcbiAgICAgICAgcmV0dXJuIHZhbG9yU2FjYWRvXFxuICAgICAgICBcXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYudGFtYW5vQWN0dWFsID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBkZWNyZW1lbnRhckNsYXZlKHNlbGYsdmFsb3IsbnVldm8pOlxcbiAgICAgICAgaGVjaG8gPSBGYWxzZVxcbiAgICAgICAgaSA9IDFcXG4gICAgICAgIG1pQ2xhdmUgPSAwXFxuICAgICAgICB3aGlsZSBub3QgaGVjaG8gYW5kIGkgPD0gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgaWYgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldWzFdID09IHZhbG9yOlxcbiAgICAgICAgICAgICAgICBoZWNobyA9IFRydWVcXG4gICAgICAgICAgICAgICAgbWlDbGF2ZSA9IGlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgIGlmIG1pQ2xhdmUgPiAwOlxcbiAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1ttaUNsYXZlXSA9IChudWV2byxzZWxmLmFycmVnbG9Nb250aWN1bG9bbWlDbGF2ZV1bMV0pXFxuICAgICAgICAgICAgc2VsZi5pbmZpbHRBcnJpYmEobWlDbGF2ZSlcXG4gICAgICAgICAgICBcXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLHZlcnRpY2UpOlxcbiAgICAgICAgZm9yIHBhcmVqYSBpbiBzZWxmLmFycmVnbG9Nb250aWN1bG86XFxuICAgICAgICAgICAgaWYgcGFyZWphWzFdID09IHZlcnRpY2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICByZXR1cm4gRmFsc2UgICAgIFxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9ncmFmb3MvZ3JhZm9BZHkucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2dyYWZvQWR5LnB5XFxuXFxuXFxuaW1wb3J0IHN5c1xcblxcbmNsYXNzIEdyYWZvOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmxpc3RhVmVydGljZXMgPSB7fVxcbiAgICAgICAgc2VsZi5udW1WZXJ0aWNlcyA9IDBcXG4gICAgICAgIFxcbiAgICBkZWYgYWdyZWdhclZlcnRpY2Uoc2VsZixjbGF2ZSk6XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gc2VsZi5udW1WZXJ0aWNlcyArIDFcXG4gICAgICAgIG51ZXZvVmVydGljZSA9IFZlcnRpY2UoY2xhdmUpXFxuICAgICAgICBzZWxmLmxpc3RhVmVydGljZXNbY2xhdmVdID0gbnVldm9WZXJ0aWNlXFxuICAgICAgICByZXR1cm4gbnVldm9WZXJ0aWNlXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lclZlcnRpY2Uoc2VsZixuKTpcXG4gICAgICAgIGlmIG4gaW4gc2VsZi5saXN0YVZlcnRpY2VzOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmxpc3RhVmVydGljZXNbbl1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLG4pOlxcbiAgICAgICAgcmV0dXJuIG4gaW4gc2VsZi5saXN0YVZlcnRpY2VzXFxuICAgIFxcbiAgICBkZWYgYWdyZWdhckFyaXN0YShzZWxmLGRlLGEsY29zdG89MCk6XFxuICAgICAgICAgICAgaWYgZGUgbm90IGluIHNlbGYubGlzdGFWZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFncmVnYXJWZXJ0aWNlKGRlKVxcbiAgICAgICAgICAgIGlmIGEgbm90IGluIHNlbGYubGlzdGFWZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFncmVnYXJWZXJ0aWNlKGEpXFxuICAgICAgICAgICAgc2VsZi5saXN0YVZlcnRpY2VzW2RlXS5hZ3JlZ2FyVmVjaW5vKHNlbGYubGlzdGFWZXJ0aWNlc1thXSxjb3N0bylcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVyVmVydGljZXMoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGlzdChzZWxmLmxpc3RhVmVydGljZXMua2V5cygpKVxcbiAgICAgICAgXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBpdGVyKHNlbGYubGlzdGFWZXJ0aWNlcy52YWx1ZXMoKSlcXG4gICAgICAgICAgICAgICAgXFxuY2xhc3MgVmVydGljZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgc2VsZi5pZCA9IGNsYXZlXFxuICAgICAgICBzZWxmLmNvbmVjdGFkb0EgPSB7fVxcbiAgICAgICAgc2VsZi5jb2xvciA9ICdibGFuY28nXFxuICAgICAgICBzZWxmLmRpc3QgPSBzeXMubWF4c2l6ZVxcbiAgICAgICAgc2VsZi5wcmVkZWNlc29yID0gTm9uZVxcbiAgICAgICAgc2VsZi5kZXNjID0gMFxcbiAgICAgICAgc2VsZi5maW4gPSAwXFxuXFxuICAgICMgZGVmIF9fbHRfXyhzZWxmLG8pOlxcbiAgICAjICAgICByZXR1cm4gc2VsZi5pZCA8IG8uaWRcXG4gICAgXFxuICAgIGRlZiAgYWdyZWdhclZlY2lubyhzZWxmLHZlY2lubyxwb25kZXJhY2lvbj0wKTpcXG4gICAgICAgIHNlbGYuY29uZWN0YWRvQVt2ZWNpbm9dID0gcG9uZGVyYWNpb25cXG4gICAgICAgIFxcbiAgICBkZWYgYXNpZ25hckNvbG9yKHNlbGYsY29sb3IpOlxcbiAgICAgICAgc2VsZi5jb2xvciA9IGNvbG9yXFxuICAgICAgICBcXG4gICAgZGVmIGFzaWduYXJEaXN0YW5jaWEoc2VsZixkKTpcXG4gICAgICAgIHNlbGYuZGlzdCA9IGRcXG5cXG4gICAgZGVmIGFzaWduYXJQcmVkZWNlc29yKHNlbGYscCk6XFxuICAgICAgICBzZWxmLnByZWRlY2Vzb3IgPSBwXFxuXFxuICAgIGRlZiBhc2lnbmFyRGVzY3VicmltaWVudG8oc2VsZix0aWVtcG9EZXNjdWJyaW1pZW50byk6XFxuICAgICAgICBzZWxmLmRlc2MgPSB0aWVtcG9EZXNjdWJyaW1pZW50b1xcbiAgICAgICAgXFxuICAgIGRlZiBhc2lnbmFyRmluYWxpemFjaW9uKHNlbGYsdGllbXBvRmluYWxpemFjaW9uKTpcXG4gICAgICAgIHNlbGYuZmluID0gdGllbXBvRmluYWxpemFjaW9uXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJGaW5hbGl6YWNpb24oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5maW5cXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckRlc2N1YnJpbWllbnRvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGVzY1xcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyUHJlZGVjZXNvcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnByZWRlY2Vzb3JcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckRpc3RhbmNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmRpc3RcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckNvbG9yKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29sb3JcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVyQ29uZXhpb25lcyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbmVjdGFkb0Eua2V5cygpXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJQb25kZXJhY2lvbihzZWxmLHZlY2lubyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb25lY3RhZG9BW3ZlY2lub11cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLmlkKSArIFxcXCI6Y29sb3IgXFxcIiArIHNlbGYuY29sb3IgKyBcXFwiOmRlc2MgXFxcIiArIHN0cihzZWxmLmRlc2MpICsgXFxcIjpmaW4gXFxcIiArIHN0cihzZWxmLmZpbikgKyBcXFwiOmRpc3RhbmNpYSBcXFwiICsgc3RyKHNlbGYuZGlzdCkgKyBcXFwiOnByZWRlY2Vzb3IgXFxcXG5cXFxcdFtcXFwiICsgc3RyKHNlbGYucHJlZGVjZXNvcikrIFxcXCJdXFxcXG5cXFwiXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lcklkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaWRcXG5cIixcInNyYy9saWIvcXVvcHJpLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJxdW9wcmkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yYW5kb20uanNcIjpcInZhciBNZXJzZW5uZVR3aXN0ZXI9ZnVuY3Rpb24oYSl7YT09bnVsbCYmKGE9bmV3IERhdGUoKS5nZXRUaW1lKCkpLHRoaXMuTj02MjQsdGhpcy5NPTM5Nyx0aGlzLk1BVFJJWF9BPTI1Njc0ODM2MTUsdGhpcy5VUFBFUl9NQVNLPTIxNDc0ODM2NDgsdGhpcy5MT1dFUl9NQVNLPTIxNDc0ODM2NDcsdGhpcy5tdD1BcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHRoaXMuaW5pdF9nZW5yYW5kKGEpfTtNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmluaXRfZ2VucmFuZD1mdW5jdGlvbihhKXtmb3IodGhpcy5tdFswXT1hPj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgYT10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oMTgxMjQzMzI1MyooKDQyOTQ5MDE3NjAmYSk+Pj4xNik8PDE2KSsxODEyNDMzMjUzKig2NTUzNSZhKSt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5pbml0X2J5X2FycmF5PWZ1bmN0aW9uKGEsYil7dmFyIGQsZSxmO2Zvcih0aGlzLmluaXRfZ2VucmFuZCgxOTY1MDIxOCksZD0xLGU9MCxmPXRoaXMuTj5iP3RoaXMuTjpiO2Y7Zi0tKXt2YXIgZz10aGlzLm10W2QtMV1edGhpcy5tdFtkLTFdPj4+MzA7dGhpcy5tdFtkXT0odGhpcy5tdFtkXV4oMTY2NDUyNSooKDQyOTQ5MDE3NjAmZyk+Pj4xNik8PDE2KSsxNjY0NTI1Kig2NTUzNSZnKSkrYVtlXStlLHRoaXMubXRbZF0+Pj49MCxkKyssZSsrLGQ+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sZD0xKSxlPj1iJiYoZT0wKX1mb3IoZj10aGlzLk4tMTtmO2YtLSl7dmFyIGc9dGhpcy5tdFtkLTFdXnRoaXMubXRbZC0xXT4+PjMwO3RoaXMubXRbZF09KHRoaXMubXRbZF1eKDE1NjYwODM5NDEqKCg0Mjk0OTAxNzYwJmcpPj4+MTYpPDwxNikrMTU2NjA4Mzk0MSooNjU1MzUmZykpLWQsdGhpcy5tdFtkXT4+Pj0wLGQrKyxkPj10aGlzLk4mJih0aGlzLm10WzBdPXRoaXMubXRbdGhpcy5OLTFdLGQ9MSl9dGhpcy5tdFswXT0yMTQ3NDgzNjQ4fSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmdlbnJhbmRfaW50MzI9ZnVuY3Rpb24oKXt2YXIgYSxiPVswLHRoaXMuTUFUUklYX0FdO2lmKHRoaXMubXRpPj10aGlzLk4pe3ZhciBkO2Zvcih0aGlzLm10aT09dGhpcy5OKzEmJnRoaXMuaW5pdF9nZW5yYW5kKDU0ODkpLGQ9MDtkPHRoaXMuTi10aGlzLk07ZCsrKWE9dGhpcy5tdFtkXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtkKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W2RdPXRoaXMubXRbZCt0aGlzLk1dXmE+Pj4xXmJbMSZhXTtmb3IoO2Q8dGhpcy5OLTE7ZCsrKWE9dGhpcy5tdFtkXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtkKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W2RdPXRoaXMubXRbZCsodGhpcy5NLXRoaXMuTildXmE+Pj4xXmJbMSZhXTthPXRoaXMubXRbdGhpcy5OLTFdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10WzBdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RoaXMuTi0xXT10aGlzLm10W3RoaXMuTS0xXV5hPj4+MV5iWzEmYV0sdGhpcy5tdGk9MH1yZXR1cm4gYT10aGlzLm10W3RoaXMubXRpKytdLGFePWE+Pj4xMSxhXj0yNjM2OTI4NjQwJmE8PDcsYV49NDAyMjczMDc1MiZhPDwxNSxhXj1hPj4+MTgsYT4+PjB9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9pbnQzMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlbnJhbmRfaW50MzIoKT4+PjF9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZWFsMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlbnJhbmRfaW50MzIoKSooMS80Mjk0OTY3Mjk1KX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5yYW5kb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZW5yYW5kX2ludDMyKCkqKDEvNDI5NDk2NzI5Nil9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZWFsMz1mdW5jdGlvbigpe3JldHVybih0aGlzLmdlbnJhbmRfaW50MzIoKSsuNSkqKDEvNDI5NDk2NzI5Nil9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZXM1Mz1mdW5jdGlvbigpe3ZhciBkPXRoaXMuZ2VucmFuZF9pbnQzMigpPj4+NSxhPXRoaXMuZ2VucmFuZF9pbnQzMigpPj4+NjtyZXR1cm4oNjcxMDg4NjQqZCthKSooMS85MDA3MTk5MjU0NzQwOTkyKX07dmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5sb2csYj1NYXRoLnNxcnQsZD17fSxlPW5ldyBNZXJzZW5uZVR3aXN0ZXIsZj12b2lkIDA7ZC5zZWVkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNlZWRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGU9MDxhcmd1bWVudHMubGVuZ3RoP25ldyBNZXJzZW5uZVR3aXN0ZXIoYSk6bmV3IE1lcnNlbm5lVHdpc3RlcixTay5idWlsdGluLm5vbmUubm9uZSR9KSxkLnJhbmRvbT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJhbmRvbVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLmZsb2F0XyhlLmdlbnJhbmRfcmVzNTMoKSl9KTt2YXIgZz1mdW5jdGlvbihhKXtyZXR1cm4gMHxhfSxoPWZ1bmN0aW9uKGEsYixkKXt2YXIgZixoLGk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgZmlyc3QgYXJndW1lbnQgZm9yIHJhbmRyYW5nZSgpXFxcIik7aWYodm9pZCAwPT09YilyZXR1cm4gaT1nKGUuZ2VucmFuZF9yZXM1MygpKmEpLG5ldyBTay5idWlsdGluLmludF8oaSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgc3RvcCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZih2b2lkIDA9PT1kJiYoZD0xKSxmPWItYSwxPT1kJiYwPGYpcmV0dXJuIGk9YStnKGUuZ2VucmFuZF9yZXM1MygpKmYpLG5ldyBTay5idWlsdGluLmludF8oaSk7aWYoMT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKCkgKFxcXCIrYStcXFwiLCBcXFwiK2IrXFxcIiwgXFxcIitmK1xcXCIpXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgc3RlcCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZigwPGQpaD1nKChmK2QtMSkvZCk7ZWxzZSBpZigwPmQpaD1nKChmK2QrMSkvZCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJ6ZXJvIHN0ZXAgZm9yIHJhbmRyYW5nZSgpXFxcIik7aWYoMD49aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKClcXFwiKTtyZXR1cm4gaT1hK2QqZyhlLmdlbnJhbmRfcmVzNTMoKSpoKSxuZXcgU2suYnVpbHRpbi5pbnRfKGkpfTtkLnJhbmRpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihkLGUpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJyYW5kaW50XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksZD1Tay5idWlsdGluLmFzbnVtJChkKSxlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGgoZCxlKzEpfSksZC5yYW5kcmFuZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsZCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJhbmRyYW5nZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDMpLGE9U2suYnVpbHRpbi5hc251bSQoYSksYj1Tay5idWlsdGluLmFzbnVtJChiKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGgoYSxiLGQpfSksZC51bmlmb3JtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZCxmKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ1bmlmb3JtXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksZD1Tay5idWlsdGluLmFzbnVtJChkKSxmPVNrLmJ1aWx0aW4uYXNudW0kKGYpO3ZhciBnPWUuZ2VucmFuZF9yZXM1MygpO3JldHVybiBjPWQrZyooZi1kKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9KSxkLnRyaWFuZ3VsYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGQsZil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwidHJpYW5ndWxhclxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImxvd1xcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiaGlnaFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihkKSk7dmFyIGcsaCxpO3JldHVybiBhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksYT5kJiYoaT1hLGE9ZCxkPWkpLHZvaWQgMD09PWZ8fGY9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/Zj0oZC1hKS8yOihTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJtb2RlXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGYpKSxmPVNrLmJ1aWx0aW4uYXNudW0kKGYpKSxnPWUuZ2VucmFuZF9yZXM1MygpLGg9ZzwoZi1hKS8oZC1hKT9hK2IoZyooZC1hKSooZi1hKSk6ZC1iKCgxLWcpKihkLWEpKihkLWYpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oaCl9KTt2YXIgaT1mdW5jdGlvbihkLGcpe3ZhciBrLGwsbSxuLG8saD1NYXRoLnNpbixpPU1hdGguY29zLGo9TWF0aC5QSTtyZXR1cm4gdm9pZCAwPT09Zj8oaz1lLmdlbnJhbmRfcmVzNTMoKSxsPWUuZ2VucmFuZF9yZXM1MygpLG09YigtMiphKGspKSxuPTIqaipsLG89bSppKG4pLGY9bSpoKG4pKToobz1mLGY9dm9pZCAwKSxkK2cqb307cmV0dXJuIGQuZ2F1c3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnYXVzc1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcIm11XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzaWdtYVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksYT1Tay5idWlsdGluLmFzbnVtJChhKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLG5ldyBTay5idWlsdGluLmZsb2F0XyhpKGEsYikpfSksZC5ub3JtYWx2YXJpYXRlPWQuZ2F1c3MsZC5sb2dub3JtdmFyaWF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGQ9TWF0aC5leHA7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImxvZ25vcm12YXJpYXRlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwibXVcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInNpZ21hXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGI9U2suYnVpbHRpbi5hc251bSQoYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQoaShhLGIpKSl9KSxkLmV4cG92YXJpYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZXhwb3ZhcmlhdGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJsYW1iZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksYj1Tay5idWlsdGluLmFzbnVtJChiKTt2YXIgZD1lLmdlbnJhbmRfcmVzNTMoKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC1hKGQpL2IpfSksZC5jaG9pY2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJjaG9pY2VcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzZXFcXFwiLFxcXCJzZXF1ZW5jZVxcXCIsU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpKSx2b2lkIDAhPT1hLnNxJGxlbmd0aCl7dmFyIGI9bmV3IFNrLmJ1aWx0aW4uaW50XyhnKGUuZ2VucmFuZF9yZXM1MygpKmEuc3EkbGVuZ3RoKCkpKTtyZXR1cm4gYS5tcCRzdWJzY3JpcHQoYil9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaGFzIG5vIGxlbmd0aFxcXCIpfSksZC5zaHVmZmxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2h1ZmZsZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJzZXF1ZW5jZVxcXCIsU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpKSxhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5saXN0KXtjb25zdCBoPWEudjtmb3IodmFyIGI9aC5sZW5ndGgtMTswPGI7Yi09MSl7dmFyIGQ9ZyhlLmdlbnJhbmRfcmVzNTMoKSooYisxKSksZj1oW2RdO2hbZF09aFtiXSxoW2JdPWZ9fWVsc2UgaWYodm9pZCAwPT09YS5zcSRsZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaGFzIG5vIGxlbmd0aFxcXCIpO2Vsc2UgaWYodm9pZCAwIT09YS5tcCRhc3Nfc3Vic2NyaXB0KWZvcih2YXIgZCxiPWEuc3EkbGVuZ3RoKCktMTswPGI7Yi09MSl7ZD1uZXcgU2suYnVpbHRpbi5pbnRfKGcoZS5nZW5yYW5kX3JlczUzKCkqKGIrMSkpKSxiPW5ldyBTay5idWlsdGluLmludF8oYik7dmFyIGY9YS5tcCRzdWJzY3JpcHQoZCk7YS5tcCRhc3Nfc3Vic2NyaXB0KGQsYS5tcCRzdWJzY3JpcHQoYikpLGEubXAkYXNzX3N1YnNjcmlwdChiLGYpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaXMgaW1tdXRhYmxlXFxcIik7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGQuc2FtcGxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgZixnLGgsbCxtLGQ9TWF0aC5mbG9vcjtmb3IoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2FtcGxlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicG9wdWxhdGlvblxcXCIsXFxcIml0ZXJhYmxlXFxcIixTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImtcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGIpKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLG09W10saD1Tay5hYnN0ci5pdGVyKGEpLChmPTAsbD1oLnRwJGl0ZXJuZXh0KCkpO3ZvaWQgMCE9PWw7ZisrLGw9aC50cCRpdGVybmV4dCgpKWc9ZChlLmdlbnJhbmRfcmVzNTMoKSooZisxKSksZjxiPyhnPGYmJihtW2ZdPW1bZ10pLG1bZ109bCk6ZzxiJiYobVtnXT1sKTtpZihmPGIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwic2FtcGxlIGxhcmdlciB0aGFuIHBvcHVsYXRpb25cXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChtKX0pLGR9O1wiLFwic3JjL2xpYi9yZS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKG5hbWUpe3ZhciB2YWxpZEdyb3Vwcyxjb252ZXJ0LGdldEZsYWdzLF9zcGxpdCxfZmluZGFsbCxtYXRjaG9iaixfc2VhcmNoLF9tYXRjaCxyZWdleG9iaixtb2Q9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwicmVcXFwiKX07cmV0dXJuIG1vZC5JPTIsbW9kLklHTk9SRUNBU0U9Mixtb2QuTT04LG1vZC5NVUxUSUxJTkU9OCx2YWxpZEdyb3Vwcz1bXFxcIig/OlxcXCIsXFxcIig/PVxcXCIsXFxcIig/IVxcXCJdLGNvbnZlcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkO2lmKGM9YS5tYXRjaCgvXFxcXChcXFxcPy4vZyksYylmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWlmKC0xPT12YWxpZEdyb3Vwcy5pbmRleE9mKGNbZF0pKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkRpc2FsbG93ZWQgZ3JvdXAgaW4gcGF0dGVybjogJ1xcXCIrY1tkXStcXFwiJ1xcXCIpO3JldHVybiBiPWEucmVwbGFjZShcXFwiL1xcXFxcXFxcL2dcXFwiLFxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIiksYj1hLnJlcGxhY2UoLyhbXlxcXFxcXFxcXSl7LCg/IVteXFxcXFtdKlxcXFxdKS9nLFxcXCIkMXswLFxcXCIpLGJ9LGdldEZsYWdzPWZ1bmN0aW9uKGEpe3ZhciBiPVxcXCJnXFxcIjtyZXR1cm4oYSZtb2QuSUdOT1JFQ0FTRSk9PW1vZC5JR05PUkVDQVNFJiYoYis9XFxcImlcXFwiKSwoYSZtb2QuTVVMVElMSU5FKT09bW9kLk1VTFRJTElORSYmKGIrPVxcXCJtXFxcIiksYn0sX3NwbGl0PWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksaixrLGwsbTtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzcGxpdFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwicGF0dGVybiBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzdHJpbmcgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWF4c3BsaXQgbXVzdCBiZSBhIG51bWJlclxcXCIpO2lmKHZvaWQgMD09PWQmJihkPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO2ZvcihjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGU9U2suZmZpLnVud3JhcG8oYSksZj1Tay5mZmkudW53cmFwbyhiKSxlPWNvbnZlcnQoZSksZz1udWxsIT09ZS5tYXRjaCgvXlxcXFwoLipcXFxcKSQvKSxoPWdldEZsYWdzKGQpLGk9bmV3IFJlZ0V4cChlLGgpLGo9W10sayxsPTAsbT0wO251bGwhPShrPWkuZXhlYyhmKSkmJmsuaW5kZXghPT1pLmxhc3RJbmRleCYmKGoucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZi5zdWJzdHJpbmcobCxrLmluZGV4KSkpLGcmJmoucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoa1swXSkpLGw9aS5sYXN0SW5kZXgsbSs9MSwhKGMmJm0+PWMpKTspO3JldHVybiBqLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGYuc3Vic3RyaW5nKGwpKSksbmV3IFNrLmJ1aWx0aW4ubGlzdChqKX0sX3NwbGl0LmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcIm1heHNwbGl0XFxcIixcXFwiZmxhZ3NcXFwiXSxfc3BsaXQuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCldLG1vZC5zcGxpdD1uZXcgU2suYnVpbHRpbi5mdW5jKF9zcGxpdCksX2ZpbmRhbGw9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsajtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJmaW5kYWxsXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7aWYoZD1Tay5mZmkudW53cmFwbyhhKSxlPVNrLmZmaS51bndyYXBvKGIpLGQ9Y29udmVydChkKSxmPWdldEZsYWdzKGMpLGc9bmV3IFJlZ0V4cChkLGYpLGQubWF0Y2goL1xcXFwkLykpe3ZhciBrPW5ldyBSZWdFeHAoL1xcXFxuJC8pO2UubWF0Y2goaykmJihlPWUuc2xpY2UoMCwtMSkpfWZvcihoPVtdLGo7bnVsbCE9KGo9Zy5leGVjKGUpKTspe2lmKDI+ai5sZW5ndGgpaC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihqWzBdKSk7ZWxzZSBpZigyPT1qLmxlbmd0aCloLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGpbMV0pKTtlbHNle2Zvcih2YXIgbD1bXSxtPTE7bTxqLmxlbmd0aDttKyspbC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihqW21dKSk7aC5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKGwpKX1qLmluZGV4PT09Zy5sYXN0SW5kZXgmJihnLmxhc3RJbmRleCs9MSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoaCl9LF9maW5kYWxsLmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcImZsYWdzXFxcIl0sX2ZpbmRhbGwuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2QuZmluZGFsbD1uZXcgU2suYnVpbHRpbi5mdW5jKF9maW5kYWxsKSxtYXRjaG9iaj1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYS50aGVtYXRjaD1iLGEucmU9YyxhLnN0cmluZz1kLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIuZ3JvdXBzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS50aGVtYXRjaC52LnNsaWNlKDEpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShiKX0pLGIuZ3JvdXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKGI9dm9pZCAwPT09Yj8wOlNrLmJ1aWx0aW4uYXNudW0kKGIpLGI+PWEudGhlbWF0Y2gudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwiSW5kZXggb3V0IG9mIHJhbmdlOiBcXFwiK2IpO3JldHVybiBhLnRoZW1hdGNoLnZbYl19KX0sbW9kLk1hdGNoT2JqZWN0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MobW9kLG1hdGNob2JqLFxcXCJNYXRjaE9iamVjdFxcXCIsW10pLG1vZC5fZmluZHJlPWZ1bmN0aW9uKHJlcyxzdHJpbmcpe3Jlcz1yZXMucmVwbGFjZSgvKFteXFxcXFxcXFxdKXssKD8hW15cXFxcW10qXFxcXF0pL2csXFxcIiQxezAsXFxcIik7dmFyIG1hdGNoZXMsc2l0ZW0scmV0dmFsLHJlPWV2YWwocmVzKSxwYXR0PS9cXFxcbiQvLHN0cj1Tay5mZmkucmVtYXBUb0pzKHN0cmluZyk7aWYobWF0Y2hlcz1zdHIubWF0Y2gocGF0dCk/c3RyLnNsaWNlKDAsLTEpLm1hdGNoKHJlKTpzdHIubWF0Y2gocmUpLHJldHZhbD1uZXcgU2suYnVpbHRpbi5saXN0LG51bGw9PW1hdGNoZXMpcmV0dXJuIHJldHZhbDtmb3IodmFyIGk9MDtpPG1hdGNoZXMubGVuZ3RoOysraSlzaXRlbT1uZXcgU2suYnVpbHRpbi5zdHIobWF0Y2hlc1tpXSkscmV0dmFsLnYucHVzaChzaXRlbSk7cmV0dXJuIHJldHZhbH0sX3NlYXJjaD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZWFyY2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic3RyaW5nIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz0wKSwhU2suYnVpbHRpbi5jaGVja051bWJlcihjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZsYWdzIG11c3QgYmUgYSBudW1iZXJcXFwiKTtyZXR1cm4oZT1cXFwiL1xcXCIrYS52LnJlcGxhY2UoL1xcXFwvL2csXFxcIlxcXFxcXFxcL1xcXCIpK1xcXCIvXFxcIixsc3Q9bW9kLl9maW5kcmUoZSxiKSwxPmxzdC52Lmxlbmd0aCk/U2suYnVpbHRpbi5ub25lLm5vbmUkOihkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuTWF0Y2hPYmplY3QsW2xzdCxhLGJdKSxkKX0sX3NlYXJjaC5jb192YXJuYW1lcz1bXFxcInBhdHRlcm5cXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJmbGFnc1xcXCJdLF9zZWFyY2guJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2Quc2VhcmNoPW5ldyBTay5idWlsdGluLmZ1bmMoX3NlYXJjaCksX21hdGNoPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1hdGNoXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7cmV0dXJuKHBhdD1Tay5mZmkucmVtYXBUb0pzKGEpLGU9XFxcIi9eXFxcIitwYXQucmVwbGFjZSgvXFxcXC8vZyxcXFwiXFxcXFxcXFwvXFxcIikrXFxcIi9cXFwiLGxzdD1tb2QuX2ZpbmRyZShlLGIpLDE+U2suZmZpLnJlbWFwVG9Kcyhsc3QpLmxlbmd0aCk/U2suYnVpbHRpbi5ub25lLm5vbmUkOihkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuTWF0Y2hPYmplY3QsW2xzdCxhLGJdKSxkKX0sX21hdGNoLmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcImZsYWdzXFxcIl0sX21hdGNoLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0sbW9kLm1hdGNoPW5ldyBTay5idWlsdGluLmZ1bmMoX21hdGNoKSxyZWdleG9iaj1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaDtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlPWIsYS5mbGFncz12b2lkIDA9PT1jPzA6YyxTay5idWlsdGluLm5vbmUubm9uZSR9KSxoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9XFxcInJlLmNvbXBpbGUoJ1xcXCIrU2suZmZpLnJlbWFwVG9KcyhhLnJlKStcXFwiJylcXFwiO3JldHVybiBTay5mZmkucmVtYXBUb1B5KGIuc3Vic3RyaW5nKDAsMjEyKSl9KSxiLl9fc3RyX189aCxiLl9fcmVwcl9fPWgsYz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9U2suZmZpLnJlbWFwVG9KcyhhKSxlPW51bGw9PWI/MDpTay5mZmkucmVtYXBUb0pzKGIpLGY9bnVsbD09Yz9kLmxlbmd0aDpTay5mZmkucmVtYXBUb0pzKGMpO3JldHVyblxcXCJeXFxcIj09ZSYmKGU9ZC5pbmRleE9mKFxcXCJcXFxcblxcXCIpKzEpLG51bGw9PT1mJiYoZj1kLmxlbmd0aCksU2suZmZpLnJlbWFwVG9QeShkLnN1YnN0cmluZyhlLGYpKX0sZD1mdW5jdGlvbihhLGIsZCxlKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZWFyY2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KTt2YXIgZj1jKGIsZCxlKTtyZXR1cm4gX3NlYXJjaChhLnJlLGYsYS5mbGFncyl9LGQuY29fdmFybmFtZXM9W1xcXCJzZWxmXFxcIixcXFwic3RyaW5nXFxcIixcXFwicG9zXFxcIixcXFwiZW5kcG9zXFxcIl0sZC4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCksU2suYnVpbHRpbi5ub25lLm5vbmUkXSxiLnNlYXJjaD1uZXcgU2suYnVpbHRpbi5mdW5jKGQpLGU9ZnVuY3Rpb24oYSxiLGQsZSl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibWF0Y2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KTt2YXIgZj1jKGIsZCxlKTtyZXR1cm4gX21hdGNoKGEucmUsZixhLmZsYWdzKX0sZS5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJwb3NcXFwiLFxcXCJlbmRwb3NcXFwiXSxlLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdLGIubWF0Y2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKSxmPWZ1bmN0aW9uKGEsYixjKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzcGxpdFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrSW50KGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWF4c3BsaXQgbXVzdCBiZSBhbiBpbnRlZ2VyXFxcIik7cmV0dXJuIF9zcGxpdChhLnJlLGIsYyxhLmZsYWdzKX0sZi5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJtYXhzcGxpdFxcXCJdLGYuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxiLnNwbGl0PW5ldyBTay5idWlsdGluLmZ1bmMoZiksZz1mdW5jdGlvbihhLGIsZCxlKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJmaW5kYWxsXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCk7dmFyIGY9YyhiLGQsZSk7cmV0dXJuIF9maW5kYWxsKGEucmUsZixhLmZsYWdzKX0sZy5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJwb3NcXFwiLFxcXCJlbmRwb3NcXFwiXSxnLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdLGIuZmluZGFsbD1uZXcgU2suYnVpbHRpbi5mdW5jKGcpfSxtb2QuUmVnZXhPYmplY3Q9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhtb2QscmVnZXhvYmosXFxcIlJlZ2V4T2JqZWN0XFxcIixbXSksbW9kLmNvbXBpbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImNvbXBpbGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWImJihiPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO3JldHVybiBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuUmVnZXhPYmplY3QsW2EsYl0pLGN9KSxtb2QucHVyZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe30pLG1vZH07XCIsXCJzcmMvbGliL3JlcHIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJlcHIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yZXF1ZXN0cy5weVwiOlwiIyBtb3N0IHJlc3RyaWN0ZWQgdmVyc2lvblxcblxcXCJcXFwiXFxcIlxcblRoaXMgc29sdXRpb24gd29ya3MgaW4gcnVuZXN0b25lIC0gaG93ZXZlciBpdCBpcyBtdWNoIG1vcmUgbGltaXRlZC5cXG5BbiBlcnJvciBkb2VzIG5vdCBvY2N1ciBpbiB0aGUgc2FtZSB3YXkgaW4gdGhlIHRleHRib29rIGFzIGl0IGRvZXNcXG5mb3IgdGhlIGNvbW1hbmQgbGluZS4gU2luY2UgSFRUUEVycm9yIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGluXFxuUnVuZXN0b25lLCBJIGhhZCB0byBjaGFuZ2UgdGhlIGV4Y2VwdGlvbi5cXG5EZWNvZGUgYW5kIEVuY29kZSBhcmUgbm90IGF2YWlsYWJsZSBpbiBSdW5lc3RvbmUsIHNvIHRoZXJlIG1pZ2h0IGJlXFxuaXNzdWVzIHdpdGggcmVwb25zZXMuXFxuRG9lcyBub3QgdXNlIHRoZSBzdGF0dXMgYXR0cmlidXRlIGZvciB1cmxvcGVuLCB3b3VsZCBiZSBuaWNlIHRvIGhhdmVcXG50aGF0IGJhY2suXFxuRG9lcyBub3Qgd29yayBvbiByZWd1bGFyIHdlYiBwYWdlcyAobGlrZSBnb29nbGUgb3IgdGhlIG1pY2hpZ2FuIGRhaWx5KSBiZWNhdXNlIG9mIGNyb3NzLXNpdGUgc2NyaXB0aW5nIGxpbWl0cy5cXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuXFxuaW1wb3J0IGpzb25cXG5cXG5jbGFzcyBSZXNwb25zZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEsIHVybCk6XFxuICAgICAgICBzZWxmLnRleHQgPSBkYXRhXFxuICAgICAgICBzZWxmLnVybCA9IHVybFxcblxcbiAgICBkZWYganNvbihzZWxmKTpcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhzZWxmLnRleHQpXFxuICAgICAgICBleGNlcHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHtcXFwiZXJyb3JcXFwiOiBcXFwiUmVzcG9uc2Ugbm90IGludGVycHJldGFibGUgYXMganNvbi4gVHJ5IHByaW50aW5nIHRoZSAudGV4dCBhdHRyaWJ1dGVcXFwifVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBcXFwiPEEgUmVzcG9uc2Ugb2JqZWN0IGZvciB0aGUgZm9sbG93aW5nIHJlcXVlc3Q6IHt9PlxcXCIuZm9ybWF0KHNlbGYudXJsKVxcblxcblxcbnVybF9zdWJzID0ge1xcXCIgXFxcIjogXFxcIitcXFwiLFxcbiAgICAgICAgICAgIFxcXCIhXFxcIjogXFxcIiUyMVxcXCIsXFxuICAgICAgICAgICAgJ1xcXCInOiBcXFwiJTIyXFxcIixcXG4gICAgICAgICAgICBcXFwiI1xcXCI6IFxcXCIlMjNcXFwiLFxcbiAgICAgICAgICAgIFxcXCIkXFxcIjogXFxcIiUyNFxcXCIsXFxuICAgICAgICAgICAgXFxcIidcXFwiOiBcXFwiJTI3XFxcIixcXG4gICAgICAgICAgICBcXFwiKFxcXCI6IFxcXCIlMjhcXFwiLFxcbiAgICAgICAgICAgIFxcXCIpXFxcIjogXFxcIiUyOVxcXCIsXFxuICAgICAgICAgICAgXFxcIipcXFwiOiBcXFwiJTJBXFxcIixcXG4gICAgICAgICAgICBcXFwiK1xcXCI6IFxcXCIlMkJcXFwiLFxcbiAgICAgICAgICAgIFxcXCIsXFxcIjogXFxcIiUyQ1xcXCIsXFxuICAgICAgICAgICAgXFxcIi9cXFwiOiBcXFwiJTJGXFxcIixcXG4gICAgICAgICAgICBcXFwiOlxcXCI6IFxcXCIlM0FcXFwiLFxcbiAgICAgICAgICAgIFxcXCI7XFxcIjogXFxcIiUzQlxcXCIsXFxuICAgICAgICAgICAgXFxcIj1cXFwiOiBcXFwiJTNEXFxcIixcXG4gICAgICAgICAgICBcXFwiP1xcXCI6IFxcXCIlM0ZcXFwiLFxcbiAgICAgICAgICAgIFxcXCJAXFxcIjogXFxcIiU0MFxcXCIsXFxuICAgICAgICAgICAgXFxcIltcXFwiOiBcXFwiJTVCXFxcIixcXG4gICAgICAgICAgICBcXFwiXVxcXCI6IFxcXCIlNURcXFwiLFxcbiAgICAgICAgICAgIH1cXG5cXG5kZWYgX3N1YnN0KHMsIHN1YnN0aXR1dGlvbnM9dXJsX3N1YnMpOlxcbiAgICByZXMgPSBcXFwiXFxcIlxcbiAgICBmb3IgYyBpbiBzdHIocyk6XFxuICAgICAgICBpZiBjIGluIHN1YnN0aXR1dGlvbnM6XFxuICAgICAgICAgICAgcmVzICs9IHN1YnN0aXR1dGlvbnNbY11cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmVzICs9IGNcXG4gICAgcmV0dXJuIHJlc1xcblxcblxcbmRlZiByZXF1ZXN0VVJMKGJhc2V1cmwsIHBhcmFtcz17fSk6XFxuICAgIHRyeTpcXG4gICAgICAgIGlmIGxlbihwYXJhbXMpID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIGJhc2V1cmxcXG4gICAgICAgIGNvbXBsZXRlX3VybCA9IGJhc2V1cmwgKyBcXFwiP1xcXCJcXG4gICAgICAgIHBhaXJzID0gW1xcXCJ7fT17fVxcXCIuZm9ybWF0KF9zdWJzdChrKSwgX3N1YnN0KHBhcmFtc1trXSkpIGZvciBrIGluIHBhcmFtc11cXG4gICAgICAgIGNvbXBsZXRlX3VybCArPSBcXFwiJlxcXCIuam9pbihwYWlycylcXG4gICAgICAgIHJldHVybiBjb21wbGV0ZV91cmxcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG5kZWYgZ2V0KGJhc2V1cmwsIHBhcmFtcz17fSk6XFxuICAgIGZ1bGxfdXJsID0gcmVxdWVzdFVSTChiYXNldXJsLCBwYXJhbXMpXFxuICAgIGlmIG5vdCBmdWxsX3VybDpcXG4gICAgICAgIHRleHRfZGF0YSA9IFxcXCI8aHRtbD48Ym9keT48aDE+aW52YWxpZCByZXF1ZXN0PC9oMT48L2JvZHk+PC9odG1sPlxcXCJcXG4gICAgICAgIGZ1bGxfdXJsID0gXFxcIkNvdWxkbuKAmXQgZ2VuZXJhdGUgYSB2YWxpZCBVUkxcXFwiXFxuICAgIGVsc2U6XFxuICAgICAgICBkYXRhID0gdXJsb3BlbihmdWxsX3VybClcXG4gICAgICAgIHRleHRfZGF0YSA9IGRhdGEucmVhZCgpLnN0cmlwKClcXG4gICAgICAgIGlmIGxlbih0ZXh0X2RhdGEpID09IDA6XFxuICAgICAgICAgICAgdGV4dF9kYXRhID0gXFxcIkZhaWxlZCB0byByZXRyaWV2ZSB0aGF0IFVSTFxcXCJcXG4gICAgcmV0dXJuIFJlc3BvbnNlKHRleHRfZGF0YSwgZnVsbF91cmwpXCIsXCJzcmMvbGliL3JlcXVlc3RzX3dpdGhfY2FjaGluZy5weVwiOlwiaW1wb3J0IHJlcXVlc3RzXFxuaW1wb3J0IGpzb25cXG5cXG5QRVJNQU5FTlRfQ0FDSEVfRk5BTUUgPSBcXFwicGVybWFuZW50X2NhY2hlLnR4dFxcXCJcXG5URU1QX0NBQ0hFX0ZOQU1FID0gXFxcInRoaXNfcGFnZV9jYWNoZS50eHRcXFwiXFxuXFxuZGVmIF93cml0ZV90b19maWxlKGNhY2hlLCBmbmFtZSk6XFxuICAgIHdpdGggb3BlbihmbmFtZSwgJ3cnKSBhcyBvdXRmaWxlOlxcbiAgICAgICAgb3V0ZmlsZS53cml0ZShqc29uLmR1bXBzKGNhY2hlLCBpbmRlbnQ9MikpXFxuXFxuZGVmIF9yZWFkX2Zyb21fZmlsZShmbmFtZSk6XFxuICAgIHRyeTpcXG4gICAgICAgIHdpdGggb3BlbihmbmFtZSwgJ3InKSBhcyBpbmZpbGU6XFxuICAgICAgICAgICAgcmVzID0gaW5maWxlLnJlYWQoKVxcbiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJlcylcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmV0dXJuIHt9XFxuXFxuZGVmIGFkZF90b19jYWNoZShjYWNoZV9maWxlLCBjYWNoZV9rZXksIGNhY2hlX3ZhbHVlKTpcXG4gICAgdGVtcF9jYWNoZSA9IF9yZWFkX2Zyb21fZmlsZShjYWNoZV9maWxlKVxcbiAgICB0ZW1wX2NhY2hlW2NhY2hlX2tleV0gPSBjYWNoZV92YWx1ZVxcbiAgICBfd3JpdGVfdG9fZmlsZSh0ZW1wX2NhY2hlLCBjYWNoZV9maWxlKVxcblxcbmRlZiBjbGVhcl9jYWNoZShjYWNoZV9maWxlPVRFTVBfQ0FDSEVfRk5BTUUpOlxcbiAgICBfd3JpdGVfdG9fZmlsZSh7fSwgY2FjaGVfZmlsZSlcXG5cXG5kZWYgbWFrZV9jYWNoZV9rZXkoYmFzZXVybCwgcGFyYW1zX2QsIHByaXZhdGVfa2V5cz1bXFxcImFwaV9rZXlcXFwiLCBcXFwiYXBpa2V5XFxcIl0pOlxcbiAgICBcXFwiXFxcIlxcXCJNYWtlcyBhIGxvbmcgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcXVlcnkuXFxuICAgIEFscGhhYmV0aXplIHRoZSBrZXlzIGZyb20gdGhlIHBhcmFtcyBkaWN0aW9uYXJ5IHNvIHdlIGdldCB0aGUgc2FtZSBvcmRlciBlYWNoIHRpbWUuXFxuICAgIE9taXQga2V5cyB3aXRoIHByaXZhdGUgaW5mby5cXFwiXFxcIlxcXCJcXG4gICAgYWxwaGFiZXRpemVkX2tleXMgPSBzb3J0ZWQocGFyYW1zX2Qua2V5cygpKVxcbiAgICByZXMgPSBbXVxcbiAgICBmb3IgayBpbiBhbHBoYWJldGl6ZWRfa2V5czpcXG4gICAgICAgIGlmIGsgbm90IGluIHByaXZhdGVfa2V5czpcXG4gICAgICAgICAgICByZXMuYXBwZW5kKFxcXCJ7fS17fVxcXCIuZm9ybWF0KGssIHBhcmFtc19kW2tdKSlcXG4gICAgcmV0dXJuIGJhc2V1cmwgKyBcXFwiX1xcXCIuam9pbihyZXMpXFxuXFxuZGVmIGdldChiYXNldXJsLCBwYXJhbXM9e30sIHByaXZhdGVfa2V5c190b19pZ25vcmU9W1xcXCJhcGlfa2V5XFxcIiwgXFxcImFwaWtleVxcXCJdLCBwZXJtYW5lbnRfY2FjaGVfZmlsZT1QRVJNQU5FTlRfQ0FDSEVfRk5BTUUsIHRlbXBfY2FjaGVfZmlsZT1URU1QX0NBQ0hFX0ZOQU1FKTpcXG4gICAgZnVsbF91cmwgPSByZXF1ZXN0cy5yZXF1ZXN0VVJMKGJhc2V1cmwsIHBhcmFtcylcXG4gICAgY2FjaGVfa2V5ID0gbWFrZV9jYWNoZV9rZXkoYmFzZXVybCwgcGFyYW1zLCBwcml2YXRlX2tleXNfdG9faWdub3JlKVxcbiAgICAjIExvYWQgdGhlIHBlcm1hbmVudCBhbmQgcGFnZS1zcGVjaWZpYyBjYWNoZXMgZnJvbSBmaWxlc1xcbiAgICBwZXJtYW5lbnRfY2FjaGUgPSBfcmVhZF9mcm9tX2ZpbGUocGVybWFuZW50X2NhY2hlX2ZpbGUpXFxuICAgIHRlbXBfY2FjaGUgPSBfcmVhZF9mcm9tX2ZpbGUodGVtcF9jYWNoZV9maWxlKVxcbiAgICBpZiBjYWNoZV9rZXkgaW4gdGVtcF9jYWNoZTpcXG4gICAgICAgIHByaW50KFxcXCJmb3VuZCBpbiBwYWdlLXNwZWNpZmljIGNhY2hlXFxcIilcXG4gICAgICAgICMgbWFrZSBhIFJlc3BvbnNlIG9iamVjdCBjb250YWluaW5nIHRleHQgZnJvbSB0aGUgY2hhbmdlLCBhbmQgdGhlIGZ1bGxfdXJsIHRoYXQgd291bGQgaGF2ZSBiZWVuIGZldGNoZWRcXG4gICAgICAgIHJldHVybiByZXF1ZXN0cy5SZXNwb25zZSh0ZW1wX2NhY2hlW2NhY2hlX2tleV0sIGZ1bGxfdXJsKVxcbiAgICBlbGlmIGNhY2hlX2tleSBpbiBwZXJtYW5lbnRfY2FjaGU6XFxuICAgICAgICBwcmludChcXFwiZm91bmQgaW4gcGVybWFuZW50X2NhY2hlXFxcIilcXG4gICAgICAgICMgbWFrZSBhIFJlc3BvbnNlIG9iamVjdCBjb250YWluaW5nIHRleHQgZnJvbSB0aGUgY2hhbmdlLCBhbmQgdGhlIGZ1bGxfdXJsIHRoYXQgd291bGQgaGF2ZSBiZWVuIGZldGNoZWRcXG4gICAgICAgIHJldHVybiByZXF1ZXN0cy5SZXNwb25zZShwZXJtYW5lbnRfY2FjaGVbY2FjaGVfa2V5XSwgZnVsbF91cmwpXFxuICAgIGVsc2U6XFxuICAgICAgICBwcmludChcXFwibmV3OyBhZGRpbmcgdG8gY2FjaGVcXFwiKVxcbiAgICAgICAgIyBhY3R1YWxseSByZXF1ZXN0IGl0XFxuICAgICAgICByZXNwID0gcmVxdWVzdHMuZ2V0KGJhc2V1cmwsIHBhcmFtcylcXG4gICAgICAgICMgc2F2ZSBpdFxcbiAgICAgICAgYWRkX3RvX2NhY2hlKHRlbXBfY2FjaGVfZmlsZSwgY2FjaGVfa2V5LCByZXNwLnRleHQpXFxuICAgICAgICByZXR1cm4gcmVzcFwiLFwic3JjL2xpYi9yZXhlYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicmV4ZWMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yZmM4MjIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJmYzgyMiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JsY29tcGxldGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJybGNvbXBsZXRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JvYm90cGFyc2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJyb2JvdHBhcnNlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3J1bnB5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJydW5weSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NjaGVkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzY2hlZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NldHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNldHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zZ21sbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzZ21sbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2hhLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaGEgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zaGVsdmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNoZWx2ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NobGV4LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaGxleCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NodXRpbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2h1dGlsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2lnbmFsLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17U0lHX0RGTDpuZXcgU2suYnVpbHRpbi5pbnRfKDApLFNJR19JR046bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxDVFJMX0NfRVZFTlQ6bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxDVFJMX0JSRUFLX0VWRU5UOm5ldyBTay5idWlsdGluLmludF8oMCksTlNJRzpuZXcgU2suYnVpbHRpbi5pbnRfKDIzKSxTSUdIVVA6bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxTSUdOSU5UOm5ldyBTay5idWlsdGluLmludF8oMiksU0lHSUxMOm5ldyBTay5idWlsdGluLmludF8oNCksU0lHRlBFOm5ldyBTay5idWlsdGluLmludF8oOCksU0lHS0lMTDpuZXcgU2suYnVpbHRpbi5pbnRfKDkpLFNJR1NFR1Y6bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksU0lHVEVSTTpuZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxTSUdCUkVBSzpuZXcgU2suYnVpbHRpbi5pbnRfKDIxKSxTSUdBQlJUOm5ldyBTay5idWlsdGluLmludF8oMjIpLHBhdXNlOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJwYXVzZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApO3ZhciBhPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO3JldHVybiBhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LGEuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTpuZXcgUHJvbWlzZShmdW5jdGlvbihhKXtpZihudWxsIT1Tay5zaWduYWxzJiZTay5zaWduYWxzLmFkZEV2ZW50TGlzdGVuZXIpe2Z1bmN0aW9uIGhhbmRsZVNpZ25hbCgpe1NrLnNpZ25hbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVTaWduYWwpLGEoKX1Tay5zaWduYWxzLmFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlU2lnbmFsKX1lbHNlIGNvbnNvbGUud2FybihcXFwic2lnbmFsLnBhdXNlKCkgbm90IHN1cHBvcnRlZFxcXCIpLFNrLm1pc2NldmFsLnByaW50XyhcXFwic2lnbmFsLnBhdXNlKCkgbm90IHN1cHBvcnRlZFxcXCIpLGEoKX0pfSxhfSksc2lnbmFsOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaWduYWwuc2lnbmFsIGlzIG5vdCBzdXBwb3J0ZWQuXFxcIil9KX07cmV0dXJuIGF9O1wiLFwic3JjL2xpYi9zaXRlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaXRlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc210cGQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNtdHBkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc210cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic210cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NuZGhkci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic25kaGRyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc29ja2V0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzb2NrZXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcWxpdGUzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcWxpdGUzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3JlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmVfY29tcGlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3JlX2NvbXBpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmVfY29uc3RhbnRzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmVfY29uc3RhbnRzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3JlX3BhcnNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmVfcGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zc2wucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNzbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0YXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0YXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdGF0aXN0aWNzLnB5XCI6XCJcXFwiXFxcIlxcXCJcXG5CYXNpYyBzdGF0aXN0aWNzIG1vZHVsZS5cXG5cXG5UaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIGNhbGN1bGF0aW5nIHN0YXRpc3RpY3Mgb2YgZGF0YSwgaW5jbHVkaW5nXFxuYXZlcmFnZXMsIHZhcmlhbmNlLCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uLlxcblxcbkNhbGN1bGF0aW5nIGF2ZXJhZ2VzXFxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbkZ1bmN0aW9uICAgICAgICAgICAgRGVzY3JpcHRpb25cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbm1lYW4gICAgICAgICAgICAgICAgQXJpdGhtZXRpYyBtZWFuIChhdmVyYWdlKSBvZiBkYXRhLlxcbmhhcm1vbmljX21lYW4gICAgICAgSGFybW9uaWMgbWVhbiBvZiBkYXRhLlxcbm1lZGlhbiAgICAgICAgICAgICAgTWVkaWFuIChtaWRkbGUgdmFsdWUpIG9mIGRhdGEuXFxubWVkaWFuX2xvdyAgICAgICAgICBMb3cgbWVkaWFuIG9mIGRhdGEuXFxubWVkaWFuX2hpZ2ggICAgICAgICBIaWdoIG1lZGlhbiBvZiBkYXRhLlxcbm1lZGlhbl9ncm91cGVkICAgICAgTWVkaWFuLCBvciA1MHRoIHBlcmNlbnRpbGUsIG9mIGdyb3VwZWQgZGF0YS5cXG5tb2RlICAgICAgICAgICAgICAgIE1vZGUgKG1vc3QgY29tbW9uIHZhbHVlKSBvZiBkYXRhLlxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuXFxuQ2FsY3VsYXRlIHRoZSBhcml0aG1ldGljIG1lYW4gKFxcXCJ0aGUgYXZlcmFnZVxcXCIpIG9mIGRhdGE6XFxuXFxuPj4+IG1lYW4oWy0xLjAsIDIuNSwgMy4yNSwgNS43NV0pXFxuMi42MjVcXG5cXG5cXG5DYWxjdWxhdGUgdGhlIHN0YW5kYXJkIG1lZGlhbiBvZiBkaXNjcmV0ZSBkYXRhOlxcblxcbj4+PiBtZWRpYW4oWzIsIDMsIDQsIDVdKVxcbjMuNVxcblxcblxcbkNhbGN1bGF0ZSB0aGUgbWVkaWFuLCBvciA1MHRoIHBlcmNlbnRpbGUsIG9mIGRhdGEgZ3JvdXBlZCBpbnRvIGNsYXNzIGludGVydmFsc1xcbmNlbnRyZWQgb24gdGhlIGRhdGEgdmFsdWVzIHByb3ZpZGVkLiBFLmcuIGlmIHlvdXIgZGF0YSBwb2ludHMgYXJlIHJvdW5kZWQgdG9cXG50aGUgbmVhcmVzdCB3aG9sZSBudW1iZXI6XFxuXFxuPj4+IG1lZGlhbl9ncm91cGVkKFsyLCAyLCAzLCAzLCAzLCA0XSkgICNkb2N0ZXN0OiArRUxMSVBTSVNcXG4yLjgzMzMzMzMzMzMuLi5cXG5cXG5UaGlzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBpbiB0aGlzIHdheTogeW91IGhhdmUgdHdvIGRhdGEgcG9pbnRzIGluIHRoZSBjbGFzc1xcbmludGVydmFsIDEuNS0yLjUsIHRocmVlIGRhdGEgcG9pbnRzIGluIHRoZSBjbGFzcyBpbnRlcnZhbCAyLjUtMy41LCBhbmQgb25lIGluXFxudGhlIGNsYXNzIGludGVydmFsIDMuNS00LjUuIFRoZSBtZWRpYW4gb2YgdGhlc2UgZGF0YSBwb2ludHMgaXMgMi44MzMzLi4uXFxuXFxuXFxuQ2FsY3VsYXRpbmcgdmFyaWFiaWxpdHkgb3Igc3ByZWFkXFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5GdW5jdGlvbiAgICAgICAgICAgIERlc2NyaXB0aW9uXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5wdmFyaWFuY2UgICAgICAgICAgIFBvcHVsYXRpb24gdmFyaWFuY2Ugb2YgZGF0YS5cXG52YXJpYW5jZSAgICAgICAgICAgIFNhbXBsZSB2YXJpYW5jZSBvZiBkYXRhLlxcbnBzdGRldiAgICAgICAgICAgICAgUG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZGF0YS5cXG5zdGRldiAgICAgICAgICAgICAgIFNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZGF0YS5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcblxcbkNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHNhbXBsZSBkYXRhOlxcblxcbj4+PiBzdGRldihbMi41LCAzLjI1LCA1LjUsIDExLjI1LCAxMS43NV0pICAjZG9jdGVzdDogK0VMTElQU0lTXFxuNC4zODk2MTg0MzQ0NC4uLlxcblxcbklmIHlvdSBoYXZlIHByZXZpb3VzbHkgY2FsY3VsYXRlZCB0aGUgbWVhbiwgeW91IGNhbiBwYXNzIGl0IGFzIHRoZSBvcHRpb25hbFxcbnNlY29uZCBhcmd1bWVudCB0byB0aGUgZm91ciBcXFwic3ByZWFkXFxcIiBmdW5jdGlvbnMgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdDpcXG5cXG4+Pj4gZGF0YSA9IFsxLCAyLCAyLCA0LCA0LCA0LCA1LCA2XVxcbj4+PiBtdSA9IG1lYW4oZGF0YSlcXG4+Pj4gcHZhcmlhbmNlKGRhdGEsIG11KVxcbjIuNVxcblxcblxcbkV4Y2VwdGlvbnNcXG4tLS0tLS0tLS0tXFxuXFxuQSBzaW5nbGUgZXhjZXB0aW9uIGlzIGRlZmluZWQ6IFN0YXRpc3RpY3NFcnJvciBpcyBhIHN1YmNsYXNzIG9mIFZhbHVlRXJyb3IuXFxuXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFsgJ1N0YXRpc3RpY3NFcnJvcicsXFxuICAgICAgICAgICAgJ3BzdGRldicsICdwdmFyaWFuY2UnLCAnc3RkZXYnLCAndmFyaWFuY2UnLFxcbiAgICAgICAgICAgICdtZWRpYW4nLCAgJ21lZGlhbl9sb3cnLCAnbWVkaWFuX2hpZ2gnLCAnbWVkaWFuX2dyb3VwZWQnLFxcbiAgICAgICAgICAgICdtZWFuJywgJ21vZGUnLCAnaGFybW9uaWNfbWVhbicsXFxuICAgICAgICAgIF1cXG5cXG5mcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDb3VudGVyXFxuZnJvbSBtYXRoIGltcG9ydCBzcXJ0XFxuXFxuZGVmIG1lYW4oZGF0YSk6XFxuICAgIHJldHVybiBzdW0oZGF0YSkgLyBsZW4oZGF0YSlcXG5cXG5kZWYgaGFybW9uaWNfbWVhbihkYXRhKTpcXG4gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvclxcblxcblxcbmRlZiBtZWRpYW4oZGF0YSk6XFxuICAgIF9kYXRhID0gc29ydGVkKGRhdGEpXFxuICAgIGwgPSBsZW4oX2RhdGEpXFxuICAgIGlmIGwgJSAyID09IDA6XFxuICAgICAgICBfbWVkaWFuID0gKF9kYXRhW2wvLzJdICsgX2RhdGFbbC8vMi0xXSkgLyAyXFxuICAgIGVsc2U6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgcmV0dXJuIF9tZWRpYW5cXG5cXG5kZWYgbWVkaWFuX2xvdyhkYXRhKTpcXG4gICAgX2RhdGEgPSBzb3J0ZWQoZGF0YSlcXG4gICAgbCA9IGxlbihfZGF0YSlcXG4gICAgaWYgbCAlIDIgPT0gMDpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yLTFdXFxuICAgIGVsc2U6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgcmV0dXJuIF9tZWRpYW5cXG5cXG5cXG5kZWYgbWVkaWFuX2hpZ2goZGF0YSk6XFxuICAgIF9kYXRhID0gc29ydGVkKGRhdGEpXFxuICAgIGwgPSBsZW4oX2RhdGEpXFxuICAgIGlmIGwgJSAyID09IDA6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgZWxzZTpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yXVxcbiAgICByZXR1cm4gX21lZGlhblxcblxcblxcbmRlZiBtZWRpYW5fZ3JvdXBlZChkYXRhKTpcXG4gICAgcmV0dXJuIG1lZGlhbihkYXRhKVxcblxcbmRlZiBtb2RlKGRhdGEpOlxcbiAgICBjb3VudGVyID0gQ291bnRlcihkYXRhKVxcbiAgICBtYXhfY291bnQgPSBtYXgoY291bnRlci52YWx1ZXMoKSlcXG4gICAgX21vZGUgPSBbayBmb3Igayx2IGluIGNvdW50ZXIuaXRlbXMoKSBpZiB2ID09IG1heF9jb3VudF1cXG4gICAgaWYgbGVuKF9tb2RlKSA+IDE6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJObyBVbmlxdWUgTW9kZSwgZm91bmQge30gZXF1YWxseSBjb21tb24gdmFsdWVzXFxcIi5mb3JtYXQobGVuKF9tb2RlKSkpXFxuICAgIGVsc2U6XFxuICAgICAgICByZXR1cm4gX21vZGVbMF1cXG5cXG5cXG5kZWYgdmFyaWFuY2UoZGF0YSk6XFxuICAgIGF2ZXJhZ2U9bWVhbihkYXRhKVxcbiAgICBfdmFyaWFuY2U9MFxcbiAgICBmb3IgZCBpbiBkYXRhOlxcbiAgICAgICAgX3ZhcmlhbmNlICs9ICgoYXZlcmFnZS1kKSoqMilcXG4gICAgICAgIGZpbmFsX3ZhcmlhbmNlPV92YXJpYW5jZS9sZW4oZGF0YSlcXG4gICAgcmV0dXJuIGZpbmFsX3ZhcmlhbmNlXFxuXFxuZGVmIHB2YXJpYW5jZShkYXRhKTpcXG4gICAgYXZlcmFnZT1tZWFuKGRhdGEpXFxuICAgIF92YXJpYW5jZT0wXFxuICAgIGZvciBkIGluIGRhdGE6XFxuICAgICAgICBfdmFyaWFuY2UgKz0gKChhdmVyYWdlLWQpKioyKVxcbiAgICAgICAgZmluYWxfdmFyaWFuY2U9X3ZhcmlhbmNlL2xlbihkYXRhKVxcbiAgICByZXR1cm4gZmluYWxfdmFyaWFuY2VcXG5cXG5kZWYgdmFyaWFuY2UoZGF0YSk6XFxuICAgIGF2ZXJhZ2U9bWVhbihkYXRhKVxcbiAgICBfdmFyaWFuY2U9MFxcbiAgICBmb3IgZCBpbiBkYXRhOlxcbiAgICAgICAgX3ZhcmlhbmNlICs9ICgoYXZlcmFnZS1kKSoqMilcXG4gICAgICAgIGZpbmFsX3ZhcmlhbmNlPV92YXJpYW5jZS8obGVuKGRhdGEpIC0xKVxcbiAgICByZXR1cm4gZmluYWxfdmFyaWFuY2VcXG5cXG5kZWYgcHN0ZGV2KGRhdGEpOlxcbiAgICByZXR1cm4gc3FydChwdmFyaWFuY2UoZGF0YSkpXFxuXFxuZGVmIHN0ZGV2KGRhdGEpOlxcbiAgICByZXR1cm4gc3FydCh2YXJpYW5jZShkYXRhKSlcXG5cXG5cIixcInNyYy9saWIvc3RhdHZmcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RhdHZmcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0cmluZy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e307cmV0dXJuIGEuYXNjaWlfbG93ZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcXFwiKSxhLmFzY2lpX3VwcGVyY2FzZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXFxcIiksYS5hc2NpaV9sZXR0ZXJzPW5ldyBTay5idWlsdGluLnN0cihhLmFzY2lpX2xvd2VyY2FzZS52K2EuYXNjaWlfdXBwZXJjYXNlLnYpLGEubG93ZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcXFwiKSxhLnVwcGVyY2FzZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXFxcIiksYS5sZXR0ZXJzPW5ldyBTay5idWlsdGluLnN0cihhLmxvd2VyY2FzZS52K2EudXBwZXJjYXNlLnYpLGEuZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1Njc4OVxcXCIpLGEuaGV4ZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRlxcXCIpLGEub2N0ZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1NjdcXFwiKSxhLnB1bmN0dWF0aW9uPW5ldyBTay5idWlsdGluLnN0cihcXFwiIVxcXFxcXFwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxcXFxcXFxdXl9ge3x9flxcXCIpLGEud2hpdGVzcGFjZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXFx0XFxcXG5cXFxceDBCXFxcXGZcXFxcciBcXFwiKSxhLnByaW50YWJsZT1uZXcgU2suYnVpbHRpbi5zdHIoYS5kaWdpdHMudithLmxldHRlcnMudithLnB1bmN0dWF0aW9uLnYrXFxcIiBcXFxcdFxcXFxuXFxcXHJcXFxceDBCXFxcXGZcXFwiKSxhLnNwbGl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oLi4uYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLnN0ci5wcm90b3R5cGUuc3BsaXQsYSl9KSxhLmNhcGl0YWxpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5jYXBpdGFsaXplLFthXSl9KSxhLmpvaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiB2b2lkIDA9PT1iJiYoYj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiBcXFwiKSksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5qb2luLFtiLGFdKX0pLGEuY2Fwd29yZHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImNhcHdvcmRzXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMiksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiBcXFwiKSksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzZXAgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2Zvcih2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5zcGxpdCxbYixjXSkudixlPVtdLGY9MDtmPGQubGVuZ3RoO2YrKyl7dmFyIGc9ZFtmXSxoPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmNhcGl0YWxpemUsW2ddKTtlLnB1c2goaCl9cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmpvaW4sW25ldyBTay5idWlsdGluLmxpc3QoZSksY10pfSksYX07XCIsXCJzcmMvbGliL3N0cmluZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RyaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RyaW5nb2xkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJpbmdvbGQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdHJpbmdwcmVwLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJpbmdwcmVwIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RydWN0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJ1Y3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdWJwcm9jZXNzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdWJwcm9jZXNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3VuYXUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN1bmF1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3VuYXVkaW8ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN1bmF1ZGlvIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3ltYm9sLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzeW1ib2wgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zeW10YWJsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3ltdGFibGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90YWJuYW5ueS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGFibmFubnkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90YXJmaWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0YXJmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGVsbmV0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZWxuZXRsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZW1wZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVtcGZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZXN0L19faW5pdF9fLnB5XCI6XCJfX2F1dGhvcl9fID0gJ2JtaWxsZXInXFxuXFxuZGVmIHRlc3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBwbGFjZXM9NSk6XFxuICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsaW50KTpcXG4gICAgICAgIGlmIGFjdHVhbCA9PSBleHBlY3RlZDpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgZWxpZiBpc2luc3RhbmNlKGV4cGVjdGVkLGZsb2F0KTpcXG4gICAgICAgIGlmIGFicyhhY3R1YWwtZXhwZWN0ZWQpIDwgMTAqKigtcGxhY2VzKTpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgZWxzZTpcXG4gICAgICAgIGlmIGFjdHVhbCA9PSBleHBlY3RlZDpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgcHJpbnQoJ1Rlc3QgRmFpbGVkOiBleHBlY3RlZCAnICsgc3RyKGV4cGVjdGVkKSArICcgYnV0IGdvdCAnICsgc3RyKGFjdHVhbCkpXFxuICAgIHJldHVybiBGYWxzZVxcblxcbmRlZiB0ZXN0Tm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCk6XFxuICAgIHBhc3NcXG5cXG5cIixcInNyYy9saWIvdGVzdC9iYWRfZ2V0YXR0ci5weVwiOlwieCA9IDFcXG5cXG5fX2dldGF0dHJfXyA9IFxcXCJTdXJwcmlzZSFcXFwiXFxuX19kaXJfXyA9IFxcXCJTdXJwcmlzZSBhZ2FpbiFcXFwiXFxuXCIsXCJzcmMvbGliL3Rlc3QvYmFkX2dldGF0dHIyLnB5XCI6XCJkZWYgX19nZXRhdHRyX18oKTpcXG4gICAgXFxcIkJhZCBvbmVcXFwiXFxuXFxueCA9IDFcXG5cXG5kZWYgX19kaXJfXyhiYWRfc2lnKTpcXG4gICAgcmV0dXJuIFtdXFxuXCIsXCJzcmMvbGliL3Rlc3QvYmFkX2dldGF0dHIzLnB5XCI6XCJkZWYgX19nZXRhdHRyX18obmFtZSk6XFxuICAgIGdsb2JhbCBfX2dldGF0dHJfX1xcbiAgICBpZiBuYW1lICE9ICdkZWxnZXRhdHRyJzpcXG4gICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yXFxuICAgIGRlbCBfX2dldGF0dHJfX1xcbiAgICByYWlzZSBBdHRyaWJ1dGVFcnJvclxcblwiLFwic3JjL2xpYi90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGVjaW1hbHRlc3RkYXRhIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGVzdC9nb29kX2dldGF0dHIucHlcIjpcInggPSAxXFxuXFxuZGVmIF9fZGlyX18oKTpcXG4gICAgcmV0dXJuIFsnYScsICdiJywgJ2MnXVxcblxcbmRlZiBfX2dldGF0dHJfXyhuYW1lKTpcXG4gICAgaWYgbmFtZSA9PSBcXFwieW9sb1xcXCI6XFxuICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihcXFwiRGVwcmVjYXRlZCwgdXNlIHdoYXRldmVyIGluc3RlYWRcXFwiKVxcbiAgICByZXR1cm4gZlxcXCJUaGVyZSBpcyB7bmFtZX1cXFwiXFxuXFxueSA9IDJcXG5cIixcInNyYy9saWIvdGVzdC90ZXN0X3N1cHBvcnQucHlcIjpcIlxcXCJcXFwiXFxcIlN1cHBvcnRpbmcgZGVmaW5pdGlvbnMgZm9yIHRoZSBQeXRob24gcmVncmVzc2lvbiB0ZXN0cy5cXFwiXFxcIlxcXCJcXG5cXG5pZiBfX25hbWVfXyAhPSAndGVzdC50ZXN0X3N1cHBvcnQnOlxcbiAgICByYWlzZSBJbXBvcnRFcnJvcigndGVzdF9zdXBwb3J0IG11c3QgYmUgaW1wb3J0ZWQgZnJvbSB0aGUgdGVzdCBwYWNrYWdlJylcXG5cXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG5cXG4jIGRlZiBydW5fdW5pdHRlc3QoKmNsYXNzZXMpOlxcbiMgICAgIFxcXCJcXFwiXFxcIlJ1biB0ZXN0cyBmcm9tIHVuaXR0ZXN0LlRlc3RDYXNlLWRlcml2ZWQgY2xhc3Nlcy5cXFwiXFxcIlxcXCJcXG4jICAgICB2YWxpZF90eXBlcyA9ICh1bml0dGVzdC5UZXN0U3VpdGUsIHVuaXR0ZXN0LlRlc3RDYXNlKVxcbiMgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKClcXG4jICAgICBmb3IgY2xzIGluIGNsYXNzZXM6XFxuIyAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2xzLCBzdHIpOlxcbiMgICAgICAgICAgICAgaWYgY2xzIGluIHN5cy5tb2R1bGVzOlxcbiMgICAgICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QuZmluZFRlc3RDYXNlcyhzeXMubW9kdWxlc1tjbHNdKSlcXG4jICAgICAgICAgICAgIGVsc2U6XFxuIyAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwic3RyIGFyZ3VtZW50cyBtdXN0IGJlIGtleXMgaW4gc3lzLm1vZHVsZXNcXFwiKVxcbiMgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoY2xzLCB2YWxpZF90eXBlcyk6XFxuIyAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KGNscylcXG4jICAgICAgICAgZWxzZTpcXG4jICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKGNscykpXFxuIyAgICAgX3J1bl9zdWl0ZShzdWl0ZSlcXG5cXG5kZWYgcnVuX3VuaXR0ZXN0KCpjbGFzc2VzKTpcXG4gICAgXFxcIlxcXCJcXFwiUnVuIHRlc3RzIGZyb20gdW5pdHRlc3QuVGVzdENhc2UtZGVyaXZlZCBjbGFzc2VzLlxcXCJcXFwiXFxcIlxcbiAgICBmb3IgY2xzIGluIGNsYXNzZXM6XFxuICAgICAgICBwcmludCBjbHNcXG4gICAgICAgIGlmIGlzc3ViY2xhc3MoY2xzLCB1bml0dGVzdC5UZXN0Q2FzZSk6XFxuICAgICAgICAgICAgY2xzKCkubWFpbigpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHByaW50IFxcXCJEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBcXFwiLCBjbHNcXG5cIixcInNyYy9saWIvdGV4dHdyYXAucHlcIjpcIlxcXCJcXFwiXFxcIlRleHQgd3JhcHBpbmcgYW5kIGZpbGxpbmcuXFxuXFxcIlxcXCJcXFwiXFxuXFxuIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBHcmVnb3J5IFAuIFdhcmQuXFxuIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uXFxuIyBXcml0dGVuIGJ5IEdyZWcgV2FyZCA8Z3dhcmRAcHl0aG9uLm5ldD5cXG5cXG5pbXBvcnQgcmUsIHN0cmluZ1xcblxcbl9fYWxsX18gPSBbJ1RleHRXcmFwcGVyJywgJ3dyYXAnLCAnZmlsbCcsICdkZWRlbnQnLCAnaW5kZW50JywgJ3Nob3J0ZW4nXVxcblxcbiMgSGFyZGNvZGUgdGhlIHJlY29nbml6ZWQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHRoZSBVUy1BU0NJSVxcbiMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLiAgVGhlIG1haW4gcmVhc29uIGZvciBkb2luZyB0aGlzIGlzIHRoYXRcXG4jIHNvbWUgVW5pY29kZSBzcGFjZXMgKGxpa2UgXFxcXHUwMGEwKSBhcmUgbm9uLWJyZWFraW5nIHdoaXRlc3BhY2VzLlxcbl93aGl0ZXNwYWNlID0gJ1xcXFx0XFxcXG5cXFxceDBiXFxcXHgwY1xcXFxyICdcXG5cXG5jbGFzcyBUZXh0V3JhcHBlcjpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIE9iamVjdCBmb3Igd3JhcHBpbmcvZmlsbGluZyB0ZXh0LiAgVGhlIHB1YmxpYyBpbnRlcmZhY2UgY29uc2lzdHMgb2ZcXG4gICAgdGhlIHdyYXAoKSBhbmQgZmlsbCgpIG1ldGhvZHM7IHRoZSBvdGhlciBtZXRob2RzIGFyZSBqdXN0IHRoZXJlIGZvclxcbiAgICBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIGluIG9yZGVyIHRvIHR3ZWFrIHRoZSBkZWZhdWx0IGJlaGF2aW91ci5cXG4gICAgSWYgeW91IHdhbnQgdG8gY29tcGxldGVseSByZXBsYWNlIHRoZSBtYWluIHdyYXBwaW5nIGFsZ29yaXRobSxcXG4gICAgeW91J2xsIHByb2JhYmx5IGhhdmUgdG8gb3ZlcnJpZGUgX3dyYXBfY2h1bmtzKCkuXFxuICAgIFNldmVyYWwgaW5zdGFuY2UgYXR0cmlidXRlcyBjb250cm9sIHZhcmlvdXMgYXNwZWN0cyBvZiB3cmFwcGluZzpcXG4gICAgICB3aWR0aCAoZGVmYXVsdDogNzApXFxuICAgICAgICB0aGUgbWF4aW11bSB3aWR0aCBvZiB3cmFwcGVkIGxpbmVzICh1bmxlc3MgYnJlYWtfbG9uZ193b3Jkc1xcbiAgICAgICAgaXMgZmFsc2UpXFxuICAgICAgaW5pdGlhbF9pbmRlbnQgKGRlZmF1bHQ6IFxcXCJcXFwiKVxcbiAgICAgICAgc3RyaW5nIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIGZpcnN0IGxpbmUgb2Ygd3JhcHBlZFxcbiAgICAgICAgb3V0cHV0LiAgQ291bnRzIHRvd2FyZHMgdGhlIGxpbmUncyB3aWR0aC5cXG4gICAgICBzdWJzZXF1ZW50X2luZGVudCAoZGVmYXVsdDogXFxcIlxcXCIpXFxuICAgICAgICBzdHJpbmcgdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byBhbGwgbGluZXMgc2F2ZSB0aGUgZmlyc3RcXG4gICAgICAgIG9mIHdyYXBwZWQgb3V0cHV0OyBhbHNvIGNvdW50cyB0b3dhcmRzIGVhY2ggbGluZSdzIHdpZHRoLlxcbiAgICAgIGV4cGFuZF90YWJzIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgRXhwYW5kIHRhYnMgaW4gaW5wdXQgdGV4dCB0byBzcGFjZXMgYmVmb3JlIGZ1cnRoZXIgcHJvY2Vzc2luZy5cXG4gICAgICAgIEVhY2ggdGFiIHdpbGwgYmVjb21lIDAgLi4gJ3RhYnNpemUnIHNwYWNlcywgZGVwZW5kaW5nIG9uIGl0cyBwb3NpdGlvblxcbiAgICAgICAgaW4gaXRzIGxpbmUuICBJZiBmYWxzZSwgZWFjaCB0YWIgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIuXFxuICAgICAgdGFic2l6ZSAoZGVmYXVsdDogOClcXG4gICAgICAgIEV4cGFuZCB0YWJzIGluIGlucHV0IHRleHQgdG8gMCAuLiAndGFic2l6ZScgc3BhY2VzLCB1bmxlc3NcXG4gICAgICAgICdleHBhbmRfdGFicycgaXMgZmFsc2UuXFxuICAgICAgcmVwbGFjZV93aGl0ZXNwYWNlIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgUmVwbGFjZSBhbGwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dCB0ZXh0IGJ5IHNwYWNlc1xcbiAgICAgICAgYWZ0ZXIgdGFiIGV4cGFuc2lvbi4gIE5vdGUgdGhhdCBpZiBleHBhbmRfdGFicyBpcyBmYWxzZSBhbmRcXG4gICAgICAgIHJlcGxhY2Vfd2hpdGVzcGFjZSBpcyB0cnVlLCBldmVyeSB0YWIgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYVxcbiAgICAgICAgc2luZ2xlIHNwYWNlIVxcbiAgICAgIGZpeF9zZW50ZW5jZV9lbmRpbmdzIChkZWZhdWx0OiBmYWxzZSlcXG4gICAgICAgIEVuc3VyZSB0aGF0IHNlbnRlbmNlLWVuZGluZyBwdW5jdHVhdGlvbiBpcyBhbHdheXMgZm9sbG93ZWRcXG4gICAgICAgIGJ5IHR3byBzcGFjZXMuICBPZmYgYnkgZGVmYXVsdCBiZWNhdXNlIHRoZSBhbGdvcml0aG0gaXNcXG4gICAgICAgICh1bmF2b2lkYWJseSkgaW1wZXJmZWN0LlxcbiAgICAgIGJyZWFrX2xvbmdfd29yZHMgKGRlZmF1bHQ6IHRydWUpXFxuICAgICAgICBCcmVhayB3b3JkcyBsb25nZXIgdGhhbiAnd2lkdGgnLiAgSWYgZmFsc2UsIHRob3NlIHdvcmRzIHdpbGwgbm90XFxuICAgICAgICBiZSBicm9rZW4sIGFuZCBzb21lIGxpbmVzIG1pZ2h0IGJlIGxvbmdlciB0aGFuICd3aWR0aCcuXFxuICAgICAgYnJlYWtfb25faHlwaGVucyAoZGVmYXVsdDogdHJ1ZSlcXG4gICAgICAgIEFsbG93IGJyZWFraW5nIGh5cGhlbmF0ZWQgd29yZHMuIElmIHRydWUsIHdyYXBwaW5nIHdpbGwgb2NjdXJcXG4gICAgICAgIHByZWZlcmFibHkgb24gd2hpdGVzcGFjZXMgYW5kIHJpZ2h0IGFmdGVyIGh5cGhlbnMgcGFydCBvZlxcbiAgICAgICAgY29tcG91bmQgd29yZHMuXFxuICAgICAgZHJvcF93aGl0ZXNwYWNlIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgRHJvcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gbGluZXMuXFxuICAgICAgbWF4X2xpbmVzIChkZWZhdWx0OiBOb25lKVxcbiAgICAgICAgVHJ1bmNhdGUgd3JhcHBlZCBsaW5lcy5cXG4gICAgICBwbGFjZWhvbGRlciAoZGVmYXVsdDogJyBbLi4uXScpXFxuICAgICAgICBBcHBlbmQgdG8gdGhlIGxhc3QgbGluZSBvZiB0cnVuY2F0ZWQgdGV4dC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIHVuaWNvZGVfd2hpdGVzcGFjZV90cmFucyA9IHt9XFxuICAgICMgdXNwYWNlID0gb3JkKCcgJylcXG4gICAgdXNwYWNlID0gJyAnXFxuICAgIGZvciB4IGluIF93aGl0ZXNwYWNlOlxcbiAgICAgICAgIyB1bmljb2RlX3doaXRlc3BhY2VfdHJhbnNbb3JkKHgpXSA9IHVzcGFjZVxcbiAgICAgICAgdW5pY29kZV93aGl0ZXNwYWNlX3RyYW5zW3hdID0gdXNwYWNlXFxuXFxuICAgICMgVGhpcyBmdW5reSBsaXR0bGUgcmVnZXggaXMganVzdCB0aGUgdHJpY2sgZm9yIHNwbGl0dGluZ1xcbiAgICAjIHRleHQgdXAgaW50byB3b3JkLXdyYXBwYWJsZSBjaHVua3MuICBFLmcuXFxuICAgICMgICBcXFwiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hXFxcIlxcbiAgICAjIHNwbGl0cyBpbnRvXFxuICAgICMgICBIZWxsby8gL3RoZXJlLyAvLS0vIC95b3UvIC9nb29mLS9iYWxsLC8gL3VzZS8gL3RoZS8gLy1iLyAvb3B0aW9uIVxcbiAgICAjIChhZnRlciBzdHJpcHBpbmcgb3V0IGVtcHR5IHN0cmluZ3MpLlxcbiAgICB3b3Jkc2VwX3JlID0gcmUuY29tcGlsZShcXG4gICAgICAgIHInKFxcXFxzK3wnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IHdoaXRlc3BhY2VcXG4gICAgICAgIHInW15cXFxcc1xcXFx3XSpcXFxcdytbXjAtOVxcXFxXXS0oPz1cXFxcdytbXjAtOVxcXFxXXSkpJykgICMgaHlwaGVuYXRlZCB3b3Jkc1xcbiAgICBlbV9kYXNoID0gcmUuY29tcGlsZShyJyhcXFxccyt8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFueSB3aGl0ZXNwYWNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHInW15cXFxcc1xcXFx3XSpcXFxcdytbXjAtOVxcXFxXXS0oPz1cXFxcdytbXjAtOVxcXFxXXSl8JyAgICMgaHlwaGVuYXRlZCB3b3Jkc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICByJyg/IV4pLXsyLH0oPz1cXFxcdykpJykgICAgICAgICAgICAgICAgICAgICAjIGVtLWRhc2hcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgICMgVGhpcyBsZXNzIGZ1bmt5IGxpdHRsZSByZWdleCBqdXN0IHNwbGl0IG9uIHJlY29nbml6ZWQgc3BhY2VzLiBFLmcuXFxuICAgICMgICBcXFwiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hXFxcIlxcbiAgICAjIHNwbGl0cyBpbnRvXFxuICAgICMgICBIZWxsby8gL3RoZXJlLyAvLS0vIC95b3UvIC9nb29mLWJhbGwsLyAvdXNlLyAvdGhlLyAvLWIvIC9vcHRpb24hL1xcbiAgICB3b3Jkc2VwX3NpbXBsZV9yZSA9IHJlLmNvbXBpbGUocicoXFxcXHMrKScpXFxuXFxuXFxuICAgICMgWFhYIHRoaXMgaXMgbm90IGxvY2FsZS0gb3IgY2hhcnNldC1hd2FyZSAtLSBzdHJpbmcubG93ZXJjYXNlXFxuICAgICMgaXMgVVMtQVNDSUkgb25seSAoYW5kIHRoZXJlZm9yZSBFbmdsaXNoLW9ubHkpXFxuICAgIHNlbnRlbmNlX2VuZF9yZSA9IHJlLmNvbXBpbGUocidbYS16XScgICAgICAgICAgICAgIyBsb3dlcmNhc2UgbGV0dGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidbXFxcXC5cXFxcIVxcXFw/XScgICAgICAgICAgIyBzZW50ZW5jZS1lbmRpbmcgcHVuY3QuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidbXFxcXFxcXCJcXFxcJ10/JyAgICAgICAgICAgIyBvcHRpb25hbCBlbmQtb2YtcXVvdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1xcXFxaJykgICAgICAgICAgICAgICAjIGVuZCBvZiBjaHVua1xcbiAgICBzZW50ZW5jZV9lbmRfcmUgPSByJ1thLXpdW1xcXFwuXFxcXCFcXFxcP11bXFxcXFxcXCJcXFxcJ10/J1xcblxcbiAgICBkZWYgX19pbml0X18oc2VsZixcXG4gICAgICAgICAgICAgICAgIHdpZHRoPTcwLFxcbiAgICAgICAgICAgICAgICAgaW5pdGlhbF9pbmRlbnQ9XFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50X2luZGVudD1cXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgIGV4cGFuZF90YWJzPVRydWUsXFxuICAgICAgICAgICAgICAgICByZXBsYWNlX3doaXRlc3BhY2U9VHJ1ZSxcXG4gICAgICAgICAgICAgICAgIGZpeF9zZW50ZW5jZV9lbmRpbmdzPUZhbHNlLFxcbiAgICAgICAgICAgICAgICAgYnJlYWtfbG9uZ193b3Jkcz1UcnVlLFxcbiAgICAgICAgICAgICAgICAgZHJvcF93aGl0ZXNwYWNlPVRydWUsXFxuICAgICAgICAgICAgICAgICBicmVha19vbl9oeXBoZW5zPVRydWUsXFxuICAgICAgICAgICAgICAgICB0YWJzaXplPTgsXFxuICAgICAgICAgICAgICAgICBtYXhfbGluZXM9Tm9uZSxcXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPScgWy4uLl0nKTpcXG4gICAgICAgIHNlbGYud2lkdGggPSB3aWR0aFxcbiAgICAgICAgc2VsZi5pbml0aWFsX2luZGVudCA9IGluaXRpYWxfaW5kZW50XFxuICAgICAgICBzZWxmLnN1YnNlcXVlbnRfaW5kZW50ID0gc3Vic2VxdWVudF9pbmRlbnRcXG4gICAgICAgIHNlbGYuZXhwYW5kX3RhYnMgPSBleHBhbmRfdGFic1xcbiAgICAgICAgc2VsZi5yZXBsYWNlX3doaXRlc3BhY2UgPSByZXBsYWNlX3doaXRlc3BhY2VcXG4gICAgICAgIHNlbGYuZml4X3NlbnRlbmNlX2VuZGluZ3MgPSBmaXhfc2VudGVuY2VfZW5kaW5nc1xcbiAgICAgICAgc2VsZi5icmVha19sb25nX3dvcmRzID0gYnJlYWtfbG9uZ193b3Jkc1xcbiAgICAgICAgc2VsZi5kcm9wX3doaXRlc3BhY2UgPSBkcm9wX3doaXRlc3BhY2VcXG4gICAgICAgIHNlbGYuYnJlYWtfb25faHlwaGVucyA9IGJyZWFrX29uX2h5cGhlbnNcXG4gICAgICAgIHNlbGYudGFic2l6ZSA9IHRhYnNpemVcXG4gICAgICAgIHNlbGYubWF4X2xpbmVzID0gbWF4X2xpbmVzXFxuICAgICAgICBzZWxmLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXJcXG5cXG5cXG4gICAgIyAtLSBQcml2YXRlIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gICAgIyAocG9zc2libHkgdXNlZnVsIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlKVxcblxcbiAgICBkZWYgX211bmdlX3doaXRlc3BhY2Uoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfbXVuZ2Vfd2hpdGVzcGFjZSh0ZXh0IDogc3RyaW5nKSAtPiBzdHJpbmdcXG4gICAgICAgIE11bmdlIHdoaXRlc3BhY2UgaW4gdGV4dDogZXhwYW5kIHRhYnMgYW5kIGNvbnZlcnQgYWxsIG90aGVyXFxuICAgICAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gc3BhY2VzLiAgRWcuIFxcXCIgZm9vXFxcXFxcXFx0YmFyXFxcXFxcXFxuXFxcXFxcXFxuYmF6XFxcIlxcbiAgICAgICAgYmVjb21lcyBcXFwiIGZvbyAgICBiYXIgIGJhelxcXCIuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuZXhwYW5kX3RhYnM6XFxuICAgICAgICAgICAgdGV4dCA9IHRleHQuZXhwYW5kdGFicyhzZWxmLnRhYnNpemUpXFxuICAgICAgICBpZiBzZWxmLnJlcGxhY2Vfd2hpdGVzcGFjZTpcXG4gICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gc2VsZi51bmljb2RlX3doaXRlc3BhY2VfdHJhbnMuaXRlbXMoKTpcXG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShrZXksIHZhbClcXG4gICAgICAgIHJldHVybiB0ZXh0XFxuXFxuXFxuICAgIGRlZiBfc3BsaXQoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfc3BsaXQodGV4dCA6IHN0cmluZykgLT4gW3N0cmluZ11cXG4gICAgICAgIFNwbGl0IHRoZSB0ZXh0IHRvIHdyYXAgaW50byBpbmRpdmlzaWJsZSBjaHVua3MuICBDaHVua3MgYXJlXFxuICAgICAgICBub3QgcXVpdGUgdGhlIHNhbWUgYXMgd29yZHM7IHNlZSBfd3JhcF9jaHVua3MoKSBmb3IgZnVsbFxcbiAgICAgICAgZGV0YWlscy4gIEFzIGFuIGV4YW1wbGUsIHRoZSB0ZXh0XFxuICAgICAgICAgIExvb2ssIGdvb2YtYmFsbCAtLSB1c2UgdGhlIC1iIG9wdGlvbiFcXG4gICAgICAgIGJyZWFrcyBpbnRvIHRoZSBmb2xsb3dpbmcgY2h1bmtzOlxcbiAgICAgICAgICAnTG9vaywnLCAnICcsICdnb29mLScsICdiYWxsJywgJyAnLCAnLS0nLCAnICcsXFxuICAgICAgICAgICd1c2UnLCAnICcsICd0aGUnLCAnICcsICctYicsICcgJywgJ29wdGlvbiEnXFxuICAgICAgICBpZiBicmVha19vbl9oeXBoZW5zIGlzIFRydWUsIG9yIGluOlxcbiAgICAgICAgICAnTG9vaywnLCAnICcsICdnb29mLWJhbGwnLCAnICcsICctLScsICcgJyxcXG4gICAgICAgICAgJ3VzZScsICcgJywgJ3RoZScsICcgJywgJy1iJywgJyAnLCBvcHRpb24hJ1xcbiAgICAgICAgb3RoZXJ3aXNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLmJyZWFrX29uX2h5cGhlbnMgaXMgVHJ1ZTpcXG4gICAgICAgICAgICBjaHVua3MgPSBzZWxmLndvcmRzZXBfcmUuc3BsaXQodGV4dClcXG4gICAgICAgICAgICBpZiBcXFwiLS1cXFwiIGluIHRleHQ6XFxuICAgICAgICAgICAgICAgIGNodW5rcyA9IFtpdGVtIFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3VibGlzdCBpbiBbc2VsZi5lbV9kYXNoLnNwbGl0KGNodW5rKSBmb3IgY2h1bmsgaW4gY2h1bmtzXSBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHN1Ymxpc3RdXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNodW5rcyA9IHNlbGYud29yZHNlcF9zaW1wbGVfcmUuc3BsaXQodGV4dClcXG4gICAgICAgIGNodW5rcyA9IFtjIGZvciBjIGluIGNodW5rcyBpZiBjXVxcbiAgICAgICAgcmV0dXJuIGNodW5rc1xcblxcbiAgICBkZWYgX2ZpeF9zZW50ZW5jZV9lbmRpbmdzKHNlbGYsIGNodW5rcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfZml4X3NlbnRlbmNlX2VuZGluZ3MoY2h1bmtzIDogW3N0cmluZ10pXFxuICAgICAgICBDb3JyZWN0IGZvciBzZW50ZW5jZSBlbmRpbmdzIGJ1cmllZCBpbiAnY2h1bmtzJy4gIEVnLiB3aGVuIHRoZVxcbiAgICAgICAgb3JpZ2luYWwgdGV4dCBjb250YWlucyBcXFwiLi4uIGZvby5cXFxcXFxcXG5CYXIgLi4uXFxcIiwgbXVuZ2Vfd2hpdGVzcGFjZSgpXFxuICAgICAgICBhbmQgc3BsaXQoKSB3aWxsIGNvbnZlcnQgdGhhdCB0byBbLi4uLCBcXFwiZm9vLlxcXCIsIFxcXCIgXFxcIiwgXFxcIkJhclxcXCIsIC4uLl1cXG4gICAgICAgIHdoaWNoIGhhcyBvbmUgdG9vIGZldyBzcGFjZXM7IHRoaXMgbWV0aG9kIHNpbXBseSBjaGFuZ2VzIHRoZSBvbmVcXG4gICAgICAgIHNwYWNlIHRvIHR3by5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaSA9IDBcXG4gICAgICAgICMgcGF0c2VhcmNoID0gc2VsZi5zZW50ZW5jZV9lbmRfcmUuc2VhcmNoXFxuICAgICAgICB3aGlsZSBpIDwgbGVuKGNodW5rcyktMTpcXG4gICAgICAgICAgICBpZiBjaHVua3NbaSsxXSA9PSBcXFwiIFxcXCIgYW5kIHJlLnNlYXJjaChzZWxmLnNlbnRlbmNlX2VuZF9yZSwgY2h1bmtzW2ldKSBhbmQgY2h1bmtzW2ldWy0xXSBpbiBcXFwiLiE/XFxcXFxcXCJcXFxcJ1xcXCI6XFxuICAgICAgICAgICAgICAgIGNodW5rc1tpKzFdID0gXFxcIiAgXFxcIlxcbiAgICAgICAgICAgICAgICBpICs9IDJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpICs9IDFcXG5cXG4gICAgZGVmIF9oYW5kbGVfbG9uZ193b3JkKHNlbGYsIHJldmVyc2VkX2NodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdpZHRoKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl9oYW5kbGVfbG9uZ193b3JkKGNodW5rcyA6IFtzdHJpbmddLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2xpbmUgOiBbc3RyaW5nXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gOiBpbnQsIHdpZHRoIDogaW50KVxcbiAgICAgICAgSGFuZGxlIGEgY2h1bmsgb2YgdGV4dCAobW9zdCBsaWtlbHkgYSB3b3JkLCBub3Qgd2hpdGVzcGFjZSkgdGhhdFxcbiAgICAgICAgaXMgdG9vIGxvbmcgdG8gZml0IGluIGFueSBsaW5lLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIEZpZ3VyZSBvdXQgd2hlbiBpbmRlbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCB3aWR0aCwgYW5kIG1ha2VcXG4gICAgICAgICMgc3VyZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGlzIHN0cmlwcGVkIG9mZiBvbiBldmVyeSBwYXNzXFxuICAgICAgICBpZiB3aWR0aCA8IDE6XFxuICAgICAgICAgICAgc3BhY2VfbGVmdCA9IDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc3BhY2VfbGVmdCA9IHdpZHRoIC0gY3VyX2xlblxcblxcbiAgICAgICAgIyBJZiB3ZSdyZSBhbGxvd2VkIHRvIGJyZWFrIGxvbmcgd29yZHMsIHRoZW4gZG8gc286IHB1dCBhcyBtdWNoXFxuICAgICAgICAjIG9mIHRoZSBuZXh0IGNodW5rIG9udG8gdGhlIGN1cnJlbnQgbGluZSBhcyB3aWxsIGZpdC5cXG4gICAgICAgIGlmIHNlbGYuYnJlYWtfbG9uZ193b3JkczpcXG4gICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQocmV2ZXJzZWRfY2h1bmtzWy0xXVs6c3BhY2VfbGVmdF0pXFxuICAgICAgICAgICAgcmV2ZXJzZWRfY2h1bmtzWy0xXSA9IHJldmVyc2VkX2NodW5rc1stMV1bc3BhY2VfbGVmdDpdXFxuXFxuICAgICAgICAjIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgbG9uZyB3b3JkIGludGFjdC4gIE9ubHkgYWRkXFxuICAgICAgICAjIGl0IHRvIHRoZSBjdXJyZW50IGxpbmUgaWYgdGhlcmUncyBub3RoaW5nIGFscmVhZHkgdGhlcmUgLS1cXG4gICAgICAgICMgdGhhdCBtaW5pbWl6ZXMgaG93IG11Y2ggd2UgdmlvbGF0ZSB0aGUgd2lkdGggY29uc3RyYWludC5cXG4gICAgICAgIGVsaWYgbm90IGN1cl9saW5lOlxcbiAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChyZXZlcnNlZF9jaHVua3MucG9wKCkpXFxuXFxuICAgICAgICAjIElmIHdlJ3JlIG5vdCBhbGxvd2VkIHRvIGJyZWFrIGxvbmcgd29yZHMsIGFuZCB0aGVyZSdzIGFscmVhZHlcXG4gICAgICAgICMgdGV4dCBvbiB0aGUgY3VycmVudCBsaW5lLCBkbyBub3RoaW5nLiAgTmV4dCB0aW1lIHRocm91Z2ggdGhlXFxuICAgICAgICAjIG1haW4gbG9vcCBvZiBfd3JhcF9jaHVua3MoKSwgd2UnbGwgd2luZCB1cCBoZXJlIGFnYWluLCBidXRcXG4gICAgICAgICMgY3VyX2xlbiB3aWxsIGJlIHplcm8sIHNvIHRoZSBuZXh0IGxpbmUgd2lsbCBiZSBlbnRpcmVseVxcbiAgICAgICAgIyBkZXZvdGVkIHRvIHRoZSBsb25nIHdvcmQgdGhhdCB3ZSBjYW4ndCBoYW5kbGUgcmlnaHQgbm93LlxcblxcbiAgICBkZWYgX3dyYXBfY2h1bmtzKHNlbGYsIGNodW5rcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfd3JhcF9jaHVua3MoY2h1bmtzIDogW3N0cmluZ10pIC0+IFtzdHJpbmddXFxuICAgICAgICBXcmFwIGEgc2VxdWVuY2Ugb2YgdGV4dCBjaHVua3MgYW5kIHJldHVybiBhIGxpc3Qgb2YgbGluZXMgb2ZcXG4gICAgICAgIGxlbmd0aCAnc2VsZi53aWR0aCcgb3IgbGVzcy4gIChJZiAnYnJlYWtfbG9uZ193b3JkcycgaXMgZmFsc2UsXFxuICAgICAgICBzb21lIGxpbmVzIG1heSBiZSBsb25nZXIgdGhhbiB0aGlzLikgIENodW5rcyBjb3JyZXNwb25kIHJvdWdobHlcXG4gICAgICAgIHRvIHdvcmRzIGFuZCB0aGUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZW06IGVhY2ggY2h1bmsgaXNcXG4gICAgICAgIGluZGl2aXNpYmxlIChtb2R1bG8gJ2JyZWFrX2xvbmdfd29yZHMnKSwgYnV0IGEgbGluZSBicmVhayBjYW5cXG4gICAgICAgIGNvbWUgYmV0d2VlbiBhbnkgdHdvIGNodW5rcy4gIENodW5rcyBzaG91bGQgbm90IGhhdmUgaW50ZXJuYWxcXG4gICAgICAgIHdoaXRlc3BhY2U7IGllLiBhIGNodW5rIGlzIGVpdGhlciBhbGwgd2hpdGVzcGFjZSBvciBhIFxcXCJ3b3JkXFxcIi5cXG4gICAgICAgIFdoaXRlc3BhY2UgY2h1bmtzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZlxcbiAgICAgICAgbGluZXMsIGJ1dCBhcGFydCBmcm9tIHRoYXQgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGxpbmVzID0gW11cXG4gICAgICAgIGlmIHNlbGYud2lkdGggPD0gMDpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJpbnZhbGlkIHdpZHRoICVyIChtdXN0IGJlID4gMClcXFwiICUgc2VsZi53aWR0aClcXG4gICAgICAgIGlmIHNlbGYubWF4X2xpbmVzIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGlmIHNlbGYubWF4X2xpbmVzID4gMTpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5zdWJzZXF1ZW50X2luZGVudFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5pdGlhbF9pbmRlbnRcXG4gICAgICAgICAgICBpZiBsZW4oaW5kZW50KSArIGxlbihzZWxmLnBsYWNlaG9sZGVyLmxzdHJpcCgpKSA+IHNlbGYud2lkdGg6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcInBsYWNlaG9sZGVyIHRvbyBsYXJnZSBmb3IgbWF4IHdpZHRoXFxcIilcXG5cXG4gICAgICAgICMgQXJyYW5nZSBpbiByZXZlcnNlIG9yZGVyIHNvIGl0ZW1zIGNhbiBiZSBlZmZpY2llbnRseSBwb3BwZWRcXG4gICAgICAgICMgZnJvbSBhIHN0YWNrIG9mIGNodWNrcy5cXG4gICAgICAgIGNodW5rcy5yZXZlcnNlKClcXG5cXG4gICAgICAgIHdoaWxlIGNodW5rczpcXG5cXG4gICAgICAgICAgICAjIFN0YXJ0IHRoZSBsaXN0IG9mIGNodW5rcyB0aGF0IHdpbGwgbWFrZSB1cCB0aGUgY3VycmVudCBsaW5lLlxcbiAgICAgICAgICAgICMgY3VyX2xlbiBpcyBqdXN0IHRoZSBsZW5ndGggb2YgYWxsIHRoZSBjaHVua3MgaW4gY3VyX2xpbmUuXFxuICAgICAgICAgICAgY3VyX2xpbmUgPSBbXVxcbiAgICAgICAgICAgIGN1cl9sZW4gPSAwXFxuXFxuICAgICAgICAgICAgIyBGaWd1cmUgb3V0IHdoaWNoIHN0YXRpYyBzdHJpbmcgd2lsbCBwcmVmaXggdGhpcyBsaW5lLlxcbiAgICAgICAgICAgIGlmIGxpbmVzOlxcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLnN1YnNlcXVlbnRfaW5kZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbml0aWFsX2luZGVudFxcblxcbiAgICAgICAgICAgICMgTWF4aW11bSB3aWR0aCBmb3IgdGhpcyBsaW5lLlxcbiAgICAgICAgICAgIHdpZHRoID0gc2VsZi53aWR0aCAtIGxlbihpbmRlbnQpXFxuXFxuICAgICAgICAgICAgIyBGaXJzdCBjaHVuayBvbiBsaW5lIGlzIHdoaXRlc3BhY2UgLS0gZHJvcCBpdCwgdW5sZXNzIHRoaXNcXG4gICAgICAgICAgICAjIGlzIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgdGV4dCAoaWUuIG5vIGxpbmVzIHN0YXJ0ZWQgeWV0KS5cXG4gICAgICAgICAgICBpZiBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmQgY2h1bmtzWy0xXS5zdHJpcCgpID09ICcnIGFuZCBsaW5lczpcXG4gICAgICAgICAgICAgICAgZGVsIGNodW5rc1stMV1cXG5cXG4gICAgICAgICAgICB3aGlsZSBjaHVua3M6XFxuICAgICAgICAgICAgICAgIGwgPSBsZW4oY2h1bmtzWy0xXSlcXG5cXG4gICAgICAgICAgICAgICAgIyBDYW4gYXQgbGVhc3Qgc3F1ZWV6ZSB0aGlzIGNodW5rIG9udG8gdGhlIGN1cnJlbnQgbGluZS5cXG4gICAgICAgICAgICAgICAgaWYgY3VyX2xlbiArIGwgPD0gd2lkdGg6XFxuICAgICAgICAgICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQoY2h1bmtzLnBvcCgpKVxcbiAgICAgICAgICAgICAgICAgICAgY3VyX2xlbiArPSBsXFxuXFxuICAgICAgICAgICAgICAgICMgTm9wZSwgdGhpcyBsaW5lIGlzIGZ1bGwuXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBicmVha1xcblxcbiAgICAgICAgICAgICMgVGhlIGN1cnJlbnQgbGluZSBpcyBmdWxsLCBhbmQgdGhlIG5leHQgY2h1bmsgaXMgdG9vIGJpZyB0b1xcbiAgICAgICAgICAgICMgZml0IG9uICphbnkqIGxpbmUgKG5vdCBqdXN0IHRoaXMgb25lKS5cXG4gICAgICAgICAgICBpZiBjaHVua3MgYW5kIGxlbihjaHVua3NbLTFdKSA+IHdpZHRoOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVfbG9uZ193b3JkKGNodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdpZHRoKVxcbiAgICAgICAgICAgICAgICBjdXJfbGVuID0gc3VtKG1hcChsZW4sIGN1cl9saW5lKSlcXG5cXG4gICAgICAgICAgICAjIElmIHRoZSBsYXN0IGNodW5rIG9uIHRoaXMgbGluZSBpcyBhbGwgd2hpdGVzcGFjZSwgZHJvcCBpdC5cXG4gICAgICAgICAgICBpZiBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmQgY3VyX2xpbmUgYW5kIGN1cl9saW5lWy0xXS5zdHJpcCgpID09ICcnOlxcbiAgICAgICAgICAgICAgICBjdXJfbGVuIC09IGxlbihjdXJfbGluZVstMV0pXFxuICAgICAgICAgICAgICAgIGRlbCBjdXJfbGluZVstMV1cXG5cXG4gICAgICAgICAgICBpZiBjdXJfbGluZTpcXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYubWF4X2xpbmVzIGlzIE5vbmUgb3JcXG4gICAgICAgICAgICAgICAgICAgIGxlbihsaW5lcykgKyAxIDwgc2VsZi5tYXhfbGluZXMgb3JcXG4gICAgICAgICAgICAgICAgICAgIChub3QgY2h1bmtzIG9yXFxuICAgICAgICAgICAgICAgICAgICAgc2VsZi5kcm9wX3doaXRlc3BhY2UgYW5kXFxuICAgICAgICAgICAgICAgICAgICAgbGVuKGNodW5rcykgPT0gMSBhbmRcXG4gICAgICAgICAgICAgICAgICAgICBub3QgY2h1bmtzWzBdLnN0cmlwKCkpIGFuZCBjdXJfbGVuIDw9IHdpZHRoKTpcXG4gICAgICAgICAgICAgICAgICAgICMgQ29udmVydCBjdXJyZW50IGxpbmUgYmFjayB0byBhIHN0cmluZyBhbmQgc3RvcmUgaXQgaW5cXG4gICAgICAgICAgICAgICAgICAgICMgbGlzdCBvZiBhbGwgbGluZXMgKHJldHVybiB2YWx1ZSkuXFxuICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoaW5kZW50ICsgJycuam9pbihjdXJfbGluZSkpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICB3aGlsZSBjdXJfbGluZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyX2xpbmVbLTFdLnN0cmlwKCkgYW5kXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gKyBsZW4oc2VsZi5wbGFjZWhvbGRlcikgPD0gd2lkdGgpOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQoc2VsZi5wbGFjZWhvbGRlcilcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGluZGVudCArICcnLmpvaW4oY3VyX2xpbmUpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gLT0gbGVuKGN1cl9saW5lWy0xXSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWwgY3VyX2xpbmVbLTFdXFxuICAgICAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVzOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2xpbmUgPSBsaW5lc1stMV0ucnN0cmlwKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbihwcmV2X2xpbmUpICsgbGVuKHNlbGYucGxhY2Vob2xkZXIpIDw9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aWR0aCk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1stMV0gPSBwcmV2X2xpbmUgKyBzZWxmLnBsYWNlaG9sZGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChpbmRlbnQgKyBzZWxmLnBsYWNlaG9sZGVyLmxzdHJpcCgpKVxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG5cXG4gICAgICAgIHJldHVybiBsaW5lc1xcblxcbiAgICBkZWYgX3NwbGl0X2NodW5rcyhzZWxmLCB0ZXh0KTpcXG4gICAgICAgIHRleHQgPSBzZWxmLl9tdW5nZV93aGl0ZXNwYWNlKHRleHQpXFxuICAgICAgICByZXR1cm4gc2VsZi5fc3BsaXQodGV4dClcXG5cXG4gICAgIyAtLSBQdWJsaWMgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG4gICAgZGVmIHdyYXAoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ3cmFwKHRleHQgOiBzdHJpbmcpIC0+IFtzdHJpbmddXFxuICAgICAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgc28gaXQgZml0cyBpbiBsaW5lcyBvZlxcbiAgICAgICAgbm8gbW9yZSB0aGFuICdzZWxmLndpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB3cmFwcGVkXFxuICAgICAgICBsaW5lcy4gIFRhYnMgaW4gJ3RleHQnIGFyZSBleHBhbmRlZCB3aXRoIHN0cmluZy5leHBhbmR0YWJzKCksXFxuICAgICAgICBhbmQgYWxsIG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmUpIGFyZVxcbiAgICAgICAgY29udmVydGVkIHRvIHNwYWNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBjaHVua3MgPSBzZWxmLl9zcGxpdF9jaHVua3ModGV4dClcXG4gICAgICAgIGlmIHNlbGYuZml4X3NlbnRlbmNlX2VuZGluZ3M6XFxuICAgICAgICAgICAgc2VsZi5fZml4X3NlbnRlbmNlX2VuZGluZ3MoY2h1bmtzKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3dyYXBfY2h1bmtzKGNodW5rcylcXG5cXG4gICAgZGVmIGZpbGwoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJmaWxsKHRleHQgOiBzdHJpbmcpIC0+IHN0cmluZ1xcbiAgICAgICAgUmVmb3JtYXQgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gJ3RleHQnIHRvIGZpdCBpbiBsaW5lcyBvZiBub1xcbiAgICAgICAgbW9yZSB0aGFuICdzZWxmLndpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbmV3IHN0cmluZ1xcbiAgICAgICAgY29udGFpbmluZyB0aGUgZW50aXJlIHdyYXBwZWQgcGFyYWdyYXBoLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gXFxcIlxcXFxuXFxcIi5qb2luKHNlbGYud3JhcCh0ZXh0KSlcXG5cXG5cXG4jIC0tIENvbnZlbmllbmNlIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG5kZWYgd3JhcCh0ZXh0LCB3aWR0aD03MCwgKiprd2FyZ3MpOlxcbiAgICBcXFwiXFxcIlxcXCJXcmFwIGEgc2luZ2xlIHBhcmFncmFwaCBvZiB0ZXh0LCByZXR1cm5pbmcgYSBsaXN0IG9mIHdyYXBwZWQgbGluZXMuXFxuICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyBzbyBpdCBmaXRzIGluIGxpbmVzIG9mIG5vXFxuICAgIG1vcmUgdGhhbiAnd2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBsaXN0IG9mIHdyYXBwZWQgbGluZXMuICBCeVxcbiAgICBkZWZhdWx0LCB0YWJzIGluICd0ZXh0JyBhcmUgZXhwYW5kZWQgd2l0aCBzdHJpbmcuZXhwYW5kdGFicygpLCBhbmRcXG4gICAgYWxsIG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmUpIGFyZSBjb252ZXJ0ZWQgdG9cXG4gICAgc3BhY2UuICBTZWUgVGV4dFdyYXBwZXIgY2xhc3MgZm9yIGF2YWlsYWJsZSBrZXl3b3JkIGFyZ3MgdG8gY3VzdG9taXplXFxuICAgIHdyYXBwaW5nIGJlaGF2aW91ci5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIHcgPSBUZXh0V3JhcHBlcih3aWR0aD13aWR0aCwgKiprd2FyZ3MpXFxuICAgIHJldHVybiB3LndyYXAodGV4dClcXG5cXG5kZWYgZmlsbCh0ZXh0LCB3aWR0aD03MCwgKiprd2FyZ3MpOlxcbiAgICBcXFwiXFxcIlxcXCJGaWxsIGEgc2luZ2xlIHBhcmFncmFwaCBvZiB0ZXh0LCByZXR1cm5pbmcgYSBuZXcgc3RyaW5nLlxcbiAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgdG8gZml0IGluIGxpbmVzIG9mIG5vIG1vcmVcXG4gICAgdGhhbiAnd2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBuZXcgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVudGlyZVxcbiAgICB3cmFwcGVkIHBhcmFncmFwaC4gIEFzIHdpdGggd3JhcCgpLCB0YWJzIGFyZSBleHBhbmRlZCBhbmQgb3RoZXJcXG4gICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byBzcGFjZS4gIFNlZSBUZXh0V3JhcHBlciBjbGFzcyBmb3JcXG4gICAgYXZhaWxhYmxlIGtleXdvcmQgYXJncyB0byBjdXN0b21pemUgd3JhcHBpbmcgYmVoYXZpb3VyLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdyA9IFRleHRXcmFwcGVyKHdpZHRoPXdpZHRoLCAqKmt3YXJncylcXG4gICAgcmV0dXJuIHcuZmlsbCh0ZXh0KVxcblxcbmRlZiBzaG9ydGVuKHRleHQsIHdpZHRoLCAqKmt3YXJncyk6XFxuICAgIFxcXCJcXFwiXFxcIkNvbGxhcHNlIGFuZCB0cnVuY2F0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBmaXQgaW4gdGhlIGdpdmVuIHdpZHRoLlxcbiAgICBUaGUgdGV4dCBmaXJzdCBoYXMgaXRzIHdoaXRlc3BhY2UgY29sbGFwc2VkLiAgSWYgaXQgdGhlbiBmaXRzIGluXFxuICAgIHRoZSAqd2lkdGgqLCBpdCBpcyByZXR1cm5lZCBhcyBpcy4gIE90aGVyd2lzZSwgYXMgbWFueSB3b3Jkc1xcbiAgICBhcyBwb3NzaWJsZSBhcmUgam9pbmVkIGFuZCB0aGVuIHRoZSBwbGFjZWhvbGRlciBpcyBhcHBlbmRlZDo6XFxuICAgICAgICA+Pj4gdGV4dHdyYXAuc2hvcnRlbihcXFwiSGVsbG8gIHdvcmxkIVxcXCIsIHdpZHRoPTEyKVxcbiAgICAgICAgJ0hlbGxvIHdvcmxkISdcXG4gICAgICAgID4+PiB0ZXh0d3JhcC5zaG9ydGVuKFxcXCJIZWxsbyAgd29ybGQhXFxcIiwgd2lkdGg9MTEpXFxuICAgICAgICAnSGVsbG8gWy4uLl0nXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICB3ID0gVGV4dFdyYXBwZXIod2lkdGg9d2lkdGgsIG1heF9saW5lcz0xLCAqKmt3YXJncylcXG4gICAgcmV0dXJuIHcuZmlsbCgnICcuam9pbih0ZXh0LnN0cmlwKCkuc3BsaXQoKSkpXFxuXFxuXFxuIyAtLSBMb29zZWx5IHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuIyBfd2hpdGVzcGFjZV9vbmx5X3JlID0gcmUuY29tcGlsZSgnXlsgXFxcXHRdKyQnLCByZS5NVUxUSUxJTkUpXFxuIyBfbGVhZGluZ193aGl0ZXNwYWNlX3JlID0gcmUuY29tcGlsZSgnKF5bIFxcXFx0XSopKD86W14gXFxcXHRcXFxcbl0pJywgcmUuTVVMVElMSU5FKVxcblxcbmRlZiBkZWRlbnQodGV4dCk6XFxuICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbnkgY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGV2ZXJ5IGxpbmUgaW4gYHRleHRgLlxcbiAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgdHJpcGxlLXF1b3RlZCBzdHJpbmdzIGxpbmUgdXAgd2l0aCB0aGUgbGVmdFxcbiAgICBlZGdlIG9mIHRoZSBkaXNwbGF5LCB3aGlsZSBzdGlsbCBwcmVzZW50aW5nIHRoZW0gaW4gdGhlIHNvdXJjZSBjb2RlXFxuICAgIGluIGluZGVudGVkIGZvcm0uXFxuICAgIE5vdGUgdGhhdCB0YWJzIGFuZCBzcGFjZXMgYXJlIGJvdGggdHJlYXRlZCBhcyB3aGl0ZXNwYWNlLCBidXQgdGhleVxcbiAgICBhcmUgbm90IGVxdWFsOiB0aGUgbGluZXMgXFxcIiAgaGVsbG9cXFwiIGFuZCBcXFwiXFxcXFxcXFx0aGVsbG9cXFwiIGFyZVxcbiAgICBjb25zaWRlcmVkIHRvIGhhdmUgbm8gY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZS5cXG4gICAgRW50aXJlbHkgYmxhbmsgbGluZXMgYXJlIG5vcm1hbGl6ZWQgdG8gYSBuZXdsaW5lIGNoYXJhY3Rlci5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgICMgTG9vayBmb3IgdGhlIGxvbmdlc3QgbGVhZGluZyBzdHJpbmcgb2Ygc3BhY2VzIGFuZCB0YWJzIGNvbW1vbiB0b1xcbiAgICAjIGFsbCBsaW5lcy5cXG4gICAgbWFyZ2luID0gTm9uZVxcblxcbiAgICBpbmRlbnRzID0gcmUuZmluZGFsbChyJyheWyBcXFxcdF0qKSg/OlteIFxcXFx0XFxcXG5dKScsdGV4dCwgcmUuTVVMVElMSU5FKVxcbiAgICBmb3IgaW5kZW50IGluIGluZGVudHM6XFxuICAgICAgICBpZiBtYXJnaW4gaXMgTm9uZTpcXG4gICAgICAgICAgICBtYXJnaW4gPSBpbmRlbnRcXG5cXG4gICAgICAgICMgQ3VycmVudCBsaW5lIG1vcmUgZGVlcGx5IGluZGVudGVkIHRoYW4gcHJldmlvdXMgd2lubmVyOlxcbiAgICAgICAgIyBubyBjaGFuZ2UgKHByZXZpb3VzIHdpbm5lciBpcyBzdGlsbCBvbiB0b3ApLlxcbiAgICAgICAgZWxpZiBpbmRlbnQuc3RhcnRzd2l0aChtYXJnaW4pOlxcbiAgICAgICAgICAgIHBhc3NcXG5cXG4gICAgICAgICMgQ3VycmVudCBsaW5lIGNvbnNpc3RlbnQgd2l0aCBhbmQgbm8gZGVlcGVyIHRoYW4gcHJldmlvdXMgd2lubmVyOlxcbiAgICAgICAgIyBpdCdzIHRoZSBuZXcgd2lubmVyLlxcbiAgICAgICAgZWxpZiBtYXJnaW4uc3RhcnRzd2l0aChpbmRlbnQpOlxcbiAgICAgICAgICAgIG1hcmdpbiA9IGluZGVudFxcblxcbiAgICAgICAgIyBGaW5kIHRoZSBsYXJnZXN0IGNvbW1vbiB3aGl0ZXNwYWNlIGJldHdlZW4gY3VycmVudCBsaW5lIGFuZCBwcmV2aW91c1xcbiAgICAgICAgIyB3aW5uZXIuXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGZvciBpLCAoeCwgeSkgaW4gZW51bWVyYXRlKHppcChtYXJnaW4sIGluZGVudCkpOlxcbiAgICAgICAgICAgICAgICBpZiB4ICE9IHk6XFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW5bOmldXFxuICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAjIHNhbml0eSBjaGVjayAodGVzdGluZy9kZWJ1Z2dpbmcgb25seSlcXG4gICAgaWYgMCBhbmQgbWFyZ2luOlxcbiAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdChcXFwiXFxcXG5cXFwiKTpcXG4gICAgICAgICAgICBhc3NlcnQgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKG1hcmdpbiksIFxcXFxcXG4gICAgICAgICAgICAgICAgICAgXFxcImxpbmUgPSAlciwgbWFyZ2luID0gJXJcXFwiICUgKGxpbmUsIG1hcmdpbilcXG5cXG4gICAgaWYgbWFyZ2luOlxcbiAgICAgICAgbGluZXMgPSBbbGluZVtsZW4obWFyZ2luKTpdIFxcbiAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpXFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBsaW5lLnN0cmlwKCkgXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHRleHQuc3BsaXQoXFxcIlxcXFxuXFxcIildXFxuICAgICAgICB0ZXh0ID0gXFxcIlxcXFxuXFxcIi5qb2luKGxpbmVzKVxcbiAgICByZXR1cm4gdGV4dFxcblxcblxcbmRlZiBpbmRlbnQodGV4dCwgcHJlZml4LCBwcmVkaWNhdGU9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIkFkZHMgJ3ByZWZpeCcgdG8gdGhlIGJlZ2lubmluZyBvZiBzZWxlY3RlZCBsaW5lcyBpbiAndGV4dCcuXFxuICAgIElmICdwcmVkaWNhdGUnIGlzIHByb3ZpZGVkLCAncHJlZml4JyB3aWxsIG9ubHkgYmUgYWRkZWQgdG8gdGhlIGxpbmVzXFxuICAgIHdoZXJlICdwcmVkaWNhdGUobGluZSknIGlzIFRydWUuIElmICdwcmVkaWNhdGUnIGlzIG5vdCBwcm92aWRlZCxcXG4gICAgaXQgd2lsbCBkZWZhdWx0IHRvIGFkZGluZyAncHJlZml4JyB0byBhbGwgbm9uLWVtcHR5IGxpbmVzIHRoYXQgZG8gbm90XFxuICAgIGNvbnNpc3Qgc29sZWx5IG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycy5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIGlmIHByZWRpY2F0ZSBpcyBOb25lOlxcbiAgICAgICAgZGVmIHByZWRpY2F0ZShsaW5lKTpcXG4gICAgICAgICAgICByZXR1cm4gbGluZS5zdHJpcCgpXFxuXFxuICAgIGRlZiBwcmVmaXhlZF9saW5lcygpOlxcbiAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdGxpbmVzKFRydWUpOlxcbiAgICAgICAgICAgIHlpZWxkIChwcmVmaXggKyBsaW5lIGlmIHByZWRpY2F0ZShsaW5lKSBlbHNlIGxpbmUpXFxuICAgIHJldHVybiAnJy5qb2luKHByZWZpeGVkX2xpbmVzKCkpXFxuXFxuXFxuaWYgX19uYW1lX18gPT0gXFxcIl9fbWFpbl9fXFxcIjpcXG4gICAgI3ByaW50IGRlZGVudChcXFwiXFxcXHRmb29cXFxcblxcXFx0YmFyXFxcIilcXG4gICAgI3ByaW50IGRlZGVudChcXFwiICBcXFxcdGhlbGxvIHRoZXJlXFxcXG4gIFxcXFx0ICBob3cgYXJlIHlvdT9cXFwiKVxcbiAgICBwcmludChkZWRlbnQoXFxcIkhlbGxvIHRoZXJlLlxcXFxuICBUaGlzIGlzIGluZGVudGVkLlxcXCIpKVwiLFwic3JjL2xpYi90aGlzLnB5XCI6XCJcXG5wcmludChcXFwiXFxcIlxcXCJcXG5UaGUgWmVuIG9mIFB5dGhvbiwgYnkgVGltIFBldGVyc1xcblxcbkJlYXV0aWZ1bCBpcyBiZXR0ZXIgdGhhbiB1Z2x5LlxcbkV4cGxpY2l0IGlzIGJldHRlciB0aGFuIGltcGxpY2l0LlxcblNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LlxcbkNvbXBsZXggaXMgYmV0dGVyIHRoYW4gY29tcGxpY2F0ZWQuXFxuRmxhdCBpcyBiZXR0ZXIgdGhhbiBuZXN0ZWQuXFxuU3BhcnNlIGlzIGJldHRlciB0aGFuIGRlbnNlLlxcblJlYWRhYmlsaXR5IGNvdW50cy5cXG5TcGVjaWFsIGNhc2VzIGFyZW4ndCBzcGVjaWFsIGVub3VnaCB0byBicmVhayB0aGUgcnVsZXMuXFxuQWx0aG91Z2ggcHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS5cXG5FcnJvcnMgc2hvdWxkIG5ldmVyIHBhc3Mgc2lsZW50bHkuXFxuVW5sZXNzIGV4cGxpY2l0bHkgc2lsZW5jZWQuXFxuSW4gdGhlIGZhY2Ugb2YgYW1iaWd1aXR5LCByZWZ1c2UgdGhlIHRlbXB0YXRpb24gdG8gZ3Vlc3MuXFxuVGhlcmUgc2hvdWxkIGJlIG9uZS0tIGFuZCBwcmVmZXJhYmx5IG9ubHkgb25lIC0tb2J2aW91cyB3YXkgdG8gZG8gaXQuXFxuQWx0aG91Z2ggdGhhdCB3YXkgbWF5IG5vdCBiZSBvYnZpb3VzIGF0IGZpcnN0IHVubGVzcyB5b3UncmUgRHV0Y2guXFxuTm93IGlzIGJldHRlciB0aGFuIG5ldmVyLlxcbkFsdGhvdWdoIG5ldmVyIGlzIG9mdGVuIGJldHRlciB0aGFuICpyaWdodCogbm93LlxcbklmIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBoYXJkIHRvIGV4cGxhaW4sIGl0J3MgYSBiYWQgaWRlYS5cXG5JZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgZWFzeSB0byBleHBsYWluLCBpdCBtYXkgYmUgYSBnb29kIGlkZWEuXFxuTmFtZXNwYWNlcyBhcmUgb25lIGhvbmtpbmcgZ3JlYXQgaWRlYSAtLSBsZXQncyBkbyBtb3JlIG9mIHRob3NlIVxcblxcXCJcXFwiXFxcIlxcbilcXG5cIixcInNyYy9saWIvdGhyZWFkaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0aHJlYWRpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90aW1lLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjaGVja19zdHJ1Y3RfdGltZShhKXtpZighKGEgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIlJlcXVpcmVkIGFyZ3VtZW50ICdzdHJ1Y3RfdGltZScgbXVzdCBiZSBvZiB0eXBlOiAnc3RydWN0X3RpbWUnXFxcIik7dmFyIGMsZD1hLnYubGVuZ3RoLGU9YS52O2ZvcihjPTA7YzxkOysrYylpZighU2suYnVpbHRpbi5jaGVja0ludChlW2NdKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cnVjdF90aW1lIG1heSBvbmx5IGNvbnRhaW4gaW50ZWdlcnNcXFwiKTtyZXR1cm4hMH1mdW5jdGlvbiBwYWRMZWZ0KGEsYixkKXt2YXIgYz1hLnRvU3RyaW5nKCk7cmV0dXJuIEFycmF5KGItYy5sZW5ndGgrMSkuam9pbihkfHxcXFwiIFxcXCIpK2N9ZnVuY3Rpb24gaXNMZWFwWWVhcihhKXtyZXR1cm4gMD09KDMmYSkmJigwIT1hJTEwMHx8MD09YSU0MDApfWZ1bmN0aW9uIGdldERheU9mWWVhcihhLGIpe2I9Ynx8ITE7dmFyIGM9Yj9hLmdldFVUQ01vbnRoKCk6YS5nZXRNb250aCgpLGQ9Yj9hLmdldFVUQ0RhdGUoKTphLmdldERhdGUoKSxlPVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdW2NdK2Q7cmV0dXJuIDE8YyYmaXNMZWFwWWVhcihiP2EuZ2V0VVRDRnVsbFllYXIoKTphLmdldEZ1bGxZZWFyKCkpJiZlKyssZX1mdW5jdGlvbiBzdGRUaW1lem9uZU9mZnNldCgpe3ZhciBhPU1hdGgubWF4LGI9bmV3IERhdGUoMjAwMiwwLDEpLGM9bmV3IERhdGUoMjAwMiw2LDEpO3JldHVybiBhKGIuZ2V0VGltZXpvbmVPZmZzZXQoKSxjLmdldFRpbWV6b25lT2Zmc2V0KCkpfWZ1bmN0aW9uIGRzdChhKXtyZXR1cm4gYS5nZXRUaW1lem9uZU9mZnNldCgpPHN0ZFRpbWV6b25lT2Zmc2V0KCl9ZnVuY3Rpb24gdGltZVpvbmVOYW1lKGEpe3ZhciBiLGM9L1xcXFwoKC4qKVxcXFwpLy5leGVjKGEudG9TdHJpbmcoKSk7aWYobnVsbCE9dGhpcy5uYXZpZ2F0b3ImJihiPXRoaXMubmF2aWdhdG9yLnVzZXJMYW5ndWFnZXx8dGhpcy5uYXZpZ2F0b3IubGFuZ3VhZ2UpLGMmJjE8Yy5sZW5ndGgpcmV0dXJuIGNbMV07aWYodm9pZCAwPT09YilyZXR1cm4gbnVsbDt0cnl7dmFyIGQ9YS50b0xvY2FsZVN0cmluZyhiLHt0aW1lWm9uZU5hbWU6XFxcInNob3J0XFxcIn0pO3JldHVybiBjPWQuc3BsaXQoXFxcIiBcXFwiKSxjW2MubGVuZ3RoLTFdfWNhdGNoKGEpe3JldHVybiBudWxsfX1mdW5jdGlvbiBkYXRlX3RvX3N0cnVjdF90aW1lKGEsYyl7cmV0dXJuIGM9Y3x8ITEsbmV3IGIoW1NrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ0Z1bGxZZWFyKCk6YS5nZXRGdWxsWWVhcigpKSxTay5idWlsdGluLmFzc2skKChjP2EuZ2V0VVRDTW9udGgoKTphLmdldE1vbnRoKCkpKzEpLFNrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ0RhdGUoKTphLmdldERhdGUoKSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDSG91cnMoKTphLmdldEhvdXJzKCkpLFNrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ01pbnV0ZXMoKTphLmdldE1pbnV0ZXMoKSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDU2Vjb25kcygpOmEuZ2V0U2Vjb25kcygpKSxTay5idWlsdGluLmFzc2skKCgoYz9hLmdldFVUQ0RheSgpOmEuZ2V0RGF5KCkpKzYpJTcpLFNrLmJ1aWx0aW4uYXNzayQoZ2V0RGF5T2ZZZWFyKGEsYykpLFNrLmJ1aWx0aW4uYXNzayQoYz8wOmRzdChhKT8xOjApXSl9ZnVuY3Rpb24gZnJvbV9zZWNvbmRzKGEsYil7dmFyIGM9bmV3IERhdGU7aWYoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwic2Vjc1xcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7dmFyIGQ9U2suYnVpbHRpbi5hc251bSQoYSk7Yy5zZXRUaW1lKDFlMypkKX1yZXR1cm4gZGF0ZV90b19zdHJ1Y3RfdGltZShjLGIpfWZ1bmN0aW9uIGFzY3RpbWVfZihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJhc2N0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksIWF8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpP2E9ZnJvbV9zZWNvbmRzKCk6IShhIGluc3RhbmNlb2YgYikmJihhPW5ldyBiKGEpKSxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSYmOT09YS52Lmxlbmd0aCl7dmFyIGU9W2RbU2suYnVpbHRpbi5hc251bSQoYS52WzZdKV0sY1tTay5idWlsdGluLmFzbnVtJChhLnZbMV0pLTFdLHBhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzJdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKSxwYWRMZWZ0KFNrLmJ1aWx0aW4uYXNudW0kKGEudlszXSkudG9TdHJpbmcoKSwyLFxcXCIwXFxcIikrXFxcIjpcXFwiK3BhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzRdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKStcXFwiOlxcXCIrcGFkTGVmdChTay5idWlsdGluLmFzbnVtJChhLnZbNV0pLnRvU3RyaW5nKCksMixcXFwiMFxcXCIpLHBhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzBdKS50b1N0cmluZygpLDQsXFxcIjBcXFwiKV07cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlLmpvaW4oXFxcIiBcXFwiKSl9fWZ1bmN0aW9uIG1rdGltZV9mKGEpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1rdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlJiY5PT1hLnYubGVuZ3RoKXt2YXIgYj1uZXcgRGF0ZShTay5idWlsdGluLmFzbnVtJChhLnZbMF0pLFNrLmJ1aWx0aW4uYXNudW0kKGEudlsxXSktMSxTay5idWlsdGluLmFzbnVtJChhLnZbMl0pLFNrLmJ1aWx0aW4uYXNudW0kKGEudlszXSksU2suYnVpbHRpbi5hc251bSQoYS52WzRdKSxTay5idWlsdGluLmFzbnVtJChhLnZbNV0pKTtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChiLmdldFRpbWUoKS8xZTMsdm9pZCAwKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm1rdGltZSgpIHJlcXVpcmVzIGEgc3RydWN0X3RpbWUgb3IgOS10dXBsZVxcXCIpfXZhciBhPXtfX3BhY2thZ2VfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSxiPVNrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXEoXFxcInRpbWVcXFwiLFxcXCJzdHJ1Y3RfdGltZVxcXCIse3RtX3llYXI6XFxcInllYXIsIGZvciBleGFtcGxlLCAxOTkzXFxcIix0bV9tb246XFxcIm1vbnRoIG9mIHllYXIsIHJhbmdlIFsxLCAxMl1cXFwiLHRtX21kYXk6XFxcImRheSBvZiBtb250aCwgcmFuZ2UgWzEsIDMxXVxcXCIsdG1faG91cjpcXFwiaG91cnMsIHJhbmdlIFswLCAyM11cXFwiLHRtX21pbjpcXFwibWludXRlcywgcmFuZ2UgWzAsIDU5XVxcXCIsdG1fc2VjOlxcXCJzZWNvbmRzLCByYW5nZSBbMCwgNjFdXFxcIix0bV93ZGF5OlxcXCJkYXkgb2Ygd2VlaywgcmFuZ2UgWzAsIDZdLCBNb25kYXkgaXMgMFxcXCIsdG1feWRheTpcXFwiZGF5IG9mIHllYXIsIHJhbmdlIFsxLCAzNjZdXFxcIix0bV9pc2RzdDpcXFwiMSBpZiBzdW1tZXIgdGltZSBpcyBpbiBlZmZlY3QsIDAgaWYgbm90LCBhbmQgLTEgaWYgdW5rbm93blxcXCJ9KTthLnN0cnVjdF90aW1lPWIsYS50aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCk7dmFyIGE9RGF0ZS5ub3coKTtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZSYmdGhpcy5wZXJmb3JtYW5jZS5ub3cmJihhKz1wZXJmb3JtYW5jZS5ub3coKSUxKSxTay5idWlsdGluLmFzc2skKGEvMWUzLHZvaWQgMCl9KSxhLnNsZWVwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNsZWVwXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZGVsYXlcXFwiLFxcXCJmbG9hdFxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb24obmV3IFByb21pc2UoZnVuY3Rpb24oYil7U2suc2V0VGltZW91dChmdW5jdGlvbigpe2IoU2suYnVpbHRpbi5ub25lLm5vbmUkKX0sMWUzKlNrLmZmaS5yZW1hcFRvSnMoYSkpfSkpfSksYS5sb2NhbHRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibG9jYWx0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksZnJvbV9zZWNvbmRzKGEsITEpfSksYS5nbXRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ210aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksZnJvbV9zZWNvbmRzKGEsITApfSk7dmFyIGM9W1xcXCJKYW5cXFwiLFxcXCJGZWJcXFwiLFxcXCJNYXJcXFwiLFxcXCJBcHJcXFwiLFxcXCJNYXlcXFwiLFxcXCJKdW5cXFwiLFxcXCJKdWxcXFwiLFxcXCJBdWdcXFwiLFxcXCJTZXBcXFwiLFxcXCJPY3RcXFwiLFxcXCJOb3ZcXFwiLFxcXCJEZWNcXFwiXSxkPVtcXFwiTW9uXFxcIixcXFwiVHVlXFxcIixcXFwiV2VkXFxcIixcXFwiVGh1XFxcIixcXFwiRnJpXFxcIixcXFwiU2F0XFxcIixcXFwiU3VuXFxcIl07cmV0dXJuIGEuYXNjdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGFzY3RpbWVfZiksYS5jdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJjdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLGFzY3RpbWVfZihmcm9tX3NlY29uZHMoYSkpfSksYS5ta3RpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhta3RpbWVfZiksYS50aW1lem9uZT1uZXcgU2suYnVpbHRpbi5pbnRfKDYwKnN0ZFRpbWV6b25lT2Zmc2V0KCkpLGEuYWx0em9uZT1uZXcgU2suYnVpbHRpbi5pbnRfKDYwKmZ1bmN0aW9uIGFsdFRpbWV6b25lT2Zmc2V0KCl7dmFyIGE9TWF0aC5taW4sYj1uZXcgRGF0ZSgyMDAyLDAsMSksYz1uZXcgRGF0ZSgyMDAyLDYsMSk7cmV0dXJuIGEoYi5nZXRUaW1lem9uZU9mZnNldCgpLGMuZ2V0VGltZXpvbmVPZmZzZXQoKSl9KCkpLGEuZGF5bGlnaHQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyhkc3QobmV3IERhdGUpPzE6MCksYS50em5hbWU9bmV3IFNrLmJ1aWx0aW4udHVwbGUoZnVuY3Rpb24gdGltZVpvbmVOYW1lcygpe3ZhciBhPW5ldyBEYXRlKDIwMDIsMCwxKSxiPW5ldyBEYXRlKDIwMDIsNiwxKTtyZXR1cm4gZHN0KGEpP1tuZXcgU2suYnVpbHRpbi5zdHIodGltZVpvbmVOYW1lKGIpKSxuZXcgU2suYnVpbHRpbi5zdHIodGltZVpvbmVOYW1lKGEpKV06W25ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYSkpLG5ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYikpXX0oKSksYS5hY2NlcHQyZHllYXI9U2suYnVpbHRpbi5hc3NrJCgxKSxhLmNsb2NrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiBhPXRoaXMucGVyZm9ybWFuY2UmJnRoaXMucGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlLm5vdygpLzFlMzpuZXcgRGF0ZSgpLmdldFRpbWUoKS8xZTMsbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfSksYS5zdHJmdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIHN0cmZ0aW1lX2YoYSxjKXt2YXIgZDtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzdHJmdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDIpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZm9ybWF0IG11c3QgYmUgYSBzdHJpbmdcXFwiKTtyZXR1cm4gYz8hKGMgaW5zdGFuY2VvZiBiKSYmKGM9bmV3IGIoYykpOmM9ZnJvbV9zZWNvbmRzKCksY2hlY2tfc3RydWN0X3RpbWUoYyksZD1Tay5mZmkucmVtYXBUb0pzKGEpLFNrLmZmaS5yZW1hcFRvUHkoc3RyZnRpbWUoZCxuZXcgRGF0ZSgxZTMqbWt0aW1lX2YoYykudikpKX0pLGEudHpzZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiB0enNldF9mKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGltZS50enNldCgpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcXFwiKX0pLGEuc3RycHRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBzdHJwdGltZV9mKGEsYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic3RycHRpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzdHJpbmdcXFwiLFxcXCJzdHJpbmdcXFwiLFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpLHZvaWQgMD09PWI/Yj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiVhICViICVkICVIOiVNOiVTICVZXFxcIik6U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZm9ybWF0XFxcIixcXFwic3RyaW5nXFxcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKTtsZXQgYz1kYXRlX3RvX3N0cnVjdF90aW1lKHN0cnB0aW1lKFNrLmZmaS5yZW1hcFRvSnMoYSksU2suZmZpLnJlbWFwVG9KcyhiKSwhMCkpO3JldHVybiBjLnZbOF09bmV3IFNrLmJ1aWx0aW4uaW50XygtMSksY30pLGF9O1wiLFwic3JjL2xpYi90aW1laXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRpbWVpdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RvYWlmZi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidG9haWZmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdG9rZW4uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX2ZpbGVfXzpcXFwiL3NyYy9saWIvdG9rZW4ucHlcXFwifTtjb25zdCBiPVtdO2Zvcih0b2tlbiBpbiBTay50b2tlbi50b2tfbmFtZSl7Y29uc3QgYz1Tay50b2tlbi50b2tfbmFtZVt0b2tlbl0uc2xpY2UoMiksZD1wYXJzZUludCh0b2tlbiwxMCk7Yi5wdXNoKFNrLmZmaS5yZW1hcFRvUHkoZCkpLGIucHVzaChTay5mZmkucmVtYXBUb1B5KGMpKSxhW2NdPVNrLmZmaS5yZW1hcFRvUHkoZCl9cmV0dXJuIGEudG9rX25hbWU9bmV3IFNrLmJ1aWx0aW4uZGljdChiKSxhLklTVEVSTUlOQUw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiSVNURVJNSU5BTFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLnRva2VuLklTVEVSTUlOQUwoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhLklTTk9OVEVSTUlOQUw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiSVNOT05URVJNSU5BTFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLnRva2VuLklTTk9OVEVSTUlOQUwoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhLklTRU9GPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIklTRU9GXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2sudG9rZW4uSVNFT0YoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhfTtcIixcInNyYy9saWIvdG9rZW5pemUuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt0b2tlbml6ZTpuZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInRva2VuaXplXFxcIiwxLDEpLFNrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbihhKTtjb25zdCBiPVtdO3JldHVybiBTay5fdG9rZW5pemUoXFxcIjxzdGRpbj5cXFwiLGZ1bmN0aW9uIGpzUmVhZGxpbmUoKXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhKTtyZXR1cm4gU2suZmZpLnJlbWFwVG9KcyhiKX0sXFxcIlVURi04XFxcIixmdW5jdGlvbiByZWNlaXZlVG9rZW4oYSl7Yi5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKFtTay5mZmkucmVtYXBUb1B5KGEudHlwZSksU2suZmZpLnJlbWFwVG9QeShhLnN0cmluZyksbmV3IFNrLmJ1aWx0aW4udHVwbGUoW1NrLmZmaS5yZW1hcFRvUHkoYS5zdGFydFswXSksU2suZmZpLnJlbWFwVG9QeShhLnN0YXJ0WzFdKV0pLG5ldyBTay5idWlsdGluLnR1cGxlKFtTay5mZmkucmVtYXBUb1B5KGEuZW5kWzBdKSxTay5mZmkucmVtYXBUb1B5KGEuZW5kWzFdKV0pLFNrLmZmaS5yZW1hcFRvUHkoYS5saW5lKV0pKX0pLG5ldyBTay5idWlsdGluLmxpc3QoYil9KX07cmV0dXJuIGF9O1wiLFwic3JjL2xpYi90cmFjZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHJhY2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90cmFjZWJhY2sucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRyYWNlYmFjayBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3R0eS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHR5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdHVydGxlLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtcXFwidXNlIHN0cmljdFxcXCI7dmFyIGU9ZnVuY3Rpb24gZ2V0Q29uZmlndXJlZFRhcmdldCgpe3ZhciBlLHQ7Zm9yKGU9U2suVHVydGxlR3JhcGhpY3MmJlNrLlR1cnRsZUdyYXBoaWNzLnRhcmdldHx8XFxcInR1cnRsZVxcXCIsdD1cXFwic3RyaW5nXFxcIj09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ZTt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTtyZXR1cm4gdH0oKTtyZXR1cm4gZS50dXJ0bGVJbnN0YW5jZT9lLnR1cnRsZUluc3RhbmNlLnJlc2V0KCk6ZS50dXJ0bGVJbnN0YW5jZT1mdW5jdGlvbiBnZW5lcmF0ZVR1cnRsZU1vZHVsZShlKXt2YXIgdD1NYXRoLnJvdW5kLHI9TWF0aC5tYXgsbj1NYXRoLnNxcnQsYT1NYXRoLm1pbixzPU1hdGguYWJzLG89TWF0aC5QSSxkPU1hdGguYXRhbjIsXz1NYXRoLnNpbixjPU1hdGguY29zO2Z1bmN0aW9uIGdldEFzc2V0KGUpe3ZhciB0PWcuYXNzZXRzLHI9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHQ/dChlKTp0W2VdO3JldHVyblxcXCJzdHJpbmdcXFwiPT10eXBlb2Ygcj9uZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe3ZhciBhPW5ldyBJbWFnZTthLm9ubG9hZD1mdW5jdGlvbigpe2cuYXNzZXRzW2VdPXRoaXMsdChhKX0sYS5vbmVycm9yPWZ1bmN0aW9uKCl7bihuZXcgRXJyb3IoXFxcIk1pc3NpbmcgYXNzZXQ6IFxcXCIrcikpfSxhLnNyYz1yfSk6bmV3IEluc3RhbnRQcm9taXNlKHZvaWQgMCxyKX1mdW5jdGlvbiBJbnN0YW50UHJvbWlzZShlLHQpe3RoaXMubGFzdFJlc3VsdD10LHRoaXMubGFzdEVycm9yPWV9ZnVuY3Rpb24gRnJhbWVNYW5hZ2VyKCl7dGhpcy5yZXNldCgpfWZ1bmN0aW9uIGdldEZyYW1lTWFuYWdlcigpe3JldHVybiBBfHwoQT1uZXcgRnJhbWVNYW5hZ2VyKSxBfWZ1bmN0aW9uIE1vdXNlSGFuZGxlcigpe3ZhciB0PXRoaXM7Zm9yKHZhciByIGluIHRoaXMuX3RhcmdldD1nZXRUYXJnZXQoKSx0aGlzLl9tYW5hZ2Vycz17fSx0aGlzLl9oYW5kbGVycz17bW91c2Vkb3duOmZ1bmN0aW9uKHIpe3Qub25FdmVudChcXFwibW91c2Vkb3duXFxcIixyKX0sbW91c2V1cDpmdW5jdGlvbihyKXt0Lm9uRXZlbnQoXFxcIm1vdXNldXBcXFwiLHIpfSxtb3VzZW1vdmU6ZnVuY3Rpb24ocil7dC5vbkV2ZW50KFxcXCJtb3VzZW1vdmVcXFwiLHIpfX0sdGhpcy5faGFuZGxlcnMpdGhpcy5fdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIocix0aGlzLl9oYW5kbGVyc1tyXSl9ZnVuY3Rpb24gRXZlbnRNYW5hZ2VyKGUsdCl7dGhpcy5fdHlwZT1lLHRoaXMuX3RhcmdldD10LHRoaXMuX2hhbmRsZXJzPXZvaWQgMCxnZXRNb3VzZUhhbmRsZXIoKS5hZGRNYW5hZ2VyKGUsdGhpcyl9ZnVuY3Rpb24gVHVydGxlKGUpe2lmKGdldEZyYW1lTWFuYWdlcigpLmFkZFR1cnRsZSh0aGlzKSx0aGlzLl9zY3JlZW49Z2V0U2NyZWVuKCksdGhpcy5fbWFuYWdlcnM9e30sdGhpcy5fc2hhcGU9ZS52LCF2Lmhhc093blByb3BlcnR5KHRoaXMuX3NoYXBlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTaGFwZTonXFxcIit0aGlzLl9zaGFwZStcXFwiJyBub3QgaW4gZGVmYXVsdCBzaGFwZSwgcGxlYXNlIGNoZWNrIHNoYXBlIGFnYWluIVxcXCIpO3RoaXMucmVzZXQoKX1mdW5jdGlvbiBTY3JlZW4oKXt2YXIgZSx0O3RoaXMuX2ZyYW1lcz0xLHRoaXMuX2RlbGF5PXZvaWQgMCx0aGlzLl9iZ2NvbG9yPVxcXCJub25lXFxcIix0aGlzLl9tb2RlPVxcXCJzdGFuZGFyZFxcXCIsdGhpcy5fbWFuYWdlcnM9e30sdGhpcy5fa2V5TG9nZ2VyPXt9LGU9KGcud29ybGRXaWR0aHx8Zy53aWR0aHx8Z2V0V2lkdGgoKSkvMix0PShnLndvcmxkSGVpZ2h0fHxnLmhlaWdodHx8Z2V0SGVpZ2h0KCkpLzIsdGhpcy5zZXRVcFdvcmxkKC1lLC10LGUsdCl9ZnVuY3Rpb24gZW5zdXJlQW5vbnltb3VzKCl7cmV0dXJuIGZ8fChmPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh5LlR1cnRsZSkpLGYuaW5zdGFuY2V9ZnVuY3Rpb24gZ2V0VGFyZ2V0KCl7cmV0dXJuIGV9ZnVuY3Rpb24gZ2V0U2NyZWVuKCl7cmV0dXJuIHB8fChwPW5ldyBTY3JlZW4pLHB9ZnVuY3Rpb24gZ2V0TW91c2VIYW5kbGVyKCl7cmV0dXJuIGh8fChoPW5ldyBNb3VzZUhhbmRsZXIpLGh9ZnVuY3Rpb24gZ2V0V2lkdGgoKXtyZXR1cm4gMHwocCYmcC5fd2lkdGh8fGcud2lkdGh8fGdldFRhcmdldCgpLmNsaWVudFdpZHRofHxULndpZHRoKX1mdW5jdGlvbiBnZXRIZWlnaHQoKXtyZXR1cm4gMHwocCYmcC5faGVpZ2h0fHxnLmhlaWdodHx8Z2V0VGFyZ2V0KCkuY2xpZW50SGVpZ2h0fHxULmhlaWdodCl9ZnVuY3Rpb24gY3JlYXRlTGF5ZXIoZSx0KXt2YXIgcixuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGE9Z2V0V2lkdGgoKSxzPWdldEhlaWdodCgpLGw9Z2V0VGFyZ2V0KCkuZmlyc3RDaGlsZD8tcytcXFwicHhcXFwiOlxcXCIwXFxcIjtyZXR1cm4gbi53aWR0aD1hLG4uaGVpZ2h0PXMsbi5zdHlsZS5wb3NpdGlvbj1cXFwicmVsYXRpdmVcXFwiLG4uc3R5bGUuZGlzcGxheT1cXFwiYmxvY2tcXFwiLG4uc3R5bGUuc2V0UHJvcGVydHkoXFxcIm1hcmdpbi10b3BcXFwiLGwpLG4uc3R5bGUuc2V0UHJvcGVydHkoXFxcInotaW5kZXhcXFwiLGUpLHQmJihuLnN0eWxlLmRpc3BsYXk9XFxcIm5vbmVcXFwiKSxnZXRUYXJnZXQoKS5hcHBlbmRDaGlsZChuKSxyPW4uZ2V0Q29udGV4dChcXFwiMmRcXFwiKSxyLmxpbmVDYXA9XFxcInJvdW5kXFxcIixyLmxpbmVKb2luPVxcXCJyb3VuZFxcXCIsYXBwbHlXb3JsZChnZXRTY3JlZW4oKSxyKSxyfWZ1bmN0aW9uIGNhbmNlbEFuaW1hdGlvbkZyYW1lKCl7dSYmKCh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSkodSksdT12b2lkIDApLG0mJih3aW5kb3cuY2xlYXJUaW1lb3V0KG0pLG09dm9pZCAwKX1mdW5jdGlvbiBhcHBseVdvcmxkKGUsdCl7dmFyIHI9ZS5sbHgsbj1lLmxseSxhPWUudXJ4LHM9ZS51cnksbD1lLnhTY2FsZSxpPWUueVNjYWxlO3QmJihjbGVhckxheWVyKHQpLHQucmVzdG9yZSgpLHQuc2F2ZSgpLHQuc2NhbGUoMS9sLDEvaSksdC50cmFuc2xhdGUoLXIsLXMpKX1mdW5jdGlvbiBwdXNoVW5kbyhlKXt2YXIgdCxyLG47aWYoZy5hbGxvd1VuZG8mJmUuX2J1ZmZlclNpemUpe2ZvcihlLl91bmRvQnVmZmVyfHwoZS5fdW5kb0J1ZmZlcj1bXSk7ZS5fdW5kb0J1ZmZlci5sZW5ndGg+ZS5fYnVmZmVyU2l6ZTspZS5fdW5kb0J1ZmZlci5zaGlmdCgpO2ZvcihyPXt9LHQ9W1xcXCJ4XFxcIixcXFwieVxcXCIsXFxcImFuZ2xlXFxcIixcXFwicmFkaWFuc1xcXCIsXFxcImNvbG9yXFxcIixcXFwiZmlsbFxcXCIsXFxcImRvd25cXFwiLFxcXCJmaWxsaW5nXFxcIixcXFwic2hvd25cXFwiLFxcXCJzaGFwZVxcXCIsXFxcInNpemVcXFwiXSxuPTA7bjx0Lmxlbmd0aDtuKyspclt0W25dXT1lW1xcXCJfXFxcIit0W25dXTtyZXR1cm4gZS5fdW5kb0J1ZmZlci5wdXNoKHIpLGUuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7ci5maWxsQnVmZmVyPXRoaXMuZmlsbEJ1ZmZlcj90aGlzLmZpbGxCdWZmZXIuc2xpY2UoKTp2b2lkIDAsZS5fcGFwZXImJmUuX3BhcGVyLmNhbnZhcyYmKHIuaW1hZ2U9ZS5fcGFwZXIuY2FudmFzLnRvRGF0YVVSTCgpKX0sITEpfX1mdW5jdGlvbiBwb3BVbmRvKGUpe3ZhciB0O2lmKGUuX2J1ZmZlclNpemUmJmUuX3VuZG9CdWZmZXImJih0PWUuX3VuZG9CdWZmZXIucG9wKCksISF0KSl7Zm9yKHZhciByIGluIHQpXFxcImltYWdlXFxcIiE9ciYmXFxcImZpbGxCdWZmZXJcXFwiIT09ciYmKGVbXFxcIl9cXFwiK3JdPXRbcl0pO3JldHVybiBlLmFkZFVwZGF0ZShmdW5jdGlvbigpe3ZhciBlO3QuaW1hZ2UmJihMLnNyYz10LmltYWdlLGU9TCksY2xlYXJMYXllcih0aGlzLmNvbnRleHQoKSwhMSxMKSxkZWxldGUgdC5pbWFnZX0sITAsdCl9fWZ1bmN0aW9uIHJlbW92ZUxheWVyKGUpe2UmJmUuY2FudmFzJiZlLmNhbnZhcy5wYXJlbnROb2RlJiZlLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUuY2FudmFzKX1mdW5jdGlvbiBjbGVhckxheWVyKGUsdCxyKXtlJiYoZS5zYXZlKCksZS5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLHQ/KGUuZmlsbFN0eWxlPXQsZS5maWxsUmVjdCgwLDAsZS5jYW52YXMud2lkdGgsZS5jYW52YXMuaGVpZ2h0KSk6ZS5jbGVhclJlY3QoMCwwLGUuY2FudmFzLndpZHRoLGUuY2FudmFzLmhlaWdodCksciYmZS5kcmF3SW1hZ2UociwwLDApLGUucmVzdG9yZSgpKX1mdW5jdGlvbiBkcmF3VHVydGxlKGUsdCl7dmFyIHIsbixhLHM9dltlLnNoYXBlXSxsPWdldFNjcmVlbigpLHU9Z2V0V2lkdGgoKSxtPWdldEhlaWdodCgpLHA9bC54U2NhbGUsZz1sLnlTY2FsZTtpZih0KXtpZihyPWMoZS5yYWRpYW5zKS9wLG49XyhlLnJhZGlhbnMpL2csYT1kKG4sciktby8yLHQuc2F2ZSgpLHQudHJhbnNsYXRlKGUueCxlLnkpLHQuc2NhbGUocCxnKSxzLm5vZGVOYW1lKXt2YXIgZj1zLm5hdHVyYWxXaWR0aCxoPXMubmF0dXJhbEhlaWdodDt0LmRyYXdJbWFnZShzLDAsMCxmLGgsLWYvMiwtaC8yLGYsaCl9ZWxzZXt0LnJvdGF0ZShhKSx0LmJlZ2luUGF0aCgpLHQubGluZVdpZHRoPTEsdC5zdHJva2VTdHlsZT1lLmNvbG9yLHQuZmlsbFN0eWxlPWUuZmlsbCx0Lm1vdmVUbygtc1swXVswXSxzWzBdWzFdKTtmb3IodmFyICQ9MTskPHMubGVuZ3RoOyQrKyl0LmxpbmVUbygtc1skXVswXSxzWyRdWzFdKTt0LmNsb3NlUGF0aCgpLHQuZmlsbCgpLHQuc3Ryb2tlKCl9dC5yZXN0b3JlKCl9fWZ1bmN0aW9uIGRyYXdEb3QoZSx0KXt2YXIgcj10aGlzLmNvbnRleHQoKSxuPWdldFNjcmVlbigpLGw9bi54U2NhbGUsaT1uLnlTY2FsZTtyJiYoci5iZWdpblBhdGgoKSxyLm1vdmVUbyh0aGlzLngsdGhpcy55KSxlKj1hKHMobCkscyhpKSksci5hcmModGhpcy54LHRoaXMueSxlLzIsMCxUdXJ0bGUuUkFESUFOUyksci5jbG9zZVBhdGgoKSxyLmZpbGxTdHlsZT10fHx0aGlzLmNvbG9yLHIuZmlsbCgpKX1mdW5jdGlvbiBtZWFzdXJlVGV4dChlLHQpe3JldHVybiB0JiYoUy5mb250PXQpLFMubWVhc3VyZVRleHQoZSkud2lkdGh9ZnVuY3Rpb24gZHJhd1RleHQoZSx0LHIpe3ZhciBuPXRoaXMuY29udGV4dCgpO24mJihuLnNhdmUoKSxyJiYobi5mb250PXIpLHQmJnQubWF0Y2goL14obGVmdHxyaWdodHxjZW50ZXIpJC8pJiYobi50ZXh0QWxpZ249dCksbi5zY2FsZSgxLC0xKSxuLmZpbGxTdHlsZT10aGlzLmZpbGwsbi5maWxsVGV4dChlLHRoaXMueCwtdGhpcy55KSxuLnJlc3RvcmUoKSl9ZnVuY3Rpb24gZHJhd0xpbmUoZSx0KXt2YXIgcj10aGlzLmNvbnRleHQoKTtyJiYodCYmKHIuYmVnaW5QYXRoKCksci5tb3ZlVG8odGhpcy54LHRoaXMueSkpLHIubGluZVdpZHRoPXRoaXMuc2l6ZSpnZXRTY3JlZW4oKS5saW5lU2NhbGUsci5zdHJva2VTdHlsZT10aGlzLmNvbG9yLHIubGluZVRvKGUueCxlLnkpLHIuc3Ryb2tlKCkpfWZ1bmN0aW9uIGRyYXdGaWxsKCl7dmFyIGUsdD10aGlzLmNvbnRleHQoKSxyPXRoaXMuZmlsbEJ1ZmZlcjtpZih0JiZyJiZyLmxlbmd0aCl7Zm9yKHQuc2F2ZSgpLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oclswXS54LHJbMF0ueSksZT0xO2U8ci5sZW5ndGg7ZSsrKXQubGluZVRvKHJbZV0ueCxyW2VdLnkpO2Zvcih0LmNsb3NlUGF0aCgpLHQuZmlsbFN0eWxlPXRoaXMuZmlsbCx0LmZpbGwoKSxlPTE7ZTxyLmxlbmd0aDtlKyspcltlXS5zdHJva2UmJih0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHJbZS0xXS54LHJbZS0xXS55KSx0LmxpbmVXaWR0aD1yW2VdLnNpemUqZ2V0U2NyZWVuKCkubGluZVNjYWxlLHQuc3Ryb2tlU3R5bGU9cltlXS5jb2xvcix0LmxpbmVUbyhyW2VdLngscltlXS55KSx0LnN0cm9rZSgpKTt0LnJlc3RvcmUoKX19ZnVuY3Rpb24gcGFydGlhbFRyYW5zbGF0ZShlLHQscixuLGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFkZFVwZGF0ZShmdW5jdGlvbihlKXt0aGlzLmRvd24mJmRyYXdMaW5lLmNhbGwodGhpcyxlLG4pfSxhLHt4OnQseTpyfSxuKX19ZnVuY3Rpb24gdHJhbnNsYXRlKGUsYSxsLG8sZCxfLGMpe3ZhciB1LG09ZS5fY29tcHV0ZWRfc3BlZWQscD1nZXRTY3JlZW4oKSxnPXMocC54U2NhbGUpLGY9cyhwLnlTY2FsZSksaD1hLCQ9bCx3PW4obypvKmcrZCpkKmYpLGI9bT90KHIoMSx3L20pKToxLHY9Z2V0RnJhbWVNYW5hZ2VyKCkud2lsbFJlbmRlck5leHQoKT9Qcm9taXNlLnJlc29sdmUoKTpuZXcgSW5zdGFudFByb21pc2U7Zm9yKGUuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7dGhpcy5maWxsaW5nJiZ0aGlzLmZpbGxCdWZmZXIucHVzaCh7eDp0aGlzLngseTp0aGlzLnksc3Ryb2tlOnRoaXMuZG93bixjb2xvcjp0aGlzLmNvbG9yLHNpemU6dGhpcy5zaXplfSl9LCExKSx1PTA7dTxiO3UrKyloPWErby9iKih1KzEpLCQ9bCtkL2IqKHUrMSksdj12LnRoZW4ocGFydGlhbFRyYW5zbGF0ZShlLGgsJCxfLG18fCFjKSksXz0hMTtyZXR1cm4gdi50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuW2ErbyxsK2RdfSl9ZnVuY3Rpb24gcGFydGlhbFJvdGF0ZShlLHQscixuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGRVcGRhdGUodm9pZCAwLG4se2FuZ2xlOnQscmFkaWFuczpyfSl9fWZ1bmN0aW9uIHJvdGF0ZShlLG4sYSxsKXt2YXIgbyxkPWUuX2NvbXB1dGVkX3NwZWVkLF89MzYwKihhL2UuX2Z1bGxDaXJjbGUpLGM9ZD90KHIoMSxzKF8pL2QpKToxLHU9e30sbT1nZXRGcmFtZU1hbmFnZXIoKS53aWxsUmVuZGVyTmV4dCgpP1Byb21pc2UucmVzb2x2ZSgpOm5ldyBJbnN0YW50UHJvbWlzZTtmb3Iobz0wO288YztvKyspY2FsY3VsYXRlSGVhZGluZyhlLG4rYS9jKihvKzEpLHUpLG09bS50aGVuKHBhcnRpYWxSb3RhdGUoZSx1LmFuZ2xlLHUucmFkaWFucyxkfHwhbCkpO3JldHVybiBtLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY2FsY3VsYXRlSGVhZGluZyhlLG4rYSl9KX1mdW5jdGlvbiBnZXRDb29yZGluYXRlcyhlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD1lJiYoZS55fHxlLl95fHxlWzFdKXx8MCxlPWUmJihlLnh8fGUuX3h8fGVbMF0pfHwwKSx7eDplLHk6dH19ZnVuY3Rpb24gaGV4VG9SR0IoZSl7dmFyIHQscixuO3JldHVybih0PS9ecmdiYT9cXFxcKChcXFxcZCspLChcXFxcZCspLChcXFxcZCspKD86LChbLlxcXFxkXSspKT9cXFxcKSQvLmV4ZWMoZSkpPyhuPVtwYXJzZUludCh0WzFdKSxwYXJzZUludCh0WzJdKSxwYXJzZUludCh0WzNdKV0sdFs0XSYmbi5wdXNoKHBhcnNlRmxvYXQodFs0XSkpKTovXiM/W2EtZlxcXFxkXXszfXxbYS1mXFxcXGRdezZ9JC9pLmV4ZWMoZSk/KDQ9PT1lLmxlbmd0aCYmKGU9ZS5yZXBsYWNlKC9eIz8oW2EtZlxcXFxkXSkoW2EtZlxcXFxkXSkoW2EtZlxcXFxkXSkkL2ksZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHQrdCtyK3IrbitufSkpLHI9L14jPyhbYS1mXFxcXGRdezJ9KShbYS1mXFxcXGRdezJ9KShbYS1mXFxcXGRdezJ9KSQvaS5leGVjKGUpLG49W3BhcnNlSW50KHJbMV0sMTYpLHBhcnNlSW50KHJbMl0sMTYpLHBhcnNlSW50KHJbM10sMTYpXSk6bj1lLG59ZnVuY3Rpb24gY3JlYXRlQ29sb3IoZSx0LG4scyxsKXt2YXIgbztpZih2b2lkIDAhPT1uJiYodD1bdCxuLHMsbF0pLHQuY29uc3RydWN0b3I9PT1BcnJheSYmdC5sZW5ndGgpe2lmKDI1NT09PWUpe2ZvcihvPTA7Mz5vO28rKylpZihcXFwibnVtYmVyXFxcIj09dHlwZW9mIHRbb10pdFtvXT1yKDAsYSgyNTUscGFyc2VJbnQodFtvXSkpKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImJhZCBjb2xvciBzZXF1ZW5jZVxcXCIpO31lbHNlIGZvcihvPTA7Mz5vO28rKylpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIHRbb10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIGNvbG9yIHNlcXVlbmNlXFxcIik7ZWxzZSBpZigxPj10W29dKXRbb109cigwLGEoMjU1LHBhcnNlSW50KDI1NSp0W29dKSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIGNvbG9yIHNlcXVlbmNlXFxcIik7XFxcIm51bWJlclxcXCI9PXR5cGVvZiB0W29dPyh0WzNdPXIoMCxhKDEsdFtvXSkpLHQ9XFxcInJnYmEoXFxcIit0LmpvaW4oXFxcIixcXFwiKStcXFwiKVxcXCIpOnQ9XFxcInJnYihcXFwiK3Quc2xpY2UoMCwzKS5qb2luKFxcXCIsXFxcIikrXFxcIilcXFwifWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiB0JiYhdC5tYXRjaCgvXFxcXHMqdXJsXFxcXHMqXFxcXCgvaSkpdD10LnJlcGxhY2UoL1xcXFxzKy9nLFxcXCJcXFwiKTtlbHNlIHJldHVyblxcXCJibGFja1xcXCI7cmV0dXJuIHR9ZnVuY3Rpb24gY2FsY3VsYXRlSGVhZGluZyhlLHQscil7dmFyIG49ZS5fYW5nbGV8fDAsYT1lLl9yYWRpYW5zfHwwO3JldHVybiByfHwocj17fSksXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYoZS5faXNSYWRpYW5zP249YT10JVR1cnRsZS5SQURJQU5TOmUuX2Z1bGxDaXJjbGU/KG49dCVlLl9mdWxsQ2lyY2xlLGE9bi9lLl9mdWxsQ2lyY2xlKlR1cnRsZS5SQURJQU5TKTpuPWE9MCwwPm4mJihuKz1lLl9mdWxsQ2lyY2xlLGErPVR1cnRsZS5SQURJQU5TKSksci5hbmdsZT1uLHIucmFkaWFucz1hLHJ9ZnVuY3Rpb24gcHl0aG9uVG9KYXZhc2NyaXB0RnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLG49ci5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoZSl9KTtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHQmJm4udW5zaGlmdCh0KSxTay5taXNjZXZhbC5hcHBseUFzeW5jKHZvaWQgMCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLG4pLmNhdGNoKFNrLnVuY2F1Z2h0RXhjZXB0aW9uKX19ZnVuY3Rpb24gYWRkTW9kdWxlTWV0aG9kKGUsdCxyLG4pe3ZhciBhLHM9ci5yZXBsYWNlKC9eXFxcXCQvLFxcXCJcXFwiKSxsPXMucmVwbGFjZSgvX1xcXFwkW2Etel0rXFxcXCQkL2ksXFxcIlxcXCIpLG89ZS5wcm90b3R5cGVbcl0ubGVuZ3RoLGQ9ZS5wcm90b3R5cGVbcl0ubWluQXJncyxfPWUucHJvdG90eXBlW3JdLmNvX3Zhcm5hbWVzfHxbXSxjPWUucHJvdG90eXBlW3JdLnJldHVyblR5cGUsdT1lLnByb3RvdHlwZVtyXS5pc1NrO3ZvaWQgMD09PWQmJihkPW8pLGE9ZnVuY3Rpb24oKXt2YXIgZSx0LGEscyxfLG09QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLHA9bj9uKCk6bS5zaGlmdCgpLmluc3RhbmNlO2lmKG0ubGVuZ3RoPGR8fG0ubGVuZ3RoPm8pdGhyb3cgXz1kPT09bz9cXFwiZXhhY3RseSBcXFwiK286XFxcImJldHdlZW4gXFxcIitkK1xcXCIgYW5kIFxcXCIrbyxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IobCtcXFwiKCkgdGFrZXMgXFxcIitfK1xcXCIgcG9zaXRpb25hbCBhcmd1bWVudChzKSAoXFxcIittLmxlbmd0aCtcXFwiIGdpdmVuKVxcXCIpO2ZvcihlPW0ubGVuZ3RoOzA8PS0tZTspdm9pZCAwIT09bVtlXSYmKG1bZV09bVtlXWluc3RhbmNlb2YgU2suYnVpbHRpbi5mdW5jP3B5dGhvblRvSmF2YXNjcmlwdEZ1bmN0aW9uKG1bZV0pOm1bZV1pbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kP3B5dGhvblRvSmF2YXNjcmlwdEZ1bmN0aW9uKG1bZV0uaW1fZnVuYyxtW2VdLmltX3NlbGYpOm1bZV0mJm1bZV0uJGQgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QmJm1bZV0uaW5zdGFuY2U/bVtlXS5pbnN0YW5jZTpTay5mZmkucmVtYXBUb0pzKG1bZV0pKTt2YXIgZz1tLnNsaWNlKDApO2ZvcihtPVtdLGU9Zy5sZW5ndGg7MDw9ZTstLWUpbnVsbCE9PWdbZV0mJihtW2VdPWdbZV0pO3RyeXt0PXBbcl0uYXBwbHkocCxtKX1jYXRjaCh0KXt0aHJvdyB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiYod2luZG93LmNvbnNvbGUubG9nKFxcXCJ3cmFwcGVkIG1ldGhvZCBmYWlsZWRcXFwiKSx3aW5kb3cuY29uc29sZS5sb2codC5zdGFjaykpLHR9cmV0dXJuIHQgaW5zdGFuY2VvZiBJbnN0YW50UHJvbWlzZSYmKHQ9dC5sYXN0UmVzdWx0KSx0IGluc3RhbmNlb2YgUHJvbWlzZT8odD10LmNhdGNoKGZ1bmN0aW9uKHQpe3Rocm93IHdpbmRvdyYmd2luZG93LmNvbnNvbGUmJih3aW5kb3cuY29uc29sZS5sb2coXFxcInByb21pc2UgZmFpbGVkXFxcIiksd2luZG93LmNvbnNvbGUubG9nKHQuc3RhY2spKSx0fSksYT1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbixhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1zP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpTay5mZmkucmVtYXBUb1B5KHMpfSxhLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6dC50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBzPWUsZX0pfSxhKTp2b2lkIDA9PT10P1NrLmJ1aWx0aW4ubm9uZS5ub25lJDp1P3Q6XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGM/Yyh0KTpTay5mZmkucmVtYXBUb1B5KHQpfSxhLmNvX25hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKGwpLGEuY29fdmFybmFtZXM9Xy5zbGljZSgpLGEuJGRlZmF1bHRzPVtdO2Zvcih2YXIgbT1kO208Xy5sZW5ndGg7bSsrKWEuJGRlZmF1bHRzLnB1c2goU2suYnVpbHRpbi5ub25lLm5vbmUkKTtufHxhLmNvX3Zhcm5hbWVzLnVuc2hpZnQoXFxcInNlbGZcXFwiKSx0W3NdPW5ldyBTay5idWlsdGluLmZ1bmMoYSl9ZnVuY3Rpb24gaW5pdFR1cnRsZShlLHQpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMsMiwzLCExLCExKSxlLmluc3RhbmNlPW5ldyBUdXJ0bGUodCksZS5pbnN0YW5jZS5za0luc3RhbmNlPWV9ZnVuY3Rpb24gZm9jdXNUdXJ0bGUoZSl7cmV0dXJuIHZvaWQgMCE9PWUmJih3PSEhZSx3P2dldFRhcmdldCgpLmZvY3VzKCk6Z2V0VGFyZ2V0KCkuYmx1cigpKSx3fWZ1bmN0aW9uIHJlc2V0VHVydGxlKCl7Zm9yKGNhbmNlbEFuaW1hdGlvbkZyYW1lKCksZ2V0U2NyZWVuKCkucmVzZXQoKSxnZXRGcmFtZU1hbmFnZXIoKS5yZXNldCgpO2UuZmlyc3RDaGlsZDspZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO2gmJmgucmVzZXQoKSwkPTAscD12b2lkIDAsZj12b2lkIDAsaD12b2lkIDAsaz0wfWZ1bmN0aW9uIHN0b3BUdXJ0bGUoKXtjYW5jZWxBbmltYXRpb25GcmFtZSgpLGgmJmgucmVzZXQoKSwkPTAscD12b2lkIDAsZj12b2lkIDAsaD12b2lkIDAsaz0wfXZhciB1LG0scCxnLGYsaCx5PXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcInR1cnRsZVxcXCIpfSwkPTAsdz0hMCxiPTFlMy8zMCx2PXt9LGs9MCx4PXt9LFQ9e3RhcmdldDpcXFwidHVydGxlXFxcIix3aWR0aDo0MDAsaGVpZ2h0OjQwMCx3b3JsZFdpZHRoOjAsd29ybGRIZWlnaHQ6MCxhbmltYXRlOiEwLGJ1ZmZlclNpemU6MCxhbGxvd1VuZG86ITAsYXNzZXRzOnt9fTtlLmhhc0F0dHJpYnV0ZShcXFwidGFiaW5kZXhcXFwiKXx8ZS5zZXRBdHRyaWJ1dGUoXFxcInRhYmluZGV4XFxcIiwwKSx4LkZMT0FUPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSl9LHguQ09MT1I9ZnVuY3Rpb24oZSl7aWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZSk7Zm9yKHZhciB0PTA7Mz50O3QrKyllW3RdPVNrLmJ1aWx0aW4uYXNzayQoZVt0XSk7cmV0dXJuIDQ9PT1lLmxlbmd0aCYmKGVbM109bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGVbM10pKSxuZXcgU2suYnVpbHRpbi50dXBsZShlKX0seC5UVVJUTEVfTElTVD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10scj0wO3I8ZS5sZW5ndGg7cisrKXQucHVzaChlW3JdLnNrSW5zdGFuY2UpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZSh0KX0sdi5hcnJvdz1bWy0xMCwwXSxbMTAsMF0sWzAsMTBdXSx2LnNxdWFyZT1bWzEwLC0xMF0sWzEwLDEwXSxbLTEwLDEwXSxbLTEwLC0xMF1dLHYudHJpYW5nbGU9W1sxMCwtNS43N10sWzAsMTEuNTVdLFstMTAsLTUuNzddXSx2LmNsYXNzaWM9W1swLDBdLFstNSwtOV0sWzAsLTddLFs1LC05XV0sdi50dXJ0bGU9W1swLDE2XSxbLTIsMTRdLFstMSwxMF0sWy00LDddLFstNyw5XSxbLTksOF0sWy02LDVdLFstNywxXSxbLTUsLTNdLFstOCwtNl0sWy02LC04XSxbLTQsLTVdLFswLC03XSxbNCwtNV0sWzYsLThdLFs4LC02XSxbNSwtM10sWzcsMV0sWzYsNV0sWzksOF0sWzcsOV0sWzQsN10sWzEsMTBdLFsyLDE0XV0sdi5jaXJjbGU9W1sxMCwwXSxbOS41MSwzLjA5XSxbOC4wOSw1Ljg4XSxbNS44OCw4LjA5XSxbMy4wOSw5LjUxXSxbMCwxMF0sWy0zLjA5LDkuNTFdLFstNS44OCw4LjA5XSxbLTguMDksNS44OF0sWy05LjUxLDMuMDldLFstMTAsMF0sWy05LjUxLC0zLjA5XSxbLTguMDksLTUuODhdLFstNS44OCwtOC4wOV0sWy0zLjA5LC05LjUxXSxbLTAsLTEwXSxbMy4wOSwtOS41MV0sWzUuODgsLTguMDldLFs4LjA5LC01Ljg4XSxbOS41MSwtMy4wOV1dLGc9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gU2suVHVydGxlR3JhcGhpY3N8fChTay5UdXJ0bGVHcmFwaGljcz17fSksVClTay5UdXJ0bGVHcmFwaGljcy5oYXNPd25Qcm9wZXJ0eShlKXx8KFNrLlR1cnRsZUdyYXBoaWNzW2VdPVRbZV0pO3JldHVybiBTay5UdXJ0bGVHcmFwaGljc30oKSxJbnN0YW50UHJvbWlzZS5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihlKXtpZih0aGlzLmxhc3RFcnJvcilyZXR1cm4gdGhpczt0cnl7dGhpcy5sYXN0UmVzdWx0PWUodGhpcy5sYXN0UmVzdWx0KX1jYXRjaCh0KXt0aGlzLmxhc3RSZXN1bHQ9dm9pZCAwLHRoaXMubGFzdEVycm9yPXR9cmV0dXJuIHRoaXMubGFzdFJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2U/dGhpcy5sYXN0UmVzdWx0OnRoaXN9LEluc3RhbnRQcm9taXNlLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihlKXtpZih0aGlzLmxhc3RFcnJvcil0cnl7dGhpcy5sYXN0UmVzdWx0PWUodGhpcy5sYXN0RXJyb3IpLHRoaXMubGFzdEVycm9yPXZvaWQgMH1jYXRjaCh0KXt0aGlzLmxhc3RSZXN1bHQ9dm9pZCAwLHRoaXMubGFzdEVycm9yPXR9cmV0dXJuIHRoaXMubGFzdFJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2U/dGhpcy5sYXN0UmVzdWx0OnRoaXN9O3ZhciBBOyhmdW5jdGlvbihlKXtmdW5jdGlvbiBhbmltYXRpb25GcmFtZShlKXtyZXR1cm4gZy5hbmltYXRlPyFlJiZ0P3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG09d2luZG93LnNldFRpbWVvdXQodCxlfHxiKSxtfTpmdW5jdGlvbihlKXtlKCl9fXZhciB0OyhmdW5jdGlvbihlKXtlJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gdT1lKHQpfSl9KSh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSxlLndpbGxSZW5kZXJOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fYnVmZmVyJiZ0aGlzLl9mcmFtZUNvdW50KzE9PT10aGlzLmZyYW1lQnVmZmVyKCkpfSxlLnR1cnRsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHVydGxlc30sZS5hZGRUdXJ0bGU9ZnVuY3Rpb24oZSl7dGhpcy5fdHVydGxlcy5wdXNoKGUpfSxlLnJlc2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5fdHVydGxlcylmb3IodmFyIGU9dGhpcy5fdHVydGxlcy5sZW5ndGg7MDw9LS1lOyl0aGlzLl90dXJ0bGVzW2VdLnJlc2V0KCk7dGhpcy5fdHVydGxlcz1bXSx0aGlzLl9mcmFtZXM9W10sdGhpcy5fZnJhbWVDb3VudD0wLHRoaXMuX2J1ZmZlcj0xLHRoaXMuX3JhdGU9MCx0aGlzLl9hbmltYXRpb25GcmFtZT1hbmltYXRpb25GcmFtZSgpfSxlLmFkZEZyYW1lPWZ1bmN0aW9uKGUsdCl7dmFyIHI9ITE7cmV0dXJuIHQmJih0aGlzLl9mcmFtZUNvdW50Kz0xKSx0aGlzLmZyYW1lcygpLnB1c2goZSkscj0hZy5hbmltYXRlfHx0aGlzLl9idWZmZXImJnRoaXMuX2ZyYW1lQ291bnQ9PT10aGlzLmZyYW1lQnVmZmVyKCkscj90aGlzLnVwZGF0ZSgpOm5ldyBJbnN0YW50UHJvbWlzZX0sZS5mcmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJhbWVzfSxlLmZyYW1lQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVyblxcXCJudW1iZXJcXFwiPT10eXBlb2YgZSYmKHRoaXMuX2J1ZmZlcj0wfGUsZSYmZTw9dGhpcy5fZnJhbWVDb3VudCk/dGhpcy51cGRhdGUoKTp0aGlzLl9idWZmZXJ9LGUucmVmcmVzaEludGVydmFsPWZ1bmN0aW9uKGUpe3JldHVyblxcXCJudW1iZXJcXFwiPT10eXBlb2YgZSYmKHRoaXMuX3JhdGU9MHxlLHRoaXMuX2FuaW1hdGlvbkZyYW1lPWFuaW1hdGlvbkZyYW1lKGUpKSx0aGlzLl9yYXRlfSxlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mcmFtZXMmJnRoaXMuX2ZyYW1lcy5sZW5ndGg/dGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKTpuZXcgSW5zdGFudFByb21pc2V9LGUucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKCl7dmFyIGUsdCxyPXRoaXMuX2ZyYW1lcyxuPXRoaXMuX2FuaW1hdGlvbkZyYW1lLGE9dGhpcy5fdHVydGxlcyxzPWdldFNjcmVlbigpLnNwcml0ZUxheWVyKCk7cmV0dXJuIHRoaXMuX2ZyYW1lcz1bXSx0aGlzLl9mcmFtZUNvdW50PTAsbmV3IFByb21pc2UoZnVuY3Rpb24obCl7bihmdW5jdGlvbiBwYWludCgpe2Zvcih0PTA7dDxyLmxlbmd0aDt0Kyspclt0XSYmclt0XSgpO2ZvcihjbGVhckxheWVyKHMpLHQ9MDt0PGEubGVuZ3RoO3QrKyllPWFbdF0sZS5nZXRTdGF0ZSgpLnNob3duJiZkcmF3VHVydGxlKGUuZ2V0U3RhdGUoKSxzKTtsKCl9KX0pfX0pKEZyYW1lTWFuYWdlci5wcm90b3R5cGUpLGZ1bmN0aW9uKGUpe2Uub25FdmVudD1mdW5jdGlvbih0LHIpe2Z1bmN0aW9uIGNvbXB1dGVDb29yZGluYXRlcygpe2lmKCFfKXt2YXIgdD1nZXRTY3JlZW4oKSxsPXQuc3ByaXRlTGF5ZXIoKS5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZT0wfHIuY2xpZW50WC1sLmxlZnQsbj0wfHIuY2xpZW50WS1sLnRvcCxhPWUqdC54U2NhbGUrdC5sbHgscz1uKnQueVNjYWxlK3QudXJ5LF89ITB9fXZhciBlLG4sYSxzLGwsbz10aGlzLl9tYW5hZ2Vyc1t0XSxkPXRoaXMuX21hbmFnZXJzLm1vdXNlbW92ZSxfPSExO2lmKChcXFwibW91c2Vkb3duXFxcIj09PXR8fFxcXCJtb3VzZXVwXFxcIj09PXQpJiZkJiZkLmxlbmd0aClmb3IoY29tcHV0ZUNvb3JkaW5hdGVzKCksbD1kLmxlbmd0aDswPD0tLWw7KWRbbF0udGVzdChlLG4sYSxzKSYmZFtsXS5jYW5Nb3ZlKFxcXCJtb3VzZWRvd25cXFwiPT09dCk7aWYobyYmby5sZW5ndGgpZm9yKGNvbXB1dGVDb29yZGluYXRlcygpLGw9by5sZW5ndGg7MDw9LS1sOylcXFwibW91c2Vtb3ZlXFxcIj09PXQmJm9bbF0uY2FuTW92ZSgpJiZvW2xdLnRlc3QoZSxuLGEscyk/b1tsXS50cmlnZ2VyKFthLHNdKTpcXFwibW91c2Vkb3duXFxcIj09PXQmJm9bbF0udGVzdChlLG4sYSxzKSYmb1tsXS50cmlnZ2VyKFthLHNdKX0sZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuX21hbmFnZXJzPXt9fSxlLmFkZE1hbmFnZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl9tYW5hZ2Vyc1tlXXx8KHRoaXMuX21hbmFnZXJzW2VdPVtdKSx0aGlzLl9tYW5hZ2Vyc1tlXS5wdXNoKHQpfX0oTW91c2VIYW5kbGVyLnByb3RvdHlwZSksZnVuY3Rpb24oZSl7ZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuX2hhbmRsZXJzPXZvaWQgMH0sZS5jYW5Nb3ZlPWZ1bmN0aW9uKGUpe3JldHVybiEhKHRoaXMuX3RhcmdldCYmdGhpcy5fdGFyZ2V0LmhpdFRlc3QpJiYodm9pZCAwIT09ZSYmKHRoaXMuX3RhcmdldC5oaXRUZXN0LmhpdD1lKSx0aGlzLl90YXJnZXQuaGl0VGVzdC5oaXQpfSxlLnRlc3Q9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHRoaXMuX3RhcmdldCYmdGhpcy5fdGFyZ2V0LmhpdFRlc3Q/dGhpcy5fdGFyZ2V0LmhpdFRlc3QoZSx0LHIsbik6ISF0aGlzLl90YXJnZXR9LGUudHJpZ2dlcj1mdW5jdGlvbihlKXt2YXIgdCxyPXRoaXMuX2hhbmRsZXJzO2lmKHImJnIubGVuZ3RoKWZvcih0PTA7dDxyLmxlbmd0aDt0Kyspclt0XS5hcHBseSh7fSxlKX0sZS5hZGRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5faGFuZGxlcnM7aWYoIXQmJnImJnIubGVuZ3RoKWZvcig7ci5zaGlmdCgpOyk7cmV0dXJuXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGU/dm9pZCghciYmKHI9dGhpcy5faGFuZGxlcnM9W10pLHIucHVzaChlKSk6dm9pZChyJiYhci5sZW5ndGgmJnRoaXMucmVzZXQoKSl9fShFdmVudE1hbmFnZXIucHJvdG90eXBlKSxUdXJ0bGUuUkFESUFOUz0yKm8sZnVuY3Rpb24oZSl7ZnVuY3Rpb24gY2lyY2xlUm90YXRlKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGRVcGRhdGUodm9pZCAwLCExLHthbmdsZTp0LHJhZGlhbnM6cn0pfX1mdW5jdGlvbiBjaXJjbGVTZWdtZW50KGUsdCxyLG4sYSxzKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS50cmFuc2xhdGUodCxyLG4sYSxzLCEwKX19ZS5oaXRUZXN0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0U2NyZWVuKCkuaGl0VGVzdExheWVyKCk7Y2xlYXJMYXllcihyKSxkcmF3VHVydGxlKHRoaXMuZ2V0U3RhdGUoKSxyKTt2YXIgbj1yLmdldEltYWdlRGF0YShlLHQsMSwxKS5kYXRhO3JldHVybiBuWzNdfHxuWzBdfHxuWzFdfHxuWzJdfSxlLmFkZFVwZGF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpcyxhPXRoaXMuZ2V0U3RhdGUoKSxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyxyPzI6Myk7cmV0dXJuIGdldEZyYW1lTWFuYWdlcigpLmFkZEZyYW1lKGZ1bmN0aW9uKCl7aWYoZSYmZS5hcHBseShhLHMpLHIpZm9yKHZhciB0IGluIHIpYVt0XT1yW3RdfSx0KX0sZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX3N0YXRlfHwodGhpcy5fc3RhdGU9e3g6dGhpcy5feCx5OnRoaXMuX3ksYW5nbGU6dGhpcy5fYW5nbGUscmFkaWFuczp0aGlzLl9yYWRpYW5zLHNoYXBlOnRoaXMuX3NoYXBlLGNvbG9yOnRoaXMuX2NvbG9yLGZpbGw6dGhpcy5fZmlsbCxmaWxsaW5nOnRoaXMuX2ZpbGxpbmcsc2l6ZTp0aGlzLl9zaXplLHNwZWVkOnRoaXMuX2NvbXB1dGVkX3NwZWVkLGRvd246dGhpcy5fZG93bixzaG93bjp0aGlzLl9zaG93bixjb2xvck1vZGU6dGhpcy5fY29sb3JNb2RlLGNvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRQYXBlcigpfX0pLHRoaXMuX3N0YXRlfSxlLnRyYW5zbGF0ZT1mdW5jdGlvbihlLHQscixuLGEscyl7dmFyIGw9dGhpcztyZXR1cm4gdHJhbnNsYXRlKHRoaXMsZSx0LHIsbixhLHMpLnRoZW4oZnVuY3Rpb24oZSl7bC5feD1lWzBdLGwuX3k9ZVsxXX0pfSxlLnJvdGF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpcztyZXR1cm4gcm90YXRlKHRoaXMsZSx0LHIpLnRoZW4oZnVuY3Rpb24oZSl7bi5fYW5nbGU9ZS5hbmdsZSxuLl9yYWRpYW5zPWUucmFkaWFuc30pfSxlLnF1ZXVlTW92ZUJ5PWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBhPWMocikqbixzPV8ocikqbjtyZXR1cm4gdGhpcy50cmFuc2xhdGUoZSx0LGEscywhMCl9LGUucXVldWVUdXJuVG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCU9dGhpcy5fZnVsbENpcmNsZSwwPnQmJih0Kz10aGlzLl9mdWxsQ2lyY2xlKSx0aGlzLnJvdGF0ZShlLHQtZSl9LGUuZ2V0TWFuYWdlcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbWFuYWdlcnNbZV18fCh0aGlzLl9tYW5hZ2Vyc1tlXT1uZXcgRXZlbnRNYW5hZ2VyKGUsdGhpcykpLHRoaXMuX21hbmFnZXJzW2VdfSxlLmdldFBhcGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcGVyfHwodGhpcy5fcGFwZXI9Y3JlYXRlTGF5ZXIoMikpfSxlLnJlc2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fcmFkaWFucz0wLHRoaXMuX2FuZ2xlPTAsdGhpcy5fc2hvd249ITAsdGhpcy5fZG93bj0hMCx0aGlzLl9jb2xvcj1cXFwiYmxhY2tcXFwiLHRoaXMuX2ZpbGw9XFxcImJsYWNrXFxcIix0aGlzLl9zaXplPTEsdGhpcy5fZmlsbGluZz0hMSx0aGlzLl91bmRvQnVmZmVyPVtdLHRoaXMuX3NwZWVkPTMsdGhpcy5fY29tcHV0ZWRfc3BlZWQ9NSx0aGlzLl9jb2xvck1vZGU9MSx0aGlzLl9zdGF0ZT12b2lkIDAsdGhpcy5fbWFuYWdlcnMpdGhpcy5fbWFuYWdlcnNbZV0ucmVzZXQoKTt0aGlzLl9pc1JhZGlhbnM9ITEsdGhpcy5fZnVsbENpcmNsZT0zNjAsdGhpcy5fYnVmZmVyU2l6ZT1cXFwibnVtYmVyXFxcIj09dHlwZW9mIGcuYnVmZmVyU2l6ZT9nLmJ1ZmZlclNpemU6MCxyZW1vdmVMYXllcih0aGlzLl9wYXBlciksdGhpcy5fcGFwZXI9dm9pZCAwfSxlLiRkZWdyZWVzPWZ1bmN0aW9uKGUpe3JldHVybiBlPVxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT9zKGUpOjM2MCx0aGlzLl9pc1JhZGlhbnM9ITEsdGhpcy5fYW5nbGU9ZSYmdGhpcy5fZnVsbENpcmNsZT90aGlzLl9hbmdsZS90aGlzLl9mdWxsQ2lyY2xlKmU6dGhpcy5fcmFkaWFucz0wLHRoaXMuX2Z1bGxDaXJjbGU9ZSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse2FuZ2xlOnRoaXMuX2FuZ2xlLHJhZGlhbnM6dGhpcy5fcmFkaWFuc30pfSxlLiRkZWdyZWVzLm1pbkFyZ3M9MCxlLiRkZWdyZWVzLmNvX3Zhcm5hbWVzPVtcXFwiZnVsbGNpcmNsZVxcXCJdLGUuJGRlZ3JlZXMucmV0dXJuVHlwZT14LkZMT0FULGUuJHJhZGlhbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNSYWRpYW5zfHwodGhpcy5faXNSYWRpYW5zPSEwLHRoaXMuX2FuZ2xlPXRoaXMuX3JhZGlhbnMsdGhpcy5fZnVsbENpcmNsZT1UdXJ0bGUuUkFESUFOUyksdGhpcy5fYW5nbGV9LGUuJHJhZGlhbnMucmV0dXJuVHlwZT14LkZMT0FULGUuJHBvc2l0aW9uPWUuJHBvcz1mdW5jdGlvbigpe3JldHVyblt0aGlzLiR4Y29yKCksdGhpcy4keWNvcigpXX0sZS4kcG9zaXRpb24ucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhlWzBdKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZVsxXSldKX0sZS4kdG93YXJkcz1mdW5jdGlvbihlLHQpe3ZhciByPWdldENvb3JkaW5hdGVzKGUsdCksbj1vK2QodGhpcy5feS1yLnksdGhpcy5feC1yLngpLGE9bioodGhpcy5fZnVsbENpcmNsZS9UdXJ0bGUuUkFESUFOUyk7cmV0dXJuIGF9LGUuJHRvd2FyZHMuY29fdmFybmFtZXM9W1xcXCJ4XFxcIixcXFwieVxcXCJdLGUuJHRvd2FyZHMubWluQXJncz0xLGUuJHRvd2FyZHMucmV0dXJuVHlwZT14LkZMT0FULGUuJGRpc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0Q29vcmRpbmF0ZXMoZSx0KSxhPXIueC10aGlzLl94LHM9ci55LXRoaXMuX3k7cmV0dXJuIG4oYSphK3Mqcyl9LGUuJGRpc3RhbmNlLmNvX3Zhcm5hbWVzPVtcXFwieFxcXCIsXFxcInlcXFwiXSxlLiRkaXN0YW5jZS5taW5BcmdzPTEsZS4kZGlzdGFuY2UucmV0dXJuVHlwZT14LkZMT0FULGUuJGhlYWRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtMTM+cyh0aGlzLl9hbmdsZSk/MDp0aGlzLl9hbmdsZX0sZS4kaGVhZGluZy5yZXR1cm5UeXBlPXguRkxPQVQsZS4keGNvcj1mdW5jdGlvbigpe3JldHVybiAxZS0xMz5zKHRoaXMuX3gpPzA6dGhpcy5feH0sZS4keGNvci5yZXR1cm5UeXBlPXguRkxPQVQsZS4keWNvcj1mdW5jdGlvbigpe3JldHVybiAxZS0xMz5zKHRoaXMuX3kpPzA6dGhpcy5feX0sZS4keWNvci5yZXR1cm5UeXBlPXguRkxPQVQsZS4kZm9yd2FyZD1lLiRmZD1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5xdWV1ZU1vdmVCeSh0aGlzLl94LHRoaXMuX3ksdGhpcy5fcmFkaWFucyxlKX0sZS4kZm9yd2FyZC5jb192YXJuYW1lcz1lLiRmZC5jb192YXJuYW1lcz1bXFxcImRpc3RhbmNlXFxcIl0sZS4kdW5kbz1mdW5jdGlvbigpe3BvcFVuZG8odGhpcyl9LGUuJHVuZG9idWZmZXJlbnRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VuZG9CdWZmZXIubGVuZ3RofSxlLiRzZXR1bmRvYnVmZmVyPWZ1bmN0aW9uKGUpe3RoaXMuX2J1ZmZlclNpemU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBlP2EocyhlKSwxZTMpOjB9LGUuJHNldHVuZG9idWZmZXIuY29fdmFybmFtZXM9W1xcXCJzaXplXFxcIl0sZS4kYmFja3dhcmQ9ZS4kYmFjaz1lLiRiaz1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5xdWV1ZU1vdmVCeSh0aGlzLl94LHRoaXMuX3ksdGhpcy5fcmFkaWFucywtZSl9LGUuJGJhY2t3YXJkLmNvX3Zhcm5hbWVzPWUuJGJhY2suY29fdmFybmFtZXM9ZS4kYmsuY29fdmFybmFtZXM9W1xcXCJkaXN0YW5jZVxcXCJdLGUuJGdvdG9fJHJ3JD1lLiRzZXRwb3M9ZS4kc2V0cG9zaXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgcj1nZXRDb29yZGluYXRlcyhlLHQpO3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksci54LXRoaXMuX3gsci55LXRoaXMuX3ksITApfSxlLiRnb3RvXyRydyQuY29fdmFybmFtZXM9ZS4kc2V0cG9zLmNvX3Zhcm5hbWVzPWUuJHNldHBvc2l0aW9uLmNvX3Zhcm5hbWVzPVtcXFwieFxcXCIsXFxcInlcXFwiXSxlLiRnb3RvXyRydyQubWluQXJncz1lLiRzZXRwb3MubWluQXJncz1lLiRzZXRwb3NpdGlvbi5taW5BcmdzPTEsZS4kc2V0eD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50cmFuc2xhdGUodGhpcy5feCx0aGlzLl95LGUtdGhpcy5feCwwLCEwKX0sZS4kc2V0eC5jb192YXJuYW1lcz1bXFxcInhcXFwiXSxlLiRzZXR5PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksMCxlLXRoaXMuX3ksITApfSxlLiRzZXR5LmNvX3Zhcm5hbWVzPVtcXFwieVxcXCJdLGUuJGhvbWU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5fYW5nbGU7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLGUudHJhbnNsYXRlKHRoaXMuX3gsdGhpcy5feSwtdGhpcy5feCwtdGhpcy5feSwhMCkudGhlbihmdW5jdGlvbigpe3JldHVybiBlLnF1ZXVlVHVyblRvKHQsMCl9KS50aGVuKGZ1bmN0aW9uKCl7fSl9LGUuJHJpZ2h0PWUuJHJ0PWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnJvdGF0ZSh0aGlzLl9hbmdsZSwtZSl9LGUuJHJpZ2h0LmNvX3Zhcm5hbWVzPWUuJHJ0LmNvX3Zhcm5hbWVzPVtcXFwiYW5nbGVcXFwiXSxlLiRsZWZ0PWUuJGx0PWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnJvdGF0ZSh0aGlzLl9hbmdsZSxlKX0sZS4kbGVmdC5jb192YXJuYW1lcz1lLiRsdC5jb192YXJuYW1lcz1bXFxcImFuZ2xlXFxcIl0sZS4kc2V0aGVhZGluZz1lLiRzZXRoPWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnF1ZXVlVHVyblRvKHRoaXMuX2FuZ2xlLGUpfSxlLiRzZXRoZWFkaW5nLmNvX3Zhcm5hbWVzPWUuJHNldGguY29fdmFybmFtZXM9W1xcXCJhbmdsZVxcXCJdLGUuJGNpcmNsZT1mdW5jdGlvbihlLHQscil7dmFyIG4sZCx1LG0scCxnLGYsaCwkLGI9dGhpcyx2PXRoaXMuX3gsaz10aGlzLl95LFQ9dGhpcy5fYW5nbGUsQT17fSxMPTEvZ2V0U2NyZWVuKCkubGluZVNjYWxlLFM9ITA7Zm9yKHB1c2hVbmRvKHRoaXMpLHZvaWQgMD09PXQmJih0PWIuX2Z1bGxDaXJjbGUpLHZvaWQgMD09PXImJihkPXModCkvYi5fZnVsbENpcmNsZSxyPTErKDB8YSgxMStzKGUqTCkvNiw1OSkqZCkpLHU9dC9yLG09LjUqdSxwPTIqZSpfKHUqby9iLl9mdWxsQ2lyY2xlKSwwPmU/KHA9LXAsdT0tdSxtPS1tLG49VC10KTpuPVQrdCwkPWdldEZyYW1lTWFuYWdlcigpLndpbGxSZW5kZXJOZXh0KCk/UHJvbWlzZS5yZXNvbHZlKCk6bmV3IEluc3RhbnRQcm9taXNlLFQrPW0sZz0wO2c8cjtnKyspY2FsY3VsYXRlSGVhZGluZyhiLFQrdSpnLEEpLGY9YyhBLnJhZGlhbnMpKnAsaD1fKEEucmFkaWFucykqcCwkPSQudGhlbihjaXJjbGVSb3RhdGUoYixBLmFuZ2xlLEEucmFkaWFucykpLnRoZW4oY2lyY2xlU2VnbWVudChiLHYsayxmLGgsUykpLHYrPWYsays9aCxTPSExO3JldHVybiAkPSQudGhlbihmdW5jdGlvbigpe3JldHVybiBjYWxjdWxhdGVIZWFkaW5nKGIsbixBKSxiLl9hbmdsZT1BLmFuZ2xlLGIuX3JhZGlhbnM9QS5yYWRpYW5zLGIuYWRkVXBkYXRlKHZvaWQgMCwhMCxBKX0pLCR9LGUuJGNpcmNsZS5jb192YXJuYW1lcz1bXFxcInJhZGl1c1xcXCIsXFxcImV4dGVudFxcXCIsXFxcInN0ZXBzXFxcIl0sZS4kY2lyY2xlLm1pbkFyZ3M9MSxlLiRwZW51cD1lLiR1cD1lLiRwdT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3duPSExLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7ZG93bjohMX0pfSxlLiRwZW5kb3duPWUuJGRvd249ZS4kcGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG93bj0hMCx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse2Rvd246ITB9KX0sZS4kaXNkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd259LGUuJHNwZWVkPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuX3NwZWVkOih0aGlzLl9zcGVlZD1yKDAsYSgxZTMsZSkpLHRoaXMuX2NvbXB1dGVkX3NwZWVkPXIoMCwyKmUtMSksdGhpcy5hZGRVcGRhdGUodm9pZCAwLCExLHtzcGVlZDp0aGlzLl9jb21wdXRlZF9zcGVlZH0pKX0sZS4kc3BlZWQubWluQXJncz0wLGUuJHNwZWVkLmNvX3Zhcm5hbWVzPVtcXFwic3BlZWRcXFwiXSxlLiRwZW5jb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9oZXhUb1JHQih0aGlzLl9jb2xvcik6KHRoaXMuX2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlLHQscixuKSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se2NvbG9yOnRoaXMuX2NvbG9yfSkpfSxlLiRwZW5jb2xvci5jb192YXJuYW1lcz1bXFxcInJcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRwZW5jb2xvci5taW5BcmdzPTAsZS4kcGVuY29sb3IucmV0dXJuVHlwZT14LkNPTE9SLGUuJGZpbGxjb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9oZXhUb1JHQih0aGlzLl9maWxsKToodGhpcy5fZmlsbD1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtmaWxsOnRoaXMuX2ZpbGx9KSl9LGUuJGZpbGxjb2xvci5jb192YXJuYW1lcz1bXFxcInJcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRmaWxsY29sb3IubWluQXJncz0wLGUuJGZpbGxjb2xvci5yZXR1cm5UeXBlPXguQ09MT1IsZS4kY29sb3I9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHZvaWQgMD09PWU/W3RoaXMuJHBlbmNvbG9yKCksdGhpcy4kZmlsbGNvbG9yKCldOih2b2lkIDA9PT10fHx2b2lkIDAhPT1yPyh0aGlzLl9jb2xvcj1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdGhpcy5fZmlsbD10aGlzLl9jb2xvcik6KHRoaXMuX2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlKSx0aGlzLl9maWxsPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSx0KSksdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtjb2xvcjp0aGlzLl9jb2xvcixmaWxsOnRoaXMuX2ZpbGx9KSl9LGUuJGNvbG9yLm1pbkFyZ3M9MCxlLiRjb2xvci5jb192YXJuYW1lcz1bXFxcImNvbG9yXFxcIixcXFwiZmlsbFxcXCIsXFxcImJcXFwiLFxcXCJhXFxcIl0sZS4kY29sb3IucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3guQ09MT1IoZVswXSkseC5DT0xPUihlWzFdKV0pfSxlLiRmaWxsPWZ1bmN0aW9uKGUpe3RoaXM7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5fZmlsbGluZzooZT0hIWUsZT09PXRoaXMuX2ZpbGxpbmcpP3ZvaWQgMDoodGhpcy5fZmlsbGluZz1lLGU/KHB1c2hVbmRvKHRoaXMpLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7ZmlsbGluZzohMCxmaWxsQnVmZmVyOlt7eDp0aGlzLl94LHk6dGhpcy5feX1dfSkpOihwdXNoVW5kbyh0aGlzKSx0aGlzLmFkZFVwZGF0ZShmdW5jdGlvbigpe3RoaXMuZmlsbEJ1ZmZlci5wdXNoKHRoaXMpLGRyYXdGaWxsLmNhbGwodGhpcyl9LCEwLHtmaWxsaW5nOiExLGZpbGxCdWZmZXI6dm9pZCAwfSkpKX0sZS4kZmlsbC5jb192YXJuYW1lcz1bXFxcImZsYWdcXFwiXSxlLiRmaWxsLm1pbkFyZ3M9MCxlLiRiZWdpbl9maWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZpbGwoITApfSxlLiRlbmRfZmlsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRmaWxsKCExKX0sZS4kc3RhbXA9ZnVuY3Rpb24oKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5hZGRVcGRhdGUoZnVuY3Rpb24oKXtkcmF3VHVydGxlKHRoaXMsdGhpcy5jb250ZXh0KCkpfSwhMCl9LGUuJGRvdD1mdW5jdGlvbihlLHQsbixsLGkpe3JldHVybiBwdXNoVW5kbyh0aGlzKSxlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBlP3IoMSwwfHMoZSkpOnIodGhpcy5fc2l6ZSs0LDIqdGhpcy5fc2l6ZSksdD12b2lkIDA9PT10P3RoaXMuX2NvbG9yOmNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSx0LG4sbCxpKSx0aGlzLmFkZFVwZGF0ZShkcmF3RG90LCEwLHZvaWQgMCxlLHQpfSxlLiRkb3QuY29fdmFybmFtZXM9W1xcXCJzaXplXFxcIixcXFwiY29sb3JcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiR3cml0ZT1mdW5jdGlvbihlLHQscixuKXt2YXIgYSxzLGwsaSxvLGQ9dGhpcztyZXR1cm4gcHVzaFVuZG8odGhpcyksZSs9XFxcIlxcXCIsbiYmbi5jb25zdHJ1Y3Rvcj09PUFycmF5JiYocz1cXFwic3RyaW5nXFxcIj09dHlwZW9mIG5bMF0/blswXTpcXFwiQXJpYWxcXFwiLGw9KG5bMV18fFxcXCIxMnB0XFxcIikrXFxcIlxcXCIsaT1cXFwic3RyaW5nXFxcIj09dHlwZW9mIG5bMl0/blsyXTpcXFwibm9ybWFsXFxcIiwvXlxcXFxkKyQvLnRlc3QobCkmJihsKz1cXFwicHRcXFwiKSxuPVtpLGwsc10uam9pbihcXFwiIFxcXCIpKSxyfHwocj1cXFwibGVmdFxcXCIpLGE9dGhpcy5hZGRVcGRhdGUoZHJhd1RleHQsITAsdm9pZCAwLGUscixuKSx0JiYoXFxcImxlZnRcXFwiPT09cnx8XFxcImNlbnRlclxcXCI9PT1yKSYmKG89bWVhc3VyZVRleHQoZSxuKSxcXFwiY2VudGVyXFxcIj09PXImJihvLz0yKSxhPWEudGhlbihmdW5jdGlvbigpe3ZhciBlPWQuZ2V0U3RhdGUoKTtyZXR1cm4gZC50cmFuc2xhdGUoZS54LGUueSxvLDAsITApfSkpLGF9LGUuJHdyaXRlLmNvX3Zhcm5hbWVzPVtcXFwibWVzc2FnZVxcXCIsXFxcIm1vdmVcXFwiLFxcXCJhbGlnblxcXCIsXFxcImZvbnRcXFwiXSxlLiR3cml0ZS5taW5BcmdzPTEsZS4kcGVuc2l6ZT1lLiR3aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9zaXplOih0aGlzLl9zaXplPWUsdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtzaXplOmV9KSl9LGUuJHBlbnNpemUubWluQXJncz1lLiR3aWR0aC5taW5BcmdzPTAsZS4kcGVuc2l6ZS5jb192YXJuYW1lcz1lLiR3aWR0aC5jb192YXJuYW1lcz1bXFxcIndpZHRoXFxcIl0sZS4kc2hvd3R1cnRsZT1lLiRzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93bj0hMCx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITAse3Nob3duOiEwfSl9LGUuJGhpZGV0dXJ0bGU9ZS4kaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd249ITEsdGhpcy5hZGRVcGRhdGUodm9pZCAwLCEwLHtzaG93bjohMX0pfSxlLiRpc3Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd259LGUuJHNoYXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZ2W2VdPyh0aGlzLl9zaGFwZT1lLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7c2hhcGU6ZX0pKTp0aGlzLl9zaGFwZX0sZS4kc2hhcGUubWluQXJncz0wLGUuJHNoYXBlLmNvX3Zhcm5hbWVzPVtcXFwibmFtZVxcXCJdLGUuJGNvbG9ybW9kZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9jb2xvck1vZGU6KHRoaXMuX2NvbG9yTW9kZT0yNTU9PT1lPzI1NToxLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7Y29sb3JNb2RlOnRoaXMuX2NvbG9yTW9kZX0pKX0sZS4kY29sb3Jtb2RlLm1pbkFyZ3M9MCxlLiRjb2xvcm1vZGUuY29fdmFybmFtZXM9W1xcXCJjbW9kZVxcXCJdLGUuJGNvbG9ybW9kZS5yZXR1cm5UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiAyNTU9PT1lP25ldyBTay5idWlsdGluLmludF8oMjU1KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMSl9LGUuJHdpbmRvd193aWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JlZW4uJHdpbmRvd193aWR0aCgpfSxlLiR3aW5kb3dfaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kd2luZG93X2hlaWdodCgpfSxlLiR0cmFjZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR0cmFjZXIoZSx0KX0sZS4kdHJhY2VyLm1pbkFyZ3M9MCxlLiR0cmFjZXIuY29fdmFybmFtZXM9W1xcXCJuXFxcIixcXFwiZGVsYXlcXFwiXSxlLiR1cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR1cGRhdGUoKX0sZS4kZGVsYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kZGVsYXkoZSl9LGUuJGRlbGF5Lm1pbkFyZ3M9MCxlLiRkZWxheS5jb192YXJuYW1lcz1bXFxcImRlbGF5XFxcIl0sZS4kcmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXNldCgpLHRoaXMuJGNsZWFyKCl9LGUuJG1haW5sb29wPWUuJGRvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiRtYWlubG9vcCgpfSxlLiRjbGVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZFVwZGF0ZShmdW5jdGlvbigpe2NsZWFyTGF5ZXIodGhpcy5jb250ZXh0KCkpfSwhMCl9LGUuJGRvdC5taW5BcmdzPTAsZS4kb25jbGljaz1mdW5jdGlvbihlLHQscil7dGhpcy5nZXRNYW5hZ2VyKFxcXCJtb3VzZWRvd25cXFwiKS5hZGRIYW5kbGVyKGUscil9LGUuJG9uY2xpY2subWluQXJncz0xLGUuJG9uY2xpY2suY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXSxlLiRvbnJlbGVhc2U9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2V1cFxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25yZWxlYXNlLm1pbkFyZ3M9MSxlLiRvbnJlbGVhc2UuY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXSxlLiRvbmRyYWc9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2Vtb3ZlXFxcIikuYWRkSGFuZGxlcihlLHIpfSxlLiRvbmRyYWcubWluQXJncz0xLGUuJG9uZHJhZy5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJGdldHNjcmVlbj1mdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoeS5TY3JlZW4pfSxlLiRnZXRzY3JlZW4uaXNTaz0hMCxlLiRjbG9uZT1mdW5jdGlvbigpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh5LlR1cnRsZSk7cmV0dXJuIGUuaW5zdGFuY2UuX3g9dGhpcy5feCxlLmluc3RhbmNlLl95PXRoaXMuX3ksZS5pbnN0YW5jZS5fYW5nbGU9dGhpcy5fYW5nbGUsZS5pbnN0YW5jZS5fcmFkaWFucz10aGlzLl9yYWRpYW5zLGUuaW5zdGFuY2UuX3NoYXBlPXRoaXMuX3NoYXBlLGUuaW5zdGFuY2UuX2NvbG9yPXRoaXMuX2NvbG9yLGUuaW5zdGFuY2UuX2ZpbGw9dGhpcy5fZmlsbCxlLmluc3RhbmNlLl9maWxsaW5nPXRoaXMuX2ZpbGxpbmcsZS5pbnN0YW5jZS5fc2l6ZT10aGlzLl9zaXplLGUuaW5zdGFuY2UuX2NvbXB1dGVkX3NwZWVkPXRoaXMuX2NvbXB1dGVkX3NwZWVkLGUuaW5zdGFuY2UuX2Rvd249dGhpcy5fZG93bixlLmluc3RhbmNlLl9zaG93bj10aGlzLl9zaG93bixlLmluc3RhbmNlLl9jb2xvck1vZGU9dGhpcy5fY29sb3JNb2RlLGUuaW5zdGFuY2UuX2lzUmFkaWFucz10aGlzLl9pc1JhZGlhbnMsZS5pbnN0YW5jZS5fZnVsbENpcmNsZT10aGlzLl9mdWxsQ2lyY2xlLGUuaW5zdGFuY2UuX2J1ZmZlclNpemU9dGhpcy5fYnVmZmVyU2l6ZSxlLmluc3RhbmNlLl91bmRvQnVmZmVyPXRoaXMuX3VuZG9CdWZmZXIsZS5fY2xvbmVkRnJvbT10aGlzLGV9LGUuJGNsb25lLnJldHVyblR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGUuJGdldHR1cnRsZT1lLiRnZXRwZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5za0luc3RhbmNlfSxlLiRnZXR0dXJ0bGUuaXNTaz0hMH0oVHVydGxlLnByb3RvdHlwZSksZnVuY3Rpb24oZSl7ZS5zcHJpdGVMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcHJpdGVzfHwodGhpcy5fc3ByaXRlcz1jcmVhdGVMYXllcigzKSl9LGUuYmdMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNrZ3JvdW5kfHwodGhpcy5fYmFja2dyb3VuZD1jcmVhdGVMYXllcigxKSl9LGUuaGl0VGVzdExheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hpdFRlc3R8fCh0aGlzLl9oaXRUZXN0PWNyZWF0ZUxheWVyKDAsITApKX0sZS5nZXRNYW5hZ2VyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9tYW5hZ2Vyc1tlXXx8KHRoaXMuX21hbmFnZXJzW2VdPW5ldyBFdmVudE1hbmFnZXIoZSx0aGlzKSksdGhpcy5fbWFuYWdlcnNbZV19LGUucmVzZXQ9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5fa2V5TGlzdGVuZXJzPXZvaWQgMCx0aGlzLl9rZXlMb2dnZXIpd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fa2V5TG9nZ2VyW2VdKSx3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2tleUxvZ2dlcltlXSksZGVsZXRlIHRoaXMuX2tleUxvZ2dlcltlXTtmb3IoZSBpbiB0aGlzLl9rZXlEb3duTGlzdGVuZXImJihnZXRUYXJnZXQoKS5yZW1vdmVFdmVudExpc3RlbmVyKFxcXCJrZXlkb3duXFxcIix0aGlzLl9rZXlEb3duTGlzdGVuZXIpLHRoaXMuX2tleURvd25MaXN0ZW5lcj12b2lkIDApLHRoaXMuX2tleVVwTGlzdGVuZXImJihnZXRUYXJnZXQoKS5yZW1vdmVFdmVudExpc3RlbmVyKFxcXCJrZXl1cFxcXCIsdGhpcy5fa2V5VXBMaXN0ZW5lciksdGhpcy5fa2V5VXBMaXN0ZW5lcj12b2lkIDApLHRoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9dm9pZCAwKSx0aGlzLl9tYW5hZ2Vycyl0aGlzLl9tYW5hZ2Vyc1tlXS5yZXNldCgpO3RoaXMuX21vZGU9XFxcInN0YW5kYXJkXFxcIixyZW1vdmVMYXllcih0aGlzLl9zcHJpdGVzKSx0aGlzLl9zcHJpdGVzPXZvaWQgMCxyZW1vdmVMYXllcih0aGlzLl9iYWNrZ3JvdW5kKSx0aGlzLl9iYWNrZ3JvdW5kPXZvaWQgMH0sZS5zZXRVcFdvcmxkPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBsPXRoaXM7bC5sbHg9ZSxsLmxseT10LGwudXJ4PXIsbC51cnk9bixsLnhTY2FsZT0oci1lKS9nZXRXaWR0aCgpLGwueVNjYWxlPS0xKihuLXQpL2dldEhlaWdodCgpLGwubGluZVNjYWxlPWEocyhsLnhTY2FsZSkscyhsLnlTY2FsZSkpfSxlLiRzZXR1cD1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gaXNOYU4ocGFyc2VGbG9hdChlKSkmJihlPWdldFdpZHRoKCkpLGlzTmFOKHBhcnNlRmxvYXQodCkpJiYodD1nZXRIZWlnaHQoKSksMT49ZSYmKGU9Z2V0V2lkdGgoKSplKSwxPj10JiYodD1nZXRIZWlnaHQoKSp0KSx0aGlzLl93aWR0aD1lLHRoaXMuX2hlaWdodD10LHRoaXMuX3hPZmZzZXQ9dm9pZCAwPT09cnx8aXNOYU4ocGFyc2VJbnQocikpPzA6cGFyc2VJbnQociksdGhpcy5feU9mZnNldD12b2lkIDA9PT1ufHxpc05hTihwYXJzZUludChuKSk/MDpwYXJzZUludChuKSxcXFwid29ybGRcXFwiPT09dGhpcy5fbW9kZT90aGlzLl9zZXR3b3JsZGNvb3JkaW5hdGVzKHRoaXMubGx4LHRoaXMubGx5LHRoaXMudXJ4LHRoaXMudXJ5KTp0aGlzLl9zZXR3b3JsZGNvb3JkaW5hdGVzKC1lLzIsLXQvMixlLzIsdC8yKX0sZS4kc2V0dXAubWluQXJncz0wLGUuJHNldHVwLmNvX3Zhcm5hbWVzPVtcXFwid2lkdGhcXFwiLFxcXCJoZWlnaHRcXFwiLFxcXCJzdGFydHhcXFwiLFxcXCJzdGFydHlcXFwiXSxlLiRyZWdpc3Rlcl9zaGFwZT1lLiRhZGRzaGFwZT1mdW5jdGlvbihlLHQpe3JldHVybiB0P3ZvaWQodltlXT10KTpnZXRBc3NldChlKS50aGVuKGZ1bmN0aW9uKHQpe3ZbZV09dH0pfSxlLiRyZWdpc3Rlcl9zaGFwZS5taW5BcmdzPTEsZS4kZ2V0c2hhcGVzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHYpfSxlLiR0cmFjZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwIT09ZXx8dm9pZCAwIT09dD8oXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYodGhpcy5fZGVsYXk9dCxnZXRGcmFtZU1hbmFnZXIoKS5yZWZyZXNoSW50ZXJ2YWwodCkpLFxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT8odGhpcy5fZnJhbWVzPWUsZ2V0RnJhbWVNYW5hZ2VyKCkuZnJhbWVCdWZmZXIoZSkpOnZvaWQgMCk6dGhpcy5fZnJhbWVzfSxlLiR0cmFjZXIuY29fdmFybmFtZXM9W1xcXCJmcmFtZXNcXFwiLFxcXCJkZWxheVxcXCJdLGUuJHRyYWNlci5taW5BcmdzPTAsZS4kZGVsYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dm9pZCAwPT09dGhpcy5fZGVsYXk/Yjp0aGlzLl9kZWxheTp0aGlzLiR0cmFjZXIodm9pZCAwLGUpfSxlLiRkZWxheS5jb192YXJuYW1lcz1bXFxcImRlbGF5XFxcIl0sZS5fc2V0d29ybGRjb29yZGluYXRlcz1mdW5jdGlvbihlLHQscixuKXt2YXIgYT10aGlzLHM9Z2V0RnJhbWVNYW5hZ2VyKCkudHVydGxlcygpO3JldHVybiB0aGlzLnNldFVwV29ybGQoZSx0LHIsbiksdGhpcy5fc3ByaXRlcyYmYXBwbHlXb3JsZCh0aGlzLHRoaXMuX3Nwcml0ZXMpLHRoaXMuX2JhY2tncm91bmQmJmFwcGx5V29ybGQodGhpcyx0aGlzLl9iYWNrZ3JvdW5kKSx0aGlzLiRjbGVhcigpfSxlLiRzZXR3b3JsZGNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB0aGlzLl9tb2RlPVxcXCJ3b3JsZFxcXCIsdGhpcy5fc2V0d29ybGRjb29yZGluYXRlcyhlLHQscixuKX0sZS4kc2V0d29ybGRjb29yZGluYXRlcy5jb192YXJuYW1lcz1bXFxcImxseFxcXCIsXFxcImxseVxcXCIsXFxcInVyeFxcXCIsXFxcInVyeVxcXCJdLGUubWluQXJncz00LGUuJGNsZWFyPWUuJGNsZWFyc2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzZXQoKSx0aGlzLiRyZXNldCgpfSxlLiR1cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkudXBkYXRlKCl9LGUuJHJlc2V0PWUuJHJlc2V0c2NyZWVuPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWdldEZyYW1lTWFuYWdlcigpLnR1cnRsZXMoKTtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkuYWRkRnJhbWUoZnVuY3Rpb24oKXthcHBseVdvcmxkKGUsZS5fc3ByaXRlcyksYXBwbHlXb3JsZChlLGUuX2JhY2tncm91bmQpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXRbcl0ucmVzZXQoKSxhcHBseVdvcmxkKGUsdFtyXS5fcGFwZXIpfSwhMCl9LGUuJHdpbmRvd193aWR0aD1mdW5jdGlvbigpe3JldHVybiBnZXRXaWR0aCgpfSxlLiR3aW5kb3dfaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIGdldEhlaWdodCgpfSxlLiRkZWxheS5taW5BcmdzPTAsZS4kdHVydGxlcz1mdW5jdGlvbigpe3JldHVybiBnZXRGcmFtZU1hbmFnZXIoKS50dXJ0bGVzKCl9LGUuJHR1cnRsZXMucmV0dXJuVHlwZT14LlRVUlRMRV9MSVNULGUuJGJncGljPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBlPyh0PXRoaXMsZ2V0QXNzZXQoZSkudGhlbihmdW5jdGlvbihlKXtjbGVhckxheWVyKHQuYmdMYXllcigpLHZvaWQgMCxlKX0pKTp0aGlzLl9iZ3BpY30sZS4kYmdwaWMubWluQXJncz0wLGUuJGJncGljLmNvX3Zhcm5hbWVzPVtcXFwibmFtZVxcXCJdLGUuJGJnY29sb3I9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHZvaWQgMD09PWU/aGV4VG9SR0IodGhpcy5fYmdjb2xvcik6KHRoaXMuX2JnY29sb3I9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLGUsdCxyLG4pLHZvaWQgY2xlYXJMYXllcih0aGlzLmJnTGF5ZXIoKSx0aGlzLl9iZ2NvbG9yKSl9LGUuJGJnY29sb3IubWluQXJncz0wLGUuJGJnY29sb3IuY29fdmFybmFtZXM9W1xcXCJjb2xvclxcXCIsXFxcImdcXFwiLFxcXCJiXFxcIixcXFwiYVxcXCJdLGUuJGJnY29sb3IucmV0dXJuVHlwZT14LkNPTE9SLGUuJG1haW5sb29wPWUuJGRvbmU9ZnVuY3Rpb24oKXt9LGUuJGJ5ZT1mdW5jdGlvbigpe3JldHVybiBTay5UdXJ0bGVHcmFwaGljcy5yZXNldCgpfSxlLiRleGl0b25jbGljaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9leGl0T25DbGljaz0hMCx0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZnVuY3Rpb24oKXtyZXNldFR1cnRsZSgpfSwhMSl9LGUuJG9uY2xpY2s9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuX2V4aXRPbkNsaWNrfHx0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25jbGljay5taW5BcmdzPTEsZS4kb25jbGljay5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdO3ZhciB0PXs4Oi9eYmFjayhzcGFjZSk/JC9pLDk6L150YWIkL2ksMTM6L14oZW50ZXJ8cmV0dXJuKSQvaSwxNjovXnNoaWZ0JC9pLDE3Oi9eKGN0cmx8Y29udHJvbCkkL2ksMTg6L15hbHQkL2ksMjc6L15lc2MoYXBlKT8kL2ksMzI6L15zcGFjZSQvaSwzMzovXnBhZ2VbXFxcXHNcXFxcLV0/dXAkL2ksMzQ6L15wYWdlW1xcXFxzXFxcXC1dP2Rvd24kL2ksMzU6L15lbmQkL2ksMzY6L15ob21lJC9pLDM3Oi9ebGVmdChbXFxcXHNcXFxcLV0/YXJyb3cpPyQvaSwzODovXnVwKFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDM5Oi9ecmlnaHQoW1xcXFxzXFxcXC1dP2Fycm93KT8kL2ksNDA6L15kb3duKFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDQ1Oi9eaW5zZXJ0JC9pLDQ2Oi9eZGVsKGV0ZSk/JC9pfTtlLl9jcmVhdGVLZXlSZXBlYXRlcj1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXM7ci5fa2V5TG9nZ2VyW3RdPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5fa2V5TGlzdGVuZXJzW2VdKCksci5fa2V5TG9nZ2VyW3RdPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3IuX2tleUxpc3RlbmVyc1tlXSgpfSw1MCl9LDMzMyl9LGUuX2NyZWF0ZUtleURvd25MaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciByPXRoaXM7dGhpcy5fa2V5RG93bkxpc3RlbmVyfHwodGhpcy5fa2V5RG93bkxpc3RlbmVyPWZ1bmN0aW9uKG4pe3ZhciBlPVN0cmluZy5mcm9tQ2hhckNvZGU7aWYoZm9jdXNUdXJ0bGUoKSl7dmFyIGEscyxsPW4uY2hhckNvZGV8fG4ua2V5Q29kZSxpPWUobCkudG9Mb3dlckNhc2UoKTtpZighci5fa2V5TG9nZ2VyW2xdKWZvcihhIGluIHIuX2tleUxpc3RlbmVycylpZihzPTE8YS5sZW5ndGgmJnRbbF0mJnRbbF0udGVzdChhKSxhPT09aXx8cyl7ci5fa2V5TGlzdGVuZXJzW2FdKCksci5fY3JlYXRlS2V5UmVwZWF0ZXIoYSxsKSxuLnByZXZlbnREZWZhdWx0KCk7YnJlYWt9fX0sZ2V0VGFyZ2V0KCkuYWRkRXZlbnRMaXN0ZW5lcihcXFwia2V5ZG93blxcXCIsdGhpcy5fa2V5RG93bkxpc3RlbmVyKSl9LGUuX2NyZWF0ZUtleVVwTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2tleVVwTGlzdGVuZXJ8fCh0aGlzLl9rZXlVcExpc3RlbmVyPWZ1bmN0aW9uKHIpe3ZhciBlPXQuX2tleUxvZ2dlcltyLmNoYXJDb2RlfHxyLmtleUNvZGVdO3ZvaWQgMCE9PWUmJihyLnByZXZlbnREZWZhdWx0KCksd2luZG93LmNsZWFySW50ZXJ2YWwoZSksd2luZG93LmNsZWFyVGltZW91dChlKSxkZWxldGUgdC5fa2V5TG9nZ2VyW3IuY2hhckNvZGV8fHIua2V5Q29kZV0pfSxnZXRUYXJnZXQoKS5hZGRFdmVudExpc3RlbmVyKFxcXCJrZXl1cFxcXCIsdGhpcy5fa2V5VXBMaXN0ZW5lcikpfSxlLiRsaXN0ZW49ZnVuY3Rpb24oKXt0aGlzLl9jcmVhdGVLZXlVcExpc3RlbmVyKCksdGhpcy5fY3JlYXRlS2V5RG93bkxpc3RlbmVyKCl9LGUuJG9ua2V5PWZ1bmN0aW9uKGUsdCl7aWYoXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHQpe3ZhciByPWU7ZT10LHQ9cn10PSh0K1xcXCJcXFwiKS50b0xvd2VyQ2FzZSgpLGUmJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlPyghdGhpcy5fa2V5TGlzdGVuZXJzJiYodGhpcy5fa2V5TGlzdGVuZXJzPXt9KSx0aGlzLl9rZXlMaXN0ZW5lcnNbdF09ZSk6ZGVsZXRlIHRoaXMuX2tleUxpc3RlbmVyc1t0XX0sZS4kb25rZXkubWluQXJncz0yLGUuJG9ua2V5LmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwia2V5VmFsdWVcXFwiXSxlLiRvbnNjcmVlbmNsaWNrPWZ1bmN0aW9uKGUsdCxyKXt0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25zY3JlZW5jbGljay5taW5BcmdzPTEsZS4kb25zY3JlZW5jbGljay5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJG9udGltZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPXZvaWQgMCksZSYmXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYodGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQoZSxyKDAsMHx0KSkpfSxlLiRvbnRpbWVyLm1pbkFyZ3M9MCxlLiRvbnRpbWVyLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiaW50ZXJ2YWxcXFwiXX0oU2NyZWVuLnByb3RvdHlwZSk7dmFyIEw9bmV3IEltYWdlLFM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIikuZ2V0Q29udGV4dChcXFwiMmRcXFwiKTtmb3IodmFyIEMgaW4gaW5pdFR1cnRsZS5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzaGFwZVxcXCJdLGluaXRUdXJ0bGUuY29fbmFtZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIlR1cnRsZVxcXCIpLGluaXRUdXJ0bGUuY29fYXJnY291bnQ9Mixpbml0VHVydGxlLiRkZWZhdWx0cz1bU2suYnVpbHRpbi5ub25lLm5vbmUkLG5ldyBTay5idWlsdGluLnN0cihcXFwiY2xhc3NpY1xcXCIpXSxUdXJ0bGUucHJvdG90eXBlKS9eXFxcXCRbYS16X10rLy50ZXN0KEMpJiZhZGRNb2R1bGVNZXRob2QoVHVydGxlLHksQyxlbnN1cmVBbm9ueW1vdXMpO3JldHVybiBhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiRtYWlubG9vcFxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiRkb25lXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJGJ5ZVxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR0cmFjZXJcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkdXBkYXRlXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJGRlbGF5XFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJHdpbmRvd193aWR0aFxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR3aW5kb3dfaGVpZ2h0XFxcIixnZXRTY3JlZW4pLHkuVHVydGxlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoeSxmdW5jdGlvbiBUdXJ0bGVXcmFwcGVyKGUsdCl7Zm9yKHZhciByIGluIHQuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhpbml0VHVydGxlKSxUdXJ0bGUucHJvdG90eXBlKS9eXFxcXCRbYS16X10rLy50ZXN0KHIpJiZhZGRNb2R1bGVNZXRob2QoVHVydGxlLHQscil9LFxcXCJUdXJ0bGVcXFwiLFtdKSx5LlNjcmVlbj1Tay5taXNjZXZhbC5idWlsZENsYXNzKHksZnVuY3Rpb24gU2NyZWVuV3JhcHBlcihlLHQpe2Zvcih2YXIgciBpbiB0Ll9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSl7ZS5pbnN0YW5jZT1nZXRTY3JlZW4oKX0pLFNjcmVlbi5wcm90b3R5cGUpL15cXFxcJFthLXpfXSsvLnRlc3QocikmJmFkZE1vZHVsZU1ldGhvZChTY3JlZW4sdCxyKX0sXFxcIlNjcmVlblxcXCIsW10pLHtza01vZHVsZTp5LHJlc2V0OnJlc2V0VHVydGxlLHN0b3A6c3RvcFR1cnRsZSxmb2N1czpmb2N1c1R1cnRsZSxUdXJ0bGU6VHVydGxlLFNjcmVlbjpTY3JlZW59fShlKSxTay5UdXJ0bGVHcmFwaGljcy5tb2R1bGU9ZS50dXJ0bGVJbnN0YW5jZS5za01vZHVsZSxTay5UdXJ0bGVHcmFwaGljcy5yZXNldD1lLnR1cnRsZUluc3RhbmNlLnJlc2V0LFNrLlR1cnRsZUdyYXBoaWNzLnN0b3A9ZS50dXJ0bGVJbnN0YW5jZS5zdG9wLFNrLlR1cnRsZUdyYXBoaWNzLmZvY3VzPWUudHVydGxlSW5zdGFuY2UuZm9jdXMsU2suVHVydGxlR3JhcGhpY3MucmF3PXtUdXJ0bGU6ZS50dXJ0bGVJbnN0YW5jZS5UdXJ0bGUsU2NyZWVuOmUudHVydGxlSW5zdGFuY2UuU2NyZWVufSxlLnR1cnRsZUluc3RhbmNlLnNrTW9kdWxlfTtcIixcInNyYy9saWIvdHlwZXMucHlcIjpcIlxcXCJcXFwiXFxcIlxcblRoaXMgZmlsZSB3YXMgbW9kaWZpZWQgZnJvbSBDUHl0aG9uLlxcbkNvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCxcXG4yMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBBbGwgUmlnaHRzIFJlc2VydmVkXFxuXFxcIlxcXCJcXFwiXFxuXFxcIlxcXCJcXFwiRGVmaW5lIG5hbWVzIGZvciBhbGwgdHlwZSBzeW1ib2xzIGtub3duIGluIHRoZSBzdGFuZGFyZCBpbnRlcnByZXRlci5cXG5UeXBlcyB0aGF0IGFyZSBwYXJ0IG9mIG9wdGlvbmFsIG1vZHVsZXMgKGUuZy4gYXJyYXkpIGFyZSBub3QgbGlzdGVkLlxcblxcXCJcXFwiXFxcIlxcbmltcG9ydCBzeXNcXG5cXG4jIEl0ZXJhdG9ycyBpbiBQeXRob24gYXJlbid0IGEgbWF0dGVyIG9mIHR5cGUgYnV0IG9mIHByb3RvY29sLiAgQSBsYXJnZVxcbiMgYW5kIGNoYW5naW5nIG51bWJlciBvZiBidWlsdGluIHR5cGVzIGltcGxlbWVudCAqc29tZSogZmxhdm9yIG9mXFxuIyBpdGVyYXRvci4gIERvbid0IGNoZWNrIHRoZSB0eXBlISAgVXNlIGhhc2F0dHIgdG8gY2hlY2sgZm9yIGJvdGhcXG4jIFxcXCJfX2l0ZXJfX1xcXCIgYW5kIFxcXCJuZXh0XFxcIiBhdHRyaWJ1dGVzIGluc3RlYWQuXFxuTWFwcGluZ1Byb3h5VHlwZSA9IHR5cGUodHlwZS5fX2RpY3RfXylcXG5XcmFwcGVyRGVzY3JpcHRvclR5cGUgPSB0eXBlKG9iamVjdC5fX2luaXRfXylcXG5NZXRob2RXcmFwcGVyVHlwZSA9IHR5cGUob2JqZWN0KCkuX19zdHJfXylcXG5NZXRob2REZXNjcmlwdG9yVHlwZSA9IHR5cGUoc3RyLmpvaW4pXFxuQ2xhc3NNZXRob2REZXNjcmlwdG9yVHlwZSA9IHR5cGUoZGljdC5fX2RpY3RfX1snZnJvbWtleXMnXSlcXG5cXG5Ob25lVHlwZSA9IHR5cGUoTm9uZSlcXG5UeXBlVHlwZSA9IHR5cGVcXG5PYmplY3RUeXBlID0gb2JqZWN0XFxuSW50VHlwZSA9IGludFxcbnRyeTpcXG4gICAgTG9uZ1R5cGUgPSBsb25nXFxuZXhjZXB0OiBwYXNzXFxuRmxvYXRUeXBlID0gZmxvYXRcXG5Cb29sZWFuVHlwZSA9IGJvb2xcXG50cnk6XFxuICAgIENvbXBsZXhUeXBlID0gY29tcGxleFxcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIHBhc3NcXG5TdHJpbmdUeXBlID0gc3RyXFxuXFxuIyBTdHJpbmdUeXBlcyBpcyBhbHJlYWR5IG91dGRhdGVkLiAgSW5zdGVhZCBvZiB3cml0aW5nIFxcXCJ0eXBlKHgpIGluXFxuIyB0eXBlcy5TdHJpbmdUeXBlc1xcXCIsIHlvdSBzaG91bGQgdXNlIFxcXCJpc2luc3RhbmNlKHgsIGJhc2VzdHJpbmcpXFxcIi4gIEJ1dFxcbiMgd2Uga2VlcCBhcm91bmQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi4yLlxcbnRyeTpcXG4gICAgVW5pY29kZVR5cGUgPSB1bmljb2RlXFxuICAgIFN0cmluZ1R5cGVzID0gKFN0cmluZ1R5cGUsIFVuaWNvZGVUeXBlKVxcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIFN0cmluZ1R5cGVzID0gKFN0cmluZ1R5cGUsKVxcblxcbkJ1ZmZlclR5cGUgPSBidWZmZXJcXG5cXG5UdXBsZVR5cGUgPSB0dXBsZVxcbkxpc3RUeXBlID0gbGlzdFxcbkRpY3RUeXBlID0gRGljdGlvbmFyeVR5cGUgPSBkaWN0XFxuXFxuZGVmIF9mKCk6IHBhc3NcXG5GdW5jdGlvblR5cGUgPSB0eXBlKF9mKVxcbkxhbWJkYVR5cGUgPSB0eXBlKGxhbWJkYTogTm9uZSkgICAgICAgICAjIFNhbWUgYXMgRnVuY3Rpb25UeXBlXFxuI0NvZGVUeXBlID0gdHlwZShfZi5mdW5jX2NvZGUpXFxuXFxuZGVmIF9nKCk6XFxuICAgIHlpZWxkIDFcXG5HZW5lcmF0b3JUeXBlID0gdHlwZShfZygpKVxcblxcbmNsYXNzIF9DOlxcbiAgICBkZWYgX20oc2VsZik6IHBhc3NcXG5DbGFzc1R5cGUgPSB0eXBlKF9DKVxcblVuYm91bmRNZXRob2RUeXBlID0gdHlwZShfQy5fbSkgICAgICAgICAjIFNhbWUgYXMgTWV0aG9kVHlwZVxcbl94ID0gX0MoKVxcbkluc3RhbmNlVHlwZSA9IHR5cGUoX3gpXFxuTWV0aG9kVHlwZSA9IHR5cGUoX3guX20pXFxuQnVpbHRpbkZ1bmN0aW9uVHlwZSA9IHR5cGUobGVuKVxcbkJ1aWx0aW5NZXRob2RUeXBlID0gdHlwZShbXS5hcHBlbmQpICAgICAjIFNhbWUgYXMgQnVpbHRpbkZ1bmN0aW9uVHlwZVxcblxcbk1vZHVsZVR5cGUgPSB0eXBlKHN5cylcXG5GaWxlVHlwZSA9IGZpbGVcXG50cnk6XFxuICAgIFhSYW5nZVR5cGUgPSB4cmFuZ2VcXG5leGNlcHQgTmFtZUVycm9yOlxcbiAgICBwYXNzXFxuXFxuIyB0cnk6XFxuIyAgICAgcmFpc2UgVHlwZUVycm9yXFxuIyBleGNlcHQgVHlwZUVycm9yOlxcbiMgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbMl1cXG4jICAgICBUcmFjZWJhY2tUeXBlID0gdHlwZSh0YilcXG4jICAgICBGcmFtZVR5cGUgPSB0eXBlKHRiLnRiX2ZyYW1lKVxcbiMgICAgIGRlbCB0YlxcblxcblNsaWNlVHlwZSA9IHNsaWNlXFxuIyBFbGxpcHNpc1R5cGUgPSB0eXBlKEVsbGlwc2lzKVxcblxcbiMgRGljdFByb3h5VHlwZSA9IHR5cGUoVHlwZVR5cGUuX19kaWN0X18pXFxuTm90SW1wbGVtZW50ZWRUeXBlID0gdHlwZShOb3RJbXBsZW1lbnRlZClcXG5cXG4jIEZvciBKeXRob24sIHRoZSBmb2xsb3dpbmcgdHdvIHR5cGVzIGFyZSBpZGVudGljYWxcXG4jIEdldFNldERlc2NyaXB0b3JUeXBlID0gdHlwZShGdW5jdGlvblR5cGUuZnVuY19jb2RlKVxcbiMgTWVtYmVyRGVzY3JpcHRvclR5cGUgPSB0eXBlKEZ1bmN0aW9uVHlwZS5mdW5jX2dsb2JhbHMpXFxuXFxuZGVsIHN5cywgX2YsIF9nLCBfQywgX3ggICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBmb3IgZXhwb3J0XFxuX19hbGxfXyA9IGxpc3QobiBmb3IgbiBpbiBnbG9iYWxzKCkgaWYgbls6MV0gIT0gJ18nKVxcblwiLFwic3JjL2xpYi91bml0dGVzdC9fX2luaXRfXy5weVwiOlwiX19hdXRob3JfXyA9ICdibWlsbGVyJ1xcbicnJ1xcblRoaXMgaXMgdGhlIHN0YXJ0IG9mIHNvbWV0aGluZyB0aGF0IGJlaGF2ZXMgbGlrZVxcbnRoZSB1bml0dGVzdCBtb2R1bGUgZnJvbSBjcHl0aG9uLlxcblxcbicnJ1xcbmltcG9ydCByZVxcblxcbmNsYXNzIF9Bc3NlcnRSYWlzZXNDb250ZXh0KG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIkEgY29udGV4dCBtYW5hZ2VyIHVzZWQgdG8gaW1wbGVtZW50IFRlc3RDYXNlLmFzc2VydFJhaXNlcyogbWV0aG9kcy5cXFwiXFxcIlxcXCJcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkLCB0ZXN0X2Nhc2UpOlxcbiAgICAgICAgc2VsZi50ZXN0X2Nhc2UgPSB0ZXN0X2Nhc2VcXG4gICAgICAgIHNlbGYuZXhwZWN0ZWQgPSBleHBlY3RlZFxcbiAgICAgICAgc2VsZi5leGNlcHRpb24gPSBOb25lXFxuXFxuICAgIGRlZiBfaXNfc3VidHlwZShzZWxmLCBleHBlY3RlZCwgYmFzZXR5cGUpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCwgdHVwbGUpOlxcbiAgICAgICAgICAgIHJldHVybiBhbGwoc2VsZi5faXNfc3VidHlwZShlLCBiYXNldHlwZSkgZm9yIGUgaW4gZXhwZWN0ZWQpXFxuICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShleHBlY3RlZCwgdHlwZSkgYW5kIGlzc3ViY2xhc3MoZXhwZWN0ZWQsIGJhc2V0eXBlKVxcblxcbiAgICBkZWYgaGFuZGxlKHNlbGYsIGFyZ3MsIGt3YXJncyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIElmIGFyZ3MgaXMgZW1wdHksIGFzc2VydFJhaXNlcyBpcyBiZWluZyB1c2VkIGFzIGFcXG4gICAgICAgIGNvbnRleHQgbWFuYWdlciwgc28gcmV0dXJuIHNlbGYuXFxuICAgICAgICBJZiBhcmdzIGlzIG5vdCBlbXB0eSwgY2FsbCBhIGNhbGxhYmxlIHBhc3NpbmcgcG9zaXRpb25hbCBhbmQga2V5d29yZFxcbiAgICAgICAgYXJndW1lbnRzLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgaWYgbm90IHNlbGYuX2lzX3N1YnR5cGUoc2VsZi5leHBlY3RlZCwgQmFzZUV4Y2VwdGlvbik6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignYXNzZXJ0UmFpc2VzKCkgYXJnIDEgbXVzdCBiZSBhbiBleGNlcHRpb24gdHlwZSBvciB0dXBsZSBvZiBleGNlcHRpb24gdHlwZXMnKVxcbiAgICAgICAgICAgIGlmIG5vdCBhcmdzOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICAgICAgICAgIGNhbGxhYmxlX29iaiA9IGFyZ3NbMF1cXG4gICAgICAgICAgICBhcmdzID0gYXJnc1sxOl1cXG4gICAgICAgICAgICB3aXRoIHNlbGY6XFxuICAgICAgICAgICAgICAgIGNhbGxhYmxlX29iaigqYXJncywgKiprd2FyZ3MpIFxcblxcbiAgICAgICAgZmluYWxseTpcXG4gICAgICAgICAgICAjIGJwby0yMzg5MDogbWFudWFsbHkgYnJlYWsgYSByZWZlcmVuY2UgY3ljbGVcXG4gICAgICAgICAgICBzZWxmID0gTm9uZVxcblxcbiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRiKTpcXG4gICAgICAgIHJlcyA9IFRydWVcXG4gICAgICAgIGZlZWRiYWNrID0gXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuZXhjZXB0aW9uID0gZXhjX3ZhbHVlXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgYWN0X2V4YyA9IGV4Y190eXBlLl9fbmFtZV9fXFxuICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuICAgICAgICAgICAgYWN0X2V4YyA9IHN0cihleGNfdHlwZSlcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBleHBfZXhjID0gc2VsZi5leHBlY3RlZC5fX25hbWVfX1xcbiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOlxcbiAgICAgICAgICAgIGV4cF9leGMgPSBzdHIoc2VsZi5leHBlY3RlZClcXG5cXG4gICAgICAgIGlmIGV4Y190eXBlIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmVzID0gRmFsc2VcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJ7fSBub3QgcmFpc2VkXFxcIi5mb3JtYXQoZXhwX2V4YylcXG4gICAgICAgIGVsaWYgbm90IGlzc3ViY2xhc3MoZXhjX3R5cGUsIHNlbGYuZXhwZWN0ZWQpOlxcbiAgICAgICAgICAgIHJlcyA9IEZhbHNlXFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQge30gYnV0IGdvdCB7fVxcXCIuZm9ybWF0KGV4cF9leGMsIGFjdF9leGMpXFxuXFxuICAgICAgICBzZWxmLnRlc3RfY2FzZS5hcHBlbmRSZXN1bHQocmVzLCBhY3RfZXhjLCBleHBfZXhjLCBmZWVkYmFjaylcXG4gICAgICAgIHJldHVybiBUcnVlXFxuXFxuXFxuY2xhc3MgVGVzdENhc2Uob2JqZWN0KTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5udW1QYXNzZWQgPSAwXFxuICAgICAgICBzZWxmLm51bUZhaWxlZCA9IDBcXG4gICAgICAgIHNlbGYuYXNzZXJ0UGFzc2VkID0gMFxcbiAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgPSAwXFxuICAgICAgICBzZWxmLnZlcmJvc2l0eSA9IDFcXG4gICAgICAgIHNlbGYudGxpc3QgPSBbXVxcbiAgICAgICAgdGVzdE5hbWVzID0ge31cXG4gICAgICAgIGZvciBuYW1lIGluIGRpcihzZWxmKTpcXG4gICAgICAgICAgICBpZiBuYW1lWzo0XSA9PSAndGVzdCcgYW5kIG5hbWUgbm90IGluIHRlc3ROYW1lczpcXG4gICAgICAgICAgICAgICAgc2VsZi50bGlzdC5hcHBlbmQoZ2V0YXR0cihzZWxmLG5hbWUpKVxcbiAgICAgICAgICAgICAgICB0ZXN0TmFtZXNbbmFtZV09VHJ1ZVxcblxcbiAgICBkZWYgc2V0VXAoc2VsZik6XFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiB0ZWFyRG93bihzZWxmKTpcXG4gICAgICAgIHBhc3NcXG4gICAgXFxuICAgIGRlZiBjbGVhbk5hbWUoc2VsZixmdW5jTmFtZSk6XFxuICAgICAgICByZXR1cm4gZnVuY05hbWUuX19mdW5jX18uX19uYW1lX19cXG5cXG4gICAgZGVmIG1haW4oc2VsZik6XFxuXFxuICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLnRsaXN0OlxcbiAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zaXR5ID4gMTpcXG4gICAgICAgICAgICAgICAgcHJpbnQoJ1J1bm5pbmcgJXMnICUgc2VsZi5jbGVhbk5hbWUoZnVuYykpXFxuICAgICAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgICAgICBzZWxmLnNldFVwKClcXG4gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRQYXNzZWQgPSAwXFxuICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkID0gMFxcbiAgICAgICAgICAgICAgICBmdW5jKClcXG4gICAgICAgICAgICAgICAgc2VsZi50ZWFyRG93bigpXFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuYXNzZXJ0RmFpbGVkID09IDA6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm51bVBhc3NlZCArPSAxXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuICAgICAgICAgICAgICAgICAgICBwcmludCgnVGVzdHMgZmFpbGVkIGluICVzICcgJSBzZWxmLmNsZWFuTmFtZShmdW5jKSlcXG4gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6XFxuICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkICs9IDFcXG4gICAgICAgICAgICAgICAgc2VsZi5udW1GYWlsZWQgKz0gMVxcbiAgICAgICAgICAgICAgICBwcmludCgnVGVzdCB0aHJldyBleGNlcHRpb24gaW4gJXMgKCVzKScgJSAoc2VsZi5jbGVhbk5hbWUoZnVuYyksIGUpKVxcbiAgICAgICAgc2VsZi5zaG93U3VtbWFyeSgpXFxuXFxuICAgIGRlZiBhc3NlcnRFcXVhbChzZWxmLCBhY3R1YWwsIGV4cGVjdGVkLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhY3R1YWw9PWV4cGVjdGVkXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBlcXVhbCAlc1xcXCIgJSAoc3RyKGFjdHVhbCksc3RyKGV4cGVjdGVkKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYWN0dWFsICxleHBlY3RlZCwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RFcXVhbChzZWxmLCBhY3R1YWwsIGV4cGVjdGVkLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhY3R1YWwgIT0gZXhwZWN0ZWRcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBlcXVhbCAlc1xcXCIgJSAoc3RyKGFjdHVhbCksc3RyKGV4cGVjdGVkKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYWN0dWFsLCBleHBlY3RlZCwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRUcnVlKHNlbGYseCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYm9vbCh4KSBpcyBUcnVlXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBUcnVlXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIFRydWUsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0RmFsc2Uoc2VsZix4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBub3QgYm9vbCh4KVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgRmFsc2VcXFwiICUgKHN0cih4KSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgeCwgRmFsc2UsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXMoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgaXMgYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgdGhlIHNhbWUgb2JqZWN0IGFzICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm90KHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIGlzIG5vdCBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgdGhlIHNhbWUgb2JqZWN0IGFzICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm9uZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IHggaXMgTm9uZVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgTm9uZVxcXCIgJSAoc3RyKHgpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCB4LCBOb25lLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm90Tm9uZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IHggaXMgbm90IE5vbmVcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBiZSBOb25lXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIE5vbmUsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SW4oc2VsZiwgYSwgYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSBpbiBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBpbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RJbihzZWxmLCBhLCBiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIG5vdCBpbiBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgaW4gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXNJbnN0YW5jZShzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gaXNpbnN0YW5jZShhLGIpXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBhbiBpbnN0YW5jZSBvZiAlc1xcXCIgJSAoc3RyKGEpLCBzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0Tm90SXNJbnN0YW5jZShzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gbm90IGlzaW5zdGFuY2UoYSxiKVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gbm90IGJlIGFuIGluc3RhbmNlIG9mICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydFJlZ2V4KHNlbGYsIHRleHQsIGV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGYWlsIHRoZSB0ZXN0IHVubGVzcyB0aGUgdGV4dCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkX3JlZ2V4LCAoc3RyLCApKTogI2J5dGVzXFxuICAgICAgICAgICAgYXNzZXJ0IGV4cGVjdGVkX3JlZ2V4LCBcXFwiZXhwZWN0ZWRfcmVnZXggbXVzdCBub3QgYmUgZW1wdHkuXFxcIlxcbiAgICAgICAgICAgIGV4cGVjdGVkX3JlZ2V4ID0gcmUuY29tcGlsZShleHBlY3RlZF9yZWdleClcXG4gICAgICAgIGlmIG5vdCBleHBlY3RlZF9yZWdleC5zZWFyY2godGV4dCk6XFxuICAgICAgICAgICAgcmVzID0gRmFsc2VcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJSZWdleCBkaWRuJ3QgbWF0Y2g6ICVyIG5vdCBmb3VuZCBpbiAlclxcXCIgJSAoXFxuICAgICAgICAgICAgICAgIHJlcHIoZXhwZWN0ZWRfcmVnZXgpLCB0ZXh0KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXMgPSBUcnVlXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHRleHQsIGV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdFJlZ2V4KHNlbGYsIHRleHQsIHVuZXhwZWN0ZWRfcmVnZXgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZhaWwgdGhlIHRlc3QgaWYgdGhlIHRleHQgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZSh1bmV4cGVjdGVkX3JlZ2V4LCAoc3RyLCApKTogIyBieXRlc1xcbiAgICAgICAgICAgIHVuZXhwZWN0ZWRfcmVnZXggPSByZS5jb21waWxlKHVuZXhwZWN0ZWRfcmVnZXgpXFxuICAgICAgICBtYXRjaCA9IHVuZXhwZWN0ZWRfcmVnZXguc2VhcmNoKHRleHQpXFxuICAgICAgICBpZiBtYXRjaDpcXG4gICAgICAgICAgICBmZWVkYmFjayA9ICdSZWdleCBtYXRjaGVkOiAlciBtYXRjaGVzICVyIGluICVyJyAlIChcXG4gICAgICAgICAgICAgICAgdGV4dFttYXRjaC5zdGFydCgpIDogbWF0Y2guZW5kKCldLFxcbiAgICAgICAgICAgICAgICByZXByKHVuZXhwZWN0ZWRfcmVnZXgpLFxcbiAgICAgICAgICAgICAgICB0ZXh0KVxcbiAgICAgICAgICAgICMgX2Zvcm1hdE1lc3NhZ2UgZW5zdXJlcyB0aGUgbG9uZ01lc3NhZ2Ugb3B0aW9uIGlzIHJlc3BlY3RlZFxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQobm90IGJvb2wobWF0Y2gpLCB0ZXh0LCB1bmV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIsIHBsYWNlcz03LCBmZWVkYmFjaz1cXFwiXFxcIiwgZGVsdGE9Tm9uZSk6XFxuXFxuICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICByZXMgPSBhYnMoYS1iKSA8PSBkZWx0YVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBwbGFjZXMgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgcGxhY2VzID0gN1xcbiAgICAgICAgICAgIHJlcyA9IHJvdW5kKGEtYiwgcGxhY2VzKSA9PSAwXFxuICAgICAgICBcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGVxdWFsICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIsIHBsYWNlcz03LCBmZWVkYmFjaz1cXFwiXFxcIiwgZGVsdGE9Tm9uZSk6XFxuXFxuICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICByZXMgPSBub3QgKGEgPT0gYikgYW5kIGFicyhhIC0gYikgPiBkZWx0YVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBwbGFjZXMgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgcGxhY2VzID0gN1xcblxcbiAgICAgICAgICAgIHJlcyA9IHJvdW5kKGEtYiwgcGxhY2VzKSAhPSAwXFxuXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgZXF1YWwgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0R3JlYXRlcihzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA+IGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIGdyZWF0ZXIgdGhhbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRHcmVhdGVyRXF1YWwoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgPj0gYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgPj0gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0TGVzcyhzZWxmLCBhLCBiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIDwgYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgbGVzcyB0aGFuICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydExlc3NFcXVhbChzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA8PSBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSA8PSAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhcHBlbmRSZXN1bHQoc2VsZixyZXMsYWN0dWFsLGV4cGVjdGVkLGZlZWRiYWNrKTpcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICBtc2cgPSAnUGFzcydcXG4gICAgICAgICAgICBzZWxmLmFzc2VydFBhc3NlZCArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG1zZyA9ICdGYWlsOiAnICsgIGZlZWRiYWNrXFxuICAgICAgICAgICAgcHJpbnQobXNnKVxcbiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkICs9IDFcXG5cXG4gICAgZGVmIGFzc2VydFJhaXNlcyhzZWxmLCBleHBlY3RlZF9leGNlcHRpb24sICphcmdzLCAqKmt3YXJncyk6XFxuICAgICAgICBjb250ZXh0ID0gX0Fzc2VydFJhaXNlc0NvbnRleHQoZXhwZWN0ZWRfZXhjZXB0aW9uLCBzZWxmKVxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmhhbmRsZShhcmdzLCBrd2FyZ3MpXFxuICAgICAgICBmaW5hbGx5OlxcbiAgICAgICAgICAgICMgYnBvLTIzODkwOiBtYW51YWxseSBicmVhayBhIHJlZmVyZW5jZSBjeWNsZVxcbiAgICAgICAgICAgIGNvbnRleHQgPSBOb25lXFxuXFxuICAgIGRlZiBmYWlsKHNlbGYsIG1zZz1Ob25lKTpcXG4gICAgICAgIGlmIG1zZyBpcyBOb25lOlxcbiAgICAgICAgICAgIG1zZyA9ICdGYWlsJ1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBtc2cgPSAnRmFpbDogJyArIG1zZ1xcbiAgICAgICAgcHJpbnQobXNnKVxcbiAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgKz0gMVxcblxcbiAgICBkZWYgc2hvd1N1bW1hcnkoc2VsZik6XFxuICAgICAgICBwY3QgPSBzZWxmLm51bVBhc3NlZCAvIChzZWxmLm51bVBhc3NlZCtzZWxmLm51bUZhaWxlZCkgKiAxMDBcXG4gICAgICAgIHByaW50KFxcXCJSYW4gJWQgdGVzdHMsIHBhc3NlZDogJWQgZmFpbGVkOiAlZFxcXFxuXFxcIiAlIChzZWxmLm51bVBhc3NlZCtzZWxmLm51bUZhaWxlZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubnVtUGFzc2VkLCBzZWxmLm51bUZhaWxlZCkpXFxuXFxuXFxuXFxuZGVmIG1haW4odmVyYm9zaXR5PTEpOlxcbiAgICBnbG9iID0gZ2xvYmFscygpICMgZ2xvYmFscygpIHN0aWxsIG5lZWRzIHdvcmtcXG4gICAgZm9yIG5hbWUgaW4gZ2xvYjpcXG4gICAgICAgIGlmIHR5cGUoZ2xvYltuYW1lXSkgPT0gdHlwZSBhbmQgaXNzdWJjbGFzcyhnbG9iW25hbWVdLCBUZXN0Q2FzZSk6XFxuICAgICAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgICAgICB0YyA9IGdsb2JbbmFtZV0oKVxcbiAgICAgICAgICAgICAgICB0Yy52ZXJib3NpdHkgPSB2ZXJib3NpdHlcXG4gICAgICAgICAgICAgICAgdGMubWFpbigpXFxuICAgICAgICAgICAgZXhjZXB0OlxcbiAgICAgICAgICAgICAgICBwcmludChcXFwiVW5jYXVnaHQgRXJyb3IgaW46IFxcXCIsIG5hbWUpXFxuXCIsXCJzcmMvbGliL3VuaXR0ZXN0L2d1aS5weVwiOlwiaW1wb3J0IGRvY3VtZW50XFxuZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2VcXG5mcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuXFxuZnJvbSB0aW1lIGltcG9ydCBzbGVlcFxcblxcblxcbmNsYXNzIFRlc3RDYXNlR3VpKFRlc3RDYXNlKTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgVGVzdENhc2UuX19pbml0X18oc2VsZilcXG4gICAgICAgIHNlbGYuY2xvc2VzdERpdiA9IGRvY3VtZW50LmN1cnJlbnREaXYoKVxcbiAgICAgICAgc2VsZi5kaXZpZCA9IGRvY3VtZW50LmN1cnJlbnRHcmFkaW5nQ29udGFpbmVyKClcXG4gICAgICAgIHNlbGYubXlkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxmLmRpdmlkKVxcbiAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXYgdGhlbiBjcmVhdGUgYSBkdW1teSB0byBhdm9pZCBlcnJvcnMgd2hlbiBydW5uaW5nXFxuICAgICAgICAjIGdyYWRpbmcgXFxcIm9mZiBzY3JlZW5cXFwiXFxuICAgICAgICBpZiBzZWxmLm15ZGl2IGlzIE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5teWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImRpdlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5teWRpdi5zZXRBdHRyaWJ1dGUoXFxcImlkXFxcIiwgc2VsZi5kaXZpZCArIFxcXCJfb2Zmc2NyZWVuX3VuaXRfcmVzdWx0c1xcXCIpXFxuICAgICAgICAgICAgc2VsZi5teWRpdi5zZXRDU1MoXFxcImRpc3BsYXlcXFwiLCBcXFwibm9uZVxcXCIpXFxuICAgICAgICAgICAgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFxcXCJib2R5XFxcIilbMF1cXG4gICAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKHNlbGYubXlkaXYpXFxuICAgICAgICAgICAgc2VsZi51bml0X3Jlc3VsdHNfZGl2aWQgPSBzZWxmLmRpdmlkICsgXFxcIl9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzXFxcIlxcblxcbiAgICAgICAgcmVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIilcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICBzZWxmLnJlc2RpdiA9IHJlc1xcbiAgICAgICAgICAgIHJlcy5pbm5lckhUTUwgPSBcXFwiXFxcIlxcbiAgICAgICAgICAgIHNlbGYudW5pdF9yZXN1bHRzX2RpdmlkID0gc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLnJlc2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImRpdlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0QXR0cmlidXRlKFxcXCJpZFxcXCIsIHNlbGYuZGl2aWQgKyBcXFwiX3VuaXRfcmVzdWx0c1xcXCIpXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJ1bml0dGVzdC1yZXN1bHRzXFxcIilcXG4gICAgICAgICAgICBzZWxmLm15ZGl2LmFwcGVuZENoaWxkKHNlbGYucmVzZGl2KVxcbiAgICAgICAgICAgIHNlbGYudW5pdF9yZXN1bHRzX2RpdmlkID0gc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIlxcblxcbiAgICBkZWYgbWFpbihzZWxmKTpcXG4gICAgICAgIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0YWJsZVxcXCIpXFxuICAgICAgICBzZWxmLnJlc1RhYmxlID0gdFxcbiAgICAgICAgeCA9IHNlbGYucmVzZGl2LmNsb3Nlc3QoXFxcIi50aW1lZENvbXBvbmVudFxcXCIpXFxuICAgICAgICBpZiB4OlxcbiAgICAgICAgICAgIHNlbGYuaXNfdGltZWQgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuaXNfdGltZWQgPSBGYWxzZVxcbiAgICAgICAgc2VsZi5yZXNkaXYuYXBwZW5kQ2hpbGQoc2VsZi5yZXNUYWJsZSlcXG4gICAgICAgIGlmIHNlbGYuaXNfdGltZWQ6XFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0Q1NTKFxcXCJkaXNwbGF5XFxcIiwgXFxcIm5vbmVcXFwiKVxcblxcbiAgICAgICAgaGVhZGVycyA9IFtcXFwiUmVzdWx0XFxcIiwgXFxcIkFjdHVhbCBWYWx1ZVxcXCIsIFxcXCJFeHBlY3RlZCBWYWx1ZVxcXCIsIFxcXCJOb3Rlc1xcXCJdXFxuICAgICAgICByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0clxcXCIpXFxuICAgICAgICBmb3IgaXRlbSBpbiBoZWFkZXJzOlxcbiAgICAgICAgICAgIGhlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0aFxcXCIpXFxuICAgICAgICAgICAgaGVhZC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBoZWFkLmlubmVySFRNTCA9IGl0ZW1cXG4gICAgICAgICAgICBoZWFkLnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChoZWFkKVxcbiAgICAgICAgc2VsZi5yZXNUYWJsZS5hcHBlbmRDaGlsZChyb3cpXFxuXFxuICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLnRsaXN0OlxcbiAgICAgICAgICAgIHRyeTpcXG4gICAgICAgICAgICAgICAgc2VsZi5zZXRVcCgpXFxuICAgICAgICAgICAgICAgIGZ1bmMoKVxcbiAgICAgICAgICAgICAgICBzZWxmLnRlYXJEb3duKClcXG4gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6XFxuICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KFxcXCJFcnJvclxcXCIsIE5vbmUsIE5vbmUsIHN0cihlKS5zcGxpdChcXFwib24gbGluZVxcXCIpWzBdKVxcbiAgICAgICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuICAgICAgICBzZWxmLnNob3dTdW1tYXJ5KClcXG5cXG4gICAgZGVmIGdldE91dHB1dChzZWxmKTpcXG4gICAgICAgIHNsZWVwKDAuMilcXG4gICAgICAgICMgc2VsZi5kaXZpZCB3aWxsIGJlIHRoZSBncmFkaW5nV3JhcHBlciB3aGVuIGluIGdyYWRpbmcgbW9kZVxcbiAgICAgICAgaWYgc2VsZi5jbG9zZXN0RGl2ICE9IHNlbGYuZGl2aWQ6XFxuICAgICAgICAgICAgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXG4gICAgICAgICAgICAgICAgXFxcIiN7fSAje31fc3Rkb3V0XFxcIi5mb3JtYXQoc2VsZi5kaXZpZCwgc2VsZi5jbG9zZXN0RGl2KVxcbiAgICAgICAgICAgIClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgb3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5kaXZpZCArIFxcXCJfc3Rkb3V0XFxcIilcXG4gICAgICAgIHJldHVybiBvdXRwdXQuaW5uZXJUZXh0XFxuXFxuICAgIGRlZiBnZXRFZGl0b3JUZXh0KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEN1cnJlbnRFZGl0b3JWYWx1ZSgpXFxuXFxuICAgIGRlZiBhcHBlbmRSZXN1bHQoc2VsZiwgcmVzLCBhY3R1YWwsIGV4cGVjdGVkLCBwYXJhbSk6XFxuICAgICAgICB0cmltQWN0dWFsID0gRmFsc2VcXG4gICAgICAgIGlmIGxlbihzdHIoYWN0dWFsKSkgPiAxNTpcXG4gICAgICAgICAgICB0cmltQWN0dWFsID0gVHJ1ZVxcbiAgICAgICAgICAgIGFjdHVhbFR5cGUgPSB0eXBlKGFjdHVhbClcXG4gICAgICAgIHRyaW1FeHBlY3RlZCA9IEZhbHNlXFxuICAgICAgICBpZiBsZW4oc3RyKGV4cGVjdGVkKSkgPiAxNTpcXG4gICAgICAgICAgICB0cmltRXhwZWN0ZWQgPSBUcnVlXFxuICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID0gdHlwZShleHBlY3RlZClcXG4gICAgICAgIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRyXFxcIilcXG4gICAgICAgIGVyciA9IEZhbHNlXFxuICAgICAgICBpZiByZXMgPT0gXFxcIkVycm9yXFxcIjpcXG4gICAgICAgICAgICBlcnIgPSBUcnVlXFxuICAgICAgICAgICAgbXNnID0gXFxcIkVycm9yOiAlc1xcXCIgJSBwYXJhbVxcbiAgICAgICAgICAgIGVycm9yRGF0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgICAgICBlcnJvckRhdGEuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuICAgICAgICAgICAgZXJyb3JEYXRhLmlubmVySFRNTCA9IFxcXCJFUlJPUlxcXCJcXG4gICAgICAgICAgICBlcnJvckRhdGEuc2V0Q1NTKFxcXCJiYWNrZ3JvdW5kLWNvbG9yXFxcIiwgXFxcIiNkZThlOTZcXFwiKVxcbiAgICAgICAgICAgIGVycm9yRGF0YS5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoZXJyb3JEYXRhKVxcbiAgICAgICAgZWxpZiByZXM6XFxuICAgICAgICAgICAgcGFzc2VkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgICAgIHBhc3NlZC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBwYXNzZWQuaW5uZXJIVE1MID0gXFxcIlBhc3NcXFwiXFxuICAgICAgICAgICAgcGFzc2VkLnNldENTUyhcXFwiYmFja2dyb3VuZC1jb2xvclxcXCIsIFxcXCIjODNkMzgyXFxcIilcXG4gICAgICAgICAgICBwYXNzZWQuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKHBhc3NlZClcXG4gICAgICAgICAgICBzZWxmLm51bVBhc3NlZCArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGZhaWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICAgICAgZmFpbC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBmYWlsLmlubmVySFRNTCA9IFxcXCJGYWlsXFxcIlxcbiAgICAgICAgICAgIGZhaWwuc2V0Q1NTKFxcXCJiYWNrZ3JvdW5kLWNvbG9yXFxcIiwgXFxcIiNkZThlOTZcXFwiKVxcbiAgICAgICAgICAgIGZhaWwuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGZhaWwpXFxuICAgICAgICAgICAgc2VsZi5udW1GYWlsZWQgKz0gMVxcblxcbiAgICAgICAgYWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgYWN0LnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcbiAgICAgICAgaWYgdHJpbUFjdHVhbDpcXG4gICAgICAgICAgICBhY3RIVE1MID0gc3RyKGFjdHVhbClbOjVdICsgXFxcIi4uLlxcXCIgKyBzdHIoYWN0dWFsKVstNTpdXFxuICAgICAgICAgICAgaWYgYWN0dWFsVHlwZSA9PSBzdHI6XFxuICAgICAgICAgICAgICAgIGFjdEhUTUwgPSByZXByKGFjdEhUTUwpXFxuICAgICAgICAgICAgYWN0LmlubmVySFRNTCA9IGFjdEhUTUxcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgYWN0LmlubmVySFRNTCA9IHJlcHIoYWN0dWFsKVxcbiAgICAgICAgYWN0LnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKGFjdClcXG5cXG4gICAgICAgIGV4cGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgIGV4cGVjdC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG5cXG4gICAgICAgIGlmIHRyaW1FeHBlY3RlZDpcXG4gICAgICAgICAgICBleHBlY3RlZEhUTUwgPSBzdHIoZXhwZWN0ZWQpWzo1XSArIFxcXCIuLi5cXFwiICsgc3RyKGV4cGVjdGVkKVstNTpdXFxuICAgICAgICAgICAgaWYgZXhwZWN0ZWRUeXBlID09IHN0cjpcXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRIVE1MID0gcmVwcihleHBlY3RlZEhUTUwpXFxuICAgICAgICAgICAgZXhwZWN0LmlubmVySFRNTCA9IGV4cGVjdGVkSFRNTFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBleHBlY3QuaW5uZXJIVE1MID0gcmVwcihleHBlY3RlZClcXG4gICAgICAgIGV4cGVjdC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChleHBlY3QpXFxuICAgICAgICBpbnAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICBpbnAuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuXFxuICAgICAgICBpZiBlcnI6XFxuICAgICAgICAgICAgaW5wLmlubmVySFRNTCA9IG1zZ1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpbnAuaW5uZXJIVE1MID0gcGFyYW1cXG4gICAgICAgIGlucC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChpbnApXFxuXFxuICAgICAgICBpZiB0cmltQWN0dWFsIG9yIHRyaW1FeHBlY3RlZDpcXG4gICAgICAgICAgICBleHBhbmRidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJidXR0b25cXFwiKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5pbm5lckhUTUwgPSBcXFwiRXhwYW5kIERpZmZlcmVuY2VzXFxcIlxcbiAgICAgICAgICAgIGV4cGFuZG1zZyA9IFxcXCJBY3R1YWw6IFxcXCIgKyBzdHIoYWN0dWFsKSArIFxcXCJcXFxcbkV4cGVjdGVkOiBcXFwiICsgc3RyKGV4cGVjdGVkKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcInZhbHVlXFxcIiwgZXhwYW5kbXNnKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcInR5cGVcXFwiLCBcXFwiYnV0dG9uXFxcIilcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uc2V0QXR0cmlidXRlKFxcXCJvbmNsaWNrXFxcIiwgXFxcImFsZXJ0KHRoaXMudmFsdWUpXFxcIilcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJidG4gYnRuLWluZm9cXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChleHBhbmRidXR0b24pXFxuXFxuICAgICAgICBzZWxmLnJlc1RhYmxlLmFwcGVuZENoaWxkKHJvdylcXG5cXG4gICAgZGVmIHNob3dTdW1tYXJ5KHNlbGYpOlxcbiAgICAgICAgcGN0ID0gZmxvYXQoc2VsZi5udW1QYXNzZWQpIC8gKHNlbGYubnVtUGFzc2VkICsgc2VsZi5udW1GYWlsZWQpICogMTAwXFxuICAgICAgICBwY3Rjb3JyZWN0ID0gKFxcbiAgICAgICAgICAgIFxcXCJwZXJjZW50OlxcXCJcXG4gICAgICAgICAgICArIHN0cihwY3QpXFxuICAgICAgICAgICAgKyBcXFwiOnBhc3NlZDpcXFwiXFxuICAgICAgICAgICAgKyBzdHIoc2VsZi5udW1QYXNzZWQpXFxuICAgICAgICAgICAgKyBcXFwiOmZhaWxlZDpcXFwiXFxuICAgICAgICAgICAgKyBzdHIoc2VsZi5udW1GYWlsZWQpXFxuICAgICAgICApXFxuICAgICAgICBwVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwicFxcXCIpXFxuICAgICAgICBpZiBub3Qgc2VsZi5pc190aW1lZDpcXG4gICAgICAgICAgICBwVGFnLmlubmVySFRNTCA9IFxcXCJZb3UgcGFzc2VkOiBcXFwiICsgc3RyKHBjdCkgKyBcXFwiJSBvZiB0aGUgdGVzdHNcXFwiXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuYXBwZW5kQ2hpbGQocFRhZylcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBqc2V2YWwoXFxcIndpbmRvdy5lZExpc3RbJ3t9J10ucGN0X2NvcnJlY3QgPSB7fVxcXCIuZm9ybWF0KHNlbGYuY2xvc2VzdERpdiwgcGN0KSlcXG4gICAgICAgICAgICBqc2V2YWwoXFxuICAgICAgICAgICAgICAgIFxcXCJ3aW5kb3cuZWRMaXN0Wyd7fSddLnVuaXRfcmVzdWx0cyA9ICd7fSdcXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VzdERpdiwgcGN0Y29ycmVjdFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgICAgIGpzZXZhbChcXG4gICAgICAgICAgICAgICAgXFxcIndpbmRvdy5lZExpc3RbJ3t9J10udW5pdF9yZXN1bHRzX2RpdmlkID0gJ3t9J1xcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZXN0RGl2LCBzZWxmLm15ZGl2LmdldEF0dHJpYnV0ZShcXFwiaWRcXFwiKVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcblxcbiAgICAgICAgZXhjZXB0OlxcbiAgICAgICAgICAgIHByaW50KFxcbiAgICAgICAgICAgICAgICBcXFwiZmFpbGVkIHRvIGZpbmQgb2JqZWN0IHRvIHJlY29yZCB1bml0dGVzdCByZXN1bHRzISB7fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICAgICAgcGN0Y29ycmVjdFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcblwiLFwic3JjL2xpYi91cmxsaWIvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3JldHVybnt9fTtcIixcInNyYy9saWIvdXJsbGliL3JlcXVlc3QvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9O2EuUmVzcG9uc2U9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS5kYXRhJD1iLnJlc3BvbnNlVGV4dCxhLmxpbmVMaXN0PWEuZGF0YSQuc3BsaXQoXFxcIlxcXFxuXFxcIiksYS5saW5lTGlzdD1hLmxpbmVMaXN0LnNsaWNlKDAsLTEpO2Zvcih2YXIgYz0wO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWEubGluZUxpc3RbY10rPVxcXCJcXFxcblxcXCI7YS5jdXJyZW50TGluZT0wLGEucG9zJD0wfSksYi5fX3N0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShcXFwiPFJlc3BvbnNlPlxcXCIpfSksYi5fX2l0ZXJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWEubGluZUxpc3Q7cmV0dXJuIFNrLmJ1aWx0aW4ubWFrZUdlbmVyYXRvcihmdW5jdGlvbigpe3JldHVybiB0aGlzLiRpbmRleD49dGhpcy4kbGluZXMubGVuZ3RoP3ZvaWQgMDpuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kbGluZXNbdGhpcy4kaW5kZXgrK10pfSx7JG9iajphLCRpbmRleDowLCRsaW5lczpifSl9KSxiLnJlYWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKGEuY2xvc2VkKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGVcXFwiKTt2YXIgYz1hLmRhdGEkLmxlbmd0aDt2b2lkIDA9PT1iJiYoYj1jKTt2YXIgZD1uZXcgU2suYnVpbHRpbi5zdHIoYS5kYXRhJC5zdWJzdHIoYS5wb3MkLGIpKTtyZXR1cm4gYS5wb3MkKz1iLGEucG9zJD49YyYmKGEucG9zJD1jKSxkfSksYi5yZWFkbGluZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVxcXCJcXFwiO3JldHVybiBhLmN1cnJlbnRMaW5lPGEubGluZUxpc3QubGVuZ3RoJiYoYj1hLmxpbmVMaXN0W2EuY3VycmVudExpbmVdLGEuY3VycmVudExpbmUrKyksbmV3IFNrLmJ1aWx0aW4uc3RyKGIpfSksYi5yZWFkbGluZXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz1hLmN1cnJlbnRMaW5lO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYS5saW5lTGlzdFtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSl9LFxcXCJSZXNwb25zZVxcXCIsW10pO3ZhciBiPWZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFTay5qc29ucFNpdGVzKXJldHVybiExO2ZvcihiPTA7YjxTay5qc29ucFNpdGVzLmxlbmd0aDtiKyspaWYoYS5zdGFydHNXaXRoKFNrLmpzb25wU2l0ZXNbYl0pKXJldHVybiEwO3JldHVybiExfTtyZXR1cm4gYS51cmxvcGVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYyxkKXt2YXIgZT1iKGMudik/bmV3IFByb21pc2UoZnVuY3Rpb24oYixkKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJzY3JpcHRcXFwiKTtlLnNyYz1jLnYrXFxcIiZjYWxsYmFjaz1Tay5qc29ucGNhbGxiYWNrXFxcIixlLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKFxcXCJBbiBlcnJvciBvY2N1cmVkIGdldHRpbmcgdGhlIGRhdGFcXFwiKX0sU2suanNvbnBjYWxsYmFjaz1mdW5jdGlvbihjKXt2YXIgZD17cmVzcG9uc2VUZXh0OkpTT04uc3RyaW5naWZ5KGMpfTtiKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlJlc3BvbnNlLFtkXSkpfTt0cnl7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX1jYXRjaChhKXtjb25zb2xlLmxvZyhcXFwiY2F1Z2h0IGVycm9yIGluIHVybG9wZW5cXFwiK2EpfX0pOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGIpe3ZhciBlPW5ldyBYTUxIdHRwUmVxdWVzdDtlLmFkZEV2ZW50TGlzdGVuZXIoXFxcImxvYWRlbmRcXFwiLGZ1bmN0aW9uKCl7YihTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5SZXNwb25zZSxbZV0pKX0pLGQ/KGUub3BlbihcXFwiUE9TVFxcXCIsYy52KSxlLnNldFJlcXVlc3RIZWFkZXIoXFxcIkNvbnRlbnQtdHlwZVxcXCIsXFxcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxcXCIpLGUuc2VuZChkLnYpKTooZS5vcGVuKFxcXCJHRVRcXFwiLGMudiksZS5zZW5kKG51bGwpKX0pO3ZhciBmPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO3JldHVybiBmLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiByZXNvbHV0aW9ufSxmLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6ZS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiByZXNvbHV0aW9uPWEsYX0sZnVuY3Rpb24oYSl7cmV0dXJuIHJlc29sdXRpb249XFxcIlxcXCIsYX0pfSxmfSksYX07XCIsXCJzcmMvbGliL3VybGxpYjIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInVybGxpYjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91cmxwYXJzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXJscGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91c2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ1c2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdXUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInV1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdXVpZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXVpZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dhcm5pbmdzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3YXJuaW5ncyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dhdmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndhdmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93ZWFrcmVmLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3ZWFrcmVmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2ViYnJvd3Nlci5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb3Blbl90YWIoYSl7cmV0dXJuKFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInVybFxcXCIsXFxcInN0cmluZ1xcXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSksIWIpP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6KGE9YS4kanNzdHIoKSx3aW5kb3cub3BlbihhLFxcXCJfYmxhbmtcXFwiKSxTay5idWlsdGluLmJvb2wudHJ1ZSQpfXZhciBhPXt9LGI9XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cmJlxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2Ygd2luZG93Lm5hdmlnYXRvcjtyZXR1cm4gYS5fX25hbWVfXz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIndlYmJyb3dzZXJcXFwiKSxhLm9wZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuXFxcIixhcmd1bWVudHMubGVuZ3RoKzEsMSwzKSxvcGVuX3RhYihhKX0pLGEub3Blbl9uZXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuX25ldyhhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxvcGVuX3RhYihhKX0pLGEub3Blbl9uZXdfdGFiPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXdfdGFiKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuX25ld190YWJcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxvcGVuX3RhYihhKX0pLGEuRGVmYXVsdEJyb3dzZXI9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uIGRmbGJyb3dzZXIoYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gX19pbml0X18oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSksYi5vcGVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3BlbihhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCksb3Blbl90YWIoYil9KSxiLm9wZW5fbmV3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXcoYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxvcGVuX3RhYihiKX0pLGIub3Blbl9uZXdfdGFiPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXdfdGFiKGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5fbmV3X3RhYlxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLG9wZW5fdGFiKGIpfSl9LFxcXCJEZWZhdWx0QnJvd3NlclxcXCIsW10pLGEuZ2V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldFxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLkRlZmF1bHRCcm93c2VyLFtdKX0pLGF9O1wiLFwic3JjL2xpYi93ZWJicm93c2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3ZWJicm93c2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2ViZ2wvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIndlYmdsXFxcIil9LGM9ZnVuY3Rpb24oYSl7cmV0dXJuXFxcIjx0YWJsZSBzdHlsZT1cXFxcXFxcImJhY2tncm91bmQtY29sb3I6ICM4Q0U7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XFxcXFxcXCI+PHRyPjx0ZCBhbGlnbj1cXFxcXFxcImNlbnRlclxcXFxcXFwiPjxkaXYgc3R5bGU9XFxcXFxcXCJkaXNwbGF5OiB0YWJsZS1jZWxsOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXFxcXFwiPjxkaXYgc3R5bGU9XFxcXFxcXCJcXFxcXFxcIj5cXFwiK2ErXFxcIjwvZGl2PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPlxcXCJ9LGQ9XFxcIlRoaXMgcGFnZSByZXF1aXJlcyBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBXZWJHTC48YnIvPjxhIGhyZWY9XFxcXFxcXCJodHRwOi8vZ2V0LndlYmdsLm9yZ1xcXFxcXFwiPkNsaWNrIGhlcmUgdG8gdXBncmFkZSB5b3VyIGJyb3dzZXIuPC9hPlxcXCIsZT1mdW5jdGlvbihhKXtmb3IodmFyIGI9W1xcXCJ3ZWJnbFxcXCIsXFxcImV4cGVyaW1lbnRhbC13ZWJnbFxcXCIsXFxcIndlYmtpdC0zZFxcXCIsXFxcIm1vei13ZWJnbFxcXCJdLGM9bnVsbCxkPTA7ZDxiLmxlbmd0aDsrK2Qpe3RyeXtjPWEuZ2V0Q29udGV4dChiW2RdKX1jYXRjaChhKXt9aWYoYylicmVha31pZihjKXtmdW5jdGlvbiByZXR1cm5GYWxzZSgpe3JldHVybiExfWEub25zZWxlY3RzdGFydD1yZXR1cm5GYWxzZSxhLm9ubW91c2Vkb3duPXJldHVybkZhbHNlfXJldHVybiBjfSxmPWZ1bmN0aW9uKGEsZil7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7aWYoZnx8KGY9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZShcXFwiY2FudmFzXFxcIilbMF0pLCFmKXJldHVybiB2b2lkKGcuaW5uZXJIVE1MPWMoZCkpO3ZhciBoPWUoZik7aWYoIWgpe3ZhciBpPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhcXFxcdytcXFxcLy4qPyApL2cpLGo9e307dHJ5e2Zvcih2YXIgaz0wO2s8aS5sZW5ndGg7KytrKXtmb3IodmFyIGw9aVtrXS5tYXRjaCgvKFxcXFx3KykvZyksbT1bXSxuPTE7bjxsLmxlbmd0aDsrK24pbS5wdXNoKHBhcnNlSW50KGxbbl0pKTtqW2xbMF1dPW19fWNhdGNoKGEpe31nLmlubmVySFRNTD1qLkNocm9tZSYmKDc8ai5DaHJvbWVbMF18fDc9PWouQ2hyb21lWzBdJiYwPGouQ2hyb21lWzFdfHw3PT1qLkNocm9tZVswXSYmMD09ai5DaHJvbWVbMV0mJjUyMTw9ai5DaHJvbWVbMl0pP2MoXFxcIkl0IGRvZXNuJ3QgYXBwZWFyIHlvdXIgY29tcHV0ZXIgY2FuIHN1cHBvcnQgV2ViR0wuPGJyLz48YSBocmVmPVxcXFxcXFwiaHR0cDovL2dldC53ZWJnbC5vcmdcXFxcXFxcIj5DbGljayBoZXJlIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvYT5cXFwiKTpjKGQpfXJldHVybiBofTtyZXR1cm4gYS5Db250ZXh0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIudiksZD1mKGIudixjKTtpZighZCl0aHJvdyBuZXcgRXJyb3IoXFxcIllvdXIgYnJvd3NlciBkb2VzIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBXZWJHTC5cXFwiKTtmb3IodmFyIGUgaW4gYS5nbD1kLGQuX19wcm90b19fKWlmKFxcXCJudW1iZXJcXFwiPT10eXBlb2YgZC5fX3Byb3RvX19bZV0pU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihlKSxkLl9fcHJvdG9fX1tlXSk7ZWxzZSBpZihcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZC5fX3Byb3RvX19bZV0pc3dpdGNoKGUpe2Nhc2VcXFwiYnVmZmVyRGF0YVxcXCI6YnJlYWs7Y2FzZVxcXCJjbGVhckNvbG9yXFxcIjpicmVhaztjYXNlXFxcImRyYXdBcnJheXNcXFwiOmJyZWFrO2Nhc2VcXFwiZ2V0QXR0cmliTG9jYXRpb25cXFwiOmJyZWFrO2Nhc2VcXFwiZ2V0VW5pZm9ybUxvY2F0aW9uXFxcIjpicmVhaztjYXNlXFxcInNoYWRlclNvdXJjZVxcXCI6YnJlYWs7Y2FzZVxcXCJ1bmlmb3JtTWF0cml4NGZ2XFxcIjpicmVhaztjYXNlXFxcInZlcnRleEF0dHJpYlBvaW50ZXJcXFwiOmJyZWFrO2Nhc2VcXFwidmlld3BvcnRcXFwiOmJyZWFrO2RlZmF1bHQ6KGZ1bmN0aW9uKGIpe1NrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoZSksbmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhPWQuX19wcm90b19fW2JdO3JldHVybiBhLmFwcGx5KGQsYXJndW1lbnRzKX0pKX0pKGUpO31kLmNsZWFyQ29sb3IoMTAwLzI1NSwxNDkvMjU1LDIzNy8yNTUsMSksZC5jbGVhcihkLkNPTE9SX0JVRkZFUl9CSVQpfSksYi50cCRnZXRhdHRyPVNrLmdlbmVyaWMuZ2V0QXR0cixiLmJ1ZmZlckRhdGE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLmdsLmJ1ZmZlckRhdGEoYixjLnYsZCl9KSxiLmNsZWFyQ29sb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe2EuZ2wuY2xlYXJDb2xvcihTay5idWlsdGluLmFzbnVtJChiKSxTay5idWlsdGluLmFzbnVtJChjKSxTay5idWlsdGluLmFzbnVtJChkKSxTay5idWlsdGluLmFzbnVtJChlKSl9KSxiLmdldEF0dHJpYkxvY2F0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmdsLmdldEF0dHJpYkxvY2F0aW9uKGIsYy52KX0pLGIuZ2V0VW5pZm9ybUxvY2F0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihiLGMudil9KSxiLnNoYWRlclNvdXJjZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLmdsLnNoYWRlclNvdXJjZShiLGMudil9KSxiLmRyYXdBcnJheXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLmdsLmRyYXdBcnJheXMoU2suYnVpbHRpbi5hc251bSQoYiksU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCkpfSksYi52ZXJ0ZXhBdHRyaWJQb2ludGVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7YS5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGIsU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCksZSxTay5idWlsdGluLmFzbnVtJChmKSxTay5idWlsdGluLmFzbnVtJChnKSl9KSxiLnZpZXdwb3J0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXthLmdsLnZpZXdwb3J0KFNrLmJ1aWx0aW4uYXNudW0kKGIpLFNrLmJ1aWx0aW4uYXNudW0kKGMpLFNrLmJ1aWx0aW4uYXNudW0kKGQpLFNrLmJ1aWx0aW4uYXNudW0kKGUpKX0pLGIudW5pZm9ybU1hdHJpeDRmdj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EuZ2wudW5pZm9ybU1hdHJpeDRmdihTay5idWlsdGluLmFzbnVtJChiKSxjLGQudil9KSxiLnNldERyYXdGdW5jPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgRGF0ZSgpLmdldFRpbWUoKSxkPXNldEludGVydmFsKGZ1bmN0aW9uKCl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW2EsbmV3IERhdGUoKS5nZXRUaW1lKCktY10pfSwxZTMvNjApfSl9LFxcXCJDb250ZXh0XFxcIixbXSksYS5GbG9hdDMyQXJyYXk9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52PVxcXCJudW1iZXJcXFwiPT10eXBlb2YgYj9uZXcgRmxvYXQzMkFycmF5KGIpOm5ldyBGbG9hdDMyQXJyYXkoU2suZmZpLnJlbWFwVG9KcyhiKSl9KSxiLl9fcmVwcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEudi5sZW5ndGg7KytjKWIucHVzaChhLnZbY10pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIltcXFwiK2Iuam9pbihcXFwiLCBcXFwiKStcXFwiXVxcXCIpfSl9LFxcXCJGbG9hdDMyQXJyYXlcXFwiLFtdKSxhLk1hdHJpeDR4ND1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9bmV3IEZsb2F0MzJBcnJheShTay5mZmkucmVtYXBUb0pzKGIpKX0pLGIuaWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnY7YlswXT0xLGJbMV09MCxiWzJdPTAsYlszXT0wLGJbNF09MCxiWzVdPTEsYls2XT0wLGJbN109MCxiWzhdPTAsYls5XT0wLGJbMTBdPTEsYlsxMV09MCxiWzEyXT0wLGJbMTNdPTAsYlsxNF09MCxiWzE1XT0xfSksYi5wZXJzcGVjdGl2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyxkLGUsZyl7dmFyIGg9TWF0aC50YW4saT1NYXRoLlBJLGo9aCguNSppLS41KihTay5idWlsdGluLmFzbnVtJChjKSppLzE4MCkpLGw9U2suYnVpbHRpbi5hc251bSQoZCksYT1Tay5idWlsdGluLmFzbnVtJChlKSxuPVNrLmJ1aWx0aW4uYXNudW0kKGcpLGY9MS8oYS1uKSxrPWIudjtrWzBdPWovbCxrWzFdPTAsa1syXT0wLGtbM109MCxrWzRdPTAsa1s1XT1qLGtbNl09MCxrWzddPTAsa1s4XT0wLGtbOV09MCxrWzEwXT0oYStuKSpmLGtbMTFdPS0xLGtbMTJdPTAsa1sxM109MCxrWzE0XT0yKihhKm4qZiksa1sxNV09MH0pLGIudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnYsZD1Tay5mZmkucmVtYXBUb0pzKGIpO2NbMF09MSxjWzFdPTAsY1syXT0wLGNbM109MCxjWzRdPTAsY1s1XT0xLGNbNl09MCxjWzddPTAsY1s4XT0wLGNbOV09MCxjWzEwXT0xLGNbMTFdPTAsY1sxMl09ZFswXSxjWzEzXT1kWzFdLGNbMTRdPWRbMl0sY1sxNV09MX0pLGIuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS52Lmxlbmd0aDsrK2MpYi5wdXNoKGEudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiW1xcXCIrYi5qb2luKFxcXCIsIFxcXCIpK1xcXCJdXFxcIil9KX0sXFxcIk1hdHJpeDR4NFxcXCIsW10pLGF9O1wiLFwic3JjL2xpYi93ZWJnbC9tYXRoLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fTtyZXR1cm4gYS5NYXQ0ND1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYixjKXt2YXIgZD1NYXRoLnNxcnQ7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLmxvYWRJZGVudGl0eSxbYV0pLGEuc3RhY2s9W119KSxjLnB1c2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnN0YWNrLnB1c2goYS5lbGVtZW50cy5zbGljZSgwKSl9KSxjLnBvcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuZWxlbWVudHM9YS5zdGFjay5wb3AoKX0pLGMubG9hZElkZW50aXR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV19KSxjLnRyYW5zZm9ybTM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe3ZhciBkPWIuZWxlbWVudHM7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlZlYzMsW2RbMF0qYy54K2RbNF0qYy55K2RbOF0qYy56LGRbMV0qYy54K2RbNV0qYy55K2RbOV0qYy56LGRbMl0qYy54K2RbNl0qYy55K2RbMTBdKmMuel0pfSksYy5zY2FsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmVsZW1lbnRzWzBdKj1iLGEuZWxlbWVudHNbMV0qPWIsYS5lbGVtZW50c1syXSo9YixhLmVsZW1lbnRzWzNdKj1iLGEuZWxlbWVudHNbNF0qPWMsYS5lbGVtZW50c1s1XSo9YyxhLmVsZW1lbnRzWzZdKj1jLGEuZWxlbWVudHNbN10qPWMsYS5lbGVtZW50c1s4XSo9ZCxhLmVsZW1lbnRzWzldKj1kLGEuZWxlbWVudHNbMTBdKj1kLGEuZWxlbWVudHNbMTFdKj1kLGF9KSxjLnRyYW5zbGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmVsZW1lbnRzWzEyXSs9YS5lbGVtZW50c1swXSpiK2EuZWxlbWVudHNbNF0qYythLmVsZW1lbnRzWzhdKmQsYS5lbGVtZW50c1sxM10rPWEuZWxlbWVudHNbMV0qYithLmVsZW1lbnRzWzVdKmMrYS5lbGVtZW50c1s5XSpkLGEuZWxlbWVudHNbMTRdKz1hLmVsZW1lbnRzWzJdKmIrYS5lbGVtZW50c1s2XSpjK2EuZWxlbWVudHNbMTBdKmQsYS5lbGVtZW50c1sxNV0rPWEuZWxlbWVudHNbM10qYithLmVsZW1lbnRzWzddKmMrYS5lbGVtZW50c1sxMV0qZCxhfSksYy5yb3RhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZSxmLGcpe3ZhciBoPU1hdGguY29zLGk9TWF0aC5zaW4saj1NYXRoLlBJLGs9ZChlKmUrZipmK2cqZyksbD1pKGMqai8xODApLG09aChjKmovMTgwKTtpZigwPGspe3ZhciBuLG8scCxxLHIscyx0LHUsdix3LEE7ZS89ayxmLz1rLGcvPWssbj1lKmUsbz1mKmYscD1nKmcscT1lKmYscj1mKmcscz1nKmUsdD1lKmwsdT1mKmwsdj1nKmwsdz0xLW0sQT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5NYXQ0NCksQS5lbGVtZW50c1swXT13Km4rbSxBLmVsZW1lbnRzWzFdPXcqcS12LEEuZWxlbWVudHNbMl09dypzK3UsQS5lbGVtZW50c1szXT0wLEEuZWxlbWVudHNbNF09dypxK3YsQS5lbGVtZW50c1s1XT13Km8rbSxBLmVsZW1lbnRzWzZdPXcqci10LEEuZWxlbWVudHNbN109MCxBLmVsZW1lbnRzWzhdPXcqcy11LEEuZWxlbWVudHNbOV09dypyK3QsQS5lbGVtZW50c1sxMF09dypwK20sQS5lbGVtZW50c1sxMV09MCxBLmVsZW1lbnRzWzEyXT0wLEEuZWxlbWVudHNbMTNdPTAsQS5lbGVtZW50c1sxNF09MCxBLmVsZW1lbnRzWzE1XT0xLEE9QS5tdWx0aXBseShiKSxiLmVsZW1lbnRzPUEuZWxlbWVudHN9cmV0dXJuIGJ9KSxjLm11bHRpcGx5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXtmb3IodmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuTWF0NDQpLGU9MDs0PmU7ZSsrKWQuZWxlbWVudHNbNCplKzBdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMF0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s0XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzhdK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTJdLGQuZWxlbWVudHNbNCplKzFdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMV0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s1XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzldK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTNdLGQuZWxlbWVudHNbNCplKzJdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMl0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s2XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzEwXStiLmVsZW1lbnRzWzQqZSszXSpjLmVsZW1lbnRzWzE0XSxkLmVsZW1lbnRzWzQqZSszXT1iLmVsZW1lbnRzWzQqZSswXSpjLmVsZW1lbnRzWzNdK2IuZWxlbWVudHNbNCplKzFdKmMuZWxlbWVudHNbN10rYi5lbGVtZW50c1s0KmUrMl0qYy5lbGVtZW50c1sxMV0rYi5lbGVtZW50c1s0KmUrM10qYy5lbGVtZW50c1sxNV07cmV0dXJuIGIuZWxlbWVudHM9ZC5lbGVtZW50cyxifSksYy5sb29rQXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZSxmLGcsaCxpLGosayxsKXt2YXIgbT1bYy1nLGUtaCxmLWldLG49ZChtWzBdKm1bMF0rbVsxXSptWzFdK21bMl0qbVsyXSk7biYmKG1bMF0vPW4sbVsxXS89bixtWzJdLz1uKTt2YXIgbz1baixrLGxdLHA9W107cFswXT1vWzFdKm1bMl0tb1syXSptWzFdLHBbMV09LW9bMF0qbVsyXStvWzJdKm1bMF0scFsyXT1vWzBdKm1bMV0tb1sxXSptWzBdLG9bMF09bVsxXSpwWzJdLW1bMl0qcFsxXSxvWzFdPS1tWzBdKnBbMl0rbVsyXSpwWzBdLG9bMl09bVswXSpwWzFdLW1bMV0qcFswXSxuPWQocFswXSpwWzBdK3BbMV0qcFsxXStwWzJdKnBbMl0pLG4mJihwWzBdLz1uLHBbMV0vPW4scFsyXS89biksbj1kKG9bMF0qb1swXStvWzFdKm9bMV0rb1syXSpvWzJdKSxuJiYob1swXS89bixvWzFdLz1uLG9bMl0vPW4pO3ZhciBxPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLk1hdDQ0KTtyZXR1cm4gcS5lbGVtZW50c1swXT1wWzBdLHEuZWxlbWVudHNbNF09cFsxXSxxLmVsZW1lbnRzWzhdPXBbMl0scS5lbGVtZW50c1sxMl09MCxxLmVsZW1lbnRzWzFdPW9bMF0scS5lbGVtZW50c1s1XT1vWzFdLHEuZWxlbWVudHNbOV09b1syXSxxLmVsZW1lbnRzWzEzXT0wLHEuZWxlbWVudHNbMl09bVswXSxxLmVsZW1lbnRzWzZdPW1bMV0scS5lbGVtZW50c1sxMF09bVsyXSxxLmVsZW1lbnRzWzE0XT0wLHEuZWxlbWVudHNbM109MCxxLmVsZW1lbnRzWzddPTAscS5lbGVtZW50c1sxMV09MCxxLmVsZW1lbnRzWzE1XT0xLHE9cS5tdWx0aXBseShiKSxiLmVsZW1lbnRzPXEuZWxlbWVudHMsYi50cmFuc2xhdGUoLWMsLWUsLWYpLGJ9KX0sXFxcIk1hdDQ0XFxcIixbXSksYS5NYXQzMz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIubG9hZElkZW50aXR5LFthXSl9KSxiLmxvYWRJZGVudGl0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXX0pfSxcXFwiTWF0MzNcXFwiLFtdKSxhLlZlYzM9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGIsYyl7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EueD1iLGEueT1jLGEuej1kfSksYy5fX3N1Yl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuVmVjMyxbYi54LWMueCxiLnktYy55LGIuei1jLnpdKX0pfSxcXFwiVmVjM1xcXCIsW10pLGEuY3Jvc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe3JldHVybiBTay5hc3NlcnRzLmFzc2VydChiIGluc3RhbmNlb2YgYS5WZWMzJiZjIGluc3RhbmNlb2YgYS5WZWMzKSxTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5WZWMzLFtiLnkqYy56LWIueipjLnksYi56KmMueC1iLngqYy56LGIueCpjLnktYi55KmMueF0pfSksYX07XCIsXCJzcmMvbGliL3dlYmdsL21hdHJpeDQuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPU1hdGguUEksYj17fSxjPW5ldyBGbG9hdDMyQXJyYXkoMyksZD1uZXcgRmxvYXQzMkFycmF5KDMpLGU9bmV3IEZsb2F0MzJBcnJheSgzKSxmPW5ldyBGbG9hdDMyQXJyYXkoNCksZz1uZXcgRmxvYXQzMkFycmF5KDQpLGg9bmV3IEZsb2F0MzJBcnJheSg0KSxpPW5ldyBGbG9hdDMyQXJyYXkoMTYpLGo9bmV3IEZsb2F0MzJBcnJheSgxNiksaz1uZXcgRmxvYXQzMkFycmF5KDE2KSxsPWZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBhPU1hdGguc3FydCxkPTAsZT1jLmxlbmd0aCxmPTA7ZjxlOysrZilkKz1jW2ZdKmNbZl07aWYoZD1hKGQpLDFlLTU8ZClmb3IodmFyIGY9MDtmPGU7KytmKWJbZl09Y1tmXS9kO2Vsc2UgZm9yKHZhciBmPTA7ZjxlOysrZiliW2ZdPTA7cmV0dXJuIGJ9LG09ZnVuY3Rpb24oYyxkLGEpe3JldHVybiBjWzBdPWRbMV0qYVsyXS1kWzJdKmFbMV0sY1sxXT1kWzJdKmFbMF0tZFswXSphWzJdLGNbMl09ZFswXSphWzFdLWRbMV0qYVswXSxjfSxuPWZ1bmN0aW9uKGMsZCxhKXtmb3IodmFyIGI9ZC5sZW5ndGgsZT0wO2U8YjsrK2UpY1tlXT1kW2VdLWFbZV07cmV0dXJuIGN9LG89ZnVuY3Rpb24oYyxhKXtyZXR1cm4gY1swXSphWzBdK2NbMV0qYVsxXStjWzJdKmFbMl19O3JldHVybiBiLmxvb2tBdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixmLGcpe3ZhciBoPWMsaT1kLGo9bChoLG4oaCxiLnYsZi52KSksaz1sKGksbShpLGcudixqKSkscD1tKGUsaixrKSxxPWEudjtyZXR1cm4gcVswXT1rWzBdLHFbMV09cFswXSxxWzJdPWpbMF0scVszXT0wLHFbNF09a1sxXSxxWzVdPXBbMV0scVs2XT1qWzFdLHFbN109MCxxWzhdPWtbMl0scVs5XT1wWzJdLHFbMTBdPWpbMl0scVsxMV09MCxxWzEyXT0tbyhrLGIudikscVsxM109LW8ocCxiLnYpLHFbMTRdPS1vKGosYi52KSxxWzE1XT0xLGF9KSxiLnBlcnNwZWN0aXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjLGQsZSxnKXt2YXIgaD1NYXRoLnRhbixpPWgoLjUqYS0uNSooYyphLzE4MCkpLGY9MS8oZS1nKSxqPWIudjtyZXR1cm4galswXT1pL2QsalsxXT0wLGpbMl09MCxqWzNdPTAsals0XT0wLGpbNV09aSxqWzZdPTAsals3XT0wLGpbOF09MCxqWzldPTAsalsxMF09KGUrZykqZixqWzExXT0tMSxqWzEyXT0wLGpbMTNdPTAsalsxNF09MiooZSpnKmYpLGpbMTVdPTAsYn0pLGIucm90YXRpb25ZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixkKXt2YXIgZT1NYXRoLnNpbixmPU1hdGguY29zLGc9Yi52LGg9ZihkKmEvMTgwKSxjPWUoZCphLzE4MCk7cmV0dXJuIGdbMF09aCxnWzFdPTAsZ1syXT0tYyxnWzNdPTAsZ1s0XT0wLGdbNV09MSxnWzZdPTAsZ1s3XT0wLGdbOF09YyxnWzldPTAsZ1sxMF09aCxnWzExXT0wLGdbMTJdPTAsZ1sxM109MCxnWzE0XT0wLGdbMTVdPTEsYn0pLGIuaWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnY7cmV0dXJuIGJbMF09MSxiWzFdPTAsYlsyXT0wLGJbM109MCxiWzRdPTAsYls1XT0xLGJbNl09MCxiWzddPTAsYls4XT0wLGJbOV09MCxiWzEwXT0xLGJbMTFdPTAsYlsxMl09MCxiWzEzXT0wLGJbMTRdPTAsYlsxNV09MSxhfSksYi5tdWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihjLGQsZSl7dmFyIGY9Yy52LGc9ZC52LGE9ZS52LGI9Z1swXSxoPWdbMV0saT1nWzJdLGo9Z1szXSxrPWdbNF0sbD1nWzVdLG09Z1s2XSxuPWdbN10sbz1nWzhdLHA9Z1s5XSxxPWdbMTBdLHI9Z1sxMV0scz1nWzEyXSx0PWdbMTNdLHU9Z1sxNF0sdj1nWzE1XSx3PWFbMF0seD1hWzFdLHk9YVsyXSx6PWFbM10sQT1hWzRdLEI9YVs1XSxDPWFbNl0sRD1hWzddLEU9YVs4XSxGPWFbOV0sRz1hWzEwXSxIPWFbMTFdLEk9YVsxMl0sSj1hWzEzXSxLPWFbMTRdLEw9YVsxNV07cmV0dXJuIGZbMF09Yip3K2gqQStpKkUraipJLGZbMV09Yip4K2gqQitpKkYraipKLGZbMl09Yip5K2gqQytpKkcraipLLGZbM109Yip6K2gqRCtpKkgraipMLGZbNF09ayp3K2wqQSttKkUrbipJLGZbNV09ayp4K2wqQittKkYrbipKLGZbNl09ayp5K2wqQyttKkcrbipLLGZbN109ayp6K2wqRCttKkgrbipMLGZbOF09byp3K3AqQStxKkUrcipJLGZbOV09byp4K3AqQitxKkYrcipKLGZbMTBdPW8qeStwKkMrcSpHK3IqSyxmWzExXT1vKnorcCpEK3EqSCtyKkwsZlsxMl09cyp3K3QqQSt1KkUrdipJLGZbMTNdPXMqeCt0KkIrdSpGK3YqSixmWzE0XT1zKnkrdCpDK3UqRyt2KkssZlsxNV09cyp6K3QqRCt1KkgrdipMLGN9KSxiLmludmVydD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LGU9Yi52LGY9ZVswXSxnPWVbMV0saD1lWzJdLGk9ZVszXSxqPWVbNF0saz1lWzVdLGw9ZVs2XSxtPWVbN10sbj1lWzhdLG89ZVs5XSxwPWVbMTBdLHE9ZVsxMV0scj1lWzEyXSxzPWVbMTNdLHQ9ZVsxNF0sdT1lWzE1XSx2PXAqdSx3PXQqcSx4PWwqdSx5PXQqbSx6PWwqcSxBPXAqbSxCPWgqdSxDPXQqaSxEPWgqcSxFPXAqaSxGPWgqbSxHPWwqaSxIPW4qcyxJPXIqbyxKPWoqcyxLPXIqayxMPWoqbyxNPW4qayxOPWYqcyxPPXIqZyxQPWYqbyxRPW4qZyxSPWYqayxTPWoqZyxUPXYqayt5Km8reipzLSh3KmsreCpvK0EqcyksVT13KmcrQipvK0Uqcy0odipnK0MqbytEKnMpLFY9eCpnK0MqaytGKnMtKHkqZytCKmsrRypzKSxXPUEqZytEKmsrRypvLSh6KmcrRSprK0YqbyksWD0xLyhmKlQraipVK24qVityKlcpO3JldHVybiBjWzBdPVgqVCxjWzFdPVgqVSxjWzJdPVgqVixjWzNdPVgqVyxjWzRdPVgqKHcqait4Km4rQSpyLSh2KmoreSpuK3oqcikpLGNbNV09WCoodipmK0MqbitEKnItKHcqZitCKm4rRSpyKSksY1s2XT1YKih5KmYrQipqK0cqci0oeCpmK0MqaitGKnIpKSxjWzddPVgqKHoqZitFKmorRipuLShBKmYrRCpqK0cqbikpLGNbOF09WCooSCptK0sqcStMKnUtKEkqbStKKnErTSp1KSksY1s5XT1YKihJKmkrTipxK1EqdS0oSCppK08qcStQKnUpKSxjWzEwXT1YKihKKmkrTyptK1IqdS0oSyppK04qbStTKnUpKSxjWzExXT1YKihNKmkrUCptK1MqcS0oTCppK1EqbStSKnEpKSxjWzEyXT1YKihKKnArTSp0K0kqbC0oTCp0K0gqbCtLKnApKSxjWzEzXT1YKihQKnQrSCpoK08qcC0oTipwK1EqdCtJKmgpKSxjWzE0XT1YKihOKmwrUyp0K0sqaC0oUip0K0oqaCtPKmwpKSxjWzE1XT1YKihSKnArTCpoK1EqbC0oUCpsK1MqcCtNKmgpKSxhfSksYi50cmFuc3Bvc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hLnYsZD1iLnYsZT0wOzQ+ZTsrK2UpZm9yKHZhciBmPTA7ND5mOysrZiljWzQqZStmXT1kWzQqZitlXTtyZXR1cm4gY30pLGJ9O1wiLFwic3JjL2xpYi93ZWJnbC9tb2RlbHMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbihhKXt2YXIgYz17fSxkPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9Y3x8Z2wuQVJSQVlfQlVGRkVSLGU9Z2wuY3JlYXRlQnVmZmVyKCk7aWYodGhpcy50YXJnZXQ9ZCx0aGlzLmJ1Zj1lLHRoaXMuc2V0KGEpLHRoaXMubnVtQ29tcG9uZW50c189YS5udW1Db21wb25lbnRzLHRoaXMubnVtRWxlbWVudHNfPWEubnVtRWxlbWVudHMsdGhpcy50b3RhbENvbXBvbmVudHNfPXRoaXMubnVtQ29tcG9uZW50c18qdGhpcy5udW1FbGVtZW50c18sYS5idWZmZXIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpdGhpcy50eXBlXz1nbC5GTE9BVDtlbHNlIGlmKGEuYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSl0aGlzLnR5cGVfPWdsLlVOU0lHTkVEX0JZVEU7ZWxzZSBpZihhLmJ1ZmZlciBpbnN0YW5jZW9mIEludDhBcnJheSl0aGlzLnR5cGVfPWdsLl9CWVRFO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBVaW50MTZBcnJheSl0aGlzLnR5cGVfPWdsLlVOU0lHTkVEX1NIT1JUO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBJbnQxNkFycmF5KXRoaXMudHlwZV89Z2wuU0hPUlQ7ZWxzZSB0aHJvd1xcXCJ1bmhhbmRsZWQgdHlwZTpcXFwiK3R5cGVvZiBhLmJ1ZmZlcn07cmV0dXJuIGQucHJvdG90eXBlLnNldD1mdW5jdGlvbihhKXtnbC5iaW5kQnVmZmVyKHRoaXMudGFyZ2V0LHRoaXMuYnVmKSxnbC5idWZmZXJEYXRhKHRoaXMudGFyZ2V0LGEuYnVmZmVyLGdsLlNUQVRJQ19EUkFXKX0sZC5wcm90b3R5cGUudHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGVffSxkLnByb3RvdHlwZS5udW1Db21wb25lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtQ29tcG9uZW50c199LGQucHJvdG90eXBlLm51bUVsZW1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtRWxlbWVudHNffSxkLnByb3RvdHlwZS50b3RhbENvbXBvbmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b3RhbENvbXBvbmVudHNffSxkLnByb3RvdHlwZS5idWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWZ9LGQucHJvdG90eXBlLnN0cmlkZT1mdW5jdGlvbigpe3JldHVybiAwfSxkLnByb3RvdHlwZS5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sYy5Nb2RlbD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGMsZnVuY3Rpb24oYyxlKXtlLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYyxlLGYsZyl7Yy5idWZmZXJzPXt9O3ZhciBoPWZ1bmN0aW9uKGEsZSl7dmFyIGY9XFxcImluZGljZXNcXFwiPT1hP2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSOmdsLkFSUkFZX0JVRkZFUjtiPWMuYnVmZmVyc1thXSxiP2Iuc2V0KGUpOmI9bmV3IGQoZSxmKSxjLmJ1ZmZlcnNbYV09Yn07Zm9yKGEgaW4gZiloKGEsZlthXSk7dmFyIGk9e30saj0wO2Zvcih2YXIgayBpbiBnKWlba109aisrO2MubW9kZT1nbC5UUklBTkdMRVMsYy50ZXh0dXJlcz1nLnYsYy50ZXh0dXJlVW5pdHM9aSxjLnNoYWRlcj1lfSksZS5kcmF3UHJlcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5zaGFkZXIsZT1hLmJ1ZmZlcnMsZj1hLnRleHR1cmVzO2Zvcih2YXIgZyBpbiBjPVNrLmZmaS5yZW1hcFRvSnMoYyksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQudXNlLFtkXSksZSl7dmFyIGg9ZVtnXTtpZihcXFwiaW5kaWNlc1xcXCI9PWcpZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUixoLmJ1ZmZlcigpKTtlbHNle3ZhciBpPWQuYXR0cmliW2ddO2kmJmkoaCl9fWZvcih2YXIgaiBpbiBmKXt2YXIgaz1hLnRleHR1cmVVbml0c1tqXTtkLnNldFVuaWZvcm0kaW1wbChkLHRleHR1ZXIsayksZltqXS5iaW5kVG9Vbml0KGspfWZvcih2YXIgbCBpbiBjKWQuc2V0VW5pZm9ybSRpbXBsKGQsbCxjW2xdKX0pLGUuZHJhdz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1hLnNoYWRlcjtmb3IodW5pZm9ybSBpbiBjPVNrLmZmaS5yZW1hcFRvSnMoYyksYyllLnNldFVuaWZvcm0kaW1wbChlLHVuaWZvcm0sY1t1bmlmb3JtXSk7aWYoZClmb3IodmFyIGYgaW4gZCl7dmFyIGc9YS50ZXh0dXJlVW5pdHNbZl07ZS5zZXRVbmlmb3JtJGltcGwoZSxmLGcpLGRbZl0uYmluZFRvVW5pdChnKX12YXIgaD1hLmJ1ZmZlcnM7Z2wuZHJhd0VsZW1lbnRzKGEubW9kZSxoLmluZGljZXMudG90YWxDb21wb25lbnRzKCksZ2wuVU5TSUdORURfU0hPUlQsMCl9KX0sXFxcIk1vZGVsXFxcIixbXSksY307XCIsXCJzcmMvbGliL3dlYmdsL3ByaW1pdGl2ZXMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9LGI9ZnVuY3Rpb24oYSxiLGMpe2M9Y3x8XFxcIkZsb2F0MzJBcnJheVxcXCI7dmFyIGQ9d2luZG93W2NdO2IubGVuZ3RoPyh0aGlzLmJ1ZmZlcj1uZXcgZChiKSxiPXRoaXMuYnVmZmVyLmxlbmd0aC9hLHRoaXMuY3Vyc29yPWIpOih0aGlzLmJ1ZmZlcj1uZXcgZChhKmIpLHRoaXMuY3Vyc29yPTApLHRoaXMubnVtQ29tcG9uZW50cz1hLHRoaXMubnVtRWxlbWVudHM9Yix0aGlzLnR5cGU9Y307cmV0dXJuIGIucHJvdG90eXBlLnN0cmlkZT1mdW5jdGlvbigpe3JldHVybiAwfSxiLnByb3RvdHlwZS5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sYi5wcm90b3R5cGUuZ2V0RWxlbWVudD1mdW5jdGlvbihhKXtmb3IodmFyIGI9YSp0aGlzLm51bUNvbXBvbmVudHMsYz1bXSxkPTA7ZDx0aGlzLm51bUNvbXBvbmVudHM7KytkKWMucHVzaCh0aGlzLmJ1ZmZlcltiK2RdKTtyZXR1cm4gY30sYi5wcm90b3R5cGUuc2V0RWxlbWVudD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hKnRoaXMubnVtQ29tcG9uZW50cyxkPTA7ZDx0aGlzLm51bUNvbXBvbmVudHM7KytkKXRoaXMuYnVmZmVyW2MrZF09YltkXX0sYi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgYih0aGlzLm51bUNvbXBvbmVudHMsdGhpcy5udW1FbGVtZW50cyx0aGlzLnR5cGUpO3JldHVybiBhLnB1c2hBcnJheSh0aGlzKSxhfSxiLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXMuc2V0RWxlbWVudCh0aGlzLmN1cnNvcisrLGEpfSxiLnByb3RvdHlwZS5wdXNoQXJyYXk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7YjxhLm51bUVsZW1lbnRzOysrYil0aGlzLnB1c2goYS5nZXRFbGVtZW50KGIpKX0sYi5wcm90b3R5cGUucHVzaEFycmF5V2l0aE9mZnNldD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTA7ZDxhLm51bUVsZW1lbnRzOysrZCl7Yz1hLmdldEVsZW1lbnQoZCk7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDsrK2UpY1tlXSs9YltlXTt0aGlzLnB1c2goYyl9fSxiLnByb3RvdHlwZS5jb21wdXRlRXh0ZW50cz1mdW5jdGlvbigpe2Zvcih2YXIgYT1NYXRoLm1heCxiPU1hdGgubWluLGMsZD10aGlzLm51bUVsZW1lbnRzLGU9dGhpcy5udW1Db21wb25lbnRzLGY9dGhpcy5nZXRFbGVtZW50KDApLGc9dGhpcy5nZXRFbGVtZW50KDApLGg9MTtoPGQ7KytoKXtjPXRoaXMuZ2V0RWxlbWVudChoKTtmb3IodmFyIGk9MDtpPGU7KytpKWZbaV09YihmW2ldLGNbaV0pLGdbaV09YShnW2ldLGNbaV0pfXJldHVybnttaW46ZixtYXg6Z319LGEuY3JlYXRlQ3ViZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPVtbMyw3LDUsMV0sWzAsNCw2LDJdLFs2LDcsMywyXSxbMCwxLDUsNF0sWzUsNyw2LDRdLFsyLDMsMSwwXV0sZT1hLzIsZz1bWy1lLC1lLC1lXSxbK2UsLWUsLWVdLFstZSwrZSwtZV0sWytlLCtlLC1lXSxbLWUsLWUsK2VdLFsrZSwtZSwrZV0sWy1lLCtlLCtlXSxbK2UsK2UsK2VdXSxoPVtbMSwwLDBdLFstMSwwLDBdLFswLDEsMF0sWzAsLTEsMF0sWzAsMCwxXSxbMCwwLC0xXV0saT1bWzAsMF0sWzEsMF0sWzEsMV0sWzAsMV1dLGo9MjQsaz1uZXcgYigzLGopLGw9bmV3IGIoMyxqKSxtPW5ldyBiKDIsaiksbj1uZXcgYigzLDEyLFxcXCJVaW50MTZBcnJheVxcXCIpLG89MDs2Pm87KytvKXtjPWRbb107Zm9yKHZhciBwPTA7ND5wOysrcCl7dmFyIHE9Z1tjW3BdXSxyPWhbb10scz1pW3BdO2sucHVzaChxKSxsLnB1c2gociksbS5wdXNoKHMpfXZhciB0PTQqbztuLnB1c2goW3QrMCx0KzEsdCsyXSksbi5wdXNoKFt0KzAsdCsyLHQrM10pfXJldHVybntwb3NpdGlvbjprLG5vcm1hbDpsLHRleENvb3JkOm0saW5kaWNlczpufX0pLGF9O1wiLFwic3JjL2xpYi93aGljaGRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3aGljaGRiIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd3NnaXJlZi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwid3NnaXJlZiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3hkcmxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieGRybGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ4bWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvZG9tL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkb20gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvZXRyZWUvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImV0cmVlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL3BhcnNlcnMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBhcnNlcnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvc2F4L19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzYXggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWxsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInhtbGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbHJwY2xpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieG1scnBjbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvemlwZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiemlwZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCJ9fSIsIihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0Jzt2YXIgJGpzY29tcD0kanNjb21wfHx7fTskanNjb21wLnNjb3BlPXt9OyRqc2NvbXAuQVNTVU1FX0VTNT0hMTskanNjb21wLkFTU1VNRV9OT19OQVRJVkVfTUFQPSExOyRqc2NvbXAuQVNTVU1FX05PX05BVElWRV9TRVQ9ITE7JGpzY29tcC5TSU1QTEVfRlJPVU5EX1BPTFlGSUxMPSExOyRqc2NvbXAuZGVmaW5lUHJvcGVydHk9JGpzY29tcC5BU1NVTUVfRVM1fHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24obSxxLGEpe20hPUFycmF5LnByb3RvdHlwZSYmbSE9T2JqZWN0LnByb3RvdHlwZSYmKG1bcV09YS52YWx1ZSl9OyRqc2NvbXAuZ2V0R2xvYmFsPWZ1bmN0aW9uKG0pe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdz09PW0/bTpcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOm19OyRqc2NvbXAuZ2xvYmFsPSRqc2NvbXAuZ2V0R2xvYmFsKHRoaXMpO1xuJGpzY29tcC5wb2x5ZmlsbD1mdW5jdGlvbihtLHEsYSxjKXtpZihxKXthPSRqc2NvbXAuZ2xvYmFsO209bS5zcGxpdChcIi5cIik7Zm9yKGM9MDtjPG0ubGVuZ3RoLTE7YysrKXt2YXIgYj1tW2NdO2IgaW4gYXx8KGFbYl09e30pO2E9YVtiXX1tPW1bbS5sZW5ndGgtMV07Yz1hW21dO3E9cShjKTtxIT1jJiZudWxsIT1xJiYkanNjb21wLmRlZmluZVByb3BlcnR5KGEsbSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnF9KX19OyRqc2NvbXAucG9seWZpbGwoXCJBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0sYSl7dmFyIGM9dGhpcztjIGluc3RhbmNlb2YgU3RyaW5nJiYoYz1TdHJpbmcoYykpO3ZhciBiPWMubGVuZ3RoO2E9YXx8MDtmb3IoMD5hJiYoYT1NYXRoLm1heChhK2IsMCkpO2E8YjthKyspe3ZhciBlPWNbYV07aWYoZT09PW18fE9iamVjdC5pcyhlLG0pKXJldHVybiEwfXJldHVybiExfX0sXCJlczdcIixcImVzM1wiKTtcbiRqc2NvbXAub3ducz1mdW5jdGlvbihtLHEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxxKX07JGpzY29tcC5wb2x5ZmlsbChcIk9iamVjdC5lbnRyaWVzXCIsZnVuY3Rpb24obSl7cmV0dXJuIG0/bTpmdW5jdGlvbihtKXt2YXIgYT1bXSxjO2ZvcihjIGluIG0pJGpzY29tcC5vd25zKG0sYykmJmEucHVzaChbYyxtW2NdXSk7cmV0dXJuIGF9fSxcImVzOFwiLFwiZXMzXCIpO1xuJGpzY29tcC5jaGVja1N0cmluZ0FyZ3M9ZnVuY3Rpb24obSxxLGEpe2lmKG51bGw9PW0pdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSAndGhpcycgdmFsdWUgZm9yIFN0cmluZy5wcm90b3R5cGUuXCIrYStcIiBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZFwiKTtpZihxIGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoXCJGaXJzdCBhcmd1bWVudCB0byBTdHJpbmcucHJvdG90eXBlLlwiK2ErXCIgbXVzdCBub3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb25cIik7cmV0dXJuIG0rXCJcIn07JGpzY29tcC5zdHJpbmdQYWRkaW5nPWZ1bmN0aW9uKG0scSl7bT12b2lkIDAhPT1tP1N0cmluZyhtKTpcIiBcIjtyZXR1cm4gMDxxJiZtP20ucmVwZWF0KE1hdGguY2VpbChxL20ubGVuZ3RoKSkuc3Vic3RyaW5nKDAscSk6XCJcIn07XG4kanNjb21wLnBvbHlmaWxsKFwiU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydFwiLGZ1bmN0aW9uKG0pe3JldHVybiBtP206ZnVuY3Rpb24obSxhKXt2YXIgYz0kanNjb21wLmNoZWNrU3RyaW5nQXJncyh0aGlzLG51bGwsXCJwYWRTdGFydFwiKTtyZXR1cm4gJGpzY29tcC5zdHJpbmdQYWRkaW5nKGEsbS1jLmxlbmd0aCkrY319LFwiZXM4XCIsXCJlczNcIik7JGpzY29tcC5wb2x5ZmlsbChcIk9iamVjdC52YWx1ZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0pe3ZhciBhPVtdLGM7Zm9yKGMgaW4gbSkkanNjb21wLm93bnMobSxjKSYmYS5wdXNoKG1bY10pO3JldHVybiBhfX0sXCJlczhcIixcImVzM1wiKTskanNjb21wLmFycmF5SXRlcmF0b3JJbXBsPWZ1bmN0aW9uKG0pe3ZhciBxPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHE8bS5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6bVtxKytdfTp7ZG9uZTohMH19fTskanNjb21wLmFycmF5SXRlcmF0b3I9ZnVuY3Rpb24obSl7cmV0dXJue25leHQ6JGpzY29tcC5hcnJheUl0ZXJhdG9ySW1wbChtKX19O1xuJGpzY29tcC5TWU1CT0xfUFJFRklYPVwianNjb21wX3N5bWJvbF9cIjskanNjb21wLmluaXRTeW1ib2w9ZnVuY3Rpb24oKXskanNjb21wLmluaXRTeW1ib2w9ZnVuY3Rpb24oKXt9OyRqc2NvbXAuZ2xvYmFsLlN5bWJvbHx8KCRqc2NvbXAuZ2xvYmFsLlN5bWJvbD0kanNjb21wLlN5bWJvbCl9OyRqc2NvbXAuU3ltYm9sQ2xhc3M9ZnVuY3Rpb24obSxxKXt0aGlzLiRqc2NvbXAkc3ltYm9sJGlkXz1tOyRqc2NvbXAuZGVmaW5lUHJvcGVydHkodGhpcyxcImRlc2NyaXB0aW9uXCIse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpxfSl9OyRqc2NvbXAuU3ltYm9sQ2xhc3MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGpzY29tcCRzeW1ib2wkaWRffTtcbiRqc2NvbXAuU3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbShhKXtpZih0aGlzIGluc3RhbmNlb2YgbSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yXCIpO3JldHVybiBuZXcgJGpzY29tcC5TeW1ib2xDbGFzcygkanNjb21wLlNZTUJPTF9QUkVGSVgrKGF8fFwiXCIpK1wiX1wiK3ErKyxhKX12YXIgcT0wO3JldHVybiBtfSgpO1xuJGpzY29tcC5pbml0U3ltYm9sSXRlcmF0b3I9ZnVuY3Rpb24oKXskanNjb21wLmluaXRTeW1ib2woKTt2YXIgbT0kanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3I7bXx8KG09JGpzY29tcC5nbG9iYWwuU3ltYm9sLml0ZXJhdG9yPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbChcIlN5bWJvbC5pdGVyYXRvclwiKSk7XCJmdW5jdGlvblwiIT10eXBlb2YgQXJyYXkucHJvdG90eXBlW21dJiYkanNjb21wLmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSxtLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gJGpzY29tcC5pdGVyYXRvclByb3RvdHlwZSgkanNjb21wLmFycmF5SXRlcmF0b3JJbXBsKHRoaXMpKX19KTskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcj1mdW5jdGlvbigpe319O1xuJGpzY29tcC5pbml0U3ltYm9sQXN5bmNJdGVyYXRvcj1mdW5jdGlvbigpeyRqc2NvbXAuaW5pdFN5bWJvbCgpO3ZhciBtPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5hc3luY0l0ZXJhdG9yO218fChtPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5hc3luY0l0ZXJhdG9yPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbChcIlN5bWJvbC5hc3luY0l0ZXJhdG9yXCIpKTskanNjb21wLmluaXRTeW1ib2xBc3luY0l0ZXJhdG9yPWZ1bmN0aW9uKCl7fX07JGpzY29tcC5pdGVyYXRvclByb3RvdHlwZT1mdW5jdGlvbihtKXskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcigpO209e25leHQ6bX07bVskanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3JldHVybiBtfTtcbiRqc2NvbXAuaXRlcmF0b3JGcm9tQXJyYXk9ZnVuY3Rpb24obSxxKXskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcigpO20gaW5zdGFuY2VvZiBTdHJpbmcmJihtKz1cIlwiKTt2YXIgYT0wLGM9e25leHQ6ZnVuY3Rpb24oKXtpZihhPG0ubGVuZ3RoKXt2YXIgYj1hKys7cmV0dXJue3ZhbHVlOnEoYixtW2JdKSxkb25lOiExfX1jLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fTtyZXR1cm4gYy5uZXh0KCl9fTtjW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gY307cmV0dXJuIGN9OyRqc2NvbXAucG9seWZpbGwoXCJBcnJheS5wcm90b3R5cGUudmFsdWVzXCIsZnVuY3Rpb24obSl7cmV0dXJuIG0/bTpmdW5jdGlvbigpe3JldHVybiAkanNjb21wLml0ZXJhdG9yRnJvbUFycmF5KHRoaXMsZnVuY3Rpb24obSxhKXtyZXR1cm4gYX0pfX0sXCJlczhcIixcImVzM1wiKTtcbihmdW5jdGlvbihtKXtmdW5jdGlvbiBxKGMpe2lmKGFbY10pcmV0dXJuIGFbY10uZXhwb3J0czt2YXIgYj1hW2NdPXtpOmMsbDohMSxleHBvcnRzOnt9fTttW2NdLmNhbGwoYi5leHBvcnRzLGIsYi5leHBvcnRzLHEpO2IubD0hMDtyZXR1cm4gYi5leHBvcnRzfXZhciBhPXt9O3EubT1tO3EuYz1hO3EuZD1mdW5jdGlvbihhLGIsZSl7cS5vKGEsYil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2VudW1lcmFibGU6ITAsZ2V0OmV9KX07cS5yPWZ1bmN0aW9uKGEpe1widW5kZWZpbmVkXCIhPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfTtxLnQ9ZnVuY3Rpb24oYSxiKXtiJjEmJihhPXEoYSkpO2lmKGImOHx8YiY0JiZcIm9iamVjdFwiPT09dHlwZW9mIGEmJmEmJmEuX19lc01vZHVsZSlyZXR1cm4gYTtcbnZhciBjPU9iamVjdC5jcmVhdGUobnVsbCk7cS5yKGMpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmF9KTtpZihiJjImJlwic3RyaW5nXCIhPXR5cGVvZiBhKWZvcih2YXIgZiBpbiBhKXEuZChjLGYsZnVuY3Rpb24oYil7cmV0dXJuIGFbYl19LmJpbmQobnVsbCxmKSk7cmV0dXJuIGN9O3Eubj1mdW5jdGlvbihhKXt2YXIgYj1hJiZhLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gYVtcImRlZmF1bHRcIl19OmZ1bmN0aW9uKCl7cmV0dXJuIGF9O3EuZChiLFwiYVwiLGIpO3JldHVybiBifTtxLm89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYil9O3EucD1cIlwiO3JldHVybiBxKHEucz0xKX0pKFtmdW5jdGlvbihtLHEpe3E9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7cT1xfHwobmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikpKCl9Y2F0Y2goYSl7XCJvYmplY3RcIj09PVxudHlwZW9mIHdpbmRvdyYmKHE9d2luZG93KX1tLmV4cG9ydHM9cX0sZnVuY3Rpb24obSxxLGEpe2EoMik7U2suZ2xvYmFsLnN0cmZ0aW1lPWEoMyk7U2suZ2xvYmFsLnN0cnB0aW1lPWEoNCk7YSg1KTthKDcpO2EoOSk7YSgxMCk7YSgxMSk7YSgxMik7YSgxMyk7YSgxNCk7YSgxNSk7YSgxNik7YSgxNyk7YSgxOCk7W1NrLmJ1aWx0aW4ub2JqZWN0LFNrLmJ1aWx0aW4udHlwZV0uZm9yRWFjaChhPT57U2suYWJzdHIuc2V0VXBTbG90cyhhKTtTay5hYnN0ci5zZXRVcE1ldGhvZHMoYSk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGEpfSk7YSgxOSk7YSgyMCk7YSgyMSk7W1NrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW4ubm9uZSxTay5idWlsdGluLk5vdEltcGxlbWVudGVkLFNrLmJ1aWx0aW4ub2JqZWN0XS5mb3JFYWNoKGE9PnthPWEucHJvdG90eXBlO2EuX19kb2NfXz1hLmhhc093blByb3BlcnR5KFwidHAkZG9jXCIpP25ldyBTay5idWlsdGluLnN0cihhLnRwJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfSk7XG5hKDIyKTthKDIzKTthKDI0KTthKDI1KTthKDI2KTthKDI3KTthKDI4KTthKDI5KTthKDMxKTthKDMyKTthKDMzKTthKDM0KTthKDM1KTthKDM2KTthKDM3KTthKDM4KTthKDM5KTthKDQwKTthKDQxKTthKDQyKTthKDQzKTthKDQ0KTthKDQ1KTthKDQ2KTthKDQ3KTthKDQ4KTthKDQ5KTthKDUwKTthKDUxKTthKDUyKTthKDUzKTthKDU0KTthKDU1KTthKDU2KTthKDU3KTthKDU4KTthKDU5KTthKDYwKTthKDYxKTthKDYyKTthKDYzKTthKDY0KTthKDY1KX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhKXt2YXIgYj17YnVpbGQ6e2dpdGhhc2g6XCIzNDg0N2VjNzVjZTIxMjc0MTM5MzgyNzI1ODA2NTAxMDA0NjMyODE5XCIsZGF0ZTpcIjIwMjEtMDYtMDdUMTU6NDY6MDAuODA0WlwifX07Yi5nbG9iYWw9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBhP2E6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBzZWxmP3NlbGY6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3c/d2luZG93Ont9O2IuZXhwb3J0U3ltYm9sPVxuZnVuY3Rpb24oYSxjKXthPWEuc3BsaXQoXCIuXCIpO3ZhciBlPWIuZ2xvYmFsLGY7Zm9yKGY9MDtmPGEubGVuZ3RoLTE7ZisrKXt2YXIgZD1hW2ZdO2U9ZS5oYXNPd25Qcm9wZXJ0eShkKT9lW2RdOmVbZF09e319XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjJiYoZD1hW2ZdLGVbZF09Yyl9O2IuaXNBcnJheUxpa2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBBcnJheXx8YSYmYS5sZW5ndGgmJlwibnVtYmVyXCI9PXR5cGVvZiBhLmxlbmd0aD8hMDohMX07Yi5qc19iZWF1dGlmeT1mdW5jdGlvbihhKXtyZXR1cm4gYX07Yi5leHBvcnRTeW1ib2woXCJTa1wiLGIpO2IuZXhwb3J0U3ltYm9sKFwiU2suZ2xvYmFsXCIsYi5nbG9iYWwpO2IuZXhwb3J0U3ltYm9sKFwiU2suYnVpbGRcIixiLmJ1aWxkKTtiLmV4cG9ydFN5bWJvbChcIlNrLmV4cG9ydFN5bWJvbFwiLGIuZXhwb3J0U3ltYm9sKTtiLmV4cG9ydFN5bWJvbChcIlNrLmlzQXJyYXlMaWtlXCIsYi5pc0FycmF5TGlrZSk7Yi5leHBvcnRTeW1ib2woXCJTay5qc19iZWF1dGlmeVwiLFxuYi5qc19iZWF1dGlmeSl9KS5jYWxsKHRoaXMsYSgwKSl9LGZ1bmN0aW9uKG0scSl7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShrLG4sQSl7ZnVuY3Rpb24gcChhLGQsayxnKXtmb3IodmFyIHk9XCJcIixuPW51bGwsdj0hMSxMPWEubGVuZ3RoLEc9ITEsRT0wO0U8TDtFKyspe3ZhciBBPWEuY2hhckNvZGVBdChFKTtpZighMD09PXYpaWYoNDU9PT1BKW49XCJcIjtlbHNlIGlmKDk1PT09QSluPVwiIFwiO2Vsc2UgaWYoNDg9PT1BKW49XCIwXCI7ZWxzZSBpZig1OD09PUEpRyYmaChcIltXQVJOSU5HXSBkZXRlY3RlZCB1c2Ugb2YgdW5zdXBwb3J0ZWQgJTo6IG9yICU6OjogbW9kaWZpZXJzIHRvIHN0cmZ0aW1lXCIpLEc9ITA7ZWxzZXtzd2l0Y2goQSl7Y2FzZSAzNzp5Kz1cIiVcIjticmVhaztjYXNlIDY1OnkrPWsuZGF5c1tkLmdldERheSgpXTticmVhaztjYXNlIDY2OnkrPWsubW9udGhzW2QuZ2V0TW9udGgoKV07YnJlYWs7Y2FzZSA2Nzp5Kz1jKE1hdGguZmxvb3IoZC5nZXRGdWxsWWVhcigpLzEwMCksbik7XG5icmVhaztjYXNlIDY4OnkrPXAoay5mb3JtYXRzLkQsZCxrLGcpO2JyZWFrO2Nhc2UgNzA6eSs9cChrLmZvcm1hdHMuRixkLGssZyk7YnJlYWs7Y2FzZSA3Mjp5Kz1jKGQuZ2V0SG91cnMoKSxuKTticmVhaztjYXNlIDczOnkrPWMoZShkLmdldEhvdXJzKCkpLG4pO2JyZWFrO2Nhc2UgNzY6eSs9YihNYXRoLmZsb29yKGclMUUzKSk7YnJlYWs7Y2FzZSA3Nzp5Kz1jKGQuZ2V0TWludXRlcygpLG4pO2JyZWFrO2Nhc2UgODA6eSs9MTI+ZC5nZXRIb3VycygpP2suYW06ay5wbTticmVhaztjYXNlIDgyOnkrPXAoay5mb3JtYXRzLlIsZCxrLGcpO2JyZWFrO2Nhc2UgODM6eSs9YyhkLmdldFNlY29uZHMoKSxuKTticmVhaztjYXNlIDg0OnkrPXAoay5mb3JtYXRzLlQsZCxrLGcpO2JyZWFrO2Nhc2UgODU6eSs9YyhmKGQsXCJzdW5kYXlcIiksbik7YnJlYWs7Y2FzZSA4Nzp5Kz1jKGYoZCxcIm1vbmRheVwiKSxuKTticmVhaztjYXNlIDg4OnkrPXAoay5mb3JtYXRzLlgsZCxrLGcpO2JyZWFrO2Nhc2UgODk6eSs9XG5kLmdldEZ1bGxZZWFyKCk7YnJlYWs7Y2FzZSA5MDpEJiYwPT09Qj95Kz1cIkdNVFwiOihuPWQudG9TdHJpbmcoKS5tYXRjaCgvXFwoKFtcXHdcXHNdKylcXCkvKSx5Kz1uJiZuWzFdfHxcIlwiKTticmVhaztjYXNlIDk3OnkrPWsuc2hvcnREYXlzW2QuZ2V0RGF5KCldO2JyZWFrO2Nhc2UgOTg6eSs9ay5zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldO2JyZWFrO2Nhc2UgOTk6eSs9cChrLmZvcm1hdHMuYyxkLGssZyk7YnJlYWs7Y2FzZSAxMDA6eSs9YyhkLmdldERhdGUoKSxuKTticmVhaztjYXNlIDEwMTp5Kz1jKGQuZ2V0RGF0ZSgpLG51bGw9PW4/XCIgXCI6bik7YnJlYWs7Y2FzZSAxMDQ6eSs9ay5zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldO2JyZWFrO2Nhc2UgMTA2Om49bmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLDAsMSk7bj1NYXRoLmNlaWwoKGQuZ2V0VGltZSgpLW4uZ2V0VGltZSgpKS84NjRFNSk7eSs9YihuKTticmVhaztjYXNlIDEwNzp5Kz1jKGQuZ2V0SG91cnMoKSxudWxsPT1uP1wiIFwiOm4pO1xuYnJlYWs7Y2FzZSAxMDg6eSs9YyhlKGQuZ2V0SG91cnMoKSksbnVsbD09bj9cIiBcIjpuKTticmVhaztjYXNlIDEwOTp5Kz1jKGQuZ2V0TW9udGgoKSsxLG4pO2JyZWFrO2Nhc2UgMTEwOnkrPVwiXFxuXCI7YnJlYWs7Y2FzZSAxMTE6bj1kLmdldERhdGUoKTt5PWsub3JkaW5hbFN1ZmZpeGVzP3krKFN0cmluZyhuKSsoay5vcmRpbmFsU3VmZml4ZXNbbi0xXXx8bChuKSkpOnkrKFN0cmluZyhuKStsKG4pKTticmVhaztjYXNlIDExMjp5Kz0xMj5kLmdldEhvdXJzKCk/ay5BTTprLlBNO2JyZWFrO2Nhc2UgMTE0OnkrPXAoay5mb3JtYXRzLnIsZCxrLGcpO2JyZWFrO2Nhc2UgMTE1OnkrPU1hdGguZmxvb3IoZy8xRTMpO2JyZWFrO2Nhc2UgMTE2OnkrPVwiXFx0XCI7YnJlYWs7Y2FzZSAxMTc6bj1kLmdldERheSgpO3krPTA9PT1uPzc6bjticmVhaztjYXNlIDExODp5Kz1wKGsuZm9ybWF0cy52LGQsayxnKTticmVhaztjYXNlIDExOTp5Kz1kLmdldERheSgpO2JyZWFrO2Nhc2UgMTIwOnkrPXAoay5mb3JtYXRzLngsXG5kLGssZyk7YnJlYWs7Y2FzZSAxMjE6eSs9KFwiXCIrZC5nZXRGdWxsWWVhcigpKS5zbGljZSgyKTticmVhaztjYXNlIDEyMjpEJiYwPT09Qj95Kz1HP1wiKzAwOjAwXCI6XCIrMDAwMFwiOihuPTAhPT1CP0IvNkU0Oi1kLmdldFRpbWV6b25lT2Zmc2V0KCksdj1HP1wiOlwiOlwiXCIsQT1NYXRoLmFicyhuJTYwKSx5Kz0oMD5uP1wiLVwiOlwiK1wiKStjKE1hdGguZmxvb3IoTWF0aC5hYnMobi82MCkpKSt2K2MoQSkpO2JyZWFrO2RlZmF1bHQ6diYmKHkrPVwiJVwiKSx5Kz1hW0VdfW49bnVsbDt2PSExfWVsc2UgMzc9PT1BP3Y9ITA6eSs9YVtFXX1yZXR1cm4geX12YXIgdj1rfHxnLEI9bnx8MCxEPUF8fCExLEU9MCx1LG09ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgZD1iLmdldFRpbWUoKTtpZihEKXt2YXIgYz02RTQqKGIuZ2V0VGltZXpvbmVPZmZzZXQoKXx8MCk7Yj1uZXcgRGF0ZShkK2MrQik7NkU0KihiLmdldFRpbWV6b25lT2Zmc2V0KCl8fDApIT09YyYmKGI9NkU0KihiLmdldFRpbWV6b25lT2Zmc2V0KCl8fFxuMCksYj1uZXcgRGF0ZShkK2IrQikpfX1lbHNlIGQ9RGF0ZS5ub3coKSxkPkU/KEU9ZCx1PW5ldyBEYXRlKEUpLGQ9RSxEJiYodT1uZXcgRGF0ZShFKzZFNCoodS5nZXRUaW1lem9uZU9mZnNldCgpfHwwKStCKSkpOmQ9RSxiPXU7cmV0dXJuIHAoYSxiLHYsZCl9O20ubG9jYWxpemU9ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBhKGJ8fHYsQixEKX07bS5sb2NhbGl6ZUJ5SWRlbnRpZmllcj1mdW5jdGlvbihhKXt2YXIgYj1kW2FdO3JldHVybiBiP20ubG9jYWxpemUoYik6KGgoJ1tXQVJOSU5HXSBObyBsb2NhbGUgZm91bmQgd2l0aCBpZGVudGlmaWVyIFwiJythKydcIi4nKSxtKX07bS50aW1lem9uZT1mdW5jdGlvbihiKXt2YXIgZD1CLGM9RCxlPXR5cGVvZiBiO2lmKFwibnVtYmVyXCI9PT1lfHxcInN0cmluZ1wiPT09ZSljPSEwLFwic3RyaW5nXCI9PT1lPyhkPVwiLVwiPT09YlswXT8tMToxLGU9cGFyc2VJbnQoYi5zbGljZSgxLDMpLDEwKSxiPXBhcnNlSW50KGIuc2xpY2UoMyw1KSwxMCksZD1kKig2MCpcbmUrYikqNkU0KTpcIm51bWJlclwiPT09ZSYmKGQ9NkU0KmIpO3JldHVybiBuZXcgYSh2LGQsYyl9O20udXRjPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBhKHYsQiwhMCl9O3JldHVybiBtfWZ1bmN0aW9uIGMoYSxiKXtpZihcIlwiPT09Ynx8OTxhKXJldHVybiBhO251bGw9PWImJihiPVwiMFwiKTtyZXR1cm4gYithfWZ1bmN0aW9uIGIoYSl7cmV0dXJuIDk5PGE/YTo5PGE/XCIwXCIrYTpcIjAwXCIrYX1mdW5jdGlvbiBlKGEpe3JldHVybiAwPT09YT8xMjoxMjxhP2EtMTI6YX1mdW5jdGlvbiBmKGEsYil7Yj1ifHxcInN1bmRheVwiO3ZhciBkPWEuZ2V0RGF5KCk7XCJtb25kYXlcIj09PWImJigwPT09ZD9kPTY6ZC0tKTtiPURhdGUuVVRDKGEuZ2V0RnVsbFllYXIoKSwwLDEpO2E9RGF0ZS5VVEMoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSxhLmdldERhdGUoKSk7cmV0dXJuIE1hdGguZmxvb3IoKE1hdGguZmxvb3IoKGEtYikvODY0RTUpKzctZCkvNyl9ZnVuY3Rpb24gbChhKXt2YXIgYj1hJTEwO2ElPTEwMDtcbmlmKDExPD1hJiYxMz49YXx8MD09PWJ8fDQ8PWIpcmV0dXJuXCJ0aFwiO3N3aXRjaChiKXtjYXNlIDE6cmV0dXJuXCJzdFwiO2Nhc2UgMjpyZXR1cm5cIm5kXCI7Y2FzZSAzOnJldHVyblwicmRcIn19ZnVuY3Rpb24gaChhKXtcInVuZGVmaW5lZFwiIT09dHlwZW9mIGNvbnNvbGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKGEpfXZhciBkPXtkZV9ERTp7ZGF5czpcIlNvbm50YWcgTW9udGFnIERpZW5zdGFnIE1pdHR3b2NoIERvbm5lcnN0YWcgRnJlaXRhZyBTYW1zdGFnXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlNvIE1vIERpIE1pIERvIEZyIFNhXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhciBGZWJydWFyIE1cXHUwMGU0cnogQXByaWwgTWFpIEp1bmkgSnVsaSBBdWd1c3QgU2VwdGVtYmVyIE9rdG9iZXIgTm92ZW1iZXIgRGV6ZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1cXHUwMGU0ciBBcHIgTWFpIEp1biBKdWwgQXVnIFNlcCBPa3QgTm92IERlelwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQuJW0uJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LGVuX0NBOntkYXlzOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlY1wiLnNwbGl0KFwiIFwiKSxvcmRpbmFsU3VmZml4ZXM6XCJzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdFwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJXJcIix4OlwiJURcIn19LGVuX1VTOntkYXlzOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlY1wiLnNwbGl0KFwiIFwiKSxvcmRpbmFsU3VmZml4ZXM6XCJzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdFwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJW0vJWQvJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJXJcIix4OlwiJURcIn19LGVzX01YOntkYXlzOlwiZG9taW5nbyBsdW5lcyBtYXJ0ZXMgbWlcXHUwMGU5cmNvbGVzIGp1ZXZlcyB2aWVybmVzIHNcXHUwMGUxYmFkb1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJkb20gbHVuIG1hciBtaVxcdTAwZTkganVlIHZpZSBzXFx1MDBlMWJcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiZW5lcm87ZmVicmVybzttYXJ6bzthYnJpbDttYXlvO2p1bmlvO2p1bGlvO2Fnb3N0bztzZXB0aWVtYnJlO29jdHVicmU7bm92aWVtYnJlOyBkaWNpZW1icmVcIi5zcGxpdChcIjtcIiksc2hvcnRNb250aHM6XCJlbmUgZmViIG1hciBhYnIgbWF5IGp1biBqdWwgYWdvIHNlcCBvY3Qgbm92IGRpY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLFxuYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LGZyX0ZSOntkYXlzOlwiZGltYW5jaGUgbHVuZGkgbWFyZGkgbWVyY3JlZGkgamV1ZGkgdmVuZHJlZGkgc2FtZWRpXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcImRpbS4gbHVuLiBtYXIuIG1lci4gamV1LiB2ZW4uIHNhbS5cIi5zcGxpdChcIiBcIiksbW9udGhzOlwiamFudmllciBmXFx1MDBlOXZyaWVyIG1hcnMgYXZyaWwgbWFpIGp1aW4ganVpbGxldCBhb1xcdTAwZmJ0IHNlcHRlbWJyZSBvY3RvYnJlIG5vdmVtYnJlIGRcXHUwMGU5Y2VtYnJlXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiamFudi4gZlxcdTAwZTl2ci4gbWFycyBhdnJpbCBtYWkganVpbiBqdWlsLiBhb1xcdTAwZmJ0IHNlcHQuIG9jdC4gbm92LiBkXFx1MDBlOWMuXCIuc3BsaXQoXCIgXCIpLEFNOlwiQU1cIixcblBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0saXRfSVQ6e2RheXM6XCJkb21lbmljYSBsdW5lZFxcdTAwZWMgbWFydGVkXFx1MDBlYyBtZXJjb2xlZFxcdTAwZWMgZ2lvdmVkXFx1MDBlYyB2ZW5lcmRcXHUwMGVjIHNhYmF0b1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJkb20gbHVuIG1hciBtZXIgZ2lvIHZlbiBzYWJcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiZ2VubmFpbyBmZWJicmFpbyBtYXJ6byBhcHJpbGUgbWFnZ2lvIGdpdWdubyBsdWdsaW8gYWdvc3RvIHNldHRlbWJyZSBvdHRvYnJlIG5vdmVtYnJlIGRpY2VtYnJlXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwicHIgbWFnIGdpdSBsdWcgYWdvIHNldCBvdHQgbm92IGRpY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixcbnBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LG5sX05MOntkYXlzOlwiem9uZGFnIG1hYW5kYWcgZGluc2RhZyB3b2Vuc2RhZyBkb25kZXJkYWcgdnJpamRhZyB6YXRlcmRhZ1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJ6byBtYSBkaSB3byBkbyB2ciB6YVwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW51YXJpIGZlYnJ1YXJpIG1hYXJ0IGFwcmlsIG1laSBqdW5pIGp1bGkgYXVndXN0dXMgc2VwdGVtYmVyIG9rdG9iZXIgbm92ZW1iZXIgZGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJqYW4gZmViIG1ydCBhcHIgbWVpIGp1biBqdWwgYXVnIHNlcCBva3Qgbm92IGRlY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsXG5EOlwiJWQtJW0tJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LHB0X0JSOntkYXlzOlwiZG9taW5nbyBzZWd1bmRhIHRlclxcdTAwZTdhIHF1YXJ0YSBxdWludGEgc2V4dGEgc1xcdTAwZTFiYWRvXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIkRvbSBTZWcgVGVyIFF1YSBRdWkgU2V4IFNcXHUwMGUxYlwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW5laXJvIGZldmVyZWlybyBtYXJcXHUwMGU3byBhYnJpbCBtYWlvIGp1bmhvIGp1bGhvIGFnb3N0byBzZXRlbWJybyBvdXR1YnJvIG5vdmVtYnJvIGRlemVtYnJvXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiSmFuIEZldiBNYXIgQWJyIE1haSBKdW4gSnVsIEFnbyBTZXQgT3V0IE5vdiBEZXpcIi5zcGxpdChcIiBcIiksQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC0lbS0lWVwiLEY6XCIlWS0lbS0lZFwiLFxuUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSxydV9SVTp7ZGF5czpcIlxcdTA0MTJcXHUwNDNlXFx1MDQ0MVxcdTA0M2FcXHUwNDQwXFx1MDQzNVxcdTA0NDFcXHUwNDM1XFx1MDQzZFxcdTA0NGNcXHUwNDM1IFxcdTA0MWZcXHUwNDNlXFx1MDQzZFxcdTA0MzVcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDRjXFx1MDQzZFxcdTA0MzhcXHUwNDNhIFxcdTA0MTJcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNkXFx1MDQzOFxcdTA0M2EgXFx1MDQyMVxcdTA0NDBcXHUwNDM1XFx1MDQzNFxcdTA0MzAgXFx1MDQyN1xcdTA0MzVcXHUwNDQyXFx1MDQzMlxcdTA0MzVcXHUwNDQwXFx1MDQzMyBcXHUwNDFmXFx1MDQ0ZlxcdTA0NDJcXHUwNDNkXFx1MDQzOFxcdTA0NDZcXHUwNDMwIFxcdTA0MjFcXHUwNDQzXFx1MDQzMVxcdTA0MzFcXHUwNDNlXFx1MDQ0MlxcdTA0MzBcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiXFx1MDQxMlxcdTA0NDEgXFx1MDQxZlxcdTA0M2QgXFx1MDQxMlxcdTA0NDIgXFx1MDQyMVxcdTA0NDAgXFx1MDQyN1xcdTA0NDIgXFx1MDQxZlxcdTA0NDIgXFx1MDQyMVxcdTA0MzFcIi5zcGxpdChcIiBcIiksXG5tb250aHM6XCJcXHUwNDJmXFx1MDQzZFxcdTA0MzJcXHUwNDMwXFx1MDQ0MFxcdTA0NGMgXFx1MDQyNFxcdTA0MzVcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDNiXFx1MDQ0YyBcXHUwNDFjXFx1MDQzMFxcdTA0NDBcXHUwNDQyIFxcdTA0MTBcXHUwNDNmXFx1MDQ0MFxcdTA0MzVcXHUwNDNiXFx1MDQ0YyBcXHUwNDFjXFx1MDQzMFxcdTA0MzkgXFx1MDQxOFxcdTA0NGVcXHUwNDNkXFx1MDQ0YyBcXHUwNDE4XFx1MDQ0ZVxcdTA0M2JcXHUwNDRjIFxcdTA0MTBcXHUwNDMyXFx1MDQzM1xcdTA0NDNcXHUwNDQxXFx1MDQ0MiBcXHUwNDIxXFx1MDQzNVxcdTA0M2RcXHUwNDQyXFx1MDQ0ZlxcdTA0MzFcXHUwNDQwXFx1MDQ0YyBcXHUwNDFlXFx1MDQzYVxcdTA0NDJcXHUwNDRmXFx1MDQzMVxcdTA0NDBcXHUwNDRjIFxcdTA0MWRcXHUwNDNlXFx1MDQ0ZlxcdTA0MzFcXHUwNDQwXFx1MDQ0YyBcXHUwNDE0XFx1MDQzNVxcdTA0M2FcXHUwNDMwXFx1MDQzMVxcdTA0NDBcXHUwNDRjXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiXFx1MDQ0ZlxcdTA0M2RcXHUwNDMyIFxcdTA0NDRcXHUwNDM1XFx1MDQzMiBcXHUwNDNjXFx1MDQzMFxcdTA0NDAgXFx1MDQzMFxcdTA0M2ZcXHUwNDQwIFxcdTA0M2NcXHUwNDMwXFx1MDQzOSBcXHUwNDM4XFx1MDQ0ZVxcdTA0M2QgXFx1MDQzOFxcdTA0NGVcXHUwNDNiIFxcdTA0MzBcXHUwNDMyXFx1MDQzMyBcXHUwNDQxXFx1MDQzNVxcdTA0M2QgXFx1MDQzZVxcdTA0M2FcXHUwNDQyIFxcdTA0M2RcXHUwNDNlXFx1MDQ0ZiBcXHUwNDM0XFx1MDQzNVxcdTA0M2FcIi5zcGxpdChcIiBcIiksXG5BTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYXCIsRDpcIiVkLiVtLiV5XCIsRjpcIiVZLSVtLSVkXCIsUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSx0cl9UUjp7ZGF5czpcIlBhemFyIFBhemFydGVzaSBTYWxcXHUwMTMxIFxcdTAwYzdhclxcdTAxNWZhbWJhIFBlclxcdTAxNWZlbWJlIEN1bWEgQ3VtYXJ0ZXNpXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlBheiBQenQgU2FsIFxcdTAwYzdyXFx1MDE1ZiBQclxcdTAxNWYgQ3VtIEN0c1wiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJPY2FrIFxcdTAxNWV1YmF0IE1hcnQgTmlzYW4gTWF5XFx1MDEzMXMgSGF6aXJhbiBUZW1tdXogQVxcdTAxMWZ1c3RvcyBFeWxcXHUwMGZjbCBFa2ltIEthc1xcdTAxMzFtIEFyYWxcXHUwMTMxa1wiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIk9jYSBcXHUwMTVldWIgTWFyIE5pcyBNYXkgSGF6IFRlbSBBXFx1MDExZnUgRXlsIEVraSBLYXMgQXJhXCIuc3BsaXQoXCIgXCIpLFxuQU06XCJcXHUwMGQ2XFx1MDBkNlwiLFBNOlwiXFx1MDBkNlNcIixhbTpcIlxcdTAwZDZcXHUwMGQ2XCIscG06XCJcXHUwMGQ2U1wiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC0lbS0lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0semhfQ046e2RheXM6XCJcXHU2NjFmXFx1NjcxZlxcdTY1ZTUgXFx1NjYxZlxcdTY3MWZcXHU0ZTAwIFxcdTY2MWZcXHU2NzFmXFx1NGU4YyBcXHU2NjFmXFx1NjcxZlxcdTRlMDkgXFx1NjYxZlxcdTY3MWZcXHU1NmRiIFxcdTY2MWZcXHU2NzFmXFx1NGU5NCBcXHU2NjFmXFx1NjcxZlxcdTUxNmRcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiXFx1NjVlNVxcdTRlMDBcXHU0ZThjXFx1NGUwOVxcdTU2ZGJcXHU0ZTk0XFx1NTE2ZFwiLnNwbGl0KFwiXCIpLG1vbnRoczpcIlxcdTRlMDBcXHU2NzA4XFx1NGVmZCBcXHU0ZThjXFx1NjcwOFxcdTRlZmQgXFx1NGUwOVxcdTY3MDhcXHU0ZWZkIFxcdTU2ZGJcXHU2NzA4XFx1NGVmZCBcXHU0ZTk0XFx1NjcwOFxcdTRlZmQgXFx1NTE2ZFxcdTY3MDhcXHU0ZWZkIFxcdTRlMDNcXHU2NzA4XFx1NGVmZCBcXHU1MTZiXFx1NjcwOFxcdTRlZmQgXFx1NGU1ZFxcdTY3MDhcXHU0ZWZkIFxcdTUzNDFcXHU2NzA4XFx1NGVmZCBcXHU1MzQxXFx1NGUwMFxcdTY3MDhcXHU0ZWZkIFxcdTUzNDFcXHU0ZThjXFx1NjcwOFxcdTRlZmRcIi5zcGxpdChcIiBcIiksXG5zaG9ydE1vbnRoczpcIlxcdTRlMDBcXHU2NzA4IFxcdTRlOGNcXHU2NzA4IFxcdTRlMDlcXHU2NzA4IFxcdTU2ZGJcXHU2NzA4IFxcdTRlOTRcXHU2NzA4IFxcdTUxNmRcXHU2NzA4IFxcdTRlMDNcXHU2NzA4IFxcdTUxNmJcXHU2NzA4IFxcdTRlNWRcXHU2NzA4IFxcdTUzNDFcXHU2NzA4IFxcdTUzNDFcXHU0ZTAwXFx1NjcwOCBcXHU1MzQxXFx1NGU4Y1xcdTY3MDhcIi5zcGxpdChcIiBcIiksQU06XCJcXHU0ZTBhXFx1NTM0OFwiLFBNOlwiXFx1NGUwYlxcdTUzNDhcIixhbTpcIlxcdTRlMGFcXHU1MzQ4XCIscG06XCJcXHU0ZTBiXFx1NTM0OFwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlclwiLHg6XCIlRFwifX19LGc9ZC5lbl9VUyxuPW5ldyBhKGcsMCwhMSk7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtKXZhciBrPW0uZXhwb3J0cz1uO2Vsc2Ugaz1mdW5jdGlvbigpe3JldHVybiB0aGlzfHwoMCxldmFsKShcInRoaXNcIil9KCksXG5rLnN0cmZ0aW1lPW47XCJmdW5jdGlvblwiIT09dHlwZW9mIERhdGUubm93JiYoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KX0pKCl9LGZ1bmN0aW9uKG0scSxhKXsoZnVuY3Rpb24oKXt2YXIgYT1mdW5jdGlvbihiLGMsZil7cmV0dXJuIGEucGFyc2UoYixjLGYpfTthLnZlcnNpb249XCIwLjAuMVwiOyhtLmV4cG9ydHM9YSkuc3RycHRpbWU9YTthLmxvY2FsZT17YTpcIlN1biBNb24gVHVlIFdlZCBUaHUgRnJpIFNhdFwiLnNwbGl0KFwiIFwiKSxBOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksYjpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLEI6XCJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyXCIuc3BsaXQoXCIgXCIpLGY6XCJKYW4uIEZlYi4gTWFyLiBBcHIuIE1heSBKdW4uIEp1bC4gQXVnLiBTZXAuIE9jdC4gTm92LiBEZWMuXCIuc3BsaXQoXCIgXCIpLFxuYzpcIiVZLSVtLSVkICVIOiVNOiVTXCIsUDpbXCJhbVwiLFwicG1cIl0scjpcIiVJOiVNOiVTICVwXCIseDpcIiVtLyVkLyV5XCIsWDpcIiVIOiVNOiVTXCIsZGF5OltcIlllc3RlcmRheVwiLFwiVG9kYXlcIixcIlRvbW9ycm93XCJdLGJnOlwiSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWNcIi5zcGxpdChcIiBcIiksQmc6XCJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyXCIuc3BsaXQoXCIgXCIpLGZnOlwiSmFuLiBGZWIuIE1hci4gQXByLiBNYXkgSnVuLiBKdWwuIEF1Zy4gU2VwLiBPY3QuIE5vdi4gRGVjLlwiLnNwbGl0KFwiIFwiKSxEYXRlX2RCWV95ZWFyX2luX0hNOlwiJSNCICUtZCwgJVkgYXQgJS1IOiVNXCIsRGF0ZV9kQllfeWVhcjpcIiUjQiAlLWQsICVZXCIsRGF0ZV9kQlk6XCIlI0IgJS1kLCAlWVwiLERhdGVfQWRCWTpcIiVBLCAlI0IgJS1kLCAlWVwiLERhdGVfZEJBOlwiJSNCICUtZCwgJUFcIixcbkRhdGVfZGZfaW5fSE06XCIlI2YsICUtZCBhdCAlLUg6JU1cIixEYXRlX2RmWTpcIiUtZCAlI2YgJVlcIixEYXRlX2RCX2luX0hNOlwiJSNCICUtZCBhdCAlLUg6JU1cIixEYXRlX2RmOlwiJS1kICUjZlwifTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGMsZSxmLGgsbCl7Yz1TdHJpbmcoYyk7ZT1TdHJpbmcoZSk7Yz1jLnJlcGxhY2UoL15bI18wXFxeXFwtIX5dKy8sXCJcIik7Zj1kW2NdO2lmKCFmKXJldHVybiBhO3ZhciBrPSExOy0xPT09ZS5pbmRleE9mKFwiIVwiKSYmMT09PWMubGVuZ3RoJiYoLTE8ZS5pbmRleE9mKFwiflwiKXx8LTE8XCJiQmZcIi5pbmRleE9mKGMpJiYvJVswXFwtX10/ZFtcXHNdKyQvLnRlc3QobC5zdWJzdHIoMCxoKSkpJiYoaz0hMCk7aWYoKFwiSVwiPT09Y3x8XCJsXCI9PT1jKSYmIS8lW3BQXS8udGVzdChsKSl0aHJvdyBFcnJvcihcIlVuZGVmaW5lZCBBTS9QTVwiKTtzd2l0Y2godHlwZW9mIGYpe2Nhc2UgXCJmdW5jdGlvblwiOnJldHVybiBmKCk7Y2FzZSBcInN0cmluZ1wiOnJldHVybiBmO2Nhc2UgXCJvYmplY3RcIjpyZXR1cm4gYi5tYWtlLnB1c2goW2YubWFrZSxcbmUsa10pLFwiKFwiK2YucmVnK1wiKVwiO2RlZmF1bHQ6cmV0dXJuIGF9fWZ1bmN0aW9uIGMoYSxiKXthPVN0cmluZyhhKTtiPVN0cmluZyhiKTtyZXR1cm4tMSE9PWIuaW5kZXhPZihcIiNcIik/YS5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyKDEpOi0xIT09Yi5pbmRleE9mKFwiXlwiKT9hLnN1YnN0cigwLDEpK2Euc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk6YX12YXIgbD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMubGVuZ3RoLGQ9MDtkPGI7KXtpZihhPT10aGlzW2RdKXJldHVybiBkO2QrK31yZXR1cm4tMX0saD1hLmxvY2FsZSxkPXtcIiVcIjpcIlxcXFwlXCIsYTpcIlxcXFxTK1wiLEE6XCJcXFxcUytcIixiOntyZWc6XCJcXFxcUytcIixtYWtlOmZ1bmN0aW9uKGEsYixkLGUpe2I9bC5jYWxsKGU/aC5iZzpoLmIsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LGg6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxcbmIsZCxlKXtiPWwuY2FsbChlP2guYmc6aC5iLGMoYixkKSk7aWYoLTE9PT1iKXJldHVybiExO2Euc2V0VVRDTW9udGgoYik7cmV0dXJuITB9fSxCOntyZWc6XCJcXFxcUytcIixtYWtlOmZ1bmN0aW9uKGEsYixkLGUpe2I9bC5jYWxsKGU/aC5CZzpoLkIsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LGY6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiLGQsZSl7Yj1sLmNhbGwoZT9oLmZnOmguZixjKGIsZCkpO2lmKC0xPT09YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGIpO3JldHVybiEwfX0sZzp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw5OTxiKXJldHVybiExO2IrPTEwMCpwYXJzZUludCgobmV3IERhdGUpLmdldFVUQ0Z1bGxZZWFyKCkvMTAwLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sRzp7cmVnOlwiXFxcXGR7NH1cIixtYWtlOmZ1bmN0aW9uKGEsXG5iKXtiPXBhcnNlSW50KGIsMTApO2Euc2V0VVRDRnVsbFllYXIoYik7cmV0dXJuITB9fSxkOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDMxPGIpcmV0dXJuITE7YS5zZXRVVENEYXRlKGIpO3JldHVybiEwfX0sZTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMT5ifHwzMTxiKXJldHVybiExO2Euc2V0VVRDRGF0ZShiKTtyZXR1cm4hMH19LEg6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDA+Ynx8MjM8YilyZXR1cm4hMTthLnNldFVUQ0hvdXJzKGIpO3JldHVybiEwfX0sSTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMT5ifHwxMjxiKXJldHVybiExO2Euc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpK2IpO3JldHVybiEwfX0sbTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsXG5tYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENNb250aChiLTEpO3JldHVybiEwfX0sTTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw1OTxiKXJldHVybiExO2Euc2V0VVRDTWludXRlcyhiKTtyZXR1cm4hMH19LG46XCJcXFxcblwiLHA6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWwuY2FsbChoLlAsYi50b0xvd2VyQ2FzZSgpKTtpZigtMT09PWIpcmV0dXJuITE7MT09PWImJmEuc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpKzEyKTtyZXR1cm4hMH19LFA6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWwuY2FsbChoLlAsYi50b0xvd2VyQ2FzZSgpKTtpZigtMT09PWIpcmV0dXJuITE7MT09PWImJmEuc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpKzEyKTtyZXR1cm4hMH19LFM6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxcbmIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw2MDxiKXJldHVybiExO2Euc2V0VVRDU2Vjb25kcyhiKTtyZXR1cm4hMH19LHQ6XCJcXFxcdFwiLHU6XCJcXFxcZFwiLFU6XCJbXFxcXGRcXFxcc10/XFxcXGRcIix3OlwiXFxcXGRcIixXOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIseTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw5OTxiKXJldHVybiExO2IrPTEwMCpwYXJzZUludCgobmV3IERhdGUpLmdldFVUQ0Z1bGxZZWFyKCkvMTAwLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sWTp7cmVnOlwiXFxcXGR7NH1cIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sejp7cmVnOlwiWytcXFxcLV1cXFxcZHs0fVwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWIubWF0Y2goL14oWytcXC1dKShcXGR7Mn0pKFxcZHsyfSkkLyk7aWYoIWIpcmV0dXJuITE7dmFyIGQ9NkU0Kig2MCpwYXJzZUludChiWzJdLDEwKStcbnBhcnNlSW50KGJbM10sMTApKTtcIitcIj09PWJbMV0mJihkPS1kKTthLnNldFRpbWUoYS5nZXRUaW1lKCkrZCk7cmV0dXJuITB9fSxsOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrYik7cmV0dXJuITB9fSxzOntyZWc6XCJcXFxcZCtcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTthLnNldFRpbWUoMUUzKmIpO3JldHVybiEwfX0sYzpoLmMscjpoLnIsUjpcIiVIOiVNXCIsVDpcIiVIOiVNOiVTXCIseDpoLngsWDpoLlgsRDpcIiVtLyVkLyV5XCIsRjpcIiVZLSVtLSVkXCIsRGF0ZV9pc286XCIlWS0lbS0lZFQlSDolTTolU1wiLERhdGVfZEJZX3llYXJfaW5fSE06aC5EYXRlX2RCWV95ZWFyX2luX0hNLERhdGVfZEJZX3llYXI6aC5EYXRlX2RCWV95ZWFyLERhdGVfZEJZOmguRGF0ZV9kQlksRGF0ZV9kQkE6aC5EYXRlX2RCQSxEYXRlX0FkQlk6aC5EYXRlX0FkQlksXG5EYXRlX2RmX2luX0hNOmguRGF0ZV9kZl9pbl9ITSxEYXRlX2RmWTpoLkRhdGVfZGZZLERhdGVfZEJfaW5fSE06aC5EYXRlX2RCX2luX0hNLERhdGVfZG1ZX19kb3Q6XCIlZC4lbS4lWVwiLERhdGVfZGY6aC5EYXRlX2RmLERhdGVfRlQ6XCIlRiAlVFwiLERhdGVfZG1ZX19taW51czpcIiVkLSVtLSVZXCJ9O2EucGFyc2U9ZnVuY3Rpb24oYSxkLGMpe2E9U3RyaW5nKGEpO2Q9U3RyaW5nKGQpO2Zvcih2YXIgZT01Oy8lKERhdGVfW2EtekEtWjAtOV9dK3xbY0RGclJUeFhdKS9nLnRlc3QoZCkmJmU7KWQ9ZC5yZXBsYWNlKC8lKERhdGVfW2EtekEtWjAtOV9dK3xbY0RGclJUeFhdKS8sYiksZS0tO2IubWFrZT1bXTtkPWQucmVwbGFjZSgvJSgoWyNcXF4hfl17MCwyfSlbYUFiQmZoXXwoWzBcXC1fXT8pW2RlZ0hJbU1TVld5bF18W0ducFB0dVV3WXpacyVdKS9nLGIpO2E9YS5tYXRjaChuZXcgUmVnRXhwKGQpKTtpZighYXx8IWIubWFrZS5sZW5ndGgpcmV0dXJuIG51bGw7ZD1uZXcgRGF0ZShEYXRlLlVUQygwLFxuMCkpO2U9MDtmb3IodmFyIGs9Yi5tYWtlLmxlbmd0aDtlPGs7ZSsrKXt2YXIgZj1iLm1ha2VbZV07aWYoIWZbMF0oZCxhW2UrMV0sZlsxXSxmWzJdKSlyZXR1cm4gbnVsbH1jJiZkLnNldFRpbWUoZC5nZXRUaW1lKCkrNkU0KmQuZ2V0VGltZXpvbmVPZmZzZXQoKSk7cmV0dXJuIGR9fSkoYSl9KSgpfSxmdW5jdGlvbihtLHEsYSl7bT1hKDYpO2NvbnN0IGM9U2suZ2xvYmFsLkpTQkk9dm9pZCAwIT09U2suZ2xvYmFsLkJpZ0ludD97fTptO2lmKHZvaWQgMD09PVNrLmdsb2JhbC5CaWdJbnQpe2NvbnN0IGE9Yy5fX2lzQmlnSW50O2MuX19pc0JpZ0ludD1hP2I9Pm51bGwhPT1iJiZhKGIpOmE9PmEgaW5zdGFuY2VvZiBjO2MucG93ZXJtb2Q9KGEsYixsKT0+e2NvbnN0IGU9Yy5CaWdJbnQoMSk7bGV0IGQ9ZTtmb3IoYj1jLmdyZWF0ZXJUaGFuKGIsYy5fX1pFUk8pP2I6Yy51bmFyeU1pbnVzKGIpO2MuZ3JlYXRlclRoYW4oYixjLl9fWkVSTyk7KWMuYml0d2lzZUFuZChiLGUpJiYoZD1jLnJlbWFpbmRlcihjLm11bHRpcGx5KGQsXG5hKSxsKSksYj1jLnNpZ25lZFJpZ2h0U2hpZnQoYixlKSxhPWMucmVtYWluZGVyKGMubXVsdGlwbHkoYSxhKSxsKTtyZXR1cm4gZH19ZWxzZSBPYmplY3QuYXNzaWduKGMse0JpZ0ludDpTay5nbG9iYWwuQmlnSW50LHRvTnVtYmVyOmE9Pk51bWJlcihhKSx0b1N0cmluZzphPT5hLnRvU3RyaW5nKCksX19pc0JpZ0ludDphPT5cImJpZ2ludFwiPT09dHlwZW9mIGEsdW5hcnlNaW51czphPT4tYSxiaXR3aXNlTm90OmE9Pn5hLGJpdHdpc2VBbmQ6KGEsYyk9PmEmYyxiaXR3aXNlT3I6KGEsYyk9PmF8YyxiaXR3aXNlWG9yOihhLGMpPT5hXmMsZXhwb25lbnRpYXRlOihhLGUpPT57Y29uc3QgYj1jLkJpZ0ludCgxKTtsZXQgbD1iO2ZvcihlPWU+Yy5fX1pFUk8/ZTotZTtlPmMuX19aRVJPOyllJmImJihsKj1hKSxlPj49YixhKj1hO3JldHVybiBsfSxwb3dlcm1vZDooYSxlLGYpPT57Y29uc3QgYj1jLkJpZ0ludCgxKTtsZXQgaD1iO2ZvcihlPWU+Yy5fX1pFUk8/ZTotZTtlPmMuX19aRVJPOyllJlxuYiYmKGg9aCphJWYpLGU+Pj1iLGE9YSphJWY7cmV0dXJuIGh9LG11bHRpcGx5OihhLGMpPT5hKmMsZGl2aWRlOihhLGMpPT5hL2MscmVtYWluZGVyOihhLGMpPT5hJWMsYWRkOihhLGMpPT5hK2Msc3VidHJhY3Q6KGEsYyk9PmEtYyxsZWZ0U2hpZnQ6KGEsYyk9PmE8PGMsc2lnbmVkUmlnaHRTaGlmdDooYSxjKT0+YT4+Yyx1bnNpZ25lZFJpZ2h0U2hpZnQ6KGEsYyk9PmE+Pj5jLGxlc3NUaGFuOihhLGMpPT5hPGMsbGVzc1RoYW5PckVxdWFsOihhLGMpPT5hPD1jLGdyZWF0ZXJUaGFuOihhLGMpPT5hPmMsZ3JlYXRlclRoYW5PckVxdWFsOihhLGMpPT5hPj1jLGVxdWFsOihhLGMpPT5hPT09Yyxub3RFcXVhbDooYSxjKT0+YSE9PWN9KTtjLl9fWkVSTz1jLkJpZ0ludCgwKTtjLl9fTUFYX1NBRkU9Yy5CaWdJbnQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO2MuX19NSU5fU0FGRT1jLkJpZ0ludCgtTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO2MubnVtYmVySWZTYWZlPWE9PmMubGVzc1RoYW4oYSxcbmMuX19NQVhfU0FGRSkmJmMuZ3JlYXRlclRoYW4oYSxjLl9fTUlOX1NBRkUpP2MudG9OdW1iZXIoYSk6YX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhLGIpe20uZXhwb3J0cz1iKCl9KSh0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7cmV0dXJuIGE9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYX06ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmYS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmYSE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgYX0sYShiKX1mdW5jdGlvbiBiKGEsYil7Zm9yKHZhciBkLGM9MDtjPGIubGVuZ3RoO2MrKylkPWJbY10sZC5lbnVtZXJhYmxlPWQuZW51bWVyYWJsZXx8ITEsZC5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gZCYmKGQud3JpdGFibGU9XG4hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZC5rZXksZCl9ZnVuY3Rpb24gZShhLGQsYyl7cmV0dXJuIGQmJmIoYS5wcm90b3R5cGUsZCksYyYmYihhLGMpLGF9ZnVuY3Rpb24gZihhLGIpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGImJm51bGwhPT1iKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGImJmIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6YSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7YiYmaChhLGIpfWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGw9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihhKX0sbChhKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGg9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbihhLFxuYil7cmV0dXJuIGEuX19wcm90b19fPWIsYX0saChhLGIpfWZ1bmN0aW9uIGQoKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKEQpe3JldHVybiExfX1mdW5jdGlvbiBnKCl7cmV0dXJuIGc9ZCgpP1JlZmxlY3QuY29uc3RydWN0OmZ1bmN0aW9uKGEsYixkKXt2YXIgYz1bbnVsbF07Yy5wdXNoLmFwcGx5KGMsYik7YT1uZXcgKEZ1bmN0aW9uLmJpbmQuYXBwbHkoYSxjKSk7cmV0dXJuIGQmJmgoYSxkLnByb3RvdHlwZSksYX0sZy5hcHBseShudWxsLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbihhKXt2YXIgYj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBNYXA/bmV3IE1hcDp2b2lkIDA7XG5yZXR1cm4gbj1mdW5jdGlvbihhKXtmdW5jdGlvbiBkKCl7cmV0dXJuIGcoYSxhcmd1bWVudHMsbCh0aGlzKS5jb25zdHJ1Y3Rvcil9aWYobnVsbD09PWF8fC0xPT09RnVuY3Rpb24udG9TdHJpbmcuY2FsbChhKS5pbmRleE9mKFwiW25hdGl2ZSBjb2RlXVwiKSlyZXR1cm4gYTtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgYil7aWYoYi5oYXMoYSkpcmV0dXJuIGIuZ2V0KGEpO2Iuc2V0KGEsZCl9cmV0dXJuIGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpkLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGgoZCxhKX0sbihhKX1mdW5jdGlvbiBrKGEpe3ZhciBiPWQoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1sKGEpO2lmKGIpe3ZhciBjPVxubCh0aGlzKS5jb25zdHJ1Y3RvcjtkPVJlZmxlY3QuY29uc3RydWN0KGQsYXJndW1lbnRzLGMpfWVsc2UgZD1kLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighZHx8XCJvYmplY3RcIiE9dHlwZW9mIGQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGQpe2lmKHZvaWQgMD09PXRoaXMpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO2Q9dGhpc31yZXR1cm4gZH19ZnVuY3Rpb24gcChhLGIpe2lmKGEpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhKXJldHVybiB1KGEsYik7dmFyIGQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpLnNsaWNlKDgsLTEpO3JldHVyblwiT2JqZWN0XCI9PT1kJiZhLmNvbnN0cnVjdG9yJiYoZD1hLmNvbnN0cnVjdG9yLm5hbWUpLFwiTWFwXCI9PT1kfHxcIlNldFwiPT09ZD9BcnJheS5mcm9tKGEpOlwiQXJndW1lbnRzXCI9PT1kfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChkKT9cbnUoYSxiKTp2b2lkIDB9fWZ1bmN0aW9uIHUoYSxiKXsobnVsbD09Ynx8Yj5hLmxlbmd0aCkmJihiPWEubGVuZ3RoKTtmb3IodmFyIGQ9MCxjPUFycmF5KGIpO2Q8YjtkKyspY1tkXT1hW2RdO3JldHVybiBjfWZ1bmN0aW9uIEEoYSxiKXt2YXIgZDtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHxudWxsPT1hW1N5bWJvbC5pdGVyYXRvcl0pe2lmKEFycmF5LmlzQXJyYXkoYSl8fChkPXAoYSkpfHxiJiZhJiZcIm51bWJlclwiPT10eXBlb2YgYS5sZW5ndGgpe2QmJihhPWQpO3ZhciBjPTA7Yj1mdW5jdGlvbigpe307cmV0dXJue3M6YixuOmZ1bmN0aW9uKCl7cmV0dXJuIGM+PWEubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTphW2MrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGE7fSxmOmJ9fXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn12YXIgZSxrPSEwLGY9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtkPWFbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uKCl7dmFyIGE9ZC5uZXh0KCk7cmV0dXJuIGs9YS5kb25lLGF9LGU6ZnVuY3Rpb24oYSl7Zj0hMDtlPWF9LGY6ZnVuY3Rpb24oKXt0cnl7a3x8bnVsbD09ZC5yZXR1cm58fGQucmV0dXJuKCl9ZmluYWxseXtpZihmKXRocm93IGU7fX19fXZhciB0PU1hdGguaW11bCx2PU1hdGguY2x6MzIsQj1mdW5jdGlvbihiKXtmdW5jdGlvbiBkKGEsYil7dmFyIGM7aWYoISh0aGlzIGluc3RhbmNlb2YgZCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtpZihhPmQuX19rTWF4TGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiTWF4aW11bSBCaWdJbnQgc2l6ZSBleGNlZWRlZFwiKTtyZXR1cm4gYz1oLmNhbGwodGhpcyxhKSxjLnNpZ249YixjfXZhciBjPU1hdGguYWJzLGc9TWF0aC5tYXg7ZihkLGIpO3ZhciBoPWsoZCk7XG5yZXR1cm4gZShkLFt7a2V5OlwidG9EZWJ1Z1N0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGEsYj1bXCJCaWdJbnRbXCJdLGQ9QSh0aGlzKTt0cnl7Zm9yKGQucygpOyEoYT1kLm4oKSkuZG9uZTspe3ZhciBjPWEudmFsdWU7Yi5wdXNoKChjPyhjPj4+MCkudG9TdHJpbmcoMTYpOmMpK1wiLCBcIil9fWNhdGNoKFApe2QuZShQKX1maW5hbGx5e2QuZigpfXJldHVybiBiLnB1c2goXCJdXCIpLGIuam9pbihcIlwiKX19LHtrZXk6XCJ0b1N0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjEwO2lmKDI+YXx8MzY8YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInRvU3RyaW5nKCkgcmFkaXggYXJndW1lbnQgbXVzdCBiZSBiZXR3ZWVuIDIgYW5kIDM2XCIpO3JldHVybiAwPT09dGhpcy5sZW5ndGg/XCIwXCI6MD09KGEmYS0xKT9kLl9fdG9TdHJpbmdCYXNlUG93ZXJPZlR3byh0aGlzLGEpOmQuX190b1N0cmluZ0dlbmVyaWModGhpcyxcbmEsITEpfX0se2tleTpcIl9fY29weVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBkKHRoaXMubGVuZ3RoLHRoaXMuc2lnbiksYj0wO2I8dGhpcy5sZW5ndGg7YisrKWFbYl09dGhpc1tiXTtyZXR1cm4gYX19LHtrZXk6XCJfX3RyaW1cIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmxlbmd0aCxiPXRoaXNbYS0xXTswPT09YjspYS0tLGI9dGhpc1thLTFdLHRoaXMucG9wKCk7cmV0dXJuIDA9PT1hJiYodGhpcy5zaWduPSExKSx0aGlzfX0se2tleTpcIl9faW5pdGlhbGl6ZURpZ2l0c1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLmxlbmd0aDthKyspdGhpc1thXT0wfX0se2tleTpcIl9fY2x6bXNkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZC5fX2NsejMyKHRoaXNbdGhpcy5sZW5ndGgtMV0pfX0se2tleTpcIl9faW5wbGFjZU11bHRpcGx5QWRkXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe2M+dGhpcy5sZW5ndGgmJihjPXRoaXMubGVuZ3RoKTt2YXIgZT1cbjY1NTM1JmE7YT4+Pj0xNjt2YXIgaz0wLGY9NjU1MzUmYjtiPj4+PTE2O2Zvcih2YXIgZz0wO2c8YztnKyspe3ZhciBoPXRoaXMuX19kaWdpdChnKSxwPTY1NTM1JmgsbD1oPj4+MTY7aD1kLl9faW11bChwLGUpO3A9ZC5fX2ltdWwocCxhKTt2YXIgdj1kLl9faW11bChsLGUpO2w9ZC5fX2ltdWwobCxhKTt2YXIgeT1mKyg2NTUzNSZoKTtoPWIraysoeT4+PjE2KSsoaD4+PjE2KSsoNjU1MzUmcCkrKDY1NTM1JnYpO2Y9KHA+Pj4xNikrKHY+Pj4xNikrKDY1NTM1JmwpKyhoPj4+MTYpO2s9Zj4+PjE2O2YmPTY1NTM1O2I9bD4+PjE2O3RoaXMuX19zZXREaWdpdChnLDY1NTM1Jnl8aDw8MTYpfWlmKDAhPT1rfHwwIT09Znx8MCE9PWIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7fX0se2tleTpcIl9faW5wbGFjZUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXtmb3IodmFyIGMsZT0wLGs9MDtrPGQ7aysrKWM9dGhpcy5fX2hhbGZEaWdpdChiK2spK2EuX19oYWxmRGlnaXQoaykrXG5lLGU9Yz4+PjE2LHRoaXMuX19zZXRIYWxmRGlnaXQoYitrLGMpO3JldHVybiBlfX0se2tleTpcIl9faW5wbGFjZVN1YlwiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0wO2lmKDEmYil7Yj4+PTE7Zm9yKHZhciBlPXRoaXMuX19kaWdpdChiKSxrPTY1NTM1JmUsZj0wO2Y8ZC0xPj4+MTtmKyspe3ZhciBnPWEuX19kaWdpdChmKTtlPShlPj4+MTYpLSg2NTUzNSZnKS1jO2M9MSZlPj4+MTY7dGhpcy5fX3NldERpZ2l0KGIrZixlPDwxNnw2NTUzNSZrKTtlPXRoaXMuX19kaWdpdChiK2YrMSk7az0oNjU1MzUmZSktKGc+Pj4xNiktYztjPTEmaz4+PjE2fWc9YS5fX2RpZ2l0KGYpO3ZhciBoPShlPj4+MTYpLSg2NTUzNSZnKS1jO2M9MSZoPj4+MTY7dGhpcy5fX3NldERpZ2l0KGIrZixoPDwxNnw2NTUzNSZrKTtpZihiK2YrMT49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvdXQgb2YgYm91bmRzXCIpOzA9PSgxJmQpJiYoZT10aGlzLl9fZGlnaXQoYitmKzEpLGs9KDY1NTM1JlxuZSktKGc+Pj4xNiktYyxjPTEmaz4+PjE2LHRoaXMuX19zZXREaWdpdChiK2EubGVuZ3RoLDQyOTQ5MDE3NjAmZXw2NTUzNSZrKSl9ZWxzZXtiPj49MTtmb3Ioaz0wO2s8YS5sZW5ndGgtMTtrKyspZT10aGlzLl9fZGlnaXQoYitrKSxnPWEuX19kaWdpdChrKSxmPSg2NTUzNSZlKS0oNjU1MzUmZyktYyxjPTEmZj4+PjE2LGU9KGU+Pj4xNiktKGc+Pj4xNiktYyxjPTEmZT4+PjE2LHRoaXMuX19zZXREaWdpdChiK2ssZTw8MTZ8NjU1MzUmZik7Zj10aGlzLl9fZGlnaXQoYitrKTthPWEuX19kaWdpdChrKTtlPSg2NTUzNSZmKS0oNjU1MzUmYSktYztjPTEmZT4+PjE2O2c9MDswPT0oMSZkKSYmKGc9KGY+Pj4xNiktKGE+Pj4xNiktYyxjPTEmZz4+PjE2KTt0aGlzLl9fc2V0RGlnaXQoYitrLGc8PDE2fDY1NTM1JmUpfXJldHVybiBjfX0se2tleTpcIl9faW5wbGFjZVJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhKXtpZigwIT09YSl7Zm9yKHZhciBiLGQ9dGhpcy5fX2RpZ2l0KDApPj4+YSxcbmM9dGhpcy5sZW5ndGgtMSxlPTA7ZTxjO2UrKyliPXRoaXMuX19kaWdpdChlKzEpLHRoaXMuX19zZXREaWdpdChlLGI8PDMyLWF8ZCksZD1iPj4+YTt0aGlzLl9fc2V0RGlnaXQoYyxkKX19fSx7a2V5OlwiX19kaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW2FdfX0se2tleTpcIl9fdW5zaWduZWREaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW2FdPj4+MH19LHtrZXk6XCJfX3NldERpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt0aGlzW2FdPTB8Yn19LHtrZXk6XCJfX3NldERpZ2l0R3Jvd1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dGhpc1thXT0wfGJ9fSx7a2V5OlwiX19oYWxmRGlnaXRMZW5ndGhcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGVuZ3RoO3JldHVybiA2NTUzNT49dGhpcy5fX3Vuc2lnbmVkRGlnaXQoYS0xKT8yKmEtMToyKmF9fSx7a2V5OlwiX19oYWxmRGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gNjU1MzUmdGhpc1thPj4+MV0+Pj5cbigoMSZhKTw8NCl9fSx7a2V5OlwiX19zZXRIYWxmRGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPWE+Pj4xLGM9dGhpcy5fX2RpZ2l0KGQpO3RoaXMuX19zZXREaWdpdChkLDEmYT82NTUzNSZjfGI8PDE2OjQyOTQ5MDE3NjAmY3w2NTUzNSZiKX19XSxbe2tleTpcIkJpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGIpe3ZhciBjPU1hdGguZmxvb3IsZT1OdW1iZXIuaXNGaW5pdGU7aWYoXCJudW1iZXJcIj09dHlwZW9mIGIpe2lmKDA9PT1iKXJldHVybiBkLl9femVybygpO2lmKCgwfGIpPT09YilyZXR1cm4gMD5iP2QuX19vbmVEaWdpdCgtYiwhMCk6ZC5fX29uZURpZ2l0KGIsITEpO2lmKCFlKGIpfHxjKGIpIT09Yil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBudW1iZXIgXCIrYitcIiBjYW5ub3QgYmUgY29udmVydGVkIHRvIEJpZ0ludCBiZWNhdXNlIGl0IGlzIG5vdCBhbiBpbnRlZ2VyXCIpO3JldHVybiBkLl9fZnJvbURvdWJsZShiKX1pZihcInN0cmluZ1wiPT10eXBlb2YgYil7Yz1kLl9fZnJvbVN0cmluZyhiKTtcbmlmKG51bGw9PT1jKXRocm93IG5ldyBTeW50YXhFcnJvcihcIkNhbm5vdCBjb252ZXJ0IFwiK2IrXCIgdG8gYSBCaWdJbnRcIik7cmV0dXJuIGN9aWYoXCJib29sZWFuXCI9PXR5cGVvZiBiKXJldHVybiEwPT09Yj9kLl9fb25lRGlnaXQoMSwhMSk6ZC5fX3plcm8oKTtpZihcIm9iamVjdFwiPT09YShiKSl7aWYoYi5jb25zdHJ1Y3Rvcj09PWQpcmV0dXJuIGI7Yj1kLl9fdG9QcmltaXRpdmUoYik7cmV0dXJuIGQuQmlnSW50KGIpfXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBcIitiK1wiIHRvIGEgQmlnSW50XCIpO319LHtrZXk6XCJ0b051bWJlclwiLHZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA9PT1iKXJldHVybiAwO2lmKDE9PT1iKXt2YXIgYz1hLl9fdW5zaWduZWREaWdpdCgwKTtyZXR1cm4gYS5zaWduPy1jOmN9dmFyIGU9YS5fX2RpZ2l0KGItMSksaz1kLl9fY2x6MzIoZSk7Yz0zMipiLWs7aWYoMTAyNDxjKXJldHVybiBhLnNpZ24/LUluZmluaXR5OjEvMDstLWM7XG52YXIgZj1iLTEsZz1rKzE7az0oMzI9PT1nPzA6ZTw8Zyk+Pj4xMjt2YXIgaD1nLTEyO2I9MTI8PWc/MDplPDwyMCtnO2c9MjArZzswPGgmJjA8ZiYmKGYtLSxlPWEuX19kaWdpdChmKSxrfD1lPj4+MzItaCxiPWU8PGgsZz1oKTswPGcmJjA8ZiYmKGYtLSxlPWEuX19kaWdpdChmKSxifD1lPj4+MzItZyxnLT0zMik7ZT1kLl9fZGVjaWRlUm91bmRpbmcoYSxnLGYsZSk7aWYoKDE9PT1lfHwwPT09ZSYmMT09KDEmYikpJiYoYj1iKzE+Pj4wLDA9PT1iJiYoaysrLDAhPWs+Pj4yMCYmKGs9MCxjKyssMTAyMzxjKSkpKXJldHVybiBhLnNpZ24/LUluZmluaXR5OjEvMDthPWEuc2lnbj8tMjE0NzQ4MzY0ODowO3JldHVybiBjPWMrMTAyMzw8MjAsZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT1hfGN8ayxkLl9fa0JpdENvbnZlcnNpb25JbnRzWzBdPWIsZC5fX2tCaXRDb252ZXJzaW9uRG91YmxlWzBdfX0se2tleTpcInVuYXJ5TWludXNcIix2YWx1ZTpmdW5jdGlvbihhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGE7XG52YXIgYj1hLl9fY29weSgpO3JldHVybiBiLnNpZ249IWEuc2lnbixifX0se2tleTpcImJpdHdpc2VOb3RcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5zaWduP2QuX19hYnNvbHV0ZVN1Yk9uZShhKS5fX3RyaW0oKTpkLl9fYWJzb2x1dGVBZGRPbmUoYSwhMCl9fSx7a2V5OlwiZXhwb25lbnRpYXRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihiLnNpZ24pdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJFeHBvbmVudCBtdXN0IGJlIHBvc2l0aXZlXCIpO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gZC5fX29uZURpZ2l0KDEsITEpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtpZigxPT09YS5sZW5ndGgmJjE9PT1hLl9fZGlnaXQoMCkpcmV0dXJuIGEuc2lnbiYmMD09KDEmYi5fX2RpZ2l0KDApKT9kLnVuYXJ5TWludXMoYSk6YTtpZigxPGIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQmlnSW50IHRvbyBiaWdcIik7Yj1iLl9fdW5zaWduZWREaWdpdCgwKTtpZigxPT09YilyZXR1cm4gYTtpZihiPj1cbmQuX19rTWF4TGVuZ3RoQml0cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO2lmKDE9PT1hLmxlbmd0aCYmMj09PWEuX19kaWdpdCgwKSl7dmFyIGM9MSsoYj4+PjUpO2E9bmV3IGQoYyxhLnNpZ24mJjAhPSgxJmIpKTthLl9faW5pdGlhbGl6ZURpZ2l0cygpO3JldHVybiBhLl9fc2V0RGlnaXQoYy0xLDE8PCgzMSZiKSksYX1jPW51bGw7dmFyIGU9YTswIT0oMSZiKSYmKGM9YSk7Zm9yKGI+Pj0xOzAhPT1iO2I+Pj0xKWU9ZC5tdWx0aXBseShlLGUpLDAhPSgxJmIpJiYobnVsbD09PWM/Yz1lOmM9ZC5tdWx0aXBseShjLGUpKTtyZXR1cm4gY319LHtrZXk6XCJtdWx0aXBseVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYjt2YXIgYz1hLmxlbmd0aCtiLmxlbmd0aDszMjw9YS5fX2Nsem1zZCgpK2IuX19jbHptc2QoKSYmYy0tO2M9bmV3IGQoYyxhLnNpZ24hPT1iLnNpZ24pO2MuX19pbml0aWFsaXplRGlnaXRzKCk7XG5mb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkLl9fbXVsdGlwbHlBY2N1bXVsYXRlKGIsYS5fX2RpZ2l0KGUpLGMsZSk7cmV0dXJuIGMuX190cmltKCl9fSx7a2V5OlwiZGl2aWRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEaXZpc2lvbiBieSB6ZXJvXCIpO2lmKDA+ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpKXJldHVybiBkLl9femVybygpO3ZhciBjPWEuc2lnbiE9PWIuc2lnbixlPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iLmxlbmd0aCYmNjU1MzU+PWUpe2lmKDE9PT1lKXJldHVybiBjPT09YS5zaWduP2E6ZC51bmFyeU1pbnVzKGEpO2E9ZC5fX2Fic29sdXRlRGl2U21hbGwoYSxlLG51bGwpfWVsc2UgYT1kLl9fYWJzb2x1dGVEaXZMYXJnZShhLGIsITAsITEpO3JldHVybiBhLnNpZ249YyxhLl9fdHJpbSgpfX0se2tleTpcInJlbWFpbmRlclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiRGl2aXNpb24gYnkgemVyb1wiKTtcbmlmKDA+ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpKXJldHVybiBhO3ZhciBjPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iLmxlbmd0aCYmNjU1MzU+PWMpe2lmKDE9PT1jKXJldHVybiBkLl9femVybygpO2I9ZC5fX2Fic29sdXRlTW9kU21hbGwoYSxjKTtyZXR1cm4gMD09PWI/ZC5fX3plcm8oKTpkLl9fb25lRGlnaXQoYixhLnNpZ24pfWI9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxiLCExLCEwKTtyZXR1cm4gYi5zaWduPWEuc2lnbixiLl9fdHJpbSgpfX0se2tleTpcImFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zaWduO3JldHVybiBjPT09Yi5zaWduP2QuX19hYnNvbHV0ZUFkZChhLGIsYyk6MDw9ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpP2QuX19hYnNvbHV0ZVN1YihhLGIsYyk6ZC5fX2Fic29sdXRlU3ViKGIsYSwhYyl9fSx7a2V5Olwic3VidHJhY3RcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc2lnbjtyZXR1cm4gYz09PWIuc2lnbj8wPD1kLl9fYWJzb2x1dGVDb21wYXJlKGEsXG5iKT9kLl9fYWJzb2x1dGVTdWIoYSxiLGMpOmQuX19hYnNvbHV0ZVN1YihiLGEsIWMpOmQuX19hYnNvbHV0ZUFkZChhLGIsYyl9fSx7a2V5OlwibGVmdFNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09PWIubGVuZ3RofHwwPT09YS5sZW5ndGg/YTpiLnNpZ24/ZC5fX3JpZ2h0U2hpZnRCeUFic29sdXRlKGEsYik6ZC5fX2xlZnRTaGlmdEJ5QWJzb2x1dGUoYSxiKX19LHtrZXk6XCJzaWduZWRSaWdodFNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09PWIubGVuZ3RofHwwPT09YS5sZW5ndGg/YTpiLnNpZ24/ZC5fX2xlZnRTaGlmdEJ5QWJzb2x1dGUoYSxiKTpkLl9fcmlnaHRTaGlmdEJ5QWJzb2x1dGUoYSxiKX19LHtrZXk6XCJ1bnNpZ25lZFJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJCaWdJbnRzIGhhdmUgbm8gdW5zaWduZWQgcmlnaHQgc2hpZnQ7IHVzZSA+PiBpbnN0ZWFkXCIpO319LHtrZXk6XCJsZXNzVGhhblwiLFxudmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD5kLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwibGVzc1RoYW5PckVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD49ZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpfX0se2tleTpcImdyZWF0ZXJUaGFuXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDxkLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwiZ3JlYXRlclRoYW5PckVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDw9ZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpfX0se2tleTpcImVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihhLnNpZ24hPT1iLnNpZ258fGEubGVuZ3RoIT09Yi5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspaWYoYS5fX2RpZ2l0KGQpIT09Yi5fX2RpZ2l0KGQpKXJldHVybiExO3JldHVybiEwfX0se2tleTpcIm5vdEVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZC5lcXVhbChhLFxuYil9fSx7a2V5OlwiYml0d2lzZUFuZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoIWEuc2lnbiYmIWIuc2lnbilyZXR1cm4gZC5fX2Fic29sdXRlQW5kKGEsYikuX190cmltKCk7aWYoYS5zaWduJiZiLnNpZ24pe3ZhciBjPWcoYS5sZW5ndGgsYi5sZW5ndGgpKzE7YT1kLl9fYWJzb2x1dGVTdWJPbmUoYSxjKTtiPWQuX19hYnNvbHV0ZVN1Yk9uZShiKTtyZXR1cm4gYT1kLl9fYWJzb2x1dGVPcihhLGIsYSksZC5fX2Fic29sdXRlQWRkT25lKGEsITAsYSkuX190cmltKCl9YS5zaWduJiYoYj1bYixhXSxhPWJbMF0sYj1iWzFdKTtyZXR1cm4gZC5fX2Fic29sdXRlQW5kTm90KGEsZC5fX2Fic29sdXRlU3ViT25lKGIpKS5fX3RyaW0oKX19LHtrZXk6XCJiaXR3aXNlWG9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZighYS5zaWduJiYhYi5zaWduKXJldHVybiBkLl9fYWJzb2x1dGVYb3IoYSxiKS5fX3RyaW0oKTtpZihhLnNpZ24mJmIuc2lnbil7dmFyIGM9ZyhhLmxlbmd0aCxiLmxlbmd0aCk7YT1cbmQuX19hYnNvbHV0ZVN1Yk9uZShhLGMpO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIpO3JldHVybiBkLl9fYWJzb2x1dGVYb3IoYSxiLGEpLl9fdHJpbSgpfWM9ZyhhLmxlbmd0aCxiLmxlbmd0aCkrMTthLnNpZ24mJihiPVtiLGFdLGE9YlswXSxiPWJbMV0pO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIsYyk7cmV0dXJuIGI9ZC5fX2Fic29sdXRlWG9yKGIsYSxiKSxkLl9fYWJzb2x1dGVBZGRPbmUoYiwhMCxiKS5fX3RyaW0oKX19LHtrZXk6XCJiaXR3aXNlT3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWcoYS5sZW5ndGgsYi5sZW5ndGgpO2lmKCFhLnNpZ24mJiFiLnNpZ24pcmV0dXJuIGQuX19hYnNvbHV0ZU9yKGEsYikuX190cmltKCk7aWYoYS5zaWduJiZiLnNpZ24pcmV0dXJuIGE9ZC5fX2Fic29sdXRlU3ViT25lKGEsYyksYj1kLl9fYWJzb2x1dGVTdWJPbmUoYiksYT1kLl9fYWJzb2x1dGVBbmQoYSxiLGEpLGQuX19hYnNvbHV0ZUFkZE9uZShhLCEwLGEpLl9fdHJpbSgpO2Euc2lnbiYmXG4oYj1bYixhXSxhPWJbMF0sYj1iWzFdKTtiPWQuX19hYnNvbHV0ZVN1Yk9uZShiLGMpO3JldHVybiBiPWQuX19hYnNvbHV0ZUFuZE5vdChiLGEsYiksZC5fX2Fic29sdXRlQWRkT25lKGIsITAsYikuX190cmltKCl9fSx7a2V5OlwiYXNJbnROXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGI7aWYoMD09PWEpcmV0dXJuIGQuX196ZXJvKCk7aWYoYT49ZC5fX2tNYXhMZW5ndGhCaXRzKXJldHVybiBiO3ZhciBjPWErMzE+Pj41O2lmKGIubGVuZ3RoPGMpcmV0dXJuIGI7dmFyIGU9Yi5fX3Vuc2lnbmVkRGlnaXQoYy0xKSxrPTE8PCgzMSZhLTEpO2lmKGIubGVuZ3RoPT09YyYmZTxrKXJldHVybiBiO2lmKChlJmspIT09aylyZXR1cm4gZC5fX3RydW5jYXRlVG9OQml0cyhhLGIpO2lmKCFiLnNpZ24pcmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMCk7aWYoMD09KGUmay0xKSl7Zm9yKHZhciBmPWMtMjswPD1mO2YtLSlpZigwIT09XG5iLl9fZGlnaXQoZikpcmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMSk7cmV0dXJuIGIubGVuZ3RoPT09YyYmZT09PWs/YjpkLl9fdHJ1bmNhdGVUb05CaXRzKGEsYil9cmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMSl9fSx7a2V5OlwiYXNVaW50TlwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXJldHVybiBiO2lmKDA9PT1hKXJldHVybiBkLl9femVybygpO2lmKGIuc2lnbil7aWYoYT5kLl9fa01heExlbmd0aEJpdHMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCaWdJbnQgdG9vIGJpZ1wiKTtyZXR1cm4gZC5fX3RydW5jYXRlQW5kU3ViRnJvbVBvd2VyT2ZUd28oYSxiLCExKX1pZihhPj1kLl9fa01heExlbmd0aEJpdHMpcmV0dXJuIGI7dmFyIGM9YSszMT4+PjU7aWYoYi5sZW5ndGg8YylyZXR1cm4gYjt2YXIgZT0zMSZhO3JldHVybiBiLmxlbmd0aCE9Y3x8MCE9PWUmJjAhPWIuX19kaWdpdChjLTEpPj4+XG5lP2QuX190cnVuY2F0ZVRvTkJpdHMoYSxiKTpifX0se2tleTpcIkFERFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoYT1kLl9fdG9QcmltaXRpdmUoYSksYj1kLl9fdG9QcmltaXRpdmUoYiksXCJzdHJpbmdcIj09dHlwZW9mIGEpcmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIGImJihiPWIudG9TdHJpbmcoKSksYStiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBiKXJldHVybiBhLnRvU3RyaW5nKCkrYjtpZihhPWQuX190b051bWVyaWMoYSksYj1kLl9fdG9OdW1lcmljKGIpLGQuX19pc0JpZ0ludChhKSYmZC5fX2lzQmlnSW50KGIpKXJldHVybiBkLmFkZChhLGIpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBhJiZcIm51bWJlclwiPT10eXBlb2YgYilyZXR1cm4gYStiO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgbWl4IEJpZ0ludCBhbmQgb3RoZXIgdHlwZXMsIHVzZSBleHBsaWNpdCBjb252ZXJzaW9uc1wiKTt9fSx7a2V5OlwiTFRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBkLl9fY29tcGFyZShhLGIsXG4wKX19LHtrZXk6XCJMRVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwxKX19LHtrZXk6XCJHVFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwyKX19LHtrZXk6XCJHRVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwzKX19LHtrZXk6XCJFUVwiLHZhbHVlOmZ1bmN0aW9uKGIsYyl7Zm9yKDs7KXtpZihkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuX19pc0JpZ0ludChjKT9kLmVxdWFsKGIsYyk6ZC5FUShjLGIpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBiKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuIGQuX19lcXVhbFRvTnVtYmVyKGMsYik7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGI9PWM7Yz1kLl9fdG9QcmltaXRpdmUoYyl9ZWxzZSBpZihcInN0cmluZ1wiPT10eXBlb2YgYil7aWYoZC5fX2lzQmlnSW50KGMpKXJldHVybiBiPWQuX19mcm9tU3RyaW5nKGIpLG51bGwhPT1iJiZkLmVxdWFsKGIsYyk7XG5pZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwiYm9vbGVhblwiPT10eXBlb2YgYil7aWYoZC5fX2lzQmlnSW50KGMpKXJldHVybiBkLl9fZXF1YWxUb051bWJlcihjLCtiKTtpZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwic3ltYm9sXCI9PT1hKGIpKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuITE7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGI9PWM7Yz1kLl9fdG9QcmltaXRpdmUoYyl9ZWxzZSBpZihcIm9iamVjdFwiPT09YShiKSl7aWYoXCJvYmplY3RcIj09PWEoYykmJmMuY29uc3RydWN0b3IhPT1kKXJldHVybiBiPT1jO2I9ZC5fX3RvUHJpbWl0aXZlKGIpfWVsc2UgcmV0dXJuIGI9PWN9fX0se2tleTpcIk5FXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZC5FUShhLGIpfX0se2tleTpcIl9femVyb1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBkKDAsITEpfX0sXG57a2V5OlwiX19vbmVEaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7Yj1uZXcgZCgxLGIpO3JldHVybiBiLl9fc2V0RGlnaXQoMCxhKSxifX0se2tleTpcIl9fZGVjaWRlUm91bmRpbmdcIix2YWx1ZTpmdW5jdGlvbihhLGIsZCxjKXtpZigwPGIpcmV0dXJuLTE7aWYoMD5iKWI9LWItMTtlbHNle2lmKDA9PT1kKXJldHVybi0xO2QtLTtjPWEuX19kaWdpdChkKTtiPTMxfWI9MTw8YjtpZigwPT0oYyZiKSlyZXR1cm4tMTtpZigtLWIsMCE9KGMmYikpcmV0dXJuIDE7Zm9yKDswPGQ7KWlmKGQtLSwwIT09YS5fX2RpZ2l0KGQpKXJldHVybiAxO3JldHVybiAwfX0se2tleTpcIl9fZnJvbURvdWJsZVwiLHZhbHVlOmZ1bmN0aW9uKGEpe2QuX19rQml0Q29udmVyc2lvbkRvdWJsZVswXT1hO3ZhciBiPSgyMDQ3JmQuX19rQml0Q29udmVyc2lvbkludHNbMV0+Pj4yMCktMTAyMzt2YXIgYz0oYj4+PjUpKzE7YT1uZXcgZChjLDA+YSk7dmFyIGU9MTA0ODU3NSZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdfDEwNDg1NzYsXG5rPWQuX19rQml0Q29udmVyc2lvbkludHNbMF07YiY9MzE7aWYoMjA+Yil7dmFyIGY9MjAtYjt2YXIgZz1mKzMyO2I9ZT4+PmY7ZT1lPDwzMi1mfGs+Pj5mO2s8PD0zMi1mfWVsc2UgMjA9PT1iPyhnPTMyLGI9ZSxlPWspOihmPWItMjAsZz0zMi1mLGI9ZTw8ZnxrPj4+MzItZixlPWs8PGYpO2EuX19zZXREaWdpdChjLTEsYik7Zm9yKGMtPTI7MDw9YztjLS0pMDxnPyhnLT0zMixiPWUsZT1rKTpiPTAsYS5fX3NldERpZ2l0KGMsYik7cmV0dXJuIGEuX190cmltKCl9fSx7a2V5OlwiX19pc1doaXRlc3BhY2VcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4hISgxMz49YSYmOTw9YSl8fCgxNTk+PWE/MzI9PWE6MTMxMDcxPj1hPzE2MD09YXx8NTc2MD09YToxOTY2MDc+PWE/KGEmPTEzMTA3MSwxMD49YXx8NDA9PWF8fDQxPT1hfHw0Nz09YXx8OTU9PWF8fDQwOTY9PWEpOjY1Mjc5PT1hKX19LHtrZXk6XCJfX2Zyb21TdHJpbmdcIix2YWx1ZTpmdW5jdGlvbihhKXt2YXIgYj0xPGFyZ3VtZW50cy5sZW5ndGgmJlxudm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLGM9MCxlPWEubGVuZ3RoLGs9MDtpZihrPT09ZSlyZXR1cm4gZC5fX3plcm8oKTtmb3IodmFyIGY9YS5jaGFyQ29kZUF0KGspO2QuX19pc1doaXRlc3BhY2UoZik7KXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2Y9YS5jaGFyQ29kZUF0KGspfWlmKDQzPT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKTtjPTF9ZWxzZSBpZig0NT09PWYpe2lmKCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayk7Yz0tMX1pZigwPT09Yil7aWYoYj0xMCw0OD09PWYpe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7aWYoZj1hLmNoYXJDb2RlQXQoayksODg9PT1mfHwxMjA9PT1mKXtpZihiPTE2LCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9ZWxzZSBpZig3OT09PWZ8fDExMT09PWYpe2lmKGI9OCwrK2s9PT1lKXJldHVybiBudWxsO2Y9YS5jaGFyQ29kZUF0KGspfWVsc2UgaWYoNjY9PT1cbmZ8fDk4PT09Zil7aWYoYj0yLCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9fX1lbHNlIGlmKDE2PT09YiYmNDg9PT1mKXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2lmKGY9YS5jaGFyQ29kZUF0KGspLDg4PT09Znx8MTIwPT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKX19Zm9yKDs0OD09PWY7KXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2Y9YS5jaGFyQ29kZUF0KGspfXZhciBnPWUtayxoPWQuX19rTWF4Qml0c1BlckNoYXJbYl0scD1kLl9fa0JpdHNQZXJDaGFyVGFibGVNdWx0aXBsaWVyLTE7aWYoZz4xMDczNzQxODI0L2gpcmV0dXJuIG51bGw7Zz1uZXcgZCgoaCpnK3A+Pj5kLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdCkrMzE+Pj41LCExKTt2YXIgbD0xMD5iP2I6MTAsdj0xMDxiP2ItMTA6MDtpZigwPT0oYiZiLTEpKXtoPj49ZC5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQ7dmFyIEI9W10sbj1bXSxBPVxuITE7ZG97Zm9yKHZhciBELHU9cD0wOzspe2lmKGYtNDg+Pj4wPGwpRD1mLTQ4O2Vsc2UgaWYoKDMyfGYpLTk3Pj4+MDx2KUQ9KDMyfGYpLTg3O2Vsc2V7QT0hMDticmVha31pZih1Kz1oLHA9cDw8aHxELCsraz09PWUpe0E9ITA7YnJlYWt9aWYoZj1hLmNoYXJDb2RlQXQoayksMzI8dStoKWJyZWFrfUIucHVzaChwKTtuLnB1c2godSl9d2hpbGUoIUEpO2QuX19maWxsRnJvbVBhcnRzKGcsQixuKX1lbHNle2cuX19pbml0aWFsaXplRGlnaXRzKCk7Qj0hMTtuPTA7ZG97QT0wO2ZvcihEPTE7Oyl7aWYoZi00OD4+PjA8bClwPWYtNDg7ZWxzZSBpZigoMzJ8ZiktOTc+Pj4wPHYpcD0oMzJ8ZiktODc7ZWxzZXtCPSEwO2JyZWFrfXU9RCpiO2lmKDQyOTQ5NjcyOTU8dSlicmVhaztpZihEPXUsQT1BKmIrcCxuKyssKytrPT09ZSl7Qj0hMDticmVha31mPWEuY2hhckNvZGVBdChrKX1wPTMyKmQuX19rQml0c1BlckNoYXJUYWJsZU11bHRpcGxpZXItMTtnLl9faW5wbGFjZU11bHRpcGx5QWRkKEQsXG5BLGgqbitwPj4+ZC5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQrNSl9d2hpbGUoIUIpfWlmKGshPT1lKXtpZighZC5fX2lzV2hpdGVzcGFjZShmKSlyZXR1cm4gbnVsbDtmb3IoaysrO2s8ZTtrKyspaWYoZj1hLmNoYXJDb2RlQXQoayksIWQuX19pc1doaXRlc3BhY2UoZikpcmV0dXJuIG51bGx9cmV0dXJuIDAhPT1jJiYxMCE9PWI/bnVsbDooZy5zaWduPS0xPT09YyxnLl9fdHJpbSgpKX19LHtrZXk6XCJfX2ZpbGxGcm9tUGFydHNcIix2YWx1ZTpmdW5jdGlvbihhLGIsZCl7Zm9yKHZhciBjPTAsZT0wLGs9MCxmPWIubGVuZ3RoLTE7MDw9ZjtmLS0pe3ZhciBnPWJbZl0saD1kW2ZdO2V8PWc8PGs7ays9aDszMj09PWs/KGEuX19zZXREaWdpdChjKyssZSksaz0wLGU9MCk6MzI8ayYmKGEuX19zZXREaWdpdChjKyssZSksay09MzIsZT1nPj4+aC1rKX1pZigwIT09ZSl7aWYoYz49YS5sZW5ndGgpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7YS5fX3NldERpZ2l0KGMrKyxlKX1mb3IoO2M8XG5hLmxlbmd0aDtjKyspYS5fX3NldERpZ2l0KGMsMCl9fSx7a2V5OlwiX190b1N0cmluZ0Jhc2VQb3dlck9mVHdvXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxlPWItMTtlPSg4NSZlPj4+MSkrKDg1JmUpO2U9KDUxJmU+Pj4yKSsoNTEmZSk7ZT0oMTUmZT4+PjQpKygxNSZlKTstLWI7dmFyIGs9YS5fX2RpZ2l0KGMtMSksZj1kLl9fY2x6MzIoayksZz0wfCgzMipjLWYrZS0xKS9lO2lmKGEuc2lnbiYmZysrLDI2ODQzNTQ1NjxnKXRocm93IEVycm9yKFwic3RyaW5nIHRvbyBsb25nXCIpO2Y9QXJyYXkoZyk7LS1nO2Zvcih2YXIgaD0wLHA9MCxsPTA7bDxjLTE7bCsrKXt2YXIgdj1hLl9fZGlnaXQobCk7aD0oaHx2PDxwKSZiO2ZbZy0tXT1kLl9fa0NvbnZlcnNpb25DaGFyc1toXTtwPWUtcDtoPXY+Pj5wO2ZvcihwPTMyLXA7cD49ZTspZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2gmYl0saD4+Pj1lLHAtPWV9ZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzWyhofGs8PFxucCkmYl07Zm9yKGg9az4+PmUtcDswIT09aDspZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2gmYl0saD4+Pj1lO2lmKGEuc2lnbiYmKGZbZy0tXT1cIi1cIiksLTEhPT1nKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiBmLmpvaW4oXCJcIil9fSx7a2V5OlwiX190b1N0cmluZ0dlbmVyaWNcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGU9YS5sZW5ndGg7aWYoMD09PWUpcmV0dXJuXCJcIjtpZigxPT09ZSlyZXR1cm4gYj1hLl9fdW5zaWduZWREaWdpdCgwKS50b1N0cmluZyhiKSwhMT09PWMmJmEuc2lnbiYmKGI9XCItXCIrYiksYjt2YXIgaz0zMiplLWQuX19jbHozMihhLl9fZGlnaXQoZS0xKSk7ZT1kLl9fa01heEJpdHNQZXJDaGFyW2JdLTE7ayo9ZC5fX2tCaXRzUGVyQ2hhclRhYmxlTXVsdGlwbGllcjtlPSgwfChrKyhlLTEpKS9lKSsxPj4xO2s9ZC5leHBvbmVudGlhdGUoZC5fX29uZURpZ2l0KGIsITEpLGQuX19vbmVEaWdpdChlLCExKSk7dmFyIGY9ay5fX3Vuc2lnbmVkRGlnaXQoMCk7XG5pZigxPT09ay5sZW5ndGgmJjY1NTM1Pj1mKXtrPW5ldyBkKGEubGVuZ3RoLCExKTtrLl9faW5pdGlhbGl6ZURpZ2l0cygpO3ZhciBnPTA7Zm9yKHZhciBoPTIqYS5sZW5ndGgtMTswPD1oO2gtLSlnPWc8PDE2fGEuX19oYWxmRGlnaXQoaCksay5fX3NldEhhbGZEaWdpdChoLDB8Zy9mKSxnPTB8ZyVmO2Y9Zy50b1N0cmluZyhiKX1lbHNlIGY9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxrLCEwLCEwKSxrPWYucXVvdGllbnQsZj1mLnJlbWFpbmRlci5fX3RyaW0oKSxmPWQuX190b1N0cmluZ0dlbmVyaWMoZixiLCEwKTtrLl9fdHJpbSgpO2ZvcihiPWQuX190b1N0cmluZ0dlbmVyaWMoayxiLCEwKTtmLmxlbmd0aDxlOylmPVwiMFwiK2Y7cmV0dXJuITE9PT1jJiZhLnNpZ24mJihiPVwiLVwiK2IpLGIrZn19LHtrZXk6XCJfX3VuZXF1YWxTaWduXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/LTE6MX19LHtrZXk6XCJfX2Fic29sdXRlR3JlYXRlclwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhP1xuLTE6MX19LHtrZXk6XCJfX2Fic29sdXRlTGVzc1wiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhPzE6LTF9fSx7a2V5OlwiX19jb21wYXJlVG9CaWdJbnRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc2lnbjtpZihjIT09Yi5zaWduKXJldHVybiBkLl9fdW5lcXVhbFNpZ24oYyk7YT1kLl9fYWJzb2x1dGVDb21wYXJlKGEsYik7cmV0dXJuIDA8YT9kLl9fYWJzb2x1dGVHcmVhdGVyKGMpOjA+YT9kLl9fYWJzb2x1dGVMZXNzKGMpOjB9fSx7a2V5OlwiX19jb21wYXJlVG9OdW1iZXJcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKDF8Yil7dmFyIGU9YS5zaWduLGs9MD5iO2lmKGUhPT1rKXJldHVybiBkLl9fdW5lcXVhbFNpZ24oZSk7aWYoMD09PWEubGVuZ3RoKXtpZihrKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiAwPT09Yj8wOi0xfWlmKDE8YS5sZW5ndGgpcmV0dXJuIGQuX19hYnNvbHV0ZUdyZWF0ZXIoZSk7Yj1jKGIpO2E9YS5fX3Vuc2lnbmVkRGlnaXQoMCk7XG5yZXR1cm4gYT5iP2QuX19hYnNvbHV0ZUdyZWF0ZXIoZSk6YTxiP2QuX19hYnNvbHV0ZUxlc3MoZSk6MH1yZXR1cm4gZC5fX2NvbXBhcmVUb0RvdWJsZShhLGIpfX0se2tleTpcIl9fY29tcGFyZVRvRG91YmxlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihiIT09YilyZXR1cm4gYjtpZihiPT09MS8wKXJldHVybi0xO2lmKC1JbmZpbml0eT09PWIpcmV0dXJuIDE7dmFyIGM9YS5zaWduO2lmKGMhPT0wPmIpcmV0dXJuIGQuX191bmVxdWFsU2lnbihjKTtpZigwPT09Yil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Zzogc2hvdWxkIGJlIGhhbmRsZWQgZWxzZXdoZXJlXCIpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4tMTtkLl9fa0JpdENvbnZlcnNpb25Eb3VibGVbMF09YjtiPTIwNDcmZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT4+PjIwO2lmKDIwNDc9PWIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWc6IGhhbmRsZWQgZWxzZXdoZXJlXCIpO3ZhciBlPWItMTAyMztpZigwPmUpcmV0dXJuIGQuX19hYnNvbHV0ZUdyZWF0ZXIoYyk7XG5iPWEubGVuZ3RoO3ZhciBrPWEuX19kaWdpdChiLTEpLGY9ZC5fX2NsejMyKGspLGc9MzIqYi1mO2UrPTE7aWYoZzxlKXJldHVybiBkLl9fYWJzb2x1dGVMZXNzKGMpO2lmKGc+ZSlyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtlPTEwNDg1NzZ8MTA0ODU3NSZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdO3ZhciBoPWQuX19rQml0Q29udmVyc2lvbkludHNbMF07Zj0zMS1mO2lmKGYhPT0oZy0xKSUzMSl0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtpZigyMD5mKXt2YXIgcD0yMC1mO2Y9cCszMjtnPWU+Pj5wO2U9ZTw8MzItcHxoPj4+cDtoPDw9MzItcH1lbHNlIDIwPT09Zj8oZj0zMixnPWUsZT1oKToocD1mLTIwLGY9MzItcCxnPWU8PHB8aD4+PjMyLXAsZT1oPDxwKTtpZihrPj4+PTAsZz4+Pj0wLGs+ZylyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtpZihrPGcpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyk7Zm9yKGItPTI7MDw9YjtiLS0pezA8Zj8oZi09XG4zMixnPWU+Pj4wLGU9aCxoPTApOmc9MDtrPWEuX191bnNpZ25lZERpZ2l0KGIpO2lmKGs+ZylyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtpZihrPGcpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyl9aWYoMCE9PWV8fDAhPT1oKXtpZigwPT09Zil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gZC5fX2Fic29sdXRlTGVzcyhjKX1yZXR1cm4gMH19LHtrZXk6XCJfX2VxdWFsVG9OdW1iZXJcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBifDA9PT1iPzA9PT1iPzA9PT1hLmxlbmd0aDoxPT09YS5sZW5ndGgmJmEuc2lnbj09PTA+YiYmYS5fX3Vuc2lnbmVkRGlnaXQoMCk9PT1jKGIpOjA9PT1kLl9fY29tcGFyZVRvRG91YmxlKGEsYil9fSx7a2V5OlwiX19jb21wYXJpc29uUmVzdWx0VG9Cb29sXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYil7Y2FzZSAwOnJldHVybiAwPmE7Y2FzZSAxOnJldHVybiAwPj1hO2Nhc2UgMjpyZXR1cm4gMDxhO2Nhc2UgMzpyZXR1cm4gMDw9XG5hfXRocm93IEVycm9yKFwidW5yZWFjaGFibGVcIik7fX0se2tleTpcIl9fY29tcGFyZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtpZihhPWQuX190b1ByaW1pdGl2ZShhKSxiPWQuX190b1ByaW1pdGl2ZShiKSxcInN0cmluZ1wiPT10eXBlb2YgYSYmXCJzdHJpbmdcIj09dHlwZW9mIGIpc3dpdGNoKGMpe2Nhc2UgMDpyZXR1cm4gYTxiO2Nhc2UgMTpyZXR1cm4gYTw9YjtjYXNlIDI6cmV0dXJuIGE+YjtjYXNlIDM6cmV0dXJuIGE+PWJ9aWYoZC5fX2lzQmlnSW50KGEpJiZcInN0cmluZ1wiPT10eXBlb2YgYilyZXR1cm4gYj1kLl9fZnJvbVN0cmluZyhiKSxudWxsIT09YiYmZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpLGMpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhJiZkLl9faXNCaWdJbnQoYikpcmV0dXJuIGE9ZC5fX2Zyb21TdHJpbmcoYSksbnVsbCE9PWEmJmQuX19jb21wYXJpc29uUmVzdWx0VG9Cb29sKGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKSxjKTtcbmlmKGE9ZC5fX3RvTnVtZXJpYyhhKSxiPWQuX190b051bWVyaWMoYiksZC5fX2lzQmlnSW50KGEpKXtpZihkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuX19jb21wYXJpc29uUmVzdWx0VG9Cb29sKGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKSxjKTtpZihcIm51bWJlclwiIT10eXBlb2YgYil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb051bWJlcihhLGIpLGMpfWlmKFwibnVtYmVyXCIhPXR5cGVvZiBhKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO2lmKGQuX19pc0JpZ0ludChiKSlyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb051bWJlcihiLGEpLDJeYyk7aWYoXCJudW1iZXJcIiE9dHlwZW9mIGIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7cmV0dXJuIDA9PT1jP2E8YjoxPT09Yz9hPD1iOjI9PT1jP2E+YjozPT09Yz9hPj1iOlxudm9pZCAwfX0se2tleTpcIl9fYWJzb2x1dGVBZGRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7aWYoYS5sZW5ndGg8Yi5sZW5ndGgpcmV0dXJuIGQuX19hYnNvbHV0ZUFkZChiLGEsYyk7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYS5zaWduPT09Yz9hOmQudW5hcnlNaW51cyhhKTt2YXIgZT1hLmxlbmd0aDsoMD09PWEuX19jbHptc2QoKXx8Yi5sZW5ndGg9PT1hLmxlbmd0aCYmMD09PWIuX19jbHptc2QoKSkmJmUrKztjPW5ldyBkKGUsYyk7Zm9yKHZhciBrPWU9MDtrPGIubGVuZ3RoO2srKyl7dmFyIGY9Yi5fX2RpZ2l0KGspLGc9YS5fX2RpZ2l0KGspLGg9KDY1NTM1JmcpKyg2NTUzNSZmKStlO2Y9KGc+Pj4xNikrKGY+Pj4xNikrKGg+Pj4xNik7ZT1mPj4+MTY7Yy5fX3NldERpZ2l0KGssNjU1MzUmaHxmPDwxNil9Zm9yKDtrPGEubGVuZ3RoO2srKyloPWEuX19kaWdpdChrKSxiPSg2NTUzNSZoKStlLGg9KGg+Pj4xNikrKGI+Pj4xNiksZT1oPj4+XG4xNixjLl9fc2V0RGlnaXQoayw2NTUzNSZifGg8PDE2KTtyZXR1cm4gazxjLmxlbmd0aCYmYy5fX3NldERpZ2l0KGssZSksYy5fX3RyaW0oKX19LHtrZXk6XCJfX2Fic29sdXRlU3ViXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGEuc2lnbj09PWM/YTpkLnVuYXJ5TWludXMoYSk7Yz1uZXcgZChhLmxlbmd0aCxjKTtmb3IodmFyIGU9MCxrPTA7azxiLmxlbmd0aDtrKyspe3ZhciBmPWEuX19kaWdpdChrKSxnPWIuX19kaWdpdChrKSxoPSg2NTUzNSZmKS0oNjU1MzUmZyktZTtlPTEmaD4+PjE2O2Y9KGY+Pj4xNiktKGc+Pj4xNiktZTtlPTEmZj4+PjE2O2MuX19zZXREaWdpdChrLDY1NTM1Jmh8Zjw8MTYpfWZvcig7azxhLmxlbmd0aDtrKyspaD1hLl9fZGlnaXQoayksYj0oNjU1MzUmaCktZSxlPTEmYj4+PjE2LGg9KGg+Pj4xNiktZSxlPTEmaD4+PjE2LGMuX19zZXREaWdpdChrLDY1NTM1JmJ8aDw8MTYpO1xucmV0dXJuIGMuX190cmltKCl9fSx7a2V5OlwiX19hYnNvbHV0ZUFkZE9uZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aDtudWxsPT09Yz9jPW5ldyBkKGUsYik6Yy5zaWduPWI7Zm9yKHZhciBrLGY9ITAsZz0wO2c8ZTtnKyspe2lmKGs9YS5fX2RpZ2l0KGcpLGYpZj0tMT09PWssaz0wfGsrMTtjLl9fc2V0RGlnaXQoZyxrKX1yZXR1cm4gZiYmYy5fX3NldERpZ2l0R3JvdyhlLDEpLGN9fSx7a2V5OlwiX19hYnNvbHV0ZVN1Yk9uZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGg7Yj1ifHxjO2Zvcih2YXIgZSxrPW5ldyBkKGIsITEpLGY9ITAsZz0wO2c8YztnKyspe2lmKGU9YS5fX2RpZ2l0KGcpLGYpZj0wPT09ZSxlPTB8ZS0xO2suX19zZXREaWdpdChnLGUpfWlmKGYpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7Zm9yKGE9YzthPFxuYjthKyspay5fX3NldERpZ2l0KGEsMCk7cmV0dXJuIGt9fSx7a2V5OlwiX19hYnNvbHV0ZUFuZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aCxrPWIubGVuZ3RoLGY9aztlPGsmJihmPWUsZT1hLGE9YixiPWUpO2U9ZjtudWxsPT09Yz9jPW5ldyBkKGUsITEpOmU9Yy5sZW5ndGg7Zm9yKGs9MDtrPGY7aysrKWMuX19zZXREaWdpdChrLGEuX19kaWdpdChrKSZiLl9fZGlnaXQoaykpO2Zvcig7azxlO2srKyljLl9fc2V0RGlnaXQoaywwKTtyZXR1cm4gY319LHtrZXk6XCJfX2Fic29sdXRlQW5kTm90XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2U8ayYmKGY9ZSk7az1lO251bGw9PT1jP2M9bmV3IGQoaywhMSk6XG5rPWMubGVuZ3RoO2Zvcih2YXIgZz0wO2c8ZjtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpJn5iLl9fZGlnaXQoZykpO2Zvcig7ZzxlO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZykpO2Zvcig7ZzxrO2crKyljLl9fc2V0RGlnaXQoZywwKTtyZXR1cm4gY319LHtrZXk6XCJfX2Fic29sdXRlT3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLGU9YS5sZW5ndGgsaz1iLmxlbmd0aCxmPWs7aWYoZTxrKXtmPWU7dmFyIGc9YTthPWI7ZT1rO2I9Z31rPWU7bnVsbD09PWM/Yz1uZXcgZChrLCExKTprPWMubGVuZ3RoO2ZvcihnPTA7ZzxmO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZyl8Yi5fX2RpZ2l0KGcpKTtmb3IoO2c8ZTtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpKTtmb3IoO2c8aztnKyspYy5fX3NldERpZ2l0KGcsMCk7cmV0dXJuIGN9fSxcbntrZXk6XCJfX2Fic29sdXRlWG9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2lmKGU8ayl7Zj1lO3ZhciBnPWE7YT1iO2U9aztiPWd9az1lO251bGw9PT1jP2M9bmV3IGQoaywhMSk6az1jLmxlbmd0aDtmb3IoZz0wO2c8ZjtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpXmIuX19kaWdpdChnKSk7Zm9yKDtnPGU7ZysrKWMuX19zZXREaWdpdChnLGEuX19kaWdpdChnKSk7Zm9yKDtnPGs7ZysrKWMuX19zZXREaWdpdChnLDApO3JldHVybiBjfX0se2tleTpcIl9fYWJzb2x1dGVDb21wYXJlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmxlbmd0aC1iLmxlbmd0aDtpZigwIT1kKXJldHVybiBkO2ZvcihkPWEubGVuZ3RoLTE7MDw9ZCYmYS5fX2RpZ2l0KGQpPT09Yi5fX2RpZ2l0KGQpOylkLS07cmV0dXJuIDA+ZD8wOmEuX191bnNpZ25lZERpZ2l0KGQpPlxuYi5fX3Vuc2lnbmVkRGlnaXQoZCk/MTotMX19LHtrZXk6XCJfX211bHRpcGx5QWNjdW11bGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjLGUpe2lmKDAhPT1iKXtmb3IodmFyIGs9NjU1MzUmYixmPWI+Pj4xNixnPWI9MCxoPTAscD0wO3A8YS5sZW5ndGg7cCsrLGUrKyl7dmFyIGw9Yy5fX2RpZ2l0KGUpLHY9NjU1MzUmbDtsPj4+PTE2O3ZhciBCPWEuX19kaWdpdChwKSxuPTY1NTM1JkIsQT1CPj4+MTY7Qj1kLl9faW11bChuLGspO249ZC5fX2ltdWwobixmKTt2YXIgRD1kLl9faW11bChBLGspO0E9ZC5fX2ltdWwoQSxmKTt2Kz1nKyg2NTUzNSZCKTtsKz1oK2IrKHY+Pj4xNikrKEI+Pj4xNikrKDY1NTM1Jm4pKyg2NTUzNSZEKTtiPWw+Pj4xNjtnPShuPj4+MTYpKyhEPj4+MTYpKyg2NTUzNSZBKStiO2I9Zz4+PjE2O2cmPTY1NTM1O2g9QT4+PjE2O2w9NjU1MzUmdnxsPDwxNjtjLl9fc2V0RGlnaXQoZSxsKX1mb3IoOzAhPT1ifHwwIT09Z3x8MCE9PWg7ZSsrKWs9Yy5fX2RpZ2l0KGUpLGE9XG4oNjU1MzUmaykrZyxrPShrPj4+MTYpKyhhPj4+MTYpK2grYixoPWc9MCxiPWs+Pj4xNixrPTY1NTM1JmF8azw8MTYsYy5fX3NldERpZ2l0KGUsayl9fX0se2tleTpcIl9faW50ZXJuYWxNdWx0aXBseUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjLGUsayl7Zm9yKHZhciBmPTAsZz0wO2c8ZTtnKyspe3ZhciBoPWEuX19kaWdpdChnKSxwPWQuX19pbXVsKDY1NTM1JmgsYiksbD0oNjU1MzUmcCkrZitjO2M9bD4+PjE2O2Y9ZC5fX2ltdWwoaD4+PjE2LGIpO3A9KDY1NTM1JmYpKyhwPj4+MTYpK2M7Yz1wPj4+MTY7Zj4+Pj0xNjtrLl9fc2V0RGlnaXQoZyxwPDwxNnw2NTUzNSZsKX1pZihrLmxlbmd0aD5lKWZvcihrLl9fc2V0RGlnaXQoZSsrLGMrZik7ZTxrLmxlbmd0aDspay5fX3NldERpZ2l0KGUrKywwKTtlbHNlIGlmKDAhPT1jK2YpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7fX0se2tleTpcIl9fYWJzb2x1dGVEaXZTbWFsbFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtudWxsPT09XG5jJiYoYz1uZXcgZChhLmxlbmd0aCwhMSkpO2Zvcih2YXIgZT0wLGs9MiphLmxlbmd0aC0xOzA8PWs7ay09Mil7ZT0oZTw8MTZ8YS5fX2hhbGZEaWdpdChrKSk+Pj4wO3ZhciBmPTB8ZS9iO2U9MHxlJWI7ZT0oZTw8MTZ8YS5fX2hhbGZEaWdpdChrLTEpKT4+PjA7dmFyIGc9MHxlL2I7ZT0wfGUlYjtjLl9fc2V0RGlnaXQoaz4+PjEsZjw8MTZ8Zyl9cmV0dXJuIGN9fSx7a2V5OlwiX19hYnNvbHV0ZU1vZFNtYWxsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wO2Zvcih2YXIgYz0yKmEubGVuZ3RoLTE7MDw9YztjLS0pZD0oZDw8MTZ8YS5fX2hhbGZEaWdpdChjKSk+Pj4wLGQ9MHxkJWI7cmV0dXJuIGR9fSx7a2V5OlwiX19hYnNvbHV0ZURpdkxhcmdlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGs9Yi5fX2hhbGZEaWdpdExlbmd0aCgpLGY9Yi5sZW5ndGgsZz1hLl9faGFsZkRpZ2l0TGVuZ3RoKCktayxoPW51bGw7YyYmKGg9bmV3IGQoZysyPj4+MSwhMSksaC5fX2luaXRpYWxpemVEaWdpdHMoKSk7XG52YXIgcD1uZXcgZChrKzI+Pj4xLCExKTtwLl9faW5pdGlhbGl6ZURpZ2l0cygpO3ZhciBsPWQuX19jbHoxNihiLl9faGFsZkRpZ2l0KGstMSkpOzA8bCYmKGI9ZC5fX3NwZWNpYWxMZWZ0U2hpZnQoYixsLDApKTthPWQuX19zcGVjaWFsTGVmdFNoaWZ0KGEsbCwxKTtmb3IodmFyIHY9Yi5fX2hhbGZEaWdpdChrLTEpLEI9MDswPD1nO2ctLSl7dmFyIG49NjU1MzUsQT1hLl9faGFsZkRpZ2l0KGcrayk7aWYoQSE9PXYpe0E9KEE8PDE2fGEuX19oYWxmRGlnaXQoZytrLTEpKT4+PjA7bj0wfEEvdjtBPTB8QSV2O2Zvcih2YXIgRD1iLl9faGFsZkRpZ2l0KGstMiksdT1hLl9faGFsZkRpZ2l0KGcray0yKTtkLl9faW11bChuLEQpPj4+MD4oQTw8MTZ8dSk+Pj4wJiYobi0tLEErPXYsISg2NTUzNTxBKSk7KTt9ZC5fX2ludGVybmFsTXVsdGlwbHlBZGQoYixuLDAsZixwKTtBPWEuX19pbnBsYWNlU3ViKHAsZyxrKzEpOzAhPT1BJiYoQT1hLl9faW5wbGFjZUFkZChiLGcsayksYS5fX3NldEhhbGZEaWdpdChnK1xuayxhLl9faGFsZkRpZ2l0KGcraykrQSksbi0tKTtjJiYoMSZnP0I9bjw8MTY6aC5fX3NldERpZ2l0KGc+Pj4xLEJ8bikpfXJldHVybiBlPyhhLl9faW5wbGFjZVJpZ2h0U2hpZnQobCksYz97cXVvdGllbnQ6aCxyZW1haW5kZXI6YX06YSk6Yz9oOnZvaWQgMH19LHtrZXk6XCJfX2NsejE2XCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGQuX19jbHozMihhKS0xNn19LHtrZXk6XCJfX3NwZWNpYWxMZWZ0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGU9YS5sZW5ndGgsaz1uZXcgZChlK2MsITEpO2lmKDA9PT1iKXtmb3IoYj0wO2I8ZTtiKyspay5fX3NldERpZ2l0KGIsYS5fX2RpZ2l0KGIpKTtyZXR1cm4gMDxjJiZrLl9fc2V0RGlnaXQoZSwwKSxrfWZvcih2YXIgZixnPTAsaD0wO2g8ZTtoKyspZj1hLl9fZGlnaXQoaCksay5fX3NldERpZ2l0KGgsZjw8YnxnKSxnPWY+Pj4zMi1iO3JldHVybiAwPGMmJmsuX19zZXREaWdpdChlLGcpLGt9fSx7a2V5OlwiX19sZWZ0U2hpZnRCeUFic29sdXRlXCIsXG52YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWQuX190b1NoaWZ0QW1vdW50KGIpO2lmKDA+Yyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO2I9Yz4+PjU7dmFyIGU9MzEmYyxrPWEubGVuZ3RoLGY9MCE9PWUmJjAhPWEuX19kaWdpdChrLTEpPj4+MzItZSxnPWsrYisoZj8xOjApO2M9bmV3IGQoZyxhLnNpZ24pO2lmKDA9PT1lKXtmb3IoZT0wO2U8YjtlKyspYy5fX3NldERpZ2l0KGUsMCk7Zm9yKDtlPGc7ZSsrKWMuX19zZXREaWdpdChlLGEuX19kaWdpdChlLWIpKX1lbHNle2Zvcih2YXIgaD1nPTA7aDxiO2grKyljLl9fc2V0RGlnaXQoaCwwKTtmb3IodmFyIHA9MDtwPGs7cCsrKWg9YS5fX2RpZ2l0KHApLGMuX19zZXREaWdpdChwK2IsaDw8ZXxnKSxnPWg+Pj4zMi1lO2lmKGYpYy5fX3NldERpZ2l0KGsrYixnKTtlbHNlIGlmKDAhPT1nKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO31yZXR1cm4gYy5fX3RyaW0oKX19LHtrZXk6XCJfX3JpZ2h0U2hpZnRCeUFic29sdXRlXCIsXG52YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGU9YS5zaWduLGs9ZC5fX3RvU2hpZnRBbW91bnQoYik7aWYoMD5rKXJldHVybiBkLl9fcmlnaHRTaGlmdEJ5TWF4aW11bShlKTtiPWs+Pj41O3ZhciBmPTMxJmssZz1jLWI7aWYoMD49ZylyZXR1cm4gZC5fX3JpZ2h0U2hpZnRCeU1heGltdW0oZSk7az0hMTtpZihlKWlmKDAhPShhLl9fZGlnaXQoYikmKDE8PGYpLTEpKWs9ITA7ZWxzZSBmb3IodmFyIGg9MDtoPGI7aCsrKWlmKDAhPT1hLl9fZGlnaXQoaCkpe2s9ITA7YnJlYWt9ayYmMD09PWYmJjA9PX5hLl9fZGlnaXQoYy0xKSYmZysrO2U9bmV3IGQoZyxlKTtpZigwPT09Zilmb3IoZj1iO2Y8YztmKyspZS5fX3NldERpZ2l0KGYtYixhLl9fZGlnaXQoZikpO2Vsc2V7Zz1hLl9fZGlnaXQoYik+Pj5mO2g9Yy1iLTE7Zm9yKHZhciBwPTA7cDxoO3ArKyljPWEuX19kaWdpdChwK2IrMSksZS5fX3NldERpZ2l0KHAsYzw8MzItZnxnKSxnPWM+Pj5mO2UuX19zZXREaWdpdChoLGcpfXJldHVybiBrJiZcbihlPWQuX19hYnNvbHV0ZUFkZE9uZShlLCEwLGUpKSxlLl9fdHJpbSgpfX0se2tleTpcIl9fcmlnaHRTaGlmdEJ5TWF4aW11bVwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhP2QuX19vbmVEaWdpdCgxLCEwKTpkLl9femVybygpfX0se2tleTpcIl9fdG9TaGlmdEFtb3VudFwiLHZhbHVlOmZ1bmN0aW9uKGEpe2lmKDE8YS5sZW5ndGgpcmV0dXJuLTE7YT1hLl9fdW5zaWduZWREaWdpdCgwKTtyZXR1cm4gYT5kLl9fa01heExlbmd0aEJpdHM/LTE6YX19LHtrZXk6XCJfX3RvUHJpbWl0aXZlXCIsdmFsdWU6ZnVuY3Rpb24oYil7dmFyIGM9MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOlwiZGVmYXVsdFwiO2lmKFwib2JqZWN0XCIhPT1hKGIpfHxiLmNvbnN0cnVjdG9yPT09ZClyZXR1cm4gYjt2YXIgZT1iW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYoZSl7Yz1lKGMpO2lmKFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufWlmKGM9Yi52YWx1ZU9mKWlmKGM9Yy5jYWxsKGIpLFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO2lmKGM9Yi50b1N0cmluZylpZihjPWMuY2FsbChiKSxcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYzt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTt9fSx7a2V5OlwiX190b051bWVyaWNcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gZC5fX2lzQmlnSW50KGEpP2E6K2F9fSx7a2V5OlwiX19pc0JpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGIpe3JldHVyblwib2JqZWN0XCI9PT1hKGIpJiZiLmNvbnN0cnVjdG9yPT09ZH19LHtrZXk6XCJfX3RydW5jYXRlVG9OQml0c1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YSszMT4+PjUsZT1uZXcgZChjLGIuc2lnbik7LS1jO2Zvcih2YXIgaz0wO2s8YztrKyspZS5fX3NldERpZ2l0KGssYi5fX2RpZ2l0KGspKTtiPWIuX19kaWdpdChjKTswIT0oMzEmYSkmJihhPTMyLSgzMSZhKSxiPWI8PGE+Pj5cbmEpO3JldHVybiBlLl9fc2V0RGlnaXQoYyxiKSxlLl9fdHJpbSgpfX0se2tleTpcIl9fdHJ1bmNhdGVBbmRTdWJGcm9tUG93ZXJPZlR3b1wiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT1NYXRoLm1pbixrPWErMzE+Pj41O2M9bmV3IGQoayxjKTt2YXIgZj0wOy0tazt2YXIgZz0wO2ZvcihlPWUoayxiLmxlbmd0aCk7ZjxlO2YrKyl7dmFyIGg9Yi5fX2RpZ2l0KGYpLHA9LSg2NTUzNSZoKS1nO2c9MSZwPj4+MTY7aD0tKGg+Pj4xNiktZztnPTEmaD4+PjE2O2MuX19zZXREaWdpdChmLDY1NTM1JnB8aDw8MTYpfWZvcig7ZjxrO2YrKyljLl9fc2V0RGlnaXQoZiwwfC1nKTtiPWs8Yi5sZW5ndGg/Yi5fX2RpZ2l0KGspOjA7YSY9MzE7MD09PWE/KGc9LSg2NTUzNSZiKS1nLGc9NjU1MzUmZ3wtKGI+Pj4xNiktKDEmZz4+PjE2KTw8MTYpOihhPTMyLWEsYj1iPDxhPj4+YSxhPTE8PDMyLWEsZz0oNjU1MzUmYSktKDY1NTM1JmIpLWcsZz0oNjU1MzUmZ3woYT4+PjE2KS0oYj4+PjE2KS0oMSZnPj4+XG4xNik8PDE2KSZhLTEpO3JldHVybiBjLl9fc2V0RGlnaXQoayxnKSxjLl9fdHJpbSgpfX0se2tleTpcIl9fZGlnaXRQb3dcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD0xOzA8YjspMSZiJiYoZCo9YSksYj4+Pj0xLGEqPWE7cmV0dXJuIGR9fV0pLGR9KG4oQXJyYXkpKTtyZXR1cm4gQi5fX2tNYXhMZW5ndGg9MzM1NTQ0MzIsQi5fX2tNYXhMZW5ndGhCaXRzPUIuX19rTWF4TGVuZ3RoPDw1LEIuX19rTWF4Qml0c1BlckNoYXI9WzAsMCwzMiw1MSw2NCw3NSw4Myw5MCw5NiwxMDIsMTA3LDExMSwxMTUsMTE5LDEyMiwxMjYsMTI4LDEzMSwxMzQsMTM2LDEzOSwxNDEsMTQzLDE0NSwxNDcsMTQ5LDE1MSwxNTMsMTU0LDE1NiwxNTgsMTU5LDE2MCwxNjIsMTYzLDE2NSwxNjZdLEIuX19rQml0c1BlckNoYXJUYWJsZVNoaWZ0PTUsQi5fX2tCaXRzUGVyQ2hhclRhYmxlTXVsdGlwbGllcj0xPDxCLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdCxCLl9fa0NvbnZlcnNpb25DaGFycz1cIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiLnNwbGl0KFwiXCIpLFxuQi5fX2tCaXRDb252ZXJzaW9uQnVmZmVyPW5ldyBBcnJheUJ1ZmZlcig4KSxCLl9fa0JpdENvbnZlcnNpb25Eb3VibGU9bmV3IEZsb2F0NjRBcnJheShCLl9fa0JpdENvbnZlcnNpb25CdWZmZXIpLEIuX19rQml0Q29udmVyc2lvbkludHM9bmV3IEludDMyQXJyYXkoQi5fX2tCaXRDb252ZXJzaW9uQnVmZmVyKSxCLl9fY2x6MzI9dnx8ZnVuY3Rpb24oYSl7dmFyIGI9TWF0aC5MTjIsZD1NYXRoLmxvZztyZXR1cm4gMD09PWE/MzI6MHwzMS0oMHxkKGE+Pj4wKS9iKX0sQi5fX2ltdWw9dHx8ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMHxhKmJ9LEJ9KX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhLGIpeyhmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoYSl7ZGVsZXRlIHRbYV19ZnVuY3Rpb24gZihhKXtpZih2KXNldFRpbWVvdXQoZiwwLGEpO2Vsc2V7dmFyIGI9dFthXTtpZihiKXt2PSEwO3RyeXt2YXIgZD1iLmNhbGxiYWNrLGs9Yi5hcmdzO3N3aXRjaChrLmxlbmd0aCl7Y2FzZSAwOmQoKTtcbmJyZWFrO2Nhc2UgMTpkKGtbMF0pO2JyZWFrO2Nhc2UgMjpkKGtbMF0sa1sxXSk7YnJlYWs7Y2FzZSAzOmQoa1swXSxrWzFdLGtbMl0pO2JyZWFrO2RlZmF1bHQ6ZC5hcHBseShjLGspfX1maW5hbGx5e2UoYSksdj0hMX19fX1mdW5jdGlvbiBkKCl7RD1mdW5jdGlvbihhKXtiLm5leHRUaWNrKGZ1bmN0aW9uKCl7ZihhKX0pfX1mdW5jdGlvbiBnKCl7aWYoYS5wb3N0TWVzc2FnZSYmIWEuaW1wb3J0U2NyaXB0cyl7dmFyIGI9ITAsZD1hLm9ubWVzc2FnZTthLm9ubWVzc2FnZT1mdW5jdGlvbigpe2I9ITF9O2EucG9zdE1lc3NhZ2UoXCJcIixcIipcIik7YS5vbm1lc3NhZ2U9ZDtyZXR1cm4gYn19ZnVuY3Rpb24gbigpe3ZhciBiPVwic2V0SW1tZWRpYXRlJFwiK01hdGgucmFuZG9tKCkrXCIkXCIsZD1mdW5jdGlvbihkKXtkLnNvdXJjZT09PWEmJlwic3RyaW5nXCI9PT10eXBlb2YgZC5kYXRhJiYwPT09ZC5kYXRhLmluZGV4T2YoYikmJmYoK2QuZGF0YS5zbGljZShiLmxlbmd0aCkpfTthLmFkZEV2ZW50TGlzdGVuZXI/XG5hLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsZCwhMSk6YS5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLGQpO0Q9ZnVuY3Rpb24oZCl7YS5wb3N0TWVzc2FnZShiK2QsXCIqXCIpfX1mdW5jdGlvbiBrKCl7dmFyIGE9bmV3IE1lc3NhZ2VDaGFubmVsO2EucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKGEpe2YoYS5kYXRhKX07RD1mdW5jdGlvbihiKXthLnBvcnQyLnBvc3RNZXNzYWdlKGIpfX1mdW5jdGlvbiBwKCl7dmFyIGE9Qi5kb2N1bWVudEVsZW1lbnQ7RD1mdW5jdGlvbihiKXt2YXIgZD1CLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtmKGIpO2Qub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7YS5yZW1vdmVDaGlsZChkKTtkPW51bGx9O2EuYXBwZW5kQ2hpbGQoZCl9fWZ1bmN0aW9uIHUoKXtEPWZ1bmN0aW9uKGEpe3NldFRpbWVvdXQoZiwwLGEpfX1pZighYS5zZXRJbW1lZGlhdGUpe3ZhciBBPTEsdD17fSx2PSExLEI9YS5kb2N1bWVudCxcbkQsRT1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtFPUUmJkUuc2V0VGltZW91dD9FOmE7XCJbb2JqZWN0IHByb2Nlc3NdXCI9PT17fS50b1N0cmluZy5jYWxsKGEucHJvY2Vzcyk/ZCgpOmcoKT9uKCk6YS5NZXNzYWdlQ2hhbm5lbD9rKCk6QiYmXCJvbnJlYWR5c3RhdGVjaGFuZ2VcImluIEIuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKT9wKCk6dSgpO0Uuc2V0SW1tZWRpYXRlPWZ1bmN0aW9uKGEpe1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBhJiYoYT1uZXcgRnVuY3Rpb24oXCJcIithKSk7Zm9yKHZhciBiPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWJbZF09YXJndW1lbnRzW2QrMV07dFtBXT17Y2FsbGJhY2s6YSxhcmdzOmJ9O0QoQSk7cmV0dXJuIEErK307RS5jbGVhckltbWVkaWF0ZT1lfX0pKFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygc2VsZj9cInVuZGVmaW5lZFwiPT09dHlwZW9mIGE/dGhpczphOnNlbGYpfSkuY2FsbCh0aGlzLFxuYSgwKSxhKDgpKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKCl7dGhyb3cgRXJyb3IoXCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpO31mdW5jdGlvbiBjKCl7dGhyb3cgRXJyb3IoXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIik7fWZ1bmN0aW9uIGIoYil7aWYoZz09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoYiwwKTtpZigoZz09PWF8fCFnKSYmc2V0VGltZW91dClyZXR1cm4gZz1zZXRUaW1lb3V0LHNldFRpbWVvdXQoYiwwKTt0cnl7cmV0dXJuIGcoYiwwKX1jYXRjaCh2KXt0cnl7cmV0dXJuIGcuY2FsbChudWxsLGIsMCl9Y2F0Y2goQil7cmV0dXJuIGcuY2FsbCh0aGlzLGIsMCl9fX1mdW5jdGlvbiBlKGEpe2lmKG49PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigobj09PWN8fCFuKSYmY2xlYXJUaW1lb3V0KXJldHVybiBuPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBuKGEpfWNhdGNoKHYpe3RyeXtyZXR1cm4gbi5jYWxsKG51bGwsXG5hKX1jYXRjaChCKXtyZXR1cm4gbi5jYWxsKHRoaXMsYSl9fX1mdW5jdGlvbiBmKCl7cCYmdSYmKHA9ITEsdS5sZW5ndGg/az11LmNvbmNhdChrKTpBPS0xLGsubGVuZ3RoJiZsKCkpfWZ1bmN0aW9uIGwoKXtpZighcCl7dmFyIGE9YihmKTtwPSEwO2Zvcih2YXIgZD1rLmxlbmd0aDtkOyl7dT1rO2ZvcihrPVtdOysrQTxkOyl1JiZ1W0FdLnJ1bigpO0E9LTE7ZD1rLmxlbmd0aH11PW51bGw7cD0hMTtlKGEpfX1mdW5jdGlvbiBoKGEsYil7dGhpcy5mdW49YTt0aGlzLmFycmF5PWJ9ZnVuY3Rpb24gZCgpe31tPW0uZXhwb3J0cz17fTt0cnl7dmFyIGc9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDphfWNhdGNoKHQpe2c9YX10cnl7dmFyIG49XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6Y31jYXRjaCh0KXtuPWN9dmFyIGs9W10scD0hMSx1LEE9LTE7bS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgZD1BcnJheShhcmd1bWVudHMubGVuZ3RoLVxuMSk7aWYoMTxhcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspZFtjLTFdPWFyZ3VtZW50c1tjXTtrLnB1c2gobmV3IGgoYSxkKSk7MSE9PWsubGVuZ3RofHxwfHxiKGwpfTtoLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTttLnRpdGxlPVwiYnJvd3NlclwiO20uYnJvd3Nlcj0hMDttLmVudj17fTttLmFyZ3Y9W107bS52ZXJzaW9uPVwiXCI7bS52ZXJzaW9ucz17fTttLm9uPWQ7bS5hZGRMaXN0ZW5lcj1kO20ub25jZT1kO20ub2ZmPWQ7bS5yZW1vdmVMaXN0ZW5lcj1kO20ucmVtb3ZlQWxsTGlzdGVuZXJzPWQ7bS5lbWl0PWQ7bS5wcmVwZW5kTGlzdGVuZXI9ZDttLnByZXBlbmRPbmNlTGlzdGVuZXI9ZDttLmxpc3RlbmVycz1mdW5jdGlvbihhKXtyZXR1cm5bXX07bS5iaW5kaW5nPWZ1bmN0aW9uKGEpe3Rocm93IEVycm9yKFwicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcIik7fTttLmN3ZD1cbmZ1bmN0aW9uKCl7cmV0dXJuXCIvXCJ9O20uY2hkaXI9ZnVuY3Rpb24oYSl7dGhyb3cgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIik7fTttLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbihtLHEpe1NrLmFzc2VydHM9e307U2suYXNzZXJ0cy5hc3NlcnQ9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYX07U2suZXhwb3J0U3ltYm9sKFwiU2suYXNzZXJ0cy5hc3NlcnRcIixTay5hc3NlcnRzLmFzc2VydCk7U2suYXNzZXJ0cy5mYWlsPWZ1bmN0aW9uKGEpe307U2suZXhwb3J0U3ltYm9sKFwiU2suYXNzZXJ0cy5mYWlsXCIsU2suYXNzZXJ0cy5mYWlsKX0sZnVuY3Rpb24obSxxKXtTay5ib29sX2NoZWNrPWZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwPT09YXx8bnVsbD09PWF8fFwiYm9vbGVhblwiIT09dHlwZW9mIGEpdGhyb3cgRXJyb3IoXCJtdXN0IHNwZWNpZnkgXCIrYytcIiBhbmQgaXQgbXVzdCBiZSBhIGJvb2xlYW5cIik7fTtTay5weXRob24yPXtwcmludF9mdW5jdGlvbjohMSxcbmRpdmlzaW9uOiExLGFic29sdXRlX2ltcG9ydDpudWxsLHVuaWNvZGVfbGl0ZXJhbHM6ITEscHl0aG9uMzohMSxjbGFzc19yZXByOiExLGluaGVyaXRfZnJvbV9vYmplY3Q6ITEsc3VwZXJfYXJnczohMSxvY3RhbF9udW1iZXJfbGl0ZXJhbDohMSxiYW5rZXJzX3JvdW5kaW5nOiExLHB5dGhvbl92ZXJzaW9uOiExLGR1bmRlcl9yb3VuZDohMSxleGNlcHRpb25zOiExLG5vX2xvbmdfdHlwZTohMSxjZWlsX2Zsb29yX2ludDohMSxzaWxlbnRfb2N0YWxfbGl0ZXJhbDohMH07U2sucHl0aG9uMz17cHJpbnRfZnVuY3Rpb246ITAsZGl2aXNpb246ITAsYWJzb2x1dGVfaW1wb3J0Om51bGwsdW5pY29kZV9saXRlcmFsczohMCxweXRob24zOiEwLGNsYXNzX3JlcHI6ITAsaW5oZXJpdF9mcm9tX29iamVjdDohMCxzdXBlcl9hcmdzOiEwLG9jdGFsX251bWJlcl9saXRlcmFsOiEwLGJhbmtlcnNfcm91bmRpbmc6ITAscHl0aG9uX3ZlcnNpb246ITAsZHVuZGVyX3JvdW5kOiEwLGV4Y2VwdGlvbnM6ITAsXG5ub19sb25nX3R5cGU6ITAsY2VpbF9mbG9vcl9pbnQ6ITAsc2lsZW50X29jdGFsX2xpdGVyYWw6ITF9O1NrLmNvbmZpZ3VyZT1mdW5jdGlvbihhKXtTay5vdXRwdXQ9YS5vdXRwdXR8fFNrLm91dHB1dDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sub3V0cHV0KTtTay5maWxld3JpdGVyPWEuZmlsZXdyaXRlcnx8U2suZmlsZXdyaXRlcjtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlcik7U2suZGVidWdvdXQ9YS5kZWJ1Z291dHx8U2suZGVidWdvdXQ7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmRlYnVnb3V0KTtTay51bmNhdWdodEV4Y2VwdGlvbj1hLnVuY2F1Z2h0RXhjZXB0aW9ufHxTay51bmNhdWdodEV4Y2VwdGlvbjtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sudW5jYXVnaHRFeGNlcHRpb24pO1NrLnJlYWQ9YS5yZWFkfHxTay5yZWFkO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PVxudHlwZW9mIFNrLnJlYWQpO1NrLm5vbnJlYWRvcGVuPWEubm9ucmVhZG9wZW58fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLm5vbnJlYWRvcGVuKTtTay5maWxlb3Blbj1hLmZpbGVvcGVufHx2b2lkIDA7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmZpbGVvcGVufHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIFNrLmZpbGVvcGVuKTtTay5maWxld3JpdGU9YS5maWxld3JpdGV8fHZvaWQgMDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlfHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIFNrLmZpbGV3cml0ZSk7U2sudGltZW91dE1zZz1hLnRpbWVvdXRNc2d8fFNrLnRpbWVvdXRNc2c7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLnRpbWVvdXRNc2cpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRpbWVvdXRNc2dcIixTay50aW1lb3V0TXNnKTtTay5zeXNhcmd2PWEuc3lzYXJndnx8XG5Tay5zeXNhcmd2O1NrLmFzc2VydHMuYXNzZXJ0KFNrLmlzQXJyYXlMaWtlKFNrLnN5c2FyZ3YpKTtTay5fX2Z1dHVyZV9fPWEuX19mdXR1cmVfX3x8U2sucHl0aG9uMztTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb24sXCJTay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5kaXZpc2lvbixcIlNrLl9fZnV0dXJlX18uZGl2aXNpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnVuaWNvZGVfbGl0ZXJhbHMsXCJTay5fX2Z1dHVyZV9fLnVuaWNvZGVfbGl0ZXJhbHNcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmNsYXNzX3JlcHIsXCJTay5fX2Z1dHVyZV9fLmNsYXNzX3JlcHJcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmluaGVyaXRfZnJvbV9vYmplY3QsXCJTay5fX2Z1dHVyZV9fLmluaGVyaXRfZnJvbV9vYmplY3RcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnN1cGVyX2FyZ3MsXG5cIlNrLl9fZnV0dXJlX18uc3VwZXJfYXJnc1wiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18ub2N0YWxfbnVtYmVyX2xpdGVyYWwsXCJTay5fX2Z1dHVyZV9fLm9jdGFsX251bWJlcl9saXRlcmFsXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nLFwiU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5weXRob25fdmVyc2lvbixcIlNrLl9fZnV0dXJlX18ucHl0aG9uX3ZlcnNpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmR1bmRlcl9yb3VuZCxcIlNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5leGNlcHRpb25zLFwiU2suX19mdXR1cmVfXy5leGNlcHRpb25zXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5ub19sb25nX3R5cGUsXCJTay5fX2Z1dHVyZV9fLm5vX2xvbmdfdHlwZVwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnQsXG5cIlNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnRcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsLFwiU2suX19mdXR1cmVfXy5zaWxlbnRfb2N0YWxfbGl0ZXJhbFwiKTtTay5pbWFnZVByb3h5PWEuaW1hZ2VQcm94eXx8XCJodHRwOi8vbG9jYWxob3N0OjgwODAvMzIweFwiO1NrLmFzc2VydHMuYXNzZXJ0KFwic3RyaW5nXCI9PT10eXBlb2YgU2suaW1hZ2VQcm94eXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmltYWdlUHJveHkpO1NrLmlucHV0ZnVuPWEuaW5wdXRmdW58fFNrLmlucHV0ZnVuO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5pbnB1dGZ1bik7U2suaW5wdXRmdW5UYWtlc1Byb21wdD1hLmlucHV0ZnVuVGFrZXNQcm9tcHR8fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLmlucHV0ZnVuVGFrZXNQcm9tcHQpO1NrLnJldGFpbkdsb2JhbHM9YS5yZXRhaW5nbG9iYWxzfHxhLnJldGFpbkdsb2JhbHN8fFxuITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2sucmV0YWluR2xvYmFscyk7U2suZGVidWdnaW5nPWEuZGVidWdnaW5nfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5kZWJ1Z2dpbmcpO1NrLmtpbGxhYmxlV2hpbGU9YS5raWxsYWJsZVdoaWxlfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5raWxsYWJsZVdoaWxlKTtTay5raWxsYWJsZUZvcj1hLmtpbGxhYmxlRm9yfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5raWxsYWJsZUZvcik7U2suc2lnbmFscz1hLnNpZ25hbHM7U2suc2lnbmFscz0hMD09PVNrLnNpZ25hbHM/e2xpc3RlbmVyczpbXSxhZGRFdmVudExpc3RlbmVyKGEpe1NrLnNpZ25hbHMubGlzdGVuZXJzLnB1c2goYSl9LHJlbW92ZUV2ZW50TGlzdGVuZXIoYSl7YT1Tay5zaWduYWxzLmxpc3RlbmVycy5pbmRleE9mKGEpOzA8PWEmJlNrLnNpZ25hbHMubGlzdGVuZXJzLnNwbGljZShhLFxuMSl9LHNpZ25hbChhLGIpe2Zvcih2YXIgYz0wO2M8U2suc2lnbmFscy5saXN0ZW5lcnMubGVuZ3RoO2MrKylTay5zaWduYWxzLmxpc3RlbmVyc1tjXS5jYWxsKG51bGwsYSxiKX19Om51bGw7U2suYXNzZXJ0cy5hc3NlcnQoXCJvYmplY3RcIj09PXR5cGVvZiBTay5zaWduYWxzKTtTay5icmVha3BvaW50cz1hLmJyZWFrcG9pbnRzfHxmdW5jdGlvbigpe3JldHVybiEwfTtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suYnJlYWtwb2ludHMpO1NrLnNldFRpbWVvdXQ9YS5zZXRUaW1lb3V0O3ZvaWQgMD09PVNrLnNldFRpbWVvdXQmJihTay5zZXRUaW1lb3V0PVwiZnVuY3Rpb25cIj09PXR5cGVvZiBzZXRUaW1lb3V0P2Z1bmN0aW9uKGEsYil7c2V0VGltZW91dChhLGIpfTpmdW5jdGlvbihhLGIpe2EoKX0pO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5zZXRUaW1lb3V0KTtcImV4ZWNMaW1pdFwiaW4gYSYmKFNrLmV4ZWNMaW1pdD1hLmV4ZWNMaW1pdCk7XG5cInlpZWxkTGltaXRcImluIGEmJihTay55aWVsZExpbWl0PWEueWllbGRMaW1pdCk7YS5zeXNwYXRoJiYoU2suc3lzcGF0aD1hLnN5c3BhdGgsU2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoU2suc3lzcGF0aCkpLFNrLnJlYWxzeXNwYXRoPXZvaWQgMCxTay5zeXNtb2R1bGVzPW5ldyBTay5idWlsdGluLmRpY3QoW10pKTtTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExO1NrLnN3aXRjaF92ZXJzaW9uKFNrLl9fZnV0dXJlX18ucHl0aG9uMyk7U2suYnVpbHRpbi5zdHIuJG5leHQ9U2suX19mdXR1cmVfXy5weXRob24zP25ldyBTay5idWlsdGluLnN0cihcIl9fbmV4dF9fXCIpOm5ldyBTay5idWlsdGluLnN0cihcIm5leHRcIik7U2suc2V0dXBPcGVyYXRvcnMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay5zZXR1cER1bmRlck1ldGhvZHMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay5zZXR1cE9iamVjdHMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay50b2tlbi5zZXR1cFRva2VucyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpfTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmNvbmZpZ3VyZVwiLFNrLmNvbmZpZ3VyZSk7U2sudW5jYXVnaHRFeGNlcHRpb249ZnVuY3Rpb24oYSl7dGhyb3cgYTt9O1NrLnVuY2F1Z2h0RXhjZXB0aW9uPWZ1bmN0aW9uKGEpe3Rocm93IGE7fTtTay5leHBvcnRTeW1ib2woXCJTay51bmNhdWdodEV4Y2VwdGlvblwiLFNrLnVuY2F1Z2h0RXhjZXB0aW9uKTtTay50aW1lb3V0TXNnPWZ1bmN0aW9uKCl7cmV0dXJuXCJQcm9ncmFtIGV4Y2VlZGVkIHJ1biB0aW1lIGxpbWl0LlwifTtTay5leHBvcnRTeW1ib2woXCJTay50aW1lb3V0TXNnXCIsU2sudGltZW91dE1zZyk7U2suZXhlY0xpbWl0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtTay55aWVsZExpbWl0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtTay5vdXRwdXQ9ZnVuY3Rpb24oYSl7fTtTay5yZWFkPWZ1bmN0aW9uKGEpe2lmKHZvaWQgMD09PVNrLmJ1aWx0aW5GaWxlcyl0aHJvd1wic2t1bHB0LXN0ZGxpYi5qcyBoYXMgbm90IGJlZW4gbG9hZGVkXCI7aWYodm9pZCAwPT09XG5Tay5idWlsdGluRmlsZXMuZmlsZXNbYV0pdGhyb3dcIkZpbGUgbm90IGZvdW5kOiAnXCIrYStcIidcIjtyZXR1cm4gU2suYnVpbHRpbkZpbGVzLmZpbGVzW2FdfTtTay5zeXNhcmd2PVtdO1NrLmdldFN5c0FyZ3Y9ZnVuY3Rpb24oKXtyZXR1cm4gU2suc3lzYXJndn07U2suZXhwb3J0U3ltYm9sKFwiU2suZ2V0U3lzQXJndlwiLFNrLmdldFN5c0FyZ3YpO1NrLnN5c3BhdGg9W107U2suaW5Ccm93c2VyPXZvaWQgMCE9PVNrLmdsb2JhbC5kb2N1bWVudDtTay5kZWJ1Z291dD1mdW5jdGlvbihhKXt9OyhmdW5jdGlvbigpe3ZvaWQgMCE9PVNrLmdsb2JhbC53cml0ZT8oU2sub3V0cHV0PVNrLmdsb2JhbC53cml0ZSxTay5maWxld3JpdGVyPVNrLmdsb2JhbC53cml0ZSk6dm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUmJnZvaWQgMCE9PVNrLmdsb2JhbC5jb25zb2xlLmxvZz8oU2sub3V0cHV0PWZ1bmN0aW9uKGEpe1NrLmdsb2JhbC5jb25zb2xlLmxvZyhhKX0sU2suZmlsZXdyaXRlcj1Tay5vdXRwdXQpOlxudm9pZCAwIT09U2suZ2xvYmFsLnByaW50JiYoU2sub3V0cHV0PVNrLmdsb2JhbC5wcmludCxTay5maWxld3JpdGVyPVNrLm91dHB1dCk7dm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUmJnZvaWQgMCE9PVNrLmdsb2JhbC5jb25zb2xlLmxvZz9Tay5kZWJ1Z291dD1mdW5jdGlvbihhKXtTay5nbG9iYWwuY29uc29sZS5sb2coYSl9OnZvaWQgMCE9PVNrLmdsb2JhbC5wcmludCYmKFNrLmRlYnVnb3V0PVNrLmdsb2JhbC5wcmludCl9KSgpO1NrLmlucHV0ZnVuPWZ1bmN0aW9uKGEpe3JldHVybiB3aW5kb3cucHJvbXB0KGEpfTtTay5zZXR1cF9tZXRob2RfbWFwcGluZ3M9ZnVuY3Rpb24oKXt9O1NrLnNldHVwRGljdEl0ZXJhdG9ycz1mdW5jdGlvbihhKXt9O1NrLnN3aXRjaF92ZXJzaW9uPWZ1bmN0aW9uKGEpe2NvbnN0IGM9e2Zsb2F0Xzp7bWV0aG9kX25hbWVzOltcIl9fcm91bmRfX1wiXSwyOlshMV0sMzpbITBdfSxpbnRfOnttZXRob2RfbmFtZXM6W1wiX19yb3VuZF9fXCJdLDI6WyExXSwzOlshMF19LFxubGlzdDp7bWV0aG9kX25hbWVzOltcImNsZWFyXCIsXCJjb3B5XCIsXCJzb3J0XCJdLDI6WyExLCExLCEwXSwzOlshMCwhMCwhMF19LGRpY3Q6e21ldGhvZF9uYW1lczpbXCJoYXNfa2V5XCIsXCJrZXlzXCIsXCJpdGVtc1wiLFwidmFsdWVzXCJdLDI6WyEwLCEwLCEwLCEwXSwzOlshMSwhMCwhMCwhMF19fTtmb3IobGV0IGwgaW4gYyl7Y29uc3QgaD1Tay5idWlsdGluW2xdLGQ9Y1tsXS5tZXRob2RfbmFtZXM7dmFyIGI9Y1tsXVszXTtpZihhJiZ2b2lkIDA9PT1oLnB5MyRtZXRob2RzKWJyZWFrO2Vsc2UgaWYodm9pZCAwPT09aC5weTMkbWV0aG9kcyl7aC5weTMkbWV0aG9kcz17fTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9ZFtlXTtiW2VdJiYoaC5weTMkbWV0aG9kc1tmXT1oLnByb3RvdHlwZVtmXS5kJGRlZil9fWE/ZT1oLnB5MyRtZXRob2RzOihiPWNbbF1bMl0sZT1oLnB5MiRtZXRob2RzKTtmb3IoZj0wO2Y8ZC5sZW5ndGg7ZisrKXtjb25zdCBhPWRbZl07ZGVsZXRlIGgucHJvdG90eXBlW2FdO1xuYltmXSYmKGgucHJvdG90eXBlW2FdPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKGgsZVthXSkpfX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLl9fZnV0dXJlX19cIixTay5fX2Z1dHVyZV9fKTtTay5leHBvcnRTeW1ib2woXCJTay5pbnB1dGZ1blwiLFNrLmlucHV0ZnVuKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZVthLiRtYW5nbGVkXX1mdW5jdGlvbiBjKGEpe2E9YS4kbWFuZ2xlZDtjb25zdCBiPXRoaXMucHJvdG90eXBlLnRwJG1ybztmb3IobGV0IGQ9MDtkPGIubGVuZ3RoOysrZCl7Y29uc3QgYz1iW2RdLnByb3RvdHlwZTtpZihjLmhhc093blByb3BlcnR5KGEpKXJldHVybiBjW2FdfX1mdW5jdGlvbiBiKGIsZixoLGspe2NvbnN0IGQ9ZShoKSxnPWYucHJvdG90eXBlO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoYixmLGQsayk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZyx7c2skcHJvdG90eXBpY2FsOnt2YWx1ZTohMCx3cml0YWJsZTohMH0sXG50cCRiYXNlczp7dmFsdWU6aCx3cml0YWJsZTohMH0sdHAkbXJvOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxocCR0eXBlOnt2YWx1ZTohMCx3cml0YWJsZTohMH19KTtnLnRwJG1ybz1mLiRidWlsZE1STygpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGYseyR0eXBlTG9va3VwOnt2YWx1ZTpnLnNrJHByb3RvdHlwaWNhbD9hOmMsd3JpdGFibGU6ITB9LHNrJGtsYXNzOnt2YWx1ZTohMCx3cml0YWJsZTohMH19KX1mdW5jdGlvbiBlKGEpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuIHZvaWQgMD09PWEuc2ska2xhc3M/YTpiKGEucHJvdG90eXBlLnRwJGJhc2UpfTA9PT1hLmxlbmd0aCYmYS5wdXNoKFNrLmJ1aWx0aW4ub2JqZWN0KTtsZXQgZCxjLGUsZjtmb3IobGV0IGs9MDtrPGEubGVuZ3RoO2srKyl7Zj1hW2tdO2lmKCFTay5idWlsdGluLmNoZWNrQ2xhc3MoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFzZXMgbXVzdCBiZSAndHlwZScgb2JqZWN0c1wiKTtpZighMT09PVxuZi5zayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3MpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSAnXCIrZi5wcm90b3R5cGUudHAkbmFtZStcIicgaXMgbm90IGFuIGFjY2VwdGFibGUgYmFzZSB0eXBlXCIpO2U9YihmKTtpZih2b2lkIDA9PT1jKWM9ZSxkPWY7ZWxzZSBpZighYy4kaXNTdWJUeXBlKGUpKWlmKGUuJGlzU3ViVHlwZShjKSljPWUsZD1mO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibXVsdGlwbGUgYmFzZXMgaGF2ZSBpbnN0YW5jZSBsYXlvdXQgY29uZmxpY3RzXCIpO31yZXR1cm4gZH1mdW5jdGlvbiBmKGEpe2Zvcig7bnVsbCE9PWEucHJvdG90eXBlLnRwJGJhc2U7KXtpZih2b2lkIDA9PT1hLnNrJGtsYXNzJiZhLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcIl9fZGljdF9fXCIpKXJldHVybiBhPWEucHJvdG90eXBlLl9fZGljdF9fLFNrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3IoYSk/YTp2b2lkIDA7YT1hLnByb3RvdHlwZS50cCRiYXNlfX1cbmZ1bmN0aW9uIGwoYSxiLGMpe2lmKHZvaWQgMD09PWEuc2ska2xhc3MpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3Qgc2V0IFwiK2EucHJvdG90eXBlLnRwJG5hbWUrXCIuXCIrYy4kanNzdHIoKSk7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBkZWxldGUgXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIi5cIitjLiRqc3N0cigpKTt9dm9pZCAwPT09U2suYnVpbHRpbiYmKFNrLmJ1aWx0aW49e30pO1NrLmJ1aWx0aW4udHlwZT1mdW5jdGlvbihhKXt0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi50eXBlJiZTay5hc3NlcnRzLmZhaWwoXCJjYWxsaW5nIG5ldyBTay5idWlsdGluLnR5cGUgaXMgbm90IHNhZmVcIik7cmV0dXJuIGEub2IkdHlwZX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2suYnVpbHRpbi50eXBlLnByb3RvdHlwZSx7Y2FsbDp7dmFsdWU6RnVuY3Rpb24ucHJvdG90eXBlLmNhbGx9LGFwcGx5Ont2YWx1ZTpGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHl9LFxudHAkc2xvdHM6e3ZhbHVlOnt0cCRkb2M6XCJ0eXBlKG9iamVjdF9vcl9uYW1lLCBiYXNlcywgZGljdClcXG50eXBlKG9iamVjdCkgLT4gdGhlIG9iamVjdCdzIHR5cGVcXG50eXBlKG5hbWUsIGJhc2VzLCBkaWN0KSAtPiBhIG5ldyB0eXBlXCIsdHAkY2FsbDpmdW5jdGlvbihhLGIpe2lmKHRoaXM9PT1Tay5idWlsdGluLnR5cGUpe2lmKDE9PT1hLmxlbmd0aCYmKHZvaWQgMD09PWJ8fCFiLmxlbmd0aCkpcmV0dXJuIGFbMF0ub2IkdHlwZTtpZigzIT09YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIHRha2VzIDEgb3IgMyBhcmd1bWVudHNcIik7fWxldCBkPXRoaXMucHJvdG90eXBlLnRwJG5ldyhhLGIpO2lmKGQuJGlzU3VzcGVuc2lvbilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCxjPT57ZD1jO2lmKGQub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMpKXJldHVybiBkLnRwJGluaXQoYSxiKX0sKCk9PmQpO2lmKGQub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMpKXtjb25zdCBjPVxuZC50cCRpbml0KGEsYik7cmV0dXJuIHZvaWQgMCE9PWMmJmMuJGlzU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5jaGFpbihjLCgpPT5kKTpkfXJldHVybiBkfSx0cCRuZXc6ZnVuY3Rpb24oYSxjKXtpZigzIT09YS5sZW5ndGgpe2lmKDE9PT1hLmxlbmd0aCYmKHZvaWQgMD09PWN8fCFjLmxlbmd0aCkpcmV0dXJuIGFbMF0ub2IkdHlwZTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgdGFrZXMgMSBvciAzIGFyZ3VtZW50c1wiKTt9bGV0IGQ7Yz1hWzBdO2Q9YVsxXTthPWFbMl07aWYoXCJkaWN0XCIhPT1hLnRwJG5hbWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIGFyZ3VtZW50IDMgbXVzdCBiZSBkaWN0LCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR5cGUoKSBhcmd1bWVudCAxIG11c3QgYmUgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpO1xuYz1jLiRqc3N0cigpO2lmKFwidHVwbGVcIiE9PWQudHAkbmFtZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgYXJndW1lbnQgMiBtdXN0IGJlIHR1cGxlLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoZCkpO2Q9ZC5zayRhc2FycmF5KCk7Y29uc3QgZT1mdW5jdGlvbigpe3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdH07YihjLGUsZCx0aGlzLmNvbnN0cnVjdG9yKTtTay5nbG9iYWxzJiYoZS5wcm90b3R5cGUuX19tb2R1bGVfXz1Tay5nbG9iYWxzLl9fbmFtZV9fKTtlLnByb3RvdHlwZS5fX2RvY19fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDt2b2lkIDA9PT1lLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkaWN0KSYmKGUucHJvdG90eXBlLl9fZGljdF9fPW5ldyBTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yKGUsaCkpO2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57ZS5wcm90b3R5cGVbYS4kbWFuZ2xlZF09Yn0pO2UucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwiX19uZXdfX1wiKSYmXG4oYT1lLnByb3RvdHlwZS5fX25ld19fLGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZ1bmMmJihlLnByb3RvdHlwZS5fX25ld19fPW5ldyBTay5idWlsdGluLnN0YXRpY21ldGhvZChhKSkpO2UuJGFsbG9jYXRlU2xvdHMoKTtyZXR1cm4gZX0sdHAkZ2V0YXR0cjpmdW5jdGlvbihhLGIpe3ZhciBkPXRoaXMub2IkdHlwZTtjb25zdCBjPWQuJHR5cGVMb29rdXAoYSk7bGV0IGU7aWYodm9pZCAwIT09YyYmKGU9Yy50cCRkZXNjcl9nZXQsdm9pZCAwIT09ZSYmdm9pZCAwIT09Yy50cCRkZXNjcl9zZXQpKXJldHVybiBiPWUuY2FsbChjLHRoaXMsZCxiKTthPXRoaXMuJHR5cGVMb29rdXAoYSk7aWYodm9pZCAwIT09YSlyZXR1cm4gZD1hLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1kP2I9ZC5jYWxsKGEsbnVsbCx0aGlzLGIpOmE7aWYodm9pZCAwIT09ZSlyZXR1cm4gYj1lLmNhbGwoYyx0aGlzLGQsYik7aWYodm9pZCAwIT09YylyZXR1cm4gY30sdHAkc2V0YXR0cjpmdW5jdGlvbihhLGIsYyl7aWYoIXRoaXMuc2ska2xhc3Mpe2lmKHZvaWQgMCE9PVxuYil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBzZXQgYXR0cmlidXRlcyBvZiBidWlsdC1pbi9leHRlbnNpb24gdHlwZSAnXCIrdGhpcy5wcm90b3R5cGUudHAkbmFtZStcIidcIik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZXMgb24gdHlwZSBvYmplY3QgJ1wiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInXCIpO31jb25zdCBkPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1kKXtjb25zdCBhPWQudHAkZGVzY3Jfc2V0O2lmKGEpcmV0dXJuIGEuY2FsbChkLHRoaXMsYixjKX1jPWEuJG1hbmdsZWQ7aWYodm9pZCAwPT09YilpZihiPXRoaXMucHJvdG90eXBlLGIuaGFzT3duUHJvcGVydHkoYykpZGVsZXRlIGJbY10sYT1Tay5kdW5kZXJUb1NrdWxwdFtjXSx2b2lkIDAhPT1hJiYoZGVsZXRlIHRoaXMucHJvdG90eXBlW2FdLGIuc2skcHJvdG90eXBpY2FsfHx0aGlzLiRhbGxvY2F0ZUdldHRlclNsb3QoYykpO1xuZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcInR5cGUgb2JqZWN0ICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJyBoYXMgbm8gYXR0cmlidXRlICdcIithLiRqc3N0cigpK1wiJ1wiKTtlbHNlIHRoaXMucHJvdG90eXBlW2NdPWIsYyBpbiBTay5kdW5kZXJUb1NrdWxwdCYmdGhpcy4kYWxsb2NhdGVTbG90KGMsYil9LCRyOmZ1bmN0aW9uKCl7bGV0IGE9dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXyxiPVwiXCIsYz1cImNsYXNzXCI7YSYmU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKT9iPWEuditcIi5cIjphPW51bGw7YXx8dGhpcy5zayRrbGFzc3x8U2suX19mdXR1cmVfXy5jbGFzc19yZXByfHwoYz1cInR5cGVcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIitjK1wiICdcIitiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInPlwiKX19LHdyaXRhYmxlOiEwfSx0cCRtZXRob2RzOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSx0cCRnZXRzZXRzOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxcbnNrJHR5cGU6e3ZhbHVlOiEwfSwkaXNTdWJUeXBlOnt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcz09PWF8fHRoaXMucHJvdG90eXBlIGluc3RhbmNlb2YgYXx8IXRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbCYmdGhpcy5wcm90b3R5cGUudHAkbXJvLmluY2x1ZGVzKGEpfX0sJGFsbG9jYXRlU2xvdDp7dmFsdWU6ZnVuY3Rpb24oYSxiKXthPVNrLnNsb3RzW2FdO2NvbnN0IGM9YS4kc2xvdF9uYW1lLGQ9dGhpcy5wcm90b3R5cGU7ZC5oYXNPd25Qcm9wZXJ0eShjKSYmZGVsZXRlIGRbY107ZFtjXT1hLiRzbG90X2Z1bmMoYil9fSwkYWxsb2NhdGVTbG90czp7dmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMucHJvdG90eXBlO3RoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbD9PYmplY3Qua2V5cyhhKS5mb3JFYWNoKGI9PntiIGluIFNrLnNsb3RzJiZ0aGlzLiRhbGxvY2F0ZVNsb3QoYixhW2JdKX0pOk9iamVjdC5rZXlzKFNrLnNsb3RzKS5mb3JFYWNoKGI9PnthLmhhc093blByb3BlcnR5KGIpP1xudGhpcy4kYWxsb2NhdGVTbG90KGIsYVtiXSk6dGhpcy4kYWxsb2NhdGVHZXR0ZXJTbG90KGIpfSl9fSwkYWxsb2NhdGVHZXR0ZXJTbG90Ont2YWx1ZTpmdW5jdGlvbihhKXtjb25zdCBiPVNrLnNsb3RzW2FdLiRzbG90X25hbWUsYz10aGlzLnByb3RvdHlwZTtjLmhhc093blByb3BlcnR5KGIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxiLHtjb25maWd1cmFibGU6ITAsZ2V0KCl7Y29uc3QgYT1jLnRwJG1ybztmb3IobGV0IGM9MTtjPGEubGVuZ3RoO2MrKyl7Y29uc3QgZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFbY10ucHJvdG90eXBlLGIpO2lmKHZvaWQgMCE9PWQmJmQudmFsdWUpcmV0dXJuIGQudmFsdWV9fX0pfX0sJHR5cGVMb29rdXA6e3ZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZS5zayRwcm90b3R5cGljYWw/dGhpcy5wcm90b3R5cGVbYS4kbWFuZ2xlZF06Yy5jYWxsKHRoaXMsYSl9LHdyaXRhYmxlOiEwfSwkbXJvTWVyZ2U6e3ZhbHVlOmZ1bmN0aW9uKGEpe3RoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbD1cbiEwO2xldCBiO2NvbnN0IGM9W107Zm9yKDs7KXtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKXt2YXIgZD1hW2JdO2lmKDAhPT1kLmxlbmd0aClicmVha31pZihiPT09YS5sZW5ndGgpcmV0dXJuIGM7dmFyIGU9W107Zm9yKGI9MDtiPGEubGVuZ3RoOysrYilpZihkPWFbYl0sMCE9PWQubGVuZ3RoKXtjb25zdCBiPWRbMF07ZD0wO2E6Zm9yKDtkPGEubGVuZ3RoOysrZCl7Y29uc3QgYz1hW2RdO2ZvcihsZXQgYT0xO2E8Yy5sZW5ndGg7KythKWlmKGNbYV09PT1iKWJyZWFrIGF9ZD09PWEubGVuZ3RoJiZlLnB1c2goYil9aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkluY29uc2lzdGVudCBwcmVjZWRlbmNlcyBpbiB0eXBlIGhpZXJhcmNoeVwiKTtlPWVbMF07Yy5sZW5ndGgmJnRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGNbYy5sZW5ndGgtMV0ucHJvdG90eXBlKSE9PWUucHJvdG90eXBlJiYodGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsPVxuITEpO2MucHVzaChlKTtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWQ9YVtiXSwwPGQubGVuZ3RoJiZkWzBdPT09ZSYmZC5zcGxpY2UoMCwxKX19fSwkYnVpbGRNUk86e3ZhbHVlOmZ1bmN0aW9uKCl7Y29uc3QgYT1bW3RoaXNdXSxiPXRoaXMucHJvdG90eXBlLnRwJGJhc2VzO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7KytjKWEucHVzaChbLi4uYltjXS5wcm90b3R5cGUudHAkbXJvXSk7Yz1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoOysrYSljLnB1c2goYlthXSk7YS5wdXNoKGMpO3JldHVybiB0aGlzLiRtcm9NZXJnZShhKX19LHNrJGF0dHJFcnJvcjp7dmFsdWUoKXtyZXR1cm5cInR5cGUgb2JqZWN0ICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJ1wifSx3cml0YWJsZTohMH19KTtTay5idWlsdGluLnR5cGUucHJvdG90eXBlLnRwJGdldHNldHM9e19fYmFzZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvdG90eXBlLnRwJGJhc2V8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LF9fYmFzZXNfXzp7JGdldCgpe3ZvaWQgMD09PVxudGhpcy5zayR0dXBsZV9iYXNlcyYmKHRoaXMuc2skdHVwbGVfYmFzZXM9bmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy5wcm90b3R5cGUudHAkYmFzZXMpKTtyZXR1cm4gdGhpcy5zayR0dXBsZV9iYXNlc319LF9fbXJvX186eyRnZXQoKXt2b2lkIDA9PT10aGlzLnNrJHR1cGxlX21ybyYmKHRoaXMuc2skdHVwbGVfbXJvPW5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMucHJvdG90eXBlLnRwJG1ybykpO3JldHVybiB0aGlzLnNrJHR1cGxlX21yb319LF9fZGljdF9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLm1hcHBpbmdwcm94eSh0aGlzLnByb3RvdHlwZSl9fSxfX2RvY19fOnskZ2V0KCl7Y29uc3QgYT10aGlzLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkb2MpO3JldHVybiBhP3ZvaWQgMCE9PWEudHAkZGVzY3JfZ2V0P3RoaXM9PT1Tay5idWlsdGluLnR5cGU/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMucHJvdG90eXBlLnRwJGRvYyk6YS50cCRkZXNjcl9nZXQobnVsbCxcbnRoaXMpOnRoaXMucHJvdG90eXBlLl9fZG9jX186U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkc2V0KGEpe2wodGhpcyxhLFNrLmJ1aWx0aW4uc3RyLiRkb2MpO3RoaXMucHJvdG90eXBlLl9fZG9jX189YX19LF9fbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnByb3RvdHlwZS50cCRuYW1lKX0sJHNldChhKXtsKHRoaXMsYSxTay5idWlsdGluLnN0ci4kbmFtZSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgYXNzaWduIHN0cmluZyB0byBcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiLl9fbmFtZV9fLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt0aGlzLnByb3RvdHlwZS50cCRuYW1lPWEuJGpzc3RyKCl9fSxfX21vZHVsZV9fOnskZ2V0KCl7bGV0IGE9dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXztyZXR1cm4gYSYmYS5vYiR0eXBlIT09U2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcj9cbmE6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiYnVpbHRpbnNcIil9LCRzZXQoYSl7bCh0aGlzLGEsU2suYnVpbHRpbi5zdHIuJG1vZHVsZSk7dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXz1hfX19O1NrLmJ1aWx0aW4udHlwZS5wcm90b3R5cGUudHAkbWV0aG9kcz17bXJvOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMuJGJ1aWxkTVJPKCkpfSwkZmxhZ3M6e05vQXJnczohMH19LF9fZGlyX186eyRtZXRoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXthIGluIFNrLnJlc2VydmVkV29yZHNffHwoYT1Tay51bmZpeFJlc2VydmVkKGEpLC0xIT09YS5pbmRleE9mKFwiJFwiKXx8Yi5oYXMoYSl8fChiLmFkZChhKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSkpfWNvbnN0IGI9bmV3IFNldCxjPVtdO2lmKHRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbClmb3IodmFyIGUgaW4gdGhpcy5wcm90b3R5cGUpYShlKTtlbHNle2U9dGhpcy5wcm90b3R5cGUudHAkbXJvO2ZvcihsZXQgYj1cbjA7YjxlLmxlbmd0aDtiKyspe2NvbnN0IGM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZVtiXS5wcm90b3R5cGUpO2ZvcihsZXQgYj0wO2I8Yy5sZW5ndGg7YisrKWEoY1tiXSl9fXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlNwZWNpYWxpemVkIF9fZGlyX18gaW1wbGVtZW50YXRpb24gZm9yIHR5cGVzLlwifX07Y29uc3QgaD17JGdldCgpe2NvbnN0IGE9Zih0aGlzLm9iJHR5cGUpO3JldHVybiB2b2lkIDAhPT1hP2EudHAkZGVzY3JfZ2V0KHRoaXMsdGhpcy5vYiR0eXBlKTpTay5nZW5lcmljLmdldFNldERpY3QuJGdldC5jYWxsKHRoaXMpfSwkc2V0KGEpe2NvbnN0IGI9Zih0aGlzLm9iJHR5cGUpO3JldHVybiB2b2lkIDAhPT1iP2IudHAkZGVzY3Jfc2V0KHRoaXMsYSk6U2suZ2VuZXJpYy5nZXRTZXREaWN0LiRzZXQuY2FsbCh0aGlzLGEpfSwkZG9jOlwiZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKVwiLFxuJG5hbWU6XCJfX2RpY3RfX1wifX0sZnVuY3Rpb24obSxxKXtTay5nZW5lcmljPXt9O1NrLmdlbmVyaWMuZ2V0QXR0cj1mdW5jdGlvbihhLGMpe2xldCBiO2NvbnN0IGU9dGhpcy5vYiR0eXBlLGY9ZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1mJiYoYj1mLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1iJiZ2b2lkIDAhPT1mLnRwJGRlc2NyX3NldCkpcmV0dXJuIGIuY2FsbChmLHRoaXMsZSxjKTtjb25zdCBsPXRoaXMuJGQ7aWYodm9pZCAwIT09bCYmKGE9bC5xdWljayRsb29rdXAoYSksdm9pZCAwIT09YSkpcmV0dXJuIGE7aWYodm9pZCAwIT09YilyZXR1cm4gYi5jYWxsKGYsdGhpcyxlLGMpO2lmKHZvaWQgMCE9PWYpcmV0dXJuIGZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmdlbmVyaWMuZ2V0QXR0clwiLFNrLmdlbmVyaWMuZ2V0QXR0cik7U2suZ2VuZXJpYy5zZXRBdHRyPWZ1bmN0aW9uKGEsYyxiKXt2YXIgZT10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoYSk7aWYodm9pZCAwIT09ZSYmbnVsbCE9PVxuZSl7Y29uc3QgYT1lLnRwJGRlc2NyX3NldDtpZihhKXJldHVybiBhLmNhbGwoZSx0aGlzLGMsYil9Yj10aGlzLiRkO2lmKHZvaWQgMCE9PWIpaWYoYi5tcCRhc3Nfc3Vic2NyaXB0KXtpZih2b2lkIDAhPT1jKXJldHVybiBiLm1wJGFzc19zdWJzY3JpcHQoYSxjKTt0cnl7cmV0dXJuIGIubXAkYXNzX3N1YnNjcmlwdChhKX1jYXRjaChmKXtpZihmIGluc3RhbmNlb2YgU2suYnVpbHRpbi5LZXlFcnJvcil0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIicgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2EuJGpzc3RyKCkrXCInXCIpO3Rocm93IGY7fX1lbHNlIGlmKFwib2JqZWN0XCI9PT10eXBlb2YgYil7ZT1hLiRtYW5nbGVkO2lmKHZvaWQgMCE9PWMpe2JbZV09YztyZXR1cm59aWYodm9pZCAwIT09YltlXSl7ZGVsZXRlIGJbZV07cmV0dXJufX10aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcih0aGlzLnNrJGF0dHJFcnJvcigpK1xuXCIgaGFzIG5vIGF0dHJpYnV0ZSAnXCIrYS4kanNzdHIoKStcIidcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5nZW5lcmljLnNldEF0dHJcIixTay5nZW5lcmljLnNldEF0dHIpO1NrLmdlbmVyaWMubmV3PWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjLGIpe2lmKHRoaXMuY29uc3RydWN0b3I9PT1hKXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcjtjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2EuY2FsbChjKTtyZXR1cm4gY319O1NrLmdlbmVyaWMubmV3TWV0aG9kRGVmPXskbWV0aChhLGMpe2NvbnN0IGI9dGhpcy5wcm90b3R5cGU7aWYoMT5hLmxlbmd0aCl0aHJvdyBhPWIudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIi5fX25ld19fKCk6IG5vdCBlbm91Z2ggYXJndW1lbnRzXCIpO3ZhciBlPWEuc2hpZnQoKTtpZih2b2lkIDA9PT1lLnNrJHR5cGUpdGhyb3cgYT1iLnRwJG5hbWUsbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCJfX25ld19fKFgpOiBYIGlzIG5vdCBhIHR5cGUgb2JqZWN0IChcIitcblNrLmFic3RyLnR5cGVOYW1lKGUpK1wiKVwiKTtpZighZS4kaXNTdWJUeXBlKHRoaXMpKXRocm93IGE9Yi50cCRuYW1lLGU9ZS5wcm90b3R5cGUudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIi5fX25ld19fKFwiK2UrXCIpOiBcIitlK1wiIGlzIG5vdCBhIHN1YnR5cGUgb2YgXCIrYSk7Y29uc3QgZj1lLnByb3RvdHlwZS5zayRzdGF0aWNOZXcucHJvdG90eXBlO2lmKGYudHAkbmV3IT09Yi50cCRuZXcpdGhyb3cgYT1iLnRwJG5hbWUsZT1lLnByb3RvdHlwZS50cCRuYW1lLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiLl9fbmV3X18oXCIrZStcIikgaXMgbm90IHNhZmUsIHVzZSBcIitmLnRwJG5hbWUrXCIuX19uZXdfXygpXCIpO3JldHVybiBiLnRwJG5ldy5jYWxsKGUucHJvdG90eXBlLGEsYyl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCR0eXBlLCAqYXJncywgKiprd2FyZ3MpXCIsJG5hbWU6XCJfX25ld19fXCJ9O1NrLmdlbmVyaWMuc2VsZkl0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307XG5Tay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplPWZ1bmN0aW9uKCl7aWYodGhpcy4kc2VxLmxlbmd0aCE9PXRoaXMuJG9yaWcuZ2V0JHNpemUoKSl7Y29uc3QgYT10aGlzLnRwJG5hbWUuc3BsaXQoXCJfXCIpWzBdO3Rocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihhK1wiIGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uXCIpO31pZighKHRoaXMuJGluZGV4Pj10aGlzLiRzZXEubGVuZ3RoKSlyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfTtTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5PWZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLiRzZXFbdGhpcy4kaW5kZXgrK107dm9pZCAwPT09YSYmKHRoaXMudHAkaXRlcm5leHQ9KCk9Pnt9KTtyZXR1cm4gYX07U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZj17JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRzZXEubGVuZ3RoLXRoaXMuJGluZGV4KX0sXG4kZmxhZ3M6e05vQXJnczohMH19O1NrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmPXskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJGluZGV4KX0sJGZsYWdzOntOb0FyZ3M6ITB9fTtTay5nZW5lcmljLmdldFNldERpY3Q9eyRnZXQoKXtyZXR1cm4gdGhpcy4kZH0sJHNldChhKXtpZih2b2lkIDA9PT1hKXRoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdDtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpdGhpcy4kZD1hO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19kaWN0X18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0aW9uYXJ5LCBub3QgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO30sJGRvYzpcImRpY3Rpb25hcnkgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgZGVmaW5lZClcIiwkbmFtZTpcIl9fZGljdF9fXCJ9O1NrLmdlbmVyaWMuc2VxQ29tcGFyZT1mdW5jdGlvbihhLFxuYyl7aWYodGhpcz09PWEmJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYykpcmV0dXJuITA7aWYoIShhIGluc3RhbmNlb2YgdGhpcy5zayRidWlsdGluQmFzZSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGI9dGhpcy52O2E9YS52O2xldCBlO2lmKGIubGVuZ3RoIT09YS5sZW5ndGgmJihcIkVxXCI9PT1jfHxcIk5vdEVxXCI9PT1jKSlyZXR1cm5cIkVxXCI9PT1jPyExOiEwO2ZvcihlPTA7ZTxiLmxlbmd0aCYmZTxhLmxlbmd0aCYmKGJbZV09PT1hW2VdfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYltlXSxhW2VdLFwiRXFcIikpOysrZSk7Y29uc3QgZj1iLmxlbmd0aCxsPWEubGVuZ3RoO2lmKGU+PWZ8fGU+PWwpc3dpdGNoKGMpe2Nhc2UgXCJMdFwiOnJldHVybiBmPGw7Y2FzZSBcIkx0RVwiOnJldHVybiBmPD1sO2Nhc2UgXCJFcVwiOnJldHVybiBmPT09bDtjYXNlIFwiTm90RXFcIjpyZXR1cm4gZiE9PWw7Y2FzZSBcIkd0XCI6cmV0dXJuIGY+XG5sO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZj49bDtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbCgpfXJldHVyblwiRXFcIj09PWM/ITE6XCJOb3RFcVwiPT09Yz8hMDpTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYltlXSxhW2VdLGMpfX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXtjPWMubGVuZ3RoO3ZvaWQgMD09PWUmJihlPUluZmluaXR5KTtmJiYtLWM7bCYmLS1jO2lmKGM8Ynx8Yz5lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYj09PWU/YStcIigpIHRha2VzIGV4YWN0bHkgXCIrYitcIiBhcmd1bWVudHNcIjpjPGI/YStcIigpIHRha2VzIGF0IGxlYXN0IFwiK2IrXCIgYXJndW1lbnRzXCI6MDxiP2ErXCIoKSB0YWtlcyBhdCBtb3N0IFwiK2UrXCIgYXJndW1lbnRzXCI6YStcIigpIHRha2VzIG5vIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2MrXCIgZ2l2ZW4pXCIpKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NcIixTay5idWlsdGluLnB5Q2hlY2tBcmdzKTtcblNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW49ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe3ZvaWQgMD09PWUmJihlPUluZmluaXR5KTtmJiYtLWM7bCYmLS1jO2lmKGM8Ynx8Yz5lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYj09PWU/YStcIigpIHRha2VzIGV4YWN0bHkgXCIrYitcIiBhcmd1bWVudHNcIjpjPGI/YStcIigpIHRha2VzIGF0IGxlYXN0IFwiK2IrXCIgYXJndW1lbnRzXCI6YStcIigpIHRha2VzIGF0IG1vc3QgXCIrZStcIiBhcmd1bWVudHNcIikrKFwiIChcIitjK1wiIGdpdmVuKVwiKSk7fTtTay5idWlsdGluLnB5Q2hlY2tUeXBlPWZ1bmN0aW9uKGEsYyxiKXtpZighYil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIiBtdXN0IGJlIGEgXCIrYyk7fTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLnB5Q2hlY2tUeXBlXCIsU2suYnVpbHRpbi5weUNoZWNrVHlwZSk7U2suYnVpbHRpbi5jaGVja1NlcXVlbmNlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdH07XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrU2VxdWVuY2VcIixTay5idWlsdGluLmNoZWNrU2VxdWVuY2UpO1NrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZT1mdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT8hMTphLnRwJGl0ZXI/dm9pZCAwIT09YS50cCRpdGVyKCkudHAkaXRlcm5leHQ6dm9pZCAwIT09YS5tcCRzdWJzY3JpcHR9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZVwiLFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZSk7U2suYnVpbHRpbi5jaGVja0NhbGxhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLnRwJGNhbGx9O1NrLmJ1aWx0aW4uY2hlY2tOdW1iZXI9ZnVuY3Rpb24oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZ307U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja051bWJlclwiLFxuU2suYnVpbHRpbi5jaGVja051bWJlcik7U2suYnVpbHRpbi5jaGVja0NvbXBsZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmNvbXBsZXh9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4XCIsU2suYnVpbHRpbi5jaGVja0NvbXBsZXgpO1NrLmJ1aWx0aW4uY2hlY2tJbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fFwibnVtYmVyXCI9PT10eXBlb2YgYSYmTnVtYmVyLmlzSW50ZWdlcihhKX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0ludFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQpO1NrLmJ1aWx0aW4uY2hlY2tGbG9hdD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRffTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRmxvYXRcIixTay5idWlsdGluLmNoZWNrRmxvYXQpO1NrLmJ1aWx0aW4uY2hlY2tTdHJpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zdHJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tTdHJpbmdcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKTtTay5idWlsdGluLmNoZWNrQnl0ZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzfTtTay5idWlsdGluLmNoZWNrQ2xhc3M9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR5cGV9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tDbGFzc1wiLFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyk7U2suYnVpbHRpbi5jaGVja0Jvb2w9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJvb2x9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tCb29sXCIsU2suYnVpbHRpbi5jaGVja0Jvb2wpO1NrLmJ1aWx0aW4uY2hlY2tOb25lPWZ1bmN0aW9uKGEpe3JldHVybiBhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrTm9uZVwiLFxuU2suYnVpbHRpbi5jaGVja05vbmUpO1NrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmdm9pZCAwIT09YS50cCRjYWxsfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRnVuY3Rpb25cIixTay5idWlsdGluLmNoZWNrRnVuY3Rpb24pO1NrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3I9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJnZvaWQgMCE9PWEudHAkZGVzY3Jfc2V0fTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRGF0YURlc2NyXCIsU2suYnVpbHRpbi5jaGVja0RhdGFEZXNjcik7U2suYnVpbHRpbi5jaGVja0FueVNldD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2V0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mcm96ZW5zZXR9O1NrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tYXBwaW5ncHJveHl8fFxubnVsbCE9YSYmdm9pZCAwIT09YS5tcCRzdWJzY3JpcHQmJnZvaWQgMCE9PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyl9fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiKXtzd2l0Y2goYil7Y2FzZSBcIkFkZFwiOnJldHVybiBhLm5iJGFkZDtjYXNlIFwiU3ViXCI6cmV0dXJuIGEubmIkc3VidHJhY3Q7Y2FzZSBcIk11bHRcIjpyZXR1cm4gYS5uYiRtdWx0aXBseTtjYXNlIFwiTWF0TXVsdFwiOmlmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gYS5uYiRtYXRyaXhfbXVsdGlwbHk7Y2FzZSBcIkRpdlwiOnJldHVybiBhLm5iJGRpdmlkZTtjYXNlIFwiRmxvb3JEaXZcIjpyZXR1cm4gYS5uYiRmbG9vcl9kaXZpZGU7Y2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJHJlbWFpbmRlcjtjYXNlIFwiRGl2TW9kXCI6cmV0dXJuIGEubmIkZGl2bW9kO2Nhc2UgXCJQb3dcIjpyZXR1cm4gYS5uYiRwb3dlcjtjYXNlIFwiTFNoaWZ0XCI6cmV0dXJuIGEubmIkbHNoaWZ0O2Nhc2UgXCJSU2hpZnRcIjpyZXR1cm4gYS5uYiRyc2hpZnQ7XG5jYXNlIFwiQml0QW5kXCI6cmV0dXJuIGEubmIkYW5kO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiR4b3I7Y2FzZSBcIkJpdE9yXCI6cmV0dXJuIGEubmIkb3J9fWZ1bmN0aW9uIGMoYSxiKXtzd2l0Y2goYil7Y2FzZSBcIkFkZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9hZGQ7Y2FzZSBcIlN1YlwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9zdWJ0cmFjdDtjYXNlIFwiTXVsdFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9tdWx0aXBseTtjYXNlIFwiTWF0TXVsdFwiOmlmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5O2Nhc2UgXCJEaXZcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfZGl2aWRlO2Nhc2UgXCJGbG9vckRpdlwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGU7Y2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9yZW1haW5kZXI7Y2FzZSBcIkRpdk1vZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9kaXZtb2Q7Y2FzZSBcIlBvd1wiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9wb3dlcjtcbmNhc2UgXCJMU2hpZnRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfbHNoaWZ0O2Nhc2UgXCJSU2hpZnRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfcnNoaWZ0O2Nhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfYW5kO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfeG9yO2Nhc2UgXCJCaXRPclwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9vcn19ZnVuY3Rpb24gYihhLGIpe3N3aXRjaChiKXtjYXNlIFwiQWRkXCI6cmV0dXJuIGEubmIkaW5wbGFjZV9hZGQ7Y2FzZSBcIlN1YlwiOnJldHVybiBhLm5iJGlucGxhY2Vfc3VidHJhY3Q7Y2FzZSBcIk11bHRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX211bHRpcGx5O2Nhc2UgXCJNYXRNdWx0XCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBhLm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5O2Nhc2UgXCJEaXZcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2RpdmlkZTtjYXNlIFwiRmxvb3JEaXZcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2Zsb29yX2RpdmlkZTtcbmNhc2UgXCJNb2RcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3JlbWFpbmRlcjtjYXNlIFwiUG93XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9wb3dlcjtjYXNlIFwiTFNoaWZ0XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9sc2hpZnQ7Y2FzZSBcIlJTaGlmdFwiOnJldHVybiBhLm5iJGlucGxhY2VfcnNoaWZ0O2Nhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2FuZDtjYXNlIFwiQml0T3JcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX29yO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3hvcn19ZnVuY3Rpb24gZShiLGQsZSl7dmFyIGs9ZC5jb25zdHJ1Y3RvcixmPWIuY29uc3RydWN0b3I7aWYoaz1rIT09ZiYmdm9pZCAwPT09ay5zayRiYXNlQ2xhc3MmJmQgaW5zdGFuY2VvZiBmKWlmKGY9YyhkLGUpLHZvaWQgMCE9PWYmJmYhPT1jKGIsZSkmJihmPWYuY2FsbChkLGIpLGYhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpcmV0dXJuIGY7Zj1hKGIsZSk7aWYodm9pZCAwIT09XG5mJiYoZj1mLmNhbGwoYixkKSxmIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpfHwhayYmKGY9YyhkLGUpLHZvaWQgMCE9PWYmJihmPWYuY2FsbChkLGIpLGYhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpKXJldHVybiBmfWZ1bmN0aW9uIGYoYSl7bi5mb3JFYWNoKChbYixjXSk9PnthW2NdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRwJHJpY2hjb21wYXJlKGEsYil9fSl9ZnVuY3Rpb24gbChhKXtjb25zdCBiPVNrLnJlZmxlY3RlZE51bWJlclNsb3RzO09iamVjdC5rZXlzKGIpLmZvckVhY2goYz0+e2lmKHZvaWQgMCE9PWFbY10pe2NvbnN0IGQ9YltjXSxlPWQucmVmbGVjdGVkLGY9YVtlXTt2b2lkIDAhPT1mP251bGw9PT1mJiZkZWxldGUgYVtlXTphW2VdPWQuc2xvdHx8YVtjXX19KX1mdW5jdGlvbiBoKGEpe2NvbnN0IGI9U2suc2VxdWVuY2VBbmRNYXBwaW5nU2xvdHM7T2JqZWN0LmtleXMoYikuZm9yRWFjaChjPT5cbnt2b2lkIDAhPT1hW2NdJiZiW2NdLmZvckVhY2goYj0+e2FbYl09YVtjXX0pfSl9U2suYWJzdHI9e307U2suYWJzdHIudHlwZU5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJnZvaWQgMCE9PWEudHAkbmFtZT9hLnRwJG5hbWU6XCI8aW52YWxpZCB0eXBlPlwifTtjb25zdCBkPXtBZGQ6XCIrXCIsU3ViOlwiLVwiLE11bHQ6XCIqXCIsTWF0TXVsdDpcIkBcIixEaXY6XCIvXCIsRmxvb3JEaXY6XCIvL1wiLE1vZDpcIiVcIixEaXZNb2Q6XCJkaXZtb2QoKVwiLFBvdzpcIioqIG9yIHBvdygpXCIsTFNoaWZ0OlwiPDxcIixSU2hpZnQ6XCI+PlwiLEJpdEFuZDpcIiZcIixCaXRYb3I6XCJeXCIsQml0T3I6XCJ8XCJ9LGc9e1VBZGQ6XCIrXCIsVVN1YjpcIi1cIixJbnZlcnQ6XCJ+XCJ9O1NrLmFic3RyLm51bWJlckJpbk9wPWZ1bmN0aW9uKGEsYixjKXt2YXIgZjtpZighKGY9ZShhLGIsYykpKXRocm93IGE9U2suYWJzdHIudHlwZU5hbWUoYSksYj1Tay5hYnN0ci50eXBlTmFtZShiKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIFwiK1xuZFtjXStcIjogJ1wiK2ErXCInIGFuZCAnXCIrYitcIidcIik7cmV0dXJuIGZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm51bWJlckJpbk9wXCIsU2suYWJzdHIubnVtYmVyQmluT3ApO1NrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcD1mdW5jdGlvbihhLGMsZil7YTp7dmFyIGs9YihhLGYpO2lmKHZvaWQgMCE9PWsmJihrPWsuY2FsbChhLGMpLGshPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpYnJlYWsgYTtrPWUoYSxjLGYpfWlmKCFrKXRocm93IGE9U2suYWJzdHIudHlwZU5hbWUoYSksYz1Tay5hYnN0ci50eXBlTmFtZShjKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIFwiK2RbZl0rXCI9OiAnXCIrYStcIicgYW5kICdcIitjK1wiJ1wiKTtyZXR1cm4ga307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wXCIsU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKTtTay5hYnN0ci5udW1iZXJVbmFyeU9wPVxuZnVuY3Rpb24oYSxiKXtpZihcIk5vdFwiPT09YilyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEpP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6U2suYnVpbHRpbi5ib29sLnRydWUkO2I6e3N3aXRjaChiKXtjYXNlIFwiVVN1YlwiOnZhciBjPWEubmIkbmVnYXRpdmU7YnJlYWsgYjtjYXNlIFwiVUFkZFwiOmM9YS5uYiRwb3NpdGl2ZTticmVhayBiO2Nhc2UgXCJJbnZlcnRcIjpjPWEubmIkaW52ZXJ0O2JyZWFrIGJ9Yz12b2lkIDB9Yz12b2lkIDAhPT1jP2MuY2FsbChhKTp2b2lkIDA7aWYoIWMpdGhyb3cgYT1Tay5hYnN0ci50eXBlTmFtZShhKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSBcIitnW2JdK1wiOiAnXCIrYStcIidcIik7cmV0dXJuIGN9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm51bWJlclVuYXJ5T3BcIixTay5hYnN0ci5udW1iZXJVbmFyeU9wKTtTay5hYnN0ci5maXhTZXFJbmRleF89ZnVuY3Rpb24oYSxiKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO1xuMD5iJiZhLnNxJGxlbmd0aCYmKGIrPWEuc3EkbGVuZ3RoKCkpO3JldHVybiBifTtTay5hYnN0ci5zZXF1ZW5jZUNvbnRhaW5zPWZ1bmN0aW9uKGEsYixjKXtpZihhLnNxJGNvbnRhaW5zKXJldHVybiBhLnNxJGNvbnRhaW5zKGIsYyk7YT1Tay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxiLFwiRXFcIik/bmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTohMX0sITEpO3JldHVybiBjP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpfTtTay5hYnN0ci5zZXF1ZW5jZUNvbmNhdD1mdW5jdGlvbihhLGIpe2lmKGEuc3EkY29uY2F0KXJldHVybiBhLnNxJGNvbmNhdChiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBjYW4ndCBiZSBjb25jYXRlbmF0ZWRcIik7fTtTay5hYnN0ci5zZXF1ZW5jZUdldEluZGV4T2Y9XG5mdW5jdGlvbihhLGIpe2lmKGEuaW5kZXgpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmluZGV4LFthLGJdKTtsZXQgYz0wO2ZvcihsZXQgZD1Tay5hYnN0ci5pdGVyKGEpLGU9ZC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWU7ZT1kLnRwJGl0ZXJuZXh0KCkpe2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLGUsXCJFcVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKTtjKz0xfXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzZXF1ZW5jZS5pbmRleCh4KTogeCBub3QgaW4gc2VxdWVuY2VcIik7fTtTay5hYnN0ci5zZXF1ZW5jZUdldENvdW50T2Y9ZnVuY3Rpb24oYSxiKXtpZihhLmNvdW50KXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5jb3VudCxbYSxiXSk7bGV0IGM9MDtmb3IobGV0IGQ9U2suYWJzdHIuaXRlcihhKSxlPWQudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1lO2U9ZC50cCRpdGVybmV4dCgpKVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLFxuZSxcIkVxXCIpJiYoYys9MSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyl9O1NrLmFic3RyLnNlcXVlbmNlR2V0SXRlbT1mdW5jdGlvbihhLGIsYyl7XCJudW1iZXJcIj09PXR5cGVvZiBiJiYoYj1uZXcgU2suYnVpbHRpbi5pbnRfKGIpKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShhLGIsYyl9O1NrLmFic3RyLnNlcXVlbmNlU2V0SXRlbT1mdW5jdGlvbihhLGIsYyxkKXtcIm51bWJlclwiPT09dHlwZW9mIGImJihiPW5ldyBTay5idWlsdGluLmludF8oYikpO3JldHVybiBTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsYixjLGQpfTtTay5hYnN0ci5zZXF1ZW5jZURlbEl0ZW09ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBTay5hYnN0ci5vYmplY3REZWxJdGVtKGEsYixjKX07U2suYWJzdHIuc2VxdWVuY2VHZXRTbGljZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5zbGljZShiLGMpKX07U2suYWJzdHIuc2VxdWVuY2VEZWxTbGljZT1cbmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0RGVsSXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGIsYykpfTtTay5hYnN0ci5zZXF1ZW5jZVNldFNsaWNlPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsbmV3IFNrLmJ1aWx0aW4uc2xpY2UoYixjKSl9O1NrLmFic3RyLnNlcXVlbmNlVW5wYWNrPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IHVucGFjayBub24taXRlcmFibGUgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgb2JqZWN0XCIpO2NvbnN0IGU9U2suYWJzdHIuaXRlcihhKSxmPVtdO2xldCBrPTAsZzswPGImJihnPVNrLm1pc2NldmFsLml0ZXJGb3IoZSxhPT57Zi5wdXNoKGEpO2lmKCsraz09PWIpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVha30pKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZyxcbigpPT57aWYoZi5sZW5ndGg8Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibm90IGVub3VnaCB2YWx1ZXMgdG8gdW5wYWNrIChleHBlY3RlZCBhdCBsZWFzdCBcIitjK1wiLCBnb3QgXCIrZi5sZW5ndGgrXCIpXCIpO2lmKCFkKXJldHVybiBTay5taXNjZXZhbC5jaGFpbihlLnRwJGl0ZXJuZXh0KCEwKSxhPT57aWYodm9pZCAwIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwidG9vIG1hbnkgdmFsdWVzIHRvIHVucGFjayAoZXhwZWN0ZWQgXCIrYitcIilcIik7cmV0dXJuIGZ9KTtjb25zdCBhPVtdO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKGUsYj0+e2EucHVzaChiKX0pLCgpPT57Y29uc3QgZD1hLmxlbmd0aCtiLWM7aWYoMD5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJub3QgZW5vdWdoIHZhbHVlcyB0byB1bnBhY2sgKGV4cGVjdGVkIGF0IGxlYXN0IFwiK2MrXCIsIGdvdCBcIisoYytkKStcIilcIik7Zi5wdXNoKG5ldyBTay5idWlsdGluLmxpc3QoYS5zbGljZSgwLFxuZCkpKTtmLnB1c2goLi4uYS5zbGljZShkKSk7cmV0dXJuIGZ9KX0pfTtTay5hYnN0ci5tYXBwaW5nVW5wYWNrSW50b0tleXdvcmRBcnJheT1mdW5jdGlvbihhLGIsYyl7aWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCliLiRpdGVtcygpLmZvckVhY2goKFtiLGRdKT0+e2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYy4kcXVhbG5hbWU/Yy4kcXVhbG5hbWUrXCIoKSBcIjpcIlwiKStcImtleXdvcmRzIG11c3QgYmUgc3RyaW5nc1wiKTthLnB1c2goYi52KTthLnB1c2goZCl9KTtlbHNle3ZhciBkPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYixTay5idWlsdGluLnN0ci4ka2V5cyk7aWYodm9pZCAwPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJPYmplY3QgaXMgbm90IGEgbWFwcGluZ1wiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQpLGQ9PlNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihkKSxcbmQ9PntpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoKGMuJHF1YWxuYW1lP2MuJHF1YWxuYW1lK1wiKCkgXCI6XCJcIikrXCJrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3NcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIubXAkc3Vic2NyaXB0KGQsITApLGI9PnthLnB1c2goZC52KTthLnB1c2goYil9KX0pKX19O1NrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzPWZ1bmN0aW9uKGEsYixjLGQsZSl7ZD1kfHxbXTt2YXIgZj1jLmxlbmd0aCtkLmxlbmd0aC8yO2lmKGY+Yi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBleHBlY3RlZCBhdCBtb3N0IFwiK2IubGVuZ3RoK1wiIGFyZ3VtZW50cyAoXCIrZitcIiBnaXZlbilcIik7aWYoZC5sZW5ndGh8fHZvaWQgMCE9PWUpe2lmKGY9PT1iLmxlbmd0aCYmIWQubGVuZ3RoKXJldHVybiBjO2lmKDA9PT1mJiZiLmxlbmd0aD09PShlJiZlLmxlbmd0aCkpcmV0dXJuIGV9ZWxzZSByZXR1cm4gYztcbmM9Yy5zbGljZSgwKTtmb3IoZj0wO2Y8ZC5sZW5ndGg7Zis9Mil7Y29uc3QgZT1kW2ZdLGs9ZFtmKzFdLGc9Yi5pbmRleE9mKGUpO2lmKDA8PWcpe2lmKHZvaWQgMCE9PWNbZ10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBhcmd1bWVudCAnXCIrZStcIidcIik7Y1tnXT1rfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdcIitlK1wiJ1wiKTt9aWYoZSl7ZD1iLmxlbmd0aDtmb3IoZj1kLTE7MDw9ZjtmLS0pdm9pZCAwPT09Y1tmXSYmKGNbZl09ZVtlLmxlbmd0aC0xLShkLTEtZildKTtiPWIuZmlsdGVyKChhLGIpPT52b2lkIDA9PT1jW2JdKTtpZihiLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIG1pc3NpbmcgXCIrYi5sZW5ndGgrXCIgcmVxdWlyZWQgcG9zaXRpb25hbCBhcmd1bWVudHM6IFwiK2Iuam9pbihcIiwgXCIpKTtcbn1yZXR1cm4gY307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3NcIixTay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyk7U2suYWJzdHIuY2hlY2tOb0t3YXJncz1mdW5jdGlvbihhLGIpe2lmKGImJmIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja05vS3dhcmdzXCIsU2suYWJzdHIuY2hlY2tOb0t3YXJncyk7U2suYWJzdHIuY2hlY2tOb0FyZ3M9ZnVuY3Rpb24oYSxiLGMpe2lmKGI9Yi5sZW5ndGgrKGM/Yy5sZW5ndGg6MCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSB0YWtlcyBubyBhcmd1bWVudHMgKFwiK2IrXCIgZ2l2ZW4pXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY2hlY2tOb0FyZ3NcIixTay5hYnN0ci5jaGVja05vQXJncyk7U2suYWJzdHIuY2hlY2tPbmVBcmc9XG5mdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhhLGMpO2lmKDEhPT1iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50IChcIitiLmxlbmd0aCtcIiBnaXZlbilcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja09uZUFyZ1wiLFNrLmFic3RyLmNoZWNrT25lQXJnKTtTay5hYnN0ci5jaGVja0FyZ3NMZW49ZnVuY3Rpb24oYSxiLGMsZCl7Yj1iLmxlbmd0aDt2b2lkIDA9PT1kJiYoZD1JbmZpbml0eSk7aWYoYjxjfHxiPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChjPT09ZD9hK1wiKCkgdGFrZXMgZXhhY3RseSBcIitjK1wiIGFyZ3VtZW50c1wiOmI8Yz9hK1wiKCkgdGFrZXMgYXQgbGVhc3QgXCIrYytcIiBhcmd1bWVudHNcIjphK1wiKCkgdGFrZXMgYXQgbW9zdCBcIitkK1wiIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2IrXCIgZ2l2ZW4pXCIpKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmNoZWNrQXJnc0xlblwiLFxuU2suYWJzdHIuY2hlY2tBcmdzTGVuKTtTay5hYnN0ci5vYmplY3RGb3JtYXQ9ZnVuY3Rpb24oYSxiKXthPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kZm9ybWF0KTtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19mb3JtYXRfXyBtdXN0IHJldHVybiBhIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpKTtyZXR1cm4gYn07U2suYWJzdHIub2JqZWN0SGFzaD1mdW5jdGlvbihhKXtjb25zdCBiPWEudHAkaGFzaDtpZih2b2lkIDAhPT1iKXtpZihTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bmhhc2hhYmxlIHR5cGU6ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7cmV0dXJuIGEudHAkaGFzaCgpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIEphdmFzY3JpcHQgdHlwZVwiKTtcbn07U2suYWJzdHIub2JqZWN0QWRkPWZ1bmN0aW9uKGEsYil7aWYoYS5uYiRhZGQpcmV0dXJuIGEubmIkYWRkKGIpO2E9U2suYWJzdHIudHlwZU5hbWUoYSk7Yj1Tay5hYnN0ci50eXBlTmFtZShiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICs6ICdcIithK1wiJyBhbmQgJ1wiK2IrXCInXCIpO307U2suYWJzdHIub2JqZWN0TmVnYXRpdmU9ZnVuY3Rpb24oYSl7aWYoYS5uYiRuZWdhdGl2ZSlyZXR1cm4gYS5uYiRuZWdhdGl2ZSgpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IC06ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fTtTay5hYnN0ci5vYmplY3RQb3NpdGl2ZT1mdW5jdGlvbihhKXtpZihhLm5iJHBvc2l0aXZlKXJldHVybiBhLm5iJHBvc2l0aXZlKCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgKzogJ1wiK1xuU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO307U2suYWJzdHIub2JqZWN0RGVsSXRlbT1mdW5jdGlvbihhLGIsYyl7aWYoYS5tcCRhc3Nfc3Vic2NyaXB0KXJldHVybiBhLm1wJGFzc19zdWJzY3JpcHQoYix2b2lkIDAsYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIub2JqZWN0RGVsSXRlbVwiLFNrLmFic3RyLm9iamVjdERlbEl0ZW0pO1NrLmFic3RyLm9iamVjdEdldEl0ZW09ZnVuY3Rpb24oYSxiLGMpe2lmKGEubXAkc3Vic2NyaXB0KXJldHVybiBhLm1wJHN1YnNjcmlwdChiLGMpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGluZ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm9iamVjdEdldEl0ZW1cIixcblNrLmFic3RyLm9iamVjdEdldEl0ZW0pO1NrLmFic3RyLm9iamVjdFNldEl0ZW09ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYS5tcCRhc3Nfc3Vic2NyaXB0KXJldHVybiBhLm1wJGFzc19zdWJzY3JpcHQoYixjLGQpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnRcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5vYmplY3RTZXRJdGVtXCIsU2suYWJzdHIub2JqZWN0U2V0SXRlbSk7U2suYWJzdHIuZ2F0dHI9ZnVuY3Rpb24oYSxiLGMpe2M9YS50cCRnZXRhdHRyKGIsYyk7aWYodm9pZCAwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihhLnNrJGF0dHJFcnJvcigpK1wiIGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2IuJGpzc3RyKCkrXCInXCIpO3JldHVybiBjLiRpc1N1c3BlbnNpb24/U2subWlzY2V2YWwuY2hhaW4oYyxmdW5jdGlvbihjKXtpZih2b2lkIDA9PT1cbmMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoYS5zayRhdHRyRXJyb3IoKStcIiBoYXMgbm8gYXR0cmlidXRlICdcIitiLiRqc3N0cigpK1wiJ1wiKTtyZXR1cm4gY30pOmN9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmdhdHRyXCIsU2suYWJzdHIuZ2F0dHIpO1NrLmFic3RyLnNhdHRyPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLnRwJHNldGF0dHIoYixjLGQpfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5zYXR0clwiLFNrLmFic3RyLnNhdHRyKTtTay5hYnN0ci5pdGVybmV4dD1mdW5jdGlvbihhLGIpe3JldHVybiBhLnRwJGl0ZXJuZXh0KGIpfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5pdGVybmV4dFwiLFNrLmFic3RyLml0ZXJuZXh0KTtTay5hYnN0ci5pdGVyPWZ1bmN0aW9uKGEpe2lmKGEudHAkaXRlcil7YT1hLnRwJGl0ZXIoKTtpZihhLnRwJGl0ZXJuZXh0KXJldHVybiBhO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIml0ZXIoKSByZXR1cm5lZCBub24taXRlcmF0b3Igb2YgdHlwZSAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fWlmKGEubXAkc3Vic2NyaXB0KXJldHVybiBuZXcgU2suYnVpbHRpbi5zZXFfaXRlcl8oYSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuaXRlclwiLFNrLmFic3RyLml0ZXIpO1NrLmFic3RyLmxvb2t1cFNwZWNpYWw9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm9iJHR5cGU7aWYodm9pZCAwPT09YylTay5hc3NlcnRzLmZhaWwoXCJqYXZhc2NyaXB0IG9iamVjdCBzZW50IHRvIGxvb2t1cFNwZWNpYWxcIik7ZWxzZSBpZihiPWMuJHR5cGVMb29rdXAoYiksdm9pZCAwIT09YilyZXR1cm4gdm9pZCAwIT09Yi50cCRkZXNjcl9nZXQmJihiPWIudHAkZGVzY3JfZ2V0KGEsYykpLGJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmxvb2t1cFNwZWNpYWxcIixTay5hYnN0ci5sb29rdXBTcGVjaWFsKTtcblNrLmFic3RyLnR5cGVMb29rdXA9ZnVuY3Rpb24oYSxiKXtiPWEuJHR5cGVMb29rdXAoYik7cmV0dXJuIHZvaWQgMCE9PWImJmIudHAkZGVzY3JfZ2V0P2IudHAkZGVzY3JfZ2V0KG51bGwsYSk6Yn07U2suYWJzdHIubWFya1VuaGFzaGFibGU9ZnVuY3Rpb24oYSl7YT1hLnByb3RvdHlwZTthLl9faGFzaF9fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDthLnRwJGhhc2g9U2suYnVpbHRpbi5ub25lLm5vbmUkfTtTay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlPWZ1bmN0aW9uKGEsYixjLGQpe2Q9ZHx8U2suYnVpbHRpbi50eXBlO2M9dm9pZCAwPT09Yz9Tay5idWlsdGluLm9iamVjdDpjO2NvbnN0IGU9bnVsbCE9PWM/Yy5wcm90b3R5cGU6bnVsbDtPYmplY3Quc2V0UHJvdG90eXBlT2YoYixkLnByb3RvdHlwZSk7T2JqZWN0LnNldFByb3RvdHlwZU9mKGIucHJvdG90eXBlLGUpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGIucHJvdG90eXBlLHtzayRvYmplY3Q6e3ZhbHVlOmIsd3JpdGFibGU6ITB9LFxub2IkdHlwZTp7dmFsdWU6Yix3cml0YWJsZTohMH0sdHAkbmFtZTp7dmFsdWU6YSx3cml0YWJsZTohMH0sdHAkYmFzZTp7dmFsdWU6Yyx3cml0YWJsZTohMH19KX07U2suYWJzdHIuc2V0VXBCdWlsdGluTXJvPWZ1bmN0aW9uKGEpe2xldCBiPWEucHJvdG90eXBlLnRwJGJhc2U7Y29uc3QgYz1udWxsPT09Yj9bXTpbYl07aWYoYj09PVNrLmJ1aWx0aW4ub2JqZWN0fHxudWxsPT09YilPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxcInNrJGJhc2VDbGFzc1wiLHt2YWx1ZTohMCx3cml0YWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLnByb3RvdHlwZSxcInNrJGJ1aWx0aW5CYXNlXCIse3ZhbHVlOmEsd3JpdGFibGU6ITB9KTtjb25zdCBkPVthXTtmb3IoO251bGwhPT1iOylkLnB1c2goYiksYj1iLnByb3RvdHlwZS50cCRiYXNlO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEucHJvdG90eXBlLHtzayRwcm90b3R5cGljYWw6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfSx0cCRiYXNlczp7dmFsdWU6YyxcbndyaXRhYmxlOiEwfSx0cCRtcm86e3ZhbHVlOmQsd3JpdGFibGU6ITB9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCIkdHlwZUxvb2t1cFwiLHt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wcm90b3R5cGVbYS4kbWFuZ2xlZF19LHdyaXRhYmxlOiEwfSl9O1NrLmFic3RyLnNldFVwR2V0U2V0cz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4uZ2V0c2V0X2Rlc2NyaXB0b3Ipe3ZhciBjPWEucHJvdG90eXBlO2I9Ynx8Yy50cCRnZXRzZXRzfHx7fTtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbYixkXSk9PntkLiRuYW1lPWI7Y1tiXT1uZXcgU2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcihhLGQpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsXCJ0cCRnZXRzZXRzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O1NrLmFic3RyLnNldFVwTWV0aG9kcz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3Ipe3ZhciBjPVxuYS5wcm90b3R5cGU7Yj1ifHxjLnRwJG1ldGhvZHN8fHt9O09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtiLGRdKT0+e2QuJG5hbWU9YjtjW2JdPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKGEsZCl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxcInRwJG1ldGhvZHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07U2suYWJzdHIuc2V0VXBDbGFzc01ldGhvZHM9ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDAhPT1Tay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3Ipe3ZhciBjPWEucHJvdG90eXBlO2I9Ynx8Yy50cCRjbGFzc21ldGhvZHN8fHt9O09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtiLGRdKT0+e2QuJG5hbWU9YjtjW2JdPW5ldyBTay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3IoYSxkKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwidHAkY2xhc3NtZXRob2RzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O2NvbnN0IG49T2JqZWN0LmVudHJpZXMoe0VxOlwib2IkZXFcIixcbk5vdEVxOlwib2IkbmVcIixHdDpcIm9iJGd0XCIsR3RFOlwib2IkZ2VcIixMdDpcIm9iJGx0XCIsTHRFOlwib2IkbGVcIn0pO1NrLmFic3RyLnNldFVwU2xvdHM9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIsYyl7ZVtiXT1uZXcgU2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3IoYSxTay5zbG90c1tiXSxjKX1mdW5jdGlvbiBkKGEsYil7XCJzdHJpbmdcIj09PXR5cGVvZiBhP2MoYSxiKTphLmZvckVhY2goYT0+e2MoYSxiKX0pfWlmKHZvaWQgMCE9PVNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXt2YXIgZT1hLnByb3RvdHlwZTtiPWJ8fGUudHAkc2xvdHN8fHt9O2IudHAkbmV3PT09U2suZ2VuZXJpYy5uZXcmJihiLnRwJG5ldz1Tay5nZW5lcmljLm5ldyhhKSk7Yi50cCRyaWNoY29tcGFyZSYmZihiKTtiLnRwJGFzX251bWJlciYmbChiKTtiLnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmcmJmgoYik7T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2EsYl0pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXG5hLHt2YWx1ZTpiLHdyaXRhYmxlOiEwfSl9KTtiLnRwJG5ldyYmKGUuX19uZXdfXz1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoU2suZ2VuZXJpYy5uZXdNZXRob2REZWYsYSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzayRzdGF0aWNOZXdcIix7dmFsdWU6YSx3cml0YWJsZTohMH0pKTtTay5zdWJTbG90cy5tYWluX3Nsb3RzLmZvckVhY2goKFthLGNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTt2YXIgZz1iLnRwJGhhc2g7dm9pZCAwIT09ZyYmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnP2MoXCJfX2hhc2hfX1wiLGcpOmc9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/ZS5fX2hhc2hfXz1nOlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgdHAkaGFzaFwiKSk7Yi50cCRhc19udW1iZXImJlNrLnN1YlNsb3RzLm51bWJlcl9zbG90cy5mb3JFYWNoKChbYSxjXSk9PnthPWJbYV07dm9pZCAwIT09YSYmZChjLGEpfSk7Yi50cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nJiZTay5zdWJTbG90cy5zZXF1ZW5jZV9hbmRfbWFwcGluZ19zbG90cy5mb3JFYWNoKChbYSxcbmNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInRwJHNsb3RzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O1NrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3M9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O1NrLmFzc2VydHMuYXNzZXJ0KGIuaGFzT3duUHJvcGVydHkoXCJjb25zdHJ1Y3RvclwiKSxcIkEgY29uc3RydWN0b3IgaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSBuYXRpdmUgY2xhc3NcIik7bGV0IGM9Yi5jb25zdHJ1Y3RvcjtpZihhLmluY2x1ZGVzKFwiLlwiKSl7dmFyIGQ9YS5zcGxpdChcIi5cIik7YT1kLnBvcCgpO2Q9ZC5qb2luKFwiLlwiKX1Tay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlKGEsYyxiLmJhc2UsYi5tZXRhKTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm8oYyk7Y29uc3QgZT1jLnByb3RvdHlwZTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLHt0cCRzbG90czp7dmFsdWU6Yi5zbG90cyx3cml0YWJsZTohMH0sdHAkZ2V0c2V0czp7dmFsdWU6Yi5nZXRzZXRzLFxud3JpdGFibGU6ITB9LHRwJG1ldGhvZHM6e3ZhbHVlOmIubWV0aG9kcyx3cml0YWJsZTohMH0sdHAkY2xhc3NtZXRob2RzOnt2YWx1ZTpiLmNsYXNzbWV0aG9kcyx3cml0YWJsZTohMH19KTtTay5hYnN0ci5zZXRVcFNsb3RzKGMsYi5zbG90c3x8e30pO1NrLmFic3RyLnNldFVwTWV0aG9kcyhjLGIubWV0aG9kcyk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGMsYi5nZXRzZXRzKTtTay5hYnN0ci5zZXRVcENsYXNzTWV0aG9kcyhjLGIuY2xhc3NtZXRob2RzKTt2b2lkIDAhPT1kJiYoZS5fX21vZHVsZV9fPW5ldyBTay5idWlsdGluLnN0cihkKSk7T2JqZWN0LmVudHJpZXMoYi5wcm90b3x8e30pLmZvckVhY2goKFthLGJdKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLGEse3ZhbHVlOmIsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohKGEuaW5jbHVkZXMoXCIkXCIpfHxhIGluIE9iamVjdC5wcm90b3R5cGUpfSl9KTtPYmplY3QuZW50cmllcyhiLmZsYWdzfHx7fSkuZm9yRWFjaCgoW2EsYl0pPT5cbntPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxhLHt2YWx1ZTpiLHdyaXRhYmxlOiEwfSl9KTt2b2lkIDAhPT1Tay5idWlsdGluLnN0ciYmZS5oYXNPd25Qcm9wZXJ0eShcInRwJGRvY1wiKSYmIWUuaGFzT3duUHJvcGVydHkoXCJfX2RvY19fXCIpJiYoYT1lLnRwJGRvY3x8bnVsbCxlLl9fZG9jX189XCJzdHJpbmdcIj09PXR5cGVvZiBhP25ldyBTay5idWlsdGluLnN0cihhKTpTay5idWlsdGluLm5vbmUubm9uZSQpO3JldHVybiBjfTtTay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3M9ZnVuY3Rpb24oYSxiKXtTay5hc3NlcnRzLmFzc2VydChiLmhhc093blByb3BlcnR5KFwiY29uc3RydWN0b3JcIiksXCJtdXN0IHByb3ZpZGUgYSBjb25zdHJ1Y3RvclwiKTtiLnNsb3RzPWIuc2xvdHN8fHt9O2Iuc2xvdHMudHAkaXRlcj1Tay5nZW5lcmljLnNlbGZJdGVyO2Iuc2xvdHMudHAkaXRlcm5leHQ9Yi5zbG90cy50cCRpdGVybmV4dHx8Yi5pdGVybmV4dDtiLnNsb3RzLnRwJGdldGF0dHI9Yi5zbG90cy50cCRnZXRhdHRyfHxcblNrLmdlbmVyaWMuZ2V0QXR0cjthPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoYSxiKTtTay5hYnN0ci5idWlsdCRpdGVyYXRvcnMucHVzaChhKTtyZXR1cm4gYX07U2suYWJzdHIuYnVpbHQkaXRlcmF0b3JzPVtdO1NrLmFic3RyLnNldFVwTW9kdWxlTWV0aG9kcz1mdW5jdGlvbihhLGIsYyl7T2JqZWN0LmVudHJpZXMoYykuZm9yRWFjaCgoW2MsZF0pPT57ZC4kbmFtZT1kLiRuYW1lfHxjO2JbY109bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKGQsbnVsbCxhKX0pfTtTay5hYnN0ci5zdXBlckNvbnN0cnVjdG9yPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7YS5wcm90b3R5cGUudHAkYmFzZS5hcHBseShiLGQpfX0sZnVuY3Rpb24obSxxKXtjb25zdCBhPW5ldyBNYXA7U2suYnVpbHRpbi5vYmplY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIm9iamVjdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5vYmplY3QsXCJiYWQgY2FsbCB0byBvYmplY3QsIHVzZSAnbmV3J1wiKX0sYmFzZTpudWxsLHNsb3RzOnt0cCRuZXcoYSxiKXtpZihhLmxlbmd0aHx8YiYmYi5sZW5ndGgpe2lmKHRoaXMudHAkbmV3IT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJG5ldyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvYmplY3QuX19uZXdfXygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgdHlwZSB0byBpbnN0YW50aWF0ZSlcIik7aWYodGhpcy50cCRpbml0PT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJGluaXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKCkgdGFrZXMgbm8gYXJndW1lbnRzXCIpO31yZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3J9LHRwJGluaXQoYSxiKXtpZihhLmxlbmd0aHx8YiYmYi5sZW5ndGgpe2lmKHRoaXMudHAkaW5pdCE9PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRpbml0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9iamVjdC5fX2luaXRfXygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSlcIik7XG5pZih0aGlzLnRwJG5ldz09PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRuZXcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiLl9faW5pdF9fKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSBpbnN0YW5jZSB0byBpbml0aWFsaXplKVwiKTt9fSx0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRzZXRhdHRyOlNrLmdlbmVyaWMuc2V0QXR0ciwkcigpe2NvbnN0IGE9U2suYWJzdHIubG9va3VwU3BlY2lhbCh0aGlzLFNrLmJ1aWx0aW4uc3RyLiRtb2R1bGUpO2xldCBiPVwiXCI7YSYmU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSYmKGI9YS52K1wiLlwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPFwiK2IrU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIgb2JqZWN0PlwiKX0sdHAkc3RyKCl7cmV0dXJuIHRoaXMuJHIoKX0sdHAkaGFzaCgpe2xldCBjPWEuZ2V0KHRoaXMpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7XG5jPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUi1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUi8yKTthLnNldCh0aGlzLGMpO3JldHVybiBjfSx0cCRyaWNoY29tcGFyZShhLGIpe3N3aXRjaChiKXtjYXNlIFwiRXFcIjphPXRoaXM9PT1hfHxTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDticmVhaztjYXNlIFwiTm90RXFcIjphPXRoaXMudHAkcmljaGNvbXBhcmUoYSxcIkVxXCIpO2EhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCYmKGE9IVNrLm1pc2NldmFsLmlzVHJ1ZShhKSk7YnJlYWs7ZGVmYXVsdDphPVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfXJldHVybiBhfSx0cCRkb2M6XCJUaGUgbW9zdCBiYXNlIHR5cGVcIn0sZ2V0c2V0czp7X19jbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMub2IkdHlwZX0sJHNldChhKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGRlbGV0ZSBfX2NsYXNzX18gYXR0cmlidXRlXCIpO1xuaWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2NsYXNzX18gbXVzdCBiZSBzZXQgdG8gYSBjbGFzcywgbm90ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0XCIpO2NvbnN0IGI9dGhpcy5vYiR0eXBlO2lmKCEoYi4kaXNTdWJUeXBlKFNrLmJ1aWx0aW4ubW9kdWxlKSYmYS4kaXNTdWJUeXBlKFNrLmJ1aWx0aW4ubW9kdWxlKXx8dm9pZCAwIT09Yi5zayRrbGFzcyYmdm9pZCAwIT09YS5zayRrbGFzcykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiIF9fY2xhc3NfXyBhc3NpZ25tZW50IG9ubHkgc3VwcG9ydGVkIGZvciBoZWFwIHR5cGVzIG9yIE1vZHVsZVR5cGUgc3ViY2xhc3Nlc1wiKTtpZihhLnByb3RvdHlwZS5zayRidWlsdGluQmFzZSE9PXRoaXMuc2skYnVpbHRpbkJhc2UpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19jbGFzc19fIGFzc2lnbm1lbnQ6ICdcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcblwiJyBvYmplY3QgbGF5b3V0IGRpZmZlcnMgZnJvbSAnXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIidcIik7T2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsYS5wcm90b3R5cGUpfSwkZG9jOlwidGhlIG9iamVjdCdzIGNsYXNzXCJ9fSxtZXRob2RzOntfX2Rpcl9fOnskbWV0aDpmdW5jdGlvbigpe2xldCBhPVtdO2lmKHRoaXMuJGQpaWYodGhpcy4kZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdClhPXRoaXMuJGQuc2skYXNhcnJheSgpO2Vsc2UgZm9yKHZhciBiIGluIHRoaXMuJGQpYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cihiKSk7Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi50eXBlLnByb3RvdHlwZS5fX2Rpcl9fLFt0aGlzLm9iJHR5cGVdKTthLnB1c2goLi4uYi52KTtiLnY9YTtyZXR1cm4gYn0sJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJEZWZhdWx0IGRpcigpIGltcGxlbWVudGF0aW9uLlwifSxfX2Zvcm1hdF9fOnskbWV0aChhKXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtpZihhPVxuU2suZmZpLnJlbWFwVG9KcyhhKSxcIlwiIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiZm9ybWF0IHNwZWMgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9ZWxzZXtpZihTay5fX2Z1dHVyZV9fLmV4Y2VwdGlvbnMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZm9ybWF0KCkgYXJndW1lbnQgMiBtdXN0IGJlIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQgZXhwZWN0cyBhcmcgMiB0byBiZSBzdHJpbmcgb3IgdW5pY29kZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9cmV0dXJuIHRoaXMudHAkc3RyKCl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiRGVmYXVsdCBvYmplY3QgZm9ybWF0dGVyLlwifX0scHJvdG86e3ZhbHVlT2Y6T2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHAkc3RyKCkudn0saGFzT3duUHJvcGVydHk6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbmhwJHR5cGU6dm9pZCAwLHNrJGF0dHJFcnJvcigpe3JldHVyblwiJ1wiK3RoaXMudHAkbmFtZStcIicgb2JqZWN0XCJ9fX0pO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoXCJ0eXBlXCIsU2suYnVpbHRpbi50eXBlLFNrLmJ1aWx0aW4ub2JqZWN0KTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm8oU2suYnVpbHRpbi50eXBlKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjKXtTay5hYnN0ci5jaGVja05vQXJncyh0aGlzLiRuYW1lLGIsYyk7YT10aGlzLmNhbGwoYSk7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gYyhhLGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy4kbmFtZSxiLGMpO2E9dGhpcy5jYWxsKGEsYlswXSk7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gYihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLFxuYiwxLDIpO2E9dGhpcy5jYWxsKGEsLi4uYik7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gZShhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGIsMiwyKTt0aGlzLmNhbGwoYSxiWzBdLGJbMV0pO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9ZnVuY3Rpb24gZihhLGIsZCl7YT1jLmNhbGwodGhpcyxhLGIsZCk7cmV0dXJuIGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD9hOm5ldyBTay5idWlsdGluLmJvb2woYSl9ZnVuY3Rpb24gbChhLGIpe3JldHVybiBmdW5jdGlvbihjLGQsZSl7Yz1hLmNhbGwodGhpcyxjLGQsZSk7cmV0dXJuIGIoYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgYj1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYixcbltdKX19ZnVuY3Rpb24gZChhLGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGY9ZS50cCRkZXNjcl9nZXQ/ZS50cCRkZXNjcl9nZXQodGhpcyk6ZTtmPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShmLFtdKTtpZighYihmKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIiBzaG91bGQgcmV0dXJuIFwiK2MrXCIgKHJldHVybmVkIFwiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiKVwiKTtyZXR1cm4gdm9pZCAwIT09ZD9kKGYpOmZ9fX1mdW5jdGlvbiBnKGEpe3JldHVybiBmdW5jdGlvbihiKXtjb25zdCBjPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtiXSl9fWZ1bmN0aW9uIG4oYSxiKXtsZXQgYz10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoU2suYnVpbHRpbi5zdHIuJGdldGF0dHJpYnV0ZSk7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXJldHVybiBjLmQkd3JhcHBlZC5jYWxsKHRoaXMsXG5hLGIpO2MudHAkZGVzY3JfZ2V0JiYoYz1jLnRwJGRlc2NyX2dldCh0aGlzKSk7Y29uc3QgZD1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW2FdKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KTtyZXR1cm4gYj9kOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhkKX1mdW5jdGlvbiBrKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGZ1bmN0aW9uKGQsZSxmKXtsZXQgZzt2b2lkIDA9PT1lPyhnPWIsYz1udWxsKTpnPWE7bGV0IGg9dGhpcy5vYiR0eXBlLiR0eXBlTG9va3VwKG5ldyBTay5idWlsdGluLnN0cihnKSk7aWYoaCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXJldHVybiBoLmQkd3JhcHBlZC5jYWxsKHRoaXMsZCxlKTtoLnRwJGRlc2NyX2dldCYmKGg9aC50cCRkZXNjcl9nZXQodGhpcykpO1xuaWYodm9pZCAwIT09aClkPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShoLHZvaWQgMD09PWU/W2RdOltkLGVdKTtlbHNle2lmKGMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBvYmplY3QgXCIrYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoZyk7fXJldHVybiBmP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX19ZnVuY3Rpb24gcChhLGIpe2xldCBjPWEub2IkdHlwZTtmb3IoO2MmJnZvaWQgMCE9PWMuc2ska2xhc3M7KWM9Yy5wcm90b3R5cGUudHAkYmFzZTtpZihjJiZjLnByb3RvdHlwZS50cCRzZXRhdHRyIT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBhcHBseSB0aGlzIFwiK2IuJG5hbWUrXCIgdG8gXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgb2JqZWN0XCIpO31Tay5zbG90cz1PYmplY3QuY3JlYXRlKG51bGwpO1xubT1Tay5zbG90cztTay5zbG90cy5fX2luaXRfXz17JG5hbWU6XCJfX2luaXRfX1wiLCRzbG90X25hbWU6XCJ0cCRpbml0XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7Yj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxiLGMpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGE9PntpZighU2suYnVpbHRpbi5jaGVja05vbmUoYSkmJnZvaWQgMCE9PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19pbml0X18oKSBzaG91bGQgcmV0dXJuIE5vbmUsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSl9fSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7dGhpcy5jYWxsKGEsYixjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKmFyZ3MsICoqa3dhcmdzKVwiLCRmbGFnczp7RmFzdENhbGw6ITB9LCRkb2M6XCJJbml0aWFsaXplIHNlbGYuICBTZWUgaGVscCh0eXBlKHNlbGYpKSBmb3IgYWNjdXJhdGUgc2lnbmF0dXJlLlwifTtcbm0uX19uZXdfXz17JG5hbWU6XCJfX25ld19fXCIsJHNsb3RfbmFtZTpcInRwJG5ld1wiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7Y29uc3QgYj1mdW5jdGlvbihiLGMpe2xldCBkPWE7YS50cCRkZXNjcl9nZXQmJihkPWEudHAkZGVzY3JfZ2V0KG51bGwsdGhpcy5jb25zdHJ1Y3RvcikpO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxbdGhpcy5jb25zdHJ1Y3RvciwuLi5iXSxjKX07Yi5zayRzdGF0aWNfbmV3PSExO3JldHVybiBifSwkd3JhcHBlcjpudWxsLCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqYXJncywgKiprd2FyZ3MpXCIsJGZsYWdzOntGYXN0Q2FsbDohMH0sJGRvYzpcIkNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IG9iamVjdC5cIn07bS5fX2NhbGxfXz17JG5hbWU6XCJfX2NhbGxfX1wiLCRzbG90X25hbWU6XCJ0cCRjYWxsXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOlxuYTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsYixjKX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXthPWEudHAkY2FsbChiLGMpO3JldHVybiB2b2lkIDA9PT1hP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDphfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKmFyZ3MsICoqa3dhcmdzKVwiLCRmbGFnczp7RmFzdENhbGw6ITB9LCRkb2M6XCJDYWxsIHNlbGYgYXMgYSBmdW5jdGlvbi5cIn07bS5fX3JlcHJfXz17JG5hbWU6XCJfX3JlcHJfX1wiLCRzbG90X25hbWU6XCIkclwiLCRzbG90X2Z1bmM6ZChcIl9fcmVwcl9fXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyxcInN0clwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHJlcHIoc2VsZikuXCJ9O20uX19zdHJfXz17JG5hbWU6XCJfX3N0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHN0clwiLCRzbG90X2Z1bmM6ZChcIl9fc3RyX19cIixTay5idWlsdGluLmNoZWNrU3RyaW5nLFxuXCJzdHJcIiksJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlJldHVybiBzdHIoc2VsZikuXCJ9O3ZhciB1PWQoXCJfX2hhc2hfX1wiLFNrLmJ1aWx0aW4uY2hlY2tJbnQsXCJpbnRcIixhPT5cIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnY6YS50cCRoYXNoKCkpO20uX19oYXNoX189eyRuYW1lOlwiX19oYXNoX19cIiwkc2xvdF9uYW1lOlwidHAkaGFzaFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/U2suYnVpbHRpbi5ub25lLm5vbmUkOnUoYSl9LCR3cmFwcGVyOmwoYSxhPT5uZXcgU2suYnVpbHRpbi5pbnRfKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlJldHVybiBoYXNoKHNlbGYpLlwifTttLl9fZ2V0YXR0cmlidXRlX189eyRuYW1lOlwiX19nZXRhdHRyaWJ1dGVfX1wiLCRzbG90X25hbWU6XCJ0cCRnZXRhdHRyXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYSxcbmIpe2xldCBjPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChTay5idWlsdGluLnN0ci4kZ2V0YXR0cik7aWYodm9pZCAwPT09YylyZXR1cm4gbi5jYWxsKHRoaXMsYSxiKTtjb25zdCBkPVNrLm1pc2NldmFsLmNoYWluKG4uY2FsbCh0aGlzLGEsYiksYj0+U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PntpZih2b2lkIDAhPT1iKXJldHVybiBiO2MudHAkZGVzY3JfZ2V0JiYoYz1jLnRwJGRlc2NyX2dldCh0aGlzKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFthXSl9LGZ1bmN0aW9uKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSkpO3JldHVybiBiP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKHRoaXMuJG5hbWUsYixjKTtiPWJbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShiKStcIidcIik7Yz10aGlzLmNhbGwoYSxiKTtpZih2b2lkIDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGhhcyBubyBhdHRyaWJ1dGUgXCIrYi4kanNzdHIoKSk7cmV0dXJuIGN9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGdldGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19nZXRhdHRyX189eyRuYW1lOlwiX19nZXRhdHRyX19cIiwkc2xvdF9uYW1lOlwidHAkZ2V0YXR0clwiLCRzbG90X2Z1bmM6bS5fX2dldGF0dHJpYnV0ZV9fLiRzbG90X2Z1bmMsJHdyYXBwZXI6bnVsbCwkdGV4dHNpZzpcIigkc2VsZiwgbmFtZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBnZXRhdHRyKHNlbGYsIG5hbWUpLlwifTttLl9fc2V0YXR0cl9fPXskbmFtZTpcIl9fc2V0YXR0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHNldGF0dHJcIiwkc2xvdF9mdW5jOmsoXCJfX3NldGF0dHJfX1wiLFxuXCJfX2RlbGF0dHJfX1wiKSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGIsMiwyKTtwKGEsdGhpcyk7dGhpcy5jYWxsKGEsYlswXSxiWzFdKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkdGV4dHNpZzpcIigkc2VsZiwgbmFtZSwgdmFsdWUsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkZG9jOlwiSW1wbGVtZW50IHNldGF0dHIoc2VsZiwgbmFtZSwgdmFsdWUpLlwifTttLl9fZGVsYXR0cl9fPXskbmFtZTpcIl9fZGVsYXR0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHNldGF0dHJcIiwkc2xvdF9mdW5jOm0uX19zZXRhdHRyX18uJHNsb3RfZnVuYywkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy4kbmFtZSxiLGMpO3AoYSx0aGlzKTt0aGlzLmNhbGwoYSxiWzBdKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbiR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IGRlbGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19nZXRfXz17JG5hbWU6XCJfX2dldF9fXCIsJHNsb3RfbmFtZTpcInRwJGRlc2NyX2dldFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtudWxsPT09YiYmKGI9U2suYnVpbHRpbi5ub25lLm5vbmUkKTtudWxsPT1jJiYoYz1Tay5idWlsdGluLm5vbmUubm9uZSQpO2NvbnN0IGU9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShlLFtiLGNdKTtyZXR1cm4gZD9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuJG5hbWUsXG5iLDEsMik7Yz1iWzBdO2I9YlsxXTtjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYz1udWxsKTtiPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYj1udWxsKTtpZihudWxsPT09YiYmbnVsbD09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19nZXRfXyhOb25lLCBOb25lKSBpcyBpbnZhbGlkXCIpO3JldHVybiB0aGlzLmNhbGwoYSxjLGIpfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5zdGFuY2UsIG93bmVyLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJGRvYzpcIlJldHVybiBhbiBhdHRyaWJ1dGUgb2YgaW5zdGFuY2UsIHdoaWNoIGlzIG9mIHR5cGUgb3duZXIuXCJ9O20uX19zZXRfXz17JG5hbWU6XCJfX3NldF9fXCIsJHNsb3RfbmFtZTpcInRwJGRlc2NyX3NldFwiLCRzbG90X2Z1bmM6ayhcIl9fc2V0X19cIixcIl9fZGVsZXRlX19cIiksJHdyYXBwZXI6ZSwkdGV4dHNpZzpcIigkc2VsZiwgaW5zdGFuY2UsIHZhbHVlLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sXG4kZG9jOlwiU2V0IGFuIGF0dHJpYnV0ZSBvZiBpbnN0YW5jZSB0byB2YWx1ZS5cIn07bS5fX2RlbGV0ZV9fPXskbmFtZTpcIl9fZGVsZXRlX19cIiwkc2xvdF9uYW1lOlwidHAkZGVzY3Jfc2V0XCIsJHNsb3RfZnVuYzptLl9fc2V0X18uJHNsb3RfZnVuYywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCBpbnN0YW5jZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkRlbGV0ZSBhbiBhdHRyaWJ1dGUgb2YgaW5zdGFuY2UuXCJ9O20uX19lcV9fPXskbmFtZTpcIl9fZXFfX1wiLCRzbG90X25hbWU6XCJvYiRlcVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPT12YWx1ZS5cIn07bS5fX2dlX189eyRuYW1lOlwiX19nZV9fXCIsJHNsb3RfbmFtZTpcIm9iJGdlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSxcbiRkb2M6XCJSZXR1cm4gc2VsZj49dmFsdWUuXCJ9O20uX19ndF9fPXskbmFtZTpcIl9fZ3RfX1wiLCRzbG90X25hbWU6XCJvYiRndFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPnZhbHVlLlwifTttLl9fbGVfXz17JG5hbWU6XCJfX2xlX19cIiwkc2xvdF9uYW1lOlwib2IkbGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6ZiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZjw9dmFsdWUuXCJ9O20uX19sdF9fPXskbmFtZTpcIl9fbHRfX1wiLCRzbG90X25hbWU6XCJvYiRsdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPHZhbHVlLlwifTttLl9fbmVfXz17JG5hbWU6XCJfX25lX19cIiwkc2xvdF9uYW1lOlwib2IkbmVcIixcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmIT12YWx1ZS5cIn07bS5fX2l0ZXJfXz17JG5hbWU6XCJfX2l0ZXJfX1wiLCRzbG90X25hbWU6XCJ0cCRpdGVyXCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJJbXBsZW1lbnQgaXRlcihzZWxmKS5cIn07bS5fX25leHRfXz17JG5hbWU6XCJfX25leHRfX1wiLCRzbG90X25hbWU6XCJ0cCRpdGVybmV4dFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YSxkPVNrLm1pc2NldmFsLnRyeUNhdGNoKCgpPT5Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbikpdGhyb3cgYTtcbn0pO3JldHVybiBiP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuJG5hbWUsYixjKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYS50cCRpdGVybmV4dCghMCksYT0+e2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbjtyZXR1cm4gYX0pfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIkltcGxlbWVudCBuZXh0KHNlbGYpLlwifTttLl9fbGVuX189eyRuYW1lOlwiX19sZW5fX1wiLCRzbG90X25hbWU6XCJzcSRsZW5ndGhcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtjb25zdCBjPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7aWYoYilyZXR1cm4gYj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbXSksU2subWlzY2V2YWwuY2hhaW4oYixcbmE9PlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpKTtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtyZXR1cm4gU2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYil9fSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gbGVuKHNlbGYpLlwifTttLl9fY29udGFpbnNfXz17JG5hbWU6XCJfX2NvbnRhaW5zX19cIiwkc2xvdF9uYW1lOlwic3EkY29udGFpbnNcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtiXSk7Yj1Tay5taXNjZXZhbC5jaGFpbihiLGE9PlNrLm1pc2NldmFsLmlzVHJ1ZShhKSk7cmV0dXJuIGIuJGlzU3VzcGVuc2lvbj9jP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpOlxuYn19LCR3cmFwcGVyOmwoYyxhPT5uZXcgU2suYnVpbHRpbi5ib29sKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGtleSBpbiBzZWxmLlwifTttLl9fZ2V0aXRlbV9fPXskbmFtZTpcIl9fZ2V0aXRlbV9fXCIsJHNsb3RfbmFtZTpcIm1wJHN1YnNjcmlwdFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO2I9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW2JdKTtyZXR1cm4gYz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX19LCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmW2tleV0uXCJ9O20uX19zZXRpdGVtX189eyRuYW1lOlwiX19zZXRpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkYXNzX3N1YnNjcmlwdFwiLFxuJHNsb3RfZnVuYzprKFwiX19zZXRpdGVtX19cIixcIl9fZGVsaXRlbV9fXCIsXCJkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudFwiKSwkd3JhcHBlcjplLCR0ZXh0c2lnOlwiKCRzZWxmLCBrZXksIHZhbHVlLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJGRvYzpcIlNldCBzZWxmW2tleV0gdG8gdmFsdWUuXCJ9O20uX19kZWxpdGVtX189eyRuYW1lOlwiX19kZWxpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkYXNzX3N1YnNjcmlwdFwiLCRzbG90X2Z1bmM6bS5fX3NldGl0ZW1fXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkRlbGV0ZSBzZWxmW2tleV0uXCJ9O20uX19hZGRfXz17JG5hbWU6XCJfX2FkZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFkZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmK3ZhbHVlLlwifTtcbm0uX19yYWRkX189eyRuYW1lOlwiX19yYWRkX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2FkZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZStzZWxmLlwifTttLl9faWFkZF9fPXskbmFtZTpcIl9faWFkZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfYWRkXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYrPXZhbHVlLlwifTttLl9fc3ViX189eyRuYW1lOlwiX19zdWJfX1wiLCRzbG90X25hbWU6XCJuYiRzdWJ0cmFjdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmLXZhbHVlLlwifTttLl9fcnN1Yl9fPXskbmFtZTpcIl9fcnN1Yl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9zdWJ0cmFjdFwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlLXNlbGYuXCJ9O20uX19pbXVsX189eyRuYW1lOlwiX19pbXVsX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmKj12YWx1ZS5cIn07bS5fX211bF9fPXskbmFtZTpcIl9fbXVsX19cIiwkc2xvdF9uYW1lOlwibmIkbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZip2YWx1ZS5cIn07bS5fX3JtdWxfXz17JG5hbWU6XCJfX3JtdWxfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YyxcbiR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSpzZWxmLlwifTttLl9faXN1Yl9fPXskbmFtZTpcIl9faXN1Yl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2Vfc3VidHJhY3RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi09dmFsdWUuXCJ9O20uX19tb2RfXz17JG5hbWU6XCJfX21vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlbWFpbmRlclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmJXZhbHVlLlwifTttLl9fcm1vZF9fPXskbmFtZTpcIl9fcm1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9yZW1haW5kZXJcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsXG4kZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSVzZWxmLlwifTttLl9faW1vZF9fPXskbmFtZTpcIl9faW1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfcmVtYWluZGVyXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHZhbHVlJT1zZWxmLlwifTttLl9fZGl2bW9kX189eyRuYW1lOlwiX19kaXZtb2RfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZtb2RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gZGl2bW9kKHNlbGYsIHZhbHVlKS5cIn07bS5fX3JkaXZtb2RfXz17JG5hbWU6XCJfX3JkaXZtb2RfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfZGl2bW9kXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSxcbiRkb2M6XCJSZXR1cm4gZGl2bW9kKHZhbHVlLCBzZWxmKVwifTttLl9fcG9zX189eyRuYW1lOlwiX19wb3NfX1wiLCRzbG90X25hbWU6XCJuYiRwb3NpdGl2ZVwiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiK3NlbGZcIn07bS5fX25lZ19fPXskbmFtZTpcIl9fbmVnX19cIiwkc2xvdF9uYW1lOlwibmIkbmVnYXRpdmVcIiwkc2xvdF9mdW5jOmgsJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIi1zZWxmXCJ9O20uX19hYnNfXz17JG5hbWU6XCJfX2Fic19fXCIsJHNsb3RfbmFtZTpcIm5iJGFic1wiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiYWJzKHNlbGYpXCJ9O20uX19ib29sX189eyRuYW1lOlwiX19ib29sX19cIiwkc2xvdF9uYW1lOlwibmIkYm9vbFwiLCRzbG90X2Z1bmM6ZChcIl9fYm9vbF9fXCIsXG5Tay5idWlsdGluLmNoZWNrQm9vbCxcImJvb2xcIixhPT4wIT09YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uYm9vbChhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJzZWxmICE9IDBcIn07bS5fX2ludmVydF9fPXskbmFtZTpcIl9faW52ZXJ0X19cIiwkc2xvdF9uYW1lOlwibmIkaW52ZXJ0XCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJ+c2VsZlwifTttLl9fbHNoaWZ0X189eyRuYW1lOlwiX19sc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRsc2hpZnRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZjw8dmFsdWUuXCJ9O20uX19ybHNoaWZ0X189eyRuYW1lOlwiX19ybHNoaWZ0X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2xzaGlmdFwiLCRzbG90X2Z1bmM6ZyxcbiR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlPDxzZWxmLlwifTttLl9fcnNoaWZ0X189eyRuYW1lOlwiX19yc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRyc2hpZnRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZj4+dmFsdWUuXCJ9O20uX19ycnNoaWZ0X189eyRuYW1lOlwiX19ycnNoaWZ0X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3JzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZT4+c2VsZi5cIn07bS5fX2lsc2hpZnRfXz17JG5hbWU6XCJfX2lsc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX2xzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLFxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGY8PD12YWx1ZS5cIn07bS5fX2lyc2hpZnRfXz17JG5hbWU6XCJfX2lyc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX3JzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmPT4+dmFsdWUuXCJ9O20uX19hbmRfXz17JG5hbWU6XCJfX2FuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmJnZhbHVlLlwifTttLl9fcmFuZF9fPXskbmFtZTpcIl9fcmFuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmVsY3RlZF9hbmRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsXG4kZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSZzZWxmLlwifTttLl9faWFuZF9fPXskbmFtZTpcIl9faWFuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmJj12YWx1ZS5cIn07bS5fX3hvcl9fPXskbmFtZTpcIl9feG9yX19cIiwkc2xvdF9uYW1lOlwibmIkeG9yXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZedmFsdWUuXCJ9O20uX19yeG9yX189eyRuYW1lOlwiX19yeG9yX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3hvclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZV5zZWxmLlwifTtcbm0uX19peG9yX189eyRuYW1lOlwiX19peG9yX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV94b3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZl49dmFsdWUuXCJ9O20uX19vcl9fPXskbmFtZTpcIl9fb3JfX1wiLCRzbG90X25hbWU6XCJuYiRvclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmfHZhbHVlLlwifTttLl9fcm9yX189eyRuYW1lOlwiX19yb3JfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfb3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWV8c2VsZi5cIn07bS5fX2lvcl9fPXskbmFtZTpcIl9faW9yX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9vclwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGZ8PXZhbHVlLlwifTttLl9faW50X189eyRuYW1lOlwiX19pbnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnRcIiwkc2xvdF9mdW5jOmQoXCJfX2ludF9fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiaW50KHNlbGYpXCJ9O20uX19mbG9hdF9fPXskbmFtZTpcIl9fZmxvYXRfX1wiLCRzbG90X25hbWU6XCJuYiRmbG9hdFwiLCRzbG90X2Z1bmM6ZChcIl9fZmxvYXRfX1wiLFNrLmJ1aWx0aW4uY2hlY2tGbG9hdCxcImZsb2F0XCIpLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJmbG9hdChzZWxmKVwifTttLl9fZmxvb3JkaXZfXz17JG5hbWU6XCJfX2Zsb29yZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkZmxvb3JfZGl2aWRlXCIsXG4kc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZi8vdmFsdWUuXCJ9O20uX19yZmxvb3JkaXZfXz17JG5hbWU6XCJfX3JmbG9vcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWUvL3NlbGYuXCJ9O20uX19pZmxvb3JkaXZfXz17JG5hbWU6XCJfX2lmbG9vcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfZmxvb3JfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYvLz12YWx1ZS5cIn07bS5fX3RydWVkaXZfXz17JG5hbWU6XCJfX3RydWVkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZpZGVcIixcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmL3ZhbHVlLlwifTttLl9fcnRydWVkaXZfXz17JG5hbWU6XCJfX3J0cnVlZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZS9zZWxmLlwifTttLl9faXRydWVkaXZfXz17JG5hbWU6XCJfX2l0cnVlZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi89dmFsdWUuXCJ9O20uX19pbmRleF9fPXskbmFtZTpcIl9faW5kZXhfX1wiLCRzbG90X25hbWU6XCJuYiRpbmRleFwiLCRzbG90X2Z1bmM6ZChcIl9faW5kZXhfX1wiLFxuU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiLGE9PmEudiksJHdyYXBwZXI6bChhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYgY29udmVydGVkIHRvIGFuIGludGVnZXIsIGlmIHNlbGYgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBpbmRleCBpbnRvIGEgbGlzdC5cIn07bS5fX3Bvd19fPXskbmFtZTpcIl9fcG93X19cIiwkc2xvdF9uYW1lOlwibmIkcG93ZXJcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtyZXR1cm4gdm9pZCAwPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShkLFtiXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQsW2IsY10pfX0sJHdyYXBwZXI6YiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIG1vZD1Ob25lLCAvKVwiLCRmbGFnczp7TWluQXJnczoxLFxuTWF4QXJnczoyfSwkZG9jOlwiUmV0dXJuIHBvdyhzZWxmLCB2YWx1ZSwgbW9kKS5cIn07bS5fX3Jwb3dfXz17JG5hbWU6XCJfX3Jwb3dfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIiwkc2xvdF9mdW5jOm0uX19wb3dfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmIsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBtb2Q9Tm9uZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCRkb2M6XCJSZXR1cm4gcG93KHZhbHVlLCBzZWxmLCBtb2QpLlwifTttLl9faXBvd19fPXskbmFtZTpcIl9faXBvd19fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfcG93ZXJcIiwkc2xvdF9mdW5jOm0uX19wb3dfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmIsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBtb2Q9Tm9uZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCRkb2M6XCJJbXBsZW1lbnQgKio9XCJ9O20uX19tYXRtdWxfXz17JG5hbWU6XCJfX21hdG11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJG1hdHJpeF9tdWx0aXBseVwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZAdmFsdWUuXCJ9O20uX19ybWF0bXVsX189eyRuYW1lOlwiX19ybWF0bXVsX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX21hdHJpeF9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZUBzZWxmLlwifTttLl9faW1hdG11bF9fPXskbmFtZTpcIl9faW1hdG11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGZAPXZhbHVlLlwifTttLl9fbG9uZ19fPXskbmFtZTpcIl9fbG9uZ19fXCIsJHNsb3RfbmFtZTpcIm5iJGxvbmdcIixcbiRzbG90X2Z1bmM6ZChcIl9fbG9uZ19fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiaW50KHNlbGYpXCJ9O3ZhciBBLHQ9e25leHQ6eyRuYW1lOlwibmV4dFwiLCRzbG90X25hbWU6XCJ0cCRpdGVybmV4dFwiLCRzbG90X2Z1bmM6bS5fX25leHRfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOm0uX19uZXh0X18uJHdyYXBwZXIsJHRleHRzaWc6bS5fX25leHRfXy4kdGV4dHNpZywkZmxhZ3M6bS5fX25leHRfXy4kZmxhZ3N9LF9fbm9uemVyb19fOnskbmFtZTpcIl9fbm9uemVyb19fXCIsJHNsb3RfbmFtZTpcIm5iJGJvb2xcIiwkc2xvdF9mdW5jOmQoXCJfX25vbnplcm9fX1wiLFNrLmJ1aWx0aW4uY2hlY2tJbnQsXCJpbnRcIixhPT4wIT09YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uYm9vbChhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJ4Ll9fbm9uemVyb19fKCkgPD09PiB4ICE9IDBcIn0sXG5fX2Rpdl9fOnskbmFtZTpcIl9fZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIG90aGVyLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcInguX19kaXZfXyh5KSA8PT0+IHgveVwifSxfX3JkaXZfXzp7JG5hbWU6XCJfX3JkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIG90aGVyLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcInguX19yZGl2X18oeSkgPD09PiB4L3lcIn0sX19pZGl2X186eyRuYW1lOlwiX19pZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgb3RoZXIvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiaW1wbGVtZW50IHNlbGYgLz0gb3RoZXJcIn19O1NrLnN1YlNsb3RzPXttYWluX3Nsb3RzOk9iamVjdC5lbnRyaWVzKHt0cCRpbml0OlwiX19pbml0X19cIixcbnRwJGNhbGw6XCJfX2NhbGxfX1wiLCRyOlwiX19yZXByX19cIix0cCRzdHI6XCJfX3N0cl9fXCIsdHAkZ2V0YXR0cjpcIl9fZ2V0YXR0cmlidXRlX19cIix0cCRzZXRhdHRyOltcIl9fc2V0YXR0cl9fXCIsXCJfX2RlbGF0dHJfX1wiXSxvYiRlcTpcIl9fZXFfX1wiLG9iJG5lOlwiX19uZV9fXCIsb2IkbHQ6XCJfX2x0X19cIixvYiRsZTpcIl9fbGVfX1wiLG9iJGd0OlwiX19ndF9fXCIsb2IkZ2U6XCJfX2dlX19cIix0cCRkZXNjcl9nZXQ6XCJfX2dldF9fXCIsdHAkZGVzY3Jfc2V0OltcIl9fc2V0X19cIixcIl9fZGVsZXRlX19cIl0sdHAkaXRlcjpcIl9faXRlcl9fXCIsdHAkaXRlcm5leHQ6XCJfX25leHRfX1wifSksbnVtYmVyX3Nsb3RzOk9iamVjdC5lbnRyaWVzKHtuYiRhYnM6XCJfX2Fic19fXCIsbmIkbmVnYXRpdmU6XCJfX25lZ19fXCIsbmIkcG9zaXRpdmU6XCJfX3Bvc19fXCIsbmIkaW50OlwiX19pbnRfX1wiLG5iJGxvbmc6XCJfX2xvbmdfX1wiLG5iJGZsb2F0OlwiX19mbG9hdF9fXCIsbmIkYWRkOlwiX19hZGRfX1wiLG5iJHJlZmxlY3RlZF9hZGQ6XCJfX3JhZGRfX1wiLFxubmIkaW5wbGFjZV9hZGQ6XCJfX2lhZGRfX1wiLG5iJHN1YnRyYWN0OlwiX19zdWJfX1wiLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpcIl9fcnN1Yl9fXCIsbmIkaW5wbGFjZV9zdWJ0cmFjdDpcIl9faXN1Yl9fXCIsbmIkbXVsdGlwbHk6XCJfX211bF9fXCIsbmIkcmVmbGVjdGVkX211bHRpcGx5OlwiX19ybXVsX19cIixuYiRpbnBsYWNlX211bHRpcGx5OlwiX19pbXVsX19cIixuYiRmbG9vcl9kaXZpZGU6XCJfX2Zsb29yZGl2X19cIixuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlOlwiX19yZmxvb3JkaXZfX1wiLG5iJGlucGxhY2VfZmxvb3JfZGl2aWRlOlwiX19pZmxvb3JkaXZfX1wiLG5iJGludmVydDpcIl9faW52ZXJ0X19cIixuYiRyZW1haW5kZXI6XCJfX21vZF9fXCIsbmIkcmVmbGVjdGVkX3JlbWFpbmRlcjpcIl9fcm1vZF9fXCIsbmIkaW5wbGFjZV9yZW1haW5kZXI6XCJfX2ltb2RfX1wiLG5iJGRpdm1vZDpcIl9fZGl2bW9kX19cIixuYiRyZWZsZWN0ZWRfZGl2bW9kOlwiX19yZGl2bW9kX19cIixuYiRwb3dlcjpcIl9fcG93X19cIixuYiRyZWZsZWN0ZWRfcG93ZXI6XCJfX3Jwb3dfX1wiLFxubmIkaW5wbGFjZV9wb3dlcjpcIl9faXBvd19fXCIsbmIkZGl2aWRlOlwiX190cnVlZGl2X19cIixuYiRyZWZsZWN0ZWRfZGl2aWRlOlwiX19ydHJ1ZWRpdl9fXCIsbmIkaW5wbGFjZV9kaXZpZGU6XCJfX2l0cnVlZGl2X19cIixuYiRib29sOlwiX19ib29sX19cIixuYiRhbmQ6XCJfX2FuZF9fXCIsbmIkcmVmbGVjdGVkX2FuZDpcIl9fcmFuZF9fXCIsbmIkaW5wbGFjZV9hbmQ6XCJfX2lhbmRfX1wiLG5iJG9yOlwiX19vcl9fXCIsbmIkcmVmbGVjdGVkX29yOlwiX19yb3JfX1wiLG5iJGlucGxhY2Vfb3I6XCJfX2lvcl9fXCIsbmIkeG9yOlwiX194b3JfX1wiLG5iJHJlZmxlY3RlZF94b3I6XCJfX3J4b3JfX1wiLG5iJGlucGxhY2VfeG9yOlwiX19peG9yX19cIixuYiRsc2hpZnQ6XCJfX2xzaGlmdF9fXCIsbmIkcmVmbGVjdGVkX2xzaGlmdDpcIl9fcmxzaGlmdF9fXCIsbmIkcnNoaWZ0OlwiX19yc2hpZnRfX1wiLG5iJHJlZmxlY3RlZF9yc2hpZnQ6XCJfX3Jyc2hpZnRfX1wiLG5iJGlucGxhY2VfbHNoaWZ0OlwiX19pbHNoaWZ0X19cIixuYiRpbnBsYWNlX3JzaGlmdDpcIl9faXJzaGlmdF9fXCIsXG5uYiRtYXRyaXhfbXVsdGlwbHk6XCJfX21hdG11bF9fXCIsbmIkcmVmbGVjdGVkX21hdHJpeF9tdWx0aXBseTpcIl9fcm1hdG11bF9fXCIsbmIkaW5wbGFjZV9tYXRyaXhfbXVsdGlwbHk6XCJfX2ltYXRtdWxfX1wifSksc2VxdWVuY2VfYW5kX21hcHBpbmdfc2xvdHM6T2JqZWN0LmVudHJpZXMoe3NxJGxlbmd0aDpcIl9fbGVuX19cIixzcSRjb250YWluczpcIl9fY29udGFpbnNfX1wiLG1wJHN1YnNjcmlwdDpcIl9fZ2V0aXRlbV9fXCIsbXAkYXNzX3N1YnNjcmlwdDpbXCJfX3NldGl0ZW1fX1wiLFwiX19kZWxpdGVtX19cIl0sbmIkYWRkOlwiX19hZGRfX1wiLG5iJG11bHRpcGx5OlwiX19tdWxfX1wiLG5iJHJlZmxlY3RlZF9tdWx0aXBseTpcIl9fcm11bF9fXCIsbmIkaW5wbGFjZV9hZGQ6XCJfX2lhZGRfX1wiLG5iJGlucGxhY2VfbXVsdGlwbHk6XCJfX2ltdWxfX1wifSl9O1NrLnJlZmxlY3RlZE51bWJlclNsb3RzPXtuYiRhZGQ6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9hZGRcIn0sbmIkc3VidHJhY3Q6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9zdWJ0cmFjdFwiLFxuc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRzdWJ0cmFjdCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJG11bHRpcGx5OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIn0sbmIkZGl2aWRlOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRkaXZpZGUodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRmbG9vcl9kaXZpZGU6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGZsb29yX2RpdmlkZSh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LFxubmIkcmVtYWluZGVyOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcmVtYWluZGVyXCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRyZW1haW5kZXIodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRkaXZtb2Q6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9kaXZtb2RcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGRpdm1vZCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJHBvd2VyOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIixzbG90OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkcG93ZXIodGhpcyxiKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJGFuZDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2FuZFwifSxcbm5iJG9yOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfb3JcIn0sbmIkeG9yOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfeG9yXCJ9LG5iJGxzaGlmdDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2xzaGlmdFwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkbHNoaWZ0KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkcnNoaWZ0OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcnNoaWZ0XCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRyc2hpZnQodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRtYXRyaXhfbXVsdGlwbHk6e3JlZmxlY3RlZDpcIm5iJHJlZmxleHRlZF9tYXRyaXhfbXVsdGlwbHlcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9cbmEubmIkbWF0cml4X211bHRpcGx5KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX19O1NrLnNlcXVlbmNlQW5kTWFwcGluZ1Nsb3RzPXtzcSRjb25jYXQ6W1wibmIkYWRkXCJdLHNxJHJlcGVhdDpbXCJuYiRtdWx0aXBseVwiLFwibmIkcmVmbGVjdGVkX211bHRpcGx5XCJdLG1wJGxlbmd0aDpbXCJzcSRsZW5ndGhcIl0sc3EkaW5wbGFjZV9yZXBlYXQ6W1wibmIkaW5wbGFjZV9tdWx0aXBseVwiXSxzcSRpbnBsYWNlX2NvbmNhdDpbXCJuYiRpbnBsYWNlX2FkZFwiXX07U2suZHVuZGVyVG9Ta3VscHQ9e19fcmVwcl9fOlwiJHJcIixfX3N0cl9fOlwidHAkc3RyXCIsX19pbml0X186XCJ0cCRpbml0XCIsX19uZXdfXzpcInRwJG5ld1wiLF9faGFzaF9fOlwidHAkaGFzaFwiLF9fY2FsbF9fOlwidHAkY2FsbFwiLF9faXRlcl9fOlwidHAkaXRlclwiLF9fbmV4dF9fOlwidHAkaXRlcm5leHRcIixfX2VxX186XCJvYiRlcVwiLF9fbmVfXzpcIm9iJG5lXCIsX19sdF9fOlwib2IkbHRcIixfX2xlX186XCJvYiRsZVwiLFxuX19ndF9fOlwib2IkZ3RcIixfX2dlX186XCJvYiRnZVwiLF9fYWJzX186XCJuYiRhYnNcIixfX25lZ19fOlwibmIkbmVnYXRpdmVcIixfX3Bvc19fOlwibmIkcG9zaXRpdmVcIixfX2ludF9fOlwibmIkaW50XCIsX19mbG9hdF9fOlwibmIkZmxvYXRcIixfX2FkZF9fOlwibmIkYWRkXCIsX19yYWRkX186XCJuYiRyZWZsZWN0ZWRfYWRkXCIsX19pYWRkX186XCJuYiRpbnBsYWNlX2FkZFwiLF9fc3ViX186XCJuYiRzdWJ0cmFjdFwiLF9fcnN1Yl9fOlwibmIkcmVmbGVjdGVkX3N1YnRyYWN0XCIsX19pc3ViX186XCJuYiRpbnBsYWNlX3N1YnRyYWN0XCIsX19tdWxfXzpcIm5iJG11bHRpcGx5XCIsX19ybXVsX186XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIixfX2ltdWxfXzpcIm5iJGlucGxhY2VfbXVsdGlwbHlcIixfX3RydWVkaXZfXzpcIm5iJGRpdmlkZVwiLF9fcnRydWVkaXZfXzpcIm5iJHJlZmxlY3RlZF9kaXZpZGVcIixfX2l0cnVlZGl2X186XCJuYiRpbnBsYWNlX2RpdmlkZVwiLF9fZmxvb3JkaXZfXzpcIm5iJGZsb29yX2RpdmlkZVwiLF9fcmZsb29yZGl2X186XCJuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlXCIsXG5fX2lmbG9vcmRpdl9fOlwibmIkaW5wbGFjZV9mbG9vcl9kaXZpZGVcIixfX2ludmVydF9fOlwibmIkaW52ZXJ0XCIsX19tb2RfXzpcIm5iJHJlbWFpbmRlclwiLF9fcm1vZF9fOlwibmIkcmVmbGVjdGVkX3JlbWFpbmRlclwiLF9faW1vZF9fOlwibmIkaW5wbGFjZV9yZW1haW5kZXJcIixfX2Rpdm1vZF9fOlwibmIkZGl2bW9kXCIsX19yZGl2bW9kX186XCJuYiRyZWZsZWN0ZWRfZGl2bW9kXCIsX19wb3dfXzpcIm5iJHBvd2VyXCIsX19ycG93X186XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIixfX2lwb3dfXzpcIm5iJGlucGxhY2VfcG93ZXJcIixfX2Jvb2xfXzpcIm5iJGJvb2xcIixfX2xvbmdfXzpcIm5iJGxvbmdcIixfX2xzaGlmdF9fOlwibmIkbHNoaWZ0XCIsX19ybHNoaWZ0X186XCJuYiRyZWZsZWN0ZWRfbHNoaWZ0XCIsX19pbHNoaWZ0X186XCJuYiRpbnBsYWNlX2xzaGlmdFwiLF9fcnNoaWZ0X186XCJuYiRyc2hpZnRcIixfX3Jyc2hpZnRfXzpcIm5iJHJlZmxlY3RlZF9yc2hpZnRcIixfX2lyc2hpZnRfXzpcIm5iJGlucGxhY2VfcnNoaWZ0XCIsXG5fX2FuZF9fOlwibmIkYW5kXCIsX19yYW5kX186XCJuYiRyZWZsZWN0ZWRfYW5kXCIsX19pYW5kX186XCJuYiRpbnBsYWNlX2FuZFwiLF9fb3JfXzpcIm5iJG9yXCIsX19yb3JfXzpcIm5iJHJlZmxlY3RlZF9vclwiLF9faW9yX186XCJuYiRpbnBsYWNlX29yXCIsX194b3JfXzpcIm5iJHhvclwiLF9fcnhvcl9fOlwibmIkcmVmbGVjdGVkX3hvclwiLF9faXhvcl9fOlwibmIkaW5wbGFjZV94b3JcIixfX21hdG11bF9fOlwibmIkbWF0cml4X211bHRpcGx5XCIsX19ybWF0bXVsX186XCJuYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5XCIsX19pbWF0bXVsX186XCJuYiRpbnBsYWNlX21hdHJpeF9tdWx0aXBseVwiLF9fZ2V0X186XCJ0cCRkZXNjcl9nZXRcIixfX3NldF9fOlwidHAkZGVzY3Jfc2V0XCIsX19kZWxldGVfXzpcInRwJGRlc2NyX3NldFwiLF9fZ2V0YXR0cmlidXRlX186XCJ0cCRnZXRhdHRyXCIsX19nZXRhdHRyX186XCJ0cCRnZXRhdHRyXCIsX19zZXRhdHRyX186XCJ0cCRzZXRhdHRyXCIsX19kZWxhdHRyX186XCJ0cCRzZXRhdHRyXCIsX19sZW5fXzpcInNxJGxlbmd0aFwiLFxuX19jb250YWluc19fOlwic3EkY29udGFpbnNcIixfX2dldGl0ZW1fXzpcIm1wJHN1YnNjcmlwdFwiLF9fc2V0aXRlbV9fOlwibXAkYXNzX3N1YnNjcmlwdFwiLF9fZGVsaXRlbV9fOlwibXAkYXNzX3N1YnNjcmlwdFwifTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cER1bmRlck1ldGhvZHNcIixTay5zZXR1cER1bmRlck1ldGhvZHMpO1NrLnNldHVwRHVuZGVyTWV0aG9kcz1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYixjKXtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgZT1hW2RdLnByb3RvdHlwZTtlLmhhc093blByb3BlcnR5KGMpfHwoZVtjXT1lW2JdLGRlbGV0ZSBlW2JdKX19dmFyIGM9U2suc2xvdHM7aWYoIWF8fHZvaWQgMCE9PUEpe3ZhciBkPVNrLmFic3RyLmJ1aWx0JGl0ZXJhdG9ycyxlPVtTay5idWlsdGluLmludF8sU2suYnVpbHRpbi5sbmcsU2suYnVpbHRpbi5mbG9hdF8sU2suYnVpbHRpbi5jb21wbGV4XSxmPVNrLnN1YlNsb3RzLm51bWJlcl9zbG90cyxnPVNrLnN1YlNsb3RzLm1haW5fc2xvdHMsXG5oPWcuZmluZEluZGV4KGE9PlwidHAkaXRlcm5leHRcIj09PWFbMF0pLGs9Zi5maW5kSW5kZXgoYT0+XCJuYiRib29sXCI9PT1hWzBdKSxsPVNrLmR1bmRlclRvU2t1bHB0O2lmKGEpe2wuX19ib29sX189XCJuYiRib29sXCI7bC5fX25leHRfXz1cInRwJGl0ZXJuZXh0XCI7ZGVsZXRlIGwuX19ub256ZXJvX187ZGVsZXRlIGwuX19kaXZfXztkZWxldGUgbC5fX3JkaXZfXztkZWxldGUgbC5fX2lkaXZfXztkZWxldGUgbC5uZXh0O2ZvcihsZXQgYSBpbiBBKWNbYV09QVthXTtmb3IobGV0IGEgaW4gdClkZWxldGUgY1thXTtmb3IoYT0wO2E8ZS5sZW5ndGg7YSsrKWM9ZVthXS5wcm90b3R5cGUsZGVsZXRlIGMuX19kaXZfXyxkZWxldGUgYy5fX3JkaXZfXztnW2hdWzFdPVwiX19uZXh0X19cIjtmW2tdWzFdPVwiX19ib29sX19cIjtiKGQsXCJuZXh0XCIsXCJfX25leHRfX1wiKTtiKGUsXCJfX2Jvb2xfX1wiLFwiX19ub256ZXJvX19cIil9ZWxzZXt2b2lkIDA9PT1BJiYoYy5weTMkc2xvdHM9e19fbmV4dF9fOmMuX19uZXh0X199LFxuQT1jLnB5MyRzbG90cyk7bC5uZXh0PVwidHAkaXRlcm5leHRcIjtsLl9fbm9uemVyb19fPVwibmIkYm9vbFwiO2wuX19kaXZfXz1cIm5iJGRpdmlkZVwiO2wuX19yZGl2X189XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCI7bC5fX2lkaXZfXz1cIm5iJGlucGxhY2VfZGl2aWRlXCI7ZGVsZXRlIGwuX19ib29sX187ZGVsZXRlIGwuX19uZXh0X187Zm9yKGxldCBhIGluIHQpY1thXT10W2FdO2ZvcihsZXQgYSBpbiBBKWRlbGV0ZSBjW2FdO2dbaF1bMV09XCJuZXh0XCI7ZltrXVsxXT1cIl9fbm9uemVyb19fXCI7YihkLFwiX19uZXh0X19cIixcIm5leHRcIik7YihlLFwiX19ub256ZXJvX19cIixcIl9fYm9vbF9fXCIpO2ZvcihkPTA7ZDxlLmxlbmd0aDtkKyspZj1lW2RdLGc9Zi5wcm90b3R5cGUsZy5oYXNPd25Qcm9wZXJ0eShcIl9fZGl2X19cIil8fChnLl9fZGl2X189bmV3IFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKGYsdC5fX2Rpdl9fLGcubmIkZGl2aWRlKSxnLl9fcmRpdl9fPW5ldyBTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcihmLFxudC5fX3JkaXZfXyxTay5yZWZsZWN0ZWROdW1iZXJTbG90cy5uYiRkaXZpZGUuc2xvdCkpfX19fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxoLGQpe3JldHVybiBTay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKGEse2NvbnN0cnVjdG9yOmQuY29uc3RydWN0b3Isc2xvdHM6T2JqZWN0LmFzc2lnbih7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsJHI6ZX0sZC5zbG90cyksZ2V0c2V0czpPYmplY3QuYXNzaWduKGQuZ2V0c2V0c3x8e30sZikscHJvdG86T2JqZWN0LmFzc2lnbihkLnByb3RvfHx7fSx7ZCRyZXByX25hbWU6aHx8YSxkJGNoZWNrOmMsZCRzZXRfY2hlY2s6Yn0pLGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9ZnVuY3Rpb24gYyhhKXtpZihudWxsPT1hKXJldHVybiB0aGlzO2lmKCFhLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXG5cIicgcmVxdWlyZXMgYSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBidXQgcmVjZWl2ZWQgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdFwiKTt9ZnVuY3Rpb24gYihhKXtpZighYS5vYiR0eXBlLiRpc1N1YlR5cGUodGhpcy5kJHR5cGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyByZXF1aXJlcyBhICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IGJ1dCByZWNlaXZlZCBhICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0XCIpO31mdW5jdGlvbiBlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIit0aGlzLmQkcmVwcl9uYW1lK1wiICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzPlwiKX1jb25zdCBmPXtfX2RvY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCRkZWYuJGRvYz9cbm5ldyBTay5idWlsdGluLnN0cih0aGlzLmQkZGVmLiRkb2MpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LF9fb2JqY2xhc3NfXzp7JGdldCgpe3JldHVybiB0aGlzLmQkdHlwZX19LF9fbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLmQkbmFtZSl9fX07bT17X190ZXh0X3NpZ25hdHVyZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCRkZWYuJHRleHRzaWc/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuZCRkZWYuJHRleHRzaWcpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fTtTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yPWEoXCJnZXRzZXRfZGVzY3JpcHRvclwiLHZvaWQgMCx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiKXt0aGlzLmQkZGVmPWI7dGhpcy4kZ2V0PWIuJGdldDt0aGlzLiRzZXQ9Yi4kc2V0O3RoaXMuZCR0eXBlPWE7dGhpcy5kJG5hbWU9Yi4kbmFtZX0sc2xvdHM6e3RwJGRlc2NyX2dldChhLGIpe2lmKGI9dGhpcy5kJGNoZWNrKGEpKXJldHVybiBiO1xuaWYodm9pZCAwIT09dGhpcy4kZ2V0KXJldHVybiB0aGlzLiRnZXQuY2FsbChhKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcImdldHNldF9kZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzIGlzIG5vdCByZWFkYWJsZVwiKTt9LHRwJGRlc2NyX3NldChhLGIpe3RoaXMuZCRzZXRfY2hlY2soYSk7aWYodm9pZCAwIT09dGhpcy4kc2V0KXJldHVybiB0aGlzLiRzZXQuY2FsbChhLGIpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiYXR0cmlidXRlICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzIGlzIHJlYWRvbmx5XCIpO319fSk7U2suYnVpbHRpbi5tZXRob2RfZGVzY3JpcHRvcj1hKFwibWV0aG9kX2Rlc2NyaXB0b3JcIixcIm1ldGhvZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMuZCRkZWY9XG5iO3RoaXMuJG1ldGg9Yi4kbWV0aDt0aGlzLmQkdHlwZT1hO3RoaXMuZCRuYW1lPWIuJG5hbWV8fFwiPG5hdGl2ZSBKUz5cIjt0aGlzLiRmbGFncz1hPWIuJGZsYWdzfHx7fTthLkZhc3RDYWxsJiZhLk5vS3dhcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RGYXN0Q2FsbE5vS3dhcmdzOmEuRmFzdENhbGw/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZEZhc3RDYWxsOmEuTm9BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsTm9BcmdzOmEuT25lQXJnP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsT25lQXJnOmEuTmFtZWRBcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsTmFtZWRBcmdzOnZvaWQgMCE9PWEuTWluQXJncz90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aG9kQ2FsbE1pbkFyZ3M6KHRoaXMuZnVuY19jb2RlPWIuJG1ldGgsdGhpcy50cCRjYWxsPXRoaXMuJGRlZmF1bHRDYWxsLHRoaXMuJG1lbW9pc2VGbGFncz1Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRtZW1vaXNlRmxhZ3MsXG50aGlzLiRyZXNvbHZlQXJncz1Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRyZXNvbHZlQXJncyl9LHNsb3RzOnt0cCRjYWxsKGEsYil7cmV0dXJuIHRoaXMudHAkY2FsbChhLGIpfSx0cCRkZXNjcl9nZXQoYSxiKXtsZXQgYztyZXR1cm4oYz10aGlzLmQkY2hlY2soYSkpP2M6bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHRoaXMuZCRkZWYsYSl9fSxnZXRzZXRzOm0scHJvdG86eyRtZXRob2RGYXN0Q2FsbChhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7cmV0dXJuIHRoaXMuJG1ldGguY2FsbChjLGEsYil9LCRtZXRob2RGYXN0Q2FsbE5vS3dhcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuZCRuYW1lLGIpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYyxhKX0sJG1ldGhvZENhbGxOb0FyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuZCRuYW1lLFxuYSxiKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMpfSwkbWV0aG9kQ2FsbE9uZUFyZyhhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy5kJG5hbWUsYSxiKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMsYVswXSl9LCRtZXRob2RDYWxsTmFtZWRBcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKHRoaXMuZCRuYW1lLHRoaXMuJGZsYWdzLk5hbWVkQXJncyxhLGIsdGhpcy4kZmxhZ3MuRGVmYXVsdHMpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYywuLi5hKX0sJG1ldGhvZENhbGxNaW5BcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuZCRuYW1lLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLmQkbmFtZSxhLHRoaXMuJGZsYWdzLk1pbkFyZ3MsXG50aGlzLiRmbGFncy5NYXhBcmdzKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMsLi4uYSl9LCRkZWZhdWx0Q2FsbChhLGIpe3RoaXMubSRjaGVja3NlbGYoYVswXSk7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsYSxiKX0sbSRjaGVja3NlbGYoYSl7aWYodm9pZCAwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcIik7dGhpcy5kJGNoZWNrKGEpfX19KTtTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcj1hKFwid3JhcHBlcl9kZXNjcmlwdG9yXCIsXCJzbG90IHdyYXBwZXJcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZCRkZWY9Yjt0aGlzLmQkdHlwZT1hO3RoaXMuZCRuYW1lPWMuJG5hbWU9Yi4kbmFtZTt0aGlzLmQkd3JhcHBlZD1jfSxzbG90czp7dHAkZGVzY3JfZ2V0KGEsXG5iKXtsZXQgYztyZXR1cm4oYz10aGlzLmQkY2hlY2soYSkpP2M6bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXIodGhpcyxhKX0sdHAkY2FsbChhLGIpe2lmKDE+YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50XCIpO2NvbnN0IGM9YS5zaGlmdCgpO2lmKCFjLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJ1wiKTtyZXR1cm4gdGhpcy5yYXckY2FsbChjLGEsYil9fSxwcm90bzp7cmF3JGNhbGwoYSxiLGMpe3RoaXMuZCR3cmFwcGVkLiRuYW1lPVxudGhpcy5kJG5hbWU7cmV0dXJuIHRoaXMuZCRkZWYuJHdyYXBwZXIuY2FsbCh0aGlzLmQkd3JhcHBlZCxhLGIsYyl9fX0pO1NrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXI9YShcIm1ldGhvZF93cmFwcGVyXCIsdm9pZCAwLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMubSRkZXNjcj1hO3RoaXMubSRzZWxmPWI7dGhpcy5kJGRlZj1hLmQkZGVmO3RoaXMuZCRuYW1lPWEuZCRuYW1lO3RoaXMuZCR0eXBlPWEuZCR0eXBlfSxzbG90czp7dHAkY2FsbChhLGIpe3JldHVybiB0aGlzLm0kZGVzY3IucmF3JGNhbGwodGhpcy5tJHNlbGYsYSxiKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtpZihcIkVxXCIhPT1iJiZcIk5vdEVxXCIhPT1ifHwhKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLm1ldGhvZF93cmFwcGVyKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7YT10aGlzLm0kc2VsZj09PWEubSRzZWxmJiZ0aGlzLm0kZGVzY3I9PT1hLm0kZGVzY3I7cmV0dXJuXCJFcVwiPT09XG5iP2E6IWF9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxtZXRob2Qtd3JhcHBlciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMubSRzZWxmKStcIiBvYmplY3Q+XCIpfX0sZ2V0c2V0czp7X19zZWxmX186eyRnZXQoKXtyZXR1cm4gdGhpcy5tJHNlbGZ9fX19KTtTay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3I9YShcImNsYXNzbWV0aG9kX2Rlc2NyaXB0b3JcIixcIm1ldGhvZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMuZCRkZWY9Yjt0aGlzLiRtZXRoPWIuJG1ldGg7dGhpcy5kJHR5cGU9YTt0aGlzLmQkbmFtZT1iLiRuYW1lfHxcIjxuYXRpdmUgSlM+XCJ9LHNsb3RzOnt0cCRjYWxsKGEsYil7aWYoMT5hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcIik7XG5jb25zdCBjPWEuc2hpZnQoKTtyZXR1cm4gdGhpcy50cCRkZXNjcl9nZXQobnVsbCxjKS50cCRjYWxsKGEsYil9LHRwJGRlc2NyX2dldChhLGIsYyl7aWYodm9pZCAwPT09YilpZihudWxsIT09YSliPWJ8fGEub2IkdHlwZTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBmb3IgdHlwZSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG5lZWRzIGFuIG9iamVjdCBvciBhIHR5cGVcIik7aWYoYi5vYiR0eXBlIT09U2suYnVpbHRpbi50eXBlKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBmb3IgdHlwZSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG5lZWRzIGEgdHlwZSBub3QgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXCInIGFzIGFyZyAyXCIpO2lmKCFiLiRpc1N1YlR5cGUodGhpcy5kJHR5cGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK1xudGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1wiJyBvYmplY3RcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnNrX21ldGhvZCh0aGlzLmQkZGVmLGIpfX0sZ2V0c2V0czptfSk7W1NrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IsU2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcixTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcixTay5idWlsdGluLm1ldGhvZF93cmFwcGVyLFNrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcl0uZm9yRWFjaChhPT57U2suYWJzdHIuc2V0VXBTbG90cyhhKTtTay5hYnN0ci5zZXRVcE1ldGhvZHMoYSk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGEpfSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5za19tZXRob2Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImJ1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIpe3RoaXMuJG1ldGg9YS4kbWV0aC5iaW5kKGMpO3RoaXMuJGRvYz1hLiRkb2M7dGhpcy4kc2VsZj1jfHxudWxsO3RoaXMuJG1vZHVsZT1iP25ldyBTay5idWlsdGluLnN0cihiKTpudWxsO3RoaXMuJG5hbWU9YS4kbmFtZXx8YS4kbWV0aC5uYW1lfHxcIjxuYXRpdmUgSlM+XCI7dGhpcy5tJGRlZj1hO3RoaXMuJHRleHRzaWc9YS4kdGV4dHNpZzt0aGlzLiRmbGFncz1hPWEuJGZsYWdzfHx7fTthLkZhc3RDYWxsJiZhLk5vS3dhcmdzP3RoaXMudHAkY2FsbD10aGlzLiRmYXN0Q2FsbE5vS3dhcmdzOmEuRmFzdENhbGw/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGg6YS5Ob0FyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxOb0FyZ3M6YS5PbmVBcmc/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxPbmVBcmc6YS5OYW1lZEFyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxOYW1lZEFyZ3M6dm9pZCAwIT09YS5NaW5BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRjYWxsTWluQXJnczpcbih0aGlzLmZ1bmNfY29kZT10aGlzLiRtZXRoLHRoaXMudHAkY2FsbD10aGlzLiRkZWZhdWx0Q2FsbE1ldGhvZCl9LHByb3RvOnskZmFzdENhbGxOb0t3YXJncyhhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy4kbmFtZSxjKTtyZXR1cm4gdGhpcy4kbWV0aChhKX0sJGNhbGxOb0FyZ3MoYSxjKXtTay5hYnN0ci5jaGVja05vQXJncyh0aGlzLiRuYW1lLGEsYyk7cmV0dXJuIHRoaXMuJG1ldGgoKX0sJGNhbGxPbmVBcmcoYSxjKXtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLiRuYW1lLGEsYyk7cmV0dXJuIHRoaXMuJG1ldGgoYVswXSl9LCRjYWxsTmFtZWRBcmdzKGEsYyl7YT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyh0aGlzLiRuYW1lLHRoaXMuJGZsYWdzLk5hbWVkQXJncyxhLGMsdGhpcy4kZmxhZ3MuRGVmYXVsdHMpO3JldHVybiB0aGlzLiRtZXRoKC4uLmEpfSwkY2FsbE1pbkFyZ3MoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7XG5Tay5hYnN0ci5jaGVja0FyZ3NMZW4odGhpcy4kbmFtZSxhLHRoaXMuJGZsYWdzLk1pbkFyZ3MsdGhpcy4kZmxhZ3MuTWF4QXJncyk7cmV0dXJuIHRoaXMuJG1ldGgoLi4uYSl9LCRkZWZhdWx0Q2FsbE1ldGhvZChhLGMpe3JldHVybiBudWxsIT09dGhpcy4kc2VsZj9Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLnRwJGNhbGwuY2FsbCh0aGlzLFt0aGlzLiRzZWxmLC4uLmFdLGMpOlNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsYSxjKX0sJG1lbW9pc2VGbGFncygpe3JldHVybiBTay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRtZW1vaXNlRmxhZ3MuY2FsbCh0aGlzKX0sJHJlc29sdmVBcmdzKCl7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUuJHJlc29sdmVBcmdzLmNhbGwodGhpcyl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsJHIoKXtyZXR1cm4gbnVsbD09PVxudGhpcy4kc2VsZj9uZXcgU2suYnVpbHRpbi5zdHIoXCI8YnVpbHQtaW4gZnVuY3Rpb24gXCIrdGhpcy4kbmFtZStcIj5cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGJ1aWx0LWluIG1ldGhvZCBcIit0aGlzLiRuYW1lK1wiIG9mIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMuJHNlbGYpK1wiIG9iamVjdD5cIil9LHRwJGNhbGwoYSxjKXtyZXR1cm4gdGhpcy50cCRjYWxsKGEsYyl9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoXCJFcVwiIT09YyYmXCJOb3RFcVwiIT09Y3x8IShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5za19tZXRob2QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPXRoaXMuJHNlbGY9PT1hLiRzZWxmJiZ0aGlzLm0kZGVmLiRtZXRoPT09YS5tJGRlZi4kbWV0aDtyZXR1cm5cIkVxXCI9PT1jP2E6IWF9fSxnZXRzZXRzOntfX21vZHVsZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJG1vZHVsZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkc2V0KGEpe3RoaXMuJG1vZHVsZT1cbmE9YXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLiRkb2M/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJG5hbWUpfX0sX190ZXh0X3NpZ25hdHVyZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLiR0ZXh0c2lnKX19LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJHNlbGZ8fFNrLnN5c01vZHVsZXMubXAkbG9va3VwKHRoaXMuJG1vZHVsZSl8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubm9uZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm9uZVR5cGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxzbG90czp7dHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3MoXCJOb25lVHlwZVwiLFxuYSxjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJOb25lXCIpfSx0cCRhc19udW1iZXI6ITAsbmIkYm9vbCgpe3JldHVybiExfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLm5vbmUubm9uZSQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLm5vbmUucHJvdG90eXBlLHt2Ont2YWx1ZTpudWxsLGVudW1lcmFibGU6ITB9fSk7U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm90SW1wbGVtZW50ZWRUeXBlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfSxzbG90czp7JHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiTm90SW1wbGVtZW50ZWRcIil9LHRwJG5ldyhhLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKFwiTm90SW1wbGVtZW50ZWRUeXBlXCIsXG5hLGMpO3JldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLk5vdEltcGxlbWVudGVkLnByb3RvdHlwZSx7djp7dmFsdWU6bnVsbCxlbnVtZXJhYmxlOiEwfX0pfSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9L14oPzooLik/KFs8Pj1cXF5dKSk/KFtcXCtcXC1cXHNdKT8oIyk/KDApPyhcXGQrKT8oLCk/KD86XFwuKFxcZCspKT8oW2JjZGVFZkZnR25vc3hYJV0pPyQvO1NrLmZvcm1hdHRpbmc9e307bGV0IGM9ZnVuY3Rpb24oYSxiLGMsZSl7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBiKTtpZihhWzZdKXt2YXIgZD1wYXJzZUludChhWzZdLDEwKTtlPWFbMl18fChhWzVdP1wiPVwiOmU/XCI+XCI6XCI8XCIpO2xldCBmPWQtKGIubGVuZ3RoKyhjP2MubGVuZ3RoOjApKTtcbmlmKDA+PWYpcmV0dXJuIGI7ZD0oYVsxXXx8KGFbNV0/XCIwXCI6XCIgXCIpKS5yZXBlYXQoZik7c3dpdGNoKGUpe2Nhc2UgXCI9XCI6aWYoXCJzXCI9PT1hWzldKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCInPScgYWxpZ25tZW50IG5vdCBhbGxvd2VkIGluIHN0cmluZyBmb3JtYXQgc3BlY2lmaWVyXCIpO3JldHVybiBjK2QrYjtjYXNlIFwiPlwiOnJldHVybiBkK2MrYjtjYXNlIFwiPFwiOnJldHVybiBjK2IrZDtjYXNlIFwiXlwiOnJldHVybiBhPU1hdGguZmxvb3IoZi8yKSxkLnN1YnN0cmluZygwLGEpK2MrYitkLnN1YnN0cmluZyhhKX19cmV0dXJuIGMrYn0sYj1mdW5jdGlvbihhLGIpe3JldHVybiBiP1wiLVwiOlwiK1wiPT09YVszXT9cIitcIjpcIiBcIj09PWFbM10/XCIgXCI6XCJcIn0sZT1mdW5jdGlvbihhLGUsZCl7U2suYXNzZXJ0cy5hc3NlcnQoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8ZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKTtpZihhWzhdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJQcmVjaXNpb24gbm90IGFsbG93ZWQgaW4gaW50ZWdlciBmb3JtYXRcIik7XG5sZXQgZj1lLnN0ciQoZCwhMSk7ZT1lLm5iJGlzbmVnYXRpdmUoKTtlPWIoYSxlKTthWzRdJiYoMTY9PT1kP2UrPVwiMHhcIjo4PT09ZD9lKz1cIjBvXCI6Mj09PWQmJihlKz1cIjBiXCIpKTtcIlhcIj09PWFbOV0mJihmPWYudG9VcHBlckNhc2UoKSk7XCJuXCI9PT1hWzldP2Y9KCtmKS50b0xvY2FsZVN0cmluZygpOmFbN10mJihkPWYudG9TdHJpbmcoKS5zcGxpdChcIi5cIiksZFswXT1kWzBdLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csXCIsXCIpLGY9ZC5qb2luKFwiLlwiKSk7cmV0dXJuIGMoYSxmLGUsITApfSxmPWZ1bmN0aW9uKGYsaCxkKXtpZighaClyZXR1cm4gZi5zdHIkKDEwLCEwKTtoPWgubWF0Y2goYSk7aWYoIWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkludmFsaWQgZm9ybWF0IHNwZWNpZmllclwiKTt2YXIgZz1oWzldO2d8fChnPWQ/XCJnXCI6XCJkXCIpO2lmKC0xPT0oZD9cImZGZUVnRyVcIjpcImJjZG94WG5mRmVFZ0clXCIpLmluZGV4T2YoZykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gZm9ybWF0IGNvZGUgJ1wiK1xuaFs5XStcIicgZm9yIG9iamVjdCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShmKStcIidcIik7c3dpdGNoKGcpe2Nhc2UgXCJkXCI6Y2FzZSBcIm5cIjpyZXR1cm4gZShoLGYsMTApO2Nhc2UgXCJ4XCI6Y2FzZSBcIlhcIjpyZXR1cm4gZShoLGYsMTYpO2Nhc2UgXCJvXCI6cmV0dXJuIGUoaCxmLDgpO2Nhc2UgXCJiXCI6cmV0dXJuIGUoaCxmLDIpO2Nhc2UgXCJjXCI6aWYoaFszXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiU2lnbiBub3QgYWxsb3dlZCB3aXRoIGludGVnZXIgZm9ybWF0IHNwZWNpZmllciAnYydcIik7aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gbm90IGFsbG93ZWQgd2l0aCBpbnRlZ2VyIGZvcm1hdCBzcGVjaWZpZXIgJ2MnXCIpO2lmKGhbN10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5ICcsJyB3aXRoICdjJ1wiKTtpZihoWzhdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSAnLCcgd2l0aCAnYydcIik7XG5yZXR1cm4gYyhoLFN0cmluZy5mcm9tQ29kZVBvaW50KFNrLmJ1aWx0aW4uYXNudW0kKGYpKSxcIlwiLCEwKTtjYXNlIFwiZlwiOmNhc2UgXCJGXCI6Y2FzZSBcImVcIjpjYXNlIFwiRVwiOmNhc2UgXCJnXCI6Y2FzZSBcIkdcIjp7aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIGluIGZsb2F0IGZvcm1hdCBzcGVjaWZpZXJcIik7ZD1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIGQmJihkPU51bWJlcihkKSk7aWYoSW5maW5pdHk9PT1kKXJldHVybiBjKGgsXCJpbmZcIixcIlwiLCEwKTtpZigtSW5maW5pdHk9PT1kKXJldHVybiBjKGgsXCJpbmZcIixcIi1cIiwhMCk7aWYoaXNOYU4oZCkpcmV0dXJuIGMoaCxcIm5hblwiLFwiXCIsITApO2Y9ITE7MD5kJiYoZD0tZCxmPSEwKTt2YXIgbD1bXCJ0b0V4cG9uZW50aWFsXCIsXCJ0b0ZpeGVkXCIsXCJ0b1ByZWNpc2lvblwiXVtcImVmZ1wiLmluZGV4T2YoZy50b0xvd2VyQ2FzZSgpKV07bGV0IGE9aFs4XT9cbnBhcnNlSW50KGhbOF0sMTApOjY7ZD1kW2xdKGEpOy0xIT09XCJFRkdcIi5pbmRleE9mKGcpJiYoZD1kLnRvVXBwZXJDYXNlKCkpO2lmKFwiZ1wiPT09Zy50b0xvd2VyQ2FzZSgpfHwhaFs5XSl7aWYobD1kLm1hdGNoKC9cXC4oXFxkKlsxLTldKT8oMCspJC8pKXtsZXQgWyxhLGJdPWw7ZD1kLnNsaWNlKDAsYT8tYi5sZW5ndGg6LShiLmxlbmd0aCsxKSl9LTEhPWQuaW5kZXhPZihcIi5cIil8fGhbOV18fChkKz1cIi4wXCIpfVwiZVwiPT09Zy50b0xvd2VyQ2FzZSgpJiYoZD1kLnJlcGxhY2UoL14oWy0rXT9bMC05XSpcXC4/WzAtOV0rW2VFXVstK10/KShbMC05XSk/JC8sXCIkMTAkMlwiKSk7aFs3XSYmKGc9ZC50b1N0cmluZygpLnNwbGl0KFwiLlwiKSxnWzBdPWdbMF0ucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZyxcIixcIiksZD1nLmpvaW4oXCIuXCIpKTtyZXR1cm4gYyhoLGQsYihoLGYpLCEwKX1jYXNlIFwiJVwiOmlmKGhbNF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkFsdGVybmF0ZSBmb3JtICgjKSBub3QgYWxsb3dlZCB3aXRoIGZvcm1hdCBzcGVjaWZpZXIgJyUnXCIpO1xuZj1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIGYmJihmPU51bWJlcihmKSk7aWYoSW5maW5pdHk9PT1mKXJldHVybiBjKGgsXCJpbmYlXCIsXCJcIiwhMCk7aWYoLUluZmluaXR5PT09ZilyZXR1cm4gYyhoLFwiaW5mJVwiLFwiLVwiLCEwKTtpZihpc05hTihmKSlyZXR1cm4gYyhoLFwibmFuJVwiLFwiXCIsITApO2c9ITE7MD5mJiYoZj0tZixnPSEwKTtkPWhbOF0/cGFyc2VJbnQoaFs4XSwxMCk6NjtmPSgxMDAqZikudG9GaXhlZChkKStcIiVcIjtyZXR1cm4gYyhoLGYsYihoLGcpLCEwKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJVbmtub3duIGZvcm1hdCBjb2RlICdcIitoWzldK1wiJ1wiKTt9fTtTay5mb3JtYXR0aW5nLm1rTnVtYmVyX19mb3JtYXRfXz1hPT5mdW5jdGlvbihiKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQoKSBhcmd1bWVudCAyIG11c3QgYmUgc3RyLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShiKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihmKHRoaXMsYi4kanNzdHIoKSxhKSl9O1NrLmZvcm1hdHRpbmcuZm9ybWF0PWZ1bmN0aW9uKGEsYil7Yj1ifHxbXTtjb25zdCBjPXt9O2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9MiljW2JbYV1dPWJbYSsxXTtmb3IobGV0IGIgaW4gYSljW2JdPWFbYl07bGV0IGU9MDthPXRoaXMudi5yZXBsYWNlKC97KCgoPzpcXGQrKXwoPzpcXHcrKSk/KCg/OlxcLihcXHcrKSl8KD86XFxbKCg/OlxcZCspfCg/OlxcdyspKVxcXSk/KSk/KD86IShbcnNdKSk/KD86OihbXn1dKikpP30vZyxmdW5jdGlvbihhLGIsZCxmLGcsaCxsLEIsRCxtKXtsZXQgaztpZih2b2lkIDAhPT1oJiZcIlwiIT09aClhPWNbZF0saz1hLmNvbnN0cnVjdG9yPT09QXJyYXk/YVtoXTovXlxcZCskLy50ZXN0KGgpP1NrLmFic3RyLm9iamVjdEdldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5pbnRfKHBhcnNlSW50KGgsMTApKSwhMSk6U2suYWJzdHIub2JqZWN0R2V0SXRlbShhLFxubmV3IFNrLmJ1aWx0aW4uc3RyKGgpLCExKSxlKys7ZWxzZSBpZih2b2lkIDAhPT1nJiZcIlwiIT09ZylrPVNrLmFic3RyLmdhdHRyKGNbZHx8ZSsrXSxuZXcgU2suYnVpbHRpbi5zdHIoZykpO2Vsc2UgaWYodm9pZCAwIT09ZCYmXCJcIiE9PWQpaz1jW2RdO2Vsc2UgaWYodm9pZCAwPT09Ynx8XCJcIj09PWIpaz1jW2VdLGUrKztlbHNlIGlmKGIgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGIgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0X3x8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nfHwvXlxcZCskLy50ZXN0KGIpKWs9Y1tiXSxlKys7aWYoXCJzXCI9PT1sKWs9bmV3IFNrLmJ1aWx0aW4uc3RyKGspO2Vsc2UgaWYoXCJyXCI9PT1sKWs9U2suYnVpbHRpbi5yZXByKGspO2Vsc2UgaWYoXCJcIiE9PWwmJnZvaWQgMCE9PWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gY29udmVyc2lvbiBzcGVjaWZpZXIgXCIrbCk7cmV0dXJuIFNrLmFic3RyLm9iamVjdEZvcm1hdChrLFxubmV3IFNrLmJ1aWx0aW4uc3RyKEIpKS4kanNzdHIoKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9O1NrLmZvcm1hdHRpbmcuZm9ybWF0U3RyaW5nPWZ1bmN0aW9uKGIpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZvcm1hdCgpIGFyZ3VtZW50IDIgbXVzdCBiZSBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShiKSk7Yj1iLiRqc3N0cigpLm1hdGNoKGEpO2lmKGJbOV0mJlwic1wiIT09Yls5XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiVW5rbm93biBmb3JtYXQgY29kZSAnXCIrYls5XStcIicgZm9yIG9iamVjdCBvZiB0eXBlICdzdHInXCIpO2lmKGJbM10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlNpZ24gbm90IGFsbG93ZWQgaW4gc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJcIik7aWYoYls0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIHdpdGggc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJcIik7XG5pZihiWzddKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSAnLCcgd2l0aCAncydcIik7bGV0IGU9dGhpcy52O2JbOF0mJihlPWUuc3Vic3RyaW5nKDAsYls4XSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyhiLGUsXCJcIiwhMSkpfX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2xldCBiO2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspYj1hLmNoYXJBdChkKSxrLnRlc3QoYik/Yy5wdXNoKGIpOlwiXFxcXDAwMFwiPT09Yj9jLnB1c2goXCJcXFxcMDAwXCIpOmMucHVzaChcIlxcXFxcIitiKTtyZXR1cm4gYy5qb2luKFwiXCIpfWZ1bmN0aW9uIGMoYSxiLGMpe2I9U2suYnVpbHRpbi5jaGVja05vbmUoYik/bnVsbDphLmdldCR0Z3QoYik7aWYobnVsbCE9PWImJiFiLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZW1wdHkgc2VwYXJhdG9yXCIpO2E9YS52O3ZhciBkPTA7aWYobnVsbD09PWIpe3ZhciBlPS9bXFxzXFx4YTBdKy9nO1xuZD1hLmxlbmd0aDthPWEucmVwbGFjZSh1LFwiXCIpO2QtPWEubGVuZ3RofWVsc2UgZT1iLnJlcGxhY2UocCxcIlxcXFwkMVwiKSxlPW5ldyBSZWdFeHAoZSxcImdcIik7Y29uc3QgZj1bXTtsZXQgZz0wLGs9MCxoO2ZvcihjPTA+Yz9JbmZpbml0eTpjO251bGwhPShoPWUuZXhlYyhhKSkmJms8YyYmaC5pbmRleCE9PWUubGFzdEluZGV4OylmLnB1c2goZytkKSxmLnB1c2goaC5pbmRleCtkKSxnPWUubGFzdEluZGV4LGsrPTE7aWYobnVsbCE9PWJ8fGEubGVuZ3RoLWcpZi5wdXNoKGcrZCksZi5wdXNoKGEubGVuZ3RoK2QpO3JldHVybiBmfWZ1bmN0aW9uIGIoYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7aWYodm9pZCAwPT09ZHx8U2suYnVpbHRpbi5jaGVja05vbmUoZCkpZD1iO2Vsc2UgaWYoZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKWQ9YShkLnYpLGQ9bmV3IFJlZ0V4cChjKGQpLFwiZ1wiKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInN0cmlwIGFyZyBtdXN0IGJlIE5vbmUgb3Igc3RyXCIpO1xucmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYucmVwbGFjZShkLFwiXCIpKX19ZnVuY3Rpb24gZShhKXtyZXR1cm4gZnVuY3Rpb24oYil7Yj10aGlzLmdldCR0Z3QoYik7Y29uc3QgYz10aGlzLnY7bGV0IGQ7aWYoYSl7aWYoZD1jLmxhc3RJbmRleE9mKGIpLDA+ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihcIlwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXCJcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKGMpXSl9ZWxzZSBpZihkPWMuaW5kZXhPZihiKSwwPmQpcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoYyksbmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpLG5ldyBTay5idWlsdGluLnN0cihcIlwiKV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uc3RyKGMuc3Vic3RyaW5nKDAsZCkpLG5ldyBTay5idWlsdGluLnN0cihiKSxuZXcgU2suYnVpbHRpbi5zdHIoYy5zdWJzdHJpbmcoZCtiLmxlbmd0aCkpXSl9fVxuZnVuY3Rpb24gZihhLGIpe3JldHVybiBmdW5jdGlvbihjLGQpe2M9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGMsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZih2b2lkIDA9PT1kKWQ9XCIgXCI7ZWxzZSBpZihkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHImJjE9PT1kLnNxJGxlbmd0aCgpKWQ9ZC52O2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidGhlIGZpbGwgY2hhcmFjdGVyIG11c3QgYmUgYSBzdHIgb2YgbGVuZ3RoIDFcIik7Y29uc3QgZT10aGlzLnNxJGxlbmd0aCgpO2xldCBmO2lmKGU+PWMpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYpO2lmKGIpcmV0dXJuIGY9ZC5yZXBlYXQoTWF0aC5mbG9vcigoYy1lKS8yKSksZj1mK3RoaXMuditmLChjLWUpJTImJihmKz1kKSxuZXcgU2suYnVpbHRpbi5zdHIoZik7Zj1kLnJlcGVhdChjLWUpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYT9mK3RoaXMudjp0aGlzLnYrZil9fWZ1bmN0aW9uIGwoYSxcbmIsYyl7KHtzdGFydDpiLGVuZDpjfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydChhLGIsYykpO2lmKGEuJGhhc0FzdHJhbENvZGVQb2ludHMoKSl7Y29uc3QgZD1hLmNvZGVwb2ludHNbYl07Yj12b2lkIDA9PT1kP2IrYS52Lmxlbmd0aC1hLmNvZGVwb2ludHMubGVuZ3RoOmQ7Yz1hLmNvZGVwb2ludHNbY107Yz12b2lkIDA9PT1jP2Eudi5sZW5ndGg6Y31yZXR1cm57c3RhcnQ6YixlbmQ6Y319ZnVuY3Rpb24gaChhKXtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpOyh7c3RhcnQ6YyxlbmQ6ZH09bCh0aGlzLGMsZCkpO2lmKGQ8YylyZXR1cm4tMTtkLT1iLmxlbmd0aDtiPWE/dGhpcy52Lmxhc3RJbmRleE9mKGIsZCk6dGhpcy52LmluZGV4T2YoYixjKTtiPWI+PWMmJmI8PWQ/YjotMTtpZih0aGlzLmNvZGVwb2ludHMpe2Q9dGhpcy5zcSRsZW5ndGgoKTtjPS0xO2ZvcihsZXQgYT0wO2E8ZDthKyspYj09dGhpcy5jb2RlcG9pbnRzW2FdJiYoYz1hKX1lbHNlIGM9XG5iO3JldHVybiBjfX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cnx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiIGZpcnN0IGFyZyBtdXN0IGJlIHN0ciBvciBhIHR1cGxlIG9mIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTsoe3N0YXJ0OmQsZW5kOmV9PWwodGhpcyxkLGUpKTtpZihkPmUpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7ZD10aGlzLnYuc2xpY2UoZCxlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7Zm9yKGxldCBlPVNrLmFic3RyLml0ZXIoYyksZj1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWUudHAkaXRlcm5leHQoKSl7aWYoIShmIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR1cGxlIGZvciBcIithK1wiIG11c3Qgb25seSBjb250YWluIHN0ciwgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoZikpO2lmKGIoZCxmLnYpKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSR9cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYihkLGMudikpfX12YXIgZz0vXlswLTkhI19dLyxuPU9iamVjdC5jcmVhdGUobnVsbCk7U2suYnVpbHRpbi5zdHI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInN0clwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIsXCJiYWQgY2FsbCB0byBzdHIgLSB1c2UgJ25ldydcIik7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhKWlmKHZvaWQgMD09PWEpYT1cIlwiO2Vsc2UgaWYobnVsbD09PWEpYT1cIk5vbmVcIjtlbHNle2lmKHZvaWQgMCE9PWEudHAkc3RyKXJldHVybiBhLnRwJHN0cigpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSlhPU51bWJlci5pc0Zpbml0ZShhKT9TdHJpbmcoYSk6U3RyaW5nKGEpLnJlcGxhY2UoXCJJbmZpbml0eVwiLFxuXCJpbmZcIikucmVwbGFjZShcIk5hTlwiLFwibmFuXCIpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgb2JqZWN0IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyB0byBzdHJcIik7fXZhciBiPW5bYV07aWYodm9pZCAwIT09YilyZXR1cm4gYjtuW2FdPXRoaXM7Yj12b2lkIDA9PT10W2FdP2E6YStcIl8kcnckXCI7dGhpcy4kbWFuZ2xlZD1iO3RoaXMuJHNhdmVkS2V5SGFzaD1hLnJlcGxhY2UoZyxcIiEkJlwiKTt0aGlzLnY9YX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkZG9jOlwic3RyKG9iamVjdD0nJykgLT4gc3RyXFxuc3RyKGJ5dGVzX29yX2J1ZmZlclssIGVuY29kaW5nWywgZXJyb3JzXV0pIC0+IHN0clxcblxcbkNyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IGZyb20gdGhlIGdpdmVuIG9iamVjdC4gSWYgZW5jb2Rpbmcgb3JcXG5lcnJvcnMgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBvYmplY3QgbXVzdCBleHBvc2UgYSBkYXRhIGJ1ZmZlclxcbnRoYXQgd2lsbCBiZSBkZWNvZGVkIHVzaW5nIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgZXJyb3IgaGFuZGxlci5cXG5PdGhlcndpc2UsIHJldHVybnMgdGhlIHJlc3VsdCBvZiBvYmplY3QuX19zdHJfXygpIChpZiBkZWZpbmVkKVxcbm9yIHJlcHIob2JqZWN0KS5cXG5lbmNvZGluZyBkZWZhdWx0cyB0byBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkuXFxuZXJyb3JzIGRlZmF1bHRzIHRvICdzdHJpY3QnLlwiLFxudHAkbmV3KGEsYil7Yj1ifHxbXTtpZih0aGlzIT09U2suYnVpbHRpbi5zdHIucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGIpO2lmKDE+PWEubGVuZ3RoJiYhYi5sZW5ndGgpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhWzBdKTtpZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2NvbnN0IFtjLGQsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJzdHJcIixbXCJvYmplY3RcIixcImVuY29kaW5nXCIsXCJlcnJvcnNcIl0sYSxiKTtpZih2b2lkIDA9PT1jfHx2b2lkIDA9PT1kJiZ2b2lkIDA9PT1lKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyk7U2suYnVpbHRpbi5ieXRlcy5jaGVjayRlbmNvZGVBcmdzKFwic3RyXCIsZCxlKTtpZighU2suYnVpbHRpbi5jaGVja0J5dGVzKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlY29kaW5nIHRvIHN0cjogbmVlZCBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCBcIitTay5hYnN0ci50eXBlTmFtZShjKStcIiBmb3VuZFwiKTtcbnJldHVybiBTay5idWlsdGluLmJ5dGVzLiRkZWNvZGUuY2FsbChjLGQsZSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3RyIHRha2VzIGF0IG1vc3Qgb25lIGFyZ3VtZW50IChcIisoYS5sZW5ndGgrYi5sZW5ndGgpK1wiIGdpdmVuKVwiKTt9LCRyKCl7bGV0IGE9XCInXCI7LTEhPT10aGlzLnYuaW5kZXhPZihcIidcIikmJi0xPT09dGhpcy52LmluZGV4T2YoJ1wiJykmJihhPSdcIicpO2NvbnN0IGI9dGhpcy52Lmxlbmd0aDtsZXQgYz1hO2ZvcihsZXQgZj0wO2Y8YjtmKyspe3ZhciBkPXRoaXMudi5jaGFyQXQoZik7dmFyIGU9dGhpcy52LmNoYXJDb2RlQXQoZik7ZD09PWF8fFwiXFxcXFwiPT09ZD9jKz1cIlxcXFxcIitkOlwiXFx0XCI9PT1kP2MrPVwiXFxcXHRcIjpcIlxcblwiPT09ZD9jKz1cIlxcXFxuXCI6XCJcXHJcIj09PWQ/Yys9XCJcXFxcclwiOigyNTU8ZSYmNTUyOTY+ZXx8NTczNDQ8PWUpJiYhU2suX19mdXR1cmVfXy5weXRob24zP2MrPVwiXFxcXHVcIisoXCIwMDBcIitlLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOjU1Mjk2PD1lJiZcbiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGQ9dGhpcy52LmNvZGVQb2ludEF0KGYpLGYrKyxkPWQudG9TdHJpbmcoMTYpLGU9XCIwMDAwMDAwXCIrZC50b1N0cmluZygxNiksYz00PGQubGVuZ3RoP2MrKFwiXFxcXFVcIitlLnNsaWNlKC04KSk6YysoXCJcXFxcdVwiK2Uuc2xpY2UoLTQpKSk6MjU1PGUmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yys9XCJcXFxcdWZmZmRcIjpcIiBcIj5kfHwxMjc8PWUmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGQ9ZC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSwyPmQubGVuZ3RoJiYoZD1cIjBcIitkKSxjKz1cIlxcXFx4XCIrZCk6Yys9ZH1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMrYSl9LHRwJHN0cigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5zdHI/dGhpczpuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52KX0sdHAkaXRlcigpe3JldHVybiBuZXcgQSh0aGlzKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO1xuc3dpdGNoKGIpe2Nhc2UgXCJMdFwiOnJldHVybiB0aGlzLnY8YS52O2Nhc2UgXCJMdEVcIjpyZXR1cm4gdGhpcy52PD1hLnY7Y2FzZSBcIkVxXCI6cmV0dXJuIHRoaXMudj09PWEudjtjYXNlIFwiTm90RXFcIjpyZXR1cm4gdGhpcy52IT09YS52O2Nhc2UgXCJHdFwiOnJldHVybiB0aGlzLnY+YS52O2Nhc2UgXCJHdEVcIjpyZXR1cm4gdGhpcy52Pj1hLnZ9fSxtcCRzdWJzY3JpcHQoYSl7bGV0IGI7aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9dGhpcy5zcSRsZW5ndGgoKTswPmEmJihhKz1iKTtpZigwPmF8fGE+PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcInN0cmluZyBpbmRleCBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIHRoaXMuY29kZXBvaW50cz9uZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cmluZyh0aGlzLmNvZGVwb2ludHNbYV0sdGhpcy5jb2RlcG9pbnRzW2ErMV0pKTpcbm5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuY2hhckF0KGEpKX1pZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7bGV0IGM9XCJcIjtiPXRoaXMuc3EkbGVuZ3RoKCk7dGhpcy5jb2RlcG9pbnRzP2Euc3NzaXRlciQoYixhPT57Yys9dGhpcy52LnN1YnN0cmluZyh0aGlzLmNvZGVwb2ludHNbYV0sdGhpcy5jb2RlcG9pbnRzW2ErMV0pfSk6YS5zc3NpdGVyJChiLGE9PntjKz10aGlzLnYuY2hhckF0KGEpfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihjKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHJpbmcgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMuJGhhc0FzdHJhbENvZGVQb2ludHMoKT90aGlzLmNvZGVwb2ludHMubGVuZ3RoOnRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNvbmNhdGVuYXRlICdzdHInIGFuZCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0c1wiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudithLnYpfSxzcSRyZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKGEqdGhpcy52Lmxlbmd0aD5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUil0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yO2xldCBiPVwiXCI7Zm9yKGxldCBjPTA7YzxhO2MrKyliKz10aGlzLnY7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0sc3EkY29udGFpbnMoYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKSk7cmV0dXJuLTEhPT10aGlzLnYuaW5kZXhPZihhLnYpfSx0cCRhc19udW1iZXI6ITAsbmIkcmVtYWluZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2NvbnN0IGM9dGhpcy5zayRidWlsdGluQmFzZTthLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi50dXBsZXx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdHx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5fHwoYT1uZXcgU2suYnVpbHRpbi50dXBsZShbYV0pKTt2YXIgZD0wO3ZhciBlPXRoaXMuJGpzc3RyKCkucmVwbGFjZSgvJShcXChbYS16QS1aMC05XStcXCkpPyhbIzAgK1xcLV0rKT8oXFwqfFswLTldKyk/KFxcLihcXCp8WzAtOV0rKSk/W2hsTF0/KFtkaW91eFhlRWZGZ0djcnNiJV0pL2csZnVuY3Rpb24oZSxmLGcsayxoLGwscCl7dmFyIG4sQixBLHYsTDtrPVNrLmJ1aWx0aW4uYXNudW0kKGspO2g9U2suYnVpbHRpbi5hc251bSQoaCk7dm9pZCAwIT09ZiYmXCJcIiE9PWZ8fFwiJVwiPT1wfHwobj1cbmQrKyk7XCJcIj09PWgmJihoPXZvaWQgMCk7dmFyIHQ9Qj1BPXY9TD0hMTtnJiYoLTEhPT1nLmluZGV4T2YoXCItXCIpP3Y9ITA6LTEhPT1nLmluZGV4T2YoXCIwXCIpJiYoTD0hMCksLTEhPT1nLmluZGV4T2YoXCIrXCIpP0I9ITA6LTEhPT1nLmluZGV4T2YoXCIgXCIpJiYoQT0hMCksdD0tMSE9PWcuaW5kZXhPZihcIiNcIikpO2gmJihoPXBhcnNlSW50KGguc3Vic3RyKDEpLDEwKSk7Zz1mdW5jdGlvbihhLGIpe3ZhciBjO2I9U2suYnVpbHRpbi5hc251bSQoYik7dmFyIGQ9ITE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXswPmEmJihhPS1hLGQ9ITApO3ZhciBlPWEudG9TdHJpbmcoYil9ZWxzZSBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/KGU9YS5zdHIkKGIsITEpLDI8ZS5sZW5ndGgmJlwiLjBcIj09PWUuc3Vic3RyKC0yKSYmKGU9ZS5zdWJzdHIoMCxlLmxlbmd0aC0yKSksZD1hLm5iJGlzbmVnYXRpdmUoKSk6YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xz8oZT1hLnN0ciQoYiwhMSksZD1cbmEubmIkaXNuZWdhdGl2ZSgpKTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmcmJihlPWEuc3RyJChiLCExKSxkPWEubmIkaXNuZWdhdGl2ZSgpKTtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1lLFwidW5oYW5kbGVkIG51bWJlciBmb3JtYXRcIik7YT0hMTtpZihoKWZvcihjPWUubGVuZ3RoO2M8aDsrK2MpZT1cIjBcIitlLGE9ITA7Yz1cIlwiO2Q/Yz1cIi1cIjpCP2M9XCIrXCIrYzpBJiYoYz1cIiBcIitjKTt0JiYoMTY9PT1iP2MrPVwiMHhcIjo4IT09Ynx8YXx8XCIwXCI9PT1lfHwoYys9XCIwXCIpKTtyZXR1cm5bYyxlXX07ZT1mdW5jdGlvbihhKXt2YXIgYj1hWzBdO2E9YVsxXTtpZihrKXtrPXBhcnNlSW50KGssMTApO3ZhciBjPWEubGVuZ3RoK2IubGVuZ3RoO2lmKEwpZm9yKDtjPGs7KytjKWE9XCIwXCIrYTtlbHNlIGlmKHYpe2Zvcig7YzxrOysrYylhKz1cIiBcIjtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJihhKz1iLGI9XCJcIil9ZWxzZSBmb3IoO2M8azsrK2MpYj1cIiBcIitifXJldHVybiBiK2F9O2lmKGEuY29uc3RydWN0b3I9PT1cblNrLmJ1aWx0aW4udHVwbGUpZj1hLnZbbl07ZWxzZSBpZih2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdCYmdm9pZCAwIT09ZilmPWYuc3Vic3RyaW5nKDEsZi5sZW5ndGgtMSksZj1hLm1wJHN1YnNjcmlwdChuZXcgYyhmKSk7ZWxzZSBpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5kaWN0fHxhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5saXN0KWY9YTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEudHAkbmFtZStcIiBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICdtcCRzdWJzY3JpcHQnXCIpO2lmKFwiZFwiPT09cHx8XCJpXCI9PT1wKXt2YXIgdT1nKGYsMTApO2lmKHZvaWQgMD09PXVbMV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJVwiK3ArXCIgZm9ybWF0OiBhIG51bWJlciBpcyByZXF1aXJlZCwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGYpKTtwPXVbMV07dVsxXT0tMSE9PXAuaW5kZXhPZihcIi5cIik/cGFyc2VJbnQocCwxMCkudG9TdHJpbmcoKTpcbnA7cmV0dXJuIGUodSl9aWYoXCJvXCI9PT1wKXJldHVybiBlKGcoZiw4KSk7aWYoXCJ4XCI9PT1wKXJldHVybiBlKGcoZiwxNikpO2lmKFwiWFwiPT09cClyZXR1cm4gZShnKGYsMTYpKS50b1VwcGVyQ2FzZSgpO2lmKFwiZlwiPT09cHx8XCJGXCI9PT1wfHxcImVcIj09PXB8fFwiRVwiPT09cHx8XCJnXCI9PT1wfHxcIkdcIj09PXApe3U9U2suYnVpbHRpbi5hc251bSQoZik7XCJzdHJpbmdcIj09PXR5cGVvZiB1JiYodT1OdW1iZXIodSkpO2lmKEluZmluaXR5PT09dSlyZXR1cm5cImluZlwiO2lmKC1JbmZpbml0eT09PXUpcmV0dXJuXCItaW5mXCI7aWYoaXNOYU4odSkpcmV0dXJuXCJuYW5cIjtuPVtcInRvRXhwb25lbnRpYWxcIixcInRvRml4ZWRcIixcInRvUHJlY2lzaW9uXCJdW1wiZWZnXCIuaW5kZXhPZihwLnRvTG93ZXJDYXNlKCkpXTtpZih2b2lkIDA9PT1ofHxcIlwiPT09aClpZihcImVcIj09PXB8fFwiRVwiPT09cCloPTY7ZWxzZSBpZihcImZcIj09PXB8fFwiRlwiPT09cCloPVNrLl9fZnV0dXJlX18ucHl0aG9uMz82Ojc7bj11W25dKGgpO1NrLmJ1aWx0aW4uY2hlY2tGbG9hdChmKSYmXG4wPT09dSYmLUluZmluaXR5PT09MS91JiYobj1cIi1cIituKTtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJig3PD1uLmxlbmd0aCYmXCIwLjAwMDBcIj09bi5zbGljZSgwLDYpJiYoYj1wYXJzZUZsb2F0KG4pLG49Yi50b0V4cG9uZW50aWFsKCkpLFwiLVwiPT1uLmNoYXJBdChuLmxlbmd0aC0yKSYmKG49bi5zbGljZSgwLG4ubGVuZ3RoLTEpK1wiMFwiK24uY2hhckF0KG4ubGVuZ3RoLTEpKSk7LTEhPT1cIkVGR1wiLmluZGV4T2YocCkmJihuPW4udG9VcHBlckNhc2UoKSk7cmV0dXJuIGUoW1wiXCIsbl0pfWlmKFwiY1wiPT09cCl7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBmKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGYpO2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0XylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShmLnYpO2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShmLnN0ciQoMTAsXG4hMSlbMF0pO2lmKGYuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnN0cilyZXR1cm4gZi52LnN1YnN0cigwLDEpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcIik7fWlmKFwiclwiPT09cClyZXR1cm4gcD1Tay5idWlsdGluLnJlcHIoZiksaD9wLnYuc3Vic3RyKDAsaCk6cC52O2lmKFwic1wiPT09cCYmYz09PVNrLmJ1aWx0aW4uc3RyKXtwPW5ldyBTay5idWlsdGluLnN0cihmKTtwPXAuJGpzc3RyKCk7aWYoaClyZXR1cm4gcC5zdWJzdHIoMCxoKTtrJiYocD1lKFtcIiBcIixwXSkpO3JldHVybiBwfWlmKFwiYlwiPT09cHx8XCJzXCI9PT1wKXtpZihjPT09U2suYnVpbHRpbi5zdHIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgJ2InXCIpO2lmKCEoZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpJiZ2b2lkIDA9PT0odT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGYsU2suYnVpbHRpbi5zdHIuJGJ5dGVzKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJWIgcmVxdWlyZXMgYSBieXRlcy1saWtlIG9iamVjdCwgb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBfX2J5dGVzX18sIG5vdCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShmKStcIidcIik7dm9pZCAwIT09dSYmKGY9bmV3IFNrLmJ1aWx0aW4uYnl0ZXMoZikpO3A9Zi4kanNzdHIoKTtpZihoKXJldHVybiBwLnN1YnN0cigwLGgpO2smJihwPWUoW1wiIFwiLHBdKSk7cmV0dXJuIHB9aWYoXCIlXCI9PT1wKXJldHVyblwiJVwifSk7cmV0dXJuIG5ldyBjKGUpfX0scHJvdG86e3RvU3RyaW5nKCl7cmV0dXJuIHRoaXMudn0sJHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS50cCRuZXcoYSxiKTtjLiRtYW5nbGVkPWEuJG1hbmdsZWQ7Yy4kc2F2ZWRLZXlIYXNoPWEuJHNhdmVkS2V5SGFzaDtjLnY9YS52O3JldHVybiBjfSwkanNzdHIoKXtyZXR1cm4gdGhpcy52fSwkaGFzQXN0cmFsQ29kZVBvaW50cygpe2lmKG51bGw9PT10aGlzLmNvZGVwb2ludHMpcmV0dXJuITE7aWYodm9pZCAwIT09dGhpcy5jb2RlcG9pbnRzKXJldHVybiEwO2Zvcih2YXIgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspe2xldCBiPVxudGhpcy52LmNoYXJDb2RlQXQoYSk7aWYoNTUyOTY8PWImJjU3MzQ0PmIpe3RoaXMuY29kZXBvaW50cz1bXTtmb3IoYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspdGhpcy5jb2RlcG9pbnRzLnB1c2goYSksYj10aGlzLnYuY2hhckNvZGVBdChhKSw1NTI5Njw9YiYmNTYzMjA+YiYmYSsrO3JldHVybiEwfX10aGlzLmNvZGVwb2ludHM9bnVsbDtyZXR1cm4hMX0sc2skYXNhcnJheSgpe2NvbnN0IGE9W107aWYodGhpcy4kaGFzQXN0cmFsQ29kZVBvaW50cygpKXt2YXIgYj10aGlzLmNvZGVwb2ludHM7Zm9yKGxldCBjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyaW5nKGJbY10sYltjKzFdKSkpfWVsc2UgZm9yKGI9MDtiPHRoaXMudi5sZW5ndGg7YisrKWEucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52W2JdKSk7cmV0dXJuIGF9LGZpbmQkbGVmdDpoKCExKSxmaW5kJHJpZ2h0OmgoITApLGdldCR0Z3QoYSl7aWYoYSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0cilyZXR1cm4gYS52O3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgc3RyIGluc3RhbmNlIGlzIHJlcXVpcmVkIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO319LG1ldGhvZHM6e2VuY29kZTp7JG1ldGg6ZnVuY3Rpb24oYSxiKXsoe2VuY29kaW5nOmEsZXJyb3JzOmJ9PVNrLmJ1aWx0aW4uYnl0ZXMuY2hlY2skZW5jb2RlQXJncyhcImVuY29kZVwiLGEsYikpO2E9U2suYnVpbHRpbi5ieXRlcy5zdHIkZW5jb2RlKHRoaXMsYSxiKTtyZXR1cm4gU2suX19mdXR1cmVfXy5weXRob24zP2E6bmV3IFNrLmJ1aWx0aW4uc3RyKGEuJGpzc3RyKCkpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJlbmNvZGluZ1wiLFwiZXJyb3JzXCJdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSdzdHJpY3QnKVwiLCRkb2M6XCJFbmNvZGUgdGhlIHN0cmluZyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgZW5jb2RpbmcuXFxuXFxuICBlbmNvZGluZ1xcbiAgICBUaGUgZW5jb2RpbmcgaW4gd2hpY2ggdG8gZW5jb2RlIHRoZSBzdHJpbmcuXFxuICBlcnJvcnNcXG4gICAgVGhlIGVycm9yIGhhbmRsaW5nIHNjaGVtZSB0byB1c2UgZm9yIGVuY29kaW5nIGVycm9ycy5cXG4gICAgVGhlIGRlZmF1bHQgaXMgJ3N0cmljdCcgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZSBhXFxuICAgIFVuaWNvZGVFbmNvZGVFcnJvci4gIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgJ2lnbm9yZScsICdyZXBsYWNlJyBhbmRcXG4gICAgJ3htbGNoYXJyZWZyZXBsYWNlJyBhcyB3ZWxsIGFzIGFueSBvdGhlciBuYW1lIHJlZ2lzdGVyZWQgd2l0aFxcbiAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IgdGhhdCBjYW4gaGFuZGxlIFVuaWNvZGVFbmNvZGVFcnJvcnMuXCJ9LFxucmVwbGFjZTp7JG1ldGgoYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpO2M9dGhpcy5nZXQkdGd0KGMpO2Q9dm9pZCAwPT09ZD8tMTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9bmV3IFJlZ0V4cChhKGIpLFwiZ1wiKTtpZigwPmQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYucmVwbGFjZShiLGMpKTtsZXQgZT0wO2I9dGhpcy52LnJlcGxhY2UoYixhPT5lKys8ZD9jOmEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIG9sZCwgbmV3LCBjb3VudD0tMSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgb2xkIHJlcGxhY2VkIGJ5IG5ldy5cXG5cXG4gIGNvdW50XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIHRvIHJlcGxhY2UuXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMuXFxuXFxuSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGNvdW50IGlzIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBjb3VudCBvY2N1cnJlbmNlcyBhcmVcXG5yZXBsYWNlZC5cIn0sXG5zcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT1jKHRoaXMsYSxiKTtiPVtdO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cmluZyhhW2NdLGFbKytjXSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wic2VwXCIsXCJtYXhzcGxpdFwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLC0xXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcIiwkZG9jOlwiUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgc2VwIGFzIHRoZSBkZWxpbWl0ZXIgc3RyaW5nLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBzdHJpbmcuXFxuICAgIE5vbmUgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBzcGxpdCBhY2NvcmRpbmcgdG8gYW55IHdoaXRlc3BhY2UsXFxuICAgIGFuZCBkaXNjYXJkIGVtcHR5IHN0cmluZ3MgZnJvbSB0aGUgcmVzdWx0LlxcbiAgbWF4c3BsaXRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygc3BsaXRzIHRvIGRvLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIG5vIGxpbWl0LlwifSxcbnJzcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT1jKHRoaXMsYSwtMSk7dmFyIGQ9MD5iPzA6MiooYS5sZW5ndGgvMi1iKTtiPVtdO2ZvcigwPj1kP2Q9MDpiLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zbGljZSgwLGFbZC0xXSkpKTtkPGEubGVuZ3RoO2QrKyliLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zdWJzdHJpbmcoYVtkXSxhWysrZF0pKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9LCRmbGFnczp7TmFtZWRBcmdzOltcInNlcFwiLFwibWF4c3BsaXRcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4ubm9uZS5ub25lJCwtMV19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyIHN0cmluZy5cXG5cXG4gIHNlcFxcbiAgICBUaGUgZGVsaW1pdGVyIGFjY29yZGluZyB3aGljaCB0byBzcGxpdCB0aGUgc3RyaW5nLlxcbiAgICBOb25lICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgc3BsaXQgYWNjb3JkaW5nIHRvIGFueSB3aGl0ZXNwYWNlLFxcbiAgICBhbmQgZGlzY2FyZCBlbXB0eSBzdHJpbmdzIGZyb20gdGhlIHJlc3VsdC5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cXG5cXG5TcGxpdHMgYXJlIGRvbmUgc3RhcnRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGFuZCB3b3JraW5nIHRvIHRoZSBmcm9udC5cIn0sXG5qb2luOnskbWV0aChhKXtjb25zdCBiPVtdO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzZXF1ZW5jZSBpdGVtIFwiK2IubGVuZ3RoK1wiOiBleHBlY3RlZCBzdHIsIFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGZvdW5kXCIpO2IucHVzaChhLnYpfSksKCk9Pm5ldyBTay5idWlsdGluLnN0cihiLmpvaW4odGhpcy52KSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJDb25jYXRlbmF0ZSBhbnkgbnVtYmVyIG9mIHN0cmluZ3MuXFxuXFxuVGhlIHN0cmluZyB3aG9zZSBtZXRob2QgaXMgY2FsbGVkIGlzIGluc2VydGVkIGluIGJldHdlZW4gZWFjaCBnaXZlbiBzdHJpbmcuXFxuVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBhcyBhIG5ldyBzdHJpbmcuXFxuXFxuRXhhbXBsZTogJy4nLmpvaW4oWydhYicsICdwcScsICdycyddKSAtPiAnYWIucHEucnMnXCJ9LFxuY2FwaXRhbGl6ZTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0aGlzLnYuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY2FwaXRhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLlxcblxcbk1vcmUgc3BlY2lmaWNhbGx5LCBtYWtlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaGF2ZSB1cHBlciBjYXNlIGFuZCB0aGUgcmVzdCBsb3dlclxcbmNhc2UuXCJ9LHRpdGxlOnskbWV0aDpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy52LnJlcGxhY2UoL1thLXpdW2Etel0qL2dpLGE9PmFbMF0udG9VcHBlckNhc2UoKSthLnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGVyZSBlYWNoIHdvcmQgaXMgdGl0bGVjYXNlZC5cXG5cXG5Nb3JlIHNwZWNpZmljYWxseSwgd29yZHMgc3RhcnQgd2l0aCB1cHBlcmNhc2VkIGNoYXJhY3RlcnMgYW5kIGFsbCByZW1haW5pbmdcXG5jYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXIgY2FzZS5cIn0sXG5jZW50ZXI6eyRtZXRoOmYoITEsITApLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJHNlbGYsIHdpZHRoLCBmaWxsY2hhcj0nICcsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNlbnRlcmVkIHN0cmluZyBvZiBsZW5ndGggd2lkdGguXFxuXFxuUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuXCJ9LGNvdW50OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmdldCR0Z3QoYSk7KHtzdGFydDpiLGVuZDpjfT1sKHRoaXMsYixjKSk7aWYoYzxiKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKDApO2E9YS5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZyxcIlxcXFwkJlwiKTthPW5ldyBSZWdFeHAoYSxcImdcIik7cmV0dXJuKGI9dGhpcy52LnNsaWNlKGIsYykubWF0Y2goYSkpP25ldyBTay5idWlsdGluLmludF8oYi5sZW5ndGgpOm5ldyBTay5idWlsdGluLmludF8oMCl9LCRmbGFnczp7TWluQXJnczoxLFxuTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgc3ViIGluXFxuc3RyaW5nIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZVxcbmludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlwifSxleHBhbmR0YWJzOnskbWV0aDpmdW5jdGlvbihhKXtpZihTay5idWlsdGluLmNoZWNrSW50KGEpKWE9U2suYnVpbHRpbi5hc251bSQoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkLCBnb3QgdHlwZVwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTtjb25zdCBiPUFycmF5KGErMSkuam9pbihcIiBcIiksYz10aGlzLnYucmVwbGFjZSgvKFteXFxyXFxuXFx0XSopXFx0L2csKGMsZCk9PmQrYi5zbGljZShkLmxlbmd0aCVhKSk7XG5yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJ0YWJzaXplXCJdLERlZmF1bHRzOls4XX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIHRhYnNpemU9OClcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIGV4cGFuZGVkIHVzaW5nIHNwYWNlcy5cXG5cXG5JZiB0YWJzaXplIGlzIG5vdCBnaXZlbiwgYSB0YWIgc2l6ZSBvZiA4IGNoYXJhY3RlcnMgaXMgYXNzdW1lZC5cIn0sZmluZDp7JG1ldGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRsZWZ0KGEsYixjKSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIFMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCxcXG5zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gU1tzdGFydDplbmRdLiAgT3B0aW9uYWxcXG5hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXFxuXFxuUmV0dXJuIC0xIG9uIGZhaWx1cmUuXCJ9LFxucGFydGl0aW9uOnskbWV0aDplKCExKSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHNlcCwgLylcIiwkZG9jOlwiUGFydGl0aW9uIHRoZSBzdHJpbmcgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3IgaW4gdGhlIHN0cmluZy4gIElmIHRoZSBzZXBhcmF0b3IgaXMgZm91bmQsXFxucmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxcbml0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBzdHJpbmdcXG5hbmQgdHdvIGVtcHR5IHN0cmluZ3MuXCJ9LGluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkbGVmdChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzdHJpbmcgbm90IGZvdW5kXCIpO1xucmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBTIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsIFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLlwifSxsanVzdDp7JG1ldGg6ZighMSwhMSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIGZpbGxjaGFyPScgJywgLylcIiwkZG9jOlwiUmV0dXJuIGEgbGVmdC1qdXN0aWZpZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sXG5sb3dlcjp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b0xvd2VyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIGxvd2VyY2FzZS5cIn0sbHN0cmlwOnskbWV0aDpiKC9eXFxzKy9nLGE9PlwiXltcIithK1wiXStcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuXFxuXFxuSWYgY2hhcnMgaXMgZ2l2ZW4gYW5kIG5vdCBOb25lLCByZW1vdmUgY2hhcmFjdGVycyBpbiBjaGFycyBpbnN0ZWFkLlwifSxyZmluZDp7JG1ldGgoYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRyaWdodChhLGIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LFxuJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0scmluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkcmlnaHQoYSxiLGMpO2lmKC0xPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwic3Vic3RyaW5nIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLlwifSxcbnJqdXN0OnskbWV0aDpmKCEwLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCB3aWR0aCwgZmlsbGNoYXI9JyAnLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSByaWdodC1qdXN0aWZpZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0scnN0cmlwOnskbWV0aDpiKC9cXHMrJC9nLGE9PlwiW1wiK2ErXCJdKyRcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZSByZW1vdmVkLlxcblxcbklmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC5cIn0scnBhcnRpdGlvbjp7JG1ldGg6ZSghMCksJGZsYWdzOntPbmVBcmc6ITB9LFxuJHRleHRzaWc6XCIoJHNlbGYsIHNlcCwgLylcIiwkZG9jOlwiUGFydGl0aW9uIHRoZSBzdHJpbmcgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3IgaW4gdGhlIHN0cmluZywgc3RhcnRpbmcgYXQgdGhlIGVuZC4gSWZcXG50aGUgc2VwYXJhdG9yIGlzIGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGVcXG5zZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuXFxuXFxuSWYgdGhlIHNlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3NcXG5hbmQgdGhlIG9yaWdpbmFsIHN0cmluZy5cIn0sc3BsaXRsaW5lczp7JG1ldGg6ZnVuY3Rpb24oYSl7YT1Tay5taXNjZXZhbC5pc1RydWUoYSk7Y29uc3QgYj10aGlzLnYsYz1bXSxkPWIubGVuZ3RoO3ZhciBlPVxuMDtmb3IobGV0IGc9MDtnPGQ7ZysrKXt2YXIgZj1iLmNoYXJBdChnKTtpZihcIlxcblwiPT09Yi5jaGFyQXQoZysxKSYmXCJcXHJcIj09PWYpZj1nKzIsZT1iLnNsaWNlKGUsZiksYXx8KGU9ZS5yZXBsYWNlKC8oXFxyfFxcbikvZyxcIlwiKSksYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlKSksZT1mO2Vsc2UgaWYoXCJcXG5cIj09PWYmJlwiXFxyXCIhPT1iLmNoYXJBdChnLTEpfHxcIlxcclwiPT09ZilmPWcrMSxlPWIuc2xpY2UoZSxmKSxhfHwoZT1lLnJlcGxhY2UoLyhcXHJ8XFxuKS9nLFwiXCIpKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGUpKSxlPWZ9ZTxkJiYoZT1iLnNsaWNlKGUsZCksYXx8KGU9ZS5yZXBsYWNlKC8oXFxyfFxcbikvZyxcIlwiKSksYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlKSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJrZWVwZW5kc1wiXSxEZWZhdWx0czpbITFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywga2VlcGVuZHM9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBzdHJpbmcsIGJyZWFraW5nIGF0IGxpbmUgYm91bmRhcmllcy5cXG5cXG5MaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHMgaXMgZ2l2ZW4gYW5kXFxudHJ1ZS5cIn0sXG5zdHJpcDp7JG1ldGg6YigvXlxccyt8XFxzKyQvZyxhPT5cIl5bXCIrYStcIl0rfFtcIithK1wiXSskXCIpLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGNoYXJzPU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVtb3ZlLlxcblxcbklmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC5cIn0sc3dhcGNhc2U6eyRtZXRoKCl7Y29uc3QgYT10aGlzLnYucmVwbGFjZSgvW2Etel0vZ2ksYT0+e2NvbnN0IGI9YS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09YT9hLnRvVXBwZXJDYXNlKCk6Yn0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiQ29udmVydCB1cHBlcmNhc2UgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIHRvIHVwcGVyY2FzZS5cIn0sXG51cHBlcjp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b1VwcGVyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIHVwcGVyY2FzZS5cIn0sc3RhcnRzd2l0aDp7JG1ldGg6ZChcInN0YXJ0c3dpdGhcIiwoYSxiKT0+MD09PWEuaW5kZXhPZihiKSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIFMgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cXG5XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IFMgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXFxuV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi5cXG5wcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdHJpbmdzIHRvIHRyeS5cIn0sXG5lbmRzd2l0aDp7JG1ldGg6ZChcImVuZHN3aXRoXCIsKGEsYik9Pi0xIT09YS5pbmRleE9mKGIsYS5sZW5ndGgtYi5sZW5ndGgpKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlMuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIFMgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXFxuV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBTIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxcbldpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBTIGF0IHRoYXQgcG9zaXRpb24uXFxuc3VmZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2Ygc3RyaW5ncyB0byB0cnkuXCJ9LGlzYXNjaWk6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15bXFx4MDAtXFx4N0ZdKiQvLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIixcbiRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBBU0NJSSwgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkFTQ0lJIGNoYXJhY3RlcnMgaGF2ZSBjb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UgVSswMDAwLVUrMDA3Ri5cXG5FbXB0eSBzdHJpbmcgaXMgQVNDSUkgdG9vLlwifSxpc2xvd2VyOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJi9bYS16XS8udGVzdCh0aGlzLnYpJiYhL1tBLVpdLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBsb3dlcmNhc2Ugc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgbG93ZXJjYXNlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZSBhbmRcXG50aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LFxuaXN1cHBlcjp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1thLXpdLy50ZXN0KHRoaXMudikmJi9bQS1aXS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGFuIHVwcGVyY2FzZSBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyB1cHBlcmNhc2UgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgdXBwZXJjYXNlIGFuZFxcbnRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0saXN0aXRsZTp7JG1ldGg6ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMudjtsZXQgYj0hMSxjPSExLGQ7Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aDtlKyspaWYoZD1hLmNoYXJBdChlKSwhL1thLXpdLy50ZXN0KGQpJiYvW0EtWl0vLnRlc3QoZCkpe2lmKGMpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7XG5iPWM9ITB9ZWxzZSBpZigvW2Etel0vLnRlc3QoZCkmJiEvW0EtWl0vLnRlc3QoZCkpe2lmKCFjKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2I9ITB9ZWxzZSBjPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZS1jYXNlZCBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5JbiBhIHRpdGxlLWNhc2VkIHN0cmluZywgdXBwZXItIGFuZCB0aXRsZS1jYXNlIGNoYXJhY3RlcnMgbWF5IG9ubHlcXG5mb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuXCJ9LGlzc3BhY2U6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15cXHMrJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB3aGl0ZXNwYWNlIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkEgc3RyaW5nIGlzIHdoaXRlc3BhY2UgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgd2hpdGVzcGFjZSBhbmQgdGhlcmVcXG5pcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LGlzZGlnaXQ6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15cXGQrJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgZGlnaXQgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgYSBkaWdpdCBzdHJpbmcgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGlnaXRzIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXG5pc251bWVyaWM6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wodGhpcy52Lmxlbmd0aCYmIS9bXjAtOV0vLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIG51bWVyaWMgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgbnVtZXJpYyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBudW1lcmljIGFuZCB0aGVyZSBpcyBhdFxcbmxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0saXNhbHBoYTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1teYS16QS1aXS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGFuIGFscGhhYmV0aWMgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgYWxwaGFiZXRpYyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXG5pc2FsbnVtOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJiEvW15hLXpBLVowLTldLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYW4gYWxwaGEtbnVtZXJpYyBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBhbHBoYS1udW1lcmljIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhLW51bWVyaWMgYW5kXFxudGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSx6ZmlsbDp7JG1ldGg6ZnVuY3Rpb24oYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2xldCBiPVwiXCI7YS09dGhpcy52Lmxlbmd0aDtjb25zdCBjPVwiK1wiPT09dGhpcy52WzBdfHxcIi1cIj09PXRoaXMudlswXT8xOjA7XG5mb3IobGV0IGM9MDtjPGE7YysrKWIrPVwiMFwiO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cigwLGMpK2IrdGhpcy52LnN1YnN0cihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIC8pXCIsJGRvYzpcIlBhZCBhIG51bWVyaWMgc3RyaW5nIHdpdGggemVyb3Mgb24gdGhlIGxlZnQsIHRvIGZpbGwgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gd2lkdGguXFxuXFxuVGhlIHN0cmluZyBpcyBuZXZlciB0cnVuY2F0ZWQuXCJ9LGZvcm1hdDp7JG1ldGg6U2suZm9ybWF0dGluZy5mb3JtYXQsJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5mb3JtYXQoKmFyZ3MsICoqa3dhcmdzKSAtPiBzdHJcXG5cXG5SZXR1cm4gYSBmb3JtYXR0ZWQgdmVyc2lvbiBvZiBTLCB1c2luZyBzdWJzdGl0dXRpb25zIGZyb20gYXJncyBhbmQga3dhcmdzLlxcblRoZSBzdWJzdGl0dXRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGJyYWNlcyAoJ3snIGFuZCAnfScpLlwifSxcbl9fZm9ybWF0X186eyRtZXRoOlNrLmZvcm1hdHRpbmcuZm9ybWF0U3RyaW5nLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgZm9ybWF0X3NwZWMsIC8pXCIsJGRvYzpcIlJldHVybiBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgYXMgZGVzY3JpYmVkIGJ5IGZvcm1hdF9zcGVjLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOm51bGx9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uc3RyXCIsU2suYnVpbHRpbi5zdHIpO3ZhciBrPS9eW0EtWmEtejAtOV0rJC8scD0vKFsuKis/PXxcXFxcXFwvKClcXFtcXF1cXHtcXH1eJF0pL2csdT0vXltcXHNcXHhhMF0rLztTay5idWlsdGluLnN0ci4kcHkyZGVjb2RlPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKFNrLmJ1aWx0aW4uc3RyLHskbmFtZTpcImRlY29kZVwiLFxuJG1ldGgoYSxiKXtjb25zdCBjPW5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7cmV0dXJuIFNrLmJ1aWx0aW4uYnl0ZXMuJGRlY29kZS5jYWxsKGMsYSxiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wiZW5jb2RpbmdcIixcImVycm9yc1wiXX19KTt2YXIgQT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJzdHJfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDthLiRoYXNBc3RyYWxDb2RlUG9pbnRzKCk/KHRoaXMuJHNlcT1hLmNvZGVwb2ludHMsdGhpcy50cCRpdGVybmV4dD0oKT0+e2NvbnN0IGI9dGhpcy4kc2VxW3RoaXMuJGluZGV4XTtpZih2b2lkIDAhPT1iKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYS52LnN1YnN0cmluZyhiLHRoaXMuJHNlcVsrK3RoaXMuJGluZGV4XSkpfSk6KHRoaXMuJHNlcT1hLnYsdGhpcy50cCRpdGVybmV4dD0oKT0+e2NvbnN0IGE9dGhpcy4kc2VxW3RoaXMuJGluZGV4KytdO2lmKHZvaWQgMCE9PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX0pfSxcbml0ZXJuZXh0KCl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoKX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSksdD17YWJzdHJhY3Q6ITAsYXM6ITAsYm9vbGVhbjohMCxicmVhazohMCxieXRlOiEwLGNhc2U6ITAsY2F0Y2g6ITAsY2hhcjohMCxjbGFzczohMCxjb250aW51ZTohMCxjb25zdDohMCxkZWJ1Z2dlcjohMCxkZWZhdWx0OiEwLGRlbGV0ZTohMCxkbzohMCxkb3VibGU6ITAsZWxzZTohMCxlbnVtOiEwLGV4cG9ydDohMCxleHRlbmRzOiEwLGZhbHNlOiEwLGZpbmFsOiEwLGZpbmFsbHk6ITAsZmxvYXQ6ITAsZm9yOiEwLGZ1bmN0aW9uOiEwLGdvdG86ITAsaWY6ITAsaW1wbGVtZW50czohMCxpbXBvcnQ6ITAsaW46ITAsaW5zdGFuY2VvZjohMCxpbnQ6ITAsaW50ZXJmYWNlOiEwLGlzOiEwLGxvbmc6ITAsbmFtZXNwYWNlOiEwLFxubmF0aXZlOiEwLG5ldzohMCxudWxsOiEwLHBhY2thZ2U6ITAscHJpdmF0ZTohMCxwcm90ZWN0ZWQ6ITAscHVibGljOiEwLHJldHVybjohMCxzaG9ydDohMCxzdGF0aWM6ITAsc3VwZXI6ITAsc3dpdGNoOiEwLHN5bmNocm9uaXplZDohMCx0aGlzOiEwLHRocm93OiEwLHRocm93czohMCx0cmFuc2llbnQ6ITAsdHJ1ZTohMCx0cnk6ITAsdHlwZW9mOiEwLHVzZTohMCx2YXI6ITAsdm9pZDohMCx2b2xhdGlsZTohMCx3aGlsZTohMCx3aXRoOiEwLGNvbnN0cnVjdG9yOiEwLF9fZGVmaW5lR2V0dGVyX186ITAsX19kZWZpbmVTZXR0ZXJfXzohMCxhcHBseTohMCxhcmd1bWVudHM6ITAsY2FsbDohMCxjYWxsZXI6ITAsZXZhbDohMCxoYXNPd25Qcm9wZXJ0eTohMCxpc1Byb3RvdHlwZU9mOiEwLF9fbG9va3VwR2V0dGVyX186ITAsX19sb29rdXBTZXR0ZXJfXzohMCxfX25vU3VjaE1ldGhvZF9fOiEwLHByb3BlcnR5SXNFbnVtZXJhYmxlOiEwLHByb3RvdHlwZTohMCx0b1NvdXJjZTohMCx0b0xvY2FsZVN0cmluZzohMCxcbnRvU3RyaW5nOiEwLHVud2F0Y2g6ITAsdmFsdWVPZjohMCx3YXRjaDohMCxsZW5ndGg6ITAsbmFtZTohMH07U2suYnVpbHRpbi5zdHIucmVzZXJ2ZWRXb3Jkc189dH0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZ1bmM9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImZ1bmN0aW9uXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmZ1bmMsXCJidWlsdGluIGZ1bmMgc2hvdWxkIGJlIGNhbGxlZCBhcyBhIGNsYXNzIHdpdGggYG5ld2BcIik7dGhpcy5mdW5jX2NvZGU9YTt0aGlzLmZ1bmNfZ2xvYmFscz1jfHxudWxsO3RoaXMuJG5hbWU9YS5jb19uYW1lJiZhLmNvX25hbWUudnx8YS5uYW1lfHxcIjxuYXRpdmUgSlM+XCI7dGhpcy4kZD1Tay5idWlsdGluLmRpY3Q/bmV3IFNrLmJ1aWx0aW4uZGljdDp2b2lkIDA7dGhpcy4kZG9jPWEuJGRvYzt0aGlzLiRtb2R1bGU9U2suZ2xvYmFscyYmU2suZ2xvYmFscy5fX25hbWVfX3x8XG5Tay5idWlsdGluLm5vbmUubm9uZSQ7dGhpcy4kcXVhbG5hbWU9YS5jb19xdWFsbmFtZSYmYS5jb19xdWFsbmFtZS52fHx0aGlzLiRuYW1lO2lmKHZvaWQgMCE9PWUpZm9yKGxldCBhIGluIGUpYlthXT1lW2FdO3RoaXMuZnVuY19jbG9zdXJlPWI7dGhpcy4kbWVtb2lzZUZsYWdzKCk7dGhpcy5tZW1vaXNlZD1hLmNvX2Zhc3RjYWxsfHxudWxsO3RoaXMudHAkY2FsbD1hLmNvX2Zhc3RjYWxsP2EuYmluZCh0aGlzKTpTay5idWlsdGluLmZ1bmMucHJvdG90eXBlLnRwJGNhbGwuYmluZCh0aGlzKX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRlc2NyX2dldChhLGMpe3JldHVybiBudWxsPT09YT90aGlzOm5ldyBTay5idWlsdGluLm1ldGhvZCh0aGlzLGEpfSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8ZnVuY3Rpb24gXCIrdGhpcy4kcXVhbG5hbWUrXCI+XCIpfSx0cCRjYWxsKGEsYyl7dGhpcy5tZW1vaXNlZHx8KHRoaXMuJG1lbW9pc2VGbGFncygpLFxudGhpcy5tZW1vaXNlZD0hMCk7aWYodm9pZCAwPT09dGhpcy5jb19hcmdjb3VudCYmdm9pZCAwPT09dGhpcy5jb192YXJuYW1lcyYmIXRoaXMuY29fa3dhcmdzJiYhdGhpcy5mdW5jX2Nsb3N1cmUpe2lmKGMmJjAhPT1jLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzXCIpO3JldHVybiB0aGlzLmZ1bmNfY29kZS5hcHBseSh0aGlzLmZ1bmNfZ2xvYmFscyxhKX1hPXRoaXMuJHJlc29sdmVBcmdzKGEsYyk7dGhpcy5mdW5jX2Nsb3N1cmUmJmEucHVzaCh0aGlzLmZ1bmNfY2xvc3VyZSk7cmV0dXJuIHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGEpfX0sZ2V0c2V0czp7X19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJG5hbWUpfSwkc2V0KGEpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdFwiKTtcbnRoaXMuJG5hbWU9YS4kanNzdHIoKX19LF9fcXVhbG5hbWVfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kcXVhbG5hbWUpfSwkc2V0KGEpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fcXVhbG5hbWVfXyBtdXN0IGJlIHNldCB0byBhIHN0cmluZyBvYmplY3RcIik7dGhpcy4kcXVhbG5hbWU9YS4kanNzdHIoKX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdCxfX2RlZmF1bHRzX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy4kZGVmYXVsdHMpfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kZG9jKX19fSxwcm90bzp7JG1lbW9pc2VGbGFncygpe3RoaXMuY29fdmFybmFtZXM9dGhpcy5mdW5jX2NvZGUuY29fdmFybmFtZXM7dGhpcy5jb19hcmdjb3VudD10aGlzLmZ1bmNfY29kZS5jb19hcmdjb3VudDt2b2lkIDA9PT1cbnRoaXMuY29fYXJnY291bnQmJnRoaXMuY29fdmFybmFtZXMmJih0aGlzLmNvX2FyZ2NvdW50PXRoaXMuY29fYXJnY291bnQ9dGhpcy5jb192YXJuYW1lcy5sZW5ndGgpO3RoaXMuY29fa3dvbmx5YXJnY291bnQ9dGhpcy5mdW5jX2NvZGUuY29fa3dvbmx5YXJnY291bnR8fDA7dGhpcy5jb192YXJhcmdzPXRoaXMuZnVuY19jb2RlLmNvX3ZhcmFyZ3M7dGhpcy5jb19rd2FyZ3M9dGhpcy5mdW5jX2NvZGUuY29fa3dhcmdzO3RoaXMuJGRlZmF1bHRzPXRoaXMuZnVuY19jb2RlLiRkZWZhdWx0c3x8W107dGhpcy4ka3dkZWZzPXRoaXMuZnVuY19jb2RlLiRrd2RlZnN8fFtdfSwkcmVzb2x2ZUFyZ3M6ZnVuY3Rpb24oYSxjKXt2YXIgYj10aGlzLmNvX2FyZ2NvdW50O3ZvaWQgMD09PWImJihiPXRoaXMuY29fdmFybmFtZXM/dGhpcy5jb192YXJuYW1lcy5sZW5ndGg6YS5sZW5ndGgpO3ZhciBlPXRoaXMuY29fdmFybmFtZXN8fFtdLGY9dGhpcy5jb19rd29ubHlhcmdjb3VudHx8MDtsZXQgbD1iK1xuZjtpZighKDAhPT1mfHx0aGlzLmNvX2t3YXJnc3x8YyYmMCE9PWMubGVuZ3RofHx0aGlzLmNvX3ZhcmFyZ3MpKXtpZihhLmxlbmd0aD09YilyZXR1cm4gYTtpZigwPT09YS5sZW5ndGgmJnRoaXMuJGRlZmF1bHRzJiZ0aGlzLiRkZWZhdWx0cy5sZW5ndGg9PT1iKXtmb3IoZT0wO2UhPXRoaXMuJGRlZmF1bHRzLmxlbmd0aDtlKyspYVtlXT10aGlzLiRkZWZhdWx0c1tlXTtyZXR1cm4gYX19bGV0IGg7dGhpcy5jb19rd2FyZ3MmJihoPVtdKTt2YXIgZD1hLmxlbmd0aDtsZXQgZz1hLmxlbmd0aDw9Yj9hOmEuc2xpY2UoMCxiKTtpZih0aGlzLmNvX3ZhcmFyZ3MpYT1hLmxlbmd0aD5nLmxlbmd0aD9hLnNsaWNlKGcubGVuZ3RoKTpbXSxnW2xdPW5ldyBTay5idWlsdGluLnR1cGxlKGEpO2Vsc2UgaWYoZD5iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgdGFrZXMgXCIrYitcIiBwb3NpdGlvbmFsIGFyZ3VtZW50XCIrKDE9PWI/XCJcIjpcInNcIikrXCIgYnV0IFwiK2QrKDE9PVxuZD9cIiB3YXMgXCI6XCIgd2VyZSBcIikrXCIgZ2l2ZW5cIik7aWYoYyl7aWYodGhpcy5mdW5jX2NvZGUubm9fa3cpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50c1wiKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSs9Mil7ZD1jW2FdO3ZhciBuPWNbYSsxXSxrPWUuaW5kZXhPZihkKTtpZigwPD1rKXtpZih2b2lkIDAhPT1nW2tdKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3IgYXJndW1lbnQgJ1wiK2QrXCInXCIpO2dba109bn1lbHNlIGlmKGgpaC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihkKSxuKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnXCIrZCtcIidcIik7fX1jPXRoaXMuJGRlZmF1bHRzfHxbXTthPTA7ZD1bXTtuPSExO2ZvcihrPWItYy5sZW5ndGg7YTxcbms7YSsrKXZvaWQgMD09PWdbYV0mJihkLnB1c2goZVthXSksdm9pZCAwPT09ZVthXSYmKG49ITApKTtpZigwIT1kLmxlbmd0aCYmKHRoaXMuY29fYXJnY291bnR8fHRoaXMuY29fdmFybmFtZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgbWlzc2luZyBcIitkLmxlbmd0aCtcIiByZXF1aXJlZCBhcmd1bWVudFwiKygxPT1kLmxlbmd0aD9cIlwiOlwic1wiKSsobj9cIlwiOlwiOiBcIitkLmpvaW4oXCIsIFwiKSkpO2Zvcig7YTxiO2ErKyl2b2lkIDA9PT1nW2FdJiYoZ1thXT1jW2Eta10pO2lmKDA8Zil7Zj1bXTtjPXRoaXMuJGt3ZGVmcztmb3IoYT1iO2E8bDthKyspdm9pZCAwPT09Z1thXSYmKHZvaWQgMCE9PWNbYS1iXT9nW2FdPWNbYS1iXTpmLnB1c2goZVthXSkpO2lmKDAhPT1mLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIG1pc3NpbmcgXCIrZi5sZW5ndGgrXCIgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudFwiKygxPT1cbmYubGVuZ3RoP1wiXCI6XCJzXCIpK1wiOiBcIitmLmpvaW4oXCIsIFwiKSk7fWlmKHRoaXMuZnVuY19jbG9zdXJlJiZlKWZvcihiPWcubGVuZ3RoO2I8ZS5sZW5ndGg7YisrKWcucHVzaCh2b2lkIDApO2gmJmcudW5zaGlmdChoKTtyZXR1cm4gZ319fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5hc251bSQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWF8fG51bGw9PT1hfHxcIm51bWJlclwiPT09dHlwZW9mIGE/YTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfP1wibnVtYmVyXCI9PT10eXBlb2YgYS52P2EudjphLnYudG9TdHJpbmcoKTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/YS52OmE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bnVsbDphfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmFzbnVtJFwiLFNrLmJ1aWx0aW4uYXNudW0kKTtTay5idWlsdGluLmFzc2skPWZ1bmN0aW9uKGEpe3JldHVybiAwPT09YSUxP25ldyBTay5idWlsdGluLmludF8oYSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uYXNzayRcIixTay5idWlsdGluLmFzc2skKTtTay5idWlsdGluLmFzbnVtJG5vZmxvYXQ9ZnVuY3Rpb24oYSl7aWYodm9pZCAwPT09YXx8bnVsbD09PWEpcmV0dXJuIGE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWE9YS50b1N0cmluZygpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XylhPWEudi50b1N0cmluZygpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKWE9YS52LnRvU3RyaW5nKCk7ZWxzZXtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXJldHVybiBudWxsO3JldHVybn1pZigwPmEuaW5kZXhPZihcIi5cIikmJjA+YS5pbmRleE9mKFwiZVwiKSYmMD5hLmluZGV4T2YoXCJFXCIpKXJldHVybiBhO3ZhciBiPTA7aWYoMDw9YS5pbmRleE9mKFwiZVwiKSl7dmFyIGM9YS5zdWJzdHIoMCxhLmluZGV4T2YoXCJlXCIpKTtiPWEuc3Vic3RyKGEuaW5kZXhPZihcImVcIikrMSl9ZWxzZSAwPD1hLmluZGV4T2YoXCJFXCIpP1xuKGM9YS5zdWJzdHIoMCxhLmluZGV4T2YoXCJlXCIpKSxiPWEuc3Vic3RyKGEuaW5kZXhPZihcIkVcIikrMSkpOmM9YTtiPXBhcnNlSW50KGIsMTApO2E9Yy5pbmRleE9mKFwiLlwiKTtpZigwPmEpe2lmKDA8PWIpe2Zvcig7MDxiLS07KWMrPVwiMFwiO3JldHVybiBjfXJldHVybiBjLmxlbmd0aD4tYj9jLnN1YnN0cigwLGMubGVuZ3RoK2IpOjB9Yz0wPT09YT9jLnN1YnN0cigxKTphPGMubGVuZ3RoP2Muc3Vic3RyKDAsYSkrYy5zdWJzdHIoYSsxKTpjLnN1YnN0cigwLGEpO2ZvcihhKz1iO2E+Yy5sZW5ndGg7KWMrPVwiMFwiO3JldHVybiBjPTA+PWE/MDpjLnN1YnN0cigwLGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmFzbnVtJG5vZmxvYXRcIixTay5idWlsdGluLmFzbnVtJG5vZmxvYXQpO1NrLmJ1aWx0aW4ucm91bmQ9ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7aWYoIVNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kKXtpZighU2suYnVpbHRpbi5jaGVja051bWJlcihhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIGZsb2F0IGlzIHJlcXVpcmVkXCIpO1xuaWYoYS5yb3VuZCQpcmV0dXJuIGEucm91bmQkKGMpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJ19fZmxvYXRfXydcIik7fWlmKHZvaWQgMCE9PWMmJiFTay5idWlsdGluLmNoZWNrTm9uZShjKSYmIVNrLm1pc2NldmFsLmlzSW5kZXgoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4XCIpO2E9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRyb3VuZCk7aWYodm9pZCAwIT09YSlyZXR1cm4gdm9pZCAwIT09Yz9Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbY10pOlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtdKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIGZsb2F0IGlzIHJlcXVpcmVkXCIpO307U2suYnVpbHRpbi5sZW49XG5mdW5jdGlvbihhKXtpZihhLnNxJGxlbmd0aClhPWEuc3EkbGVuZ3RoKCEwKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9iamVjdCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgaGFzIG5vIGxlbigpXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpfTtTay5idWlsdGluLm1pbj1mdW5jdGlvbihhLGMpe2xldCBiO2NvbnN0IGU9YS5sZW5ndGg7aWYoIWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibWluIGV4cGVjdGVkIDEgYXJndW1lbnQsIGdvdCAwXCIpO2NvbnN0IFtoLGRdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwibWluXCIsW1wiZGVmYXVsdFwiLFwia2V5XCJdLFtdLGMsW251bGwsU2suYnVpbHRpbi5ub25lLm5vbmUkXSk7aWYoMTxlJiZudWxsIT09aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSBhIGRlZmF1bHQgZm9yIG1pbigpIHdpdGggbXVsdGlwbGUgcG9zaXRpb25hbCBhcmd1bWVudHNcIik7XG5iPTE9PWU/U2suYWJzdHIuaXRlcihhWzBdKTpTay5hYnN0ci5pdGVyKG5ldyBTay5idWlsdGluLnR1cGxlKGEpKTtpZighU2suYnVpbHRpbi5jaGVja05vbmUoZCkmJiFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2xldCBnO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLnRwJGl0ZXJuZXh0KCEwKSxhPT57Zz1hO2lmKHZvaWQgMCE9PWcpcmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpP1NrLm1pc2NldmFsLml0ZXJGb3IoYixhPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsZyxcIkx0XCIpJiYoZz1hKX0pOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtnXSksYT0+U2subWlzY2V2YWwuaXRlckZvcihiLGI9PlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFxuW2JdKSxjPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcIkx0XCIpJiYoZz1iLGE9Yyl9KSkpfSwoKT0+e2lmKHZvaWQgMD09PWcpe2lmKG51bGw9PT1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJtaW4oKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2VcIik7Zz1ofXJldHVybiBnfSl9O1NrLmJ1aWx0aW4ubWF4PWZ1bmN0aW9uKGEsYyl7bGV0IGI7Y29uc3QgZT1hLmxlbmd0aDtpZighZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtYXggZXhwZWN0ZWQgMSBhcmd1bWVudCwgZ290IDBcIik7Y29uc3QgW2gsZF09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJtaW5cIixbXCJkZWZhdWx0XCIsXCJrZXlcIl0sW10sYyxbbnVsbCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtpZigxPGUmJm51bGwhPT1oKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGEgZGVmYXVsdCBmb3IgbWF4KCkgd2l0aCBtdWx0aXBsZSBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKTtcbmI9MT09PWU/U2suYWJzdHIuaXRlcihhWzBdKTpTay5hYnN0ci5pdGVyKG5ldyBTay5idWlsdGluLnR1cGxlKGEpKTtpZighU2suYnVpbHRpbi5jaGVja05vbmUoZCkmJiFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2xldCBnO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLnRwJGl0ZXJuZXh0KCEwKSxhPT57Zz1hO2lmKHZvaWQgMCE9PWcpcmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpP1NrLm1pc2NldmFsLml0ZXJGb3IoYixhPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsZyxcIkd0XCIpJiYoZz1hKX0pOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtnXSksYT0+U2subWlzY2V2YWwuaXRlckZvcihiLGI9PlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFxuW2JdKSxjPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcIkd0XCIpJiYoZz1iLGE9Yyl9KSkpfSwoKT0+e2lmKHZvaWQgMD09PWcpe2lmKG51bGw9PT1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJtaW4oKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2VcIik7Zz1ofXJldHVybiBnfSl9O1NrLmJ1aWx0aW4ubWluLmNvX2Zhc3RjYWxsPVNrLmJ1aWx0aW4ubWF4LmNvX2Zhc3RjYWxsPTE7U2suYnVpbHRpbi5hbnk9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxmdW5jdGlvbihhKXtpZihTay5taXNjZXZhbC5pc1RydWUoYSkpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhTay5idWlsdGluLmJvb2wudHJ1ZSQpfSksYT0+YXx8U2suYnVpbHRpbi5ib29sLmZhbHNlJCl9O1NrLmJ1aWx0aW4uYWxsPWZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksXG5mdW5jdGlvbihhKXtpZighU2subWlzY2V2YWwuaXNUcnVlKGEpKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoU2suYnVpbHRpbi5ib29sLmZhbHNlJCl9KSxhPT5hfHxTay5idWlsdGluLmJvb2wudHJ1ZSQpfTtTay5idWlsdGluLnN1bT1mdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihkLGE9PntpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5pbnRfKWc9Zy5uYiRhZGQoYSk7ZWxzZXtpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGc9Zy5uYiRmbG9hdCgpLm5iJGFkZChhKSxuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJmbG9hdFwiKTtnPVNrLmFic3RyLm51bWJlckJpbk9wKGcsYSxcIkFkZFwiKTtyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKFwic2xvd1wiKX19KX1mdW5jdGlvbiBlKCl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoZCxhPT57aWYoYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uZmxvYXRffHxcbmEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmludF8pZz1nLm5iJGFkZChhKTtlbHNlIHJldHVybiBnPVNrLmFic3RyLm51bWJlckJpbk9wKGcsYSxcIkFkZFwiKSxuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJzbG93XCIpfSl9ZnVuY3Rpb24gaCgpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKGQsYT0+e2c9U2suYWJzdHIubnVtYmVyQmluT3AoZyxhLFwiQWRkXCIpfSl9Y29uc3QgZD1Tay5hYnN0ci5pdGVyKGEpO2lmKHZvaWQgMD09PWMpdmFyIGc9bmV3IFNrLmJ1aWx0aW4uaW50XygwKTtlbHNle2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3VtKCkgY2FuJ3Qgc3VtIHN0cmluZ3MgW3VzZSAnJy5qb2luKHNlcSkgaW5zdGVhZF1cIik7Zz1jfWE9dm9pZCAwPT09Y3x8Yy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50Xz9iKCk6Yy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uZmxvYXRfP1wiZmxvYXRcIjpcInNsb3dcIjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxcbmE9PlwiZmxvYXRcIj09PWE/ZSgpOmEsYT0+e2lmKFwic2xvd1wiPT09YSlyZXR1cm4gaCgpfSwoKT0+Zyl9O1NrLmJ1aWx0aW4uemlwPWZ1bmN0aW9uKCl7dmFyIGEsYztpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChbXSk7dmFyIGY9W107Zm9yKGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWlmKFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhcmd1bWVudHNbY10pKWYucHVzaChTay5hYnN0ci5pdGVyKGFyZ3VtZW50c1tjXSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXJndW1lbnQgXCIrYytcIiBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uXCIpO3ZhciBsPVtdO2ZvcihhPSExOyFhOyl7dmFyIGg9W107Zm9yKGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXt2YXIgZD1mW2NdLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwPT09ZCl7YT0hMDticmVha31oLnB1c2goZCl9YXx8bC5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKGgpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChsKX07XG5Tay5idWlsdGluLmFicz1mdW5jdGlvbihhKXtpZihhLm5iJGFicylyZXR1cm4gYS5uYiRhYnMoKTt0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgYWJzKCk6ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fTtTay5idWlsdGluLmZhYnM9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYWJzKGEpfTtTay5idWlsdGluLm9yZD1mdW5jdGlvbihhKXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtpZigxIT09YS52Lmxlbmd0aCYmMSE9PWEuc3EkbGVuZ3RoKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib3JkKCkgZXhwZWN0ZWQgYSBjaGFyYWN0ZXIsIGJ1dCBzdHJpbmcgb2YgbGVuZ3RoIFwiK2Eudi5sZW5ndGgrXCIgZm91bmRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYS52LmNvZGVQb2ludEF0KDApKX1pZihTay5idWlsdGluLmNoZWNrQnl0ZXMoYSkpe2lmKDEhPT1hLnNxJGxlbmd0aCgpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9yZCgpIGV4cGVjdGVkIGEgY2hhcmFjdGVyLCBidXQgc3RyaW5nIG9mIGxlbmd0aCBcIitcbmEudi5sZW5ndGgrXCIgZm91bmRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYS52WzBdKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvcmQoKSBleHBlY3RlZCBhIHN0cmluZyBvZiBsZW5ndGggMSwgYnV0IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGZvdW5kXCIpO307U2suYnVpbHRpbi5jaHI9ZnVuY3Rpb24oYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTthPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMyl7aWYoMD5hfHwxMTE0MTEyPD1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjaHIoKSBhcmcgbm90IGluIHJhbmdlKDB4MTEwMDAwKVwiKTt9ZWxzZSBpZigwPmF8fDI1Njw9YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY2hyKCkgYXJnIG5vdCBpbiByYW5nZSgyNTYpXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU3RyaW5nLmZyb21Db2RlUG9pbnQoYSkpfTtcblNrLmJ1aWx0aW4udW5pY2hyPWZ1bmN0aW9uKGEpe2lmKCFTay5idWlsdGluLmNoZWNrSW50KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcIik7YT1Tay5idWlsdGluLmFzbnVtJChhKTt0cnl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTdHJpbmcuZnJvbUNvZGVQb2ludChhKSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihlLm1lc3NhZ2UpO3Rocm93IGU7fX07U2suYnVpbHRpbi5pbnQyc3RyXz1mdW5jdGlvbihhLGMsZil7bGV0IGI7YS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8KGE9YS5uYiRpbmRleCgpKTtiPWEudjtsZXQgZT1iLnRvU3RyaW5nKGMpO2U9YS5uYiRpc25lZ2F0aXZlKCk/XCItXCIrZitlLnNsaWNlKDEpOmYrZTsyIT09YyYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMyYmXG4oYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nfHxKU0JJLl9faXNCaWdJbnQoYikpJiYoZSs9XCJMXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZSl9O1NrLmJ1aWx0aW4uaGV4PWZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImhleCgpIGFyZ3VtZW50IGNhbid0IGJlIGNvbnZlcnRlZCB0byBoZXhcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50MnN0cl8oYSwxNixcIjB4XCIpfTtTay5idWlsdGluLm9jdD1mdW5jdGlvbihhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvY3QoKSBhcmd1bWVudCBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaGV4XCIpO3JldHVybiBTay5fX2Z1dHVyZV9fLm9jdGFsX251bWJlcl9saXRlcmFsP1NrLmJ1aWx0aW4uaW50MnN0cl8oYSw4LFwiMG9cIik6U2suYnVpbHRpbi5pbnQyc3RyXyhhLDgsXCIwXCIpfTtTay5idWlsdGluLmJpbj1cbmZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGNhbid0IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4XCIpO3JldHVybiBTay5idWlsdGluLmludDJzdHJfKGEsMixcIjBiXCIpfTtTay5idWlsdGluLmRpcj1mdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKXJldHVybiBhPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kZGlyKSxTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYSxbXSksYT0+U2suYnVpbHRpbi5zb3J0ZWQoYSkpO3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJza3VscHQgZG9lcyBub3QgeWV0IHN1cHBvcnQgZGlyIHdpdGggbm8gYXJnc1wiKTt9O1NrLmJ1aWx0aW4ucmVwcj1mdW5jdGlvbihhKXtyZXR1cm4gYS4kcigpfTtTay5idWlsdGluLmFzY2lpPVxuZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEuJHIoKSxhPT57bGV0IGIsYztmb3IoYz0wO2M8YS52Lmxlbmd0aDtjKyspaWYoMTI3PD1hLnYuY2hhckNvZGVBdChjKSl7Yj1hLnYuc3Vic3RyKDAsYyk7YnJlYWt9aWYoIWIpcmV0dXJuIGE7Zm9yKDtjPGEudi5sZW5ndGg7YysrKXt2YXIgZT1hLnYuY2hhckF0KGMpLGQ9YS52LmNoYXJDb2RlQXQoYyk7MTI3PGQmJjI1NT49ZD8oZT1kLnRvU3RyaW5nKDE2KSwyPmUubGVuZ3RoJiYoZT1cIjBcIitlKSxiKz1cIlxcXFx4XCIrZSk6MTI3PGQmJjU1Mjk2PmR8fDU3MzQ0PD1kP2IrPVwiXFxcXHVcIisoXCIwMDBcIitkLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOjU1Mjk2PD1kPyhlPWEudi5jb2RlUG9pbnRBdChjKSxjKyssZT1lLnRvU3RyaW5nKDE2KSxkPVwiMDAwMDAwMFwiK2UudG9TdHJpbmcoMTYpLGI9NDxlLmxlbmd0aD9iKyhcIlxcXFxVXCIrZC5zbGljZSgtOCkpOmIrKFwiXFxcXHVcIitkLnNsaWNlKC00KSkpOmIrPWV9cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0pfTtcblNrLmJ1aWx0aW4ub3Blbj1mdW5jdGlvbihhLGMsZil7dm9pZCAwPT09YyYmKGM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiclwiKSk7aWYoL1xcKy8udGVzdChjLnYpKXRocm93XCJ0b2RvOyBoYXZlbid0IGltcGxlbWVudGVkIHJlYWQvd3JpdGUgbW9kZVwiO2lmKChcIndcIj09PWMudnx8XCJ3YlwiPT09Yy52fHxcImFcIj09PWMudnx8XCJhYlwiPT09Yy52KSYmIVNrLm5vbnJlYWRvcGVuKXRocm93XCJ0b2RvOyBoYXZlbid0IGltcGxlbWVudGVkIG5vbi1yZWFkIG9wZW5zXCI7cmV0dXJuIG5ldyBTay5idWlsdGluLmZpbGUoYSxjLGYpfTtTay5idWlsdGluLmlzaW5zdGFuY2U9ZnVuY3Rpb24oYSxjKXtpZighKFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhjKXx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzaW5zdGFuY2UoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3MsIHR5cGUsIG9yIHR1cGxlIG9mIGNsYXNzZXMgYW5kIHR5cGVzXCIpO3ZhciBiPWEub2IkdHlwZTtcbmlmKGI9PT1jKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7aWYoIShjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpe2lmKGIuJGlzU3ViVHlwZShjKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO2E9YS50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRjbGFzcyk7cmV0dXJuIGEhPWImJlNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSYmYS4kaXNTdWJUeXBlKGMpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfWZvcihiPTA7YjxjLnYubGVuZ3RoOysrYilpZihTay5taXNjZXZhbC5pc1RydWUoU2suYnVpbHRpbi5pc2luc3RhbmNlKGEsYy52W2JdKSkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJH07U2suYnVpbHRpbi5oYXNoPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmFic3RyLm9iamVjdEhhc2goYSkpfTtTay5idWlsdGluLmdldGF0dHI9ZnVuY3Rpb24oYSxcbmMsZil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmdcIik7Y29uc3QgYj1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+YS50cCRnZXRhdHRyKGMsITApLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKSl0aHJvdyBhO30pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGI9PntpZih2b2lkIDA9PT1iKXtpZih2b2lkIDAhPT1mKXJldHVybiBmO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEuc2skYXR0ckVycm9yKCkrXCIgaGFzIG5vIGF0dHJpYnV0ZSBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGMpKTt9cmV0dXJuIGJ9KX07U2suYnVpbHRpbi5zZXRhdHRyPWZ1bmN0aW9uKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZ1wiKTtcbnJldHVybiBTay5taXNjZXZhbC5jaGFpbihhLnRwJHNldGF0dHIoYyxmLCEwKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX07U2suYnVpbHRpbi5yYXdfaW5wdXQ9ZnVuY3Rpb24oYSl7dmFyIGI9YT9hOlwiXCI7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcInN5c1wiLCExLCEwKSxmdW5jdGlvbihhKXtyZXR1cm4gU2suaW5wdXRmdW5UYWtlc1Byb21wdD9Tay5idWlsdGluLmZpbGUuJHJlYWRsaW5lKGEuJGQuc3RkaW4sbnVsbCxiKTpTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEuJGQuc3Rkb3V0LndyaXRlLFthLiRkLnN0ZG91dCxuZXcgU2suYnVpbHRpbi5zdHIoYildKX0sZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEuJGQuc3RkaW4ucmVhZGxpbmUsW2EuJGQuc3RkaW5dKX0pfSl9O1NrLmJ1aWx0aW4uaW5wdXQ9XG5Tay5idWlsdGluLnJhd19pbnB1dDtTay5idWlsdGluLmpzZXZhbD1mdW5jdGlvbihhKXthPVNrLmdsb2JhbC5ldmFsKFNrLmZmaS5yZW1hcFRvSnMoYSkpO3JldHVybiBTay5mZmkucmVtYXBUb1B5KGEpfTtTay5idWlsdGluLmpzbWlsbGlzPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKFwianNtaWxsaXMgaXMgZGVwcmVjYXRlZFwiKTtyZXR1cm4obmV3IERhdGUpLnZhbHVlT2YoKX07U2suYnVpbHRpbi5ldmFsXz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJldmFsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLm1hcD1mdW5jdGlvbihhLGMpe3ZhciBiPVtdLGUsaDtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFwibWFwXCIsYXJndW1lbnRzLmxlbmd0aCwyKTtpZigyPGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBkPVtdO3ZhciBnPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpLnNsaWNlKDEpO2ZvcihoPVxuMDtoPGcubGVuZ3RoO2grKyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShnW2hdKSl7dmFyIG49cGFyc2VJbnQoaCwxMCkrMjt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhcmd1bWVudCBcIituK1wiIHRvIG1hcCgpIG11c3Qgc3VwcG9ydCBpdGVyYXRpb25cIik7fWdbaF09U2suYWJzdHIuaXRlcihnW2hdKX1mb3IoOzspe3ZhciBrPVtdO2ZvcihoPWU9MDtoPGcubGVuZ3RoO2grKyluPWdbaF0udHAkaXRlcm5leHQoKSx2b2lkIDA9PT1uPyhrLnB1c2goU2suYnVpbHRpbi5ub25lLm5vbmUkKSxlKyspOmsucHVzaChuKTtpZihlIT09Zy5sZW5ndGgpZC5wdXNoKGspO2Vsc2UgYnJlYWt9Yz1uZXcgU2suYnVpbHRpbi5saXN0KGQpfWlmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYyksXG5mdW5jdGlvbihjKXtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKWMgaW5zdGFuY2VvZiBBcnJheSYmKGM9bmV3IFNrLmJ1aWx0aW4udHVwbGUoYykpLGIucHVzaChjKTtlbHNlIHJldHVybiBjIGluc3RhbmNlb2YgQXJyYXl8fChjPVtjXSksU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsYyksZnVuY3Rpb24oYSl7Yi5wdXNoKGEpfSl9KSxmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSl9O1NrLmJ1aWx0aW4ucmVkdWNlPWZ1bmN0aW9uKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShjKStcIicgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZVwiKTtjPVNrLmFic3RyLml0ZXIoYyk7aWYodm9pZCAwPT09ZiYmKGY9Yy50cCRpdGVybmV4dCgpLHZvaWQgMD09PWYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInJlZHVjZSgpIG9mIGVtcHR5IHNlcXVlbmNlIHdpdGggbm8gaW5pdGlhbCB2YWx1ZVwiKTtcbnZhciBiPWY7Zm9yKGY9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWY7Zj1jLnRwJGl0ZXJuZXh0KCkpYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYixmXSk7cmV0dXJuIGJ9O1NrLmJ1aWx0aW4uc29ydGVkPWZ1bmN0aW9uKGEsYyxmLGwpe2E9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSwhMCk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsYT0+e2E9bmV3IFNrLmJ1aWx0aW4ubGlzdChhKTthLmxpc3Qkc29ydChjLGYsbCk7cmV0dXJuIGF9KX07U2suYnVpbHRpbi5maWx0ZXI9ZnVuY3Rpb24oYSxjKXt2YXIgYjtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFwiZmlsdGVyXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpO2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO3ZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuW119O1xudmFyIGg9ZnVuY3Rpb24oYSxiKXthLnB1c2goYik7cmV0dXJuIGF9O3ZhciBkPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEpfTtjLm9iJHR5cGU9PT1Tay5idWlsdGluLnN0cj8oZT1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJcIil9LGg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zcSRjb25jYXQoYil9LGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9KTpjLm9iJHR5cGU9PT1Tay5idWlsdGluLnR1cGxlJiYoZD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9KTt2YXIgZz1lKCk7dmFyIG49U2suYWJzdHIuaXRlcihjKTtmb3IoYj1uLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPW4udHAkaXRlcm5leHQoKSllPWE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bmV3IFNrLmJ1aWx0aW4uYm9vbChiKTpTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYl0pLFNrLm1pc2NldmFsLmlzVHJ1ZShlKSYmKGc9aChnLGIpKTtcbnJldHVybiBkKGcpfTtTay5idWlsdGluLmhhc2F0dHI9ZnVuY3Rpb24oYSxjKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJoYXNhdHRyKCk6IGF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nXCIpO2NvbnN0IGI9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PmEudHAkZ2V0YXR0cihjLCEwKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYixhPT52b2lkIDA9PT1hP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6U2suYnVpbHRpbi5ib29sLnRydWUkKX07U2suYnVpbHRpbi5wb3c9ZnVuY3Rpb24oYSxjLGYpe2lmKHZvaWQgMD09PWZ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpKXJldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLGMsXCJQb3dcIik7aWYoIShTay5idWlsdGluLmNoZWNrSW50KGEpJiZTay5idWlsdGluLmNoZWNrSW50KGMpJiZcblNrLmJ1aWx0aW4uY2hlY2tJbnQoZikpKXtpZihTay5idWlsdGluLmNoZWNrRmxvYXQoYSl8fFNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4KGEpKXJldHVybiBhLm5iJHBvd2VyKGMsZik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAqKiBvciBwb3coKTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJywgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJywgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiJ1wiKTt9cmV0dXJuIGEubmIkcG93ZXIoYyxmKX07U2suYnVpbHRpbi5xdWl0PWZ1bmN0aW9uKGEpe2E9KG5ldyBTay5idWlsdGluLnN0cihhKSkudjt0aHJvdyBuZXcgU2suYnVpbHRpbi5TeXN0ZW1FeGl0KGEpO307U2suYnVpbHRpbi5pc3N1YmNsYXNzPWZ1bmN0aW9uKGEsYyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpc3N1YmNsYXNzKCkgYXJnIDEgbXVzdCBiZSBhIGNsYXNzXCIpO1xudmFyIGI9U2suYnVpbHRpbi5jaGVja0NsYXNzKGMpO2lmKCEoYnx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzc3ViY2xhc3MoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3Mgb3IgdHVwbGUgb2YgY2xhc3Nlc1wiKTtpZihiKXJldHVybiBhLiRpc1N1YlR5cGUoYyk/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Zm9yKGI9MDtiPGMudi5sZW5ndGg7KytiKWlmKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzc3ViY2xhc3MoYSxjLnZbYl0pKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO3JldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkfTtTay5idWlsdGluLmdsb2JhbHM9ZnVuY3Rpb24oKXt2YXIgYSxjPW5ldyBTay5idWlsdGluLmRpY3QoW10pO2ZvcihhIGluIFNrLmdsb2JhbHMpe3ZhciBmPVNrLnVuZml4UmVzZXJ2ZWQoYSk7Yy5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihmKSxcblNrLmdsb2JhbHNbYV0pfXJldHVybiBjfTtTay5idWlsdGluLmRpdm1vZD1mdW5jdGlvbihhLGMpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLGMsXCJEaXZNb2RcIil9O1NrLmJ1aWx0aW4uZm9ybWF0PWZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5zdHIuJGVtcHR5c3RyKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0Rm9ybWF0KGEsYyl9O2NvbnN0IGE9bmV3IE1hcDtsZXQgYz0wO1NrLmJ1aWx0aW4uaWQ9ZnVuY3Rpb24oYil7Y29uc3QgZT1hLmdldChiKTtpZih2b2lkIDAhPT1lKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGUpO2Euc2V0KGIsYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYysrKX07U2suYnVpbHRpbi5ieXRlYXJyYXk9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiYnl0ZWFycmF5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmNhbGxhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYSk/XG5Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH07U2suYnVpbHRpbi5kZWxhdHRyPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIFNrLmJ1aWx0aW4uc2V0YXR0cihhLGMsdm9pZCAwKX07U2suYnVpbHRpbi5leGVjZmlsZT1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJleGVjZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5oZWxwPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImhlbHAgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uaXRlcj1mdW5jdGlvbihhLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Tay5hYnN0ci5pdGVyKGEpOlNrLmFic3RyLml0ZXIobmV3IFNrLmJ1aWx0aW4uY2FsbGFibGVfaXRlcl8oYSxjKSl9O1NrLmJ1aWx0aW4ubG9jYWxzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImxvY2FscyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtTay5idWlsdGluLm1lbW9yeXZpZXc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwibWVtb3J5dmlldyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5uZXh0Xz1mdW5jdGlvbihhLGMpe2lmKCFhLnRwJGl0ZXJuZXh0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGlzIG5vdCBhbiBpdGVyYXRvclwiKTthPWEudHAkaXRlcm5leHQoKTtpZih2b2lkIDA9PT1hKXtpZihjKXJldHVybiBjO3Rocm93IG5ldyBTay5idWlsdGluLlN0b3BJdGVyYXRpb247fXJldHVybiBhfTtTay5idWlsdGluLnJlbG9hZD1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJyZWxvYWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4udmFycz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJ2YXJzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1NrLmJ1aWx0aW4uYXBwbHlfPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImFwcGx5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmJ1ZmZlcj1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJidWZmZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uY29lcmNlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImNvZXJjZSBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5pbnRlcm49ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiaW50ZXJuIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkJhc2VFeGNlcHRpb25cIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uLFwiYmFkIGNhbGwgdG8gZXhjZXB0aW9uIGNvbnN0cnVjdG9yLCB1c2UgJ25ldydcIik7bGV0IGM9YVswXTtcInN0cmluZ1wiPT09dHlwZW9mIGMmJihjPW5ldyBTay5idWlsdGluLnN0cihjKSk7dGhpcy5hcmdzPW5ldyBTay5idWlsdGluLnR1cGxlKGM/W2NdOltdKTt0aGlzLnRyYWNlYmFjaz1bXTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3Q7Mzw9YS5sZW5ndGgmJnRoaXMudHJhY2ViYWNrLnB1c2goe2xpbmVubzphWzJdLGZpbGVuYW1lOmFbMV18fFwiPHVua25vd24+XCJ9KX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRvYzpcIkNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9uc1wiLHRwJG5ldyhhLGMpe3RoaXMuaHAkdHlwZT8oYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcixTay5idWlsdGluLkJhc2VFeGNlcHRpb24uY2FsbChjKSk6XG5jPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2MuYXJncz1uZXcgU2suYnVpbHRpbi50dXBsZShhLnNsaWNlKCkpO3JldHVybiBjfSx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhTay5hYnN0ci50eXBlTmFtZSh0aGlzKSxjKX0sJHIoKXtsZXQgYT10aGlzLnRwJG5hbWU7YSs9XCIoXCIrdGhpcy5hcmdzLnYubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpLmpvaW4oXCIsIFwiKStcIilcIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSx0cCRzdHIoKXtyZXR1cm4gMT49dGhpcy5hcmdzLnYubGVuZ3RoP25ldyBTay5idWlsdGluLnN0cih0aGlzLmFyZ3MudlswXSk6dGhpcy5hcmdzLiRyKCl9fSxnZXRzZXRzOnthcmdzOnskZ2V0KCl7cmV0dXJuIHRoaXMuYXJnc319LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH0scHJvdG86e3RvU3RyaW5nKCl7bGV0IGE9dGhpcy50cCRuYW1lO2ErPVwiOiBcIit0aGlzLnRwJHN0cigpLnY7cmV0dXJuIGE9MCE9PXRoaXMudHJhY2ViYWNrLmxlbmd0aD9cbmErKFwiIG9uIGxpbmUgXCIrdGhpcy50cmFjZWJhY2tbMF0ubGluZW5vKTphK1wiIGF0IDx1bmtub3duPlwifX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkJhc2VFeGNlcHRpb25cIixTay5idWlsdGluLkJhc2VFeGNlcHRpb24pO1NrLmJ1aWx0aW4uRXhjZXB0aW9uPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJFeGNlcHRpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5CYXNlRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5FeGNlcHRpb25cIixTay5idWlsdGluLkV4Y2VwdGlvbik7U2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiQXNzZXJ0aW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvclwiLFNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3IpO1NrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkF0dHJpYnV0ZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLkltcG9ydEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJbXBvcnRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5JbmRlbnRhdGlvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJbmRlbnRhdGlvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsXG5hKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uSW5kZXhFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiSW5kZXhFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5Mb29rdXBFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTG9va3VwRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uS2V5RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIktleUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uTG9va3VwRXJyb3IuYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkxvb2t1cEVycm9yfSk7U2suYnVpbHRpbi5OYW1lRXJyb3I9XG5Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTmFtZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlVuYm91bmRMb2NhbEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJVbmJvdW5kTG9jYWxFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJPdmVyZmxvd0Vycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlN5bnRheEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJTeW50YXhFcnJvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlJ1bnRpbWVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiUnVudGltZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlJ1bnRpbWVFcnJvclwiLFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKTtTay5idWlsdGluLlN1c3BlbnNpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3VzcGVuc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN1c3BlbnNpb25FcnJvclwiLFxuU2suYnVpbHRpbi5TdXNwZW5zaW9uRXJyb3IpO1NrLmJ1aWx0aW4uU3lzdGVtRXhpdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3lzdGVtRXhpdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkJhc2VFeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN5c3RlbUV4aXRcIixTay5idWlsdGluLlN5c3RlbUV4aXQpO1NrLmJ1aWx0aW4uVHlwZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJUeXBlRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uVHlwZUVycm9yXCIsU2suYnVpbHRpbi5UeXBlRXJyb3IpO1NrLmJ1aWx0aW4uVmFsdWVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVmFsdWVFcnJvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlZhbHVlRXJyb3JcIixTay5idWlsdGluLlZhbHVlRXJyb3IpO1NrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlplcm9EaXZpc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlRpbWVMaW1pdEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJUaW1lTGltaXRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5UaW1lTGltaXRFcnJvclwiLFxuU2suYnVpbHRpbi5UaW1lTGltaXRFcnJvcik7U2suYnVpbHRpbi5JT0Vycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJT0Vycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLklPRXJyb3JcIixTay5idWlsdGluLklPRXJyb3IpO1NrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm90SW1wbGVtZW50ZWRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yXCIsU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKTtTay5idWlsdGluLk5lZ2F0aXZlUG93ZXJFcnJvcj1cblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOZWdhdGl2ZVBvd2VyRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uTmVnYXRpdmVQb3dlckVycm9yXCIsU2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3IpO1NrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiRXh0ZXJuYWxFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXt0aGlzLm5hdGl2ZUVycm9yPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcodGhpcy5uYXRpdmVFcnJvcikmJihhWzBdPXRoaXMubmF0aXZlRXJyb3IudG9TdHJpbmcoKSxhWzBdLnN0YXJ0c1dpdGgoXCJSYW5nZUVycm9yOiBNYXhpbXVtIGNhbGxcIikpKXJldHVybiBhWzBdPVwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIixcbm5ldyBTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yKC4uLmEpO1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkV4dGVybmFsRXJyb3JcIixTay5idWlsdGluLkV4dGVybmFsRXJyb3IpO1NrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlJlY3Vyc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uUnVudGltZUVycm9yLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yXCIsU2suYnVpbHRpbi5SZWN1cnNpb25FcnJvcik7U2suYnVpbHRpbi5PcGVyYXRpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiT3BlcmF0aW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxcbmEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5PcGVyYXRpb25FcnJvclwiLFNrLmJ1aWx0aW4uT3BlcmF0aW9uRXJyb3IpO1NrLmJ1aWx0aW4uU3lzdGVtRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN5c3RlbUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN5c3RlbUVycm9yXCIsU2suYnVpbHRpbi5TeXN0ZW1FcnJvcik7U2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlVuaWNvZGVEZWNvZGVFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3JcIixcblNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKTtTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVW5pY29kZUVuY29kZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvclwiLFNrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yKTtTay5idWlsdGluLlN0b3BJdGVyYXRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN0b3BJdGVyYXRpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvblwiLFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbik7XG5Tay5idWlsdGluLmdldEV4Y0luZm89ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFthLm9iJHR5cGV8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxhLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pfX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLm1ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwibWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kLFwiYmFkIGNhbGwgdG8gbWV0aG9kIGNvbnN0cnVjdG9yLCB1c2UgJ25ldydcIik7dGhpcy5pbV9mdW5jPWE7dGhpcy5pbV9zZWxmPWM7dGhpcy5pbV9jYWxsPWEudHAkY2FsbH0sc2xvdHM6eyRyKCl7bGV0IGE9dGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJHF1YWxuYW1lKXx8dGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJG5hbWUpO2E9YSYmYS52fHxcIj9cIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGJvdW5kIG1ldGhvZCBcIitcbmErXCIgb2YgXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLmltX3NlbGYpK1wiPlwiKX0sdHAkaGFzaCgpe2NvbnN0IGE9U2suYWJzdHIub2JqZWN0SGFzaCh0aGlzLmltX3NlbGYpLGM9U2suYWJzdHIub2JqZWN0SGFzaCh0aGlzLmltX2Z1bmMpO3JldHVybiBhK2N9LHRwJGNhbGwoYSxjKXt2YXIgYj10aGlzLmltX2NhbGw7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy5pbV9mdW5jKStcIicgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZVwiKTthPVt0aGlzLmltX3NlbGYsLi4uYV07cmV0dXJuIGIuY2FsbCh0aGlzLmltX2Z1bmMsYSxjKX0sdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcIm1ldGhvZFwiLGEsMiwyKTtjPWFbMF07YT1hWzFdO2lmKCFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZVwiKTtcbmlmKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlbGYgbXVzdCBub3QgYmUgTm9uZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubWV0aG9kKGMsYSl9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoXCJFcVwiIT1jJiZcIk5vdEVxXCIhPWN8fCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7bGV0IGI7dHJ5e2I9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuaW1fc2VsZixhLmltX3NlbGYsXCJFcVwiLCExKSYmdGhpcy5pbV9mdW5jPT1hLmltX2Z1bmN9Y2F0Y2goZSl7Yj0hMX1yZXR1cm5cIkVxXCI9PWM/YjohYn0sdHAkZGVzY3JfZ2V0KGEsYyl7cmV0dXJuIHRoaXN9LHRwJGdldGF0dHIoYSxjKXtjb25zdCBiPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwodGhpcyxhKTtyZXR1cm4gdm9pZCAwIT09Yj9iOnRoaXMuaW1fZnVuYy50cCRnZXRhdHRyKGEsXG5jKX19LGdldHNldHM6e19fZnVuY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuaW1fZnVuY319LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuaW1fc2VsZn19LF9fZG9jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGRvYyl9fX0sZmxhZ3M6e3NrJHN1aXRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhKXtpZihudWxsIT09YSYmdm9pZCAwIT09YSl7aWYoYS5uYiRpbmRleClyZXR1cm4gYS5uYiRpbmRleCgpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSYmTnVtYmVyLmlzSW50ZWdlcihhKSlyZXR1cm4gYX19ZnVuY3Rpb24gYyhiLGMpe2NvbnN0IGU9YShiKTtpZih2b2lkIDAhPT1lKXJldHVybiBlO2M9KGN8fFwiJ3t0cCRuYW1lfScgb2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyXCIpLnJlcGxhY2UoXCJ7dHAkbmFtZX1cIixTay5hYnN0ci50eXBlTmFtZShiKSk7XG50aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYyk7fVNrLm1pc2NldmFsPXt9O1NrLm1pc2NldmFsLlN1c3BlbnNpb249ZnVuY3Rpb24oYSxjLGYpe3RoaXMuJGlzU3VzcGVuc2lvbj0hMDt2b2lkIDAhPT1hJiZ2b2lkIDAhPT1jJiYodGhpcy5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYShjLnJlc3VtZSgpKX0pO3RoaXMuY2hpbGQ9Yzt0aGlzLm9wdGlvbmFsPXZvaWQgMCE9PWMmJmMub3B0aW9uYWw7dGhpcy5kYXRhPXZvaWQgMD09PWYmJnZvaWQgMCE9PWM/Yy5kYXRhOmZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLlN1c3BlbnNpb25cIixTay5taXNjZXZhbC5TdXNwZW5zaW9uKTtTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3c9ZnVuY3Rpb24oYSxjKXtmb3IoO2EgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uOyl7aWYoIWEub3B0aW9uYWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yKGN8fFwiQ2Fubm90IGNhbGwgYSBmdW5jdGlvbiB0aGF0IGJsb2NrcyBvciBzdXNwZW5kcyBoZXJlXCIpO1xuYT1hLnJlc3VtZSgpfXJldHVybiBhfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3dcIixTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3cpO1NrLm1pc2NldmFsLmlzSW5kZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hJiYodm9pZCAwIT09YS5uYiRpbmRleHx8XCJudW1iZXJcIj09PXR5cGVvZiBhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuaXNJbmRleFwiLFNrLm1pc2NldmFsLmlzSW5kZXgpO1NrLm1pc2NldmFsLmFzSW5kZXg9YTtTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQ9ZnVuY3Rpb24oYSxlLGYpe2Y9YyhhLGYpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZilyZXR1cm4gZjtpZihudWxsPT1lKXJldHVybiBKU0JJLmxlc3NUaGFuKGYsSlNCSS5fX1pFUk8pPy1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUjpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbnRocm93IG5ldyBlKFwiY2Fubm90IGZpdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIGludG8gYW4gaW5kZXgtc2l6ZWQgaW50ZWdlclwiKTt9O1NrLm1pc2NldmFsLmFzSW5kZXhPclRocm93PWM7U2subWlzY2V2YWwuYXBwbHlTbGljZT1mdW5jdGlvbihhLGMsZixsKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGMsZixudWxsKSxsKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlTbGljZVwiLFNrLm1pc2NldmFsLmFwcGx5U2xpY2UpO1NrLm1pc2NldmFsLmFzc2lnblNsaWNlPWZ1bmN0aW9uKGEsYyxmLGwsaCl7Yz1uZXcgU2suYnVpbHRpbi5zbGljZShjLGYpO3JldHVybiBudWxsPT09bD9Tay5hYnN0ci5vYmplY3REZWxJdGVtKGEsYyk6U2suYWJzdHIub2JqZWN0U2V0SXRlbShhLGMsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXNzaWduU2xpY2VcIixTay5taXNjZXZhbC5hc3NpZ25TbGljZSk7XG5Tay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHM9ZnVuY3Rpb24oYSl7dmFyIGI7aWYoMSE9YS5sZW5ndGgpcmV0dXJuIGE7dmFyIGM9YVswXTtjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zZXQ/Yz1jLnRwJGl0ZXIoKS4kb2JqOmMgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QmJihjPVNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUua2V5cy5mdW5jX2NvZGUoYykpO2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3R8fGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKXJldHVybiBjLnY7aWYoU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXthPVtdO2M9U2suYWJzdHIuaXRlcihjKTtmb3IoYj1jLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWMudHAkaXRlcm5leHQoKSlhLnB1c2goYik7cmV0dXJuIGF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXJyYXlGcm9tQXJndW1lbnRzXCIsXG5Tay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHMpO1NrLm1pc2NldmFsLml0ZXJhdG9yPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIml0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy50cCRpdGVybmV4dD1jP2E6ZnVuY3Rpb24oYil7bGV0IGM9YSgpO3JldHVybiBifHwhYy4kaXNTdXNwZW5zaW9uP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfX0saXRlcm5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoYSl9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2subWlzY2V2YWwuc3dhcHBlZE9wXz17RXE6XCJFcVwiLE5vdEVxOlwiTm90RXFcIixMdDpcIkd0XCIsTHRFOlwiR3RFXCIsR3Q6XCJMdFwiLEd0RTpcIkx0RVwifTtTay5taXNjZXZhbC5vcFN5bWJvbHM9e0VxOlwiPT1cIixOb3RFcTpcIiE9XCIsTHQ6XCI8XCIsTHRFOlwiPD1cIixHdDpcIj5cIixHdEU6XCI+PVwiLElzOlwiaXNcIixJc05vdDpcImlzIG5vdFwiLFxuSW5fOlwiaW5cIixOb3RJbjpcIm5vdCBpblwifTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2w9ZnVuY3Rpb24oYSxjLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQoYS5zayRvYmplY3QmJmMuc2skb2JqZWN0LFwiSlMgb2JqZWN0IHBhc3NlZCB0byByaWNoQ29tcGFyZUJvb2xcIik7dmFyIGI7dmFyIGQ9YS5vYiR0eXBlO3ZhciBlPWMub2IkdHlwZSxuPWUhPT1kJiZ2b2lkIDA9PT1lLnNrJGJhc2VDbGFzcyYmZS4kaXNTdWJUeXBlKGQpO2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJmQhPT1lJiYoXCJHdEVcIj09PWZ8fFwiR3RcIj09PWZ8fFwiTHRFXCI9PT1mfHxcIkx0XCI9PT1mKSl7dmFyIGs9W1NrLmJ1aWx0aW4uZmxvYXRfLFNrLmJ1aWx0aW4uaW50XyxTay5idWlsdGluLmxuZyxTay5idWlsdGluLmJvb2xdLHA9W1NrLmJ1aWx0aW4uZGljdCxTay5idWlsdGluLmVudW1lcmF0ZSxTay5idWlsdGluLmZpbHRlcl8sU2suYnVpbHRpbi5saXN0LFNrLmJ1aWx0aW4ubWFwXyxTay5idWlsdGluLnN0cixTay5idWlsdGluLnR1cGxlLFxuU2suYnVpbHRpbi56aXBfXTtjb25zdCBiPWsuaW5kZXhPZihkKSxnPXAuaW5kZXhPZihkKTtrPWsuaW5kZXhPZihlKTtwPXAuaW5kZXhPZihlKTtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXN3aXRjaChmKXtjYXNlIFwiTHRcIjpyZXR1cm4hMDtjYXNlIFwiTHRFXCI6cmV0dXJuITA7Y2FzZSBcIkd0XCI6cmV0dXJuITE7Y2FzZSBcIkd0RVwiOnJldHVybiExfWlmKGM9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiExO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMTtjYXNlIFwiR3RcIjpyZXR1cm4hMDtjYXNlIFwiR3RFXCI6cmV0dXJuITB9aWYoLTEhPT1iJiYtMSE9PXApc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiEwO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMDtjYXNlIFwiR3RcIjpyZXR1cm4hMTtjYXNlIFwiR3RFXCI6cmV0dXJuITF9aWYoLTEhPT1nJiYtMSE9PWspc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiExO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMTtjYXNlIFwiR3RcIjpyZXR1cm4hMDtcbmNhc2UgXCJHdEVcIjpyZXR1cm4hMH1pZigtMSE9PWcmJi0xIT09cClzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuIGc8cDtjYXNlIFwiTHRFXCI6cmV0dXJuIGc8PXA7Y2FzZSBcIkd0XCI6cmV0dXJuIGc+cDtjYXNlIFwiR3RFXCI6cmV0dXJuIGc+PXB9fWlmKFwiSXNcIj09PWYpe2lmKGQ9PT1lKXtpZihhPT09YylyZXR1cm4hMDtpZihkPT09U2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGEudj09PWMudjtpZihkPT09U2suYnVpbHRpbi5pbnRfKXJldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYS52JiZcIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnY9PT1jLnY6SlNCSS5lcXVhbChKU0JJLkJpZ0ludChhLnYpLEpTQkkuQmlnSW50KGMudikpfXJldHVybiExfWlmKFwiSXNOb3RcIj09PWYpcmV0dXJuIGQhPT1lPyEwOmQ9PT1Tay5idWlsdGluLmZsb2F0Xz9hLnYhPT1jLnY6ZD09PVNrLmJ1aWx0aW4uaW50Xz9cIm51bWJlclwiPT09dHlwZW9mIGEudiYmXCJudW1iZXJcIj09PXR5cGVvZiBhLnY/YS52IT09Yy52OkpTQkkubm90RXF1YWwoSlNCSS5CaWdJbnQoYS52KSxcbkpTQkkuQmlnSW50KGMudikpOmEhPT1jO2lmKFwiSW5cIj09PWYpcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLnNlcXVlbmNlQ29udGFpbnMoYyxhLGwpLFNrLm1pc2NldmFsLmlzVHJ1ZSk7aWYoXCJOb3RJblwiPT09ZilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEsbCksZnVuY3Rpb24oYSl7cmV0dXJuIVNrLm1pc2NldmFsLmlzVHJ1ZShhKX0pO2U9e0VxOlwib2IkZXFcIixOb3RFcTpcIm9iJG5lXCIsR3Q6XCJvYiRndFwiLEd0RTpcIm9iJGdlXCIsTHQ6XCJvYiRsdFwiLEx0RTpcIm9iJGxlXCJ9O2Q9ZVtmXTtpZihuJiYobD1lW1NrLm1pc2NldmFsLnN3YXBwZWRPcF9bZl1dLGNbbF0hPT1hW2xdJiYoYj1jW2xdKGEpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXx8KGI9YVtkXShjKSkhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJHx8IW4mJihsPWVbU2subWlzY2V2YWwuc3dhcHBlZE9wX1tmXV0sXG4oYj1jW2xdKGEpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSlyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGIpO2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2lmKG49U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRjbXApKXRyeXtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShuLFtjXSk7aWYoU2suYnVpbHRpbi5jaGVja051bWJlcihiKSl7Yj1Tay5idWlsdGluLmFzbnVtJChiKTtpZihcIkVxXCI9PT1mKXJldHVybiAwPT09YjtpZihcIk5vdEVxXCI9PT1mKXJldHVybiAwIT09YjtpZihcIkx0XCI9PT1mKXJldHVybiAwPmI7aWYoXCJHdFwiPT09ZilyZXR1cm4gMDxiO2lmKFwiTHRFXCI9PT1mKXJldHVybiAwPj1iO2lmKFwiR3RFXCI9PT1mKXJldHVybiAwPD1ifWlmKGIhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTtcbn1jYXRjaCh1KXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTt9aWYobj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGMsU2suYnVpbHRpbi5zdHIuJGNtcCkpdHJ5e2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG4sW2FdKTtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO2lmKFwiRXFcIj09PWYpcmV0dXJuIDA9PT1iO2lmKFwiTm90RXFcIj09PWYpcmV0dXJuIDAhPT1iO2lmKFwiTHRcIj09PWYpcmV0dXJuIDA8YjtpZihcIkd0XCI9PT1mKXJldHVybiAwPmI7aWYoXCJMdEVcIj09PWYpcmV0dXJuIDA8PWI7aWYoXCJHdEVcIj09PWYpcmV0dXJuIDA+PWJ9aWYoYiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50XCIpO31jYXRjaCh1KXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTtcbn1pZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiZjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXtpZihcIkVxXCI9PT1mKXJldHVybiBhLnY9PT1jLnY7aWYoXCJOb3RFcVwiPT09ZilyZXR1cm4gYS52IT09Yy52O2lmKFwiR3RcIj09PWYpcmV0dXJuIGEudj5jLnY7aWYoXCJHdEVcIj09PWYpcmV0dXJuIGEudj49Yy52O2lmKFwiTHRcIj09PWYpcmV0dXJuIGEudjxjLnY7aWYoXCJMdEVcIj09PWYpcmV0dXJuIGEudjw9Yy52fX1pZihcIkVxXCI9PT1mKXJldHVybiBhPT09YztpZihcIk5vdEVxXCI9PT1mKXJldHVybiBhIT09YzthPVNrLmFic3RyLnR5cGVOYW1lKGEpO2M9U2suYWJzdHIudHlwZU5hbWUoYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLm1pc2NldmFsLm9wU3ltYm9sc1tmXStcIicgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnXCIrYStcIicgYW5kICdcIitjK1wiJ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbFwiLFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCk7XG5Tay5taXNjZXZhbC5vYmplY3RSZXByPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJ0cnlpbmcgdG8gcmVwciB1bmRlZmluZWRcIik7aWYobnVsbCE9PWEmJmEuJHIpcmV0dXJuIGEuJHIoKS52O3RyeXtyZXR1cm4obmV3IFNrLmJ1aWx0aW4uc3RyKGEpKS52fWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBTay5idWlsdGluLlR5cGVFcnJvcilyZXR1cm5cIjx1bmtub3duPlwiO3Rocm93IGU7fX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwub2JqZWN0UmVwclwiLFNrLm1pc2NldmFsLm9iamVjdFJlcHIpO1NrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHk9ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgXCJMdEVcIjpjYXNlIFwiRXFcIjpjYXNlIFwiR3RFXCI6cmV0dXJuITB9cmV0dXJuITF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHlcIixTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5KTtTay5taXNjZXZhbC5pc1RydWU9ZnVuY3Rpb24oYSl7cmV0dXJuITA9PT1cbmF8fGE9PT1Tay5idWlsdGluLmJvb2wudHJ1ZSQ/ITA6ITE9PT1hfHxhPT09U2suYnVpbHRpbi5ib29sLmZhbHNlJHx8bnVsbD09PWF8fHZvaWQgMD09PWE/ITE6YS5uYiRib29sP2EubmIkYm9vbCgpOmEuc3EkbGVuZ3RoPzAhPT1hLnNxJGxlbmd0aCgpOiEhYX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuaXNUcnVlXCIsU2subWlzY2V2YWwuaXNUcnVlKTtTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExO1NrLm1pc2NldmFsLnByaW50Xz1mdW5jdGlvbihhKXtTay5taXNjZXZhbC5zb2Z0c3BhY2VfJiYoXCJcXG5cIiE9PWEmJlNrLm91dHB1dChcIiBcIiksU2subWlzY2V2YWwuc29mdHNwYWNlXz0hMSk7dmFyIGI9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRNb2R1bGUoXCJzeXNcIiwhMSwhMCksZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5KGEuJGQuc3Rkb3V0LndyaXRlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLFthLiRkLnN0ZG91dCxcbmJdKX0sZnVuY3Rpb24oKXt2YXIgYTsoYT0wPT09Yi52Lmxlbmd0aCl8fChhPWIudltiLnYubGVuZ3RoLTFdLGE9IShcIlxcblwiPT09YXx8XCJcXHRcIj09PWF8fFwiXFxyXCI9PT1hKSk7aWYoYXx8XCIgXCI9PT1iLnZbYi52Lmxlbmd0aC0xXSlTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSEwfSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnByaW50X1wiLFNrLm1pc2NldmFsLnByaW50Xyk7U2subWlzY2V2YWwubG9hZG5hbWU9ZnVuY3Rpb24oYSxjKXtjPWNbYV07aWYodm9pZCAwIT09YylyZXR1cm4gYztjPVNrLmJ1aWx0aW5zW2FdO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTmFtZUVycm9yKFwibmFtZSAnXCIrU2sudW5maXhSZXNlcnZlZChhKStcIicgaXMgbm90IGRlZmluZWRcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5sb2FkbmFtZVwiLFNrLm1pc2NldmFsLmxvYWRuYW1lKTtTay5taXNjZXZhbC5jYWxsPWZ1bmN0aW9uKGEsYyxmLGwsaCl7aD1cbkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyw0KTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHkoYSxjLGYsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbFwiLFNrLm1pc2NldmFsLmNhbGwpO1NrLm1pc2NldmFsLmNhbGxBc3luYz1mdW5jdGlvbihhLGMsZixsLGgsZCl7ZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsNSk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5QXN5bmMoYSxjLGYsbCxoLGQpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsQXN5bmNcIixTay5taXNjZXZhbC5jYWxsQXN5bmMpO1NrLm1pc2NldmFsLmNhbGxPclN1c3BlbmQ9ZnVuY3Rpb24oYSxjLGYsbCxoKXtoPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyw0KTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYSxjLGYsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZFwiLFxuU2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZCk7U2subWlzY2V2YWwuY2FsbHNpbT1mdW5jdGlvbihhLGMpe2M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGMpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltXCIsU2subWlzY2V2YWwuY2FsbHNpbSk7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5PWZ1bmN0aW9uKGEsYyxmKXtjPWN8fFtdO3JldHVybiBTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsYyxmKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheVwiLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSk7U2subWlzY2V2YWwuY2FsbHNpbUFzeW5jPWZ1bmN0aW9uKGEsYyxmKXtmPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyxcbjIpO3JldHVybiBTay5taXNjZXZhbC5hcHBseUFzeW5jKGEsYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCxmKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbHNpbUFzeW5jXCIsU2subWlzY2V2YWwuY2FsbHNpbUFzeW5jKTtTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kPWZ1bmN0aW9uKGEsYyl7Yz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAsYyl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRcIixTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kKTtTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXk9ZnVuY3Rpb24oYSxjLGYpe2M9Y3x8W107cmV0dXJuIHZvaWQgMCE9PWEmJmEudHAkY2FsbD9hLnRwJGNhbGwoYyxmKTpTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChhLHZvaWQgMCx2b2lkIDAsZixcbmMpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXlcIixTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkpO1NrLm1pc2NldmFsLmFwcGx5PWZ1bmN0aW9uKGEsYyxmLGwsaCl7YT1Tay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChhLGMsZixsLGgpO3JldHVybiBhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYSk6YX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlcIixTay5taXNjZXZhbC5hcHBseSk7U2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2U9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYixlKXt0cnl7KGZ1bmN0aW9uIGcoYSl7dHJ5e2Zvcih2YXIgZD1mdW5jdGlvbigpe3RyeXtnKGEucmVzdW1lKCkpfWNhdGNoKHQpe2UodCl9fSxmPWZ1bmN0aW9uKGIpe3RyeXthLmRhdGEucmVzdWx0PWIsXG5kKCl9Y2F0Y2godil7ZSh2KX19LHA9ZnVuY3Rpb24oYil7dHJ5e2EuZGF0YS5lcnJvcj1iLGQoKX1jYXRjaCh2KXtlKHYpfX07YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb247KXt2YXIgbD1jJiYoY1thLmRhdGEudHlwZV18fGNbXCIqXCJdKTtpZihsKXt2YXIgQT1sKGEpO2lmKEEpe0EudGhlbihnLGUpO3JldHVybn19aWYoXCJTay5wcm9taXNlXCI9PWEuZGF0YS50eXBlKXthLmRhdGEucHJvbWlzZS50aGVuKGYscCk7cmV0dXJufWlmKFwiU2sueWllbGRcIj09YS5kYXRhLnR5cGUpe1NrLmdsb2JhbC5zZXRJbW1lZGlhdGUoZCk7cmV0dXJufWlmKFwiU2suZGVsYXlcIj09YS5kYXRhLnR5cGUpe1NrLmdsb2JhbC5zZXRJbW1lZGlhdGUoZCk7cmV0dXJufWlmKGEub3B0aW9uYWwpYT1hLnJlc3VtZSgpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yKFwiVW5oYW5kbGVkIG5vbi1vcHRpb25hbCBzdXNwZW5zaW9uIG9mIHR5cGUgJ1wiK2EuZGF0YS50eXBlK1wiJ1wiKTtcbn1iKGEpfWNhdGNoKHQpe2UodCl9fSkoYSgpKX1jYXRjaChoKXtlKGgpfX0pfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hc3luY1RvUHJvbWlzZVwiLFNrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlKTtTay5taXNjZXZhbC5hcHBseUFzeW5jPWZ1bmN0aW9uKGEsYyxmLGwsaCxkKXtyZXR1cm4gU2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2UoZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYyxmLGwsaCxkKX0sYSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmFwcGx5QXN5bmNcIixTay5taXNjZXZhbC5hcHBseUFzeW5jKTtTay5taXNjZXZhbC5jaGFpbj1mdW5jdGlvbihhLGMpe2Zvcih2YXIgYj0xLGU9YSxoLGQ7Oyl7aWYoYj09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZTtpZihlJiZlLiRpc1N1c3BlbnNpb24pYnJlYWs7ZT1hcmd1bWVudHNbYl0oZSk7YisrfWQ9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC1iKTtmb3IoaD0wO2g8YXJndW1lbnRzLmxlbmd0aC1cbmI7aCsrKWRbaF09YXJndW1lbnRzW2IraF07aD0wO3JldHVybiBmdW5jdGlvbiBrKGEpe2Zvcig7aDxkLmxlbmd0aDspe2lmKGEgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uKXJldHVybiBuZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbihrLGEpO2E9ZFtoXShhKTtoKyt9cmV0dXJuIGF9KGUpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jaGFpblwiLFNrLm1pc2NldmFsLmNoYWluKTtTay5taXNjZXZhbC50cnlDYXRjaD1mdW5jdGlvbihhLGMpe3RyeXt2YXIgYj1hKCl9Y2F0Y2gobCl7cmV0dXJuIGMobCl9cmV0dXJuIGIgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uPyhhPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKHZvaWQgMCxiKSxhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC50cnlDYXRjaChiLnJlc3VtZSxjKX0sYSk6Yn07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwudHJ5Q2F0Y2hcIixTay5taXNjZXZhbC50cnlDYXRjaCk7XG5Tay5taXNjZXZhbC5pdGVyRm9yPWZ1bmN0aW9uKGEsYyxmKXt2YXIgYj1mLGU9ZnVuY3Rpb24oYyl7Yj1jO3JldHVybiBjIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWs/YzphLnRwJGl0ZXJuZXh0KCEwKX07cmV0dXJuIGZ1bmN0aW9uIG4oYSl7Zm9yKDt2b2lkIDAhPT1hOyl7aWYoYSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKG4sYSk7aWYoYT09PVNrLm1pc2NldmFsLkJyZWFrfHxhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWspcmV0dXJuIGEuYnJWYWx1ZTthPVNrLm1pc2NldmFsLmNoYWluKGMoYSxiKSxlKX1yZXR1cm4gYn0oYS50cCRpdGVybmV4dCghMCkpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5pdGVyRm9yXCIsU2subWlzY2V2YWwuaXRlckZvcik7U2subWlzY2V2YWwuaXRlckFycmF5PWZ1bmN0aW9uKGEsYyxmKXtTay5hc3NlcnRzLmFzc2VydChBcnJheS5pc0FycmF5KGEpLFxuXCJpdGVyQXJncyByZXF1aXJlcyBhbiBhcnJheVwiKTtsZXQgYj0wO3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKHt0cCRpdGVybmV4dDooKT0+YVtiKytdfSxjLGYpfTtTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZT1mdW5jdGlvbihhLGMpe2lmKHZvaWQgMD09PWEpcmV0dXJuW107aWYodm9pZCAwPT09YS5ocCR0eXBlJiZ2b2lkIDAhPT1hLnNrJGFzYXJyYXkpcmV0dXJuIGEuc2skYXNhcnJheSgpO2NvbnN0IGI9W107YT1Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2IucHVzaChhKX0pLCgpPT5iKTtyZXR1cm4gYz9hOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhhKX07U2subWlzY2V2YWwuQnJlYWs9ZnVuY3Rpb24oYSl7aWYoISh0aGlzIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWspKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoYSk7dGhpcy5iclZhbHVlPWF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLkJyZWFrXCIsXG5Tay5taXNjZXZhbC5CcmVhayk7U2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQ9ZnVuY3Rpb24oYSxjLGYsbCxoKXt2YXIgYjtpZihudWxsPT1hfHxhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZVwiKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSYmdm9pZCAwPT09YS50cCRjYWxsJiYoYT1uZXcgU2suYnVpbHRpbi5mdW5jKGEpKTt2YXIgZT1hLnRwJGNhbGw7aWYodm9pZCAwIT09ZSl7aWYoZilmb3IoZj1mLnRwJGl0ZXIoKSxiPWYudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9Zi50cCRpdGVybmV4dCgpKWgucHVzaChiKTtpZihjKWZvcihmPVNrLmFic3RyLml0ZXIoYyksYj1mLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWYudHAkaXRlcm5leHQoKSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiRnVuY3Rpb24ga2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzXCIpO1xubC5wdXNoKGIudik7bC5wdXNoKFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxiLCExKSl9cmV0dXJuIGUuY2FsbChhLGgsbCxjKX1lPWEuX19jYWxsX187aWYodm9pZCAwIT09ZSlyZXR1cm4gaC51bnNoaWZ0KGEpLFNrLm1pc2NldmFsLmFwcGx5KGUsYyxmLGwsaCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmRcIixTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZCk7U2subWlzY2V2YWwucHJvbWlzZVRvU3VzcGVuc2lvbj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbjtiLnJlc3VtZT1mdW5jdGlvbigpe2lmKGIuZGF0YS5lcnJvcil0aHJvdyBiLmRhdGEuZXJyb3I7cmV0dXJuIGIuZGF0YS5yZXN1bHR9O2IuZGF0YT17dHlwZTpcIlNrLnByb21pc2VcIixwcm9taXNlOmF9O3JldHVybiBifTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb25cIixTay5taXNjZXZhbC5wcm9taXNlVG9TdXNwZW5zaW9uKTtTay5taXNjZXZhbC5idWlsZENsYXNzPWZ1bmN0aW9uKGEsYyxmLGwsaCl7dmFyIGI9U2suYnVpbHRpbi50eXBlLGU9e307YyhhLGUsdm9pZCAwPT09aD97fTpoKTthLl9fbmFtZV9fJiYoZS5fX21vZHVsZV9fPWEuX19uYW1lX18pO2E9bmV3IFNrLmJ1aWx0aW4uc3RyKGYpO2w9bmV3IFNrLmJ1aWx0aW4udHVwbGUobCk7Yz1bXTtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYoYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihuKSksYy5wdXNoKGVbbl0pKTtjPW5ldyBTay5idWlsdGluLmRpY3QoYyk7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLFthLGwsY10pfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5idWlsZENsYXNzXCIsU2subWlzY2V2YWwuYnVpbGRDbGFzcyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5jYWxsYWJsZV9pdGVyXz1cblNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImNhbGxhYmxlX2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpdGVyKHYsIHcpOiB2IG11c3QgYmUgY2FsbGFibGVcIik7dGhpcy4kY2FsbGFibGU9YTt0aGlzLiRzZW50aW5lbD1jO3RoaXMuJGZsYWc9ITF9LGl0ZXJuZXh0KGEpe2lmKCEwIT09dGhpcy4kZmxhZyl7aWYoYSlyZXR1cm4gYT1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkodGhpcy4kY2FsbGFibGUsW10pLFNrLm1pc2NldmFsLmNoYWluKGEsYT0+e2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLHRoaXMuJHNlbnRpbmVsLFwiRXFcIiwhMCkpdGhpcy4kZmxhZz0hMDtlbHNlIHJldHVybiBhfSk7YT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy4kY2FsbGFibGUsW10pO2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLFxudGhpcy4kc2VudGluZWwsXCJFcVwiLCExKSl0aGlzLiRmbGFnPSEwO2Vsc2UgcmV0dXJuIGF9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uc2VxX2l0ZXJfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIml0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWF9LGl0ZXJuZXh0KGEpe2xldCBjO2M9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PnRoaXMuJHNlcS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpbmRleCsrKSxhKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5JbmRleEVycm9yfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uKSl0aHJvdyBhO30pO3JldHVybiBhP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186eyRmbGFnczp7Tm9BcmdzOiEwfSxcbiRtZXRoKCl7aWYodGhpcy4kc2VxLnNxJGxlbmd0aClyZXR1cm4gdGhpcy4kc2VxLnNxJGxlbmd0aCgpLXRoaXMuJGluZGV4O3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJsZW4gaXMgbm90IGltcGxlbWVudGVkIGZvciBcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzLiRzZXEpKTt9fX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNhbGxhYmxlX2l0ZXJfXCIsU2suYnVpbHRpbi5jYWxsYWJsZV9pdGVyXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5saXN0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJsaXN0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWE/YT1bXTpBcnJheS5pc0FycmF5KGEpfHwoYT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSk7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdCxcImJhZCBjYWxsIHRvIGxpc3QsIHVzZSAnbmV3JyB3aXRoIGFuIEFycmF5IG9mIHB5dGhvbiBvYmplY3RzXCIpO1xudGhpcy52PWE7dGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRkb2M6XCJCdWlsdC1pbiBtdXRhYmxlIHNlcXVlbmNlLlxcblxcbklmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyBlbXB0eSBsaXN0LlxcblRoZSBhcmd1bWVudCBtdXN0IGJlIGFuIGl0ZXJhYmxlIGlmIHNwZWNpZmllZC5cIix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJsaXN0XCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwibGlzdFwiLGEsMCwxKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYVswXSwhMCksYT0+e3RoaXMudj1hfSl9LCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJbLi4uXVwiKTtcbnRoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudi5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJbXCIrYS5qb2luKFwiLCBcIikrXCJdXCIpfSx0cCRyaWNoY29tcGFyZTpTay5nZW5lcmljLnNlcUNvbXBhcmUsdHAkaXRlcigpe3JldHVybiBuZXcgYSh0aGlzKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3QpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGNvbmNhdGVuYXRlIGxpc3QgdG8gbGlzdFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYuY29uY2F0KGEudikpfSxzcSRjb250YWlucyhhKXtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZihjPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsXG5hLFwiRXFcIikpcmV0dXJuITA7cmV0dXJuITF9LHNxJHJlcGVhdChhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoYSp0aGlzLnYubGVuZ3RoPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGE7YysrKWZvcihsZXQgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspYi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9LG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXJldHVybiBhPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvciksXG5hPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGluZGV4IG91dCBvZiByYW5nZVwiKSx0aGlzLnZbYV07aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2godGhpcy52W2FdKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIHNsaWNlcywgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9LG1wJGFzc19zdWJzY3JpcHQoYSxjKXt2b2lkIDA9PT1jP3RoaXMuZGVsJHN1YnNjcmlwdChhKTp0aGlzLmFzcyRzdWJzY3JpcHQoYSxjKX0sc3EkaW5wbGFjZV9jb25jYXQoYSl7cmV0dXJuIGE9PT10aGlzPyh0aGlzLnYucHVzaCguLi50aGlzLnYpLHRoaXMpOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy52LnB1c2goYSl9KSxcbigpPT50aGlzKX0sc3EkaW5wbGFjZV9yZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2NvbnN0IGI9dGhpcy52Lmxlbmd0aDtpZigwPj1hKXRoaXMudi5sZW5ndGg9MDtlbHNlIGlmKGEqYj5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUil0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yO2ZvcihsZXQgYz0xO2M8YTtjKyspZm9yKGxldCBhPTA7YTxiO2ErKyl0aGlzLnYucHVzaCh0aGlzLnZbYV0pO3JldHVybiB0aGlzfX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgYyh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgbGlzdC5cIn0sY2xlYXI6eyRtZXRoKCl7dGhpcy52Lmxlbmd0aD0wO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIGxpc3QuXCJ9LGNvcHk6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy52LnNsaWNlKDApKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGxpc3QuXCJ9LGFwcGVuZDp7JG1ldGgoYSl7dGhpcy52LnB1c2goYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBvYmplY3QsIC8pXCIsJGRvYzpcIkFwcGVuZCBvYmplY3QgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cIn0saW5zZXJ0OnskbWV0aChhLFxuYyl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpOyh7c3RhcnQ6YX09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxhKSk7dGhpcy52LnNwbGljZShhLDAsYyk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5kZXgsIG9iamVjdCwgLylcIiwkZG9jOlwiSW5zZXJ0IG9iamVjdCBiZWZvcmUgaW5kZXguXCJ9LGV4dGVuZDp7JG1ldGgoYSl7cmV0dXJuIGE9PT10aGlzPyh0aGlzLnYucHVzaCguLi50aGlzLnYpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCk6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9Pnt0aGlzLnYucHVzaChhKX0pLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJFeHRlbmQgbGlzdCBieSBhcHBlbmRpbmcgZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUuXCJ9LFxucG9wOnskbWV0aChhKXthPXZvaWQgMD09PWE/dGhpcy52Lmxlbmd0aC0xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT10aGlzLmxpc3QkaW5SYW5nZShhLFwicG9wIGluZGV4IG91dCBvZiByYW5nZVwiKTtjb25zdCBiPXRoaXMudlthXTt0aGlzLnYuc3BsaWNlKGEsMSk7cmV0dXJuIGJ9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGluZGV4PS0xLCAvKVwiLCRkb2M6XCJSZW1vdmUgYW5kIHJldHVybiBpdGVtIGF0IGluZGV4IChkZWZhdWx0IGxhc3QpLlxcblxcblJhaXNlcyBJbmRleEVycm9yIGlmIGxpc3QgaXMgZW1wdHkgb3IgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlwifSxyZW1vdmU6eyRtZXRoKGEpe2E9dGhpcy5saXN0JGluZGV4T2YoYSk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJsaXN0LnJlbW92ZSh4KTogeCBub3QgaW4gbGlzdFwiKTt0aGlzLnYuc3BsaWNlKGEsXG4xKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRkb2M6XCJSZW1vdmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB2YWx1ZS5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuXCJ9LHNvcnQ6eyRtZXRoKGEsYyl7aWYoYS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic29ydCgpIHRha2VzIG5vIHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpO2NvbnN0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwic29ydFwiLFtcImtleVwiLFwicmV2ZXJzZVwiXSxhLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLmJvb2wuZmFsc2UkXSk7cmV0dXJuIHRoaXMubGlzdCRzb3J0KHZvaWQgMCxiLGUpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKiwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpXCIsXG4kZG9jOlwiU3RhYmxlIHNvcnQgKklOIFBMQUNFKi5cIn0saW5kZXg6eyRtZXRoKGEsYyxmKXtpZih2b2lkIDAhPT1jJiYhU2subWlzY2V2YWwuaXNJbmRleChjKXx8dm9pZCAwIT09ZiYmIVNrLm1pc2NldmFsLmlzSW5kZXgoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKTtjPXRoaXMubGlzdCRpbmRleE9mKGEsYyxmKTtpZigtMT09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiIGlzIG5vdCBpbiBsaXN0XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgc3RhcnQ9MCwgc3RvcD1zeXMubWF4c2l6ZSwgLylcIiwkZG9jOlwiUmV0dXJuIGZpcnN0IGluZGV4IG9mIHZhbHVlLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cIn0sXG5jb3VudDp7JG1ldGgoYSl7bGV0IGI9MDtjb25zdCBjPXRoaXMudi5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxjO2UrKylpZih0aGlzLnZbZV09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W2VdLGEsXCJFcVwiKSliKz0xO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRkb2M6XCJSZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHZhbHVlLlwifSxyZXZlcnNlOnskbWV0aCgpe3RoaXMubGlzdCRyZXZlcnNlKCk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXZlcnNlICpJTiBQTEFDRSouXCJ9fSxwcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2xpY2UoMCl9LGxpc3Qkc29ydDpmdW5jdGlvbihhLGMsZil7Y29uc3QgYj1udWxsIT1jJiZjIT09U2suYnVpbHRpbi5ub25lLm5vbmUkO1xudmFyIGU9bnVsbCE9YSYmYSE9PVNrLmJ1aWx0aW4ubm9uZS5ub25lJDtsZXQgZDtpZih2b2lkIDA9PT1mKWQ9ITE7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrSW50KGYpKWQ9U2subWlzY2V2YWwuaXNUcnVlKGYpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTtmPW5ldyBTay5idWlsdGluLnRpbVNvcnQodGhpcyk7dGhpcy52PVtdO2NvbnN0IGc9bmV3IFNrLmJ1aWx0aW4uaW50XygwKTtpZihiKXtmLmx0PWU/ZnVuY3Rpb24oYixjKXtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiWzBdLGNbMF1dKTtyZXR1cm4gU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsZyxcIkx0XCIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYVswXSxiWzBdLFwiTHRcIil9O2ZvcihsZXQgYT0wO2E8Zi5saXN0bGVuZ3RoO2ErKyl7ZT1mLmxpc3QudlthXTtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFxuW2VdKTtmLmxpc3QudlthXT1bYixlXX19ZWxzZSBlJiYoZi5sdD1mdW5jdGlvbihiLGMpe2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW2IsY10pO3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYixnLFwiTHRcIil9KTtkJiZmLmxpc3QubGlzdCRyZXZlcnNlKCk7Zi5zb3J0KCk7ZCYmZi5saXN0Lmxpc3QkcmV2ZXJzZSgpO2lmKGIpZm9yKGM9MDtjPGYubGlzdGxlbmd0aDtjKyspZT1mLmxpc3QudltjXVsxXSxmLmxpc3QudltjXT1lO2M9MDx0aGlzLnNxJGxlbmd0aCgpO3RoaXMudj1mLmxpc3QudjtpZihjKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJsaXN0IG1vZGlmaWVkIGR1cmluZyBzb3J0XCIpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LGxpc3QkaW5SYW5nZShhLGMpezA+YSYmKGErPXRoaXMudi5sZW5ndGgpO2lmKDA8PWEmJmE8dGhpcy52Lmxlbmd0aClyZXR1cm4gYTt0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKGMpO1xufSxsaXN0JGluZGV4T2YoYSxjLGYpe2Zvcih7c3RhcnQ6YyxlbmQ6Zn09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxjLGYpO2M8ZiYmYzx0aGlzLnYubGVuZ3RoO2MrKylpZih0aGlzLnZbY109PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W2NdLGEsXCJFcVwiKSlyZXR1cm4gYztyZXR1cm4tMX0sbGlzdCRyZXZlcnNlKCl7dGhpcy52LnJldmVyc2UoKX0sYXNzJHN1YnNjcmlwdChhLGMpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhpcy5hc3MkaW5kZXgoYSxjKTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNsaWNlKXtjb25zdCB7c3RhcnQ6YixzdG9wOmUsc3RlcDpofT1hLnNsaWNlJGluZGljZXModGhpcy52Lmxlbmd0aCk7MT09PWg/dGhpcy5hc3Mkc2xpY2UoYixlLGMpOnRoaXMuYXNzJGV4dF9zbGljZShhLGMpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKSk7fSxhc3MkaW5kZXgoYSxjKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7YT10aGlzLmxpc3QkaW5SYW5nZShhLFwibGlzdCBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZVwiKTt0aGlzLnZbYV09Y30sYXNzJHNsaWNlKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGFzc2lnbiBhbiBpdGVyYWJsZVwiKTtmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGYpO3RoaXMudi5zcGxpY2UoYSxjLWEsLi4uZil9LGFzcyRleHRfc2xpY2UoYSxjKXtjb25zdCBiPVtdO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57Yi5wdXNoKGEpfSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtdXN0IGFzc2lnbiBpdGVyYWJsZSB0byBleHRlbmRlZCBzbGljZVwiKTtcbmE9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYyk7aWYoYi5sZW5ndGghPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiYXR0ZW1wdCB0byBhc3NpZ24gc2VxdWVuY2Ugb2Ygc2l6ZSBcIithLmxlbmd0aCtcIiB0byBleHRlbmRlZCBzbGljZSBvZiBzaXplIFwiK2IubGVuZ3RoKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMudi5zcGxpY2UoYltjXSwxLGFbY10pfSxkZWwkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhpcy5kZWwkaW5kZXgoYSk7ZWxzZSBpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7Y29uc3Qge3N0YXJ0OmIsc3RvcDpjLHN0ZXA6bH09YS5zbGljZSRpbmRpY2VzKHRoaXMudi5sZW5ndGgpOzE9PT1sP3RoaXMuZGVsJHNsaWNlKGIsYyk6dGhpcy5kZWwkZXh0X3NsaWNlKGEsMDxsPzE6MCl9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoYSkpO30sZGVsJGluZGV4KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKTthPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3RoaXMudi5zcGxpY2UoYSwxKX0sZGVsJHNsaWNlKGEsYyl7dGhpcy52LnNwbGljZShhLGMtYSl9LGRlbCRleHRfc2xpY2UoYSxjKXtsZXQgYj0wO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57dGhpcy52LnNwbGljZShhLWIsMSk7Yis9Y30pfX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmxpc3RcIixTay5idWlsdGluLmxpc3QpO1NrLmJ1aWx0aW4ubGlzdC5weTIkbWV0aG9kcz17c29ydDp7JG5hbWU6XCJzb3J0XCIsJG1ldGgoYSxjKXtjb25zdCBbYixlLGhdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwic29ydFwiLFtcImNtcFwiLFwia2V5XCIsXCJyZXZlcnNlXCJdLGEsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkLFxuU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSRdKTtyZXR1cm4gdGhpcy5saXN0JHNvcnQoYixlLGgpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgY21wPU5vbmUsIGtleT1Ob25lLCByZXZlcnNlPUZhbHNlKVwiLCRkb2M6XCJTdGFibGUgc29ydCAqSU4gUExBQ0UqLlwifX07dmFyIGE9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwibGlzdF9pdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO3RoaXMuJHNlcT1hLnZ9LGl0ZXJuZXh0OlNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXksbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSksYz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJsaXN0X3JldmVyc2VpdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD1cbmEudi5sZW5ndGgtMTt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy4kc2VxW3RoaXMuJGluZGV4LS1dO2lmKHZvaWQgMD09PWEpdGhpcy50cCRpdGVybmV4dD0oKT0+e307ZWxzZSByZXR1cm4gYX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEsYSl7ZnVuY3Rpb24gYyhhKXt2YXIgYj1hLnJlcGxhY2UoRixcIlwiKS5yZXBsYWNlKE0sXCJfXCIpLnRvTG93ZXJDYXNlKCk7Yj1FW2JdO3JldHVybiB2b2lkIDA9PT1iP2E6Yn1mdW5jdGlvbiBiKGEsYixjKXtpZih2b2lkIDA9PT1iKWI9XCJ1dGYtOFwiO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSliPWIuJGpzc3RyKCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGFyZ3VtZW50IFwiKyhcImJ5dGVzc3RyXCIuaW5jbHVkZXMoYSk/XG4yOjEpK1wiIG11c3QgYmUgc3RyIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShiKSk7aWYodm9pZCAwPT09YyljPVwic3RyaWN0XCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKWM9Yy4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgYXJndW1lbnQgXCIrKFwiYnl0ZXNzdHJcIi5pbmNsdWRlcyhhKT8zOjIpK1wiIG11c3QgYmUgc3RyIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShjKSk7cmV0dXJue2VuY29kaW5nOmIsZXJyb3JzOmN9fWZ1bmN0aW9uIGUoYSxiLGQpe2E9YS4kanNzdHIoKTtiPWMoYik7aWYoXCJzdHJpY3RcIiE9PWQmJlwiaWdub3JlXCIhPT1kJiZcInJlcGxhY2VcIiE9PWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIidcIitkK1wiJyBlcnJvciBoYW5kbGluZyBub3QgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XCIpO2lmKFwiYXNjaWlcIj09PWIpe2I9W107Zm9yKGUgaW4gYSl7Y29uc3QgYz1hLmNoYXJDb2RlQXQoZSk7XG5pZigxMjc8Yyl7aWYoXCJzdHJpY3RcIj09PWQpdGhyb3cgZD1mKGMpLG5ldyBTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcihcIidhc2NpaScgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlciAnXCIrZCtcIicgaW4gcG9zaXRpb24gXCIrZStcIjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KVwiKTtcInJlcGxhY2VcIj09PWQmJmIucHVzaCg2Myl9ZWxzZSBiLnB1c2goYyl9dmFyIGU9bmV3IFVpbnQ4QXJyYXkoYil9ZWxzZSBpZihcInV0Zi04XCI9PT1iKWU9Vi5lbmNvZGUoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5Mb29rdXBFcnJvcihcInVua25vd24gZW5jb2Rpbmc6IFwiK2IpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhlKX1mdW5jdGlvbiBmKGEpe3ZhciBiPTI2NT49YT9cIlxcXFx4XCI6XCJcXFxcdVwiO2E9YS50b1N0cmluZygxNik7Mz09PWEubGVuZ3RoJiYoYT1hLnNsaWNlKDEsMykpO3JldHVybiBhPTE9PT1hLmxlbmd0aD9iK1wiMFwiK2E6YithfWZ1bmN0aW9uIGwoYSxkKXsoe2VuY29kaW5nOmEsXG5lcnJvcnM6ZH09YihcImRlY29kZVwiLGEsZCkpO2E9YyhhKTtpZihcInN0cmljdFwiIT09ZCYmXCJpZ25vcmVcIiE9PWQmJlwicmVwbGFjZVwiIT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiJ1wiK2QrXCInIGVycm9yIGhhbmRsaW5nIG5vdCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcIik7aWYoXCJhc2NpaVwiPT09YSl7YT10aGlzLnY7dmFyIGU9XCJcIjtmb3IobGV0IGI9MDtiPGEubGVuZ3RoO2IrKyl7Y29uc3QgYz1hW2JdO2lmKDEyNzxjKXtpZihcInN0cmljdFwiPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IoXCInYXNjaWknIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4XCIrYy50b1N0cmluZygxNikrXCIgaW4gcG9zaXRpb24gXCIrYitcIjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KVwiKTtcInJlcGxhY2VcIj09PWQmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDY1NTMzKSl9ZWxzZSBlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMpfWE9ZX1lbHNlIGlmKFwidXRmLThcIj09PVxuYSlhOmlmKGE9dGhpcy52LGU9ZCxkPXkuZGVjb2RlKGEpLFwicmVwbGFjZVwiPT09ZSlhPWQ7ZWxzZXtpZihcInN0cmljdFwiPT09ZSl7ZT1kLmluZGV4T2YoXCJcXHVmZmZkXCIpO2lmKC0xPT09ZSl7YT1kO2JyZWFrIGF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKFwiJ3V0Zi04JyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweFwiK2FbZV0udG9TdHJpbmcoMTYpK1wiIGluIHBvc2l0aW9uIFwiK2UrXCI6IGludmFsaWQgc3RhcnQgYnl0ZVwiKTt9YT1kLnJlcGxhY2UoL1xcdWZmZmQvZyxcIlwiKX1lbHNlIHRocm93IG5ldyBTay5idWlsdGluLkxvb2t1cEVycm9yKFwidW5rbm93biBlbmNvZGluZzogXCIrYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzfHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXG5cIiBmaXJzdCBhcmcgbXVzdCBiZSBieXRlcyBvciBhIHR1cGxlIG9mIGJ5dGVzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpOyh7c3RhcnQ6ZCxlbmQ6ZX09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxkLGUpKTtpZihlPGQpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7ZD10aGlzLnYuc3ViYXJyYXkoZCxlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7Zm9yKGxldCBhPVNrLmFic3RyLml0ZXIoYyksZT1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZTtlPWEudHAkaXRlcm5leHQoKSlpZihlPXRoaXMuZ2V0JHJhdyhlKSxiKGQsZSkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJH1yZXR1cm4gYihkLGMudik/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtiPXRoaXMuZ2V0JHRndChiKTtcbih7c3RhcnQ6YyxlbmQ6ZH09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxjLGQpKTtyZXR1cm4gZDxjPy0xOlwibnVtYmVyXCI9PT10eXBlb2YgYj8oYj1hP3RoaXMudi5sYXN0SW5kZXhPZihiLGQtMSk6dGhpcy52LmluZGV4T2YoYixjKSxiPj1jJiZiPGQ/YjotMSk6YT90aGlzLmZpbmQkc3VicmlnaHQoYixjLGQpOnRoaXMuZmluZCRzdWJsZWZ0KGIsYyxkKX19ZnVuY3Rpb24gZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7Yj10aGlzLmdldCRyYXcoYik7bGV0IGM7aWYoYSl7aWYoYz10aGlzLmZpbmQkc3VicmlnaHQoYiwwLHRoaXMudi5sZW5ndGgpLDA+YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmJ5dGVzLG5ldyBTay5idWlsdGluLmJ5dGVzLHRoaXNdKX1lbHNlIGlmKGM9dGhpcy5maW5kJHN1YmxlZnQoYiwwLHRoaXMudi5sZW5ndGgpLDA+YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXMsbmV3IFNrLmJ1aWx0aW4uYnl0ZXMsXG5uZXcgU2suYnVpbHRpbi5ieXRlc10pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KDAsYykpLG5ldyBTay5idWlsdGluLmJ5dGVzKGIpLG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShjK2IubGVuZ3RoKSldKX19ZnVuY3Rpb24gbihhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD12b2lkIDA9PT1jfHxjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkP25ldyBVaW50OEFycmF5KFs5LDEwLDExLDEyLDEzLDMyLDEzM10pOnRoaXMuZ2V0JHJhdyhjKTtjPTA7dmFyIGU9dGhpcy52Lmxlbmd0aDtpZihhKWZvcig7YzxlJiZkLmluY2x1ZGVzKHRoaXMudltjXSk7KWMrKztpZihiKWZvcig7ZT5jJiZkLmluY2x1ZGVzKHRoaXMudltlLTFdKTspZS0tO2Q9bmV3IFVpbnQ4QXJyYXkoZS1jKTtmb3IoZT0wO2U8ZC5sZW5ndGg7ZSsrKWRbZV09dGhpcy52W2UrY107cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGQpfX1cbmZ1bmN0aW9uIGsoYSxiLGMpe3JldHVybiBmdW5jdGlvbihkLGUpe2lmKHZvaWQgMD09PWUpZT0zMjtlbHNlIGlmKGUgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzJiYxPT1lLnYubGVuZ3RoKWU9ZS52WzBdO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBhcmd1bWVudCAyIG11c3QgYmUgYSBieXRlIHN0cmluZyBvZiBsZW5ndGggMSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGUpKTtjb25zdCBmPXRoaXMudi5sZW5ndGg7ZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKGQ8PWYpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7Y29uc3QgZz1uZXcgVWludDhBcnJheShkKTtsZXQgayxoO2M/KGs9TWF0aC5mbG9vcigoZC1mKS8yKSxoPShkLWYpJTI/aysxOmspOmI/KGs9ZC1mLGg9MCk6KGs9MCxoPWQtZik7Zy5maWxsKGUsMCxrKTtmb3IobGV0IGE9MDthPGY7YSsrKWdbYStrXT10aGlzLnZbYV07XG5nLmZpbGwoZSxkLWgpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhnKX19ZnVuY3Rpb24gcChhKXtyZXR1cm4gOTw9YSYmMTM+PWF8fDMyPT09YX1mdW5jdGlvbiB1KGEpe3JldHVybiA5Nzw9YSYmMTIyPj1hfWZ1bmN0aW9uIEEoYSl7cmV0dXJuIDY1PD1hJiY5MD49YX1mdW5jdGlvbiB0KGEpe3JldHVybiA0ODw9YSYmNTc+PWF9ZnVuY3Rpb24gdihhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy52Lmxlbmd0aD9iP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkOnRoaXMudi5ldmVyeShiPT5hKGIpKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gQihhLGIpe3JldHVybiBmdW5jdGlvbigpe2xldCBjPSExO2ZvcihsZXQgZD0wO2Q8dGhpcy52Lmxlbmd0aDtkKyspe2lmKGIodGhpcy52W2RdKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDshYyYmYSh0aGlzLnZbZF0pJiZcbihjPSEwKX1yZXR1cm4gYz9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gRChhKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBiPW5ldyBVaW50OEFycmF5KHRoaXMudi5sZW5ndGgpO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspYltjXT1hKHRoaXMudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfX1hKDMwKTtjb25zdCBFPXt1dGY6XCJ1dGYtOFwiLHV0Zjg6XCJ1dGYtOFwiLHV0Zl84OlwidXRmLThcIixhc2NpaTpcImFzY2lpXCJ9O3ZhciBGPS9cXHMrL2csTT0vW18tXSsvZztjb25zdCBWPW5ldyBUZXh0RW5jb2Rlcix5PW5ldyBUZXh0RGVjb2RlcjtTay5idWlsdGluLmJ5dGVzPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJieXRlc1wiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYnl0ZXMgaXMgYSBjb25zdHJ1Y3RvciB1c2UgJ25ldydcIik7XG5pZih2b2lkIDA9PT1hKXRoaXMudj1uZXcgVWludDhBcnJheTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXRoaXMudj1hO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShhKSlTay5hc3NlcnRzLmFzc2VydChhLmV2ZXJ5KGE9PjA8PWEmJjI1NT49YSksXCJiYWQgaW50ZXJuYWwgY2FsbCB0byBieXRlcyB3aXRoIGFycmF5XCIpLHRoaXMudj1uZXcgVWludDhBcnJheShhKTtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSl7bGV0IGI7Y29uc3QgYz1uZXcgVWludDhBcnJheShhLmxlbmd0aCksZD1hLmxlbmd0aDtmb3IobGV0IGU9MDtlPGQ7ZSsrKXtiPWEuY2hhckNvZGVBdChlKTtpZigyNTU8Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IoXCJpbnZhbGlkIHN0cmluZyBhdCBpbmRleCBcIitlK1wiIChwb3NzaWJseSBjb250YWlucyBhIHVuaWNvZGUgY2hhcmFjdGVyKVwiKTtjW2VdPWJ9dGhpcy52PWN9ZWxzZSBpZihcIm51bWJlclwiPT09dHlwZW9mIGEpdGhpcy52PVxubmV3IFVpbnQ4QXJyYXkoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgYXJndW1lbnQgdG8gYnl0ZXMgY29uc3RydWN0b3JcIik7fSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkZG9jOlwiYnl0ZXMoaXRlcmFibGVfb2ZfaW50cykgLT4gYnl0ZXNcXG5ieXRlcyhzdHJpbmcsIGVuY29kaW5nWywgZXJyb3JzXSkgLT4gYnl0ZXNcXG5ieXRlcyhieXRlc19vcl9idWZmZXIpIC0+IGltbXV0YWJsZSBjb3B5IG9mIGJ5dGVzX29yX2J1ZmZlclxcbmJ5dGVzKGludCkgLT4gYnl0ZXMgb2JqZWN0IG9mIHNpemUgZ2l2ZW4gYnkgdGhlIHBhcmFtZXRlciBpbml0aWFsaXplZCB3aXRoIG51bGwgYnl0ZXNcXG5ieXRlcygpIC0+IGVtcHR5IGJ5dGVzIG9iamVjdFxcblxcbkNvbnN0cnVjdCBhbiBpbW11dGFibGUgYXJyYXkgb2YgYnl0ZXMgZnJvbTpcXG4gIC0gYW4gaXRlcmFibGUgeWllbGRpbmcgaW50ZWdlcnMgaW4gcmFuZ2UoMjU2KVxcbiAgLSBhIHRleHQgc3RyaW5nIGVuY29kZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZ1xcbiAgLSBhbnkgb2JqZWN0IGltcGxlbWVudGluZyB0aGUgYnVmZmVyIEFQSS5cXG4gIC0gYW4gaW50ZWdlclwiLFxudHAkbmV3KGEsYyl7aWYodGhpcyE9PVNrLmJ1aWx0aW4uYnl0ZXMucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGMpO2M9Y3x8W107aWYoMT49YS5sZW5ndGgmJjA9PT0rYy5sZW5ndGgpYT1hWzBdO2Vsc2V7W2EsZCxjXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImJ5dGVzXCIsW251bGwsXCJweVNvdXJjZVwiLFwiZXJyb3JzXCJdLGEsYyk7KHtlbmNvZGluZzpkLGVycm9yczpjfT1iKFwiYnl0ZXNcIixkLGMpKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJlbmNvZGluZyBvciBlcnJvcnMgd2l0aG91dCBhIHN0cmluZyBhcmd1bWVudFwiKTtyZXR1cm4gZShhLGQsYyl9aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXM7aWYodm9pZCAwIT09KGM9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRieXRlcykpKXt2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxcbltdKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCxhPT57aWYoIVNrLmJ1aWx0aW4uY2hlY2tCeXRlcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2J5dGVzX18gcmV0dXJuZWQgbm9uLWJ5dGVzICh0eXBlIFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiKVwiKTtyZXR1cm4gYX0pfWlmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2Q9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5lZ2F0aXZlIGNvdW50XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhkKX1pZihTay5idWlsdGluLmNoZWNrQnl0ZXMoYSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGEudik7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHJpbmcgYXJndW1lbnQgd2l0aG91dCBhbiBlbmNvZGluZ1wiKTtpZihTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpe2xldCBiPVxuW107ZD1Tay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpO2lmKDA+YXx8MjU1PGEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KVwiKTtiLnB1c2goYSl9KTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCwoKT0+bmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYikpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjb252ZXJ0ICdcIitTay5hYnN0ci50eXBlTmFtZShkKStcIicgb2JqZWN0IGludG8gYnl0ZXNcIik7fSwkcigpe2xldCBhLGI9XCInXCI7Y29uc3QgYz0tMSE9PXRoaXMudi5pbmRleE9mKDM0KTtsZXQgZD1cIlwiO2ZvcihsZXQgZT0wO2U8dGhpcy52Lmxlbmd0aDtlKyspaWYoYT10aGlzLnZbZV0sOT5hfHwxMDxhJiYxMz5hfHwxMzxhJiYzMj5hfHwxMjY8YSlkKz1mKGEpO2Vsc2UgaWYoOT09PWF8fDEwPT09YXx8MTM9PT1hfHwzOT09PVxuYXx8OTI9PT1hKXN3aXRjaChhKXtjYXNlIDk6ZCs9XCJcXFxcdFwiO2JyZWFrO2Nhc2UgMTA6ZCs9XCJcXFxcblwiO2JyZWFrO2Nhc2UgMTM6ZCs9XCJcXFxcclwiO2JyZWFrO2Nhc2UgMzk6Yz9kKz1cIlxcXFwnXCI6KGQrPVwiJ1wiLGI9J1wiJyk7YnJlYWs7Y2FzZSA5MjpkKz1cIlxcXFxcXFxcXCJ9ZWxzZSBkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJiXCIrYitkK2IpfSx0cCRzdHIoKXtyZXR1cm4gdGhpcy4kcigpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBHKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKHRoaXM9PT1hJiZTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5KGIpKXJldHVybiEwO2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBjPXRoaXMudjthPWEudjtpZihjLmxlbmd0aCE9PWEubGVuZ3RoJiYoXCJFcVwiPT09Ynx8XCJOb3RFcVwiPT09YikpcmV0dXJuXCJFcVwiPT09XG5iPyExOiEwO2xldCBkO2NvbnN0IGU9TWF0aC5taW4oYy5sZW5ndGgsYS5sZW5ndGgpO2ZvcihkPTA7ZDxlJiZjW2RdPT09YVtkXTtkKyspO3N3aXRjaChiKXtjYXNlIFwiTHRcIjpyZXR1cm4gZD09PWUmJmMubGVuZ3RoPGEubGVuZ3RofHxjW2RdPGFbZF07Y2FzZSBcIkx0RVwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg8PWEubGVuZ3RofHxjW2RdPD1hW2RdO2Nhc2UgXCJFcVwiOnJldHVybiBkPT09ZTtjYXNlIFwiTm90RXFcIjpyZXR1cm4gZDxlO2Nhc2UgXCJHdFwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg+YS5sZW5ndGh8fGNbZF0+YVtkXTtjYXNlIFwiR3RFXCI6cmV0dXJuIGQ9PT1lJiZjLmxlbmd0aD49YS5sZW5ndGh8fGNbZF0+PWFbZF19fSx0cCRoYXNoKCl7cmV0dXJuKG5ldyBTay5idWlsdGluLnN0cih0aGlzLiRqc3N0cigpKSkudHAkaGFzaCgpfSx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXtsZXQgYj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxcblNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7aWYodm9pZCAwIT09Yil7MD5iJiYoYj10aGlzLnYubGVuZ3RoK2IpO2lmKDA+Ynx8Yj49dGhpcy52Lmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFwiaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMudltiXSl9fWVsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2godGhpcy52W2FdKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhuZXcgVWludDhBcnJheShiKSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYnl0ZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb25jYXQgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIiB0byBieXRlc1wiKTtjb25zdCBiPW5ldyBVaW50OEFycmF5KHRoaXMudi5sZW5ndGgrYS52Lmxlbmd0aCk7bGV0IGM7Zm9yKGM9MDtjPHRoaXMudi5sZW5ndGg7YysrKWJbY109dGhpcy52W2NdO2ZvcihsZXQgZD0wO2Q8YS52Lmxlbmd0aDtkKyssYysrKWJbY109YS52W2RdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhiKX0sc3EkcmVwZWF0KGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtjb25zdCBiPWEqdGhpcy52Lmxlbmd0aDtpZihiPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7aWYoMD49XG5hKXJldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlczthPW5ldyBVaW50OEFycmF5KGIpO2xldCBjPTA7Zm9yKDtjPGI7KWZvcihsZXQgYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspYVtjKytdPXRoaXMudltiXTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYSl9LHNxJGNvbnRhaW5zKGEpe3JldHVybi0xIT09dGhpcy5maW5kJGxlZnQoYSl9LHRwJGFzX251bWJlcjohMCxuYiRyZW1haW5kZXI6U2suYnVpbHRpbi5zdHIucHJvdG90eXBlLm5iJHJlbWFpbmRlcn0scHJvdG86eyRqc3N0cigpe2xldCBhPVwiXCI7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMudltiXSk7cmV0dXJuIGF9LGdldCR0Z3QoYSl7aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpcmV0dXJuIGEudjthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXCJhcmd1bWVudCBzaG91bGQgYmUgaW50ZWdlciBvciBieXRlcy1saWtlIG9iamVjdCwgbm90IHt0cCRuYW1lfVwiKTtcbmlmKDA+YXx8MjU1PGEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KVwiKTtyZXR1cm4gYX0sZ2V0JHJhdyhhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcylyZXR1cm4gYS52O3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgYnl0ZXMtbGlrZSBvYmplY3QgaXMgcmVxdWlyZWQsIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO30sZ2V0JHNwbGl0QXJnczpmdW5jdGlvbihhLGIpe2I9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGIsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtiPTA+Yj9JbmZpbml0eTpiO2E9U2suYnVpbHRpbi5jaGVja05vbmUoYSk/bnVsbDp0aGlzLmdldCRyYXcoYSk7aWYobnVsbCE9PWEmJiFhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZW1wdHkgc2VwYXJhdG9yXCIpO3JldHVybntzZXA6YSxtYXhzcGxpdDpifX0sZmluZCRsZWZ0OmQoITEpLFxuZmluZCRyaWdodDpkKCEwKSxmaW5kJHN1YmxlZnQ6ZnVuY3Rpb24oYSxiLGMpe2M9Yy1hLmxlbmd0aCsxO2xldCBkPWI7Zm9yKDtkPGM7KXtpZihhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2QrYl0pKXJldHVybiBkO2QrK31yZXR1cm4tMX0sZmluZCRzdWJyaWdodChhLGIsYyl7bGV0IGQ9Yy1hLmxlbmd0aDtmb3IoO2Q+PWI7KXtpZihhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2QrYl0pKXJldHVybiBkO2QtLX1yZXR1cm4tMX0sJHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4uYnl0ZXMucHJvdG90eXBlLnRwJG5ldyhhLGIpO2Mudj1hLnY7cmV0dXJuIGN9LHNrJGFzYXJyYXkoKXtjb25zdCBhPVtdO3RoaXMudi5mb3JFYWNoKGI9PnthLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhiKSl9KTtyZXR1cm4gYX19LGZsYWdzOntzdHIkZW5jb2RlOmUsJGRlY29kZTpsLGNoZWNrJGVuY29kZUFyZ3M6Yn0sbWV0aG9kczp7X19nZXRuZXdhcmdzX186eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudikpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6bnVsbH0sY2FwaXRhbGl6ZTp7JG1ldGgoKXtjb25zdCBhPXRoaXMudi5sZW5ndGg7aWYoMD09PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7Y29uc3QgYj1uZXcgVWludDhBcnJheShhKTtsZXQgYz10aGlzLnZbMF07YlswXT11KGMpP2MtMzI6Yztmb3IobGV0IGQ9MTtkPGE7ZCsrKWM9dGhpcy52W2RdLGJbZF09QShjKT9jKzMyOmM7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5jYXBpdGFsaXplKCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdpdGggb25seSBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkIChBU0NJSSlcXG5hbmQgdGhlIHJlc3QgbG93ZXItY2FzZWQuXCJ9LGNlbnRlcjp7JG1ldGg6ayhcImNlbnRlclwiLCExLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiQi5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBCIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gIFBhZGRpbmcgaXNcXG5kb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuXCJ9LGNvdW50OnskbWV0aChhLGIsYyl7YT10aGlzLmdldCR0Z3QoYSk7KHtzdGFydDpiLGVuZDpjfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGIsYykpO2xldCBkPTA7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWZvcig7YjxjO2IrKyl0aGlzLnZbYl09PT1hJiZkKys7ZWxzZXtjPWMtYS5sZW5ndGgrMTtmb3IobGV0IGU9YjtlPGM7ZSsrKWEuZXZlcnkoKGEsYik9PmE9PT10aGlzLnZbZStiXSkmJihkKyssZSs9YS5sZW5ndGgtMSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZCl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2Ygc3Vic2VjdGlvbiBzdWIgaW5cXG5ieXRlcyBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWRcXG5hcyBpbiBzbGljZSBub3RhdGlvbi5cIn0sXG5kZWNvZGU6eyRtZXRoOmwsJGZsYWdzOntOYW1lZEFyZ3M6W1wiZW5jb2RpbmdcIixcImVycm9yc1wiXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0nc3RyaWN0JylcIiwkZG9jOlwiRGVjb2RlIHRoZSBieXRlcyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgZW5jb2RpbmcuXFxuXFxuICBlbmNvZGluZ1xcbiAgICBUaGUgZW5jb2Rpbmcgd2l0aCB3aGljaCB0byBkZWNvZGUgdGhlIGJ5dGVzLlxcbiAgZXJyb3JzXFxuICAgIFRoZSBlcnJvciBoYW5kbGluZyBzY2hlbWUgdG8gdXNlIGZvciB0aGUgaGFuZGxpbmcgb2YgZGVjb2RpbmcgZXJyb3JzLlxcbiAgICBUaGUgZGVmYXVsdCBpcyAnc3RyaWN0JyBtZWFuaW5nIHRoYXQgZGVjb2RpbmcgZXJyb3JzIHJhaXNlIGFcXG4gICAgVW5pY29kZURlY29kZUVycm9yLiBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlICdpZ25vcmUnIGFuZCAncmVwbGFjZSdcXG4gICAgYXMgd2VsbCBhcyBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHdpdGggY29kZWNzLnJlZ2lzdGVyX2Vycm9yIHRoYXRcXG4gICAgY2FuIGhhbmRsZSBVbmljb2RlRGVjb2RlRXJyb3JzLlwifSxcbmVuZHN3aXRoOnskbWV0aDpoKFwiZW5kc3dpdGhcIiwoYSxiKT0+e2NvbnN0IGM9YS5sZW5ndGgtYi5sZW5ndGg7cmV0dXJuIDA8PWMmJmIuZXZlcnkoKGIsZCk9PmI9PT1hW2MrZF0pfSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBCIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxcbldpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cXG5XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxcbnN1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS5cIn0sZXhwYW5kdGFiczp7JG1ldGgoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IsXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIChnb3QgdHlwZSB7dHAkbmFtfSlcIik7XG5jb25zdCBiPVtdO2xldCBjPTA7Zm9yKGxldCBlPTA7ZTx0aGlzLnYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy52W2VdOzk9PT1kPyhkPWEtYyVhLGIucHVzaCguLi5BcnJheShkKS5maWxsKDMyKSksYys9ZCk6MTA9PT1kfHwxMz09PWQ/KGIucHVzaChkKSxjPTApOihiLnB1c2goZCksYysrKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMobmV3IFVpbnQ4QXJyYXkoYikpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJ0YWJzaXplXCJdLERlZmF1bHRzOls4XX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5leHBhbmR0YWJzKHRhYnNpemU9OCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgZXhwYW5kZWQgdXNpbmcgc3BhY2VzLlxcbklmIHRhYnNpemUgaXMgbm90IGdpdmVuLCBhIHRhYiBzaXplIG9mIDggY2hhcmFjdGVycyBpcyBhc3N1bWVkLlwifSxmaW5kOnskbWV0aDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJGxlZnQoYSxcbmIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0saGV4OnskbWV0aCgpe2xldCBhPVwiXCI7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhKz10aGlzLnZbYl0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsXCIwXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmhleCgpIC0+IHN0cmluZ1xcblxcbkNyZWF0ZSBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBudW1iZXJzIGZyb20gYSBieXRlcyBvYmplY3QuXFxuRXhhbXBsZTogYidcXFxceGI5XFxcXHgwMVxcXFx4ZWYnLmhleCgpIC0+ICdiOTAxZWYnLlwifSxcbmluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkbGVmdChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzZWN0aW9uIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLlwifSxpc2FsbnVtOnskbWV0aDp2KGE9PnQoYSl8fFxudShhKXx8QShhKSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNhbG51bSgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBhbHBoYW51bWVyaWNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzYWxwaGE6eyRtZXRoOnYoYT0+NjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2FscGhhKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIGFscGhhYmV0aWNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzYXNjaWk6eyRtZXRoOnYoYT0+MDw9YSYmMTI3Pj1hLCEwKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2FzY2lpKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgaXMgZW1wdHkgb3IgYWxsIGNoYXJhY3RlcnMgaW4gQiBhcmUgQVNDSUksXFxuRmFsc2Ugb3RoZXJ3aXNlLlwifSxcbmlzZGlnaXQ6eyRtZXRoOnYodCksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNkaWdpdCgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBkaWdpdHNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzbG93ZXI6eyRtZXRoOkIodSxBKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2xvd2VyKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIEIgYXJlIGxvd2VyY2FzZSBhbmQgdGhlcmUgaXNcXG5hdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0saXNzcGFjZTp7JG1ldGg6dihwKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc3NwYWNlKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIHdoaXRlc3BhY2VcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LFxuaXN0aXRsZTp7JG1ldGg6ZnVuY3Rpb24oKXtsZXQgYT0hMSxiPSExO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspe2NvbnN0IGQ9dGhpcy52W2NdO2lmKEEoZCkpe2lmKGEpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Yj1hPSEwfWVsc2UgaWYodShkKSl7aWYoIWEpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Yj0hMH1lbHNlIGE9ITF9cmV0dXJuIGI/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzdGl0bGUoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgQiBpcyBhIHRpdGxlY2FzZWQgc3RyaW5nIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmVcXG5jaGFyYWN0ZXIgaW4gQiwgaS5lLiB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seSBmb2xsb3cgdW5jYXNlZFxcbmNoYXJhY3RlcnMgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIG9ubHkgY2FzZWQgb25lcy4gUmV0dXJuIEZhbHNlXFxub3RoZXJ3aXNlLlwifSxcbmlzdXBwZXI6eyRtZXRoOkIoQSx1KSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc3VwcGVyKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIEIgYXJlIHVwcGVyY2FzZSBhbmQgdGhlcmUgaXNcXG5hdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0sam9pbjp7JG1ldGgoYSl7Y29uc3QgYj1bXTtsZXQgYz0wO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcXVlbmNlIGl0ZW0gXCIrYytcIjogZXhwZWN0ZWQgYSBieXRlcy1saWtlIG9iamVjdCwgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgZm91bmRcIik7YysrO2IubGVuZ3RoJiZiLnB1c2goLi4udGhpcy52KTtiLnB1c2goLi4uYS52KX0pLFxuKCk9Pm5ldyBTay5idWlsdGluLmJ5dGVzKG5ldyBVaW50OEFycmF5KGIpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgaXRlcmFibGVfb2ZfYnl0ZXMsIC8pXCIsJGRvYzpcIkNvbmNhdGVuYXRlIGFueSBudW1iZXIgb2YgYnl0ZXMgb2JqZWN0cy5cXG5cXG5UaGUgYnl0ZXMgd2hvc2UgbWV0aG9kIGlzIGNhbGxlZCBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIGVhY2ggcGFpci5cXG5cXG5UaGUgcmVzdWx0IGlzIHJldHVybmVkIGFzIGEgbmV3IGJ5dGVzIG9iamVjdC5cXG5cXG5FeGFtcGxlOiBiJy4nLmpvaW4oW2InYWInLCBiJ3BxJywgYidycyddKSAtPiBiJ2FiLnBxLnJzJy5cIn0sbGp1c3Q6eyRtZXRoOmsoXCJsanVzdFwiLCExLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBCIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sXG5sb3dlcjp7JG1ldGg6RChhPT5BKGEpP2ErMzI6YSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIubG93ZXIoKSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gYSBjb3B5IG9mIEIgd2l0aCBhbGwgQVNDSUkgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlwifSxsc3RyaXA6eyRtZXRoOm4oITAsITEpLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGJ5dGVzPU5vbmUsIC8pXCIsJGRvYzpcIlN0cmlwIGxlYWRpbmcgYnl0ZXMgY29udGFpbmVkIGluIHRoZSBhcmd1bWVudC5cXG5cXG5JZiB0aGUgYXJndW1lbnQgaXMgb21pdHRlZCBvciBOb25lLCBzdHJpcCBsZWFkaW5nICBBU0NJSSB3aGl0ZXNwYWNlLlwifSxwYXJ0aXRpb246eyRtZXRoOmcoITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIGJ5dGVzIGludG8gdGhyZWUgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci5cXG5cXG5UaGlzIHdpbGwgc2VhcmNoIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiB0aGUgYnl0ZXMuIElmIHRoZSBzZXBhcmF0b3IgaXMgZm91bmQsXFxucmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxcbml0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBieXRlc1xcbm9iamVjdCBhbmQgdHdvIGVtcHR5IGJ5dGVzIG9iamVjdHMuXCJ9LFxucmVwbGFjZTp7JG1ldGgoYSxiLGMpe2E9dGhpcy5nZXQkcmF3KGEpO2I9dGhpcy5nZXQkcmF3KGIpO2M9dm9pZCAwPT09Yz8tMTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYyxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2M9MD5jP0luZmluaXR5OmM7Y29uc3QgZD1bXTtsZXQgZT0wO2Zvcih2YXIgZj0wO2Y8dGhpcy52Lmxlbmd0aCYmZTxjOyl7Y29uc3QgYz10aGlzLmZpbmQkc3VibGVmdChhLGYsdGhpcy52Lmxlbmd0aCk7aWYoLTE9PT1jKWJyZWFrO2Zvcig7ZjxjO2YrKylkLnB1c2godGhpcy52W2ZdKTtkLnB1c2goLi4uYik7Zj1jK2EubGVuZ3RoO2UrK31mb3IoZjtmPHRoaXMudi5sZW5ndGg7ZisrKWQucHVzaCh0aGlzLnZbZl0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhuZXcgVWludDhBcnJheShkKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIG9sZCwgbmV3LCBjb3VudD0tMSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgb2xkIHJlcGxhY2VkIGJ5IG5ldy5cXG5cXG4gIGNvdW50XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIHRvIHJlcGxhY2UuXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMuXFxuXFxuSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGNvdW50IGlzIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBjb3VudCBvY2N1cnJlbmNlcyBhcmVcXG5yZXBsYWNlZC5cIn0sXG5yZmluZDp7JG1ldGgoYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRyaWdodChhLGIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJldHVybiAtMSBvbiBmYWlsdXJlLlwifSxyaW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRyaWdodChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzZWN0aW9uIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sXG4kZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLlwifSxyanVzdDp7JG1ldGg6ayhcInJqdXN0XCIsITAsITEpLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIEIgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKVwifSxcbnJwYXJ0aXRpb246eyRtZXRoOmcoITApLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIGJ5dGVzIGludG8gdGhyZWUgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci5cXG5cXG5UaGlzIHdpbGwgc2VhcmNoIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiB0aGUgYnl0ZXMsIHN0YXJ0aW5nIGF0IHRoZSBlbmQuIElmXFxudGhlIHNlcGFyYXRvciBpcyBmb3VuZCwgcmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlXFxuc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHR3byBlbXB0eSBieXRlc1xcbm9iamVjdHMgYW5kIHRoZSBvcmlnaW5hbCBieXRlcyBvYmplY3QuXCJ9LHJzcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXsoe3NlcDphLFxubWF4c3BsaXQ6Yn09dGhpcy5nZXQkc3BsaXRBcmdzKGEsYikpO2NvbnN0IGM9W107bGV0IGQ9MCxlPXRoaXMudi5sZW5ndGg7aWYobnVsbCE9PWEpe2Zvcig7MDw9ZSYmZDxiOyl7Y29uc3QgYj10aGlzLmZpbmQkc3VicmlnaHQoYSwwLGUpO2lmKC0xPT09YilicmVhaztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGIrYS5sZW5ndGgsZSkpKTtlPWI7ZCsrfWMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxlKSkpfWVsc2V7Zm9yKGUtLTtkPGI7KXtmb3IoO3AodGhpcy52W2VdKTspZS0tO2lmKDA+ZSlicmVhazthPWUrMTtmb3IoZS0tOzA8PWUmJiFwKHRoaXMudltlXSk7KWUtLTtjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGUrMSxhKSkpO2QrK31pZigwPD1lKXtmb3IoO3AodGhpcy52W2VdKTspZS0tOzA8PWUmJmMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxcbmUrMSkpKX19cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYy5yZXZlcnNlKCkpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgYnl0ZXMsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBieXRlcy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IG9uIEFTQ0lJIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xcbiAgICAoc3BhY2UsIHRhYiwgcmV0dXJuLCBuZXdsaW5lLCBmb3JtZmVlZCwgdmVydGljYWwgdGFiKS5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cXG5cXG5TcGxpdHRpbmcgaXMgZG9uZSBzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBieXRlcyBhbmQgd29ya2luZyB0byB0aGUgZnJvbnQuXCJ9LFxucnN0cmlwOnskbWV0aDpuKCExLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBieXRlcz1Ob25lLCAvKVwiLCRkb2M6XCJTdHJpcCB0cmFpbGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LHNwbGl0OnskbWV0aDpmdW5jdGlvbihhLGIpeyh7c2VwOmEsbWF4c3BsaXQ6Yn09dGhpcy5nZXQkc3BsaXRBcmdzKGEsYikpO2NvbnN0IGM9W10sZD10aGlzLnYubGVuZ3RoO2xldCBlPTAsZj0wO2lmKG51bGwhPT1hKXtmb3IoO2Y8ZCYmZTxiOyl7Y29uc3QgYj10aGlzLmZpbmQkc3VibGVmdChhLGYsZCk7aWYoLTE9PT1iKWJyZWFrO2MucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoZixiKSkpO2Y9YithLmxlbmd0aDtlKyt9Yy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLFxuZCkpKX1lbHNle2Zvcig7ZTxiOyl7Zm9yKDtwKHRoaXMudltmXSk7KWYrKztpZihmPT09ZClicmVhazthPWY7Zm9yKGYrKztmPGQmJiFwKHRoaXMudltmXSk7KWYrKztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGEsZikpKTtlKyt9aWYoZjxkKXtmb3IoO3AodGhpcy52W2ZdKTspZisrO2Y8ZCYmYy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLGQpKSl9fXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgYnl0ZXMsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBieXRlcy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IG9uIEFTQ0lJIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xcbiAgICAoc3BhY2UsIHRhYiwgcmV0dXJuLCBuZXdsaW5lLCBmb3JtZmVlZCwgdmVydGljYWwgdGFiKS5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cIn0sXG5zcGxpdGxpbmVzOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmlzVHJ1ZShhKTtjb25zdCBiPVtdO2xldCBjPTA7bGV0IGQ9MDtjb25zdCBlPXRoaXMudi5sZW5ndGg7Zm9yKDtkPGU7KXt2YXIgZj10aGlzLnZbZF07aWYoMTM9PT1mKXtjb25zdCBlPTEwPT09dGhpcy52W2QrMV07Zj1hP2U/ZCsyOmQrMTpkO2IucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYyxmKSkpO2Q9Yz1lP2QrMjpkKzF9ZWxzZSAxMD09PWY/KGY9YT9kKzE6ZCxiLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGMsZikpKSxkPWM9ZCsxKTpkKyt9YzxlJiZiLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGMsZSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wia2VlcGVuZHNcIl0sRGVmYXVsdHM6WyExXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGtlZXBlbmRzPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgYnl0ZXMsIGJyZWFraW5nIGF0IGxpbmUgYm91bmRhcmllcy5cXG5cXG5MaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHMgaXMgZ2l2ZW4gYW5kXFxudHJ1ZS5cIn0sXG5zdGFydHN3aXRoOnskbWV0aDpoKFwic3RhcnRzd2l0aFwiLChhLGIpPT5iLmxlbmd0aDw9YS5sZW5ndGgmJmIuZXZlcnkoKGIsYyk9PmI9PT1hW2NdKSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cXG5XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXFxuV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cXG5wcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBieXRlcyB0byB0cnkuXCJ9LHN0cmlwOnskbWV0aDpuKCEwLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBieXRlcz1Ob25lLCAvKVwiLCRkb2M6XCJTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LFxuc3dhcGNhc2U6eyRtZXRoOkQoYT0+QShhKT9hKzMyOnUoYSk/YS0zMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5zd2FwY2FzZSgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIHVwcGVyY2FzZSBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZFxcbnRvIGxvd2VyY2FzZSBBU0NJSSBhbmQgdmljZSB2ZXJzYS5cIn0sdGl0bGU6eyRtZXRoKCl7Y29uc3QgYT10aGlzLnYubGVuZ3RoLGI9bmV3IFVpbnQ4QXJyYXkoYSk7bGV0IGM9ITE7Zm9yKGxldCBkPTA7ZDxhO2QrKyl7Y29uc3QgYT10aGlzLnZbZF07QShhKT8oYltkXT1jP2ErMzI6YSxjPSEwKTp1KGEpPyhiW2RdPWM/YTphLTMyLGM9ITApOihiW2RdPWEsYz0hMSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi50aXRsZSgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiBCLCBpLmUuIEFTQ0lJIHdvcmRzIHN0YXJ0IHdpdGggdXBwZXJjYXNlXFxuY2hhcmFjdGVycywgYWxsIHJlbWFpbmluZyBjYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXJjYXNlLlwifSxcbnVwcGVyOnskbWV0aDpEKGE9PnUoYSk/YS0zMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi51cHBlcigpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIGFsbCBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuXCJ9LHpmaWxsOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7Y29uc3QgYj1hLXRoaXMudi5sZW5ndGg7aWYoMD49YilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtjb25zdCBjPW5ldyBVaW50OEFycmF5KGEpO2xldCBkPTAsZTtpZig0Mz09PXRoaXMudlswXXx8NDU9PT10aGlzLnZbMF0pY1swXT10aGlzLnZbMF0sZCsrO2MuZmlsbCg0OCxkLGQrYik7ZT1kO2ZvcihkKz1iO2Q8YTtkKyssZSsrKWNbZF09dGhpcy52W2VdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiQi56ZmlsbCh3aWR0aCkgLT4gY29weSBvZiBCXFxuXFxuUGFkIGEgbnVtZXJpYyBzdHJpbmcgQiB3aXRoIHplcm9zIG9uIHRoZSBsZWZ0LCB0byBmaWxsIGEgZmllbGRcXG5vZiB0aGUgc3BlY2lmaWVkIHdpZHRoLiAgQiBpcyBuZXZlciB0cnVuY2F0ZWQuXCJ9fSxjbGFzc21ldGhvZHM6e2Zyb21oZXg6eyRtZXRoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYil7Zm9yKGxldCBjPWY7YzxiO2MrPTIpe2xldCBiPWEuc3Vic3RyKGMsMik7aWYoIWQudGVzdChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibm9uLWhleGFkZWNpbWFsIG51bWJlciBmb3VuZCBpbiBmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uIFwiKyhjKzEpKTtlLnB1c2gocGFyc2VJbnQoYiwxNikpfX1pZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmcm9taGV4KCkgYXJndW1lbnQgbXVzdCBiZSBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7XG5hPWEuJGpzc3RyKCk7Y29uc3QgYz0vXFxzKy9nLGQ9L15bYWJjZGVmQUJDREVGMDEyMzQ1Njc4OV17Mn0kLyxlPVtdO2xldCBmPTAsZztmb3IoO251bGwhPT0oZz1jLmV4ZWMoYSkpOyliKGcuaW5kZXgpLGY9Yy5sYXN0SW5kZXg7YihhLmxlbmd0aCk7cmV0dXJuIG5ldyB0aGlzKGUpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHR5cGUsIHN0cmluZywgLylcIiwkZG9jOlwiQ3JlYXRlIGEgYnl0ZXMgb2JqZWN0IGZyb20gYSBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgbnVtYmVycy5cXG5cXG5TcGFjZXMgYmV0d2VlbiB0d28gbnVtYmVycyBhcmUgYWNjZXB0ZWQuXFxuRXhhbXBsZTogYnl0ZXMuZnJvbWhleCgnQjkgMDFFRicpIC0+IGInXFxcXFxcXFx4YjlcXFxcXFxcXHgwMVxcXFxcXFxceGVmJy5cIn19fSk7dmFyIEc9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiYnl0ZXNfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe2NvbnN0IGE9XG50aGlzLiRzZXFbdGhpcy4kaW5kZXgrK107aWYodm9pZCAwIT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5ieXRlc1wiLFNrLmJ1aWx0aW4uYnl0ZXMpfSxmdW5jdGlvbihtLHEsYSl7KGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIGMoKXt9dmFyIGw9U3RyaW5nLmZyb21DaGFyQ29kZSxoPXt9LnRvU3RyaW5nLGQ9aC5jYWxsKGEuU2hhcmVkQXJyYXlCdWZmZXIpLGc9aCgpLG49YS5VaW50OEFycmF5LGs9bnx8QXJyYXkscD1uP0FycmF5QnVmZmVyOmssdT1wLmlzVmlld3x8ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwibGVuZ3RoXCJpbiBhfSxBPWguY2FsbChwLnByb3RvdHlwZSk7cD1jLnByb3RvdHlwZTtcbnZhciB0PWEuVGV4dEVuY29kZXIsbT1uZXcgKG4/VWludDE2QXJyYXk6aykoMzIpO2IucHJvdG90eXBlLmRlY29kZT1mdW5jdGlvbihhKXtpZighdShhKSl7dmFyIGI9aC5jYWxsKGEpO2lmKGIhPT1BJiZiIT09ZCYmYiE9PWcpdGhyb3cgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ2RlY29kZScgb24gJ1RleHREZWNvZGVyJzogVGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7YT1uP25ldyBrKGEpOmF8fFtdfWZvcih2YXIgYz1iPVwiXCIsZT0wLGY9YS5sZW5ndGh8MCxwPWYtMzJ8MCxCLHQsdj0wLHE9MCxQLFE9MCxVPS0xO2U8Zjspe2ZvcihCPWU8PXA/MzI6Zi1lfDA7UTxCO2U9ZSsxfDAsUT1RKzF8MCl7dD1hW2VdJjI1NTtzd2l0Y2godD4+NCl7Y2FzZSAxNTpQPWFbZT1lKzF8MF0mMjU1O2lmKDIhPT1QPj42fHwyNDc8dCl7ZT1lLTF8MDticmVha312PSh0JjcpPDw2fFAmNjM7cT01O3Q9MjU2O2Nhc2UgMTQ6UD1cbmFbZT1lKzF8MF0mMjU1LHY8PD02LHZ8PSh0JjE1KTw8NnxQJjYzLHE9Mj09PVA+PjY/cSs0fDA6MjQsdD10KzI1NiY3Njg7Y2FzZSAxMzpjYXNlIDEyOlA9YVtlPWUrMXwwXSYyNTUsdjw8PTYsdnw9KHQmMzEpPDw2fFAmNjMscT1xKzd8MCxlPGYmJjI9PT1QPj42JiZ2Pj5xJiYxMTE0MTEyPnY/KHQ9dix2PXYtNjU1MzZ8MCwwPD12JiYoVT0odj4+MTApKzU1Mjk2fDAsdD0odiYxMDIzKSs1NjMyMHwwLDMxPlE/KG1bUV09VSxRPVErMXwwLFU9LTEpOihQPVUsVT10LHQ9UCkpKToodD4+PTgsZT1lLXQtMXwwLHQ9NjU1MzMpLHY9cT0wLEI9ZTw9cD8zMjpmLWV8MDtkZWZhdWx0Om1bUV09dDtjb250aW51ZTtjYXNlIDExOmNhc2UgMTA6Y2FzZSA5OmNhc2UgODp9bVtRXT02NTUzM31jKz1sKG1bMF0sbVsxXSxtWzJdLG1bM10sbVs0XSxtWzVdLG1bNl0sbVs3XSxtWzhdLG1bOV0sbVsxMF0sbVsxMV0sbVsxMl0sbVsxM10sbVsxNF0sbVsxNV0sbVsxNl0sbVsxN10sbVsxOF0sbVsxOV0sbVsyMF0sXG5tWzIxXSxtWzIyXSxtWzIzXSxtWzI0XSxtWzI1XSxtWzI2XSxtWzI3XSxtWzI4XSxtWzI5XSxtWzMwXSxtWzMxXSk7MzI+USYmKGM9Yy5zbGljZSgwLFEtMzJ8MCkpO2lmKGU8Zil7aWYobVswXT1VLFE9flU+Pj4zMSxVPS0xLGMubGVuZ3RoPGIubGVuZ3RoKWNvbnRpbnVlfWVsc2UtMSE9PVUmJihjKz1sKFUpKTtiKz1jO2M9XCJcIn1yZXR1cm4gYn07cC5lbmNvZGU9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hP1wiXCI6XCJcIithO3ZhciBiPWEubGVuZ3RofDAsYz1uZXcgaygoYjw8MSkrOHwwKSxkLGU9MCxmPSFuO2ZvcihkPTA7ZDxiO2Q9ZCsxfDAsZT1lKzF8MCl7dmFyIGc9YS5jaGFyQ29kZUF0KGQpfDA7aWYoMTI3Pj1nKWNbZV09ZztlbHNle2lmKDIwNDc+PWcpY1tlXT0xOTJ8Zz4+NjtlbHNle2E6e2lmKDU1Mjk2PD1nKWlmKDU2MzE5Pj1nKXt2YXIgaD1hLmNoYXJDb2RlQXQoZD1kKzF8MCl8MDtpZig1NjMyMDw9aCYmNTczNDM+PWgpe2c9KGc8PDEwKStoLTU2NjEzODg4fDA7aWYoNjU1MzU8XG5nKXtjW2VdPTI0MHxnPj4xODtjW2U9ZSsxfDBdPTEyOHxnPj4xMiY2MztjW2U9ZSsxfDBdPTEyOHxnPj42JjYzO2NbZT1lKzF8MF09MTI4fGcmNjM7Y29udGludWV9YnJlYWsgYX1nPTY1NTMzfWVsc2UgNTczNDM+PWcmJihnPTY1NTMzKTshZiYmZDw8MTxlJiZkPDwxPChlLTd8MCkmJihmPSEwLGg9bmV3IGsoMypiKSxoLnNldChjKSxjPWgpfWNbZV09MjI0fGc+PjEyO2NbZT1lKzF8MF09MTI4fGc+PjYmNjN9Y1tlPWUrMXwwXT0xMjh8ZyY2M319cmV0dXJuIG4/Yy5zdWJhcnJheSgwLGUpOmMuc2xpY2UoMCxlKX07dHx8KGEuVGV4dERlY29kZXI9YixhLlRleHRFbmNvZGVyPWMpfSkoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGE/XCJ1bmRlZmluZWRcIj09dHlwZW9mIHNlbGY/dGhpczpzZWxmOmEpfSkuY2FsbCh0aGlzLGEoMCkpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4udHVwbGU9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInR1cGxlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PVxuYT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSxcImJhZCBjYWxsIHRvIHR1cGxlLCB1c2UgJ25ldycgd2l0aCBhbiBBcnJheSBvZiBweXRob24gb2JqZWN0c1wiKTt0aGlzLnY9YTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGRvYzpcIkJ1aWx0LWluIGltbXV0YWJsZSBzZXF1ZW5jZS5cXG5cXG5JZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIHJldHVybnMgYW4gZW1wdHkgdHVwbGUuXFxuSWYgaXRlcmFibGUgaXMgc3BlY2lmaWVkIHRoZSB0dXBsZSBpcyBpbml0aWFsaXplZCBmcm9tIGl0ZXJhYmxlJ3MgaXRlbXMuXFxuXFxuSWYgdGhlIGFyZ3VtZW50IGlzIGEgdHVwbGUsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgb2JqZWN0LlwiLFxuJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIiguLi4pXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT10aGlzLnYubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3RoaXMuaW4kcmVwcj0hMTthPWEuam9pbihcIiwgXCIpOzE9PT10aGlzLnYubGVuZ3RoJiYoYSs9XCIsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCIoXCIrYStcIilcIil9LHRwJG5ldyhhLGIpe2lmKHRoaXMhPT1Tay5idWlsdGluLnR1cGxlLnByb3RvdHlwZSlyZXR1cm4gdGhpcy4kc3VidHlwZV9uZXcoYSxiKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwidHVwbGVcIixiKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJ0dXBsZVwiLGEsMCwxKTthPWFbMF07cmV0dXJuIHZvaWQgMD09PWE/bmV3IFNrLmJ1aWx0aW4udHVwbGUoW10pOmEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnR1cGxlP2E6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSxcbiEwKSxhPT5uZXcgU2suYnVpbHRpbi50dXBsZShhKSl9LHRwJGhhc2goKXtsZXQgYSxiPTM0MzAwMDgsZT0xMDAwMDAzO2NvbnN0IGY9dGhpcy52Lmxlbmd0aDtmb3IobGV0IGM9MDtjPGY7KytjKXthPVNrLmFic3RyLm9iamVjdEhhc2godGhpcy52W2NdKTtpZigtMT09PWEpcmV0dXJuLTE7Yj0oYl5hKSplO2UrPTgyNTIwK2YrZn1iKz05NzUzMTstMT09PWImJihiPS0yKTtyZXR1cm4gYnwwfSx0cCRyaWNoY29tcGFyZTpTay5nZW5lcmljLnNlcUNvbXBhcmUsdHAkaXRlcigpe3JldHVybiBuZXcgYSh0aGlzKX0sbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpOzA+YSYmKGE9dGhpcy52Lmxlbmd0aCthKTtpZigwPmF8fGE+PXRoaXMudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcInR1cGxlIGluZGV4IG91dCBvZiByYW5nZVwiKTtyZXR1cm4gdGhpcy52W2FdfWlmKGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zbGljZSl7Y29uc3QgYj1bXTthLnNzc2l0ZXIkKHRoaXMudi5sZW5ndGgsYT0+e2IucHVzaCh0aGlzLnZbYV0pfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR1cGxlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy52Lmxlbmd0aH0sc3EkcmVwZWF0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigxPT09YSYmdGhpcy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4udHVwbGUpcmV0dXJuIHRoaXM7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGE7YysrKWZvcihsZXQgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspYi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfSxzcSRjb25jYXQoYSl7aWYoIShhIGluc3RhbmNlb2ZcblNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGNvbmNhdGVuYXRlIHR1cGxlIChub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJykgdG8gdHVwbGVcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMudi5jb25jYXQoYS52KSl9LHNxJGNvbnRhaW5zKGEpe2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKWlmKGM9PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFwiRXFcIikpcmV0dXJuITA7cmV0dXJuITF9fSxwcm90bzp7JHN1YnR5cGVfbmV3KGEsYil7Yj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4udHVwbGUucHJvdG90eXBlLnRwJG5ldyhhKTtiLnY9YS52O3JldHVybiBifSxzayRhc2FycmF5KCl7cmV0dXJuIHRoaXMudi5zbGljZSgwKX19LG1ldGhvZHM6e19fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnYuc2xpY2UoMCkpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOm51bGx9LGluZGV4OnskbWV0aChhLGIsZSl7aWYodm9pZCAwIT09YiYmIVNrLm1pc2NldmFsLmlzSW5kZXgoYil8fHZvaWQgMCE9PWUmJiFTay5taXNjZXZhbC5pc0luZGV4KGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik7KHtzdGFydDpiLGVuZDplfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGIsZSkpO2NvbnN0IGM9dGhpcy52O2Zvcig7YjxlO2IrKylpZihjW2JdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbYl0sYSxcIkVxXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJ0dXBsZS5pbmRleCh4KTogeCBub3QgaW4gdHVwbGVcIik7fSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LFxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBzdGFydD0wLCBzdG9wPXN5cy5tYXhzaXplLCAvKVwiLCRkb2M6XCJSZXR1cm4gZmlyc3QgaW5kZXggb2YgdmFsdWUuXFxuXFxuUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifSxjb3VudDp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLnYubGVuZ3RoLGM9dGhpcy52O2xldCBmPTA7Zm9yKGxldCBlPTA7ZTxiOysrZSlpZihjW2VdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbZV0sYSxcIkVxXCIpKWYrPTE7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGRvYzpcIlJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWUuXCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4udHVwbGVcIixTay5idWlsdGluLnR1cGxlKTt2YXIgYT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJ0dXBsZV9pdGVyYXRvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEuc2skYXNhcnJheSgpfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSl7bGV0IGI9YS4kc2F2ZWRLZXlIYXNoO3JldHVybiB2b2lkIDAhPT1iP2I6Yj1Tay5hYnN0ci5vYmplY3RIYXNoKGEpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnNldChTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSl9ZnVuY3Rpb24gYihhLGIpe2ZvcihsZXQgYz1Tay5hYnN0ci5pdGVyKGEpLGQ9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1jLnRwJGl0ZXJuZXh0KCkpaWYoIVNrLmFic3RyLnNlcXVlbmNlQ29udGFpbnMoYixcbmQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGUoYSxiLGQpe2NvbnN0IGU9e2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe2lmKDEhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjcmVhdGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBpbnN0YW5jZXNcIik7dGhpcy5kaWN0PWE7dGhpcy5pbiRyZXByPSExfX07ZS5zbG90cz1PYmplY3QuYXNzaWduKGIsaCk7ZS5tZXRob2RzPXtpc2Rpc2pvaW50OnskbWV0aChhKXtjb25zdCBiPWModGhpcyk7cmV0dXJuIGIuaXNkaXNqb2ludC4kbWV0aC5jYWxsKGIsYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgdmlldyBhbmQgdGhlIGdpdmVuIGl0ZXJhYmxlIGhhdmUgYSBudWxsIGludGVyc2VjdGlvbi5cIn0sX19yZXZlcnNlZF9fOnskbWV0aDpkLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Qga2V5cy5cIn19O1xuZS5mbGFncz17c2skYWNjZXB0YWJsZV9hc19iYXNlOiExfTtcImRpY3RfdmFsdWVzXCI9PT1hJiYoZGVsZXRlIGUuc2xvdHMudHAkYXNfbnVtYmVyLGRlbGV0ZSBlLnNsb3RzLnRwJHJpY2hjb21wYXJlKTtyZXR1cm4gU2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhhLGUpfWZ1bmN0aW9uIGYoYSxiLGMpe3JldHVybiBTay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoYSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRvcmlnPWE7dGhpcy50cCRpdGVybmV4dD0oKT0+e3RoaXMuJHNlcT1hLiRpdGVtcygpO3RoaXMuJHZlcnNpb249YS4kdmVyc2lvbjtjJiYodGhpcy4kc2VxPXRoaXMuJHNlcS5yZXZlcnNlKCkpO3RoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQ7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoKX19LGl0ZXJuZXh0OmIsbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LFxuZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX0scHJvdG86e25leHQkaXRlbTpsfX0pfWZ1bmN0aW9uIGwoKXtpZih0aGlzLiR2ZXJzaW9uIT09dGhpcy4kb3JpZy4kdmVyc2lvbil7aWYodGhpcy4kbGVuIT09dGhpcy4kb3JpZy5nZXQkc2l6ZSgpKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcImRpY3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb25cIik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKFwiZGljdGlvbmFyeSBrZXlzIGNoYW5nZWQgZHVyaW5nIGl0ZXJhdGlvblwiKTt9cmV0dXJuIHRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXX1Tay5idWlsdGluLmRpY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImRpY3RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9W10pO1NrLmFzc2VydHMuYXNzZXJ0KEFycmF5LmlzQXJyYXkoYSkmJjA9PT1hLmxlbmd0aCUyJiZ0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0LFxuXCJiYWQgY2FsbCB0byBkaWN0IGNvbnN0cnVjdG9yXCIpO3RoaXMuc2l6ZT0wO3RoaXMuZW50cmllcz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuYnVja2V0cz17fTtmb3IobGV0IGI9MDtiPGEubGVuZ3RoO2IrPTIpdGhpcy5zZXQkaXRlbShhW2JdLGFbYisxXSk7dGhpcy5pbiRyZXByPSExO3RoaXMuJHZlcnNpb249MH0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkYXNfbnVtYmVyOiEwLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJGRvYzpcImRpY3QoKSAtPiBuZXcgZW1wdHkgZGljdGlvbmFyeVxcbmRpY3QobWFwcGluZykgLT4gbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgZnJvbSBhIG1hcHBpbmcgb2JqZWN0J3NcXG4gICAgKGtleSwgdmFsdWUpIHBhaXJzXFxuZGljdChpdGVyYWJsZSkgLT4gbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgYXMgaWYgdmlhOlxcbiAgICBkID0ge31cXG4gICAgZm9yIGssIHYgaW4gaXRlcmFibGU6XFxuICAgICAgICBkW2tdID0gdlxcbmRpY3QoKiprd2FyZ3MpIC0+IG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIHdpdGggdGhlIG5hbWU9dmFsdWUgcGFpcnNcXG4gICAgaW4gdGhlIGtleXdvcmQgYXJndW1lbnQgbGlzdC4gIEZvciBleGFtcGxlOiAgZGljdChvbmU9MSwgdHdvPTIpXCIsXG4kcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiey4uLn1cIik7dGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy4kaXRlbXMoKS5tYXAoKFthLGJdKT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIjogXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihiKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJ7XCIrYS5qb2luKFwiLCBcIikrXCJ9XCIpfSx0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGIpe3JldHVybiB0aGlzLnVwZGF0ZSRjb21tb24oYSxiLFwiZGljdFwiKX0sdHAkaXRlcigpe3JldHVybiBuZXcgayh0aGlzKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtsZXQgYztpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpfHxcIkVxXCIhPT1iJiZcIk5vdEVxXCIhPT1iKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtpZihhPT09dGhpcyljPSEwO2Vsc2UgaWYodGhpcy5zaXplIT09XG5hLnNpemUpYz0hMTtlbHNle2xldCBiO2M9dGhpcy4kaXRlbXMoKS5ldmVyeSgoW2MsZF0pPT57Yj1hLm1wJGxvb2t1cChjKTtyZXR1cm4gdm9pZCAwIT09YiYmKGI9PT1kfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZCxiLFwiRXFcIikpfSl9cmV0dXJuXCJFcVwiPT09Yj9jOiFjfSxuYiRvcihhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBiPXRoaXMuZGljdCRjb3B5KCk7Yi5kaWN0JG1lcmdlKGEpO3JldHVybiBifSxuYiRyZWZsZWN0ZWRfb3IoYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7YT1hLmRpY3QkY29weSgpO2EuZGljdCRtZXJnZSh0aGlzKTtyZXR1cm4gYX0sbmIkaW5wbGFjZV9vcihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy51cGRhdGUkb25lYXJnKGEpLFxuKCk9PnRoaXMpfSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy5nZXQkc2l6ZSgpfSxzcSRjb250YWlucyhhKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5tcCRsb29rdXAoYSl9LG1wJHN1YnNjcmlwdChhLGIpe3ZhciBjPXRoaXMubXAkbG9va3VwKGEpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7Yz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKHRoaXMsU2suYnVpbHRpbi5zdHIuJG1pc3NpbmcpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGE9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW2FdKSxiP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sbXAkYXNzX3N1YnNjcmlwdChhLGIpe2lmKHZvaWQgMD09PWIpe2lmKHZvaWQgMD09PXRoaXMucG9wJGl0ZW0oYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7fWVsc2UgdGhpcy5zZXQkaXRlbShhLGIpfX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgQSh0aGlzKX0sXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBkaWN0IGtleXMuXCJ9LGdldDp7JG1ldGgoYSxiKXtyZXR1cm4gdGhpcy5tcCRsb29rdXAoYSl8fGJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgdmFsdWUgZm9yIGtleSBpZiBrZXkgaXMgaW4gdGhlIGRpY3Rpb25hcnksIGVsc2UgZGVmYXVsdC5cIn0sc2V0ZGVmYXVsdDp7JG1ldGgoYixjKXtsZXQgZDtjb25zdCBlPWEoYik7ZD1cInN0cmluZ1wiPT09dHlwZW9mIGU/dGhpcy5lbnRyaWVzW2VdOnRoaXMuZ2V0JGJ1Y2tldF9pdGVtKGIsZSk7aWYodm9pZCAwIT09ZClyZXR1cm4gZFsxXTtjPWN8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtcInN0cmluZ1wiPT09dHlwZW9mIGU/dGhpcy5lbnRyaWVzW2VdPVtiLGNdOlxudGhpcy5zZXQkYnVja2V0X2l0ZW0oYixjLGUpO3RoaXMuc2l6ZSsrO3RoaXMuJHZlcnNpb24rKztyZXR1cm4gY30sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUsIC8pXCIsJGRvYzpcIkluc2VydCBrZXkgd2l0aCBhIHZhbHVlIG9mIGRlZmF1bHQgaWYga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS5cXG5cXG5SZXR1cm4gdGhlIHZhbHVlIGZvciBrZXkgaWYga2V5IGlzIGluIHRoZSBkaWN0aW9uYXJ5LCBlbHNlIGRlZmF1bHQuXCJ9LHBvcDp7JG1ldGgoYSxiKXtjb25zdCBjPXRoaXMucG9wJGl0ZW0oYSk7aWYodm9pZCAwIT09YylyZXR1cm4gY1sxXTtpZih2b2lkIDAhPT1iKXJldHVybiBiO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS5cXG5JZiBrZXkgaXMgbm90IGZvdW5kLCBkIGlzIHJldHVybmVkIGlmIGdpdmVuLCBvdGhlcndpc2UgS2V5RXJyb3IgaXMgcmFpc2VkXCJ9LFxucG9waXRlbTp7JG1ldGgoKXtjb25zdCBhPXRoaXMuZ2V0JHNpemUoKTtpZigwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihcInBvcGl0ZW0oKTogZGljdGlvbmFyeSBpcyBlbXB0eVwiKTtjb25zdCBbYixjXT10aGlzLiRpdGVtcygpW2EtMV07dGhpcy5wb3AkaXRlbShiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2IsY10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5wb3BpdGVtKCkgLT4gKGssIHYpLCByZW1vdmUgYW5kIHJldHVybiBzb21lIChrZXksIHZhbHVlKSBwYWlyIGFzIGFcXG4yLXR1cGxlOyBidXQgcmFpc2UgS2V5RXJyb3IgaWYgRCBpcyBlbXB0eS5cIn0sa2V5czp7JG1ldGgoKXtyZXR1cm4gbmV3IGQodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmtleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBrZXlzXCJ9LGl0ZW1zOnskbWV0aCgpe3JldHVybiBuZXcgbih0aGlzKX0sXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5pdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zXCJ9LHZhbHVlczp7JG1ldGgoKXtyZXR1cm4gbmV3IGcodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn0sdXBkYXRlOnskbWV0aChhLGIpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZSRjb21tb24oYSxiLFwidXBkYXRlXCIpLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnVwZGF0ZShbRSwgXSoqRikgLT4gTm9uZS4gIFVwZGF0ZSBEIGZyb20gZGljdC9pdGVyYWJsZSBFIGFuZCBGLlxcbklmIEUgaXMgcHJlc2VudCBhbmQgaGFzIGEgLmtleXMoKSBtZXRob2QsIHRoZW4gZG9lczogIGZvciBrIGluIEU6IERba10gPSBFW2tdXFxuSWYgRSBpcyBwcmVzZW50IGFuZCBsYWNrcyBhIC5rZXlzKCkgbWV0aG9kLCB0aGVuIGRvZXM6ICBmb3IgaywgdiBpbiBFOiBEW2tdID0gdlxcbkluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiBmb3IgayBpbiBGOiAgRFtrXSA9IEZba11cIn0sXG5jbGVhcjp7JG1ldGgoKXt0aGlzLnNpemU9MDt0aGlzLiR2ZXJzaW9uKys7dGhpcy5lbnRyaWVzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5idWNrZXRzPXt9fSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5jbGVhcigpIC0+IE5vbmUuICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gRC5cIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gdGhpcy5kaWN0JGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIERcIn19LGNsYXNzbWV0aG9kczp7ZnJvbWtleXM6eyRtZXRoOmZ1bmN0aW9uKGEsYil7Yj1ifHxTay5idWlsdGluLm5vbmUubm9uZSQ7bGV0IGM9dGhpcz09PVNrLmJ1aWx0aW4uZGljdD9uZXcgdGhpczp0aGlzLnRwJGNhbGwoW10sW10pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGQ9PntjPWQ7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT5cbmMubXAkYXNzX3N1YnNjcmlwdChhLGIsITApKX0sKCk9PmMpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCR0eXBlLCBpdGVyYWJsZSwgdmFsdWU9Tm9uZSwgLylcIiwkZG9jOlwiQ3JlYXRlIGEgbmV3IGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gaXRlcmFibGUgYW5kIHZhbHVlcyBzZXQgdG8gdmFsdWUuXCJ9fSxwcm90bzp7cXVpY2skbG9va3VwOmZ1bmN0aW9uKGEpe2E9dGhpcy5lbnRyaWVzW2EuJHNhdmVkS2V5SGFzaF07aWYodm9pZCAwIT09YSlyZXR1cm4gYVsxXX0sbXAkbG9va3VwOmZ1bmN0aW9uKGIpe2NvbnN0IGM9YShiKTtiPVwic3RyaW5nXCI9PT10eXBlb2YgYz90aGlzLmVudHJpZXNbY106dGhpcy5nZXQkYnVja2V0X2l0ZW0oYixjKTtpZih2b2lkIDAhPT1iKXJldHVybiBiWzFdfSxnZXQkc2l6ZSgpe3JldHVybiB0aGlzLnNpemV9LHNrJGFzYXJyYXkoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmVudHJpZXMpLm1hcChhPT5hWzBdKX0sdXBkYXRlJGNvbW1vbjpmdW5jdGlvbihhLFxuYixjKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oYyxhLDAsMSk7YT1hWzBdO2xldCBkO3ZvaWQgMCE9PWEmJihkPXRoaXMudXBkYXRlJG9uZWFyZyhhKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGQsKCk9PntpZihiKWZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9Mil0aGlzLnNldCRpdGVtKG5ldyBTay5idWlsdGluLnN0cihiW2FdKSxiW2ErMV0pfSl9LHVwZGF0ZSRvbmVhcmcoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3R8fHZvaWQgMCE9PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyk/dGhpcy5kaWN0JG1lcmdlKGEpOnRoaXMuZGljdCRtZXJnZV9zZXEoYSl9LGRpY3QkY29weSgpe2NvbnN0IGE9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7YS5zaXplPXRoaXMuc2l6ZTt2YXIgYj1PYmplY3QuZW50cmllcyh0aGlzLmVudHJpZXMpO2Zvcih2YXIgYyBpbiBiKXt2YXIgZD1iW2NdWzFdO2EuZW50cmllc1tiW2NdWzBdXT1bZFswXSxcbmRbMV1dfWZvcihsZXQgZSBpbiB0aGlzLmJ1Y2tldHMpZm9yKGM9dGhpcy5idWNrZXRzW2VdLGEuYnVja2V0c1tlXT1iPVtdLGQ9MDtkPGMubGVuZ3RoO2QrKyliLnB1c2goYS5lbnRyaWVzW1wiI1wiK2UrXCJfXCIrZF0pO3JldHVybiBhfSwkaXRlbXMoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmVudHJpZXMpfSxzZXQkaXRlbTpmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YShiKTtsZXQgZTtcInN0cmluZ1wiPT09dHlwZW9mIGQ/KGU9dGhpcy5lbnRyaWVzW2RdLHZvaWQgMD09PWU/KHRoaXMuZW50cmllc1tkXT1bYixjXSx0aGlzLnNpemUrKyx0aGlzLiR2ZXJzaW9uKyspOmVbMV09Yyk6KGU9dGhpcy5nZXQkYnVja2V0X2l0ZW0oYixkKSx2b2lkIDA9PT1lPyh0aGlzLnNldCRidWNrZXRfaXRlbShiLGMsZCksdGhpcy5zaXplKyssdGhpcy4kdmVyc2lvbisrKTplWzFdPWMpfSxnZXQkYnVja2V0X2l0ZW06ZnVuY3Rpb24oYSxiKXtiPXRoaXMuYnVja2V0c1tiXTtpZih2b2lkIDAhPT1iKWZvcihsZXQgZD1cbjA7ZDxiLmxlbmd0aDtkKyspe3ZhciBjPWJbZF07aWYodm9pZCAwIT09YyYmKGNbMF09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjWzBdLFwiRXFcIikpKXJldHVybiBjfX0scG9wJGJ1Y2tldF9pdGVtOmZ1bmN0aW9uKGEsYil7Y29uc3QgYz10aGlzLmJ1Y2tldHNbYl07bGV0IGQ7aWYodm9pZCAwIT09Yylmb3IobGV0IGU9MDtlPGMubGVuZ3RoO2UrKylpZihkPWNbZV0sdm9pZCAwIT09ZCYmKGRbMF09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxkWzBdLFwiRXFcIikpKXJldHVybiBkZWxldGUgdGhpcy5lbnRyaWVzW1wiI1wiK2IrXCJfXCIrZV0sY1tlXT12b2lkIDAsYy5ldmVyeShhPT52b2lkIDA9PT1hKSYmZGVsZXRlIHRoaXMuYnVja2V0c1tiXSxkfSxzZXQkYnVja2V0X2l0ZW06ZnVuY3Rpb24oYSxiLGMpe2xldCBkPXRoaXMuYnVja2V0c1tjXTthPVthLGJdO3ZvaWQgMD09PWQ/KHRoaXMuYnVja2V0c1tjXT1bYV0sYz1cIiNcIitjK1wiXzBcIik6KGI9ZC5pbmRleE9mKHZvaWQgMCksXG4tMSE9PWI/KGM9XCIjXCIrYytcIl9cIitiLGRbYl09YSk6KGM9XCIjXCIrYytcIl9cIitkLmxlbmd0aCxkLnB1c2goYSkpKTt0aGlzLmVudHJpZXNbY109YX0scG9wJGl0ZW06ZnVuY3Rpb24oYil7Y29uc3QgYz1hKGIpO1wic3RyaW5nXCI9PT10eXBlb2YgYz8oYj10aGlzLmVudHJpZXNbY10sZGVsZXRlIHRoaXMuZW50cmllc1tjXSk6Yj10aGlzLnBvcCRidWNrZXRfaXRlbShiLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIHRoaXMuc2l6ZS0tLHRoaXMuJHZlcnNpb24rKyxifSxkaWN0JG1lcmdlOmZ1bmN0aW9uKGEpe2lmKGEudHAkaXRlcj09PVNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkaXRlcil7dmFyIGI9YS50cCRpdGVyKCk7Zm9yKGxldCBjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKXtjb25zdCBiPWEubXAkc3Vic2NyaXB0KGMpO3RoaXMuc2V0JGl0ZW0oYyxiKX19ZWxzZSByZXR1cm4gYj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGtleXMpLFxuU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGIsW10pLGI9PlNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihiKSxiPT5Tay5taXNjZXZhbC5jaGFpbihhLm1wJHN1YnNjcmlwdChiLCEwKSxhPT57dGhpcy5zZXQkaXRlbShiLGEpfSkpKX0sZGljdCRtZXJnZV9zZXE6ZnVuY3Rpb24oYSl7bGV0IGI9MDtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PntpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjb252ZXJ0IGRpY3Rpb25hcnkgdXBkYXRlIHNlcXVlbmNlIGVsZW1lbnQgI1wiK2IrXCIgdG8gYSBzZXF1ZW5jZVwiKTthPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpO2lmKDIhPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZGljdGlvbmFyeSB1cGRhdGUgc2VxdWVuY2UgZWxlbWVudCAjXCIrXG5iK1wiIGhhcyBsZW5ndGggXCIrYS5sZW5ndGgrXCI7IDIgaXMgcmVxdWlyZWRcIik7dGhpcy5zZXQkaXRlbShhWzBdLGFbMV0pO2IrK30pfX19KTtjb25zdCBoPXt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19udW1iZXI6ITAsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiLi4uXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZSh0aGlzKTthPWEubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3RoaXMuaW4kcmVwcj0hMTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKFtcIithLmpvaW4oXCIsIFwiKStcIl0pXCIpfSx0cCRyaWNoY29tcGFyZShhLGMpe2lmKCEoU2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8YSBpbnN0YW5jZW9mIGR8fFxuYSBpbnN0YW5jZW9mIG4pKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBlPXRoaXMuc3EkbGVuZ3RoKCksZj1hLnNxJGxlbmd0aCgpO3N3aXRjaChjKXtjYXNlIFwiTm90RXFcIjpjYXNlIFwiRXFcIjpsZXQgZDt0aGlzPT09YT9kPSEwOmU9PT1mJiYoZD1iKHRoaXMsYSkpO3JldHVyblwiTm90RXFcIj09PWM/IWQ6ZDtjYXNlIFwiTHRcIjpyZXR1cm4gZTxmJiZiKHRoaXMsYSk7Y2FzZSBcIkx0RVwiOnJldHVybiBlPD1mJiZiKHRoaXMsYSk7Y2FzZSBcIkd0XCI6cmV0dXJuIGU+ZiYmYihhLHRoaXMpO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZT49ZiYmYihhLHRoaXMpfX0sbmIkc3VidHJhY3QoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmRpZmZlcmVuY2UuJG1ldGguY2FsbChiLGEpfSxuYiRhbmQoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmludGVyc2VjdGlvbi4kbWV0aC5jYWxsKGIsYSl9LG5iJG9yKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi51bmlvbi4kbWV0aC5jYWxsKGIsXG5hKX0sbmIkeG9yKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi5zeW1tZXRyaWNfZGlmZmVyZW5jZS4kbWV0aC5jYWxsKGIsYSl9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmRpY3QuZ2V0JHNpemUoKX19O3ZhciBkPWUoXCJkaWN0X2tleXNcIix7c3EkY29udGFpbnMoYSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZGljdC5tcCRsb29rdXAoYSl9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGsodGhpcy5kaWN0KX19LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBKHRoaXMuZGljdCl9KSxnPWUoXCJkaWN0X3ZhbHVlc1wiLHt0cCRpdGVyKCl7cmV0dXJuIG5ldyB1KHRoaXMuZGljdCl9fSxmdW5jdGlvbigpe3JldHVybiBuZXcgdih0aGlzLmRpY3QpfSksbj1lKFwiZGljdF9pdGVtc1wiLHtzcSRjb250YWlucyhhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlJiYyPT09YS5zcSRsZW5ndGgoKSkpcmV0dXJuITE7dmFyIGI9YS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50XygwKSk7XG5hPWEubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLmludF8oMSkpO2I9dGhpcy5kaWN0Lm1wJGxvb2t1cChiKTtyZXR1cm4gdm9pZCAwPT09Yj8hMTpiPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsYSxcIkVxXCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBwKHRoaXMuZGljdCl9fSxmdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLmRpY3QpfSksaz1mKFwiZGljdF9rZXlpdGVyYXRvclwiLGZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLm5leHQkaXRlbSgpO3JldHVybiBhJiZhWzBdfSkscD1mKFwiZGljdF9pdGVtaXRlcmF0b3JcIixmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5uZXh0JGl0ZW0oKTtyZXR1cm4gYSYmbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2FbMF0sYVsxXV0pfSksdT1mKFwiZGljdF92YWx1ZWl0ZXJhdG9yXCIsZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMubmV4dCRpdGVtKCk7cmV0dXJuIGEmJmFbMV19KSxBPWYoXCJkaWN0X3JldmVyc2VrZXlpdGVyYXRvclwiLGsucHJvdG90eXBlLnRwJGl0ZXJuZXh0LFxuITApLHQ9ZihcImRpY3RfcmV2ZXJzZWl0ZW1pdGVyYXRvclwiLHAucHJvdG90eXBlLnRwJGl0ZXJuZXh0LCEwKSx2PWYoXCJkaWN0X3JldmVyc2V2YWx1ZWl0ZXJhdG9yXCIsdS5wcm90b3R5cGUudHAkaXRlcm5leHQsITApO1NrLmJ1aWx0aW4uZGljdC5weTIkbWV0aG9kcz17aGFzX2tleTp7JG5hbWU6XCJoYXNfa2V5XCIsJGZsYWdzOntPbmVBcmc6ITB9LCRtZXRoKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMuc3EkY29udGFpbnMoYSkpfSwkZG9jOlwiRC5oYXNfa2V5KGspIC0+IFRydWUgaWYgRCBoYXMgYSBrZXkgaywgZWxzZSBGYWxzZVwifSxrZXlzOnskbmFtZTpcImtleXNcIiwkbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMuc2skYXNhcnJheSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQua2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGtleXNcIn0saXRlbXM6eyRuYW1lOlwiaXRlbXNcIixcbiRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kaXRlbXMoKS5tYXAoKFthLGJdKT0+bmV3IFNrLmJ1aWx0aW4udHVwbGUoW2EsYl0pKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELml0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3MgaXRlbXNcIn0sdmFsdWVzOnskbmFtZTpcInZhbHVlc1wiLCRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kaXRlbXMoKS5tYXAoKFssYV0pPT5hKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn19fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhhLHtlbnRyaWVzOntnZXQ6KCk9Pntjb25zdCBhPU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2IsXG5jXSk9PntiPVNrLnVuZml4UmVzZXJ2ZWQoYik7Yi5pbmNsdWRlcyhcIiRcIil8fChiPW5ldyBTay5idWlsdGluLnN0cihiKSxhW2IuJHNhdmVkS2V5SGFzaF09W2IsY10pfSk7cmV0dXJuIGF9LGNvbmZpZ3VyYWJsZTohMH0sc2l6ZTp7Z2V0OigpPT5PYmplY3Qua2V5cyhiKS5tYXAoYT0+U2sudW5maXhSZXNlcnZlZChhKSkuZmlsdGVyKGE9PiFhLmluY2x1ZGVzKFwiJFwiKSkubGVuZ3RoLGNvbmZpZ3VyYWJsZTohMH19KX1Tay5idWlsdGluLm1hcHBpbmdwcm94eT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwibWFwcGluZ3Byb3h5XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGMpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSxcImJhZCBjYWxsIHRvIG1hcHBpbmcgcHJveHksIHVzZSAnbmV3J1wiKTt0aGlzLm1hcHBpbmc9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7dm9pZCAwIT09YyYmYSh0aGlzLm1hcHBpbmcsYyl9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cixcbnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1hcHBpbmdwcm94eVwiLGIpO1NrLmFic3RyLmNoZWNrT25lQXJnKFwibWFwcGluZ3Byb3h5XCIsYSxiKTthPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm1hcHBpbmdwcm94eSgpIGFyZ3VtZW50IG11c3QgYmUgYSBtYXBwaW5nLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2I9bmV3IFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5O2IubWFwcGluZz1hO3JldHVybiBifSx0cCRyaWNoY29tcGFyZShhLGIpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5tYXBwaW5nLGEsYil9LHRwJHN0cigpe3JldHVybiB0aGlzLm1hcHBpbmcudHAkc3RyKCl9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIm1hcHBpbmdwcm94eShcIitcblNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5tYXBwaW5nKStcIilcIil9LG1wJHN1YnNjcmlwdChhLGIpe3JldHVybiB0aGlzLm1hcHBpbmcubXAkc3Vic2NyaXB0KGEsYil9LHNxJGNvbnRhaW5zKGEpe3JldHVybiB0aGlzLm1hcHBpbmcuc3EkY29udGFpbnMoYSl9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLm1hcHBpbmcuc3EkbGVuZ3RoKCl9LHRwJGl0ZXIoKXtyZXR1cm4gdGhpcy5tYXBwaW5nLnRwJGl0ZXIoKX0sdHAkYXNfbnVtYmVyOiEwLG5iJG9yKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSYmKGE9YS5tYXBwaW5nKTtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy5tYXBwaW5nLGEsXCJCaXRPclwiKX0sbmIkcmVmbGVjdGVkX29yKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSYmKGE9YS5tYXBwaW5nKTtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYSx0aGlzLm1hcHBpbmcsXCJCaXRPclwiKX0sbmIkaW5wbGFjZV9vcihhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInfD0nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgXCIrXG5Tay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIjsgdXNlICd8JyBpbnN0ZWFkXCIpO319LG1ldGhvZHM6e2dldDp7JG1ldGgoYSxiKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGdldCksYSxiKX0sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5nZXQoa1ssZF0pIC0+IERba10gaWYgayBpbiBELCBlbHNlIGQuICBkIGRlZmF1bHRzIHRvIE5vbmUuXCJ9LGtleXM6eyRtZXRoKCl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLm1hcHBpbmcudHAkZ2V0YXR0cih0aGlzLnN0ciRrZXlzKSxbXSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmtleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBrZXlzXCJ9LGl0ZW1zOnskbWV0aCgpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5tYXBwaW5nLnRwJGdldGF0dHIodGhpcy5zdHIkaXRlbXMpLFxuW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5pdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zXCJ9LHZhbHVlczp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJHZhbHVlcyksW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC52YWx1ZXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGNvcHkpLFtdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIERcIn19LHByb3RvOntzdHIkZ2V0Om5ldyBTay5idWlsdGluLnN0cihcImdldFwiKSxcbnN0ciRjb3B5Om5ldyBTay5idWlsdGluLnN0cihcImNvcHlcIiksc3RyJGtleXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFwia2V5c1wiKSxzdHIkaXRlbXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiaXRlbXNcIiksc3RyJHZhbHVlczpuZXcgU2suYnVpbHRpbi5zdHIoXCJ2YWx1ZXNcIiksbXAkbG9va3VwKGEpe3JldHVybiB0aGlzLm1hcHBpbmcubXAkbG9va3VwKGEpfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnByb3BlcnR5PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJwcm9wZXJ0eVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYixlKXt0aGlzLnByb3AkZ2V0PWF8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3Akc2V0PWN8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3AkZGVsPWJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3AkZG9jPWV8fGEmJmEuJGRvY3x8U2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbnNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe2E9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJwcm9wZXJ0eVwiLFtcImZnZXRcIixcImZzZXRcIixcImZkZWxcIixcImRvY1wiXSxhLGMsQXJyYXkoNCkuZmlsbChTay5idWlsdGluLm5vbmUubm9uZSQpKTt0aGlzLnByb3AkZ2V0PWFbMF07dGhpcy5wcm9wJHNldD1hWzFdO3RoaXMucHJvcCRkZWw9YVsyXTtTay5idWlsdGluLmNoZWNrTm9uZShhWzNdKT9Tay5idWlsdGluLmNoZWNrTm9uZShhWzBdKXx8KHRoaXMucHJvcCRkb2M9YVswXS4kZG9jfHxhWzNdKTp0aGlzLnByb3AkZG9jPWFbM119LHRwJGRvYzpcIlByb3BlcnR5IGF0dHJpYnV0ZS5cXG5cXG4gIGZnZXRcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZ2V0dGluZyBhbiBhdHRyaWJ1dGUgdmFsdWVcXG4gIGZzZXRcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3Igc2V0dGluZyBhbiBhdHRyaWJ1dGUgdmFsdWVcXG4gIGZkZWxcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZGVsJ2luZyBhbiBhdHRyaWJ1dGVcXG4gIGRvY1xcbiAgICBkb2NzdHJpbmdcXG5cXG5UeXBpY2FsIHVzZSBpcyB0byBkZWZpbmUgYSBtYW5hZ2VkIGF0dHJpYnV0ZSB4OlxcblxcbmNsYXNzIEMob2JqZWN0KTpcXG4gICAgZGVmIGdldHgoc2VsZik6IHJldHVybiBzZWxmLl94XFxuICAgIGRlZiBzZXR4KHNlbGYsIHZhbHVlKTogc2VsZi5feCA9IHZhbHVlXFxuICAgIGRlZiBkZWx4KHNlbGYpOiBkZWwgc2VsZi5feFxcbiAgICB4ID0gcHJvcGVydHkoZ2V0eCwgc2V0eCwgZGVseCwgJ0knbSB0aGUgJ3gnIHByb3BlcnR5LicpXFxuXFxuRGVjb3JhdG9ycyBtYWtlIGRlZmluaW5nIG5ldyBwcm9wZXJ0aWVzIG9yIG1vZGlmeWluZyBleGlzdGluZyBvbmVzIGVhc3k6XFxuXFxuY2xhc3MgQyhvYmplY3QpOlxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHgoc2VsZik6XFxuICAgICAgICAnSSBhbSB0aGUgJ3gnIHByb3BlcnR5LidcXG4gICAgICAgIHJldHVybiBzZWxmLl94XFxuICAgIEB4LnNldHRlclxcbiAgICBkZWYgeChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBzZWxmLl94ID0gdmFsdWVcXG4gICAgQHguZGVsZXRlclxcbiAgICBkZWYgeChzZWxmKTpcXG4gICAgICAgIGRlbCBzZWxmLl94XCIsXG50cCRkZXNjcl9nZXQoYSxjKXtpZihudWxsPT09YSlyZXR1cm4gdGhpcztpZih2b2lkIDA9PT10aGlzLnByb3AkZ2V0KXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwidW5yZWFkYWJsZSBhdHRyaWJ1dGVcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLnByb3AkZ2V0LFthXSl9LHRwJGRlc2NyX3NldChhLGMpe2xldCBiO2I9bnVsbD09Yz90aGlzLnByb3AkZGVsOnRoaXMucHJvcCRzZXQ7aWYoU2suYnVpbHRpbi5jaGVja05vbmUoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCJjYW4ndCBcIisobnVsbD09Yz9cImRlbGV0ZVwiOlwic2V0XCIpK1wiIGF0dHJpYnV0ZVwiKTtpZighYi50cCRjYWxsKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShiKStcIicgaXMgbm90IGNhbGxhYmxlXCIpO3JldHVybiBudWxsPT1jP2IudHAkY2FsbChbYV0pOmIudHAkY2FsbChbYSxjXSl9fSxcbm1ldGhvZHM6e2dldHRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KGEsdGhpcy5wcm9wJHNldCx0aGlzLnByb3AkZGVsLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19LHNldHRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KHRoaXMucHJvcCRnZXQsYSx0aGlzLnByb3AkZGVsLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19LGRlbGV0ZXI6eyRtZXRoKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5wcm9wZXJ0eSh0aGlzLnByb3AkZ2V0LHRoaXMucHJvcCRzZXQsYSx0aGlzLnByb3AkZG9jKX0sJGZsYWdzOntPbmVBcmc6ITB9fX0sZ2V0c2V0czp7ZmdldDp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZ2V0fX0sZnNldDp7JGdldCgpe3JldHVybiB0aGlzLnByb3Akc2V0fX0sZmRlbDp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZGVsfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZG9jfSxcbiRzZXQoYSl7dGhpcy5wcm9wJGRvYz1hPWF8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fX0pO1NrLmJ1aWx0aW4uY2xhc3NtZXRob2Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImNsYXNzbWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuY20kY2FsbGFibGU9YTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3R9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJjbGFzc21ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcImNsYXNzbWV0aG9kXCIsYSwxLDEpO3RoaXMuY20kY2FsbGFibGU9YVswXX0sdHAkZG9jOlwiY2xhc3NtZXRob2QoZnVuY3Rpb24pIC0+IG1ldGhvZFxcblxcbkNvbnZlcnQgYSBmdW5jdGlvbiB0byBiZSBhIGNsYXNzIG1ldGhvZC5cXG5cXG5BIGNsYXNzIG1ldGhvZCByZWNlaXZlcyB0aGUgY2xhc3MgYXMgaW1wbGljaXQgZmlyc3QgYXJndW1lbnQsXFxuanVzdCBsaWtlIGFuIGluc3RhbmNlIG1ldGhvZCByZWNlaXZlcyB0aGUgaW5zdGFuY2UuXFxuVG8gZGVjbGFyZSBhIGNsYXNzIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206XFxuXFxuICBjbGFzcyBDOlxcbiAgICAgIEBjbGFzc21ldGhvZFxcbiAgICAgIGRlZiBmKGNscywgYXJnMSwgYXJnMiwgLi4uKTpcXG4gICAgICAgICAgLi4uXFxuXFxuSXQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgb24gdGhlIGNsYXNzIChlLmcuIEMuZigpKSBvciBvbiBhbiBpbnN0YW5jZVxcbihlLmcuIEMoKS5mKCkpLiAgVGhlIGluc3RhbmNlIGlzIGlnbm9yZWQgZXhjZXB0IGZvciBpdHMgY2xhc3MuXFxuSWYgYSBjbGFzcyBtZXRob2QgaXMgY2FsbGVkIGZvciBhIGRlcml2ZWQgY2xhc3MsIHRoZSBkZXJpdmVkIGNsYXNzXFxub2JqZWN0IGlzIHBhc3NlZCBhcyB0aGUgaW1wbGllZCBmaXJzdCBhcmd1bWVudC5cXG5cXG5DbGFzcyBtZXRob2RzIGFyZSBkaWZmZXJlbnQgdGhhbiBDKysgb3IgSmF2YSBzdGF0aWMgbWV0aG9kcy5cXG5JZiB5b3Ugd2FudCB0aG9zZSwgc2VlIHRoZSBzdGF0aWNtZXRob2QgYnVpbHRpbi5cIixcbnRwJGRlc2NyX2dldChhLGMpe2NvbnN0IGI9dGhpcy5jbSRjYWxsYWJsZTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInVuaW5pdGlhbGl6ZWQgY2xhc3NtZXRob2Qgb2JqZWN0XCIpO3ZvaWQgMD09PWMmJihjPWEub2IkdHlwZSk7cmV0dXJuKGE9Yi50cCRkZXNjcl9nZXQpP2EuY2FsbChiLGMpOm5ldyBTay5idWlsdGluLm1ldGhvZChiLGMpfX0sZ2V0c2V0czp7X19mdW5jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5jbSRjYWxsYWJsZX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH19KTtTay5idWlsdGluLnN0YXRpY21ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3RhdGljbWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuc20kY2FsbGFibGU9YTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3R9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsXG50cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInN0YXRpY21ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInN0YXRpY21ldGhvZFwiLGEsMSwxKTt0aGlzLnNtJGNhbGxhYmxlPWFbMF19LHRwJGRvYzpcInN0YXRpY21ldGhvZChmdW5jdGlvbikgLT4gbWV0aG9kXFxuXFxuQ29udmVydCBhIGZ1bmN0aW9uIHRvIGJlIGEgc3RhdGljIG1ldGhvZC5cXG5cXG5BIHN0YXRpYyBtZXRob2QgZG9lcyBub3QgcmVjZWl2ZSBhbiBpbXBsaWNpdCBmaXJzdCBhcmd1bWVudC5cXG5UbyBkZWNsYXJlIGEgc3RhdGljIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206XFxuXFxuICAgICBjbGFzcyBDOlxcbiAgICAgICAgIEBzdGF0aWNtZXRob2RcXG4gICAgICAgICBkZWYgZihhcmcxLCBhcmcyLCAuLi4pOlxcbiAgICAgICAgICAgICAuLi5cXG5cXG5JdCBjYW4gYmUgY2FsbGVkIGVpdGhlciBvbiB0aGUgY2xhc3MgKGUuZy4gQy5mKCkpIG9yIG9uIGFuIGluc3RhbmNlXFxuKGUuZy4gQygpLmYoKSkuICBUaGUgaW5zdGFuY2UgaXMgaWdub3JlZCBleGNlcHQgZm9yIGl0cyBjbGFzcy5cXG5cXG5TdGF0aWMgbWV0aG9kcyBpbiBQeXRob24gYXJlIHNpbWlsYXIgdG8gdGhvc2UgZm91bmQgaW4gSmF2YSBvciBDKysuXFxuRm9yIGEgbW9yZSBhZHZhbmNlZCBjb25jZXB0LCBzZWUgdGhlIGNsYXNzbWV0aG9kIGJ1aWx0aW4uXCIsXG50cCRkZXNjcl9nZXQoYSxjKXtpZih2b2lkIDA9PT10aGlzLnNtJGNhbGxhYmxlKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInVuaW5pdGlhbGl6ZWQgc3RhdGljbWV0aG9kIG9iamVjdFwiKTtyZXR1cm4gdGhpcy5zbSRjYWxsYWJsZX19LGdldHNldHM6e19fZnVuY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuc20kY2FsbGFibGV9fSxfX2RpY3RfXzpTay5nZW5lcmljLmdldFNldERpY3R9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKXtsZXQgZT10aGlzLnY7Yz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBlJiZcIm51bWJlclwiPT09dHlwZW9mIGMpe2NvbnN0IGI9YShlLGMpO2lmKGQoYikpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYil9ZT1uKGUpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKGUsYykpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19XG5mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gYShkLGMpO2Q9bihkKTtjPW4oYyk7cmV0dXJuIGIoZCxjKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGIoYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBjPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKGMpKTpuZXcgU2suYnVpbHRpbi5pbnRfKGIoYykpfX1mdW5jdGlvbiBlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy52KX1mdW5jdGlvbiBmKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZigwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7XG5pZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKGQsYykpO2Q9bihkKTtjPW4oYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oSlNCSS5udW1iZXJJZlNhZmUoYihkLGMpKSl9cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBsKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZigwPT09ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnYpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYyl7aWYoMD5jKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBzaGlmdCBjb3VudFwiKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGQpe2NvbnN0IGI9YShkLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYil9Yz1KU0JJLkJpZ0ludChjKX1lbHNlIGlmKEpTQkkubGVzc1RoYW4oSlNCSS5CaWdJbnQoMCkpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBzaGlmdCBjb3VudFwiKTtcbmQ9bihkKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKGQsYykpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKXt2YXIgZD10aGlzLnY7Yz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBkJiZcIm51bWJlclwiPT09dHlwZW9mIGMpcmV0dXJuIGQ9YShkLGMpLDA+ZCYmKGQrPTQyOTQ5NjcyOTYpLG5ldyBTay5idWlsdGluLmludF8oZCk7ZD1uKGQpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLm51bWJlcklmU2FmZShiKGQsYykpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGE8PU51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZhPj0tTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9ZnVuY3Rpb24gZyhhKXtyZXR1cm4gYTw9XG5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUiYmYT49LU51bWJlci5NQVhfU0FGRV9JTlRFR0VSPythOkpTQkkuQmlnSW50KGEpfWZ1bmN0aW9uIG4oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhP0pTQkkuQmlnSW50KGEpOmF9U2suYnVpbHRpbi5pbnRfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJpbnRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XyxcImJhZCBjYWxsIHRvIGludCB1c2UgJ25ldydcIik7bGV0IGI7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhfHxKU0JJLl9faXNCaWdJbnQoYSkpYj1hO2Vsc2UgaWYodm9pZCAwPT09YSliPTA7ZWxzZSBpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpYj1nKGEpO2Vsc2V7aWYoYS5uYiRpbnQpcmV0dXJuIGEubmIkaW50KCk7U2suYXNzZXJ0cy5mYWlsKFwiYmFkIGFyZ3VtZW50IHRvIGludCBjb25zdHJ1Y3RvclwiKX10aGlzLnY9Yn0sc2xvdHM6e3RwJGFzX251bWJlcjohMCxcbnRwJGRvYzpcImludCh4PTApIC0+IGludGVnZXJcXG5pbnQoeCwgYmFzZT0xMCkgLT4gaW50ZWdlclxcblxcbkNvbnZlcnQgYSBudW1iZXIgb3Igc3RyaW5nIHRvIGFuIGludGVnZXIsIG9yIHJldHVybiAwIGlmIG5vIGFyZ3VtZW50c1xcbmFyZSBnaXZlbi4gIElmIHggaXMgYSBudW1iZXIsIHJldHVybiB4Ll9faW50X18oKS4gIEZvciBmbG9hdGluZyBwb2ludFxcbm51bWJlcnMsIHRoaXMgdHJ1bmNhdGVzIHRvd2FyZHMgemVyby5cXG5cXG5JZiB4IGlzIG5vdCBhIG51bWJlciBvciBpZiBiYXNlIGlzIGdpdmVuLCB0aGVuIHggbXVzdCBiZSBhIHN0cmluZyxcXG5ieXRlcywgb3IgYnl0ZWFycmF5IGluc3RhbmNlIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyIGxpdGVyYWwgaW4gdGhlXFxuZ2l2ZW4gYmFzZS4gIFRoZSBsaXRlcmFsIGNhbiBiZSBwcmVjZWRlZCBieSAnKycgb3IgJy0nIGFuZCBiZSBzdXJyb3VuZGVkXFxuYnkgd2hpdGVzcGFjZS4gIFRoZSBiYXNlIGRlZmF1bHRzIHRvIDEwLiAgVmFsaWQgYmFzZXMgYXJlIDAgYW5kIDItMzYuXFxuQmFzZSAwIG1lYW5zIHRvIGludGVycHJldCB0aGUgYmFzZSBmcm9tIHRoZSBzdHJpbmcgYXMgYW4gaW50ZWdlciBsaXRlcmFsLlxcbj4+PiBpbnQoJzBiMTAwJywgYmFzZT0wKVxcbjRcIixcbiRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKSl9LHRwJGhhc2goKXtjb25zdCBhPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGE/YTpKU0JJLnRvTnVtYmVyKEpTQkkucmVtYWluZGVyKGEsSlNCSS5fX01BWF9TQUZFKSl9LHRwJG5ldyhhLGIpezE9PT1hLmxlbmd0aCsoYj9iLmxlbmd0aDowKT8oYj1hWzBdLGE9U2suYnVpbHRpbi5ub25lLm5vbmUkKTooYT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImludFwiLFtudWxsLFwiYmFzZVwiXSxhLGIsW25ldyBTay5idWlsdGluLmludF8oMCksU2suYnVpbHRpbi5ub25lLm5vbmUkXSksYj1hWzBdLGE9YVsxXSk7YT1hIT09U2suYnVpbHRpbi5ub25lLm5vbmUkP1NrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpOm51bGw7aWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKW51bGw9PT1hJiYoYT0xMCksYj1uZXcgU2suYnVpbHRpbi5pbnRfKFNrLnN0cjJudW1iZXIoYi52LFxuYSkpO2Vsc2V7aWYobnVsbCE9PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaW50KCkgY2FuJ3QgY29udmVydCBub24tc3RyaW5nIHdpdGggZXhwbGljaXQgYmFzZVwiKTtpZihiLm5iJGludCliPWIubmIkaW50KCk7ZWxzZSBpZihhPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYixTay5idWlsdGluLnN0ci4kdHJ1bmMpKXthPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtdKTtpZighU2suYnVpbHRpbi5jaGVja0ludChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoU2suYnVpbHRpbi5zdHIuJHRydW5jLiRqc3N0cigpK1wiIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSBcIitTay5hYnN0ci50eXBlTmFtZShiKStcIilcIik7Yj1uZXcgU2suYnVpbHRpbi5pbnRfKGEudil9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpbnQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBhIGJ5dGVzLWxpa2Ugb2JqZWN0IG9yIGEgbnVtYmVyLCBub3QgJ1wiK1xuU2suYWJzdHIudHlwZU5hbWUoYikrXCInXCIpO31pZih0aGlzPT09U2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZSlyZXR1cm4gYjthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2Eudj1iLnY7cmV0dXJuIGF9LHRwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLG9iJGVxOmMoKGEsYik9PmE9PWIsSlNCSS5lcXVhbCksb2IkbmU6YygoYSxiKT0+YSE9YixKU0JJLm5vdEVxdWFsKSxvYiRndDpjKChhLGIpPT5hPmIsSlNCSS5ncmVhdGVyVGhhbiksb2IkZ2U6YygoYSxiKT0+YT49YixKU0JJLmdyZWF0ZXJUaGFuT3JFcXVhbCksb2IkbHQ6YygoYSxiKT0+YTxiLEpTQkkubGVzc1RoYW4pLG9iJGxlOmMoKGEsYik9PmE8PWIsSlNCSS5sZXNzVGhhbk9yRXF1YWwpLG5iJGludDplLG5iJGluZGV4KCl7cmV0dXJuIHRoaXMudn0sbmIkZmxvYXQoKXt2YXIgYT10aGlzLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk7YT1wYXJzZUZsb2F0KEpTQkkudG9OdW1iZXIoYSkpO1xuaWYoSW5maW5pdHk9PT1hfHwtSW5maW5pdHk9PT1hKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX0sbmIkaXNuZWdhdGl2ZSgpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT8wPmE6SlNCSS5sZXNzVGhhbihhLEpTQkkuX19aRVJPKX0sbmIkaXNwb3NpdGl2ZSgpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT8wPmE6SlNCSS5ncmVhdGVyVGhhbk9yRXF1YWwoYSxKU0JJLl9fWkVSTyl9LG5iJGJvb2woKXtyZXR1cm4gMCE9PXRoaXMudn0sbmIkcG9zaXRpdmU6ZSxuYiRuZWdhdGl2ZTpiKGE9Pi1hLEpTQkkudW5hcnlNaW51cyksbmIkYWRkOmEoKGEsYik9PmErYiwoYSxiKT0+SlNCSS5udW1iZXJJZlNhZmUoSlNCSS5hZGQoYSxiKSkpLG5iJHN1YnRyYWN0OmEoKGEsYik9PmEtYiwoYSxiKT0+XG5KU0JJLm51bWJlcklmU2FmZShKU0JJLnN1YnRyYWN0KGEsYikpKSxuYiRtdWx0aXBseTphKChhLGIpPT5hKmIsSlNCSS5tdWx0aXBseSksbmIkZGl2aWRlKGEpe3JldHVybiBTay5fX2Z1dHVyZV9fLmRpdmlzaW9uP3RoaXMubmIkZmxvYXQoKS5uYiRkaXZpZGUoYSk6dGhpcy5uYiRmbG9vcl9kaXZpZGUoYSl9LG5iJGZsb29yX2RpdmlkZTpmKChhLGIpPT5NYXRoLmZsb29yKGEvYiksSlNCSS5kaXZpZGUpLG5iJHJlbWFpbmRlcjpmKChhLGIpPT5hLU1hdGguZmxvb3IoYS9iKSpiLEpTQkkucmVtYWluZGVyKSxuYiRkaXZtb2QoYSl7Y29uc3QgYj10aGlzLm5iJGZsb29yX2RpdmlkZShhKTthPXRoaXMubmIkcmVtYWluZGVyKGEpO3JldHVybiBiPT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR8fGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD9Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDpuZXcgU2suYnVpbHRpbi50dXBsZShbYixcbmFdKX0sbmIkYW5kOmgoKGEsYik9PmEmYixKU0JJLmJpdHdpc2VBbmQpLG5iJG9yOmgoKGEsYik9PmF8YixKU0JJLmJpdHdpc2VPciksbmIkeG9yOmgoKGEsYik9PmFeYixKU0JJLmJpdHdpc2VYb3IpLG5iJGFiczpiKE1hdGguYWJzLGE9PkpTQkkubGVzc1RoYW4oYSxKU0JJLl9fWkVSTyk/SlNCSS51bmFyeU1pbnVzKGEpOmEpLG5iJGxzaGlmdDpsKChhLGIpPT57aWYoNTM+YiYmKGE9MiphKnBbYl0sZChhKSkpcmV0dXJuIGF9LEpTQkkubGVmdFNoaWZ0KSxuYiRyc2hpZnQ6bCgoYSxiKT0+e2NvbnN0IGM9YT4+YjtyZXR1cm4gMDxhJiYwPmM/YyZNYXRoLnBvdygyLDMyLWIpLTE6Y30sKGEsYik9PkpTQkkubnVtYmVySWZTYWZlKEpTQkkuc2lnbmVkUmlnaHRTaGlmdChhLGIpKSksbmIkaW52ZXJ0OmIoYT0+fmEsSlNCSS5iaXR3aXNlTm90KSxuYiRwb3dlcihhLGIpe2xldCBjO3ZvaWQgMCE9PWImJlNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpJiYoYj12b2lkIDApO2lmKGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5pbnRfJiYodm9pZCAwPT09Ynx8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xykpe2xldCBlPXRoaXMudixmPWEudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGUmJlwibnVtYmVyXCI9PT10eXBlb2YgZil7Y29uc3QgYT1NYXRoLnBvdyhlLGYpO2lmKGQoYSkmJihjPTA+Zj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk6bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSx2b2lkIDA9PT1iKSlyZXR1cm4gY31pZih2b2lkIDAhPT1iKXtpZihhLm5iJGlzbmVnYXRpdmUoKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicG93KCkgMm5kIGFyZ3VtZW50IGNhbm5vdCBiZSBuZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWRcIik7aWYoMD09PWIudil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicG93KCkgM3JkIGFyZ3VtZW50IGNhbm5vdCBiZSAwXCIpO3JldHVybiB2b2lkIDAhPT1jP2MubmIkcmVtYWluZGVyKGIpOm5ldyBTay5idWlsdGluLmludF8oSlNCSS5wb3dlcm1vZChuKGUpLFxubihmKSxuKGIudikpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLmV4cG9uZW50aWF0ZShuKGUpLG4oZikpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9LG5iJGxvbmcoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHRoaXMudil9fSxnZXRzZXRzOntyZWFsOnskZ2V0OmUsJGRvYzpcInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifSxpbWFnOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oMCl9LCRkb2M6XCJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifX0sbWV0aG9kczp7Y29uanVnYXRlOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm5zIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgaW50LlwifSxiaXRfbGVuZ3RoOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmJ1aWx0aW4uYmluKHRoaXMpLnNxJGxlbmd0aCgpLVxuMil9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiTnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCBzZWxmIGluIGJpbmFyeS5cXG5cXG4+Pj4gYmluKDM3KVxcbicwYjEwMDEwMSdcXG4+Pj4gKDM3KS5iaXRfbGVuZ3RoKClcXG42XCJ9LHRvX2J5dGVzOnskbWV0aCgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFwiKTt9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBsZW5ndGgsIGJ5dGVvcmRlciwgKiwgc2lnbmVkPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYW4gYXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGFuIGludGVnZXIuXFxuXFxuICBsZW5ndGhcXG4gICAgTGVuZ3RoIG9mIGJ5dGVzIG9iamVjdCB0byB1c2UuICBBbiBPdmVyZmxvd0Vycm9yIGlzIHJhaXNlZCBpZiB0aGVcXG4gICAgaW50ZWdlciBpcyBub3QgcmVwcmVzZW50YWJsZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuXFxuICBieXRlb3JkZXJcXG4gICAgVGhlIGJ5dGUgb3JkZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIGludGVnZXIuICBJZiBieXRlb3JkZXIgaXMgJ2JpZycsXFxuICAgIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnl0ZSBhcnJheS4gIElmXFxuICAgIGJ5dGVvcmRlciBpcyAnbGl0dGxlJywgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBhdCB0aGUgZW5kIG9mIHRoZVxcbiAgICBieXRlIGFycmF5LiAgVG8gcmVxdWVzdCB0aGUgbmF0aXZlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3Qgc3lzdGVtLCB1c2VcXG4gICAgYHN5cy5ieXRlb3JkZXInIGFzIHRoZSBieXRlIG9yZGVyIHZhbHVlLlxcbiAgc2lnbmVkXFxuICAgIERldGVybWluZXMgd2hldGhlciB0d28ncyBjb21wbGVtZW50IGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBpbnRlZ2VyLlxcbiAgICBJZiBzaWduZWQgaXMgRmFsc2UgYW5kIGEgbmVnYXRpdmUgaW50ZWdlciBpcyBnaXZlbiwgYW4gT3ZlcmZsb3dFcnJvclxcbiAgICBpcyByYWlzZWQuXCJ9LFxuX190cnVuY19fOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJUcnVuY2F0aW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlwifSxfX2Zsb29yX186eyRtZXRoOmUsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkZsb29yaW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlwifSxfX2NlaWxfXzp7JG1ldGg6ZSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQ2VpbGluZyBvZiBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi5cIn0sX19yb3VuZF9fOnskbWV0aChhKXtyZXR1cm4gdGhpcy5yb3VuZCQoYSl9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUm91bmRpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuXFxuUm91bmRpbmcgd2l0aCBhbiBuZGlnaXRzIGFyZ3VtZW50IGFsc28gcmV0dXJucyBhbiBpbnRlZ2VyLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8odGhpcy52KV0pfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sX19mb3JtYXRfXzp7JG1ldGg6U2suZm9ybWF0dGluZy5ta051bWJlcl9fZm9ybWF0X18oITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgZm9ybWF0X3NwZWMsIC8pXCIsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9fSxwcm90bzp7c3RyJChhLGIpe2E9dm9pZCAwPT09YXx8MTA9PT1hP3RoaXMudi50b1N0cmluZygpOnRoaXMudi50b1N0cmluZyhhKTtifHx2b2lkIDA9PT1ifHxcIi1cIj09PWFbMF0mJihhPWEuc3Vic3RyaW5nKDEpKTtyZXR1cm4gYX0scm91bmQkKGEpe2E9dm9pZCAwPT09YT8wOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTt2YXIgYj10aGlzLnYsYz1NYXRoLnBvdygxMCwtYSk7aWYoMDxhKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYiYmU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nKXJldHVybiBhPVxuYi9jLGI9TWF0aC5yb3VuZChhKSxuZXcgU2suYnVpbHRpbi5pbnRfKCguNT09PSgwPGE/YTotYSklMT8wPT09YiUyP2I6Yi0xOmIpKmMpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhNYXRoLnJvdW5kKGIvYykqYyk7e2M9SlNCSS5CaWdJbnQoMTAqYyk7YT1KU0JJLkJpZ0ludCgxMCk7Yj1KU0JJLmRpdmlkZShiLGMpO2NvbnN0IGQ9SlNCSS5kaXZpZGUoYixhKSxlPUpTQkkuc3VidHJhY3QoYixKU0JJLm11bHRpcGx5KGEsZCkpOzU+SlNCSS50b051bWJlcihlKT9iPUpTQkkubXVsdGlwbHkoSlNCSS5tdWx0aXBseShkLGEpLGMpOkpTQkkubXVsdGlwbHkoSlNCSS5tdWx0aXBseShKU0JJLmFkZChkLEpTQkkuQmlnSW50KDEpLGEpLGMpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX19fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uaW50X1wiLFNrLmJ1aWx0aW4uaW50Xyk7Y29uc3Qgaz0vXyg/PVteX10pL2c7U2suc3RyMm51bWJlcj1cbmZ1bmN0aW9uKGEsYil7dmFyIGM9YSxlPSExLGY7YT1hLnJlcGxhY2UoL15cXHMrfFxccyskL2csXCJcIik7XCItXCI9PT1hLmNoYXJBdCgwKSYmKGU9ITAsYT1hLnN1YnN0cmluZygxKSk7XCIrXCI9PT1hLmNoYXJBdCgwKSYmKGE9YS5zdWJzdHJpbmcoMSkpO2lmKG51bGw9PT1ifHx2b2lkIDA9PT1iKWI9MTA7aWYoKDI+Ynx8MzY8YikmJjAhPT1iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnQoKSBiYXNlIG11c3QgYmUgPj0gMiBhbmQgPD0gMzZcIik7XCJzdHJpbmdcIj09PXR5cGVvZiBiJiYoYj1OdW1iZXIoYikpO2lmKFwiMHhcIj09PWEuc3Vic3RyaW5nKDAsMikudG9Mb3dlckNhc2UoKSlpZigxNj09PWJ8fDA9PT1iKWE9YS5zdWJzdHJpbmcoMiksYj0xNjtlbHNle2lmKDM0PmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBiXCI9PT1hLnN1YnN0cmluZygwLFxuMikudG9Mb3dlckNhc2UoKSlpZigyPT09Ynx8MD09PWIpYT1hLnN1YnN0cmluZygyKSxiPTI7ZWxzZXtpZigxMj5iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7fWVsc2UgaWYoXCIwb1wiPT09YS5zdWJzdHJpbmcoMCwyKS50b0xvd2VyQ2FzZSgpKWlmKDg9PT1ifHwwPT09YilhPWEuc3Vic3RyaW5nKDIpLGI9ODtlbHNle2lmKDI1PmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBcIj09PWEuY2hhckF0KDApKXtpZihcIjBcIj09PWEpcmV0dXJuIDA7aWYoOD09PWJ8fDA9PT1iKWI9OH0wPT09YiYmKGI9MTApO2lmKC0xIT09YS5pbmRleE9mKFwiX1wiKSl7aWYoLTEhPT1hLmluZGV4T2YoXCJfX1wiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrXG5iK1wiOiAnXCIrYytcIidcIik7YT0xMCE9PWI/YS5yZXBsYWNlKGssXCJcIik6YS5jaGFyQXQoMCkrYS5zdWJzdHJpbmcoMSkucmVwbGFjZShrLFwiXCIpfWlmKDA9PT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO2ZvcihmPTA7ZjxhLmxlbmd0aDtmKz0xKXt2YXIgZz1hLmNoYXJDb2RlQXQoZik7dmFyIGg9Yjs0ODw9ZyYmNTc+PWc/aD1nLTQ4OjY1PD1nJiY5MD49Zz9oPWctNjUrMTA6OTc8PWcmJjEyMj49ZyYmKGg9Zy05NysxMCk7aWYoaD49Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO31lJiYoYT1cIi1cIithKTtoPXBhcnNlSW50KGEsYik7aWYoZChoKSlyZXR1cm4gaDtjPSExO1wiLVwiPT09YVswXSYmKGM9ITAsYT1hLnN1YnN0cmluZygxKSk7Yj1KU0JJLkJpZ0ludChiKTtcbmU9SlNCSS5CaWdJbnQoMSk7Zj1KU0JJLkJpZ0ludCgwKTtmb3IoZz1hLmxlbmd0aC0xOzA8PWc7Zy0tKWg9YS5jaGFyQ29kZUF0KGcpLDQ4PD1oJiY1Nz49aD9oLT00ODo2NTw9aCYmOTA+PWg/aD1oLTY1KzEwOjk3PD1oJiYxMjI+PWgmJihoPWgtOTcrMTApLGg9SlNCSS5tdWx0aXBseShKU0JJLkJpZ0ludChoKSxlKSxmPUpTQkkuYWRkKGYsaCksZT1KU0JJLm11bHRpcGx5KGUsYik7YyYmKGY9SlNCSS5tdWx0aXBseShmLEpTQkkuQmlnSW50KC0xKSkpO3JldHVybiBhPWZ9O1NrLmJ1aWx0aW4uaW50Xy5weTIkbWV0aG9kcz17fTtTay5sb25nRnJvbVN0cj1mdW5jdGlvbihhLGIpe2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhnKGEpKTthPVNrLnN0cjJudW1iZXIoYSxiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5sb25nRnJvbVN0clwiLFNrLmxvbmdGcm9tU3RyKTtTay5idWlsdGluLmludF8ud2l0aGluVGhyZXNob2xkPVxuZDtTay5idWlsdGluLmludF8uc3RyaW5nVG9OdW1iZXJPckJpZz1nO2NvbnN0IHA9Wy41LDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI1Niw1MTIsMTAyNCwyMDQ4LDQwOTYsODE5MiwxNjM4NCwzMjc2OCw2NTUzNiwxMzEwNzIsMjYyMTQ0LDUyNDI4OCwxMDQ4NTc2LDIwOTcxNTIsNDE5NDMwNCw4Mzg4NjA4LDE2Nzc3MjE2LDMzNTU0NDMyLDY3MTA4ODY0LDEzNDIxNzcyOCwyNjg0MzU0NTYsNTM2ODcwOTEyLDEwNzM3NDE4MjQsMjE0NzQ4MzY0OCw0Mjk0OTY3Mjk2LDg1ODk5MzQ1OTIsMTcxNzk4NjkxODQsMzQzNTk3MzgzNjgsNjg3MTk0NzY3MzYsMTM3NDM4OTUzNDcyLDI3NDg3NzkwNjk0NCw1NDk3NTU4MTM4ODgsMTA5OTUxMTYyNzc3NiwyMTk5MDIzMjU1NTUyLDQzOTgwNDY1MTExMDQsODc5NjA5MzAyMjIwOCwxNzU5MjE4NjA0NDQxNiwzNTE4NDM3MjA4ODgzMiw3MDM2ODc0NDE3NzY2NCwweDgwMDAwMDAwMDAwMCwyODE0NzQ5NzY3MTA2NTYsNTYyOTQ5OTUzNDIxMzEyLDB4NDAwMDAwMDAwMDAwMCxcbjB4ODAwMDAwMDAwMDAwMCw0NTAzNTk5NjI3MzcwNDk2LDkwMDcxOTkyNTQ3NDA5OTJdO1NrLmJ1aWx0aW4ubG5nPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJsb25nXCIse2Jhc2U6U2suYnVpbHRpbi5pbnRfLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4uaW50Xy5jYWxsKHRoaXMsYSl9LHNsb3RzOnskcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvU3RyaW5nKCkrXCJMXCIpfSx0cCRhc19udW1iZXI6ITAsbmIkbmVnYXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHUubmIkbmVnYXRpdmUuY2FsbCh0aGlzKS52KX0sbmIkcG9zaXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHUubmIkcG9zaXRpdmUuY2FsbCh0aGlzKS52KX19fSk7Y29uc3QgdT1Tay5idWlsdGluLmludF8ucHJvdG90eXBlfSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9U2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZTtTay5idWlsdGluLmJvb2w9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImJvb2xcIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfSxiYXNlOlNrLmJ1aWx0aW4uaW50XyxzbG90czp7dHAkZG9jOlwiYm9vbCh4KSAtPiBib29sXFxuXFxuUmV0dXJucyBUcnVlIHdoZW4gdGhlIGFyZ3VtZW50IHggaXMgdHJ1ZSwgRmFsc2Ugb3RoZXJ3aXNlLlxcblRoZSBidWlsdGlucyBUcnVlIGFuZCBGYWxzZSBhcmUgdGhlIG9ubHkgdHdvIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYm9vbC5cXG5UaGUgY2xhc3MgYm9vbCBpcyBhIHN1YmNsYXNzIG9mIHRoZSBjbGFzcyBpbnQsIGFuZCBjYW5ub3QgYmUgc3ViY2xhc3NlZC5cIix0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwiYm9vbFwiLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcImJvb2xcIixhLDAsMSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYVswXSl9LCRyKCl7cmV0dXJuIHRoaXMudj90aGlzLnN0ciRUcnVlOlxudGhpcy5zdHIkRmFsc2V9LHRwJGFzX251bWJlcjohMCxuYiRhbmQoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudiZjLnYpOmEubmIkYW5kLmNhbGwodGhpcyxjKX0sbmIkb3IoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudnxjLnYpOmEubmIkb3IuY2FsbCh0aGlzLGMpfSxuYiR4b3IoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudl5jLnYpOmEubmIkeG9yLmNhbGwodGhpcyxjKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9LG1ldGhvZHM6e19fZm9ybWF0X186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHIoKX0sJGZsYWdzOntPbmVBcmc6ITB9fX0scHJvdG86e3N0ciRGYWxzZTpuZXcgU2suYnVpbHRpbi5zdHIoXCJGYWxzZVwiKSxzdHIkVHJ1ZTpuZXcgU2suYnVpbHRpbi5zdHIoXCJUcnVlXCIpfX0pO1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5ib29sXCIsU2suYnVpbHRpbi5ib29sKTtTay5idWlsdGluLmJvb2wudHJ1ZSQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLmJvb2wucHJvdG90eXBlLHt2Ont2YWx1ZToxLGVudW1lcmFibGU6ITB9fSk7U2suYnVpbHRpbi5ib29sLmZhbHNlJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4uYm9vbC5wcm90b3R5cGUse3Y6e3ZhbHVlOjAsZW51bWVyYWJsZTohMH19KX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnYpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9dGhpcy52O2I9Yi52O2lmKFwibnVtYmVyXCIhPT10eXBlb2YgYilpZihKU0JJLl9faXNCaWdJbnQoYikpe2lmKGI9cGFyc2VGbG9hdChKU0JJLnRvTnVtYmVyKGIpKSxJbmZpbml0eT09Ynx8LUluZmluaXR5PT1iKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7XG59ZWxzZSByZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7cmV0dXJuIGEoYyxiKX19ZnVuY3Rpb24gYihhKXtjb25zdCBiPWMoYSk7cmV0dXJuIGZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YyYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInBvdygpIDNyZCBhcmd1bWVudCBub3QgYWxsb3dlZCB1bmxlc3MgYWxsIGFyZ3VtZW50cyBhcmUgaW50ZWdlcnNcIik7cmV0dXJuIGIuY2FsbCh0aGlzLGEpfX1mdW5jdGlvbiBlKGEsYil7aWYoMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IoXCJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCIpO3JldHVybiBJbmZpbml0eT09PWE/SW5maW5pdHk9PT1ifHwtSW5maW5pdHk9PT1hP25ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pOjA+Yj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oLUluZmluaXR5KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oSW5maW5pdHkpOlxuLUluZmluaXR5PT09YT9JbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik6MD5iP25ldyBTay5idWlsdGluLmZsb2F0XyhJbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC1JbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvYil9ZnVuY3Rpb24gZihhLGIpe2lmKEluZmluaXR5PT09YXx8LUluZmluaXR5PT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik7aWYoMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IoXCJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCIpO3JldHVybiBJbmZpbml0eT09PWI/MD5hP25ldyBTay5idWlsdGluLmZsb2F0XygtMSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApOi1JbmZpbml0eT09PWI/MD5hfHwwIT09YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oMCk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0xKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oTWF0aC5mbG9vcihhL1xuYikpfWZ1bmN0aW9uIGwoYSxiKXtpZigwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7aWYoMD09PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygwKTtpZihJbmZpbml0eT09PWIpcmV0dXJuIEluZmluaXR5PT09YXx8LUluZmluaXR5PT09dGhpcy52P25ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pOjA8YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKEluZmluaXR5KTtsZXQgYz1hJWI7MD5hPzA8YiYmMD5jJiYoYys9Yik6MD5iJiYwIT09YyYmKGMrPWIpOzA9PT1jJiYoMD5iP2M9LTA6LUluZmluaXR5PT09SW5maW5pdHkvYyYmKGM9MCkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9ZnVuY3Rpb24gaChhLGIpe2lmKDA+YSYmMCE9PWIlMSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibmVnYXRpdmUgbnVtYmVyIGNhbm5vdCBiZSByYWlzZWQgdG8gYSBmcmFjdGlvbmFsIHBvd2VyXCIpO1xuaWYoMD09PWEmJjA+Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcIjAuMCBjYW5ub3QgYmUgcmFpc2VkIHRvIGEgbmVnYXRpdmUgcG93ZXJcIik7Y29uc3QgYz1NYXRoLnBvdyhhLGIpO2lmKEluZmluaXR5PT09TWF0aC5hYnMoYykmJkluZmluaXR5IT09TWF0aC5hYnMoYSkmJkluZmluaXR5IT09TWF0aC5hYnMoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcIk51bWVyaWNhbCByZXN1bHQgb3V0IG9mIHJhbmdlXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9Y29uc3QgZD1PYmplY3QuY3JlYXRlKG51bGwse0luZmluaXR5Ont2YWx1ZTozMTQxNTl9LFwiLUluZmluaXR5XCI6e3ZhbHVlOi0zMTQxNTl9LE5hTjp7dmFsdWU6MH19KTtTay5idWlsdGluLmZsb2F0Xz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZmxvYXRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfLFxuXCJiYWQgY2FsbCB0byBmbG9hdCB1c2UgJ25ldydcIik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXRoaXMudj1hO2Vsc2UgaWYodm9pZCAwPT09YSl0aGlzLnY9MDtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSl0aGlzLnY9cGFyc2VGbG9hdChhKTtlbHNle2lmKGEubmIkZmxvYXQpcmV0dXJuIGEubmIkZmxvYXQoKTtTay5hc3NlcnRzLmZhaWwoXCJiYWQgYXJndW1lbnQgdG8gZmxvYXQgY29uc3RydWN0b3JcIil9fSxzbG90czp7dHAkZ2V0dGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX251bWJlcjohMCx0cCRkb2M6XCJDb252ZXJ0IGEgc3RyaW5nIG9yIG51bWJlciB0byBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgaWYgcG9zc2libGUuXCIsdHAkaGFzaCgpe2NvbnN0IGE9dGhpcy52O2xldCBiPWRbYV07aWYodm9pZCAwIT09YilyZXR1cm4gYjtiPU51bWJlci5pc0ludGVnZXIoYSk/dGhpcy5uYiRpbnQoKS50cCRoYXNoKCk6TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSLVxuTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIvMik7cmV0dXJuIGRbdGhpcy52XT1ifSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy5zdHIkKDEwLCEwKSl9LHRwJG5ldyhhLGIpe2lmKGImJmIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZsb2F0KCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7aWYoYSYmMTxhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmbG9hdCBleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgXCIrYS5sZW5ndGgpO2E9YVswXTtpZih2b2lkIDA9PT1hKXZhciBjPW5ldyBTay5idWlsdGluLmZsb2F0XygwKTtlbHNlIGlmKGEubmIkZmxvYXQpYz1hLm5iJGZsb2F0KCk7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtjPWEudjthPWM7aWYoLTEhPT1jLmluZGV4T2YoXCJfXCIpKXtpZihnLnRlc3QoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byBmbG9hdDogJ1wiK1xuYytcIidcIik7YT1jLmNoYXJBdCgwKStjLnN1YnN0cmluZygxKS5yZXBsYWNlKG4sXCJcIil9aWYoYy5tYXRjaCgvXi1pbmYkL2kpKXZhciBkPS1JbmZpbml0eTtlbHNlIGMubWF0Y2goL15bK10/aW5mJC9pKT9kPUluZmluaXR5OmMubWF0Y2goL15bLStdP25hbiQvaSk/ZD1OYU46aXNOYU4oYSl8fChkPXBhcnNlRmxvYXQoYSksTnVtYmVyLmlzTmFOKGQpJiYoZD12b2lkIDApKTtpZih2b2lkIDA9PT1kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gZmxvYXQ6IFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIobmV3IFNrLmJ1aWx0aW4uc3RyKGMpKSk7Yz1uZXcgU2suYnVpbHRpbi5mbG9hdF8oZCl9aWYodm9pZCAwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmbG9hdCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBudW1iZXJcIik7aWYodGhpcz09PVNrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZSlyZXR1cm4gYztcbmQ9bmV3IHRoaXMuY29uc3RydWN0b3I7ZC52PWMudjtyZXR1cm4gZH0sbmIkaW50KCl7bGV0IGE9dGhpcy52O2E9MD5hP01hdGguY2VpbChhKTpNYXRoLmZsb29yKGEpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjYW5ub3QgY29udmVydCBmbG9hdCBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMpK1wiIHRvIGludGVnZXJcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50Xy53aXRoaW5UaHJlc2hvbGQoYSk/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKTpuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkuQmlnSW50KGEpKX0sbmIkZmxvYXQ6YSxuYiRsb25nKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxuZyh0aGlzLm5iJGludCgpLnYpfSxuYiRhZGQ6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGErYikpLG5iJHN1YnRyYWN0OmMoKGEsYik9Pm5ldyBTay5idWlsdGluLmZsb2F0XyhhLWIpKSxuYiRyZWZsZWN0ZWRfc3VidHJhY3Q6YygoYSxcbmIpPT5uZXcgU2suYnVpbHRpbi5mbG9hdF8oYi1hKSksbmIkbXVsdGlwbHk6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEqYikpLG5iJGRpdmlkZTpjKGUpLG5iJHJlZmxlY3RlZF9kaXZpZGU6YygoYSxiKT0+ZShiLGEpKSxuYiRmbG9vcl9kaXZpZGU6YyhmKSxuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlOmMoKGEsYik9PmYoYixhKSksbmIkcmVtYWluZGVyOmMobCksbmIkcmVmbGVjdGVkX3JlbWFpbmRlcjpjKChhLGIpPT5sKGIsYSkpLG5iJGRpdm1vZDpjKChhLGIpPT5uZXcgU2suYnVpbHRpbi50dXBsZShbZihhLGIpLGwoYSxiKV0pKSxuYiRyZWZsZWN0ZWRfZGl2bW9kOmMoKGEsYik9Pm5ldyBTay5idWlsdGluLnR1cGxlKFtmKGIsYSksbChiLGEpXSkpLG5iJHBvd2VyOmIoaCksbmIkcmVmbGVjdGVkX3Bvd2VyOmIoKGEsYik9PmgoYixhKSksbmIkYWJzKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhNYXRoLmFicyh0aGlzLnYpKX0sbmIkbmVnYXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC10aGlzLnYpfSxcbm5iJHBvc2l0aXZlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnYpfSxuYiRib29sKCl7cmV0dXJuIDAhPT10aGlzLnZ9LG5iJGlzbmVnYXRpdmUoKXtyZXR1cm4gMD50aGlzLnZ9LG5iJGlzcG9zaXRpdmUoKXtyZXR1cm4gMDw9dGhpcy52fSxvYiRlcTpjKChhLGIpPT5hPT1iKSxvYiRuZTpjKChhLGIpPT5hIT1iKSxvYiRndDpjKChhLGIpPT5hPmIpLG9iJGdlOmMoKGEsYik9PmE+PWIpLG9iJGx0OmMoKGEsYik9PmE8Yiksb2IkbGU6YygoYSxiKT0+YTw9Yil9LGdldHNldHM6e3JlYWw6eyRnZXQ6YSwkZG9jOlwidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyXCJ9LGltYWc6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApfSwkZG9jOlwidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn19LG1ldGhvZHM6e2Nvbmp1Z2F0ZTp7JG1ldGg6YSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGZsb2F0LlwifSxcbl9fdHJ1bmNfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy5uYiRpbnQoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIEludGVncmFsIGNsb3Nlc3QgdG8geCBiZXR3ZWVuIDAgYW5kIHguXCJ9LF9fcm91bmRfXzp7JG1ldGgoYSl7cmV0dXJuIHRoaXMucm91bmQkKGEpfSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuZGlnaXRzPU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgSW50ZWdyYWwgY2xvc2VzdCB0byB4LCByb3VuZGluZyBoYWxmIHRvd2FyZCBldmVuLlxcblxcbldoZW4gYW4gYXJndW1lbnQgaXMgcGFzc2VkLCB3b3JrIGxpa2UgYnVpbHQtaW4gcm91bmQoeCwgbmRpZ2l0cykuXCJ9LGlzX2ludGVnZXI6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woTnVtYmVyLmlzSW50ZWdlcih0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBmbG9hdCBpcyBhbiBpbnRlZ2VyLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXNdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6U2suYnVpbHRpbi5ub25lLm5vbmUkfSxfX2Zvcm1hdF9fOnskbWV0aDpTay5mb3JtYXR0aW5nLm1rTnVtYmVyX19mb3JtYXRfXyghMCksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBmb3JtYXRfc3BlYywgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fSk7Y29uc3QgZz0vX1tlRV18W2VFXV98XFwuX3xfXFwufFsrLV1ffF9fLyxuPS9fKD89W15fXSkvZztTay5idWlsdGluLmZsb2F0Xy5QeUZsb2F0X0NoZWNrPWZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hPyExOlNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSl8fFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8YS5vYiR0eXBlLiRpc1N1YlR5cGUoU2suYnVpbHRpbi5mbG9hdF8pP1xuITA6ITF9O1NrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZS50b0ZpeGVkPWZ1bmN0aW9uKGEpe2E9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIHRoaXMudi50b0ZpeGVkKGEpfTtTay5idWlsdGluLmZsb2F0Xy5wcm90b3R5cGUucm91bmQkPWZ1bmN0aW9uKGEpe3ZhciBiPVNrLmJ1aWx0aW4uYXNudW0kKHRoaXMpO3ZhciBjPXZvaWQgMD09PWE/MDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSk7aWYoU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nKXtiKj1NYXRoLnBvdygxMCxjKTt2YXIgZD1NYXRoLnJvdW5kKGIpO2M9KC41PT09KDA8Yj9iOi1iKSUxPzA9PT1kJTI/ZDpkLTE6ZCkvTWF0aC5wb3coMTAsYyk7cmV0dXJuIHZvaWQgMD09PWE/bmV3IFNrLmJ1aWx0aW4uaW50XyhjKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9YT1NYXRoLnBvdygxMCxjKTtjPU1hdGgucm91bmQoYiphKS9hO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9O1NrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZS5zdHIkPVxuZnVuY3Rpb24oYSxiKXtpZihpc05hTih0aGlzLnYpKXJldHVyblwibmFuXCI7dm9pZCAwPT09YiYmKGI9ITApO2lmKEluZmluaXR5PT10aGlzLnYpcmV0dXJuXCJpbmZcIjtpZigtSW5maW5pdHk9PXRoaXMudiYmYilyZXR1cm5cIi1pbmZcIjtpZigtSW5maW5pdHk9PXRoaXMudiYmIWIpcmV0dXJuXCJpbmZcIjtiPWI/dGhpcy52Ok1hdGguYWJzKHRoaXMudik7aWYodm9pZCAwPT09YXx8MTA9PT1hKXt2YXIgYz1Tay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yi50b1ByZWNpc2lvbigxNik6Yi50b1ByZWNpc2lvbigxMik7dmFyIGQ9Yy5pbmRleE9mKFwiLlwiKTthPWIudG9TdHJpbmcoKS5zbGljZSgwLGQpO2Q9Yi50b1N0cmluZygpLnNsaWNlKGQpO2EubWF0Y2goL14tPzAkLykmJmQuc2xpY2UoMSkubWF0Y2goL14wezQsfS8pJiYoYz0xMj5jLmxlbmd0aD9iLnRvRXhwb25lbnRpYWwoKTpiLnRvRXhwb25lbnRpYWwoMTEpKTtpZigwPmMuaW5kZXhPZihcImVcIikmJjA8PWMuaW5kZXhPZihcIi5cIikpe2Zvcig7XCIwXCI9PVxuYy5jaGFyQXQoYy5sZW5ndGgtMSk7KWM9Yy5zdWJzdHJpbmcoMCxjLmxlbmd0aC0xKTtcIi5cIj09Yy5jaGFyQXQoYy5sZW5ndGgtMSkmJihjKz1cIjBcIil9Yz1jLnJlcGxhY2UoL1xcLjArZS8sXCJlXCIsXCJpXCIpO2M9Yy5yZXBsYWNlKC8oZVstK10pKFsxLTldKSQvLFwiJDEwJDJcIik7Yz1jLnJlcGxhY2UoLzArKGUuKikvLFwiJDFcIil9ZWxzZSBjPWIudG9TdHJpbmcoYSk7MD09PXRoaXMudiYmLUluZmluaXR5PT09MS90aGlzLnYmJihjPVwiLVwiK2MpOzA+Yy5pbmRleE9mKFwiLlwiKSYmMD5jLmluZGV4T2YoXCJFXCIpJiYwPmMuaW5kZXhPZihcImVcIikmJihjKz1cIi4wXCIpO3JldHVybiBjfTtTay5idWlsdGluLmZsb2F0Xy5weTIkbWV0aG9kcz17fX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2xldCBiPWEudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGIpcmV0dXJuIGI7YS5uYiRmbG9hdCYmKGI9YS5uYiRmbG9hdCgpKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7XG5yZXR1cm4gYi52fWZ1bmN0aW9uIGMoYSxiLGMpe2lmKGM9PT1Tay5idWlsdGluLmNvbXBsZXgucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KGEsYik7Yz1uZXcgYy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmNvbXBsZXguY2FsbChjLGEsYik7cmV0dXJuIGN9ZnVuY3Rpb24gYihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtjb25zdCBkPXRoaXMucmVhbCxlPXRoaXMuaW1hZzt2YXIgZj1jLnJlYWw7Y29uc3QgZz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBmKWM9Yy5pbWFnO2Vsc2UgaWYoXCJudW1iZXJcIj09PXR5cGVvZiBnKWY9ZyxjPTA7ZWxzZSBpZihKU0JJLl9faXNCaWdJbnQoZykpe2lmKHZvaWQgMD09PWIpe2lmKGY9cGFyc2VGbG9hdChKU0JJLnRvTnVtYmVyKGcpKSxJbmZpbml0eT09Znx8LUluZmluaXR5PT1mKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7fWVsc2UgZj1cbmcudG9TdHJpbmcoKTtjPTB9ZWxzZSByZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7cmV0dXJuIGEoZCxlLGYsYyl9fWZ1bmN0aW9uIGUoYSxiLGMsZCl7dmFyIGU9TWF0aC5hYnMoYyk7Y29uc3QgZj1NYXRoLmFicyhkKTtpZihlPj1mKXtpZigwPT09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImNvbXBsZXggZGl2aXNpb24gYnkgemVyb1wiKTtlPWQvYztjKz1kKmU7ZD0oYStiKmUpL2M7YT0oYi1hKmUpL2N9ZWxzZSBmPj1lPyhlPWMvZCxjPWMqZStkLFNrLmFzc2VydHMuYXNzZXJ0KDAhPT1kKSxkPShhKmUrYikvYyxhPShiKmUtYSkvYyk6YT1kPU5hTjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleChkLGEpfWZ1bmN0aW9uIGYoYSxiLGMsZCl7aWYoMD09PWMmJjA9PT1kKXtkPTE7dmFyIGU9MH1lbHNlIGlmKDA9PT1hJiYwPT09Yil7aWYoMCE9PWR8fDA+Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImNvbXBsZXggZGl2aXNpb24gYnkgemVyb1wiKTtcbmU9ZD0wfWVsc2V7Y29uc3QgZj1NYXRoLmh5cG90KGEsYik7ZT1NYXRoLnBvdyhmLGMpO2E9TWF0aC5hdGFuMihiLGEpO2MqPWE7MCE9PWQmJihlLz1NYXRoLmV4cChhKmQpLGMrPWQqTWF0aC5sb2coZikpO2Q9ZSpNYXRoLmNvcyhjKTtlKj1NYXRoLnNpbihjKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleChkLGUpfWZ1bmN0aW9uIGwoYSxiLGMpe2xldCBkPTE7dmFyIGU9bmV3IFNrLmJ1aWx0aW4uY29tcGxleCgxLDApO2ZvcihhPW5ldyBTay5idWlsdGluLmNvbXBsZXgoYSxiKTswPGQmJmM+PWQ7KWMmZCYmKGU9bmV3IFNrLmJ1aWx0aW4uY29tcGxleChlLnJlYWwqYS5yZWFsLWUuaW1hZyphLmltYWcsZS5yZWFsKmEuaW1hZythLnJlYWwqZS5pbWFnKSksZDw8PTEsYT1uZXcgU2suYnVpbHRpbi5jb21wbGV4KGEucmVhbCphLnJlYWwtYS5pbWFnKmEuaW1hZywyKmEucmVhbCphLmltYWcpO3JldHVybiBlfWZ1bmN0aW9uIGgoYSxiLGMsZCxlKXtlPSExO3N3aXRjaChiKXtjYXNlIFwiZVwiOmNhc2UgXCJmXCI6Y2FzZSBcImdcIjpicmVhaztcbmNhc2UgXCJFXCI6ZT0hMDtiPVwiZVwiO2JyZWFrO2Nhc2UgXCJGXCI6ZT0hMDtiPVwiZlwiO2JyZWFrO2Nhc2UgXCJyXCI6aWYoMCE9PWMpdGhyb3cgRXJyb3IoXCJCYWQgaW50ZXJuYWxsIGNhbGxcIik7Yz0xNztiPVwiZ1wiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoXCJCYWQgaW50ZXJuYWxsIGNhbGxcIik7fWlmKGlzTmFOKGEpKWE9XCJuYW5cIjtlbHNlIGlmKEluZmluaXR5PT09YSlhPVwiaW5mXCI7ZWxzZSBpZigtSW5maW5pdHk9PT1hKWE9XCItaW5mXCI7ZWxzZXtkJmguUHlfRFRTRl9BRERfRE9UXzAmJihiPVwiZ1wiKTt2YXIgZj1cIiVcIisoZCZoLlB5X0RUU0ZfQUxUP1wiI1wiOlwiXCIpO251bGwhPWMmJihmPWYrXCIuXCIrYyk7Zj1uZXcgU2suYnVpbHRpbi5zdHIoZitiKTthPWYubmIkcmVtYWluZGVyKG5ldyBTay5idWlsdGluLmZsb2F0XyhhKSk7YT1hLnZ9ZCZoLlB5X0RUU0ZfU0lHTiYmXCItXCIhPT1hWzBdJiYoYT1cIitcIithKTtlJiYoYT1hLnRvVXBwZXJDYXNlKCkpO3JldHVybiBhfVNrLmJ1aWx0aW4uY29tcGxleD1cblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJjb21wbGV4XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uY29tcGxleCxcImJhZCBjYWxsIHRvIGNvbXBsZXggY29uc3RydWN0b3IsIHVzZSAnbmV3J1wiKTt0aGlzLnJlYWw9YTt0aGlzLmltYWc9Yn0sc2xvdHM6e3RwJGFzX251bWJlcjohMCx0cCRkb2M6XCJDcmVhdGUgYSBjb21wbGV4IG51bWJlciBmcm9tIGEgcmVhbCBwYXJ0IGFuZCBhbiBvcHRpb25hbCBpbWFnaW5hcnkgcGFydC5cXG5cXG5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gKHJlYWwgKyBpbWFnKjFqKSB3aGVyZSBpbWFnIGRlZmF1bHRzIHRvIDAuXCIsdHAkaGFzaCgpe3ZhciBhPShuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5yZWFsKSkudHAkaGFzaCgpO2E9MTAwMyoobmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMuaW1hZykpLnRwJGhhc2goKSthO3JldHVybiBTay5idWlsdGluLmludF8ud2l0aGluVGhyZXNob2xkKGEpP1xuYToobmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLkJpZ0ludChhKSkpLnRwJGhhc2goKX0sdHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGIsZSl7Yj1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImNvbXBsZXhcIixbXCJyZWFsXCIsXCJpbWFnXCJdLGIsZSxbbnVsbCxudWxsXSk7e3ZhciBmPWJbMV0sZztsZXQgaz1lPSExO3ZhciBoPWJbMF07aWYobnVsbCE9aCYmaC5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uY29tcGxleCYmbnVsbD09ZillPWg7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGgpKXtpZihudWxsIT1mKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBjYW4ndCB0YWtlIHNlY29uZCBhcmcgaWYgZmlyc3QgaXMgYSBzdHJpbmdcIik7ZT1Tay5idWlsdGluLmNvbXBsZXguY29tcGxleF9zdWJ0eXBlX2Zyb21fc3RyaW5nKGgsdGhpcyl9ZWxzZXtpZihudWxsIT1mJiZTay5idWlsdGluLmNoZWNrU3RyaW5nKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBzZWNvbmQgYXJnIGNhbid0IGJlIGEgc3RyaW5nXCIpO1xubnVsbD09aD9iPW51bGw6KGI9U2suYWJzdHIubG9va3VwU3BlY2lhbChoLFNrLmJ1aWx0aW4uc3RyLiRjb21wbGV4KSxiPXZvaWQgMCE9PWI/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW10pOm51bGwpO2lmKG51bGwhPWImJmIhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCl7aWYoIWQoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19jb21wbGV4X18gc2hvdWxkIHJldHVybiBhIGNvbXBsZXggb2JqZWN0XCIpO2g9Yn1pZihudWxsIT1oJiZ2b2lkIDA9PT1oLm5iJGZsb2F0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGgpK1wiJ1wiKTtpZihudWxsIT1mJiZ2b2lkIDA9PT1mLm5iJGZsb2F0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciwgbm90ICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGgpK1wiJ1wiKTtudWxsPT1oP2g9Yj0wOmQoaCk/KGI9aC5yZWFsLGg9aC5pbWFnLGU9ITApOihiPWEoaCksaD0wKTtudWxsPT1mP2Y9Zz0wOmQoZik/KGc9Zi5yZWFsLGY9Zi5pbWFnLGs9ITApOihnPWEoZiksZj0wKTshMD09PWsmJihiLT1mKTshMD09PWUmJihnKz1oKTtlPWMoYixnLHRoaXMpfX1yZXR1cm4gZX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihcIkVxXCIhPT1jJiZcIk5vdEVxXCIhPT1jKXtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpfHxkKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVyc1wiKTtyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9cmV0dXJuIGIoZnVuY3Rpb24oYSxiLGQsZSl7YT1hPT1kJiZiPT1lO3JldHVyblwiRXFcIj09PWM/YTohYX0sITApLmNhbGwodGhpcyxhKX0sJHIoKXt7dmFyIGEsXG5iO2xldCBlPWE9XCJcIjt2YXIgYz10aGlzLnJlYWw7dmFyIGQ9dGhpcy5pbWFnO2lmKGI9MD09PWMpYj0xPT0oYz8wPmM/LTE6MTowPjEvYz8tMToxKTtiPyhjPVwiXCIsYj1oKGQsXCJnXCIsbnVsbCwwLG51bGwpKTooYz1hPWgoYyxcImdcIixudWxsLDAsbnVsbCksYj1oKGQsXCJnXCIsbnVsbCxoLlB5X0RUU0ZfU0lHTixudWxsKSwwPT09ZCYmLUluZmluaXR5PT09MS9kJiZiJiZcIi1cIiE9PWJbMF0mJihiPVwiLVwiK2IpLGE9XCIoXCIsZT1cIilcIik7ZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJcIithK2MrYitcImpcIitlKX1yZXR1cm4gZH0sbmIkaW50KCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGludFwiKTt9LG5iJGxvbmcoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gbG9uZ1wiKTt9LG5iJGZsb2F0KCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGZsb2F0XCIpO1xufSxuYiRwb3NpdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KHRoaXMucmVhbCx0aGlzLmltYWcpfSxuYiRuZWdhdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KC10aGlzLnJlYWwsLXRoaXMuaW1hZyl9LG5iJGJvb2woKXtyZXR1cm4gdGhpcy5yZWFsfHx0aGlzLmltYWd9LG5iJGFkZDpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChhK2MsYitkKSksbmIkc3VidHJhY3Q6YigoYSxiLGMsZCk9Pm5ldyBTay5idWlsdGluLmNvbXBsZXgoYS1jLGItZCkpLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChjLWEsZC1iKSksbmIkbXVsdGlwbHk6YigoYSxiLGMsZCk9Pm5ldyBTay5idWlsdGluLmNvbXBsZXgoYyphLWQqYixhKmQrYipjKSksbmIkZGl2aWRlOmIoZSksbmIkcmVmbGVjdGVkX2RpdmlkZTpiKChhLGIsYyxkKT0+ZShjLGQsYSxiKSksbmIkZmxvb3JfZGl2aWRlKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb2YgY29tcGxleCBudW1iZXIuXCIpO1xufSxuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb2YgY29tcGxleCBudW1iZXIuXCIpO30sbmIkcmVtYWluZGVyKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG1vZCBjb21wbGV4IG51bWJlcnMuXCIpO30sbmIkcmVmbGVjdGVkX3JlbWFpbmRlcihhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtb2QgY29tcGxleCBudW1iZXJzLlwiKTt9LG5iJGRpdm1vZChhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCB0YWtlIGZsb29yIG9yIG1vZCBvZiBjb21wbGV4IG51bWJlci5cIik7fSxuYiRwb3dlcihhLGIpe2lmKG51bGwhPWImJiFTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCBtb2R1bG9cIik7cmV0dXJuIGsuY2FsbCh0aGlzLGEpfSxuYiRhYnMoKXt2YXIgYT1cbnRoaXMucmVhbDtjb25zdCBiPXRoaXMuaW1hZztpZighTnVtYmVyLmlzRmluaXRlKGEpfHwhTnVtYmVyLmlzRmluaXRlKGIpKXJldHVybiBJbmZpbml0eT09PWF8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKGEpKTpJbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKGIpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oTmFOKTthPU1hdGguaHlwb3QoYSxiKTtpZighTnVtYmVyLmlzRmluaXRlKGEpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJhYnNvbHV0ZSB2YWx1ZSB0b28gbGFyZ2VcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX19LGdldHNldHM6e3JlYWw6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMucmVhbCl9LCRkb2M6XCJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn0saW1hZzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5pbWFnKX0sXG4kZG9jOlwidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn19LG1ldGhvZHM6e2Nvbmp1Z2F0ZTp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleCh0aGlzLnJlYWwsLXRoaXMuaW1hZyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJjb21wbGV4LmNvbmp1Z2F0ZSgpIC0+IGNvbXBsZXhcXG5cXG5SZXR1cm4gdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGl0cyBhcmd1bWVudC4gKDMtNGopLmNvbmp1Z2F0ZSgpID09IDMrNGouXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMucmVhbCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMuaW1hZyldKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9LF9fZm9ybWF0X186eyRtZXRoKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIl9fZm9ybWF0X18gaXMgbm90IGltcGxlbWVudGVkIGZvciBjb21wbGV4IHR5cGUuXCIpO1xudGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19mb3JtYXRfXyByZXF1aXJlcyBzdHJcIik7fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiY29tcGxleC5fX2Zvcm1hdF9fKCkgLT4gc3RyXFxuXFxuQ29udmVydCB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gZm9ybWF0X3NwZWMuXCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY29tcGxleFwiLFNrLmJ1aWx0aW4uY29tcGxleCk7Y29uc3QgZD1Tay5idWlsdGluLmNoZWNrQ29tcGxleCxnPS9fW2VFXXxbZUVdX3xcXC5ffF9cXC58WystXV98X2p8al8vLG49L18oPz1bXl9dKS9nO1NrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmc9ZnVuY3Rpb24oYSxiKXtiPWJ8fFNrLmJ1aWx0aW4uY29tcGxleC5wcm90b3R5cGU7dmFyIGQ9MCxlPTAsZj0hMTtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKWE9U2suZmZpLnJlbWFwVG9KcyhhKTtlbHNlIGlmKFwic3RyaW5nXCIhPT1cbnR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoXCJwcm92aWRlZCB1bnN1cHBvcnRlZCBzdHJpbmctYWxpa2UgYXJndW1lbnRcIik7aWYoLTEhPT1hLmluZGV4T2YoXCJcXHgwMFwiKXx8MD09PWEubGVuZ3RofHxcIlwiPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCgpIGFyZyBpcyBhIG1hbGZvcm1lZCBzdHJpbmdcIik7dmFyIGg9MDthPWEucmVwbGFjZSgvaW5mfGluZmluaXR5L2dpLFwiSW5maW5pdHlcIik7Zm9yKGE9YS5yZXBsYWNlKC9uYW4vZ2ksXCJOYU5cIik7XCIgXCI9PT1hW2hdOyloKys7aWYoXCIoXCI9PT1hW2hdKWZvcihmPSEwLGgrKztcIiBcIj09PWFbaF07KWgrKztpZigtMSE9PWEuaW5kZXhPZihcIl9cIikpe2lmKGcudGVzdChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGNvbXBsZXg6ICdcIithK1wiJ1wiKTthPWEuY2hhckF0KDApK2Euc3Vic3RyaW5nKDEpLnJlcGxhY2UobixcIlwiKX12YXIgaz0vXig/OlsrLV0/KD86KD86KD86XFxkKlxcLlxcZCspfCg/OlxcZCtcXC4/KSkoPzpbZUVdWystXT9cXGQrKT98TmFOfEluZmluaXR5KSkvO1xudmFyIGw9YS5zdWJzdHIoaCk7dmFyIHA9bC5tYXRjaChrKTtpZihudWxsIT09cClpZihoKz1wWzBdLmxlbmd0aCxcImpcIj09PWFbaF18fFwiSlwiPT09YVtoXSllPXBhcnNlRmxvYXQocFswXSksaCsrO2Vsc2UgaWYoXCIrXCI9PT1hW2hdfHxcIi1cIj09PWFbaF0pe2Q9cGFyc2VGbG9hdChwWzBdKTtwPWEuc3Vic3RyKGgpLm1hdGNoKGspO251bGwhPT1wPyhlPXBhcnNlRmxvYXQocFswXSksaCs9cFswXS5sZW5ndGgpOihlPVwiK1wiPT09YVtoXT8xOi0xLGgrKyk7aWYoXCJqXCIhPT1hW2hdJiZcIkpcIiE9PWFbaF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtoKyt9ZWxzZSBkPXBhcnNlRmxvYXQocFswXSk7ZWxzZSBwPXA9bC5tYXRjaCgvXihbKy1dP1tqSl0pLyksbnVsbCE9PXAmJihlPTE9PT1wWzBdLmxlbmd0aD8xOlwiK1wiPT09cFswXVswXT8xOi0xLGgrPXBbMF0ubGVuZ3RoKTtmb3IoO1wiIFwiPT09YVtoXTspaCsrO2lmKGYpe2lmKFwiKVwiIT09XG5hW2hdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb21wbGV4KCkgYXJnIGlzIG1hbGZvcm1lZCBzdHJpbmdcIik7Zm9yKGgrKztcIiBcIj09PWFbaF07KWgrK31pZihhLmxlbmd0aCE9PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtyZXR1cm4gYyhkLGUsYil9O2NvbnN0IGs9YigoYSxiLGMsZCk9Pntjb25zdCBnPWN8MDtyZXR1cm4gMD09PWQmJmM9PT1nPygxMDA8Z3x8LTEwMD5nP2E9ZihhLGIsZywwKTowPGc/YT1sKGEsYixnKTooYT1sKGEsYiwtZyksYT1lKDEsMCxhLnJlYWwsYS5pbWFnKSksYSk6ZihhLGIsYyxkKX0pO2guUHlfRFRTRl9TSUdOPTE7aC5QeV9EVFNGX0FERF9ET1RfMD0yO2guUHlfRFRTRl9BTFQ9NDtoLlB5X0RUU1RfRklOSVRFPTA7aC5QeV9EVFNUX0lORklOSVRFPTE7aC5QeV9EVFNUX05BTj0yfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc2xpY2U9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInNsaWNlXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIpe3ZvaWQgMD09PWMmJnZvaWQgMD09PWImJihjPWEsYT1Tay5idWlsdGluLm5vbmUubm9uZSQpO3ZvaWQgMD09PWMmJihjPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7dm9pZCAwPT09YiYmKGI9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt0aGlzLnN0YXJ0PWE7dGhpcy5zdG9wPWM7dGhpcy5zdGVwPWJ9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRkb2M6XCJzbGljZShzdG9wKVxcbnNsaWNlKHN0YXJ0LCBzdG9wWywgc3RlcF0pXFxuXFxuQ3JlYXRlIGEgc2xpY2Ugb2JqZWN0LiAgVGhpcyBpcyB1c2VkIGZvciBleHRlbmRlZCBzbGljaW5nIChlLmcuIGFbMDoxMDoyXSkuXCIsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInNsaWNlXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic2xpY2VcIixhLDEsMyk7cmV0dXJuIG5ldyBTay5idWlsdGluLnNsaWNlKC4uLmEpfSxcbiRyKCl7Y29uc3QgYT1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuc3RhcnQpLGM9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0b3ApLGI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0ZXApO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJzbGljZShcIithK1wiLCBcIitjK1wiLCBcIitiK1wiKVwiKX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihhLm9iJHR5cGUhPT1Tay5idWlsdGluLnNsaWNlKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBiPW5ldyBTay5idWlsdGluLnR1cGxlKFt0aGlzLnN0YXJ0LHRoaXMuc3RvcCx0aGlzLnN0ZXBdKTthPW5ldyBTay5idWlsdGluLnR1cGxlKFthLnN0YXJ0LGEuc3RvcCxhLnN0ZXBdKTtyZXR1cm4gYi50cCRyaWNoY29tcGFyZShhLGMpfX0sZ2V0c2V0czp7c3RhcnQ6eyRnZXQoKXtyZXR1cm4gdGhpcy5zdGFydH19LHN0ZXA6eyRnZXQoKXtyZXR1cm4gdGhpcy5zdGVwfX0sc3RvcDp7JGdldCgpe3JldHVybiB0aGlzLnN0b3B9fX0sXG5tZXRob2RzOntpbmRpY2VzOnskbWV0aDpmdW5jdGlvbihhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoMD5hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxlbmd0aCBzaG91bGQgbm90IGJlIG5lZ2F0aXZlXCIpO2NvbnN0IHtzdGFydDpjLHN0b3A6YixzdGVwOmV9PXRoaXMuc2xpY2UkaW5kaWNlcyhhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8oYyksbmV3IFNrLmJ1aWx0aW4uaW50XyhiKSxuZXcgU2suYnVpbHRpbi5pbnRfKGUpXSl9LCRkb2M6XCJTLmluZGljZXMobGVuKSAtPiAoc3RhcnQsIHN0b3AsIHN0cmlkZSlcXG5cXG5Bc3N1bWluZyBhIHNlcXVlbmNlIG9mIGxlbmd0aCBsZW4sIGNhbGN1bGF0ZSB0aGUgc3RhcnQgYW5kIHN0b3BcXG5pbmRpY2VzLCBhbmQgdGhlIHN0cmlkZSBsZW5ndGggb2YgdGhlIGV4dGVuZGVkIHNsaWNlIGRlc2NyaWJlZCBieVxcblMuIE91dCBvZiBib3VuZHMgaW5kaWNlcyBhcmUgY2xpcHBlZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggdGhlXFxuaGFuZGxpbmcgb2Ygbm9ybWFsIHNsaWNlcy5cIixcbiR0ZXh0c2lnOm51bGwsJGZsYWdzOntPbmVBcmc6ITB9fX0scHJvdG86e3NsaWNlJGFzX2luZGljZXMoYSl7bGV0IGM7dmFyIGI9YT9hPT5Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxudWxsLFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIE5vbmUgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpOmE9PlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgTm9uZSBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik7aWYoU2suYnVpbHRpbi5jaGVja05vbmUodGhpcy5zdGVwKSljPTE7ZWxzZSBpZihjPWIodGhpcy5zdGVwKSwwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwic2xpY2Ugc3RlcCBjYW5ub3QgYmUgemVyb1wiKTthPVNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMuc3RhcnQpP251bGw6Yih0aGlzLnN0YXJ0KTtiPVNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMuc3RvcCk/bnVsbDpcbmIodGhpcy5zdG9wKTtyZXR1cm57c3RhcnQ6YSxzdG9wOmIsc3RlcDpjfX0sJHdydChhLGMsYixlLGYpe2Y9Zj9iPT5KU0JJLl9faXNCaWdJbnQoYik/SlNCSS5hZGQoYixKU0JJLkJpZ0ludChhKSk6YithOmI9PmIrYTswPGU/KG51bGw9PT1jP2M9MDowPmMmJihjPWYoYyksMD5jJiYoYz0wKSksbnVsbD09PWI/Yj1hOmI+YT9iPWE6MD5iJiYoYj1mKGIpKSk6KG51bGw9PT1jP2M9YS0xOmM+PWE/Yz1hLTE6MD5jJiYoYz1mKGMpKSxudWxsPT09Yj9iPS0xOjA+YiYmKGI9ZihiKSwwPmImJihiPS0xKSkpO3JldHVybntzdGFydDpjLHN0b3A6YixzdGVwOmV9fSxzbGljZSRpbmRpY2VzKGEsYyl7bGV0IHtzdGFydDpiLHN0b3A6ZSxzdGVwOmZ9PXRoaXMuc2xpY2UkYXNfaW5kaWNlcyghMCxjKTtyZXR1cm4gdGhpcy4kd3J0KGEsYixlLGYsYyl9LHNzc2l0ZXIkKGEsYyl7bGV0IHtzdGFydDpiLHN0b3A6ZSxzdGVwOmZ9PXRoaXMuc2xpY2UkaW5kaWNlcyhhLCEwKTtpZigwPGYpZm9yKGE9YjthPFxuZTthKz1mKWMoYSk7ZWxzZSBmb3IoYT1iO2E+ZTthKz1mKWMoYSl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0PWZ1bmN0aW9uKGEsYyxiKXthPWEuc3EkbGVuZ3RoKCk7dm9pZCAwPT09Y3x8U2suYnVpbHRpbi5jaGVja05vbmUoYyk/Yz0wOihjPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChjLG51bGwsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpLDA+YyYmKGMrPWEsMD5jJiYoYz0wKSkpO3ZvaWQgMD09PWJ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpP2I9YTooYj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYixudWxsLFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKSwwPmI/KGIrPWEsMD5iJiYoYj0wKSk6Yj5hJiYoYj1hKSk7cmV0dXJue3N0YXJ0OmMsZW5kOmJ9fX0sZnVuY3Rpb24obSxcbnEpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBTay5idWlsdGluLmNoZWNrQW55U2V0KGIpP2EuY2FsbCh0aGlzLGIpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBjKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLnNldCYmYS50cCRoYXNoPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYT1uZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQoU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSkpKTtyZXR1cm4gYX1tPXt9O1NrLmJ1aWx0aW4uc2V0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJzZXRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zZXQsXCJCYWQgY2FsbCB0byBzZXQgLSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIEFycmF5IGFuZCAnbmV3J1wiKTtcbmNvbnN0IGI9W107Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pLGIucHVzaCghMCk7dGhpcy52PW5ldyBTay5idWlsdGluLmRpY3QoYik7dGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfbnVtYmVyOiEwLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkZG9jOlwic2V0KCkgLT4gbmV3IGVtcHR5IHNldCBvYmplY3RcXG5zZXQoaXRlcmFibGUpIC0+IG5ldyBzZXQgb2JqZWN0XFxuXFxuQnVpbGQgYW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2YgdW5pcXVlIGVsZW1lbnRzLlwiLHRwJGluaXQoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic2V0XCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic2V0XCIsYSwwLDEpO3RoaXMuc2V0JGNsZWFyKCk7cmV0dXJuKGE9YVswXSkmJnRoaXMuc2V0JHVwZGF0ZShhKX0sdHAkbmV3OlNrLmdlbmVyaWMubmV3LFxuJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIiguLi4pXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMuc2skYXNhcnJheSgpLm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTt0aGlzLmluJHJlcHI9ITE7cmV0dXJuIFNrLl9fZnV0dXJlX18ucHl0aG9uMz8wPT09YS5sZW5ndGg/bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKClcIik6dGhpcy5vYiR0eXBlIT09U2suYnVpbHRpbi5zZXQ/bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKHtcIithLmpvaW4oXCIsIFwiKStcIn0pXCIpOm5ldyBTay5idWlsdGluLnN0cihcIntcIithLmpvaW4oXCIsIFwiKStcIn1cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKFtcIithLmpvaW4oXCIsIFwiKStcIl0pXCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLFxuYil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tBbnlTZXQoYSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO3N3aXRjaChiKXtjYXNlIFwiTm90RXFcIjpjYXNlIFwiRXFcIjpyZXR1cm4gYT10aGlzPT09YT8hMDp0aGlzLmdldCRzaXplKCkhPT1hLmdldCRzaXplKCk/ITE6U2subWlzY2V2YWwuaXNUcnVlKHRoaXMuc2V0JGlzc3Vic2V0KGEpKSxcIkVxXCI9PT1iP2E6IWE7Y2FzZSBcIkx0RVwiOnJldHVybiB0aGlzPT09YXx8U2subWlzY2V2YWwuaXNUcnVlKHRoaXMuc2V0JGlzc3Vic2V0KGEpKTtjYXNlIFwiR3RFXCI6cmV0dXJuIHRoaXM9PT1hfHxTay5taXNjZXZhbC5pc1RydWUoYS5zZXQkaXNzdWJzZXQodGhpcykpO2Nhc2UgXCJMdFwiOnJldHVybiB0aGlzLmdldCRzaXplKCk8YS5nZXQkc2l6ZSgpJiZTay5taXNjZXZhbC5pc1RydWUodGhpcy5zZXQkaXNzdWJzZXQoYSkpO2Nhc2UgXCJHdFwiOnJldHVybiB0aGlzLmdldCRzaXplKCk+YS5nZXQkc2l6ZSgpJiZTay5taXNjZXZhbC5pc1RydWUoYS5zZXQkaXNzdWJzZXQodGhpcykpfX0sXG5uYiRzdWJ0cmFjdDphKGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpZmZlcmVuY2UuJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkYW5kOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaW50ZXJzZWN0aW9uLiRtZXRoLmNhbGwodGhpcyxhKX0pLG5iJG9yOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudW5pb24uJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkeG9yOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3ltbWV0cmljX2RpZmZlcmVuY2UuJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkaW5wbGFjZV9zdWJ0cmFjdDphKGZ1bmN0aW9uKGEpe2E9PT10aGlzJiYoYT1hLnNldCRjb3B5KCkpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLmRpZmZlcmVuY2VfdXBkYXRlLiRtZXRoLmNhbGwodGhpcyxhKSwoKT0+dGhpcyl9KSxuYiRpbnBsYWNlX2FuZDphKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLmludGVyc2VjdGlvbl91cGRhdGUuJG1ldGguY2FsbCh0aGlzLFxuYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV9vcjphKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZS4kbWV0aC5jYWxsKHRoaXMsYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV94b3I6YShmdW5jdGlvbihhKXthPT09dGhpcyYmKGE9YS5zZXQkY29weSgpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUuJG1ldGguY2FsbCh0aGlzLGEpLCgpPT50aGlzKX0pLHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmdldCRzaXplKCl9LHNxJGNvbnRhaW5zKGEpe2E9YyhhKTtyZXR1cm4gdGhpcy52LnNxJGNvbnRhaW5zKGEpfX0sbWV0aG9kczp7YWRkOnskbWV0aChhKXt0aGlzLnNldCRhZGQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkFkZCBhbiBlbGVtZW50IHRvIGEgc2V0LlxcblxcblRoaXMgaGFzIG5vIGVmZmVjdCBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHByZXNlbnQuXCJ9LFxuY2xlYXI6eyRtZXRoKCl7dGhpcy5zZXQkY2xlYXIoKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgc2V0LlwifSxjb3B5OnskbWV0aCgpe3JldHVybiB0aGlzLnNldCRjb3B5KCl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBzZXQuXCJ9LGRpc2NhcmQ6eyRtZXRoKGEpe2E9YyhhKTt0aGlzLnNldCRkaXNjYXJkKGEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgc2V0IGlmIGl0IGlzIGEgbWVtYmVyLlxcblxcbklmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgZG8gbm90aGluZy5cIn0sZGlmZmVyZW5jZTp7JG1ldGgoLi4uYSl7Y29uc3QgYj10aGlzLnNldCRjb3B5KCk7XG5yZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KGEsYT0+Yi5zZXQkZGlmZmVyZW5jZV91cGRhdGUoYSkpLCgpPT5iKX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiB0aGUgZGlmZmVyZW5jZSBvZiB0d28gb3IgbW9yZSBzZXRzIGFzIGEgbmV3IHNldC5cXG5cXG4oaS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gdGhpcyBzZXQgYnV0IG5vdCB0aGUgb3RoZXJzLilcIn0sZGlmZmVyZW5jZV91cGRhdGU6eyRtZXRoKC4uLmEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT50aGlzLnNldCRkaWZmZXJlbmNlX3VwZGF0ZShhKSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7TWluQXJnczowfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYWxsIGVsZW1lbnRzIG9mIGFub3RoZXIgc2V0IGZyb20gdGhpcyBzZXQuXCJ9LGludGVyc2VjdGlvbjp7JG1ldGgoLi4uYSl7cmV0dXJuIHRoaXMuc2V0JGludGVyc2VjdGlvbl9tdWx0aSguLi5hKX0sXG4kZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBib3RoIHNldHMuKVwifSxpbnRlcnNlY3Rpb25fdXBkYXRlOnskbWV0aCguLi5hKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zZXQkaW50ZXJzZWN0aW9uX211bHRpKC4uLmEpLGE9Pnt0aGlzLnN3YXAkYm9kaWVzKGEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBpbnRlcnNlY3Rpb24gb2YgaXRzZWxmIGFuZCBhbm90aGVyLlwifSxpc2Rpc2pvaW50OnskbWV0aChhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PntpZih0aGlzLnNxJGNvbnRhaW5zKGEpKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoU2suYnVpbHRpbi5ib29sLmZhbHNlJCl9KSxcbmE9PmF8fFNrLmJ1aWx0aW4uYm9vbC50cnVlJCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0d28gc2V0cyBoYXZlIGEgbnVsbCBpbnRlcnNlY3Rpb24uXCJ9LGlzc3Vic2V0OnskbWV0aChhKXtTay5idWlsdGluLmNoZWNrQW55U2V0KGEpfHwoYT10aGlzLnNldCRtYWtlX2Jhc2V0eXBlKGEpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT50aGlzLnNldCRpc3N1YnNldChhKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXBvcnQgd2hldGhlciBhbm90aGVyIHNldCBjb250YWlucyB0aGlzIHNldC5cIn0saXNzdXBlcnNldDp7JG1ldGgoYSl7U2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8KGE9dGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsYT0+YS5zZXQkaXNzdWJzZXQodGhpcykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCxcbiRkb2M6XCJSZXBvcnQgd2hldGhlciB0aGlzIHNldCBjb250YWlucyBhbm90aGVyIHNldC5cIn0scG9wOnskbWV0aCgpe2lmKDA9PT10aGlzLmdldCRzaXplKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoXCJwb3AgZnJvbSBhbiBlbXB0eSBzZXRcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnYucG9waXRlbSxbdGhpcy52XSkudlswXX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSBzZXQgZWxlbWVudC5cXG5SYWlzZXMgS2V5RXJyb3IgaWYgdGhlIHNldCBpcyBlbXB0eS5cIn0scmVtb3ZlOnskbWV0aChhKXtjb25zdCBiPWMoYSk7aWYodGhpcy52Lm1wJGxvb2t1cChiKSlyZXR1cm4gdGhpcy52Lm1wJGFzc19zdWJzY3JpcHQoYiksU2suYnVpbHRpbi5ub25lLm5vbmUkO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIHNldDsgaXQgbXVzdCBiZSBhIG1lbWJlci5cXG5cXG5JZiB0aGUgZWxlbWVudCBpcyBub3QgYSBtZW1iZXIsIHJhaXNlIGEgS2V5RXJyb3IuXCJ9LHN5bW1ldHJpY19kaWZmZXJlbmNlOnskbWV0aChhKXtsZXQgYjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSxhPT57Yj1hO3JldHVybiBiLnNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUodGhpcyl9LCgpPT5iKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBleGFjdGx5IG9uZSBvZiB0aGUgc2V0cy4pXCJ9LHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZTp7JG1ldGgoYSl7U2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8KGE9dGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSk7XG5yZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT50aGlzLnNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUoYSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJVcGRhdGUgYSBzZXQgd2l0aCB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgaXRzZWxmIGFuZCBhbm90aGVyLlwifSx1bmlvbjp7JG1ldGgoLi4uYSl7Y29uc3QgYj10aGlzLnNldCRjb3B5KCk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLGE9PmIuc2V0JHVwZGF0ZShhKSksKCk9PmIpfSwkZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSB1bmlvbiBvZiBzZXRzIGFzIGEgbmV3IHNldC5cXG5cXG4oaS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gZWl0aGVyIHNldC4pXCJ9LHVwZGF0ZTp7JG1ldGgoLi4uYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLFxuYT0+dGhpcy5zZXQkdXBkYXRlKGEpKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSB1bmlvbiBvZiBpdHNlbGYgYW5kIG90aGVycy5cIn19LHByb3RvOk9iamVjdC5hc3NpZ24obSx7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2skYXNhcnJheSgpfSxnZXQkc2l6ZSgpe3JldHVybiB0aGlzLnYuc3EkbGVuZ3RoKCl9LHNldCRhZGQoYSl7dGhpcy52Lm1wJGFzc19zdWJzY3JpcHQoYSwhMCl9LHNldCRtYWtlX2Jhc2V0eXBlKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKSxhPT5uZXcgdGhpcy5zayRidWlsdGluQmFzZShhKSl9LHNldCRkaXNjYXJkKGEpe3JldHVybiB0aGlzLnYucG9wJGl0ZW0oYSl9LHNldCRjbGVhcigpe3RoaXMudj1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKX0sc2V0JGNvcHkoKXtjb25zdCBhPVxubmV3IHRoaXMuc2skYnVpbHRpbkJhc2U7YS52PXRoaXMudi5kaWN0JGNvcHkoKTtyZXR1cm4gYX0sc2V0JGRpZmZlcmVuY2VfdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc2V0JGRpc2NhcmQoYSl9KX0sc2V0JGludGVyc2VjdGlvbihhKXtjb25zdCBiPW5ldyB0aGlzLnNrJGJ1aWx0aW5CYXNlO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc3EkY29udGFpbnMoYSkmJmIuc2V0JGFkZChhKX0pLCgpPT5iKX0sc2V0JGludGVyc2VjdGlvbl9tdWx0aSguLi5hKXtpZighYS5sZW5ndGgpcmV0dXJuIHRoaXMuc2V0JGNvcHkoKTtsZXQgYj10aGlzO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT5Tay5taXNjZXZhbC5jaGFpbihiLnNldCRpbnRlcnNlY3Rpb24oYSksYT0+e2I9YX0pKSwoKT0+Yil9LFxuc2V0JGlzc3Vic2V0KGEpe2NvbnN0IGI9dGhpcy5nZXQkc2l6ZSgpLGM9YS5nZXQkc2l6ZSgpO2lmKGI+YylyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZighYS5zcSRjb250YWlucyhjKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkfSxzZXQkc3ltbWV0cmljX2RpZmZfdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3ZvaWQgMD09PXRoaXMuc2V0JGRpc2NhcmQoYSkmJnRoaXMuc2V0JGFkZChhKX0pfSxzZXQkdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc2V0JGFkZChhKX0pfSxzd2FwJGJvZGllcyhhKXt0aGlzLnY9YS52fX0pfSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5zZXRcIixcblNrLmJ1aWx0aW4uc2V0KTtxPVNrLmJ1aWx0aW4uc2V0LnByb3RvdHlwZTtTay5idWlsdGluLmZyb3plbnNldD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZnJvemVuc2V0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPVtdKTtTay5hc3NlcnRzLmFzc2VydChBcnJheS5pc0FycmF5KGEpJiZ0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mcm96ZW5zZXQsXCJiYWQgY2FsbCB0byBmcm96ZW4gc2V0IC0gbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBBcnJheSBhbmQgJ25ldydcIik7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSksYi5wdXNoKCEwKTt0aGlzLnY9bmV3IFNrLmJ1aWx0aW4uZGljdChiKTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19udW1iZXI6ITAsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRkb2M6XCJmcm96ZW5zZXQoKSAtPiBlbXB0eSBmcm96ZW5zZXQgb2JqZWN0XFxuZnJvemVuc2V0KGl0ZXJhYmxlKSAtPiBmcm96ZW5zZXQgb2JqZWN0XFxuXFxuQnVpbGQgYW4gaW1tdXRhYmxlIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIHVuaXF1ZSBlbGVtZW50cy5cIixcbnRwJGhhc2goKXtsZXQgYT0xOTI3ODY4MjM3O2NvbnN0IGI9dGhpcy5zayRhc2FycmF5KCk7YSo9Yi5sZW5ndGgrMTtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKyl7Y29uc3QgZT1Tay5hYnN0ci5vYmplY3RIYXNoKGJbY10pO2FePTM2NDQ3OTgxNjcqKGVeZTw8MTZeODk4Njk3NDcpfXJldHVybiA2OTA2OSphKzkwNzEzMzkyM30sdHAkbmV3KGEsYil7aWYodGhpcyE9PVNrLmJ1aWx0aW4uZnJvemVuc2V0LnByb3RvdHlwZSlyZXR1cm4gdGhpcy4kc3VidHlwZV9uZXcoYSxiKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwiZnJvemVuc2V0XCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwiZnJvemVuc2V0XCIsYSwwLDEpO2E9YVswXTtyZXR1cm4gdm9pZCAwIT09YSYmYS5vYiR0eXBlPT09U2suYnVpbHRpbi5mcm96ZW5zZXQ/YTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKSxhPT5hLmxlbmd0aD9uZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQoYSk6XG5Tay5idWlsdGluLmZyb3plbnNldC4kZW1wdHlzZXQpfSwkcjpxLiRyLHRwJGl0ZXI6cS50cCRpdGVyLHRwJHJpY2hjb21wYXJlOnEudHAkcmljaGNvbXBhcmUsbmIkc3VidHJhY3Q6cS5uYiRzdWJ0cmFjdCxuYiRhbmQ6cS5uYiRhbmQsbmIkb3I6cS5uYiRvcixuYiR4b3I6cS5uYiR4b3Isc3EkbGVuZ3RoOnEuc3EkbGVuZ3RoLHNxJGNvbnRhaW5zOnEuc3EkY29udGFpbnN9LG1ldGhvZHM6e2NvcHk6T2JqZWN0LmFzc2lnbih7fSxxLmNvcHkuZCRkZWYseyRtZXRoKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3I9PT10aGlzLnNrJGJ1aWx0aW5CYXNlP3RoaXM6bmV3IFNrLmJ1aWx0aW4uZnJvemVuc2V0KHRoaXMuc2skYXNhcnJheSgpKX19KSxkaWZmZXJlbmNlOnEuZGlmZmVyZW5jZS5kJGRlZixpbnRlcnNlY3Rpb246cS5pbnRlcnNlY3Rpb24uZCRkZWYsaXNkaXNqb2ludDpxLmlzZGlzam9pbnQuZCRkZWYsaXNzdWJzZXQ6cS5pc3N1YnNldC5kJGRlZixpc3N1cGVyc2V0OnEuaXNzdXBlcnNldC5kJGRlZixcbnN5bW1ldHJpY19kaWZmZXJlbmNlOnEuc3ltbWV0cmljX2RpZmZlcmVuY2UuZCRkZWYsdW5pb246cS51bmlvbi5kJGRlZn0scHJvdG86T2JqZWN0LmFzc2lnbih7JHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYnVpbHRpbi5mcm96ZW5zZXQucHJvdG90eXBlLnRwJG5ldyhhKSxhPT57Yy52PWEudjtyZXR1cm4gY30pfX0sbSl9KTtTay5idWlsdGluLmZyb3plbnNldC4kZW1wdHlzZXQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLmZyb3plbnNldC5wcm90b3R5cGUse3Y6e3ZhbHVlOm5ldyBTay5idWlsdGluLmRpY3QoW10pLGVudW1lcmFibGU6ITB9LGluJHJlcHI6e3ZhbHVlOiExLGVudW1lcmFibGU6ITB9fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5mcm96ZW5zZXRcIixTay5idWlsdGluLmZyb3plbnNldCk7dmFyIGI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwic2V0X2l0ZXJhdG9yXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS5zayRhc2FycmF5KCk7dGhpcy4kb3JpZz1hfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplLG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ucHJpbnQ9ZnVuY3Rpb24oYSxjKXtsZXQgW2IsZSxmXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcInByaW50XCIsW1wic2VwXCIsXCJlbmRcIixcImZpbGVcIixcImZsdXNoXCJdLFtdLGMpO2lmKHZvaWQgMD09PWJ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpKWI9XCIgXCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKWI9Yi4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGIpKTtpZih2b2lkIDA9PT1lfHxTay5idWlsdGluLmNoZWNrTm9uZShlKSllPVwiXFxuXCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGUpKWU9ZS4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImVuZCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShlKSk7bGV0IGw7aWYodm9pZCAwIT09ZiYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpJiYobD1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGYsU2suYnVpbHRpbi5zdHIuJHdyaXRlKSx2b2lkIDA9PT1sKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShmKStcIicgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3dyaXRlJ1wiKTtjb25zdCBoPW5ldyBTay5idWlsdGluLnN0cihhLm1hcChhPT4obmV3IFNrLmJ1aWx0aW4uc3RyKGEpKS50b1N0cmluZygpKS5qb2luKGIpK2UpO1xuaWYodm9pZCAwIT09bClTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkobCxbaF0pO2Vsc2UgcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcInN5c1wiLCExLCEwKSxhPT4obD1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEuJGQuc3Rkb3V0LFNrLmJ1aWx0aW4uc3RyLiR3cml0ZSkpJiZTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkobCxbaF0pKX07U2suYnVpbHRpbi5wcmludC5jb19mYXN0Y2FsbD0xfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubW9kdWxlPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJtb2R1bGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLiRkPXt9fSxzbG90czp7dHAkZG9jOlwiQ3JlYXRlIGEgbW9kdWxlIG9iamVjdC5cXG5cXG5UaGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nOyB0aGUgb3B0aW9uYWwgZG9jIGFyZ3VtZW50IGNhbiBoYXZlIGFueSB0eXBlLlwiLHRwJGdldGF0dHIoYSxjKXt2YXIgYj10aGlzLiRkW2EuJG1hbmdsZWRdO1xuaWYodm9pZCAwIT09YilyZXR1cm4gYjtiPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1iKXtjb25zdCBhPWIudHAkZGVzY3JfZ2V0O3JldHVybiBhP2EuY2FsbChiLHRoaXMsdGhpcy5vYiR0eXBlLGMpOmJ9Y29uc3QgZT10aGlzLiRkLl9fZ2V0YXR0cl9fO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGI9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShlLFthXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSksYz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sdHAkc2V0YXR0cjpTay5nZW5lcmljLnNldEF0dHIsdHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxjKXtjb25zdCBbYixlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcIm1vZHVsZVwiLFtcIm5hbWVcIixcImRvY1wiXSxhLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO1xuU2suYnVpbHRpbi5weUNoZWNrVHlwZShcIm1vZHVsZVwiLFwic3RyaW5nXCIsYik7dGhpcy5pbml0JGRpY3QoYixlKX0sJHIoKXtsZXQgYT10aGlzLmdldCRuYW1lKCk7aWYodm9pZCAwIT09YSl7dmFyIGM9dGhpcy5nZXQkbW9kX3JlcHJmKCk7aWYodm9pZCAwIT09YylyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW3RoaXNdKX1hPXZvaWQgMD09PWE/XCInPydcIjphO2M9dGhpcy5mcm9tJGZpbGUoKTtjPXZvaWQgMD09PWM/dGhpcy5lbXB0eV9vciRsb2FkZXIoKTpjO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8bW9kdWxlIFwiK2ErYytcIj5cIil9fSxnZXRzZXRzOntfX2RpY3RfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5tYXBwaW5ncHJveHkodGhpcy4kZCl9fX0sbWV0aG9kczp7X19kaXJfXzp7JG1ldGgoKXtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kZGljdCk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fZGljdF9fIGlzIG5vdCBhIGRpY3Rpb25hcnlcIik7XG5jb25zdCBjPWEubXAkbG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkaXIpO3JldHVybiB2b2lkIDAhPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFtdKTpuZXcgU2suYnVpbHRpbi5saXN0KFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJfX2Rpcl9fKCkgLT4gbGlzdFxcbnNwZWNpYWxpemVkIGRpcigpIGltcGxlbWVudGF0aW9uXCJ9fSxwcm90bzp7aW5pdCRkaWN0KGEsYyl7dGhpcy4kZC5fX25hbWVfXz1hO3RoaXMuJGQuX19kb2NfXz1jO3RoaXMuJGQuX19wYWNrYWdlX189U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMuJGQuX19zcGVjX189U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMuJGQuX19sb2FkZXJfXz1Tay5idWlsdGluLm5vbmUubm9uZSR9LHNrJGF0dHJFcnJvcigpe2NvbnN0IGE9dGhpcy5nZXQkbmFtZSgpO3JldHVybiB2b2lkIDA9PT1hP1wibW9kdWxlXCI6XCJtb2R1bGUgXCIrYX0sZ2V0JG5hbWUoKXtjb25zdCBhPVxudGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRuYW1lKTtyZXR1cm4gYSYmU2subWlzY2V2YWwub2JqZWN0UmVwcihhKX0sZnJvbSRmaWxlKCl7Y29uc3QgYT10aGlzLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGZpbGUpO3JldHVybiBhJiZcIiBmcm9tIFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYSl9LGVtcHR5X29yJGxvYWRlcigpe2lmKHRoaXMuJGpzJiZ0aGlzLiRqcy5pbmNsdWRlcyhcIiRidWlsdGlubW9kdWxlXCIpKXJldHVyblwiIChidWlsdC1pbilcIjtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbG9hZGVyKTtyZXR1cm4gdm9pZCAwPT09YXx8U2suYnVpbHRpbi5jaGVja05vbmUoYSk/XCJcIjpcIiAoXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIilcIn0sZ2V0JG1vZF9yZXByZigpe2NvbnN0IGE9dGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRsb2FkZXIpO3JldHVybiBhJiZhLnRwJGdldGF0dHIodGhpcy5zdHIkbW9kX3JlcHIpfSxcbnN0ciRtb2RfcmVwcjpuZXcgU2suYnVpbHRpbi5zdHIoXCJtb2R1bGVfcmVwclwiKX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLm1vZHVsZVwiLFNrLmJ1aWx0aW4ubW9kdWxlKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN0cnVjdHNlcV90eXBlcz17fTtTay5idWlsdGluLm1ha2Vfc3RydWN0c2VxPWZ1bmN0aW9uKGEsYyxiLGUpe2NvbnN0IGY9YStcIi5cIitjLGw9W107YT1bXTtmb3IobGV0IGMgaW4gYilsLnB1c2goYyksYS5wdXNoKGJbY10pO2I9e307Zm9yKGxldCBjPTA7YzxsLmxlbmd0aDtjKyspYltsW2NdXT17JGdldCgpe3JldHVybiB0aGlzLnZbY119LCRkb2M6YVtjXX07dmFyIGg9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhmLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgoQXJyYXkuaXNBcnJheShhKXx8dm9pZCAwPT09YSkmJnRoaXMgaW5zdGFuY2VvZiBoKTtTay5idWlsdGluLnR1cGxlLmNhbGwodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLnR1cGxlLFxuc2xvdHM6e3RwJG5ldyhhLGIpe1NrLmFic3RyLmNoZWNrT25lQXJnKGYsYSxiKTtiPVtdO2E9YVswXTtmb3IobGV0IGM9U2suYWJzdHIuaXRlcihhKSxkPWMudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1kO2Q9Yy50cCRpdGVybmV4dCgpKWIucHVzaChkKTtpZihiLmxlbmd0aCE9bC5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGYrXCIoKSB0YWtlcyBhIFwiK2wubGVuZ3RoK1wiLXNlcXVlbmNlIChcIitiLmxlbmd0aCtcIi1zZXF1ZW5jZSBnaXZlbilcIik7cmV0dXJuIG5ldyBoKGIpfSx0cCRkb2M6ZT9lOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCwkcigpe3ZhciBhO2lmKDA9PT10aGlzLnYubGVuZ3RoKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZitcIigpXCIpO3ZhciBiPVtdO2ZvcihhPTA7YTx0aGlzLnYubGVuZ3RoOysrYSliW2FdPWxbYV0rXCI9XCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnZbYV0pO2E9Yi5qb2luKFwiLCBcIik7MT09PXRoaXMudi5sZW5ndGgmJihhKz1cblwiLFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGYrXCIoXCIrYStcIilcIil9fSxtZXRob2RzOntfX3JlZHVjZV9fOnskbWV0aCgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJfX3JlZHVjZV9fIGlzIG5vdCBpbXBsZW1lbnRlZFwiKTt9LCRmbGFnczp7Tm9BcmdzOiEwfX19LGdldHNldHM6Yixwcm90bzp7bnVtX3NlcXVlbmNlX2ZpZWxkczpuZXcgU2suYnVpbHRpbi5pbnRfKGwubGVuZ3RoKX19KTtyZXR1cm4gaH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYWtlX3N0cnVjdHNlcVwiLFNrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXEpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZ2VuZXJhdG9yPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImdlbmVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYixlLGYpe3ZhciBsO2lmKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZ2VuZXJhdG9yKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFkIGludGVybmFsIGNhbGwgdG8gZ2VuZXJhdG9yLCB1c2UgJ25ldydcIik7XG50aGlzLmZ1bmNfY29kZT1hO3RoaXMuZnVuY19nbG9iYWxzPWN8fG51bGw7dGhpcy5naSRydW5uaW5nPSExO3RoaXMuZ2kkcmVzdW1lYXQ9MDt0aGlzLmdpJHNlbnR2YWx1ZT12b2lkIDA7dGhpcy5naSRsb2NhbHM9e307dGhpcy5naSRjZWxscz17fTtpZigwPGIubGVuZ3RoKWZvcihjPTA7YzxhLmNvX3Zhcm5hbWVzLmxlbmd0aDsrK2MpdGhpcy5naSRsb2NhbHNbYS5jb192YXJuYW1lc1tjXV09YltjXTtpZih2b2lkIDAhPT1mKWZvcihsIGluIGYpZVtsXT1mW2xdO3RoaXMuZnVuY19jbG9zdXJlPWV9fSxzbG90czp7JHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGdlbmVyYXRvciBvYmplY3QgXCIrdGhpcy5mdW5jX2NvZGUuY29fbmFtZS52K1wiPlwiKX19LGl0ZXJuZXh0KGEsYyl7dmFyIGI9dGhpczt0aGlzLmdpJHJ1bm5pbmc9ITA7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt0aGlzLmdpJHNlbnR2YWx1ZT1jO2M9W3RoaXNdO3RoaXMuZnVuY19jbG9zdXJlJiZcbmMucHVzaCh0aGlzLmZ1bmNfY2xvc3VyZSk7cmV0dXJuIGZ1bmN0aW9uIGwoYyl7aWYoYyBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pe2lmKGEpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKGwsYyk7Yz1Tay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9Yi5naSRydW5uaW5nPSExO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWMpO2lmKGMhPT1Tay5idWlsdGluLm5vbmUubm9uZSQpcmV0dXJuIGIuZ2kkcmVzdW1lYXQ9Y1swXSxjPWNbMV19KHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGMpKX0sbWV0aG9kczp7c2VuZDp7JG1ldGgoYSl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoITAsYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwic2VuZChhcmcpIC0+IHNlbmQgJ2FyZycgaW50byBnZW5lcmF0b3IsXFxucmV0dXJuIG5leHQgeWllbGRlZCB2YWx1ZSBvciByYWlzZSBTdG9wSXRlcmF0aW9uLlwifX19KTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZ2VuZXJhdG9yXCIsU2suYnVpbHRpbi5nZW5lcmF0b3IpO1NrLmJ1aWx0aW4ubWFrZUdlbmVyYXRvcj1mdW5jdGlvbihhLGMpe3ZhciBiLGU9bmV3IFNrLmJ1aWx0aW4uZ2VuZXJhdG9yKG51bGwsbnVsbCxudWxsKTtlLnRwJGl0ZXJuZXh0PWE7Zm9yKGIgaW4gYyljLmhhc093blByb3BlcnR5KGIpJiYoZVtiXT1jW2JdKTtyZXR1cm4gZX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yXCIsU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZpbGU9ZnVuY3Rpb24oYSxjLGIpe3ZhciBlO2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmlsZSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmZpbGUoYSxjLGIpO3RoaXMubW9kZT1jO3RoaXMubmFtZT1Tay5mZmkucmVtYXBUb0pzKGEpO3RoaXMuY2xvc2VkPSExO2lmKFwiL2Rldi9zdGRvdXRcIj09PXRoaXMubmFtZSl0aGlzLmRhdGEkPVxuU2suYnVpbHRpbi5ub25lLm5vbmUkLHRoaXMuZmlsZW5vPTE7ZWxzZSBpZihcIi9kZXYvc3RkaW5cIj09PXRoaXMubmFtZSl0aGlzLmZpbGVubz0wO2Vsc2UgaWYoXCIvZGV2L3N0ZGVyclwiPT09dGhpcy5uYW1lKXRoaXMuZmlsZW5vPTI7ZWxzZXtpZihcIndcIj09PVNrLmZmaS5yZW1hcFRvSnModGhpcy5tb2RlKSl0aGlzLmZpbGVubz1Tay5idWlsdGluLmZpbGUuY3VycmVudEZpbGVubysrO2Vsc2UgZm9yKGUgaW4gdGhpcy5maWxlbm89U2suaW5Ccm93c2VyPzEwOjExLHRoaXMuZGF0YSQ9U2sucmVhZChhLnYpLHRoaXMubGluZUxpc3Q9dGhpcy5kYXRhJC5zcGxpdChcIlxcblwiKSx0aGlzLmxpbmVMaXN0PXRoaXMubGluZUxpc3Quc2xpY2UoMCwtMSksdGhpcy5saW5lTGlzdCl0aGlzLmxpbmVMaXN0W2VdKz1cIlxcblwiO3RoaXMuY3VycmVudExpbmU9MH10aGlzLnBvcyQ9MDtTay5maWxlb3BlbiYmMTA8PXRoaXMuZmlsZW5vJiZTay5maWxlb3Blbih0aGlzKTtyZXR1cm4gdGhpc307U2suYnVpbHRpbi5maWxlLmN1cnJlbnRGaWxlbm89XG4xMjtTay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlKFwiZmlsZVwiLFNrLmJ1aWx0aW4uZmlsZSxTay5idWlsdGluLm9iamVjdCk7U2suYWJzdHIuc2V0VXBCdWlsdGluTXJvKFNrLmJ1aWx0aW4uZmlsZSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS4kcj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8XCIrKHRoaXMuY2xvc2VkP1wiY2xvc2VkXCI6XCJvcGVuXCIpK1wiZmlsZSAnXCIrdGhpcy5uYW1lK1wiJywgbW9kZSAnXCIrU2suZmZpLnJlbWFwVG9Kcyh0aGlzLm1vZGUpK1wiJz5cIil9O1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUudHAkaXRlcj1mdW5jdGlvbigpe3ZhciBhPXt0cCRpdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LCRvYmo6dGhpcywkaW5kZXg6dGhpcy5jdXJyZW50TGluZSwkbGluZXM6dGhpcy5saW5lTGlzdCx0cCRpdGVybmV4dDpmdW5jdGlvbigpe2lmKCEoYS4kaW5kZXg+PWEuJGxpbmVzLmxlbmd0aCkpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhLiRsaW5lc1thLiRpbmRleCsrXSl9fTtcbnJldHVybiBhfTtTay5hYnN0ci5zZXRVcFNsb3RzKFNrLmJ1aWx0aW4uZmlsZSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5fX2VudGVyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gYX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuX19leGl0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuY2xvc2UsW2FdKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuY2xvc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLmNsb3NlZD0hMDtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5mbHVzaD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe30pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuZmlsZW5vPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZmlsZW5vfSk7XG5Tay5idWlsdGluLmZpbGUucHJvdG90eXBlLmlzYXR0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiExfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5yZWFkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgYj1hLmRhdGEkLmxlbmd0aDtpZihhLmNsb3NlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVwiKTt2YXIgZT12b2lkIDA9PT1jP2I6U2suZmZpLnJlbWFwVG9KcyhjKTtlPW5ldyBTay5idWlsdGluLnN0cihhLmRhdGEkLnN1YnN0cihhLnBvcyQsZSkpO2EucG9zJD12b2lkIDA9PT1jP2I6YS5wb3MkK1NrLmZmaS5yZW1hcFRvSnMoYyk7YS5wb3MkPj1iJiYoYS5wb3MkPWIpO3JldHVybiBlfSk7U2suYnVpbHRpbi5maWxlLiRyZWFkbGluZT1mdW5jdGlvbihhLGMsYil7aWYoMD09PWEuZmlsZW5vKXthPVNrLmZmaS5yZW1hcFRvSnMoYik7YT1Tay5pbnB1dGZ1bihhP1xuYTpcIlwiKTtpZihhIGluc3RhbmNlb2YgUHJvbWlzZXx8YSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGEudGhlbil7dmFyIGU9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247ZS5yZXN1bWU9ZnVuY3Rpb24oKXtpZihlLmRhdGEuZXJyb3IpdGhyb3cgZS5kYXRhLmVycm9yO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZS5kYXRhLnJlc3VsdCl9O2UuZGF0YT17dHlwZTpcIlNrLnByb21pc2VcIixwcm9taXNlOmF9O3JldHVybiBlfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9Yz1cIlwiO2EuY3VycmVudExpbmU8YS5saW5lTGlzdC5sZW5ndGgmJihjPWEubGluZUxpc3RbYS5jdXJyZW50TGluZV0sYS5jdXJyZW50TGluZSsrKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpfTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLnJlYWRsaW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXtyZXR1cm4gU2suYnVpbHRpbi5maWxlLiRyZWFkbGluZShhLGMsdm9pZCAwKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUucmVhZGxpbmVzPVxubmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe2lmKDA9PT1hLmZpbGVubylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcInJlYWRsaW5lcyBpbnMndCBpbXBsZW1lbnRlZCBiZWNhdXNlIHRoZSB3ZWIgZG9lc24ndCBzdXBwb3J0IEN0cmwrRFwiKTt2YXIgYj1bXTtmb3IoYz1hLmN1cnJlbnRMaW5lO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYS5saW5lTGlzdFtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5zZWVrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGIpe2M9U2suZmZpLnJlbWFwVG9KcyhjKTt2b2lkIDA9PT1iJiYoYj0wKTswPT09Yj9hLnBvcyQ9YzoxPT1iP2EucG9zJD1hLmRhdGEkLmxlbmd0aCtjOjI9PWImJihhLnBvcyQ9YS5kYXRhJC5sZW5ndGgrYyk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pO1xuU2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS50ZWxsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoYS5wb3MkKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUudHJ1bmNhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuZmFpbCgpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS53cml0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7dmFyIGI9U2suZmZpLnJlbWFwVG9KcyhhLm1vZGUpO1NrLmZmaS5yZW1hcFRvSnMoYyk7aWYoXCJ3XCI9PT1ifHxcIndiXCI9PT1ifHxcImFcIj09PWJ8fFwiYWJcIj09PWIpaWYoU2suZmlsZXdyaXRlKXtpZihhLmNsb3NlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVwiKTsxPT09YS5maWxlbm8/U2sub3V0cHV0KFNrLmZmaS5yZW1hcFRvSnMoYykpOlNrLmZpbGV3cml0ZShhLGMpfWVsc2UgMT09PVxuYS5maWxlbm8/U2sub3V0cHV0KFNrLmZmaS5yZW1hcFRvSnMoYykpOlNrLmFzc2VydHMuZmFpbCgpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmZpbGVcIixTay5idWlsdGluLmZpbGUpfSxmdW5jdGlvbihtLHEpe1NrLmZmaT1Tay5mZml8fHt9O1NrLmZmaS5yZW1hcFRvUHk9ZnVuY3Rpb24oYSl7dmFyIGM7aWYobnVsbD09PWF8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYSlyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO2lmKGEub2IkdHlwZXx8YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIGE7aWYoXCJbb2JqZWN0IEFycmF5XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKXt2YXIgYj1bXTtmb3IoYz0wO2M8YS5sZW5ndGg7KytjKWIucHVzaChTay5mZmkucmVtYXBUb1B5KGFbY10pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX1pZihcIm9iamVjdFwiPT09dHlwZW9mIGEpe2I9XG5bXTtmb3IoYyBpbiBhKWIucHVzaChTay5mZmkucmVtYXBUb1B5KGMpKSxiLnB1c2goU2suZmZpLnJlbWFwVG9QeShhW2NdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmRpY3QoYil9aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLmFzc2skKGEpO2lmKFwiYm9vbGVhblwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYSk7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSQ7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZ1bmMoYSk7U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIHJlbWFwIHR5cGUgXCIrdHlwZW9mIGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkucmVtYXBUb1B5XCIsU2suZmZpLnJlbWFwVG9QeSk7U2suZmZpLnJlbWFwVG9Kcz1mdW5jdGlvbihhKXt2YXIgYyxcbmI7aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCl7dmFyIGU9e307YS4kaXRlbXMoKS5mb3JFYWNoKChbYSxjXSk9PntiPVNrLmZmaS5yZW1hcFRvSnMoYSk7ZVtiXT1Tay5mZmkucmVtYXBUb0pzKGMpfSk7cmV0dXJuIGV9aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdHx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpe2U9W107Zm9yKGM9MDtjPGEudi5sZW5ndGg7KytjKWUucHVzaChTay5mZmkucmVtYXBUb0pzKGEudltjXSkpO3JldHVybiBlfWlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJvb2wpcmV0dXJuIGEudj8hMDohMTtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU2suYnVpbHRpbi5hc251bSQoYSk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhfHxcImJvb2xlYW5cIj09PXR5cGVvZiBhfHxcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIGE7XG5pZih2b2lkIDAhPT1hKXJldHVybiBhLnZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5yZW1hcFRvSnNcIixTay5mZmkucmVtYXBUb0pzKTtTay5mZmkuY2FsbGJhY2s9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/YTpmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSl9fTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkuY2FsbGJhY2tcIixTay5mZmkuY2FsbGJhY2spO1NrLmZmaS5zdGR3cmFwPWZ1bmN0aW9uKGEsYyl7YT1uZXcgYTthLnY9YztyZXR1cm4gYX07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnN0ZHdyYXBcIixTay5mZmkuc3Rkd3JhcCk7U2suZmZpLmJhc2ljd3JhcD1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU2suYnVpbHRpbi5hc251bSQoYSk7XG5pZihcIm51bWJlclwiPT09dHlwZW9mIGF8fFwiYm9vbGVhblwiPT09dHlwZW9mIGEpcmV0dXJuIGE7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSk7U2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCB0eXBlIGZvciBiYXNpY3dyYXBcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5iYXNpY3dyYXBcIixTay5mZmkuYmFzaWN3cmFwKTtTay5mZmkudW53cmFwbz1mdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKXJldHVybiBhLnZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS51bndyYXBvXCIsU2suZmZpLnVud3JhcG8pO1NrLmZmaS51bndyYXBuPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YT9udWxsOmEudn07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnVud3JhcG5cIixTay5mZmkudW53cmFwbil9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsZSl7YT12b2lkIDA9PT1hP2E6U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSk7Yj12b2lkIDA9PT1cbmI/YjpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKTtlPXZvaWQgMD09PWU/ZTpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhlKTtpZih2b2lkIDA9PT1iJiZ2b2lkIDA9PT1lKWI9YSxhPTAsZT0xO2Vsc2UgaWYodm9pZCAwPT09ZSllPTE7ZWxzZSBpZigwPT09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicmFuZ2UoKSBzdGVwIGFyZ3VtZW50IG11c3Qgbm90IGJlIHplcm9cIik7Y29uc3QgZD1bXTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEmJlwibnVtYmVyXCI9PT10eXBlb2YgYiYmXCJudW1iZXJcIj09PXR5cGVvZiBlKWlmKDA8ZSlmb3IodmFyIGY9YTtmPGI7Zis9ZSlkLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhmKSk7ZWxzZSBmb3IoZj1hO2Y+YjtmKz1lKWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGYpKTtlbHNle2E9Zj1KU0JJLkJpZ0ludChhKTtlPUpTQkkuQmlnSW50KGUpO2I9SlNCSS5CaWdJbnQoYik7aWYoSlNCSS5ncmVhdGVyVGhhbihlLEpTQkkuX19aRVJPKSlmb3IoO0pTQkkubGVzc1RoYW4oZixcbmIpOylkLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhjKGYpKSksZj1KU0JJLmFkZChmLGUpO2Vsc2UgZm9yKDtKU0JJLmdyZWF0ZXJUaGFuKGYsYik7KWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGMoZikpKSxmPUpTQkkuYWRkKGYsZSk7YT1jKGEpO2U9YyhlKTtiPWMoYil9cmV0dXJuIG5ldyBTay5idWlsdGluLnJhbmdlXyhhLGIsZSxkKX1mdW5jdGlvbiBjKGEpe3JldHVybiBKU0JJLmxlc3NUaGFuKGEsSlNCSS5fX01BWF9TQUZFKSYmSlNCSS5ncmVhdGVyVGhhbihhLEpTQkkuX19NSU5fU0FGRSk/SlNCSS50b051bWJlcihhKTphfVNrLmJ1aWx0aW4ucmFuZ2VfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJyYW5nZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIsYyxkKXt0aGlzLnN0YXJ0PWE7dGhpcy5zdG9wPWI7dGhpcy5zdGVwPWM7dGhpcy52PWR9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLFxudHAkZG9jOlwicmFuZ2Uoc3RvcCkgLT4gcmFuZ2Ugb2JqZWN0XFxucmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSkgLT4gcmFuZ2Ugb2JqZWN0XFxuXFxuUmV0dXJuIGFuIG9iamVjdCB0aGF0IHByb2R1Y2VzIGEgc2VxdWVuY2Ugb2YgaW50ZWdlcnMgZnJvbSBzdGFydCAoaW5jbHVzaXZlKVxcbnRvIHN0b3AgKGV4Y2x1c2l2ZSkgYnkgc3RlcC4gIHJhbmdlKGksIGopIHByb2R1Y2VzIGksIGkrMSwgaSsyLCAuLi4sIGotMS5cXG5zdGFydCBkZWZhdWx0cyB0byAwLCBhbmQgc3RvcCBpcyBvbWl0dGVkISAgcmFuZ2UoNCkgcHJvZHVjZXMgMCwgMSwgMiwgMy5cXG5UaGVzZSBhcmUgZXhhY3RseSB0aGUgdmFsaWQgaW5kaWNlcyBmb3IgYSBsaXN0IG9mIDQgZWxlbWVudHMuXFxuV2hlbiBzdGVwIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCAob3IgZGVjcmVtZW50KS5cIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwicmFuZ2VcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJyYW5nZVwiLFxuYiwxLDMpO3JldHVybiBhKGJbMF0sYlsxXSxiWzJdKX0sJHIoKXtsZXQgYT1cInJhbmdlKFwiK3RoaXMuc3RhcnQrXCIsIFwiK3RoaXMuc3RvcDsxIT10aGlzLnN0ZXAmJihhKz1cIiwgXCIrdGhpcy5zdGVwKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGErXCIpXCIpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKFwiRXFcIiE9PWImJlwiTm90RXFcIiE9PWJ8fGEub2IkdHlwZSE9PVNrLmJ1aWx0aW4ucmFuZ2VfKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPW5ldyBTay5idWlsdGluLmxpc3QoYS52KTtyZXR1cm4obmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYpKS50cCRyaWNoY29tcGFyZShhLGIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfSxuYiRib29sKCl7cmV0dXJuIDAhPT10aGlzLnYubGVuZ3RofSxzcSRjb250YWlucyhhKXtjb25zdCBiPXRoaXMudjtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKylpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxcbmJbY10sXCJFcVwiKSlyZXR1cm4hMDtyZXR1cm4hMX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTswPmEmJihhPXRoaXMudi5sZW5ndGgrYSk7aWYoMD5hfHxhPj10aGlzLnYubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXCJyYW5nZSBvYmplY3QgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiB0aGlzLnZbYV19aWYoYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W10sYz10aGlzLnY7YS5zc3NpdGVyJChjLmxlbmd0aCxhPT57Yi5wdXNoKGNbYV0pfSk7bGV0IHtzdGFydDpkLHN0b3A6ZSxzdGVwOmZ9PWEuc2xpY2UkaW5kaWNlcyhjLmxlbmd0aCk7ZD1Tay5taXNjZXZhbC5hc0luZGV4KGNbZF0pfHx0aGlzLnN0YXJ0O2U9U2subWlzY2V2YWwuYXNJbmRleChjW2VdKXx8dGhpcy5zdG9wO2Y9XG5cIm51bWJlclwiPT09dHlwZW9mIHRoaXMuc3RlcD9mKnRoaXMuc3RlcDpKU0JJLm11bHRpcGx5KHRoaXMuc3RlcCxKU0JJLkJpZ0ludChmKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnJhbmdlXyhkLGUsZixiKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJyYW5nZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO319LGdldHNldHM6e3N0YXJ0OnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5zdGFydCl9fSxzdGVwOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5zdGVwKX19LHN0b3A6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnN0b3ApfX19LG1ldGhvZHM6e19fcmV2ZXJzZWRfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IGUodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yLlwifSxcbmNvdW50OnskbWV0aChhKXtsZXQgYj0wO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsdGhpcy52W2NdLFwiRXFcIikmJmIrKztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcInJhbmdlb2JqZWN0LmNvdW50KHZhbHVlKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWVcIn0saW5kZXg6eyRtZXRoKGEpe2ZvcihsZXQgYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspaWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsdGhpcy52W2JdLFwiRXFcIikpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiaXMgbm90IGluIHJhbmdlXCIpO30sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcInJhbmdlb2JqZWN0LmluZGV4KHZhbHVlLCBbc3RhcnQsIFtzdG9wXV0pIC0+IGludGVnZXIgLS0gcmV0dXJuIGluZGV4IG9mIHZhbHVlLlxcblJhaXNlIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifX0sXG5wcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2xpY2UoMCl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO3ZhciBiPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInJhbmdlX2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEudn0saXRlcm5leHQoKXtyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KSxlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInJhbmdlX3JldmVyc2VpdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRzZXE9YS52O3RoaXMuJGluZGV4PXRoaXMuJHNlcS5sZW5ndGgtMX0saXRlcm5leHQoKXtyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4LS1dfSxcbm1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLnJhbmdlPVNrLmJ1aWx0aW4ueHJhbmdlPWZ1bmN0aW9uKGIsYyxlKXtiPWEoYixjLGUpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIudil9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZW51bWVyYXRlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImVudW1lcmF0ZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZW51bWVyYXRlKSl0aHJvdyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdlbnVtZXJhdGUnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvclwiKTt0aGlzLiRpdGVyYWJsZT1hO3RoaXMuJGluZGV4PWM7cmV0dXJuIHRoaXN9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9U2subWlzY2V2YWwuY2hhaW4odGhpcy4kaXRlcmFibGUudHAkaXRlcm5leHQoYSksXG5hPT57aWYodm9pZCAwIT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8odGhpcy4kaW5kZXgrKyksYV0pfSk7cmV0dXJuIGE/YzpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9LHNsb3RzOnt0cCRkb2M6XCJSZXR1cm4gYW4gZW51bWVyYXRlIG9iamVjdC5cXG5cXG4gIGl0ZXJhYmxlXFxuICAgIGFuIG9iamVjdCBzdXBwb3J0aW5nIGl0ZXJhdGlvblxcblxcblRoZSBlbnVtZXJhdGUgb2JqZWN0IHlpZWxkcyBwYWlycyBjb250YWluaW5nIGEgY291bnQgKGZyb20gc3RhcnQsIHdoaWNoXFxuZGVmYXVsdHMgdG8gemVybykgYW5kIGEgdmFsdWUgeWllbGRlZCBieSB0aGUgaXRlcmFibGUgYXJndW1lbnQuXFxuXFxuZW51bWVyYXRlIGlzIHVzZWZ1bCBmb3Igb2J0YWluaW5nIGFuIGluZGV4ZWQgbGlzdDpcXG4gICAgKDAsIHNlcVswXSksICgxLCBzZXFbMV0pLCAoMiwgc2VxWzJdKSwgLi4uXCIsdHAkbmV3KGEsYyl7bGV0IFtiLFxuZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJlbnVtZXJhdGVcIixbXCJpdGVyYWJsZVwiLFwic3RhcnRcIl0sYSxjLFtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSk7Yj1Tay5hYnN0ci5pdGVyKGIpO2U9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coZSk7aWYodGhpcz09PVNrLmJ1aWx0aW4uZW51bWVyYXRlLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZW51bWVyYXRlKGIsZSk7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmVudW1lcmF0ZS5jYWxsKGEsYixlKTtyZXR1cm4gYX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5lbnVtZXJhdGVcIixTay5idWlsdGluLmVudW1lcmF0ZSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5maWx0ZXJfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImZpbHRlclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe3RoaXMuJGZ1bmM9YTt0aGlzLiRpdGVyYWJsZT1jfSxpdGVybmV4dChhKXtjb25zdCBjPVxuU2subWlzY2V2YWwuaXRlckZvcih0aGlzLiRpdGVyYWJsZSxhPT5Tay5taXNjZXZhbC5jaGFpbih0aGlzLmNoZWNrJGZpbHRlcihhKSxhPT5hP25ldyBTay5taXNjZXZhbC5CcmVhayhhKTp2b2lkIDApKTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX0sc2xvdHM6e3RwJGRvYzpcIlJldHVybiBhbiBpdGVyYXRvciB5aWVsZGluZyB0aG9zZSBpdGVtcyBvZiBpdGVyYWJsZSBmb3Igd2hpY2ggZnVuY3Rpb24oaXRlbSlcXG5pcyB0cnVlLiBJZiBmdW5jdGlvbiBpcyBOb25lLCByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIHRydWUuXCIsdHAkbmV3KGEsYyl7bGV0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiZmlsdGVyXCIsW1wicHJlZGljYXRlXCIsXCJpdGVyYWJsZVwiXSxhLGMsW10pO2I9U2suYnVpbHRpbi5jaGVja05vbmUoYik/bnVsbDpiO2U9U2suYWJzdHIuaXRlcihlKTtpZih0aGlzPT09U2suYnVpbHRpbi5maWx0ZXJfLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmlsdGVyXyhiLFxuZSk7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmZpbHRlcl8uY2FsbChhLGIsZSk7cmV0dXJuIGF9fSxwcm90bzp7Y2hlY2skZmlsdGVyKGEpe2xldCBjO2M9bnVsbD09PXRoaXMuJGZ1bmM/YTpTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkodGhpcy4kZnVuYyxbYV0pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGI9PlNrLm1pc2NldmFsLmlzVHJ1ZShiKT9hOnZvaWQgMCl9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZmlsdGVyX1wiLFNrLmJ1aWx0aW4uZmlsdGVyXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5tYXBfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIm1hcFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe3RoaXMuJGZ1bmM9YTt0aGlzLiRpdGVycz1jfSxpdGVybmV4dChhKXtjb25zdCBjPVtdLGI9U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KHRoaXMuJGl0ZXJzLGI9PlNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoYSksXG5hPT57aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTtjLnB1c2goYSl9KSksYT0+YT92b2lkIDA6U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KHRoaXMuJGZ1bmMsYykpO3JldHVybiBhP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfSxzbG90czp7dHAkZG9jOlwibWFwKGZ1bmMsICppdGVyYWJsZXMpIC0tXFx4M2UgbWFwIG9iamVjdFxcblxcbk1ha2UgYW4gaXRlcmF0b3IgdGhhdCBjb21wdXRlcyB0aGUgZnVuY3Rpb24gdXNpbmcgYXJndW1lbnRzIGZyb21cXG5lYWNoIG9mIHRoZSBpdGVyYWJsZXMuICBTdG9wcyB3aGVuIHRoZSBzaG9ydGVzdCBpdGVyYWJsZSBpcyBleGhhdXN0ZWQuXCIsdHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4ubWFwXy5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJtYXBcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJtYXBcIixhLDIpO2M9YVswXTtjb25zdCBiPVxuW107Zm9yKGxldCBjPTE7YzxhLmxlbmd0aDtjKyspYi5wdXNoKFNrLmFic3RyLml0ZXIoYVtjXSkpO2lmKHRoaXM9PT1Tay5idWlsdGluLm1hcF8ucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5tYXBfKGMsYik7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLm1hcF8uY2FsbChhLGMsYik7cmV0dXJuIGF9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ubWFwX1wiLFNrLmJ1aWx0aW4ubWFwXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5yZXZlcnNlZD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJyZXZlcnNlZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpZHg9YS5zcSRsZW5ndGgoKS0xO3RoaXMuJHNlcT1hO3JldHVybiB0aGlzfSxpdGVybmV4dChhKXtpZighKDA+dGhpcy4kaWR4KSl7dmFyIGM9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLmFic3RyLm9iamVjdEdldEl0ZW0odGhpcy4kc2VxLG5ldyBTay5idWlsdGluLmludF8odGhpcy4kaWR4LS0pLFxuYSksYT0+e2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkluZGV4RXJyb3IpdGhpcy4kaWR4PS0xO2Vsc2UgdGhyb3cgYTt9KTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX19LHNsb3RzOnt0cCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gc2VxdWVuY2UuXCIsdHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4ucmV2ZXJzZWQucHJvdG90eXBlJiZTay5hYnN0ci5jaGVja05vS3dhcmdzKFwicmV2ZXJzZWRcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJyZXZlcnNlZFwiLGEsMSwxKTthPWFbMF07Yz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJHJldmVyc2VkKTtpZih2b2lkIDAhPT1jKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYyxbXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZShhKXx8dm9pZCAwPT09U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFxuU2suYnVpbHRpbi5zdHIuJGxlbikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGEgc2VxdWVuY2VcIik7aWYodGhpcz09PVNrLmJ1aWx0aW4ucmV2ZXJzZWQucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5yZXZlcnNlZChhKTtjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4ucmV2ZXJzZWQuY2FsbChjLGEpO3JldHVybiBjfX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiAwPD10aGlzLiRpZHg/bmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpZHgpOm5ldyBTay5idWlsdGluLmludF8oMCl9LCRmbGFnczp7Tm9BcmdzOiEwfX19fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi56aXBfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInppcFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpdGVycz1hOzA9PT1hLmxlbmd0aCYmXG4odGhpcy50cCRpdGVybmV4dD0oKT0+e30pfSxpdGVybmV4dChhKXtjb25zdCBjPVtdLGI9U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KHRoaXMuJGl0ZXJzLGI9PlNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoYSksYT0+e2lmKHZvaWQgMD09PWEpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayghMCk7Yy5wdXNoKGEpfSkpLGE9PmE/dm9pZCAwOm5ldyBTay5idWlsdGluLnR1cGxlKGMpKTtyZXR1cm4gYT9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sc2xvdHM6e3RwJGRvYzpcInppcChpdGVyMSBbLGl0ZXIyIFsuLi5dXSkgLS1cXHgzZSB6aXAgb2JqZWN0XFxuXFxuUmV0dXJuIGEgemlwIG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBhIHR1cGxlIHdoZXJlXFxudGhlIGktdGggZWxlbWVudCBjb21lcyBmcm9tIHRoZSBpLXRoIGl0ZXJhYmxlIGFyZ3VtZW50LiAgVGhlIC5fX25leHRfXygpXFxubWV0aG9kIGNvbnRpbnVlcyB1bnRpbCB0aGUgc2hvcnRlc3QgaXRlcmFibGUgaW4gdGhlIGFyZ3VtZW50IHNlcXVlbmNlXFxuaXMgZXhoYXVzdGVkIGFuZCB0aGVuIGl0IHJhaXNlcyBTdG9wSXRlcmF0aW9uLlwiLFxudHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4uemlwXy5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJ6aXBcIixjKTtjPVtdO2ZvcihsZXQgYj0wO2I8YS5sZW5ndGg7YisrKXRyeXtjLnB1c2goU2suYWJzdHIuaXRlcihhW2JdKSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uVHlwZUVycm9yKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInppcCBhcmd1bWVudCAjXCIrKGIrMSkrXCIgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvblwiKTt0aHJvdyBlO31pZih0aGlzPT09U2suYnVpbHRpbi56aXBfLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uemlwXyhjKTthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4uemlwXy5jYWxsKGEsYyk7cmV0dXJuIGF9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uemlwX1wiLFNrLmJ1aWx0aW4uemlwXyl9LGZ1bmN0aW9uKG0scSl7dmFyIGE9e1RfRU5ETUFSS0VSOjAsVF9OQU1FOjEsXG5UX05VTUJFUjoyLFRfU1RSSU5HOjMsVF9ORVdMSU5FOjQsVF9JTkRFTlQ6NSxUX0RFREVOVDo2LFRfTFBBUjo3LFRfUlBBUjo4LFRfTFNRQjo5LFRfUlNRQjoxMCxUX0NPTE9OOjExLFRfQ09NTUE6MTIsVF9TRU1JOjEzLFRfUExVUzoxNCxUX01JTlVTOjE1LFRfU1RBUjoxNixUX1NMQVNIOjE3LFRfVkJBUjoxOCxUX0FNUEVSOjE5LFRfTEVTUzoyMCxUX0dSRUFURVI6MjEsVF9FUVVBTDoyMixUX0RPVDoyMyxUX1BFUkNFTlQ6MjQsVF9MQlJBQ0U6MjUsVF9SQlJBQ0U6MjYsVF9FUUVRVUFMOjI3LFRfTk9URVFVQUw6MjgsVF9MRVNTRVFVQUw6MjksVF9HUkVBVEVSRVFVQUw6MzAsVF9USUxERTozMSxUX0NJUkNVTUZMRVg6MzIsVF9MRUZUU0hJRlQ6MzMsVF9SSUdIVFNISUZUOjM0LFRfRE9VQkxFU1RBUjozNSxUX1BMVVNFUVVBTDozNixUX01JTkVRVUFMOjM3LFRfU1RBUkVRVUFMOjM4LFRfU0xBU0hFUVVBTDozOSxUX1BFUkNFTlRFUVVBTDo0MCxUX0FNUEVSRVFVQUw6NDEsVF9WQkFSRVFVQUw6NDIsXG5UX0NJUkNVTUZMRVhFUVVBTDo0MyxUX0xFRlRTSElGVEVRVUFMOjQ0LFRfUklHSFRTSElGVEVRVUFMOjQ1LFRfRE9VQkxFU1RBUkVRVUFMOjQ2LFRfRE9VQkxFU0xBU0g6NDcsVF9ET1VCTEVTTEFTSEVRVUFMOjQ4LFRfQVQ6NDksVF9BVEVRVUFMOjUwLFRfUkFSUk9XOjUxLFRfRUxMSVBTSVM6NTIsVF9PUDo1MyxUX0FXQUlUOjU0LFRfQVNZTkM6NTUsVF9FUlJPUlRPS0VOOjU2LFRfTlRfT0ZGU0VUOjI1NixUX05fVE9LRU5TOjYwLFRfQ09NTUVOVDo1NyxUX05MOjU4LFRfRU5DT0RJTkc6NTl9O209e1wiIT1cIjphLlRfTk9URVFVQUwsXCIlXCI6YS5UX1BFUkNFTlQsXCIlPVwiOmEuVF9QRVJDRU5URVFVQUwsXCImXCI6YS5UX0FNUEVSLFwiJj1cIjphLlRfQU1QRVJFUVVBTCxcIihcIjphLlRfTFBBUixcIilcIjphLlRfUlBBUixcIipcIjphLlRfU1RBUixcIioqXCI6YS5UX0RPVUJMRVNUQVIsXCIqKj1cIjphLlRfRE9VQkxFU1RBUkVRVUFMLFwiKj1cIjphLlRfU1RBUkVRVUFMLFwiK1wiOmEuVF9QTFVTLFwiKz1cIjphLlRfUExVU0VRVUFMLFxuXCIsXCI6YS5UX0NPTU1BLFwiLVwiOmEuVF9NSU5VUyxcIi09XCI6YS5UX01JTkVRVUFMLFwiLT5cIjphLlRfUkFSUk9XLFwiLlwiOmEuVF9ET1QsXCIuLi5cIjphLlRfRUxMSVBTSVMsXCIvXCI6YS5UX1NMQVNILFwiLy9cIjphLlRfRE9VQkxFU0xBU0gsXCIvLz1cIjphLlRfRE9VQkxFU0xBU0hFUVVBTCxcIi89XCI6YS5UX1NMQVNIRVFVQUwsXCI6XCI6YS5UX0NPTE9OLFwiO1wiOmEuVF9TRU1JLFwiPFwiOmEuVF9MRVNTLFwiPDxcIjphLlRfTEVGVFNISUZULFwiPDw9XCI6YS5UX0xFRlRTSElGVEVRVUFMLFwiPD1cIjphLlRfTEVTU0VRVUFMLFwiPVwiOmEuVF9FUVVBTCxcIj09XCI6YS5UX0VRRVFVQUwsXCI+XCI6YS5UX0dSRUFURVIsXCI+PVwiOmEuVF9HUkVBVEVSRVFVQUwsXCI+PlwiOmEuVF9SSUdIVFNISUZULFwiPj49XCI6YS5UX1JJR0hUU0hJRlRFUVVBTCxcIkBcIjphLlRfQVQsXCJAPVwiOmEuVF9BVEVRVUFMLFwiW1wiOmEuVF9MU1FCLFwiXVwiOmEuVF9SU1FCLFwiXlwiOmEuVF9DSVJDVU1GTEVYLFwiXj1cIjphLlRfQ0lSQ1VNRkxFWEVRVUFMLFwie1wiOmEuVF9MQlJBQ0UsXG5cInxcIjphLlRfVkJBUixcInw9XCI6YS5UX1ZCQVJFUVVBTCxcIn1cIjphLlRfUkJSQUNFLFwiflwiOmEuVF9USUxERX07dmFyIGM9e307KGZ1bmN0aW9uKCl7Zm9yKHZhciBiIGluIGEpY1thW2JdXT1ifSkoKTtbXCJ0b2tfbmFtZVwiLFwiSVNURVJNSU5BTFwiLFwiSVNOT05URVJNSU5BTFwiLFwiSVNFT0ZcIl0uY29uY2F0KE9iamVjdC5rZXlzKGMpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gY1thXX0pKTtTay50b2tlbj17fTtTay50b2tlbi50b2tlbnM9YTtTay50b2tlbi50b2tfbmFtZT1jO1NrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTPW07U2sudG9rZW4uSVNURVJNSU5BTD1mdW5jdGlvbihiKXtyZXR1cm4gYjxhLlRfTlRfT0ZGU0VUfTtTay50b2tlbi5JU05PTlRFUk1JTkFMPWZ1bmN0aW9uKGIpe3JldHVybiBiPj1hLlRfTlRfT0ZGU0VUfTtTay50b2tlbi5JU0VPRj1mdW5jdGlvbihiKXtyZXR1cm4gYj09YS5UX0VORE1BUktFUn07U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW5cIixTay50b2tlbik7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4udG9rZW5zXCIsXG5Tay50b2tlbi50b2tlbnMpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLnRva19uYW1lXCIsU2sudG9rZW4udG9rX25hbWUpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTXCIpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLklTVEVSTUlOQUxcIixTay50b2tlbi5JU1RFUk1JTkFMKTtTay5leHBvcnRTeW1ib2woXCJTay50b2tlbi5JU05PTlRFUk1JTkFMXCIsU2sudG9rZW4uSVNOT05URVJNSU5BTCk7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4uSVNFT0ZcIixTay50b2tlbi5JU0VPRil9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsYyxkLGUpe3RoaXMudHlwZT1hO3RoaXMuc3RyaW5nPWI7dGhpcy5zdGFydD1jO3RoaXMuZW5kPWQ7dGhpcy5saW5lPWV9ZnVuY3Rpb24gYyhhKXtyZXR1cm5cIihcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXCJ8XCIpK1wiKVwifWZ1bmN0aW9uIGIoYSl7cmV0dXJuIGMuYXBwbHkobnVsbCxhcmd1bWVudHMpK1xuXCI/XCJ9ZnVuY3Rpb24gZShhLGIpe2Zvcih2YXIgYz1hLmxlbmd0aDtjLS07KWlmKGFbY109PT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGYoKXtyZXR1cm5cIiBGUiBSRiBCciBCUiBGciByIEIgUiBiIGJSIGYgcmIgckIgRiBSZiBVIHJGIHUgUkIgYnIgZlIgZnIgcmYgUmJcIi5zcGxpdChcIiBcIil9ZnVuY3Rpb24gbChhKXthP2RlbGV0ZSBTay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFU1tcIjw+XCJdOlNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW1wiPD5cIl09U2sudG9rZW4udG9rZW5zLlRfTk9URVFVQUw7dD1PYmplY3Qua2V5cyhTay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFUykuc29ydCgpO3Y9Yy5hcHBseSh0aGlzLHQucmV2ZXJzZSgpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYSYmay50ZXN0KGEpP2EucmVwbGFjZShuLFwiXFxcXCQmXCIpOmF9KSk7Qj1jKFwiXFxcXHI/XFxcXG5cIix2KX12YXIgaD1Tay50b2tlbi50b2tlbnM7Y29uc3QgZD1Tay5idWlsdGluLlN5bnRheEVycm9yLGc9U2suYnVpbHRpbi5TeW50YXhFcnJvcjtcbmEucHJvdG90eXBlLmV4YWN0X3R5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlPT1oLlRfT1AmJnRoaXMuc3RyaW5nIGluIFNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTP1NrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW3RoaXMuc3RyaW5nXTp0aGlzLnR5cGV9O3ZhciBuPS9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxrPVJlZ0V4cChuLnNvdXJjZSk7Y29uc3QgcD1mdW5jdGlvbigpe3ZhciBhPWMoXCJbQS1aXVwiLFwiW2Etel1cIixcIltcXFxcdXsxMEI5OX0tXFxcXHV7MTBCOUN9XFxcXHV7MTEyQTl9XFxcXHV7MTE1REN9LVxcXFx1ezExNUREfVxcXFx1MDM0RlxcXFx1MTE1Ri1cXFxcdTExNjBcXFxcdTE3QjQtXFxcXHUxN0I1XFxcXHUyMDY1XFxcXHUzMTY0XFxcXHVGRkEwXFxcXHVGRkYwLVxcXFx1RkZGOFxcXFx1e0UwMDAwfVxcXFx1e0UwMDAyfS1cXFxcdXtFMDAxRn1cXFxcdXtFMDA4MH0tXFxcXHV7RTAwRkZ9XFxcXHV7RTAxRjB9LVxcXFx1e0UwRkZGfVxcXFx1ezExMkE5fVxcXFx1MDBEN11cIixcIltcXFxcdTAyQjAtXFxcXHUwMkMxXFxcXHUwMkM2LVxcXFx1MDJEMVxcXFx1MDJFMC1cXFxcdTAyRTRcXFxcdTAyRUNcXFxcdTAyRUVcXFxcdTAzNzRcXFxcdTAzN0FcXFxcdTA1NTlcXFxcdTA2RTUtXFxcXHUwNkU2XFxcXHUwN0Y0LVxcXFx1MDdGNVxcXFx1MDk3MVxcXFx1MUM3OC1cXFxcdTFDN0RcXFxcdTFEMkMtXFxcXHUxRDZBXFxcXHUxREZELVxcXFx1MURGRlxcXFx1MkUyRlxcXFx1MzBGQ1xcXFx1QTY3RlxcXFx1QTY5Qy1cXFxcdUE2OURcXFxcdUE3MTctXFxcXHVBNzFGXFxcXHVBNzg4XFxcXHVBN0Y4LVxcXFx1QTdGOVxcXFx1QUI1Qy1cXFxcdUFCNUZcXFxcdUZGNzBcXFxcdUZGOUUtXFxcXHVGRjlGXFxcXHV7MTZGOTN9LVxcXFx1ezE2RjlGfVxcXFx1MDJEMC1cXFxcdTAyRDFcXFxcdTA2NDBcXFxcdTA3RkFcXFxcdTBFNDZcXFxcdTBFQzZcXFxcdTE4NDNcXFxcdTFBQTdcXFxcdTFDN0JcXFxcdTMwMDVcXFxcdTMwMzEtXFxcXHUzMDM1XFxcXHUzMDlELVxcXFx1MzA5RVxcXFx1MzBGQy1cXFxcdTMwRkVcXFxcdUEwMTVcXFxcdUE2MENcXFxcdUE5Q0ZcXFxcdUE5RTZcXFxcdUFBNzBcXFxcdUFBRERcXFxcdUFBRjMtXFxcXHVBQUY0XFxcXHVGRjcwXFxcXHV7MTZCNDJ9LVxcXFx1ezE2QjQzfVxcXFx1ezE2RkUwfS1cXFxcdXsxNkZFMX1cXFxcdTAyQjAtXFxcXHUwMkI4XFxcXHUwMkMwLVxcXFx1MDJDMVxcXFx1MDJFMC1cXFxcdTAyRTRcXFxcdTAzN0FcXFxcdTFEMkMtXFxcXHUxRDZBXFxcXHUxRDc4XFxcXHUxRDlCLVxcXFx1MURCRlxcXFx1MjA3MVxcXFx1MjA3RlxcXFx1MjA5MC1cXFxcdTIwOUNcXFxcdTJDN0MtXFxcXHUyQzdEXFxcXHVBNjlDLVxcXFx1QTY5RFxcXFx1QTc3MFxcXFx1QTdGOC1cXFxcdUE3RjlcXFxcdUFCNUMtXFxcXHVBQjVGXFxcXHVGRjlFLVxcXFx1RkY5RlxcXFx1MDJCMlxcXFx1MUQ2MlxcXFx1MURBNFxcXFx1MURBOFxcXFx1MjA3MVxcXFx1MkM3Q1xcXFx1MkUxOC1cXFxcdTJFMTlcXFxcdTJFMkZdXCIsXG5cIltcXFxcdTIxMzUtXFxcXHUyMTM4XFxcXHV7MUVFMDB9LVxcXFx1ezFFRTAzfVxcXFx1ezFFRTA1fS1cXFxcdXsxRUUxRn1cXFxcdXsxRUUyMX0tXFxcXHV7MUVFMjJ9XFxcXHV7MUVFMjR9XFxcXHV7MUVFMjd9XFxcXHV7MUVFMjl9LVxcXFx1ezFFRTMyfVxcXFx1ezFFRTM0fS1cXFxcdXsxRUUzN31cXFxcdXsxRUUzOX1cXFxcdXsxRUUzQn1cXFxcdXsxRUU0Mn1cXFxcdXsxRUU0N31cXFxcdXsxRUU0OX1cXFxcdXsxRUU0Qn1cXFxcdXsxRUU0RH0tXFxcXHV7MUVFNEZ9XFxcXHV7MUVFNTF9LVxcXFx1ezFFRTUyfVxcXFx1ezFFRTU0fVxcXFx1ezFFRTU3fVxcXFx1ezFFRTU5fVxcXFx1ezFFRTVCfVxcXFx1ezFFRTVEfVxcXFx1ezFFRTVGfVxcXFx1ezFFRTYxfS1cXFxcdXsxRUU2Mn1cXFxcdXsxRUU2NH1cXFxcdXsxRUU2N30tXFxcXHV7MUVFNkF9XFxcXHV7MUVFNkN9LVxcXFx1ezFFRTcyfVxcXFx1ezFFRTc0fS1cXFxcdXsxRUU3N31cXFxcdXsxRUU3OX0tXFxcXHV7MUVFN0N9XFxcXHV7MUVFN0V9XFxcXHV7MUVFODB9LVxcXFx1ezFFRTg5fVxcXFx1ezFFRThCfS1cXFxcdXsxRUU5Qn1cXFxcdXsxRUVBMX0tXFxcXHV7MUVFQTN9XFxcXHV7MUVFQTV9LVxcXFx1ezFFRUE5fVxcXFx1ezFFRUFCfS1cXFxcdXsxRUVCQn1cXFxcdTMwMDZcXFxcdTM0MDAtXFxcXHU0REI1XFxcXHU0RTAwLVxcXFx1OUZFRlxcXFx1RjkwMC1cXFxcdUZBNkRcXFxcdUZBNzAtXFxcXHVGQUQ5XFxcXHV7MTcwMDB9LVxcXFx1ezE4N0YxfVxcXFx1ezE4ODAwfS1cXFxcdXsxOEFGMn1cXFxcdXsxQjE3MH0tXFxcXHV7MUIyRkJ9XFxcXHV7MjAwMDB9LVxcXFx1ezJBNkQ2fVxcXFx1ezJBNzAwfS1cXFxcdXsyQjczNH1cXFxcdXsyQjc0MH0tXFxcXHV7MkI4MUR9XFxcXHV7MkI4MjB9LVxcXFx1ezJDRUExfVxcXFx1ezJDRUIwfS1cXFxcdXsyRUJFMH1cXFxcdXsyRjgwMH0tXFxcXHV7MkZBMUR9XFxcXHVBQUMwXFxcXHVBQUMyXFxcXHVGRTIwLVxcXFx1RkUyRlxcXFx1ezEwRDIyfS1cXFxcdXsxMEQyM31cXFxcdXsxMTM1RH1cXFxcdTAwQUFcXFxcdTAwQkFcXFxcdTM0MDAtXFxcXHU0REI1XFxcXHU0RTAwLVxcXFx1OUZFRlxcXFx1RkEwRS1cXFxcdUZBMEZcXFxcdUZBMTFcXFxcdUZBMTMtXFxcXHVGQTE0XFxcXHVGQTFGXFxcXHVGQTIxXFxcXHVGQTIzLVxcXFx1RkEyNFxcXFx1RkEyNy1cXFxcdUZBMjlcXFxcdXsyMDAwMH0tXFxcXHV7MkE2RDZ9XFxcXHV7MkE3MDB9LVxcXFx1ezJCNzM0fVxcXFx1ezJCNzQwfS1cXFxcdXsyQjgxRH1cXFxcdXsyQjgyMH0tXFxcXHV7MkNFQTF9XFxcXHV7MkNFQjB9LVxcXFx1ezJFQkUwfVxcXFx1MTE1Ri1cXFxcdTExNjBcXFxcdTMxNjRcXFxcdUZGQTBcXFxcdTA2NzNcXFxcdTE3QTMtXFxcXHUxN0E0XFxcXHUwRTQwLVxcXFx1MEU0NFxcXFx1MEVDMC1cXFxcdTBFQzRcXFxcdTE5QjUtXFxcXHUxOUI3XFxcXHUxOUJBXFxcXHVBQUI1LVxcXFx1QUFCNlxcXFx1QUFCOVxcXFx1QUFCQi1cXFxcdUFBQkNdXCIsXG5cIltcXFxcdTMwMDdcXFxcdTMwMjEtXFxcXHUzMDI5XFxcXHUzMDM4LVxcXFx1MzAzQVxcXFx1MjE3MC1cXFxcdTIxN0ZcXFxcdTIxNjAtXFxcXHUyMTZGXVwiLFwiX1wiLFwiW1xcXFx1MTg4NS1cXFxcdTE4ODZcXFxcdTIxMThcXFxcdTIxMkVcXFxcdTMwOUItXFxcXHUzMDlDXVwiKSxiPWMoYSxcIltcXFxcdTEwNEEtXFxcXHUxMDRCXFxcXHUxMDJCLVxcXFx1MTAyQ1xcXFx1MTAyRC1cXFxcdTEwMzBcXFxcdTEwMzFcXFxcdTEwMzItXFxcXHUxMDM2XFxcXHUxMDM4XFxcXHUxMDNCLVxcXFx1MTAzQ1xcXFx1MTAzRC1cXFxcdTEwM0VcXFxcdTEwNTYtXFxcXHUxMDU3XFxcXHUxMDU4LVxcXFx1MTA1OVxcXFx1MTA1RS1cXFxcdTEwNjBcXFxcdTEwNjJcXFxcdTEwNjctXFxcXHUxMDY4XFxcXHUxMDcxLVxcXFx1MTA3NFxcXFx1MTA4MlxcXFx1MTA4My1cXFxcdTEwODRcXFxcdTEwODUtXFxcXHUxMDg2XFxcXHUxMDlDXFxcXHUxMDlEXFxcXHUxMDM3XFxcXHUxMDM5LVxcXFx1MTAzQVxcXFx1MTA4Ny1cXFxcdTEwOENcXFxcdTEwOERcXFxcdTEwOEZcXFxcdTEwOUEtXFxcXHUxMDlCXFxcXHVBOUU1XFxcXHVBQTdCXFxcXHVBQTdDXFxcXHVBQTdEXFxcXHVBOUU2XFxcXHVBQTcwXFxcXHUxMDRBLVxcXFx1MTA0Ql1cIixcIltcXFxcdTA5MDNcXFxcdTA5M0JcXFxcdTA5M0UtXFxcXHUwOTQwXFxcXHUwOTQ5LVxcXFx1MDk0Q1xcXFx1MDk0RS1cXFxcdTA5NEZcXFxcdTA5ODItXFxcXHUwOTgzXFxcXHUwOUJFLVxcXFx1MDlDMFxcXFx1MDlDNy1cXFxcdTA5QzhcXFxcdTA5Q0ItXFxcXHUwOUNDXFxcXHUwOUQ3XFxcXHUwQTAzXFxcXHUwQTNFLVxcXFx1MEE0MFxcXFx1MEE4M1xcXFx1MEFCRS1cXFxcdTBBQzBcXFxcdTBBQzlcXFxcdTBBQ0ItXFxcXHUwQUNDXFxcXHUwQjAyLVxcXFx1MEIwM1xcXFx1MEIzRVxcXFx1MEI0MFxcXFx1MEI0Ny1cXFxcdTBCNDhcXFxcdTBCNEItXFxcXHUwQjRDXFxcXHUwQjU3XFxcXHUwQkJFLVxcXFx1MEJCRlxcXFx1MEJDMS1cXFxcdTBCQzJcXFxcdTBCQzYtXFxcXHUwQkM4XFxcXHUwQkNBLVxcXFx1MEJDQ1xcXFx1MEJEN1xcXFx1MEMwMS1cXFxcdTBDMDNcXFxcdTBDNDEtXFxcXHUwQzQ0XFxcXHUwQzgyLVxcXFx1MEM4M1xcXFx1MENCRVxcXFx1MENDMC1cXFxcdTBDQzRcXFxcdTBDQzctXFxcXHUwQ0M4XFxcXHUwQ0NBLVxcXFx1MENDQlxcXFx1MENENS1cXFxcdTBDRDZcXFxcdTBEMDItXFxcXHUwRDAzXFxcXHUwRDNFLVxcXFx1MEQ0MFxcXFx1MEQ0Ni1cXFxcdTBENDhcXFxcdTBENEEtXFxcXHUwRDRDXFxcXHUwRDU3XFxcXHUwRDgyLVxcXFx1MEQ4M1xcXFx1MERDRi1cXFxcdTBERDFcXFxcdTBERDgtXFxcXHUwRERGXFxcXHUwREYyLVxcXFx1MERGM1xcXFx1MEY3RlxcXFx1MTAyQi1cXFxcdTEwMkNcXFxcdTEwMzFcXFxcdTEwMzhcXFxcdTEwM0ItXFxcXHUxMDNDXFxcXHUxMDU2LVxcXFx1MTA1N1xcXFx1MTA2MlxcXFx1MTA2Ny1cXFxcdTEwNjhcXFxcdTEwODMtXFxcXHUxMDg0XFxcXHUxMDlDXFxcXHUxN0I2XFxcXHUxN0JFLVxcXFx1MTdDNVxcXFx1MTdDNy1cXFxcdTE3QzhcXFxcdTE5MjMtXFxcXHUxOTI2XFxcXHUxOTI5LVxcXFx1MTkyQlxcXFx1MTkzMC1cXFxcdTE5MzFcXFxcdTE5MzMtXFxcXHUxOTM4XFxcXHUxQTE5LVxcXFx1MUExQVxcXFx1MUE1NVxcXFx1MUE1N1xcXFx1MUE2MVxcXFx1MUE2My1cXFxcdTFBNjRcXFxcdTFBNkQtXFxcXHUxQTcyXFxcXHUxQjA0XFxcXHUxQjM1XFxcXHUxQjNCXFxcXHUxQjNELVxcXFx1MUI0MVxcXFx1MUI0M1xcXFx1MUI4MlxcXFx1MUJBMVxcXFx1MUJBNi1cXFxcdTFCQTdcXFxcdTFCRTdcXFxcdTFCRUEtXFxcXHUxQkVDXFxcXHUxQkVFXFxcXHUxQzI0LVxcXFx1MUMyQlxcXFx1MUMzNC1cXFxcdTFDMzVcXFxcdTFDRjItXFxcXHUxQ0YzXFxcXHVBODIzLVxcXFx1QTgyNFxcXFx1QTgyN1xcXFx1QTg4MC1cXFxcdUE4ODFcXFxcdUE4QjQtXFxcXHVBOEMzXFxcXHVBOTUyXFxcXHVBOTgzXFxcXHVBOUI0LVxcXFx1QTlCNVxcXFx1QTlCQS1cXFxcdUE5QkJcXFxcdUE5QkQtXFxcXHVBOUJGXFxcXHVBQTJGLVxcXFx1QUEzMFxcXFx1QUEzMy1cXFxcdUFBMzRcXFxcdUFBNERcXFxcdUFBRUJcXFxcdUFBRUUtXFxcXHVBQUVGXFxcXHVBQUY1XFxcXHVBQkUzLVxcXFx1QUJFNFxcXFx1QUJFNi1cXFxcdUFCRTdcXFxcdUFCRTktXFxcXHVBQkVBXFxcXHV7MTEwMDB9XFxcXHV7MTEwMDJ9XFxcXHV7MTEwODJ9XFxcXHV7MTEwQjB9LVxcXFx1ezExMEIyfVxcXFx1ezExMEI3fS1cXFxcdXsxMTBCOH1cXFxcdXsxMTEyQ31cXFxcdXsxMTE0NX0tXFxcXHV7MTExNDZ9XFxcXHV7MTExODJ9XFxcXHV7MTExQjN9LVxcXFx1ezExMUI1fVxcXFx1ezExMUJGfVxcXFx1ezExMjJDfS1cXFxcdXsxMTIyRX1cXFxcdXsxMTIzMn0tXFxcXHV7MTEyMzN9XFxcXHV7MTEyRTB9LVxcXFx1ezExMkUyfVxcXFx1ezExMzAyfS1cXFxcdXsxMTMwM31cXFxcdXsxMTMzRX0tXFxcXHV7MTEzM0Z9XFxcXHV7MTEzNDF9LVxcXFx1ezExMzQ0fVxcXFx1ezExMzQ3fS1cXFxcdXsxMTM0OH1cXFxcdXsxMTM0Qn0tXFxcXHV7MTEzNEN9XFxcXHV7MTEzNTd9XFxcXHV7MTEzNjJ9LVxcXFx1ezExMzYzfVxcXFx1ezExNDM1fS1cXFxcdXsxMTQzN31cXFxcdXsxMTQ0MH0tXFxcXHV7MTE0NDF9XFxcXHV7MTE0NDV9XFxcXHV7MTE0QjB9LVxcXFx1ezExNEIyfVxcXFx1ezExNEI5fVxcXFx1ezExNEJCfS1cXFxcdXsxMTRCRX1cXFxcdXsxMTRDMX1cXFxcdXsxMTVBRn0tXFxcXHV7MTE1QjF9XFxcXHV7MTE1Qjh9LVxcXFx1ezExNUJCfVxcXFx1ezExNUJFfVxcXFx1ezExNjMwfS1cXFxcdXsxMTYzMn1cXFxcdXsxMTYzQn0tXFxcXHV7MTE2M0N9XFxcXHV7MTE2M0V9XFxcXHV7MTE2QUN9XFxcXHV7MTE2QUV9LVxcXFx1ezExNkFGfVxcXFx1ezExNzIwfS1cXFxcdXsxMTcyMX1cXFxcdXsxMTcyNn1cXFxcdXsxMTgyQ30tXFxcXHV7MTE4MkV9XFxcXHV7MTE4Mzh9XFxcXHV7MTFBMzl9XFxcXHV7MTFBNTd9LVxcXFx1ezExQTU4fVxcXFx1ezExQTk3fVxcXFx1ezExQzJGfVxcXFx1ezExQzNFfVxcXFx1ezExQ0E5fVxcXFx1ezExQ0IxfVxcXFx1ezExQ0I0fVxcXFx1ezExRDhBfS1cXFxcdXsxMUQ4RX1cXFxcdXsxMUQ5M30tXFxcXHV7MTFEOTR9XFxcXHV7MTFEOTZ9XFxcXHV7MTFFRjV9LVxcXFx1ezExRUY2fVxcXFx1ezE2RjUxfS1cXFxcdXsxNkY3RX1cXFxcdTBGM0UtXFxcXHUwRjNGXFxcXHUxMDg3LVxcXFx1MTA4Q1xcXFx1MTA4RlxcXFx1MTA5QS1cXFxcdTEwOUJcXFxcdTFCNDRcXFxcdTFCQUFcXFxcdTFDRTFcXFxcdTFDRjdcXFxcdTMwMkUtXFxcXHUzMDJGXFxcXHVBOTUzXFxcXHVBOUMwXFxcXHVBQTdCXFxcXHVBQTdEXFxcXHVBQkVDXFxcXHV7MTExQzB9XFxcXHV7MTEyMzV9XFxcXHV7MTEzNER9XFxcXHV7MTE2QjZ9XFxcXHV7MUQxNkR9LVxcXFx1ezFEMTcyfVxcXFx1MDlCRVxcXFx1MDlEN1xcXFx1MEIzRVxcXFx1MEI1N1xcXFx1MEJCRVxcXFx1MEJEN1xcXFx1MENDMlxcXFx1MENENS1cXFxcdTBDRDZcXFxcdTBEM0VcXFxcdTBENTdcXFxcdTBEQ0ZcXFxcdTBEREZcXFxcdTMwMkUtXFxcXHUzMDJGXFxcXHV7MTEzM0V9XFxcXHV7MTEzNTd9XFxcXHV7MTE0QjB9XFxcXHV7MTE0QkR9XFxcXHV7MTE1QUZ9XFxcXHV7MUQxNjV9XFxcXHV7MUQxNkV9LVxcXFx1ezFEMTcyfV1cIixcblwiW1xcXFx1ezFEN0NFfS1cXFxcdXsxRDdGRn1cXFxcdUZGMTAtXFxcXHVGRjE5XVwiLFwiXFxcXHUyMDQwXCIsXCJbXFxcXHUwMEI3XFxcXHUwMzg3XFxcXHUxMzY5LVxcXFx1MTM3MVxcXFx1MTlEQV1cIik7aWYoITE9PT1SZWdFeHAoKS51bmljb2RlKXJldHVybiBuZXcgUmVnRXhwKFwiXlwiK2ErXCIrXCIrYitcIiokXCIsXCJ1XCIpO2E9YyhcIltBLVpdXCIsXCJbYS16XVwiLFwiX1wiKTtiPWMoYSxcIlswLTldXCIpO3JldHVybiBuZXcgUmVnRXhwKFwiXlwiK2ErXCIrXCIrYitcIiokXCIpfSgpOyhmdW5jdGlvbihhKXtyZXR1cm4gYy5hcHBseShudWxsLGFyZ3VtZW50cykrXCIqXCJ9KShcIlxcXFxcXFxcXFxcXHI/XFxcXG5bIFxcXFxmXFxcXHRdKlwiKTtiKFwiI1teXFxcXHJcXFxcbl0qXCIpO209YyhcIlswLTldKD86Xz9bMC05XSkqXFxcXC4oPzpbMC05XSg/Ol8/WzAtOV0pKik/XCIsXCJcXFxcLlswLTldKD86Xz9bMC05XSkqXCIpK2IoXCJbZUVdWy0rXT9bMC05XSg/Ol8/WzAtOV0pKlwiKTt2YXIgdT1jKG0sXCJbMC05XSg/Ol8/WzAtOV0pKltlRV1bLStdP1swLTldKD86Xz9bMC05XSkqXCIpLEE9YyhcIlswLTldKD86Xz9bMC05XSkqW2pKXVwiLFxudStcIltqSl1cIik7bT1jLmFwcGx5KG51bGwsZigpKTtxPWMobStcIicnJ1wiLG0rJ1wiXCJcIicpO2MobStcIidbXlxcXFxuJ1xcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuJ1xcXFxcXFxcXSopKidcIixtKydcIlteXFxcXG5cIlxcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuXCJcXFxcXFxcXF0qKSpcIicpO3ZhciB0LHYsQjtsKCEwKTtTay50b2tlbi5zZXR1cFRva2Vucz1sO3ZhciBEPWMobStcIidbXlxcXFxuJ1xcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuJ1xcXFxcXFxcXSopKlwiK2MoXCInXCIsXCJcXFxcXFxcXFxcXFxyP1xcXFxuXCIpLG0rJ1wiW15cXFxcblwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXFxcXG5cIlxcXFxcXFxcXSopKicrYygnXCInLFwiXFxcXFxcXFxcXFxccj9cXFxcblwiKSksRT1jKFwiXFxcXFxcXFxcXFxccj9cXFxcbnwkXCIsXCIjW15cXFxcclxcXFxuXSpcIixxKSxGPXt9O209ZigpO2ZvcihsZXQgYSBvZiBtKUZbYStcIidcIl09XCJeW14nXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteJ1xcXFxcXFxcXSopKidcIixGW2ErJ1wiJ109J15bXlwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXCJcXFxcXFxcXF0qKSpcIicsRlthK1wiJycnXCJdPVwiXlteJ1xcXFxcXFxcXSooPzooPzpcXFxcXFxcXC58Jyg/IScnKSlbXidcXFxcXFxcXF0qKSonJydcIixcbkZbYSsnXCJcIlwiJ109J15bXlwiXFxcXFxcXFxdKig/Oig/OlxcXFxcXFxcLnxcIig/IVwiXCIpKVteXCJcXFxcXFxcXF0qKSpcIlwiXCInO2xldCBNPVtdLFY9W107Zm9yKGxldCBhIG9mIG0pTS5wdXNoKGErJ1wiJyksTS5wdXNoKGErXCInXCIpLFYucHVzaChhKydcIlwiXCInKSxWLnB1c2goYStcIicnJ1wiKTtTay5fdG9rZW5pemU9ZnVuY3Rpb24oYixmLGssbil7dmFyIGw9U2suX19mdXR1cmVfXy5weXRob24zP1wiXCI6XCIoPzpMPylcIjtsPWMoXCIwW3hYXSg/Ol8/WzAtOWEtZkEtRl0pK1wiK2wsXCIwW2JCXSg/Ol8/WzAxXSkrXCIrbCxTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsP1wiMChbb09dPykoPzpfP1swLTddKStcIitsOlwiMChbb09dKSg/Ol8/WzAtN10pK1wiK2wsXCIoPzowKD86Xz8wKSp8WzEtOV0oPzpfP1swLTldKSopXCIrbCk7bD1jKEEsdSxsKTtsPVwiWyBcXFxcZlxcXFx0XSpcIitjKEUsbCxCLEQsXCJcXFxcdytcIik7bD1uZXcgUmVnRXhwKGwpO3ZhciBtPTAsdD0wLHE9MCx2PVwiXCIseT0wLEc9bnVsbCxMPVswXSxILFQ9dm9pZCAwLFxuWD12b2lkIDAsSSxSO3ZvaWQgMCE9PWsmJihcInV0Zi04LXNpZ1wiPT1rJiYoaz1cInV0Zi04XCIpLG4obmV3IGEoaC5UX0VOQ09ESU5HLGssWzAsMF0sWzAsMF0sXCJcIikpKTtmb3IodmFyIEM9az1cIlwiOzspe3RyeXtrPUMsQz1mKCl9Y2F0Y2goTyl7Qz1cIlwifW0rPTE7dmFyIHc9MCxOPUMubGVuZ3RoO2lmKHYpe2lmKCFDKXRocm93IG5ldyBkKFwiRU9GIGluIG11bHRpLWxpbmUgc3RyaW5nXCIsYixYWzBdLFhbMV0pO1QubGFzdEluZGV4PTA7dmFyIHI9VC5leGVjKEMpO2lmKHIpdz1JPXJbMF0ubGVuZ3RoLG4obmV3IGEoaC5UX1NUUklORyx2K0Muc3Vic3RyaW5nKDAsSSksWCxbbSxJXSxHK0MpKSx2PVwiXCIseT0wLEc9bnVsbDtlbHNle3kmJlwiXFxcXFxcblwiIT09Qy5zdWJzdHJpbmcoQy5sZW5ndGgtMikmJlwiXFxcXFxcclxcblwiIT09Qy5zdWJzdHJpbmcoQy5sZW5ndGgtMyk/KG4obmV3IGEoaC5UX0VSUk9SVE9LRU4sditDLFgsW20sQy5sZW5ndGhdLEcpKSx2PVwiXCIsRz1udWxsKToodis9QyxHKz1DKTtjb250aW51ZX19ZWxzZSBpZigwIT1cbnR8fHEpe2lmKCFDKXRocm93IG5ldyBkKFwiRU9GIGluIG11bHRpLWxpbmUgc3RhdGVtZW50XCIsYixtLDApO3E9MH1lbHNle2lmKCFDKWJyZWFrO2ZvcihIPTA7dzxOOyl7aWYoXCIgXCI9PUNbd10pSCs9MTtlbHNlIGlmKFwiXFx0XCI9PUNbd10pSD04Kk1hdGguZmxvb3IoSC84KzEpO2Vsc2UgaWYoXCJcXGZcIj09Q1t3XSlIPTA7ZWxzZSBicmVhazt3Kz0xfWlmKHc9PU4pYnJlYWs7aWYoZShcIiNcXHJcXG5cIixDW3ddKSl7aWYoXCIjXCI9PUNbd10pe0g9Qy5zdWJzdHJpbmcodyk7Zm9yKE49SC5sZW5ndGg7MDxOJiYtMSE9PVwiXFxyXFxuXCIuaW5kZXhPZihILmNoYXJBdChOLTEpKTstLU4pO049SC5zdWJzdHJpbmcoMCxOKTtuKG5ldyBhKGguVF9DT01NRU5ULE4sW20sd10sW20sdytOLmxlbmd0aF0sQykpO3crPU4ubGVuZ3RofW4obmV3IGEoaC5UX05MLEMuc3Vic3RyaW5nKHcpLFttLHddLFttLEMubGVuZ3RoXSxDKSk7Y29udGludWV9SD5MW0wubGVuZ3RoLTFdJiYoTC5wdXNoKEgpLG4obmV3IGEoaC5UX0lOREVOVCxcbkMuc3Vic3RyaW5nKHcpLFttLDBdLFttLHddLEMpKSk7Zm9yKDtIPExbTC5sZW5ndGgtMV07KXtpZighZShMLEgpKXRocm93IG5ldyBnKFwidW5pbmRlbnQgZG9lcyBub3QgbWF0Y2ggYW55IG91dGVyIGluZGVudGF0aW9uIGxldmVsXCIsYixtLHcpO0w9TC5zbGljZSgwLC0xKTtuKG5ldyBhKGguVF9ERURFTlQsXCJcIixbbSx3XSxbbSx3XSxDKSl9fWZvcig7dzxOOyl7Zm9yKEg9Qy5jaGFyQXQodyk7XCIgXCI9PT1IfHxcIlxcZlwiPT09SHx8XCJcXHRcIj09PUg7KXcrPTEsSD1DLmNoYXJBdCh3KTtpZihSPWwuZXhlYyhDLnN1YnN0cmluZyh3KSkpe2lmKEg9dyxJPUgrUlsxXS5sZW5ndGgsUj1bbSxIXSxyPVttLEldLHc9SSxIIT1JKXtJPUMuc3Vic3RyaW5nKEgsSSk7dmFyIHo9Q1tIXTtpZihlKFwiMDEyMzQ1Njc4OVwiLHopfHxcIi5cIj09eiYmXCIuXCIhPUkmJlwiLi4uXCIhPUkpbihuZXcgYShoLlRfTlVNQkVSLEksUixyLEMpKTtlbHNlIGlmKGUoXCJcXHJcXG5cIix6KSkwPHQ/bihuZXcgYShoLlRfTkwsSSxSLHIsQykpOlxubihuZXcgYShoLlRfTkVXTElORSxJLFIscixDKSk7ZWxzZSBpZihcIiNcIj09eiluKG5ldyBhKGguVF9DT01NRU5ULEksUixyLEMpKTtlbHNlIGlmKGUoVixJKSlpZihUPVJlZ0V4cChGW0ldKSxyPVQuZXhlYyhDLnN1YnN0cmluZyh3KSkpdz1yWzBdLmxlbmd0aCt3LEk9Qy5zdWJzdHJpbmcoSCx3KSxuKG5ldyBhKGguVF9TVFJJTkcsSSxSLFttLHddLEMpKTtlbHNle1g9W20sSF07dj1DLnN1YnN0cmluZyhIKTtHPUM7YnJlYWt9ZWxzZSBpZihlKE0seil8fGUoTSxJLnN1YnN0cmluZygwLDIpKXx8ZShNLEkuc3Vic3RyaW5nKDAsMykpKWlmKFwiXFxuXCI9PUlbSS5sZW5ndGgtMV0pe1g9W20sSF07VD1SZWdFeHAoRlt6XXx8RltJWzFdXXx8RltJWzJdXSk7dj1DLnN1YnN0cmluZyhIKTt5PTE7Rz1DO2JyZWFrfWVsc2UgbihuZXcgYShoLlRfU1RSSU5HLEksUixyLEMpKTtlbHNlIEg9ei5ub3JtYWxpemUoXCJORktDXCIpLHAudGVzdChIKT9uKG5ldyBhKGguVF9OQU1FLEksUixyLEMpKTpcIlxcXFxcIj09XG56P3E9MTooZShcIihbe1wiLHopP3QrPTE6ZShcIildfVwiLHopJiYtLXQsbihuZXcgYShoLlRfT1AsSSxSLHIsQykpKX19ZWxzZSBuKG5ldyBhKGguVF9FUlJPUlRPS0VOLENbd10sW20sd10sW20sdysxXSxDKSksdys9MX19ayYmIWUoXCJcXHJcXG5cIixrW2subGVuZ3RoLTFdKSYmbihuZXcgYShoLlRfTkVXTElORSxcIlwiLFttLTEsay5sZW5ndGhdLFttLTEsay5sZW5ndGgrMV0sXCJcIikpO2Zvcih2YXIgWiBpbiBMLnNsaWNlKDEpKW4obmV3IGEoaC5UX0RFREVOVCxcIlwiLFttLDBdLFttLDBdLFwiXCIpKTtuKG5ldyBhKGguVF9FTkRNQVJLRVIsXCJcIixbbSwwXSxbbSwwXSxcIlwiKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLl90b2tlbml6ZVwiLFNrLl90b2tlbml6ZSl9LGZ1bmN0aW9uKG0scSl7U2suT3BNYXA9e1wiKFwiOlNrLnRva2VuLnRva2Vucy5UX0xQQVIsXCIpXCI6U2sudG9rZW4udG9rZW5zLlRfUlBBUixcIltcIjpTay50b2tlbi50b2tlbnMuVF9MU1FCLFwiXVwiOlNrLnRva2VuLnRva2Vucy5UX1JTUUIsXCI6XCI6U2sudG9rZW4udG9rZW5zLlRfQ09MT04sXG5cIixcIjpTay50b2tlbi50b2tlbnMuVF9DT01NQSxcIjtcIjpTay50b2tlbi50b2tlbnMuVF9TRU1JLFwiK1wiOlNrLnRva2VuLnRva2Vucy5UX1BMVVMsXCItXCI6U2sudG9rZW4udG9rZW5zLlRfTUlOVVMsXCIqXCI6U2sudG9rZW4udG9rZW5zLlRfU1RBUixcIi9cIjpTay50b2tlbi50b2tlbnMuVF9TTEFTSCxcInxcIjpTay50b2tlbi50b2tlbnMuVF9WQkFSLFwiJlwiOlNrLnRva2VuLnRva2Vucy5UX0FNUEVSLFwiPFwiOlNrLnRva2VuLnRva2Vucy5UX0xFU1MsXCI+XCI6U2sudG9rZW4udG9rZW5zLlRfR1JFQVRFUixcIj1cIjpTay50b2tlbi50b2tlbnMuVF9FUVVBTCxcIi5cIjpTay50b2tlbi50b2tlbnMuVF9ET1QsXCIlXCI6U2sudG9rZW4udG9rZW5zLlRfUEVSQ0VOVCxcImBcIjpTay50b2tlbi50b2tlbnMuVF9CQUNLUVVPVEUsXCJ7XCI6U2sudG9rZW4udG9rZW5zLlRfTEJSQUNFLFwifVwiOlNrLnRva2VuLnRva2Vucy5UX1JCUkFDRSxcIkBcIjpTay50b2tlbi50b2tlbnMuVF9BVCxcIkA9XCI6U2sudG9rZW4udG9rZW5zLlRfQVRFUVVBTCxcblwiPT1cIjpTay50b2tlbi50b2tlbnMuVF9FUUVRVUFMLFwiIT1cIjpTay50b2tlbi50b2tlbnMuVF9OT1RFUVVBTCxcIjw+XCI6U2sudG9rZW4udG9rZW5zLlRfTk9URVFVQUwsXCI8PVwiOlNrLnRva2VuLnRva2Vucy5UX0xFU1NFUVVBTCxcIj49XCI6U2sudG9rZW4udG9rZW5zLlRfR1JFQVRFUkVRVUFMLFwiflwiOlNrLnRva2VuLnRva2Vucy5UX1RJTERFLFwiXlwiOlNrLnRva2VuLnRva2Vucy5UX0NJUkNVTUZMRVgsXCI8PFwiOlNrLnRva2VuLnRva2Vucy5UX0xFRlRTSElGVCxcIj4+XCI6U2sudG9rZW4udG9rZW5zLlRfUklHSFRTSElGVCxcIioqXCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU1RBUixcIis9XCI6U2sudG9rZW4udG9rZW5zLlRfUExVU0VRVUFMLFwiLT1cIjpTay50b2tlbi50b2tlbnMuVF9NSU5FUVVBTCxcIio9XCI6U2sudG9rZW4udG9rZW5zLlRfU1RBUkVRVUFMLFwiLz1cIjpTay50b2tlbi50b2tlbnMuVF9TTEFTSEVRVUFMLFwiJT1cIjpTay50b2tlbi50b2tlbnMuVF9QRVJDRU5URVFVQUwsXCImPVwiOlNrLnRva2VuLnRva2Vucy5UX0FNUEVSRVFVQUwsXG5cInw9XCI6U2sudG9rZW4udG9rZW5zLlRfVkJBUkVRVUFMLFwiXj1cIjpTay50b2tlbi50b2tlbnMuVF9DSVJDVU1GTEVYRVFVQUwsXCI8PD1cIjpTay50b2tlbi50b2tlbnMuVF9MRUZUU0hJRlRFUVVBTCxcIj4+PVwiOlNrLnRva2VuLnRva2Vucy5UX1JJR0hUU0hJRlRFUVVBTCxcIioqPVwiOlNrLnRva2VuLnRva2Vucy5UX0RPVUJMRVNUQVJFUVVBTCxcIi8vXCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU0xBU0gsXCIvLz1cIjpTay50b2tlbi50b2tlbnMuVF9ET1VCTEVTTEFTSEVRVUFMLFwiLT5cIjpTay50b2tlbi50b2tlbnMuVF9SQVJST1csXCIuLi5cIjpTay50b2tlbi50b2tlbnMuVF9FTExJUFNJU307U2suUGFyc2VUYWJsZXM9e3N5bTp7YW5kX2V4cHI6MjU3LGFuZF90ZXN0OjI1OCxhbm5hc3NpZ246MjU5LGFyZ2xpc3Q6MjYwLGFyZ3VtZW50OjI2MSxhcml0aF9leHByOjI2Mixhc3NlcnRfc3RtdDoyNjMsYXN5bmNfZnVuY2RlZjoyNjQsYXN5bmNfc3RtdDoyNjUsYXRvbToyNjYsYXRvbV9leHByOjI2NyxcbmF1Z2Fzc2lnbjoyNjgsYnJlYWtfc3RtdDoyNjksY2xhc3NkZWY6MjcwLGNvbXBfZm9yOjI3MSxjb21wX2lmOjI3Mixjb21wX2l0ZXI6MjczLGNvbXBfb3A6Mjc0LGNvbXBhcmlzb246Mjc1LGNvbXBvdW5kX3N0bXQ6Mjc2LGNvbnRpbnVlX3N0bXQ6Mjc3LGRlYnVnZ2VyX3N0bXQ6Mjc4LGRlY29yYXRlZDoyNzksZGVjb3JhdG9yOjI4MCxkZWNvcmF0b3JzOjI4MSxkZWxfc3RtdDoyODIsZGljdG9yc2V0bWFrZXI6MjgzLGRvdHRlZF9hc19uYW1lOjI4NCxkb3R0ZWRfYXNfbmFtZXM6Mjg1LGRvdHRlZF9uYW1lOjI4NixlbmNvZGluZ19kZWNsOjI4NyxldmFsX2lucHV0OjI4OCxleGNlcHRfY2xhdXNlOjI4OSxleHByOjI5MCxleHByX3N0bXQ6MjkxLGV4cHJsaXN0OjI5MixmYWN0b3I6MjkzLGZpbGVfaW5wdXQ6Mjk0LGZsb3dfc3RtdDoyOTUsZm9yX3N0bXQ6Mjk2LGZ1bmNkZWY6Mjk3LGdsb2JhbF9zdG10OjI5OCxpZl9zdG10OjI5OSxpbXBvcnRfYXNfbmFtZTozMDAsaW1wb3J0X2FzX25hbWVzOjMwMSxcbmltcG9ydF9mcm9tOjMwMixpbXBvcnRfbmFtZTozMDMsaW1wb3J0X3N0bXQ6MzA0LGxhbWJkZWY6MzA1LGxhbWJkZWZfbm9jb25kOjMwNixub25sb2NhbF9zdG10OjMwNyxub3RfdGVzdDozMDgsb3JfdGVzdDozMDkscGFyYW1ldGVyczozMTAscGFzc19zdG10OjMxMSxwb3dlcjozMTIscHJpbnRfc3RtdDozMTMscmFpc2Vfc3RtdDozMTQscmV0dXJuX3N0bXQ6MzE1LHNoaWZ0X2V4cHI6MzE2LHNpbXBsZV9zdG10OjMxNyxzaW5nbGVfaW5wdXQ6MjU2LHNsaWNlb3A6MzE4LHNtYWxsX3N0bXQ6MzE5LHN0YXJfZXhwcjozMjAsc3RtdDozMjEsc3Vic2NyaXB0OjMyMixzdWJzY3JpcHRsaXN0OjMyMyxzdWl0ZTozMjQsdGVybTozMjUsdGVzdDozMjYsdGVzdF9ub2NvbmQ6MzI3LHRlc3RsaXN0OjMyOCx0ZXN0bGlzdF9jb21wOjMyOSx0ZXN0bGlzdF9zdGFyX2V4cHI6MzMwLHRmcGRlZjozMzEsdHJhaWxlcjozMzIsdHJ5X3N0bXQ6MzMzLHR5cGVkYXJnc2xpc3Q6MzM0LHZhcmFyZ3NsaXN0OjMzNSxcbnZmcGRlZjozMzYsd2hpbGVfc3RtdDozMzcsd2l0aF9pdGVtOjMzOCx3aXRoX3N0bXQ6MzM5LHhvcl9leHByOjM0MCx5aWVsZF9hcmc6MzQxLHlpZWxkX2V4cHI6MzQyLHlpZWxkX3N0bXQ6MzQzfSxudW1iZXIyc3ltYm9sOnsyNTY6XCJzaW5nbGVfaW5wdXRcIiwyNTc6XCJhbmRfZXhwclwiLDI1ODpcImFuZF90ZXN0XCIsMjU5OlwiYW5uYXNzaWduXCIsMjYwOlwiYXJnbGlzdFwiLDI2MTpcImFyZ3VtZW50XCIsMjYyOlwiYXJpdGhfZXhwclwiLDI2MzpcImFzc2VydF9zdG10XCIsMjY0OlwiYXN5bmNfZnVuY2RlZlwiLDI2NTpcImFzeW5jX3N0bXRcIiwyNjY6XCJhdG9tXCIsMjY3OlwiYXRvbV9leHByXCIsMjY4OlwiYXVnYXNzaWduXCIsMjY5OlwiYnJlYWtfc3RtdFwiLDI3MDpcImNsYXNzZGVmXCIsMjcxOlwiY29tcF9mb3JcIiwyNzI6XCJjb21wX2lmXCIsMjczOlwiY29tcF9pdGVyXCIsMjc0OlwiY29tcF9vcFwiLDI3NTpcImNvbXBhcmlzb25cIiwyNzY6XCJjb21wb3VuZF9zdG10XCIsMjc3OlwiY29udGludWVfc3RtdFwiLDI3ODpcImRlYnVnZ2VyX3N0bXRcIixcbjI3OTpcImRlY29yYXRlZFwiLDI4MDpcImRlY29yYXRvclwiLDI4MTpcImRlY29yYXRvcnNcIiwyODI6XCJkZWxfc3RtdFwiLDI4MzpcImRpY3RvcnNldG1ha2VyXCIsMjg0OlwiZG90dGVkX2FzX25hbWVcIiwyODU6XCJkb3R0ZWRfYXNfbmFtZXNcIiwyODY6XCJkb3R0ZWRfbmFtZVwiLDI4NzpcImVuY29kaW5nX2RlY2xcIiwyODg6XCJldmFsX2lucHV0XCIsMjg5OlwiZXhjZXB0X2NsYXVzZVwiLDI5MDpcImV4cHJcIiwyOTE6XCJleHByX3N0bXRcIiwyOTI6XCJleHBybGlzdFwiLDI5MzpcImZhY3RvclwiLDI5NDpcImZpbGVfaW5wdXRcIiwyOTU6XCJmbG93X3N0bXRcIiwyOTY6XCJmb3Jfc3RtdFwiLDI5NzpcImZ1bmNkZWZcIiwyOTg6XCJnbG9iYWxfc3RtdFwiLDI5OTpcImlmX3N0bXRcIiwzMDA6XCJpbXBvcnRfYXNfbmFtZVwiLDMwMTpcImltcG9ydF9hc19uYW1lc1wiLDMwMjpcImltcG9ydF9mcm9tXCIsMzAzOlwiaW1wb3J0X25hbWVcIiwzMDQ6XCJpbXBvcnRfc3RtdFwiLDMwNTpcImxhbWJkZWZcIiwzMDY6XCJsYW1iZGVmX25vY29uZFwiLDMwNzpcIm5vbmxvY2FsX3N0bXRcIixcbjMwODpcIm5vdF90ZXN0XCIsMzA5Olwib3JfdGVzdFwiLDMxMDpcInBhcmFtZXRlcnNcIiwzMTE6XCJwYXNzX3N0bXRcIiwzMTI6XCJwb3dlclwiLDMxMzpcInByaW50X3N0bXRcIiwzMTQ6XCJyYWlzZV9zdG10XCIsMzE1OlwicmV0dXJuX3N0bXRcIiwzMTY6XCJzaGlmdF9leHByXCIsMzE3Olwic2ltcGxlX3N0bXRcIiwzMTg6XCJzbGljZW9wXCIsMzE5Olwic21hbGxfc3RtdFwiLDMyMDpcInN0YXJfZXhwclwiLDMyMTpcInN0bXRcIiwzMjI6XCJzdWJzY3JpcHRcIiwzMjM6XCJzdWJzY3JpcHRsaXN0XCIsMzI0Olwic3VpdGVcIiwzMjU6XCJ0ZXJtXCIsMzI2OlwidGVzdFwiLDMyNzpcInRlc3Rfbm9jb25kXCIsMzI4OlwidGVzdGxpc3RcIiwzMjk6XCJ0ZXN0bGlzdF9jb21wXCIsMzMwOlwidGVzdGxpc3Rfc3Rhcl9leHByXCIsMzMxOlwidGZwZGVmXCIsMzMyOlwidHJhaWxlclwiLDMzMzpcInRyeV9zdG10XCIsMzM0OlwidHlwZWRhcmdzbGlzdFwiLDMzNTpcInZhcmFyZ3NsaXN0XCIsMzM2OlwidmZwZGVmXCIsMzM3Olwid2hpbGVfc3RtdFwiLDMzODpcIndpdGhfaXRlbVwiLDMzOTpcIndpdGhfc3RtdFwiLFxuMzQwOlwieG9yX2V4cHJcIiwzNDE6XCJ5aWVsZF9hcmdcIiwzNDI6XCJ5aWVsZF9leHByXCIsMzQzOlwieWllbGRfc3RtdFwifSxkZmFzOnsyNTY6W1tbWzEsMV0sWzIsMV0sWzMsMl1dLFtbMCwxXV0sW1syLDFdXV0sezI6MSw0OjEsNToxLDY6MSw3OjEsODoxLDk6MSwxMDoxLDExOjEsMTI6MSwxMzoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxfV0sMjU3OltbW1s0NCwxXV0sW1s0NSwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNTg6W1tbWzQ2LDFdXSxbWzQ3LDBdLFswLDFdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsXG4zNToxLDM4OjEsNDM6MX1dLDI1OTpbW1tbNDgsMV1dLFtbNDksMl1dLFtbNTAsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLHs0ODoxfV0sMjYwOltbW1s1MSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s1MSwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MSw1MzoxfV0sMjYxOltbW1s0OSwxXSxbMTUsMl0sWzUzLDJdXSxbWzUwLDJdLFs1NCwzXSxbMCwxXV0sW1s0OSwzXV0sW1swLDNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyNjI6W1tbWzU1LDFdXSxbWzMwLDBdLFs0MywwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNjM6W1tbWzI0LDFdXSxbWzQ5LFxuMl1dLFtbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLHsyNDoxfV0sMjY0OltbW1sxMCwxXV0sW1s1NiwyXV0sW1swLDJdXV0sezEwOjF9XSwyNjU6W1tbWzEwLDFdXSxbWzU3LDJdLFs1NiwyXSxbNTgsMl1dLFtbMCwyXV1dLHsxMDoxfV0sMjY2OltbW1s2LDFdLFsyNSwxXSxbMzMsMV0sWzksMV0sWzExLDFdLFsxMiwyXSxbMzUsM10sWzM4LDRdLFsxOSwxXSxbNyw1XV0sW1swLDFdXSxbWzU5LDFdLFs2MCw2XV0sW1s2MSwxXSxbNjIsN10sWzYzLDddXSxbWzY0LDFdLFs2Myw4XV0sW1s3LDVdLFswLDVdXSxbWzU5LDFdXSxbWzYxLDFdXSxbWzY0LDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDI1OjEsMzM6MSwzNToxLDM4OjF9XSwyNjc6W1tbWzI5LDFdLFs2NSwyXV0sW1s2NSwyXV0sW1s2NiwyXSxbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyNToxLDI5OjEsMzM6MSwzNToxLDM4OjF9XSwyNjg6W1tbWzY3LDFdLFs2OCwxXSxbNjksMV0sXG5bNzAsMV0sWzcxLDFdLFs3MiwxXSxbNzMsMV0sWzc0LDFdLFs3NSwxXSxbNzYsMV0sWzc3LDFdLFs3OCwxXSxbNzksMV1dLFtbMCwxXV1dLHs2NzoxLDY4OjEsNjk6MSw3MDoxLDcxOjEsNzI6MSw3MzoxLDc0OjEsNzU6MSw3NjoxLDc3OjEsNzg6MSw3OToxfV0sMjY5OltbW1szOSwxXV0sW1swLDFdXV0sezM5OjF9XSwyNzA6W1tbWzEzLDFdXSxbWzI1LDJdXSxbWzQ4LDNdLFszNSw0XV0sW1s4MCw1XV0sW1s2MSw2XSxbODEsN11dLFtbMCw1XV0sW1s0OCwzXV0sW1s2MSw2XV1dLHsxMzoxfV0sMjcxOltbW1sxMCwxXSxbMzQsMl1dLFtbMzQsMl1dLFtbODIsM11dLFtbODMsNF1dLFtbODQsNV1dLFtbODUsNl0sWzAsNV1dLFtbMCw2XV1dLHsxMDoxLDM0OjF9XSwyNzI6W1tbWzM3LDFdXSxbWzg2LDJdXSxbWzg1LDNdLFswLDJdXSxbWzAsM11dXSx7Mzc6MX1dLDI3MzpbW1tbODcsMV0sWzU0LDFdXSxbWzAsMV1dXSx7MTA6MSwzNDoxLDM3OjF9XSwyNzQ6W1tbWzg4LDFdLFs4OSwxXSxcbls4LDJdLFs5MCwxXSxbODgsMV0sWzgzLDFdLFs5MSwxXSxbOTIsM10sWzkzLDFdLFs5NCwxXV0sW1swLDFdXSxbWzgzLDFdXSxbWzgsMV0sWzAsM11dXSx7ODoxLDgzOjEsODg6MSw4OToxLDkwOjEsOTE6MSw5MjoxLDkzOjEsOTQ6MX1dLDI3NTpbW1tbOTUsMV1dLFtbOTYsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjc2OltbW1s5NywxXSxbOTgsMV0sWzU4LDFdLFs5OSwxXSxbNTcsMV0sWzEwMCwxXSxbNTYsMV0sWzEwMSwxXSxbMTAyLDFdXSxbWzAsMV1dXSx7NDoxLDEwOjEsMTM6MSwyMDoxLDIxOjEsMzQ6MSwzNzoxLDQxOjEsNDI6MX1dLDI3NzpbW1tbNDAsMV1dLFtbMCwxXV1dLHs0MDoxfV0sMjc4OltbW1sxNywxXV0sW1swLDFdXV0sezE3OjF9XSwyNzk6W1tbWzEwMywxXV0sW1s1NiwyXSxbMTA0LDJdLFs5OSwyXV0sW1swLDJdXV0sezQxOjF9XSwyODA6W1tbWzQxLDFdXSxcbltbMTA1LDJdXSxbWzIsNF0sWzM1LDNdXSxbWzYxLDVdLFs4MSw2XV0sW1swLDRdXSxbWzIsNF1dLFtbNjEsNV1dXSx7NDE6MX1dLDI4MTpbW1tbMTA2LDFdXSxbWzEwNiwxXSxbMCwxXV1dLHs0MToxfV0sMjgyOltbW1syNywxXV0sW1s4MiwyXV0sW1swLDJdXV0sezI3OjF9XSwyODM6W1tbWzQ5LDFdLFsxMDcsMl0sWzUzLDNdXSxbWzQ4LDRdLFs1NCw1XSxbNTIsNl0sWzAsMV1dLFtbNTQsNV0sWzUyLDZdLFswLDJdXSxbWzk1LDddXSxbWzQ5LDddXSxbWzAsNV1dLFtbNDksOF0sWzEwNyw4XSxbMCw2XV0sW1s1NCw1XSxbNTIsOV0sWzAsN11dLFtbNTIsNl0sWzAsOF1dLFtbNDksMTBdLFs1MywxMV0sWzAsOV1dLFtbNDgsMTJdXSxbWzk1LDEzXV0sW1s0OSwxM11dLFtbNTIsOV0sWzAsMTNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyODQ6W1tbWzEwNSwxXV0sW1sxMDgsXG4yXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sezI1OjF9XSwyODU6W1tbWzEwOSwxXV0sW1s1MiwwXSxbMCwxXV1dLHsyNToxfV0sMjg2OltbW1syNSwxXV0sW1sxMTAsMF0sWzAsMV1dXSx7MjU6MX1dLDI4NzpbW1tbMjUsMV1dLFtbMCwxXV1dLHsyNToxfV0sMjg4OltbW1sxMTEsMV1dLFtbMiwxXSxbMTEyLDJdXSxbWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjg5OltbW1sxMTMsMV1dLFtbNDksMl0sWzAsMV1dLFtbMTA4LDNdLFs1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sezExMzoxfV0sMjkwOltbW1sxMTQsMV1dLFtbMTE1LDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI5MTpbW1tbMTE2LDFdXSxbWzExNywyXSxbNTAsM10sWzExOCw0XSxbMCwxXV0sW1sxMTEsXG40XSxbNjIsNF1dLFtbMTE2LDVdLFs2Miw1XV0sW1swLDRdXSxbWzUwLDNdLFswLDVdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjkyOltbW1s5NSwxXSxbMTA3LDFdXSxbWzUyLDJdLFswLDFdXSxbWzk1LDFdLFsxMDcsMV0sWzAsMl1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTM6W1tbWzExOSwyXSxbMzAsMV0sWzIyLDFdLFs0MywxXV0sW1sxMjAsMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTQ6W1tbWzIsMF0sWzExMiwxXSxbMTIxLDBdXSxbWzAsMV1dXSx7MjoxLDQ6MSw1OjEsNjoxLDc6MSw4OjEsOToxLDEwOjEsMTE6MSwxMjoxLDEzOjEsMTQ6MSwxNToxLDE2OjEsXG4xNzoxLDE4OjEsMTk6MSwyMDoxLDIxOjEsMjI6MSwyMzoxLDI0OjEsMjU6MSwyNjoxLDI3OjEsMjg6MSwyOToxLDMwOjEsMzE6MSwzMjoxLDMzOjEsMzQ6MSwzNToxLDM2OjEsMzc6MSwzODoxLDM5OjEsNDA6MSw0MToxLDQyOjEsNDM6MSwxMTI6MX1dLDI5NTpbW1tbMTIyLDFdLFsxMjMsMV0sWzEyNCwxXSxbMTI1LDFdLFsxMjYsMV1dLFtbMCwxXV1dLHs1OjEsMjM6MSwzMToxLDM5OjEsNDA6MX1dLDI5NjpbW1tbMzQsMV1dLFtbODIsMl1dLFtbODMsM11dLFtbMTExLDRdXSxbWzQ4LDVdXSxbWzgwLDZdXSxbWzEyNyw3XSxbMCw2XV0sW1s0OCw4XV0sW1s4MCw5XV0sW1swLDldXV0sezM0OjF9XSwyOTc6W1tbWzQsMV1dLFtbMjUsMl1dLFtbMTI4LDNdXSxbWzQ4LDRdLFsxMjksNV1dLFtbODAsNl1dLFtbNDksN11dLFtbMCw2XV0sW1s0OCw0XV1dLHs0OjF9XSwyOTg6W1tbWzI2LDFdXSxbWzI1LDJdXSxbWzUyLDFdLFswLDJdXV0sezI2OjF9XSwyOTk6W1tbWzM3LDFdXSxbWzQ5LDJdXSxcbltbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFsxMzAsMV0sWzAsNF1dLFtbNDgsNl1dLFtbODAsN11dLFtbMCw3XV1dLHszNzoxfV0sMzAwOltbW1syNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLHsyNToxfV0sMzAxOltbW1sxMzEsMV1dLFtbNTIsMl0sWzAsMV1dLFtbMTMxLDFdLFswLDJdXV0sezI1OjF9XSwzMDI6W1tbWzM2LDFdXSxbWzEwNSwyXSxbMTksM10sWzExMCwzXV0sW1szMiw0XV0sW1sxMDUsMl0sWzE5LDNdLFszMiw0XSxbMTEwLDNdXSxbWzEzMiw1XSxbMTUsNV0sWzM1LDZdXSxbWzAsNV1dLFtbMTMyLDddXSxbWzYxLDVdXV0sezM2OjF9XSwzMDM6W1tbWzMyLDFdXSxbWzEzMywyXV0sW1swLDJdXV0sezMyOjF9XSwzMDQ6W1tbWzEzNCwxXSxbMTM1LDFdXSxbWzAsMV1dXSx7MzI6MSwzNjoxfV0sMzA1OltbW1sxNCwxXV0sW1s0OCwyXSxbMTM2LDNdXSxbWzQ5LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSx7MTQ6MX1dLDMwNjpbW1tbMTQsMV1dLFxuW1s0OCwyXSxbMTM2LDNdXSxbWzg2LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSx7MTQ6MX1dLDMwNzpbW1tbMTgsMV1dLFtbMjUsMl1dLFtbNTIsMV0sWzAsMl1dXSx7MTg6MX1dLDMwODpbW1tbOCwxXSxbMTM3LDJdXSxbWzQ2LDJdXSxbWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMwOTpbW1tbMTM4LDFdXSxbWzEzOSwwXSxbMCwxXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzEwOltbW1szNSwxXV0sW1s2MSwyXSxbMTQwLDNdXSxbWzAsMl1dLFtbNjEsMl1dXSx7MzU6MX1dLDMxMTpbW1tbMjgsMV1dLFtbMCwxXV1dLHsyODoxfV0sMzEyOltbW1sxNDEsMV1dLFtbNTMsMl0sWzAsMV1dLFtbMTIwLDNdXSxbWzAsM11dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjU6MSwyOToxLDMzOjEsXG4zNToxLDM4OjF9XSwzMTM6W1tbWzE2LDFdXSxbWzQ5LDJdLFsxNDIsM10sWzAsMV1dLFtbNTIsNF0sWzAsMl1dLFtbNDksNV1dLFtbNDksMl0sWzAsNF1dLFtbNTIsNl0sWzAsNV1dLFtbNDksN11dLFtbNTIsOF0sWzAsN11dLFtbNDksN10sWzAsOF1dXSx7MTY6MX1dLDMxNDpbW1tbNSwxXV0sW1s0OSwyXSxbMCwxXV0sW1szNiwzXSxbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbNTIsNV0sWzAsNF1dLFtbNDksNl1dLFtbMCw2XV1dLHs1OjF9XSwzMTU6W1tbWzIzLDFdXSxbWzExMSwyXSxbMCwxXV0sW1swLDJdXV0sezIzOjF9XSwzMTY6W1tbWzE0MywxXV0sW1sxNDQsMF0sWzE0MiwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMTc6W1tbWzE0NSwxXV0sW1syLDJdLFsxNDYsM11dLFtbMCwyXV0sW1sxNDUsMV0sWzIsMl1dXSx7NToxLDY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSxcbjE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMxODpbW1tbNDgsMV1dLFtbNDksMl0sWzAsMV1dLFtbMCwyXV1dLHs0ODoxfV0sMzE5OltbW1sxNDcsMV0sWzE0OCwxXSxbMTQ5LDFdLFsxNTAsMV0sWzE1MSwxXSxbMTUyLDFdLFsxNTMsMV0sWzE1NCwxXSxbMTU1LDFdLFsxNTYsMV1dLFtbMCwxXV1dLHs1OjEsNjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMyMDpbW1tbMTUsMV1dLFtbOTUsMl1dLFtbMCwyXV1dLHsxNToxfV0sMzIxOltbW1sxLDFdLFszLDFdXSxbWzAsMV1dXSx7NDoxLDU6MSw2OjEsNzoxLFxuODoxLDk6MSwxMDoxLDExOjEsMTI6MSwxMzoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxfV0sMzIyOltbW1s0OSwxXSxbNDgsMl1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM10sWzE1Nyw0XSxbMCwyXV0sW1sxNTcsNF0sWzAsM11dLFtbMCw0XV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNDg6MX1dLDMyMzpbW1tbMTU4LDFdXSxbWzUyLDJdLFswLDFdXSxbWzE1OCwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNDg6MX1dLDMyNDpbW1tbMSwxXSxbMiwyXV0sXG5bWzAsMV1dLFtbMTU5LDNdXSxbWzEyMSw0XV0sW1sxNjAsMV0sWzEyMSw0XV1dLHsyOjEsNToxLDY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE2OjEsMTc6MSwxODoxLDE5OjEsMjI6MSwyMzoxLDI0OjEsMjU6MSwyNjoxLDI3OjEsMjg6MSwyOToxLDMwOjEsMzE6MSwzMjoxLDMzOjEsMzU6MSwzNjoxLDM4OjEsMzk6MSw0MDoxLDQzOjF9XSwzMjU6W1tbWzEyMCwxXV0sW1sxNjEsMF0sWzE1LDBdLFsxNjIsMF0sWzQxLDBdLFsxNjMsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI2OltbW1s4NCwxXSxbMTY0LDJdXSxbWzM3LDNdLFswLDFdXSxbWzAsMl1dLFtbODQsNF1dLFtbMTI3LDVdXSxbWzQ5LDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMyNzpbW1tbMTY1LFxuMV0sWzg0LDFdXSxbWzAsMV1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI4OltbW1s0OSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMjk6W1tbWzQ5LDFdLFsxMDcsMV1dLFtbNTQsMl0sWzUyLDNdLFswLDFdXSxbWzAsMl1dLFtbNDksNF0sWzEwNyw0XSxbMCwzXV0sW1s1MiwzXSxbMCw0XV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzMDpbW1tbNDksMV0sWzEwNywxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMTA3LDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsXG4yMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMzE6W1tbWzI1LDFdXSxbWzQ4LDJdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSx7MjU6MX1dLDMzMjpbW1tbMzUsMV0sWzExMCwyXSxbMzgsM11dLFtbNjEsNF0sWzgxLDVdXSxbWzI1LDRdXSxbWzE2Niw2XV0sW1swLDRdXSxbWzYxLDRdXSxbWzY0LDRdXV0sezM1OjEsMzg6MSwxMTA6MX1dLDMzMzpbW1tbMjAsMV1dLFtbNDgsMl1dLFtbODAsM11dLFtbMTY3LDRdLFsxNjgsNV1dLFtbNDgsNl1dLFtbNDgsN11dLFtbODAsOF1dLFtbODAsOV1dLFtbMTY3LDRdLFsxMjcsMTBdLFsxNjgsNV0sWzAsOF1dLFtbMCw5XV0sW1s0OCwxMV1dLFtbODAsMTJdXSxbWzE2OCw1XSxbMCwxMl1dXSx7MjA6MX1dLDMzNDpbW1tbMTUsMV0sWzE2OSwyXSxbNTMsM11dLFtbMTY5LDRdLFs1Miw1XSxbMCwxXV0sW1s1MCw2XSxbNTIsN10sWzAsMl1dLFtbMTY5LDhdXSxbWzUyLDVdLFswLDRdXSxbWzE2OSw5XSxbNTMsM10sWzAsXG41XV0sW1s0OSwxMF1dLFtbMTUsMTFdLFsxNjksMl0sWzUzLDNdLFswLDddXSxbWzUyLDEyXSxbMCw4XV0sW1s1MCwxM10sWzUyLDVdLFswLDldXSxbWzUyLDddLFswLDEwXV0sW1sxNjksMTRdLFs1MiwxNV0sWzAsMTFdXSxbWzAsMTJdXSxbWzQ5LDRdXSxbWzUyLDE1XSxbMCwxNF1dLFtbMTY5LDE2XSxbNTMsM10sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSx7MTU6MSwyNToxLDUzOjF9XSwzMzU6W1tbWzE1LDFdLFs1MywyXSxbMTcwLDNdXSxbWzE3MCw1XSxbNTIsNF0sWzAsMV1dLFtbMTcwLDZdXSxbWzUwLDddLFs1Miw4XSxbMCwzXV0sW1s1MywyXSxbMTcwLDldLFswLDRdXSxbWzUyLDRdLFswLDVdXSxbWzUyLDEwXSxbMCw2XV0sW1s0OSwxMV1dLFtbMTUsMTJdLFs1MywyXSxbMTcwLDNdLFswLDhdXSxbWzUwLDEzXSxbNTIsNF0sWzAsOV1dLFtbMCwxMF1dLFtbNTIsOF0sWzAsMTFdXSxbWzUyLDE1XSxbMTcwLDE0XSxbMCwxMl1dLFtbNDksNV1dLFxuW1s1MiwxNV0sWzAsMTRdXSxbWzUzLDJdLFsxNzAsMTZdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sezE1OjEsMjU6MSw1MzoxfV0sMzM2OltbW1syNSwxXV0sW1swLDFdXV0sezI1OjF9XSwzMzc6W1tbWzIxLDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMCw0XV0sW1s0OCw2XV0sW1s4MCw3XV0sW1swLDddXV0sezIxOjF9XSwzMzg6W1tbWzQ5LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1s5NSwzXV0sW1swLDNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzOTpbW1tbNDIsMV1dLFtbMTcxLDJdXSxbWzQ4LDNdLFs1MiwxXV0sW1s4MCw0XV0sW1swLDRdXV0sezQyOjF9XSwzNDA6W1tbWzE3MiwxXV0sW1sxNzMsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLFxuMzU6MSwzODoxLDQzOjF9XSwzNDE6W1tbWzExMSwyXSxbMzYsMV1dLFtbNDksMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzNjoxLDM4OjEsNDM6MX1dLDM0MjpbW1tbMzEsMV1dLFtbMTc0LDJdLFswLDFdXSxbWzAsMl1dXSx7MzE6MX1dLDM0MzpbW1tbNjIsMV1dLFtbMCwxXV1dLHszMToxfV19LHN0YXRlczpbW1tbMSwxXSxbMiwxXSxbMywyXV0sW1swLDFdXSxbWzIsMV1dXSxbW1s0NCwxXV0sW1s0NSwwXSxbMCwxXV1dLFtbWzQ2LDFdXSxbWzQ3LDBdLFswLDFdXV0sW1tbNDgsMV1dLFtbNDksMl1dLFtbNTAsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLFtbWzUxLDFdXSxbWzUyLDJdLFswLDFdXSxbWzUxLDFdLFswLDJdXV0sW1tbNDksMV0sWzE1LDJdLFs1MywyXV0sW1s1MCwyXSxbNTQsM10sWzAsMV1dLFtbNDksM11dLFtbMCwzXV1dLFtbWzU1LDFdXSxbWzMwLDBdLFs0MywwXSxcblswLDFdXV0sW1tbMjQsMV1dLFtbNDksMl1dLFtbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLFtbWzEwLDFdXSxbWzU2LDJdXSxbWzAsMl1dXSxbW1sxMCwxXV0sW1s1NywyXSxbNTYsMl0sWzU4LDJdXSxbWzAsMl1dXSxbW1s2LDFdLFsyNSwxXSxbMzMsMV0sWzksMV0sWzExLDFdLFsxMiwyXSxbMzUsM10sWzM4LDRdLFsxOSwxXSxbNyw1XV0sW1swLDFdXSxbWzU5LDFdLFs2MCw2XV0sW1s2MSwxXSxbNjIsN10sWzYzLDddXSxbWzY0LDFdLFs2Myw4XV0sW1s3LDVdLFswLDVdXSxbWzU5LDFdXSxbWzYxLDFdXSxbWzY0LDFdXV0sW1tbMjksMV0sWzY1LDJdXSxbWzY1LDJdXSxbWzY2LDJdLFswLDJdXV0sW1tbNjcsMV0sWzY4LDFdLFs2OSwxXSxbNzAsMV0sWzcxLDFdLFs3MiwxXSxbNzMsMV0sWzc0LDFdLFs3NSwxXSxbNzYsMV0sWzc3LDFdLFs3OCwxXSxbNzksMV1dLFtbMCwxXV1dLFtbWzM5LDFdXSxbWzAsMV1dXSxbW1sxMywxXV0sW1syNSwyXV0sW1s0OCwzXSxbMzUsNF1dLFxuW1s4MCw1XV0sW1s2MSw2XSxbODEsN11dLFtbMCw1XV0sW1s0OCwzXV0sW1s2MSw2XV1dLFtbWzEwLDFdLFszNCwyXV0sW1szNCwyXV0sW1s4MiwzXV0sW1s4Myw0XV0sW1s4NCw1XV0sW1s4NSw2XSxbMCw1XV0sW1swLDZdXV0sW1tbMzcsMV1dLFtbODYsMl1dLFtbODUsM10sWzAsMl1dLFtbMCwzXV1dLFtbWzg3LDFdLFs1NCwxXV0sW1swLDFdXV0sW1tbODgsMV0sWzg5LDFdLFs4LDJdLFs5MCwxXSxbODgsMV0sWzgzLDFdLFs5MSwxXSxbOTIsM10sWzkzLDFdLFs5NCwxXV0sW1swLDFdXSxbWzgzLDFdXSxbWzgsMV0sWzAsM11dXSxbW1s5NSwxXV0sW1s5NiwwXSxbMCwxXV1dLFtbWzk3LDFdLFs5OCwxXSxbNTgsMV0sWzk5LDFdLFs1NywxXSxbMTAwLDFdLFs1NiwxXSxbMTAxLDFdLFsxMDIsMV1dLFtbMCwxXV1dLFtbWzQwLDFdXSxbWzAsMV1dXSxbW1sxNywxXV0sW1swLDFdXV0sW1tbMTAzLDFdXSxbWzU2LDJdLFsxMDQsMl0sWzk5LDJdXSxbWzAsMl1dXSxbW1s0MSwxXV0sW1sxMDUsXG4yXV0sW1syLDRdLFszNSwzXV0sW1s2MSw1XSxbODEsNl1dLFtbMCw0XV0sW1syLDRdXSxbWzYxLDVdXV0sW1tbMTA2LDFdXSxbWzEwNiwxXSxbMCwxXV1dLFtbWzI3LDFdXSxbWzgyLDJdXSxbWzAsMl1dXSxbW1s0OSwxXSxbMTA3LDJdLFs1MywzXV0sW1s0OCw0XSxbNTQsNV0sWzUyLDZdLFswLDFdXSxbWzU0LDVdLFs1Miw2XSxbMCwyXV0sW1s5NSw3XV0sW1s0OSw3XV0sW1swLDVdXSxbWzQ5LDhdLFsxMDcsOF0sWzAsNl1dLFtbNTQsNV0sWzUyLDldLFswLDddXSxbWzUyLDZdLFswLDhdXSxbWzQ5LDEwXSxbNTMsMTFdLFswLDldXSxbWzQ4LDEyXV0sW1s5NSwxM11dLFtbNDksMTNdXSxbWzUyLDldLFswLDEzXV1dLFtbWzEwNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLFtbWzEwOSwxXV0sW1s1MiwwXSxbMCwxXV1dLFtbWzI1LDFdXSxbWzExMCwwXSxbMCwxXV1dLFtbWzI1LDFdXSxbWzAsMV1dXSxbW1sxMTEsMV1dLFtbMiwxXSxbMTEyLDJdXSxbWzAsMl1dXSxcbltbWzExMywxXV0sW1s0OSwyXSxbMCwxXV0sW1sxMDgsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzAsNF1dXSxbW1sxMTQsMV1dLFtbMTE1LDBdLFswLDFdXV0sW1tbMTE2LDFdXSxbWzExNywyXSxbNTAsM10sWzExOCw0XSxbMCwxXV0sW1sxMTEsNF0sWzYyLDRdXSxbWzExNiw1XSxbNjIsNV1dLFtbMCw0XV0sW1s1MCwzXSxbMCw1XV1dLFtbWzk1LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbOTUsMV0sWzEwNywxXSxbMCwyXV1dLFtbWzExOSwyXSxbMzAsMV0sWzIyLDFdLFs0MywxXV0sW1sxMjAsMl1dLFtbMCwyXV1dLFtbWzIsMF0sWzExMiwxXSxbMTIxLDBdXSxbWzAsMV1dXSxbW1sxMjIsMV0sWzEyMywxXSxbMTI0LDFdLFsxMjUsMV0sWzEyNiwxXV0sW1swLDFdXV0sW1tbMzQsMV1dLFtbODIsMl1dLFtbODMsM11dLFtbMTExLDRdXSxbWzQ4LDVdXSxbWzgwLDZdXSxbWzEyNyw3XSxbMCw2XV0sW1s0OCw4XV0sW1s4MCw5XV0sW1swLDldXV0sW1tbNCwxXV0sW1syNSxcbjJdXSxbWzEyOCwzXV0sW1s0OCw0XSxbMTI5LDVdXSxbWzgwLDZdXSxbWzQ5LDddXSxbWzAsNl1dLFtbNDgsNF1dXSxbW1syNiwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLFtbWzM3LDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMTMwLDFdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSxbW1syNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLFtbWzEzMSwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxMzEsMV0sWzAsMl1dXSxbW1szNiwxXV0sW1sxMDUsMl0sWzE5LDNdLFsxMTAsM11dLFtbMzIsNF1dLFtbMTA1LDJdLFsxOSwzXSxbMzIsNF0sWzExMCwzXV0sW1sxMzIsNV0sWzE1LDVdLFszNSw2XV0sW1swLDVdXSxbWzEzMiw3XV0sW1s2MSw1XV1dLFtbWzMyLDFdXSxbWzEzMywyXV0sW1swLDJdXV0sW1tbMTM0LDFdLFsxMzUsMV1dLFtbMCwxXV1dLFtbWzE0LDFdXSxbWzQ4LDJdLFsxMzYsM11dLFtbNDksNF1dLFtbNDgsXG4yXV0sW1swLDRdXV0sW1tbMTQsMV1dLFtbNDgsMl0sWzEzNiwzXV0sW1s4Niw0XV0sW1s0OCwyXV0sW1swLDRdXV0sW1tbMTgsMV1dLFtbMjUsMl1dLFtbNTIsMV0sWzAsMl1dXSxbW1s4LDFdLFsxMzcsMl1dLFtbNDYsMl1dLFtbMCwyXV1dLFtbWzEzOCwxXV0sW1sxMzksMF0sWzAsMV1dXSxbW1szNSwxXV0sW1s2MSwyXSxbMTQwLDNdXSxbWzAsMl1dLFtbNjEsMl1dXSxbW1syOCwxXV0sW1swLDFdXV0sW1tbMTQxLDFdXSxbWzUzLDJdLFswLDFdXSxbWzEyMCwzXV0sW1swLDNdXV0sW1tbMTYsMV1dLFtbNDksMl0sWzE0MiwzXSxbMCwxXV0sW1s1Miw0XSxbMCwyXV0sW1s0OSw1XV0sW1s0OSwyXSxbMCw0XV0sW1s1Miw2XSxbMCw1XV0sW1s0OSw3XV0sW1s1Miw4XSxbMCw3XV0sW1s0OSw3XSxbMCw4XV1dLFtbWzUsMV1dLFtbNDksMl0sWzAsMV1dLFtbMzYsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzUyLDVdLFswLDRdXSxbWzQ5LDZdXSxbWzAsNl1dXSxbW1syMywxXV0sW1sxMTEsXG4yXSxbMCwxXV0sW1swLDJdXV0sW1tbMTQzLDFdXSxbWzE0NCwwXSxbMTQyLDBdLFswLDFdXV0sW1tbMTQ1LDFdXSxbWzIsMl0sWzE0NiwzXV0sW1swLDJdXSxbWzE0NSwxXSxbMiwyXV1dLFtbWzQ4LDFdXSxbWzQ5LDJdLFswLDFdXSxbWzAsMl1dXSxbW1sxNDcsMV0sWzE0OCwxXSxbMTQ5LDFdLFsxNTAsMV0sWzE1MSwxXSxbMTUyLDFdLFsxNTMsMV0sWzE1NCwxXSxbMTU1LDFdLFsxNTYsMV1dLFtbMCwxXV1dLFtbWzE1LDFdXSxbWzk1LDJdXSxbWzAsMl1dXSxbW1sxLDFdLFszLDFdXSxbWzAsMV1dXSxbW1s0OSwxXSxbNDgsMl1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM10sWzE1Nyw0XSxbMCwyXV0sW1sxNTcsNF0sWzAsM11dLFtbMCw0XV1dLFtbWzE1OCwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxNTgsMV0sWzAsMl1dXSxbW1sxLDFdLFsyLDJdXSxbWzAsMV1dLFtbMTU5LDNdXSxbWzEyMSw0XV0sW1sxNjAsMV0sWzEyMSw0XV1dLFtbWzEyMCwxXV0sW1sxNjEsMF0sWzE1LDBdLFsxNjIsXG4wXSxbNDEsMF0sWzE2MywwXSxbMCwxXV1dLFtbWzg0LDFdLFsxNjQsMl1dLFtbMzcsM10sWzAsMV1dLFtbMCwyXV0sW1s4NCw0XV0sW1sxMjcsNV1dLFtbNDksMl1dXSxbW1sxNjUsMV0sWzg0LDFdXSxbWzAsMV1dXSxbW1s0OSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMCwyXV1dLFtbWzQ5LDFdLFsxMDcsMV1dLFtbNTQsMl0sWzUyLDNdLFswLDFdXSxbWzAsMl1dLFtbNDksNF0sWzEwNyw0XSxbMCwzXV0sW1s1MiwzXSxbMCw0XV1dLFtbWzQ5LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbNDksMV0sWzEwNywxXSxbMCwyXV1dLFtbWzI1LDFdXSxbWzQ4LDJdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSxbW1szNSwxXSxbMTEwLDJdLFszOCwzXV0sW1s2MSw0XSxbODEsNV1dLFtbMjUsNF1dLFtbMTY2LDZdXSxbWzAsNF1dLFtbNjEsNF1dLFtbNjQsNF1dXSxbW1syMCwxXV0sW1s0OCwyXV0sW1s4MCwzXV0sW1sxNjcsNF0sWzE2OCw1XV0sW1s0OCw2XV0sW1s0OCw3XV0sXG5bWzgwLDhdXSxbWzgwLDldXSxbWzE2Nyw0XSxbMTI3LDEwXSxbMTY4LDVdLFswLDhdXSxbWzAsOV1dLFtbNDgsMTFdXSxbWzgwLDEyXV0sW1sxNjgsNV0sWzAsMTJdXV0sW1tbMTUsMV0sWzE2OSwyXSxbNTMsM11dLFtbMTY5LDRdLFs1Miw1XSxbMCwxXV0sW1s1MCw2XSxbNTIsN10sWzAsMl1dLFtbMTY5LDhdXSxbWzUyLDVdLFswLDRdXSxbWzE2OSw5XSxbNTMsM10sWzAsNV1dLFtbNDksMTBdXSxbWzE1LDExXSxbMTY5LDJdLFs1MywzXSxbMCw3XV0sW1s1MiwxMl0sWzAsOF1dLFtbNTAsMTNdLFs1Miw1XSxbMCw5XV0sW1s1Miw3XSxbMCwxMF1dLFtbMTY5LDE0XSxbNTIsMTVdLFswLDExXV0sW1swLDEyXV0sW1s0OSw0XV0sW1s1MiwxNV0sWzAsMTRdXSxbWzE2OSwxNl0sWzUzLDNdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sW1tbMTUsMV0sWzUzLDJdLFsxNzAsM11dLFtbMTcwLDVdLFs1Miw0XSxbMCwxXV0sW1sxNzAsNl1dLFtbNTAsN10sWzUyLFxuOF0sWzAsM11dLFtbNTMsMl0sWzE3MCw5XSxbMCw0XV0sW1s1Miw0XSxbMCw1XV0sW1s1MiwxMF0sWzAsNl1dLFtbNDksMTFdXSxbWzE1LDEyXSxbNTMsMl0sWzE3MCwzXSxbMCw4XV0sW1s1MCwxM10sWzUyLDRdLFswLDldXSxbWzAsMTBdXSxbWzUyLDhdLFswLDExXV0sW1s1MiwxNV0sWzE3MCwxNF0sWzAsMTJdXSxbWzQ5LDVdXSxbWzUyLDE1XSxbMCwxNF1dLFtbNTMsMl0sWzE3MCwxNl0sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSxbW1syNSwxXV0sW1swLDFdXV0sW1tbMjEsMV1dLFtbNDksMl1dLFtbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSxbW1s0OSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbOTUsM11dLFtbMCwzXV1dLFtbWzQyLDFdXSxbWzE3MSwyXV0sW1s0OCwzXSxbNTIsMV1dLFtbODAsNF1dLFtbMCw0XV1dLFtbWzE3MiwxXV0sW1sxNzMsMF0sWzAsMV1dXSxbW1sxMTEsMl0sXG5bMzYsMV1dLFtbNDksMl1dLFtbMCwyXV1dLFtbWzMxLDFdXSxbWzE3NCwyXSxbMCwxXV0sW1swLDJdXV0sW1tbNjIsMV1dLFtbMCwxXV1dXSxsYWJlbHM6W1swLFwiRU1QVFlcIl0sWzMxNyxudWxsXSxbNCxudWxsXSxbMjc2LG51bGxdLFsxLFwiZGVmXCJdLFsxLFwicmFpc2VcIl0sWzEsXCJUcnVlXCJdLFszLG51bGxdLFsxLFwibm90XCJdLFsxLFwibnVsbFwiXSxbNTUsbnVsbF0sWzIsbnVsbF0sWzI1LG51bGxdLFsxLFwiY2xhc3NcIl0sWzEsXCJsYW1iZGFcIl0sWzE2LG51bGxdLFsxLFwicHJpbnRcIl0sWzEsXCJkZWJ1Z2dlclwiXSxbMSxcIm5vbmxvY2FsXCJdLFs1MixudWxsXSxbMSxcInRyeVwiXSxbMSxcIndoaWxlXCJdLFszMSxudWxsXSxbMSxcInJldHVyblwiXSxbMSxcImFzc2VydFwiXSxbMSxudWxsXSxbMSxcImdsb2JhbFwiXSxbMSxcImRlbFwiXSxbMSxcInBhc3NcIl0sWzU0LG51bGxdLFsxNSxudWxsXSxbMSxcInlpZWxkXCJdLFsxLFwiaW1wb3J0XCJdLFsxLFwiRmFsc2VcIl0sWzEsXCJmb3JcIl0sWzcsbnVsbF0sWzEsXCJmcm9tXCJdLFsxLFxuXCJpZlwiXSxbOSxudWxsXSxbMSxcImJyZWFrXCJdLFsxLFwiY29udGludWVcIl0sWzQ5LG51bGxdLFsxLFwid2l0aFwiXSxbMTQsbnVsbF0sWzMxNixudWxsXSxbMTksbnVsbF0sWzMwOCxudWxsXSxbMSxcImFuZFwiXSxbMTEsbnVsbF0sWzMyNixudWxsXSxbMjIsbnVsbF0sWzI2MSxudWxsXSxbMTIsbnVsbF0sWzM1LG51bGxdLFsyNzEsbnVsbF0sWzMyNSxudWxsXSxbMjk3LG51bGxdLFszMzksbnVsbF0sWzI5NixudWxsXSxbMjYsbnVsbF0sWzI4MyxudWxsXSxbOCxudWxsXSxbMzQyLG51bGxdLFszMjksbnVsbF0sWzEwLG51bGxdLFsyNjYsbnVsbF0sWzMzMixudWxsXSxbNDUsbnVsbF0sWzM4LG51bGxdLFs0MCxudWxsXSxbNTAsbnVsbF0sWzQ2LG51bGxdLFs0MSxudWxsXSxbNDIsbnVsbF0sWzM2LG51bGxdLFs0MyxudWxsXSxbNDgsbnVsbF0sWzQ0LG51bGxdLFszNyxudWxsXSxbMzksbnVsbF0sWzMyNCxudWxsXSxbMjYwLG51bGxdLFsyOTIsbnVsbF0sWzEsXCJpblwiXSxbMzA5LG51bGxdLFsyNzMsXG5udWxsXSxbMzI3LG51bGxdLFsyNzIsbnVsbF0sWzI4LG51bGxdLFsyMSxudWxsXSxbMjcsbnVsbF0sWzI5LG51bGxdLFsxLFwiaXNcIl0sWzMwLG51bGxdLFsyMCxudWxsXSxbMjkwLG51bGxdLFsyNzQsbnVsbF0sWzMzMyxudWxsXSxbMjk5LG51bGxdLFsyNzAsbnVsbF0sWzMzNyxudWxsXSxbMjc5LG51bGxdLFsyNjUsbnVsbF0sWzI4MSxudWxsXSxbMjY0LG51bGxdLFsyODYsbnVsbF0sWzI4MCxudWxsXSxbMzIwLG51bGxdLFsxLFwiYXNcIl0sWzI4NCxudWxsXSxbMjMsbnVsbF0sWzMyOCxudWxsXSxbMCxudWxsXSxbMSxcImV4Y2VwdFwiXSxbMzQwLG51bGxdLFsxOCxudWxsXSxbMzMwLG51bGxdLFsyNjgsbnVsbF0sWzI1OSxudWxsXSxbMzEyLG51bGxdLFsyOTMsbnVsbF0sWzMyMSxudWxsXSxbMjY5LG51bGxdLFsyNzcsbnVsbF0sWzMxNCxudWxsXSxbMzE1LG51bGxdLFszNDMsbnVsbF0sWzEsXCJlbHNlXCJdLFszMTAsbnVsbF0sWzUxLG51bGxdLFsxLFwiZWxpZlwiXSxbMzAwLG51bGxdLFszMDEsXG5udWxsXSxbMjg1LG51bGxdLFszMDMsbnVsbF0sWzMwMixudWxsXSxbMzM1LG51bGxdLFsyNzUsbnVsbF0sWzI1OCxudWxsXSxbMSxcIm9yXCJdLFszMzQsbnVsbF0sWzI2NyxudWxsXSxbMzQsbnVsbF0sWzI2MixudWxsXSxbMzMsbnVsbF0sWzMxOSxudWxsXSxbMTMsbnVsbF0sWzI5NSxudWxsXSxbMjYzLG51bGxdLFsyOTEsbnVsbF0sWzMxMSxudWxsXSxbMzA3LG51bGxdLFszMTMsbnVsbF0sWzI4MixudWxsXSxbMjk4LG51bGxdLFszMDQsbnVsbF0sWzI3OCxudWxsXSxbMzE4LG51bGxdLFszMjIsbnVsbF0sWzUsbnVsbF0sWzYsbnVsbF0sWzQ3LG51bGxdLFsxNyxudWxsXSxbMjQsbnVsbF0sWzMwNSxudWxsXSxbMzA2LG51bGxdLFszMjMsbnVsbF0sWzI4OSxudWxsXSxbMSxcImZpbmFsbHlcIl0sWzMzMSxudWxsXSxbMzM2LG51bGxdLFszMzgsbnVsbF0sWzI1NyxudWxsXSxbMzIsbnVsbF0sWzM0MSxudWxsXV0sa2V5d29yZHM6e0ZhbHNlOjMzLFwibnVsbFwiOjksVHJ1ZTo2LGFuZDo0NyxcbmFzOjEwOCxhc3NlcnQ6MjQsXCJicmVha1wiOjM5LFwiY2xhc3NcIjoxMyxcImNvbnRpbnVlXCI6NDAsXCJkZWJ1Z2dlclwiOjE3LGRlZjo0LGRlbDoyNyxlbGlmOjEzMCxcImVsc2VcIjoxMjcsZXhjZXB0OjExMyxcImZpbmFsbHlcIjoxNjgsXCJmb3JcIjozNCxmcm9tOjM2LGdsb2JhbDoyNixcImlmXCI6MzcsXCJpbXBvcnRcIjozMixcImluXCI6ODMsaXM6OTIsbGFtYmRhOjE0LG5vbmxvY2FsOjE4LG5vdDo4LG9yOjEzOSxwYXNzOjI4LHByaW50OjE2LHJhaXNlOjUsXCJyZXR1cm5cIjoyMyxcInRyeVwiOjIwLFwid2hpbGVcIjoyMSxcIndpdGhcIjo0Mix5aWVsZDozMX0sdG9rZW5zOnswOjExMiwxOjI1LDI6MTEsMzo3LDQ6Miw1OjE1OSw2OjE2MCw3OjM1LDg6NjEsOTozOCwxMDo2NCwxMTo0OCwxMjo1MiwxMzoxNDYsMTQ6NDMsMTU6MzAsMTY6MTUsMTc6MTYyLDE4OjExNSwxOTo0NSwyMDo5NCwyMTo4OSwyMjo1MCwyMzoxMTAsMjQ6MTYzLDI1OjEyLDI2OjU5LDI3OjkwLDI4Ojg4LDI5OjkxLDMwOjkzLDMxOjIyLDMyOjE3MyxcbjMzOjE0NCwzNDoxNDIsMzU6NTMsMzY6NzQsMzc6NzgsMzg6NjgsMzk6NzksNDA6NjksNDE6NzIsNDI6NzMsNDM6NzUsNDQ6NzcsNDU6NjcsNDY6NzEsNDc6MTYxLDQ4Ojc2LDQ5OjQxLDUwOjcwLDUxOjEyOSw1MjoxOSw1NDoyOSw1NToxMH0sc3RhcnQ6MjU2fX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5maWxlbmFtZT1hO3RoaXMuZ3JhbW1hcj1jO3RoaXMucF9mbGFncz0wO3JldHVybiB0aGlzfWZ1bmN0aW9uIGMoYixjKXt2b2lkIDA9PT1jJiYoYz1cImZpbGVfaW5wdXRcIik7Yj1uZXcgYShiLFNrLlBhcnNlVGFibGVzKTtcImZpbGVfaW5wdXRcIj09PWM/Yi5zZXR1cChTay5QYXJzZVRhYmxlcy5zeW0uZmlsZV9pbnB1dCk6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIik7cmV0dXJuIGJ9YS5GVVRVUkVfUFJJTlRfRlVOQ1RJT049XCJwcmludF9mdW5jdGlvblwiO2EuRlVUVVJFX1VOSUNPREVfTElURVJBTFM9XCJ1bmljb2RlX2xpdGVyYWxzXCI7YS5GVVRVUkVfRElWSVNJT049XG5cImRpdmlzaW9uXCI7YS5GVVRVUkVfQUJTT0xVVEVfSU1QT1JUPVwiYWJzb2x1dGVfaW1wb3J0XCI7YS5GVVRVUkVfV0lUSF9TVEFURU1FTlQ9XCJ3aXRoX3N0YXRlbWVudFwiO2EuRlVUVVJFX05FU1RFRF9TQ09QRVM9XCJuZXN0ZWRfc2NvcGVzXCI7YS5GVVRVUkVfR0VORVJBVE9SUz1cImdlbmVyYXRvcnNcIjthLkNPX0ZVVFVSRV9QUklOVF9GVU5DVElPTj02NTUzNjthLkNPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTPTEzMTA3MjthLkNPX0ZVVFVSRV9ESVZJU09OPTgxOTI7YS5DT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUPTE2Mzg0O2EuQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UPTMyNzY4O2EucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKGEpe2E9YXx8dGhpcy5ncmFtbWFyLnN0YXJ0O3RoaXMuc3RhY2s9W3tkZmE6dGhpcy5ncmFtbWFyLmRmYXNbYV0sc3RhdGU6MCxub2RlOnt0eXBlOmEsdmFsdWU6bnVsbCxjb250ZXh0Om51bGwsY2hpbGRyZW46W119fV07dGhpcy51c2VkX25hbWVzPXt9fTthLnByb3RvdHlwZS5hZGR0b2tlbj1cbmZ1bmN0aW9uKGEsYyxmKXt2YXIgYixlPXRoaXMuY2xhc3NpZnkoYSxjLGYpO2E6Zm9yKDs7KXt2YXIgZD10aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdO3ZhciBnPWQuZGZhWzBdO3ZhciBuPWdbZC5zdGF0ZV07Zm9yKGI9MDtiPG4ubGVuZ3RoOysrYil7dmFyIGs9bltiXVswXTt2YXIgcD1uW2JdWzFdO3ZhciBtPXRoaXMuZ3JhbW1hci5sYWJlbHNba11bMF07aWYoZT09PWspe1NrLmFzc2VydHMuYXNzZXJ0KDI1Nj5tKTt0aGlzLnNoaWZ0KGEsYyxwLGYpO2ZvcihmPXA7MT09PWdbZl0ubGVuZ3RoJiYwPT09Z1tmXVswXVswXSYmZ1tmXVswXVsxXT09PWY7KXt0aGlzLnBvcCgpO2lmKDA9PT10aGlzLnN0YWNrLmxlbmd0aClyZXR1cm4hMDtkPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV07Zj1kLnN0YXRlO2c9ZC5kZmFbMF19cmV0dXJuITF9aWYoMjU2PD1tJiYoaz10aGlzLmdyYW1tYXIuZGZhc1ttXSxrPWtbMV0say5oYXNPd25Qcm9wZXJ0eShlKSkpe3RoaXMucHVzaChtLFxudGhpcy5ncmFtbWFyLmRmYXNbbV0scCxmKTtjb250aW51ZSBhfX1iOntnPVswLGQuc3RhdGVdO2ZvcihkPW4ubGVuZ3RoO2QtLTspaWYobltkXVswXT09PWdbMF0mJm5bZF1bMV09PT1nWzFdKXtuPSEwO2JyZWFrIGJ9bj0hMX1pZihuKXtpZih0aGlzLnBvcCgpLDA9PT10aGlzLnN0YWNrLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInRvbyBtdWNoIGlucHV0XCIsdGhpcy5maWxlbmFtZSk7fWVsc2UgdGhyb3cgYT1mWzBdWzBdLG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYmFkIGlucHV0XCIsdGhpcy5maWxlbmFtZSxhLGYpO319O2EucHJvdG90eXBlLmNsYXNzaWZ5PWZ1bmN0aW9uKGIsYyxmKXtpZihiPT09U2sudG9rZW4udG9rZW5zLlRfTkFNRSl7dGhpcy51c2VkX25hbWVzW2NdPSEwO3ZhciBlPXRoaXMuZ3JhbW1hci5rZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eShjKSYmdGhpcy5ncmFtbWFyLmtleXdvcmRzW2NdO1wicHJpbnRcIj09PWMmJih0aGlzLnBfZmxhZ3MmXG5hLkNPX0ZVVFVSRV9QUklOVF9GVU5DVElPTnx8ITA9PT1Tay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uKSYmKGU9ITEpO2lmKGUpcmV0dXJuIGV9ZT10aGlzLmdyYW1tYXIudG9rZW5zLmhhc093blByb3BlcnR5KGIpJiZ0aGlzLmdyYW1tYXIudG9rZW5zW2JdO2lmKCFlKXtjPVwiI1wiK2I7Zm9yKGxldCBhIGluIFNrLnRva2VuLnRva2VucylpZihTay50b2tlbi50b2tlbnNbYV09PWIpe2M9YTticmVha310aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImJhZCB0b2tlbiBcIitjLHRoaXMuZmlsZW5hbWUsZlswXVswXSxmKTt9cmV0dXJuIGV9O2EucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKGEsYyxmLGwpe3ZhciBiPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV0uZGZhLGQ9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlO2QuY2hpbGRyZW4ucHVzaCh7dHlwZTphLHZhbHVlOmMsbGluZW5vOmxbMF1bMF0sY29sX29mZnNldDpsWzBdWzFdLGNoaWxkcmVuOm51bGx9KTtcbnRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV09e2RmYTpiLHN0YXRlOmYsbm9kZTpkfX07YS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihhLGMsZixsKXthPXt0eXBlOmEsdmFsdWU6bnVsbCxsaW5lbm86bFswXVswXSxjb2xfb2Zmc2V0OmxbMF1bMV0sY2hpbGRyZW46W119O3RoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV09e2RmYTp0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLmRmYSxzdGF0ZTpmLG5vZGU6dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlfTt0aGlzLnN0YWNrLnB1c2goe2RmYTpjLHN0YXRlOjAsbm9kZTphfSl9O2EucHJvdG90eXBlLnBvcD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc3RhY2sucG9wKCkubm9kZTtpZihhKWlmKDAhPT10aGlzLnN0YWNrLmxlbmd0aCl7dmFyIGM9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlO2MuY2hpbGRyZW4ucHVzaChhKX1lbHNlIHRoaXMucm9vdG5vZGU9YSx0aGlzLnJvb3Rub2RlLnVzZWRfbmFtZXM9XG50aGlzLnVzZWRfbmFtZXN9O1NrLnBhcnNlPWZ1bmN0aW9uKGEsZSl7dmFyIGI9U2sudG9rZW4udG9rZW5zLlRfQ09NTUVOVCxsPVNrLnRva2VuLnRva2Vucy5UX05MLGg9U2sudG9rZW4udG9rZW5zLlRfT1AsZD1Tay50b2tlbi50b2tlbnMuVF9FTkRNQVJLRVIsZz1Tay50b2tlbi50b2tlbnMuVF9FTkNPRElORyxuPSExLGs9YyhhKTtTay5fdG9rZW5pemUoYSxmdW5jdGlvbihhKXt2YXIgYj1hLnNwbGl0KFwiXFxuXCIpLnJldmVyc2UoKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGErXCJcXG5cIn0pO3JldHVybiBmdW5jdGlvbigpe2lmKDA9PT1iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXCJFT0ZcIik7cmV0dXJuIGIucG9wKCl9fShlKSxcInV0Zi04XCIsZnVuY3Rpb24oYSl7dmFyIGM9bnVsbDthLnR5cGUhPT1iJiZhLnR5cGUhPT1sJiZhLnR5cGUhPT1nJiYoYS50eXBlPT09aCYmKGM9U2suT3BNYXBbYS5zdHJpbmddKSxrLmFkZHRva2VuKGN8fGEudHlwZSxhLnN0cmluZyxcblthLnN0YXJ0LGEuZW5kLGEubGluZV0pLGEudHlwZT09PWQmJihuPSEwKSl9KTtpZighbil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImluY29tcGxldGUgaW5wdXRcIix0aGlzLmZpbGVuYW1lKTtyZXR1cm57Y3N0Omsucm9vdG5vZGUsZmxhZ3M6ay5wX2ZsYWdzfX07U2sucGFyc2VUcmVlRHVtcD1mdW5jdGlvbihhLGMpe3ZhciBiO2M9Y3x8XCJcIjt2YXIgZT1cIlwiK2M7aWYoMjU2PD1hLnR5cGUpZm9yKGUrPVNrLlBhcnNlVGFibGVzLm51bWJlcjJzeW1ib2xbYS50eXBlXStcIlxcblwiLGI9MDtiPGEuY2hpbGRyZW4ubGVuZ3RoOysrYillKz1Tay5wYXJzZVRyZWVEdW1wKGEuY2hpbGRyZW5bYl0sYytcIiAgXCIpO2Vsc2UgZSs9U2sudG9rZW4udG9rX25hbWVbYS50eXBlXStcIjogXCIrKG5ldyBTay5idWlsdGluLnN0cihhLnZhbHVlKSkuJHIoKS52K1wiXFxuXCI7cmV0dXJuIGV9O1NrLmV4cG9ydFN5bWJvbChcIlNrLlBhcnNlclwiLGEpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnBhcnNlXCIsU2sucGFyc2UpO1xuU2suZXhwb3J0U3ltYm9sKFwiU2sucGFyc2VUcmVlRHVtcFwiLFNrLnBhcnNlVHJlZUR1bXApfSxmdW5jdGlvbihtLHEpe1NrLmFzdG5vZGVzPXt9O1NrLmFzdG5vZGVzLkxvYWQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlN0b3JlPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5EZWw9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkF1Z0xvYWQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkF1Z1N0b3JlPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5QYXJhbT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQW5kPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Pcj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQWRkPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5TdWI9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk11bHQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk1hdE11bHQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkRpdj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTW9kPWZ1bmN0aW9uKCl7fTtcblNrLmFzdG5vZGVzLlBvdz1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTFNoaWZ0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5SU2hpZnQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkJpdE9yPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5CaXRYb3I9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkJpdEFuZD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuRmxvb3JEaXY9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkludmVydD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5VQWRkPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5VU3ViPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5FcT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90RXE9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkx0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5MdEU9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkd0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5HdEU9XG5mdW5jdGlvbigpe307U2suYXN0bm9kZXMuSXM9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLklzTm90PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Jbj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90SW49ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk1vZHVsZT1mdW5jdGlvbihhLGMpe3RoaXMuYm9keT1hO3RoaXMuZG9jc3RyaW5nPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkludGVyYWN0aXZlPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHByZXNzaW9uPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdWl0ZT1mdW5jdGlvbihhKXt0aGlzLmJvZHk9YTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRnVuY3Rpb25EZWY9ZnVuY3Rpb24oYSxjLGIsZSxmLGwsaCxkKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09aCYmdm9pZCAwIT09aCk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWQmJnZvaWQgMCE9PVxuZCk7dGhpcy5uYW1lPWE7dGhpcy5hcmdzPWM7dGhpcy5ib2R5PWI7dGhpcy5kZWNvcmF0b3JfbGlzdD1lO3RoaXMucmV0dXJucz1mO3RoaXMuZG9jc3RyaW5nPWw7dGhpcy5saW5lbm89aDt0aGlzLmNvbF9vZmZzZXQ9ZDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZj1mdW5jdGlvbihhLGMsYixlLGYsbCxoLGQpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1oJiZ2b2lkIDAhPT1oKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZCYmdm9pZCAwIT09ZCk7dGhpcy5uYW1lPWE7dGhpcy5hcmdzPWM7dGhpcy5ib2R5PWI7dGhpcy5kZWNvcmF0b3JfbGlzdD1lO3RoaXMucmV0dXJucz1mO3RoaXMuZG9jc3RyaW5nPWw7dGhpcy5saW5lbm89aDt0aGlzLmNvbF9vZmZzZXQ9ZDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ2xhc3NEZWY9ZnVuY3Rpb24oYSxjLGIsZSxmLGwsaCxkKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09aCYmdm9pZCAwIT09aCk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZCYmdm9pZCAwIT09ZCk7dGhpcy5uYW1lPWE7dGhpcy5iYXNlcz1jO3RoaXMua2V5d29yZHM9Yjt0aGlzLmJvZHk9ZTt0aGlzLmRlY29yYXRvcl9saXN0PWY7dGhpcy5kb2NzdHJpbmc9bDt0aGlzLmxpbmVubz1oO3RoaXMuY29sX29mZnNldD1kO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5SZXR1cm49ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRlbGV0ZT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnRhcmdldHM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3NpZ249XG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMudGFyZ2V0cz1hO3RoaXMudmFsdWU9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5BdWdBc3NpZ249ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGFyZ2V0PWE7dGhpcy5vcD1jO3RoaXMudmFsdWU9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bbm5Bc3NpZ249ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy50YXJnZXQ9XG5hO3RoaXMuYW5ub3RhdGlvbj1jO3RoaXMudmFsdWU9Yjt0aGlzLnNpbXBsZT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PWw7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkZvcj1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLnRhcmdldD1hO3RoaXMuaXRlcj1jO3RoaXMuYm9keT1iO3RoaXMub3JlbHNlPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXN5bmNGb3I9ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy50YXJnZXQ9YTt0aGlzLml0ZXI9Yzt0aGlzLmJvZHk9Yjt0aGlzLm9yZWxzZT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PVxubDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuV2hpbGU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGVzdD1hO3RoaXMuYm9keT1jO3RoaXMub3JlbHNlPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSWY9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGVzdD1hO3RoaXMuYm9keT1jO3RoaXMub3JlbHNlPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuV2l0aD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZSYmdm9pZCAwIT09ZSk7dGhpcy5pdGVtcz1hO3RoaXMuYm9keT1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFzeW5jV2l0aD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuaXRlbXM9YTt0aGlzLmJvZHk9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5SYWlzZT1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLmV4Yz1hO3RoaXMuY2F1c2U9Yzt0aGlzLmluc3Q9Yjt0aGlzLnRiYWNrPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuVHJ5PVxuZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy5ib2R5PWE7dGhpcy5oYW5kbGVycz1jO3RoaXMub3JlbHNlPWI7dGhpcy5maW5hbGJvZHk9ZTt0aGlzLmxpbmVubz1mO3RoaXMuY29sX29mZnNldD1sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3NlcnQ9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLnRlc3Q9YTt0aGlzLm1zZz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkltcG9ydD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1cbmIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JbXBvcnRGcm9tPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLm1vZHVsZT1hO3RoaXMubmFtZXM9Yzt0aGlzLmxldmVsPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuR2xvYmFsPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Ob25sb2NhbD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuYyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHByPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5QYXNzPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWEmJnZvaWQgMCE9PWEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CcmVhaz1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1cbmEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Db250aW51ZT1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1hKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7dGhpcy5saW5lbm89YTt0aGlzLmNvbF9vZmZzZXQ9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuUHJpbnQ9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMuZGVzdD1hO3RoaXMudmFsdWVzPWM7dGhpcy5ubD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRlYnVnZ2VyPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuYSYmdm9pZCAwIT09YSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJvb2xPcD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMub3A9YTt0aGlzLnZhbHVlcz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJpbk9wPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLmxlZnQ9YTt0aGlzLm9wPWM7dGhpcy5yaWdodD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlVuYXJ5T3A9XG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMub3A9YTt0aGlzLm9wZXJhbmQ9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5MYW1iZGE9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmFyZ3M9YTt0aGlzLmJvZHk9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JZkV4cD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50ZXN0PWE7dGhpcy5ib2R5PWM7dGhpcy5vcmVsc2U9XG5iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRpY3Q9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmtleXM9YTt0aGlzLnZhbHVlcz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlNldD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLmVsdHM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5MaXN0Q29tcD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZSYmdm9pZCAwIT09ZSk7dGhpcy5lbHQ9YTt0aGlzLmdlbmVyYXRvcnM9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TZXRDb21wPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5lbHQ9YTt0aGlzLmdlbmVyYXRvcnM9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5EaWN0Q29tcD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5rZXk9YTt0aGlzLnZhbHVlPWM7dGhpcy5nZW5lcmF0b3JzPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwPVxuZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdD1hO3RoaXMuZ2VuZXJhdG9ycz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkF3YWl0PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5ZaWVsZD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9XG5iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5ZaWVsZEZyb209ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbXBhcmU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMubGVmdD1hO3RoaXMub3BzPWM7dGhpcy5jb21wYXJhdG9ycz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNhbGw9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJlxudm9pZCAwIT09Zik7dGhpcy5mdW5jPWE7dGhpcy5hcmdzPWM7dGhpcy5rZXl3b3Jkcz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk51bT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLm49YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy5zPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy52YWx1ZT1hO3RoaXMuY29udmVyc2lvbj1jO3RoaXMuZm9ybWF0X3NwZWM9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Kb2luZWRTdHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CeXRlcz1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ9XG5mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRWxsaXBzaXM9ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YSYmdm9pZCAwIT09YSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbnN0YW50PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5BdHRyaWJ1dGU9XG5mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy52YWx1ZT1hO3RoaXMuYXR0cj1jO3RoaXMuY3R4PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU3Vic2NyaXB0PWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnZhbHVlPWE7dGhpcy5zbGljZT1jO3RoaXMuY3R4PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU3RhcnJlZD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1xudGhpcy52YWx1ZT1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTmFtZT1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuaWQ9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkxpc3Q9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdHM9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlR1cGxlPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1cbmIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdHM9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlNsaWNlPWZ1bmN0aW9uKGEsYyxiKXt0aGlzLmxvd2VyPWE7dGhpcy51cHBlcj1jO3RoaXMuc3RlcD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHRTbGljZT1mdW5jdGlvbihhKXt0aGlzLmRpbXM9YTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSW5kZXg9ZnVuY3Rpb24oYSl7dGhpcy52YWx1ZT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uPWZ1bmN0aW9uKGEsYyxiLGUpe3RoaXMudGFyZ2V0PWE7dGhpcy5pdGVyPWM7dGhpcy5pZnM9Yjt0aGlzLmlzX2FzeW5jPWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXI9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09XG5lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50eXBlPWE7dGhpcy5uYW1lPWM7dGhpcy5ib2R5PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuYXJndW1lbnRzXz1mdW5jdGlvbihhLGMsYixlLGYsbCl7dGhpcy5hcmdzPWE7dGhpcy52YXJhcmc9Yzt0aGlzLmt3b25seWFyZ3M9Yjt0aGlzLmt3X2RlZmF1bHRzPWU7dGhpcy5rd2FyZz1mO3RoaXMuZGVmYXVsdHM9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuYXJnPWZ1bmN0aW9uIGEoYSxjKXt0aGlzLmFyZz1hO3RoaXMuYW5ub3RhdGlvbj1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5rZXl3b3JkPWZ1bmN0aW9uKGEsYyl7dGhpcy5hcmc9YTt0aGlzLnZhbHVlPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLmFsaWFzPWZ1bmN0aW9uKGEsYyl7dGhpcy5uYW1lPWE7dGhpcy5hc25hbWU9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMud2l0aGl0ZW09XG5mdW5jdGlvbihhLGMpe3RoaXMuY29udGV4dF9leHByPWE7dGhpcy5vcHRpb25hbF92YXJzPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk1vZHVsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJNb2R1bGVcIjtTay5hc3Rub2Rlcy5Nb2R1bGUucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuSW50ZXJhY3RpdmUucHJvdG90eXBlLl9hc3RuYW1lPVwiSW50ZXJhY3RpdmVcIjtTay5hc3Rub2Rlcy5JbnRlcmFjdGl2ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLkV4cHJlc3Npb24ucHJvdG90eXBlLl9hc3RuYW1lPVwiRXhwcmVzc2lvblwiO1NrLmFzdG5vZGVzLkV4cHJlc3Npb24ucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5TdWl0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XG5cIlN1aXRlXCI7U2suYXN0bm9kZXMuU3VpdGUucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJGdW5jdGlvbkRlZlwiO1NrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmLnByb3RvdHlwZS5fZmllbGRzPVtcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcImRlY29yYXRvcl9saXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVjb3JhdG9yX2xpc3R9LFwicmV0dXJuc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnJldHVybnN9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3luY0Z1bmN0aW9uRGVmXCI7U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZi5wcm90b3R5cGUuX2ZpZWxkcz1cbltcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcImRlY29yYXRvcl9saXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVjb3JhdG9yX2xpc3R9LFwicmV0dXJuc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnJldHVybnN9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuQ2xhc3NEZWYucHJvdG90eXBlLl9hc3RuYW1lPVwiQ2xhc3NEZWZcIjtTay5hc3Rub2Rlcy5DbGFzc0RlZi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0sXCJiYXNlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJhc2VzfSxcImtleXdvcmRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5d29yZHN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZGVjb3JhdG9yX2xpc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZWNvcmF0b3JfbGlzdH0sXG5cImRvY3N0cmluZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRvY3N0cmluZ31dO1NrLmFzdG5vZGVzLlJldHVybi5wcm90b3R5cGUuX2FzdG5hbWU9XCJSZXR1cm5cIjtTay5hc3Rub2Rlcy5SZXR1cm4ucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkRlbGV0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJEZWxldGVcIjtTay5hc3Rub2Rlcy5EZWxldGUucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldHN9XTtTay5hc3Rub2Rlcy5Bc3NpZ24ucHJvdG90eXBlLl9hc3RuYW1lPVwiQXNzaWduXCI7U2suYXN0bm9kZXMuQXNzaWduLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXRzfSxcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5BdWdBc3NpZ24ucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnQXNzaWduXCI7XG5Tay5hc3Rub2Rlcy5BdWdBc3NpZ24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkFubkFzc2lnbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBbm5Bc3NpZ25cIjtTay5hc3Rub2Rlcy5Bbm5Bc3NpZ24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcImFubm90YXRpb25cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hbm5vdGF0aW9ufSxcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwic2ltcGxlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2ltcGxlfV07U2suYXN0bm9kZXMuRm9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIkZvclwiO1NrLmFzdG5vZGVzLkZvci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFxuXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5Bc3luY0Zvci5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3luY0ZvclwiO1NrLmFzdG5vZGVzLkFzeW5jRm9yLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5XaGlsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJXaGlsZVwiO1NrLmFzdG5vZGVzLldoaWxlLnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50ZXN0fSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcIm9yZWxzZVwiLFxuZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuSWYucHJvdG90eXBlLl9hc3RuYW1lPVwiSWZcIjtTay5hc3Rub2Rlcy5JZi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0ZXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGVzdH0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5XaXRoLnByb3RvdHlwZS5fYXN0bmFtZT1cIldpdGhcIjtTay5hc3Rub2Rlcy5XaXRoLnByb3RvdHlwZS5fZmllbGRzPVtcIml0ZW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5Bc3luY1dpdGgucHJvdG90eXBlLl9hc3RuYW1lPVwiQXN5bmNXaXRoXCI7U2suYXN0bm9kZXMuQXN5bmNXaXRoLnByb3RvdHlwZS5fZmllbGRzPVtcIml0ZW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtcblNrLmFzdG5vZGVzLlJhaXNlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlJhaXNlXCI7U2suYXN0bm9kZXMuUmFpc2UucHJvdG90eXBlLl9maWVsZHM9W1wiZXhjXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZXhjfSxcImNhdXNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2F1c2V9LFwiaW5zdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmluc3R9LFwidGJhY2tcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YmFja31dO1NrLmFzdG5vZGVzLlRyeS5wcm90b3R5cGUuX2FzdG5hbWU9XCJUcnlcIjtTay5hc3Rub2Rlcy5UcnkucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiaGFuZGxlcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5oYW5kbGVyc30sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9LFwiZmluYWxib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZmluYWxib2R5fV07U2suYXN0bm9kZXMuQXNzZXJ0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkFzc2VydFwiO1xuU2suYXN0bm9kZXMuQXNzZXJ0LnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50ZXN0fSxcIm1zZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm1zZ31dO1NrLmFzdG5vZGVzLkltcG9ydC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbXBvcnRcIjtTay5hc3Rub2Rlcy5JbXBvcnQucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lc31dO1NrLmFzdG5vZGVzLkltcG9ydEZyb20ucHJvdG90eXBlLl9hc3RuYW1lPVwiSW1wb3J0RnJvbVwiO1NrLmFzdG5vZGVzLkltcG9ydEZyb20ucHJvdG90eXBlLl9maWVsZHM9W1wibW9kdWxlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubW9kdWxlfSxcIm5hbWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZXN9LFwibGV2ZWxcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sZXZlbH1dO1NrLmFzdG5vZGVzLkdsb2JhbC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHbG9iYWxcIjtTay5hc3Rub2Rlcy5HbG9iYWwucHJvdG90eXBlLl9maWVsZHM9XG5bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuTm9ubG9jYWwucHJvdG90eXBlLl9hc3RuYW1lPVwiTm9ubG9jYWxcIjtTay5hc3Rub2Rlcy5Ob25sb2NhbC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuRXhwci5wcm90b3R5cGUuX2FzdG5hbWU9XCJFeHByXCI7U2suYXN0bm9kZXMuRXhwci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuUGFzcy5wcm90b3R5cGUuX2FzdG5hbWU9XCJQYXNzXCI7U2suYXN0bm9kZXMuUGFzcy5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5CcmVhay5wcm90b3R5cGUuX2FzdG5hbWU9XCJCcmVha1wiO1NrLmFzdG5vZGVzLkJyZWFrLnByb3RvdHlwZS5fZmllbGRzPVtdO1NrLmFzdG5vZGVzLkNvbnRpbnVlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNvbnRpbnVlXCI7U2suYXN0bm9kZXMuQ29udGludWUucHJvdG90eXBlLl9maWVsZHM9XG5bXTtTay5hc3Rub2Rlcy5QcmludC5wcm90b3R5cGUuX2FzdG5hbWU9XCJQcmludFwiO1NrLmFzdG5vZGVzLlByaW50LnByb3RvdHlwZS5fZmllbGRzPVtcImRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZXN0fSxcInZhbHVlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlc30sXCJubFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5sfV07U2suYXN0bm9kZXMuRGVidWdnZXIucHJvdG90eXBlLl9hc3RuYW1lPVwiRGVidWdnZXJcIjtTay5hc3Rub2Rlcy5EZWJ1Z2dlci5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5Cb29sT3AucHJvdG90eXBlLl9hc3RuYW1lPVwiQm9vbE9wXCI7U2suYXN0bm9kZXMuQm9vbE9wLnByb3RvdHlwZS5fZmllbGRzPVtcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwidmFsdWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWVzfV07U2suYXN0bm9kZXMuQmluT3AucHJvdG90eXBlLl9hc3RuYW1lPVwiQmluT3BcIjtTay5hc3Rub2Rlcy5CaW5PcC5wcm90b3R5cGUuX2ZpZWxkcz1cbltcImxlZnRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sZWZ0fSxcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwicmlnaHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5yaWdodH1dO1NrLmFzdG5vZGVzLlVuYXJ5T3AucHJvdG90eXBlLl9hc3RuYW1lPVwiVW5hcnlPcFwiO1NrLmFzdG5vZGVzLlVuYXJ5T3AucHJvdG90eXBlLl9maWVsZHM9W1wib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJvcGVyYW5kXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3BlcmFuZH1dO1NrLmFzdG5vZGVzLkxhbWJkYS5wcm90b3R5cGUuX2FzdG5hbWU9XCJMYW1iZGFcIjtTay5hc3Rub2Rlcy5MYW1iZGEucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ3N9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5JZkV4cC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJZkV4cFwiO1NrLmFzdG5vZGVzLklmRXhwLnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixcbmZ1bmN0aW9uKGEpe3JldHVybiBhLnRlc3R9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwib3JlbHNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuRGljdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJEaWN0XCI7U2suYXN0bm9kZXMuRGljdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJrZXlzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5c30sXCJ2YWx1ZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZXN9XTtTay5hc3Rub2Rlcy5TZXQucHJvdG90eXBlLl9hc3RuYW1lPVwiU2V0XCI7U2suYXN0bm9kZXMuU2V0LnByb3RvdHlwZS5fZmllbGRzPVtcImVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHRzfV07U2suYXN0bm9kZXMuTGlzdENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiTGlzdENvbXBcIjtTay5hc3Rub2Rlcy5MaXN0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHR9LFwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtcblNrLmFzdG5vZGVzLlNldENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiU2V0Q29tcFwiO1NrLmFzdG5vZGVzLlNldENvbXAucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0fSxcImdlbmVyYXRvcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5nZW5lcmF0b3JzfV07U2suYXN0bm9kZXMuRGljdENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiRGljdENvbXBcIjtTay5hc3Rub2Rlcy5EaWN0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJrZXlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX0sXCJnZW5lcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2VuZXJhdG9yc31dO1NrLmFzdG5vZGVzLkdlbmVyYXRvckV4cC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHZW5lcmF0b3JFeHBcIjtTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHAucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0fSxcblwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtTay5hc3Rub2Rlcy5Bd2FpdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBd2FpdFwiO1NrLmFzdG5vZGVzLkF3YWl0LnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5ZaWVsZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJZaWVsZFwiO1NrLmFzdG5vZGVzLllpZWxkLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5ZaWVsZEZyb20ucHJvdG90eXBlLl9hc3RuYW1lPVwiWWllbGRGcm9tXCI7U2suYXN0bm9kZXMuWWllbGRGcm9tLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5Db21wYXJlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNvbXBhcmVcIjtTay5hc3Rub2Rlcy5Db21wYXJlLnByb3RvdHlwZS5fZmllbGRzPVxuW1wibGVmdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmxlZnR9LFwib3BzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3BzfSxcImNvbXBhcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29tcGFyYXRvcnN9XTtTay5hc3Rub2Rlcy5DYWxsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNhbGxcIjtTay5hc3Rub2Rlcy5DYWxsLnByb3RvdHlwZS5fZmllbGRzPVtcImZ1bmNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5mdW5jfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImtleXdvcmRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5d29yZHN9XTtTay5hc3Rub2Rlcy5OdW0ucHJvdG90eXBlLl9hc3RuYW1lPVwiTnVtXCI7U2suYXN0bm9kZXMuTnVtLnByb3RvdHlwZS5fZmllbGRzPVtcIm5cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ufV07U2suYXN0bm9kZXMuU3RyLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0clwiO1NrLmFzdG5vZGVzLlN0ci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc31dO1xuU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWUucHJvdG90eXBlLl9hc3RuYW1lPVwiRm9ybWF0dGVkVmFsdWVcIjtTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImNvbnZlcnNpb25cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jb252ZXJzaW9ufSxcImZvcm1hdF9zcGVjXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZm9ybWF0X3NwZWN9XTtTay5hc3Rub2Rlcy5Kb2luZWRTdHIucHJvdG90eXBlLl9hc3RuYW1lPVwiSm9pbmVkU3RyXCI7U2suYXN0bm9kZXMuSm9pbmVkU3RyLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlc31dO1NrLmFzdG5vZGVzLkJ5dGVzLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJ5dGVzXCI7U2suYXN0bm9kZXMuQnl0ZXMucHJvdG90eXBlLl9maWVsZHM9W1wic1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnN9XTtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQucHJvdG90eXBlLl9hc3RuYW1lPVxuXCJOYW1lQ29uc3RhbnRcIjtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkVsbGlwc2lzLnByb3RvdHlwZS5fYXN0bmFtZT1cIkVsbGlwc2lzXCI7U2suYXN0bm9kZXMuRWxsaXBzaXMucHJvdG90eXBlLl9maWVsZHM9W107U2suYXN0bm9kZXMuQ29uc3RhbnQucHJvdG90eXBlLl9hc3RuYW1lPVwiQ29uc3RhbnRcIjtTay5hc3Rub2Rlcy5Db25zdGFudC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQXR0cmlidXRlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkF0dHJpYnV0ZVwiO1NrLmFzdG5vZGVzLkF0dHJpYnV0ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImF0dHJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hdHRyfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1xuU2suYXN0bm9kZXMuU3Vic2NyaXB0LnByb3RvdHlwZS5fYXN0bmFtZT1cIlN1YnNjcmlwdFwiO1NrLmFzdG5vZGVzLlN1YnNjcmlwdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcInNsaWNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2xpY2V9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuU3RhcnJlZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJTdGFycmVkXCI7U2suYXN0bm9kZXMuU3RhcnJlZC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1NrLmFzdG5vZGVzLk5hbWUucHJvdG90eXBlLl9hc3RuYW1lPVwiTmFtZVwiO1NrLmFzdG5vZGVzLk5hbWUucHJvdG90eXBlLl9maWVsZHM9W1wiaWRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pZH0sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5MaXN0LnByb3RvdHlwZS5fYXN0bmFtZT1cblwiTGlzdFwiO1NrLmFzdG5vZGVzLkxpc3QucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmVsdHN9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuVHVwbGUucHJvdG90eXBlLl9hc3RuYW1lPVwiVHVwbGVcIjtTay5hc3Rub2Rlcy5UdXBsZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0c30sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5Mb2FkLnByb3RvdHlwZS5fYXN0bmFtZT1cIkxvYWRcIjtTay5hc3Rub2Rlcy5Mb2FkLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlN0b3JlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0b3JlXCI7U2suYXN0bm9kZXMuU3RvcmUucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuRGVsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkRlbFwiO1NrLmFzdG5vZGVzLkRlbC5wcm90b3R5cGUuX2lzZW51bT0hMDtcblNrLmFzdG5vZGVzLkF1Z0xvYWQucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnTG9hZFwiO1NrLmFzdG5vZGVzLkF1Z0xvYWQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQXVnU3RvcmUucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnU3RvcmVcIjtTay5hc3Rub2Rlcy5BdWdTdG9yZS5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5QYXJhbS5wcm90b3R5cGUuX2FzdG5hbWU9XCJQYXJhbVwiO1NrLmFzdG5vZGVzLlBhcmFtLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlNsaWNlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlNsaWNlXCI7U2suYXN0bm9kZXMuU2xpY2UucHJvdG90eXBlLl9maWVsZHM9W1wibG93ZXJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sb3dlcn0sXCJ1cHBlclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnVwcGVyfSxcInN0ZXBcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zdGVwfV07U2suYXN0bm9kZXMuRXh0U2xpY2UucHJvdG90eXBlLl9hc3RuYW1lPVwiRXh0U2xpY2VcIjtcblNrLmFzdG5vZGVzLkV4dFNsaWNlLnByb3RvdHlwZS5fZmllbGRzPVtcImRpbXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kaW1zfV07U2suYXN0bm9kZXMuSW5kZXgucHJvdG90eXBlLl9hc3RuYW1lPVwiSW5kZXhcIjtTay5hc3Rub2Rlcy5JbmRleC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQW5kLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFuZFwiO1NrLmFzdG5vZGVzLkFuZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Pci5wcm90b3R5cGUuX2FzdG5hbWU9XCJPclwiO1NrLmFzdG5vZGVzLk9yLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkFkZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBZGRcIjtTay5hc3Rub2Rlcy5BZGQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuU3ViLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN1YlwiO1NrLmFzdG5vZGVzLlN1Yi5wcm90b3R5cGUuX2lzZW51bT0hMDtcblNrLmFzdG5vZGVzLk11bHQucHJvdG90eXBlLl9hc3RuYW1lPVwiTXVsdFwiO1NrLmFzdG5vZGVzLk11bHQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTWF0TXVsdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNYXRNdWx0XCI7U2suYXN0bm9kZXMuTWF0TXVsdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5EaXYucHJvdG90eXBlLl9hc3RuYW1lPVwiRGl2XCI7U2suYXN0bm9kZXMuRGl2LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk1vZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNb2RcIjtTay5hc3Rub2Rlcy5Nb2QucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuUG93LnByb3RvdHlwZS5fYXN0bmFtZT1cIlBvd1wiO1NrLmFzdG5vZGVzLlBvdy5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MU2hpZnQucHJvdG90eXBlLl9hc3RuYW1lPVwiTFNoaWZ0XCI7U2suYXN0bm9kZXMuTFNoaWZ0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlJTaGlmdC5wcm90b3R5cGUuX2FzdG5hbWU9XG5cIlJTaGlmdFwiO1NrLmFzdG5vZGVzLlJTaGlmdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5CaXRPci5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaXRPclwiO1NrLmFzdG5vZGVzLkJpdE9yLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkJpdFhvci5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaXRYb3JcIjtTay5hc3Rub2Rlcy5CaXRYb3IucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQml0QW5kLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJpdEFuZFwiO1NrLmFzdG5vZGVzLkJpdEFuZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5GbG9vckRpdi5wcm90b3R5cGUuX2FzdG5hbWU9XCJGbG9vckRpdlwiO1NrLmFzdG5vZGVzLkZsb29yRGl2LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkludmVydC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbnZlcnRcIjtTay5hc3Rub2Rlcy5JbnZlcnQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTm90LnByb3RvdHlwZS5fYXN0bmFtZT1cblwiTm90XCI7U2suYXN0bm9kZXMuTm90LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlVBZGQucHJvdG90eXBlLl9hc3RuYW1lPVwiVUFkZFwiO1NrLmFzdG5vZGVzLlVBZGQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuVVN1Yi5wcm90b3R5cGUuX2FzdG5hbWU9XCJVU3ViXCI7U2suYXN0bm9kZXMuVVN1Yi5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5FcS5wcm90b3R5cGUuX2FzdG5hbWU9XCJFcVwiO1NrLmFzdG5vZGVzLkVxLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk5vdEVxLnByb3RvdHlwZS5fYXN0bmFtZT1cIk5vdEVxXCI7U2suYXN0bm9kZXMuTm90RXEucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTHQucHJvdG90eXBlLl9hc3RuYW1lPVwiTHRcIjtTay5hc3Rub2Rlcy5MdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MdEUucHJvdG90eXBlLl9hc3RuYW1lPVwiTHRFXCI7U2suYXN0bm9kZXMuTHRFLnByb3RvdHlwZS5faXNlbnVtPVxuITA7U2suYXN0bm9kZXMuR3QucHJvdG90eXBlLl9hc3RuYW1lPVwiR3RcIjtTay5hc3Rub2Rlcy5HdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5HdEUucHJvdG90eXBlLl9hc3RuYW1lPVwiR3RFXCI7U2suYXN0bm9kZXMuR3RFLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLklzLnByb3RvdHlwZS5fYXN0bmFtZT1cIklzXCI7U2suYXN0bm9kZXMuSXMucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuSXNOb3QucHJvdG90eXBlLl9hc3RuYW1lPVwiSXNOb3RcIjtTay5hc3Rub2Rlcy5Jc05vdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Jbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJJblwiO1NrLmFzdG5vZGVzLkluLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk5vdEluLnByb3RvdHlwZS5fYXN0bmFtZT1cIk5vdEluXCI7U2suYXN0bm9kZXMuTm90SW4ucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbi5wcm90b3R5cGUuX2FzdG5hbWU9XG5cImNvbXByZWhlbnNpb25cIjtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJpZnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pZnN9LFwiaXNfYXN5bmNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pc19hc3luY31dO1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIucHJvdG90eXBlLl9hc3RuYW1lPVwiRXhjZXB0SGFuZGxlclwiO1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIucHJvdG90eXBlLl9maWVsZHM9W1widHlwZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGV9LFwibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5hcmd1bWVudHNfLnByb3RvdHlwZS5fYXN0bmFtZT1cImFyZ3VtZW50c1wiO1NrLmFzdG5vZGVzLmFyZ3VtZW50c18ucHJvdG90eXBlLl9maWVsZHM9XG5bXCJhcmdzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnc30sXCJ2YXJhcmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YXJhcmd9LFwia3dvbmx5YXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3b25seWFyZ3N9LFwia3dfZGVmYXVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rd19kZWZhdWx0c30sXCJrd2FyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3YXJnfSxcImRlZmF1bHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVmYXVsdHN9XTtTay5hc3Rub2Rlcy5hcmcucHJvdG90eXBlLl9hc3RuYW1lPVwiYXJnXCI7U2suYXN0bm9kZXMuYXJnLnByb3RvdHlwZS5fZmllbGRzPVtcImFyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ30sXCJhbm5vdGF0aW9uXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYW5ub3RhdGlvbn1dO1NrLmFzdG5vZGVzLmtleXdvcmQucHJvdG90eXBlLl9hc3RuYW1lPVwia2V5d29yZFwiO1NrLmFzdG5vZGVzLmtleXdvcmQucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnfSxcblwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLmFsaWFzLnByb3RvdHlwZS5fYXN0bmFtZT1cImFsaWFzXCI7U2suYXN0bm9kZXMuYWxpYXMucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYXNuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXNuYW1lfV07U2suYXN0bm9kZXMud2l0aGl0ZW0ucHJvdG90eXBlLl9hc3RuYW1lPVwid2l0aGl0ZW1cIjtTay5hc3Rub2Rlcy53aXRoaXRlbS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJjb250ZXh0X2V4cHJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jb250ZXh0X2V4cHJ9LFwib3B0aW9uYWxfdmFyc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9wdGlvbmFsX3ZhcnN9XTtTay5leHBvcnRTeW1ib2woXCJTay5hc3Rub2Rlc1wiLFNrLmFzdG5vZGVzKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjKXt0aGlzLmNfZW5jb2Rpbmc9YTt0aGlzLmNfZmlsZW5hbWU9Yjt0aGlzLmNfZmxhZ3M9XG5jfHwwfWZ1bmN0aW9uIGMoYSl7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YSxcIm5vZGUgbXVzdCBiZSBkZWZpbmVkXCIpO3JldHVybiBudWxsPT09YS5jaGlsZHJlbj8wOmEuY2hpbGRyZW4ubGVuZ3RofWZ1bmN0aW9uIGIoYSxiKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwibm9kZSBtdXN0IGJlIGRlZmluZWRcIik7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YixcImluZGV4IG9mIGNoaWxkIG11c3QgYmUgc3BlY2lmaWVkXCIpO3JldHVybiBhLmNoaWxkcmVuW2JdfWZ1bmN0aW9uIGUoYSxiKXtTay5hc3NlcnRzLmFzc2VydChhLnR5cGU9PT1iLFwibm9kZSB3YXNuJ3QgZXhwZWN0ZWQgdHlwZVwiKX1mdW5jdGlvbiBmKGEsYixjKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLGEuY19maWxlbmFtZSxiLmxpbmVubyk7fWZ1bmN0aW9uIGwoYSl7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBhLFwiZXhwZWN0aW5nIHN0cmluZywgZ290IFwiK3R5cGVvZiBhKTtcbnJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9ZnVuY3Rpb24gaChhKXt2YXIgZCxlO3N3aXRjaChhLnR5cGUpe2Nhc2Ugci5zaW5nbGVfaW5wdXQ6aWYoYihhLDApLnR5cGU9PT16LlRfTkVXTElORSlicmVhaztlbHNlIHJldHVybiBoKGIoYSwwKSk7Y2FzZSByLmZpbGVfaW5wdXQ6Zm9yKGQ9ZT0wO2Q8YyhhKTsrK2Qpe3ZhciBmPWIoYSxkKTtmLnR5cGU9PT1yLnN0bXQmJihlKz1oKGYpKX1yZXR1cm4gZTtjYXNlIHIuc3RtdDpyZXR1cm4gaChiKGEsMCkpO2Nhc2Ugci5jb21wb3VuZF9zdG10OnJldHVybiAxO2Nhc2Ugci5zaW1wbGVfc3RtdDpyZXR1cm4gTWF0aC5mbG9vcihjKGEpLzIpO2Nhc2Ugci5zdWl0ZTppZigxPT09YyhhKSlyZXR1cm4gaChiKGEsMCkpO2U9MDtmb3IoZD0yO2Q8YyhhKS0xOysrZCllKz1oKGIoYSxkKSk7cmV0dXJuIGU7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJOb24tc3RhdGVtZW50IGZvdW5kXCIpfXJldHVybiAwfWZ1bmN0aW9uIGQoYSxiLGMsZCl7YyBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0ciYmKGM9Yy52KTtpZihcIk5vbmVcIj09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIE5vbmVcIixhLmNfZmlsZW5hbWUsZCk7aWYoXCJUcnVlXCI9PT1jfHxcIkZhbHNlXCI9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXNzaWdubWVudCB0byBUcnVlIG9yIEZhbHNlIGlzIGZvcmJpZGRlblwiLGEuY19maWxlbmFtZSxkKTt9ZnVuY3Rpb24gZyhhLGIsYyxlKXt2YXIgZjtTay5hc3NlcnRzLmFzc2VydChjIT09U2suYXN0bm9kZXMuQXVnU3RvcmUmJmMhPT1Tay5hc3Rub2Rlcy5BdWdMb2FkLFwiY29udGV4dCBub3QgQXVnU3RvcmUgb3IgQXVnTG9hZFwiKTt2YXIgaD1mPW51bGw7c3dpdGNoKGIuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOmNhc2UgU2suYXN0bm9kZXMuTmFtZTpjPT09U2suYXN0bm9kZXMuU3RvcmUmJmQoYSxlLGIuYXR0cixlLmxpbmVubyk7Yi5jdHg9YzticmVhaztcbmNhc2UgU2suYXN0bm9kZXMuU3RhcnJlZDpiLmN0eD1jO2coYSxiLnZhbHVlLGMsZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6Yi5jdHg9YzticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3Q6Yi5jdHg9YztmPWIuZWx0czticmVhaztjYXNlIFNrLmFzdG5vZGVzLlR1cGxlOmlmKDA9PT1iLmVsdHMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgYXNzaWduIHRvICgpXCIsYS5jX2ZpbGVuYW1lLGUubGluZW5vKTtiLmN0eD1jO2Y9Yi5lbHRzO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGFtYmRhOmg9XCJsYW1iZGFcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNhbGw6aD1cImZ1bmN0aW9uIGNhbGxcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDpjYXNlIFNrLmFzdG5vZGVzLkJpbk9wOmNhc2UgU2suYXN0bm9kZXMuVW5hcnlPcDpoPVwib3BlcmF0b3JcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDpoPVwiZ2VuZXJhdG9yIGV4cHJlc3Npb25cIjtcbmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6aD1cInlpZWxkIGV4cHJlc3Npb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOmg9XCJsaXN0IGNvbXByZWhlbnNpb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLlNldENvbXA6aD1cInNldCBjb21wcmVoZW5zaW9uXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0Q29tcDpoPVwiZGljdCBjb21wcmVoZW5zaW9uXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0OmNhc2UgU2suYXN0bm9kZXMuU2V0OmNhc2UgU2suYXN0bm9kZXMuTnVtOmNhc2UgU2suYXN0bm9kZXMuU3RyOmg9XCJsaXRlcmFsXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6aD1cIlRydWUsIEZhbHNlIG9yIE5vbmVcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNvbXBhcmU6aD1cImNvbXBhcmlzb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLlJlcHI6aD1cInJlcHJcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmRXhwOmg9XCJjb25kaXRpb25hbCBleHByZXNzaW9uXCI7XG5icmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBleHByZXNzaW9uIGluIGFzc2lnbm1lbnRcIil9aWYoaCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImNhbid0IFwiKyhjPT09U2suYXN0bm9kZXMuU3RvcmU/XCJhc3NpZ24gdG9cIjpcImRlbGV0ZVwiKStcIiBcIitoLGEuY19maWxlbmFtZSxlLmxpbmVubyk7aWYoZilmb3IoYj0wO2I8Zi5sZW5ndGg7KytiKWcoYSxmW2JdLGMsZSl9ZnVuY3Rpb24gbihhKXtpZih2b2lkIDA9PT1PW2EudHlwZV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIHN5bnRheFwiLGEudHlwZSxhLmxpbmVubyk7cmV0dXJuIE9bYS50eXBlXX1mdW5jdGlvbiBrKGEsYil7cmV0dXJuIGEudmFsdWU/bmV3IFNrLmJ1aWx0aW4uc3RyKGEudmFsdWUpOm5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBwKGEsZCl7ZShkLHIuY29tcF9vcCk7aWYoMT09PWMoZCkpc3dpdGNoKGQ9YihkLDApLGQudHlwZSl7Y2FzZSB6LlRfTEVTUzpyZXR1cm4gU2suYXN0bm9kZXMuTHQ7XG5jYXNlIHouVF9HUkVBVEVSOnJldHVybiBTay5hc3Rub2Rlcy5HdDtjYXNlIHouVF9FUUVRVUFMOnJldHVybiBTay5hc3Rub2Rlcy5FcTtjYXNlIHouVF9MRVNTRVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLkx0RTtjYXNlIHouVF9HUkVBVEVSRVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLkd0RTtjYXNlIHouVF9OT1RFUVVBTDpyZXR1cm4gU2suYXN0bm9kZXMuTm90RXE7Y2FzZSB6LlRfTkFNRTppZihcImluXCI9PT1kLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5JbjtpZihcImlzXCI9PT1kLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5Jc31lbHNlIGlmKDI9PT1jKGQpJiZiKGQsMCkudHlwZT09PXouVF9OQU1FKXtpZihcImluXCI9PT1iKGQsMSkudmFsdWUpcmV0dXJuIFNrLmFzdG5vZGVzLk5vdEluO2lmKFwiaXNcIj09PWIoZCwwKS52YWx1ZSlyZXR1cm4gU2suYXN0bm9kZXMuSXNOb3R9U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBjb21wX29wXCIpfWZ1bmN0aW9uIHUoYSxiKXthJiYoYS5saW5lbm89XG5iLmxpbmVubyxhLmNvbF9vZmZzZXQ9Yi5jb2xfb2Zmc2V0LGEuZW5kX2xpbmVubz1iLmVuZF9saW5lbm8sYS5lbmRfY29sX29mZnNldD1iLmVuZF9jb2xfb2Zmc2V0KTtyZXR1cm4gYX1mdW5jdGlvbiBBKGEsZCl7dmFyIGUsZj1bXTtTay5hc3NlcnRzLmFzc2VydChkLnR5cGU9PT1yLnRlc3RsaXN0fHxkLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcnx8ZC50eXBlPT09ci5saXN0bWFrZXJ8fGQudHlwZT09PXIudGVzdGxpc3RfY29tcHx8ZC50eXBlPT09ci50ZXN0bGlzdF9zYWZlfHxkLnR5cGU9PT1yLnRlc3RsaXN0MSxcIm5vZGUgdHlwZSBtdXN0IGJlIGxpc3RsaWtlXCIpO2ZvcihlPTA7ZTxjKGQpO2UrPTIpU2suYXNzZXJ0cy5hc3NlcnQoYihkLGUpLnR5cGU9PT1yLnRlc3R8fGIoZCxlKS50eXBlPT09ci5vbGRfdGVzdHx8YihkLGUpLnR5cGU9PT1yLnN0YXJfZXhwciksZltlLzJdPXcoYSxiKGQsZSkpO3JldHVybiBmfWZ1bmN0aW9uIHQoYSxkKXt2YXIgZjtlKGQsci5zdWl0ZSk7XG52YXIgZz1bXTt2YXIgaz0wO2lmKGIoZCwwKS50eXBlPT09ci5zaW1wbGVfc3RtdCl7ZD1iKGQsMCk7dmFyIHg9YyhkKS0xO2IoZCx4LTEpLnR5cGU9PT16LlRfU0VNSSYmLS14O2ZvcihmPTA7Zjx4O2YrPTIpZ1trKytdPU4oYSxiKGQsZikpfWVsc2UgZm9yKGY9MjtmPGMoZCktMTsrK2Ype3g9YihkLGYpO2UoeCxyLnN0bXQpO3ZhciBuPWgoeCk7aWYoMT09PW4pZ1trKytdPU4oYSx4KTtlbHNlIGZvcih4PWIoeCwwKSxlKHgsci5zaW1wbGVfc3RtdCksbj0wO248Yyh4KTtuKz0yKXtpZigwPT09YyhiKHgsbikpKXtTay5hc3NlcnRzLmFzc2VydChuKzE9PT1jKHgpKTticmVha31nW2srK109TihhLGIoeCxuKSl9fVNrLmFzc2VydHMuYXNzZXJ0KGs9PT1oKGQpKTtyZXR1cm4gZ31mdW5jdGlvbiB2KGEsZCxmKXt2YXIgaDtlKGQsci5leHBybGlzdCk7dmFyIGs9W107Zm9yKGg9MDtoPGMoZCk7aCs9Mil7dmFyIHg9dyhhLGIoZCxoKSk7a1toLzJdPXg7ZiYmZyhhLHgsZixiKGQsaCkpfXJldHVybiBrfVxuZnVuY3Rpb24gQihhLGQpe2E6Zm9yKDs7KXN3aXRjaChkLnR5cGUpe2Nhc2Ugci5pbXBvcnRfYXNfbmFtZTphPW51bGw7dmFyIGU9bChiKGQsMCkudmFsdWUpOzM9PT1jKGQpJiYoYT1iKGQsMikudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMoZSxudWxsPT1hP251bGw6bChhKSk7Y2FzZSByLmRvdHRlZF9hc19uYW1lOmlmKDE9PT1jKGQpKXtkPWIoZCwwKTtjb250aW51ZSBhfWVsc2UgcmV0dXJuIGE9QihhLGIoZCwwKSksU2suYXNzZXJ0cy5hc3NlcnQoIWEuYXNuYW1lKSxhLmFzbmFtZT1sKGIoZCwyKS52YWx1ZSksYTtjYXNlIHIuZG90dGVkX25hbWU6aWYoMT09PWMoZCkpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hbGlhcyhsKGIoZCwwKS52YWx1ZSksbnVsbCk7YT1cIlwiO2ZvcihlPTA7ZTxjKGQpO2UrPTIpYSs9YihkLGUpLnZhbHVlK1wiLlwiO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMobChhLnN1YnN0cigwLGEubGVuZ3RoLTEpKSxudWxsKTtjYXNlIHouVF9TVEFSOnJldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMobChcIipcIiksXG5udWxsKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwidW5leHBlY3RlZCBpbXBvcnQgbmFtZVwiLGEuY19maWxlbmFtZSxkLmxpbmVubyk7fX1mdW5jdGlvbiBEKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQoYi50eXBlPT1yLnRlc3RsaXN0X2NvbXB8fGIudHlwZT09ci5hcmd1bWVudCk7cmV0dXJuIGFhKGEsYiwwKX1mdW5jdGlvbiBFKGEsZCl7aWYoYihkLDApLnR5cGU9PT16LlRfTUlOVVMmJjI9PT1jKGQpKXt2YXIgZT1iKGQsMSk7aWYoZS50eXBlPT09ci5mYWN0b3ImJjE9PT1jKGUpJiYoZT1iKGUsMCksZS50eXBlPT09ci5wb3dlciYmMT09PWMoZSkpKXt2YXIgZj1iKGUsMCk7aWYoZi50eXBlPT09ci5hdG9tJiYoZT1iKGYsMCksZS50eXBlPT09ei5UX05VTUJFUikpcmV0dXJuIGUudmFsdWU9XCItXCIrZS52YWx1ZSxSKGEsZil9fWE9dyhhLGIoZCwxKSk7c3dpdGNoKGIoZCwwKS50eXBlKXtjYXNlIHouVF9QTFVTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5VQWRkLFxuYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX01JTlVTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5VU3ViLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHouVF9USUxERTpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlVuYXJ5T3AoU2suYXN0bm9kZXMuSW52ZXJ0LGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1Tay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgZmFjdG9yXCIpfWZ1bmN0aW9uIEYoYSxnLGgsayl7dmFyIHgsbixsO2UoZyxyLmFyZ2xpc3QpO2Zvcih4PWw9bj0wO3g8YyhnKTt4Kyspe3ZhciBwPWIoZyx4KTtwLnR5cGU9PXIuYXJndW1lbnQmJigxPT1jKHApP24rKzpiKHAsMSkudHlwZT09ci5jb21wX2Zvcj8obisrLGt8fGYoYSxwLFwiaW52YWxpZCBzeW50YXhcIiksMTxjKGcpJiZmKGEscCxcIkdlbmVyYXRvciBleHByZXNzaW9uIG11c3QgYmUgcGFyZW50aGVzaXplZFwiKSk6YihwLDApLnR5cGU9PXouVF9TVEFSP24rKzpsKyspfXZhciBTPVxuW107dmFyIG09W107Zm9yKHg9az1sPW49MDt4PGMoZyk7eCsrKWlmKHA9YihnLHgpLHAudHlwZT09ci5hcmd1bWVudCl7dmFyIEo9YihwLDApO2lmKDE9PWMocCkpe2wmJihrP2YoYSxKLFwicG9zaXRpb25hbCBhcmd1bWVudCBmb2xsb3dzIGtleXdvcmQgYXJndW1lbnQgdW5wYWNraW5nXCIpOmYoYSxKLFwicG9zaXRpb25hbCBhcmd1bWVudCBmb2xsb3dzIGtleXdvcmQgYXJndW1lbnRcIikpO3ZhciBLPXcoYSxKKTtpZighSylyZXR1cm4gbnVsbDtTW24rK109S31lbHNlIGlmKEoudHlwZT09ei5UX1NUQVIpe2lmKGspcmV0dXJuIGYoYSxKLFwiaXRlcmFibGUgYXJndW1lbnQgdW5wYWNraW5nIGZvbGxvd3Mga2V5d29yZCBhcmd1bWVudCB1bnBhY2tpbmdcIiksbnVsbDtLPXcoYSxiKHAsMSkpO2lmKCFLKXJldHVybiBudWxsO3A9bmV3IFNrLmFzdG5vZGVzLlN0YXJyZWQoSyxTay5hc3Rub2Rlcy5Mb2FkLEoubGluZW5vLEouY29sX29mZnNldCk7U1tuKytdPXB9ZWxzZSBpZihKLnR5cGU9PXouVF9ET1VCTEVTVEFSKXt4Kys7XG5LPXcoYSxiKHAsMSkpO2lmKCFLKXJldHVybiBudWxsO3A9bmV3IFNrLmFzdG5vZGVzLmtleXdvcmQobnVsbCxLKTttW2wrK109cDtrKyt9ZWxzZSBpZihiKHAsMSkudHlwZT09ci5jb21wX2Zvcil7Sz1EKGEscCk7aWYoIUspcmV0dXJuIG51bGw7U1tuKytdPUt9ZWxzZXt2YXIgdTtLPXcoYSxKKTtpZighSylyZXR1cm4gbnVsbDtpZihLLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuTGFtYmRhKXJldHVybiBmKGEsSixcImxhbWJkYSBjYW5ub3QgY29udGFpbiBhc3NpZ25tZW50XCIpLG51bGw7aWYoSy5jb25zdHJ1Y3RvciE9PVNrLmFzdG5vZGVzLk5hbWUpcmV0dXJuIGYoYSxKLFwia2V5d29yZCBjYW4ndCBiZSBhbiBleHByZXNzaW9uXCIpLG51bGw7aWYoZChhLEsuaWQscCwxKSlyZXR1cm4gbnVsbDt2YXIgQT1LLmlkO2Zvcih1PTA7dTxsO3UrKylpZigoSz1tW3VdLmFyZykmJks9PT1BKXJldHVybiBmKGEsSixcImtleXdvcmQgYXJndW1lbnQgcmVwZWF0ZWRcIiksbnVsbDtLPXcoYSxiKHAsXG4yKSk7aWYoIUspcmV0dXJuIG51bGw7cD1uZXcgU2suYXN0bm9kZXMua2V5d29yZChBLEspO21bbCsrXT1wfX1yZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNhbGwoaCxTLG0saC5saW5lbm8saC5jb2xfb2Zmc2V0KX1mdW5jdGlvbiBNKGEsZCxmKXtlKGQsci50cmFpbGVyKTtpZihiKGQsMCkudHlwZT09ei5UX0xQQVIpcmV0dXJuIDI9PWMoZCk/bmV3IFNrLmFzdG5vZGVzLkNhbGwoZixudWxsLG51bGwsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpGKGEsYihkLDEpLGYsITApO2lmKGIoZCwwKS50eXBlPT16LlRfRE9UKXt2YXIgZz1rKGIoZCwxKSk7cmV0dXJuIGc/bmV3IFNrLmFzdG5vZGVzLkF0dHJpYnV0ZShmLGcsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOm51bGx9ZShiKGQsMCksei5UX0xTUUIpO2UoYihkLDIpLHouVF9SU1FCKTtkPWIoZCwxKTtpZigxPT1jKGQpKXJldHVybihnPUkoYSxiKGQsMCkpKT9uZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsZyxcblNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpudWxsO3ZhciBoLG49MSx4PVtdO2ZvcihoPTA7aDxjKGQpO2grPTIpe2c9SShhLGIoZCxoKSk7aWYoIWcpcmV0dXJuIG51bGw7Zy5raW5kIT1aLkluZGV4X2tpbmQmJihuPTApO3hbaC8yXT1nfWlmKCFuKXJldHVybiBuZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsbmV3IFNrLmFzdG5vZGVzLkV4dFNsaWNlKHgpLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTthPVtdO2ZvcihoPTA7aDx4Lmxlbmd0aDsrK2gpZz14W2hdLFNrLmFzc2VydHMuYXNzZXJ0KGcua2luZD09Wi5JbmRleF9raW5kJiZnLnYuSW5kZXgudmFsdWUpLGFbaF09Zy52LkluZGV4LnZhbHVlO2c9bmV3IFNrLmFzdG5vZGVzLlR1cGxlKGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsbmV3IFNrLmFzdG5vZGVzLkluZGV4KGcpLFNrLmFzdG5vZGVzLkxvYWQsXG5kLmxpbmVubyxkLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIFYoYSxkKXtlKGQsci5mbG93X3N0bXQpO3ZhciBnPWIoZCwwKTtzd2l0Y2goZy50eXBlKXtjYXNlIHIuYnJlYWtfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkJyZWFrKGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7Y2FzZSByLmNvbnRpbnVlX3N0bXQ6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Db250aW51ZShkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO2Nhc2Ugci55aWVsZF9zdG10OnJldHVybihhPXcoYSxiKGcsMCkpKT9uZXcgU2suYXN0bm9kZXMuRXhwcihhLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6bnVsbDtjYXNlIHIucmV0dXJuX3N0bXQ6aWYoMT09YyhnKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlJldHVybihudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sXG5kLmVuZF9jb2xfb2Zmc2V0KTt2YXIgaD1XKGEsYihnLDEpKTtyZXR1cm4gaD9uZXcgU2suYXN0bm9kZXMuUmV0dXJuKGgsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpudWxsO2Nhc2Ugci5yYWlzZV9zdG10OmlmKDE9PWMoZykpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5SYWlzZShudWxsLG51bGwsbnVsbCxudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7aWYoMjw9YyhnKSl7dmFyIGs9bnVsbDtoPXcoYSxiKGcsMSkpO3ZhciBuPW51bGwseD1udWxsOzQ9PWMoZykmJlwiZnJvbVwiPT1iKGcsMikudmFsdWU/KFNrLl9fZnV0dXJlX18ucHl0aG9uM3x8ZihhLGIoZywyKSxcInJhaXNlIC4uLiBmcm9tIC4uLiBpcyBub3QgYXZhaWxhYmxlIGluIFB5dGhvbiAyXCIpLGs9dyhhLGIoZywzKSkpOjQ8PWMoZykmJlwiLFwiPT1iKGcsMikudmFsdWUmJihTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJmYoYSxcbmQsXCJPbGQgcmFpc2Ugc3ludGF4IGlzIG5vdCBhdmFpbGFibGUgaW4gUHl0aG9uIDNcIiksbj13KGEsYihnLDMpKSw2PT1jKGcpJiYoeD13KGEsYihnLDUpKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuUmFpc2UoaCxrLG4seCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpfWRlZmF1bHQ6cmV0dXJuIFNrLmFzc2VydHMuZmFpbChcInVuZXhwZWN0ZWQgZmxvd19zdG10OiBcIixnLnR5cGUpLG51bGx9fWZ1bmN0aW9uIHkoYSxlKXt2YXIgZj1udWxsO1NrLmFzc2VydHMuYXNzZXJ0KGUudHlwZT09PXIudGZwZGVmfHxlLnR5cGU9PT1yLnZmcGRlZik7dmFyIGc9YihlLDApO2QoYSxnLGcudmFsdWUsZy5saW5lbm8pO2c9bChnLnZhbHVlKTszPT1jKGUpJiZiKGUsMSkudHlwZT09PXouVF9DT0xPTiYmKGY9dyhhLGIoZSwyKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYXJnKGcsZixlLmxpbmVubyxlLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIEcoYSxcbmUsZyxoLGspe3ZhciBuPWcseD0wO2h8fGYoYSxiKGUsZyksXCJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqXCIpO2ZvcihTay5hc3NlcnRzLmFzc2VydChrKTtuPGMoZSk7KXt2YXIgcD1iKGUsbik7c3dpdGNoKHAudHlwZSl7Y2FzZSByLnZmcGRlZjpjYXNlIHIudGZwZGVmOm4rMTxjKGUpJiZiKGUsbisxKS50eXBlPT16LlRfRVFVQUw/KGtbeF09dyhhLGIoZSxuKzIpKSxuKz0yKTprW3hdPW51bGw7dmFyIG09Mz09YyhwKT93KGEsYihwLDIpKTpudWxsO3A9YihwLDApO2QoYSxwLHAudmFsdWUscC5saW5lbm8pO2c9bChwLnZhbHVlKTtoW3grK109bmV3IFNrLmFzdG5vZGVzLmFyZyhnLG0scC5saW5lbm8scC5jb2xfb2Zmc2V0KTtuKz0yO2JyZWFrO2Nhc2Ugei5UX0RPVUJMRVNUQVI6cmV0dXJuIG47ZGVmYXVsdDpmKGEscCxcInVuZXhwZWN0ZWQgbm9kZVwiKX19cmV0dXJuIG59ZnVuY3Rpb24gTChhLGQpe3ZhciBlLGYsZyxoPVtdLGs9W10sbj1bXSx4PVtdLGw9bnVsbCxcbnA9bnVsbDtpZihkLnR5cGU9PT1yLnBhcmFtZXRlcnMpe2lmKDI9PT1jKGQpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuYXJndW1lbnRzXyhbXSxudWxsLFtdLFtdLG51bGwsW10pO2Q9YihkLDEpfVNrLmFzc2VydHMuYXNzZXJ0KGQudHlwZT09PXIudmFyYXJnc2xpc3R8fGQudHlwZT09PXIudHlwZWRhcmdzbGlzdCk7Zm9yKGU9Zj1nPTA7ZzxjKGQpOyl7dmFyIG09YihkLGcpO3N3aXRjaChtLnR5cGUpe2Nhc2Ugci50ZnBkZWY6Y2FzZSByLnZmcGRlZjppZihnKzE8YyhkKSYmYihkLGcrMSkudHlwZT09ei5UX0VRVUFMKXtrW2YrK109dyhhLGIoZCxnKzIpKTtnKz0yO3ZhciBKPTF9ZWxzZSBpZihKKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibm9uLWRlZmF1bHQgYXJndW1lbnQgZm9sbG93cyBkZWZhdWx0IGFyZ3VtZW50XCIsYS5jX2ZpbGVuYW1lLGQubGluZW5vKTtoW2UrK109eShhLG0pO2crPTI7YnJlYWs7Y2FzZSB6LlRfU1RBUjppZihnKzE+PWMoZCl8fGcrMj09XG5jKGQpJiZiKGQsZysxKS50eXBlPT16LlRfQ09NTUEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqXCIsYS5jX2ZpbGVuYW1lLGQubGluZW5vKTttPWIoZCxnKzEpO20udHlwZT09ei5UX0NPTU1BPyhnKz0yLGc9RyhhLGQsZyxuLHgpKToobD15KGEsbSksZys9MyxnPGMoZCkmJihiKGQsZykudHlwZT09ci50ZnBkZWZ8fGIoZCxnKS50eXBlPT1yLnZmcGRlZikmJihnPUcoYSxkLGcsbix4KSkpO2JyZWFrO2Nhc2Ugei5UX0RPVUJMRVNUQVI6bT1iKGQsZysxKTtTay5hc3NlcnRzLmFzc2VydChtLnR5cGU9PXIudGZwZGVmfHxtLnR5cGU9PXIudmZwZGVmKTtwPXkoYSxtKTtnKz0zO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCBub2RlIGluIHZhcmFyZ3NsaXN0XCIpO3JldHVybn19cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hcmd1bWVudHNfKGgsbCxuLHgscCxrKX1mdW5jdGlvbiBUKGEsXG5nLGgsbil7dmFyIHg9bj9iKGcsMSk6ZyxsPW51bGwscD0xLG09bnVsbDtpZihuJiY1PmEuY19mZWF0dXJlX3ZlcnNpb24pcmV0dXJuIGYoYSx4LFwiQXN5bmMgZnVuY3Rpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBQeXRob24gMy41IGFuZCBncmVhdGVyXCIpLG51bGw7ZSh4LHIuZnVuY2RlZik7dmFyIFM9ayhiKHgscCkpO2lmKGQoYSxTLGIoeCxwKSwwKSlyZXR1cm4gbnVsbDt2YXIgSj1MKGEsYih4LHArMSkpO2lmKCFKKXJldHVybiBudWxsO2lmKGIoeCxwKzIpLnR5cGU9PXouVF9SQVJST1cpe2w9dyhhLGIoeCxwKzMpKTtpZighbClyZXR1cm4gbnVsbDtwKz0yfWlmKGIoeCxwKzMpLnR5cGU9PXouVF9UWVBFX0NPTU1FTlQpe209ei5UX05FV19UWVBFX0NPTU1FTlQoYih4LHArMykpO2lmKCFtKXJldHVybiBudWxsO3ArPTF9dmFyIEs9dChhLGIoeCxwKzMpKTtpZighSylyZXR1cm4gbnVsbDtpZigxPGMoYih4LHArMykpJiYocD1iKGIoeCxwKzMpLDEpLHAudHlwZT09ei5UX1RZUEVfQ09NTUVOVCkpe2lmKG51bGwhPVxubSlyZXR1cm4gZihhLHgsXCJDYW5ub3QgaGF2ZSB0d28gdHlwZSBjb21tZW50cyBvbiBkZWZcIiksbnVsbDttPXouVF9ORVdfVFlQRV9DT01NRU5UKHApO2lmKCFtKXJldHVybiBudWxsfXJldHVybiBuP25ldyBTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmKFMsSixLLGgsbCxtLGcubGluZW5vLGcuY29sX29mZnNldCx2b2lkIDAsdm9pZCAwKTpuZXcgU2suYXN0bm9kZXMuRnVuY3Rpb25EZWYoUyxKLEssaCxsLG0seC5saW5lbm8seC5jb2xfb2Zmc2V0LHZvaWQgMCx2b2lkIDApfWZ1bmN0aW9uIFAoYSxmLGcpe2UoZixyLmNsYXNzZGVmKTtpZig0PT1jKGYpKXt2YXIgaD10KGEsYihmLDMpKTt2YXIgbj1rKGIoZiwxKS52YWx1ZSk7ZChhLGIoZiwzKSxuLGYubGluZW5vKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNsYXNzRGVmKG4sW10sW10saCxnLG51bGwsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KX1pZihiKGYsMykudHlwZT09PXouVF9SUEFSKXJldHVybiBoPXQoYSxiKGYsNSkpLG49XG5rKGIoZiwxKS52YWx1ZSksZChhLGIoZiwzKSxuLGIoZiwzKS5saW5lbm8pLG5ldyBTay5hc3Rub2Rlcy5DbGFzc0RlZihuLFtdLFtdLGgsZyxudWxsLGYubGluZW5vLGYuY29sX29mZnNldCk7bj1rKGIoZiwxKSk7bj1uZXcgU2suYXN0bm9kZXMuTmFtZShuLFNrLmFzdG5vZGVzLkxvYWQsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTt2YXIgbD1GKGEsYihmLDMpLG4sITEpO2g9dChhLGIoZiw2KSk7bj1rKGIoZiwxKS52YWx1ZSk7ZChhLGIoZiwxKSxuLGIoZiwxKS5saW5lbm8pO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQ2xhc3NEZWYobixsLmFyZ3MsbC5rZXl3b3JkcyxoLGcsbnVsbCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIFEoYSxkKXtmdW5jdGlvbiBmKGEsZCl7Zm9yKGE9MDs7KXtlKGQsci5jb21wX2l0ZXIpO2lmKGIoZCwwKS50eXBlPT09ci5jb21wX2ZvcilyZXR1cm4gYTtkPWIoZCwwKTtlKGQsci5jb21wX2lmKTthKys7aWYoMj09PWMoZCkpcmV0dXJuIGE7ZD1cbmIoZCwyKX19dmFyIGc7dmFyIGg9ZnVuY3Rpb24oYSxkKXthPTA7YTpmb3IoOzspe2ErKztlKGQsci5jb21wX2Zvcik7aWYoNT09PWMoZCkpZD1iKGQsNCk7ZWxzZSByZXR1cm4gYTtiOmZvcig7Oyl7ZShkLHIuY29tcF9pdGVyKTtkPWIoZCwwKTtpZihkLnR5cGU9PT1yLmNvbXBfZm9yKWNvbnRpbnVlIGE7ZWxzZSBpZihkLnR5cGU9PT1yLmNvbXBfaWYpaWYoMz09PWMoZCkpe2Q9YihkLDIpO2NvbnRpbnVlIGJ9ZWxzZSByZXR1cm4gYTticmVha31icmVha31Tay5hc3NlcnRzLmZhaWwoXCJsb2dpYyBlcnJvciBpbiBjb3VudENvbXBGb3JzXCIpfShhLGQpO3ZhciBrPVtdO2ZvcihnPTA7ZzxoOysrZyl7ZShkLHIuY29tcF9mb3IpO3ZhciBuPWIoZCwxKTt2YXIgbD12KGEsbixTay5hc3Rub2Rlcy5TdG9yZSk7dmFyIHA9dyhhLGIoZCwzKSk7dmFyIHg9MT09PWMobik/bmV3IFNrLmFzdG5vZGVzLmNvbXByZWhlbnNpb24obFswXSxwLFtdKTpuZXcgU2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbihuZXcgU2suYXN0bm9kZXMuVHVwbGUobCxcblNrLmFzdG5vZGVzLlN0b3JlLGQubGluZW5vLGQuY29sX29mZnNldCkscCxbXSk7aWYoNT09PWMoZCkpe2Q9YihkLDQpO3ZhciBtPWYoYSxkKTtuPVtdO2ZvcihsPTA7bDxtOysrbCllKGQsci5jb21wX2l0ZXIpLGQ9YihkLDApLGUoZCxyLmNvbXBfaWYpLHA9dyhhLGIoZCwxKSksbltsXT1wLDM9PT1jKGQpJiYoZD1iKGQsMikpO2QudHlwZT09PXIuY29tcF9pdGVyJiYoZD1iKGQsMCkpO3guaWZzPW59a1tnXT14fXJldHVybiBrfWZ1bmN0aW9uIFUoYSxkKXt2YXIgZj1bXTthOnt2YXIgZz1kO3ZhciBoPTA7Yjpmb3IoOzspe3ZhciBrPTA7aCsrO2UoZyxyLmNvbXBfZm9yKTtiKGcsMCkudHlwZT09ei5UX0FTWU5DJiYoaz0xKTtpZihjKGcpPT01K2spZz1iKGcsNCtrKTtlbHNlIGJyZWFrIGE7Yzpmb3IoOzspe2UoZyxyLmNvbXBfaXRlcik7Zz1iKGcsMCk7aWYoZy50eXBlPT09ci5jb21wX2Zvciljb250aW51ZSBiO2Vsc2UgaWYoZy50eXBlPT09ci5jb21wX2lmKWlmKDM9PT1jKGcpKXtnPVxuYihnLDIpO2NvbnRpbnVlIGN9ZWxzZSBicmVhayBhO2JyZWFrfWJyZWFrfWg9dm9pZCAwfWZvcihnPTA7ZzxoO2crKyl7dmFyIG49MDtiKGQsMCkudHlwZT09ei5UX0FTWU5DJiYobj0xKTt2YXIgbD1iKGQsMStuKTt2YXIgcD12KGEsbCxTay5hc3Rub2Rlcy5TdG9yZSk7aWYoIXApcmV0dXJuIG51bGw7az13KGEsYihkLDMrbikpO2lmKCFrKXJldHVybiBudWxsO3ZhciB4PXBbMF07cD0xPT1jKGwpP25ldyBTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uKHgsayxudWxsLG4pOm5ldyBTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uKG5ldyBTay5hc3Rub2Rlcy5UdXBsZShwLFNrLmFzdG5vZGVzLlN0b3JlLHgubGluZW5vLHguY29sX29mZnNldCxsLmVuZF9saW5lbm8sbC5lbmRfY29sX29mZnNldCksayxudWxsLG4pO2lmKGMoZCk9PTUrbil7eD1bXTtkPWIoZCw0K24pO2E6Zm9yKGs9ZCxuPTA7Oyl7ZShrLHIuY29tcF9pdGVyKTtpZihiKGssMCkudHlwZT09ci5jb21wX2Zvcil7bD1uO2JyZWFrIGF9az1cbmIoaywwKTtlKGssci5jb21wX2lmKTtuKys7aWYoMj09YyhrKSl7bD1uO2JyZWFrIGF9az1iKGssMil9aWYoLTE9PWwpcmV0dXJuIG51bGw7Zm9yKG49MDtuPGw7bisrKXtlKGQsci5jb21wX2l0ZXIpO2Q9YihkLDApO2UoZCxyLmNvbXBfaWYpO2s9dyhhLGIoZCwxKSk7aWYoIWspcmV0dXJuIG51bGw7eFtuXT1rOzM9PWMoZCkmJihkPWIoZCwyKSl9ZC50eXBlPT1yLmNvbXBfaXRlciYmKGQ9YihkLDApKTtwLmlmcz14fWZbZ109cH1yZXR1cm4gZn1mdW5jdGlvbiBhYShhLGQsZSl7U2suYXNzZXJ0cy5hc3NlcnQoMTxjKGQpKTt2YXIgZz1iKGQsMCk7dmFyIGg9dyhhLGcpO2lmKGguY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXJldHVybiBmKGEsZyxcIml0ZXJhYmxlIHVucGFja2luZyBjYW5ub3QgYmUgdXNlZCBpbiBjb21wcmVoZW5zaW9uXCIpLG51bGw7YT1VKGEsYihkLDEpKTtyZXR1cm4gMD09ZT9uZXcgU2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwKGgsYSxkLmxpbmVubyxcbmQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6MT09ZT9uZXcgU2suYXN0bm9kZXMuTGlzdENvbXAoaCxhLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6Mj09ZT9uZXcgU2suYXN0bm9kZXMuU2V0Q29tcChoLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpudWxsfWZ1bmN0aW9uIGNhKGEsYyl7ZShjLHIuYXVnYXNzaWduKTtjPWIoYywwKTtzd2l0Y2goYy52YWx1ZS5jaGFyQXQoMCkpe2Nhc2UgXCIrXCI6cmV0dXJuIFNrLmFzdG5vZGVzLkFkZDtjYXNlIFwiLVwiOnJldHVybiBTay5hc3Rub2Rlcy5TdWI7Y2FzZSBcIi9cIjpyZXR1cm5cIi9cIj09PWMudmFsdWUuY2hhckF0KDEpP1NrLmFzdG5vZGVzLkZsb29yRGl2OlNrLmFzdG5vZGVzLkRpdjtjYXNlIFwiJVwiOnJldHVybiBTay5hc3Rub2Rlcy5Nb2Q7Y2FzZSBcIjxcIjpyZXR1cm4gU2suYXN0bm9kZXMuTFNoaWZ0O2Nhc2UgXCI+XCI6cmV0dXJuIFNrLmFzdG5vZGVzLlJTaGlmdDtcbmNhc2UgXCImXCI6cmV0dXJuIFNrLmFzdG5vZGVzLkJpdEFuZDtjYXNlIFwiXlwiOnJldHVybiBTay5hc3Rub2Rlcy5CaXRYb3I7Y2FzZSBcInxcIjpyZXR1cm4gU2suYXN0bm9kZXMuQml0T3I7Y2FzZSBcIipcIjpyZXR1cm5cIipcIj09PWMudmFsdWUuY2hhckF0KDEpP1NrLmFzdG5vZGVzLlBvdzpTay5hc3Rub2Rlcy5NdWx0O2Nhc2UgXCJAXCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBTay5hc3Rub2Rlcy5NYXRNdWx0O2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBhdWdhc3NpZ25cIil9fWZ1bmN0aW9uIFcoYSxkKXtTay5hc3NlcnRzLmFzc2VydCgwPGMoZCkpO2QudHlwZT09PXIudGVzdGxpc3RfY29tcD8xPGMoZCkmJlNrLmFzc2VydHMuYXNzZXJ0KGIoZCwxKS50eXBlIT09ci5jb21wX2Zvcik6U2suYXNzZXJ0cy5hc3NlcnQoZC50eXBlPT09ci50ZXN0bGlzdHx8ZC50eXBlPT09ci50ZXN0bGlzdF9zdGFyX2V4cHIpO3JldHVybiAxPT09YyhkKT93KGEsYihkLDApKTpuZXcgU2suYXN0bm9kZXMuVHVwbGUoQShhLFxuZCksU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIGRhKGEsZil7ZShmLHIuZXhwcl9zdG10KTtpZigxPT09YyhmKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkV4cHIoVyhhLGIoZiwwKSksZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtpZihiKGYsMSkudHlwZT09PXIuYXVnYXNzaWduKXt2YXIgaD1iKGYsMCk7dmFyIGs9VyhhLGgpO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO3N3aXRjaChrLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6dmFyIG49ay5pZDtkKGEsaCxuLGYubGluZW5vKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTpjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImF1Z21lbnRlZCBhc3NpZ25tZW50IHRvIGdlbmVyYXRvciBleHByZXNzaW9uIG5vdCBwb3NzaWJsZVwiLGEuY19maWxlbmFtZSxcbmYubGluZW5vKTtjYXNlIFNrLmFzdG5vZGVzLllpZWxkOnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXVnbWVudGVkIGFzc2lnbm1lbnQgdG8geWllbGQgZXhwcmVzc2lvbiBub3QgcG9zc2libGVcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbGxlZ2FsIGV4cHJlc3Npb24gZm9yIGF1Z21lbnRlZCBhc3NpZ25tZW50XCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTt9aD1iKGYsMik7bj1oLnR5cGU9PT1yLnRlc3RsaXN0P1coYSxoKTp3KGEsaCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5BdWdBc3NpZ24oayxjYShhLGIoZiwxKSksbixmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWlmKGIoZiwxKS50eXBlPT09ci5hbm5hc3NpZ24pe2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJBbm5vdGF0ZWQgYXNzaWdubWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIsXG5hLmNfZmlsZW5hbWUsZi5saW5lbm8pO2g9YihmLDApO3ZhciBsPWIoZiwxKTt2YXIgcD0xO2ZvcihrPWg7MT09YyhrKTspaz1iKGssMCk7MDxjKGspJiZiKGssMCkudHlwZT09ei5UX0xQQVImJihwPTApO2s9VyhhLGgpO3N3aXRjaChrLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6bj1rLmlkO2QoYSxoLG4sZi5saW5lbm8pO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOm49ay5hdHRyO2QoYSxoLG4sZi5saW5lbm8pO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OmcoYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm9ubHkgc2luZ2xlIHRhcmdldCAobm90IGxpc3QpIGNhbiBiZSBhbm5vdGF0ZWRcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO1xuY2FzZSBTay5hc3Rub2Rlcy5UdXBsZTp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm9ubHkgc2luZ2xlIHRhcmdldCAobm90IHR1cGxlKSBjYW4gYmUgYW5ub3RhdGVkXCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaWxsZWdhbCB0YXJnZXQgZm9yIGFubm90YXRpb25cIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO31rLmNvbnN0cnVjdG9yIT1Tay5hc3Rub2Rlcy5OYW1lJiYocD0wKTtoPWIobCwxKTtuPXcoYSxoKTtpZigyPT1jKGwpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQW5uQXNzaWduKGssbixudWxsLHAsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtoPWIobCwzKTthPXcoYSxoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkFubkFzc2lnbihrLG4sYSxwLGYubGluZW5vLGYuY29sX29mZnNldCl9ZShiKGYsMSksei5UX0VRVUFMKTtwPVtdO2ZvcihrPTA7azxjKGYpLTI7ays9Mil7aD1iKGYsayk7aWYoaC50eXBlPT09XG5yLnlpZWxkX2V4cHIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIHlpZWxkIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlXCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtoPVcoYSxoKTtnKGEsaCxTay5hc3Rub2Rlcy5TdG9yZSxiKGYsaykpO3Bbay8yXT1ofWg9YihmLGMoZiktMSk7YT1oLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcj9XKGEsaCk6dyhhLGgpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQXNzaWduKHAsYSxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIGVhKGEsYixjLGQsZSl7U2suYXNzZXJ0cy5hc3NlcnQoYz49Yik7U2suYXNzZXJ0cy5hc3NlcnQoXCJ7XCI9PWEuY2hhckF0KGItMSkpO1NrLmFzc2VydHMuYXNzZXJ0KFwifVwiPT1hLmNoYXJBdChjKXx8XCIhXCI9PWEuY2hhckF0KGMpfHxcIjpcIj09YS5jaGFyQXQoYykpO2E9YS5zdWJzdHJpbmcoYixjKTsvXlxccyokLy50ZXN0KGEpJiZmKGQsZSxcImYtc3RyaW5nOiBlbXB0eSBleHByZXNzaW9uIG5vdCBhbGxvd2VkXCIpO1xudHJ5e2xldCBiPVNrLnBhcnNlKFwiPGZzdHJpbmc+XCIsXCIoXCIrYStcIilcIik7dmFyIGc9U2suYXN0RnJvbVBhcnNlKGIuY3N0LFwiPGZzdHJpbmc+XCIsYi5mbGFncyl9Y2F0Y2goWSl7dGhyb3cgWS50cmFjZWJhY2smJlkudHJhY2ViYWNrWzBdJiYoZz1ZLnRyYWNlYmFja1swXSxnLmxpbmVubz0oZy5saW5lbm98fDEpLTErZS5saW5lbm8sZy5maWxlbmFtZT1kLmNfZmlsZW5hbWUpLFk7fVNrLmFzc2VydHMuYXNzZXJ0KDE9PWcuYm9keS5sZW5ndGgmJmcuYm9keVswXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLkV4cHIpO3JldHVybiBnLmJvZHlbMF0udmFsdWV9ZnVuY3Rpb24gSChhLGIsYyxkLGUsZyxoKXtTay5hc3NlcnRzLmFzc2VydChcIntcIj09YS5jaGFyQXQoYikpO2IrKzt2YXIgaz1iO2xldCBuPW51bGwsbD0wLHA9MCxtLHgsUz0oKT0+ZihnLGgsXCJmLXN0cmluZzogZXhwZWN0aW5nICd9J1wiKTtmb3IoU2suYXNzZXJ0cy5hc3NlcnQoYjw9Yyk7YjxjO2IrKyl7bGV0IGQ9YS5jaGFyQXQoYik7XG5cIlxcXFxcIj09ZCYmZihnLGgsXCJmLXN0cmluZyBleHByZXNzaW9uIHBhcnQgY2Fubm90IGluY2x1ZGUgYSBiYWNrc2xhc2hcIik7aWYobilkPT1uJiYoMz09bD9iKzI8YyYmYS5jaGFyQXQoYisxKT09ZCYmYS5jaGFyQXQoYisyKT09ZCYmKGIrPTIsbj1sPTApOmw9bj0wKTtlbHNlIGlmKFwiJ1wiPT1kfHwnXCInPT1kKWIrMjxjJiZhLmNoYXJBdChiKzEpPT1kJiZhLmNoYXJBdChiKzIpPT1kPyhsPTMsYis9Mik6bD0xLG49ZDtlbHNlIGlmKFwiW1wiPT1kfHxcIntcIj09ZHx8XCIoXCI9PWQpcCsrO2Vsc2UgaWYoMCE9cCYmKFwiXVwiPT1kfHxcIn1cIj09ZHx8XCIpXCI9PWQpKXAtLTtlbHNlIGlmKFwiI1wiPT1kKWYoZyxoLFwiZi1zdHJpbmcgZXhwcmVzc2lvbiBwYXJ0IGNhbm5vdCBpbmNsdWRlICcjJ1wiKTtlbHNlIGlmKCEoMCE9cHx8XCIhXCIhPWQmJlwiOlwiIT1kJiZcIn1cIiE9ZHx8XCIhXCI9PWQmJmIrMTxjJiZcIj1cIj09YS5jaGFyQXQoYisxKSkpYnJlYWt9biYmZihnLGgsXCJmLXN0cmluZzogdW50ZXJtaW5hdGVkIHN0cmluZ1wiKTtcbnAmJmYoZyxoLFwiZi1zdHJpbmc6IG1pc21hdGNoZWQgJygnLCAneycsIG9yICdbJ1wiKTtrPWVhKGEsayxiLGcsaCk7XCIhXCI9PWEuY2hhckF0KGIpJiYoYisrLGI+PWMmJlMoKSx4PWEuY2hhckF0KGIpLGIrKyxcInNcIiE9eCYmXCJyXCIhPXgmJlwiYVwiIT14JiZmKGcsaCxcImYtc3RyaW5nOiBpbnZhbGlkIGNvbnZlcnNpb24gY2hhcmFjdGVyOiBleHBlY3RlZCAncycsICdyJywgb3IgJ2EnXCIpKTtiPj1jJiZTKCk7XCI6XCI9PWEuY2hhckF0KGIpJiYoYisrLGI+PWMmJlMoKSxbbSxiXT1iYShhLGIsYyxkLGUrMSxnLGgpKTsoYj49Y3x8XCJ9XCIhPWEuY2hhckF0KGIpKSYmUygpO2IrKztyZXR1cm5bbmV3IFNrLmFzdG5vZGVzLkZvcm1hdHRlZFZhbHVlKGsseCxtLGgubGluZW5vLGguY29sX29mZnNldCksYl19ZnVuY3Rpb24gYmEoYSxiLGMsZCxlLGYsZyl7bGV0IGg9W10saz1hPT57aWYoLTEhPT1hLmluZGV4T2YoXCJ9XCIpKXtpZigvKF58W159XSl9KH19KSooJHxbXn1dKS8udGVzdChhKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJmLXN0cmluZzogc2luZ2xlICd9JyBpcyBub3QgYWxsb3dlZFwiLFxuZy5saW5lbm8sZy5jb2xfb2Zmc2V0KTthPWEucmVwbGFjZSgvfX0vZyxcIn1cIil9aC5wdXNoKG5ldyBTay5hc3Rub2Rlcy5TdHIobmV3IFNrLmJ1aWx0aW4uc3RyKGEpLGcubGluZW5vLGcuY29sX29mZnNldCxmLmVuZF9saW5lbm8sZy5lbmRfY29sX29mZnNldCkpfTtmb3IoO2I8Yzspe2xldCBuPWEuaW5kZXhPZihcIntcIixiKTtpZigwIT09ZSl7bGV0IGQ9YS5pbmRleE9mKFwifVwiLGIpOy0xIT09ZCYmKC0xPT09bj9jPWQ6bj5kJiYobj0tMSxjPWQpKX1pZigtMT09PW4pe2soYS5zdWJzdHJpbmcoYixjKSk7Yj1jO2JyZWFrfWVsc2UgaWYobisxPGMmJlwie1wiPT09YS5jaGFyQXQobisxKSlrKGEuc3Vic3RyaW5nKGIsbisxKSksYj1uKzI7ZWxzZXtrKGEuc3Vic3RyaW5nKGIsbikpO2I9bjtsZXQgW2wscF09SChhLG4sYyxkLGUsZixnKTtoLnB1c2gobCk7Yj1wfX1yZXR1cm5bbmV3IFNrLmFzdG5vZGVzLkpvaW5lZFN0cihoLGcubGluZW5vLGcuY29sX29mZnNldCksYl19ZnVuY3Rpb24gWChhLFxuYixjKXt2YXIgZD1iLmNoYXJBdChiLmxlbmd0aC0xKTtpZigtMSE9PWIuaW5kZXhPZihcIl9cIikpe2lmKGZhLnRlc3QoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIHN5bnRheFwiLGEuY19maWxlbmFtZSxjKTtpZihoYS50ZXN0KGIpKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBkZWNpbWFsIGxpdGVyYWxcIixhLmNfZmlsZW5hbWUsYyk7Yj1iLnJlcGxhY2UoaWEsXCJcIil9aWYoXCJqXCI9PT1kfHxcIkpcIj09PWQpcmV0dXJuIFNrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcoYik7aWYoXCJsXCI9PT1kfHxcIkxcIj09PWQpcmV0dXJuIFNrLmxvbmdGcm9tU3RyKGIuc3Vic3RyKDAsYi5sZW5ndGgtMSksMCk7aWYoLTEhPT1iLmluZGV4T2YoXCIuXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8ocGFyc2VGbG9hdChiKSk7Yz1iO2E9ITE7XCItXCI9PT1iLmNoYXJBdCgwKSYmKGM9Yi5zdWJzdHIoMSksYT1cbiEwKTtpZihcIjBcIiE9PWMuY2hhckF0KDApfHxcInhcIiE9PWMuY2hhckF0KDEpJiZcIlhcIiE9PWMuY2hhckF0KDEpKXtpZigtMSE9PWIuaW5kZXhPZihcImVcIil8fC0xIT09Yi5pbmRleE9mKFwiRVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHBhcnNlRmxvYXQoYikpO2lmKFwiMFwiIT09Yy5jaGFyQXQoMCl8fFwiYlwiIT09Yy5jaGFyQXQoMSkmJlwiQlwiIT09Yy5jaGFyQXQoMSkpaWYoXCIwXCI9PT1jLmNoYXJBdCgwKSlpZihcIjBcIj09PWMpYz0wO2Vsc2V7Yz1jLnN1YnN0cmluZygxKTtpZihcIm9cIj09PWMuY2hhckF0KDApfHxcIk9cIj09PWMuY2hhckF0KDApKWM9Yy5zdWJzdHJpbmcoMSk7Yz1wYXJzZUludChjLDgpfWVsc2UgYz1wYXJzZUludChjLDEwKTtlbHNlIGM9Yy5zdWJzdHJpbmcoMiksYz1wYXJzZUludChjLDIpfWVsc2UgYz1jLnN1YnN0cmluZygyKSxjPXBhcnNlSW50KGMsMTYpO3JldHVybiBjPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZNYXRoLmZsb29yKGMpPT09YyYmLTE9PT1iLmluZGV4T2YoXCJlXCIpJiZcbi0xPT09Yi5pbmRleE9mKFwiRVwiKT9Tay5sb25nRnJvbVN0cihiLDApOmE/bmV3IFNrLmJ1aWx0aW4uaW50XygtYyk6bmV3IFNrLmJ1aWx0aW4uaW50XyhjKX1mdW5jdGlvbiBJKGEsZCl7dmFyIGYsZztlKGQsci5zdWJzY3JpcHQpO3ZhciBoPWIoZCwwKTt2YXIgaz1mPWc9bnVsbDtpZihoLnR5cGU9PT16LlRfRE9UKXJldHVybiBuZXcgU2suYXN0bm9kZXMuRWxsaXBzaXM7aWYoMT09PWMoZCkmJmgudHlwZT09PXIudGVzdClyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkluZGV4KHcoYSxoKSk7aC50eXBlPT09ci50ZXN0JiYoZz13KGEsaCkpO2gudHlwZT09PXouVF9DT0xPTj8xPGMoZCkmJihoPWIoZCwxKSxoLnR5cGU9PT1yLnRlc3QmJihmPXcoYSxoKSkpOjI8YyhkKSYmKGg9YihkLDIpLGgudHlwZT09PXIudGVzdCYmKGY9dyhhLGgpKSk7aD1iKGQsYyhkKS0xKTtoLnR5cGU9PT1yLnNsaWNlb3AmJigxPT09YyhoKT8oaD1iKGgsMCksaz1uZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxcblNrLmFzdG5vZGVzLkxvYWQsaC5saW5lbm8saC5jb2xfb2Zmc2V0KSk6KGg9YihoLDEpLGgudHlwZT09PXIudGVzdCYmKGs9dyhhLGgpKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuU2xpY2UoZyxmLGspfWZ1bmN0aW9uIFIoYSxkKXt2YXIgZz1iKGQsMCk7c3dpdGNoKGcudHlwZSl7Y2FzZSB6LlRfTkFNRTp2YXIgaD1nLnZhbHVlO2lmKDQ8PWgubGVuZ3RoJiY1Pj1oLmxlbmd0aCl7aWYoXCJOb25lXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2lmKFwiVHJ1ZVwiPT09aClyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudChTay5idWlsdGluLmJvb2wudHJ1ZSQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtpZihcIkZhbHNlXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1hPVxuayhoLGEpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZShhLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtjYXNlIHouVF9TVFJJTkc6Zz1bXTtmb3IodmFyIG49MDtuPGMoZCk7KytuKXt2YXIgcD1iKGQsbikudmFsdWU7dmFyIG09YTt2YXIgeD1iKGQsbik7dmFyIHQ9cDt2YXIgcT10LmNoYXJBdCgwKTtmb3IodmFyIEo9ITEsdj1wPSExOzspe2lmKFwidVwiIT09cSYmXCJVXCIhPT1xKWlmKFwiclwiPT09cXx8XCJSXCI9PT1xKUo9ITA7ZWxzZSBpZihcImJcIj09PXF8fFwiQlwiPT09cSl2PSEwO2Vsc2UgaWYoXCJmXCI9PT1xfHxcIkZcIj09PXEpcD0hMDtlbHNlIGJyZWFrO3Q9dC5zdWJzdHIoMSk7cT10LmNoYXJBdCgwKX1Tay5hc3NlcnRzLmFzc2VydChcIidcIj09PXF8fCdcIic9PT1xJiZ0LmNoYXJBdCh0Lmxlbmd0aC0xKT09PXEpO3Q9dC5zdWJzdHIoMSx0Lmxlbmd0aC0yKTs0PD10Lmxlbmd0aCYmdC5jaGFyQXQoMCk9PT1xJiZcbnQuY2hhckF0KDEpPT09cSYmKFNrLmFzc2VydHMuYXNzZXJ0KHQuY2hhckF0KHQubGVuZ3RoLTEpPT09cSYmdC5jaGFyQXQodC5sZW5ndGgtMik9PT1xKSx0PXQuc3Vic3RyKDIsdC5sZW5ndGgtNCkpO2lmKEp8fC0xPT09dC5pbmRleE9mKFwiXFxcXFwiKSl7aWYodilmb3IocT0wO3E8dC5sZW5ndGg7cSsrKTEyNzx0LmNoYXJDb2RlQXQocSkmJmYobSx4LFwiYnl0ZXMgY2FuIG9ubHkgY29udGFpbiBBU0NJSSBsaXRlcmFsIGNoYXJhY3RlcnNcIik7bT1bbCh0KSxwLHZdfWVsc2V7Sj10O3ZhciBCPUoubGVuZ3RoLHk9XCJcIjtmb3IodD0wO3Q8QjsrK3QpcT1KLmNoYXJBdCh0KSxcIlxcXFxcIj09PXE/KCsrdCxxPUouY2hhckF0KHQpLFwiblwiPT09cT95Kz1cIlxcblwiOlwiXFxcXFwiPT09cT95Kz1cIlxcXFxcIjpcInRcIj09PXE/eSs9XCJcXHRcIjpcInJcIj09PXE/eSs9XCJcXHJcIjpcImJcIj09PXE/eSs9XCJcXGJcIjpcImZcIj09PXE/eSs9XCJcXGZcIjpcInZcIj09PXE/eSs9XCJcXHZcIjpcIjBcIj09PXE/eSs9XCJcXHgwMFwiOidcIic9PT1xP3krPSdcIic6XCInXCI9PT1xP1xueSs9XCInXCI6XCJcXG5cIiE9PXEmJihcInhcIj09PXE/KHQrMj49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXHhOTiBlc2NhcGVcIikseSs9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChKLnN1YnN0cih0KzEsMiksMTYpKSx0Kz0yKTp2fHxcInVcIiE9PXE/dnx8XCJVXCIhPT1xP3krPVwiXFxcXFwiK3E6KHQrOD49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXFVYWFhYWFhYWCBlc2NhcGVcIikseSs9U3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoSi5zdWJzdHIodCsxLDgpLDE2KSksdCs9OCk6KHQrND49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXHVYWFhYIGVzY2FwZVwiKSx5Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KEouc3Vic3RyKHQrMSw0KSwxNikpLHQrPTQpKSk6diYmMTI3PHEuY2hhckNvZGVBdCgwKT9mKG0seCxcImJ5dGVzIGNhbiBvbmx5IGNvbnRhaW4gQVNDSUkgbGl0ZXJhbCBjaGFyYWN0ZXJzXCIpOnkrPXE7bT15O209W2wobSkscCx2XX1wPW07bT1wWzBdO3g9cFsxXTtwPXBbMl07MCE9biYmXG5oIT09cCYmZihhLGQsXCJjYW5ub3QgbWl4IGJ5dGVzIGFuZCBub25ieXRlcyBsaXRlcmFsc1wiKTtoPXA7aWYoeCl7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImludmFsaWQgc3RyaW5nIChmLXN0cmluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDIpXCIsYS5jX2ZpbGVuYW1lLGIoZCxuKS5saW5lbm8pO3ZhciBGPW0uJGpzc3RyKCk7W0ZdPWJhKEYsMCxGLmxlbmd0aCwhMSwwLGEsYihkLG4pKTtnLnB1c2guYXBwbHkoZyxGLnZhbHVlcyk7Rj1udWxsfWVsc2UgRj9GLnM9Ri5zLnNxJGNvbmNhdChtKTooRj1uZXcgKGg/U2suYXN0bm9kZXMuQnl0ZXM6U2suYXN0bm9kZXMuU3RyKShtLGQubGluZW5vLGQuY29sX29mZnNldCxhLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCksZy5wdXNoKEYpKX1kPTE9PT1nLmxlbmd0aCYmZ1swXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0cj9nWzBdOm5ldyBTay5hc3Rub2Rlcy5Kb2luZWRTdHIoZyxcbmQubGluZW5vLGQuY29sX29mZnNldCxhLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7cmV0dXJuIGQ7Y2FzZSB6LlRfTlVNQkVSOnJldHVybiBuZXcgU2suYXN0bm9kZXMuTnVtKFgoYSxnLnZhbHVlLGQubGluZW5vKSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX0VMTElQU0lTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuRWxsaXBzaXMoZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtjYXNlIHouVF9MUEFSOnJldHVybiBnPWIoZCwxKSxnLnR5cGU9PXouVF9SUEFSP25ldyBTay5hc3Rub2Rlcy5UdXBsZShbXSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6Zy50eXBlPT1yLnlpZWxkX2V4cHI/dyhhLGcpOjE9PWMoZyk/VyhhLGcpOmIoZywxKS50eXBlPT1yLmNvbXBfZm9yP3UoRChhLGcpLGQpOnUoVyhhLGcpLGQpO2Nhc2Ugei5UX0xTUUI6Zz1cbmIoZCwxKTtpZihnLnR5cGU9PXouVF9SU1FCKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTGlzdChbXSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7ZShnLHIudGVzdGxpc3RfY29tcCk7aWYoMT09YyhnKXx8YihnLDEpLnR5cGU9PXouVF9DT01NQSlyZXR1cm4oYT1BKGEsZykpP25ldyBTay5hc3Rub2Rlcy5MaXN0KGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOm51bGw7aD1nO1NrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09ci50ZXN0bGlzdF9jb21wKTthPWFhKGEsaCwxKTtyZXR1cm4gdShhLGQpO2Nhc2Ugei5UX0xCUkFDRTpnPWIoZCwxKTtpZihnLnR5cGU9PXouVF9SQlJBQ0UpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5EaWN0KG51bGwsbnVsbCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO1xuaD1iKGcsMCkudHlwZT09ei5UX0RPVUJMRVNUQVI7aWYoMT09YyhnKXx8MTxjKGcpJiZiKGcsMSkudHlwZT09ei5UX0NPTU1BKXtoPWc7bj1bXTtTay5hc3NlcnRzLmFzc2VydChoLnR5cGU9PT1yLmRpY3RvcnNldG1ha2VyKTtmb3IoZz0wO2c8YyhoKTtnKz0yKUY9dyhhLGIoaCxnKSksbltnLzJdPUY7YT1uZXcgU2suYXN0bm9kZXMuU2V0KG4saC5saW5lbm8saC5jb2xfb2Zmc2V0KX1lbHNlIGlmKDE8YyhnKSYmYihnLDEpLnR5cGU9PXIuY29tcF9mb3IpaD1nLFNrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09PXIuZGljdG9yc2V0bWFrZXIpLFNrLmFzc2VydHMuYXNzZXJ0KDE8YyhoKSksZz13KGEsYihoLDApKSxhPVEoYSxiKGgsMSkpLGE9bmV3IFNrLmFzdG5vZGVzLlNldENvbXAoZyxhLGgubGluZW5vLGguY29sX29mZnNldCk7ZWxzZSBpZihjKGcpPjMtaCYmYihnLDMtaCkudHlwZT09ci5jb21wX2Zvcil7aWYoaClyZXR1cm4gZihhLGQsXCJkaWN0IHVucGFja2luZyBjYW5ub3QgYmUgdXNlZCBpbiBkaWN0IGNvbXByZWhlbnNpb25cIiksXG5udWxsO2g9ZztTay5hc3NlcnRzLmFzc2VydCgzPGMoaCkpO2UoYihoLDEpLHouVF9DT0xPTik7Zz13KGEsYihoLDApKTtuPXcoYSxiKGgsMikpO2E9UShhLGIoaCwzKSk7YT1uZXcgU2suYXN0bm9kZXMuRGljdENvbXAoZyxuLGEsaC5saW5lbm8saC5jb2xfb2Zmc2V0KX1lbHNle2g9ZztuPVtdO0Y9W107Zm9yKHA9Zz0wO3A8YyhoKTtwKyspbT1hLHg9aCx2PXAsYih4LHYpLnR5cGU9PXouVF9ET1VCTEVTVEFSPyhTay5hc3NlcnRzLmFzc2VydCgyPD1jKHgpLXYpLHA9dyhtLGIoeCx2KzEpKSxtPXtrZXk6bnVsbCx2YWx1ZTpwLGk6disyfSk6KFNrLmFzc2VydHMuYXNzZXJ0KDM8PWMoeCktdiksKHA9dyhtLGIoeCx2KSkpPyh0PXAsZShiKHgsdisxKSx6LlRfQ09MT04pLG09KHA9dyhtLGIoeCx2KzIpKSk/e2tleTp0LHZhbHVlOnAsaTp2KzN9OiExKTptPTApLHA9bS5pLG5bZ109bS5rZXksRltnXT1tLnZhbHVlLGcrKzthPW5ldyBTay5hc3Rub2Rlcy5EaWN0KG4sRixoLmxpbmVubyxcbmguY29sX29mZnNldCxoLmVuZF9saW5lbm8saC5lbmRfY29sX29mZnNldCl9cmV0dXJuIHUoYSxkKTtkZWZhdWx0OnJldHVybiBTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgYXRvbSBcIitnLnR5cGUpLG51bGx9fWZ1bmN0aW9uIEMoYSxkKXt2YXIgZyxmPTA7ZShkLHIuYXRvbV9leHByKTt2YXIgaD1jKGQpO2IoZCwwKS50eXBlPT09ei5UX0FXQUlUJiYoZj0xLFNrLmFzc2VydHMuYXNzZXJ0KDE8aCkpO3ZhciBrPVIoYSxiKGQsZikpO2lmKCFrKXJldHVybiBudWxsO2lmKDE9PT1oKXJldHVybiBrO2lmKGYmJjI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQXdhaXQoayxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2ZvcihnPWYrMTtnPGg7ZysrKXt2YXIgbj1iKGQsZyk7aWYobi50eXBlIT09ci50cmFpbGVyKWJyZWFrO249TShhLG4sayk7aWYoIW4pcmV0dXJuIG51bGw7bi5saW5lbm89ay5saW5lbm87bi5jb2xfb2Zmc2V0PWsuY29sX29mZnNldDtrPW59cmV0dXJuIGY/bmV3IFNrLmFzdG5vZGVzLkF3YWl0KGssXG5kLmxpbmUsZC5jb2xfb2Zmc2V0KTprfWZ1bmN0aW9uIHcoYSxkKXthOmZvcig7Oyl7c3dpdGNoKGQudHlwZSl7Y2FzZSByLnRlc3Q6Y2FzZSByLnRlc3Rfbm9jb25kOmlmKGIoZCwwKS50eXBlPT09ci5sYW1iZGVmfHxiKGQsMCkudHlwZT09PXIubGFtYmRlZl9ub2NvbmQpe3ZhciBnPWIoZCwwKTszPT09YyhnKT8oZD1uZXcgU2suYXN0bm9kZXMuYXJndW1lbnRzXyhbXSxudWxsLG51bGwsW10pLGE9dyhhLGIoZywyKSkpOihkPUwoYSxiKGcsMSkpLGE9dyhhLGIoZywzKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuTGFtYmRhKGQsYSxnLmxpbmVubyxnLmNvbF9vZmZzZXQpfWlmKDE8YyhkKSlyZXR1cm4gU2suYXNzZXJ0cy5hc3NlcnQoNT09PWMoZCkpLG5ldyBTay5hc3Rub2Rlcy5JZkV4cCh3KGEsYihkLDIpKSx3KGEsYihkLDApKSx3KGEsYihkLDQpKSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5vcl90ZXN0OmNhc2Ugci5hbmRfdGVzdDppZigxPT09YyhkKSl7ZD1iKGQsXG4wKTtjb250aW51ZSBhfXZhciBmPVtdO2ZvcihnPTA7ZzxjKGQpO2crPTIpZltnLzJdPXcoYSxiKGQsZykpO2lmKFwiYW5kXCI9PT1iKGQsMSkudmFsdWUpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Cb29sT3AoU2suYXN0bm9kZXMuQW5kLGYsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtTay5hc3NlcnRzLmFzc2VydChcIm9yXCI9PT1iKGQsMSkudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQm9vbE9wKFNrLmFzdG5vZGVzLk9yLGYsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIubm90X3Rlc3Q6aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9ZWxzZSByZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlVuYXJ5T3AoU2suYXN0bm9kZXMuTm90LHcoYSxiKGQsMSkpLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmNvbXBhcmlzb246aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9ZWxzZXt2YXIgaD1bXTtmPVtdO2ZvcihnPTE7ZzxjKGQpO2crPTIpaFsoZy0xKS8yXT1cbnAoYSxiKGQsZykpLGZbKGctMSkvMl09dyhhLGIoZCxnKzEpKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNvbXBhcmUodyhhLGIoZCwwKSksaCxmLGQubGluZW5vLGQuY29sX29mZnNldCl9Y2FzZSByLnN0YXJfZXhwcjpyZXR1cm4gZShkLHIuc3Rhcl9leHByKSxuZXcgU2suYXN0bm9kZXMuU3RhcnJlZCh3KGEsYihkLDEpKSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmV4cHI6Y2FzZSByLnhvcl9leHByOmNhc2Ugci5hbmRfZXhwcjpjYXNlIHIuc2hpZnRfZXhwcjpjYXNlIHIuYXJpdGhfZXhwcjpjYXNlIHIudGVybTppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX12YXIgaz1kLGw9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKHcoYSxiKGssMCkpLG4oYihrLDEpKSx3KGEsYihrLDIpKSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpLG09KGMoayktMSkvMjtmb3IoZD0xO2Q8bTsrK2QpZz1iKGssMipkKzEpLGY9bihnKSxoPXcoYSxiKGssMipkK1xuMikpLGw9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKGwsZixoLGcubGluZW5vLGcuY29sX29mZnNldCk7cmV0dXJuIGw7Y2FzZSByLnlpZWxkX2V4cHI6cmV0dXJuIGY9ITEsaD1udWxsLDE8YyhkKSYmKGc9YihkLDEpKSxnJiYoaD1iKGcsYyhnKS0xKSwyPT1jKGcpPyhmPSEwLGg9dyhhLGgpKTpoPVcoYSxoKSksZj9uZXcgU2suYXN0bm9kZXMuWWllbGRGcm9tKGgsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpuZXcgU2suYXN0bm9kZXMuWWllbGQoaCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5mYWN0b3I6aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9cmV0dXJuIEUoYSxkKTtjYXNlIHIucG93ZXI6cmV0dXJuIGc9ZCxlKGcsci5wb3dlciksZD1DKGEsYihnLDApKSwxIT09YyhnKSYmYihnLGMoZyktMSkudHlwZT09PXIuZmFjdG9yJiYoYT13KGEsYihnLGMoZyktMSkpLGQ9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKGQsU2suYXN0bm9kZXMuUG93LGEsZy5saW5lbm8sZy5jb2xfb2Zmc2V0KSksXG5kO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGV4cHJcIixcIm4udHlwZTogJWRcIixkLnR5cGUpfWJyZWFrfX1mdW5jdGlvbiBOKGEsZCl7ZC50eXBlPT09ci5zdG10JiYoU2suYXNzZXJ0cy5hc3NlcnQoMT09PWMoZCkpLGQ9YihkLDApKTtkLnR5cGU9PT1yLnNpbXBsZV9zdG10JiYoU2suYXNzZXJ0cy5hc3NlcnQoMT09PWgoZCkpLGQ9YihkLDApKTtpZihkLnR5cGU9PT1yLnNtYWxsX3N0bXQpc3dpdGNoKGQ9YihkLDApLGQudHlwZSl7Y2FzZSByLmV4cHJfc3RtdDpyZXR1cm4gZGEoYSxkKTtjYXNlIHIuZGVsX3N0bXQ6dmFyIGs9ZDtlKGssci5kZWxfc3RtdCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5EZWxldGUodihhLGIoaywxKSxTay5hc3Rub2Rlcy5EZWwpLGsubGluZW5vLGsuY29sX29mZnNldCk7Y2FzZSByLnBhc3Nfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlBhc3MoZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIuZmxvd19zdG10OnJldHVybiBWKGEsXG5kKTtjYXNlIHIuaW1wb3J0X3N0bXQ6dmFyIG49ZCxwO2UobixyLmltcG9ydF9zdG10KTt2YXIgbT1uLmxpbmVubztkPW4uY29sX29mZnNldDtuPWIobiwwKTtpZihuLnR5cGU9PT1yLmltcG9ydF9uYW1lKXtuPWIobiwxKTtlKG4sci5kb3R0ZWRfYXNfbmFtZXMpO3ZhciBxPVtdO2ZvcihwPTA7cDxjKG4pO3ArPTIpcVtwLzJdPUIoYSxiKG4scCkpO2E9bmV3IFNrLmFzdG5vZGVzLkltcG9ydChxLG0sZCl9ZWxzZSBpZihuLnR5cGU9PT1yLmltcG9ydF9mcm9tKXt2YXIgdT1udWxsO2s9MDtmb3IocT0xO3E8YyhuKTsrK3EpaWYoYihuLHEpLnR5cGU9PT1yLmRvdHRlZF9uYW1lKXt1PUIoYSxiKG4scSkpO3ErKzticmVha31lbHNlIGlmKGIobixxKS50eXBlPT09ei5UX0RPVClrKys7ZWxzZSBpZihiKG4scSkudHlwZT09PXouVF9FTExJUFNJUylrKz0zO2Vsc2UgYnJlYWs7KytxO3N3aXRjaChiKG4scSkudHlwZSl7Y2FzZSB6LlRfU1RBUjpuPWIobixxKTticmVhaztjYXNlIHouVF9MUEFSOm49XG5iKG4scSsxKTtjKG4pO2JyZWFrO2Nhc2Ugci5pbXBvcnRfYXNfbmFtZXM6bj1iKG4scSk7cT1jKG4pO2lmKDA9PT1xJTIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ0cmFpbGluZyBjb21tYSBub3QgYWxsb3dlZCB3aXRob3V0IHN1cnJvdW5kaW5nIHBhcmVudGhlc2VzXCIsYS5jX2ZpbGVuYW1lLG4ubGluZW5vKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiVW5leHBlY3RlZCBub2RlLXR5cGUgaW4gZnJvbS1pbXBvcnRcIixhLmNfZmlsZW5hbWUsbi5saW5lbm8pO31xPVtdO2lmKG4udHlwZT09PXouVF9TVEFSKXFbMF09QihhLG4pO2Vsc2UgZm9yKHA9MDtwPGMobik7cCs9MilxW3AvMl09QihhLGIobixwKSk7YT11P3UubmFtZS52OlwiXCI7YT1uZXcgU2suYXN0bm9kZXMuSW1wb3J0RnJvbShsKGEpLHEsayxtLGQpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ1bmtub3duIGltcG9ydCBzdGF0ZW1lbnRcIixcbmEuY19maWxlbmFtZSxuLmxpbmVubyk7cmV0dXJuIGE7Y2FzZSByLmdsb2JhbF9zdG10OmE9ZDtkPVtdO2UoYSxyLmdsb2JhbF9zdG10KTtmb3Ioaz0xO2s8YyhhKTtrKz0yKWRbKGstMSkvMl09bChiKGEsaykudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuR2xvYmFsKGQsYS5saW5lbm8sYS5jb2xfb2Zmc2V0KTtjYXNlIHIubm9ubG9jYWxfc3RtdDpmKGEsZCxcIk5vdCBpbXBsZW1lbnRlZDogbm9ubG9jYWxcIik7YnJlYWs7Y2FzZSByLmFzc2VydF9zdG10OnJldHVybiBrPWQsZShrLHIuYXNzZXJ0X3N0bXQpLDI9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLkFzc2VydCh3KGEsYihrLDEpKSxudWxsLGsubGluZW5vLGsuY29sX29mZnNldCk6ND09PWMoayk/YT1uZXcgU2suYXN0bm9kZXMuQXNzZXJ0KHcoYSxiKGssMSkpLHcoYSxiKGssMykpLGsubGluZW5vLGsuY29sX29mZnNldCk6KFNrLmFzc2VydHMuZmFpbChcImltcHJvcGVyIG51bWJlciBvZiBwYXJ0cyB0byBhc3NlcnQgc3RtdFwiKSxcbmE9dm9pZCAwKSxhO2Nhc2Ugci5wcmludF9zdG10Oms9ZDtTay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uJiZmKGEsayxcIk1pc3NpbmcgcGFyZW50aGVzZXMgaW4gY2FsbCB0byAncHJpbnQnXCIpO249MTttPW51bGw7ZShrLHIucHJpbnRfc3RtdCk7Mjw9YyhrKSYmYihrLDEpLnR5cGU9PT16LlRfUklHSFRTSElGVCYmKG09dyhhLGIoaywyKSksbj00KTtkPVtdO2Zvcih1PTA7bjxjKGspO24rPTIsKyt1KWRbdV09dyhhLGIoayxuKSk7YT1iKGssYyhrKS0xKS50eXBlPT09ei5UX0NPTU1BPyExOiEwO3JldHVybiBuZXcgU2suYXN0bm9kZXMuUHJpbnQobSxkLGEsay5saW5lbm8say5jb2xfb2Zmc2V0KTtjYXNlIHIuZGVidWdnZXJfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkRlYnVnZ2VyKGQubGluZW5vLGQuY29sX29mZnNldCk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgc21hbGxfc3RtdFwiKX1lbHNlIHN3aXRjaChrPWIoZCwwKSxlKGQsci5jb21wb3VuZF9zdG10KSxcbmsudHlwZSl7Y2FzZSByLmlmX3N0bXQ6ZShrLHIuaWZfc3RtdCk7aWYoND09PWMoaykpYT1uZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoaywxKSksdChhLGIoaywzKSksW10say5saW5lbm8say5jb2xfb2Zmc2V0KTtlbHNlIGlmKGQ9YihrLDQpLnZhbHVlLmNoYXJBdCgyKSxcInNcIj09PWQpYT1uZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoaywxKSksdChhLGIoaywzKSksdChhLGIoayw2KSksay5saW5lbm8say5jb2xfb2Zmc2V0KTtlbHNlIGlmKFwiaVwiPT09ZCl7bT1jKGspLTQ7bj0hMTtkPVtdO2IoayxtKzEpLnR5cGU9PT16LlRfTkFNRSYmXCJzXCI9PT1iKGssbSsxKS52YWx1ZS5jaGFyQXQoMikmJihuPSEwLG0tPTMpO20vPTQ7biYmKGQ9W25ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLGMoayktNikpLHQoYSxiKGssYyhrKS00KSksdChhLGIoayxjKGspLTEpKSxiKGssYyhrKS02KS5saW5lbm8sYihrLGMoayktNikuY29sX29mZnNldCldLG0tLSk7Zm9yKHU9MDt1PG07Kyt1KW49NSs0KlxuKG0tdS0xKSxkPVtuZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoayxuKSksdChhLGIoayxuKzIpKSxkLGIoayxuKS5saW5lbm8sYihrLG4pLmNvbF9vZmZzZXQpXTthPW5ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxkLGsubGluZW5vLGsuY29sX29mZnNldCl9ZWxzZSBTay5hc3NlcnRzLmZhaWwoXCJ1bmV4cGVjdGVkIHRva2VuIGluICdpZicgc3RhdGVtZW50XCIpLGE9dm9pZCAwO3JldHVybiBhO2Nhc2Ugci53aGlsZV9zdG10OnJldHVybiBlKGssci53aGlsZV9zdG10KSw0PT09YyhrKT9hPW5ldyBTay5hc3Rub2Rlcy5XaGlsZSh3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxbXSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpOjc9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLldoaWxlKHcoYSxiKGssMSkpLHQoYSxiKGssMykpLHQoYSxiKGssNikpLGsubGluZW5vLGsuY29sX29mZnNldCk6KFNrLmFzc2VydHMuZmFpbChcIndyb25nIG51bWJlciBvZiB0b2tlbnMgZm9yICd3aGlsZScgc3RtdFwiKSxcbmE9dm9pZCAwKSxhO2Nhc2Ugci5mb3Jfc3RtdDpyZXR1cm4gZD1bXSxlKGssci5mb3Jfc3RtdCksOT09PWMoaykmJihkPXQoYSxiKGssOCkpKSxuPWIoaywxKSxtPXYoYSxuLFNrLmFzdG5vZGVzLlN0b3JlKSxtPTE9PT1jKG4pP21bMF06bmV3IFNrLmFzdG5vZGVzLlR1cGxlKG0sU2suYXN0bm9kZXMuU3RvcmUsay5saW5lbm8say5jb2xfb2Zmc2V0KSxuZXcgU2suYXN0bm9kZXMuRm9yKG0sVyhhLGIoaywzKSksdChhLGIoayw1KSksZCxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Nhc2Ugci50cnlfc3RtdDpkPVtdO3A9YyhrKTttPShwLTMpLzM7dT1bXTtxPW51bGw7ZShrLHIudHJ5X3N0bXQpO249dChhLGIoaywyKSk7aWYoYihrLHAtMykudHlwZT09PXouVF9OQU1FKVwiZmluYWxseVwiPT09YihrLHAtMykudmFsdWU/KDk8PXAmJmIoayxwLTYpLnR5cGU9PT16LlRfTkFNRSYmKHU9dChhLGIoayxwLTQpKSxtLS0pLHE9dChhLGIoayxwLTEpKSk6dT10KGEsYihrLHAtMSkpLG0tLTtlbHNlIGlmKGIoayxcbnAtMykudHlwZSE9PXIuZXhjZXB0X2NsYXVzZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm1hbGZvcm1lZCAndHJ5JyBzdGF0ZW1lbnRcIixhLmNfZmlsZW5hbWUsay5saW5lbm8pO2lmKDA8bSlmb3IocD0wO3A8bTtwKyspe3ZhciBBPXA7dmFyIHg9YSx5PWIoaywzKzMqcCksRD1iKGssNSszKnApO2UoeSxyLmV4Y2VwdF9jbGF1c2UpO2UoRCxyLnN1aXRlKTtpZigxPT09Yyh5KSl2YXIgRT1uZXcgU2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlcihudWxsLG51bGwsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCk7ZWxzZSAyPT09Yyh5KT9FPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKHcoeCxiKHksMSkpLG51bGwsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCk6ND09PWMoeSk/KFNrLl9fZnV0dXJlX18ucHl0aG9uMyYmXCIsXCI9PWIoeSwyKS52YWx1ZSYmZih4LHksXCJPbGQtc3R5bGUgJ2V4Y2VwdCcgY2xhdXNlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gM1wiKSxcbncoeCxiKHksMSkpLEU9dyh4LGIoeSwzKSksZyh4LEUsU2suYXN0bm9kZXMuU3RvcmUsYih5LDMpKSxFPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKHcoeCxiKHksMSkpLEUsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCkpOihTay5hc3NlcnRzLmZhaWwoXCJ3cm9uZyBudW1iZXIgb2YgY2hpbGRyZW4gZm9yIGV4Y2VwdCBjbGF1c2VcIiksRT12b2lkIDApO2RbQV09RX1Tay5hc3NlcnRzLmFzc2VydCghIXF8fDAhPWQubGVuZ3RoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlRyeShuLGQsdSxxLGsubGluZW5vLGsuY29sX29mZnNldCk7Y2FzZSByLndpdGhfc3RtdDpkPVtdO2UoayxyLndpdGhfc3RtdCk7Zm9yKG09MTttPGMoayktMjttKz0yKW49dm9pZCAwLHE9YSxwPWIoayxtKSxlKHAsci53aXRoX2l0ZW0pLHU9dyhxLGIocCwwKSksMz09YyhwKSYmKG49dyhxLGIocCwyKSksZyhxLG4sU2suYXN0bm9kZXMuU3RvcmUscCkpLG49bmV3IFNrLmFzdG5vZGVzLndpdGhpdGVtKHUsXG5uKSxkWyhtLTEpLzJdPW47YT10KGEsYihrLGMoayktMSkpO2E9bmV3IFNrLmFzdG5vZGVzLldpdGgoZCxhLGsubGluZW5vLGsuY29sX29mZnNldCk7cmV0dXJuIGE7Y2FzZSByLmZ1bmNkZWY6cmV0dXJuIFQoYSxrLFtdLCExKTtjYXNlIHIuY2xhc3NkZWY6cmV0dXJuIFAoYSxrLFtdKTtjYXNlIHIuZGVjb3JhdGVkOm09bnVsbDtlKGssci5kZWNvcmF0ZWQpO249YihrLDApO2UobixyLmRlY29yYXRvcnMpO2Q9W107Zm9yKHU9MDt1PGMobik7Kyt1KXtxPWQ7cD11O0E9YTtFPWIobix1KTtlKEUsci5kZWNvcmF0b3IpO2UoYihFLDApLHouVF9BVCk7ZShiKEUsYyhFKS0xKSx6LlRfTkVXTElORSk7dmFyIEMsRz1iKEUsMSk7ZShHLHIuZG90dGVkX25hbWUpO3g9Ry5saW5lbm87eT1HLmNvbF9vZmZzZXQ7RD1sKGIoRywwKS52YWx1ZSk7dmFyIE09bmV3IFNrLmFzdG5vZGVzLk5hbWUoRCxTay5hc3Rub2Rlcy5Mb2FkLHgseSk7Zm9yKEM9MjtDPGMoRyk7Qys9MilEPWwoYihHLEMpLnZhbHVlKSxcbk09bmV3IFNrLmFzdG5vZGVzLkF0dHJpYnV0ZShNLEQsU2suYXN0bm9kZXMuTG9hZCx4LHkpO3g9TTtBPTM9PT1jKEUpP3g6NT09PWMoRSk/bmV3IFNrLmFzdG5vZGVzLkNhbGwoeCxbXSxbXSxudWxsLG51bGwsRS5saW5lbm8sRS5jb2xfb2Zmc2V0KTpGKEEsYihFLDMpLHgpO3FbcF09QX1Tay5hc3NlcnRzLmFzc2VydChiKGssMSkudHlwZT09ci5mdW5jZGVmfHxiKGssMSkudHlwZT09ci5hc3luY19mdW5jZGVmfHxiKGssMSkudHlwZT09ci5jbGFzc2RlZik7YihrLDEpLnR5cGU9PXIuZnVuY2RlZj8obT1iKGssMSksbT1UKGEsbSxkLCExKSk6YihrLDEpLnR5cGU9PXIuY2xhc3NkZWY/bT1QKGEsYihrLDEpLGQpOmIoaywxKS50eXBlPT1yLmFzeW5jX2Z1bmNkZWYmJihtPWIoaywxKSxlKG0sci5hc3luY19mdW5jZGVmKSxlKGIobSwwKSx6LlRfTkFNRSksU2suYXNzZXJ0cy5hc3NlcnQoKFwiYXN5bmNcIj09PWIobSwwKSkudmFsdWUpLGUoYihtLDEpLHIuZnVuY2RlZiksbT1UKGEsbSxkLFxuITApKTttJiYobS5saW5lbm89ay5saW5lbm8sbS5jb2xfb2Zmc2V0PWsuY29sX29mZnNldCk7cmV0dXJuIG07Y2FzZSByLmFzeW5jX3N0bXQ6ZihhLGssXCJOb3QgaW1wbGVtZW50ZWQ6IGFzeW5jXCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5hc3NlcnQoXCJ1bmhhbmRsZWQgY29tcG91bmRfc3RtdFwiKX19dmFyIHI9U2suUGFyc2VUYWJsZXMuc3ltLHo9U2sudG9rZW4udG9rZW5zLFo9e1NsaWNlX2tpbmQ6MSxFeHRTbGljZV9raW5kOjIsSW5kZXhfa2luZDozfSxPPXt9O09bei5UX1ZCQVJdPVNrLmFzdG5vZGVzLkJpdE9yO09bei5UX0NJUkNVTUZMRVhdPVNrLmFzdG5vZGVzLkJpdFhvcjtPW3ouVF9BTVBFUl09U2suYXN0bm9kZXMuQml0QW5kO09bei5UX0xFRlRTSElGVF09U2suYXN0bm9kZXMuTFNoaWZ0O09bei5UX1JJR0hUU0hJRlRdPVNrLmFzdG5vZGVzLlJTaGlmdDtPW3ouVF9QTFVTXT1Tay5hc3Rub2Rlcy5BZGQ7T1t6LlRfTUlOVVNdPVNrLmFzdG5vZGVzLlN1YjtPW3ouVF9TVEFSXT1cblNrLmFzdG5vZGVzLk11bHQ7T1t6LlRfU0xBU0hdPVNrLmFzdG5vZGVzLkRpdjtPW3ouVF9ET1VCTEVTTEFTSF09U2suYXN0bm9kZXMuRmxvb3JEaXY7T1t6LlRfUEVSQ0VOVF09U2suYXN0bm9kZXMuTW9kO1NrLnNldHVwT3BlcmF0b3JzPWZ1bmN0aW9uKGEpe2E/T1t6LlRfQVRdPVNrLmFzdG5vZGVzLk1hdE11bHQ6T1t6LlRfQVRdJiZkZWxldGUgT1t6LlRfQVRdfTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cE9wZXJhdG9yc1wiLFNrLnNldHVwT3BlcmF0b3JzKTtjb25zdCBmYT0vX1tlRV18W2VFXV98XFwuX3xqXy8saGE9L19cXC58WystXV98XjBfXFxEfF9qLyxpYT0vXyg/PVteX10pL2c7U2suYXN0RnJvbVBhcnNlPWZ1bmN0aW9uKGQsZyxmKXt2YXIgayxuPW5ldyBhKFwidXRmLThcIixnLGYpLHA9W10sbD0wO3N3aXRjaChkLnR5cGUpe2Nhc2Ugci5maWxlX2lucHV0OmZvcihrPTA7azxjKGQpLTE7KytrKXt2YXIgbT1iKGQsayk7aWYoZC50eXBlIT09ei5UX05FV0xJTkUpaWYoZShtLHIuc3RtdCksXG5mPWgobSksMT09PWYpcFtsKytdPU4obixtKTtlbHNlIGZvcihtPWIobSwwKSxlKG0sci5zaW1wbGVfc3RtdCksZz0wO2c8ZjsrK2cpcFtsKytdPU4obixiKG0sMipnKSl9cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Nb2R1bGUocCk7Y2FzZSByLmV2YWxfaW5wdXQ6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIik7Y2FzZSByLnNpbmdsZV9pbnB1dDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvO1wiKTtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInRvZG87XCIpfX07U2suYXN0RHVtcD1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXt2YXIgYixjPVwiXCI7Zm9yKGI9MDtiPGE7KytiKWMrPVwiIFwiO3JldHVybiBjfSxjPWZ1bmN0aW9uKGEsZCl7dmFyIGU7aWYobnVsbD09PWEpcmV0dXJuIGQrXCJOb25lXCI7aWYoYS5wcm90b3R5cGUmJnZvaWQgMCE9PWEucHJvdG90eXBlLl9hc3RuYW1lJiZhLnByb3RvdHlwZS5faXNlbnVtKXJldHVybiBkK2EucHJvdG90eXBlLl9hc3RuYW1lK1wiKClcIjtpZih2b2lkIDAhPT1cbmEuX2FzdG5hbWUpe3ZhciBnPWIoYS5fYXN0bmFtZS5sZW5ndGgrMSk7dmFyIGY9W107Zm9yKGU9MDtlPGEuX2ZpZWxkcy5sZW5ndGg7ZSs9Mil7dmFyIGg9YS5fZmllbGRzW2VdO3ZhciBrPWEuX2ZpZWxkc1tlKzFdKGEpO3ZhciBuPWIoaC5sZW5ndGgrMSk7Zi5wdXNoKFtoLGMoayxkK2crbildKX1rPVtdO2ZvcihlPTA7ZTxmLmxlbmd0aDsrK2Upbj1mW2VdLGsucHVzaChuWzBdK1wiPVwiK25bMV0ucmVwbGFjZSgvXlxccysvLFwiXCIpKTtlPWsuam9pbihcIixcXG5cIitkK2cpO3JldHVybiBkK2EuX2FzdG5hbWUrXCIoXCIrZStcIilcIn1pZihTay5pc0FycmF5TGlrZShhKSl7Zz1bXTtmb3IoZT0wO2U8YS5sZW5ndGg7KytlKWY9YVtlXSxnLnB1c2goYyhmLGQrXCIgXCIpKTthPWcuam9pbihcIixcXG5cIik7cmV0dXJuIGQrXCJbXCIrYS5yZXBsYWNlKC9eXFxzKy8sXCJcIikrXCJdXCJ9YT0hMD09PWE/XCJUcnVlXCI6ITE9PT1hP1wiRmFsc2VcIjphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmc/YS50cCRzdHIoKS52OmEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zdHI/YS4kcigpLnY6XCJcIithO3JldHVybiBkK2F9O3JldHVybiBjKGEsXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFzdEZyb21QYXJzZVwiLFNrLmFzdEZyb21QYXJzZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYXN0RHVtcFwiLFNrLmFzdER1bXApfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMuX19uYW1lPWE7dGhpcy5fX2ZsYWdzPWI7dGhpcy5fX3Njb3BlPWI+PjExJjc7dGhpcy5fX25hbWVzcGFjZXM9Y3x8W119ZnVuY3Rpb24gYyhhLGIsYyxlLGYpe3RoaXMuc3ltRmxhZ3M9e307dGhpcy5uYW1lPWI7dGhpcy52YXJuYW1lcz1bXTt0aGlzLmNoaWxkcmVuPVtdO3RoaXMuYmxvY2tUeXBlPWM7dGhpcy5yZXR1cm5zVmFsdWU9dGhpcy52YXJrZXl3b3Jkcz10aGlzLnZhcmFyZ3M9dGhpcy5nZW5lcmF0b3I9dGhpcy5jaGlsZEhhc0ZyZWU9dGhpcy5oYXNGcmVlPXRoaXMuaXNOZXN0ZWQ9ITE7dGhpcy5saW5lbm89Zjt0aGlzLnRhYmxlPWE7YS5jdXImJlxuKGEuY3VyLm5lc3RlZHx8XCJmdW5jdGlvblwiPT09YS5jdXIuYmxvY2tUeXBlKSYmKHRoaXMuaXNOZXN0ZWQ9ITApO2Uuc2NvcGVJZD1sKys7YS5zdHNzW2Uuc2NvcGVJZF09dGhpczt0aGlzLnN5bWJvbHM9e319ZnVuY3Rpb24gYihhKXt0aGlzLmZpbGVuYW1lPWE7dGhpcy50b3A9dGhpcy5jdXI9bnVsbDt0aGlzLnN0YWNrPVtdO3RoaXMuY3VyQ2xhc3M9dGhpcy5nbG9iYWw9bnVsbDt0aGlzLnRtcG5hbWU9MDt0aGlzLnN0c3M9e319ZnVuY3Rpb24gZShhLGIpe3ZhciBjO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYShiW2NdKX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjIGluIGIpYVtjXT1iW2NdfVNrLmV4cG9ydFN5bWJvbChcIlNrLlNZTVRBQl9DT05TVFNcIix7REVGX0dMT0JBTDoxLERFRl9MT0NBTDoyLERFRl9QQVJBTTo0LFVTRTo4LERFRl9TVEFSOjE2LERFRl9ET1VCTEVTVEFSOjMyLERFRl9JTlRVUExFOjY0LERFRl9GUkVFOjEyOCxERUZfRlJFRV9HTE9CQUw6MjU2LERFRl9GUkVFX0NMQVNTOjUxMixcbkRFRl9JTVBPUlQ6MTAyNCxERUZfQk9VTkQ6MTAzMCxTQ09QRV9PRkY6MTEsU0NPUEVfTUFTSzo3LExPQ0FMOjEsR0xPQkFMX0VYUExJQ0lUOjIsR0xPQkFMX0lNUExJQ0lUOjMsRlJFRTo0LENFTEw6NSxPUFRfSU1QT1JUX1NUQVI6MSxPUFRfRVhFQzoyLE9QVF9CQVJFX0VYRUM6NCxPUFRfVE9QTEVWRUw6OCxHRU5FUkFUT1I6MixHRU5FUkFUT1JfRVhQUkVTU0lPTjoyLE1vZHVsZUJsb2NrOlwibW9kdWxlXCIsRnVuY3Rpb25CbG9jazpcImZ1bmN0aW9uXCIsQ2xhc3NCbG9jazpcImNsYXNzXCJ9KTthLnByb3RvdHlwZS5nZXRfbmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZX07YS5wcm90b3R5cGUuaXNfcmVmZXJlbmNlZD1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMuX19mbGFncyY4KX07YS5wcm90b3R5cGUuaXNfcGFyYW1ldGVyPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjQpfTthLnByb3RvdHlwZS5pc19nbG9iYWw9ZnVuY3Rpb24oKXtyZXR1cm4gMz09PXRoaXMuX19zY29wZXx8XG4yPT10aGlzLl9fc2NvcGV9O2EucHJvdG90eXBlLmlzX2RlY2xhcmVkX2dsb2JhbD1mdW5jdGlvbigpe3JldHVybiAyPT10aGlzLl9fc2NvcGV9O2EucHJvdG90eXBlLmlzX2xvY2FsPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjEwMzApfTthLnByb3RvdHlwZS5pc19mcmVlPWZ1bmN0aW9uKCl7cmV0dXJuIDQ9PXRoaXMuX19zY29wZX07YS5wcm90b3R5cGUuaXNfaW1wb3J0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmMTAyNCl9O2EucHJvdG90eXBlLmlzX2Fzc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjIpfTthLnByb3RvdHlwZS5pc19uYW1lc3BhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX25hbWVzcGFjZXMmJjA8dGhpcy5fX25hbWVzcGFjZXMubGVuZ3RofTthLnByb3RvdHlwZS5nZXRfbmFtZXNwYWNlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZXNwYWNlc307dmFyIGw9MDtjLnByb3RvdHlwZS5nZXRfdHlwZT1cbmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmxvY2tUeXBlfTtjLnByb3RvdHlwZS5nZXRfbmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9O2MucHJvdG90eXBlLmdldF9saW5lbm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saW5lbm99O2MucHJvdG90eXBlLmlzX25lc3RlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmVzdGVkfTtjLnByb3RvdHlwZS5oYXNfY2hpbGRyZW49ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmNoaWxkcmVuLmxlbmd0aH07Yy5wcm90b3R5cGUuZ2V0X2lkZW50aWZpZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKCl7cmV0dXJuITB9KX07Yy5wcm90b3R5cGUubG9va3VwPWZ1bmN0aW9uKGIpe2lmKHRoaXMuc3ltYm9scy5oYXNPd25Qcm9wZXJ0eShiKSliPXRoaXMuc3ltYm9sc1tiXTtlbHNle3ZhciBjPXRoaXMuc3ltRmxhZ3NbYl07dmFyIGU9dGhpcy5fX2NoZWNrX2NoaWxkcmVuKGIpO2I9dGhpcy5zeW1ib2xzW2JdPVxubmV3IGEoYixjLGUpfXJldHVybiBifTtjLnByb3RvdHlwZS5fX2NoZWNrX2NoaWxkcmVuPWZ1bmN0aW9uKGEpe3ZhciBiLGM9W107Zm9yKGI9MDtiPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysrYil7dmFyIGU9dGhpcy5jaGlsZHJlbltiXTtlLm5hbWU9PT1hJiZjLnB1c2goZSl9cmV0dXJuIGN9O2MucHJvdG90eXBlLl9pZGVudHNNYXRjaGluZz1mdW5jdGlvbihhKXt2YXIgYixjPVtdO2ZvcihiIGluIHRoaXMuc3ltRmxhZ3MpdGhpcy5zeW1GbGFncy5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLnN5bUZsYWdzW2JdKSYmYy5wdXNoKGIpO2Muc29ydCgpO3JldHVybiBjfTtjLnByb3RvdHlwZS5nZXRfcGFyYW1ldGVycz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X3BhcmFtZXRlcnMgb25seSB2YWxpZCBmb3IgZnVuY3Rpb24gc2NvcGVzXCIpO3RoaXMuX2Z1bmNQYXJhbXN8fCh0aGlzLl9mdW5jUGFyYW1zPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe3JldHVybiBhJlxuNH0pKTtyZXR1cm4gdGhpcy5fZnVuY1BhcmFtc307Yy5wcm90b3R5cGUuZ2V0X2xvY2Fscz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X2xvY2FscyBvbmx5IHZhbGlkIGZvciBmdW5jdGlvbiBzY29wZXNcIik7dGhpcy5fZnVuY0xvY2Fsc3x8KHRoaXMuX2Z1bmNMb2NhbHM9dGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oYSl7cmV0dXJuIGEmMTAzMH0pKTtyZXR1cm4gdGhpcy5fZnVuY0xvY2Fsc307Yy5wcm90b3R5cGUuZ2V0X2dsb2JhbHM9ZnVuY3Rpb24oKXtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9nbG9iYWxzIG9ubHkgdmFsaWQgZm9yIGZ1bmN0aW9uIHNjb3Blc1wiKTt0aGlzLl9mdW5jR2xvYmFsc3x8KHRoaXMuX2Z1bmNHbG9iYWxzPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe2E9YT4+MTEmNztyZXR1cm4gMz09YXx8Mj09YX0pKTtyZXR1cm4gdGhpcy5fZnVuY0dsb2JhbHN9O1xuYy5wcm90b3R5cGUuZ2V0X2ZyZWVzPWZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT10aGlzLmdldF90eXBlKCksXCJnZXRfZnJlZXMgb25seSB2YWxpZCBmb3IgZnVuY3Rpb24gc2NvcGVzXCIpO3RoaXMuX2Z1bmNGcmVlc3x8KHRoaXMuX2Z1bmNGcmVlcz10aGlzLl9pZGVudHNNYXRjaGluZyhmdW5jdGlvbihhKXtyZXR1cm4gND09KGE+PjExJjcpfSkpO3JldHVybiB0aGlzLl9mdW5jRnJlZXN9O2MucHJvdG90eXBlLmdldF9tZXRob2RzPWZ1bmN0aW9uKCl7dmFyIGE7U2suYXNzZXJ0cy5hc3NlcnQoXCJjbGFzc1wiPT10aGlzLmdldF90eXBlKCksXCJnZXRfbWV0aG9kcyBvbmx5IHZhbGlkIGZvciBjbGFzcyBzY29wZXNcIik7aWYoIXRoaXMuX2NsYXNzTWV0aG9kcyl7dmFyIGI9W107Zm9yKGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysrYSliLnB1c2godGhpcy5jaGlsZHJlblthXS5uYW1lKTtiLnNvcnQoKTt0aGlzLl9jbGFzc01ldGhvZHM9Yn1yZXR1cm4gdGhpcy5fY2xhc3NNZXRob2RzfTtcbmMucHJvdG90eXBlLmdldFNjb3BlPWZ1bmN0aW9uKGEpe2E9dGhpcy5zeW1GbGFnc1thXTtyZXR1cm4gdm9pZCAwPT09YT8wOmE+PjExJjd9O2IucHJvdG90eXBlLmdldFN0c0ZvckFzdD1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLnNjb3BlSWQsXCJhc3Qgd2Fzbid0IGFkZGVkIHRvIHN0P1wiKTthPXRoaXMuc3Rzc1thLnNjb3BlSWRdO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJ1bmtub3duIHN5bSB0YWIgZW50cnlcIik7cmV0dXJuIGF9O2IucHJvdG90eXBlLlNFUVN0bXQ9ZnVuY3Rpb24oYSl7dmFyIGIsYztpZihudWxsIT09YSl7U2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoYSksXCJTRVE6IG5vZGVzIGlzbid0IGFycmF5PyBnb3QgXCIrYS50b1N0cmluZygpKTt2YXIgZT1hLmxlbmd0aDtmb3IoYz0wO2M8ZTsrK2MpKGI9YVtjXSkmJnRoaXMudmlzaXRTdG10KGIpfX07Yi5wcm90b3R5cGUuU0VRRXhwcj1mdW5jdGlvbihhKXt2YXIgYixcbmM7aWYobnVsbCE9PWEpe1NrLmFzc2VydHMuYXNzZXJ0KFNrLmlzQXJyYXlMaWtlKGEpLFwiU0VROiBub2RlcyBpc24ndCBhcnJheT8gZ290IFwiK2EudG9TdHJpbmcoKSk7dmFyIGU9YS5sZW5ndGg7Zm9yKGM9MDtjPGU7KytjKShiPWFbY10pJiZ0aGlzLnZpc2l0RXhwcihiKX19O2IucHJvdG90eXBlLmVudGVyQmxvY2s9ZnVuY3Rpb24oYSxiLGUsZil7YT1Tay5maXhSZXNlcnZlZChhKTt2YXIgZD1udWxsO3RoaXMuY3VyJiYoZD10aGlzLmN1cix0aGlzLnN0YWNrLnB1c2godGhpcy5jdXIpKTt0aGlzLmN1cj1uZXcgYyh0aGlzLGEsYixlLGYpO1widG9wXCI9PT1hJiYodGhpcy5nbG9iYWw9dGhpcy5jdXIuc3ltRmxhZ3MpO2QmJmQuY2hpbGRyZW4ucHVzaCh0aGlzLmN1cil9O2IucHJvdG90eXBlLmV4aXRCbG9jaz1mdW5jdGlvbigpe3RoaXMuY3VyPW51bGw7MDx0aGlzLnN0YWNrLmxlbmd0aCYmKHRoaXMuY3VyPXRoaXMuc3RhY2sucG9wKCkpfTtiLnByb3RvdHlwZS52aXNpdFBhcmFtcz1cbmZ1bmN0aW9uKGEsYil7dmFyIGM7Zm9yKGM9MDtjPGEubGVuZ3RoOysrYylpZihiPWFbY10sYi5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLmFyZyl0aGlzLmFkZERlZihiLmFyZyw0LGIubGluZW5vKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBleHByZXNzaW9uIGluIHBhcmFtZXRlciBsaXN0XCIsdGhpcy5maWxlbmFtZSk7fTtiLnByb3RvdHlwZS52aXNpdEFyZ3VtZW50cz1mdW5jdGlvbihhLGIpe2EuYXJncyYmdGhpcy52aXNpdFBhcmFtcyhhLmFyZ3MsITApO2Eua3dvbmx5YXJncyYmdGhpcy52aXNpdFBhcmFtcyhhLmt3b25seWFyZ3MsITApO2EudmFyYXJnJiYodGhpcy5hZGREZWYoYS52YXJhcmcuYXJnLDQsYiksdGhpcy5jdXIudmFyYXJncz0hMCk7YS5rd2FyZyYmKHRoaXMuYWRkRGVmKGEua3dhcmcuYXJnLDQsYiksdGhpcy5jdXIudmFya2V5d29yZHM9ITApfTtiLnByb3RvdHlwZS5uZXdUbXBuYW1lPWZ1bmN0aW9uKGEpe3RoaXMuYWRkRGVmKG5ldyBTay5idWlsdGluLnN0cihcIl9bXCIrXG4rK3RoaXMudG1wbmFtZStcIl1cIiksMixhKX07Yi5wcm90b3R5cGUuYWRkRGVmPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1Tay5tYW5nbGVOYW1lKHRoaXMuY3VyQ2xhc3MsYSkudjtkPVNrLmZpeFJlc2VydmVkKGQpO3ZhciBlPXRoaXMuY3VyLnN5bUZsYWdzW2RdO2lmKHZvaWQgMCE9PWUpe2lmKGImNCYmZSY0KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiZHVwbGljYXRlIGFyZ3VtZW50ICdcIithLnYrXCInIGluIGZ1bmN0aW9uIGRlZmluaXRpb25cIix0aGlzLmZpbGVuYW1lLGMpO2V8PWJ9ZWxzZSBlPWI7dGhpcy5jdXIuc3ltRmxhZ3NbZF09ZTtiJjQ/dGhpcy5jdXIudmFybmFtZXMucHVzaChkKTpiJjEmJihlPWIsYT10aGlzLmdsb2JhbFtkXSx2b2lkIDAhPT1hJiYoZXw9YSksdGhpcy5nbG9iYWxbZF09ZSl9O2IucHJvdG90eXBlLnZpc2l0U2xpY2U9ZnVuY3Rpb24oYSl7dmFyIGI7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuU2xpY2U6YS5sb3dlciYmXG50aGlzLnZpc2l0RXhwcihhLmxvd2VyKTthLnVwcGVyJiZ0aGlzLnZpc2l0RXhwcihhLnVwcGVyKTthLnN0ZXAmJnRoaXMudmlzaXRFeHByKGEuc3RlcCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5FeHRTbGljZTpmb3IoYj0wO2I8YS5kaW1zLmxlbmd0aDsrK2IpdGhpcy52aXNpdFNsaWNlKGEuZGltc1tiXSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5JbmRleDp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKX19O2IucHJvdG90eXBlLnZpc2l0U3RtdD1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwidmlzaXRTdG10IGNhbGxlZCB3aXRoIHVuZGVmaW5lZFwiKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZjp0aGlzLmFkZERlZihhLm5hbWUsMixhLmxpbmVubyk7YS5hcmdzLmRlZmF1bHRzJiZ0aGlzLlNFUUV4cHIoYS5hcmdzLmRlZmF1bHRzKTthLmRlY29yYXRvcl9saXN0JiZ0aGlzLlNFUUV4cHIoYS5kZWNvcmF0b3JfbGlzdCk7XG50aGlzLmVudGVyQmxvY2soYS5uYW1lLnYsXCJmdW5jdGlvblwiLGEsYS5saW5lbm8pO3RoaXMudmlzaXRBcmd1bWVudHMoYS5hcmdzLGEubGluZW5vKTt0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ2xhc3NEZWY6dGhpcy5hZGREZWYoYS5uYW1lLDIsYS5saW5lbm8pO3RoaXMuU0VRRXhwcihhLmJhc2VzKTthLmRlY29yYXRvcl9saXN0JiZ0aGlzLlNFUUV4cHIoYS5kZWNvcmF0b3JfbGlzdCk7dGhpcy5lbnRlckJsb2NrKGEubmFtZS52LFwiY2xhc3NcIixhLGEubGluZW5vKTt0aGlzLmN1ckNsYXNzPWEubmFtZTt0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmV0dXJuOmlmKGEudmFsdWUmJih0aGlzLnZpc2l0RXhwcihhLnZhbHVlKSx0aGlzLmN1ci5yZXR1cm5zVmFsdWU9ITAsdGhpcy5jdXIuZ2VuZXJhdG9yKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidyZXR1cm4nIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvclwiLFxudGhpcy5maWxlbmFtZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWxldGU6dGhpcy5TRVFFeHByKGEudGFyZ2V0cyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NpZ246dGhpcy5TRVFFeHByKGEudGFyZ2V0cyk7dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bbm5Bc3NpZ246aWYoYS50YXJnZXQuY29uc3RydWN0b3I9PVNrLmFzdG5vZGVzLk5hbWUpe3ZhciBjPWEudGFyZ2V0O3ZhciBmPVNrLm1hbmdsZU5hbWUodGhpcy5jdXJDbGFzcyxjLmlkKS52O2Y9U2suZml4UmVzZXJ2ZWQoZik7Yz10aGlzLmN1ci5zeW1GbGFnc1tmXTtpZihjJjIwNDkmJnRoaXMuZ2xvYmFsIT10aGlzLmN1ci5zeW1GbGFncyYmYS5zaW1wbGUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhbm5vdGF0ZWQgbmFtZSAnXCIrZitcIicgY2FuJ3QgYmUgZ2xvYmFsXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YS5zaW1wbGU/dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLFxuNDA5OCxhLmxpbmVubyk6YS52YWx1ZSYmdGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLDIsYS5saW5lbm8pfWVsc2UgdGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEuYW5ub3RhdGlvbik7YS52YWx1ZSYmdGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5BdWdBc3NpZ246dGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUHJpbnQ6YS5kZXN0JiZ0aGlzLnZpc2l0RXhwcihhLmRlc3QpO3RoaXMuU0VRRXhwcihhLnZhbHVlcyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3I6dGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEuaXRlcik7dGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5XaGlsZTp0aGlzLnZpc2l0RXhwcihhLnRlc3QpO1xudGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5JZjp0aGlzLnZpc2l0RXhwcihhLnRlc3QpO3RoaXMuU0VRU3RtdChhLmJvZHkpO2Eub3JlbHNlJiZ0aGlzLlNFUVN0bXQoYS5vcmVsc2UpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmFpc2U6YS5leGMmJih0aGlzLnZpc2l0RXhwcihhLmV4YyksYS5pbnN0JiYodGhpcy52aXNpdEV4cHIoYS5pbnN0KSxhLnRiYWNrJiZ0aGlzLnZpc2l0RXhwcihhLnRiYWNrKSksYS5jYXVzZSYmdGhpcy52aXNpdEV4cHIoYS5jYXVzZSkpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXNzZXJ0OnRoaXMudmlzaXRFeHByKGEudGVzdCk7YS5tc2cmJnRoaXMudmlzaXRFeHByKGEubXNnKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkltcG9ydDpjYXNlIFNrLmFzdG5vZGVzLkltcG9ydEZyb206dGhpcy52aXNpdEFsaWFzKGEubmFtZXMsYS5saW5lbm8pO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuR2xvYmFsOnZhciBrPVxuYS5uYW1lcy5sZW5ndGg7Zm9yKGI9MDtiPGs7KytiKXtmPVNrLm1hbmdsZU5hbWUodGhpcy5jdXJDbGFzcyxhLm5hbWVzW2JdKS52O2Y9U2suZml4UmVzZXJ2ZWQoZik7Yz10aGlzLmN1ci5zeW1GbGFnc1tmXTtpZihjJjEwKXtpZihjJjIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lICdcIitmK1wiJyBpcyBhc3NpZ25lZCB0byBiZWZvcmUgZ2xvYmFsIGRlY2xhcmF0aW9uXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lICdcIitmK1wiJyBpcyB1c2VkIHByaW9yIHRvIGdsb2JhbCBkZWNsYXJhdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO310aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoZiksMSxhLmxpbmVubyl9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5FeHByOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFzczpjYXNlIFNrLmFzdG5vZGVzLkJyZWFrOmNhc2UgU2suYXN0bm9kZXMuQ29udGludWU6Y2FzZSBTay5hc3Rub2Rlcy5EZWJ1Z2dlcjpicmVhaztcbmNhc2UgU2suYXN0bm9kZXMuV2l0aDplKHRoaXMudmlzaXRfd2l0aGl0ZW0uYmluZCh0aGlzKSxhLml0ZW1zKTtlKHRoaXMudmlzaXRTdG10LmJpbmQodGhpcyksYS5ib2R5KTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlRyeTp0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLnZpc2l0RXhjZXB0aGFuZGxlcnMoYS5oYW5kbGVycyk7dGhpcy5TRVFTdG10KGEub3JlbHNlKTt0aGlzLlNFUVN0bXQoYS5maW5hbGJvZHkpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiVW5oYW5kbGVkIHR5cGUgXCIrYS5jb25zdHJ1Y3Rvci5uYW1lK1wiIGluIHZpc2l0U3RtdFwiKX19O2IucHJvdG90eXBlLnZpc2l0X3dpdGhpdGVtPWZ1bmN0aW9uKGEpe3RoaXMudmlzaXRFeHByKGEuY29udGV4dF9leHByKTthLm9wdGlvbmFsX3ZhcnMmJnRoaXMudmlzaXRFeHByKGEub3B0aW9uYWxfdmFycyl9O2IucHJvdG90eXBlLnZpc2l0RXhwcj1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1cbmEsXCJ2aXNpdEV4cHIgY2FsbGVkIHdpdGggdW5kZWZpbmVkXCIpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDp0aGlzLlNFUUV4cHIoYS52YWx1ZXMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQmluT3A6dGhpcy52aXNpdEV4cHIoYS5sZWZ0KTt0aGlzLnZpc2l0RXhwcihhLnJpZ2h0KTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlVuYXJ5T3A6dGhpcy52aXNpdEV4cHIoYS5vcGVyYW5kKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxhbWJkYTp0aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoXCJsYW1iZGFcIiksMixhLmxpbmVubyk7YS5hcmdzLmRlZmF1bHRzJiZ0aGlzLlNFUUV4cHIoYS5hcmdzLmRlZmF1bHRzKTt0aGlzLmVudGVyQmxvY2soXCJsYW1iZGFcIixcImZ1bmN0aW9uXCIsYSxhLmxpbmVubyk7dGhpcy52aXNpdEFyZ3VtZW50cyhhLmFyZ3MsYS5saW5lbm8pO3RoaXMudmlzaXRFeHByKGEuYm9keSk7dGhpcy5leGl0QmxvY2soKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmRXhwOnRoaXMudmlzaXRFeHByKGEudGVzdCk7XG50aGlzLnZpc2l0RXhwcihhLmJvZHkpO3RoaXMudmlzaXRFeHByKGEub3JlbHNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3Q6dGhpcy5TRVFFeHByKGEua2V5cyk7dGhpcy5TRVFFeHByKGEudmFsdWVzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3RDb21wOmNhc2UgU2suYXN0bm9kZXMuU2V0Q29tcDp0aGlzLnZpc2l0Q29tcHJlaGVuc2lvbihhLmdlbmVyYXRvcnMsMCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0Q29tcDp0aGlzLm5ld1RtcG5hbWUoYS5saW5lbm8pO3RoaXMudmlzaXRFeHByKGEuZWx0KTt0aGlzLnZpc2l0Q29tcHJlaGVuc2lvbihhLmdlbmVyYXRvcnMsMCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA6dGhpcy52aXNpdEdlbmV4cChhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLllpZWxkOmEudmFsdWUmJnRoaXMudmlzaXRFeHByKGEudmFsdWUpO3RoaXMuY3VyLmdlbmVyYXRvcj0hMDtpZih0aGlzLmN1ci5yZXR1cm5zVmFsdWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCIncmV0dXJuJyB3aXRoIGFyZ3VtZW50IGluc2lkZSBnZW5lcmF0b3JcIixcbnRoaXMuZmlsZW5hbWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ29tcGFyZTp0aGlzLnZpc2l0RXhwcihhLmxlZnQpO3RoaXMuU0VRRXhwcihhLmNvbXBhcmF0b3JzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNhbGw6dGhpcy52aXNpdEV4cHIoYS5mdW5jKTtpZihhLmFyZ3MpZm9yKGxldCBiIG9mIGEuYXJncyliLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZD90aGlzLnZpc2l0RXhwcihiLnZhbHVlKTp0aGlzLnZpc2l0RXhwcihiKTtpZihhLmtleXdvcmRzKWZvcihsZXQgYiBvZiBhLmtleXdvcmRzKXRoaXMudmlzaXRFeHByKGIudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTnVtOmNhc2UgU2suYXN0bm9kZXMuU3RyOmNhc2UgU2suYXN0bm9kZXMuQnl0ZXM6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Kb2luZWRTdHI6Zm9yKGxldCBiIG9mIGEudmFsdWVzKXRoaXMudmlzaXRFeHByKGIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWU6dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7XG5hLmZvcm1hdF9zcGVjJiZ0aGlzLnZpc2l0RXhwcihhLmZvcm1hdF9zcGVjKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTt0aGlzLnZpc2l0U2xpY2UoYS5zbGljZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnRoaXMuYWRkRGVmKGEuaWQsYS5jdHg9PT1Tay5hc3Rub2Rlcy5Mb2FkPzg6MixhLmxpbmVubyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0OmNhc2UgU2suYXN0bm9kZXMuVHVwbGU6Y2FzZSBTay5hc3Rub2Rlcy5TZXQ6dGhpcy5TRVFFeHByKGEuZWx0cyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdGFycmVkOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiVW5oYW5kbGVkIHR5cGUgXCIrYS5jb25zdHJ1Y3Rvci5uYW1lK1xuXCIgaW4gdmlzaXRFeHByXCIpfX07Yi5wcm90b3R5cGUudmlzaXRDb21wcmVoZW5zaW9uPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1hLmxlbmd0aDtmb3IoYz1iO2M8ZDsrK2MpYj1hW2NdLHRoaXMudmlzaXRFeHByKGIudGFyZ2V0KSx0aGlzLnZpc2l0RXhwcihiLml0ZXIpLHRoaXMuU0VRRXhwcihiLmlmcyl9O2IucHJvdG90eXBlLnZpc2l0QWxpYXM9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2ZvcihkPTA7ZDxhLmxlbmd0aDsrK2Qpe3ZhciBlPWFbZF07dmFyIGY9Yz1udWxsPT09ZS5hc25hbWU/ZS5uYW1lLnY6ZS5hc25hbWUudjtlPWMuaW5kZXhPZihcIi5cIik7LTEhPT1lJiYoZj1jLnN1YnN0cigwLGUpKTtpZihcIipcIiE9PWMpdGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLDEwMjQsYik7ZWxzZSBpZihcIm1vZHVsZVwiIT09dGhpcy5jdXIuYmxvY2tUeXBlKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW1wb3J0ICogb25seSBhbGxvd2VkIGF0IG1vZHVsZSBsZXZlbFwiLFxudGhpcy5maWxlbmFtZSk7fX07Yi5wcm90b3R5cGUudmlzaXRHZW5leHA9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZW5lcmF0b3JzWzBdO3RoaXMudmlzaXRFeHByKGIuaXRlcik7dGhpcy5lbnRlckJsb2NrKFwiZ2VuZXhwclwiLFwiZnVuY3Rpb25cIixhLGEubGluZW5vKTt0aGlzLmN1ci5nZW5lcmF0b3I9ITA7dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKFwiLjBcIiksNCxhLmxpbmVubyk7dGhpcy52aXNpdEV4cHIoYi50YXJnZXQpO3RoaXMuU0VRRXhwcihiLmlmcyk7dGhpcy52aXNpdENvbXByZWhlbnNpb24oYS5nZW5lcmF0b3JzLDEpO3RoaXMudmlzaXRFeHByKGEuZWx0KTt0aGlzLmV4aXRCbG9jaygpfTtiLnByb3RvdHlwZS52aXNpdEV4Y2VwdGhhbmRsZXJzPWZ1bmN0aW9uKGEpe3ZhciBiLGM7Zm9yKGI9MDtjPWFbYl07KytiKWMudHlwZSYmdGhpcy52aXNpdEV4cHIoYy50eXBlKSxjLm5hbWUmJnRoaXMudmlzaXRFeHByKGMubmFtZSksdGhpcy5TRVFTdG10KGMuYm9keSl9O2IucHJvdG90eXBlLmFuYWx5emVCbG9jaz1cbmZ1bmN0aW9uKGEsYixjLGUpe3ZhciBkPXt9O3ZhciBnPXt9LGg9e30sbj17fSxsPXt9O1wiY2xhc3NcIj09YS5ibG9ja1R5cGUmJihmKGgsZSksYiYmZihuLGIpKTtmb3IocSBpbiBhLnN5bUZsYWdzKXt2YXIgbT1hLnN5bUZsYWdzW3FdO3RoaXMuYW5hbHl6ZU5hbWUoYSxnLHEsbSxiLGQsYyxlKX1cImNsYXNzXCIhPT1hLmJsb2NrVHlwZSYmKFwiZnVuY3Rpb25cIj09PWEuYmxvY2tUeXBlJiZmKG4sZCksYiYmZihuLGIpLGYoaCxlKSk7ZD17fTt2YXIgcT1hLmNoaWxkcmVuLmxlbmd0aDtmb3IobT0wO208cTsrK20paWYoZT1hLmNoaWxkcmVuW21dLHRoaXMuYW5hbHl6ZUNoaWxkQmxvY2soZSxuLGwsaCxkKSxlLmhhc0ZyZWV8fGUuY2hpbGRIYXNGcmVlKWEuY2hpbGRIYXNGcmVlPSEwO2YobCxkKTtcImZ1bmN0aW9uXCI9PT1hLmJsb2NrVHlwZSYmdGhpcy5hbmFseXplQ2VsbHMoZyxsKTtiPXRoaXMudXBkYXRlU3ltYm9scyhhLnN5bUZsYWdzLGcsYixsLFwiY2xhc3NcIj09PWEuYmxvY2tUeXBlKTtcbmEuaGFzRnJlZT1hLmhhc0ZyZWV8fGI7ZihjLGwpfTtiLnByb3RvdHlwZS5hbmFseXplQ2hpbGRCbG9jaz1mdW5jdGlvbihhLGIsYyxlLGspe3ZhciBkPXt9O2YoZCxiKTtiPXt9O2YoYixjKTtjPXt9O2YoYyxlKTt0aGlzLmFuYWx5emVCbG9jayhhLGQsYixjKTtmKGssYil9O2IucHJvdG90eXBlLmFuYWx5emVDZWxscz1mdW5jdGlvbihhLGIpe3ZhciBjO2ZvcihjIGluIGEpe3ZhciBkPWFbY107MT09PWQmJnZvaWQgMCE9PWJbY10mJihhW2NdPTUsZGVsZXRlIGJbY10pfX07Yi5wcm90b3R5cGUudXBkYXRlU3ltYm9scz1mdW5jdGlvbihhLGIsYyxlLGYpe3ZhciBkLGc9ITE7Zm9yKGQgaW4gYSl7dmFyIGs9YVtkXTt2YXIgaD1iW2RdO2t8PWg8PDExO2FbZF09a31mb3IoZCBpbiBlKWI9YVtkXSx2b2lkIDAhPT1iP2YmJmImMTAzMSYmKGJ8PTUxMixhW2RdPWIpOnZvaWQgMCE9PWNbZF0mJihhW2RdPTgxOTIsZz0hMCk7cmV0dXJuIGd9O2IucHJvdG90eXBlLmFuYWx5emVOYW1lPWZ1bmN0aW9uKGEsXG5iLGMsZSxmLHAsbCxtKXtpZihlJjEpe2lmKGUmNCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm5hbWUgJ1wiK2MrXCInIGlzIGxvY2FsIGFuZCBnbG9iYWxcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtiW2NdPTI7bVtjXT1udWxsO2YmJnZvaWQgMCE9PWZbY10mJmRlbGV0ZSBmW2NdfWVsc2UgZSYxMDMwPyhiW2NdPTEscFtjXT1udWxsLGRlbGV0ZSBtW2NdKTpmJiZ2b2lkIDAhPT1mW2NdPyhiW2NdPTQsYS5oYXNGcmVlPSEwLGxbY109bnVsbCk6KG0mJnZvaWQgMCE9PW1bY118fCFhLmlzTmVzdGVkfHwoYS5oYXNGcmVlPSEwKSxiW2NdPTMpfTtiLnByb3RvdHlwZS5hbmFseXplPWZ1bmN0aW9uKCl7dGhpcy5hbmFseXplQmxvY2sodGhpcy50b3AsbnVsbCx7fSx7fSl9O1NrLnN5bWJvbHRhYmxlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9bmV3IGIoYyk7ZC5lbnRlckJsb2NrKFwidG9wXCIsXCJtb2R1bGVcIixhLDApO2QudG9wPWQuY3VyO2ZvcihjPTA7YzxhLmJvZHkubGVuZ3RoOysrYylkLnZpc2l0U3RtdChhLmJvZHlbY10pO1xuZC5leGl0QmxvY2soKTtkLmFuYWx5emUoKTtyZXR1cm4gZH07U2suZHVtcFN5bXRhYj1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXtyZXR1cm4gYT9cIlRydWVcIjpcIkZhbHNlXCJ9LGM9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWMucHVzaCgobmV3IFNrLmJ1aWx0aW4uc3RyKGFbYl0pKS4kcigpLnYpO3JldHVyblwiW1wiK2Muam9pbihcIiwgXCIpK1wiXVwifSxlPWZ1bmN0aW9uKGEsZCl7dmFyIGYsZzt2b2lkIDA9PT1kJiYoZD1cIlwiKTt2YXIgaz1kK1wiU3ltX3R5cGU6IFwiK2EuZ2V0X3R5cGUoKStcIlxcblwiO2srPWQrXCJTeW1fbmFtZTogXCIrYS5nZXRfbmFtZSgpK1wiXFxuXCI7ays9ZCtcIlN5bV9saW5lbm86IFwiK2EuZ2V0X2xpbmVubygpK1wiXFxuXCI7ays9ZCtcIlN5bV9uZXN0ZWQ6IFwiK2IoYS5pc19uZXN0ZWQoKSkrXCJcXG5cIjtrKz1kK1wiU3ltX2hhc2NoaWxkcmVuOiBcIitiKGEuaGFzX2NoaWxkcmVuKCkpK1wiXFxuXCI7XCJjbGFzc1wiPT09YS5nZXRfdHlwZSgpP2srPWQrXG5cIkNsYXNzX21ldGhvZHM6IFwiK2MoYS5nZXRfbWV0aG9kcygpKStcIlxcblwiOlwiZnVuY3Rpb25cIj09PWEuZ2V0X3R5cGUoKSYmKGsrPWQrXCJGdW5jX3BhcmFtczogXCIrYyhhLmdldF9wYXJhbWV0ZXJzKCkpK1wiXFxuXCIsays9ZCtcIkZ1bmNfbG9jYWxzOiBcIitjKGEuZ2V0X2xvY2FscygpKStcIlxcblwiLGsrPWQrXCJGdW5jX2dsb2JhbHM6IFwiK2MoYS5nZXRfZ2xvYmFscygpKStcIlxcblwiLGsrPWQrXCJGdW5jX2ZyZWVzOiBcIitjKGEuZ2V0X2ZyZWVzKCkpK1wiXFxuXCIpO2srPWQrXCItLSBJZGVudGlmaWVycyAtLVxcblwiO3ZhciBoPWEuZ2V0X2lkZW50aWZpZXJzKCk7dmFyIG49aC5sZW5ndGg7Zm9yKGc9MDtnPG47KytnKXt2YXIgbD1hLmxvb2t1cChoW2ddKTtrKz1kK1wibmFtZTogXCIrbC5nZXRfbmFtZSgpK1wiXFxuXCI7ays9ZCtcIiAgaXNfcmVmZXJlbmNlZDogXCIrYihsLmlzX3JlZmVyZW5jZWQoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19pbXBvcnRlZDogXCIrYihsLmlzX2ltcG9ydGVkKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfcGFyYW1ldGVyOiBcIitcbmIobC5pc19wYXJhbWV0ZXIoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19nbG9iYWw6IFwiK2IobC5pc19nbG9iYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19kZWNsYXJlZF9nbG9iYWw6IFwiK2IobC5pc19kZWNsYXJlZF9nbG9iYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19sb2NhbDogXCIrYihsLmlzX2xvY2FsKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfZnJlZTogXCIrYihsLmlzX2ZyZWUoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19hc3NpZ25lZDogXCIrYihsLmlzX2Fzc2lnbmVkKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfbmFtZXNwYWNlOiBcIitiKGwuaXNfbmFtZXNwYWNlKCkpK1wiXFxuXCI7dmFyIG09bC5nZXRfbmFtZXNwYWNlcygpO3ZhciBwPW0ubGVuZ3RoO2srPWQrXCIgIG5hbWVzcGFjZXM6IFtcXG5cIjt2YXIgcT1bXTtmb3IoZj0wO2Y8cDsrK2YpbD1tW2ZdLHEucHVzaChlKGwsZCtcIiAgICBcIikpO2srPXEuam9pbihcIlxcblwiKTtrKz1kK1wiICBdXFxuXCJ9cmV0dXJuIGt9O3JldHVybiBlKGEudG9wLFwiXCIpfTtTay5leHBvcnRTeW1ib2woXCJTay5zeW1ib2x0YWJsZVwiLFxuU2suc3ltYm9sdGFibGUpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmR1bXBTeW10YWJcIixTay5kdW1wU3ltdGFiKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjLGUsZil7dGhpcy5maWxlbmFtZT1hO3RoaXMuc3Q9Yjt0aGlzLmZsYWdzPWM7dGhpcy5jYW5TdXNwZW5kPWU7dGhpcy5pbnRlcmFjdGl2ZT0hMTt0aGlzLm5lc3RsZXZlbD0wO3RoaXMudT1udWxsO3RoaXMuc3RhY2s9W107dGhpcy5yZXN1bHQ9W107dGhpcy5hbGxVbml0cz1bXTt0aGlzLnNvdXJjZT1mP2Yuc3BsaXQoXCJcXG5cIik6ITF9ZnVuY3Rpb24gYygpe3RoaXMubmFtZT10aGlzLnN0ZT1udWxsO3RoaXMuZG9lc1N1c3BlbmQ9dGhpcy5jYW5TdXNwZW5kPSExO3RoaXMucHJpdmF0ZV89bnVsbDt0aGlzLmxpbmVubz10aGlzLmZpcnN0bGluZW5vPTA7dGhpcy5saW5lbm9TZXQ9ITE7dGhpcy5sb2NhbG5hbWVzPVtdO3RoaXMubG9jYWx0ZW1wcz1bXTt0aGlzLnRlbXBzVG9TYXZlPVtdO3RoaXMuYmxvY2tudW09MDt0aGlzLmJsb2Nrcz1cbltdO3RoaXMuY3VyYmxvY2s9MDt0aGlzLmNvbnN0cz17fTt0aGlzLnNjb3BlbmFtZT1udWxsO3RoaXMuc3VmZml4Q29kZT10aGlzLnN3aXRjaENvZGU9dGhpcy52YXJEZWNsc0NvZGU9dGhpcy5wcmVmaXhDb2RlPVwiXCI7dGhpcy5icmVha0Jsb2Nrcz1bXTt0aGlzLmNvbnRpbnVlQmxvY2tzPVtdO3RoaXMuZXhjZXB0QmxvY2tzPVtdO3RoaXMuZmluYWxseUJsb2Nrcz1bXX1mdW5jdGlvbiBiKGEpe3JldHVybiB2b2lkIDA9PT1oW2FdP2E6YStcIl8kcnckXCJ9ZnVuY3Rpb24gZShhLGIpe3ZhciBjPWIudjtpZihudWxsPT09YXx8bnVsbD09PWN8fFwiX1wiIT09Yy5jaGFyQXQoMCl8fFwiX1wiIT09Yy5jaGFyQXQoMSl8fFwiX1wiPT09Yy5jaGFyQXQoYy5sZW5ndGgtMSkmJlwiX1wiPT09Yy5jaGFyQXQoYy5sZW5ndGgtMikpcmV0dXJuIGI7dmFyIGQ9YS52O2QucmVwbGFjZSgvXy9nLFwiXCIpO2lmKFwiXCI9PT1kKXJldHVybiBiO2Q9YS52O2QucmVwbGFjZSgvXl8qLyxcIlwiKTtyZXR1cm4gZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfXCIrXG5kK2MpfWZ1bmN0aW9uIGYoYSl7bGV0IGI9J1wiJztmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyl7bGV0IGQ9YS5jaGFyQ29kZUF0KGMpO2I9MTA9PWQ/YitcIlxcXFxuXCI6OTI9PWQ/YitcIlxcXFxcXFxcXCI6MzQ9PWR8fDMyPmR8fDEyNzw9ZCYmMjU2PmQ/YisoXCJcXFxceFwiKyhcIjBcIitkLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yKSk6MjU2PD1kP2IrKFwiXFxcXHVcIisoXCIwMDBcIitkLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC00KSk6YithLmNoYXJBdChjKX1yZXR1cm4gYisnXCInfXZhciBsO1NrLmdlbnN5bWNvdW50PTA7Yy5wcm90b3R5cGUuYWN0aXZhdGVTY29wZT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7bD1mdW5jdGlvbigpe3ZhciBiLGM9YS5ibG9ja3NbYS5jdXJibG9ja107aWYobnVsbD09PWMuX25leHQpZm9yKGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7KytiKWMucHVzaChhcmd1bWVudHNbYl0pfX07YS5wcm90b3R5cGUuZ2V0U291cmNlTGluZT1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnNvdXJjZSk7XG5yZXR1cm4gdGhpcy5zb3VyY2VbYS0xXX07YS5wcm90b3R5cGUuYW5ub3RhdGVTb3VyY2U9ZnVuY3Rpb24oYSl7dmFyIGI7aWYodGhpcy5zb3VyY2Upe3ZhciBjPWEubGluZW5vO3ZhciBkPWEuY29sX29mZnNldDtsKFwiXFxuLy9cXG4vLyBsaW5lIFwiLGMsXCI6XFxuLy8gXCIsdGhpcy5nZXRTb3VyY2VMaW5lKGMpLFwiXFxuLy8gXCIpO2ZvcihiPTA7YjxkOysrYilsKFwiIFwiKTtsKFwiXlxcbi8vXFxuXCIpO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEubGluZW5vJiZ2b2lkIDAhPT1hLmNvbF9vZmZzZXQpO2woXCIkY3VyckxpbmVObyA9IFwiLGMsXCI7XFxuJGN1cnJDb2xObyA9IFwiLGQsXCI7XFxuXFxuXCIpfX07YS5wcm90b3R5cGUuZ2Vuc3ltPWZ1bmN0aW9uKGEpe3JldHVybiBhPVwiJFwiKyhhfHxcIlwiKStTay5nZW5zeW1jb3VudCsrfTthLnByb3RvdHlwZS5uaWNlTmFtZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZW5zeW0oYS5yZXBsYWNlKFwiPFwiLFwiXCIpLnJlcGxhY2UoXCI+XCIsXCJcIikucmVwbGFjZShcIiBcIixcIl9cIikpfTtcbnZhciBoPVNrLmJ1aWx0aW4uc3RyLnJlc2VydmVkV29yZHNfO2EucHJvdG90eXBlLm1ha2VDb25zdGFudD1mdW5jdGlvbihhKXt2YXIgYixjPVwiXCI7Zm9yKGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7KytiKWMrPWFyZ3VtZW50c1tiXTtmb3IoZCBpbiB0aGlzLnUuY29uc3RzKWlmKHRoaXMudS5jb25zdHMuaGFzT3duUHJvcGVydHkoZCkmJihiPXRoaXMudS5jb25zdHNbZF0sYj09YykpcmV0dXJuIGQ7dmFyIGQ9dGhpcy51LnNjb3BlbmFtZStcIi5cIit0aGlzLmdlbnN5bShcImNvbnN0XCIpO3RoaXMudS5jb25zdHNbZF09YztyZXR1cm4gZH07YS5wcm90b3R5cGUuX2dyPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD10aGlzLmdlbnN5bShhKTt0aGlzLnUubG9jYWx0ZW1wcy5wdXNoKGQpO2woXCJ2YXIgXCIsZCxcIj1cIik7Zm9yKGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWwoYXJndW1lbnRzW2NdKTtsKFwiO1wiKTtyZXR1cm4gZH07YS5wcm90b3R5cGUub3V0cHV0SW50ZXJydXB0VGVzdD1mdW5jdGlvbigpe3ZhciBhPVxuXCJcIjtpZihudWxsIT09U2suZXhlY0xpbWl0fHxudWxsIT09U2sueWllbGRMaW1pdCYmdGhpcy51LmNhblN1c3BlbmQpYSs9XCJ2YXIgJGRhdGVOb3cgPSBEYXRlLm5vdygpO1wiLG51bGwhPT1Tay5leGVjTGltaXQmJihhKz1cImlmICgkZGF0ZU5vdyAtIFNrLmV4ZWNTdGFydCA+IFNrLmV4ZWNMaW1pdCkge3Rocm93IG5ldyBTay5idWlsdGluLlRpbWVMaW1pdEVycm9yKFNrLnRpbWVvdXRNc2coKSl9XCIpLG51bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGE9YStcImlmICgkZGF0ZU5vdyAtIFNrLmxhc3RZaWVsZCA+IFNrLnlpZWxkTGltaXQpIHtcIisoXCJ2YXIgJHN1c3AgPSAkc2F2ZVN1c3BlbnNpb24oe2RhdGE6IHt0eXBlOiAnU2sueWllbGQnfSwgcmVzdW1lOiBmdW5jdGlvbigpIHt9fSwgJ1wiK3RoaXMuZmlsZW5hbWUrXCInLCRjdXJyTGluZU5vLCRjdXJyQ29sTm8pO1wiKSxhKz1cIiRzdXNwLiRibGsgPSAkYmxrOyRzdXNwLm9wdGlvbmFsID0gdHJ1ZTtyZXR1cm4gJHN1c3A7fVwiLFxudGhpcy51LmRvZXNTdXNwZW5kPSEwKTtyZXR1cm4gYX07YS5wcm90b3R5cGUuX2p1bXBmYWxzZT1mdW5jdGlvbihhLGIpe2E9dGhpcy5fZ3IoXCJqZmFsc2VcIixcIihcIixhLFwiPT09ZmFsc2V8fCFTay5taXNjZXZhbC5pc1RydWUoXCIsYSxcIikpXCIpO2woXCJpZihcIixhLFwiKXsvKnRlc3QgZmFpbGVkICovJGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wdW5kZWY9ZnVuY3Rpb24oYSxiKXtsKFwiaWYoXCIsYSxcIj09PXVuZGVmaW5lZCl7JGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wbm90dW5kZWY9ZnVuY3Rpb24oYSxiKXtsKFwiaWYoXCIsYSxcIiE9PXVuZGVmaW5lZCl7JGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wdHJ1ZT1mdW5jdGlvbihhLGIpe2E9dGhpcy5fZ3IoXCJqdHJ1ZVwiLFwiKFwiLGEsXCI9PT10cnVlfHxTay5taXNjZXZhbC5pc1RydWUoXCIsYSxcIikpXCIpO2woXCJpZihcIixhLFwiKXsvKnRlc3QgcGFzc2VkICovJGJsaz1cIixcbmIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXA9ZnVuY3Rpb24oYSl7bnVsbD09PXRoaXMudS5ibG9ja3NbdGhpcy51LmN1cmJsb2NrXS5fbmV4dCYmKGwoXCIkYmxrPVwiLGEsXCI7XCIpLHRoaXMudS5ibG9ja3NbdGhpcy51LmN1cmJsb2NrXS5fbmV4dD1hKX07YS5wcm90b3R5cGUuX2NoZWNrU3VzcGVuc2lvbj1mdW5jdGlvbihhKXtpZih0aGlzLnUuY2FuU3VzcGVuZCl7dmFyIGI9dGhpcy5uZXdCbG9jayhcImZ1bmN0aW9uIHJldHVybiBvciByZXN1bWUgc3VzcGVuc2lvblwiKTt0aGlzLl9qdW1wKGIpO3RoaXMuc2V0QmxvY2soYik7YT1hfHx7bGluZW5vOlwiJGN1cnJMaW5lTm9cIixjb2xfb2Zmc2V0OlwiJGN1cnJDb2xOb1wifTtsKFwiaWYgKCRyZXQgJiYgJHJldC4kaXNTdXNwZW5zaW9uKSB7IHJldHVybiAkc2F2ZVN1c3BlbnNpb24oJHJldCwnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKTsgfVwiKTt0aGlzLnUuZG9lc1N1c3BlbmQ9ITA7XG50aGlzLnUudGVtcHNUb1NhdmU9dGhpcy51LnRlbXBzVG9TYXZlLmNvbmNhdCh0aGlzLnUubG9jYWx0ZW1wcyl9ZWxzZSBsKFwiaWYgKCRyZXQgJiYgJHJldC4kaXNTdXNwZW5zaW9uKSB7ICRyZXQgPSBTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coJHJldCk7IH1cIil9O2EucHJvdG90eXBlLmN1bnBhY2tzdGFyc3RvYXJyYXk9ZnVuY3Rpb24oYSxiKXtpZighYXx8MD09YS5sZW5ndGgpcmV0dXJuXCJbXVwiO2xldCBjPSExO2ZvcihsZXQgZCBvZiBhKXtpZihiJiZjKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiRXh0ZW5kZWQgYXJndW1lbnQgdW5wYWNraW5nIGlzIG5vdCBwZXJtaXR0ZWQgaW4gUHl0aG9uIDJcIik7ZC5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0YXJyZWQmJihjPSEwKX1pZihjKXtiPXRoaXMuX2dyKFwidW5wYWNrXCIsXCJbXVwiKTtmb3IobGV0IGMgb2YgYSljLmNvbnN0cnVjdG9yIT09U2suYXN0bm9kZXMuU3RhcnJlZD9sKGIsXG5cIi5wdXNoKFwiLHRoaXMudmV4cHIoYyksXCIpO1wiKToobChcIiRyZXQgPSBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoXCIsdGhpcy52ZXhwcihjLnZhbHVlKSxcIiksIGZ1bmN0aW9uKGUpIHsgXCIsYixcIi5wdXNoKGUpOyB9KTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCkpO3JldHVybiBifXJldHVyblwiW1wiK2EubWFwKGE9PnRoaXMudmV4cHIoYSkpLmpvaW4oXCIsXCIpK1wiXVwifTthLnByb3RvdHlwZS5jdHVwbGVsaXN0b3JzZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO1NrLmFzc2VydHMuYXNzZXJ0KFwidHVwbGVcIj09PWN8fFwibGlzdFwiPT09Y3x8XCJzZXRcIj09PWMpO3ZhciBlPSExO2ZvcihkPTA7ZDxhLmVsdHMubGVuZ3RoO2QrKylpZihhLmVsdHNbZF0uY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXtlPSEwO3ZhciBmPWQ7YnJlYWt9aWYoYS5jdHg9PT1Tay5hc3Rub2Rlcy5TdG9yZSl7aWYoZSl7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFzc2lnbm1lbnQgdW5wYWNraW5nIHdpdGggc3RhcnMgaXMgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMlwiLFxudGhpcy5maWxlbmFtZSxhLmxpbmVubyk7Zm9yKGQ9ZisxO2Q8YS5lbHRzLmxlbmd0aDtkKyspaWYoYS5lbHRzW2RdLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm11bHRpcGxlIHN0YXJyZWQgZXhwcmVzc2lvbnMgaW4gYXNzaWdubWVudFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO31jPWU/ZjphLmVsdHMubGVuZ3RoO2woXCIkcmV0ID0gU2suYWJzdHIuc2VxdWVuY2VVbnBhY2soXCIrYitcIixcIitjK1wiLFwiKyhlP2EuZWx0cy5sZW5ndGgtMTpjKStcIiwgXCIrZStcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbigpO2I9dGhpcy5fZ3IoXCJpdGVtc1wiLFwiJHJldFwiKTtmb3IoZD0wO2Q8YS5lbHRzLmxlbmd0aDsrK2QpZD09PWY/dGhpcy52ZXhwcihhLmVsdHNbZF0udmFsdWUsYitcIltcIitkK1wiXVwiKTp0aGlzLnZleHByKGEuZWx0c1tkXSxiK1wiW1wiK2QrXCJdXCIpfWVsc2UgaWYoYS5jdHg9PT1Tay5hc3Rub2Rlcy5Mb2FkfHxcInNldFwiPT09XG5jKXtpZihlKXtpZighU2suX19mdXR1cmVfXy5weXRob24zKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiTGlzdCBwYWNraW5nIHdpdGggc3RhcnMgaXMgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMlwiKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFwiLHRoaXMuY3VucGFja3N0YXJzdG9hcnJheShhLmVsdHMpLFwiKVwiKX1pZihcInR1cGxlXCI9PT1jKXtlPSEwO2I9W107Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7KytkKWY9dGhpcy52ZXhwcihhLmVsdHNbZF0pLGUmJi0xPT1mLmluZGV4T2YoXCIkY29uc3RcIikmJihlPSExKSxiLnB1c2goZik7aWYoZSlyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi50dXBsZShbXCIrYitcIl0pXCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDsrK2QpYltkXT10aGlzLl9ncihcImVsZW1cIixiW2RdKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFtcIixcbmIsXCJdKVwiKX1iPVtdO2ZvcihkPTA7ZDxhLmVsdHMubGVuZ3RoOysrZCliLnB1c2godGhpcy5fZ3IoXCJlbGVtXCIsdGhpcy52ZXhwcihhLmVsdHNbZF0pKSk7cmV0dXJuIHRoaXMuX2dyKFwibG9hZFwiK2MsXCJuZXcgU2suYnVpbHRpbnNbJ1wiLGMsXCInXShbXCIsYixcIl0pXCIpfX07YS5wcm90b3R5cGUuY2RpY3Q9ZnVuY3Rpb24oYSl7dmFyIGI7dmFyIGM9W107aWYobnVsbCE9PWEua2V5cylmb3IoU2suYXNzZXJ0cy5hc3NlcnQoYS52YWx1ZXMubGVuZ3RoPT09YS5rZXlzLmxlbmd0aCksYj0wO2I8YS52YWx1ZXMubGVuZ3RoOysrYil7dmFyIGQ9dGhpcy52ZXhwcihhLnZhbHVlc1tiXSk7Yy5wdXNoKHRoaXMudmV4cHIoYS5rZXlzW2JdKSk7Yy5wdXNoKGQpfXJldHVybiB0aGlzLl9ncihcImxvYWRkaWN0XCIsXCJuZXcgU2suYnVpbHRpbnNbJ2RpY3QnXShbXCIsYyxcIl0pXCIpfTthLnByb3RvdHlwZS5jbGlzdGNvbXA9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkxpc3RDb21wKTtcbnZhciBiPXRoaXMuX2dyKFwiX2NvbXByXCIsXCJuZXcgU2suYnVpbHRpbnNbJ2xpc3QnXShbXSlcIik7cmV0dXJuIHRoaXMuY2NvbXBnZW4oXCJsaXN0XCIsYixhLmdlbmVyYXRvcnMsMCxhLmVsdCxudWxsLGEpfTthLnByb3RvdHlwZS5jZGljdGNvbXA9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkRpY3RDb21wKTt2YXIgYj10aGlzLl9ncihcIl9kY29tcHJcIixcIm5ldyBTay5idWlsdGlucy5kaWN0KFtdKVwiKTtyZXR1cm4gdGhpcy5jY29tcGdlbihcImRpY3RcIixiLGEuZ2VuZXJhdG9ycywwLGEudmFsdWUsYS5rZXksYSl9O2EucHJvdG90eXBlLmNzZXRjb21wPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5TZXRDb21wKTt2YXIgYj10aGlzLl9ncihcIl9zZXRjb21wclwiLFwibmV3IFNrLmJ1aWx0aW5zLnNldChbXSlcIik7cmV0dXJuIHRoaXMuY2NvbXBnZW4oXCJzZXRcIixiLGEuZ2VuZXJhdG9ycywwLFxuYS5lbHQsbnVsbCxhKX07YS5wcm90b3R5cGUuY2NvbXBnZW49ZnVuY3Rpb24oYSxiLGMsZSxmLGgsbSl7dmFyIGQ9dGhpcy5uZXdCbG9jayhhK1wiIGNvbXAgc3RhcnRcIiksZz10aGlzLm5ld0Jsb2NrKGErXCIgY29tcCBza2lwXCIpLGs9dGhpcy5uZXdCbG9jayhhK1wiIGNvbXAgYW5jaG9yXCIpLG49Y1tlXSxwPXRoaXMudmV4cHIobi5pdGVyKTtwPXRoaXMuX2dyKFwiaXRlclwiLFwiU2suYWJzdHIuaXRlcihcIixwLFwiKVwiKTt2YXIgcTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCk7bChcIiRyZXQgPSBTay5hYnN0ci5pdGVybmV4dChcIixwLFwiLCB0cnVlKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKG0pO3A9dGhpcy5fZ3IoXCJuZXh0XCIsXCIkcmV0XCIpO3RoaXMuX2p1bXB1bmRlZihwLGspO3RoaXMudmV4cHIobi50YXJnZXQscCk7dmFyIHU9bi5pZnM/bi5pZnMubGVuZ3RoOjA7Zm9yKHE9MDtxPHU7KytxKXA9dGhpcy52ZXhwcihuLmlmc1txXSksdGhpcy5fanVtcGZhbHNlKHAsZCk7KytlPGMubGVuZ3RoJiZcbnRoaXMuY2NvbXBnZW4oYSxiLGMsZSxmLGgsbSk7ZT49Yy5sZW5ndGgmJihjPXRoaXMudmV4cHIoZiksXCJkaWN0XCI9PT1hPyhhPXRoaXMudmV4cHIoaCksbChiLFwiLm1wJGFzc19zdWJzY3JpcHQoXCIsYSxcIixcIixjLFwiKTtcIikpOlwibGlzdFwiPT09YT9sKGIsXCIudi5wdXNoKFwiLGMsXCIpO1wiKTpcInNldFwiPT09YSYmbChiLFwiLnYubXAkYXNzX3N1YnNjcmlwdChcIixjLFwiLCB0cnVlKTtcIiksdGhpcy5fanVtcChnKSx0aGlzLnNldEJsb2NrKGcpKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soayk7cmV0dXJuIGJ9O2EucHJvdG90eXBlLmN5aWVsZD1mdW5jdGlvbihhKXtpZih0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIid5aWVsZCcgb3V0c2lkZSBmdW5jdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO3ZhciBiPVwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7YS52YWx1ZSYmKGI9dGhpcy52ZXhwcihhLnZhbHVlKSk7XG5hPXRoaXMubmV3QmxvY2soXCJhZnRlciB5aWVsZFwiKTtsKFwicmV0dXJuIFsvKnJlc3VtZSovXCIsYSxcIiwvKnJldCovXCIsYixcIl07XCIpO3RoaXMuc2V0QmxvY2soYSk7cmV0dXJuXCIkZ2VuLmdpJHNlbnR2YWx1ZVwifTthLnByb3RvdHlwZS5jY29tcGFyZT1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhLm9wcy5sZW5ndGg9PT1hLmNvbXBhcmF0b3JzLmxlbmd0aCk7dmFyIGM9dGhpcy52ZXhwcihhLmxlZnQpO3ZhciBkPWEub3BzLmxlbmd0aDt2YXIgZT10aGlzLm5ld0Jsb2NrKFwiZG9uZVwiKTt2YXIgZj10aGlzLl9ncihcImNvbXBhcmVyZXNcIixcIm51bGxcIik7Zm9yKGI9MDtiPGQ7KytiKXt2YXIgaD10aGlzLnZleHByKGEuY29tcGFyYXRvcnNbYl0pO2woXCIkcmV0ID0gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChcIixjLFwiLFwiLGgsXCIsJ1wiLGEub3BzW2JdLnByb3RvdHlwZS5fYXN0bmFtZSxcIicsIHRydWUpKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO1xubChmLFwiPSRyZXQ7XCIpO3RoaXMuX2p1bXBmYWxzZShcIiRyZXRcIixlKTtjPWh9dGhpcy5fanVtcChlKTt0aGlzLnNldEJsb2NrKGUpO3JldHVybiBmfTthLnByb3RvdHlwZS5jY2FsbD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnZleHByKGEuZnVuYyk7bGV0IGM9dGhpcy5jdW5wYWNrc3RhcnN0b2FycmF5KGEuYXJncywhU2suX19mdXR1cmVfXy5weXRob24zKTt2YXIgZD1cInVuZGVmaW5lZFwiO2lmKGEua2V5d29yZHMmJjA8YS5rZXl3b3Jkcy5sZW5ndGgpe2xldCBjPSExO2Q9W107Zm9yKGxldCBiIG9mIGEua2V5d29yZHMpe2lmKGMmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQWR2YW5jZWQgdW5wYWNraW5nIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cyBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO2IuYXJnPyhkLnB1c2goXCInXCIrYi5hcmcuditcIidcIiksZC5wdXNoKHRoaXMudmV4cHIoYi52YWx1ZSkpKTpjPSEwfWQ9XCJbXCIrZC5qb2luKFwiLFwiKStcblwiXVwiO2lmKGMpe2Q9dGhpcy5fZ3IoXCJrZXl3b3JkQXJnc1wiLGQpO2ZvcihsZXQgYyBvZiBhLmtleXdvcmRzKWMuYXJnfHwobChcIiRyZXQgPSBTay5hYnN0ci5tYXBwaW5nVW5wYWNrSW50b0tleXdvcmRBcnJheShcIixkLFwiLFwiLHRoaXMudmV4cHIoYy52YWx1ZSksXCIsXCIsYixcIik7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpKX19U2suX19mdXR1cmVfXy5zdXBlcl9hcmdzJiZhLmZ1bmMuaWQmJlwic3VwZXJcIj09PWEuZnVuYy5pZC52JiZcIltdXCI9PT1jJiYobCgnaWYgKHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiIHx8IHNlbGYudG9TdHJpbmcoKS5pbmRleE9mKFwiV2luZG93XCIpID4gMCkgeyB0aHJvdyBuZXcgU2suYnVpbHRpbi5SdW50aW1lRXJyb3IoXCJzdXBlcigpOiBubyBhcmd1bWVudHNcIikgfTsnKSxjPVwiWyRnYmwuX19jbGFzc19fLHNlbGZdXCIpO2woXCIkcmV0ID0gKFwiLGIsXCIudHAkY2FsbCk/XCIsYixcIi50cCRjYWxsKFwiLGMsXCIsXCIsZCxcIikgOiBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChcIixcbmIsXCIsdW5kZWZpbmVkLHVuZGVmaW5lZCxcIixkLFwiLFwiLGMsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7cmV0dXJuIHRoaXMuX2dyKFwiY2FsbFwiLFwiJHJldFwiKX07YS5wcm90b3R5cGUuY3NsaWNlPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5TbGljZSk7aWYoU2suX19mdXR1cmVfXy5weXRob24zKXt2YXIgYj1hLmxvd2VyP3RoaXMudmV4cHIoYS5sb3dlcik6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjt2YXIgYz1hLnVwcGVyP3RoaXMudmV4cHIoYS51cHBlcik6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIn1lbHNlIGI9YS5sb3dlcj90aGlzLnZleHByKGEubG93ZXIpOmEuc3RlcD9cIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOlwibmV3IFNrLmJ1aWx0aW4uaW50XygwKVwiLGM9YS51cHBlcj90aGlzLnZleHByKGEudXBwZXIpOmEuc3RlcD9cIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOlwibmV3IFNrLmJ1aWx0aW4uaW50XygyMTQ3NDgzNjQ3KVwiO1xuYT1hLnN0ZXA/dGhpcy52ZXhwcihhLnN0ZXApOlwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7cmV0dXJuIHRoaXMuX2dyKFwic2xpY2VcIixcIm5ldyBTay5idWlsdGluc1snc2xpY2UnXShcIixiLFwiLFwiLGMsXCIsXCIsYSxcIilcIil9O2EucHJvdG90eXBlLmVzbGljZT1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgQXJyYXkpO3ZhciBjPVtdO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKHRoaXMudnNsaWNlc3ViKGFbYl0pKTtyZXR1cm4gdGhpcy5fZ3IoXCJleHRzbGljZVwiLFwibmV3IFNrLmJ1aWx0aW5zWyd0dXBsZSddKFtcIixjLFwiXSlcIil9O2EucHJvdG90eXBlLnZzbGljZXN1Yj1mdW5jdGlvbihhKXtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5JbmRleDp2YXIgYj10aGlzLnZleHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU2xpY2U6Yj10aGlzLmNzbGljZShhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkVsbGlwc2lzOlNrLmFzc2VydHMuZmFpbChcInRvZG8gY29tcGlsZS5qcyBFbGxpcHNpcztcIik7XG5icmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4dFNsaWNlOmI9dGhpcy5lc2xpY2UoYS5kaW1zKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgc3Vic2NyaXB0IGtpbmRcIil9cmV0dXJuIGJ9O2EucHJvdG90eXBlLnZzbGljZT1mdW5jdGlvbihhLGIsYyxlKXthPXRoaXMudnNsaWNlc3ViKGEpO3JldHVybiB0aGlzLmNoYW5kbGVzdWJzY3IoYixjLGEsZSl9O2EucHJvdG90eXBlLmNoYW5kbGVzdWJzY3I9ZnVuY3Rpb24oYSxiLGMsZSl7aWYoYT09PVNrLmFzdG5vZGVzLkxvYWR8fGE9PT1Tay5hc3Rub2Rlcy5BdWdMb2FkKXJldHVybiBsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdEdldEl0ZW0oXCIsYixcIixcIixjLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCksdGhpcy5fZ3IoXCJsc3Vic2NyXCIsXCIkcmV0XCIpO2E9PT1Tay5hc3Rub2Rlcy5TdG9yZXx8YT09PVNrLmFzdG5vZGVzLkF1Z1N0b3JlPyhsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdFNldEl0ZW0oXCIsXG5iLFwiLFwiLGMsXCIsXCIsZSxcIiwgdHJ1ZSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpKTphPT09U2suYXN0bm9kZXMuRGVsP2woXCJTay5hYnN0ci5vYmplY3REZWxJdGVtKFwiLGIsXCIsXCIsYyxcIik7XCIpOlNrLmFzc2VydHMuZmFpbChcImhhbmRsZXN1YnNjciBmYWlsXCIpfTthLnByb3RvdHlwZS5jYm9vbG9wPWZ1bmN0aW9uKGEpe3ZhciBiLGM7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkJvb2xPcCk7dmFyIGQ9YS5vcD09PVNrLmFzdG5vZGVzLkFuZD90aGlzLl9qdW1wZmFsc2U6dGhpcy5fanVtcHRydWU7dmFyIGU9dGhpcy5uZXdCbG9jayhcImVuZCBvZiBib29sb3BcIik7dmFyIGY9YS52YWx1ZXM7dmFyIGg9Zi5sZW5ndGg7Zm9yKGI9MDtiPGg7KytiKWE9dGhpcy52ZXhwcihmW2JdKSwwPT09YiYmKGM9dGhpcy5fZ3IoXCJib29sb3BzdWNjXCIsYSkpLGwoYyxcIj1cIixhLFwiO1wiKSxkLmNhbGwodGhpcyxhLGUpO3RoaXMuX2p1bXAoZSk7dGhpcy5zZXRCbG9jayhlKTtcbnJldHVybiBjfTthLnByb3RvdHlwZS5jam9pbmVkc3RyPWZ1bmN0aW9uKGEpe2xldCBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5Kb2luZWRTdHIpO2ZvcihsZXQgYyBvZiBhLnZhbHVlcylhPXRoaXMudmV4cHIoYyksYj9sKGIsXCI9XCIsYixcIi5zcSRjb25jYXQoXCIsYSxcIik7XCIpOmI9dGhpcy5fZ3IoXCJqb2luZWRzdHJcIixhKTtifHwoYj1cIlNrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0clwiKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY2Zvcm1hdHRlZHZhbHVlPWZ1bmN0aW9uKGEpe2xldCBiPXRoaXMudmV4cHIoYS52YWx1ZSk7c3dpdGNoKGEuY29udmVyc2lvbil7Y2FzZSBcInNcIjpiPXRoaXMuX2dyKFwidmFsdWVcIixcIm5ldyBTay5idWlsdGluLnN0cihcIixiLFwiKVwiKTticmVhaztjYXNlIFwiYVwiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwiU2suYnVpbHRpbi5hc2NpaShcIixiLFwiKVwiKTticmVhaztjYXNlIFwiclwiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwiU2suYnVpbHRpbi5yZXByKFwiLFxuYixcIilcIil9YT1hLmZvcm1hdF9zcGVjP3RoaXMudmV4cHIoYS5mb3JtYXRfc3BlYyk6XCJTay5idWlsdGluLnN0ci4kZW1wdHlzdHJcIjtyZXR1cm4gdGhpcy5fZ3IoXCJmb3JtYXR0ZWRcIixcIlNrLmFic3RyLm9iamVjdEZvcm1hdChcIitiK1wiLFwiK2ErXCIpXCIpfTthLnByb3RvdHlwZS52ZXhwcj1mdW5jdGlvbihhLGIsYyxrKXt2YXIgZDthLmxpbmVubz50aGlzLnUubGluZW5vJiYodGhpcy51LmxpbmVubz1hLmxpbmVubyx0aGlzLnUubGluZW5vU2V0PSExKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5Cb29sT3A6cmV0dXJuIHRoaXMuY2Jvb2xvcChhKTtjYXNlIFNrLmFzdG5vZGVzLkJpbk9wOnJldHVybiB0aGlzLl9ncihcImJpbm9wXCIsXCJTay5hYnN0ci5udW1iZXJCaW5PcChcIix0aGlzLnZleHByKGEubGVmdCksXCIsXCIsdGhpcy52ZXhwcihhLnJpZ2h0KSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtjYXNlIFNrLmFzdG5vZGVzLlVuYXJ5T3A6cmV0dXJuIHRoaXMuX2dyKFwidW5hcnlvcFwiLFxuXCJTay5hYnN0ci5udW1iZXJVbmFyeU9wKFwiLHRoaXMudmV4cHIoYS5vcGVyYW5kKSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtjYXNlIFNrLmFzdG5vZGVzLkxhbWJkYTpyZXR1cm4gdGhpcy5jbGFtYmRhKGEpO2Nhc2UgU2suYXN0bm9kZXMuSWZFeHA6cmV0dXJuIHRoaXMuY2lmZXhwKGEpO2Nhc2UgU2suYXN0bm9kZXMuRGljdDpyZXR1cm4gdGhpcy5jZGljdChhKTtjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOnJldHVybiB0aGlzLmNsaXN0Y29tcChhKTtjYXNlIFNrLmFzdG5vZGVzLkRpY3RDb21wOnJldHVybiB0aGlzLmNkaWN0Y29tcChhKTtjYXNlIFNrLmFzdG5vZGVzLlNldENvbXA6cmV0dXJuIHRoaXMuY3NldGNvbXAoYSk7Y2FzZSBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA6cmV0dXJuIHRoaXMuY2dlbmV4cChhKTtjYXNlIFNrLmFzdG5vZGVzLllpZWxkOnJldHVybiB0aGlzLmN5aWVsZChhKTtjYXNlIFNrLmFzdG5vZGVzLkNvbXBhcmU6cmV0dXJuIHRoaXMuY2NvbXBhcmUoYSk7XG5jYXNlIFNrLmFzdG5vZGVzLkNhbGw6cmV0dXJuIGI9dGhpcy5jY2FsbChhKSx0aGlzLmFubm90YXRlU291cmNlKGEpLGI7Y2FzZSBTay5hc3Rub2Rlcy5OdW06aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhLm4pcmV0dXJuIGEubjtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5sbmcoJ1wiK2Eubi52LnRvU3RyaW5nKCkrXCInKVwiKTtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pcmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhLm4udj90aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLmludF8oXCIrYS5uLnYrXCIpXCIpOnRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uaW50XygnXCIrYS5uLnYudG9TdHJpbmcoKStcIicpXCIpO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKXJldHVybiBhPTA9PT1hLm4udiYmLUluZmluaXR5PT09MS9hLm4udj9cIi0wXCI6YS5uLnYsdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5mbG9hdF8oXCIrXG5hK1wiKVwiKTtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmNvbXBsZXgpcmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uY29tcGxleChcIisoMD09PWEubi5yZWFsJiYtSW5maW5pdHk9PT0xL2Eubi5yZWFsP1wiLTBcIjphLm4ucmVhbCkrXCIsIFwiKygwPT09YS5uLmltYWcmJi1JbmZpbml0eT09PTEvYS5uLmltYWc/XCItMFwiOmEubi5pbWFnKStcIilcIik7U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIE51bSB0eXBlXCIpO2Nhc2UgU2suYXN0bm9kZXMuQnl0ZXM6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXtiPVtdO2E9YS5zLiRqc3N0cigpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGEuY2hhckNvZGVBdChjKSk7cmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uYnl0ZXMoW1wiLGIuam9pbihcIiwgXCIpLFwiXSlcIil9Y2FzZSBTay5hc3Rub2Rlcy5TdHI6cmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uc3RyKFwiLFxuZihhLnMuJGpzc3RyKCkpLFwiKVwiKTtjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTphLmN0eCE9PVNrLmFzdG5vZGVzLkF1Z0xvYWQmJmEuY3R4IT09U2suYXN0bm9kZXMuQXVnU3RvcmUmJihkPXRoaXMudmV4cHIoYS52YWx1ZSkpO2s9YS5hdHRyLiRyKCkudjtrPWsuc3Vic3RyaW5nKDEsay5sZW5ndGgtMSk7az1lKHRoaXMudS5wcml2YXRlXyxuZXcgU2suYnVpbHRpbi5zdHIoaykpLnY7az10aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLnN0cignXCIraytcIicpXCIpO3N3aXRjaChhLmN0eCl7Y2FzZSBTay5hc3Rub2Rlcy5BdWdMb2FkOnJldHVybiBsKFwiJHJldCA9IFwiLGMsXCIudHAkZ2V0YXR0cihcIixrLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpLGwoXCJcXG5pZiAoJHJldCA9PT0gdW5kZWZpbmVkKSB7XCIpLGwoXCJcXG50aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIixjLCcuc2skYXR0ckVycm9yKCkgKyBcIiBoYXMgbm8gYXR0cmlidXRlIFxcJ1wiICsgJyxcbmssJy4kanNzdHIoKSArIFwiXFwnXCIpOycpLGwoXCJcXG59O1wiKSx0aGlzLl9ncihcImxhdHRyXCIsXCIkcmV0XCIpO2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gbChcIiRyZXQgPSBcIixkLFwiLnRwJGdldGF0dHIoXCIsayxcIiwgdHJ1ZSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKSxsKFwiXFxuaWYgKCRyZXQgPT09IHVuZGVmaW5lZCkge1wiKSxsKFwiXFxudGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCIsZCwnLnNrJGF0dHJFcnJvcigpICsgXCIgaGFzIG5vIGF0dHJpYnV0ZSBcXCdcIiArICcsaywnLiRqc3N0cigpICsgXCJcXCdcIik7JyksbChcIlxcbn07XCIpLHRoaXMuX2dyKFwibGF0dHJcIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5BdWdTdG9yZTpsKFwiJHJldCA9IHVuZGVmaW5lZDtcIik7bChcImlmKFwiLGIsXCIhPT11bmRlZmluZWQpe1wiKTtsKFwiJHJldCA9IFwiLGMsXCIudHAkc2V0YXR0cihcIixrLFwiLFwiLGIsXCIsIHRydWUpO1wiKTtsKFwifVwiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YnJlYWs7XG5jYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoXCIkcmV0ID0gXCIsZCxcIi50cCRzZXRhdHRyKFwiLGssXCIsXCIsYixcIiwgdHJ1ZSk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiJHJldCA9IFwiLGQsXCIudHAkc2V0YXR0cihcIixrLFwiLCB1bmRlZmluZWQsIHRydWUpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIGF0dHJpYnV0ZSBleHByZXNzaW9uXCIpfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OnN3aXRjaChhLmN0eCl7Y2FzZSBTay5hc3Rub2Rlcy5BdWdMb2FkOnJldHVybiBsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdEdldEl0ZW0oXCIsYyxcIixcIixrLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpLHRoaXMuX2dyKFwiZ2l0ZW1cIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOmNhc2UgU2suYXN0bm9kZXMuU3RvcmU6Y2FzZSBTay5hc3Rub2Rlcy5EZWw6cmV0dXJuIHRoaXMudnNsaWNlKGEuc2xpY2UsXG5hLmN0eCx0aGlzLnZleHByKGEudmFsdWUpLGIpO2Nhc2UgU2suYXN0bm9kZXMuQXVnU3RvcmU6bChcIiRyZXQ9dW5kZWZpbmVkO1wiKTtsKFwiaWYoXCIsYixcIiE9PXVuZGVmaW5lZCl7XCIpO2woXCIkcmV0PVNrLmFic3RyLm9iamVjdFNldEl0ZW0oXCIsYyxcIixcIixrLFwiLFwiLGIsXCIsIHRydWUpXCIpO2woXCJ9XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgc3Vic2NyaXB0IGV4cHJlc3Npb25cIil9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnJldHVybiB0aGlzLm5hbWVvcChhLmlkLGEuY3R4LGIpO2Nhc2UgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50OmlmKGEuY3R4PT09U2suYXN0bm9kZXMuU3RvcmV8fGEuY3R4PT09U2suYXN0bm9kZXMuQXVnU3RvcmV8fGEuY3R4PT09U2suYXN0bm9kZXMuRGVsKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuIG5vdCBhc3NpZ24gdG8gYSBjb25zdGFudCBuYW1lXCIpO1xuc3dpdGNoKGEudmFsdWUpe2Nhc2UgU2suYnVpbHRpbi5ub25lLm5vbmUkOnJldHVyblwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7Y2FzZSBTay5idWlsdGluLmJvb2wudHJ1ZSQ6cmV0dXJuXCJTay5idWlsdGluLmJvb2wudHJ1ZSRcIjtjYXNlIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6cmV0dXJuXCJTay5idWlsdGluLmJvb2wuZmFsc2UkXCI7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIG5hbWVkIGNvbnN0YW50XCIpfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDpyZXR1cm4gdGhpcy5jdHVwbGVsaXN0b3JzZXQoYSxiLFwibGlzdFwiKTtjYXNlIFNrLmFzdG5vZGVzLlR1cGxlOnJldHVybiB0aGlzLmN0dXBsZWxpc3RvcnNldChhLGIsXCJ0dXBsZVwiKTtjYXNlIFNrLmFzdG5vZGVzLlNldDpyZXR1cm4gdGhpcy5jdHVwbGVsaXN0b3JzZXQoYSxiLFwic2V0XCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RhcnJlZDpzd2l0Y2goYS5jdHgpe2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJzdGFycmVkIGFzc2lnbm1lbnQgdGFyZ2V0IG11c3QgYmUgaW4gYSBsaXN0IG9yIHR1cGxlXCIsXG50aGlzLmZpbGVuYW1lLGEubGluZW5vKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgdXNlIHN0YXJyZWQgZXhwcmVzc2lvbiBoZXJlXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7fWNhc2UgU2suYXN0bm9kZXMuSm9pbmVkU3RyOnJldHVybiB0aGlzLmNqb2luZWRzdHIoYSk7Y2FzZSBTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZTpyZXR1cm4gdGhpcy5jZm9ybWF0dGVkdmFsdWUoYSk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBcIithLmNvbnN0cnVjdG9yLm5hbWUrXCIgdmV4cHJcIil9fTthLnByb3RvdHlwZS52c2VxZXhwcj1mdW5jdGlvbihhLGIpe3ZhciBjO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMD09PWJ8fGEubGVuZ3RoPT09Yi5sZW5ndGgpO3ZhciBkPVtdO2ZvcihjPTA7YzxhLmxlbmd0aDsrK2MpZC5wdXNoKHRoaXMudmV4cHIoYVtjXSx2b2lkIDA9PT1iP3ZvaWQgMDpiW2NdKSk7cmV0dXJuIGR9O2EucHJvdG90eXBlLmNhdWdhc3NpZ249XG5mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuQXVnQXNzaWduKTt2YXIgYj1hLnRhcmdldDtzd2l0Y2goYi5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5BdHRyaWJ1dGU6dmFyIGM9dGhpcy52ZXhwcihiLnZhbHVlKTtiPW5ldyBTay5hc3Rub2Rlcy5BdHRyaWJ1dGUoYi52YWx1ZSxiLmF0dHIsU2suYXN0bm9kZXMuQXVnTG9hZCxiLmxpbmVubyxiLmNvbF9vZmZzZXQpO3ZhciBkPXRoaXMudmV4cHIoYix2b2lkIDAsYyk7dmFyIGU9dGhpcy52ZXhwcihhLnZhbHVlKTthPXRoaXMuX2dyKFwiaW5wbGJpbm9wYXR0clwiLFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKFwiLGQsXCIsXCIsZSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtiLmN0eD1Tay5hc3Rub2Rlcy5BdWdTdG9yZTtyZXR1cm4gdGhpcy52ZXhwcihiLGEsYyk7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6Yz10aGlzLnZleHByKGIudmFsdWUpO3ZhciBmPVxudGhpcy52c2xpY2VzdWIoYi5zbGljZSk7Yj1uZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGIudmFsdWUsZixTay5hc3Rub2Rlcy5BdWdMb2FkLGIubGluZW5vLGIuY29sX29mZnNldCk7ZD10aGlzLnZleHByKGIsdm9pZCAwLGMsZik7ZT10aGlzLnZleHByKGEudmFsdWUpO2E9dGhpcy5fZ3IoXCJpbnBsYmlub3BzdWJzY3JcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixkLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIik7Yi5jdHg9U2suYXN0bm9kZXMuQXVnU3RvcmU7cmV0dXJuIHRoaXMudmV4cHIoYixhLGMsZik7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnJldHVybiBjPXRoaXMubmFtZW9wKGIuaWQsU2suYXN0bm9kZXMuTG9hZCksZT10aGlzLnZleHByKGEudmFsdWUpLGE9dGhpcy5fZ3IoXCJpbnBsYmlub3BcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixjLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIiksdGhpcy5uYW1lb3AoYi5pZCxcblNrLmFzdG5vZGVzLlN0b3JlLGEpO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gYXVnYXNzaWduXCIpfX07YS5wcm90b3R5cGUuZXhwckNvbnN0YW50PWZ1bmN0aW9uKGEpe3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk51bTpyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEubik/MTowO2Nhc2UgU2suYXN0bm9kZXMuU3RyOnJldHVybiBTay5taXNjZXZhbC5pc1RydWUoYS5zKT8xOjA7ZGVmYXVsdDpyZXR1cm4tMX19O2EucHJvdG90eXBlLm5ld0Jsb2NrPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudS5ibG9ja251bSsrO3RoaXMudS5ibG9ja3NbYl09W107dGhpcy51LmJsb2Nrc1tiXS5fbmFtZT1hfHxcIjx1bm5hbWVkPlwiO3RoaXMudS5ibG9ja3NbYl0uX25leHQ9bnVsbDtyZXR1cm4gYn07YS5wcm90b3R5cGUuc2V0QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5jdXJibG9jaz1cbmF9O2EucHJvdG90eXBlLnB1c2hCcmVha0Jsb2NrPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KDA8PWEmJmE8dGhpcy51LmJsb2NrbnVtKTt0aGlzLnUuYnJlYWtCbG9ja3MucHVzaChhKX07YS5wcm90b3R5cGUucG9wQnJlYWtCbG9jaz1mdW5jdGlvbigpe3RoaXMudS5icmVha0Jsb2Nrcy5wb3AoKX07YS5wcm90b3R5cGUucHVzaENvbnRpbnVlQmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5jb250aW51ZUJsb2Nrcy5wdXNoKGEpfTthLnByb3RvdHlwZS5wb3BDb250aW51ZUJsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmNvbnRpbnVlQmxvY2tzLnBvcCgpfTthLnByb3RvdHlwZS5wdXNoRXhjZXB0QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5leGNlcHRCbG9ja3MucHVzaChhKX07YS5wcm90b3R5cGUucG9wRXhjZXB0QmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnUuZXhjZXB0QmxvY2tzLnBvcCgpfTtcbmEucHJvdG90eXBlLnB1c2hGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg9PT10aGlzLnUuY29udGludWVCbG9ja3MubGVuZ3RoKTt0aGlzLnUuZmluYWxseUJsb2Nrcy5wdXNoKHtibGs6YSxicmVha0RlcHRoOnRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGh9KX07YS5wcm90b3R5cGUucG9wRmluYWxseUJsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmZpbmFsbHlCbG9ja3MucG9wKCl9O2EucHJvdG90eXBlLnBlZWtGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGg/dGhpcy51LmZpbmFsbHlCbG9ja3NbdGhpcy51LmZpbmFsbHlCbG9ja3MubGVuZ3RoLTFdOnZvaWQgMH07YS5wcm90b3R5cGUuc2V0dXBFeGNlcHQ9ZnVuY3Rpb24oYSl7bChcIiRleGMucHVzaChcIixhLFwiKTtcIil9O2EucHJvdG90eXBlLmVuZEV4Y2VwdD1cbmZ1bmN0aW9uKCl7bChcIiRleGMucG9wKCk7XCIpfTthLnByb3RvdHlwZS5vdXRwdXRMb2NhbHM9ZnVuY3Rpb24oYSl7dmFyIGIsYz17fTtmb3IoYj0wO2EuYXJnbmFtZXMmJmI8YS5hcmduYW1lcy5sZW5ndGg7KytiKWNbYS5hcmduYW1lc1tiXV09ITA7YS5sb2NhbG5hbWVzLnNvcnQoKTt2YXIgZD1bXTtmb3IoYj0wO2I8YS5sb2NhbG5hbWVzLmxlbmd0aDsrK2Ipe3ZhciBlPWEubG9jYWxuYW1lc1tiXTt2b2lkIDA9PT1jW2VdJiYoZC5wdXNoKGUpLGNbZV09ITApfXJldHVybiAwPGQubGVuZ3RoP1widmFyIFwiK2Quam9pbihcIixcIikrXCI7IC8qIGxvY2FscyAqL1wiOlwiXCJ9O2EucHJvdG90eXBlLm91dHB1dFN1c3BlbnNpb25IZWxwZXJzPWZ1bmN0aW9uKGEpe3ZhciBiLGM9W10sZD1hLmxvY2FsbmFtZXMuY29uY2F0KGEudGVtcHNUb1NhdmUpLGU9e30sZj1hLnN0ZS5ibG9ja1R5cGU9PT1Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2smJmEuc3RlLmNoaWxkSGFzRnJlZSxoPSgwPGQubGVuZ3RoP1xuXCJ2YXIgXCIrZC5qb2luKFwiLFwiKStcIjtcIjpcIlwiKStcInZhciAkd2FrZUZyb21TdXNwZW5zaW9uID0gZnVuY3Rpb24oKSB7dmFyIHN1c3AgPSBcIithLnNjb3BlbmFtZStcIi4kd2FraW5nU3VzcGVuc2lvbjsgXCIrYS5zY29wZW5hbWUrXCIuJHdha2luZ1N1c3BlbnNpb24gPSB1bmRlZmluZWQ7JGJsaz1zdXNwLiRibGs7ICRsb2M9c3VzcC4kbG9jOyAkZ2JsPXN1c3AuJGdibDsgJGV4Yz1zdXNwLiRleGM7ICRlcnI9c3VzcC4kZXJyOyAkcG9zdGZpbmFsbHk9c3VzcC4kcG9zdGZpbmFsbHk7JGN1cnJMaW5lTm89c3VzcC4kbGluZW5vOyAkY3VyckNvbE5vPXN1c3AuJGNvbG5vOyBTay5sYXN0WWllbGQ9RGF0ZS5ub3coKTtcIisoZj9cIiRjZWxsPXN1c3AuJGNlbGw7XCI6XCJcIik7Zm9yKGI9MDtiPGQubGVuZ3RoO2IrKyl7dmFyIGw9ZFtiXTt2b2lkIDA9PT1lW2xdJiYoaCs9bCtcIj1zdXNwLiR0bXBzLlwiK2wrXCI7XCIsZVtsXT0hMCl9aCs9XCJ0cnkgeyAkcmV0PXN1c3AuY2hpbGQucmVzdW1lKCk7IH0gY2F0Y2goZXJyKSB7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrXG50aGlzLmZpbGVuYW1lK1wiJ30pOyBpZigkZXhjLmxlbmd0aD4wKSB7ICRlcnI9ZXJyOyAkYmxrPSRleGMucG9wKCk7IH0gZWxzZSB7IHRocm93IGVycjsgfSB9fTtcIjtoKz1cInZhciAkc2F2ZVN1c3BlbnNpb24gPSBmdW5jdGlvbigkY2hpbGQsICRmaWxlbmFtZSwgJGxpbmVubywgJGNvbG5vKSB7dmFyIHN1c3AgPSBuZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbigpOyBzdXNwLmNoaWxkPSRjaGlsZDtzdXNwLnJlc3VtZT1mdW5jdGlvbigpe1wiK2Euc2NvcGVuYW1lK1wiLiR3YWtpbmdTdXNwZW5zaW9uPXN1c3A7IHJldHVybiBcIithLnNjb3BlbmFtZStcIihcIisoYS5zdGUuZ2VuZXJhdG9yP1wiJGdlblwiOlwiXCIpK1wiKTsgfTtzdXNwLmRhdGE9c3VzcC5jaGlsZC5kYXRhO3N1c3AuJGJsaz0kYmxrO3N1c3AuJGxvYz0kbG9jO3N1c3AuJGdibD0kZ2JsO3N1c3AuJGV4Yz0kZXhjO3N1c3AuJGVycj0kZXJyO3N1c3AuJHBvc3RmaW5hbGx5PSRwb3N0ZmluYWxseTtzdXNwLiRmaWxlbmFtZT0kZmlsZW5hbWU7c3VzcC4kbGluZW5vPSRsaW5lbm87c3VzcC4kY29sbm89JGNvbG5vO3N1c3Aub3B0aW9uYWw9c3VzcC5jaGlsZC5vcHRpb25hbDtcIitcbihmP1wic3VzcC4kY2VsbD0kY2VsbDtcIjpcIlwiKTtlPXt9O2ZvcihiPTA7YjxkLmxlbmd0aDtiKyspbD1kW2JdLHZvaWQgMD09PWVbbF0mJihjLnB1c2goJ1wiJytsKydcIjonK2wpLGVbbF09ITApO3JldHVybiBoKz1cInN1c3AuJHRtcHM9e1wiK2Muam9pbihcIixcIikrXCJ9O3JldHVybiBzdXNwO307XCJ9O2EucHJvdG90eXBlLm91dHB1dEFsbFVuaXRzPWZ1bmN0aW9uKCl7dmFyIGEsYixjPVwiXCI7Zm9yKGI9MDtiPHRoaXMuYWxsVW5pdHMubGVuZ3RoOysrYil7dmFyIGU9dGhpcy5hbGxVbml0c1tiXTtjKz1lLnByZWZpeENvZGU7Yys9dGhpcy5vdXRwdXRMb2NhbHMoZSk7ZS5kb2VzU3VzcGVuZCYmKGMrPXRoaXMub3V0cHV0U3VzcGVuc2lvbkhlbHBlcnMoZSkpO2MrPWUudmFyRGVjbHNDb2RlO2MrPWUuc3dpdGNoQ29kZTt2YXIgZj1lLmJsb2Nrczt2YXIgaD1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihhPTA7YTxmLmxlbmd0aDsrK2Epe3ZhciBsPWE7aWYoIShsIGluIGgpKWZvcig7OylpZihoW2xdPVxuITAsYys9XCJjYXNlIFwiK2wrXCI6IC8qIC0tLSBcIitmW2xdLl9uYW1lK1wiIC0tLSAqL1wiLGMrPWZbbF0uam9pbihcIlwiKSxudWxsIT09ZltsXS5fbmV4dClpZihmW2xdLl9uZXh0IGluIGgpe2MrPVwiLyoganVtcCAqLyBjb250aW51ZTtcIjticmVha31lbHNlIGMrPVwiLyogYWxsb3dpbmcgY2FzZSBmYWxsdGhyb3VnaCAqL1wiLGw9ZltsXS5fbmV4dDtlbHNle2MrPVwidGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3lzdGVtRXJyb3IoJ2ludGVybmFsIGVycm9yOiB1bnRlcm1pbmF0ZWQgYmxvY2snKTtcIjticmVha319Yys9ZS5zdWZmaXhDb2RlfXJldHVybiBjfTthLnByb3RvdHlwZS5jaWY9ZnVuY3Rpb24oYSl7dmFyIGI7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLklmKTt2YXIgYz10aGlzLmV4cHJDb25zdGFudChhLnRlc3QpO2lmKDA9PT1jKWEub3JlbHNlJiYwPGEub3JlbHNlLmxlbmd0aCYmdGhpcy52c2Vxc3RtdChhLm9yZWxzZSk7ZWxzZSBpZigxPT09Yyl0aGlzLnZzZXFzdG10KGEuYm9keSk7XG5lbHNle3ZhciBkPXRoaXMubmV3QmxvY2soXCJlbmQgb2YgaWZcIik7YS5vcmVsc2UmJjA8YS5vcmVsc2UubGVuZ3RoJiYoYj10aGlzLm5ld0Jsb2NrKFwibmV4dCBicmFuY2ggb2YgaWZcIikpO2M9dGhpcy52ZXhwcihhLnRlc3QpO2Eub3JlbHNlJiYwPGEub3JlbHNlLmxlbmd0aD8odGhpcy5fanVtcGZhbHNlKGMsYiksdGhpcy52c2Vxc3RtdChhLmJvZHkpLHRoaXMuX2p1bXAoZCksdGhpcy5zZXRCbG9jayhiKSx0aGlzLnZzZXFzdG10KGEub3JlbHNlKSk6KHRoaXMuX2p1bXBmYWxzZShjLGQpLHRoaXMudnNlcXN0bXQoYS5ib2R5KSk7dGhpcy5fanVtcChkKTt0aGlzLnNldEJsb2NrKGQpfX07YS5wcm90b3R5cGUuY3doaWxlPWZ1bmN0aW9uKGEpe2lmKDA9PT10aGlzLmV4cHJDb25zdGFudChhLnRlc3QpKWEub3JlbHNlJiZ0aGlzLnZzZXFzdG10KGEub3JlbHNlKTtlbHNle3ZhciBiPXRoaXMubmV3QmxvY2soXCJ3aGlsZSB0ZXN0XCIpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTtcbnZhciBjPXRoaXMubmV3QmxvY2soXCJhZnRlciB3aGlsZVwiKTt2YXIgZD0wPGEub3JlbHNlLmxlbmd0aD90aGlzLm5ld0Jsb2NrKFwid2hpbGUgb3JlbHNlXCIpOm51bGw7dmFyIGU9dGhpcy5uZXdCbG9jayhcIndoaWxlIGJvZHlcIik7dGhpcy5hbm5vdGF0ZVNvdXJjZShhKTt0aGlzLl9qdW1wZmFsc2UodGhpcy52ZXhwcihhLnRlc3QpLGQ/ZDpjKTt0aGlzLl9qdW1wKGUpO3RoaXMucHVzaEJyZWFrQmxvY2soYyk7dGhpcy5wdXNoQ29udGludWVCbG9jayhiKTt0aGlzLnNldEJsb2NrKGUpOyhTay5kZWJ1Z2dpbmd8fFNrLmtpbGxhYmxlV2hpbGUpJiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGU9dGhpcy5uZXdCbG9jayhcImRlYnVnIGJyZWFrcG9pbnQgZm9yIGxpbmUgXCIrYS5saW5lbm8pLGwoXCJpZiAoU2suYnJlYWtwb2ludHMoJ1wiK3RoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIikpIHtcIixcInZhciAkc3VzcCA9ICRzYXZlU3VzcGVuc2lvbih7ZGF0YToge3R5cGU6ICdTay5kZWxheSd9LCByZXN1bWU6IGZ1bmN0aW9uKCkge319LCAnXCIrXG50aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2UrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpLHRoaXMuX2p1bXAoZSksdGhpcy5zZXRCbG9jayhlKSx0aGlzLnUuZG9lc1N1c3BlbmQ9ITApO3RoaXMudnNlcXN0bXQoYS5ib2R5KTt0aGlzLl9qdW1wKGIpO3RoaXMucG9wQ29udGludWVCbG9jaygpO3RoaXMucG9wQnJlYWtCbG9jaygpOzA8YS5vcmVsc2UubGVuZ3RoJiYodGhpcy5zZXRCbG9jayhkKSx0aGlzLnZzZXFzdG10KGEub3JlbHNlKSx0aGlzLl9qdW1wKGMpKTt0aGlzLnNldEJsb2NrKGMpfX07YS5wcm90b3R5cGUuY2Zvcj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLm5ld0Jsb2NrKFwiZm9yIHN0YXJ0XCIpLGM9dGhpcy5uZXdCbG9jayhcImZvciBjbGVhbnVwXCIpLGQ9dGhpcy5uZXdCbG9jayhcImZvciBlbmRcIik7dGhpcy5wdXNoQnJlYWtCbG9jayhkKTt0aGlzLnB1c2hDb250aW51ZUJsb2NrKGIpO1xudmFyIGU9dGhpcy52ZXhwcihhLml0ZXIpO2lmKHRoaXMudS5zdGUuZ2VuZXJhdG9yKXt2YXIgZj1cIiRsb2MuXCIrdGhpcy5nZW5zeW0oXCJpdGVyXCIpO2woZixcIj1Tay5hYnN0ci5pdGVyKFwiLGUsXCIpO1wiKX1lbHNlIGY9dGhpcy5fZ3IoXCJpdGVyXCIsXCJTay5hYnN0ci5pdGVyKFwiLGUsXCIpXCIpLHRoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKGYpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLGYsdGhpcy51LmNhblN1c3BlbmQ/XCIsIHRydWVcIjpcIiwgZmFsc2VcIixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtmPXRoaXMuX2dyKFwibmV4dFwiLFwiJHJldFwiKTt0aGlzLl9qdW1wdW5kZWYoZixjKTt0aGlzLnZleHByKGEudGFyZ2V0LGYpOyhTay5kZWJ1Z2dpbmd8fFNrLmtpbGxhYmxlRm9yKSYmdGhpcy51LmNhblN1c3BlbmQmJihmPXRoaXMubmV3QmxvY2soXCJkZWJ1ZyBicmVha3BvaW50IGZvciBsaW5lIFwiK2EubGluZW5vKSxsKFwiaWYgKFNrLmJyZWFrcG9pbnRzKCdcIitcbnRoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIikpIHtcIixcInZhciAkc3VzcCA9ICRzYXZlU3VzcGVuc2lvbih7ZGF0YToge3R5cGU6ICdTay5kZWxheSd9LCByZXN1bWU6IGZ1bmN0aW9uKCkge319LCAnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKTtcIixcIiRzdXNwLiRibGsgPSBcIitmK1wiO1wiLFwiJHN1c3Aub3B0aW9uYWwgPSB0cnVlO1wiLFwicmV0dXJuICRzdXNwO1wiLFwifVwiKSx0aGlzLl9qdW1wKGYpLHRoaXMuc2V0QmxvY2soZiksdGhpcy51LmRvZXNTdXNwZW5kPSEwKTt0aGlzLnZzZXFzdG10KGEuYm9keSk7dGhpcy5fanVtcChiKTt0aGlzLnNldEJsb2NrKGMpO3RoaXMucG9wQ29udGludWVCbG9jaygpO3RoaXMucG9wQnJlYWtCbG9jaygpO3RoaXMudnNlcXN0bXQoYS5vcmVsc2UpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhkKX07YS5wcm90b3R5cGUuY3JhaXNlPWZ1bmN0aW9uKGEpe2lmKGEuZXhjKXt2YXIgYj1cbnRoaXMuX2dyKFwiZXhjXCIsdGhpcy52ZXhwcihhLmV4YykpLGM9dGhpcy5uZXdCbG9jayhcImV4Y2VwdGlvbiBub3cgaW5zdGFudGlhdGVkXCIpLGQ9dGhpcy5fZ3IoXCJpc2NsYXNzXCIsYitcIi5wcm90b3R5cGUgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb25cIik7dGhpcy5fanVtcGZhbHNlKGQsYyk7YS5pbnN0PyhkPXRoaXMuX2dyKFwiaW5zdFwiLHRoaXMudmV4cHIoYS5pbnN0KSksbChcImlmKCEoXCIsZCxcIiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKSB7XCIsZCxcIj0gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW1wiLGQsXCJdKTtcIixcIn1cIiksbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYixcIixcIixkLFwiLnYpO1wiKSk6bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kKFwiLGIsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7bChiLFwiPSRyZXQ7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTtsKFwiaWYgKFwiLGIsXG5cIiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikge3Rocm93IFwiLGIsXCI7fSBlbHNlIHt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoJ2V4Y2VwdGlvbnMgbXVzdCBkZXJpdmUgZnJvbSBCYXNlRXhjZXB0aW9uJyk7fTtcIil9ZWxzZSBsKFwidGhyb3cgJGVycjtcIil9O2EucHJvdG90eXBlLm91dHB1dEZpbmFsbHlDYXNjYWRlPWZ1bmN0aW9uKGEpe2lmKDA9PXRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aClsKFwiaWYoJHBvc3RmaW5hbGx5IT09dW5kZWZpbmVkKSB7IGlmICgkcG9zdGZpbmFsbHkucmV0dXJuaW5nKSB7IHJldHVybiAkcG9zdGZpbmFsbHkucmV0dXJuaW5nOyB9IGVsc2UgeyAkYmxrPSRwb3N0ZmluYWxseS5nb3RvQmxvY2s7ICRwb3N0ZmluYWxseT11bmRlZmluZWQ7IGNvbnRpbnVlOyB9IH1cIik7ZWxzZXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtsKFwiaWYoJHBvc3RmaW5hbGx5IT09dW5kZWZpbmVkKSB7XCIsXCJpZiAoJHBvc3RmaW5hbGx5LnJldHVybmluZ1wiLFxuYi5icmVha0RlcHRoPT1hLmJyZWFrRGVwdGg/XCJ8fCAkcG9zdGZpbmFsbHkuaXNCcmVha1wiOlwiXCIsXCIpIHtcIixcIiRibGs9XCIsYi5ibGssXCI7Y29udGludWU7XCIsXCJ9IGVsc2Uge1wiLFwiJGJsaz0kcG9zdGZpbmFsbHkuZ290b0Jsb2NrOyRwb3N0ZmluYWxseT11bmRlZmluZWQ7Y29udGludWU7XCIsXCJ9XCIsXCJ9XCIpfX07YS5wcm90b3R5cGUuY3RyeT1mdW5jdGlvbihhKXt2YXIgYixjPWEuaGFuZGxlcnMubGVuZ3RoO2lmKGEuZmluYWxib2R5KXt2YXIgZD10aGlzLm5ld0Jsb2NrKFwiZmluYWxib2R5XCIpO3ZhciBlPXRoaXMubmV3QmxvY2soXCJmaW5hbGV4aFwiKTt2YXIgZj10aGlzLl9ncihcImZpbmFsbHlfcmVyYWlzZVwiLFwidW5kZWZpbmVkXCIpO3RoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKGYpO3RoaXMucHVzaEZpbmFsbHlCbG9jayhkKTt2YXIgaD10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTt0aGlzLnNldHVwRXhjZXB0KGUpfXZhciBtPVtdO2ZvcihiPTA7YjxjOysrYiltLnB1c2godGhpcy5uZXdCbG9jayhcImV4Y2VwdF9cIitcbmIrXCJfXCIpKTt2YXIgcT10aGlzLm5ld0Jsb2NrKFwidW5oYW5kbGVkXCIpO3ZhciBCPXRoaXMubmV3QmxvY2soXCJvcmVsc2VcIik7dmFyIEQ9dGhpcy5uZXdCbG9jayhcImVuZFwiKTswIT1tLmxlbmd0aCYmdGhpcy5zZXR1cEV4Y2VwdChtWzBdKTt0aGlzLnZzZXFzdG10KGEuYm9keSk7MCE9bS5sZW5ndGgmJnRoaXMuZW5kRXhjZXB0KCk7dGhpcy5fanVtcChCKTtmb3IoYj0wO2I8YzsrK2Ipe3RoaXMuc2V0QmxvY2sobVtiXSk7dmFyIEU9YS5oYW5kbGVyc1tiXTtpZighRS50eXBlJiZiPGMtMSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImRlZmF1bHQgJ2V4Y2VwdDonIG11c3QgYmUgbGFzdFwiLHRoaXMuZmlsZW5hbWUsRS5saW5lbm8pO2lmKEUudHlwZSl7dmFyIEY9dGhpcy52ZXhwcihFLnR5cGUpO3ZhciBNPWI9PWMtMT9xOm1bYisxXTtGPXRoaXMuX2dyKFwiaW5zdGFuY2VcIixcIlNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzaW5zdGFuY2UoJGVyciwgXCIsRixcIikpXCIpO1xudGhpcy5fanVtcGZhbHNlKEYsTSl9RS5uYW1lJiZ0aGlzLnZleHByKEUubmFtZSxcIiRlcnJcIik7dGhpcy52c2Vxc3RtdChFLmJvZHkpO3RoaXMuX2p1bXAoRCl9dGhpcy5zZXRCbG9jayhxKTtsKFwidGhyb3cgJGVycjtcIik7dGhpcy5zZXRCbG9jayhCKTt0aGlzLnZzZXFzdG10KGEub3JlbHNlKTt0aGlzLl9qdW1wKEQpO3RoaXMuc2V0QmxvY2soRCk7YS5maW5hbGJvZHkmJih0aGlzLmVuZEV4Y2VwdCgpLHRoaXMuX2p1bXAoZCksdGhpcy5zZXRCbG9jayhlKSxsKGYsXCI9JGVycjtcIiksdGhpcy5fanVtcChkKSx0aGlzLnNldEJsb2NrKGQpLHRoaXMucG9wRmluYWxseUJsb2NrKCksdGhpcy52c2Vxc3RtdChhLmZpbmFsYm9keSksbChcImlmKFwiLGYsXCIhPT11bmRlZmluZWQpIHsgdGhyb3cgXCIsZixcIjt9XCIpLHRoaXMub3V0cHV0RmluYWxseUNhc2NhZGUoaCkpfTthLnByb3RvdHlwZS5jd2l0aD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMubmV3QmxvY2soXCJ3aXRoZXhoXCIpLGQ9dGhpcy5uZXdCbG9jayhcIndpdGh0aWR5dXBcIiksXG5lPXRoaXMubmV3QmxvY2soXCJ3aXRoY2FycnlvblwiKTt2YXIgZj10aGlzLl9ncihcIm1nclwiLHRoaXMudmV4cHIoYS5pdGVtc1tiXS5jb250ZXh0X2V4cHIpKTtsKFwiJHJldCA9IFNrLmFic3RyLmxvb2t1cFNwZWNpYWwoXCIsZixcIixTay5idWlsdGluLnN0ci4kZXhpdCk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt2YXIgZz10aGlzLl9ncihcImV4aXRcIixcIiRyZXRcIik7dGhpcy51LnRlbXBzVG9TYXZlLnB1c2goZyk7bChcIiRyZXQgPSBTay5hYnN0ci5sb29rdXBTcGVjaWFsKFwiLGYsXCIsU2suYnVpbHRpbi5zdHIuJGVudGVyKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2woXCIkcmV0ID0gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KCRyZXQpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7Zj10aGlzLl9ncihcInZhbHVlXCIsXCIkcmV0XCIpO3RoaXMucHVzaEZpbmFsbHlCbG9jayhkKTt2YXIgaD10aGlzLnUuZmluYWxseUJsb2Nrc1t0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGgtXG4xXTt0aGlzLnNldHVwRXhjZXB0KGMpO2EuaXRlbXNbYl0ub3B0aW9uYWxfdmFycyYmdGhpcy5uYW1lb3AoYS5pdGVtc1tiXS5vcHRpb25hbF92YXJzLmlkLFNrLmFzdG5vZGVzLlN0b3JlLGYpO2IrMTxhLml0ZW1zLmxlbmd0aD90aGlzLmN3aXRoKGEsYisxKTp0aGlzLnZzZXFzdG10KGEuYm9keSk7dGhpcy5lbmRFeGNlcHQoKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soYyk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChcIixnLFwiLHVuZGVmaW5lZCxTay5idWlsdGluLmdldEV4Y0luZm8oJGVyciksdW5kZWZpbmVkLFtdKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO3RoaXMuX2p1bXB0cnVlKFwiJHJldFwiLGUpO2woXCJ0aHJvdyAkZXJyO1wiKTt0aGlzLnNldEJsb2NrKGQpO3RoaXMucG9wRmluYWxseUJsb2NrKCk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsZyxcIixbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtcIik7XG50aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7dGhpcy5vdXRwdXRGaW5hbGx5Q2FzY2FkZShoKTt0aGlzLl9qdW1wKGUpO3RoaXMuc2V0QmxvY2soZSl9O2EucHJvdG90eXBlLmNhc3NlcnQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52ZXhwcihhLnRlc3QpLGM9dGhpcy5uZXdCbG9jayhcImVuZFwiKTt0aGlzLl9qdW1wdHJ1ZShiLGMpO2woXCJ0aHJvdyBuZXcgU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcihcIixhLm1zZz90aGlzLnZleHByKGEubXNnKTpcIlwiLFwiKTtcIik7dGhpcy5zZXRCbG9jayhjKX07YS5wcm90b3R5cGUuY2ltcG9ydGFzPWZ1bmN0aW9uKGEsYixjKXthPWEudjt2YXIgZD1hLmluZGV4T2YoXCIuXCIpLGU9YztpZigtMSE9PWQpZm9yKGE9YS5zdWJzdHIoZCsxKTstMSE9PWQ7KWQ9YS5pbmRleE9mKFwiLlwiKSxjPS0xIT09ZD9hLnN1YnN0cigwLGQpOmEsZT10aGlzLl9ncihcImxhdHRyXCIsXCJTay5hYnN0ci5nYXR0cihcIixlLFwiLCBuZXcgU2suYnVpbHRpbi5zdHIoJ1wiLGMsXCInKSlcIiksYT1cbmEuc3Vic3RyKGQrMSk7cmV0dXJuIHRoaXMubmFtZW9wKGIsU2suYXN0bm9kZXMuU3RvcmUsZSl9O2EucHJvdG90eXBlLmNpbXBvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz1hLm5hbWVzLmxlbmd0aDtmb3IoYj0wO2I8YzsrK2Ipe3ZhciBkPWEubmFtZXNbYl07bChcIiRyZXQgPSBTay5idWlsdGluLl9faW1wb3J0X18oXCIsZC5uYW1lLiRyKCkudixcIiwkZ2JsLCRsb2MsW10sXCIsU2suX19mdXR1cmVfXy5hYnNvbHV0ZV9pbXBvcnQ/MDotMSxcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt2YXIgZT10aGlzLl9ncihcIm1vZHVsZVwiLFwiJHJldFwiKTtpZihkLmFzbmFtZSl0aGlzLmNpbXBvcnRhcyhkLm5hbWUsZC5hc25hbWUsZSk7ZWxzZXt2YXIgZj1kLm5hbWU7ZD1mLnYuaW5kZXhPZihcIi5cIik7LTEhPT1kJiYoZj1uZXcgU2suYnVpbHRpbi5zdHIoZi52LnN1YnN0cigwLGQpKSk7dGhpcy5uYW1lb3AoZixTay5hc3Rub2Rlcy5TdG9yZSxlKX19fTthLnByb3RvdHlwZS5jZnJvbWltcG9ydD1cbmZ1bmN0aW9uKGEpe3ZhciBjLGQ9YS5uYW1lcy5sZW5ndGg7dmFyIGU9W107dmFyIGY9YS5sZXZlbDswIT1mfHxTay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydHx8KGY9LTEpO2ZvcihjPTA7YzxkOysrYyllW2NdPVwiJ1wiK2IoYS5uYW1lc1tjXS5uYW1lLnYpK1wiJ1wiO2woXCIkcmV0ID0gU2suYnVpbHRpbi5fX2ltcG9ydF9fKFwiLGEubW9kdWxlLiRyKCkudixcIiwkZ2JsLCRsb2MsW1wiLGUsXCJdLFwiLGYsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7Zj10aGlzLl9ncihcIm1vZHVsZVwiLFwiJHJldFwiKTtmb3IoYz0wO2M8ZDsrK2Mpe2U9YS5uYW1lc1tjXTt2YXIgaD1cIidcIitlLm5hbWUuditcIidcIjtpZigwPT09YyYmXCIqXCI9PT1lLm5hbWUudil7U2suYXNzZXJ0cy5hc3NlcnQoMT09PWQpO2woXCJTay5pbXBvcnRTdGFyKFwiLGYsXCIsJGxvYywgJGdibCk7XCIpO2JyZWFrfXZhciBtPXRoaXMuX2dyKFwiaXRlbVwiLFwiU2suYWJzdHIuZ2F0dHIoXCIsZixcIiwgbmV3IFNrLmJ1aWx0aW4uc3RyKFwiLGgsXG5cIiksIHVuZGVmaW5lZClcIik7aD1lLm5hbWU7ZS5hc25hbWUmJihoPWUuYXNuYW1lKTt0aGlzLm5hbWVvcChoLFNrLmFzdG5vZGVzLlN0b3JlLG0pfX07YS5wcm90b3R5cGUuYnVpbGRjb2Rlb2JqPWZ1bmN0aW9uKGEsYyxmLGssaCxtKXt2YXIgZD1bXSxnPVtdLG49W10scD1bXSxxPW51bGwsdT1udWxsO2YmJihnPXRoaXMudnNlcWV4cHIoZikpO2smJmsuZGVmYXVsdHMmJihuPXRoaXMudnNlcWV4cHIoay5kZWZhdWx0cykpO2smJmsua3dfZGVmYXVsdHMmJihwPWsua3dfZGVmYXVsdHMubWFwKGE9PmE/dGhpcy52ZXhwcihhKTpcInVuZGVmaW5lZFwiKSk7ayYmay52YXJhcmcmJihxPWsudmFyYXJnKTtrJiZrLmt3YXJnJiYodT1rLmt3YXJnKTtpZighU2suX19mdXR1cmVfXy5weXRob24zJiZrJiZrLmt3b25seWFyZ3MmJjAhPWsua3dvbmx5YXJncy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJLZXl3b3JkLW9ubHkgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO1xudmFyIEY9dGhpcy5lbnRlclNjb3BlKGMsYSxhLmxpbmVubyx0aGlzLmNhblN1c3BlbmQpO2Y9dGhpcy51LnN0ZS5nZW5lcmF0b3I7dmFyIE09dGhpcy51LnN0ZS5oYXNGcmVlO3ZhciBWPXRoaXMudS5zdGUuY2hpbGRIYXNGcmVlO3ZhciB5PXRoaXMubmV3QmxvY2soXCJjb2Rlb2JqIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK0YrXCI9KGZ1bmN0aW9uIFwiK3RoaXMubmljZU5hbWUoYy52KStcIiQoXCI7dmFyIEc9W107aWYoZil7aWYodSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLnYrXCIoKToga2V5d29yZCBhcmd1bWVudHMgaW4gZ2VuZXJhdG9ycyBub3Qgc3VwcG9ydGVkXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7aWYocSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLnYrXCIoKTogdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBnZW5lcmF0b3JzIG5vdCBzdXBwb3J0ZWRcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtHLnB1c2goXCIkZ2VuXCIpfWVsc2V7dSYmXG4oRy5wdXNoKFwiJGt3YVwiKSx0aGlzLnUudGVtcHNUb1NhdmUucHVzaChcIiRrd2FcIikpO2ZvcihhPTA7ayYmYTxrLmFyZ3MubGVuZ3RoOysrYSlHLnB1c2godGhpcy5uYW1lb3Aoay5hcmdzW2FdLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSkpO2ZvcihhPTA7ayYmay5rd29ubHlhcmdzJiZhPGsua3dvbmx5YXJncy5sZW5ndGg7KythKUcucHVzaCh0aGlzLm5hbWVvcChrLmt3b25seWFyZ3NbYV0uYXJnLFNrLmFzdG5vZGVzLlBhcmFtKSk7cSYmRy5wdXNoKHRoaXMubmFtZW9wKGsudmFyYXJnLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSkpfWxldCBMPSFmO00mJihMfHxHLnB1c2goXCIkZnJlZVwiKSx0aGlzLnUudGVtcHNUb1NhdmUucHVzaChcIiRmcmVlXCIpKTt0aGlzLnUucHJlZml4Q29kZT1MP3RoaXMudS5wcmVmaXhDb2RlK1wiJHBvc2FyZ3MsJGt3YXJnc1wiOnRoaXMudS5wcmVmaXhDb2RlK0cuam9pbihcIixcIik7dGhpcy51LnByZWZpeENvZGUrPVwiKXtcIjtmJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gZ2VuZXJhdG9yXFxuXCIpO1xuTSYmKHRoaXMudS5wcmVmaXhDb2RlKz1cIlxcbi8vIGhhcyBmcmVlXFxuXCIpO1YmJih0aGlzLnUucHJlZml4Q29kZSs9XCJcXG4vLyBoYXMgY2VsbFxcblwiKTtMJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gZmFzdCBjYWxsXFxuXCIpO3ZhciBUPVwie31cIjtmJiYoeT1cIiRnZW4uZ2kkcmVzdW1lYXRcIixUPVwiJGdlbi5naSRsb2NhbHNcIik7YT1cIiwkY2VsbD17fVwiO1YmJmYmJihhPVwiLCRjZWxsPSRnZW4uZ2kkY2VsbHNcIik7dGhpcy51LnZhckRlY2xzQ29kZSs9XCJ2YXIgJGJsaz1cIit5K1wiLCRleGM9W10sJGxvYz1cIitUK2ErXCIsJGdibD1cIisoTD9cInRoaXMgJiYgdGhpcy5mdW5jX2dsb2JhbHNcIjpcInRoaXNcIikrKEwmJk0/XCIsJGZyZWU9dGhpcyAmJiB0aGlzLmZ1bmNfY2xvc3VyZVwiOlwiXCIpK1wiLCRlcnI9dW5kZWZpbmVkLCRyZXQ9dW5kZWZpbmVkLCRwb3N0ZmluYWxseT11bmRlZmluZWQsJGN1cnJMaW5lTm89dW5kZWZpbmVkLCRjdXJyQ29sTm89dW5kZWZpbmVkO1wiO251bGwhPT1Tay5leGVjTGltaXQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cblwiaWYgKHR5cGVvZiBTay5leGVjU3RhcnQgPT09ICd1bmRlZmluZWQnKSB7U2suZXhlY1N0YXJ0ID0gRGF0ZS5ub3coKX1cIik7bnVsbCE9PVNrLnlpZWxkTGltaXQmJnRoaXMudS5jYW5TdXNwZW5kJiYodGhpcy51LnZhckRlY2xzQ29kZSs9XCJpZiAodHlwZW9mIFNrLmxhc3RZaWVsZCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5sYXN0WWllbGQgPSBEYXRlLm5vdygpfVwiKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmIChcIitGK1wiLiR3YWtpbmdTdXNwZW5zaW9uIT09dW5kZWZpbmVkKSB7ICR3YWtlRnJvbVN1c3BlbnNpb24oKTsgfSBlbHNlIHtcIjtpZihMKXt0aGlzLnUudmFyRGVjbHNDb2RlPXV8fHF8fGsmJmsua3dvbmx5YXJncyYmMCE9PWsua3dvbmx5YXJncy5sZW5ndGg/dGhpcy51LnZhckRlY2xzQ29kZStcIlxcbnZhciAkYXJncyA9IHRoaXMuJHJlc29sdmVBcmdzKCRwb3NhcmdzLCRrd2FyZ3MpXFxuXCI6dGhpcy51LnZhckRlY2xzQ29kZSsoXCJ2YXIgJGFyZ3MgPSAoKCEka3dhcmdzIHx8ICRrd2FyZ3MubGVuZ3RoPT09MCkgJiYgJHBvc2FyZ3MubGVuZ3RoPT09XCIrXG5HLmxlbmd0aCtcIikgPyAkcG9zYXJncyA6IHRoaXMuJHJlc29sdmVBcmdzKCRwb3NhcmdzLCRrd2FyZ3MpXCIpO2ZvcihhPTA7YTxHLmxlbmd0aDthKyspdGhpcy51LnZhckRlY2xzQ29kZSs9XCIsXCIrR1thXStcIj0kYXJnc1tcIithK1wiXVwiO3RoaXMudS52YXJEZWNsc0NvZGUrPVwiO1xcblwifWlmKGYmJjA8bi5sZW5ndGgpZm9yKHk9ay5hcmdzLmxlbmd0aC1uLmxlbmd0aCxhPTA7YTxuLmxlbmd0aDsrK2EpRz10aGlzLm5hbWVvcChrLmFyZ3NbYSt5XS5hcmcsU2suYXN0bm9kZXMuUGFyYW0pLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYoXCIrRytcIj09PXVuZGVmaW5lZClcIitHK1wiPVwiK0YrXCIuJGRlZmF1bHRzW1wiK2ErXCJdO1wiO2ZvcihhPTA7ayYmYTxrLmFyZ3MubGVuZ3RoOysrYSlHPWsuYXJnc1thXS5hcmcsdGhpcy5pc0NlbGwoRykmJihHPWIoZSh0aGlzLnUucHJpdmF0ZV8sRykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIitHK1wiPVwiK0crXCI7XCIpO2ZvcihhPTA7ayYmay5rd29ubHlhcmdzJiZcbmE8ay5rd29ubHlhcmdzLmxlbmd0aDsrK2EpRz1rLmt3b25seWFyZ3NbYV0uYXJnLHRoaXMuaXNDZWxsKEcpJiYoRz1iKGUodGhpcy51LnByaXZhdGVfLEcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrRytcIj1cIitHK1wiO1wiKTtxJiZ0aGlzLmlzQ2VsbChxLmFyZykmJihhPWIoZSh0aGlzLnUucHJpdmF0ZV8scS5hcmcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrYStcIj1cIithK1wiO1wiKTt1JiYodGhpcy51LmxvY2FsbmFtZXMucHVzaCh1LmFyZy52KSx0aGlzLnUudmFyRGVjbHNDb2RlKz11LmFyZy52K1wiPW5ldyBTay5idWlsdGluc1snZGljdCddKCRrd2EpO1wiLHRoaXMuaXNDZWxsKHUuYXJnKSYmKGE9YihlKHRoaXMudS5wcml2YXRlXyx1LmFyZykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIithK1wiPVwiK2ErXCI7XCIpKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cIn1cIjtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJm0mJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cblwiJGdibC5fX2NsYXNzX189JGdibC5cIittLnYrXCI7XCIpO3RoaXMudS5zd2l0Y2hDb2RlPVwid2hpbGUodHJ1ZSl7dHJ5e1wiO3RoaXMudS5zd2l0Y2hDb2RlKz10aGlzLm91dHB1dEludGVycnVwdFRlc3QoKTt0aGlzLnUuc3dpdGNoQ29kZSs9XCJzd2l0Y2goJGJsayl7XCI7dGhpcy51LnN1ZmZpeENvZGU9XCJ9IH1jYXRjaChlcnIpeyBpZiAoIShlcnIgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb24pKSB7IGVyciA9IG5ldyBTay5idWlsdGluLkV4dGVybmFsRXJyb3IoZXJyKTsgfSBlcnIudHJhY2ViYWNrLnB1c2goe2xpbmVubzogJGN1cnJMaW5lTm8sIGNvbG5vOiAkY3VyckNvbE5vLCBmaWxlbmFtZTogJ1wiK3RoaXMuZmlsZW5hbWUrXCInfSk7IGlmICgkZXhjLmxlbmd0aD4wKSB7ICRlcnIgPSBlcnI7ICRibGs9JGV4Yy5wb3AoKTsgY29udGludWU7IH0gZWxzZSB7IHRocm93IGVycjsgfX0gfX0pO1wiO2guY2FsbCh0aGlzLEYpO2lmKGspe2ZvcihsZXQgYSBvZiBrLmFyZ3MpZC5wdXNoKGEuYXJnLnYpO1xuZm9yKGxldCBhIG9mIGsua3dvbmx5YXJnc3x8W10pZC5wdXNoKGEuYXJnLnYpO3RoaXMudS5hcmduYW1lcz1kfXRoaXMuZXhpdFNjb3BlKCk7MDxuLmxlbmd0aCYmbChGLFwiLiRkZWZhdWx0cz1bXCIsbi5qb2luKFwiLFwiKSxcIl07XCIpO2smJmsua3dvbmx5YXJncyYmMDxrLmt3b25seWFyZ3MubGVuZ3RoJiYobChGLFwiLmNvX2FyZ2NvdW50PVwiLGsuYXJncy5sZW5ndGgsXCI7XCIpLGwoRixcIi5jb19rd29ubHlhcmdjb3VudD1cIixrLmt3b25seWFyZ3MubGVuZ3RoLFwiO1wiKSxsKEYsXCIuJGt3ZGVmcz1bXCIscC5qb2luKFwiLFwiKSxcIl07XCIpKTswPGQubGVuZ3RoP2woRixcIi5jb192YXJuYW1lcz1bJ1wiLGQuam9pbihcIicsJ1wiKSxcIiddO1wiKTpsKEYsXCIuY29fdmFybmFtZXM9W107XCIpO3UmJmwoRixcIi5jb19rd2FyZ3M9MTtcIik7cSYmbChGLFwiLmNvX3ZhcmFyZ3M9MTtcIik7Znx8bChGLFwiLmNvX2Zhc3RjYWxsPTE7XCIpO2g9XCJcIjtNJiYoaD1cIiwkY2VsbFwiLChtPXRoaXMudS5zdGUuaGFzRnJlZSkmJihoKz1cIiwkZnJlZVwiKSk7XG5pZihmKXJldHVybiBrJiYwPGsuYXJncy5sZW5ndGg/dGhpcy5fZ3IoXCJnZW5lclwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKChmdW5jdGlvbigpe3ZhciAkb3JpZ2FyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJcIixjLnYsJ1wiLGFyZ3VtZW50cy5sZW5ndGgsJyxrLmFyZ3MubGVuZ3RoLW4ubGVuZ3RoLFwiLFwiLGsuYXJncy5sZW5ndGgsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbnNbJ2dlbmVyYXRvciddKFwiLEYsXCIsJGdibCwkb3JpZ2FyZ3NcIixoLFwiKTt9KSlcIik6dGhpcy5fZ3IoXCJnZW5lclwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKChmdW5jdGlvbigpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIlwiLGMudixcIlxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApO3JldHVybiBuZXcgU2suYnVpbHRpbnNbJ2dlbmVyYXRvciddKFwiLEYsXCIsJGdibCxbXVwiLGgsXCIpO30pKVwiKTtpZigwPGcubGVuZ3RoKXtsKFwiJHJldCA9IG5ldyBTay5idWlsdGluc1snZnVuY3Rpb24nXShcIixcbkYsXCIsJGdibFwiLGgsXCIpO1wiKTtmb3IobGV0IGEgb2YgZy5yZXZlcnNlKCkpbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYSxcIixbJHJldF0pO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKTtyZXR1cm4gdGhpcy5fZ3IoXCJmdW5jb2JqXCIsXCIkcmV0XCIpfXJldHVybiB0aGlzLl9ncihcImZ1bmNvYmpcIixcIm5ldyBTay5idWlsdGluc1snZnVuY3Rpb24nXShcIixGLFwiLCRnYmxcIixoLFwiKVwiKX07YS5wcm90b3R5cGUuY2Z1bmN0aW9uPWZ1bmN0aW9uKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmKTtiPXRoaXMuYnVpbGRjb2Rlb2JqKGEsYS5uYW1lLGEuZGVjb3JhdG9yX2xpc3QsYS5hcmdzLGZ1bmN0aW9uKGIpe3RoaXMudnNlcXN0bXQoYS5ib2R5KTtsKFwicmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtcIil9LGIpO3RoaXMubmFtZW9wKGEubmFtZSxTay5hc3Rub2Rlcy5TdG9yZSxiKX07YS5wcm90b3R5cGUuY2xhbWJkYT1cbmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5MYW1iZGEpO3JldHVybiB0aGlzLmJ1aWxkY29kZW9iaihhLG5ldyBTay5idWlsdGluLnN0cihcIjxsYW1iZGE+XCIpLG51bGwsYS5hcmdzLGZ1bmN0aW9uKGIpe2I9dGhpcy52ZXhwcihhLmJvZHkpO2woXCJyZXR1cm4gXCIsYixcIjtcIil9KX07YS5wcm90b3R5cGUuY2lmZXhwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmV3QmxvY2soXCJuZXh0IG9mIGlmZXhwXCIpLGM9dGhpcy5uZXdCbG9jayhcImVuZCBvZiBpZmV4cFwiKSxkPXRoaXMuX2dyKFwicmVzXCIsXCJudWxsXCIpLGU9dGhpcy52ZXhwcihhLnRlc3QpO3RoaXMuX2p1bXBmYWxzZShlLGIpO2woZCxcIj1cIix0aGlzLnZleHByKGEuYm9keSksXCI7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhiKTtsKGQsXCI9XCIsdGhpcy52ZXhwcihhLm9yZWxzZSksXCI7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTtyZXR1cm4gZH07YS5wcm90b3R5cGUuY2dlbmV4cGdlbj1cbmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLm5ld0Jsb2NrKFwic3RhcnQgZm9yIFwiK2IpLGU9dGhpcy5uZXdCbG9jayhcInNraXAgZm9yIFwiK2IpO3RoaXMubmV3QmxvY2soXCJpZiBjbGVhbnVwIGZvciBcIitiKTt2YXIgZj10aGlzLm5ld0Jsb2NrKFwiZW5kIGZvciBcIitiKSxnPWFbYl07aWYoMD09PWIpdmFyIGg9XCIkbG9jLiRpdGVyMFwiO2Vsc2V7dmFyIG09dGhpcy52ZXhwcihnLml0ZXIpO2g9XCIkbG9jLlwiK3RoaXMuZ2Vuc3ltKFwiaXRlclwiKTtsKGgsXCI9XCIsXCJTay5hYnN0ci5pdGVyKFwiLG0sXCIpO1wiKX10aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCk7dGhpcy5hbm5vdGF0ZVNvdXJjZShjKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLGgsdGhpcy51LmNhblN1c3BlbmQ/XCIsIHRydWVcIjpcIiwgZmFsc2VcIixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihjKTttPXRoaXMuX2dyKFwibmV4dFwiLFwiJHJldFwiKTt0aGlzLl9qdW1wdW5kZWYobSxmKTt0aGlzLnZleHByKGcudGFyZ2V0LFxubSk7dmFyIG49Zy5pZnM/Zy5pZnMubGVuZ3RoOjA7Zm9yKGg9MDtoPG47KytoKXRoaXMuYW5ub3RhdGVTb3VyY2UoZy5pZnNbaF0pLG09dGhpcy52ZXhwcihnLmlmc1toXSksdGhpcy5fanVtcGZhbHNlKG0sZCk7KytiPGEubGVuZ3RoJiZ0aGlzLmNnZW5leHBnZW4oYSxiLGMpO2I+PWEubGVuZ3RoJiYodGhpcy5hbm5vdGF0ZVNvdXJjZShjKSxhPXRoaXMudmV4cHIoYyksbChcInJldHVybiBbXCIsZSxcIi8qcmVzdW1lKi8sXCIsYSxcIi8qcmV0Ki9dO1wiKSx0aGlzLnNldEJsb2NrKGUpKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZik7MT09PWImJmwoXCJyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO1wiKX07YS5wcm90b3R5cGUuY2dlbmV4cD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmJ1aWxkY29kZW9iaihhLG5ldyBTay5idWlsdGluLnN0cihcIjxnZW5leHByPlwiKSxudWxsLG51bGwsZnVuY3Rpb24oYil7dGhpcy5jZ2VuZXhwZ2VuKGEuZ2VuZXJhdG9ycywwLGEuZWx0KX0pO2I9dGhpcy5fZ3IoXCJnZW5lclwiLFxuXCJTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoXCIsYixcIik7XCIpO2woYixcIi5naSRsb2NhbHMuJGl0ZXIwPVNrLmFic3RyLml0ZXIoXCIsdGhpcy52ZXhwcihhLmdlbmVyYXRvcnNbMF0uaXRlciksXCIpO1wiKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY2NsYXNzPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5DbGFzc0RlZik7dmFyIGI9dGhpcy52c2VxZXhwcihhLmRlY29yYXRvcl9saXN0KTt2YXIgYz10aGlzLnZzZXFleHByKGEuYmFzZXMpO3ZhciBkPXRoaXMuZW50ZXJTY29wZShhLm5hbWUsYSxhLmxpbmVubyk7dmFyIGU9dGhpcy5uZXdCbG9jayhcImNsYXNzIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK2QrXCI9KGZ1bmN0aW9uICRcIithLm5hbWUuditcIiRjbGFzc19vdXRlcigkZ2xvYmFscywkbG9jYWxzLCRjZWxsKXt2YXIgJGdibD0kZ2xvYmFscywkbG9jPSRsb2NhbHM7JGZyZWU9JGdsb2JhbHM7XCI7dGhpcy51LnN3aXRjaENvZGUrPVxuXCIoZnVuY3Rpb24gJFwiK2EubmFtZS52K1wiJF9jbG9zdXJlKCRjZWxsKXtcIjt0aGlzLnUuc3dpdGNoQ29kZSs9XCJ2YXIgJGJsaz1cIitlK1wiLCRleGM9W10sJHJldD11bmRlZmluZWQsJHBvc3RmaW5hbGx5PXVuZGVmaW5lZCwkY3VyckxpbmVObz11bmRlZmluZWQsJGN1cnJDb2xObz11bmRlZmluZWQ7XCI7bnVsbCE9PVNrLmV4ZWNMaW1pdCYmKHRoaXMudS5zd2l0Y2hDb2RlKz1cImlmICh0eXBlb2YgU2suZXhlY1N0YXJ0ID09PSAndW5kZWZpbmVkJykge1NrLmV4ZWNTdGFydCA9IERhdGUubm93KCl9XCIpO251bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmKHRoaXMudS5zd2l0Y2hDb2RlKz1cImlmICh0eXBlb2YgU2subGFzdFlpZWxkID09PSAndW5kZWZpbmVkJykge1NrLmxhc3RZaWVsZCA9IERhdGUubm93KCl9XCIpO3RoaXMudS5zd2l0Y2hDb2RlKz1cIndoaWxlKHRydWUpe3RyeXtcIjt0aGlzLnUuc3dpdGNoQ29kZSs9dGhpcy5vdXRwdXRJbnRlcnJ1cHRUZXN0KCk7dGhpcy51LnN3aXRjaENvZGUrPVxuXCJzd2l0Y2goJGJsayl7XCI7dGhpcy51LnN1ZmZpeENvZGU9XCJ9fWNhdGNoKGVycil7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrdGhpcy5maWxlbmFtZStcIid9KTsgaWYgKCRleGMubGVuZ3RoPjApIHsgJGVyciA9IGVycjsgJGJsaz0kZXhjLnBvcCgpOyBjb250aW51ZTsgfSBlbHNlIHsgdGhyb3cgZXJyOyB9fX1cIjt0aGlzLnUuc3VmZml4Q29kZSs9XCJ9KS5jYWxsKG51bGwsICRjZWxsKTt9KTtcIjt0aGlzLnUucHJpdmF0ZV89YS5uYW1lO3RoaXMuY2JvZHkoYS5ib2R5LGEubmFtZSk7bChcInJldHVybjtcIik7dGhpcy5leGl0U2NvcGUoKTtsKFwiJHJldCA9IFNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoJGdibCxcIixkLFwiLFwiLGEubmFtZS4kcigpLnYsXG5cIixbXCIsYyxcIl0sICRjZWxsKTtcIik7Zm9yKGxldCBhIG9mIGIpbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYSxcIiwgWyRyZXRdKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCk7dGhpcy5uYW1lb3AoYS5uYW1lLFNrLmFzdG5vZGVzLlN0b3JlLFwiJHJldFwiKX07YS5wcm90b3R5cGUuY2NvbnRpbnVlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGVla0ZpbmFsbHlCbG9jaygpO2lmKDA9PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCInY29udGludWUnIG91dHNpZGUgbG9vcFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2E9dGhpcy51LmNvbnRpbnVlQmxvY2tzW3RoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgtMV07U2suYXNzZXJ0cy5hc3NlcnQodGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aD09PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgpO2ImJmIuYnJlYWtEZXB0aD09dGhpcy51LmNvbnRpbnVlQmxvY2tzLmxlbmd0aD9cbmwoXCIkcG9zdGZpbmFsbHk9e2lzQnJlYWs6dHJ1ZSxnb3RvQmxvY2s6XCIsYSxcIn07XCIpOnRoaXMuX2p1bXAoYSl9O2EucHJvdG90eXBlLmNicmVhaz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtpZigwPT09dGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidicmVhaycgb3V0c2lkZSBsb29wXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YT10aGlzLnUuYnJlYWtCbG9ja3NbdGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aC0xXTtiJiZiLmJyZWFrRGVwdGg9PXRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg/bChcIiRwb3N0ZmluYWxseT17aXNCcmVhazp0cnVlLGdvdG9CbG9jazpcIixhLFwifTtcIik6dGhpcy5fanVtcChhKX07YS5wcm90b3R5cGUudnN0bXQ9ZnVuY3Rpb24oYSxiKXt0aGlzLnUubGluZW5vPWEubGluZW5vO3RoaXMudS5saW5lbm9TZXQ9ITE7dGhpcy51LmxvY2FsdGVtcHM9W107aWYoU2suZGVidWdnaW5nJiZcbnRoaXMudS5jYW5TdXNwZW5kKXt2YXIgYz10aGlzLm5ld0Jsb2NrKFwiZGVidWcgYnJlYWtwb2ludCBmb3IgbGluZSBcIithLmxpbmVubyk7bChcImlmIChTay5icmVha3BvaW50cygnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKSkge1wiLFwidmFyICRzdXNwID0gJHNhdmVTdXNwZW5zaW9uKHtkYXRhOiB7dHlwZTogJ1NrLmRlYnVnJ30sIHJlc3VtZTogZnVuY3Rpb24oKSB7fX0sICdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2MrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTt0aGlzLnUuZG9lc1N1c3BlbmQ9ITB9dGhpcy5hbm5vdGF0ZVNvdXJjZShhKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZjp0aGlzLmNmdW5jdGlvbihhLGIpO1xuYnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5DbGFzc0RlZjp0aGlzLmNjbGFzcyhhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlJldHVybjppZih0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidyZXR1cm4nIG91dHNpZGUgZnVuY3Rpb25cIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtjPWEudmFsdWU/dGhpcy52ZXhwcihhLnZhbHVlKTpcIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOzA9PXRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aD9sKFwicmV0dXJuIFwiLGMsXCI7XCIpOihsKFwiJHBvc3RmaW5hbGx5PXtyZXR1cm5pbmc6XCIsYyxcIn07XCIpLHRoaXMuX2p1bXAodGhpcy5wZWVrRmluYWxseUJsb2NrKCkuYmxrKSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWxldGU6dGhpcy52c2VxZXhwcihhLnRhcmdldHMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXNzaWduOnZhciBkPWEudGFyZ2V0cy5sZW5ndGg7XG5jPXRoaXMudmV4cHIoYS52YWx1ZSk7Zm9yKGI9MDtiPGQ7KytiKXRoaXMudmV4cHIoYS50YXJnZXRzW2JdLGMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQW5uQXNzaWduOmM9dGhpcy52ZXhwcihhLnZhbHVlKTt0aGlzLnZleHByKGEudGFyZ2V0LGMpO3RoaXMudmV4cHIoYS5hbm5vdGF0aW9uKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF1Z0Fzc2lnbjpyZXR1cm4gdGhpcy5jYXVnYXNzaWduKGEpO2Nhc2UgU2suYXN0bm9kZXMuUHJpbnQ6dGhpcy5jcHJpbnQoYSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3I6cmV0dXJuIHRoaXMuY2ZvcihhKTtjYXNlIFNrLmFzdG5vZGVzLldoaWxlOnJldHVybiB0aGlzLmN3aGlsZShhKTtjYXNlIFNrLmFzdG5vZGVzLklmOnJldHVybiB0aGlzLmNpZihhKTtjYXNlIFNrLmFzdG5vZGVzLlJhaXNlOnJldHVybiB0aGlzLmNyYWlzZShhKTtjYXNlIFNrLmFzdG5vZGVzLlRyeTpyZXR1cm4gdGhpcy5jdHJ5KGEpO2Nhc2UgU2suYXN0bm9kZXMuV2l0aDpyZXR1cm4gdGhpcy5jd2l0aChhLFxuMCk7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NlcnQ6cmV0dXJuIHRoaXMuY2Fzc2VydChhKTtjYXNlIFNrLmFzdG5vZGVzLkltcG9ydDpyZXR1cm4gdGhpcy5jaW1wb3J0KGEpO2Nhc2UgU2suYXN0bm9kZXMuSW1wb3J0RnJvbTpyZXR1cm4gdGhpcy5jZnJvbWltcG9ydChhKTtjYXNlIFNrLmFzdG5vZGVzLkdsb2JhbDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4cHI6dGhpcy52ZXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhc3M6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5CcmVhazp0aGlzLmNicmVhayhhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNvbnRpbnVlOnRoaXMuY2NvbnRpbnVlKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVidWdnZXI6bChcImRlYnVnZ2VyO1wiKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlIGluIHZzdG10OiBcIitKU09OLnN0cmluZ2lmeShhKSl9fTthLnByb3RvdHlwZS52c2Vxc3RtdD1mdW5jdGlvbihhKXt2YXIgYjtcbmZvcihiPTA7YjxhLmxlbmd0aDsrK2IpdGhpcy52c3RtdChhW2JdKX07YS5wcm90b3R5cGUuaXNDZWxsPWZ1bmN0aW9uKGEpe2E9YihlKHRoaXMudS5wcml2YXRlXyxhKS52KTtyZXR1cm4gdGhpcy51LnN0ZS5nZXRTY29wZShhKT09PVNrLlNZTVRBQl9DT05TVFMuQ0VMTH07YS5wcm90b3R5cGUubmFtZW9wPWZ1bmN0aW9uKGEsYyxmKXtpZigoYz09PVNrLmFzdG5vZGVzLlN0b3JlfHxjPT09U2suYXN0bm9kZXMuQXVnU3RvcmV8fGM9PT1Tay5hc3Rub2Rlcy5EZWwpJiZcIl9fZGVidWdfX1wiPT09YS52KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuIG5vdCBhc3NpZ24gdG8gX19kZWJ1Z19fXCIsdGhpcy5maWxlbmFtZSx0aGlzLnUubGluZW5vKTtTay5hc3NlcnRzLmFzc2VydChcIk5vbmVcIiE9PWEudik7aWYoXCJOb3RJbXBsZW1lbnRlZFwiPT09YS52KXJldHVyblwiU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCRcIjt2YXIgZD1lKHRoaXMudS5wcml2YXRlXyxcbmEpLnY7ZD1iKGQpO3ZhciBnPTM7dmFyIGg9dGhpcy51LnN0ZS5nZXRTY29wZShkKTt2YXIgbT1udWxsO3N3aXRjaChoKXtjYXNlIFNrLlNZTVRBQl9DT05TVFMuRlJFRTptPVwiJGZyZWVcIjtnPTI7YnJlYWs7Y2FzZSBTay5TWU1UQUJfQ09OU1RTLkNFTEw6bT1cIiRjZWxsXCI7Zz0yO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5MT0NBTDp0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9ja3x8dGhpcy51LnN0ZS5nZW5lcmF0b3J8fChnPTApO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5HTE9CQUxfSU1QTElDSVQ6dGhpcy51LnN0ZS5ibG9ja1R5cGU9PT1Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2smJihnPTEpO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5HTE9CQUxfRVhQTElDSVQ6Zz0xfVNrLmFzc2VydHMuYXNzZXJ0KGh8fFwiX1wiPT09YS52LmNoYXJBdCgxKSk7YT1kO3RoaXMudS5zdGUuZ2VuZXJhdG9yfHx0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVxuU2suU1lNVEFCX0NPTlNUUy5GdW5jdGlvbkJsb2NrP2Q9XCIkbG9jLlwiK2Q6KDA9PT1nfHwzPT09ZykmJnRoaXMudS5sb2NhbG5hbWVzLnB1c2goZCk7c3dpdGNoKGcpe2Nhc2UgMDpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOmNhc2UgU2suYXN0bm9kZXMuUGFyYW06cmV0dXJuIGwoXCJpZiAoXCIsZCxcIiA9PT0gdW5kZWZpbmVkKSB7IHRocm93IG5ldyBTay5idWlsdGluLlVuYm91bmRMb2NhbEVycm9yKCdsb2NhbCB2YXJpYWJsZSBcXFxcJ1wiLGQsXCJcXFxcJyByZWZlcmVuY2VkIGJlZm9yZSBhc3NpZ25tZW50Jyk7IH1cXG5cIiksZDtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoZCxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlIFwiLGQsXCI7XCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkXCIpfWJyZWFrO2Nhc2UgMzpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOnJldHVybiB0aGlzLl9ncihcImxvYWRuYW1lXCIsZCxcblwiIT09dW5kZWZpbmVkP1wiLGQsXCI6U2subWlzY2V2YWwubG9hZG5hbWUoJ1wiLGEsXCInLCRnYmwpO1wiKTtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoZCxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlIFwiLGQsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFyYW06cmV0dXJuIGQ7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWRcIil9YnJlYWs7Y2FzZSAxOnN3aXRjaChjKXtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6cmV0dXJuIHRoaXMuX2dyKFwibG9hZGdibFwiLFwiU2subWlzY2V2YWwubG9hZG5hbWUoJ1wiLGEsXCInLCRnYmwpXCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChcIiRnYmwuXCIsYSxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlICRnYmwuXCIsYSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBpbiBuYW1lIG9wX2dsb2JhbFwiKX1icmVhaztjYXNlIDI6c3dpdGNoKGMpe2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gbStcblwiLlwiK2E7Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTpsKG0sXCIuXCIsYSxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhcmFtOnJldHVybiBhO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gbmFtZSBvcF9kZXJlZlwiKX1icmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlXCIpfX07YS5wcm90b3R5cGUuZW50ZXJTY29wZT1mdW5jdGlvbihhLGIsZSxmKXt2YXIgZD1uZXcgYztkLnN0ZT10aGlzLnN0LmdldFN0c0ZvckFzdChiKTtkLm5hbWU9YTtkLmZpcnN0bGluZW5vPWU7ZC5jYW5TdXNwZW5kPWZ8fCExO3RoaXMudSYmdGhpcy51LnByaXZhdGVfJiYoZC5wcml2YXRlXz10aGlzLnUucHJpdmF0ZV8pO3RoaXMuc3RhY2sucHVzaCh0aGlzLnUpO3RoaXMuYWxsVW5pdHMucHVzaChkKTthPXRoaXMuZ2Vuc3ltKFwic2NvcGVcIik7ZC5zY29wZW5hbWU9YTt0aGlzLnU9ZDt0aGlzLnUuYWN0aXZhdGVTY29wZSgpO3RoaXMubmVzdGxldmVsKys7XG5yZXR1cm4gYX07YS5wcm90b3R5cGUuZXhpdFNjb3BlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51O3RoaXMubmVzdGxldmVsLS07KHRoaXMudT0wPD10aGlzLnN0YWNrLmxlbmd0aC0xP3RoaXMuc3RhY2sucG9wKCk6bnVsbCkmJnRoaXMudS5hY3RpdmF0ZVNjb3BlKCk7aWYoXCI8bW9kdWxlPlwiIT09YS5uYW1lLnYpe3ZhciBiPWEubmFtZS4kcigpLnY7Yj1iLnN1YnN0cmluZygxLGIubGVuZ3RoLTEpO2woYS5zY29wZW5hbWUsXCIuY29fbmFtZT1uZXcgU2suYnVpbHRpbnNbJ3N0ciddKCdcIixiLFwiJyk7XCIpO3RoaXMuc3RhY2subGVuZ3RoJiZcImNsYXNzXCI9PXRoaXMudS5zdGUuYmxvY2tUeXBlJiZsKGEuc2NvcGVuYW1lLFwiLmNvX3F1YWxuYW1lPW5ldyBTay5idWlsdGluc1snc3RyJ10oJ1wiK3RoaXMudS5uYW1lLnYrXCIuXCIrYitcIicpO1wiKX1mb3IodmFyIGMgaW4gYS5jb25zdHMpYS5jb25zdHMuaGFzT3duUHJvcGVydHkoYykmJihhLnN1ZmZpeENvZGUrPWMrXCIgPSBcIithLmNvbnN0c1tjXStcIjtcIil9O1xuYS5wcm90b3R5cGUuY2JvZHk9ZnVuY3Rpb24oYSxiKXt2YXIgYztmb3IoYz0wO2M8YS5sZW5ndGg7KytjKXRoaXMudnN0bXQoYVtjXSxiKX07YS5wcm90b3R5cGUuY3ByaW50PWZ1bmN0aW9uKGEpe3ZhciBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5QcmludCk7YS5kZXN0JiZ0aGlzLnZleHByKGEuZGVzdCk7dmFyIGM9YS52YWx1ZXMubGVuZ3RoO2ZvcihiPTA7YjxjOysrYilsKFwiJHJldCA9IFNrLm1pc2NldmFsLnByaW50XyhcIixcIm5ldyBTay5idWlsdGluc1snc3RyJ10oXCIsdGhpcy52ZXhwcihhLnZhbHVlc1tiXSksXCIpLnYpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YS5ubCYmKGwoXCIkcmV0ID0gU2subWlzY2V2YWwucHJpbnRfKFwiLCdcIlxcXFxuXCIpOycpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKSl9O2EucHJvdG90eXBlLmNtb2Q9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lbnRlclNjb3BlKG5ldyBTay5idWlsdGluLnN0cihcIjxtb2R1bGU+XCIpLFxuYSwwLHRoaXMuY2FuU3VzcGVuZCksYz10aGlzLm5ld0Jsb2NrKFwibW9kdWxlIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK2IrXCI9KGZ1bmN0aW9uKCRmb3JjZWdibCl7XCI7dGhpcy51LnZhckRlY2xzQ29kZT1cInZhciAkZ2JsID0gJGZvcmNlZ2JsIHx8IHt9LCAkYmxrPVwiK2MrXCIsJGV4Yz1bXSwkbG9jPSRnYmwsJGNlbGw9e30sJGVycj11bmRlZmluZWQ7JGxvYy5fX2ZpbGVfXz1uZXcgU2suYnVpbHRpbnMuc3RyKCdcIit0aGlzLmZpbGVuYW1lK1wiJyk7dmFyICRyZXQ9dW5kZWZpbmVkLCRwb3N0ZmluYWxseT11bmRlZmluZWQsJGN1cnJMaW5lTm89dW5kZWZpbmVkLCRjdXJyQ29sTm89dW5kZWZpbmVkO1wiO251bGwhPT1Tay5leGVjTGltaXQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmICh0eXBlb2YgU2suZXhlY1N0YXJ0ID09PSAndW5kZWZpbmVkJykge1NrLmV4ZWNTdGFydCA9IERhdGUubm93KCl9XCIpO251bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmXG4odGhpcy51LnZhckRlY2xzQ29kZSs9XCJpZiAodHlwZW9mIFNrLmxhc3RZaWVsZCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5sYXN0WWllbGQgPSBEYXRlLm5vdygpfVwiKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmIChcIitiK1wiLiR3YWtpbmdTdXNwZW5zaW9uIT09dW5kZWZpbmVkKSB7ICR3YWtlRnJvbVN1c3BlbnNpb24oKTsgfWlmIChTay5yZXRhaW5HbG9iYWxzKSB7ICAgIGlmIChTay5nbG9iYWxzKSB7ICRnYmwgPSBTay5nbG9iYWxzOyBTay5nbG9iYWxzID0gJGdibDsgJGxvYyA9ICRnYmw7IH0gICAgaWYgKFNrLmdsb2JhbHMpIHsgJGdibCA9IFNrLmdsb2JhbHM7IFNrLmdsb2JhbHMgPSAkZ2JsOyAkbG9jID0gJGdibDsgJGxvYy5fX2ZpbGVfXz1uZXcgU2suYnVpbHRpbnMuc3RyKCdcIit0aGlzLmZpbGVuYW1lK1wiJyk7fSAgICBlbHNlIHsgU2suZ2xvYmFscyA9ICRnYmw7IH19IGVsc2UgeyBTay5nbG9iYWxzID0gJGdibDsgfVwiO3RoaXMudS5zd2l0Y2hDb2RlPVwid2hpbGUodHJ1ZSl7dHJ5e1wiO1xudGhpcy51LnN3aXRjaENvZGUrPXRoaXMub3V0cHV0SW50ZXJydXB0VGVzdCgpO3RoaXMudS5zd2l0Y2hDb2RlKz1cInN3aXRjaCgkYmxrKXtcIjt0aGlzLnUuc3VmZml4Q29kZT1cIn1cIjt0aGlzLnUuc3VmZml4Q29kZSs9XCJ9Y2F0Y2goZXJyKXsgaWYgKCEoZXJyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uKSkgeyBlcnIgPSBuZXcgU2suYnVpbHRpbi5FeHRlcm5hbEVycm9yKGVycik7IH0gZXJyLnRyYWNlYmFjay5wdXNoKHtsaW5lbm86ICRjdXJyTGluZU5vLCBjb2xubzogJGN1cnJDb2xObywgZmlsZW5hbWU6ICdcIit0aGlzLmZpbGVuYW1lK1wiJ30pOyBpZiAoJGV4Yy5sZW5ndGg+MCkgeyAkZXJyID0gZXJyOyAkYmxrPSRleGMucG9wKCk7IGNvbnRpbnVlOyB9IGVsc2UgeyB0aHJvdyBlcnI7IH19IH0gfSk7XCI7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuTW9kdWxlOnRoaXMuY2JvZHkoYS5ib2R5KTtsKFwicmV0dXJuICRsb2M7XCIpO2JyZWFrO1xuZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvOyB1bmhhbmRsZWQgY2FzZSBpbiBjb21waWxlck1vZFwiKX10aGlzLmV4aXRTY29wZSgpO3RoaXMucmVzdWx0LnB1c2godGhpcy5vdXRwdXRBbGxVbml0cygpKTtyZXR1cm4gYn07U2suY29tcGlsZT1mdW5jdGlvbihiLGMsZSxmKXtlPVNrLl9fZnV0dXJlX187U2suX19mdXR1cmVfXz1PYmplY3QuY3JlYXRlKFNrLl9fZnV0dXJlX18pO3ZhciBkPVNrLnBhcnNlKGMsYiksZz1Tay5hc3RGcm9tUGFyc2UoZC5jc3QsYyxkLmZsYWdzKTtkPWQuZmxhZ3M7dmFyIGg9U2suc3ltYm9sdGFibGUoZyxjKTtiPW5ldyBhKGMsaCxkLGYsYik7Yz1iLmNtb2QoZyk7U2suX19mdXR1cmVfXz1lO3JldHVybntmdW5jbmFtZTpcIiRjb21waWxlZG1vZFwiLGNvZGU6XCIkY29tcGlsZWRtb2QgPSBmdW5jdGlvbigpIHtcIitiLnJlc3VsdC5qb2luKFwiXCIpK1wiXFxucmV0dXJuIFwiK2MrXCI7fSgpO1wifX07U2suZXhwb3J0U3ltYm9sKFwiU2suY29tcGlsZVwiLFNrLmNvbXBpbGUpO1xuU2sucmVzZXRDb21waWxlcj1mdW5jdGlvbigpe1NrLmdlbnN5bWNvdW50PTB9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnJlc2V0Q29tcGlsZXJcIixTay5yZXNldENvbXBpbGVyKTtTay5maXhSZXNlcnZlZD1iO1NrLmV4cG9ydFN5bWJvbChcIlNrLmZpeFJlc2VydmVkXCIsU2suZml4UmVzZXJ2ZWQpO1NrLnVuZml4UmVzZXJ2ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvX1xcJHJ3XFwkJC8sXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnVuZml4UmVzZXJ2ZWRcIixTay51bmZpeFJlc2VydmVkKTtTay5tYW5nbGVOYW1lPWU7U2suZXhwb3J0U3ltYm9sKFwiU2subWFuZ2xlTmFtZVwiLFNrLm1hbmdsZU5hbWUpO1NrLnJlc2VydmVkV29yZHNfPWg7U2suZXhwb3J0U3ltYm9sKFwiU2sucmVzZXJ2ZWRXb3Jkc19cIixTay5yZXNlcnZlZFdvcmRzXyl9LGZ1bmN0aW9uKG0scSl7U2suc3lzbW9kdWxlcz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTtTay5yZWFsc3lzcGF0aD12b2lkIDA7U2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWU9XG5mdW5jdGlvbihhLGMsYil7dmFyIGU9YS5yZXBsYWNlKC9cXC4vZyxcIi9cIiksZj1mdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC50cnlDYXRjaChmdW5jdGlvbigpe3JldHVybiBTay5yZWFkKGEpfSxmdW5jdGlvbihhKXt9KSxmdW5jdGlvbihjKXtpZih2b2lkIDAhPT1jKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoe2ZpbGVuYW1lOmEsY29kZTpjLHBhY2thZ2VQYXRoOmJ9KX0pfTt2b2lkIDA9PT1iJiYoYj1Tay5yZWFsc3lzcGF0aCk7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoYi50cCRpdGVyKCksZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGYoYS52K1wiL1wiK2UrYywhMSksZnVuY3Rpb24oYil7cmV0dXJuIGI/YjpmKGEuditcIi9cIitlK1wiL19faW5pdF9fXCIrYyxhLnYrXCIvXCIrZSl9KX0pfTtTay5pbXBvcnRTZXRVcFBhdGg9ZnVuY3Rpb24oYSl7aWYoIVNrLnJlYWxzeXNwYXRoKXt2YXIgYz1bbmV3IFNrLmJ1aWx0aW4uc3RyKFwic3JjL2J1aWx0aW5cIiksXG5uZXcgU2suYnVpbHRpbi5zdHIoXCJzcmMvbGliXCIpLG5ldyBTay5idWlsdGluLnN0cihcIi5cIildO2ZvcihhPTA7YTxTay5zeXNwYXRoLmxlbmd0aDsrK2EpYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihTay5zeXNwYXRoW2FdKSk7U2sucmVhbHN5c3BhdGg9bmV3IFNrLmJ1aWx0aW4ubGlzdChjKX19O1NrLmltcG9ydE1vZHVsZUludGVybmFsXz1mdW5jdGlvbihhLGMsYixlLGYsbCxoKXt2YXIgZCxnLG0sayxwPW51bGwscT12b2lkIDAhPT1mP2YudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbmFtZSk6dm9pZCAwLEE9dm9pZCAwIT09cT9xLnYrXCIuXCI6XCJcIix0PXZvaWQgMCE9PWY/Zi50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRwYXRoKTp2b2lkIDA7U2suaW1wb3J0U2V0VXBQYXRoKGgpO2lmKGYmJiFxKXtpZihsKXJldHVybjt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHRvIGltcG9ydCByZWxhdGl2ZSB0byBpbnZhbGlkIHBhY2thZ2UgKG5vIG5hbWUpXCIpO1xufXZvaWQgMD09PWImJihiPUErYSk7dmFyIHY9YS5zcGxpdChcIi5cIik7aWYoMTx2Lmxlbmd0aCl7dmFyIEI9di5zbGljZSgwLHYubGVuZ3RoLTEpLmpvaW4oXCIuXCIpO3A9U2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKEIsYyx2b2lkIDAsdm9pZCAwLGYsbCxoKX12YXIgRD1Tay5taXNjZXZhbC5jaGFpbihwLGZ1bmN0aW9uKG4pe3A9bjtnPVNrLnN5c21vZHVsZXMucXVpY2skbG9va3VwKG5ldyBTay5idWlsdGluLnN0cihiKSk7cmV0dXJuIHZvaWQgMCE9PWc/cHx8ZzpTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXt2YXIgYj1hO2lmKDE8di5sZW5ndGgpe2lmKCFwKXJldHVybjttPVNrLnN5c21vZHVsZXMubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihBK0IpKTtiPXZbdi5sZW5ndGgtMV07dD1tLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJHBhdGgpfWs9bmV3IFNrLmJ1aWx0aW4ubW9kdWxlO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgZSl7ZD1hK1wiLnB5XCI7dmFyIGM9XG5Tay5jb21waWxlKGUsZCxcImV4ZWNcIixoKX1lbHNlIGM9U2subWlzY2V2YWwuY2hhaW4odm9pZCAwLGZ1bmN0aW9uKCl7aWYoU2sub25CZWZvcmVJbXBvcnQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5vbkJlZm9yZUltcG9ydClyZXR1cm4gU2sub25CZWZvcmVJbXBvcnQoYSl9LGZ1bmN0aW9uKGMpe2lmKCExPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihcIkltcG9ydGluZyBcIithK1wiIGlzIG5vdCBhbGxvd2VkXCIpO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihjKTtyZXR1cm4gU2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWUoYixcIi5qc1wiLHQpfSxmdW5jdGlvbihhKXtyZXR1cm4gYT97ZnVuY25hbWU6XCIkYnVpbHRpbm1vZHVsZVwiLGNvZGU6YS5jb2RlLGZpbGVuYW1lOmEuZmlsZW5hbWUscGFja2FnZVBhdGg6YS5wYWNrYWdlUGF0aH06U2subWlzY2V2YWwuY2hhaW4oU2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWUoYixcblwiLnB5XCIsdCksZnVuY3Rpb24oYil7aWYoYT1iKXJldHVybiBTay5jb21waWxlKGEuY29kZSxhLmZpbGVuYW1lLFwiZXhlY1wiLGgpfSxmdW5jdGlvbihiKXtpZihiKXJldHVybiBiLnBhY2thZ2VQYXRoPWEucGFja2FnZVBhdGgsYn0pfSk7cmV0dXJuIGN9LGZ1bmN0aW9uKGEpe2lmKGEpe1NrLnN5c21vZHVsZXMubXAkYXNzX3N1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5zdHIoYiksayk7dmFyIGU9ay4kanM9YS5jb2RlO251bGw9PWQmJihkPWEuZmlsZW5hbWUpO251bGwhPVNrLmRhdGVTZXQmJlNrLmRhdGVTZXR8fChlPVwiU2suZXhlY1N0YXJ0ID0gU2subGFzdFlpZWxkID0gbmV3IERhdGUoKTtcXG5cIithLmNvZGUsU2suZGF0ZVNldD0hMCk7aWYoYyl7dmFyIGY9ZnVuY3Rpb24oYSl7dmFyIGIsYz1Tay5qc19iZWF1dGlmeShhKS5zcGxpdChcIlxcblwiKTtmb3IoYj0xO2I8PWMubGVuZ3RoOysrYil7dmFyIGQ9KFwiXCIrYikubGVuZ3RoO2ZvcihhPVwiXCI7NT5kOysrZClhKz1cIiBcIjtjW2ItMV09XCIvKiBcIitcbmErYitcIiAqLyBcIitjW2ItMV19cmV0dXJuIGMuam9pbihcIlxcblwiKX07ZT1mKGUpO1NrLmRlYnVnb3V0KGUpfWUrPVwiXFxuXCIrYS5mdW5jbmFtZStcIjtcIjtlPVNrLmdsb2JhbC5ldmFsKGUpO2suJGQ9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihiKSxfX2RvY19fOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCxfX3BhY2thZ2VfXzphLnBhY2thZ2VQYXRoP25ldyBTay5idWlsdGluLnN0cihiKTpCP25ldyBTay5idWlsdGluLnN0cihBK0IpOnE/cTpTay5idWlsdGluLm5vbmUubm9uZSR9O2EucGFja2FnZVBhdGgmJihrLiRkLl9fcGF0aF9fPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoYS5wYWNrYWdlUGF0aCldKSk7cmV0dXJuIGUoay4kZCl9fSxmdW5jdGlvbihiKXt2YXIgYztpZih2b2lkIDA9PT1iKXtpZihsJiYhcClyZXR1cm47dGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW1wb3J0RXJyb3IoXCJObyBtb2R1bGUgbmFtZWQgXCIrYSk7fWlmKGIhPT1rLiRkKXtmb3IoYyBpbiBrLiRkKWJbY118fFxuKGJbY109ay4kZFtjXSk7ay4kZD1ifWlmKFNrLm9uQWZ0ZXJJbXBvcnQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5vbkFmdGVySW1wb3J0KXRyeXtTay5vbkFmdGVySW1wb3J0KGEpfWNhdGNoKFYpe31pZihwKXJldHVybiBtLnRwJHNldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKHZbdi5sZW5ndGgtMV0pLGspLHA7ZiYmZi50cCRzZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihhKSxrKTtyZXR1cm4ga30pfSk7cmV0dXJuIGg/RDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coRCl9O1NrLmltcG9ydE1vZHVsZT1mdW5jdGlvbihhLGMsYil7cmV0dXJuIFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLGMsdm9pZCAwLHZvaWQgMCx2b2lkIDAsITEsYil9O1NrLmltcG9ydE1haW49ZnVuY3Rpb24oYSxjLGIpe1NrLmRhdGVTZXQ9ITE7U2suZmlsZXNMb2FkZWQ9ITE7U2suc3lzbW9kdWxlcz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTtTay5yZWFsc3lzcGF0aD1cbnZvaWQgMDtTay5yZXNldENvbXBpbGVyKCk7cmV0dXJuIFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLGMsXCJfX21haW5fX1wiLHZvaWQgMCx2b2lkIDAsITEsYil9O1NrLmltcG9ydE1haW5XaXRoQm9keT1mdW5jdGlvbihhLGMsYixlKXtTay5kYXRlU2V0PSExO1NrLmZpbGVzTG9hZGVkPSExO1NrLnN5c21vZHVsZXM9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7U2sucmVhbHN5c3BhdGg9dm9pZCAwO1NrLnJlc2V0Q29tcGlsZXIoKTtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fbWFpbl9fXCIsYix2b2lkIDAsITEsZSl9O1NrLmltcG9ydEJ1aWx0aW5XaXRoQm9keT1mdW5jdGlvbihhLGMsYixlKXtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fYnVpbHRpbl9fLlwiK2EsYix2b2lkIDAsITEsZSl9O1NrLmJ1aWx0aW4uX19pbXBvcnRfXz1mdW5jdGlvbihhLGMsYixlLGYpe3ZhciBsPVNrLmdsb2JhbHMsaDt2b2lkIDA9PT1mJiYoZj1Tay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydD9cbjA6LTEpO2lmKDAhPT1mJiZjLl9fcGFja2FnZV9fJiZjLl9fcGFja2FnZV9fIT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXtpZigoaD1jLl9fcGFja2FnZV9fLnYpJiYwPGYpe2M9aC5zcGxpdChcIi5cIik7aWYoZi0xPj1jLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBiZXlvbmQgdG9wbGV2ZWwgcGFja2FnZVwiKTtjLmxlbmd0aC09Zi0xO2g9Yy5qb2luKFwiLlwiKX12YXIgZD1Tay5zeXNtb2R1bGVzLnF1aWNrJGxvb2t1cChuZXcgU2suYnVpbHRpbi5zdHIoaCkpfWlmKDA8ZiYmdm9pZCAwPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBpbiBub24tcGFja2FnZVwiKTthLnNwbGl0KFwiLlwiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odm9pZCAwLGZ1bmN0aW9uKCl7aWYoMCE9PWYmJnZvaWQgMCE9PWQpcmV0dXJuXCJcIj09PWE/ZDpTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSxcbnZvaWQgMCxoK1wiLlwiK2Esdm9pZCAwLGQsLTE9PWYsITApfSxmdW5jdGlvbihiKXtyZXR1cm4gdm9pZCAwPT09Yj8oaD1kPXZvaWQgMCxTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsITEsITApKTpifSxmdW5jdGlvbihiKXtpZihlJiYwIT09ZS5sZW5ndGgpe3ZhciBjO3ZhciBkPVNrLnN5c21vZHVsZXMubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cigoaHx8XCJcIikrKGgmJmE/XCIuXCI6XCJcIikrYSkpO2ZvcihiPTA7YjxlLmxlbmd0aDtiKyspe3ZhciBmPWVbYl07XCIqXCIhPWYmJnZvaWQgMD09PWQudHAkZ2V0YXR0cihuZXcgU2suYnVpbHRpbi5zdHIoZikpJiYoYz1Tay5taXNjZXZhbC5jaGFpbihjLFNrLmltcG9ydE1vZHVsZUludGVybmFsXy5iaW5kKG51bGwsZix2b2lkIDAsdm9pZCAwLHZvaWQgMCxkLCEwLCEwKSkpfXJldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoZCk7cmV0dXJuIGR9KX1yZXR1cm4gYn0sXG5mdW5jdGlvbihhKXtsIT09U2suZ2xvYmFscyYmKFNrLmdsb2JhbHM9bCk7cmV0dXJuIGF9KX07U2suaW1wb3J0U3Rhcj1mdW5jdGlvbihhLGMsYil7aWYoYj1hLnRwJGdldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19hbGxfX1wiKSkpZm9yKGxldCBlPVNrLmFic3RyLml0ZXIoYiksZj1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWUudHAkaXRlcm5leHQoKSljW2Yudl09U2suYWJzdHIuZ2F0dHIoYSxmKTtlbHNle2I9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYS4kZCk7Zm9yKGxldCBlIGluIGIpXCJfXCIhPWJbZV0uY2hhckF0KDApJiYoY1tiW2VdXT1hLiRkW2JbZV1dKX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydE1haW5cIixTay5pbXBvcnRNYWluKTtTay5leHBvcnRTeW1ib2woXCJTay5pbXBvcnRNYWluV2l0aEJvZHlcIixTay5pbXBvcnRNYWluV2l0aEJvZHkpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydEJ1aWx0aW5XaXRoQm9keVwiLFNrLmltcG9ydEJ1aWx0aW5XaXRoQm9keSk7XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLl9faW1wb3J0X19cIixTay5idWlsdGluLl9faW1wb3J0X18pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydFN0YXJcIixTay5pbXBvcnRTdGFyKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnRpbVNvcnQ9ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3Q9bmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYpO3RoaXMuTUlOX0dBTExPUD03O3RoaXMubGlzdGxlbmd0aD1jP2M6YS5zcSRsZW5ndGgoKX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5sdD1mdW5jdGlvbihhLGMpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjLFwiTHRcIil9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubGU9ZnVuY3Rpb24oYSxjKXtyZXR1cm4hdGhpcy5sdChjLGEpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLnNldGl0ZW09ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3QudlthXT1jfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLmJpbmFyeV9zb3J0PVxuZnVuY3Rpb24oYSxjKXt2YXIgYjtmb3IoYj1hLmJhc2UrYztiPGEuYmFzZSthLmxlbjtiKyspe3ZhciBlPWEuYmFzZTt2YXIgZj1iO2ZvcihjPWEuZ2V0aXRlbShmKTtlPGY7KXt2YXIgbD1lKyhmLWU+PjEpO3RoaXMubHQoYyxhLmdldGl0ZW0obCkpP2Y9bDplPWwrMX1Tay5hc3NlcnRzLmFzc2VydChlPT09Zik7Zm9yKGw9YjtsPmU7bC0tKWEuc2V0aXRlbShsLGEuZ2V0aXRlbShsLTEpKTthLnNldGl0ZW0oZSxjKX19O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUuY291bnRfcnVuPWZ1bmN0aW9uKGEpe3ZhciBjO2lmKDE+PWEubGVuKXt2YXIgYj1hLmxlbjt2YXIgZT0hMX1lbHNlIGlmKGI9Mix0aGlzLmx0KGEuZ2V0aXRlbShhLmJhc2UrMSksYS5nZXRpdGVtKGEuYmFzZSkpKWZvcihlPSEwLGM9YS5iYXNlKzI7YzxhLmJhc2UrYS5sZW47YysrKWlmKHRoaXMubHQoYS5nZXRpdGVtKGMpLGEuZ2V0aXRlbShjLTEpKSliKys7ZWxzZSBicmVhaztlbHNlIGZvcihlPSExLGM9YS5iYXNlK1xuMjtjPGEuYmFzZSthLmxlbiYmIXRoaXMubHQoYS5nZXRpdGVtKGMpLGEuZ2V0aXRlbShjLTEpKTtjKyspYisrO3JldHVybntydW46bmV3IFNrLmJ1aWx0aW4ubGlzdFNsaWNlKGEubGlzdCxhLmJhc2UsYiksZGVzY2VuZGluZzplfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKCl7dmFyIGEsYz1uZXcgU2suYnVpbHRpbi5saXN0U2xpY2UodGhpcy5saXN0LDAsdGhpcy5saXN0bGVuZ3RoKTtpZighKDI+Yy5sZW4pKXt0aGlzLm1lcmdlX2luaXQoKTtmb3IoYT10aGlzLm1lcmdlX2NvbXB1dGVfbWlucnVuKGMubGVuKTswPGMubGVuOyl7dmFyIGI9dGhpcy5jb3VudF9ydW4oYyk7Yi5kZXNjZW5kaW5nJiZiLnJ1bi5yZXZlcnNlKCk7aWYoYi5ydW4ubGVuPGEpe3ZhciBlPWIucnVuLmxlbjtiLnJ1bi5sZW49YTxjLmxlbj9hOmMubGVuO3RoaXMuYmluYXJ5X3NvcnQoYi5ydW4sZSl9Yy5hZHZhbmNlKGIucnVuLmxlbik7dGhpcy5wZW5kaW5nLnB1c2goYi5ydW4pO1xudGhpcy5tZXJnZV9jb2xsYXBzZSgpfVNrLmFzc2VydHMuYXNzZXJ0KGMuYmFzZT09dGhpcy5saXN0bGVuZ3RoKTt0aGlzLm1lcmdlX2ZvcmNlX2NvbGxhcHNlKCk7U2suYXNzZXJ0cy5hc3NlcnQoMT09dGhpcy5wZW5kaW5nLmxlbmd0aCk7U2suYXNzZXJ0cy5hc3NlcnQoMD09PXRoaXMucGVuZGluZ1swXS5iYXNlKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnBlbmRpbmdbMF0ubGVuPT10aGlzLmxpc3RsZW5ndGgpfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5nYWxsb3A9ZnVuY3Rpb24oYSxjLGIsZSl7dmFyIGY7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YiYmYjxjLmxlbik7dmFyIGw9dGhpcztlPWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbC5sZShhLGIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBsLmx0KGEsYil9O3ZhciBoPWMuYmFzZStiO3ZhciBkPTA7dmFyIGc9MTtpZihlKGMuZ2V0aXRlbShoKSxhKSl7Zm9yKGY9Yy5sZW4tYjtnPGY7KWlmKGUoYy5nZXRpdGVtKGgrZyksXG5hKSl7ZD1nO3RyeXtnPShnPDwxKSsxfWNhdGNoKG4pe2c9Zn19ZWxzZSBicmVhaztnPmYmJihnPWYpO2QrPWI7Zys9Yn1lbHNle2ZvcihmPWIrMTtnPGYmJiFlKGMuZ2V0aXRlbShoLWcpLGEpOyl7ZD1nO3RyeXtnPShnPDwxKSsxfWNhdGNoKG4pe2c9Zn19Zz5mJiYoZz1mKTtoPWItZDtkPWItZztnPWh9U2suYXNzZXJ0cy5hc3NlcnQoLTE8PWQ8Zzw9Yy5sZW4pO2ZvcihkKz0xO2Q8ZzspYj1kKyhnLWQ+PjEpLGUoYy5nZXRpdGVtKGMuYmFzZStiKSxhKT9kPWIrMTpnPWI7U2suYXNzZXJ0cy5hc3NlcnQoZD09Zyk7cmV0dXJuIGd9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfaW5pdD1mdW5jdGlvbigpe3RoaXMubWluX2dhbGxvcD10aGlzLk1JTl9HQUxMT1A7dGhpcy5wZW5kaW5nPVtdfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2xvPWZ1bmN0aW9uKGEsYyl7dmFyIGIsZSxmO1NrLmFzc2VydHMuYXNzZXJ0KDA8YS5sZW4mJjA8Yy5sZW4mJmEuYmFzZStcbmEubGVuPT1jLmJhc2UpO3ZhciBsPXRoaXMubWluX2dhbGxvcDt2YXIgaD1hLmJhc2U7YT1hLmNvcHlpdGVtcygpO3RyeXtpZih0aGlzLnNldGl0ZW0oaCxjLnBvcGxlZnQoKSksaCsrLDEhPWEubGVuJiYwIT09Yy5sZW4pZm9yKDs7KXtmb3IoZT1iPTA7OylpZih0aGlzLmx0KGMuZ2V0aXRlbShjLmJhc2UpLGEuZ2V0aXRlbShhLmJhc2UpKSl7dGhpcy5zZXRpdGVtKGgsYy5wb3BsZWZ0KCkpO2grKztpZigwPT09Yy5sZW4pcmV0dXJuO2UrKztiPTA7aWYoZT49bClicmVha31lbHNle3RoaXMuc2V0aXRlbShoLGEucG9wbGVmdCgpKTtoKys7aWYoMT09YS5sZW4pcmV0dXJuO2IrKztlPTA7aWYoYj49bClicmVha31mb3IobCs9MTs7KXt0aGlzLm1pbl9nYWxsb3A9bC09MTxsO2I9dGhpcy5nYWxsb3AoYy5nZXRpdGVtKGMuYmFzZSksYSwwLCEwKTtmb3IoZj1hLmJhc2U7ZjxhLmJhc2UrYjtmKyspdGhpcy5zZXRpdGVtKGgsYS5nZXRpdGVtKGYpKSxoKys7YS5hZHZhbmNlKGIpO2lmKDE+PVxuYS5sZW4pcmV0dXJuO3RoaXMuc2V0aXRlbShoLGMucG9wbGVmdCgpKTtoKys7aWYoMD09PWMubGVuKXJldHVybjtlPXRoaXMuZ2FsbG9wKGEuZ2V0aXRlbShhLmJhc2UpLGMsMCwhMSk7Zm9yKGY9Yy5iYXNlO2Y8Yy5iYXNlK2U7ZisrKXRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSksaCsrO2MuYWR2YW5jZShlKTtpZigwPT09Yy5sZW4pcmV0dXJuO3RoaXMuc2V0aXRlbShoLGEucG9wbGVmdCgpKTtoKys7aWYoMT09YS5sZW4pcmV0dXJuO2lmKGI8dGhpcy5NSU5fR0FMTE9QJiZlPHRoaXMuTUlOX0dBTExPUClicmVhaztsKys7dGhpcy5taW5fZ2FsbG9wPWx9fX1maW5hbGx5e1NrLmFzc2VydHMuYXNzZXJ0KDA8PWEubGVuJiYwPD1jLmxlbik7Zm9yKGY9Yy5iYXNlO2Y8Yy5iYXNlK2MubGVuO2YrKyl0aGlzLnNldGl0ZW0oaCxjLmdldGl0ZW0oZikpLGgrKztmb3IoZj1hLmJhc2U7ZjxhLmJhc2UrYS5sZW47ZisrKXRoaXMuc2V0aXRlbShoLGEuZ2V0aXRlbShmKSksaCsrfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5tZXJnZV9oaT1cbmZ1bmN0aW9uKGEsYyl7dmFyIGIsZSxmO1NrLmFzc2VydHMuYXNzZXJ0KDA8YS5sZW4mJjA8Yy5sZW4mJmEuYmFzZSthLmxlbj09Yy5iYXNlKTt2YXIgbD10aGlzLm1pbl9nYWxsb3A7dmFyIGg9Yy5iYXNlK2MubGVuO2M9Yy5jb3B5aXRlbXMoKTt0cnl7aWYoaC0tLHRoaXMuc2V0aXRlbShoLGEucG9wcmlnaHQoKSksMCE9PWEubGVuJiYxIT1jLmxlbilmb3IoOzspe2ZvcihlPWI9MDs7KXt2YXIgZD1hLmdldGl0ZW0oYS5iYXNlK2EubGVuLTEpO3ZhciBnPWMuZ2V0aXRlbShjLmJhc2UrYy5sZW4tMSk7aWYodGhpcy5sdChnLGQpKXtoLS07dGhpcy5zZXRpdGVtKGgsZCk7YS5sZW4tLTtpZigwPT09YS5sZW4pcmV0dXJuO2IrKztlPTA7aWYoYj49bClicmVha31lbHNle2gtLTt0aGlzLnNldGl0ZW0oaCxnKTtjLmxlbi0tO2lmKDE9PWMubGVuKXJldHVybjtlKys7Yj0wO2lmKGU+PWwpYnJlYWt9fWZvcihsKz0xOzspe3RoaXMubWluX2dhbGxvcD1sLT0xPGw7Zz1jLmdldGl0ZW0oYy5iYXNlK1xuYy5sZW4tMSk7dmFyIG09dGhpcy5nYWxsb3AoZyxhLGEubGVuLTEsITApO2I9YS5sZW4tbTtmb3IoZj1hLmJhc2UrYS5sZW4tMTtmPmEuYmFzZSttLTE7Zi0tKWgtLSx0aGlzLnNldGl0ZW0oaCxhLmdldGl0ZW0oZikpO2EubGVuLT1iO2lmKDA9PT1hLmxlbilyZXR1cm47aC0tO3RoaXMuc2V0aXRlbShoLGMucG9wcmlnaHQoKSk7aWYoMT09Yy5sZW4pcmV0dXJuO2Q9YS5nZXRpdGVtKGEuYmFzZSthLmxlbi0xKTttPXRoaXMuZ2FsbG9wKGQsYyxjLmxlbi0xLCExKTtlPWMubGVuLW07Zm9yKGY9Yy5iYXNlK2MubGVuLTE7Zj5jLmJhc2UrbS0xO2YtLSloLS0sdGhpcy5zZXRpdGVtKGgsYy5nZXRpdGVtKGYpKTtjLmxlbi09ZTtpZigxPj1jLmxlbilyZXR1cm47aC0tO3RoaXMuc2V0aXRlbShoLGEucG9wcmlnaHQoKSk7aWYoMD09PWEubGVuKXJldHVybjtpZihiPHRoaXMuTUlOX0dBTExPUCYmZTx0aGlzLk1JTl9HQUxMT1ApYnJlYWs7bCsrO3RoaXMubWluX2dhbGxvcD1sfX19ZmluYWxseXtTay5hc3NlcnRzLmFzc2VydCgwPD1cbmEubGVuJiYwPD1jLmxlbik7Zm9yKGY9YS5iYXNlK2EubGVuLTE7Zj5hLmJhc2UtMTtmLS0paC0tLHRoaXMuc2V0aXRlbShoLGEuZ2V0aXRlbShmKSk7Zm9yKGY9Yy5iYXNlK2MubGVuLTE7Zj5jLmJhc2UtMTtmLS0paC0tLHRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSl9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2F0PWZ1bmN0aW9uKGEpezA+YSYmKGE9dGhpcy5wZW5kaW5nLmxlbmd0aCthKTt2YXIgYz10aGlzLnBlbmRpbmdbYV07dmFyIGI9dGhpcy5wZW5kaW5nW2ErMV07U2suYXNzZXJ0cy5hc3NlcnQoMDxjLmxlbiYmMDxiLmxlbik7U2suYXNzZXJ0cy5hc3NlcnQoYy5iYXNlK2MubGVuPT1iLmJhc2UpO3RoaXMucGVuZGluZ1thXT1uZXcgU2suYnVpbHRpbi5saXN0U2xpY2UodGhpcy5saXN0LGMuYmFzZSxjLmxlbitiLmxlbik7dGhpcy5wZW5kaW5nLnNwbGljZShhKzEsMSk7YT10aGlzLmdhbGxvcChiLmdldGl0ZW0oYi5iYXNlKSxjLDAsITApO2MuYWR2YW5jZShhKTtcbjAhPT1jLmxlbiYmKGIubGVuPXRoaXMuZ2FsbG9wKGMuZ2V0aXRlbShjLmJhc2UrYy5sZW4tMSksYixiLmxlbi0xLCExKSwwIT09Yi5sZW4mJihjLmxlbjw9Yi5sZW4/dGhpcy5tZXJnZV9sbyhjLGIpOnRoaXMubWVyZ2VfaGkoYyxiKSkpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2NvbGxhcHNlPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucGVuZGluZzsxPGEubGVuZ3RoOylpZigzPD1hLmxlbmd0aCYmYVthLmxlbmd0aC0zXS5sZW48PWFbYS5sZW5ndGgtMl0ubGVuK2FbYS5sZW5ndGgtMV0ubGVuKWFbYS5sZW5ndGgtM10ubGVuPGFbYS5sZW5ndGgtMV0ubGVuP3RoaXMubWVyZ2VfYXQoLTMpOnRoaXMubWVyZ2VfYXQoLTIpO2Vsc2UgaWYoYVthLmxlbmd0aC0yXS5sZW48PWFbYS5sZW5ndGgtMV0ubGVuKXRoaXMubWVyZ2VfYXQoLTIpO2Vsc2UgYnJlYWt9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfZm9yY2VfY29sbGFwc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGE9XG50aGlzLnBlbmRpbmc7MTxhLmxlbmd0aDspMzw9YS5sZW5ndGgmJmFbYS5sZW5ndGgtM10ubGVuPGFbYS5sZW5ndGgtMV0ubGVuP3RoaXMubWVyZ2VfYXQoLTMpOnRoaXMubWVyZ2VfYXQoLTIpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2NvbXB1dGVfbWlucnVuPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzY0PD1hOyljfD1hJjEsYT4+PTE7cmV0dXJuIGErY307U2suYnVpbHRpbi5saXN0U2xpY2U9ZnVuY3Rpb24oYSxjLGIpe3RoaXMubGlzdD1hO3RoaXMuYmFzZT1jO3RoaXMubGVuPWJ9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5jb3B5aXRlbXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJhc2UsYz10aGlzLmJhc2UrdGhpcy5sZW47U2suYXNzZXJ0cy5hc3NlcnQoMDw9YTw9Yyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3RTbGljZShuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMubGlzdC52LnNsaWNlKGEsYykpLDAsdGhpcy5sZW4pfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUuYWR2YW5jZT1cbmZ1bmN0aW9uKGEpe3RoaXMuYmFzZSs9YTt0aGlzLmxlbi09YTtTay5hc3NlcnRzLmFzc2VydCh0aGlzLmJhc2U8PXRoaXMubGlzdC5zcSRsZW5ndGgoKSl9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5nZXRpdGVtPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxpc3QudlthXX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnNldGl0ZW09ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3QudlthXT1jfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUucG9wbGVmdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMubGlzdC52W3RoaXMuYmFzZV07dGhpcy5iYXNlKys7dGhpcy5sZW4tLTtyZXR1cm4gYX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnBvcHJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5sZW4tLTtyZXR1cm4gdGhpcy5saXN0LnZbdGhpcy5iYXNlK3RoaXMubGVuXX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGEsXG5jLGI9dGhpcy5saXN0LGU9dGhpcy5iYXNlLGY9ZSt0aGlzLmxlbi0xO2U8ZjspYT1iLnZbZl0sYz1iLnZbZV0sYi52W2VdPWEsYi52W2ZdPWMsZSsrLGYtLX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5saXN0U2xpY2VcIixTay5idWlsdGluLmxpc3RTbGljZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi50aW1Tb3J0XCIsU2suYnVpbHRpbi50aW1Tb3J0KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN1cGVyXz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3VwZXJcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdXBlcl8sXCJiYWQgY2FsbCB0byBzdXBlciwgdXNlICduZXcnXCIpO3RoaXMudHlwZT1hO3RoaXMub2JqPWM7aWYodm9pZCAwIT09YSYmIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtdXN0IGJlIHR5cGUsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpKTt0aGlzLm9ial90eXBlPXZvaWQgMCE9PXRoaXMub2JqP3RoaXMuJHN1cGVyY2hlY2soYSx0aGlzLm9iaik6bnVsbH0sc2xvdHM6e3RwJGRvYzpcInN1cGVyKCkgLT4gc2FtZSBhcyBzdXBlcihfX2NsYXNzX18sIDxmaXJzdCBhcmd1bWVudD4pXFxuc3VwZXIodHlwZSkgLT4gdW5ib3VuZCBzdXBlciBvYmplY3RcXG5zdXBlcih0eXBlLCBvYmopIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNpbnN0YW5jZShvYmosIHR5cGUpXFxuc3VwZXIodHlwZSwgdHlwZTIpIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNzdWJjbGFzcyh0eXBlMiwgdHlwZSlcXG5UeXBpY2FsIHVzZSB0byBjYWxsIGEgY29vcGVyYXRpdmUgc3VwZXJjbGFzcyBtZXRob2Q6XFxuY2xhc3MgQyhCKTpcXG4gICAgZGVmIG1ldGgoc2VsZiwgYXJnKTpcXG4gICAgICAgIHN1cGVyKCkubWV0aChhcmcpXFxuVGhpcyB3b3JrcyBmb3IgY2xhc3MgbWV0aG9kcyB0b286XFxuY2xhc3MgQyhCKTpcXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBjbWV0aChjbHMsIGFyZyk6XFxuICAgICAgICBzdXBlcigpLmNtZXRoKGFyZylcXG5cIixcbnRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInN1cGVyXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic3VwZXJcIixhLDEsMik7Yz1hWzBdO2E9YVsxXTtpZighU2suYnVpbHRpbi5jaGVja0NsYXNzKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm11c3QgYmUgdHlwZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTt0aGlzLm9iaj1hO3RoaXMudHlwZT1jO251bGwhPXRoaXMub2JqJiYodGhpcy5vYmpfdHlwZT10aGlzLiRzdXBlcmNoZWNrKGMsdGhpcy5vYmopKX0sJHIoKXtyZXR1cm4gdGhpcy5vYmo/bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPHN1cGVyOiA8Y2xhc3MgJ1wiK3RoaXMudHlwZS5wcm90b3R5cGUudHAkbmFtZStcIic+LCA8XCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy5vYmopK1wiIG9iamVjdD4+XCIpOm5ldyBTay5idWlsdGluLnN0cihcIjxzdXBlcjogPGNsYXNzICdcIit0aGlzLnR5cGUucHJvdG90eXBlLnRwJG5hbWUrXG5cIic+LCBOVUxMPlwiKX0sdHAkZ2V0YXR0cihhLGMpe2xldCBiPXRoaXMub2JqX3R5cGU7aWYobnVsbD09YilyZXR1cm4gU2suZ2VuZXJpYy5nZXRBdHRyLmNhbGwodGhpcyxhLGMpO3ZhciBlPWIucHJvdG90eXBlLnRwJG1ybztjb25zdCBmPWUubGVuZ3RoO2lmKGE9PT1Tay5idWlsdGluLnN0ci4kY2xhc3MpcmV0dXJuIFNrLmdlbmVyaWMuZ2V0QXR0ci5jYWxsKHRoaXMsYSxjKTtsZXQgbDtmb3IobD0wO2wrMTxmJiZ0aGlzLnR5cGUhPT1lW2xdO2wrKyk7bCsrO2lmKGw+PWYpcmV0dXJuIFNrLmdlbmVyaWMuZ2V0QXR0ci5jYWxsKHRoaXMsYSxjKTthPWEuJG1hbmdsZWQ7bGV0IGg7Zm9yKDtsPGY7KXtjPWVbbF0ucHJvdG90eXBlO2MuaGFzT3duUHJvcGVydHkoYSkmJihoPWNbYV0pO2lmKHZvaWQgMCE9PWgpcmV0dXJuIGU9aC50cCRkZXNjcl9nZXQsdm9pZCAwIT09ZSYmKGg9ZS5jYWxsKGgsdGhpcy5vYmo9PT1iP251bGw6dGhpcy5vYmosYikpLGg7bCsrfX0sdHAkZGVzY3JfZ2V0KGEsXG5jKXtpZihudWxsPT09YXx8bnVsbCE9dGhpcy5vYmopcmV0dXJuIHRoaXM7aWYodGhpcy5vYiR0eXBlIT09U2suYnVpbHRpbi5zdXBlcl8pcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLm9iJHR5cGUsW3RoaXMudHlwZSxhXSk7e2M9dGhpcy4kc3VwZXJjaGVjayh0aGlzLnR5cGUsYSk7Y29uc3QgYj1uZXcgU2suYnVpbHRpbi5zdXBlcl87Yi50eXBlPXRoaXMudHlwZTtiLm9iaj1hO2Iub2JqX3R5cGU9YztyZXR1cm4gYn19fSxnZXRzZXRzOntfX3RoaXNjbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMudHlwZX0sJGRvYzpcInRoZSBjbGFzcyBpbnZva2luZyBzdXBlcigpXCJ9LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMub2JqfHxTay5idWlsdGluLm5vbmUubm9uZSR9LCRkb2M6XCJ0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmVcIn0sX19zZWxmX2NsYXNzX186eyRnZXQoKXtyZXR1cm4gdGhpcy5vYmpfdHlwZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbiRkb2M6XCJ0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmVcIn19LHByb3RvOnskc3VwZXJjaGVjayhhLGMpe2lmKFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhjKSYmYy4kaXNTdWJUeXBlKGEpKXJldHVybiBjO2lmKGMub2IkdHlwZS4kaXNTdWJUeXBlKGEpKXJldHVybiBjLm9iJHR5cGU7e2NvbnN0IGI9Yy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRjbGFzcyk7aWYodm9pZCAwIT09YiYmYiE9PWMub2IkdHlwZSYmU2suYnVpbHRpbi5jaGVja0NsYXNzKGIpJiZiLiRpc1N1YlR5cGUoYSkpcmV0dXJuIGJ9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3VwZXIodHlwZSwgb2JqKTogb2JqIG11c3QgYmUgYW4gaW5zdGFuY2Ugb3Igc3VidHlwZSBvZiB0eXBlXCIpO319fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbnM9e3JvdW5kOm51bGwsbGVuOm51bGwsbWluOm51bGwsbWF4Om51bGwsc3VtOm51bGwsYWJzOm51bGwsZmFiczpudWxsLFxub3JkOm51bGwsY2hyOm51bGwsaGV4Om51bGwsb2N0Om51bGwsYmluOm51bGwsZGlyOm51bGwscmVwcjpudWxsLG9wZW46bnVsbCxpc2luc3RhbmNlOm51bGwsaGFzaDpudWxsLGdldGF0dHI6bnVsbCxoYXNhdHRyOm51bGwsaWQ6bnVsbCxyZWR1Y2U6bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLnJlZHVjZSksc29ydGVkOm51bGwsYW55Om51bGwsYWxsOm51bGwsZW51bWVyYXRlOlNrLmJ1aWx0aW4uZW51bWVyYXRlLGZpbHRlcjpTay5idWlsdGluLmZpbHRlcl8sbWFwOlNrLmJ1aWx0aW4ubWFwXyxyYW5nZTpTay5idWlsdGluLnJhbmdlXyxyZXZlcnNlZDpTay5idWlsdGluLnJldmVyc2VkLHppcDpTay5idWlsdGluLnppcF8sQmFzZUV4Y2VwdGlvbjpTay5idWlsdGluLkJhc2VFeGNlcHRpb24sQXR0cmlidXRlRXJyb3I6U2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcixWYWx1ZUVycm9yOlNrLmJ1aWx0aW4uVmFsdWVFcnJvcixFeGNlcHRpb246U2suYnVpbHRpbi5FeGNlcHRpb24sXG5aZXJvRGl2aXNpb25FcnJvcjpTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yLEFzc2VydGlvbkVycm9yOlNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3IsSW1wb3J0RXJyb3I6U2suYnVpbHRpbi5JbXBvcnRFcnJvcixJbmRlbnRhdGlvbkVycm9yOlNrLmJ1aWx0aW4uSW5kZW50YXRpb25FcnJvcixJbmRleEVycm9yOlNrLmJ1aWx0aW4uSW5kZXhFcnJvcixMb29rdXBFcnJvcjpTay5idWlsdGluLkxvb2t1cEVycm9yLEtleUVycm9yOlNrLmJ1aWx0aW4uS2V5RXJyb3IsVHlwZUVycm9yOlNrLmJ1aWx0aW4uVHlwZUVycm9yLFVuaWNvZGVEZWNvZGVFcnJvcjpTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcixVbmljb2RlRW5jb2RlRXJyb3I6U2suYnVpbHRpbi5Vbmljb2RlRW5jb2RlRXJyb3IsTmFtZUVycm9yOlNrLmJ1aWx0aW4uTmFtZUVycm9yLElPRXJyb3I6U2suYnVpbHRpbi5JT0Vycm9yLE5vdEltcGxlbWVudGVkRXJyb3I6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yLFxuU3lzdGVtRXhpdDpTay5idWlsdGluLlN5c3RlbUV4aXQsT3ZlcmZsb3dFcnJvcjpTay5idWlsdGluLk92ZXJmbG93RXJyb3IsT3BlcmF0aW9uRXJyb3I6U2suYnVpbHRpbi5PcGVyYXRpb25FcnJvcixOZWdhdGl2ZVBvd2VyRXJyb3I6U2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3IsUnVudGltZUVycm9yOlNrLmJ1aWx0aW4uUnVudGltZUVycm9yLFJlY3Vyc2lvbkVycm9yOlNrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3IsU3RvcEl0ZXJhdGlvbjpTay5idWlsdGluLlN0b3BJdGVyYXRpb24sU3ludGF4RXJyb3I6U2suYnVpbHRpbi5TeW50YXhFcnJvcixTeXN0ZW1FcnJvcjpTay5idWlsdGluLlN5c3RlbUVycm9yLGZsb2F0XyRydyQ6U2suYnVpbHRpbi5mbG9hdF8saW50XyRydyQ6U2suYnVpbHRpbi5pbnRfLGJvb2w6U2suYnVpbHRpbi5ib29sLGNvbXBsZXg6U2suYnVpbHRpbi5jb21wbGV4LGRpY3Q6U2suYnVpbHRpbi5kaWN0LGZpbGU6U2suYnVpbHRpbi5maWxlLGZyb3plbnNldDpTay5idWlsdGluLmZyb3plbnNldCxcblwiZnVuY3Rpb25cIjpTay5idWlsdGluLmZ1bmMsZ2VuZXJhdG9yOlNrLmJ1aWx0aW4uZ2VuZXJhdG9yLGxpc3Q6U2suYnVpbHRpbi5saXN0LGxvbmdfJHJ3JDpTay5idWlsdGluLmxuZyxtZXRob2Q6U2suYnVpbHRpbi5tZXRob2Qsb2JqZWN0OlNrLmJ1aWx0aW4ub2JqZWN0LHNsaWNlOlNrLmJ1aWx0aW4uc2xpY2Usc3RyOlNrLmJ1aWx0aW4uc3RyLHNldDpTay5idWlsdGluLnNldCx0dXBsZTpTay5idWlsdGluLnR1cGxlLHR5cGU6U2suYnVpbHRpbi50eXBlLGlucHV0Om51bGwscmF3X2lucHV0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5yYXdfaW5wdXQpLHNldGF0dHI6bnVsbCxqc2V2YWw6U2suYnVpbHRpbi5qc2V2YWwsanNtaWxsaXM6U2suYnVpbHRpbi5qc21pbGxpcyxxdWl0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5xdWl0KSxleGl0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5xdWl0KSxwcmludDpudWxsLGRpdm1vZDpudWxsLGZvcm1hdDpudWxsLFxuZ2xvYmFsczpudWxsLGlzc3ViY2xhc3M6bnVsbCxpdGVyOm51bGwsZXhlY2ZpbGU6U2suYnVpbHRpbi5leGVjZmlsZSxoZWxwOlNrLmJ1aWx0aW4uaGVscCxtZW1vcnl2aWV3OlNrLmJ1aWx0aW4ubWVtb3J5dmlldyxyZWxvYWQ6U2suYnVpbHRpbi5yZWxvYWQsc3VwZXJfJHJ3JDpTay5idWlsdGluLnN1cGVyXyx1bmljaHI6U2suYnVpbHRpbi51bmljaHIsdmFyczpTay5idWlsdGluLnZhcnMsYXBwbHlfJHJ3JDpTay5idWlsdGluLmFwcGx5XyxidWZmZXI6U2suYnVpbHRpbi5idWZmZXIsY29lcmNlOlNrLmJ1aWx0aW4uY29lcmNlLGludGVybjpTay5idWlsdGluLmludGVybixwcm9wZXJ0eTpTay5idWlsdGluLnByb3BlcnR5LGNsYXNzbWV0aG9kOlNrLmJ1aWx0aW4uY2xhc3NtZXRob2Qsc3RhdGljbWV0aG9kOlNrLmJ1aWx0aW4uc3RhdGljbWV0aG9kfTtTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXCJidWlsdGluc1wiLFNrLmJ1aWx0aW5zLHtfX2ltcG9ydF9fOnskbWV0aDpTay5idWlsdGluLl9faW1wb3J0X18sXG4kZmxhZ3M6e05hbWVkQXJnczpbXCJuYW1lXCIsXCJnbG9iYWxzXCIsXCJsb2NhbHNcIixcImZyb21saXN0XCIsXCJsZXZlbFwiXX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiX19pbXBvcnRfXyhuYW1lLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lLCBmcm9tbGlzdD0oKSwgbGV2ZWw9MCkgLT4gbW9kdWxlXFxuXFxuSW1wb3J0IGEgbW9kdWxlLiBCZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgZm9yIHVzZSBieSB0aGUgUHl0aG9uXFxuaW50ZXJwcmV0ZXIgYW5kIG5vdCBmb3IgZ2VuZXJhbCB1c2UsIGl0IGlzIGJldHRlciB0byB1c2VcXG5pbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIHRvIHByb2dyYW1tYXRpY2FsbHkgaW1wb3J0IGEgbW9kdWxlLlxcblxcblRoZSBnbG9iYWxzIGFyZ3VtZW50IGlzIG9ubHkgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQ7XFxudGhleSBhcmUgbm90IG1vZGlmaWVkLiAgVGhlIGxvY2FscyBhcmd1bWVudCBpcyB1bnVzZWQuICBUaGUgZnJvbWxpc3RcXG5zaG91bGQgYmUgYSBsaXN0IG9mIG5hbWVzIHRvIGVtdWxhdGUgYGBmcm9tIG5hbWUgaW1wb3J0IC4uLicnLCBvciBhblxcbmVtcHR5IGxpc3QgdG8gZW11bGF0ZSBgYGltcG9ydCBuYW1lJycuXFxuV2hlbiBpbXBvcnRpbmcgYSBtb2R1bGUgZnJvbSBhIHBhY2thZ2UsIG5vdGUgdGhhdCBfX2ltcG9ydF9fKCdBLkInLCAuLi4pXFxucmV0dXJucyBwYWNrYWdlIEEgd2hlbiBmcm9tbGlzdCBpcyBlbXB0eSwgYnV0IGl0cyBzdWJtb2R1bGUgQiB3aGVuXFxuZnJvbWxpc3QgaXMgbm90IGVtcHR5LiAgVGhlIGxldmVsIGFyZ3VtZW50IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG9cXG5wZXJmb3JtIGFic29sdXRlIG9yIHJlbGF0aXZlIGltcG9ydHM6IDAgaXMgYWJzb2x1dGUsIHdoaWxlIGEgcG9zaXRpdmUgbnVtYmVyXFxuaXMgdGhlIG51bWJlciBvZiBwYXJlbnQgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IG1vZHVsZS5cIn0sXG5hYnM6eyRtZXRoOlNrLmJ1aWx0aW4uYWJzLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCB4LCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC5cIn0sYWxsOnskbWV0aDpTay5idWlsdGluLmFsbCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIGJvb2woeCkgaXMgVHJ1ZSBmb3IgYWxsIHZhbHVlcyB4IGluIHRoZSBpdGVyYWJsZS5cXG5cXG5JZiB0aGUgaXRlcmFibGUgaXMgZW1wdHksIHJldHVybiBUcnVlLlwifSxhbnk6eyRtZXRoOlNrLmJ1aWx0aW4uYW55LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgYm9vbCh4KSBpcyBUcnVlIGZvciBhbnkgeCBpbiB0aGUgaXRlcmFibGUuXFxuXFxuSWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LCByZXR1cm4gRmFsc2UuXCJ9LFxuYXNjaWk6eyRtZXRoOlNrLmJ1aWx0aW4uYXNjaWksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIGFuIEFTQ0lJLW9ubHkgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LlxcblxcbkFzIHJlcHIoKSwgcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgYW5cXG5vYmplY3QsIGJ1dCBlc2NhcGUgdGhlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnlcXG5yZXByKCkgdXNpbmcgXFxcXFxcXFx4LCBcXFxcXFxcXHUgb3IgXFxcXFxcXFxVIGVzY2FwZXMuIFRoaXMgZ2VuZXJhdGVzIGEgc3RyaW5nIHNpbWlsYXJcXG50byB0aGF0IHJldHVybmVkIGJ5IHJlcHIoKSBpbiBQeXRob24gMi5cIn0sYmluOnskbWV0aDpTay5idWlsdGluLmJpbiwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyLlxcblxcbiAgID4+PiBiaW4oMjc5NjIwMilcXG4gICAnMGIxMDEwMTAxMDEwMTAxMDEwMTAxMDEwJ1wifSxcbmNhbGxhYmxlOnskbWV0aDpTay5idWlsdGluLmNhbGxhYmxlLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgaXMgY2FsbGFibGUgKGkuZS4sIHNvbWUga2luZCBvZiBmdW5jdGlvbikuXFxuXFxuTm90ZSB0aGF0IGNsYXNzZXMgYXJlIGNhbGxhYmxlLCBhcyBhcmUgaW5zdGFuY2VzIG9mIGNsYXNzZXMgd2l0aCBhXFxuX19jYWxsX18oKSBtZXRob2QuXCJ9LGNocjp7JG1ldGg6U2suYnVpbHRpbi5jaHIsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGksIC8pXCIsJGRvYzpcIlJldHVybiBhIFVuaWNvZGUgc3RyaW5nIG9mIG9uZSBjaGFyYWN0ZXIgd2l0aCBvcmRpbmFsIGk7IDAgPD0gaSA8PSAweDEwZmZmZi5cIn0sZGVsYXR0cjp7JG1ldGg6U2suYnVpbHRpbi5kZWxhdHRyLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCBuYW1lLCAvKVwiLFxuJGRvYzpcIkRlbGV0ZXMgdGhlIG5hbWVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBnaXZlbiBvYmplY3QuXFxuXFxuZGVsYXR0cih4LCAneScpIGlzIGVxdWl2YWxlbnQgdG8gYGBkZWwgeC55JydcIn0sZGlyOnskbWV0aDpTay5idWlsdGluLmRpciwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOm51bGwsJGRvYzpcImRpcihbb2JqZWN0XSkgLT4gbGlzdCBvZiBzdHJpbmdzXFxuXFxuSWYgY2FsbGVkIHdpdGhvdXQgYW4gYXJndW1lbnQsIHJldHVybiB0aGUgbmFtZXMgaW4gdGhlIGN1cnJlbnQgc2NvcGUuXFxuRWxzZSwgcmV0dXJuIGFuIGFscGhhYmV0aXplZCBsaXN0IG9mIG5hbWVzIGNvbXByaXNpbmcgKHNvbWUgb2YpIHRoZSBhdHRyaWJ1dGVzXFxub2YgdGhlIGdpdmVuIG9iamVjdCwgYW5kIG9mIGF0dHJpYnV0ZXMgcmVhY2hhYmxlIGZyb20gaXQuXFxuSWYgdGhlIG9iamVjdCBzdXBwbGllcyBhIG1ldGhvZCBuYW1lZCBfX2Rpcl9fLCBpdCB3aWxsIGJlIHVzZWQ7IG90aGVyd2lzZVxcbnRoZSBkZWZhdWx0IGRpcigpIGxvZ2ljIGlzIHVzZWQgYW5kIHJldHVybnM6XFxuICBmb3IgYSBtb2R1bGUgb2JqZWN0OiB0aGUgbW9kdWxlJ3MgYXR0cmlidXRlcy5cXG4gIGZvciBhIGNsYXNzIG9iamVjdDogIGl0cyBhdHRyaWJ1dGVzLCBhbmQgcmVjdXJzaXZlbHkgdGhlIGF0dHJpYnV0ZXNcXG4gICAgb2YgaXRzIGJhc2VzLlxcbiAgZm9yIGFueSBvdGhlciBvYmplY3Q6IGl0cyBhdHRyaWJ1dGVzLCBpdHMgY2xhc3MncyBhdHRyaWJ1dGVzLCBhbmRcXG4gICAgcmVjdXJzaXZlbHkgdGhlIGF0dHJpYnV0ZXMgb2YgaXRzIGNsYXNzJ3MgYmFzZSBjbGFzc2VzLlwifSxcbmRpdm1vZDp7JG1ldGg6U2suYnVpbHRpbi5kaXZtb2QsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCB4LCB5LCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIHR1cGxlICh4Ly95LCB4JXkpLiAgSW52YXJpYW50OiBkaXYqeSArIG1vZCA9PSB4LlwifSxldmFsXyRydyQ6eyRuYW1lOlwiZXZhbFwiLCRtZXRoOlNrLmJ1aWx0aW4uZXZhbF8sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBzb3VyY2UsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUsIC8pXCIsJGRvYzpcIkV2YWx1YXRlIHRoZSBnaXZlbiBzb3VyY2UgaW4gdGhlIGNvbnRleHQgb2YgZ2xvYmFscyBhbmQgbG9jYWxzLlxcblxcblRoZSBzb3VyY2UgbWF5IGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIFB5dGhvbiBleHByZXNzaW9uXFxub3IgYSBjb2RlIG9iamVjdCBhcyByZXR1cm5lZCBieSBjb21waWxlKCkuXFxuVGhlIGdsb2JhbHMgbXVzdCBiZSBhIGRpY3Rpb25hcnkgYW5kIGxvY2FscyBjYW4gYmUgYW55IG1hcHBpbmcsXFxuZGVmYXVsdGluZyB0byB0aGUgY3VycmVudCBnbG9iYWxzIGFuZCBsb2NhbHMuXFxuSWYgb25seSBnbG9iYWxzIGlzIGdpdmVuLCBsb2NhbHMgZGVmYXVsdHMgdG8gaXQuXCJ9LFxuZm9ybWF0OnskbWV0aDpTay5idWlsdGluLmZvcm1hdCwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHZhbHVlLCBmb3JtYXRfc3BlYz0nJywgLylcIiwkZG9jOlwiUmV0dXJuIHZhbHVlLl9fZm9ybWF0X18oZm9ybWF0X3NwZWMpXFxuXFxuZm9ybWF0X3NwZWMgZGVmYXVsdHMgdG8gdGhlIGVtcHR5IHN0cmluZy5cXG5TZWUgdGhlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2Ugc2VjdGlvbiBvZiBoZWxwKCdGT1JNQVRUSU5HJykgZm9yXFxuZGV0YWlscy5cIn0sZ2V0YXR0cjp7JG1ldGg6U2suYnVpbHRpbi5nZXRhdHRyLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiZ2V0YXR0cihvYmplY3QsIG5hbWVbLCBkZWZhdWx0XSkgLT4gdmFsdWVcXG5cXG5HZXQgYSBuYW1lZCBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3Q7IGdldGF0dHIoeCwgJ3knKSBpcyBlcXVpdmFsZW50IHRvIHgueS5cXG5XaGVuIGEgZGVmYXVsdCBhcmd1bWVudCBpcyBnaXZlbiwgaXQgaXMgcmV0dXJuZWQgd2hlbiB0aGUgYXR0cmlidXRlIGRvZXNuJ3RcXG5leGlzdDsgd2l0aG91dCBpdCwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbiB0aGF0IGNhc2UuXCJ9LFxuZ2xvYmFsczp7JG1ldGg6U2suYnVpbHRpbi5nbG9iYWxzLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgY3VycmVudCBzY29wZSdzIGdsb2JhbCB2YXJpYWJsZXMuXFxuXFxuTk9URTogVXBkYXRlcyB0byB0aGlzIGRpY3Rpb25hcnkgKndpbGwqIGFmZmVjdCBuYW1lIGxvb2t1cHMgaW4gdGhlIGN1cnJlbnRcXG5nbG9iYWwgc2NvcGUgYW5kIHZpY2UtdmVyc2EuXCJ9LGhhc2F0dHI6eyRtZXRoOlNrLmJ1aWx0aW4uaGFzYXR0ciwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgbmFtZSwgLylcIiwkZG9jOlwiUmV0dXJuIHdoZXRoZXIgdGhlIG9iamVjdCBoYXMgYW4gYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuXFxuXFxuVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcgZ2V0YXR0cihvYmosIG5hbWUpIGFuZCBjYXRjaGluZyBBdHRyaWJ1dGVFcnJvci5cIn0sXG5oYXNoOnskbWV0aDpTay5idWlsdGluLmhhc2gsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LlxcblxcblR3byBvYmplY3RzIHRoYXQgY29tcGFyZSBlcXVhbCBtdXN0IGFsc28gaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlLCBidXQgdGhlXFxucmV2ZXJzZSBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZS5cIn0saGV4OnskbWV0aDpTay5idWlsdGluLmhleCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IGhleCgxMjY0ODQzMClcXG4gICAnMHhjMGZmZWUnXCJ9LGlkOnskbWV0aDpTay5idWlsdGluLmlkLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgaWRlbnRpdHkgb2YgYW4gb2JqZWN0LlxcblxcblRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYW1vbmcgc2ltdWx0YW5lb3VzbHkgZXhpc3Rpbmcgb2JqZWN0cy5cXG4oQ1B5dGhvbiB1c2VzIHRoZSBvYmplY3QncyBtZW1vcnkgYWRkcmVzcy4pXCJ9LFxuaW5wdXQ6eyRtZXRoOlNrLmJ1aWx0aW4uaW5wdXQsJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBwcm9tcHQ9Tm9uZSwgLylcIiwkZG9jOlwiUmVhZCBhIHN0cmluZyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgVGhlIHRyYWlsaW5nIG5ld2xpbmUgaXMgc3RyaXBwZWQuXFxuXFxuVGhlIHByb21wdCBzdHJpbmcsIGlmIGdpdmVuLCBpcyBwcmludGVkIHRvIHN0YW5kYXJkIG91dHB1dCB3aXRob3V0IGFcXG50cmFpbGluZyBuZXdsaW5lIGJlZm9yZSByZWFkaW5nIGlucHV0LlxcblxcbklmIHRoZSB1c2VyIGhpdHMgRU9GICgqbml4OiBDdHJsLUQsIFdpbmRvd3M6IEN0cmwtWitSZXR1cm4pLCByYWlzZSBFT0ZFcnJvci5cXG5PbiAqbml4IHN5c3RlbXMsIHJlYWRsaW5lIGlzIHVzZWQgaWYgYXZhaWxhYmxlLlwifSxpc2luc3RhbmNlOnskbWV0aDpTay5idWlsdGluLmlzaW5zdGFuY2UsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIGNsYXNzX29yX3R1cGxlLCAvKVwiLFxuJGRvYzpcIlJldHVybiB3aGV0aGVyIGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIG9yIG9mIGEgc3ViY2xhc3MgdGhlcmVvZi5cXG5cXG5BIHR1cGxlLCBhcyBpbiBgYGlzaW5zdGFuY2UoeCwgKEEsIEIsIC4uLikpYGAsIG1heSBiZSBnaXZlbiBhcyB0aGUgdGFyZ2V0IHRvXFxuY2hlY2sgYWdhaW5zdC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgaXNpbnN0YW5jZSh4LCBBKSBvciBpc2luc3RhbmNlKHgsIEIpXFxub3IgLi4uYGAgZXRjLlwifSxpc3N1YmNsYXNzOnskbWV0aDpTay5idWlsdGluLmlzc3ViY2xhc3MsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBjbHMsIGNsYXNzX29yX3R1cGxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gd2hldGhlciAnY2xzJyBpcyBhIGRlcml2ZWQgZnJvbSBhbm90aGVyIGNsYXNzIG9yIGlzIHRoZSBzYW1lIGNsYXNzLlxcblxcbkEgdHVwbGUsIGFzIGluIGBgaXNzdWJjbGFzcyh4LCAoQSwgQiwgLi4uKSlgYCwgbWF5IGJlIGdpdmVuIGFzIHRoZSB0YXJnZXQgdG9cXG5jaGVjayBhZ2FpbnN0LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYGBpc3N1YmNsYXNzKHgsIEEpIG9yIGlzc3ViY2xhc3MoeCwgQilcXG5vciAuLi5gYCBldGMuXCJ9LFxuaXRlcjp7JG1ldGg6U2suYnVpbHRpbi5pdGVyLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUgLylcIiwkZG9jOlwiaXRlcihpdGVyYWJsZSkgLT4gaXRlcmF0b3JcXG5pdGVyKGNhbGxhYmxlLCBzZW50aW5lbCkgLT4gaXRlcmF0b3JcXG5cXG5HZXQgYW4gaXRlcmF0b3IgZnJvbSBhbiBvYmplY3QuICBJbiB0aGUgZmlyc3QgZm9ybSwgdGhlIGFyZ3VtZW50IG11c3RcXG5zdXBwbHkgaXRzIG93biBpdGVyYXRvciwgb3IgYmUgYSBzZXF1ZW5jZS5cXG5JbiB0aGUgc2Vjb25kIGZvcm0sIHRoZSBjYWxsYWJsZSBpcyBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyB0aGUgc2VudGluZWwuXCJ9LGxlbjp7JG1ldGg6U2suYnVpbHRpbi5sZW4sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBjb250YWluZXIuXCJ9LGxvY2Fsczp7JG1ldGg6U2suYnVpbHRpbi5sb2NhbHMsXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjdXJyZW50IHNjb3BlJ3MgbG9jYWwgdmFyaWFibGVzLlxcblxcbk5PVEU6IFdoZXRoZXIgb3Igbm90IHVwZGF0ZXMgdG8gdGhpcyBkaWN0aW9uYXJ5IHdpbGwgYWZmZWN0IG5hbWUgbG9va3VwcyBpblxcbnRoZSBsb2NhbCBzY29wZSBhbmQgdmljZS12ZXJzYSBpcyAqaW1wbGVtZW50YXRpb24gZGVwZW5kZW50KiBhbmQgbm90XFxuY292ZXJlZCBieSBhbnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZ3VhcmFudGVlcy5cIn0sbWF4OnskbWV0aDpTay5idWlsdGluLm1heCwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJtYXgoaXRlcmFibGUsICpbLCBkZWZhdWx0PW9iaiwga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcbm1heChhcmcxLCBhcmcyLCAqYXJncywgKlssIGtleT1mdW5jXSkgLT4gdmFsdWVcXG5cXG5XaXRoIGEgc2luZ2xlIGl0ZXJhYmxlIGFyZ3VtZW50LCByZXR1cm4gaXRzIGJpZ2dlc3QgaXRlbS4gVGhlXFxuZGVmYXVsdCBrZXl3b3JkLW9ubHkgYXJndW1lbnQgc3BlY2lmaWVzIGFuIG9iamVjdCB0byByZXR1cm4gaWZcXG50aGUgcHJvdmlkZWQgaXRlcmFibGUgaXMgZW1wdHkuXFxuV2l0aCB0d28gb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybiB0aGUgbGFyZ2VzdCBhcmd1bWVudC5cIn0sXG5taW46eyRtZXRoOlNrLmJ1aWx0aW4ubWluLCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIm1pbihpdGVyYWJsZSwgKlssIGRlZmF1bHQ9b2JqLCBrZXk9ZnVuY10pIC0+IHZhbHVlXFxubWluKGFyZzEsIGFyZzIsICphcmdzLCAqWywga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcblxcbldpdGggYSBzaW5nbGUgaXRlcmFibGUgYXJndW1lbnQsIHJldHVybiBpdHMgc21hbGxlc3QgaXRlbS4gVGhlXFxuZGVmYXVsdCBrZXl3b3JkLW9ubHkgYXJndW1lbnQgc3BlY2lmaWVzIGFuIG9iamVjdCB0byByZXR1cm4gaWZcXG50aGUgcHJvdmlkZWQgaXRlcmFibGUgaXMgZW1wdHkuXFxuV2l0aCB0d28gb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybiB0aGUgc21hbGxlc3QgYXJndW1lbnQuXCJ9LG5leHQ6eyRuYW1lOlwibmV4dFwiLCRtZXRoOlNrLmJ1aWx0aW4ubmV4dF8sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJuZXh0KGl0ZXJhdG9yWywgZGVmYXVsdF0pXFxuXFxuUmV0dXJuIHRoZSBuZXh0IGl0ZW0gZnJvbSB0aGUgaXRlcmF0b3IuIElmIGRlZmF1bHQgaXMgZ2l2ZW4gYW5kIHRoZSBpdGVyYXRvclxcbmlzIGV4aGF1c3RlZCwgaXQgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiByYWlzaW5nIFN0b3BJdGVyYXRpb24uXCJ9LFxub2N0OnskbWV0aDpTay5idWlsdGluLm9jdCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIG9jdGFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IG9jdCgzNDIzOTEpXFxuICAgJzBvMTIzNDU2NydcIn0sb3Blbjp7JG1ldGg6U2suYnVpbHRpbi5vcGVuLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwib3BlbihuYW1lWywgbW9kZVssIGJ1ZmZlcmluZ11dKSAtPiBmaWxlIG9iamVjdFxcblxcbk9wZW4gYSBmaWxlIHVzaW5nIHRoZSBmaWxlKCkgdHlwZSwgcmV0dXJucyBhIGZpbGUgb2JqZWN0LiAgVGhpcyBpcyB0aGVcXG5wcmVmZXJyZWQgd2F5IHRvIG9wZW4gYSBmaWxlLiAgU2VlIGZpbGUuX19kb2NfXyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi5cIn0sb3JkOnskbWV0aDpTay5idWlsdGluLm9yZCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgYywgLylcIixcbiRkb2M6XCJSZXR1cm4gdGhlIFVuaWNvZGUgY29kZSBwb2ludCBmb3IgYSBvbmUtY2hhcmFjdGVyIHN0cmluZy5cIn0scG93OnskbWV0aDpTay5idWlsdGluLnBvdywkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHgsIHksIHo9Tm9uZSwgLylcIiwkZG9jOlwiRXF1aXZhbGVudCB0byB4Kip5ICh3aXRoIHR3byBhcmd1bWVudHMpIG9yIHgqKnkgJSB6ICh3aXRoIHRocmVlIGFyZ3VtZW50cylcXG5cXG5Tb21lIHR5cGVzLCBzdWNoIGFzIGludHMsIGFyZSBhYmxlIHRvIHVzZSBhIG1vcmUgZWZmaWNpZW50IGFsZ29yaXRobSB3aGVuXFxuaW52b2tlZCB1c2luZyB0aGUgdGhyZWUgYXJndW1lbnQgZm9ybS5cIn0scHJpbnQ6eyRtZXRoOlNrLmJ1aWx0aW4ucHJpbnQsJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwicHJpbnQodmFsdWUsIC4uLiwgc2VwPScgJywgZW5kPSdcXFxcbicsIGZpbGU9c3lzLnN0ZG91dCwgZmx1c2g9RmFsc2UpXFxuXFxuUHJpbnRzIHRoZSB2YWx1ZXMgdG8gYSBzdHJlYW0sIG9yIHRvIHN5cy5zdGRvdXQgYnkgZGVmYXVsdC5cXG5PcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czpcXG5maWxlOiAgYSBmaWxlLWxpa2Ugb2JqZWN0IChzdHJlYW0pOyBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBzeXMuc3Rkb3V0LlxcbnNlcDogICBzdHJpbmcgaW5zZXJ0ZWQgYmV0d2VlbiB2YWx1ZXMsIGRlZmF1bHQgYSBzcGFjZS5cXG5lbmQ6ICAgc3RyaW5nIGFwcGVuZGVkIGFmdGVyIHRoZSBsYXN0IHZhbHVlLCBkZWZhdWx0IGEgbmV3bGluZS5cXG5mbHVzaDogd2hldGhlciB0byBmb3JjaWJseSBmbHVzaCB0aGUgc3RyZWFtLlwifSxcbnJlcHI6eyRtZXRoOlNrLmJ1aWx0aW4ucmVwciwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC5cXG5cXG5Gb3IgbWFueSBvYmplY3QgdHlwZXMsIGluY2x1ZGluZyBtb3N0IGJ1aWx0aW5zLCBldmFsKHJlcHIob2JqKSkgPT0gb2JqLlwifSxyb3VuZDp7JG1ldGg6U2suYnVpbHRpbi5yb3VuZCwkZmxhZ3M6e05hbWVkQXJnczpbXCJudW1iZXJcIixcIm5kaWdpdHNcIl19LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIC8sIG51bWJlciwgbmRpZ2l0cz1Ob25lKVwiLCRkb2M6XCJSb3VuZCBhIG51bWJlciB0byBhIGdpdmVuIHByZWNpc2lvbiBpbiBkZWNpbWFsIGRpZ2l0cy5cXG5cXG5UaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGludGVnZXIgaWYgbmRpZ2l0cyBpcyBvbWl0dGVkIG9yIE5vbmUuICBPdGhlcndpc2VcXG50aGUgcmV0dXJuIHZhbHVlIGhhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBudW1iZXIuICBuZGlnaXRzIG1heSBiZSBuZWdhdGl2ZS5cIn0sXG5zZXRhdHRyOnskbWV0aDpTay5idWlsdGluLnNldGF0dHIsJGZsYWdzOntNaW5BcmdzOjMsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIG5hbWUsIHZhbHVlLCAvKVwiLCRkb2M6XCJTZXRzIHRoZSBuYW1lZCBhdHRyaWJ1dGUgb24gdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLlxcblxcbnNldGF0dHIoeCwgJ3knLCB2KSBpcyBlcXVpdmFsZW50IHRvIGBgeC55ID0gdicnXCJ9LHNvcnRlZDp7JG1ldGg6U2suYnVpbHRpbi5zb3J0ZWQsJGZsYWdzOntOYW1lZEFyZ3M6W251bGwsXCJjbXBcIixcImtleVwiLFwicmV2ZXJzZVwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLmJvb2wuZmFsc2UkXX0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUsIC8sICosIGtleT1Ob25lLCByZXZlcnNlPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYSBuZXcgbGlzdCBjb250YWluaW5nIGFsbCBpdGVtcyBmcm9tIHRoZSBpdGVyYWJsZSBpbiBhc2NlbmRpbmcgb3JkZXIuXFxuXFxuQSBjdXN0b20ga2V5IGZ1bmN0aW9uIGNhbiBiZSBzdXBwbGllZCB0byBjdXN0b21pemUgdGhlIHNvcnQgb3JkZXIsIGFuZCB0aGVcXG5yZXZlcnNlIGZsYWcgY2FuIGJlIHNldCB0byByZXF1ZXN0IHRoZSByZXN1bHQgaW4gZGVzY2VuZGluZyBvcmRlci5cIn0sXG5zdW06eyRtZXRoOlNrLmJ1aWx0aW4uc3VtLCRmbGFnczp7TmFtZWRBcmdzOltudWxsLFwic3RhcnRcIl0sRGVmYXVsdHM6W25ldyBTay5idWlsdGluLmludF8oMCldfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLywgc3RhcnQ9MClcIiwkZG9jOlwiUmV0dXJuIHRoZSBzdW0gb2YgYSAnc3RhcnQnIHZhbHVlIChkZWZhdWx0OiAwKSBwbHVzIGFuIGl0ZXJhYmxlIG9mIG51bWJlcnNcXG5cXG5XaGVuIHRoZSBpdGVyYWJsZSBpcyBlbXB0eSwgcmV0dXJuIHRoZSBzdGFydCB2YWx1ZS5cXG5UaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHNwZWNpZmljYWxseSBmb3IgdXNlIHdpdGggbnVtZXJpYyB2YWx1ZXMgYW5kIG1heVxcbnJlamVjdCBub24tbnVtZXJpYyB0eXBlcy5cIn0sdmFyczp7JG1ldGg6U2suYnVpbHRpbi52YXJzLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlwidmFycyhbb2JqZWN0XSkgLT4gZGljdGlvbmFyeVxcblxcbldpdGhvdXQgYXJndW1lbnRzLCBlcXVpdmFsZW50IHRvIGxvY2FscygpLlxcbldpdGggYW4gYXJndW1lbnQsIGVxdWl2YWxlbnQgdG8gb2JqZWN0Ll9fZGljdF9fLlwifX0pO1xuU2suc2V0dXBPYmplY3RzPWZ1bmN0aW9uKGEpe2E/KFNrLmJ1aWx0aW5zLmZpbHRlcj1Tay5idWlsdGluLmZpbHRlcl8sU2suYnVpbHRpbnMubWFwPVNrLmJ1aWx0aW4ubWFwXyxTay5idWlsdGlucy56aXA9U2suYnVpbHRpbi56aXBfLFNrLmJ1aWx0aW5zLnJhbmdlPVNrLmJ1aWx0aW4ucmFuZ2VfLGRlbGV0ZSBTay5idWlsdGlucy54cmFuZ2UsZGVsZXRlIFNrLmJ1aWx0aW5zLlN0YW5kYXJkRXJyb3IsZGVsZXRlIFNrLmJ1aWx0aW5zLnVuaWNvZGUsZGVsZXRlIFNrLmJ1aWx0aW5zLmJhc2VzdHJpbmcsZGVsZXRlIFNrLmJ1aWx0aW5zLmxvbmdfJHJ3JCxTay5idWlsdGluLmludF8ucHJvdG90eXBlLiRyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKSl9LGRlbGV0ZSBTay5idWlsdGluLmludF8ucHJvdG90eXBlLnRwJHN0cixkZWxldGUgU2suYnVpbHRpbi5ib29sLnByb3RvdHlwZS50cCRzdHIsZGVsZXRlIFNrLmJ1aWx0aW5zLnJhd19pbnB1dCxcbmRlbGV0ZSBTay5idWlsdGluLnN0ci5wcm90b3R5cGUuZGVjb2RlLFNrLmJ1aWx0aW5zLmJ5dGVzPVNrLmJ1aWx0aW4uYnl0ZXMsU2suYnVpbHRpbnMuYXNjaWk9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLmFzY2lpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiBhbiBBU0NJSS1vbmx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC5cXG5cXG5BcyByZXByKCksIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGFuXFxub2JqZWN0LCBidXQgZXNjYXBlIHRoZSBub24tQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIHJldHVybmVkIGJ5XFxucmVwcigpIHVzaW5nIFxcXFxcXFxceCwgXFxcXFxcXFx1IG9yIFxcXFxcXFxcVSBlc2NhcGVzLiBUaGlzIGdlbmVyYXRlcyBhIHN0cmluZyBzaW1pbGFyXFxudG8gdGhhdCByZXR1cm5lZCBieSByZXByKCkgaW4gUHl0aG9uIDIuXCJ9LFxubnVsbCxcImJ1aWx0aW5zXCIpKTooU2suYnVpbHRpbnMucmFuZ2U9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLnJhbmdlLCRuYW1lOlwicmFuZ2VcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9fSx2b2lkIDAsXCJidWlsdGluc1wiKSxTay5idWlsdGlucy54cmFuZ2U9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLnhyYW5nZSwkbmFtZTpcInhyYW5nZVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M319LG51bGwsXCJidWlsdGluc1wiKSxTay5idWlsdGlucy5maWx0ZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLmZpbHRlciksU2suYnVpbHRpbnMubWFwPW5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5tYXApLFNrLmJ1aWx0aW5zLnppcD1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4uemlwKSxTay5idWlsdGlucy5TdGFuZGFyZEVycm9yPVNrLmJ1aWx0aW4uRXhjZXB0aW9uLFNrLmJ1aWx0aW5zLnVuaWNvZGU9XG5Tay5idWlsdGluLnN0cixTay5idWlsdGlucy5iYXNlc3RyaW5nPVNrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW5zLmxvbmdfJHJ3JD1Tay5idWlsdGluLmxuZyxTay5idWlsdGluLmludF8ucHJvdG90eXBlLiRyPWZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLnY7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhP25ldyBTay5idWlsdGluLnN0cihhLnRvU3RyaW5nKCkpOm5ldyBTay5idWlsdGluLnN0cihhLnRvU3RyaW5nKCkrXCJMXCIpfSxTay5idWlsdGluLmludF8ucHJvdG90eXBlLnRwJHN0cj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvU3RyaW5nKCkpfSxTay5idWlsdGluLmJvb2wucHJvdG90eXBlLnRwJHN0cj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyKCl9LFNrLmJ1aWx0aW5zLnJhd19pbnB1dD1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4ucmF3X2lucHV0KSxTay5idWlsdGluLnN0ci5wcm90b3R5cGUuZGVjb2RlPVNrLmJ1aWx0aW4uc3RyLiRweTJkZWNvZGUsXG5kZWxldGUgU2suYnVpbHRpbnMuYnl0ZXMsZGVsZXRlIFNrLmJ1aWx0aW5zLmFzY2lpKX07U2suZXhwb3J0U3ltYm9sKFwiU2suc2V0dXBPYmplY3RzXCIsU2suc2V0dXBPYmplY3RzKTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluc1wiLFNrLmJ1aWx0aW5zKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN0ci4kZW1wdHk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpO1NrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0cj1Tay5idWlsdGluLnN0ci4kZW1wdHk7U2suYnVpbHRpbi5zdHIuJHV0Zjg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwidXRmLThcIik7U2suYnVpbHRpbi5zdHIuJGFzY2lpPW5ldyBTay5idWlsdGluLnN0cihcImFzY2lpXCIpO1NrLmJ1aWx0aW4uc3RyLiRkZWZhdWx0X2ZhY3Rvcnk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiZGVmYXVsdF9mYWN0b3J5XCIpO1NrLmJ1aWx0aW4uc3RyLiRpbWFnPW5ldyBTay5idWlsdGluLnN0cihcImltYWdcIik7U2suYnVpbHRpbi5zdHIuJHJlYWw9bmV3IFNrLmJ1aWx0aW4uc3RyKFwicmVhbFwiKTtcblNrLmJ1aWx0aW4uc3RyLiRhYnM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19hYnNfX1wiKTtTay5idWlsdGluLnN0ci4kYnl0ZXM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19ieXRlc19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjYWxsPW5ldyBTay5idWlsdGluLnN0cihcIl9fY2FsbF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjbGFzcz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NsYXNzX19cIik7U2suYnVpbHRpbi5zdHIuJGNtcD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NtcF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjb21wbGV4PW5ldyBTay5idWlsdGluLnN0cihcIl9fY29tcGxleF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjb250YWlucz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NvbnRhaW5zX19cIik7U2suYnVpbHRpbi5zdHIuJGNvcHk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19jb3B5X19cIik7U2suYnVpbHRpbi5zdHIuJGRpY3Q9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19kaWN0X19cIik7U2suYnVpbHRpbi5zdHIuJGRpcj1cbm5ldyBTay5idWlsdGluLnN0cihcIl9fZGlyX19cIik7U2suYnVpbHRpbi5zdHIuJGRvYz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2RvY19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRlbnRlcj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2VudGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGVxPW5ldyBTay5idWlsdGluLnN0cihcIl9fZXFfX1wiKTtTay5idWlsdGluLnN0ci4kZXhpdD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2V4aXRfX1wiKTtTay5idWlsdGluLnN0ci4kaW5kZXg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pbmRleF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpbml0PW5ldyBTay5idWlsdGluLnN0cihcIl9faW5pdF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpbnRfPW5ldyBTay5idWlsdGluLnN0cihcIl9faW50X19cIik7U2suYnVpbHRpbi5zdHIuJGl0ZXI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pdGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGZpbGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19maWxlX19cIik7U2suYnVpbHRpbi5zdHIuJGZsb2F0Xz1cbm5ldyBTay5idWlsdGluLnN0cihcIl9fZmxvYXRfX1wiKTtTay5idWlsdGluLnN0ci4kZm9ybWF0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZm9ybWF0X19cIik7U2suYnVpbHRpbi5zdHIuJGdlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2VfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0YXR0cj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2dldGF0dHJfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0YXR0cmlidXRlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2V0YXR0cmlidXRlX19cIik7U2suYnVpbHRpbi5zdHIuJGdldGl0ZW09bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19nZXRpdGVtX19cIik7U2suYnVpbHRpbi5zdHIuJGd0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZ3RfX1wiKTtTay5idWlsdGluLnN0ci4ka2V5cz1uZXcgU2suYnVpbHRpbi5zdHIoXCJrZXlzXCIpO1NrLmJ1aWx0aW4uc3RyLiRsZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2xlX19cIik7U2suYnVpbHRpbi5zdHIuJGxlbj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2xlbl9fXCIpO1xuU2suYnVpbHRpbi5zdHIuJGxlbmd0aF9oaW50PW5ldyBTay5idWlsdGluLnN0cihcIl9fbGVuZ3RoX2hpbnRfX1wiKTtTay5idWlsdGluLnN0ci4kbG9hZGVyPW5ldyBTay5idWlsdGluLnN0cihcIl9fbG9hZGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGx0PW5ldyBTay5idWlsdGluLnN0cihcIl9fbHRfX1wiKTtTay5idWlsdGluLnN0ci4kbW9kdWxlPW5ldyBTay5idWlsdGluLnN0cihcIl9fbW9kdWxlX19cIik7U2suYnVpbHRpbi5zdHIuJG1pc3Npbmc9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19taXNzaW5nX19cIik7U2suYnVpbHRpbi5zdHIuJG5hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uYW1lX19cIik7U2suYnVpbHRpbi5zdHIuJG5lPW5ldyBTay5idWlsdGluLnN0cihcIl9fbmVfX1wiKTtTay5idWlsdGluLnN0ci4kbmV3PW5ldyBTay5idWlsdGluLnN0cihcIl9fbmV3X19cIik7U2suYnVpbHRpbi5zdHIuJG5leHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZXh0X19cIik7U2suYnVpbHRpbi5zdHIuJHBhdGg9XG5uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3BhdGhfX1wiKTtTay5idWlsdGluLnN0ci4kcXVhbG5hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19xdWFsbmFtZV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRyZXByPW5ldyBTay5idWlsdGluLnN0cihcIl9fcmVwcl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRyZXZlcnNlZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3JldmVyc2VkX19cIik7U2suYnVpbHRpbi5zdHIuJHJvdW5kPW5ldyBTay5idWlsdGluLnN0cihcIl9fcm91bmRfX1wiKTtTay5idWlsdGluLnN0ci4kc2V0YXR0cj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3NldGF0dHJfX1wiKTtTay5idWlsdGluLnN0ci4kc2V0aXRlbT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3NldGl0ZW1fX1wiKTtTay5idWlsdGluLnN0ci4kc3RyPW5ldyBTay5idWlsdGluLnN0cihcIl9fc3RyX19cIik7U2suYnVpbHRpbi5zdHIuJHRydW5jPW5ldyBTay5idWlsdGluLnN0cihcIl9fdHJ1bmNfX1wiKTtTay5idWlsdGluLnN0ci4kd3JpdGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwid3JpdGVcIik7XG5Tay5taXNjZXZhbC5vcDJtZXRob2RfPXtFcTpTay5idWlsdGluLnN0ci4kZXEsTm90RXE6U2suYnVpbHRpbi5zdHIuJG5lLEd0OlNrLmJ1aWx0aW4uc3RyLiRndCxHdEU6U2suYnVpbHRpbi5zdHIuJGdlLEx0OlNrLmJ1aWx0aW4uc3RyLiRsdCxMdEU6U2suYnVpbHRpbi5zdHIuJGxlfX1dKTt9KS5jYWxsKHRoaXMgfHwgd2luZG93KVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1za3VscHQubWluLmpzLm1hcCIsIi8qXG5UaGUgVGltZWRBY3RpdmVjb2RlIGNsYXNzZXMgYXJlIGEgZ3JlYXQgZXhhbXBsZSBvZiB3aGVyZSBtdWx0aXBsZSBpbmhlcml0YW5jZSB3b3VsZCBiZSB1c2VmdWxcbkJ1dCBzaW5jZSBKYXZhc2NyaXB0IGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugd2UgdXNlIHRoZSBtaXhpbiBwYXR0ZXJuLlxuXG4qL1xuaW1wb3J0IExpdmVDb2RlIGZyb20gXCIuL2xpdmVjb2RlXCI7XG5pbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZVwiO1xuaW1wb3J0IEpTQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2pzXCI7XG5pbXBvcnQgSFRNTEFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9odG1sXCI7XG5pbXBvcnQgU1FMQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX3NxbFwiO1xuaW1wb3J0IEJyeXRob25BY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfYnJ5dGhvbi5qc1wiO1xuXG52YXIgVGltZWRBY3RpdmVDb2RlTWl4aW4gPSB7XG4gICAgdGltZWRJbml0OiBhc3luYyBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICB0aGlzLmlzVGltZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmhpZGVCdXR0b25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKHRydWUpOyAvLyBwb3NpdGlvbiBsYXN0XG4gICAgICAgIHRoaXMubmVlZHNSZWluaXRpYWxpemF0aW9uID0gdHJ1ZTsgLy8gdGhlIHJ1biBidXR0b24gY2xpY2sgbGlzdGVuZXIgbmVlZHMgdG8gYmUgcmVpbml0aWFsaXplZFxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKFwidGltZWRDb21wb25lbnRcIik7XG4gICAgICAgIHdpbmRvdy5lZExpc3RbdGhpcy5kaXZpZF0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgaGlkZUJ1dHRvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ1dHRvbkxpc3QgPSBbXG4gICAgICAgICAgICB0aGlzLnNhdmVCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmxvYWRCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmdyYWRlQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5zaG93SGlkZUJ1dHQsXG4gICAgICAgICAgICB0aGlzLmNvYWNoQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5hdEJ1dHRvbixcbiAgICAgICAgXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmIGJ1dHRvbkxpc3RbaV0gIT09IG51bGwpXG4gICAgICAgICAgICAgICAgJChidXR0b25MaXN0W2ldKS5oaWRlKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gYmplIC0gbm90IG5lZWRlZCBhbnltb3JlXG4gICAgcmVuZGVyVGltZWRJY29uOiBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIC8vIHJlbmRlcnMgdGhlIGNsb2NrIGljb24gb24gdGltZWQgY29tcG9uZW50cy4gICAgVGhlIGNvbXBvbmVudCBwYXJhbWV0ZXJcbiAgICAgICAgLy8gaXMgdGhlIGVsZW1lbnQgdGhhdCB0aGUgaWNvbiBzaG91bGQgYmUgYXBwZW5kZWQgdG8uXG4gICAgICAgIHZhciB0aW1lSWNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciB0aW1lSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICQodGltZUljb24pLmF0dHIoe1xuICAgICAgICAgICAgc3JjOiBcIi4uL19zdGF0aWMvY2xvY2sucG5nXCIsXG4gICAgICAgICAgICBzdHlsZTogXCJ3aWR0aDoxNXB4O2hlaWdodDoxNXB4XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aW1lSWNvbkRpdi5jbGFzc05hbWUgPSBcInRpbWVUaXBcIjtcbiAgICAgICAgdGltZUljb25EaXYudGl0bGUgPSBcIlwiO1xuICAgICAgICB0aW1lSWNvbkRpdi5hcHBlbmRDaGlsZCh0aW1lSWNvbik7XG4gICAgICAgICQoY29tcG9uZW50KS5wcmVwZW5kKHRpbWVJY29uRGl2KTtcbiAgICB9LFxuXG4gICAgY2hlY2tDb3JyZWN0VGltZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gcGN0X2NvcnJlY3QgaXMgc2V0IGJ5IHRoZSB1bml0dGVzdC9ndWkucHkgbW9kdWxlIGluIHNrdWxwdC5cbiAgICAgICAgLy8gaXQgcmVsaWVzIG9uIGZpbmRpbmcgdGhpcyBvYmplY3QgaW4gdGhlIGVkTGlzdFxuICAgICAgICBpZiAodGhpcy5pc0Fuc3dlcmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wY3RfY29ycmVjdCA+PSAxMDAuMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlRcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiSVwiOyAvLyB3ZSBpZ25vcmUgdGhpcyBpbiB0aGUgZ3JhZGluZyBpZiBubyB1bml0dGVzdHNcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBoaWRlRmVlZGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICB9LFxuXG4gICAgcmVpbml0aWFsaXplTGlzdGVuZXJzOiBmdW5jdGlvbiAodGFrZW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlYXR0YWNoaW5nIHJ1bmJ1dHRvbmhhbmRsZXJcIik7XG4gICAgICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrID0gdGhpcy5ydW5CdXR0b25IYW5kZXIuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMuY29kZURpdikuc2hvdygpO1xuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAkKHRoaXMuY29kZURpdikucmVtb3ZlQ2xhc3MoXCJhYy1kaXNhYmxlZFwiKTtcbiAgICAgICAgdGhpcy5lZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICAkKHRoaXMuaGlzdEJ1dHRvbikuY2xpY2sodGhpcy5hZGRIaXN0b3J5U2NydWJiZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKHtcbiAgICAgICAgICAgICAgICBtYXg6IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBzbGlkZTogdGhpcy5zbGlkZWl0LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgY2hhbmdlOiB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWtlbikge1xuICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZpZH1fdW5pdF9yZXN1bHRzYCkuc2hvdygpO1xuICAgICAgICB9XG4gICAgfSxcbn07XG5cbmV4cG9ydCBjbGFzcyBUaW1lZExpdmVDb2RlIGV4dGVuZHMgTGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihUaW1lZExpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuXG5leHBvcnQgY2xhc3MgVGltZWRBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXRDb21wbGV0ZSA9IHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cblxuICAgIC8vIGZvciB0aW1lZCBleGFtcyB3ZSBuZWVkIHRvIGNhbGwgcnVuUHJvZyBhbmQgdGVsbCBpdCB0aGF0IHRoZXJlIGlzXG4gICAgLy8gbm8gR1VJIGZvciBzbGlkZXJzIG9yIG90aGVyIHRoaW5ncy5cbiAgICAvLyB0aGUgYW5zd2Vycy5cbiAgICBhc3luYyBjaGVja0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIGxldCBub1VJID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50aW1lZEluaXRDb21wbGV0ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNBbnN3ZXJlZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5Qcm9nKG5vVUksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihUaW1lZEFjdGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZEpTQWN0aXZlQ29kZSBleHRlbmRzIEpTQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZEpTQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcblxuZXhwb3J0IGNsYXNzIFRpbWVkSFRNTEFjdGl2ZUNvZGUgZXh0ZW5kcyBIVE1MQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZEhUTUxBY3RpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuXG5leHBvcnQgY2xhc3MgVGltZWRTUUxBY3RpdmVDb2RlIGV4dGVuZHMgU1FMQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZFNRTEFjdGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZEJyeXRob25BY3RpdmVDb2RlIGV4dGVuZHMgQnJ5dGhvbkFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cbn1cbk9iamVjdC5hc3NpZ24oVGltZWRCcnl0aG9uQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcbiIsIi8qXG5cbmhpZ2hsaWdodCB2NFxuXG5IaWdobGlnaHRzIGFyYml0cmFyeSB0ZXJtcy5cblxuPGh0dHA6Ly9qb2hhbm5idXJrYXJkLmRlL2Jsb2cvcHJvZ3JhbW1pbmcvamF2YXNjcmlwdC9oaWdobGlnaHQtamF2YXNjcmlwdC10ZXh0LWhpZ2xpZ2h0aW5nLWpxdWVyeS1wbHVnaW4uaHRtbD5cblxuTUlUIGxpY2Vuc2UuXG5cbkpvaGFubiBCdXJrYXJkXG48aHR0cDovL2pvaGFubmJ1cmthcmQuZGU+XG48bWFpbHRvOmpiQGVhaW8uY29tPlxuXG4qL1xuXG5qUXVlcnkuZm4uaGlnaGxpZ2h0ID0gZnVuY3Rpb24ocGF0KSB7XG4gZnVuY3Rpb24gaW5uZXJIaWdobGlnaHQobm9kZSwgcGF0KSB7XG4gIHZhciBza2lwID0gMDtcbiAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykge1xuICAgdmFyIHBvcyA9IG5vZGUuZGF0YS50b1VwcGVyQ2FzZSgpLmluZGV4T2YocGF0KTtcbiAgIGlmIChwb3MgPj0gMCkge1xuICAgIHZhciBzcGFubm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBzcGFubm9kZS5jbGFzc05hbWUgPSAnaGlnaGxpZ2h0JztcbiAgICB2YXIgbWlkZGxlYml0ID0gbm9kZS5zcGxpdFRleHQocG9zKTtcbiAgICB2YXIgZW5kYml0ID0gbWlkZGxlYml0LnNwbGl0VGV4dChwYXQubGVuZ3RoKTtcbiAgICB2YXIgbWlkZGxlY2xvbmUgPSBtaWRkbGViaXQuY2xvbmVOb2RlKHRydWUpO1xuICAgIHNwYW5ub2RlLmFwcGVuZENoaWxkKG1pZGRsZWNsb25lKTtcbiAgICBtaWRkbGViaXQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoc3Bhbm5vZGUsIG1pZGRsZWJpdCk7XG4gICAgc2tpcCA9IDE7XG4gICB9XG4gIH1cbiAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuY2hpbGROb2RlcyAmJiAhLyhzY3JpcHR8c3R5bGUpL2kudGVzdChub2RlLnRhZ05hbWUpKSB7XG4gICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgIGkgKz0gaW5uZXJIaWdobGlnaHQobm9kZS5jaGlsZE5vZGVzW2ldLCBwYXQpO1xuICAgfVxuICB9XG4gIHJldHVybiBza2lwO1xuIH1cbiByZXR1cm4gdGhpcy5sZW5ndGggJiYgcGF0ICYmIHBhdC5sZW5ndGggPyB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gIGlubmVySGlnaGxpZ2h0KHRoaXMsIHBhdC50b1VwcGVyQ2FzZSgpKTtcbiB9KSA6IHRoaXM7XG59O1xuXG5qUXVlcnkuZm4ucmVtb3ZlSGlnaGxpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gcmV0dXJuIHRoaXMuZmluZChcInNwYW4uaGlnaGxpZ2h0XCIpLmVhY2goZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkLm5vZGVOYW1lO1xuICB3aXRoICh0aGlzLnBhcmVudE5vZGUpIHtcbiAgIHJlcGxhY2VDaGlsZCh0aGlzLmZpcnN0Q2hpbGQsIHRoaXMpO1xuICAgbm9ybWFsaXplKCk7XG4gIH1cbiB9KS5lbmQoKTtcbn07XG4iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/runestone/dist/runtime.bundle.js b/runestone/dist/runtime.bundle.js index 4c4ba8c11..37b3d67e9 100644 --- a/runestone/dist/runtime.bundle.js +++ b/runestone/dist/runtime.bundle.js @@ -107,7 +107,7 @@ /******/ // This function allow to reference async chunks /******/ __webpack_require__.u = (chunkId) => { /******/ // return url for filenames based on template -/******/ return "" + chunkId + ".bundle.js?v=" + {"vendors-node_modules_codemirror_mode_clike_clike_js-node_modules_codemirror_mode_javascript_j-ea0e03":"72d5b835b0f012e4faeb","vendors-node_modules_codemirror_mode_htmlmixed_htmlmixed_js-node_modules_handsontable_es_inde-1af827":"d503479c13820d9365ef","runestone_common_js_runestonebase_js":"c75250ad0dccea19bebf","runestone_codelens_js_pytutor-embed_bundle_js":"deb8f2f247c5f5984b7f","node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js":"7ae540b8d48685f47a71","runestone_clickableArea_js_timedclickable_js":"46bba3f29372278e5ca6","runestone_codelens_js_codelens_js":"c95e8bfecd8a67d35858","runestone_datafile_js_datafile_js":"6504816b693b4fbd0ad0","runestone_dragndrop_js_timeddnd_js":"c1868fefbd55f59a3fb4","runestone_fitb_js_timedfitb_js":"a21027361ba218ca9469","runestone_khanex_js_khanex_js":"48ca28e2bdcb2e2b8873","runestone_lp_js_lp_js":"a090d19da37a3e0d1b73","runestone_mchoice_js_timedmc_js":"e750cc1dc92a20232c4c","runestone_parsons_js_timedparsons_js":"43cb72263fef1b7b309a","runestone_poll_js_poll_js":"68474b8af3c1d20134ae","runestone_quizly_js_quizly_js":"f98c8ac098e2d06dbf4b","runestone_reveal_js_reveal_js":"55966c908800091f205a","runestone_selectquestion_js_selectone_js":"802042f9ff57544b5881","runestone_shortanswer_js_timed_shortanswer_js":"f225aa55d4c2630b36a7","runestone_showeval_js_showEval_js":"53ffdb3261ed8fcbceef","vendors-node_modules_jexcel_dist_jexcel_js-node_modules_jexcel_dist_jexcel_css":"4dff04ac5c1ef0786178","runestone_spreadsheet_js_spreadsheet_js":"6bd6316da3765f3c49bb","runestone_tabbedStuff_js_tabbedstuff_js":"33003997cbed4c38dc7a","runestone_timed_js_timed_js":"30c4f6e6bd7adec59614","vendors-node_modules_wavedrom_lib_process-all_js-node_modules_wavedrom_lib_wave-skin_js":"71f72eb02ec15779de1b","runestone_wavedrom_js_wavedrom_js":"7394bc1582ad34cdce1a","runestone_webwork_js_webwork_js":"754ac28092a8179f722c","runestone_video_js_runestonevideo_js":"bcdbd3d36584c9c528d0"}[chunkId] + ""; +/******/ return "" + chunkId + ".bundle.js?v=" + {"vendors-node_modules_codemirror_mode_clike_clike_js-node_modules_codemirror_mode_javascript_j-ea0e03":"72d5b835b0f012e4faeb","vendors-node_modules_codemirror_mode_htmlmixed_htmlmixed_js-node_modules_handsontable_es_inde-1af827":"d503479c13820d9365ef","runestone_common_js_runestonebase_js":"c75250ad0dccea19bebf","runestone_codelens_js_pytutor-embed_bundle_js":"deb8f2f247c5f5984b7f","node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js":"903713cb52cfd982eee8","runestone_clickableArea_js_timedclickable_js":"46bba3f29372278e5ca6","runestone_codelens_js_codelens_js":"c95e8bfecd8a67d35858","runestone_datafile_js_datafile_js":"6504816b693b4fbd0ad0","runestone_dragndrop_js_timeddnd_js":"c1868fefbd55f59a3fb4","runestone_fitb_js_timedfitb_js":"a21027361ba218ca9469","runestone_khanex_js_khanex_js":"48ca28e2bdcb2e2b8873","runestone_lp_js_lp_js":"a090d19da37a3e0d1b73","runestone_mchoice_js_timedmc_js":"e750cc1dc92a20232c4c","runestone_parsons_js_timedparsons_js":"43cb72263fef1b7b309a","runestone_poll_js_poll_js":"68474b8af3c1d20134ae","runestone_quizly_js_quizly_js":"f98c8ac098e2d06dbf4b","runestone_reveal_js_reveal_js":"55966c908800091f205a","runestone_selectquestion_js_selectone_js":"802042f9ff57544b5881","runestone_shortanswer_js_timed_shortanswer_js":"f225aa55d4c2630b36a7","runestone_showeval_js_showEval_js":"53ffdb3261ed8fcbceef","vendors-node_modules_jexcel_dist_jexcel_js-node_modules_jexcel_dist_jexcel_css":"4dff04ac5c1ef0786178","runestone_spreadsheet_js_spreadsheet_js":"6bd6316da3765f3c49bb","runestone_tabbedStuff_js_tabbedstuff_js":"33003997cbed4c38dc7a","runestone_timed_js_timed_js":"30c4f6e6bd7adec59614","vendors-node_modules_wavedrom_lib_process-all_js-node_modules_wavedrom_lib_wave-skin_js":"71f72eb02ec15779de1b","runestone_wavedrom_js_wavedrom_js":"7394bc1582ad34cdce1a","runestone_webwork_js_webwork_js":"754ac28092a8179f722c","runestone_video_js_runestonevideo_js":"bcdbd3d36584c9c528d0"}[chunkId] + ""; /******/ }; /******/ })(); /******/ @@ -316,4 +316,4 @@ /******/ /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgbWluaS1jc3MgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9sb2FkIHNjcmlwdCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O1VBQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7Ozs7O1dDNUJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsOEJBQThCLHdDQUF3QztXQUN0RTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdCQUFnQixxQkFBcUI7V0FDckM7V0FDQTtXQUNBLGlCQUFpQixxQkFBcUI7V0FDdEM7V0FDQTtXQUNBLElBQUk7V0FDSjtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRTs7Ozs7V0MzQkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQyxZQUFZO1dBQzVDO1dBQ0EsRTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHdDQUF3Qyx5Q0FBeUM7V0FDakY7V0FDQTtXQUNBLEU7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFQUFFO1dBQ0YsRTs7Ozs7V0NSQTtXQUNBO1dBQ0E7V0FDQSwwQ0FBMEMsODVEQUE4NUQ7V0FDeDhELEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ0pBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGO1dBQ0E7V0FDQSxDQUFDLEk7Ozs7O1dDUEQsd0Y7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxzQkFBc0IsNEJBQTRCLFFBQVE7V0FDMUQ7V0FDQTtXQUNBO1dBQ0EsZ0JBQWdCLG9CQUFvQjtXQUNwQztXQUNBLGtHQUFrRyxZQUFZLE9BQU87V0FDckg7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0VBQWtFLGtDQUFrQztXQUNwRztXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ3pDQTtXQUNBO1dBQ0E7V0FDQSxzREFBc0Qsa0JBQWtCO1dBQ3hFO1dBQ0EsK0NBQStDLGNBQWM7V0FDN0QsRTs7Ozs7V0NOQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0M7Ozs7O1dDZkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQzs7V0FFaEM7V0FDQTtXQUNBO1dBQ0EsSUFBSTtXQUNKO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxLQUFLO1dBQ0w7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsTUFBTSxvQkFBb0I7V0FDMUI7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0EsNEciLCJmaWxlIjoicnVudGltZS5idW5kbGUuanM/dj1iNzkwOTFiM2MyNDhmNWQ3Njk3YiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZiA9IHt9O1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLy8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSAoY2h1bmtJZCkgPT4ge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmZba2V5XShjaHVua0lkLCBwcm9taXNlcyk7XG5cdFx0cmV0dXJuIHByb21pc2VzO1xuXHR9LCBbXSkpO1xufTsiLCIvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJcIiArIGNodW5rSWQgKyBcIi5idW5kbGUuanM/dj1cIiArIHtcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2NvZGVtaXJyb3JfbW9kZV9jbGlrZV9jbGlrZV9qcy1ub2RlX21vZHVsZXNfY29kZW1pcnJvcl9tb2RlX2phdmFzY3JpcHRfai1lYTBlMDNcIjpcIjcyZDViODM1YjBmMDEyZTRmYWViXCIsXCJ2ZW5kb3JzLW5vZGVfbW9kdWxlc19jb2RlbWlycm9yX21vZGVfaHRtbG1peGVkX2h0bWxtaXhlZF9qcy1ub2RlX21vZHVsZXNfaGFuZHNvbnRhYmxlX2VzX2luZGUtMWFmODI3XCI6XCJkNTAzNDc5YzEzODIwZDkzNjVlZlwiLFwicnVuZXN0b25lX2NvbW1vbl9qc19ydW5lc3RvbmViYXNlX2pzXCI6XCJjNzUyNTBhZDBkY2NlYTE5YmViZlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX3B5dHV0b3ItZW1iZWRfYnVuZGxlX2pzXCI6XCJkZWI4ZjJmMjQ3YzVmNTk4NGI3ZlwiLFwibm9kZV9tb2R1bGVzX21vbWVudF9sb2NhbGVfc3luY19yZWN1cnNpdmVfLXJ1bmVzdG9uZV9hY3RpdmVjb2RlX2pzX2FjZmFjdG9yeV9qc1wiOlwiN2FlNTQwYjhkNDg2ODVmNDdhNzFcIixcInJ1bmVzdG9uZV9jbGlja2FibGVBcmVhX2pzX3RpbWVkY2xpY2thYmxlX2pzXCI6XCI0NmJiYTNmMjkzNzIyNzhlNWNhNlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX2NvZGVsZW5zX2pzXCI6XCJjOTVlOGJmZWNkOGE2N2QzNTg1OFwiLFwicnVuZXN0b25lX2RhdGFmaWxlX2pzX2RhdGFmaWxlX2pzXCI6XCI2NTA0ODE2YjY5M2I0ZmJkMGFkMFwiLFwicnVuZXN0b25lX2RyYWduZHJvcF9qc190aW1lZGRuZF9qc1wiOlwiYzE4NjhmZWZiZDU1ZjU5YTNmYjRcIixcInJ1bmVzdG9uZV9maXRiX2pzX3RpbWVkZml0Yl9qc1wiOlwiYTIxMDI3MzYxYmEyMThjYTk0NjlcIixcInJ1bmVzdG9uZV9raGFuZXhfanNfa2hhbmV4X2pzXCI6XCI0OGNhMjhlMmJkY2IyZTJiODg3M1wiLFwicnVuZXN0b25lX2xwX2pzX2xwX2pzXCI6XCJhMDkwZDE5ZGEzN2EzZTBkMWI3M1wiLFwicnVuZXN0b25lX21jaG9pY2VfanNfdGltZWRtY19qc1wiOlwiZTc1MGNjMWRjOTJhMjAyMzJjNGNcIixcInJ1bmVzdG9uZV9wYXJzb25zX2pzX3RpbWVkcGFyc29uc19qc1wiOlwiNDNjYjcyMjYzZmVmMWI3YjMwOWFcIixcInJ1bmVzdG9uZV9wb2xsX2pzX3BvbGxfanNcIjpcIjY4NDc0YjhhZjNjMWQyMDEzNGFlXCIsXCJydW5lc3RvbmVfcXVpemx5X2pzX3F1aXpseV9qc1wiOlwiZjk4YzhhYzA5OGUyZDA2ZGJmNGJcIixcInJ1bmVzdG9uZV9yZXZlYWxfanNfcmV2ZWFsX2pzXCI6XCI1NTk2NmM5MDg4MDAwOTFmMjA1YVwiLFwicnVuZXN0b25lX3NlbGVjdHF1ZXN0aW9uX2pzX3NlbGVjdG9uZV9qc1wiOlwiODAyMDQyZjlmZjU3NTQ0YjU4ODFcIixcInJ1bmVzdG9uZV9zaG9ydGFuc3dlcl9qc190aW1lZF9zaG9ydGFuc3dlcl9qc1wiOlwiZjIyNWFhNTVkNGMyNjMwYjM2YTdcIixcInJ1bmVzdG9uZV9zaG93ZXZhbF9qc19zaG93RXZhbF9qc1wiOlwiNTNmZmRiMzI2MWVkOGZjYmNlZWZcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2pleGNlbF9kaXN0X2pleGNlbF9qcy1ub2RlX21vZHVsZXNfamV4Y2VsX2Rpc3RfamV4Y2VsX2Nzc1wiOlwiNGRmZjA0YWM1YzFlZjA3ODYxNzhcIixcInJ1bmVzdG9uZV9zcHJlYWRzaGVldF9qc19zcHJlYWRzaGVldF9qc1wiOlwiNmJkNjMxNmRhMzc2NWYzYzQ5YmJcIixcInJ1bmVzdG9uZV90YWJiZWRTdHVmZl9qc190YWJiZWRzdHVmZl9qc1wiOlwiMzMwMDM5OTdjYmVkNGMzOGRjN2FcIixcInJ1bmVzdG9uZV90aW1lZF9qc190aW1lZF9qc1wiOlwiMzBjNGY2ZTZiZDdhZGVjNTk2MTRcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX3dhdmVkcm9tX2xpYl9wcm9jZXNzLWFsbF9qcy1ub2RlX21vZHVsZXNfd2F2ZWRyb21fbGliX3dhdmUtc2tpbl9qc1wiOlwiNzFmNzJlYjAyZWMxNTc3OWRlMWJcIixcInJ1bmVzdG9uZV93YXZlZHJvbV9qc193YXZlZHJvbV9qc1wiOlwiNzM5NGJjMTU4MmFkMzRjZGNlMWFcIixcInJ1bmVzdG9uZV93ZWJ3b3JrX2pzX3dlYndvcmtfanNcIjpcIjc1NGFjMjgwOTJhODE3OWY3MjJjXCIsXCJydW5lc3RvbmVfdmlkZW9fanNfcnVuZXN0b25ldmlkZW9fanNcIjpcImJjZGJkM2QzNjU4NGM5YzUyOGQwXCJ9W2NodW5rSWRdICsgXCJcIjtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYWxsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5taW5pQ3NzRiA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgaW5Qcm9ncmVzcyA9IHt9O1xudmFyIGRhdGFXZWJwYWNrUHJlZml4ID0gXCJXZWJDb21wb25lbnRzOlwiO1xuLy8gbG9hZFNjcmlwdCBmdW5jdGlvbiB0byBsb2FkIGEgc2NyaXB0IHZpYSBzY3JpcHQgdGFnXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmwgPSAodXJsLCBkb25lLCBrZXksIGNodW5rSWQpID0+IHtcblx0aWYoaW5Qcm9ncmVzc1t1cmxdKSB7IGluUHJvZ3Jlc3NbdXJsXS5wdXNoKGRvbmUpOyByZXR1cm47IH1cblx0dmFyIHNjcmlwdCwgbmVlZEF0dGFjaDtcblx0aWYoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgcyA9IHNjcmlwdHNbaV07XG5cdFx0XHRpZihzLmdldEF0dHJpYnV0ZShcInNyY1wiKSA9PSB1cmwgfHwgcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIikgPT0gZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpIHsgc2NyaXB0ID0gczsgYnJlYWs7IH1cblx0XHR9XG5cdH1cblx0aWYoIXNjcmlwdCkge1xuXHRcdG5lZWRBdHRhY2ggPSB0cnVlO1xuXHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG5cdFx0c2NyaXB0LmNoYXJzZXQgPSAndXRmLTgnO1xuXHRcdHNjcmlwdC50aW1lb3V0ID0gMTIwO1xuXHRcdGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKSB7XG5cdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgX193ZWJwYWNrX3JlcXVpcmVfXy5uYyk7XG5cdFx0fVxuXHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIiwgZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpO1xuXHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdH1cblx0aW5Qcm9ncmVzc1t1cmxdID0gW2RvbmVdO1xuXHR2YXIgb25TY3JpcHRDb21wbGV0ZSA9IChwcmV2LCBldmVudCkgPT4ge1xuXHRcdC8vIGF2b2lkIG1lbSBsZWFrcyBpbiBJRS5cblx0XHRzY3JpcHQub25lcnJvciA9IHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHR2YXIgZG9uZUZucyA9IGluUHJvZ3Jlc3NbdXJsXTtcblx0XHRkZWxldGUgaW5Qcm9ncmVzc1t1cmxdO1xuXHRcdHNjcmlwdC5wYXJlbnROb2RlICYmIHNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG5cdFx0ZG9uZUZucyAmJiBkb25lRm5zLmZvckVhY2goKGZuKSA9PiAoZm4oZXZlbnQpKSk7XG5cdFx0aWYocHJldikgcmV0dXJuIHByZXYoZXZlbnQpO1xuXHR9XG5cdDtcblx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KG9uU2NyaXB0Q29tcGxldGUuYmluZChudWxsLCB1bmRlZmluZWQsIHsgdHlwZTogJ3RpbWVvdXQnLCB0YXJnZXQ6IHNjcmlwdCB9KSwgMTIwMDAwKTtcblx0c2NyaXB0Lm9uZXJyb3IgPSBvblNjcmlwdENvbXBsZXRlLmJpbmQobnVsbCwgc2NyaXB0Lm9uZXJyb3IpO1xuXHRzY3JpcHQub25sb2FkID0gb25TY3JpcHRDb21wbGV0ZS5iaW5kKG51bGwsIHNjcmlwdC5vbmxvYWQpO1xuXHRuZWVkQXR0YWNoICYmIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbn07IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsInZhciBzY3JpcHRVcmw7XG5pZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5nLmltcG9ydFNjcmlwdHMpIHNjcmlwdFVybCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbiArIFwiXCI7XG52YXIgZG9jdW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7XG5pZiAoIXNjcmlwdFVybCAmJiBkb2N1bWVudCkge1xuXHRpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdClcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHNjcmlwdFVybCA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXS5zcmNcblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwicnVudGltZVwiOiAwXG59O1xuXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYuaiA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHRcdC8vIEpTT05QIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcblx0XHR2YXIgaW5zdGFsbGVkQ2h1bmtEYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgPyBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gOiB1bmRlZmluZWQ7XG5cdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSB7IC8vIDAgbWVhbnMgXCJhbHJlYWR5IGluc3RhbGxlZFwiLlxuXG5cdFx0XHQvLyBhIFByb21pc2UgbWVhbnMgXCJjdXJyZW50bHkgbG9hZGluZ1wiLlxuXHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhKSB7XG5cdFx0XHRcdHByb21pc2VzLnB1c2goaW5zdGFsbGVkQ2h1bmtEYXRhWzJdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKFwicnVudGltZVwiICE9IGNodW5rSWQpIHtcblx0XHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG5cdFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiAoaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF0pKTtcblx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKGluc3RhbGxlZENodW5rRGF0YVsyXSA9IHByb21pc2UpO1xuXG5cdFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuXHRcdFx0XHRcdHZhciB1cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCk7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGVycm9yIGJlZm9yZSBzdGFjayB1bndvdW5kIHRvIGdldCB1c2VmdWwgc3RhY2t0cmFjZSBsYXRlclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcigpO1xuXHRcdFx0XHRcdHZhciBsb2FkaW5nRW5kZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcblx0XHRcdFx0XHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBlcnJvclR5cGUgPSBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnID8gJ21pc3NpbmcnIDogZXZlbnQudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcblx0XHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLm5hbWUgPSAnQ2h1bmtMb2FkRXJyb3InO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLnR5cGUgPSBlcnJvclR5cGU7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhWzFdKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5sKHVybCwgbG9hZGluZ0VuZGVkLCBcImNodW5rLVwiICsgY2h1bmtJZCwgY2h1bmtJZCk7XG5cdFx0XHRcdH0gZWxzZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAwO1xuXHRcdFx0fVxuXHRcdH1cbn07XG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbl9fd2VicGFja19yZXF1aXJlX18uTy5qID0gKGNodW5rSWQpID0+IChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPT09IDApO1xuXG4vLyBpbnN0YWxsIGEgSlNPTlAgY2FsbGJhY2sgZm9yIGNodW5rIGxvYWRpbmdcbnZhciB3ZWJwYWNrSnNvbnBDYWxsYmFjayA9IChwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiwgZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcblx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG5cdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDA7XG5cdGZvcihtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdH1cblx0fVxuXHRpZihydW50aW1lKSB2YXIgcmVzdWx0ID0gcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0aWYocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24pIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuXHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSgpO1xuXHRcdH1cblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHNbaV1dID0gMDtcblx0fVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHJlc3VsdCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rV2ViQ29tcG9uZW50c1wiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmtXZWJDb21wb25lbnRzXCJdIHx8IFtdO1xuY2h1bmtMb2FkaW5nR2xvYmFsLmZvckVhY2god2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCAwKSk7XG5jaHVua0xvYWRpbmdHbG9iYWwucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpKTsiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgbWluaS1jc3MgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9sb2FkIHNjcmlwdCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O1VBQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7Ozs7O1dDNUJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsOEJBQThCLHdDQUF3QztXQUN0RTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdCQUFnQixxQkFBcUI7V0FDckM7V0FDQTtXQUNBLGlCQUFpQixxQkFBcUI7V0FDdEM7V0FDQTtXQUNBLElBQUk7V0FDSjtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRTs7Ozs7V0MzQkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQyxZQUFZO1dBQzVDO1dBQ0EsRTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHdDQUF3Qyx5Q0FBeUM7V0FDakY7V0FDQTtXQUNBLEU7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFQUFFO1dBQ0YsRTs7Ozs7V0NSQTtXQUNBO1dBQ0E7V0FDQSwwQ0FBMEMsODVEQUE4NUQ7V0FDeDhELEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ0pBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGO1dBQ0E7V0FDQSxDQUFDLEk7Ozs7O1dDUEQsd0Y7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxzQkFBc0IsNEJBQTRCLFFBQVE7V0FDMUQ7V0FDQTtXQUNBO1dBQ0EsZ0JBQWdCLG9CQUFvQjtXQUNwQztXQUNBLGtHQUFrRyxZQUFZLE9BQU87V0FDckg7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0VBQWtFLGtDQUFrQztXQUNwRztXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ3pDQTtXQUNBO1dBQ0E7V0FDQSxzREFBc0Qsa0JBQWtCO1dBQ3hFO1dBQ0EsK0NBQStDLGNBQWM7V0FDN0QsRTs7Ozs7V0NOQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0M7Ozs7O1dDZkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQzs7V0FFaEM7V0FDQTtXQUNBO1dBQ0EsSUFBSTtXQUNKO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxLQUFLO1dBQ0w7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsTUFBTSxvQkFBb0I7V0FDMUI7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0EsNEciLCJmaWxlIjoicnVudGltZS5idW5kbGUuanM/dj1lNDc2Y2UwNmNlMzU2NjY3Nzk4ZCIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZiA9IHt9O1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLy8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSAoY2h1bmtJZCkgPT4ge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmZba2V5XShjaHVua0lkLCBwcm9taXNlcyk7XG5cdFx0cmV0dXJuIHByb21pc2VzO1xuXHR9LCBbXSkpO1xufTsiLCIvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJcIiArIGNodW5rSWQgKyBcIi5idW5kbGUuanM/dj1cIiArIHtcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2NvZGVtaXJyb3JfbW9kZV9jbGlrZV9jbGlrZV9qcy1ub2RlX21vZHVsZXNfY29kZW1pcnJvcl9tb2RlX2phdmFzY3JpcHRfai1lYTBlMDNcIjpcIjcyZDViODM1YjBmMDEyZTRmYWViXCIsXCJ2ZW5kb3JzLW5vZGVfbW9kdWxlc19jb2RlbWlycm9yX21vZGVfaHRtbG1peGVkX2h0bWxtaXhlZF9qcy1ub2RlX21vZHVsZXNfaGFuZHNvbnRhYmxlX2VzX2luZGUtMWFmODI3XCI6XCJkNTAzNDc5YzEzODIwZDkzNjVlZlwiLFwicnVuZXN0b25lX2NvbW1vbl9qc19ydW5lc3RvbmViYXNlX2pzXCI6XCJjNzUyNTBhZDBkY2NlYTE5YmViZlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX3B5dHV0b3ItZW1iZWRfYnVuZGxlX2pzXCI6XCJkZWI4ZjJmMjQ3YzVmNTk4NGI3ZlwiLFwibm9kZV9tb2R1bGVzX21vbWVudF9sb2NhbGVfc3luY19yZWN1cnNpdmVfLXJ1bmVzdG9uZV9hY3RpdmVjb2RlX2pzX2FjZmFjdG9yeV9qc1wiOlwiOTAzNzEzY2I1MmNmZDk4MmVlZThcIixcInJ1bmVzdG9uZV9jbGlja2FibGVBcmVhX2pzX3RpbWVkY2xpY2thYmxlX2pzXCI6XCI0NmJiYTNmMjkzNzIyNzhlNWNhNlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX2NvZGVsZW5zX2pzXCI6XCJjOTVlOGJmZWNkOGE2N2QzNTg1OFwiLFwicnVuZXN0b25lX2RhdGFmaWxlX2pzX2RhdGFmaWxlX2pzXCI6XCI2NTA0ODE2YjY5M2I0ZmJkMGFkMFwiLFwicnVuZXN0b25lX2RyYWduZHJvcF9qc190aW1lZGRuZF9qc1wiOlwiYzE4NjhmZWZiZDU1ZjU5YTNmYjRcIixcInJ1bmVzdG9uZV9maXRiX2pzX3RpbWVkZml0Yl9qc1wiOlwiYTIxMDI3MzYxYmEyMThjYTk0NjlcIixcInJ1bmVzdG9uZV9raGFuZXhfanNfa2hhbmV4X2pzXCI6XCI0OGNhMjhlMmJkY2IyZTJiODg3M1wiLFwicnVuZXN0b25lX2xwX2pzX2xwX2pzXCI6XCJhMDkwZDE5ZGEzN2EzZTBkMWI3M1wiLFwicnVuZXN0b25lX21jaG9pY2VfanNfdGltZWRtY19qc1wiOlwiZTc1MGNjMWRjOTJhMjAyMzJjNGNcIixcInJ1bmVzdG9uZV9wYXJzb25zX2pzX3RpbWVkcGFyc29uc19qc1wiOlwiNDNjYjcyMjYzZmVmMWI3YjMwOWFcIixcInJ1bmVzdG9uZV9wb2xsX2pzX3BvbGxfanNcIjpcIjY4NDc0YjhhZjNjMWQyMDEzNGFlXCIsXCJydW5lc3RvbmVfcXVpemx5X2pzX3F1aXpseV9qc1wiOlwiZjk4YzhhYzA5OGUyZDA2ZGJmNGJcIixcInJ1bmVzdG9uZV9yZXZlYWxfanNfcmV2ZWFsX2pzXCI6XCI1NTk2NmM5MDg4MDAwOTFmMjA1YVwiLFwicnVuZXN0b25lX3NlbGVjdHF1ZXN0aW9uX2pzX3NlbGVjdG9uZV9qc1wiOlwiODAyMDQyZjlmZjU3NTQ0YjU4ODFcIixcInJ1bmVzdG9uZV9zaG9ydGFuc3dlcl9qc190aW1lZF9zaG9ydGFuc3dlcl9qc1wiOlwiZjIyNWFhNTVkNGMyNjMwYjM2YTdcIixcInJ1bmVzdG9uZV9zaG93ZXZhbF9qc19zaG93RXZhbF9qc1wiOlwiNTNmZmRiMzI2MWVkOGZjYmNlZWZcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2pleGNlbF9kaXN0X2pleGNlbF9qcy1ub2RlX21vZHVsZXNfamV4Y2VsX2Rpc3RfamV4Y2VsX2Nzc1wiOlwiNGRmZjA0YWM1YzFlZjA3ODYxNzhcIixcInJ1bmVzdG9uZV9zcHJlYWRzaGVldF9qc19zcHJlYWRzaGVldF9qc1wiOlwiNmJkNjMxNmRhMzc2NWYzYzQ5YmJcIixcInJ1bmVzdG9uZV90YWJiZWRTdHVmZl9qc190YWJiZWRzdHVmZl9qc1wiOlwiMzMwMDM5OTdjYmVkNGMzOGRjN2FcIixcInJ1bmVzdG9uZV90aW1lZF9qc190aW1lZF9qc1wiOlwiMzBjNGY2ZTZiZDdhZGVjNTk2MTRcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX3dhdmVkcm9tX2xpYl9wcm9jZXNzLWFsbF9qcy1ub2RlX21vZHVsZXNfd2F2ZWRyb21fbGliX3dhdmUtc2tpbl9qc1wiOlwiNzFmNzJlYjAyZWMxNTc3OWRlMWJcIixcInJ1bmVzdG9uZV93YXZlZHJvbV9qc193YXZlZHJvbV9qc1wiOlwiNzM5NGJjMTU4MmFkMzRjZGNlMWFcIixcInJ1bmVzdG9uZV93ZWJ3b3JrX2pzX3dlYndvcmtfanNcIjpcIjc1NGFjMjgwOTJhODE3OWY3MjJjXCIsXCJydW5lc3RvbmVfdmlkZW9fanNfcnVuZXN0b25ldmlkZW9fanNcIjpcImJjZGJkM2QzNjU4NGM5YzUyOGQwXCJ9W2NodW5rSWRdICsgXCJcIjtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYWxsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5taW5pQ3NzRiA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgaW5Qcm9ncmVzcyA9IHt9O1xudmFyIGRhdGFXZWJwYWNrUHJlZml4ID0gXCJXZWJDb21wb25lbnRzOlwiO1xuLy8gbG9hZFNjcmlwdCBmdW5jdGlvbiB0byBsb2FkIGEgc2NyaXB0IHZpYSBzY3JpcHQgdGFnXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmwgPSAodXJsLCBkb25lLCBrZXksIGNodW5rSWQpID0+IHtcblx0aWYoaW5Qcm9ncmVzc1t1cmxdKSB7IGluUHJvZ3Jlc3NbdXJsXS5wdXNoKGRvbmUpOyByZXR1cm47IH1cblx0dmFyIHNjcmlwdCwgbmVlZEF0dGFjaDtcblx0aWYoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgcyA9IHNjcmlwdHNbaV07XG5cdFx0XHRpZihzLmdldEF0dHJpYnV0ZShcInNyY1wiKSA9PSB1cmwgfHwgcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIikgPT0gZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpIHsgc2NyaXB0ID0gczsgYnJlYWs7IH1cblx0XHR9XG5cdH1cblx0aWYoIXNjcmlwdCkge1xuXHRcdG5lZWRBdHRhY2ggPSB0cnVlO1xuXHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG5cdFx0c2NyaXB0LmNoYXJzZXQgPSAndXRmLTgnO1xuXHRcdHNjcmlwdC50aW1lb3V0ID0gMTIwO1xuXHRcdGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKSB7XG5cdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgX193ZWJwYWNrX3JlcXVpcmVfXy5uYyk7XG5cdFx0fVxuXHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIiwgZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpO1xuXHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdH1cblx0aW5Qcm9ncmVzc1t1cmxdID0gW2RvbmVdO1xuXHR2YXIgb25TY3JpcHRDb21wbGV0ZSA9IChwcmV2LCBldmVudCkgPT4ge1xuXHRcdC8vIGF2b2lkIG1lbSBsZWFrcyBpbiBJRS5cblx0XHRzY3JpcHQub25lcnJvciA9IHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHR2YXIgZG9uZUZucyA9IGluUHJvZ3Jlc3NbdXJsXTtcblx0XHRkZWxldGUgaW5Qcm9ncmVzc1t1cmxdO1xuXHRcdHNjcmlwdC5wYXJlbnROb2RlICYmIHNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG5cdFx0ZG9uZUZucyAmJiBkb25lRm5zLmZvckVhY2goKGZuKSA9PiAoZm4oZXZlbnQpKSk7XG5cdFx0aWYocHJldikgcmV0dXJuIHByZXYoZXZlbnQpO1xuXHR9XG5cdDtcblx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KG9uU2NyaXB0Q29tcGxldGUuYmluZChudWxsLCB1bmRlZmluZWQsIHsgdHlwZTogJ3RpbWVvdXQnLCB0YXJnZXQ6IHNjcmlwdCB9KSwgMTIwMDAwKTtcblx0c2NyaXB0Lm9uZXJyb3IgPSBvblNjcmlwdENvbXBsZXRlLmJpbmQobnVsbCwgc2NyaXB0Lm9uZXJyb3IpO1xuXHRzY3JpcHQub25sb2FkID0gb25TY3JpcHRDb21wbGV0ZS5iaW5kKG51bGwsIHNjcmlwdC5vbmxvYWQpO1xuXHRuZWVkQXR0YWNoICYmIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbn07IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsInZhciBzY3JpcHRVcmw7XG5pZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5nLmltcG9ydFNjcmlwdHMpIHNjcmlwdFVybCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbiArIFwiXCI7XG52YXIgZG9jdW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7XG5pZiAoIXNjcmlwdFVybCAmJiBkb2N1bWVudCkge1xuXHRpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdClcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHNjcmlwdFVybCA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXS5zcmNcblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwicnVudGltZVwiOiAwXG59O1xuXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYuaiA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHRcdC8vIEpTT05QIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcblx0XHR2YXIgaW5zdGFsbGVkQ2h1bmtEYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgPyBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gOiB1bmRlZmluZWQ7XG5cdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSB7IC8vIDAgbWVhbnMgXCJhbHJlYWR5IGluc3RhbGxlZFwiLlxuXG5cdFx0XHQvLyBhIFByb21pc2UgbWVhbnMgXCJjdXJyZW50bHkgbG9hZGluZ1wiLlxuXHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhKSB7XG5cdFx0XHRcdHByb21pc2VzLnB1c2goaW5zdGFsbGVkQ2h1bmtEYXRhWzJdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKFwicnVudGltZVwiICE9IGNodW5rSWQpIHtcblx0XHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG5cdFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiAoaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF0pKTtcblx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKGluc3RhbGxlZENodW5rRGF0YVsyXSA9IHByb21pc2UpO1xuXG5cdFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuXHRcdFx0XHRcdHZhciB1cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCk7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGVycm9yIGJlZm9yZSBzdGFjayB1bndvdW5kIHRvIGdldCB1c2VmdWwgc3RhY2t0cmFjZSBsYXRlclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcigpO1xuXHRcdFx0XHRcdHZhciBsb2FkaW5nRW5kZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcblx0XHRcdFx0XHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBlcnJvclR5cGUgPSBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnID8gJ21pc3NpbmcnIDogZXZlbnQudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcblx0XHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLm5hbWUgPSAnQ2h1bmtMb2FkRXJyb3InO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLnR5cGUgPSBlcnJvclR5cGU7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhWzFdKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5sKHVybCwgbG9hZGluZ0VuZGVkLCBcImNodW5rLVwiICsgY2h1bmtJZCwgY2h1bmtJZCk7XG5cdFx0XHRcdH0gZWxzZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAwO1xuXHRcdFx0fVxuXHRcdH1cbn07XG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbl9fd2VicGFja19yZXF1aXJlX18uTy5qID0gKGNodW5rSWQpID0+IChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPT09IDApO1xuXG4vLyBpbnN0YWxsIGEgSlNPTlAgY2FsbGJhY2sgZm9yIGNodW5rIGxvYWRpbmdcbnZhciB3ZWJwYWNrSnNvbnBDYWxsYmFjayA9IChwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiwgZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcblx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG5cdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDA7XG5cdGZvcihtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdH1cblx0fVxuXHRpZihydW50aW1lKSB2YXIgcmVzdWx0ID0gcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0aWYocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24pIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuXHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSgpO1xuXHRcdH1cblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHNbaV1dID0gMDtcblx0fVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHJlc3VsdCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rV2ViQ29tcG9uZW50c1wiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmtXZWJDb21wb25lbnRzXCJdIHx8IFtdO1xuY2h1bmtMb2FkaW5nR2xvYmFsLmZvckVhY2god2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCAwKSk7XG5jaHVua0xvYWRpbmdHbG9iYWwucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpKTsiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/runestone/dist/webpack_static_imports.json b/runestone/dist/webpack_static_imports.json index 84b81785b..5c1212129 100644 --- a/runestone/dist/webpack_static_imports.json +++ b/runestone/dist/webpack_static_imports.json @@ -1 +1 @@ -{"js":["runtime.bundle.js?v=b79091b3c248f5d7697b","vendors-node_modules_bootstrap_dist_js_bootstrap_js-node_modules_jquery-ui_jquery-ui_js-node_-e60694.bundle.js?v=02c928219c61d5ca913a","runestone.bundle.js?v=db4b57b8df6b9b8f470a"],"css":[]} \ No newline at end of file +{"js":["runtime.bundle.js?v=e476ce06ce356667798d","vendors-node_modules_bootstrap_dist_js_bootstrap_js-node_modules_jquery-ui_jquery-ui_js-node_-e60694.bundle.js?v=02c928219c61d5ca913a","runestone.bundle.js?v=db4b57b8df6b9b8f470a"],"css":[]} \ No newline at end of file